From 07b0d77872f182fb5e17ba1093f46569f957cb09 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 3 Dec 2023 00:30:59 +0000 Subject: [PATCH] Update SCS Docs Page c96a0be49c3551d70af60ddc543b7939e15b59a8 --- .nojekyll | 0 404.html | 26 + assets/css/styles.551adc4a.css | 1 + ...blic-e9ba939dfde1c0efe3a32ec6f5d1f612.yaml | 38 + ...ml-9c0c983f9c293bc5adeae683d442174e.sample | 23 + ...ayout-db64866af60ef6d2c41245db78dd15d1.png | Bin 0 -> 18731 bytes ...ors-1-bd8d085759b264b3e58020d1390803fd.png | Bin 0 -> 23181 bytes ...ors-2-d9a87ab2a63ed62ace4303facc069b8b.png | Bin 0 -> 52116 bytes ..._anim-d88d134eff244cf8891c5ca1efcfc65a.gif | Bin 0 -> 1054796 bytes ...d-dco-82f9dafea83c36769069087ceb522cdc.png | Bin 0 -> 210159 bytes ...image-01d5564077ed43bda1d921e522df7dd7.png | Bin 0 -> 74929 bytes ...image-123702bb74539962d7c6839715583f29.png | Bin 0 -> 104570 bytes ...ciler-acd822767003069a8935e016081383a5.png | Bin 0 -> 43207 bytes ...issue-6cc9ac7387e0589d625dded707510641.png | Bin 0 -> 22234 bytes ...rawio-19e90813de60b4afa58bc7ee4a3aeae8.png | Bin 0 -> 53162 bytes ...shot1-c880f78ba33fc0577dce811dc2e42724.png | Bin 0 -> 723202 bytes assets/js/0047ab5d.2b37419c.js | 1 + assets/js/01a85c17.9d138910.js | 1 + assets/js/03c8668f.49e46fdd.js | 1 + assets/js/04fe2bfd.11a803b5.js | 1 + assets/js/059c4264.3f0b191f.js | 1 + assets/js/05e7973d.e9b6c205.js | 1 + assets/js/061d8128.3afef4fd.js | 1 + assets/js/0683500c.2b8b2a8c.js | 1 + assets/js/070e71f0.58103e04.js | 1 + assets/js/07d3bac7.51a7e5f9.js | 1 + assets/js/082859ca.7f7eaa73.js | 1 + assets/js/0860b861.421e2adb.js | 1 + assets/js/08bf2ad2.03b3f319.js | 1 + assets/js/096c51c8.d7561d62.js | 1 + assets/js/09adb968.d5282853.js | 1 + assets/js/09ba26e2.70c31ef5.js | 1 + assets/js/09cf625e.1e69a60f.js | 1 + assets/js/0a757274.443da196.js | 1 + assets/js/0bcc5672.c34c9f3f.js | 1 + assets/js/0dfeccb2.fb23b4b5.js | 1 + assets/js/0ea173ba.bcf8204e.js | 1 + assets/js/1109f10b.74701188.js | 1 + assets/js/1276f6ab.575dfd89.js | 1 + assets/js/14c1041d.4d50ef28.js | 1 + assets/js/14eb3368.75e9f711.js | 1 + assets/js/15336817.ef571073.js | 1 + assets/js/15e4a743.0af51b01.js | 1 + assets/js/16aafd28.b86ae6c0.js | 1 + assets/js/1722e234.839a439e.js | 1 + assets/js/17896441.7488da5b.js | 1 + assets/js/178df98e.b749cc52.js | 1 + assets/js/183af61f.acca119c.js | 1 + assets/js/184e5ead.1c8c2a49.js | 1 + assets/js/19afbcc8.847c21ab.js | 1 + assets/js/1a4e3797.9cf10c41.js | 1 + assets/js/1bc22123.4d28e76e.js | 1 + assets/js/1be78505.c760445e.js | 1 + assets/js/1c091541.8267c1b7.js | 1 + assets/js/1c894279.6c35e1a4.js | 1 + assets/js/1df93b7f.975423cf.js | 1 + assets/js/1f1274a0.26037ab8.js | 1 + assets/js/1f34ee25.36ef8ed2.js | 1 + assets/js/2163574d.81ce3d02.js | 1 + assets/js/23cd166f.4301e5b2.js | 1 + assets/js/23e62f09.0000ff74.js | 1 + assets/js/247783bb.49d074f5.js | 1 + assets/js/24fca748.05fabdc8.js | 1 + assets/js/26bc5a46.56d13ab6.js | 1 + assets/js/26dd306b.dca4caf2.js | 1 + assets/js/27f24dfd.c21ec51f.js | 1 + assets/js/29331985.4f0161cb.js | 1 + assets/js/29c2cfba.1c8a2c33.js | 1 + assets/js/2c42a58f.ff2f3274.js | 1 + assets/js/301607a5.9abced11.js | 1 + assets/js/306a8c6c.46bc9fa6.js | 1 + assets/js/316.d513d091.js | 1354 + assets/js/32227eef.91ab4d35.js | 1 + assets/js/343a1afc.185eefda.js | 1 + assets/js/35fbae7a.de4a7feb.js | 1 + assets/js/36f749d2.ee037847.js | 1 + assets/js/38b583d2.5ce52315.js | 1 + assets/js/38c9ef35.2ecdc10a.js | 1 + assets/js/39eb4dc7.68678439.js | 1 + assets/js/3a00f46c.eaf48fb4.js | 1 + assets/js/3bf9fbe6.8f219a6a.js | 1 + assets/js/3d19221e.556718cc.js | 1 + assets/js/3e493f26.8bc7968d.js | 1 + assets/js/3f3928dc.b46b088f.js | 1 + assets/js/3ff13a62.e2f45d6a.js | 1 + assets/js/40d9468c.d7025893.js | 1 + assets/js/4129286c.516ed141.js | 1 + assets/js/41ab9761.6a8fa08f.js | 1 + assets/js/42088e64.b8cc5f7f.js | 1 + assets/js/421b5e65.74a01f86.js | 1 + assets/js/422fff4b.dddbd424.js | 1 + assets/js/431e6cfe.2c1b1bfb.js | 1 + assets/js/437bedbc.714985c6.js | 1 + assets/js/441ae8e9.4fc54eca.js | 1 + assets/js/4468ebd1.8749ca1b.js | 1 + assets/js/45f4377b.7e84abe9.js | 1 + assets/js/477ed06d.df0a39b2.js | 1 + assets/js/487.7b135b0c.js | 7370 +++ assets/js/495e0345.3521aa1c.js | 1 + assets/js/4972.908ebfbb.js | 1 + assets/js/49993131.ee5e1f6f.js | 1 + assets/js/49bc3785.51b02e13.js | 1 + assets/js/4b015924.e7f9ce9f.js | 1 + assets/js/4e6fa974.528e633e.js | 1 + assets/js/502adbf6.68fb27d5.js | 1 + assets/js/50963409.2fac71a6.js | 1 + assets/js/5268a994.b87d3303.js | 1 + assets/js/526992cf.021d92b1.js | 1 + assets/js/52e3f5ca.2c36c8fb.js | 1 + assets/js/53596370.a38fddc7.js | 1 + assets/js/5525.640f1c90.js | 1 + assets/js/5565c8ed.3ad273b7.js | 1 + assets/js/564eabfd.ad788772.js | 1 + assets/js/5830dd0a.62787c53.js | 1 + assets/js/589280f5.5bb03a5e.js | 1 + assets/js/59307471.5353ba55.js | 1 + assets/js/5ad6acbd.603ce1a3.js | 1 + assets/js/5b235e06.ed305ad4.js | 1 + assets/js/5b402526.4c477e61.js | 1 + assets/js/5b9bf978.423a0463.js | 1 + assets/js/5bd7bc3b.6f984540.js | 1 + assets/js/5c201b0a.9f1a2f88.js | 1 + assets/js/5d54de92.69868db2.js | 1 + assets/js/6048.9ebfb35f.js | 1 + assets/js/60fc342f.dae6297c.js | 1 + assets/js/61ce23c3.bb3640ae.js | 1 + assets/js/6316.97d4676f.js | 1 + assets/js/63c8fde6.64de5717.js | 1 + assets/js/644d3432.6b01bab3.js | 1 + assets/js/653904f7.3520249c.js | 1 + assets/js/65c90e53.e76dec9c.js | 1 + assets/js/670b12e1.9f8c72b5.js | 1 + assets/js/67dad519.3679338b.js | 1 + assets/js/684abe8e.5aee6941.js | 1 + assets/js/685813dc.4342e07f.js | 1 + assets/js/6875c492.177d3290.js | 1 + assets/js/699c0e5c.2f09704f.js | 1 + assets/js/69b09ea9.9965528d.js | 1 + assets/js/6a15e24c.e21634b6.js | 1 + assets/js/6ad9ab45.1eada8ec.js | 1 + assets/js/6c33bb99.28960205.js | 1 + assets/js/6c4198a1.ff28e6e9.js | 1 + assets/js/6d32cafb.417ec17e.js | 1 + assets/js/6d890b23.b42a27b6.js | 1 + assets/js/6db2ece2.bdb3ea87.js | 1 + assets/js/6e35e719.32fa9b7d.js | 1 + assets/js/6e7e1a19.3537e037.js | 1 + assets/js/6f1c571c.221182a2.js | 1 + assets/js/6f4a06ca.9c263a3e.js | 1 + assets/js/724.d7e60c08.js | 41606 ++++++++++++++++ assets/js/73956345.ebd80645.js | 1 + assets/js/739c0ae8.eef7e9df.js | 1 + assets/js/767805d3.06228b2e.js | 1 + assets/js/7724.5e8ea986.js | 2 + assets/js/7724.5e8ea986.js.LICENSE.txt | 9 + assets/js/7aa2de41.bfeda755.js | 1 + assets/js/7b449e09.e32dd5c7.js | 1 + assets/js/7b787d81.a1ba85d0.js | 1 + assets/js/7bd33c3d.7bf609e7.js | 1 + assets/js/7e793606.77dcc9f1.js | 1 + assets/js/7e7cf0e4.12d3736a.js | 1 + assets/js/7f1a31c3.0f6888d8.js | 1 + assets/js/7f34127d.ae52c4fe.js | 1 + assets/js/814f3328.146ae6f7.js | 1 + assets/js/83100446.3577da70.js | 1 + assets/js/8443.eb0070b3.js | 2 + assets/js/8443.eb0070b3.js.LICENSE.txt | 1 + assets/js/86ee3414.80d0289f.js | 1 + assets/js/88684b71.a421c8ed.js | 1 + assets/js/88f37d1b.ffc0586d.js | 1 + assets/js/89176cae.00a7820f.js | 1 + assets/js/8954.a36c6917.js | 2 + assets/js/8954.a36c6917.js.LICENSE.txt | 9 + assets/js/89ad43f4.2d8e789d.js | 1 + assets/js/8a671cf8.8561a958.js | 1 + assets/js/8aa3e7cc.d48d075e.js | 1 + assets/js/8ba37aa2.72eb127d.js | 1 + assets/js/8fc094a7.5adfaa2c.js | 1 + assets/js/904.c767a1e2.js | 1 + assets/js/9278f3d6.bdbbd293.js | 1 + assets/js/929c4e1b.79dd42bc.js | 1 + assets/js/931040e8.21c93343.js | 1 + assets/js/935f2afb.62081e2d.js | 1 + assets/js/9487.e7898b96.js | 1 + assets/js/94f31572.2cd0b599.js | 1 + assets/js/95d93785.1a6fd97a.js | 1 + assets/js/95fe5f6c.61193966.js | 1 + assets/js/96f8fd49.1849021a.js | 1 + assets/js/97b1504a.b1e7ce48.js | 1 + assets/js/98f69cae.ab53b220.js | 1 + assets/js/99b53e63.b234e41b.js | 1 + assets/js/9d1324c7.3b4cab1d.js | 1 + assets/js/9d187656.4abc6493.js | 1 + assets/js/9e10b8d6.a1122053.js | 1 + assets/js/9e4087bc.41d5876d.js | 1 + assets/js/9f356e5b.0298bb37.js | 1 + assets/js/9fb1f91e.1f39b355.js | 1 + assets/js/a0b1bbd7.f2667178.js | 1 + assets/js/a0eeb362.9541cb2a.js | 1 + assets/js/a12a2e44.e23f917a.js | 1 + assets/js/a12f05ab.fe72d9a5.js | 1 + assets/js/a15c4cb6.3f6510d3.js | 1 + assets/js/a38b6a75.f555d2a8.js | 1 + assets/js/a3e11933.25ca3db0.js | 1 + assets/js/a4833b52.43cd4468.js | 1 + assets/js/a51c5cdb.e128bc50.js | 1 + assets/js/a51f78bf.66f3f342.js | 1 + assets/js/a58a5045.5a291913.js | 1 + assets/js/a6aa9e1f.31d56e6b.js | 1 + assets/js/a7023ddc.37c6ea90.js | 1 + assets/js/a708848c.10af8687.js | 1 + assets/js/a70dabb3.8edceb88.js | 1 + assets/js/a71bcd95.bdd15d3b.js | 1 + assets/js/a7434565.30e719e3.js | 1 + assets/js/a8ea16f4.8d2c7e70.js | 1 + assets/js/a8f67d60.710bcfa2.js | 1 + assets/js/a94c36cd.83a287d6.js | 1 + assets/js/a9f40339.71286c0d.js | 1 + assets/js/aa0979a6.0d55683d.js | 1 + assets/js/aaad657b.701f6b3f.js | 1 + assets/js/abb47370.83d4a1df.js | 1 + assets/js/abecca15.d865e5c1.js | 1 + assets/js/abfb0638.be57d877.js | 1 + assets/js/ac087500.5526b6b8.js | 1 + assets/js/ad39e84b.2dc71df5.js | 1 + assets/js/afaff11a.de4f00b8.js | 1 + assets/js/b08c16de.3569e2f3.js | 1 + assets/js/b12ed0df.5be3e843.js | 1 + assets/js/b2b675dd.d31b93c7.js | 1 + assets/js/b2f554cd.9dc96d6c.js | 1 + assets/js/b840bdcc.a3f773d3.js | 1 + assets/js/b8fd74b5.899b29ef.js | 1 + assets/js/bd319452.5e3ee300.js | 1 + assets/js/bd8a97c5.cbf09d3b.js | 1 + assets/js/be01f2a0.1174b07a.js | 1 + assets/js/be96733a.27792029.js | 1 + assets/js/c0cd111c.82864e7a.js | 1 + assets/js/c2f44c5f.85d26394.js | 1 + assets/js/c377a04b.fec5be02.js | 1 + assets/js/c490e74d.32f50109.js | 1 + assets/js/c5533f5e.ff101166.js | 1 + assets/js/c75320ff.8107d9f1.js | 1 + assets/js/ccc49370.fb6007ce.js | 1 + assets/js/cd0ad4f0.5060300f.js | 1 + assets/js/cd4fb20e.cf9156e9.js | 1 + assets/js/ce756c16.116ea445.js | 1 + assets/js/cf2bf9cf.f4845141.js | 1 + assets/js/cffc493c.ba4544e9.js | 1 + assets/js/d078bc1c.9daaac60.js | 1 + assets/js/d0ee365b.c08542e5.js | 1 + assets/js/d1aa920e.0ef065cf.js | 1 + assets/js/d227faa6.82a9ebe7.js | 1 + assets/js/d5256f0a.ead868d7.js | 1 + assets/js/d59f7d52.7408da31.js | 1 + assets/js/d5ac8ed7.92329f52.js | 1 + assets/js/d6a104fd.5042bce1.js | 1 + assets/js/d755aabc.ad59fddc.js | 1 + assets/js/d770ad8d.52adb3ce.js | 1 + assets/js/da1a5473.e602bded.js | 1 + assets/js/da20a34d.30617762.js | 1 + assets/js/dbde4c02.92aaf750.js | 1 + assets/js/dcf2f717.cfa622d3.js | 1 + assets/js/ddebfa81.a9802837.js | 1 + assets/js/de0540ff.3766e6e4.js | 1 + assets/js/df35cf96.7b771da6.js | 1 + assets/js/dfce392e.26c34b2f.js | 1 + assets/js/dfe27b1e.573cbd5b.js | 1 + assets/js/e24c1f8d.cc8bc8ba.js | 1 + assets/js/e44168e5.8403ffa6.js | 1 + assets/js/e57b2c87.e698bb2d.js | 1 + assets/js/e5a53cb8.2a2a4151.js | 1 + assets/js/e747ec83.fe9df707.js | 1 + assets/js/eaf80524.07fe535f.js | 1 + assets/js/eb99bfed.1ded4987.js | 1 + assets/js/ed24060c.115358fc.js | 1 + assets/js/edc931f8.0c3dcc30.js | 1 + assets/js/eea6a18c.1d76c598.js | 1 + assets/js/ef9d238d.47a1d3f2.js | 1 + assets/js/f0b55dfe.1cf7d917.js | 1 + assets/js/f0e20cb6.93b69c09.js | 1 + assets/js/f14351c1.a849afd8.js | 1 + assets/js/f1715aef.4e0027fc.js | 1 + assets/js/f2a59390.ffc7a27c.js | 1 + assets/js/f385820d.2967b809.js | 1 + assets/js/f40b2df0.678c2584.js | 1 + assets/js/f4cdb2d9.de0eb0fa.js | 1 + assets/js/f5b4e375.3677f5dc.js | 1 + assets/js/f68824be.99ea73af.js | 1 + assets/js/f793d2d5.c5d3177c.js | 1 + assets/js/f8869d03.86281479.js | 1 + assets/js/f91986bc.9a1b755b.js | 1 + assets/js/f9ec068e.31f29287.js | 1 + assets/js/fa7c4c29.5326d7fa.js | 1 + assets/js/fd34a958.fe509446.js | 1 + assets/js/fd74033a.43f2e499.js | 1 + assets/js/fd8cbe72.223d7825.js | 1 + assets/js/fe5fac7c.8e37e6d4.js | 1 + assets/js/fff9aecb.216c5323.js | 1 + assets/js/main.9d213e76.js | 2 + assets/js/main.9d213e76.js.LICENSE.txt | 125 + assets/js/runtime~main.21e39613.js | 1 + blog/archive/index.html | 26 + blog/atom.xml | 24 + blog/first-blog-post/index.html | 26 + blog/index.html | 26 + blog/rss.xml | 22 + blog/tags/community/community/index.html | 11 + blog/tags/community/index.html | 26 + blog/tags/howto/index.html | 26 + blog/tags/index.html | 26 + community/calendar/index.html | 26 + community/category/contribute/index.html | 26 + .../getting-started-openstack/index.html | 40 + community/cloud-resources/index.html | 29 + .../plusserver-gx-scs/index.html | 26 + .../cloud-resources/wavestack/index.html | 26 + community/collaboration/index.html | 47 + community/communication/jitsi/index.html | 26 + .../communication/mailinglists/index.html | 26 + community/communication/matrix/index.html | 26 + community/community/calendar/index.html | 11 + .../community/category/contribute/index.html | 11 + .../getting-started-openstack/index.html | 11 + .../community/cloud-resources/index.html | 11 + .../plusserver-gx-scs/index.html | 11 + .../cloud-resources/wavestack/index.html | 11 + community/community/collaboration/index.html | 11 + .../community/communication/jitsi/index.html | 11 + .../communication/mailinglists/index.html | 11 + .../community/communication/matrix/index.html | 11 + .../contribute/adding-docs-guide/index.html | 11 + .../doc-files-structure-guide/index.html | 11 + .../docs-workflow-explanation/index.html | 11 + .../contribute/linting-guide/index.html | 11 + .../index.html | 11 + .../contribute/styleguide/index.html | 11 + .../styleguides/ansible_styleguide/index.html | 11 + .../github/branchprotection/index.html | 11 + .../github/dco-and-licenses/index.html | 11 + .../github/tips-and-tricks/index.html | 11 + .../community/hackathons/checklist/index.html | 11 + community/community/index.html | 11 + .../license-considerations/index.html | 11 + .../contribute/adding-docs-guide/index.html | 26 + .../doc-files-structure-guide/index.html | 26 + .../docs-workflow-explanation/index.html | 26 + community/contribute/linting-guide/index.html | 26 + .../index.html | 27 + community/contribute/styleguide/index.html | 33 + .../styleguides/ansible_styleguide/index.html | 37 + community/github/branchprotection/index.html | 26 + community/github/dco-and-licenses/index.html | 33 + community/github/tips-and-tricks/index.html | 26 + community/hackathons/checklist/index.html | 29 + community/index.html | 26 + community/license-considerations/index.html | 156 + dev-docs/index.html | 26 + .../iam/identity-federation-in-scs/index.html | 39 + .../openstack-federation-via-oidc/index.html | 66 + .../index.html | 101 + docs/category/components-1/index.html | 26 + docs/category/components-2/index.html | 26 + docs/category/components/index.html | 26 + docs/category/iaas-layer/index.html | 26 + .../index.html | 26 + .../k8s-cluster-api-provider/index.html | 26 + docs/category/metering/index.html | 26 + docs/category/operating-scs/index.html | 26 + docs/category/releases/index.html | 26 + docs/category/status-page-api/index.html | 26 + .../LoadBalancer-ExtTrafficLocal/index.html | 81 + .../index.html | 81 + .../doc/Upgrade-Guide/index.html | 186 + .../doc/application-credentials/index.html | 26 + .../doc/configuration/index.html | 29 + .../doc/continuous-integration/index.html | 65 + .../doc/make-reference/index.html | 63 + .../doc/overview/index.html | 26 + .../doc/quickstart/index.html | 37 + .../doc/requirements/index.html | 50 + .../doc/roadmap/index.html | 27 + .../cluster-mgmt-capi-mgmt-node/index.html | 94 + .../index.html | 80 + .../doc/usage/create-new-cluster/index.html | 37 + .../doc/usage/custom-ca/index.html | 48 + .../doc/usage/gateway-api/index.html | 26 + .../doc/usage/harbor/index.html | 47 + .../doc/usage/index.html | 33 + .../usage/managing-many-clusters/index.html | 38 + .../usage/migrate-to-cluster-class/index.html | 36 + .../index.html | 32 + .../doc/usage/testing/index.html | 40 + .../deployment-examples/a/hardware/index.html | 26 + .../deployment-examples/a/index.html | 26 + .../deployment-examples/a/software/index.html | 26 + docs/container/guides/guide1/index.html | 26 + docs/container/index.html | 27 + .../overview/architecture/index.html | 26 + docs/container/overview/knowledge/index.html | 26 + docs/faq/index.html | 26 + .../containerization/index.html | 26 + docs/getting-started/overview/index.html | 26 + .../getting-started/virtualization/index.html | 26 + docs/glossary/index.html | 31 + .../iaas/components/flavor-manager/index.html | 41 + docs/iaas/components/image-manager/index.html | 57 + docs/iaas/components/index.html | 26 + .../components/project-manager/index.html | 26 + .../components/resource-manager/index.html | 26 + .../components/sandbox-manager/index.html | 26 + .../configuration-guide/ceph/index.html | 36 + .../configuration-guide/commons/index.html | 26 + .../commons/network/index.html | 39 + .../commons/packages/index.html | 30 + .../commons/services/index.html | 28 + .../commons/sshconfig/index.html | 28 + .../commons/sysctl/index.html | 28 + .../commons/timezone/index.html | 27 + .../configuration-repository/index.html | 47 + .../guides/configuration-guide/index.html | 26 + .../configuration-guide/inventory/index.html | 30 + .../configuration-guide/manager/index.html | 47 + .../openstack/horizon/index.html | 30 + .../configuration-guide/openstack/index.html | 40 + .../openstack/keystone/index.html | 30 + .../configuration-guide/proxy/index.html | 26 + .../self-signed-certificates/index.html | 26 + .../configuration-guide/services/index.html | 26 + .../guides/deploy-guide/bootstrap/index.html | 41 + .../examples/cloud-in-a-box/index.html | 89 + .../guides/deploy-guide/examples/index.html | 26 + .../deploy-guide/examples/testbed/index.html | 86 + docs/iaas/guides/deploy-guide/index.html | 35 + .../guides/deploy-guide/manager/index.html | 50 + .../deploy-guide/provisioning/index.html | 43 + docs/iaas/guides/deploy-guide/seed/index.html | 41 + .../deploy-guide/services/ceph/index.html | 32 + .../guides/deploy-guide/services/index.html | 26 + .../services/infrastructure/index.html | 30 + .../services/logging-monitoring/index.html | 27 + .../deploy-guide/services/network/index.html | 28 + .../services/openstack/index.html | 27 + docs/iaas/guides/index.html | 26 + .../guides/operations-guide/ceph/index.html | 91 + docs/iaas/guides/operations-guide/index.html | 28 + .../operations-guide/manager/apply/index.html | 26 + .../manager/console/index.html | 27 + .../operations-guide/manager/index.html | 26 + .../operations-guide/manager/log/index.html | 28 + .../operations-guide/manager/task/index.html | 29 + .../openstack/cinder/index.html | 26 + .../day2-operations/flavor-manager/index.html | 41 + .../day2-operations/image-manager/index.html | 57 + .../openstack/day2-operations/index.html | 26 + .../project-manager/index.html | 26 + .../resource-manager/index.html | 26 + .../sandbox-manager/index.html | 26 + .../operations-guide/openstack/index.html | 26 + .../openstack/octavia/index.html | 26 + .../other-guides/contributor-guide/index.html | 33 + .../other-guides/developer-guide/index.html | 30 + .../developer-guide/releases/index.html | 62 + .../developer-guide/scripts/index.html | 35 + .../developer-guide/zuul-ci/index.html | 31 + docs/iaas/guides/other-guides/index.html | 26 + .../other-guides/style-guide/index.html | 35 + docs/iaas/guides/other-guides/zuul/index.html | 67 + .../guides/troubleshooting-guide/index.html | 26 + .../troubleshooting-guide/manager/index.html | 29 + .../openstack/index.html | 26 + .../iaas/guides/upgrade-guide/ceph/index.html | 26 + .../guides/upgrade-guide/docker/index.html | 53 + docs/iaas/guides/upgrade-guide/index.html | 29 + .../upgrade-guide/infrastructure/index.html | 29 + .../logging-monitoring/index.html | 26 + .../guides/upgrade-guide/manager/index.html | 30 + .../guides/upgrade-guide/network/index.html | 26 + .../guides/upgrade-guide/openstack/index.html | 28 + docs/iaas/overview/architecture/index.html | 26 + docs/iaas/overview/compute/index.html | 26 + docs/iaas/overview/knowledge/index.html | 26 + docs/iaas/overview/network/index.html | 26 + docs/iaas/overview/storage/index.html | 26 + .../index.html | 71 + docs/index.html | 86 + docs/operating-scs/audits/index.html | 26 + .../docs/component_overview/index.html | 26 + .../status-page/docs/components/index.html | 26 + .../docs/levels_of_consensus/index.html | 27 + .../status-page/docs/overview/index.html | 28 + docs/operating-scs/guides/guide-1/index.html | 26 + .../incident-management/index.html | 26 + .../lifecycle-management/index.html | 26 + docs/operating-scs/logging/index.html | 26 + .../metering/meter_configuration/index.html | 30 + docs/operating-scs/monitoring/index.html | 26 + docs/operating-scs/overview/index.html | 26 + docs/releases/Release0/index.html | 54 + docs/releases/Release1/index.html | 112 + docs/releases/Release2/index.html | 101 + docs/releases/Release3/index.html | 112 + docs/releases/Release4/index.html | 52 + docs/releases/Release5/index.html | 59 + docs/releases/ReleaseX/index.html | 30 + docs/standards/index.html | 26 + img/favicon.ico | Bin 0 -> 15086 bytes img/github-failed-dco.png | Bin 0 -> 210159 bytes img/logo.svg | 7 + img/summit-social.png | Bin 0 -> 253644 bytes index.html | 26 + search-index.json | 1 + search/index.html | 26 + sitemap.xml | 1 + .../certification/certified-clouds/index.html | 26 + .../certification/get-certified/index.html | 27 + standards/certification/overview/index.html | 27 + .../subjects-versions/index.html | 27 + standards/decision-records/index.html | 26 + standards/global/index.html | 26 + standards/global/scs-0001/index.html | 26 + standards/global/scs-0002/index.html | 26 + standards/global/scs-0003/index.html | 26 + standards/iaas/index.html | 26 + standards/iaas/scs-0100/index.html | 27 + standards/iaas/scs-0101/index.html | 26 + standards/iaas/scs-0102/index.html | 26 + standards/iaas/scs-0103/index.html | 26 + standards/iaas/scs-0104/index.html | 26 + standards/iam/index.html | 26 + standards/iam/scs-0300/index.html | 26 + standards/index.html | 26 + standards/kaas/index.html | 26 + standards/kaas/scs-0210/index.html | 26 + standards/kaas/scs-0211/index.html | 26 + standards/ops/index.html | 26 + standards/ops/scs-0412/index.html | 26 + .../index.html | 139 + .../scs-0002-v1-standards-docs-org/index.html | 32 + .../scs-0002-v2-standards-docs-org/index.html | 26 + .../index.html | 58 + .../scs-0100-v1-flavor-naming/index.html | 142 + .../scs-0100-v2-flavor-naming/index.html | 198 + .../scs-0100-v3-flavor-naming/index.html | 191 + standards/scs-0101-v1-entropy/index.html | 78 + .../scs-0102-v1-image-metadata/index.html | 119 + .../scs-0103-v1-standard-flavors/index.html | 70 + .../scs-0104-v1-standard-images/index.html | 52 + standards/scs-0110-v1-ssd-flavors/index.html | 174 + standards/scs-0110/index.html | 26 + .../index.html | 27 + .../index.html | 36 + .../scs-0210-v2-k8s-version-policy/index.html | 55 + .../index.html | 28 + .../index.html | 178 + .../index.html | 108 + .../index.html | 33 + .../index.html | 66 + .../index.html | 151 + .../scs-0301-v1-naming-conventions/index.html | 52 + .../index.html | 46 + .../index.html | 78 + .../index.html | 27 + .../index.html | 27 + .../index.html | 93 + .../index.html | 65 + .../scs-0412-v1-metering-json/index.html | 45 + standards/scs-XXXX-vN-template/index.html | 26 + standards/standards/overview/index.html | 26 + standards/standards/scs-0111/index.html | 26 + standards/standards/scs-0212/index.html | 26 + standards/standards/scs-0213/index.html | 26 + standards/standards/scs-0301/index.html | 26 + standards/standards/scs-0400/index.html | 26 + standards/standards/scs-0401/index.html | 26 + standards/standards/scs-0402/index.html | 26 + standards/standards/scs-0410/index.html | 26 + standards/standards/scs-0411/index.html | 26 + 577 files changed, 61179 insertions(+) create mode 100644 .nojekyll create mode 100644 404.html create mode 100644 assets/css/styles.551adc4a.css create mode 100644 assets/files/clouds-public-e9ba939dfde1c0efe3a32ec6f5d1f612.yaml create mode 100644 assets/files/clouds.yaml-9c0c983f9c293bc5adeae683d442174e.sample create mode 100644 assets/images/disk-layout-db64866af60ef6d2c41245db78dd15d1.png create mode 100644 assets/images/flavors-1-bd8d085759b264b3e58020d1390803fd.png create mode 100644 assets/images/flavors-2-d9a87ab2a63ed62ace4303facc069b8b.png create mode 100644 assets/images/getting_started_openstack_anim-d88d134eff244cf8891c5ca1efcfc65a.gif create mode 100644 assets/images/github-failed-dco-82f9dafea83c36769069087ceb522cdc.png create mode 100644 assets/images/image-01d5564077ed43bda1d921e522df7dd7.png create mode 100644 assets/images/image-123702bb74539962d7c6839715583f29.png create mode 100644 assets/images/inventory-reconciler-acd822767003069a8935e016081383a5.png create mode 100644 assets/images/issue-6cc9ac7387e0589d625dded707510641.png create mode 100644 assets/images/python-osism.drawio-19e90813de60b4afa58bc7ee4a3aeae8.png create mode 100644 assets/images/screenshot1-c880f78ba33fc0577dce811dc2e42724.png create mode 100644 assets/js/0047ab5d.2b37419c.js create mode 100644 assets/js/01a85c17.9d138910.js create mode 100644 assets/js/03c8668f.49e46fdd.js create mode 100644 assets/js/04fe2bfd.11a803b5.js create mode 100644 assets/js/059c4264.3f0b191f.js create mode 100644 assets/js/05e7973d.e9b6c205.js create mode 100644 assets/js/061d8128.3afef4fd.js create mode 100644 assets/js/0683500c.2b8b2a8c.js create mode 100644 assets/js/070e71f0.58103e04.js create mode 100644 assets/js/07d3bac7.51a7e5f9.js create mode 100644 assets/js/082859ca.7f7eaa73.js create mode 100644 assets/js/0860b861.421e2adb.js create mode 100644 assets/js/08bf2ad2.03b3f319.js create mode 100644 assets/js/096c51c8.d7561d62.js create mode 100644 assets/js/09adb968.d5282853.js create mode 100644 assets/js/09ba26e2.70c31ef5.js create mode 100644 assets/js/09cf625e.1e69a60f.js create mode 100644 assets/js/0a757274.443da196.js create mode 100644 assets/js/0bcc5672.c34c9f3f.js create mode 100644 assets/js/0dfeccb2.fb23b4b5.js create mode 100644 assets/js/0ea173ba.bcf8204e.js create mode 100644 assets/js/1109f10b.74701188.js create mode 100644 assets/js/1276f6ab.575dfd89.js create mode 100644 assets/js/14c1041d.4d50ef28.js create mode 100644 assets/js/14eb3368.75e9f711.js create mode 100644 assets/js/15336817.ef571073.js create mode 100644 assets/js/15e4a743.0af51b01.js create mode 100644 assets/js/16aafd28.b86ae6c0.js create mode 100644 assets/js/1722e234.839a439e.js create mode 100644 assets/js/17896441.7488da5b.js create mode 100644 assets/js/178df98e.b749cc52.js create mode 100644 assets/js/183af61f.acca119c.js create mode 100644 assets/js/184e5ead.1c8c2a49.js create mode 100644 assets/js/19afbcc8.847c21ab.js create mode 100644 assets/js/1a4e3797.9cf10c41.js create mode 100644 assets/js/1bc22123.4d28e76e.js create mode 100644 assets/js/1be78505.c760445e.js create mode 100644 assets/js/1c091541.8267c1b7.js create mode 100644 assets/js/1c894279.6c35e1a4.js create mode 100644 assets/js/1df93b7f.975423cf.js create mode 100644 assets/js/1f1274a0.26037ab8.js create mode 100644 assets/js/1f34ee25.36ef8ed2.js create mode 100644 assets/js/2163574d.81ce3d02.js create mode 100644 assets/js/23cd166f.4301e5b2.js create mode 100644 assets/js/23e62f09.0000ff74.js create mode 100644 assets/js/247783bb.49d074f5.js create mode 100644 assets/js/24fca748.05fabdc8.js create mode 100644 assets/js/26bc5a46.56d13ab6.js create mode 100644 assets/js/26dd306b.dca4caf2.js create mode 100644 assets/js/27f24dfd.c21ec51f.js create mode 100644 assets/js/29331985.4f0161cb.js create mode 100644 assets/js/29c2cfba.1c8a2c33.js create mode 100644 assets/js/2c42a58f.ff2f3274.js create mode 100644 assets/js/301607a5.9abced11.js create mode 100644 assets/js/306a8c6c.46bc9fa6.js create mode 100644 assets/js/316.d513d091.js create mode 100644 assets/js/32227eef.91ab4d35.js create mode 100644 assets/js/343a1afc.185eefda.js create mode 100644 assets/js/35fbae7a.de4a7feb.js create mode 100644 assets/js/36f749d2.ee037847.js create mode 100644 assets/js/38b583d2.5ce52315.js create mode 100644 assets/js/38c9ef35.2ecdc10a.js create mode 100644 assets/js/39eb4dc7.68678439.js create mode 100644 assets/js/3a00f46c.eaf48fb4.js create mode 100644 assets/js/3bf9fbe6.8f219a6a.js create mode 100644 assets/js/3d19221e.556718cc.js create mode 100644 assets/js/3e493f26.8bc7968d.js create mode 100644 assets/js/3f3928dc.b46b088f.js create mode 100644 assets/js/3ff13a62.e2f45d6a.js create mode 100644 assets/js/40d9468c.d7025893.js create mode 100644 assets/js/4129286c.516ed141.js create mode 100644 assets/js/41ab9761.6a8fa08f.js create mode 100644 assets/js/42088e64.b8cc5f7f.js create mode 100644 assets/js/421b5e65.74a01f86.js create mode 100644 assets/js/422fff4b.dddbd424.js create mode 100644 assets/js/431e6cfe.2c1b1bfb.js create mode 100644 assets/js/437bedbc.714985c6.js create mode 100644 assets/js/441ae8e9.4fc54eca.js create mode 100644 assets/js/4468ebd1.8749ca1b.js create mode 100644 assets/js/45f4377b.7e84abe9.js create mode 100644 assets/js/477ed06d.df0a39b2.js create mode 100644 assets/js/487.7b135b0c.js create mode 100644 assets/js/495e0345.3521aa1c.js create mode 100644 assets/js/4972.908ebfbb.js create mode 100644 assets/js/49993131.ee5e1f6f.js create mode 100644 assets/js/49bc3785.51b02e13.js create mode 100644 assets/js/4b015924.e7f9ce9f.js create mode 100644 assets/js/4e6fa974.528e633e.js create mode 100644 assets/js/502adbf6.68fb27d5.js create mode 100644 assets/js/50963409.2fac71a6.js create mode 100644 assets/js/5268a994.b87d3303.js create mode 100644 assets/js/526992cf.021d92b1.js create mode 100644 assets/js/52e3f5ca.2c36c8fb.js create mode 100644 assets/js/53596370.a38fddc7.js create mode 100644 assets/js/5525.640f1c90.js create mode 100644 assets/js/5565c8ed.3ad273b7.js create mode 100644 assets/js/564eabfd.ad788772.js create mode 100644 assets/js/5830dd0a.62787c53.js create mode 100644 assets/js/589280f5.5bb03a5e.js create mode 100644 assets/js/59307471.5353ba55.js create mode 100644 assets/js/5ad6acbd.603ce1a3.js create mode 100644 assets/js/5b235e06.ed305ad4.js create mode 100644 assets/js/5b402526.4c477e61.js create mode 100644 assets/js/5b9bf978.423a0463.js create mode 100644 assets/js/5bd7bc3b.6f984540.js create mode 100644 assets/js/5c201b0a.9f1a2f88.js create mode 100644 assets/js/5d54de92.69868db2.js create mode 100644 assets/js/6048.9ebfb35f.js create mode 100644 assets/js/60fc342f.dae6297c.js create mode 100644 assets/js/61ce23c3.bb3640ae.js create mode 100644 assets/js/6316.97d4676f.js create mode 100644 assets/js/63c8fde6.64de5717.js create mode 100644 assets/js/644d3432.6b01bab3.js create mode 100644 assets/js/653904f7.3520249c.js create mode 100644 assets/js/65c90e53.e76dec9c.js create mode 100644 assets/js/670b12e1.9f8c72b5.js create mode 100644 assets/js/67dad519.3679338b.js create mode 100644 assets/js/684abe8e.5aee6941.js create mode 100644 assets/js/685813dc.4342e07f.js create mode 100644 assets/js/6875c492.177d3290.js create mode 100644 assets/js/699c0e5c.2f09704f.js create mode 100644 assets/js/69b09ea9.9965528d.js create mode 100644 assets/js/6a15e24c.e21634b6.js create mode 100644 assets/js/6ad9ab45.1eada8ec.js create mode 100644 assets/js/6c33bb99.28960205.js create mode 100644 assets/js/6c4198a1.ff28e6e9.js create mode 100644 assets/js/6d32cafb.417ec17e.js create mode 100644 assets/js/6d890b23.b42a27b6.js create mode 100644 assets/js/6db2ece2.bdb3ea87.js create mode 100644 assets/js/6e35e719.32fa9b7d.js create mode 100644 assets/js/6e7e1a19.3537e037.js create mode 100644 assets/js/6f1c571c.221182a2.js create mode 100644 assets/js/6f4a06ca.9c263a3e.js create mode 100644 assets/js/724.d7e60c08.js create mode 100644 assets/js/73956345.ebd80645.js create mode 100644 assets/js/739c0ae8.eef7e9df.js create mode 100644 assets/js/767805d3.06228b2e.js create mode 100644 assets/js/7724.5e8ea986.js create mode 100644 assets/js/7724.5e8ea986.js.LICENSE.txt create mode 100644 assets/js/7aa2de41.bfeda755.js create mode 100644 assets/js/7b449e09.e32dd5c7.js create mode 100644 assets/js/7b787d81.a1ba85d0.js create mode 100644 assets/js/7bd33c3d.7bf609e7.js create mode 100644 assets/js/7e793606.77dcc9f1.js create mode 100644 assets/js/7e7cf0e4.12d3736a.js create mode 100644 assets/js/7f1a31c3.0f6888d8.js create mode 100644 assets/js/7f34127d.ae52c4fe.js create mode 100644 assets/js/814f3328.146ae6f7.js create mode 100644 assets/js/83100446.3577da70.js create mode 100644 assets/js/8443.eb0070b3.js create mode 100644 assets/js/8443.eb0070b3.js.LICENSE.txt create mode 100644 assets/js/86ee3414.80d0289f.js create mode 100644 assets/js/88684b71.a421c8ed.js create mode 100644 assets/js/88f37d1b.ffc0586d.js create mode 100644 assets/js/89176cae.00a7820f.js create mode 100644 assets/js/8954.a36c6917.js create mode 100644 assets/js/8954.a36c6917.js.LICENSE.txt create mode 100644 assets/js/89ad43f4.2d8e789d.js create mode 100644 assets/js/8a671cf8.8561a958.js create mode 100644 assets/js/8aa3e7cc.d48d075e.js create mode 100644 assets/js/8ba37aa2.72eb127d.js create mode 100644 assets/js/8fc094a7.5adfaa2c.js create mode 100644 assets/js/904.c767a1e2.js create mode 100644 assets/js/9278f3d6.bdbbd293.js create mode 100644 assets/js/929c4e1b.79dd42bc.js create mode 100644 assets/js/931040e8.21c93343.js create mode 100644 assets/js/935f2afb.62081e2d.js create mode 100644 assets/js/9487.e7898b96.js create mode 100644 assets/js/94f31572.2cd0b599.js create mode 100644 assets/js/95d93785.1a6fd97a.js create mode 100644 assets/js/95fe5f6c.61193966.js create mode 100644 assets/js/96f8fd49.1849021a.js create mode 100644 assets/js/97b1504a.b1e7ce48.js create mode 100644 assets/js/98f69cae.ab53b220.js create mode 100644 assets/js/99b53e63.b234e41b.js create mode 100644 assets/js/9d1324c7.3b4cab1d.js create mode 100644 assets/js/9d187656.4abc6493.js create mode 100644 assets/js/9e10b8d6.a1122053.js create mode 100644 assets/js/9e4087bc.41d5876d.js create mode 100644 assets/js/9f356e5b.0298bb37.js create mode 100644 assets/js/9fb1f91e.1f39b355.js create mode 100644 assets/js/a0b1bbd7.f2667178.js create mode 100644 assets/js/a0eeb362.9541cb2a.js create mode 100644 assets/js/a12a2e44.e23f917a.js create mode 100644 assets/js/a12f05ab.fe72d9a5.js create mode 100644 assets/js/a15c4cb6.3f6510d3.js create mode 100644 assets/js/a38b6a75.f555d2a8.js create mode 100644 assets/js/a3e11933.25ca3db0.js create mode 100644 assets/js/a4833b52.43cd4468.js create mode 100644 assets/js/a51c5cdb.e128bc50.js create mode 100644 assets/js/a51f78bf.66f3f342.js create mode 100644 assets/js/a58a5045.5a291913.js create mode 100644 assets/js/a6aa9e1f.31d56e6b.js create mode 100644 assets/js/a7023ddc.37c6ea90.js create mode 100644 assets/js/a708848c.10af8687.js create mode 100644 assets/js/a70dabb3.8edceb88.js create mode 100644 assets/js/a71bcd95.bdd15d3b.js create mode 100644 assets/js/a7434565.30e719e3.js create mode 100644 assets/js/a8ea16f4.8d2c7e70.js create mode 100644 assets/js/a8f67d60.710bcfa2.js create mode 100644 assets/js/a94c36cd.83a287d6.js create mode 100644 assets/js/a9f40339.71286c0d.js create mode 100644 assets/js/aa0979a6.0d55683d.js create mode 100644 assets/js/aaad657b.701f6b3f.js create mode 100644 assets/js/abb47370.83d4a1df.js create mode 100644 assets/js/abecca15.d865e5c1.js create mode 100644 assets/js/abfb0638.be57d877.js create mode 100644 assets/js/ac087500.5526b6b8.js create mode 100644 assets/js/ad39e84b.2dc71df5.js create mode 100644 assets/js/afaff11a.de4f00b8.js create mode 100644 assets/js/b08c16de.3569e2f3.js create mode 100644 assets/js/b12ed0df.5be3e843.js create mode 100644 assets/js/b2b675dd.d31b93c7.js create mode 100644 assets/js/b2f554cd.9dc96d6c.js create mode 100644 assets/js/b840bdcc.a3f773d3.js create mode 100644 assets/js/b8fd74b5.899b29ef.js create mode 100644 assets/js/bd319452.5e3ee300.js create mode 100644 assets/js/bd8a97c5.cbf09d3b.js create mode 100644 assets/js/be01f2a0.1174b07a.js create mode 100644 assets/js/be96733a.27792029.js create mode 100644 assets/js/c0cd111c.82864e7a.js create mode 100644 assets/js/c2f44c5f.85d26394.js create mode 100644 assets/js/c377a04b.fec5be02.js create mode 100644 assets/js/c490e74d.32f50109.js create mode 100644 assets/js/c5533f5e.ff101166.js create mode 100644 assets/js/c75320ff.8107d9f1.js create mode 100644 assets/js/ccc49370.fb6007ce.js create mode 100644 assets/js/cd0ad4f0.5060300f.js create mode 100644 assets/js/cd4fb20e.cf9156e9.js create mode 100644 assets/js/ce756c16.116ea445.js create mode 100644 assets/js/cf2bf9cf.f4845141.js create mode 100644 assets/js/cffc493c.ba4544e9.js create mode 100644 assets/js/d078bc1c.9daaac60.js create mode 100644 assets/js/d0ee365b.c08542e5.js create mode 100644 assets/js/d1aa920e.0ef065cf.js create mode 100644 assets/js/d227faa6.82a9ebe7.js create mode 100644 assets/js/d5256f0a.ead868d7.js create mode 100644 assets/js/d59f7d52.7408da31.js create mode 100644 assets/js/d5ac8ed7.92329f52.js create mode 100644 assets/js/d6a104fd.5042bce1.js create mode 100644 assets/js/d755aabc.ad59fddc.js create mode 100644 assets/js/d770ad8d.52adb3ce.js create mode 100644 assets/js/da1a5473.e602bded.js create mode 100644 assets/js/da20a34d.30617762.js create mode 100644 assets/js/dbde4c02.92aaf750.js create mode 100644 assets/js/dcf2f717.cfa622d3.js create mode 100644 assets/js/ddebfa81.a9802837.js create mode 100644 assets/js/de0540ff.3766e6e4.js create mode 100644 assets/js/df35cf96.7b771da6.js create mode 100644 assets/js/dfce392e.26c34b2f.js create mode 100644 assets/js/dfe27b1e.573cbd5b.js create mode 100644 assets/js/e24c1f8d.cc8bc8ba.js create mode 100644 assets/js/e44168e5.8403ffa6.js create mode 100644 assets/js/e57b2c87.e698bb2d.js create mode 100644 assets/js/e5a53cb8.2a2a4151.js create mode 100644 assets/js/e747ec83.fe9df707.js create mode 100644 assets/js/eaf80524.07fe535f.js create mode 100644 assets/js/eb99bfed.1ded4987.js create mode 100644 assets/js/ed24060c.115358fc.js create mode 100644 assets/js/edc931f8.0c3dcc30.js create mode 100644 assets/js/eea6a18c.1d76c598.js create mode 100644 assets/js/ef9d238d.47a1d3f2.js create mode 100644 assets/js/f0b55dfe.1cf7d917.js create mode 100644 assets/js/f0e20cb6.93b69c09.js create mode 100644 assets/js/f14351c1.a849afd8.js create mode 100644 assets/js/f1715aef.4e0027fc.js create mode 100644 assets/js/f2a59390.ffc7a27c.js create mode 100644 assets/js/f385820d.2967b809.js create mode 100644 assets/js/f40b2df0.678c2584.js create mode 100644 assets/js/f4cdb2d9.de0eb0fa.js create mode 100644 assets/js/f5b4e375.3677f5dc.js create mode 100644 assets/js/f68824be.99ea73af.js create mode 100644 assets/js/f793d2d5.c5d3177c.js create mode 100644 assets/js/f8869d03.86281479.js create mode 100644 assets/js/f91986bc.9a1b755b.js create mode 100644 assets/js/f9ec068e.31f29287.js create mode 100644 assets/js/fa7c4c29.5326d7fa.js create mode 100644 assets/js/fd34a958.fe509446.js create mode 100644 assets/js/fd74033a.43f2e499.js create mode 100644 assets/js/fd8cbe72.223d7825.js create mode 100644 assets/js/fe5fac7c.8e37e6d4.js create mode 100644 assets/js/fff9aecb.216c5323.js create mode 100644 assets/js/main.9d213e76.js create mode 100644 assets/js/main.9d213e76.js.LICENSE.txt create mode 100644 assets/js/runtime~main.21e39613.js create mode 100644 blog/archive/index.html create mode 100644 blog/atom.xml create mode 100644 blog/first-blog-post/index.html create mode 100644 blog/index.html create mode 100644 blog/rss.xml create mode 100644 blog/tags/community/community/index.html create mode 100644 blog/tags/community/index.html create mode 100644 blog/tags/howto/index.html create mode 100644 blog/tags/index.html create mode 100644 community/calendar/index.html create mode 100644 community/category/contribute/index.html create mode 100644 community/cloud-resources/getting-started-openstack/index.html create mode 100644 community/cloud-resources/index.html create mode 100644 community/cloud-resources/plusserver-gx-scs/index.html create mode 100644 community/cloud-resources/wavestack/index.html create mode 100644 community/collaboration/index.html create mode 100644 community/communication/jitsi/index.html create mode 100644 community/communication/mailinglists/index.html create mode 100644 community/communication/matrix/index.html create mode 100644 community/community/calendar/index.html create mode 100644 community/community/category/contribute/index.html create mode 100644 community/community/cloud-resources/getting-started-openstack/index.html create mode 100644 community/community/cloud-resources/index.html create mode 100644 community/community/cloud-resources/plusserver-gx-scs/index.html create mode 100644 community/community/cloud-resources/wavestack/index.html create mode 100644 community/community/collaboration/index.html create mode 100644 community/community/communication/jitsi/index.html create mode 100644 community/community/communication/mailinglists/index.html create mode 100644 community/community/communication/matrix/index.html create mode 100644 community/community/contribute/adding-docs-guide/index.html create mode 100644 community/community/contribute/doc-files-structure-guide/index.html create mode 100644 community/community/contribute/docs-workflow-explanation/index.html create mode 100644 community/community/contribute/linting-guide/index.html create mode 100644 community/community/contribute/local-docusaurus-development-guide/index.html create mode 100644 community/community/contribute/styleguide/index.html create mode 100644 community/community/contribute/styleguides/ansible_styleguide/index.html create mode 100644 community/community/github/branchprotection/index.html create mode 100644 community/community/github/dco-and-licenses/index.html create mode 100644 community/community/github/tips-and-tricks/index.html create mode 100644 community/community/hackathons/checklist/index.html create mode 100644 community/community/index.html create mode 100644 community/community/license-considerations/index.html create mode 100644 community/contribute/adding-docs-guide/index.html create mode 100644 community/contribute/doc-files-structure-guide/index.html create mode 100644 community/contribute/docs-workflow-explanation/index.html create mode 100644 community/contribute/linting-guide/index.html create mode 100644 community/contribute/local-docusaurus-development-guide/index.html create mode 100644 community/contribute/styleguide/index.html create mode 100644 community/contribute/styleguides/ansible_styleguide/index.html create mode 100644 community/github/branchprotection/index.html create mode 100644 community/github/dco-and-licenses/index.html create mode 100644 community/github/tips-and-tricks/index.html create mode 100644 community/hackathons/checklist/index.html create mode 100644 community/index.html create mode 100644 community/license-considerations/index.html create mode 100644 dev-docs/index.html create mode 100644 dev-docs/operations/iam/identity-federation-in-scs/index.html create mode 100644 dev-docs/operations/iam/openstack-federation-via-oidc/index.html create mode 100644 dev-docs/operations/operations/zuul-ci-cd-quickstart-user-guide/index.html create mode 100644 docs/category/components-1/index.html create mode 100644 docs/category/components-2/index.html create mode 100644 docs/category/components/index.html create mode 100644 docs/category/iaas-layer/index.html create mode 100644 docs/category/identity-and-access-management-iam/index.html create mode 100644 docs/category/k8s-cluster-api-provider/index.html create mode 100644 docs/category/metering/index.html create mode 100644 docs/category/operating-scs/index.html create mode 100644 docs/category/releases/index.html create mode 100644 docs/category/status-page-api/index.html create mode 100644 docs/container/components/k8s-cluster-api-provider/doc/LoadBalancer-ExtTrafficLocal/index.html create mode 100644 docs/container/components/k8s-cluster-api-provider/doc/Maintenance_and_Troubleshooting/index.html create mode 100644 docs/container/components/k8s-cluster-api-provider/doc/Upgrade-Guide/index.html create mode 100644 docs/container/components/k8s-cluster-api-provider/doc/application-credentials/index.html create mode 100644 docs/container/components/k8s-cluster-api-provider/doc/configuration/index.html create mode 100644 docs/container/components/k8s-cluster-api-provider/doc/continuous-integration/index.html create mode 100644 docs/container/components/k8s-cluster-api-provider/doc/make-reference/index.html create mode 100644 docs/container/components/k8s-cluster-api-provider/doc/overview/index.html create mode 100644 docs/container/components/k8s-cluster-api-provider/doc/quickstart/index.html create mode 100644 docs/container/components/k8s-cluster-api-provider/doc/requirements/index.html create mode 100644 docs/container/components/k8s-cluster-api-provider/doc/roadmap/index.html create mode 100644 docs/container/components/k8s-cluster-api-provider/doc/usage/cluster-mgmt-capi-mgmt-node/index.html create mode 100644 docs/container/components/k8s-cluster-api-provider/doc/usage/containter-registry-configuration/index.html create mode 100644 docs/container/components/k8s-cluster-api-provider/doc/usage/create-new-cluster/index.html create mode 100644 docs/container/components/k8s-cluster-api-provider/doc/usage/custom-ca/index.html create mode 100644 docs/container/components/k8s-cluster-api-provider/doc/usage/gateway-api/index.html create mode 100644 docs/container/components/k8s-cluster-api-provider/doc/usage/harbor/index.html create mode 100644 docs/container/components/k8s-cluster-api-provider/doc/usage/index.html create mode 100644 docs/container/components/k8s-cluster-api-provider/doc/usage/managing-many-clusters/index.html create mode 100644 docs/container/components/k8s-cluster-api-provider/doc/usage/migrate-to-cluster-class/index.html create mode 100644 docs/container/components/k8s-cluster-api-provider/doc/usage/multi-az-and-multi-cloud-environments/index.html create mode 100644 docs/container/components/k8s-cluster-api-provider/doc/usage/testing/index.html create mode 100644 docs/container/deployment-examples/a/hardware/index.html create mode 100644 docs/container/deployment-examples/a/index.html create mode 100644 docs/container/deployment-examples/a/software/index.html create mode 100644 docs/container/guides/guide1/index.html create mode 100644 docs/container/index.html create mode 100644 docs/container/overview/architecture/index.html create mode 100644 docs/container/overview/knowledge/index.html create mode 100644 docs/faq/index.html create mode 100644 docs/getting-started/containerization/index.html create mode 100644 docs/getting-started/overview/index.html create mode 100644 docs/getting-started/virtualization/index.html create mode 100644 docs/glossary/index.html create mode 100644 docs/iaas/components/flavor-manager/index.html create mode 100644 docs/iaas/components/image-manager/index.html create mode 100644 docs/iaas/components/index.html create mode 100644 docs/iaas/components/project-manager/index.html create mode 100644 docs/iaas/components/resource-manager/index.html create mode 100644 docs/iaas/components/sandbox-manager/index.html create mode 100644 docs/iaas/guides/configuration-guide/ceph/index.html create mode 100644 docs/iaas/guides/configuration-guide/commons/index.html create mode 100644 docs/iaas/guides/configuration-guide/commons/network/index.html create mode 100644 docs/iaas/guides/configuration-guide/commons/packages/index.html create mode 100644 docs/iaas/guides/configuration-guide/commons/services/index.html create mode 100644 docs/iaas/guides/configuration-guide/commons/sshconfig/index.html create mode 100644 docs/iaas/guides/configuration-guide/commons/sysctl/index.html create mode 100644 docs/iaas/guides/configuration-guide/commons/timezone/index.html create mode 100644 docs/iaas/guides/configuration-guide/configuration-repository/index.html create mode 100644 docs/iaas/guides/configuration-guide/index.html create mode 100644 docs/iaas/guides/configuration-guide/inventory/index.html create mode 100644 docs/iaas/guides/configuration-guide/manager/index.html create mode 100644 docs/iaas/guides/configuration-guide/openstack/horizon/index.html create mode 100644 docs/iaas/guides/configuration-guide/openstack/index.html create mode 100644 docs/iaas/guides/configuration-guide/openstack/keystone/index.html create mode 100644 docs/iaas/guides/configuration-guide/proxy/index.html create mode 100644 docs/iaas/guides/configuration-guide/self-signed-certificates/index.html create mode 100644 docs/iaas/guides/configuration-guide/services/index.html create mode 100644 docs/iaas/guides/deploy-guide/bootstrap/index.html create mode 100644 docs/iaas/guides/deploy-guide/examples/cloud-in-a-box/index.html create mode 100644 docs/iaas/guides/deploy-guide/examples/index.html create mode 100644 docs/iaas/guides/deploy-guide/examples/testbed/index.html create mode 100644 docs/iaas/guides/deploy-guide/index.html create mode 100644 docs/iaas/guides/deploy-guide/manager/index.html create mode 100644 docs/iaas/guides/deploy-guide/provisioning/index.html create mode 100644 docs/iaas/guides/deploy-guide/seed/index.html create mode 100644 docs/iaas/guides/deploy-guide/services/ceph/index.html create mode 100644 docs/iaas/guides/deploy-guide/services/index.html create mode 100644 docs/iaas/guides/deploy-guide/services/infrastructure/index.html create mode 100644 docs/iaas/guides/deploy-guide/services/logging-monitoring/index.html create mode 100644 docs/iaas/guides/deploy-guide/services/network/index.html create mode 100644 docs/iaas/guides/deploy-guide/services/openstack/index.html create mode 100644 docs/iaas/guides/index.html create mode 100644 docs/iaas/guides/operations-guide/ceph/index.html create mode 100644 docs/iaas/guides/operations-guide/index.html create mode 100644 docs/iaas/guides/operations-guide/manager/apply/index.html create mode 100644 docs/iaas/guides/operations-guide/manager/console/index.html create mode 100644 docs/iaas/guides/operations-guide/manager/index.html create mode 100644 docs/iaas/guides/operations-guide/manager/log/index.html create mode 100644 docs/iaas/guides/operations-guide/manager/task/index.html create mode 100644 docs/iaas/guides/operations-guide/openstack/cinder/index.html create mode 100644 docs/iaas/guides/operations-guide/openstack/day2-operations/flavor-manager/index.html create mode 100644 docs/iaas/guides/operations-guide/openstack/day2-operations/image-manager/index.html create mode 100644 docs/iaas/guides/operations-guide/openstack/day2-operations/index.html create mode 100644 docs/iaas/guides/operations-guide/openstack/day2-operations/project-manager/index.html create mode 100644 docs/iaas/guides/operations-guide/openstack/day2-operations/resource-manager/index.html create mode 100644 docs/iaas/guides/operations-guide/openstack/day2-operations/sandbox-manager/index.html create mode 100644 docs/iaas/guides/operations-guide/openstack/index.html create mode 100644 docs/iaas/guides/operations-guide/openstack/octavia/index.html create mode 100644 docs/iaas/guides/other-guides/contributor-guide/index.html create mode 100644 docs/iaas/guides/other-guides/developer-guide/index.html create mode 100644 docs/iaas/guides/other-guides/developer-guide/releases/index.html create mode 100644 docs/iaas/guides/other-guides/developer-guide/scripts/index.html create mode 100644 docs/iaas/guides/other-guides/developer-guide/zuul-ci/index.html create mode 100644 docs/iaas/guides/other-guides/index.html create mode 100644 docs/iaas/guides/other-guides/style-guide/index.html create mode 100644 docs/iaas/guides/other-guides/zuul/index.html create mode 100644 docs/iaas/guides/troubleshooting-guide/index.html create mode 100644 docs/iaas/guides/troubleshooting-guide/manager/index.html create mode 100644 docs/iaas/guides/troubleshooting-guide/openstack/index.html create mode 100644 docs/iaas/guides/upgrade-guide/ceph/index.html create mode 100644 docs/iaas/guides/upgrade-guide/docker/index.html create mode 100644 docs/iaas/guides/upgrade-guide/index.html create mode 100644 docs/iaas/guides/upgrade-guide/infrastructure/index.html create mode 100644 docs/iaas/guides/upgrade-guide/logging-monitoring/index.html create mode 100644 docs/iaas/guides/upgrade-guide/manager/index.html create mode 100644 docs/iaas/guides/upgrade-guide/network/index.html create mode 100644 docs/iaas/guides/upgrade-guide/openstack/index.html create mode 100644 docs/iaas/overview/architecture/index.html create mode 100644 docs/iaas/overview/compute/index.html create mode 100644 docs/iaas/overview/knowledge/index.html create mode 100644 docs/iaas/overview/network/index.html create mode 100644 docs/iaas/overview/storage/index.html create mode 100644 docs/iam/intra-SCS-federation-setup-description-for-osism-doc-operations/index.html create mode 100644 docs/index.html create mode 100644 docs/operating-scs/audits/index.html create mode 100644 docs/operating-scs/components/status-page/docs/component_overview/index.html create mode 100644 docs/operating-scs/components/status-page/docs/components/index.html create mode 100644 docs/operating-scs/components/status-page/docs/levels_of_consensus/index.html create mode 100644 docs/operating-scs/components/status-page/docs/overview/index.html create mode 100644 docs/operating-scs/guides/guide-1/index.html create mode 100644 docs/operating-scs/incident-management/index.html create mode 100644 docs/operating-scs/lifecycle-management/index.html create mode 100644 docs/operating-scs/logging/index.html create mode 100644 docs/operating-scs/metering/meter_configuration/index.html create mode 100644 docs/operating-scs/monitoring/index.html create mode 100644 docs/operating-scs/overview/index.html create mode 100644 docs/releases/Release0/index.html create mode 100644 docs/releases/Release1/index.html create mode 100644 docs/releases/Release2/index.html create mode 100644 docs/releases/Release3/index.html create mode 100644 docs/releases/Release4/index.html create mode 100644 docs/releases/Release5/index.html create mode 100644 docs/releases/ReleaseX/index.html create mode 100644 docs/standards/index.html create mode 100644 img/favicon.ico create mode 100644 img/github-failed-dco.png create mode 100644 img/logo.svg create mode 100644 img/summit-social.png create mode 100644 index.html create mode 100644 search-index.json create mode 100644 search/index.html create mode 100644 sitemap.xml create mode 100644 standards/certification/certified-clouds/index.html create mode 100644 standards/certification/get-certified/index.html create mode 100644 standards/certification/overview/index.html create mode 100644 standards/certification/subjects-versions/index.html create mode 100644 standards/decision-records/index.html create mode 100644 standards/global/index.html create mode 100644 standards/global/scs-0001/index.html create mode 100644 standards/global/scs-0002/index.html create mode 100644 standards/global/scs-0003/index.html create mode 100644 standards/iaas/index.html create mode 100644 standards/iaas/scs-0100/index.html create mode 100644 standards/iaas/scs-0101/index.html create mode 100644 standards/iaas/scs-0102/index.html create mode 100644 standards/iaas/scs-0103/index.html create mode 100644 standards/iaas/scs-0104/index.html create mode 100644 standards/iam/index.html create mode 100644 standards/iam/scs-0300/index.html create mode 100644 standards/index.html create mode 100644 standards/kaas/index.html create mode 100644 standards/kaas/scs-0210/index.html create mode 100644 standards/kaas/scs-0211/index.html create mode 100644 standards/ops/index.html create mode 100644 standards/ops/scs-0412/index.html create mode 100644 standards/scs-0001-v1-sovereign-cloud-standards/index.html create mode 100644 standards/scs-0002-v1-standards-docs-org/index.html create mode 100644 standards/scs-0002-v2-standards-docs-org/index.html create mode 100644 standards/scs-0003-v1-sovereign-cloud-standards-yaml/index.html create mode 100644 standards/scs-0100-v1-flavor-naming/index.html create mode 100644 standards/scs-0100-v2-flavor-naming/index.html create mode 100644 standards/scs-0100-v3-flavor-naming/index.html create mode 100644 standards/scs-0101-v1-entropy/index.html create mode 100644 standards/scs-0102-v1-image-metadata/index.html create mode 100644 standards/scs-0103-v1-standard-flavors/index.html create mode 100644 standards/scs-0104-v1-standard-images/index.html create mode 100644 standards/scs-0110-v1-ssd-flavors/index.html create mode 100644 standards/scs-0110/index.html create mode 100644 standards/scs-0111-v1-volume-type-decisions/index.html create mode 100644 standards/scs-0210-v1-k8s-new-version-policy/index.html create mode 100644 standards/scs-0210-v2-k8s-version-policy/index.html create mode 100644 standards/scs-0211-v1-kaas-default-storage-class/index.html create mode 100644 standards/scs-0212-v1-requirements-for-container-registry/index.html create mode 100644 standards/scs-0213-v1-k8s-nodes-anti-affinity/index.html create mode 100644 standards/scs-0213-v1-requirements-for-testing-cluster-stacks/index.html create mode 100644 standards/scs-0214-v1-k8s-node-distribution/index.html create mode 100644 standards/scs-0300-v1-requirements-for-sso-identity-federation/index.html create mode 100644 standards/scs-0301-v1-naming-conventions/index.html create mode 100644 standards/scs-0302-v1-domain-manager-role/index.html create mode 100644 standards/scs-0400-v1-status-page-create-decision/index.html create mode 100644 standards/scs-0401-v1-status-page-reference-implementation-decision/index.html create mode 100644 standards/scs-0402-v1-status-page-openapi-spec-decision/index.html create mode 100644 standards/scs-0410-v1-gnocchi-as-metering-database/index.html create mode 100644 standards/scs-0411-v1-publishing_method_for_metering_data/index.html create mode 100644 standards/scs-0412-v1-metering-json/index.html create mode 100644 standards/scs-XXXX-vN-template/index.html create mode 100644 standards/standards/overview/index.html create mode 100644 standards/standards/scs-0111/index.html create mode 100644 standards/standards/scs-0212/index.html create mode 100644 standards/standards/scs-0213/index.html create mode 100644 standards/standards/scs-0301/index.html create mode 100644 standards/standards/scs-0400/index.html create mode 100644 standards/standards/scs-0401/index.html create mode 100644 standards/standards/scs-0402/index.html create mode 100644 standards/standards/scs-0410/index.html create mode 100644 standards/standards/scs-0411/index.html diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000000..e69de29bb2 diff --git a/404.html b/404.html new file mode 100644 index 0000000000..8bd36c97b4 --- /dev/null +++ b/404.html @@ -0,0 +1,26 @@ + + + + + +Page Not Found | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

+ + + + \ No newline at end of file diff --git a/assets/css/styles.551adc4a.css b/assets/css/styles.551adc4a.css new file mode 100644 index 0000000000..e7d128c1df --- /dev/null +++ b/assets/css/styles.551adc4a.css @@ -0,0 +1 @@ +.col,.container{padding:0 var(--ifm-spacing-horizontal);width:100%}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown li,body{word-wrap:break-word}body,ol ol,ol ul,ul ol,ul ul{margin:0}pre,table{overflow:auto}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button,code{vertical-align:middle}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.menu__link:hover,a{transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}.menu,.navbar-sidebar{overflow-x:hidden}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}*,.loadingRing_RJI3 div{box-sizing:border-box}.clean-list,.containsTaskList_mC6p,.details_lb9f>summary,.dropdown__menu,.menu__list{list-style:none}:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:#0000;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:#0000000d;--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 #0000001a;--ifm-global-shadow-md:0 5px 40px #0003;--ifm-global-shadow-tl:0 12px 28px 0 #0003,0 2px 4px 0 #0000001a;--ifm-z-index-dropdown:100;--ifm-z-index-fixed:200;--ifm-z-index-overlay:400;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.1rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-code-background);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:#0000;--ifm-table-stripe-background:#00000008;--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-background-color:var(--ifm-color-emphasis-500);--ifm-hr-height:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size:3rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.5rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:0.8rem;--ifm-breadcrumb-padding-vertical:0.4rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-spacing:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-footer-logo-max-width:min(30rem,90vw);--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:0.75rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:var(--ifm-global-radius);--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.2em;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.125rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem;--docusaurus-progress-bar-color:var(--ifm-color-primary);--ifm-color-primary:#0f5fe1;--ifm-color-primary-dark:##0e56cb;--ifm-color-primary-darker:##0c4cb4;--ifm-color-primary-darkest:##0b439e;--ifm-color-primary-light:##276fe4;--ifm-color-primary-lighter:##3f7fe7;--ifm-color-primary-lightest:##578fea;--ifm-code-font-size:95%;--docusaurus-highlighted-code-line-bg:#0000001a;--docusaurus-announcement-bar-height:auto;--docusaurus-collapse-button-bg:#0000;--docusaurus-collapse-button-bg-hover:#0000001a;--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300)}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:#0000}html{-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;text-size-adjust:100%;background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base);text-rendering:optimizelegibility}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.container--fluid{max-width:inherit}.row{display:flex;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.list_eTzJ article:last-child,.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none,.tabItem_LNqP{margin-top:0!important}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.menuExternalLink_NmtK,.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;flex:1 0;margin-left:0;max-width:var(--ifm-col-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:8.33333%}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:16.66667%}.col--offset-2{margin-left:16.66667%}.col--3{--ifm-col-width:25%}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:33.33333%}.col--offset-4{margin-left:33.33333%}.col--5{--ifm-col-width:41.66667%}.col--offset-5{margin-left:41.66667%}.col--6{--ifm-col-width:50%}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:58.33333%}.col--offset-7{margin-left:58.33333%}.col--8{--ifm-col-width:66.66667%}.col--offset-8{margin-left:66.66667%}.col--9{--ifm-col-width:75%}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:83.33333%}.col--offset-10{margin-left:83.33333%}.col--11{--ifm-col-width:91.66667%}.col--offset-11{margin-left:91.66667%}.col--12{--ifm-col-width:100%}.col--offset-12{margin-left:100%}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid #0000001a;border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre code{background-color:initial;border:none;font-size:100%;line-height:inherit;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size)}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}.container_lyt7,.container_lyt7>svg,img{max-width:100%}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before{content:"";display:table}.markdown:after{clear:both}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>p,.markdown>pre,.markdown>ul,.tabList__CuJ{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table{border-collapse:collapse;margin-bottom:var(--ifm-spacing-vertical);display:table!important}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-left:var(--ifm-blockquote-border-left-width) solid var(--ifm-blockquote-border-color);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{background-color:var(--ifm-hr-background-color);border:0;height:var(--ifm-hr-height);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary,.wordWrapButtonEnabled_EoeP .wordWrapButtonIcon_Bwma{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.admonitionHeading_tbUL,.alert__heading,.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.clean-list{padding-left:0}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:#3578e526;--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:#ebedf026;--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:#00a40026;--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:#54c7ec26;--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:#ffba0026;--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:#fa383e26;--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert__heading{align-items:center;display:flex;font:700 var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.5rem}.alert__icon{display:inline-flex;margin-right:.4em}.alert__icon svg{fill:var(--ifm-alert-foreground-color);stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0;opacity:.75}.alert .close:focus,.alert .close:hover{opacity:1}.alert a{text-decoration-color:var(--ifm-alert-border-color)}.alert a:hover{text-decoration-thickness:2px}.avatar{column-gap:var(--ifm-avatar-intro-margin);display:flex}.avatar__photo{border-radius:50%;display:block;height:var(--ifm-avatar-photo-size);overflow:hidden;width:var(--ifm-avatar-photo-size)}.card--full-height,.navbar__logo img,body,html{height:100%}.avatar__photo--sm{--ifm-avatar-photo-size:2rem}.avatar__photo--lg{--ifm-avatar-photo-size:4rem}.avatar__photo--xl{--ifm-avatar-photo-size:6rem}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after,.searchBarContainer_NW3z.searchIndexLoading_EJ1f .searchBarLoadingRing_YnHq{display:inline-block}.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 var(--ifm-breadcrumb-spacing);opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active);color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs__link:any-link:hover,.breadcrumbs__link:link:hover,.breadcrumbs__link:visited:hover,area[href].breadcrumbs__link:hover{background:var(--ifm-breadcrumb-item-background-active);text-decoration:none}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width) solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;transition-duration:var(--ifm-button-transition-duration);transition-property:color,background,border-color;-webkit-user-select:none;user-select:none;white-space:nowrap}.button,.button:hover{color:var(--ifm-button-color)}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:#0000;color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}:where(.button--primary){--ifm-button-background-color:var(--ifm-color-primary);--ifm-button-border-color:var(--ifm-color-primary)}:where(.button--primary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-background-color:var(--ifm-color-primary-darker);--ifm-button-border-color:var(--ifm-color-primary-darker)}:where(.button--secondary){--ifm-button-background-color:var(--ifm-color-secondary);--ifm-button-border-color:var(--ifm-color-secondary)}:where(.button--secondary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-background-color:var(--ifm-color-secondary-darker);--ifm-button-border-color:var(--ifm-color-secondary-darker)}:where(.button--success){--ifm-button-background-color:var(--ifm-color-success);--ifm-button-border-color:var(--ifm-color-success)}:where(.button--success):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-background-color:var(--ifm-color-success-darker);--ifm-button-border-color:var(--ifm-color-success-darker)}:where(.button--info){--ifm-button-background-color:var(--ifm-color-info);--ifm-button-border-color:var(--ifm-color-info)}:where(.button--info):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-background-color:var(--ifm-color-info-darker);--ifm-button-border-color:var(--ifm-color-info-darker)}:where(.button--warning){--ifm-button-background-color:var(--ifm-color-warning);--ifm-button-border-color:var(--ifm-color-warning)}:where(.button--warning):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-background-color:var(--ifm-color-warning-darker);--ifm-button-border-color:var(--ifm-color-warning-darker)}:where(.button--danger){--ifm-button-background-color:var(--ifm-color-danger);--ifm-button-border-color:var(--ifm-color-danger)}:where(.button--danger):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-background-color:var(--ifm-color-danger-darker);--ifm-button-border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex;gap:var(--ifm-button-group-spacing)}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group--block{display:flex;justify-content:stretch}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);display:flex;flex-direction:column;overflow:hidden}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);text-decoration:none}.content_knG7 a,.hitFooter_E9YW a,.suggestion_fB_2.cursor_eG29 mark{text-decoration:underline}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.close:hover{opacity:.7}.close:focus,.theme-code-block-highlighted-line .codeLineNumber_Tfdd:before{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;pointer-events:all;transform:translateY(-1px);visibility:visible}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);left:0;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;pointer-events:none;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem;white-space:nowrap}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color);text-decoration:none}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor #0000;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white)}.card_N5DL,.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:var(--ifm-footer-logo-max-width)}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.menu,.navbar__link{font-weight:var(--ifm-font-weight-semibold)}.docItemContainer_Djhp article>:first-child,.docItemContainer_Djhp header+*,.footer__item{margin-top:0}.admonitionContent_S0QG>:last-child,.cardContainer_fWXF :last-child,.collapsibleContent_i85q>:last-child,.footer__items,.searchResultItem_U687>h2,.tabItem_Ymn6>:last-child{margin-bottom:0}.codeBlockStandalone_MEMb,[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title,.title_f1Hy{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{margin:0;padding-left:0}.menu__caret,.menu__link{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__list .menu__list{flex:0 0 100%;margin-top:.25rem;padding-left:var(--ifm-menu-link-padding-horizontal)}.menu__list-item:not(:first-child){margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.details_lb9f[data-collapsed=false].isBrowser_bmU9>summary:before,.details_lb9f[open]:not(.isBrowser_bmU9)>summary:before,.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__list-item-collapsible{display:flex;flex-wrap:wrap;position:relative}.menu__caret:hover,.menu__link:hover,.menu__list-item-collapsible--active,.menu__list-item-collapsible:hover{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link--active,.menu__list-item-collapsible .menu__link:hover{background:none!important}.menu__caret,.menu__link{align-items:center;display:flex}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color);text-decoration:none}.menu__caret:before,.menu__link--sublist-caret:after{content:"";height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;filter:var(--ifm-menu-link-sublist-icon-filter)}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;margin-left:auto;min-width:1.25rem}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;position:fixed;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;left:0;top:0;visibility:hidden}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.announcementBarContent_xLdY,.navbar__title{flex:1 1 auto}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;height:2rem;margin-right:.5rem}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.modalH2_DhYb,.navbar__items--center .navbar__brand{margin:0}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__items--right>:last-child{padding-right:0}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}#nprogress,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:#ffffff1a;--ifm-navbar-search-input-placeholder-color:#ffffff80;color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-menu-color-background-active:#ffffff0d;--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:.9rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);transform:translate3d(-100%,0,0);transition-property:opacity,visibility,transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar__items{transform:translateZ(0)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar__backdrop{background-color:#0009;right:0;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;text-align:left;top:-.5rem;width:calc(100% + 1rem)}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination{column-gap:var(--ifm-pagination-page-spacing);display:flex;font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);display:inline-block;padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.button_MlC2,.button_gV6k,.link_nBo6,.link_wr7g,.pagination__link:hover,.sidebarItemLink_mo7H:hover{text-decoration:none}.pagination-nav{grid-gap:var(--ifm-spacing-horizontal);display:grid;gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);display:block;height:100%;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover);text-decoration:none}.pagination-nav__link--next{grid-column:2/3;text-align:right}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"« "}.pagination-nav__link--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills__item,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs,:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.pills__item--active{color:var(--ifm-pills-color-active)}.pills__item--active,.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto}.tabs__item{border-bottom:3px solid #0000;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:#ffffff0d;--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:#ffffff1a;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:#ffffff12;--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec}#nprogress .bar{background:var(--docusaurus-progress-bar-color);height:2px;left:0;position:fixed;top:0;width:100%;z-index:1031}#nprogress .peg{box-shadow:0 0 10px var(--docusaurus-progress-bar-color),0 0 5px var(--docusaurus-progress-bar-color);height:100%;opacity:1;position:absolute;right:0;transform:rotate(3deg) translateY(-4px);width:100px}[data-theme=dark]{--ifm-color-primary:#0f5fe1;--ifm-color-primary-dark:##0e56cb;--ifm-color-primary-darker:##0c4cb4;--ifm-color-primary-darkest:##0b439e;--ifm-color-primary-light:##276fe4;--ifm-color-primary-lighter:##3f7fe7;--ifm-color-primary-lightest:##578fea;--docusaurus-highlighted-code-line-bg:#0000004d}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}#__docusaurus-base-url-issue-banner-container,.docSidebarContainer_b6E3,.hideAction_vcyE>svg,.sidebarLogo_isFc,.themedImage_ToTc,[data-theme=dark] .lightToggleIcon_pyhR,[data-theme=light] .darkToggleIcon_wfgR,html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j{display:none}.skipToContent_fXgn{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem;z-index:calc(var(--ifm-z-index-fixed) + 1)}.skipToContent_fXgn:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.closeButton_CVFx{line-height:0;padding:0}.content_knG7{font-size:85%;padding:5px 0;text-align:center}.content_knG7 a{color:inherit}.announcementBar_mb4j{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{align-self:stretch;flex:0 0 30px}.toggle_vylO{height:2rem;width:2rem}.toggleButton_gllP{align-items:center;border-radius:50%;display:flex;height:100%;justify-content:center;transition:background var(--ifm-transition-fast);width:100%}.toggleButton_gllP:hover{background:var(--ifm-color-emphasis-200)}.toggleButtonDisabled_aARS{cursor:not-allowed}.darkNavbarColorModeToggle_X3D1:hover{background:var(--ifm-color-gray-800)}[data-theme=dark] .themedImage--dark_i4oU,[data-theme=light] .themedImage--light_HNdA,html:not([data-theme]) .themedComponent--light_NU7w{display:initial}.iconExternalLink_nPIU{margin-left:.3rem}.iconLanguage_nlXk{margin-right:5px;vertical-align:text-bottom}.searchBar_RVTs .dropdownMenu_qbY6{background:var(--search-local-modal-background,#f5f6f7);border-radius:6px;box-shadow:var(--search-local-modal-shadow,inset 1px 1px 0 0 #ffffff80,0 3px 8px 0 #555a64);left:auto!important;margin-top:8px;padding:var(--search-local-spacing,12px);position:relative;right:0!important;width:var(--search-local-modal-width,560px)}html[data-theme=dark] .searchBar_RVTs .dropdownMenu_qbY6{background:var(--search-local-modal-background,var(--ifm-background-color));box-shadow:var(--search-local-modal-shadow,inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309)}.searchBar_RVTs .dropdownMenu_qbY6 .suggestion_fB_2{align-items:center;background:var(--search-local-hit-background,#fff);border-radius:4px;box-shadow:var(--search-local-hit-shadow,0 1px 3px 0 #d4d9e1);color:var(--search-local-hit-color,#444950);cursor:pointer;display:flex;flex-direction:row;height:var(--search-local-hit-height,56px);padding:0 var(--search-local-spacing,12px);width:100%}.hitTree_kk6K,.noResults_l6Q3{align-items:center;display:flex}html[data-theme=dark] .dropdownMenu_qbY6 .suggestion_fB_2{background:var(--search-local-hit-background,var(--ifm-color-emphasis-100));box-shadow:var(--search-local-hit-shadow,none);color:var(--search-local-hit-color,var(--ifm-font-color-base))}.searchBar_RVTs .dropdownMenu_qbY6 .suggestion_fB_2:not(:last-child){margin-bottom:4px}.searchBar_RVTs .dropdownMenu_qbY6 .suggestion_fB_2.cursor_eG29{background-color:var(--search-local-highlight-color,var(--ifm-color-primary))}.hitFooter_E9YW a,.hitIcon_a7Zy,.hitPath_ieM4,.hitTree_kk6K,.noResultsIcon_EBY5{color:var(--search-local-muted-color,#969faf)}html[data-theme=dark] .hitIcon_a7Zy,html[data-theme=dark] .hitPath_ieM4,html[data-theme=dark] .hitTree_kk6K,html[data-theme=dark] .noResultsIcon_EBY5{color:var(--search-local-muted-color,var(--ifm-color-secondary-darkest))}.hitTree_kk6K>svg{height:var(--search-local-hit-height,56px);opacity:.5;width:24px}.hitIcon_a7Zy,.hitTree_kk6K>svg{stroke-width:var(--search-local-icon-stroke-width,1.4)}.hitAction_NqkB,.hitIcon_a7Zy{height:20px;width:20px}.hitWrapper_sAK8{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;margin:0 8px;overflow-x:hidden;width:80%}.hitWrapper_sAK8 mark{background:none;color:var(--search-local-highlight-color,var(--ifm-color-primary))}.hitTitle_vyVt{font-size:.9em}.hitPath_ieM4{font-size:.75em}.hitPath_ieM4,.hitTitle_vyVt{overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}.noResults_l6Q3{flex-direction:column;justify-content:center;padding:var(--search-local-spacing,12px) 0}.noResultsIcon_EBY5{margin-bottom:var(--search-local-spacing,12px)}.hitFooter_E9YW{font-size:.85em;margin-top:var(--search-local-spacing,12px);text-align:center}.cursor_eG29 .hideAction_vcyE>svg,.tocCollapsibleContent_vkbj a{display:block}.suggestion_fB_2.cursor_eG29,.suggestion_fB_2.cursor_eG29 .hitIcon_a7Zy,.suggestion_fB_2.cursor_eG29 .hitPath_ieM4,.suggestion_fB_2.cursor_eG29 .hitTree_kk6K,.suggestion_fB_2.cursor_eG29 mark{color:var(--search-local-hit-active-color,var(--ifm-color-white))!important}.searchBarContainer_NW3z{margin-left:16px}.searchBarContainer_NW3z .searchBarLoadingRing_YnHq{display:none;left:10px;position:absolute;top:6px}.searchBarContainer_NW3z .searchClearButton_qk4g{background:none;border:none;line-height:1rem;padding:0;position:absolute;right:.8rem;top:50%;transform:translateY(-50%)}.navbar__search{position:relative}.searchIndexLoading_EJ1f .navbar__search-input{background-image:none}.searchHintContainer_Pkmr{align-items:center;display:flex;gap:4px;height:100%;justify-content:center;pointer-events:none;position:absolute;right:10px;top:0}.searchHint_iIMx{background-color:var(--ifm-navbar-search-input-background-color);border:1px solid var(--ifm-color-emphasis-500);box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-500);color:var(--ifm-navbar-search-input-placeholder-color)}.loadingRing_RJI3{display:inline-block;height:20px;opacity:var(--search-local-loading-icon-opacity,.5);position:relative;width:20px}.loadingRing_RJI3 div{animation:1.2s cubic-bezier(.5,0,.5,1) infinite a;border:2px solid var(--search-load-loading-icon-color,var(--ifm-navbar-search-input-color));border-color:var(--search-load-loading-icon-color,var(--ifm-navbar-search-input-color)) #0000 #0000 #0000;border-radius:50%;display:block;height:16px;margin:2px;position:absolute;width:16px}.loadingRing_RJI3 div:first-child{animation-delay:-.45s}.loadingRing_RJI3 div:nth-child(2){animation-delay:-.3s}.loadingRing_RJI3 div:nth-child(3){animation-delay:-.15s}@keyframes a{0%{transform:rotate(0)}to{transform:rotate(1turn)}}.navbarHideable_m1mJ{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_jGov{transform:translate3d(0,calc(-100% - 2px),0)}.errorBoundaryError_a6uf{color:red;white-space:pre-wrap}.footerLogoLink_BH7S{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.footerLogoLink_BH7S:hover,.hash-link:focus,:hover>.hash-link{opacity:1}.mainWrapper_z2l0{display:flex;flex:1 0 auto;flex-direction:column}.docusaurus-mt-lg{margin-top:3rem}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.sidebar_re4s{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem);overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 2rem)}.sidebarItemTitle_pO2u{font-size:var(--ifm-h3-font-size);font-weight:var(--ifm-font-weight-bold)}.container_mt6G,.sidebarItemList_Yudw{font-size:.9rem}.sidebarItem__DBe{margin-top:.7rem}.sidebarItemLink_mo7H{color:var(--ifm-font-color-base);display:block}.sidebarItemLinkActive_I1ZP{color:var(--ifm-color-primary)!important}.cardContainer_fWXF{--ifm-link-color:var(--ifm-color-emphasis-800);--ifm-link-hover-color:var(--ifm-color-emphasis-700);--ifm-link-hover-decoration:none;border:1px solid var(--ifm-color-emphasis-200);box-shadow:0 1.5px 3px 0 #00000026;transition:all var(--ifm-transition-fast) ease;transition-property:border,box-shadow}.cardContainer_fWXF:hover{border-color:var(--ifm-color-primary);box-shadow:0 3px 6px 0 #0003}.cardTitle_rnsV{font-size:1.2rem}.cardDescription_PWke{font-size:.8rem}.searchQueryInput_CFBF{background:var(--ifm-background-color);border:var(--ifm-global-border-width) solid var(--ifm-color-content-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-font-color-base);font-size:var(--ifm-font-size-base);margin-bottom:1rem;padding:.5rem;width:100%}.searchResultItem_U687{border-bottom:1px solid #dfe3e8;padding:1rem 0}.searchResultItemPath_uIbk{color:var(--ifm-color-content-secondary);font-size:.8rem;margin:.5rem 0 0}.searchResultItemSummary_oZHr{font-style:italic;margin:.5rem 0 0}.backToTopButton_sjWU{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.backToTopButton_sjWU:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow_xfvO{opacity:1;transform:scale(1);visibility:visible}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}.collapseSidebarButton_PEFL{display:none;margin:0}.docMainContainer_gTbr,.docPage__5DB{display:flex;width:100%}.docPage__5DB{flex:1 0}.docsWrapper_BCFX{display:flex;flex:1 0 auto}.heroBanner_qdFl{overflow:hidden;padding:4rem 0;position:relative;text-align:center}.buttons_AeoN{align-items:center;display:flex;justify-content:center}.gradient_lQw6{background:linear-gradient(180deg,#0061ff,#50c3a500 50%,#50c3a5);border-radius:16px;margin:16px;padding:16px}#marg_HODB{margin-bottom:1rem;margin-top:1rem}.button_MlC2,.button_gV6k{background-color:#50c3a5;border:none;border-radius:8px;color:#fff;cursor:pointer;display:inline-block;font-size:16px;font-weight:600;padding:15px 32px;text-align:center}.button_MlC2:hover,.button_gV6k:hover{background-color:#0f5fe1}.authorCol_Hf19{flex-grow:1!important;max-width:inherit!important}.imageOnlyAuthorRow_pa_O{display:flex;flex-flow:row wrap}.imageOnlyAuthorCol_G86a{margin-left:.3rem;margin-right:.3rem}.modal__zVM{align-items:center;background-color:#00000080;bottom:0;display:flex;justify-content:center;left:0;overflow-y:scroll;position:fixed;right:0;top:0;z-index:1000}.modalContent_zbmJ{background-color:#fff;max-height:100%;max-width:100%;width:500px}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.modalTitle_u975{border-bottom:2px solid #eee;padding:32px}.modalDescription_H8cB{padding:32px}.buttonBox_NbRn{text-align:left}.codeBlockContainer_Ckt0{border-radius:var(--ifm-code-border-radius);box-shadow:var(--ifm-global-shadow-lw);margin-bottom:var(--ifm-leading)}.codeBlockContent_biex{border-radius:inherit;direction:ltr;position:relative}.codeBlockTitle_Ktv7{border-bottom:1px solid var(--ifm-color-emphasis-300);border-top-left-radius:inherit;border-top-right-radius:inherit;font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlock_bY9V{--ifm-pre-background:var(--prism-background-color);margin:0;padding:0}.codeBlockTitle_Ktv7+.codeBlockContent_biex .codeBlock_bY9V{border-top-left-radius:0;border-top-right-radius:0}.codeBlockLines_e6Vv{float:left;font:inherit;min-width:100%;padding:var(--ifm-pre-padding)}.codeBlockLinesWithNumbering_o6Pm{display:table;padding:var(--ifm-pre-padding) 0}.buttonGroup__atx{column-gap:.2rem;display:flex;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2)}.buttonGroup__atx button{align-items:center;border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);display:flex;line-height:0;opacity:0;padding:.4rem;transition:opacity var(--ifm-transition-fast) ease-in-out}.buttonGroup__atx button:focus-visible,.buttonGroup__atx button:hover{opacity:1!important}.theme-code-block:hover .buttonGroup__atx button{opacity:.4}:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.codeLine_lJS_{counter-increment:a;display:table-row}.codeLineNumber_Tfdd{background:var(--ifm-pre-background);display:table-cell;left:0;overflow-wrap:normal;padding:0 var(--ifm-pre-padding);position:sticky;text-align:right;width:1%}.codeLineNumber_Tfdd:before{content:counter(a);opacity:.4}.codeLineContent_feaV{padding-right:var(--ifm-pre-padding)}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}.theme-code-block:hover .copyButtonCopied_obH4{opacity:1!important}.copyButtonIcons_eSgA{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_y97N,.copyButtonSuccessIcon_LjdS{fill:currentColor;height:inherit;left:0;opacity:inherit;position:absolute;top:0;transition:all var(--ifm-transition-fast) ease;width:inherit}.copyButtonSuccessIcon_LjdS{color:#00d600;left:50%;opacity:0;top:50%;transform:translate(-50%,-50%) scale(.33)}.copyButtonCopied_obH4 .copyButtonIcon_y97N{opacity:0;transform:scale(.33)}.copyButtonCopied_obH4 .copyButtonSuccessIcon_LjdS{opacity:1;transform:translate(-50%,-50%) scale(1);transition-delay:75ms}.tag_zVej{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_zVej:hover{--docusaurus-tag-list-border:var(--ifm-link-color);text-decoration:none}.tagRegular_sFm0{border-radius:var(--ifm-global-radius);font-size:90%;padding:.2rem .5rem .3rem}.tagWithCount_h2kH{align-items:center;border-left:0;display:flex;padding:0 .5rem 0 1rem;position:relative}.tagWithCount_h2kH:after,.tagWithCount_h2kH:before{border:1px solid var(--docusaurus-tag-list-border);content:"";position:absolute;top:50%;transition:inherit}.tagWithCount_h2kH:before{border-bottom:0;border-right:0;height:1.18rem;right:100%;transform:translate(50%,-50%) rotate(-45deg);width:1.18rem}.tagWithCount_h2kH:after{border-radius:50%;height:.5rem;left:0;transform:translateY(-50%);width:.5rem}.tagWithCount_h2kH span{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.7rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.tag_Nnez{display:inline-block;margin:.5rem .5rem 0 1rem}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.tags_jXut{display:inline}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.lastUpdated_vwxv{font-size:smaller;font-style:italic;margin-top:.2rem}.tocCollapsibleButton_TO0P{align-items:center;display:flex;font-size:inherit;justify-content:space-between;padding:.4rem .8rem;width:100%}.tocCollapsibleButton_TO0P:after{background:var(--ifm-menu-link-sublist-icon) 50% 50%/2rem 2rem no-repeat;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast);width:1.25rem}.tocCollapsibleButtonExpanded_MG3E:after,.tocCollapsibleExpanded_sAul{transform:none}.tocCollapsible_ETCw{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.tocCollapsibleContent_vkbj>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);font-size:15px;padding:.2rem 0}.tocCollapsibleContent_vkbj ul li{margin:.4rem .8rem}.details_lb9f{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;padding-left:1rem;position:relative}.details_lb9f>summary::-webkit-details-marker{display:none}.details_lb9f>summary:before{border-color:#0000 #0000 #0000 var(--docusaurus-details-decoration-color);border-style:solid;border-width:var(--docusaurus-details-summary-arrow-size);content:"";left:0;position:absolute;top:.45rem;transform:rotate(0);transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transition:var(--docusaurus-details-transition)}.collapsibleContent_i85q{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}.details_b_Ee{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast) ease;border:1px solid var(--ifm-alert-border-color);margin:0 0 var(--ifm-spacing-vertical)}.anchorWithStickyNavbar_LWe7{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorWithHideOnScrollNavbar_WYt5{scroll-margin-top:.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast);-webkit-user-select:none;user-select:none}.hash-link:before{content:"#"}.img_ev3q{height:auto}.admonition_LlT9{margin-bottom:1em}.admonitionHeading_tbUL{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.3rem}.admonitionHeading_tbUL code{text-transform:none}.admonitionIcon_kALy{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_kALy svg{fill:var(--ifm-alert-foreground-color);display:inline-block;height:1.6em;width:1.6em}.blogPostFooterDetailsFull_mRVl{flex-direction:column}.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem);overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.breadcrumbHomeIcon_YNFT{height:1.1rem;position:relative;top:1px;vertical-align:top;width:1.1rem}.breadcrumbsContainer_Z_bl{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:.8rem}.title_kItE{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-leading)*1.25)}@media only screen and (min-width:996px){.card_N5DL{height:100%}}@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_m80_{background-color:var(--docusaurus-collapse-button-bg)}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}.searchBox_ZlJk{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.collapseSidebarButton_PEFL{border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px;position:sticky}.collapseSidebarButtonIcon_kv0_{margin-top:4px;transform:rotate(180deg)}.expandButtonIcon_BlDH,[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:focus,.collapseSidebarButton_PEFL:hover,.expandButton_m80_:focus,.expandButton_m80_:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}.menuHtmlItem_M9Kj{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_SIkG{flex-grow:1;padding:.5rem}@supports (scrollbar-gutter:stable){.menu_SIkG{padding:.5rem 0 .5rem .5rem;scrollbar-gutter:stable}}.menuWithAnnouncementBar_GW3s{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_njMd{display:flex;flex-direction:column;height:100%;padding-top:var(--ifm-navbar-height);width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar_wUlq{padding-top:0}.sidebarHidden_VK0M{opacity:0;visibility:hidden}.sidebarLogo_isFc{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);text-decoration:none!important}.sidebarLogo_isFc img{height:2rem;margin-right:.5rem}.expandButton_m80_{align-items:center;display:flex;height:100%;justify-content:center;position:absolute;right:0;top:0;transition:background-color var(--ifm-transition-fast) ease;width:100%}[dir=rtl] .expandButtonIcon_BlDH{transform:rotate(180deg)}.docSidebarContainer_b6E3{border-right:1px solid var(--ifm-toc-border-color);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_b3ry{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.sidebarViewport_Xe31{height:100%;max-height:100vh;position:sticky;top:0}.docMainContainer_gTbr{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_Uz_u{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_czyv{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}.lastUpdated_vwxv{text-align:right}.tocMobile_ITEo{display:none}.docItemCol_VOVn,.generatedIndexPage_vN6x{max-width:75%!important}.list_eTzJ article:nth-last-child(-n+2){margin-bottom:0!important}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.colorModeToggle_DEke,.footer__link-separator,.navbar__item,.sidebar_re4s,.tableOfContents_bqdL{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.searchBox_ZlJk{position:absolute;right:var(--ifm-navbar-padding-horizontal)}.docItemContainer_F8PC{padding:0 .3rem}}@media not (max-width:996px){.searchBar_RVTs.searchBarLeft_MXDe .dropdownMenu_qbY6{left:0!important;right:auto!important}}@media screen and (max-width:996px){.heroBanner_qdFl{padding:2rem}}@media only screen and (max-width:600px){.modalContent_zbmJ{height:100%}}@media (max-width:576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}.navbar__search-input:not(:focus){width:2rem}.searchBar_RVTs .dropdownMenu_qbY6{max-width:calc(100vw - var(--ifm-navbar-padding-horizontal)*2);width:var(--search-local-modal-width-sm,340px)}.searchBarContainer_NW3z:not(.focused_OWtg) .searchClearButton_qk4g,.searchHintContainer_Pkmr{display:none}.title_f1Hy{font-size:2rem}}@media (hover:hover){.backToTopButton_sjWU:hover{background-color:var(--ifm-color-emphasis-300)}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media (prefers-reduced-motion:reduce){:root{--ifm-transition-fast:0ms;--ifm-transition-slow:0ms}}@media print{.announcementBar_mb4j,.footer,.menu,.navbar,.pagination-nav,.table-of-contents,.tocMobile_ITEo{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_e6Vv{white-space:pre-wrap}} \ No newline at end of file diff --git a/assets/files/clouds-public-e9ba939dfde1c0efe3a32ec6f5d1f612.yaml b/assets/files/clouds-public-e9ba939dfde1c0efe3a32ec6f5d1f612.yaml new file mode 100644 index 0000000000..01f7a2db4d --- /dev/null +++ b/assets/files/clouds-public-e9ba939dfde1c0efe3a32ec6f5d1f612.yaml @@ -0,0 +1,38 @@ +--- +public-clouds: + betacloud: + auth: + auth_url: https://api-1.betacloud.de:5000 + interface: 'public' + regions: + - name: betacloud-1 + identity_api_version: 3 + image_format: raw + block_storage_api_version: 3 + pluscloudopen: + auth: + auth_url: https://prod1.api.pco.get-cloud.io:5000 + interface: 'public' + regions: + - name: prod1 + identity_api_version: 3 + image_format: raw + block_storage_api_version: 3 + gx-scs: + auth: + auth_url: https://api.gx-scs.sovereignit.cloud:5000 + interface: 'public' + regions: + - name: RegionOne + identity_api_version: 3 + image_format: raw + block_storage_api_version: 3 + wavestack: + auth: + auth_url: https://api.wavestack.de:5000 + interface: 'public' + regions: + - name: MUC5 + identity_api_version: 3 + image_format: raw + block_storage_api_version: 3 diff --git a/assets/files/clouds.yaml-9c0c983f9c293bc5adeae683d442174e.sample b/assets/files/clouds.yaml-9c0c983f9c293bc5adeae683d442174e.sample new file mode 100644 index 0000000000..9040467c63 --- /dev/null +++ b/assets/files/clouds.yaml-9c0c983f9c293bc5adeae683d442174e.sample @@ -0,0 +1,23 @@ +--- +clouds: + betacloud: + profile: betacloud + auth: + username: USERNAME + project_name: PROJECT + project_domain_name: DOMAIN + user_domain_name: DOMAIN + pluscloudopen: + profile: pluscloudopen + auth: + username: USERNAME + project_name: PROJECT + project_domain_name: DOMAIN + user_domain_name: DOMAIN + gx-scs: + profile: gx-scs + auth: + username: u500924-USERNAME + project_name: p500924-PROJECT + project_domain_name: d500924 + user_domain_name: d500924 diff --git a/assets/images/disk-layout-db64866af60ef6d2c41245db78dd15d1.png b/assets/images/disk-layout-db64866af60ef6d2c41245db78dd15d1.png new file mode 100644 index 0000000000000000000000000000000000000000..39ccd702637a06e88748850d53ffae8c9f10884c GIT binary patch literal 18731 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 IYP-e!3xY$ETL1t6 literal 0 HcmV?d00001 diff --git a/assets/images/flavors-2-d9a87ab2a63ed62ace4303facc069b8b.png b/assets/images/flavors-2-d9a87ab2a63ed62ace4303facc069b8b.png new file mode 100644 index 0000000000000000000000000000000000000000..9c6bc9780974ba5bcff1c1e4907d16d2419e0ac6 GIT binary patch literal 52116 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 Gg8mP`9)IZo literal 0 HcmV?d00001 diff --git a/assets/images/getting_started_openstack_anim-d88d134eff244cf8891c5ca1efcfc65a.gif b/assets/images/getting_started_openstack_anim-d88d134eff244cf8891c5ca1efcfc65a.gif new file mode 100644 index 0000000000000000000000000000000000000000..2ef81b7e50c4340f0a50a1b65ebc75114947d510 GIT binary patch literal 1054796 zcmeFZc|6tq_cr?3+cqZcBuR!%DwQP3JZx-ZXp<@9PNt+%Ns`#+AxV;X&P+lw58FH> zQ!-^rLYgE=GCZr>U3d5J{XW0n^F8PFoadb5uk7^d)vNclu6144T1!PuSzO{|KfOAJ zjQsw^v$jD?N%y#-JW)wlP>2czAM>oz+MKo)ymaO?!t)h_*$5vAeE;e1f6kA8pXi>w zN4|XdxVSjC|A2({apO;)-hKG+T21}<#KhQvgHofT&+mjq$SY_}O}%{gZaN_FrjW4g zJ^?XHYkM&XML{7c89BAw2M;beUe(Yt`1tXy`N`9sUVdlJUaG07e)Hy)h^YL_m!l!K z!#;j|BQ8led;~u~|6YNhB`T&s)HZUua^2$8nafTt*IYf~6B3=Ty1BV~Kgi1qym2cp zKmSSlR$jh1}6MG`Bl*LH($%u!!6h z=j%4M=Y@o2lvIdMd%E7fovNy?^zih}%*wua$yr@P&*hp&+mlvrAODVyCy7bP4Gr~u z{m;&wziei1qoSrGi&r~gbkg?p`6FTq-Q67p1qH#kLWhS3!|p~#L`GLuRSXUF8Jk+^ z=$f28=cuH7%-H1Ay?ZIul&Y52=Kg_a-A_9UA3b{gdg5M6>izrodwZXfEKVDoAe}sA zCn>EYC$E0+khGqG*?9-2y1JU-;eH?A!0G9iNy+zOV&lEM{RRel!y}?zjE^MWyH{CR zZfSK!>zJXksX{zZ)HgA+ zx^U6?l;s)wvzPSrO^*>zoVIhg?&jqm5R{shUQ$|mJM?aJOk7H8+RfnGgM+=Ttu0N> zO>J#0K{rDh8ykv?i}&vrH8r#5-+RRH#7Wodo;f+W%`Hu7>FK_HH-<+BLhsy-jY~*K zOp1z*`~G|a+oxHkkBjaMEWU38Z8YOuz>ioCtH)|`&f7ukW^Ju(AX~C<PS?)!KGPN`1)za z@ocjvWslzU<(+yQuUTI7?s>_jHzQBVi$9D~yf$!aRg`>u*?eced3#0ar>V|+M-#Lv z%Ray9e|ToJy|Vnvhq1aFYuv}GD!zW2ewuCGQC0cv%k0a?3CF6dR=zEMdNbNlUA?wO zrY2IzfhEio4`I#>9DNv(((SPwpFF0@$7p+!iv5Hw4+A}Cq{?QtL=PNtdOCT`8%ysm zPso{Vv54A_D~OOKIJ^q51*iX`5o zSMl58*eLX9Qc1VR4so)D>VclGlzW1fEH(FTap5Q!&hf4$bOzfP{IBrgY!lo?1F$>T zRplE|HXMeY8;jqrC3?i8ld|?@OAMCTWph@szsZr%QqN3{WXPoA$YK;m(@4;aW#<&` zPT8N^UdwPllZJEJ4<+51j7r-UiGNMC&$T6h%5qk_8I9_h&7cXEC3(co_n!Gsxj4CF zPh8t%O+AW*^f)9NoswspxQE#;L;W7ZTkQ=rbkVmH_lYO&RzS6N`=C+c$?`kVK7$VQ z)ZF%+8*m(KO|(|R4v(=Y|1mNeos=W|80qJrv~G2r7H$)Ms*&HoHZ^O7F!J%tcO2@- z32B$!xpMKT$f*hs#KkCp8rjCra{*DUPa500M*)}BvXpjzVbH$#os;7-SEMImNt>sz zNwm#@a0i85OY+*`=ZHnNZIkAuux&Hx{N&+wG^vqO^L>6R@0nQ&rR&O6Q0+WnsoW}PHfE6y|nB#nkPhjm#65eb1+8*!myFc(DVKl162yPo|y_K@hV(} zkAJ_QxOB*Vwf>8Vn|D`W=LT4ba}0Do-0{vGdNdA?{PnOG6RFYmxXyr=+&422TSvpy zudmD9ai7xA2P;-kBwjqLd33_vnLXH*&ED5%H;|F8blITK6e{L7(e=|J9=_BR`#ml( zG-Ay)OfIutsR72wZXEe2hQdHQhTm?2^~7n80pZnd6vraem?V1itRj3?fk?kVg8Io! zYxZLd9zux>ri+9vX|uanvO;|L=_vdPc>zqZ3Xb$wPcqs#fEUw2br>sa{&G+)Y7)B$Uy22FI z>@jiS*881!Dwo7Sj>^!m0+!|jn)Gc@7kx2P{OpeVyC>)~*TkR}{q8-don4j zOUNI$^&(}ABO|ja8e4}}KuW1jTq?cxB+pl@?FG{{XPyf?ksTAH-6#wi&F@R*?2SOt z5ap3qeEpYEBn&DCFYiSrZ{`tC;)oP)*tc+jhRM;p+d8}9pkVr~W3l5~-RWC|&as9) zmUuqcyVywEdV#Pp-x$SLTfBj1L}5GS6r({413Mj?Q&+?zgoSsFndflL7F#UU8}=_p zF@|2ubPhNJwlQi3Ns8ph92;4&{Tjmh6u z@l;t?bh|!!GD@D_nn*NRq@)W-8@zQ}e3lpdD90vFbhBN}V~jYSdfTA#7S%DlA{LL@ z&4SSKIjhjx)&?Jrd}F#l1HIe95_wCS@SHb7KM@>x^zIAB+~6yrFA z#!r20uITjRx7}zabPi#rv?0@un?iN#QT~aEq)pG;BHZejf*g3+k#W2s7Qtf189cUd z$ZzB>sn{6o;8VV7M*|KSBzYF$Zz7)cqtw^7r+k8>aPI;Yylsl2ZN(?)v;=XVN zN7L{2VGnk*q5D=0vR&K*El*8DLeN-Gw@&x9ZDa{yDwCosle;x)zg&5<+qunWbE`GqoQ#@)bKvrNInj% z$bAPtXF7(9R+lCW{C%DM{UiPJlW-;>bV_SYVhnj#!&RJ7WLgEG0MR4j!IAQY#FM%D zilP2?F?0b*{Q|fBkx1LKv=#xG&MXX`R9c;Z97(tnI862Ab=QlyN6t46tD?4(MAVp( zayo}F@u2=AJb~oECN|_M4%6y?BarQ8xA@H-!<)U%H~S-R4wl>;>c2U%cyo*`cw9Vq z!Z3K!Ie0oUc%~%yZGZ6l#o$@CTXW*K<_&KxINw@~yhVEmS?<5Jl5q>!9)gw#!R+0$ z>KsBH6~a&&!Z;8zaUo>2dFu^@Al#wbozo#~QMcJkZ*!Dx#(up;ub{g@Tbeol!WC9# z)&VTbz-@tnP{FUE$k*G;hN_`Xw?p;sEUXqzze6LUf zTbSg<@V%i2R9=RApd;*FOMglY)s_f%DUEO)h;Y&iXYCRo?T!fZSEtn`96ybv@jSG( zC9+;5)LAXkO(H7nL{#|pJ>-@>dZ!~}ilW|pii(Z8qj@@X=hv`1%6H?g-r3T{mzNlL zEFd~>;BMB{sKOI5MOR~HZ%6IR42%sBwGRlt&>|<-5|(^5^x^4npY73mL^?q2pJOh?^;me>)IgpdFX0 zW?o5um$4~!=)~Q$0X;F>=ogs@?I$)*tHtNjM~CcP3Z-L z?MVx#K8@tCbTs7$xs^N#-wO+qje%eKou@GU;;EU7CF{ zAyJVBvLdM^6F)}9?;X4+yL1n4$2waYJw1>#Vk55`6&mz9ZfjJ6hlJ$vseAI0sk%m~ z`q3}mMhsT!zc3zsz8=rlVcHp{ZKb4zIs?CF%Qw2MaRPA=)r z(djN_>8^w6ZcFK8_6$$S3~!?hUzZI3=#0R!jG(o_jNqk=5cbSa$;>dL%y5^?$mq=I zvdq}Q%=o3uME0y?$*dHktTdObjOeVavaFoJtlXunJofAY$?QU->>`)!lIZNRvh0e% z?5d?~3VTkiWKO+NPNPdsb97E?Sx(zvPWw_$C;R#uV9=7ui2AI`^%}VMp;rsbWXtVyA1x&N0O<<;AYgi`~8zlXsMON|ksUm-t>Q z@sBA9EH4RqUK0GRBxFZvs8nf~acTIq(#V+7=cW9wepgf^0M;sis$83-^wXFDr%)F>WwQJuT?b1RJ4{? zv^}qA|5nktqq1A7vd6fx_gZCtOyyvC<3t0u2iO~+Ktlvlld zUiJQ4)$ESyIjQP-AL45J#P` zbe)Jvov3S_cx;_yMV<6eo$PWQo}*qtx}IQCuk2c{8e6YkQLiynueDrH^5ZqPMp z(06SxjBPNgXfPRSFk5aQaWq;;H(HuBTDvyd#x~kjG};d}o?C8o;Apxi-Q;M}zn>6U)dWAdce^+|v1lfjB7LqktS zmYlhb;M%bm+p$#9u{_kVy4-X}78vdpT z@3oEVwX5v4AMQQ3((Az4cTuL#(X`L$dY^M#pG#$*>u{gjN*|fC-&3aF+qB>JdcS{M ze_&;Q&~Sh7N`DCFK&Z?>nCU?H^?}H^f#}MC*x`Zrm4QUg!DN}i6w|@9>w_6_gISe> zIm3gwD}#BQ&kJOp7n(jVy8gT*?s-||^NQi;RV&XaoI|xTL-nRZjn{{oqhd#?}o#|;lw4i60vkF2c>k8zHS%ZyBzj!a%3nT{KosT_GbJo0{J zWR`PuPG)r8badhR=wjUHQswCK@aXEwD8e;{mL0>GjnTM`(Z!E3RE;r?j4`c_VYyx~ z%f4VSd%^1Vf-U|9d({h$kr!O6FK}Gryt3nbX5+iv#`)vN_f?GxjEoDejtgYS>U$<%hwfO14s_CGS>EPAr5U$suvaiF;UWdEAj*NdD zUG+M4qM@ZWZ9V%vzauvnT+_Etg4xuk(u1pnLMsH1+s4n&E6Eby(x)*Q&#n+ zV&qNL>Kh8z+gjPT^=5Ay-QG6Gziq90+cxsHef4c8*Sl`ncRgnBdfndj$G;n_dN(xk zZe;b{7}xu8+4mD>?+`QVX5lF^2mqP z)ei{wELv_BV?ImcK1-J{%TPVbI6BL;HjCx{$Sn7f#rz|y`$x8fkL=YSIYvKnt$oCC z&+*F5@tM!4epp>eaWS ztMAuVXSvtr*iecBC zCMGN0(eXWzG87J$*t~aBbrFY+~AzJT^ey(Yy8}$zTw}u5)PvVtg^xqj3ogJ?7 z*Nva&`igh$cx<>9F|5rpKaw^`=N({g(YDbVjp$y3;HuwF=Uqu4~A;wCxF zA;M-AzI?)#V}wIWTMaDpmA09CA5z|KlajBz<9z)g70xRY`6}G*7-3Z&KfVIhowo?W zYP%vV3)J=`cnhoVO;0IM-~XUq_~?P+iGrgCt1*W)4mI&T)HvKhIIMZ3&+?(B*r@km zEs3d=hgwn}>JJ~2`7-hFnA{phgeXtDtB|O;wn<4uTWOnBp|%RQkBE-ip438}qX!#A zj%$j&Dm;Enj{1nMw#u$Yy2puzI9tVD587|AbBIBYorZ4Mz-2ue^F>VD3&W zYIxFbSCQeVTS}rQtRk$6PS_;)h#H+vPc1S!^PoZ0_-yg3BIEPb)M6$VnsybNTQrj6*|iT1V&>Psyec+#U!xW$dC=}IA$e_57C-5;&AQ~IAGfc# zMZli45{nxL8^urE6q_tLbxV#$!t%Dt?o!J;$CM?k?iyH^T1A-qN?1qPq?KC7oNtt{ ziMujcYLnnjBWauDx4X>t-YsRx)2R{GWv9~9rBym`c6w~`CSi7o%QNVAdTy&H(Htp}Ut@CW^y0>xq*D@CU=Hu}-a|Oa zpjV>6TGZ)t(EB8#mAE2%Z>O(V{Yj?FC5l`Noqlo{3#^YgftR(*Uxi@7e7A(KTeK_S zn70K>s<_fV{jNZRdJEP^B}#%$T{p}zr`Q_Am4(B*f@}z<*q@asixzd=JnwyqQU-64JiOWv)es>-6>w{Lk{^6ipPQ`hefji|TW zeWX-P%c=WL0>+A8NkUyGygMwNV6{)LR9(NQ`|bm8D*-Esqei{m;l=e_7 zt-{taqOWLA(k35U!Y)beK>eQNZ4I`{N6NH=oqFzZQ=e8pM~vp&mEQL@vyTc(>P`YiL9kDYF+ zq+XW(vn+!KJN-vxdbv)|vdyW_7&b`i7lc2{u~9l>^sG$3sOZ`K^FC)xUP&61^*+nJ z(s0J?bD2Ta!m|hN)b=E5DZ^UU-aJ1gdyB2*hK-`V`D?d)>@9amooLnXEr@8aw?0yS zqTQ+YVFLA8TO}!@?(p8ibfvR)dgVsFMZJ$6_?)%3k}@9b?JX*9ID77Lx$($CZ*evC zIR_splX2F*k|w2d7w?vvOp5lEcKDogOqDX7(eEqkYdGihsND3uQ(yTg^?Bz8DYLoo zzKSWO^DfWI%@&IKDnIy~cYP&gzSP@S^`+sw+vjrg)rG$5HEIVkwKNI6t)D`x?BKbz zfA!F!kVNd|-d+HH*vzDFufGF|Df`^}4&wqTCvuivA5AyBWvg0;B6;h^t@ zAS>xp?0x->VvQGqFISx6`qJMdM{_a6N7|Bi+d#95vf{?>*T&j;Gs8R)*} z>eSQ_i3-pmTu3MV7Q_#}foL5<_4RZeLUjnz*K>8q(ji8MtQdlENW~#hhb$c;bjZvh z!G@R}f^>+`As&Zp98z%zz#;C2lp9j z|IDr-xQ5gkGHOVqAx!r3zX5{)5Z%Kl0gM$uP7V_XFl7L90Wb@&p8rG64~aeG^N_kK}Ru2(9#PX2ILm!*RmV2DszYBdcB0GvlB?HKVZ_OJlxJTEhFh1XZaXcHI2GMy4sQg5b-o?qg=P0f zn1ws#so40P$(>x(0(}^aF_wh(3F2_{pxG{6qv*vg&BlX3Kg5eUAV_TD)x#;o%0p*# zPu@50WGzSQA-_I%qVnEXVY>RKU)?pd&U_Vqjb0q*K_kdghjJU5m8YSRaUgGy3L@6X zTiGY7Qqg6$q{Yze#gmygusBfDz1@!S;G{{)ui1oQ$*-ZIJ#hg~%|N11*pU8#$ryw! zFe5n#oku}=^LP4kS+Y&=r-bTA(ovZc@(6ckFRbl-lT+Ah_vU`dWY(M9iueUnMaBA) zA)7Em2%cV2#1R!o%aa{~F1?APMU2P}#0}I$GSP+Js-{L>Xu`q1V8aFDAx59^L|^$4 z&;7ZZ1K9XbIZr;@eb3diKU6I*y!lXFv|2{oi7~kla_~HYC!pAM9Xu5t^AP7g+HXxf5_o5hR;x6F1 z4`kbf&|)}VP==T~iJzaHIRED21yzoK&W{I)y;CyYk7OH5)u(1vBu`WU)Y-1pisTOOU6zh|i zHr5jMgxjImL%g{36Mei?ZwKlZn$m`nsdln>dLyseWV<)uEH5r?^+D1@fCbdQJ)-p;{RyM&-IYs(La@xlBaw-uTI^E_c1ABVI zCMLy>s2F+pOKTbWb#!&4eUWuCh|$zJEUP9)&{7wXJ*Dpw{bAMtubOq^iA`i&!j~_} zD=RB!&k6{L3m%qL!W#-6ls+OtNc#3I!INUDed%&uVdUF)4@3Je<>Xt;1b()&lh-pR z7@bluAekS(tgmsV`0kL9xZ+`Hl}v2|`^40CGm`iztz+k$E}y#f=~KMbohXBAo=Zzf z!Ow>kWOPZoS8{^dE2Ca&9+5kK`TE@H)72+T&fUuhxR|DDaprVPqMKc`hOL9`O6clp z3hBmeX$eh_`libd9@fRZPV;Y$`8cP2;cDpB{C76C_3>{64oU0kYe}i=p0d2%TA`w3hJjq!XMn~zH?MtUgo&uK?&%0pvQrp3;G4< zETBE{^$Ua!0=g<_>z+RCgyteUC#Si&slB}o-rxUozW!-=j+RO_mVYx0&#}_m4rOfq z4~FM@Q&hY5ss!u&`{B9rkZ@ieu1u|YaZiJ&7z43x&VL-9v%0fYMo?auNJjkbhtQQx zODK5IW53YM3hcUdqivfW+ia)94XQ8?DYL&1&&jP4P`>^s4pDd6Sqg$fq}^%qw(W%kUIvs_@JYFF*{9|MctL>Nv-R_Jr zPe#${L~1H&EVDPW{uNWF=NDAW`l>4w(P>{A&XsjS}K!HJQXqIivsO-5wa&<(Q&gE`cefh zBveC^eizbvwOgLinIvv?m*3t%kxIa^D+#Y^twP{>vsXc$1tG}SB&gVLqoI~!$!khr z?~L+id7xBmv{RU|hL@hhInR@659z`N#K$2IO=TM*L}cIy+n0qGaloVLB3M(DQ943v z^D4WMiP{Ekkx9{s+=_*nHxDQ@``_l(v!2Nzo~YRD@2o1>rNB%z->IDG$Pw^n-v++5*zLp_Jm5{nGzVsy!N0?V%`-Eqbapz5)(+gub$N&dDPY(9z_%n zk{3W189TWhVfQB=MG5=kYH8W^i3ro4R&BDYfFOy&V6#l7-errBe7I~)y6ZQ&qw?_d zHf^FYk#X- z|F{{Ns7l9q7bE zy9JRhx*E1<(VE(Un}*}H%qN2K@2RkmJZ+e-n)q*}iS=y2A>zDPYzP}dFJI8L8~Y?5 z$@4^|Gw=~mP9lX291nza@AXuCdH?MLh4$d`Z2h+LLyQ`H9fW=7v7w#LTT55)zPCi^ zQJ5X%4fq389C`8_x`ppP*Y;}jkoQp46IZDFY!Xn2Gb7?*v+=F*9whkMf?ZAO-sLEp zuXV8mkwg@4tm+of(};{H8pDRr;rLOABZbV(Hs(o(k89JnAy>yzki9tn#<0#14GIcd zb~yT@ese8r*{qLHP!gk!YMmcOep}X9{U_3$?F@&`F;kUzq1Svf$XW>Q==RwfM7D;O z@#cray)V3wSRt|!qU}!*u^0#$i`w<}hIv$GEJpezQvdnjf3YaN|T2 z`yz!-ver}IkV1P{Jf!DI8zP2KXcfgngzSTO!WTXH7;o27dS-8j1f}rpQEO2*nhU+V z8P7_WROeyOe|Y#r9U@8*=Vv5S2b~$mXJNfiL5+u#hmawfSq$QQ63GzSwXgUoLAz?x zS*|(D8;mDBcrbW+YZmf2Ya{z0{b6K_tru2Hr2LSReK38q1D6#r!e8cx674yPn!6^? zF-f69NMzb`oeH~X9Cmdu&LhKniaZO`_d~r#81f+&GNZaU zW}IUTF}H6+ZN_a9!datf$97%ZCZ&xm5Ivq*GR0gLsG(!*#4xAetX)%38}mpAwi8c{ zB%Y9vR}B$0vFEwL(ky7r(vdy;DaTeb+o-R#x2Wuy$|~lz*28X<(> zTw|;>_6C*PDT?%b&YiKKGC%3TSvmLUfxD0SCK@6=UH=C+K_O4NAd=@(Bne5}c%N~Q z)kCIPmvQTcta}(@Bf;cO@E`_33uO2m9U&jbZEHJl{2_y?{Kd<-KLPPzLiqR7n@AC{P$K(q-(=x+T&FafYag zhvq0FF_8-QOp<*MF(%1j&gJ>5XpA$*EY|aD<;w>P`EJ|Jqs`iT)b*~X$=2tKjpFV3 z!B^T|7PdM!s%2id<)<;hyW?xKs@B{CH~YKT{a;&%!3AOI8de;%nBRPz-}WWwkZs`W zup>S|zQ6i9VB~<~0@e;VH{joNceewNgEv!DTnrl&q*Hca=fK_q_#fbxfR_V~2skKU z!+?hYRtMNZ;;;yD+-%;?P8P2o92NncB)CMm4|2WygR*oCprv%oeQ0~>rr(8>OY*A8 zKJ^~;%?XQ(<&iI-y=-r9Xic623n${uTNvW^?|ORjb>N+sufBdwl6BOF-Uix|zjO;U zYk0DQssQ_~=9G&q_L2#m8IJ1rjUM#p6b<&fRFCC3YY4`4Oc%O5IafY9TjHwq;Q5Ee z3b&3A-`2<;o?hNQzJC4zfj5F~2Hy&~9eOA1Zg@mwRCG*i9Q@m$O@Z}-^bBx-a_;9o z$jdKySoo-@xTLhKyrQzIno?6+SKrXs)ZEhgxa~=MM`u^})1GI&ef?<#f+6GQpnmy& zs<3R|Hm-}L7ieGFjf@0hSy;}`LH+H8+6edN9O}jlG{P#I3bdDHKH!qpBrRFJ;!mMz4>yjGXK(kt4o zi@Vlajj`iPn-xjd26z_7eAuirUifl2(J3hDU%tve?#~x)J04&rlTPh_J863ShEOB_ z%OL4|f94;(hU%@GY+v~&LI|vrZwk2%z<4B3Po) zJZ1n+BKU)V48X^}1LA-WaM{4e1m6?|J+{sCU%*e58hsdrgCx&SmY3F7~o2H!o*{G6PBE+0f#Ukpo&S;(9U2 z4iHSQt!=8KU)39#%IlK|viimPMlNMlon|DEWdg#|hh&sAlt`cqK$-{$O4Y~DguR*) z+%GzR+78qhlmw7&mIl{Av=#g&=B(~UgE(7Wz6ZJuBwFOV_n^|w*k3HUJA5`dJ^b~I z%1Jv=7zATWuv{(P-T={dIyw`Akm}C(CT@8Q%8UqJ{eXxZC>{_-AaR5w2oW=HKr?}+ znV(OWd=-kAMA>68de8Xfv67gY6JafAfV?4gc$FM7tvM?V5s* z|9d5L=Am6l)GN9`el+%L9~0 zAO5^XG;;W6-9d)?JA3l6U3eVhLCv)k^o3T640ROaTjARQy8@kPlwB52kCExwL>%}J zS>P|U_E7&t2^G?-iTbl7;Vl{KeUA#UV3Z7^MZyB8Qt9gH5h^ykJcdggr*H-l{ZXAn zdcP~7+_0wLtBEPYYI3Xu<(-?OzA)qHPaN9pLbdBQGk*pW5{ReLJ+X@(k)Gu?lW=gBIlXyT zJQj_iMaBY-c5gVy81`QNjaJy(f}?xMo+v7zP9!^ba_jqbyAz=m5V|D4+nYw7cAKt) zJmpZKH{n3ZyddIQTaO@5+(anoeK-eC>P0iD*=D{7`?(hW^qe{40O<)+#RFpYTP&G2 zc26DM=B4`zMXgJ+s^YpY@YC*GVR^Fq(7Vvv0-N^~bn6jQ#Pzz&dX0WZK-BlJqrvZ~NGK;#2O1{NNnus}xvMIP1_q4?%U#U$@*ofBum8b?KT-`1i`6G7mlz*kgjiGB*c@p#DSg2MRc;>nwBZ z#GQ#(V7Y-g2OSg8fzdGsV1%mZ2`K(R1OeSWF|!}nc>x$YcU zeOn{)L2-F-?4a!HX`Im@m;(i95%r**1PUlGFVnl~p^QHP_EmkoFVy^#r;b1CeF`?) zy_6KF{|97ci7J+0vpHNa0uxSDL<#CYu)ud0&C?euKQyEso|aJmp&tY~fZ`8D9?HHM z$rj2!aIT!ZJTNIRGW4pzygTJcK?zW zv|j)(9Ax+pdEr3hp;P}eUeFt`7Ocx+dvLMvU#*w!H%r7O7Fbns?fmzFx_UM35$6h#Yq&0 z^elF)^vfUXrQaPgLu)o&uj64U^(M4iNMo^Qsg(I&c(dr+zF2Qtk$#WktbCQ7;k(3J zSZiold(yV~2^9Uo3*!BB%!fAXdT6{l$&8|PAmY&x+w+ods_xF5_`PdYjtXJQ*gG3f z$Bqw?zpbMF3olF>>N16))lM@MTFam9){W5D7p^yZedhrEw`#Z%ScS%>fUKb%xWx3t6wzVx49(?F{(6cPb@~Oehd%;^s3HW~nJ;G+n>t zm)AdIu>Cp#%su;+s>gjJl*8ZKz0Gglo&C0;P4tFg){%`;Gw&Y##tR;EC6R?a z7x%v}nFv4gzH~Y*23yjQ_2zx~Y~%h974r%$f(f60#9&b<)Nh3s3$Ie(8O$G0!Tf>K*5J<4>cc( zJk&`jXdn%s>_b(Df)7<43KYlzDD@Q;<^~q5@&V`oY7sP|z#!|Y0V>!!Q$W3fItGm^2n3)E&=;f>%H*R%3`8Rs`c1K{> zt@nTEl7B zts}=M|7ov%YXp-Pm2isqZ3@|+j#&OBPa$c^0r?p&$|E=!i>?`LJo;4{A01*f0M4`*o{J%vHZE%?iFUqPV}htK%qob zXKz;gSZtS>CU4xS&!VcGi2D5g=U)5JqMPCD@@v(_pL^}z{f^u}t$Ca&TDWk`3;TQF z(e|1%{7o-UzwpCxc_oSPe3#4oX&Jnp9&k|u#(lPahuaLm?LFPEaDxXA4bOV313&wbrFMw!(%sQw6 zwt&#Tzz2dU!0bPQXuSgbUx=fBkFuY?yKZYSvfWbgxR}ZJi>>AK_}zcq)(TJ!*3bz0 zH@22xuxiNB`~PHX-F%>&ui5lBTgwv6u93gkT3TbM$LP6rTkCh2hHR0!M*XMr6PvO0 zj0#MF*}tBjQ1cqY#{YVLVh7F5e7kj9>-ul^CtRr0$*2PVKkiTLvKHz7Wlly>M>R8= z<>&p0v$6$kLqG3N=zCr}_T&D9_`%WIANMD2`*HucKar%={^R}xP2ttw?@wq-tY_oD z5zt3K#MJMI03fV$5Ij+MitxJNc>q9wcYtwV$_*YrynJ|;Kp*hnfdXI(4QK+MH;l5u zNEW2$ME{&A6IQ;Kx={Q5C0XPA8egX+v zC;$?m2(a`Q`~a?gLI?o1jv{~=0143Y7c2pUe!}S|kYKQM9YsGOwB7{*c#KUg0a`!7 z^LNaww~xRs>#ZSxWE~hk$?Sg%9{!jA(%*o@#?OA!Geub9*Tm$%1*8iq!AFn&8z7|x ztAwcM{8M5QkgJ-9Zv0zfV$rPB`gr)y)G|AYdhzi`VzLgTtt7lRBZo4c4S#Ha@+Tlk z>yzt!Xqo;7qy)76tWcu$6JK>YA&>8ujcR{CZNy)SFl&g23%%IQ7dIaC%V{IK)I?7# zFXGBpirLrq$7!P)ExNt7Tk7Z;#P3A<{GvV8$qe*%!ic=+RD12u(?$zuNB)x(vM>7P zXW2%LAE%AZ(s|tR6v5*1#(H?({H{I4X0GyG|8d&r7`iy_$7v%odkKM=AE%9EdwH(^ ze%a_A?YcnX{0^&CfYl(t>bqzClb`bQ^C6W3D8U#qaMk52*I;`0d$Xme3CSIt&{}Vp zU}kw;OMrxciVw13a_Z%;ko-wt08B{t{tm-+3<6gH27#{DDGk62xLYT-^73+k-mj4S zSMT=sAP$g>SVFtl5__{XlCL+bu?aO`w=` z!srZ%AaA`2+}a&}xwy4YLzyL=K&L@;LddAZyvScJZW$BI$yo;bL;twARsLAODChR{ zFIKrl-@Xw;ub&sUUT)QTEd2B0)+J7?HvS98xSg6+$L|-n&NQZOlDqcf;?@G2@w@lG z3zNkMBk4DPT-F|NPFpT!=Y zB)ql%JKooS@umN(XNX=4a!<}4+jK9saPY>%k&17de8*M8Cj-)ET8rLqXqwaLTevy3 z)c$346C;CPeey?tjeQYqX~(_%h1oi?J_kOrD;~=IvVrMF(?r47Ag%1aw?*aKl{B_} zC|e2cc=KhsYHbr6zqqQQt+T)3mI$FeA&Yd|_e!XpIDIuBDzmg@;PuzndA6O?bapO* z(OG4!gELDEJN8Rm+slqukI627{QS+g4IBc}8YVfGH_qf#v<5|qiL$?HDr6g z^2zYKm5p42vRZE5G6wOvRqZ41SDCmEx;x7rale)Dpt@u9!`iI}TwBSQ4eZkXLP@ng zjGyRIo(d(`2e9lns_@_ZvW`Z3yOhf^op4I?ZN5`y1@wedTki@Om$}kkYH5iSIWt%h za5%j^?C_PPWqOf}&Ll$mXMsSG%yU@S& z05soU$@(^lB=UWm1fIqELxGMK$_11Ncq?G#K#_r#7q}Jp8Y&5tFVJjIMxeaFdje*M zJrZbe;q^do3iJ(63d$NZ+29AkBg=j800b(qIW)TE79DxfE!frj=M%z9|Mp+SfCVBP3}t^js2 zz>J1w0IDBUIq0pyl!1~6)fHNEaC|_cf++*l6}Bs2tpv0v$N<=Dfl>_1C5lSNpht(s z1{!qGpJ3cTaRxtVz0&~E3m}132P!jcia9gojB&yVMOgTNJ(3$iw?H<)Aw^i}faMjq3t3cD1cU;6A#hX? zZZDRWl?DU`Tic$4!;Y}R0>hu{3o9^60Yjm%O>)`E6^=Pxy+(!w6j&3<%*=vClk|*? z^;HsB6M@Yb*olF47T9`$bD6N(0$VAt)B@}V3hH0s_W!KU|D}!o{YoPh^?x*IN-c5G z`+st!@s^HQ)xWyZNc+->@DEoSqwZUv;{JA}(N?bRuU8s5TbcfRrLo9Q@z*Pj-!8u% z`O}rgV_T$uz0&wKP-j{et~CA_G);8>wyS5<0|rfhxLK^>IE4-RKiw=}eqO~4oa0H0 zz?&K4fxp}6Y-YZ~zs0M+4VumI}>S<_hk>`S7Z}76oM5?^rpvPS#(&E zj6Qq#Dw+D1Itm8_VTyXG?f|NUiwOSnop>-{aL*0h?EN1_2SYC;g^ogu=3aj7-?*%_#D2 zL!co8c@tIu=fR4u%t%iRjCm!yU493`nQKj^HB-0S8AGUuvD_dW3g+dA}I16w;-*b-%w*$TSkx zUII%fm@m9C_V~^ZH5>R)8=^y!ym8bXJG$9WVTK{^(-j534pDJ>HVCM49CCR)=67&) zapIIW9?|H>dThfwAP82H65_kj#F2?iV@%}jWT$Q;BeeW^!(Y3Ls}?E`x_!z{=pp&Y zt)R&6t5k{aFa=)7#A%*`8S-5-xXO;x4k!*5)$hBUUW^-9Xoyq@OSm_hgrYfMh$!x+ z_}~Z@bPhuC#Ym?IV&d!6PNm@WEWd*xhXr{}8oSJma+vdLMAn!(#ww4MiXBq5S-J?K!K6xN+=c%j`F0=Bf^Q92)KncGM> zmx+7aH*Gxj=+b%32d!I+-`m{4;F{g!eqPtwoOthj4?zI zzJ4@PhIn|^;}8kMM8?TZKM&WMvk0C17KEg(n-zLD*E?0<^y#A}GZ%4II4T^QF#VB! z2CQ$Q$>D_Unux|FOlL|gJr&|fpF{F#=B+J4@csye#Iwa8;iDZt#I@w$uyOw+J~%4m z&PGBkdhe9P=I*t}x@aU4bJa=!HJf#!R|i)dJ0-Z)qJzZ5g1k1_gG^xQJyLjs>5fb) z>|npm8woc@j`(8+Lqvk&F*G!E2#Y|zBqG9+Fd?#Mw;Tf*uWEr!Y0K2Q(t2Eq2Qdwx zLnHH@XvBYv9u(IWbO?3k*0GH=8D#u9EP3lRnN}L-`OS@ioXGSjLq&5&Cq}(9UHNjB zUZtJ>u-Imvo-y3HBdR9bgaxp+cm`f^*7*t{tkx_l4!2WP>e^zRvzy?3!)N;xd6Yvc znd%?VzsNEOu+vT1cQ;eZCrcNF*UR1=e*d%OTYRm{i2? zrouV*IiLG;f9}uY{{9}nuYb=u&f$2!uIqU{uj_ge0iV}h@{W-_c8}13lVRKFN~nFa zsG`WUG56ZP+WV`M(CbZMiZvQNdz&N=GV9K(qAKZ1hS0Y1*45|1ACJ{u(4#s~q*_%1 ziVjiIR@cXMPPQPO@tqgTf0_UB_-~!} zEuhtpXV7a;5b3_f154zIZ=z2(CPXB#w#7zMB^oC8>eGLE5qjJCG0_*gkl7AAtM1un z8=YthZlik?twdcudKyD#$wH^R&;~s)|pHSLH#PQd(h5W9*QgLMjm? zYKAHK5$>1C&= zWBmOeJoM6|3ysE>B$NFbM^-hAGz?$jG;D{KAXiE zNTuD`I~N8A*$8(A@#v)#1!q6Kf6Qs$UjS%{9=p?n7o(FSGmh7gQIr~%{AqN* z!m+d*$uo^%3;Av;*Ub|1CzfK0E@kqO<6rmkG!0@W(nQ5&?K+Mgk+kUUlg7bEetM@x zmVf+htHx`Gs-HK#F@3O}-#tj$!BG+BaqP=Ioizj8mP+~(JLMe0KPFtUG%|WK+nnUF zS+?#nB9QT&jgzaE`@Q+;fcb>E$x6fDr;BE8`1&$p*uce)&F<3+W6AvDxN6qyc*bLM zo+KGdDW%4Z17D}lT>0Bw#_*5Fe_HZtiS;7o_&)W+=w!5oxQxN&Ck;AZUq=;H826M= z%sfWZ4hWn{0H0U#V$-Vw?rePrT`94>x-&DcIp>cn^(lpMkM4;-mv3Ln-!t>;3v(*nUO^Z}&m`~nZTY&xdW^aM7LUd*7Kqk) zIO{V~PS#rv`Bbe_LFZ+acc>L`WbxyFX}EOi_m8JGaZDwzHMdf?sb=*1uuR8XO1CkX zAz|=`>Q0o?##Qjx5xSbSQoXumWG7GGqc`&z&vZM}y=LIizEX<}mbQu*u}PO?S>LUi zfhsbooM-64>mt#ZC}Fg#TIN_B=TsXvxJqBUP$RU4k}aXe`^OE*iuWpx_oC`nn53BEggFjL3u=>=HY7=(Ox)x1R`Jh0)Mbl_R$fm-Q7Vzp6b#)#U52i6Ae$Oe3r*4vH1G$hCLLr>Fo>I! zmzAosKb6#^9yCcWb4ahq>Tq+rZ-u3k=Oc&I8mAt_sXAhS&xpBHbI$YC15*zU+&QA3 z+Z>0Cx9O+jmhUJZm>0o0ETv~ldbnI&zWpjIOvpGS^;ZU^t6Lhg{XNBW5_@gvviQi( za?MB~@2i7HN&MguVM1CRC5z9?j2}AZn%kG+p(t4zI(O*AFd9S5VM{e<)-QCn5)mQC zM$Yb_V!eq;X(-NYYH9r0Sdcr6@P@PNXf%ykc8zYlukXCC&mW@84;hu1M!;)k`Pfb2 zX-%S~spKmZq+PC9f8?^6t1{ynG6NT^3Cdm*S{g$CII3jLn1ng2sIS+YJnb#)9I(1G zuWQY!gSlyiPevbbTg%8;oz5l^QOqR9y5QX4lbz`SN0WlvWyuC)#g8`7`XCw8CDiY5 z7$bBQV}F*Y8%NFSvOUc?P|}f^y)GrqzR-p67_!W4Gv;{VF2=I6NeM^S=igdi zkfM9bowvU$@3Q?=Mrb6xF6*>=8+ zDZJ6vydgi$e0+3s&4*dEt%Hw^q`IqYdYqXl{21adXDtviZlt8#IjZ2^Rs`PKL~1s@ zv|dErzoho2D1t}P<&pO7S+6E8G494&7R~Y_i?7^VoVPB<==Ku&)}`mdXuK$mx05H? zJYTfy34H~h)laS{c%~SPmd4aIeI0n+vt;c3n${6Hj11OHRaf5rSncebj>&PU&N8}4 z^K3ufTa%oS+h}Rr-c8E!`m8_Zb8dKZOJh&}9aC>Nw={m{MYhkIioK>F~X(lWNBq{d=$pC zFOiXmo+b?SLv|FdWCT#*L__El!BNCb;bMaa8EI13met8pghgLYj<~qv1AJ{riozL} zFmo&HX-&b=VF5^!!cteh`8k|%@JhqcJkiMwAyqinkR6>o$Zh5Pe06pdk*u zfeT~d=|fUf>gI!3De|Q?<3jIGoCG&qQ^@n`^~vitB0CBb9D<`rlfst`e;-n&$esGR zPe7J+$*J;F8=kE99iDpq=1|ELzsR}BtRjqxz^bF?2&Vyl2&wkyI|L5vrd;bF4;bzS z_Hsnl6d6~fN%Q;zV-6jKQF{37g-DQY^c#V6D1xu*Y$p<@u-7GBs5z1S5CK~FtdS{2 zL>4JiL`)Ghh4ap1Vr2h*?i0fTRxLPyNb2F$cYG$#j5||(WBdeI0^z)tNAHWs-hvG3 zSVxyxJNF{9iim8w=P+3I5MG6~5Mk6_y$1OW^LBQ1?cdJ>u06z7?>|`OGi4SMr^uJW zti3h94B6D=p?-^worF_w?}#9TdxI9oxsMHpj}O_@)GOC!Mg=S4O5x^qu=fleHWL;< zSiBKTjdS-!Hnnu)Pl&A|o_hCgX5c8_r<20vUgBAjH25ojog9JW>g>?;vmxVQ4-6RT z^EfR0-1avcV^5^d+l|C*P2MMjS{1_r1cD)heFFRSaOh(<@L|(MiyX*I5UOt6yqcV{ z9O@NxA1Exa=RlBJyKX)79c-0OS5`m+S|MMhRGyT^Ccb_9E0ifTazOEEp8pMOW~#3= z*zRn)(x9`-W_7aMqCzbi>yq*n|MHcFkrDeQUEkGvU!Uv8R&~GezkH=Z>xRXIJ4Jtc zrNMZ4he`7u-pu>)O2e1>mruXD(qR4jtnaThw9fzEf~KwWf18cYbbgbYC9yU9VRO=0 znQB|WHlzqD*%MRM_UfkjzyG1yhiQE(s~)MtA0Az9jqfw=B_(sEt!%ZZZ{TBt9JyCh zn?y*Hy?WYFww{g~*GfuEM*3HDFx_-iNYRNfm_#NsGc-C*m~9}VbPBOM!|675fMr&^ z(bQ*Kle_GG<}!${6ge;G^L(d>#pTyzM^JgW&ZbvNl zaU7~^6#*+NY_ z5>-tM3_|Ia)SoXLc_8(65^5xJ<<1UN?zo1!6q>5?N$1sqKC9PF6%+c!jbbI81Wb(U z9~HbPPAkPAN~UGc-#&%#4C<*z<{6M_#l|M8vpUQQ(b;x{Oekw7H}w~-A%d$~ZAiHdfakeW$WPvQ;Y zQ|Qq=sVS4sxU41Apk9vK$&T3THC;&39>r30cM6$Q34Pr;myQh|x{jtOVh$9$>iN8O zOxIBP>J%DP7UuStw$~=6Tz?daLLX}D9iMP-bMhdL4a;A^EvWuNu0(<7`>^ur`F`#zUg(fWI-W~ddoGShdlPq+|H{Sh9`Tuy*uDc)bBE}$wJzDk8y(v< zKf>{9mu1Dei)zRj*le|q=gen!vLGsir%7;V3%vx_HJ!DX|psW*r;&Y#bq30ymc zc!=yq?$)7-%Sd9KZ&d24jheP)*)f8~0}rOBCKao4tjDvxj92stxy4<#s#!Xh(rbIeiFSmaRc@MWlFrKT3JWz#3wpXH=j@fW$KK@%E@YCa3hA_| zZ}}91Rh^kqYP+7HWW2o2k@b*e$(8y}zTK6>8@;O|Q5n;!P7jM)ziZyf(v_sadB~PE z7c!g`rj*)JVQ9o&$LSe+C^4kn;?li?!d`6EU6aerQk3Mk6Kd?$yL_ALDbim5v|w8_L!W(dv^o;7TZAsg#D!NyKZ0LUSUILA)r;U}dNt z&89ZH=Z0Gsf(tZi1?5$a(_$|*CK{0?HZ88%Kc7<^rxLZ4^O@je=^Btxqx`dLXg?TgH{nKkYmocV4imj+}p&Ex7j z>MdVQm9%>ne8_DJSB7m(a5R=t=+73*gh7gZ6s}5VBvD$+Rg!6o%SN;O z3ZE3HB(tf~Qj`G2Q|jZ5xDvhN%CIgJk~XujRM%0ePdLIy?Y9U6G?PWMeyJa5`g{H= znXqGY=WaBjB>kOyZS7kqPk`JtrM66z8Xv-X)PK`0Y#BLX5@7YBi^O==2(v>!*2sl{{DWrY{|>;fxq3VS#fwurdG~Z zuitLhUOap_#Z2v2(IL&dDm!pht7fhWqNnE(7up|NEn@Jr zV7Jwl2It)?1cV)N6qnHx;HUw?M?gg#O{v=Y3Ta>Lw&D{~!11wALrf7Y8{0Ib z7SSGqL?U)=SZu)_N6;dl8tzh&Z>BFYa zLxKf^LYR{qC@NZI)VV}NRzQKhUB|1pW|#@EP{U>o3n|1DPX>ix^A+pngHZtI&9LVJ zNk=phj2}Am!kM5@4ewK4>}rDv((u>;E|`Rdy$ps!SyUF(J)7YHKI{6>k(^)e2W71 zaoFxQdGng5zSGuU>*BgX*Wf2_c4W}gO)*c^yQ-hIY`LI;$VV$z-Ii|u{MmN-cTqrf zd427 zmj`bcj(M^Fm~(6727SFI&EPO%Hx9Oi(+U#J8`H( zaLL;n=Uyr4#*y`<>@)FfFK2Ptnh6`MtWt!#h3}Zo59S*vX&sVzr3~$=MYboXRxMG$ z>IqMD{jJBD6%v+ZghI%&c;VIOoYTjbZ!Za1dou)sdu;Ttuw<=dFU)q=QJKpmySd)Z2VWUT zDSQuMtcFR$=EJY=M!)*{Q5Dxu=~HEFx76jQ?O}8MCK*emzn*;6{`V%X+W2*BZm)Hl zOeju0>l-u`gyo^6239S5)JH)zu2M1`1&-{T8#HT=QciHaOq#+!AW&ZvD{U$GY=${5 z=||3MSpEoe@Dl^h02#1Mz^(vm1fD)%4Qv&F8(<%h4nP2afKvh(2g3mT`mjU5#(?!b ztPVg)I3Iv_02gfYVJZN+sm%aDM!+c0ttqn7+%T4!wgQe07#`YS4gd$|0~`*pg}|)= z*a`{`g(n11s|L6&TebrJ0CQ?|gKh-p2A~a?i<_E2AK)4Q8Yl*61D*oi0BwLRKqL?i zaE1vUo(e!4u1Lb>0d(`67zso}v=X2OL<5$=Hv-)SaE4GN&=dFt?1N_mSOy@2C4mF$s^`Iv~@(J>tj!T(9w2QePfM`H}z!uOAfGY|d561`)4d@1j zkdT-Hj03KLHp~@yLa%}lHGJ;kqRd*L8`AjWN6c@k;dF8Zzyb20QMIM<5yA)3LGeO> zAK82KdZDcgmJ)y+)E9sn@Ge9=8*&#!6gAkvE22*3_Z{L1AILISZ{QtdC#Xb#IRG4B z4)PV`B@~(g`y9Ojkj#f{gU}{m4*n1T9~>aSIAk&*3js_A2?ipE51|OChh!#zuL<=Q zNg=>M-GMd()Pp<&*#-&?fDdU;KrP^JnAr0_2!Hi|9Cj_i0#Tl#b3TlHm-fF>rZ<+N+NCT{%VD}zm#Nl ze6wVrkK>yp)7t&jV##PpHV(K?#P02KNkE`y?yBa3&n8JGWq9J0+%@CZPHC}Z+)3#A zBx~e>W=qDDp8#`)%FT-g3rlG<<$_6@TVO8rkzLs9qmwCw$J?n$RVUtecipyvNp|JP zIE6pAz}$@@4YwmcVV5W$aI+<&KHMvR8jFZaHyiCdKCPs= z;FAn<@L4ABS(wNCyrNxw8Mpt-`tnCw=hs+-j2@9e>mn_*rfICwczuSSWc#K{_i%6B z(+e2{wWcOg;h9;Pwr|hd-HbdKpPg)|q;yDENa+Hdg>Tgbp9@b<)wk|+&;0sknnX^v z9P5_;t|{^U{>GNA8`o_ZQE=|PI`K|qT2G21)QR^cn{JO>WcyK_c+a`4dBOgHl-09A zHI=D0c3R+Tgk{gItpK`h22u<6>c@La!>1ksCv{dGMA+80Kb}$q)zMFacND@p-cdZF z1APML2tE4r6N;R@@pgjspWRxI>Jq%2L4MQmcIG5jq8SJeC*Hh%B5ylK*QtZu@nkl2 zNqP*!D+t{mPvgZMAMsM+fy69=1pwYrYy$9zqHGc`;#!~K19}YrcHzmy+lt%XruAMENh>kDBS{KH}ATAIJLw=C60V&S&tkB6OyEwLS-rTlR4 z$HUHpCtB=c+Ug&BEZ`iQ5;1t!4~Lx>U99SEdg4Mcv;KL?-nPQ12d5(IsJ~mS`}JID zTaHL>d6oXUP~d;|8$i9E;Mvb{$CG_qzg>17wUPRE?$}%3E<1ZCLI@oZbP~5+N2OJt@_29wayP(Tp(kPQhO+A=27&DkL z3e@l&gF}NiLkt4>g8>@!8Uz|V8$y!$FguyUvl;{NZ%^$eOsJhP)tBLnu_HZ(GE?UVS^=gO}oE8yqF2N;O&9 zP9D>ae1AKAenz)R-Spd%98I^=J9QS(%QGJ5c4t}1O}@XK9^KuC<&o<6bn2obtx3JA zRW3KCMX>L?ch@3vVfLXn-)^U~L*11M{=7-`Z9+#w^5%4<#?yGNjLS=GKAqmYl$$5A zQZA*pw7-G@R!-#0biXk`_dazC%-V#GvLz8_t)^U?Mu!8{`+SwS&#FfieVIVaw=O!02D#=kOEsLDCCu3TGb!HL!}Y;cGB zEbiL=hi;v0*^H0h(q+l-ZJY5izYm(%rZ$@R%O-oa7R;Dh(620O{Rk}*TPhx!n?D=y zrKynALgegQqY73A_~VE_viMYxrU4v58G!B$VFW^fI?9K93i2I@;o$R7e;fEd+Yl08 zDZWggocb$Of0_7h@loN^{r>xej)YGXAB-C1)L5$iT=Bu+i^YeHj~1VeI;P(C@!&gG zCve+7V0@73Zy4Wg+h_bA|AhX@|A3~zqZm2dG+EB@e?5mAGjyo;-vu7?$qM(ssCZbk z&tt#mp9Afq&QksqXn&@9Nc}O;UWGz8wnlpg{+|NvrUp_HPt)W&MHEMFKfB6iL~C?G)aKjMT64Gsaq3c(=7=qW;zq8vd@*eV5nl|xgMa>``F~%`Klxew&ELjo zRPa|kl5FmxD2RMeb!w%pdqr;y)rfwI%_^S@!Wz(%@TBrS^ zPNNCSJFleW;_3OZ19)Jb#jf2YKXw40JxNv8{Llfs*g{i}qpd@yTzmL^2XLqbU6;*e z@owZ+4{ar!Rlqu@-?~__h5o7(YS)fa@3xhtq)Zzhmum1}t%U3TeRkORH?E>6VgfEV zq8h@?s|YjQrrFyJ3J*+n&-n&+V{G<1XeC_AZ=31P9}W!oWYGF09huQ?yi;9m>zA}; zO{HHe;jHag7rVT5wYH_>kh0dYl*8LTU3hj?9UY#nrg2^IKhE|Yz~wPMl^@Q9;Zp%R zfSiHofG{EP2k9QqHNKyzk+bm$!4`)kCU5~93mAlv3;jM=LjyYiI=J5jJ_ld|GgId= zfeVkbgw#Q@vt9!V$3525>+(fD`}@ z&<6YheFQ22i~vAjmPld(YucD1h9{^tSPfuq!%7-HKA;$6b1WLvQyRjU*bZRrJ|<)$ z!kh5=LEA^A7Xp&lJ75}Xxdhs)9X+^8AT=?sH@p9CqU0L&MTfKN2jmEjMk);#u zsyNv+{%|)jMbhy^{2$aJ&}hCf)5NYWeQo!4VmC>RVw)Sq=6f2Am&Jc|H`cDY1J&A0 zQU6&TH~knez2M6KIm$VG6{UNchs4rVM%R%w@`MhrLz(6s22NGgh*TQsI%5~d``5(D zQ|)^x?$gf|?|*crtt_M1%XF8bg3ffeunCe1W1ZO~sHe{^5=t?rn%LjXQk9XoE?peb zJu>3tn*C=QjH&P`DgL(32%~M&DSQ!{tDv*k?b=z|(Be38>?nmz711D`HKZzYLQT5n zJf_7tX`ifH z+Qm_qHX(%*BtEUDOX`)e8XOB6Z3uTbQ>$)(AT&W-oG7KrRQsuv`13~|HnbKs;$GRE zcjjJPQqLQk-dB70cD@xcuj*jzQ}bx05y#UCy}T0Rx^C2q{nK3l!ue zWUP!yxRleL{g*AuRWvcn9eI5~4sOHm`X_HW{eCL^CDD#qz`OJ*7s$}5cnN}g`t zF5KO2N{87Y?I-MPTiO?va(OOve~)O1HJD3h=;l52yfa03PtZ<7EdOQ{#|& z<^kkDWW%$LQC^KbZDS9R1^@$S!IKRDz#|SkKoTCp8p7%T7(DdqryQ>~d`Osl)OZH0 zQll3($9SLtKX{q}MSuig07O6R#UT%<)ja5U$o6Adt~P|Jr!Qa<00~f}#vx#sdfEX9 z0SvG%z^tXd#t2ogEt!uB04RRQ=VR>(Tm)PJs{nhzAvLIA7=woldNt~fL?0c0%!rH0H|$11&BhnA4__*;HmC^L1h3E`&cupO98OX2U-5#cw7HJ_jCUJ zYS|cN>KPL&|HU$O{y?vUA0Oj3n%AOfj7c9p@GsN;)c(}u7rNiS#VyMHfS(lvW;YYlvws&0RQ!$@Jv8_Pl-U<15v-wEvok!)jw@eS8N8 z)s|r`k8!7?9YcS6{M!#@>SJF_k%$-l+WWBTyV6_@`vz4+%84^|>QfJRj31_k^q7#D zbSKtiTfFVJwEs2_il;!E9vVOEeZ=F8meq3h=JdWsKR^C-hk_CTg%j+X7{Ef zx264eZC^k8M)PVJ4yr4c&$gE4{=I|h@L?gn-P~3O6{VYiP>7^7$;4UFR;GSnSM_ry z%RnBlSKM+|Dl)j6bpKG^;CK#UO?0X`y_>w0vWSl9td}ii>Q~|!+yx40xo&sDOQcyx z$Tbd)@u(Ma9Eh00s#BNdZrEq0byv(|k7I{X4v{RWt445rVJz!+ciYz$2BRW>Ha0V$ zmtvP&!6@r(cR5MJZ?!bxv^wp7+>=RVGx!kme`gY`!N4#u< zcsGs>`yI86);UVXF<2~VSuKCc6;V!-YrQGN+oZ6{LPywx*R@AjZy`6NsZ4$D&FObp zlk8N4H-t2jSWPXdGX6GsrbyC_uHDl*7xUo!bx$*ZgDX8!)^*^xx)e7&E8c{Dv+f!spi zaZ*o9%f~{)u+#Eh!q0>Y2bD?od*6yB^aVl-_UwcshjKJrc`1!-wS#JoNT{#m(MQz2 zqPg)X7M1qA2v6_n8$HM#QXj7yGlA%sl(PMpgqJFhCjwggKxJG<0}0>p@m8HiijwN! zVb1o6s1V*2P@VHdi6aF;2C^DiHDy-PAX_Qxc8$!dM558xgNDRvX|vnEh(on1q%h^N z28l#yZlz)}?~~;p^A$Y z4$oXomv%~2&`kLf4lOiRYd(+RT0KltFD71l8=oo*nVmUUq9i_2DSfqqcH4Yn`{vt` zeXQBM1mV*foWYW4MVhd=*Z4eHJML7D2f1MKOc~1`k$rw~4o7Rabb3cC9xeHyFpNi$ zm6YmHx0a!uz;h;5N)ZxeCuc%LVLt0lHJz0@+jwauU!_UYjWfNbkz^iJ%9&YnvC@$# zUHNIhmYcwXR=4&d#o(Pn!_b406D416~P}P+w=@%PDrLFz4TNutET18i=eQT$@l~vz7`T70g zMEQ6TbqtU0B;lL$$}DVntT@}fQ%KBhj;0_v&SU~H^yoVAMD?v$JHbI>^J4Uw?7&!J zz9CIcv>tl#j@>pSG1sTP{@v@&?Z(?iF|H<3B|G!ZJx>3)T;NJ?3PTA ze7)e#=i47o=DnCMdN+_qH;CoskOV$mmf&KgB6{qh< z1QGY{jE(bGk##)h1)knK!W ztxMAQj6(i_M;*N%bBwEAJDa|yz3{TC?ALTw>ijY5iqf;AV*9K)a{furtAXdnX&=lw zbJtt2>eKlMzrN%`{!{zopSTywCidOf>0t{C~$?tLjvPDQjs%qcELRY%Lh`R&%!6e1Be?6Fnb^%iX)=9UmAVz$c$}y z3yVu&l!Jp0CKE&);r&1sG%RD?+Gjt*3=TI4PKicjZAKOphds~dyhB0~5l|Qamz*k_ zwrLwuqsx>P2#6{^e@1E)XKoPegi!=BPDDVF4h>DuoVBX}1{H)hGwYhJi6RRM+X;;1 z*}weiGj%r1eF%Tz`~lo7NPZ#_y11mtV-9BvTrtPj)optJA-U!%;-;_%!fk>GC~}NQ zej=f|_NQlX(RA-MaIiQSS4o|GN4W-v;eaaQskoQ`k4-@IQrs6s+!W_V5hyK`Uqc2J zM{|%|g{21pQFv4k>4bqja_bJ5;t>ahQw2sp_|_2tO}k!;>!ZHzp|JSD_qQwU{M@|< zWNto4io#!y+$K(#A{vT|42ZBIe4Cei7RN~8c*#ks#3>)7Lt)NA&=fJ$*wa-wD2nqF zIQ@X6CDNhr4EA+!g5j}`lRHd{eftiE*&m0BaKQn7c_c-V*hG5MW$;K`kr;DL8Z1ph zMieJZVR(c|=H&WEh}teVd<^HpaHbWZ(7=UFXG;;&MY0ruSeS+2P{K(d_z+>X!3`id z6LI|qv0EH9g;5b!MA#A$j)n0CejB7f5e-Esbi#@?$e@m`l_7wNbm(BmVTjr~Irv}< zK*$rPO)=X*)50l=dGi;+&FUu(I#X4-d-oo&^F>Q!m=LnpZ#+_b1Uw$I3Py;$yqyrJ z{+1wW)P;T%0zLn*^s3(Y$IbJ16@u08ww3JorUU-{wVm%OVp~g-i(7TTABOdB)(+G` zEq~Yb=N29C(6?^$Rz>~Qw{G*QRjn0*KVDTh{sTe$E)Lp85Zk;RsTe06S2)47 zohgCzxzDHMtyNp>Q!{t0pZ$4P-i~IA{o%&v%RBYu#!ua0?XNm(*lTa~)O=+VK{TAv zO}Bv2uKQ)%0U=k;cQVR#%%Cy^k{5d^0#|qIenCaC6eB?ZgJb@Q({2B=9eaK~_NA+L zjoIa_4Bmm8;oW&BG?(-tbjNys-Q5NYbX^T;8p`Fop=?Fr35}!F_|C?$eO(3IuVSSo zKiiueH;sPz`pn~_18X?6EWy62UmxzN=}J@0%BV8Y;5kz)ZEQ(7d!)azL)R2>y6dru zZSqQf^KtQyM&4by_c%(1#$AC_Tf<6NB@DQ$5_Ox)=8LHU2WdRZ9X<#mN%OTQPn9*U zbT__**hs^sx0I_P>@L2M;nQfIbTcAp(EMB7t@v*GPNu6W%|3eJFz6=!%QMs=?D}$Q z)+<_b{1KZXug#Ql%xepw-rk%p+>e zYX~b+=5PS$Bw?Aobm#^2mk_QbK4V5UElPny}1>w%^2{y-c(B;&P3PLF~(gL!0BE z@lzQ3H>&7ik;BX@%hnK&@IDC?qT^LV(I6y|V)AGStzLAvr$A1j59i012oFD%r6Y8;aJlxKc8kc!)Ssxj{*JXC_IrOD|ix{9K?ThZo=eaUIvP$nubhWN7x~ z^WlB-%|-LYWCSlhX$e1x5_y^FM^uK?j07t#UqiOIdk8gSn>8t<(;_DD``QR?Or5oQ z^Ww}Wx^8zk<9TuR?kDXBc}&)cf1NO1nGu>b+{A1;lZ@x87=7fW9hs^|3iv8N@k<^# zrc0r-{)-p;ls?9T;X%n#S> z;9=Y))G^j+8}V$&rPvTEt!f*sjwty&6_wTyz_=Jc!A?uLhif9G(fo%}sCB%d$>zGM zjhhGLd0pQfe7)O|D))ZDuP;tJdob+X%k4}HVPNrzS7cmw_LnQ4?Pz|noLweDuAbxB zSm9jmxQRQv@sn?)YOA)j`zqCTT;F5d42v8~hR~A|Jv^k_V=V?R$!E&ctJ*m#!$JM% zUD7$%Vx9V?G8Gh(o*EEayp>Ff@aSA9S?=O`eblJsdm|@%-`Uj2Rv0`{JwKGmxO7lM zx^)qsZO*KrdvH`nlLu7=v&v{oITh^Lxi5zNA|Tu_Z=AWH?NG7EDQe($M`7;Q1J~1Z zj#0@pkCzjUdo!my2J*S}&U*_z51zg8Zb#Q-8HGojXmbPkTg-Mxcn*|jf0}K+TIt;R za4ch|m(Jls%M0VJed^>px#Np7A2FC>cHc0Olq4(fNzD_6HAweW|FTDTO+f6TVp;8z zXG9x%@!Yu*?f|Kha!omE!-5OjOc<|XlDJZVfr>j#c$!UY%1i-_8v`sG#*2uAv)L8>$^SHre#6zkBU=qE zIOavGt;Fo|qCvy!;}?B-#Mk-cJ)g(awQ|uMYZvpeV(*n%8OOgo5v*L`S(tEecTvbw zhf7BREVUII3d?UD1@*Gkr7%gmUxg;p}j(Qg;oo}7YZ-5 zT1dLkRn?{s?DwFnLY7r;;ov%f`Ux!IEI7Salv3D?13C*up`mg>@3jEVNX}wGdLF^QuKvZ0#VbVtof~6iYv-s1SA`q+$mM z|2FhfD7+9-v9g2S3bhovE$pG)dJI7R3F>Xzqyrj^VFWYIP00jM+0_dVuCITMStdt3 z5(nVG^D)|BQs&h+DlpbDv8yVT&gWXUTGjZiwIO>rof*C&H{3VPt;e*_S0psj? z4aDU*TyO(3$E*QMJmw&zbuoO2oJRC=bjJ9Dfdb=6@a1KggOGwPDT!Tq{{dze3>}y_ zFpS`K8*K1M$ErsdT<64?fYAe9cZ>`eA246Q^p3e;Px^(WuHG0f5FvuF4#MBlVF)5b z{!uX?@VMOxiVkrc%pZL&hz+UhUBJLW?DuC}#|QwH4#p12`!9*~Wku6@vOo~&M@qtX zk^RX%_V+}(<*4rR^}Qbjq*}O*yZ3il)o96}jU#&>zR>=__vW$hJkkR%?8)FK(R;~u zyk5m;d7iZFoYv8|wIaSnX}x6E`MvJhu`ykZ>AjUw=boJ-&Zi4?dTXK8 zJjTkkl|;`>=*CnuW-V~P;8{Z{+B5!An@RfA$=ma9Ib2z4!VPUqzG8AMRn%x`cYdJG zt+LGNJjzvhoYjJZJW6|Mox7e@NsSp9W+#a^ePH&^jgiWgxM~{4^p zLEG8N<`7R8pN)5mIBq2#20AX|Rtwn%e(4hD=*Zfdc>0p~h#JeDt^#6V6eN&qT10GB zvh5@IVv4nd=SsKYy6(!&qVnBzdOP@+YtYV0C|onEY6|g6E_CIZ2^$qta@U3LhOTu@ zAkx)LugRS~twm{VK2MgvA$48>5Pe-m9UQ()F?&v#yO=O7q1qS z6Dcp?m2f#%Tp?u3d;ffa-W4yquY@S|%&az!Jl!1P35ovY{Y{B}AZLF24sJuWEM`tS zO$^uuvTDYDr<&WLVUlR(V4sEL;v)UV$Ar7=v8a@EVo%>E4B;xug-gN|(IP(@KQ^E1 zAUPBm`km7H`{v4>L~_>mqwO`9PE#~-R9Vb^OuI|(yn-fLnP13$P@-dS{};j?=WrrP zbG7p^VrSt@U)lfbyT>G8>4NdwM$P>CzIO7yuOIHl;a6w1W|h3bbk_m#E!rCG)rQ@j z%n4N?C8-#VGn^!VM%WE3Wg1c6a$t zY=0`%Z|YU?+1~zURi*xnWSiwdXE}|s4BVpcMeSO?%Ki<5L*y3S6hh;UvtvywW?4*% z+-_lfw#wb{O@@4RZHIMpR+y}fAGnATXx0DhS-*vERw=lXZd^2%5BSVj73rB{GwN)0 z;ITJr3e%so_djYhvii;1;`6yZo0L{&+S;l6b9*Iuo}bYEZB~^}_(W;8QE0cOUX>ko zd7c-p)72@g=DS=R5<)Jvlu@Vw9%31?u?WUu3kO`sZV(s`V>IlP0C*rYKpp4~n8(r; zNDSNs_5cxq^yp3pmIL4coB%CACU%lQbbvje5eJHZrm!*t^?_#qegNl*6UPDVFe|G~ zo&Y~^3ornHUwL^ccmN!BY<{IU@T3*dJua;bdLk1fuk^3V=szb zCGZ=(0jLaa0m#SN77PQ>4%7$IgM5G`pmH4a1snqK599{=0%DPPK!G_HnAlGO`vKnA zJp%PXM*y@S0YF>;Fbp}UH;3aCVPPOHcmvYGAQk}NUVR3E7Ie3D06$RQ+lJ=2@y%O+ zF|9r*GW>JO&I;A2Jk33>XFmFPV}ZJt-4%n=oK3@@#-%S!FfC zY(Qf5rPbNH_W|J|vNz*Wwfc~@XV`Q#^a64&JTgWK z;SZ@ZfH7n>fs>2+oGMTjcnpCLc&r9v2!8-z=zTz905Fuh!osxxY>*+ye1it~IrjHb zmY#xwiKaBrARs!h89Ewj)quW$XUJ+0)Bwz&R>M8Rp`d{W0K!3@z*7G$KUx4jN+p-I zrl9_05C89`bUiy-nON+)`iG3hH}7fld9j7(57bMzu{PJ*&Wn9_Y{LgiSxz@%JLn%2 zryuQm`ZU8h=1%~x-%-RXYV)49C}knJvfHPBP|C(Ge3*E6&mW4@PXADxwq@p9ne&~< zXD|MnN?BV*qj{D3*Gd`HSSfea8<0Ufx}=23eeBgrS?3tHzy&#(o_?*xX%hFqNg1Oi zbQNZ`7N_qJj-FAN;5EoZDbJkPzH3Id_sLeJ%shMwp=eC{LY8T&W+pT`R(0gyuF=IT&Zy=2slKjU7|AL zba_$y8nzRWyYYg!M7fo^wfE_EG%oKnONS`q4@Pb4hW${3R7Sf?B?ZNgsbZX3omvKsuwYev;sc=ylYPf*F$=j+~I^+)v88GLvuL;kw3)r2ZxgU#Cg9 z+fB9}NXx7U?S50r)?z72X6EuKq>xG$Hn{e75^6>9;~1nyO1BaucwbTKbP>dAiY0uR zRgU@1n}c=N3(^>(t-rqMSLqe}CNt~&<2g|*silojn>Qeq8l>uacULH7Ti2?tBRu=| z=ovO{(XlOECVQR>zWrwH*Vsv}$CA&D`}}5|lDlKhTn*iEoF;(Z(P!Py?IsMa$U3hE z_^CHeXKTmq=y&Aog&7OqZg49NcPY}iID7rujnABXh3e_v2#+S#WRX~tS^qfQt1Fd%!*@0FYk|?|^g+-2i-mGq4?K473N51NMRW0Cu1>OtP5A0nxy4pf}(h z*bW5%=nZ@ZGD8Fa-ohaSt^t+-Mxf>qAQYJEK_!6XpbseX0ABzaV@?OWgFyhI0rh}) zfImPROaW>D5FRuEun&Y+qdJfud2IkY03QGj^#Di?fdVW5_zy4#wgc4x>5vqF;ec)c zK2!xDIZz#>Kn?XxwH(vufGhy*QCI@b0#pY}0>}gEf%7=g{{6U(eG}G*s1F&|Z-{#6 zo;KJWH6eg^tP9ofj#(RZAOLxc*w~Q)jW;USp8vBqi}v=LDU+GE_tWQ|=_FDGXJKF~fdr5gK3p#72)%G7H& zdpS4*^Rc$WpbgkZc`GmLclZbU-waA2^ThS0v?!xlhCxj?+C=^>0RBJuN&a%WZ_0-0<7!H=?)LvK_^)cYElMBoU-+o3cOUl7ogM#IYciMW zU$XwunoM=N{h&Wh_n%}&yyLBx6ptSP_|sg1Q@K`l@l)FeKW}Gl&W-IqgF4z_VDbBJ z`Ak*$%Elh{eZ9-HHHM|TmKGjs`1qZVDlON(&n?e)?B(XG7kxI2Xp2BUQ%yR3C@k5F z$4{S{d=+Zd-x|>Rer1J$f_MPC07~iD|l|xR?(4i&%(I( zr^}XxuRQ`eLT7`V%(jY-b-PYq4w%g;)f=9mnV~_}_a3Y9bVF37+S8gB9OvNL(L0=a z-E$J{OWYr)_Ivl=n*ZXLBdWyiJy#gjs%j3OS%EcKb4AB( zU9s}$GbVX;qM_MG<=my$iDw_W*Q=YToZSj#%pkdvMn#Kg9Lw)+VVpMYtESS(J=t7r zVql{v)2Cja)~ihIqdHPjL!k-x$I?fI5DGEzktY~+aLssK(r2zXUO3WLRYu{JDDEGo z@m{>SDjwS7{WVob9*sCCZk96`%X_0%^z4RGo-5bNO`Envz#u*Yec#`SYVuL#cNCkO z7!tXw7TMUyuh8if)thLB_9}FxbYX{`CLMhUl|A;ZsqpIQ;eH?0KB~F5wS+Vbu7pbX zB%Wa*5J+jER|PISUv_*28R{hYjb>HoJ7E9XIco4Q$s({vyGYEbm)q`?b0UeG1l8RU2TP(l{(7tU!PAdm@dq|3j4RD=IYqu*a| zdnBb~sc7#9tz1GBGU_!svzLdGXbO~XQr&3xkM3P&a$dpgUsbBil2Rtcu-lmkPGw%- z6KCVIl{2cU?08mwf*^e>cd|!$Zb@OH!}+b+(N!+1?iMBqx!ZW!N$iSFdasi`e75Or zF;bT`3e*re6AWDM*BgkfOC ztO;!#Ac6@SkP5^E(qXQJE{#bVh}i_YArk?qKtuKH3-uUa1XKce0Rb@?1DGIjLtR%Y zPhq?Rk^+x_#cCJ@$O2x0n*d6HFOU&%2Gj%mVS2_42Q&wc1Ev9{fN3BpMrU9g01jg` zhH1bhz!8RBjA9U0U z4=o*|9)xQs@KCLBo9oP(N(k4`-XUc};)YI+Fba?qA}##HKv+l!AQj*bKzSfL02&Ys zfCgRz+yU_bbd2Ee3ggZg4u3T@SA|W3Wf^T)P{rX|h9HkSU~or3Y=;Ps!4ZeZVDH9F zFevk=C7c$#4>h9w$xQ|cpQAOq?yOi&LZ$GmjK}R}#{ep8ie%Z#}==x9!;Q zpCEGLxgQRT&CE)g%53!gF7`3!R{55;^z^g`eqT~AJiGhNYJ7FiI!Cw84e!4}LsTQJa+PH4E=2m)X)s=N-4Uu(UcTx+agjX z%vs-m`bI@5Yud)r9+Xa2QF#U(ZRw@V z6syn*I`vkl%ydcvCN-+r#`-c%Pnd)Uo4$@0+TZ2#*fjd&GgJYWoS|y6bIO@sJH@3u z&ZdoTs(Y+FF4QqB{L+ogbK>(1g@h`tG+pE)rwn^p%H;MSlKo}e2h-j+wOIAbq*j#T z+}XR`fYus+iUqY-n25(5WI@wn?j7XMq(ydkQ`K2#u8nANSfhp5L_218&3#5_lt{F; zf-i30$Htp??+zzSsKwz~eY~Nz8poN~G9+;W?8$s?ol=j{Z(F?Hcy55RmX%LUsn9-=?q6_X@MmzST)IjB+^F%Fr>^A76-NGTmngx5%6iY5Q?GK#6h zxv(ZqSEb_7B+7c%z>*RT`hrm=e7*O6*b-<^}0Hl9>a#`be%Y4fTyo)+?~^l}V_99Iz=zMSgH zBU_SXLYM@}>ItcIPboj~FvWyRPi20xFw~4LmU%qX>SPmda5Lhx5miZgIVJ1QsyZ|H z^Xrw;mucF%56x0}QkIL9%I4S~)~Qm=o?(;a>@KFqz7*1^x-M+CIj>*3h`+kXstfA? zjv`Ix`+-Fi2xZ-ah5AveoQ)}RqR9)>>xmJ3zAD~k?VHu1MV&inZ6mBND!rWnoxAUQ zRwj#|y>2@x8m!+v&X%ojdZnZ6nVi_6Pg^QL(E^1P-4M6$seql}A=S`L7E+}) z^3KUZ<{SFe%c`!8!xnNLucI#@`mTiDH$+!w5?e&|6LPg?$A+lBYrU0N{iZLVPXE}zNW4C|%KNdS*nno5#{ZWY?> zs^c2u#F(XZIWN+=0D3=?pv7-HP{>GfA02;V;>HU z8S%@+Q13gpvu}SmyfAY*i8^=Z{^t)z+^_VAO7gz@u>BF&vOxv2*PXljw5QF{i^~h< z=6TV$Y}oi>_Q&HYt$i`09^HGr{$t5A-UM#mQGO2R4-Q=Ck80ed;)48kG7c3lsaF z4}BkAT+Y|tpPbi0&DNUBUf5&~*xJx$wubFQTi*)^7(30m%esQ&TmNG>|BeB}A=o85JB%9r=YaQ&Msq91L$E0@Lr^%7Kv*EIUAtUa zc^a8F5N5Dnb)ZhoOF>7$zQ8BJ1HmNK91^?{1Pq*Q?Ye9feBy{J=ps}gP(*M-urlyK z&^$0Y*f4M)7rqNHMo?MsH;_+oPH;svMFb}V6$B4#<9;|uyCW|zF)0l?7|1Hf9+;k* zWP(io^L*()`*;2&TYFu%A@$EG-EUPI6aUt(5d7NWzu0E9mfffer~VymZK)R{^p`&d z!@djY{!p#mR_WH*a?<|a;QRe&w;9c6VAnnlXbpx+Zos{ z-hBcLCcDpZ5BO<=nytxVHn=QXYZ$Rb-8s4<+S(<}`P$CmE4zFXH2$_)yIZ5RGQa3b z`xkqQpYDE9Fys33?)#d3zZDiwrtLkguGaR>Boh~lltouL!r?ak@AAFf^{-K`P#EzY zdeXV`Uhukx7uKBde3&}0+_{gqlzNnEcx8q;*H9^AundYSSsi=|#T`x-Mpc_JeG5xj z>|Qy&PSH;foGH@zI8c0AX9`b~*X93Ecjj?1ukZhVzh|at+NV8Ari7#@Yt}O*T7)cz zWGg}l+0(JiwC_!XIF>dkOR{D^Q$i}lu|zl_`<8vz?={^s@1}6RpL0Iz@BBr2oIK3+ zykFPrTJAgb^=zqe!5Habjs6auoGdrlN={pKF7D*iQbV(|wA113ot*p(d>yEE1y7#f zYVD=Dl!Zh%bD!RMQ5dZ?XqXe*)c(pb3~=;lTxf4Z$+|2-7e24*dQ_K$Khk-^XRe# zPpFDny`E`&SoTYGnDMd$!fmE4mpnag+@(K80$ySuEPym@@ZM6$c5ZsV32OI&&kb@MN8xsk{zX zE|rctc|lNS>()j8C0n;xq&ch0?N+UNxI0`+OXPJHnc5^rc?K4#>w5A!E>$ZJ&ADLV zX;#upP48TIbFVe56`bzA&TTdHE~Xn5YY2S%4V+Wa(V(V?$IhMMTvsRoSlJgkA149^GmQsrJi1_8t%(Z_IW~kOx`-24!V$%XF$0hXrXUlAJyIL zwZNddJ@r|=Qe2nvW_z8crPHi2k`PNy)UKzGC%m({eyu}RRPuW^#hcE*+2QrUiiEtR z<{@1|U8u-l&qAk~?#K42`|DZ+Pv-i6P#eN4HtF1=gcsx?u}O6nOx|ovIj2Q@(Y>_r z{Zo^#27(E1c8{_c%MSzl` z%_7#@Q`bX-N7o$+O5C%4oXfcBXR7(xQr!0-;EJQ2=qpLtmW33Z) z&sWpDL||-S9j(!+VnTR@Kx4Qdy7|N)l@4iQ&Ay%8Ow%N>8u6BccN>X?_7#r1>8h1` z^4{#2x8d*%{hBL<9bP84<~{1y)<+Sp5)C(DQ62Ne&XMDuOe*l??!4D2l@`tR zUOxH{c6!0CWIMjNs#gK~s?&#Sy(P=eeYnL>a*Te|+pay&Pp=0rUys{Ktg2~AWu6(E z-eTCWL0n%ByUxO?oiCr#WK~DLG<+l6TFn&;EAR5B)i{|4iM{H&Tl{9$j_O%a*3O=` z*pbcCwaVWUZta_g!=y!|naI;NT+6t&--b#7t)SXWgtURu?#C?nr?dfW5g<}L5@gf%+k_v3;56Q;!ls?*G` z9PPl*XZya4a&@HgB$StnrCzfKMHf|X2gm&S^>xm2{)xi-0hFhJGVK^G=wvUk@AA>Y zL3Bvi+&-k4J*Ck}A~fR+3v*)&@3GPko*6U#(}`9t_qm0Kog|widO@G4W+r`A+(i7U zf@7BBc!IiqdxMUQPWvaoUuE9Lo@70!tw-)i=8ZZ8IS)5cb zyQO1jS%LUvcmC@uOMX-7-KJL6{=I6mAbL_~zGZ5NV`^B>_bpvIbGWr(+=^-1{DlL8 z*!gYwDCtYnwkm|w+Zg_16>uT!DZcZOcMYVR0!@GG@+LG0g^FsTN zc(7-ljyL~e6hEzkuDQ+8%Kyn;Lgfqi{Uy9X@52pgb~AfxynAYs7L{JD&a&WrVbLR{ zOYwRsyKWapL!csz7PbwdMg2MFtoT#i)Tc>$cJ@-$Lrp55@G>uu~qZc~q+PK&m=QgeTrgW^<`&lYJ?> z%y`{b@iaf7@9*)Qd=n~p)T-c^weJ&7rpA;%h}JrlaKW3exh8)3fv{)q6KhRcx(w%M z3Mn@MtwFIS2ZdABY(0V6iV8dtP92osJKMIyxNPDp}7nD#_-Ps z_Zt+$(tEvO-Gl$Qa?OhaYu8_0duxvE z9%pK8XIiZde`al%mz%DaFDp*3?N$lx_On4m1uJ0%Z|Y^eNurf3njY&F+l*#U5UOj= zq4Xt#RdiJ*@R#c)|Jr%iy4+m8wB33q-3?r)4I3A4z%#HfdFyU=*5`U@3<#nQ*X65S z8@=(~;*Afk8ehM+*T#(W`X!*k)n_iFJ^!BRZZb7IO<$X(v9JWQ z)rj&*KxuzW(zQuglir<9H<_N^{7|~twRCfFI{#6+WzP&NpA0sg zp*uap=1_)hY?`1srF|`X3s;J&w?}A(oA9VEa&D^`}WKl5R&B< z(x?BrEYE9MgVk->RHly2<{>_tM}}<9)!WSX*z7HP26l7m?kwM)+5SG+i!HOKtjnH$ zDBCwQJMd$6Q1dMVLo*z0wk!WG+GCfq{o$)CZg!*9Wl3fQAm16i^eu>>+G5whZ7XQ8Yk_ z0JQ?xZJ2HtVc1wqL82@`h9cm*yE!`J4G=N~0ZR^#40DPK1F8oYFoc(f!G{xv{fAE{ zgAK65FteyIpoV}t0Bk6np3Z2?6C^o(HM(E))AhEs-LhP_3RffO82F+fQH z#R0f`^kQI;NgD{Y1ynOoh(K)tg$R@*;Qdh4l9kS0?HI9WuVf6`U%P!D0-m8fkFYPPM|b_Vgedcs0_gSqc{NP4o45e zj)o4rJZaGE+rJOx3tZ}n5(H{8sKB7!f&vRXJE?)7K!J`Asu`$GpfrJs1SvA0VgNgj ziUCS4sL!A(f@%rs9;jxZB!Y?rN*_!e0~G@l8BmuXMFW%+P;EdBp}uq=uN#oc0Ez}E z4v@ORf7kf`gFpR;^?{+cH~$m$frgtl_ieqj&HLNEU^~krsmx8A|AubPzhp0Xc2B2C zb>UN=wEg~GaPM|$d~V;<4*GO63nA`&C-s4n@m%_=ztqFRt0q0hUOw=UIk9_FouJZ11G1JAl+cdAZG5b^QIQg;olUK{9 z9jDbKY4v$1S&zN9p=FYK7xQ*2 zuQNQ^UEXcr9~ox{w0|lec$l*7sr=%Y$o9_;)G)VrkvB;c-JGNEwbi$HSM z7k3V1tB$?z#IAeYaezi$ian)uzrF0@n9rj#GQpR~K${K_#S*_$L*Yiui0yKcyJ z7;f|Hlb2=or^Z@o+ML&Ppv($t{Lbnu_S7#KLeCtwwNw3G@D}&I{kWOM^PCQbysmX0 z8s&fgf@$l|uXl`W)n(su_b9u!mHuN|cX9dB^{FK_eT~ZNm1Dx@zjYFxJL4sxEW_tI z2dUOw>h83Bjotg|aN}ntbhLhu^<~ZTAs0$De?B_2SnbWnE)Gd^+*vlHCdB2`gz>tMwf6D)I$i2)D|w>6D#`kdN^adpk2^Xk z4>)zrdoO?RvMj02P~>NwR#jnc?~H~Ce+{smHEnb?RsZx>erxG4 z_ve}`g(9_kqAt^#^E%4b8EV7Hz=N}z!%oG(gRGlF1|E)^f2^$^c&Lj??MIuuh;}VL zORX*`ZmstMtJjvVC2sv&cT0{LR-R#0;N8u}@_g(lGs^fBo{3$(oeFT7#LE{UE7`0a z$Tuz!RPlKXLjG6zmc3sZUECm3l$bBtHGCAOAw^eu$cfM^4o z$`^@C%Cp*Z@6q8WBT5n)K0)2ri#x&}?I#CkYOF~2=iMs=N%1vSJ3}KaYNfP!rPTSE z^?<>$X~&e2G^aY+WNeyl;JityFMXr>?Y-6Cx>~3|Uc`3PtWk3iiM1SScdA?8Qt2lR z7fz?bI~5CfN!Y!9WG^vH%~0>d>qm8{2s2M}67;PUsTlCJS>e{32_mO{Y@#R+= zDL0{|RMBf;WcLw`#vA=zk$Hk1&t<*1$g(kwZ82@!KYTfx^ z{M`b+Zh)`K7&l6vlR=x$uh#C7A7IhEI?~X(ki{A*LZWKBB%L0a zD(18Dqnnir1+xQ$S_0oteKRM4T>#}^P#D>~{O6rZ-aHoSRZzo()%v^hITWi`Ws$iN z>{?OX_%dHuH;&AUHH7cUT5wCs4JnsWHy1EI1)o&Z6`3j=C z_S1b7B);FlfeOyblSFy?+qhE{9=NsKU&RSCb5ieR;-t<>Q&HoHXqJ1CZAV>E4^1nR z^ni}qoKP{fJwSD#)P?<(q6Rwp*8Qf+6}4nZX{`rB)gA#mjLh=I&94Uw<`}uLgbtDp z62G$xj?LRh``-PjRZ+&qpfFPrdd_APHR%9Ni3Fpl-aSf(Uk*(@9XLh2#HVz`{!Xju zw8`2Q*UkpdvSY0)ml#&yRa%LQmEIh6G3BR9`--_nEdK{aA1X@*zm4~xD0bSeP2w*4 zDw@urf}mTfT%MF|HH|0!?7Mn7kFrt8h*8DT))YgHq!Rdpcw4 zC;I;2?x%Jn%$zx|s%lT2i{r6ZcGstMcH!UVNX;xoq5-+SDz<6!onx2wpZw|bePI&6 zxqq!nmq)#>@q#`GM;v^VG=aqzst7e~ABlMrGH7RBk7AFd;*MjB*s+vo+PfJs?R9F@ zTLu(5t6OZ@y)$HYAEOe3Bcg@-jQt->;PZ4ndP`y_^uA*{^^mY{-kVN4-D=NVe*1f7 z-v!#2z6jiZif)~Hf2<+j%;JdVp?lrWefVM^R53VEWEc`Zf3prpZNcZ`+`U?qwzpKx zqP9Tdk{o)x1FdE@sMePtHq}8m$k2KWs)N{t7F^4>&soA2bDzB8yL&~m9AdaHqIS4MYx{B1cwH$`bgZKnR~TdN z=dL*?>X-Mi`6h9vZ}oQ%?H|rsyApjb&U+c0^gcByR&Lzt*VMGANUBV&OTBSpy1Hnm!bZXM!0({j3omx_W)(~d z+!@&c$08Rxs<1-DE5UKVe8I55FTmfy8Npk@K*8+5fWS(?yudY}$q3_s1#LJx7(f_0 z7#0{Stf|2&!WF^;!Y#ro;>iNoD3~dDJ(wvtBeZB?58(%4l!%*yWg}zr@RexG!t}xM z!9cj&QlQwehi+Xa6Fa|fpeqepBPOeowXOcT5z93R{e3}CO` z1K>L00b%H17||MrJA-W`4ip{@_6jZ!77wjtEbXD)49f-w3af}NEo>Jo72F?89E=rw z9Bd%5axhu&l5k$|lCWAZmGEV-qOf={iRiS#g2Aj2{{_EBY$ItX!#u*i!JVN^tZW8J zR~McRHVwuQPAw)jk(f1@P2$&J*5DSIJ}>cWFmbSo%B~Hr@E^2J|J`qEV%&Ju^tZ2= z{MAYI8HsNHr*X?X=GO2;LL=kmJi#Q!x^gpXeFWWp{5NZABP;!7FA3p7r-nWBb@O8* z2HNROAJlkKz2PMx`GrpNCKzwuQ=4B{$=@+1MO*Qh8_jYntUx~Yr9=Gqt>ULB$MhPW2UO7A6k*;|H5bWHui^D{p_M^ z)5#wCltV@{R^*51Sp|$cpLgiVzDk*KyRWr4c~5JxhBUp+ttS-Au278XAnKzGj?`kSiZ_T-}W4|~}E=3)_FdlWZ*zBplW zrJ&;k(^q@voN7jlo8rx6tIp*z<3=8ne09e0{`Oa7O-)E{{G9pvyxSxL=>^Y@cGBOy ze%c^^GkHzd8}ly?og~{skFx9LSXxwB<& zCT~e>en@{%V1r=PQlHK_E)7mn_yBjN> zx;p8IURgTmhzg9S2@5H$?nTo~(d0G{>1scgpFx^uPM&>a)h%?Nd zr62A)fAzKuv-@tRdNdy@SY+UCuD1Ks`q$@MUoR7~dD5e8jq(zsJ+my0bNf zTGenw+Nx8lnZ1xU zzXnPUZHHV#y&>IL-iEwmd7DT#$5ePnn8lsJq1T|e` z9LQ6k*id^YJVYDf426e`@7}Wq!Vd9=$V0l3zd+21XhWhQ<4}8~Ge~Nn;m8G`_7H7I zG(;XM4OK^u0}Y3;lUXq22#{+iJP~u0nW5WAg)r)cBnT-36dMTmDr0f(?d`629(dZOVFc8EX5ub}PFaA-T`!cfqKjHA2?Z6`{Of-cmX6n7!!M8=`v zP;5q`A>c&PQI180m5giscSZOw{q!b^EqjZlezDxURt@itweu-w-eUPnS1`s*${lKG zmu{Z2jz7?CtJW^jJ#zyH_D1&h6dbVo_7)&2*!{wVkOf@=@9 ztjKuuXj?u}?2VfrWo~!&c`V;8b3Waic$+o=0ZjYbrsTk1SZt$s*Bkjfx z9+2{6H`|l!mOVSb8E2}$=;Giuv=b}Ei^jB0niF+>1s+VmZrSYYdxI~|_Pnajv2w0E zG{Sx`i=W0)({c3jWWRYv?^rQHt>q5;`3|k} z%ip5ZI_v$dlon$H`-ODe>o_23UdnQ5PM7erS_lRLUMj<}<$cCcbs z@WAj^{Z_bye;nf-aH%`DWm+|Tv}_&OEju!3$CWOrcX<}GhrLjB=s2Q?XT>jMwGHe0 zncN&R!1<^7Z;sCE_*JIZ$Hc7gio$nCeqH+YQ|+mab)V19H0}F^?3Q&5+4km(2JYx~ z6LwW0SEKNWf^C6@pepczIR2pz zII!XOa9ZPxhm1fd;IeQ?$l5bs-aHMH)sOsI6|GEc#ukn8$2hJ843(FCRUSZ2t==-pa8NnC14h` z2+9EUfaX9zpdOG2Xfl);>I4CY!b8|0We_?@4Wt#40?~jnL#d!bP!EV3?u~)?z;?nU zBMX3D5q}6P2yuhXK;NJt5F&^n+53WkK)xVHMCG6}5Fca>5EzLBCkDzocLabTYpZM0@Nb)i%*&ZF1>3Xr)Z~vJ-T0M> z-@EtzJ-^UNXnCXKs*dx;G{yGHsm1h4gzEKMn{PI{M7WZ_B;BdV)d(CjpWb=>99D*W--26uw?{BFoMH(fm!E_G5!A7K{q9zPCZ4U~L!A z)HbkobIWUYF|Bnob-j!Z?RpAT&CK%0aZNAg-r1DOy!f-kq34Q>X~{mxIo-6XMQXMt zX`!^Hx1ai>?RzgzuOB9!v1aS4`4(z1Zij9J9X6U#?>V3B_FWgUc8`mStL+}L9WC>m zv)!v&$hM>9%|hM9?FD2zx)#mCHIK%3RcuEuY({)T{VSq1)E4Ts{7por(uV^U=N?X4 z9B~H@9>gJxgA}I|_BV(vz(I=B0Esp#bT|WX&fqx0frhgSXC{tNoY*+GaX4e?!fP1L z>d833anO;O1{`HL4{wGoZhGa!WrN^$Fv8|E}X+SFv;nMq#kEJBml=d4riQZI60vUI6NT)I1+Kr+N1U{zOopQyXAurAoJBY=aU9`T#z~G73FjD5nSc3-#KkM3vbPUo#95u% z1@zo-DrdgO4xgQs+Z(@q7;)$?1+3C4!(6_IM&iKwNqA!Qz8PQkoKPWwCFBu+XsblGtpHCHu zf^MsOtXF<)+nnRgv(HJRoWi2s_Ex+iDqDS+r&rRR(?Qb&6U3ZT(Ph(>?mYK-nr+C^ zUTB07$pG7IrP&6(IX)3mI(NhlykyaTJF}@eZlq?0z|qY=DxuYs^CJf>Zg_0_1z%zw z`Cg(IEWKE$+k)9tUGr&-f5)?XR{ySN#3bA^qit7(tey5){?6}DRoQC-7u4P%cb@kc zblqu#VpDa8({JnKC9;;w0}flgls~rpQcyqsWFpIGo`bE2a<&*x4wyg>ph0*d?f@AO zA>oVyJE9&D2W5uLB5^=~L)CGG8{VOYq!VQZE3lCeSR@n>bF5QA%#li9UUQf7;gjWdI&Jvljm7oi-G0rY<%XUrph6e}h+mYtB85cR$HL2)GH zAc1W9KBy8Sr%FzjmX$}vol8nO^W(R$tIoxpPyGH{*b|?doG|^~TiC5~!dWa^{|CDo zzlB|zqBg9CVx6BtUfN}z2c2utHlUjC>`c)KK_0ytzZ+G?F%yU_SmCT8nfExPid-!> zrE^%_dh?_OJFn#~QoMx?Nng#gT1lz5F)+xfes}NM2_;FNt-iLJ&7;iUe_hp9=|TGA zlBJ#3=lc$~nNcNW%E%g{)2ynCSjV(oa>l0~IV8XEWL%C&yER{6GRHS$MD7h{JxJWO z)?ip9&DMJFyxIJ>-%!KjT33te#Cs?7Zg`M>Q8Pz9=G`cZ{(3J9nDHM+&nVtHyc<=2 z*_kGnRSzAm_n>Uw13JaC*vil$^+xiJ6doBj(rN$*SWp^+lK=?d3&I7709i!ZDH6R@3`y@ zif6ISJ>T;Vs^|&4Bf|IPD_-1u*_AuKWRO&|nmSJ>*fBjH<5B^qNaDX~a;~C+loYwN z!?tJgM?4${-K3aT-r_9InH-hFdTi=P&u4h$4K1G~Pl=8h$dLL1q^g?ci15Gw0!TrH zNMV@-HM}lj86-gg5SvgQgeNRIQbX8OI9tdF+$Pq4p(Mxx5%ov`;c4Mfk$9mFOl&ip zEeTk-Wn^aX#|+f@5$Ah#{?nKLQ^Zg_MCmU<$rLJP-$M zfSaHO+(8?NCy+ru!5LH$Gz0PP;)SyTc>TwC!Vgj)g&c7ha>QT%UXBe@=FEr?%e~Ei(*^N6jckkVQz#v8aLEmcp(tPkV zimh+%B9z*vZR`}vZ>5wYdQa(}N~?Oz&*6uLYenTdD(8s$Nv`(nx%bK`5!>UeTUW*V z*g)#cg3hI!_UsOBY1O_Qk;+f4>>7|V-J83H7MOR*$Kr)}`>v9P+dlhD-XBL(YIFB5 zoiTgoEn;a8%(;1NEI-ZB-uL+MA|0h1F)Xk(E16aw=HmFG&~B`C24iXa-0k8e3_E+} z_FN5lQ8wxK_Un%vlv&z=o5s&uJmpd4p8DH97fruBe3_z)YO1a?;^?RP`@ZUWllQjk zU(n*yTd0zzsUoD{@#DJ)bwo9Q!o~cEYCr^n5Wv8Pz=9kQaR^v|1`0aJ*U*?iriSVa zga!3{6j@NF!5%isF{JN+4Q%uU&@O?e0#=|HECVY*O_&1FUb!WtL{Yd8ULXn;6SPh^c~8r+vW&pmboCj$-> zBx?T-^yG-CCzjmtJw4WFQ^nu1VFB*$g9iNxVyhF~B%a?zY;m4PKKon5hLy0sL9FVJ zTQ3^D6Fpd6ns%JW)3p{2Z=+~?5F7TYi?I4u5lh$5sHoIU`Q@qprs|G7VP}z>TSxgj z(OYFXX2eMg*Fo#Lx6&G?s2Xjs=~^6?+3n%b2E?jnuz1_uCnb+lOe(bgwOTz=ucbDp zL@3y?@*s0z(0f*Z09R46G?tyP*ywq1_gz`lC_6kwL?2D=u28M6=O(2pQp}}u-?&{n zFt6T*&7QP>&R27J-{X~9-UvBj&w3JkCL;=LO@YtRrud-Fh-?V4gzyGL2vLMFvj)Z!HBO zv|zZh((K7Tv&zzab?=y$+2l$m1f9q zk3YVB^GbfL^w;ag<_)z|JJ!8@)$(hzju{iAB4tQ515&>=P5KbCgenLH2mn~Xi==g6 z3lM-a5CF(P0QevTAp8Lw2mo^o1b_zo5xpW55*nZ$5I2Sfpb4rVWy(bd5JvO_Sb%1t zZ-fjag9Kt_IFQE?KH&G15dq~O8=!!7Wl+F9!wM-z{F~I~AEB_JctN9h!TKkQ7rAj~ zlal@fsZ(d;DiXhoRP{FcnOY z3)A?CQI?xytzV8i%gn%O$9P_Fh!Hv$Z5qm4MW^wLmgz=?A38AY<_g9S{c4%iLg9y& z%|0|+?uU*n9(^-?gZwF$8LFh-P~Wy}1y1%g;slY3gBK?)Oh39@D2$;F!H5wE0UHbt z1Ri8=O<*8N7my&z0$l)X1O@;`QafM<%>n};jln<}07wHu9~y+oT+;SKxHGX%q8va% z5tx$OKN6Auo8O}_N9+=-VbZ{E34bqh8|~pS_|NJMOB3CHV2&o|4b1oaCUZMqLYJ0Z zZ;&imz2WlBYF2F{$vT^UzQ4JnxY0`p)~C`sHQo*M*S%b_vf=Ka2o?Ahk$9BqBvKq) zQlGgsqiAuaV@K_V%&q4(f2*xb0e$R_ldOUJ>z_i{I&RzGC;Iz?6cZ~E*CUTB>J5Fj zt+`pPFh|FW5?jfydOR$cbhG?m{fz1H^S1K0jv`G-AHS_kIC=w!^#CFQzhOE`Z{OAu zEEpzWSr{genlZT;34BmO;+@1eqMJ$0NbW|CZsi>9Umlg5I=&l!>psiJy${#*N0)T{MI0Iy9uXN89TOWDpO8qhB!{IY%UP(CZ$KdtQ(rJbvU+sN8pE~gw(V-< z$Jg(mcm7s<;v}g@%l!DD9qi-hFJGy=dadeueU{Yq_e-~x{J2YvDaY)^JEmu&`m@k0 zO-gIL`N|o~%t+-7E(}*!(=_oC+3TN35(Ft)%t80sxt!j;xonNStZ6g!uJJnNOwSGs zr9JlMoR_6Z<9uAK1&ViSe_mNwI!<90jLIGjm4{r}YVE75W-3Ci!_Aw;@{lu5pz5o* zzsQ2f4M8Mn8bstiHz+?!qlhNN6wXc3R7CcH9-wjq5ZSZ5j(WThoe0wIgTqAYfn?-l zD*@t<0x42_wD^#+Bb`A@5XKcLHBLsHt?2&=w{{HC`A5BTW@Or z{_aVb;P_F=W?q6zl6#X7A#J^%cMRC+dZMgJ$>zW*`gCcPQX-90>F|v|SkD_J(swii zg3^wwsIreN)nG!T-cS12qzHYhMLhr0_R2#D!v;lbvGHz`uh6e#wIV|H;#7*Xqy*08 zv{|RhC9NASptU)nPqi_7Q|p&2;&^P2ZJ{`oHn@a3d$L+v1xM`LuegBL*qX~%;RXoP zeP>l3V=kaQuI}yTP{auje<@(vdfQ??_|oFk$if)K9Gz=IftTWr_D^O{e?6*bS*%&s zxj*v)TZY+%*W`}&K66Na+));YLlB5DjpQ9-j>`>6^&j;Q1SP@|rx`*JYK#~{kimB{ zJv=10D6SxMnsoAD;7BQ-6cd(C;t2h}8q@!k?*~YfKxk{E0(mb{K5PF9NPYtnJUspcq`-s$KLBa)4%eNm zZ$R30%HafcuJ^hPweH+3mvlboFt!$Wg}`kj$G0tQ4zhI=0N+ zpm^-yZZpC0@O9eeOU@i@=#P&QXqhU@F7N2N*4Dgb_&xzzuW20xZCUQyn}30%9l$ zYQ*i40w}?YsXPJ&R34!Mgfk47FsK0zct>SXAbcRFKv7be5&(x`5D*DgNI4SDwFxu? zQ?&m;DvFX!MUv^S{a3K~t3Q-eXJ67T;;7MsGk-Oy35;KjJ)+8^4iZ3r!$H-Loe-Kph#+rgjeNxbcfTV zh*IB-9*MBW`)1gtq$s8tP0IQ>&Jo)rq(K2W(Gjl5TTp65$pk4N%pnRSFoCFukkJcS zA*9~#F*SX-J7mO7%KE4?;%Em=pp2mjl0`To1VL38h`=Bz-$SXI5Yz-8!VZK8_&|sl zo%wTukZS>-@3Qls(Vu^5T{078$#Z4O9k9lA$<1e?&m}x=2+mKRzkIEu*y?81`5Q78 z#qn$!GH&^l)H7T{?dP1(WTvzAPl@KL2i7-gDsS4w;n++4IGC86$ZGI-vI!7RmQBC| zp;KtIn#WE?1kh7{n1(cd(00bu zZlfqM`_R(aiVoPjh=ZdQb;+NsehFvllD}Vnr_IzQeJxnddlYraWkv+4`k|`tB86lN zr9DUo&SsJ=5nK?hDCD7Rg0W^B6sP7+ha*nGjnHcoLMh$0F219@Nth=5Lzhhin* z0Dov76NOl=u>ZGyzoIS~!HSNFVaF%LNB$F~{+!q|iHU!TRO}Cs@}eTx zs%9K->*^b=8aI{eOZ^`?_R(HqX%VH>B6MtnhsAOKtK%m%Z*QqpzbN)xrMW{iyoQhJ z&v~j@@yee{8=_p79N6vmi(A|7S}kvQ9jiC7&vN(lHSXKFwnF)h=$o}04W#c{+-@lK zPcZBp_*qkFH+S;zwpRID-|l^Uh0IAWtj^Wr_x4U3wV6R`&OAfMK|fbWSrl*7(v}QT z-L3j9KD=Q^fuhu}v)t97uL7yMJ0DXLA1hvv^q4o{7urbih!oqSK!H?<9H|xv5nF$# z)ci)t8MF!_B=_6C0YpMT7!UzBM5`cFh*_w`x8D0(kp#n;%BF6w~pZ_~xDUhPk zJ!Ac|-LqByhf1yakxIGk{DDekbT;{pN=@#WXs*&!r82p0Ldx%WINhR8W0m^ZshOUw zqevQ_n3cd=a>PSXi9`>1jA!c$LQNAsEv570i%XX%N|ENC2ZDAsTdhvz+b*>Anotw$X<|teSVAU<4nmTkbWlJb z3W^B5U=^Z9Z~{xn_@HQnUXoxEsNk6(WJvmeIx|cUIDr`eBVaQf2TYYP2_PA!C%ge^ zqH6#iq6X#(dq@C*AAujJGaRBmzUSp@yFftFP zaxk(yHnz0UI8>u#aASGo*_cPQ-zI}urxLxWMRDA3lff13t*g^4S!!LCYiqLV>mA1s zPtIJbyirH3#Wi=4iW<#wk=pyU$yn!-sW2)~u8^OlG{;?wvaX&_jmT?QQ7ykyYWK10 z6L0$L*|RqqF!R0|>9l|yZ6`>(_q!xQQSndh{QR|gH!9+A;u+`5p7M(S_%k6_*{be_ z*U$7iwC`yZnbmkVl5W<`);G;BaP-k*%;U%B)dGUj*?PQ_)2ianDn{mqQOlG@%Xv13WTjPuK(b zMBE5?-C+6+f#Kk53 zncIpu6MHV{du}VBgQ$>F725M_wej%ZT47O`&WOda^3?EDeQG$XEyqN&o7*oJlvBgsHK{aTK5N3Z z=mx-aS{#&CN1S@zMKKIDeA~0Gp)Q;-ePO>bikjQar`^I-Rn+xLB2OJ=-s8CDHiT;y zEtL8lIDSt)Z}{%{Di%+Yf5-PyMYUqyetwn1BaPpVefjhrQy?9Oe*JLuvr4^=AvHYu zev6S@#|F5ig}!zVxD`?Vcv`5OEp-`N^T5{R@8pQUi@?OhK0yu4fi@68*0f}jRNuED zJr-aG5WxW;ApAkyfC57yz#<@m3@o)m4S~_Ossug&2k-){gbyGKM4+4B<%6M_fC8qO zvN+%-!~k)S4a%Wb03CcoumF&(Z@y#4e+D4@i~s09hOO{_!8k~A+?k}LAKR{nXX4H! zeows0PbDVzqS^Z2h}R`U&-r}6lSz#$8FO!(OtfqA)J;wT?fcP;X&sjCeORuxQKY`0 z(JqVEFr8&gUuayJQL64>zpxwon0oe&s?N_kA7cg$qlf=YeHs?nV7qoKOCP6bSH~F@ zqz=2cD3i$%J8y_IP+W=BXW@R=oAOR?G`D~WAGJYM+a0Vn(Hy!!r1eLx1^6hCREm&^25oHq_y;-lzg$J#~wEV{f)o=uI} zY9URDc*!&>=gb<;#N*^;I*Q5~-8xb3S$b{UPR1wVIy56w69S-a8-X|){+;txdCda3 zKf(l4qWF;Uc_NF)-~{IA&{)Lz+E?g~Gm@n0h!-*=hshu^7sqT@z{Mjuz-%=}M9Ekv zVgciA%$fz0FfpM@3Si1f5+d}wNfODB$nioj`jV53Fb8Q_9EjVFn?AvOTa>Ks=QZ_%e zq`I1|HY@Rn-H}EE;H}sbPkK_-p+##H4f_Ha2h9aeE^1m@lnY<5JH{>Di*Xfeno*sl z$GI9h`;B}*)=azHF#0-Mn-cMdKN)m@sW59fWC`ulig?tdex+>Ys=6c7@FbAHYrb&F zn%(lN>U`#xv$@tKz4sqbl*2w*_P)H241hoXqi|MBw&LQO-&$S2^iuu?*`imjm&lIA zyH!qPcmx;JQnndjsoVE`01(1a%tSVE-^x(^)mT?{14tEsE9REaJp8M0A|WB$PlQi0 zrOF_R?I%L%|0Xj(`di6Z@-cTSCuh4N1Oo!=<) zp8gU(>vrf|b7lX~!>W)wQA_YBQ`Sk`BiED%8`+c@|JOAA&F8l;EL}6K>7(e`-)L`7sq%SzYssf*W?yMn7NshXxYdgC+n-YO?2C&zBka9w zZ(lzruY=8q+m`6KRN)^I4Sy{;dqc6W+vVsWpY1Q>haO5-0g?%udT||L`A~KWsD;GhZ`e;=xNl zxHDo-VB1-?G2hwJSQytX!6u{WKD>VxoxSA%b7w?-tKRR>5mvc!H}t$=i{_@9+A8{o zkKADP0bjl<=THVZEsfO8?q|Q2bwlMVwr#Ac{e&DIyMuM@6}N^~{i&phJQI@&!Es8> z#Cp{+x}kUT>N3Z~QdQt)UoE6pB`Vz+F?q$jspmGGTg_C!=FTYny={e&4>J?gyl&j*|DES7ge-(C7Va___6Wqi$aAlX}e zX?F`qacHVIfCBy$!GkR!1UdSKh+D9LXhhf}#;}PFql!H^+~0tUc#(JkE?`CY0$d;h zd?`Z#$_N)=4QK#2vSI;103ET_;1To@QotY~1tgMwCAsgZ2`|7?IdLSVF8~W<2(w5c zF+_>2Jwh&7J0f?ce3u|dAu>OL4>13aiB~--{_WOV_uT%(=P#4;+V;e(eHVW~%Jjf? z-zQ~0UXD`ZZ>CuZ9Wt7hiv6-^O|9H*+mAI&>dHv*mF8|fk#LDj>XM<7$H%csv5S?W4%OoFFw-&7dJ42Nrp4NX$dXo*Mi$xuuE{llLvlQV4MOk7tfEi|pF z9^f8o+u`J|ilLSk9`jG1iM5+=#0(B}UG&=jLQ2DBQ1^Kf5k-r3>+ap*)m-s%jK;#` z*wFck<%@SuHi}da$Vpk^o`0=-yn+-@GyRitQXXH5A0;PcgFPWdUzVFGlfq1gleKOD zf=~ekU<84U&_z@uig1Yn*0-^pjUdE21FQ?yKhd2BL_iG405QM?BlrLuMoK^p zAObQV5!8^J4QfJ2fsTMg0tlglG2q~Wkq@F@0G3D?uq7-IDIqOJq96!S7*te$mx@wu7FtZ7JXP6v!*BVu>#Qfr&66jF8vN!i zLH53;1(+vns6UN$l@^7os#_T>>Aowo;YRKi9BWMz2}QBOP7YRjYI$uo*JKq-bENEc zp(*V*HtZvv)^!x5a1V8{0VjeV+P$wwiCIk}j$jwOFhB${RF%hnO z?+6p;WRnO;0zfSCLB9~;z!NY+yujm+LRt}N^gnTH!H9wJe^yx%#Scsz{JltvK%}w0 ziL~Hi_irL?!8Q7Nqe#2`toDoYMIgLqn;asQc1cU)3MaGmW>U&+x~tkX{Z`j6Nz@OR z5J+V$9CYu*us3rG)*SfMz3x6Pi}{gB*IPZ++i zP95EF+1Y!FGg$7Ze;H>hU#Wg(Ob*)mxAzJVJ{FC_2Z4hK`ZjhDHCVSnupm+pAP5<9 zTLxkTL4gC09K8qx+&+USAR+LNfBrv;i+}LzMAE0NaN3&f{CNM=|9knSQS!TY+P;vZ zKa%t@fi|-`d@uR+jk8T)eUtnS|4#Djb*KY-cB6gDwVF<6?J5#)Dw)gNW?gTyYV2P$ zT$r|(n>gU;FGrQTzm@S9_XHR;Ncy3k(L?JmgPLA1=>uC>l^tbf0lSPmcjl}jtj;_1 zdFs?lv8lgf?TC99<=v_F`?kJk!ip^(#5@Lfc#@s`vG_$fH{=D&+I?j2p+2LPB798b z;e)6lQcdnqLL4=@MhPhPdeS1MOY-V=E(D*m??%A=n@pkD=?-KK& zX;lODgY@R?g8KXRn2hk}gQ!Lvld>zA-7RE5Nh#sDQ}^O zDmuJWN&l{`9B{_RlwD}0bUjhCh>82gvh7!NvTX29`m5b%*xb0tj5)U`ZFPmFG;LQ~ zD#B+&Y5A2<4LvVbree&wMf;O$*qWBwW>(Ba4?R7k%sTFbnG2qOZ9z^Y{da0de%>X& zo@lY^oz1H{lf|68HKUfvH{1_H&}1)!+TjDVtwNZ6Q6(bBgqeKqtiE4}SVH8$IH5

fb8 zuQZxPdE|4IRrOdYoIV|BzCnEHIEO~*RJozlS&hflj!yHFTq;&-=as4O3JY7Z zDQ?eh9!i7Bc*=l9S-sbg2*W&G`!?Kmb!;6aD)Q24nYe!i6HaAasTlRIycA*DDz&Qx zaw|S=vei0H36&ufX|*-jdv~ECohq*!Bw`tR#oOzqS07far%c`4ucfV^dUoyodMkeB z(1L=6YsM+IyLAftrXDV+f11+xSk)c*^^HpcU#vZYt9j7QTd-7KEynv|luxFZAy92^Fs0g;EkL@@V+AVXv` zK?Vzs;D*A&VMBaLlq2#G=;S12hC;|37727RgeCLkiVZIuugvZWX={`D4<_yrtO$Js zdXtd-U;Ayn&}Uh%f6!yQ?U=vp-N)Np`r%1Ec!u>%yYHRUgAC1a9>;e`M>f-F%&Rv? z1Cp9e9WNv)Sd2OOky1lHc&75QV;&}8);jCU`1qVB7q@a|&=*!#(y%3S|b!FKW$ z%DxWmRpgHc{iH$sh_;NATj1oKoD;^mW8@xV5{O-NRj{=zNlqcCAh>}Cq8YXtZW<>v z6S$}&;cP}k;*wD$nz#@VwO`l}^eoBvJ^VFV+pyL6OmM*=ZeB!57Ks2UA^}K*GHgCU z6mT}-ilLOy1y%tVa0O$)6-t5%17S>g@QPs!7y~U#Q~_q7h3kNn=|cKT=t9vLfDs=A zwjnP-9i$Q3|E*{#CO{|}gZHd|YVdwzY*}LB>BhIYDM`lGve+{T51u_&mW+#3qeNDmWp_7ny0+Cmriz4GT>-5 zcBjH(^_%mfeSK4IT-@o)6mMJVrFId7t88MISbIJwjh1HaWjc+bS9wRXD51K6n%-EU zaFl3VqF7OrO6^?s3ng+9pHp${vTXZ7g#-6l5N~K+{n2b`0W-e1sF*esnwfZ6^;5kj zS*n--$vobi^5bZ*Z8RN)9Tek>vzz6GYaNd}W_6Cduu=A|a_*PU_0v`7ep|l#qw5Fe zF=O);$xGGhr-TPs`%R-ly2_`k%vKwaR?9{iTrU9E{ibj!U&Af4Wc9D=pa_O5J`jh9 zH$Xv>Xr#}`ory7nA6Hf{;0YwbBeVycf=ZwYD$!v9DG)QT2@#SfQ1#bv17r{imWgbD zQ!-}&Q~?f91<~M+;PdT%7y~ksG!dc+Qv@hf;eaq0hhh=Tn_xw{FoZ0^)PJUiTwknk z)HF#NAf9{BO6f|6#;&sQl@80!J^xgv*nSLmbMuVo=USmB{hH|%#uAa7rK(i!!rgEW}KS9^mi!Kc3va9;b zwjUK`vF5aftlcgV33jbef>O^yXfatV(d3TJyWp<4(xLRVzL?!ttUmMNUPZCO@Lsg_ zkWB8S%6*FM$Ni%!>7Py+1va!S@6EiPyZybQSTS(-ufHnZy@?NeF|btLvYgsyb(F#u zw2R7KC%^x#+o7JdPsmL1n6bo@y2&7U14!;Pf`pVbNVqdM^g$@vF&*n3TH z7ib%$xDQ2XAm2U4CXSWX^nUJc8EvyR?{9oRcgF+tp;Bc@@3b9u@e z#}nJDXtgmATA$5O2m;ECWiFn&1AH^>L*l)Z`Xp+i&1H#`)D}1FN8YGe*-D>N+R$Ua z7WlDK&SgcKHhSz>@xtDUI?;x*{zYOo^~_mxHCizPAM9__dWME#E^={;du2A{LeQJ# zYtQ=c+(4c#opxfA{wDbaF0-@qjOBB>myJk;yZ+|2kC20#Kt$FcVQNR90ilia8Bqy7 zKnc1OXoq8u7p)NlIPvkycd?L_UE&i^s3e!NAdr>sWjR{^yaFr)0Ag-uA;nD6gMr-q z)$%#v1DGlrBr$*grgUd?;u3ybI~p42kuc?^$wc9g7Ro^0+GWHzYbe`tC+KPs^S`{;69u0;&slj zHD)e>lUFgdBNOROn>Mk$O0U~eu`ZX}Yr0~oz3kp8RNwxp^*l5K~>9$HowJDD3qw+Xpj4=Wap-AEo0f|sV@ci?kNH)U} zjmmLIA`syRbK67*5M6(Myea=Fw@xYwax_5hD{6e5**}{54tI%hbNilrWBm_Ta8WTX zajw~o3oWwT_drhnt*m2>t}{D-p-k#rbo_ValK9=4OZ1g{$~X4s(QMsjrmeKu55sSm zD&N?jLvh{421qGd+Mlz+Q7QKwHk#5h=jM!PR_it(uyw--_*qRsA%~a4(f6KsF=vnb zIy02SvzMs3*iyB(ELW@<%(R5(+#3^fixaVWKz<~1_whc%v?BJZ7S7%a+~+Hfx&uM0 zDKif<$26(*=H8`R@*DJ0yWb1*N)xH1vpOr*edeVPU!%DD_{)?90gAhiCs%DI;b=oIk69#zlfz5|X5}F9 zSfD}gm+TXebyBi*ijYNY;jRLNGI9?ln*St@ksss!19F(+phQqI=P5##IZ`nq!Gtmi zS(3N>rFd12-T(TpRqA{Ni5b2d+ot`4cLXXy^|O`U^rhc_*JWa$>uv z)-i2luYV}_nKq=+8JT+;z3X&%Ujgf+a{eGP)Mm4_jCJ-GTv57CCxok7g*H@m#?yxU zq1Vy4?mNe4h#LA#pR~*bNgFB7Tg!$%Q%YwC=fb#VuHj7e^5gGPU(@iFxBQt$Yr6SJ zoSa#jj>FXz-EWTwr$T2{ZPOLz>lKZG{@sOz;jAjIiGOEB^-@D^^k7Bz`wz>7s}y~v zU%5Be$qnVrg4CxqCXIfKk*G3}nM34<<=4A`-Pn64uC-aZZ!M2*e-x zE5HB}$XrRGlK4X8$4qhzBrqMs6gJ6R5HWcq>&03HYL(yz5R%zH07+=XdMJQo5);@> zl9DvxNBM?0h8f@o1t26d7!!s;IJUwWhX3nS;4h#kS4L9*?7~`JTxn8LNt4GX8p@TC zrE%qn_Z!}GQ3UeWhbBApYj>t8jnK);l_n0p8DdVmhCn9QLWS9KrP0h?m-S;DC$vne zomjElmfY=TsY>GT`<5yL%EZ?~9Hz-N2{JjPy|v!kk%hIoEbTPD-+fBg;_QJ={g}!~ zS;6)ZTGX%+LQ!=%eeldjoAHXph`cs$XiA^cNxxE*dZXr?{Qlx;dxu%%cvml+I@N6p z^Z3M_+|~{mcni|F&5^UIie=DQV^3P#4nUz#vk1RCItLS)GGl#nLF^A4n2>7%(Ah*dB$pflvSiG@wZg zst_k;w3Qj>12vE?5R%X`n}iU_S`)3 zNhk8Q8*aedc(-)_GmTR(J+Hh?xc~9&yRSN$>QTiRFQPqd)|6+zQcLjIa&haW6z6dT z*Yn4p1tWL+o+R@EBAUHZT=Rk?u!Yvm} z+VyZBJ#BH!+T4SuuRi>s*8I^M6T$S5*mYYEm0o-FQQfqCuYqO#ed2!IcDStS@h1&4 z+uoj@OUA^n-+rY0`jgL^E$sU2_{DQ+!iF73&)j(WMa%ryOuO;3mL+b?J9hTwv#+z> z@qQXIVfON*O*?-(*U|l^j(wU`%+YAxJKFx1c)7Z1&m}yEjN%xB_8le$IAoqos59#o z@|oA^|1tNb@ld|~`}ldyW`@CK$&#fZduZ$u8VtskB_vcsl2B2Uq(0Y-p|Lh45-KE1 zmPSR^8cVXLO)6?yDHKvki~n_h@7H~Qe^35Tevf{ymj|ADx!%Y5K9A!#kK-L7Q{An= zI?eb>f3E)J)6pc8^1<__QP10SCpCvJSRY&dO){y!Lqmy{Bcjm_^-qbKG=K{KnC`m+eWvmj8&! ztluW!h$-1-S{m7Ogsj?lg1q7SyS_FBvEs}PH$Ds%ZIrw|v*G5{gEF_maLn?}Pfu!s zT2E|OGn;vKGwQ|d*@PLSt?AgWzv9+S{?9ryls08sH@m*+FWmT#giYe64-cz@?qu7v zntpoTdTd3)Hc9XEn}Nbjr)=BTEPQ&=`j6zMzp~#KreEASwds!7^75}=@+*=|@wFEd%Fts-ds_P@^px-hryt z=oK3^!lL7cDhenfpqm{!)#&h}GmKUNqGODXD>{=XE})IdC`O=uS=5Y+P7$irq0@f- z#tn1=QMw47ZM5^#mga(v?$Xi%>VrQNcNFz=ztQ%=mCsQHA-cnZg|udiLzEGr-h;b zN*ADRbyUni4_6dT(0Wglj70+z?%nG_9rkFIF?w4^r5E%fgIa`9z(Tn$)Mt$H!zd)7 z0wgLHqK134DjAJgKz9gK-ar*W6bez#G0OC!wZa1x`s9+qrQ2RAwyX@6b;cv zWi*Ec_0yw8$0$LKilgZ2fZmk?wuPY0rRcQ@#TvB9xv{Ykg+CM@!*)lZivkK^nOQv4 zAb>6(C?rMfJy2D3HF(Ev)FXht%S5#qw7LM<-9T%kN5?R8(IrC%3*=Un9+67%+QGvFMpm3a)p3Mx|>*D5n=~5}x$OeV@{}ZSFU-;Id*@*h$DKik0nwi*0~v-sbF5R|is z8eJPYkoTwMKe@*L<99i5Usbj3ztIr?>dBFmxb)vPga651F{ya8Lil$>$p2(R*f8ho zC;qbzpxF=ysHav|{$>eY{WpnE$Y%f1PKH-V`J>6?e`g#`tx8#acq+tK!d{^`Q2E5a z+Lg;IOIhteNw643}&Hgph_|nJi^Yzj6f!dbmsfGLav)R99 zTb~kwKDR7hJ@)1HRDaaR^Yqm}-wJTfi%zf|(+ArbMGO!Ctb*4_my`^>zFW>Avz{jJ zSrgl{O7gK$uM(Dey?4!JWn&zGj+_Mn$PK zKHK-t@y6$Scm6ROkAHRH+lyl-S8Q%gB;A`m@`QbE!s6LK10I$W(I%hG-(+BI6JF+6 z7;boXcGv#qmnmvwXv@0WA4e#Eg!Br4{!KX+9k34@zNUGW1p@(efjfs z^}V`{GwmW@tUd?ds-bq_wXa#*8)sXFWDPj4|Figbx@Xt7vA1JMs?w$L$G;0tuK&A~ zb=>psPsP9ToiZln4Ytd3_tvlcj%oK?`9tb_YV-H^k1uE&D7hFsDZK-&o6?u3tw1rgT(}k-VTXG*g@fUG0~aPDP1tfxld9P-P+qJ*D{wv%`74B zVRWs2K9_1aSR!$xw@Y<-?j(&|3a^}GbgMVc$?l0@5McpbON&X77TP;djFJ_L)Ya4! zID{B>cM7m0;kK39S4KFlEtt=YD07v6)Z24I2Z6+Y+5tV z69qB{7J5>GLow9~3{pf1Y`a{a#mg+yIO@~u5_oW3Zg8)p6I+V-TS|?kT;^e%##6@8 zaM*1eio%;dx0Z!mz6MEmmy28ZptM?{X)jiX#J*(fVwbkxE z9Ye!vB;3V`8n1AO@Ed~WRHqUlbdZHB6-!(K3hqT2DO z;K{(P*8{&_S2tZ3Zc!+8At9*qByh834 z-%E3p)qsI&N37~P=l>er zpu$A29pCG-N2~UU%Y$nBc?0k2}~jLwoy; zu;Wd35kR_pA!<4_B_v||I>n?Emf9SGNNX^ET_2*IxhVer)-X z`6tuLsGli6u3ve4d2_?nb0@($A%jl*M-{Nh&%Q|C~;)RZG+E>XO8Jl z8s2Jo>aq6lBy}Q$b*pvK<3L?+>&rE`fPzuZwYc}|0)H3el`k6b6V4B8pA406lY3cv z;%L8+AeqqcA!RQ8*R)V_PgAFoVN9C#?^k~%e%@89i$ylJy^>v7bF|Mfdp<9x=&j8C zgm&iN`GO$j_r|Z9Zg2iPU-%>Vz3H8w14mxQUR2sXN%3qR*jl$(qHQy&wZ7%?uFr9K zZ`(e3to(e^pgMm-D%fM`aLN1*Ig?lIpO2iA+3`VOe)!!)cKpq#3p3HqKOTsmiazj9 z>vM~9txdl!B*ff1HZi&XN5hxxpCdN4zJV_N=&1PfIsD7Uw<>p*1VOjwQzl!5N6sDX zKKA#^=~vdTSt38Xl3y<7e6gM~@=WYH_xIan&$f5#J%2vCvEzH`KW)=TuKj$m)pqgr zEt^lQO-b#N*Ji0=8_8eV)fV+uevVud{d)OY$Hx~hem=f``}^t8KeKKlC!(P{D?jde z{=LY(^Lxtk&hpdyf4{e`{Fys-=l7)N%JPeqzf1S;{QYr%xDL_W5o}aEOECbZRIQ@c9fgn5WkWS_GD2)T3>AY2b3SP|6=LJT4q|GkB^;%Yx~tMRkh(>cmKx4Y z6_XO(oshaW0k|;nCNOl00{hUMWrQHU44as6axW1?t{~jFvvkrtH(nzRr-p|pKrDoG zNCCtvgvR?qQZV?L0%!D|#Kfj2FWpy$#0gr&Cz_}DZTn9#u29E_~ zVM++5LU<}4-h$x7iqnRcG9N_1q6kz|48O0;`Z<*$$j?fu_#&b-;nK8i{p7dW$4CEz> zd5uq^cvSep`XA4jK0716Vsr|C9OI8XVn+^Ox>nM~9^k-%Rj09P**NH|{n6}?39u_w z1XrIeGEY*R!^wbC7^z%hNe+%h?Dc{TI?tN81rEKlB^x4%j)+|dVU zdZE?Za(oW~AV|qUS7We-eA1;D&!6<|52x_8Fv+->u=c%Y{01*A80w>vbZJDrqdd_L zoC}YLc?~9RLgij?LErh(=JOkVrUBu3EL0#`Qh@0w(B|VC@p!gk_FGH1js$8xa;a1- zg{pH4M*kUww>Rj7B3Qu7#Yq))xxhPgVM!R+QSye*71r#%P;$QDl48M_;<=Yql$f6v zx^r&KpKM2#Ih+6E<$2`D@@%`VEz@!UlwoiH}7puTL&r89xNAQ=5 z@lG`OFR7Tgd`ZIS6h*Tb7g{?LLfB)NqWJqy6^!Qz>y`GSYi@Q4@%cZ!uLsF5C0O*TU~Z_i4(Ot|)cwDWkiZ3i8<9&Qjd7lL&(cpJYIqbBAEUm`%>`|(@-0=MPyfeDRxEdIR2Jc&%f zW2H)qc;t^wByB1jqgR2iuc%jtzcMNgi-Lsby6nV?qsyZ4KqO^_CmM~g*N6gV7{sSn z64ZbM-=D;)N`8mE#JNnKFREceaa4HcNy16jN^RcNl>V#Lu2so_m0niWKjzDBMp8ok zf-6!2X&KqPos?AGoyoL1I)8r+f?Jo^O0gh6JSba*Zi8NvOqgvGoxrAGW7y4K?B zYoDYaLDCDJTEWj;&EM+5&kBe##Q=L6N69;TOBbFL1@8mla!#;V>^0IT*he9R3IQ_W zCpKT?K!t*ErNl$leHPc=_w%>EM<=iTmR0@dkZRfKG9OoXDIQKo#BltJnA3O@DqP6B z5UqI$j9~6r!AgbjIU(5J4^zAd$u4lj3Y81^1c*w)7~L>)gKfp6td8Eml-#f`gz1Gh zHj4RVSrU$lUNg_Q;S>dZj703ls|TBDx^LkV@>$`Pzd*i`Ioti-M-=R!l6ZF&FFy*a6)lY)BhG+WMp5Vo@;I%(|uo>W}#- z3qfuSY+&5hxFU92c2!HW((QL{ZO004zbd))$!$$|LpVJ=%p1Wtz?&7l&Z<}AcTpia z9$5A4vJJ1nLwELRwaJX&w=5z@?5LN43r4QQ)@#0KKeD0>#u{4>aPD}`7BL{3pO0eGTCc#}6N${iUF3jr=Q+%fZ zl|YO=q2=D`Lhf2?4ZDrs_Nq~tQMx<(Aeh?&Z$q#(#h4*osjb#<^+@wNqrDrLTXem9 zBw0Q94#?AsEK$;fI}N1g@ZxIs;`C)=tl^_I_rf!akGtPRlvTDU_kOhFZJUuzcJEDJ z8Fxx+>wRa(Yk-N|aY1%)-;O7}dE+Xzha;7X`Yz7+75?rkweBwq?k`X3uPo}n+SXq) z-e32-pRYV{-Fo0=@IYgQSG>sqBUtl3skISO z8{mg)vw$}h_GAw0wm&puuoseWucIG2f4?sg`v6-{U+pzK8QtUNo9sy!v3mly)>Oa- z58B!uXm)T8Qy=Qf46AI1*LXb8sC?4G;V|Q#c$hMV+AhC~9>%bSlb#ITCxeBeA*xQY zmjN8g0k@S!=nhT&I7FY(hxdBGcKl~{RS)s6lihI~ zk=J891DJ$x#JnGVkM{hW30@5j5`}~KlCj$DFAm!bIoHCD6X+K~v?&%zuz`(i9^oH6 zIXXnQ+jq^@1HLr(r1r%lb#Y*tFhpD)Kas_ubDtky8GVMGe`a?4(FTL3n;*l|R z#uqhV-4jx&9+!)4U_sJAihCcfKBdQfx2w_Kbj@6x_d5dXowF)%y8X^$hsYj(NTxUs zdm8$-5tiluYaNrIkdDuhN-WcVzCVfRaItnGaqoa5Ny>Qye}f9!!dNXC;JHBr^1_O< z(gM%J5j&vBVc6ABDyJY-nM%07ObS|Ij*?z8f(&5)&9HAwv&8B5L7%}6RjK6cuvA0% z78Tm5ZDNQ^xq=bsiYqJulL1pqjEQfeLSwlf zPqcq@ z(<0V>GxvsPRtaY=55KFL`VeC{8Ls}33{9ug#ky&en2^bY6aI&MosZx!hrhuzL-@*x zPgSb#k~vf9s-bn8rLGY{F%>Gkh)>!(jXyoTSs4Vn%n?|)k|~g>;arm7oRf}`5&~1c zBVOXn!n*T84b$pVU{~_i*FMt1B*zi|;$!{Q7em*=av%YG< z5RP5BSYW@t3ZhLFzMP*^_!DkB8Gm9@30hDr`91n&86&lnymLuLDi~M)W9a1#{GFnU z5}!){&Hxr9paH|HFg@QZ#9jnPbmHEmmS70d20Oa*z27=ztJs{tDf+x)oYC~SNI&oM z-Zjr)`)!WmmJjX)X8U|h`_yQdLetoE{r3Pi=GdLoGIc%6^eMB?#Z*2DElvX#hCUI- zJZGG(j1hlzez-v33Z2!+)D$Vp6x{&m*XIZ{md7qzh~anHsYjO~M-=AEt=+3e7oLkDYvjC$9BGE@ zzJ`=IrCy_6>4#ora^@^NSgXGzL6Rrf-(^vNaL7VPI4I6%X|(lb6AdAuUCNnt-30mv zA9#H`AwBZyRl=K7ck6+UTN-9xS8d5jb&QY|R!S6Lb5D#F^H|2Ds6MS6rHD)$LaD@M zInwg1e%hQHLwvR6n}=>dph3(rGIkxlk%CKh)dQ8+`(5={8rrzdYe=p#Yb{N#Cl||k zdEK{~x!J0Nr~)0WRDvl$+F9e+;!ak8SbUTBDJ3pmOj^33>FsKj%3+ou_)xLA!Kcry zb3KphFDrO&nf2wQPB2*4a5vpc7KYuvlrp6f<-p?OsBeB*ygyS9GTrIkj+%YO8I=9U z@SfHqG}+VLtl!7h8Gz{%|brdv8 zY(^Bo*$ZK+F7GmQ?7DzuC=mu)y^L@fPTqbiwaS$XS`m>|=gY0U*vg88_XQepaBX{ClHdBx(onOjV5pUP$9M0l=46*K^N<#5WIoHTHb2IV!?hO zTg)l;G)@S`C_)Lzvc^eXSl?SDQ7mbVY{!w^5Q@K@4B(dk=-nMctS_E#M+I|C+=;Kek2Kc z35e5fwmJ4e$7w-MCTr17fd+tRq7iS!Ga)m=$>BN8HsNMjEt6m#!;+CzXM?lsBe$^^ z=LpibnxE{W0AFGfdcj;CyBCz{Dtxqg(n3Jmd~~RV_BH=q%hQH0#~~WtNc2ckw^>9W z4uaM)USnOX!CLb!MY{ka+qAL!dq|8|vj?47U&>;SM+d9Rytl`RVgzgj93tOxCSOFZ z6RHD1F+Fz^n2`j3US$8&Kj~<2@IeO21xtyUA{c)qcC1N&wP+o!64hHsqvz%<+=}Pw$eGop`xK(g}?>&E2b8^i)b;i8_8OvgdnGspUqY(fyFP9x7=2W5Ir7t6brG-$bwJbBV7jCQbmGkGUUGGILABWILYTHlkiUIT0EP3ENYU z)5TaRgT3p|h~hNf$>$-}>kQOQi@%NDx`W>zld>`Rjoj0wd&d7e-&bVDtqj(^_qXa9$KqzlCuN}R=@#R9DMLW^%z_Es&bd06ILxaMS zT4x1Y;N~GH-~nwjKLtiV)WRk)dw>TfMKs(Yz>;TXKz0H(u|P`iYAqoF3v*)D@#vb@ z1)TPgP&wQ)oC;B$pbUzyRF7c{`BafG1$#B5g^t5fFdAcm_60mG`^flPmZhDfbNPyZ zU?0046QCxKbHS0qU=SocLb2$TCdvs&SnDeZ#ExqxVk6Jv9^381R3gCED;Z^*FXBF~ z2Tc84t6v1Dr|w%Gs*u_o)x`6l?)nK}%4yBnF7%Xc!U^$a(1#phHhv zH@(<@&sH@y$n$t;f(z5oM6Y>Pq1ua(QAT_f&+I&zcYAJoj$@zt&6K_ z&7pfX_jm7IDouN|-$vtTpK^6Wq6$?py6}xPH-;`PT65Fmh!u26m0J?zT7P0?qY#as z5GDSh9Ivj(7n{0!(!u%-VO84g?<$ODygL)SR>3qoby2V4EF3SPG00ubs6TaK1~dr7 zYPlTpV=51yR4neH!7fk{kOr>^l-1C@>I! zdFPZ^^J%5lQaApL5;6FZ+49?ltZCI#N<{Iu z{MzQ4CQ;zyK*ZHpm#%AV?nM&cHnWSVVqMg2O599`BB}z>pMkN-Kb?oQ3_#5HPG6S| z?vN|H?XcxG9!J};uKiKQP1B$o=2%2={QBxRmQ)+RA&7Y5>n#N`+ct>EKGsgE=4;;M zYK>iGjo?HAlE?eGGc9#S8ePVwT_*G{Q{S!?vqb}=VD73)d(f2JD~g@7a!8LHPCTFY^wx->QQ@9RQL3WMenomu|0d2E-ssO*O_P)}p)=rzXgVh^k;*6F!?W zg%jZ-5(ygkV@jNu;u|s0P6h6Yy`>@FO!82+5f7)>WUuQaaP~n?PO>aRBG@E=?tQ$wv#m(N zjyQfMBe3{FyfXK2+>MnD%3P~=X|7{Ah77C?lLawwqt#`A-;;#1Nn<&CyhFc3Brn>f zcM7ww&{&RY7kI%0N-my4$l0{p1m5xlQ_UFy0xw5?y-T>b!4!rIG?aB zMO;YFL>xE@y=?1V>oSMwPzFcAox^iF+1V6OW2O&t43}^QR5pvq(x5>m6k-+*WH0vC zGZ-pGQmx%?>|U0*;B??=w-)_!LkhmruISdx2FBTLr!XfD@ve80Mnjm}l_<^f%hs-R z?n)^=s|=Tgr&$)(VEv{bjS)7k+QX+!zS&xgEXChki4F;O@E?cXQ}m2O-uf zfkSG_J}TS8scd-bKKy<#$HtDBNar3i?Ni!PXoU~YTw zTO3YdI36S+209n=lg@$SKGxVk+!>5k1j}%&g_qf|N}Z7$mr*r7!hM*>0^Vs-Ba8IS z?|*ZqXL@I>B{krbsV*1xSYOkOYfI7tg@(f6;O5(lBP`*A0ksijsuz2%d#&C;N-yh* zGFQKH*pJ5Qs`ozE{lGWWhr_)ytKa#V?88PpISLQe8?+6c+$}pl*k9(c;vF}fyx@4h z$os-O_TA{gdztQR*iAIp>L;CRsKWh_q%m6N7&M;Y7wtIh>i*Ry#jlGUQROCmcc47U zReg$2zrb*seQ1G4R{MDoR5TB3*fah(xfl@rYtCGH?Rst;hJlA(0P8poIq}<>lkYXA z?zi=Pu6n` zSjDfC9Ya_`Y{3Kn{rJ%Xcx1l{F;?^G!HLn>E9b4el5sI?3>PU{^l&#j^z3hyx zgLWnE)=I3U4#$_7yc>()k74cRQVayiM-H+U=yqU)r7^``sbCKIMj*CLw=D93DnJyP z@a#D#J4)A(=$r+2qRmLMKN_e< z!?2f(51QU1DqzI|t{+N&Mojb?rtJjU%)ZS2Vmc}7)`Dp zm0*V;hJqZP3O9G%AWHzc6|mWE+lY}SdsMg)@6(F8m`%l4ze+ZV1YT#}2ZC*W8@v)5 zwkA2sQ2ELC8j@#W1kZ(>dVxV@jYBR{ua~Xb&*bK6**2TEP-pOJzIe!xEuL zQXA{ypJ&A?frEAdDR;|^)Pwu#`&V$4h{Z^Mb*SvUl<`^WR%X^%nj=w<7I?*jYf<@( z!wu>_PuA_s$VeFwaY1G^O<`dl3nZKOa<^$dxZx2*?FfokHFzNQxzx(oH)YBtbPwV}* zvgfuUtH!|jm(4a6qK^&!%y@LOS{`{!JlQuP2mGIi0a2!qGT!)MsT57#H zK0eFm;PWB-1b-k5x`Q7lJqXDD7Es+ngkr$O;^&k5Udx;70GjnigJ;J!1ivZvR6oy5 z$lWRxo&)&)5B3RdO2LXsc5wdoXWb1Gob3T_ln3h-2s9p^oj=~+KHiT33r{==JdV{| zN(UOl;bHyNFKFU!yHtEtN3MeD%j_qILf#>-)xN(P%{5VqK~`~{h9@xh{e-g~*6yS4 zSVUoNj)?;y$0tw9EN|QK_gg=BJil_G`l%*YU&j;hQg-Rr|`_v z?M2#hms|F||GSnLvN@E~yOYCvEpGUsG57RPe8cc|o8^XA6K*dnfJ3e0c;xrNy{Z9{ zZ96hmd{1WGW#^m8k})DcMsy0NuP&U++I|TiSb|3qE>0$D?cPNI(N5y`v)*o~dwX>6 zbI;s~;1(_N zN_b@J(N9D2RgGNYhsI4pn_aTIy5AYPO2H$-P=Y}aQMQ1EH zJNFekCfPm!0lPdlj)XOp0mCJZC~cKx1Y!_AR=6A*H-OYPx|ds@Uk zEh23xlFg6^<0B7s2bE$9BG1yWSXTG_!NE6PK@*$M(Y8dAnxGg#j^{yy@xapad z`-XlI`q=s_Gn^5QI0XYJ(Opi_GzIv?hn)jxb=Wa(6@O1#{208k^r+(&aJ3+#bD z*+$VKFnpcP2Zpnc2*3h~YL)=mtG+0w&jvHu!Xe2N;{Mj2X&?iS9-iflM5n~;pE9IQ zzmK|7uYS3+bQ>0tUrL$JLXXDJZ*G5958C---_8_;ST^^|;T?#m#<<=GtIyx}&+SO< zw4Ld`C?$U~Hu%g24z=nS%Tk2GZvQ-e@t4N6#!qGCk+*134XVUORql%Psn3!pxbOw* z6ykIW2>|&R%mEe%6CM8Hn#iSTP7I}Y z$CvLX4qUt#>k+G~hHzNIDZI7Ce=W{gcgteR01ycz&`0m!+Ez1x0)$ zdL5bxd|f2>t6uxpb&Fp&oPSM-{>sSr+p<%jON>NE$v+=BQ>8C5aI%)kYQkUQI>3MA z*zGl#JDa8jUw+-O_}yVq)As6DmxXq9`PZY4@v4_(*p&^-FWZeb)Nft&)}uVC(&CzH z0BCW?2P+UqYYGS(@Uj$)m)Le?|;5pVTRWOzgCK zwT9>;NVcVX`N72Y)D;iEaw@Ud$F5BNeKsll^%r9AQw<#t+hflkUH_BC$o7o*Yuu5= zTAJ-VkaTw|aXnvh75DhFia(RL{5fz6nVRgO^!4)rlUq-n?Xkr5wud1;pC|!DZ2>hp zK?9J$r7?sVpyAM!DO(U0)>Oaio+czs<#eZ%qyuTui_FRn)>=@b)s16@z8fsCaM6ln zVl)7}+t#eDo+J=a0-a3|tOqcu(wI3$6aOt*8v}e7av)J8gSIK$o%3dpcT-6;W_vM) zrWY(;6$inZ_W7x0bBmC!Ub3PZIc+5*y0?tbwMLA_Rv6(As}-wkb?1=0i083qa25(AAH;DR#**s=}$Pt`0GEGU{3X-Gk}KOt-Vm zBqDSK?Its^9^`M%NHyJ&?^vBzOW=y%yNR2#h;blyDq6u$j1Uptt~Vw#KV`x)*rYbocv?QdufO{?Nyhl*kvPDwFs_cmpy2_qm;!QD&$xQ~PfIjJ1> z71CGrSq#KKGrGCmY0m7djKjuNOTlqOHm741xn7z@mh-+hvgL}0pPv&SN5wJJPj|z+ zzkCzGk`l6^xx2;LS9mL7`T-+S=a^b!Qe5(%BhP4(>fJo`CYWg_5uW$M$9({L@}V&H zs_?~u4k+c>#oN#=)l;^ZXE4PyjDBu=!fp*&Z}Htm4i1I+XU0M^#qnp)skkuIT$3dF zd1)%E^d6Ojh(8;tSasMp$l(C@9(*H#47jAlE9u{?}a~pNCPDQsb zO!^$vmjT=WvfszeY_~z=Ub;FFGzq?JEJ11Y0DOHL z29?^?3zLjj`gN<@j0X%_e;W@P4Op8DnY~Cd8Qw76W^&)=*Kd;%J29KMA&m-UBZqA< z=X${s zR-AEBbwQ>5HL|LF&m9}kGP(YWCVTJZ0ekTBOzM5vP>99Afe-wWg}W8Rzyv^8Ggp>u z#=-3F6=IDcpv`*+nF}2qbm~b{P_kL50@lSfM&z-3ZRFOqF5G-iy2 z4U1XTFQee_FQUwBjwLnj<===wJS>5}9PTw?Q+|j0&HK@W7{Yt~lN(a0R}-I3PkdqD zOV6CS_D{0nnRvjga5fO^)QF+Ux~G}~f#-=ux91NFzL&j)@YtWbxL*)$Yf#Bcd1l;2 z@DU+x3d8v;+7)9ijPgdzaJcv+2~~(fRzl!ohvFDOy#xmZPzYdUBskvkM`P2Fhx~Tg z7rXxw5CM87?_1ny2t)1oXC2Oxj6OA0X4AZaB(Ppo14u9LH-Zy|moOkvh)@#k&Y}7* z;y!5yr^Bo6K34e#5Eq~y!;7CQN-@m0I}@yq0}MpT8i&jog(bDLhMV6a0TpYYC?{Y# zEFHDd_VSAV7kM~NuxNhZp>>Z;Gd_2|OUag=TN8K1`6ky+s&n(V=DMht1q6P>Zv zIs}zBiv&Y=%I3BDuSshD=M_BC)R>hF88scd)I}-qwR)%5r7_;--5OO6DwA@Gp&rqZ zCfw<0Z3pFg=nN4{CLawU@6oyE9#5|h{ua67Z0YiNN%7k$MelW=-TOC!nc4%7c5%P) zwdv}iF{?fm(S9q}BZn@YQ8Q8ql``pkoZ0sE(1G?>wr)@FKhE_%qAl*`YPO`1a62-% z85c~qAZ_C>c-QdGYG`UoJAq)s^&QIP*z{*3_l(O5i{n-FA+OpfZ~dSw98Ih}7l=@W z6z)<%a zfgQmo0mBk|vdqt9!x&F4q4Cm=2n4@+DzpmcJ_E0PUDrD!f^L|#(VcY8?izK>%WJJ1brzR zks+)vnYOd#1uVhqfS?i1M8P(v8_y_G=lSe{ps8z|ceQE}{w9Te7V7{xF)E)+!^?Rk zFWt4gE2ERDAqTUF#l`!-4{%FVvR0>3)Is!agYwqmkD@y*yEboelva@DUO0FKd)>*- z4|n{enC$EO)_He-n1;@-0N>A83GN)3G6bveOCa>Z7-bs*L`GW9^@+}N-G1+v%26l; z0geW8fJKZ}*OMAEmy~Un)eHI=J9Of(UuiEa9TfXwY;$kp`;ka_&tk>k@7G^z*@!CD zblx9r)V+56k5go99pCP}ok|at^)28-htx$X2(_6GwCL_s7@eaW%8CeH)3RPwWRW&- zeE$#E5J(3RT!WZ>sg$5+gL3<{z3UdfjfcD-8~=2`P@%vvtHJB<<}pc0ldEMkiO!p^ z?>hEp8fV&q(P3n7Zxojc568V){%~Y(<+IcD5hk>qD@Yv74%5_*db|tX(+x3GNpU4& za{P6mKmyslXC+K7tdZ9xrv4f%(XQ=s`&#e{18)CPnM<8Ge69qSXzun4v;V}wB9t)y z?P&M8EBQ$Kjoa}-$28^-&edPQHf=x1 z2zmyPz`HAy*X`2EYEF4sg(D?}ch9nV9k=(_j^9ys6zIzXM##el{(r?m>o(eYgPmV( zUR~L}`bfy@1={eDdIDbKWuKqgz=go8wFRDb0pGj>WC96svX96V$N`kV7c)=B=Bufy zt81028>+80FI{V^t|9HARyVks>!lIir-8YH)WW{P&N9iUz|VdKo~-&#B@oq9iLqdumSSGrpRk*>Mi_dC@2=Gy)#fegLB^z@s7 z8jO9(;JQ+G3lFE7?hYsdnw!cbVf01l`m_uL)Htgn@AKW!CxXWqk ztw}h?F70xao~w{AUQ7NVDbjAsTIc0~15FNf_ zvz?MDJw!D;RJuGwy*%__d1T!O^&KB}nTLjL{t%h16?r{;En91c`jz2st=-?r2NuZt zpNAty%VVLG)IMZhap>R}({N9mI#5+m5g(IbHPhr1pjGrYI?-$?YQ^D$ zll@7Zgt!o9fp+32&GJKbkf4h zx#gAVbvhZ1l^IrhPTsD}9M;Jit;~9hK6vJPF;?aw}D*Rdvs3 zRh==^%`vaavDH26RCRWik9Bg7T_@ zI^Dv?s>0j4MLktT!@3uSCv`2iqWw(KAPd*6$lwSlgMNAA9|tH%iR#tYprb?`+34C+ zy84r`jUGl}SkKg6a?0)*(HS_oSQ8E@aFS3WvkYOd#i9#_l?cVBx+vb0JW z(86?4xEHl}G|>Pu=#I<-SBtG8C6hq)b-BuPy=#~hTp1t*l%8t(MEoQuDGg+fE2?7ICqzh&(j?kT9<8fw=sw4 z3lxzKToTP8Sik$btYBeUV9b%l3I1@{;?ees?#Lm8MhZwJM3|M0T@XdS zH~6r+{V)f1MqjX<>Q-Rn=GZww8AK(L0|trj3Kv8~%lTB+OZ4oT|^{@fI32{1r`g;|8aP|*HZ0|)N4zwdpY0PfXkB1wEq;gN=pGl z31DUDQ;I9ORF$1k8 z108bhYt@S08nCjw-iv}UrgA=*yO61f~{nioxl5B()b8MM8^;}C7Kh?G+Oqze_laY#Bd zhIENa&+R1t@DYC%*|vcoNzl_WheUQY0+K9671H|+2l&dA=n;AM2Hl-jMIQL zZf7EHhl4xC&(h?*KFJ9&a)XeuLZ==NA>$AO?)BaXKx*rJ4?sAU7r>>%I`P z_;r)W&GpzD)J=V+Tfdqm<771K)Qi7j>b^SsGNEOB#w5{{OzlX>xQzwJ_8vp`(m}mz z3l^;=peD|CXS$mO-Q`l8t3|hCkcs*F>t2#(-tzHT>es!s8+<$?)&{YHN|9rhUoe?M zby>*3il*u&>A>$8hXitqy@t`iR=Q92;-D%dPzhrykPkW0wYOSyZ#~kjXleF-0aCH< z#JL+X2B|Z~-ND$qJ1scV1c4m2dgr4C=GTA_6T19aXM-EGP?<(eRrdC`4Lh(aH03yC z>Yz^olSPT^c*oHu#tiF4)BZ80Ytv$!;xMi8$YfSyP=R@1^|z6Qc&B%O0AqG-JPc@u zy?Bj#Pdckq+DlScaF3}_ATQ1Ikn!c+T3?rxakB8kOLXguyacS+|xl?k&ZTk1F+w;>n&p3r(jyPw$#F zO8#=>pVlksy9x_dns&9%J6}3_J!v*~XF}?MghY{+Vo9qKZ2nPst5WS2w%NjZQ;w45 zxtIHnf*P7b7;*r+%^puv;)9AC0)GZ8J&uE19#nm1*Juf`O}d!{%jHK}WR1FEcfmDt zx7^jrM)-E^CYEw;K6Z*QLMXg}dBv;_g@)`!SDO#S_Q&-csI#~%M5 zcW)UN_4@69e38gFqgBAk` z6)^!5l{WY<7(i6^d7XXkbME`xf1dsJll|Lk)>@x+y|4BCTq}&t7$)~|9)AB4W{6%7 z596HyTzg(ycB)a;)~5`GZV)+ojkwhE!{vutm+~?RtYbdXF*M0-!<6!3J=c&Rw~`F^ z@u9Z9uRl#VC%>BCkKJsomvxwQL%}$B9SI?*Cpv0{;y5L(D-)e`A~{6$Qq+$)uaDtd zvEyOo5f}Z0C0Y?YtCCy|lcg-rT301)H-`Ufw^O1lP@zZFcE5R8mF#Aoxh|M-(drbJ zmI(VD?gGkLH8s4;S+8l`ubHep>Bw-$pIDjy2#x1d6(v+=*F`AsTeA)oH)v7TGT)H5 zBaqH73nmSEReqHsp(FJ8_6#%I7S`~(Fgwr$Ywm;wJ4uoZ_DCZfbyPMH$uXI_7c1;e zIE&PGDZ3*}gqlxg84?GoG8tq~Js#`DqA+LVNhr~H5<&T`{L&4@4~QXJS1i2A&b^;{ zxg#(&1?d;IA&E<^%7sKpqaV{O3wC@EtRx3Vxy$!+iB{J63p*3v9Oc9zfak=HCHgBOJ=w$%|$C6HR8l+aiAI1>>gOHrYHuF@!`Yl_l5Oj`>L zFih{s{SDGgwU)Thv-17*62gt5%R)E%QbVPpS4o?M9I{Soh$z(UZw~hLf59DkC5UPe zQYxQo7Wv{tGHvN`4a+tyrezP?bU00|@2wZ`<`EYajmKgRBZ%T z$SwQ8*l=0tu;8 zW$M^|)caAFTUMNHw@2PB>#m(8Ew+!nEq~N1;Z5-ypOAH0>Nok^Gu`-fUzc~sQ@`gw z2A=p26m|3jes0;ipJZ$h>|(q`66aT ztKG}ERUbQFCTOwSzdB;5(Df?W(#-yKs=ZIw>vX4h`!`2D&UXPMelw7w?4Lwo3Df4+ z#U$_FL5=4jXwxD&wE6LPEKQGQfY^HE;55%m7=-W`Af-eGioh%5U`H+5K)4cWeTvXx zqreX#zNFr`(8jfbh^_2E)@G#q<1yluVITb9Ra9;uE&oF6#D(HJBGUa?nehkShB2z; z?z(U~{(w)2h?Mllmggy#iD!_q}8Bh;Ryv1cdJM^9J#r1Em6NsO`i6ChmSNc|91G`^} zXnFOezYxBFZZM`IsN8jL?LTqz6e4~m7K!-t7Y?HQmmr;eYeUA^{c8iCvN-YU2IlvyEa8~g)^oAp)7VM6J${|25H3?9I6)hV1I97Y-PCCSxOj# z5J6ONER@9V6s#+KGX~A{l7C5J?Dz>X(f&!clPZb@;lF`4kA1;&lIzZ@N0y??+Qfz9 zqzP&w~FAo^`fO%Z*pcRVu^)q=x_}R znn#gcYlISkqBti@GzjDQwV0O}Wa~3b#v^!}Ep*LqrGn6A?9}hReAIS@JzN@MwMC+HZ!57Cw5XhG27cjF>1S#B&lCoU6;h zY!S@mOXOpy(H&+&TAPz&Ffvk)RaRSkEGj$sNytFuT)-MVkyq(Agx=_gPuvSd)3TYg zuu5BHCrx*L^v+`5F0OS=z|2k|HP3Y4+w~6P)_G<&k}G|+7Gbl45wKgAq>_{*kD#?# zUGbd6n`}mH;VrXkd^7@EV(%huq5-iQlD&p@OuT9bwv~*LiPef{aMI?woy$12yN6Z8 z%W)}Ul<=;oCGI-hMuRm=6NzjFL=;o2BrI#zWNp{+eY>s5dmL@Ht zdU<$m3ic{5%hVLyI^4LCNuj(1yJDF`J2UbQjZ`;WlHajJIuSRCCF0RqpSFHuraWVI zt--8%&!2b9kzu)ds^#{4A{&9OUH3W_$N zC~hYnT-kxd+E-!+b|Z(p2+KGm8nCNMNVViOf-mjvU;_3;UZC`?!q8fDRh6__6P<#E zR^QUq%%`mTaZf-$6K!wFo>}G<#n4QdBpCBkce;?#;`~mWS6s3= z1hk#cG1NRl{6nI(_OxU&VOhO9Sur`}MDy^Si?;DI5?xCkBNim0z8x_uQ--jFC;e3A zqm>s9E~7Bqq;LwfX)oU|hu`Lf;y@LLksh}A_|>gx#tKxB`Uf1$B*deRs|R~lu_3#3 z%zLpo%8i$rpAI~`{G7q9_4>CUbx)Vem%f~>xO&4B%oH{e@AN#rh;sb6WwiPQhZ}qC z?ywp?lmmREvMC%*Nwp0GjBXwT?%sg4qKR86F? z;%K#1`B!921L6PVUw_yWb!JlI&G^SrjymDtxWhrOP!{gz<%Hh{9`A3*Y};3`_Ym=1 z`Zto^@7mfFyUf;ZQq`aDQ@<>Y;l zUMF|5E4J{|emvsI?nvCHuDiF9{3_(8D14QQmq$Cow@-}snGksj6JC4N8o}`sa6-Kd zR3c~VF3~jFa&1wB*=3kD8{Kp!m$w+Tgsk4y%Q=a4WRv>omk`&_bxacV1YyKx^Y>G{dnhcD6mJ@WPRhXvIW`?C zR=su(j^a%xYL<)CF#2l|WouYynSayJnr%0N(daEQ6@~R410)7 z_pPrK6FKki*lB?4q@fghvGUEVk~Eg;8g%dHwbf$ln043%#T4FTE98hTA93bb>Lq%j zPD3MMEw8RB|7rb^)9aXBHM>u9v(;t|hALvkG|-MK3CpxDic49!NZrvPT?wtjJ74a> zkPxCI2UhK;_}XF}t!oTOlG57vFM(U{t7LzX^7x{lTe_N+yuuwLjuV&vj#=BLpy{fl z!tA_S@BV6P>DpI1OIO9N>35NxQUT^p=Ihv%ADf&ipActOMESv zro8IR-qm^B{n=%!OCD@{6TbBJ_RYG@OUsql+=8#XmHTVUH0~*Dw(r&KD${)WRr9&> z+Shy64wS9^@OABH<#oe**NvC0`|))hN`=JWOJcf6VjCiHs%S0p)e^X z5(_UHbF8dl?ur_H*F){vRknC$HMKeSZP41-_-yJf&qhfaTqS=72 z*>e^1Gb!dR7tKd~&3_D;4fB{|+AZE$TX0;m=<~JskYaJ^q9xzT4XBltoT-*_i>xNC zfzVp14O=Z~x74w*TxPSu_>z^DjrICe>y?W(Xtvu}rP^4owB9(p!EK+l`LK=0z76{> z*_vLmaoV?W?@GJf!y9+CZ%jzt=+bUGnci+^wa7lu#y-l%Hq*wzrrjayl6~?%yK|}b zm)q^5R&Kh!Z&UCkJLO^9yp@|v+8rL)*frT~zL2`9Wu?RGMO#0lZn@gNrD4&QuPe7c zTeR(ljcIC%Va!FxRWH~=h;My~yA*ldK+5n-hfiMGy6+0IfU&f=;rOZL0SJaWOI zT~cw{Mbj;wyJrljgeZk*hhctILRs)BYX1c->5Sw|m-d4^(yauyym^ z?-rWocG%YaAg@R8$d0&2?x`alnU6eWZc5C|W)mPhR-{Fh$+s8M$Z=2fQB^~?tI`-S}`Dt$SJDBdfY1G#*X1jnYUg(kI zk&WUJ)|P2%0VhWTM#}=S{0=PAKEQG7K%QFQB{j_wzrZpz>?z8InvTGRil7I3gId%M zw)-9IsyO&`^x$)~L$Cb~4OATZFnZ{-+Tmfp!{Zf)e~cbRsZ$vIDNL0Vwoa-2#Nb7C z!5o#r!eharV>fvHL&PgXmW_q1u#1rN4_2-W)f@}GqLr~-H6vK3GR$-=%+k(TRUP3{ z58pBt?xY?uyghuAU4-{o#BTM-)8P?*q{xF~k-_RzZ)J$4`NvM#n(#+AsmFCy#y#ba>==uC z?H@l-8LD3y@lHKq*gt`3EIu$J0ktZTq3X~N|3tR&M9!l@EUS(PR2>l(FyI?MvNRw` zrb|b>Drv>4zXJ@aF_uPVn9YcTI4=1m81b52th-fgG1bay^lLQ+{aE}B}QLqvP^G~q)1e4FOa4J}Lf^R2S zbb<*dxNCx!CRk;Hl_i)}f*mFJPl7clxP8ud>;yMX@Xw^1XM$lScw>S|CfH+wE9RUZ zCOBb&`{kVVCD>hp(IvQCg1;r0TY|IYoTnw-&=TA%!P62l?|<9hw4o)I;P{)rH8*dp zLCJ51mO68f7tQ&!&wJ>lq0H@8)Y{Nr@4Re@wnjZjHOn+wz|c}qS+=Xp{XzbJr=jJ$ zj^a6c>%H%KT4o+_U1IjTp(XtR*Wq`aWuDKb4K2amdUDA;L(8k*Mh9QcGqk)r=WmVW zb?=?^x9;x^CFsriTl4S8eLm}NE&YNjkw!PPd=V{Q4u+PBx20dksyv!Dw9I`OuQAg9 zGJ(V>^D0r7*W=ZZb-a{UNhYcTuaYhFWL~FO+j_iCwcC;RI&Jg*f!DBOc-A$;HO=GA zQTMZXZ;pAD54<@}c0QM5zx$C#-%0;Bd3~pXMh5yaDU7oHv@qVC{aIAW{Qm4%)wlhp z6ZK>Va#Cz}4xGu@kw0+u#QwJf=V%eKZ*z0fcD~KaJ)8eFzp(u6+k)cTlT%KWk9NK* zs(h3G?);UJx9=|0Fv`6zzRBzPzNB8V;C*Sc>bv)4ZTFc|wmi`D{BUW&Cgwx7@1yn) z<-HM2Pb*%ed48{HJIwb$4USeIocZ2k~!Y_^T74N?^ zDc+I)+N@%%`o>6YU5fIiH7pOy?lS$@{IyM&PuRI$PpW9>z9jROqz78d!-llXG7A&i zCG3BcwQW-VFx=s|WYxY-*L3fZF86aqst;Tew(~ynyt8cdiEoGZ=+jv3xY3@V(a8^^ z&nP&BvEDE~pRwmusqC8Fb)h2n7A6MIvb$Hg8m&Mow>K2^d_wD#)!AEO!uDhgO*1O?ptMR^o?bE%_7jRD| zf||<~Y3kn%RXcdd#_Hj>;o()cG~=QGv0IxgbVSKINAyCpKc@n_qL|&+Y=ct&Fdhh;ifU<(3<}bw^{5T>4E@$z5fJ6W=+LXsp{AWpe5le<)0r)LQB!k!zHHaYG7o zOpjE!8|g{Fjx^6M;SO~xqsE~m%C2TSdfO`QH=M~D*Tc47h>zkDD0e;3TF9gvsno)6 z#ub!mZN4%SZ<;scbv(U6Og+`m?6^dkMBnDSC#*w_6AP0gb3EMaYlqEF?puHAb@REk zqYaaH4^4c{MA&jkIHR_Z#X~f_X|6V3V_U@Pp)5jNuCA1krPHDnu6f38>(v_Xfoh{uOiu6)gwTa;i6t+S~oN;IE;*nyiX`wS;Q|Il~ zBPC@k(Sj&Y&qfO6# zPK;g$n=lH_q!%sNS?UpI7{c+rli@;orKywRK~eeV%$vq)`CE%4)S92O2aeSd*-NPU zCNH>-kKL3uD~aCN?A*)TdrL9mvmYbr<>CjGx70`6WBoK-1UuC4kk0qVyF77O!a=Mz zh|fi(U2$bf(L$lej6{0LoKjX}OXd8jM|PcfrJ$VBU@U?{@PyatJVe}Ta*Z&f7>;K% zX;R$#P?;95MMz965y28zcrRYrzWm#&EJsyJM#Fb5^hFBBOPYZ*mPp{n)-W#Kt&-EX z*)8VDs=HgeYPo<^a|Y2wH?94Wsc&k5!IL;w!v4^0q3wi0Cyv-+9W-_innOj4Q8S~C zRBC}?AFRRbxJTk~Eyn8OZ{n6a>aeAdqk<7p4oomgmaG`2f~BE!_-lEw&S4y`6x0Sq zYB9?V6c<8cX}`9=yn>CwpyAA=R1dr&O$H@FQAP%MQc&rL5K zIuKHM=~2x@hi9uhE`J=p(6V6{nd4@AaoR9xzhXqBFO896M>&7FuVT0X~&$y#CjPMG{286~gL?P5j1+gLr5#qsXY6OgW&@CKtC(`4y6yfE@ z16Lynkro&&M=*WEfQO#vMyyF9j*Sqg!i#Ly3zRl6Oo9u z1S4S(wYDu7qZN)WL9!JIjzmUVYPdsvI6@0`rsCK4F)Ax!mP5``5QM}?LXhQ-`w+#@ zmHwgbj$sD5VZjEWs?^Zc^`XdQZ)iYygnearY8tYlpP)F%C{4n|C^98DGNV7EwF!ty z8;Z>-1a?yLrH!zDh%v8ESQ?l~5#+(fkb=b#kVRy-I3mHIc-J2A?vo@O>qXMsP?2~< ziHzp!WyXl2t;XCjPGFVE$WD%9PsCz&!*?u3a9xLcNhDK$CbRk<- z5w=AoAT;>k3yEYxqN*~E9*u2|%7|u4j2q85B15<)L#PqhE8{`PzjJ_X@&=<`F+-Xo zUJyw>Fn;7<*Qrx32u~Z@goxI+%fMx!LMe!fBV$YyCY2O@lz`X}2?_)TQ4&^+h&MfV zbj>QXV4~X=T39F!@g}pN2#7!>!(sUS2&jr)s+=NTmWI}~U}3b(;yV`nVFZ=a%N%Nf zdtZ?yJduUw%>3GgxfK;TLOs!V^u%~oW?KV|O3j>T$V3J*5n0-b#w?My)ICvz=K};{ z4cdf^u|Q6c|z23of?W4l`$JFn>6>eHx)VWw4g_?c` z2R>{@HrV|&h&sK;2kxf4uBSbG{A8dumqg)0XzV!08RkZ0r&)v z2|7^#PyrMHAOsKsIO_wJxP19Cyq*EX0ssSW0^k;K`UfBZqyd-&oTq^Y0Am0W0N??b z0iXyt*#qs+TxST(09XZZ1;7tLI{<6|t^g)Mf20C91i%bn7=Rf7EdW9QVgc`C0GR;l z0B3pt9zY|2J=^_WPnTn zQ~-7YR0B`};1EC>bRYpp0AL0k2EdCJfDM3%(2)SVZUI07Faw=K02TtA0B>smNPyQf zfE)n)02Be-0*D9z33xdKcnQD{AQp7~0o(%k2XGpI764%AhyqXw9Z>+E0H6YV0+A{BK4P+!7#H#NVIVQn4e`ZpQE{|M}FGwAI2W;@sU#(%}s`{Bv)R zU(9=O&f@e!DB^$OZH@nLP(&an`3O#=GF&u#=BX_}5tjD4({F41fg;3%Ry>(Q5no)L z=_tZLGB3wYM_~>{9C+wDiz2FCqzc&gzn(!6`*CMCJD;6G5w~UfPFNQi&Z3AHZf>(E zqT1$o#Qz|Q(3AUc@u4lCh|V1aAIhKXfA^uHH$v`X<*T%qUW>zL!_QZ}FMr%q{qet! zBJL0)r%*(?*Oz%H;*41Iv1Y{%udgkmJE&ht zD{g50jtA2y;#<3#)&blUiZHhK{|`_^q{2jhPP)&;K<>Ho6K@MEK2E$VzN7H%{lyNS zZyzfA&aZLvU(#{eMR1DH*CnhB`t0!IQ2H0q726(sYAp!6qH}N5`k>B(NW+nlAQ#`O zJG-o&JshPTx&G~@53X{|@*T&cpFRWEIjkmXiewIl42h>+w;j#A9xzshrcLecT!WbC;WY#>8JKNGuw)>0JZ(=}jxXQg$;YmnmmcF8{7+*FR9J7LR3vrMej z^EpZfr53&K_1enM!?RUdT=hMkO{+gkIO0xZeX^6zjGMP0X?Of`zovc}6+GBP+hG%ajaX7iU zD-Lj#dz2~wU^dVlYltM5DrCEw%VN5Y+DLvOo!2#zPuO6zG*~9?l0=jI5guc`k6)HL z+yl%`g`Af+n3lMw`tte|xdVy_w0>lw$9P`v#=FgYt}jR!``XlzC9`qLkw(osZH_oM2O zOT}?TUT(&ZyC=Ix;KR}>6tQW373cg6DaPNRr(##;&* zKSvt{`0N7|aZER@LFq+|_k997_wHe48lfG5wJP`j@ z73#%^%4i`3GS`-`6QTlkHHMqn z-bL0sEWNQmDv$5v+Z`3GAq86-xY3EBc6X~~7;9D<1U-GXrNgzmU3KKrxl%8;>G1Qd>S;S z4;?jJI^98i>#iSpc;VXc1sw9wFUVQV^M+awc11v{U%=6Ghfm=Sus=seJ0!C851iE} zEXobS1|RIcbCAg(AT2Tg>Gh**4B4?kBjgU3i~+Z9A_FG@wJHf!xC6C~9C*Tl8EIpb zAQO}ovB&xtHt_jsS%fm9eArgtQ1B}zGOh1rWES<5qhXCnT+8}ZP>Cq)iZH$#VP?66 z`}zbM1C5Oa1R*@~xZ~hz5@wtJA)(+fql^g8&O@~$sMBP>fv?CoE)1zbyr`Ud{sbp} zj0-+|1C;;-Vyzu=pg!{Y8-o922EhRzrAsBi8ywi(RP4P_ard2)ol$#A&E?d&gd#W{ z5M;|>2xl>qt751InUD*{L;Q?t#SEKBSbbVRk$VJ+D7nD`B~pyiq!12g?B3kVpj?bW z5g8CihHnoLW(yo{5K9PV;3A?#6A2I9capBDtQUZ~4bI7$l5TdJ-KGgpAt_PbAi$@Smw2=`oM{^y}*5 zpBXSZkH+5fC%~09KnsSN#LIY2<^aMAd@OMwM$9ncvwIYuVN7{tRP>uDg>kXd{hTO0 zz9XYZt~4Y6q+)2Y9zmVREJr{>C@AeHlr@qd+<6eIh3r5WPy`0tidc;<^m0YUiv&a! zLE^~_EcXyu3R;`YM9{+UkWh;g3C@OTSS>t2C0uYaE-S@kAO*WSZF>O0J}h^(T~(n>WPWten}#goOPAy-ccy$ zj?`@dgmnTbI#XA(N8@vCjk{8IRUO-79}(Pj@bsz_-G-!)k)%oi32!kcwP5=&D;^d_ z?DAX&W(rohU-h^nGdU5Fq!G?VrQn0nvSh*`0-{KaMUhV;B*c~pR#vf_R(ZNi(hzP% zt{YWxxAF-0#|h6G2&c*M*xjcP(g_0+A%e71speoX4ZWR2uy)MgSmE8>a8k86^9K_$ z30Py*(bRxl=>aK1mM6OfGS{kS4g`3;v_FLupJ+KsxI1uUf9WYE(dv?UIaQ1n5H5v@dmVK3&u z0P1NKnn@8b8~!`v9xfVki;-*ju>j?_9=b*Z{RzSbqcgS#2&N=dOk4PtojEGU!jJcc zo$L+fCF98mjt8M}+{-cVKDiIx)5xbKF(D})M^nJWGLO?Jn&3S-afZQwVDI3i@%A)n zB0X)4u*8tyv@@rpJkNz0(IT8f6weu~%EMab$#rMvGmE>aScTl#Z2TN8l!)MH7_UJe z#1SPz!|rp$?xY^rV}W9%A;-xlwcld&$S6KCa+N~xEoK5lb7*iMlOqyKWO~X3Ykc_i zWE2Y#b6w5Hv<=0H<0>^OC}$3As4i@Y&U^B$G z=Q;WCH&z$k$}fq^C-8Wd@Ea5A^9!4q%igUnLkin2OfD`q@F=Y{D(pC#U$FS1JXf;O z^W%n}L)?fMhrtl#47>vov&ElqP%(j%6VFvEm*kFIJVPbezPrS6?-D1f zocTHSR0JWBuwVEy)}eslEy&|8$Z7TNw8V;XrmPC4ta6s!6*$yI?KPFG+}^y2_#I-E zVV5iSjJP92oPT2FiTcWv48J1p#BBQzqCz0XhUY3kVeuCpyUi&I33F;16&ZfHuHY zfSCY>f}Iii`>4R6fc5~Qp+Bq&*axT!9oGO60#rq(D}cY~fCWetov{Er0_X$;Y!0>n zvjP?b$OV8BEQSDe0pJ682iObjp#XZKKcEUo2gnj|7yvuKtboSQ_e20p0fqw31JDWh z3@{=(q5)b3um~^|uo@sy^tV!h7Xc1}Es{BO^T*?;|7!sbW)ffh;26C{HLH#lQlH5f&Aix`kXxtUaK?Pa(#`894;(N;tj7o zaJ{$K-$dc~-TsRQT6``)8>|d6yYTp&1J|hUr*D&#;E>R;@Q6riRCG*iTzo=Az|ufe zVp@8}(PPI?oP?Z*pC;!_Op;hi>e<4g^B0OsO3N-@DzB)lI+}~lufAS$qqgqmt=o6% z8ycHTuUu~eH#4ycL1$EQ+n+_$kQn|b^7&G``eQ}FH& zK5D-=d)252$PcI+Bu!xvcD%NACX|fWXCT~RDWt!iN;Js#O zLjaMX*FbHxs;H4l{!?Fo9vvgK=_cR&Y$Y6rLs)eemV zx(2i!Xd=*46qVLO?|@zd9bucJJD_2xPe8`dm7sY+p8^04EvfEi9n>&14rpP}5$M}) z&}HCRbl7==ZUv!FK#@atfYu2G4{Zxt4E(y#tpG+tSwfLR^Mdk* zrU1KY(6*orK^a3yzkT}}8X43c0A;9l=$_D+pa(&1(^uL6WJ57S8AGdrHUTLENE-SM zog?pX_kqfXwo9kg(4?S)K$XG+@KCzYrlGq*SAqrsKpC0{G%099P~Om1pj|?XfjWm~ z1jP&;5V$ZjJ7`bPL!rY$TZB#l#Sh&Ons`M;1vEtHBhX9%c>~ggRsyXV(wN>vplv}n zq&GWgzR+}@KYt2~aL^Z^Q4 zZkVgqva>D6)n}`fG=H(Jajse~<+n#IH9q^~z@>tY3yyWsv(@_hV%wHNPx>e#tW2XU5gl8yK9#8>OrM#H=ebV0 zu!@roOmEYMlgSHKa#+JV!9X3 z|5V)~Ui<8w`(b(^x)SK#r46U!@ivv5NlY@iBKo#m4|CEPwy&h@IDXar*J7LG@h4ZE zP94^gw662qu=Sh;!v<2yITE~X*O$5M-qEKiOq`WV4I-{R%q3Zf=t`$zd`4et`zpL` z%MnXe*|A&Vn#{b#wvAVuDx7kdo=@7l1s`X2IIY9C2j_Vv1)cAYJ=QA#U=F;E~%x z=DJE(1y8f)?LvzOrQSeJu#%gYJSLKw6+TPuO+tSP;%vU8>Z*Jx`Gq{8fvqC)^L-Pw z4?_iP_DytX=N%rhT<6+m|KZNN6hhqP6Kw z=Z3z>wK?itryiIRUTSr0PV8qc`8iI?VHp~G#vy+G+s7-TAHRL75qz`Kq&RZrcm1;G z*59p~61u;C5q~4{edyuFT|b69-7=HAPVK(%!}*@uw;yA#(s%tF@Bhjk?eXs11-r4$ zRq#^tP{*#xA7gz9OTGsU%)Hc$GpIoy3O_8nV)~_K#?^!HQZo^qzv=&A-H2SYSn)j;0lmaPJD0&N4?1CawUql+9!8i*Xo z8>k)V9LNs{7>FEb73ds@A4naj5$GI9+NLerLCip(K+izi=$Z$D1bRc)DiAXeDv&M^ zCy*-;B#<#`D?F5aaiz3Jy=o#qZ}6g0g~Q(Nzt!2Q&`^4>Soh50nxVZcf{hQ_|>y1S$mz2Lc8nM^`wyl7Y^F zIDyoGn1Nn`KGAPPK_EdFL3Ba6LDfK_Ku1BPK%zj~-~>aLD9~(>K#(YqG*BtfGrCI6 zNffBs|1}cz|3qbRlN99lX*lsnQgTWvOvAD0<0np_GHIDdVHP-hE*E~?->2c~%U7;m z`)wL-ZfU*SmU8kzR@S}gY52+0o@eu>;dk#peEjtE!O3>oAWXyK6W_l7`1xxZ#&e4$ z^}*Xp;q+;E{@yrVz-P}GA*Uhvx69f*%N!(0<#&0NRynR7C%a`%Ub}Z;SBUc$iPSl; zfsaq^o-A?#T~D=6zvi&-(Ow+;c?~E;<(_acNJpEBOM?| zh8K`oWoYjaAY&&@rcwvSnHI~gHgec`Ao^IoY<`14F|(lD8skl#ficGmF2_7-Y+w1-P~%Nt<#$%$Wtyg2ybs2;biPk}`r!wgh{9U4tsk$lZ9jjlwddnc_9e@o zwPPLoH8L+;zx(XdB!{9SJiZ)+|9lR+i0o!gwo&|#4@>{UspH2t6;9mvX5|0fnSvc5% z$0GZ*{|dJMjkI3gKZDI=|5vc9^Bbxr<^|ic<3Q!NU%?jYcz5>wT(Gw^d=G1x3pP7# zUa;?m|5QDkKo2&@)(bbT2V-Y~t$|vzEC|1X9_;tz-pzvBjQM7ReQ$A+#!Rq(t{6}{ zOAodoMzZzfbg->+T4}n|!5*l{GCEEVwuQ+#2YRp_ndz~fmTfe|`q2WhKAiRMV(mng z{HItSKSo_3)?*9BI?CSt&%~}a%95#RSo|xon*{rq9}CVU_LZQK!1}qwKDlh*{n^>X z_SxF{!*@2Z*KJE}%p?V=XH? z7wfLMSYJFd8*2|z+})I!#4e1OP3-oW#GVfJ1n|h71%mx=yU6Z;?jn~L>>~cP3v`hv zLrci)jQL%px{Glacwfw2GE91s2H9DlZ8j^pbV=qFKKmXPFs zgneg;Ok3Cdux}b&{BB;@g>du39yk8Je5QFr*x5x93;q*xVdp6CVUL>&`@MaE8|H^y zdM@miLdGUR4`#z&^}z)*FYKBvzrsGCoI4%%t4u?=_s>j)U3R(5!#wK(2)j+%!@|v% z5Bz|zpO|+T7=Va>S|H;8Hqn#+IngHS>b>7C9UmVCo;!P%r>iy79pB>s=t zM7{HV+8{6K_t_-sXqS^aB_ns2}f$(80OUVO3r z^7Pr{WYJa4ZpJo&mSrmh9NmIptkYcu zI^_z-VSBgt&hb#LLCt=`$h3{r&gvQtwq+re;EjJB%qs zvIh;mn@)H0shO~cv&Znm+No|nC7tHDPXaZ|XW~vRrmYKLnvFY;)b5FmQ{8;)v~(u1 zp>dyYhtEo9_vQMw*_qIa+a!4veI{(nGTDDkbZRD?ZYz!|jSuK;CDqYd-Jaf7I=5{S zjMa=$E$Y7HH90@++aUb-1;hXECYN*xY{);Q{oz*30%_k5;r~1B2NnqbvD$%w`Ca`R zKBj+OSAT;4{^*yO9{k37=~q`jbYJ*akNH%=?l#+FXe9jDV%C|FTyS-v_27d#`bfUw zwBBMoI$cW_wJo1+pfRK9ZmL9<4N!_I|5o)BekhhE9(zcOcrF z3q<>0HyQbVZZZiAHW~Ma3q{+*^FS?0u5a@BtMhvk{WMS-~a>~x}I@39}Yl}?D@I#n#*;Fx4;7N z{hg={$NTDgESY~^Q}=nv z_Vcy~eN;@yG#}`ZDTD*(Omo49Y?J@h)C+hfPER*=hpFabaMM|RuBk_~^%l)G^`4yq zw`QAq3agp=Y*Rn8Btq43`oL*ju+w*E9uQHV)v-33-OhLjy@@|ZpS}o7z6h=XORkv z-}p+@(L9fR(uuj10&{!?W|+5)561-t=WA(!AmJO+JS~k~6DU1TOMkG5YM8RlY3auv z@sD~x%x1Lo?sb7ll?$2l8D^@za8J?_H_aVG-3y){k96XnJ@QK&b=OVFooz2)UlymV znBpr_C!^atYM%pNnI6%LURpKYo7PfD_voD6vnQivd8>P8PDa^ZnHvj1OCMJs+>}rM z1=y#c%Nh6ul>hz(QvP+;o8VqFII1lC3p|t(tN!~J$atNG@cs1*1iWH&gr7iWmT*n| z0ux3L$B*LYO*1TBa&pMxX~H!<&9H7+vsviZH1k2z^qVIAYzouNR*BvK#Qf>pFOV=1 zPc+~B3%Z0auf5?k_Y3ehJMqLi&4Pd9Y;qZABE*li6RO<-y*b z*`YShK({@UL6G2@CqhKh?mKKGDX% ze*ykCX~?<1egVV(Obt91{KoWaj(^`QcVbLqnlVn#lcvuZdsn^xHBTyF6%>BWle?Ig zH_f$t>R>p9jH~@&JogLqH$792-8T0N*sC;(&;9~J0&J~KbjGOcR+h2BcUEFY2V<>f z=gGw{-7zzLr@%Cic5(Wc+FA0kvQ>;ePd>gTORs=sQx%X3@z+@}{{M2IZ011U_@@eZ z-6y(01>{2f|E_?p1>&FIK0ZEQa=*!O9>>p%f2oMuD+zH)jaCIten3jq&@=+mJ(TnB3Dn8LOg-0H#g zn8k)oa0>`mgRuPpmt=7J1sfS~EeF?!aJ9B;w;x=^!G#vwX2I4LEPBn|OTlecP0e+< z(t|58Sj~X@Ik{U^2fnE{1c4~2I`l@JVaq9R@)a^T+zh4z) zbU%4Nw>UL*Rb-B33SM-w6mo`YeiOT*&n^~NKyP_@1HQFd9 z5wxSGIy`wnU!3xLhM>h{T?uv%ZJy4qVmO(g;T!WBwRg|&B#IlKGO7CFJf> z0|C-Nem4L9IKWR09W4KD=-45B#9igY0+%`k9q*NSM7Ll3{ZdEWz^;DeEP>B){-q8K z9aZDu(zMF@-zBf{H52nZaPo~sgOgamKTqfkj4PP)TJzRb?p56x%Uciw#g zo!Ltr<>RyL`>Fkh8Of`j>9b3x!X67{Z?Zt2{nwL5GxtAF8eTQroLl}5d;f6S0%11{ zcmFHwt6$3?%=0G=A$eoLd9xm?Mj`%}&V4v3Dm?mY(m2H<(mr>z`81($X6i1DezYmP zVcvRUrq5>IbY&7Wp;K@x&^aEf6%X&wDY(-1#zfiK`MS$)ZocL!otv+ZVP@y+mFH&X z>vvb@=IhNf^R@cIF^BC8^knSe?0>6m|FxJ){gvtq$6VmQE#_;9=jLLrVfXSR&#zQ( zm_1I~OwAVjx1BMw$H~T2F`c>Nm9Ja0vjr@E<@KlSR&bAy;)XX z4OUg)q8WBRV5tR`U|?eg_D*2u1GZ9N854FyU`-OXVPLTa_CH{)1Xf`{>0smJ>(>we zje5s8SwkU9^YAC=QRZ(3{~LkZq^oOS5S8#x0+$t|6Q`d$e=~SS;Lhf+FGSy%-VB~6 za7XJ^a)fJ^P zyN2CPms`((z_nCgde>2IrWRp(nZ66LLwwVRkI!mCS(cb-`0mobMc*~td-~2M%}lea z)nKCcoPj=Nu}vl6?6D#O{>R*u1*=rBF9oZ+u$2XCMswLnPeS<80kR7`GGUPjHhEz$ z3igX(eF_$vU^fdki(z4l{(S*`br)8tU>gaRrC=e6zGe%H%&-mx+gh+S1zRqVli;-p zIZ03cxtxd5?mtL%NaML|r>8ok^!!wZ|DyjN{mm7T{(rfMHb4=@{c{mzKoJ=%R75AC zi1hv{qQnJ?h}!iS{cir0IF7*x5KIy~6>EflE20;I1kqb)W=5XPiqi9ns3F;$G0eYr z7bTKi$a1cT-ahF%hek?yqzFW5C!*xMDY2Iy;n$+cqFD5@eocv*FG=e|(tei4&lS-n zHRNU_8sl!zM%#aWc43#CgW}gMR8M?S6Lu|PdP*#P-9*{6$DLBqtJ*xXu2d*Uko3|7-GJ%@>7Z99 z2*~`Znk!a%VbKKy3KxoXu6F;oRT#r0jTrwDzFwjIr@mhKU8CF=dBka-nfZF<&qEm5 zQ^H${8vnOO?TcO-i^=+PU(e;V*co`@;J1A}$13#Yrukp5+!JHtVjc$rYv;czFtJuC{463a`EgTOxh}n{q)9~(>i-) ze~FZm(*RdaYv$}eyqAXNgvQ*$o{^MC9XI0>i>HnBeRv=5a_hnwqu2ey_8Hz&U$0E< z>!tO4shia(pX`d3Uiv<~owrj_9KF1@$0Z1EnK^`|!c;T0vNe5_n&r2@i44@m+-V+; z<1pHQl0f#(9N)?Np*rA{|Ht8;ey0E9KtFeshm$>=<{@37f}r~71qGEwAExFC3aSZ8 za;~80wFyG^M_JKp3JMm)jlQ@`*Ef1iK^4!H6^vj|Q?UID1qF5eM@>PEFIZL}R!~z= z{xFw82l#)XvgS~Pfy93mMT7#0_zy(pbc}AC;X)#lov&A@|Ch)l{bxjGgaOBfLGLN1 zc?c) zGWu3pIAO!G(9yMFGgUD4RY)_!$|&TIr?fkE(NRRj`7H-9%vAqk(OzSHzqzkML>W{N zQt&pvs9BK-eOz^mjv{no*5-Eg_fMmUmg?bx`1JqL&csl)z-cu~-d`#lMx%A9ETcJ(Lg>5;S+nZ~Ax!ssJitYQFLB z2@S-Cp0$v#bOC@mp*MX{8W_@`9zciYk81Qe4N40t7OEF&7?cbOl@8^g@StL$VE%w| zP%3mT2emO*z)%%`KskCHLIFcPLsbBsqklW~ze;1EgeX&=L1OA%H`I73#r+@dzC13* z{q6t0@0q4)pH``43Q6K5ak3m|S|mwA2yv1SLJqP!GwmD3zJ(+zlI+Pgm8A$F`>84S#Zlk{#)K~M8 z{ilc{xvhkzwZ8WP+a|EpJPdxfbd*KL{lRe#t*HvxQva^%@Wy#Il&6HD8AD!352jv7 z-VTQ$;)k>nxnyovnfyLq>$`-m_;qK$i|pX{9rMynE_9@xgY5a%1ImY0{ue1N;b05T zFj0Q_$<-Z6HE)+eo-9~+Z>P(wjml(4=k_Kx+1b#_{GKA&Ih?!pPVYUyY67&F|Xt>oiGU4yfG#luctmv4M@K27(aS#I7N35w0XYRqYz$AD}}a z8qz{=M}WYlPCx`;2vESKsUnd8gmr1EKfBfFKA<#mm+g+ZJ{sYIhV504$cHeVs z^Aqfn+J58MCTxabYxu%q^kzDbIj!p0F4F4ynmW4Nvw0018_gB)wYBsfZBcP-E|G6q znwrYOns09C*j9;0xs6kCY)P7MY!9f|$$s@2kzc{ZRwW+Y*cXhu-oB~5)bpZpAKsu2 zCKK$xguK|Mc)_^RuA_8}ay9?cbK%j-7Zxj8uDW|iQ8o`-dQ?wG@xmfl|5TLsK_o=0 zI}TZ{?WcIb*sd)}X?*1XQO@+#D-NO^xedVxqzC-pDEL{_uqc4{A{k2~AOKdZD*Xrx zL^ZyJ11ln`h+x&^yPyDafeTc_SZEM^0XkUY^=}K1zf*|)TXR%4-wX|Ye~zkY!(q+; z_BpElzr4~}U8HO>Uhj9mH9Lzu$Znis(4qUGvS-RR`;nU0idp1s4$4{NPHU92$j?&A zI8Re~lq<)18YJ$>tr4}ToWe*U=YLEvjf^LRPj}VA7-3SKE0~Gi2PhlcJ;!jbD3;{zWK02z^Ln`t?KDMqs>;^ zeG%TS5gUAVvJcj`-W;aZG>Wfl>hvXJKY37x^%8o+?TU=NbEtChDViVfb_97)*W&Jo z6D_kIg6`$M>b1-1*ygj957rBr=L1nhCS6kPiD&jHF0mXv@c2)~gSt_?nadRq*1sC7 zl)aQg&hi!pTlNBDV><IP#p(sJzX4B40U820KnIuu z+5i#YgT)*$L0|_s0uVq0Sp`9$KwKHX2RH%&EFwYdKZ><)f4#13bU$!I>%UVr`q@C^ zgokqJNh7yEU_y&f+gL0;Y24cA&(O4v-ex+nO-kcuo}yG*Lo+?o=8$sf32ANoawL6o z0p}u?p0Lk6*E702o_>D8qZjo{Pu4M7+J)y?Z`ftU8U_2)?ycO{Dyy;vZf#}TZ^@r|A}XuR^TNMqV(E$8?bFoYb#>1?kuV=z z{a6u|LjxZ5Tu;_0jQ6o3sc&<9DSPD$h6X`~z(OREaw$j;0ff*&cp*?wQ(=2%jT&aE z-7>a$KqwUE08KJfVo;Sqyn?jZJ{hzC0gbRmC?l*9pd^~v0EHqTG!c|+WFr>IDi5L# zB;Y`Ck}zkBf6yoE=bqr{`8`Klw?Sv?gar4bUg-@s=#W0y_{^T$IkJNMUB~q;mSb}c`(`2JkJ0uiIccQy|h=k zHT9vdn5Rbvo#tjrRZ_>ijlNuOhfNe6y{6igsed%w)$S%E(4pqV^TZSA|R9~j)MI7mSpt`P4_UF0-|Wo8^vOP_v^}9X zHuXT0I0iR)I94HXtigkt295!%1F)0;!2y!PmH}tP$vlY!ZK@Ck*dQT4buR$Toz@dI7c} zjF={53F;+{GB!pL_b@Tv^5VbqugDX}q=(MQwwhW0%A%@4j#+blM5G=5*9OdM-gA04br z9HaFMBNd6`)8+Gg6^Y|7i#mE-l+Rn8&Fi$4%up4{v2qhw`2wso9&sR%PAmct1M~nc z01%*qt$Ae7fj|ccAkYB_2m$~UfB*~(B&mXcpbE8lViy1cU<+IJ*d7<*XRx{|Anx3` zNiYG-0T#d+K?Wgkz=9w^=}u`$+JH8H&z(-_li07{kGr#BiG3FOe6MgmWt;bRMjUK) zM-=uxaq>#Tbr0ij(zlFm!DO9K#@aJS&&ZM@-yNC4!@UPK3PA*XM1XT=yH{9 zO4%zGg_7N8)8y{dIAYJ``j`s79%mH&YVWqoB&G(P)y}-hge%u6b3XomI4G{=8|opEN2@^bA)-+L_iwsO!i_xx4`T zpzB9l5F#XW*tkIqsRj)qhBQ$~93X}eJ)jiGIQRsL4H`ih5mEws;4hbd)GpCSO#ZVU zb@p<5-n8$3)HA!6KR@xEkJ=U=mHFnQE-_fPJgwoj7~xhr0}BA_x5dog$~j!D@=>Rq zIjizflW&@Gn^t053>oftZNTU8)D23WJbT9|b|>-;k1mm>h-kGh`?LCN$zjuolx3J#Kj503IXRw?1D z5`d$Li^YCjy7goiIg!~2XaznmmO~-0#M&e5e!^BJY~q2L!>%Zl*0G+6)YXw@VnY)d zUc#CusF|FLjviKxsYby65C0Pi^AD%Q$I55Kf1DfyAUW{-UUD!f(_=f+I5{|1fYjh} zeWod2ujyKF{V^LN@7~v@>bGv%yqO*+NB>MO`Fc&o5S?2;p0~fJOmaMDke-Tbaqpb+ zkmBPs-Err7g{kmVxAF=wrBm{~wtIAD%iYT+-@ww)2!`T+4ozbf#<+r}w7gtboX*~^ zyhQuF9ZEOe0{t0wZ4Z!46ASwSOw(#8SGU`P_4bsTfdjd!09U zuwqL5Y**dKk{#p{?WE$JLzPqFqbqo3iYf6XKPNv?Oo=!1BM!&1as06r5K_*7qabX9 zuppH~czNQ}*@Tg;Rv=dZ!=Q?R*hMfQd=a}u*bv9ysJ{qe^j1+YRE=E(B^$nM?2@i3 z0vGX0VplaN>)J4z12LMAC$?)`0ojET zhA}st&a}%@tbJ7scT!Bcnk=L6l4@K^F4I@@3pthb6_5|}A3wdG`H@}w$~WA7Keq4c z&MJ$p3>|~tJJi2k=-u7?%aV3o>laCOSRci;_xFf_cZkEM*Hu6emjj;NS5qXd8;wf_%NJdt0%Eab z>cG>aE;r5bOxs@+izH{c5|*1Nk1}(x+z|!KeH&$jd43dPh%7eB5MKyMLXU_q1R8?t zKa4B{CW*vUL+}BfN|g05ySk`LcQ(p~>aXW=?Y`7U*^VgP0$N?e?1=^2RbR_# z7O7!ObuTZ9Q8xPq3sVjHoKdbTZMWWdm!q=!d$l+qJMp8!UyuHJrKh6$>*kj{xUShZ z@s4-W@7>Ok>Bs3C36a$aX-kCI-UdSYtxrPevD8L_NHypXQ0S4c)P_Jq=pnukbZh|r zE3x*kN7;8n?C)CaPCvBRQ^vI(?mfTZgDknlZZ^|+w#lNp-F@{Id!dwGx@>cU-F@4) zq%-?fclU+mrk_%IkTs!r>6Q9mOOqaa$j$yL$ZPw|R?Cw4z!*ZFJ=GTldXX|jb zy2C9K*h6azezX6bR#bJj1+;NZvs|fkVEDGor+Q0 zS0#@)ic4#APH$6CS}Q{`JYLs4vq#KiHKwK9g9l0T4ErJ7diFzvfM#Ht!6L}gur3ng z5?IcOt(z!PD}BLJ(#m2{uG^(6T{M~(Cy93-%vys9SClKqhYlP*BYeaRrBm$lv)7IF^iz4SOulmb zd1hEd`zeYM>)ff^3z{^OzjKvqc(Lf+8byt4!J+F<6~m=wqsQ-8WH8Ui>|Aq8@y=C8 zft0!z)$M_lZHTXDt&*)zL~IAr`3^ux%& zb75gVrbkf|!P45O=s2uRMn?^c@-YU1izvuC$N(vF5{#h%XsXx*xJWGxAVqEs4hPDR zFA<>CjY^C`D;P>az(^p*c7TC0(ggky&>$RS@COhB*a0zs3y}Zc1(%|l%ve8WjZgj<;o?=Xf$poGRG=_r+ft?fSm)f+fC{v_ zOXaFr1~{JX&7OK)K7d0tnHM9l+S|XrLlNZ|BUo@`gV2tP1+JKfCF z$dtOz0CK@$HcpJjlie~l9JVxq&)zpr3x^y zDH&>p7$ZXo5z2!CG%OGBgeV3Y5QYdq@?;0qC{&=ZumEe$aohp-X*O&~0akz^paAQ4%$f2On?PI zLnnc00xuvKg=1pS0CCo%0c2okAPk5nQ>Q=}dCdTvVGQZNb@R7!bmMQl_-Wp|rP1k< z@1~S9LRw5{9YyZdsHT+5=?zT;v2mQ_MjN`5H_+O8sd0N7%#R-4zaeizvFbq4Y-8RX zld}_VD(}@mj>0tfd^7I7_!spXx?5bg6YV^nAy$A4_i8Td*xLrmBqQ|eJzd0_SyibW zm)H(WP_zLJe$mfb#jqDJ##t`qb@*uEML=etHtc1Ja-ir*=iyClN?VRmUchMU>B?0z zHwkTZMj=OUFHn&jP5R0?g&fT=)12d|7}QRl95!%MlH$dW&!S#ak0{?dXpq!E2&-cM zE8wxFvDP3y5a;qFWE=oq_5YX&|94X4< zX(>ArM_w(E3K#ocfglsG1STtT>^ypzbCJCEb)EK{i~+qm(l0VyJJpewy?rAl4dq<~7{O47NV zsX<;i1XI_!%)`Y@J=>RkAF-*;nekMVx;l@WQ98<=O>OSb7M@uSQkhuo&;n&@^UgP- zNbr7Rry}Khg&~#g|4`1=&20Lz<#dP3WUelJ%5%eDH2c&G-2lTF91c=ik>3(i46p19NLm?RC3-(AbQ5X1+ ztxrzmVsK!Pd(Noik$Re3hhfF`>BAUZ-qZcEt$w_8iVqXR4H4@9{Nh$B3j=A3r%ZsSC{8!}(VU+4>^-ElnG|2>nBH<* z_Fm<9Y3Kc!6xYw;UcM`(tu|omp1z9q%7N$6z9+cq+RnDSM7dt6XZ9#8SFg4_fv-5C zI=e6*_Zp5K`SiY~xW9Y9pO1d|RQviV?loNcocKk}wp`3L2@y{Esy4kmLc4Pn?ltsS z5jaPGaLB!A)3F&=E{0bQ+=~^)*xrw8Szw?7vtEGNlEyG=G|L6lkybD;26&*hg-#-A z3j-ktQ&b1o=`KVn<_&;P;0IU*atLe)Tmexaihu+#2GR&zS)~C~2u_IPuumiaW`Y*r znb<}GX($k&2>Bs60U%kB6Db8+08RiNXklOW0sQCAmjM5eIzj;iJeYi8PrLv^gb@gm z|Eu8iBTOn`78A+DC&Y6WE?N|;Jd09aTK!kfq8v(0Tzuw-Fe?Mh7Jmn3uPc)to4x%8 zW-qkFVmgX4RpS~p++tum&{Z3cWauQ?X|kVkT$WT;%To9Sfnr9i#nZNzHWk!2iy$@| z$2dFCqG*n~wL{-k`;@P&;kjnn9~@C&apu{My0a*9)Aie0C&v@>*GzpNK2~>jtZrUb zqO;+UJ)Op?&G~_Cm|3FPHp&O4`zD5(n)^$Auf2In&Y~Rpd7OHT*svf&{ZN;Em(!`cr7nxY$fJ|G2Qk1;Mp6dA=qRAbl%*uf|ctR5mzp7|d+gz6iBfRQfJ zrpF`~Dr@X4BN?_qqC-~MAXWiJpoyeGpnl+#AQ#Xh^FOeOz#w1?4I{9HfDt4Dr>M+&~3@8^Ib2G(a9gi|Pie zwSX0lCm}cb??9FkP0=(&i}?qlmHC&VRrmwZx)0Ifek)o>KgHUnh~iZ$YN!(|6`r6> z`qU3HVic%i7sas)Ef+`%sO9t|i~_M`g6Wrad}!^YA_tcO$;LM8>Q{m^`_xXv(c@g) zs0$sN|ro6_ggz0TzlzD)+uR4`CDO~=Fb zUX;<`kWseSIVWG9;3P*?5KtA~7*!;qwd9YFw~2Am<- zfkFZ`1Ut}%cqbEZtl*G2I7B_>iV^sL3xKE^`>>q^m&BDpa9{#i9FXBSAOJ;mc0LX` z08)|n5!nHVfd*9Cfm$+ci9tD4a6lLV4rt?#NDs%)~CnM_jL zv8@}hGcq|RW(VwiH+wA%ce-7s91p&_(;(4k+iC53jT$~6IQ;Sv_H@^C)2kPh^T9dy z)_wK0R8HFTQ47kf?pdtNh++^~y6mYqo7_z=sGBIK@p7-W)*>=6C$-f+W_x#qO;e{`LIb8el;h8n`5_#EN_-vpP0u@DFZJQrCgf(#u^eAFdK8i6y<5EKX#JRn2_!y$k! z6bhv?Z0d!FB6Tw`DJtMd>S54uTN4%uWj8QkO$f8>cWKN#uAl1`JRu!0lw@J(%T0p#Z~h=(HkTLplY;#Ow;}BqSBe1xdn{ zcybUL?{#r86PK8wlDHC&W6Y!j1?z{Cmw4=sDmkf)BdNlmDAWyCnMpGjg+9~%~;vB=@*u_Mq*Oq-&@&W=4mE|Kb>SA~K;PT8Y|{_I%=E>c6{|AJHg z|NgCi@hr4kLQ;`fWx8BB=}^DEq`pVX?jrWxJS<75tOlwq0IC;1W#>sbXQf=#sCip(CEEJt5au#}(;YLfvmO0XSa!NP+sxD8^$lc1L zzl>sP+-x5UBrYeDs9jcM z)FDd$zH88vT|G59k7`5$^_Cr^2Fv)Vd>uX&DCP~(b~@dZd0d>n@ef|tkWKt9`K~UR zftwiPzMsq8Y&e%^SGpR_lAJVZ^~OcII(Y5uXkHBWt00nRc5RbD&CI=kv*RcJ@d;}< zn=)sX2@V#z2$*J4u}Fs- z7%vJ96MASac1V=+wL&C4)r|NLPccTHUvkym_)#JYZ=;JYI?RPp5|O*JHIMrA?$Z<* zV;JgCz@PCu?J|U0dP3hZSf%Kw6^I-PdGRZAvp-ALz z<;$m^g|yFmqWO^CO!*6|U7C~z3iMiNr*X8I$giS(q7+-}(k8C{G<9dr>)Y?|@<-HA zlztQ~*3mZd>q#BC@}-pioo__%8MATyeo-%*$5IV*fl*f~q?#|g;dS8b!OD`O&!653 zs8pVXj?kwm?Z9c>I#cf4z>^|r*2_5;`*0jwFr>}pzfc=P7jTUH&d;IziiFWdqV85< zhP+9x5o^p=*UYbduL??;{91fEjMpd7dsznA7~Fj6%tWbxcP1B>W+vi%Gt zoPEa7^R;JeT5QT>p&)p}>kX$mZ|&d^uA98!efBBm@-;P4w%(gGhZGfT6a=dEx7~1! z?;1}%3=~cgQ|h!hV!yE!rOOo=e9ajmWrTrxwCI}NO-f?pTFzsp$y|JLxL)>REy_RD zaHI3DZ5*Qvgtig78DWv?X*88;E78vjjHk*)LJxQAlLpM8s>?MoOtF<(->XtB&4-Je z%kJsUEpn>*Ac$j{25Ag0D)Q+1YKb%{xP?ZFq!$B|cTy9sneTmDwDp5*Ld@^WDcdnt-T2~xTMek~X*cX*Y>LD4Uazl7 zO7A|-o$4bN>kKxfn(*#@ZRK{nTz7_PoS}~(NB>RvuT8}6qT8jNDN#N>ILB4nzm1@U zk&Cc}zeE%+i|X7rdk9s##YI~bVG|W3w0N7LBQm=Lfzy|>=e*s1 zOrqD^h>B3lVAMwzh+BFJ#O@zZ@!}_VgW3N4z$>T=wenPVtr-gZ5}%xo`G9x2SLS@8*}bw09Tt zM-4184G?yZI4llQqa)Xt1x52$$BkZDW7{)ZFmmz3P1Nz*TV{4}y#3_&v?IKOFWmMX zy7lqK`=hmIcP=<@z2W||_s1yR9I?80dC1!#&T2k65lu?UdEHibQ-60cvbFa;&Ed5L zrn-HjI+h@8Y72$By8^hP`v$B0kK6j}N*Gdd-{kA@;|}4wlE!&IFuPfMQcJQcerm}B z%TKkZL?d$+^|N?rZT_Li)93eYGb|{BwjYXp7wul2Zr{$P+nUq<=XS3=Q1a-l|4?d# z?w-}Byek~vSDYE^vuEwql8Vmbcu{93FWQq_>0R0NQctRH`>7kAmsIxn^x?dCf#!z3 zhbu+qA4}tW_NESEDtmVOctN^oZ<^Z0s@}stUR-@{@0zwd9{bGwcq!%2m(raUPX?^} zSeEgkCL=%j$>2jDFXvpT-Zr}L(_uG1Ua3y*ls)t8(~+OnPR#prUrub_XF(5aubuSS zzkAi$XRoaGAtG!s@}IVTcO$kvLQsYdC3?2jPj~abZ$n zPvKeNO^F|c2PO6q78A}7)*MxOcxX6axLDS_!i>(CITy|qwiU%mVm;w9VJL}-geeqD zqG2v!4dKFJk>Qx(kKuz!6$a)NwiVtKb{10`@TTyf@SQN1qk|`+5x9Hz?tT0BUAuny zVBW#_ghiyU26GHU437(U3kwTZ3L6R!ik>&7uW;YJtn9+dRclbmJbCg28W6}6V5woF zVV7Z%i6MslMf(7L7fzS8x$w9c>V>cU|H-QUz?k}Zj#EC7Yq0;g!9n$gorAinOkJ(B zwW}xl0Dx^%H#DXWeNvQ*HrTa#%HhFZEw4E{r^d_b8wbkGl&fc&ISh5aw<2bJy5-T_ zF3OQ8MNwwMmjh14rA?-8-q%;LnNq&~SUwV!`1!N6i`yOR8U2>`xb&gdQ>{&Hi7~}m zy{~nhgEco?1}x4U8T2u}dg#{0e;j2Sbf|UyJgS#qzCgp-cP_W-ETPYhHW^DIsS@>a zd9AaqL3c04B5$8jl>WRjP}XMjbfss3WFRfs_9 z(j)Ck?;h5(eV2Ca{P>~Lm|izdx{`lQD)zQ1Yt?Jmoc#eVqlS&ISQD}}vtn)N{>K&T z!cMlSOrCyaeC7IC6`7SA=DmAdxlzost4fJ7nNYPU&SqOxYEtJXRhy+Ac8}AR5B6F~ ztsc8}{6fz3C*#vs#@Ic{NLxAKNoLpa+w9Ue&PjN(J?G?CyQf)uH*DLsHEVxY(T>CK zo;=+tii(7Y_=8SPgS<{=o#Ph-^Ei8oQk%v1+=^{LMsoT&(Bs+X2mu+Wz= z^IqbnxsYEb!9?M%QzoOFYYKH-xM4*)Kl7)@ayp}F%=hG!M{sr;?T*o*ikMHg)Q?GQ zWpqjkWf!i`r%HA%cz@=%7vV#qA2*F+=<-NLD2&w!d^W3i_?>ro?~l|p)th~Kv?Z0S z{>$S@&m`{(H;TlqyWiJI)1^~rw^HBkYE^xP?AJ;ae2w)yZe8F*H5YPrwJ$%!5e1G` zZ|Y8kQDVJh7vav;cXatyg7(}LHOf=0#|@I?PugTii3)iU!br2v6lL6kZ@$_=YB=3$ z+9YRBiw7t8l3**1&6LdI>8w+BOI?Ibaspj!YiKI#o*@+$S)^&*(=K62Qi73ZtL?LT zQo&P4M;gU78&~TdDX^ZwT@$J0!J*QYSZVwrlj(Ic7EfsUa%FDGmi9BpZ&Rma+~Wh> z4L1i0OuX~eTMJ#N<27Q+QzYzbddrv*#!8A@4M&wpL?#09*;-03GK>;Z0zUun)WuXy zs=9M&q~$YebdXra3zd0MDFcO?HOEC41HbZS?7p=A^@NHLqYl3efYCaY!4A=4uDb8U7>x?53W1I5FdilQW@<PXSU zQZYxQPqhij*EU!yUAO;qdd|Wfq2v18H2XSg6K|Ao@bLJL*Cp=H*62@oVl24O^-JGs zPW0gjPK0nM6*jG-DZkLThcA-fnuU_u3{kcN)5P9g(8<&@TryEKRP&+Xg!1f}TEE|P z;79S-Sm58U8}EeUy910QblS#={hqsq=bo4$aXK_tnrhinpf8To8yGeuN}9D_uqY=A z#Z7%; zxH(lTOr*Fe68};TS5Qt3rG}`*2_$@{a?OaG8<%ymZt{BMYq;mS2zPCmu|u-1s^?SD znJZg%&R1i`_a4}F_n7d>9)~O*_a5@`V#lI4ThFwfIPB()J?fbq-MZ#Pv@A=}JTnZRIyN%GU=$~KwD?SJj`dTX~Yk9`-<@tm+IGtN`Y71VHA86+*~;$(Gg z;=wsr4s0+OWPf|mfPRN=Ts`+LV_>s##|g7G=j!gm95PDAu;{S#u;p<3Fx&9G@ZoU# zFyt`Ou#PapaP@G}@W5nzjZDtK%EDB`{ldY*|HEv<*uy`=*rODStO02PY(GppY&lFj zJUOg2QUIg|u=Mcl@~Ux3G13HhY$OyUae&WN`j;Vi34&0qyRAXF!Lw}!=l5D!)e22qZ~|pG7L6)tLrzU zAW4DAM|OZ@0iGY_W{h~p#3o|k8iUm+aKnKkaX_X3=TAI83^}pl@ZqrE7!X>qat)R} z!LB1&K*EA5HgW-&d}I(v2VmWi5j08%;NIc(QK2S=A8!BuoNsSz&K*XHV+GAStE|CO zn)5Yb;^JkkdpBsAvZK_>oh0laf_w{}aSM;AI&|AZ3_&AD=;(t)ruUeTuV;|a{Z z)Z@zI35qRvm?51vEBkn=t+3sQWkT9~v6#1Jme=)HE}RJw;YYiNz47i7IQdE6;#_t& zBk7n9e(Eeb)2EefXed3ZO@g+j<}3>2sFA8$QR+p~OE9uekY}18TI%R+D zeDDxkHI`4$J^1c5lYoT9T5zk4<@-0;7jF5_T4O93so_&;Sk-=8M@q6Z$LPlm{S|*e+rh&pZ zk*BB23C)2Hj-}d*oOVTMt)oTBqF=OK*Y>iQ!;f8PRi5#{)w`?4Baw#Y@<*|pF-sFf zyE0NEL?MFRqBdvSO&`68n^}~aNV)Ign=C936LU>NJCwHUkd_;i$oZg=k)pjqgHm(R z9Z#M33Qr8H-hf8`}Uu(W*vyD?weCy61$EB!iPsi0v*;j*>yd6eqtv55#AJR0| z{%QJ9IyO9hTyLGRAca2pSw=BSMIG|(R#Ra-#$1#i zsn(HlkT9`v7sQqviCAP8Xp}=!l4MaN^+$48fvCq}sl<4cpOsYD%6&kL@ybA}(&Yv< z_cT4rh9yoq{QAn=ov!@0B{_x6ilHy}b=7vF1vxEwLq<7byI#Xzoj!LMStl-KTWAbv~8f%+~>iIPj{n!scm0c+-9e?$RM7P<(Kf)rUXzhpegB@8jz33B=H1sU zURI!$;2ULCBO1|)D?aVd6SwvQj6{q}#j5RYrm0+4fz0qLl@i0XNK@n2aJb1bK|5y| zZEqWAxM`LXeQT7^+9*zEYDS^NyF&t}jkT*m8Lw?n2fZ_HYqW=KW$5WIjmo+enM`w* z8fE81|MaY>vF7er-B1lqYSntpp;fNw&!^7cVi5Ol=^hg74Dd=IKb7ArEc zb~$a+rnhby-GM99&>1Rq9NAwu)PhexwH3SEUlQjL5GdhYEK)a_7+Gh|i_eVw_-d8R z-7~j6Rp8_xoVHXy&cbpkhc1)QrNJ`OvMnc@>K>=mYa^&zJj(O*C=J`yk=QxTrF^Zm zdp#5B@?A7zjtA0OH6oWgP5Vg#U8yFfaUFK9`FeJeZq$ZX7DZi7UE4UfVxaI-+Ex*@ zYxmfTHJquRy??!ZrDUAPw6(un61zl6HN1r~O(rwMY0G1$h1Rcxi7ok^_Z9c`wBe?_ zjv6PTYtDwD1o__F+$Hd1aqz`A`mNfQWzvbg#?X zhP~b9e|Fp8-Dg4#Q_;xbf;;Wg=-^HheYG5~ zoi`c0LhW+qm5UE^~T#k?D(F=}Beg(fF=E|B|C z-Bm(^D#}>gRbZxd{AAM|aj`C;+pk@Df7H~H|3|M^cPTy7bf&4}%hb>J+N^tic>aLu zh3eKpn&zDjKATa!cy#(GN!YAoU!prKeLGk1B>er?x=$vr8V?EM^_fL+mj=cPXexJ3 zO`%?D>o|KqF~#@qIim7ucdE8r-6TiMgt-XJvs@`AE_%%Zk=QjPLiW6cSihxCWbESu zyspCEdevl&>%q~!xOD3q*Y?5*1N4HqeXGQj_K7FI+#DsGDlFtItzjxNMSKs>0;7?i zpLq70BaH4bJ$35MVUb}GlG4sjsm4df#FP)a8pFt%*!j}5^poDAn74b>gT~XrW-Tqs z_olnFlTNArc;(>HnXXj3sw%aE!Xx2tS7{hLpY&kmmCb`inQ9kb%uK&|efNeJ?VfwT zOc?(8zUleglf&J*bd{y(EI$*_{07BoTU|s|pBUjOw59GvJLgk2O^Vcq-7#1^Qz~qm z{=s$Z9l<(tca82XifjWYik)$#-(Eo$`6Nd)=33Ax$*rZ`}}{l{3FZ(&|V~*Yaa)qK-VDb^g$u_b}%ZlY0#H zjk>$eVAdjUiWw9_`@HB;d$JpTJd$>B!{0q zUR?L*n~Z)(o-8x?c)4TDo9x9$o{j7G>4thoVcjrb-4k9-dI5b7S1V#+#YoK^-jobM z!P&#O!{wv+j>4(LK-6w_~eiWu3RvvaAb#wS;m~6Ow*n0SNRI!l^kO>ha z1F-wB^)UDFpz!+e{jkn({74C4ZILs;@x#``@x!LWks}j8VgMfx_YZ#$_Ydz5vku!0 zXAi3lBa5^F79ai|799Biygo7n7P4r1Bi$Vm=>%mHZtTt1r#$jj^5+3@S|^swy63Q%Mx#vT41 z83OD(QUW-5_)B`Rx(T{T^Cxu=++z{{yl#T7?hx~$;|o{adGV*>^7_Wy>>0<- zD=)8qe)Y&I&S8_{^7@j+E=Kxo6_?j%NcJ|Z$q)pqFB$6@F)J-`v-0wKMNWK1u;M7f zS8uPE#Y~mjrhaijOz&w;&SQeE>wL{l+sgR8(}x{N=(HV|*B=a09%5em=*`=#8~Z|U z=FQhy)%!;7^rttDB>w!{Nc@1+FCISuR=H{Yi0Nf%o z2AnXZhH?VNy+B6T)dSW5HGnw4Am9a{9oPnvfjyuLeJ9|7L@=Ts*)4(ZjNY4XC0+E5{Kwcm<5FF?XgasA@d7(G~&cd)9 zI19uCRsvgr^}uB)THqxCSP9eyRsw~AfKbK&k%7NJWMD2(80ZQ7rOH|0G7uR^3S|S( z7D^7_CJ+{g33UiC8Ym1rg)#=qQy7f{-GH0qgjiBc2nY-X+5-C!<^o9(h5`+N)WAF7 zFFg4MyMd=bWFRT9*ntBFNL>My2@nt=Cc;*rFc21)h>#S>2%SAJ5lD(K5lcX*F0ced z_zUy|{z5?lG(?(*XeWZmz(oJ&3JmxkZd_x?*(86V*FHeVuG&}D7}%vu>;|wOH2{@+ zPcfFwuHaD~Xq4Z7upgYz?1J5(Ps?_&r|H<2Lw6PDew25$l$-Vy8+OTEt@HoNWLn)3 zVKe~GGE3VIu}nGmy5f{#D!cCGQ1+aI?<>zAR5Sp|WSV8_`$y&L4=5fx;Dz4ZZuz%u znjbk8FpsVor+n;SS7GAvQ;5-~-!{}Zjhf%&)rw8xVtxO>Nb*8&Wyt+_+W{vxQI=b) z?kCnwrX7tIt}t=bmzplJiqAJ#>`GrB7{k{XznbF21?F>&Lmj9@?nT?W$+Sl+q)li0 zS+yKrED(>lUZuavdr6yRtN3fW_;Gld8doAMG(=(^FDy_-_uC)$NYMbi|ER*%J!Vjb zYa|mL?-pC&5!okn*uIdy3{`WQS{a1CGywhnba}YhGrhoXTc-P#ywYtc z2ft2Ol4adLibAD(N`4pwd5{vz+E?7VhEFEFL;TwWBUJ@9?~?%j(%AKFI; zZ#9bYm2EBGHL)h2-#RO7>if>z%3c?GXfHXg-RYThiIMs84gnJ;c~=cG8M1GutL3kL zjsquX2x#8wMPkvx ze0#NfTekT5t&3W%HkMpCH+Zq%J#YVRWpBMkZA{zeI;QQ4{k=!Ghz{m7_w=Q5Dh5n? ze|uKtj+rB@e)72T{!Zc!Q~UC$CX-QPXsdZWExxVItlJBFwg2#N`H;y6^A?|)_n{(r z=8F%NDL=11cxltB$sZqQq-S>x+Z=n~<5PJ9a5hbbp6jILG0NA~3X=={AU+rB0&)kZ zgPOt7cwPcl1zlo82B;P+4E};7)V(b0LWg(j;mGMS*384nct+a*#SwKZn{uexOMZ z4~Pw%HN*zO0~LWLL5iROkQ2xcG=@~gAvr`Rh_pa*pdZ9dLzy5L#0x{8pfpf5C@3@r zq5@5V$;DPR`IN|zkwi`)GmrR0emsk0%8C$gEB#cpd1he2pA*>#uoAb$$`K_ zjfg*mIVGY3d4S$PT3`a8{m>*x1#|+&ndrp-U6J^E!lr!37ZV#7|II3rRh;!3)-#(@ zQ`bSZGw_Y^FTFEo*X}*vd2v*K_~Z1(jhioDxY}U7+#~GvRU99_dTGPu%{A}pSCMeo z_0O71)e}bAs_alz?qFavx(D8i5Es+B%_9ODNn0BOUqPUxH)A`nLb-{=j@BI#KixIT-NcvDPmHafy8hB-*z?f`Ha_w(y;0el zZeifNFi-ixu{uaq|94rwdY)Qp6ZsZQ^z9xN8|+B}rH-w7J+^}#sv;jc@*>xNsHS!urg z2akWW!hdY$qm|x$9}89m#0J{~X)-wwtF5yH5Fy}(Hz+B7$^z^|ZH zkTGZ&q}$oq6(A;AJ(vd120=40iiA$4Ooi)}AJT+fgt5nCK#&B?Ei58hQXqB0?qG33 z#^7o48WHrY`WhIt4Tc7DgMh)}V017&c@~W7!{3A2|Ja`brnwQ3kxWc%4D}7B*Zu1Y zC00fi#l@Xe>_xs*cKJ#JOdl(XIvx8^b!8;M^qq?6DyCL-+g+Vqz51brgHT5E^q3HB z(?)jn#XA2BGBIPu32XGyJ>S+YB&R$|Q;lQbYZ_?f!f14qsM=NICK6pM?;`*FphAjk z$a4~jDc7>>us7^6pVvVx1f0S|T1=~lX-wOEha41_`_-Q{#HRYrHRY>1+5Q@_Q&v_s5+`wz|#yK3D=H&?nzEtcj|Z&q?@jYAZ6wZz*Pbh+TEMa!ohB>RQHwMcw6?-osVNn|%Pp zga$ywqb^_(E&110=m@64AK(@64PXr- zA+QF`0Ml?|Ae;XtXab0wh{y;4G4>w;aYIy8-02?zv7{*Sbli7<_!K~l`4)(kAIvFV zkvOj5BYDSr#}k?~dL-YG;f7R&?26>miKYYW1syiIs;^Ud(d5<4qdZo_s)tXFNGOcp z3Yyq1&yk9jCS}(5rawIx+aj=#@55*&@M{7^ZsKEqJW?*xGi;lET`1F{dMzq=C=GY zXMvlD$D=H{*L=mZUe_ID?ss(FRK_tNt7uf}DJIdv%v3BENoKw#n_Z6mv0^6O!EO4l zUs{Q1-4OL#e~`^C9=4-8w;trA92^bz?;TCemTz{E=Z*U%ak>c#aSd6PaHa?^nw%>D z#J8oZbrs@jlG%q;)a#NB58zR`$B$$hNI8H<7;zYV*m@uWH7EFWRILG0h!PM7l%dcC z>x>c*_e2%(y1@mZtoVv`dUY%hoxg ze&5*s9o-Yvp6=H)6KskurA<9^6?^wMT9y{Z*#Wc~KZ^=`;E|vf#ZGc}RPWe5gQktt zU7HIw9aQd89%eVr#khMwZri>4fJgGgaQ{_?x7v17phyodgl5;ARV=L-r#nv^Z747h zdZvuJu=cV1KssI+&Q3OI=E=8vlOJ=x_j!dd)}Cl3?Z3HK)XFmtTi0z`f-r_Ng<9Iz zM3ne(OR}`$UUc4?fkh%yB8;}FerB2u0+$wYVFVsiU0Q9x=t12JLuUg+vVy73nEnF% zt^1B1!gL~_h$V$Lg?1t6AQ4E40VV`HkcR+At_qnV*(effB;&{&Ax#h^L@0C#u}@?Z zAO=Q(U7!c>1!Mt7VlfF25#Ufo`7WBHhf&8wo(}0lvJAyTofj1Y)HE>-g+eW`h> z52-6ek0>6f0yY{9L9%<`66gnc0J3Ds3=wUl;lLtUEJG|ZY69@bKp}_$`~hwN3c&;f zh2RO$46q0wf^xtXUu+9oQ_y+hpeE1McB!2^lL=XSDG2Qu>#`N|NjOpi!NSZQt z_dN9t{&Gtte0`66 z)0wi4dYPZ*D=qA)ZluNQ?ul7?daJ+kYu;5MrdfLDd;vYJRfQK7J0*UxX zl?nU+YfRVx;tYx)3QS6BKsWe-K##BlaL2Az1L{dB47`D^IFt}#3-%yLB-JMZMq;HQ zhJYapKtdEiA6c751Q1li!VpUSHvq`~k^d@Zdf+de=|f6xO~11Y?PX>3W9@Gj&Aj^b z^LG}_wD@+>%mKP>sA=H6pnNe!JDcYEZgLYZ@7$oHF-gW4cMLwB@^TtCLPJA4be3fK zHswVpTylF`opn^~lJcUT4kh*yN>l80bHywYHxHZC|LSC#5sFd7FPL&)anc%xC=0Xf zLc9aTd`7$FXwOki*`0&?{Vt^a(K&_MOGOBFOj06o*_6WDwc|95)R{78+A8-IS%!Ax zPr?SVo0MU4i>4B$qC$A)5L z17&9b2a$#XFM=5{iG&FP2M0{E9vF!mjr_-MRQ8u@_;9IQ4!?uJkH8@F?Fu!!&#i60S@z`EvM1eW zh1%FIbjOi_!h9>5UalA794EXd>)9YXd}NbC@wKge{Y)jVL<~q!l_*xNYc*fA!%j_&>y#EZwcGEL?~_&QP{W16Q+!<{C(cvq zp50FQDE3{%4traWAaJNi)y`EuD{Q{=OVEclFIfz(wWb)S&+nVf*HDycM$KrgHcO5{ zd6{PG3acoqx~}5Zj3BobTlXlsicSMmjc7|iPksPN4n4N(gw76P8(2U@VLAao0Js1m zlsgfwr2P*JBIE!)1Ub4JfkQwkP-K7?3`0f%fNoF(Pz?PA>S4kGD=+}8CIK=lTmMx*@V?3>pEn9sH zGx|w`J0cE-T^a4}{;PduE;7|SA}{9HT8YG3&1?gbUES)B@tlp|1hn+bVT>iYTpP}E z-(9_Py!PeeEjZp1X4yMh$N^beNln~ zf=fUFUJp1RssfC%2teY+f&h>O4gfC#1;7_@1R7Wn0~Q3wAO-*z5Cot>1HcM7hXBO` zTmVWyoCOUMM+hL`{$GWdzxaFVt|N>N-0(N9Bdq&-2louLwRJh)Ke#6_#lbz!4-W3p zjSlW{{?@_0?ptJH2{$opmdvxRN;7by{7FyJ$r-f3!Z}A6d}f{ENP547DqBDC$spQA&j4^ z7`OTC9yYAA@;XB9B8}e^=SEwMJ!zIlsx<98=iPoHUxK)y@1cGwl@LQ<=0sxw0&Gys zL+yfq2ZeczuK_;*578IIE4uk8;9(#PjtIkWst3;iE#QiU6QBhw6&^1Du7D^&s}ZOG zPMAr6lb{Hq2Gt|@f!+Z;Byj`w0A0X_NCv?PKtd40!b24sz$!4Q3J-z`;GYZz{LkRw zFQCHy);|`Y;eRPWTl&it=sV|mj(Ty-n>ID$o@7ilFurq^IaYe%qH1gJC`V{*seY2n z=xZ9Oou$v;CD)qYk#_wX&Po31W)sJX*Y8p^c?EOh|iMWC*aH?9AiWA&y1@qUT z$DJKS`Qg?`9jbD?I zkm2~dvVyXs?OXBXtnrGI39`G_PJZd45TN#RoF^*;=wtuN?aK2!Z*#UYiXCZxXsUGF zG=VGmiRcE#4xj?GfGZ#hVG2Y+5C9(d80_!Uz&P05Bka zBveRapmoTpP;Epe2Ax5H9l%39A2>lp9WnwnLm3fcOsG_1$`#naASA?%zz?7W-hebR z+XQIAXhMHjbiqCn*&)z^>_B7yCsLPWqxs+G2b?021$tU&E-Gpf__vH*>_0eh-9%ko zpDvP}R=K-*!2~XBk~KW_s3_ejKM4$Dp{vCmK!$Jam>+kYwLHsjBlUua#LYE zRyqa+1T7pMYs$qEQch{H8m{~#=bKVicpqhpHeDW z#-8O+gzRxFox?eOAGvD8Sw5f7`}6tTzTeO9?XTi?L$`S@_t)dO!FOP*c+apN2VXM8T!y{N{<*yMw^yx^NZ>nAB3QOUl^od-PbOqFyqe(JY=T6;9a1Cw zlueCr=Wntjd=|b2m(ltNOjI82C9+%^@GrhSqWl(0rGJ0JaO^_AMS*`6`bTB@?;=kX zpZU_M)e!m%d`=f#z4he~C`?p#ovNs5euaI{b*_bTOM9WKsC4yL;`!G1EeQsLY$kmr zQ@&hgyBT$lS;27=YiQ+{x5t2WKBkURm5+ctuIp$T3d{C>e?_~7=(mv{tJI80bUglA|0XQDGhvIuL@yvle7u@RSPyXP z*mQ-xPp5?iG-qXkf1`=!%*`5SajbDS^x{eH-S4tp$T3m(cBM7mFX+FlL;OH?Kjz^T z7o?3F*Y7nNWW$bBx8E=)b@y9?gjK*85Zhs0c*bi#eXVgeHz61*5(KgXYs0L?vKH0c zoM79{dFvlcn$@jP9fs(JR|VQ1kphr9 zUtTv;B=(!^5b69^7i)b}TBo+z0#Ev?rO-W{+Lm#s`3>WeQsVFtvg|^$>t+e%+c>xG zRaV_^yl%$aNxl2@%USka&m&*{`bT}^S$1!Rvgs5-*bQd5JY7roORrSLiyFHg0((>T z?qRj+bnMhOkClBYZ8~T(d3vi?xOMZy0AO)7x%pVwBh3`ZAB*;P(bY zeShWp#0gDho{$TLjf_%$_I%?={(R zBDQUSg>}|uU_7ui)^cEDFqMBW57x9;BY}azKG{kJq84i~h+WNX2H{j|Hn2c85+c9? zQ2;OyYT2l$jcn`}+lt}`f+A7dtJ*WhES5z3E;^;xf9Y#;S!TRqArcYMm&gj$uu|J>WIX7F)cWv;- ze!I12NQM*#Fx0TPu}z^Sdd>7v1noWKVCak@Ew<$qwxhTd*SLCo=cdV=p1~DkTd!;? zC|`D)#2e5k71%mjy=s&SM*SF>a)@o{n6~%upg$Tr9d-CO)-^VCl$fy*%b+1*Rl@q} z8m*62vtfPcG(jzUs z`vFjkt=d3ahCPDU*n%mf1{fLy0lacBgbEEAjZ0|rg(!wsPI-A53>+^fJakyy7}^Zs!QE&v zd9V0-Q=()0Y=bLq@i_c@WL0f5>&vOkj&kd%tcf10X3zxdE>%`~_fBZu-ly;*?^E&<1te@zXf=J^zbUG-pVm9}R4%QOc zmDOk4j7v%(THDO-r914)MX8%neuLdgRWH;GU;4ZDG2Yf8Y;2;hm86=lf~k&fdW=80 z5+OJ)i>{({MC)6IM8`;6o;F>Sx)S9PoG`fxOhz?nZj6M zo!UNe7%p-m0w8iO3Lb28>7N_M*)k!@B&?*xHnX87%GOHRPBwJhAt1vIVDxBUM?juA zYc6VyFj>6xVWtSeuvd(ueAC^^ny=P*;5n=*!+%)M`LjX)ulSw+wgi?u92(d^#QYhl zzG>3G^1A69F1NkQY3}a6>aU;bH*bX%a-CdD$|&;oS5Ngfqkk?reZTsb=3Xb+N45)E z8)DR+NYuBr@e?QuzThP!usQk>j8A|(T1ba6wPD_btzEMwBE^mK>ar{I2p_Ixzgf-i zC60{!!*5u6f}Cfb>hon9)4KnZ)4~q@#A1(?4X3Br8cgVc4=H?&d%Sn=W7^h*Yqj>r zB;gSvj8Y9| zdbJ*d{v5b0oERRAx_oo5Wd#5>0ii1#Zp3z^vcAhEBe*Z?yKqFfFR~Kr!3Yej6T?m6 z!H5U{D?E(-Pip<_U(Rk}@Uwr&Zu8)0f0^B4E%|&~?imh6l46syr1~4F`Q8)@Ymwj# zxAd&O;f2cPdc&{3O*|ufSW>nz_jX`T^Jdwrzy03BNiC;%rhK0-dIQdqc3SvI=@CL~ zWzMv53~GXHyy6xbwx)|F@Izf6e7OXF@QLLXQ@QT^M+Y0P^J24F`^*}OJO9a-{)BeK zxE7rCrt7@Qhn641>{{rIH#V@5sJi)7H%>jjy&mj8 zOeizHqHPgsIc5B=$RkQCv^-#8ZQRd8;$!y6v_ zzssdq$KusjN|tQ<*Xo`ZrOT}neU9C$&5s+n@Aj*@;|nf+dESnj;uz)hR|4PIg%0L? zz7d&8sql9DY7}$GR(qkIfSXC~I`;KrX21zfCa*B->YXpo+sFCWD{d9ly!@h@|=G4pylYWl zLC+^!XJorTQ2=4xNt>$R5^ySb7yJRPh2+9|7yJR^A4Kn^yw}xU%>B8$jvvc9X4r8 zG-qOFzggN2ZO}#hF-R{~=pLf$O9#yhajdhc& zwk&QO-uP+hhB1x$_c&Bc8ZLc)rm{SEhyAz713823`~+Wtix8cm&>$aZ+dk2)!ZvHc zW$+SbC;W~dKZbr3_z3G7@GSTO#3XnV6ef7epQrk?#@~Fr55$EhKZGc};*na=agFLC z>h+lOW8Dz>37HIT%la3b3;w9}DfpvSEN2}G?gN+9`p*BGUh_XS3UQ|7h~jKYN@+7K z^X6C8oSSDA=aL_PO;;ZqthwT{*+?g%IbAi3B0H1xMZFM8Y8qewx0 z879fdTIwv(?Dy8^8yQf&VRP1M5{`?rIu^Z@sli&Vp{49br_aK%|6~r&v{TGClSsS# zR!<+ttaAU7OP=1DJd@FF$&G(sVHc(*3=CzR>f9?^U;HwO6msBlDB7*2F4m_gbFq{RD^;5C zb$y!-?d~2kdKszo&@y)t_o{Ms)KvNr{F|jJ}gmV z+n_OVhvEpjYtR6IF{Ap*ex zK>&dQxf!tnuBVL#@Hhkn1PyI8fcI$w0y_&%Hw{XA?r2EhTIsO`6g z?(%=dE4BaV|I}y%o%U&OyIjYMmZWno7r1TIX2<>sCoP^JU+-P?{Y6}t z$9U3#X}=C>y0}#D`g{EEJmqK^9uwDtx>yU0uT!PL{0*G!joCxWf2(J3vL6S1dzf>;D-nSa7Fk$ zA_B0K&D^XvA~c}GgPrywy`V1t6zGuc#)0HMv+aCk%t1O+%M9{C6v@Ktu% z72H)DIJCK3>ofoTFFtoBIioY_U!96bP8kBJaPh*wO{QxX`7V}bekEM64Ii6!`DX_d zeBGIJ?K-w^7oWM&Ot`=fsg#?y$!E=*Qh()gEn2l#>cjA~3*W z9qjNDi-bl+K5~x3rfcunH5X%I<^(=$9P8ctc+`o;^@ulktTfUe*5S4aj^_K7qruAn zps;f|4w{7EP%v!Po?*sFOK>aJR)LaiO%=HTby|1<)IT=!!CBx4NJTLFKj$HMr4~uy zO0aVvDQnwo`avRO*%aCdD!oX1Y_XTE@iwpSvZYGR;~=?}hs{M~sHp*AoSTUJ_17(%YozRf{*Z)Rt+Irxyt!!o_Y zPm>%!VKhx_ONckK-{183`%IrV1}Bg)ug$-EecD-W>hx4QM$~r9opPPUI{cU#Uc+7` zJD;)6VPDeQ$ZAH|CrV6vzdcQGyxmF-1|Mx~<--`!uHzhgjkAPND2x|yI=yS!L$PJ^ zFG&W+>4}QPDm#+25=msA4+=Ky6Fqf3LBY}SbXBx0*s7+udhMCZr%pB%jt}cgybU^- zs@8npqEqG1Gq~CXP2U{~7B?+uavs~;YJbP3IrzM~e$5_#=7lvPc0m)(zqxM73&G^- zWzsfT)!gOojn6{M2FF|p$Ml0^HmqD{J1N+OO|Wxt9 zKb#RSD>y0q5zd7I7g~0(8qcLnAoATe02+Q@n6$*4dH5Af_Tdz@6cn&?)hxL~?{D;?)P= zM0pzxL+CJLn-S3ugjfM2#o|dMI3zN7Jtn6RY7lcUaRP6}vlFobox6BXPMSOofd$Zv z7=?NP8r0C0i~b?JV3Ana@m$0oD5>yn2tSAt@L~iLI5iSF(mEm=L|KSZY)nAW9Si`i z2+vyNS)_h88kCopfynWYMp(nc7*%$*7ayH0P?!*uP=Q2r!Vtf9stdFGDBGhI1zlDM zFKB60B&J}9A3+Ax4qQR_0>FSA@L*0#UW9>us8j4TKc3BKRKZ9JLKzSR;DJZNKgW&# z-~Z|7MaP!X=t?F*U`T~De->+7H?<{*rUtw1ExaB9Bxd$oK9MKvh8NWr+3mNAMRn%v35ZR^IKJpkHFPk?l+Ai zu3Tu~9Bd~f^#-WaMty2Eqlkcm=?PXHObJ3yPn14}SP(k6DzU}h!?NU7Nu{zly{xXS ze68GaXy>Q6-zMl)YgAqn6ov(Ym z^Zlj0GAlV|qSjj@Aa#gg^CI4g2Gr9eB#HEg@gdTCu zGtlFaDK}d7Ahu=AhK*<2zZaER`{ajgzk&m8ukXfvsDJU{9;4H~u5!*?$r($t3PP>F zch&w?P?FFU5?T zI829ISLkA+R(sayQl91O^@BYUbi{Uq;1k8Mt~szi*T6nRPkm|aY=+8~6MM!=U&eLb z`6$$zYcGhO_Ws7H`qtCt>I>C+;{+#y^CN`wbHY(m4O)5c>;ZVQduibP1?p@x9+VufM{jJNIxd)$f)eu%{K`>q(`F zYr}M&l9Z**)?}v`ZpRfZb`WU`>w{8NLpN;*y0EG=G4X??9XU)q;rjKVLhBd_LCfMd zn?Lo7=(l41umcp;-9y|%HFoN|Ao-%ZN5pgazhpQM$m%!z?B&%%L|lP8V^PQi-N>=y z1*_t%?df!ywj=p53@MpA;9ZuE{>vxJ2FYE6w~jfm(P*QIUZsRXiAW;S(wa0@GM$J@ zDx^-W<5(M*6rv{D^zd7;pEq<}5=n?urNO&nuVoL|v0^>JH4kWt{ zn#f-L^`FYxj%T{2y(1!fM2s>)h6B|B`@n5rH9#Ba4af*w0|tS9SndHh0@{Fje+O+KJWwNei{&;@5fmIOU>xZ*Ei^&}yX(*C}i#JSPrB-p=d0v68%Z zMcBj9oAy2X-t3-Uv7yTE_csK#sxe%1cHJ))boZnJS{k|g&{Mg}!UU7S5k3S-1QBxM zzT?FNp)k9|H=L3mMw5nVGD|y8QMFx)z3zDXR99m~tMK3S4;F9?Q|ww16t_}t7;ib< zk8tRj!v$cua04TS3SR@d=k(&1=I@-v;e34|?c$OBrpUN66+JGMA2+w!q)(8Y%z^G* zSu&G4Z+Sn(zfjrNW>AI9cg3K9U)3wAmg}mG^qQTgpOO_%#)Xr{feMc*!l2V~j#an( zTsu?a6qUcgTrE)&{O9!=oSLp62pwDTb-9C7&_HfSb?NK_*LOK=-p8+OO>|z%^rI4u zgbep5WjZ7H{gN8^wl>Ts@HBdt#{VSDB||)k9+7&vdDIMYi2)xT_Q<#dsFJT zCThkE=TdsD&O!YgpvajZbql{z9m;Iq-5i>{#E)liDb&M*=yW@+BhlT0F#3sb>tDeY zdd*7E8>{QLWq$udlQgDWuVq_~Ixexyt1ytYWW*bS>|b2CM1}cpAXj>;MdA0R)XwzR zn{|L*E2@_#R(wCE-61`v&(|r~3z$C)=W#1(%a-kSzA5GYU}`_ppzZP6cr&}>QwZ^o zI+{S;q1;-++2QQ@Bac;jonrm`dsojQWE=yvr5-Jz47kFV8tGG0!nhY|NJH-&&bj)v?k7GF z?TPNy>F-1Ay7UrJaZW1-SqR+aIc4eOlTll|eY|{(hlz5YonD$sl?w29$_3Fsp$BHMTN8}7LGMCXI1v8|ZWTc3q6+N$pMU9Lb z*rT|c*u{|$@t^qe3)^T6h$UO7Uw3wFI8XoE+nu!jt`bT{nu$o>@H$iL?(T^$SJkAo zv5%Q~G=U=NiibVN5*k@RZr@eAh86E}7;L%6ez3%Vkf;Sj4!^gt%1lq1K(ANgz&OES zY)W|sId)#MtbVpqHEBZ%2|rWffV_0XP}TLEhi6E!Akl8Wc-!zieZpPsOC1L%XGi++ ztuGDV9ZSRqRT94WZ8?Q`H%?wSw0F)6xeVv&Z(X?cJ}>|L)G_K#$ybdg5?m?c9IPqP z7mnwOq9^(H?klc#y|JQ8oK)B)hm2pXI5KP;(Ys)~jgH$Y!`tlyS6mBpo-GjaPE7e> zhTU?xe$V?MhI6?;p5J}@w_6`h)}7zC;6wTHLyqHn-3_-QjxRFWA*wc*o#L&#^2|Lg zv<3C3zcrD#XB2IAQWo~SO@Uqy6*sXF+MFkD`-vA_WqPcx*nLTE+N7Xy8QJ;8oiF4r znRD)e?Z^C*uKe1i$wAfj*1wiYdrzd2Yg71KJ06l;b z;11Ka06l;kXpR-=fO~*DupW>KeH9=<&>RR03L97tpa=Q`4}zzFV=V4LmjnHQ^1zZT z+-bEqFdd)|90$mP=EjP0Y=H@E2z~_3Y55NL2C@S-vO*m24H(Fx9I%l^IhNqSeGuZb zDjcv>tHJ>x0bD>c7U+O-5tFBZC0UyLJCtMfHy|WX4p;;>1ld80!$B_GmI1l~7@K3= ze+YD}F2^30(PAAC53~rZgE|MSV__5WAVfAOgw6TxAC$U(fIE;KAQXrPz5|MaB0+fo zQW(d-)h{3(PhjH}-GF$c^H=RE|FSM;W*nL-4!_*IT}3Uht&g%b#!<0itn1XS z9gAt&h{WvP)vk25Iw)RbI9Ns3g!6lKF&Y|t&TBiJY;~0TrCF?T%yFoVTTV{+y5(lS zMH|@__*z6;@$>Jv8wo|N$MxSh`u2Vzd8#tlrbg2>`kHoA;Ag~}-!1Y+=eZs0-NNS0 zWe5XYpN<~V)Blav(mu2H$uz&cY+NLd1j~1pOtCy}mtfu5xsn!8V#!$ppPq6dxo-rG zCb!C*QH1x(+yu+EQ2cfEKSe{A^GjDkLd$Q^V3n7da;``OG49{<4Sv9QR2*mjONYeeT~iqj;ib=w4irIiYwMb#CA z?VCL@;YrrFqWf9}9t`6X0rpwrIYAVWp|lW1)TF1h*;TVOtpV|Fw4`a?cM=tkXC+Xn z?cEtN!OWCm6x`M}ssf!ZZzC83o1k9wWM8VuP&hbf^8S7J@`s~j8?P=Qd_m=8a zy6dLLyXe)%Y~;?JwTu?N8=Ov&;W$|yFp!e@>9)@qoMdcWi|l=1WFv>`7v zJ$T>V!l#Mcj`gsX*z&=N`PXKm2<_?I7%%`BYce$@O3fSNC-^|Fp-&&;vgFJI}@Q z331z*gt?nqBW@d2ri^_qFWNYS^73ZHuNLmstnSuU{39VBZ@+K|ac5&klZjot8NL3T zO7Bx|=I3%_35|$pJt@0h-gR|wpA%Fmdw}dS;{Eg^O`?C&oA5}Hs9l0ay)G&L;k1&{ zb8}CZ@9I|6?w6Jwyo_khX0GPf$LUK4&UzA9e?ocrap&K=TI`j{3eEL-7c_KUU~s9Z zW0Cr{!!l(UmkbT+6h-CfMaRAA=_=N_`-9^0HiEAi*p?jWHkxpH$anuRVP8V~?nJCi z^6p0PtGgdxEq=VOz7g@>Ry?4h$vAH{SyEtOOS$uO6B%NdteDd#gtK*kWK#c*@m6~! zWEZ>}hOL$G<`y5g)y;3R=arxDd4@3_Vq%z{k!?=g!S&FyxYqe;oSI5bx12P=Wrw9N z>Zvean~BrRVrJ5U;!Q(eyuvU@iwT)eobinvNi>pgb66gn^h&f-sCFu)5Cp5MhVH8 z(V=8*p`PV(0hPu$47W~+4Ui~X4N)vR`s=9o)jO3`UDfEGtZT-tKT>qEqy zE8LhxJAG;vo?CtN?RNLYSwWM2Yc;`hg{Vz*yvaEgBjfo91uYISuVV zz%#HMXbtEEHp56F@CE-e>Y$w1=uI1@|IJ^u0c54;+w3~d@;qh?fw55 zP3~xDe(ist$({22uIBCEXmTs`#SAGfB)JC@oo9x7`x@AAJtHi4K1fxz-We35W{Z|3ScNAsp~ z#A0280LSS<9OzOqoIYtXAA%5HKW*uySmr}II@gk87tkJ>q?QYuH7Tt(dubNf@tJ$H zsJoyQ@#>O{)2esAky=NW>rM0ZH|Jg&$(d}FU=S$wO!n`g>lfnFhmz>(?X)pcq!F5k zv80{uT!nr=(JX0#Zgu#UB%4@)eR$iD{b!8YE0~PsL9Ueosu#sN-Z>-sEkjrBBcHI9HIuNyB)aD@2f(p zjeoQ_TsZ#dL&C|OsVd{f6>#FL-Q;3XmXfg~=Ft+F!DNYuIqP;zM4WT9RBWS1P%Y?E zUV+kQ4OJHSz4QvXn@a`+2ftm~k>g%)ncOHBI?|N*mvaMDEocj_Y`sJFN8OSGbUVG^ zzE*=6FBvh=X%kh_tdOeMGNG&Y>_r*$CPGITb9ac8R0Fv%X2A;^-IW67n(lp_NJ8YC(hydpSEpJ zzdBWqt^Tu*QT=?fB3m#5uJdvSYJ=qfOa9aq1CKmh%OMn;pa;Fae}3S`n7WU(jfK=c zpCs1GZDWaw4S~dWUL#rrU1F$-;SwIBJ}2Sym%bNh`}`TLKh_{az>o0rsg=dstQyKq{b?PY`)ybWp#JK{Zbf$g3soq0BSajagO>M%Y#4qZ!?vRX>9My#B}a{hGylXYK6&^V5-YTCeRjXw=b;o%SrOvJbK=wW(Ien{!_r ztr@T{mIXFNWbXN?`Bz4_ai@;wv?R@ckSzT0+lN!1fi3RT^RsKzf`N^|mha5ZJD=bb z!~)yiXvL)!RR;4|V0&mG{ydEMnbw+y5xYGhiFCJYcN3ss^czg*R4D1EjIt<7jLHt%1$Zat6%PN@}d01|<#r22KNaY1`Y_ zk|`^%K~;l-#|mqpHIz&NIp}a>6*d4HYNXKFpsk^5iUKLn4r-fLVf#j21GZ`9HHcAc zdmD>wEHR>L3bjouwQ0$X?Qqj-Yv3GQImS(6FdN8?Wj2r`Pz~e;g$+eiZPkQWJNYG8+5jRA7K0cKwj%6 zboEaWYbT4pY`SP%SO|G7yPwdrS4`txxi9_epBEN}Trm&r5!S{#X`!Rk{jG**xgpu5 z&6tftRKA8`#FsOTjl*D0y5`dSoO7kRb24Kzl~vD^NVl$`+<2e96~+^;>~&MySv#0< zs%Mwpp7ZqaSMpl>>4%u>oqz0D-&5A($c$unL4=pfX8XAti(74;CYAR3@UfY^=Cz(M zKUf=pcBy67WX2tLKi&1>%8@+dPYj`dghv#$=(=*S4@rzy(}rhxgw#}baD-iw?$nB^ zWYHlfnt0{mM{-0x$KFiyysFVLjOG%wp{S0gb-WC=4j!rdV}XxB5LX`P-?@FpM*5dk z_kCQ0>eTi`dq5dMzAaVg4|2XLSR$%1`aacc%-V3#x{Ly@u8C+w^|HRMS05~m7C6_a z6xz18OJ*M!a~Ef&{|~yI3aJ)uA$E2|03GISW*aT$5R|Fvv|y-`iTANCRfP)DO6v=< zcB)c$DYG(nSv}a0aXI9!k4cJq8P$U#3T(qVg~@#sGH;3;gY{hjL6ovc=$bt^*&z6j zU7A%LH}534alvvmIb4|DVSB)9CQ30S=?TrZt@;T7355WQNET$mC}7jI=I#PAC+c z*k*3vTp#}^x6p)i7oWY!ZD@Nt{KMVXKkMla*!7^Oy=j1(afrs>ckZk14Z+NEmg$#68f0w@?)9d3+<^CAD!-MPI-~Hphr$Z*%GGb8|OiZZl)G(@0%z0 z3A#8jjp(IvNh)mw<~pyyAgH_A@nNCOUyLVG3X|D*eYOr7ci?7 z+-*&?mVd7GC9(1p5ft_ll}TC;9L8jso#8vg$bE*$I`?!{4#(na-5IsXzet9zBf=i> zhL;2qbt+D(EJ3)q%a)es=x+VhKEAfJV##yClm*gw0zxFEiMGEd+PP}=%z7W5G`ts` zQY`9Jwm<*JtpX2$+W3=lr*Z4Sb~i#NUYnRh^c6T7?kctF;VbSs)75d)Q4wgZ-{s}& z-)7t~+NNYCCy9Gj2~A|`9sG0!*M^{Uq!}GA?zHg?8Z7N}$YtP<>jOorrP7Y^J`J>H z>s+lD?m$zGG)kc&DCuG0MfWLUXsDs z4_Km4c!&$B9QWk@;|EB8O&ukh7Rw|CR}vAWyU6|5uk9OYwtJ+1)@NE9`F{Ue|MDq< z9AdDk9qBSkYA9j`nC4BAW^^vIx9}0@$|MnXBiae|B?ITIDhwdoo$#GHKrpKR9XoFR zTqfJf^Va3%LZVajg}qkB)QySnk7#MFs7K|I3zJFa_M))KlVfrc^oA+PXX`&4|4eK1 zMm#s>_qhF?kK^(3vP21?*FBRv??d^$KN@K5{f2orjM=ug23oV(d~N(1w(SkH_G*qg zD3@(}1Fek|vAu3+NFm&^psRKG3tf#ZghERLra?%9#s)wGsj>ZS>~sQn4S)uq1Bijq zKvER>KsF!}7>(^_1MvatSU`i224rJr5m-_KrUBnTYJf6mU;s>3OZ%pu z44rKNG|(A3-XQ6*ZEfse#Gf(k8+8p;P*zt%WfhDDKm$28XEe-1XfaJYqwo!>L81e4 zvWgmTjKxN5Lt`tS|0OO1%6&7Y!1lK_7uA4f(C5I{08H>27?ai2{(TsY{Ylwgw+3B} z_@C3&X8gyx+OmJp)%uSv&zX99ou1y9zRIxF0^#)NHhZCBpH=91&-(L#!V+l+Q+3+Y z$*^aYT_KrpNT06`k}XDy+k`@v1M{3hYIsYqCi?}t1%WO?B@`idw5>h20?vpKP72A7lI;Vx3B|~vqs4NIc zXF;_@VQdhL*#rZ>Rz8%vtA;Of&ymIoc+nh#`RYn+`EVC=Nd2Osx-Mmv; znjdi%#|kf5rt)^U8J*TG5zewt;!9>dFz#mRA+z)FR0gir?`>H%z2<~_nMwar!hdNW zewkWH+*!NLntK1_@fL>f`kB<6f4t`{OVJ-!5q&1!*Gn94B1x-_rzy)EU){l(5)RSw z4l_oWq$cT%6~kh)==C$6W~D}qt-rN(F6AxvcF@(tY~;kwnobJ{(HprgH$qPGv&3ar z>Av}uq}9yl8pk~Z?ZPAzbS2Sh;3pYlx;F3DlbzvSVR9WW!b2u3c{x~4lx^*owf))- zJD)bwR351Y2?U*;Ybj8W`%Y5xY6=8S*|mkDuFq>vC%P6I>ALOh%;=f8WqOcfLzSBa zfnl*Ed5{qoI=ZM4n{JUI9 zX~%VQTp7@MNtiBCR?+3s1Y(T1vS7uVA8TJuZ>PuIPcP5Dln}?^5uLny`aXYuJG!LZ zhdZ-wO#LvTWJFLZVZ5>42u)l08Xvs@jJUmFR|iEh-=C{iw+S&3*HtDOjwkN(N6(X8 z_Ilh;VUj;Xc)FZY?3LhBCJS(x4Oma6|H_Z*xD_jB70=FV|TeCHIItxC)ttk9eHAC z0>2Z%KR!9ZW+0uMW>hdczyBy+hl*oEReSV*va~(>LmM6?t(+JYLi|Ei_9W{J8FFJQ z!p|f587Y~UH7bl#-zwsyz18a!Y0y^VHKl$>+!oncmls?Ws2IbHB@%vSt6Ron7kbpu zV#>waY@e6<+_J%vVeWEo;~0O#L~jmfFo$&3EKB#8)XP+wqSJPHKzv>H9AW7Yk}zt& zGQ2Hir$?iwD}KX|d#Ld2``)2yeyg*~sNP()^@h^2fw6B^s6^YH1J^BkRmted2;SaHwUI>S zb~@g@UTo!DX+lbQw!@+iM64#JI*F-soBN(k>i#xeyg1X($yN1gWjfd2nKG5+s5&{5 zBrlpKYrOhz867El-gjxBx9gDQlw=Y2t;U?k#5)lT(Sjf>c4U&=2yaPWS}h0=lWh$$ zC|-!tYUQEqo-QgPNy8;hc3ZZ73bC{61`*eo5qL-0`6b#s(yLYxZqMzEC-=X2top!Z zgOrsLV`sHhO25FjlJBwzX`y-2$l%o9-tA-bv%_@yhaAKjlTBe1)v1kA6r@^nC3M+1 zyN}C4^cPDKD%AXbVav<^h@wifw?#>!FLhVst-q@9Yw0ygN%*OQx$B}L$(;Dd^8}7& zovye=>XqNV``i1&7|)6Jf3xXEX!692V(C!cSe@=6G{@7rQCItL^m4ns;Y<1tAe`kU zXWzLI*kjPLCv~hzS6edZ*wpF!;vVo z^D~d-fXAG_;xSBeV`h{cJOGce7>2PH zFvgZWL1KV9Kp+cjTB!^urDZTyDuc8JJOhtms6abW0DjY|V$iezU942bau>8QOn-vh zfP9e00C=D;z!GYk7!pOn6K!aKIxrYJ;>psNwnPb?4B{CsH$y4|n*qZxD*6qB0p75W z0lQvA-lSpc-4-{AOU3RmfOTjhz!^84L|*U_5l6fxa+i z3QmK51~3DUu`mV_gY1Xm=f4|?eamAFbD-g{zivEZn5Uy$ z@U?PQvu+M&?ef#cgO#2{l##niq36g|iVZ`na}tF-MoH_Dvnq7NoX&M&3aUXg;~u(E zHIMt9lBO2UDji99)F_knr*kzvl$VGuSTrvB;A%SLj^wn_)N|oRiv%8>#ZLCj46cDA z6?Q+7C-B>55cr%(qSKGBRZCtA9qkpye099zXd8K9iyrUm#!=q7!4DQs7i2!(9H-^6 zjo$RKIby{OPK&OJTnXXrrSdju8K$Npc^X-~iGzwz^F3x|`q<49VBB-n7+reDhS}@K zt|PMRL+;X(LUT$fPpijF%U~N7NsJA3FC>P9MtcYPq6tmkc5Ri8e*X(+NA4GUF@YxS zEo-?u0CO(H2ro&zPIqTJrS6%#cJi2=L#AXAU6PXq)nN{nCLy*FLd6ZuDuztbIeuaxKO7}KXMWKw&rH`{MVfcpJxLaAoMjg;=#`S3VsGQ_ z!I+uy=*<;W%D|&B;)4a9?S66$rmH=7xf71&m{G=7Il$RLE*%`txF%zI^A)h04w-ajK2G6oi4`-1F?zEvoSYX3i>H$Z>_Xy z^RO(qf5KIji5Hi)e&XdX z&wQP-_FP7ru4Uk{%Pa0)BCYI)5nEbL)M*_er?(OZ|LE0$kkm1v_e{s&UB*Oq-1mO* z*n2A|)QeczVsHL?%5qkzj!aU@nOJLd@)QiV2c(aAj&!lzwY2r5r zkmsWYv8RvVaj(67S8g>guCbW2Zmoe_rAJuOdR$N5 z4t<)`RmSg6VMtL=)go#cL)x1Q?DSpudhWEHJH|o>R%f)bRQFrKBYN9XVn4!2!V?na zIpL%%|Fpx{*|`tM%57$y=@d~dZ^N*HvE3hL(W&&%4M}QM^y1y2kNe#?ddtj>JCb%; zt6~=FXYfq&AErOz5Nh4kj{4kTyp7|Q7wrh6)PBRFB{>>bzhO(q&hj%0mMMvzs$ian zn|J#F>P(k1$=HzRqlcH@x_%9k31%$Es^!F`yhPs)4frJAgRg4<-j#vIDTN)CNRiu?}~$2J!+oVPOZL=|AKz+}H%cfvvQ|o}e(`*uN)dee+XmWw3@-;a{(>Y?=oc zS4>EJd1R#!cav2N;xuVvAt}5_jnz9FXwu%+D}iImslXwv>&g0P0w&<{zuJEzpVYTr-N%=H%v$0 zJ(|&}J7k_J7i$*?Sx)p)Q>_`A;60qsw7$}LM<({;{oGZpW298JTGZ)!MAQ1p%WdSm z_v>=JQ--ysFQsu>+?x}4 zo0D9hW@fCO@-!<`p89lGcHYycySwV%kvz*jP&nn;p8Q9(^w0VK&HyAt~~QE$qecgES2xgLK0rrfuT`usqe0}8npP`_0Tyl-kl`bjcK-Qz)wWL-}O1* zHDFERYAsUexVILtEFKoQI5ylbW5&ZF9LeM?gl@ zMIc3LK$yZ484(r18TsP#P}z7yMTqN&^N9BBQy!Os5LfXSMNmZ|z}plt7H@RqAiUR+ z2oQl0{}BlhLJ^7)=aE_P5Jx;mw8WGY;v|A6f;KV~VjAAri1vtqsJa z;v7?eL7c=3` z-7`(lh2>FAyYIgYfN>D;E9^6xPD3;g_<>{k=^lRg=-jt6{?D2=EWThbjrDlwpxD%w z-{;p2k~C(Tzgo=HG~-{XU5Hwx zFde4dS3H|t7rt5KxH@EO3LEhAYVI$3vCi2c?MuLqD~qsSN;mE+u3qN!YmB`%;I~fd zx7_RDs*s6U4_AlI?$**iEJ?USG^QcoN9@RYw0>@4mbWl`dD$bsX&1`A+tj~m@}yz0 z0oQhp{OKhEe)SRIk$Xa?XCChztUar#evJiZa>exI`;OS!`CP3wLe_7VBU*E52hgCKiR+N<&pa*t*7PX zoVB9&6sO*PdGgKd+tZF*c++Fw5sr?iL%|>BK`-+}j~BVC^?Qh>7u65RepSG48#TSq zFwiZ!B;Rr_kMqnlhEf_-HiAzu5dY!h_f*$9T7P8p{K4l6$A9>ZV@im23x0LN#`zbbt`k%Jmo005lv&yi39_44RJH4I14eB0i zSGi9J)7{klw#mBu6)x?IQ-h0y=G*rBADZQX#Z2Rd?>gw~(KG-SW9GTPVa9)(&0}fF z%KY3VG3U0~ekcv}x|_R{5oJhp`j!U$o~uj=%CNU6lRC8Azf75y;po)2tl!8t%eC+9 z#=1w}vqRRuS-I(Ik%bjS^71dQqNY#auAkZFyDomDmu0Ex0*!Q3muj&u$_QPSnSB3$ zcslccsNVSRU$dHFaAvG!8@p`Tv&9U9u{MN6G=x-$l4R?QePkI?M9NN)kou@pLn=u{ zNm4PEqNq^WQgi!0?)!WH1?QLZIM;RFujl*q)I}HHnO1eySQL=jx?AyDVl6UdsXr~4 zQYr`o;6hA+!m2di&}vPML$c6DX#^?qJB%*(j6RwtOlqJ=8F1>38B9Y6GC~tW>n|_s(gcE~d&$_K zOt7y@(KYF-ZSLX01YrsA*OTt4e|1p&g}9=zT;Cp{?u@;1H3*&BKA!`9-X_;>k^?1h zZWyHukcDtPy7`wL$Us%uBe3`egj4{4G1C-Cbp$Dv$Vq3lE26bFhihXcd)&}GGvu}& zybW=w(A@nf3m*`6{>CMY4(MhQKFgwnP!nAulMEQoH&VHt@J-8GYkj2GZMnVt zueQFIzH7>cA`x&RgwaG?O3ozVMi^Rx2H+gQV3gBp9VOV=@BP`rt3vD}fudz2k4(JV zVF~R(%o1KnoV$4`76S2Fdvj8x6hrKAzCs4RzmWi`uF*qri-t$OGjBha=sjL-;a@U+ z^BSc4Iu)Zdc3W^7(a4=k5>9z(#^g%g#ZZWrAcg9~!~u3hSV`sr)(oO!kptz5bbw$}5aN+{CsJZo zA1Ypo&OI8ARTI74i$wIO<2!!qf=tO`;?K^eV|fh!TpNmDn{?K>)~1kM zuF_!AOaF{NVM@7hq(=h_3+U+y?&m3jQSlqO(H{x~icg4Dh+LyAJ3}hAzGOoli(-mM zbHbrt9IN|D`F?R`r$xsz;)|PU(GeU$0d6ngQgnssaOuts|>Uh)D(orrp?*uS02iemLa2uapXH&bE^?VxC#J$lTm{Xnz8E)a~SL zfhG3g?JxwQPy%3c$8O&aKrZ=>O4R1$geu}H$hc0w6SFj1ztJI+-rI-)b^s2ID8X{? zVa^`Si!%ore1}s)Sevh@;j$8HP_Ha~K!7E_!NUu{I7zEQ+qv}__p2SQpVsGCQCzVe z?A2DqD1>3~8^W>PG?5MFTcT_`=_~+t$a@ZB%#Fho%l6uGb>S@JzbDo$=bNd3=yd|M{#;RLd5m8J_I*pUz{ zeX7JbPFN9P%;buoiMHc>dCf}Ep09v=XZW@VxV`IRvk#6E?FWB(n3*&m@;0kpN`y5g zR`UrNz4If2n<8kmg5KqG;?wrar^+wyRJ9Vg^Xo!ze3i^?Q3;&wE9JxC08$p+`y0WR z)?lINXdX&g<0<-UKS}|Rg%BFHf}by^=tTWl!)!z2+mEg!iPAQv4<;+L#LY>D#5;tb zhzO+?9D;k0pcpqMkgN+%FFBlEetSAf0OTxyofRm(7K|cAs1pJade9CI@`mJbbRbTG zEJ&jWU@Bq4EPTNuX5DWttRbtQjwdZts#_6>a-iLmlo_d>#+8j+m z*c>v#xt668mZH&cTvJ1Aa7R)AUBx6U&;$Y^A!^Vnt{@7fJK*_90x?sZ3|f+(eoDT$ z+32C?;NO9kIDv0-fWkGP$knt&pMA(c!SiIOT}uACH)5Z6_%c5;xu&lNR$|O&{o07F|XOwFpVK0HIHA_sD1@7xDB~ zlGh2=Lk8ks48pF0rMQrBeIyyFh&v1X5SfujelhjQUK$X%p$C<>grWoUX5*6Ad-Law z2?qe+g0!Nj0NnvEAp{HP<^7w^TbRWz^+qGNK_LV9z!tnA8F3MSt2}|o38WNd*RzqF zBsB<0Mu?o_AX_;Z8K;NBa!2A)qf1he{E7S=P96$}(&C`EaN$vv0wlG-VFYpvgDUla zHG^YzD$fGX*?h+(IH1u8QZzfOdg`pvV$R^|xgASPJ@DE3e#XvC%$FM<3a}zDqMRobn{jqn z6{>7O8vl2peC>k%JLrJp`A(2|tT*qeMDcMv=Ky81{0|**0bO&uIBBhTOY0c{1j3Dh zK#-YFzm$03!4W?1^fmRe_Csa+-W^{RI6r?uIbfT{k3%Pkydq(D90%mD%s`z3NTG!S zLZHCUFOUuAfVFoa>%U9*z{{&a-MrHWls_0`NtyAKi~6LL6++g!B9V%2U|wc4HPtyR?rC#zZL8Xd)& zBw7uo5+pBxqk6k`WN!x6HI`dzp|fbt1rtwmr#*MX_ilCa+bZFIRdT;(ZIF3guy0*x zd|g;+-QhcR;iGkt>vd6E>yMe&$N1LA#@EM{*2mwePaLgJUayC@Hl&z0r1>^v#5ZJ> zHe?skj_|u1(x*4cn=7d*S9VaZ$EGE&{qwpS8J-SG;Ect zyQAI6cYai*xW}j(%swNztoF%v4vc+XVh0c8`eX49ju#=WCPJ$;SL zLSz5xChh7*&%&l>hnu?Ao5&BF-eg~U;AHfCv~g(k+Gwfagn85C*QR^f%}kWeEAwWf z8_ffwdf(QK-}p8^>bv&2^!k&n*T?Q$4P4fAJhY8E$)wc7t3Z_~ef!^p4A!MWYVuYLCCPT`^( zZe?xuf2>TkZs;W3^tEXBdw;`8=;rd&&ERKLir-DgXEy`?wEMqr-y+`bE@L6pe#=|v zmVMdH6Bf53{ceS8QR3!W;km6hx2mQJIi$}KGoRVBg&M1}CC|uoaLT0e&!`lhu|Ic) zSbW6(!kLcT1j#a)+ZA^u_fKn9KXa^g7O!t~ywWJ%Xd!t`=1z;u-8PH6?S6M}CEV>O zyL;#E-Ol%S@Bg{WmFeuZ=SS&67BdAvhOufA$DOgpnp3 zrXcmfvLA8o{e97ByddvBYW}`Z>w~|~pmZim144vjyGZ*W>k43oeK74u+^YRRSb*Tv zatvL7aN^wui4PK6(gXr=WbJOj=q|K5q|(I27IYIA?dupSY*xcJbA5bNQ)L*@QE1h?`SJGqZvi@RP&10O~~{GNSj z{COv%L@3?``Y`Q^W}iBHoGc;yJXHVT zk+3BsD%(Y9?JNH9boG4?ey|Tvo@HqF2`~1_RzB25^vfvr+fn;Jmi7CyPg?-A+a~!} zf&6j{`LG2m4#IKnNO1Y-ZiSYbmDbI&!}IYb=!fjfpG^=Jpgo~Y*c@__ewbz3Ze{ZoiA797ekslN8Jt+Pi2zS zlU@Su;MTvdUtAo-48G(OUf6ydL=L`Ea((eR=hf?d&)>Sd-1Y7Cj=$T;ABR-@Uke2e z#fNxEkr4gKy`&Bl#TcE7+5CqZ z5huPEtNegRd_WDpJ|Z{prwMuyF}#p7EUGg?Du4c7d*CMj<9qjyFWPiocL@)C-1+fg zgvaA+5W^SN9vq812-6Vbef!2G7MU}($B#0OE9nu+0@1RJ<9I4?bHu7ZzH2(jKf=I! zlf+}8Wfuzm{vAi?Lg5tT$B9_ML7u4m1c}N+2J))TLw+qN(Ws%#{xYRzNb1sr5CV%L zL-_;Y08AOUO{J#;8=o=!eI99W3fVlVM}KYgcmjY4g?FPED%SQsBvdhV#~(_Jc&+sp zHuEQ1B$4d%rhn`>VkI(-a-USUf|&A?uDX!l_X)90`HcLuK*49nfKRBdX`KEiLB-Dw z5k2x_pPqH_bn^Oy5Hrta$HN0A2!S(rK6M5ch)b}7a&)T(#E*sKK_()=Ft0c6K6KjZ z0kU%1`#aRiK&UZd$&48P849uhNic&ZemU#Joi0_sB?S*bUltf3iPdPQBohYc^>~Ui??Y_^JqT@IL_r#m5A zeNg(bc;9YO@(0ubg(3J41OW6?z~Lv_eI8Z0AQXtb$wM0hf!zL|j3}f>1@5wHegy@M zqTm!W7mL;w022|+5HjWnh4}n(xcsYYapv$cm8iw;MzV>5cK0$$3Cbae+j!Ncq&IKG+44MOOiWvWcc@g&7fjW@!xo<#usIg)!N~Mo825O*-;209hkhJdCLFC`ZO3 zuSUazd{LKNKD1?9FyzD*++v<)+QRE%TgLWm(?h_|GenhN5l#^)nS~%3y{WaK!9Mgt zr$judSi3Nx30dMRL2(4KJI@;b@v8N_3Vf2w!!)|yYUq)McuPobifoEgc;KY+8Lk)d z*AOlp0>admEI3eg@Srf2rIu%I*hrKhg0ExG|9I*8-;Mjd^jm1NH~(Rlgkdb<_6%R7 z?>r`GxPLG2;OnTQYT3Vjt5K7Waupmd?OQwc`FXi@ro8`p%-1)Y9rl;}|HOX(c<;1; zLO|#2?I<%UZi2?dh?5*Il4k9YMMV8qC6y%txO(=?>tbQ97U;*p!eHdMs1=YesUT2- z282}e&?*C5B})(p37zNAt=8us9##6gTJ4yx3@RvazJ1Qo`|IERTDk<3X-`pd27sF$ zD2?FS%bu8SRjO54+O@OPWN@O`4ErwR{J#N113?+?NEcQns!2K5Nv%Z*;6P0a1!!}4 zXNc{Lsk0yJnwFdZ$MdYCdU}z@Go8B|q!+4X;#n?+gPvknc$_4z^D*pr=6`*QZ*pj zNnGA|X=rk-C)#H3BO0S(g(>`+V*S$PxT_`$!*$cWN7H;OzRi~mB*U*6+Y2bxIF2A5 zS+?vvFmdGfK-kTT%g#kLiNnv?Z69L;A}nHvJtuzDcvtvgUhQ@RiT#5ftfr5~ANSlV zZ+&TSLAa=nS};0szMiZZwlfHzdl)|R`Cpm=hHZBgFkYu zz*k5_%ccc}+0q;5?ZGULNvJ82EDZyeiTXW?DiktNyaIs8dQ5iw;VX^j>8jBOpC7fp znL)c7$iiWlv?QOoa+Z!uDX{HYpPH0)UKh9bbhnq2(0Jvj^=WX{)dItN&2Z59y&2A7 zK3*+yK$g!8Dx`aQIO%xF9oj{eIOoZ7vGej`9lrj3dGS)FRs5Iw`up*7*PmEzZt%_A zPx$fR$=E55Je~~Xw4ae-vuQ4mL(YNdL@AY5h+MV_4?fE7-7#)LFv3y>JUI7%-~5pT z=$FMAl__%Q3CL*eG6hX1*5MSBe~QunelND>*X*lA9KJJ*{Vf3221SMO`6td;)9yDsxD3G&F1o;JpC+HIu z-GVcBqM!O^$I%Y^FDgsM1&!B)-CbI(OHrOh0|prb(iG90DkOJ|k?kB}Lw>hTlGh6) z<;(s+d|#(y6gNe3NM7a+?foJM9u@lTM9wUlfYhsKo8|3E-%}NwG@jDbZK87uRH}#w zm_|w2?9Zy|m72`z{imo01cNJ30^6u=zOUd5MOozkO#6~s8D|yTRrU6qqKYAz#Wjh+ zN~~GC?0zVNWEO%`SE7qQ<}b0Bzox}8UiPIWmB=dqNKgiM9Al*&kVjph^)L_{oD{68 z)_%+D6#Ma}aHSFPY7=UTy>Z)M?&JA%3eoYS>g{SA;N~S%dgBeltXUdG zm7oPdG`cf*^3~IGm>!kSVL{J0kr8zI0$M?qiqOT?lxh~?)UqJ`QlA(l5(dU17TAGq zJ$0m~v-ZZLgN?Z0LRWFceV$7md$EJ*FWUwG{c?D<;x18aG*L>c(S(Yw7S&$*^L&fY z*Ij7_f#=Ffrh??N9l&fsK8e_+;GonSA?VQb*D~zOi&F2*vDW>O7>2@>uan>=wD^2V zZB_iP&tsF}R(^hZc(AI)-ahZ)wp@vEhjk9xyM!w-RfO(6jD zh{Jodh;O^Sm3qCt(+)Fr58Yb6=_^c$^^!^DiTu|w?)v@MQANxSij71z_hsT-!Z;)m zNl%(;I;f5u`{awPEEU#^NL_W-Mw11R7i=Dsmc9R&_mo81OWV@0>I|f%8=Vd%g@xmlB|LVoHy21>r}P~O!JsO##n?-c30l5@GyHTSeJNra!C$CC8fao` zDK>n;7*C2>mYH@7EaQf45{wMTFN9f8@6%H-ab*AZD(y zpG>MIB?@gF+OW&+&iwQ~_SyT73jeZtwgnySPEolbrf*z$x%`_GOZ}J z*89Y{?aYPFpqez<$0K>mw=P626}{#?nZm*xwl<{va6{STsKE)Vixtk6+*Vtveuzu!(lqZBomANhBjfyl5xJ55lRtfUKb1!E^os6s4SjY+)u(Np#iR zPD`&_1}p%SGzFodbn?!7Iba1)s!@Oq62ajEJN~?TeSi5Df9C=zIu+GdA+Xc4f++4~ z@m^IawyjL=TS75?Ts7!am%vBFI@*S4x){&y8O!jUS^tU{=f{JvE+qX_!bQXYssdGk zzo(M;aeEL;mfnLt4Y$)0^A{(i_^bO%|4Ef?=ghpmsFt`mSB@i%?HIpn+GA4<& z$`dLcOu#&2fh<7uNdrFToGxZL_tRWH(DFZ{W1TEv+njerc8K#yofg_pCKq zd-YiVoq8bKX|u;xFhbVa_SeIsMOjgawCIP@>&Ll&EH3?ZezNe#y64UvSiF~|(wkz` zn@a0V^X#4JHP7xy0}Dt%Mmj)Qd@IpSRWCS}ir=G8nRb3seWs{D9b*KT~N_iwa>9* zq5q}PQ`&&@g$=-eljc0Uk+r=V_ih6>CGM0BUUUrgb1pt($2rvvNxz+TygdK>3C;1G z=?KDBRxYX?nDN8B{Wpmcn5$SzpIRCONj}DfS28+$HHUA~N&8J!aiZkeN zE?Io`tL&aTl%=TAW3}N7;(AN8OQUNXM+pGqnl8&3z{{!Uzj{7k>B#O#Q*39jMi|)| zjs!VZ^rr!lb6HwA;MeO`9qbq|yS*uKV7dnH-T;Ji-Pu_K_;Uk-I#*xJtLFWp3+uS= z-#7R^#|>mTiR!qMG42E6&xMja6rU@_9q`!g#I-dwMA6C}60KBvEj?v(Rh^?Z`#4qEJF9EUX@k0dKMxp7tj^4Z~Bm?}a4>(mxe= zf(lP|6bnm70tQRaw5h=K%{_(}s{;fFr$MVvoS%Dw5l=8Xv`g5l16O$f^9Exo82H9h zDErOcYj6B8Y*jsk{9;NW*E=FY(9H)Nu}#6~rMk;;JZjnUQLtbLB2DkDeUc|R7%9d> zyGg^zPv3a@ztKMh3*2A{a#`)N_fJS<#k$^&5{9E6<)6CtHsLSnM97{;KH~h-7$0p6 zI{*Xk|M)7>(^{31@!vQcb)?87k4p@=)gw6HIO?TO6_r^bIPt3J=__PD zdRo}WSdMLigB3Vgj5uX_9Bj_Zr!w5xrt0if7G?xP0AB0`wdkss#$m&lS#U;<&5(u_ zW-A}KjwY?|`kl&>pr;TT9&Mj^99Q#t*J`$&Fby!@2c64utMKPHf<4iyZ?Bzr(|ith ztE+0o1C*#f=@D|WETG`ye6@DCQ6kG92Xk)`` z_ZB@TLNBZz7iAH#y|#}gWQQl@K2OLmPbgsXn+~MO;9vn9ye010SOUBw3_df8_K1VA z95}GT1fNyE6y2$)JE@%f4Br5hMOZeR`>K&aN?%g=0$hOabtzg1(vzHWKL%qrB?YTb z)bl2{HBV}d?XJNoYTXa&Z9lNBZnDB+$|zu}fXUiCcnMJeI8EC{2D8aMTCoTnlOUB_ z*(PCtL`R8)v2s)=o!uq{F5}Fcn4`R{;0J6Wy|qp3k(~Lb^v~py~Mo z=6QQL%#b~|f^{Xcjy(>}#wo_ghfIoRMJFFn4V|>xz{Mqh^11XWbW(4>+o!s}xI-jX z%voHl+g%&)12ru(`j=*ugF>UQAQ>CVZ;YCmB8GKb4TD)h)H;)_Wm3v{T;PjO4x!U$ z3bP>J&qx0`xarOIw}S&O4w7zpP7!g)C=j4mgN+0DxYVe;4`BE}nPk?UFgunhV&`YU zu39`UDn$?n^dk=?+J9zK0*}g~f^eH7kql7s=8D_qy9WnqD3q?_M3M`09#64XzqZt| z{dE-xuaE`-J+pGOosTQ{kCa$(bLsZHyPmH5t*T>lIL>(5ITsV)StREZp|KU33N;ya8vwo~eX8rqjv8 zFL{%1di+MX@l@||_H6326L~79^Qgs9IO{yCVw~f_JZsTkADgde)#JC+FG}#UWKRCn ze)H?I9$rFB0PW*t6cW@T>t^9sEdSVVA zJL3ZanQ4SxjN0l6HXSJvwiNOsFED>mj3|1@Av+*b`$*<;#LRN!%JNZxlV1myqeNGt z1@ImNZpZel%;=wtJ-Yan0jzx{b){dO`0wO&*h)TSWwG~U_Q*>3>6HYjRhIf{%8u2L zT`5skajadd=_gnD-wwq+$zIK@U;TO^uJ2A{Xf+QqkPHtXD{_SE{d9?O3mNSg+Z$ zUVCu8?&NxX=6XZ%dcxbZl^fZvbc{qp+BOHa2szDzAtUMqL_VcCFc1_ExP8wbse5Uy z#kiaM69xfR)pY6B^^>c&5aNK^(UPFC2ku!urrMEE%0rzmz-hw?7%7}>$sgr|iFfMp z9lQSYByZd~neg=QA2v7s+DtrWWaHXp+;xG3{39DXp2lxlX?pe~JW^m^eUPU&pgx}k z#9I*Lt@x)e6Zx~^iMKNoU(Y0Fm;4>&XY&NAY##IPrbWKvZ`Zl++ zoyScP;EU;ouj)XoBh{18>Kc}Ep;lQb(?U^oK=`dgFq zt&9|5kf}RxpRCA*G8?>}HAl#tqzkJsTi;b!7}HUdhBOW@Z2CJZCa5zJ$i{dE{flL)|huq8!mWRJfvE1G0~#MmiN zjbc@%=-MVLA1JB}M(QTpWTTX>i99!P^aq|^dPwoR028j#e>as+6~S{;+H*6f`5DGa zZ~YRuN$9CV`%|WQ^klSNmTkKw<EvIJ(s5)qdZ!qDJ!5wX2j}U=*Id1hdX%l%blG5z*wR&stIG&VPE!knG&8<2 zN4-r*|BYu`=-&QRnxK2<%hkKOcfZ~FquaSyB@^ke7gFh#NlFaHNTC$F5bEfN)`zH0 z1i4$U7%*m2YE>bLf;UO`VhLsZ&-ls=r67&X?5jga#$DKMb;EUXL8wz9;lF$xP z@`09v{nk`jJ*u&V=MqJ|-bE8Ei=&Vrwmljy(Q z!lz@*K(Mq3SQ!(FkLrH6%lg$)RPDHBpQhHgjz<%xf4K91qtpK_KY^cpEZCSjuzlxR zRsGKOo1$SWjnXfgF_vBXo*M`eTu^Vlj8D0@q)2v>v4#y@!pB-ts%uSXXJBZgAH_Fpp4SXjk=Nk%CGD7z(tl6x@p=32`bVjeFDUj8-@*x~*(v zrLtJL=~-nFbbf42rEv8uN6)+_O~=Sq=OP1Ts+~^Gn1@9VnA(C>_k0n36)@1zEg7^e z)FgpyXLRN9|3@a7*S&BQQDZ*tk%WK^ipovFF_{?ZX6x2goQ)=W%cCu!gE-ABa^bcQ zD)fttOm^1ULTkdL^fT#OEV4&IPE8Hzr)isWDFpgdp6*aM`$#8tu!EcK2PbKiZp{1$Z(@8gyUlR>MVx?P>mBcJTFd``a{P+5aqSU%g8qdO8lJ35HlSkGX2(m&^*kgb5RJxDjcD{9d z;Bm>|oXsCJQILm~u1G7Yqt$8(MW-;(OyDZJ-(fRW@f|x$mdUO4xbSsIjPhGq^Yw%z zQIKTgfo{^5(Bg+};N5Q`xlKF88=(>O*(NNraq8|>+n6nx$dZiaSP94Gt)&B*&A%@z zx?gaROWBo_tx|=Go)c0$mhisPasV~o1 zV0TH6QRvq4F9k&N;2Y(3R|jnV^!dCvd$r!~n{L9|Gp5Lmk`}wrz%ZHaPX_0Q>Qz@zI@T;z-3GpG;r^}%BD-@n&$1{(u5zX44b2Xs#&TJUlk zK_aOmkF?wFek?ivn($e!H`l+jNMZXHASd!8PT<(2`1O()rQ1uH4oo>AOD0KiK}1Xi z&L$3!yW6H=*$><_GJ*EL$Z6*PBB#txKZ3TXh?Y>c0Ai|SirKTJYx+R<;)L*@;9fhc zV`r-`9!O!B^=7*LsuIo(v-_{5OElIHSh*gaOpohPy|j=gY#*57GulhX!WduIp!8Ec zLjZ0`Q#dO?M!USJ#KJ6M6YoYM?ZGq#E`0f3f^2Ou+O1}Cp3xM<&o=dYvRW%&Q&`T! zi1v(Jym*4%V!@I7ppCMtY z-_-a2`CO!W?lyk%2=lG%`)^4{6HksEzmC+I&mTKVw|%vlRCV?rl&6=z{Sb;jX!+uJ z^Uw01oihn*TQ=9I6YfyW3U0ss%ZuA%SoZP5O0F2c=SAGG;RIiH_B(0);Zv{96Smve z2Mh22s}!Uy{Ig*beH1(3M4h= zWkQbpX_Z}!6x$;HH2EDmKj$KLLrtwku)9E{Dy&adfV^DZ>Iq-fmCyf49=>T|Rf2o&k2|T1# z+Wgv?jls)*Lxy+tj^SdEpaK?evBLo%M!w9sN8Q%zq4vvVgojW|dvnhc&a4?XaZUT- zh|p}7Dt^D#XX+9Zgp2jDlF-~?O-V2G}3gRP99Ubh}=ZZrw>qsj(Lxm zDgjDW8*Yj+vgrs{HmaK>Ph|c;TwWlKKV#91vEvI8`{~f+YvCY8`zqsDWhxU%T-Zu) z68*h*TzPCly@JoPZBYiM%0^bzM$6Jy&_N2>2TbK9jh&RleJ3RDRMO#U$$#=YNaH2} z)jRSeuJl)m3szbNOw!|++sCT#RXnu@GJvXuZlMW%%y$D!hkX@x*=YNWitWfLya>&q znM~hWy(?#W@3~;%QQpiI`CZF3yZ)&#u(b>kRd*}G>`t133PP&{)?yUO2B(NLu%!uU zz!DHRUBc)tO+XQ*Ws}X`sgNoC1lw<$z*H1afM|O}(pJkud`W4D&6?7f3nV8VrRmeJ z-w+`VCQ2jZIn=z#3YeM~B#bx~ZXBPCs%BM0E}DZ5wI-ich=RqLiV=Fsm0d& zAi>^@o_wpGT7$1O-iH}2QQo=~So_AkZgUj4{-ztcE#R}8Bww}jabxETt$V|b_r{Lw zulPbi+kkciSOwAyqzJ`kGhm{sq!8P?u}pyKV4;dw^0QQoQMa5G@OR>#i$`F1X%B6h zdOVtJ!@`y2xPU-Gw5U;I!h77pmqVzah$`3*(_MAp@P48S{^;<|z&HPXfNIc73?N ztOdeY7#RIvT?>$#x((*vxb=+wJHizS?{cHPu{uO2U;CKM#gz=9=eLNi!g#lDlvQqA z+?gL#q;knO$_Id!cX2X9k8A2s=bK*N;=i>XqjY+G|42&f73moWzyRrMyDGjVhhDSo zkHCaSehX~2ZP%qnMLr)3e{uNx{NpkVMF-HoeKPs>c0GI~Md#TIhtVprAM4G-<`LgW zn`j0FdqZ<7H(Hm+{B$nH{TZxQ;h+qNO+5efY` zw7Sw?`=1+H{o+xl1wCs20%a(w-hh8#Bj{-V)uZSvt`ZuqV7J6{EC}tYUQyFtwYmQ5 zj^-7{b`aIPceLr}Sfs=Jf&^brq~3SSc1>!SzSM&sIfokQan0ktdN{Gj2@-npe3Xqr z^HgN?bT)T-H2R}&bE^kh_T+*=oeJ*@h^B(|MPY+oW)xJeVx#D!itG(`!bDaUzSy0fHJM$w*X z)6Godx3+0LJSO!(fVvvc0JwzJtG3W_Et%s3uY586U6gQEY{?R(V(HZw{U3nE$z8Vl zs9?nAgFV@C+Q5!rxZRn5!z#8%BLM;8UNpN z!O#H}bThWc$&e|pVMsOlN$G5Nm>S)YdBcHne0wHhm-A1@>fLTK|o^Vsw*4S>OeRt~b?RTpjqPk@g zSyG+G_>yt_5Zo!zVq4TLEKbFnqERblbUMO+(ug|yi~DquH$1OF=z&Zx2EJa@nA-OE zLX>i$v7My}wT5pa5_~H(p-TLjfzJCj+kG}N`QL1_mTmi&C__s+Kaa~CF*e`!`_Sp- z!zi$Q=&+NFQN0<(b9b7CC!qQ)ha6cBJ!#^7JpD-Va#*3s?i(>Gx`wVdmX91Y1{Eft zVL9emY*>D*^o0}7yKau17mVZ^+UzhH(~n8iKStXXW4FKE7LM6*chNj!#}4&hvc)SW zFZ~x>pG!OWDBd}es_-j80IQa2z>?}INMEY*+b-TB`(;gK(yF>A2WCNvkQByiYv) z7m|w>E8%aRsNEpVHC>39Az*6069kV^FgyUVY-~5>A45OQ%0APZI^NdB?OBKetENt- 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

^M9r(1h0f z7tuobRJU3@#Nqd8OK;)!Q`@2x#MMbwp;AwP762Lo;@HQMo!zKkNJm0~0^(YZ&e2;6 zQlS)I?J~K<66p16G~uSk@xv@HGJGY~711{VH_U(k2tJ&)sduvR)eb}qKaKij;xQ$< z3(D#jLYw}SViyPYjP-J1np|Esp6D98)u7(gle$Yk+{<(fNdP%*fXQOfVIB~m+WYx#pFi_hD*zg5FPXa#)UJOtaB8hPNKh6OEqj94MS+|-N zESM1uGN3rikuxv?NMa%g078(VBl(g16E_>a!p+fG<8vx2+IiHo+{5h{vpZv*M@v`V za*XluML}*zW(kl~LiodVFzgXP{v8eMD-2IjNW-g2*k>aVK{Mu+Em>59(GpfJ;Fi#! zathhK*jit{Xv_dJfWb9NmM?aa5v#Vv#N(Gcd43|=v?7d%v5Q5DTSc{E_CKPZ>?F>Dm$Hwq&&GuRZy%r-eq*NJ@3)Fd=r-x3~(3CeZSOhG3Xwd`X9~gk z=7^&o5w^i}Vzc6+Xkhv+1sws71pv3%V1zD`W?7XA1V<8W0s#=O3%NA_5`cp&8Fk`5 zh~!RcZc>s(gJ=L)AOJvaAi0rL_woAw2}nGG zzwljeU0@7Dg6PmdzAoitmB#cBxt|%aRS#h!Xuvc80SIK3MUSG zxS`Y$bkZP(OEj#+6j_}LSr>*uek5%uB~ydM@5>4exRIYK2{oA_rF4-e@RZL`-~tXX z&&Gj?5Hk<@fF&QLi}*|rl7ub}KtjL-86mVy8B-z&+X-EY`c4ky0T9Fp5+MQzWu-QU zB#wK4CP{o$RQlOs^cBmrmEH6YA!)E6us?yEYu0<-Dn4=dQP6J2b&5=NkxU;ZD6|F% zF@+Z*!za!Gmvf|EcP1iGlvM`soXu=pvIkNrnbvurpe)T&V{M9T^LI=)oFF%>klv>F zE6!QQdq@(~l#>Uc2!H}}QyzFC@5ep6HUJdP#$Wl8g#ta3qRZK8%@&Z!Axq04zjTK9 zz0205$W0T;&CtuuqF_2>kbB`o!HPj#BS_!$%q-dZlO!d^UcqaM!Z#v? zZ}kcnJPViN3g6Wfei$!Y-7EY^QM4gaw5eCL?OF6Wu4u2O=wQ6)Xs_smqWFtQ@tI!n zH_zf9am7D>X2{RNva5?3-iWXb6id?)F87Kbm=R*q2xJokYPL*>N;Zvtc+NN-a-W`R zpMc6^W)nqmh?a0umKM90w4h4KMd|q_=(&Csi`p=Y@3TnSl*)*f`DT&RU!p+;9%Uv? zvQx0KFUpLn`Xx+eWmiN2ddsc4R!(^gTVLl;k>{Ve#Z)8Tw zJyfn+{Hm~ykGm~esk>icqhEO|wDK-nrT0XoYkXzEugZI& zL~SMStMZ4T;hyg+W7w*qY^sBLsuO$4BUQ@ML~B%aV7E+R$pCqFo|xuyR?seiIxcW1wLaH4*6qITM*?sZ;$zv%P%+WIB^`e@Poj7!Rf4SfS)QICxM z8iaa-Xkf#6cZ0*5hTty^pF|tayhQfc8jDqGS<@PX0vk`>HL87Syhqn`uHOVR;1*FY zO;>4x=a>HcRRR%Xq_IUIy_=Z4n^_W?S?ikFC!0ABnz^Z3c*I)x3|dGwbfJV6k-8SK z$rg!&7AdM$8L?J5gH{Fa)+-6E%5|+*CtKAHTCY>Jsf)E~8nkJ9x7|o+)2nOC2IWJ) zU@Bx?sRz(BEl2?Z^z?^oswvjY94SY9EI_=c6wG)tU-^QPj_M3)V?dz)@YuJvVwO*w5vrBVnmNChOGLSao5Kfk$-<&(-*kf%_~2vezvEUDiv9uT5v1wCL( zK>Qn^97SercK6|abtl+{*Zi&xr8MFZs!n~t_}ZpoO{J3DP@Qrrf6l-*RkU;MSM8-u zzu-QRR=k6GYCut@|9!&XG^jU?ILJf~?BK6smUQVa-DC&r{)Z{Of8ctUP_EDKKnB1@ zhBbK!k5@Ba{-p;3K6B4JEXuh$;Nnf>P3%}@VPZGTMu-n`_&j&88R0R!eiJv+9XAjf zI&v$K=$Obf{JY%aeL02QppzYgP{H7XM2>KS6h-OY?yTz%vTg#Y#!#NVdqjonLqqYC zT}QU$OlV#b{uUN!>!I*Ml&Ef~3K;toRfu)ug#qq{l}v{nRDW_ARR>=QC6psxRT>VK zgb&PI9b}y9_U{|neoumuPGl=hx+5k^e$xl}yn3n1(KHDR{lSD8M*MYgN)oWe*K1ba zaq$ZnQ{5SAGeq8V5(}LbfM8u0x4HE$edMwe$G2-r?y*g_ zBr+W4-x2p{nwsH6)U;2Hn(mL17fe4hBFVj4eTKQ%)m-HVpO z>5-IQLtpFP_UgTM{`1;C{IwqM1l{`?vA=VW=|)}qSp!Z^awDdv9kcPlNF#UT|E4e^ zbxq#{K6qoRPIVOx{p*QL$Oz9DTEWX|$jZTNi7&w=U5k*<~3 z*9+fX4;KY-hN>k^)EdrsiPHyPu6Fen%<$JvDub2{so%8)&i<5xKCp-<8=nR*sS0-kMxg(F>{_9)u7oXRXeanjIvkzUNV}JLqpEE;kE)NbAqCl%; z0H0^@YgCdogmi}r6GoF;A>aEeyobM`v?gHw{8>o2JQ2fGJ{S*a+a@Xvxl|GT76`keO2$%M2f_! zK*N^6%qPl&P3pkSLaK(hy&LBLP`WR+thri^xN0Em+Y`UHzUgf<`fVrUwr!Gk#KWM8 z!f$0&n!NvY?6B=P2JWcKe)dfM{HWn`*v#k0$Dg0j?BXPMBaL^X{dS)w@5VLkCd}+6 z9q*>l?EQyCFy71Z+k2M0m)o$H&sFw4^z&Ecrr$O@_W$-UW}lq`_X`^K-|y|+bl4~7 z*>^hLf0(v^{A<51`QYH){yjhX=7{CaYkh4rhv2J+-F}A~%H>L;AeCQbe{UVky*teO z)-di+J~{LJRo*~!QvLf&w)(eu&*y&CO}?*Mkv#4SJ^IXbJgaiN-cYxl{QODY@fz3j zQ<}H$Up)W1R`rGJcv1g&-|zTu^6`;F)t`t%n169ad`(`DY@y9z=kzHD?zAee_TzCq z#o7_$%j2`66L8AO<;?Mih7*nyQt$rD4%b(-)K`JaW7d~n^8c(0)1L9a{(50|LOSh{ zdGbZnzY6Mqs%BE$d%V>zxybVVbpPk!OB&W2Cuasy1sIck4ernCDFp2kX8qUaw?F11 zde{9N4s9A6EK-Ur8(-_uez)@f?w<19v+=w4>+ilN-~DNS1WNt5Z}Q`T|Bv95ACDS; zguVXp_~geE+6$c2MWo3^^ripB)0B(2#*2j47fB}k8XJI~zvRR3iNZI(A z+bW$jY;}m20;cEB1s}I(F}FXYos_{yurT zy41B&Il(!2v2yh3V_nEJ@pJLgj>(QOkAT8V-|Migua~tpVH>Zfmv0pFC&0l~P?so-*<|WLCfVq@4&;)91Ht+0soTW4O0ceUDc^o5nRF zNKej9GgCwi-`Cw#d8tRZj-z4HllL$w(@PP(^L~EsX0=&`afQvo{;hiJcE9cS3kSEG zoJW!cY!?r$+o)4c0|6>xHm*jz&$;v!Zb%GVZdgqagbaYnc|A6^d7xM=u(bFnNksn| zly(#DglWnx$U>9vl#r~Y&O<3_g5@|~Myvq9>zIr%Yn@tBrFg+?WbyqlSH!o6@t3Uo z&c~iW-s$^9_YoL)9>LEC&}c}4#}ICUKy(Ez$^k%PvFlJX2;Yt3YqK*nwVnP;-;=`b z`doA~)p8r<-!;IgK6=~nM0Mv^VrYH}-(N}&YNhWn8B$8?-{tf$F-~)drJoR6C+NR+ zS7+4{(e;<{>J=E$#|r#COC4h1)@;`NsiH4Kqz<+X)LG`|s2L{HOEl49@*Mu6^xPp+ zf2=aru&$af!{VNvV1Ce7J>jyWd+hks<(bAQfc6S7sRVH6DaD zcJhE3(L=57V`-4;;@~efA5I8k69x4x8`s{~%SC^(W5BAUZP5Xm{GLV%^1tiflmaIo zZtCctP)(?<@CKP)p^ZK?xoN^GN;8IIj@71B1V|&|XR?V3uwhJzF+dSI?$>+#g36@b z+FM|^?_Ao#Q)o@8-Ba;S+9Bh-t4W`{MLDy*w6#GqwS`g=GZT#>jBdD*aM!FoP%|a* z@ul?W9fiMp^HX_$Gx_4DSJkLYIuP z=XF8n&PKAq1V0#OTI8g`jE|jNr@mHyjPt6?N(~}t7U`}hvR4OKY9>$8jZ-_O1V zuG)T9L4ULwXp*^}bY+3lj{pPI7~>vbuaUYh*|K%LxTj-no5vof!w0U(Z{Mh1(jL*3 z{avyzi7@CKc_oxtFb`rfmL7ttee17!WiRhww(8HJ@MEpk-R##&lmEXDlW7wF))Oz; zjn3R*Mi(wDHI2<-Z^Z2!UwwSSacX@^cl*!A$aFFH=;VF>Cm%mc&||P+zcyz_n?~{RJ5v~iXfRfqMvKW)K%mkw z*G5X|A!F(w;G6K@Lj*vK1*QNjm|;EHgDzH!jt|!c{Fjaf#PJ46Qy}G?y;x&GlKj$X zNJAo!VhW<0)xv?K*Qu+}aO4}yN^L_dN$3GaU_sdb8=t~2U7}FZAh=AdIt75y7W+31 zW%L-9*p*iJ87LYOf54fNy3~NsHovzT>14eAbbw|qCVbnLNMi?3T3irl%OGIMN>XM8 zU|9ha1ZFM+EIp_)X})PBVv?&5tQ`CI)@%)ORA!Jps7=eU}^G&qy|O3ey>$ z)GIVGWkpzR$8?uE+%wHj$m9aI-dqqs)>Zfj$wy*bq0KN#lq@sg`Xm0Iv-QTBNe zq!T6?_UZLCz(r7?Bu@3=+{v@Vw?ae2ss_)+R&&VN`o9YnwL3Emd2;&YFz!5~Xo>sz z?1jRXm@$pi7>jZ~0Z%=nQ1i^>CI+yRdhz<{(@RnU3kIX1sBEkt=aIN9V*m``<-uyL z)5w6)wE*A*iC^BJ(5Aq0Fe6!64Sms)UA!7JC9nbzR?cz^%x80UGpa3y=Ar2{Jro00 zGIv2EQ@z|y*E>lss7(O_cgb9U38;nov!DW%Hv)vmmWFvBGE(KtqKUu%wiL|l^Y4<* z1DlJ{kwP0${}Z%h+s;J6fJeFf=FYn8IwNi~h+8#*2GhqxvZu7|m2I zmH)_)QjxJaw9r?nZsB%ZAV%HFtv+28ik?J~hYDU@AQ{3TT%Uc26zrS|r!s949BX`$f`gT^uS#?IyF;;)BK zKOXXCHWkNz1T}trlPPF5Ky^1DlJk!fJU^(SVwZs?oi115Vh}+yJ0PGn2Y`_Ph|KI} zvA8rPFn>tp&JTy!O#v9waud;95RfR1ywdid0lxQ+BGxHtamyJTO2Dw$K;S?<%2#1h z3t`X+64w%hfI~1vYx=jl_0jGMmKZmm)FsDwsm_lNB%UT)-~G$fRj3mB{AEo3%VSHo zW(CiBQGR0l7#IT+21Ws$KrF~D8-ya@-5)EYs?lz}PLq)+59sBRxslm^wx6c<`M_v@ zb@ATU{&LJ}9j^j}q3@C~>X9>E?_fUiu*+wL4ku?bbu_@*b5S0oG4XCp>Ft%mUEie# zVT|kFuQ7BS8ys~+-B|rG9=aIMA&hPQxo=|fqwuGfzv|8NX$4y3Lbbi3YRY5dfAJ@8 zddLX;-|}aD7T$)QOPE9W{`iHwvRyl?4DLUo&Y~I9Qw>FLmXUg!DdGgu$uSVOJ)cKO zgaM4`1J8s}7e!m#1cU;g++L9Se@GMHWznWsA*EVFh|>kD1P{P+?n%yqb)_y(oWOT6 zHKe_l(NLjd6+)YrO}?|Z@Ri)&59}8Q<>7OlX_okdD7#W)NT2Swf{APLO9R)L*LrM>ET6( zPS)|;V?1*Ft8PM={#Rb%4(A<|-QU(n9;YXBa=zV7PHD`S@bbSl*L&^R?S$M}innBiHq9Hpxe#~hg>EMZ_w)+AXV7?MtKsQ|3BH%pe^XfSyu-@1 z?{jHCg$B2qZ9fJlobXfKEu(n)e&2g9ja5y}(oMCsG|cDR{)IEK_g+^IM1-9+`n+o! z0&Whe{psFQL4SY@l^+NiC(wPwE3QlqT}d3gawZ(?dQGoDOTS*rpij$CJPzamQF8*E ztU$_6Fu)4OE6l)z1Z36=`;gIGXn?8{CX33Aq1q6_7a4~QY>Fn%+==SgWp;Qi=wbBMC{9DEE|BaV~Z6_$OO-~+}IEY zgmFoAi7sEI{J=tn@s&IGFneB-9?p#e>C}4k(xLOU5^cgX9I<00BRf1}Y&MEvtOtmV zrX*?MJ)*?`tTq~sLoh5zkJ(Lt;bWxrmX2K=AtbRV)NRNuw2i7yanbgMP(7jBn-;-4 z7$qx7{zh2quuh1vPo%y#XXS>;X7|H_@w3qJ5k79+59p6z=}i#b2EMv{UfwrSA?#2s z?x*Iorkc=H+W~&O>tM!IhM7R1?v&1Z#6i|V3I z(?Mf~svCv?0W6pbP^L!O3N!ef>qNm{;dG5uJ*RP9co!rftV9MP&|k(5M0WR?lQywiY(HF@>0Biya`Ngh{lLG>3eHE_Bx9yw7` zu2~$!RRMk0c&=6%MNC~GkmEbJ+)#_WMO3gpkF$fj)EbX>*BHb4jBFP!5hOXB3AdW7n0zgvWxA za5(bqwl!SKBR|$EGI2#QApozS9n04Ql8KH-8AMaYLY4otMdDRe9t^E7w@aN5rJ`RK z2gQz6BcxcL=_C<3p&ADE4IW>6hwzl3^!Yp9Hyf1NU49Q4uBtC==4cAP@;%#- zi@&XQE2-Iho_?W(AY>zP%h>+P<)^pvNcDNW=V~Sk3(I_#@o_^=&*voVE${kTx<9t` zI5LNy!VJa$ms6a__A8^+NuQ%d+VO>_R`vc&RD5?{Sbej+;&v-wb%Dovsm99`6dr5$LI91_Ez!F ztrGgJ5~r=))$lVxR!M)Cqbewq)vQt_-Z>iO#%bqfDp+UxT0eVios(ppTWFp4+&aJC zx?tM6aMil#$h!EiHG$fugwv)}!lq2krrgM;!rrFR*QV;RO?489bZJxj+@`MIrheMy z`Kk@6LDwiz1471}Pr{;{A}^8B05f1gfM6L-fle3zJLMBK#g^rQVY;Ab!iT$QiJV^4 z@BmxlD!a2-#{g$6`9);ZMHGV)NS7#^xejF-6CKjFi!!wvrLF@h*|m$=rL+mwA`HB9 z(ZuvBDh&!Q!Ns{fBQjd);^~JL=&%>dHZdi5EkR%SrOYUM`=WRrYUI znn}fPv#QHJ^v^4#wcF+1SGW8(K>J|OUii`4ih}e~nWn{+B&fa}73n99wCXFFq@#d5H*s&b3b zgV6y1)u;$!aoyevZa8Wejl#+!vAnwWK`xrkAB2>L_1TV6Zwb=e`eyoYH9ja%5j`q# zcL;f@zwio3-#+PHi&dEA-^zB}zH`rW7-ZWgMaK2y&7F65HXZ$jr(?J4>lKue)sz

)+F{#lu$xY_!XW8kz=;GpFUVe2VrS19aig9mA<||~5agSZEzHkqp`Aim; zo0FSMawnFEHevovft>IrV}SAnw!mzwH9ziM4QI3y*pNtF;mn4U#?6y zsB4d+VNJ~>2x$JN{5py|h7pX3iyp~>@c*IeDmiDy)J0vm;j8oNJd;SE*kfU!4m3|Q zi_MQuR8@lRX}}ab_A7PV+MU^>uH?-*uLbOo~2;g z)UQkWLVs;%{8Q`BEhnR)P2NtZg7;l>g1DC4Z;JLHIYOVM%3VoU*^bqI%1@)4nvOI( z$LDti3I;(;bG&~VIrtrhkJq02XpV&0o6DJtZrvL9^B#Oq8L+5G3+tb|H6g6#suJWp zVOh+Zj9ydtR6ln2af9!N7e{pWcu?^ORxp;$1^bfD!w@6uG{vBmisjb@dR#no98_&> zNP;kMvSF!!IR%e2?*DLO@w1TM>;MLf*8{KzGsi~}e3;tWCL2$A5&xr|V;o7A0EaMR zAZo~wa~Ksm(&=XJXTl1g%5>}Rmv+< z5zY92lv%AAA%Ox1h5QL&BX3_{-}ql|ZhHqVB}=_yKKeRQX%X{fLeq8o&g2kelH>Ju zaekm4wL;PFUVWRpcRHjRX$D;uTxgYjObiZ19em2&0$(+3(b2yCH>)}Kug@SWkiyQz z`+ne%!KWL2+fqUe>W|gL+%#Sr&9D6~HcJR>zuPITbHwaE$MfCm&WP`|ll#}N*JOFs zjD?5*sUmqTB1SK0sV_{-ujO6GRBV&+-Q|P75oOT9#0p?=dOGk5`jPq`Cca}S+?TmcB&vN zE`=ZeaA)I+ll2y#n^(^A3l%{SfNck1SN^`|V);_(uiwnq!#L zgT;Gu4C7q1I|_?;!>>r`!!!|E{lxSGOqR<>>U&4>zDl$%BQt5y+(%BXsk5B@QMWI` z+P0EEFJ3Qxl-Kwuiyoj%Kv3OGLVReVX@w&hWU^+lYE9s>PB4E$q6iku8L|~^ne-0+ zi;gc=>#UWeYBD88b){d^zXH)G;&yj)FG1CKN)L8wVx(*dxRE>zbdejFSU2YJ?W5iA zCMh@_VFk1tsW|)1mL(;N#u*ZxX(l;xqXbNW!hyO#dLDxy0{)8WJ|hEGaPw#mS0>Dk z6$!(J_ktKMaNGn4HS_GGq@<{tL6c&=zdwf))ist^7wg~Ff?PL(q=M(90?$6pfbWOg z-_fW0*xjN!{O!H{Y?i#J+Wc#^PR(+{+P$-<%{#1>J6(rw1Rc;nzKLr5B7S2%?vE z*#abO#f{LKE&o+RZ}g-h6#zYQQGGBv;g%Q{;PndkX^!`{>Ed415y;K1Bg%v0FJJ@^ zz>aW((@Ve+Kyz_6v`e^q6Hla8(7lVC9ghb97Gp;Ym=sSxtLGC6l9+8j#5GY(RN99r zc;g}Pl7%>Unt5Rdf5<$%|{}fA;>qzQOf)Qi9*^;XJF-tUnpW(_$=AAZImn zv;9XA_JS#RI+54>zrz&PHdu&A>b)W@KJdN^9NIaRkA#{GkJi;|@t$^VLlA0!K+E_|$r@hAj% z)#1^}A>|qPubm%y6zOxh0V>J~Q(rh2OK})29*)lB88!ISzi$>sAYQI1xn-Gg{Va(k z1J^X9YtW$H#2q_`$c+AN{^9tFB4!u;3}&2*?B9Dh*3@sxT+jdPDoue@mWYd9*|14R z-D$9dV$S_O{ZfzSZ^N81OZV3pz1kZOVl+>D z1jcO+s!Aq*8$T`@mG>V0Ug$r>*|~E6t$pWe@MdA>TG-iY=f^PG*%&Sa(2D1%M>J{B zJ-DoCa`0t?f^l0&yFn}Fs>7f-M%nPK-G|_AQngXu^Bx!&B}#X1LG^fvOb}-@6v!?h z?Trx@0T`70$Ti>yAc}gc=P^o;902FWy+^!SPQ!qV#X8i{i;fETGWtXL(3pQb5RNuu zx{50jHsOtC#}cGcMeR&wh*YRk3amRJj*Q5Op8^1B_w&=Otk=|sPgn<0Au3S0_U;2W z;f&dPU1V~UOztX(tAtEwPD?FJ7;Bb5fL^gIgx^I(p{Hyn!AcsDBM2<*{CYsRpa#RS zJJxy9j3^&6Se;alH~F3CkCh{^PsjTD-An_LwlJ5RbWfGpHWqYa8U-$Sj0}!H@sOTH z(4wKI_c<6$7%Iv&ng%@LEi;|y%0jdo&88Dkp-u~<9kPPC&l7*EIKP(687i}u@nuHv zu;cFDkfHwKkLTd$q4FHlZLAbO`r4lULR%BGnIkTe{W1Bg~yPUgocA&f%y44nM# z(9*?XfowfWe7O@16B5G%I88Z%*Ts322H4NnaT14aw188kT#1O07Z{T}#qn8A?<|c@?6Hu^AwT*w?$F7*zytg^ z*wtw{&ICJqm!>rghdsFAJ0tT*HRHN!Lg5MIMh}<`#qir$i^LMqMTajrmTBHoh zc-~GD(O<|}V1XSyz2f_xGv(I^s`h!Ti_fy<>h}_*qBLFUJI|(p@s=B4#U?zbxHFaa z@({0LbG+JH;O;C0gVaI+Sio(2`>kTd2Iy5UD{18Q0Lp(n(_X?nDskE>Iy@%UUk;+ri)S%o+!@FU3 zFW^lRH8~$tH^d>BX-|A>{z0Fv$|S|>sQK2*!rzCVuR~O3@m%sHRKB~Kd@66^9puZ{ zk9Kcps?4Pq$ybQ^?iskMyv14qc!rC;Uniug0 z&|7J1OPd&rlL!ijk8C?vdbG+@G%GJ{=056#?-)btCYx8>7(dj!6e^~htnsn`_bYf) z-%;gl{&58#2_D)Mi_s_b?x^~36rlkaYXwsf0?P?`1Q3~oO{vm>Nb)Nf$g&z%wTYaS z=l1Jgi!fdQF~$RCJSDXTd2sh3POz77vD;l}pc%j(p-zdb1CscTD_juu7bK~ZgCZ`* zThv4n-c9OkPCrrD0!Bp#(qraRS?y{)+C|i3>NyqR04y5`=K;f3^UmJw#T+S_Rh_Xv zy>qL+diCeSzrCT0+*u9uCuyn4Dd&Iv{&kKCsh-8X2!Byp^h>*JfA7h^4&d{@!Tkp> zzBfC%MfNiF_c&hv{oy3&(iQGPO+xFF%O^uL5nD1yetkn44G2OyTG)+L{DyjP4*%UQ zUZn<+NI=xOB!oQ$^k1F1f0fkg4PdM^U}ylHIckXIDd8Ulqz8oDupHr-vI{M1R$fsw zFAz(>FkTL9P(Tq*Gk_L>+s=u53I`g-7l#n|W7gp`M8SP-;2dC`vbFaiaz+g@NaMtP zQV;-$c7?R>fJqIiliD%B|3|J`|C{)V@z(B0)@~NZ!v)gS8r9hP7%e6Aa224Pbs(fd zrGD{Bg8@1;QDTQzJ!ggtirf3^94F!Iuk3uI8F{SdNGX6&ZLyeYsyGkq&4NuKK|N-}(Rt~5_7W4=p3~^IYPy?Vo?ER9 z7DycU4qyZT3=Jb-aRGyS0)hmSUjZ;)T?{=xk-Q-~l2~pyrzHr!#K7TLb~u!r1JFYO zjD}==AdsXX&claR?B_6f!zW{ufH`Fpe`=wx4;Gd)z9ik*yoa^FGNu_q7lhwi5QWxGy!S69Y^e+Qq;63l#s^1<-sBEpgPs-+f^7`GJm& zWfMk^IKT}66s9CHKNuxGU~(;40z~|jIm~TZ!OwQ-G>WYXN&jpN2iVR*=24W08AD{aRioGTH{tFuL%~dKL7dgju44@$1rx&-4u_(0KhT>=Q2o7YaI$E z@_69Xo6s^i2c}ZGK||BCz%*S^mKy`rh8t5~1NmIx0DScz#aRQhad0OYR#Lv|MAK-S> zC?sH*I)_O62jHy7rjymWj63hOJ9vJY^)21woS1xq5WH`8EB8}PmIuWHX7Ll}xX$?E zQ-$)ItLue$voU+V0`sMh^&-omAhh)b-|dX%yBuFb_^^}pd6mrro8221#0S-1xEG6t4OG~xI4N5Ra6 zwI8JqOG*LV%67zVIZ;1IWyBI3O@Lj|(B!I{T$3`&6#NnA41cd0EJ-bKEa@JOc zeCOje(q4(c2NvNyV2sSUI$eW=kxxut%w$)p4m&}|>q2arK0DAnEuHn)SYbS;heh6{ zB$F~}_)E=05Mq#R;bVI0poY+{sC&d0xL?DD-O=n%I?3tgWevRe{><^-p!mDK`3US% zuuMI2T4YD`fh|*%7IHvMdm=oxtB{D>1IVjFVSBJ5mm(@=0LKQ1PuZn37DYCPR3#0^>mDMLhFhz zceIZ$e(%UHHOR(ty@QT+`?wD!8Hbh>MGn#|7j*wM-+2Ts~0XX6sBT%q;fOGFeu zoL#A#AJmtlFKkugu2kq{@^%ro+MNGd(ym_n&AQAkKaV48u9c2T^5?eT91r&^m;0SF z4^CvNEae`$Uj3d=WQM#4?z9(>*W7m#(06-PsrY?Q+h>Yy)?dATU>_^yF89T=$}*ce zFi1aO<5*gwEBo%VSiPx5SIA;q;BB%eIpG7}vQOK??$qaBJJS(7c~kN*aQnW>mE5e6 zy{nrX?x4o}F~7hM4zR znjujJ7g0AuqHQmtT|;8LFJkV8JPo^e8W|Fsa1omk5|@7wR~8aqcR>P{CiGq;422|4 zUL?K^N&0Y+v>B3ogLOnXN;+`>Db0?&X4@vA)$eRuDGc~L$WJ@S*T`f~E6eYph;pTi z>Xp%Ir-o*Hw0#lB{!&4UI6V#tsmjGZ;`ySaX;*-8D@c}_%WeIcKlG?z@@L^}Ck9hE zZ&rwzDqIXK)CjR(j^linyNanU{3PSBJhG~O_-NIccWsaJ<4?|Y3NB65Wzj#@&@HvK zPb31oa?iHNF#n{U+}J=a_Lp`O?(>LV;ZV_G^kxBzd0}s8{p7Fuw>_Ffl|SR$f8TNc zqZk(B9sb5VdSYj5&U591*ogK*)Y#28XrP04Scr0BIK8ZW~qg`gvwr6UL7%KLw$ znagB&%VcHC+DcqUXrt&>h@ew|SsDhNCvpaX=r1tz0r%=N|BTCNi9adpwtYKub^k5x zUrZNfIVHT8N=~~x?8DfV6{&|jY8NY8{i|n>KT<_?(Q4`IFN^oOnXX;+=8Q7_x;1zu zYU5cO#^;XtFVmZ{S{B9v|75GxIj)-NMBLs_$5`LBrW}@H zCL1DiRoO}YZf_%b`NOdi18C(^Xj#?Is>3iE(NwI8K^I6DtvCh|%eD|YSDhqw<%j1N zbZ)v&K_vPeiE%m}$A7CM=qLSM!(2Jf#kTIWZKFcv2j9=f-nyHXXvQ%sgfe=XR~Y0f zKKRAxWl?jpMpR3=IRjv(-1q~+;PHTlQ?~9r8jyI;OLYm~9X(&kX_ax_O{f==!Zp3HeEP#4LBGDgtYVVP*K1^7qjWo>5MkO zMW1Qxrhx_xor+Xjw8#dE(VMX+m3TVq8FLwQ$ZyAsjT(H{&gZf?rOXq!IR=70$V00b!cJ_q73nOVL1-67$5Etpyr zsh)v;>5WwBMv8PPfeI#>AeoYS zeO9avN4lN|wc}I(=BWYioD;2BR2vu>U5V9r>defBZU6~S1is<|A=d%ZH9~o6^aMMG zmWkgS1al%o2~s5*HQC;g$idM^ zV*Uw)tVc5K1aH9Djh8>ha%Q7G;ZL6baE=sNTz0|AtmUkQ(CS>cM1p2J+)|YPCE-slaTapX}h3E zQN^qN@nZMB@8cIXdzXa+%(nYYbX>|KZ3_sBn&x=^zptj~W8Rb01 zq0tf%99qUPin^s4@LJPWz4$GtT>vNs1*A$|v);{M^Qk644H`T`mGOLeZOyu=tA{L>3J54T5x*kbLqKbM6P`tBA4dRjPXmZ1^Os`~?kSi@~ zVqb{U5n;-~U6}68+l9fA%eV(r*n`%pz~52jRWGEXL%!V#S9LeRQ(P|?^MW$FumVsN zSt<|3ORBZg_~2INM^m=nSTQocFp_7UDPbEKg}~DrswGU*J~v$7FDfauHE)Z1>+!LZ zU4geZW<8I(v^hgllAdR3rt7>FsY(WDLe%LN#bb=}ovDnLhgi~6pNjt3puV#^h=^#4 zy{5`bl_5MV0B(+BUE!I&7puitgp9u(ZoS}>qanf;7^SskP4n4ON3Mu2$sDS9J5mS|Dx*M zADImJ|Nm=8bBLKUVPnpRM$X4M&na`r`7o!5gb+y?Hb!zz5*iVSax6(ThjK259771v ziHcIuzPs=H{rTbhPwd+DydJN|Log+jA|bpgMpLc=v*$xn05yz^|gyEux52a zdx`Is%1WNqD}};K8?5`|lj97%U55@47drdNO;eG1VulfamDEY5TTQHp%1ZqA(%`q2kO24RY}p^I-Mb^Ot1qLg8T{nQ{1xW*{q(haz)qOC^%F}1 zUT>EKA3dImaBvz%y7JS(d`<7$riYmWHy*p~DN zzT7c2LUOjbzie$S{NHpg|MTVw6itTNks!UbcB0NSJx~-EsI9h7{2#8|l69cZ)4`Zu z_)=u1!F-#wJ1ygS=X>$HJL`87ezS5b-%AF)PaVG{GOEy{Zgy%cO-jLBSc}ZKNkx6o z%?O2c_{#_b{*d3YtW6owXg!UdNI%*QkJVzY67UH{Bw&y5?8lgc4MT_EH>9)g5NakD zPIolUO;!r-)mi(5Io}eUy6f6*hxggw?jV5!Ni-e?@}uhm(V5_`xce6t!~K||v)zI} zn=%cr`NVkeHSe348C25hX`uP>^z&>6v7ZC{ZkkTN{Q2GXw)ygOcNAYTOzlVjKoT9fxJ)fw9Sv7Ym>f95~e%jmn9Z=BDimrE~lykF4$dH%|* zVNlYsy5-zdt*kzu^-Q;eRgvxJC+z7aa2Qrv@l|m+;{CE<> zo=g1dtR);D>gCm1ULH3-&9N+#nvfBCQD(uos|2)tm{w|haKeOXw|n0#GeA^Y)r@p+ zO)~%IuTR_Qesh0}rT#tSd$z6D!~D9<6nzcwAVGX%-`aw2Wt$)q0yzyBwNVTtf6oPU zKlSx#9A9$70A$L9!{OL=doj`I zgc72e2gHtbvCV z0T*Zh$aICh1TVM&MF40J9soE@AQ~nB2bn+S72@nNOZLcV!v+u?1w6*>>KFnWWVSBS zeN+$Z1OV4UBU*468UPeu5eAWjoL7aO+=hRpbLKJFz@eCFi0JE6SME1`t&TGLyb%C2 z{i72_D|e25`6@oDmd>yoM(q6Sd>Q_SH~sPs=XkWlOw-qoJZRXCAJd-M-OK{ z&dbP&xv?#Ex`4x{TAOLrBjeD5l{ojM^oLAJAv&-{mg=lG?u4;#kw})pJZ?qz7D|Y> zoS`}Ew#JyrqfQ$+aVUJ3WAeyA&PgAt0#+yzw&0NQ!?Q!4RO}>k*Lf$g(0DJ#fV~L) z{D*<0CE`MXiP#$xNtd%pPDiHHEZchQI#-o?0+jV|x-nIc0g?)~Mn$hO>Xo_gQjV(D zuIl%IWAkjlKPj9R!+JKxfeWH0+^sUzXDw`|>QQv;lm;N5CO{5w#=`IbU8|ut5>>?} zl4{u#*n;b|24gYzNhhFvh5@}&J~GEUA$oaiHiLn{t3cq5G{!R!FYjXH!z~*vb>xve zbAa3LO|&iZQS8Aq4t2NC$nCrAuOg1$yXNd04qw{-mPVam7MV)Fba={FzT39_xyVw| z^h=hd(L3%Femz8)y|eSJdTMLzgU%=3zA-XWciw&>`=ikL@T=svNN3p8N#_ZU_k|}- zP+aeS7;LpUZ#&y#irg+vxg`r+{dmfBrP(y3+OiT$> z!lU++q16O7mKBDQ^DxsZ3g(hmYkfT1JsalHA>$LU&T|5 z84qT0jYq}0fWkwc^Ktkatr!o2`|n+<#z{A~?|PiE#U@hCe-J1krTl;pfz+>85C%JXY*gK|Fn0)1X$+QK^cv@iQgB zDYTZjttyyS^-zkh$mz;Xu+TZ;tyb(`e)kW>XFpA!9h94&h&2tJDax}1bu6f!eTwck!XB*unpiH?ur{N-aT7mKJgHbvSO z7g=dWpHuw6_j4-tSsd_BlVrsOEJ*=y(xrMidz2us*?)Pb-{1Ch(h~T{Sw$WN8kwo8 z^%BmA->y~K%Sb*5>CbaZ;HWbYk7M@m&|I}bs4s(WJv1v6)DIC13x60MDHu}e8mZQj z)tBdzB6wEhTqvjJm2APY9_RJ1O>;btcl`S!!r7JDF|GGQ!)bC1(d_2T<3cuUaY#FU zrnOk-!_1jNc*M+cDZhtAdrcXyIM$c$v&O;{Gk3}@sYu;fyR}e~*h(CHIS&v3xF4B= zmRSYYyv@C6_FSq@AfM3b^Q^2d+WLetr9k;E7cR4o=%$LTA!H9NoY4l%*-5u1{eHK^ ze5pTwogb)Dz}&GOYRRtlH*dbwzB=1UAlFQ;sxbU@*i2QSW3m zgHdKq%SE+!@F&P0X@?b1 z06Q7cUl{)N+vVe(w|~uC{uWy(mVSGCHv$q>z$4)1=276R7dk#sdVRX)_~XL(pSkPB z`N5}Z?;=?Lh5vEnRYy)y`AU-d&y$bn-aWjlx2F~HK(9no_o|^sZLnqZh zU5PLB2JdmdR(h%$ZB^(Vx4!mtUWDTpK3!57EM=EU4z7@E=uyq~_4@pxFZ1P@hMOCo zN&~dnh>RW}v!DLC|HSdj10gTNKELczNPI7>nW#Ke{Z0EZU)rTS@dw9UnY?d|*<4)G z{syJ}bb5+AOMT+Rme9U>o>}%p>cSuLO|MIuiD)LfOWe<*+xj{ldKa(rnW$|zkGJYW z)a&^suHE%?nRLz*XuF%wSC{ej>65p{{wK+S#ZMbAHnNqmbo-RZ2w>iB{4*CaY%C8l z7e0D6!ckW`^afo^)XLmu{Jz!(7iLyl0`5xmPHrZpGJp|G#?$E^d6ltSe<^NBi%K~w5T3Yi<7Fh zpRbEBsazeAjC~am{(A1{7{q6cZEdJJ);=D=(SNRwwYg|lxLfU6Su6#miapIWx z2pK|t@ax0&*zAEV@J{{;Y9a26W{`9Kv;&hD9 zOnmvw#l@Me9IX4-QU4Pgp|3WgPJC$j`XTidftK^>&MQm-_gv%hT*l|wN7Pxa>AmGE;;X?DP50}fO+7=hz`z(F9G-+F6CKdTz@fhY*SG&$ z|30%)fiuspM@vY}<1ouaZW!r>e9vdG0G_`)5QdS|#ttTZXj^=hPb5GHK}RLv`M5pH z$Yi#!3@aDVyjvxA$+*a{8b-96w-4ZJBSWyJEW;dk0Pk4XH^CTQu?you!>NK1yh57G zze>M}2qafF{DUXpKkq> z;_#yf@1Bz(oDy~&O)I@{ha&R z_2ZG3vton7M$0tkFZ6^}^Qge3tt(;V9Pu<;Xr4|i7@*h#uiSA1A+;t){kYE2h_UOK z1=&diGU7XHF@?9s%*=XA$M#(utgp_b^j?UeO9tU z=Dr^K1^_|P^nCb5_sZJ>DduHFPRdn(ybD|k`4kPfD&^EbAc(tu_VSpg6= zQ2I8E3$chE(U>{I{4uKYq2b3XgI}M2yf)sRSF+(RArawV4JRl5SLJV7tn1845TJf1 zpwZSYt;}f}-s}XnHsTKBarm#;FC;>}Z2nSPgdcdBXo9bhA{eKcZ zHazfg_8GiNVSOs^+6i6!#4rygx@WU!J^wEO~i3Z8BNRcpzIH3QyKRIZwP z*rYoz+#<*J0AysBNdY2?8X-ZOCOmP8!Ax)pv)bHZ=g#nEO7QI>{==G*#zdAueE@^( zOr%SZVjoP?yVljV&*NgpV1a~Q(fOTposmlJ_<>#t3EB7@U3Mi7VhX!ET?CG?gv#PT z3Y4njP!!NSkL2{n4T9f$VQh;A%;kKK0N!U-`7}|_ltr;;JjT-42yB2N&V+S5*sH>Y zf`AY^Q2ZDHYrqR)vqKA}{gt$(EQ7>18Q?nfAX~t<8}kErFgMxs=+V$T3oUi+q+Mxr zgq9f)v?C0TdWF1_(1%rZ%yxSM;j&Bx*xenkfU~4_lL)q*u`R_NBQ>h=%)w#bKi{u2 zc9F9d}rT;D8?ZDUAW%GdTOmxPVkwkF@We1?g-- z&N9?}*;i-pq5`#?OS`jcNwW&C6X$gU-~EO&38`X*1XvY99--L00lSNI|tL*eDRdLBc& zYZvHQ?)lKAM(4<|eaz5g#h=|;{E>R1%$s{v+%4ngs0QveP@5=8 z8>8q{K719Hr;f|pzkP11^Jjb0)y6aSiNpVc27yOT{wdlx6CUnOI~We{&6V(zgTIby znGglhK+ZtG@~T!2Jznp?LcpsRKx_>s`QtyWj!)enXj4H(o(J{FY6N>?zmk4_eGo*m z$%X?;bS~UafeI2$tV=N&bM-?{{~c)}v)L_!d%qUHMD~dSO)#D^BwP9zLPRg7Gk*+# zl<~q~<`a$A@a{c+2Tdlj4F#zlHC&bMnC~#53qn7}8lsy`I4VK*2s$7-M)tcJ zl?K@XI28(6U#ao{WGM7SkWcdkU`Qz{>W1Tg_b z^*=3a=synNHrPr1s}+?&G)Q4@86#Bkl!so$t+K;rDcO(c+4n^tWdQvf0gXH*lSe@y znpg_bb2K^ZGMDypQ!e}aRiD3qW*FQLn|@3TR%EZpnTXh2%GDMqM4N)G2a10ZtIph} zG|bB=+_pqkA=9CpQm9JS6o><*AlF8j1b>FusSBucH=m#vUJ_X5wXc~j*rg>cgp~mp z<@4in@mC3g$+Cr0BNyFLZL%bv;Db%YF!KI`e_0@ zfXvCB7qoIDxx>T`pJKU?%B?Q((p{b5k6(S6`1C^m-?zNnuH*}s ztN0u1oE*W7?66oC613TbM=>Xaw3DkN0{?AVr%q&vrOO$98+3>&;45D;02va|N0c%T z%c_=|v^GvVTtYoDfl_5Pn+HQ4y*d1ROa}*sh2I;fJkDZ zVZu4`EPrgFE`~_4?}(8t$t;`Atk}=wj`tU_TT5Q$4s5WDP-N>8n zsQ!{{xIYZl6n8Q&6u-$oNiYd{!=h6WFmzxBlJh+umtGw^3W+YvYTJg{oVejJ5DsqssDH9+~qO_0JE48a=8b zWMhFGsCB^_o)Sc$vC@Z??6@Y9oMS;oY%oBwMxRFJ@>>_irmK61U3_DeT&**$L!j;! zBwvTfM-iM^b(f~XQVpH|bG)Ggof&K>G@C3vO##OyfCi`l@IU=4N%t5)E^;GsfdLpj z77DZW1?GyQM6RFHy>2{*`l^B2(Ga?D7j@A?fYl~ib;)*PNlk-JsN|ohJAXbh6Z<|0 zWr8kQDk=fUh#R%MhRczDRX1? z+(6wGx!LA%^WlY?58Fx%Zaa!<`Y<$ZlK-Fh)GzI3po<;x-!tGX3y9u*rGDmHIae0*H-d5%?TsMry?^{KO`ObN#fNC;6H^DD)tvUA1jLq0O-L@h}v@>1^qHm@mXdLqBS1hF3F_S z07Eq-y*if8^bsV;^da6tE7;oAU%ET!1U&ex4Jz9cbrN1EogXaS&3aZ`gMVXPYJoJP z*nG%PqdX|sJS2QNH04f6@l;62OOZys(9%<(G(j_mFvNWZq>q?geJbovZi$^u)&5(#EXEsF&$yOilQ$r_acIJ2S3@RZfZ6 z&_iwNq2}-KCN8Iw0azge4Bi1rAwf5yz*RHMv+J@^g5wb)-;liikxa!%(dJ0Lj2o># zs`-#`WimVwh$HBplW{}642u@7jkYjpHgYfK`VfWe&rtbwu0*(Ey1r5VW{YCDQjxYK zK$NuqkViL()k9n%#7mlFjt_+k5Tk6QT zMqG%#0|%Q@D!Afgabaleu6u*HB3pcIg3sTi$dIGd_yiy?VT!#%?n%qpzYn9tq>6+T zVzm|ShA5PVV9T`?=|b2oPi)x-tWCiM--JikJWwZzAhjw`0str@y$jK-avN}gf*P7> zi~oM{0bBc%*7&FsXA2oCRQo!5hvHnZzav1>ma`@l!2(d>GFFxtu z#Qcy0eoU)LN3-B*@<9k{TwP^KJ)-BH%6>?zD5y)W8|Fn~=fn9cBRK&8e2+yM(^2wu zDNkooxDs>}f2JbMQeEzqNzvnhG4PES(Ygce;!o0~)zUOOI`=x_%h43L38nQ@dHc;L zz)=SHsIWt*hGU0@y)!i@4CzkLbUl98Yf^*%F7HjgbgUz1$`~S%gq*tgbneMh<>rj@ z`*N`fI?`oY387{Vo`C2#cr;LTW%g3w+nziEjpcjR)a>;P&%LH|R%ZC&kS@d2pwB#8 zqH0#ZTG*gBChJ6@LH#Dvx>BZ2P;ifZAy=922OWBtZ~{Og$P?YHiA#Q^K<+ND zu63c*g~Iy>`NY~HLxp~23|MXl9%fE<_PFM@#qTFl9C(-4R%I?Dd$u`I97V5BLBuYB~3D6h{s zB#3_*c?AtBXGwhXP+(#rUsOV(y`=;a5ru}`4a?r2syx*l?EF5+TZB>AbNdc>2}Z47Rru{vdlp zumUcy$VagF5LIF?aDn4^xj7$djFVo@01W2uTw0tx45#S@T?q?Tal9*y0a}g#7HEJE z4jJP+dU@=vX#VVSBd>f@oV#o7Qh!?0pAatBFj`C)e5K(!yfI=oG+)-U=x0Ow&}r$E zhAOQmzr@8_J3};oES&0ruuKtQFCpRg9kfaw*{x2XKo=)JXOdx_`+%V|EqMPw*%X z7K^uNK3{E+aLS86#x0&?Tj*kha^P(DG~xq~No@1ZKLZ`@G1;Q@Z#jjZ_ZixV^!@bk zzH3bQg(CG1GG}IbI1(HM(0AZPV^imrk%`Ok)j~^@XP@fh;b5F^F5U7zY2n7F#BS}a zMx{%@SW=(ROkG%;II$uW75S ze(w0Af7?K0;FGscezJ89>XR9&Z^>h@TXf!AM2HsaGrCCEtUAhKdMT5<6Mg+HoEI^5 zA9b1IndIiPq>Q4_rqtxn+%^4FZnHFil-8>B{q^j^G3k}RscJa^s+$4GkLqix`#9xy z+aTjz^X+ih$R#I2_Z#tU_DG~OBfhN(Vmby>;x!g^1a*C*_Vm0JXMUp{|0ey778Hs+ zg#fZbk=caKp92|}OTO*u)uq|f1l^ni=bR5EIjv9ryhdEr4g3+{%)BJQ%n8Vt`E^B~Qf)wIE*MuMe_>~^2I#!2_vSJ|8B?H)z zjI0&Q9C5?TP!Xp!LV=9_hAz6`DuCt4WlyNgBUXA?WOx3)~_}}v`QAD4ZVUrGpm>;5e^qJ8o?FZq}Waxbo4Z{2^5;3^OWD5 zhFh6mxAc8A;`ZR(9ji0uaFN8eu=)0gce2Bxzs@c_y~Kn|c<)E8zPKuBRpI^n+{S2m zS@O^#smenoa!#}wTbF~6|ewPopx36_Ry5(ma zaq#z$$%ey&*sx7_2#-0g`&|y5(0$*Oj59?jIp>+M9qYp>avoo6GUG9Zs+sdzVVlkQ z9L&`$1l)p}Erk3iYL+4))yXg}BqqWi;o!2_W5a_f49Fu;NNx zF8=_jQp$!XKdSjQXy7X5tioCY+dtuZP?%H!l@{Zq2^5> z>9h`l)?;k6f;mTUjB}?e%eU%3qgMk!x|MySYF!r#6^{97n6Q!|_blOkvi@}t=%u@S zu?;X#2^5=TT}}k(Ojmg*XaOKYN{*1Fsso>-`~JCFkHmB3VtLV;z%(rd4kBcBy8%Nb zWQ3sWSW4^H+enIh=rRmw!UK{>6R3K0sy~2+s4=Ketriex$qJXzK&mN)lzJ-91nNjc z9IROx|6OrNK6sz~f0EKzi8&IRv2f4+=!474rx(A=v%=DCwwV7Hj9RNs6&gVUb{)_E ziEo=TVgmSUbSxBI$FuBo-Q=K*R4OCI5ld&i+JfLiDbVZytn~e{F*ep=3mK?0gXz4_ zJVJXN05E1n`rR#s5Uk5YLa*{E6O6uri8NRAoasL4_|c@wKwgpvXJ<{SHWMIm%FUKT zMOr{M@=)+GmjM}QlpGc7gt_8PkOrYMVDjd07TPOs%|1}@)J{fug>fWtQ&n#k6pn-d za)!F9E{f*Y+;)-t`H$^RX-(dEUFIeTBWAhCN>lzDCL-wr8e{<4@&0eqUHiA}%K$wA zB7>?y>h9a{D7w?My9e{W`JC}s9of(VMZrNy8@!1-WF<>iTdKilIIAJVv)PoI(|rb` zTr!1)f&eIhDdg(|J3w~;fY{Ad!~h9Fi5b+A2|D8BCI>68B<;>oEXG<=Eo>&7Q2ZI( zhXXcw41kN+onbv}{^JjFBwH`)ww(Q@Y2_9=Saphd*MS=5QX^U&V>ogd80(!9c0%ws z*FBpOdybF)7)J^I_SIzq z{~1}-mLl{bAe`dB|37Y6DnHE)L;+p}tp1A!B5B>$@2|}r@CXDz5xtxt((V|JhruJBsT`)C89wKt z){^A#X^Y$?-9rM%XveMq!AG+%j-5Ku#iD*GEb3R(!(_-M&nR!r9i#91Zm$YXHl*QY z1;$cmO`Wn`gHG`ZG!^H9fFLR@0BqX|6`CG4`lZ66b4df@P_>)K^H9&Tf*S%sfX5)b zKG7=zV^0}9klYD6xXua3>!#?uDth)=tr+yh6;!933 zV((}H##&8>xB~a;N+xf?+j-s znf5BaXHn_e3oASs96JEyW*=iiTENdPP~vvURlApoviYNKMCXFMA~P;7tQ*C5&Mbb7 z@4vXT$9xw5?APLUGF#Fz%s8P(XlWvumkiyG zR%TocB_TOPx}laB6c)gMA3ku~NxpUShQqr*GyVVS-k;PPyw-gCehGx9i+Dki?01m2 z>hr;y9jb!`pe^Cdzt`-O(uI>TeW5UjM$-wPtLmD?Tafk+uz6c(YuM-kjsbCDz=H5A znb(ECqmf{aqsvq^becb+g+Rx1_TgoQBxS$fLY4rK1gHQy^|MGf%AotV(zEx@G%Qoc z$S@B?1)%aJ6lxt52arKsPd|p^9}^go{5=?~siUK;2bk=OPf>M7$OQES43!}Dp(@KX zg?X-8@kR zU>{<)N;6zQRNE*}>(UT9AgNFV6Rf$}0zx?maU>5gq*3uDCICxHg*(EMQc;&d3G*i4 z>R#QXD`@BoN9+ry-TVYcl~Gfi22MSP^y2Ei%D5+uZJBI{Bx{2K&o&EhC}8Q0`1>BA zIt#Wf0djO9?4fBkbrcQ;1^L(9S-D-0^73@`%P{_e7zG@ase{YHrO0m5&MwgSAenOS z5$A%sEn~Z{)=}}H&_57B3`k3Wrg4OVz7+^Lwpr#f`jgiBFYoq4GKEZUABVPr*@-QR zn`Nm61CIyWE=kE4Hwgj>APype=0eMKp(&8b{&W`ICq!C6!0X5mWMK}m7hLo*xhU(B z%V2Tr;B}4M1l>m$!;wM*ApS8BXH&}J$G02Bi{k>0qa`c)JkO=Y6mErWHSW; z@)l_Lop!3uU8-AvI?a3Lvr)`$q%-!K0jgj82tOtDhFU;-oNFy&PBLhVv zgViHLZ6m{dBO`A{M%PAO?T);Lj*jt=u! z&_HJ=x(e3prd>vtcI_`??W%ExQN83hUQeelvbK~=F}%7Sf+DdyvV1VQRehqn@I>{_ zi>a9IHLqv61StPLJHQyd2pxIZ_3ESf>)oy=U((9HwwnDAd;W{-`974q8;B4g8UIQ% zJ~Zg}v$HywH2(L)m|6m{7`yR9*#dgJQ= z`6Hbr5oTpIbLHzENf$=$|D7A+ny-+VuhN{qZ82Yca=s>b{!ZL{Ep@)`+Wg&``TF+x zdoSi2rsf;h=kM>$ORkJoM->fu(VCC6H?`Zf9nQB0dr7NxURyzQz>IFH*p)}Tee&Y% zVZz(%1#cZ%-(n8lb}7spFKD0k4`%<&~ikuV=;+!jfFG09S z-(;4-u2)Tc8Z*%%<)ZD|7OIH9k??035Vi1u^H_jA;(z<(e-R63Cx!@OE67}?cO4Od+; zLe}Pg`dmZq0r)GVoX`RLC(~h#t7l%cg~k!WYh0D#B=nLkMs-z<e$nUNGo$hr2A4Tqu3@TlSGwZ$ulv zhn1|7CAY^r-uGMg)=XZm*`3I;&5=6s)zD#jjVKtL0|dWU2p-p8cXVC1lkmJ79z2+| zezJJov0Jsbs0i`i_MIvzhqJG$k zjijaZr&D_A%fn@54jRN&l4h7k9vOukJB1L%rw|FyZD}fE z4D7oDNNmuQkmP$45KBPNA5$E%L#9Ci$yvw~+u%#ZTh;3!cLB?<6xp<;6YCIwxE2$b+v>L2M` zn}7_N@^+l8y$pGXso|pq4zIti^`#ZSfqTDe8n-AM%ayuF;ok<&A70sd;2KeCxQKuO zGr@~sJv!8r4o{>bO6k%)bjIcG_h}3fu;cQS&&t;uF=}Y26B@o60q8jP_|h^eWeuJx z0rFw+1W2QLsxS$Ru9NIAO>qdOy&Lt(U!sf(-u%Vl5-*KIN;3bz-XxI=vfd(}FcJh>|%p z{oqU6a6kdNR)G3v2fRj;VutHudb>Fe$ z-uB<0(eW~VH$)YF!hpRm+qBZUEL2q0gnZ69b3&2%4f%Jt;K_r=@61F0e6l={C!f_) zS6ehGzr96WLV#&xF&ssF09;l1m3<7tK}frbi%utqhIIL9`XKWEft8kH#EC8EdlXN& z&>Rtx>GIAJ+aD#}V&7XVn_XIltD?_(9cR`%0Md^@X`iSBi|L_dp0BZ7s%P1+$7&77 zQpa|v2^7gXDmR_XL;TF)PLachu@oEWbii+w#(7zK)D`gx4m><}Z$x_B++x>4`=_0y zzspH~!JMY(xnr8rdp5V|=a@=+XGScN{$j+J5Ryhj#}5yz{k~Fl_O9Ym#}&flO32nO zG*70*?1hsNAL1IE)W3eeZ&7{H_0kgwD0P5sp9#6}Km zZ&JEHpbGa_k&I*N%~reu=k5+r5UCV0AdF6@x}O1;08#$&)J>L;9@>qDNSsRmXz_lv zV65~vZK_3ZjrpFl{-qDU%0tEyEVQ99fm#v?p}7r)`z*f*Iod4YOMQaI!zLrRd-CY} zr`(w#+gj8|X+jy)m-RrDKIos<8DI=5jO#6ML%0m2xD|r4$bSrdKKjai^L3u}SV!FK zb31ou+x)}tryu4`nJ0ppfMHAc+%J)&`d?XNjH22oaE|mrY%xbp9P#Ogzk|;`%b9^i zH3uUhv4hDv!`cR~XAZ`MM%~ZqO+?yF3LU<2JDdtRoQ^-7$vB+7emGZqIREJIZU5nd z+ohz6ECXan*J}&Q3t6Y&nIX@FmNM+tW)9aSryJTrvx~=*FK0bFL~I$)(bkhTX8!Gt z4BcMh_{bwMCimv^yMN!Aqh$)ue^dAms>RRth(B^gNYOqIP6JL-tf*1+r%S0&oiwqX zTe$$j(t+a)iU9y*%bY&aL=Ol9WkoU3PzK(tGV6h$OKddwWjb2GszCYlckED+qFc+E zt?x1;CF;Q&OkLa$*;i$H@!vmh{g4}@n`WQ{JX_@_s%@^TM||8>cvI(8>(m&wr#Ri< z`RLr2k9$h9O#%G{D&aqs=Wi=XuPke(kKoh*L3{KV7a}`LOu0n&y)>t(v|0&}$$J~x z!=)BwEqprF^tM+l*BzJYKom{32oyz=BJdwMmMNrtzs?G7iYLlql>d*1r8kyO-}$o8 z8UN$!5q#tJa!&@|v9kv{-`9p%MC#WA-QCTJ+GDVa7NIO9?AEMFhdIDb5tBDr-~xDF z6sX!r7fG|2q#v^DQBZW?@eBmpR4W^alg~7e-UK&I>LT)T`w<^4+f1wNqbavRfJ zz%v1pE)v#($q-N6$IviYvly!EVKms9jL5ULXx_z02xhYH;4L<9wE0>bXTeUUS_4)E zIhN=(_~njo+D-xj-e5930sSTg&@S2O<%w;;NyW$nJeIlsmSR;`sGm45m*lv+9|+7I}?)>(O{wtUF zxwb~S>({(4>uxAo`SL@bxfg)cjDo&SZQQ>3)oH8t-ZQ;V%*H4G^ga*Ps1|{}&Cyg* zT4uBU_LF$zMWxOHAw(?`JVi`D2mdJRB))7 zDPI**M#jM3f}h?i?$phpf3VUXN+@8fL&MW;2akj!0O28=jEY@867$^*7BrG9(SR0g zt$U$zPEGkmFS}S2UHdx1CUfV#tB?UBP1}yd#}u%Ja0T!pc=`a$Y41R>FLjn$ooX_1 z1E~OXCncZZm=o(_jrrhirA4CW3zv`qQ*ydxA|A*&@R8!l%oB6LbH*Z|Qt#^qvJTYp z((DGsf4k?~P4fbFQCPU*&K2gR<|_}oWK?5r412!99`U(oE%K#b1sci*q~p7nb@(`4 zfn_#9G*XTC+(@^@WXXWte{_6x&QcV}@R^O{&a3vP^a}CPgK4mX^gK=?8T%e8mx4+G zn~HzKZY#@~w=xx|z%9>^N;YNl9>wYYQ|$eZ%jk9nnD;rQ>O!Z4xY`Y__Z2?TJ= ze-TAnJOQIYX9w})r3QDI2!eSkG6h*p`f4l24$b4FnEUfD@#2pYP?I-uf@+oLLM*}( zC(EkL>wtZ3N2Q4@|7=P*R!z|fgk!UySF;s!)Z6D~ITrx!Qm%%X4j^EvF^9qqC~lfg z)=#&$2&60oT=80#5_**Y*Qf%K!%5O&^N4QfC^`*MMb6XgBg4UHs=w!t(%BI>P~4q; zYGnUe+a8GHV*{B(F*VgKue#-911%(Z$Q~fMww75~pXP0u%g5t^lc8byRt26wgBBPa z+KYDG8P8|6z+PY@PMy3spA{>Bd3yMTV9Mz|nL`1b@|6E2%uR1OJ?fkmmw42aws7`i z1{Q8gyw6lT#}0Dg1)lACT0Faw2L+Lh5RZ9c-?FvHxRVj;qG=-XjCAD#5_Y%!LGq`! z1^2&lKL4}+|Izf`@l^l+|Nrxx^E}IZn%T}dW;RL6=p2r{Gm=z?BxG+9=Nx+h98LWrl7(i?gG2PY3w%&$K`1~MVul~6Z=+lvZG(8R{XxL z7e9}Ppyjd3{43txD9d>&C%pcNQo=8G__x7Q8S{eSu5>1`Hi;WeG&ZSkB_QfyK$`~1 zq%mtHFRfUX8wbE3`}}6V!vgL#do}c=+b5Dhtju{Zf2gHB9dan_dginj+{-x`+?DD-9SSuASh=W~_Qf*b% z@=sEEFe8)R-umPuiZ{5Gz~78%hiQD_07L*i*Si+I24C_7f66}najz@vW!eW0`~K2L zhaP=x3bG5if`^vGH>26aP9P^%0$;SIbwjgx`%0ArkCO=oc{(Y0ADpZZEbs&HE%fp4aplK99X;zeIOmBN>|??H$Nam`A76V_8Fxe3DB&C2h?}pR3Hrk< z>filNm%b>(@%!Ex69~uJ(|rH$o*CSQ`sIrh(xn`Eni4iYBGLpdD(2iWU`E!E(fQk+&+Xt)Q%}9oLD)^-E z{PG@r-V^-t6)xHp0;Uy$whNOXV-HW@g$QV2Z~VTSZ#$^ zGhV#CLi`b4qQ6376fgOzLh>D6YPCY@`ct8MWGOI_e{fi#l!+x88GWy?Y$aht08Uv) z6BUxoI1{BrkU8RMsWBnb1+%79S`IULW6CXEY05=OsEBJ8)(%`XWZB_f$huc>9^@0v zlZJb8xR6=<;eY~o)wY!m@32>^1l7A33LB7O2^rr<<(LxVs`Z2xp#6ai0h>H7$+KFw z?J?YM<^18Q>%tauo_^$sLr2aYSe#XAUsN7t=n_B$mp;)cGb`MpRDYHJsLXmW7k4>P zQMT9Y7Yyr4Rr|z$znYHhh6$|E5Lw`UGF5nsj`qqV@>i2?lJ`ekkzA)*S$kDoN!sT` zmGKz2WEUHX$Qp;mR7m;EG7uv6NUT#qi4yDJdaMiHXT$(lsNo(d za{yD&XMQ{XmdQEg;;U}8WXonRE2A3xy%&x-WE7DmR6bfWA#>(O&6y)S10r-rXvH+q4`Ga}ZvO%(Abjf6NWuITD=>;_feHd_Fr$niq ze)?Zc+^E8(N8I-z8XM{=ZBC96lD81)F^!lqJ4H6d^_e;)u~D`xHp`aJ!O2*k%o@(f zus&^3O5OUH0oW@(3%Trlz3;feNsBl|2fDY_UD{d}XeE^NU00B7A!woEYyv2n#W-0M z(1EyuERHqvawk)Zmm_Up{3nG37jnj8HNFGR3q3*I_8}KnTDbP|bkNZ2wHOKC{6JiR z<;Oq{1*<>3`&CZt2PAFIIXg8?5$k=dn2JF3{-RF>)-Yx?-%CLZz**#L^<}_y#p!y^ zM|(V&dvnTsdM)tF{;De=)|@6+3ktqcsM5Jvm4m&HL3xOzaQ^yW{_W)%q_9z`sb3?? zXgvAUyopJ8|M{d8R=$A{dP7gMX*xCf{^Wiqq zck%W|xj!^QOcBXeRtdMrsqfJvopeh9}6wb{X8U0TTl15N+n^e zi6X6l*c$2Ez2vr0AxkGVgN#}5Pqwo}xr>nWp!aj(C#9B~N$l&dXE#x07-tmz(!Z(j zEbW3<8~MURVc^^6$0+~vCxii_MbT&$Alutx^vYXM<$Q>WQMCVQO&0-J?;X?61D`5; zc>Jrd#z^f|U&3ltf8+4zdPDH=SXNR^NgrE9o&XL~abVP(Q*^Lt)Cn;w27tr>cxq3e zN$*oJzZYsvHnpIM+p2EZXgYhF%(o02c=~w&s|GZ}7U0B1 zwT-~YFRxQn-@7ouWhSa$DHHD+`}a#2p>Ot8+G?np#h>FQ_QXD(M+XSAWu5cEv_Zzbicmsec)`W(6_B{7#e+zycVMx1O3) z4C2;i%waPUSLeh65v3A?jw*sBZD?%imS?iN7S1b&@#1 z{8tDfWk6nV-;(zhDryTOL&hF@?VY3n%=e0yk`(IU(%KGNZjIOWivjMzoK>Q~Yg1SR zkn6by_o0a@wm6#1hK!#8&^`e!HaFe#m*mq72tp7CxD5>hrUZjAv&b*rE7vwB?@=-0^F7 z&V5OL*kYBWX&Gl$SDiGu2XEY;(G<{MSKQZLyeNK4jLqyU1BeO(nn0ghL!L`#*+~;z zDDr@M6TYvB?=5Q-AaXXscb}$Pv}ysRH1IA-&dCT#F=|d@s=U@x|E;CL8D>G$x~F-P zz-zTY00rYt{idI6v3;X_W+#4a$J~FX*W>_T9p;A?-F^x9dBiKU0}cW@@GWcZ`oMgD^P9Q&X5WV zvL@4h`vSc6NhX;t-ddsK+;6#alg7))d>EoqBUz;zZKUgd$3Nw9ao=<9IimzEK-OJU zF}z1oqP-w#q^WtdhW!4vcHhEsIGib-v~1PFej&mf6G_OsL|i7(LHhf#L*E_IJLU!7 zEUxvj9yQiT-Ss;zSvG);=xZWdKTkV8aAKl3iBAMP5tQQkb8h%=sr!vNnRRUq4x%WI z?EdDHc{GsuCrnyE+hbq5N9;4oZ?3O|BzZxm;Ge?Rw6f`Yvrovw=EGJG=bn?%(EUc> zVgnTzc2*!$3A@~)rFYNEfIfF_Spf8p74Oo|!M;>Lu&(w6{JW-quLw94LYCIl*vB2+ zYu;Ga>u>s?`}wz<1To}zv_GU%<^PaxdtP{gK73PRU^ zzy~?qS}Fg-X;RUE%ky8G zorkXI>{XqOFezv)=CvuQBMXsfBj(IXS|^--1GZ{D#XQ^`!u;#pSC@K`ReF$ei$+9p zjbH`qE3XY8geiai?lyBC`TphC__trzN{_&A-za+1lg`neb?CvJqp>c7u42@3t1TP9 zW7<}jL~bJUo*wM}@uc>I2QC^!1>I~beNsyn8Cybr*V=bC=r~HB85585&B1XEQEVIa zET)N=_E_63JuAk8&K5F92TkK{A9tYpTtB%-S|1(Rd-&$>UTJ65i)K$xc1tVdoEmyy zA=~}nBlG9Mv`k~YXIHzQErCQc`=P5yPO4G1jgdxo-_Q;Hk=JozW8H{_?lYgdM}BsX z>3tIRa~r?$XPnhNA#LzN;o%E)gULe=CyyFTnLV7cGkAIY;mb1yug*VYy$UjT9rf^a zg28m^!|7ZDqn;%Tf0!-{L|8jmM9Z*>{yuwRFf(TGb`y8spQ-YmEYi@4r!dF0^Pjwz zZM1zg_(XT?wZWpoBh?Vjcc1%iT}hI;+ZD$1&r0ZDru3u5^N&`opr!XDMSYmSAe^qG zn3zMR_mbcR=ghO6EPSbQriK=R`&aB{#?Jm*eQ&t&;3Z|# zQ+e^G1-f~jCYk#*y{9_z&YI;)la36B;k+y^D>&3Tb>^S5x~lHcuX6a9x6QRfA*)lJ zm(SbXI7&ka9Vzf}s4~lwckU|ib*!_iFuii*iV~?r_|O!th(uJdg1c+ag;Xpccw)h5 z-y&0DUK(87jc_9HwtWdu=^xROQ zg7@25A!?~Q2(u}Ng*YUqG=hrJdJIZ6$5{-a^FnbuCI4Q?hgX03zXra4OhfN8ER7CX z8pu;P{-`^YeYJoEe*uX?Y^d02${=w(SBS2zs9O-WwjhXk!crtsiQ{IRL@LLyw_!q6 z*xt`=t9v(YBqXp{FfMy0468EEL{!a=;n%7WR1S6?o|tn|jK3El8QuyAr5dK005Dhl zS_-d)Ac`v5K_v00EE@+OMxM%Y=+C5-PV|e13_A=+#;i{aNJlibRm%7S%M}NwII($F zR6*N8`HIrbXNnDtFNT!chL1g0?eq^FQaksDe^^sm;PUW+32VoZgERhH%+~;(j0M`v^o4` zYSNCx?L6gRq55*l(ZR;~rSpk^moJZdWIMk);oJ0*_3C8Ei1X`HF<)N3K11VnnP%%4 zUQM6PvvHX@ho{SCWl8NCSMnE3=bX4&`p}#f(D`r!@7MIuOTev=nkIy_toK0$3KdmU zM07^{eB-BljDmq)1Pq>zlNpi`k@JT>zNe}lIrKhV*8xumdG;`EAyfu_wcNY(F{?bAT&#$(?1cw<=_ z=5JQzjYpM_@otZPeNf1k20r9PrG?9L;4nh4i}Q>h4(fy-PoznMXkaTnh=6s+0bJ%s z(Is{XJ11@!%PSgUM3`83@F`e2gkONhza(8X5^827tNLd#aOE&=#RYs;v=L0l zL1*8O%;&J+)%6FC{#5LpM(V*k z81_;yGnML)1>oqYcTBV>YAcJqC^aeBCBu*P2!+kl_O;8vjXUV*K36-w+-WU2TaaNc zAxlb{HUa)D3W6W0faL^3*C>x+s=drVph(r~ng=zei4ei4--v_%G7nyc&>4MI=cWS! zHtZ#eT_mNlSCHTdx}2obfSy~Xq2k(GZa<7!ONTG(uknNCM%y!|Lom zY-bT=^g$9a};|@saWVHo7znG!LnF2wZ>7UaD4M^9+gj z1aL-SCyNCk9<6hlFRoX|%L$sIeOzynUE^l*d&cT)aL*2-K;vvs^_!`85r zqh2Z;l_We*aUyzvq#k9Ql0$}@;L%62tH*o9T-tJ+367yOEpb9B5+b91ajjnMEk|xQ z3IPGX7{S7a9f76^2xWejQ`e^yv6?KBjOZ`#T8`}x7hoyBU73q}D6vNFx8Z>IhFl>Taw3f)nvvcp?}`Nt5*Q*vF>nI7?e157@)e z?hsK@%7}W~q6mf}VG>p*0XT%a&g1a}HonE+O)a`}ZKN?>ywZc`&@vN@S(CN}`1s5- zaj`xK;NO1?&mx@ChDHudg#sV=+4~m>sJ#nLv8|``zVluDG?pL|7zw;jd$)YN%aVk##>5)2h@}0l&IKMc^Wo8*hm4iuV3TzTKzzy)!`ai-vk~TCygqG=OMJ}W+t(hx>%qxO9OF$fHvX6|z56{DFLH-)`vW*} zb^bmKXB$j}$dkfxm%<59GW~!ps{PSw3=3|KB)eVD$TW^y;^QOXJl)(%&Ai@UXdfIf zHr&ZaFhLte2n(~5qN`uMbnu4xBz|uzOFc>Xo=lq54o5hH^Dn_(VQ?gj2k_S$S=Gx; zd#&mBqyDV>(w=wN?30bn6n$7IKuiLpNa0n#6~;J!{(cXWjwT%}HQ1op^_|?Ut_T>! ze~Gb+6X6F_hybdOI%upp9$-~US;;ithsbY@0-~jW^7jvxcsIjS=Wu9ldtR__;Nt6B zsWe0NZBr>fBvylta|UWK1S&(siHUu6J#Iyr5Cho1+euFNbE=Y>UQ`IX%7a}uE*Sfh zGWhTN;)6uoas=vl=#3x!XIO?iCR2MG2;e&->bLPAZ)}?}69rF0fZcMSAazF|spIEH zEN{U^)h5^iaBl&8Y*vRCF98P!%V8D^v>oEvLDP$Klv;}#}U;VW`1_vpaqXGh=w~RUD`1SE{2@2d3w$dNG zQqADNR&sNmL+l^#nzrVFl_!R4bSA07tC_GlIxeLZqe`V*d^XRo!6y{LC#q>>?_=@m z`BfZi0?$z)Pz%Vsn1>B#;zY{X4RykiZ2@Ud{t5zy(u((|2qcFEz=aM2@z{((CjM|+yk|l|M2>GjQ$n>$VnkE&Wr*ZVo8;SV$puZRl@O_qZBk#hrM5Mt zzlTWwYLouEEe+GcAwzN4+c@qW9N&&^;3}bVWnOqkMr=o+ktw9jV2{eD+Mk|O?DyO| zN5T0Cr%?D^x6f+4IH|F7?ue1MPyZtEn5GA=r7x?HM zdA{14Ql2vEDFi}=oY{_yHR^P`+`jZsx3#BuuY9kI+0F5bcmXZtd!foLE9dF`V{up? z_SK`X8Q&-GdmZUpkm6hF9U}H2WYIg&7L6&V@I(^fDOAFgmhUt_@FUc>Bt?c|7U`3U zTYI6lttBh_fzbW|r9|Xh!$BP9{dfil5&~Lsj%29=TJO=r61}RDbsO@F8k<_`BtrBk zKZ1$UUeF53uk$ui2&+VJbT27%^Ae*;I*ANVT&@-l8{ za#jBhK1TrfH*iIkpm+c4VFUO<?^3)B6J-G8=Xf{QZDOT0I{nUYlAskX*f@x6sbx+2@;nEiBp$~ zqd1xR-o<+XnCN*PYN*))4rZ82m}R1+=(_mDR17`ucH=ddkJ%EHf*|0jeK#YVA1Kha zprsLxga25|_m#&5l>6uXE@Q0kHKC*44xg?Ue5x=>pMOX!CV&9?-K4?gJNR$H1fD2D|0{e)?*pb)H{(Ds?ZpMGXQyKC z{bt?^(zlv7=*sVy!YKgeHkF%_$(j1u@A70A>3H}IF~T@1{O{^r0C(>$_x*5A)c$>d z%2mUo6QwH|+2D_%l zbfm#3sj<_E;-39tz5O{V&k7r#9do^OLgXGHntpWJPn>Y+`0jH*ktd}a)P2zzEizfZ zIkQiahb7=V9jyxdg0U;nIUkEQ^MBxn3URJDVE_Q@ol*HzobJdZF#t^Q*4InJPc^-r zYr3?_a-B}&j!(ab#L*FoGx$dY6^y5f_m0YoUIKvx#CZ^GoA5j%Zml+N0O}hmM946| zjQ%z0l0)I+CfLs4`?>RF;PYZe^Y({Sggf89Q@#4I=>=1D+Ow0f9iXE`IT^)nE}xiL zZJNoCDZF+eP+_R5HrvYH*SSQ}~aM8?{w;-oV_zZq{=5683N85nX`%Q1y z6p>%t2KaiFh26Z*9XI~|x^ZgR_t$jpXC;PRpu92n8?g$vP0#gcGxLl^=>VU($PcUAyY^*+%u zpj91J|K{lch-_Nb1l9EkzD}YE3?*~?Bf@c}t=N-O!nyv(VhIF2V8oZjZZiV&_s+() z<5SvVN80vRmik}&%2D&zdkHBqFOXUeFA)Eo)AFk%wy@?}SChD2tvGO#^}EYTc^9DU zW~lGg@?K@Ud2^B4A=%f#vb(+i!NaGyf4Ro~nzr2iY5VYm9;5sk9w7W-g?vQXROj-kO?veYqt9<4Y=oq}xTrL6v962O_Ji#?#&+VY*zb_8TZta(q zfU7^q*VL=Vk&P5VKm|0`UM36@dG;(&ry!K(7QWS<^ZhRRT0QbRu=L6DiL?C_y*vLv zE5WH75{GmDfgp4&n&JM;LZACJBs263bZC7h$3UD%KvOulA_bljNO%WvJdJx|!aee` zbc7@`^16FO4vxLTz{aX`?x%37Zg4$xhvm${E_dHf4}SW9HP`pNn+MxF;2V4!c53{> z_^>FQC&->FBDfI73Et%ewWh=~6X^XS8+e;;UuYsv9z z>5ta3-|4mLQ5U-Ea2)V1}n-^XT8KaVDE48)toev{`ty1nl)Ug`10&r+KbLDV7`;z!w3w%(VelVh6!z;g@gyY>( zSlxLPfcrJ`DxggI@6}DU#mBxd!Wg@R$|PE}-ojKx)&eNqhd@;6s!B6^f zrNdpIYJvwy70(w7WEyECvdu;HMHNYjnbadH50q?t}tiyL!M@sc#|8X6;yEaj6bPC7FG1tLBS|EBPm^4p$yETu>Ixie1(^6 zTXyWB%~x|@c=~SbBeoePz+Cy~E9Y}K(=rj`vmYZj-mQ9=V}VT0ez!}ja!(NMF^elpkxXj zOtU}zu!4=pq{46m`@sLS^It^KX~}9l7S%Qy!s%Z5mTJ$uF54Pn&lMcAwKzvMb3@?) zkS${cqA*$r()n+cadCm7@r6{lL@EthEu(mbPdZ1HU8Q7Lcwa%CKEcQWpC0SUz8OqH z0_=EaPwr+D%lCW{kkxR$+F@tEZ%yIp4By(4z#-qd>+zPNHK2hjLtX>m|GyNbjIdKC zz*X(*9>K2*m`H?Fnk$eRnrA=VD%aYTG>(S{X90(f^(29UgCU$GsaJc-x0-n}RTC<` zp9kE37ta~kv6y2O*r^`y+#X-1>o?9(L@DS;94A++Jy=aiQ8PB11_q74zvFE6{)Ms* z?mAc6Y+L%whhuJc$1g_9QLaxfnQyyRb=e(%&p3vti zQN-JR@&ndiJH=mTg^eEB91a^ZWVui99V-?znlRmGpgdlNZ3>@M()Bd0xcZ6as9Z)8W#`n8Niz6pHH9W@s^W)t-`@_lyHyNjD6QSakf z+|l!N-bbRc9*|-20{;qM7Qc>tUphxx?9JWf!ZSHBt0h4OUsn}ZtPmU(vbRAK!r)40 zby?l$#m~);d1C8s4Qx0(N||z*_;~kf+}DjqES|Wn-jj2&Mr0f`Bw#&g#Naz5!9)nx zAOI3~R5&e(*TR*=;8b9?lAxX-t0Yv=Rs{_evj9?IvzlCfE5bk}!K17tl`RBBa4dt~eHzHw_0b z*6q;%>{Hmc5v1}ssUrTqs!SghOH3niSrQp0)>JkI1|9*F8%yoA#tUE&oa5za7m9tN z#5WvC7ebQK=%~}tlqi0mrz(CSneOYAi5aO3ZhJbLQ23Ihh6l9Th&=4Jx;W69EC5h> z**#63aL`yo9^|#u#YnCb8FCmZ2<)E4p|JoTlZLxMBuPQ^e*F*}+~TXJU#rhEYroLT zrQh7aw%dx$(MT1~1_Uq^T6niHSu;4sT1uwZED@8Uk?`q>3TK!I-=7Nhvh0cDBmTlR zeTUq#buRhL^kFZhu;ReX@{*j(r7PNIN(v>HBbKYm_E@`WXWCQ-V_q0DzQ;Kltn<-g zfpNMsBwI2ZGAeMAX+17+;QF`5I)lv_?ek&^L(pT-UGUnR7gqQ0<>N|w`Bk{@mTBR4 zaEVG&75vVQ#(1SXJ`FhFX%AC?s%?UL>rKs+L~{ud4gUoa)t!&+PIDaZa%(u);@Cui zjg_N43h$JEFYq={c1zdq5og5XU(Z@P7g^KMu42q%FhCasCT z-4ZV<+lp!HIn7!5`oXA4b4EbpS!vD_V;U~3%*)y9-bxo{hW#S%l%B(SOYhE%8p+?S zRBiIL%bZOn1~lBV3Ao_)d3Jgzvi)vTQ$SGWo4HSs_q)F|1toCK&2vO`^r<$7;C#Dg8Pzq_)Ept?)LG+wA5SGdg_L4W<@q1#URG_1sWNp#1uAoEq?zFK zp~SE8vJZEfS}tvJD(xu+pOi>T=1-u|4$dEv*^_Lg@n%sJ0xs+W>p@;^ydfP7rXsW6 z|Cu*q80+I<=R0~hVTwe!7zDgSoJpENr-D=_ZpUgnW3#8@AV!oC6&u>ZMbM(N? zCz?Q<2JB=j1<}^pCs3vPR0$rEYQXwafmIw&J2~EyWmZTKa;P^F?t%b(5fvs?0VfDn zKR?5B;9a{j>=_@3Y?;@zk6T~WeI7H)Ia|nkcV2n__+oki8@UU^nHvp}1VK&U%7NJr z^zk-a6v)JHWiiaY+Bmt1{x3vZpEZizuTgiD`;&d{s{unm4xntG=b2kCyjMy~!+0hd z-f6~3S1l;o8i;Qu0(EHRx36j%p_RXqrNlL5dvv|##5Zzji^??2oe;nRD*Z5QxJ z$4G2QMhtA=1FCVUO&8!P?OPp{~%?e{#i!CVOH4j%P=DU$k*k8&6wdq{eAHD%1>m@Y~On1YPnt1lz9*EbluXIq{z7 zXUCJ2DGHF}0ejw(_)S?zC@sl&Z^#_8K8Cvhb-&xWmoz{+xfUAKy%gYoUc(E7KWZhT z(iRYp4X@9vYO>A#t*d6Mm#7 zAoJo^2jUycfrk4s@0>025aQWY(a8`(i75oaXk6Qu7VbkF8X%5I1-24kK9Fb{#9I#6 zq)o z$x>lqt!Vx&&%o#uUvubqQSwQ1$Oi|2RM#)xPj6o_uTO+34jieO1nkR^3K}r}s5I`0 zB(4dh6cgcn8yljV8nNqnISo3*=5G+uG$ORVa(c@dieMn&kP#0pHQ3c5sXhbj$!Ok% zq3{{iJ{jQTMIt7vM?~*2h7aExDdv!VF3}=}?GRr?_WvM^_=vvn5w}u6!o8tkMOT@t z4zDqQ4PY69%bpvAy~6-w^^iFL^5N3#md^kH1zxMi5u%6c0r`+XJ;SuT1A0~uVOo!; zP~q|D91x#FKbVWk!zczzu%EmvA&Qq5V7ryUP0D#UeTD_4XG0o!>{S@&3_}^C(WjUt z=bK-2=RfwPf{q8l+hZfqqnBYQrooAJ@LX_&oaQ;gn26JCWTSU_PK7tw83sq%pT2}sJq^L^rFPtmIt`^~E@AgPbV7{20D z`_*J)^6#f#OE`O;q~m4ca?XOSteWy-Aw7&k8JWmDBjqWhWPYqJlk+SQ^#q4v<88EY zKsCjfI}fHw<>U{BGRhH`0k{ot#cu8FvxalhrlxRvWb8DkfP-(gli89djDzVHU+8B; z6jv}jEEw9`Z}sQnjkI5aa0W(Ou^hR8+!Vcma=_-NUPb14BYV8loycYdv83y8!42>C%$omB>VRbOYwOP<#{(`!!L410m{%_~12x0;k9Tax4i zU9_(bb27_*#i$%P90?&@JoBoxsE8WWFxN!W7?+rA7n*=d7^+KOQ^){Xyd1wZriAK4Uot{ z`rG?nE%d!+TAfi?yW`TZb)c!iuc;-bbof)__z>#+-Q0!H8n>IxpSyG-z5VKStS=rC z>F|QQ-JpBI`+zOW$R)~s?UJl%8Xi6cG|B(!kJ7pj&UcT23DQAlofOYy?^nJ}(}Cd_i8ZrB`m* zq>6PcaRMu!+xhn%E@Vm!P1qVE)IOHn|8?uJYgJJ4L{P$mThW5SiB^f&^AMXAjqTxR z>F)^pq%1_#WV534KOd~rvgf2>!+aqV9MC{<0Osvbc|91-UXC^<*&LE~^n(Kp!~K7ra&c^rDCX7a&-7>2()@o9~IIbw6wMBy`#x5*$Z6syuv8fBgHx zKvbi)6go5;7rL1Q$=`Q8cd=IEr=pi9lAnnI9gqt0=+vzi9&5;O{QvQ#i9M(8s3vha z0^$Y><&3lv8FDls%OJTg`D#ApIz}ct!+F8h9C}) z19UVjzV7+dFMKx1BuBVp^R5m^HQHWRFaVc`~05txN=iU|{05z(>;KTL(6sfz}-U~Tgm z3OAwu@u*d8I6zH=I~5*EMP3~~_-1Fqst%3zfT^nj`mIN`m@dvwCow%R1DmUCtLa6k zN3>?@UEh@2mnjei7n*;eV2@eVdkO6cUNqZa~R(<)GWM7CCv9ovgUlJXLoR8G_> zz0x8?%uLyRnH~_CN#GWtGNv;hK8bzn^22H%^5jHA)9mX0fQYClUXm*skG@QWsK+4^ zHA#|&$+Oh?<@tui*#neOB2am*B6%=gX7+6Q9J)dc>Du@F64YZb$D0?8-Ja#ig9qZc zl3&&e>}z=XH>zxY4juB=bOCkT9eO!({BtNYP&P+%dcmWK{9rS;b4-o@;q0%b_gH}# z(KgVQ2nfw5JxF{%;XMC4dmd}6R`K(xa2rezLiRuBQ(Mx~xKoo8HP6w!AfBVzjutfw z(?;+dk}?dJ9bHh!S=`^uZk8;nZY-+vENQAO9k5+G7`SvOXX$YBl3w6J16|R%xCZGy1R(bZ3}DYaQCW|xe$D}fu5W`1$k!1&CF zS=6I-%>ZQE#buay^S~ezHg(|cWyNg;17iYTmZFH(Qqq7-VXZPy@gpB zoZ)$Hop==CZz1^WM7ASKAqsr4L91HxYFcI4uaU4EYmk^O%_b^ z;pE_4#F-Dzh6cZu3-27|{c%hxCi3;$n^&Up)@RSL-iU9%Ngh~snE8I=$9E6ApL*}! zi!31WqljU=?r~>+CY)K~y3SX5|4hi3Z#?gAI`5Kvyj@mHNKVUcp8BuLcE7F!{kod_ ztGMOYwXt7io4;=G?p3JoRoU&;1nt!Y>5zE@h}RF_Wbun`{Q%o&L_AG!8>Od)oE2%+#(eQaxNy1mrDK0Ed4HsncbP4J$Lm(Q zd2}P<{#vK8hv8h21z<8^uD3Vis7Qm?FmwTRvPpQ8i#}$6wk>s;MB-Q3r>B-lfr+ zl#>Mqz0UcgsHZ@s?Qy|A87o~ZF;3QPYR#eA;)>e2*{P3?^$v%mTrELTy@IuuuXgAX zz^fvPpX!)IrsvAKh;`}0&L-N`Xw}DieXC~5!?<3xU%Hi-mU1Xg@CPvd{lat+>i}%3 zyJ3RHkABsI+gEv@U}f5& z|7-pOT7678(o%_tHps}}GhS+O)6Pg1sJ1RI&pWv`cnkkyF0rM;L>^Zzilg|{cYl3> zV5VaIJv)VS6*~?^;Dl@fRb3RFVSVcNAwa@lJN>&;Ti`!F%QAJr7y0?wKE>DhY4vO{K9sT#` zYrTcwQbCyQxKs64Tm7$7VRnYUzkRhMB80;2jW`c}vnLBU7bxoG9U*g8?naYjBp&(H z?-Oj^#TXxWc~%4d&@i;eF!w)hXzuBm3cRrF^r+%tvhN@j37ZF|a@Sg`D&#;Mty^ot zaSUzVd6{0AB6Uh|!Zdf5nxBHJe_3S(uF;T(0s94Rpj{URSnR*2ouV*wFbYw<>{^Z& z73R8MVQJ8tSW$UXF3Zuw;NrTBqr<5mXQ(C@bSQLAon1Hp_J7=TvSzg8~A946s2Iv@get`>jyV z5y3$+(~vq6?5d(oKX)8Z8;xE{zjCXno;zRXD=np7BavUC11jecmH;UHB!CE{*RJ_gk9eP-RMD~`SboBkP*U|>gmkp2$fjwXWg_B2i}3PN(1 zh>@?ON}nJj|3{HjlxH(&4Y$$P8*-v530F*AD-Ki=|8vqCAJdplW~||d{+AJ?!b)oIIka! z$*DNb(8E+}p2xAZmpGUTyqv@EFj+-gh>NeiIY}(f*eq=)h3#eDe~8+{XIb89-;|?x zbDnO&CP#7s<@v0uQw&~x>P=HJm67P5hKCgw6KaPY|IdacAGsL|V59;5&OuYdr)X6G z#BsEipVvvs+qo?br1@HVz3?vtn9E|Y@^rX0$+7g?vidJqv#5T@>tCzS8~m4RTMe@n z5d5FPT_s)be~R}^-7Xwj5vb<|G?0eoL>~FUYO@~@4TAxys>cV>o_GM(+ADLf=#@jW zJr|6)AOhEgCz{st{r_StF}Oqev4Yh9bXl)nGUERoDBsh!)X42u!|DPYA?CFL#l=Z9 z;cw+3;X_;K+~Rp*viNs8oa0EU5TpfaCfGdkp&`)%I2;si{-1dai!E8&HtAwGX#rcdn^n!Tvv zeib9l+=*y5v3Pl=8PvZziC+c zkl?vzyih|PU#gdS>WSgA@?phDpEEl1K%1q-*OC$ao2q}?dQ*gdN#hU1n!X%n% zQehqdljqjnpb&^l#ySzX9dzzI`S!-g+|2F8-Oru?u|pp0i&Dy&bm)kZW0T)N;MTbo1V;{ar3_%ghnDN~*ew(LJET0Gt- zzYaIDPsu-P`=%JE>^}flzGXPpm5fVyL>PbCV%>9RU3j%1AJsW>X~W!(L7pfcE%`Ai zEjlr1sv8=0ty;m_?r7@UBRM)aVSAcs&XKX(y*f7!R({G2e}LzkMt1QY3`{k1Ulge8 z$W*9TsibtBekE2_`z+ik>#N8pPKXNLR1Ll$AOXx6?zSJS39B-~~YjBu@&r z00g0nxHDrqkS9#s^J;z~P&!ec`wI)`OEttb=j~Gj3&l%EfA*xH1uJ8a91TRdhrj&o z`e?-UGqy5kon`2mDZX-F|A5U-!SMy{We%2pQnJLb=zG%F(9n^|vhvDal&o&2uQs}I zDtoC}>iD57r@t&$jI6k$Y@Veox3LUQvn>CT>}6Y7;>WBnB`@8<-ta^yt=%Cam@()Y6mBb z%`CqSBd=n6MM<3mpB|3HUJif|dh{OnMwd0F4QmN{tT%cM66vqCi@`ibKu@=7lhZtTp>#^l_x8+6B4Ve0LJ>+& z5YWK>Rk8^1PaaHY?fw#|rtp6hoL*Li4kOo5^hDNeb2c-Z_6Fmc=|5M9}7vQDE^y4q&8^Y=kXQWEM6S zfr*nRArgRwU)OEtsz8-0C`rGlvWA!=tYj_(?z$kwRwO-BMX4ib*Jw?J{8H2#Q{{;g zheDF~8gTh%lJy#cay^Lk5y8AFMgD5VF-gR#1>f}xem<+UhAk<2gMWq0;wcdpDroE@ zEyR#Qb82O{+A~ai)JTl6HI{R)#N>fbkVA9*7E!Y?NnRJWVe0e@EVnsnPaR5Y4zl(} z{lI1%5rGR%#c-FC=3s;C>WySAL38Q>!5T?@>X5a@;1&_PeO6(N+61rWq%%v>1{1|P z5=lh`VW_zhsLP4ozPj=D$U#KpQz+}JR?f)KP@7Lb7QoFvStJlMEyNmxY)iK#+MZHR zB9q*d*Gl5l3J}!_3J&95!**{G9oP~b`h%zQz>TEt{%b@kNKD&;7L=Eyxxw1X``SI0>!o90F$eFvG2F6S9tTKlGRliJAa8xrN6lgJ;2 zd5n-gBV-@#gJCMKk4~734kSet8$_Rh^dMxHt)z;JBqW64O1J`DTf3lRLnIvB71YJ-=z*qW6`iRm@vY(&d(QK#!=3X6dH;WbyfF^LQVJ^W_+c;|Dqc*z+4; zbK!YB z`H4Wjg~T${MK)P!(S;ha10p_g{>vThw3!#Fh!C?~SPlViA2b5y;N{cTAIE1H_nd_A zxF2`UFxkuyLK-GMB2q8v3R3R#!5F6FL!y|L2p&cnR)uU(_Ylpn5jhs1%zL_Huy=`wgP$POL2)^9XMIQ2h3pXdF|$ zI|2H76B16l_F4<&MgGpXG5eIE6`!|}n*@!)#J$EN>Z54-Zrq~a*VU5HjSmg2f8`$j z+Vp(b5sta4jd&k2&@!ZX=?+X___n)t0CuPW{|@e8xceFbJ^DK1lni)*Y$4lZ z@x32$b^7Ol^tglc>*X0)hQTns4EPoif|l!JXhu#RcUA{?jKU}4jXDY;w2=K}!nL#e zY+_Ljron=hiS4lzUf`hzQ?4S@4=6Ldd%@qLhl9{&ZZO0(EJPB4>FFez>?R`Y0nhJ= z!79uilFA%>F?9>^MCRiN%S>oB&CmFdI8;~p^kudBY4=Q=?X>ah-M})$eNr-l`#vFO zvGY6Ml0q68 z0o$B8jV_d*9j<}%hAa4~Sx?{YAu_*2a!Y&q)!pw+usdvmX!X?I+(_V-uzwo>+GzUZ8#)G=V4h{p3HfE)|%JDZTW5m>wX4CA}sf90wi zRAKGfqZGKM#MOa)=Rdbw^B}-}R+@3v{^S9U?rOZEN?nV=^LzJ$1ezid(B)jiAk-zJ z5RVUCsvozAlPw|7X-Q}?qjrM%?A$F3{eDz9s z|B)<>A42T&D>eaX%kbe9c=w~Kc8s-d^ZOSztuv%G&2~`HN)lQlz-;x_ySWUW9-lD{ zsnDfH3VWE=@|mi_=U1r~aszq#0|{PH&R+4`PooUNXs$Ys(nO=EA}|7GFrju&ezi8@ zZ4Y))7!|6U)B-~jf#*%$4&z(pn-8TQt5JpUpa{DQI%~^I5xVt^Fiyz@W}0)e>(!oi z0THL`jH@>I$69n8+5yT>PzS#;!yt~!PZ$e-GnW7D3?cU`rnl7&zg>PnL=vu`? zOSD`=%@w2tLE5mp8$p#?0;`%=IG%_Tt~-`rgwESbjc$@ss$2|Z6Q5rZ*!JZ^<=729h>O{pk8fJ{GX4z+c`<;~gBi)i zbbd=V6{Frw$&o-8_;lL`^V~veTkraY@b`}MMBCt%F&@6opxm>9E;k_b^P8&+nrAUu zqea$&&lPU#loxHOk8b&xJy+w};XQ-lJASSkuFD;(qxkjtlU=OpXp-dY)90qU6rDG= zl~2V3l=Vu?k@q#8DL&Vu|7Nc=;wij_wPYiKr@g->3OA_qqC#NqEO$HeZ`;8k7Uj3| zVJ{1c+lh)`a((W+)}pe*On!w9{*Oh)-S&KP*UehGy*Ok{6&&;ex&uz5LW6Gl`tE&X z+4H#W;B{6!@G+6~*WFbz2ZCUS&{wZ+O6~I~zcTo6Gp_CNN!Xm5Tk8DXmuW!<mA$850&=Z4d=jnsY;LEmwu%@s^WNAQs`9Hd+6P%?@J!19;>g$>|O0jvx{ZcHR-JRF!6|7*@D0EEMUHRLPNoV5MFof|wQXxV9p(DlL_M zXJJ-DqB@m?p^_YaL{_ga{YX>{V%5la#?_gk8Bfvt6yomAxRqnka+>j+r}v}DR}XTY z7rgy>_u3LQGGFiw7TAqe2k^Y)A1-;ZI?tK8F*f5%~D~Elmu^; zDC)wRI;A_aq0sXS=7~Xc80bv<+)JVPa?D#ltQi9BPojw!ss91Nmz5#9_fREDg$Ak? z<%6N8gS^Hd6H!sPnX-2y{37Ev8jZ4QfH+CX@~Gfs7Vs-XFtd3tIcNZ8zsrwABADP4 zXk4|<0r~=`2ec=T{S7=5g+JgM?>g!&V)6<$Q+Qrw>zHoH{yP;B#+_1%gX(^qJ3FIY z$-3eltG8mlW0<<_x|pX>G7928>q-};xl~LT?<`Pp_WUXIspXc@1BrXj8H29F8IptL zs11@slvpE^L)8TPlizB|GJJSIvcV>2G0t}L64&3RWj{Hs}^3TQ%|Hx$!DGJPi~k(NEf{Dh9p=xqC@SX4GjwP@*D& zR^6Uco{n1Kyu$sI;uJJW4>e2dO?1f8JBXQB9hE3T6P}Wv`z!r^q4S;F59f>oAp0pU#%2}Bt22&4vw_WXkdqa@JG+5 z#A?>Kvy4onbHo?Tl<-u%S&6d#NP8g0c#4D380S_IUX01DCcQe8`;AhL`BM!|>9t%P zsd|wgjQLdHM$w+%yzAL$-;#xWSL{dY>ykZ79Fk{{%%xYkQFKM`CW|L;aNP}iFw4qK znSb?`TA#qvmP=H_n{CQxvuT?JwWhANtGsTeYU0=Oy4tBYsJ>m#M)^vx&+_e^g8utS zu>}JUKMxlSKEBQ+JoI#uO=S4xWI)*PtIgrUQ8zr6qA^bzlcI6*RlYF#H&-hh2z@hS zMW^1L@`+7{TgDa7L_ZxVo{jf(ouYzr&UnnHMt{69M;TO6vS?FyQnK{9)1-76ycbov zQo1=(y80FGeA(JJ8q>1%x{L8;8%1*7-|n>pcbX199WCD-^*mp( zH~H2SY~&}!R~#&U9(COd_8RZz;D~`5-Wg57ZW60nwM!hWq^`O_%qSSCbtN7v(jm;! z@4T`Z?97-qxoB{g{3T_XG+P{jwo1stv%*S*;;JW#`2w+;bu~?5yE&_|A0Emf+>7@i zN+3&>K%_o(I9tHGwkd(aY3|#3_!X>dR)=12HALP=0_EtVGclE(63&lMd@=QO?_`jc z$^`IhMRI3@$2>39H{)|)stDFP<$u1HqI{*AoT3tsmp&EA*zN_9fc<}Y*}!M{7g_MD z6-BClL+ROnXLcC#K6x}ok>CJ7rLnp~btUwNKV()zLz4TN$uSoz=gdMWGT)%(A^0wF z$$Vl9<++VEr!I_yU{Npxy}gwmUOJd*ZD*rfyL9b8OwPJHgIC4zBxUjC(SAtvb}~UM ziUe*TM+Ro8bZbxq5H97~r*sWSj3%lhnTW#S3V|S*92wMy!Ed%FIB#W+`bstmc8qTLLRYHnwG7>1hHf*y$MX=RE{g=; z`jO(Ozbu!31A`O3L@^kmOc|0h&1hm~dl~3?@C6O0TYay$wsYLiEuB|x3?Vm@K@~Vd z&=AS(;*RG8@V-o@V8_xF&F4>W0p7iYz<*EdBj96@``A4i0qGIS zzYa0542H81hxk5wB8pHcXb$1gB7$xOLl+Uc_(xu6uV|mNKj-d@q|2tq?S8p3ZKgge zF)7yO$e%q8H^1|5-@rvfJ;e0TP*!zlSW(Rs0pUx%Il=DmY9aPy>qP^aeKaracRzRg zfzE8l?gGv!4`v)%T|w=0vGRLF&y%yux#j!WZmjSli7kQr7k0wmdoypL~SE{T!!XoS8B-$8+ zee&^YJoX4Yr?)#8f4moTdP1msdf0XznmG?0#Y2o^umw|yeGH;DJLN;2a+%>N;t&*O zFliKA7lpWm!!t1>yoVw%#1Z<85&EGBUCs7SV@(fkRvo+_L->r5Mxn?6%mm`d?8e9x z&B!~<$X3iKHgJ>^W8{K3atjnOV*=FzSlLb>pu0fjVMa-DfmSf#^mvR~*BmLFKudxk zNsK=T7(MG@POnSRm%zl}XMQVUoFQYJG0%J;*}S;ioJm}PxzYUG!1y^9b>brT%J~Z{ z77FJN%uys0C~Aufj1w1FEm*lHSOqOEicegWwYa1@aY@&L&2WOv!h+pqg8hjFhvNi? z$3*{JHD@R*m(K)Oq6K$GqRe{>9xy0UZNb}ULHxyn3rvhmSnw}c>~$q_fzc7Tr2xs~ zdRHRkKOw+sDabu3_)+r;%f+j*mO>G#lR_H-R~O*dEG&g>CWSTquRWO*@vs#2OM2@t zDH=5?mS`zHpVN!bIqRuu@VH$&~2HBpQ4H zVNDjKvyv6Gk`tfe*_pU1J@xaFgnJh9CP@l5Q;JWLSuL!TJgk)cl9^qnl%u9p60Q2) zTdC$*sg+o@WlyO!PN{cXYQjfA7xoeO^$>W(n+PI@+KI0se8C?$xrKT7M0a=B_x3h8 zxUR{_s;g_>9vvMluP74{lY9FvJonS5{4Za0ZWz7x3)t9LURjwJ6_;05z46M?&A`yy z=#CXyMlCTZsl2@O`3uLHnThrF#j2{W4<9}K@uT&ngG+NuV`*t=Q1DxaSFY(9nK$(A zT)l>tmDdy&k&TPTJ+^-_IXT+d_2cgSN2X@hMMXvK9zI)JD|2&`HQ&Dp3CnbMci24q zOr*nCE zj_?s5oKa}KQJitnuu&+Vc~C29G*RYm64fs&)Uw_%?p>1C?F^$A*mQ06X%P4 zbKAh|`}Z0bS5G5jOWQ|JKj-JKuP;fXRj{x9?H)g0TAFQdZ*jwT8yZ;*5BCWQUB7wj zj*^OQNa%b2fZ&|mTDS7Ney~1g_e@huKPo!*#Y-1&AHRsmXuX?vEUg}XDfr^#>|R__ z{Pfu?FdP#T8~@rbkegQ|`{T!UPhMWWBH7&B zke;3~J~86s`=+k0w&H8~9g};;CU>pwK8%ct&CbqFNKASk7U}8b+t}EkZ(u$=(*MRk zC?YZ@^zC~EMXmaVx>rt^)U>qNI9yiN$KKwql+@JcFPsIgNIAK9n3+FNQPZ=vdm0~~ z2!7@M&-o!b1wg^9oQtdSB%+* zE$594ae*m+*Ft|>YjK) z!lGW3JN^wz!(-B1^l7p#_@Y{zIzy_`8+R%bisE96*+!h)8y1a{{Q1tb8<{38;tR7q zxt2|F8l?rxgGEmlM_Nh?S4T-r@y=_O6|GO!zvVG)Ei2xfW-yrOh}bFMSfw5_7tsawsoRz&=(`Ekzph1Rcb5vQ7`tN5H_7zCa5m^%@> zgRv`#@Z6XuQjv4qi}u#u8BDr4kC*8XV-j~9xCth==q)qto7R*h&5vb*y z^cU)}o(vG3Nt+Cm+?ksULKARJ1<`L@3c-nxf1Vs4ef2)_3!lev({^wUoNfJp?rBa>MtE$vuNN< z&Dv<>EnM1Y5~$Qe=Bc3`C+lwDnP+BJ4c}J}Y1g27wE07sBYUeuU1WKyQ%Ht% zyG!r(qwQ|}``Oz)#xIw*d(C|LcKWQsAMNy8r)KXA*cLAD4BFT6?G8QbeY895Fq^$Q z;=FshygP~^bPfLDan^2c+>ttPZ^B<>Wp6TAiGP3U-EF)5>4^Iu_heEARN zlEdu|=F?I?I$HbDbR8_@*4gbZo@=l>TrL_^bXqCfT{&E>B)ojIR&)08(Rw{c&e2A* z$m-E%yVB+3t*+aTkGK2o=N#`0y<9!s9rL|>vNsj}_+)=BHRt3&*--mz8&ee}=1AWg z8+^Ppn{#?{w7Ytmzx54!1h+=Q7Z7gvl33VjT_u6|nmf`Thu~1IA~9U^pl`;3+LKx0 z%k@N&B@ihoS5rr=d2y;Ikle1XrYl+V7Vu9XyRZC>abV3yv^jy|W&JmngEe0?nZ>PB zX(9$zl67p+6;|ry%`0sD>#ygYveKq1pW}*a@_Svy`ZiyggWvJ{8@(l3`elpnS9ELq zPd{P7GscP^a(`TTw4};Rx}hlE6Tmv(2n zZ6(%p7)j!v|LpFim#Ixxr}M%uO-(=Y5=%0T`W_K(ODy=XSmc2325TE4MJQFJ#pd@1 zA5w%18(QofH>1bMQbp@jTAxI1#>}awiuX3Oz9`v@UGqM6ljtGf31C7o15z!MGHa zR69bWwvs7}Z6!!!~y^t~-^eARuE<+zY^;`n@4*Evz=wFk!hIT(1ES& z3bVMGW+YbJQ!=pq(V->NWY@2vpq3!4Xe!gJyD_1PQP_#mF;flyqVG5Holn65Symis z{f&k@c@ZsH_e7fdTOD^kXC(=!gy+VV=vO736LK3XP6(J=_r}DAz*EFX}p&xLAPL1Q_|4#@kL?Nof&!3 zQYToBatx12F;VK(>E(}(y-g!KCA;No0XfdIYNH1OyA?lQquy;AJvrF@3Khgy;Hi(n znf5A)z{U6)#bX2#dsRry5MoyKasG2C{<9x*eMFkaDGsUG74@d{XY=CW??WP4G(Y*> z_ScOgcfe}BPNF??I3bj`S1a23Dez_UB+KDm9hxF97`*?)%CujvteF=Y-aN%FvEQH_ znD;JKeVW^7zfr$6FRZY6n%`-^$&BK2M4j^u^PY%iYt7G5rA`wmsLj*nhk>7CX4PlK z2lrbYT0h6_HqS~Q?zdqm0DXZcotX~Wu@nyz&$i4dN*w$M4t%CC#yhWSbkH#tEubhA zFt16-_U$q3ORAE_g04hZ$b}Vc<9S_+D(xuFM?H<18XAj+gN#c2apVC~mlo;Wwt6Zl z3UYllmMoYK`|33d^1@q|?nxZ>w+9yFr)n(Q7#$AuwH6e(>3P-YpS?f-rFkswVX*z< z!=X9N!jj&Wl^3Ol!)t+sWwRQqj-~ZOJFSHkyDh7(hlisOWl<%e=9&l7(HN0dQT5qY zd%{U4e#*z9Us>(s{F0g`s0%OGUS0VVK-x4p27eVM&q5n&IWT2(DpRbWM?qbUKQ_(# zn7G-pl{V@WQ6_NtWoxFzO5~u|gmez_$|LD_xTj?t@~JmFXgoYE`CL@At{+S#uAEUr zHQd(=YRq~Wx*bzyyil^_=vYIsv!ncF>AUPU6S+ zqb#3O(mLq)nl*_2tT}nt?x3giWSes1(XC4I;rMzM?o8kEm6vUYBZnh8m^PQLcGja& zrqjK8-}c3d*rOSV)BX0Kimg}u1238&1rod zD9ku1-~4o>H~!&}UhCaN6XN8)9wmy2rf(dTdkoQIswcG9zsVnkQ|;Y$+Qz$0u`YAD zRsk;zQ}e^Ea@`HSC&FUy&RFEmOi%6ooQhhXws=>@2uF1ROUDs`u9tDQ%Gb}6Q31E% zoD=mF(!aE$bo*+E#}itVxab4C4$o`!Ub3QI^7>wi4qnO;UaCc2>V00CdtTb~-Z${Q zboIS&Ie6!5DN$>56c;Z;I$| zv;@CN?!iaMper1x^CM`#VVOndY`l}%T-t~L_iv2|7$^!D zO1qdYEJVNVp6u>0I!9Ob%(D(lKiwCQ_KaX@&$g$JhLQEf)EBC)dir@Hr48z!)xMyU zy&#Ao7%mo!FbF1i6-*QvOi~<7)*nol0oS87lE2oPcJ?QZ!mhzu2rd}k0D_9`+WGBT<-QYPyo&9Mj2$SB9qNw-mm!TY#7&%v#Z4K+&Af`6i;P<+j$7)F zTiK6WV~F1ni{F}OjuW8f8B?t>h(8jGsLqc+Ho#Ug;JW0o8F1Wm3X5VP{R<`LSp^(> z6*12bg61nYq@f&L6jf8I`JY%N`_aGk(w&|Db31 z;g;hE{iqLyB(%Hf?{7>c8!@KHlB8G|rrcBIG9_ZTe_N6?gI;>ziMg2Feeu-W%1#nd zOjg`><{K&JLsFT|6Q41rd5EXAPx|cdBJU}l?dwi@aLRGTIU_AVoXKC@L`gL*EJMq4 zRx9LyvpMyWt07&yV|t=^MzUc>iepAvR7OTgM%F;a#{o?%``5A|3HN9+at>65WHJlI z4a4N+Q;Rce&yW(DlM=qmJhOpU$*A}s!$-`4(L#xEt0UziM{2_Wrq(c9iQr0kNTqM&cY9~}1Z4M2O{)*!#nXpfchnCEPpEB;^ zEF%0byw5=mTAp{x6W_V;(2$x=f|m8o+gJ{xQ)iAUd%Jp4T8 z^Ip~{U(qRFIXYjpG+%u%U-K|uTLO88>B||qe7%Qex17Ep!oCO@OjRQKblzf*BUba7N^am-+G++i_}sU(p!esS-Tk9bL1 zbV){ON!B2TDGyi9U`d`tX}(cufm5l|>p~Z=(z3zQl*Q6Yrm|{@vKphZTBox5=(5H) z)*njCS`W+GnaVp#1wKjq{%m%1`9NuTa0DdiIy?M1MUf{dzR`RYSM@gsBn^o}V$UBybMSPC?E(Rgx`LkS^UL z>8b=Tz|$I6(K%Pq$5b(vRWT1$u^d%Vc3@Gqw<#s7XQp1Wm)&BEsh-TQ=4IC8KdK(3 z{U$i1A!Ph*Q0R-*U5u!@s>skch3#)>$r^d%8b#+C<(L}PvKsZF8ck*$)}tCZwi;bt z6;9*tG78`Iv$Bks-{0XiFg*IMMO$m(FJJ4WtZRT7H>zcqueCj@wP&t-B3bv$xbB5> zokL8WV;Pt{taCl8!!Xx_ch$X&>wTQ-u`%@rr)l;6%~gGU^});yp^^>nj2pt78zN#F zeohb$HN+h?;Fuc|B^#5C8&k-_?VKAkBtHa|HGVv5%w=xMlWfX2ZYpqYDvD_;DQhYl zYN|MDs$_1imTayuZq|=#tc_{z>2GBD(A;{|+|Jz6A=%Pp+|uLR(ihV*P}VXu)G`8| zv^#8>kZheYZk>twAn(+=;M`0#q_B9@y2jkLA=$QN+_vM~winZOP}X)d)OK>z2Ayk% zOSL2Jv=g|r6UDZZl(&-&w^JOqBhUSymil4g-%RWBgFf~LBcI&u=5GrJKhB%~V3O)M z?D_GKtb>N?^`-I--bbYmhB^e!bqY##3Z35R6n5zpjqMaK@01+wls@i6pX;Kd)o8+g zmA%8w>eBUovQ~b$b;>5YC96wUs+%CPtI_(sUTn8ldWYd~x5;t0*|{DIsUE94J@;IC ztYdp@%6n{wd+d&T?9cT+aVfhc)%$|)x92Xsj^(}1!@aJ@y_j=-9#VZ?clvx>`mnKm zAK&--4fn0r_645n57mebmg*0C&|e`xyCA&;eqnuq2b|?)8pZ>b0ZT{BU5)qW?V+*Vn-IrN0x?1R*py3 zVmbPknK#dk?r4~9yNn)`j~)$=o*a)tEMsu#F@(t&f$JDi+;#B(2-(UP@{=(n%Q&_4 zxHcR`syR*{H_liw&O9>Cax#u$nP8QkxMVWH-pYD*gq66yn`30+`tuUUckfM;YjqbV zgk2}q!X`el4_YNmf-k-ot-97orsPeg6v5ZrxGB|&DfN*l&66o@mT6t-X+4waTXq@J zuG5BgH^9wfCMVNoEHf6;Ggc-u_grVJ<7R9sW^6}h>`rFvS!O>CP1`1X6XKtBu)9K< z|FGSQ?OEI`hGot}dd|ya&c}5Qdm15G8cF<7tAsr8YoE2Jo(mj{wA9;iT`}e z$b8(%JdR}{QFUYr0P7woV_v&iHkmd32rSblpPgDeGkvLVJVV zbOWVD$9g$?@wW|*_>Jx_8>XjcQT&fL1TNFz2XBg9hFRjE>a#@m*r+6PAY&>#a-B_1 zw@tHzO|c+2WCl&JK_VywWhEhA6&@eBq0)WZPzy;)iV2!Xc039aF=uEEI6@DU*g*kBmL9)8*CVddo`@?4^bV7%z| z?Qf<>by~>4Q_6je8LB^?0iMiJ zZO{>1WUVh%Qh^q8y|V0(Jy$<-Sk`FwY~f3fB^e? z;W6cq2|X|@6R#9+a_qRXJp9%7yy=Pa!S?cKUA*b3>&fvkDVZ6;ITB9DE4#!H@+juF zu)?6Ahy-$XA#vdk~sT7b=oNU>Ti*-6>#u_Enx~UfQw{r?IxO zyH%E^43^qp4kctPP=#xLrq3FTs7|uR_?>*aswK5M^;zrsDMCnFhL9~^Tke!nK}bj8 ztil2uQb(-?03PGhHN)V6do?H(Sw-<6 zDU>pml4k}z&Wp+mIYD#=VTcE(^0Dqj-FYtb9VOf`)_vQ|8^5yCiqicfF$pJ121Sa5 z#>m+ql)C`L-}0>Un%>>+o9^x1?`~+x;G?^W6OXU;nR892MT#5F$xx}&sVJbRBj|Cy zR6=<-B;oYlq86_?Qi?3zT&@+h3=o+qvJART!0>?&%rv8U*ze%*u-2Grat=-g9GsQ_ zCy(N=ld!~`Ckvf&pAfJvoMBdvfapB$)xTHpETBgP5XQNV5qq9e=wkw4_0-k|ofx__ zyqgg(7;VxcUC%%~xXugi2*I_UvyfyvDS{DU(SJ9BXHU$!N8N*oIuJo;anbI|Fjh|1$B<#R7)%fm0i%YVsObdtJ57O|M8=RR)a?AVN1E=+ zIu~EhUC@msbB|M|zCb$U!vq!Ibgp<&#xNG;urvSs6ns^UZ*rQypxVzWb!m^t!L0Jj z8_^}rG&wW)nIbfSaJxIDml=XhRE8uk6%v?3Q-=zqf?@Sl6dWx}2H6u()sR7Kdl20v zvoH7w)dZ0VaB5nVBTmVb^Zj2M6AD4mbztux%?{myn1lPN$ z5ChNf7{IKE?4?91d=D9NcAPVz*y!Mdun5vG*o)mOexy;fntFoVo7*Y@oy&>jt8Qf- z7!OpOS@Yzwl|^2yzXK!JmyxCG2=M zp~=~^WH_kl{9tC|ceKYUDej@Mv1_H=@?K?!!9>qllhZA8jm*>uS zisoYQnR36&*rzx3KsXpH3ZHkvp3r^kbR)bfx%U!}iq~bvOaAjl@du*wDncdH_R&jI z9P4zAI$?QH6^Il8%9nM^wpRE;`W|F?=oWwaHS=JEH5y-B+k>tPN2p*edxqpZ93MmJ zkJ5&fc!ba}qk_&ODp{-qygkh>kf6Ji$!I?j206P^%L^$}vkSn2?c^byqBOL+pRT85 z{-rYk4;1Z5s8BZVk_aNx)hf{(zIRIyh{;aZZKdGC3qa6dxl3gOLyg6{0c-VcqZ#c!ANoVld;okyA343DU*3JLKN zGbXmHOD}_0cfY9cbcwT+3io_c4)V6OVv{gvyhUf>@WJNJ@dJa_7d@Zj@gG?$NEmkb zAwJ*yuy{|c)Uc2me&&@=_qn0Gfe21KtHt3w#*>G(coPy+DM4 zI0I`2&I`O4;4(01fVRMPf$##i1-=Zh7k}76>@tW1!o>qk$9y z_64{M^ckQwKx*LHfS~~#1BnJM3{V>|E^y&rjtuk}kS>sDAk+YV0V@M#2ILK78L%}# zUckoyrhf@C0N-Ci4Qv-6HQ-%<#Xxw0L<6k`5Da`AP%rRe0L?(90eJ)V1>y`)9tbrM zXCT_ZsR23zAO;)^BpsMF;9y|TK)QiJ1H1+d4e%QL04oO$4&WR3G9YPS$AFB1cLPBN zGz{$cmpB8e28ax_`VU720R7jL3;-H{H2`J6*?^~kDFf67tPD^a$THyU|66f6cnst7 zA8@(;Q__DIm)~;V`JdzRR}3EM-^1nNyy>Qhs}Dz-i$Bk{{YP9b`Lfvizv6PGC+Xkd za(j~6U*U3j>F(;-w>PKfwJOT~z~#f;waKP;!=oc=3zf;;SXNO<8{1cb$)JNie$7Lpil9j*0 z<!EkpB>u!)-VIS6sH;Y!RK!+H95FUD|9z6Y_1f%b$I;^;fv8t;F}Q z;4=T-nAcBS#&Uf8`?wtQa^-Ju`CuWdaOGezw~qgCDZlq8F3)~E{FiWfsc`k=aINn0 z>Csm2qBAlZ(~JvN+q+SNqT5a<OrIWsQ$d z!kdO>#CMC^13o@WRU2L~+%4(*9hZk!9Cu5{$a5U()J8Ufs{N#UMeUfqT zU&Cef8NulN-*LIOc}BQ&|Fp&azrt@{H(JY#>q}^9@E0O7VPFbs@BfNDh zMdEl~JE){9RdYMT=y*ZDt)!>0b^D{!@uC@JX;oNT2K zN>Qq4Id&zPY)e=j&)soz>|4~{`H)%;*~ZHa5u(9W4aejzl+NR$_7Hf>h19>@3wC6( zTU$6zb4eR>4^xS#aFAY3GX2KNY!2ZO;kiM)IG5h1Za%~ihPLuL#)vcFDCfEx*((U5 z&K<>P#<(p{pO<5WU`NC#7zfTRz0OS_A72^=!_$VJAA=C|&IEI^jAnSW+Aw((LF;X2 zsyW%Q+jyM8(AX}9X->9=(B)#iEL)KaN0BU-wJT4WEFZnwWvuL#BDbp!!Z6tHO+xXr zNz|Y&SOBr@KWGwgSpStJAV@%sfDZZ9Cm>EhmVhP!K>`xxSBijC0Eq(n1Ox`?5Kt+g zB|t@h4gviD5(U%hPTF9Se7fKUNZ@pDjBO%DVKsFz<&0`lNjkbqYC)g+*HKox)* z0mHJOcEHgeqzE|rgA@U$e{kIYl_H=(e$@^*%7ftfRU;sTK>7R%l0Rl@!66=m1ZWa) zWCsZZj_ly14&nra)8CZIA6WuMLc!@Aq|vW90cUh@ItQ5q5(Uh9{;CvkK>s6DepL$S zB~U3~&h^)T?5{rgyKw?K>Tmi4WEB{q1!eWul>!n4^wob}DSynx{@qFe83rolk3{*; z`vip9uRi%TM+=hdj|tabEJ!F(6uGf1i=wJCut{{Kr3K0|z_Vd#5{+3XHetS{qiPb$@&=SBX08Id+0NDUe+kgu|1AuS;;LHuy=D|sRPOfgb+v|P)eX-K(2s>(bY2sW%B%`6KD_6JfMO=;q8*U<4emLA?Mc0nGzs0~8m) z5D-)VLqLOp*Z{=>B4m1c91sM6BhV*+P(WFMSOWBM-}*7YC4dj0+(6_2Ujmc?Jml9( zA8-lKQJ^sZwt!RsA^}_l9PvRRfWQD=0U8Me8=w-WDnoCL%YuoqBMz%D?009pY>0Zax6251bRBA`h? z*Z^+<8-4&-K$U@-0^|a^3-|`W4WK1JPJp+7(f~vQvI=w;NDfeCz*Rtx0ptPU2W$s$ z%J}#&NIUQw^Z(VK|8zf3g5PH7&s_O4SN>zJa4X6EYx{Zs=jRH`XaS?l%HCh?=lw}2 z|16=H_nTdETT1#b3B?XSo(VRUw*d8fki0`Fhp=d;58R5Xwz8 zB>d-o-cLfYj*CnGlTeE4|1Tz#f@J!{U;B9hS=d>AWk2s^x014A%~$Ja;^%&z zR>ekm+dtgTJ3Snu{Cc`qr**RNYd`Oxx9w!7^z?Ww=B;YJ1Gb%>9D-2_ z`k#q{(8mxsV2C0xBt;mqJ`BYk21)NuE$U9I?@s67P9O36eqNtD%bq)m-h)-tz#2XCJT|DJ~cy{F*M{X9=$2T#!mPw^s8$v#i%Jx}yM-p|t&_161iKd;E! zxX;^U&)baN$3oP{O5X?U=UGSi*cAEL_W9WD`PkF@J`weOrtka0!Pgi z&lf|F^$^8+{o2oq!1@(o{rj+ir+e67`q!bNuixpv4s&=7_Vc2OUjMwDdG9rj-Y@YV z?C0f)zRCZ!pBM24+~Hi-_om|KMVtQBqW(4d{_CaJkF?)haWD*zjVV^CPAu>HZDs%p#Aw-?c0Oc@5-w}lH za4>2C7&!{e$VaEYj`q5ujejMY*gVEEA%+~>-sc`8IUa-m8w3eJoVgHc3?dE&myX6H zslE;uVYz z2a)8$h}+}fYjL>@@eiw1?5c1SKjI(Cz#$wQUpoOG2`BKwku1>Ns7;`3r0Y_F@oK~7 z)1w(k;+aaAv9(mlC_1zNbbbs5E)>_Ogq^cbB#uf9fW@Bqk%$;if+yU)?uYymj6^pg zm7=Is{HP`Uka%klS38_A7b1jUq8UjyL*v-Th^{im6u$ltCljl2!1!hVgBc^+UGbRv zeks`xQXVc`dTr-UNJShJn7WlLrZ#*)gOEe6AEe(%%woTt;my}vti@BO`AzkB~0cj0yOyqC}W zvwVMbntOBI7ddu$9038kk%$9Ov?B#T)s2h*wK1}WpMQRiL;x`X%41aTh#pY-B2B2R ztwGj+ya1&y5(KvnJrF3M>_@dsW-Ljits2V=7>RHJ(Ev(l6zZsNkxHOkM-qVw96)rQAH}jre>a=d zm|PE+@E+fu&5IhebL{RL1q&`bUv#3fFgl>aH*f2SOE16t z?V~J49vc^*keHO5lA0DWc<`|0=_^;QUb8l9-TH4fe2bqWW+L&|wk;2#Ou@EggO(55 z`Q5(#2M!)OTy*5nAwXa?WRaUcpe*fXu-+uq&&yN&a59e%FCOR020`dwgi)E43 zdRpgfO84Ar$?*{f*+<66Ssa6wH-9eGI%hLvkZ8A{&|NCyR8S_O4o3#o-Lt71IegN| zX!yLb_T`FcG{uWMGf(TDO@v9lqjB)*?IXo3=c)DgYz`E;b7}+}o#gkW%S-t5e)g`Z zc8r^v-#`;xGcI8X zRgilD$knJJhwE1ab-);K1vmi=_z;0Tz=nL>?b>$-t^fmkg-DeU`Jjmp2q9iV9)=tX zkrHMJ@QDLFNTCq(AlAa)I_3mcu3CdU34zwjmzW=T21Fs^0;CDT2}%KSz?*?6kO?&6 zvjO%9;0f@6c|Z=Z2kL-)AQ^K703Hwy>;ZTTo*C2u&p;i49B2Zl1Bn3M1bcuS@TLtm zf^)D50xIB*a0>87Fpm!zu>Tu@r}I%p)j>zjN=`{(r)Q)mE?@C!=m-^x&&1>tm`F=aqM1q2}(7rJBpLN)S4OAJrxly z(p-Yd%Sm2$SaS(#GnecN)WPpP;8)oU{E!JFTSmx?=@y6>ph!k@fCpd<892UUpbM!i zgasOcWEI&m{28!K@K4YSbb+aFvbD)zhJ)UDsDF1V2) z`}h3r1|}_o&|qppv>mr?+P=xLKVS-7n4z+cYI#qj<{_mUP(h z;w~Ao_Zm_`rK>Nvm8aTY7HTfI9iR4VzzYo7W5#~*{Flow)*W#B?U#^Ps!rW3ROUJAZz01LW+?-Y83PZg~sSV{C`(1d}wpoP-Cr^?vD zECKwFAN;oN6^zfbuJdL29$wFf^6bYflfdcum(nf zX$UUCA^{@s3V{O_0a?Hu1OUVXdB8e>9ncTtfdC+>031{mn1faV*?@bqPy){2I1J@C|C*tUADl64*k|CCmoYeVXhCzTn7S*Vkagx_V?!BMI`I63JN2qq zXDF$=bk*wysu(?;iZyHLD^|KIHhRb#tgr-6^~<7l0;2K+IdO)Gg8I4vmS_H}Gue<0CzU;bKJ)Y7w1LQydVdrIpM zB=(+iAeE+c=N(uwbIxwffyB8L$3p}PFL&w55hcbg7*$*w8_}AzoYoueD|}VlKEyeP zIgr@Oi7uhh@SSUrw#5JCJzn$if-dMl98=u-NJu2OT3T zEUh*j8}+Mth2@5*4s9kXvMgkuzq9A)gmr-bJr(<^=P{_xJ0L5 z;N<1ZInvgHtIx-qwlv}>#iE@n4>KEM?^$8OKoOm+xAe6A#sKxk*w(mJGWyu^ZW=M` za(Qx=W@Bv0ytn>0)#pg(Og=F8&z90zJ?z0)2uW5Wvx+N5BF9CK%ywLS2=~ zS&2!B?9{Zhc(~=y*t>sFm2F5)PA|Wx9cVPH%1)Ohm8U;@-Aq*`ZAa^O<+gSqZSvqQ>`mS33+`(<}M)R_*(|D_ys&`685KU>e<_!F}G*QRa-g@)-t`h(bX?B!H20EOwX7lsdR2&!4Um}r6yw9wPv0C` zf1vl+?&&PH-uaDT%z@tVwig~Q*KaEnOV=D^4)k8$s&5_X{Gz@pTi4U?yCW)lr&^)h z^R<<@w_1OOop}1|ySJJZ%0F*gwbb0_&8uwBdbnS6pZC}6ipdu070T=>IHsXWJ$zL7 zvIf3RH1>t~fB_1EGH3`80iXeH#QXtkP%YpNhydt-2;hYv0&oBTfe2ub0R=z=JQ6h{ zs3hnBG=MCaNP-SP6~YLi(+(_vI3hKG3DAu(7^ojX3M?Z5wKiDb_6S~3Bx*wjs0Y#k z9AIA?IN$*WJ0!^X_aW%>`o^Rl6phq_^%ql*{M52#%RYmzvt_B}8O`FWatHmwv^X}b zq2l2Fb?IEkk~n>CRO9>C!~gkA$+sM;W2?Bj2a0H z@ukCBX-9=5T7)elRtfkcQ6WBLKohWIphj>B%gEpi(g%5{Yz46g_%ieNxs?pK-GN12JTp6}-3KG_uy;F+WZb?E~ zR1$oqwgUs29a~2)RI<$sUnERmK$CtehE>$cG;RL*Bbux6AzKnnc?M!H_oH)vR)glq z!bxmPfhg0v)2o-7qw)7WE}zis^$$*;GoIP&uReJLoxAB@@9i zfg4Z{DPwRAtYP{UKm&?lMd9*DA_&9*$RwSBYyx)#@5H5|8U*70GidtMpHhc1ijGf6 zKp>wSo1XDktlxpeOR1?B8uYRnSicjO5-+DbebtQha}Vn2`;uec^l1jC=t7B4yltbW z83re`U@uo6Ou$RY~+VM&Qgbkl&7-E=}nG?fh8@RhIS=#_*2X66_WbRQ) z9plNHitFBHAjw`<1)FjnDiTXe#1q2fRc|v8Y5HymCF8_g=5*+lu*?`i`1@DWP`bnBjGPzCZU`iaIElBXGfvQ546tTfj%f;T2)CTpH% z_)3j8OZ?Tl^#I;BHpUxfyfLi}VFO6WH;N1nUJiu}`nMRgM(K}9W|Scqeg;l}PX>?x z4=_nGb|7=$pb@|=z)7G>l6Lg2knRzb0zXY-b|99t(|}uuDC#DHC z27oc>VjxX|2hw%>Z$;~$0$8JeU!!U?N-fr3EwxUd(z^T^ycJ(cx}4rD-Xeo~`n|NY zXo|OxXm@clcuQ>2S1-B|-qv-=ETmX0R?EJ;`s@J>u#rJD-`A^B<}J_F-L3r;isk5Q zx_XCrrQF|k?W}(b<;1(aeKLEFZc|zR7D~i-mZDy=4xXj;=W2Ge$aY${cS>}&>MfMI z@S*eCHj8ftKGWdsW$JhOojqi~GNsmse519KT<2@vLNRXN``J6yxf)fHUiM=CC3TWs zdnx;bo#tAN@r?AT z+5|O0E1Aqg08H?5SenMn1QrzF))2a(SBpIZ+(p9KCNyU;1AzeulrnH-nEFSRgL(^J zH_!&K0)J3L0FelyHu!*G27d&~OuvgkA%P(94H<=&F``Kz2+%Vq)NXl!1{y&Sl+Y{+ z;feu4umyAtgz+B$A`-xuNH06#vi`Dp=OTLiO9|k3-!y;!luujB>1ne+M<5nydrL}x!68W~CvMA-Ig{!i zBpRG2;<1f-@q@Q#G9c`DLC*E)Q(QAdxcG@qGJH8f&@Xedt4SGpfg=N4Y!kAdzZ-!%5w|(pQ1W7hqb|SeY6* zL45uI6JUhT9G^231zG}oi132>ii!0DJ|G@w*5aGR)B`jFSRpzAaf17UGC{ZSZ8CEW zKm)OXfGj`;>;lISMMxkZO8^ZB0=s|?0IiK+68Qn*WGjh48TimfGeArb2`B^Ezz4t$ zd;s5#wBf(|OHK2NCeu*=TJtIft>IzVu=>dF(8G z?))w7k&fptly~mFYyhSOydXiK11Ev5SkVYf9Su#>qNR$HadEpFfa$fNj(|OBMk)0= z@B;I=*Rf6FVcAq<39fuP8C;DsueXpjetfEr;Km?v$?)J&^{;zPc)h&Z=iO`SHi zZO{9f-f;A`imps=c#mkBjk-5Hu~!R?qAd+2!%lT;g`@|6K?*`qQ}|MWT#c;fBX91#aVxN4i~(nsqmN z*UQB(KPnZfxx;0pxu2D-tU>!Lo_=cX&~KLWoc7HjEhpV|S-V`6nhj$5Z?@8T`9(UTkCHyKz-_P@hT6e zGWDs$A_9@U_)Bt|0f@|Q9wLw)@PDIkp8*YE!QcQ!j8r>~pa5VIZTbuvw0lL`fM9e) z8xxG6Gz$x07sx>L$bf@L4Di9Yu>WTv!upu@bMs4N(yjYd(o--oYZsM)$MOnF3mW2d)F`eMyY4- z@BNTAbjS5)*Ue1E?|by7=#PxcPk;IS_(x-*vzLEx@cT7_w$joYkKgmHUAhk(GyTit zb@_)6Cx$BymAdp8GC_R@@vyN;Jtyx7&H<=Z~PCeHbK z*{0nmjO{v}Hg;DiV>tRYy^r}ix#)NP>$1}l z`@!pbC3|c+zuK)^T7+)rtrypM&b;aQ%j>OW-}d_I*WY!chLy(=Zpk@b$ci3+w-{>9iBhE-T@g?JueH-N)z|0n zkDr>^_lj_w?c7|+w>qtLMjO?!=LXuDyoI$b@33ZOpJ->wkz@3w1}$!12V+x1o-Vii zuJ#1uOcqz4Zz3>w{8l})U#Fclfn2rf7O_x|cV~HE+DFIX)OnLLowg%ftl+G>*wp1sF%%e;|1vV!)Fpi!qylY#oauI8T9i9dovr zuty6G@(U6{s~2H96c2&>Kl6d1+)+yX?Jzy$DE(KngOt&Jegg+KXTmTUrCR=&obJ2K zzqxWpxwHRnR+H@D@ELZK?4am&#ft`k`5eyJ=<-@`I%YOYSQ<>($HaWyU{)gf!KpZl z*3L5bm~t6Q$57y3*;i?t!wtaW9(k0XQlDXl!k+rl%e3g1><&_Jc~ zspUu$F>QROrJbG3hGxI3WiGS-9JN`b^f|~C7(2@)CqcB z=!cC=&N6lVrL7_`3i!&Q1SqmV>o68TDU1a|Ie?ZJOdty76;oSj2MnmBNTPuJjbMo+ z=uDsvn}U=b@Fwnrw1uHb5FuC=m=z=t@F>7rBWtYfi-{v<5)N$_%&-I04&(xfVhnGy zZuh@6ki^gd@1rs%(%D?NY{0*spilAj_0MR|PN`QQ=ce_`@NYIjAAtnDe-jlv(2NQm zzFom;n4r($nJ2xH7blyt4a}njimF6Inrg5D>9~e&E!ijC{@rm zI)AZ|e&WN8xwVPS$_g(p^hsiOn6LHf!mqmb<(tH8slU`-jJKECNa_>x9VWS~0*;&~ zD7KGf^Ju5S`nIv#x%MH4-34Nyy-3C@$<(xshZ{~_JyYb(F*aPuii}~}#y8hKEHE?? z1PhAxKUcT0y4ggR`u?U-!Ij*M0F4UXvHM~)qk?O9_0_20j%5yi{`f0-bm4B)Z%&$t z!FArG2CS1rG4PhvIPZXS2d)~qHaIf4GYAwhXiV?{d4%|ov=D#+8i7(k6vhn*1n}^! zlPPm-f*@`nwocp7!Ofws)U1`m#;>-01NKPp*fe!)6ge_1z@U-otTpNfkflgclQxPO zn`VrJFG!Q%?}aGoSQ-4Kj@9gc(6L(d$&OVB@J2Vm+lgj6RwYe3R?&RH`^ZUbJuau( zJI}k=hsD0z5O4RaSRHJlrNy#-snI-h-#l5RkMA-qywybYtCZ1qVmSWg;_g*S+2)Q5 zweU7$&?(A-in!riOl^tV?4MuXH{RkhnM&eDTJ;i-p`OWdXVwoxjni9B^CU4*&#Nue zwd&xFZfle&CPw`5Xn|v=8>d$>E61x%lrlwZGS6jdw9z+32h@18H7d8#^=P~5Ix`Gq z)pD-7V^#EaLD};0#C2Alj6MHikmiw-rTSkEc&>irB^f&*5|&Km^-(;lep=?Bi%0K!gB?ME9__q+tfUFi2rSctnj%pG><$2I&Ghz=4vM z7^nc!3xx*iA;~1?CvYQaCezDi@=8X7iCslNNutUBWcQ1hP&rI!;$JqQ2jb$A%06R4 zOD@KiB{ge8{Zn8<6Phuh9-hurQxp22Uq(yzp++WD$!&GQ}ya1dc75tSyFknj508t zYCfvQ_V8Qv7~xkl1&)9ISsB@tm8#3`;U$yYIl?>-b+~N8MqK6_{ca8;S#YlerGMUD9}$cM(8w2XXSv_Tl1<@+z!Bm_WU+Ukmh+U{9d}( z!#u|x9!1~XTPEhY+=mJ6K4{rxVg7xK6#-pgLR&g~Fj^HfYWjoK!Be}BAp^gy;e*^d z0;&0pkqU6Yzadt@U=uI|n8I@cyF~HGSO@v2;p>=zUos&GXkwU2t#zkPlA$Fs4@gEN zFdqT!1-5`NU<*iv=>=GUcmR~RToRfvy#~gAG7UFS0y@zQni(5Rut?O8w8B9fP5W#N zMoAINAeA)PwENU#j)Qa%{$4R;Tqya6ze5|p{s-Ea`AKb@)vPxD*o-#bXrhhDm4=Z@ ztSaiUk2h>U`+3#!oyx_b@|ZX)?GZ*7eoKnao^&Rtbg$NQ{oV<+Zf=><%94v(%gIah zA|yVXWWH!~{c>`AYso_%PZ*xT>~poy?-(o3YU2}DznmOm)RJ$^)r%4pu4M*=UpvfZ z3+%jVEAt+xUjU1m82vgxGg4)n)8F!lS{rB0JkYK}{Q}tBuE$%nm`Fw#$F%+0T-|{F z+J*>T&riaL6jJ!c@x22*fDyiQeCGJNnMN|;1)SmY2g2Ycfjpu#47`9jU=gsu;2#sw z;PYq144-`6=wNr|duO_501&=(l0QRxn1&dc00#bmZ+!9)V}Kag!i*FVHUeb^RT$MG zQ~p2_>?3j;GU9>N7y=z=8^8_RU<8T`Z-D@=e1920#FS&itSCr6aE}rbLn5FAWJIV< zK^2Wa@YjC{!K0D7u>OwJ<-|WoUCKY1y4;vS_4IyWYSM7HDOK2cMnQP3)Q4^|(VO1l zrzMRidRLx~SQB~0ikh(0tvbj4LWVgTuf<4X68J(P-#O_@sO-A)Aj|1jl=r3wQ6qOx zH9UVn)z#1l-obviEJnup1uWwS_H{}UPbc?yv*>oM_8J_-lu8F$IPKywEi2AS0yMJl(=-qj}-)X&vC!TJl z?3@_jN7EziGK(oQyK+BTXelmn;0SAPeZ`j0XH0b83r5CUO+6Gkt;C*5U9N?1cGp|# z`Qw;@5n`TR*PzHzjxE0DRhxDUmY%-hAl7^0pV+Ox%LBFG?OHQA&_6&h(rAS5k1V#n zGpj_`Zjn$Kp%)QJoA=Kc(}tS%?)s!P(GT+h!ykpMEkyFyB0my9CPhC_&{0G%om3rZ^e6f->>-1;7Bcb z53lEBqSfudQdNswSaw|dj0Uqj=Q&y z7u7$$sTe{B6)IV+BG;DMv!!COrB0;y8dqm=pfZ8Gs&E~B^l)OlaIll;6eXNdnw?ns z$AZdK_cNM%K1GEO10pETsu+hJx7}kVrU@vA<-@wa^7)=OmU3}go+?bfr*YT$Q^I>V zl$_#*1cWuvZmeXH3TvXSxhhOJHXf5qXNr*+D8 zm{N)#ovv6~yk64hZ3%68>e}PY%ZJ{~QE14fCV#bHy~Mch?}}K*UQ+3!8FEk4rv-Vc z$2aR9y19_=YQ{WtQ!uuq19Lh0+7A)r@y*){p6+zLzO>y7)#IBl@WOZMi=t--p1wFz zt0yF#Bs+ZEZq3GK@7~oiOhY`)XJ|&7U_Rq)z%<|kLNzC$zLqgnm93L->V##W%)IAoXvh`bc<-*5xmq{ncw}X@`F4lxqxP`W4xf0M7XjJ6 zbW|rtUsjN*u2WWYrFVP|#f|im?U}@uwf8GJ;I)}UNsHqQRW!4w0nKzQNlg;x2y86p zbKUQqeJ1Q^lqgmz+6B4jm|O3ujy*6d?~v8=sfr>^+zg8^mG^g+h$dyuTu5h#Dn<0b z(dL{*wMhc+v#}?+9#mFu>A*xMc7(6BY(np^en~yG@J{`Ly4+RQqnM>HtGv@Q(SM3J zJw{MiOj!s-3AD&2(?_QBzUy5oIJ4N7)i3gKXp+N<(n_X?zn8JMkXI2wd0nAx+CPho z8Ix`<$+;n1`^%R(pSy=5KL5d*kOfa#hxF;e7Mod!-=4IPoU0VGQ&uTi z$!w0umfa#ud^%#rUR~KY9!u*V`L!9Ebvb~J*J-)Rdy24|i1KC$BvjiKuIjf@Y5A{AO_U&9#{?kG+35 zb38FNEmVx-k1!&$abt|38`Mv*5E#CysJI0h0{Z}O*rA6ZLFWmvA!>Ep`qVZ&i0>G; zgUSX44H9@T0x4Et6+YvC5JCdI7`uRT0LLMC#H0pd{P5{>Fpk08@gye%5kG3%Bot(% z$41gc?K+IHMx+QsVTbAp-EU%wz?hAE5n>Kfjghbsb=apEimAQ8r?5c8|DfI?6&SHS zFoc9>KhH{F9Euei7t2meN}~Q^@A~|<`1s_{?P+~?DeiJ|vwK>F!+Z97Y1GV~)~SV( zX7;o$ENRi#sPUfGWNu}-ctD&H-D_#cRZ3>#mR^|`ywb`4d#cTv_wI5z74JBdmDIj- z{1tr*hwZ%JRr6)k)whPUhMh z52yT3db`QJLM+G3H5l_c=lt5vFUONTE!9b;o(JOWCbgv^6`tAV=4q!oIIzU;1^iXk z62XyCX)%6dF8W$eSp59e59ep9$2?SfS`!Uu%I2cQ?Zd;O!-&Z*E%CuHXfBp7at1q=)72o@YLv?gN*pGg8DbAm2Er>kBaw+gDVMUlL zCeeL2Or^f~F~0JQnNCQkLrS~7k0-_VdiPip8{VvDaW=N76@N@j=Ih9G+PTRoeH*uH ze7a+YHrK5DvSd8R5u-lv*Z8fO{%~FR*8GR-BPyo! zM`Jh`Sx_kXabsOZndqlg=58-2(rZVBO=TFz@@Z0V=Tez0c!8@q*CHtEQIc6}&q2EO z%Oo>*?t!r(j5D)S`!4D#>e+!KBM$2xZue5nI9u5-dwyVE70-R9Z&=K4TTokK(Cy;R z;#x1aSEtNJN4(;ku2y&Kzf=*^Fc4F6^TY&xLBc}{DzFkr3d95qlRSrsabR#jUSO_9 z^aL^j@)7cYp1@5oDX4`A-~n|6EI>8b3Oq$BG?)%h1`rPJgUdjKf@~F>2;$S`L6Fx! z$w#D4BV+`!L$(8k0u6yHK}?8rz>=g$0}~Mr0s(2S_@D+OnGfiaWIl``0{eh>h(jd2 z1HS$glY#^pGW`@isfdYU#l^?7aTY=T*M@4&XD3`rN%_nIX~Ct0PY_di;E{eWdCe?r zr!CBEZee>-3vQEz?UB0t%3{AXOM6ynKxrwL%1t}vPn|q9K(@mrHPHCE^ke|qavm|J50`qIQpZGQla7}0p4=m@BY}Ulw}y`h8Z|WIVX*6 zOgLY@id-#U=St;zF11@{GUYcUaWFprPFHWnn1742zEyJ~l>E&PGY%F6Qa^ZDB%(gQhc3tUjwlZ|yL9qHpNV?}Pw+3vcd=LAi~ zrTnvpxsIWynEon&78mTvD6Ey`tTzAt*>}YnD|BG*=_sMb3e9{mw4%*dnu_a8>d>O2 z=jyD`j+e)OU*Yqz^B+97S|!ISqIUmBpD$Fz^sM%zAkm6cW_2sLV?jqt8#iqjpG3S7 zh=|~>Dd&K)5Ge!WV68?p1tMao1|&l;OI%kYdeJV_5DfkEj)%Oz#$-T*_lPIcWob0<(O&)B zj9)g|tIf{%y*axpvnS0qYck{a(!wB85PD`={Sdus#?SQbnT+=JgFvc-&eL|R)v=19 zYl};BJZy??M|YycGP=dQLPboBIM${&FZ_~E=oO)%WKCDDVE&Aeo5HmNAPe2AcXB#T zOYsk1?+_DbA!w5(F_%#pI_~~ql(KcwD3hsMoojyURx70vOxkU{a9BN8J*3F-%RMF@K3R9l_I^cHT}bZC-+KMYA(Yr;qtS^bkYJHww<@a zn`OGQm(jCw6Z;Zf{{G&lX7`YtPjF(-2%c`Ubn%CuQ}}ty%1$s>T2`1-Tz$7%dcjNK z>#JN&ueo9#J2+Bi#SIG<>!%8&;@MBTnQM`=wAry;p8e~q!9Ed` zjPD%eKFYCW(SZpToudj*UsR>dN!n@iudD9$92{JJRp9G6rG#zdoFmt7u~aCYX&6yS zTavW-VS}{!r-*g_W&r{2F~XrMLfI?>Cncpb-R5wGflj0}Hz%!!o=d81LCq7AHfQVA zEH@TY_CAiiL)_c8j`jM!W=Agb(($Hs=QWj?fLz0Jr>C=!Apb5p2pFb4&v10n&_z}zk--EJW`g-@mX<)DjhG3H2!GVb9KjjEvJq!Q`e1~U zNJ0dL1`m;KH>K+XY^-WSaV>`{)jN-13BC zu7ic8Cnb`J&GZH=b&}kV8T4bzsPmNQo^bDdzcrm^Ub~>VmWuW65W2HxDc_cAlPXBv z?&@Re_ns|UHO4tpFv?^-JH;zJlO;Pe_kPN%!G)Jp`wr@ZCGBa?QME7bbV_BJSncEg z5?ZOt(YK5XQUoYDRMp4%?j@GA+uZ)to1YRlEzSEdts+*y90;=1Rh%?@+I_Opo|cJa zLY|Z2nhsAHs7&FSXTx-Q{xXpYEybg`wj5bbid)fphbSSLpP7DtxqqAPDIY1p{qoQO z)TmB!hu#WV@uV~*zcOvAQ(%cr(AeZDYs9WhA$(xqN~)7Wc2b{?l2HNU7b`}Yk8-o* zaLt@O;!OJTM3f`#?=IJ!&i`eaf-*=MyKZ(}Av|^aldT(E&93UU3@@b2I~@ACijpqg zqs$xan!_^F^HqvDPUbzPjvOcy%OiK6=`nL>-vzFkr|hTNtjgwxiKh)89+v5CoRLeh za#tCApS1r*8+9Rk=>E;O!v{Q2wG-M!-`p_p#ARV! zAq>B{!QpqKx>!NqYb^-l*h- z{Uk#TFn7=e=m;YOjQ7Nh0AWSK_Lz^w?g*a4ohS{*wJ|K0?A*B%8U)dS^gwr@7myyt zlY-|-n-W4mRx-)#t2XB|K^$U3Fh5$8j3*^JMVgZ2q9?AzK(kPwGqg_}t15G=xe)Q*I-F&QJo0xG~<&&3f?r~o-#s4a7Ch5$bPvOr$XN z(z0crDTTLPO1+%XY(^)M>2dW2ae|#ITR1g5n_hRe_IFOO*Q;!031!$q9&%3W9iB_y zczx6j_E$RfOJvVu*5T`BVn+mj#d&T}{&N_mh%Ki?--QWmxl?2Xe3`RY$KGvGgnOlO zKCpcHmY~>$a3p$+%}o%#nO^AzQtJoE&`5E zhK-PthVHHHZ`)q(Jnl?^H8t(B!UP$eX7FdpxILHSFB^$_>ujn}E#jo98s;Nme6g%EUxo>0U%ayFS6K0iRF>>8umX_U77<#mw%$u^dlk!;Z z4&sv{o|E8?PiXEQE_+bskJYK2${yRyZ)I6WP5JjfVzkfYLXbx9ux{lPg6#*rrjTH$*QBK1vUAdT7~$?zS8e5X04eM>UY}QBB+*L zKlArOiZ&1^=^UwL=}Fp7X8p8ae?^b`+fFf)4#W3mW5>nWvM#|((p!Ju@PSZ>7Xny71Kc=sTe2@+(nEl zVK8Qh0;Ult2F78JiIs(kWdM#9w?-8waxWM>LTJQA|C4?doCB%^abb%N1{<6P9@e(m z;8;)=I11dzB#XqRHXY+qu~~Hm3SZLNBrzVi3#|ksdBn0drDbpzn3+%(b9NQ1)yS3; z(*E~Zwg3Ij+CKr6I{aN7oa1QVd~WbN7d_+T<_5p7o-NBf(wuRv`lpTSRo zkIHCa)rG1|80^^9{+fT4iJ~UCb?=N^XG+FeVKtJSb#8BxA79X{aUJwVAxenliC&9_ z_*Rzls2SA(R}_{?J+6&BBz(D8LbtX|5)1bD>nCpK-(O4@a`%RvPwg1EtI!gcIyqX*b>$KmJM0_4wFVrf%dts^G>b6v7yJ<$s?(w&n%a)IS zIO{_x``_T=MvGoWyf@!)LRw#u^1cqwz$`>+tw#w*S6Vm<wlF)yT$E~rC*x}LZ~+8kv!TVZzPMJBNT0>eR3Cwqqw|U+HQ!m#E(~tv{h8K&YI*gDQp$g z;n9YuYttWn+rFySn?;9ZCKv?s68&^%Oi}nuHVu{(JBSTJ?**oF#KnB)RiPm{sjTw6 z^k^oT$aPq$H0+Q^oz@$0*v!s4bYHpLEVRS-{Y?$r6iSv;ubWdx_7{lda}Pc&nz`Gr z<(Qhi7rWMtri`05vdcx8cx15aYhUxg!bhe0ZNkRt+TTrR_ngeZJv-3u`rv`}9h^0s zm)`Xqoa@h?8fiK>&kCJ*eSfa4Gp?qmh4-vq^|W62?A2LOqT9Tg2-H=#;mv>&w`jBPe1`13pSQLQ+UhpB3fr(vWWuYA~nMgX39zZ@I6J(N?beX~MVEaa*0M%eb0YX5g zU(rX#!D>RAxcd$(+o^Nk`3n|%_3$ky*tIP$?@q-}u(d=ENbCwxAPsJ9i;EmX+t4y0 z29vNt3z*ae;sq-Ur%FyQLKn1K;bg#FTOgns%{H2eMl>?Cjod6;I($165K0H@juaX0 z9g+tHME9H=yhn7S9dtl1pgWKZNFiJ<)DU?Nw1%ANhIVL^+yDOg@A?VwKTaTp0cGl$XUk&9iqU!IV)~)AM z1d4U7Xx2Viv9xQ+O@p5(@#grdZw#j!mGddZ7fB9X#oqiC_v!P|CO4+`vwVJ= zyVSVv#zTLQ+xT?>vPT;wt?L9w$@S_+MX`38B$^5%55}^EZ=^B2&IVzWiN)_ywhkq& z@||a_yuzi-Mn#7vux8z;N~Dkp2M~jDr30(O7ke|G^J!79EtnAs%7Ws-6ih53@AwtTux@415(ad_BpnFZjBJer#K*(r?}Xft16s z3Q@#zZBhy!tO$&v{3xF|6Y-|6c|G#hChVGyKD)-l%jWQEeKvf-l8l?i6-s%u9a{GE z4Cjxc9jrdlhh?kIjSrNY8+lf_7JT>pjHg;A{^C?8O23`cLZ1!&t|dEBK~a>F?IaUy z>c_inGjZNT%A~}aHTP+I->R;v2|_Zi{LOmGx>V+)*GZHoiW;$4Io@Ja)va3zL_F>A`JCDZuei5^WhlJwZwh6dB-S^tzBez_5dl zp)F)yiIEi4A29xiSV%^WwPWlY&zc>Dl}aq~;|vQ449JTIC<{pS10f<652TDtPC?L+ zf~CJwe^Wj0<3h0aEiB4T0t`(KrNzq~j141mvh` zn1Ta33_T&5i8=#n2|Xc#2~~lLGQvWN52y-Ml+0%_Jv@jiBn7$(C4nOSUG(|C--rAJ z>SRRqLZx>M%hWZ%OOf3#QK$ZxSA!QS8$T>te;V<-Z4I9=I(8_s>g2Y;pOca8?QaBC z{g60Q>(og7J%Wg?vMNe2qfk(5>7ez3k@~FmwB3npCp0?e-lLf#q#Cndm_1-^pY&f3 zysY2yL>tm7uQX?qbytU@qFF_Il-;P?QKHiRaW*byEdEEnBxm4qr?z?mNlvx3|?9 z$Jm*QJi|+8>264_V%SN1(ZNv@~nik#7$;QKQ2| z0;3+`5_@lM?bz(l38Fx`H9Mx=F7F3}n0c*-?Q9Krm9l=E{615-y6<|&_{H}P611iI zy(!!gJ;*dOMt5?=H?<{(jytquWbo!MqbQwjxuSkb zo=rj=%Q0fy&zHKtTs(b^qgqDZ{O~5_k$iK)$X_feeKE~7;^ixqCFU-W5eXwB7xten zpI$E`1&3#K3DT005l=4JGBR?=JK-cFBX?~N&u3(0j#@^>13zwGKt`shWrVp=s2y4{ zo<=zV)@NdI$j-k&{7hW|wLv+-2o%%+8pVX* zBqfJRKyZj4pbkOZg4Qq51k@g%mjzS~jS38?LDMM?Qlvpkp|OxbNCau7LL8ukD5!`S zLLyLZF)9HKLD8kH5=1Sb6%b4^fd<(mih&{o;tAbQy{@%$=l}Tr-})0^S{iYG!%Jby zKi|@LqUvZg7g}9Bo3Xsvahe}30-~CZ)67G+wb3}uw!CzL$t(Pc`y|;2 zgU+LlmP;rlOW1XTk;21QAT%0~WhCT`bZsrwqaRqvO594Oty1n;4A79}{s)ji1-xRtv) zpQpWhrQFUO@>RjCOGSa2aT>e?Tb56^{V^k0pI^wK6Zw5MToZ}eTn@i&%gQoINICMR zr3Ny3it;^VZ06Kq$Cz;%OTNhhK9)BrGjj=-wl$E_^f;k3n-=khE9s*a+hVP}ofL6# z<`a^#r=GCZTq|%tbEDcSJHlMHAl+GLOZiBU-L(pFA7yX*B6x#Y2dOmvrbw*!Wod#( z{qknTzU8dT;W}b7%QU|@lgXyq10Gjg&XkmXGo&o$58 zbGTeVO&Ihlj$^vGDoof(R4!&21}V2LKYds%=I*ImblBVdv1)l!wdkPtIQu0P+0VGQ zvn0vT?Dm*shwrX!uOa(XSaevM9<4j`*`Crm8Qbpr%==RRcIt7Oie68RG|QXqX1BT7 zr?Y14SZ{0x&*!8XnmK2vI(#x$(fumWy>Ih$4<5&>gd}!CU4Xea7=GLx0f`e0fMbVC zCp}N(J?L8!Nnk1nJkW$@1=tx+4}zcx=b}ph&V@ptO+n;=%q2rPP&+^vKaHtM9`ohg#*zEbSj885Me;6 z#Yh4~f>8y?3=sp=3q%75@BfeV|E(;~{N}2vfg|*fRLEla#;oAKCwyAq7VIAS`S9ti zN9)Jtp*IgU7d~wsKeKQrRm{8t!h}!bbalc9SGqr}XWP14o;EwCmTerT)j+;<&|E)DJ3IgVXvXpsk)w=n?Z!*`X!S*Wm5t7{ym302 zOTPN$E_0y}4{x71B4(uvyn?>uqkja_My!s-n;?k*(_>m zw5X+VVDKJEtZ{!Yd&+WBUe(gN<1m`_)%DTU(`hk>S-^JajCDm8l$%)%v^0x^6*S%VBOo_m>Z372fA|UGU_=TB#;{>TmYAkj)iQqLQiKesC634!tVHI<1lh zaA-^a!eZXgaB(PYNV(sq#;sDErUow#y|Z!2pVp6k;x=lBPvg5?70V5HR3x=w_Iyhv z#WNT4Xjg-eQWia1ByGp)?H(j%4NcMUv2zp)yjiMfKVjS+dCJd5_#|cGPl?-V}H97l(|W_jt|>w{)Bu?&hxK8)e8XN7AQfDnp-eleg8;0;H;^6alw<34HTOT@C6+T5j+WAXG<|WTNmLz=)1j(^SbmZu< z<67suAT~G9ed53jPPv#46J@eO+K3AKvpn0l z7cb-mj8^E(4tgasr%$2T-L3j@6{a-R&FH>vF)9QkZ z?vok=aTk<}>GptNfYG64leAej?%0Wu2VgOWlZ82Ll_ zgdPmU0?NYZ1^O|N4DyUTN-5HkK|%E&rpo`H|2W9R-*p=-CGJ8}(z(l@y2xIBA?{M* z;}N$@50gA(x6)Z_~OBb|kvW zgsPQuIYP6R!YK#yF4`DbZ+(%O8H4w-JFl`DvW(%1;?C9DidSXJr1Z0(j)vv~5AXF2e0A^K*PSH50Wlwt~`icBfc6Z+J@kk@KZ!ov(5ibM*6ym1zc&!X(!kmkBw>pnfQ|&!<5W>ADZO2=1}0s>C;VERG0fApRwtcUbi#G8FVTUrbd0(;^@_% zOw6igqMnqma#+Ei*mI<>yMzVGbR9qQX)ty+I&PR{kHZiDr$Ha);J+s6$)a{MRN@~CR7 z{ZaK(gSzEW%tRf{Rz7!DEsqYsR(luqn5+dDz-t#h z$_8ivs2_rX?gP;V=CTH404$GqhP0+hSOpniGyu6hm=Qb(%9}BBF0%LdgcLmM00n}m z5b7tq4}n2#z!V1HeI`<3NFVME{7#Ai2nKUd3>pTRAu`Tk_r>hot>nn#qA4^L&k^PFWfz(tg&c(;sP^VL`v7$HSu?ZQ*T*@n0zzJRJEH{XB zU(rP-+BM;0aZBd;PIS)a^fqZNaSk7}mnHLmhUC;^0DL7)}7h})Y^xBNVu2AmH6odaSFwj z^bPEH{l4X0t3~zuUBa@>EkiR8jh4_t0VN-2BM_gVom(n=X6W|PQJ7Bab%ipcS4B@s zX*av=_=NgHC*s+q;Y*t+o9 zVNPF_9ny*C&7NDuo!rrviV<}#R8I1V;~)*Qjqncnb|EXXZR+$k+aKqob**{4Idf4C z4`B*pXdF zyFbxX4&v9hm@(O-!$ozYu$C$**aRu)-dGAiv0!~v2P8%(4GAa!Bm(S+1_Sf~nt=4C zktRS5P%@BSbkjyODF?ugphK`DNG@pP_@v}Cupk~>APok{0%Qlu0Of%!KodaKqy&Ig zKoAfjF-Z}M1#M*@6R>2GiKz&n2@nTVH>6r2168CDK!XIrMRFvf2Bb`2nh=nbMwf1p zAQ4$;R2@Ji5F(K>hm;AB1+*VX)J8fAC=(z8&_Hw`paZB8P#{1App8ToAqCI@lt{?U zppgFo{`=n_!TbamDUkp5eY&lw7nd#j^r`&o7gNhJnv;Tg*4u&CEHieY`E%MVJ23Vrtlqugz+wUX|`>Q^2%hD3cq+kSAjL(C-iK( zF;(icXZ^iPrj)8Wa0^Fuut=*qXmf6D{EzySrQIwYS!$y9DEdvfU_+vjuVG6!zP>V* zA}u)P)k{4<*6BlJinyiLib$x zeWQ_qtz{P0K_-;JcuwTRrN6!HmPAu4+E&GBs)NwJi|rLHzj{GeCQ-DxRAz3lSU~X% z3YIHVb&u96SQlHH`q_>ayPr;JUn0DhW~;U8`=$S@#8wB+nk3JdvYe*6A1aI)8!r@Z z9-ACq#nze3AO2u@CrAs^bd`pM;a!1uQo6b5czYwE{0zfvD`Af zb)=lL+cr^@-u-Ww(=uE3o$9{rtILb``0?$9-cxPFy+ky}G+gAo#_3n3j90vThU@n2 zYu?#y)kwk2gbpSPPI0a7OOp6p_p!+iXWRVtRC76a$M8b`F`DY2vO`?^IaR7-o^_Xl zkET6kE(d?L>&WFBn(Dx>`l*qoI9PXGNgmRLgO8qVId`- z=iZcsej4mJfNsb_Beo3AkRPXRRL2R-Ok5?WgqcaSuCcwdKoXgKO15Kw+@Qz$sC>~j z$(DC^npatI>vLAoCf>&`RIO>7lz3VmA}WlmE>5sY;->{u)&02C;HZ!;#Zv}U99!~H z&otmh;VtGp`OAu5?o{PcCdF&}IU5wYCh@3iox?ao6_u_P4qVP#v3&E}nMe1u{lRF+ zQ9Rf|F3NoAbm;k3C(K>yJ+;%B9hM|0J`<}nTzcY9`{J`Qec#$i*URqwcE7ev{nQN> z0@lVF{cwdc;`q-MbED@+ip_XV;gtSL3+b&n1H)+!tCxASLayI6?=GTj^@ANte(zmk zLyhtmCF#0^%SPLCyxv!j^pPrMrm=;ObL=~1Fqii%&qiL(;OxpUmw5Eb)gx_a20v@{hca@*Eu#KS3WKdCo{a8k#N+oC1@%Oeooq))k zZ=-9@wWWIR%GVfDkLzs$yn4Ng(@j{VEMB|HdBu~h%hmVGYw|@yQfjsr9H^<;QF!L& zvh91Bi!yu5nTs+TYi6oPV7j)uyQfS&0@L1C9W~bt#P0%)xHg~>PzQRBfE)Z65PInF zVce5}w*=S$Lx2c)2Q$FbF@qx@0dNA)`p-P{1C9cOkyU^|z*Hb8FcnEDz(UM33&1Jz z36KT|htL;j>i>{$w_6h~1)q-Midqt%)r zNlMw0Ee$D?ElDL*qa95^4@`8wt*w<6k6FZb4XO-%RB#>fA3DA>~>b=|su zzHCQNbx3zUd$FRjs=DSz;wbF-tftGj2RL>k*>ccXpa_oI~)FQW$$ z!>@inTG_fP;0<#fgDon4K9d4XdxmP)?qc!lB%NLI%)U6Ife5P zTPV3JBy5#&2}`@K{q`WqV21>iYKg#^9!fHkK|nZbEDNw zbekpug~$(Ic#!m}&PGT_R1onK zFMd87ja(fy8T#@OmU&59p6~tr%R}0;B=D02@H`fMk%f0hj^UfMlRc zkl64>t3Y*Yb5ID#ZNR`S?_e=_c)`1G2S5dh4UbhoKEM@V31|crMG#K_L%_Rx2h0JW z6qtjBHqQdapza5v3P2h_mj@dF7{mbpHeN09M_ukGb-=y=v%$3nJ2snUA0`?0ax8R`EQeiZ{GiqBvioy zf8(A%*)Lgp{4XtpeFnq?oTPXd4C)h9c!ea_-;#3X&Y3^o>%F&x_WDy9!g2yQH5LjZ zB(3fp+WnXFBK=szyD{A|BxOC)c>lo9tLYNp!Jdf+pP-mP^nmsf3K~4F=qKE+TUhuu zeGL+DIf@UXY8-+vTAT~GmYQFeA2086jzKwwO=Iu`PYPMF@{Y+U@a={Z!$OL`njSP z_5m5y2jLdnbCHQ$tXzSpE~~Z{VLxH_(SaqIqEc zaCm(HOzdAA9>9~g1{OFWo^F2}i2r`m5j0AH8iD+P}{eN<8xiB#? zrTd?Id-a_O-6?<9+Y3LtrcH1CzxVcR+)yaVfA8%n91A~1`D<@4JB$tCWL&a>33xF< zIRjsU*S~-%D#9UCS`$zb7OLL2iMAy2^G8$_+Qxzl z0S;D$3nwDKj6mYjLPF7n%GP1s-3!;2L!4xdxz|wqumIjG%r9(~cart$f#AjI)8790 zE8{opg$9;>e*qQDrNS=#eFyoMk8^p8y6)+C;TE>x6sk&9z5jJ>Sx&mhNb~!lJ21<5 z%1yi0=*OWu@B-?c#BV3h`vHXLzwwSh^ert{c`64Q1+W3Yc;OqsU?Cp`iUeK|a0px} zAQpfMJPJ@b&@^BSFasC^C(M68Ue5UEv*qA{A-G%)#0}y#;Nbw|ARq;V19Jc%2Oe5S z&kUr_084;6K#oT{@WB9hKqjDWfqC$#29ONM2VVI{)zbu+4`3#M6#(uW_%lE_&z}JZ zdDH>R0!#w{k2mQCF#Fwm{ckDyAO68l??^*}wehHw)Rg!`8UO7ZR!LH4TG~HDc)2sF zJN54%{Nt=^+s?mfu-j}wVg3d}p=0YexBL~teUrTiX;E>42968yBT4Iyayiv!fAfyt zL>6UK;E@clqN$WvhG@f7`^pR2nX|?T6qhTM2IXJMnYLUSZ`q^mD6WzasN5~rmPApbmD`ig>|U9 z$PfqXB zzYs^{&uw|TWS>QSpTqi|yuKOpH&Q+x{KGq{xGgcO{sH0BRO7y%=!pWc=sX7Ked7C< zx)BIW0bc+d;97uB0udxY060A0a)3JlMjwQLAR7Z}U&zLQ)A~JO0^a3skC=n=gDbD{YK2kQ%pWf z-ThwV8Vc?dIv85-b9ur4RX!!j2pP*z{I5|U5o`rS2qLAS8A^X{l2BX$S<{3Bw0vg_ zxQwJBbz8 zow%0(&ewkfC(t*qNb*~Jn*Q(cDK8)e7%T*&z<~jYFZd^3ObR^QLRbo%C@(SvKms^_ zk57TPfh_=>0{{R*088N8fCKwIJ_S}|AtnXp0}usl1h5PL5`+RfvJid(ety420D?_m z4nVvKf=yne`TuU1`QJH69-JUJP53^a{67g!+Y>udQaC*eRh5AUgG0j)7pf`^9f@7Z z&tL!h;8}H_viDMm)$*@{XDS-hcv!0DU$?w$Z3V55juXFUjcqIZiF^`T_9imDRW@m| zdU84gb${`T@3C%#uqQ~Gn7p@M7!HMHNIO=R{e<%s2u_E>*(j-%d<;n0;|2;zxzqPs z);PN!i`0gCSyUv|3rj(*c(mXbzrJQJ5kiwBz5IxDFHAN+tiIqEuhf&0Mfb%vr?1St z{Hv&2e-)vkt{{WIMoS#YPBH&=zdYq*n}07Pg40kXWKa;1-A{iNb(!z&g9-Vi4qqVb zkLUTp+%-C1qX3+|;B?l3hPL|!r#*_b-+nx9j~|kBRiY} z06zLx0D<%4l~NWe9{{n1U=-+?7oh_60_g%&dCeDIX@pn6Uej=u1A|J!*s>wB5>5T|(e%}}#~ z-oGi6o>dj!5%&*eQv2;oLNpTo<_yUirdqOk0a!v(3hGAZ%P;WCq=Z7msp3n2eQ*F> zu1DVd9cVg&Ph3z$6jN6}_-yR?_=|~`uK>^#1V#)N7Q#I}HTn6=*KhL>IFv&QJ7$5w zVl}$Xl(McR;&}TuY?9uIYxr_r75zC$y80c=2vuNbbl+ScIz`j7);D5dZs@3MPnx-_ zq+dr3FVYp>eRN6v*3_=rubT1i7y#$Qb1lDSfO;kuAv8`x|>8KUJ zRHs*_+Mnq!`;gqdin9r?*4|P7DZupvh>*dEU&GVu%8nZ3O zx$1L z&oy?+KNlF1*RgQ)4c(ubcfM)=Oe{xevF=JIzdz#A@^xRlDtY}?SW$14^TwSUd%i|A z_dI&@O+-n5^`_$@Hirr>UcL4B?fk8tNAeW3pqvGhP}mwzMKAY<4T{>5B(=Sp>TK^E zK{$&V#C(Abi#eI9)uyl93{Q6))A4E8e|B88E893^uqnxCn`pLK?A#ZA&}7Kw5z zla0^zoklEMwOL?US^rtLb5&Y9mYus-?%NpS?h5@V+5fnnIR$M0^Pdu5DA|Lo0Z0~9 z3Zw&^8czcS#$_bF#fB5j0SIPij@LF5I_5<|;LV)?_ zMQ0$N0?dFK!td$_rG^Fb4-~%;uK|+}Z~{>qFB##Pd{BZ1LSK+Lh}RaB4FvtWn*Z;# z@&DvHezn3-3EHNn%e8*l_qk#{q}!1yGL`RM^uLz;!^V4h zy}(d#EeKTp;#i1}XX|8C=T-3=b_*H=CJVdIA# zt6bLR{kkL`YY}Vn^9J4?52p>ayi)(eBayz3z$suQ=O&ZYj~&u}E~7X?gV>Jmz>s2!I0EAI57%Ed*hJJisE5{{oJ{r2mu9{{8ouc@{qX$$uAiME!@b z!{DF74lN`CAtX|SNY*U)E$sL%$^1eD%wJNfUf+7H?fQ-OpWWH^#*!j7>ejvcf94Sk zq%a19yUKp@BkbTkU^$2s5ERG0C_r@VNxPC!x%ZB$_BfaZX7fM|fWfJ8tOl-DH%Q3VLVc|}@Ko7L7e z;Z>YK77LmmyaFuGY=UUu$kF4VR0WDTK&ik`gJLoeC5Tjj{pZa-01*R016}fTyr4_q z1%M)XyX?S>0Qeq(1c9a(B)Fh6>^z$iW+Ewb$d>Yt(d&O~^1E6mkw}UE*eijOtW(yO zEJUvhmaVSTrVQEqn~c7vqn&K4)@yhEl8%nvMcATJ#(qynFIb7o$l*orq0etVdhz#k zvn2apywtnuSn5N)Dq~5z5l+cK&%f;Gt?zOClDs z2nwyQDf`*v-@CO)P`yO_m3{4xt)pdrKH3lpwlZPBrOD;Lp3CZ=faFOs1bh+XM@48Awi(4LaKl_iLO@2bSE5@1E zFiK|Hnz;t@AFL*KPlP zcIMy?)lkj9OA7Uw>d8z0H7P7W@JaB8oI=+8A(BSI#U;61R)U& zMhwx|^yoM193zDlhlH@$qT4gbU)EVdYr3sV*4Rey&n1j1p|d)-_0s;_<@+)vZ2y4z z=>@K=d?3XN-=Kx0aQZfk5soa=SO^&GH>1&LZ4uUI63;p(FV@!Y_n-v*YJX&QmC%0% z3=>W&Ctg0fNO?W-L1=A9PSbAp~??K%fPz1sIBTUgrhO+wl|Gv$OANYikROPJ#IxFf0+Y zB?J^sz~lf}5$^8cSHLPfc0BvWjq4y!+P)(!YJpzz%hE+yp!N zY;4yhB&LA%;$WG0fB$W;!S7P-rTmjDFpmUUM)eK#V9yg6lemAsAM6G!Iddj9jz%z8 z=^wD&&cQ8o=bnOsq6OFbf5Q*F-P|%P?r$RnBEnYIUIcbqij2_?-{5eN04S=_6wX!# zwr4J~({hxZD(*O}w@Fb_v$_Nv*!i2?+`odYzb;kPb|_L`ci^Fk6x5xvrLib2N9yT= zGIjS_HPfiAT_^VPHJ8_WmOtj<{HvL{Fbe0GT}J7&xn|$>xgvB^;t7oLy)Q@iI9w=r zSn@5{`^<~G$9`T=7^>UzYZQ(y=&8fvoasehQ$N)B<=pP-TZJ$0b{U#YAMH0kyz@=f zYj${dr&Kc^)I4^gKU$?CkTC@Qb=Yzky|03dd0DY;iQl5-^Y&UH zMT*`N<<(o;wim+cIofMeOSD4IC%xPLa~qxP;LTUx9|V*Kgj?efXq1;vJdqy~8^&P`tDPT1%}OXz3A+r`p!-d+>nOC@y5+-fwq zX++;oxIuWVZPcOH-WASSy`-k9TXt98o(A1JUDbWWk3z;Am4l8Ez2f?QRUJl~@;`Jr zdOnP}Z@!}Z(p}%pSBwYTz;5n=z!O)NJ=m7}_0q7_)rXP8k@tl^4)05xFaP*(|J$#Z z?=z$?EFWYpalSl~r2ppQ(?s*;+9BGSRi=-Q`RLU@If`0UH))yXH^XMH2vhK zXQe56rb8D#md8w-Kd4y$D(&fkhS!ZoB8@LDCW=s+2X>ghp5iRMxZhR8WQ3s_YqE|> zgeA#rgpvEfD|UlQ{=pv&Xq&cv?8_9*pG8p%nm-J@R6AffzG8m=w6mj<;@s9kCFtAd z>RVUlpQ7*|2BL89^Vd-z_9i5MH2d}T=W$>6_v9j~-f!LwRJ-%ht2z zYbhPVUpFn3{Q~T zmrTBJlQt<@FWrF=D4d_Q24|R=?9@~wbxG#Brv3UvFQHR1jqnY9@7t-c<>p2Avuu_v z&rDr6{Y0|fWbKOd_38e_n-yP|wwt^WJG2cQB!_umYt>wto-nMUB%Mt%shY|-sIyt+ zvkA%0w(n5Z`5<+rvm9HMzQa`XX?4>V9INERM~?)JYAV;;d8GFpEq^tt^)}kh?VdRF zj(&3bczfr@xpyZF`O}iwD3)F~$@P+<8>?fK>!ry}v*0U7s>M5c6U^K;^t(wKXOF6CY>}|FRuMHEGF`uARfoBD)z)mCj&+9( z-xs$Fxiie(tGRx-Q+z7$m~CN_*50z|f|{zcIY=|tbuE%5p>zFqyCS+{oTXCY0BKuAC{F>9-OFHxV}!_k`1OUTGy1~y?p#dj4moVK z*RyS=v@&r^h~4`qMTC}1mKk5mg4a3>_T@z416P*s@a!DCI=;>Ilka&W=@0k6&P(1Y zP~KP02sFR-m2$KE@}h~*?Q%{9(Ko7IndIPP>Y=6>g+nTC&7Ce!ryEh^6a^dzY6Owz>zA3Gm^oBMbb z5~-l@IdYNmvuxP8f+pR?#hTBy;L z-doKKKQAH2D3fKtqm@>ysfFsD!_Jq=JiB)k>~FYRp&o`+4}8I}Afn{RR#t9gq)apf z^I0ylQdl34^rGEbm;GUlKUaVXmb%5@m|{C{w8g#%ftGvI#NG@cYG{kh02aC!C;ZAQ z_w(@hs_Lpc-EY2LXzarUGn)9)I%T*jNcaT}&77o3O@m9rVlzac+jLR{#Lt;AvL>*$ zLaJ*7QL;3CTULUwm+}xiMG-+ip&%$oXm0HCRm7t=hjYJ->dqfn(c#(Scg%>(&H`NI&-V|O5fGx$>;w}O5z4+$B8c^8(6W?A zkQ$_A-Mh2>#qLe^`H4J8+m|8GMuZZ3YlTLMN%H;y&>sKTN1{bjoe>I>x9(AfU+nzY zD0o0U{<8QJ_f11o$&>5PZqlAWJ)RruKRH>m?aC{^gL4m}md-R@zVcR7JX#-7@cR1F z1Ml|gf8lADE0i_+{iw^QX?Y zU#2fU`t+Rd>gUF*UqAXBoSP|_pS%0`z?aU)^Pf)~gy4g(q7Huec#uzqGW{_Q%{hqW zPzF{|MxRsW?o*Inltm^~X%baDi>jzWow|RJKbQ)`R3#Id7?ZXXrYg@;#`$QkRzxa8 zegU3ztQvjG3fyrim#F8FC`$~g7b`_zNM)dNP9X218A3P+385+XW6|OJwY}m@IMJvP zelrS6f`~xfM!T~3)&kaUVfD=MW5dL^mPG7CsaXJ?a7mL^w4Cx^?V)NqokgOeMW$!7*=nsvz< z<0-ABN%daIH@s5XO;Xu)sn?mQR|it-NXfUNQ;e#jXSdJ?vdDUuahFPP%cF2xa0sOe zTy(E-8UYcA$Jvo194pfVlm$%*=mG-H5}fV8`)uj(X4_TdZ(h|OFW zHG;tt&=3JuV;w?PW-d0x9h_$gD&FMtSev;$EK~MohL!12>kaNpHykDL>t4K(b|L|H z0FN9%B5*hXdL3*)~VPP1xvyu+=xQhhHF$`yfLkP1l zA;cpP_n5!tai{{l4~JOfkM!`wdS)N<$v&E}FN?X)A|yL2_2$wPJ8>6CK#E_CL55wX zvT$N(A#Nsa1S3S;0xM&-60*}a^rXPJNd%*ot^5N;({;xSg`kQYz|8(2NwmCBSsvJ$0bDV{kYR^!a0R<9lIAb6e>>O zZ2WyvTs+>_dk7{=D0jF_*JzVZJ1NZ-5#}~)%AGPU!x;^Fng$o4%VH!3C059hv+ru_ z4tjmqaLP8OSb63YsiD|nubRT8Q)B(7EDDRY?>do_9cg@h#L=gcLPMZ=wvbMMWg?agBZO6!lD zX<1`dxw*7%O=;@9mPM?YdDETJWV5rhn9}lVXO2#or+b$kYbedtI(uTSw5aS1eeP^Y za%o1{*;2XEGP$z6oYERpS!PUGe$Lq}xpOsU=g!%e9q>L^*Kn?Cu&l!D{AI24H*(52 zb7j{X&Yv1Q*EV=QPOki*mc_0?eg8pLz4hvurZ1T0qu~dda*{*VJ7F|+c~@0GW$yO#j5^`CnFrDCN7T7*<*6;Q9c(w z?5KD@SMf2qVy>*BI_M%4TlpoXLQb$!Dz|cau2QVAQdzK4#-ReCT_xdD`FTf`T4#mA z%L;yT2VLz-Bf+Yr^C8uQ*lL5%7Zn?;g&Ql3hpNqTtB~iah$&U3FDssVufAVaxJk~L zoZ>3}!Nqy1=F$llZjhH#<0W710FR+dA3t3hlf2}5cfaK^$-t1>&_(;VAJg>zTnmMWtCpjo zHvy}LN1Vpvc5%0=^lsf*i?+zSwps|v2x6t|7y3nC0DA*>q#amo^!NcJA4h-KiN73bGfrLwVV-4sn+ZOE3q5EW!}_pbTWc303jWQ%h`VunTgp( z5G(7#+2PT+itEBtoJ@Z0l>@e7XI)leG5m4C`s4Vi%%g00b3*o~M_5=YdgU3BBK|E96X$7J9dJ)9JEKiJ zw~B@3yWJsR0Gs+_RY0T?ep?XH%ReQsfr1lMyZz~WUtd=r#O>oK+_}qt%Wys}V^U%F z*O^@q3zlXhAV}!IWTv>kpgtGTK!86)?&7B+JbL-^$>^nNcb4$&7S9mM$Us_8_Q)#3 z-efGq#YnLJ&|wL{Eq6Ei-Shi;>xj_3K&N{`V)sx6_aJ}d3N|=PD@fts?IcH^s?72=2>42pT%*KeVQB zP=SmHChrZz^Q|Pno7gD6@Zk+QAER2(t8tw4mAIL-$NUBlP%Us<9Il7< z@bTASp$iXtzjC>{BSTjPr9|?|;zoQu<446b!&b!X^*lx(Ahg18Yr`;wnSxR5$W_4| z%8;Vcswm}Ed^j@F+8-?lGb6JSDO=KdmqK(Lau)%3Z0Jaa&^9in!5u&d#Xk7-=#;YQ3&F+2U)}GrQ)|g!xC$pp0?mg|Wn*(WX*qi`m5LGf&&M zC0?jI5TO>G{bv8s15C%dgJuVk#y`H;B{NZLvN#HUe&OGkpo z^JQZewR-2v%vEV;54`NsNV}r=immsmMkKk>>s6y-QvSD>O&4DFzIoNG_p;deRbS7m zJBq1&J6~Vh`D*aO>qjS36fTVLZFtiwrWrzFNQLF4RiGqrSoKE&g}2de!;xYTQ-*@% zR=)Xzc}RxKhYITx4t`N_a{a0Uaofr}K}!~klM`p{6+DEKn8(Gg!ik7Zd0)oK9+VYR zN|z0jtzlsZcDQZnQ=)IDqiD~hQcXw932;;n`n(XgqYVgg!y1#AWOwUusvWdq# z<2JtiaIJ3Q$eW4VmlI1Ly}JKqX7j;UPdC2qKl$P2fsYZlUUxLVF3zhCBQJQ6L`WUurmIJCTOW!aGX47_k9BBS{cz!1SVzd#daZGW0hed{fC10~Y zRHKVqOGcs!1&!v?;L5jLjdbBkSb}vISBaod`uWylY=j^N0m{JR>MnlfGx#E7@SsT_ zcU9?&Q0A9r(Jv4ITDKq0(8IkDhI+1k;cr2s=Gg+MLVnDC-0<74CS2^;TdV{Hc~h4? zvKogKfliQbXRSPh%KX~9YrgBy{J`VSgY%!h-O7P75o{t2BdlnhMINzA5MI2BA+!F8 zb@C$Jjcr-$pW3D`UU>j5>oQ6@tmbsmI{RHAF)?DUPDbViA7rB=2@%E;xng3D!B#9Q zvJHbSLzao)m!LR8F*GFWHcHJQVc7xI=!{FZ*~&T;XmUE3<$m6~ePj2W|2Zpt(J&#e z_iO~^!lrA6=LJ1kLdj?6!UQ*J9lt-N^U(xbyqY1FWL&Y}k|QX-aEP`hMCy z)}6nrc+Ph&V&ZQ3ruLJ5pJyJ+TA75_@LQqy8>Fn2?`+{7SGa&x)SP;j0i#i0i4+2K zP=jVGoRCO7@lJ~6z)*~-gDxFu3L()Diu)(gv_}+T3U)t|Z3**b5UvTE`f4PLZkJ(N z8R~^{tR)d)t;w(+lZ~dsMkE^{R2}guA~Kp)eG~35Sgj~F*wuauD;~Z^9Kq%$GBgOM zY+>g%93(H;P}QdCIeNiC|0>$Z(V$(m+R^BiwUN`ZyFp=2D;_h9oK2q>?`c@R_%KrP zw3Jz^uzr}y;UbHVXjbO=`6kkfo@5qVS}B;^GiwGf36(KuqVjEg_?nkt|y zpL{w=&rDfXYLYgt1{eEN)gU+q;krnGcmyMb%6rp*pvZ^R^A$DXO9~V6f^X_B4Mu3f zgR#0y3(Z2b7jB{fztWouhgNF$<-Nyr$Z%4Z20r)_f)tb+r3Y=C%)?(3TgQpdh9`!U z1@>bp{IWvciy;w7&7yXyw^HdIks=Gyhk_P$`6(-%%xB>VOtGg)eyhB>Ng|Xp zIK&Mcv~>wAF>v|vGuh$@=>VcYAQ`5OXCSiAEry6wm-~hf#bNmaEc3#y)B11W^)%!Q zB@ef$iC7~(ZiYWVz4e!`>qdIr$+2V(;G|o7Bey&al&-v=VLSYUKa-_m*(|+^Zc%{` zN-3}$zHbRxXGHliHXbSsTYX-62R=ms{#bEim7$?Q3i`nlE6%oN8LeJrRaNGarA+&H z@@_rInlyLse#WA}^7skVBUR1qcJUQ1DjP##K0y~Y)np3atnlm;k!~rBT)DWiEa#aMOrZDzSv9 z05989yY4_qD0&fzxjo0uq~njZ;bcKMDJ%vE9Ipod_c~v%QT|Mw|vNwFOZIC!yifHv=Xu5C|fOS z(Is_6l&E1Jt<6$P)IihTeaBj6#@+L$Ew!O0Hoq7YC>j*qK~%NJdH6!2^HwI-C=o07 zp3-CGm<`rwi~F=qCe|!y)>2K#km?2DC2=xzeQUhy)sxH0qc{kwcR78>kVKS3v?lxn zqKHvgA_tg6KAFP_7RGpK9C6LsRm!x*TubEfQqFeQ#z9*V3TDNAbdtZe&v0|Z<>X5m z5RL3c!|%mM#*wzJ_?)tZuou5BO$$OAP=;$ENWNm1^|uWfH&!jLa+RlG?+@Oy-B_z) zNulaN%E)SOD|FIInzNPpVBhi5GIYyZOGd^Je?(;Shlh{BE?p{rUVxs%A3JOd&2Z^4 zZfIpSP9VR_om_jCBt+J?G!djAWGHy?@iyYvWISJ{{{_|Zd6KX?0lORu#2f2T)7E_P zgcMrEQ1yT8yqc21FCBz*Tg8bKJ{4ERDQ{H_)@JC8>Jk$lZmS#Cn{KT`Oz<4@1px;e5EBcFQO1dOLhG2c1S{B zi*f&pSHkTWM2-D z?~k_%Y=7afSk-k}F{r*fPH)Zr*Djw|4b}Hv>O1QyOmo+_9+0#&UZWrskWbvu;bpcQ ziijH?O! z*?mI$4{20z{b-(JIf)1bPdLX0~} ztWKEX?8|LyFloahGm=*dDJWYy&~SM2gU)~}6P8YSz5dSck9K~27A5T+QkaogETRgd zN?q2-;XMWx_$v(e;)paM5jAaolV4r&w+wPKH)t zDRNSn0G0Ts(CYl59vRE0`D>Y)<|p5x_@nH^GUuaEn631s}cmkbIcp#*F1Xh z$cVr;sK5>_s6L)CFn^n(<0P1-3fiZ z$5DJtBy#bKE|SJpi24gBe8Ydc2n+RMoFGWCj#7?8ipsz%v!JEqmG_pw_xB`FCoO8P zU8S>-{9fo!RjcX2x?~E~lUz27qI}wHAS45`B+MZERccrRm1(Brf3?qiWkzQP9tFv##)DCrxq>Q%T6`h9+!h!bs?C95QEK zMnM)tONiW}Fl@PcGgDN^@*y3bpLAfhwL*qoDO~yHC!13c(Z+$LR5&YTqEU4a1$~XZ zNabF8umqMXG=9*yO3eb+lC)A!B`&pS9z{`}ea@Xb!W3w;=oYl5vD=Q7Le}e7)1sTH z%;p!`u!AvkeUQ-$`P9}hrgI*=+>wd)WnX5<21efmy=DL<(hF&T zV??ubw+@7n#$jp()xDIy7@`!|Dd-DPWI@M+MYqZ@PZiRxadW8cx^BdBXz*3Ms)Y_B zv%lVk96`#%YA=t5z@M!n(Ut_$+T@yOIJ+1fJ6iB^5i;#|rv7RTs&px}Lw+qpvb%`x zT+BgMO|z>yI2a>xgTPcU~3hqEZm79J`g{%R1Y-I_|8UKj661 zjLb$)R{CU73^k~yWV+S*9BBU6x?gp5@0aiMImMEPjY$a~2-qw6K8jzoWGHs)!C#n8a`&K)B!u^sM%nnwopY%*U_RVlter zq8)_?k{6wJlFsks^HY4)?|ixfDU)m00>$(DW1v!$lcY0*cZLYg1N)pV)UZXql99PI zhw){?YE08yIwA{I5@BC@)c%kHbF&dSt4TEnO&Jn$eHgk{K^2}iQefUtwWE98n%TcD zCj(8WV;I2K%(zl?$n|;QP0(teTm#n((@{7*NTyF^nKP!;p2oHxPANAy(n_1{s1WL= zvhOh1t@JFn-Uz5E)R{49MR0VjeOjq#af{)&PV15jaV1>m>+pPkKaG9sq@)tfBp#8G zYsKnOtLPDPN2XL?+h3*e%^21(IZIoZt*S44*XUAV|r*oxO7h_+j+7Z*?3=Pm;yY*|h#Lv~~t7C2}s5)M=cGRld zK;t}!c-@h|YdV)K`g(&t(TOp6msUD>&X4KV zTR;tt*AiYAmD*mrcPKubBEyb{iSmU83`HhGgh=ZbBz20F)xP(sM3T4!svw!+-1UhR{w#idCRK(+=1f6TA+(2U zTgfF+-jOAy^2%ft-dGyZH+Qsu-CrTtTBwQUo&S1QVJ*MZt{&>$Dps%k2 z;qVlZ0Xl+!^uSQ==^mZZef<7dwW6TE12P^#+{DOw+`X8oq(Pyoz;7`WmF*1VDlS?P z7MeUB)Jvlda7Dgxam_q;+C zISLWKktyFf-|bF8;83*Qct;s#>&oG_EBq$5zRj(*#5{E@WvK^6LlIVZ)A2dxnb*l@G(2S3%bMH#?2?HU%#9z< ze>9PHv3K#qk;)(%0WlOW@NkQ`%bUJSHh1)1Ti&tpbG`D^;?Yx;R!DoC?yNyGqfDG`Ah#{*w&+3Z8NQq`ae!|SHh zHocD46l3C;E?d?;Eh$=la9-W z-rKsfBuUU~nSXDR@y4gr;LReA+h}BTGZwnq9I%2DQ0o&ypWIq|WXJ5H^$)K2J7cxd z(Ls<2lD{HedJ>9L5B2cq?*4Y4M&901dx@hCpDfv~5c2r!g&j1~AJD)?8VS9lc5Hsd zjpr$Ew%&MS&))jfF>Gt_@i8iU^tsKA*w2p_>B0A~l;oc0<>A}h(#xK#d^GyHZp-nJ zHCa^ZBvO~jpoVSnI=;mT7i5*d)%v`%Mf~mcouN0#Pe*zt%GCo!X8dtj%5)_6!;PJz z?vKut1ice^{yq{ZZOg2X@_CAxj3=ULx+Mra`f%Kkz~xD*Wo}`XrUMm)Cg#d=hZ=Ho z=>$^lc?F53A||jQf`q-km%?8c56Pg`;&P;~Vh~y3w2E+rbyo6x6orp?nG;jmC_gv} zLa~OmUbaA!6yLgdX$}K1t5*}iFd*$V&w}`8sfz3K9to5D^7%zs3|7*^`CM3T)qwBm z0Q*wacootXcMg@cj|yw3sLvvtpvN5(7^w;>h#x*|p_{`wi-jS1rQP*{)0Uz_4G4@O zF}_Knl0Oe6#1kY@Uu$)jChpecqpTD?DydHA z&x#N@8aCAs@6(G{;(I4HPDMncSB%$=*1w;fF=rbwO|vM^9x$%xe4v_qz`dEILQ}cK zc%4^NO(t4UgJLN2lnxtj&}Tk(`=IeyS9lgzFpkh#?k}jZ*#H|awb2q9K*hLBQG=&) zOQWE=k5mp_?b8~)@gf0@7t(dpj%(>o`Y>S^V`m}@K|;<8k+ew1%l9Zb$jndmqaowx zz7YIj{c5J|E~g;RNX&Wi@~Ay?pEGP9P-b_ar3MV+d&5XCKWq}63HJ1AE|2InnmH6T z9l81`K4_~!23=8x0Xhde`;dk*NLpzmR5ug4)XID*d)Gz~Fn`j03P}yHH#&S8lxHe> z#V=dUSibI=zVW-D{=KQ~yLC?}X7W+CyxlgoYKQA$<~n`mfp!bZHgQ-+W9to+Pc%|_ zmL~80Sy!}D)Xr+pV_d;3-N1xdaxmr(KFGw=-z=)1?uA-k%5cFUMnd+kS^;0>+uw3k z8RGQQ!amSuXEyM;TbRevi8~<9$Jo_Y743$}qSNz)KUQzZ>lsOEK-5tq_r~m1f+Cfe zS$uC1(I`tcMUe!S+CSZwzt3M^GQrb>QvPjxgU7rztGRQy~J9;nY*0i%{2HnjdUXB@3n4B3BG!dYLwP(u<&CHVSg$hvG$-s%shQ zQi>fg%j22JBWYI1g8?QMY#6$ERCn`@bJEbJt8#LNK~-SetBDpChs2HE)4hsww=T_! z+V%L@qWPc${`^FlRNpJKV{g8i&rUvRKcc_uo5kGp#Qo}BZ@;bl^8MuT#a;8OzI~bd z`2OwN`PGzX7_cs{OH6|zcu_3aHUdK9AZt-uc*I`Zc^0353nckdo~YG9R1<4yqJWNt zhCPfsPD+6^tZD*NlwtHKFlE7Ir69PO@kk;b-x7>gw6bC-T8A<9C|!66LdS$#swp5T zf{Fo@!}f|IK{C+1;RUh=UE%031q1Ej?v3|H5%9g@-qZM0Mi?f;9_=%Lp`gU_Afj*{ zv1W~ch$043QuB`3O`-4NQZk--#56(Y{x z1T#-WVf9HiO8$$0F$vy!{rE&#d9whN6&Ps1R@f*s`PQB;l)*saIg_w3)HRxq6wj|yA!u?z;v{#Pz&5E6d+oB6o_;E=^HZ~s~<-Tp^c9`uP-g93Ur zz}fBQ*iWyKtf+3fqegA(SxYQ~r|`S04kuyumVJKI&$yunja%W+N1SinKpWGG1EfxH zY)-2zuT1uH#7EJYy;ej43$m2}Qg$%v-3{Gc{As~`^(31e8u_Kvw*kFJ6hHJPnr53~ zu@Yn|(PYekN)dvJ_xPMnj&581hqEsBcJ5{4rFxf0IF&`#%17~m+P*K!f|t=bV!f&v zzIAO$p>!4N;H}lkT<}Wc$&rE@ST1mjdg9A>MVNdKf_bg}AzZevO<3ZUhw&kY?7w6g zO07t`u~KihSL_`R%2Erc=t3slrTERG-L+;9Z=!bW@5q@vT-gG#`6cGbY1mg#W)DAO zXQ|7gbG~;wJdyb0Zo`4WW>`C>aS>f<+Ddxp**Tvv#}g%vcXFalE?wu8AO8bhQv(so zcesx-4w|0M!S6mF#6K!2a}x>6P4T&WNjF~{v()0L=B<5w)hB0~mack#_Ey}x>VjDX zGF2rEuT`2vBnD^1>nu}#q1x}_Q`Ad`tqWr=uvkc@6}^X;;Mw#<48?^uE+4#oNWl7( z!UqkKlbK5fl6YDp-Y!ZnH`jCrOmB5;cOi ztYhBE@|f&HlZkA8++m4DZaB*Q?G#ZuM3qB}C%`qz64_bod9`mJ5`-1X*2}say`73+sW|Sp&b}|1M8yO{Y_HCkdo{@Putif0 zkuU;60K!+>4ZI40b2{i+d`RO`gv1vzZD@v-wrIQm4!+oy#RqCtZ};9Kb4VO-?( zSS?Idm0|zlR<%WGTDFTOH&WZAA@m<~%)1ckQzT311kw8RMvB*U!+VtwX~N}5)tL$V z_TYBi1bmh{sg!!TI4ZxKuf*Hkz+gQ6EJ1`0qfUHzw3F*~q$D>o`Lx(=C5QAZhA+!Pp%o>>eX_|UmYh($D$ zU~zn%C|j3_A{zJ3oZNQh8YDCu0BxW!Gf$a6+_Z1e`M2`L5gw7ly>qg?5QnOUAdV)7 z%^fUtFNgdri3Uexsmt^Ap(i2ZwxORq7xldKeQ7pw44-utHQ;I^VDP_qI`4QY^EQ4-xB}7J}OAmuf|wUH{sfAoST+==ipL&1&KS zGg+gbuP&{nEetMVoIGdyB9B$RZ(T9dZpvpd^10>#_WN#L+Sw%o$>8CVyKM?LpGX>f zzrmtze5!ow4_E5x!dPX|2Ns9__cw_~Eqy zaRL&R@Jawm`@}9^|I+vQ8bfalru=h|vwt`7cy9#wV0|`~N;D^Kk~o)bIvp9+jjKhy z`h7TvF>Vt!BMal_n@O0t2Ouu^I98L@gl9jr_Uo1ZZW*79gtxnVZ>WhW^omS8cItdv z`Oh6Hh)hw}NHIT|0!d|q`V5_ zGl&Z})J#csbf!oiO%Mxz$pfXl?|bqNJ))qXmb%84I}?+YrX%g@L_+EDBD*0*OsFhCK<#x{lylhtV$lZd`S<5`&zn zf;rQ1j-&_YPv?&i+gmckkC=SQ8tssA3Wu zw1~%Z3Y=8DD?r*=(Zs~R3t8tC5Kw)Ppldk%Pt}8=>FVFN-rN{3g(dQuC2={PX;UmA zmJ%1oE5kj+EY6k;;ww2LA894tLiD{>=nw?cRAoLoqJ@j+&NvV9wZ&TXiCBB)@>S-@ zM;M;BibG^$xfjMz`tI`yJkN&0ZC7I<15w*dIeh7jGm@5$@%q`K6N?+RA8rv7Ss2`d zp^YRb3)4qg?qx+3yZnnMy(f99s^r?LhzG9Q@Tz~dui+AKgAL@FCQ;`M>o(@wt0yU9rh}K`>5K4}O(jy+ck7T8D z5Qn46r4xIlMRJEQI71|fB1@uq#PH^rr2u;_IiX~t69j{e1;G%jm$B$E3P=N1DiWyu zVSFy#1e*Ab3U#PG3%H>C*i<(^2X}e~JigfIaDz`oag!+G#AHqY0cN#WI3=OOQI0%l zIt@_T;F|7OR0kvDCKP0TIw3K}tmbf|@=UF@16`D4d#R(6NH&BhP%Tik_82(CjBc}N zz+LOg60pWODpU1bCS2bO8WIbqK>-%ZUC`AJiP91hrpMh8P}RcmwJMeSn?J zB_2?fYT+vJ=cR;VFSG+8yjVrDbcBg1%bIrt1}?l$Wlqjx+Z|_ui<5klB-l> zY~YVp-7o+?!*n=lP|^@y{&cJy6JMp~ooBu^w8u)rkR)p5d!V4A7Pt=b!F(IU>R@&=YXCZG=no)>xi^={diZ-ElEn&2!NL;*nOw4%2>yZdBlSVzQA z*IT}(K2hXAA-i~+=%g@ew{hdy>-$0V7Zjj@vP8~O$zn`=v6$?fh2ry$$1oI6jUnk} z2M3P)A^n65*pY#B?_5XL^1?p?tm44O58?SWPK62+^*hZ0igf~8H<64wtLnxYrG`XZ zc~$$vPZzW(30M}%`Bi%_|FZoymklwL2Tt|G9r=s<@;ehv#?FGImwv~*DQ~Ymo;CS6 z$J%hq&^t~B%KS4y^(U1${Ne6=y7dhpxO~YN&P32#_jMFS{UQ!w$covj5oSP%I zifj{;DgH8sF9RH5~5RZ!8W~&h~Da4e-lbA6yD@z6hl}|L`Kg zubEp%8BEKG=_(9c_>?9#5Yyzrj?dHy`V>?Ns_gkhAizrIUBQ;KyUFt*D80cX4{Ak3 z3B6PZy!%M1fqHuvbNvymoqAU(0D*Vg%xHq;Dwzq(RVbYDzQ%ZkO8QWH?J=@zw+~7w z8LBItmx^9_=bdOONQVe$3=z!0EhiQ5^X}Das(eYUd^c733tIW*Yeb!w01?3B4M7*+ zX(1w<2SYlZ8ySm)uLP#{U(jD7s*=}K0dejb1nZFuAyL%mbSjEYSgjTl9V18w84G>E zx!aN5Bf<3<> z=;U^)5)PK=L`00yQ~FtfkjLnyvDD(jhH)aBJ>97N3+N5f+)Kle=m@%jg7z25hDxmc zSIx`nKnCWYIj8dlA~YurGAT+baIqnV3h6FU*oqFiY(6J6PYx0JxrX>uzBY_9*ABgB zQ@N+!EIVFwHO3+qP66;8sz2_Fgeg$Xgu=}z@Js{B_d4#|Uv=3ijhJEipZUkW-fO0- zGSeZ#@=1y|tbi|expIijN`rsLT<0N#>E)pI``E^h)7lMZnXCXDOGHm!?RjGWx2K@v zU*Uy-O{T$>1Y=b!g-7TiAT^2_-M2SwboYV6H7M{+!+mqQb_GRG-4Qi!mqRaT!OavQwu1L%p>#na;MbtI+TOiXt6}NBuR!Q< zV}=W*UDeCpX~R-b2SdhjDuup5(t2Nv8Y(%RsG7||#?kF-GDQ72z<=O&H~s4DoVu!) z=IJQSue&bBxr6*fBAXe&vW5kko|wP$`UH%QOD3}IA3mQtVs$&Q{RnAp=%U_}a~J3W zY;@Kx1d(~)Xn!FzObeSY>yLXF1P@k!O}DxVG%VF6e|Jc`bNQ3P98AC2ry~5eJHqn9 zw9cs?8JIdZ)pmxljDJIq5gn4kkWMm!Z5B8Ln*#;qUx0QcfHl&-9bybS=W%-9_|LlK zYS)29Qu-rCuyS7K^{bt5IxVU>IL#QsAMJsCN2!DMK#}yrt z&rdBQxNI}2`@?-Vil+Y#+VL9Xel>Z&30|xPZ+Y7kJQg;(>~GRQp|WWdhILu>e!KLv zlW3z5et{Ag^=ncl#8@lDtD>WBSB-j(q$2+VuJS|qsfO+qpGr|(|5TM1EFrd{A@&e} z|H%V{Lfum7zUi8ECBKo6$Ph4sXrE6m_?eOv%(nm4wUxkr@0H(f;`7Q#AGSzC<@P#_ zj?~pxTyadQ|9sFp*xToR^Pkkaf4b-X1-*{TJso;;7C5MDci!7N)2_>7$5b)$Rv^dc z^7UTE1%!fE0!6yBc^Fe@P|XbIQX$S5#y9!Yg~#`Vw^KHAnQ)t(eXsw7VHHH>U-ZDt zdJ2-*WB|1IWH>fDN+Xv4<*zUtj8&ihaPHAVQ+-nSp9s<*47(F!29fd5#rz`nGsiOr zQ{clTLlsd6PY>X8`hXVwtlku-0tQaQ$4h#zMnYomC5>L~4NlgN35Pt6V&d8li^2V! zTAl4(hzggXu&womYaCc?Mn@=6`Dg$Y-Ed2AN*;HT+EH{&;PWHi6z~VE8;)59}i`qKr`5fcBx$6}&-qbFw>k2VTS zR~dbgLR3MszL?s+h`BzZ$F&H`v53s05jNL)kM>27`{r*keQ0KyeSI`M{8&sEg$=v2 z#(Rtu9esH`=_BXt$e*Nb|DHY3<6oo)z9=96`ta0{`g<4_R-QS;zQ)N#f3hD$r+&*|%57Y6>O4ty7N`EmU?zv;lA zhsTKkr=3YQh+|@xvhT`tHA-S5m`D^>r;}27RYd~h0trmq9K!+eo9xwN30&59?7Oqy z4k^OY+H-YsE?Jjo1-_f>&bfTD;y4w_t()s zt5Z!KX%5XMLc_5s3nlK4i+#7a>g}mMw@x_d{Sf2p3HumC>nUh9XmR=@^>SIW#iGlP zS=w>uY7U_|F3iwHe@Xi6M1kt%`QD zebE{Ce!j2da6mdhW#T-(9S(*xx(Q9nMfKPot0aV_T0kG=N`0~Ob=GZ+x;Aykc4n5M(nt!xGn{65oz zOoTL>A++pW75&>dJ8#*VnZYA;BIMWkiRfHIu!w5TP+OU9^ zJv+t3FG4I^(xcS&k#N*OARdBgCGp4{<{pIP5BD<5#7Ju#|72_}%f$&2J%-XS`VQ7aT2xk1X3X zH}V|DRF@rIc(*F%;V(Vs)|z!@`^~cwa-Q4KCG zOgiRIF5P!{aa|Z0wtN}lsJR-!(%wsSt((->Gom!N+>=G5 zeqD5XZrt@Y%^-B)b)@3X())@lQTc1}L7UK927cjdmF#k6o(T}KGA|si7HJR*IR@~l z==w|X_S8E~zdzi4cqh^a#7|dc2!U`YrLA%FEUkSZV-0=V1khNIgH5`5`?pIkd>f^4 zD0nk-q&tAZF;L`rz)nCaYk96av80j*bBX&F#8g#_Oj<5g?sPY;M%?#1CwnN}2x11_KLm0dVw`bGw_ zTs>lXz4;y^j~qv+O}hLQUxaao>y&dVT;}z1gh+d;e{;xmo?l++TUlr=)M=qA&(e@u zh4t4*nlDQCu3=^`s$+}gV+gaN4DIht=`rb-5cU^Xmwp&>{hN+G*dWw9dFuLQwOr@O zC3A*!k=UQ^5bW&2O|Xnrp|lsmL$qgXki~cIt7D%; zK`6I)R}iLD8&@MfypcF2=+V*dfu?{66=uNOkg>bA_-k+vo~P5zDJTdu4F-_Gm1wZL z2BqA6X{W$LAqB)*osyvtZB&6M>P^n_75ArDGK?w_i=dE(xN{GKW4YA4E^#xw6TtAf z+HpeGs)-_*X);1L3HE@PBNQ=i<=2)oW-q0VfLghJLZ5e>s|3`9}-#Nowv%_Gk4<-glY^2zW1jc*-v}T@t)}~_ejKtsq#NNb6g=N0|3*I zz?E8~WjuPK$e}g*k-0+_4S0m`2o|y%K1crtv>>2Hp!4TEWq+GU>IF;P6tzMZYn@x zoy0>e&l+%9Z_ooEEmTrr6{gyzxFDGZ(SKvmd<;idb|z$QZyf1KaT;Om)ysT*DfAw& z@kO2ebJl~AP6j==PbjGnXU7M;VDEVef%M`fuvvKU@cG={s08IHlBeDJ_s1*z3Y2Y* z&hAH7{Dg6(Wa>+;0jJ*ejtig!^*vk};dcQH{~_##K3=edZt?e5L({K}@F~Osn6s zcm5gYRQe=jm}rz2Z**dxxgz;}R$|Zyzy4S3dF}V43q@2~M=O(Y{Z<7=AaeQ=YB=r9%d$Mi%AtyadL%LEb z+0V-i0mI6j1Z_OBE178UzwG@t&GCD;j()UAa0IKGiX0X#5SWiQN{WvvaDN5@Bb^#oG2e|S+abSVG%BT!X-4nr*sAEwh-~t z)aInW{(t|4(ILL42<2U+C$O5gE&qBjA~K)qvglWK3VDg0EdSzzT(29ndaZD6DJuSw zYFePvQ1*Ols(yzkC(Fd#m}OC_uF{#qoT(S?TF&E)=Cxadm|xYSxbJP()rweRe(TOI zjS)Qh+A|NfggPUCnsMW|{PjJ#neOiYg}2irE#BU_Gnw+lztuiW^tUkMYSsGAzT-pf z@FJ0rnQX?@_n(Err_Tx87-7VGf6_fW{`J_8)}+(IrYFY)l;=?`fF)BrgN!Y%W*;N+ z^j34?i4YrRa2O7nW9~t2;EGwm7qAK6Kz0ETNkuR`>hRAz)Ab9~^RA=Cq}#jcswu|q-I=DF-${ze zGHT*Cv-q{toQKh~erb}bU%v7rA7tEcCUaD?sz`?fNuxJVO|(7B z`zTt!2a#1~9oa$#?`WSG^KC<=63UXd*`JYllnA`LsHOR!jsp%A1SdcNs5hQHXpK3% zQkkKqV)<6F$AihP=?#hqJn*tP>)2i*@7(~{Ph$H4O>7efc5wFtAZ$Yvv>k!XFJ7Z) zTVp^?3J?`~B$VDi`}B@zge1UMfDz9{8083JLqqultaunnA_o96$1!z{#>^EH zRk@lrxxn`-uvuo^99@G`8ooAw%nme&c-qx~@EoO&YS&9o{>@OGJi!ue)AopX^6O|C zU%|FULD+vrK@Z@<+a3n8C71|3K!O6_GaKB)g)39KW% zGq`D$$dUV#@q1@qh3(7E$paHLkr}V&YS{)SKU`YgIiA%#+Oa3J5O`r{&yetO_}$xY z0bIsj$$t;jYy33IjDn8_;~NGPZP?)l0yhj1R&ytG6uGlEE?^ ziaK1O0I))awcDk41tETTf@L_MkQH>?Y?!~M>vf~dkvcT=!ElqeABkgLp*dD&#C4LRU*I%bWmss zWf%s)f{E=mG;SYD&6#TR2|QGdX6|XgoJa{Ozu$e9U?U!4*CSzX%FTsbgXdOZl_2cB zWGf%;(;?5#F^QdpkfF)6?%#8k*?B94&yl98Hi~&Rs(CAs_b-%?pa=WhbxAzCdEG&4 zx=-@#XSt6F2bFo)lQ-B8#8ATWZTvc1W8Wv;li1v^`n#WNwz__DW}nmJvcJL1O{-hE zzYfyAe>gei$uWV?B^d;dxqauqqAX zPC{rm#yRt$5UearcHYx z88|_}GfzlyJmi@}d%!{{VlA9|$6v!0q?zC|77~kpL~K1l9eI4>PA5L{M_3@8rFVfv z3Lu=DFvwUOpc@^bfl?CKC1%;pvKq+)B_$+j8+TVl=Xt03@I|X6vGLE74?OG>nNUK)C{a_z9E1U_A%rdj+u!qwQGru7_r8{@>}U zhVrr0FkpY0vi|kTw@`P%eUGnRqF3(n`i6p$v>D2b$J=}7cc+q`g#O^r`t?9Vs8z1! zQgG6}tPAm7f?J*`H*o$K*LXyV(hgX$?yWj6e2wJ}|cM2)uC zal4zhXZAnU{jvMvJHX_h$0PVic^clC(dmzuyd#*-moC|vYrSNcL4+3)0T%>XDhpHq zf`kQj5N4hPB$09gtjRLPvi@E(KHT3qreMVA?C>Ep{K{1ZgTmvuV2jv5+0d{PG;nD_ z3@3Xnp=hOC3SA-rcwFVUXy{BzQ6GRm2*Fv?I!cZ?ru4%xe%VT4+S0k?a734 z2)SIGs61D{LdNsK#VSTJDs<>2gJ()5Z=ZUC1Bn#G+ytkHf$R|gbrVBM;W2l(ua!K; zD7oU`G-j2SDrMbU5Kw%(sMz&Z>6A{H^?l?uJVbI@~KR=-%FK*VjhX#w)qe0Dg*#Umt`3V z98+$uj^56*r48@-b^DMs)uK1@>lj?h|K{!rHFq^0^=}%O+9y97KP%_)HRtjV>8uc2 zLAIbvpYv};=lkUCClS=rd0!l`o;z;cCW?6Wb&M||nk!4Z=!$K#*^h9e)z1?0FT7QQ znwfgW1=M0G!7Znb@~HIic1LQN)rt z-f>$Yf2Zc6k|v`FL(LbL^p<|wmCRP{1c-BxLZVu4|MWU9SaYJg_sKb;Oeci(kcp$L zyG7(*B%;LDplf&@Ol(1g2Pd8eks$KgpGI7xAR=kd05aZ;21&cj%r(S@2T&w!(8$%I zg@RaH!_=P<6EGO~^m)tMDrh8BR@q!?WL@5H$hg`+M#$mR(*R6RpJk9ic+{?jKA)_PU zNw+h8Vh#K59Q46UOV4!{+R#K_bWxfqo}vWQq6hwzm}I^j9a;0o^-U}!&wMOJ!tv8R z8Pg2ph(qa!b;xniKYQ(gVl{K7KiIrPv$I}x@cm_L*Hdi&d-meU6segVl=QTmNp8>= zOtxwia_t~9Jdc_$?WJFB&&YB#so{F=KDEg9OfqN6tbofhHJFwyya?0C;V(M&M}0B% zyvRxWmq|ws!dnRqQ$6o<7C!4{^vxa9ntJ@M_|<*K)}H#8@;6ts{8y&tguDu0?A1xbyN79<< zH{)O5PKn(JOZ$F7^jnSh7uA11s1?UF3?*oI42lfJ1**H*%Q*F^B;MGq82D})_oHm} zMW6CduUo%h;=l7Q{8=*k@dSFnazVQ5Lh5MT@7CjgpReW$8cF=ClH7$Ve<+g9KQ1$| zDnBi%F>#!s9LM0iwE%%q=+yt;$bl8qjYg?bhEq5RXM2-XZ;hr4=?PSCs#cHQ5Mx*t zE121CjQ_Wh1O1gYktg9kpO&It^E696?Ef`#RFYEvw~@oDL^tNfe%xH09XGM>#{V{Q zoG<2hv(W1CxcF%5k;diwJ}(}`Fl#lv><->u?n~8bUg?Ye^ZPHecFWpeJhR}jH0{=n zku*WQYgnDOH{-eT=lauh?!9|bsu%SStJ}UgQ*BvtEM52hhv#?C^;~1o>)2Upzw)9# zU9a=gtKO(T|5)_9cGrhf1&?RwcYk?1S)zBH_2`5Bt)M6+4>}V8A<4>j*7VnT_uE`* z5dAG8L4VMsvz&BR%|;Mg<=Gs$ck`W|g|KIg6XUB5Rf<}N-{34;s%CvC~4yHkb!VanAenLXG^ftVmaih zi5Jf1jll8P$7VO&?nioK;nayk%?MUc0l*m1nVZcRS2@KRSl##?c)l~*uWKX2(y#kn zd1_NP=b4@vYr(RJOvn*bE{Zu_hBQLt%MA3#D^NBnV&IZP=EgrH32=B@s4R}-G^%|R zp_IL}d$_z)n1+p$TD?sEL9vtss4Fd13bGq8*eCRq)FySf{%9tmqSOaP@8@@yoL-{tsNPvxF|X-Lwu} zy2P7cqQ>FtnwAbG@xvmS`E`b95DwtiZkRzwCEdy79V<3Z8kIv<$1b6SEH}5_=zg}{ zK&$}}Ctzn;TbN&SmZ=eALl}H&s(|E4F%^mbgP+Fh6cUDpz#I!~1S=fF5SFB^Q7(3H_SWDFB0n4uFuTy$Gk=us;D?0nVe^{fzt%7U1 z*OGb3;~PX#39u6`-q(BmDO*Kv59k$3t9XB1@SW)o;p+|T@&}a1ToNe7T!X7FHbnFXJPs91V@dX;#?g4=WKjg9D%nozC5|$Wu4d-I8!{b7 z0ml0>XejA?e*hS`?7aU;GQS}bu+W-^0FES>-fm`N4MH6SF!n*o`u6hIfh zCZYnQe@f@5RTB)Q+UnG7C6bLiXv){olVr@*!eNDX=Y?c4QP3SW_n#+3JSi1|0j?gn z#p!fA35mlL%YQ_Sq)X(-00rmTAO>+(U?% z-3YCHU2AF}XGeKp6$MLq58k0`K&HLfUkP(91oSCOqXAc*OaiJYKop|?)$^IgmZ=d2 zq-~t4fVq*>|IR+~PrPRd8M|1sTx8(x9n#?ZvHtV`X1+yk7zVSI0`CBo12>3*5$sv4 z=rEBMh_yMh!Hi99HfZ-Rfd&qOG@`~~LQqQeJU^={2M`wdXba~jp(497frc2%y)Kec zFV27k_XH`{HB0=RqCwrkBS^F5UsnVcx-szpS8E^^w2N^0Y08@01>r%eBt7r=e!o>R z*+DV;3^m~U2{k^tM0Oxjd2>q6g%BL`7z@XLdBViqBHZ>#*=*DPLS%(M6*A>;lh6s zAEks0V*Og;M6v5A-lV(A*)$>_1#%p_77xZw3n~CNW(ijhnXW5U#H!Q2tnnBa8O%^r zoEWb>qms&|k--5PT zk-i(17|V2jjgBw_6e%kMHd`V@cH(p`;GqT+s>S$oJ$bEs_?SG*ouh1m<;aA26HMc&Y; zrI&XsGAOZX`-RJkrGc-5P>_yMGSn7l#&Ru_!nAqx5);8hlH(0HMxxkgcoGGmyYXn^ z-0{Ed-^D%~F*U8e-~I=Qbr1n@WH_A}&lh{og1!lyL_py}w20{Lwx&Mb3?~~cFbM<6 ztW*RMMUfWCdi0cuj0@fVy7M(O%E3JT_BE#7H68jd!j8zkXTI4uQ*7vcUUFcn*-dCM z1&%geF@e$!KKn9IXl@sL3h%Q58{4eS=DzEQJ?IA}+V4-%n9q^d!D>YY<6!$b5r_`<<|yDINw9l+hqVbiiZgEil)EUhCTm}G?R^w`j1@} zY74caoMN8_XIqe!Ve#OQsjv-$;S~>Q8=k;89Z#G;fOt#;tCo1{pYbs~zy+1)Rw$#u zeYil4`=JW6+KiX|5*_oFitp0qB`3gIVEL!Spa$^=p@|px5-$cJ*%3fahMg|}B{4%4 z4M+GqQdLY&fDXngZeA~{O(_{mDcel(xEFCOzQc|Cc-?kcLS%zmB|>(WZBAOLuaweW(62<+Y@4;=6KG! zEWz6N3ElA}|Xqc@&& zbSsCgJ5w)9@`oo!+mT$&tSo60hkr&?6Z2f^LlrA@o}Vcr?*pHR*{{&fVINXKp5;~^ zcX-CKOn%CjoQq!h*1Wlw>+;L9@^u1p+nhK~m^-;;<%TS2OD6m9)sgvA3LbeDI4$K- z?`1rmFSr_!=lmOkyY!xM&7j_rr zwV1~;8{+-D)iz~=Wk|*A{Q09^6+gU=%%xQPLG%CaX5c2yXmHGwzU(e<-YR+4&GE0U zAW1eFYvE4mF4j3kT^lcWwG_H2QLJQFSsCFrpi^G|C2zI6Qf8iji6~DobV)}SCDr8x zj8`aQZk?*4sao8MQ@w?P(9CX$NIxjzm8%@~V%IubKG#+DbcrUZ8+v>>l;=Z%h=8u{ z)oLm4@*e)%cfG3ZepMeAxXmkfTYA0}o>i52=fY}M(HY%*%^P>TbcGG;@A&HS2I3&> z6l!3xHpm2UBDj782Mwr+5TM1>*BC-;)giSA+gey)Er)9D#h_Z~Ol`)E8mf0qmM$(p zt_DV|$t*HJC%AJo_N+1;fV-zD)jR6Mww7FnP3pboxQdsD74`)uP( zWaC_YS={_5viUEj1zOUAc-)NCYySSb1=i5KzudwV)xz4-f{kkB5o~4F zYsJa8eiLZpW^NOaZ9$W z!Ld+4*6lz9fUuAbrk0~u^f<4a!v*N!g5=r#&PfHycX$YPM(TA&m)JXR-zS%JdJ2k$ z>UBbGJ7Q8hj=FY1$X#(IT_KhoTzg$$x-0KbSGat4>b7)&Ubo@v?$T7z(4KCesLqOQ z(W33n+kZN0A3rEdeNZRZ6TIEkdZqhXR8PDm4n^teN$u$_>B`*hdC<@`$lM!c+51SZ zcQmzg;#}|J)ZWQIJx?tAW>b5fZ1*me^gS=>eQ~94JhktoeBUei{u$=J_wv0{sr}36 z`nO;7e<G(!02}0cjo>dR~Y?YN(O%Z>Hpd@@LR7ROb+}Lq%&R&?8(y+ zy>ynH{?%{?IgM7XH5(k6ay+iz^L(+E# zan3_BK7-0WLt0i3v3GmVy|{m28}3?i-$01h=PXXgqIiC*ssUB5YB209P@*W8CoQ0B zhbcJpi=EQ192mdF=3QxAUo19JX>CzGq*d+ITT>}1QTgpQ`Nrt6$YMk6qrhH4YlTN4 zJKVuLWx5ujyG3OmYRk-b*u&FGgfUfIH%j{J@}hliv(#6*IFG*a8neNSKd2k|n3887 zQbt)C!|UQB6*OGEJ)z!CP$KiG3C0M~`%&H9i2~}QhMfs31IVR-l6-ykc6{NX*8B!E zUxoeg^IxSOw#I~YD@^sP2AwAr3d8SD4r51mbVemGPo{*5N#Y}wcTZY~RjA^g&XnHr z(+~PjA&S$b)CrjHw219=VAeF#lW7*;Qs$4->>nQ)xK^1%W;oJk_+RDlHqHn?nc=aW zG25FFwtgo0FMRR5I2(1JmmEkWMh8~83O9Jg`wQq2nJO~jrql2v zw_Xj1mkS$vM(Fjp}y$&P58f=*KG7$z}Ubt4nT|crPDbM)p z`-XY%jqS0wu)&wwlJGYysb1nZpVvoN`f<)83C%_uZQ?kYe_9wC#6kvFPw#>5y_SBe zCHoZTej+mdp&xwxovG5A#kK1~GjHI8O;(wgsI1p|E3aV&@8$j-xp?h0AY$WhK{{=4 zG5_A$ePRH!V{4Wt-u(Of?%9(Mbn3IlV@2)l=HlvxlEbc9!zNHyC@&4wN=It6qd15_ z91mB)<3wyAK{%x8F5;>Zd{Y8#fk$$*AXIJOFdW9d-T3^zF&+-MJPi2aPt0e0Ty|OG zpre#`kx4|qmo65CaHIRdS;{T4f&h|Z104e9UJ~Yy%6A^G?EFzObEIwee%jX1uy}Q1 zTf)N-Hi(90rlY86>1rb^`_4m`ooQ)E$1YTa#{4ID_jAV1#M2!ZgUa1SU(==eRzbx;|3Z*_!>qmaBtXe2O9WgqY0Oe`>KB7t6Rp>(TcrCO|WqfhHKl? zPy@z^7bh&pxf=IZc9T?K&~?OF9NNBl_w>}R&>dWClc7TOg;f^=nd6@po_+z1xULhs z86sOZui;Ev_JkRG%>LWZ%KhV?=T!j{`3R1{WMeL+JX+EQ&ZGkQ^X4T&632u9 zlfk&BEa08J*awo$85HQc`3p+>#k2=?&W8HNB73ZH>Te&ma#A_LCU-%I+hcKh{b8)nC)^tqGJNp3JO0>?l!46Jk~F7jxE= z!j@<&cq1l~Bu+8$@c4GH6d*yl!OJWnHmD*ySO#=ieUcrnJiq6RV3TrQ+;tsJ;a0x% za&ganEKBm_9p|Ml7blA}{olP@`g(b~()i{PAw2M!t8-|+^lJIrmBrSJQ+LkyRHi~q z;3yUGdzX`6vAnf;K)py8dI>^b?|!^UuYLs$Mnl)uC;S+BSYQJ^Wj2I|6yvebwbNi+ zKq`EfJR7?vgpy3=bM-7=M;@E`+g?|AEhY*C%%*FtibPgIAYxla02VLfc{nX>_@oPI zi^|k~oheAvffSb19sjm?^``9FQ+XN6CPsjoCfFYCkwV=J%1sVC4YODyC6t({Fx$4OF1{=cOf4gZ{t=ge=XvukzFTEs=c8vDPhaq7y!zon`6}Gy9LjmZX@$b} zyaL z5sOE=@B3aZkNW=WGA)iL(z7b{PVD$AiVP0M73}MVIa&oSQaBx*ygFr~1w8kd;JeUq@UuEza zFvFg{da(VfpS3M-vzROq-1+*Lxlio7raykMcP68Q>LKCoahi~1_gLflHMr}b-w%PE zjjfJ9b?_U9{XZu1o z)InxvLvIRJHT#A0TMLJ}Q$_U(y)V)~N7_Az%{>Voyv8;D)S`5xJdK#1&HM5oOg}qf z@{;V`BFsf(TS@EAMb&Bo^T{LXf)fFZ1m3Hz%;yu0M1Joks!Y1FT$WKq@U&i(nssGM z8Y7AO?Ie+~ZWAsjV@XHbL}G3gcTKXfqRC8(HP;4D-J-GDG4@MmNa7qLdFlb&))`l; z-Gx7fo9e%_y;)pD;S0@)zg7D$cH z61g5|M@qyPN$HtZTQq7`qza9}U4k7dfGmz|n28vxnMukdE7=cDCSo~(oU6Ifi6RS| zdFe8My7bnH5}zal2eyn%I#wj^&;)Cj{f;DQy@F=fpKHSZoRc=tA7qMEVdA>a1v3C! zT&KQsma+t1GV+F?jD@Q3oEOcE5u7%4Hg5^P*a3Ih1%Du6_+Xr(uck&=$lJfNyffp-B*sa8vkEB35}5!3pg5G+Nq{3l4<*$>uXRtys?4`8zcLGd zbZ#YxGQls)x+0SF)e1)@er~5FrNn=_)@tO*LzRNg-6&{{OP7Xe9sXMe;Fu+oT zG2%K{91HrPy5i7i0in6BmWL0>UK?XCW~RJ%JKYK2Q;rUqz%j>-^e3n(8%S)s?!@vn z7)b?XrAK>6NS_%$o$w*M?7&0D^vuL5lQiZQI#kKAlp<5=IO zp@+`#94E0`lLz6MWUu1dq9=Yz$yNizt%3uc>Gr0E5SDaLWA(_X7?*Da=d5wu2NcB7 zTEP0$@`4q8O(u;!v}DyP^Rjg0%*pZZ9X;nWx#wJ=uuLeJu=a^nAh5C5QqU?3TM9Qj z2wNE)cMJNwuzGOZ8CTRDHkT^~tWqmqo3y|IfS|D8^&uiZxKQ?<;dT6h>iLe)uWO3_ zkrkyI8mdRynBBIcD*lWj0=w=QE&2IH3BJiN`BC}Y`XY_#{HD?2-P2v>q(skeSzeBu zEz1xvFaTEyr-tIsAi4_7pB*((;>A9$+zsJ1c-#~~e z@P4v;Ke0aZDYH*nYQJzVdgFhHy7PFb;ZLE!b*I?{qU$gJZzGXMY zHXlVA^7fFa~-Vq4hX z9Z$Wpz;SZKZv;{wE37ynIO}L&9?|vBd&#ulb7`qR8a@Ah3QYTReE^Wf6A^*r2A@(Q z#L|oF-$5fafLvQ{iGv>bJ_g(nth*o?at6o^PZxrxPsYRZ@eEaX#=Cf?0X$+B&-@0@ z@)^&1ibo>!*aY<0W%W3;^*Al`xZL!(L-cr(^-%eGyj6O9clG!O^aN)01mEZheby5` z)k7onMFjLQvihRh`eGLP;%@p9A^MWZ`q+GZseDBi>r6~MacMu39Sd@fKrmW^=V*f{ zM5%VN=!yx*%Nl%B3!x}RK7%l*2GzV;;8nHIT&*$C;$-F;$=9yZKYMC`M-cP`2>K!U z)>I-Ckjbq5oZ$T`UuPiSDHCokOK^W<=<(Um^VE=CARR;o1#STPL`D<8e7iUB zr4{BSRG+=9A^8bmVLxx!B=Zx)^`+o0{~!55&y8+97;l^!Uqw#lpeLUYrK81|W1vQt zl8tHAkc6tq*D~qPib?>0!8B5U9t6xAWcaNxpH0&GALbPLj$ELi&7Dd!DtC#y*6Hjh z6*P{`@V}HL1pusRg<#UIH4KVl&aF4mWgzCwPF?Zi)-}z7S(|{UK`;{>i4UGG*bl~* zm+~UPIiCSt7ZchnJgHDqiWWz&AZe^>+YB!W4Q8ffXq%XguRam1fy~n^Raq%tby>{+ z38>lFsSH_UgWt7XY-x9WRyUM8P@7p@pRM%nShrY7xL^ML&)hD4rsm$5hXihp^xKg= zJP-3{OcY8-LX2@frh_4q=Cd=wkz^;%*#`uRiF(3VzIktmVd7_tr>7PR2+PI0qTIOj zK5f$!fl@;nxCj6usNRlR*h6VagWYtKT|mras^|0xYvKReeQUe_hZquD0m^^XKk$}D zChrRKnFW#w9N1Jow?!T6-VT}nFu*@b$UJLpB1OZqP+$%eNM!|(i70)0I=6oMB;fPt zi;%gOggg|M1cGOw$ROA9nI#+vRSp)}eHzsAl&#-N-A;v4oPooppTUw>2j<>XF-&h2 z>S(Zz4lD$?O-)!>RMpO|2Te?_TThkDR{gf}s~vlMx0Lk`1BZ_JFk#BHO#sZ1L|i{Hd!JDl zPRw6n6Q){n_3b{BabP*@nBnFEw5-8J{TXXyCUvc=%Ljnj$`yJnvW&>^4#h3UJBrIH zVQX9D(=pblDzVLKUdu%Ax!Vkrt4FIGl9gXf#n=ewOmg4hks5q)UdPsxc4}<6DC{tv zptq>l1i*3z%_+G*NpLB_N0w|OKs``1YmF=>BvBSfH#*K3x|VKJkpb*qN2Zt? zd};rH=FnSVe%z7n&^BWnyJCtZYu6NnZ{IM#gJfbulBTZtiE!FDaA(WC@R*x+o%xpxl9M22QK__j)8*9BJRt>(A$Er)w=QWn>P&` z)@FId4GKk8FAloiopWtlTNOqSh05V>bCa|q!}eD~uE@q9pWKNH>~|`1uUQ&$Dxg6? zl`CB6lANH)gIlMsZvFGVc6rsZK>)h@FrCkY#J;XhS0}K9L)&dzFrVXQUKgvdX??L4w0Y(K(*-bdDNlh{WZ6`{DE2FIeXX*Z z%;4&LXVG=doOjJe_{-Wm@qCFx^R+cbwCk#uziZ=~`(-KD*RboG%x`12Tt5wZe5THM zd>Nzw3q(O@mr@^&sy#4By(#mVEr6vtg?Dmj?Z!7wEV%`CbubrA_wx|IfYM~3&g|mK z13Erm69We|L9`8FYE6LSLT2m*NquIb9cjiX3l5?*V~{4+W^76^_9lW@`I`AEMNh!G z$rS9~vn!f&@*E&GSbv#eF?6hltv(W4Ja+f!sVdEeP4YBsym|4$`=@p77x!WEx}Xq` zlJexoxmWLF5$G^i!MKeZvEClNE)w$_Qg1zEhJ0k_edL7BS`z^f0#HF}1?nlN>dAwS z@12F?TmiZtcN!Knaka7B6RXU+yXkA|cMp&6Zs+%3<08Uu;5at!E>ZhCbgI31g-TV4 z5OXak1M2Qe=}y2)b}9buQj;BTw!3D0t5Wv8wL)1V9f$1>H@>AUY75PnB!Ujzu8s?+ zsp2>%db46}0`G3XSr!E}T%uoCBkpgjhvnm%9d-;CDHaw|Z4T2Zi*7$1yc)b?BRw{+ zI0l~c83^%GFsf@oO9A0CKquIg$ERZB|eC6SzM`$iR8tqUZC% z%fWyog|)2uwGHN_;M7w7IhR@^whQfRq1t=ZKVQ|pc#-R}gJvmZ_IH_&F>Eo~yCZ+W zCo8~D_1Q$*+bEWcokAD8ZU)trc#61C><$BmWa-aH3ggo z?mW*Q^{i&Bwt0POUn+Iu4yiPOD4A%_W*B%Sko%QTvxE?Vo3oSol$D_;Eq_@9OZA_V7PL;ivQAf8U1x`x;LD7Y?ZD&BF|` zii~z9^371MhvN-i6Tjx5Wa{Ynbb?^ji~8~*2s)>H#5*`0zUg+?zI+UsmY@n^b<-XM~qZ*zoQnI29r6 zg!s{Q#VC2qgi~FlEGiq7&WLZ3bc!H#M729d%}qtIMib;7=L_tT#`X_*tfEysqmR!O zh5h)l5CDf!NDv&%rXS!k5z014TpYNHmdqESe#pn1-Os+A!9)bq%cY*sUC}Ylmw3l3 zZJCc(%QwB%Vsa*5_g%jE;~y(iF{(6Dfc57$7NCn@Qe$FzWy=JpF-?IHt71ye!qXw} zj7VvCOV9M-?({vx3~4vRj9kEW4CBX5gCfLf6MVTph?kXL-u!F|!cN~-{uTL}NN~;) zL}$_Cii+*yR7GMllw(Je{~vY^{_OMfM)J=qHBY3`YbXjM4%z``%)tZD9)(~l$ZvA{G{~NIl^}G0Nf?o(69G}oCOTMf8u}zF@ z+ZaUx65{BIwN5~!?gRAvVuAKj7stsXU&9|9R!d)MW@zG<)KAHNM>` zwvrsv^b%;!$*p)7?{fyYnufS7%p~_ACdVs2C+C=iP0G(nAfdDCpA*jq!Q1-Oiq#V6 zvC~Ss$G(AosySn)t|rrl>lw!9?tDMDOX&NN+4BnuaP$L)WSHu)Er4Hmd1}Sl1kme{ z;8~rQ!=R?tV1+`W+|<**pPy1^=igh*8y;A$bIu!er2NYV>AnIOyfS&>GYqEAuDv_A z-E_*RVsQ?WK25F6WJl7?Ia&QmX8bWg{=!3i%9^5zE!_F=_iN1jtlE`ImUz+>7=*5! z)n;DGvAj?WoR0^wF2D}3Y5it@UxcR+fqgxFMH4A95X5e>9$+gmb67?v!Xj~C~ z%P>z!5#!VGtkJGW7GRkp?;4tm4J7_PfytJ4cs~GATeNSeim%-ObE_r?CG>vUNrp69fPpm11MhrMCch7La2`D3n)J$vKIh|pxXeQH2GN}Xuw(z zkXi=;eByWQrvNrv6;Xh;LP;d!iNI9-H4WOT2$B?Yf-%>51n(ldFiM1a8%PtO=!?Uk zUIEqCI~5z*ka#$SOFwRqu+=vAPa4n+s z^;w#GW-Z=L8!c_A@g**1rer+9-smWp5OK^1Tz3Ie!~xH`dXlS@J0rf~Md(A@E8!St zap1lidl5>O);s9EK9V~OU3E3OXg1$q-)45RSW?z(@8kzG_-cSy@O|m#=?k~n1i=Dk z@4@?icV&k2iXVX#X`Cmkfk5XNhn-vJIFD~t=LCQBo6bq$41umG-bVob7Erz@K_`OD zeReC#Its!KncWxxmEsf3@s3Wq8}nekUl{SGOM`c z*08Sd)a`H%u^Cab>fp)j3=a@BOQ;qtjLhJ^dbfB=Mv)Ky1aK|ikDYN!R3JWO`-m|i z7$XF225?$W znzxd$AXhW+&SQ`TbCmOYp%Jh8Vuq72Kg~BHtVz40!e9lmz5s?TFKA2@qmXOnwi(}K z-9rZS{INkUS1WNa9Ri3GqCU(R45bwkBFWI4#;hxP=Rz`I zdqL@9HJKn3tvifR5^K6*NgrUKC$keYsRgFwBD}0Qx3m8T){I}uq9L3aQYs=C$FVwY zE9(Z!fXF;|C@iBc0&TF$b~REzeVfr=9HZgQz+9Qhg2P?s74(L>lHXp(MBULtc;&N6 zz5nEzUMztFUymKTZ9`okv+EpmDgqs7tQG@NErci@Sx&*UP;wWw6^o@AK7cT^k$o_+ zoGm>-*hYW8#H%|Atu1Nx{MD>`x_*&$2*Pve{|CKkTbFHgn zucKRWx`&8UAd;?oftWK2iF_DE8wc0t>1el?`XFGA!DNYKpAcx~%m}0<9%OX$Ndazq zSl_GEP%{U>M! zwz|P1?ANnW{C=z2VJF`b#mJ#(_o{z3wvZir016Tbt8)(N!d~`SR{tRTXl# zNm{pJP(RWkmZjp{a-R#8^+26B<@*Sgi*(S4%-a$7%fkJw-9GGL-)C8Ib-L%Z3p`{W ztMlvBk^6Gik_Zhg5MyLFvAFcM1@%Bztuv}q{@i}YFgd6L z7rS2jXE)@N@-8qCvwEWNvSNky`j(ukE>ivk@eox;ms&(6S zMYqw zN$`!YKT7%mCRySrS8;L^FQEqH>O6Wj)S9NxdNBhX>a^)%XfH*Co0;*Kt)n#v2FEiZ zYQ{ZL&?*qZi;3YC6v~GNx#QyC7l;+oA_YWq&8HJo@*u?W+4h3RTND(7e&6tn%^=>eFkON(zYq4Pp+s@i**g zYI@IYzcJ7F(oaSZp~3sJD)L2l2E@Amd>cl-3zf{LYi{4=$b-?m{pAzSjF& zMx*wi2wIm7kL9c)S{k453Ynqa?K!-a?u4RO7BU3i(T!C3PYM5h_3jmZ9b$wAoYzlu zJb%b}Tta&7-pM@OSYw!YclzR%8(jE%?HIiH*6-#_>t>;C1@2$L!bi2xAEvhmi0Ts^ zcTTenPFrs-*9|ToZ|(~l-0ZY;^|Bij1SwyolJ=L zwZ!*oBwzK*@70S%iP{ugIZR3b6h{E_?}8C-crorpjfVG{4aPXX9Ldu6y45+l0rdZY zsH&LGvis@rZRuhB^rg4-6}PB`asW5Yd#eJ$f+pG5i4xdF1EVcM3%!Ehqy$Re;PO@w zu|6&y&+0r}oWEt( z?M`|fYbyJ*#`K#?)dvO#LEUGhExj#(0iCQ_#;d`ceYbQ0%9^7f~$98?n;O^ zNces&^c||csNWFaSVs-1o4hz}crhR#{A4E_92ns!9$qkceZ4d+rNLt_KteunJYOPg zo8D7Ga!k1~$WihfvXRwY(kD#PJ1TJ0uQB5Chxp>agvt+Qba=Lo+2+`QZTtt{hs9?U z;7OW0JbWLL%>wUUcL+SF4&%jmPKcDOOZxo^yxP-vHGfBDqwzXoS7h2F;}<+Q>I2EO zQRHMQiE%e+zS>()k|-3IX&aP%0^fA;xzy8mrnxaJ44XUjHVxC5x-5}@KPat^FQ^(D z`(`)y*{+O6Q^o`~Psm4P+BLm$_sYmlNWsMAX>79M$NXubE6b8$%Q=Z2i0jpj4lcoy zeo`EvAFn5VEc>@ZEv(0;(7g;Q4zA#yuGlHfUl@tR1SQW4$x#~Xq@=zL?|$VnyJ03# zw7Hx#6f9%Y6j}Gt>)=k_Kdi4=Q=#V0jfcfGJGsS*Eo7hFtQM(iFtIw(_-4b0M91Ch zQ&NTUQXwq4RjX1CLDD75O;LPO7xs29hhbCZo6}l$1*UgerKK*t*(*8-Dt>q&>DON9 zs&tEPbICK~GPC?nl2jRE;UrpyUFBkz{>7e=JLT;k@)SS3L>W9?r*#pa4~Z_@KLqQ-MH5L&`-Uq zt#xr9!iKQD#dOr{%b(f{n(~7_Np$Ao72jHPxgfX}t z!w=cYXJ41!1X)*40ZSOhC3Xh7zq!vP+UWcX51kp76ip71ls+H1OFnH&t5;+gfFG#K zFDt*SEl4e6zQCCo-spZ=4qJGm+jhU@OR`z$Yaz4M3vy=Y(AQ?4*C#^PH=EwEn=XKf z5bicNK>no=?US~(a?>q7Ahn?F&9Ami$M)Cf+P4C}ytC{xM+lQ+3&1Y1rP^u-B_{HwEOs{A&NaBmeF4S2*m; zf^OKM=DjbKVF#|^2<*2*OxO?2FepmyXLkEf`ES39@BJ1EKPk9J3yFT}TK(RX|J8Nx z*yGIU(3zvn@YB^Zf0o1l&EGpcICBV&`13Fv#NToJ?AyP@TMM*w>DRa4d-te95#Zb3 zz~*O;h4ujs9QYy*X0ZR4op_RXX3=N=Y2`jc(jAC;I)}-K&|RDeA=45DXvpy~FEuk8 zFt99*APj6Zwi(Q6&5_9nR=Xm^Yh1=Ij@9^CwRET0O%@g=K*PPAnU#UXNr9~|-}1q8 zt}~I`zMWL9pSVqiNX{c%s%t0mr9JPXC2_RA#sdVn<2%UYE?bTQD({-NYGid2j_FYc z2PL8+C{mDzk@*HQuW>PN+IQr;NR~7O9<5GMVMf7AotQ_Rf=*F(gs~TXAWeP4lp?fQkSCS`Z%TEcS#*8ir*d+>f2}f z6D7ZNfc zG$QR#_4c8XOtiwSXwAH6<)tWH^k3V<)r+?(3vMA={ShIvx`Cb- zupFMUH!+Qm?zh$o?DqZhAEXP3@oH^03K6km$;3#F9<)yCKViw(eOTONWfeFBrj!>e z`_W-7()R8fN!!Y_Jeb}y`*vYUNO}bP(}Dh@V@At#Lx^*ZWb1_xZ~4GU_Mc<(tuAFD zp_O+N_CKeMsTiisx}D8;|AX{c`ss0~Vr6@=q6He0+7$T}7qyHXkaqR9x;sF++YXj7 zkG^PqSnJ~}c@wjj|D(BS$23Qx>9)k@kA)33R!xx@*&@zgLj_nbh^&3ystIebZ)$)RB`qV8SmD8mX7KwuK3J+x|FDVM|Cgo&(Y0^Jtv;N;US6o0%;3j^(5|tjK2Go(|c)W zgBB&k}kGR*6%G30)@|dKiMxMN6B&i<#{zpy2p0BZ5#znQfd&k$J zB*WhJ=d-p}?oB3n<`;G!v9Kjf3TSYMClo0qTwC&s=IgD4VZ*a!T2(i5o;4Ky@{b9W zq|OEe66?)R>g^J*Nj|JS^N__ovHW#HgVRZ( z_Q}n(lcsBlG|RO4c4ABGNlSNP>!Xv_(ZstmCwG?;+g_ivy-#fabkcs9c<;~2JxEdq z)1MBGq)z@nouWxyGJm=P5waFl{#Xjwlj0s(;$F@X@L&V*1v{6H48Zn>KK8ory~XQ zAvI&@H-Jpk>C9E*Co_hVX~|PB2WB%SkM3yB%@~fJO&+5sKeaPNBY-gj?d9EJxEo*@ zidejw{M=l}9IxYGLdq~48#91nDU=VNV_&pFafbLa1n9g~3V}Fi_6CosAsGLir!UAh zi#1;D(_Sprnab0?Fg$o^U%O>#(9CUc^fZM41w*GerV#&L$^7dIq{Ki|ms#=Av+4A~ zr~RV~EF~$|PY?Ab4QNAFyNg(tT@CxYs@O?d88O zA9PDMk_bIuF;pJ%Ga#r9H^Y*|h{NLfAi8+Z>PR9x;`AQ&?4j|=;kAkPIsbOc{(Uqa z`sOS}t@K(5?e{k#pHDs5*o8 zeSlnMq{MZkL`NPJbH?>Yp&n0kz}yXuPd%-N#vm9Q|2S3=ZI8GQhOo*bYJPlt-m0^U z-1P#m>B3@S86_l>r%$=Q?`?nL!EZge?muSK=8CR6%XSAr?lJ+Vv*~-$BFsBhjTjeT z?4vjPRT=U?3gp|VP-^mTj+{^0Ol+M#69q0z5+NvnL*819Ta^xFsWB~^)S`P?`2uvr z2(xEWxBQP|w~!Zlpr2;~9XY4<6@4N<@SSoYVu;hht!SLvJ(+C+Xn6T6 zhe_KDVAuOPf0lq^w}8lq3LM*)?!SSa_~zG6LjhCq3aFPkd7%Dqj{I-x0Avop z--CgbegiZM9m<;kH_DjOmL7^AEb2}QT(_V7ml-rU+Hm(^T2{Q615npw!&X2Twhycu z&oTQEJ(9*j7)BY=i&Aqadj^a_{0=8zt^fldmXn&j&o8tMa=#AgT`PSZHn=8Bj8KA$ zyaAxnFW-=%>gIsZOLpKb6CoYGM&9e~b4wn5q2``=`16uyDop73O&SvmYCRRyujWl+ zbu8b=VoqK0&Sksr?42)I;QT&YjauFBds#Zf4ekj@9G(&M4!9&JTyPG-)KJx zYVQ*|f8pMY#ElEx45}4xh#FyjC=I?{JqchhL=98!-@t1lu}@c{8XvjDOw>SQ)8V4a z+H(f8ix1jjwFOXK?D4P#!$LL#VwoKS%L6o-j4*cl z-tpM+^{Jx&kB=W$1h#~2`D6A0l)y0^g9-)5=XKd^1xH`*?9}6;o?fdnZi>*o4NMAr2 z=guOF!%#Up&Y}OCcrxS)C>G`Qh@gCTwbkz{TnRkgWL#@9cTH3%qf~9=LkG;#EWKO~xq5J*tu+CPpO5LZ)v6O3s8(*&)6qCn_Y7v@eGOac73XcQizCPyhW zw!i@8v{_){gN~DrZ5uds%k<^ z9T)RQ6G=t8+~?jlO%VpLW83sIAPN&ZmLw(aBLooiztQ zX9#$AOB)<$W+b8)#w=vgZ-_GH(pR=jit1(ca}t z0m0_hH9eGbQYZj*a+32ql-$!W*ov24KTkf@<52|w9Ah)RG(3~;!-i>~48!WWH7DK}AEb5V0Iov+$v`CXn_Vg2Y6C)W=4&uuUx~3Lpr>lZyGchJ%Lh zr<*8NBFe}8i_(*jtw*ahD98f1a0$2}aaLm*F@1PW*|z9^s-Y&i#qe56lqDB^2(2}NxnNiZCz9ml@ zZu~7h9+UEj%)4R#mgi;Un9AGl?GdM~yhq1VhcX9^+Fq!P2tcZU$W@s1XkOXpqryVpbDd5%sl4yvC(jBU6qTKBNqHvBcnTd>ygc2}c$e@rP3T80&);2B z&qQ2pl;rMejjrWYuI0u#&o=6ZPjlr8{R_IkV4oPj`ak7;>-+hruTRI&{_&ZD7ue%L zr+)_(PkEnzsy|*7PCdLe@+V3B*2&6A%6AYQXQ9gY$+HaIUxR1=e)bLc^Cr#e#DS{3 zb%T2Py^MO=c5wP!c$T1rVFP(J{G4&?bCbjOULj3i?L4JY@$=JmMrN2Hx|Ov_aU)` z48!`2MTJa{BL3YkWR#OQ8bD%;Yb961JTmzhU_joHp>J<4awS$45jrGMnDb6A`@eanH3vAzzj2vuiYDFCW zR_r3+pQt8|+xv)_JMN#K#ysnArycVf+bHR>vGXp#9|dr~M`Fa-nA>niL7m7;O@BHf z5bi}%x}97}3ZOh|#JvS6F9q(oZ)_JkxkHPj$u_9gMLvczEEqJ6ECYHv8KD>u?J0jt z8Z#0pz!U%)qb>r-34teU0xxVZtDOQHY?!S`p{Jcf9~FeZe;54SDZIu8eEu%{-bNVG zg=T&xytF9H#*T&+i!eMB7CaC+Vnfqj^rhG_{0C@3TZ~2*TI)dcrvkqSk$>{4ay z0B09A_W*1440Fd;qSjWb*;cH#Q%rQ7zp+>ZG9dy1B&=*@Uo3{k7u)r8@job*orw}y z^p}-Wbeni4_p;M-wg}i2mt8EDqDi9n*k!J;t0XS^q(|=@kz5Y-K{)4?-TN0mR-YBgQzm$J~z7 zNSxE+!E-|^PNSLU=8Glz-7%Jf_7+cL%wO~nu5ud3{;(7eFln9sFYVb8ek$gGe&phAD;g@gGb&z0+ruc(Fg zk9tFDIvsm^G3ASNv1~{c3D!9-XY)?5-aZ5Kf=BOyJC)08vH(0wbb~0IAB^z&eGeLq zWO*O!y)VHE;g(@9rLMA~EEkcW?+j^IeFAZAH#!+Ea@s$V=GeJWN(1?uWD3jtl3T2?ajC=r& z>aB~Cw2qQ=idHL&)_NIzmM6x*DaN=g#{6ZB6;G_4Q>;^2?D?0mo;-2BPH}-{aTj04 zh4WmRgmP==OY&`SSEJcW(U<{%tJ=#h&IeRo1F2-eB=f{)@n9H-+5Kw8(4_b)moO+a z%%>(SMnAFn2wQw9Aw!>oo0xFJHsR?d$)2*L1bs#yGz>-5Tz5(p_hH~(SA>ovWE^3C z@g$~zQ6+#gh6FCDSsUt01l6!>gGCk5M0#h*uWD)Hb;Q?KFx>IjI3AgWnz2G~`i-MY zzj-omUBXNsCI2nc6;e-ZR7mI?p;XADOZBKpmo(TV|@h*`o+v2i#{A(E>cSoA1Q?VE>zGclKFiN=2Mi^U-YH? zQX47b0d3fF^SXmrY4pp|@Cqs7Ie1SEOB5PhO+4p?=K=Jf$@LgrJ!l-jDn_w^`jjR8 zE`#|%@ii=`Xs{-_Jm*2VXdRt|7h(lK#`#pX{;tfUf-A09RHSb*)1l9R)~m`MRK(WZ zc&t$si=jD~2s1p`3?%T~<<@T(^v*g{Vipv=S&_n9p0`g%g}^i6K?0`d78_ z-T-+)7IH9`DYYW5lF-T;DWAGn%^@XU(xD;1bTSG3uQyOw61h);b2sR0CoR`Wr{ya4j_9TA^u8m8L(s_r$k zsqcYgsU~C5YICh?%ULgEjb=+DUw-JF7TQ?-Q39qiQL_DE^%YHQU0A>h14bVNo}lm$ zyz1YsHye5ZHI)!{5VZe$bFMcVhO+KTUFU)7LnMH<_g)Xrxw0CqgHioWDtt0@8+2Qr zr10l^&L-AyWVH6WG)aQ%ZIUEYU3)Lp^)k7lyNF%49$p6#+pmy%it73jeD2Q?T3uFe zUgNFy|I-tE9v%1S)*)}Z!sg8-jT;$>4+r@~N&J|)M-`#`EzytCtrDedU1jRzrN)wU zr})d3&JT)%cdJ{8Q+RzG?Kv7m8{7sX3NQ%D2)l?2bY!p=HUt6~+VSY+b?~g^(8t$9 z*Ts>}#0Yc(hHikuT7~^_9(~OJSO&w834m8$jevmB*t%iiWXXma01D=+fdUo+;|>CV z5Sq8$^Z}J00}zQ; zfhj40$?JEfMSMoJ1TgKVBUjwe_1aUl{zISs48?+Hr3Rje)=h=BO~ztoF0Nvv*ZbO& z$0QRZ=ij^;a~qzilBDp7E)QT7@$;{e79OuU_77m3-Rj)j&~K}j1>Vdntajh5l8mFN z)Ef%*33Aeg#;_4E#t>r*W0Z$sR`4uh{A?DQ*vvcKeRb#RHeV!wpSYiY`b2wF+-LbZ zzbN~gDo$+_hn3}=I z7gL4@Z$6drS-nL~dHhFf#o_OhP+ysaKiC>=-IbKV_kT<2KXKC4h~4$_NZxS)yhQjm zMZ|n)k^+xJ-P_uA(`tVPx^)-;ypzd#4ys{6fUqncX!g_%J$*3~4CZ7_L;|x;|4%-O zf*=6%DuP?TZ;EINZHfzFQ}uL`cQ^scwxI5gC}~-=ZvB!zontLa9Ga;P1w>WDl>ycR zJVe>+zCbM_BZWOAYxAYWhJq%Wqc^>YUQf=@?$y-$aYG-{JTPG%A1j6?AH4nW@*<>R zXwUpndOG;Mah;eDo_=?oqj()&x&9zN9Z>Y9$8Ef$?Ps;9Wo+=`cHI>B!C-<$BqG4T zs>l2H)U6FU4@{Kq!I#0Cgz7CR{oUNRyG27Q!e{sRJ>CflZ`}U(x%us$2>6rQ*^gyI zAIr2cbi)TUb=X5>N%FB6CUsLMZG%_$-A(`R1|wfYFrUwRO4@pUk|g~qdi=}g?Ypd7 zKVQ3{#XJ||hd%rN+m^et0}}rQBYo#U9f{ZdSbEz?)JN{2d2P+nX832)n@f@y2LPaJ zPXm4cFa8p+&hC4bo?pblU$?8jei1?gz_HynzMPK*&|c8{U{@?^*<`Xv490_)`S=*# zOtArMkcJkEie4K-29yvHUgi9q7AN9hEa=X~%h+@Qx_mN2w1icGYUJMOlf_1gY@iQy zSz&A`hp$dX%5|)Xjc8gTtwsx4Kj7&B*~XzvMoLg^El`Sx2Stw&-Th{sarP_koN>~( z8joe-!CM0wm;NyeybOBX2NX_hmwR^>@rlH_rPmeK8j$Uw2bjWO`i8qgyO{#b4pS_e zS?bco(4A)}1R!KwEzlR~_NrLwOvo{=E?~Y|FOS=_ix#GWo%&MckZNDX7ZO$r&J8~N z`Dvy5;=B35M@Qe*NArZOh6a8g?k=@@J{=nTbF}|{=9bmtxR^7HX3s(E{`!}%$TnfD zdDxNP^_g_07K+fWCBtl~Cm>a#2cV9_qyPSuv?hY}7WDYZJ@{8v8a6@RXexm49)Vv7 z@ftUR@{wyu0t&lmn~HuA5e}vJy(hwi%F%!j35&6pc!LK4%Dakiz*PR#)-}VqUbf6X zY%ivmhsd?rI4|vT&r+i?TozJctfO8;hwu!<4#A>pb9ulW>CpUv{Rxpu$Ye7Ud^3K#T+sW0O@Y=gY(Qq`--?}LaqcAV zY=Cjfu9s_>x4Am`Bw?oq5IYH|vR0V!HD*Pu6S}6r)_!EFXqb6OAJ*qlEwP+Vrtm=? zyTeX@derl;kLVsT`4%dbzTSBd#aMqAe}$XzPO(LUbm7DKU#-D8!q1qbs@HAJO72)Q zr02QTganOPak~N6#B$d8Ncbl~oketI@f+Pdzw}-bvqjDMyHGh5t*2O6kI$@e7EM)Mz1W?yTeV!*@0F3|!Vo`b6JQ~3 ze|EL)@?P!XkK1pP{|G9(2t79W*;xBOP^|99-d1V{7%kIwf3rpA-q5n{pF5NbiCRk! z%MvfNJkAjObhr1dv~~NVU($sKyR~lbj8otk7b5zK|_Cw{Z)DqT7lW{aMsV`HDA~{dgFndN7J+ zSqyaqQy@q5*F8FFB5*F4D5wv;cm$LMj+{a)z=&+N5wwMzOG4NQl6pk_Wr0Wxr>_r6 z_5z#xh0G^(6WAuj;_*~#jSVImXv(<`q5?tK;id_^g5s3ELkZI4(bibD7TjO*bq0RS zD@wmEzBAKoR+vMu$#jciojuP^=6o7tSm4H<&jYOiB5_->+VB?3MbTQDhEaU z!$h$J+b3oYfo)7}O<&igogOAC`&_z?6#IGEoP!0(`Y#bPit?4>^?1(AnEsbft%ZTvC}{ot?1GNv z-VPW5LR)7Lw$_;j3gtpW^InGq;{n>O2VRXY*;YMzFn}ZrU?U;22rm})Ra%nD|7L@m zM_P+E{~9+b<+d3{=o|PM$|M`J_BpH!+fOk-;fpS7i-}Pn@)7zZ8Q`JdQ7`@vgRmLV z9fa!ZMY4o($sqt91O>jL0^u3_2^5qZ}s-swHO51-LESIMbsXLI@{ zr93*bf6Er~<&@`XH+KWOpR$2gT$~|5#N?H}YT+_r zbjCA*$eRKF8~XVg7-D&+CZL?B3P>X}00B}E-#&zE*)oe??#~o0f9~GU`6j|Dx2mHm zS6H-61n?Sw-LHKxAupr(=bv|WLcvDka~!O0dOhwF-xAYXBP7Uw*7Q^_H__|(i3V!t zetR1q`*AK}@tNh+?&iH94d&1SuhTjv9>%s;OhgTQ4U~Wb8=JUBT^)Um%NFWNa{qdG z>#5;3$V&rAY+Em7S{nkhJz%JR`#q6=P!xnpd@;k`d5Od2ZOeE+B74n`nsx+Qw{PzX z?!4zOC)m%nj_QJ^ekO^zX2Sb#T}C@z6c~-`iZed5l~BL`HLT`u`m6;FFld z^w4UTae1AsiT@|q27%L;eUE;ED*!g>Dv18!*3q!AF7W@#^Pp8f&!pGyJ$$VHe*>4H zMDiHM{^!-pf4`;!hYq!Dv*CWgqn?Ekfk6xDQbvq9_-i0s+2A&c4^>_QNncJx1aNjv0&HY?;rM_;Qu@lB^mE4H^9`3A zjZ>C$QY81m57B@i00HA5mN@A)Yi~;myrquB4Q9;16KB;N@^ipgY{tv76l=ZoXD^8Z z#ze-Z#7*PWot#vspe*K+6Mbi*L$dKBnC(Q`gF%&cRRI*2evP985^S|%=d7k(4Vvaek z^`~7^*vmFWO3IPUfUcY+FJZ z&7)Tm9Bx#cPk3sPf&Lb@r{Ljd5d{hfEz9L?y_QTMdECm+s7Hhe{3dUhN5fbF4l*bP z3v_9ui~daiiOATFyy_!FbE=Fv#E0kmhn_0CfjH1O^!F&K%#^B%uD+JRI++0?XXKh| zt6644KgL#QUlwvrK8{GolG9GE#8vQ9!>*=-h*a}RFrtboL&v}Ai^G^k<7AHCfXjg1yZjEkw;C$=JLp|QD)?0v6lG>ipXf@0N@J9H$wDEtOGk5 z$pOUgKFSZB%=e{0g6j%{u^);Q1QLild%)0N6FqyoH@}CsV-zg$L=n{#b z!m@&!ClG*cfc42pr~nLTFHv0%P*rsTt$u^?5TQ}=V0~?%R57cxx2g)O zR}1StqFC8%)vuILbn^jXe&T8YBh>ib`=omfO{kfJyJN3W9PNc%?Wnv=J_G#SmS+X` z0!zG{3j{CZf43}=N0!a%mSHiaVp(O_x$?$>{8#VpN+p-vQbaC1L%mQ$cDt9=926ec zE1YHlRM~*G*QLv=rSiOj=W+1VQ5b0u?9MFU0Gb*TD6I)pLng#zi&c!0I@z6vrLZ(W z6qi_mZ%JD1v-ewj;?5vJ$!MhHR@x1=VsJeSEF$>(qiPARNS#s%VFOxAAUPgYKbv&< zFBAwXAqz>VJqP*sm5>_ArJ`e129(?2ZYYG#mS0tH>Q7lOPTCh#g}+c}RFB}TLp8Od zZhKVaT(2S?FU@?F&qxn^e9>3dCAr9Yu!!ncJ*rS7s{S}nv8IR(7)h?GU(K&-f4pMJ z=P-Cb`p^B-ip8Q1#g<9M3oXS*2gM-0636Kpqn|Z+_sRvm;^p>AQw8K7MfJ6Is%38F z2@%8Vx^+;`I(T#)qNtATdEIBsBQTyL7bna`XF+AAn9#vWbF3M4sPIviV`!ug+4%St zgmnv$dxByzPWg&baATrpKI zDVi*0-5~cDaKQ^`YBk74H-ITk=oDk^qDK8sjp{zIye*m2SiUptEdg^dZemE#7QmI+ zz~9ioAmCxBkSejcqDeDYq z{13Hy?ukyo&*vxSVa-8ZpPn?&Jb5;f(iUSXpo9gi>rnYjEe-%mm_=WpKNj_|XNcBA zxzQYgqy|w8gcq>C%!aW23pnlYat)#KiGVd=3cuKfuu0pQjyn!Om^W>HMfo4P?V=8# zTflA3N01ef7nmWGAxE#ePfNg)7DbK5<3p&pMl&mpXErKGhhbE|b>r)xKI%3)L-bis zqYT?9v|kbF{;Bh%G6w|tl6a+8Y^~l^8F@XkU27C#cKFg)y^qw<0md}j{%vx-A?rQd z>)+7~u7BafZV4a#fQ_X7qhwQ+k zBH{h^wCc5X8=mLu*JVLBo{yshOE}ughF_LD4nC@GKWHDUT^syo^_)>^@NhY+ha-A; z;O_8X$MEpy;Sn+SDKoyfOb7%3K|&B;S%LorbIbk@%bODoYDX6G0K|jxn-gAdJ{;Z? z$AaE_fgS5mpFY2lb%Fmc{+s&`@21$>?Tgm`%locCjLh4NET@h%9P(<0kE|FxM4TL1 zQn5eiczZO=Ye!-}gCG+_ z9IhO_n`U{J-AS7XpG>{>F{*Exk9UMmys$#`UBPJ{7tRUHkFjleq^8z%Sk1>j!yhBY zr`&Ivd%ocfFF6VJ0Z=#&s~rdu4f4f(5c=HD@#8c2C!6qY1xK1-Zs=!1J@_gX1i`*d zO?zkh1*I?c9w0&buz*Jh2PCs`?NTKe4{pyi!te4{eb(Tu85N^^{bS2#d(TM8`7MpJ z@3aaMW(X)X4X|@f?^VwR^-eN4F5v{}Bl;l(0rAhmmsn6h5&<&{K{_)|k10xl|6{_F zJDElvS-V-mV^csU3du?A9Uc$}9v4p^6V3W0t*V2HSy)w>V-23-wVRVU$>fVJ67%QY zcg%T+3wCk7-%~C2RR#Nf`3hvd5Bl=HwwnLU(WkGrOXq@@b_!B{fE(WCnF7eHB{|_9K5;FZv#9w=xETik(q;Dj`S>>B;O` zb&ZAGf7(%R$JdA97-q9!?)DKq->!26GF zF+BXzpWKW;kH7x;@$yd|?C(>fzu%<)-aG#{D(P?2i@zOT|8_C{(j^ajj1GIf4`1Cn z94I~Bo7I4XHGZge#1ef0j;(Nyu#^oygdjDI#^>3y4 z-}e{)*1!JSVEo&XWc)H>?07TwZZYSN~SS;V6+&Ehd;tNzj6MHgbt*w%>Vky>zvM?2QbetSaR@644 zTDQ(IIUR&(N3O>Hr*29qa~5`%F)Ow&YPb;)jvfj@yE2csSF)ZF%d;J17%vdx;XdvVkr=R@%^>+j}JhTeUXB| z<=d(zeqQ(U)rjB9YrOmKpZ*)M@ul-tp5F5oho9*n8)ymLAad`=mlq#`gn!3Qjn94U zFZO1{{9_y)F<7uT5Q|J54#G{q;$ecmb$Av@Dz>Lf=sOJ)YX+2Z8A+{>&bDkMIjR~e)VD1gY0)kO;_AUGOd zl6^{uE+u?bIWSJZ1HyE`dqK%r4d5-51t$7XeV{P7*P&m?QrXEi-FTRTELSYkt&B+@ z29f1$LIdCGh00~wQEh-vS@^+^2oSlmz>f*Ze>08=R)eMNoP?D>tjKWk279-f%XYh z@hx=V2iJbB+!A|yh-M=S7)6q~^g<`?Ymi^+O#JTkF;()Z*^{PLwQpJ!q%QTMJ`pL$ zFU(l|UTXD@FT8o`3&jvL>kg=3#t1k9am+h$Gv%Gjb$79qnMAc$I_J`~m)p)|7{PUY zv&`k5`QG0B8-ig6;pUSm@0r6EP&N__20!S<2~GgCk2-*c&~3k>W-Hw|wvJhKGC@Z% z8C@Dw9heM;8=nUx&7#o-3MF3dr4Hv85o+GuBlD@=`X1Bj<>Rli<;t_3-oDg-UqWH6 zW_vQ3tpBfAB7}kbA*|x1SU}QZ%i@ipZY|CYkYzN!{ccc%E@!aK1`T&V zwcLF57f$*$2x;q(n^4uZy70J0Vj#R6EBZWe?Y>=_2aw9CukZm>`R4+_QRj0>0PZ0U z4C~aMXl-S=aIn!ubNYGS6Z~jqe`%=TiDjzvtfew&y_iVR zwhT$~UE77Z*zQlpnoc(7ZU6+oMXDl4=Qs?V}Kh-3iI(f-dxmqQX=*UGq}XnAEF;4q)V zvwm<8S%{0>3Riy*#mfWSoAhCEC)t?WsRIfmVmxTJgat%?r9NnpPRv2WZfRyVhzF5D zm2nsXuc>Kaa=eH8S>9qDq;PdldL%X1l}q^b*0cB=67N}a9V{RnI)v<<#_`wYo37E3 zH0bK0yf%-u^4TnNFl>IyN_D6shY(MXaEkT zM~oGiEMYMXFpiTVWAaJR3sYo%2DD+&3EK;TAbN2cb8sM)h(42#V}mm1TXi^o+h{s) z7fnvT*i^1@XlZqiE-l?lVl$@UInX@hH2CbDYsWRV*jV)noHum89?Zh z1DSQqawd{w{>OqI`LII!jUu5d+3B8~DxmRh(CuYm!Toe3Sv+dN6EX{f<&~@ zz`&0qARKa~PfkN{W9eR6<-{gM_iK6|+GqFyVtgfkQ#Pz7wE2=eI{?)ig%g@cS(&-t zy?qNOAD*~+JL*f2H^b_78T5Vq%zU+fLBYp25fNE!eVx zU?fS*EVWbt`<`m=8}mkK=KKFXqW*$wlOone0pQdPo{m3r5HJ5oO=q)lm?g zGBFqFj@1#e`yWpin|Y>8kvwq8Z`uBO2cHf%bif$y?4|424Ej79+DYm@yvWia&p3!e zE1qCWIX&zrTbcGY=FXaCd~1T{qXV`pavx29{_mc`Of@;r_Us~s^ijdHg{LIt+Tuw; zy{n_&o6;_n1=>XywiEAYs0MynwciZph6slh9EE->eq2~g63{G&qOK_pU9ICs8v_xS zf`CN|Txy3;t&F{EV$|tpS_4`Zf3lulePt#9X zZ*v-)jrqhoZG_iG@kzmfSs_4w-|O>+I60RWWjeh^NZ+M zBiVo7&*P)by_jzU4&U#mdi3i_F8f{FGQU9ihmXC$QLmjO0CW34!r@P0z-XS~Zd};o)@n#aPABI0Yacqyx&OP{kL>>}U#>Mm{k>waF)2)3p&;fIADg z!A?Gg1hJ54*p(WjShupGEKmz&^P@lp)gUKlL^cQH4dr#^Du63H%XVWi89uW=`fQ*;8 zix;lKn~9N62$`L&W<7Nm0O+kO914NdA_~#GQKy??fe&A2_lBA=JbEEH{Wm82Z!Y%7 z>@Z7Y`Dh{F4?r$xqXTZj(v>`7A#n-eajeXPr4UVNfZrGZEYLJ-oj7hEi$tnLk_>0s zPC<#n^Yn`Y8F!nRz*Tl#D8Fc$bdyP}LO;bKRtaSh>kAm=^i&BW4BQ}}e3(B+yuM6Q zgSAK&pNX2*>%>&XfMzex#0nU|f@C6Js*h1YG^<)RePGu36J@YSjCMEGxE3*3s#0{CTo3cl3Gob^pY};)eyV{Zg3YrR{56sK3_Gz)v z#b`6V<}1A;>yslt7DqPL&D8)321&*%fbK!TFeI6UOd%m@Jj!~^ZU(vpW*-R!zzi}7 z7oQuLTKrw?ki)JuvauObl$)Zd+(yMC$;ZfYFScS?=oF9}WI>cBjiYEN#DOb$w!~ru zt$5moc@QfdLiuC`fNYB6gat5baCaJ%*~+Q>N_f~pfP1x()6QJN&@IE4w6<4EA&HI~UefnEZbqJn!`V*t*9|2SGCfUL!=e&hp^ zqeM}~w{h$C&H*B9%|wo78c-682%)BjfYFt#GRF;-a-XX0-d5*iQ-e9FcZxtxOT+r) zahy&@UjQU0fRY^>Q%LrVb<%z4qnX6(Il4aFD`DE8%T;kriER4K;_nkb9Y|r`5ffL}h&ET`;bc>fRnbH=DFLyru z4hV2*yk51oW0&#M#o;LV49vyhCizG>b{`7-$vG9((SqBZ(CX|CH2o0n^5N=vrue;5 zm`sLa#qO<>L&eBEnX!9^nZF;vj@F8%hdDTOpwyh~BWfXloMJ#n^`toy>Rx1rfR$-v zb{fDN($G0NNoi|Ypo0a-amtZp!Zb2`H1_zYW#JT=hYqO*zh)OA|NRV7GSN`GI~LYQ zR?b2t98dC`E|ib@7zDw@>OfnA+O}CmcS^gc=zQ? zTd$63YGf{O8a+^G;g(ICj?M*()=yWw^SoUDp=!zN?M>@(8>50tVs|g4?V{X@1F2(| z$m1u!SV7sYhPr0@9E)$mEnojAFKm5_`A7Q2ZdBD1IQyyJcIL;@%*O7_ChRMS6%1F9 z$j$^4-C|Q7vV#7jF-ZW&XZA-q<7*g6{8-4@0B&Q8dlaFszuvJwD3FXLGNH*%2b>=c zPP%qVv%WfDM~{A?gaB~TEJeq=c{Bxap9HLY-4&Vzo1t+Ukn(wN05SVpmh~w9E6b}C z4mi+&^pS9nMam`d>x^g9<^&D7#T0xt0XBa4?0%j1;hVIFZ9dyD*iv0On;a`g4C~Hm z?k{yTEmDoV9qEnEd}qnmEtv41d(z>m^AnTvSb+s~xdn|A3z}vNTBjC{`z@S^SkO*b z(7ChlALXQFLI2f)!TW`i%L|5k3r6rooWLSpZqfL};(sKQQ;Vj4i)Imv<_U`ycNQ%x z7Oh$qtzRwLykE3kUbNd|EZW1DhyqIva!ZaUmYmF%oKG#e_${4^SaMBRa=WwSUa{oS zvgG+{$?N?Rz(@Wt%I-bFY4cpJwJ06kt9+$pAq$O1%mfce~x6*P!%kd&y zBzE>^A?&m**01}|9HY3hwvs-KCZ9XOz3j&IbDur7I&HWuZAmvn$c5V`#h=xZv=t(= z@a3Bdm!AP)R!O4i=Btlcchkvo<&b}GWA^+T_3kA4t(=tz7+d2@Iwg9=E`S=2u$)5r*0CRu-R94h&N_wlNmmGr4_Ligk+vVXN~z=m+LmK0?(9acW^yHE$*tZ+ zC*3v+9B~WGkNFmr&hXnUL-a!yY6e*QiT)pHt9SqTFF&)3U&?kIJF`Xt3^To1gsI#X z34&9Se2z@+_-viT+L3O0azXsL7vm)!J&CC|>|XcM zz1ZJ&=Wi-Ai6%%D7V;NHOr__$&v_4|Q*>?%95Hd^L?6=XkFPP@$;;npPgAQa0_N|Z z{nWkElaJXMTOsNN&?+|4M*Vtl{@{PW_t3CZG8pNjYCYr0~{4rEcmY;kv3MjmKV;jebK!d&?mMvA{KXIcC)KHJ>hEcocyl|uH{!R z-_BhfBky`_%Kf>ta!PWWMQQi(=M-O-uo}E^4`%0N#*S63WFBH$Ay0fsn5Hi%k=zwg z+ZGWUDfzG}BIsI#)&t933?jIHm$W$-)_T83afg>$Y$u--VlFXQaPR77=u~Nd)uzPv zF=6e?cPZa?P_;#2FIFg#66B0x&$qi4$`R@Bcb$!pYa1D&bvqPd93}Em!W@voJd()M z((`tyFGOPlLc8d{`@4VTB}OT;$VDqjg<55Y4W<^jBCHCfI_oqD*=1A(0ry`I)ub8M zJv_o1v6zImN5ca$)U2@eIyu~hV}QlO?z0aI^RHjzku{vBJ*v&F$*U;Qsqk%>@VkI{ zat-D(c>PSFY+i_*aFqO6sU)A+2Te`lyl10tgeF-?1?*)qS@Bfn`d3`a<+Z8Y`38H; zR2&4G_g?(4=L67EvHw2*%Kp)}7U8|`cdo>a?8d!1^nQB?vDp~R*iQ()=5%laFg@Ca z-;2L<#mejEs@Xo~>CHEcXeis^fcA|d?MICtJYHS9!6tB{XY(fXa%vk-G~SW+%sk{a za%*_&@B93N?a-SG3hT*9q3Izps|nA;rD)%4qjI5E5Zwt$_Gdu=ATR)ISqXK=!pu3Q9@fp$sSu3aU4_y4m#KV` zXD1_>*wRd~^VN?VrBmVnZmj?!52{Scl5{Ms8;z9{0*;%4^D(~MWG<+5*J7Y^X&$JO z#->7vRp@?TonmZjaRo@CUJJ!NTrsgV2i!Dc-sCS0k2PKR&~RyOPxW(K=(q8jpx?)4 zI z7(PxJn!x!GJ|Oly6u`4wLXU&_9QXwtLNRy+O#H3mJSHdzmB)kw{N|CcKX3!U{g+mR z;w2Mw&L;ilKR;{j^7BD?n$MR+X&1dy=X29=JgcY-U5^}@42+BKyW4D>AIme?xt7Ya zZ5*OxEbvy;tUG7?a?a;!o9QlR+gvzs$W4=#E2qf_Ou_&HFbW3l-9+P4)C6`)-AVzZ z2{TQJ0|SZK3H1AceJBS|_etbIZ^K6RH1q8$_QhnAj2>8FqDkigIXIgpu{>>h@s?$b% zCAf5z{84@Y%xfc;4`F4epF(i|m+#C>UNPbOw3T_8iQ$kNz@!*xyp}Dxp)siVq(fs! z_4%R3u==)dKa}Ti3x|&y1;#kNaD>J;++LPM3}ipVxynf3=FTk~>nMW#%3@1Dj%eMP zppcsbrt?4NLMMow74Nj z;Stk8=HK>km=W>p5kTz2wh0)kk&ttB;d2x2l(POogP1evQN#UDiV_kn2AE#K+$5Hk zDc?9k`)Z~9nk$oEi_aP1#s4#J1;2~=Tj19cRc>Y?VR>lYlI(7fcUpK;rjEzHKrXMz zvACmkur*2bjy)Ue`Q2gHwev3*v-O|W7)5Yzn7vh2)cnz6G}(rG?v%c~DcDDZF^;0? z6_1gEK;L;n`1JGaN;&ZJiHE`HJNh#X;F8CQGPW2v_5MpU7$A2DXxCn+EsgSZAGc)o z-UmbhghdwnolWV79wqC?7{BNjZW6+w?x&|-y@H6fJiWM(G5}TUc?OQLqnc^V>;>!_ z?0tMFs50f|>Wri;_OXN6McLrhw2st6AC8ySQl4g`aUg>pPB8>d`c;^mdiGc618-E^&skGGzX2|; z4gbGh_hUk2)VLqKWlR=;l5w0oS#fGxJ-4&&`pTOA8V;~)ECd1wB7RqrydptBzfA>j zNBADYAB-!U+!+C|RhD*!z5jXLjSZ9DtX(8?r$1RzWtRe?PnAi5g_whu%&a&$K0^_U zB2K~<6c``@-C};~-rD3uHgp;9t~C&I?JnS@al5E@LJUm=O9}Z{N|_4n^?<9Tx~~KT zJzhQN`OvxIz#Nt5f zqM9pYbi{x?dpuVJ?|yJw0&K05b*X)#2#l{Z=CTYxZRzC7 zZgGPlmpUbyp<;Y!wQD0U(o?(CiG+UKserC6JET2@nKJjE`x4~8YJPikDGiF!i zps+y#;$XjmC^Eoor?ADR8;QvO-(O!h=*UW@!_Deq8RZaMJAKhOZA$RP zpQT#kc64l?(#i{P{$>1$lDJ!^_Ayp=uZe@qDnQOQhT*aNiy()CdMwW}uTKEYU3xx~ zRxs?hVQq0qdt7Sm+6(4R9)5@=t5_^Pv^_tMde%?a{1P68H|B?*6Ty$1av4j1HHOLx zaCyKs?b!hP8sc+(;%k{&)uKsu+jWls2T8qg65+Bd2=`4|5c>9d*9X%P5wdPm+548K zFyJ`CSAg9e!v@CXC9&nQCPzt~-@8ok8~(WN_aOFs8&oQmvvWNG1HLpskdq5xEyfg~ z2PKY|C=2abTx_$4FsljnJI>u&ehF{l?0@;rm4QeGfsiV7D z)N;pJ#&-~xO90;Pmm;C(uEvs1N(G+l0o>-=lrC}tR3Sh{L>;8gC&Q|cZtXCrG>B)_ zTG8q%Ld~R$>Q$ZQfL!^Tp_cud9^|_cxIG{{I^QfbI=vT zF~Kc@V-*k|SwbT$!UMPOF%0fP>f%8vXepD7Y*PVsP*Qc*u9Wt^%el3QHQ5_2-Zo7{ z{7J99T(x~w^RrcXX-c1suKu1Y+WW;wQ@A;Q!e|2V=+dUY)%NsXJuspF4BposwZXk8 zpr>Q>M?5R&JEz2Uo+M2!{ar3waE#Rb-%$jvtgQWWdNgnqX^FFEn=k{qaKfK&;fq=Zcg z${I|4!AY2xwFj)eLc1Jxlk9sy9-0LJ55Nj63iMiv6%jsPPRiI|TN#H!hfeiqi z6S25(=KcO$fEG>!O6Ro!COEp~6XvCLSUF3|^}xWymMOuRE;;!Lry`BlDQDVf@uN8I z8%c)0%Ktzm3s&yiq6&jR{9>SKV?S0CIhhD|8M6fI?S1F&)4n@d+@_8)`xFtVkFWDP zJ|{-yXOltCZGIQCU+6dDzQ!u$I6#J<4~h?_+MMt;MV4Wt=C6vCD=R^DV;3N_gB4-4(pL_6s7?<~2gLj&(u#^&9te_i!0{05 zj`?af1H1@=4-8PikueH15i%y2hrq^xv)htzk~)k3+$|`y1RWmuQ!TG_Y~;mAmAVY z-69Ak!@c_}bY*1mTg;yPyIep*EEbXD6^yQo)mVWs>AoCH09iVY4=St$@YW@;0|0x- zn@@eFEH-rN9Wq~?+0Dn_x@o<%JC)2Ph}^8*y-K;b+##7o zBmQ_29fPz?zF?lCyApdQDN7(83SIfC;09Qb-DvR>xgd`nG87wt?*Ku41A-H%cZ`9& z>z}g;kiOH8S( zEMsGJwp8i+PhH8bykd+Dv(3FP_WnhENfTv3veM?~S zrT|m|nzMZU!bU^z(0SGE_R4xq%J9o_ZoUFY)J zuYjq~(jkY_CIrwAtJep6uDeQ~_mZI>3onh&sQp{6{kNgU*sEoVaH4Y60B$VkYkYZ( zzlbwA9e)|boek6uL$vFl_E?x}9n2dG_pgJR*TJuC0g`nriFH09*ul&?L@}1_Q5{qv(Ecfp^ZUz>~Qjg?TM+w%WB-MH3>v`1Fd9~|# zjnw(f>-p@}`CaSzz10Q$>jf^W3tp=iyrnLbSTB^JE}T~{T&yngs9t1qb18WGSJH+> z)`n8^k4?i1i#G2LTNZyYPI-`${B}5V*UnscDezrl`zKNH9Y$KCtfroYWz#MV`HNEg z;Qh~mCYjabr@Lo74kMoC<^;=KYuMnquyQ>#AYr=d(sX5Wy`p(8t0tVaRbwl=LH3%4 zoTwy3(^sPPnDnNG+V4=dp<1a=>S?DRf0HtARP7W(KZ zOuKbk^HGETi+cSyEV4`#_heYvewze@ozPS{wjlBCekk@)n2vc9!Cnh48b-2#0AVvTdq{rdRtKpVjj0u(x)V+3a4*4j-~A54ZK)HdWr# zd#Pcnovk!<$0dG8*FKCG7iJ>rRpsKPX-ysO(p3FAYb+RQ6}MAty7(hz=)j`cYC5}v&6TO9+N`Pu zP2SdTm-mi4kE&ZH_-)d)oLrk9syZyg8&A3WYSlhP<-Wf7F?^SL`E+fmMo~Dh-kdYa zBa^r5#qH>?t>x+TeOK1oeuvSnbx41%uWo|}dh9}9+D3k~}2m*>0pi*U90L}X%XWYOF;P41wO zrVqj`gPc&ZY_A1_w|sRQuzOqB@q4aRvvR=sO!V##B_HGR+_0f~%ZOk+0`qHWruHmLe81jU$kA$dZqGd~g{XGz ziuAQ(6Pk7(8qEK-cs6RKWN;*gJr=zcdHk!U=c3MD>Atn*4lOU#`SLzh{#mwK)Ekg4 zfe>l)%4`Y^3l&9aWWug;rVE819VZCTIW+i>l5{ns~78()XJxE68} z8l$Oz*mGl<=Q%1svukg&;M)el=gqhD>x=YvwDemw_1o>AU-jv2hu}Jf^qZZa&z}Fi zy4wCM@9%R@(Z-@SkPU#!HqKEw#|Mog{^h$R0 z1sQaP-RO5Ucy-xefRSkMI`8nMw?S|8jlqn=et(0Z+KwS@gF){bLn$4@VFttf9dFid zy#CPf+P;JS^*VI1{cYpl=O(?c7Y>IdPmY&Af6H>RoBQTld4sMv{WsqZM?`OSF*?SB zI(j^BzVN>}CV2Aw?HliupHIji4b(=z`}=qN#f{!uorKiCpOlB{hB~L7oP3*c^W*KK zcOP!PH@Vp@c=BaR=T}LCnV_SY4;{1CCqH=S^?W^ip9uZ5c5{Ytl1b|v{m?$j+gW|f za3wM3wGNqAha$6%U*$E%-}M5CksIn_2IE@*`oG(w|ArcTA8`gaxb%~e>fQQ1@kukC-P&Wt_%7shBDzU`k0 z%?QY3Y_|T(CNg#(-C9q)^%nyCPH|ivZhxO4i&ktp$v#qLc>5eQfez2n# z7pl&Sip~t`tej!oO*FZFKf3OTV})H(j9IFB!+djE(4BuGr0VrYvIXG|eKJK&VNixZ znH;xPf8#u1tNUYe!XD4*GU-4$a82qbmG9dm>xwVd$?V5oBDw@&k!pS*1OHm zK)>U#!*EYn&MD#Ff5%6(>|t3pdJg9!dS#?-PI&lcG`F~&<~~0#xd=>dz7xWn&zTGx zv;Ez9xmhgYqi+3S=v&|1bHCe8e>r{IPNx3zop<6VA81bp{XS~-a9%zCe%9=$`Q7XD z*K8xFV_Ic(&Yq3B`P=E!P3_W(cM`6mUmI{eYS@Oy1Vb} z#y{&<7)Ec@UejINXz~9%8hWp2CIZy$KXdfE-|5!T-lBZ;nO|$Sp7!k}e*XG-@Z<>Xv=i@np>)ge5X19?0cvL#pfqU2) zVVQp)QIYAaFqy+12R9KI$xJxjG{<=*|7G!OV&X{xH}_2;!ZHYDLExK5rTO<7DmwVv z5axMHg-jLgvXTYD&+^w>G^+$VM7dH+Sf2^Kx*w%(;cJs8+?Q{5{ApI&rSJvOIU#f1 zk*xHqO$*{b^UY6gWM$mkS&#$?Tj05}Gvl=uF{lCy(_`6LY2k~~7-36GyX@@TrbSux z0!!QA?A!Nt7Ul86Ru1XeIS;j#6dekzT%Km<)`Tx9`>blq>Hq<`7L;%WtaT};kN@=m z(?^H)==#Nb<)jG^irP5oRDNdd&d!n%xAJWk`5S%9UH5G;HSR2D3u z==08U=$$%17)^!H!tC@uREY_ykngjHfJSd5DF!+^>9wRT8G%HI6t3_DWo8v~Y9U@| ziwWJje@XdGJ>F3E|{-`J#DeJptJj&p8p-XCq7%g>447E(CC*&4ZN~ zIu=Mco%$U(RmX89D13de(QI@Mj3k?|CKIMI5+T)pT{np7s7n4Kh?;|v-{UM`!_qC`UYIn>$M&6e-h@_ zek||Vo2wgPUlwRed~}`y7+FdNlwh3-g0QInU(gwZxmDQ%>LJFR1C!v!Qy_7+D@Z9J zI-g5^j|y@;(F*MgWvYGQOraJy00;TzjAtdyg3#CpozXf>U<(=su;LHHA z9lAadYx2PQ^xE<=v#9t|K0AaeN9=w+%dZv%!g@Qc&vqdWf*Fzho-^AO*E(73wqm(s zPyYxN#2D)Q2(=-?Y%h}7lilp1zlwg1+v))dD#3DO4nXpj&a0hfwHVa+EQ@($4-*iO za)pDrRv__Tox%&GD|&G$Q1U+pUPjCgkuW+!J%c`tMRTdhvG2Nr2)u~~R|D+aXI=pF zbi*$#Y(X$CvOVM2&m^agvw#7aZZ$fd5QEX`KbdjHGbP=uAPXi=HgGO zYqr;}OSj*@8sT&ksqjsAI9ehsf>r`DSftPmNdqNg41++Ry8RtXRCC)G>kV|=^YcTSSsK-c&3awlCflBFR2+=iG|X(Vg+{4_a!rN8t5#r)S~!Sto#jA zSvpOyV-8se(C2tx>_-}({_dQpWpW1lj=@PF@yH_KA3C`r>LGMU=%eRfd>FfR8J+9? zt;bgQ-|ok`iLZH>Bjn+vxFyorHBnOf^v8_|su&&|8cAX4!qVPK8}6@FAAMd+NA{bX z`IWn(x%kmu0nT>uHMQt_46qaQ57w-)8qbU$>!1)c#& zj0c-&100LRIe^L7vAF!*Y*^>L{T}ix*j8=Vg2e2P?w)xIItvI&k)*pe_Z}=T1~<`U z`<;Z%?+w9gTt0BF9`+_Qk6Y$nFC;)ygTuCt<}d$4ma(MO!s0i<*WMng)NZ9>@7I|? zEs+?VQ3xLU8;b-6M%G8|80CdqEUZLCX&qEJ7SXx^OS!zpSH}QwFbGmV6%DVzArKkh znI8?4YJ1s8z^@K|84LQ5&Ul4{r*Z4WlmK=aOu3Z~n*%6kV@_a1C)55QbYYH5ibq(A zJ+lOQf({HUKwn<|Yiz$SQu=F@8$ix+3mLP)OBBaL5U?w2>)Z@zCZC!bi^-LHQ(I`W zpNAKI>dY{&{#$5|G467EPHpt|iQ4Ur%p>qmj$*{>6hy?-ROH@Mk(!?(f8kt6x}jgm zcl7LzP#N*tcG+1^6Wh%8KzVUGVJbY*$H%98k(fIgGTm2n?`mi}^8jwyET?%e7w34mj5*w9@4_3g z>a*C~b1G@l8kisI7#_?#5AX-2$f~K?Xad_CKL(nW(hQY;c}2|nmskzE=IuC!Mwp3~ zc8^9_+zHgY$_pL%8pw$H%)j@zZWt>S+)io<&fzP5oqaTU*0N>TM z3%7O48+FBgww%$BON-+H0dnVgFz<1EN~L^+S+-Z@YLe(iukG5BP&8%@qyhr|ADYfH zs);Y|)@RZP5Fqp}p-Lwpy%~D%MWlBD5oyxFgeJWSh%^HT(xj_^prME$pnynGk$|Wm zsMxXnbMxN!-mjB2Yn`k$<;?!={p@inj1{Kk!Lih(B6oFS&@)CuV|=irNkhZ%TChQ_EJB1Z&ZM)|U8#zF^h z29^CyDTokjfPM9u>0kmv5g|Y~LHaUE_+k+RP8?AL&TKT&hq5LzBoJ8?nZR2Bvm~O! zIYiO3p-Dw-V3Nl6oN9hK) zmW>^pO&EwKNQw!2o>fJ;#U&+#yaak2d25=A8lbYfin4oe;V?uF6oHw8T{Hy=e4R~0 zRi)oKgXk?*@XRXoyzM^y;iPJLgG>J^Ffiw`+u{O8WQ6pjtRxkyh(muouB~!GKR8y_ zkk#d`q$`_?vHYyO?>EJyiXX8!*+?!fimL3Cs&B-S%~vi^uLh0?jDELei8E;$x4Rqdb=TRRf5pej*Zo)=`qu@F*$=lS zvD0>HUdu&3fz8&0Pr^5RKw-bXeN67`JpBMD!ZUwM6vS%Bx3XmC?wl)WS zEi)@a3M+kXKP6dbatIzj*?BhXRF3GR8hG#Q*QVMtx6P%91APD?u*IhNC=iZ24d+qV zCcB=$<#RXA<(ZlfQZ2}d+wbD-pbDU{5NG-)&PjvF_R-KvCNB8rv-lKal51QP>9(iv zohZT8Fm~Puk)LtH+0mkR&XLv6|2uOo;!+Iv&nWRbF`Rc|l~<#?U5#Ag>Bsf`B0Z~2x_x1yiN>1c2_mr*b+mpFFHIfym2td8SkBi&n0Nw;TFbeKV0KsHN z*73NgQ}OF}pb8BbM7$UiAD{d){)Aj=e|&Nx7AZgJ!ZpcQNgr|fal{gyvHI&5`6330 zoNVbl(MXVaCE>$F0^2tF(J4?(War{bzQar0i%n!}O#TN_Uh^2B*DgX-7Ij}&b}?2d zU-ot|z_+SpT4iXhDI3CN&VMQgXyP3bfkZXvbFFiu0xFFGOqg@)Ok zBl24faG(Lc{PYmVd0ufj8{`(v9+*4ZlXWZpD1_I5J}N~Sz={fr`1#-;tD+P6eBoLJ z-SH%bqd4ZO)Xys=&#sU}PhB*;UGPM+kaOrF3m>crmLSYuDi~klBN6yv&=~wuXwj5y z=L0)~Io}@!=^=ufxAXb=!Iy+$yZv%Ft^!&=!+$EenTT8fAc@MV`1VT1x?6o*bh2@n z&Z-NFtUw_)nE=9l`h%*Mq6Mn{K$FDMrQD#;ahGl`+ zC;_%@1Q)`BYHq+pz>EM^oIx4`j&R$znXM5cMrbPwV3z`-dCy;C@{hB@*j7MWMYX88 zJBAh3Jmbs@C~50f7a`_$eo*kt@y3<-&eOjUo&qf=as8dcDvXL6swCFBiC^}bTEWAp zbH6hkoOqo@yKL|`=v%z1=WT@o`ZEFrHh{69sk4y)3&HFB5ODhAev(y3OW=>@Ati&Y zvG1(5nJ(!npqLnlcHGfUdk|0SUFW?85j)=f?AUx1Iav2|U3u2rU^e(o-* zqDGYPr;lH(|JDQ{rm6pKjmt2nLNA@F`5zf!KgJ?U7=y_7J|u|aJo>J@Zlh~`rADLlEZfzL(Y>0M zKkgIBw)Dlc_uuV2^Xr~?xuMPjLp|g}lca}ka>mA@CGbYR80Gt9!E`tMBBU)-0!xaE|I zmcr*F-ca4>)nz5J{T5ErC1;R^C8~Rz7r}zyaDI8+_(cFvFrI{M7l7F~z zVX}r8ZE3^nMQCcJ-^Q!&DZ^$bUc$YoyrYW^FNeXg&EkN~7%!#dyCdwd=O)5nNpH9shN`s(fID~RxVmHAb36Ou^|i6Z_-fMA#g3?Q)Jh2Az9zGXSo9HBy< zu`I`kl^?0h$8dWhzWwr}sH`-QlQvqd5AD%eK9pYG+Gpb4np?Un5SfJvSOm7P61bJq z^-CA4`Vux)i<@BEFR3nduf0;mU%uMEEWUH9{!xb4@{@b--U@;Dx=eik?Rfpif3DUk zR_HU^=0pDbpM_~Uo`Bg6uy&EB`Q>2(1m+b`aE{C;^_>reV_`K!W#V9p^d5PL_R%dB zDGM5|6U^#L5U~dBfqm@i5d8#LEYyC9fJh?K(KJ-7;g3)nPMwT6q+*S!Rp&&0UJz*) zzxYLt_M|)c;O!sj0`7k@6+i?;ly$<@H<<_jyKR+VOa zvl01zqZ@IL@XPP!ui4Glb6&(`+E0l784eIo$%2|Mg(v-lnCe1bFoiK)HmzsZ0b&@_ z)MN5bUu-2$mr7VY!g6fEYTb~Ra&{Mud}m6zm4f958y{yvj-b|hsE=Bv%Pw2R2bhS= z^72$qezLEW(Iu=Thv)NeZRxzjAeIREnsS0P9D&bQoy&kt8?8+v&_x5QDiucc=ZFRp z!iyR0PjKK^08(O~-fq0$rECtWD)=w&@<#fNB>l>67Krj6%V6Xc=&G&i4M`7r((>j# zcjsCg+X;A&LpZTA0KT-=Tu>D?|1faAF^lZlyHlEP@}Kie8TDlq+)RhT*UVz3Rwr3K z{M;?F?>M5ELBZ|sFLOt%ggGvt9oH`MW+p`H{4u@P(v160LFA3JaZjWcOOGf=>hBG+ zl8b;R7IKFl91;^)c_u48B2z101fyjT1Pt6BA}|_q?RZ6x7fzO%;gqNNvw?lcdh~_U zYy1I=g9O1$S_XtD3A}7uIk0ot(e`R!xwCg} zP^EjsOwbkYG{)d6|00XvtHJfT!PQ}1Gr=_x_p}5=vov`TaE81cB5e~&aU^b!n-}UH63C5-q=`C&aP_Wv^s&=7u15t~I@Txu(2{99RrclOwIWz#reH~! zy0*X#322dgrA7A9Zd<{k_Vb$wzp23D%2e1Hi;2o#?Ok9XOrqcPi*|KCm=?I% z8tmv%aw8>A;zQRh%e}J(Gu|GZFI*Jv) z-!oI%#r&AhjG;sdBFCAO<{~FpPhz4bIqa;XXb*UN3ZkY=_3;=w5h*&ew6v#z8N*9# z|2#E;`4Tnljfx3umw93xGtV3|r!uYnX)fl8J`EGQV8~_@yJ#v>7`tStG#~qvRf&j1 z1lAfrWmZ&j?o)d!o9|a9g@$rPZHsN<9(dS!U04t6o{xJGai1mrW%Lu9_>H*D!uVH7 zpXTE?(`YOS)O0r6gsp6mqJ-@{rN;@ci%zm8?v&ZtCcdfkDN1}>eg1LcyZVc)NxO~3 zwn=*}*NT$fw|75I+V8s0ntagr#5VcE?aiX(kHeoHCx5y}V@)|6XR}NBJoRE!;<7FS z4wMd{7e<~ux)J_ne8%o#;1}~SkyGEBk~gJjM~psp*k9+pi${OG>DWyDzI|dU_0PfT z-?XF8`KM@~e}8&%k@g?0xaCh)ZX%5Q;2UBW2fgi1UiicRV=a^LR}bs=Rn8G1sX10E zkB{J;Ttdx%Gx!tLogQkq2`%2y=g323?I*J`zgZnqc~D|5DnE@eiJ9P9vCrT~kl8Mx zCvi+sIa(u*Ul0^Mi60AefriR@YK>BNb-~7@c7}5`))2b5i$xRB_5dzLzXI-MBiYVWL@TG0j!Rk*7AEZc% zc8AXU$nITTFKE^{srlfS3un!%rkx*oi4WBuI~I0W`{3T?5I!qku5j->BbbP8iDKob z{u%yG^=aaarj*mAnh{CuD>F8(Qp@C8)f*xrOp7^|v5m1FOFH~XR`x9mWgnbh$q6P* znyZwNQ8t0*r`s&tW1SN%b+@ev76b?XrKZ7`@3g(1+g7~qOFbi0s6TUM?wV;RSy)oW z20m=%EgPF{tndyGw{+G{@DKXun) zrC&_Fm+NL{kW&8ooFZGdXGI+AId!cgKex(=(VIxiVa7QSZDH z9-m~ncI;WHN}aC}TdTEDoa-Inau7LDb${`PeM`6H1O@vM8_L^kQ?BX7mNQ^Ow%JCJvoH{ZM7Ng=70xi!tc z{IYU>}MH!@6W8EciC z6rA7He|P$6(TZy0(}K6w9Y;kD_vqJ*M6l82rMdRBvmGX*{?=a;m+OvwzhNL8Y^`HH z+tTvA!{9^MvDL&$cInURP3^Wdv?YhTXD6w?a4Vm7S*~$Hs)BFK8a3?BvwNh9maw*e z&TRR~FLxC03|)H-j%yllB-?98ZLB^#%*L zf8*h&bnMI0zv??<%>Nyh0nb+qIgMj7$6n-bzG!0bS(>=I8kykaDZ%_xbE<+j3SeLE z2rBtJRO|Y5r$u*5>{|S&UD{OEyObTKcS9LVqaWjRwl>sOHU7rli>|u-<;{toLrY%s zv9%p9-|3wHwS3Mty8UVG8)c=Wl~1Gha`yke{}!k9Z01;8?a9%1Zts%5Pbt=4H~YI6 zacOw@0_)fAD;xVsc6Xo66dm?I{6{;GJg>dB|55ou|BH?Fv)zQd!v|mJ8~rCOXHPbd z&h!sg*R96ky+)JVI#;a+jC#t-#@>2itSdt zp6@wkZ*0|L-aBG4H!1u3VZ!I@`&|C%9bDTS-8M}td3A3@_r&>Ei;5mS?kRfui2{kw zKHjb=z9VPa&-~}#t1CxOeg+@;h1zX@`a1sdj^eGt8ds(lr+)tnyiI%d>7q-z&oqPe zR*=!ZXA(un?Hd_V|Ngva<$Upn#%W}*^Y)drSq7`eh_nOVi#*f5$RNL<2T9`Q>5?Jo zw*nkSzj;1l0H^^Mh31Qs+>+H?9ycpeU(+t>6;7rjoPGAiQ#j&1nq2~zUEO-`Br3eg zc*ChzteV1qWc4U0jn6z&Q#0w2WR~XO#h#tiRmqbu^@~1kZsCDhrnkI5nRuqW$#M>H z)mS6igk-yOd+L~^IyQRGXk^3HE=}!ZZ9cr@;Fh$9^qu`_GsJC;)^u~IN;wl^{rqiO z*#&RDR!Q{jbY{t1-f0roT83wWpWyB#d$dd8vs1^V^P0@_n$bE|hEQP?Pwg;zp|U$jZC++glY+HT?bBcHjDEcP7xXDuEDt**9w*&Rnjr;030 zj=h{q)j)eWu7nv#`O<)B0HfEVuA8-|23?h?f7G1mwP| zr8b$Y?rdQhXXG+)?q%G$&&|cSJr5|i$kjOUS$yujo5U;Q1lAi<1bR^Pk+=v=O7msWC%myVotCqjpxje;}yAW(Fnwx7LT6!wC;&fX@ zZj3!&U0B4ZUvrYggtDl4?=Qf^glTU9=7rmAqSs+jR=sm#^O7FR1muU^T$dbRCp&CJ!h zy{p$4s~cphn=GoEL#uD(R=2fPcg$4ZT=(mtpqmUJWh{JbN3HCDLO_(bxqEmdN@OrS*4C zm(pao?dbpwdu%a|q0xZ+FA>jV*}$9Ez~A1`SPDI6Crf+=0%T~(fKw8{j{$_3a)bC5 z+QlAJlIwZa8=4?^7ma`w!h<9N*3=#@+5?XTNLhC>f`pnOU_E>>6)+&{+bBKU;I7hS zC)?~~+5C&Y88AVGi*C++)LQtyl|0ny*iiQy;q?8LE990WqK{*eJ`=Qf50$1I!wZB`<{oC)p z@3_y@nSE7vwJjXUPG%x@GGV1*cnmw)QqvtSMS<&5P@9SFh;~awJTL`%!PurUT6wrU zKfRc-{B}h~19!@fYDx8dK|(-Rv`{=_ua4G_x?BB`{sG~ z@ju<-`F)aqdhz^yvT}VaE!~Rweaf@F63l(a1$%t>JN5SaPo7QJnY9;VCu=9T%Tha$ z21xhDhkUz=4nLfoF93 zIpg|${@f0K(I>^+V`bQBCCO1whHK)XP`Xx(M z93t)<=5icCSo*wzGl6hcP6hHOU@ZvkoHBPMM47elh->y(13btb1M3hNk)yAp1`y$q zq`Sk+cON^9yx1SzWWKkvGCCzozLngDG+;=zm+=D~fXImKLBvP@KNjnRTeC2Ww+sXfLCXm~EHFINWBIB(}T@7#pm!33>;!XjPi zM3nsg=^Lho_!C=5iX(@S&^?2{6AtnZoJMr)!>_tpKk!I@aC+{6*TIA9{SPklPx*AV znpsbsDVPea)e6N))XhwV%}JieJdCk^cp>~@e8I!S&WFi!4^s~wUc^k3*rZdLlU1Odp$BOdsU& zoSwrRm6Y8`W7!*>*PVM7KA&Pe-!pkj6Inu~#mtS?n`i;`dtQ5nhr`T@qGUNN8Cqza843 z9vT*RRy;LKU2joxeo=1zsrKk1+lQwoS(aoro@(4YYf|^r^xTqx!jjqivW(5L?agJK zf6JN*%Qo|&3N{O1{+XBX7~xKW(Zl%QOBVtP6G9$(h+bL=m|qFF6q|YDLX_9aIhNI! z4=d55@n>yTV{Wd-pIc4P<2XORnqIe>%CeS9yOLn=Fd_L|Y~aR)v!iimKCC9{t>?_I zWb3V6nvW~Lxn3Z=R#&)QTep5u?|GxwTIRX+`nu;8qw8(L&#&1$zp=62nY!NkfhX^H ztns^NcjsSpCqGdi3j92rZ)utwU{!j*u3V$_iSp6J^u~)PEE`4dUk3i_(rfKMfqe8< zePdrc```QAL%w@2gg0K>yyB}azE@i`F=$U2oZ(1(wNMehKVP_nx%Uuy{?M8Yf7kS zON4b>RB>C}c3U!H`*_i|OxL#D<86hH+e)mjm1&BvPuRXz`zW*^BQS|W+4V4sDWgS7 zFiJ!fNrM_XuSjAH%Ckq@QmMH$1kjK8#JWfVHXi3C zG8jgpS+Kn7co0Yr!bYN;SV04T0;tSlt5{%F)-C{%Lqt1a?rV^)!q^&6j%!u zErfmFmGOYiUOGd-hT%anj)SEGg&4!YDXwp1cWtrpC2%g?sWjFP zi?7T)!ZE2>ju0FyC=H%Vv&TNt=PWt~2Y?BG$VAlwTM@mVZjWt4?^zAsiz~z4r8NzI zz~xdHZ*%SsN1`e9Ov%K3L@zUEB;z<`KYoRIO#fg&3VO(T2(vq!eRaV8_h8BPGxsMW zPHWT%0h@t`=uJ`Z1))ahBSM*h)e0+#NA`Q%lh}g4^2RFsZhX(*C~nDd0*6SB1j0S+ z!hXG$hc&_~LW=T;liJ4t0fF*ma-pAMk2NMk2_+22$k4RbR|#2;i}pwcEJ}^ASKo9W zT>@9b(F>{3*@vG1h514W#tQMK=&&b0j@Uojg?~={^fUSTeI`7h zSYd~0C5+$@js$NUmA@b$NPrE<`@&@JH%kZL#Ku}8m~J>MHv4FEh~S_Zz$imN=&;e% zMFw?CY?&QLJ`O_QVTORG-yMp^qRbAFNI!%!9%+b$E8DBpUA%|zgYlBly%d!6h?dVa zxGaIGH4>2?`NNRNYz25n6;XQj(&LIhnV!&B`ETWX$K1z*i|7A)$42;VHK=5dO(xff zFTml4=m_fj0;NxgMR-S#7#xf4?+}3ltR}#WI0em8NRe1ftug^JHB9nFqxki{zLzT7&E zF<{?0jLvapH%LZlS4A>Ys*2`N5@Ysoinstk@e!oAq(HlCFUMTe@&}K>s5g(BJyt(@ zjU;}bvKe0e9Xw0wa)?5rIL0np6g$N=B}!pfBSMh<{fA_k%<=e z^$mRrH(=3}qf#Mk-L#rGYmpa<34NMIdLm6STZi$oY_|XU(Dv zu927sUN>r*$sWL0+(!;6=hlO zKeeoprodT@(PKz%dAuqlj3ACNN_Jw$QOa}pTMSwUG`s&!1FbiXdg*y;cI_SKF6 z=Z>{EWLEoTZ_Mcu>tIT2zpRSk*Ui;fWsM3Vzq;-V6~2s%xmn7ni6mdrDbZz}VJyAw zufIxcwY{IqN1+r$eUy-NlXhyLm}8w_AmC1#9fMWG=9~xi@9&-$+ZV${A_I-`VT9vG z;*qmqtIl8N!-t-&%xm=qef5xQO8I7tbh=IxbK`|HGYU?5Ck6u62re?8K|(FXY*hk1 zscbbKayRyv!1R?DjfO<~CnIw8q=R zmpXzji9wYfaleA90xA=OtIyv46Jqb$+*(85HDv6}JW^ny= z!ct~>E`d9MED;MMO4ajR1x?35j$t}KHro9<)1bLsx>z1k`*fy%wMF9>F{}WQZD8fJ zN`0z(m>BOYE~8YD=?p{?ga~ig8=+Q$Gmt7lf-y#o6jAY?D=9ILe!u-2vtY!V8oOkr z@h^7S=~U|XCB08=g+|B18qzb|eQDbdAj@GJQg7TBoivfY@|{P z60y{oFV%NM6KIXic5qwQs5iDSkXEW{KZgiFWd!`|Z| zY)Jzz-0!-$IH5oXLnv>YGZD3!QQ@n1tmp^~lJojy={Dt9*^k%~C2hk*@C>4plreY? z?-glX!WA=7L`3?yl@F_A)dYed5J{OE#$V#*#EUB=mRXKTQy88N1Zyy7*__XIs(meS zMr%INHn!z!Ce`^3JX;wpbZo2k!1;_`fT>;bTc>M(cFvsq_sfomT0VXxzXR(5kV-8n z?5#vALAd=!w!U*CXLE>&LXty4u&RBieWU5gX@}x$XB8ZGsD(|EV|j~nvs_T9mDg`a zTGfaNrpKTCOKc1a%r;)3UjLa?c8eW((cq8 z=5jO1r8C&2!{bfZsnOpqJ=rdu4)pg8Pvi>H-Uh{dXn4M|hsZ5Y6$}4o;TgJ!KF|d> z&wMA@IighR@kBP>&&G_FfZl}D#vy|~@ICIhHj!uCvtoQIUEYJtq_*2vC4Bab-k;M8 z*{%aksi%SJp&ItOIxFZgU<=z4a6cfU&YRyvqwrX4B=xu(A5maIJd-Yo!tNjL=cr`1 z*U?S1yo(cP#gg>Nq7b+OH8=X|zUP$p@Zt=r3qc@|%BFAdfdB8oneWj5I%f+Q!T)#8 z;v8Xo2>`9gOiXt$!XbhLbeO!cEe0w6_Ltn3X-!fW+U&xfTP2XR&bcUyiY;Wqm(8Yl zeS0zyIE1G>bh;*v1)5$MThL@bX@nm`FZV!lxE<^{<{}<32>9PXtUKjGinS&ox-j}Yim>K&9Dq29!t2*k05 z;(KoYYwYAR=anF2@(z$0NZ$NmsDTF7GkiM7rZmsk{EI5N@5g~kQM?r zUeIIj5~PXw+|PlFktYQXn50=L6ZIJ+0k~pZ~tzxcKkG#VW2(!Y5&e1Wp139giIPuNsYzCc<*mxRb9WBqDALqD_v} zN*8*UL(*yggEn<5EaCw2gbafcpjM^CG(fkmjGnz)xx+lhECeKB`a0E0bT;W5&fJ~Z z;n#5R_AZ)*nqdG)Y=}H7G%E9mo12j1*U-dM&Svjcq22?e28a?NS1o5dr8}|0{i;uU z#_1)i`Ql2ihfgZ~HN<0#l>d(ZjbU{r0+Kn>2TKqTEFF`nRn!z37$kZR@?=&C*mmHD zH~`AtfV%@pu+KE&L+c6U=sSz8Qbx~?!5{aJ(TTyUnv;y{M3}v@u3HA*2->u^CVws6 zjEm6?2UnfWAiE*u*M>;uHMjh3YbVvv;j3&VS7mfr+y_f!Rk8BR*zYgK3j~d5K7UPo zF{XaH%1>bku!eidm#Gw)RWF{=x84mQ*mI=GuLf}eL=wvq85Sk>^bm&Sg8{xwj>Cyx zjzmT@WE#nGUI+$Z%}!cRa@3-&rHPUu^%pQ8{-BkG2=;PFj5+DnN{A|rCu`ugeF$<>fdUnEz`{Zr9s+{En@+p z2mh@KY7VqK`3=s#CXQYc%XA}I2>>a%n&xoJR0Po7g=p+_U*JNM{PRb-hmRQPeJ{RN z`T}T<5a3{F0$P!yTZ}=3AySmMW|??qh{=&frRf?19Re5^kV7i>Gc33z6YpQ%>6sZA zyfSA!|I+&LfpuLUwvl);ThthZn^rN%!AaZbNaQW6+Niylc{Z2N!>4yAQYz#hKjM>;u=ywU|8)T#=+_>PusWQw(nAGcdg5}|1w)I&|65+_-We@bG93K zwx9mm9%Af13q8^Q1-|OqeLcW^@wEF9Zuc|A?x?`-SFPRePP;!Nc7NyW{=KyO@4$}s z*AB4QL&Ekj1$(%jJ;KHwDLi3tL<~$Ig(c0=q)XTjD9yQK;=^ybgYO@W8p`2z7yA8K z2Vmxd)GGCZ79`FA;4_%q?Rirj_zE4A1OFFfmx&tGfB0GK6`g&W10uqp?dLaN380_D zpchPCEUh;ov?42(6$|K?Q^pD1#mK#`PfI$kzqxscH@d5I_*tBkg`HH?ZV8%azB(do zCBOg<)g37!O<>HV+v$#SX-qx&RlT}}Q~Sy3Ao3}?)x4fAkP^!T=Sp0ESD@FfD=9dc zr8=7zE-!MhI!6|%38ST?9RU#v<|1BRfU_&l@Ns5p5B3VxsAVv+=-CuQ39!}aWj0Kq z2&W4jAt4f`$}Koxs53yjDKiM)1t9W-rW}wxi}04PD1MP!&c$B3j9)Y^_h}>D2zAcJ zsTv997<;IC&TE@rR<-!&8p(1h>RFqJG(gfpCfvjka`^Tu5hKH1T|@W>38} zD_7$3!D-cPwJGoz>t~SZG^j)=A_@+s8|Cno(6M8gT)6c1d{TV=9X`#Kua69a6dvyd zx;~n;uKdNVyi0n$#V*3FnSMf(WHXp`cJNaEV6Nb)s>0J(>(&bdNXPhyW|8m>4kDBQ zH=q!Y^;D3mG8juBXbr)(JJZ&hcU8P(HpX3_oAnyfy+IP4fv>uwGj#>WxEi99#|KBn z823C~`ug66*8I$H>~4vCimTBt?yf_oGD*hEB~LpqHm-1ki9wu{G#$&17dw~DA2LhGeH_G}+s>mPllcY2@vEPns~KQAha_trU4;ip`x zZcfl)y4_*s!zD#uBQr$8W)SHPM&V# zULNRq8hcrBU}?qXMS$81<0ub6;XTG~C?>%(VQeTFZg^bC8#?9-Q=~4m8A3RL9VC%6 zL<^K;(S-QY?G_xZnrbx=L``E*dtL3r8>f#K3OTEY$u4-^$>-t)*9IKSZu{{-hXR?0 zlNcK>%62Y(afxNNtg?6W!3?R<;Q`fc>pzpqQw1h)MSpR9e~Dmzs7LrE1mC&9a&ir1 zmXH|Tm~XLQncAl~)_i9RpSyl2l>W%#H&LuTUX)*M4$(ozgU41E>T_F(Cy7!E*L@21 z-Bw1obka6|S6oL{6B|pXzlVzC7hEfNIbUS$Z)_WA;=MDEB?>)nI2K)~6j$hn70FCM z0&utd;QFhC>os%U_mbVyF0eSSsX^4KW$6HD(0r_*$&F8){iqSYt;69qhagyn z=NFb=8+vW5Jm5cv%6s|JCdBs41@AL)>Y_psXA+9eB-X$CX?fYR<$tIhsjtp-R{Ny= zcZSFsLOK?bt{9S`AM!s$3Ga~Xh>%NZAvr}Mx%DA=T_O4RLJA&-6ut^6`WP}%)kz^_ zV84WvDTZGDu^WcU`vAijrZUUxg;o`XUY&YZo>ov9$Glt@TK6in{;h{jM*6FTei9W4 zrZa^pnHJ0}+(cCX(wFTK79hil500U8S*$!kWM4pFe?H%U-jPe@!n3m`Xj*G!So=pt zHZuI&g@K;iD@I?#dRSL9^85WwR80a@Z=;9`I(-4lkoHlggl4)FrT*sLip75Dq;2?v zdry)Aic{bqu`i4F5P0!rf=JDr%Y%doAh(-gD-CP#y8SIuJ*NM5{t?K&;FhCsI#X>h z?!&>8F85ON)9EHT8G7p^!iVfsxAhXYgv)m_oK9!IZuH+*2MHtyM@p^Dr)+JWB7v=AP)1obi44|4SXYQl~p3q1!j zJ~7|_EO#=Vn{k!CI%adQ!20p9Xn*z|iEktBmgK;HFJJ0?ejyq4RL|>&f;I0Iw%;M* z%lo5R2_&JyOnm_0*mTUNjW1^-CG4UlMT}Ob$ArHre2B<;6#_Fo+LTH${A^09TcfZZ zjHQpDPd9LTEN+rCH|5##aJD=u48*T2G2gv5du_gw2nLuG$P3Ufn(O?02awyioKG}? zE!MzJ7eYU9P^}V|KK!+Wbm8-t9s>%zj07&@-)&>Lk$w+*b(Gw;;tFGB_521uZ`qtt zf1&<}MBK_P`D%zD8V$tgu6~u`+cvm%!M*!?Nel~3*WTQim-NB`L6m z+QnZmQ(C3Y#+c+7pV4G@%V~GA1|f3~Gh^#>EPI-)?quF}Lp2S^z11>Ar!p{Uoo~{J z4pL+~!Vl-TKb{Q;&S{shioEna$;UdyC%))YLNQy%`bedCB>ZjUe9RPc1W!x8^t-#h zzuNbM2SaQcG=CL$C)V6gY}K}9w6{%&hu6{)$!tl#=+ldl92-31@!I1L2eu98lWts0 z+BLTO=4{v6oz!tZsq;zF&CR5)Pf6Xhq#m|pTCYfQpHg!F$>agM52R#UzhBNgh=ySa92GO4#E-p1Irlr@nP>YFc${Gx>o}%9IGx_>)fpPYNDx z2F(-xPTfzLdy;a^tzXvZe)tB-^uM`Z`5%J3y;qWpm}jr8u71#*zn^yS z^Y?{*^-f{8L`#*vJKo}kJtvBM<7NImoVhpZEYrh||V7OsXxZ9w4q%)ylnw;wdv zQ*&CNQ3Mg!3yojr7zbb%Mx4&)(F>#jG%iYPJeNn#9Ye(Xn-=k_r7aIeNz9Z<=~zzE z8K)+d3O3^fGBHx~)#~TB=h|Y9KdINh2xF0rm0oN#Ef%wBkELh!ZLb*?%3hFt*6!Nv zKi_^qZnew%emaX>ocwxU@RLTHjyQTXC(PM6QVtLqEYTtud*a~}(;F;)Bf`<3p1CtayJKR><-8qV5Z zov0Z4AE8u}!H`kRbO*+BKs%K!WU0}Esp>zipvTy(~moo($6iu?*Sv$?f z5gKm}-B zjW3>KKALT(>(tsQKsI|r_uqI7EYkn%z>?L8je)0jM#2~3(gOLfdRHoV((*?V~JMpOOp`;L>xg-qE1)g-rz zVT}H*4naCij>Ip@cQhuP|9nvY{4u%UBLwf`3Pq?EY%K26a6yVPsae(&GU*Vpd<_vh>8eH!i4Cpb)q z3=CfD@@Nqa!F0oz9uQKT?O@J}+7eNH#EmXaDDD$lQvC+yJ_ za7=>A6CCP>7-d~QUUAVzc0pxnT)IOX`m{mU6xtN`sHnjAI)(Mc?v%#3a#3`x_~}=G zUK8XCaBJcW2udC^)c}1dguvm~rzIuUC-os?1{XoTJ5zeSw77f~hoYn#;C9$6A%eh{ z1)?Vbu%Leh;208H^xj4lXQu5xc53K(RXDaUiDm+H+d9YmPgB)O=-MhQ7m?EVG%3G6Iltzs$_S{(kBfxMi9 zlLn6yp|TLbK302NZ$I=&^0re(v}lXZ2%gx>Pj`POyfIHOAX*;)8mFMqG$ykLuFVAl zZ8<`Q?#c|gtz-oL5MYfP(H6uljsObfb1)o;9&7<&!vB-r2ylTAV|rOs2KIo;WRE6T z`3O9{>MGGB=+*j0>bOl)<5|bDS)pjz(;32%F_#0WNJEq|1V7>=OBx)vKsa0q+)bD8 z+%VVu8oJWosCF~VYyVrABuH!DV?ZwC`(Vd&Aq<>)iDlFg@ z6&TFq9hNh_ovtymEv%F{E7zXtO?DIC9RtUAN+Hz7*n2{MLrCq+GX(1*zOU9& z3WBR?b_G$sr57HM*nr#lRzu}6JAS8m3OWk|vR!j%|kjK${7N*kTGiy)Tw{&`$_orpxU zo75<<*qyW&U3QkvD6=~E-l<9ZS-U#Z<;&8%GCjBx&abA~-IYtF@Qr1%<`%5-cr@C6 z3#Ddm$k=BpZ8Xa0P+>x<;a6*x4KmP3GM%ow_pO78Ia@5;Fs}B$0?HcZ_Z|H2A5r!g zqCdK^29Y;r%DTl=MsY7k&nSY&gzQrz+w5>($r3y)(~OC&irAOh_A!)n4OM87Si zGhMeiKwB8BcNAf{G2}e-*kst-)X+ZIHZ**ZQhxX2pH2A5qwzb`)s05>|34lwP5*J} z3YGa17J^BL!9|Vf(nb!_&>s(E5oCmL-t;Tnp(Z7Ca!2M<&T7&EoYvcrgBaHIc#gS| zr3MJr9Hle>2%BH7`SAZ*c}INF=*jft!%D8GfT7R?2w&piq9DvE$O2%9yY@wSvls%x zLMx_x1OztY!{#!iJe!NLryy>E` z;pw8fCVwZ{QW76P*;@jAeuBeWf?Wa-yM1i4=+M}f@V4Kv_glxl_=)`95`p>Sn6_~o z{-OfgqGJAHvfE-R{^Hu(;)ebbmfI4J{*vz7lK%cuVYF?jXtDM^13B^&4$_(x*#Jdh zAn#>+*b_N4DNvFjV>ysFpA5tk3odLcZ2K#|-$q$D+D$@he~pz?woK9D5{vmmfv>7+ z8wEI~n06jO@5j)d1g4Qmv@=D~KR`X~wfe{6ti4GkSeAxsQ5Sj&|A<+IRluvjm_zTf zhh`I`F{JVWo29no&WQw_N2~qU_ zE9ZT-Z1ZN>)*$etf4M0{FcYm9Ha9ln2{f6e$S#ku1{%mE0pTh`ZtF4m@J#!tW%DC9 z$Spm9Y@jk%t9(>sJonmMmuM{mSzt*}CoRw_Vp7C;49YZMS@Y7@e&b{qu0BLY+&`lD{^HN;xC}bjErj0Xc2JCp5;3GxoCOG2}C3Gd5(vkpd=ddOUgUT8Pz}1Ps;i zN1?Ibv0#6(Oh!+l*d$C)GuyfSZCGFMSrp@KW#|nc82=&wbG}GGQF0vP)r9p6y~(V| z(M&?ni>B&BGt)y68M%$^Yj0Bv1p_g5mdjZlDJbBaO~msFIbVBjFLl*TsyuR1cZHjd z{yG{3p1233LB=qO&&j!^62;lN{iVVe-;AN4lzVbk`O}UNQ6OdVP=}ZSop%} zx@QmT_87u#5!V{lbJj%L=uDx5Lj3JOa;$ z-g;wEA5>!;E?67uky(^iY$#|>W*k?WHMO3*t?bpu!jxn_IkjsNOZ+)n$l+$RPm)fkQL<_#w%7QaZsBag2{(F}PQi z+0JVWmg<`8K8AMxe%}o{8*c0k@b#~AXYQL%Zi!ABzyM@UY>Y78f`}Af;~i1s-ahMM z%gLSy^1~2gs@Ji01aUxipX@g06JmWupBWHlHdFVf|A!B3z^_~2{g5J;-PYdODWp)6(0k||L+_A;P^32z1T-Kb3J-#aq9Sg35jAual+Xke0i}pE1A>AD z>7XDYSV8FsmdAW~&pGe+C%-e2jNJELYtHKmqQNw&-QAT(yVYul{9JVsZzT-rg^@;u zJvROJc<9UDm$Gka_-1C`H8j8beQbj2fKX;bbkOxlCZFw^Y`^!n_a9{K)=D{pBJTj; zgR#Ts46gN4Q++oT`v<_yI?s9Cx(1M5pdcKB^FN?j^F`tZ>W^#en6f48ILr|SO!)9k zP9N_9AwHqUKqwV{3)Xk;`&8mxuaGNis?P*0Dfl1$PDS7OPrt&?G2U1PuPVN8ue-bX zVQ6*s1>p)pZfmaP7sXQ|6u&}U_ zEZ!@?Lq3et0z@c)cuB%z--xf*SH6BKm*O8z@>N@EUs>*r`1Wk&+i1l1H!I&4B371G zRyHD5f32*7C)Tj5Ys3@l602Zf#1Aj9Sly%YjXbS0NOO*^b!A#mdUZSK#E;$)qPi3;(3pIJH~ zU)Rge>{WOh>=OUN^*BV-95L6{#&tA?^B!?;52llw2`9qpA=$Gv9%i-l@$Rvs=R|m?YHipWtMwK2 z<;grVmT9^j4xK>(Sg5@HmRg?MCfz=Ir#D6N{O8;kwe)c{qs>O6OVM=4Eqb(r7LX_} z1=1?@UZAlGmv9yG$)!1m#WCtm)3dFeXrSXcN{C`J5Bm!P?#TDuIoU@&np|ht;JiPY z=E_^Io=A`5P^8a9Z+M(?m)v&$oenxt(Bwqh{W!ZBr{*7S54~q)<3yhU&^`6+4isfx zd^7vB4nioD*9j7m)9nV?-Plt+XYOZiEkAP6^HXTfkO}YAuFDW7!Q{6OZpIv1M3d-W zZTAd)91cfqbpFHNm2J91@ z!VM>Eof;dLCqlkY@>8ZV#e#pwgg^fg9>#MkJ@V}+;HqM+H5EKQQ)Fw#D|k>($+gMhtHh8lk(}=)#9Gh=nD~Fu0+IKYCK)M zbGBl~yM_}1JNw{Z_0IXnXX2jk#EqS~Ftc-E@l5>kPW9Miy;j>Hz26J-f=TMa2qxnVg3% zvkkSuV}|#{T$xL&13#;ieock!+dKQvkK6-v5_#Ja{qX5Bs@ZRN+p*WQP&8mwMF zm+Z`49~|#Xm7G82MZ1|c!@a0z9_A7c&pM5I{5=i^i@%X&uUjR_01mw2^h?exGYkrDJ zA}{EwdGI2)UNl=dmiNCMBG@?!h>e#*r@+zWL2;oEZ!;;T}60CNgJ0cGyec5X+} z?d>(*zn)5}Hu%j00QQxeJjbI$6U@J)g*4Kcp))*9@$5}zEiO|{qQW<|z-DjZh|Sqf z>^Zz%@~;r{b4#B{@!Nh@O1JlR{@fL8>sN{GwT(^WpJyYO+D`ua^6WVj5~<|Jq7Bj( zK`QCqsEh|*G!-SEr4;H+vG!J~=y$wnD&htM0AB8kE+v7If-80!5k!tdg4iTp#(n%@ z+sl$Br?++q!S>k-M*I>?1Vx8>HI%DUp|Kz-5g>M0jshjYST($%hsz3(I8_`9@8cCn z&2oUv3qeAFSB__`cgs29Fz>s54^MCZ5)SvdcX+VC;JnB`2U@~jx5oSyiSU0I{dKbC zyy%I8UFU!P*#0dV$>5go!}@B69US+-Z=!+7plXV*Now3LAK2wy%zYsl7tJ-MR0`yM zmKS;oxdXzYLct^gq+$t1(d%oiSuSpX6DjcAct`}mVLhYouKCR)Qug8_g0CSq}1i@p24(y2=R>g_jbUbWL-ryg9Cy%_)R@1Hw699cGi zlwz_$K688zLfD^4O*z0=s1-s1aH#)g`ruVQL{4C$j?~YZqW$3jg80(1&Dx}gP2kpKhZqEzsk??w6sVFsugbDzABrbu=_;M(IaVg7z%iTdfugE;^ z+Omx>I6nMy(m!v+R{Da_sJ+sSyityWR+rG2lfm1(F_*paND!k)dMxx*(<`(HCWika ze96*-#s3lbVngzv3+;{26dxX@JR~k3O1Wgf@RPraRwpOeOJhxmfN(sc zEDalpAGmd_Dm+*a4KOL9%iQ54PGr6fbh?~nlBT)-ssOjFZ+Bbb)i(nt}sOW_G z^nM+S=uBRJv;=8tmY&~ROR7d#Y<1B$yTlf=4Caa!uUPyQ`@po3x%MH)c_m#;N=9{2 z14itv$>x!9i!K8sbQX`?PGm6pQaabd7Ufpnf^Z7(@BN|c-e4NHAva?@30uRCm% zoe*+0FXTXI9X{s75~s1BJLA3o(o*t!^Tfg8@2zj+C0E*|t`x7dfA5xD?cAO#UhV$( zujHEbXK!3qFW;V$B=(Gi|N0Z@i&7f{N~I+m&$J%>`6n$+dpT*yV%7ZU3me%RTcgfa z(%a+v4&B(E47e!$WBN$xjUR9Rc_h6v8}shQ&fEo#^zM9$?9JVU%T_W!Kja^}`Sa6_ zi!#5yRF&TRwRHE9%Eg)zS?iZA{j*UaE2N1Exg);BG<=l~DkU10{{8j+ zku2xW_B*RhY6SV0hC&TxioWoOr&B;dBUBXB38MV9z$X&&<`HT>RNPRN{3CVTv}q0% zrA|*U`AxF%kD&_Q#HVo7yxwDdzgVb+0)lW=h?}NMui=jW432qt3CUr|{z1HA02_Xa zlIE)T9_?&A0@r83lqe}^)Id7nI35K2VOa2NATMl~F6n)TJ2hnU!`I3{pK_DydRSrW zM!4p2LaOdo5bmpwof%iMeRh2DgTzRRJTFN|Cq04E&b=vgvXB-`s@H$#c-;6tijv4j z`45#aH9H8pgeFJ+9}f{(p)ZfR$Q#U?f>GW7Z}yPK63fA7isX%XQyM_zWtm~ z_0PQ8j5v9rGCUHlS~IN}LxA|%EFb6Ct43Bt=zsiJY6EuXHv~(S%Ty3L=?-eQnAJ3d zp-$IPm%#(xO*e(_9{X1&hWjkH5C;Vf3#l7iIyYXa-BK=H$A609iEkD8c$ZuZi6Ihm zVnvor;1~^H`nLB|OOgB8`QL(%q$wXTRt7Gp+p{`i`K{Zj4*`SNFzOdBoK42af3StW-6ztf9y_G^`tlU5{rsNy-J;#=`KxhXakW7B zq#~Xgzq|Mj?ot0{gM&u!FaDFiqA55ti*Z=1#8J=)wX|SRw6Sh)>2Jo z0|hRM^#$Bpv$foLIGiHZujaj;={p-F`bg}FPQiNCG5^Do@5G*(Os-!!J9}7`BQ`)4 z*$1b^|XHQ)R#sZ==WhV^0RRr7Ls)y#Te-_CBh>)!*gohgGs;(>!DFAgb| zioZPO9i5`(eNTX28*t4K3wh29(IKdv1i*9<hjDrBNES=>(u7~fH z;XaBzMN^P8i26V}ddX`~@B|j~L_>%LQ&Xi2f7cu!on)X0c<6%jUxTvYYFi^&XUl(n zJSaZg^)ZX>8~yXwcFsP}&?Jti#;%AR;tRsU)#9K%ZGC@4SK3WA8&oG^I^a1quECR z5z%){MIXdcl~H&eV0wXwB*1auVqAwEMG)3@rbq6dnhd@PHwT@TMdAL{I9J}UD;j!@ zT1U2@o-wVz_xIPAy@$??@u&h?6RLJFb{cV@Yqs9%yglyRa59&eh*yOXvfNf?SG#v^ zP+Q)1h$UEm0XcYc9!OAmO`mTX=5A(B^%A+boT$kwN!z(k^Im8 zmlZcY?;y|O)0Goco+q*oKdL|Re#7~<)YXmVJxkrLe|lfNH$E{+Sqr1D{^@J@_rNeW z5sG>&f6x1f{J9FfXD?Br@{K`Y(|85_*-JGMs`rXEOuFHJxMWndNH*W~VLoL5sk^wI z74hd5ezW@t+)7~CI}=xnPXMp1lW+ZQ#^W$Uh{JfkF*m*`Hzx$kj**1TsZ=YXlNQ#j zIRy=S{c&#h6@jgJ`a&g-)MEjG3LZodMusA$O$iYSn(!d23o$?%M9^*cb$fV&^}@n5 za$_Kpw*$Z7wuWa2N2?dEX9r0u0fV}4m zbQaIKd2s0jI*uTA2mu^tAI!;q)s7~_^WinYW6a)3&3o_g+P@nk5e?eN2QQY|vzM-D zOFUZlVB@>$wYSRag~!~br?MCRT-v=^9;z=dV`j}3p@rQ4)VAWj*-HpN_kF&3D6F}D z!)aL7EaU|?M_SNBPBceOa#T*1D6g&qF{<%sLq(3ot=16^kS?)_T4Nqs zM?6&4*djM6=xzpnGDmxPRNKZwMV~?nry#UHXmf~Uc#|BQ0j9H5PqGmRPaV-*oiQ@- zgQ0<201;(68e_V9a<@Xcopu1Y$pDuyde)x$c7kKi=6Ojhd=*oFf3AUF?mz*X_tU7s z(Oko@F~bvrM$w)|XL60sj~QJQG*0p~PRljEG-iBN&?MK>gj1MnQaol-Drj2aXfnT|x85p5||rlXc6@TjV82+!e;7&1c3e-bIHGMaz87{#u%gU#Cs(tz>|`{#T&5VRYH;L7abYnikg^D9!XqwVgDJ2W(t9iE{Py}Z}0 z9UltGMS^e|Wd(qK*s7NqF6_j*$_Mmjd zhLsDrb4$iVJ|sk0Vb0*-dbZ0;;X|AI4(;S0`aN-oBg}w%Gk6LZxJib9NT8s1plCs$ z>JAeGR} z4z?LuqzpmTMVVAoT!UJ1>sQsH<8tN@alFMupS1d;e%0QY^n@R%9LK(_z77Dz0Oe9g zXcp(^(5hRk+&L(Xldf$1fTw02x8f%Eje-#=Cmb+V7>||vVkrLoqxB~SC~{0NXg^7n zf*W8s3CVvycPrEATCUzFq{LF0ygDO7wV~t#_DAr(t&QEB6V~M8+osr^Q&)GqgwI=w z12R}Z@%F1MfuD27PUM&$I}goKJfi?&Gp(kn@96d&;h1>mTy0 zG=iwF_*<@WT=0o#@3!f+lIPbvOP<%$!!9|R0KA{6IR)!ZiHH_nz$ye<_5S=DGKQzNV*yAau1CQO5$W+}Mk zm#_ZdSECh}_~XYO&}x2q(8%1iBam;53Y7^mSk_buL-SE^&j`1P2c@4H@i^jDn&4n8eqs%X2g(^Oh22X^hmjgdm^$kZJeuSRtTa=>x)OM zTL-u8j}=ff$|(oWX5erC*7!tt_@KC>W2WPgWaneQ&Zotl&u2PcNp_9-bxjp_&CGPY zlk8sf>;7Eay*$&+#ZmloCK+Uegq@Z%EqHGmWM%=f2UQT;mn2_m_DKG-xtlG!DcSq< zeDZ+8KT{&WO%W;UL`x&^F<)H7uXXmiCqlTh$AFAekm`SUKG||=WM#s92AQZU(AVK` zQ&&gW#+=NRSQoOMACEShk>~d18+f(;@ywC4F z-7JA56Bf&hXd+Y)%|P@yFCyj>6k-z%A{{(*qf@>JA9)8aDLM=QqKF%_RJfz$LLji7214AfGY{LdMQT;C>W1bY*>kn z9QyK2_AGf)4y7=jB*9sKY~~het24ED`X+9&qisE6M@ zn?Fi_6#en{Lxgrot;+a2gJj&yS8&tIQ?2BIRp@K5`d*+-3>i zQe!oCd*Si|dEEM~tG}Ch{4B7S%eu)nCT zLA6d2D3p*yNR-mZZ`2od3ZJmZ{ENz3;JSJd#27L`zo-&ZUNk0ivcmj4-Fw_5)oSGvpD6rM$Zq8LAP_c2Dd^X3`23gYKC z)sA-3e0w-cj0-aVm7>>wwR7?a{o1lo&Aa=^1@WXAznR;y3w6yA=8v8=t5W6$ZMD|d zJHJXzJb7*5d#RN3w1w0xN#agxlOA7UC!qz^{nLj@cQBU`sG=G&0MSGQTq*||57X3G z{;^Vf?^h1ys(Rk`AG}}nyim=k7eVq2dU*|FvM@W?RQ;-yl7y9ZXs#Klu+LQwc-CAy zR_#{daKoYH_QV~ZrsHp)wcMF%U_8#0c5Kxg<9UoSA;t97%{+))e0Ia}LH*l~*v+N4 z&mT0rdj!F8GEQxc?;ocN76(8`@S2_w0A1raoz>;(FVYK}d-1U8^DCD1B^l@T=C5Nl zo_7wuY+p;8YCNP7>fF)#eWopXdG2M$gVlHJB%G{EXWRPXK(5B2q0Wb!pNA_POI^C! zx0k1z!rl#ab?mIpKfWaE+THnc^UK(sL$A8Ke($U;J}-5B)cx=8-Oc59uO4xOegN3& zZfjUZPvACqDn0FRsL*lH^%UOMy2e~*hKhGccS{w_Y3>7c6+hUdh+fezPZ85*m1pw1 z-CMYXf<*>pfI3VXZwgbtf+m}4OiYu{i5-UT(VkCAvRAJCkmF?d^+T?kwmvB#X?6{8 z(BP$1I3skYkK`F&kniP>wPy@cscaSpN0RR&F^ht)|NK;R+UL~m&VeG<=y z;e+&hDzpLh=XEW(n2zu!%n>(g7T^;}r7gtcC?rit-tCG^i=#F$eH?e(Zp>SQ*)AN!4;tbV@||L40qb8$Q0cizn- zp#p>Bcwx7)oH^(3t46|<#HDEQ5ezCbufF$ zeCNf-mq!1pr;8jJFs5R8?y($bO;cCgR^3;Z`@cV29U5M1!&REm1bFBBrj})r!>)5T$EiZodp*rB~rMkFr9%i zo}^t+01wg#_sPl1QIZ(vbeiz#;8Yc-_gI16bR9)RI8RR?-&qRHe0l*x+wCRcPo}Ad z2PP}MDB~L}WGY+g$Y~|Z^TovC`5Re`U0j9OQ~M{n*VnUbuAxyhhE9>vU6k@XOkjE# z1O_Pld2KKe6q!f=;}WSbp+f5GmqeHtl@v0+&spT_9dP@FywvRL1{5LDNQ#bv7twWx z=8*wK^Q63HMH=lI^FM7|lw11DfBg36JV>|bAC-89pSi?)kPfy{l;SyJ772|fb6XY5 zP>3Kn!Msf2(W#GG0t<#$nWKfxh))_w8n&}+{rdEaTZRt?Uv}3LkpBox18*1!Cl8P? zKxnVf79Q!wJCBGDo~I5R8&Y%&1bFdiywD)kPF+=nGA6zpx-Zp{1O`kvR#6lgumqtk z7W%9z4F*B~fk@ugltl<(0Sum5F4F&nYIqKRRi+XrZ;#(1(neE=k)Sq$!e8)^S#Wx* z;)SNHwPGf|__`2~8GFbm&0)M;V!Ot^@VxE?M3~GP zkX3uRh&u<(LBtESS;l5NOErdTyi&n zU!~qp&g}o;LE4?z1B4E9yH4{ML3*>Ag&(hw)m%hES}!OO>a^q?qSgS917Szzr-s)3~1HC+Wu8Y(B9gji*$%R@sELt_yB1d z#zw4G59x%U>fi%P4zA}Ct0{ByMJV#xpj)a+LB%)1Kh(1TtmI_=$JYe)+@5DVJzTOx z?{rd;_)9?bu{dcMj$tL7pR*n){`mEXYMMA8yz-?m0S8&&5d29u*%_iQzu21n8e!Tx zd_#c5Y*q&Bi^ATjBYr;TYPVH#L&T^|5GhqsIlhM)Ln~mUc3q)QSSG|&9(7(mF!O7& z4b`F;{c`!>?_X1F{?A8ZBys+Wl?~?*_Igh3?cn=e)QO;D32pO< zPg*g;-q}o?jC~ca+9=4-9u|JLfXVjh9jHB@n=y^H8?{BVk@d_%IE(oHe1@{fuw3Pt z;IGmrdoDQ);nn&`$e&K>15s*~DPmm;y8CMQ1_SCbY7~kLkZknl2(kS4tH~(k6Jh{t_uRiJ!54pnQU8{Sz0XF3 z2J$K~p->p>oX5X|(c=$Z)37l$beoAkU-olK7J^lPEC3NR&qEl7Vcjo0@KC?0pte>G z$;id^9gSOgs`jl=;k0WzByfTRns00|P(xe7}hx8l;U%qTo5Og%jJkW@Hl z{gDgMI&?2zPYH18SIz1x%CyMUGl{|967^F^GrYH%1fyIQ8cChnmn=AfvTIC&k@WNx zF6uU7V;bSUOp?@yfytr{X)zP22vn1SnZ+w|aHNSKpw*-!;?6O&slk^SXI91H7ku=Z z?!ht|v1Syk&{4Zj=~wiPE}Ae<@{y_NS|%^XLC`ll+&Ecr9aryWP|d_gSQ{Zs^iao$ z0Sb7MT8@*RzG#o3BN^C(*Hb;Fr+h32VCDWE(81_j4Xe%t-4p)WWt7I|*HGCFrKNl1xQM(MI#Q zAQq|@K;IC(i|w55lfhKh}^W z!LruC6Org=v}*+!*BE5twRsf4&OTdJ%!QhQ?j=vprus69(oKlUk??FPynX(7H;?*Q zh53`i#W}vj5;gq9*&DB~S+?ZrD;!JUV!OB#+s@G&3l-RnhvwT4&2Foij_O^ndT2Q} z=!>TE3Nj5Hd|9Y-tgDk&r&$Osl|-#VJ)TpFtqkWNd^*5Jof)<|tYG|G;j-bh^Z#MN z$QK9%wDU(RIn#2bHz!+jl16t;_cdOg`DuTxiW)}3=DT6#De3iNdXE)QaF7SR<}Y+g zu8R#CvZ>&(^|)|ZyfFtbnm;B2uYv)THY1A7Df-^Z8@PKc47E})x%fN@f0+$N0l?nt z$7FgCRxHhdpT0-1z|rgfA)_5FsxW&~p%BO;NP<}nGtaBhxpAld4|IQlV(hi@2e5`_0>mYY1T z8^YdgJmnxYVM|^rbpEjqMk;!DTMt3Hcu5>k+yW)#h-nBQT(UQOe4nq(k>~w= zvPKhm#|fkYcsF#87ce27FN+(Y=WmL}mWhIQd* zn_!ghMB6zS>#^yGl@l4Lqde5F!`)~k1R8h)Zr-9npgogQD46Y|dPc*~MsUBL45MHcT3rz{CHoPdNb|L4F!RhN+U{J!Iz=eY+yRUb%=b7ZyPZCOfLoqdKC1J{%eT%8z9 zKw=o*2nS}7V9((BYusiChB*7I{?9XXbnAU3pvVnyT(f95K!Edp5}I5#BTNo|-Xs^x zg}ZPIdnDEsF(^w&r+#)Ebc&>^alcp$_W*&Vx^c@VC~MxA|LVPb{E%=z&5F> z5VU9iNjX7S(T6_=KZOgf@B)`8upbd zhLvIWRrvt*m!oJx_4c34-8h57MtT6-@H_IA;3o!;`{>J$0~z*NHe+L@hYh|SIrs!b zG_3<hmxW-!h`9HmRn0*CqXs4k z6Kn)y$T02_UXXs+Fm>O*aP&iYKV1@n5DAOKx_&1coD!LyxF zYlznb5-cwu$umdq!Yz&pEVvDwjg!!MRlyfh>s*v;0N}}h8L4LPE!5{60?jtq)>~eE z4X!y17iJuPy3u2*bJ*Y$TZN1^0cL7i3VwTeoO3?}t@CdC zf}z$?TTO4b4_518O)O!GW=QJ*IQhGt&a^c^o z#0!bX0(ASaRJ`DJ)U!<6J_s%VrArWy0+6=OL45mZB40VcVlb2mz&G%G9LukH2fr4?e=WNC^?LW$lDV%p|9)l3ER|a>RUTZr6~9z-bLn>XQr+BA{okcV zndSSI%gqOuTkHP`T}!_Fwm`8Au<1P=alxx&(lp$cI4CNp%%AmS&ihfJ(b4B~+w;9V7^E1oe=2lj;@iHv9nf1!% zQ6)?^2Tj7yq=KI_zPx*@@5V;2y}t7O`OtFs&joR>M75n*l-1g^_U{va7Zjtuy{?Z^ z=3nbjUNc-;+n*jRF0ei*u@R13nGjxC(q3P^xuGtww0<*qPd5c8hXJmn{T*_)Y+8TW z89Z`ugD9}hNhV^Z*3>nXBn7taG<~~jSE1Fj33u%qo1=O?sD2TUs-M}*MBotU3)gQDQ2}Q>$)m(V%@`aEsL`~eKW3z z!#NiJe0%c9#{SjqDW#3B1^b!@zm9T#H9q<(;|6QxLQPpXvO+=du>ziT7?H`#WPPw zT(9g2xbkQ-V9&48Lw{#iwm-WhOFvqkT{V4bSufM@J@e4ky?30y4PSuw2{`~v0Hw;k z@W843a9aRaJIYH>1OYT!7usu+4nx?R_7V8`67~3L^lKg;9SXDpx|78{KRI1D_-C%~ zn&)Si5?I{dZ(pK6y0UarP%*yxA4jU3GIX7>+oA4N+!Zh%zWKIy<$=yyjUR;g0H z8^O==wGKTg@!bp=x?yn+%;b_YIRNxP%=xV=Nes_v8Zi>_7hn|Ak(6rH!8jVK8-!|mxK zTk{!xXtWlvLg>&5c8d4tg06HO8{z$%Ea6!caD)l-+STI0sRjXXE7U-*JfO>YGhkO* zl5_?8Ruf!k7cLAYb{4Wd>&V5=!qht9xaQ|pKS26$7mpGGPhIVMtb6z8fd6XapW(38 zX9iW~(dLgvH&1Gt_UlDbR6pu_TIoFO({?Xy@0xQc^Qu^vW6R)_23*>fCXyD&ciPK zZ>E;ja`1Ag^bfzEZDEb-Rd1xu=xFR5SX;cBjr6QH`mI2o$%BQ7?7tQ!ll$nPK=Q`( zP}oGyXOnkQ54ui-t$2Lg^WC$l`*LZj>G9g?TkXg1G(0g4yKB<1ADY$Ar>3K|Aq5fH zG;U${zPoQeA^;^u;!8gcbwmXHUqDuV@$Oe-^T*t6-l=1~Ey(L{tX?j_=nDj8l zczvgP)HFML4^vw^KM(c)E4)!?arDnCq_jZXsq8aBw0it+QyhhEErB!p$B63wb4Xchg0?>2l5^< zww9P2PBrQaK7 ze^~KvO%5+$&6Pgwl@s9Z+WGG*<=ev?hih!P`;U{CHAfVHN~SHUu`-)XT@=*D45*x9 zXKQ0B6|7Ah($_}vie`i4`7#E)3%HFZABfj$0qJE9lk-A^kW);Yf^L9@X!W^ z@C^`n&qX+#;SN{KsY*7C1U0Y+mIsUrAxNQ4+@We=I18!q^^?*1&z$r`&yqLhgXm^* zDv{0-((qNa>B4ZYo`BM?z9fVuOz^_SSSgUMy4U&ot8=$bRjqsFP~WWDQC%pQtL_A%}!OlgE{O zjp2^NzlgQ1eSjfkFYkk&d_Y6MgG1>K#GZ`&Z~4lHwKSZh+KKh&w!u3=djnx>`w9l4 zu}BE5j+#%(119S-zN-VVkqMn3s~%v69es=456l`gWWEhQY9)D~ZcIA?&=;)0BbOfmCckXVQP2MSsQ2kgAcfC4v<4<2?VH6okBz4m*fOV2ZD z#t3;wF*c5*n=VyEMT8j8_-Ktu8vZBmYMgCwXvPIh^#&v0(r@mwme(PdW%Gqru4=j>`H^AU29QMphNqgk7Ny&Ts34L0m8DK+F*cI>Hyw} z3>t*9vG_rd=+Fp*S1JxCY3tJ`c|V2Rr{fQx!yII!k16yqu(Wh4@0`z9$D_aUGzJl7 z>%5TdEL$|lEs4wqAilay7U`4wM}!A>a^gcy<{|S%e4q*7wBcyxL;;hdULO|Jl4`*bb6tYp8s5>8}0*la2kOzu#5RxAEczvJQDA|7I~QdCjuajgwU=F8D>R2BiXa|yMp7CL zvuKT3f1dE0>vz|*dYjwX?%2IBW|i+_1TYik>{IpDKt!Hp|00`zi!Fel+5~oHiWRwl zkYbe9GeO`%qxnnm!WSIB+uC@Tt}aoKPECgpGBrs4Hh_puLWgn<9m$xsQHq=58+@3w^xo1 zQ;19AV_8a5FkFDD)HqdUwnP5|Esu)@`$h$7dIinXxnNRW3PuaBZYb1?iM7@o@3ri+ zrp%h{L0G4ga||0H=VnM%=&|G0V{=}5dLw;KyiWrGbS(Gk_-9}c02;8w*moH7_8e&L z_v`ET&$~=eOt&rKx_Q!lqfB&(@=rINoV%=MPUO!xUMT1Bqz! zwx@YTPXfa;AjOtLbUWn0_feB zVoL_jg!gyBA@yBVfRqe_k`IpA1tbp^jsXJxooB%&h`>5++2GXNUu6f1&MjeBl!;v9+?4nU+sjnMNF zF9)D8(NU~bdrdoktu5d9MW4Q7v)A*^@+3=k1)0*=I{TuB{-U=;@@1SOAod(A0;Y(2 zN1UAZ?B0O+B=O9b%P|t9Hk0kx^v?0;Qg;UDg@)cM4jtHnqag@}hoRBP&JjuAOYz`y z!O}khESAfiOnKf|{``UBt_&C83k0(tA~F+e^zVqLL)OEI2D?vi_*by$ggQ8|<21CJ zoWAm*_!I)b6hZAjpM-6=s^mS*V>uSB84K^iM7|_oDV2PxFmvN%^swz(3AC>Hs_+Yh zl?FEI6uJgolOsV5v0^m)QC^Kx{(u|K1_RucRN;gtJ3|nP2?Y3XnLh4qQN2QMhjDLR zIe%>b{26+f_gwPdCo>zaO-boS5TF|hC{r+qeQqeNA+@Se^_I~K3dwg^E=#rA^Aa-o zOwi3I@fsRLkvbFM$cOG2Bm*#T&e-#kpTu-Mtq1SLjp^iP==OW&Lt}Y9Fuk_ok~Yul zXixLR4C;*x%gel~ETw$rm`2LDeg62~s&R*wamW5~r~k!0Y>&GlC)|W5+?6Ig3?@8n zCcO4d>^m~y9W${%Wx^+a!nbPTK+A+*|Ahap=V5u7e$(^!L{?eiK8`Wg469&%+udYAUM)RAh}=^cn(P;wXzv3?Wh($a zfObv=87xwLjXk(g6{5fY)V>na!Hm*@$_ETcC>^!{tI`juTEsvX`KI$I(==7Rbg1$+ zus_OK@Vv#8#YBeF=%fiPBVBsRJhMvom(S^zsysA210eeAX}z*YwA0WARf>bSQM4{FuG3)^LG?yD|6av<#2>!rQ;a^2fG ziRl$cND6=ob8hyH2$wQ%12qX4F}NXs_`RWQWq++tZ05ej%tJZ9rtc*g;V}5?8X^-a z=VMklzlmSK)IRgYbD(P0$C}Q6>aw!c^ET8Dj3p+xzkZrBJ0PrF@b*Dd`fD>Cy}T%D zJ_Eos!b*3X z>%XK+C>?Qd9<`D#jtA56(*SGU!WgNkKJpHz;HI8CJ+o7w|DWj)6QmVvu9` zp&t@erES`Eu_+G*q)PD&)o3RrI2V(QHI`K3^xv}-FA;71e?;ANRMTJlKk&O`z<|+> z@6l4yjSd(c0#XJtkdp3JHyB7NC@Ree1p(;>agUKL$vo!rMun4J6M`<5!vMnpowRcv#7& zSpgoM^nkQvKklIdcL!+`j*_M5+OZm}s2wZfP&dwTQxYj_ zT8&4LqZ711T4&h-=7WcGrg=k0z)-<0e)MBxsc(d-FMZzACAt0W`g?%s@L&Z&rKaNkwtv=cJM-|7 zJAzDhRu5Zgzbt0zmyGdbJo)dg1skr^H*jF9~41ar>yUR!dSSJ#ymJv|AL zhJlI9OPMDbGexMyG_ZKS>@2TlS2FiSOu8}-eO^mNmL*q$k=$p#9FbYu+oKc2JSIdI z#?9Y6`lc+$9~suA4a;CiJg?V!AF%dy(*5r_vld=tZBxS*hJNZkvHY5jI2{Ye@4_i> zZ`@%8w-2~Emdh1-9|qhPLk>=TzRzApOJJ=~>v3$;t^b_Xvd7%TPHune-(t($i3VMz zy`MwpXYfRgP7I{kvzNS$wM(iQ<&R%VyTc~v&bcG#4oEb89l&-!WR z4|c3l^r6a|epL1R6su9x+w=EdWZr+d&Af@mZQ5ctxLH=8XR;JiStkjZtmK{G@4voz z04NwF)_|Finv9UQrOB_i)6tV`Y#YqNIEu_hI{GpOA^Cu*EX1dE1JE~QfB+jgjqBjn zgAWMZqr1#s5acbNV?T~=Aho{1d_#VHC}FcsU;23rHEl2>{BR*NY^NxU%)GU2wS^X; zW31B+WbNl~ZXK=;KZt|5;mGV{7%ZP6O~yz%8cFNJeCBvSmm+nPX!~V&Ib&#YFa3SL z8;_mgGZRWi6GpH+m$xl9_$jB@ryJFNRG2{OD*HLvFBrj9apOr)J_B#lx%$n4a^(1+ zRN!D4;YTy!$MB+Yd7AMsd891IZ9-|2TNS7}L;=Ac0%CIu? z9lNSwiQ-6=%W1ACnxtKH8tG@C3kWq!caW^VRKFEr_AAo2On!Px@%vWLeo%-$>_{3gA-%ue#R#gI zr6g=)WLdBTn0d*2Eg0)L9K#9vt(&65yq1eb~G`_aHcEpkvJ83AeHs;0bSwoeJ21nCC(zOK8 zG#-*w3nQSaWi784aHr9&$^;St-R8}z&8&On+_4L3iwR}mad2?@Q}+upXC8l6?p4Q- zW%9vz__cw_jA|@csZL09{r8~^j8{<5q>Gof_UhKGzM`!MzU)uGQ|`aSIz1smXj*-?@YO^V`x>#kw(DUp{Ti%+QQ3b1C}& zke#ctyrpXM$LJQBT^Tv)mlSGBMW1?()rQec(_yEsu$d<}%}Qg~B-c*O{7`(|rRD@k zvz2gm>P3hkK-c0S0|7gvEH*535#YQr>7g)N1sF(8Tbo^h%cZ4g$=lYW$^1h=X;-vq z1!gpGSsM}RITD8CE>U40xBrtPkmlMRzQY2B%7=MXBsC{bMgrbrUzSsL(eMJaHF%nu zCMXNu>@Ml*d$B;!wGS@^XPV$TWShajZwmF{L7;(ybJhxG zc4786Tr5A86h;)raq`5usjr#1r=Fbk5#!B}#tSNXJcRu2{C>|RAm~4Pr^MND-R$h5 zvYgR{f9G?ncu_(ErkTz>0VY(QaQo5(=hbzS9&~S=nfDKpM8TL`uR`l%-93f2SxY^| z_GhOO6gys`cj(H=+62oh2d^^pf-R2Z7%BBwo5HPozV_@X^=*#p9l5{rD&a`~@AZW_ zxGNzBjoM?;R~|qKCn^sz%l9b{vFYtA4|7`StBmlTPE>g)7|^HkNHk$zWfY&OuR11G zl&Cs>xUNriLa}#Wby8(QU+uBRLZaG~&gVY0X@k9ewHZcTi2AIF@CEfb3;Fx%Pi*x5 zsz0^2GSGPDboxSjZhV`O%<~B)9E#{e)vdNW!4evMd!+e}rYWpg@nx9k*sW7BlK1Xu zRzyd<`I#3Ju=>mNBH|+Fi)8NLF7xv*Y<|5xKYfz6G8ko`^Zv%^i#i_)gn7+45(4^H zAw&~tT|(WiQ0ur4E4?uBU~}Zcp9TLi(cRbguD0ziOPkp0t@a+evis@EgMTq^yM4X- z-j*yKP24DzJJ$ET%<7oI&a=~(44xLB`@RY|eo#8gjMdr0RRM$kqV; zF3$^YIe_!*Op@3rz(1%NS%|bxA1-cE6RRPM42DvVnEU*{IepMa0w(hS>1hY|fL3#J zi@l^cnR92-%bDtN1TKC&3|?c1Q6`MaFwR%U<{hr(c@-Z*+#NakZ8I*EJDY#(k*43B zPgnn~d=Tcx*!Wv+XD=eF;h%5S?7mkid`GMC#D`9&x=*eV6x+6&{y&1H%}t0>MINzq&jW~x49zTar4Asw;U*HU~YU!$bPI@O|p05j)}9`UG6KJVXp$; zs<-Bweq0L6UM`k9_LzS<;oEf9PN1mJBZ0@~=bFoGG(PGs9G_9xpb%AQ$~d(k}? zMGMQJIUNoZr4ulII^b z|Hvr>{k`^wwXb&Ft4{d06IXY>xUc%VXvKKO^msk_wsr8s{8@r3f8WPI`S@btJ%+BUQB=msC%%)r@>`=ws;ug z2ylXdi#rqU2XLM{KsFT`Dd=R8q7y9{^iH2!Z$oON?h`n9s zos7-Ijs>5nWO+BSTTy*RcN#*0j%~{+jnSzU72SJ#y?S??#;r`15?kxvD@JrrXjYPV zB$bna$s(e)sAPd;h*n=+>e~E4X2)@zv_pD;U>HD1*0Zu4+8*?lRXbylm0`9@k7Rf& z{8JxL%&(cJt`%&TJr;TN#)5m?;+ap_jlP4GlnR~7oBtw3MqWJ*9p8MkB-Ii+ecDvX zzo+i?elXM>`=G2WfSWJE;56eyXP^S*UD5^Lp=6}> z%qK7-9(2W7MYazl;q7D;Wb#8(j$nb;@r;*uZIZkqRe*6doK+PE*iL0Go5{z%9y3kr z?yP-g`D^|q<#2<;_9r)6_lQ>ulPcezo_36mFMMag(5fzoeEzKZnqK8BGqm%@Ev>qJ zW%Yi;Ly3Qz`taUW>0>(MC*CSCb|Ku#vc{J?hCZDV@Ol*x(FQ&QdbCqNE+nvbIsx2v zN7eI}UMlM6L=b{wXHI`Keh?A+Oedi8;4fd7Y4G|&{VAvZ8$D&S_s_Yyv7P;FX|UeO zzVhtX?=vewonPnfw~s!4>wn|P{cq6^^xl?J<$gwnFTC}rW$0MhuV=0OI}Mla z+iBC_%&V!zO-C|@T*~$qw)=ne9~f*XCNaBh(8NjFN4Ks{Qx?@8{GPgW^hf293pW#K zf1Wq~OS{wf_iMz1y|)KPcZZJr+r0i@|HH9kf1Wh{+i899_uHjo`zuEdem{Be@8^SK z|F#zFc1}_u1IOpy-p@sv91s|SUl*I}f409MPs!7(oQ9=GO@%fiDf;>bd8qFhj(VohZHqWbU-d2s# zU;ddqS@Py&slBA5Im$`huqv$NOJusi1ut`!IrAQx2_$5saEf#H9E^Yzs~>Qg7c|;m zm8}4_7o`qdQ*XQKX4!fcb+AzYHmS3DZrZKNDMz^fBtGl#Lr=x$Lmn;!joXWE#9k+d zK6|8spdn-n=8L^M(;tPzzIRoUKBsx-T#wbsqpKIwn7X=e&)iN?8hw3)rNFI%*X7f- zv%$nU15+SmWqqC6I)49X$Kt z!zJmOgCr%{QvC&w0D?3C(vSzp#|zb#w<^xE`+3~j zH^hh#1fBwuyd}XqOF|BuT&MDJUj|?^mxEW=uCV9vronALJ+0$CeC6)5l;E0cN{6qX zo#r$L@?##=7}LY0o^mW?WllOq;JR2LLpL{4Xrh??HN8IqJUhl|6;T^^YqiIn(HovT&rG;YjJ{k)Kk1V++#0V^GKLAl*(TMn!zy@OlFvZwG35>|Wh?~ef`^w`hiZ5>}J|cYK zSHQsOk4dxuZB4X@!W$Q!WY^G?M%l04{!Fv>soo?sapSAE*F%DVS){dD*|m}vV}&o3 zlvXqw1{uurzO>^>Vu&-*FVG@INi2A93?W-OGs1jEBjdwKv9;#fl~SekJKuTC^Z#`1?bQ@x)ssVuNDJ@S2BfxJ{?vRgHffsH`>L;no?ZT_KF` z_mv1)nuCh^hLTxq;OY0j9~u=ljsTt{sZk@g64U`;4c)6fvM)}RR-k`-^^x1_9U_;aOa;bs7#+R1B}L}TGGsO<99C8}GjGP89+pX?vlEJ>pkdLEn}^PA znLMQc%YGs%b#sTxgE6t+DWKL=`5<%OG74sGu} zD_FWimDaO+c#?>AB;52G5X>Q}Cw$X*_rfE`@Pjx}-I&VZ0R;1402<(hhK0_MHLosf zOCU9TiCh>MQeaEgNETSH8PiFoO(YX*LnkOn6$#^MGfOl$pUpVTx4*>;lzYADKN zLy2JmCzc?qU-5OxnW1DOU8(pV1j$Iir5v?`1chR7+`hV!Eup@fEJ6IQ-ssSOzknz+xM3CXFHZS68=YQU4O?3G=a<#O3qnt5h% zx4IeF2Any~)L1apY6s3LFkWzYd&P;$q90>Ihr!RJM4dPekk4MeCaXImB_icOJw?{h z=x`cc=QL7du)ElpSbUmD;GnbB{3vrF(l~UDeh@m~^sq7k!ZfC$GNR;NT&dasN31xd zF2Ckl?cKr;YAkN*&Qwu>_L}2lZMbYHI4GEz6? z6Pq98#tiVsPJqDpyQS-X2Qhd4ELXDrX`rsx@bzAeQE%MSZ7O0R(tGlJdpn*y3vv2= zLq4^c-5G2cGOyNpVaTeiVnW$*CS7#ExXP^h{X^lZhxv80-e1GMRiY75@C;mB_U(t5e;?gFzd!khoYV!Y zgpQtzS=eXIPwGid5h51@O0JFmZFiZuiIfQvND zH-GY?ZTj1?5#-aeT>AzDfYZ()9T+AvaY{RO<#-rh=D?fgY3GU$t8yO2@HFKv-d4jD zU`f1QbT|czE?(Phraht-q9X;@xbW5m$ZV{g-OQbVocho%&UGI+i#oh6kIUQ-NCIIN z?65={O;idYicM45$VsoZM=hU3&}NY;@at=m=edC84Y(E%qAGu!YIJz?O+|eJ{;bNX zh);xIv^bK*lJE~je|mUe0I{>h+xF9IJmZ#%@AJNb2;b>4!^?aIg^}l9lVn0=_(>nM|Pqq--X}C9jSOj21#xETj&YRbd3y_`A#eK99VNg$dmDu(k* z#R$!KW+UqEcR&HGLXu2D96DA|Br_LunVA~oLStVOr6CVviaXE7z($>2gIxl{Xj%|d z36oxwgK?a{`YIQasZU!>!t}+DFBucl1jy&EyG2)r42k|yWDd7EDV3P=CWgkQ`K_x- z4O%mVU$uA2_n=gm>$nI3S%j0*$*;HE$efHCt1L&0|UnU#t-|5Z5O18l2}Nh6SVrKUis}ofQ?Y%4z+5aWtrl-vJ!(=rXY+ z!Gx6~$S^sP@S?CJta}CYh>fc_G?hkchmK4V`pS7HA)g2leHrubN!TMLcsoh0QPw%u zQ-fLEnDN&kYJlH-^HIQyKK#q`{IWa!=||q~uH+s+`}=)C$lKo^%deh|ldXVAa8%-r zvwMv3{kMDH2RPjKH^+{=+uxo&?*2DLe{CQ`dwvR=_4`xVgTbB6Y4?M_zrVjbIDiQd zVC*?$lse7$Xbu4-J)^`Fxro3E7&6=DB=NQ_qEzw?*@APDMSmlrO)Rzx9bMuK(O1bGa zk;~lW0w#xTb2FUUmRVLF38FU!pp#ie{EY&oXDPl}FOAIwZzP+lyb8*WUAQ5<;HstB zp^_PqD6v47HFFo0%fd^|NMsU@v?8sFKyr6}Jt*ZEizDbPS zjENebm&Dt2Nueicqf|0iUL@9A(57IVuxy`q(b4-5XZpC-zu9XodG8f8#vY#T2+yl{ zEd|9{Sa`5s&mU3$pprXgaRvJ%_~w`Q(ovr*U3?k~5+qmDweFf7b8fxmu3n|a8mASI zI+xRB?G@X9xRfMDE%b`~sC}~gk=NAq(w(-C2Akc-&f*|$JvuU)@8JJ+JdusWXfU=7 za|t=w0d{?07sBkp!L&w}sq3;mBj->l;_WNi+C3hY@ucujNu}<)I0wgyA9>Md&YN8r zb8z#yetX$kQlLA|tSCd}*3#t1;}jvsa`qcFCAvw-z)d*Ent1G&VKVQZnRIb4L;Qa+ z$Z@qCMuijRh@T;c7nCDl4hiO%!#I_7O*Bd)Zp5$3sv8QqTq|uUrbO0h1&lvwuWc?= zEIF^>vHtME^4Hs6U*9!Hy?oIl`uwJl;`%wf@X0aTn=Lgug90s2Fsh?Qct!^gQfL&n zg_Gn^UmRuYf^v?LI-Jkn5SJJ1oidr@X=p78u!wr~{J^E>NnYP$#p59v3kA<_bag+j zv$lw{S}as6J?t$R?khYuZhNceS^Kvrd;(SesT_aIngW_}zB9{0MIabqlUO=JvyJ2u zK_)P#k*MCaQTIk{WR6rOEJQ!=XiU0sFQokQ=?M1x#?-&^o-Z>g`ONwn zVJ6Va+p&?NQoJNDX2{g;50~iAgm3yd=_34+QFei_8$8vgE(#F%&ajR!Ex1&3PBmKG zws3IzATT)etj>e~vG^o><~FI1;kW9%-uvf|J9TW`Xx1N+$fG&; z*fBz@`naLV7?+7N!$`kedsoZO=JaQ)YROqE$b|!~?m^L(qLlsBlkA#}51wr%!QS{X zCv(%G>KdwJj+eo_KU5a~tg&?Go-ck~ zak`!=nZ%ucp1y|HBA4(Ye>VL3`<-%VA1imcf=~1~GYL2QWsJldHE+nbOilHY^ksbr ziV4jAGYW?pEh--w7fhfOyHB}-{C!}|%Z^JG+7;bH8LSaw2$%1}2!G&r`y+n7oW4}r zzbop8=fu)^YDp|U9#9sI!ILmG03*gM(%K^TwM9(fVwi~BZ%IphdW55Phwr;VJJJH8v+#B^bUX-7t4e7!#J zTpgoka4psw}HJO09*<*2wTo1UXI8i8>n(JqXsda42BOvdybGoJ!+OE28AF5 zR6Y#AJK~wHt)RrA`kPpGT|)-p$JUt(&C`1UtuJ+0s165|tRVHwRzPa^97V_)LSlrU z$O;^zmg+2Y-2rf{U7fHDfM_b{+C@Bm4#5LwzrzN6$Oe245G@R zkY9P5lJ=@nPT_&CS^Kjfo$=3oa{>3GQ#iV^swKDB?VMm} znCl7J6Ne_C(Be#{vqENS9H%{?qk)igt14<%*`$T}4uPWr@Hi}^B4I$6%CKugwvH<#*qJvtMw_FfMye|3Tp3VI-FpHU9mF|$Cn9KaRMiD8S!*Rlc@skz)Fy$ zVSX}p?s;M%T%d0fn);$0#dtrJilu70)lbBW7!^Rve36T$VQsp&3We8FiacafPPp>P zHc2^SDHcb_)KLyggF49OzqT#P)h%zgsT(-oeX^=P+1q&k^O7ikN zd3x877minZ*p+x2O=2Ku^b!9jkOPc$Fau41Z2v*lFp~AQ-5elr%Gp3hHjufENh2o# zxoUUTQTJ{uv-ZI~owi8vYea*239HXuRtMM0vF|M$J&%v5AB6#K780|gubxt{rBjsC z$#y4Rqu22eiD%W(!TZ$Uij$|eGaxZB;$I=K&i}w5Pwdk4wUii%Aq}odidd-I2@A;ohugqC5mUJhs(_N|kzj=KyL|NTfXw{U7^WH% zIW~c17mpAmc-VYf!7ZyRx)hmT3HOePKK~*WUH(I4IohVtFAiI_L3c4EAc-Cjnq+}8 zf={V%5(usYfFyoo52r&6WObAPmtMr`$Ix9HqTFHvLi`iT>!U|v62}f)sOwMgQ@2*m z-pb!t{Hy!}g{)xwpO0fQ;+iypXfE;Xa6o{e&knqyzko&q#Vv!QCVr7QwJD;0=zt9X z2nd=KYK4OZNu~tZAx4u>*F7Z8+5sQh0qMkTzw~#76H_-ex=z(xi1P;6JF$Aqab_bI z^%%qIzZgq#d?y@yAS(~udW#8uXLqkXIOt)U3nhCuEm!-J&=P;LJ>Qe8GyGvlkzBr; z0s<*2=u%e}El;t(p%{ey8?yE47F!QG=;YG*3p(a0_W^8N@*>+}iXJ|d!y`4I>-rq_ zvQ`owMCM;)8~9nfm=v4J@%3$=Ryy179M0}IA(x>`Rc{F89~V z>us*;CN0|T^)aFWg~_gkwcT&H3aPJLB+Namq!+VCba1Zq#mBdcb(U`kdjS21E9(kp z=U7S&EOJikkT>IQpX|A9oRVDPsPb}9v8B?2pOC|P@Ko)s6k&Ky+7n5Fd*Le^Z(nyUfX?cm(WID{{^RCCMR^jXorO_uy7eRR^)e=UUC9!K zM4;d9Y!_8PXg?mK^3+t(nX_l@pX_Bm*TH+O+E(O`-J5xJ*hcl&IRgR#0!R*X~rLshOl4o?_c? z0{v-k4;w*s?zrE-aRx?yJ;_$NG0~7~{Q&;$a+EFAD9$x}kt5LrhQ5g!rSaRgq8(C6 zWiNcu5dU%vATIJh|55OVE#G>t_v=AT+po+Qo_j?Z|nHPt9;}~7hX4b`ogX?9VaISa}2VUCPJn$k)mXl+Qi5cPUFda z5JM#QB>m$_n)n#aoL`K;()UQqcl@u)gvO1BOZroBO)E;%{gM3Q>-uGkl{^~Y6)8tO z2>ieh=}FKzYKZ(J0u%;jI1fZQBp0W71KIl_7YxI`D4F3G$G|VlbXI5-@gwa%Al}mA zOi1A9eIxb1a}ff-p9FtMW&`*qTB1)n!{-he|A9^#V;|5U|pBR$h7Y(P<@6Wqk zor;nwo_m4c5-G#dBe*Ci8VV6<$jzufSE5^%8t7EGEtI>x3b57}g9PL6%)Pt)s?lJ9 zH|f?b*s-aHXK_3-{{{^ggbiiPR>Z=RJvH3T@< z!o29er5E31Yo`Cep@V&9%+DHKT{{^#A&K8kM`0JOCICd_SfuqGw z&jrOk`ykQu_a_hfKfHXJ75w-8xwGax@DF1XADNeVmBOG8_aX8>(F^_TKjHYqMU8~2 zkC%s4Cf%S?F}&Z~_b}*_cPVsd@f`l>mywHKs&ZI1mBA0YyZM%o1TO6;UfP0@8EgCdM;Cv^ zU0R>pX}Pu{hDs8@pK|Q^T5inkqhF;ZU_dDSo%mj9X>1BY4#G(w!7zb6o`maP3>ZrO zbMN4gKKuGnt(O7^dD*){1 zwA?4>X86Sr!tBs&=wgW+TmrsmM;WCjF>xyej#5U%GbODG_0v^vkKa%@-IK_yc4x9c zJ>XSex?1&AiGISLeP;EVnQ~&LkU@s}-MQP=MYh;)nd5gPQs8LYDSb1Xn1-rMz1yy?XhSQ3^b4iNx5!asj;AlZhs(-d7ONO)1V zI+lmP2=FXtlYlC)wv2w5sl?5u^5DGROZ9bz?TJ%vdWj#VsG<|u4G!W-pI@*AyyLTp zr`=+`p>V1TH>>5hh|<8e;g`oO-ghNWoV{Dv@%4Q-)3qL=PT%h4>O|48t4Htu+4-{2 zdx_&%|NieEpBElny(H(_%!AG|n6o@(!w6vTB9tLMTm)=pm?xeH8wWBQ@A*kdg7c{; zp;I|j3Kok*di~DsIt#pc?8yAhxx*s_nLBB(GSAkhf()j54BeR1kVG)%YQqq+Q6f#} zt|I=<+wqHQlSINz{>(2Uh1l|vqog)5w@q~KI6jn0o1DkpG=ty82%O_AF=8g%SRP9rZ?@HpjGO~AGXx=^f1on(kS$CV^dD}_ikuzX(Wg%vBIxZe06lPP z%$?gHM@6|UNOd&&U3Sdd`0tNn-d#Lki(O2b?j(wFI+6zar4qx^Fqqfta6SbPI+CPD zoFVfC0A+lGg7}N zriKZd>gqqxNUya9hpmb4M{(%OdDME7DK!p)pf6!28R_Sm7fpO&%mFq>I70UcONZi) z4uh;?IFYZ%LBijk@2+0@_viccB}U4LgI+#43hPwO6z(G<+BZ{hDNW`$0UE)EH|K~0 zKs^*6q=Q0MmKr%0p3s?tYaGvsRKAl*f?l_|xVDHXLV@M1?wBEg@z7ND`f|3A{5**+ z*k%1MP*GAzTfzJj+gZA8I8Ec48l3jPO- zqT`IPEH8yh!RfSz>a}6nfq|96?=X+F$HT5f)>n#tPkW@l9(FbHOXZ;h%qW2+Jcp`K zh37~gCCY{8W(8JB9AX|bw+z3QS6?M{B;8_n-clO7c0&5NLpo2OsyJ(`5mSu@E=!Sg zgFkRs5#55krVOD}{2+f-fR!TKohWn#a`p}wD?m=>dRpMhvI#p$FjVN|qI2=h6r9?b z6F*BB;bt^G!448@ZgSrJpy9M^6S!P^t0wY2w|FzPtp<6kN0Pw}&?WinuiaQ|yQA$p z_LwpmQR*u^s<-!h(oa*8R;B*_$g%Vps$66_Hpnm5G>$7x(+kNPDqDYw)|#4Vgw&%O z6I%dai~$2AoQ!L;yG${!#%tu$1?B<9hL?i6gF!M$?lM#WNJ;`2TDnN+Ph6x z;sn6t5^I|T1vp=SQo=5YQJz6TL>!{O?Z<7E5`U-0!e`g*p49?Oz*NO69N$ws6KCw; zi4&?%3g12zx2m+_lZG5{d5-n&BXU-5EKev{@kS_z4pez_d)U41+5}Le4gp?zN z9bQpreBMPtP05F_OPF7qca7$UV7j>f9lamC^H1u3TFRQ()_wjvz?L;E!M-7gJ2xX7 z^l1elqU%bI6Q`Q{+VRx_9|-GB!)gCB|8Jbp{=DfwE8xokikzxbPkY5qssU;5SpkVE zL?tn~ERyhd6mCjk7sp>Ft{cyV3reYVsP|Ua`l;WD9FPsdM|546u0`8`3aUsqS3CeoT zYiLP&8h_ss?q&Pr>B^`k1*jY;OlDIQT1KJrXzU>=1g2NyG(G`c^a-31){~$(;N^MQ z`mJL_%$v_suiG9W1ql$1O3e|ESYar;X+_Fi)4-fbl zF7HR%U#c=kDLeqI2r+fhnc2g0W18%??);(+83fm$5*JaARD0jBeWwUiFy*cRF4_BE zgJmpU^!zR>5@}XZRkS#PaG5{U&N4 zS+NwN9-+;!Tgs9^{szJZNgg|HkYN1uO08HvL4gr1LHX~z&rUD>apy>@>y!fDWPlMU z{vJ~i56D*my)uW1epmY-374WwJaLz)-%KF<_hd-_So$IQvemUesdjJ0LkV<(4^*M? znzE64$Xtx1hno?0-_5?1xcYS}O+~%x&x`8#yLGl)S=NWY{Ahge_xsg@*vBxq6a+t0 z8h;{{B9K9m6TrbK9)h8d_&rr(%62S-=}aBVOhJn=cLqE?4FPQqb6)vBf)L>-;0Y6z zM}a)wI6cU+%?!W^0`Po+3SP$ZB1|KPp^Y&@DT2`y{&*NrHBZ*rKxx;UgM$P(ISFB( z@DwJ3D2Is)h!!`CKFdvx$>on&6c&V1VC1AE`w+DuiWo*(m6q%zd%+UNnYAR~c#Fa^ zlXQ7A>A-GRxYCe11p^ZEHp97=A-SnlK2djkIA7*oqR6Hto2R8{i@&16E-HhQP3Ht# z@R{&H*&O@Ib~1d1tQ{VsOOj{EfDzB7+$(H#O$9QSua-jZGAn&dN&6N8I8YGt(VrXgV2=HgOp_SuMXNyC*Z z04JVk&h>ID9r&c7&gU?t=P;k=U2ns1Zv-)9j}e~qdnV}@wPJ3x!wyhQg0XgI+HmsT z)#v^*0+oF|%l|_F5wi-@T#5*fBsPZk2VMWq`y-=oCAso(3TKyt>@C@E5`3mW?mR3( zMd!N4`K(%TzKND=FOiD9Epl*3fzf%Aql&jY3?@ADRMYbsn1D>dwQN7$&#B6`Vt63HGJ`ZHunyZXPppDO z94x{_Lm*j0SVBNrK)6UUEK3I`gb-(e00%%E3@C@OK2hdS!xKR9phfYy6*a=jjdmGz zd1F=wV?+;0@CQNJb})( z1L6*a5xIqkfg-S2^n_XK#0d>XArXNko2;X(Vd>IAJy=qxfOaF;Ji;Z zL*Db;aL#TrcylhR^JJX-U?7*-f8J~DP}mPOAO)dbn8g%w9~Nz@u-Cnf@HqN#CH}aS z69RVZ@dg*hbsM+^-7NJUox8ino&B}7T44Qd8B1+BiwArL zqiURkus7s)%#~Xrv!oC>sq%c~087%~Tw=^|C`)=6$>wq87u53E8#eQBa_|@qte>Qt zgY$&P#XRjnljEr{bj7$)kTE*O-^efaF;^%}A)rHymvq)n!TRgqdx zd#iMO{YU0@%g=3xOxy0qw;A`gTNKsT#kZ?jb$ADK2-h)5gu>*sxQ#OF6;v=<;NER~ zr+Ya^0_@-zWQ81*Ql;#;zVs)uVBtZn|W`$ zv~*YZ`R<~LF5l1HWvo5O1rRvFohh!(Bx~{tB+H%I&aozn( zcY#pTZ5WN^`3oGwX5LScs}vUY%fTi!qaKn~IB1B-4Q7i_qz$AT-szDaeStUHqpQgG z^c_FOl#vjb8DR$wKgS@>(3$FC*l53m=fZV%OnNye>t$FZiN#47)tck+Ti6?b^VdG~ z7!$k0s@q)y+NUPEFY8%C1$>EnUHQ9hMS6W9R`;o=uk{3U&1DWzd%Fe#hSVqf{>k?m z1TtEA+864EttN+)Vlirv2!l}u%3MfgxDi0qQTmHud`X6UU<1xkUU1zGPKypPc_DZR zf*rK^1pL!Os$C9G8>2P>l3N>BH~zQ zljNB}jo0l8B17(a-4~1OmG&K#6Nmch4!7vF8R(BE2J|W19FyK3da9THD0Qqn9A`E!a;j%;MK#x!|AE*?ra}xpX`*7YHaIqA$6e(K0Ns#u7 zX`R1=-d4h9kH2emRFd-o!!PDsh2<&ZZ21LC`7bICUIgR|xeCNG{R#Q{F(Yi>VUh7i zYd547##Q^e{$_PIed+C}I5&C6me4n(e`feMcKDvi1nfc}O=0>scKl$hcY;5AR`9W% ztul3N{2bM2MFsruDHCyq~7av$`+r^$GIMn!TPr z^L57U>oeTf86LK7cY~qky730=tmodCTR_{BgbAUb7ctq4z9QgCMkhls{~6`?H5t`0 zbBA;0_F&-e>|75$?4&;8ryjUcgSTiBOz%qjSC>5?@bn!Pyb<9n5dA;2o#$5*(f;)( zg%J9L-U(HjG-(P*r~*<#5dkTo7pYQ2X$dt{0|L^dND&JNiU<}6JxUQ25Ku65P(e^c zP$5t5UHA7VJb9JOo2*&uteJE6ckj=ZqoaMLdY&t~q4PtsMXsQ~%T8g8r-mMk7aq*9 zgiJqjoxY_r{!6%T`tO{>)->(q(bQwB&dUj}{BoyHSWdjsnP9p7>2~>tw`}thqvs&l z|KfIA1b6_c|FCvRr($tZu$~j;KTc%N&uo8!YrpP=O^`YiiUCY9OjXW$4*aS2uu!cy z-wSGnnY(&eH32zJr``)~1iOJXy-ZpNvMP z+m5JR=NBoXi$8PvB@?OdLY7YCEroOcmwih{mgh4&fmUcxJ({vxl<4s`3pPP*fyr5zcHk=b^j8_r6@{X7%sc zIsM6TSCI#F>KX0z^Oq4;-idb?Pdw~!cIzwDU1xhGH&XZ3EOJ9z44mk z^1C5(_o|F^cp$*Tvj9*27qFJjsDkQYA?UVM{Er$-`8#w_w)eJC-^uX|(RCiZCDf=T z>w2GQ#p31BH{ixwU&i2}hV6GL2t4xdHm?tABWrs!o7!&4RrGTEg5FNvrQy=-9mV{oCwI46 zZ*R?xw9(eBcX`5g`EKkAJlYj{yBo$ie)#6m-!G3uY<@_G{Wu|JCia<=sl25(?}swS zPgUigr)+*|g#FaI@$>YfpE_@U>V5yI&#`Bqyk}&yXA-t|u4)$$<03YTT2%FGuI$N( z{xY-qbwQbE|9z+70XJNk%PDL^b>-Jvk$p#-ec!jyitSw9`rISOzgRs!fXYTeNgo2j z_M^jod#=yRd%k4i@8Biuo2Mz<7Ip~p4QbR(b^Z9pD8Q24eKA2{xV`BYQ23i$|L|(q z;Vq8KMK?GZL%xxJ{dQDvGx!yf=u&?{AM(W>e(W7>oqp2$M2oQn- zASr^73)Mo+sD;MILJ0K1a<|0t4Z$^KH#OYxbh}V@^!oQO)W%!BtxuvW+COPT^=TJC#hYTiQyf;J7t zr|o>rZYsF77dmsT4VTL<8xsLf;H~^A=Vb1{Cyf&&r!$mHvVLyZ)(d%S=N_uxyKrB* z#;d;b>6fWT&M(sI1*RID+X6Z{rH36AW}Zb1H~R*~(CwqB!VvFcC#QvA&(B%8eskTHNGLD?wuc-gV7#_D}S}Gen-{V zB$MpG^>E+pfI|r*npQ~v9_P75$VAuU~08`Nij{hnfK(|h* z^!(j};o9dyBPFz$PEBHakmB*-2JB*cf#uN-y?)oL8as zaYtIJ4XeL@D#3iotY!rvVWzXY@M6r0Fe%iiOAsx1qO5&5**vB>&&pl9zQk=kuDRaE zHK8>>`P0(Oz~Yphg~HRlcSMMp;h3wC#@=&po-dJ8vX|0gT!JnZwYvmAnToj- z`r_CArSLwUtFBk9>d861&}xS1GgTpc5_%s}wJy4Ud^NQ|{SN&Z+5G?>yB+-qsYiqk~5{q4}FD`D_ZOCwgd( z)}7uI_w;LPrM?Y^eif0^*ZeEv_7DB5t)89^sLGJ}6A+whdOfhAJmybeV{P&EFTq8L zR-cRRHNOjLdU5vV;l_JVD9)7U?c#up#n%cAu!yr1i0e8iy8)qfEb$y@PP-Y7i#cV*<%hxo`bo!|c=$Bpl=9Z%;lX#%;f##iv2I`A4()V_N_t0MWS!8JzSNt7UUBV~yWckRH(Z zO%uqj&5-}azX<(&Iz2I00F5)n63!oT;1f<$aX;4ekfzvVt~wmUEl13_EWpC3k|wKE zolK->jV*CGNOPqAp*SMNF9;Owd*M#KC>JczNXiS9 z8*3bJ`VKQgOFuiL8flJSka#vJFCHEA zz+V6`qlfn;EPU>89sU4B#uvHFwGFu%aVCmE`PqOIy&~NyU%@XTo96b zWmo5A5?`I(Q&P=bHbds+7B5k&RLw;#GC|&pq#pS%Eh&oduq4zXp0k*-)aOns9m?q=0ka>AY+`w3S zwqJB#y7+!S#h{PT!nWXDArK3Q6#)f~UiPXV+t$VI$&I>MqhQSA_zDLCK8wm(XUlyL zci^0#6-2%B^P#`i&x6r(*3F@2D}go%f9$Jc-hg^UV@49ynANF<3JuY?+$D+j|S z)M99C84fY&PiC`rO{K$3q2gq;#Q*UMjEzx-01YE4RRdQw!?CE!_5y~e6n^767EW|8 zi_17nz<345X@-!p!=$#qn`(}2qWquqRtAv&+c^ZqHJa!J8LIwBhLCVDu*8@tb$7DS z`ssZD{lIy`1=VO#bRX3jj4k)ifIF zg}5}+=UDgr1p_9GR{CYqXap_cK5i(r_vYff-*kUB+engfg=bDYfA{C6%dsb)y{|?% zQ;cM;007||#>NGU#+si9w_*H{%W|lE#&1|A0zEZqflY;3 z;-0HNG!qTL<_m?3OC<3ddCYv8(KD_?DH378CszN{HUjlNt~>sy5~wZ!u&KeB3hTcS zl7F+L!=%D(2u%U;GU%2yRM-0K|A-LWWB(Bld+#ZD_3DM- zIj;XO5=wX9s~!HnB)~@=Tt7-iAkmx&ARaO!h$3ZItf*F98`T&6k$)>5IAPOy&>R|7 z_p^ODPK{UObvW##t`|>cEIpi#$%F*-z*7sR-ds8+-8#2|R7)~b+7AEykoLq4pp!{~ z!m+5k87doS^SDnCat5dFeTo0UDh6MS?kZ(;u1f;fd#c@kE%hwM`EeZ1MZVaoo_Ri~ zH>;FWn7B3Y{rdC1v-^*$+yHqZxl$K%ZS41Dr|>`V?-h~{U*3xS&J)oKXBG$8W;}IeO?BB@5>g2LGBpM^ny`xQ!yUUHI$O35)ZO9HJErXaWBA5!n zLiAokSa2sr_|F0}5Xo4)kt~Nca7HGU0}O_-m>IH|(UP-p0P9W)BwT(%!SG2k`;{$wZ6+k53QRxPho{54UR%B-{X&-6QhOP}--L zQ^BC?quvQ8D5N^ge4LPj}$I^={SB<1_#%(G?d})8vWZ&45!OL zy+=Z?vT#Oc;`_8_@bfUdb_w335o(RY^oI8fjr3T@_sX*7*jo-9o+tb!nV8j?Sk(cr zpN1;m#9>kZak_`MNQpE-JvhJ=IqxehGjY`ENvK@mnOc(y?QGr_4|>Em=psN zfcr9da>a-hIRyVSaI>{rZ`KsM(#;q}D=jF+Fugn%_vu!`UU%Zdb5|#Z@GC=vy>rQm z7=ke+MT*R{hslUHBj!+;IPpwiN`@Jf6V8Nk!COBxQYPZPp?Hq)JIqLRWfER}u^p<@ z0tI2pbSf+WjF&Z^e4^yV8x`%f!)h%69B>0}-ZNKI`z<^A8;eyn(5KxjxuMxD`?Xs?aOVN+2yq9# z3Beb_80xuU4Xj2JFKFi7iY4`Me1ou2BliRKsAtbz%?ELo&*7P^@Jtr~Zlax<6>F74 zwCcr=bXA}2##sV@#Rx<#Q_*@^*Lvksg(QZcCYu7Kn9<9kK>kWPmGul9|6jxyAp5Y& zft*af0|94lKX`fGC>+-4LlBvPfF(*mBVKQug*F!c$9;r^%H?6BwN$i*Sch+ z6HOBchg!Lu0MK;6W!)fg0s!Aq4=0ZQ*>q#Z_uSH9b{gGNt8k!7-XP6>8$>`^x-WE|QCf z)g%DQTLMT?9m&Kg=cWs5@&x7aX@gUaaSRt@1_u2SrUPy}dP+M+XmF& zfJd}`I6p;h5bZ<X84l)#C$ONMZF}6eRu{&Qh(T?)uOS}46X>Hf zk3;EP1~L?hPC2D=e$WXjT&-w-@AKc$&tquB;0)ZT!~;&R%5ldbLUD|VIAk7?Q)jx}mmV0i|YC)Zg|ZtKNvh$pY(;tO$4zC2HXN>9OUL0-h7 zps5i5n5XErr`YjgZs#JH&i(AQ;3+xUqEhCi4plD_L`}x8)FP0gWt$^{@KWgVQXE?f z?(_t9a1&HMUuV`h%bXLUTvAH8YP_XQ=H9)y<@i^P{n8>8bs~+xNZY7Q8K*ea?6J%xo;%f+g;%WTUl} zL~&jNaZjIn-qyuMHtowc+ubys6$ixfMfT#0p#nPlEKXg%4vxMnePnw-Gan|Op>bc$ z%GCp*RXg_8Q|`WY3#*AaLY}<7m`bknJzot!OneVne$Xdm!7p@sZFGFaoqatZ#y9aE zpPlKN9fH@@Z|#cvs@K@6qdQ&y$y<-vU#VH-acN(_Y+d5y=%0|j9?QNwwBfHUXX(-n@y&;=o9>>09w^ER#q`qIwVN`5Wr#2N0)dh38|J(#nTabi zKW`Q(ZF*~N#^-G&oDF=?@a3soP)Tv%Jzig2qW9hOrH1`gQ$*mCvzOb(maGOnm76z3 z90LP2Hxt~sA5U+zrhBDte{mHJiemplY+lbf_RSafPumZAF!r^6ZS$%%ucK&i8a$}m znsV3l3w_{{QXE)U`4ziH`&u%+DO2p5wa`Tg^)CtxOp&4tD6O=)hfIfVF}r^SL%-fm z{92p$wGk0QSo6gm2L&K}Vns2T$6tLQ0ln<4f zmCVj}zi&HAU*TF_&lbM3-1TKy|DN(G;J`hC-tz-54x8}vzuq49cRHNGe|t4C@VRJ+ z3?f`aY`eBNg4P^1(Lmd-n~p$!j#yU;o3y?n{We@W{j$X8ow3T@&(<5acKxIFcbD_N z$u$4?Bf85tw7Y9+hWI@+=@-Q35vds#X`Qya;m&>C?+5zgjlhPDc&YDQV;fa#!JlP< z5@o*O$AX8HHj;Qll{wZ&*CHcgb_nSkhF5nAw?h70>4)CA@27`; zc(Dg-T&1%}qaD^U;``q6w4z^rUrdjO?sa`-*3U8S+PwHE$1dp?VZ>j9Z`X}u?ThAa z&;FiE*e_0w+;n(^_fU@HiC+#kVgjr7SzUiwDQ)?m3+4IFeKjU#5WAH%>=z_<^@{Ru z$;UC5KJPm#7ln4`;A}K^Hh8W^R$aaR=<1fi)woBz*WO-D{C+h_StOqJ+hO)9K{+-> zKbFE2n<~bW>=B!h6ifVEPM7b*58(_F001Z=0XATqNd%rj{~;@{c|uO(_wU_TT`#X) zPkQTPGYk74KeoPq-&|RtW@hEC zuP<+HZQLv@-rL*OI&IYa=+TwP*tVxnTUuN7^vy4aMEdvzM_h^B-Tmg_8K`~6*xAL? z(AfILix*MR*KUw*+F+f(d|AEZ=9`s$gG}zOtgOBoo3On6`SlwL#^C(K#Mt}Ei95Bm z_wGNiIPVa2IpXcxQ7`YySX&nh%L{$|y@cfSj?T{Hlni?Zx5dTz(XnBZbJ)nJYoz?b z{(-*x4<7dRl0ChH^bIU#XQ#)YnVOrMo|<~6qid?EWq1~2uC8fN zU316S1RHZTVRLiE<&xL@{9IyEs=J5(DGf{#KFvQM>{dzHMQ7Z`#&TKt?Qh@KD{fc4 zdp~~8+%AKd{pr&Og_EaGD(f^gH&0K$S5Z5glS{&R1>U=Nzr3Qdwzlq)t9NKv^y1P& zZC(Ay$m@6S-sasX7#Qe()Y77%W%&5XlbPA6>v4qn`I*9^lCbcY#>RW8X~dzS!6C|! zqmxHh_pAJZqPTcMZeD&!Xw;LoHaB;_GrA_hA(6z)oNjWLikhC1icUaaSW{EegNIG+ z?d`7azScHQrDeDAgtUajl(h7$3yyAqLE-fcca>FjtEy{?ic5WbFBjh`t+`WMQd;hC z!7U{hSwBlME{&r=xle6dD z#>S`ZPbViQfjj#$Am~Y`EKaJub<|H`vg~%GJ#$G(6hO+>VrgGlQ7(_3N6V(&>YPA1bPP!J(1# zRr>$wgQNivWL>Ihbx#VCOWw5vG?h#TCDo!xL{BDZK`G8c3W+du<03GAK*5_D7l;}` zF|W~e4IbwdomDAztHULy*c=OdScZGb)!6d>1#o&QBBWWnm?G*32DWl&d7wcm17mQ; zPFowvvow$c3J62;9ZuL(+0@EMkqpn(r<^aBXnSWTF(K6CrhZ}g>S!Y~$5%Z`@C zJ|dTb`$$LY@(@Y#e5GaQxUNa;YzC) z?IC&0yx}o-7fEfw5gfmHr z0VE8cO|^=F0zwX%A3>2*??dWzs1l^U4`_KLFe#OQ>;k&tLlOu!Cn^D2x;p^Ci0Fxg zZ3w!Sfc%fD%hv}IDZCb>Aeyt?@QHrbb6263Bwp@OPT?H9fYwmg1PN3CgIpTjT`#Zlc1ISV{^TN zRdqK74uRr(V66Z?l_4pp0~8|&x6v;(so^=~LSu!E8GXb-vH1WRlw6akR3>joY5}q^ zVW_No4HZzZN7WV-n5Zs3`yUPYSWdBZ5K8*m4D4B~J)QA;u+{!4=IhooYPv$GXK3E# z?aqyc2iwoF@}Sd6hSbM>Ql|W=ND+734?3i4V5g5gb}#D<0#5gAamY?m4PHUr7A?ed z0%{0oAxkv?0v~>Zg~Ju{u~H@=`ZZm68%FgqpUN3ODIa9uZ)ikqA+y_6M}x!6i#g*b zU^9v&y5Q{k8jwQz3;-vk`k&Y+DHmpPVRNvX+z*j^kO?4)oS~o-%UOXj45p@w!)xVp z&z|R@9;<0AbqgsOgZnlUT7Evc}PK@hsd;7+K|qQEvfZ zcJfrFLh~{;txxgP=-DS<57(Thg-3qNHH6B^F@PpTv>a&s0QoVy;`FjagJE)B?8WBviVxJGlnN2qPuO8w+lKlXxAf$9o`*kQykH=LVS@G}Ql#YDo+a1epJX)2XQ@ z1lE^xb3k|+1S3IUdFgSypFzSlLI681GlbU=)X66V8W3P0yibw?SPdA@A3%N-+<^*7 z4KQ?^2bnKW41p4kgfAbnX*58VoGN>VWr2k2Q*7+xZdS491bRe-A+Yk?akR89Wody? zZ&Q!X@9emPdE7X#Y7&ukL7f7^w8iLLEpaoO}iWg=lbfkcu*8r7N7FI8q3Q)~AAI@V)CCT*c;Nuxj!=P}^lwYbVH(2xQ z4CFIGb)=f@L(oLQ6yKQ2%60(}QEwO(NCK%8#55;TIqq=S-4??DU36z4o(6EecExS# zW*kJ)JunCd_{hQ-)^-@Ad_vfu1Q<(4IH(i*utJ~&KrKu|!l9Uo6>e!ctJe?gMOI+E zU@|7Jlr{oU{8_#zysj}%&X)W~Wr+mH8c#Y$LyLFO_qmY@5b7{QJF;eOr9n&V{x}4j ztVTYq*ZXVsuApqMPS)z4g?YxCqUU?{D!H2>P|W*J~uReFSC_9)4O;7KJeTVlX}lgP@J?(#u*;ypjh6Sph&l4f>i~ z_P$Js+7MD7I9F$J;entr5Y~d1?RA;_RYX8(HueG|*#RT=&u8bi(Ki&FdZG9xM9=qx#WMQRyx2^e55#la z`FsS`ZiZ@xC-Ye1Xc8SgjEOt=6PBI`BkdlB=||}z!JbSPwfoo?!c%oDy*N{}dnMe% zv$_Sn*dKND%EUxupZn*<@$sOazgRWP|Dl)Ylh`5kebt=H@!lfq{1iRYA2)7P_{ey~ zzP8DGoa_D2NA6Y$#UbW#QAF^n;#GlR9Pf|9KG#)_>`sb-(y6ki!E5SIuF*z4&OW*I zOwnJh``Vay^OMS{5ntHHsD3rJwrWPJfRRsoZ*``^K)d`&DOX0Avh00~nkpbFHN`}W z`tqY)1+U{keb0k~0!!nNra@V&_NT2*;) zH&&CJSn-fb_$vAo20>6ER5C~C8lDxqo`zfUW!mfkEEa3uv-CsM`6yc=*xlz0pMUOGovli zd;&1XT!%(LAh(!g!FcBq&|em8L^Gd_V8{d@C@2uvm>z6q5XLWVO65jjVLh0Pkk||e zISrtu;fSC(9KevFzj~QcNoY=*3LL1034jb6S3&z7XlE^>(@l*V{FyhAfWdew0Hj%? z052rqV-~56fir=SW?6-6vWoE~;*(tF? zu6eXDN~&0#DgiI6Fe;hNiCnaT)iE{_w+5vtK!Hmb*)Nl|-aZq9h(0*sg0zq=3 zAuuq%4(oVfoXsE2U`ssl27)T1-T>rC@sAmio)E6nfX8tn zs-G~2H_^_?ss)0Ya{1bFAesc>%!DSZ1X_pRJRMlTSz16(&eY040(XF*0u5Oz!dM0R z@nR;T6>1-Tg9~tX2rP06%;&$CAJa1#!Q9o~Sv2J}t?`m?u^P8R{_l91EpS4(ekk#7ZT7WCZBtC%gV zJS?pawEMoazME0zpTB;pi$jFUQ}14V)cxf)Ss8U8;t5@+r#(qje_OboI7q8Nxh z#`?x0gNk6SieN^r=N+l*wc2I1XP(#U&c(9N)nWwel&9eHjZ$Obb!OM=c+2>WOG@H)IcZL`R889gn|YEyvbaZu=wzU46hHNanhw}`g+q$ zSyOXuBO@Y!d9jh^3-+~w!FGZWs@z{`P>fST@{0c72*^>7B^thH;kx|uZr(~wBgmtub8RzEj|4SJ4y0s z0{{iVn@@5+cI5r-APIG%c59hb5kqLO6~ihc4jey5!0{4bg!18I<-;O}D+8)Rq(mr6 zOY%wGO@mIx2}mqi!`;ZyTpEbI$r33MxFrqhrks9u8T34*Noav|?5W#wJEm%cPMZd%6$?qq!pn0(#QKH zqUU++3-C1_N}+1!|9tgv_?284h>`5hY|}1&0(L5NBI3zNR-u-1GV9A~mS9j+CHzC1 z!k7wVXdEe5ZG$2}UcA@oj`V<5H!@3~y}xd>e)Fu5oB&6>q4lKEI~m|yzwAM+{=fI` zVSs^eoM|2aIAI)>xs50=UQxJVQLo7^tc%ORfUnKeB(?v1lmT08i%~q$3l2Ef^#w{9 zO8FRCelqoJ8-S_~M3nP^QlOh6sIO>r2Ft6T+H0-aCmf|a_TEI?cEBff;I=&mIx%SA zK=4o?BT#*8x|CE`N^xs%dIhD5mPtYVvzJx@umF&>1AqCVhq!maXVs&M+v1IiP4k0Z z&IxOG1{);7M(FC(R`v5wQyqC2ETJk`hG;C4FSr&3zIU)H;u#WHXG`% zVcX#0N#lNz0jwayFuDlKKZO;l=i1*J5o7?~OCcyDmSgY{Ne1Alu*DB23+oBQeZcC$ z!{H+1QTBn6$MImFlnsC$ORNC#x~C88C-m^Mw|ed{3l>1fchXCkEHh-|uEn=Ew?mxg1$3B33MbICt zI0+OJs&Scv z;B?wi5b^eOQhdt|k=ZK=3mdl=zPwtvl1iz-q5vukHt(KBf^@wa&tDrCx171p$S43_ zfAsrxerxaYEr+$M9(^rIrMRFzjf9@`&Y=?kUxy7+794R)_;4%1dj}8hCRMZ%%4g#n zxKHwjCd~4M&ubAD83C?PJhEizGhgEV@3w%<%4IXBOxU}8Qb?( zsC~e7CeLMsu_cBQ!t0?2MxxZ8x~l@cN#7Dyova&=Dpp;s?TG&vJE-zxmCx5&81z@6 z+-MYj^aZ5lbD3*z%|>cnqX7Jv2*qWy4QDm;Lmv00K{3QcSwMUuM_UR!NB!VHdj-<< zHb>(5){cw>ByhJRi~aY;6aJh&r<_M`-W4rnk0WzF#BSt&%js^+ZKUM-{mYpMAQmMv zlgK$Jwav!R#rrH-RtKpMB#3w=FvmT#acT2GXf6jS`vnC7Rn2HuT9^8Xc;C2LVx24B zn$>iW<>tOMt#tQN;?`WEog)s(g@Zg%`3yM$V-$eilerep8Q5TIADU+m%H?y*aq^Ys z%Y73N!QApb{V8ShgGFWmih3bC^QMoN_QfLnQq8|Mb10N6T7>LyFr;P5|4IGGYe5w#TfUm>MGy;n1CbNSm6<|MB=c} zmZ?-MsZ=r(RQ4#Ak}TC$GdHv;`E$0!cKLi@tSxH7k2!jXdE^8dXC9^I>YwJ8bQuOc&}4zKM;zC}5Ofo_jL zpD-}w`~Hu6zia;Nr6(N_s}8cd4{|;qv|EJF5Pean5#;QN}yZ=1={HK}rr$y}VWBtEv9)H`D{&rOTect`|<>$X$w7+Dr zf4%zu`aS*)CjFyS{d?2>Z{+j8G1|Xzv7-VV*rwspyQHHTTE}$N(GacsXl?1}li2Z6 zSQAzMnCx-9n0&m}ef;h1-7lYycf@Ev^l5t@wEZO7K^5&!Hw}Goys$(UO)*qVG6S2a zaS3+OFr7{0Y%0I)l5rN#N%#H|+hx-{5xqpXfZd8&fwWbnajD&^Me#|uu2cd0HOn%M zkcCt_pUApWFX0$2=&*skW0HGi^4gw{UA@)qvuT1CzBt^!(BwW)cHygIv)e0#@1G0b zoF4m*R+^MMZn@BLMO|q^7q?xXM{g|*lwbVr-j#54%pmNvgX>LW6Em%F+VvXD712)@ zcK+e>rs$-{V1@Hfzp>kTNeB^_y?}T1R#m3AU48{kH@S7Ei(J~L1m0;|3Xu z6<}YQtT06%4X3E|GD4_WG)mfd!#G9V!K{x57K=7RUglUep0ffOq&1FYc zG(nd_Fb);`F+?b^WJ)(ZNKvzpqxD8uC_EZ@)6Inlz+t$V-a#^%XZQoyg(O-img-Dj zfOI&+%;RBh6IPTFPh?%hAm{gBk~Q#;i_AsaiJy2YM2nUpz6FPMpBULiy<;7MWBP*6zpdvY#B4VBLlG}vE_agT5+&XCY#~nPI{HHP*$ekS``oZHr_x&<-psr5`E_{SY>C$P z$~>P{hlENk@&LvgJJ6daRKNhFFfZLns(8#w<;eaDP?-sse-J=d9%V*^DamMVRGTCf00(bz>9QQ$U13P47ve$tp8s`<4uD$0sq^>^&dkO-&`ogp9v3lu5KNUDeKSGIgUk(^)_N% zc(RD~DNdlA*12Rj{(45~a8o@V8&e_`(fV3b2>&v2;TpQJzF{ut4in`}An-@?TD5}f zrZ*$NUpU##QFyTHlCZ3C{B}(Ls@|7-0&}mfp5%uEo`mAN&ef`UC|O>w01z3HQ)9C6 zYn}0oZglSHef|`LCg_890x@FI@A<;2#J@s_=*!Z~YGP9l!!_mttt2~i1Pt~s>Lp1_ zMb#?IV|G4td_5vZ&Kj9aYwl#zlIz|^O?>Rx^U2VFL8-u4?OeY@M=y_IPMUJ6r?IFw z>^vUNEYL^h{-?ss9$$gPlC4S{Mv>cD_4X9L1gSi^2`kc8=h$f|<*P;okv#YbIIkntUXsk(+CV#Y`j zsLo(Q5^_ViDXf=cjeel&7+|0Qqf`qMtiv3@NEz@GwFl(gcUe|@>twQHjhWGgnF5k^ z;vY9211sSfdctOC1Su`D^fIRlh+#xr7$$IgL2YvG2&Sk&-05gT4oW|o<(kucQGN-^F(a!Xq1d!F^}8pdr_F#acmp?s#OUd1 zTk-jSe%eEF;MX3mEDe4lV<;MAW2K|}v2|=yG2nGOd-Oe@28`=#BQZ{K1oWB_pW^Pg zZ?oN!}BKM83+xuQ;AInbuE{1`*Gh8wtY6 zS41B7ZUL)m@F*j0IKS!IoE*N5`B4*;sh8_tZKnDR^sy2!i7Q21gp{{*`bCQhg@bx(ffueR|5mVul3PQL%wsEB!BE1_wSDx2#*X{ zYgk`fv^{_?4zR!t(?iJy=zJa`eV~ZTP{anG5HZ8E6wKVHjzP1uwHOo(kFE)J8 zm*y2f3D#&dh`>j!#(~Kw<37iMh`dds3nIT~Jk|Nh;6E6Ha6xe7MOhk5G8mf%DS=Q} zcWl^Wf2Bi$m-@1BW!(Slv5Wv7<=)s2FA!j1+PUD2_flYYz{8~|HO_t{fH_qKo*W)a zJjaPdZ_^9KgNiGN%LMI%0^e69_{Hm(d8y!>zb z)yt(*<@3TH8SnwOAk|G6GZI25iU2lK`%WH50j8|gEb^dI-olO=O&1sjkjdQcrrAcR zb8nqxWE&Wu{-;?=(Hhh94RUOFV}A6M)b($ovSton0u0s!6m^8~u{>+!O# ze{xPaddd{p+ZgPdc?Bo<)2M_XygXr86(- zjrJoj)(0AO_2zU1KB3s4XN!L6|(I-WTtzzt9DKoR5 zqxK`lqOCu39v z5d<b&5qLNEy<1goiIS>Jo1MmlIfxDP@gV?L?_}7 z2G^%IXp{m|B<|I|`sJ<4CrO4-^v6$im(}V30pzNb9{z`Ul{b3?`#G#AfZ7g+jO=qZ zApij)8OblT@W2QP@Tc&zlswcb0SI7Y6AXZ&Q?#^GPF$1f%1RRxMuwFD{?w-_vZ<{6 zL`Arvrm7$zJVldgNK;ls3Qrn9s6B@YFZ*DP{3Ic7IV16?ULm}p?jDD@Iz+-a_1aRA z#)uLZ>Q$srA1ARw=yfwYp!wnfDj92-QwFeOn(Gg5GUC%TxRv+Ib*ZpI6$eSRer+^s z7mEW#{=oQ}++Eoce0G`fIm=4tHj)J#km>JFM)svSnWTopW?+EpqzQov*S)ER4L2eX zjWRY&biVYanDr-@q?rUDTDXu#>cqe(B2E{XWkmFc1NJLOUDjR}`duj^qg{#U@%}Fa z22c^{^|JrgDT5FxqK7*23fxGwttSaiS*q^AOPT#fCiCqe!q9k8MIy@q$r3}LYvp)( z2(9DhP5VaZtq1}ONIFrddwdh1LlEfzx;O!rgOqQ*FnyrPvk}$`#p}*M3E>2D z0c4RP()`XT5eiOi5D8TH%i62i?OcnZrN1xq*R##>OzDKd?eoIrCy z5Gdh(;Aq!kQ&@jk#>>C6DKKHU;^c-y^GVO(_*@@S_s9s@nAoqb3oi}j9xbt}}0 zz;D%)YCRWh{ZWx}P-yd!pK{ptcDI@!zma~51Wk_@M8@Kk0$?Ltctu&nrBmtjZNZJd z^cOzER@rhQ^S@(d3*Hj?W}|P8CMH{NNO@f5ewX>O*@WJJO^@~DQ}ZGzVgDT+?ke~QQO5V&JL%d9e@_7Q3=3;g&cpeJvM$5oQywHY!tH+yBzKTnik!=4pEx^GST&rb$eA+I{vYl=e5uMKm3RF(Q?VVR$@?HjOw7?kN|I)I34Fu|@r+z&V#{oLK(cVS6R<<*6(?qe5Gyr^ z#ZQq|z-&HtuAq80593@k<&=t?t9gpg^_sn#+g)x#Y%KcFDt&1L|KYL8$93(G$wa`J z0%zMvMI&d^Ti~Z-@q*RB$C}KiTg3K+j~#lMxE5rg)yEXHYc@GqRu<1%GTIycX^4ld zEA7*32KLuHNJJx)$t=YH*B^5osX!s{H!%%QAxEZM$Ml#ST8P%M@HY&=^eZGsHC`@O z@x#;kj~bU^d*jO1Wa0IO|p1gC}Myrsm}%Kn4II zO?G&z=Wt$}^xMQC+8{q+_tV+k`N&0HwcE&$)71T@&&q@kKq3+$Q)v2->rV*oZwPKU zxL;3zsw-Z|(Od{OrLwu>IQ@_unzs(OKAYIy{WFQ<>*3>ZzH})ccTSjzJ=0T&cd?Ug zF>bs2$eO39 z-!0YYC1#~U8t1VmvcXbT##_0|OJjSf^1SkA2G8qEUWhKwb2UhQ$7SYeZ%KrYaAm(t z1ND}#msmS;IeJmPi>fzBMaNJj@;-}qE&X`9@(Rts6bp6ZhbX)9>}xos04230E721u zUi!q42(XTU>^Q=Cd@6meyZ4-%5mKT%I4hpWEpNK0nCN}3auLVtY&=0_N?h_7^fW;& z*(>=Nt@%b}3JY3`^6qN}HZOBJ`UE$4rHtMZ$ny#r^b%0Q!9rJjir0uUp1g^(CdJ6h z?wvU{jUVWz*5sGqmvCUJW65wAa2;4;7H zmsD&2u=e$;c9Vc@oaoof6Fg?5)3l znSFXWRC7H}X^ph7-mbpEHOP0uadA}U3tTCnuQ<4M``e*Oh=uzYm<;I(_BR;C?*r@qWMW z>v~uG7zWi64d(mWVTKDc#*ly12y}9l$?TOB%7yR80w|Jfqw#xPfb=L}Izl!O}kz}_6 zv%UU%=`!2wdUkl?$G%O$ZL+5=Y%8|-%Mb29haGWc9?Fz&9o2rlvU#|-=|=a)UEOtm zYrxMv_?t%Np+w?=%o~3R@3k11zbeIFVf1V7YnI6}PbI6sO4#9-w!4z1J`etFWqSu| zWbP@x*$eV^;eO}B`^XJzA22QIO#ZYj&hSlF%%|h~XQ`ySA}v7|-g${KezP{+XWHDn zX76)Rd9@_*$f+>Jo7|Q2k-r>VHF)EdMGcI`s3n! z!Y*N~Ew?_2OBlla9>XKUm(=j6FAVo)QS24t2l#Xl8j~J3b zg1fNFlOPrT!`;3!ipr6_)FW4sko_c|BR(;LTyUsuMkxGKP;pr(w)|VbzZ1RgZ{l*^ z)4B&w5B>Nvzi72=2*bm!>YX|2-hFv^X7gibogqju`aGL*kgwr6;&Lv-eo&a`T&Ur# zG#IGZ94d2kYO5S5E4K4#)1usJQ$5{0eJlY{!fb3xbjgN#52D_6re0S_2=!kdl! zzJFfxK3}j3tztZqSvc2Y+$AQS<(iyk&7TYe2POT8_~7#Umf+F-(ICrrfg|Nkt_3@( zAwNqre!*e>3hW1$e+F_Z20L#>)=bBP>ZDwJNNdbgsObxl7m^hB@ng4<*P{YJ3-Un+;usba;W4I;wH^cw}d zkrxnFyJ%hqYT?BLRc=-V83#Tb8M7`MxB>}3poQH}oB zJrH1AcsefU+UEW98$1~RQIRbAW|-j^I2*ULTdTlu0+i1rP~~`4CxMMcX}KuNQ7@BM z#-fCCW_>h8n8O8HoFk-LAn97*9M-=6>Y@0hlstWA(UFIoLd^4=b8dPhDH)f^%U{Lb zJkp6;s7{&vGGAk4e-Ap2cCoxKlzFSmz-s+%tLod=Y7HF?AFAy~U&}Pk)=xjZGc<7N zL!Rhz*1d-mN#m;=J664+9lNBeHg_)i=-0~^hSSUZkhGby zc@aE+wczV=Q56T{)Kl(9`vomLqau?(I|xm^UJwSGKPq3>#|tm|9R9g{x;^{oT8sBz z)$jXDPXdk(|NeJ=yf&IE=ksrhYWjsvMrKtC{xaSJshP2opVP;3!-!y<6Ilw1m&ZXy ziv>U^O*;HE9I`?JGwY9mAb3t`>{}Gqbubwg3{0=YF`1}jCyYlqf`D7Lq*wf90Lg$W z?Y-Fxzy<0{h}D8_Nqo&wD zct_4J7Cq?al6+uacP5&9qo8-)<&ImIE=zHY=6Ci-PnmSLZ;b5hELJ{5a+egFRopMG zc(CNcU9R-8K%z9Qwtk@^TYf3Gp=NcS+bwA(ti(O1R#LLkLo~6tErg*!vLOW);aTM_ z%TrQ1gNpEK^=Igk$Zd5Gwt5`B`D?Q(=ier$_gI;WZClI?O-Xa(z@A0PT^Cg!*Q^Yy z#z*_z5&O;8=-)|^T+R%5d&9nZ96a4LP?LYbW)ms@lFOrCev~ibkNg^S@Cjvz=;X@v|$RRdWg%whlI1&eZybi5%+2G#&K!C7C&_qrmTbIcj6vT_Yopvr*% z4J^~7g2$`w50~I!0k569m$*oA|H38OqT9L;S_@)CZ6DrmN7>Ykck9@Aoxa>@=`81< zX{b;Ak=MFaY4uQcpe4G`wJt+zAiO`=GT8M|En~=DW6-@T4eP0P1yZg}pMUQku0C*i zIvl5J7-rk7OXpiw_U)f+_Xmwb)x)C7tCBx+r26_D+e4aVk3+saDC+yGTNXyyJ4Qv{ zs%bNkyyvq-T^JmpxpG@4j9~>&7jE~249?`IhHd`70ld5M@U4!!3H&OxjTnSq+BmW$ zJ)H9%ag|M!r!{e(;O*Y!XlHA0O^}TgpmP#`&NbVbs8sz57Hrm@(z6Okwh_aj$B9T^ z3{avE#rtC~8aor|pbnaAIoFb@#uy$JUzjo0>{9-uBh%D-2)>ERr1fUH9CaQCvZ{d5 z<_WSx2mqeftUK4}NsbTYqKtTrI-=L`1ZVJSrb z;wea=O&qkfJkq=+Ll+|vIf<0lm$j^?jrX~AW1DbMZKLG1B^zbLb|+)2-@41f=Igap zu?^+s>nSfIkAB-BGT%Kq%r~_@zgjNcQPX!Vqd}#AZsPZP^{cyU;~9M^AI}uF#o+A* zRto`q3Vt_Rn7liRtH0IS4L=zl@0}+r>Z>VYEP3WDQ?}&fy`4->^k<0>L%N?1k zQ@~581>k*a-t`F>IZ3`Pp6#qvdM05KfI=bFhIs&lmV~GR5^OC%%W_$Vtr-Jw*y146 z(NEblR9Z0zgOEE;R7Rk69;`diLj9$>w26@waqr$-IeFIp zHe7uEMyQ?}3J@$C>2d!nMbnJnngdJb48I1?8OBfLbf3k$UZt_tOlxkr`C6J)Vhj3# zeE!;Z4Iwe79k-9BADX=c?G;Q;Z5q^2Xg^ORC$i5IO%l(mfkVlD+)OtPf>#U1n^z#khaNm5*-~54ecFf z6vf3{EQ(dP!j4cwb>N0s66&K$9Ba2K3nmQ*Q)tB@5S8~$^jAPEp#U$4q(hb#G+-$X zC_O51RWCeIQRM^_sbElkv@i@EisM+qSS$5$y*|*9o;*#aLTfJz3Wk!Y6)##}nw56c z;%R}ge72k^8SE4+3@mT*10|QI9&*EuFSf4x02 zZAWnY%@CRyYx%UM^nkwaP4o||6^BneQz3AhsNYvYhkA_(e)KsX7xppmZxbIQg~mV6 z7%N9vHtmPHXUcF_TlFFa)PBeW#L(1)zW9CfAmhm9bKA1qZnD&EX60RidhJ|HU%J!M zOWrSnQz8jNjl;q$&$e|nRA+OWPlezZ6w``_|AQ<@o#_ZXqZG-bRL!fRjR9X|f{L$k z^R=d`tHv_LK?2p8n)NV+=HK1= zBY#vT->dT@+3J|yt7it2V_Ou(V;b8>pNv28O+3^)nbppa`Ri@kVRPj;?WpgwjwxS= z!sxeFzPmx>{2xE-%Z{6UOtkM8{`~M?(zmBIYUhD+;hBaP&O6I9j?zE>{`~IuaTUj# zgUf@bJJ$w(Eeu}y-ccTY@F>8zpFeZdwJ4%8iE^(0Z-8#A)aS5c@Gs5vdt)#8*PVL@ z9cM#U|FUG>`>-{5cHE+IcxG>mr0OXv{B_Lyy5aW5MW(?g+65VSIeZ~rf>m%&~iQy2# zn7AT!M(qn!pcw?1*aaZm6ai+@3T9aW7NrW7D*~*#6|5!#Y*rO)w*}Z;D%iaRID#uU z?g?-vR&Ztra1~T=l?iayR&X~9@N`%33<&VPtl)huz_(Dr_etQwX2pd=0sik5{Qm?n zuu2Srpa6TNzy(1;(MmyCK_R6|p(}#Iy41+uWOyEtS%vNNBj#&ZqIm!4R9L)-qay$- z`9NRP9aXe~grYqe`ef!p{}$Nv=T)!cC2c>IkF9NEv$p)eC=wvz`FbCzEp9Q2y^sWv zp3Od~l$#xqzn7+9p{b)*6-LGh8C71oEu{3)fx$&cIrs}}^C+^eI0Tx+fT6PShqNbS z=tJ!k`I1!Izi0&G3b^n(!Bn#k+x0bPa zV|*JIyF$n&(o_R28W5e>~b1vEwV%p2m>?v60#`_IbzGQN~&RU}-P_5a_oRH6ZdYy552Cmaw6r3G@O;^v>>hmjo zJ&OW8J1gzmPp9qHs_p-Y5KQciVWJM~wcm9#nb1UGVFtnJ7!JZP3w0l*12Nbpvl521 z|KJ@LC?JM8K4ZiX$X1g{8c#&W^CyEfvxr#dA(+uHfF{E{iJ}N7BZ*4yNYfo5Gd6)h zL;yf&dJMRDx`Xk70DsRgL#XBlCT*_;BAgSigQ;~q6b7`(^eaPjSUg%d<^~A3BTHtm z6~z;4-Ev&~-9$mYE*~##1(;|%U2$=?vg1^#MzP|h198$A%_th8_aSh>jSra91jP?C z7=Z)Xp%L6eIHD-NXbZnB>Jy6tfJYv~wVoy}cfiC@<`K3YP5yl%JE2k&H3An0DVFgj z;kBdxZD}Kb`0t_-$%aYy+>%Y=Bbwk5J==`ut|BAboV;3}N5JxVmViEG%Q3~kDbh96 zaZ{U9BF0)Q*j+5d%GGn%SSM@Ctza{tzmEFJ$C`{pXo|uV$uMg!JQ)lQt@r8{!^hu^ z6db*6u>-T-(e~Z(fjvrK-U<@mNnENkWY#VLClZil%;iIpxMMaA_N#qyeo;X{cud3ZkP5J%?@Ba|pQ9mAY81f7gw@FfFTu?*Wpyb+aN z573Q~=Py5p@@ffH6VU*`tG(B0<)LN*aChQ(_wmvIg?NF`*zGTcFL7^Z-c`5Krllhy z0*O%1SkR=<;~X64ihC=AN85!xzkTY?KFp}1Zud+nAKo^Jo~=5FeH zqHGqP^E{Tr2ucIRL3&~&=XlB@p<^l1uT0{n5*yJYb(U`68E%=`UptWq@?3@|J)KtT zrrw9iv}X)!#m~f#7|!-kLT}6E#x%ze)kOSe>}9iQQltTU*b95>?z9W z{bGFgy_F39`W{y@PDi`h${xu@Mpq~017RsEh816rmztF-)qf}S&D0qSd! zsfl-MDe7#|`qNUTr(i2=GmbJBAZWHHL$gu>tOf+NZuj-f{$6d1GHJ zJ`@Yn_R%@koX^55TZ>SB`TV(urGe;@zyRaQ$+f8?qq&ygPI*#+x9}Tnv~@fE2h9Yu zzmB$ioSB~v8gyU+#X!gu{}YklH+9b2zAm)Od~UzI+Ae$amG18-nuu(?oor}}Pn*Fqrc%OW2^Ds zVtJ{ny|LDx4*3uIg74ct3a>-=K{UyD6&jq{n~U14XP{Fiz!RL!`6?Zg9GgdH@o>b% z)i3Rye1;}phLwS1jo16IN5oDU>y=e4O1`QU7@+-C_y*L@6eN3!x<;Q zipPwsX%j<2wVtfJ#XoC=d@7qWy* zAk|%A5FB0g556B>wdVN&b3ILl=X2;KBWdHeYV>p1AMuaa0ubMAYHs!T6B6iS>7IIIbRvxmtRnoHf}VsY!okP3N7F_PR{J6?(oHZN|j=&O3mGs%1^5% zZn8Xvi`@TNyj9FwOyf~`pxlfR(z{eT{NP}UGn3I5Wd$1m8dcJhpv@r-ueQ-eSN z#2e4k8N)fHEsPwgejBe2$K`7D1`cN9Y*l}lghf)6@YcSyd#*rWcueb4*ZoCfTV`o1 z?NJzL@^nN1iDY8aMtj!a)PTEo*+xB2nq=Y|Y2zDsD9{}1U%d4I8_w{i?hteYNIe<9 zOG11J{_i`pHeWijAEL`>e%dX@4De=ae$x|HH-EjN(>Iz;kohD0qOFIbns@c9&BOol zwUQb$e{4i8M9nnh{x*v5_di7&(A9J6p((Y4_6}VrAOn11Tw)7*m^j0CUmO4i4rss_r+c=mu2q5R*tgy7S zv$QgIZLx{OpIfH+M742@^xhcp3Hkdj>6vvlC4aff5^$Tjy8ghAYeeLjC<=X!vIYcC zQGoM;i{(6mQ$&z3^*PrPKgs6C78uD=;389vTZz&VA6O9j303q1n#eH)cc?>Q&``eU z7lnAm1*c1F_&~OZ_v%mZ&yQH*kDZRp*w`Yl(Yqm5fDs!j-MzaYfU2sn2Ne+RN3Y6- zz4$EJsu!l?78$9mcOztwb+yD3bR zegO;YRV3XXM$)P;18CfH>TrRHwHq3j6$hx_NDajjaMHj7RRaLK3W|%x>5gSN2xt!t zJPrE|n+7HD2nxMCr;%L+`F#N{P-CczPN{GZZVrJKG8mc!ltN5CJ~{J9gfPb*I;I5< z9ehmP+anG9@t4g4+1^U0#!THsk?a7;k#389zmX($uZS3X(a1m?!8$+K>gWuRn)6$FGpljU%%B8l#@0b0&SCGtjmVXCbA{99|p?S4of4fX141Uz>p$+m(2*jKtG5 zPewFSm=iFwKp8$J{TlF}eG&if+iQhPb}oXbZrpz-=FL5)%tpXJx>JiT{T9N*~*9M7rAl#vxLqPU7QFVbXd&PtF8T%~p3)Z%)bm3XOhmENyNi|;Ti zN&R${F@{rHfFV2Cckii{`T$w3Pw3c|uKzUl%lKx)TLj{ax;$=1^{{%UZQOK`FiN{LTaaI} zruz8Kr0s6NgSbFfnXRyiyB8En_oZC~7?EOQNODQbbu+wuyOG1|gUncAvF^#skJD}| zM)Q0u(7On?$apGJB6MlTpfKol(|SNTvrZj;{`^hO*B6!9(oR=jjg2{dVtJq>vWX8{ zqP+3^bXcJiC64d7KUcZ%wp4Xq0?YP5SLV`bK66mRr6|KWJ1dr&CFc5$fhEh+g#261 z&mP`3s%?sgN*re5sV^TySj*oxifYuuSg8eMyMuU}X0 znsnCOyW}p|+wg)I?$@w2H!G&G^JYl!@qOE%#?I*nP1EghS?ye@@npF+xdK~ol zb`KTI0yXT`5!VN!%!m*u{gbCM7Cs?Y1y*j+_RvarYi4*GRS5le$smsjM^*`d$Zej0OU`rr!dFABSyQi$8Ekr3b2YSf)Fy{a^ zMBQ_B+eKxBXR|fgJaUb-(E5caOg_Zk$d3I@=u3IgwsZ|?C*GExmkNg`>Gi3EB~5a- zVq#lnCY>`grKn%i3Y%@iyCEDBIxh73B&X5SQPie*^k&A_f*bu#96~ooovjq|Cn8;B zJr*Y{OfEi{=XJSgU;G;B=kGPR?1J6;Ipr~MG4CVqmb_E%8-Mmd(nIMF0vtcP6unNX z1n3K;ng}$3){vS-Gc*)Ue2f2}_~`N3UGSX6T*am$h+WVqxy~pAJlBBE_eG#^?gfikiBjCz9WQZZfO1Nv7Q~qj-_w0k?VU$J)f6{ zT*QYdtKhB*yJ}a{h~z{)G&kMfrw*c(4l9JAX$1&o}0(?J9#$=!jgIZ;DUkD)gvlNTcjHO>BL+ z;N|JiWpBUC7Tzz???PU^E!|0f#Jeup5;oz}e3ES%xdmptJfh?Mjr1jQTQ%hJ^l!V< zYN65{HnH%xrQW9{TBVy7H&o{$7{2Ac>EAMc6#h=6IVkA&pKWW7U+*R|zBXN3T6dyk zDyn|I5YqebMW^&elS9{owg(4iGT~i~Y|qE$MxQEn4AM2YBKhZuvuq8)gN=?p;pfl4 zQUks74OcGhSqxk|O%LFZv8|}N^~T5KbV5@7g9+nKS4P=c^Wz9vc;Aorqet}t_a7;G zFh-EpF1SX=Z=2ubeo?(tTAHE!?<6VnkKHe}2b1wtw(2fF8&IFxLS3s&TcZCi@Qa=; z!~cG_eD~MsKEKy`$iePV`MtIR07W=5-R)c!bwM0O=0^N*1gSX7O#O^Gk+acfco)~VAJ+kT9Cc1$~jrOOsaylAD1tD`;ep@l%` zr&{Sh9@DS-Hm>Zn}HZ$75nWn` zFPzBBES-pq&G62c^Wio5-^J24SE7HPh}6w+x1CrsGYexJfaVi!2LSj=gi2#*`ZomL zwF#+P+)`l{-o|O81ZiP7H~_G^udokeg*jq*#Yi0BuR>G9A{@i8bBw?+MqmVI(OoGf zc1Omu{Q?{#>dGukY{xL>pp*OsbS-W^XvbjiDr##W#de#@9MLX+DS9o?(=~~!{(u=X zFi8L=iKth;iIq9LegwFSKf;#)3dW&Y0YGqtn$RJ@iZFBX>Hr`J5GA7HiiPYBGeB+5bG?=Se1|Th0^=CNDJu%QN1#Ul&`w7gI7ucm2X01y zLvs~mI^_9T0FzY?T0u5$0h4e9AbLumY)EJiJ7*-YQ04b3z2@Y1i*ObF@ zMekiyNxCLia_#VamekJxul^h<(p%wCWx}`2C7#648b7tN$E5u#EAsa{c6vTj9yZtT5p1#r^Qg!|F;q_~mT-p+F zl}rGKCZNmAZam9+VVc_At!35(p4RvGf_E4!HZJB zhFYswp`u^|PEWsgM5o%&K@Qg+06XmuUzQNRT&Qo=JL$WCMyD`byvolH6D7uBFIyN_ zFA-T7EXlKSUr!HcnhguH4hIov6iCca0%RY!w)f-SHx9^mW$)kPp{6~l&YZCzk97Nx z&~z76Jl;p`hUtDpUyM3dUEvMc^QWq-U`hLx)G{#InU!q?45UcSCu_2Z^YCq z<*DEFR#tIww~F+!1XA!!MT*D*3}Yq0YEtR@Rtup14tEm(${`6{)C(>m#lL#*IT(^_ z%H^mZ7H_^7c=cz_lf?&Ji#hUK2_lz64GJGrgym}$XIv`|I?{IY>0^=3MRg}7`-yWgw|!xm|B!ipdM zEdG1b^Wu=GCjc)3X!JpBFe3cIG*S|{ZcmK9NJ6Jz(Cm&CJijV7tTOp)3s`y+To+?N zKg;xbN_Q6XSVA8RE~cj{J&1Ywi1PkH(1ZLbr9dGr_pOC`KUlnua@h|RKrlR$trwHr z3rp)&2QZ|#pTZ{OOP#_f@h_DR7mKqwAKeLQ{4Ye3k`SK47TW}WifJIwDL8Q;u=(=w3{ZNH1!esZ?S_2tUkU4fnnm35nqdM#Gp&aG~r+W<0TaBWSeFz@`#eT&fnhQxsGvi0Ngsd zY1g{M`Yc^n#=i1wcR{y{~mU1#$|21-QDQ3S~x;sD`R5Njj}kjCAp$9miFIN8rW z1pyo|9G_0Cu+cDdpT{VZ3rMT9-vyqU=Dpwm!$d`BVASI7njwqh%d3?a`(dv}**FBj zoFiS5k&Y7hHCtLRhXRf-L`_09Sdw*(;WdFyF$N(@unVpfy9ee)K77_v35b&J)Ts$= z{wJlzJEHUF||yZ!Ko;) zxH#1^(tk#7OcP8_)kZ@Sl*;9$)bU_Z z0(cfPuXjh;S=hu4Y8g-SzI@b(GOcaAFLWLKZCv>o=4&_RT#N6?^U1K9_f=my;VYtM zxTFr8QIYdAwn`NqO?_OAjy4UWR@59EU~{o+y7-0GY~!M4oQ7f5f}E8UCPq-L($Yoy z(~hu!posW$ZLQ&FQ#Rih^?c?vo~^PxAO3<~qaAkdStGd3UN#qi3zB)dHSc!Dx^WJB zwrj4@Z#t4=Jzi?A&)cmI#jdewIxg2ZN?-Z>Zg`^uyulc^&UbIi$!hDv^j64)ZI-gF zSDM=$n*OjyzU#x=y$L(_|LsKc3f#P~t3JGQ60lo;PoU|aP(e~ir0Y)GC$H`+d#?tV z9+FI8C;JlvQggR&E!{ilT05Y0=^Xw@JY4;Ecyi_F?B3DOfuq0wjzAj6G||V%!DD*L zF_Xp#Tl5Ln;0Yh)L_p)KNc2~U!LKruuQw1aq=c@Ia$Z>5n=1D51Vfkx#V;>;b>k@F z3;0Za@XU^KW@_;5hFRL2d&!XI_llZRua;^}4SC)2+Q4#JQw@Zlz4UI_S)2ykA^K4mPF^|3S`teTd4 z1NWAm{mvEt^el2~_kdQVb!8}?mgh>EO556tM2f<_k`UPXs}#O#18J8#Hm6Gdi}**U z+POVbef8m$bXBSmES6SMd^~sm^?PT=&FZ3W#@e9gp2O?+KWrQ&`#uY&yFJr$bA!wX z{`{(~JFvpNuk4RxNT|(&F{XbEcXNA|7P-9o{ydHJIZJM>aO5orjEKy9(IO}FFE9A# z&VoT=*DXuS>s{S>xU&to{ogY-I z<9*SxWXBZA<}t@q*#U%8+5ImMzjie@ce$>+a~ zSu3r{4l!X{oV{u?qr{(og`Txq%Suo@*F-yG=S!AV%FZ-V%5UAd*wc`e#o^ao=S5S- zXT4uClzu60nND!cKPt0EHEdd$pmz9+VlG+NRmOW?F2A1hROEIQg-z1QA?RMu-P*Ey zD0i3AS{3&?vwU~=hKA;G_r~S{lt)v$;TR1Rt&b%>)Tcil^q1 zRiJGDVEg?8?X!Wv=AP%_Pg;6UT>irjJy*5C4kA5l3J0gaW>P@UE;sA*_o}=PI~BV; z$qp20l0~WyHj>M^c zwE!{;xfFOF9Tchk9Ey!Jos!G@gL@uu+OPHY8fz4OM(nBjw`VMaAI>;LC}!V3!OP9h zsQY>L`ChdB`ZtzdAGJU4qu-SNK7z~r{W183{|d#=AZoWN^*ewdF3ulPUGgXpO(^a( zosq}{wWmae;MeXtM=-AQpQ3v-z~a?$f<_2ry#*P}?HeJWSOM@MG{2X=iIrK#fL*sW z>0HnWa?5s%*Uq0~cBhlHppHxt)>?uEX7?e*A5or3|9uq6zR$&5fi6^eAz}6AzL_V1 z-JnQ|BJIv}pFmf|)flQPS!tf`DgA|eFjPnCf?tMXpcBt4&QawIzvPG}rwfbk^)5Tk zB**;`;@}e3(X2hm2xMIs^avdjADGFAv8@&qyFaRn63)4uRw|}}95+kx&#RW+NO6Nc z{L3q$_cj|*{=I|e!*-p)-GdY!KUdun55qY|u$LGFG$&+W=}sY$i^ zJnbd12+bY6H6{s#zRo)SnR<1-UJI++z5EWSF|*z4B6+gmS1U4JsOFBpwaiViY^m-j zKb?`xeEMMCQPRNJC8$)>@|)HD@k@DrQ)YI?LGOBZgIXdF8to}4Yq5L)h549)y(r0Q zC7Pscnqs09{cE<6GyZ|{tGoI_eHPkXtYX|7o7Yc-O100vU0sY%@gWOcmBPbopO>)8 zi+S)?-Mf#Y<8G>2sA68eaUgA6nt0yt4>R=1t{v|7H-0=$3F%*#X$iZrA+8^#-K9BOYgE^GJ9K=*qG0!`OiUx| z_stIMasH9tkw^8R<#Aw1XSlpEb}je<0p(w2uj=RIsq z(x6*Ir-qIQ%bvK;`E#&7H++%0bM&9_@+!o}`X#oxE!`*W3-4a&sM=v$rrit2KBLe| zHmkH$wm)C?XRSN+OxknH={Cf#hK*luZqIK?+mQAMo3K4>FC3)X#HNN#I?Hwxze(Fv zYz&+7^zL~0nQlvEBJ6cwb4Te>+Lqd0*qg}1j&cg!HjXxYI$pN3f-!wtTPl1e&70C$ z#ZSMZ-{kgySIo3;;K^^dv%11q!^s#Z!cL%&0nAGu-`nUUkc}f=e$pEW9!)>l*=g z`*3cA0PbqFMdtQCobBVJWEPuwM|jF-8jI8TKWf{!lc3d|!>>2r{oO?Q{lOhy@qd<@ zu%Grb#6@M0^NkPUG)MN?j;Y)XAWi_iuzbt-bQ&&Zw1NOLY0+P3O=j8#dM- zMz&oW{@=J0O^z~REV2_UfDDcPVaJFUUL;#DWE0 z`^G6C;&wx#79T}UZbbs<_*pRyqfkliZK9cY!u4%BH_in2x?M_fEL3Mh6A$`{dAKlF@^GQC3H~IOiBxajqiOlgeg($oTc+T2IrS*HiP(m zBNbdhQ_h*-hK-6CyBETg8r7EOSdj{mk6|GoArAN0R8q-3sQ?iIX}!1T7#(uXGM{{p z5E`Lr9kC&v*qfY=6v&|BPdNx_RiUvG$y~&9PVx5w)yd(%$1?xw8#d!prt;A?STtuA z%ohMSkAXG-&?kV79faXoG~gll$E^EM2{i0})^!XGcm~G4LXYgtqQ475Ab~70m~ymBp}FDC|%qfGkAei-cDTG)@YY ziqI$m$VnofroQk>Zw_vzi0g7r%H>2~1Y5QNb5VUUq~d`Or+chKo=9gN(!AJgwRpES zMWim%F`Jg_7<|V748g|pV|2jgAXY4MU@IIFLj%EqAp-C_)Aut-4+Bqtdi{bT0T^T& zlH6AMvADpLD<4%{B!Xmh=gQZ>mkIY43B{E4)zQS^n4fUv1)r2g`IWEs7C;<|M2ji8 zY>Q>6lQIat9Fm;}U>}N|lwZ7Gw7*EI{>cJSMbo-VpWH0X!WR|_6sBfZaJ5(bLsSY# zR!Y@|_uVH5oFO4-k85NU_yqL&GFpuYzO(|;Jr*4*rhP38NTkr@V*x8i8pt#lAXl=S zRKDQ?qK*--oq40TN?4exwN#-ht-ya6ntdfE1;Z+84Bp%dDZ`|uj8k)_IybO&36dc@T$K7;RlvB_pvJvUx2L{T zGWFP{QbWGRGQ7q(3=)ck7@?sCxU4Q;prRF$OMpUFL7~1#omOZI7A=1a`Hu)cyN?K5 zp(#3sast2;_nKH`<^oA{@dGrm0lh9+>+D|qrJ)i48q$B&?ZT>xZatFTtvm_$IeAde zhi)uWMIY?eWl7fONyZBMHQ!NXeqvUz%k5#P%CREZqGebug97xPKEA&67?Rxpre*#2 zs~Hv33V+yoYpE8T-Bx>d`1_S2{W?suC>>%WaChm7qS2(i*kB22~x3v_y%M2KCZvtmGdF?fUL62t*A1|alUUKid zsMjal*54D+MSj}%%%&-mr+-qle}w1pTUGRY_~S)M^aL#zziQ=%$H3NaLEyeK^9hWe z2#&&_xrlyXGPo6k4#$Etr@>eZ1tOx1PMM~$y3BO&d!YJ1rW;rwi`uD~;5qdeWQKs< zRuEVsP0|LF+%F`&gbV;sNgUW=8gy+1ecm|uCxRwZgqkYO5obra0|2b?mIN>P$3!!g z%MZeUFurh>{l`KTU?np!cm>Rug#?bD~Y89ic!#VsJFR$wLo2hxo7{w`s6nE1a(PvE82+4$?2Kd%mzPL7QKG zc_;E^MJ@80?TZ_p@m_yk`ZaZ!%?$DL4g=HRzwbcItwDtx_PDve2AZntNCjFNubCe+VNztdac^**V1g=miQ-HlqV%{!oJ^Kp*cw zAl=JHRuhOO^4I^+XTMoS`(Gx~jrvc%xNSQLOpm&Fwu`M!VAaq})V(wJ1r6QMe?~*N z)k#!8xqfUiReA#KHx*6C`qp+dVQXq-dFrzoTDX7kug8>g+7wo7^1bL-nCA$N4lqzd zfAEakUmgQzKVP5p_S}CtQ!-|D0_j6nOCo`fB(PR$396!`zA1Bbng-GaDw^(eJn4i8 z%p^&V3ZIM#qF>eGUg;WvrU)p1AW5F@RW2RGmjvO(0@c7vvsF;(pH~%hz%S2XfSR#4 zrp)y{p%KK*TRuafnDWP^(UZJAE&nm!q6cjM_ChLXt`ot01VzTF=SU_51e=XJnbWeH zyIMN<+t&a8VYj>(s0rVkzk2*NyZP%;^AINLd6QXEn!~()VS|dK-S0xku&0#1p70zb z$Sg$e%>$(OccK=|a{Z?MW2TcCR#OLGkwF)vy?S6fqId9$Bt2g3IbLU*)wn#~Vze|V z#nC(UHpliYKw2v9f7MK-t;&zrM2>e&jWnUC`6i`^&S_@g(O zR__>MkA-`PpikAAH0?mB)hZh?AaMmOSn+B9;L{yVW_28t4*6Vg=94CYY5M@Z`}Z^G z%8H`{oC^!mK28Dqu1Q<~ISoG&Bw8$~1Iq{3RcC2G9xtHqUzSVJ!6Ycs4~D??*BX2V zSFA+!z`!85G$sWCT1RGo`R@v|`Q>$;3+~shF!Qypn;fjO+4<=$g4qE;Vg&|ZVK89X zl<0MrKuexLfLEs~MBz!Kr!*2E$Om^lB&%L?+_?-|{dRe*ESj@-NptnkMT28nURyocM176$A4uqoCujtbt8dqHcdS__zH>W+!4G z=*H`vvj3y$Ox&T4{x*DOH5iP2XYBhfJB>A4vXz~&gi6^G3C%DvD8`yZ#u_R~l7z;Z z7P6q3FN0^k&e(Jua-q;VtmVk6WS$&U{$o`p#F zUteauH)_PIaFOISy)d@P>F>Q5bZ-%aA5%k#KbZ%JRDpYOm znf4~M6lM;7vS0sk?U49LWI4U<6U_JL->EU!5b`0G>5(c__|4jY(JVq4lVT57=}%|5 zKCL{sy2=8s<5rlmN?1jIa-8}JGhSx4o7MH*In@Yv9TwzX^dMboLvk# zzZt2F@q7IIb{gbt=w94EzB8w$uCwhEXZXiYzI0S$4;zF(-h|S*!>Crq*Q%({O(48Z z(4j&t3GfK}{K$F`PT(Lv-oGgd5Lk!~jlpgc@oaXV!Ul3e-w6^hZmQ4|R1K){pQ_A1 z&nURFG?W&W97uhhpZU8mRH{gnVWL}ApAasn40=Dz!LWyS*kCC10ZQ#49R^;`BBKD) zeLTtq3qF7Nd!K@<>+V*8{7FBaFBnN*+fk6?99@+C^rNro_o85`M{p-Pa zIYiH@Iz8|fZf;utk`$^)j*U4}H_ZZjdQ(UI>L#r-2C_8O{ZVE1zM|KeRuuMYFD*xO zIJx@Hw#f{`aWsuC(&5lm4L0pv*Ht<}emOY`iF!Mjcl0&{(k#rUzp?@;h1^sw)>(Ly zEH$KJJ9H8IpbAE#KE^@Biw)V7mO%XpeF6(02I7KS-9oXutY$06yVvY(B|BtcK>AK_ zLyb5R`BqGwDX4Z?8g%nf8OY)WOZSPIeDr~ThRqMUa>aQQo7(c_!Q)qf55o<|J>NNW z2(PB0HHR$kvX}8COAP2N;Q9K{jP{taCStaMdReOd$lLnItcCtWow~`azMnVYIK7pJ zU6q|+uU8frG@iqnFw8R&OgRzM>T;y@TZbcSwzM7VGh!=GPrLf(MV)cK@ND;tXXIFv zi}$tNT^D>3_Z3&a^kaLj0Xe6yxCP#g+WX`IL(Ps6E4(a02t#cE5CIf|Iz+l4l&UYU z`Wz~a+*(AOn2tetK$^aZ0f>Mx-8C#*u;c+jazsa>9Nj8E|r9yi}bbxdA{4dl-znMvck zP+WaY>Co2Y-&AD+pR7k}146g#5{pFvxbSspmd4R+NY(~a{_|LgJvhNPh5h9mmDkZX zM6BlH7l#WB%^8XpGkZmkof}vK`Z_pOTR-P4v`ZDCk7I_f{?qb1saBb&Xv zsE2ggIJnX=??J#>1+U-MuDy==PbwqBuxiw6e5!c7I~Q|u zY|aBj9jad*T*%Izz~w4*DMuVmK=kg?nFt_)8M2~#vWA+g++FT2Ob}W5&$Mn^%;VUU zsiXCKqUTfg6V~S#u6%a-Ld>m_GF&!oKmVa#1kM?+Yh}(DOGz4#eGrTwxId70=6pX^ z6(wxt#?atG#%aYvyvTl`dgFDSxlC-~OE_$-OWewK{no)Mj&)@`iFW#Wyin?q_Amiy z*qx6+fkDJ#?wm`o&6w0qA{?mTz!4PTP;KK0og6^#N4&%q}+Uh^|B(sy3a5>72ILY z+HkjNoz9wMzb7-Ka$Tm9Is}bqNn99pIGN|X9x+@4Bi1?#zo76PTs8~?q4p^PmNo+1 zH7TAesJnkgtN-!!nK!M}+t=7A2D!cSSd6&cc6e4b#qGVn^tRH~qjMZS37kd7>}m1O zI1H}=l@Y3Af`s03NRL<_%3|%sDdQV$sknq|RYZNdPu@gO4@z!dDirM$riU*F8Rj&= zKcOYt&_5^`N;9@;%s7Uq-D*rQj<1RY4+{dD2&s|xX0^H-X{Gb6mHQGcbyG}HglKgx3z(wHQ(<|yaA-ODOMvsbP( zZRWGEdzN@5c>em+CGq2O+T#>@m#@=UdJbc6Im?b@N=j!)q$RnELEEW>($jfF8C8SC zbV?LlUMv7{G7+5V>l|h~{xeI_W$;+A31dSu`zN+;C}yB;65cWT0yaCw@agZ(Y1Pd{ z&b9%I>vSr`U@Xz;%V&mgqn+37hYf5;6@O^P|8|%m9Y{K{118pbpKU%JLi>m7Ic~X` zQj(%X5q;kB{cmiBO8lB++bE2`u`cN3-|t_I4!`J~T-DpYpcSzFG8jf!|N6@H%du}y z8_UyiiymZTZWHAFF*no34H#il@Kv`5TgN*cfv(gH7$KASg^+)3w*HIUyS2%D#-pa0 z?C%XTwsk1}4OxO@p2-$wSI+zky3VFAodoLC^-UygO{6?cq(e+(;!I?3cDfbjBfzoH zr}?&Fi4Y0_f=x`~L(++nnlS_svh>L%IAaWf{z2a%Kw`SI8w<1tO_X;!iGTwU z@Dttj79pd(V}IRrFqI?G2e^p~$}ujI*d&HGA)>i_jyd zA35_nD|W*etr~xu@*DTXn!Snie3KBFd)qUOS|q30*o{^@krzTJFhE5eS^$ciRBpralA%H7FoI;?J7#~2v`>)5tCEpR75rP6_7R-s$ z1s%IOM58_e1Ot1dXthIWQQw*IG$U9U@1u_qaC``R

3CuG3swQO2gw>fAu%IJPGsM+5iXByE+@R}r|EKBZ?PUsf^h(7)3PIz5mTQ2mH zodWSg6W@i{PL0}zOP(+&>Rn=g{h$TsVPI!a*q=mr%UErW6j?IRKb?Qt zE7L5GJ6bLojnniU8ucn2_2M3KJqPRuwa7YS$ziap0&Xt^^M^0oR_ok;EMro|+}^_E zb3NR6?lX0oCX!D^cVkAh3&wV-BQEBdj&0eexnZJ~V=0^CDEp5on2-E&AN^8KqaV3k zYjcU~cZr{JNmzH;p}JgWnNWkdYM+J?4P8lpT`smsC648xD9N^i;1nv6)So9^59}UI zc%GktU3Chco49n$RR!jDOUW(A&@K0*Tb`GjoTOX+QM{Y0*M#db-OuWFH`)I7$;zTi zZaPg=O^Aef=~g;cSsafl{OfwB_*3C}Lz%Gq{do6kdLpj)GwEXDvkLcz+&mBZ-RqtW zKKj=1c-{R;@?bsp(}uRer@|i3ygZud4Z?Vj=35>wialB$dC*6dt^FQtQy%T>9ggrZzJi81%yH9%dczO0-^n4xf*>}tHO|j?ON1pH6Jm2?w_D^{Ztb2a=>p95c zH6-jctmHLfNPi|?V_sh47rj2ldrjP$YOjQARy&XfNj^GI8y)AJYPeNB!dy@R*<7!U zB1#MjBQ3qZwe`F5O()q;fAh)=aR7LGsL#b|>Jhgiz`%tqiA}m3Yf;X~=Kf?^h?M;c z1$G3o6t(nsXs6oSr_y`Xi*4zo_g3D_YSi?5!I`&jr>0J0CdZ~scfDrY@)J5{C|f?$ z!i)mJGyJ7fZVpfR`IB~y*}f!mD_kaU4MOZ#hW~t<*)sI0BhB1#oJ|?Tv)*Ip@^=2Q z>rHl@Bihf%u{_Hd_CY+I%dz)4b8c?q5f4%aiXo_k5Pe;L;~^5WvnTP8>7tpFeqetN z>utdxf|3}Q7o?A3#O4JDyvc-F30=q<2dmjEVViV=ZGeKTo{2cr1G11vsQ=Qp`Q*)c z*c_Z*bGLRy3EwbL0KOs`-c25vMn}>!^o-KiVs_c~db0$SDeHo(z(O)^KE-u`pSX}b zIKRF=En>lDJ%Gj`Gfve795+IV_s;K9zv4^r0mf(X4&OZe&VIUe*6rTeiLpU`BeLjH zqEQ$WC3|ZZOJrVx;RpZ|L)PIVE#7{AA>Z+W6+t-$%2hz{E6nomMQiLQYIBv@?^^9F0hy~Pr9N;@t0;MYF>G3w zz!S97w-`LVn8ddfp732JD@gL~H?JROu@@c4i)Ve1fxgm#0gl0-IylukGycc-kXy6N zB8=;Lso8x)CZr0ebrkrG)i7zy(DG zeoy9Gxov^wE12UCTslcwxi;{fUu`AoQV=L0vQI$h+;OXFp2{2CcPxT$iY)p~FB{=C zeUOBP@ui2;D|P?Q1JrWx-uEX}=Njd{zpPu%Lanx5dJ|)iosUXN{(p4rMp{y^2oXYA zWSdQ5p6v{_NH!q=PXyqjYX=sB&MiWBNMr*ngqen|mCo0#C#v=5je4)=kiTEOk#+V` z;6GQkiCz`SI~RkDFpn0`KNcZRXI%IcxHy%OH(r(Z^$g`pQw}``_CUCy);_{W?Sk~1x){EY{%U4gjdpd-AoOgH62>pF8v`2~Y zstKE-*9%QT(k>NB4TdqRQnLR*7=x|QF$7l(;o98B#ZDds{Z8vF6w0uc6ceV?;1x2L zgd?CBRW`F|)l#lCr?Fay<*@f;g1@X-tP%O{4eq!bD5cp4S%YD)@vw|}PLvNy;5v#^ z6vgH8Gr2DmJrRnHM~TTq9EqR+?Ny5=BEU4yWvRk zXJH@o++5NnoaV6&Ue)_pwNnwmbt|11fsDRvc^oWhTsBJ&S9rdeG#i?Ck%<>TbR^ zgEHecbFh2dDJZ({B*0}atA2+_+cAE;XBy1~PuUB|?*8kbP3&ae zK-z0)>CthwQW^zmN&NUktYzZ!ljPEW2U@Wq{28bC z$TPoCMq$aqOMg-?4OPA7De*C1+&GvYiv1~bw5u9>ZZ4sK6`cNn0JMZl=s%?@*L@tX z5eQ-cR|%1Xqw3YE2m)Y*#R(9SXX%h6ZuLeorJLXhX$&^g!QlElR4t)>3-GsOsH{(+ z*&CQS3!8=g-qjtBO6z>(Xefe;Hy)&>{SoR)=IBW;1M>F3I_SeYfm+K1K1#|0@`PPF z>))1bn z?R}xPL+}2R8}yk-v&sgKP2qgVO`KPdH!C*C-q*#SZC_GAFXR(wNy!-Czi)S6O(Uh> z0RB2r*irh=E&b=p1b2kVdcn>Y*uCCN;!!LjCO7fGbiIOMx@#hs1&AHN5I{C_PY7D!U-_o8hD9_N}nkdga4&|?) zm~yyPWStPdQ;}_>{;4A8R9dn<6EoRt*pw}cG$_bI9b~Y=RpU(fgl*Zul@jdb9zb#B zN)v!KnhmS+S731fS`X4Kp=PQ_G$ywe#vq79>ge|p7r)dpR+~d=6020>??4-gWi=v3 ziH3#w$WMS8X10LD;4&y&AjtCWEjUd=-4zPuhG_y&;FoyTB+OKNNVbTmGA*_w0y67cNPoN z^j<1jt;Wh-DDbx@xb_PrD-UB>*3l*?E(s5KKp`l%NP{< z__-JB!jbxWb+!e{t0wvNvG*X%JrR@ynmCTC=Ts;>ZiilbFamD>;cQAQgI|8}eX-@j z<5vl%qk!wH1&X*=42(9;39(m$xjSXMZM`i7I`Ub%im8N$F) zdReAqBzr*`RJG?u&gA>m){LvXeypMHI=0$CU zNUOBp6L1TB!P4Z!m|h>&B~wEm#8>q}6u^7^4OJn%FjXLzk@l^lhyS{9_DtpWv-n># ztANHMP7^(n*S9($V|_JEy4Yzihx95qX9G?Ev!dXTfq+9}nf)9}e$ljBUfp2@0|iI_ zbukf$YZ7k`<{4i7E)CF4kzibalAj;mIuTm^Rluqi30lrt5a8W2XkTLI?X`uK@`m}^D40>eAL8k=2%|fIuJW>y; zVtoh^qt_#O!65Psxr|$a(y5q7k-9bLs0lHxlwdcp@i@-KsZaHnxrB<__$CZAQ83qHrc!EmRR?xY6 zgf*XWwo#8YYYHvxe2fgF1W_r@&V5&Aik2>MILjQ_%x~)TW`L+Va%UVyFyh|lh%Vf& zX5_}53@scf&S0@Q*;8W|&uHtL9Z-9!|FjmOzW1F6y3QEhet*6=o_|KOW#wHZc!mJ07~q$`__1Z@&;l z$XRKsIReXH72{6J=RBE4ig$JtqzBMxxAi^6k8X_iNZwM5ins7zdyj;vL|JDL8^7XA zbl*DOQ_p)4@=d{C_nrH+`fbQ>N~xrEK1ed<^!^ETN1K8|Ss2|Ng#ZN|;`DkT>;5b} zca5sJ1t%10h2J!8orA~+F9<4PnH0Y9ixrJp(le*o|4~EzRj<}%=OCCdzYT-Y=wLen zT(>BI_fj=X*3Or#paUPy77?t<(#4#G5|FSMgb5WW9DDkyA4ZO>m52xTqp<7}kZ$2C z5n%P)kK%RbJsamKl`PGcVyNZ)N{>g60>(9L0<<)gEVEHCorw2mjkZ;R>UTZ;Ip$|n z&5ow{z}$rvrkCxX9tcvZ&rdTQy??^BUHC;YRHJbg0_sVkAdDai$D*)PasbduNLQSY zr4D^GIJ@XJ*LdIfqEzu0Yp)x~i5KhW**hLJ>&xESCQZ{(v7%psqR(rNSPi$39}DXT z9PL<Jhs$}aCtud;@-cXeAC~L ziyj+?ea~Ipz6w6wHrlD&INVPcvfdOXX?i>C+^vHYt#^3;h#%@aCUg@r19WJDOQP1U zLcQzVkbfSR&fY-&C|sSI?qJV?)#WnKE6Zk{i0p1ewk;$UU&Qz(C+ZV=7|-%~mSrB# zx-!eUg=d=|x~+sO=sDejH8b8M0Lc!H1!Jzk48{N}32cXA96*q9!nQPFl8I~pklvxc z4K&EjZaBgCNMgAI6%4Fg=T?Hnc%ioZ=W(@kPFdfa10#6Gh!Y5$<2f@8CXEsMz6d%J z8ApI(yHzhkFgj*JZ%ap9#dzv`ReU{YxFonZiG9+YPEwUc6F8;Igg8L`6wR^~C*S-L zs2ZE1Nez{0@?|7(4#3`0+W1LK#HdW6Lx5dC40IbakObM8aLP=8%UX=P!NYz*Tv~lj zdf4NPYDe1}M?m=0ho-v(%cTnmt3)8sgX54ClFK&ZphE0%p3-Q*7LdxR%J)Vy*{RQ2 zM!C#1fX-RG$vJ6vOupQryA0ThGeHSb^f@2WTzH(Lbj`|`VrGy5H_Rp}e6~IUSV@z? zax90qmC(Gg77vgOU?9!oZu%+2iVJxA@<0KvmY+yNsj|17`^5@yIl#d(K)GNM(O0qMXeQ)jjIbnSNeQ9d1aRZL@!nT{CSVR zqBAIQQE~7TQ@ofpxpZ6C{9JbTxdd~k&lR@A3l~=UE1oQ-Q+s>rIhPt!}YcX^c>4Mq{}(;y#otmw5q)fx=>U_xApoGAALnPzXKeHsq;AHouWWV4W=a+6oETxm-V!GJ{mCRP%onWcshZ?Y= zVz28BV`$c_)y6k#jghT1K36mLMyN@B2hcQ;@HN@#zjt#W_*Q#&=8Z3H4uux9>YKyW zx6aG7U3EO5z}c&DYNtoCdxLX6`!$_2K~f-As*t0H)ao>OiR>#ZkehVATu1*74diy( zRE*e7_?j~kvflbtGJ<^8np+lr$04}X708&qu}aHuNnvnlOZ5j@Q3-UVU`v`*n|*g) zFgtO{MW+@PB2EyfibX=0oQ15pWJzu$g!8nZEkP;^o;1uBW0gCBq6rw7(Ci7~R9O?e zeERq@mTY!AK@N~=K2!s4F2vJhc&f;XfGbJTt7sOWAByCQn=M<~%US6>Xjo(_WF-~$ za#$~&%ekVE#UyWknWm6UYT_}^b$`=%rC&UN#hO<8P(D%HmY@Oe(WnvzV7Z^#XYa;H z&5(VH^X3Y`g z8u;NU;u$DnHIc{(I?%0VF0EuzJ4w*?^RqJ23uJQDrLX_t_fbe1nv4Fm_e-mSFZ0XF z;zAs9>3Kz($|P-AUFp2AjMc2H)mpGbtC`~Dw~;c^*blQ&C~Y)weXQ=n%dK%*JN#p; zk`*=aZ)(qw(OPSoxmW;hoD~d9D~)I=jf*h9VtP1{aM8i?b@zaLoRu7?UM)#npT2Za z!BQy`O8BIHX$G475BzAz2x#{Xaqv7}RrbA#BkO)0l_h!QEELpalWNLp_3q6~X3Je) zafLw57w_HoM=tSRRX*A#{us=LFI!C3RGm*^y1!y1zp8g<^-AzhfsLQypnwgqJGrD<;``X$WMn^Ig_#-0?i0!u8fqP)dOcrNv$Wpq_vy+6bL6$h zi*M_W04|Uog})@02*;V8WrcS`XmZXS+@Af2BHxXO`^UuIjv3%MQ8e}doMiY3PF#t>91qTM{s2qccll|UkwVw2qI1+n%Uj=DI}3s7LZ>jW8$ni&9+3YZPKZ? zsLU|eWd-FSu_ZorE9_P$p&s=Z4M}+m`G91_7(>l)$}$!*-_>LfR9L8UlDs*Ox;N}d zk2$o%cLl=PewFWAfZwbnrLPUjIrWS_Px5Z|{)L*aa%or}MyR@|OWJJN9eSk)Alc9a zZfdt=9G9#mO=96BpOB(es}yiGhVMfW3+mQ4$Im@l6JLl>R>*Z~Uen_waP#FIDe$r= z@+SA!%KR^1krvvUX6o@?lx(roD+A&*0BY056<7pWupAGAzf1cA#U1>BL-|j`Za4mY zvSU-Rak5&|x?9uQG7=|aVdu1MHKHljN>V}N!!rDEuHHr(j!}Eo@<^uLA&(+vNi14si(Wvkx|Q^H(io; zWt^O}IjO;B;k>WwK5z{2!EpQ~Pb@@b1-Fx#X+PtCbbB9!Ur$5$Uwh(nogL4-cg>{0 zPhgK(N^3<~3uCEP@z2s&eA-aZI7-NB zQw9}42q`CE4;9oA^!*r4zyQZ~6OLRXF0QG-Jh~Hu2ikA-m;IS9J7*$eNrTzaU=>SD zwjFSL8hp|YdcW8*jKlx)ICB=9#Tl|-MckddatQ{mH`vxu34)joluiwzdk?Guk7`w6 zj#U@g=*v&TqAoDUe#!UlXbR!%u-OFcmy^)0IMxah=Z^M8HhAbk6Be^jpZ;< zDL5%{{oUU6P$J1jegP)tzFb{t;?BoDkfQ`;YgxmFF05S#3W^F{BB=2+fnF`*)iEn|qBJWzRT5Ep?JTnv1?ZPe|`6Oo`5`tGXza&6)8# zyX!a3Gx|zs^x(X8ZN8#a*giPiOAd;8tQR=x*OGEUrc6O1?I0R%sdD*w*sASs8-tcB zk(_A3&b>-=a5haIPobLdyLk4V{FAMQghCMi)@Vea-K5JukfxY zn^y;*`vB5&%o_7NTw>-VJsPh+2Pf;T?&%-3m6L>R37-=XFWEqS#leGjZ&7_9Ifd4e zdC+yer)_ntGANezg=ZCd=$F>wtrUCb=~guF9~)rM!EEsA!^lk^WUH_t);)m6coHW6pYOmHgE~pme!@E2rLV-Ykp^)M>jJsl3k7mQkY5DD`*v z-IEW;!5~{|@Z-ISocK?7|9&cu|NM~}Tp||FR|4B~YG#DWx)Rej;3jxta{7%sg*C3| zQnB^!N!Yec5#SPfIg`Hhw!Q<$EHlaL_@Ld4wNX=(m?-nOZ|3pM0ta>B^czSW!k1Sh zcA#V37(YAGHg$aR`v!@RW@xX8`vyZC&7^CsZs)kdi2|0B3m-;pG>uvN0&hyTbK@X0 z!~fD06CB9xckch=L6>fBue(%lZ}a|}D<^Hkk{34O=dYV@ZNT?}EP(Cx^R7oWsP@bL zM)vRHr(Ti1YrI;1aAZgRwCd5m^}+J@M)&?Z@`S!Qml9E~P?UmN$3v_<#{FPp&Kc<(QmN!3I%k}ur&6=?g z_h%PAHANlpT=IMoxjg>t8gJ;4ciXk!d%Fj`Vfc<>sd0I(%yHGCuTtYe`@M*l(Jk}l5l8>juD!R*9C&{F zl1N;@FVx6J-KpEg+>Gatc?CzJwACMi=L|cMTs5>MRy3spDIACCL`fAmFjdHw@w~bz@E%JbA(K!0D$ck3$@LFW=dstX_eOt?aLbq9(Imi^LzY_hFNT zvirnu8F0Lj%=65CBV8QF@m99-s3`lb{G(QmcZ$y@v)?JV9df)^?Geg(uikIK*{?a~ znbWT|6~{TC^Q|anKySU3^Mk?eWX=bpzlWTIID~NSpa~22Ee=fs4zm<4p+U04iDR)6 zBnbgr9}}{!&oYwK6+jd&vSN<7DkPd3WW2{ATxm2IPqZ*j~IjFpz(8}eVa2CpQ3aH z8`>dk>Fjv2Sa!&i`PRpBPCm;en3)cN5d>EWa}$tN2m(?RB|qm4*3N2qq%I*Yj=P7R zKJ(>*V7~19rB^JxgrJK@!!GjomP;vkCy&=H!4(cO=d$L;q6l$5cP* zV9$FBQrhMDM~}wmzl+qpA(~-MJD2Mg=~f}g$hXlxiA6Wu&!?IF18G@-XR4k6^< zmC-dK$4uK=D)OkP3z=}iZzld(r9pifq!UZ#V!StamNfI#H4YA&m}1xugD|2tq1Cc* zcmopViwc0HeG%qWZ)o4UgGdngDL4z4!F+jShaI{wy)D^bJis0hHz85{#r6a{=N0=% zA=31g#ZqT~M;P|@yGf?iD=k^AVOY^_VPK}ymI|_B$DPF3JY=)PvoYXHQW36VqD^8t z4BPv)c!O+dDxn@^%p^ucm_?R2y3$yVPjtbM*{}ZYp27y%eigVVYf2RAWE3@?Hye1} z{19uNK;&A$GG4uRphyHzw;q6&W;c`1&f@H#!RV$mNmsxM$TYRGF#1YzN`fjx=0TQH zj;zjXW#5rRt*dvEL@n_tch@9YYp@7nV+XVg&?F%BeHIoK`Og~(+Mqs}h{v+jdP;o* zID`=@ry$S)ryPB!&)dQ=m+6kQDJvF9+$_#LlZ>AnO1Kq8uSik|fq^d?+3yE|J(*ipE^- zwnXlHNchuTE|66zlf(!-Eh39%(D%(O(z>qJJ}smiR+_k5Qwo_RD}n5HvrBpym(B=m z>&{v0Soh(a`P?FfvvM+qza0UWRMp2KIg^MMCs5Q-e5d=oJiSXU#BmgG7gX0e-sbF` zo_vk`z}5E`;1Wqp0i{r@Roq0&s2eLhQ*^n;%<|1p9FnV^$i0SVE(e(?Q|>Tfnhd-X z#x+WVS@5C!xZh2P&Eg^E6lhNsjj6}|GWK5U8uVWMC*oxSTipavX8t~Av^M|Q;!7D5 zy#qI*Ss4mWfosTQGs@t6;reJLw1$HN(bX3y0dN+wN$jz%;OIqwh&&t0DKx>ac}(eB z8MFI}WA~F&vS9bSOWBg{e)NK{0T#Y6>`7KM^*<9esk^IiAYbu# zf;ftlRs+xwJj^jtF+fUz!gq*gfzyhys1Q8-d0PFEx%$HsTtg}Tvwm3F7^0aFlS3+N z1u}IkR7CUb5QKN1#&~JX|Me<;s_Kg6x}lc%R4a?~%CF`(#gF6U=B>aXuh{qaOBOc` zJk^F>BrNun!jc~Z^o}o(dUoq5>>M+)U6?mkXVhYk&7TDeA7Aj8KfRoOI7V!J{>~ox z^+erln$a4L`B553%%fn;20NGwVxUO))^{A+=U#nUQoo4MoLE&r7uVG;U_!yL%LEMP ziKNPG3$Tlh=3!6%(=>tJyoW9k7^^w6>n?thoqK|ITsa13x1$OXYXnGj>evH+!wUcy zBP6kOMuI8@9b=7EBp{5Dz#N}5%h_#ov<@E}Ow?H`&E{AJ&mP^n2!e@BvP(1wDq@W& zD+n?vL@68&F>Ni$MbANmvCmtn!)BRa1UQIc0dA(;J~jit+E0xEt{q?OO5pRCf?*rP zQx)US2aY{Lau6X8aoE5Aer-0#uZOrC&NDig@%E}yvN)Zf*ybb&JWefA=GrI3@n)Q3 z`&NFY`sCNWJ~d4!gK!v~IX7s$Af9o-3r6GT)Ul9o#KMXDLQ5u@leO1J&!-*YdHX7Z zw4Lce6>-Tjcn82{4kZ&q@a53)?;nzs8Oy$WUb<`jXZY^F%S}0*>pff@)4$u9NN56o z9(P|Cdqjlv*ZM_8m;BzN`1qJ)O*ia~=tJDRVd$K?$n4!8)UI8nEoHN({V=P;ehtwPl<@}ypEYWJ|pzN#*9;I5W(L$%S=Cc!t^E(aE?Tx+`cdUpD+=3 zGc)cRjEdou1&j&yNyPWX%XW|7tV@`{q0X$p(}n!2gYCdhK@tN4>A1q8gnEL<`zRQ(l~emzX?CG6G_8k_Z}a)zdI{#1w#_hZwb)FS!N31)1)Fqum(0h zyX;CxY-E8!0ITL;g{v`_yDvP1ai4DxB4!W$Kovbmkg3^A7om)a&=yuesDr{g z!QV{rOGozD%l23k5Eer4cO68iAW)HE;EKICx&r~HGykA0_XyZnijT4?Ogju)i}6v! z9iZl6v`zRFfj488p&id^R}T?Yg{IV_qWmHK7?!ckd@~CCB;}Zqcm)#5REYuqXiVH? zY#W&;wp7IGu&@LOxQFF1sNWVZ>!$ta{v!?3s^m17T>~kc$F1Y{G1NmtRHc5&dmV2{nWNA*z9zM-riR9QY^K>eTumJMJ-(Os%LaB*aieRD+CQQV-60VB^{ zj95ZAuYNVpDuy@G0m^DGQIy5vqzdJ&XF0w3j;oXTZaB|(TZ!0G!STmW$VY5qsyHYu zQ&`~yD{Ds+G#ta$C1FW`A_Y>S!;*{*RkDOT{@#T4kSkOJEP7CcFnT zbZlXUFJ^ic5>_v9%U1ea1PFUhQf<@?MBcD2gn-75`V4yEf?NlB>lRD8LDO0BSL0#$NFzoIuw>NnFNT+Yf7H`S1JE<`onSez+WFCmgZ>uwe0xhbDawHx<~bQ`L>l%)8uW1DcAYd@IgL1X zbP<;gGX3;k<>)(71#cJwR|o|O(4*UO!f$aB)*5}XU=Mr(co@BYv z`ISi3_@`lskvi!)SU+cdU1vqZqh*!v>bgpt8sDDkz2>;F#loQHh%w1gG96Zu8!)=1 zsZp7$p4@o+`$$eJhhlQN+DwEod!u2zGjt88E~_g%%C$`2A#Ghe=HY~G$vyL)^JHkY zJd7%HA`-L4#qerW_pTz4bkhHxduqhl`=oG}_AbJseEdV9`omC#^u0Y=oW8H2?=@xT?Y&_!@ zmI>zz)ZsvK7Gy*~tBy8he90bd+@5mASiMHzL>H|Nc z#hmY{)8r>-kEMeq%c9(WA5+-H!&TA#2&x+qAG3BEZ0^dP<>{hCbz2X(Cyh^#W@U>3 z!<#WrQJw$>T!02GSfAsZoRbd&!H3P+#A-~9%lSll&Dr~T?ubr^D!?G|zayS9pmUEi zM%kC<7|3ZHpVKmWvVD>HwDY=_GlOR6r#*vT`D!tZp+C=rNsZz{ckNkD>wVpmmH{=u{aU0h^62^Tj{CmEHSffKpBxZP)=MoWvq>9STVq%>p_8G(g0Al7vn&ACl4FleV;jy(Hn?`%(gNWa#JcwQYR$km)^p6c;F`*D9F53p9Y zzJ)%Yc?NNQFYuF=*ZtAHR$}m{CUrZMFL%DL@VI;4G5_$Ui(m53g!f(b?Ymaa8}Zx) zTkCTEWnCZ)=ijE0V3Xk~_|@}(n{b~J52Kxm&&U4ZjX1{Z!1n7BbF(uHAN@s(RS)YZ z6D90Jb38VomX^*S(8X9p3B2(un0xz0y^2WMyWgWS(RInT04&qia)$PDx3BRO9otS6!jWtYN&q_TUmr}bP( zOL<)gX!OgsoOYd?>}3o{Dp&PH+LL`2b-L0ukr90b8-Zh4ab;n$zVYeQ*%U%Vp({3H zLSmoq(9aj_U}LBFGF~`Rq&fw2UBy*>n-1yRh!?Ov*P9H`Z1yr3kJ$E&lpIDsmLKnu z^|?WkIIFLT=(rVld~c;F2!cA%M)#DL4#R zcCdmw1cZAS>4UyY@w(u)~7b0Hwl=ISjcH>|usvD($9@fSIH{sjysh-$33DDT5#l2%?1#<%(<2A!6WueBxO8Ghh+NJ2n5QX?OS3$3fGa z7}T*$M(64v)Vhrp%wahs8&`=CfB3rPAq0!^rU|wZ!Gfz;@FvUPk^7@h?%12Nj^b2g zVn06kjL&z0B!p*5%pa+`^{)M44N1T35W6W#+yBmG7>DBB@HsxB5Q{dxl_{y_Un z^Fm?WdP@_-Y*SAPiepwv9Ctnp-<&Qe9`L9(6AR;8`PeN0`UHT*%f?eLMehiLqL*2J z^zh)CxM3&s9|7xkt%*gN?dF@A_Dk5_Yc(e;YOdnJ;8_kd061f)2(h3OpO5h4$W(yF z5ux6GSgs-VM_1X?^r0cr;)N}3Z?0kAf2kevX!9bpAv)VM=AVqjKGN=argAqn`#`Fp z_is0%LEjVGcz{AuFGSpZYHWkGK6JM8Y$(6otBrV(dUUOu!K62+sOv%;wsW}W(|caz zY@O74FJ!h$&7(PLviYj#-x%pPrwy_PY@hlFy?rA7I?toN@@`A{-Fo)2*V+aRasy2c zmfa;qLK;v3>DeL|Y6l=x`W6l_%yZS^ojhlus)}t+hn-J!CGfN5j(Cv3_G(uU?0aD0 zURc!MUy_OM9S$+=xDJJ&_c;c=<#E{7gU7JD`7?t5AuS{=7@fg0NfV&bfZTpHb*BMl&K;w8Gd}(46~=P?BU^CI^x+=EM)2@ zwK%{U%rJld8P0V1Up=PmSB&g|CYv`;!jD;PmaV-#XtDW zKtN3wd}$M&RFRryz)i^|j(G`>hw{VZv!+f>P0gJCR5|sDSwt-M#6%DGysnyQt1m_p zJ63G?<+&GU5p{Y)*iFUg>z9|)kN;*GnZQLrn7rJqkKy?Bi|_yfR1r6V6#wRuFsfh% z!LT+x3dOPlXsjPMnJO@X^Za|z8IGG^0J@M_9uxM&eD9vo?~i5Y7a0iOJf^;FAW(kZ z$Y2q%x&$%K#7T$@)4|^vgx@^m`_i@6wG_hzwFGED^VEf6>}107iJ$A`Ve8RtuOavi zc5%hke^cvtD65`0RCN8L*ZS?F_Vr_4Sm@0BH=|6(qaR|gHZl{w8isH82yMYiexpTz z`pjOfw|EQz)iSrL55-8%5sd+?|}Y;n3k( z4y4~wy0>S_b!ghrzKr-LoA2_r`a1^b&i~MK)_+X}d>cMv8#!>Kw19wgcMcdGf^CVxObb~ZVODTfv<$0g?{S)>%`{A7Xd*9auT07y+*&^1?2$S9I zcy!zST7k&+NxDow&;7a!eLKv=7$MIzFU!aT(6KOaVCR7lxg|>-kKtj2l$qSs00XTN z2vNC)$5xEbVRoMi6^j$-h|hPyfebYQI-)Y82}Z)Vu%}`wjeN=!No=}Ul~^pK3S8n8 z&L0Po3e_VC5yCpg+MQV0Y|NbO`6?eU9Ogr{U#Grk=c{F@)j2==teuYxu({lS z`bD0AMA%v1W-f*MVJ!2@`h&$t_hYdch;zPv1|zXV(({yx*H1e_Zm#<`mnvdjcVI98HrpBsLgBdPsrk`!EexA=U@aUzxwGa& zs^qvH`BlF$D+(+Y>k)K;1w3XPmll2Uowo{Dkziy|R`Tg8Zvy5Wj`DmMZ zZ3lo(BX-iAu+T-H;CWx|Gu$WfzNC4NHQBqqESh%soCgZrjSKVcvCpkx92(E{ZvUB; z7p}zdvmkj9_p5xoy|Y8%jk#J3Dl{oVY z>(kB4s;~ABD$wmuP=NBk1-6P#?*`|R0alu=Z_tVBlFy?QrKP1K7B^0H99{>msMf$B z>RR$QE~WK9ib{{04;TAD&-&`c-C8iKZA)(TP4saG_2-krd2Q3~CF~tRM47v#(Pt1o zwK9^-qE0MXSLb$;bDE=`yV-`*wudJzyuC!Gb^I!^__3T_lj(oGoE|$Io(=Q$OPRDj z93HXg`b%NP*}J#6yiqF|-g@4Nv^gXjBXL>u?C1QPDKxe7SHq$eFMQ;Drcjvf*W^Np zS>5z~o_jTqs?+cuV*j9-xiG)Kd{yG%jAFo(Iwa z13pvIt3T#REWDPyK68la$4g4RZ1Vg}{c^5Uzx>Z`PP7cmLpXw=6DWKrr;P{kUHrU2K(LCE!J+-E7df{eEkkdo5pPmW$rb`k)s-(^^_g!^cSIj(+J}Iktm9w7Hmd z2CYoT__x*#nPGynl#Gj8f4jCrxrSg%=DW^2?MH-_D4Y?RUJ^0B9c$h#B3QN&6`{`^ zcXHTNU@gRSz5_NJAF6u5F{c&4PILURj!#OE#Nkg5o0gZJe3|vv%EsQGFTG|pU^bo; zAK5u?;^M1nHmPs^^bZ{ICw&vPCBPFGQs$}ldmnFs=KCb})Sx=~3#^$*(fbiLfQ#53I zr`fy^OgWf>{e{|QQG6hZ(M;^6|gaT;*S52Z9GHjp4yleh2QpBz%%)_1$k^QYDvUH6Lk^==4ym6%OK#d!BQfH zl_;8!%4i(22r`m@Fdn5fSeR|_Cf(CFRPB5yP)rU(v}c!&!RlGs7bF2yBWi2{$cQks z`=RoyNjIXLBt|`RL+y=dW7^n7QBCn$ffIrp*Avgc2!#V7zCS&zk$v+qXH+x9pKb%= zV5GDWSPlq~YwIyt4tN&?dh(}n+ropgYDF~|7pb^LPeXH>%V5QTi-(;94hu$o3c(3h zWAcn=Yoy%~z`@_7^YBS_w1U?*-RLb7k&O!Wp0f?M=yn}n+()k$1hGhBT!uGI;QM03 zDHdxs3KRwd;SkJ+l2vLa$(FSfi3NxN)~Df5);h)I#n3FVl@W$yJrDBOaPcDEMG|UQ z1CV(%cI@bXj||$lzvd7CT&U;o{9H(tBpS!?5KS8O^X_-|bNEcn>Lu(An(&kl%nD(| zBLe{qX+bT@@WF=r$t)aP9Mq}|Z&wD;PlC^ILZG0aYULp4Iym$T35G)(QZ){$Lg8}A z1xtDcLv;wCaC}KVybBzFROL0!K=7C$eA6&w_nuJN@TxvK2o|7GK8_=q15MxYdz1qy zU?pdE3={eT-f{?G_kzmaql&SC;4kpWQ!vXO?LE1x9|5mIz-H`Ue>3zauR=kMUYCkS z{q28!hjYJ-1TB7n5DRqky8fMM1u$`L1EhPN)!OijfPl-zWNiP!xj+~ z5L&kzwyGS8H4yH=hP#&*zWneFHzm1eBgk6??lS)x^AKe}j{;6n#6~gc#U$Fe5%KeH zKF`Oz35W@f3GI%KR8xWbi;@4A54pGt#@C6IR6$_~|3rtXz{88<8jB+<4C4|5$UOM& zIcjjWQ!E&N0wanmQ5nwPPfR^Pyz()W#t5GFgxXguJW1>|#OjS$amW`mK=2OV9vyGY z7DuTPp@d6v{4qpA1s)X;r#b&NtvG~XBCdlnUOgc3>SNsDZpf)&ymUh#V|tI5r(06q1WYhQcjkz$rKUFS8FUjDXWy z{vXIM`p-QN2hTSLV#^0w{V(P&2ONn5{6F9j{Cx*T>Iq9o!jcC7Pax%)Y6^4$M2f=Z zhT{am2`~n4QcMQ#ea-Kg?uP)yaPBp4ItEaNC2)ofa9_XY$4i!1O;#Fw&x7|t01psy z`XFZPVfZP<^xBp6&3g`Gcqkw6U}%J+0=Qi;J2GRE-#V-21HJp7-0KDo+?Co3Am zE$~vURa5Q7Q}o$C#u-ZeR|KS3gJh6|98UWAvghw(%mDz2a2?V~!qE1UzO~d^BnPEqj()=~Y z`}*@U{?C`j@MFBssIMO*7Ct7v{7~MI(`86Z9GKOsns@aTPSpIKJoXdkVAdEOaPud)XbfkT{gaGSFv7c#}1b05T#ArZjK1wsyOV&g@CS>){xBjS7a z3IYFHh)xmyf7yZvX@}6yHE(h&-el0nroKJJ!Dqw;TdK&Iz{T+aM0Dm59tmAwY71UI z;%~~W)0dc75~Op1iW>YiM`6KrzVl$JJ6;;i;z!BATmkQQxb^Qg7)$71mK2+iJD`AW z5-#E6=}DQQ5mr6e?_#Mk)1&0@|!llwkp0)W6?0dOGv zb^382!weFBQ(|lNC`+1hC~+;YR)!&0uXE-km#VB)iYwojz&>n-pF5W}?gu)>k=PBx zeOllS!|+H`xbQ(W0Izef!l^1Qpe3#~R)?D%)V*1%G@vO}mct_B10wEiUtjRRmSwQc zrfh;{1Y^;=-3nkB?uZXy@YA6G5A1ser__}6f1UBdbS}vGA?Q5-yzndsJezLSqFCdq zr9gqNhZ|w*RkZ7k1fi`11i*aBx8;%s27+Q6$;U+{HU-r5>lr0GLG7w?U@#w~8w<+P z1a#-Y4Yjf3Ey4FFX#1RYfR9U@&wr}%9@Pju$iYQ(K)Xq@i2xve?HFzOkFkJufYRa-s+Iv{$Qv1_;o%<<( zWr-KU0N|jK@fAC+;yR$gXmAo*+N|SuMhCdE18clvtFMcywKMb$=+v~!odi9ZhJAk_ zj99}D_9TFK0r7l*`FNp*O%519cMG5)#1L#Lu3ArAt;4Rf9gtf*8nXT${%HFWSWl`$ z3D)z*5->2UCauIFW5D)#VS}MTJJSM}AN$it2EsMqSeaPltpiRPXmlW09){1)1st3D z7j5**nk9aw9TE=i7H{oNmTJ(`=$F^%p|s%$pzRv+>wJ3KMJUk=t-_+Z2W3`*Fn;5u z+^}9?X!wm8{5@@lSnPqtRx&tr|wp3LFUPn?>JK)D9|YkarFNcTj1$LEnA3bT=B zDgI%N-bENlkE?eCRy+_th*dUNSJpp2LWZ^0$P&+*!UcGfj9uaa?XZz97;skB*MB?q zTZ4}Pgj21J{eS_S!k1u)5+EX+AkpM5X)$Ld1so-Yy*C0Gj<|i}S#fVinwRTM=U6{m zf~z4 zDr?sDXx4gk_C?$C%gFZNmAMiSp{f*@lJhrPJ{xX_yCEL$^5L;OerqjB>cix zi(lIoQAa?SboW;nmM{arp9Fz;&A(}z#}BJXCjbNiFp!%#VL# z@EQkw;3}rl##PMm_a!9TcU$<#{p9)^bdO{Wy!stdwT3xNShzID+E`fX;J#-jFAos{ zv^+q#d94W7a*x~cP0Of;>C*3nInt@cif{Sn35%sGISb$5`h3`*_&_v9n{x@9_-*4P zGFy~Mn*gv?O1Kf<_Jh1^3onH1z^t=VdbxMy#~|IxhWN@B_O`3}*8a%GyxW$F`#RS6 zDui+KZ`-WuyYFh1-O+allxvzsvMV`(Xp|m-VN}b84@L_A7uTL$<~~> zRD9Yf^c-GOi91?}1O4?|jQWoS@1q1uMhJ z#W9TE;~Menl05VpRq|)P4Q|tMi9d0vE7t}izM8tddN2DY@;Ut513qOLa$VpXO(pox z<&9KsGp*J6hS5ulfOGN*FjyNO)p;VpnVr~iLG}aZwIxuRgG~Ya11fJyE8uz_mmG4} zDHXrSK{p>xE;tx(niEfCAKcBm{Bj$=X8ZhC^jW(@F6NCu`}Q3M03p^8VNgPPEM*jRmm+YsC`<5QcYHPxYIy z(7jMXKx!FYYz43ZiPHekY2E*pU=?EWM**Jrh#KqQ5B#G;9O5Avt~~d=+z30i-VxP8!`CLhGj2drQ9WwVHaY54Jw zOJzGOT$MF_tE=)`1SJI3Oi1tyt_0x7m$%HNlKaT3683$ zo`mHJ0naGW1OVdQ8u6DdHpTmmc=)rSh}9T|XwYH|!xx427=}^YEi6R!Ap}cTL%@e* zKr;-V9fZPupCjKNeoV@x*q>dkog+C$sX)ra8qi(z*e#yFaXr>%pq}7?t9r+7JBKeL zJwb_1lePkB99PYF`gkGEKifKe!$;1?`o=V|FAPkdf4ej=_usBFeEu3LVq_J~Qg39F zs3?Llwo9|CH+G0F%#C#)OOmfrfyP=z;50jSS8~NtEU@S6SH7pWVTxpc+GiC0d z!=U}gI*}NjBfgoj!u@A0;vs$U`m3rJRNL1vd#vlU%-_nf#RRBL%>D9}jI5#p0#MKj z9EsdS7&g4X!k3%Pgn<+G35`V#IrwODLBw%wix0*aZT$fNBo-dFXJ)dWejhJ}DSWD^ z`A52N-=`c!Y|m<^4AFK2M*7B(7N5~9*2dE`eewb45Ptes`F)QP&3?g6MV1Ray6GC0 zXIw<-UJ$gm(|O}D8=mF343E*EhQG}I(hc9pZgHQhqu)Cp&y_X3jFEb08HP96Xq%%S z!zN3pKPdX>Uu52RL&!rwtRUo-6P1cX=-%9qfBQn8DiH2~B;VVz93{yyeeUOmQ=P!G z@UTZPNHDl5)w4@PByvE@H!~x9k@5;1&C(M{flON%N$J{CbhRe$HaX#IEO40NV`{2i zCj=)cSgt2U%R;Q-kzz#Z^E00+6X8lnDVyd%tjliYeZA%_Wv*i%g|4<0Iug-%238GsRtt(JoVOs&b} z>~cS!ILhlXgww|GWHf5J`%Pv1fH;WtifehNPG#;Q9VBMNlW+%^NU2Yea1LucajE;) zan!a1-sG5npRQqNr3(CQ-qSFO+RWRCFH(ff+EF6Yxep>8kr);UomhkEyobGxO2Ugs zY&|(FCrV^Cmvtm<@^}v2KSz}pk@#`G8^kn`P8!CM&yr&GibQ*zv|cppW?xNzk%c;I zM@s1BQOp!8D>^?*Y1S(enfdxO(pj%iLchddro^z<*`Tgjzua%8^f}bUs8_I_MgkkgSOu2uri^XNLVf)og#cQamB~;R=i(@V}0(T(-MFHe-e{<4}Q*nrriCG#u_G@_eZN?>EeQB5DVg0CG zxwjM4aHt?#yjQny{zq?apZ@l#5Mtq82!q( zcEKx;MX&qVEx1EDX;)8Jn;HdWsuDw6e;Cy@wEcW>^1(3kIo0QfOf>eMX>Etw-^yxrm2ogXtTkIA|Tw&TKlc{wP?TAM+TU`a{PJU~tCt;A%$ zs~k<)lh)^3B>ayPgo`r3(ef_VjawND3v9Nc5ccm^cfOeX)GyiR^_4|qU$^CDO-?Fq z_Aj&Ng1RrK&4~CuMN0jgH=v%ZoUJQUblWzq2^{!TSeG6ie~5>fo%yc+qIRKWUr#-# zMe(>QnUl`KOkr+e6lbZ#spF$p4(&iWL4;Ot{{W3cUt@M^$odm`0QMNnx? z51%!y`COL9q0fb0RkXUhn+A8Ht{O%P|2dCz{lSbi?_7^Q_~)ZY8UYsM`_=BhdMBp-Vy605erXl=2E(x~G;Ohe@#%rQZ%QxnS@zDvrL_-tT zX*jL~ry-PfR^Ydm|Ir@TmE)!!P(_*7Dw$2mdb0&l(5pWP=tx{?2@ql@4z?vRLk) z-?jZN{aTaAN3qo6&uXgJrgCQB0IAFw@VfmRRB?M^&@^=aj+1bb{+k{jhk098?2Zm(CFFuAoBf8O@7^-WD%{k=k33n+xvp} z9+yc~4$I;mbP)MUWU05z2uKniwhgKyxVNO9EK6{j)gLM#3Tdj>^JOzOMJ;ZGXBFhh zxunz8yKa_R!%G_v)nvsZ5LWpjw+CI<0-}&)`KlWJsM7AQH`Uz)$XDRTW=V9AWDkoO z60t1rBiMBRaiIw7xiIa9+qUA@O5yloYJurakMN$>$L;J=ibFT@FG~>*m)mf;I`zoz zGogCH>DF(h-D}p}+CmCKJra>i(p;G-^8{Ts$Ua+IP97A18<1(wg%x^V8D&F(*8KW%l8ZAGxqKxkRtDAvF$<^dzsfqN&^8zB{Y-#!pZDY8~60oLy- z)E}dv9DAV>bfNNgS|wORC7NvD1GDmL+dP*S{FUaM-Z-r&cJ!EecGX$6C!l>-hD zD97n;{|`utWXT%lRuR+YQLs|h2l?a8-nN=LV_!6RZ7-i|ukWUeDW@onZ%2oQ)K|%2 zJzq&Gh(_n~FxH5CkvgLOR)+6TR?W6ueMHf0T4dRV-$p~-?qcLSM6N#dW_`|4)6*a(s3MzLkBeR zZbp~Pw4jg2eh5{qxDx$L)(lJ1!fDYuL~5T#LR88<{+>YY?g!4C>_|lc>`eQLG(~YC)%-BRgul zS%M|*Y|wJ?>anJZtc4nk!hEoiCZ@KLhFWfEU%6fd4LzYrK}~U^9^5h5sCeO&1WO5H ztJvz)FrV;2_NxPFavmUHgnU_4a%)?U4H?x;v%EO()kC-=$Z_Cs{Wa)I0a3Ys#oaLhs0cMNirc z)+b$u4D8kqO_5^0)Y~%E!-UI-w8)OuG(W7Bxo|-mkKX^ejCh2;JvY~{C1}$Ko*$9Y z9Wc{tJ2c$)ZbH@>Nz>K+_)vpgFaolvC*_*A6*Rg!&@joGF6H?#1f)XdOsp+BSDFoCZpVWzrnr0_`LmPuB|)$G$z z8?C81az$oxbJ?U|dj5r(POt)M)YLS1s;}ycb+YkSaVD6oLD-l2TYbXYOM*u*OX#7bjn1FWTUsXJW6n4i>ED z@?+z=Bj>$ZXQ1HV_v7Tk-h5v=$1GvPW4|flXTu$0L-T$^_^l0no{f3a=E64{W&s;o zEgOa_8}+44Io2)tyA6bh?V6fx=8%o4)0W~@k@6L}>aiFyYD>LuOJjCRb7xEI3bXYT zds~}gTZeV~naH-T(zc$#w!Zzgf#0@a)V5LTwsFz6N&U8I-?rK8w)xJs#ntw6>>W#r z9V_<~5=)egjJ=2#3MuvsSo>eNYD`1uo)Cx)#IpBhE%KW)1!_dHOZwc3BGr;0M7oH) z_2obNol(;j!3v=SJ~g(ami$mT5MW~v>>1>4g|5bYoVBv9|Cyo0sX~b&So=wU3Jqld5yY&N;qH@tvQP4dp6%;BsEL2!KMvBe(Rr`7rch#3G zGyfeq={TXQ6@6(x$4(Z#ahBeuzFBeK4IHg?KItEoV`kCe7A1sEYDN1`M39T4T{Nv` z)6nIIW4eMpX8b|o1N6?<|MqcOW@znGKDyhcrwXa}{hT&%D+q(&IXXXe={^Vq@}t}e z-ij7tQ!SMrmDtSLuOj`jcD|M$Fcmpc(a-efb9EYsv=ka`_YGGbOL0*GB$T+~Y~ZMm zZuL<=_wXIwXzA&0y8rqx?Rq1nw6rikrdZb&BXlUhwmlt6FFWjx5d)@w1#`ivXg=e$^+ zS|f(2IygXY^o!#8-Z{4;+ZVlyEVF0d*3@pz{j$WTZk!(+&m1U9J%xHGzgQA|WWg~y z`y`>7xZFE7We)aKeQ)Jp&!#3b-z9Cwpy|km8GEr|#%zlRBdCq^kbeDxd>ZNV>SQyk z{%_y;#^@pE_Tl8pNIRK%k@Qlzffc;r($t@WcrL>H0Y2S46c^WB`Xj*T2%<~^Nre6) z!v*FkP|8UlbpXUcnTes<;6LJe8qVk5=O;`P^?SI3(f@hxw#B;s)b`QLj~6Q;3B7;D z4#HF}9`*oL*eIL5u%$Ea#jD!Sd$mKve%7K_TqMuEKOcH)b=49Ee4km7=C z&G_dt_)kw(cAj5}e|(At%-wfM6Dg924i&u~-!b@<`qMFT?MBJe zg2lpHR+jt1XV+cNLTD{2@fpR1!UX-kva-dZ=F7LTn6t<)he(%8g8s`Q|G#;YPNCyz z6$?qu6u1iT9H0`!S9!#HQYMIs(25Indf*wpXCE!LAG37i7IkEIVo!YTwZzKfiF5IR zu$zT$-H3adJp013rH#YfyyUzrF*i9Qv>M0fTcj(C#TULdRT-# zW21b_u7=+`c($*s;_RM}`oEM*HWVda;^z$dC$f+r?8_!~n)u_UrtZgG$mx`(p)H*T z@65$o#^ibV56IY`XBUpV+gAEeg_iaUKmYaa?A{KFYg0(yZ}*lnjzzxgMPKs14B54# zkiRE5ue0wRfDD+TRH$X5D0e@I9D&806#ls#^V_K?6hs-O6^?ZwHdVuWb`Ti!80UHl z3m0_n`eS2TTaya|!6|4PwGpULFez3Jo7Z}86#iq1!(uNRWHckW8kzWeTh(M1>7v7r z&sc^MnM|uAnyQPG)2N*GN7$zdkWd1P#o8P&I-3m1iyxdLlp9S07KQ=PwQhixBZ=W1 zSmDdiXBp*<={@hm(In~7?AB|6U8Nib!4kI^KW^pfK-uans`{hn%|R|hy^?->-)rqU z^HMTC9&2Sp8E+)uecbzA_{uGn>~HwSc7RQLOW=-==AG8bRC zbri8b4}mQ(A1{Aae5%E{%zZkM?=#GUIs72LU-MmX>2CC6;EVMd!?_jqo51@o_Zo$c z3`0@(pMfvp`a^D|gZ`ZDPE~kdWbSVN{yslB!N{UO_+kv9Q0f4NFg%V%hHyfOKMWDX zYGPJyNh*9g@;JW$kUZeZkESCBwB?{0Qd@e_?c@^OzMdc#^m@!UoY+rYu>WqIMJlu5;?!sLS$_Tu+7!W1mIagh&cyyE2t zw^HZ0{XTjB06G869@HG%_1bxdnPu_bi2R)$WWj@%>HkuH$HYep&za3FUB0O}CHGjQ z#7$G=4d>TTHR>$uH0(H|irO7jmXf|PJo93-pNUIQhnRyM9O`MviI=h?$-FEj9cH?RhdZV00d=$49zz_Dp zg2uA~nal#(L~emo9_1uAzwp2OSmxb@o(<=j-ye|)i9s* zGb>)nK5vgd#e!Bhm31$)5)j^;eiZn8Fk>i0rvwnUhJ>@3(x25i5G%O zephyj$ZS=9F=b^vDx0xc{k^{PwZyr>+h^B5W$8+Iaq*Y=yH3(~)A#q(A%Y7Wo>ZK8 z5fDRw5Q7Sxn1lH5+;3`rCDTJi+v2O06`@O}Gn;)rVg)Z8f+%{(ZluJ@w{4R`6FF&C zr2Iv2|MrGQ2g#zXPJ_bGmQXez)CZm|yUy7P_dK-z^X5<5N>NUM*BJCx!OHo&9_o&cR zO|l{%{l1&=WYUxE zY&sEGT?^+-A_3&+IP@!KOTz@neRJcSVPA*DK#b01?uw6DIobUj9Sivx+`d2ky3fEHw z&c%uMnEKixX>MoT(#4rY;*arJPh4y`mrVAfD_o&R)|cX@Z5w_KTY=oJk08q<_3n-B z(mdWDN|(0<8k)vl@%W}~EUsdU-ePUzFvO@GH1qrkO6{GqXjRfa!Sw`_yFrm>eNgg@SfYm;iKu}`F( z|E*8iCf#{szswzfQaINZBWcrsl8nIn4`o{{f=z>JJFX7Wl4^%g5f;5DYfS_L{q1aHjiqA^!D5VZeiXFMz`A36PhV zMsvRM)bqu;stF6xc02rSqrt5qo6^Oan18=UMKVlz>uME_%@!;P-+qpc`ZHoj)bIAN zXlJ3*5|`asyGZVDF~f7iWZn(h3s;E*%}0Jc3Otuzb?JI&bEu|+m|O(i>6n;)R`&&e z9V)l~OK93 zFAM8Fy+@}_`l^!KY^-tXXi0{guqkqFpQm4YZb}{eTWwvC72RpQp&K?7mTFcSLwl#* zOh(SuZfHNE+z4^~TqG-X>{Ag0waFSLmwR8vONkPNV+i@xSmu{}f)k6|a#KwG+%c_M zb`EY&RdQ?Yzz1UFYg}wqoUD-$vIyQqJXUOZ&OH!!~Wo46*#6Tz4pZzrRle4sJ%Yb8uOz5A{ z9BDE#QsgnlQanTe5a#zx6rBiW1n52hErT$tF(vA4fIdQ5oqJf7dgLsb6fLb)ee)Dt znI2#R>{tkv_YmaAyg5Z{*4bD9m4}SkP)yq3>at$ehp6I$1?4Y#aB0F`fOxpH)R)XWbg}QDGKDN znH5-V5%SCkCR?Nyv!VsFl8mjQ^_GymHGB1AQ2{21nDx=S5lSp-DvW#V`X^@lPx#|r zmOnISK;Ch`f2Jtc<#3s@e^vRK@)SftxoNA*~Q^jTop%MI88Qmhu(JNIQ+ zH3qa@`?j?N#9WQlF4hjv`%g-N@5*9mP=o|_oJ;I&{few&?JP^|okO-=7wz4wcii^v z-H+|^vnb z6Td(QFTY)Xi!U#to&@0U+WOfCZm>F87aBYx&8KClQluXl#J^3Vp*|zr#VZtJ$#_M< z@Pa+VGI=IPj4od>AvB#lx9-vFY(^bcvZoYFI$Fzny|y^`+5LnYdhTq|etU^BaFS*APrz3l68T*32FHV^BIF9h}(6YZtvbJNx;a-DdZ;;4o5<9Qo zfqY4V9F-M~H6%cTe0&={U%QW=^zv-k?3>+CE}VDF@9Bgai?M=ho4N9pSuFxtri zwLIYGGUT2MP|(Jl6&Ch&O!H@koX)?|_1>JP+2Y$182+!H@7QxV2Hu^SJE9)^G|r97 zLw*xpre%*n{2|LVSwBmdob$@DE1uNQj!zoNN@=50a(pAsVp)_Ef2t4vy7-9t1#$5{ z+Ys&7*BlH(+)g?8bJTL{Fk!38EV54=PB;@=kyp$sjBCOv`(I7S?h-UL?;^jR{S95ib@8^ zDrqIDoY&te;^hs-(5odP2ujLV2;8kcmi(yO#+Rd;ZeiD3cr_>g^?B9=ZMqXpt95a= zL2_MF>EZI%z67P7Ra==~U!Re4{eHJl<;|sjRa%FcE&cuCkcZv%ALDvciEFpTl7u4L z^(a^H#wT4yyH1hOE|Pv~gVgW%Oj0uiqZVX)#$1!E-zHgS` zL%bnu03Vwi(P;(7+vxWOFW4v)c~2KHea52bNv3k25b}W!PY@TtCv8vFU_`6CN0SgA z-e*4iFO~R9$!;k~Qpzsyco-zU6OkMSZR~t-*a@CiqJSZ&%@EiyESv`rb`><~UKj2k z0%jN*D)bAAMh9i0*gycD5!%ZW1m#jBe&j{6go9IwWyMTtp?|X()1l-|6C12PIFqj79YTtz*_}utD%j<=4M1912n>9t_R)8gQP(c?1c2 zLnnYGg{B_?-S^n38-F3TjWjw6;wI?Xs z(er5Dhi(l`j!~KS{Z>S}hT>-Eef&oNV3U7D3+5T|GB^YTPP`srej(7c8VZ7p4mBtp zpP3DJ5#_9-9-f~hFLZc?btMNx2$aDvR3{9=6M=O<=KvL)v9?qrRZyZ}glI8ZQXR#b z{Nk?~k^zQ3Q|Wm;fMP)b zi_LZ~_EqVjKD;+iqXBprb^I@bL;*k>#R;J9;o{7#=RoG~mrqYU9){ki^-ww9%dOF5 z9x7_LousW03Xjf*dx?+V{Z=37WQ0Ksk^mq8cnm{A;_K-yeALGMRWn1i9(6lP8ad6e zFrI`y@dR8R^!&TU0=6Ci4;D^Jal_<1eFSakJ|}Xfjrbe(`%zBReF-owSL3UtPDM1Hu+HXPC1M=G)|)@%-{H< zhj{u$e3#=jYEm(6P`{q8IGN(_=TPH2s>SqsD5nDM73AXoB47e}%FPA5j^B6#^D|uXrv4U8HRmt=t=MeN``KJU zDp~PeBL9J8B~4JZpyVs2pmM{%<-32wWLhc(Z@!fpSL58&I<(}uv@|@rsZ)?_c-_(z z7u1j@+5B0uP9d=7LrYCQRZDbG%a@=w5`wnfmgbI@mMO{9<9m<1ls|by;_GOnWh4;; zgcw&O9T&ym3nt`^{O|~gjg*4Y%BPT$T)~@T#n5t%Fr45dcEt_wrPE>g6tOcoz_iiXlMovvs*epO>VG0+wyFKL03(11G=VOw9#VE&W~M z4C;`SZvF9U$s=g$q-}Y#ZSwo8R?h9_3gq!ckCUb=inCXbEzBMcxrAw4MM?VY+2B3Atx;)w`V zk32k(0=WLDi~T{gf*|8EfLM2gs8OU%psH)5XaR_NFZ8wsz={zA%CH#4Lg`HrJzxZO znGhmCJzVLj90e{w>y3r7Qiy)QsFW=B&RQ|ah2xF;*X+0Su~1|7ny)%iWi0l`K()QBn+2 zBQ=q^1o*HfDQs;^c}SG^PpnFUHNAWOGhk*mem_SbjH1Ryc{?iOA$uNpO*=lr(zYsV za4L!aL)zID6*~*8@uStcRk6{8mR;~U;2{vZa%Rc~-dyjcqJR2_MgBK#lvnga*^pc9 z)MlUbCmq?Zf`0SPbl||B->Lk){IxsR@%i;@3!Xl5#qXC-qYn2JrSnW}N7QB^p2wx{KZkNyVHGUOiU z7_+_xMWhsnr(`+-Z&pY~vKdjW)qqqBgfm0?J7)O*w==z)@4P(War175dxEN2Mwd(g zRVi1H>1BR>bc*mM!55_swwniPV0am_PDWS4tz<*V9(>-ZL!8_JhD(t&+c8Y|xadNnByZF`KRNTvH+Cui`%(Rv2gp=a|YXc1_{w5q%EJEBitCu07 zX6r=c22lB1>PF7a85N`6E+s~aM_@LZiLH(mLg2%bQ(1~XTTkcNxGeaWpL?}%rY6s2 z@odY@pU3=eK9+&Hsl8xa!FN4GzYc$@*xeK{VRLdhdg0vMa_nl}N#@zubj}OeT8Pgh zThf0?T>Qt;<3&X%&99_lZCzK>1w-do_bb58YS!7}vbCJ@JlwlHovrzI1!PXQ_eB;; z3-7Nu*t&fvb_-qjQ0krU_Oblzt%Z-*BA&bbR~5gt@Za^rWKQ?>nk*%zsH(`;o#}E4 zUHsHklkdLK(sFBY<3{Im_s=))Z!LaqAK<*^YdNLT@*>Ng@Q&swQZZES>%LN4%Y$p~ z-AZbwP+a73^w*)iinXt6PzM1Fmh15KKpcd-X*AhHYz>a!mAN0t9w2!^fA^{UCG+z& zA_l@zUEXRQ-!BszMmMuhobHLHpE@}fW#&6ci<&tZ78tV}d*)x${P~m1-(MOxwZ`TJ z33&YeP#*RszSfD=uvUsap309Np)~WdE$w+1u*faqQ`tuQscfK&PT?QPT!3V1kBWO! zcaJqUGr6XL>zTXCqa>V}9yb_qPJ{E?TSFYfi#QJ%BqBnej^N(Iu-uzKmOMr6_?7Cv znMk9IUJ=_$i-i1DP(!ag#Kdz#bKtL8z0=Z2;fA zgK1<@vVcklA(scJOWC79qzN_e-6)LcT7(FN7YJa7z^G4=pym;p$$LVLOYIe7p~xbg zsFMV7{_8~B_vu`}MZbKEvsguZ%`i^$mdJrV1u5KD@YoMXhi((+TbGM(CY%Bl^UdVO z8vfj8CP>ch3`iOy4^~ewzBB(!Qz`k7M@Tyrb>Xa;*1@h;qBc^Ad(H}?0O83yn#DD! zl555RVUaI_^5dqd9H_y(4iZXBpd&R5N&;BsGWTkSbqp&gcw{0CUOg@3Tp8eFI+75} zXuJ5X+tqn&f%<~dwEtc4#!0t#bU?zHwfIYA1q%siDuz9!PDHfMBn<#o#Z|s*SKqMu z_FN&Kii(x1s^7Y!#w$|sJ+|pui&mPF4rv#|U}ZFXtVb zlK9$=e^}lO*Db2O?A#W0$Z^B7L1=y{akl-I`ldJbnrnIaaGMi?1VfULT5CjJfQLea z@YYY%;5=d5ZLPQ`NR(tUn09K^V3DPYZw|8BZ1_W_f!LKo888F@#%YSqXr+SUwj>wf?&y8fGzS}qt4Fn{SpZJpZTTtk3R48l7{pBq+PEOqw z1~9LIiK?66ZU>^2Odzjb3J!4pSO#pvBrF%MgL9>;?gZlV<(ANxRwz@MAz<%lcTn8S ze(LiEvhOAMHNyz=3g?urbnFW%%g|1LPwf<1yMJNts=#7;w7(29fD8=lqo2|2dZrul8Y>`1RFDm{nYT6wCR0zPO!pA`KHRL z`ljIwG*Om1r~SUbU{6`0vap9=GNAf9#8fD<{SF;*;-##h#miEN(*&2&$=%Z@$awy)!gbqEhTo8TKMoc;2XLw|C*6-{JG_ z`qjN#+b1AOV{JxBsVq&~jFb9L?1GYhUE?zN%){w45?eMj{3@}uPRKjqcKF`hb5+qy zOW(DjH!F%}4LQPsiC3SCT}89({Xld2_@1f!`$6mQxBT4*WvkZ&aU7L%$sF!H>WEn$ zt+v3Bz`w74IpbALESE`2E)?o!$bY+GheH1UgW3aBCTcGUte|{86X2u_oHV)w&sEEK zH)0K1DeP+A&_R5JiapGL^DFm%(-rcY$Y!`!IFM|Fg);I^;rU*L_Gy0U?UUca)y}Tl z0!=(tZ53*^ZG~h7Dg@knTOxabg_G~jg@P+f&8zm?u%=JB&^|#;nQU=H4im<;4GVyU6ulH1z7VTS?rf$_Laz16{Se^Q%@`C+C$G}uO zugwmx1J-_q>&Hkg)M-T>0Bm0{YxU5gP{ZK{^R|U&fv@mJ)!dH?9iK7AqXzMqHC7qA zz(GzG6wkk(9&tc};07U-@ah0>>~{(mTt=t~i+mVb4KIjTS^-NmVF*=-ED3a}U}T)h z=tGvacst$PhS27#IplL~xL=m83viJLHg}Z(GBFy|D(T8tcoTHK79R z#oQ;ZTu)j#Fkh$mZ!11_r%6ccE=()Ft{wZPba`Lx#7c%8yMY=8wuRlr0aJ6N{ zb4_=|T8~zPT$)aiD>Ol_L#cS620^qIRSDr?{D6a%2L$o)t*N!0ErP3&#nUaeB=3X`PkXZP;h9)JUbmO6cUzdv;?R_PR%A4InpU+`fLB;o-Gwl`c5(xY5yo>%|Xv)Z4Y7 zV|SIwb_L(@(@tI*%|AK*z%|$(+Zm@vyJp>WC8to}D~_T5PL>~bk}hAxbKS}?Vi&=) z(T*Fm78i-7xLZlKMbbSIQ`XFX5GX6_2M!XUrY_R8(B7{G5yT4z6NQhiNQpl8GM0Ta zQlRg6_EhmpoxIvKZuOJbxet%j{*duIVc=B!d#%{8%E!~Hi6-*u#vR4eznyh@U%IMl z`f9}Z-X!jQ@$MP-limAo(M{UXfoS-QWDW`KW8z*(0p?pOX=s{dv* zB%~k$g$zO;J}_M~@XO5b0X$%W>&y`1Z1BCaRX@+xxCE&;o~f(}x_K{XpzdU&X3#VL z;QK#=2Q)(-$Amn+7c%iPlFifxiDJfAAz}JCjg07yq;g zwst0Iv?;0e*M-}$#1cu#kMxxHk57H1fCmH~TnZ*gHFhZV?C)QfAllSbeoD1Wb|VV3 zu4fN69g5ZFY@FehS*c6uBy#sCHUB~Zz!y$|n!(tRbTZC}a}4Co(DH$K82qJQbNR9O0zo4bCn^8ao{Bvk zsn0-Bd!#tyuQ2%@qoC1 zUMCE`8_p$+v4iId6R#8!?9~f#KF`zQ%M^(g7E3lsA1S1`E2f22LGYCO>ocM85w*eFG-0HrBG5VYTT z4A&Sxp~>!j=^S7Oi|Mr&T3a5pJ`3YBU>_&tN0{UjR_O0-Z3~Y0z$msKtjlI7DOf!<0%KRI zIgrOBDdPtJKbP8-!vgK_NiO_0-_P6Ri`-udA9oerG4Qw}YsdER#G!ZU1BlWJ>(oLg z!J~`sS|F4#HSg3#`#8S7Q*^PX*yH~F$)40}_j6v~uDN(8 z>)L}-;T}7WKh?eW8-#n)U-#bVZB>|VecIbMp_kRMh%FL2z#Tu(wFeu@7in|Y{6cl8 zJ=BGsxA=g#B=hK`D|kaeY7Y?pk1D*MPUPL@4;^4CcsqVvgC0D~hIle`{`7x$0{m(` zNGi+HC|ZtA5CO2D)CLHB_CWqd$*tbIdcCP(y>)u`n_k~Xt3I^RYevv&6n|9Y%J|9(}%v(CRy{VSiH zP8f63AHS>LG4iMHh5p3sQgG5f!L!H$10e>g=HTLtV~UPOt=8-KJP%%gXYhdke5+0PJp-k?Z%a{O_!M2CH8F!kf<%RWqQXe6!gFHI;RiSsel=DeX;%xvB zP^0rdX5Oh_+Esbg!vg8gTz<@ zaRx%S!L7Y7khEC$(snlH(PbiRDNIi5%YRjwu!Hp?!%u>ZsaKty%s;f{q`1|H9Sic` zKJ_?-6?yi?0TB-2-4^|nck0vQq|K*qyape+PCnW^Li{rO=*#lKm*Vs<>CRiL)my6v zTRVndv5$i%O1}O$CHeQ@E8@~Nx__JFa2tDUhwsvkVE>Nj;SS;0?vYEovi-Y?hr6oB zzG++t;HNCa6v(xPf3Nm@#r?l%_2#J>lN=#~Z1tAu2J36OiL4r}Gc8UL+}~gL&MS19A``_kIduNb}%S$*t#l7fhyFBO2QRN z6Uz*rgv*xvIiSaGuR-=0F;lQ=E7Oub==K28mA9TD4xc?ilF_sFF(K>Ix6@cSxYJOg zrzpE{Bv9{2#v=w&n3su=j%04sBYAa_TWhSY~iE zl}I*FTJXzs9tj$&$3#_~O`?oy|R_I*< zdYBJmSh#xOe^uie-4Lm;zKB8)LMntqrupCjkgxyX4>HSU{oIr zW?OJr4!oIgmnSE)7p9ZNTXP+ zt^?t124K{{SYU;ylAFpY9e~>)FqCXd7lECd)6l<;A241 z>46y$6q1;4u+5$PHMt49kYvE}74Nf-fQsm2XCq=R;cvv62ylB9qDh~64 zPmuX`!Bd2>(vGR(qHDj)=ZP}Mc4|LEk+JOCatgMX87TY{a)&u%ulHsH8EGH+aQ7^? zTgiQWB#hv)--jdp$bSxh$dMvGVibfo=ra+kS0a9f8;B=T#`Uf)90nk~+8_L6aaN;p zDY^m@YiOW9b*u07O0UToM|Hr1TT%J`a|*Vn2|OniZd{z*dS!B~k53YukiQ1&jOk~w z3{T;0qa&1Q1METJsUjv$i-r!e!V0N)H`yVWAEqu}lFqdHf@T28!x;?;2Xa&S9x$ok z>|1#GkX7;uo{gt=%9U+9O&GUYlj2J9yJ$`(Ux)*#^>kslH=;fpLG|IF(~euO`PGv! z9PG@;=$;g~H2@;;T09v@kOL!V-&RNnb5e>3cipWUH}NplMXD(KAnXI*@c*f)N$rr3 zT0EEi@OR?6f>w4>?h`jjvJe^=32_%8(TArchqTR7JZqRq44Dr}$>7%qpkx~cIJaRs z(=YPloGeVsrl@S5WSinPUMT}S;z|Tz%W=TX7Z=#c-v;icPAli_5mxMn!?` z_j|~c_8KT2Z8d7ldpI2cb%p{sYYwE;ENGflCHY7_@ z{QADR=GW}GzK!VigfBNvAF|FfSYP1_6;KE#U}?hZr|vjUJC50{jJjn6)d39ID9B`n zWqs#Jb}_o16?kYvP)BJrt!XOKpt%IG_Fcr+@ISYy5h(q6N{}hqC`&ze0E0wBS#fB# zFl&Y&dH~pSsO6Zd`*N`qwHUJ&K~h}lNnvGxB}o@s;~w?kd)F439$e_kPKDe>9O+Oq zJ_WQXz|HH(Nyv)xDtD}8I)dbOl8llLF#${I>+lK!L%4^JclY0GH!;0=_+kAc*3gbr zarVPilvUgyZ;VvxS5n%^0S2@wmCSXyJOvU535!9@5{c9`)Nml@Y5R0HxuT5t`z}N= zDRbKKO{P}37KZ4o{74*3g+!&}uh8D+>in`#+3dkT3wq@^;epYz2Av@y0|6KUBoF|u zBszq=v66aKsvaWf3WO@;%~RgjSb=azf~`Y(ch3s+vcp`2w690Ypxg5(B%=bo_K}JE zCE4Y-nkoZ$Z7ubodt&>^?xhdPnF~qWvcVv{DEZ%3JnsCKl?Ni+L+N5XF4`3j<8xhg zx{@}~8hZD}X^zjX&n~>WlVquYDojSZ;#I&l97w4ot20BC=n0RvdoI;_hbvIN;#Ml6 zGWT&>oDr14f6vPY0omi zut5C<8m&)(a+$YBh<4FJKf6M?abUoLjKSxUkZK(uc5E*dZNI|a=sI5|TI=OtmaxXh zLLC&`+D@gdKoa!4MpoI9S)yt zA)S9s5@6p}+E;iXQO^XDmug|LlHiatPu|X#iS)fm{#3*Ce*FN5A^H4z_bH{e7?8|9i6F;QNhB|2D(=|Geco+3W|%w#y#cU zK!JpA!!CAMVmcv$;SifRh$jGUB*>f*Mvn@Mm`amS0k-BBS;%Q-w6vHA2tS@#6tzhQ zOidtA!LxG{*jLFI*Eop#dYWiqy2pH4aA&$-U4x!9N%|^T(U(x7Darr!B{l*a&0_3 zLKdvZ;jwa@5ppfioSR*;78wfnQsf_SWBbm;}z}<`i=Wwes?K9uT|$huL>ko zgkP$P^QfUq)vhzt-rc@(&-edRLM2Aj-><3bUBO85sG78>9sjMSdi1D7cFs%Yv_c1{ z=oFvVDZj1r@$jenE><_y4byO5H!wr@1CRdORLtEt!%s)m<{e33ifws279K%@7m=>4 zmT!NQ`gGgy%Qr(`ieJNmp3nUf*Ow)Cv##B5xz@X&AvTbT8WBP4kO}HW!aOF@GZLJg z5EV&d4;G+x)fhW?R)| z`{fSwg9T((wkp7(DV6}RckTXtx5GNvvlQD$AFWEfP@ON7b6lnQcYWQ9X|nhUfQS4f+6H#{TM6>ro=729f7GtuazTC0XMGXTozTg z;%K+mDDKJ+qSp~uYE9i6)7@JeSQIE>oX(f4Ofe`A%#^B=ADKfPXLDBV8M_ksd!H0lmvHx&7w@VU6J1IyY|XJ-e-+d>fJMEi~dCEMutE zm?mA~Bmc@Ll-oDg!q-&Zhxdk`zLcflwl4rgQk2>w?%Ts87YW~AJc$Uwhd|7S3hDGrX4ZmLaTf2C5K%e(t~ zBb7e~Cg+4bvpR3L(~~DJyl~^;^5=(duiakyjBzTB_5QEY(ECvjHZ~Q9P1LHudc!xL z#e~LkZwYhL1o+n29<|o=|M}d1$j0zn=zpZmfOzsDLKx^a23trfiaokZ`eIC$Fy}bK zhCINRJ0RFL@ZTJKP%nN^I$^k5ShR1Tm^^qScTl!%P=0(+adS|aeMnVd=;)#KkVeRm zR_>5a+mPP)kiq8AG4^4y!mzRR@SYY+hXhs{0RBBDQ(Bg%hsyGz53R}~*o=k(4q2HL z=L9O+wehVbxA6XBzMoh{6tJh?WoEiLKaeiDkF64t9YZij0+Zq7C+s8-)3zrU$DbrF zSwlL~z)G6EO!{pK{}3fTvN=6iegM9cetZu=>7#MY{9t?3dtH{(;iS}#Y-0&`iZ+(M zWX%_W4XkBi`BF(TX|a({i}arg;79Lh0mRN&e4K-|_GnVuv)=J%4;5ra9l5ESC=Ea9 zYoq+34#wBxFvT*!yU^_!JAVl+NK|)1LUly8rkty2LU=~-`r(UXAe?Uq1Fqn}=?Ky1 zmE)1#Enp@4lB2@m#3swmcVi$XuFuW(UWg#1d=--7R17D z+LCf#@=w(kdQWToaKJm&22$V1U7Gc_`5jjpSox2%PZXK|LTg0BV{2gvu1fS zX8$my=P-nl}+UiM;HZ&(K&c9>{3ieZk_c(wy05S=L(QPHEJ)@h+QE+B@0H z_epnr^_C0u&^s(Lc!0&Dq4q4)9=*DViW!N)vVX2+<>ieYnDwJ)7Zk2F-Pg#wdF*eU zR9HMebV?JV@>+a**_1<6>`&9zwnf3sh1xG~zH+=Zaacq_#!q!us;L`mz^m@2&B(Hv z-r_JZx?1^|2q5{D)zH_FDKiA*c)S+#YJ=v-1NU%9#Wu?$7y8K6<4-PV6*O4+hd&X$!})9 zeJS$J&6Sk{@f)_#L=5!9;+#WMqD9kc+DgfygLrg+iJ^#F08EcNn;*BRo# z8N;4(S$c7h3$1j&CI6F`oz}e zWIm?N3@!s1&A}688t*7c0hL2d<%*ki$W?DV64+aOG70u|uzEEfsYTuvg;M?9Gcbt} zEN4`Z6(l$hCAv0-Kh5f+=kb#hJ7>Cr=%U@_GB*wg^y2oVw@A;LhIb8OIcc` zepgpwHrywYHITF%%n>>~GapmQWJ+!4A$L-y><)i~9bz)xAZy$tUW@^1IF6bZ(n0DCL7-l@Z@cU)O3ZgBVHfYD)qAll z_`uXCXmZ;zkrdwnPFdH*{_Cf_URsFR$3cO_i6B{~*-`f^3Gkb2_pzwnurb)`OI>F@ zxj#?Nd85xbe0P~x5{IY-!P^WPjVPM}EcAunm1X)6GBRkS9GR4jtA*w?7>O5Kd(5Q` zmMI@|bk|(+ic_S8)U~Kx3z@pBk(P2d?(AAB+$E+^k!crEDq~`cUC-XDv-(jLJX4HW z01|J?BAOBZv>cs(RuVzLZ9Fx;9Dzdcc(9|uEMcC2QJIMlSgWHeUfPM!(S2tyEjbNa8 zZotuAyl8+M)4ZK~6sY6CRUzYdHkn@dLi3ZS5);i4tQb{O&dDy`SkK638oxZFUOFGf zdd0ks{^b?-F7Yh5@abV7zRH|V0Y)?0D58qQbm{3!61w#?R}*f0mkN3RT~>zpMqrLI zalpLi7@qri*Hd`29}pK?+anlz(#Mf101-7?inIRlq1f0I)19fh(Qr-SmjC-2l)k(m z@v68kEIHH1^O!LoX zCEY<-D3>zz$=+=&j+9{u8dr$gYf>p&_6{e?R^Jl`=a{1fj1P_0Q^qV34wEnqDrl_) zn#%E{^=vg2m+UB?@5JHkffK2|Ds5>p>YV)Vyc)P{qHNiNU%(fS=k}hub{yMn0JtS}`VfWdb zSS0y@;5z~YT$KIyLt|Hu%upQ^04yrN4=8>grxz08YY~OMrw@KMrLVbi0t;6ov09J~ zDO)*z8N%R4hG(++bwJ;{34T`kMlXMA9o_XT5AvI(NIQxYYkrItNrtA8%v^aW)p zZ0_7S+-1__P8@(;KHsldZUWLrsnt-Pbo4MOdXvquZ2nM28Wg^`fFb7!B37snbCm-B zG@6#wN-ixrT#Eg~f{1CH+>uT!QI0;yT6$)bY+=G9h#xX8TM@LCT)Uu`KojO<+!5bO zOP{;|gJTFX5|$1nx9j~C&&6ALemqgy>$fIS#tm@hQV2oDtObL&ky0&*fH8{8r_#jO z{;qQ12TqFJ3+EOH#Da_5B#0Cy8Rp<1`O4Zt^9qkmmM1_#N8zkcG&afz&WzB=mKzu~ zjINaZYTAN`m!{r=>o>we8cJP?q6*r8DcNaJ|16w((NGelyq%$iS}8xaLOjF3`$wTD z>6O2?-EXAva|TVNac?Ti^!c5&^4dRfST^F+c(mcH&Cm&Db)_Sqx{v`^D$KAVZIwM< zZLv#cZDxMxOpF5$eInX30R*TOCL>ZLRM$`xZVhTGjsOS$6Lo|dVs%#H0&X%R-~lBUqCU`gyW!lqa~D09KDu=G zniAzAS76%X!`=4V$QFHVo-qA7Ni}atlNAbnKkG?g8C4RYh`tQe+{oQ}%k|gjs)`1Kj@_bk_ zM*;;d?K;2~5T4qwhCm(14IXY-p7;OHt3r*=%56S`w_KrMGF^uyq$09x64oSjjUUUq z>{vdH^yYoyI&!ozBJW&+ugHI{PxL-U6eRxj#WQVQ#!`_*c?o`!(r!VM z?l$Jw7|Coc`zxGrd*<;mvh?BK50!h|Krs&WT5J%gdwi8VA8y9#zAgUo(bnLfkkDr; zBBl=J@Qw1sctWF0;1|f|E=$jtTN|W=45svHBF(OknCu` z`Eh*m;86|nP+a6`v%u5kP6QpMBJ;euz$cl;-XNp=J1eIMde-wl_qpDW(d|z&FV~c0 zs&JuUO&*zoXu`#4_7f}3yn+AeHC>p!si|pGnOWri$Nlx|k1^d3|9z1WJx*jiZ;hZD zKY6brO=RYBczY-t+++nAR|erpDNIvLv-joQ$OlU>@x!SnhG29u2^fmg=l~>>u;}il zAj2LXmTDR);#DlS;0x4oVSA$?IH;ht&`hfrdh&^b65@I51Tv9PIL{VZ_Qdn!(Wdx` z`$nOwx#%3MMUV-Nk$a`DhOH!U0GLcc&>@4Mg@<6`K8rFyt=gBk^IognmjULiAo#%{ zZyk}C=ACHi?6}E*Pfew0Z?3jv8(6SiGgU;*?7Wl3*4(0VdlCYK#HM|N zOBM>of-A*aQ7t!a|8%NCT?J`+ftZX914y7yKbjfs zJWt25shV5?=C8M~X5pQf^XIH9amh}2QvC}8%!F}e+pw^XT__R=t37f$(e^>GHdCgS z{Vz#{-B?w`Sgrmh#+q~V6OjfaG%C_f0o8zB%MYgtFz@b?2D%q$df8aEzm*11Nv7Gr zfScWV%=jTu4?2HeGmd62)FA!W;F~tuF`H(yAqn;*QR9QqkcN{`z+_3Ov70)Gn4VC0 zeEMi(FS$|7UMe7kR$W(z9Hk;isaMK|bgzA1^{hctU>5GdWvO%1$|suCe% znI)s2pj~e)qM4OaJd~cf(tMmZ_exn>!C1;#S#$P-W@{1ISvA?KCuAKJj-S^*9%X$z zx}5s>MVZ22ZJtc)^#|~3W1d(z)im4y(qW1le(cZN*2>CRO1*J62Xc2KY(K6?PS-QaC}O!dO=uecSxyWiT^6Sf9-Q zDpGO&vSM_b#kD?*%JHXCJ2ypSZnXjBin3c9V@EWaMQ~%8uI)j3_n6UDeYo=8 zv_)&1<&8eew(+s@y>=k1a`Ufc2fJ0Lh*eLa3i?Xlp~OoS&TlGRAy(Z9Rz0~^jTBY> zKSuZatop{S9xhou+O+EbYsFx<9uTn}RInb>w;r~(e(Y&I5@P)%!Fn{;`e~*0Sex~; zKI`#u>xm`nn`oe^m!ah$3P?u-XJ}H}$=~)=zWM+TQkIzg#AL#4{j?MbmGoUIn#7~- z^jqDuHQPu}y@_;pC0Fygg6%tf+xNMh*1j|r*D6R4U@HWyQ^}wiiJD3)p+da3Z$Y%d z)iSCBiuxf0^)o(|giAJcO;sQ5E-k#vORchdcY{=v9Ws|-(9ROWf&ONQvo`w0)6^1+e)L@-fPzF_ zMDdeklpVB6!fEi9fMe2ogr<{s4sul-*)_TLtnHPyJjc!&ymF8M4sg!0-z?F4{%fwKB^tFR=}Vl z>>HJ6Sz8L6tg|`;uE{P-Iw$WOKY?{9WzMZ%=suoCbw4Y9^sP9rkk7r7&oe%Y0@3q{ zNA+6qPvZ0(@~+Cx(+)Mx@>r|B;QlAasC~J`O#gLV{Jyjsc)4hcI-N;$3Cweuoe}^v zeV8Cs+aAtdm@KTG%H9KoFrjXAr?2|xZC)@cj{_^o5K3zL@AT8*s$)l$>@{x9%FhCA z=jIov550m7m(lY#>=z^+;reFh+{!PWD;$ku_YbZzPH;H!r>V?alr42~p~$ZMY%YJX zOa2$vf`9YvRN?!p*G#;CT{z4PZ_zakfy}3hbzP6-qn_tmVCL<*IBIq<-12<-8~D`= z%-iw{k>@)i)he^1i=uURjh1S%{_==*pJimmk+@mi_rHmx+puSFxXiuKT3vGYMZBWS zDjiSh?2ptwEMzv}Y&`BZWUCO!Fg~hQ8N_z)wlJfbD>aK|}!lp#n9CtEdqoV(9pq;SXfP!9|^iuBhMcLYsH8W?ge8 z7AI%ryAZE`dwR?zdd=r8D_&sEMLf7Bz{gI6G)NIFM6a-v-yBxul<{+|NNNuc{XnR z#^lIhOrjuKp4AAu6rm6y;*rTalmMW}=dxJw!}pWg++4GS}00 zNj`M7f=oK>x=^wP9nW@vDq_D0R7P1yqp{QG3_bVDizqSXs+0NW(%Ldro{p)xvZ(s1 z^VerGb!axPvJEtT^1XWX#j#)4D_8OLZw()_P`~5V)^D@H^|WlTH)vk{-ZdH8%Wk>x zfcB#+Yo``nr>^v!)x&VZuVMWdZTZ&ZkC(RZCY_V~+^YTEZ+*BC_$u$N|Do3#|5IE3 z?GFAWs?Siy&pN28rws%AYypRoQX9Qn2bVB4L?T;+8|{nfcC^p+nGX&&0LyIe91&r z-GueiRl^SxgT*wH^RBIXHeL76(5O)PxHH+e0&}Vxc0!&X$*}!YZ~J-JHgC#yE7y&6 zBJd}g$_!zDqiOgvnmC$Ls2s7~rS zMA6>V)Es@&8z`!K+_s`6eI-`&gA z)jfng8alyD4gvqE7EgRzssfJ?|5Kt zl6LXKC8&>q=;yxmvm*1!^rX+YzsaJE)bG>N;_;{_)xqy=Lq7yuHZpLc+0R@FoH?H7 z^sj0L_2W5%)6Tkq-6nCC)=9Z_LzjXraZ8+$-A;8_p&k%!x81nWaIrVYjW1-U_l87r zTW{^khOXuUYWIK_G&}cQ{Ivhd`4j^D8&M&-_!%krO{||iRHIW*ga;civnG79IF;-) zQPQ6?+i~&!hl6ko*Ul@tOK>78WY#70Tz?qHT*SkzuOf)3<`oJd?Wl0fG26V&cXygbX1DHrO^qlb>3g5muYDn;F-3Pc>ZWV z@u6o-PIUnD5gUSLn%=e3GAUD@7KYb%zK9D%=v+UqJIPk@;hLtZ+f`>bHi}#6kvW0x zhdnKBv_Ut>)B+aoska=_BqsV#xcbwnVt#h&H#YEtr=_VVr5>^PTX<3W$)ZMVRMR<9 zUL525KUC|FsJ!_Ic-Y(7f8NN+T-7itTMx8Gv-{8{P|S3c?^8s{TkMa2H_m&D$M~Gi zx#uj-Gx?&Y%EPSfHH31iaMa`Hsz<+R48!J4^~1&XS2O`Abu4j4pz!<0gaNSqBzksO zSj9bX!E+Y@%$k!%68HWv$mQaOZ&x(zNG?HI6Erh>~sw zr6Ghk@j;)0xUB1YHv`KS)3;tvEH8gqF5B~>VNR`SoO*ANHQ;3&*gvfngx>NOWJmp? zl|@Br{X#h%iT)~K5*%x=Pb)6qv)w;+@zN=_tEa9`$|nhg8z1~qDP>DOjW7yN>AnXR zE~cVas2P_^jOydsCNJE)l>Ik)#hc;-*?W8V3`>C~pc8Xgc+1$3$x;|9j~Rulg_jy}oBv!fJS*_HRy- zN}UE^AO*=qgyT`Xd1;*Dheql$Bjl1a2o&!*-$4PI#YFzfGQ_)q97(c!AMG;zX|dAj z!CZ8wMZT7d#@KkvdFjb&!%I*OxhRE8_^FEAHZ|1`VXJKBJ`IQ$mzbxJh zd-we2MXj%I9$kWQDJ5v{tc?^%*xgFd`S$Vob>jl1MBN`7uiAYlZzbye+IrKU%B7s7 z|9ki2WSw1mlEI&!TW^O7ln*Z%{@efg_1$FqrDKN&2U%lGga^#_r+oC`uKC&=P>QPLwRUoiYh>)MmsKG9TkN2ydgfo&eT=@dHQm9ucr9|VrK$V>`mD*1sY9Ntmg0JWHDoe#(B7J-Pq$BHF~ji= zagAbt5&6O4trs`QaV0%x$OB8$3}i|lnhok5umQ_tp?(z-HYsz^td5 zu&IoOBgnee;noteD01OZzSETvwSzZX2-xeL$zK_hI&+PZ zk+pUAzY>qzWdi&Bx6-8zg3gw0#5@aqXmxb?&PzLE(dcq5Zl|Zf5KLKVx!KzkzTy+~ zqp@i%0wnp8{{Q3YUi_JS;QsMnI}gJ(=d+p99GmkYw9WZc&XLmyAw^CJ)y7CdPC14- z3l)+|Vx*EzNJpnRpE^h)Q3W_P*Y)=WE;m2p>2Fjv$Vap6ts_mtS7nKY5`!&8VPy~!9y$H?$EN>TA|RlSqcdcPU`QsMfYz}h_rvz|(UN#U zUAUE52YQs7x+5z?qo}szy$vzgn>LQw#^XlfxnJv$*V^vvtSp+DJiE}$m1Or`Jka~+ z>&w7_zdsiRO96Y$0$UL#h6M+*EK%qQ18CwgKGCQTEbqyp z$l$RT!iN<{tuS2lgj?eUKsc>5Ug!cRuC<7 zfDyXX`<6^hACOg;UOZ0|8`!zy62?gPyCl)vUt6w`Uji+7`u>*5Ck35?Y(FJM>GhHQ z_vWEowoS!_8+s)jh8A>;^TuS@I}0@w0jzZSa3a%`ss)^S3nlxJ=u1~)N!OIJMDc7s zUMn0_HpG6ahdX6t*2YXt9bU=ydZeW$5a-3)&;z}Mmph~pzN+4o(I?`3^!bugrB3HwI zGxE*d1%vC!Ga7-vH{J|D4Lj0gHG}w$zP*n(?9BGpJS@HW_7TOftFTHlRO9HoC&7j{ zDrPi~?A`Q{9M5kxu9LzXm}H`K3UETfKt`dewzP>WN}fFG6XY@V=+x1C*T0(4DVtMs z+oI*BoV_FAa~|*C{vp^|My?eUb~mUL5CG#5mhe&sx?#2?)x1_+=RuKwi*{V<976ll zlcTd=!@h^b<=9QB+_ZGO_smZ2n=td5J!sbfhqo;Q8G=r{o<7`_7CysuHpynOD3E4r;`|G?NliwDMD#DWV^ONxg#0(RdY9QY^NK^Of%J>Vq) zNURXE>@k4!4T*>P4?DHfy$>kDNRNS-uHvgXI3ZwARt5so1SJ|&t8UzE={+nrWn2$= zuE422mg;8y@3GOS#jB1V1~*TC#04u>zI$EL^P}r(Q;@aKYTuG|bn>gpEx?e-)XZU{ zoke4Jj*s}ue(gB&K~C2`BCC7fZ>RioZ8v4CTcZ!d%-B%*+lfEk3~>AlX~-yPXv!TD z%3>=`q#H+8GX8Sx;)!_~40pBHE}z@i4(xXs?B$qUySV+vO5^l(+i2Ovupc93tWP(O z2XW5y{}VD>HJvkg5m7%pX^PEu^D`#5hUaU9VHJEoEQk!=UiX*ES32TUPkzk`PIDn) zXB5Ni@2Y;y>(6KT&*_~&N5oY{#8># z6-*RENy|lE??w+oaV5|)Wgzm@lbX?ki>-e{iF^xbDE(TTH{Xxnsh6E^eNO&3Kh^6{ zP~>Fc^|kD2@r`8v>FCpoF`v3>%s(EzE*@JUTm|(|-OF`0(nenX{N8uO;^(^;XQe!t zk5Du+mfP(%`sN+HfMCtHkW1$F5(!IKUe0)$Y}wPBZ=k>16C9YBlw$Eh<@*aAKZl&_|viXLnm{B%ng38UJ z^Dj^ZHrN8&RKZ_tL1+-jI}Zv4VWsA=nbzT#XhL>nWX;;PcESEvUcU#+pkcgu5Xs}? z(n7I8;>q(~JO_cxETAuwoHI}QV3#tVwc9CecT@U#ttjnSP&~Evu7X=tYLMK%;hSy9K*XE31~Lo-O;>4c5l~ z!F;f09{-N7Ef-N%U*u|~t6MJ%zg!qFOT&0W(JpjVC`;dK(V$KN=|q>$fudY4Uov+Z z4u4mA>S;-W6FFb8q)M^$R8HGp38u1V{)y*Ro(g}+=VY<<@a(y@zlysCizJ~Ca*rd> z?OYFGN#aQuSV~NO!Q|H@reoYRP#aWdDjSaC!emd!FPN3&0H0NF2HTT4z8;69JtxW+l>{7~mudf79GI`9{T*|9JuNpMG>RN%#O$7HzB1Etn)D$$;wQ!^j}u?T7S~LAuHW$c4d_SAyLx zJFIvajAM7HPe#9co9{pOu6Fs}l~6|;cW&28L|s^9@1qx<)4~xHWIlvUq^ojg4^UPV zuS$>@d_wtv?HTM#Nyf`Th?ukMOGtD3ZpA`K7=3(t;CtCgnu^b_dV{OVzeg$~gO4Oe zuAZFqSN3<~R-qdu!5{$ZD6QED1A{m%Q7Od$oFfNdVDoBni;{8xah7mND0OsIY(xm* zeWdNqTx|Br?}jH&a+`eIm>XAR7oJwGeXqATeuUw$#*jjpbQXPr0Nlx>(Pg>_wLUYp z<=jeGN@SY(e38WrAK5@2kdY^eTAiO22G)cxw62j88qHdZX?VranZvm{`1+;#U%8H$ zOV#;qYX$g-!ha9{4nF>dW7ytia3BEiqZo)~6uYf6)gIvU-dxmv6u-i7R%t0Lj3}>I zFDPM`x2{)oUAfSK``ZvvIl6v%LhW>4MAbq>^~QSjc0|pu^%`g-lXrtD6j>{^QHzhP zQ{Sl5jjT7_sHa3WIBfLAKgl&yurub6@MY-n_Sd|_Axl}4t{Df3c-)oI#rUWAaR{l| za2`b>Q#{g?)*zQfxyhj+%m0AO!Oz%XR2G2R3ZxKeI1xC(8^RwYM=l0nr1XIO60o#QX#p+0=Pm!u1(oAVIQZ)Q>0m>S3BoUCb*1ET}+OM2;o7U+Khv+6pSI1d=}yx z1n0!`ij5 zvguoETCl2s6?__ydkP4{$wFI4;883jVUUa-g!oagnu8ijFS2-mE&zBtu~FplF|(YZ zktWxUSn9tiTg89)NTR1i$!1iU*8A3DLezFklcC%#tv*WetJHi^uEMyq*?)${^(%q@ zr7HVAuGG?whrP|j4o~Pty*%#5-$J=AK#~IhLdbu>qx=?~?BXq)eC&(Vb$*NbeyhWV zZuJJq!F(7RI-UlPN`q|W{SP(CB6F)@i^;O^LGhgnvn7)KgwG-(4AWqYO$+Dxqa}P9 zUO3^`Lhi1#d8EqUp$|t$*T1=4|86r!D=uGgbN-k*MDrU2NR+jbX6fnUa~mw7KQw_g z;2c0Q%AY28M}H8YDd~Su31UIPVV!s~d23Kh-%{MAqe$7QST>sP?iL?j38kiFX}a|F z5CAmLqyd(M1dCgc0q-tF5r=42G}VXCrYE1xNH8eL4L6y&eV(=9X>S~VEYg}jY#`o- zA#M4*X~5E!z|RiLghK@2<1+_2gdY)wAt4x_#8T;Vq72#Lj~DPn3e(xftcG%|P%?xz z96$6*{it{Y1eCC9xVNRCsLQ(@()BmQMW7K-QUhhheHQsSb`ED0GyagqKRP8 z>PwB5S_i%kvlu$tU7n#^EyG???ss0hI0tv;;jb0N%X(OU5p(ZSKHQ~(;tE*Xx5~eu zcsw9>+`t%JIF+omv@%UgMdc`IVzN_sU<fG>8^@ixfay4k&tLZxjaRbT9x8+=;vhgOfXE{ChmjOSAmdWQ z`qFT&{YY_XLcX|GzALNBebgC3;+;B@#m{kp-2CbyeDhCdQ*f_J)ac4r3xNA_8lUvG zj$K!U=>x^@Ik97|ds)h|0^;w^9}EQ#3;~~V#Yw7I*GTz&C;A1^v~CR^dk*F?w3dyJfQ(e zn9UHQTcW>cs}&V!S6>>y5F;BC8>m5d`+&<_8EEY zydQP>Zk@lcR9`gww49`Jy!+;HTLbc~X9`O?TE^c2fCVst8w4WRiNe3b2N<6uw?naZ zEO-MQxVe@cV6ZmzNu#cNxv&@21c8V_^4ZG6R=>Gkn zPFmHK>Oc=IhA8e1*@_Ie+AKbF#bqrp*LU~Q;Zr3?cT3`S0+it~;Q20rpi(J3q=A1&Spr!-Qg0f>^KepyJ=?+cN8jux zFiUMrgTdR4_mkTl#puJ|&xQXQ%kz zyjH6+%YQ5`2p3hZJ@fvfhS}rwrcWC}jHw~5h`)m>uOR{<<#{<;k^ykF3cPya@2TyZ z=dW00`@^qNd$4Oh(l!U7&-a+m{?1+4wrbPp`h2%;Ps*Tlsy6}{B9#wviChsbkqd;y z_53U(?FbEnW-;&s9Y>CQ4r>GcN5+L1nlcPcqm9lSHa_G6P_O@x8h-4@812B==sTG> zVD=$z3&>tud~GP*!>P5th+I}ud{O^vQ2Ot6B`9 zR}~(X%%N<{z#gkwS@qNryh31?p9tQvn)MrQ!7|>q4BObKI{1HicSUL7v2H`?g`;5SDFDrM<1R#}Msy$CK$B%hD^SpEiCUXq%2$+WUC>ZYS#Br?35MaN3ZT zAD8JBl*kwE=$xEm(Ncc|IG%Yu@K_>^du64soXax%tZXRIwDEUqK1PNI%Lt;#2zQ*h zcIV&O9|U3rXC?G?|LjFMx&7UrexCXBg!58D_LVoO@!lXjhL)Q016UI$0}NSZ0FDMo zE&#VV9??gqjlH8GQEFb3#q_6S6(Pakq!UCEkPi`oqEE%Vt_w>cBv-OOEZG%^+D@3A zifej&*&rb^XT1pTQf_$mVS`Ec5tn+~a>ImQB9R_f+^;wwHsZou3l3#?eg7pI<=uJs zafv~S*s()5kG|_k_$_wa?@rwM>zgU!(E;~Tc7J^TEgnN1Oy?0dOqDnh{NRG5QQ{v7 zUFUFNJk~D=&bp$05V(DtInO*NjpEi!Ww_w(rz0G>ixu@YMM5-Vi_`PZq#=MXEXk== z7=YJu_;oc&?%0d+QuxiC9sgoNOuZvr^}!vHz47h-m*0+OzQ5}^*6W9%AY;+_xJA4pB#A>u<4MMbv&d4hXStca7CTx#0>nnogTk|vfo}b z$fLx){JX(N>dGL!#4wr)v$d{LuYuiiOT2e9#u8A%Wz<;%YlC(Bm4N@6&6z~sBYl5gPo2jfGju)v z%v^jX{*`~}OybOG@!6#1s?yoykN3pqQoqlX&Yk)DSDZ~l$d$3v_$?&n8UJ|&nX+dj z7P6G9%NDY=`Xv@~3}(v~^UVKAEah9voicBCaDnRMo@7k;6siTY(O~w~wOlX{{D~_I zy=J${wRO@U&%=8pSDPdIcSDiIUcY$5OU_i()n7oe=pykgO6pfGLJzGqCpXz|a?MDSNR!&34aWQK%XdRdk4OZej8yU&c%8^3Y5_LhIQ(-z$L4bM z0Oagw&K{%$iIELgosMbI-t%Y6M0@8?8V@o?CGUl;1n@1?=*1tLjBXM|K)UA8->r0f zP2YC2&`GncL6d!JsImVv(p$Ov{eXwn1Bb{jS#a#(ji!8E0KQ{tFJI zqk_4-J0BY$rF^<)do~5=<@8@c=bca6&K{B<`17@@w#0N0UGlkLARWuFUU|3nMZS%QH4jX0nWjg2hc=jMzKPg zKmco4m`ExJVFHqJ#58gyEgiuH0lbZ~aE8S55ReL!rpfaHOv`MmIy5|=F%w&-q~L=+ z#XY&T1#}T!GD|QR4&vNB@*um|RsDN?miQpyVRHu-2$DH$eH@aW4d$!F6e|M1w$RNx zIE?6cy|hN1O*YV_77l0OR_zLusSAvP;w2?DAA84Z&ccRc2+1Kf-<~o!%zf)V!I+tm zzD9*o!XcOt?w{cnYL0B#5D|#65WvtxOj~Bi9*-TKn^BM@07SIKSZVW>Qgnp7l{nX% zz%M#>zn2USlYd(r$-C zj`bg-=v|&|$Wjob97qW$Dt|t_YWkgr25kt6EcIBUNWOPDXHgt*Z|&g^kC)OsPR~GX zA{vMSkPMjyAsDd|s20DME;d9>9i`yR)L#Po4I}V_4vuZ!71>vVedG4X!i-L8@uO6r)@+ zAZ0-Y$}`~-JV(8UC#ZlWnn#2a9ND;0*4z|Pc^|q!D$u}Cg&#?9E4i4^?3|u%QM#71 zkP8he!zN^!9g93T^*(*_M^BUW)kvSs_vw9u&^o5NsbH7yLeGzGX=6Jvn;3Yr@vU1A zXPOPGbf;DXjP8njfh&DK6!4Y%WvqLCKC>_e8IWqQ)_*qyd~$*O_M-7X?S_Q5L4*s2 z6+0HkufN9KJ{5WkQP832sC{n;lYAk)Cx!tC;vv&=Ay7F4iJ|I;6>#6dp>eFNxHe}# zccuFZa-GKsvB8+55Yj1 zg{bb69Ca-|?ohyj$M)xTMhFe1b{SO-AfMhf`Ci_32j?Z9zlu~K+skI zHuQfU9N@w0hWa$<` zzEjhNhv2b9nxPdbd=`1@b`3rnU{vB0d>^<*rGhDocl88`<5*p4&zaXncutcMFv~iA zl5@Wj|E~ev`();0^jziaa0~g)E!m?N&&n(*h?}5=WAkCkcIkVzHp%+6^{8)awmLKx ztal7~SkVeDST2TN^Y6!k`odPV?x02h?w8;yVD|K4^IOQ?+n* z1Wr)Bhb3CJ5Q5txjHrZHQ-sgVb8F^#AJ%bqYt+l;|C(OJ>wMUm zc0?&Af{?EUC!@*+Aw8K895E^{4N;W_%g98zvr&O6VWwBd|8#{?B@V=?R86q5RJ)vIL`K3#U43fs70NLZV$*3x{JVH?jo zu6BmW_lw1YWA(Cz5~#L`ObY+I7@zPo;k~T9r+5J*lUt}ER#hh!{RO9jjo0o}6JqjJ z0|*r=_c^?fMpmL>r(xMp9BEY;LXtQ?E+J`qLJkGkv7x^J5C_2X(u5&Y$p_;nz0b+$ z94RfMh}e&dq@ZMv9l_plg!NMS#>V76W94675QNSX@vf{?W7KYORx48J ztA_gaMWwF%EKEUap%y~D>R>x8(L|OoM`Dk`L1A^>K^`U*9sDr`^7(@VwYK zBb{`WF!$>1xVw32aPCo_DTQ<|eqyWS(wu6yJ34tQ$7IEp2z0EXFbwh_5 zKAxiS4ObRlW?To;>_l)DsDcks4knL_n0S#%0B8~xU!UCnxb*-he(!~EcC{2l6w}*} z4cY%0hq133<^kBnWl6;18BH(li~RY28qhTO?WKuF!7Y{A1%C85H@li92GaAdNy zF4OT|x93+iy9lVLE=^Cq_+ZMbgVrhrev6c47X!+uNs_{w5vKGvTLFQ=edP5zshs!E z)0@KLk8z*bAZg$v+umN3d?Ud(P)8l3CZt)Y_PTXA59)utP}Hhc)P|*A4^>pJYZQPs z4O`cdbX%LU)pEY$DAd>}ma^JVAOu%WsH^YJZtLT1XHszCbpa4|KwK=p093%6i{#@1 zo9j?n)Km`e{e^l@3Gs)G*=rZII{x?H{TE-UeZav~XlRMgq$iO;;YPc6BvI8+y`dHF zCl(fJn3v7_GH0_y9XRswlH#m-Tjc92B@Pk%VxNs2?gNPc+^e}ltQBvdI6!-J=GD;w zu_(nRT-qyK<|UPD)K00*&L}OIIvFrz31INLMsx)^(n~-C*PPIlr^c}hlL)EB$dQm8 zD!M`Kcs3A&ctfZ0*&p$``t*`I{)-wfN$ui7_r_No@hDm#?Z$A%^$O^n;wRk`uRC#V zB^7MZ0Ge3Eg?RZkGmXs-Dz3Mwt(UMM8r60}z67sd8n>*EB|yPX0ANw7CQ*t{1Zp@W zL)Ek5mJIPzf|OGlX|WHM6Vo?wiG%zbfXMzqu-E43z=d1c8f&_3Cm%dW8dSMMfTr9m zO}YEq{n^nUY28OXWMN;TSxGlVAq2QgFo+_af*F|v%UYC zE-#VB360XS@Z=`UD^)zed~!snC$>iR)INNqZj$|LUN_r6Un1OwH3JFp|r;2;4olhPs7 z{*BFkM$#j~&?5q6IKB)Y{}Ts(z!e*-+AiX_T=uVPunK&RPrCp|g)Kl)5YYvM_1j^S z62RM}yv?0Fogk?^d{$i9gFXmUgof|sULoCWVl*E-l>o*hfQ22x z(1p#XidoR0R-{5T$;W2umozYigSZR)PFWiGh9uf0*QYVcrM&NPX(!7|Q%(g$Is+qO z3e$l7zz3WR=_xN>*{cq(NxDBvg&H#zE%1Bm>N8-=))$ZPZXJgu0_r^`m4v!;mBEvV zNiQ$w7umPP}F=URO(f zg!_Sg6qkx0aFyryccV>s)Fi9!6%H0a&D_hbcc!D&7XX!9r*jZx^*b?bzGwV^4o|8IQ3k`j+7qus0;f=L=C8PwJ0Ramj8}ph-kT ziH)sL!@MoODmZktStMTe(~R*V*iT!`M%qbVoB5So4PLXl&@1OLx^D>&kV98XiRH z;&=g^IN^R5LSMc37EFmP3b1?Pe6Mg$bb%t3opWo5Pfmj9^BwZfFKG*~0bJJ{wWk(; z<4wz*!%uSw`)5>6;qgpl+B^>L`+nGZ{!ebN`0;xuolOMlOf2?x+x`}v+uO@OWuV7O zseM1dk!D3(x9+h5{ui3=b6L4I@s>9j3y-Q73xNtiDKXC+WZK_%!BQq43M)~eDmZ@q z0=yR;tpp4|dMX?sHf%ku_ThN!?N1;yI^jP?hV|gqr;d-0p~fNHD@=GL9s>{j`$&Y4uFV$M>H;Hc)EQ^G23M5YsfY4XNSc zGzkn*r=>i7;@6-?ImJ1dYMJ^+&5O#b!ur^~`S8p0&zWY{*)r-x<_E&i^Dn8;oTHyB z1mL<!o@cSErUqw)0GHfL^ zJfBK5iXVY-zNnd3r4maDEUMD%_E)F*zpYt-GXc@2;O{@8sDr`NPpVuGlC1# zFJyt|vR~Ur-<7A$UT{M0>`roI*{}fi%Las5?RQOx1TtV=yn0@GcAlHmRSZ~AtzOWW zUDzYHs28xvF{)nNJG;0~ZpkuW$+mjQadzo|+_HPX^1oa1XV+^iyl7`uG6H03&#A3Z$AYj; zwbh$1qhC`|2}ffKLpTUCy|w^*ue13qc;B@(l}pe6#J%b?W_WS;wCCcQ?Xcw)#KmxjJ<# zW^uI2@z%AOyGdU+W}e)-J~u#{>WAYap)ep;FNOJ;C^?ZxxkOx(R_|EbkI?uj9 zVW2J2`?gkcX&!**_2Um(r4n9G(honWcD~#5aq4#5=KnybbF6ee`Tc#jzbuX%8~6|* z!MY?bOt`EQDv5?m>S{7NG)cqh5SRmc7}9U14(PYW?^RsZ_j=tr=X+_u;LhLQJ6|{F zUJMLyH~^BsroqL+*>toDcRkB_Y0HMpwWq|v0 zHfqbo9$pd4m%PKSESLBtt}mBTGu2kgLP{c5%EOzka8@d!de&DeV;-ulUXFhqv09b1 za%HtT^~d^Z4GpQj#$<>^uGMC#w64|V7;dc9=i8{SHxzrd*2B*G!KWzOKCM_7Gc(yb z)k{sm9k^r{%qIr_F2V;}xakG**Xoiiy}C0U(#gtY>TO3obzLN5}+h z(7eHaPwFV8t|7*ywat*B)rR{1s|;t_z-Eyrw7ZXyAMI~*>4jH0f_M9VnU39f#tZ*U z@*)z|$}}?h8T~!^T`uy=*gtI1NA{XtVDk zj{pRwd!2MBgs3Cs)7YnbU-H0BoR=QgKTVewwsZ4*X0+-jkJ9vmK1RVHTKeOdT)!@g zEQ>n!Q1)yeI4PGNVKxuL{YUUh?X*q5L7K3tq}lVl_4 z-}CGUU&upo_IXmign?Pd2-?&vYG*!6_1eyY{LqTRB1(-4$><1j&Jcm#45GW3>wHOv zBfJy4NQW@G$?Mk#Kg>3HbKN*nYJ5EpaE(vo_XpS)Y!A$&)hQ*gX7rZJLvp`T2s9eo8LiT zZVR8sgCrrhE5m>t4%EOf5$2B>!c1b?7*7b=*qbHLKtt3N3#6B*&5%uZ248uO8AM5w zv}p)#kA*9a@|GrzaV2dib92#tS-d_;=Bu~s1ow`mIhnFh2S2ccv8=KG2uem)J_8_f zsqP_5aKE)gD>#BeZk?w)b!LRg9F}_G4Jry?0W%Vr-;Byg-}#ag;&)j7BARAcy>i}Z z8u%`@YfB%wh;yfA$b3)A&1)Cl(dSz%RS)GS$Q=+A1}S`0 zT>5G3a0C8yxcxgGT6VTD@I7bMj6c{d%`X-w*-=9B2Kaz)Uuz(;Eo!BslTD`IuOuuC zs{5P*kwOnum&_bCl#B=YFS)ltEtydgrIijdgjU&Q}Z7iT3w637qF+-wVxhO z<%iN?eB27vo?g*wJUUu{@s`&Rp4HI|p~>nJA$W!>u56~6;_>9rqyW4Ns>9$z2B%ko z@Y{{YHY0sg{2um-^{n6cK+fNrUjrp^N9X@H5QYGiA2mH5InHiZ{OohxIPW3;c668O zX;~lVr*)$I2~VP@8#*-|VMQlNVW?4(f6TMfF?7Mp)NkCkgYxJAiSwDJv;~pOx23rWDIr3tJ|m9Wx@7M@ zdzlu1$1XqpC6W@REPUs2)c#JAnauLr(ULA?#Ek>1=bk#t90q|Tl5axJEJga)Sl0gd zoXNeO{E~1wKV#4RB@J@=SaX`*4dpXhdQg5GC+pR7~qF~Tuv^mqsw7%^-QJ?3}x`rYZ4 z#Gj;U=i2`vckPl8XFh%iHIfEC+MK*!%MT>+G2X(?e;JlPZf^l2K?AE<&V5(c3M>CC z5f1F04!9H0Y9ZC;RU4Ul>zC(si{tSI7e$~tkZ`!+vKo*z>fvnyzp_N)w>xNw3?L$b ztXcx&1nt_XnRG}o#mjTggBP`RK|TpoY;FjuHfOPiCn{_mhoo#J$2G})I3a~ogurOfG-@i}5)Iq}{Kt^JVt^Qx0qcO>LI6kCGLDCfu6N3P z96x>4RcBczA=z8*ZlY+>P29(3P+;Ug^6%ZarYsG5oCH^7CF1fS0q9IV?D--B8s>V= z*H~18h#1#_jCz6s;b6&5Mi~J-jh4IH#8ZWX2ofQJR1qLQ+x=j6aaMMUaY9AXIaP14 z`}WZlKYvl4j(BbdelyMmB@2X13PgMg#7-4Rlov?dDUf+rAh%n9lPtuW6e{@?s+=k$ zlozVsDb##dsJ&arRYrA9iu8So3{Mpqmlv7dDKdLkWU*UBk}Rf}6kGWe+ng%4D=&7q zQ|$Dv7)DoGI3gkmgS-C59>eEBu>D|)Q^-`L>7Ufm$JU)__UK07Z zM6|PX%~bZkCAiy0=u+-l-hB(cJgE4U46O}?ml|3dpB8PQ^AjWBy#!&3#`#zV& zv4;FQMsuZ*131(LqJfON0fr8nUau1NuAY0Wf7Ax#`lwZ<;H3TKhY{GgMcwXGA-;>% zsM;#1j!}#rC^d%gB~`!=F_Fo!ZRJ?c@?-%bWTDZLN5MpJ+iYCV96r7mro)8NArT$> zFbcIuNFCO7-_N3b*t%LST`#AOeZ2_A!FV)dBqX}Ph5Ke`NWCs^nXx)}{yaG34vO#s z6MFV&dY!sMO(&ujj%~0^Hb{J3)A@>HaXVe2Ifm(#+~}Q5golvs#>0|`Feeah&#WbO z0|3eL;1`sf2ggq*n2lvLpvLfoI}U65oKF&2^^T! z!N-Vffnj0$I$){!WqG|wINOl-1nQnG=#UIbDSJI-S*-7V54bSjDsEKgso$GYq&a?2PdB1LJQFCQo3#WP0Q{_f=@O;za?wx z(v=f%0E@6oYiL89XoEr8&O}~4F=`{XWYYi(M|`<5>0rx#ZwUyuAGmJ^kf0I7MjzAb z-ws{RPIGAOCTZa~`+nTwL3V_ZKxeq8^D$dU7L_*^^d&U9X&R_Iza=KBXQ*06#5pv_ z#(DtCE;JdAsnAU6V!-1c=<{0)x(Dgkvzd`Ot!!pl3d#BH8&} z2-w#Rh0TZstA5PM492Z_B5Xg#yqD zo^l$H#L~J^UobWX-OUS}-GXCvPQkF=r@tSBk-dmEzCE6xlsJ?f1T!}UldQpMuBulF zK6C`%Hu_I5`$HA_VWfVTf*)+~E>D4Pz42YZ#T$t6eq#U}XYtu`|M?S9cN_igd4j7K z{1K@v9?T#zhsApttPwp_uMFPs^o`CMfYuItJ30Uz@Bg_s2VmU=G+CoJ4!)~AG5b4H zBUMVTuWwQr40O5Cboaj5^!>=RUg$Vf5C@b1hfrHEe$k+#q@XZ%AZCmstZghB7ZMiU z6!y)!`Cw{FyIP8`K}G^4{Lxe=oDK=w=nQSY3G3j2eF0WOkU}&l1qj8=yJW|MGEFys z8-N~Rq24QQCy@%yTfBQnd{a_E!d^j1n!L!`z--OK0fr#e2^3g9LQ@H^6&*?U3p-L0 zb~G~t-WiHZKx950jzKY$a9<+-bZks9PqE%rMGqw0Zyt) z;t%D1Ly>d{+8Hb-0%k;TKkbkJ4MHOVgx_T_93N-^VBXxWT8a7=7QOTO!kdM$&rwHj z8zw+&QS$zvCcgu~j)u98At13Zg;;^8iQV=XK2=aR_t>?b=xHRdb$LRCdZJ#;SJLIi zex~2PXU8GjL7vtNXy+t2>_!{qjqBik_o5Gt!o0$8;mCG`3)6CyG#y(%~dk!6Yz8{qU;1X1}kRT0h zK96ah=g(G+V?9w|@r@OgM2H<#Jzffq?BzV#>i1la{aYzXS&az*f1Eq}3k9HCXvrcgQX|U_ z|CWs<&T0w(47mj*Z(8L3)BChfcR4KaW!XfWkt!D;su?$0=0nc(vFj{08mjTMnEx<& zLAm))GOW;~O!rd610vv0#lV<(Hm?@1OI*0MbXRb1${j1Kgw}|puAK8bhg;4tjN8U| zWEc4nvJ*kPPzYR+Ci{LI3?iDqvFDEMWO{jnRXgYBQ*QJBxM5wpVU9{ zqiVLIRKK9FZw=nh${R_XuimO{`F!^|pw9RVSNMG7UADr$twagm=}(zoSI^7UoQI#4 zx+~#3U<{tiztY(M)oku-?#p)=%e{{1}j{JLA`EY9wh)$A$@LAvsJ zq}V*B2RIAE*9x@QJm%p%EaqD-^^oIhjoe<$|+oecc@`t0AgHGe5(s3jG#0|$s0 z5WxpWM5$eBIrTdsd0`;hv0whfu*I+Ln%p_gziNKY`?H*#8jjHrLIf0=yY2~K0Tw9@ z!7pc3<}y#oc1DUeEKce2>oOj#WA@elS z&0Hq8s8#??P`V>Ygvq`*_Lw5zr{1;nYD>Xb49HL8t~E&~g%NoQL-+FOxRsC0O zWcL0^lOf<9UX)Ez=RYan|0@RQr}Le()2TMRaD@m#!FhFI2-6N6#2{|$29k$CB!AZ) zCR*|vEp=E5?t|-CVQrNn{XKmZ;;^mwBIqo*xst?z0r9@_0{E1#k7X0O`V?bfjH ze&K>0T6Y+65$J&A(5WYanPRy78#m}?)ZuzGGMu&NpSmRLoY)_SL4L?XB9*zHhxgTl zl|e8RCi8FGG0!qq8fWkIH`(BIpgC{ie#&o;ju#}wcKfL(;C;OVo~OH?xCFhhHu6t+ z6MD=4A;mXMgn^ zL0aCSz1#MkILly~{7Dn5vPPz+K z37Nqam}sL9&jV7=AE!$nM_SXAN=6iUU64%1VF;;(+^+<@9s1Dy>Qk~|FoIx%rG!5Z z0p!r?H&^Z=@+FFgU+hmgc3D@Wcx?RhpSUS=dB+*mmU5M<{d~`k^(9V4KQcc#b8_|G z$+?t^d^Cbe7KCP`5|gf3-){|TqpHz&Bj=zQ`MsDHMdoCpqlEKT{F4xH?z(v zN@3#Cbw;RWsEOmD*M%jJku)-w)8x_@$TFAezz^}DjxmmJkTIj365-g*YXARux)XP( z{K6iWNpil``x zl=;o)zVGkvKRDN1oa=pF@8|3BlzTihivN0wU&ZNUl2ePaetXyc_~fb5kBCT&A3MVifY9Z2q&D*sN6w0N(_u9K<61u`P7Hg>?&UsE?&h$sTm%#9*)51JrE+3-tf zWExFZ@?}Mll*|rZI5b@)Ivizh_~78>j-$qMf`RxL@s%XRNTO(uKvdla`z9vDWac%&rq)LhHXGH^8J5J892Q;Zd ze?I;K1CQ7D;?e}_iw?^lB)vAMR2r{)Z5F#`k$vxlrEc`0xO(bk&bzKJo9Z2gV*|Gy zc;A4H-${|iaQGx(9M;<|*seNqxLs|0d1mHLW5ZL`aVPCYN^Hj2_BfxLuYJa@CN+9* zHu!eMOuOIJYx`*PRaoWp%)>+cjp5au4v(u^vsc}Oi+mf}>~QrYN` zQGuD-w{Sawim{lN^0fvUiTx6m8o!z{JjUgPIl^B7GUK{=(cd~5T#u{XzwG(U-XvG> zg`C%dtby7ISTenwoWQ{c0J$ljKHXrdKD(D>7Y$IGL1Qs_tR#zGnZ6t*Xp8Y+&U0;wiIlxtv0z=(34PgyTB-uMlLmu3RurH#!FK1~-&&7GXp5{j?db2l3f_XMEv>GcV4)%%_{4@pnBfI#n96 z5qvuC{is!Y=le?`_ru)tmE}vA#zrj-!hH$njQwMcxT@gnM9;-wmrwv(ru0|7wQMIg z(o16XU6?u$t}v1U%p!;pw?_BlA|srf5GR1+=gDq=L&WtT-f!~oIw>pBJ?(YsgvXdu zf3kDoi2!5aRLS>rkE9hME50j_*Xcl;*S!Ma2hSZZ`P_65SS5Lztb7BFuFWcR8s#Z-gx=&*JY+iSrWF@KxCnJr}F#mO8qJ0)qf-X zKdRpUx<7K}n@4rB+@V}hW=!Utca+Jtl50kq-j2(U3HR_PF}M{4^ezDW+iGuuBXBgy zH|&($uG049@29@6E^mOj~qsgVtn=`h$ zUqWtKD?CwuufTvAFyPfZA0(>;%qoQhth#<)=Txr>CR8!RP_Itbg?UiA=J=!^u)V@c z*&hS|O;pN*{_KW*{DL%2iUW+tZHgLAO7)=X_$yC(m> zgAX+%KOD648JC&JN2z|i=df4U@S&j# zA&-^fW3f>Z#wD%ylt;0zo z{dKsZy^!^Z(ns|y1?%mb_THP1jv+=8g!Xkn4=dD1j*~_bJx7wlMv@apPEkiv3Pw_^ zN7C+%oE{oUpB_20IFhkBauzWP35}8!M=1uQnWRyw=V(^g=()tv^VCsV!6?#fUsza6 z{NGw*G+6BzRfXID$Po{tEI0FU>1L+juWx6{1CSYm>`6ob2~Pa0xgVFC z$VIt^H~_0kYnFO)xde77r6WS_aYy2l`_w0!XbOg5!j}TMY#XuJQ5!#f^o6!!H;|Kn z@LG&lFaY}g;z^?`j#u=>khvzPhwLX=by&{M4cf_kVL^M3P|KFfWZQD4+pyCD;|rvT zMb85bXv$J$maQ0ud$!9p*z}qQLZVqFcNBb6aA0Z0B!5m^pAHCNVM2=N4Mo?V?`k!~ zp#3K2hycXlMqa9Z_UGQS-3HpHoLogh=5o5l=T-AXphplZpG$*%D;uEHn&0D>=3oE> zF`#egI>)8S%U2*c&1!4l8PC!rZ{sr@fxMjpP2>!WI9q)&m*Gu;qX~#yRsssaqx>L8 zJWQR+O`u79t(A|;A_rx%?`ZgtFL1&y?sHT4mqGU400u&>JNNM;09hCyRZCV@1<~w~ ze<^V%kC02KvJm4FD7Z*oe?d+lC4Wq zCO0brqm&RaNIOCC8p9)BLGi!?8Jrj>P6xTrAjQqoKFKrp0vzLz$zkGdGBdq@X_~?f zGfaU8HP{7ivj4D)-AAF|6y-oY8oINY0>Qm`)HI{+9B7~M8=g7+*E5F(93DmRtRwzC zoe5TY8De-y`wMj+1C6SMIZIOoOkPG6zKpJU8PonUmNon`Zsz6DrI+zrFOMN#B?!Md zuJr1J;j5E&uM)jpC569API`4J>s3nOt5n18pR4L(+Xw3sAd(x6y{2v`S?d`Bk(Jnh zAxH^_!XFD#rDr8g*-LDI>2vB46PR;nE;(q{wq*7~JB3n`z0J9}&wR)mwz4U=lNCEex3~Hup(TWVYIUGP~Ro{iw z>C0spjTE1(A|L9c0|31N=x;LJd~aQgKB!rMKDlUR^&4vuviBHj}-Nq6L`k zRGeGwKNZU9QZB|@j2I9J09vC!PcLA=N@?sKf7{#pmOSa#hlFI8DOL$Ev26+oph-es=)G3?+={E!LTz7?Yt_>W!9!PCvL1M->~PLOsAOsEKw z_7V_Fx!)BqBrZmlX5t*9vM2uex26Y7Fv#2~FjF7ujMrEuK2t{wQi*P#)Iz^34E)j_ zNb&jbDFESKJ?POe)@u0ir;#N+{0-}0yWarI51CT{$6W%S+s zn7jLVQS)E1A*;ePDRz%RE#mfS{{e2p&Ea`X)us-h}7`)oP`XO zUsIS(H4UcT%bC)XF!nY(PZ1TwK?awDvuKdPAxb8VDvtvkE5^w&3lzd-KM2f?Lhc%N zZKuKhlpF-z!Yu2;@|d}pqg0j70#pEkE6n#~O7epfsv52Te)qnp^^mvQ{T3#&b z0LbmeUl_Q2E=cGR81?ZSlboYX(MDMtJDD4t^SZ87j0c^QI*BnKg)lfuNQY6}R0nzTX!AY8sx$Eg+W;39M#g?;NB}=4 zj$vLJWgmwJnowl7DWlpzOVCfT=3`eQ;{-!*0CYU zdW3_D=29k>dwBChO$%=pPX`{oveB6jLZoHkkgB7!&aV{4gvk%^)$zdo{IVDT9BFmV-t8d+Bc-%NnaAsZxI#-@Tg0fM ze_nWKT3M8dq`?aqCoOe^tv@F^^uvF>gYrfx{3ftp{+ssab5!yovMPQOMz(%WCvnVe zWlKUlVl>}ee_fre{ONnm4>zK&CF`)bDW2Oxdz;TbiS+cht&`o3Qnt&650{!O1Js}+ zDkERXIJa^`nELnI3HQwxCo}mcfr#A#yBCsu!4@Crg{e)amNtH)Dht{D;tRICz8l^4 z1j^xUfK&BEt}6J17#8DKZB_)CqqE#b0T;I$TuRv(03O^&zT(icx3@rEN1@#S$}$Y6 zYH@{N0jNrHh-D||77m{_zrKD>GyxHyh{=lF#tWxj;efbl>v;*3oz3k$Ahkj@`NS^_ z)qDTdh%_GQ><~WSrf7C`r1_a=J5yt8zaNf9tL(OVn_&MH@Q?oz^pahVmX%kb&6}fz zD_~R_a+Ua-vVM-+MCC8*#Hm#EK2CdH7cr_u;V1WXOJ-~jySiyXA^mCRY0IGWhqAQM z8_(tNE{n~7{Z`4KYL=8+=A?HfcM6$+0Hl`=$_huYyOfQA3y#;su5JF>>9NY2v@)FE zB?rNLR;+;SzPx3~Zj@Te`0I1{-%DAV;pnIJTjJ9kkj%LE^^`R6Ld_?qGL}#Mnc)SN zL@}Ihh>w!l-<^&3j%&9WvwpIJ>0jAI)e9x9=OOtw_%(^0DriiOT=5NPKL`mYEUfrl zJ`bQ}umDz3Y%$CD7=oP*U0#39TmnfoAGqWvZUItX|KhQTT#0Su6I9x>W2 z${3(>NzPA?O{oAH0RNGDdTXK@2KH+O&~*28?^ z?D7u}A|s1_VEN@usvT7XEbs$xZtM`8|NUqXkr$c0&H&&;HvBjN2RwAS8cVVjeqSax z3>e^36tDcqi;}-!Sxp^~c^HI-kZ=Ic;N`~(!4Z6k&+U_}gMlIdbVDzlDmDpT0!Z|Y zumX=eW1*$TU;qp-ufoxQli!vj96etY*Vx9ic)3XlRBu4}7b=-3ejsPg4ahipe^5y3 zKm{xyS3q~L+8Sl5XbU8)C>0g$cT=dhBGbv&DMHia+gAh@$8iE~cw#L$1Tv~F!LZ1B z!w0}~IAZ5;WO6^s58E;DKQ4 z`e0YPXXCNCPVd&6(@kB(TC$%AU)FCoLDL>E4|$cKh*q_?3Zq_KX*r1LJ06(9BhhT@H4MxiP|54gl%} zsAhc<-@c(X_MTxJ@-c${D_z)42&FwSA6?Pf?-eSvHH|o)b8nygc}?Bd;iYGc-bB~; z8ofQ*{m)qUmxJIw%8b!JZte|Orzi8=eRk`V)MDPwdK}~-&xCFuVecyf4@J?vfQ4#Xl=E# zRC?Cx&q{s2)$Z4Bmet>lC)U>gw%(q#-rHI2w`Tp@WmyAoRR$=~3|UIj;R3;ooiGP$ zc`nhEKH-5|`x7Wae~S>^GyH4RHFMlXkR4%k0863ED=bbRN0Rkg>_`;Z9x;T*tW8Vm zI+b}C$9uB&q4baD^PfWH&U^~WJZDKoh^)`0Nfh1S$f);w-%^RxDzZ^K;hZT+4&r`@ z8WK#od;E$=&m1T%KIRzn+_qDr)?!+}RF zxwkBo)II7RdtIp);Xn`bDubdoasTTIJlf0``wQW)aDo;m;CvVrBj4T=u8nLVJ90yS z*{PhUNYz;R;-%te@aPF!H6w7X^sw8!Gn20>yYw7tz+d9My{pstVio2h(0$ zBxo*4m^wP?WVBp2e9Bbfsv8x&s#_uL8EVNV@mTvZy&SN7Z6*0;;;ckLp-8W)z5bo& zmrf|61(|kS7VD6U7?SM@u-LGG8{NhQ(z3246Rjj(xp?FAKwJ{><(qC%rBrnD()qSIa^GqZWEOuQj zO1gfnVcz1sgtyaW!*hW%)&3mn-a^;6vZd}-+1@Df*1yu;EM=(~B3M5=Jg(WQ8abUqwP&lTqocJ!df6Dv|~x+aYv6+#Q;A3_D;MrE!1_U*f>U%#gw z8K7}zuuW$D5_`tQnU6a3pla)Gz`L&sQy0d_9Uh%ZVRr@lA0KKp^UNZD)$*^C^f9qH z(GdJkE0pz6%bjE7fA>dpPEn4A< zFC{^QL!AH9^IHu^rSnZ*M};T1MZOFEWc6U=)CZ$SrW40)y%P(xJ{bkt zX@7giY4l0{Y)4Ia(bw|NZ6hncR-Zl5`d%s6yKHa$fFiY-W$94s0&Aw%VNPW6u#!fF zl-PZ~SFI=*JH^8Y$8FmP&zq7UZlC!Ve&A|il@LDytw0~RXoKIkP~y0dd~M#}QS5|d zn@@r4r=OO7eE}5@Te_w`=)T{QN$kx=lOnjCwg15XYv|O@_-4OML-g0|0jWg|p?30Yno_#ytvMzhC&j&8Q zvHx}b?AhP5Z(skMIBT_evuUTBOgi$SaPM@{*~G7*{ktDnR@=sArW-Eb{>)ih|Cwsq z+iL6o_wB6p-vu4k&Q$;2uYT*jpG~ZPKl@pG?3XaA0^r4gA{C$v4yIfI)5fvjMip=? z9KyZ=(dw73NT&yQIaOazivswGB#bIJ=7Z1&G6fcM>=R&|6@XG0g5y91S09f15%c!( zBdKD~ZP5ogb`%}$X17cWe|Y`;k6uVL`;9wcp7aNAc39gq`_7vj0Q z57K>U`o27kAcwu`WVcSl(MI6-xkoADq?BOcyK<5pm6D&>-vVjm-hx zC~z!iKo?8W#AXg67`h-q+fmT4m#U|muYZ(ao6bN54J4^D1`iI&3W4A>$cvxRox7r4 z{FrYIkokK>7RKH@%f}DDFgiLWmEp02fUr^wC7}U<9vfB#H^}>!=}uzsFbBBtM64oc zkV2IZAt?q`DME9G;Zy3I1E@~2oP|dma~`$^32A0k|CIv}@~a?0Tx3YzXiDF1>gr#n zvJ)PQ%QD|XA5A{GmcJ49* zkEPgbh4{Q{;f`zuYC9{qizdj}Z2-mnu54%L$ zeiugv7y-i#I05$I(ROeQ;#`p<6pq$3VLOrl0$)ff8&GA#he3+brlbgdpU5S4l2Rnf zQ6z5c<$sThr#O=Uu?PnxZiw$5ghUfKJIO!}8FZoY3V}yo-r{f@V$-fy3m(S^Q)5l3 zM;wNtAE6>HD;_QhCWZz3Ypa|zx_wf{HPh0E8jwv=q<|!8D@u68pQW?=vz^hm%!HM* z{6Rz!0bmkv)mR>8$y89asl@s8yc+qi+YWyeGWe+(AR*CamM@i%h5@Y27_RW`LUlXURipY#Sd>B1`*FKqVp~l8CJ(%h!reM*2vo5DUUjRLz~d zt9r4c_F~m#p!#)5yLgg4Nh%RCJEKHgTk<*N(3pA~fK<-WR8ryy@=phlR3c~NkdJ`# zN2t7&jg$!?3iDKRZ5|c!ldkepb6Q_(oT~=HA^^n!fkmPaWaFw?3qb!TAYQVfidVzR zU#@7nAlR@h6oRykBNr7G7lV<8(b2`%qmvew3S}ar>y|GX-MML{UJaXYMiZLHN=UVU z@T8K8DmGEAVB(*~conP?f`=ay)3e`KHN{dLBk- zIT4){7jycu60vgtv>?^l-+6FXqq`$^$VH0iStbnw3|t6`4r82*VOge4KahF*ggBjZ z#o33=Wq1Ld1Gk3wd8Y}21&k6)wMH{)zuI|5-qXHcs}3Sk0P`*0Nox3TS#!+ob60O%nfW&5|n*dLE5(IVd9Z5J)8Jazl>@ zb<+pS&tpl`2OwlE;gQv-Ok99pPr$n~b)%P+I;tO!X=}8mAn0gJo&ohurNiB%<%$xg zYhf2%hrYfmQ3c8fvSAEhl#`gQ^;)>`bB6Zvx%l)RGT&kaM)#>L0i4Bp+cN-V&uK;h zTlZZc(LdO31EDsLR>+rDi?w&t_utAs|6Fzdu+Pvd0^-|+yFavbei}8MExM7K4)D1^ z<(?$OsEu+Iq!JX6>UQI2hR*i6rtQ8PH~6pab78;H$+n3HJ`<2|PjVGE#id|m`%=@t z4?26FbT$LtrcLsGMOW^jngMp)UbGpM#j{{4%`hE2+_)KT%|=t25w3WocQf(`9u?V) zI)>*s)y#1gk7idt5<&KPL-i@~9G<;=O5kIU*9-96f<8yANEma%=L>k=&&|ANWqCtL ze0++oDGe&=v^jwh>K z`g2138dU`W4+>+DY;ElHrOlmn`?XGLoqV`2*T7w+-QCso9HO)UO{lw^e}BHjS*kwO z#_+TmwG+l*-L)b$zu9!=wi%*aY&Lyub`4=4>0lv9<>e-@t3%vJ+Wns;ePgViaD&YF z*CZLDV=o)>!K3Hi#Z9Ee^-vmg?hj&`$uJj&5|*UP)O87i#(ao~Z5T4~(Lt#}(M0=5 z1B7rcg--}VG8u=EIsrF~Vs0C)NF9AwEb;lv%l}3Wf?;poe-Z1 zS+tWymNlWMbaq$4(6>f7Vm5+x8T=6A?+1Id6dCJel4VXk=bd8b!(NN|E$MFpI1kZ6 zQ-};a_Yu&bHicV~Biot^uZDR43fPsUWM`VB>?57GMqCypAv#lr)J*b3O@E?-?f&BJ zaj7BW4D=c>81KSk!H~~^e9cS?Tp>j);;O>hRS&9oI`IE;eOt} z2i2ll`L|7P`jTp7UxHx+2iJ+lLI{)v;}UxUH2ve2AocdyM|E(*9S;&h3eIYw@4U)3 z1L$d5uB6)Bv^r}l%!jZ75|CoQ8dlS^*mtoxHJ6TwH@-C^_M|m<58b(M1}vsEet%#) z9V_SZpySwSzXKPX6BO{hSJXwObOi`{MkF~u1(5<0E?2>>V7KeMq(%TYhMS;`9TG}0 z01^&`n2>rucK5&CwOgyUUF;73)lCxn+jr`!?K{|cSa&nmxxSy~z$UolK;@$n2V5;4 ziXsNgNspX|`WMVc6fB6EpmIX@CONUrz%Zm=dM3raVY51&3b3cYp@S z7O`uaXbHsiA|Qse35+`^l!zDv)^lE;?HxH{2{8VBff1%%|Gl%eBnlBE3QV5xSJbS9ajbxKg9`dIwwLkx z%*My{m3qY=Ppnqj2pyt*TSxlgGFEBG3mIOjME|HLXqkMu^%edLRfLrF0I?0fW>-EX zrAd%NJQ5y#rOQn*KEX-sVKtdh_pC`UA%Gxc!Y;dF4S@2Tf#S_8vp9gy6YJte2pY`d zk+oOcenhFIAT->zYw4A?G)`meQ@#1oeb*FqZ4y%_!}n88iVU^*=!Ftpi{eniW(83P zZ|=)e_Igkd?Qz?+(!S8FFvhFiyCq`gL1CYS8u52Fj*{pfkY=JfCHb0gQRZ)BX={k`$|RsW5% zXIU(e+l>Lfomb?ioLJ|=3!zTeN&p695I3bLid!Fr{!!UV2@wZu7h*0X*Z}JO-*3*M zUGjPXGap64DYSZ(FlAP(f}i61bf`uuUqbtlI9R)3Um2$8FiOE6k21@%QrB~k1br6r z*oXhcn?6oa0;3AUCoxZ?0}{u^6q+h3M1`Nbc#Ipqj++`cp3Cu=FkNYwnlRsZD%fY8 zFa`sHgt$Wxci}IW&;oG^6b;Yt884snzU?#KTxP+LS4`D6h0ya# zqgfm!0F%a@zO70J|8oEG2?1x@Umf9k)A82Vx!2G;Dh~-2NyJ-vO{cCjzWQ)_W8C}W znVqk%KAr`6#SAsLiy1IsnBCk(OM5~EPU6lo3Q$8e!yqwS3RK}_EjUL8QM4N6OCZ!) zs;~NM+Q1FjcM3)i?#QVyQFK@U$4fHB!=41bJp8GmYBCiN<*a%gQFdPM&nF6g_Mvj5 zwYx;*F;pHz!8}SBdsiD9SW;1uq+C+b7%TWEvJPWryUgty|Mu(sxyydvx>oMK{nouP z@wWd(dZ#=@p|~xuE=f&j(Jndd^>K3&39)W<{Tj#1aAI2%`Qeo2QMrbvdGmkOo>{lT zIHfPa-m6b(xCU&^96t7b>s4@Wz^~WQDyu&jd1jY>yh;83{`W^RU*Ps!w$6v`g*?}P zKMvfoh*^4)pBwmRrLO72pVgLUfxBP3zJJ*LKEQY6@5Y$U$G<NNG=1FL-FS9{^>61p8_@v82p}&VLK-kZ{vrZWn@;9QWWwddh?oO(its%qQn!f6 z6Hm{S-ehtRO^C~{hd_>2M@#`ux+(_?bca@`x(DU=OM?idpi1S8;|OP;9QI8Efin^6 zd@My!svbjwfQx5|ENVj`5V3GO zSrpKb86bIw%zsR%wUzmW^&}a{3lMFwLQdyV-0KSPD8k5)aM-1z2!@!(LAv!Gzt4ep zp$8infVKb?G>8j9>lQoikH3;%J}t==U<2do95Q&USIy0FSWr~E8IE^b;J=5%AjHn;L--O`CRTA9B2PDW!ofx&V&H~N!Z&S8{<2r z6tN8(CD9*Wx|CDE5c(vq?UBi$8GT_6C?3?1a!zDbqztGu+YH^>RVAlHrQu z!3$09W?$6mJ%coko`B*vh#@wwVN)*v4hlQHe-;B_F@xs`2Jt5p|Bw;uj*p4%L{3EX zL)H9I7Ycr+&J9UGT;{*Gfz1j-JXdpN!61?V0?tRXW7D-@dDX_TaN)zgNxoQRDZ@Hr zrPu>CUxws33u|o^(ZqHEs`kd`}}gUTBr#sDukFr2wdZc#j#PA5x5Y*fH%g-$uBdJEEfw9{!h^XVblyN z85{sW8i^mkVXmT-N}Z0z!_C=71Hd*KnlTs@ovRZ2TM%9$5B!boJ zAC!5Tso=ug>iFH8i6JaJ*bU%>i*ePceNUY-?^+Nbblt?n?ML7~zA;)J&?;Cz^KkcF z?mHOjyZ`Zvk?wYgV@ct&GuqL4WnoG>#bYv?3?9Nw5NR3;8;K%uQYUei^!rFWov5IT zM_L0A+&AcxpkYO300A(N&7g8?f-rSWmS~}7=53QBW}v}6f{Oeu4G?;cJQn8-9E$=t z{}80G?*{ns*cRTa>u~91=9Nk}Tj0ZP83tYX2(s9m*eF5qC;7Y#oD6ev}nR;FZ z7N-^MB)B+!{CeBPI*7t6#XJU^e0ahLizGDhFI33R-kal$cxxV6vug7(p;I{ib_e zWJVCjOXiGk_adAnGCAR91L#STcmen1|L5%DlEuF5OCwO**o+`nc76zB0}8XdJB8Ql zeK_b^HTv&YYzx}air#{1D&?OIWf|-d=gFr0N^YT|hoW@ssuL;TahS3B8;n3=o~b0D zE6aG=wl`JF_x$sjelb9kl`5EKOR_MhwueRrHP z83Z%|JVN$&AE&gl2u zVMf0o)4xxgqb+d4bfo|T(oI!D)(L-3a#_=Hwq?gzWr(gYM&MtfayU}7o)9w4+4dK@ ziueDQ?HEB^C<15QBqyfoKdFvAh{VG56f^b0Q2fHIJpM@7Dk>CqMc%x_Rv|(mH*P^! zK2*osm!cu_{Q0WeP(ok zEjQZ`Zjy!)cK$T(m_Y#NAkUi$T#BM2SJl_IH?zOUW(lLkek(1Cr%rCf~|wLqP%gKOGOxt>j!Qmhyx6g1(`PN zFSm%}coNknzJ-{^HuQ*cpK??a3PIOYUQ>e0|B1hKRPbYFKh!Gq z)NAw%w})JTC7mDaU-2Qb2m!1!_+VySf6P{*(RR=#OG}OE{_?`li4+7lpY~e1l)J<%?Sg}N(7<;yaI8`2x@{sV#+6HeTEHV^YMC&FZcU@}bG$9h0J7OO~r zp@ImGm0|Lza8&a|i8GfpJDJ1ap#>q_TjSCr$|5fHawY;ah+Bdh(}0TQw9%atn5w|o z{5Wa7n~zK28DIl)fKKRx3LdjII}Y|GBrGn-KJE&P)bvPc@>57yfxVUjK$-sX)YZK# z$kzNG5&sE{NW4iAM93-=Jy3uqq>l>XXyCFz+t^tTIdtFR5EzlWd&|c8X0+-^n9wwd z`YD!rE-DQbG23?F>*j$C16QqZu|M`Fn1sL>8!REXo%*z^;F%JyiaLZR!=QvR8?!am zVQk6>xVZgr`PO0Y&pzjEMtUlI z8{2(3rcyKbe7oBHdbj)r4E>je#7Eox$F>S?v5D%WfYRsp5e=~u*YqsSyya^%B# z(7i+b%9bh~9*qu(DyKx`4@RUWM;CWQmnVlv2EoNR41xxNePTJ*p--B_kt4C(oj|+i z>YaFiF9O0)aF{ixKG*;{LrXjZ5D%;;Cguz(f9ggA!KqasVw32^dv5s=;&Bp3=#~&K;LCs^aL9K6@Q49im}sJ3p2Pp};^Y1zFcoDzNIn|! zwY5g{L9mA<#Gi4oCg(Da{_VRq>f~Evs$B}zaa+P02N#HjuT@NnR1swuPF5~J`pc$Y z@^b>2XJrY1<^Ugp31kqEGtbxyNWa3qYgsRFiZ#Qv!lRTpC>U6_DV_!3_|daU78P|p z2Xvt#WOftHxtTg(k~5r=yXG$;1mC~>a}dBP-DM;Rlex7sivdC5ePFFVwX3QB1g@$c9w zzR>f8I2CtLaoakHKNNDVNL!|s)OD3Kic_xW!$km|AIm~_*oAmZm?zpmnapm>x=OP< zHE&K=*WpTV9PjA5#dXKr3&Z2vaeJN-=c~NBeWRRblye9TS@ZQgBi^_FG|rjbU3zoM z;A&U(@w*#lO|zp3Bd@@*?@!gM$D>^4h|`i~0-@OQUJ@3zR9w6mx!XoGzh`&)o@4ht=Vwj&zwVl%+XpCFltc8Z^4e2|>WAOnJG$Ee zzuVC}IFb04+e=c*|MbCnvr~tn!_Ri3PfOk}Jl$ojL0+0~S5ob|FW;H_wkx~T`@6Vg zV`*1cclW-F@Cbt66w6^Grew#gsafv;*NEidvF1B9**h_B?l*AsT$1k-{ZcNK*qJqd zV*YLKlil8rE$9D?WmT6lm)~~tTMX>e=sDZo3;xZ1y4#oeyJyOe@w>ZUwx@T$cK_Dt zG_kVYDf7|}uU=_SvYJ%CzLY)w-J<5-zTr9s=G#Nz^heR@)x16Ke1=UI%o$ti-KWZi zzm^Q2^>1RDGlI*KV6#$GUNj zfJv2+iSe>$zoo{%v&x=JmYWK^f6j0DLhj59{`W70%U@W-rj#tF49`55`!^+fX3DaB zV!;0?2lSLEJ%NPTp)Du<-W#CL%tTw>K}f$`>UpUaa4O==bW*@HS$bBdcUr%EN~3(% z-14>UnOW(8*}Q+Vg_h4Q{(J4%`?^^A&9yUc8Ux<8S-v^@?@i77w;*$RL<;u!-IM2* z@0FH04+SBY*=3>SJao9p;)cSNOkjQYgZ0t}N867a*&n%J%+CR)ukNjQ8d>*rkqr3u=LE*>u75!=mNhf>*}U!Hh-l z`uq3NAG`@4y!PgJSQ*WKdks!}_(ZP2Y%jhYfOK5yQkr^-yyMN#4`)PRuGO->RKfQS{eXR0)|31D4rs+RwdNv!&nmKQz*|4+> z|Mr(kX@&0g2lsz}{&uUb?D1;iFYB}0*&j2U0M0Mw!?u67ZfN{0z0s3(dKh`5k@T)V z+&t~F^-fm$(8k;0V#?5Y*6#0m>%TW-A2jOjUbOx<)1Og2Qv@~3WGPOAx))gv*UZjv z8s3>M+<)7*_kv;l%SQk1w11pN4YMs_Pf9E=8nFu#4_*?{YW=`Eeq{?MDg z`(=97xS9E1w$v)eq-B0MN76haU8H%YD_+ho!})jXr|}r2lY87|_m-bmJC|BrGHd@b z)8N;g!DHUB_WEAz+rCRI^ZVc4_nh9{&Md5QuDLCmJc>prtAIs zFI#s1`ueW>G>g}&XM1DuNvUOC>@?%y@aD;qN6_U!<=&n$yUBj3%Q`Ko%Im| zH*h-`&NJpi=XLO8*b`6AVnKWJUr}xxc+W-ooXFIwsa&z+M37RfYap7*$y>mI5vdLm z@+*+@46_f=3k&!43M_Uj;#KRaDu}*27Ev1Chlwl$?rn$UC_MJ^f_q^TFd8E3Y?c$g z3FTE#*+EjfBbQl74jCbb1Qe%<_=B)~`Ae$7w_>c;ZSWg=!#rKcW` z#nj*J>We^Nz8;Sitb;6o6-r)afXte z<_2d#2CWK*84PO~P=sTf2T&#KTrH@JZ#AwUa!>s-3dMc_#9Y|T_5!06u| zd=(+pH+ISk4e+EqWstCrabQF9kOUXd{xZbRt@)vdAGQ^t`BwA6msUUe-JURc?5+;}7ePsq|ZvsRG> zxd^Z}$pQt5q_%N8S<9LN7|Ake23hV)2Le7yF~ml&LR`8ASkLuFd-dv#A=J#jkU=iv zzj%PZpniyG6Y8I5U_TP;rl*Rt)gvnZzCeUaqTR8YXd$75#jbBoUA9r82HU8tv*Rf* ze(Ckj-)ZgRJ-ycY?7(ht?r0DO?a90_Ae50aNEShWl`u?jB7V3`-3_9tonZQoB9Oqk zEzgP6Afk8@Vk2wO8c~6fcB1PJNSP(z0X4H_0$oNB{T#-vM_qf07%{j)!2*oq8Glwq zr^)}1+XR?a+haOm_n*A~_AQw%!c9O((;3R#bk%urzEs4(b@oC&3(F&;lM48-8+szE z5s!{#AXeUgr+Cu|+&C`YV(PltI(=CfLdzXjYRizUefg?&H57 z_xtzia?h}1glJ6F|8IVxPqd>tiNey)<@g$3k#^@?&!!AcxwUo9I|Q8)fS6?n zY$Lc00Fh$IjLT#VQz=+1!0yPjV4%q?QpEu$hy*B;VZ2xz{3IHv;S52G3jJ@s@;aS< z5|+S&_#fyKO1#@v{`8#`a4z~Oj|p0(&6G39}%T_((#AAQq9r9!5ns+gZ)jJx>l1tm;gQwD72* zXTvH)-&f2Li|%FVkOmcA2#s?1e>qSrq3DE=yK`{kq|qT5R0E{kF@!TgOQY7@e~M^= zocwg_-cLKY)-qA>ahHQc*lmiSA}Rd>JqH$avvw_tn6d$*&?_YqaJ0ak3t+!h_2uJ+ z=s-SsS3j#U*0qAhhH#yWubMg^lAiCg6Se}ZVjRd9QZSpESI?Pu--_}qpJ zYam%GGXTh0w^352W56LB*ph*eUbh*0De^!5)3)j<+s;9gtC87peMTfK;oV%_zzb;A7XG?d*ZWn5quFn#M5O(WGyq4>`-&Yu)iu6f z2t``O3RDlE0&rA~?F24%I*cE_OyLxRz1?3n-hnT)Ax0gifu~P7$gHpX{NxH)aW{4& zXsx90a6u$hAvymdhKwo>b-v(t565fWG>{(L@bW57?fN&rbPFNz+h04``Tu}(#$_YB z6!{*6xQ^}rN85cqviZi1-#8u_MWx(-kYNK-n-N$ zX6;%vO6$(|x~|`!aOYVbW;{7R$LDyxbm)mqJ!&8T*1zg<>xb?>Iyru#lH{_aN5!`PMLfY_;B;#uW zMP)!_n0$T_5`Ni;Sq@T6bP+RC-Op|f-ekGj4P&Ya5ynD6-vdY&oVp;;N-jo26+nu& z2|xjJpvU4Y7eHtOZE*71EVoLh%)NX5C3y%OS^vG&7^cgMtpJA0aruD)s8QC6+dPh|N)5H~{PiHo9?<5+XqOBh%oLLa|?`O;0SGK2`X# z$UjtlT(#4|qygstH8yS`rD?2kV6u=v>9oK00j7q9K-Y8aYX@he3w=pi2E4xHj5&W) zEBp?-Tvuso(2~@05o+Vn2!g){xR*y~{#kvUW}WvBOoYFEd?Q0B?h1f2el*Dyw%}_7 zJ+U;$;Cjv%G|BO-IpvG0E;D?hj6mBhxD%bH>2Y=^F6VR&>)Kb$*24RCAK zV(UJxtpNz}*cb*t)pY)A4wcXTu`Nte%VhZq2f6Pl?(hndSW(h{3!lf;9=i^&^Z@0-lP* zsQzE|tHzFx1SnR=(t!bwok91++JUdMV{))T00wsr<_l-g&g{p}d}L@V^?g3~C>Zbr zo&YF}Bq;M*DkUwYWXKdmSz8kNpl3;ss2T+M0mh}f>mx$cG zkTjtne-9V|`kpir8~ZF|XYT_Eab&Lt%-9OHQ4(}KA7p>-$2t`AcQ57v5*sXusWnAl z1;^svd#v&U%i+{ZPaR6`j*F?T@sbZj=8Rp$2YZmD0`50nv73SjV1Pdg08MdYFk%q# z0hrDbX;Zi)r|1s=q~U;>;h6lUAVyOddulvR0xtrEEyIUlApzswkLN4(#MFz$84h-A z_Idz=h-zZ1=fgHBFx99Nmv&>x-$5~_z|xEHywqQIJz#-*u<=+hcPvN~o}eQaM`42} z9*AL5gTstclfg}T5J<#&{^h?3L|8nhjkfl1>=HH~T9p+{#WXDl`l5~*R7k8dl|)G` z^~~mr(7s$EBcLn+29PO(A256X023)3s~1P3AKs4koWo=#I7 zPME`nkibEhIq3yck`q=);@aegL_L_hO@g@%ECR3|picTlMVy@q!i=>5V$)j}(}9{~ zvZ-XO+%L#QkuT)28ys0%3RyeU6!y+f3DLxCO(f14_J5oilGk+_EPR?p00IZ9+I`cC)-nOEH4=O z0SqLPgMXHTYX)W(A)&_0!Jr`qIp-1O=HYB$GUn&(FTz;EVfc8YYo|~IULM6+J}YBh zRb9-kO~I@1|7Z!u*9HE}_^COdEObWR4A=D(5Rd>}2vZTC7Q7ZIL=Z!%h{3i%SzKnN;3~iv+>GuIm_}D%g|TZi^I!G%gV|} z$|?`as`1KeIm_!6%fH%|H-(pbzAkwsS(?3B(i#pUS23!n74)P08ya#Msa!oEUi58tk>=|FDmCoYLW_Tz@v3Mhjo=Bprf>2l5Y7T67OJ=-CNR&Lc!ak;EP<<>#{Q`0&XgNCuQ zdcC->GU*fscXcNCjb?Uw{7RKX5%sTK8}aK{TXgl@H@@~N)@PYFKxpf9@Tuy5*B?A@ zQnmASxUBlY*`#bhu3+FUKTSrdMCbH^JY1>Pw!7IJ|63f_x2p4IjZbyYXq!I0Xc8QS zYcDqjjWj#P)sreUxxJ{HX|cqRXjUF*^5&|xw`<5>ZYofM1%7I|`$Ly_N7iEZ&APkw z3x3-}H&@$bHx>*4wc50ymrBG1wdAomCzj=Q-2iD&JGi^eW3%lgW4pXd`wy;mv8#5h z>Grizi%r^&?R3Ab7agOYI*trFcJDe)Mtu*~=(@HO8 zWRFZmugXfNYDJIoeXmGlAD(ENPGrAc8@)~q`p_B2ZmM4x1E77b#froEE|T4v4tTIu zhFN9|OvnMU-2)cTK^mPw_Y4;Y??J4M0k4d~5BGz}F;9PQn2++1hv-nS{ZPo!V8GZ= z%>7V!+hA1WP>|?w1o!ag$l>I+LBped(>4tABej6G0cTON{0bNF#t@#_P~nk1a%0$p zZXjW7@XOJNi}yfL2DOj(sC?Wo9pz{a_dvTcWqQT%7rNmLx}i?{;lZ}Ck&L0Cv9UzM z(aEE+>5Rc{(a~7Z@wv$H^_4M{GHi)%q~U0M)_!8&er(fw;y7a>M0vuzqW?m9^7qQ4 zP6J;OTEV>X#^A%rM-ksT(_l`tUu(IVIhI>*xvAxqz8(~_KC)|6x?{l6 zvkHSAPZ5bVsMyuhjec)ZnpJ9SAvXFx&Nw4_HZ59Cs^T#7MrBUx5iRR!lPrs{`f9LW+@0HEI%cQ>Xn^Rn#6!xLB%p~_6 z|7s0d&{kOpa#*OY1yeql!v`<$9InuMTw8Vp+{b%PkJe?Z?Xxodhf0JS*rw zO~1p+VARTR<;v*z%J}ihB*E%5&+2!T)j5aN`KZ;!%GKrZ)zwu_f-Yd=(HfX|jWDN} zsjmEq$_sZ%+(Sgu_9Lu%EUe?C#zcZCK!xl$YO2y5%EJeh#z!%ie}9{~ZmnM8*bTgf zlU<0_C#qBvn86jfP__h3RbBdsw6$s2x{av{rJ-$GOza9S? zkHT5~Q;qTdHFJeh3x@NK^1z&T6t&t!_RA;Rk3tya*I+M6I3H-Dnw9wt41Ir0jZEJC znLIEemG}pHOt{4#P3nFEi{%5J&~Hievw8g>_nz1ciQc*ZNIpD% zfo><+S0*Ejq&;bEWV8{ zB?-yq;p=Ra_v}*9ww~glj0l_4MoEKDU=bapLmjYKILJ%sRp12qSk~U0eVP^!~AD?~@A+UT}=M6DHuo9AsNB1V<`ASQ#8{cAOmhZVS2nikITYe3<|^ z<5kS|Cf(REo_T%>RrnMCS9L&Kbds6ymEPYEm!aoAB>Y;bAyKgM4#d~ zJceM#;(rX31H~%x6`ZRu$(13MQy7+Ad72;iI`5Qne?$B(9E2nv@nLwH$kNJ4v2BaG zPk5_g-xCaQ4fstet=Z?Mi3a-S&zz#aCJJKRB%nf2d0PXFrv{5D%Z#*ze8O*N5; zE#mPkR|lL>^Xy`FfvJ#~@7K{AH|iJwjAI3YMh7JT>BnI1hSvmLy#R<_H4^cJNhXZy z38${Q3zJ+J3jzu+*bP92q1QbnZk-uN6fwQ&$a3O$dH{My?pZ!yw)>@;@#A}s8grRw z`Y8Q`n|A;J6+(lkXMDLzw5Ie+_cu5}NJu<*wib{eLl&2k!QPyd=V{OeF%No+dEjV!Ay6M+B3108<*|jL|&`4mD~4w(}ilq z#;bqajuyW<{ajnU`*^z1AH#04cJFz)KUZzFzV`RiF+OAG7{A1z5`IMz{om#IXRjmm zIicbh_$(|B?c1zS*kh@-Gi#Ki!9KbwnvH&p2{12DGD-0su+4n#D((dnpOivsis7Deee+l zMB$}VDIm#tAluD_hy@%BUE6Fs$vn{BX(SCEo({hORw9A|?y?!2kNCp(I_F z30jWCqd^3J)6wI@AnfguG{oMy9Om4*7P%G zNC-qlQwW?$bNYUvQt6rz%OH7ZRSP1lU#JRl22ASjRF>0mGxnD{U1_t7jKZ{jd4-qJ zhX;L6@-W%Ej-F1-@=FF#EW~OG*fp`x4%UXZF(r}0*ZCm$+D)_mlJBATKR#1(fd_5` z7J%PS=Y~PZ62jchM>wL32+vK0dv0oB~WkU-Gk zA?F!=Z}Clmt^fvl{zwr+f+xCPrsd#8aZcTEE0BCQ(8l)!|K7|Dp=UvR7Buv-EtmB( zAVGm1&=rfa5E)2>;Uj>dOEG&-J=ZD8DP3~VY#cU5*Os!a{BX?52J~T-sRz6UAm3ZCoH0MVP*5qTH^E8aHBR!g+da2&lMX*SomC~r%afMPUbN*59Hdy8-~W%x3&?gN!N7H)wVjCH{! zQRky6ubSSN1>5`7aqoA}iakS>w4XL4&4X7c@F#}S-lv1qe_CvKJ`rCb#A`cTN@gZ^gqzo+khC>Hx`qaLC^o6qJ}s^Vj- zS*$--{?4u3=&!Brp#G2gBDYEhA3MXJ`tz;3Zq+_McH%^@(q{3lyi*O2Ok$`Phu^u^ zXa2RfF7{fy3v%@AdT~6cO|{Ij=H3vn^5EbUVz9Es_VL?v#`ArO6w!I@>#XJWSI!|q zYrFJkZTmh>-aif2@3Ig$?@*2*1c~k3cyBM-$3_Wq!_vJ%;oUK(oJ^!gv^vAqC z6SP>-rBS@WvJ&ZtQ#}o}iQ4f#Qkr%6`R0ef)WXZ4=`KkcsxpQb z1!~V>i@28VZ26DGZJVCg%&vWC9yB_6|51Pv4uEi>s1sQa`TtU16dHZMkX9ooA|$*Q z|KG0=-uulM^BWr0f6Vc}TDQn$J%I;P@r$IFkR43mc7Sw^Iip$>#ol?7XKMVr%ZR>ygn$qY_BCJADT(3>~+SNVqTwF>A~kM2gfiOL|-Cy@bpxtCJ7&Ywkow z6zeR|iA>Fyk92h&$}v`v4;h|qa^7RFd{$lsbAk|4jYwKSC%+=6%YpO&p*Sh|Pz#}; zPr{X{6^SqEcFqPZbB8QyhXi}&EvAQ}Bj}>HU&TTd;^>B1!kf%r3_oTf$jony#cQ-< zu5V;km05?U zONCNvn^N1DQu~Th$I<9UPN1(o6q`!9hpr?H0b;!=3_-J#HCWuJ2whX)u@aO9u8ciZ zJ;E}Edk5*$RPHlF+z*HUM2Rs_B+x3TzO^ZTbFQn(0Di3~uE_*9? z?2SRb`;j>VLkVO3L*sdf@dZ)nR>k&J}5 z-vN|2QdH-m(Tfd)ryn9obt}Ve02vf=)(?A>Wh}%Rc>@M$blCxf-Z^3@7sB)dvCfZD-(=kqD*| zDeN3m?9^ZJ||7w`pIT~D8v+U%v zVe;Sk#oqMA&IrU*`x0YK9Hw3{*vB1H*_4WEC2~^vDmyHzTwYfIrmABpW1!M3Q3xRIuQX1%O9D zAh7VA0~i)C6+9uvzqL%UfM7S>P%#}%mH8MU zFgvcr=Rfxgi5h_@Nyzqjs-GFer-tZPkhR$w91+80^>YNCk- zK0~b36iC_5V(;EkwGX7wO}{`kvgz$oi0N{r81l$}xyUCpH*qN@Ww|*DX@N}l>qp`^ zbF$O`D-wj@i{-6m{R5#A!yzQ)!W;DA_uT@4WCc>K>;X=L0dVU^gvAE%r)a-|On%|{ zvZ_J&Q~}z}x)M{fe1Wmj&J#Yrvp{O@mkpl^fiH*f8QgEVK0zM2N#}t16h1$XY_uC|^9Ycr8lt+Dx5QV9;08*2Gbms%PpEFs2t(K3h zhv=IA`K@ZE9<)k@R9jg8_jkR|V}mBiO#IOU0Ko?6CH!bk0fJ~#7B+R7XfuSWIncGC zwu8c7LlPySSg98{rie&#&G1};#25TXCj^&-^?0sOA)$T@3m{Qv^@gx5;jB);5nkn@FcPwns|1%qmMe&_%tU-34 zoDlTF%{l*>&y?_zh;KcM2B6v)9cbzF@peegJ1N0!kt7Qd!MB?3k?yYHFa+hR$9OJ+ z(FRuwy{90fod^SLz+LVEl|8rpyVB}YhZV7%$wnv=?T&{0Kdn?v3*V%}AA}4HL5rgR zz~~EstAj`&0fZ_3AyXKf5`KhKx{*JuQJ=unHDDOr8ma|F6QeagpyniDTOj zQ3uhY_$fVratvgK?_RHmZJ_pEo~{ir6@Ux#r$B>n{e>slu&{$u$LTEXbOFy6VM3V z5970I(6&Rm2IC6-50~u`y0Uh>7CgrT1MNkhXx%_`-R)|#Ann?b21x*{8S@nqwAx@> z@xyioe%O%}+PQ1jiG5UkWmeR2@;uCVKuE9q-+m7I+2en#*p4pbB;oONaQFkoalhly zVDu4;^JGiaamE_EP`^sY zR*fX80kBQf5WILVV&8E#x%Mxd(GPw{)2@UJ2LkGj6wTVSpF^3cfPTqH{y~>#I7q6` zTiA^O&=i0vmX~MVreF7hjyIg$%2`@HIE;#bBgR$C=|WP+RcLUE^WlJ_*wO76mmh(N zmlD7$;UBVh&imXRkf@PmFj__IuE2If_KW{DCdm!XAB)r$!=n(?L>hqP!wKIUYe6}7XX9Cqd z!F`SjV!rX?O$i8zeJ}E$U7Y1ApZr0w>GFN{rJ@?t_T$5)_D87lb0|IPSKbW){@`^? zY=GL&s1Wt5WjSaZ9QTV5kHPbWI7FC8|J9zBRj*JWlQZYXB&X11k7{yPCMV;4EtlwD z9x*TT!gGkJhiO6o)OM@{hdh z9lj43gxnr{8$I5n+HM|vNB|^^wMU(siwXk~($I$4))2?*F(5)qo^Gg?s8jQ8fMYEc zvJg4gDToE#t`Ly2Ew>&=B6vh}(Gahq&ix!B|ltZXl9&^ggQUa0IV)h7fY(BPXES?EoAlllsaL zBj`Q@89&j{$7jWcs#yH&5^t~+oF$}43*Kd#b9~cO2f}g-7LB@bJ6Zy_Fjm@_WdIOUZs-Rdu!M3jsQ`W?1yO2Pk$fpC^(QwIw)4ij%*5hsf8n5^ z;%vYYE)&67Q!F8McBW8}GiX-AC`G5;VrCoUi(~Bzc{H*wY4Mn?G$bAy7N(t+y!+-!%*>zs{Sd zS2ixYE>||K`_oo6Z^au_ef#NK4(Oyn&10Wa$G(PX(Hx8Anb3`a;jJ2q2wcJ ze9*2o4I4frAvSSt&%mvF1^Ec}Yx^l$QXx{;KGkEW#3XhtUG?atvFO>!`x3qOwLq()E(kDvSsCaA5kE83NLPgVNXRbS#{hj$VUO775`E*$nrFHD;D!~lpy^*{jl^njppUFaQ_VJEK%iI zs3aMJb zBWzBB&(wqQ?;Rd*YzjTLgntIgISkh@N74`?O|hAa9zn`K@}81nYI6?4GGn5gOc|gO zaY3ppQxmM-^l!+(aWJi=!BqeNuR(=mzyl>e3`sNmljoRA$9o`9dyVz71%>eiy+_K5 zE5k@a3=n6SVp+V2-I?a`QQGJRDokS)sB+*rv0cn<=nN)Z1>EmbC^-`fAFpHzt~1m{ z>aoxy+r@{G*gV3NY3}!O8%*Sz1EL;J3E?5@!y+3Reo}iLEJ}!s@qM;Qk+>%-fKK3I z4*5^kl#W}An?}AGLQ)sX%W?(3&mg*GqXTisOHuS?0aV-4eF~}pHLt_wXSamII24Pi z>foW=^5?D?BO#&<@C2{~3p*y#O74By-Y6b)iVR5x?ZO9i-*TCF)( zElqm+m4G8qvSsSfoXCxV#F5zxhH}SZ(&Tm#$WVc5TmH<|828til5+t^;dAR1rg)?| zU0_YVA7fr__1GYL6N~&XRe2PM)C1_!J)HNqrl<#Mj=Mx7=4o~Vn`*;lm&RV*uRKShX=wd3ASqp{jE<%; z=>`*cP1)z%kf1v+Lno*dMggm~^(zB?f`@uIwOo~Js$HxQ%g1jB-=QF3!<8-7w=Kdh zjus5~5L|Eap#l`~g=>!yp5;6o-?0XZ-g~XwgQ?@ZJy3FucKsFuK0=yut|c-yzeS(d z+z@IN4nn=%ieL0}c+_R!b1?h7S9roT>uKhp{m&O$!joQW+0peq!DhQMupGX(+I=V_ z|0fukg||E=StXeR@JC-R$4=E%{hcH!4VS;8lj^^U1X2mcPSfs7ZE*WsIRpbQbs)TW z&Od07^X-iO{!{I=*Z?f@hrS=pf}w@`AFS)9Xt-X7c2ymc*lPxC&H_m3$8%B#Uv)uv z=K2@Gt;7QU#D=Z-99tdT_pb2*+xScq=Xta~(l z9yyDdT-sU+zcG;~blndZHDEJYA5l9wPwo}n<~`q7zBvB4mdVGN zRR-w$e1FxX{deqhHrIUi$j#2YPhmp#?SaY5yX9a1uD=@sbSZupxiMT!etW|3`0;aR*5<^(;qe)gfC zDL5Dxji6%x%a(eOLFpk(fiaWQ#q0+H_`lp7$jlmkxI8`u9M?69z@5IB&Xf?N>pmrPf`YHz-JC2nBN}ea%Rg zOmUOo7+&-ira72NxnasES5s5W&0wsS4UiNHr>YMpIEOIJj3Ib~+Mkh%B3lo_1dIWv zk2Z1Tk{LF$;F~#AOeo^>waZj_nk5D)nLO+XQ&u_3)V>_Kf(;TTRnnwQ(yTo4vQ5r9 zbFP+6BU8q|s~gvGrUhL&ScHtU;q(Buxsq}qh!blY7Y(Rwz;?~q9iuF)83IKIW9jmD z_BZ(-#Nm#bp*-Sp82>g|4$K&fa-ibOP>sAddnk1TT(1CSE|Du_Zj7OC@tkSv*SIN5 zxH;UH30lM;k*_lHR$cs;$4xrxkD{n0iT=e88TrL>5pq%#OC(WRqc zNlezK29{MdEhw}GtLu)K+ZP}lEdi!J`Nvyw=L+(9aK%4?ufzj^6iWrKZBdLaWo-tF z6iX%SAo-;NRr)S_p#f#WUdgV4S0ZpF;{v53OEnA$d2z7P$hK-#fr{MDD{Q1m4rV!W*NvYH}=qIty60K**L=GpSJX9jg`z_>JR^4jZeX+_ns%gzSTM zVT|>Tfv=?zUjG|cR?~kFZ9Fy^MN55sOB2pOZMGscTT8RX9bLIyBf=s}+ue7@@2uR} zEVYY_%-PJs*)(=pEuz_M-W6E|@7ntB>Za|QpA_mBu~{|lS|$~}T`RIZXS0&qwVBw} z7vFX!v2vj)J~!&dLl?*@y74LiTC&mF$T20V(b@tTH0u@#kQ|!Kq#h69xKmof{13Pkw-Aj=@ z8*1&NZzVPL6G>9yMuVtRxANoM`!Mm-Pp%{={_Q8WpRR&G-^Z_ijxI)0>`6W(u!lXi z4py}ecSpPzVW-WpcIWK-tX&dw|1-dL&$GoUd~?rTxH!V!I&ujSTxK0d!x5dv9w%2E z__#FqYA;UQ=8Je=RCr0e+-nmPdm1;_2JL{ zY+(emKXqkR3AUnYVN{Q2EE2R3^E%KHk|V%7;I%a_@ZW+gZHipw;dNL@qH>5aEX950 z*(W%8vhvy3@~E$ve{&q@q;QI_nKJPo5XZl*ps{0I)027^QFlO8f4*P;AZ6E}Xt&s( z_n5|lDRqOcsH|{vQ?zaaN|+e=a&qoe!!|Yz1b15c7@tz;v zhT*+1F7IPXtk=gMT8kM{wHr=58qTwy5s<@`=+4$KZxpvBZm}o{-gv;`r1r`g=eKC< z*r1tVCeXL7{AYIMvf0K|F5+dL!*8BbRX%0TJT=3~hh0(q&lISsz}K#1jz9Ppl_zn2 zGcFt`_iz@2 zQxyB;WiVGQp8dKaeKCcjK6HDtYy-u_v%HiwNdNe^fTK7~#fG`#uI*!EXZl5vDg)%n zTD;?a+R1*NTNnX*((TwBq(#i2=Rc58*uh)<7jvNj8s;+lVPDz~3 zXnvhB@tT0a0OKtfYX|@UZU_Jarf~VdA?P;=!K^V{ae-j~+g)t*v$r?|FD%jE#?!mX%LWPrT7I5_~RY zVrFCc&i?Z9Bg@i`v=$TqsJ55cEH#Rn=XJi=| zTJ-n#iAyMihDF*tyjN4#(>E}$Z)m8lsd032`-}{FrJ!+i^fNLlc6D`u|Jlp9_{7!K zC2JceB^B-Rib|wk(8k89k8gmDt+ST4k=G}`;gO-b`udsgQ;Ul~@(T(@L}e2aQx+EI z92`Gr>zYJG$8~mfWMpQqtjq@mhgVirsjBI||KREV(I+J}JuN*`Q_CnYD72)c)WXv4 zlegd3#;@O6zJ-NHmzI`wbheL;4QJ=%a&kXUN=_{-D&E*!8yM&x92~HB_+V)Kc6N5! z@~vG!U}$A!WolZck@36Sy!?Q`kdV+wXV;Gf1%(ljG4Wp#Q&Ka6Ln0EBQb$IHW#!a# z^~{Eb2Uph?JwG8cvvP_{N-8R<+}ypLUEDu<_{PS4@%r?c4}BQ#>{e7<{K3s@dS=q{ zt^GSINAAbM3QC$XvTD{g&h8&S6&07*JHD5aRxvcPlvmI=JlsY9QUCvVK^_1QgigLD zr#k>bN(0TQ$?Xk+F)L=s*XH#{P(8I>8LG`6jDbss(<#&y41YnqDKi|dD;!Pcvlz)x zs4p5%7kYoNGF)FgnJp23_eim!WIA6yfFg95k7KF`Ct0KtL2fx$s#|ZnI`XxAzS^`m z{E<>)#bUkn_cEi=#>(X;=dF=UrKYOYR*#E=)zPNv^-d%vKD}~t%|4hwWx> zEVELU^0&I3(UhllYh&N)e@^B|N6@RZH0*ybc~fpY-tzTuzQ$rS3F6jxyxjc$aBaM` z>DPK!06x*8hpkKXS2c6m)HbvC(UXky465xdzYiDc?bavSTd#kObw@lfsCBg6UhI7@ zH<=W-zdZQPI`H}P6W_bLn~THs$*}87nvz59(dq9tZ4W#VqDg^TXtC0 zb~R$`UE@k#QQb#jcT_vXR(@1BCU|&MKPAU?+%T(ccl>qXUHNh2iu>Vl6DpYNq*)a3ueQq{cE8$hcFTWt++Q93>I87OPrJaB_NUzt_KMRU=<}n~ zUf3({vpzB%`?G#3D|FPH?&HzfAUuToe2694{(KlwTyZ|a-E?$5$~VY;G4^cU{$gC{ zXT`;Y==IUXqy!Gn<&+Gi!{xL*d*$Vf^7G@%@9M93e$Q&^IQ*W|wW|F6!|>zr?|IV@ zo~s4RK_UA^>*C6*CHto1t7Ydwp6eC!5MtV@&$1y+;a1-tj?uw!oX0n)z@IH2(V6io z56{ZSCpTNMb|sSA2|AA7Y|ngNYpnasv#*4_~Q>7YkyAKu21fMb>Z;dpY~BY-JcDySKptHJ^yuoG4+b~@8ztH)8F3(edTuH zZn+pD&E`+xsOt~ck%3TjUv}{bo<*1{XHoXb%T=U24tJN_N*~ar6r>LfcKndH+(S7S zIa?d)F_uq%Jv1o(=PU*ZEr8=F3`xYvA_j1{ms z6bz_%oqx%J79w6LjA*2tCwSHxL}-R}^SO~E)1 z$ktFN>HvlsQ9BU?RSN>O1b`>zn{}raxSN1ZNql{`N_n>D!cJ=tjnu^u9~_Cs(e*jm^bmR zoA>hqauOm|c5S~lO+-01x|fVaY}d39c2^lE;I2*sHLa@&RUU&%Yv&{HoKUPvUax0f zo>qNi|0PiE{ZncE&(d|r&3Lu%_2~M)Ki8cAVGR;T8HGW+P!um#<4-w;!hUhnEpGq{ zWH%gn$9BU)s~+n9?ZZaqhh_mR$XQ6Ye=9LVkq}!^O}NgOxfk_()lXs7e2mt_#lo8! zQO+ms>MQ0i1*73F-G`XHl(#GPbBE-OZOZ)V^7_`ApQ;%vB&gkUPT5$Fd`l0D{+hA< z_|xs^GqZF4+8(7yMT*f_$@jLi73`R`)DL6M(e)WWm4AvX-%fZ;)Ms6f{S?2uokS8g zdM~M+37z-;0>q>-ahkR zt08NJpM1U4ZG)8FiWw}`eiO8As62A~bhnHmY-%1YMCEDac{j_J&nG0 z`Ns3hYx!>NW}>O%dfdrqHD%2OV?Dhk~dzYtz3^DB}|y#fxd~V^=*3H^`9h zdZ#hK*mxH4>3$17$QC(oNago_bUXP$%5z9(;ykJKeuppS+nAN=McVTHuF&MSiH{Q( zS$Fq8C5T$4LR2sFF0AtWq`aCEPRNR!M)wW5L#`RG zj2wS1+wi~2Rxe*H%uif3(jv5M=ku0-s$RD&|2^@TY+bvaxbC?7`wL0bhQd+1>7o61 z+Mq4GNjZ5l@Z#TDY)soWyV|X(xZ$hhCiz{imlv3jk&6tX_Ptl@<*x3ABh2ggX6*Sl zSu3Tzm9N_0m5lFjtw&!rPqyn^kbSDOzDu{<_bKkS)ZIAzcQd5cah^PRzx(3hb}FXh zvRLi!fkF0(OJ~Pb)8yZiPY-t}cG8DAhPs}k-r;*H$xc(jq1064pTY-3o%cT(_^->^ zK3_g@Q@V7L`ety-et%6YNQUH;M1p3SuXG-rzWNMZKoZ^{Z^=K`n8}dHQN{< zeYYZb|4Gmz#$Yb9Aib1e+vZ?*8%6p{9cIpcM}8XDY=x8Vp7NMctrA}W2fI@ zpAEzk-p0bH<4A<#$n@eUJmaWR<7mFc(JjW&E5Om+N+#iW7QJ{j&v?|3A|f{)9B0yAM++C8uwWCK@3>88LFi#|WC&1YRLsK=A43Kd%vwB2suweo5%x2BnLj);7g95q zzGbc~X0F|4qNuYrAO1hq?))9f$NwAtIWuOlpCkL$kbP@X$=(n`2uZR|lC|tfl4fj; zHA?n9*^-cub?i$iWXn1vYgtOR)LiHL{r!Hv$8}xDecbmix4&RG&SQ?#>+yO$pDNiy zyU7cmNj-P7Kc!@^^4jkkD33QikH0=oa3W8*&!I?COk+P!%sO8pC|@c) z|EY-M%{+K;d%g_+GsOcNR@G-pLC=)apB?=q6Y>0+=E1Y`NTex4fsS>7UQmI4dVyhm zfe|#0J18*ae{Rksj#Yhb8T8yL{W<#5GwX@x_6N_2{ARZNg-+ImNtYfv*WalfR@O)_ z^gJj;Uw$403--1y3J59+g!s3WgaY7y83UO#^|NpgZ~XFUp<=Hm$xW)pb89R;GBS@U4592Txg_q09S;GT)uD0VbCr z)t9URMlzKV41=8CF?UAYi6aLuWhH`*rOOwC%9qp2SL@5aO_Z-6lyCCC`l0&DBlHDX z|CKsV`QF48YW=Hdy|TXto?Sc`K5WSVcLkeeDMr?XsiA`HcLnFC3b4VG#!#WBQpuZ9 zsrc*_|74}`?@F9Nm8e>km`#<$y(%eLsa`9wfz&F6-&J^l*NT&#Rm!iG==WYLXS`N@ zq2a1(uJ+r{*eu|zTD4AwxQ47yc|a1UMYYjnwaM>lQ-L?;YHuuT-dNsyV|5`=Hsg)$ z^l-y|<|uZ^39j&lh0ui?_J~ z^=Kcb`)Sp&bJ6=-G5HPkWs~*gzw0Xm8miP9s%;u-?lsg2cq(o~33H~6lMP0{8b(gI zQEfEZUf_@wOdK|iU|89ES>lJ^jR1Gk(3-=rO;dG*+Me`PwQ$Wqzs7O8tj?G~bF*%} z7pyt8vT>oI`P*dk`tRmVftDX?E!#FNJNH`lV(`luEy8bF4&Rx5-EDdKwFRDO#$ZbY zZ$kwerc8}gmJupjnQ8uB(~aV4Z16=8+JA0r6`X1nK5WGawu!2@iP^T-toer)_5z zKmJ}@mzQn#@zf5ld5?g`?%=8J5a_sAuqRZ#C)~CtGPsA5*%M8lx@uI>6Mxu~AlUm@ zz1K;M;BVBM8vI&5qc?M^H~X+RSFkT%y|2KwuQ0f;IJ2*`v9D~Z&y`09>Dybb{_eHR zyXr={K<{_;-x9vAiq|y0qpF9O{+4SIeBTxPz9;j2U*r4tQ|~_UtouhZ zO^$!VcLw)|zV4sOywI5f&K!bY4*M5_KU}f-a4A1fHTJ{0T>7dy&(`6GZQGAK!5{ZB zKOQuGJe>MiAKLv_Z~(3`z+h+ac}gNf-PvA>1F#!li;HJ`sbzAvlHG2Q`{jF|;6eVT zLBZ)k;Xi{op&?O?Au+oliTguRSwqn3tlad_WSCidFp2s5&=!4Y;8dJO8}ldchEKgR zNoW3iBHSwcIfe7StE?n6tbae#fl_NQJ#6x4*i>l5Tw}z-Zp8Bbh*j2zb<;@Z>0#SH zBLXWUM2%4=yHV%+qnT3IU7JR4PLF#28TA$#^VJyhw;S7yKqbxPW65LKys>~kVExFkH0y%#=eX$c+ zb`w^2x(c%R%uLD+fCNopRAj{k(xC*RyEo9=d}IRbKiF-JM5-P zOITT@&#vcDx~8YBbtlT_CbdPTKiEx=-k%=Nnx1Hyo|>MXq5qkt3C+xF%q-Z=EZ(14 z&YI~Dl^qb`UtGa{e>wBxzCr7cd&-4kTN<+mO|ys7|7>#pvvH|OW3Z>8LTH$58dEck zWroJ~mll#V3u?~s@TgJe#fOdO_?zbhXQ1`TIh^pk=(;|K=DbA6d}I%c)L#c^`Z@o; zy;n$DR`UyHX}%iqCHuAespc>0_KB~?z7Xug`GgmA>=*Px7WA_h44W5>W)@8TE||tk z8S{R%SdZCL{9JtXt97%lRr6QzC*$m}#r#UZ-hR=y@MV4+==zrx>+YyoxMgC{??}Xt;7CXSID=X>~DSc-tT6*Ki8Tsxk~aT>TVmhY#YsPo6xsSkNz@0`^&=Nm*svQ4OK0)Ll%i*B# z!9j7(L21iD+3Z32BU>5zLDkvc)egUBzx|R6{q6hFmels!WbSv((Zft_JNJzZiP?vU ztrE20@3z@P-@%)fjJ#LVxZZCZjz0J^p7Uq6h%iNWz`-~F(CB|AW<#dfwGkYD=g$5$ zxB6Qlhg)XlRwO{0`NJHu{XtTv;TBDfneYI3y2T^AQZ_etdnXwrya>Eq#4d@ zHm?)SC2!x6YW77hUPvQ^fzNzF|FO7nwoaP)SHom^yXJ7dON&P7r*F-4q+MDv$=104 zmx146*)(4liy}mGq5uTUmK$Tv5Sk60vFT7T})-|`L znFZW|iM7LF~$&a1BE#k~ZIAF&>?z)k8ZIHREhcTS&tlt2yfgUWIN0#M)T zku83^l%G*vzs6JwjSMl0Y${)wL`7pCYVNf@LLXA|PJLpSm)940C|0F^?2(S5fq05j zm4ReVxME)%X75;}ivB>TGO8-D4dj21bB$!T#C##kVGd|0K{hu>ZGa;WN9HOgka1{5 zAS{X>Aa5}N$+UB^r=>PUF#L2BRg8kew1tI=CD1NP*T(D4M`DR}5tZ1JI>7sZhpFUL>HVmkT3v2Lm+4umf5?j_(7G!mPwml`5-; zk(tAo0LxzxaVn#CctUkZzj9d>0cy+zpyxU~e7%2{7JglV;&PvLWvpMb%j)gbAZ)1E z`LKaHiHJ~o1+$i*HrTV%eYPOnLnN90$d|BoIugXCW3b(a+ykb37DsRLjg9`AJ3n?|7*;p<^JyM!?Pj#_l8g; z1g-y-G{CzFhzR5dhH;)c0kD#Ek1!;*g%{&VJzxPA#9N`G?@)ycpcNV^3Y*mVGIKLICf8iCf5(&lh)4+JVgGqg#7@C4f(vEnC~n}h^9 z(woFjp)o{Z2r!NT5+*Z&MOV4a`PWAge*!`aJ_th%GXtls$e?>|!jJxsu`W8-`A6#X zlxha!yuzQ^B@cw2rpAOHe3{jfXm5mKIswjQ?DMH4Sn{7llmT>}^V<|Lq>0HiXh zMRXGvg8*lp-Z_pzs6y!R-P|^QErrC$3(h}qezpiLD04J)iVYwzkU&{WgWp&%F*;NH z=pR=y!T!4Tb0d9W?EFJ!eFmG;-g(-6yyu;jKBavOcRux8#n|1F{>cW4`$AWcS^-gMXpF*h^B3u zos_w#BdR*mYZ3|$=L${Fo?#W0cR#Jerf&t8UQQqrWG>l^>bRRft+yyt8Y#IL;cg+# z0kAC)1Xb~wXRxAhW+?*3t>P=2Ay)Ge3yrzE0gi;yGtP}iJ^#f3uqfh^6{I}Pfz(jw zHjH#h{u;<(3LrVDjeH3rs1rQ^Gt1+#rfepF&d%E^&ZHHo4tBh<p=LYJ zJyzGvYHq&0iD}1oAkoVuT4K=@?)ODF2U4hxfMS?FPE^!xAY6;tJQSltXke2DILmCn z&FETO5NS#`TVOi!J&(wzm*rX$0*|Ydozi-sM+~V>g!7D3(R!OYEU#%%Is{G&D}sQ# zccRKEEtphYYtZE{M9c+c@q(UoHx6}2j+F5ZNj;zF%jz}AGgm}ed&mqs6%QuQJ&8|=k?TlAAcR1FVOkbVi@V0^j!Uh%$3i5=FW=dncpU5 z?|gNYx=ahr}Gx^QNW-$j#T+S8fLcK|T(tI%M3Cl`k&NLx0#ONhy$$ zL*Nb}H3Zxcjzg%euBi_Jx&zS_VrU5BAy2>Ia?8s48ielik`5_9# z(~zx0!VZ}=v;zQfIi%r`=0lPWX*lHd5W7P=3{_QC5Zps<4)Hn!<=1%O z$PS4)1oV)PLs$=K`*FN_ZEY=t^$?E#7o$UH4&gf__z=EBTn>>s1pSbnLrM<0IV9$g zn?qI(i8*BDke)*{54kzS<&c|0Vh+(cB=3-$LoWY6UJn^M1n7{(8(*}7tQ_)m$ju== zhr}F$a>&OaOo!ASGIR*aGcvPO)pQ|YSJyZXQ9H!w5ZV6^tV0S95j|7Git<3lJ9 zJ;DEf{rv0cEFj@uPnWSxO~65(&ZlatUxDk0!g5(oVTi}{qJ`xn<(3C&J!C;+OLZ%b z8-~fe4k0(|s;(O+v3rFc?hP%P#3+#KW5*SxjPsOSoNfE6OFk8uJ~PZRd{a8|;{VOl z`(@((FHhI%)19zb(ruH$9?Q(|5$nz8zo=?b@2mJVO617c`$k^B3tcJ45y-4lOH28F zW;sfND&k86>0Ib+oh5eIk_iGGUe;D1ikmApZb)%Bd{!G2J{VN8o zBDt4=qbkMsyM337i~i&3x1hc5e?47bT#QYbN(H{EihxK4=%wJow|X_R#*KWPjmGbz z9-o@T2Ja=b&=&j>9zk{7wy`q`#omyqr(R)+a zE}`RqMWfhE!>iUmRf1K`FrwhecWiHMD;v4Z)K7juYzb7pJKJ#2u2<$-neTu^PT7f} zBTpSq^_=lDIx#44<<{+CjPc9U!xq=?-yXAn$f`7c=}G^uQB2IOfCw? z&+9({qyDd(l)CRdpil3P`Aue>nZ1LsKQk4&X1Dh)m-cBT3(G2{OB2XT< znB+IJGnam3{q91Jq(c2l;4@*>#nOv^>z2sJLh8Sjd|FpssZ$eHTdQgCyu0@NWAnjg zbC~_%B1SgYvwmLbA5YJ@LFRW~7GeAqi{aFQAx}|q-Ogd5N9eaEKE@WF zx}KD_D;8}T&a{}BdNs>&Yc*YZJJG~Zo1f=%uSJ*YV}<{CIs>TqJ#7$iROHqXjZc*lr+=pvMWwr$=KDyg>{m-BK`A7s z(#_7Fkr}#lZ9Drvp6)50qYzhOLyGaI0{*NnlwRNa z;*;b9$ppPc%lyjA7RZR=(#YPT`gu1?EqA_gsW)by@=N~P)6LImys#eY8?7(?q@!lA zTHzeQMH+ge!Em`al-p^b`G70cEy&&eE0a_+Jo)OwCRuxW>3E&V>z4^}WloY8t}cwf z`Pb8D-N(P%j>_kZl>NukyBXynPqz;8O_sU-xG$3O>GSA+JpImZ&XFIGr~gXwnp2#t zA62UBF)sH_d1w2St@iCeT)BVIh3Qr6-TLwV@_>Kh;)8Y@XsoaP_4M@J#%1GIL1XV` zcItPVHsk)EJslsMcO8Driuy8|aZOvV5?%xrP|@pOqvM$_E8kwOJZ{*-E)jc;sO^!- zR2XZ&1Vn=|Ryp2H715_pgkpQzOgg9B068L&c_X4z!BQVCc#TK!-8@cH=>m(e2u)Og zukoWs)#De;S==l%z~gNzC}w&A2)u@3@|HVSp7}M5fcT6m{OvL_HrIemTMc5 zVICnsB%lKWLmxr=K`5w70gD1yf&k!@lQvG>3XsesF`P?STZ zqw&a40b8_bpthD`^H#h-!9PBJo^Rco!VaZ9fT6mFtlnhyaEt>l>fDulxMYVmLnSV} zSWeML$Z87r8b^}!H)Sli)3JPFw!TYco$1NI)FP~Bzn6J{{M6xT z3@UDl-Tad6_)Gmh{kN8s=TG8Q9Ux=laH**&G|!+B9r7{!Q5!XuvumFBG)NiRH(qqr z{JV(KYMg^ncSsIIK_MVq%N|Q!Xi;B8xiwFU%zKiha)0O%dgxm|<$irOe`Sc>2S+9} zR>J&qM94>j=U&sjmITCp@t{dcGP7h`oX$Q9doSAs_V}Ui(=or=D}Ft9ydY2iX5q!g zOMdzWqX;k_B_iJjz|0cRc_71O9C$Vt4%P37g2;C0A5=Une1OR#!GjESqX2M?O}Jz# zjH?29GXZhM6bvW$MCYRQ22kuYlJ09BwKV0T9UC6msW7Pyr9{ z>G7XA5i{%xmhncwVNpVRWCH*J*J8B;7%z;6$Mr;ROGQnMh3xqu-p~N_T)b6rMBQ@4 z)z%pCo)E^Z5N56DLP~Tp{*i#yBluQaz7%NSisttQx1=J*|0x2Cu`7cHx2yik132#Lk=YpFOpeT+Ju7#AtGXgk_6cM~84F*7A)xGiPId}jL zkOk0i5Y^koF@^_ps7V7`Nt)7NpJJ*G2xv13=^8kDuYi7h0MEdaEM6dtc;^TiDMmxg ziA7*dS)Z8#?Fnh;Dp6qrScA7oKmx*eGscs^48x}}V3T19Fk?P|@)_&&nd9}MB#fF0 z3^0#)OWjdIUKzk>Raq4HCPC5O*RLj1%=x-XkbRC))2?8tG&r;pz2F+ZOt(rAs(j+J zEa6lFdP}D`G6E@Ssqj2zNgQ~~l+^+Uu1SM_E7=;ooSawvF>c^W8tC$ttHa>l5rYI4 zSOz=~^IGN6pS$2RBQPrs8sHzJ5_152%9uf}?OhPz{zOzYKTG?GSWv#~WdwqT81O;! zQDBU%3^v}FlQ<-RL&>-U17t*j9xFg#?1QsJ(4tLE!NpVn@WzNIFtR5kR#E|LMlWFi zP|Ag$!!vjgJshdPF)AY04MfVo)g{3D1hg<7xE%ESDia{nmk+1qJE8CjBmfRD-UR?= zf)9Xub_%*%#G!Pep_bc%d#cY)9~8B^0Pxmlru2Y9x9I0Y=QMnf5LccY8w~D=N7z-M z%Sh;o1nmt)z%Ca)&&dIWYbFtoXv=^q021ND9EN}XDE;|c=r<%4Jg<0ew~AQ8W-hfB zJ!C452UACP0AD zkbg#jx+Dg_3WjAXxCyt(1v>jlLFxd_c%z!yw1JIF(6p*bq5IlLKA ziO`dYMr@K_MpnD-`@?H~jO}l7TtU9hw z1I2U{stL(>pllSIbpb3@d-E+!tNQoTiL3YEiLawSznzl-B)sFVO=6uqu7~lzxg-k~ z{C@M3K3;_uL0%&=vTq`1Cf__?t6rCG<{NxPmjSykys_!61h))4nO`f))~*-j0-GV2 z?YAhA`nedeRjm=gHF0@>vlr@sibjD9@TW}`r)?{{Vik90>&Isp!2#5O4})9`SYB9+ zGJ_A(fFLv=MsSA{(ccYN*$EBctG#f}C4x~L0a zB@rHYTPQOXVfEWcAyXS~Bmzr795cmI2VSymc08Z!yvm@NmMFXM{N1P;~u7)9Rm<#nTAEU!$V zN}b+2!61)2Xp#xWm4UsDV0T&Tg6)S7aHn5y$uz?2>1=a;beG% zU=qjo8_)+oLxo*1_2H5SdHYMh8zDDsJK;W^?y|s5x-9rp5ZIaOoMWuE#eW16KJ5v{ z9cFrP+98mYL*E5Vq_m=vtxQk1GM>uCbmXD}653LVndou=Oz4^l2(Qq?une$D2?fI{ zh8S+eCn+J3bAtxh!P7pU2&}*~4Tu}Sx|95ouwEDeV9y0Y<}<~~BSs)#BM$dM#_ls!<8xb6u6=*-wOjpYk@5PhN zl-Y2R{FuKyc&C37ojBR>@&n}QO?2{y8KIdJbA-7mYXE@U3I_2s0Atz)vnJS(912Yzb0hNFANE&+u)5kEk#KPCUgjoPv) zU%LIh3!u{2*yhB7-=*~qyF{|+QsII`{;7sSbu;wOTe``=UJ?G|eo(`WE zz3gE=+1m1SQ?wu+7^+>mynf6IhhZb4WdLBAGQY$Md`;$aWLrjwEQs4Ltb2fw#5cL? zUk&;>qnek8(7=5vumoSr0e~!%MO5A#Q#_Yj^P-;z_~OHIbNMp0Irmt?SCNXZB_Uw^ z%+kcoN-dN5Vv}X>kTp#9TJ_(h8ikpO=I{4mGgE)RUv0yTRd5n3jtzrA5fz5P04^ki zCKL8-1-gjJNy=quy#rc6&yJmlvgs7uY-2YBoHsEN%>@2tTYU}LoQ_^!4FQ3(Ru6PR z&txO`;QGdg((44)Kk*v~hOWhc zbpa7MSh-iA&`~Zmc5aok+(g_D>qG=!%hrjFb;fJx!=A03Y!H7GdzO72^7P!>wiXY5 zB`Ml6RWJ_|VI2twa~Pusz;YZ9Tl>pBla00UVzg)9xvs@>No!kNcK6a2!vz8$2;^9` z>;@m@b(`HKeZ;lj0L-a?=O&sU?94z$Duc`qW^F8AafN&BQ7&>%;JH#OFya~e7KyMU zAkvd>FaPWTM(?1IUHZ|+Rp~bd`TdRGh)^=*J6$#y;-EBW~U+tcHOb<-_Y%nOaPG$Z&guUeE|ereyC zep$93E6IRyO|1}#6;|DJ;^&S0OttEE7rePpK$VE%?lpAZoWsRokI!RN^z|>MnHVbo zykoF|)+<=lk6+Bn-tujc(xr+3ZH-|1D0rNji|Bh2cIT({LM7?R5wUXa$ERbsP3aE} z5&Ztkxy7Q7*t{9$Bosj<{%W@|xa)7FU#p|cUp~BSxP0KhI`Yz?JKOGe!1{F41N2dQ z^+5pEm2*DF{!h@(_vxc$g^nlBRWc(qa6o={44KcIrJ4xbKw0ac^ffC)>mTX|0-@(E zY1eYk2-8|4c%6ujxy<=J$C7ZRyi$z3sQf}^eSj3M&3r=LwVmy3!7_*DDFkx@EO}20 z2{wZw(PUo#%{Yu~Uv8-Uc+XsP*!nxKvp{j32nDA3Rx39;xDFO2TzU!yNc{Tpss##c z^QMYEGWwAVXE)j`*qsSKX`-@J@Y+OeqvPa7joq?hbxk_MDN`-9c(sHs9Yt|!j#yQ5 zjnhH}IYMWao9qM_x~lyI6!kbDqM7ch4|1}li!ihD@jeu>GvS4bU5WvMg}JfD>B}*D zyf6T%1S7>U@zy(&XqqEZVdqfhM8HNU!eWT54wpWr7;8nj3W#PU4V`#bux(}cwA12} z$+TSce|!4ajas`q-?x9--CcTKYk%)vzB5U#dHxO##sQD%fJx2qq-t0HiJs&~>b^WW$DOwDV;)IJVqz$E zMCk6}oO9*b(zK#s9RMLV`na>JbCh(1=p2j#z&V7{TNL*`KZ0xOuS77UDiKSVHF>YW z>iTn6Dsxc8xyYmIcSI;RvOj;PJc(CZ`%xjRzg9L`li>_(e`r{5PWhX$LH&bL_i9Jh z*?2x?cA4^NqjP8awune(`cP^;ZGCHHYcn@H&d~+ed(NIeyjA~aRM4wm^{lP``1SMm ze{`Jp%KF)lzBsYjVD~^^gL3PYdf+hmxbXJm(~FwF-laTfzB`|l0$np-c@=W-&7(W} z-i8}J+kdA0s8G=NUYEZ?+b?HBf_FO~v;?oTKWzDX@b${k!@W;l59o)#YIFAMms)-{ zZG;@!IKW_mgdK5j5;JEmf|XYbu9-k)Vxb+1VYKM1mfm4}hqFj|eXULDTmHM+*O)HX zwQ({L;bF9~;JR4vDCAhjHP;oZxRaizLyAmmjX0P z^)IkW6&ynn45m3_6iyG9x#)UWkJMY%)SNa=@$<0#s(PiKErOH9is3Y{8F5LlfCEVl z6QG?4C+W39WfnrkZKPLVr<(nb z8XneT6HrL{?eg1A9`?HvV=btFiU^IHjy#j&-Fg94Pn&K!pPBspF*2a~xyCK`E0Ysr zT>&+3nr?aCnVg(O-Kp!;@bpcYoLbVmQ$Nz=8Bl9uDuEBpIQp1W*0m6xBoHm3hlfMc z)S2yfQM2^z{*4Hh##xQ1)?-sm-jQdf=Gf6E-+mMG*+>-w~`r@7TxBXa&BtrEIMc)!lXFvX8{b+ zTX!k?g9k&0(+b~-C{w+7YxND3^Cu($ELzeduj1vX+o)O6aAp9}RjTm%wL)rkL4bl3P&=|qn z8eOLl8Cd_%b&S~&gcca(O@<8sSR!D^OHQaH2^1sIt{Eq_9?N2QzuP3B?k0%9NQ@;3 z%)JSKHzAR&hGI+6sK`D0vqDfJ%FjAaz__ZTZ%%B4m%mIcPk zf=pKhnQW`;qiLNHR;>|%_4}CQ0l3Osu9g}|;vyjcOqlIH6F<dTL*cA~09e!I<-=jGeK=J#h;?kpi7b z%8Zd|jIA#iA9qlmtF@A8)Ra`rlbaYD9md3P#uUM%BnBX@nnF~k6kQL^VNB065CC#X zue?(cP?QY_==UH1D}X1a%k6yzOKu`S<_~ViJgel5?M+SI;!W7^N^IpnO#_n5(q1m4 zmWQV?1MkpP=i15LVN}Bc6^v`Ez|s?5CTMP+TTE@e(6s%;eA6ILB)!(>JpW34^VBDyVr>fXU+Q ziX$4ABq&=pQpN-^qXotmWth|{wWucz*>(N&*uDOz3H@QbCXb~|9#$B{1@;%&KzBaJ z4)|sC6%C0XiJivID+M13>uY)Y?DgC7AsdQ{VLo|0UotfRxOtLHeZJg~sD$FhBsq6tJNQjdrkTi^vW0kNgJ8X zDSnu;%u`WvcdN8+R7sjD#=W8>CHN&>b3Z!D_kyAm<<+wJ0;M##+OW>O{fEAJzm<7U zTCx21OT*VFf}8IFAo5B=eq^ys?2r_z{HK$47_JKVLrR3oZHn^c!3&+kMk5xc*UjMm z#$^L$@wCCw_r@!{BdJp6>&oWQRQc(7`Gdal-k_n?#t+h5BpEx3nz_uq4$8X&rhY^D zk8tME13gQ#BpuK1?$u%7XV0pkMR&ku?H z(HfMP?^e%EuSUCGeR!KvB#_9PapJ(R0_jn)QgB%sNzx<&D1ek}e5{fYv~QyDXW)G> zsm$jn9I}?}uu36H3ih29Tg(+#F5tJJ^dGo2iWkU70?(i0%l0dAG034WAA8+2qsTDc zCzU=CyygAJALQBmao6k=go!i4jPF_=TRSdxo$`+J1WSW;UOtSWIFhlQ9Hu-8)1R!2 zt9Wia-uGteUFTHIkZy_c<)qyHe&gs5UokN+7zgD!n*=ZeT!Ux*gaFdXny(o7`xq@h ziUwjhwqiO7Xo$?6rpMs(Vv7aOUK%4g*=)WipBRvhF2Lx#kdm{dOxa;XmQ|vcr{BMs zS?iqnHZpVJsa^EmbgHs_a$u-94my&4`dxQ+`||9stQTi1cy@2hCWKAL)tyPEhU*fe zSW-z+so{ISX6Z;8z)gcm(BMimgdUB-l7@7qp#o^=NE#-Y##l&Ws-ZzS-7KRt)M9TUf`!wPl@8X>B&fHPq z`VW=wQpV@hrRS+{qmH5G#hvFR0vx?$AK?h$q??pcY3(Si;IUwe;NtvjzoVQ|PU7{W z)ZRIHh3oX=UG17a=M+)be-1dxj~x#53p{_FRxw|>g>QV9 z`l_mOgC z`6soe^O|$lK~LwhKxg*&MOE$vwY0^{UCs|P7|`B8#aCxZUQEZ7Ku2sQKzMJDA~o8Q z0`s9CF@S*thkXdLw@i(Gq)x>>ot*4pgR!shzg-tCpr%~o!YD-@5OWVbG7 zx5~nA@3X&E{9UW9x!L_;aUfEe*%Wbl0AV0?D+~b8(*o$Y8|d#h#*=wRJqPGF0f*%8 ztR*S7t}zUIbu;l@_;#zEJ{ zpHZ*B_Fg;O8!*YuO{kjr?B<~}26=JwFKTlmz#GHvjmlX^<#^NWy;*9#8ND|CIl58W zWa8Pvp5Fw|Y)uDjus`xTa(s)sb_4y7BXRr(-_j4U^FL%AdYxm<~HGI749uoztCXV=xG>M*JPc9B(hyF_Z6 zMRU7MfBTo!_K7>&-m-o~=j#rZKkb|64TKlek2)LHT)=Dkoz}ZPWafNY)Ajr<<&ok>zt1JE&oNpiV|FymMi)SWab$N&TZ@_oVt}5Rh`!l_0hww=5w-hcM@ZC#5{t zCkO5`P^L;Mu6c5?-%E+lxD)lX8-uV44XZo{<0AQa{uhNh9u5~lgrx4CM59&tV>8@O9?A(*(xSl@y<&P#F!bb#?NGwGlJ zheNgV2mLKh_ zIU~vdXT|mMPjuZs1Jn{sNHirJHgK)8BjX}?NXSnq zP9HDs7(JT)RD0LxIMd+SUzw!8kqN=*<%p^C=ev*o`E;JX;d*#*=Fh!HOo!+H^fXfV z0E{|-3gN>5?@2-^9z{Wl>9uwWha`M2k~~j1ju71DuR|j{AM&2p%REIE>r0ZkQgw6X zhxq$cMVFy6x7YK!NkI!!-#!nB_Uf~UiCWG5EWVJdpQ3ncbz6G4*u2R6rTZ_L(K72= z-|wrxWXCJ45mqe3fZWg3FccG5@md~`M|f6qog~C+z43r8Prn=Ua(Ls4q%Uy^271l5 zx$#KE2SVZ9T@M&9+OzC`yYc>kfnj#>mCCPul(S*>zpYLYhf>eI6N{@UbBIFRTz379 zC9ww z<*+7Jc~)9XDq@MpuTcg~P%ueBpDtvvfLAkX$HOD671zR$i2FUZ^o!>W#W>CM`Ug7nN*i^om-Xouia|;nrZ9L z2m*-LRuB1uK2?tK-hPaX#LV~{GXd~haGtZ2WFc_iS#*qf5?I7e_A3b_{rsTuX=Q7O%&e&lB{PI5&qv8N z2j)4=)mxXxFbzoA9H|JMamu(6zxtxm=S=$bB`r;lYpJhyR-CJSW0o5VT*}`r7PV+9 zSU-J!{`Yc)U;Mq&*R|{SoRz-*z4Dol)w=_!1b7SBz->!=^mxKe-$WpNKNMX=rR^um$8|7o<0oCQnj!g?U@0Z(M|B0DyoDKswFh zh`Y!OV0OAlK5`vmm+G{Sako8WRxE$0>2HW){ZW1WGYlBHWV*vUL;%J`I1yy(7_iw& z4j+)vitPYUxt%Z?@s?wB565kvP;zx1zXdOb*$&fAwk1aHanRVmNOh|WRmKN29uxjq z++8im72g0%}z(`(;jVrl%|m8oZi|kiDHHI=d!!y8IJhs`d<# z+eFwEHnJ}bN#wk;rs~#kk(E982L0M|2PNfrR{WgO^YJzjXIw->9RP!qbcBHlk}yC; zyf$kEBP$|#lZI@wn6pLq&uAu>l|C*LbSSfUtobqT!qYkObIGrgAG{7K?~iR?-&f>P z{n@KPlFDmSs38G-w(TOv1bgKD-d<=FT*yAcK<$u00VnW82K7ytp`z3U>yVCAB|@QM z&d5ayiw>tuSsRM873~NRfh0Tz&s2E^W-<@+O$B(lwN1lBEgmT}T?f&M9rkb_wM|R{ z_)+q%VVDS%^J3VV7fmS&Pi}h0QcSz@Eck;GMO3FHfnkV?ZGg|rhO_{TX2c3O?PucA6pgj3z3^zu)4KFry`^6;(sn)OhTl!U(_Yqm5lKWQz zeWG7(+K8(xxqN6t?fBjODk~%MqR;d6>&yyRoR$)Xzsd)0em z7pISm?|xtV`T_ydIlZiE78$Hm{l92B?|3Tz|Nmdt*~dJ`-W_{$2-%%;9D8JiP+18f zq#@M7AtSOws$N&l8!JJ>XUEL07QhyXr6a- zLgz-}2)dG79F{EnP}&=`{6^hjI0A5dA@v4A>nfEEVMj0tsc|YF&+X)G1gDGSmXN6- z?Au$Hky43xw?z;RQe+XH4Cs07z7tJqi3uvplDr)wX2ubj(;}WjfMaHEP95akS=X`m ztqoJERiO!==YJhfjU0V>Qt?Um=-#$VQOwH8z+C07MJ4~7fe=4i_Y__r=n{XlJ%kP8 zLur$tv{agIu)`YN0s8?^CSaj#xqC%v>CMGSXRY63m;Il$o#+^nZLXL*p{zIe?b5o_ zVHss3I|q+WWdef0r_YxL(nfGs&C~-$2iFn<`mqF~ZzM=xTt<5N*kvI$X3l2y=>RQcKJ zrM{A?5{eQNXv9R^iN>|zVVb>07z4vQA`|{)x9aAOhw^qa5Jz?Uc^kHxbVHx9KTCpK z(*WTLUJ+0f9E)Q4d34WaIsJ^#Q4SfiKb+oX+H!swkPvQu!0-aB(}Gt zKExwfSkTdX0C%z`AaE2jtls_85iK<+Yq#y2=+P>M=$`ZqNf0dVgMHn2yMpXTjJ_Rw z&r?GN8!>O=fYV!0VI&ftnVgt=uv2sTpJ<5s!FJA*zn_jC&Ejl*(>&+Js;g3TmNh9D zSc1CvuLr|Uw?8>vJp59g$^2I?78YAPZInG=>H4xJ%}+0%sVxv@>k1}`-QF#(1MZRo zU_eWv1_xk4r$BK8!EzADb$Jb+rGXSFF9;MzhXT-4N@~c{G<}Cc?QKtp)LSsyy$0n9 zt$aV5F3$b)5cHIA{onipDl?~gC!f>Z6oZ9A4e8K!P+oNf&QaXgDHiKk_LmZ~2};Spu{OCHOTUK<5G7_|}& zrKRcz!WjLW@Yb|%cxmnJH{7AZX7;`Y6XLUX(=Ns#g=FYE=_03rculW`3q;=`recEQ=|=PvjS=Twn1SA zK&4_|7AK4N>wnBEy?Lf#OTh>F$)ZK>)T7b~@zC#6crv}-j z?lT^nvZsGmoIa4XEe2H~{`+V-Z;4N~LUJ?(IUgN=8@&G{K~BQ5($}T(%qcm4|4RQ* zrrg;}m1nQX1te7lusGfMm4WxQ{}C4b4k>QbouiU5^ z1yN1mQiv0%j+0P`Px|ynw%SHTAweo5;lPq=9Pp8K9&=k2_f|*@Rk-0^NwgzFEy&3_ zgUQ(edndOlsBuXL#yets~Kw4G?qU3ARu!wAmb;q z`WDZZG?Bn;CB;mU!5eD|Ib4d_Y>L@Bfw`nFS$2x~0*bdT{RiXDj<3l}{ZionB`-)Z zC;!XsBE>sxfdvhU#kGOOj$aBPQx@Zjg;s(0##VD&YVLJ@xr3;sEh^G@f{LFjmP)PN z7g)<@t1bPlSYG+1RDZ3Ui?tY0Dtc2>uoigVDyTektzt5;Drl|5MX54dsp5O!jRvK< zw%WR0rTU@T`Z1*kZ)zVbC^dYlZP-+L__Oxmfl?!)u8~W*NuaJtLiv$g-6J*SW}Uib zW91gJx)wX-R+qZgQ_5}rb#0-_k1y3dzNXxsRM(!N+>u|`aZkCkvaYj1xvQdi9Y!2js>{ z5UhKjL_JZ4&NffKV^1A)T(=eiFt~yKY_f_F;aTcB@@9}pfXZ+N3^z|_lcBsAQ5n@F z>j=?XImiQub?Y6K!BgdUA)=rv6)qGWg0V``=Wcg#vOwO$-cqmeJ=#iKe(v#YSic7H>cLt6R@G9W9t@?>L$7m ziL`GPe&;`A1V6L-_QCO6XRxeU?1SkPd3$=Z^+z{L~(^UC=hpn(#H-YNKz>S zHZUnFg^S+DdPw|x9xwoOIAE-5zxYlZ)NO<)76wtr1MdK&R-cFv#LRCCaXHLdYYTdm zm0zL?a{wR*mE9za!wH7IgJ*Ms!6S*hH(4QSW2uvnB2!7kcF_p1MH2k$1u3b zHVFo@hmmw;LX&sdfoeRmN)$+@kWH!l7f3QPY9;DqViW4Q;~kYM3}{ zn#DwLAB{NH@>DIBI1JL|@dVyI5=yK{*fRpf0mwxI62Sn};s+wY1gA?kA0qq%3CJ*t z$}xy7j4nnYz=hzRsAi2ZCKb5S$3b7Pr8gToQAOm_>J%TL%mPg@*!UF1D?Z|O6G>)MXA_tnx<}%T&!D6`3QpV4$o3E zk+MS&+L1jy3yl3xQ;vjudrjecu5{w)Mon3d2H&Y$CVNTbV$znuqJpIsp zZJ=D+G;-I~17e0Ff*gZN1a5%Qdg{mSc>*D2|H8QqTj%CMr$1Vb!>tKT8iKd90k_@N zro$!-qOUKL3PI^u9i}REZ40p<gIIO@3!_Cb!xD|Pm7kHhpIwO+}Clwk3D%#-E3TkFw5GTewR5mc>ZWexai;! z=gUgw*kC8>X(;{FhlVg;azw%|VMoUn1*nJ7(SwBHIJ&3q4J5vwWI9X{2kH%5`>pC@eA6x7U#`%){xqmKj?1miDHdWd4KSsS^vPZVi^>*z$gv)bP zzHBYCcjLqB#B(~{hkp_1t)91Z6SxPj+_-r9bL(a3B{J=bQ*&0r(xpW8OJuJ-(zq@q zV9$|{`R&U4^T4cD)EBL6c|FsXL#a|CNC9O*YgGqd``vmHKK^h>@ z7|(@CFg*La^73zjg?@#{)iPckAm(Z{H(dcjsdw#ME9tClzRLQPB+ii>^=Dyx!+bEh z3Wg%TN|4nWCinp&Ve!1UzGG*+x!WyozO+c6M-|dL$eCA#+V)8VeG{6&y{}BY`$s!- zpp?1`SCP7yjyw8=bq;w)$UTqs8XsP*JJ;DAtzVs{FL-RQ^IMb&9TMj{)x~~wz5xsP zC3KkU^>%eMiNYFq4NV6P>JL-<<^P^-25G*3>E=fOn!&?koe$-&mWc9}au4<~nTv=q8jr85i66CCd?83~$#rKsG`t zjYkoWjy&VjMdrDo^Z%NK$#jJap;Ba$^S9{`H-k2&Ub5%gWL&cQu|a>QzquxcX1Z6& z?|KSv4f;c)Ox_uqVEWP>s538m@^5zEvQJJFyOxp(v-jPr2>_X&s1so=PBthEp zjw|z%lf4Y`5 z`^6Iftx>3in$L(Agwlu9zwKkF*B)M$Dl7-kfKPCWd8U+VxEL)?x)mzD7M5ERkn~XJ z^tHU1Rh~-Xp(B|)?cva6Dd9|GH{mdVasw>oa2LX$nUrK?if2IkL2K2<3k~`*h0;g(_QA6|ljyk|G2)eEOz4oeord)dd`}W{W>RYuTSmSv0ukI z>Az>EUq6XoKe$_Vd5c3l-a-mk8yKU#;|fZv&o*Xz)|3z`n%wo8Y`H;8ReO$VK(1cN zXjms`Sx_W`p7{f301Qop9~Q8!iG^n}z2XI&f*rW^0$>aX2S+?D&6{J5#;caREHx+% z4Zwm+0XxcAmUIZ04^-E)h)j^zUXA@e7(yZ%6?leo{n7j+UMUpiLpheDKVqfCnHv1) zIS`{znlkR3Gb#!ckP?o9CrxGZIf7o{mPv-n1|}eZk8BE7_orgXZeG${Dw^lZbP?lH zU50Oic_~TjVi@lmeHll-ZXlUBFtb&T0vt!)HHBwhj(J=Fo5!(*p_N!&PDdbFiyxlU*B+;Qa` z`~b&f{#@>Ixr%3k1fE%apsd!)Xe6@<$jvBh zr$Y{Pt62zN7V8>2!&4IBs&W3EDcC624>thZKrXPKWtNk3cOK+)Uo;%VeH#M3(uo}Z zrG2?NnUpxj*Pz(e5qTtSE04Qq0oU~G(-`jSHS8?N2B$u%F!A1=jQ^eUsTNoZJ#vjP1k+J6%>6x&ZW7d^W8By4#Sa`ETQhWIR4r^ z6!@YW|F~1!@7kHUs_%3F@or-wwA5q4oqqCIB>NFY8i<#*o6RRzM?e@dJ+LU1J#0DnvOX8)5mi(?jV zl}uNMOJmk&M*;ecKhLOH$iOAh_d@0g1hyEL!*f}D{GCUYc4L?Fhb5~gGcFP< zh`;xS38Z?{u`X*axf+9o#O=#S;Zxfgx4Tznp60WAyw`4o87S*xfp)EAHA!hR&F3-& z`p@k&tn+O{LUZoC-}!W;PuMOzBd2&p>$BcOq1{EZn`~#po}xp&%O(EBvC}a{PQkQz zNe*vL4c%lxJfN-C7oHVYt!Rm z;hDzc#0!3Kf~#wpLUSoU5Ojv^l(nF1!pl5wh%PJlsDu#25r9mK3CLB7kiz(?z#u#2 zvAawj%pO{b1kEI~hs)B%Tq;zIENpY0yJYuHAK!erMr>!eCqRHI#Dt>T*XP*j&fOC1 z-2hXNGMm2MRxX860Z=cD6V|mKp!gbyLDom#IeYPm^*ylHsGWEnx=TZ!ti~4N0C4mdAcEd z#mY750Zn88Lr}tp6@q>r6Y;6u88E^?0>=PXO!ffVrFS<%Z?=o}IJ#kOFP8#)Pfef2 zHV`oYV6jXDG9Q2dhZjaHGo|S;0`O~YH_d=Co(f~iukzqd7yLe)PHM<69sJ|*V?)Eh zLGHZr84|E=7+Gzq>Lwf8>6efk2TC)*(|5Yf>$OqG?i&t+ktezwH_jh-g`Q1t zo4FTrFXGgB)ZTXK zh4BE;SwJ(#^t;?fL|mue)w>Ta?bdmVpF8oYi20_qZTCU=-E$`e>rD%V08R)U$Yi6P zjuipKWhfA|1p|fD?~}E8i9P+Aj=LokuWE<~^HG0r+!Pt)SS9R-DJupW0GQXOhlD_B zD2svto?HzIkC5oh3;(ueb;)B1nRD|9(bma`vitZlh2z8!H)%<9^S(UzIIEtn7)g|fM<^F}qEPiz@R8`&Vf z^orx zo?%DFmJN6;NPYW7oV>e1C@YqBWR~>(PiOdox{=&`uJs}3j}ZA?us%<>^WlS^wJ+y! z+E4U=t6Y@)VQ%0$5}1eEg;``M!I%}%BjO9YiUtzj);@7P=3ET9)OBZF*5dEtsNMIb zH!GZZpDn)bntbz9|AVSh*8*bRuV+6VT--ztEP)dH9k+}Y9w|7tC(7;g^Tv8#4}+?B zHQfLM{2&R{Vd-jrOF3SE>O~eHm#$a5_$i-@oF*E{9xXogk4LuB4@L3ZUf8J;EMb+0 z6N&kR%DrgB8u62qxr|-CCS|LfBwXqBaozS80K6Oo_{6rrkdI5Od5HYVmEZ?a&V26I ze85yLc=fJv8ByL z1}#JyzvUl~dEo{9=otv`vC0<@*Fyu>+{@P*)RX{%uwy*JbMR}n{JM@0`g6K>yZsk{ z_GO_8we}PZr>)_9|FPi>oNeXW!`?FRTq|K*UmCeKwz#(O+`D019x?(51}BV;X8m!p zDkbhgLShtH{1}GohVIPn=}u`(=BnYHZ)kv!=j$z94T_gpR0K`<^!u-O*};-uuiV-K?UR?^vY z0YRf|ku#(?-F}%f{qjdtuzK;*!&sS$a>*Cr(n(mML^Bz02Z6JiIFKL<(s&b${erOAt@p+Jy zzDh}$QYAJtYIBLe_ie(@rbFCPN`>~`tFOfeGMOV7BPXiFYy4MxKkeD^L$Nt>U18i< zEh2v;QMiRDzC)DMBAJ?rntepWSY66KP-O?{MnEMId4Do+%yArd==yfc5CTJi@OhcC zPVoxP(s*YRe)TJS40v)MPS+U)0Ay|m9K+xM0F*A_+$ITCP-=Fb57416sd&Q*!pPRS zoOW8KuFjyl7Wp~C^mwi*C&Y@AWM#5wo}hKkMVieHC%b?vc*$p5mmeoXI0`0S9YO#t6|w7hzvFv4As?O%4Lr zp?_B+uyaF>-)S-a+HWyDVs^5H^wrsn`ESZjuQa&mxS4qN3J?DY+cJ~OT4dJ&H~v;7 zA$~xt)mi$Y6MEV{{kxiBH5@^6;gE9I?l+Hfwn&*$YoB(1c-%b7*|KoT@^iYU!LH}! z@0);^*qc1*sl1b2x#TC#=l)K6zMsY!=Q&=Cv^B3N(kTt5=AGt*oJxqa=(*_p^tg9` z7x0KkRsz#3;y?j!$zF!`iwLs-8Bsolpq!VfDHW~jmAEj8sdWZ31HI#`dDsB<7KSF7 z-_vs1c96|_p@|vHfRE8(j^lVHkA}w}OYy-T0ZYjY08TJSzHcQjKoQr}8oL@8a+!3kZK0e@+ z7n{x{$WUAG4}p-c+Lj=}x^Bk`WQ3~j2A8G!u1w<;bZoQaLk(7N_}kX6bxwcLIlb{S z(%@GJQ~Bb9$n(fI=f(Xk;a+asEo!Hbi2+?N^=~ubl4+C&$V| zW)a#2PH+jl2!OeqU;Cq?T}eH^qWg}-JiQ$A>~YNKV_y{_S^=Uz$IwiYw3-LNDH|+4 z4#Y4(isY~a?S{SoLNyVMpnwPf)c+3EC9oP)n6M0R(RH-?Be#$jM8ZpQqo0Cxi~BGP zVrcA>6!e$3*O=R`*Y|HnP2?H;ynVfEE8*Lb>xx|QvIX&9Nt~s0P>v41G*1eAm&7f_ z+!KUP9-$y{X#EK7035oOh)@EMj{Fq3TXIJeqMRnO4zO`7Ln*p(AAMj99GV0qLHU6I z0L;)$**;GVM5I;}q%O(dJOQNSwJWt0qDH%@}OUIG7Z}wDA|| z*kE}kC251kZwz%4AI>mnkJjstM*?Zr+fxi4WhY!o<}MA!pWxEkPkXQzFW4T}Y?9q1 zl=1i-*!`|y{7UM@M{0(vkn!(0{SN6vy7BVuxq5_L^Ap!ZqY@5v)R(@?19cK$F8OC5 zh0Gg|uDR+CyPrtcm`UL-O&)ej32#qg2Iq7@5n_et^ZSX-SJJxLy~pWaJpDj1f+*m{ zkD-7Pbk5F3)0dNot0;9CAkem|YAz&5sWx?|ab0nWGbN-Ur8qiQZ2`La?mJwnH_%BJ zLI4*0?nlp&p%m~;rJp)hpYw^1N`W5rNPnruRqZS7H`<3dgx=jg0>1>(${mJo>b}L< z7v-LQd%=D7CP;%&+>kaY?4G)}S>v0Ex&iqr&`wGu&T5eeh)g#z((lsrqVn+BT#W*V z`5wV{wgO4MOOR?2r2UWK?KikF07=iu9y1_&c5PIPcAfBO<)sK_z*<`W;0(P^ zH81s^iAO!}QtKD>A`3xyR~%JIkb=F!iK5IWKjXz&KPq z+X4+_c*VTy$#VGwFbLn{3LVn^-J_bsKKsY3S`x5}gKAy&+SBY$=<>Gk@JagX#YGUN zILjfru^$P2T!{7uFZ>S;(IpZ6CdD1>l_TLv{lcF{a{hW-7(P8Bg?#g8=)K<%w^Z-v zJJS7zKC@!vk>Z}G^Ii+{%^QEmwhdqH#=P3^e)aF~tBI7CVC*l&_emb2pDQomvJNC6+&ugQ9uZc!eA)LHEPE)r3rg(>da!MSNV&L#^ z`fouH{nKaFUG!&>UkUc?`@pXyTsUcDLwDf|Gi^o8O`Ly&J^~{-2FFG zVl-P3J6qE;`{3VflhIsj>|96BT+hF`KBM`kvGdP*=12d{PZ+(Qj(tDV^Zq?cC2h2@ z61(uFXJO;t0?RnC8~b6u=fl5$A3$RU{2Bw@%iugqf?{+E2DEPks4uu(fn;Q+;8Z+h^leIb7if?j8jbPdMLMvUwp`EVs8F zH4ihJ_-TFWCrJ6(Y{F~i1-tnT$M=D&?BJ7P=+dpj2Bp2bXGlwW#$>ZY!lVm3s!wF= zpA=Uz6Ldaus$APagZqgdYs`b)lc&BD$$u?#{yaRyytVvS5Awt5r~yE7kpf`sB8JKM z5>mW(uWAfRqm-V^r>Ik(tWjo0X5*9Hhp=C}2&#DF+Af0Mh$T*hKrhbaUiUY#P$#zFwJa(W&y6e9HFoNIvY z$XzxaAB;e;lo3{xUn)_}*36J_JY0pS;fmlGr!_vMKt)Xl32uodZ{rYe+hVQ9o8}Vz zyRLD1*lYU5Uj?^z+1qLMrDl>DYN~-7Y)5lL3`S}HKJDlNn!IV@aYctXWLn^Y6GWI z11pO{p9famyT-O=drL{nlqlFvd}`uCAli%Y+dGY8jqt!nIDHU8$MBa2jURb9q_0fv zalzY=uMEaz*0+$TWDxd16To7biq`oMjEaUFX_)`gJL2)bP2)|dlsj1up9+v0h*La% zs%_Wvt;TB_)nMwt8|R$0+6M=zYLDR4(Mk{5V!u|GsB4Hg$*5$K#u&jDp@nTYUCg*U%4vmPH7VIM*ju(<`eVNcKVh3WqM1{VSuS(E*0I!dC?oSrl{$we$yr@% z%?kBms>|xh1(BHQp+mP~zCTxg74u{4D0l46q_ulDsgz?YpIgUk9LAS<^0f|ehJyhi z<}0uy6d1ECHezsB2u9`f{rkO*@MqjuZgIM#1yX$6=IE|46(N0vh@cWOy%_O02_cFC zj)(B)Od9TgU_%WdAb=aHza>E?Q;;sJ6d`iNEOBS}C{q%X`0vkY(=Bt1z;ABKDld&F z7m)dtnDqZksMHuRnvrlwU_@}>Uu&j6d_oe?dDk~u&?q&njN&t@ru_e^td({e6aHVN zm4G8^QV@2!Ai6;T#c`De)$;4dQO8Y$^(Uz8hT+i;R10x|xJ>0xxofBE81Tau7>VDQ zWFWJIoqKWcs1G?C>41ZZTVSldD^R6nCQYQ=F!loEtfL%KC{qhkvKtS;8N(nF@W3g6 zkONg=fEthiDW2uzl^2pfbp?!pt?zkFe3*6#hzXGV9rsLz29D}l6QukKkG-BXVRJyD zfHIu4ZXfAol1?lCGMpU-%zeTg={!CdddJU{*Rdm0CA2B+v<&J{@i^;MS%xF?}RV)+(Uj-f@G(3!Kj-LyH$33r=Zib@Ivaq*yv;=%?hvPn=O!^l=1eS~1p% z_w6}J&i>aP6!BsGj<)W-x(e|UfC>2uzbY8gZp*@*zqusF?l^4lDg2h$j#qkp4W{mQ z&b_V0TG!EJv!sl?`mkJS_l;z8qerc`@HLA&TxstHl`b{i45{}$#6B~!25Vq183N7h zk@0^Ca2zHPRT^gL>h1+(;gaQtSm|R31$r3@u%GhAz&Qw z7?ig_ptUx30D6THFEm0ycNE2iIRG5iguymut?UR)P!ehpLuV77S3&h|&2Sszuxj`O zv9RNC<(mW;J05jDmfe%vu<7v=PBl|MYmfNu$G!b<;G%4`?gLMqX25=sBW5B=owc?? z2oF(Cq*wws+gg4kK8!{CoOl_O-^_rk5+}PBemcS+xu(gN4LAV7zosw_+8~N6Cjq(I z4;N0}6jpA8>ntEF>eoyA(8JG%JQjY~-EPPHK2Pi} zX278Y*cBc127&LNKF{vq5?7g!`gisIfRJFv^E080NOtdu>^7XR+?IoEcVL2+hzrhN zeG$KL+W0Nk>m0ky2sGr&=w6|eteFLOkcROYOu2~C-lrL^Y#k|4Hpoc@3#5Kimb*0d zE?iP8in9m9e~$9>!4(a_84vok_;3p6>ZF|%gDTDAP|!VCm}E96_O)O*+qj{wP&qW> zj)Ah%IHl)XPilf+S}Qzi!%n*YeEi-WsWShTGBi)v+x~o9xDaJhfahDpeU{Djnl@mu z#VVCZv3ezh!OtO0(Mx}lO7?fCSjVkoKjk;@sKZBBY_<{}wzVGE?a}YMWAaZ6Ph%V| z5o?PV`ELO8u$1ka%yTO5BR^jmHaZB;yb-J751Irgcuju(%u5N$1tD~ z3S&G^DhnA9kYgk&bM)a-0!T!jCs*cOdZqmE@kIRfxp))=4lg7MphyTVLjb(zj9RT@ zr=VvgA%3QQM94QyOAM7wh2|jQsKMq;r5s0mF(lo*l{I<@whxOkqHy>B0{8CXda8#8 zIC=hkfqHFa3DZBa_y6tr_3zu`v+utp9Q|7#D6^&32nAdKBtZ3sc|MMbdrwF^ED?Va zDue{y;F&0q6=y*@aBv&bUWF-xBRc_@Q5gJG7zX8rd5#2{U86@FV&5XK-9yGMA%oc8 zQMlVNY$FsdR2-0bwa#2dMkpSm0O|Z3-t!AH_BJL}@aojrSmbtmmwWc+tVS%aq z6(_3@ueImG=M9QwvIFC=bVhhdK867cUThH*qq9);;Ls<*>nL64R=Wq<0r-*VkC>26 z=KblK`)ze4*qc3|N^(YOF;BY~so-L1t7= zRRnkmQ-g}iHpjYN!L*=)G6d7=Q9uF%b_0PeHo@H8ONn75BEXvfF11`YwKCwOoo3>( zfJ75FtgjQY1F(--hXOIqVTgt>$YTPgq7i-r59O0Wz=*6{7w8olES^Paph1;c z6?!idR+=jp0I$>GbOI|#z{!tigJI-+kES}3zP ze_Pqn9XYY+Y>5*XiJ2_Xj-tjuO!=2=H45+_xf2Jlk3&6?@XJx`;9kZPMPQbNuq1FE zjk-;@M^(myH777Ffko1~fOun$I|ec;dAI6IzIjwZ@RxiDaC=0fFmJywAqpcCnEe<7 zl%2T?q1^o)huMs}JA(#J3+MX^lXuYfe=0H|mpXEy_AzOe0x);X3i@sWf_A0mHhbKC zAIto}FK{6*M77)9T{O(CCeKsvING}aQBtTiQ&`e*4~{J@W(7a-CHzJCHG$EGY736f zI>d%U`-RXI_=+^h5UCFu$&0^+hFjm`T`d(EA0^gV+V==)1|Iy&z3 z)X2s-Rj_4&_KjI(d4R~(veQ3~NTn2^JBxf5a|nvLWOVtXlpOK)U zs0j4w6&s+dpIM?`%oJ~bFLtbba6#|xfJh}6_F!7SXj2I>|GV-^5tO0S5Np*iT*Lpo zBj;sJL-K4xMO2YrY7Lt~`L_N;VRRE#xrx`hiT_-apfzuUBI}iEE*GMq1Snt+v%n** zX&g`-JA4~u;>9k32Sw-zE&}o%11&a=wqhA`!ftcZsE{p$q<#MXt!o1Jo6kgHIKwdU zmIWm1W}WD(PIx8|i35)-gXRQIt}RXjJ&u!GP)iStoppmJ8OSLY}{k~#MXy47~s0EiNOm{i;3JKK17u8sB;LdOAzwjdAyYD&LI z3%hMf7wT-v8LHvP2OeFnfqgiuC!a|R{?k!%4s-nlXb5!o_;-h%Yav*(fS^ENnnn7b za+|IegJ&Ht=DNK+FbiEdRy4?ou2u*JIF%Om(xA6T4sxL@=OX)K7_t3`#}ljM9`x_t z$aBocjB~vPg}tZKychU17L|czt&RwwL>r!ah4T`60{-( zDn{@Z4?`bgtE_s_RP#08e>Qka8TdX&hfQ=o6zytO7AkMdc}Eg*;^=y0-4)ddjdsUe zuM@ql4?OqkXE)@(+9^n544n^VCv-;WcjXvbKfKXZQ*)=;ppIH##kt_;Q2fdEGvpjQ zBkPi3ZFB8lWsrtbbU#P&|G>30Kbk^?&(=^_arO0xKD+P3?pec`ozFhL=ta&m&oPyO zlgf0z-_NiY{FAz~E)_T5sHaxk8Rl*2may!_?bB6m4yvm>fAylXVeVXh4CmOa!tC3Jqg>Ivhtx$BL$7#P5zPjZQXwP6ftaoev9f0hn0ZSd8)bb<$mo ztD{R|+c{Lp%q`pb)BiA23`EKnVqz51@)p!*ockDwX`#W6Qcwuu;2IelhVxN) zJ!3FhIp_DL`A#d9fRPywSvB$-dO78tp3(&dJrA2lO)y{iZ~`5f5GE%hhIZa=aU2Ft z@Ql9lyOfH+va>CWbBj-)LuZp1&wDxNU=9o*i~%p<%oo7^84cvZO|r32z4TW*Cou<{ z45lgrKH+d|YEGcx1J~xFUH1Iwi5c10NzQ95RQntv>!YZ|GFI&)N`rVrZQgn6(skQ6 zU*3-fjlOviT+)enE2Q)G;=kG}CtrU;g)8(yfg(VI~?GY9}7XadLo=f(yW1vBT9JBeEav;Fs-A15* zAPQkh&HD`(ki2j#tv80av2k5u6$ty9cSI~+oolUlevX`=v<)|*r)YfQC(H#&DSTVu-?_~qQ@}e>OV#-ey|hQDkW@mC;%S~ zFnuMZe)>DG^`(Rh2=-!rM>}l8B{x&YRzGuXe!RE3%mt8+?U)@}A2_v+!0saBzT|~s ztku_GaXU)i*4y(iNv2R}CMVnhy<^VC(THmN4nKMlb4kINZHt}Pey40%be2mx$$rQ5 z!{Pm8Y@R*fM$okx~@m>*Z$ zutt0Va9@xUVcd_`9vrN}HU1#BSF?=2w0{em(b!3OCFS`LxJd)@n*TI@_ygN!hZ6R& zS-;P6uLW`g7XWpIt#h7*y8oS zMZ3S7zWwf2|HHa<gGXw>o{pjiV!%oPwY!va7A^&LpTB!mK* z<;elw6iuME91l`_5)zXEwPFil2OKd$)_u%opA%|Ztj;cB)86=TAemSB)XVm!rQu{L z%OY}3_KMA2jc~gP_tsCgbthUwS7xWbx;A=0&5-qYvwor_aJu2l+?x%L_VAUl3Xiv& zC%dC|H&^Q3`nydfxGZVO|Fo02EC?wKOqh+ zk*P-Kb^5MW!AMfxY)_tzR`1QF-#KOk9QT_rt)m8SKb;BcQk9iXfzeoM(H9}z`Hn9p zjP{ljcsd1ZtR{8lrLNKqhl^qyur}_|s%^FYHfYUf3O^p=fp2L}HkxNN$Mx6!V4T`Y z$A2G|)taWNN*z{a&sBogk;+PP1;SVhAr~Sg4mnT20%*B_X9!KjbW}d5pH>ZJYKA|n zov3%OPDlXhS0?pf<>j^VsJO|}0Pg#jmccsS_8lyQi?-%T+blyvd2PoAABJF?9XiNW= zgb6cvt14phDy-&z2-MmgHGD7oYc3yipgNJ<>-pXL0!X=iBx*wY;;B&3jdh;Ip4_%L z+U1j{gg7A-_70U$I!@xyUJNiPH-tHmg)PY{9iZ#e=So8E23UWZOwoRSveq(Q>aIMh z>1>e=hkirepUJD|8oGY|KG!%P5FPyJh0dSgme(%PA#IQDJ&%V~7NBo3VVZVm%$Y{U z8hXEfs4J<^z1_sQRj9*%v$LzeZxhOc(g|r_skBTsc1n$r>)w5{_C0^K&7c&T8)ev6 z^5DB+o!Ah~Ebdi}J`@?$q90oqyxCa(WAL$NjMDQXx9(KVo`0*f$3l}YTq+VcU-zpp z_pMb}{{yMsiYLR*W8}taUU}4wo4eNiF0AB!5%MtK9{00n#I<|3!RKfq)N~ngTD5ns z_WpxE9`OlWk3QW>W`jF(slN41+jE5UG%c&kvT>w=PfCpkn{LU~lqLPB|E|ANsCK!0 zj!h^T*H>ttdC{YfwyvWfhesYf_G-RK2xZImFBw&DVfyMtd@bl*C$<~)Z zI3%0!rE!n?54I_I3FbEf8W9BYqq`-L8wo!AiERS7AkGxeXHp!G15EKr4mW*ee1%7^ zm}ymJsh@WC6@8Babll;*X;*y3H&$;??&5D<(xC8Z{Xp{0J7gv-TZye$n5%9!sa(h{ zkwouXSeQ9x=al=&sus2#4qnT?GvzI(w{K}*^fX6Z?2LkKlod}ZPK7W0{14yVw+S$FDtcY+ul*p( zHrU_k&fK#9k)D0quq3DAC7H8&qfvH|l}>lR`kgg+zi)SC$mt%02@G-qnUs7O;XX*8 z=X9aG%3aU7uZRV-5jq(${sVvvdezuNGnF4TrG&Yt5XKSa00lBE7Xb)K^!YLA`8s9L zzS;r|OSc_gL{BxJg&^Gdl^UG2J6J=k*6mk-8?GE+xp_gHQ==DOnQe_c%=7uNWV7;8 zQjdZa#0$X1;4)R?YMplrvtjiNL}5S*(ZEWfh_oo;nr`9p*h;!2DEFLSMH)G8?agBs zzAAP8RqLZxt{vaC9y-SdEEEz!Z;_9WNRvvQQ zxiyG@)WFZ3Gh;e$npX3a{Z_I8bDK-Sr*I(56Y~VlBZY#LKaAb}I+L&U3w?RZ>OzfU zLd$cfK6d}GggcfXpydq%2&SGZR&i<;dmz7nnn&Lj#7n4D)~6kEUJGyk%UBU{J0u0= z;yIxd<^?@$N47E+Tg1F`YFEXNxmpA--j4TzUR+Ip8e^~==L!an3r8Fh;K`BzXk1nR z!B+L<(h^D-u;WS-^f&YcI4Cf{;yX%*`SO?`^34kXXf6OL$(U7ui~AkfilK5=pL+@+ z7SJz37RwS9l^V9+?9UZvt;T-Lyi!crzJ0D(K>a0watci-m){WhRjK=QYNPR_?42*q z8-6v#99N+*txoipwm&K{zIghC?b>LY$aIa}u8UY_;0dT(&y9<9HD5G8<#XUAz4r?;Umkn=|9HCVw(jBZp!lp08bbW4mz6axW~?(Pyn-Pz}Ropb(z{qkJbp69;r_v_t~)MeVRsf2(1 z>6qkE{1@u@_9&~b(iWFkF+E?H*1$&xn$zrG`kV2q%|B{49(pT}1>jrIIGPjcSs}tL z3;zfRB=nmI@@6R+3e2v-Eq~hvtoQ*`m{HqaIde9BXHrtTEj2-Tv1dl;glZ>19apW? z4t@4kFmgMrH9S^OejDI*$cWh&CG)1OcHMbZM3YV=F}I5 zCwDIUsJD(3tE}t3ys7U|zOML@^Ky{p;{7;bxBZef(m@1&{X3{x$~FEl;?u%pLu|90 z9TK&d0A&}2wNV~6FZRwoa6Q;aOPD`@{pc(}iT7>U=$}?jx}U3p!bu%EujQj>J8HtE z8%}x%*WKT)J1dWrTjViZC_uRI?#J6wJI=VP_wR?;?-ESRu9cpDx;Q)~awb~7SOi&G zCHfZve9`S{IZdg808`;@nHjjaq=b>=yc=uEYn0V>y4_X^;)c%Md%MZ}Yssv*=*&w@ zf~+#hnl3Qnkof}IS6oKASOuWY%GLMC4dKt zPC%-Gpa3lkAbkd6#{ryZj3Abi84VJ-~xiy^v8h9Z*zbsHSP*Ie-{*G0d5eQ#q^XFi<7*7!Gw`GP9i{> zsM1(eW3_zHXd=h5I!Pu)jVD3M%1Xj&fH-ngO}ca7o*BT)!Q{$Ve!5CbsnC;99<7lf zs=8KTNHrMg)bF#W**Y^|2cbl6p>qS1>r!R2+jQ(DO0C{};N0C9uAQnoY>+Hvr_gud)SPi& z+u&N(GFmKykCM#2@S*qcqZF-te3)7)6hr@EIMQ3}X~YL~glMFRI?6@EvN+KzbEMS- zS+b%T71m*8)^8orQ>8PAy6!=<>6lP9*6z~YY=ej-4g&r|8{s|uMarm@1dE8lj-pYc z-FqRFKyh$Y$=T@rYWPL}kc#L)0T{Tr9x7p(ucg zmH!$gT!#jXfY3XbUS1+ac(j2#hH^>hjRQgBqd1}%5TX-i z`uS(FZ`bv$=^)x78N^=r2(j@R~%iB0wM{2vtW2xki&Nfo>##SW)nm zI|gf=dE7=I=p~pAp8$TsMnYo+0%dD4hsLV^=>Xb3@6CPIiU1rXAaaQ89{MO!ZK50g zhOQN05f%`g6~K7?Ig-r~up(kb$I#YcxG0m&f;A&g60`yIHWhlOn1XolHOZu)r!1PT zJUWWr2uwiujK1cwp-D<8Hi8YdsKoM3&>*AegwU^KFAcAn3_qC|OToufx4>s~GWRTFMD5uKC>yDf@Y>ptS^KAq`ZO&;T6RPDq_DM)>Y)w`FIV|t;gl(zOk zG*?OG!iF_(uZgkUW->@G>R&cGtLQY65*E;b+JZ zOs0~5xx+h5fVLg2Mq^;T02=rlQI&E?!{f&O!bz9)i>N!T%1jnX7_&LMn z6zkV{)^DWP313L0NMMf)P(em1FrryUFbPm}&X_eZbfEB^M(HUT{WOOB2qVG*uC&$Y zGqK612i^NBD2$4_S58s=m%GNN(~O1Kj0^-{5=?i8l*QUqG()J!0Tx-KN~`vY&>!Sv z3?eUqNMW12=A`$NWu2*H0ZXZ@=v%Gp6>W-XJ=ADiNm4#%Io79K-5v94Wmf684KPiZ z33q%T#IwrL$zx?-)%xJLyvDqJ15S)tbs=lZy5vn%!cw#V^4|4i8M{9i z#I-~fI$?HyZpaSywaY$PPb0m2e&QU{HE5mZDo%NOD#7Y!fep$k=ttEYh{%YUU`2l% zYfFh9>FJzJ&_)@qp~CZKe8QK$r=q$V=J@7%ziG^Z-0cWcuI9-3fceR)h^o(diQmLV zc1oJVADSLfCllCae+f}Ge{@PGK*ADl+vp@pg6LjzaL6&M0iwuR(26V&9&;kPX6;Un zRY~UYb#tkz&dL{JeJcJKtD~xy@0>3gZ5yO!-~4q((zvMLpCsF$A<{5nb0`rdOq$&& ziiZUwl@KK@x~68}k_nF$lZ|1`z<{99#+-l-8m&yonBY<$GXfe^fZmjg!NnQ?jk@&g zS6brU@Q*3TbIrf{NxUWToNV3r);b#tVA%V@-G?)^yRR zNpkgd6V4&dFT&jRk7Z~henR19>E7?8l;#!U=3bg~*LzJXZ7p*N>{*UBZmaZYS+h)Y z1>x53r)@qaQ2-r*sSuDJu={P=FE$%AxRcR<@+BxiW+ zwp#-fSh)WAFvLYW%S8f(rdtAWBNn8Cdlc|gAI=mVkE6FC1HJ1~s&#r!d$Fe3PnK1D zwDYD!WvFGMT^CX#w9m~~)H!Q-&31}Nnip5M{UJLt3#JN@9(Mwjt%JXY2zb2E+>Q%W zj-nqp;&*WAt_*tO=EG%!p;?UVP$T6+)3m9jkf6hAHeeyUJW5lqt#;S@cdN#um=efD zD!g7)ewS$;&6M2@w%A20IWqQpMQ3@%rjhl9j6S8=s&aC7c;Y_B>6&Lw9Kx|7Jyah+?z@ox`$=$Vqyxz2%ylXzhR^7&%)t90VrJ?DWZ!1gE7PRipP>!-y)*(d1u&E2YB(BfmGW zfJoHE#<-i@E=Fe(8H^bKV;e4OS!vqW*-N`ACe{gl1~FcZGJmr>#`Qs6@N~sRz!BE1f~4}`6D93CA0x_ zhS^W;!GjgEFZw9KK=q#|9ExT=X=D;I_OcHy0%U?c1*`BI{)LJ`60ApOlkWC;!yR_~-8W9k>jQy&j{XUySrI(@eH5AsQXKLcfrln<`WYIu2TE*&M*!Nx9 zX2pLrxjSHne;@Ls&o^_gbg~Wd7RVpcbw3%ndSZv z(Nlb+M=A5e3WI%()^7dQo!eoN0s#PO*M9b?$kC6o``Vy$2fQX?iD#j#!;t*raD^2D zG%`B&si*S0VML@3=5_f~G#NlR7AM?BGjeDjVO0TMDr@>_e_oYnGRP9k+W@L~21me( z#UFy~Pw=4Ad0t~ak8OyWWyDW)BH3S|~P!06@-+!OBTbYXCMUrxo{}j&r^Xho979bIl>kJf{%cgiVgP)gJ znpmBxap+GI3zy!XY4IaeK84F1E_6SI(B6uWJzg0~=QFH{kUQP@T%eZTt$@sA$Rg@w zC5$)T+?CR9;E}A8|GYOV^9PFZ7(mklL;#A%CA(A+Tp@&$fTe;7mm8#Y_Tl;xOAvrh zY&n~Zn8Y7KN>0-ET~@=2=Ns(_$fy7*my4v9BBt`kd0%e7BGHDB2Ot58PGkyl4TQ>f zCZy1vfSHsNb%0rR1;+ph*y2eLrjURp-;$r2e+1MS8&g86PZ%GAM%u8n)Job=z^KIq z0tVpFQeMd8dn(x!DT!b(VU;l81hIpw18ghheCbMHtU!*hFeBa(V6bS*0itJmhY^I` zKYzqB2rv8bNN)3P`)YumXjFxvHx86T=@?O59=MS3ZvH#(yWa*Ab&J&J^i=d?gscKk-klF83du3$v=4A0{FoQ zabQ;%z-5OJ>xo!HH1pJ&5{HNec$PypE$iBaFh7er$g+h5dLVy9jQh{?1H?&J zKv=)QgR2~)*Qg@$vWTD=Qe^Jk%?ZCzj#qGhz);fzfBVDU#pqO7s*ikCeO(}%x9_~{ zS8Wx~5g{Xo96Et%o7mr#8E?Ul*?oUD5<~lG_}>A3Kry0@ObUqTWdnRE86UBtTANN_ zmbn#3eL>o;6Xc=iH^NsNAe^`M!qmQf{grcm`$kUCLi=VxG*`#gTjd*QHe*>t6hu(y zE|kz~?2JQ}mC>Lnj(V2}^`F_7&shnt*0@=M00?vry#~xYJ9k7>SXT{fvz)d zkWnu{MTLz9i&8WGp#e|AG^9e1gyBuY&1s_(Afj#>-~)J}`;dBH%Rh79Y0)=zy#0WC z?$N5FkGjt)wjf7fB%b3fnI2;4AT zQ9uHapz%FU>Q%*0jr;m)7WG-p8X`1R$#phN%*|w)m7tHNa_vPdW7!&_X~)ScI(#)d zp+mWPK50QztMyweS&9}C8H2x{Z^cY!@aY&O>Sd}B=U?97VM|X6r$Qc^WOx3hMn9of zaU?gqc%}3FC{o0GnQ}i~o|@#H8yIx+gv8{77&YuMZFU0rZr`ZY29XoRhov1Q4H81^ z&)L0w{iYmF83~VhaTJ*T9&a>7??j^)Uy?g7WNArPc#|l$?v5kiqTL@AY8qO>!FJ~! zeP5RQ_s~zld>qU0YVpx;dF|u?b@zZa2N9N*YH2}98I;X%C)xXn_Xxc!PFo9XA~PVn z44K0vzN`j=sNBoR6D7XI1+Juj(c`&A+WXD+{`c2aYg^XJ@#J{ABXG4?~>( zl60jlQtud-s~ngD@qla7o=j_!2xCP?onxn)k7J7W1p4OB4$Nij?^t-O2cJ32p?LbG_gBgr|oaMlVm z{H>Wcnd(AkXY*TzEYW|xOkZ6SwptgBopfS86udDr4O#CW7W&vnu9_0h`S9u@4|SWq zO`K`Uw1sw#IW|+wUa!dXT+NF=z205KgJp4GE<_Y%wbdS*Y%hgd&w6$duxJfa-$~sk}s>g*F~J=KH4luzIwm6 zE*>rS$%*Us>yO?Wx8KT*dD`F3ncdrv>6iN)n14HO*Lzc8RqjjJ!tH|Vy-j6^{8tRu zokB{VEj2#*Z%Oud-m>p+X{pJND;m__RV=Z#c_>`iK7Ph7Vdp5}W^v1vq1J;qQOj62 z>pPYvt4cW1&hSx7I^)Kz)Q7gqkdKy=nZ8q%kEM1^d)WHxRD5dusJ)dM>fi5u3a+)J z-f?~Z;%AM)1tIC+{qe*mc}7!;ZI#{A_qug*r9`UTQQzlF;`@dnftL0U<-RWQ^3z8y z`vIPcoX%eu@QW`STZ^yv51;-D|Izj2p=U*lhFMU+5>c&m?~nbavFC4^BFtJ54pqa6 z&eAjAmCpNxd_6xuf4^`wH8w2?CT{01_Q4D_LKNnwz>VkFJgoT_3-I zj|wv(@t-2{LbOs}|DEAAG-%Atf4KI%_}DX`H4BKZ{>-g3Z#>+(s#qXwdst~6^62ia zmiVXDkdD)Ed;s-)Pgj_K!Ly(D{Pg!5MFO5x<@Fi1>VM4+p6L(^U3}n;aYS3%J+Mrc0(8J`7zc=3SqE`*A*s*XIOvu*9j%Lay@g zgZDW#xY<2e#uB-JG_Iwa1*AIpClWU(@u(ta-ZK%BQty*y8hqM$D%Il=xNTcl;<`S-BkSM$^+dBL_y;V+@(abtCwxEmx5 zxs&H}kPZ_34NM-SbdCmtqGcmxEp=e;SZ42Lh1M+wMix?3rVc!wVY7R)yFFK>H-1v_ z><@JwWUAo$ZvpF&ZR>pDG7swGPe;}5`=39s5Pfp|`TWvSABfJYc0` zMHi7=csVCq@B1?@Oa3#ZVE)Ir7K4c1j>|26TQH6bNx zJqv2;Fk^CIezw9SsPB@5s&ns4JD>w=R>QXAKLH@7%V2I_9covMfDhA23&<1a?DFls?nPKxBbmETs%oM8r@4B#KiN!%=m+;r4kyJOshV;;1`xj!dzXC``(<>qYTb{r)DWVor8yQvzvc{d37+;YP^ zcT;$DlzMi=`5u%yKXLPp6Y!Ic@wh4tnAz|FZ~E&91l0%x`I2}rZzxeCorE`?g$KNK zHgvFV0M^aZchf^))6Z%1VOsH{nNmWC?qP>|V9{n^!-D{dvQS?_i0Q$j?#-Z$vJ0LE zLG%M&PXt|v%H78|J(n-h$FUZ%>p;b>6? zfp5f-ls(-LbkQkKxFrBwZpO641hWY^Vca9+Hxp_Eo%{v7r#53p-I?dhF`u{6|COg5 zY(?voXK-yMc9*6XZ9Pva&&Yyj(0Dwffj`f8e<57)oL(rxzC7cW$MYu-va%lF#_yb&@@D9wK2o>1hTBkvKn0nf^J&(Rc$IPl2scF(18!&2;Eud<2D zqu92h_&J36sMLuVk)S&`by?wJ`=MfKq^*@_y^FA}Hvu^HEPk$07A9PLK~ydrQ(~cB z#yn73vr{%6ThSt1qC-?!T3LmOEte*$P7F||Q%NBL>{Y(Y z-znn~X(Rz^C94|bcabcWlKeYGY$7Uko=vJ%g1ciX!?ZGuJGctzd|6P2e`mG)J&uk6%nivZ5DBH>Cl#LjT{K=oeK=U{Li@vbvtcr&M}xOnU!2 zv*@>fm0vgZ8kl`RqCQ`Wsy-i7e+v|w!t50e5olAN;T`WW0q+UP>gjRePXr&-^W7Jc zy^g8fZ%Sf|AwHvNV*TUqTIfBO*$$Q~ryatux;Cz)JNf3GJf`-9yH{tVs=bh;3w4s~ z8uNmUXKo4ks_M$Z%5!Yo-G>*>{e{+-?i8AhDx`D*443p_q7YXo1?kKp%>y1*eK!Jan)||jh#PaS+5ln zUNmrX`AvRvh1VY}f{6d?r$f)#SSN0tw6-o$!l|)%?1Pe)ud9u!smu`Hbeku-%~yNB zu7a_IIH!)hz@N&%4<@}zuHbud@9jUywV`rERqBeNPI2P|LZlK#t8o9Co)SirF9;6U zzg0~8tB~$R(fK-$)D?n^b^x!6*ry*j9d#yq<4Y-G$N1d=zvDa08|V8c1V+#9OdiKi zc5vib@>W#oShnLnBJEgEy52f0kII?*%Iz%^FV9^?$_k+a0XIJ*;ef-1Iy)js9-4;x zJ0;@db(e#2E4PmLO#^Q(W|GhKj+Wf#R9c{1SmW?=JZX4)=z$>V<`X>ig<2w5nvWNF zRxgqQ?;5}~2wr*^g6H4rvB0|RXrSunRjO-=@%AFPpWoWweBm@ZQRf=Ob)Jx=ok;pE zgybvvhFa$d$@8RTT~s|Mx0BcX(<7l;v2IBgQl68pKsj+o${N4VuTj5L8b_%QZApU8 zO4%eSu?n+6_>y}5zSEVLl8Epi0k0D=7dH8^9O*`LuZJ}mQP%23H?bbxIc;vz39>gZ z6*q8xXc2z?(>mBH`P}N!XOkD_#%fZa{PQQTrGlHzC-X|uc^pux44C~ zJWwEYZ_RWM5An#k@OVoop}O#F4Dot@;ng4F{qX|t{XN8I_QGd1#CP|?_cX-s`oa(L z$e;3;Kf|K{_Fn;fj{-%01>SxXr0^@~?FBX)O((0T{24ozH>cU(Tt$@x=skM)>P(}1 zw%)N-esO^|p@5{SHmslh@fQ%h?W8@n(fLQLKnjj*1mhba^{rU7k8an>7 z3|Tat*{jIaU*vtWYu$*m#~^Yfni38+{hvG>3PQ#hUiRJ9lx6`K-~$X~cf8SU3Cfz( zEa*KJw2_o;`v-Q?r_G_QgW+0IscH>vtg@IFt#&DW6m>a#S&!0(rDzW4G$^G!Y|oGA z9^Y3EHWy#DQ2Ui>Dwj?@`l6avJgCTy42MU|;h@^c4;1JdpU_}beTZM^Ymp0Na4Ud% z91`tozfJJe@(CQIj$ek$h7=WCL zsIp4FN;!_@e$=r$S`|&=y(M4Us>wu1qOgSXq8&ec`2M*!w&ZOPTT2YKe+hXhC!rkI zNNKO)-%%FbQJ9RRioq&DmU9bgMIM~G3qE${o_-@9)c(uY((5su#qZAV3MqEK-zqyE zOB|@DL^Iw21dCOPzv9Bty}%w0{~8j~OPii)N)e&nVfH0I7eaGm#LpTtc%($kL@44# zpgB{J9h;JytOJ(=5><#;>@4E=gZ+^}^KMFq#doIe*`fYl*?o^#xy~pxV7QO8k6BHV zpt^*k*(lYBUL+c=O%+3$S^ZT|{hLA@7>PVSyF&iC@6I z{KQoIT8}2Cuc{^@HnN2j_&kgViBzy_IC)&;%Cmc2PA%E7IZ@L^1iE(o!P)WC+0pGs z_%gdvf)s{<5ht*uz_X>o8m!82ABVg|Q=`x{$X*6L3T{~yNL>{5S6u*yq}>A8TrkKZ z9N2}Cz73J$KQK|X^HZ0V{JU{U~3-Culi5FTns z1|0U_4tvyB#FZ?hQo+Rl8?29R4N0d5TDMi&hz{Ec!Z6fztD5~=f1p(A-@O^#ttzX0 zb|Yq0t$R&`h%O?keKnS007Eta=7CLbL5P4muK~tf4cv<~9m3H9R$@higa-s1Ss6hS zt1!flXBiWOi6N3xm>T}IFuDk%ApflRl4q4 zsNnx^cM~xhoT(gTv$n?1cYlz*07GgXBwy~@+L`V)b)Z&? z2z34NwmHY*s#(Z6J?$xe;~OXqmZ^^RB(Cg~2FB1aBu9F|9+!J14&1~xO-evHD>AoO zQBTrYC2SNX5u8ZqeLhP z?Ib{q-$UkGm8tXE{;`}>fK#GS3!%4}1F^G}w(s)ZBV=Cju{~gR!8FZ}f+xJW1^X7U zRHV4cbT+s&^=3C!>A`FF#~=iUbJ=w&+tQ4}7skL3GB%yZi6SI&zg%AVT!;Y?k2t-i z-_tw^#JZ7MSWa0F+3sTyj}%O~eUU}+PxamXh_U|oMeX219p$|6-R9x$Z)&@w00^LA zsb^ycC>r>W5-$V`mhh_`A0>nE@|Qi>QArBQ)l(u85)f60xXg)tZj4~uR3)VLd- z{^+>X8~+w?0#ZUPn#Kj*{{}5-q56r7D0o#DeAXT>RxKYChX@uWq(^Lsko|(w_h1s1 zK!i?b)-`DIto5Ehb^C(fSH{L`iP89oQEatv>>#CuyP?32DR_(-E-tMdZS$#!Wp@Ck z`E&0{0R1ZK-+m2+1-kUd6RTXmr?r&-(Pcz2uEEHywbfciY3P!I0)VpYLy18Q{HX;07-Z%|q~Z>cb}lu6_OK$vbVL+&lF_1wGIFbB z9cqW)Io2~{S?c%Jc!ORF+^`BH_6LwGn%Ivude0SE$w~l51fgXb^$KVs0fbp83Q-M@ z8|SnUkfo6TtOwK}K_jsa3FeM*x2G!~f>QumSoa24-XDG-FykWt@1t%4aH6{mdLBvR zZ`xA$nCykh0px96y|9XgSBk@@;weFdkgG1TAYVXoIp z9m^Nv7H=cYYYpZ{bQCL$jGloM*aOndMk&mb^j=bcV0%iHT2 zs1h^l@fy0G=SFNJbYw3Qv8Dn&O5^lm~5vz`mSGEg>aAL71o<$-J;EzyJPzvTiBM zjWUV|lC*(g?|F!ce6v+HaW z#2cR3J$L~Ro~5u<9eeqpHTcz2N{Qsrh&Q&2a-X7aX}|tSg_eOJKV!)~hk_~5ma{@L zjU?zwhIdsA5DjV$m^SIi*B1hOY@hP4Tm3?)Ur~xiERs4j7kuG#x8ajnu|N3bRPK|R zrabiScle`DN|OMU#`3SMT9=v2|dPZtO?jL6i|(?`&w+ zs%B`-Dc}OYBQ_rOfnW=mgq3#lX*BO8k_tqPrsui3=x06KMMXPyQh)O`#%~x%}j_90Q!3rEhCJydYb1$ZOS?$36hk2Zt;)RJsj~B0xj%r{m&r! z-ySWVqUiS()zv3aFa;K1Lye(T0D>_^1dt@5;gyG14TR4Yk{nbe3<14vswE~tGg7Qv zFE|0mhTt@$r2+QaQt=PCDs>%J1kOWz3;Vc@mlR3pT1r*Vz^l5u<9tVJVSxbSUMU$p z5Akt2@$%=%e{OsiwfL>FDW$Jhs{YrXaF`u;dRZ7W7e>R80%xuRvBpqwB7i=>KNJ`; zN>z%#ete&y@FwUi7&*JANga>CU&M*%E&0*Z!RY-ZkVX&?00qH7b^r^21i$P9M>lkZ%im*|Ogk$LV3Yg0@Gp*qlJ`V33e@39;=M$s3A4*KhR+;HQGB87MI6UC9mlP} z#OO{CzNuhrXPhea?%O{&I$*|#h~F4)05AerrdDy+B8p_~FK0C)zn+L+beH$ph#!ZF zr;ToW52R0>(KZaE=YAUaE0{htAyDWQt?*kD;j-t#RpY|7^dgP)fGn1}ZH27p3mjUj z8S#n9x<5SW15HB`8^K>)FreQT`%9<+m_f7cEzuF-9BqV{NpOUB3O0fyTUP{c5Q54A zLKlIeH&(?V3^^h9=-L`!R{oCv@alA|#y(-kZC54$J&sAv{|g{^dmaktEQymZi!M4z zybKU@{YX^lzMlpM0++-%Z;IWE7fbdhiUYIQ^GN-ThAAR+D1!K)r+m~%xNOih;bU-b zQ!8r;go5GHOavjt(!^`h(JvqdYI60dlx<*|2q;h)Bo>W@-RY%s+w%mBNp|-B*qj8m`bJgF;jt9=hB0LJ3>SCcQbD@MHR`2`-(mb zl3hGSvND*RG%AUI2dljhz4slY#{g(!hoEONEN3kEBnDSOjlom-s6J(xb+*(M1s+Bv zS4n_`5m-aPtupW0;xo3%M2#BY6z&y}V5~lX(k9*7HPIDzDwKkFb3<_V9($3JEHO^F zOT9i(e{$-_m8p^t#J7W{)kHB3VZk+b?)nJse|Z^5y)?;h zF#bFuD8U4mI8Q~Mn>5p#o0^+jzBIR;Gsl#weBv91W83R?@lEi)KO=|2>%_4{?!gqN?MsI9_xRjq1St zbg-?Ky5)B$sR(BKi0|hhO?WL4lse{ zX)F2JcM~o4 zwNnlsm;s_JRQx$gi`oBWmK&v|wQ*h-fBV~nX2BfKcYlhP@`&KQ1{ zQXQIjtGGER@oWuohuog!d>FB+1C z3v_G|CBKY}55$?s${UAzKlx#LID+GNY4X4-`M#;y*nx?;mHaNgtW|iL#VT2jo^HAqB8dj3hFG7+3%hp}BA9gp?q30$4DG3*TBOK!R;v>PtJ;N*|{G zPeT<9vKMN-@p2`p(aIq_h29bSygBr`Z92KP4YtRUe&ewtrL6lZ0I-b2KPx1&LIKqP z7n5@eCkniWWeRa4szK7IF5L!@nWqoZZFS)2#&i&p1pFILX5Av|^dcHVLMZx3VS=Pb&i91uWB)C=0fJq601 zmC1U)V@Z~4haLQWw%vT=8cpaP07&HRY&_}ri_=|!T$z`=H2^!f3goNax&= z-~LfWMPBMJezl8IVlt?IzB-gm7n3(7dV{5A!*UER-zKyb5Hbplq)0pj+WJfLt zSwi^+L^BioPEe!uXI9xp&a>YS8LD75D3KqppR3Ghf>1^Aj|2!2H6OyO+q3PtA4UWt zpKA#;hi1rdVuCJJ&11d0*s2Gw?sV5?P$p!NEWe}t&8*6gk?wm(`P%)XB_(>Lodp1b zu@9bJCdWLF{Sum8c=YPUEeQ~+I1le`*TDm5Vo5VF<$mp%)S=+Y-^7)pk=zQI`fuv} zHp~01i#M~2k9Fa5dvump}JQvIvuRH#hY-YP}V3iR5K3;1wvC;N@YtH-kv+sM@f3rB|Jb_TrqdhtA z{AY`%6~p>2pE}&Ox>#a-lG#hZRChx7$^pH&!sI>n9vRinkH!+C?`t=Uao=pae%kUM zgqzXr>FYTf5FFHnoB{%i>c52Z;rldd+|wJ=IriQt2G{?%wpaKeAAfF7y>Ixo`anHn zj;Fj(0*Y|E)EOC#E8)f2;Y<2U`g+7lhQ&$-pRNwm(GPrd9OcP@Q=HrWQH|Xn2`c3PvX(wZ6@47;Ob)v?AyB9&j&8X@H`&!5L5)#E z;?L$00}4_m8yxVnIXHsjwTO<+hx}CuQ}s`9*1U$;R&>MW;Hp6y|&|mdE+AU z;{-oJW&JDD|5HzeiRq^R7JC$!@xHL!{CAbVW`Al-0#Q_zJuBIsRATK#M zZz|Q~Yq*_7Xk>cKe18JxbUNqH7j{2i<^8<5_mvt+!Ga?=q!FUTl>SQ@74$PDc{7F@ z?4raB%qmk)@m)V19?q6^&D4)i+quqvoSz3(%D{@%xhy)Rtb z(E!~W_I;7ag-I@Rj_&<;CI{9f2ejJb~vZL2QSy3wq86Z1umj91vkkqMJ^5F6fPt2zf!q>2YnG>&$~=l{yqG; zBN_jjbFUZMbM@BY>Se+2-)mRz3$9D>q`gmn*DwBVF8EWncpc0AyMOWbPwu}xJ%5ME zV6DpkwtN1(Q@%dNUmjLnTrcAB+%SNQgA51mjfSwp7|WrKYVnlZT$$O36;*(d)&5gL zz*~(3Zox33d(UB7X`H%msDw;PG_#l-yMtdh+|;J@oY;Dn`GO7&fOr|^qy|$;Jg6-trBeKdMcK?Wq--yl0yv7He`t{a1f^r4ZAykpKg7xa`@8Sb^YsT^<#lyPxs&J%hTP(FFieY zJU{|pLKD^8AmXKrwOGPXNpCGhgM_meqJG^YTaIOMD_@SAwH{g4;CgatpTL{tzLJQC zmzJ+2iMDL5BqN64t0{M;WMQ#n&)iqj?p}};q^&Mnac3wod#pWMpc5*3t|ghc_QFV0 zXg$-+!ejlVm0QJn*5Ye_ElhTR&_*_k{C3_ernq|>Z@g*TOXK`5SRUjAPkC(Sg>F=A z=0{v?Zx*0QgtxFU%${3?2?CW{MJdudTW>Qog|~|{Ej+hNvfV1TOLIeZw#%?_!aL=~ zS)Mx;<)xK7mDMdfJ5_Zc587YB71cM%wBu-BLY=>4WFcU z_Zq)yitIN{Sa|I>PrFs^x6Fm??zjHW9aziqI%wZ2tvcw~YuP<`e>5a=*oi-z@)Cd4 zz~48cBEYg#+e1o~iRPR0knAICKs~_FkqrLY=$5RkSjnATe{V;v4xOltgg*UI?_6#o zS}=0O8Dba4{6Z!>c;a3J#|YQ%R!%Damq&r|w-&2TKi~az_dtdvf(pqG@kX7INKg@B zIOqOH#=`h<6Jk`*I@J1@K>pWT8*|)0W+o%(zRnV_pm`yK(3B9vGSZM~{v@&W*_{vb z`SWM*?!F0gNtX%w82L9fZz1&N<5Snrw_2^s65*+ht73lC?O!r2eSfbHfyILPsj%_L z2_k*{=1Ht;YR=k=0(cubIhx#I@#lY9D&$@LU523fWuRqQibKKpSeo*`O;tdH_E-*geRtEqU`l>>znVsug+e~KD=^wez!|NPY{}ujTQUOvo z;-<78!tM>cY~L{PYI%WAtZ+B4jNBL)KZDY@ayNwxrNN?{CzyonL+bzsiW9qI678X} z>}Srhk>cea;;YxZ**=ur0 z!R0INtZ}$rurotyywp4h<{lF9kr)Akk_9`$l#M`S-GqrTl`~A3Lz~0|Aw@}rWCceR z^9y-=xQ|K9k~=G49spj!Gv5mU&L;#k0`!q^}d`wJiGiII-Tg(Ql z#8`9sE0ZMa$~p^8qggeM#!KbY_p9-%Xb4+F#WR>51DXR#iZ=0HhThKT0|tPxuDWK} z4(L>;a=O@Jy6-4=PgRI)mL~qP-?a0b=`F)5{jg25yxXyJYp0`-`0JwR zkcahta^F@wru;&i%doNU_N>@GCw>3ik{nbqZ%)eeA>H)kxuR|^pu_AkH+1px$Jjy0 zdxc?{77-`e8$A_~a-YuL#zC}=Ix2b{K|7{Iq%(+SzLB4a`YrphXRizCrtyiov}dyn38P_jPw^;>;f86$P%LN=(Q~wcvlasp1fZd>_IqM`r>dmO zugQ`skjJv~Hs;-VU98%gg1l&bO>Eg?R?C2-N53kH-&KbztIe`s(qE$Cu034wC=+?ZEfLySC?g-#`8R`+LHNQD3h=uHCNT`<4;ULV~7d&9S*j zfhHDPQzR9{l1Nc3eJ`FdpSmw|vZ}S~r8wOBCF|Z{J8OPk@~x1S{iZ+DoZPcyegx?M z*vI}gE=u4I2F89FMY!k(zjBD7#X%Dg^i)9ibsqKk-jRYx&wA=3t*IBo?(IE!F7Q>; zGpiWyvy3O5WCfQiZ_^{br+$hU2$?#mHmht55S2R>p1M>RYW}8n|G@!w`N*nA=MUK!g^aWX{PPb}MGXZiLY8mHXNYsdLr0Df{8rPmWgh;0|yYWfCA}p z&%rtj$=2gV+81>uE}ACBrae8{(R0Qp*IFto)>PWc6MOV+^HHx;%(c)9C$|R~w<@3i z5vp{@(;t)g5`F5Mc_Owy*3DwqVeDD6m@~imoLo%g+h&LG(y!YsLiP~;r^Y9`!Ai^eLAVW*)MVaRN?8PH&4c08Q3*$p>hqmYYIZ+s4+8k zC~3MqODrkVIcV%u^2qJ53S{!6%&A>5tVh3CN5hVuSv|k8zuQJ|jP<<5ug{B6Rk@{O zHTClKBvweOiPq(m+{@Fgmsd(tZ;zjdnbg>0u2ykS<5g?q8%v#c1D8KdUirLwWA{e1(Vhr!!g3d0DP)S#DEV9&1??xomH%Y~R3a|1;SEdD%rK zKw>a^*L#(HYuN{^a)RYH31=#W*hvIONqc!oMKN+Vg1$<yu3nM5nxva|@x9WewH$U*URqmT>RQg# zJjuAgoKmZ6Wr5c!&Rna?yH?$Ht!C=lt+i|Qa`}x``AvcOEobsu^YYu<@;j#T@2}-^ zuyuht5Aaz(RN zMRS2g3ulTJ^NODFfv6*B5?9D*UO)pthHU4_H%2&ENa!mn9!3e0Z2x^TLetD&G!R3r zi0(+i$L*TlKRsz5oQl2sLYD3=s}bR@!zJi699Y0U=jYuzAE@nJ2L# ztxS)P$9sD)l?@o5fBmD_3*oDWDFaJ=tK%}aUT3T2obg!foKHmyG-M` z!zgSg#$$w!n?sgN>4|Yr79=4+z@+f1w|Vj9S`e2b6LA=6O}`1?9Ef`p;e|cPZMYy- z(>vX0_^0uui3pNJ^FiW^`1&mhzz|YyXw>cje1uI6pa|=+YZKy~f8szC5$qzt1#>PO zNuqSUvj`2=SO)Mib`ux5$G;o{FiILQIR$1c^E-Not$fsIIwVyuuyKTq+)0FOX-MZ0 z&Et7ji-J~ zq<(BY*4s$@)5cL~AGQ}n@(`u!I28XWBZ6~8^uB9RW3ILmTtUFW2HmjL$@WHaO1K|T zzpY?vO?ay#$KWJ)A>fBn>4)MP}vSOb%+4=HCDO0(YS;pOuo%7}kt%e|L7;Mber@ny+Nu-}HS zY2LR@UQmz(q(~1CcK<;wZu=^b`LQ3>(B!@aW>v}Eu+KdR)1SPYHh>a#iz~w?F ze)tSQz#xKyrzWOGWFmxXc5*;$Eg%e!GPh2~U)FA*0L5kgN7({Mc(4padFTSV{ovQ@ zNEp${#dULBZqflBo+?UwiY$4G8fB=+GNDX5AD52!ic}>aO(@VT_m-0|$X-Uo2?D-r zD3TZMMn{Pdp;P>Wc5@KhHwbux$We@H{WP9O2ONQ3BG^mCBWdVH@djqe{jg=k`34|D zI9w$S`bgt|C?eYmMbd8Gd-w7T^lBdw+n(=zhcfx|!t2$0nzGkBktM>G9ProuGNBO# zJe0F1m3(>6U)%AXn8BfRBy?YS+c`l+cGE`NHw%ac$m|!0qSwmnZwMZSg7rcZ_X)p&besL z_5PgOt2vMLIg0YUxAJM-+e%AoMJUzcmGC#%&Jx7oa5pO7hbDmL%_FXrPIi`{NsZz|G-a^xiN(2MtJ_JRWs(8D?9!T>URm6j{aHaCNXZQa7XW@NB zO4_L@i5FJ6v91NUKP4o;eikte|; zuatBiHmtnDVMc3Fs`eVe_6TDUrFsV9s~{h$iP~>pcdlOO%@W_t2ycVc=;#_As;7Qj zJPno<1uAt6B?=Bn0q^20lt-XCA@G`unNk(GNc?Vk%mq;D!svBt?REct*CC7@z97}- zi}D@PK094p`KOv@@&avj{y^O=dn`$!*fVG5J{LQdpSMSjVJ=Z{N)^S1*Oa&jlRYh=`7LAPEyon@q)EDD`nnKHKM&~scHaNH!iezAx!sTm zR|$b?K0W#4;`c{!s5jU>MsQ%A(%Osrx3cMXUGEo)ZyyD(fW0o_^Ue2bWa#ub=<@W9fB&@&1k2^^Jf3HZVjI zgwd!cAw|hVI{}&CdOM6tJkcJfT~==|WYj}+5Z2UBYZ{il8&s)5V+I?1H}0+Z z^0BXC@{ApIcxskot$;9oRnu($%C>KMi!%VVJP*jQx!$Iw}%c{ux?wNvnM^n`vPkUVimZdw6AWqV?e$ zl@;xWZ`SplJzVzex_S~4usTKZ4o)&SQfM9IUI$6)ZYZUrl}QFBQOLxUxxHzLP-9zF zh8VD1NNAbr)42jQwT8v1fcjt*3zEIW-@UatZ$$MesYrlK1I)JbU;DKm{QcYzs+)tbjNu?)tXd)iqfCp-{9!Fi*!b&G zhLk<}`4(7Qu244X0O~?Cy38legTGN6+NHZ#yds@$SoS6g5aV~N@oUe@HKKSb7m!wQ zsZAUaMOi=q1Utc9w1et&2XTA08aPjkSJ!`o^9gW(MZhHogwuL(Vm*`^w{?t4W%J|w z8kSVVsjyy06E>ny7YUNN8z>~a%m;W3?^-n7FWVcVO1v_f8cIGW|E$%?qGj~*vG{|E zFMay5$LUx?8_R;m0XDWme5jSuxhmlN=dUqauCr4WBN^v0^A2yh`1UL)NnHp@xpKTG zSj+ghi~Fgu%wklCj-!>Ucg|SW^xHYzuWuoF8;SZlXW1*~ zp?;_?|1~+Z`Ej1dsg|dOU*bb;=B+%>PCPC8)e~y_qs=q+=hNa1R2WIXn!=PG=U^Pe z?4{Z%i5BA}q6uN-4NYsWWdHF}ncgrb^LDQ*r^c_V2!uO3R-1{FI9m+>9r8U)ryF;I z@kyLCegt78URI(1)!t<<2b*0JeNv`D-N}taJRlZdL4<(&&USBA{gdSue(%MpU76GI zZxr75JoJQUnEOG8%=T%f9lLMs-I(*NCe$%v*Ru~4R81K|COqOSVg$lOa&Kh!1y7~c3{7Ta6sH; zbWWc{s=@lfOG9o0t~rgqCm&0GeVZVsL(1k$x6Ji}a<&%iFlEa-2ZXvY0=;a@tO*h- z+?xbqIvEl@)ONr#wEMPYACxO|??d|1g=y~=pR++gWceyME2J#i`MmRnuHFevn;^lR zlU*`>%g;Ew)e5S}64Lc?XxFU$7$nbVcG4wdbrW3)&-F0k3OI~!!L06c0tr<}6g?3T#f`q2?;`)lgS#l9z-OvfhbHX1^274i@= zfSVv<+66g|q(`5#+0!b`b*>FG#-V8#<{p5=Ge|PNNcn3k9O)_NqG$-riP!$VpZCfv z1b=z}52!*%20EpD#aS4bPe>&a?Eb4|Iv`*JfK((L51pSyXB(6=UJw~RI+J%gewx<{ zWiSM1te@+h`Cla$DdsfOJs!FjdFsxKmtPX^IPI+$|Jf3H%SHc%hhq9+7v$PwS*R0* zuD@h#^QPgDPLDt^B_V~yKz4PLYmcfcKml}Q8z4!@8y~p%>yIOn)Y>H%n{HpLw?`4NO;;?8cRjRcwCw z-t*Gg@!R3OKboGYE#__7Zi5g{WW{TkS-JG{fr<#2b3ikBfUKvs51)$=xkOR5OANXM z4+aSosNS6lpA}~g#J{b6b!!qc^7Bsry=SM4Q(H}b%DC}m-?iHGusQe#_aUrs)$dDH}1UpQFrOWr;rDI-P57nmt;t(hkUQchH4-L zbVz0Uqe~^fUX^E!pq$LonWy+J_Xnc3PBC-p1e`7(R`RExL7>0YR{3OwtN)tSsV%<; zMUnZRL}@ybz97)j29mv40+|=J=^Njyqy*Tq4yuQ}Qtj{X4&0kk=OWCwNHP~?Cf}8u z_TpUn$?&VE*S0()CcPI2C&cQOBfENa+)ZD{RQSdHLN*IG+soBtV@=%%Y zP|A{<3qJ`L$_9j>QE2yy1LjwUF@W8z8dz1YX+yC zRdPV|T06GpG1uwdhDKizOhc7Y?wVD(yGA8k(Vg_E(n^HA)o9yJWv?CC@ zDIC4KCd?5N!|x_UB;Deisfs36r5?hMKsvCvfHP!9idP?CsO6F$<=wV^A&R^WDFKh` zJ4{vgdT;(X%3d22zWii!!c)s^pCjUCsf4C~tfo~G*b#C0x0#UpTQjh1Mv-Vvx^C&? zU>?G{4Ha@z=;j_z`?>>1BD>A^BI#7#rffLgi@;Kh0efj13_M7D$wWn|Z$2Tx5@IoJ zun7d&HjR1(iH`{9$*T%g2@{~kNjz-DzqHf zV!;aFS8ZFmIOBWnvi_GW%R&Ge0~(=^mBfqbB+(S^9N%(hN}e9RCE-U$%f8+IhqwAO ziO+r9pIh}lKmY9c1>y2D4_RlQidJW)(G^;mcZb=#TNBS&Laf$F8*EB<>y{3MhHj%B zJy`aR)_6^;%#VFp3f(2=1T?8w85;e>LxvU=>qtZHB3Mg0XUJ8_*@e)Lw`2EOLd>wZ z!yLrKAS*Z1P*D~8Q;;r{J2e5{D)wnBL2l5^!>mBAM{%K*aE4l%l=ZcHtO!}4Mq|9# z16cw(aW%j6E;jdB+Hkkk=@6@{yNv*8I?Y_IK@;0J|GcgIMSJs$Z(@@x_10)Hdee1m zimc6@xVw2b^zYtfb?m0c(UO7ycyO~X=@E--VDoG;DKZ{W=t94cl+sp};-R!PyEVa% zn));)bx?LZm6)vSlRVk^EHTq&$kfd9Pas2o;-O>F@V^dsjnsksj-lH&vJEeL24*zJ zl1pfe7G}H+pbIQAMlYm}8SKt~(eZf8)foYL|Bj9qC-;r#r{4YX>WjeZc5d#dL#kQ-iWU4nFuHJDo4U%fvsJQ{DDmC`)MHgP$k1-Po$Uepj4$ zMqFmHL6k_4<#}(M<1HS|TD$qcRxGHc)^0t5w-HDEDmAOBHLK=vUGg9nKW7B!ouYU< zGF`A-fhBPs$ww8Rf8&^JFe3bk>y88Tud|XK&Dr5{sRIl#XK`vwf_6upMr$e^M_G>2QiKJN+OzNFXmp}K zb~}CQ@&B|Oq`7m5r6?QsM|PmM;?q#er-!$Q2TUqbx$%zdPoLObe<@laYWs)zcnqhd z@d=&j@(7x|c2wi8XE{q#6?`b+(u=;OnTe&B3rnwlF1<#7=1G5kqxE^#;`3Xl&vX8f zaf&;z;h#f;un)-EHoHH6X!-mxc5`0`wtxKdKbG4M-e=@mSIRxs*dfux`bWpag;_nH zf1djC%foQ)(}w65JWQ`;hdi$M5qWfV;mi8ZFWJL85P_p2MCN<@7WB!nlq#?9dvW~5 zh2A}^)?Obb72#inRH{OJDPvgd6~&#V0NS!{?bxPAV+Kp!M&+iP%ccLdq-?F2@%Vb+ z@A?abrlk&vPh{-U~BwC3Ks?JDhjhOpz|sfNo_ zU&=OimEW7Lc{!c4ysKUl+q$*g{c6rg&a6&_vvpjDtyh@mR;z7; zZc!my`cKGJ{y4t**NF{{@BY`mqG4*?o+F8(`nXJE<6u+De9Gz@`PfIw9?EBqy(xs!Mm(_a?k*B_I4jy_ajgUG^lx?=Gz`UR{4*x&C4M^>?S(?+g!BdF#H{dsx``ek%AVqe-gf#W7^imnVtx@5T}> z0Ae3^gZ1S}O=Q)>Ys?+jt1tfDulMfu`ueYnQ)n!|Tqa&aq7XXc1!YWpE$N&~iAZ67 z8s!j@4kImSD+HdefTi;s0VbqV=|BrAJM#Wp$c`K%&!Ms#BMgPGRj z@5X8)ei^>%IQ#3{(#Ky$JT4O>VR&SfINOsfV;cEs)p%|oL)+)pku{Tr;pE#do0t7T z7*2weFG)m-b{cKET(M^>yUKo22RV@SXr#rRKa2e|{wUu#vV6O_s7=l#K{`>@@`>|C zx^>B7LWgAmtAu#AOXMo+#Fx+iwyZAC_GcO$TetbW^5OaIV_(*{{$2g{?rEs!F0*hj zj%F$3UL=T7HO+)T(IO=YMs<$FiNpjW=z3@Xrb!$YBrmMq!4C*-5-Y`kLbE8wMbjHi z91Y>~RB?imuL%iKisoQ}?Iaxn6dQ(p2?r7eaqq%gE zCEeWm%ruWS3+%kAaGQPzhY|XuEfRhcM=y>@;4f2%&)qrfQ$Gf+vfsZ4N`wTBn57+`uMbdY;j}leD5=he;ynBq-U{nok-HOQ(p4E^f@)qqzYH5`(h3lFYy z5Lm#1dx^fJu}`;0Ma&{4TdU3AXyu9Jt{m-b^y)gzY3COdgz zk=w5K7fT%5cZoI!o6=22?&a;(PO$z<>=D~xW85pX`@C_VTttU)zmm#Am;JM$Y?`;) zCXMBCf*X;meDIU=2*IPLD_lZLcNT2`YK*aAo_K&zQ3o8Z7N`$m115(wjSpNL;#%J7 z%u!KsU)8<=?$2w#H%G$8>|=tu|8_mS-RobMK{43~_qiL`A}pEFa__>=>~CF#pLc0! zk%s`mQzuEi^482ZiSoj=iZW>$-$CqdR!S^DIvcJXQ{EkGwU8Ha-|AiAxpk|>k`!C( zAdO-TzP7PMMiRhBjrkFq#=X})f-|`)6Iq$4#8baJSd6(x^C~vrfbTMT$Y>U zVbxbrpaKAEXHJs1CG(a?Jq!&T)5NusRM0?wgC=U`Na|9|S>DFXI!5r}Q)&vay-lM> z`M8j`9_8{FmM z-I$Tnp`m4ZW6=G0W2X9f=U~Y&tuZnrfJ#chDQCxtEk_Ve4Isj*zS0SNqmSM0URga_ zGQ*NT58FK`;K7r(n^?HY-~l@noB}yx&DzspAWo!<7`-cHOV zhJ+TNC)$it2}fd_BzHeI%p499DZ%nKLx?n(cy@P06_=dMP&(v4%BTTAUMiOmP6UtfW#aZJREl~yR$$o= zg8g);$W4=-;w|-wTlEh}e3VUgM&DXfMI)7$!DgD8s-pXXULD~QOy+A_NK7Q4Uh>Cp z%%PEsiNI+DxuJuQz>~O0dJvdK`BeI$xT5w1q?|8j+fKe0RAaNLEZ+&b*BR-YVEa$#ig=y`3_Y>_;i`LDk&VbR)x<+_OU_st5-Jlq| zaYIV{rMHQO>mlJH9L_gODTTyi8oel|d)Z;|Fy?EDT z*u&luo#26{T4s8~k$H7hITx3(*@Tk9%n5Q{59(~qZ2nwXy&O%%o1e)_v{%jpB4!HGrU&zDe>JqOKq$~fEPx|x6@RP^gm;3IM~@u+gZJULU$kD zVl`Z~U~F%rn)-1({vpSY;f&?>WEE2Y z)kMi-2!G|F26=ec%_RJC1l{TRdG}||Gbp!CDKqByq|>t|kBLuC+!`{~%`)!_@S&=={G(5lV^l zM5)0mHNyq9!aWKhtrSR*gnz_#<&k0Xn;Ug#Itt;j8!`Bt~xgY>!L-%A)l2*n&4e()jKd;&z zFNnT3Irs=E+t=%v+R&4e|1>;Aig6X3(<|eo#d%V69MVPvRM{~H4(i!wyLTsc|o)V`|J$2ynS9a9`-y^jP4 z>j@<`2uQ7jMbakC?xR@(jy-R#CI6dC$?i{EFSo}sGGk>E3{dJEO#pZD1|89b2+WA{ zFf8C<`x~*QBQ+1h#Ub%mD`98ghL)8_LdX=ZDD`WMl6057O z=-tSvzEO0Tbop9P*0g8+;cJ(f{d-;0loYbD3Jp`~b%CTEBZn`l=~l1n)uV6LGcm`V zB*_Kj7R~r(_Z~aEljq-_+lDt-Yt{WII<|-F>MVF_Ng;bu;l8=rdfW_ev>1U+4~LM1dC*M6N)qLmhhQ& z!a~4J4LVw?p1uozEAjvf+2ql$i-O1c;Egeb$Z4KxS-eMXo)TFVxCPN7Z}I6ItM(t> znZ#!!5@kO3tXag%)3|ZbKn_b6%0g*4^K&00(NC4>l+vFy@k{7Zg#&L7pP&7vG5aO` z-O#Qp&DMzU6-cQb_2xGQ=zl3UGqPi;>0T>cvAv~L5x=EV%~ZHYpYOA|Ld0Dq=1<%R za$eetrAx*$G;QdITLBTv#Z(F6CGFI!$y@xPjj@lUBL_{G?#8FI4q09peP))Xb&9R&$#0pQnS?PssCa6nK> z1>b#`l>=|n>t@=a*oq`wjpeirboY*A$m!df0kU*e@FV4H}w%G?Wy5tweakg-kekKoqsiX zZkUyQxLuN`d#zfRqGIl?-JCx=U0^FGh$$A22rT*>UaZ&bx8L0VPI$?csS^43P^fvp zrRIP%^T4akfyL&#Dw}uJneV>Sy!(Oqp8n=NPt5l|Z{GXbeBZm~eP7J?N0{7fldo~d zg0g91T%R0lmsggdEKe6;_le|!uqJs_$F;l}2sAM-6~)({J?Oo9_>r39EsqQc|D7~r zcej*~+?m#nJGuW(OT>ep^KJsIdHnAZuSDdcX6PV34#|}d>md;r-vE6OZbQExIQ(%F*~R&kSIJa_#TnH;eY(+PaLs{mIyS3DxR<*;X-Teroz zJ9p0c40j2~(*ggVoB_h(gyVBmnINI2Q@WssCJ`U?hoDRuIKQ7Hz&?d*0`6F@lzKwl zfz$U~drsw>t*tK4)9)Zxx=2}f)a@;^8-AWkvrM|$TFluKIDLl? zkuDk^mFDsh03o{83%XPPv&Z&ifv_I?nYNvyx5yJm_dcH@OeQH!1r1;W+=mcc;)?!@ z_a8cX_FU<3>%XtKK))lr2*P4kN%|}ij-6I6`4ui9M82L-M=+|pp7g}3@cCMdhHLmn zPi1l@7X+MIp`%gJkURdDE8enPkseWH=Op}IZhh74zCxI+>RkKlIX#u{R>e;4?Q?<_ zwJiHD5PdfGbw_h_#`&UVYRacaOQ$~y&9cwj;NxvNNG~knZ>*{;CuQ#JT)W_1Soo{G zZsTl775>a!{83T5oMe~409QH*!sJS71#>wPo5S#}L-lS5L5-SVcf&dRotxw1c5aqk zSV;0V3R~plJ>p$4R1y(+B%vq##rkrXK+rjptber2&)H&$yG3GDI{BK5Gx@(B=f*!t z{e0;}wo*w;Y{vBje%C{8qe4Uh z&mFe4cdECK+ZN+MY6s5kT25ze_o+Gb{C#-36jY|23?PODSloM<2v)xkX3x!^UjvGr zmPdd@jO7=&=Zjg7&zIjJB1d-q_;AnGW+L?7ME;B`>Md#f4xk{_!Vq?0_JTZsSq*oH zPr7JB(vajl|Hv7@(p9Vex|~1fkbC8!=U2a>^If@+jdc0zr`IK<6l}FX*pY_KH~@Q= zEq(YiDnv4tWM29L3&TC4#yzXAf`yd-uB<4Ys{J*QX8Zo?`d|&(Y3$Agemox!>=D2~ zr&E-`bg!4RBltiF(g*F%i=yP0n^)DJ#;YMozWe6mW#3RHZ2W(Ef85Z~^g(c+)a`Iv zXmFlxSopLB)O0E9FwQ&>w|JDXkhagmw$wl9P+!jOwfy_P>$d&*UgRhMoWgyNA{iG~ z?0BXS#`220BvSu~D?vky1Xv9YB)SxG2mts)ryj^DtM|4{pY3rKs1LglkS%wJ~>Y&2;RAFw!=; zw4m-wV%q*4x%_&5n(Fo(o4n&853d@BPITm*2;F$X53)*cy%rt*w9>26|K7Ee5zp&_ zinaQ9oyg4vwBvFhc=i^AlkAeOM}BOzR+RkdZF%?SQW9dt25?E@UvCkT5^KzEzD2hlo0K#NVIBDU=648MLy(w_ey&Nn_ZO7>Vusk`oG*3g3qO7-fK3$GdNQ-~V& z>Q_4RX|!L3f%hIzP0}A5P*3l0Q&5!TBpO4k>aanrP2!~V68Wczy*2R^YTaEO1UXOs z=YhFvHC$(skZ7jll2P(wZs%al28kTC*IOeZz3?f z_SwYls7HR!_nujL_I!Vmjg(uLv(Ciifquw;DkSgd#8ha>W&i2$8?_VD5e<+0UmR^) zns{-nQ+Vf0)S$uhnG>V#J71ohI{N(O={J{mzB=>1_W7%GUmxv!ePM0s`Rj|2NC1z4 zGo0kbiFpLPNl2393W*bFc47rrOt^H-Pu6kRUxJ9`$I1A5`dcM8;)gdZsVQ&z77$im z`$(LIGL=Y;k$aw^-L9@slXxMj`oTtGNWfxAlHv5?^>mN3FMRaqNSqbSiJ=RBqEeX( z2y8zi>1B#)Zknz<6}qB=)dUrViDwNBXR)2I%S`U9p3$M@3}g7yh@fBl(nNIvREkRd zvg1K@pLoL0`jP4)FJaiTTs3Xaw?W;ynQsqM3ZS&4`?+CvKvP2}1Z-ph>K6z&D0H)@ zsOktXE53Om!LSM(1g>Fk^oWTEYrYo8q3NeT{zdPpe}hxuLi50RPd!hmf6wptH|k#f z{@Czj-=@Rp$&l)oGcSVZkN0zX?`flRk%mB;wpH?TuU(;rnq8pDKS3qN8 zv}e1Z=^JEQA8ffK({br&ddl9FS(#4RzHn8lj^abLRTPN{)qg_B(w+#m)1(^CES|*b zaG^;QFehlF`IU4D10vmX21GzH|C^N~7=Tuis9@{+lKt_f7?JeDryik ze`H&@@gxyC2MEd}0I%=_w#&^+Pf}eICcV>Bht z`rfyUx{+4`%djC$h``TC+JW2wx?=xA(et(w;2bMd2*brfbXA!)XX!nO+A?+=s-fus zVo7$HlF-T(K{Jq`i^$X;qee>(a#bZ~%P;lK%OfXod)b?>CVBLf0)97N5)rq5UwOHa z)V?qJQYAu@+&t-B-2};RC_pFKT%x5R(CnI|(pwd$))sP@79KZSScQ9keAwA3@857m z$^^mbGHjs(xdL6l7j^0KXskcFJtCW7x}razG$zbuhi&+M%$pRhBbwOL! zW3--Z7d!zYr-L|Zh9nXoq+bI19E_L#d$I`-xZWgS={DJ=dWet!u{sUK%moiB2~Ek4 zQ-LjIKO}t)Db%F@mpn0Ni{%~w6~$qp16pE7yV8-H%WgcEx&); z(inO5?#myaPj~Lvx(1cX2T`!ARSc}V8(Bh^+sQ|9ONlh4X^XOYPM}EpzT0QturWp* zxH-Fve@_9?Y%W6+mfl{(Y2@;+4Arfu$|X5g(8FYUStsns9AeAkOdHgS(-8)U^l)17;;GpQHgxoUjx zGm1Z06_9lklL1Hoi_qhBQ%k=Npt?I!P5|-cH=sjqn_!+PPOlUz(qyN)J>V-DU&|(U z%YsyoeF6RrnC6imrGV3iWG=rYYO^5IEG_@}oAYFkjT8k&$o4&(SLsv9hu=1#0HqR9c&bN#NN;c-Su!Elg z-YL8L29MSIe^-lRUfeP+in@HP;H{FU_zC5DXa?kO77P?fh6swYe!Z3h5cp2|TrlVK z4pOZW@t5r31fWQ^czE;z_a*iC#+j}QRDeX&Ry+e@UaHB#h;}x5=7JBBafEVy;rofd zieq1@MG^n1{d^m1ev~<;eJT8M;n$zn z&_R*;FUVC(U{d)<&c<)*K``MlK9}UG9mW~zwdHHMoSEows*R;AD!IR5rHDUE)jA)pl_YjFW(nC*mJv6rIT$nl(s< z)Xr)|N`1X05qep2rCRIt_@KUcRpG6e{O5h@Cp*yb#+dL@1K1aHy0Jx8si#q!QR803W$qLJ zmO4uh&UmI*3Q6KU0d(lCxU%w|4&%3D|FKEmaD^ZMb%$a#MuY9;q7)kCjtHsy*qfOf z%7@RGy*4)ZXynQ4us)cnaQei~pVxN&{o-B{sP#`zZ9hZf5LwBqE?v0mWwz4NGAU{{ z5K3LLeE~zf#DJ@|kn{kkI6Jy}T?rK$HKiuDtf+!;IT`Jhi9>K~*N;K3y8L}gGH zw_AsA!W17yN?mku!2z2t#TO&EY?Y!ZC%rEo5@+2o3)d9!vpz;u5|{QmIn{l~xVk1_R$kM~LH z_DTEdLpSx!iucXw_AU78TWsogHr}tI+pnto?`8h2m7l23s`EsEBozp;!JcAmBf7EK z*Kfm*Jr8gC-TQjzf%j_@){}Qv&5nz~|3d`h5Z)}r;t7|c<3fTEK^5=lP$R+Xbw}PB z^E^BZ{e`|!M0+MaUBmu-jP~jB7wyC}$A~ttutkx|%5+4}l%njnBL?+02(vwy9z4D$ zc+a=so4G;YCq!KDiO9*`<~^}3#$7b7STfCBY1~X| zx=iXO21Ehrv&GU7j6W8rv( zl`S(_ACF_3d!M-faT{Mpq*uf!*O-L3Pe6v&fA#gN#Tht{p$C#t?D)t>XG zmGovCX-Ru1U7oWmE9u`{)2ffvzB#9TG|IR+M(4(+&SM(nc8M;g4Yo>F+5IU|uW*-Q zS%6m5E{9@0yA6Raa~|st`=5#%)Sskb`e-*ph~}4xHA}=&7efb{p+Nq)xGT^-VWcr^ zWcWpU!biFLksZm?#JN=8f)fQHVY~p;uT$QkJ@G>Co};s7G1Gh3uENIR-MD9L;!U!x zpU{%}PN&W9&&69*Gc09&m6(ajmDiY_a|>3PK`ov#YGoN`OLyG-qOZEh3zGvZQoJL*KbXk3L(6yBr^t1}mO} zSy$wh&h3>nb9A;W^iDeKcikg`Z+~s`j3YYD*ySa;S#ml-&9Q1X$ptvq0 zv-Sv@D+Zdw;~Y~U2+sU4Jt8%+RkDRG3zr@{-<&j|Fc&L{*rjE@tF`CsXj0{bv>SN5 z7u&7;utG!l>seuG_g4$Hb>zry7#KYSohKwEFAxe%1ZAyiTsS?60@}Rd2ifqC@gU=l+X(w%3Q>2~}5a z81)u6?5^3j{ZdHsCDG;RZTplW`x|O{Pyy#JrTuE8|2iDoubh40kmYsAh-K5+xN+cq<`re25vRR7 z3VXF+7tklvdz`!^Ue|JISn2mF0l~f`ew8l5%98xu<-VgkEsNI^DFCQ>n!dk#z>3hb z)npfxOkiG0BSX7BR=LOLs&A|IzLIqB8+`@8`>fyU?G>~Dq)}$zb<#zcSKWh0eGj1|f2qbUOu2R&2^9sjQUh{<%A3 zH8q+#H8C)C@6Xf&t9y@A?=1}6(>mYKt{i%md{AIU&U?cnLMnFkd1y6lNM}jLjJ^%) zqqGdfTb5+`_m}w~FAjurKuLX(Y_5#;wcMZOY!{D(!WGur?Ha-e1XzCfdT_EmX-reb6}QaWp=eTf^sKTabhXZZ68(9J%;3 zk*_#Z4r55IGMaQ{s?fQdEinsZ7=#pp`a6C90Ip!E)#X{Tx&lKLO&*m8q+2hv>Kc9t z2p~C##J^-~4mubjvjYgj>8B1KgAd3`?k~~TD%A`q4PGjhV=K06UD(_F+HzSY!YcCggw$e!^o5vDLN^MO#!84e zkUNL3ZnueEsCuGR7iUkm`Xm6}{RLbgDL#yf0+?hPYpGRcZ=W(&b`3?rpQ%=R>ZC*< z6pBMdC=ls>!Y$f^$Wz6<_ui+zwl{Phf7b~iT-BKnhEovyyQf&`MUU?nJ+xamXW|Wv zR0h`+A)IUX!nzub2MkWv1I{3X_PZ13AWx z_p7W@e*M9iG|g1#;{fdpio;OA?yzV|bYCQ>8DoeY^j#BY{jeI=EMrK%tC3@%hb$}P zk`z)Ujl-K|^jtV3T_FDSI)rpTx4gN3JkBJri93`jAZwFv(YZ95FS{dM(DLe=i8DF} zZ{=HFTfSGhBjumq_O8_j7hNvc6m0K)_xSR`8^Ud_0p?6>7XJ-`gCIf_4+ENeFl8tM zE)nXqNF{v`K8HK6%Lu+N76RL?DbC`OYarf~&{r>SzIEAXzk6ZVWm(eaR}SY7pSL`_ zT(8t)XGDA7_B>1GV2-j}$F#O)Vn0LNFxeQW4hueFES*2{$aw{4B_2jwb=@}VRgCslVSCRHdw7}%Sw`vDdKsPZ1gS2 zt~b;wnR8IqWX!}xvg{umO-)4?!;$mU%p_N|CCI!#qkCOE{E9_O?^@Z^(8(<5ur~1$ zu1{+nYDnCptOF6zWG|m077ufjXTkcYR@*HssVzpBMsN@?8nVR;40j!MePPkTmLacV zqX#zcyF}mo_A)Q})~`=@qX++;KkDUb>f~M^??yTQS^!FYih}Wj3IMC2ov-Av?rXs_ zVCcAFBzOW@w?i9^yU{JMSyr(VJ^dyx2Wg=Tttsn5B;$L%O=A!kEFX+ty$W@k5b)CM zy5!nQ;Ba73zNd{Q)KAIkS7C>YIKs&uns_0!mz|NY{wbk^`M{z*2@9b$1qn}&wWn#S z%$2L+&+3fn^(N}+z#X9nrtBR|X71SYrR$56J@qur3`Bs7Cbf-B=e3pNSdx2_-j*FH zOj^?$yf^7$4| zICXtkWMAsW9mS&5%}Iml)GzmUill8l+_x|7>yslzY2ThkPp5r>IqBITp7Qyg~Yg6fhk!+Zv zX8)fBA$3~{L_>Kavz*2e&I}(apkB2_=Tb9Ob!##En8V`dofx1`QQ_B!l*p1}mdWK> zp=joa+&k)NV^Q!w6)`$(aE&fJ!@`uVQy`U8sMw)moI)HBW~`D>Og0YT`v5)aj#jLk z0cP_wrtXb{|Gz_)%EBdU+G(7p(siRm)nBiYro}gN(VR@AN}?_D<>&|r8_UYn<;Or1 z+a0DjlE;4x8%+L}8PWh@bx0sPpb{HN7qaZ*k;$o4nCcc6Y0ks}U24Vw+=`lZIZ!&# znJs&^GbE1%QMI8U{0)$JF1xQI!8%DEz8`BhSF!!1;&~f#r70ih$n#wQ2w332y~Upgv0lO5$XO z$WyHPzLp25$4|-0JrbaY2si3L(k4qt9hZ-{MH~@$Hjj<=FObRx&k?}e>3^ED%*4t} z+`90bXn13?mz?YXS5SRkII2mt*V+4>$23B3&#oQ9!W4q2p{9D$tokddp51i7Rh*7N61Wf!k(Rtua0!=}cw05Q7(fY@6_pTF!HA-Dbje^YUj-uP zb{l?lspm%Ly2fc(bj~TkHw1yCaeK#NXhHx+0H=a-h`L%@BluR+CCLHFg2JA!pGKbz zxO?d3Rn#THWnx~^RIvWFU?7kPABY=w!izpF-t#6CEh~!x4%9rNm!qBe?PCyWRpx_PXIc9gSEL>*6d6&7! z?W36HB2+xp}(*WO3j!0a=sk)`Y!2E@=SHT$yewFE6O!fQtp+#0zQ|IjD!HDuvZ{Jbkr5VIJrC zPa9T3qmiIg^CDSkN%g2?^mN|Y^32KsO>dtaYBY%4bJhNpzZMm$f8LwytepO=tQ*L} z^^V9#^=mlsKZZ{`%x9uc-23~fdEfnV%_Hh>+A-@AMt?t#!7)`~1Ajjkog(X$6c=V* zTu54Td7%U*Z^MpoU1zpn+5mcl0CneDnB(BEb&P)biXT19!?-iD1vdF;FGqm~`{KHQamGZMO zJ7PTh#HBsYz2rjA?R%jL5Z-d=(YtLq46U0 z+_OJ$RJH(V2Ij*>9A1L&J-M5unbWL^uSMfCX7Y^bIdw*PW#cKjtiOgV+6u(#PO0xt)5{RJvoLRAt%gNmv4J zcF%tSScv?LlKkw3VOm%K-1baTgU_{q{hFan#Xh6WavPYTpavB)JL4e8VPQ8wcxUFJ zg}~-`D1v*oN(zE-141*b+h{<+;DefR$A6Y-+nx)oaDz!fw{iKuj4`(J9H5+&W949L z;RZZEd{+25;#y>=G`_IHEt88ho-M6tuDCF9AoH!p_{jpYpInQ?Y1eQ7uT^!C7SMFS zwW#5Z$SR=2r@T3yDYa8a37XAHQ(uHPv2poCP&7lno>T@{7s}WPqmYa_rE@obUKo-# zuUf4HpmNw*wThq4Yn2-rRz1dm5<)uG5F&%XcXE%tz*MpPs^=0apRZk*#Z+x0LT+*@ zzJ}L)&++OCIoKz0Mp6a5^oC)S4g;z-l&yU^);E=d80AA3l@3D){$(C#XG|5uwRb`& zFf<7=QWv+A1N~fwNnzupcSDE)L8@3VTo)()OKg^)3u7U%BzpyHT?%hqY}-?^$t1z7 z1*Zo()@s;Ybi;zNb?8VP zn5NYP?dGQ+P9G59)8m>rW`N9{0EKK(*-|808^{2`zLmJ+{Q>ew!2jmzMy%~zq4$Qz zn2u;eC`g}d@arou3XsqGMLhk~NM{HU7}A7nz~#I{<|WrNa+`AdVd^oESjs^oNQuM} zG4DKXb{!>1goxmfMga}P+U7hgzU+W;ITlZu`%c_TQ83f8Vw9upJPc4wy>^BBBG8*MVv65V+eR^u9wx zpi@+*6YtU~5z#4`*D2lFDSNk*(Y5pM2tkDiy*h(m56fjNwrRB5940|=TK z3oLctUnQpCA8xyL`!Rld9^RA`X_Jlj6!D-F3*WA@wd32->^@N{GL5H8gT2w991&-r2=I{6&hWOCJY#zTKqWZc zFOFUHoxp1e^e_G&`xa7Tmhwy0}Uzt&3Sn3UHM1q@IBA6%-j)jq?qRo_)9Z} z#)fewN-^R`V_HM-)-#BBHe8rpLQ;y|LyFxVb6v`Qz+4&X;2;%B9+ljG@V))UNDC2VjfPL%3`&&F@^rmAp76O%ZL#1(nBI~BH z$)Eu$_UkfLvv=U$?|}ybKtOO%M-snn2JzhEI$t{C{FQ7>2UP+=g1e-&-rE?{P(=51 zKutj}LGl66=1mP-Y@FE$shyjD<8$yvM@p7qjI}*2LZ@CXHA;QMr<2tb~QJY^R?mow|^G>LPA& z3}4DSe}(4qS)mG_B@_t&RJgD&HTXad%z zppJmQEp=+T5w~>N&*H%p;7tD$oRKjBqm8H6P9ylwCx`;a*Mg^3zNf*e(&hX;(=OgK zGQ3x_@_?vx4*CIUAv?jJif6%h*V*qDCF9Nsnq$yV!VC?wB-obZidAw>c5}Y=RZTzM6;xxaq~a^MyhS*noxds_6jhCl<9(W1NyE5PUcJxbke)!SZ?3 zaXhsR*O2zKSq~qu>M8UWSInaKTzq0|l6|0$F?2KQ_Du#nkzV8?bh2tLaQ_${;>RWd`M2ipdc@>oi;>MlY!eQel#e$S!)GM!Gv3NJ z9m+MWJ^flu*u)riZyR3m3JwwP=I55zTb_4=iNBMzILNELS;Do@C1OCw;`UA$nj2Tq zhEpcJ1|)=;FyL#94*lVZ+AJE}hltR?)Gy)@jl3b>T!4E`1kdDN!VPVad;YyKD$ZZ} zSt9D|?USzJxi{C2wmjUo+`wGI(oX~25{$Ss>GXC=>V>}$@L`oNd|WwINPecLH*7ep z+axNdgwTKhi?jCf9M9&4qS0b^9eTmj@^IZ`Ce+;4^~LNXJH(9+1eyR#KDiB}hW}58 zbOk5j{N!EEjq8_J%xr<5K3>HA0k*RcE9z+smon`vuE&)uu8IBg~27mdJBGec}LBNfuN)!(c()eN9%zG2tkJwt6=IZNb!uXfM;O!OMiUR(c zjooWu&<#+Ld=VT09V?q_5?*?}`lF)iXZOisqV4Bzg`ca`OG6VS{5mE6UHSOuUlC4( zCHCsW+N#B!!Vl85MS7OSt=9Mw(qo$brph#lv6lsPTlLR8^Jvj93gHvm@c%)^ZgO4@ zYjw?4Co(7%Q5SrqUv)NG)7*qQwacM_c=EojM9ewk7;eW){8E<>a|gHq@E(4$ior^z z8^}}Ac%Ak$M#UIo5pZ}=bzg-~N>(|svz%DF_4x4DE(izXt>4V~y!bC=!ml>lu38(UY!|U{r!^mE;GeeR_ZZ-po$(L# z{+V?0$;)~c5W!kX-8TITieA1Z^s1R;)roJd*v|9Olt161<*#VrxfnibZLg;44A(Xz zIA6}|c5MMi1ttt|?i@m;3Gni@oqs?mG*lX+T8KJQM)Sf+xvJq}i-nLzD`*Fin?0ne zjT4@s%wTxh^n9chbY@+N#>5|$`LH!cxpx72qS_=lytxSSI-h(-bN%Q{Ew}~6?e^k} zGVPiz37z7k%aG`SI=vKD;~4JD^G|P|&3!(?p(8}p56!O!+|H3O2z@@k5j0+`w(ruR zh0Tzu3e)K2=L=u>Kggj--T&!U_-wOx`(8Z~jSQ{?2{d_uyloJu`5!ivd^M)l?m82{QkP?P~pE zYm5MqDshz6<2-QOYg*+wxLsa+93>pA_j&)J6OZG44ySzm>O;wpNbn8JGyUcpT~@0>%zbQ`i%oZgHSOX2E`3XJEmRKPPbw_D`oc^|TF*TYuu3g}3(8dLpMmU2?nT+p`C&oiataPRj6>fU=6v!TVOt@7tTr#v_3h(l5AomN|R~6(@#% zoo#BC0WrtnB*A6BgrrLsL`yD2-B4uBuZmcJq|6A2kKa1!`={U0cmLXGo`{jKJrI5= z4aw(nny(x@0oD_Kux(?d)THr2eaA6c-uj^<|j-*~~m252s}Zuwg$LJ9VAh z(&Xs`lnRq2tPDT(tA65-l^FS!n;r6H%V7ckA7rUJZhT^KfY9+oJGo`I(|s4_gwx9H zB+Hjh+qnv$+;J~FaWP2#BQJ56)v|k0%9|j?zdv@7kRGfI)nFx|Bqw`y zkK(-GU={hFPEL*R@nmhEw-UNuB(PttC$OCD!igWrY^ zuM3UmkAQ2HA-h~D@PpPz3)(8DPJWPRU&KtC-uQstmVt3y4R9~;iL5q^cb*D$oUTyV z2r;2gxE>DmyzuNzsQJyG_uNAX2*t{TwoVbM^##V|dw0{+Aom(W?&Muqr;9BSp+?El=iD?BZVE z7rZ}?I9qY}rt9R)N0te=9&^rcpNt2OWn+A4ByY{7yVQ;L5`Vt`OrvYn+P-3>caxpk zG53Px*^OWz1nd|(zSsC-gaUA!##nmmD#Y|`<*&gfg z?#Shlhbi~FD!k(b;={B(Pk!yH;4U;;iawMLL!4CF3|rc ziY7-vHvp7h!7z}@wp9T1U6*Mnet}hp@m~R$pdEbH?&SY!xctMLf`qVh5!qXfIv)in zCoW9gbUe{<`W_#E`19G~Qv4-&_qpR$zYncC`t(2Q4n_(W%OZjiAfk^JQBBhX>$MnU z?Ow-|>jQww+ae?o(Sl)l9_2RQ+lJ&W5py(XRmhXIr`q&3Qf1xJ%es23j(>`k#d^I{ z_Z<=lrDn)q9u*`hrNf+nDUyUKgVqxuxc{J*FvW34uqmTi0|TtZ_@tNsMP^gp8xbIVpk zl3@JQ0y-^9g6hwlhIlENs|fq#>^R1P`|d*P3P;9mynn_;CiXrU=}bQvxgz~NzQgiy zyY27iugjE;C(zlkwL)oO_8JEsR2IkXIRgPZf|bl?6FEQoNL3^%#f)l5s}QLRzv6oF z9&aY?T6N=htC7uy`zIZ!7aIJ62bI5%)g$BDPRd587#x_pu^iu?b}u4k`OX7C62=3L z9O_;G_PXs5{E`aTu^u2bJCO}dH-tdEvAbzc+v8rz1w9u_N_?eo!Y1kcmFSV)Cz%o_ zTaMp5TJz7R4{qHQ+nMB%viyDS_wvcXzkfg1ArFEP^>f!}5G}ZIO6ZbiFOp_R>qXy2 ziWxg`yPh03KZ3e>tJ3HCdl#RCh{`bw>nk;NFp(}~8E7a!A44y^cpPFYEL_4nUN z4(jlFhDPe5(5b}R8izOXj;7Y(xy-PDm9p#kmU`jgI&-dv39_kVr=S3UmGC8$%^eYP zI)$6_1?S@TJVd#=dBXrix^~yNd1gSS2$b^;jHm6ogckq4xo{m;)Wh48~9# zJV_sSFZwGI=X7nw)*z@zZs$*Q&fgCUdtS~D(!YV3^p%MV7Z-N!{Pl#+`M6W+w+O{X z7D@bO+oU8+$cLT(p0HN=THtl{7Xxx@Z_w`R@ex*VR}unlf$PW^zfo9JXK6su;3are z_TZRnKQwXkwC$@f)J)4gX+X5qq&Go@*`(K+L-^oEadVsxKptV3VBmvS6 zO_wDa(OVkJR5;b-+sQ$#toq( zq!jc4&|wihOhy~R?mX8Vt%T8v$P8#lp|=!Jr!&3&497<}(%Fvm83)iediaAz2661* zMQCUy^u6Y22plB58MRDpKT=tJAWkR_4iGe2)`neKKcIkHN=@M82fal8Dy^=2Tb{YH zr#XAlnCWHNaKk=-%BkSYmEtuJR$F*&cWZb5IS-X9$71c@9h3BRa->UTv%FeiZiSa(mgquY?w42VQ3)5h>XdPwx?qN*ljB~h!q7PPeAezXj%jlKi4#I!M>@x(z(|JU0=zha1ig;X%HMDV}3XF zLv3HA%Y_fE}i17X7H>zRfC^!$WK0REAKuBmAYq#&Zcw2UUG4sPG3 zICEKi?}L;c@+zY;Wx8~OE=yu4xanbQ_x<+L6B+MK?A!~X$U2lmj)Y|x{6Kue(NRut zNg~XWiCA^L$y?i+M$7kM5VWr!uoC4EJeoh#Lh?ib_$wxzat_;ud1sIQ38$GS0tG5v zibel*V&9Ma87&ugnSvt0D)irhX<4bkd0+R1AFgFfGzmWYG>Gm4_`NGPn1dTEZ~T0& z&cA1^w!hn8I@kT|w%0$}WAN95cw9|}O8c4%=BVw7x!nu-LI;96)|@icX*%DA%dV6I z32MQkr&r}kfEy&cdB8>8Im?}tg`+xphrfhi5Hc=M*JsY~M91c1>=@vD5?>l?1dRocT_IGClvppLKFyTZ1*JSgo zKRz1tGWSK$tg5`65x|zu=DI-F?VDZBn|+Rc5)d+_!S-?r@&eS^6*uN;#eQdmxpLK2 zvv~$)ouMNI1wUpXGWrg)9@(i{Ku2HIPXFBdcHXsn#G5{;_k7%B9_7l?aCn-8>|UKE zJs-Pf_1Dm2O*D5_0ijt8pnU-WAUh!ZI83J;0cPkbA7^707 z_|a!vWZmdWQVdgy^IV_b0_E9dYxGSCT3fsj)4#b|LZR=i(cF*yLG^I-5B|&wSw(yr z5PaS7kHNn@r^M0TM2RLs-rSpChG|0n59D9CF8R<`k=PRjrg-0Ttp+z^_o%02;5xtp z=>&TF)$Tj>ZUKT5Z2O8JiR4M((;NUusBlv*XcQ#NmR%wNh~bro4wf0TwxDM zT{w#sH7fZVSoN9~f;MfMFKk|YZ5XQmj+0Aj4nhP7oGT4#B^{Wf1h)_ZAl#*keT9-p z^?g@blqAOIr34%Ss6)T0$LlK!cX8?-^5!G&9l{fzUiMKJ4h>LPwuub{9pX{1wF=+w z)UxIv@HE?S$(;}ol_7qrQk)fZ;ROyTUsAGsDG!**d}L`r$H`g}WM>ddA;M9w z;T-TLM>&0w^lvgR9@N=75TFPeb!Zz;lwWFMr|#ySIxFVF27w5 zRb00qWR9~xr{uyp(DLL@Cyx6#ds_88g07`f>f`ByOtpJNnxF@$KHxkRfml5<@sQ5jXBMagQl zv<4jmez7=GA6=sFMPY~abDi8n0P5rx-AjvwQE|k^fm?lpe~i%%^PBp+@~2@B8<;k9 zCz?bb-IbfS`9;98@k_?|m+gwTB>EJ!dt-Z@PUwH%9A?@)s#p74v8i2yu{eF}v8*+L zdNYFpix7%+osN@@p0ZRE%HQ$g#Qb!u731R0F za#Fs9y~7`kah2wKuoIR4l{I#dD14HS++B&_eVk|DG|6O_HutP8wsLHi5VS9m4mwy zC5w|?cX_*IrS3~^Fo;2*TZ^{F#7QuF3x=E~G-buPhVMn|6t8AIG&x%)yr<&h-%f#SJ#uiuLXY5n#( z<+?*d=FAZkSdC0C_R4*-lX*YV&fICNftSACNEPU#zdR!($<5K?bH*voAK`R^^}VEO zKn}|?#T9Q$dmv@nbFTghL~jNb!jJGNi;j9IAgnNeQ`^@>@D}6ok)k*f8wDqACC0FB z!_Y z)-ujQP{Kw(NGl%s8plPFr3mlXS&(8d>;F`|gEE{Afh!#Pv2H6WB6gjqqOpzkUxW&$ zY->BvL(Y-0_WgS7Nn7iqD+t!f=vRZl<4UAf>7_lDiC;Irw#p_&mt^(3*)7n4C-2`s9!!c& zgNgaF>8KVB8Zfb7vw{A+5(i5~g0VAr7!3f$J=8H;$iYd=S~a-ElL)s!=pkM1Cl&L2{( zSPOuohS-OKsH;$W5ue1N1-Q1H_-!DT@3mT2VDoPDQXzS=0$n0!j}R!8iwh|`_$h~6 zqXng{l%u;X#cEJL!^diY>brxb`*@DwYGntMFY44yO5c6YL|ePtIw|{aT+V;waj>m> zF7QHI&$HNPZN0A;vRC?EmmIuueWh+k8$)pWDijJOm7svY78Qp-C})%*4r98H0Hh`} zBQ|G&J&d!vENYhrk?W%Ni`eOws7SsHV>wAuNMd(X+>L=68sdotfyDo?pOm?BfzzTL zx~3BO3^zS$hi$Gl!V|NBiNalVQ^8iFEiFtkaZpYS#gn=r@#Bi;Hgk1RjN?3h8@FG z_6r0iB&HY^>f zF}E3pa*`dwL5$Ad%R$gXue_u{H;Th=YRM6Puddttkbje9XpffVOV0NtGGJ9s?wHYC zx1xB01PDrWm}x=KQw!U}G!mas$)*U1xRPM1@ESbd&Z;BE@(8oyN0;aky##dx+7hBk zY#Pd-;(+y^TDZDqiM&E)w(`Pjks{#0{}0P;3winzW$JXQSKRs134?JAvQ znGY)y`xr)N>g3e4T*4x|B}912Nqn$!Ofz7ITy0jYoSEI3OfBhw9sIg?>4b~!9v z5U;M2w;(U!YkO*&-8kak*v^u9$o|4u4q&dpj z3z2aX|H{`~M@sA^JSYNKGuAar*F}P6IY{6S>?588%QvHc?4G6_~}rCH@J zbq88V<%CROLD%H9Yp@?5oUBsh2cg>lqk%utXw9((B-tjO#P~4-{G5#3?JEn?UVhW( z_lqxc;j?TB-p^)AfBr{ZJ@G$?ky zLz#aY7H(p-D=Qf0xI`}D>n%pL4;$uve1t+0DS-Iz_SdT#Py9Bq0KH0$o8<@YiW%)9e&j^Vsb>tjxL725{rIjlwM^pZ(E9L zrsea$V(o`;p|MgqGIiV#6x+B;F|~~+_OvpyZgUc{<5Q>fTPq2>pwmdVGNZGw31Cj3 zpi;jXvnAZ$sAwczkI102lXRzL_{bXmJe}FJfkL`+ApsrtQ5Lw@q5$e%rQYSXx9Xku zk(nngJ%wmTa9TAJ%*Ed_Ue`SytSZY9ODo){!Q5EYf^p`{qcocw_8fcFVR+;+Z#rg4jX32%r$cui>r| z$)Hy7O>SoTkFshUH?`WBOS*UP*?K~y+n!=MlJvspUV%^Sf-`D_t164V7al&MmRQw3 zKzEYH8w07CDW~742HZBi#49P-VRF_OIW|20`}m2a zK{j8`zp`4{@%iU;hRs%;qV<|f^sh(tHeXwgSie8``PbZt&9|#H)*mCHe?NO|^S%F- z_2-n&zhA+2{uoxY*~p9j^IB!+&&eY;UoL$9vtqaN*TWi{udOw0mNfFB%7fmoudcyS zFO+0ei)#*#wf}9_O=@2==N*3Lky6nQJBcm7?S=6!pw2!7T4 zzNh$Ih+z1)=9e`0r#$7mB^O4fz;|=u%C}WrIsZ%rksjPcL6WI2gYkjhI<7c!`N(iM z1*&}rbDsZ4BK*|z6VRso>#T|YP=giYLbm4%g%Sj=5K7kwzpqpN{AG*WI)b@Hz;1Gp z+KXaF0r>5U@BJu$tGM{kU1Js`gC-~ReF_f&BvlDQn_Tfp3Sa#2=Zq5X#gPOPg3RPA zX)(6!zZz*}uCTh2v@${RNv+&6mw25ZcV7v%S(_&pAYG^=A+w~U9H^|V{K|m?*JPrk z=(=)np?nfPn1=gv0TsvNgaD5DI^^g&2TEn&33Q#+Od$$Qm_!fIBw^VQWjR}6aXO#q zpmvL+rd=Z`NE2EmZObLJZ_)n4ioKB#;czs|mIfaOsx2wY$143paK*21(c9|@{|JKL z*rsJia0*EC{q+i$xH8GFP57rznE;`sMFrtNxvRDE$N(k%KuRu6-$L(d}k;A9R& zU+(rXCOJaRo;VL3*WGh4n1qOg$iCr7%s6;BAweGpgwfDMpq9^>Z@S~h&5n?((eD|8 zS294Dl7lbYaezaFb8KUwXkFEj=Z=Eo^oYtJh}h!x-L>FS{q`$L(%G*CE*%lAW}E+0 zH5BF5%Dt;m6nl$PsQtSZ>{%D|JN$@6nTplZAnyZjy#qt`s}~{m4oSS(mcwL&9~dye z5R=OkumHREI`BEQwgd1YW@ZHm4P4Q{*Qs@2_vYG?=pmXA^CB8LVJqcW+|h6l3X0B* z59WkeL@pAlRXh~bEPGxDC)Ar>RgwLq6dbs0{IV8zAT;DxfZ|i79ZO24jC$xxitPS+ zvtuC<{mT)f46?m5^ zy!r9%e{{02fHBfpkSPdojSLe)#ZV94CHG_XN58!> zD+^7E4YgEO@>*8iv#eoRSZ{f?(fE9=$z&+~e`bJJ$5g2#f(4zboGJ2`rK(_$vS3I? zlH#e3$noMB?GdR8+|NTIAWWn^PDBY(9A{Pn#O;*A0`}&!fH>~tCE7`0no)-cST9yQ zyAo2pqWJJ)I8O1`4u`L3~axt5W< zc8(EV&d{>aAA)f>wz{PmgiPH&TPgH#JayGVD`VHFCni5EXUW&q^3`E1NBaX^tS=YX zm%6#(3yk=R>=6S?r|f(ckNc`pOTkj1Yw=cVVLd8@1YWq@t$MHh+6~_>7M*Vlexh1- z|Nk*{=l@Xs@&E8&vlxTHU@-QXA-l39OVVJnW|u8#$i9V?Ej7kA_Fa;)Bzr{*vNe_v zDwR;F#*&@1kV13K`}6sJuj~2;=7%}wc01=hU(d(=K^B!&;P9z0u3xEt5YTXtpwG#2 zYUxGd!e#Ob zAQ*ply?>DszEbd6Chp!`PQ3@}hfJWlg5N|{>&ux~{^ck2b9Haza{g9vde*l>57ghn z$F~P`udH_eX!zMv4;*^AY!V*fZTUAIPO9Imbl)Jj-F5vPrwWClbjonS zp2|KMQ0?z&G7-*Bkz9XY8T_GseIpuh>w)sS!PCR*({F-5eOOmK1y!BmFf1_m@;CTP z4E+=527^CjMs#B)go{IdV^;B?8)0M4Fl63*W8N<0tLw&B&ya>SWWynhX#>#_`)%K0m-jKE7jkPx+>$fD|cUNm56ZmSyM_QiAS8>OZ{JZ$i z1FJhV2fu0(&W~lWPa&3nB(H8>QlRkHTE?&sU-9sAm))Paw;uEDH}(Ab#ruv32v?|~ zOlajdt0W|uS+&VoXFnTMHE_Q5&8pRB+;(!xPpC?j-JJsSIs4w*KLXhQx!;bta&9X5 zJXC2Ds-c=X14)cw-)%90e4h6w`1eujM~hZ2J!)vXlCq!Y!;Hs6^S^XuH3bM&vR~bd z3-Kv3Ua4ydf{kpl0Mf5X1oe_iumcq9X9f07D|LG+znqoHqN{ikICb&75kMSi$R0tz zK4hoLBW*~hU<9NA4M+mYe=e>39FH%G1;^l*3`8Of1>7h#^$TLIq0dXI?Is#ugjYkj zWuL;Zt zxw%D%Zz$*S1;3YT%nwSVA8NM#F78P-f%^-RhcqO%7j1-o)-E(2ln$>y@xyAeD+T%WdpoqhIjPOrsWa*4NV1h0MVc zZSKR5Y^!R^mkm`R{!)S80zRt+EU0P51jpSA!k-IxuJ12dwD2AJ(=cJB<#Pj5J;KLz z9UAb{G(W=Z?deGKKnw?ctN{L$INw2}rj1!JHmauz<|>cikA8d47JV`~5p_wCId{o1 zOWiXo?UCi{A$0^}6`K{HvDj>KwSH>j!QX*EiAcrY{OTu+eid3h7Bl*J7DK;;SPO&LfKm>&Nf)FYZ;(xdduDS$I2X`Kw*<=aM>X z9N54kS!bxFct~UUw(d{S!HdBkw}XY>y8Tu(Qa~Q8u*rPJpY?oPpD8wFSWZqS9ab1R zd@4WutW8B45h8!vyvyF`-Exu2MG4my?}kHo_lQWR`&G$4Pd=?ZhN0q zl-dn+nGEGE*zBTua7g=HATrok8f4zo-ZfgM?TbT zI0pd_Kfn|1y)M5Hj@~B%WZUuI)|Xm6>|-MXR_EJ>wV(}=b{pTLQ$zg$-_9nz-YOMBDzHCgZch2M za@}Wdb6>AEIe+>>yTf^1iPO5ZH4P}MUvWq4t0N-~*<%_y{x;O4tG^8{QzG2$`+IjT z<{lTVaW&@t?%(?`R+0T~lR#{<*lx3Q>;t9U2O6;tkM2G+ihX3U`^Y}_@#)>i=VDs| zcUyio+;zGGY!b9VkG8ya>y6zfw~xYOVvn&Z+B$(M)(|;OQLm2e`ncPr^`-so?c*?* zKgxhD3g6AOM;GY)_5uotqVhQO^1*<}4K>kk7X-QH1Ytl*+W^)S&+VK8wD(wDTU0mX zK?D(FVFMr@FaMJO|EO0qgEsc|hfyN}JTeA0h9-LgylaK;5)w7PNeZLroMVEZi888$g#2uO zc{}by!~XlPL;-o0&HzyvdXU{{N=^&&j~gY0*v;M3d%5@jIx3~PD{*q>fB1-+#k?JMku15 z7iaLQ)~}YG{MsRT+J^cr)L^2?R8_D$@a>fa*wsz0<4RwFytXNy40NdsSV^@cU~>NC z^cvJ!ul&wVD3`C!(1R-22$H(D51}VlKeIlt^^X(#Hvi4Az1h(+LM$jpy2o@itn6prkKv9 zUpstWrn%DWx(1p#uPG+H9QvrS2L~ug8X|d*q6K`dZXS)^{`E(|&!)mCRY)@i<8ODz z;`)(`e=z|Lb@p|Rk7EP_9q*oga%tExxKD1(F zoNKQ7^PcFXp!W~`CtKpgB11lPME~C27mEs=VfLj8Yw;W&q$!0Pl8Ecu5pJ@k;wPKl zu2d9x!rHN7p~jmZ-vW$>Cxrn~^@dzY%)#HLwzaK)863PU&K&nB!L}JRN#A?p9*~Kj z@Tz?Ncn{;2(}R$>jP6AqD9!2RROv+bp){v+TEz#-5h16{qEDRMtmKOn&l@6S>hV99DRj$wE_?Gb|FFEouN>(Tf*o1d zLK!E^uF$o|KdSmnJbzUEg`U8R!|&YkUmQ8w>y@h*&kDCI{N3$?<33I2ztZ2|6Br}1 zNfeA3av#IIo<=`Xe{C!ghk0Xq;AX)arnyQN=Iu$%PX%wSj_qT{ZB9rOj@wxt6MW}z z>P+D~$1`z)6VBc@3nyHIyI6C@i=PT7-Q)HJr^rbXMN^)c$AsQ{6`m=2?{hOw=!4&# zn?NQ3+KCouNqRUl<#;&Paq#vHi zqFT@%o^)4$a#QM>qO5XDVkvMYsArU~k{oXMv7+>{_~3h!S87uZuGsWKaKP_lVAD(y zYr7NzJQ8&OhB6Ym7Vn8wHjfkyWk8S=WQH(BO(s!Hk{^#qr;_9IO+j^ex~y>&Lk6f0 zF0Ig&4Q1dGj3{z`3J@+0rCF5?A$Urh`*KnUWu4)){x(kvz>jO*?+2e`rrYI)GWBfNQ67E6Px%z#pl~ zFISYxqvW{-wR8Ug`te_N*#wg%2u!l|IJqARjA|+SAtro!{dj_@Jl)7q4G@YCUJw>3 zJ0Vn_l)|VGWh(!W0&G!F(8e;XOY+R<-V70GK6VAz0C*9(GXp(F5so6m<#uu;wryen zZ3YFg>DxHQmu6cqi>Vu`Z~=4yPz(3-GDIFLs1UGhqZ8rafA=KOv?ID>18(Hx|4HPx zA%SdDC68_`l?}X(H%FC&V6WU0m@#ANlU00H@^smzZDmORcQ$}FbQ_Wf&WWmVucK+a zK@`>m4nnSX89IOuFR`%WCsbmI@_57H)Y=~$lURV1q$WYyh=e9R+zI81#G{Gj@qlKi zDETANrG$sKaSWnXg#iD93HZ&iC&Z_xM6n`c#A@~HBDti4{DGzYOxCBq86O%&5q?m0 z00gCu1Rt~yxJb(BXywruq=vt5jNkX=CH8p~wfD6n#vk z>+>EMU{Fzj&L5m=C~3%-sECq5^Wp$9W|Qh6Gmp?>wY|IjOlIGtv#I4kUjEMy#PP((T6mx~9S;0%mdoU3aZj+4z5dFn2w z@Po=cQFg3>gp8phrmpbr)VM5AR;8E@q3)&j)jLYhrm_}>iqSLlK|rTE6>mUNL*qr} zfdSZIAWWAG%tflHBC04h`cN&B$=@+GpbxJz_YNSpb5ajc3JFO|P|f+jIqjbXo723N z;Ub$5T{i-vLR^`IQsSfPYgTInJG(=gKBoK25@|qerBSqjGsdy;Dn~8Dj&z@!aI_297QzkG_8bUm#7ZDnN6U#m%~xZ z!0Q*%jf~wqL3M8r`pOUw8uZZLTm->Wz3|S^Bz&W~=-bA!@W1GBJM~3l6wKGYnCtVAYcQ zNbvs>4A(F8Bju@Qv(~f-npg_2WO#~_Qu^Clh>HtWMwy%$m8xoZFj3r;WHd_TgrO5G z;N(?X^3)W6MX!ik81?kwwTWS$mWNV?05Ju4&D(kfZ|kl5T6;~#zwQ|f8BH`ZBF52) z&B&Im9Q`r;bJHuPDhxWpuGSD8?V&~b%neRG6b1KqPTs#NvF2ga&xKWmks33DgP9j% zzid<+ojICwll8|<7ZA0;IQL>8Px;$29!*lwr!`;S%X1Qo8d*v_K*eo3s~geMByi@! zjW6PhI<2R8h&_3PVihnZlFi!LO(>E#fEG_2Hmp`KpHXmOXg$Wt4F&q=TGd68*rHxazi{pg^X zcn+EGcuE=a<9i0sjp`K;UxMEhX#zAoVmHAQLb4jWKofWI;n_iu+Bacuga6@gvV+O4 zgYd>D5*y()yGFHPREsw2%|xxvUx#1)xpkp@gx40DrgSx0m)C(A{)aP)ZK zC)Tl3M2_AbFMzI2@g~`4%qC{UvYmy^UT@sboDEb8LBX+2uoJPd^q{w%Iv`(vxoD5h})d%nI zR}j$|{CIiR8ijY~5FwlauZ$vqAn5xFfo3g%ks!|V!WT`k z!E)k*e5_{`gbqV$GZMfQI9^e&Bu@O8t2) z1;I(2YUW-XlRnNb!!)v!5tPv>x~+4|h<7khw|-7nCIg42+?lP^W5Jn(90a;tl+kAb zh%ib;lz0Q-F9m`ngXA9ql9h<6a?v%wdGNcl5C1U=9?CjgnP=>?NVc?a5J3ze(;?_` zt~ce}2`?3s;9#Ceh%r;jXE3+fRiq77Qu9=#W?|YCc@uzEHRqUkpweuo^dy{6n!ECM z?)X7pI0MIFh(kQ&BaGuX>-!+xC*eFAYQk^76yzy14=DB6Df@m4Osk1nx_9uK`XO!s zHNpJte-wx;1ETyEh17T&gFMX6=qi68yOnncKdZSfeZ)8a2!tZ)kgq9xL8I@1vXWhmO z{i>e?WgG-)T03h`a8D%Tp!#2b;ztGaqP*m!q3ml)(yk1iM;-)d1ObcJi}O9E)vK=r zHIOEVZ7?|Sl_uJrdeVgB!rzXoc^WEVz_>l}Mn1`6oMeqT5lb~Up5-W_0PS+Py@RoD zfpOrt@%aL0Mxu;58Cppm4zEN}9ZVC(VWH!!h^tw?gW0u+Q>JvYvT?I>1!gq`<_+WK z_c0a^9V}W4EdGnoVovrsoE-dL8v|qc*1>YJ!1Cj`ht2M8nt-vYUcjM#O0MhgYTj^7Fa)ovmLo#rc>@uE0NV-4- zIbGhrOm-RHiOlG)&Hg8!qf5@=tb=9HfsrO*)RbSeJhc3oCaTKr!YQZ7LZ^l$I~9Vx zlxJl`PvzlNJjJ3qRCb9~G*wT(a+$OCN@#7GqHNBoHb8+(0;r@18}*wDe{!XiN(Lzuqchkti5DZ{v)E!0{# z@`6)jq}CBV8S7}_s062|6s?mp^O32-(ae0O=xf)aZ%js)3CG-aimAC4(=ZuxUpV%m zQ*7(C*pA8Ar^1)}oGuSuyF4;^`IT_oTc^0mYjJX0m*i%xOlIRC6KC)C+a&bc2=_uU zL{q<6(ax_#G^s!tagJo>chyP2m<;zau&&Yo+rKH_e>=YT5%<)Qsx}vSUduXLi=tsj zIV)`EaqY^-Yl#+9i4QBO(o~zTP7z0^{DizU_1g&KVp%eP{f(3zU{5}E?t(5mdE@sL z2$_di4t2yCKn2}k^klgx|MlMq_ECv2Y>HN!R~f5+t}RvM0IeCDZatO$6r1r~I;|!t z^?0xHwH-&iXCiUuB7{MeJk^Mvr7)jyLXabobh*^m&RM6UtY)3h$Y8HNy+nPMrgz3L zhg~Ph8=CmLIF~yri(4l{+9gjengFk4_j&9H0eQ1T2dUYtAAZ>YhboT8dCp+b$qs#f z8P4xc-FGDDmBXBu#UyhRq$(j(bVT=o!e>arC^Az&s6eW>;GCEJ(TnMxTY3Il4pC%? zb`M7mU69n2&u^Xr05^ID8D5T@U(7YlESspgb{?zIt#Ij=SyuP^>*Z!8y5(wU&H^-{ z7(y>FXv@OSIzY^F9E`H>Xs5D8<@^yz*ng5P@je^!H>mPq`TM9`h;WvQa|KhIKrPOb zE2(^~^-`!qHtKFC=JV3w(K?oENOjR)f z2>}xTI4nXPME#5cs?1mLrtPn6Vw}^rI1ZJZ?kaRpFNd~JxWgHo3w;gc4V4+};tC#c z^~E}XbNOik>ve5(f)FI}%K?N(MVx_+ntnKo2lDC1>O~vT)T*sWVDp!_QjCw{bWJeV z9CbZ&30p2El6BX)JWzzj_oOLor-C=8NxGz2;$yQwN0HKp2Zv%~rT7lQ4bg8b&MuE6 z4kXmFF{;?4-92V=A8ioa4LBrw*~D>vxOPI6uDf()=NgO85gp9X?QdW0*nWK0_5h4$ z248D#&SazXy3zkr9~nf@OBvrh1yE~AwDpu8{*G4r zUY&68?5t7{zu#=V?FO)b0dp_UXnDU}^evhQd1rs7TB2l25_*`2@iKZFUm%XxKC>Iq zk-YgAUv(K@TblDqHkJ2N(oF0K)1@i+@5t4gQ}H)D1zqVWdQ(Zqrn2{6G<^CHuO*A} z#3Ip!lD+>3ZUQYQ04M*Q7uK&=Pdz?lC^U^j>7JgF>V<@go{o&U`ci`MCVTtCp~D|C zr$?yclC%B?Dg!~aaPWq@4#uk3^b_T08Au0)IW~< zX!1tyKHiWtnG)LIR~hg#cJx3;S$fx0!(N$0%+USIU$31>^u9$9jhT{*%{uq*!&S*8 zi{EN+Lv=Xeyi%hWe;5uMb~fICE7<@$-l2k#=*wKWBR6}od#&$x<)Ocn&vkD;OI7mz zDlR3;J6&+_=dnRkRUE_7I4?vUq($ zTt!WllMl}mChK=b+Vaph7=^b~5?^%%uUG+^$Rvs8ubC1fU7by5qEeV*3wKMY%#H-3 zFQc|n-LLevV%@ha%U&eh+73MKy$n-2u602KV2}LHMN`-!@@~R=Aj~x)oATKu*GgVP zMz{z=p3jjG6c5k8iGOqs06LZc4UzUda2Iwo`RPvfm)gPvoqr=wbhY$n_1~^a(!1Yi zZ%JZzZq1~Ve@p!C`+5}Qg)7`pR}HdPgkf<*SXM|M04xtW!c3!_1eB@bQ?_cv>jqSn zl~61g!U1kN0!90pTmC#(_r-H)xIbHg_+ zTJL@8i2AwmX{7c3m!}jMm%9=r4GP=}pmvVu`~g12iNBeNqkkVM>Z=}DA{Dw)?8PxB zjwK|Nym_v4A)_MMDBZ3vmwn{c{;vlHsvK^ukGL;{ox2Oco;khpQQiL20f=*xvc2N@ zqL*bB=k+fH*v@s-O;*KpwZB=k>WHkd?C$*YbLnlv*;n0NyT3Q*M#`+8cJJ@*{9Jv- z+pYMbNpftHC}yY7lzu=6oey)aUteS-ppE5c5;2Z`Gf7yV+L>hWOG`5;xMcZRn#lIx zr>HX=HXN!(NJb^_?w3E8AqmJ7465yW3Ts#F0Wy_{P?*ml3Hi_Gn#$JA=bb#VJfCl4 ztZ>KKfQ{H&=weXB%!QJmmgR*Tp#utwr4bYUi#MYd z>K1QZ-di z{?fJNeKDp?EYymt$+u>+a61UW)>Jf`NL+QhZ}&S3MZv;o-+z1vYF*#{7&>@YmV=kL zImD^waLEV_yByxfeI2ryz=;DmLkzHKj{I_!{gwgeL020-pf%1)+?#zRov}N{*Qlw< z7fMVt5HAfJgWaaAH=E${RUVk2MhU;y9!-YquD30^OG!y~MV;<7f8sY5dYg;h^bP2R zzvv{ zN9yf>V|_{-^nRg~QQV0SKvj~tnJ7#dd}1n=pD(q4d5nL_B~zaH$9ke(l?P8^K!oRR zErU(UHwZ4MQB3TQyKfF>4%Zd=lNFp!L%l-KlYpa*D21>|V!c0H?NWmBFEqiu56e(? zq{#@VJP&2~oH=@DY5h{1jLa~Za#?W?w79r!RFF*CuaZ6$IiFxp#GgJ6lqb7d zUY3v>szR7MJOSdTlvzAlC9C!Pxs|a$k9{qQQi!QA5g3q zWGA;7V_~XD`4dbXh>^Zc&ZqiYJq${kkm{@$4~9)AE=sb}JerU5b`|8xz? zYxCurL$+*bdL^BK<44HHM}!0eUbsyPiy;pjw?(%VgcAnc*nTC+cr(;_nc->uplZ$187{)=aSWORo)&SL<%o zt;IS!RB^tmcipOYeo^n(I{fZl%vJ-LyTN(TeBwdLR->O~gX`q*L`(bD-O$Viw?*?w zX8VV&dr>bM+9-4QjKmYC@=P!zQ)g5zY1=(d zh7^|<3_?A`ExkB3T_Ir1(b&270a455Xd{Smd?0B?=M15|FN<&#FFTXwqr)ZmjK8v3 zGWxCwhW_C-WV>z1@?Q9vcT|WtI6cv8_04U3dU1h=4?hMGmu%w5rp&O>RY}MI1Xv5W z)`3tv)RqGgRC6SQUBUOrzF8vR+G4QB4NB(z%k1Bf<`f(YW5zAJLU=F zIqbomyz@19K@9rv=6V;5_RW5L7yS5~)9Yi@dsT}bPgefjFK^YHrgG{`ErW?xJQNVN zAyh7==g=q3iW-}-WX-ZSQ@A5SFR~%z%z(Xd1x^Z`U%fL={9D_gb=U(CWD9xQI4>rM z6bCY6BeJW`K<}Twj59H9cw9&q5vC4$gK}gJx%63yJjl#$^f_|BN=yvdpZ0rnQGZv& z($npOny5xPTND%&+L-?j<*WVM*WfJ#bIa!Xjjutz$GC9Z|5MV2r}Q}=2IBkEt9mE} z{*3aIR&Sn^gshx^f*ug%kt1K#d%~J^0ssYpF4j)qZ1F`0INd9IN^}y)mo@~(1wy=x zCP@)|%ARDjaF|H+pb+t%0gj@p44v3M&@1fd8R%&cdw}_Do7Q%N5a|k|L+Za7&3k_c4JEmdG3t;-h6pMZahk0rr$bntR#-34FK0=$yeVBKP zH;&Ecc)JObfmmJH-H3YC@%ccN-q(`{*)3IRglPufQJLH7s!qaJhRf;Q$iI%j-xm2(D--k-@~6 z@35b&g?^9|RB}#`ZcCJ3;;Xhfzpj<+<(%xJExhML8b)6&-z1#KL4q-ESPnqo;n~$j zdR}~gejSBsv%!e${Ae1hS~0vB9P~`NRAb{P5aTxxU7iwuvo+{C0gQ)2uMxS&5>6cY z0bJ;Tg;A+ZM^Hty)W^br&jzrKftK8mKFW!A1F7(^w7MPs5@(T8Q_^`fw7}!CL(1hN z4(Z~Dqs4Qy3M=5wOPG60$6SztWq#gH1t;>^L848huXE-^ROZx>V5}GV%A;f*Rj4Ec zWx{SeLPnb~+#FOvgcmv%38FA=JVYo@6;gZ*aWFh9b;w>o{^ZksW_x&hk)&~stBj+j$YYWU z0H=_bw;5ch207lu-wfP9PA+K58(HGhsKW?6;Xjg^pQZ{CD$FFg6d1b{uz1?5!ca~l zBx;NskqeU}a*x}9>;dz8@T_%t3)f^sv<8A2xL0mj$p=`vr=cpUq=_A_b`3+m#yan!E@Q^a!Ic68=a^FTAOE;NMW5ajUw*>= zZo;jBoYzIu%X@zf@gM7nfC6~sL;k=;zDy1#DD_9DTrW;v=DQPZi$oVs%xlzKFJaN1 zAG|D0p4{kse*I)XwhFkOl2z#L$j%?rWNv&r(hsf8|9NDjckJ1-@Y}KZ~aSwe|-pJQDkd~6!^A` z`0kR%|Euh~ORzAG{b*#OgA-&32H=WifXIE74g@xV2l?!Me>Cq3-)`!$eGVWJQ+B+n zV)MP~r7>G^#tp^xO67LXf*HR0u;QTBoJsOoGFk9hGk>p|>2!S2;~ufMx5M?#6+a}y zCit#deuo>k(<~~gPAYnQX=PR^<#I<7L+xfDc8Wq)A1d8G+;Ok>~J=w z+OMQKpu|ewQ+U=u)4N^Jw7ojQwdPVx&B;>-_-QqlKh#|LTSF18rRvruy4EJg)Y3{= zY-w%AhuW;awK<}7dAfB4u60E*b;TuhCGB zAnAdC(KW6Auf8ccfRW^SKv?D5U^{D3(Ja2}F>}fTwLnHMoWX5lI1vxcdmbQio47tU z*%>qor8i5y_Jr-84fT7d8EdPq)V#lS7GexF$DdQU5n|8f3y$7*zVX;q47)WPeY*L6 z>)ZRE@xJeHqNg_5Th!Rp!yqA>_7GK{Dk9o9nLUh-F&Trgc5Ey?{;LV|xAC^>X+?Z* zbzJcAX9tltTD7as1tPpdkLsoGdYKGhE+V`obKAtZEd3{1YzE7tT zeBN!~YJ7??=w3+gmYnIVs_v?2z-+GiOXkv(F3_#if+a@%q%uN24jwyH8r199aoDZz zNRZ$+Cq6b0ov1lJp+Ocl7Iu<|7Dls0qd5(lNM%lFp-|Xk1`~|Ug>kTV?fnI*45$x| zefS6eF()=hRVbm!0B*p|t_r;v%ExMRI`jJ?+YC&L0zbB?MgPiij$A6f+b7Z*2Ga(W z=qtH6?ZmlInh_;#E%NGGuad#wr8PcpU$k%Q#lVc_Ocd}P45gmb4P6`xX9sC|Jw2xe ze1p(Mm$eZy1EI=;Y>}b%dv5Ni0kOnE!;I%)>>y|DqTxp$+iSy8CeN@xds70@A(4H( zdZYc*k^dI-Dz>8D$wvDRfZ_Ij5(&oB#DA&j1bfd&i!?Nkh<2bu^XdG}PH6ue&f64D z{8%dl$3swqy$nFVWRH8Z$Oo;!9Hju6ndienO!O!U2!v)_mWG%cJiYz)72^9V9hXt>u1evEHjX}fa>QSlN+e|Zu=_9F;xZug^(5zf;u2$v3pp{I9+-{iSbpE&FtW_&6PoOBzrRGzw?250-pZ)z(~bhVUlH z2<3<7tvyO$AP>D^j~L5QiV`_!2(pEMLnz{2D71AP5fH0?`J)BPC8FMjCQc%d!rBJIUvX{Z8&kL61Wzs_*I8w?AD zn+2nGHNuU|EwGRDahzS0&ws1nnb4L>rY>}0k?kTe4OuvscB!4^Y8aR zQ)@pxLS-67GC&SPzcC%rGYu%TBPvrpnrW?ZbJ|&TACcgb_C+Y#lutBU|CUexr|fGL z)9+lf7nY_UNi$h$IA173Q&laO&ZVt%~r{M~H_)J&4?f z|1kP2%U#uEWO(Mz+QNwTg7=k$tY7(f4sa#}eKrIg^A8#7Zt@4Sr02fileJ)8@l~rT zE9`UDt()_3YTH!M*BT;s;5|(8=fyqLf}}y7q(OFmR<;IDpVI4mom;GZ_gYpbYnvBe zhYYwK!RO9V)Q2k~g-m0e(FX}H1}uwCJ)eIl4Mj0vkWiR-6TC^`1}9E5KD2($2JQ&J z2USjMG|Tcp@__DJ(Fh2xWLa$4eCGM%5Oka5+^aj_5cve4o3C(L{E>k#cW?A06~oGz z#k8-_skg7ynq3ED>i}$2j()3K-njqE=<)KmxtE&ncrLx~UPpLrZb~lHsTKD8b9?3P z`X&VZ_2A4v;pWXh*CEGC>W_j3oA2HnT@BIS?mqdkqhH+YQrw{b^YEcsI){xA-bP^4 z>WITl6y@dzv-u|3TVRa+k=}m|G-c$gBkxOl4{8xqp`kf&Ji}Cc-1d(H*QuC}3O?Nm z!GJ9u*Gg&2-#esAph)q5rMa5^3x?j7w6(s-yZm*XZ<;0koPy+h*`lU!94}+uTt)8i zn^*W`pPR`qwft5(@%T3kmw4|`BB7*A^XzWR)f%C4iS|DdI=ZI>cf?-LLQ zw~odAgNr&W*;Jm$l)PzbxNLW4E=NB}^wf$&{i(a|&q_|MI^H|eb%jmLam|_e!289m z6E_^!U0Z@bbtj2AZMd~xT>t#+hSN9q?zsJbY~s$FoC$4|Pr%5ts8ZO%(O0^^hVwUizW3*=;(tBp%hBO@ zJeO^REPOcD$FAnpL=vzjshtpX@@hWu98G`K$sxURAFqm->M0kyz#1N=@-y9X41N;k zdD`*mdv^zTYvwG?q`iYSpKRm=g%7RN2BFOpvrh6`$ew{~oKzc>d3aLe6)C?mOc!|J zAnvJvbttn00f*K7d5o8O$v&;lS#=P=W=DkON{7pPrX`V=4Dt~A;5$w#h)!gezlBBS z@ceHVyA8?S>KNO_axikc~Y54V)b9uJDK!m+Vp-oU^H=a;Mu znxw4&dFMTepcLUc;`b1qZN}T+F1m$Mm=C`=vG1sB)bMoRSmY;GtUvP0D~AM_-cg(p z2tbr4;>es&tN@m+Sc?q;SLHb?jAo)io*r;6XOI6SkPy!owb}EFYW{vUN2Cf%L{Tq| zH*fxYd-iD@5P!WJCXaZa1p#_k3b%u5BEAuiU@fxU1)(Wp92^0nc2>)T!gh8;F2j!o zZ`OTkBzWG@5(G{bUr{XXsoH;;C`a<(Jk@3>WMvHOkO>DQH`!R@NN^ZOH5xpV6-y#87&wmO7ot z&v+K!?+KcfX)0klXy@TK>55HMY@EY@6)Oynu!XaKP|cAZRnxztR0Q{j6At3n{bLTx zwCof=3J|@UI5uAWM@Gjgyy$J|BFR@*m_P{&1+dg&N#KBIE3F{I2A)_Q;H0prY$o&4 zmugh0#fQkCoCcvl_yyEc6xI-I0-*%Jn&AT04EK>ZO=2e$ohj;7DcDsj_+LaGMdI!h zl~!9XNFhQf+|-dCj#`6EsP@leGMqK5^)elLSs|AaF*575g5z?wKeMGfeeg$34NL3a zGV8390vzt>z6-H@h1O1!6UbpuIHoEDU-=tIXcN)O$X*Dr=^>u68B36Lz#m7(qr7Y& zVI&NKhe#BDL$L*ZEXWs2R7TD^(K)v-M7>i|@uyG%Mg`dw#TL3q$^YA_MDymZvf(~T z?5W=HU$HwrWdH8KsnROIOA80heidv6b29wV_KFkGlUTn*8r( zBKO~L-)@=g`j&M5^4Ij2TX|Ke-_O3qJ=Hq&8i!H^JIM&G zsUF_s(8L3J9-K~7y}|>b$(o%WJdsmZUv1KA20>B}SG%1DJdETtC$2$F@J(#_#DO z9c%T5Z{4!aZC^QWzRN(={K>h7unKkBQjQ%Qn~AVYTj2z3jNPz-&E8z0jqm znlo!LzdM)j|NOJr*88hdfo;|P)x|NfE8CUI$JQgIcRyZ`+rFRTKBe|)w@+#D_oKzm z0{62~$nXDtcAUNPBU>nLz~al_$@_bA2c%-w4|V_j!o0G*YxQS6|I2Q^+}_vQ`WLHP zzwCcIf1ho<9C6Il^Irzm6wYZwK^!(=?rCK+11Sgj=wSNkKUNg!Bps%g4RzpQlR+Xg zh=@|+KMf=Y9H9E?s4Dv2Dv|dQos&f5bEBi-J$!mS{3HXO!v;cb2Hea&I(K4^P=tYC zCmq{wAeu=0bNl$NJ#5dSXET(}`U#AD~UK->t{-+Oqp_u#ytvP{paHY-tO#H-vZ7GxkY+9Nz| zB=)Nh*Jz}R>KB>s)7v8&U`UdUPj?fZ8b|b-JW{DTEkv0+l6IroOrw1|mvnwt`c@w) zQAy>7#siPCc1}fix8;_RDfOd-|c{IPgwxJltl4zPAaZisSXX$e3n-e`x^8zhr+k4_bO$``myQQpMF9ZhxL!DG0raYvyh@PJp7n^ zf|VbYD<|K+xj>G7`2W~vJ131_#~)>iAX)KZmpVbU(FEIKNeGB1k5Mg`F+jdBe(c5> z1*CCU0WScy%LUf9@K66&jb)=qLg<3h{L~qxIuv)_8WsaoF(g|I&=v%yf`AdvmSgKg zKg_3M4^(Y2r);UUc6bRI_xc#`0VH7unqmWyqp|VP*bM!ULKk1h7qdY(;S#lQcM+P7 z_qc}TTYPYVi4IFjC_Er&Z!Thc%0tkpM-H|xC9Q3liF44yBMEmLlAQ}3qXnr^WA^Lu zLYk*KJ(69a1@ZJTGDlt_+5Y5m;n~;k3=|5C%rFLjFw&|>(>sD}B}fNNJ8Gx{waK2h zi=x@%0GJd3zZZhKY!v@z_Q_GFp6fU!gie@C2p%Z3S$s5h(R=dlxX7*V*KtoM@wQu_S*&1Dgf9(3Gm%9RQ@<@sbwG%Hg# zb*<-7_WQ~BO(%-r6fRe!#Q%MK@nlSw6P1<#vALI23%|^LI~nI3sa6?36wf}!COibl zO>m&?n)&Q{q5t)3cv_Yw7W)pHzK&&$267;jT!riTW-Quy3`T*uF=!2%&RGYFA2Yp? z?V2J5Vei((kxyT^4$VqEkC`m~bSjZ{nkGUU%ycSw>{9xeB37I9P!aji(mBoMW3~jX z+0qp_yT(3q3Re@3P&iZc$$9*a)4O0==mF`MTW<6%=N9hw=}$^Hf+rb*pUi$|L}C*@l^le|M;J;v+ZMK zk7I9+m7Q}qMj|sIaqN{s_Q*NM9$96E4k1~QP3jmGO+`^rl1f^LlE(R+_viEZ{{DA6 zf1I1cc|ES{x<5Q#QA50^O2k2q7o1!CL#8(X}D_z0#KIi%* zks}g^5x2^TRQCl~zuWS%)9W=dT6jWDSOe^+~)kegC$}0w+}|i7GwHX@J>wlKR1$ zZYGHl$CkgX&q(l;%rwZ*p2|RDUb>ShTT3j!9tX+b;G#JjB2qluMfUr7cq20s*5O8L ztB?wvLd5Cqqa<&?zBW?#c^VF_NiN}6_juF66y>k9ETCNSwpw-f4)6_q=fEvIC%>8n zApJ_J#sb`p$$+~H=O7I-pfy^rGsfCY@;yWm#|DAHOrrbyqi!O;UoSceN^L2#W~jiw zU+NDr=U@UbtOWQF%;qP#Rcb(#U|_;Y6I#~?Su3wd$sC)Y6>anPNKeP4I4R4lHTa+; zn34Q?h2QAe#oL*ea)d*i|6K&pfsS!O>6p4V(&<#2;Bz-9!Dn&|Q9wf@r&t4%h!QgW z`nLA{$LQ0tft8YmrANE9FiNE|Dk@Y#0Gx$$g-!sV0B%P==!b}a;`7Fjn~k`THL40_ zKOJS9kdY!n*?KBZ!)*AQ`(%VPeVUQqRi`A-(sc(ne%mz%!YJK8UfVD|R9$I81MBjB zoibzZFH(~>ncN$Y<_2;oGGh>IDCD>UnHhYwsu&4z3!vN$+fx89Obm=^tH|Omc~QZBK=pQq=IvF&2n}WzDwQQdR_KyuYdc{ z#lHWBXD?0_?XhlfltC9&$NK`9;?TEZB?8AxJ*^?6x8>u0G; zR$fZDLM69Q6I!-rly(DI74;CeJFTphYWQmh%*0e*3zuPfZ1y|1ZrR) z`CAQ6nmaC181GY8e5}8vC%h0pj5$n)EO98ku5`#D#}y6S=3ii^c+JU_ljI-N-Pk$F zPV&w8_i{OfDmkZkc1pJ1oD;=3%2Uu3jRKn;z=#L9U0)wemcFvp-&d*58p$_z)1t+F zi`zp!Y-c(qc$z1w2DN>3YdMg;b^F%IoT-F#W_$%-O^jv^Ys^T)$5USaGS9}Ot|+Ec zVhVU%&OT~6J1$y#d%LA#PheK<;a2-$Dd))-s;V%G-*S+@FnA3E9V;qVtItJTuA_!Q z#s;jIDg%K5HC2*afHGcv?Cv$S`&*TR)v8fU1DL$B#cIhEp`3z^;CSbqOWky4rp_?L>zA&n!Zg3>o6?qTwB% zcCbphpS<85gc)L>N78?<7s*p!Cl58W(QxeynqS9JwcF9{*>`@~CO|#Ym}?hPX%yAv zpUGM7?YCPgcSLi#Rwz&i|JqNLYuc*Dj?i@L-a}8vdk$)yX3Vzv)0Jq-0WziK0@Gn* zMX4g^YWd%`Jug4JX88&Ag5-zow# z^QmGdVh!nkwoWZKOz;_ol^DiA8Idp@gm22*c7OOd2_Iu6}ruei1?hsznWeD zM^`G$sGQXS;{s4_u|kvFYW-1qrf0M)&)uJ{>9)*91I(R~~&b;g;O ze=ZynmAgpeGTOz(ahe-QXEOJBCP-(Agbhk(OC;?|=Sb%noXglRfO_VD=s4^sX&fe&k+B&Zs}mKfLtBRwE<_CfQmBc#Yp7To`yx@XE^&QG@nY)UFGV_) z-AJiEQ#47bAy;Ks>C#!FJ*CDHTO;MBGS4LC=Blt^<;%56d&({Kc}6N%nyQmjTCcPY ztF(0t@2RwR-!)S0=zEc*+Bvj7ta^2HZ%?&rjNMqR`<7_3+O@9-g%L6i7UC!|MbMn1A{{*JrDU`Ue|d*_<8^P46>H<+5{^B)}6Jl zh+nkhV#w)Px*q*o`jkH~V&)k#_KV&#mu%DiX8{$deb2q}&;EFR;?TAp@R?ALe-SqF zH*SgixjpkEmO%8mb|!Ah7C_t4uE|GHm`{tjmn zR+8_G#=XCk|7vKhx#DpAIr3m0&XLcV=_eCko`Gu^_@<#X zN;Z!v7X8`aS3foLeMVpN@8+DU+27Cg#-pY`my(&LyB0TG@t&&}0uR)$RRrD`d3#0b zz@N=~W@dkP6w6Kx{W>(FdGpV`xf?e=D>5LyE(%JGo?#b>-c-VyaGjrnkMR@3xe84A zO>iikmNBmAu5`&iIE;nTIB#iJhJuMSyGzUXzH42X8Y$A8{z?-fPr9=9Uzg@S-7+Du z)s=nVk2E%2X;PZ6JIBgIhVNX|F9E6JlP%S)$38@6TQ&Y#^DcKf9aDJ)Z-B&*_NH|-1rn{p*r$yo1K05m2*YFUP| zh8o}NwusF4IvxH^T`9ATM-tZ#HGiadd+A(=ma{z+ykal<0PvuGnTMcO1nU)$%>pIL z_U}SxD=E|#nOd6zKXa)U0?w;hHQC4s1Ac_AuIbTQCHD!HXGAu7gV56;oO<=+9`0q7 z;Jyhk*+nOGZa2&I@%dUA9o1RUyP9O#7PoF&a^uyG7R~gt4}Y8cIp^ro^Q6x>B!@d4 z8+WbxN}I3Cy09mTd|A7ynJZ@FT;d)BB|O90lLP?S2)J?#%(?UMnU7}32+b)LX82-Z z?BBj(<1gW$MGHiQps^AylYo7O%Dvdsd)YpMSdj1aPFo20&IG9yI#toOaVMn~+RB&> zY}F++w_d0+m>8CPOd1e|r;mRs>hxaa)1TR$>NBkagA>;Z#%=tLJZHk&6%U#B`fcDRo$#QX?QoSlUISk| zbsiy6G3QT}fAFdMbU**bJQ8}=M0%ZAb++z#4b#}|;q?ch1u2~mB;n+0>p=?Fd87Go z7OSVxWdYnkHpuWrAbB(F;rMhlo79H~nbW71>;kcNWRNVJo&_Duqzat-Ou|nsv-x4& zg#w=SvC6-yDKQQAHV5LKHqVb~!~w<X-WrKq;3t>EW z%V9G6(U1(HjHXPdnA~_~KOD@RJU-wsxdFN?l-Oa^w9{vQZHjqNU9`7#5?k(Rp& z(erZvo$D!`w(h|L{?k!==GnhlcmCVyF|$eUPMP751!WvKjb=dt(wUezdMTyx*bT!f zw&U{BBIRGaW*;xk1Xe*|FPQg_JgYDuSFn*EU8%ZndfZ>a<-xm}DqlKeTdU7j8I;Mft>-^nHrJBZFG6m;k6OQ! z`m+Y6`kATU$T#n%rT#vbTH|8G^18r=J?7Z_FR0ft9C2E&mL6|jgoR1KfB2N&y6C^O z597A9S|;KfOZWTeh4NlP)w%L`dj~IxB#30pLj)~>ag%)z-~BN@r3rAJ!U57j3g{mr z@B)SaCy=lK1X~7g!P`fF$%g;PGadps*NIs9ddHniO6Y zAh*YWEA(*lme7x~c{Ya8Ll?7u{sc*)sERky9R`n?;9Ow68bdK;0?e@T9V)_PlC7qO zXa_?hX#A5@Qi7aK)`j#3D|W&%cmNK_EF6FlNVngb^fN%QIZr>8`#2nw$$xGn?yjmvUsQY5aQv0Lw|P!U)uINhv{Xdo9z?KSLe2fEA%2xA z3wa9;KYJ=KaY~wwFc2j7MoDRp15B8LC7ERYqDv zli*}iVPMCN$=p$ryZ{ii$+~*xV>FCm5D8FnG-5$mQ$6EK(3;zcwd_LGq4GAjjFyre zd9c9P*1NCK&6-rE`)mc3!X$$4dej^z-^hD@G#xo!^R9Lj zc8hAlfDb~7yJfbz1&1Qr?=({{icUW0M*uPvXF!o?A=DR=4%SRI*k;7>(aVC`?WHr! z@foLECrOJ85Mu!f2s{AEWRb^k0g~$dKwO8)|A?#5lWK&mZlHZv_()iK=i$KV_0MPqGprWWAGxUl48rbA2i%S#QJ_BftZB$w<9*P{ zLGF|OTgVW<+DXCCHD`bArt_2KUq6Jojht_O5QX!9PSUxe@o9ZAE6n<&%`(jnT_XCK zv{AQznF8y*9i(>0-W`-IWG#u5O|Ez9{EBdNMR%y&`XV~%eg1YRF3T~eE!yUGctt&!< z?_koc*{tufrCGC|nqp_6hd1$@ce*$q;ko9!xL)JAKXh?_!}I*?;$h;k=x!{J7Ozk@ zuap*_VmF_r7QcQsznPYRb+>?n*1n_N`+T$ngS!P!X$i%53#DlZXLk!1X^B*Hi(J$a zjklQqk43Ys#nSGGS=fpv-w_YDk+`fS`9Z4_<6=jDxW3BuZMhJ~b4}`7;U{5joK*Bz zrE6a}qj6?ivO3z*6NhCTqCXXLNx4MJABvU=-y#J>uO>uGAB~pN_qLDJR>{7ma`T~z z?3VmZ?GM5TrqaYU)jL}%kG7rM%#y53L z?(~>E(lMRyF@3Fb;6u-WZ#rf_bx?+vmG9-S2~+XMClqGPmqkcw!VKgc5?73Kph>T2 zL{i@bG}vdPyy_-N8RP1mx(JnvuzQ8vc@dW^YPhULZE zTtzqGlzY^ITGq#;S zAP$|jWP)BsO4Jz11d>J&{bMGSI!gKq`M?}#mg!SWj8&A-+j}MMY7*-TcXrU}bDYmO z?m~jKGq@Jrlb2!+qxBqJzPTRlb9ITeNV8LNOa1+>fBafeq)BDu@A5VsmoKuEGtoUu7;Cvi-6n?PeT8Q1utmrG_%3UXT_5 zT6auT7?yHRKlSB+ovtCEP&54pvyy*h1}B`k6rV0_cwXw3?yLP9S8ge1%o<38z$$~h zHUooPenZ2=Qn5*#(wIHnF!LTF`a@|{TYtTjk;n3Jq@%?!J0lrR*+(D}8;R>8lf2si zo)d59Iws|axcq4H(!?ap1|{h_al9ajc-}~sb?$H&(e`?h*%Z8IN7*Hj_8K*Z?G}uH zW)~MI`Hz{MU?GUN&bta5J zIf^o3-M!!kCs|SSuHh|*>q+8|liUzMlQlx$peGLOb4(z7v0+d=vc8pEB({$U3XsrV z<9`tp0R@G0_eQ&z-vfsxd%xZ4SG+!OIgv<$aYV`koOBn5akrWA72}b?b0b4$lY?-= z&_&~GhxR((4v!zYUai{YzCGu_WiZNLxxz>xf_;;kCKrDX*|(bvPE1~w9iHJab^n7< z)AaWm1Bi6pqP8zC|J?#3+k6&y0%SBOy#Jl}u+f_3bGPurW?59(@i6 z|AR4)M@zhVG4S{0qYQc1zfZ*w{9Wb}YlMA-vzTQ_bq#3g-kudA%{iFb37na+O(jzP zDyYTdE5)c>6eY*er&7k2O8?%tAYNRqh&a3OyyEYzn{{t=Zj|Pqd8_&NZH4pVNGiH_ z=lbPTqD_jx+UwntGsM-uuYRUFAqbxy{f*FQIP;fu_MMRLAJh9>H}Xu6ntxbGLsp&_ zG?yR{T+iIb)G&BfeqRkdFEUD59eE`V{>Y1m9v&2mP3&jLEznYdW2ITjn@bh-svmPM~{5^Nl*4%=&RHiq(lAPAcR`n2oDk+gNWNmX>RHCk`@Pj8}@cS zzbt#$nJPwM)m1V7>#GW)=b&@FDogmoV?WJzTRxLYkfKD-wxFGTQC}UwZNBFrJ?hGT zz0w~vd;|$^AxWPuxbHJA zMW&-LrA_0nutW;LCM7@=kn~4usuM)=9MAzdNXlZ|rw%$t!<6iKTE7>4xYW(;pJO zjeg+8LH(Q}h0e_BxJCHj80)=$M1C^zR8oi1=--;`vg(s=A%sgB9M7+6yRp~N<#R9j z+l|d<7f#)@_WT__@)x%Fs4^syag>IaLbrjHJL?;h=ohAVtO6hxY1LtYWx+!Su>2bQ z6Jm_Veo8$rYBR{bOHeeJmRS>>M6fwuD?Zy!me^iK6NSxr3yU-4b>FZ#RhsYXEY4KV z5Ykh@=TYZa=M%zH65>|i|LjCHKu;Hnh`=>1j5DQ!aG6lf7>=X(1)-+0T9lKK1sJ}k zl?VWayNvT@fOEsUmKUDh$DNk75gc&GN^{Hk7YY+?NXr=7HkBL9Nb{s(CaLt2{P@pr zcrLr&Qsr(Gj3mRAU8OM`h^QQqmzM;84^Eh^N8!8?Z^KUfuLh}w%aP|;xnpw1xj?6J zh3lP_RXXJfPR(x|C_zv^cpGvO!D)ve=s=7Ne?MddW8~Pl z%J6IcRJhqr7oEToRPZzVngghn9=wdIxQ~iZqlRi6>oR(^i)Oe}FZShgR^C?_KYsCR zsw6g7SeSJpx{FhVDnD?KGY#dS?bEoMqzXA}5dd{PQLjm|N23}tv8$_Dnu zbt4f|%c3v6J{D6{TpR9Y6dfOvXYu}&tDL$TYqqum$19I?oGfcQzO#OGOw_Hru&g~$ z?-TkpmR1l42W-MQ*v20@(hK8o{u%K9cXk7djTA@rtGWLBX=sz<3mzF&kSLWn$j?X~241*`?&Tb%{C|GK~;@u-7ERJfwjcN4CecR(lr z4L8Un8vPBmjHGkH4afQ4gkW5GNr+bNToE={cnK-#Nts3udpo!T!?JqA@Hv94f8$?r^ykKz2&_fuVE+LMv_#xam3c65xk*_xi4}wesueH+zk!BFbyJMDyZ=s zNSGZA2Au*Sf`Z0>%0ziE=HUHns`b?xyN zC%un;)CRW(SH67Q6oS3vb6}C~hqf>MLyx&YY|rn-kKX#kJdM(btC*&wv7HHM=1CQr zad(M!aQ>bBw^Xso)dM>&0#na6vSpP)$T!7jmqa^@Nu$?M^~Nox_93I+YQLra{QVk| zN*Lp*+rV)WI8a@Al^7gak&e=1U&c!}T0xq)EKBhrsuYV8mc>Nk26YN$Rz(3FO<6n0 zL%D5sV5^`%hYL%9koUcL0cG@as1Me|!G7`Nw7b4IIIV}NH|1RZz-7>dm~wu#Wm{ze zRMHZk8cS|*=Z~{-Z)X)?Cre}!&up_r|9-AY{}D39gmbZyk-}WFpZBuQe2c7Qs4q0O^AhZW`CliA5InX%59eak+9-wU_c5C$SUu5qmvv;8;7Pz z1b*lefcS+0BngDIAILn7!YN$C5u;~s^GYAJdS<)TRgRNDQ%*SMLyG`XiNd|_mi*>) zNO(iuk4a-IrbvIG?<0>ZQk|8)^RoP8Fiuw`Q$#zWX03{scVS$mw^RffP$%ncf*|2# zXmPm<$8Fy@j(XC4k^Cl3`=NXk6{81)QS^hHG}$OwL;ypwt-71Rk$P;Ncok*09Lhv;O^>Ye}Jvgf;_~U#EQL74Hc+oIA zk1$=t;X8kTIWIpiZ}OI+B2KAf6}|REJsY?(6>)B%dQdW;RgMb5aGqWuLp{MZCQU39Qq^al(V+>V{b90hc*ZygY{qtV?rEU8+x`*Fw8$F0Q{AK&_ zrmn+IjKi;9hrinnke(wl){(8xk!#11SI=o*tdmHelf;gbG*i!6KGs>e&slxPSxe7F zFV@Ad&&71dg{bFh8S8qm&((g%)k*Kjk=P?1eMgS(9P!n23ygIO?Q@IRaf{MB8XJ2w zvF~W=&QYqKduFVAZlC+v9rqGFkFr>gsy>g}9gliF&!$+K8Y z&%YyWupi!R{ba5mWJ9>1^-8}Q&6i``S8Bf;t{kTz2vqw0)ZP3nSN!zd{KfkH&7S#l z!Tb&P2iWiTvlI+;DED)53q1ZK5KRj>wm*m%7r2$c)x#gxo^~u;M3)S znf)Q@{UPzsg3t8_RK$fO_J^Kx3-$dGdf6>3*Dd(?CG~*)VO9NMRX;+y_n)}>EIj#H z*p;}j5y8MQLEq=B3&I}}Z}y*j7kBbw|H&^uPHyf$wG(&hSO2NMKTbjVk*q6kwt+~l zpOL)!QTyVfSjXcMKcl4eqvhkHl?S5Le@1KRpVo^%Z8&h+^yg`!evD;&%)x;e`=2pR z`msmiV?739Sx4x;`f-8raiIfo5kKRi^y6dW2asB5R++;#E^uRB<~<9-AS3Gv za=%yPeu}9N+0C6lny{}j?WItzp0Gyyf+f+Q?%`nm&4jey6=$!;rxod+6*ExgTgWRJ zD0oyst#B{M{K<+~i=+~YRCkli)XuW`7yo9ZNmYfj^TiPJIZaHs5t;6Sa-GCM0QaMzjHk-1gHB?nIFyqVFepMa6 zTkv3^`l@iom)&yT#50<^Dse-Up{BE!5@|21iiSjdt|g{MCVaXkQ#d;HHFU6l%r|aDA-cin1c287cEJL_=M0qK$BHuzY#Dy^|1ebuUQEveI3BAv%>VynqtG>7d4{Yz}x zJ{)oe@D}3Gd1Q9fI9k*bjZ4DqPtrFNJ=n5m-x@Kk5xQP=p+8VV0o-?Gcom1 z;<=~pr4h#ISAG_LX{?d0s^M|JX1I`cEcu$@!@fK2^b+Htl9y(cZ=+iq-PaxU2?Sdf z?mAC4wRr1J3lIi4xC)tL0f+8n5)_jNK!C_oK`4nGOg%Si9bgq{iaw8W7@)89qeBZJm22j5mss~WS{E>4;KuG`ri zoZqeW9eF@Xt~-)^@s>$h{hyrLl#(~%6`_W`>IQ?kBM+~7^o=GwC>we7w{zczo#s^!Ek0{jPY7CTPR(#+E3b- z(=?R?8(|!iW9XCY7BX~Et9sCWQ2A^1Z7y^ag8n#E;xJe}1EW74`F%&|pr!ubzQ-wj zWhwpnmAy|T%9lpZy)i9QPPRIX?7t5?{q##=Jn1i>(~1IahK@Lvs244xGrV zWUn7FT+>@z$KGY)_$3*92%Mnsa?<|e0DthD!Sp#8`SOn|7yezLtgJP!DXr;WIX4-_ znqw>2)fJ(}kyrvNn&m-|Aqoss65d@r_}+N6d;C>Zc}O1Ta>bseUd@>`AC+rxcElnX zHB9Dlhj_@+y2Wp>C_0B^v_Ma7Wfof{J2mT>H+XTQqFv^4%AX2v_>zU%gKmu#ALD*z z)yli;`Avq?qt~~_4DTsQu6(~9$?d)U;ri65_~3la>kkR9k9gJT|4xm(PzxEneOGIMueKJ~lH#a)YkyCr6^iJvM`R8`bvx=?LhizPVci5u?^!C=dqNZeNX z6k345eUf>XJLN_dk}%wIZ#ck@Zu@z%Mdf2!(9JU+`|iIU?&JUo917KGLolQ;Vj1pD z003si>iW&YRrQdbQ}}>(BTGpg2Z2~F8CUm)TfiBHP!ov+jPp>8T;=&l#7ZVV@| z><5+V)8lgCbDupf1wI~*xUgU2Wnc8{c-fV>h?gUHpA~uAfv;X;7Jt8Tc?oNgM=Y24 zB>yaY_L@jkRBW!PjCy;!L@2oP^PooXjlws1KR67pg^snEU5?{&zxw%R#xb+!^!phk_Lz;(=zYvQ&rxJAR%E+{pQo|_;!PZl~>P9s!1+VV9cXsx-e!M&y zm-i{+Y_)BBXThFrc*wHvMzqGhwQpB+_K4k_tprh&APx_CvqrC(p<}ed7MQ+)$0d%i_5(dRGq2wGvlk90 zZLbK$0e_20G~Sa_w%{m-enEq8`(d~9OX;?v)g5)7Sr;mu(2_5g%Gi_RUuF3Wi@oao zn>0wL{j6<&m0x@JV`U}sU&x0`rNci@mQf#hoYpo;kSi_ zZYp8j(H<;Wh8{<3^T`h0{VP8ORHM)-CeWD2tymCWUmX4_ufd&bAqk%1^d&tH1~j4r1YZhUr-U#nSIL441gJ>yE^}eY*%HAy=`_kz$*-At_6sSeSj?$3xEp_CyB5ho zi=;@n;`AXr)|P%rJW%bj@$DUr=&;FxkCYtaw=*j7VV}>xi;K0sDg8C>+Dn1Ux;-LG z@0?E4)B@f|3)wtTei9e>$G%CR;`Xy$-uSdR|47X9I}Y`a&*n9*wx%H4KjcQAZ&Yhi zcF4W!+8SNfexga$CsfkPE8T!>!Tr5kHN*v&&`IKFWOUv8*dLm4wK{xI5@-M&atbe9 zj1P@RUlRY)Vr|C$q&P38QBM8J!O=d)OG;#+@-Cni-6d|*4hd^k5;QG`oWlkMnir)} zvC+dWD@}8z7J&{<4z0D9I<2oT{8gMUvOjIHjcs-9XgzW@?`gaChZa;Z48FL5=GR4Y z7(~*QM)sa|#aWBZ5mnu98JS#euuZnb z2>0Q5xo|hGzqg|!;#B_2#r3#>>t8xfrEx4Sv&Roks&_^elj|ag z@7}FQ+ZjFOwJlb)(?74Y-KTjb+ng&3_=^8Jd)0{(yur-tjB&UXDp=uR9^^X+tCrvd zGtL!ke!`@jMtAP9Uu-DdF(GN3Q^IvT{JSU;5!b?95Lh5i${?U46Br6OnJm>+2e{Qo zqR=`Wfd+51h)l^X$AW?Yd7h?eI8NI)hE?}u_G{{(xAu8&z-f`OjItAqF3VoY7nz)E1dgPcS!fKr{|s3bpw*1mxGz=oP>!wC zi;lVi!~ws+96Mhnp-2lIq<^R#PvERd6x_rjHE5h9Ds%3J@|DN$LSrERG>aC-;6gSaT3ulEdWroRti&VCM1O@4m=WPeYIF^zv2BZFU~a?cd!)^CuZnn)O* z7gQ1v|NEs?{TRl(7?S49WNU9p=WborB*f79;7SCvk>kf?F=_RuH{$vy9nZwA2I(BuiGh^?qQSX*w=x(*Q{+{T!M#J#S@D4=xzQ`N`%xHEJIDcyUxMp{7v1 z#VmQ<_3H4`s}DQETF5V`tbr9_CS4}933iNZ!QF{xmD{H({lD$pIR{>y4NI{b8~NI} zk0_!rL-8a&m}8MH$c?w1zbW~nK7jH$$a;j_!ic{Kmz2pyk1QCw?rwx zlFA>Vs5jB)^jERiZqsxfLRv64Wei{u>{;4y_9q-q>Gl?zA)!QgroO;8p)}8uv>&YO z$yb0A1LPFbiZ&7Z7%8F^f-A*lI+W8zzEP3}04FTea#ToUko8faDJbzqbRqedkw@`} zULm2}8N^|2z;aD>ZG_?Ol<~{SSRz#r15%39qu!)}7F-+_nu|;2(>rroFEjQ?X7x_$ z^ODTR*D^nT$Yfn#`C_u>@ZjVV{#Ux-{0u+C5#tFVnG({xY%|zX!qRYDwj>_xr^77p zi14oHLOkq*AI0~v7NUgWPs|Ei;61UH6&aEp7faPm*i-S<@hmxECYT3FOblZowAm#hdrPkh5oQ*oh_%F6=PSM zp-<^8{IXEc2($jWTln3k=v_ruM`Wj75S}|NU@blE0;z|1AaUvctOK{Q^09cv(SbY zyCo;<#HU!o7erQ=Rmk<*%+1E|x^h%3P1iZwZy9)0KY` zig>E3gc7UD*{UkpiuYAjl~onzg_isfuI9f|b;YCl!mmov(CSK;gR%!N^o3p+$UPxJ zhtHPdIADs*23C4_fGJQfA6gG{a}?6x6JiSy7-a+T*A9&R625CF@Q|%GL;61!HkwMK zY@sYR(L0?&tPrwzgDkBAn)TYv{ek#%1K>#QELrI7``iCp}CQ236A zP*|zpvtJh`??4>dGNJXd*vGQVp%?Ey&V0sOKc`jiaio4Ws{USS{or)H#CpAy=dnfx z$j90Fu%sjGe$cg_A;RnZSWbOU(TcTQG|R<3gTdCL*4=8Q(kbi-n!g$v{_@r0MMXIM z1(b&yVtwHl0>r-DI7;GTr@-OGDE4JdmI)^i3>7W|5i~e3ci7ps$t|zR^KO%fP?L*i zlO(E{iS2H*-)jVp&Ad^~h)LLbGh1@8V8mXH-*B@Mkjkms*$SK^JXpA+_T2SO;3IZLJ<{6u`Lw zPBO6W2+KVE8nr#SKmHaXx&&PccuFCpY71~Snz2AQmIeo>v|o(0bU1&YU!}H)*#6t1 z?UAi;M7i0o39M8}2Ye%qWoX_t0xT2GYV68lb%zq@T(Rx6pmzTHo`xN}yinc2+1)w) zq7& zkvt2)AkOt%0V78m*4^i$Tb*OC$%ePe-D_3L6YFP&dJ>0fKMh^v7_K+=6hZP{ z!e`tX^Of8$V2tl}K=Z%GaawitBIJduj0fjnwvEceBlkvFzTVAaN0^Pj398xRN#%kX z8{liKe@c%y`@aA2UYDC7d7=JK=%=M4iHPej?~N{f8h!oJWLyg(XDHuC0Hr_pN|R%oZ3Mr*Ax&EvN5D= zDO2f&KSv{3*>K(rFB>P|5LZlcMAgn9gzy3xj4`k=1}($)Qy?RNbifOm%s`Pi%+F@+ zr$O4%O5+lL#@LHtAry>tG29Z5gzz^n@E^3aJNUsy86khY_4!Tv&yx<;`($On!oXE#c>~A@+isMFZw3hhw-)&|9Q{=R8embfxXCI`144{i?{}m3 z*Nu=zgxL}g)+FEk#`$Pd?NRQ%8w?p(;WA$;0WAr@(n7W>y6^=CyiK^LjLo?&4vL=f zE)Hfh7x{!JP_QsR_N*+^t_zushdZ-Ie~~gU@IYSstom3E&sj*mR2qW=#l>h?7cj*> ztjaH1<19+=Iao`qE(yPBVEV}T!K~?**%S8^Dq*t9%Y2H(teweo3MG6?07O@g?ec=E zWe`Xg7*(Spq|cp6MDVCb&;~91eR$#ruy!4e`Tqv`apa1WB zJi<_#W-vl-)H1=wz>0eUo(sSq?bYz5^#&`C$vKUM^bA&gER))s`fzI+E#V+>bl-{` zvwfF>kDNk42EpJgecF<#@pGmLAz46giwXaUh&ru+OO7igAWqddZ6Bg6e{v7EWeV-pNyGLLm|UtiahNQf1W zi5!>>ZIN&mGWS+C&i##CIxkx4ot)D=nPVX)gR@Fg;!;qzf2U)Wpjws&V(_0XPotO> z&U6Z?aRG)G3*_pHPNOo80FZUvKO%l-0|(F=@7_pbE{I&*DXR6(}i~(B=tz9F?W+alK(SxaqvV`Krm}Me*jC_2%us&A+*u zhNN3wgIhlPTNZ{}OWE}wG`0g@g3jLwJ!tScYCCd&JDT+8*q7}E{_WV8KNF&UCTVa( zAOQ0@E?zen{o#TE%)l@q6K*j03l2^}_6JYS&W>|#ZYI9p{P}ZuNonA)mo7@%4@0u?k2HJqodY?hYh#3U4FW+ts{o_A**#{b+2dX=pr zAi1@*rlO`79uaeVy!Y`_Lh+9u9(JGnoYNzwW)gjCv;~ndZpD!^bKkxf3W>_)m7QNu5Hd8X_WZR^bF1}Em@ztJFz=57(#SD6 z^Qp4ERm4ZFS8lcOi(zlRIwYn&edA>tn_#B>=0#fe+v0K^U9*?3-u3i$=YGj^a(?Uk zA)u?fOHN)ZbZo-W7_FnL`pza=TF;`{$TY(bV`ZZ=ntxfKZ4kGzW~uAu-OyYZF?e&6 zJ7{icq4Uo7d9usb!dFs?1G#?`EF2uJ<1Q|;+^g#L>>V1D*3y3ec_ae1T8x#fUxjMl6KwzNzB53i4QE-}emt?gC!|&2YD3xY+gws5JKHpuM(-lD> z6-KXImfQ1@L+6`mPuZ8g1YVooRORx#ffV64JM%r|UxzY~{zMEa75O7MN+16-g!N_H z`u`$?#i*8Ot&|f?{7b#CrgW_<=ALT0T5Z`zU*co%qCWm)vn!%9Xi}}N;^$bt&Uf>H zy2@WuC4W7mB;E_`&DFg5wKz~;eXxY_CmwoU|K~8XBl@AmU_OByVqYv3{ay6_ zi}f*G^d;aqTMkIUcYpDky7+80V$NImY3M!nr|XdhFGVKsWE0K}Qxe8&*VlYBCN^>t zUeeK0tN3!i;qU(C0fykw)nPmJtE;1K_8(Wr{Xz#-)-SPk9PKQ$v7+DSXvp;9 z+wX}Ug_atzP<~bF;50r8Gvs2iPZk#Bu_N<(bd_zSzb+q_8E$5E6;9dFt-ukleP58$ zlzvXBOLX=q%DsPWa5BG3^5Q5OMUsmkQ0|tYJ&p-c%VnYN=~fUuj*W@PWo1|HQ87M_ z`;QQo=kdo(k}n*J%DqpMk3Z$Bec?3d>D8}0{#+9Ah09*K&v^DYzNY^R`2M%g{NgwP zLz2fEtlV!+dy?3#mdBsa({Cqwk~AEVC-7By;JNWh@^pWmVD;Tk0<)~I7Aq2hXb>zT z;=~#&g-W7gWg7VvZ|)uJDvQ@D4|&d>q(^z*(>x8u4*6b0N8d`KM0yDfk)NMr)~#>- zAo@lVnBJcS>zIvEDDU)SaLCL@Z|m@S#;LecK44-XzB@5F66gCY``(e7L)n*+;tGLm zUMgiJBiWGa2Fl#!iyUolxJ*py!|R z%v(hcimJ1t$$u*H)r%O{?i#u8f2|aJ!3Efw+?mC4wpa1A6g_wAn_GPTCO0?h;i~}E zyDLy3xAx!8zu*31n*KIY(i_Pm@v)C{b1|?kvGt|Om%b-kPnGMT;3Pq3IMtwg<(I|C zURMU&(eQr7FEVvX<;&sl=vCYXp4H-+=PK$e{477-Kl$oAqhLOoJB3+naX??bv1AD~ zD8OMf_iyo^=#YEXYTC;CLSXkJk*0$j*`}lM$o6a%D_OIQ$1e|sc}mh?cQl9OSL9*c zN1EpLPAzegNNMUR>Wu!5IwM}CD{Hg!#dsD;?lO%}h42IZS}RRS?_%X?Jl@D3D`+4%lX`xBDoQ2r+rls^ z4>^;bJ}$qC5!p8!hO?d~Q$=oT?bnX<*YfAGrxhrkd>-xga&g+RS!7d`8*P&PsYWvZ z*WMCp7&ay>;8Rz=nLKI+hfdRx+{VUz#%?mCB*D%_(p&o%lbGU&Fp5b-)%r?>7LBSh z2DWP1N0)vLb}-r7bTT&O9kWA&fA|fG_Fj5j&MlKx*L11xzfQTF-`1$En;O`EUw^r9 z7**Y{rGDV~&kj~~)8Byu-^X=m3s3NyJ{ zr5UQ}6dF8=^150>+^+3b)HseyxmxGIYKr{LULcEi>uTc1spz%ezyGovuR~BOEX#55 zB>mF6ujx)ypBevYhM4%4U4w{&onI9*d8L|?kmrY%imLpzj-97Nq6(%Ay4%HHwjCk$ zlU+^pr3pIRc0#JN+*R+()(*4HEyCt$3$=2qC31GYsDBan|4r17+56d;9vdj0sCI4b>Hys9RUait$&$>06juVEiHpQ^#!_iHr zUp2v47WQI#sOeAj(Dl9-_Hy}lGxn@Y^X51Od$s* z=I;>p<`Vo@m<9zEMx`sF@M(k#+)zX{D3WOu=^5(!*vp6oL`i50S@fMm^jMrAO+K3O z42_`iV-faaHS}Y1_v1+P6IA&X;ML6PxOjx^nL@r;5kDlST z;E2Jqh~bbYoivf-XLrU7BOkd(nwKJGLn66D%=`^0pS9C0Y)5K1gc^^CY&b;iPDg=n ziw|j{kAnnHcWP7`Vqh zB1gt;n%FxYu{9w!zd~Z^YjsE_WAnGICdfh&%7N3J*1iVs6Aj~N4P*O-ZI)I-xkNq+ z7=0A<_$Z7``Y2laQGDj3Y-#AGvR4T;kqKpc|CNmJ(7_e_BkuzTiMAa1wd;IhKB2&rzlXR3M!}mZ6RxLOzodZ9XwARzMD2Gk~VIXHtCTzos>3Pn>Ig_c4?Tr zSnw(f>qsV6&9-(o{Q^JTGdq2ICVjsrdiOm2SR~`rDC3VuMnfgS?!n!@&{ZTwZb z8uE-AkJnp9nXu$cqPk3y*-X-lOgL>8xo8%pan>ErESlu3jEM}|=jsHsWE)9l3}KGA zqSQ1ZhfciaQ;8%o${BXg5jJ*xTbc1TD@V*Y{NRZ7DNc^G zXRea5k3w>;+H9`IMXna@m#3m%bdA60dw!8D%QfuPWlm;mtNLO|n`bSWS9XW|@i(}n zN}gSOUVC;Pq}KiAPP8%Y*C)bX-+r_B6)5CZ7yZ8OA04do$*-vY*1^L5GlbPu;pO*@ z{60~^{1aZ~)2#UCVNP`gDX=%`$-$wqU$Z#FJ{o`PuzwSv_c^~etakF7T;j7IvkYlO z-nBh8N|ceGBz zUcsMulzH6sOZvfV|3fS`5ilvi_bP#q8SWU{#M!zsuR&(G>{r! zv6=uA@S?aTB&8;-z9wR>ChD>#W{&D7c|`%Uo(WwoksQn0hm0xVwdt3&<+8Pz4~5r7 z>ptf{NPAHy&RQoLSNF|CvhcEQ>rQ={$;%3p`nC7<+N*UnbM;M^^%%N_RzzKFk&l}+&ek{5#Wl|N*)3u(8_hZ+SG|1J4VwnG z?(T#%?anocQZ((;H6M#LpPDrP0p}1?nlI{`ZHbyoU2CZ!n5!3=IEAlG>iBVRwQ8u4ZjfiaW43dw{#)56lNCz@-Auoi}#Kjoy zN?(tS^N;&j^~>EFSN`0mydbWyK#e;${#0T@*K9)HXTmUT!nkq5bYa5$dcu-n(pqBD zmRnuOY%>4tq(hpLX5*yf_~gsRx)Sn!S7#v?^#}N7Q`T>$zVUf^UQeMIru`(Q1I(s_ ze5OOvro$SiBNnEkuBT%dW=bB;d@`Gfzh-;xGvnJnm3&LuW_~6!ttORWHrH%6&u2D2 zZT4H^Y~jLeqQIf_QX1FNjhR#i!!oY z)O)^SVcztI8QNVyD z$?Irr7^ZKudTki*i<&NOSTb%}^KeK>Zi>r%OKBaod->p5)8@;YO&7+k*OFUr&9~nB zZn;Ns935}CXKmhE+44x2#bMlD9or1>-Oj{zY=xK$h4Ikbp3i>&prz0=be)9kAvbgH$T5n>}2!2Lz(a7gCVS@ox;VP;+vfk#$V?1KaEBJ9oHS2tTtRS zjT)X`%=^DEN;??I-JBZo3XNUXH@lH7#U71}(gr`NB6o$dc1I-}K$zPT${Y+TUH=FL=AR&v1b=stQfz4^ zr>b3gF*j5q*n`%aoNLijZ7Mg&$y=>xc5>kbRjC7|0S`4R53>(8w~c-`AN}}HKqgqF z%RkC`bwPn=Mv0m}&DJRCU!<(~>+z5;<`J|-_t78k4ApTEJ}{m6Nu32)oCSS23&}VO zYd(uuI*Y=d#W0=6Nu7VPIFJ8uo|ti-+Eg-F#8_ zqd9-+f-bxChg5%w6i2zmWlgk;NjsZMMn@j@p#vkO{af1RgQ403di}2#BH346OIK8G zmxD~#qf*!77T1#>uBS7uXPd9*u}jyB*z0Acn^mcsb&H$L4>#KxH#^NYyGu9w*qg&4 z0VEN%5WT%g*@&h#*g`P5V8XsFdk#qB|1*R|B=G+ygymXyc=z8!Sn|obKcD8Qr~Qv1 ztoR4FOSO99QI8CCv|9jrYs=%Hn-6XAdFV9}x38XAO8+6GcZ-U~X^@LLU&$(t~` zi~e@_j}8{rX|~dNsWZ*QZDh3G2aC^Wdgij)5y_;OewFilV<1f`n9=Ow?aoAzMOV66 zz4>O7>fgoUGBL};m4OV!jDHVdZ56vTsJ77l8smDz*L-n)c#S3CMM4NzOE5qGP>{An z!bQ801CrLm(uC}}B{Ia1+IeMf3AO){B$dMDlOt1PE&VScENY7YK83sXxuptpuiE(( z8Qj)O6`4NZ@+&b1vz95{i zn7M6K8d!Y56Ew66zF%c%6D==j^eo|76&S(_6f}1H`lZVF#g7g_lYfPD>d zQ)w4ly;ERp)WL&_0lRwV>ZKsDm$h4Y^)KrWI>lZ!{@tv9)r`d#cWEJDZ*Xb5ttjr= zL2cjQ+Qk$se*8e9J>+#T*VpK8mG`$A-VE9Nx_C39$lmz2SY1)#-Ne{j>hB4QV2MAC zO>{l$!_T_F5SCSA+LtTiAD(XD6V)Qm1ZoI&zM5d)bWRriL)oJ}*R9F(*N;bzQrnuN zH`$BNE*ZU!x-4!g_C8j1UxoMvM|mDE1!tTT5sQAf4&P*l*XkNpe%Tq-GPPKK)DtnS%5Z~OM4b`;<_zwpvYru zwKZlDToe_3CIL8*1m3mdO0#4U&;i&S8YoToV>ALv=MDuRaFk%}&jE8`fJ)T8odREm zkRSpLxVZq71pMlB?Q6HDNxtG#&8P$7Es%I*$9>dDh=Z?A7`Sgpx*g-MI}cDpF&(#9 zX9?v7SMYr}P&BM{xbphh z$Xx_3w*Z7>oqk2!LPtV9Qu4qh%;0Gd7Sbp8}9a zAjw;SNGpU50#^&5{u6_1L_=Bh{291()DoyTY)wPNfe*;V;Nb;4Ax<%5ht#1WOUTz! zUYWfxiT+2ATpEInr19s76^UV{MB-V;$U#yOC_A_`y`J1Uc}S)oRLKt}hd{F^n*{sO z=KxWx-C({FpKX2R&YA-rU`-aG|0$;9l>!%`aIeH_Sk!O0auonU ze3sGgr?L1u@9uLwE0~3XSH)=@NKzt}IhXcT;JPMI09cjfKO#_`T1GzS17m6%|h3R)Z)o|mz=m)p4Mm%(w4JrS1C zTP7I)UiFUGC4mEvgm&*S{e+!R_0X$4ekD^PiV_qZ`UW`B;ucM4*jW^i5n955A%No$ zP3UK5Z257>U6`wqP#uuHXFL)y$P!^gh*Em>el)Y=>lcIh7$c-xXEs}90k&}%s^4Xe zTj~2mI>>3>2q$y0nz5VSoS5u2_zrRM>$Ph)U)d4y!kUIN?c=vwDm{?=gZdb2i*mViV5ojS*0Whu;q^`hvcE{~n;hGh`49=~E%cZHwMb)2*F2qQRhugpI z$C*qCTzDL!^gTf9L==q!W`ip&IfBdRLi8U?uZA}Tc?tVv;!q(9f@=KU zYXzduP!VsK58GPk1*o4|-)H0qdbiDM>2Y4|9bq3xsY~-LM*yD!{VG^fpa=PthEiBB1L~^F>N}uHN9oz4W)+o2P ztKlZA^b;wKw`<~dC=-IZ1cWAd{{~HNfzagfe}N`{{~m#|1oS1KAOZP^w2T_4NkCZw zG7*r5fNDfYL>8nZM@PRv2m%t5ckewx4gzuw5KIV*%5840_7C)e&;%qGAiMyf2?#+z z$pI1yaY-dmV}QZ~v?E5wR(pHfAVvZGinYxPkW++(N56gN0s0ltZJ3zZBBfPFMg~C$ z0vZcH|KNge-$Byx{DmtBCbDyK1O%mDzj0q%TLQs^imLA8C&;0p0nmtm8UsWsF|nVb zqT@gd0uqh3_BN2DXlWaRoCRbSAVz8LXsfBI85rz)A|wMc7X>Bl)>h2K#OTV(!tCrM zFTbRixB{p#42hcPuh0s4=hKiA*9^@xa!k&;$1HnDbad}V3vxUe|0urRy5z4nk> z7}Oykq$nu(2GSEy>To|2GqLU7sHbn1l$-`~BHL##va)mHK7IyWQBZKWhZhQ@Me+)osMI(9j#wZZYfL5mZ^ZYv*WoZ-h`otA|wHF|=0sYGJ7ltP%=^ztnXh4I^Mb90T z7t&o3H*GZNtF2_G{zOVoUk$`4CL%J$Q6r#VF`ExqT>1!#6VR8;&&Pr2q%?LSa&{hs zDIi|a5kkIw=lM@)Lg~&N>W}_UXu{-aO{Q(t;!pJtXyUpO8-;q_Me01 zCN_QP>h)E7BT*SF`L7Y(Y$OkGZ)h^*)(=-b&tLcNT@0j>k`1GVJsS?K%1QXcZKDM1 zU02l`*|C(5sxJ0Uw#U9(3^g@g{ykjl%g}6Yy1qPULq0${7GY$qB1)y{C}9Dzx9$R2 zfz&uukPgVRaa1dk2LWlPkA}(lL!^O7LXTN_PGy?=+G#U3X6%xQ>|0gsd z$+$0WXxT!g@pKqGJlxeH2NY9zq4Z2|nTH7(=w*UvH3V58kb4L+eJbz9 zUQld1ExDy@8z~Ozb=xiI3Nz#umUwHyeNDoIV3);_uZ9iH*cR>`2e)%R#`U?gLUHX{ScUTItn$4DDA|N=SPvk zU7wB;kQMZo_2Eb`quCz0TjDcAVUmIX-;n7EQeBGS_qZOh`rAdu1MV0m!SPajdd>)D z_*d9rsj^yJ^%Xw=`9xYdPTImFwpSILk_0sBkiH>>itu7MfKL*oA4v#5)FIO;NKq?y z6Kn&Cp^35X;EbIx2>{rUCH^=r05KFYgd8mKLr;UxBoAch?pQMx z>d7Ep#k4R2Nco4>WWn6t%zs7|?%p|s=#OP(-3m5re?pWSB-GCgygy6eCt42+{Fo(! zFU=lcD~%iajS?V7;Am1JSR}5j;CROY+*PV%w@>c@z)uK^N}sZ^Z3rc`pCV8qgCC(9 zVpZc3#JkKI2LRb{2)s8emH+dS42IS@^sU|*8C)dNA3SHy^Q`q( zq_zr%_gCZzZS+Y~aH0YST@a5fQ2p8JWufH;X4R>@LX z#Hi(@jF+vGenFWJ8`&|0xDdem-yytW09MgMoEFlmdx7Bj6+~+$T_(3YgDM0lqnH}U zG79Eq_Mr_Ft+WG09ZP^`dm3gB$12$-ib$!HD1;ATkQmgh4xhr;9EXzu05x;@Gig%- z7QpFcb!Ec+!S{Ht7oswe<))vxolEN%gTDQ@`>3&&Q^}OvP>Y08$yW^yu20I=cBW%Bg zetF^ompyOJ`M`U-$4K<$ir>Zg5Q_AzL5-F^HEotP-Pt1`6^SRIW<`m^fi_lHX?<`O z498JID}K>J&+p#>kl@5HVns`!K>!0FDi}C1J49So2;xi(3w}vyMz%46X}E}32!X3t zJv&jrQvr}(>!QK`pwfwKAx=ZU6~t&q?;lnGxr&YQLKh=AF{h`TdrTJ97ZXdWr|vlL zIW}8qAQ2%;8gkzRB5s9i!HfLFSL8_jIyp|}FrR{E#aX|37N;&xu<)7sFSKRV%v6vd zaC3;BhFadHcfh4&L9d4mdyS>tQ7W`IdlAGtzcLf~t79+C6;*!-9mC!`g_1-{5WH$w zZZZE|P0ao>KsW1lKnya~`sRg;PUa>DsfSD*G5V;fVUmEUTp=}b&*8fPSo^8-I@xRW z8M|t}M~!J5NVY(q(oHiNyd8zOyyYGf>GzPlOe+=N6i#XEcYgJFeuD9@2#7mgyssZU zBHem0b$;+dQEcvas(m8`^4-kbSx*riiI z$&#S<_x;~QB|!q2%pA}Ct=Zp8#ekD0xVIf~3Gn%S7JqHTLRVz5@WSZpfZ@eIP>fG0 z#Kj3PTz#==!SbEUg4nq zI62^1E)+nFc8-fLG|QK2#E&u&j*|#~h$ILG2q)ZppxtVB$^41Y>Leq6z_5>G)(2br z4>&6Ugjs?6cxZB^H$>9@q}>|(0#8&D;g9m+x-@}v>|QU=f?Q~VU!T#E3kJV;4|dg6|@q)$TvmKHJ0MI`MID80vYTg$gn2GeTyvz?Rp#)awv%jkGmau(r&ldnU z^W}wgaUFT#Z(<0lpujU1S#V6x017;GVSu9X0dSQU)&#TWy`} zmVFPqocxqRf@qvSakv1yA%Ip$aAHXKHft>hyq@MIah7n+I9xgg>U#)LN8z`0!J}ZI zaZ1YETJ*tihyj0Op1W+%nQB2zSWyVPgeIhaJ7T00oUBs;hH+I|9{@;z+>(`zFRIWm z>WBk=vJJoJj=m9wr)mL4F)H|XLus^e?J&Y_hpJxF!5_Ns2nxc#<;N6vM@tXA2GExJyPR5_=q{p3EFwj6Dm@qM_)Rj_3-3KTe92{%O7i1Af+o@jZZ3g~mWf z-a(Jz3aX-epKz4ad=yfS^GN(`T>IH{<}H|mCtKgMyu+|jmtY7YfyE%9-90gE+)I5>m^0kK>5 zQ5=SXZ2}q>B3Nu<`1ung6zXk>$30B&<0LUwBnfI2?@$o`Ys&Y4063cBbUu&&^EYZ@ z6IxD~Fv6DbK`+5=h9~bq(qh6VC^{1E3e!N~(7WK}{)BtfCisZJH36tSK**iRg&|C8 z_4v?hn3Rx|lv0owfqjtjvLNMAE5MIRl5`O(?k3~|)Y*?xy?-Wn*d!$uB;AgMZWpBE z@Zq2^5F8h-p&P{ea564+a`zr#EDoD$Bj3iny=+;iA6irn#B)cKZ z?1BQ}a0nSMz)D0!ZBSGlHhgOw&(u_O|&dU{sB!4J!wM^Id31~5XVG^2aEM* z;EGzX+!!)#j0xcp{_R7+@d7Rho<#_*BF*@fk~ihg~!15ctQ3rmJO^5O=Iz`be7KGA-Q zB_jXfNm=xbGGT`zVkaNn3;&V~cR)!75`87)`v&LxZuDQF32prC7-+yUkZ_30Yz294 ziO)9-dDhD~L|ZggM;Svw9x+>p_qdp41y2VF(3kkG&lc}r6d%(5I2QeJO3Qmo3y&-l z=4XjwiN%v#PC9V?abEXBwX}$inJ`}K$6s^_+X{qX7|$lRyGGY~SAT;r+P)hj+G*O%T4`?D*scTYc^b;?* z1m`wfM`DEhkt>zn1-xjA%FBg7IVP8(r2y9ojv}iv9kF-(Rb>IGeoajECYbWwi^_k4 zCcY_UnQ(}+76CWPCuM|uz6DMwSanz0796Bkg3!WCaroi5NyrEEklN6C$_NuOk8moN zl-i7Xs<*_oxSh4mLDhK=t8y-@i!bX+=<3VDgYWSIa`ymc1a&VCMGBoY!DKDjN=@T$Y7h?}CL8WO8tylh;?(lxE7$RH3e zGpJto{FX87U@u*jvB>#av&z)>&}3>=TL}s%zzv-Exd1IL?PcwrRhhpj&Fg{e+sBr0 zHlkb0+B~edABVYZWM2Lb$9(_Z2LmoW+dR}VH{l)uB;7;NB~~-0RH~5C{()ZIHluJMEA+VKBRbG zm8n$KrLk1rTxtBx)ry&3X-e#<`tPq&z8}5(KI46l>Zyt~Mm6@Q`=N zUU!IJz(6&ESAN;(Hj)skg-?S}l!XHaBnE3#{e;YefaRbJE5Q5N6o=cyNsAk2M3$#r zH61@uc3no{l-d(l7NOiON8eB9)2}ygqoF2KgstvigN)^fRXt`K=^_~m>nos(>?7(N z!*Gp{*Tcn%;Fk2{ym{ke;bV{3Mw-OOn@q>FuLu4eny6FKy;Iog070015 zF(_~gXzS3u{H#kLYerIN3JjYL;Q_A}^u1Ccdz&2q97clxWGtb+TDX3$=GOAs5Wt*P zy@Mv!kN%5s)UwQ71|44?Z3YQ=;1hU=-X!F&YV3v{Tcs{^MR#0$LfdJ8$ERHT5gQ$XVZ8@kI+0 zqY?|_W(%g=0K>AZo&4Zz?7LL#<_zwUssU8LJ#X>}7of-vSXAS>IycR|dm}>4{!86l zc3Z|*9k%0u^P~h9fy!1Ra9)pJ>=uVd?=4UvXI3|~61agRZuqGn{4f3@SV|hVLBCd$ z;ADqyFpT3|&vV`CczWG4%ut77pDQn#uXCQ$*_&f7o@*YMYfGE$F6!6dZs#j#?^{y%m{NeX=u zk-pf8MPls$#SmUg#*yFs0e{Sbp#TiehbRaI$t?+DRC;N*u_2RY70nGi-EXRAAGYjS zX1orQIP9`9+z`PEOOW%ph{FI$cV0XWK!{|u)p>k?!RC9~s;bX;yyTjG>T2J@Xivj< z?Z6sm-WaBFEzkF-{LL&g>42u$c*)I3$|SgBZhBcDS{#; z)W<%OP9RBb5r5_+(|6i-53_lyDL+_GUac@_u0AhX{n*rhH)BUc|EF>!1&xKfLd4PI z#iP#};~rS^@xFy$f*($VGfsFO0$(uz83Gcv{1%GLVZKNe9@hpeGf#6eC-Ra3O!DR} zadl53z9(5gNt&bNlwDw!>$Bf;wOyOx{X)EeDY&bI!sWxusW5^TZb&NiSOA(E5 zC%4l}Y=6#9I1z!XWMpPu&!~Thzg0I%a=VS?W~CIAtioxm+3D{$ zjbHrpbxF+)>T2h`bLY{o>e|)T4I0m4GtNXaF1~@#M6(pai}(2g4lVh<;s1@a`U_bj z9EvQ&A^V=T=-HGpUmgXoH1>Jp`3uf>na){|NJ>_LWh)4?Brg5dE-}Y_GbRrH=)PQ& zzkI&4X4bJaGzPJ(GzXkzCdel`B2u+x<#|Ia`UmktNG7hLw{<(c)YPOy( z1zzVNmyv#Ww;1LA@1RKmFGeGs+H2FP=fu7TxZ?)>Co~CFj3j+VtGA>3O|QtjBU$g4 zez94jFCLx#u3_1;fpqy4{XJuFF10C;&S2lP?%m#EM~cCLd6Uoe4IaJWp=E2}t^W>9 zK66`irW&2t4W>zaz-KT%br}7ko}rLt{QLR;0ZsnCTx|RoG%+KFyD*3105VTx0)K{f z$Zhl|h<kFuYqpN0#({9sd{jtx^7Lq0MasQ~(L*8~iwITG~-SLo=E!C??MP z2#Foydi+I}*!b-O$*%$bf+p`^A9*u5P;oL4Vb%yfK?i>*+9jVE2i*YYK(S;BXOaL~ zG~IZtsKhlg2$0!=LS$w_gVD!_0T^(51C6VJ&jA4BS8xtIxb-0>#0&?HnN%SyL83T5 zJ)1OgfSdu~40+8u+6)pCZ+s7z9I2xrA#d59!`N*_$`kA0M^Yujtx`n8wG0(JSlV|38_B;93 zPahyr0UY?*%#fD*@ppB#Z`*hOsz2d@xumyTi#SBiGbWB8@yh74;w_>)5N(fcjGv*e zfaCyfB3kj|!dU$}dpk5EH88-3C+QAClP32yk@5fnVy>E19iqDKduWCxoaGP-1w=J5 zT4Q?|&Od%uK}HCpfrQfVLNGWas~l^gkBJmz0I60b>sy2+pvQqAYgh13k79sZ=9y4N zq#7=HB8Jrvi34eX02gZ+SlnX>A@3^Q2b3H;03fjt@)&)n(&BNl!HIpQDT+sI`?9ZTTCy|Gd6S!tz><4bPwTll+(8PILePcM_@n_piEL>{3!V!m=7h&PQl(7E1qPH4;_?XGYSl+KP^C6 zXN>{?KcSmK$6)EJ^z7BM_8hHt>CJX ze8J+FO{F_DfJq1{=vpvul{B|YK7D~fNi{}72_R=UgUFiGulaG!0yP3B$WiYt@mGn6 zD7KJHveA70jJv?c_v4on0V%C0R@*ueC+HCS#~Yy+d4EI zfQn_NGSreNkfj}Hx0QVWe%EA6Qj;_wWAw z4cFuId0f}~{d_%N0E|b8up7mI4>8;@4!i_*RH2dkBLQK)C3-FqouPt`Wh{ngMhQ9hdk%q}D>fF@uvA&jFf5_A3&{uMGmfBtwwPGL@PE=7?no**AtM1Q(67Wl!i z_Yd?Ycy?RAWCTNqp{Y(dT;Qb&-16hhi{)MeWz!w!y?V#9Ym45 zll|^$GYDLgA3zZG*#T8by=o3YutT#KLI67?sA3XK5di0#Dsw&ntSbUX5QzrTOFmFm zO&vC9AA>X@Vj%$;1z}f(pE^O70P+(N_9ujMUv#tqKFqs^+Lb!e!hbPHSt3Liy5xX? zreWDN;mZOYkJl2JEDO)J_Lume#iQem{kls-FiQjsgR{(pGUSYpe!_J3j7ln%^DLZO zG*wuZT%kjh!SwJHff+i)GD9%V>0~t=HmQ)NGlT?e*3oYn0Pv(kfbjPW?9AWuleul^ z41@NKm&Q1PU@PHE?Td-7a~ZX8b!M!DDtuWbm7A1cKu9ENzOs^inanqk5Tc$47y=;% zS%g|>dTy!0piF+#(U69jnCH+Q$viYS5#%Y-@p#!6B z#IW<()XI|)T2iG#W;pz!F|p8uSY@(*ryoF~MY{B}K?I};==>2u9FqWzMFS4BD2wrC zR6LJjoRX(E-4kDPN$>pPHaNpK|NjHg?gKofWL3;?!35o z@c2^3;K%+KZ`0vbT&ZpOBZTX(OE`?;F#zibV1!I9k2R&lq;}SseJxgdoqyr{dR^R7 zYWBM~d7|)%>$1e0ORlOHEKM)$tE6_@m>r&6q`vid)6SLJ;e4sq`R!|)Oa3MDoC=34@igtV%AK`tr83M@Rkpjy{;z+y-0Z`Q>zAYKwNE|@in{a-2 znQ0Jr2}&?brPaX`^kGRx(HCdKQok~mgWRASo3)EKgysY7AYi^tB3bjTFroKC95!|+lx76TDvb^ZYt2zkC%GpX7 zS^|8wYq%*7+bK^^yS0nZtEj#nM?etSrwRwGDTFx?ptJ}2elb-<5^9}lx0V`jC6lTV zMWEladnl_RTzH8nX-^bQ^_GLLQL=;!?NZ40esUTB*)A~ib25eX90=efa%Swwh``ia=inlWX1SKr@rBb7w(yL=)Xcyf6ru3u)uQxK`vj8x{WXV# zREPAaFL!;uV%1lG0q`)6hbJ!gg@W`>hyM()kLE}wbx zeCF-o%)7~%(dC)UdK4`Q+{)f zgR?V}v$M;y)VagidDvW1R9*wpA(_vm5#z9QX|9aS`c!f*g>P<^<<3fd%|nvQhFJPC z%iQ+z+|HrPKh3$E)DL!dUA|}L?Hi`Vb__h%| z(+(wbJdZ6hjZu%nX|%v)=O+CHByK{1x!|+;(|=^TNyU^Xeaz*1;kF+*$561aIJ+R+ z+t2@ma%N`%JxAf2!VBmv%5Tj-fxC+gWhrsGZEzEKb|fBS+!1YVLMsazR*M39{9Cr} zse5iz(Noj?Lv3-rxu4JNSK*7)!-cGBm!E;|=ty^sp=(NB-w{S>Jadc~7q@$er6x&_ z7n)00nsB3yVTtVCT(V$Nu%s(5gGyd7OTH%ce#z7;M{>o3uiWD-t7oIi{0hQBb#BRK z=X;6CHPq>%ya)dDF-1IV!DrbWos4&Gdu_)`Ik$4nF7Dd#xn&(8PwBQL`(FGxqiH4i zYpY`4mnU5>3N0(V_mn(cw(U*BwJ`>IE#*+W8je=F;HyF6t6}mC#toilZ@KvYTFi1= zy-K$t<+9Rv`Md5jyuyzA4LWyx#WibnFZh(VOh$7gosV@8H^1I;WW}Pq`pT^-ibI?y zHA~U!x{z0lkWb{*wFh-;gejA_hSfU_`1n!pDj%QdWFNV#1G81WKy;yuBZ5je600xGB$sj^7C)_wZ%YW0S%FDCH z98n{m?)QzMHi)${aswdyH5K^932pvf-l&lGf0m`h#jyFz*&n~+*Vx-8dB?xHP2H$_ zqj_iJ+1y6!ir;f_TO0?gf`4QM?VSegn(vUsclQc*egy3v8U=4g2LH6%{T;NsuebZBV%O-~?s`G+U-RJ8 z_raU*cUE_T{t4|-cY>*UA)w(l@O;pSSICjk9$>$B^dtn32wBbA8m?<)3GGufw=i`(wj^op-)xHyq73_Jg$P!#~D}{;ehG z?I}XPFT%UeXBGOTzrR5thrRl+-LQzl%Q z?PuEBektF7lWL#SB!_>f7?+5(hw-$BO9bz$OWc*550`uzhP4kD8rv6_xUR|;E>pLU zb^WPie_(8JJu5BDG&>bzaj+SFo!$4k^6#G)C0x%`h8t^KH)}t*AbhC*be}yK%xN6T zZG4E$jErU9pS|L%XRnA-9FOfx1PIeq^0*S zpOjy|Pa_N)e|fJSUek#5z8{Gp9qu4}Bj9&r*nDIp+YKRu(5v=8 zBJ6*A?Edn9`TP3)$ne{Th~K|&2g9$&xjhtG%pF>N@M$3{`NJQzwL7N^)P%{kgh7s^ z^G68^QHhP~`8?Bc1yLDvp7#sZv&Gjl+PpdAT#Mp7l0Qc!+*r<2_wkoMO4IPo5qEp= zd5(SPTBgEs*6Pi?+iMO($B7NAB>F!|uD%Gpy8&MD7?)_m?s|oWN0qTh^^HF@?a{;( zk23q^j9)&HLreF0*NTGHqkctsc+F=O97pX$r_Vpu1p5-^mWs2Z zyuIw}R`GXlxMxemxD-U)JT+~#Unc~mx2Je!8T&L@{5>dN(VmKV)3`YN^zXYH=$=N8 z`j;^y!LeDpe;*+H$|P^qYNUR=&p7GIG-dqnv#Z-u2cX3ll^Pu5F?B-i^Ilf7JMqn0 zE3mlMFYGgLKDOQB$Rh3}e#*Ub^8f!|(*4yOVJ}yqTg&IYhF#;V#Hr63k6narx&~2WdrwPUZ(quadsz6de(m-&Jsbej zbI5A$#h*=J+e6_J;3C#_K0nY#$($--TWdc=Msm=`xw5|dqHpr0?VAJE_r=~7 zDtk}V`Ti7t|40%7O&w|R?t5~cfi=Q`Ytf2mnz_&X^^@;#IdeJVt(s38CM1(*rvr?b zn*Ii-=Nw|SVe4b6TrcEtZwmsQIznU~ynz2|80!@4d$J^8yXBA&Oi!hs@;y>q97yL? z3EDbRS{lifxZDtMti1B>fkybw*0GAu@YO@TvsX1*4L{0TGALZAXZu8BkJ6vQsSxy6bAO4?mKwqGNXu-syj-R+=xSwP#h1qL-JO3rM|+FIc?!X& zx_=HfKDPw#o}T-Aw7>eXk@h1v{rl(l&)r?>c>;)06G?=fi9*IRNOvF;ShSCjiR>3N zQAym6QK)2ozYbK2VDu3x6_u`uP7`|&g-(~M=|JC+>pDVbD811X$yECqC6Y;01ha!# zj@C*sdh+88StILkE68PLQDYv%$S6^qL#kpQQ=BMWxq+$t7Z2*iX!ycXjDz~8@7XLk z@d_hPbplN(NdWYb&x#quA4hz>xf&GX0kEURaf$>6@uT8bK)MN;h-9U#KYYUGrbJ*) zgxicT-m#lrGbqE8>A7XTSgc2Wewag%7|hOK=A_e9Zea5R@ga4kW5|BH+(zn z3tFIToC*- z40~O?PC$0U2auFIBxHa=g!}``3-tVd(v|ksN`b2Okicw3kn_S2Sd-ScfX0?0AgSRX zgV=wg!iG6st$f)_rPqQlk%3aUXgrkjVn3J#ht^%>XN&pzU5IfpMemSdiPI2i!bPW; zWMo1BL@@fyaDAfu5(=bqWIc}{r(9xAynPCx{LU!tUNsDkp1kI|U+`HMctnDvAQR5e zk;NfFjWH@xg~IVwGPHLqayzdWQ%3<4%NCfDN=Yy!%^a4;C4>{qd2lNDVYajZy>PYE$l~L?MC^E*wqZ@7w)zPCB@JK@F0Mh?MV5xk4 zTq25k#DR1sZ+L>F%opQN&S5B-jPGYReGrCVfTadPhF*sg%o&&RMAkjAv1$ZgRx&+A z${jrm2QCF*kp4M+0?_6+cB}x6xF*Oxef~D0x#cnapR_0G;6frC;|Q*r27-`;TkeEJ z`-OBTK-#k9-A@^im>HJE@7{;}K^fSkH3PPN`18wk*hWO)zXvoM)zv3JeIb3xiMLiJXvFWb%UyVDc!oU2L%ho z18mOpjWMiCMV-Ah|akT>b5uqPg4Jo^JkClz2n(cNsGm_>GDsU9M|jDFNJqqCQjQ{@F(;EK$C^=TGO*^!Hv+A z6N_a(&nGYgAex=TvyIMZ1ghj+K;uwWU41|l58>3>yfV(12ri8X4o!RLl$87VF`b@b z{A#!ZNwl@|di|8%JejDMc)#t1n13LBtXo;S#;db!Ap|TnV_`0N`jx|ENSdiG1$IL% z4-61R_Lia2Yi^9Cv`vx=KKbDg29OT{109Nhjtyyq+aW&vyzES~bZ5Vr`ZL1Ao&`=b zt-;G#%J*8{ePf^J89Za|A7;_z+!&?Ks7z{dxks7f|9mtg29!UbU$h4~BX9q2fT$30 zZ?GvsDML!k11-S++IK|;g(kxUKH(XVK$0-6uw?8)G5GQf;7c2-7-3KxFxp7;IAGZ- z=E@sqJ++W$b$;TdYLnQx*#ycZmnSje@K7h2ba=HG;NX$gOBCA4~HEZu3t)|78~cv3@7w2K@uT zY-VR)Do22sY_nC7)(y)w1s;_ktQ|nz(`~@nO+J8Ugp$2L4`QD=(LA;@;dPu$12wVa zgNJ{7k~Gh;oWUYz?ula0^bs41*kAuU{Vl-LkdtQbj3n?aOED9Pi^arjz$5`08L}RK z5Xi{kP=dwHg^cLNB4tz)`q){Q2uvOnF%t-s_1SsBibo5QQh!#t`spEv#C0H~3uA{# zF(7vrstjehZU=Kp*1Vh*HJJx607Kyg zwx;|4mbot09)0{6 z;LIb!rXUr|v8~_J}na3GXdpRh;AXAo0=I`w|jkzw23b+!X%+ zGwtHXOkQ6?v26$g<5bNt^#NUVkftkl^ALdZ*IGJ9wQ7SFe`rYtv$%{Vsi;vt5 zDJ9q{m{bTE!Cl%@n5b$5RhBL_$CRohmuhB-%rlEWnooirfp?ry`mR~$}YYay);#JX-?F9 zrObRs)Z$l}#i^(zUAZNzm=#aCm5`XVc)7K_*k$$d%X(rqM&&lZZ-E0>eK3}~^k4spLB!+?<$?>X_HFr%-_Fkf_q{!T@tv!R{Z z;MM5z;CQi+niU)V3a7bp?7zIrcdf#P2E&p*T~q#K!m^5EU#;ht2a(}msibW~pragn$wv?^ckb(PiTrh4Vg$jS(? zWJK6%98YCPvqXy28sU$()too+m&A=H5*IPU;X$i3fn!|1_pRir)aaDh2Jf41JkpF- zlWVHt8`f^m}0EGx*6W0q}l8Vj{Y|DI$(xr-6 zp%443AGWO*O{_lzV;;TneH_33=xg=UjrGTizEAhppKxqEUa2lV^(~REA@TT?3T=?& zYs&Qeut@0=YiW|5Uzwv{nR`vyPG3Q!6g0NFav%3VZ?O6lS99i5P4q^Yi*zNAbX|~N z<&Yogt8{7CM%^2~`U&YqZRrN(jRyUV#<`ltGyc!~{F=RLntp9GD{t1aN>_!g15xW` zdeSx8wGY6CPv|hU(VNeVE>_uXR$Zv6?((&7^=pscEadR6Euc!5G|N1DU)wz4-vajU z(D!d$+-%vYeX+6GwBpy~vPu5q|6)$2`LwnVT~}gWTb1iaZkF!yGptb`9C+g2Z5`07 zT>C0lrn+CIYeS}uaj?2%eSl+YsH>*o!e)n~e?hP8yEZ7JDwZ=5D>fd0hU36o7|>Y^ zb}L}a1vV~3uw|CR@@;?EuNz~9PHfaooNj$o4*YZ>aNK%(!ZC2duKuIn_LPeppc?qu ztNwG`_NQFA&++wNqUFBEZ+|V2`&JP6HC^u06SE9pV2 z?()k)LF;il@20j!)v@na>L>MJ({$v8e)(;>20P}U#fG5yF8RfM+yYo(=X7WLm+S)T z?rvNCkNBPS+@OtQ`6X?IpIJc%*1JDxO~zq6%l-1drGtODG#;8a{*n&*t*>x2#XaA) zvl*>GIirvO3;w~eZSg7S*nM}dxnW*hVME$*d!qq+*m#`2dpsAs+Z*&wND=%n@!ozF zamXW!H7U=1_3ni#XZfZ~#{87r{1nD@1Kqu(hGi@^1kzX)G6#!~m$*uiNX+`;Xw_t> zD&>!F$~Us1d#Y&a5CUFpV%15cH&aZ`LI+KUgutnxW(SJb=hm#eHtX7g?d~&7;BupDIh=3H8D}BQ}Lyi>tgH*6h*Id}%x^Vmizu zwLDm86`#MD`(~exDkd*eCZrN(X(FZU4U-=ZQ+kL~sZ>^7T~QfZQr!(v`#7Ms8lvvH zuXuYuA|PBfrNucu+$=Zz-GiTg*MEXa!_mgn6zy<2ojWbMGAlYM9=g}o&pkCf_cB0l z7AY}(Q)&bMXg9{L{h-Ew--^A$i12YXlrWwMf zD$aaY)p(#4_D&UdT^}N;W-asFKo(=kre=WaV`(CTG2^!05m*l_t*UY2;iZog zf}%t<_5qkE_UA&Yxj-)Mto670u2e=CL`5jns5xoioSkr{4{^dxS53H{qwcC<`6983 z&#gt&4<-*W2z6{3(ZT@g!Gv>Fp+c{gMqukAoHP>M>C+xWv0Z~aw>*#YWJ~nuRy7QX z{H&=CRK2!;8R=sT_0Nv94L*FMriL?#@P&{)FAuoN3^3Orfv7&z7NI%>6rh1Qlk++o z0GJP+2)2xd+-I;+z=Z_QJcMR>zC8@0M0i-J;|RYE%6?g>KyMn{DB}D6`BH>OS-X>f z8dmrD%%D1UPuKlIt`r1Zxd+bMad2m#VAkBBNL0L z^YTcJSP*R+2_=9;1_}J*Sf)BQ14S$o01`GKNHGi~c^@S+4ZsTlq%0W9^`0$CGxd%p zBn%@^1rpR8xHEi|ag7R1d#IUiJRrj(zn0k(jUn=;3;-$pIO5)KusAGF*w2q4}!$PSU= zG#Kv`vt2UL%{3dinFApd&-1KeRSAp;IqOV|eTcB8U2pcRdGD!xY<Cj4<>9)8BN4L~{M#bYWF6 zl=&`WPdp}v3eZF=jm%OsBgI){gIg`;!tJ{bX0GPzRU!Tc<%FvG->u z29E8fe?w)!)fsCUQDO$}FyhX}k|CISnVV@UH+vzvSlz#M->VB0PEvzo@7~btEB%{! z<8Lq9KF;Ql!+DSb^V0zZO*9Z!&xPXx^f zqelo0@N+Q4Il!4#)rLbz{?igX2Z+9q^NMFS;jooSoV@m8$_e+8Y2YIpyMZi-0|%5< zo&)O6p_5-=GG1UUv9z<4^2wX~`9i(?9hC3epxL=e*Te;dbLc3?r`Z-?AegBX&KJA` ziw3m&AG2ORZ(@VOz><#JSjxcr#)0p~aXFVhEJ&PUI?m0oK{sm8eP7V+n8(?Kp2K{Q@xm6rU{7bRR<-rnx)TYgwjuuG?^igH z%z;ytfn`oT3_v4DE=th4NPE~jXj@5o&I;!7@fVsqq*jd+ zVQl+7g|^>^N@zw*xVEb3yW|+WQ zi6HEOhwpp)sI;x#msACT(F53%F;$a2Era+(8^G;9oF)iiS)&f5LnsiODrhm6o~Pg9 z{OR8W3%x&Q+%1p*Ow|3`lUHa1zEnaM3I?a3Z37Nqr>ZgVq+-#&S8nU86-+_D+el)EO$6wQyqlm(%v6Z|neCMvF`Nxt?Fsd2x7p1l`%0|)ZT=cs>)#sdTd&gajvw8=*P}bSVZ~1##&WE2SK=-%zw6lfy4l#r>a_LjwfwiO zmJjAm+t0t8`upFTpv4a{w6Q>fJ1mz-N8HOHB=g!(iXD^B9+%X1Emw43qoKD*&h8&{ zm|!BhiJWC&GxDHhP+$y75HaTiWwCWRRPDZm2*(!pvo%(682}?KsHx*$0wH~%Dq81* zt9D;96X4LttPku7MlGbdQpY5Ti%(9(&IeRoW6`wXODJAhPu{1K&god7qsT4vfteci za>9qX^9gr(PYDCa?atpqQETOubJ5GZjJN;pGnL)`vjN)&9X=boMF2fsGodH&nk+$R zgeLsx0LtLA2ovHH8dXH3DC;gTgMAaBa7D1_00G6drZ2?N1VP2hUoVxpdg1-5){0mI zYT9XJ(|xr(X&MnXdm=QfH>f#`4MOF8GhzPN-uvqX8~wMRsG|X6J+^9SO0&}lgl;_X z%!J~Nf>)1L&cx%;D}llE*NZU+5`$*8WobW7PzFs^hMHaxpf*4ZIv+ihu!%f75rHGBo>)?B!X+VsXk9=lv93=aQ2nTDuV&rj85Kz_@G}h&@=k{xCTM%UZ{DAIY{BIm-~Keb6kJ&>pPw)){&NRs{&KSO6o8 z0SFSUSY({#fUz!yJ}b(EB>|alD$-<>3~y@;gvkO9Z*z{o_-C1us91WET{87=0qXfJ zf9IC2$%cx7m+hmpii7U?&+=s*^bbqi`5(SYR*di7A8quNdHDH7+wVp?x;g#8 zX&9S1!)+=31upyPTKwZJ2UFd_V=&Ok0t)ozwRUBoSC@_uBwtl~XTOY|?qrqf_W~wK(tu7|5nB7^<63VH%ZJzoeXoS*Q@=nZh=XCoK?%$ zYhz}&hRVde7TMBP=9@57wXmwq8LkL9iy5P2}qXBZhu)U1B=V(!emL zcT1lR1T(I|i8FstdHQtFJ^6YxiokQ7#2|-Y;pS`iND3%XiS;GUI8a-quyq)o(MjhN zK6ma;H9$yk-IR@mChlr^u-Y@b6UPhOh=ku96;Q~vLcXxs2z4e2aH|gA9Q|6~bVFh> zK=x~O&+2oN=k?pd_1Jr}+mXM!7X*WEjy;?^Y}0T9=LEMd=>Xt`8!!3y>69pV$VCL2 zUmTgLT3DR>y}FMf6$4e%y#P3jkcH2nL*iA4`Os7h3j&p-QdbfRx7U1?WC8}kY1KMF z!UbK{u)B@%q5p%0#dOXta#VH0Z0Hu{6$P>krp^xJS_uBt1_fR`# zeNX@9*>k`;Ki~Yl9JH7o@Dv3`zC1qJq2>kwLP6^`0JS%}lc2E8!?xGlu+d4Nkaa2FKd zK&L=?h)hvAOsb0zg~ok=6@HTC00cvX8zC|!KlKz2jM%8Lqyk;G16=mO+C_$fU=f?( zWk-wk*oLvDCaO!*E|hR?N#PF$@w2s&`F;v~46$rt$?`eJg>KB?)9(7$?5%=qI80ys z>w6{%b7UJ5j3LlHSz&CkWE-?JsA}9LWTB1}cix2nkFx$j7eVbi`+)h0&<_JV+aJCi zmhx;irbbkj{MuC0Rz)gY$^xpC%_bA_vyH$|9de-RcL)Uz9|Rsc(twKKWv|9xL5(Z2 zma7vXaDyi3?D(lyC?oapIO9`*HzJhjN-)4f3c_3b@)<)11RuNq0DlkReDw@#L?hiq04`)keUR#5p%|}U=h9v6p90QL|{C?Ga9+k!0RF)49PHo+*}cR z1Aw$B*U;BhzaFQL)RM6%%J6$n)DD;KKp(Fp~Tjv!WbEks+Lp4$noklSeZy zDL}#%nK;?qO5{2eaqXAIn3~y~O19fD@PGrOs~6>X_0h*4nhwHQzcoP*pBe9RnhaV3 zCL%`5A2qeY*^+Dw!#Rw2-9eIgb~=LWzos`qT*jH#QSNzSq5H<&s(MPznli6-^Q_Me z9*Dp4)f!GWmYOg&z00DqgEUhy-OUqnwKAFisG#-9;PL?jYxpup%NITsoUjTE{jp4v zbMMaqU&1)I#$EWyC!7wKp_-p1jAVJG^~@!-6>o&{_kF8DRgSk-{9{&UmqTr@Jh#1i zXzQkC=gDo?SBKVi1NH!b1aL#q>~wgJLMAYdgw~@;ABXKipQA#^2Gq#s_P1@3(hE8O z3DU+cUce1s;L5e>mQ`9;$xW!}1h>=NzPcs`>(mBb(K??228}E3zzb4-lSx12` zMW8m+9^|OmUtWYZP{e}nxt{m$`;!Wp!XOJURMLQf9$5++&lZpAW-kFYG~ zcMo+0JQ}LIRvXFSy6nNA!h)nAp!!h1^$62cMcATUM1kB4*y{yt4%hZ3j1-mm`88vv z?_+Mi8=tX<_fXn>H$S%dK8-|`+z@FnMdssabb9FgbH{&}2p}@*#+|FSCG48y=-2j$ z%->OY_fZAvSFAbD*Hg{U(`m{wR1Wtgz{~%a*U3e1-gY8YD>L?Hn}?f*rBqa~OPdl*pC)NekZ3^( zb$EXcwDavq4m?T@)l7+qO5y*0{U4cA4+7f(zpnmSEnzMzq2t4V zgh=Trizx|Fspnt88J9pbF9oze^{zu2%pJyuVWthnG%>T%@pl9l?`#f1Kjk4XfL_sb z+GmyY%8qnlikppoWLaT)y#sRRD6PCdUF2F(>6PSf9d{NA^L2_IUn)X*3_q?+3<6Q^EgXes@d3Fk_>?pa5(GAaDKdVhDfuVDbJFc?E zq}X&fb6zRI8swsiJlq8U=a`&-e@b3yKIM*i28(IC8Iw)V-weVuOP#!Z*IzMKlvsVG zw64gz`AfVT572e|@KsSl(eR_tGl`eMT^f#EVh-Ik0uOyX9_G1sCscO39z~M{^t=mG zwoiJ0=)63Pd3h`__iNF-3=g33Kpn+>SOv^Q1ogaQ6GegfFyMC>Co#g?{Y}wI12V&3 zcR2!t?ktpALXl;6?n|;jph*x>;Hs@VO+N98jSkF5VTuRz_-Fc1&izu4dR_G+#UJ&@ zL=Fk-_7~k5xO8^#atT8h0M-V;U*C+}b$-o@MoY%RmNhO-t-s82C*mbKOwSyRjMbHRrdT&e*Si zN5AWeojQp*lLy_LADB6GV<^nXVwi`&lESp8C4n*LEXxQfapa~6*SVn&Md*px(MsJ{ z?E`Nwy+Ce@erjhzZz`KXll`Q&e@6neVy>h$lnzT3`D#g8!#g72s^?~8O_-_EUgA^O4f?57)> z(^h{Wbmu->c;wl*vtFo?KoX+Ni6Arv%msS-DF)q;G6Jbxkal|Bz2gV&1FLME^WafSUkCO2(PT=4CAEC5QzuSVxe!d+%MGp81 z0+CM3^ho0yPDsZmU(z0;JcQ~LfmcLwOU8?VyR&{MOswtV5BF^)_?A<|${wQbRU!0{!0`9+KZi{$fSpRk$|2sOkOqI(ZO?kM=aTM3` zSNxLcr%%3J;x8xG{4(>EFwo;Fr+Hp14s+zT$iR$Zc|T7>{pc;b(NoluTTf45H~t7L z{u%A3g1`ha5ehTnzgLa~6!f^Xp&^QHeX4rbb!`gQJ`84_1!+2v4c&OO5~M~8}ubf)yMi)<}-pQI9NCePBf;W~%-U?H4Zts;6ZCFmAd@J=M2@&Y{B zT>sU^$1Kl+Sxil8DCJX@fv2Nw-GMu;Ojqohcm`kV+J`c;hkBXX&o?IPoVw#!blSGQ zwEBPR&D3e%nXOm&dCH>OvG=8yK|?4@w{w5F|Bj0N+TX(juEev>(fhjHmzDT}{HUio z+H>FA2Oo;D^^%Scw!U@WW;@^e_xND*+so|v!#{ujo+!-Uz9(96WQ-@$QC*;v+i9<- zFx>2t=n)vbxrtjOgS8kkh}ZlcDptS_?w*RyGI386f0F8+{_P&g{f@kgDBT@}_a@gO zm3nVn%hcZCbIv+Eu0rSNvYL9_H4;km$h{!{+9S_gkHItF+T7Iho}EjYXMtnTYtQ>G zaSUFC?pdZ@MP5(RydL;9y!Lt+)XU)gDD1td_v6U9H18+TJFmT;#+@?wkm6Y{_!K7# zrTdhm%byY8V}t>|0PLK88l4M5lmI+dMHXYgWuc4!ocR-`x}t=d>|Y0iY|~bcQ16^m5}w2CSw#^9XTtSsS}Jq%g3odmbDEP z(&XpR*{^jNvYkMKu#=`VJCLL8AJ=$lnHQ0BA^#v^8|$dGwaLWAsqqh%vhqgJ-vM(G;^z?`d!RuSGTftC4q=}w;y^{;F}4Eq7JxZ(|lum7Pk)iGj>LA%*Rn#It;ST z^r!$Lg}?|JkvO^~3~Bmj!0a`ygy0be@cqk>R7?YqMdd{1EEhdQ_N_EAHYG4)J;K&8 zPs7W|yZ`|Jq?K6|$9cS&X-ugfo9Zi|RPU^mv2Yd8g3%Aj(E>73Gig9V-orl|^*W-_ zE9K$lFAhG(WW}^}{oIM^Fd31DVUswo>mjW%fKdxA+pl>rX)%9#@*}wQ@7kC>AK^?0 ziN%j}_D4EBVaqow<_Y869(?%jPZ09f5C;;(5_K0~Z6bivt_om~pl>V#@vwlY9~Zqi zW+GT)q4+Crfsmf1&?P3}x>-!&I2gHCj1(OpJ)5#ez=9ebMF7kqfG1vDW(!()@N}_1 z*+B3Dfn#*Tb>&n7_fahfAem9tOuW0O)dQOmWmaxaqr7=kv&7S53rjGC03Zk^a6r;# zmK>X8maCp+czwDiJUMBg;9`z+V}68UOB=yShnWu=P`F!>IY>N(WyulDfgaZ@`jKssZ1U|c8!GAz$|zHCWEMC-MU zRya}{gwZ-qdB^UlPghzsCGsFb5jrIMU_2bJc{@rm<@)733Y4t7dE7G3y+ryIU?&HQ zH@kW!|H){VsnS!^d;ZN-W|AWANu`gk8Gy4v(vA12dLj|YV6x8HWs^D^shn^y5?&gx zszHywY--(H2F4~b$A?|y;z)d2G$C2h1-q=oNO|!3_!{vMavr)@kJD@ z*z7#Y3=HerH9NAm7!1q|Yn~T_8s*~|8!~E1PBR% zNFx{MG;(qPc{u>#x&&3v8E1SK!qwbA#i83ofHffB;S{<)4CMhLE_?JQlDq$%^@9=e z4sRb!aZLQG^S`AHYSRAp?6j>uw0`~lmG*F73;+i{$ey1jvHBAd7>9CdB40WIJO!%d z3r;~nd1mu_bcAO9?KNNfldl>)nGc;3(%=rXfTAT4&-Omx;xk9&fVz5fibQbqH-ULJ zH=e#%YCqD)KBL$zItL#PZr=MBjbsOaL047-Zvz32$B!7hy5WSJ&nI(Q^yK%{7?;LE z2<5XesDk#(Fio59iHQ22I%KWhrB*(oMb^3A)ZP&Z8*a?3zzM2*oa^U(B6*Hw z<3;UJWE4>ayQEu?av8Q?D(a6dYuMk6d@*UvajV#s?PU7x+=Uotx0_;LiJWi`dPo%j z$Z$yd*66OvRAZmtW~l~q7_320em-Rv_GbI_13>tDUK0BQ)`@x;q70Qu-W@YkGUR^X%Imqgpr~k zA|RrG0wN_65~8U4?Yi#YegD75{`s7p&(7<-U(cs@90?9eF(a|9tWN7~`R>J4E)gJ# zR5r-Ph^PRui9{(o$U@lZ%YwE{D|-cJ>21eu9HU`=SRPG0}dY-*j1 z4ee_ZnJgWNaC3)gF!%W&}XMdCZV4Zdon~ z1R=y%Mg6wv#Ws|dgd^+LqD4p5x>$MX?%I?KqsDGVa}A|iKmKo-AtUP<0^nkAe2o;E zAV!ANWn_tkeX|%hT*$NAaj@l<;xv$C+44ByNwpj zSG)}LM8Oq`JA6-z^wSFgCg&_Ir(V0zjRN5iNnYNOYh9JsYg1%@4!LD785l+H8I_~d zAayU1jQx=O-*}PpO9#aus4fQXyLyw0KD!))k`&FFFUhwTWrl)#(l7H8*h}Pm?vWK| zXWz@)s`t(MAdwPPlHOC2upzQ3g37DEBbJ|TeUxtVFn#b@2G^R`eRf?Og)yu$Yk51X z;aQZ6erf)B6xmVHa8zlSKFa4qk^6_jF9vzOrv)CY(RavMIwH$PC(2fK%07R%16_k# zSCU)FP{IiO_v9!hS)tsO5KjOJH>Z3^fN&C00Sbax6=et_y`_lclB?jJB|=HL;*>&z z$X?0xGGPi@@x!p<%;$k65)y-wb_s&pS~zhWMp5O8>Z6Un*q3jK3eZ-iT$Vv`qTz3t z?2U30IM@olMOq^pQH-L1#-Z};WgZB^JyHOo03;kjW z=9}r|B0bglD%G~K4}7mZq#S}&7mHd}#+Zp!!||2(hRI-rD(Gs}2&`87+U=v+nrTH8 zQz-rQR}#*@5sa!R7BN)lM+s+#>hi>Ds~a_R(G`BtS9x8lq4f21!H<~4KnYr{{0D;b zkYapMB9{&YB~-SO*0-`u zz7A?$SGwE4DO=A4z|S6`$CsIHqv^X0%W8)jn+luX)mA|HATLx)t;TG|L>aNaydK?X zX?ga@@qR-@Nd%y*iJ^b^LA2GL7(?|m^&oblSnYVy9eKfREDzfofmunH)!S#2@RtAejJ zK_A111=>z}!I!JmyeLaRAjcjWUzGv1hwWt8nnxq;wAdPC6X|&{4-4te=j!UnNJrs>YM7~`%(^lYP>jX0|4(3P9yYM&IpLOtv6w{3YY1|f19RKUoxF;GE(>crt@{M{>XED-!?MHBs z($qfX_Vj=pvYgZlU+d+>38e}*@AUS0U27gNYGIY_DKbKhTo?m!6x67_>{*$1RLg6l zvi!a>g_kFFzL)HZ7$O!#|dZ< zaYANvI2;CKV(E+bD%c!h)RiFo2w*`L@Ygbj^`2-8*0&>Y{Dd7>t)t^uOUU5p zvczNc$?!Gu67)#5<%n`W0frJg$|snPzgVlD?9ZeaXh!)Lyq??Xr=vGN37%fN-qPPU zoylJH?3a@2@BSSsFy+sRwSCiJJn0e)2h;$@W$sqoA}c%daO+Nj0=s2V>5u->whxii z8mJ7Fm${CwX{b2@O0ipa5^qh}`1muh-J0II2txlI5V|!h{JIso3MG-JZ&Lcpr~LOtzMqfdj4D`Gf#ZuKG|Ei6M%37h%kmYO}1uKqyjR| z3;z$rdbo3z`j8BZc}jT%K@-Sr0ARWUc_t4qGV%JaCA1vp_nCU^&k0w`#L!Cbit5wS z^$cvxGc3kQ$SN4y3@Tj_(93{$Nt8_1qI}C3#(y#G`+Md39w|uypR7gyEDoO6&&res z0&&LNXvn|DS&6^zq9uSP%{&wWvuk-boP0|ZwOCHV!wtPxZCo^G{aEvwzVcQ^KMgQi zna8N1D!C!mCXd~n7D!}li`Ur=ET&NOl8D}-jP8Qh3jOf+`A-h2*01@;vzCu8QP2}e z#Bjt(G<~BJDpPXK0{6l)XfgfodjqDqY#OlQlrDrLQuwsg+}A)c$-G~rHo|O~&LWKC zWj=k4`?R(o0iWjByq}DP3*)2NDqIr|4T-*QQ+S}eWIR1102tS`@t55D+1_7wI zw7j~vM*nGsvHY{NsR8$NzdX;E8Q(84@J}^yPL15}-G@HV9zCyO-MDsbgY5CROZbM! z>kX6rjad1Ouue8Idio6skc7wV7EF(LFklM5avw3e$a1h(De2I^v#erDrGK}+;kz@n zDcJiJ%$N=@FFZgpSZAX)N*Tr9G7Q#ic3I3&(r>%XvqFzxAeY_I6eV*Mk#D)hCA$Tu z_iwk{hRVXu9hn62%<0*z(ADkL$(>V%P1R#!L{U5g@iucbo-rbO>(CN~Q4sqNyX(NS zm7vV(1k-4W;szr92^XMD*&^K_hnRmf4WGYzn@9Pu%-b4WB^uLX_Qs3uHzrPFk z{yv*?4C=i&{e5Ns`)AtyHL3kCru$z5_P4V4cUt#J^aGMP>wxy)Nb2C&^x!n$;Ai&1 zuhxT$>4U%f2SnOKk~$Y=c1RX@NS<>@(RN7n=8)##kdE$%Uiyg9?1(w=h&AVkz3qte z%@OyTOWaSy6$Io@fA4;iS8m8hiI~UP|C6(6KnWG78yy#VB`K*a$W%iV2ph8eF1Pgs zP&zf{P&6NH!Lgu$%EYpHm4TuCaIy z)ZC`@yd@XknFp`wWWcn&)LCb?gzMnhR`Z$A0n@FDGiS}8!?f6l3bXJ8OaPs^|KQIE z-t#EB^UhYznE;M(x}RPUiRdrKitZ5Q5Rx|&<)npDYmUb5qplsby zduT#b2rU^oiVi{ z-wj+^u7FWF{1B_Bldhc(RUrutsnD^4=J}D#$T6U((rKY{#ce2w0&7`%*<8Z@iQ3oc zhn(-mlX^qRTzek8Kloe$*+!gEuz0T!U=+uH?kUUS#xkjNSpL{{ti1}MyT~%`dA$Cn zSVJp&xktfgzDy&@=K1lF=i3C?@j9pLC!Yo~^^V6LL`>d;z!VHdU*4{?ZE@WCN2?jT zzSIHJ%U2MMk`E!S`9WMG0+{`N^e%VN{gKDvbn^fPxcdH6|kM%WVwZI^Fj0L+yF@Q(p4a@QDFeJjN;i^Xlf(6#M4KFUVr&p`t+Yb0B}&P^wVvzkeQ@~4sCdaOzbYM~L1g_k(9KE)lU_*X~0EZnvb@AFhyD-)bHGF9!)*uv3OF=594xRSV^&t@h)kx)fJqsbbhI4I$fX0OnYB zueAyy(&LaG8-J|mqE%dPuOrKb^z*)4nCAJNCFR;eBgBql`yHj#gVl7Jg>KiUJ(--w zL{3y5G8?bYh8{vOu-EVRtv#&w;g$4@Zq?$pi47j-j35c41n$P(ekI=h=k}ER``DMZ zO6(%Z5U7Ph%Bi}HTh%l#5Ar__IY1I9ZzQVpy}O>Eafa8#=rW?Ec5X?nME&Hh)q)k( z-!WnP;fA9J1VL&M%F0peC7!tCsMHR&RWhJ@6B+vUYj1q=UUx)TB?dwG`)m7A8%qqN zbE{lx)?KD-K9wb^@q(lb8*ErP-H%{=``Lk`TG@8b1GJ(@-G;nJU1+nYDIE%ZE^l>F zJv_XWbQ5iWfojRr#@E3p406rWVRo))3joM9klJnbh&12Q^j})W)wcz=e0RPZTutXA^6Y*4_l%sRk^+V8VLDnPPzxjc zMXV<>)&-?-?zytLv*A+bePX{paM5S+=KJ&3)PgmclBmhrE4bN!?ctc1xWo_OyJUjO zFu+%f{*UEwDhHf@W(f9{fn@r}!t!`MphX6NTdsiiV~r5Bt9agmA-DHv!vT}tkC$kR zYA5BOuqaKPaymd(ixhzxeZ(A1M^A>48S63kp!4#NwOwl6?KDc1o06AnJ^Ba z2G6{lX6z`yHaz{Q;RrCjp$@^h!XCjfm*23zrjgan(ImPFd!_<%<4&==;F+)?yY`n}otI)EBx#vDRm)|Y6wT=77L53qYMf&UH5FwZ}# zQ^rzbhkzUemqUrE4Y}7SOCEGBwH5+FgJfNaA?rsDwN2Na?>b6dO=9)$tZ8K+kfwg& zxv>hhOt-F@`bE#BEOt?#m~a9EC`mo`Gn$e#9NFF>1#=`sP)BmtqCkw^-lX<%PS#%G zr~fmjt8AVIK5^J)LxCt`37kmf4f5ZlhIdj}zNYV99L4oWrm=mzacd~-Iy>}<(;!)E zc7{m%DrNIC%RRopuqM7v_C5L0F=LS!@8ux+h+cc$*3H?&l_`GFr`1B=F^2$`*+`1d znelMDZy)io#bT9!KqE6mMnf$;$f2Sqe&yHm8H>{<5eo^PooM-SRhEv&j2N44Rb#B& zj~gp|*YI1j!urL-q_a}3?#b^}mkvt{fhNK0e@O-?hkChS>%wEDzSR_!lD6jLFAkK( z_D*lX3s{dtGF|`dF@=p83$1Lpp79iyjjiGT!|d__+Gkj??M61rP(C_}MLY^!@KrM6 zp49ia13wyKsUU(0K+Lhb6ub8}6?GoU2Rn*t$SxKbP-Dn{*UEq&j?MU!lShVr-c>Yl z-nzmLZ|``8)^PvbmVJzeF}Pv^NvgCIk}8cVPvIf2`LL!_pb72vx-K;Zv&9x|DKs*P z`V4cI&N`8=B|Z$Lw3c4Llr`^{rb7aOBKQHIp>R#3s=UgX7Pbn9QQRU!%kO1i;uL5I2w_I0$7HU1X(A8!Ue`@Nbb7d>BUepRn;0JG)*|BY#cTy(&4VbsFD$*t z32HZ!F8%Ki@{P~1)vh-D-}VoOOP>L&N>K-Mz0psK6+J=)q)%u|RMR$HskSO0r*DZE zP4T$D zjpT7rdi_=EKxy0XaPZ{v%eelZ0s`sGa_84{R*^U+4CXGR5(8hSW?1MO$hqwky<{I> zOCRbAQe=`n{vN*5lob2fcc8I%pm?VFAxbz2r!B16X|@Sl@b1>vqsl<|?A;`~Tr6$H z|9no2JN%C*-LR^|uFsbtUkO4LRsI*LaSFx#*<>Aye$Pp+x>!jGTh!*0HDc7!hWwe+ z`ZrmoHo>cg>w>{aryznJAFyf=lPdvO1DL!DgpCbwxgsyCJY9@rf}nB8dWddrqP!j1 zFY&=+BduN(mO%l_1ji|(U|fsfQf?9TG6u3uNJC+t;IXYFm~n{K`GYhC0x-)>`*nRN z`!`N4s0g8;El54^d;+IcNg>g$om(%);ELq-#^1}uP<9eLb>6C>NNTIi~zL=vU4FD{FyO05w&dMe+JB;i>T)_R0F)O8B) zYVN74Jg()E>)GgizBH*b1nDV(-PbQ`_UVm2Q%Aev@z460YPDFbtIY)U(@XTwj!1Wj z%SaA(=Z*HK=VLdSxKf{uY0{5S_G50taa7c`9GrsDYT9NKMSdPVW|`ynV3$qQ^VI;} zO7;2tbq&f1fOXTr`KKLfQ(UVZF*atfF~XCEEO;W5Z|_3H9MhCtNlnaRU=E;YT;(om z14a>@$T=sT7uQII%tRg;85TJj7W*6CjWsMGX1?r=gdrmpw|*rGtR_O*lPI?hZx#&Q z_dpsG3?V^Kv6&=MwiJj6zMt)3ip#KGC8C>3JG>3Al4OerYy|QvB7YdSvc_S&d zA!Uv@5`2k{iH5Wx8=@1Lk$Bn}aDN$AHEQ_Wd$K#zDC1c`s(N8h*%v-C`p4{Y)rNbzyjDHM z7dqVeJvofi-*?sLBS#IA$F~$ruM#Cpjf~}tHYAfD3(g#me!nV}71LSMWHQQyT-h*b z_CVS$L-|U~evfv}U9@$fjGu>2h5Jr(jF>HOnE;X3J&mQJ9BPnB&-uS;7c2AST z0X5RR>MD+Au@g#0(I?3Iy-+`W=FPsV`E>v2RPLi9Uz6O(*VNpvU>b7tWUsqaOdcCwN{_|v}+?d8~=DOAfRp=RUY>G6(C3rjd$Ef7x0u<(ELsejbX zH%%lLuZhCZvL&a_Ka}_mn=rsZMQ||8T{w;52%90@U#hl3LzOJ6%Vk!oEmmsJ=fwHC z;PgOT1#-WczJ6vdW!uW1=mS#ia1WDB212s6HRg41Q93{yWg%@)GXBsy6}&UFGl38m zQWkCW^cYeruj!O2l2FL$j)nTGz}OBMHm0)2WG0+3>MA$7!l1iNIU5^is*!1`$ECaL z!TQaZ&9whAJ}ax|NF|S|Zhzjkd+mKPx7l|q+w^m*KUHawuNkvE(L`TFyr`=pu(Z(Ks zP46hlb!v=3(h%5vSoX1Bh_wG;FM6MhBILQfW?5QU8M4xeDUcZik>NTtuBRiHkaMa{ zf(v>LHbQ>WMz^Q=!gRl?=aZP$;y84?wZ^5CS>deNr{AVDf7xMlZDG5K%qYMB5~W`= zkGEVOcE1A5tzIsE*!m{lTtsE^)moj#=`FX@tfbSNhLb)cPHGYOjln4IC#mBgHDWLm z`;`UHauOmLCIm-CTK5?Gv^&jJSN52H?)7znkn)K%Zl-52 zB%w@r5vPoHv8r-8`-|(vIej1lAB)od+iv@E!|6_S<=0!Ew!(@KsTmxufGiTw@)Wnv zxYEYsZrDQ*C>R95XlI!A6`{uG&b?^TtsI3(IzuWZi63VH!MNtyxoWIJbM5f7mCBr{ zZ#(Ht_b3-D)J)5aCO)gmm594#+>qK#bQAkmb=`Me^xu1J-BHo-9+9hVLYi*k8q@oZ z(-|~l64Tci*~cc?*Sj#TTWdF@*pO%zL1m?Z5}5Ov(5Gzv)w7~B>QAe*#JWuN5mpVJ zPwNlAFleqZ#k(NGS2p=PG+-Gzn_uwt8@jX}vUhoCjs~R}IEYOuQ%kr%(I0ZX9|xxP{-CIhVic z^;OrVkZPaNq}-FbYI&{JZcS`fU=4~yCe`>t1VDmcdxYh&YH!`sI&UwDf zJEPV6&VYC3^!6os+@)T@gPM(mKL+UYvM4g3=ZgCP2PDJ|I{=b0pL^SPKC}Z` z17B1c>7n`LhRgS^`nGxTUFk@Jv?p3}BmWm8oz#?#e8PikYrT^vwNqfagRcYz-o8a= z+u>3p<^Ogn5sHJFja@R754>IhSO04FSIX!G+FVd|DF+$p8(2j-{mBlShI{qN^4$&h zC08VkOwwvlalevJp;rUTDg+P!d3X^igp=>v{CYKO=G<-n<97x=(>L-mKTD>M`>zX^ zzgRyrWoF!8&9*D~qEl+sD*yEESI7M&qK&)gy;nUmyBYQ92LbtW`+NNe-1G2TBxdyo zmfDXzIPJA6Q14Sc(%JiOcWlA;1uae+L3vI~Yg{n&hW2|q%U-ebrUL@^cVGvv5@ejT zw>q;wU5q4q!Ry8JEjLvI;tE4zAaN!^EyV||PyJXpkP~$o7hapM(hgrDZcRE_ zvrto1W=!xPjn9*&Qg^%BgI{}5Gb$g_x}=RdGa<~Z*E^*IUYM>Zt-D>t<1vA}$p67n z*B0OY{ktQK((!iP9f8POC*iC7TKPukKnn9@w0D}7E9rrSd^bIoePr!-7W`nm6FcL3 z34Q32dVF4-mRg)vW4ilr!5c%Q3&rw=YD=G}gds0)d+4PnT9oYS+{f!yr19DTOjDL& z+e!K%#JJ*)!puoJ24{gvDm#Sof<3%JvZoKJ_TXS(d(z{2BEgn3Ug})BLVnxg20b#; z&d5b3GTX9lM1fJc!#tuevli~Wa4`Hoa(Z*tFrBuj2ZK?iZ=%XRN0q-B$T^6rZ2PrZ zY$!_r0e5~?CX`lmmp(L$ev}YhpA+3s5#8AKTg)fA>CJCd?&y|-=mcev=AY4zd1E@H zW1g^Tk!!_dn#ObmUNGK>nZn0(S6nRS#^5_H_C{iQKgSFl#0(N+2z0SSys^X5u_Ics zqh_&VF0tc*u`d#0Cvsw6R>Zz)i=7;doq7}d`g82`LF^l1>9{$qxOua< zcP?=YfpLcy=bY;*$!6!#f1xOn;4L;yqB!Dr1LU*gSwfx)JqTFgm8mkm(%4k84zNfsTV>7gy(-!h%N|l-RGt{ka=tG?o;1U&HVGaC0PA zD~VPzT486l&a8%L+7hk!ZK2g=BwI2@>HEiaGNg>E((!nW=in^Ua%7;_%S$;)f({=J z_Nyn}^Ncx`)*VdD=Wv>RTJD*yntgnro82QCu-@O})!h=WadFl<`K>Oq8mz7cVb^Z1I(=dGE>EC}BEJ!h{WV@0w5<5vDd;}MqZ^6)+;HBs z^RfTTQyA_~tR-zbMKY!f471f_%Fo)>WGSzg)MTsuSgi3^Lq+i4c*|$Env`a;&5R$> zTm0a8s+hh;V$Z&qH8cDe#v5*L`u<^vvF7HQjWMKw%aq9yS)Ak7@nQ3t=h+s2=&50k zpk+|wGcM0QPYPmPvh%p$YKi14!<&&_nuh4A`xL)y(!*c%)JG;Pq}Sh!_>gw9GJWlu zT>U?)8kCR08u;q3bE}6!Z5AzKdF_JxR+cg`y@+MM;|6;LrdRguDf0M1jWP~ z6+JJ-FSQL3I1B@N1qvKHUJBQgcDxdQ;y+VA=)=C}b;@xejk~+B)KVgu!G8EW{O!%) z+V@9$j|W7QM2PH97k=#e%tc@QE!USqxg0QQ>&{&?pB+%r_=fPD>R{onl)Yl%T(z%s zzuY8e?Yq}?ALZ|xJ$%0V(Gv0W>DUcV|I%6ZHsz-c|9BiCAL3pJsthOE+xSM8#VL_ovlk-R6K}CccXFM)YyQFLo9;jRvu$I2-;nPD)K7t9j`}Wn7;pc{`jdf~ zqm99TZx1?z&2qOY@6bYamb(u$_O}P;pZ`Vd1YZ2SIBttSxu_soJ{s7#XNH3*xI%`6 z3I9$5@eo0xD-7a|rEoS+q^LzB#3QjtF;p@a6W_ijNd$F2C|TH=kIc|6_h(8#C{HQR zw@VCI)=gTV*vWT#LOyc-`XKfD2=B4>vtfp4^O&zjd<>^obUEsB(rNwI=pWf>3k}f5 zXejVAQ>5u-t)g&d$@~|+kz>-AMx(Elx-z~O(Nh|h&6Yn|+j0{bWOuX34&mbGi1OAK z?`_M*c({Fg#-^92Vv&|GwfbAhZkYE~Zb*KqppdxFOCz_Ad=YPL#$j^`(@TkH3K0y1 zHmJa&*pjba9hlhsVzAXl7FP>C6cy&5%wD#<)ZOn1Tt#yodp+)Us;5cE7)}aO$QKa| zFNqT$c^G@Lcod1`eU*Q}{`!V~0lI7I5_oEFk}q>y^x_Xvo~q-eX?zDo6`T}D%}%>y zhZHx23M+l>F^QRdQaIWytoG}}wBIgc<8X4ymi=pEpqfbYySP&HV}w@Tk!9=v>g6bfAAM`UTSA;vo6x0yJ0r8m9efX zSy+LYBR`_ox<*szkrJ<%_1z!y_ql|84DN_or(fzSI#L(C>e-kFR|%_OrSY|99iC}k zmn+9QH5v|nG^wGy_Q+evPme0vs<^!KzF&(krcccLwp>?n;I*3$V~tiG3s$XuEuwnT z`9w?8*21=XjuP&i-xgnJD|MhPOXIvYTPjwX{7c9_eDFUL7Gp=sY`tYk=nRp67B}Id zZ@iM$S9b?_13cmAYlBoA2`|m;D#46x?MZxhC^eHf`;WvZ6Rc?foT( ziM33(C2dDPDsrb6SvL)GRrg8LfzQ5M+G-TGNZllEKI)cC>CXCP^I84O>F{5w$d`AL zao_wtU#u$+KH!vo!lKlEhu-j}>l~vmDc})Ule9kReKU|@+u}yS7HOAp&zpC-EBEp( z9h$SE6bq)V$jemz?`Q%uPWtZm6^SeKJH0jRZ)&ND^BZ{MDKnd>#!AQjQ;q)LL5lc; zwMRrg75|$}EWxbFUnUWkho?B~!iMz}o_t*ln#*{bA^PX~wXm!qvo-054w;?R!D6x| z@xg(b{_FBJmtXrj%Rh(+g^|D8GAk2etUExC*eo~a(H(^=tEGllBj+{zAbYW07V z3TN$FTeS%O>OF3FXzVA*o%Sws^GQRhXSezj;dy+WeN>y`c0H2Q%OG6gvEz!LoIs|? z%K?S1rd!|r+|`zxsZL&~e^-9)NgiCu{~(K7{`%ig&VCV__NXw%Ht{7TpLKoNhV?AN zXuk(U*^^7Mx2;AFhSttjem{NCTj#ddU(o+GPh1JO-CWqOC^~pDY(`sD^aio1ncp+%7jXRGi~3eoRnN5ii{o-w zSwEvrMQv$m|EzmNWB+!A+RC?ppM7664x&G+eZJWLISA7v;VjhGr~=PN1T>E_ zT-3jC9-P0>(fpBLq5f4o@Ykff=JEZ{>RW1UJye22koF&Ns&Z)b+ZVe?|JfvzD-$IO zhell^UjA$CEuBxcJoM#R_v`%|o&Tu`4w1v7;`a2Cf+W&hq0)y**#4k2Zgm2B!dCM* zJwF9eS&4SW$y>En{4F6=Le>KTwd+{)*&oewGrs3rO9%gcjwF1SC&`>_LSX#Xu4RCb zNK?(r{O`gA8;hey z@nlpGjzWe{Ub^$`IfV=)cVC5d8(-+g$v*P+e;N zTZ@373C@KYMN$)JP`b!wD?w8?V|4=D7=ohYqvszJPUUCFNJb$Oqea}95d4;%{MMt@ z1~S#wGdI}Q-K2KcrONHuFj$CrA|I5%mpsJgkKr^2*i{UT2S9n_S)dqt%n+myOB2fr zo{W)M6Kf{_1V$lDsQW0*v6!z%^DSrYe7#ovNk+TQh(SoBQ4nl@HBj_$HB2E(X}Wi3(9P0-i3)>r?Fg3T92-#UX*A#Yl*8$9rv`E}k;J>=YKlu{pB zW(!$4kkRA<-cpD}n zFpQ#X;KnxaxB(AimSnMFgxe)gA2C7fxqu&{Rz!h-MGmo`Mk6&hZ$oi5w;$SS>*Aq; z)?S-_+QRk>^;QT$ee*|QZo;8YJ(E<0qi8*_Jc1EF>TZX71%z??j&9E!xn+Ia&dN^} zI>eFL5txwzWTB*w5NJDj0M`&jCg6(2u%bpOLJ54icn+kyfB}GH0)|n5jRc5MEW7#; zyZ{6|9t)c3)_PF->1qu+R%`5_Jho-z}Ep@N1U4qb8_YjyT1mTQ8O)Np4F29ADD z1N^!fM#D)gnzP2@O@LJ)fJ`V*_s!81)XnvM#G*T>FZR$E_s~rYqDmmr)I#B0x*Zvf zRtinMETfHbjZKK1+^6Nt&j7Y|h_&$H*i$iVf8%(E_)}l;ZWi5_ z49Szu0@oz`M_7`F`2Fh`;8W3!1=AIkNaB5U`SWL0UQ5Om*NC^Z^ffi;y()O zPWiUTCC4+2e&R?*IYN-JfB}mbm1=tXZ)b{fSC|Qp)g1!K49}}2=dbcT%kV3c9bHH4 zc5>W$*DAg>E1~b&vT$1xYc92W_11GJfgIIX#V@uv?*DPPkvO-Tadl!m^M307IPze9 z`vBT@QH6!Brc(X!h8r|u)rWz{)*-_v99hFb4aG(dflR`qS?nziHwF(VX|fi%M}P#8 zP=y$Y@*zs5WSSFzWx{f9JmR8s6(XUUCkQ-%@T>0NHxzg5_GQqt5zzs7NtmLOHLOHn zcr@mWwvGrTKn|q6v=1Qb(%5?Gm;BN?)KC)+U6wQq&dUWlffHuJSr|y4I!Kci$VGMo zKYR@i!;lHLpYga}3`py%$cRsX&m6k2+e7Th5Sv07U`^8SxN}Yj>#w%c#C+bkGk5G8*}0D%-<3=OC zHI?g+H)2AVaumY7h+(EC5Lpi8!D=cUn_F}~WcfZ`AhwZZRewMVfSDmS^+Y%-5rk^P za|5|HuOO*0G^KzZh3D|zWzhx584OPQ3B%&8Z=WE`Qi(9qC7KCbC!B7Gnb?RpIBPSyTJ#vu5b4JfQ>VD;^8l77_=EQ5s&pHQcP6aRm)h-HM z*N7)Xa310}$7{h!;;x3-Bm|pKgN zVVs4#W97&l`mvEwPrDmwyo&gAb;vs+IrC=MXH^y4T~c-&G3m48 zYSb0sw`;t01?`FhNIb>D;f<1eK;Zo9gALimj*zMlaeZ z>?#i&Dwcj#@&2y3zFhs{a_j3SnmW<70z9m)iUDjxIRUs>RS5I;5L4zbslN0l3mTB@ z_LqJb)Pm)!Sh84O+Il4bAhha0u#lW1^CXfH{%{FPb{I`2fyGJyGKpcJ(o%eU)&bTVK%2Cl}L3{5|LO z+b$=Z(F0Fn*s*WmJbIr1^&w>J5WCZ8!z0yzW>rcm$g(O#pjM68M(ia=#|-R?W8oL= ztZJ>Sqt9a0z@H)ViF2MHi~t5JuyEP(yszN1}|_zW<{ zJpE6eT+kouz6w;HKZu|%%ZeBdidEWh?4;21> zuYA#aLH7RO=Zsd|`;q@9sW1e!{&w-_Rc&ENr;$bgO54=~)km4*&L9+j2n*nQy5TRL&O0sz}HrYEGZ7gtu9MD}xsj|sXV(^MSGse(EH`0ry zj7KgOhK1{tsd5Ip8ZcH*(~+_Lptvo+Wva!sfR>015*}vt0(NN-LJA|GO}Z+m{Uq9>9??f%3DXeiE0V5x->xMd*nfjrHhH7h>A~9GCMarJn!!(GQ@YU`lR-i9}Qg)*j7L6DPj@dW}NQ|0yjOI3a04S2tD!N*`^IdruAX`# zeu{bJPoKYuw~<*k;Wp`OZN2u71Jn*>iy7S0Q7W;0^e$AcvDhVi>3Su7^+(^-KhqK4 zB(JTq0u}@t3}?aLzCi<4w}Wq!Og~)5y|a;+r)VA!mMhN_`4?aQF6D#3Jh?fyb+Xr% zj}*Lg#`ID4YirdH4zJ%i+$h__)X-@)=dSL(`02I1o~gV^oy9+_`xR5C$WM?$`~HT}~(?mmt`|4Zb>L6}wng&hXQgThl-uR_@k zFl^RXg!fEhP3fsc~ja)OT~Pd+D85OFCzm>h zVX!nPwc#_vRF5@k6lR2i!Ag%pe^N5@gumE7N>9?)lb$|}0Fo&(n0Ow!LVs-V!Ft9k zpXJcPDjnq?EsmROTjqbCvt%k`A9vzsNLR6TSDa*;y1{aM_s-rr8^nBEKGnQ5v6 zY|$8~4%aKQGDm7qJnG>TeP6e%BlupWhk?~)9hK^*KPvRfW*HuMzepzWpDJjWT#2I@ zsE*<;CNgE4 zKD=5c!}G&N*neM*Ibv6Bfx_8i>X%J-&wcHePZY&)%+01UeFcAS?J#VKHhWaKB40T? z?R*)fByCoUY7Y1jZVJIm!mj4inq+c16cAqoF_gUW?%g!n&;@cjvn2{jD4 z8>xL)q7orLS_xZ!-u@p}!cA@Ep;61%!%QE449kC!qlybh*-^{xyhOGMEX$AFbVm;X zUiOy=e+)B!B@#O|W@LYeWsvRPxTN*LRP0l}phTXBbV8K8O}Jd)kfWD;1^a6so8$W* zmc5h**{6exk4twPZ>oJ}e-pKET>fkMrWTQX2G4R*N#W$J!^`nD-R7j4eZ~8V7RPK} z@kyEh$?+}X3o+~33G4_B75BMwJR{9`_Ie*U%aGy83saLCUX z?Z4#_J>;!~=r0tjXKE^c8TPAF&8~kWt2i225j;}0FE!gIb!4PlkFvU7uFw-Bo@3ZJ1Z8>^A7q=1j`Sa?S%I29Eh%V%H#nk$p|^Mo+q* zuiqSup18Gg_#G^pgH5)t#;csf;sNhC6|5+AIfG9dCYP>??TL!(Ttw?Nf4cU zFm;dQ>5pu>F&etBGrJD590}$$BNkjQ^0*jp(V+n}l}N!|1^AdqXC<^^=rH%%+oex$ zK}QhJ0X;aT=lvf1;m6U^dEPF_=R?jm!!3>BKhFO=c4u;3X6oQ(zrBZM0I1u>f^vL9 z9sJ)dguxF8Up}u|zJLiGKdF4qJS(UuC$wfEXx|}p8q9y?2io(tfc@>YX<2S^SMHm$ zLMHzoO=sc`?qfX7oqYh7cu7cQui|D zz3i1fWS+dGD%P{Bbbk26y;f<%R;3VoQ3-;m6FU^w^s_`+kehQo)ON>$6Y0(&T))E; zLr>onYGW$Js~G;+^9*4PXcp1uRyTA|UqiwQ0bq#2RY+mx0!eUD02Ue$`%J?}ZRz43 z&^mQmURhIo>U4UOruB7AK}pScM#-&hCBnffR!uu4i-Q>UC3{920%%ueY2Rwoac|SQ zv91}jrvsvDKT*@|$vRzoO{cU?cQEU868Gr~dpfmYXVTU5TK3M!Rj5AzG@P)0bg^0awSGw)_2_!FIG6YU~>sW@{_9Tl%Y?wR4P2$TIe!n`wLx z)3|NJCm!-1HN$Hgym|Mfs!Is;X)|1+g*&HNRn!5TqrwytqUIN(W}0Q$H)}btKe^D% zRq1$qH$%7<#dWJ`lO=@r#VM|oaGpw)Bfe>PObdTnIOu~ZD{PwSIw!6F73y8^3ZBzy zID2o2NAS9e#Uu|XY1T&mx>;Atmsn1_wQPLek0q`H`z%|v!5clhyv_s2f!2cGwRh0VKmxZQzS+tgk|u=A-Kt~aJ#^)npO zd93ns&OMkrcXI;I&Fwm!ZNss1xJ`Bv?65cGWv}P`Qt`v>6_2CooLhB<%M*IAZE3bU z+jrMKPKW9acfmQe@;MJtC#e3EJFA+_Krnmhw2Lt({&NnzO+)3X9S1X?XI{qn8EL+1 zJJlB&=W97!x_Dj7dH8O(2=h0g2HBhixxEH&aIw`as|A0SPb#O=6p=dPC=k~8%z54U*w!0OZyur z<;%G1*1FArN>}J@zHmdAaML`(#fW=0xvsC~evR>%pX;*EYQ9nWDx~~XyT~<_@un*r zb~m(Doa`cQYHIRYAKbWV7kPu-FJAp_dq}XK%Ul00mFlb37E`t)8!k=!jdVMwjGIyA zkD>$}TbA|DQ^>m?=KtfN?77^NZ@lZ` z^7Qw-Rsa3yUtI(spTHpy!|fWwpC2Q<5F;)SE9Dw1m;XOR6#=4}D^W9_sJlSa7l<=- zjWf-Uvs{R?6^M6mjd#h9cVCG25=iiKO&Cx|J(AT{qJToR5^vKlg1n`)4M0#V8ue)% zoC$=Qv?XLg;AAEsI8u$^N(#s)WV$BTFC;e!q#XHkr~3p_e#B^;bZb^cbfOp!*vb2`% zw4Qvm$KHSmL1Groo(ai-6yV{4S(*h|y0;R3QT14~6~z7%7*Y}-P+ux!2M#FRk{be8 zSO{DzTIx7KU0-i*6gcw$kO-#0RRKghl{I`QhqH`B7ON+{)?$y&aaqio8_s=ruCThG z&`_(8SsVNp`(We+=o*?g*-&l=3l5~g9O(om-xfYr3WO_^`r4{yMcl;w7yTpu+XabB=FG z0n8_8M{0t-N}Y@(x-pj?RZ+|bAj=gGlF9_v%XpWJu|ib=g;iJF0@ALg+_aTr5d=jE zfnJ&br1yA3Z{RWwN+KX;y;I{kGdOtRaI63f%PwLZY8i|a=QwJP@>a~LzZq=a7FEy5 z+0f(GFy332<6J-ayZ-6#hDx5D(BGb-MgkJJ^7jPxAPNiIn-ygM6zW_G^+uD4HEBY% zIc|;9Q4KHLT6mZ1IUh96(|hY1by@_4Tjd|9HtDo1>ooGax2g5D>i%gtwcKW`+n}h6 zTw991>ek`%pyL92wHmgXfod&IZ;CIJ`2Wc7h(2&Gq3KviBKS54K7^?G-Il)GBBjg7 zhqMU`w{iUG$yshRz1?dm++KORl>^oBROf%d)P#xu#ebIu{Vs&D-;ln0S|!-M>(+9Y zws24Ra!=ds{@T7CndM%IzW!ggdz$(NN|*bybg7$v29DeZVA1tn%Xi$D2gOB(zFJqU z8f1SrECYF)pw_Y9QskqE8CQ<<)Uho0(Utx0Rj8Mra;|ImN~x&o4b^@a@$(oB(A$#L zQ&7-T*r!)T=5BgqKEDuX8bH~6iklfN2g9@|Z1!-8w{Xkozrg_I;pSuy80GD}2_m%qq(!Jv0njX&UF0g%rpe9UtLFI_6RT;dr$ z*-`ZB&&n(FtFOkTsh`Sv`qigil@D4y>t6AlI#|h|i@cUP|61kilw$X5xnpZ3(HYI+ z8QnXt)bGUNR%Zr{W=&UTZAIq>t&oL9M3*yj?}q2R&c6vLesg8@&2`cFu=Ddbi|22z z&fgPVAf8`HEM7=iT}T&Q%sRiASG@ROb@8F-Qu*=o`9`&6&1h4HWs#W;n>&Qc)#ZWW z<;D!AMtX5%%Nf^@h*s?<%Y((M%V%C^pdvTBR*bpdKGj@y=$*MA##$}{A+ z!};EUa*yMN)3gA0{{_~cgAQUFex6(Bgq3gDEB{c9G~oIG*;Tyo8j~1mb*QQkfA>V? z>+Q6X?LDrKi6yeXT0cJQ-_E)#S8-SA=39pD@MD+i=e^8NtfA6Z?#i`@`F&H77kNt z9dUhm@qh2>6rcV`&W^QQ{@ddj|7LW~bsXDuh@c|?0kdYxAQ8c>;4#)*`ZN(GWl?0- zQZ|wzpmup>tfl-}I@&N<#Jsg)JPYGc=P}+|`65r*?|G4VTh-(Pt*}okwf5dm0W3FM z5ur|{mIBFip)+;unCVo@b0#;maz0GdIQjgp_>}F9uk`HG;nn5&__V=!#=z({xzV!g z^7WzOZjDFh$zirzl}n-DR|g0XRxzvY=C!9J?h~F9-7O4|X@DpBX~)%>%Dk3X>nQEk z53g9{nlv70e_420^dQ!AvbV!@`jOv@66?Osugl$GpWjaQb$x$F1wHt>a8T`)a5tT4 z{>sfmhxg;teAgSIkG_4SK8AQaohgKM|;~d_4BoNp8VN*_wL2R^wu-S ze-8IPzk4+>K&Jz63_1Y9XO?*fE~|x(WjVb~Bce<&YjHfzfu&cFo*175p@=}yM6m?S zI!QV=a6O5Rsj68|KH0gwo}xU8d7rBOCh&cl)>h5?`+7gO-=|~Y@*89$zDpY!X0o*# znO3JiZe-z2b&{ArcVYRxkh&z>=ZNJD*SCh-SF@xK5j(|Ljr?KSsBmR>;z~ z9)qyriulVAN$7F?REs8{Y=KOn>SA92ab&X&PW9Xea&Y9E$|rh zBA|z5!v>`_4?$F{$h#AUCtH^P9=|;PMN2&O?{GtEh z7n2zXAX>k=0+lG^%+Tumn)5x`b)t-~YivYGbt{@ha0Kwgk}VLIp`rp<3FMDQInx|~ z=oA$At4y#$UIQYB-&c;p zVBZ0@2r3~0ely+%P{Pp4jE+s6e4;1|g$%}w@kuf~^vyP5Tm&PgyI53M|K2r!RJEW; zhPk5S33MRl*sd2#Rka~AXDijm!J2ZS`Nny#Ufg~;Hx>(HB)n&`8 z$V^&Z=yht0%Bk|w7_%CAKG)o;UUA;|iu2ra=hnixI$6(FmSuP9-IcvURFhR<>VhfUHScFz;fHE}1D`utz90_4Mxg3MD$_aL`e(uX2v;6pRmfPQ znl|0O+wmwgzCNt7@6Cs$8@+crzFp*U7b&v90UlG0wy;u?@yRk2WM@bb27pbqTCQ28 zNz-plro6pr-cfjM^2CjU2dh0MT?0UZlILFiD(KHV^^Z(&?8DphUGT$!`NnTCqATA2 zOct65XBrYTC)U_+=W9GOGGp3j0!U)(=<`|&7cNB*K?}@)G^qrK$Rpcif65SX6$f&a z$LwS)I7OP#KouIqkCGl`!WnYFGvUmLVTiT>!l+gYg%=xsW|crq0-?c<5tv~(vnS5` z2yV=1(+1|^z}J`w4m<`dOoqe@AS#FrpiBhVggqVm>9a!Uc|~Avr!ZM>=ltzKM>G$W zI1&=HYO%}^pFv=hHVQ??00L8+SQAc=B?-xHRiR=4*22c>`9Q8m8iJzeL1wYrF|3et zxE^oaD_}F)NYPJq0Q?UqpcwTV6Si-PtgZg|gZ1~Q<-WH84rX#JR1mW_ zkOg!bL8Z|kW2nzvNZ{ZJc2BZ{vNtUm1A572@F|u`VNt~r`9!)%2qSMmjA;aWe+n$N z13+$-Yv8mvAsHPVatsM0e zve&)B81n!Uh+#!~GedB{2T=fmJs->I2Eop<8r-0tL`tSd`VT!3&-&icclf`DT09_F?%ikhykK6sS=(*R_rk0GpIxtxzul()p>YfxKC}I| z`+)v;+jijh{HuRI`{>6z=>va1*wTM5)Bhd5qDN4@GXw#&EgN0|GX-2i+nk#Ms$1pL zZ=wn$9gp?_U;$_=NB#7%M{r``oGgq5AbmE@%gP5;LIpF&#K1~pL?ThrW)iFM&KO=k z=x&UX0P(jbQQehzy5=4T3&!Ot1~W?V&EUB>W-K0ZkD#cCwq;}tB&eukFw>ziY|$4i zvctkUEml*C`eBcXQU(i9!44WC;^@=xjQB^R@se5z>!GrzcYIm6tWVB)d6f!YM-Vk# z6C)xMBL(hiA2MeeqjbH&-!mDnYu!0VP}>`ngM)^c8Oj3r6`5R z38L4!G~fv6n1*QOH}lZ7@DM=&>PCYd#R1YNSmTWHGp$osq1u^kq&cIcZS}P03nsu0 zh{V9G1T%B&5ITsc0yESb0Sh}UxJVg*p|pdzz|yp|+juBz2uo};W8BvT@Y>~uk=0o` z^@b>U0IWg-nJ5cCjC4pjh+#kHRMnl#b1sALRtAk2$Cp7ACd0+f5g-yk5&*IZ2DoK_ zglg9 zLWgeR(9#A_I|I3F14s-L7Z!4g0@kCY3)l@WWm|tI(!2~Mc zF#`uaOUk^#q~}5s-HE@*X$9adpKZcacSt@eh&$n#bNdL0vM!jyOlgCwqE*FQbsElj zl#b-c)fRFeg6#I-s6i@q*6s9vB7Wv#PKplS8u{&GU>59_(w~4}%9@ zf>`nihioU5n&s03iPgBo`{zowZk23n%VcVEYIh?%c1k?Z55Q!Y7Zu`LUXW4)Fyxs} zqyel3%IJni9y--Z#R-FA3ipN_?`ndlpdxr3X)1h=;lb;r2*=whBt4+>)KTtc@rdtW zz|DvVZ?c0Op-3q3!hn23!qC zs4nuYxAWLwVNuF3-}Y!Q9(D(d;MzF_-l+=Fspc=tes*wH?s;{n4#33^h*QGA&7dY@ zGZ`J!(~mXsmkZ!H@J#|tmY~Jj0uslfdW=zzbHavCvs7GQ;tj6jCEQpMEP0od|GuZ< zkwRswPJO#uJ?8aEPM^w_NEXg1Oc|c(d|`_J1r+^a!o^6+Md~c50aXL_@dJDFJgAWe zHvcT3jhqb#$^)U_|8JQ_z?3|gm)LwI;HAVLPE;;k=DwKAg9%73a$ zN0?z`7$m&Sl-#EKCyfE$1P4PzrsRi@YPNs2RlaFAHz|h?GJeaxtUjP*G?TbCs*H98 z0D{U?gCHj&ZUGPm44PXYUlEZ^FYV5(mPm{>ZwYtrin!f%m_f{`#YK3-@1kvZ2_PMy z^_nrt?pMl%M0k#%e^E;-1O)nz59wWFDFK92lMXk*GJL^z)i8~lVK-{S9N@rR z^#1`HpLepoaL)IsFxAPgi|JbGd$O|pEgq5*HvOsO=cJsCLBQoG; zmAfZ|xD>Dyp6N(h3d&BIC9qy>{qqw*gbLQ9+J?qUa)Ra2ARQAba)rwNm%1N7l^A5c zh=syb;Bu~Na69&$(13czeCC*PgV7vs(U;= z9sN|R=&8=*r+O<-&;EUi6&W_r8#eM7Hi;e<9l9r;F#sPN1_-j3clGymVC)DW!UYxi z8pTZV;M|rqnHqr}-n%x`F3jwFZn^>(k}nCpX0|eV?eAzR^T{EDlNu~QAPOWJ3^|%b zps=?Tu<=%h$^ZjG6&$y?3o?mRT;KxV^aBHgXX@oB|N4|S@vtkd-E6Tiu%U7v^jXQ@ zaY|95oRkecRP*l#rrv$ITqt9E1rMR3lFTZG+)!;E<=$wZ1_|npLS;qsZCch=t)c0K zMH;WUpN~dQjD5M)IL6tBr znba#lnOwJL8y81rDVX3oGtHA`>}bKgLj<<{pYP3Hs51Zw;;p%NU<;iSroPKfA!Gj^l;q`kLn|s&#Ri$2@XNrk@T?#dB^?<^;p05fIKC!2-S*6G*ek_fXAyGz1S7LQm_3i4eeG zH1n6#@e<}jXhvp=>x;m~H$mr7Rg27qrRGH&T3L?P^?E2$MJ5C^p^B)#jpK9OT&U2R zB9@MKS6JH2KF^M;nvq|4(<8TFj#?U@t2n<@b)2u8ac+6mIz3pki&2yS((cWwGC*v< z#~&K5IRb!_MAH1T%6SMGlm{%gvhiH)04G`avpyq7i$@MqSRoefaXNxb@J;W}&m z0_#+x&!TCLBNGw-<>R^M8z&#C@M$)00s!~mD5&{BM?HVq;Y z><22agGMDXJRb(qe4HH7cOeqn2`<;;q zOpc8g3H7fBjw=zK*4mFeuxkx5X^#gh{Z9)w%Q5>;>NMpCoj1s67JOTmeMdmz+r{9m zrsYL{TlgmQO0#nRR?yom5h);@?^0I8`?+>Rv5=(*-f~8mN6Ov$W5UB*$Ccq?WyLH! z8c8byPMuz?^S-*MCTHtbXH+1zBW-f+-%d#MB$>*?8uu>$+X5s~-W%jTWP@Nu}oTzQ>a%KvOS1ed_=A zGj^Ke&TVE5#^T_yUi zviP2={+_y*^!Jzk_d@n`Gh(HunRcD`7+HFQbjcTwId`6*jJ?GFu`6A2<$4mtnLCkS zsDI$-b?|#|nxlU~KIXvQnT!5_+t!P7u9(mC`oYC}KLa^9>8jsQ=C&^_{>~xnehLg8 zgkDGOkEPCqr$baUD*NI={*G(V3l(}Vm!&cnXpSn}0gHLV2fkT4ALlU^3+Ks9%*~LdxhyNbY*TYX z7zoE@goFH;4L3*4UO!$qHEv(rWOHX`ljEOWv9*tO?u7#L&$cKV#x2qj7(xMwqd))- z9>)SiN>4?W#xk)0Y@%o51XR|6Bwj_&;e0##dz1U3XYN7;?KjLaWvok#3hXy6auv__ z#|b)YSruwreLGy>@WH0!%$J{qIpcn~)9Q!fmH9(tS0fB*q?P;5TA85Y^OOXFK05RxWG3F1u)Kd5NG0I1FANNfS3M@i+?InhXj1%6wc-OaSAt7!buoy34<#otNs5CxJ9s$Szzb;GM!Rz-aU70m=X~V>M>`WI@uxuzazoyv0QL`ml@w63`g3&IEEfg*}Q zy1a=XC60drqXGv!g27fQ@)y4SEwZfcRj(8`EwXevzCjPee&wa9t#LmeMX)E+J@=AZce-iZ) zpu|Ikb`9y72!KpYy;qz|x<4u6CLN1_qeQb4?gz#&i79JcFjPQq18l&e2I{i8UF4ac zi*_!>H%RKrhIKZ;j?n8GVMaI=-j65?ik*3+2ZpQC=PMSW_YmI(x<2&Z{yxB@AN}K* z+(7hR9t%aD_jF*HVXS4ql{*zDXXL};)NQ~OI)pSLk)%&f zXRFLkC1@Z)tT(z1#ePmD>O*}|@mfZbzm1@#M(dn{4o0%4r;}{se0eIhj1`=xlU;`C zzI+|s#!3;>DPB-Nfe|ee)!gaS03$!4xo(rwozrR8?d~6ZF=_S zboxE0KN_ZOX2AEFoG2{;$tp8TZNC7zxor--mg6>8s?KEVk(SixF}I0$o%Ik}X;b0% zgq*4>byYCtl2I&7SdSoG5XXGdSaRH4Ha<5i`vT@hkEQ3&*Led->9vZuC)tQS$puN; zhbfmA8B?JJc@r|qmD<*qoo5Q?k!AA2JSUx<;_{_93ut0kFqib;IS?fV6brxUh1X>je=Fi*Q3oN=2+*~L9|TUiNazcnWxDDp`Nfta=T@0M;O!ey|dmca`Ue>}^a>lB6zw-2xTD6uQhmxPO z)%q}nXG7*EuYtWy)IzCj_8?FYW4Z{z7@q4THZxnr!qicKR|Mk}yF!EK15{2MWw2H> zh1FZ;twZ_JN#Jl0e!~?a;;5XEh&GZy`dl(BVwsa`c53j~I01Mn18mV~F!&sY7~nl0 zzu{P|Y+Y+3>TaI@NWDoWcTnF|L}8N` z$eSlYjN%ZDlkKI)pMu_I1GrA0*A-80{>e`{>{pW}xP&w5%dZiD2H4fw@QuCbf{|J^ zhrE)J>XpR@o#9oOv`ZF!w^s{Qv)VrxUyqvW^Zc2-`#{eHMxAg&@ex1m0q~GYaG{GGA|d1JFZ5384(YN}9l<;;PFY!D%z{ zdG)gm-{aiIFE`H#`FtyM9sU|0l6pbUPw1I|PHK^POYmRvQRkcUS7YY0xt!#79BVqV zTY0Jy4*WpW&m7{e%{60=vV5O4n0}oR%RJ?Dn(Y}DxRj+@EBV4|{Qj>N`Kq7`le#a| zyB7NjtwYi_^#XL}7hgX4yU-juWPPUI8E9zyp7S7DFN>}b=aC=C+F$qKR2MX8JT_sT z`B5{C=v1w{c-->CWUVPdE6U;gzgBJle<=&bpL;>+TS4*S#n1hjb8@_=irnu6xXmxU z=^DKu%)ylT%h`XvCe|z+!sc(lI;m(JX6fFUo6t%4ieL!37R9W;;6gxPAK(hNl}_7l zpR%j(&K(g#b03s!Sw%~PJUwyi z#g&q(3E)$EhZ7fo=;>F|y{Pu$_wef1lNZ|)KvW0aGmF>^^f+w3Rokl zX##^edN!1ZfJqD_RQi+R`8Lz%(HV`;LO)5#MlFn-jcCm~pR6j=vN+ct(b={7^?JZw z;Q)J<@LT0XE<3fAgZ`WSzgEA8+4yqheEwEMU)@PGjb7&+h#b{?`y)LudP7G4)^nG) zyLr!|w=@QBy}bE$?;+EjZDakY*Xbe8I0c0Oq2}LkWp}_8H3;>jCDPWP_;Qx?ngnoUWM|?kb6y9Ly|4)Selu_`+k`j1^GyoJ)%^Q#<5zYo8 z_84bJ2=HAkh7U3DBMgBG$%66dGx6wik4bRR2(0QcXK4K#&_NUrjuo8FvQ2oy1qfrI ziDO);Slv5eUGcXxvIBXBh$Nxe{J%uNd3%7K6{kl_IU5LCbHMRMBe+u$E(}DZD@P)B zC=nfFD=;WuF{IEw^i6({J3O}`u-HC~B$1CzbcF#J7@7vn`pqK^#A=f{?56mGIAaxE z6;Y%Z(x>}|2neu1I87mpt*Zc}>RXo)w}-01Xt|}C8iEkUV4~Wv;XV)LDQQTDZ|2NU zn7*@NAOF*|zx5#WHse$ir}CK2&8`e6HIU?@5vGiYKjYp|T?mssbRv7?T*ZjnM20$b zWadQD$soo26NKJvV}KL~^44i31J;os4rR!{D^O;Dz=;Lh9>qyw+A#tIBNRaNZfKzp zl*WkAg&5;oI8HL5uD32>O5xG2g3+J))=#l^eKC!n>V$(4SFK2+pBjd)=)YW2D%tB< z9vjfu2J8WV4gsKyYsAY4H4My4H8HW_Y*x2Gi8W9& zo$+iBbC);-qZR_bLevX4NDV@8Aw({4jX&9V(ZByYJ*niOtO*zvuK&zFh!7Ns;PjO>5gU z$1K$NU-T{kmQZC7kFuE+bKE=%7A|cC*P7^!L-3Jf5*FfKLJ6dzbYoiVhYfK5;fs$I zFF&>0R3NOxuB2edAc)ljY&lcO2dZZd3RvSdAP5TA#K-`knWO?c!7TeVkyl2!67T6; zCb-FjDODL=Yni}C<&;-HT8H^7Ufs^pEV^yI3|KNcil)kDyOd`M&9TJ+fCtf$0G|NRdzs|p-wSvPG9=bO zz7T_S|EU?Gz75fD1~Zd5LA1_;uZc?^%8~L?d=!BSObWsFR9T5ZNA<&JLp_c zpIe==fIjId&a$s@#RJL^_CtN$=Gb05NL`>r_bTGd=FDdM3mySr?Fzz%#OK9kr$ZJ0 zi?hQNeuV|V2p@O+?f%$BVtA_>ZBGAkc$(#V?Z=82mndf+}}>> z*`LmZ5l_B7SL_fe2Li;BbhWoYgfD?9w?%<`|M`gmqX$>!O0uk@|Cqu=3HG%F(BXg$ z24K(-k!DDM;(TSqxhtHcy~C5J3?OLwe(^((E2aW87PE{O`}ZN@k-*2tBn}IRIK~9{ z@-VGihm1lm`&CtD^)~dKYl8Nr*BBK$u?q-*kIyaUTGJORFDzBvSV}&mROc+!RxZ^Y zND7uE^|qDvok)J%w$ub$Zsv9OWY&|88l&tiwKy$zTv+bBvD_8E+?})BQ@PyRvD`PZ z{CIBp$>wtZ!SVoXh041!D6=x8vGVkMMdtQcwwd@D*KFP)3;iI{*#+XiGV8C83DUug z%{2@K#9$GlrUon1GOMo@%l|-V2HOsR%pT5NO+lH_W8aEsZ-l&y>a8|0dM9sg6vGAVof+2N z=aC8&vHp^CD(u}&drU%T4X{JdcCC((tkp3x1je3%DbT5HBD0ygIiAwF{WejcIy4rM zqJv4qfH7JG)tZ9w(C*BZ-lY&ze~3TNqwu79dpJv?2K&w-Io5AN+mk3cqv-1m(NPa$?cYca#0XI>B0V{3?#?}|OqQ&#`Ptv;doS>I)Z zB@M*dOgI6s$+D_){`5>VtE-GfsDG^R4)WZYj0^G=8ITSp0G_UKJ; zZkZ7g8qCU{|2{s8N0;3sq=!78yyp%(e;Q zV;dR}YkxuO*I&r2Qq9KjboiBwH(%C0Ze2X4or<++UX(2PF3=7`eVB}k0p+8#$1bF* z6@2@8fg<0GJV&_ok6#?KH=p@(ldbhHo)phS9ygF5J)91|# zVq?y3Q}{lWj&g$V>RD@ab;6Ip9gO{)Mxi_z;O~B$*qoQ3_4=FHYZ;ACvR6}xF)nYP z@+R7JN}iuQ0lZ#M;%Q=6Vs|BWx`L+=@w$PmF>g1sR0u^|0rA{C;%p8KwH`(G6P54F z;8vQT-RVb{I-8FiQ`Aly&N%{PF8~b$#0^pe3mcf7hJSL5-0!U9bLyxqcsQ#V^)$`- zj{HLeU}fBy(A=rV16-ZCVg@4M)=obd6a+=avPBX#F~AfCtTqL*>Lxzm18gvalfa|? zu`BIoON2-um2N;s+kL3&+o#TJ70N-k*-GveYh|}--MXVS_GW1P+kyx9yV95WuLv?@5pGxWWGo3kr*7uvQweCL!(#zk!XLilt2L6ZH3Q=5GJ*h<;&;qTOfUwGS z7=S<&Cd8#&jhqIx9>pf`5ab5bZ4-V+v=|mrSuL0WYMefesTT|=^@)vD&@Mx z5F5{R{pvQOqtb^Y1~K#?U4r0~L*lfj0e64zNNVm%RWmpLt7OD^41x)k7*^@LUHR(J zVt3}ok<#{@a(GQF0uRLzrWN@2ROG@6G43+2cU4{XGy?Wc-`vwo+|$b2)2`mr>DtqM zwx>70cjm+1*^5eY8DUn321M>=7>%;@s0e2hIxduPal*m(Vuk!64 zI{YMRJDt+vPYpRI_tRJZ+-^LnmjvFS#6Wjyv;hKHsCIlv8kSrAiI$ z{l`9ETESW7#8b_LL4}5=LZm;(>kVuF73XsRfJtPGJ^`Bl z$x_-ek$k|@u4jQAb% z$y!YiOZ4&_&Hdb>{_K>p@1KB2eA{hJufO>IdHL(_IY;i(Az8M%UAgZY5}kQI#FOs7 zX%l3=v@Lom^$5UmGfv9c>n)cW>1w~DqQAl3j{W*M{^8DYT6W2`l!tGk@6I2*3i!9h z|K!>cU$bk^YyJ*_zc1x$FY{0Gvn<}Nymp5a`TENJsM^GQj;U(-HDVBq(0vWjdoB7c zKmE$t?kgVrck|{i^j}LEu(_MaapS`;I-LmtfSI^X2JWDT;#l}qgSK}hhDls<_6>nQ zBu7()6xo$Y1Vgw9*ejpYTOtAAw*jCCbn~X=84u{AZL~MKP!c+muLUNcNFW)ODhVw) z4kRf5IZ|-p^`>S1$s300VQ68LajrXWdkK1p+CZe~IQ8x>5c3<~?AL37c{j(pD5h*fLr(=9EM(a3p_6 z5`vYnJWO9J#qa$C$>sxbwUvf=FGpp9zJTx+M}tqYfoV63JSUNiv0zlF9OQ z-I6Jay@!&iD!o-=ICZZ5Q3wam$P@=_{u~*wO9dMmo_;P+2pAu0;e`w-!Sekakj=}7{(J#r@lqTya)K(To zDb&^0^(xdis!D?!T85SuaM>0g6(03`>OIl)G6-}x~HBTEZsiU z-^)yhM{qx;nR)=~Qv}zbBo(L!IGm*t$EF43aq%~gGz|cTG6WHTY)3IDB>)EKf`gW4 zMvV9@wh781ZOT{TnX~4^?>1)Nudy7h_EP)vW3^YMnXw>oN9+*Q`V!I`EW{ZeOa#)f zfU-N|4mTJF5diX_%!r+^DMMD8y--Fw)>I~WBAYBG;@ z*Z(50VBXf)+*9wO#GFEYMQg1mo#@wkpQih-kd1_dCSpy95(IG#EPzEoQg`x%LNNXZ z*mDrnkykdW5eV)J!Ve*lD%6N&m4T~MH1MSL6(fCU-Y)>vysk;(7PL8hKYn6BZ*NkU z{&(Hvp)YweNL~flR0$f&<%eu%kS*caC4~KHHfciv=N1iJFE9-c0kDB$UfMY^}u{KA0*#ohREj zxPpBF7#hUf8jg7~2Oxru9$>H0W1;AYHBQZs@91a@ig}a@F{zm@QHYmNuw#ib(UauL zsu`A1opwY50GMXq1M;u|Bn7aejQOh5ipI*?vUJ|+83AmRfwmT)3e@D14_eSZ|7S$< z_KndNF!SLf#b{-(F$Z`ji3i~mHK;h4A21>IWB1tuGXne+9>jr1qbzr*V7_iJ6UXkT z)=N9|_3l9ibUs;l1#K7QZpdUN0SJI8oLp!sf{Y^SM0uy*`6~tNOpTeE?5b>M*mEXE zK9=Qb%OBN~Rn4lMU`wMw08E_3HWN^OJjlsIi$OtKVeES5Tw;goa|^z`7ukVA2`H8Y zPDao{f4y1VX{)$}{N`>1jS~|1{Hq95KnJk_3ipdgez8Y!>~I7Bf+hr=cld?(vFJbn z602%0>h@`4biV_5Cl?zd)X*AvSs)H;pcM;y9izwu!y51}P1Wjc>A^CRqr7z{F1&89 zI{if6Cai8I9zkQ1CqW>QJETkOXhZ*+&`TNO`r9Pj6r}r>5wG6KO#_ngz0SxtqFY6fZl} zFU_^`1xzQ!A~zhKs4GkGK$wl$qp2}A@^O%L_Y|nA3aXRpeDw&POZ8ui(&Usoz9FlvmsyK94|S0d8*r z5NG7gVemPyp8yhgSHO_m-aiHCs1RfywDtp9#uA9wgq$iIn63*n6XUG>6BHLJvHLQY zDnAVQEG%LnQwXPz;3txoY;#0NadcQwIZT8GG}eqRjwlEOo&p>yvocxMJOY4A%d!P4NKGS?7Y9^ z-=qOUl4HW6o6%h?P(4lnxK)TGDvU8q)!y_|Mn{vP-;w@0b3HFvKEKFi=H-An24e)T z8SD&cMeA)|`k8w+=c47PWA1ojLu#oADt zq17L$3@gUyNi#!LGs&PaDe>Cp!M;17CSJ*kWwFl;by@kLbU4V}zmssY?d>m5!E@sl9~1BCZAhIu8h7a5%^lF& zQfoSzWTd}K=z80Rr+!ao_3u~dpZVm_^n0$Y|KQQRGhh5p{aKvp|Jgb4l9>5|4IzC9pMWTR-bVLT;lo4+K zLFQnF%2uSqr_T4!sSc?J;Tg@|&-f zaGBCD;D3>i{xhsd0z4QdNFaD=QyF?NuNqEV5En3EC#q74$>5Sj5R|ktdBA|oIWAcZ z_#}ubJ8s91=f%)F*0_62d{sm#&WAL#tkFMaBZCo?VG9&ygylINVWq?{ z{tMy=tT+J+y~^%5GIbvBh@5=qWmJZ>k`%Jy1&nyUZ`_xEo>!zUDfw1XX{$`>XR4%c zg5q;8zmS)}#+>H?ugpd4AArh=N`q}MGT8uEoUZ|D)J??Mx0u(9QU-)OtJDGB%zUH% znHjF-zHGx%{YhK~@01=%>2{Xu=34%)eeeIb45znF$jQ59w+@$<3Mn#T#FX5-N7N&R z!;I&{zrx%D-=E=gjZ`E=B}wIV&*KahwOJ$$rrzsbtT4GIZOUcI+395*h;=d(%t;cI ze+%WMe=FxXC=UVry^tH3)&*ESK`*kjM?M4631Vs(%)m)IDKA=udSs7R{8Nn6i;%XL zt+ZF#tl^QkvSB1N9N(&F>`)=CpBtwyW{SP`@~2&SqmLVYnBN_{>D5q(RbH+i5dzG3 zau$|s<0^AM8riAF{ZOeq|5nCxOQuMx@^{8)_=bOEchRj1{~?T&b7w`*SJQh&)O$Qo zjsCLHBVqZd6>Pi5@GN=46hDmmkZ&m4iWp1DD7Fkf4%};9d=eO+@!jL zF8=|i?Af4I5`M8d;+ovei0YengW>l z%IM@065rhtK`;_|k9`=4wBpvAI1il;z5&j;GkWFn$j;`)wf(K=vzR!O?GBg&4JSGQ z&1jQ|W!_0-&L^;BV4;*4NhDQy!oJK+-%==IB@~azqv-@662<>Nn(q3q$*}z!__<^owEhm{LNQZ0wIpWX`?S8jA`Udj) zva^G3*Zy;?!*Gvf-|oth?|#Ypw^W?Ckn;0Z80i*|r;RvZ+L}B;JrnXL4nF2XSAEA?%om}uc=;B@}twDT9>YAnlfoe3VA$y{7pEUfNXyrfV)uzCP^(& zB6l=}Js%uif=dI)qJl!vo4PuY`L>qAVHbr?tHYNZH+I-R6ul&jzpG0OY#hl^T(}m| z&a-~u9Lw2?Tf}I-zlxIQD&{=?qx+d@jt9Jk(qG?2Jcr8Pcq0#-Nut<9IKB5+Ap|~8 zk}ZU?gww64oQVz}XMOIJmM+{3ikP+ic+utL(9@*_ONBA_+Y32LAFkcK2WqZ9;s87I z(XSDo-VEn;D9K_>s>H;+)D!d31NS&gnkOQgr+USReE`DTolo2qG+ImL&)5C5Y$EqU zb90uF7&hQ{H|x4f>Fc*;dbeNLhNoP=`{R=G!QE%BtJkZtUwM>VC#DP1s_wZv))0r` z$L8T+c;JLKHwfs3)e~9PQC}`W^#=#dlTG3*aQ(Vr@1AAZ9NQjHiYoQ~+>haCH)yOR z4}a?z`SyKtNLOVrRhi{%GmEHI@b|K_?SsrYaaWNFlHfH8p^ttLJEcA30jI~R51m4p zusgGGT&`zKi+X~z=)Cz8dJzNXZ^MZzHbh|w>vWu$)5!STslRkf``Opbf z-iPQJ)v-B?*QEH}=&ASF>lX7X={atLu*0@nu* z2;+;Y=#LgrhU$HL89b+&7@wLWrd3R)Ra{w3LaSB6P)*XjRnksP%C%MMgqn14t8|o_ z%-L3%%W8zQRzh)*xAXwCna1g8J))by{ zih-!Qk<5N^(_5wfRNxFf(w6d9PTkbC-SjGIfA?#66M#9R_@jxYy)hB%d!~%yc1!Ly zvtT5LtGOZHz+qJ4G@$HNsvnzcKlU(PZ@bnsfGV_q?0DY(F_sQ{P7MdX4hK;UN0|;L z@ad%0;bf@cY~JB)r*Yi1P>) zggep@cTN4r%iir==-82Ndeb8D1PNp*?_l(Hgid0Nq=vy%<4>8`L8SjDHl41jQ z-^j7EnF#F_NRDgXc4pwAtm5zg&mPfCWdb9-AOt|zlGTA15frxy^0J9t}jLo%Rryakn%ML~l;aUy8N42amok+vvoaFR6n2*HGSc$UPPPBhx2 z19LzBKmqW>Iix4uB~V&2=EV9AuJ zh@(b$BT1eCRMSIZGEw~2(ZL&T{BfMI5aK2PTnRIO7_mg|^@q%+C2M~gGM2_7=#0w2 zgY`UDKrHA>x$%n3o`A)0nW&%q&ZSR8Mv_@7kA11FdSrfqG|wFy*b90nor_T@Nz(8n zK=1Sl(CkgA#5BHv;OD2F!iW!Hl<AmKS78pr~Gx0oQ_`cPV}w^a7WC)}6MjLw(3 z!hcOnd^cb8waIwfVDm>Ypk(Zo zljsM_TqR{IDd+*3lsDK9yAe+lrI;EBvbDxf$j$f{&1B#|D4+@$tW-4-UrlkLXGe`H9SY zJ`&P}S+iLuN$~PXM3)zvLwpF6rD|5NKVj?EAD(=W5Wg zGOd{Rv)xyN`}o*^+c1oXCvjord?d9kFxF7qNqj+U(4k&^F8t|(mV#qkMWM)jvQDdH zPO@%atiz}T8%bRY5dErRXNrr?68C2x7Dt_Uav8$Ht5*{3+n9jmUBd z#Tl7CFLZ!eCG#{>`l=yDj<*f;D}JrKB>97qh<$GBT16S0JFYqj*(fAP${2Xj_>3dT zL+z|mGTx&LeusJ6C6~s@!RL&D6%_qDpgn-$Z0vgx0^yUrEMi&qeQ4RH$v#%qG5daY zovlgZ5|^;g9rK;?oA{zwiFB>EC#^rEK?Lz3kaZ8qdK`yW-+I5W>_ZOC&msOXHD7%C zd;z?P88wiVq!X&{x`;ziC6P^0l;4DDJD6+^*-r}Ms=I;_8Bv%SJ2GYCG_J7_J~OVh zlI1j^!}!qjwN>Vp|G36{0PA#Tk=`UbC9SJbm7O~WP_Wn#IFVDy(W5G9bE~OPTC`0* zKY2S>(8dW~% zSlbL`7B5)@GJrP6lHg$L{;tS9a^YREZ;t!>($McaZ}OncvXt_e#nRwJ#w9l*%e6NL z>e<(F?w(s9n2q?|lNGTLq*UMJ9YeVkO?Z5|)4l!b)4g5}&#jgbrNynbDO=Ca9Sf0* zpYN~acy4!pxVyOhaCgG<%cGy$i(j5VIKBRFrGKX%XXmv$C=j)@J0zCtwKpPrZ)tB- z^|{yAah)$qU!RjWz4xaqm0$1AIM{iAd*L4S`rDjuuJ`wa(0i}HFUCCg{_*jYdn|MCT>N*gmbD<7D7|qi_uodv6|Kh`#now*7fPNEbtinS z`B8cBZ6WII-ybWvC#t@Bzk*QkYP&`?xJj(xpVFXc$C!xyP^w_Ka2L!=To)^dwg><2d9s8SIdEWazlIzHEi6p2nz znO$a&DKQq_&P!9_W)%6$>87=I7xdfLrBq8Tk45eo|Np-8ftLRbN@2o^aAp*tIAA@c$* zdDz40rset0b-VNDrq0;zR8RVkXv@eNTU~d$q5tiJ9aYeowrc7P)fN;u>5nw$cV^wl zM3DqviKkb?kt#+RoT(q^w<}FRtXmNBaeV=|)Gf47e6q@Q99lBLv&+!)a_ZrrcHJd@iE^ zxSYYb-;v~VOyZJg&xam9sBEIzqEH0S?cHn082cLmb zAwq-F^K%)x%lI4GBbz;8QhzZd0j1Ir@$$VI)r!z#Q4egPDEbQ*aipk4w#<7yL0RqP zwCk%#5Pax{Pf6|CqPwolktM|w;lrWcU#`zR`hL1bBoAt&z04K=>sw2HMR=fc*}|EV z|Fu{_2-}O!Gabg0;So_~i?6?bzi%x8jmh;~5<&dvo~npEeXs2G=QBSZt}uk7&OI-C z^R4s8quq+Ai(ks#{{8;r2}C5C%2~dQ(2DQfDE(Aqe=q%BPDY>g98hrs#c0cZSvol~ z!^unP@V$7O)=5gVhtS&lOCy6vD)W#{{Nd4?iaS!I4Ba_#Q(TI zRDnMke8FbS_6$w&pMf*|AzFI}QxjGBwc(fyBls?Ap;vzH!gjcGW6pzf7`UntCq-q8B!%aeixrUoXQ$!Mh0F~`~xyKs*jb~GxgmZ>M9PE!D=LO z0=XUN5v;UXG|kFhikEbkYxSqgDqOXh270-C{7^pfVq_Hrw;wRVg78Txy*#KQ7NMac zR!_b)uZ%8=Mwd3rKq;l==4=&jRAW=G=H;>sAuleG*J1 z?~j7m%iDL}$ldMC#P>WK$a0t>94qk2e5u63s;z=(%r)(TBnfj)fFyQ?grSL_ z8q7u|A#74;g|3~Gr{0iZ2Gm(`G68J_b(2$*agtKMI?FtSV`zYbLNIPt=sh`$>vG+6k#|3mDW(pi&t5FP2>zQB$)7GjhlTukt_e?fmn-r`I6k|`t zbNK>kDt>-O|M;pwL^S~d4BlNe@a;2%kPSXv#cR@~@9gQXogzZoxkB>ry5t6~YHkBt zB05g$!0D(V2iSL#Qs5yv&|q#=I+pDw$M)wUKkM{f#Yfu=sZ_CnW&0c=;H`03szyaN zY5F){aSR{y$YPgZ*T2~KWRLaKNv7itoISpv0`TreRan%j#npW$=VMky>Kh_}(U`al z>C3RJ;IZ=Uv;G0If#4~&RH>6+F=cT!r&1uV*x0mbn}E#2ZDey}cC|GQbjGc3s$1pn zTfNw~MjLVYF^eMJncy@W4t<-hoSA?|Ok$4R#M8Xryi;~Cf{oEn_L1E{@qXGjK5B&zy5cBl4gMEnE=bqfMeeS95e%u zp9ysD4D|jU=&KnNcqS;cGbrMFP>klOg5Y!CVQ{9W$)6-eWnta=gz&hhxgX3@nG@o^ z7J^^{@k(MnM2;<+N*D2ye`UlbzB#=PPq0s9Rri&$Ph27UZJJE142Q8wPlU$Zo{nvK zAGsam*j)|loDl<MygUd z8(+-P$W_gK9DxK=i&?py7BjB6si!6VhZvzqi7G^=EI4o z$AYo+`4ZW~C@zlo%@|ea>Btm(4K>gh3P3D)mFSW(-Wq;x^|2$Q! zYwPaz7MCB~24Hz1(AH3?;j=sZxhX9JDZWM*nUOo$k{!XQ&uX)f$H3L+e%i&7IlXi# zesDI%C`7p7VmQE^gmF|$Kv#^IkrEuhXB5Y0@U}62(_AsP_~^~r@N5SZc6I_Asv}8c z(Tgxu?vnZ!%IUWcfl$)C?QlWwBvTZEZ{O33o4VvGp6=~;`FF9*HGmeUQ*`!okBjHA z=!nrvr0Zz_waOD8bLG-KLXF)|=dOL9#Gg5}`Jy@ny}3WYGNzq^Pox)cCnm_Bb8&S4 zlm5KW9hxIc%yB>W8_=$}8}XQ|q@6xjT$6>gpl3GM55dXlcAx%<$1(uOtp?f$^L*P7`pp}Wx2&({y>*xN@kPyHLXw=|X(~uX zU5MwDluI7o&*Kh~QfpoUJL>>zBLg1_ey2M-wwZR_17&FsV~x&p?xP*qZ5S_*G9%)0 zt`$G})p(VaC6aP299^7Rim+v6WzA$gee1gY>h)GjVD+KU(Nc`IQ@XjPnvn*<083kI zDC$k7sTem-#<;3*iP$F6;Uh(_OY$BlED;e-$1Mh%R)te?|BQyFA?a_g`SIdRDii zjUIL{KD5r~fRJlnsBr^Y+nkCS&VehG*t5I%*f2k{bA;_q9)6nA;a&E`p{16)x+fCb zB+%2#!YZY^)ikK7d&c34N#-q^Ogt1L75xi+6jNyzd(n&rL(;HpV%&epK&`4CkO!>) z4D`E~b0?O|4#v}f)RpO{o&=O;FSmUa!p!~NnWr3cv`QGU+TQP`Rr-yw_$sP|Fsmn@ z1XD^n#{l8rH>SFe6DJ6rZjn`!I(jdAn&b4aP!gy3d< zJ~WYeW|O}9YQ~HUSQX%R{Q9yp<(`DR)KD8A1T2~qbk5V)VSgp$)$Vq2NyRP8a~m;U zEf`BZ`@3Ygd`|Z%2f)Afgf63@s2%$Wo!R9tY%9W*c)X9)<44K-BEXT#`Hal`eX=>; zKRnnfy%4*+7_wH^Du=FKGc;H?S5kCB$lXemvlp?n@{za0Z!8pS#BjYeE7 zX3kNL<)V~am6qqD4;B9ke7wWc+@#esJFO}ZqE=Fp7Ppbc%H!kd2yyrciUFR5%MZ4BljsHgdX^2kMPu+-QDK^t z8Uw@q6dIfTiEr)hB0cWArK}arwiG%YRQ3J~mWx);`h= zgzMNtAFq#Ic%8VAo%!J7^h(zJS-_lr0Pvs*ZvjP-s4xi1#%Tvn0X%4rc5PzPAjwfk zQ_`Yk1_3#wda|8AHo!913Yljlu)Jyl3F1PrEvNMhCR!u$`1sXK`W2`a$`7?XL_u=! zu@QV7$aRqTLQU)@&&R_kabAu)0S&$^=4zu*^3`>}i3)K3ALEZbUHk?fBwp9})Su^L zETp+FhH{O}>$&jzU(v!|jXMi0(ycw#D9G%JJ(F-(Cv#Cc^e(=66f!IBKLi(p)f#Ue z;kZ%0cphp0Gd5`c8if4P#`F8FJKlzNgT^YIpBJRZJMmw2y7%6Vl^wmzq5ok2!)&AH zlN|kr-#;%syujcv=sDP3A1yP?HF)&v+t%X4%bbRf|NPwlwD=^~@X4hg5P0>sF02e9 zpbAC`Es0JB$&{T!V^nk=M8X(?w>m^XH7BAuY)pEQKF3TP(p5j3`(;QQ)FpCBwy4ng z;n`eNsVF!YvX;F&FP<)*Q}PsMz=j=w5rE3D0MOe33}8s*9|5{Mn-Y0Oi9E!sc3iW= z7AWnQK~s6EB$2(q=3oFB)q|TW@FHT7(ol8ZWTq$@{VbV9x@+0#Qv7NPAS^+sd}rl` z@y=i@pM?#O9iL)B6P>~jrSw8hF}$7Mmm=c7li=DQ8ph%TnuGY^y$fEfaJShHbyYd% z^KbJ8Hb@qaoNghVjAv6xq&gsV)^TbB0#;(Yftl~aZj7IMX4>`fnLN-?p@9O<15zH& zP#@dR0vCJup`ec|OaZJx?VC(DYA=LT!!;h%@qs@A1k$H#i)*=bpJW(|aV0964&`Jz z21wDY=st|{Sad&!AzRD>^cucb}9*{HxAQaM!7x zakf^+y@dO!5aBS8FKH8q1}uW1>Tu&jYP719R#_E1jFbO>h(+Xe{d5?XDE5MiIkMq9 z4~73c7MoOt8=%00RKBI+adCK(sOZHr4WTMk|AE5d#W8_NCw=*EF3cUOlEPvUeMD%Vd{!=< zSSo~t+{7lGf`b&{VM$zWSGj4H%27F~XsTKa9omKGM)1}vIPj-bD-|GgZq@3lD_9FA zs0>_Lp47F=@{4ubG$6R@8uv2B!%vq)gouSl1ntpr$LHsrcRFGny zeC-|7a(>cqsJ|V3SF-w942|Q4|J3?YlMZ35-aYb6FDGxIu0#jTyn%>YUgUPiw$O4w{NmObFMvN+F)z<%<0fJPd!i52jkq#*;{g_8*GGWEV1@&H3Bab z+?q)o3|e@nC`#5DWa%i;&8@5BU7cuhTX zVYz+iCU?bc>(P&M<==~H&i)Pa)XH>ft?a1FsM+*Ox&AVJqT{aLou)wLD+^;MJN4}< zCgEi_dA3I++48zr-L#HYWW3@rX*#wNEOgjyc)O!xB11k;779;f+gtA74(my;RQ%#(e&kzHrMKv^v| znD3qPZb{JyUl#flKcu&kIgp_oi5y)~9o2X!%TR8AMOI?~_#d?2d1SbltL z<-W_0w#V6Rsh)ZvW#S&q8ZTE8Ll=EH8yD`=y<fasmB3o!4W1_QO zB~>-2;^-EK%!Rq3_Zl}3Kk~A&`#v>!rlGay;^%dfv;OVJJn>1i;npl^eZZ=lwgl-wvhrf>~Cevm`iY(-x6>R5$eTw##JW#g>+D zUM^Xee-9XRX!kIQRF+b*=3!3*(0?Zzm2~-g$+e`INAs z_oe&!k2!aUN)S&nKM|8Eo`O*bfbcM>)#OPmB`I`SWTlU}<%pF~_%qFG7;SrsW5vhm zPwhf>OwEbMZU&8y7H2pb%KdxDML9f65tkLZt;e>EIDc)UrNf6-Y__`Weleb#9B=6y z|NC`7{?cw%R6<6gK^&k}v2f;7*bq5V9N_}MsT<>foXG278&Lchsh*T_@l4AN@9j~g z-$PTFtv=-k?{5Fl9v%F=8NAWGy%czH;M;b%byCHm;&?|^Ow{hs(>GhvQIFSdaQ@x2 zzWi&J`UjYi#8`bTjNwx-tm-T^6$RK$`Ncr%4mcDCEMbtjmuJUz6BC!l;=GSmd}a%O z8FaYop`Ah7SB1-Gzn`Bo^`mS=$j^BvnO;uhbA!i6u%urO81njFd|^i8?AM_)ugxN% zC@N=q&@4-$7$H$&IR0hYMTIprl^Lu#0D5Gt(|$NXGSY4a4R?S&WF#rRoMARkx}+a> zLv~$=pG!J*%`Z?Uv^F^SZ*dsJB0`#lGTd>wN5+w$>80cvArgN+IyEM%GsV>{^03>f zNZ#ZI^TfcA)Zp~gG9>A}d7wpKYM7?+&gn=}O00IOh{I;G_}P%@cVRze5-_RpPs|)I z)L(c|e5&ENSG!h9r_33VchR9iX`zISs}>nWAsNNm%v;SfCBqpNn;ADynN@_$n--Zh zA(?gQnGN-sjl-FDHZ$*`uCx%Yv{_u~2)S}U{YrQJm50Mu9&KKEg39V8Wc6EQ4TfY5 zrDu)QXN{I*x;a<|_1beF()Ci(R*LM=-<0`q+3;OdAq}!8&RxNn1bj3hmFVnK0Xb+5 zbKaKhktskXL)JrZU-)zHBEW@c7E56Mqa^qD=Haz^p-MV5Xe#^dun+>B!}`J=jzehC zp{!)yRYL9!YMvS?m-|D`PI~^Kb2vV9Hft#Epg#9&eZE>gvpqf=8H*ufUB)&Gl+jmJ zyH%j7&=9i6m;02^`x$Ri5MG1F$7c@n#dt`Np_FD6*8aru5zz2ez=#ep7(wweOM={a z>%IxtOhSot7A_(hPA&2nDN<{JsbS%zd3pZs*U+UxmzxWp?J^w~UX##5iw2?CbA^_& z+;uhJ#3b{84C$yUvrNv)h*%N@B0bA%frTW7 z@*3e$PXx+G_bwq-Ow#eNdB1WvwcIC#8FS`+{z1r^UiR3XH_Dy2<6K#Hsn9Dl=xQkA zjqz~C@_}d!Y?;7Is(7?e(fPAt2@OUwj*pZI?JY1T^%cvO*zcA%j2aZC&*A=LC~~Sm zZ2LVS)VJQm={Nez30x2KIyIk zl!@3x2^MCP@c+G@mFdaIRm zm9H}=_IUW=z5hA5mVVWbVlT;B<;#4mf#=_>+{Kg;v0^HKO2!>KS;5;<1E*HY{ko}d z^*{bLhO1crSFN{P9UtVDUuIQh{w*^r=m&ItoQDwa6e0)%YM<5+K#ikZHrL69;>-q) zk3cIAgIx|JO9$OsNs{HGmh+xG){H&D8|0q~LT=Z7RRg6&Yz-L&maEO9p%Q>abP@p< zgS!H#C>c2HHumZ^!K-dp{o;P~4s`-s2_~CFcz|{^%$WjrH_Mqld1wBY0F2bw$#_oReFrK>hsjzp;qvCMa@?54dzDpp=FY?Tby_CQo%+@g^t0EB<)R2hA6=hK63LYulg$lQ}fr?usv zVr2L-R*R7Q%joN;qTyB1h9rQqho$40x+?|%xYVcW|1!MCRe&d+8%_+GzXFi15BtM# z7$Sg2H}O&t0y`{f4v#nFxdqxD2VcM~%RlCw>VdCRp9RplpILyZ^8zqkE*pi_dkHezxQV)U+fRQckb zdyyNdAi0V!m66Y5O~SfU`IQ`aGpOTUWyAIP6OaqI3q3=Dz2gZhe8efK46jO{!lza> zKHl5*1R3xYSf>*4aCg4)U@!zxAdX~n=@-Lp_|4tl7aSrEtuv?JufJXLXC_dW`T z*Gy%wV_vLjGIyZ72&p$;CF`W>sZ}LaLiDGN^~n*qbeJ{(ntsNbyt@mn#@M3l3En9^ zXV{?zc8v=IL+8t9pRL@g@z;v~3Tc$kg~u$wRP>*U~4PKl9FKMyv$oxk3n-3Qw)dP%Q z#HZ`YnDNG#(FTqAsHTB2Z(|55PI0*7JmxnkW@D;vL!FDfOoU-d%VvekkO`sPap6cw z?mu_laNDjNid^B#SrNFqa(H4zczZ>ZV^vIPRl;^vDsojOXI1v@s{F*N;`XXC$C@fb zY3+#ZnnvWBR?eEv-L<0=Yx>)3h8*i8rFCPU%P|opL>>wz3 zrYnNfywztA3MHaJ>%XfVkI(bGE2YU^hxdL0lQ@>z1Q<<7!@me(4-;ZcB2N-oPP-Rg zp{3wkKEM9=S#$XFn}0amw`&^yxP%YIlnkey?N9VbVV9pDrLjezx%lGG;zoC}3%WEz z;K2#9IW1=g%~-A8jt@Wmam+lTJB*hV4`EyX*#Gk!99IS>Rl;K`(@*lgl>t07)bo?P zP+VD5$=>K2C#FHZG=h*Y+Iun>^ITQTr4+43xd^p4{@h)m7KGDz@>O4XpJVE)bXo-r z0oG-)qM`{bc6-tcA*M0RJGJ}%LwmtOfr~7SR}524+woQYF7XfOsIb^DA3)3SGw_>g zRyTPa;P%lV&>qHYm5IMyrz_LoAou`Is*)sEY2iQ`7U|DuhC~n{aMD3)?!j&fd};IG zYf3Re5}etAYppaMKf#OF#Rk6Wy(hQ9hC{uy#YPz3M2}$czs^DN+m3-Qm(&`ZtgzWu z*u2}SH*e&fy-}z6HI3KzSCld+QK_|tqOLWc)SRn}kpoZO%D^4|44wGn@Q!-?e2x37 zpFwiqyBv5B1z(lHc17VX*fpF!Uw2NfI_ZI=rW|)AC-{y5{mS){&pN2DN-~#^`{y!# z8qOD4VU_c66;Nydu^xcs;S5}~L7Z%Sb-$R}NhF?-ZVt`nlZ&Sj=BL)o^TbSZB;BXi zEemCj-wjy!&+5IZ{;w8?V0NKH{ute^d`uz(&>&Fz%>tQT4lzWAps7c5J{$`21_%VB zzGO>Dsd2Jq-`rgwVO8yNl#ap!&Hxf`uv-&_ar!_y--AolnAeaSE-vyBI4)`=Xi%P zZD!UI20dh=ioZ&kqNsMKDwb(d=30X1g1mN;;AYDIh#&Vg?}7(sAkh)V&S|YK{^8A=%5OG@IXRXIBZj41&e0^~;kX?V zN}@2@2qWLVW5jl3Hrklu=ssh|7;DTEW5Q*vzH7qclwFe%5QkSSDp6&OXI{6 z&j(P%08xUPC>_F1IpVT8oGRky9BV0U=Vyu(rtG2Wc`g;i)}yf6Y(Sx7ixp@fWrtaT z8KFMA|8e^r8j$q#R{)9g1KiFYldBSDlUwQR9FpW^$W>bbGB|AVs%5Bu?~mG)X4l^H zMw!zp$E;Y8ZW1{h&Du$*8MxGb{^JQ1wvoi^#vklOsc?GAOSyN(+$wq6FjgfT6YuA+ zRf$N0$d$C?oxM|zyC@`QpLQ`f{6*uMd6Vaxn|QF#Z9kK#m*ou6>sZOp5&v61EOGTu z3*Ke%D$`Q^vBmiMJm)Ebw&Xk_+$y20GXL!6k?n}s6PJE}`*DH-RJ zF=`f9N6RlG@Y#@I?J+iUFfR_phR{jRa```fMrg~N4tt}nvUBUE^8vx1$6;bQ{g&1M z-4`Z3y&1BWV_4aK(vJ5KCE_j*^GW~~S)_C9{&@+1C}~>7*cH+z@-Tb}Npugq)?HY( z?P+PW=%2^p<^gm(K4rscaUl@4D&BjGhEVZ(2u^l_Y02@3xc=T7(|Xc_AMYg$pUO4p zVyrcrZUOwKI}hIz;DF;qDUCiTy%-Jx{%x)orf~|SCCWuTmww1 zAJmF<&c{qqd;X68cwfM$&MxAyOiAp4KriG?^W~7aXj=pXOko+q9nUYSO9>@rh`Vyx zQ=mf2E{6xo!q}qu(UO)Y0nwL)RO!VikqEA1erqO1M3{Ip9Onh>vluFp99~F*qjs-g zOT8)lSRzUuMPgA0KwFo&`#EwGV@Ju*!=&aSeAgf+iHH5mrM!|wc~|ZV~0LWg{75mp$Oh+;P!^=n((=Pqybeg*Gmi~AQ_~ZeaGVl$LbHU>d4c?$pc#;C$IHxD80Vv|I@c z_qQ`S#(>yUfJ!e84N0thiAVZ%0k*{>X?k=TK5#SNpM4a8O7_)0reb9I`dkgy-6P2c zFbd%|1-exN($6m^hPq5r15%^`w4N%tJd5ha)6u~i<50Vn8l`Xw7E132W0G8k@rjy* zE*N~cF!dR9x%C)=a;lC1HvTa%>e<$c(s25#L?IIL4!fxs$n$;^S8M}-BAcG&E05Pt z>+z6#fvOLOWx|))qX_i8EJ-AULWSvb-MySelL7;jBn0mlD(l`d$}V1sjncej|rfrt<*o>klqJ9{m0L1>5@2`!6rN!OZ zB|#bPZoCGW0u_l4G>n6@2pwDxee@?#CCz=zU;0$(ctVi+(0Uz$+N2?6t%OopW+jE( z=1}>af?*@Ft>&A+`SFk=%j)A}Ue#>z6o@EK01lT<2mI`q%JHw(ZQe5ftxO_?AVVRX z92YTy7+1hRS|x!$Nf2h73^mII5cm}zS&b^zl2kf6=m2MAA@;(B{ORGUUhv+7>z#lG z0C~K85`{;wsi;>U-Ah9e5+PRDdpu*qpCI3UKBsc*P>fd-Pt2UlSE)~Ao1~?PJtARo zn-usj%GRVCU^Zftc$T1%I#-USe~SF^u=iQi*+$um-~gZw$SJ%Bo-f-wJK`~|pONdj zFF?GL`L)+uCcjCG6cK^$@$BvIv`@pfk)WP9+T{}3~F|7crxu0pXvc9AwOd5 zy@Vw=6E<&h+Z8!^hzasTGc^^Y1F-)2dxDJDq+pG9MIXG7z;y0jE= z;v^F2@5s5vkA}(%NX*nY{hi65$(;7F*l6@e7i;rC+Fp@oijt z<0FZiEa*>mdq|Nny^n2m7e7Z_zOc06^W)*Yw=hQ{ip8t%eNWwARwYtGC^O_g9DM0( z1tVe8{KT)Bw-;fzu@R)jzQ zI`jEe4(nlsO+=Z+A-DT`nMLGc&KbPww?*LSD5pL=4~dXvBwKDIw?x<9q@2EOgzZg) zfS;(lGYfBj}0xOXEe~(f3&?w3T`BAVvJuh z)+z55$ub`JEkkNDRJt+6_BjPrD0m7~jv@l+RKa0@pM68 z=K>!{`6DB-Kj{6(G~H$}t;skut2fQrST)NcN66&3o`rFMalyVt-q@gbvaw;iMT)vv zNtR`4x#jh6>45*E14VQ>pA*tu-KbUFf&vOCPC7-KkR+oGyN}A5j;BHjG)r%fDkJ^Rzcj=jso%@d{jD^n{_rPri$1Dc22CJH^eR>A3m)ksRvKj3eEABQ@ z(uRpN^3vj19U)A@R};iTPzPE0`#_hF-Vxtud=8=xD1s0mB#VlcO`q%`DtR$^RS5H* zN(F)uR^xsll=ZTicalfqeuAa9y5%Ev3)S!u4;#y(*@5H$OPN2z!{wuo6l^{u*rx5< z9vQPP3b$zVvl&Sq-5xXB^qTn4Wbtvp=4ZLxuO_?Sdinpe2np#5D&_Aj%M&RSF8o~! z6^;A*6w8J}1X1|K0yG0cVPrx;maNbU&i?h17@TRXcA3y{g7@))UQ133b*TBw{{d7(N7pt3$Vd|9uVyy38(aa)U(MS z=p9raYj1Lp37q)diqxth3RnNqY^HwVh}v_C>_d8fx(XtGC$6Si((Z@ zGbxZbSzv#gUVGf?Cfm}n|M;u_X^|7V?^cBylmzKBdQvq-JY#urQ?Bh(QrR|rg=3js zMtsiCKW~lF^&GdFCbD`QcEbmkr~8HV?X204cbAjwzfCbKP=*3t*oWCFRvh=ZbKJAW zE}$HWj;1nhPysHFi+qSev`;p$f2N^0pgB&hAmi2g8Y1PWx*fG=akTbTqJe&jQC^}- zyG+k;osotEQoIhkHN3G;GVidq$)0@@M*1u?b|5)-`n0R`#ZhyqRUOXEP7!bkI(OV-JS7A9G)YT-8d3Pyr~ zwwYe{?)A?dcv&Z2bPPZ|6&*KC7x zbVk}CV4F_Wn$$L2>niY|{#kZo?6_%rA4!09<}12~Ke(5@*4g++mNwj`(yneZqkey9 z{(1zyGe!Hmkef@PqeX<5(`Q%F~0lfsun_B3!)l70W;-s_pOUaV!L-?!e+ufVjH3bKTt`|rH= z;SzuLy#N-9FF}GxXkm0oFr%gWN~HgUSrbW2WEP3NoW#*W;(S6vjgz<*N!;5co&yq^ z+Z!X{jaBpJHS*@O^XB*T76|tiO!OAY@)j=l_P*?;dL!>>ce2co!Hpf*2+bSE?IR_@ z;OO*L5my7}Kw)H(?cAXod*nhXAH{MXr547%mX8XY!wh((V#cn}<)hB+t0A$nyJ8;U zUK%N80jOKd*bZI@wYV>88Taq)t6L5)Q|PR-Id&;o3kPC}^VNAA2hxvu2(S|X*@mVc zC1atZmVOMGtij^16?8OP{A`~1*{W&5kB-z_J4D5Gs|j(}QLP)qkR4_``sR+)13pj` zAl3~k5t2l^!Oy%IbqeWiGP+Dww+n!)*xccqLZW<>S+{K*F!%SicK&BQ{YzBr`UAO~ z7`ansP_RB%bU617j66Y|O_mwB{DL6kpPVP1p)Q=SDW&TVDhngoou#@|y!~Ud0^-U) z>`OV&NJP+5Jd08`RaTt&KuCr#xvXe!cXF-y>?9KPL1r#*X}^SqK~=Gnd2&jRZy*!w zZmJS9Q8@&^+JNkXz#LD)!|P69@vFlj9U{yl^A!QqvgLJlP1Tqqx zzzG?-%xco3cRAd_l@h^KS(qb-uj_g=mMOgmw*DBrHYxYR-{CX8WSdbDRCH-XK0}S1 zHK%m#+)Ra9@Lh=zX1iJlm)>T-syc{vt?hbsQNAJj`05o;7!R?rS~#l@T@eE%N5C4#ARg@V1u{?aUCH&Kq@U8Li&x_&P+u>gh!gshMzDh*w zszrP=iui69@xwFXXL!V~#E8ADFG*HV;5>p9iZNQiy4uV4Gi1bImTO&E2MluX;u>f+rKvlK4Rm<{Kt4WJQ*o~zBLw(ht zQC78ndOvqAnj~540&$;^2~A%`U((g)V9S2(`F^kI(RQdq=kUho$}U0J6;8nKU9H5e z*P?+|*r<>YcN!U)QCxmoVclul>JFWwc_aPMOOAvGgkchBj|E08*Y0mQNWTx0$v&@F zah@wK$^5~gKbGQl>9w<9WhBDnIO!$L`+c;paSZ$R_q_GB${g+cNM}VUXFv!}i^ZuLZ<*c0 zg~wM4?IHz}qm|#c$dN&rrRPI9Zum45t}i&KI$pdIo1Pt;7MCPI>pGTBUJU+u3j-9tP{r+@ z05(*v7>6EksN$f&;ve-TrSyV|t2bT}errN(>kn0&^m_JvfR>Q!6OenW)g*%%N3-{j zHHKOSQYe|7*O{Tu;DCWBVEC#dYwuU+ovmEGB)h+zS#9z5&j8{pf-PAms9J}qWB;zT z`4i3fQm6eTY#ihmt>-!G!0|I(8wuQYI=Y;opBD$-F$llQ1cnFm)*5m2twf zeZp(6gqeth*((Wi*$ML%2@BcY{KP#DSMnNf2B#$im-i720hT2bv&fX?2;eDi#)@EK zmdgQRPsDf*qTWX4g#jPZ5B&F^vO43iX;MwM;DIoZ)dHLt#Fis$8Cl?zy3z%u*NvxIeO@$PP@Zk^yky<$#C!ER+aU{@m7XuTzcu{5CKv8v z3qeJ0yEKQj83;&;?Pxj%3ATD-lD`NDq_1+~6j^gM-Li|VKF_nHphDh|32CH&(vd{N zi9;mn6$Dyn51%TmuNsd0N0VOT7B|L5nIm6xqojF|@q zOsEjcxx>29C~VTjB%(2jMz!l#6skNKJ)ANrA%v8n;EZ`L&mGUKJh!2maKyCx3Ca%qb{ZXvY{g ztXVLdwU0`0MeRULXBg=iDaWD7q--GiZU({A?~IIeDG-(63i)rdJdtBfc@u)}11Q~` ztvzg$!OAxVByOsh<55c-T?>xWVWF%#rbDdJ% zkT*o7eQHyrV@&Ind&i3-D`g$y2H)Oxyfik5e#R9T7^x_Mo!Cj@Fmzu{gDf-+^PpGMZl;}?H1zvccKvYZxNG*h*NKy_#bAng{yVkSA zCSw92KjU)7NqvU{Wu#|Y%Ecz>AM5Xo|Cu{mp_;pR`S0~yyjRcHy}JCtnE1^*P&5S| zbGgbioOYEP_=s#6>zcCF%F+eqcsdgXx@$}&D zx9ohN+^v$8gB@aVo5sK#jSV2Bpju#LCeAPHQ&3WwXFov^*Cbk%&#_VoN$E&QSxEN2kA5nvmH6G|ZJl zmpO0H$v9>lH^41K7hz0*DrFSp@kT0P5tn>ajLOx{foGGUlj9P|SAiXAA&_Rm9p7ee zZ<;QsPSgjGx#>`KhQOn}0mWStUJ{{CxJ`XP$y4L%+fgTw&9M*94Wy@aN(cd{IeUfHDm6)ueP0)x_mFA5jHW*V#Bpo<40R%5?C5>Ov?TinG9?ZC{D1X;d*3b#&uAJBz65uC^?6@i9w>(Hr@ z5`JZChVlRsO%cJFas;>>7aR_u6sUS%i!AH9 z$$8=#pScDZyK$oxIUnMsk<`qGqTW@AYa+;*Q2D7eXq?h30B17@s#K!TZO0U?dnsHB z>hZC>=`g-MiWtfdYD(N7ECLi3N5E;JfDMI9pJ`zcn&+4|(n;(gF8wi4&$QECUjqN0*DuJvs_yw&Py&2`;I)>y>%$z zQ^@OXd@Vtp@#r*+@clI?vGAO%x`3Glurvt4 zXy!&_df%YCyfBeCcM&A6Q=;h@SGyr*q3YHLW2pW_l7x08XIS8$?-!^{{-OV<0F(mI z+MP@gf=$8jhD0Dx!Bk`_zJUWmDrSr8LoDv3LY(&|%!0mGYhXT7n%4N(g8H}6OE73% zFYJ*l4A~_XLj4zyOWZLFCq}X%6_n>7!ZCNVZ;9e9S3!+EdO?P`UH~U`257rS!C;RA ztnqU(_i-s7UW)G`8R|rACp>He-z`^qNa|jknN~$R-V}L_9Qx66>H1p{bppuRpD(0^ z)dg9kEq?U;#cF;+0IZ=jk>gkQ=>7w?JrZCNOF!H!xk#%89!D zj^kt(<{ewo#XFxoZ~{x@*CuFqiH+2kOBRn_&l=@MK$mzhL>N?V4@B?ua;R=-JOU@E zY6Kb--S%-!>*;R_o%G40&hgEAiHob7aKj~&ttHMYdvheuZ)I1KanchYd*pvHQ^JDG zU$6=H9}YF0X+)-Tn(Y>_GA-8*{ayXG_>2C5_Ga1cd|R^dKZd07@6m{ZZx-+hHHW9Q zs=y{w;TmI-PrDDQZqkc*FUeG~>gS%U;N2U2Z;hiX7``?6M~CPVPw3Ji(?ixOBq#*< z7uRoMxMYSRfn8L=J-~dA0BPw*4S{!b&DiWGoQ%Y2UB{BFzqK2oN! z1h(j22_%_!p+G^{mA6RavPiqP=)+~vpVyE>%VHzmQS@bThPTA#vc#^p z#kqc%rPVN*e}n73dZk#c zb(ovFkZRS62n$LT!JGH27)an#wxrb)7u?OP`-{Ro>3>pou#AH0>PAM2lmh-IF2Kny9N35ozHPg=14e`akB zYN>z3WGAzhI!5UJA2^dvzU6Jk?Po3LYwM5K4#w*rtSHaa7#iX2wpY}i_!+Jen3Q z#)s>yxSm>xVpN>b35ZO>`&xg9b_}@S_<@&}1ME?xLj_Jb5MXms0aes`Ob!?~g69W0 z&MpLdN}c<|lnq^%@&2>sHC|`8xfWt7f8vjSsQ!mD3$^x1tCpK}_ByME<~5gU{nRI` zZPgU4-999n22!mRlp5a?48d#vcz97svGD;2l34(U)0ttc>gVa1P!kv#;98<5T|XQ0 zTt4jKhTG3Nn{frQro7vMzpGMxc&Y65?G4h5pZ)s!c|_egfxs-yz>w|wqjDdva5Q+^ z1+v`z0>=jFr23Tc8K$lY383F-sDhYFpbvXQmQCm$*w2Hr3YuCd;%S(j2i z3L^cOrNYidhDofrYrq+}(ABJ$Nrxe9bCM#aK?Ys2hg()GM(S=&`8TbfJ)^dHhf!P2 zXuQ68yX>J{3q+ADr(`SLaBUGyauIBPLb zef-W7h)TZ1$19s5PZk@W)+$Hpd}`MWeWt(lZ07Cla+43C6V_zKLnq7v9B;k$_LuN=)Z?=bjdbpj?&#(#ote{WtA@##$OnjUF3l47JY^e~Iva#A}_W8;7SLujdr3i9; z^=wv{;zM#;6^zBlYt@W~X{WWW^AHA@D_VSjdfYDiJyW6+=M;2og zO{oBTY%loP1T#@b-~;)@2*T5Vl}eklqb!>gh#sSq@U;}uphn%tAm)1`7KB1@TPeQN#vZ^F=YB+dkd>=!%46fV(~^RuokVs-0A z1XsezY$SqMK`*bZ%HOT)|Iw}$Iw>H@)&HfK>&8$!p__Ya zh`amtxvxV}5%W<30WU@0l3$ZqbXUL3M!T@n`NLhaJ6`V`i%jxm`#|pY(f?Yn2R+^NRp=_VHn>BK$4qk+4)+6|8!^#wr({iO0IYxvOcU}Zd^Hq{ z0YCRMd(q1%Ko~_8rj=Ov?s9_U)JC?<#*G(obj}kFky1A-9s^K-3||HR19?wGXFTse zF2#GM=Ylp@za@{Et1|zo>Q1n+(*_zt;{5rHgAO4AHy<{XFiw`{y(Wm|m~-~S%cAWg z0Ak%Yvuld%Zz&#h(D>Alo1fcF!i8c9m{fFOyl}3rjgDM|KPf86R4nG^f|yrFQIz-$ zXR(Q!Q#&X6s|Q682&JHrzar%&t>;cgauxY7e|j8p4tpf%)9}-Zhbr**@DHw^7kn?q z*eEuX2G`q}QS`d%sHWCu#Y%`j&D?c<88WX*fA3X{@Dm}hzL0h4{20XTQz9$|tynCs z;`{AWKjfi=hH)Luitpt&T-cYo!qe{Z_RO1vns5_hsi#G(iSyLE$CK@0o}&>%5_^f9 zW^s}*$-p8G`Qn(Hdl}VxK1p}#uHC7N6$4^F)toE^+(iIBim>~zxaGyOc{=)>KP+tf zkG*nb1=H8Rd&Tbhldn(%v z-|FH8=vOa=*e<JoZA&$4U>_(5*niB0n4PUohfJe8`8zjeP^eTtJz`k+&CsC!rAp>2)CY}_p~ zg+IHw;^&`5{(9`$A6f%Q>C$Bld+k=6pLbjyee`ei7{_1)o*0=V z?2<>wkrLK%f;#uEvNQX(Hu{(P{!Q>EOo|>=oRkum`#!0a@XBES)v<(WoBe60gx6>G zU;8G^gzV3pPnf;5KbxE|cXfX*KVkmn{(N=9!l!Fvf>mPL1n4!0JeL`CqXj#?@MdNI z;Sgxvvkz&rdo!|bVbp4^-?|`ru#A5~%}M#(($5%Gd!r^TNqorO2|SH%h_Rw0SU$ST zJCD#|oMo@s1|3jHf<=;X8)|RueBZY3hc14+BbT@}da$*U275sLJlo&HCM|ib4QV;H zR&=^0&E!1@Y+Ner#8MogJcvrW0&8z!4Ijb9Itm52ZlI`VAdDXyof6eD7GVtgpY5rnaBVIfFu z-5ioBg`Hi*uYSkdgvu$ZUy!cO=*?u)i}}8X@w3duTNP@@Vb5CMP5StIu)Adt_w)O2-aumIu?&I3@q9s!w{1#vF8tvOc5ZNLICU?ce^nGPK#(6sLG$T& zd2{;j3HYm?L2*8~=F5(del=QNJH@Xs-hJxf0;Slj%yib3HM|MhcUG&XXX z`7A^5NTOKWxwX-fBNq?E;-f#lYB+sbacK~c1?;#l9h{E-bsf&99)k* zqwc*&ks3LKyi$E(U+On%hexVo6on4#7-zjF?Jwr}eY97OXHK+mYqNjsy1r}ERQ*Tb z+2_aq7T@snqmPT__G3>NVg~q5y5|lEcwELj7ji97Hjo`TCdI8ETJJ+v?Y=Wf*&c`D zjsjij08Av3{<(_l=+=bMVlk|#@9owlNAs0EGz7$BbC%%X;gvBh7PY7bOxYUjm?W#u z$vjcMkbmy()AgHyBPv$GjxUY&|M5-`;Nk@nrd&t)Ce8R$q5#NX$6W*Y`U&4mrUOD@ z*s-9vB0s^+0B*W(>Aw-J$)8 z=yamxi0%e{T>pdng|5F<)UanRw{I0L1UEkxcoTZ>UE!PX$NN9=5A=m;l;n10K{8xz zE&MHFgmWzmny@!LX|9XptVW$Yq2uL$ds^L#^Y?ebx0N_NF^3Cb3Z19uPS9qxuE;i5 zv#mY!CbR9Sj^QcQJ+Gc6a7vW0iW-cB*9uO0maG+el-sFkXIieX?xuBFun)oI$a={m zL(Q*^7ez3jWMS+)GzkZTcw?C2us|4~1{q?2 z{Q9v=6eycsa#$BeNQWYYq|*?&d`>_50Ls4}m>sO(b-mv++uv^uQ$nwg(cgLnl;5g}<{ zHPSJI1Sqn>|(A}j=3J>ydp9`XMW@fCM&97MeL)Cg~1{wJ8pVK;`f||@qvSx zpk)#?SlZI`$yWlYjSlCQE^#7*V4c;fw6{DNp^%rm_{ma0gbc~5Sfo_i8eML&Rjt%aNZt@kS z4<{lszagZ5`|A#}11iM;O)iHHnC-BUyGQ`Y1p+@a?31Tioj^pW`1iP%iO}6>8N5n z1ksu2^kAnmPVZfieVtq`n=Oe$BH1LvLt%zG}JetN*)Mv?WEl*6f6(Q&{X96^yxXWamB z^Ln##lM3JoaEXQx29gArJ&`np95OFU1Yy^OK)wm};=IX_vz6?F+t&b~1#KyaVx)ld z83()&In?XXo5T#27RX0P89+MoHqoyeqM>FXP??lWy@4NA-3|i*qz%~*8L68dU34jD zi9_a*nXk9rDJkdjk`s1hsm0l>P%MwSSxQ*+$ zH2PlKn(`h5;PRwFBx2j2GP%@s<`t|gE}JNC`BF^$CM-dB7v*2 z015J$FunIYg-2ayb_<`e2~zkzvTtF?l6(&K+A_HF0Q$B+-RY@C#yUz_J)J8aAZrD* z+)FRGDyU9Eo3==Ci_`mrMTP?eDxOaODqqb%LIO=HC`epTG>uI>C|SLVON`P|!M3zv z{VIj06o6vK$tlSw2uCsAu}+ceqfCS|uKv^y6YS$)`$ujMG?$c%;@*XLF-7Ly<)uc7$g5X{LS4x2 z*CyPo97Y_AtGfKV)d2%%;3L0_>7*bor##!>IwY30{B5E&cQ$3yi=RGyCp;I%$1>69 z?wd%f<0zK2abPcgj>j=3nf8t~>+hA~Y7c6^DGo$_AQ#-;`I_CmzZG;OJ@07Wk5&k< z6KDTds`1~sL1T&C+#@{yl8@Iif;-sn3o1tLImOWgZWCk?DyO-Pn7k zH}&rWl!l$Pd35n$*I@!YWh-&;wTSueBa@f*u^><@ zf^wZ31FA)SVAomV>V%YrA_AiQJ$jD$H*o{&I35xJu$)E}R!FxE*d4q6Uyl)(dtR4C zKoFJrI4W`4M6j_TZZ{PQuZoMtb4idqla@e3c7Q;Hahk}4q5<=X62uape&2S#H0&ap z4J5&Z2q*wRDXrj&$8ga(Y*8o#8vzj%Ih?*#siPil6p5@RVtsJoJ9P)ob5Nrbs24fW zwrm&Fzo2lHa4Zl*qH*Zka=O`^X9_KG>JNTrl>s4u^Zy7~X)-87M~xikJ_~SdM*bWR zq?KE2sGBSTWUveWr98kxBq~ll#kXoRZq*idfP?UPV=W+j$8)h)Hf_mhhLHxJ1qS#( zt@JC#ZO2n5tla0>F6msTWP2i z*1NffJyAc^9){yE2O&HVQK|ZCe4+9^bT(UvxQCCpo;2qwVb8ouJj6%h)}+K2jO4ek zBQ*|^e+VIFgovB;CLnUb-`$~rm9p3aj!lP6o6AtSKFZJM;bFvROZGqkl@q4Pi-6vg&Q zoZ91f|As=5Af9a;`_!ZZ3uC17$b?!!lWbj)rfL!tY*qVF7&*Twhfq9KWZhsQ0H89@ zEhj3<5UgJ4n!17 zjwsk|5@gKjFw0k$giHYv=YPaR6(H`KOttpX<|;(ztP@UTvno%%iYdoYBgP>k zl8N`!(&6&az70U=OPd7K!>&$BJf^i&ax6+LtxATocj`ZiZH%25!b z=tkQhHp?St0cP+C;9|cfJf6ShR8Zw%uf}69Hu)+}Yo0~eTOdhOYNNJ5Qpw*Dk@@LFJVcL{u zmASRaZvnwbOVzq@nw+RIcjaq_NsIDS-QhkIvb)t#6obGS?#(@*adUKAZzX0*-q6$ zsre2*kPO>fLM=|e_#f<0%^BAhZR=puJU)7^57wc5wL|U#Y*m^QfwSc^tCq2H5avIg zW}{YULwpR4$+H0pKRF(;QF_67|D3;rDE~32H&C;CQtLu5#}A?vx!C#Yy>)*}1Bm1B zG|undL)0$5RQcYiJM9YBc91;4p0-UZ|Cx@HB^#zV7yCndkeD47vNzUis0b*~ICpVi z49z+E85oY^$Km8ZOl!*i4^U|G+N{YUWr>5Z1pTgRfB|5vgm&!MAlVidxrC?(*q=z} z!)Sac5D4W5`fs?iTDJt0(3UNlOtvwVz)uSh6SY68yl#h_Z94h7s~w_H12BLWhIq$QXuTrOjb8PkV#r3rA;8I<6BA)>4u|b=4y_l z^9SFJ-)%sZCOEeophXCuW=};nQ&s-^2IbPiHp%`!a@o4O#l_0 z@%5&07!7JiQ0tb~e}e+7e?_y=ARMRF98Uqdv*%U2CQk_hIIih}9GeqiQxY$xda7R} z-k<7DjxoL%$dtMW$jsuM1<&V`@!KfCopujuwhN-(G$GI%gUZmV7q~mvz*ZO?C9Fi30Zlt>` z=m^DgG2XyT-|8|b7!vi{>;vi?116oEf*lmG!!_!@Ro~H^Iz4R8o%m+%`g@_PN=^XN z^sIC6w&s7jv`ANu(69U&Nd0k28&PbxVydP?bA}xG^zd0E8zEa9Zs@plDv+S{$1bzA z1qIN#ttk_9au6xa)&wdzFSaQR2#pi^pJm%@8d zJ}H<8LiFu%N4<^MINQywynvGY_dj#tkYZjmpn0S)=?8CzGjXb-LFh=30&@a*R zU({l@VM!mWgcF7ZW>7p?FNJTta?My3irIpD=?pq>ue$Tg$?pr174z*lm$dij@#)#< zkz-l~B*0Rtd=Sn9lm3fJ`l~dLyG%z*ETDBC@Hn>~t>%r1q}>}z`Cja*##E1g!7X!E zT%;;n?;p`bt>sYV1K&yz_ZznK+dLv`_V_Qm_}^xKDrF!3K$TVw!JUieOSl+62==A$ zQa*(ReE*kUj`0^By~Ne<)E~94AB+p-g6vPvH@1r0@la4vdKJhm6GR#Wy#asu$n5IlD;9V03 z(RQDQf#$t?@B5i&e{aG^-}FZ1_H(HS1l$#H$i>IIV+`J6*T$Z)5yp2e2|X4a?QkFM z4fv#;Y6UKde%qz|2~bQAjIm7@X}%jg9msz*URbC$9zz3?_QrtsC4w03Ai;Al5o`wm_08(D>ylG>D}xV@wsG= zxwKnzSKrNLi_hnK%op97zxi&yLVTgxW1;TW!ku>ut>SMwJl^CUOY3_0vmO#=bgAhDprBIAU+|Qu5;?$yEkc<{0A3j_pj{9FYWuk zz0bN;FQ5Ox!kw1}PMN-Y@eg0yP>M=oxb}@YGHRJq9`A3ZzWXA+%4xLtBh434-XF=f zcB0&BBjLT(yVXknw>FC_%v%vg3Tt0Imd|^B$h`$hl*@4+;Dh@Uf`er>C1iDs659Gt z8p*ir`A?oci2rjwGWf|-vsrN2qSX_&NbR5_HJ)C1DepnHPs>M7hAwVBPWHP3za4VT-;y zzNuYCOQ#pD-IuBEuQhT^JhkMN4;ZSs5n;Vn3z|wHCz7srtzI-I-C_(dQuRI zB*AiUh;^ z?iqmFnS>gHLKy&V#83}P!%47fd)6;eApetj7beqa16PH#g5M6^tsczA9m^E6YL^)X z6r2!4#aQyl4Z)Lcm)Y~>Y>Si~1UfT1YVAsoUfjGE$6M!6sdfH|?Fiq-WS#NV5kCDJ z0rn*}4W}LpUr=(Wa4qo>(=Tiq?g)I<=rP*W{N{e-%E&F7`z`Mt#eUm-H+sMI{ZlfO zQ^K~pZTVR`ud?S@_uZAj9K20A^Pj`3)T9u<9+2iwG&uw{=VJw}K~A6sj2$vr=p{P< zo-~l2#KV$ffill=%+%qMGq+xH#dH%@uP*&tx=5>>`!#RN!)okbnJhs#wg%avCmGfsrm#7|6&_sO>(@D`p4**h7&y&jG(2 zIkIq8w^?bBPUCYolh%Rf03fgml0i$VI)O_bZ9)}Mg0&ro;U>t?DA7tZo4Ag%23=rS zb+)WnFlhL85os}(dGmrB-|7McP#CVsC-$iW-0)$C^32O3fiuZ)IpitoH;;R-9St=$ z>g>0Km2g$osvEfK>$?_Sj>(BXBx^Ro1;xa(cMB?96AFVj8|rHtHyfL}HaG9IJy-hF z)HxH}2%P+$n+l6W5{3Z9IfdhJ{le#_*>~6hI^5(5OWn}`mXdhgQ6vla+$k2VG~(Dc z1ehv}=JGmkXbdPo3()K5KlzxoJlJUbJIE&7yzZa#+VkdT?CU;uGUn1kW@TdWb9t%S ztESyFr&RNJ1zNuTarIuPPLs1!=EC4o1uZ!Eb$^ld-pBf?V5Oa5g}SEQ5taK}yQAuZ zD&NMmXT_L#fbv8XQs!;aFHzvpHc>?q;m$WAKJsT`t3$xd;Ik+?oh*Bwq0pzk$Y?a6 zSBjRZi$u6L8N&GDk4_@I5&{nC%Bc4%2)FRa#j=arzdz8@)c$PL6ovo!Sl=oOK*ap$ zmcdodlW0IrS6%Es_HA%#IXN$|T%#x=h&^!3C-8761W>^gKf~ z#{`i&6Mn%@c=v%>}b3{h}J9y+gR&sTFWwyvdUrBGymS^1OV&a9VC zE3o$%xbmmuEm=)Y@;U#`m7AYNK#b*GmY#R6;2{Zm=!3?<1-LTmRRz+*vJYFjLshV? zCPnb6~)Ka>=2ek*Z4| zk9uV0Mo>Q-O`;1XGS`f)zP4m7021)u-%yO>7UxbYke_e-PJ$Q<77WeW>+PWisHW@!0imEo-a!cdPlefD!bX0HH+CUhn8J>E z`}8AukXC9JgL2Kf>u-cey*B5Ne*u(ION(JdZLa4>hNF0M+ff0QJ&NOY0vq_()LQ-7 z;qjP<-)`+(t26vy^)i0pTlwBtozbu1mx+JARRH2=$!40VNg|yzDP+B=;K)R({`X4s z^?EaT>q#drZ5ipIdUGwe+|2mz)i|yOOAG6%ywdMA3MU$@PmfF$KKy=L{d$9Kfc2}= zh3~bxFBo;31MzyJ-K!D-cxrlM(z8v) zdkgZB);BcW_ZwXXt!LUxPu}uAnxVj+e4?}F%qkJ7R%y0^CPYu?ObN00mP-Dyc14I9jen%9>j@F>!RrOqpk6?ql-Vw zFYusQ&D#jHmja&|2*VL3{gb@*m2N*p;5f;@Z@veZ_vuRDjy>Ws2Jv37_ehjFAYF4C)XimVeK2W4{Q{Md84hJWyjPg9PY+4ly{bIM5W3&}Tst)? z%f4wv911+yy?qF_6|y2N8aHs%y!~286GK?JWRRHEo||xaRoLnG$mwv+{9B=G^6y;+ z-4I$uQCn+D`Eg@DM&Alwm#xcGyN>wBd@J=vt^S^weH=U9QU1%_nNPct-MhZOg4ZGE zzmq_EdL^d0;J74NC96E6x?1yNf%8LFH2wQ=>Bsptz9N%1$D?i4!~wfU)al#foz{k2 zfYW`q=}N@C(#JernO+?_j3926J7D z7dkJz`*g&NFyD)R=O%u3b>@bJoy#_O%Un`B^6>S3Sd7i3H#<5*ebtOT=r$ii+n?}OH=n~6{$Pi$|xpmh)5#bP~n+4Intv303X*^v{TcW!-gtc3XZu`MdvxdK<=%4x&*luKy*)oOc9{5NxAnYwxKz25%u=4n>h z)T4tRZP|~v0_^`TygB&U{qphl#g~5b*QKfl+*Pd+SV%m2cY=jDd;gGO1 zS*-$_7yZDCgvoE!t(dL92Y;7%p6-cjK?&=!Tt{%G@G>qyWe!&o7-jrVbr<9>uK6df zIw>oFXLfE?vWoE7@MLhHPGB#9ydHqTtBcA@lVSB3P9%2!NFtvLMIe?U6Gcv>04E~> zlQwpt9EkrhxqxLcA%`o!ipZk7i1QO5hKvX~CnT3Hz`Q6?+bbZFE}%E0bR=CsE1g0R zqM9NTy#Y9!z`hoR^j1fRP9XS*=>H;+Oqkme{QoggU8@jF0Cs+d<-7wX0Nj}@56@*Q zr;%G(-7|D{C=rk$KoW`ni#mSt#dx}~vyngm4UZ5?JMWSP?EJ3}`R!s_Tz4AWfoc($ z$ddy-Plws;z@{N7j+QB>kbtjCYCs^yK{w@OY>I1lO4n+7d?3bph-w#zImX(9je-y- z*d-^}({?bP$kdlG;0^(}4ZzBPjHd3i%D~h>T?xyjG_pc^q(WNsP)6-u20(`V4^Y{6 zIyov2HZ?2oSSVF+GVRJ9X0HDF+d$0Gp)@bcEchfFFA;qU$Noqr!?O5_h(l(1EEBV5 ziMbJ*QPQ2kqn>6(#tiFb%6Vsz12KaenKpA&J~AM)bPR3+Wq7B>&Sk>CW@3M1J{OB4 zGB7CN^kjwWsVADgYD@ z7hPApAwVe%9xe=LFCr-x!Z9URUD5wf$@C?n52pi{+t|aSN^L(D0OXq?^M&FXWdm_# z!>(v4_FE0E=%3OSCX6Djc??~z1a4B!hbc~WElyLkV42!gc$ zu9lBbE8s0$Tq*n(thwxlzPr#MhRLgq$27%bWMUnaKUO}EZyK_ejyWd_p~-8PfT{On zJ$7Ydl0+ahZGH{>VN(&^DiOB{R-j%!S{;#%1F1OR78*3%6k|xspV*a2*ONWje(k8p zF~P5(9B^D3uyjQGYc`V@;Cm$?qN;5wQx3SqVhme% z8t+U5A9vh64M)T6b*K=2e^;4T{$U>Dzks@Px`{cLjQ-vvGjBBRcxd-Gsw> zr>*_)F%EEt5Tz(VgzYv17W&5Ku(TGU|S2zqx+qw zy5NK1TvA=i>;5$&Qp1uvi9LT!dzP(58VuU}No^W9;FTk~S@h6@(R zbyd}dcIVFMT{BMLL=GH6X7|g1^6H7%t3$j1Unhr0eWohkc-3l_Vb^k=3_iM7I&ygA zPX3QZ*eSCoySw0*zrJDX&~qCK;F#<*__Xfdj@>Po_lPaC=byPaeEm4?|I~9 ziSr$Zny4d<268^H4$I~s&}~;=xk?1?Xqn_Um^cC zb4Ljsqwpwgc%^nVeHb7Ox}G14zh)NwYWVQKVGF;sI_sh6Xn_H-F~P4R!nsT>gKtAo zDeILIUjM0N3Eo_9ej1Gy>DIgsp0|60{ z4g+L^(Wrn5C^bqj=uQVxBGL#-BPb#rf`IP3=j;9Z9KU~e9Q$Lt@8gcgfT6PPFFd7>#u+h%5@mxg&l4+$E-JaJ|qlvm0Db5JDYLT_6`Nc4~0!YVOAH z0c3TWUG(%fogfGwhNdT2UB(5$5~-CZr9Njmx>9tpgiqMu_9%cK<@q$a^^IEH z(lUR`ntzvirGSbrQd!1O@5MgerBMJF>pFr;llkHipsOR}t-@Nymks4KJ_BVMN=yn9 z)}yPznluHP2~G$o3bbF!!T(SmeSZ9w^c26FX3D@64dGIYHNyS!=d|@pI#i4I`BA>= zi7&xle*GMpV;KG%_>oSX!WMXW{L0*C-72=@6xO%j)Hs*MteM8&XduroO~^#%X2`mPvo0fsaMy6P*svVLd!lv0ocP*S1<7&-JFRnf)#Jaq8dr=^7kqe}|VP!~rQK^=RO?_UM z2EA&-53;LR6*4yvd0@b;HXCy7N7xYO5IbAXQ`R|MdcM?j00qvd+=kRV`DJSo+TAb zTm&+Apx$mE9~?|}1cc9%80Oy`uiz}X%TYAHv2tze`-3gTaljSqA>x6%@`HbGCFG-P-*2zkl0+zz$ez2kN>5i`s$b@6f;7VO*dxf_4xByKGv!?5?{U zQM+9EyFBl9`4)EhDZ42Dom-RW*~6Lm(cUL+d;V#T(UW09`KrQQd)%CR3auEo9se*f7JJ#FutIh_{iuC&%7LXnC$fz*DdfQ2e$US0Ku(71 za{j^hz;KsgR_jWM8=SwdME&;8|BXTem&j1P`;JDON4bZ}>B_1mea6qa1k?mV?=2iP zJv)lgyQ*6181&9Kcw5$Y<0vL3Or1r{cl&pe>2cO%0CV`U&yVBV{zBP0&4r#vq&IA@ zMk&8P`)Ic-9(b8KdkIJuK1RP`ku0zLT_tdOs>k!(f-j)bIP%?b&ZJgTiF3W;QG(4; zME+^x<0GQ2OEgQUP2*Yqcq&HDY^`hQQxt9jdxwZ4U zp9e1)fxuyyQSrSC-5Kb_Yi8UwYrT0|_vux*CaK{?lk3X|O?z(E7cAWD>P^^-x+w+j z@ALGt?KYhnw4)kgdF_8XH-~P{e=_FWzSa@>_a6~0QcU9=e6Sa9QQm1 zo=Lm*<~Z(q4dse%699Aw%KDWM{yE*(QGOeL==6v|2GmR?c z&Ur-el&|C2K_GDe#2CNnRJ6A^d|mX0-`wH*h3;Bf{58I_qxH%9DZdAi?spG;+D&Nz z9`f3lcHf)t75_9&4#rr#v}Cl7vB-xCaMH9)!TQ#>;kHGtZsrc)8^gm62zOyc`|1wF z{5{>NbGa_FK4ai}w#)20-7NMYmhU+Xucqm9&Ipa@jJtcV7;w8q>~=5uP!x80`K^U( zjMyJ`2O98eoH6yEsK>~eh?f@Em`GN3%b7|yuGE;yyo1V{$@U3bW7uB+s1%bI-h!+I zHZdwIKrh;QXlh*@E1_QW)mlg$ee$G0^ZeH*BPu^~$}FN`E(aquJoU9g2DJJ{qX1X? z#OOnC>bX(Eg+ql=hfB|%NZT-|$$wIuse5dF<$C+! zq_zCRI$Ou&Pt>p|lJ57E(_`spcJ?KaWtQ5up&X;~*_IhoUXh;~zB<0TJt-UzsS!RK zk}uNe5qo2hu2Fwi59VF=pEWK-&(YkOCH|yHJ1lyBB&xV4 zioR@ePnPLbx&Bc3d(-vDT0`lQm4o+Q6~9i``BR^1AmLd0*5}@zmuU|C$s(`nOzxIE z_wS`wO@9_7Uizfes@bcE=wtjcH^$(FS2Gz*76;*fe|cMQJG#ZI96&USzUnUY`PEPp z_W_;XV$$-XF7Dpbwb$APrj?SbaoK)NR62lv`_cDS|92FadO#Ayc-FOm$_ ze?8-*c)!ZE(Q(@A6<2QFOc1mGvp(e7dh#Q~1@?EdFYx=_;37ep*FQgsYMuO?Xno1E zpRVI{a!?q1ZFZ+N|3po)$WSZ!F#VzOecB2Ut$~B*IJ>W5qYRDN1M3=;j*bATA*$p4 z_B&dwh}}NXcM)CpTCk7OJTGbl=Q>7dye>ZH`oe3Z`hix-+{3W8kj(XWeBZu`s+Au4 zM!`J30Dq_2&ZPCDfI1h@?NF_Sl1foKZqf%i<#&KdY7Cur{z;pce1B)9)b9e)>A-gc zgId6iTgb(~a%I|EB^IVigS^b28g==9kHl+1-4U@WdV(B*(LGPTtf}|6RjJ%g^ttZ- zt2a!iyg)C}hM2rxnAJ6%W}fVF)eV=E(6cnTCE=;?jhkDjQ`9{*CH!U)>#B;O+ULL!QV=}-UFx0 zl1Z;f&xd-7>8qMpWsE&7)$^3FZ8ouM7<*Pp^px^cHFf$tmeJVlc`>xv^xE&S%y(2t zSFEa;JI8odpPrZ8vt~0drSa#(L@$LB)yqD1<1ePVy_D*kFZ+d!XD>i+sPw3s2W9Nb z5^#DBh!G&H#u~M86)QT}%pDR}0rT&uppt0gBjl zPC@LK?+pn2h54JSs6r+z0O)|g2&j%3bM6fzeKo7}44Y^7`>_rPx9HI)Qk!Gl}hjzD%>D-rgI~#R1pAQ2jOFQ zJOH@U4jAB1jZww8(OCq5Ir-ATh;A~(AoaEF7zS^hBTO&6*bUHQ!EB6An}=d6utWdZ z-8q5CEId{XO~<7|wM3P5gQRfhzWIa#{S?~@Y|}57ogw@7jq_zo zrRoyh75wW)}eN8a|O*_-EMfP#b*qIIcpOaji~J`CYS6FaXPsHDL8^kw=b0&VeGPyI)ziuiJ&o^!^7DrIk)K zqcTMS6>VB(ZI~h>swmE&u8{kD*5{MXIY=nnS72=OGDA20MT8Mg2L^{@$ew0V4XerA z^or)3U8FU<^K{_t6E2D!>imdaS2AD5>x%@iVnV$xzbqcz1~36QkiZrLn2@7gr?dug z<#?3F8iE62F~mnSI!-yh5pd>$W~>hN89f!D_UG&%8hftg>X2vdHN-uov^|} zf&v405b!?*Ru^D^LQpYlW6Wq-&LIRWo_*;@1jC7O#oyi3$7jMy)LUv9Bc3knbWPOa zuJagWE47xHybamWZhMx(+62KOc@h0Q9y@WbUC#rK3u;sC|FYUmXZJGuBEIXJus;3F zA_QKPT>f{$&ZswYfqBB|pkJKnZDl9(~2MA{!lSNTr)(Py|?9BEt$f#pT zFgKdIO`_$!*20FM1=#hXPP#%9ynYC*=cRs~0H&ki0EmYS`tq%fQRUr3oaT>@uMx)` zJG}3Xv)@r4LqLe=Oo?byYHSk~Q;LBYF19c>p{kw$Mr(M1fCPY#I#Sb|+Sgd3-0Ga? z)!diVd}Q=)Q9fq`3IFw8bMu?#{c5fC888Q2FW#Lz(L}Q+Tv)^#A^vio`1~;x+Nwe7?Fo5xP1d?(OmO?53u^ zRi5eqWhx*l2eMy6lmynuioU`{Ef|C3$sJq>fRhT>T8su&#n4yv&^v(5X1mpGv}%7Q zilu_IpJL-t`qp|qZ2j*(etpM>&Cf$7(2(%@T!2@t#x-K61!K=!%8MSSww|j{;BPQo zCjq!vMc{D&BLEsLEW_v(abn}l@FWp|pXzvK1L z9f^T`@IRvX;iQ<^X+im(+eY@wXdqsWA(`5OignO+bj6B#AB-S80 zslb3BG1Rv&oM?DAMbFf?+efcMWuy2~_lKN`54pu91HlP#rt*X)0w_TuFCt;!jS8Uh zAAj;()mu7eyvWQ*T2)OXs zyLfLXGYXT$t5)JMKpGe*S5K_#hGPR-tT9l=EO`Y=f2%?&unMAHG1XI0vOpG?j;x%L z@UiXZfP$*Lraa_z-GD=cNv#w?0gu;JQ4Ie0v318-_&uGbSlSR2UnXn}IDphth#!Rq zBQBX;cQ)%QGb>v8G=K1EAwoERFq+nqzA+l$IJ`ko|HzX7l5GNR4vIm}!J)Cq;~~;Hi$rjL^qE-< z$1{s~EWq3kB!L0?dP~Nh%l*@r7l~tH&&I@=3cmy;@El)y7bE`e7Qr4KEmm)3kupTj zg(n4p;5fVtJbKe+^bHiyN+rT^038NWUzdz&C&E(!I!mHVB%BEYdH1AL{_?nDt_Aj- z4bUGgj|UV~KsVH*ITk_uWc;3064eF(pvHTntyN3LtMw*8siFXv$tIYvRiq_>$1`Ig za^6BfUK5<||H)ASG5CPZIB zSUf{cJ=uW>+yQ!PlLP{$YK>yh4$AR&V!mA+F)g2}OPIRr$soH!h;~UPL;~@#ykWKs z43V*pCMVFA@139j+#TL{+Fk=U!Ik4rRqCo+Lk{#WXyUf{K7Mt z)(E5%fH%DZ9vb7#_WVLR_q9O8sYb#n2XN|3|1xCs)xgK8&Kob00O%u#3_FfjHNL)` z{93;HwFeRNXX0z+BwKY4TaB$qZ97|CEN}hh*M`uU#@LyrXEV(uGcENqtvxeslQZqB zGaZLB?`USplykG4BC}nJv+wn1yKQHCJZF1DXZvDj`=8BzD4A`)BSbSGoYQu-@K2Ep zTXFyNRdF3gRbuw1cHw@^92FBO?l?CPIyV(NXKdm^`Ed1Zs)`&NX(&`^S+_8oSTOgD zAF`hO`7rB?$hA(){5;*0Zx83bhf-zGLRrNx>R!31J-r5{FY0T$rfAhZf0(@KsVDXN zny>`lPORWZ%)-ExA{k@Xwa|s5SXUt(v%TB7yPw+r=oj?g6!^MI>L9z$Ycv1rnf-e% zdsripLbC|Ba^a5V=lP0)b-ifQ#<8DJO`p6#QZk*Us{+sBNvQ7kat5YH3#=EG*eZ%L zS?7X17nvx_uIEfr=3-E1ojF_$$>+lIX=+|@JXoCgQrwyNoGY5dwl^m}rop*CdQdta*j-ymG=4doQnS zMxlHj9sJ_;2HbVNygbf(IYrg3l+b03@82}@rs?U@h0v_?Kq}uAR$YVi^Qs;qjw>R8 zD+a$=FSvPp&RWqnNJm$%nAv%lJn%4oA%jTNbUO$s-M(ULNHuw?3fuu?UqqxtxCuW3S;R?Bu zdAH)mJ;$t@AAZ~&y>YMiM%31i`;R#9dvQhcuSIcqKj?+yudNa7yklh7;$Lbhb!LXq zaop)Z+WyH%_|6%2fs5b=H}CWge*P@&VrJy-T4b~Llh2vXU%c-TZam1Ki_2JxtoRud zcq85~^Xbsf8#go3!fs|X{7n3wK?uyu`p#K!@u?TL&)tjO#0MOCc0XRdTz}n=w?Okv zs#jfhi$rUctNw`BEGWC~Cigx>NN(Au2c37(i8KCsp&%VR?0rawjGAKFXq{{R#`N zEKVc~tUS-5B;HE+@M}2Dx8Cp8sCjamIWBgje}Dg1AK=^7usPGa**a2iR^lR((KH9c z^6F6mU7+(dm*W}`B!%{uKRn|j|X|@8gOX4t@@Fzixtb< zCfLCTDLX@(2X@;5Wd5F6u|aNqybg8FBcN$c>9DUIrI3<>afdMWfOH6*1%VRMst;DPGjCPbgGYV&@ISa#0 ztwb6effxVoQSO1scF3*aM*GL1a>7Sdq~G!6-&OeEwGKdox~TA^1fH!deh2I-GY~~D z_J}Ddv`9s)ybI3ipp{!iLeXzMuL1#b{)5ki-s23X$B2)~>1f9T}Y<`?h&=np48q8yWssk=OQ za^IbY_Vk6r#}D)GJhjKmcta4WfDIX*uXU1aaW6jMPe#zpDIsc7-pew2tSPnPC2aammngw-Y4)Z z;*~5RYAQ^n@%LV_B#l#goAOUvD4^NW)7LU59HxI8S(0C#Cp<1{Yn6FjWFisIb=IX7 z0T?|fwt79{e}6JOK|2*(2Y-+{6@g3*&%N_CmXoqOte!asVN7*M;!Kbn0TbY0#u0nK z0W6$=&!3`0BZyDPQ6-j9xfpyn4O~y|48V{e06>7UUP$RqMGMBWh?-xG76yZokXmJ= zJNgV=D6V;Lk7L=D{zQ2g3TspXbXh~SE(mKrdbD4rU3P17nrYyAyO{pa9FM zdG$+rnO>YpvSt>>6Az1H9}EFwg++#{fZra7Q%s>_4&Qjqq>)m&Br~s?9G~nWtP7FI zWw%C>WfYFP21~(}U0~K>%m4aFI{P=ZO`oEulOffxKKWMlN_q|tyQtS&7Wofcu{&v| zRN%-M`$_HE=L*;Ry}#)jR<7g$I=7Tg!{l}rJEM~82?=OEV%RQtgn_KG_t8#Yo==!6 z<*wF&UcPYg>=Jbv-1kJr|DXEF!TMCK|MowPv*W!V zAWYz7$?O$HEQ%*+&CS8Vsi`CdLVfn8M|Cd}SlK_7z09!tym~>`r2!5+R$2EJ&1bwq zi{*3&V;nN{coK`#-9@tONScBxU^eU^;cLlrzX8M(a~-x>V64Ru(ith zq#Ms}cZh#3pa6h7oxa;6M=vM&3rUC~czNsEQ=Y(&7j%~5^xrz_Q``1_su#4cynfS= zWJ!M8LRFQ%2%;~qySbEX%>&8NNh?R{tM7U&IoXdPKHT*1?_+tTvOy5Zj*uG=f72%S zQM&a^Zcz54`hWA>2>Bt^UuPrlz5e5p!X3M)-k7UsH@Jr&kxCy$*(9L>QsM}!XbR9r z>ymSa1}?xwPDNb3|950WUtqJ);ZejWQrG8*_#cNf@I4bJ05r~q%$(<#u!>sye^68@ zagdPA8OT`FxaecuxQJ>;$T;xy_CcoTH13Gr3$Yh6VQpHWkoL@Cg{o&T!oFvqNbKOd ze%?|xR9mS&3iFq@$LeHs@X8su;v7I&C2KC7Swj)O4cHiu-m+sgsj2txB5*eyBD7f1{dc zKgKKPe_f@$#A<{CKf!hG0thmQgDPnp0bue8)%Om)f=ZIF&UoC&2+${k!;Xpc<|V2_ zcbV;OA^CUb!_~PsWTJU?ahv$?ycMR303d+OWCa2xr4C1|=^C*PXKHR-8NLU1BSFyK z{4jRlHh>qp)GF3gKcx6Y2=RRr>r)-8eiYUw z#J^wGr?Fgo!`)4fmn%9BdUf6Oe1ZVALkt4M2p|{go=;5g3Cgz%S>{bJ7rSX}MxUMv zKTUUN!-IHhZaqc1y?{P1z(o)=>RzJvbtgj;8TupSAPklMvf zMU0}VfVx6mZN4>Jj0CmOn@=MRbU>XzD-9yK?d9Hd_Z+1>7Fpg)Z|OntCi8N7&Bi!C z2Zvu@S>`~{*2sR^t*ROQX%JAXDD6YBO@6YSr&Rxr=5_#UI=$voH}*mm$VRawVB|w= zTe^KQ@ZqIao*X<}&l2JSO` z$raa}kMo5In>w<(e(nSkxVXb^!3;?bJ&zpH!?ZuT2=;_E)K8kg0#29uwp41=Vfc8~ zE-*Jv2gnXE>%K=`f*jGb(85xljP5uZbt3>_2PkLFU~C@Lu|~5&D%Ch8bpWe;^XyOt z52}iV{M~FYG+gxGF8y%IGeu-0<~thf+gr z`R485)|vT#N=>J_x7Zd=YVUY!7dK(>H2BYOQVx{W4iU}lP5M7pEt>Nd`2UZ%<>RW0 zan$Lg2?zknvgg17jRD+aPbiaPQ6Cg{39{GN?tgP$;H~;Dpo#gxvVx=PA_Ra%Y5#l4 z`m6h&vF~T33zV@q7E(_)=OglN#CGfI?t|uT>7gCabOG3)66g{U3yEvWSvAp;)ph^3 z1EXk#3nDZ33j}faITQQ>+OQ$3@AfU9sL$O*E-ZbRWGsD-#wN+-G~I;x>yx9?1&~0K zozmilqs9G=Bo3k=M|FY@_`!VX>MB_MAFHmMerAvn=M`yL%u$ot;u{O!dDAya5e+*!?6EM*MkKp56)fa zroBBy7(U3q)c(8HzHVCj{;$eQ&OmX;>v`+kNTvdpO*tAY)ev>BgBI9doxjcQF+vOQ zY3`CPQ%>G5M>GjKf7vg6dwNb2Uo7f$61foEL_-3YQ6LTyh#v*MKs8=d`On9!=Dt8U ziiJAj)R6*-$wHZ{h%8)STAt{uZv{LQ039h{UW3TS2#A|?)4e1KnBi!ykqjb$^AXHp zpGXFSPb8lAz`_=3sfX~YHsfm;u%nGI(}Nl0u-51?SfKz1oM{#^7{H&)Au|WzSYGz9 zMkg_SW`ibR8T|?jJkUTtipd0pR72}7;+Qg)tPf%AB(RP!wNMMzIm0=8uvRGmy(=L= zHvnL*fO4>u4o9=bEy6QMujc4KB=qo#frS=9!UK5GGyu{6xWbGGGwNi;bn1%1qU-dj zn-#dpRn9nlp#ZWjaaruOBXeD$q}+t*6(U!9fk8+YWu<;e*9P3|@k9uV)-^-xP7CUf z2-|=*6(i-mO}b(yI~+Q(wEHJrVWZn zWUcFlbdzZ+xX>* zi6)WfrJG7g&qM$SN_I!8f27qTXU_q&W*|Un#ZRT!0q&`*S!~4bp`)qK=}Z2xsNIHw zMqVLaVH44*D>l&tvr~?4Bcj7zY!z)~1|~bQ>G7!JSs1Yh zbzp;!z&K$n#;!9lC#pN@FxCip#lM;JI>VK)-icM|SIrzs^B zITVut50GvE7>?=|)5D9TLivhOI#_mHk4{J#mbOe-mv2HRRPemVDuglH83W^C@6-z@ zu?JHh@2Qkbkj`838QhB1@~Uz7>ebI8g|;GA9jm%oth!>NE?-vz&} zO%9QRhAfv{+Y^~w5dk(lLy|^yRZ1!So}q$Y+pA(PFR#>+>6E^oXLY#%h+P2qyo#Ye z0yus|yo{xHfH5%QDNDrf-eBxaFquIAJUWghR8CZfv5R};Wis){{fnicg3$PT!ba{d zwKB>Q^Td)~mL*k)B{!4}-7$2q#Onpxo$Cj9ygM@;0O}C{@K|>2N@^1T#gI9npm{ek zup@>*A=4#pT6SU|&U+hc5~03N4Op)}bGqqyGGPYBI=_frD+VC_01I_1DMbh0A)Kqj zp8XVid{XAnbo22)F#!AO;qscbf;J}>ON#{rHM(ugi8)>3Ivzg_SaSr7bf6eKG>ZV| zS$`(jO&Sv~&LHKQh^t)ID`A_pb-4NKuQpT+3<+V+NxAtv?^Ur%94-z?ZwbmT1aV6} zd=myx-bS0esJMAXC!WUhGs6mqdimO6kbp!JL0GIsISitQhl+J&6n?jL`Uzlq*3u;C zux|hu1o7uD!~rQC=#F=9 zbo2xF1--iUH@y;*sc)LqQo1v`MZ|v9aJZQX|EgiTI$%N`NQ!;mFpt7Yibjjwm(%+s z2aQ+y2}r&A&>}XU(DH1$6FZBq2G zw+FbiEiad{^p8#0l{@B0>*J;M2l0F!A3e&Xoy~6hb1+Oc(9Gn;bCM)%AKmVbi>D&_ zg232C=B>nM<=(}jjhPIIf~-#%mz1&+y(DyCu0i@Jk;n=qp(X44Hh=^a?*4ztWIN98X6 z_CWE)J$}+&p4ooJ;J)1L1OEPlp(}?MWqx~A{`QkO3adP-SUY?m(-6CjPxZ%V`HvRL z;LBuqt1FK?WX^gk&xU0FewGb=+=cF}5%>wz3XvRw9oT=rktWvcT^cK6e&uRF?eKCWhM4ZQ2Ud#<%Q zUa@*1F^l`sE_c*4K4F)CyxKra_Rohv?rq2BLs{N!E@yaE`8 zav;SqD2u6DG)hh^zD8^+MdX_-kUqnj8OUzx%&8lMjB;Wvm7_?N#$Jf3mg?I@76l2K z?n%C{LHo;P9R|s~*^`0<%ku7r2kgme?a3s^%Ry?y7XlTo%kdiq3Q5Xe%3^y1uWJxvxI8E4Co7`J+~ITRu{SSGsR+ z`r)+TOfXmF9w&d7o}is8e;#hmYsIrrRY%4yIv_fSY%&Oa$E5VB+Ob; z!74e_!0=EP6=u#U=Qdt{!9u|~U+$8%oR$4=%lC&amkw@7%6q)4R+tHL8$T2-?eQKD zcDdegUA}>jK@Kaa=LVc^{^e6eZ)C8d{l2z!1GOUN zKT{uERO4CuTcol&NWRA2G$iO(y>+HS@bIoAi*jIVuzFv8z-*20Otlxo(XAUnm!2Hm z%nwz593DCq&S$Zw8~mFM*%;0n6lQUB$G7q3FS(G%R9&%rox@BxZd}Pw^cc6TL^Nz7 zTBtA|DQUZgILs*GSwbVMgS}eAqWx7u{p;c(jnVfH9PJxbN>%hAK~c&oiK5j>eZPGv zzi(v6#>yzgWve*PG;%iTKMD`CY*e@%Rp+D}oCIgTy@fnXFKxVsl$T4^&$3p@Zfwqer+T&pf?|QkL#pg3B6Tkd zDr41M`IE;`m&c1Q|IT&)y+bmUE6~y_HoZr(KFOEgEwKJveCwo$ z_g-mmVB!9BDa5hx$w|@mlQIaoSj+C!n|meU4wN_kEoIw(9^Y2Wdv{Xqs`lpbJz)Ce z@jac{mwIlUy}v;$jJ@B@aw+Gr z`iIQ64@en$1#KizTcqsl8h{0}Q}w1~z3#KY$622Q@P(@pp1W-af7EpVjlqv?Ly*Ri zZ$!~ibzR}ePgMBQN(4KE>MDqgr~5maNgUS7piEe3j2=ZyDeqIMr&*2~I%0pvq9R8! z|HeDEk88Dm&Hww!I%6a_a+Wr72AMce+xBrLa&EtU?AG5Y$iKmv7ZdS+=U5`=O3wxw zBam(ClaMd7TAIt*?F(8|O8MU<>-Obek>B2HtZH>Ea<(sQb5F+qdu;q~CI8>d{f^Zm zjXBQtpUxcX$r>v~k((?X8v+m3e>_;w`uAPFaG}T)Y&4AKf=v@$86b{$mJKJrWtjAQib|r6`hwSUhRGxCdntC zyiI(%_AyH)v*qbMtD@mVIX8FxyJ-@`6^O_8Xl4}Gtzs?eU)r{2+;(pCU+R5!DbvrT zHGKE`WNW6s>$@lrEr)tmfZO|cR#CgQtibDikI{x1>d$Lj>x9a`D|`t0Wt&TTKj_>G zWUW_*ZuZNJo9TkLhDe_T884q44onL?d%+xe?`WgoMJ$g9Q`_(E&#v6pE=JZitUc#; zyWiGs*}U_nG}%j3T%-19+GL+oU*znX&-N&#k@oywUX73~o5WV-iuOx4=Epmee^glA z_c>ZQWiXbU()^YrUg<5gg{9f#WocfKNVe>v6Ms9>#UMLq`JPF2W8^)HHsh6UR%5AA zz21wd*ReH2MYl^&_4YS4CJ<61JwU0XO#Aum7>Q1fn>Lr5X5+@0jJO?jKPd@CZCvb+ zw=y%;5PqmD*Hl+{)vts9?|y|gm+JuAn+vz=l9W@~)yF!^TT%Y#)_ix^w`z9Amu~fa~Icb|SF;*|AzUpNC+2TvhvuUeP zg<<>sdoB&rBDv>kddoj2GunAv`eZkAyLt2TjDIJS{cIo=BQV?hNW*@PZ9Mm_%dH}p zqw4UbzZuu=?tZdgi2SoTwGahjc333*YRO!TVUVAejpe@1wG{oWd~gXV`e1rFS$4>Q zI!xZ0{`R=JoNFa*G$l(ejYaqQio+!vN4-q@M~>g0->mrZJv(s7@kj36tuH_F3CvDw z1&J5Gt`()3JN={%gunhQEqLU#{_0i5*Y!8mLr%ZSo43CHs_bNT-l+a?ab}}-)ZBTq z{)^wtX5-Q$=dI?S6*F6{yF<>~?UL;%I$HiiA|rg6nZsXu%;IPZl+}-WD zqlNdk=P=OMDyW3Z7$a?x0L&76@q4aCWM~7?|KOpjS^~g?sB$O$en+CccDDOLX5nmq z)FP?^LlVQYeWFnlPLWmejsX(_%Fqy0-Hu>^ASnPZHv!Pl1%lY{n0P}t5e9>U*~{=T z#Fb7Y9e1Z>2o_9L>;S?jf&ldY7X-BI2T2A33;>FrXN5$o4ac*fbdcC4=sJMXVS9l= zZv+dR@$cdJ1_^YgccLlCCcM_)-Qg&}dl4d(m3p>W8AV}O1Q@uwSTiu_y`ucTY;sT) z+$z*^t(#UYFkvfl7!S80oue_r68JC#26iJVWHZ&=2n>^+#nEaRp|e=MQlrI-2bsCE z^n$$8)`M4s(A>txP6KS}Rd|{TK#x8I%|bU#KtO|t$P|ECU@aPJK0?q<)n>x_5}|Mm zShyRD;wNMI26l+@-7Iv#jxJYv6^stI1iQoqi1`IT2>&k#n5zGOb7T+`uoLIbFaMnG z4<5?38?A*cL;|>%@&(U(Os>g2skq+H03#7t^ze+RtUNK}n*&bsa+$4+t74{H50Ntk32FpZjusq9O}Q6b zzAk9}JX+y->oup!SBhgY3ZGIhi$1r`-FjN85zENKh5|rM*e9$3qW{bJ0YDk}Ie?hN zzzKKU03iTRyM{`oCCkuJyNaUNsu)NBzyQ9Pr!!O)O{7kN!Qwi+{A?W)wmK;P)J}dN z^>cm0vsZLkLWqS#7&ZIE0<1xfIMOFd+-=|BFDJO4N~D&ym{)?`e(5|MNY&1|f_6j@ zpfpxwXg?WA(+29e0@sjf!9uluSICc#)j2xl-d^(FXcQv{0VX6?eNS- zO~tLiwCt;^<}et9Ot4%fePD!#q60}WOs_F`X$4L|=MZ!@h5_W@wt!baw{1OY;>kq- z2;q7!B#ecFLIlB{v3UTLEgCej2-QPH^So^Q-;k0tS(iywaMrL9nW(=EI3R$t z<&kYa0~ZQlSkVSxYbDsX$u66P_U#ay3}A^^-tY?t=FXABm5&zx{R_Xxp5+%!t8`7#`IqC6InTM*J8j=DK~9FF zx2&HtxvZ(MoO~p!GS|U3y)NlGjXkIcDM)C&dfETQc&>o}r<0V8karMd;&KAAj1(`P z;tq)P&x#S%XpULk0dZ6%yM*P86a;{)+@Z>7l3}MxGM!Y(B~7XeK}6UC#O}}yVDIAi zK4NHB=J1G=TwhNJFu{PRk45f*<-Jv4x}nin%W@yPOzaexEZsuQq=K4wN~+^r8=kcL z0+ytSac2A@nlYjj96);XgJ`abPKc%~GQf=X(;e~Goo1ZMnjX}*vto9gf3(bTVqewm zxBbwta2gE=tIIR=`>7Y7^NHfo5>jl>zyE~#*W5I}OX9qIGyBQes>VX|z~#J`FN$)0 zX!ZRWJWUBsYY=D+{%$D<>;uJ9ZHTar zm)csMTJH9|LOJ#rK~z4@MLW30V4EIH zFl2)O4pIrj(BH$V;ns!=f1AF8P`}wy=Qg|-W|t{LhzDB5NKVUS{e0X^+D_*Z{gqbi zbO&UNq5Hth<^Bu}Thb-?N~_a_vsgI|DHaje>w`z^0RpQLZ!GdpCL1-srjdXSXLzrSw z1GrZJmL(ky*pVQ}Ic z-Jn?k1>w#Hw$H{`5~NZArhr2(aG~(JNHmJ(Y!UJTU>fujRw)2#P_!WY-&vM_0Qqdh z;_suXzwDNDAQF5KTe!9O4GLyDt8B_(IT`6;xNmT>ro(6fW31d}9K|qATKZCPrXB!O z9r@H84yFQ4qw)J8__GcY7=~rkNv21UAR~B2BcFc&4mN@dF2uLjzySp^BMb)&P(H8- zqrqHQ@F0Hs5sBswo))vn&c4hlRGs4ihaQvZok%QD>H{Gw@=wKoZ}}RQsP6K;i`%n$ zsmz=_@uFStO?qgda@nxs1rc!c-RNZLVDK0uU-Vpm31| z5{RI2=b{b?t}r5K(hxL)3_}2TWD#05!iv7a=CZEakFhWF;{Q47yb;KB7%1?kTEO@M z>xR*V2RKj)2L10by9z1}s>2wuNV&EQrzfzF3DO%ZfsxBh{EHwys|!?yDt&saL^>MS zy9>9HgzX6#BLIXIT6;`z6CAc2jaFtmvXMh0buMrUGR2Wt|5B<&BlkoJa$>PTxA;*s z@J`UhCA#@8@C2FBodj_RvQF9)dm@LCTEF;`P5fDqSaXeJ`<`T{oK*Nr&}%CGRU2`Y zI4~l;|0mnf52!BfIPg^$s+62c&*k zz%%rN$*2|_lIYXmp#yB#ptyYR6^1%F{xYk2W(@+tHEr#mZ)or;qOKUlvg^b*8KEN9 zB5ROWRzt7-tiL8>4Kv5Ll}Q$R(IJ0}GXvO6A37kwIFpT$B}c4)zMsYS|IyZJZe}~s zBf(_Qe@s;J1P=&Ml7O8ZzCJd_ozp96`UyL$zpka^!L5hlTVj~U+Lzlx?kO@M04U(* z7*2WSRc#CSa@;`rI^0z1B-#SkK3f>?cm*plso(<6Y++SDMZD}j5Pjafz(cb$7NLO8 z9MSDOhr5Vf*??l_acD7>rdJ`3Mo8oWxLk~JFd2D0Pxv~&u;1pP->#DX`*9Yhw>Nf8 znXaZdRZ6@8aBr02tLZt*CtkN+Og`s%&t@K@y3~TDuAW9^#W&u zU2?-!A! zOdm}B3Z|L9OI)Y09S?XxoU2igf2cmYaPR6vrvD?I{;Ld$wR6?rBI-8@nq+yWeT$ZF zx?!P090zEee8EsO(;)Dn__O&OCq!Mlj6Q+Umn+@^r3_t;`pe;5&w11>iLNjs!w1P8 zQe8HrW~^k(vTbDjo#f`Gp+c;& zmC*sEP_eACwHa0(E->A*=Ku^gMb{=?u)Py=-?l8>a*)IHwIT#~ zB)!mb8D$`y+^&)pdp9eQ`wkQj#iJ4@ncoFf3f^Nanc#{FW;jeghE|{wW7m)2(~o31 zo&6s}2{JEiEkCYVXUDE*XFpHX!ZX9sf;+do?%O_w0d91Khhj&9WyztSikvmo{PH?M zr)|&|Zs7xFw*uf?izF+Iyan@Ds;<9FgM&b|U0Iw^>|eJ`re3%@0^a`U5$E_N6iXGjCCm0+iDOI2A1`)6GMfaLS(uHkXe3~T!t!v2DWHxKfFb}48qy4ayGX4s z$i(PRlm^v!B|9`}=WhVd*4IFhA;(w9jaMb9D*y4zQ9=S#A~uS8*J+Jj1aW*up3(k? zEsa(LP_M|>WF)x< zie+C4WEDh#VW?JZH$D)F54q74Nf~vH^}!mBwsv09pm*07l4UbR0UqV;wAgYg`?=vh z@D}?^ZMj@Tuw&*v&H8D_{-w^dOKhBtl@C+fXQ=D>tF8OaD9jSeU^=MqN5PpB>dg5L zXZQjNgfx@x62dpL4qnc?)FO*(p;_kP)M;uR&u6AC|aQdS2M1J57`AkQIPeTMnf*dKl2vU3 zrSv^ZU1n4=x_ZvXR!JZQ`{B9zfQ+2bjsK6by9{dkZ5zD*LjnOxOIzHvP>L0IEAH;@ zUWz*jn&MF0trRV8#XY6CySo)A+7|NUe_hwk?%wzAGqb#d7n#gNm^shSaeOtX;{s@8 z-0nq7nu;*S0|UnI+sCth%FOjD@`FSGv~jG}@#i9w1c8&c2$_lHEd#cJ$@|_3l$=S{ zhpD$B(>#IG0v*#L57QDNGtz-G@*OkE4>Rf_v)X~P`W>^z53}YXbJl@#_8oK1#?HkO zWJwZl%X`RHHs_!s3*mta5>_q*eGI8k(hv#4&P@*VZbB_6VZWsiF)ew3IseCg2Acu` zSBY14J%nr1hU#Cfz_^pSpA)Ea7G?ui7mZCADBg6MQ-#pzcJ?y3^x&Hn5Khs^{|tAt zmmspEv0FB$2B~&se8Ejwoyv-?)Ac*T(&(0>)LTnOoJnF)>5(`jY!cfRrnt1l; z+&TaT_cg)C&~-);s&}1-Igf`AiQj?%GPgDEC<(%Z9()H0LMtfA3k%`|6k@9$(ib7e zRhxtmb0V#UlSz})E(yY96k?Z65_Ah9D;h#2=(x+RGIY7zUP5c!~7 z`xa0E)RcZuBDVsfFq$51 z0=g9{!VM}Qq=3*xg3yeH5dKK`wdVn)P>0n808XMnj(KGU>ez#l;EFjOpic=U)LKEm z(hxxP`KyQ5{Z{)M>`+4*2Viw&w8sLdN9pA)`t!rlT`zSZ3Hn+*Z67PN*(|Gk2tXV^ z^w>?LRtfrf8VJ57v>K39EDfu|P0O9kmq;$@^iaSh8E=Mu?v6H^_k0B{PFBe_@eTCG z{+V-;Xmh(CoK@tj+2}#Gs6=D16uWrimMVJ{Uauk>AoUUgq@(j_%hk(CYrk0o z%#t~17>c3Lkiu4qAOu5yi4j)=-hR zPSG*>Xq{@{^4&VkBnZnU-6BrjCZj~)lX9kg;k$8TM2G&i+o%ZRm}DJ1BBXcA zNrRIupBm(*Jd3ktqh<+BU9s$KTDIa8U0U~Yqg}ooef{CmcGijWzWs7c@u%hZ^WLW- zKkWQh;sK_iY6e`E#U}iv#?c3lEcFYV5_k>7xuJLWI%-=fmtTu$QJo%WTI^rvH%7Q2>;k4%KJn@#JCi-g6s&Iy0#5Pl9Sq?Bq z_U8*uOj#&$B6@t3DtWw_V$?u63%@kQ5K9W&s84Wc!r#_|ri7-uw}k|r8Q@&UxM~El z{*@}{rK%cuJ!cvpc(e3=Jn(icSgg96-P0j^T z^GQ<9x(b?!+FA{)9#`hdaD=JRZijFNBF&O6kq0M0x1z1jPJE<$rVR;o$EXWurCoS} z^Z3TSlWEnIeg{GLsm0oc5gX9_YffMe4rLO_8eoa(#UYv+^J>9)9^z3~MSg}(^$UV8 zK%P+PVn6EpEPymS%&w7^(AL2HB6YSKbAUu)Z!lu{|m;^~gh_v7frp}-Jv~l5FAQmRC7U|b^B))Z)f-_rh6*Fk9YD>u*S3*K8 zA=|{A;#jY=P`=9@ZMim4W6%d*NNE2>)%ffXIbuLlp)RM2!4v1wcU0J;3gz#p=p~@mc9Xc#UV9;%VWqNS z*i#8n9>w&mW%8;~Q-=?QB>j5D+#1-^>BAl++*M`D@1v%(k37BzpO&cxW6$JcdzMPE zmaE4{%@i|xmMJ-xYvy6kmI@ByYE?07wHFD`RGVA2<&oz{L zRyjFW7_MW_hp&CE)V_YgEAeTz<;b%-;IzUNfvwl&7XpfD6@LL~A!Oh#&Ut4wLV1>e zPQ`75`0C+_7XQ~iy^VLA(-*hWRt#rpBFd|wnBovqi$kqv#0&uI{lKAjg(jHwU_9ej zVkfFcBSEKmX_D>~&+NF^V@LS5FVMnT&~Ryo*}HYb`Kx=Lf75gcFGq#*sq$0mu&jUP z|7%!na6@5odKfJ-=m*xF(cGJb1m8}atNqt;*6)VBc@7=`T5gmu#hE$e=Ud{5uo*fi z90ePckM2lA4^fu_P}o1BV)4I)pe8`j4W5e!BOJpz$Z4NgE{Kyc;U(dE-}M3A61bcI zI;+nn14=#$)}3nv*0Ta?HgQzEy>nO%Y@rVy8HnBM4nrm(v5dfgZ=UT+C1HKq0K#K! zCYyX@aLjvH>uX&~b= z;sDfEHZT&He`QQNO(KsYaeR^C(7NSB38LQ<0Dmu*3=sLu14RR+y9c)v5+*X#^!x>N zH#h+=w1#PELei%P;68_f6Hw5ZIozyc6{Q#pQ@$(8us06-FS8u`&9|R5RtE=a?bPj} zr7*$CtZFcUY;(|ft;91yB+PE_2Yn#yenMLV2@bbvTb;eBd$xZPqGr~EeF<+NX{UpV zSO8oq_+&}0d^}GIsZEHx!CP)F(2jr4+oMk)kL)(!wY<5A%3!PW&KGUY|4uY&@mW52KLefcyslJD76-zSb754Q_Ya z4Oe!F|A1sOoErS@Hc)B=N&*eNjVpSm_t*CrKsTx{9t0(U<6M`nb;D1e{mP-t^{3!U zx@A|(;&|LmLq*`JS?HazXhLX$lQ`Ij7(&4exy5Ed0X$71?lE}#vf^e>oId(W90lFB z|D*u$7sSUv9VoeI|5MK5KOBtF^aC1rFJ5Z_>xuKtBqfw+C@tMs`d=LTeq}T+WB)p~ z_V!P19=TaL{^wCTe&!)&KH?;>)A!8#ph)&cQn#a^(z=oY|0JdGt*}0n02BvPA5ple z>3Y__WcpC^Wg=isG$@Ix%=$=9UzUa-*agMbMr9|#GoVg z`bfw1ln-6D5KI^Zs}zDGN0P_^2-Xlj1w;K49ryu&uNy@Z0NfKWIjCu^IV^#5bh2}d z_i6y<92O^apc4&Xr-r_J#ZGrgh`05?W%&Bk7C1tJaH4ylXgD0vo)SbB8)zIYM0&(8&~H^6Z5=f= z{XZ5&)xcsGOJkSev10_FFWoUMo1Ts+v6FVX({{1j3$e%WxYL8UpDkX>gM_;NzD!qOI&j{O6D zAERPJLL(iW-D_)WJv@E=TRY05N0p_`6s%nW?9xm%y|RB@r5+qM=@=MC#6CDXyGzKk zaR_yHcbS^m$#aP;EY5wct~NBb(l;;{kk{l9SKQm%dMBkSEvvS=x|n@=S+A|1ae9`f zqygz2xOH%J5|i!EJqjHfPTtuYE4e+eu|2W1lMvCGo|(M5I-8gnothfY&CPFUY>bGE z%F50y{#Dk#zN4uVZg+v*4D^GhZv zsC|Kb@76bpi+8YyPyHGz}?4f7H=c*6|Ce($uS~3&@6c>{!`oX)CF!$!oazsk{2DtRxwRd=y|8 z5aAHwW#u@aN2kCd=UONo`jq{jfCZh*zXBHD zYiPfJV$v)(`d;_>M;eFaaJGDX$!He8`_anx`Y+>o;-T0S3Js-`MRK2*jfWe`roX5a z^**5`V3;kZueP`@^Q@S!HtUO`P;9DP{BHq^SvBg`ni(N3@LId_J>^yO^v?WOCXlz5 zlQ-k`;6DKirPjLLAL(36OZC7xp7-Ku3yo~Qj7cX z+Gtzz&-Lz594eLemW#LsTRxS?jQflIi6X^3m5y)M#|!n2>tlhXzalC0A`oBhDFUW1 zz&~td*ApMSZdbQ|~?Tn>tvK0lpE6C&RQE z_V0kj9N~sOS>`N_O}zF03|N$IMX@v;Y(;YnGHu6j&)IFq^6!;y#|hsYY{!dZyxvKW zBDCL0lqT!7%Z%=-Wi(|50O-K55NSxznduPHR@--Y}5D1YE1;CEZ~>-UjLQ%&>T z{3l@Hk|I`Ya9~)FN`A;*@RUuy+@D|L_@%N5$w}V4%b!!O;ke{8*^9W;pM)s!f6n`f z#_j9wBa($7!+Bp4&S%xz1Ei)^bvrH=Y^wv+=c^yJZfl7aGh(Pef$ z{5c=0)&d_#n-cx8a&~$7czOF1fdG*91yimYmGm3}R?0^uf-ycKS8(9Ps9FZ~L_Z|C70F$Kt+Lm%nVc?ADR!BcN|ALZ}!Nbx6yc!)^3 zep=ECSQw7DTrxlHE82^XYB5_M(DU(L7!7`W-cu-1X-C4Wa1m|xq=XQYVo7Ct2U`yw9lq?j609xh3GnE+ENrX~6gml3>7 zOo%C_XO#c0U~rj~K2rRO@B4QZzspbgPd+or$}2FwrZ)V7Zophyr;yjE!BU;A#G)wB zr%(AKRiJNIOQrBf)^#0oSFs|8eQU4z(QrECJ27WUzheJte_)e=jfDxVa-)Bn1aq(iYT_cL-J#*KK0oLEE_!bjVjTl?@dn8hk4e^l(Hv&(OxJiicWt-^aQ33 z=P{xksGu8ghF}cj*X(?eBswDgSHMCUE<&d;8D(%)NIY69!#6w`_x~8MXtoq@3d80u zv=}HAeOIoREJ#v<+UTPqqNC-`J6oc4ZKGSIpmSI^`^E2T#W&Q7k$wmKy55mWB?(8v znWNdJZ`W0>u@y%93iH)9JlfvI`X<43^U2qZOu;;gX2%YVJyF9o^zT?y@ZWF_{_d~! zVyLuYR9qZ3xT#AYt+e6$u{h>;Q=gApWhbk+G?jVtKl&AO-)&8Wy>b5Uz=64OMNftRvI^|Tj*Z1xwY!{?n*{BGeg;2t0UB?-(qCqOqxp8I3^yU zR!}?tiSjaZGp-kRZ+AtD_I9i@$qT#9dwV$SuRFCC0#AE=ox=vde4}2?#3wDeQSBj1 zuu+At$AUH(=Ppub_Hp7@H#-Vtm~qkuOi8axjEl+dW1abr9J%f-C(Xz#TIDkhcb52< zaF}LM1_66LhsMr7T479Mfudh@Xyl1SW{E;=&6hUpXH6G%`HR9 zXKq=4Rt{8}zs--Hc_H`CJ^FbCyfWjK=$Bt3?cr;W_YxtrD_i78UN!({GSJBP>!N=z z6~sFd@d|En!M-E-0fnvw2U(kvA$L@`Y|rE9Rz@gI<9{{aU+&y^D>EQ$<%Y$^IJpPO z6bYUw#ojeuewh*G{$eeEK9f;~h|@Q^ewTe$SY5SxeN4y) zH5YG1PQB~X>x+Do%+7F6Bq z)!I65tpQ^-*R((9^bvW4l`wB7Tksv>GkpL3d!J+l;WPxx-LT=~{~oaTzxONrogP{Ie*Gc8>2o7IRvnrn*P?=QVojc?BrY6hr9iX9}?xOW^k2p zMS-!;>joF~2TwpD6(!=XHUSuSkVXk_MH(oc9^F$Pd~7{vzaEQnv*ws6?{ zyl`aVa9()vUQfrGKk{uI;NcUQip-@IL^kwCDsDzePIKc-(VX0U~u2>kq5mzcda#%ePrqsP@B zGd4gn_?JYit$FMaOnG~s^`?)EV=k75E^hfw^L5Gd?OBnf7E$@8IL1x>1HR|qiCzD^ zhzHKC&q^(#xAE`!U+pi%S8gfoGHF^x;N1}8m-OLb+CRq;AhzZuk|Q+Em`r%BZiWAy zkmxn}4lDufd+a(mF{qv$yCIRHOcPE=$#cO%54Inlrk(l~%!v~663$dyo5Z4@M2(P! z(wVyok_b~}y!h4P`eyP|l(*^!qGV@ia*p|@*B?La$Rx4a6REupCge*}@l8qd2-a&& zF0d^1ZkGRyDZHF)7E95PguDO9w&*M4MbeU(*z|AExzb#qy~kY-jZNwyLc z3^qrV*^BMX$d=(w8D7k;+_6d1$WroU?LN$|)6Oa2%@M6rsuti{u+Q1hCjby6xjXu~ zd%n2`8M#NTxhIRcXZN}1Bzcztc~|;*H@KU5r1>qxQC^byESCAG znVMihMw}yEta4LaQpV?goG*Xp6Z#bpXBLnuydyYzMUkmT=4Xh!EumY|qwy-nc$o9LCgS3cKu!!5Bh}W-(KeI^iTaoZmk?64I_I;70V6l{6P5>tUCPDGcMUG%! zu{5a$5-g4^5^v*u=GFYH8l|tZL|v4ac!#2vKbHg4f7bVNS>Hmj&MX1AK07RxtV)z5 zh0-0UK52sJukSg zOIS);(X#Y`&aI+#sp95?KhI%BFSci&K_$0+B|Nio_*>=3Qsvn1$_dh{DZ#24gQ_{d zs)fv|rEgU$OI2$M!tKASwwA~?1;6e^k=+i^75jaiH~88)@O6|ldB5~Ieoe(!?CMWP zpT#kspJ6B64HtzjRlCvDAb#fpvNf*HD?wRhmBZB{AvHKcc|$j(&&X=y{7MP4YDwE_ z$(L&>|I|{G)zJ#o(Hqvi@~>mcs$=$lM}}4VCaa3|PaWr*&%-DtEQs2#Tv_#~&+A9( z3D_#?f8VoIFMS54EZ;eriVIZA>F|1dLCQu`5y#7ueQ+QsJ2%@DGd z5TTZ^HVXbMyhwk%o`jb0tY%}y+E}tyBb)eN<#w(VP6Tl;cb=btv@z;Ulod%t1( zpnp3&t9`hweFR56bGdzjtmE1~lEoY}Mb+w(5KRY#ryU~rhF#@{5+1=Rf z-A`7!pZ@KZ!fwJ_seB>aQy3+BXz+rgr-iV+X1tCSxp>ZJom8Nnk0;IM3X6rvp-vjUI%3r`^bo+SKz>@_@j zr6@Jv``&lgS$r#!c0Bq33X96`R%HaZ)SeOnctsrU#R2Ix(AL8b)!c5qRU=XE0nf3% z50+KFXs)DbG)k|I=@m@+-nHVZTf&a{rH@Gx%*^LCARJvl-Um*k7Hc0$kr)|235lZ{ z5eOMwtaKi=8C@41+c6s33m7}d9y@9uJ6Rb!`#W|{K7J`Yeq}U%6EObs<>+1Z=e73n z*2N&nnOyanC3?3hsaK)HIFB26 zl$$R^H}Oq234=C?b2mvlH_6vFDIYhfA4}&cwp=PwhDS(1DqG>9@yuV-yH>Z{%0RIe zTcE@(cJplx6@LEQZQHU9VNtly}Q;H>K?5Z?M`3us#f>h z=qGh)eeWgrd|dQ{M9HC#`!w7Ke*32Lh?jfAeO{s}2aCK1acBD6lw1jvhp9n_>A8oQ zorl?Lhq;f3`IJY6qDSHQ8^x4Q^a z#OEA{pCmU=xp{tCe&_z>D*5vO)hd7aWs%VY-{vo#55EN8%W#Sjfe(!2gRd0z z8~2_nBlw=8-Y83zDsTM0Q0#ZH>F<)@-=%rK%e#J8uK)gu_>JsW)QSCJu((Z-ylW8S zlSlxyK0B6K{_`d6?iVd)1S0RkVaD`fF8E;~?_sIy zVFj`Nfcy+>P(5ymJ?q+dt|q}KS4a6Qz4K6iz`#aO)%mv5AnMT@pm2Z zh&+)&5#JCG0pU_grK@d9M&MG2h7qf8NktK`n)IiuZ_C6{hy)2WnVBkYR%cfZ1UwG-K|I5YZ&>{kqA>He!oF|i$X~Pt|Oa09YY*>QWgH?VS-m^2jc3JBPL|{-F-MMZJ z#8S!TzU6@Le$Nq$q%{8RaWq?HI;2wLd(*ny8h!O>{MYAlcQj8n&*b5{o=PaplnSxo ze}8?tK9pyQ2zq>YKvX~LOh-qr5l4F_#UTMAvZ|55qzdDZ#9}P2k;Gx|=Xi(9w^Q@( znHc(8spqesSV+B8m3k{pplektO=KGOR))m3xK@Vjeg9io3h$j-S*l=kPC1%L`Z_tf zcqvYKhBT`>dB(i3|7*XZUWsd5ic6Vi-l|@iZ#|4lMPR?UUPb6p-Im&UYb|mI?cLC-!?Ct*TDYE z=OzQk>H%Iu=jPoe!}nbvKBEsq49!OF%U|vBk^H0A*=F>(PwGH+*M(9K=Z8YwbPeD8tc80|# zRhiZiY6U%?-XxTR^wM-wl~$Xq_qlGnsSL%7Ww{?P1nmk;g*`tfTK?59C2 zA?Q$sh;;f^jOC-WME|>F@0(+Fn($I-4KA{XQQIXWUx`~5FnL4SS@i3LC0?so+vYTK3&==|cSgcA@< zE1g;L5W#RJJm|A9>idxSk}oLTLIg257<4TXh^OT?A*qLEU}>h#XM|GTbW-Nn@-1Jm zO@Zxc3{-RUS{cE)T0@zJ ze*zXPv@b9;o+@Ec-}1wcQ(RSiuJCBFTIEJls^U}pisix-dQSr zvWqFEm9|%yp5|UU)%eUFUS>)xm>fSiQ^Gf3uj2VlGxuiZix|j3EnHBmkZ`tCR@y-$ z<(pOs?`)ZBxP#VbLG5y#*>c?h2c1T28jORoimTs8Is<~4HEU&+7lOxnv%?t;Q)N|W ze#Zv8|LIo@9H(rNe(CsHQSA$=G`~Q z2Apho+Vsb~=IW7|cROhzgQ?WHhA-024%%%7b4_!N)v?%O(uLz$a6-BU3LF<)OT&nB zUfvoITZ2Pp^5(1Lw*wtux6rl~o!2w8Tm2U3|K% zCd2Jw+SM{LB*zq!u5H3{Pe+G^HWfK9=J@oN7_fuv{fu%C<~tFq$uz3W2`F#qKY^ag z`}|eRjAwq)14OvS8DS@Z-dpt&mbt1#9UEr464Mer);#ATH-EwB(9b7OtE}NfaIVqP z&mQq1##-2tbbeuwZ}3B$XS*fk?ZS{4hFe0ouoW%QB3xDm;g*!rZuN?9@w;k-Tk>aN zYi8ZWVckKu)W&veHt)rM2P|T8`{EWyY-QXtXWMOfn-@plN4RJ23fl_KFOGQ+y60ZE z+lt;Ujt66S&&^GtohoQ+k##;h#9@GpGIGL=B3ogYN6!p_<4B@W4n2p-X%R@nPCs(={Li| zv$7hpm7lLht2RY`4wz@H-41$pUU$3?x?NsJVEA++K%%by30U+Jbh<|Ht!zGv^yz01 z{ZO0it3tSsHTa?M!@ld^SCl`o;jcyCCDxbia0&P-X^3X0^cC;w_};_c5&z}MI22H zv+kdz=R5-K>lw_a`k}=acr@wlvX?$ZfW{@h`t>f~)>*P^5MQn=)&WJ;9a>Z_Bb(94 zG@3laWPIOo?llL6{MVlQ+xbMI>R!1dLf0f`(` zug88qU?i@lZxq@5=9fT!=MbNAB-=Gg0SS@lrb@+(U$@`%hTS*E2GN$S_rCbhb!&?A zaOKqX>gpE$<&-_qF}VNEx2G!(++9E{e(#>^fc7?7u6v2J{b4$@582P00Xx6@jQG?& zD&B~o!@?ek!r|_IW`u)@-t)YjVwSGwrBn~TRu6$y51~g7QCJUgat}#y4{1XWS$_}t zOb^9Q59L)46}lw*i#8?_$rvWdXnx6Ix!x$f-b}k*>XmFptrxFjz{~;QH%3obJix3T zSZrav-!FP;u-=6ezYAk}*UR4*D%Xejq}Rvp(Z`41K*0$X(0U?h1r}=Wi|Kwxv-mFc z;2l4DCGXC2339L`I`D1xvd8c3Hs$Ug- zKn;IDoqj-rdjQ#_(9#;vwi?j!7|;zH&`TcBFCH)mdyZQPw#>pZG6EYn44AS!-HpaF zpW!g$9xU4U8lDe?f;-R9GLGrMwgFfc!ZO<2C}wovXZh@*kio*1!7Byu>f~VZflN5@ zP(=QqgVs=p+)%2WY`npck5p|mwQveQhi|`ZlU{eMkL)Q|Nzlj;Bmf7J%+`@01C@e@ zX~Dy-;1M41$S^o88UC>tj)-c2NB6^HX5g_q@VF~@Ji0s%7K150R?^NhlPB`{GwIau z5c2@6=h@(NrSB0+gI0gp4w+@I_~99UyHk>}LePOvQs9CB++1!2*tvWfx$q4gc80J* zrZD(Zoh<0X@R#i=VhM z{b()z@vY%UTmO&tnI9cHKRT~|bfJ%Q{9a;OZY5vh0(!&3B7dazPA3XB>p1|AUs2Iv8ZNJ51~j zi@*mwBlVFa0gSL|ky#d&87zi@6VL&*5HJi7B8F-6s{rCqsG16pj}Ek;AI1Pj4amPl zfMFo4jZkE<0}Me2h(o{-C8(>4H4+qctDLs005FIV3>1I|8#4mWqC-d%l<7;Mh!}LJ zS|}+VnDcI&mIFM@0^_2FQJkZaO`sU+h3MnK-k+mVOaOWdP$)4P`?*>OfX==EC7(cH zqy{Vcfc5P#fCP|j0%)^Xj_VFtK|$x@2!-Zj025)H8|X%O$eq;yaEH1Q5Do=T(SRVd z1RA2ms7A<*u%E-o7yxAsG%Y+B88w709fN{ljE-RnsusZ}2Qg++4WAgr2LJ?y2r2-> zSZ9Heh);8+qwrCHxlhqTm@q=&05Abnu|qz^P~?JHE4ff-2=^*8vcP~E%@FX!EICYM zAi@WL1f_!%C}7w=$|L09AN0BaOv`jb6If6SnTUwM1Ay}xwFl|o8r|SKurP55%>o*b z0EBdFhyJs$Ju-M;5_xD7vJmQ%GJ8%AgA#!8;b;gPW;EpmtuQsHk1^Dm0&L3zw&#J- z>J38kM`K5Ipxppa3L($O1ZqIIb|Fx?MYljLC`?P*7`bOX6bhe~cZJ!Mg6z!n{2B+; zXTfhyQL)qv&SSuOxEg_YFd^{;C<72l01GmPeLRJ5s)dAsC!h;@HXtCL6`bG<#uw4Y zlUq!YMgw4rRtuUyx;~UcSB?Ufy{eBA4mPGC%6hdKZUjaz|{ zEsSvSX(*myou_VC3#gwQ+|Rw-V!TW)j%FyX8&vN`(V06I1Z5U&}T20>;BV1@uhC=hIyuxd)a z^sxm+SPnu>0A^VThaRB%B*28^02(1+egvKB zal+O@YNn$>kXY;RPbtgi&W2B5i`?+VNe1wxr|BICP&!x(FU5r7LH>5EM_r+-L$sp~ zHotsOjaQq~0RY_%m@+>asx?e;)htR}t#)4^ zTr1NNZX>v4wz+k-d2Esa*KIzp?J8o3K*_d%&9+d4C4cI+V9B-+;WjP*2o%1}$A*P> z4wAOU5_7!bXuwjXq0V$=|tuVA-9Fv=YS6}~{O zV-u1ej+&tSDSdkViAtE=E(+X+=_Jxi8zzAPdBdTCDmS+4q=H-oZz7Hop{;_SkB-1< z8AEO!j*L4vJ{kMDgGSe)aj9i;rDSI<2V#NEN5uiKR6Bqpf$adra%B%@^g)Npszo*|Qu;K}E#lP_5T zJ8Lk3^`wW-WZ1%f(9_=ccxd)byAn-kBn%Kz9<(?Nz#(0O@>-o*8A78SLhEUXT6!$j z;yC^n_0>Q)Iz)r(z?8XB1L)RZ&CwWq0(3MT(^{jVf~VhxqrWG#gQ`JMpry~C z)o3ZP0u8$}24;~SYLVe!$J(`?K-Z81uMl!O)Oud9>?Q@8n$jRtHEn$c z2$^09)vNcq;j?e_N}j5P>kn+wQ$rxL+9p+YcPj6rB4*))I;iL9jtd$mah3}zbJ%e7 z@v}4KR4B4P;w`f`>*DOl3Yi5#p72AQMS%C8wO-?aKU|->J-B*^0G_i@G{8=T3F7Sx z_AUkan!)zG&d5Dbx#dDhf1)ovJuoV z?XTx(YRhPP{~ScW;)jS(8EcB_;^zOl6@j#afQ6gI2*BWvwTn~S1?7xu5d4Gc*yicY z#ktDTXHUJ3IdgqwNI^%)<272~1_+gDg-PrZ3b={FbeVt751x6jF#_y)8yu!3a<1o` zh!ZZV(#8+ zA;^E0a<@BjsU9e1o*^}8sCY(9M1axkap=SqlmkRd1XHBGz7zF?wxFVNgjx@SP|ri# zMa}fmu7?QDtwV0``Df)he$}peGQGET)^kTd6QDmB!1(J%f5%aOe;gAcbAqm$xYss-Q|LWCc0x*`E$=dZQim>4!{9=w; z0P$!skF@h0z?5>su(h~0hqeTTgSV7r!7SazMnPa>wk=fgt@_TBFg1%;Ca}PS5XM{> z?fFRrvHqcIz>%)BCnfe99h9(fiz`eRfQo!a*qxj8*roH*I31kR^oOLvJYaUuw;(a3 zTqY+67j*ChTG=EP`%C)aWMqR0-h5^Ax{&Pp5f{M=t-|>cJslj2s&iVL;b*05^f2zvy zmTj%w@AmTa_?CSm*9=pAjG^K!$5ww75tqx!Ki!NZM$NBI_ndnpnSAbS{OS2dedI!) z*qncJAI+5O*1Mek<~doYvz>PNBj98=+35Z2?DP-c`9^Q#OLmvP{BE89QRc{j27m=X z{w!cA{4dJ<=H?s;%8|Gn>Bx~%T;iQF(vBmgIFg3{+lce>OCtF=5{M&3I1+;Y{CQ|@ z>A){2h1A|iM~)=gNRp29)<|@Yl;TKTeR_IOQ(KEv;7E9l^xQ~4jpW_`7S%}D9iQ-N zadGbWcozx84UMgN`6Q8C8_BHSNvk3uxSP9=w@={Y^P^)wkWPJLV?{_rRz^-;SKsU{mlzM9BvMOfX65wt^(-&XXXoT0rFd94 zY<^)jCN^Pqc4~EX2?@u$x;ux429d0sm0ifd&>|8RT~<~uCZT}z)@By=ipn}^>6u7o zjbza5Z$%Q5QdU;xks2F`ypeny38vxShmdl*sHhkzr;!-l(8v;r`-_S{BW3x)!8X!T zBZ>IHK)tw|@W>iLG_?Or2dkDk`g* znwpSKJv}2ENwKZ09i5!rIl0A<(*nq`0SGi4_Ay39RnN%8x}dN~TgUiw$roc28&@}P zUw;U4mLTima&>JnW&gm>Hf7$-qBvqO{CxpTRs}guknC6AsAJ$Oke#s zWxfsn^u~0oz4h0BQRW?Ow?8-fq7hW8o$dF(4yG$i$2&Xz+@Alh%6z=53xNm+QRi!; zDIizK=+S_+p<)!J8`7AByBiWurnoo7iE_1QAmm;Ln~~HJ#Cl;Y0(aCO@e7zHBA%AX z&4%){5g{jP@E zlE<#3_TG$jwCNnU2x{)uZ;`?2+`98`W$uJc{SIFlyQc7?w@tcrF6ayk2vswIF-E+^ zAl=OmeuUXcL|iU176!?bGZtIY?$}But0-)J_TkMeEy?#kV18Y|Wa4m`F78EoAk&n4e^j22%53+wht!WY!FjYSxz2TNfJJM(guuD}A7w6~ zJf{DpVkJoMq`AQF`0(o%tsHWs_{^8BCbay`anb3wir4SZ9)P43rg)Hpud-5(yuTv%80;)rX08#4G;D~$M>{%A zR{R;@G#$Sd^?IDN;(nqJ7!lqrrQUYBo-%O!TR*94yLvMyTG7EfO(V_fU9OEY>NO@! zhse1q_iBBTyzw?#x!`NB&J=lw5 z6Fhhx7xd*&y<9Zm_)Q%f_3_6k%7#;5f)Y5Zql5W?_VYe5c99EWmH3C4Huh%%z$aao&o`OXl!3S7&xixBv$#wePp>ck=cLD@etPh zQq-3*?Id5~(IlYbBS}0Yg$m^`UxJd_G@??McG?;q!^5c_ zO)f{va6cq&VV8&+W%cS!YmxE`PKC^vojeW_Kshz(6Skif)f;&x^{5v>{M8PP#76~v z<`*f+^j2)Ft%YiJmq}el4AhJkis-YoSUxj!RBt~k=snh@cU11a7Hd@uQF@Wo;<3l! z?aQQ#p_$%3W5YjSudJd|pS{dI@g{3gNzs=pXM%n|Cm=(`*X>vKT>~TkBne{7tL|6U z@2h=2M8=rqEBE+6|0wg!i3mZh6pT?i$!n4cC~9*4cE8>K$Jm+wL-~jQ{+@k|ZLHai zee7e+ZpNN<$etKvjgn+3Wfsd=k}cU&mdL(FMMFqQDMF|$h02~J6=y!*^V2!MobxZ- zkD2#DMZ`0E>D`o8Dt^b5L-8{Ej$#yl^#^b;-Q;)Y& z^-_p!xR7JO$BAn7cOgb6LZ6q}^WGDMDLAE|#!KPjH6tYz&i90F7lx;wkNYz@+nnE6 zeCeiZtm&ywxWIO?FC*t!+B^r|T32-Tv%9+AEFK?_ar2@4Y&@=CG*#1iJp4}R*^pTU zw|_9%mRIYf7}(s@@ScKi51(YBVb~}BPVGkO2RcvbZm|9t>h+t=(_aKz7n42eFR@#UCDo_DNIv!It<9q%*yhb@VYk^K<@3+& z>SLB7J&PyYI!4l{&Kqa>4i|qt0gUW(6@ZjF+3P;r-wLmMA5=@asn~NisUY#^ea$2_ zH#Zj7hzk!oPb0-yy;^@3Ts9Z+?OlJ@g%ygR9KG;O?3rvqZbUo~S)1fK8yhBmrRBPK z`ch4Imvx)pt&g&EP25kD7}kVHa>v~>HJZB04&JSK_t;9+3G1!grsJ`{ie_Ktd~I>t z+qR5dTT;1w+*WU~C2G`bTH}1|Q7d+1=K4#U`#i5bMoBwD6AB$cA}4>pCUdlxBSv}C zm0gEUtF_-)whbPfeE;ftW_zWa-B;_^W^YoASgQ@GL6(+9uhv@IYb@=)ITasF)Yy02 zcN_iY`smC&x%F}ehZpD(xdNP)Qf>2EPDo%?Y zagIqKAoEY5n)6Tuv|&8(XrZ<1Bs8?iy+k5PfQ(|cg7Q8lF9NZ;rnVH2euOWYT>vTS zwFRWG^{k4&={E5*`cd@BK*EyA&8d`!Rwpb~!d?M*l?y^dj zBHKJlWOn*dz27>_3E`s=7 zJVnk{f(3F1f5Z~J1(Nt%^xH-NkYg_IxO9907@C4yWe2{V{B!^WAN^S}P5|ZzU@!%C ziv)qFLCnxB2ms997yk-z6(C&%OI-ULbnO6y8^+-ByfYy z;(Q-~{d6b2^!9wU+x#QlamLlBzq_c_b9?nqMV{^>LokSABot@tMQbuxdLAxug#IrX z4rvBSpg|Xj;D2x+76&qBfVIXT%JXM6tzfY72uLD+B8cr=krnPsaHDJ*&1`?VLgOFf3IA)zZ z*bEPW_JMrMkt`U9Q8^VL1E=vUknQw7os1mW zhXYU#QcL$!?+kNkT3ya;&f1kj-*ZF%#-;-}qy`3ULxh)N(C@phf6zhCV>3SsBoA37 zOQ(h*sL{f2rCX<@+mC4eQF$D-~KnM@e3uf!YQq0>8n0+F*HCS0bh2 z&}x<-5i;b36*>zCFwnJkv8^0#inZ)gjoI_lnZ2|+VkdlJb>00snR0b=FRms7L6L(tyGfks_GABW~l z&4-ld7oj0w34}rx9PC>_uPp$-DYzk@BjZsb83+|VGIEr`K9dO5XB z`_}D0?{6P<-^!6gSK` z8`;>~yCJtxFUmIJu4v-`p)LrR_J0MRKRZpUL!VjvE!e=iic#L?+DW8Zjmn)6U4U{`} zx_QcPC$c3CcA8(*qNH88^HaxrC_yAq_wRQQRTrs`Y1^^W^&jm~t(WXs;(1h?s{2Olr z7_IFnKs5qhjHxVt-{B+N3036LE^f|x6dH*1hd9DGiI8JkOdHWXNETp)2L#9vt+tQ_ zkB5BeZe*dFxIxtjSGTaAz9~Yj@y7t}%dT4CVajtR|g>>HXzlAnxMP z!egk$-{CmnA^(ydAnVx`HXv&Y$%98?v+AsmNMOS;h(Pl-hEV?-6mUBJV#wp6aN7>5 z0T5pgfdG&jmu~}OU@v9^ARdWR=mZ&{?eUPu-NV=a4xb%C<3$Fd<~xJ_Qm@$#wHHAc zr{JgO;6TLlu(ct~99k+2jhsga;Q*KEXMQh7AQ#~1`{h;fFKXEsaN&NvxzW1Gr{`q? zy(j(74;f;EP7hyFTM6@8VvCQYJU#myz|NsPaH!$p`bgGaQObL&;pyprygt|YeeK?zIsN~l%zLKdKTN4f z(g~nY(-XYkU-FQ9xHG;5#w@o$OE8T?&6 zvvcFGyuovAJ##NV%(?k0!1H}6(P4d3eP5_%`MQ8b#}q23C6p;^?kZ>kF3(uJm`f+A67viVZ&a z_o1pm8_}CGCGYk4+5D%grz#ubFQEV^&2PGPfH8RLx834(6Qxwq&t}z%9zPeHGTb#j z&MrR=7%u%Jle`$~zNqQ_8GB(t`OcTop)VQ>Uu;3kf=0`4S{9P4at+>>hHj*6x|Djd zwf+cjwf=EjvvzrV@S~rL;>o9_F)F97LGr$Yl_CP?Zn|LnDyE+w6)qD_lwH`@?)@^5 ztl(|=^y5pHRU_T64I`_dAGt!`A10gUeuimYNmfi0(hR#l>V-_;D}Q`P4&WcO89kK3cX9wDrfYtm*Q&?OUcLH` z$XQ#-HD9av4h$IkKxNy172;pN|1(`DR+{~Oy1wPVhT>fx^v0Z> z*l>|v^D)D7`fhx9CH2kQV6V-1jbn4)$k=AU!ZB~lbHF4ZY74cwaWZO?ozo=3Y7w6@=U7#B0n{rGsMvhPkvAlCpL&wtnyY z)8@%f8$O5cySAjwpQkwY7I!hDQF~{boJrg#EMME&@i_zye+-=3A$%C=@GPNYyBp4>_fPIG3j#?^ZneW-x^<> zwE}+IT>7o%a!|wRT>Ax$!!opb4(72w zczU4YpXk{SQh_Vvi%a?T=xdi|URA9M&aSqOJlqleI*@m`?((QqC6`H=lgP|FfRHpD zw?JT0=GxNkX#4<;Rna=WhPY&wAuNCH^Yn%C;cRI_Ad@neu@-c6Wm4uEfi{KzQRamw zSM19SuO32$oL7ky%~Y|gA-rFmDy<9uZ_501&ow4xzUJPl1w#hMxiYMhd8PQ{|GWwB zPr7LOqJw@*`B}Q?N`Hf*TH|0R`S+ogh|~7$qga@6^gh=YQZ5Q)+*`koTkc7ek(w0g zI`jGo_;vMZeUGRUuQHEuzCu1!JMw=h!1Cjr$i+*+!%2osy`?$Z=8IjHfAU5jo(~v# zEHSw!EZX{UskG4Nl4pLE&H9I)1cbPEK=k(Ph^0(|_rJ?~>mQz^i2EGIAN*X8F+K&# zoaq_i(ywmRe5gb_r!$QlV8g>`{&m`uYm3T_@3|{q9lyzuVb_n4kHVQe7n;p_dT2Dj z^7QYXja|nAejuxr#YHnq{V9qqi?E;>|E8<=?`*gX`{@C+*<0!W*R$a?X?ZKr(c@|ZOFEi=YMgC(wRkR# z=heLWSrx3_I&Z6k_EG#ryUHW0ml~$x=hMfBR%|18Yx!Uu@{Y#JFw{u{xtndxmbXu7 zI%zQ}bLW!||0iXh;N)~%>P`JktO;K!lQO@^{nNxg;s2)0_uhMjfA~2Pl5~G>IQW5! z)-<8}|BEvBNjQS(kSGY*E+%Deq2rr$ERebC6Hoq+GOzCPOIIDz@xOk2xy%2CFOO9_4enj1C1%xyefg zC!#n|msjr|u~P?foZE3iAytBYB$#NmMeVn`3w|>p1qP1uA(R)cr>YvCxXQDNx{~HG z-CxhupkSUjZ0Ow!JHlZ!)Eio=sK9+P3!VW?snpQudsFeb_V9w^ObuW zSTltdQ3NKUCh4$PqJ37o^v-k6W5K)ix!x!Co=Lr4y)?k*6Y{fz4-ktTJ#~CFyidIK zLwQ9=g8Yx0Q3%Zb{IOf!`^#~1VpWg6pBs*O&{J0Qqrf161q2g%>&GJ~hDIiTqxkg4 ze+4yzQfUf0;=pg(d3~v!lj zP3Rf=sIy0!239Nkusmd#7lot9c|Au|Otp8~;bQrmpC4s`AJz_UVKsSgu*Y?pitTOr zCk->K=|s43B>*O(t+;~6(liS22>DbhOEM{i#l0V6sM69Ee#u^cY={Ijh7d$fffcMkjS&k$ih z>q1~#Uc8IoZ1&p%aCb@vZ_CKAJ3Z3}pUioplqRd&J*blDlwlhsDO~*A#?$CX`sRp% zm6Dr@Eil#x`LxS`!f{~#K*xfs&J~&;tgHbnS5bg-s`kl9yZShul0^}U;gi(YJCxR2 z&v=(j(I>1-)f0>3&HVLj;$9R?@5uNIkcBzk(vju9oU)jET)iPw5V;LP-NHllzJc_t zz~D@r6}uM(%@qukh#^l~ixhF=vj9jJkCoOP6U4D*Rjk3!5NprhR%6O_#9bufCnQ0-1aJqz*TU6-2%?=X+f1c|MzPE?xk0jmSw@O*__EgLPR{$UCy z7k;Cggen`r*$O&!3gZ}c*sYU=@=k{eWsHNd<`i?K0o0!?X@Nw@QM?rd&>2HH02rhI zJ;VasvGEwW&ky7h`>=kuxX15KcBs7%3o@?bMxiCZ zgD;f<1J;=ohHEFF<89hS1Sk=Hz}~5I7jG+OG23BK*6a=b5@&hdSVuo9Jw0Ih*@LN2 z)^61cr(^o-a=v*_)x)z_OvnB_?o|nBc93X_Ytx_EjK0+l|GIvjeeu&K7~jM8yeU-f z)ccXZJqZ>gRa4POQp&(_DUixC0Y#z6AQKtcS{q@G;DtA>oqdWeTc+5xEcO`pry?8o z-Wp}(tb!TcdywYy8eVhLX|cTu9&4tFZ6Vf&{$(SoH z(UrSq-*$!F#1DYRbYWZC2zzXuLZ95*O0>4lxs8xu#rvJ-UE4g^drlclwT@VJt2$Ga z@`wpR6RGBx?z@aO6$~ZvLKvO`ScxooHxCRi7Q}9ZNlX?goMMaX;KvZYOtX`j7jmtJ zRCd64VnOC<=g;OFqY#lZB&5%(bmOIe-)Z}LGEr6_5!>b^We)P}%*PIV5j)SZmqLK3 z03Z*Houe>LeMF?T5vZj({K5U4rdyQdBaYThaXN$J26N^YQNkk6%iumtjBdFh3MK^m zAq$Y9eVkM#dt~BJ_#gg=VE+-v^a71%g z;nd${-PcrP3DW>AUDCzzn*vJq-W@rA3iJNcwO{62|1wB!>tSvudPR2*1MWc|m7W{^ zCP;;*Rzv?mh{j_k$In54%Jf7Cvf_x9ag(UpKd5=pmK>=&k>35yzqiCxx$H-`59`Bi4Lu58ugYKV9!;QMXXEYhz8KqBifYL`rkkRgaG-(em_pclah2 zOx8T>imHw+i)94GFbi_L2Bd`(g3g;@CqOC~CSOdsS4$IHg`%xM3ETsEN>wb=V168x zP*Y#~eb9$(=xrf0QEu+WByp97{GEk7D$P#~36btT@#$rb2Zy%bY6Plu0`IyRYCm_Efy#}L$8^8ZWm?d;QXTKvDI0& zXJKCEfX<-vgq4kEPlcByW$QWdrF_1oC5FZ#SwmA0ATK$Aco~Lr{z$CpaBmJ-9f#z? z(PYrJ$8u{6a7Hxu=aEs*Q-Ytd$3BZSkm2nj+ZE6Zw(bqZ+s4^KM6)QMU?|Bp_3GNQ zg!UKqpNmJ=UcQdMD?Lq~jIy&I8@e-K$~j?jmlv6vho@~(c(D{Tj(kM3vMJZ3n+pI| zBglze+c7BFLeq{SKw-%uTf0-#%=FDrC0JQ?pR#Z)^L}x1| zWlv89Y5X*k2+E!Kt~volU$OM{8gm(7@4JiLnyyI%EecQ2n8fCFI{@cw z=2B!`Dq{%)tX$so)u#HIg84B}z@4JPEjpeLiQ^j=HFc#GOwa^e70urYHaO21vx6hYSBCgWU1<)^sBd=-EmCeURJEn5Z zx&rgg$u;A;TJ#H|;wEkVPIb_@Bywa5?o;shrI&3E=6t**DT)Ps$ib zo-|W!=&{a=jBA+Oe2J{>aJ+vSVvS64!coSppUZ~3$=gBY8PuDArp6a1fCP;Sptr%u zRpFl1S3N0=#}fn8lJy9Evh`m{(&Tu zMl^pjJNRMl>PHV$4 zd(AFY!kyB_82Hxn5idesx&HBM)ze)*^3QOe>0D=K7T~XiX;jgO|~aOK{!A%;+-ln9XmhAx#b5cH-)=X zkCt50T>;3m7i1}II=0s*kG`;f)p;GZpm#XW0U?1ts`2#tgT{Pm1^(MIpFW@Vmb^+Q z)pLK?3tK3^H-}Bd3MW&j26YJ#WGMPbS(vkHSDYWs7`p z!20kV4ft#ohy;zDu~(V$)Fwece!@ft7#R5ixJBMR5~`C#={hrR^X1_B5)2+7?RQ3a zXyH*ao1A?X%^k$&4hEGc_6h-*Rp0U8R^E^REYHeGJ~DwJ&!qzuAO#5w*YhoWVB0#) zWFmOu0%bA-Q)(6!Uo9#JercPgjI{eHP5P-EzL!F;q@b7DuuFgKNG$pqM;Bbv6PM@R z)W4X@qTLUD+dQ+=jeJ5TS9O*+6a1J#y)UkZf%d7Zm-R{iO1&vvR3w%nj_;>cubyuV zCWr;-XU*08df%}4T*(pYz850yot{GrqLv5B z^3%`c`zeU6UejKc6YvKC{#Qko)Qy&Ot(LUJ8no@Xnlk-mGgn?`v2~X%UX@){-h16@ z^gT&-2~<?sN)fpjQi-0N?(*DdYB^J1Bw3N+`bJoC#08PsRQDpB+NQ)ajoiXu!*mmKl+;79(h z-YkKW{{@l{_vB#4Yfh3|ZMdz$&b3f&`hv>Fk`ahM7zP4BLTF|&71*r-)KNga-!GF~ zW~0}&`Jwmin>5PP<%lJVjXYp$zVZD2#`d4gjjxRx-#bJ1U!6~$-hSU04(bZevx-Ei zMzHAbz*o+Lwl>}1WX!#D-;F#$3npv-?Zj+et(v~GE(;Cvc*f(F*57a3R--d z`!>}@qwwP7uR;-fLB=QZhE!(u)+$big{-V{ z-ie+y^0fDjP&-DJ*ALe?252^&zu+38Zgc(2=EmXz*;D{X5!vJIrUs=%tKDdmi#ezI z_iI+NLZsyn6QA=kq_s8pEA3Bj!h<5u-uf1=5qng}A7efB&2=h*LfYkg@RMYGf!A&O zwpz5F2u$D}AQ)3G86%6^;sg{$=uS)0`YDZ7FzK&~+|?@6?M zA@4KqxEHbqcaI+^wwzAcN@PA}Ad5;hNd(m-I+OyDMO7LRC*S#APM!xPT)s@9AJihq zRuS5iF5rP{YNI7tZA2VCyscStIRy!-cS{xBqCWZsmV87jxqF31zEWq5Y&}kIYx0!V zpcC*Qy+pZzClfUHgX-5vUMosoY%C* zRTBR^4*rgbf2a~7cUqo9BgkB;44wq=(QO#nb@*vtYn+MBj7$L_i2Y3?T|tLN-CT`- z_UUrNGsvT7S9&(fmJ!St!{w%w%e67O2`I|s%H)Wu=mY{l)tsS`42y(OWH6Y>-kIvOmW><%$`xXKTfI$Tp)FViJv=G@09V8&o0@Dj$DvzWk*{ z%YOx&=B*|w5b81ZLK?tmiA{=egWYAyo-*c(5;(ML_9FXPXPfN#~qU=$6j4)B7!*=P0%-=@^xG z7Y1;wfa%{qIlXgW=z-$AVc_A4YsPK0Qc0Yd@nF2(VTOPoQn6R$}i(p zHOH7yt>AK5=U8yL+-;lK^28DuGbFw+2%NQC6yEzAU-F<3PsWEmWRWWjyjxpco+y-t zb@UyW7ZGD_bjfwiFRT|K`fSZZ5RR9HU-I2eU{9fgTA<~oODI-A*j8lMj4hITQK4;mQMDl)Pxp+h_S#uNwOH za{*!8AT}yjeia!gQBMw6jh$yu**T)lSLSjDtd~W4v(%S9hkqZt2aXH7ho2WqR6Dv2 z>*#D2G`xOVYp?$*hvwRI$f(Zj4u4e??PZB%edjV-+!w&wopldwRPYBo{ z7$Z(=jd8eKzW-3yO|u=p0S3-D00Vl8!{yoyO?dMrp|;1GQ^Eq~E^MC%u2q;3Ero!t zH)VJyQRhL3me+T5XhU%nt~Fx>Yj(eY>=TYMD?c7ZiCOwCUVghd#ptgDnuZ;a;BKK? z7)WyG)(ps~x1=Tw<4LPoRFD}7pk>kV8EBA^CWZvQFd!qzyo$6h%J2v_|PMZQ>BcHzrG0q##L8CVPTBFF0?yuKt8I9Wr_ zDKSmNU+_oQGo!<8MLXnE=z&#E3&kl9(n6I&Y=O01x6`7IDyXQ-WQyo;NLs^y-}5k8 zv~UIimbg!i1nZJ@RqjEf1rk~GbkXVNbQPf}0l%oT(Bv4;&#^+m(k$ zeNn$8k51rFw>`BciCNNlNl0cC3_Ay^aQcnSwzoY7-N`W#71#QG?<1v!ru7 z-R7FXYD1nf!_An=z4otomFL5udpQ+MM9QRC(B|AV^*kPd0KzFxd#?Pv+z*ejI(M-7 zMvnt9a5DL#4j~C?OXmE`JBN?RvfgCofn&q0nf$keMD0g7=-L;$?CzQ-re^!`vrqe2~0DPxXNa8DVsOpp} z>k{Z_7x!cd^eemgW*EP&{(BJjvDVS+S;2KyGc{?sC4c_bU7HM{Mho!++a*DUhIEHb z&zF?2f7V8~P~MkX$4imIS#e+DK$q{w^r(CZ%IbeV0OILlz>RQJp89#1MpqxlHC$rS z&c`MlGU($)I)C}sET&?~$**=R331fF@Z8t^DUAm4c%r_@t2Q5tSZGd3h5DyBg9epM z$k*%gmpD%eSeRhf3HXvR%dKiFsNWs5Ob^mG6ohw=xxGh~V!WNvn^*YR;hRD`gMNFS@J&VZE4cIwH;i~LV? zhHmX{Wn7G(6TbCE#&3K(JNNN4{IDyF7niJjjifJ=pv!O+tH`oBv5dPLM-AurQOfj! z8y)G6(Kdc)1MaI9Zjx_qH11YGFkcbTdgB#`7i*3ed_zBYIMLSlv*BXTckd&;>8C1t zExA2wfyVkXHEy6{J4nTwaG^?MOXM-h%hHoXDSk3(V{P%bc;1wJHh zZ!6Y$XRXBwgIWaT6rj@vk6lapTKF-8tvtt8(%Jd0jO$`JNs=ez?(%g>`TV=`J0e_p z6!A&`il+b(enL59#D1Ryo@ua8%Ly#DKrGZkOB*g&nH>cTzJ4r`o``1$k~o6_wR03xe1)dU z5vzf{lrvIFO=yYmQc6o!3h*N6h#`Q=MTO40?nr4x6AFGDPcr0?GV;5w3r{jaLCqx3)I@!@OoLh8WsYW{+M!a%#RhDK zD(x%%GvX_(x22rR{nKB5){ge)EnuLh`=IV7?k$xWiP9Rf$tIJF%J51BvCnuj8B;Lc zQ7pg-HDJb3q5tB!dZx7cUdG8B8OOOZHj~*7%T|J!eLz>=DvOzv86dPqVbNqhqY4%_ zKrNb#iN*7=ONm;6p&6d+UF4-^rdXAf0R=Ew0G#L}xO|4_?so$Th;|(TSwDvZqnF+G zD|9%Zst1y|w4`8gWyQ}$Rd0lIn2eJ`m8(!dSdQ%3vgM5U>g%h4q{?L-zc0?OWZhoK zI`3E8saM$sE)lQ6!lJA2d4Xq*R>B|3Itr{@=>Ke47NFrOt@MI!afnv(E;LUYj48Vt zS0;D4I_P7ZgJ2{eUP+Lv_C>{0@bw`0?x-1>0FCEGv{U5(JbLb)DK8kFAqZQ&r^NxK zXbTgO{gS{SW#gWE1jQ|)A7F4engzc$AVbUF>g;%0b|8s*iJSsZN1b4r5jI0b1FPuzVCW)v*Tej=dWu4`fZ#JCPY21BHi`_8*gPfq?>4B4{@gQ-d#| zf6b+yWKLyofXP?)u4jFdzq(UP9;(H^3@PEQP5&Hn%^I7hpx`+Dl~7rG3PrJ=V0h&K zRvF$1Oh1AA4v)mUuqE=(rQtslM07IUcCCOsUkGt|_2yRsN%jU3Z&UIvbK+b0@al!# zl?3=|7C5Q#8rE@3fqZ~x~@s@Y?IJgV!UFP_L2N8Z3Ws4GN+%OvqS93`S>+^rLX4RlS4%Y zT%0 ziy(e-B>pftPmKw+v-&r{uSo=AFx=t9*wI&OcmQKn*Qwt8l*j!iEM_5gWhw zH7?Jn-N2}`oW;#g$}NByVm=U`_%I6dgIije0w>g8#M- zF7`qH0<05w&S^NRixKn~uc%pMiu>{ETCnIYUXIM*^)Qpa9jS0^9U2B=73jnKJ-WwP ziDyZ~dn7ihNwujz3pbRzcuX%5H~vHI`wzuuJCo7M*z}!a-3+l|itq$k=&=L#hPomr zS#jxy@h6Q`gQ(jD>Ix}+_{SFwUbp?t*HG}0W+hr6%@`ticy=g*$CfPH%s`xJBa!eT zkNbGC`c_Z$L(u>Wn&9%rSpaJS9wu|vWLVt(;bsOP{}MnGE`aoJDQz;XpLyPt9E#(TIw}j)K7;U|I><3$dkgfn`pG# zKi1Mel5;Na_*?UnKqd(8+IigQcyDk~)8S&{j{3&OFtTk_cl;$Yn@&9XDEd=uyTOAx ze}pCuayCd`L(}Hs57E8Wmp?O+0M`V8PdWpr0Z`bjdnf?7Q3i0D1eDR8Pv8YJZXgT# zn6|jbudE=(5dp~n&{e?&kmVBZ;q!LkB~jL=6i{9a*_Q;dyv!37yVoiy9K#Gi(?lIo z&U%Efo7EIVCI+i^hQ}U{O^>mX?t{NPeswkJLv}0FH?2Q<|8`}O52J`^>+rYTkgE>t(fjx8rex4WY#SAbCybXy%<=^0~o;IBK9R% zzqK4DhAm0DpNOzWsM`N?2JNQe*pf5bJ;xDW6pU*%r)z5vIu6Z;q>E7o-Rw*7?)|(d9ZXQ@B{^`1z9REB8@MGv%&^ zUe_o6o)mKR3fH}aq;ealz69q-_beIr`WOzQy~iK&lgJ6ve;(^w-YHhQd;5Setq06M zEUtc2H)2u5$tX&{Kk!GdCS8yCw;M0=_r<+GgRBF0q%s~a=@&O$9-g5?f*E{BVCi$V z*-EGB#GV&b!TvM_K0PE8&+tmaE4&ZA&ikP5+dzLE5Vv{OTjWYB1Zb;!gtx+fMN@&W zt5f6O01<-B)OUolzW0Cu@bd4)vVZthGVesshoi0(8_SZ{aiyPr(^(aXYlfw>zr)Q8 zsF2y`QW+(jy`La>Nh^>q%%THKo_%^`C{_80HvDgH_TPt*{x&!%v*h!P&>E{?|fz{v;)zKc+LlQ+~PK;m^#oRs3g4%^?mEq3>Ao z=+usCs-S-B=C!Hw^i7*T3C&j@Z~{$)q@4uaUolU9B^+fleeGL#wy-3i9WPQsVP$;b zLqb7j00+_pmDT6KMp3qLVr659STPVv1Vs!VUa1d_!uLriqKYuYtUGur+c7kTM3yks zwpCyT<bl5-DE){Fj_q4#r`&`0Odkc5^uOOipt0y6@P3QP$I3AEEM4h8-Y-#la$=elotheSuNu!TzGsV>@tEGdy;H-U=m`al5fHWA*$1 z1*rqA!n9Q@45dZBYvr?^z&h1BFUY#G;TiLHEj={RW2r45Nl;ll7Y4xRnE_12r4pkL zfZM=d`c9+ROgRKY^;AlDWyxHHh#7@i8WthzT?5g&FI=Z zi74P<+-;^+uIkbnP{dS*_hQSAjHG8-Olyf~|xyfLzQzc!2YRb8_-_g4R*iBN6jzu1#EDh93ULtuQ&4!RsR z9btez8ai|IlFF*Rl%b{uuf+l;Q2;56FN}8qEkI9{xXzso4R3>!=ak533!eF`9ANtX zT{y66#syLuKS7~Jmn*bB=LIp;htdS*=|$k?)^g6?vDca$M-|*;%_-ZrvL#e&J1S>> zFbpO=;#m(f2Jy8IAkX@>mz%EaYm5YHksb+rl>; z(5yu_^tnaXHQt&zlAWE*ZKQ9yu!`T$GkcFwq_-BS*S%>QTWn`1j{^l27L#7I21yd- z2cJr))JW?~4G=b3<269eZF?(#4JKRHcDR1H^gev*L(IZ;w~ujO8>T*9*&cQKboKZ8 z(bT5|5QqCbg+*n0p2lVGzA&gwI|HDg1yojiy#S2NBXD1ueoT)^q8^vs_fJ=5z9#5Y z$@x%fE^GhOL}sMT<4lfS<8VL$t93aU%(4HXslZgM`*Uutz&s~wRwtRNiNPk`QO_HW zTPb7B@mMVql;netqqwOGsq$h0Kt|Pa;T`lj5*Dt{`gU=lH@??8s4e`O?#6vubz#88 z-;ZDTq5vHD#o(cem4BvTvT$R6Ut{cA-5gxxBV8`~FO=Vt3xEni3w%*8L&+D?l<_>_ zZEr2^EUi&`__iR!~84D4@Adxx)*;`R_vVIhEk=k)SOh-98@wqsHp~i=RrJ zW)(xrF7XybKg86q=7<3w`)nSScL-9&Rtr-)JvXUYO)TLZ>%316?p0(eCWHA0PXGFv zZlo9T{Os+A)$@vxU70@{Fi9G7LvXC|L7zXP>_@ox*pkXObkWkvGW0Z?r2FQR4NKM!j=wr&%4hQQFVi9~04|KS%%bH+eH z3ntjhR%qGn33RYUG7L%t1apP_^#>3fYJhlznnN+FLg47R2_7VCPl=S~s%?MP z^Xs(gwN%OySkTW>Gc@viy2QyDsv_@@)fDatlYJmNo7O+J)HX7QJg<)@muV3-3Lv zQ6>P0p?0bQPOm8#>_6vtoMo>XjDg2s>AcpCXfw8QZZ z4FZndx@9rCoOu+HZy#thvHqTzzPw zdzKJWc-MbP!W5d7#*39eVRqO-zt(# zx+JR_Qj-uF{s?28zN5i4_g`slKCNYZ^5mq{#?{BAz1qYkE9M@;|w zZluHSmL^d(xLjebHu-EprM#?{Y;%Dk?NV`g^pD~Nks#gIg|9Ak{wV!#{Ogm%ac2x1 zvI~HemHHsoXh76@>wocdmjO+NecQmV6>Q{aBu674Ez*vVMi4l4USS;5JXZM>6AwI?tY&8eZK7bKJ2=79_Ro6I~2HpRgg5k+hpP+lmX7=DRTo3 zCc#H^my!ah6Vm9_{`liRDl{@hEX3QwH_Vod)DV=)yD!zDq@gYZN^0yBon8DJY5E0$ z&{&q-snT}%zB(yOB^cnnhk@#Kd}l<|9nvqmBzvUuR2S5hfkqzD%A-bjLy1QXaxA~$ z!l3h>?~t#Ma>82YQC1S!DOaZnwJv$@(fb^vcZ514T#zDspTW(9%jia zF!e$-q|!|*XPJFFvK0q<3;^`fSZLrt2G@5dc=@v-x0OI*nCV;p^2*&q1%h2-{3=__ zFm@RANbyGr3A)5)=rHmd+Yc^g86fhdJMU9@wN8kiir%ib9qS8;VyC(i@?eON$O6d3 zFLc=IuD4N!ypwpGZ-HC2Ga!92x}$un`D?icp!H$%0YS6AdS~uwWmni3hgk1~ffX|C zb1T346DExkl%+tcBRx%#8Vh*gO(KB^)Hg`BuMpy}9rReku$mR6gEwE?>(M{Y~V(K9&={R9uM+f!tI< zAT(h62CyC8UF!KsrT@ze)t7~z2ktKPZu<}{KcSGZtBmFS{KzHj12@? zJM&D0ct(r9GJPR8{@P*l!Y<7vbod* z&*;>6T2c&hnk=~p4SNnid{Hy%TIBjws7gcfCL|r#3WIJ{8Eq8>V}d(>6|IUX^Qmjo`Sr{pao?A{4HH6uJTg4~?HnMm=pqazeb zPx;(BDHjc?dLp?0R_(#7tuC}uH{GHwj`4C`)O)aZ%gu6ZmC-k1;W=Dpr= zBm)6m0o~2wP`0Q1yTDr`gZ7iM6xuQh5ey&_dxCS8lEE=tA<0Xfh5ZatOZ&O)C3&tb ziHvzkphu|*kWqN2Ck4;`1=*4)=zwtbj_Z#R1^IOl=~1j6tvyPT+oe$a{5v;4@JK6E zloTLepylb&M(E*49~_L4bxKOymjJw@<*ONWze~VsF8_V!{Tj}1Rl;@p^yW8b352&8 zIYN?}PQtuKdO4TV%8h3g#&*1u^egz9-10RGZk8roXfe%OmU4c40?iLc5&%tOA3xya z+19)&tB<>;iDbEE$CBtE|I!dKDy8(pTWP9BY3@jAQA!#11;mX0CzK0k#@@WfO|Fr1 z^iG|8;%VAh;+8xWm0pxJvg7s*zS{wwq<`o@8XZeT5z0GK+rd@xn>GAr_f@n*Ro%e1 zkB`0+xW}#0N&3DOs4P5rGG1kINu4~G(ieNSkgJ}UM@I2S`I@vgt+Yhwf+|y&np>v^ zb&`5$EkANWBZOX?HTcd>z9uYGTX#k4t&c=xEjLN6l}s%^c3kI@P8(&cy0xm4=%aJs zC|uD=#(__;G?p;h6B?|wc_6L+(h&j1(@QUGj_2zqsOxRO(0e@wJ1|4xT=Fj=R%g

rAYUO>A#IaD4W_rS8EN-<`)dO`n-O;Kb6c<3Zw!2;VxZX#gVYV-|xn)&HYU zsM0o1I5y9@`7r<4!%uY&%Z?vbJu?vl^;Xwev@vARV<o1RaMR}anaz2f&EI1ikPHUqi$T<5C{HjnGPVr9w%6)y*-vb_ zWbF8S?XK6`-8iw6kg>n%YcE%CuXJLsBI9t!*Fn49LI1?zo{Xc3ucLXrqt%I{t&EeS zuair?)8iATr!tS8`92D$fAsR?QIL#tn6L8?1B2EhgJ&36_*?aAluL@QL^75RhbaVb zWb~*mEna#Duy*ZAc!Usm} zm1GZrO)?ygF7`dw2&2v{_40h&}+ z+O^R4$>oWegsHc8r{~uP64AtC&WTSV6twSVbW4RKn1+On$vp-8jM5a@Mg<6=Gu>~w zUuP0E_DlO!&rQ<6&+X@x;Nb7Z?ZY7bG&@bz9(-S&-$yNnSKx6}V z?5Q8!#}_Gl-g4ssy1ap~Ja?U42iv8lKOH`2P$8Wd^5h`$?>0puAYve(huH zpPHAauOZCO7ax!>;7xm(MB8QDb#F>#vXdby zsp^qfl81{Fdgz>TEX9>!%mO!b@{PK~nNT1aqKJAMcXHRzEX-bScaTvu8Ux7YhS@Z7 zYvCbR3rG|Iwag8B{NJ28;o=BP%Z`wP$u5fL>=(0xCVQTD-zXaAihTw@x$W9H-KTEMXOMG`N z?)WS|_Q42Xlsg^{McT|Ixh zxRg0C8NGb=q0BtPE5J$%i%j3hX6T|9$5S<8kd=8T#cN4-notxhISlFQ!*Vp~ak*7Z z>dfYE6GCxf=O0z%^B5*RE(VjcMbVL<{3<&0$iew0&HS=B21O7M3_xO6K)jd;Orz4Y znS^U2f8atk=3#-$bU_S#4}AzY97R-x3!gP}8==f6@I~e9!AJZ_Thbv1qR8 ztDT8%BkzPkgScd`0YVlz;+Jj9EvU5@%>%4}$U}ov3kj+gquH4%$}2q0mDQ6pb<2h8 z3U+|jVy+IBL>c@2*Gz{JcV_@VDv5y;+OeKp_>S8%-2kRb;i~JK22$D$tLR5 zT6<~?&BPF&F;I2Dpf0m>G>{}5MN5T=u0el0pZ!KH+cDD6@jDV1qOAak6kYUL09n{dJZ^BH?rVyk-a-yzM}>E+o(UlyP>bLvN6 z25Qbwx`X-+p7h}o=t^;1MulP=PcedpklD=U$KY33m@AI7a$-rsdby7p zriG_eMNu%TLh2vD#GMV8RS|j|t0r03`7z{XcsPk|!OQ1hPwU^0rb&%(P*tpOGIsS^ z=c;}#sXPd(E*LIsN8So31yT&II?w{>74z5?y5&h5imea`NC!{NoJ*DZYvXn2mM&zQ z4ni&aYgwh8pTL0u(s8I-#@9Vr@s06VM_2xqn+!hH&1Rmk=@xL#qM0o-5(Q7 z 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�k zXdguF3Dv-dzWMSfe9gg;vE(+@ii))r)kJvq8lU;E1)b?y+pGEy9=Fdj-XSMJimK|nb#SA2KWkMQdYV00z8Oc9jF5~fofEIwyQCYVoOiM^`Tksa<& zTMi;+4t>Q9CE3LQTEQRyAn$!lzFrxD0jOk&zq@-1Z5lsFu*^lEnJKJe1n( zk9OUO>zm?z}+*W+sp6L(vX2f(9UaEj+b)@XcDA*EQpU)u_8VK|))g4uaDqR9Q# zdyYO|4-o$8X8mqXCTQp1nx~iN{eB%YYsCEBg9zun(`0h0_$R?EAquz<1X^0a#)J92 zSILm)eAtp8bs@}V_i(~}_}^|y{+h(M$7{RvG^7y`vVcSTl=a2I*6?mb0#$dUb9k-)5z$(XU4ICSc<=M`2{m}# z+7|$&Jk=~5Vs@5)(-h^|4`yhD0FA(?RfLY+Gt*PJT*E}$%i3ZkMdD!6ap=Zd+>^A4 zxqB6(t;mD*fUb-;9yzAA_xZY65$iv(=-wduv(y z*YY0-Iz?1`IRX7ViDmNy$sQmLAA@9f^>2Cak?h@g{X5aNW_`!2O^v~GKH)37|MjD~ zjtT1<%huLuiK~>WKYlP^Z*QAH3bJ&>dx!mF=Ka~dpp@~DjJoaEGjZ7Z<3HA5__`cG z5HBC(35~M~M#Kk=@4A$U0CHwv)gmZJ>uYQ`n5Q6IIu%QU@^MIpQmz|jiv?5&0rxk9 zZ^AEf#0)6IRoAVf!f+lyqsPl19`7o6NzmS;oKMPl0}^k8l1u}VQ#5iaq67^#BKAYc zaC-v*T6PS3$({jg(E(Ds_JDI3C-%82^$U1P??-|BJf`vNhNt@)L7H0=t<}MZg@McQ z!647`_VLSHv8x8mRl8M-Pc=kahHv1>Isymh!SVw*0bt)>4li2~%{Jlp5?XnL$`0;Q zo8~rsT*?;4oAL}Kelc(LB9R>~N{VHY4bjK$EZiz@pYv+qq!{*l5#Q!sM~J&H+Pv^q z_3kpb+SFVlshY-{t;$z;lra%|STEQ9?bcM}(S(Z^?OmOPzmoXq9iZV;wFF2pi-GVj z3OldbVXv@o6cXqN21sb>i#%3mO5wy$IGZ-OI?=xen{?!!WO6=>_O$A7{G$tV%o zQK6hcoD?gE1M{CQ$~Y>LXdNlr(69BdD$7vq_A9Xm7F8%mhZW*>eB(zY__fbtIW?tR|SQrvS4PM6uF#yaF4uB3VFIO0&oot4x zNG&nemIlPT=mF1lu5i{qvt-~V7+DCQ!JdT9aK5ZmZWSw9s1v}_%s0XfSph6fa}5{Z z{QAgh#B-76GjOzRx@Rbmp$6-*+CK=4E;_`yH`lTR9H?VM^nY_fj^hs zc7iT{y8L$(HiH*|20>FkJbzS75g=ftHl%#bJjLW%WRVfvIlhCD8w-8%(?^5=x@fb&?tOf}@O&*S<4UoGJe95n8g`l;=Wr8Z(y8u#rQ zek`~E!W1|X;J=7z6$9XC8dg6&c;f(11t~p1M@PgTU>B&1;P_m*!KBk)FTWNEer(Y; z3IgDI37ttD`Cokkp5?mo$aMC=A$=!^$nx?IIQ@n0SA|`EVc&vt|#*}x*3!Dar$0k)7b)QDMtMplb!GSa~~|I2X$qmB>j5??h;X!nW2mCI6dbhAJ?vS(OTs`?LZh zD9YobtaE?wUiIR5RI++5?I@jCaP;AI_$lQNa3A6JfmO z4!O0K;|>c?B)2#*KElxmi|CT?5fy0}hh**OXljtBW^^N!3?SPD#3B=PQ>CH;0zX(j zxK?2pEBTzJX-RI%SwntK{B1_-QrUiQ=98rouD9U;P@bmm(!8br?+>r$irIfG(NLw( zN4Gx*7~HeNCXqV|%G9OZ#Us_9lOUW#K!)8sv2>Yy!gr-WsMc^yQOf7-m1`erhkfhA z^1ZmykAL~G>ZxPEbPFMZm`;Qc?|bTc)ncQxbPnNl&)7aNn!CEVOOSrWQ>vrb)O)E> z}!-P!bjnv%TK6ZccbNi2&X|v0tTy zZFaXT-OJ2e{{TpDsBhD(6hLW�}uOspwHE0LOhzZe4{qpO}B=N7}s#&9Ts6?>hXz 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

vDbG5d-XhB8shpd60qCx15c#GXpZ)~O0 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 Z2eUP|8lAr^9J|joJ55$Tl;r_b{twjkzjFWp literal 0 HcmV?d00001 diff --git a/assets/images/github-failed-dco-82f9dafea83c36769069087ceb522cdc.png b/assets/images/github-failed-dco-82f9dafea83c36769069087ceb522cdc.png new file mode 100644 index 0000000000000000000000000000000000000000..a21febb6298c7ef1bb6c2c70d9f0fe96c58daad7 GIT binary patch literal 210159 zcmeEsbyOV9wlBd6E`i_{+=F|70Ko|k!3i#dyM*BGPH=a33l`j61|0@>*Ejjjx%Rzv zPwsnv-(IVyYr3m;b^UsK?GQzINz~T_uc4rzP^CV7RDyy+kcEPR(MN=b+^M8bbA^IJ zF)|kuQ1RH|$+`$E*jamrw#`7o--a+=C>c@&Fh4Bz0IZPpLL zrlq!#1eJ;#jGRC=v$(h80Zm9y?<2;Oz))GM@KKHSszC5 zMAH$^2EKnUrWYVJlr&@UbLH+mEMwtuc<#^S92p0LQH-2){Y23cXusY)ro5P%KR4oR zGX!}q^hjV2Q*No=^$-Au(g^aqIf6a%G})?4w8S3eDOBc(q2lS)B&dszKC}CNM?OGE z#%M*l%l?d!CPKtK8Wl3PTU$f5ArQP_A!7RJwOdGPbC`H&6)Y-P;%?@4fjpfFY|r6v zaCTMKE_)$rI z3M1-M41r*Lm?92A!5Fb6o>Uyio#Bmf0Qp&Jb9>DrPlTX6E=aQIat=%Q7vZ`)T0G?v^aPu(FJ^)pg#I~-c}H$ zQxRV$qL7G1Y?A`vSm!(!RE%C`?6Rn}azCS;)i?$+h8XlJ8opyo-}O)1^lcI*LCySG z)x2f3;zGOBd5ENdNbDcvf8a0QeMA?Fb*Ek(j_@N|SUb*cE(w3@I(ixz{U;0=|JVMM zCOX?b!E91A5?DbG5hiu)MtYaI&OrwrKNgFM>fEN!ilLZP$(y%Vveu^7l?J$~;+Wk{{T#L62RoR_Y)sHkpX zq~SE^=bxT8qAJgdOY*wQ=gOCla!pWhLQQZ=xZb*ySQTi;QZj$FTUYoIZPk}zj?!od_p8PAfpbZG7M@W zJ4Pf#`q&+9_KrkK?0pQ;$57gs#R2Y5yfv>EzgdY{M3Y8S4oGbiP5G`!kdUnoWDX$U zh?y6?vWQ&D&Hc}DW(`J9lR84332M?N*b)%K+8 zc(oS6y>5N0`uGYM=0iP!WCDx#ozz$I6V*0G0k$;K8~-2vJ^s_S+)kK4jF6AilfJt! zE=B}wNjzaq@l7Eb3RdLK7^IjFpWekH4F=$R2&Foc3dmEMa-Y(jLYjJ`gttem8D=Hr zOcNA0J*Z@l)cn0I$TQtD;4ywhVKRT=^CN9F4!JS4F|RQ~eu{m_l=xoZ{%7K%S2G_i zn4MnL$7)Fm%C*aQ<>%)cmxD?S5fk`hIfrxGWfC$-EP z%`0~uTLcA@GvrzFSaRnl6edrm*UZ`LB+W1C0+uf7O6v&gD$P14vUeBuY#pf&a1K;< ziDsJfrgLQ`>*qoH=T6{#wLOx__TuHjUlWA6c%|xDjVgdBAaA?r{W~v@CswcQXVIsl z`@&07Hr7B?zhMm44ueDebQ4E>3{)Z%SNLXl5c~tm5~@4u6{;X=9IEMCHGC5G!>@+2 z9@J4OXN50dHH*5U>-alBF^RrQ;;x zJPMkMYxiKM_X^VF6wJ95i?Zfe_4;CVCTE+BnVgx_jx?m{a2&8VvPQ8crBreY z8v~7g)*&_w)N2^ot>i4n8sMAJRcjl$b)R!5l85ySnX1+-X|$`EsKuyBms+bGsXfi1 z%}LEs&0WpiSQT+urCFtMa+PznHzYP}S(`4;Ej=4bRvRsc9L+8MsP?ct(a$vO9O#&Q zPVuXT8P8tGp4+IPTxA=uOEs$B;-tyJUZxv2kDE3&omm{#Jk$nx4#GK|Ima|v+3&rT zdb`K3#8>0KEvKH!@T-2He(vfg?M~6|XR2HR$@aI_{Cr-QLzAWwKF$~R!!FAk&Zgnd z$#zE4{Txwu)2oX*>$)KCQNLr%W47_!!L9tlu)+a{S}+q!;Jj<4xNf;_W}81Pl5hC=msX<+^JIp_^S|(GEE#hzQMX_-box zqru-W8#CKD`^ezlK+1ry`#9)J5ZHe{@J7N_d?eH?u>0F1BBm%ClBh^hZtttxRyJq0spNhQjNvdHVh@%vavQCcDC}VDO==Z6 zS1e&_Z|BDpSc&dK0`lcMNOo4GDe~v zHM}`HS;CU)*-F*B-jrbr;K3u$Besga%2CZJTzs`yT9XNa-7Xv3!$k;T=oQ4O`0BT9 zZ1eRvai!6%+O72*{#^O|0C@l|1x_;WeoDZ6StYEPy})@u`)hv9n7Q}#ocuw8Z zM&CPe7$Ll=5@_A z2sq4LNmdbE(Nz8340NpOUK*+{s3qv_)I%_rTEkg6FR$rQ(Oqje%(u@6Y8e~a9V)nL zI8ZNpX%cDMa991L`Xo^sA;Zl;pfIhVwf$2ysoQU{mE;|7Av)KozekHq<$`k|%cc6<+(6Xex-6|h!g zd4{H52kD{u@yk)r2&oNGFyDlGv{%(}^lElQ5Pr}wL3CgWYJ0?H|5!m?K_ul?WF6N7 zH|ew8OjK*67I8VBiL2F}-Tqm?F9dm<%w5Zv`pfhY-n$|v>4P82#f261a%Pso#7_5z z3LC;d_ZM0><5!-9OS@9%6|T|9cIGG*kFyjZwh!jE{o zsdk43OS9E|TKZd^H{3_AA_=9qZB|E`7TsiA4;GIemsx!1?(<*99$Woejc*)JR9CoL z^`1(nE3bY4fBYix7izj?-Prgc`CW3Hl!3(OQ0vzJId8KVG@WXCJRa#B@Y+KDg%|XU_`GEZumH@<+ztB*Cw07ct3Rj*AIx<$bvyuG11~$7JWS7R zZal6Z*h!Uy1dcMFV=k-DwO^=3$+IlY_ zEUU712M_moO&J06Rzbsyg$M@#wXa{uSK;slY5_g%$#Vd8O;z%$SO1&4D++f6ZH?f{ ztTu=17I_=tTUTQ=sABwY3g^DQ&vGy@nd`)FT2Vg?b6n{tQ+;&hULYtEosS5(_^F=L z5#$}SH7}?rzK+y!`~p{W84~%N9qj~(Izo*#q)g=Gpy(lOL@3x-1W<60)+@*<^osD` z+Y+y6pH4-EwsWDW)U&pz^y>+d5Pa{eCkk1I@UAQS@R9~R_v&4T{7-UzZ;F#pzu z(T6;P5>XbDl7d{7jqHt$Z5+%1j;=*HF_0Tbwx2W|prCN6exI+Tl-`{}=+B$0XgF%f z$?_QiteFkI0t}6rU9D|@(}5Cj<%2Y>jU5fhT&=Ba9Qa%XDgNrg2WkJl%|b!;R~JW1 zK?)5yMKUpfy)hXlGY2y(h0tpegM*~+T8wbjN5cxMcAB`Q1?9FW*%>g!Kzv&tn0-PKL zDJXtV^zX+%-qYCC{6A*0aro!5APZ#q{e*>$nU&?=X+wqz{JzVlXzprkrSZ|+8iE;Q z4k0!kE*^ou2K---{$t923{`b7wig3fLq<9Z{Ris*9Q>aj{(azIb87y_oIG3{|9Q&) z^yHr-1z3JB{XaqR51jwH3jtc_wE)Y%e>9=jZ@yEFL%t)C`9}p6$Q8n6zmHc{kRRHA zTp{gOF>wsvp$Va&K0rx*6j5<~b-0S)i8H$df0}gp0SnRJ|AQzE24CnU8mjyTS% zH#p|Fso%aK7JUoIam7TYCxhm~_{gUeFTYE58SNh{A?j{F&Tl}?p0+w_<6JWs3-%OV zr86BHc{Z&90x|``@k6))ieyl)5I;acV|;^x{qLLcAAFS%Wo6cNetil2SN;A;=-n&W z0#}Uxp4`9B=ZnSgt*fpV=-y`c=a={ZS-r2xSedFDNdQEDSl90t`Jf+a z`lt2(?nhe<4T0dW{1;)+{{RAvFQp2qSxIO`|>AAAT1tnmK}>;C}$ z|AqB`x%K}=3D^#FUEW8eIr1Fx{6Omb5c7GS?#!9O*w}O}&Skn-h3@?PI;Tte8AquU zp3{2e+atq0@3zP2$WTsQoujnOc+*3wd`gNY+MTZL|YnKNuMn z$?!)FM9cB2aw-vkl)Mc(bP)UiL zBn2iN+A|rQ1?BF1JM0+bH!qpMazNw58%6$2!Cp?Wf35a?W0`IF_afgma}=`c_PquL z^KUQa;v96vgBgFYS&{^9jDn@sj|Z`TMKW?Zq?(u*fBt&OG=xTxYsD-@Vv;1_&Eeb#pb*ECGOJY^bgs3e~PG zjfU8?d-CtyT$^Hi;MNT7MfN}!&2L@OW`F2q-aL`E0&!0w* zaQns`sA2^(-N_9oKiboxk-`BX%(Z3ERXgl zlfIq|-DtSg7hFK6GS`ZdaCJsM!~GdD16)`~?zCw)^3~{?WyCycv3O4q3gcAc8!yU0 zrRk}`4D2)9J;MIMKiXACyif8{`Gk#|1FNG6(DaG(?OslPeO#)dj>T6qo2Up!6*I>)?`m3?=?9_PYXKl#)Ze zB0x3d8|3!OCVp=e^}4yy*m~?5`5{>TX>Ar1Y_|8PS_+G^=d`~4M|Bd(q+hvG4539S z(OJ4oe95GqNWhJfUm~JP%Tx6J%>Cn69GwmVktAkG#f3@i_>7qB<-5?D>^lb_%g}UO zJIM-#R~!%TpBVK+Hu3_4OG_b)G7SyQ{!%fqlTQ_Pb4yEVn>jb2Z{j?mb2`NVEH`Ht zPmCx_43gjA`y=inNMx+_)j`Fzwd|<)Gg15V$ZX)U!(rSDn~Gaw)T5g z9OyS@9@?eS4AS_c<7cZ6@sPP-3o6k`$l$WipTNA*!pXJYrlzJrazmC!TC?W8rGCL+ z{)FM0OrKmq5A=ajw5!mrnQR+8X52rBOH?`VbFZ!>w;VZ;stPlEHU0rp$pR5VEzJA*z zz<1IiFjQaE|C+7zO<0bIU34)nJyz6+W>j&G*!-1mG36?gHp8D7>l+;e3OE$m6U(V+ z_$wbZJ3%7n^p59e8spUk=y4}Lz%|EcMT`-(va@r8Ng8Dt8LN|jtG}iHpPaw}1t?$h zS1{B4sG{blS>B;1&8J};E*tYhE!A)Ul75$cS7UVv3HWy2XTkp;5Mq7AQ+b^8HitIA zGbx#hp54~QX&cbvdP5hmaVKI_%Sy@3FPHV*6 zq4f8vie^zn{32nUUnl@{46l80o=9~f1gQqOi|g+zHX`F8|4D=D zi~fa$^0n3S{j2@u10>X=y;|^IW4+JhZ15*@euPr=l{J47pFG05M26BCIR%A6b5d^! zyECLAE=es~G+%QI3;Nk&&Dod*+wwmyrB4>hw;0v8I4%ymo%irfi7u0d!h|gQc?Oqu#oA)<^J5ZPun4N0BwzMKIH~U>0R*X?o5Qyv=VX^JqBDD8>8kT@kY3cx@$q)uXD)$;H}i`J*lg z^@V~~CWKLjq?O(bP0KuG=C5ZB-2tbFTc30F<{!oJ@$v8Gn8x0O(zB`t<%5QkC>31h zH%I&}{r<$2v^$U>(g{)aj)b3|U-k{VWc`31I2miq0GjpK zoCW$8S69W8VCb6H6!m!=fI+K#_-g7lBJU&=;FeC&Y+j!=`{@T_=sEZv1LL+q*~w_ z0`QZy2om4tQ6dzaNk&a3Wcm~wd};iw=H4Pc9?;ySvidD74w>`D=Nn1ceKbx^$&CU2 zpDYcTIz;}6VW#;92QN2%Wh$4wHLS0a9^F^nn+$4I{B)G6QldgPYHkAz%^zKU&W6}A zB@>eZlgxUCfH%on*oo(y{D%4jwE*ECFBWWl#Jq+~{F(&GC4^{nc%lmP`%+iKmO&wE z^FQDJiMNU&-{9zN^0}Dv-nnY(L*M*wH|KyIytyf=aO3LFS7)69XcZ7RN^3Mc zFSjfaHGnOc3(WVlj>Ji(mi#!e$D27Zy4osNz0=xG=3BgChTTa$(+LbynVi-G`m6uJ z$yVI_?SAmGf@qiz7o_N_>gtmUA200{rhdXae9ncx+LpWP0OIysjA1&I^!N6IzRYXD zwZlw*_s{p#iNs2lsL)d=6iSs#$w{ha>Pzg3A3r!gl!p;T_`KZJ(4Y+;8Sn?iauW{G zSp2XBcq}^E`?KFU(NO_kYOL~iLHMPMy3q+0Kb9tyqlDAJ6Cc@J_8>Z+o@Ixvd{>=( z9HZS6HPgEzxu&M(oG5J#UJ&w95L6=i1X)LM8^9eJpOU<9*@TtCu9pdthiKf&?u}*& zuWQ{hklciI|DZ@eNMU}^w+QOG3<8xF%M>=KP*uh5G)v3KU^|2!=Zr49C|Ovfnq=lP zfQIfTw$A|3rKP3zh~qIW*OhX0Cta9BV`GU82&zap+540#jq-B&BrK10_vlOYrkN&b zR1EHL1q~4Ve)RFOj!G*OVow7Li#oZrL@hoOLv)FdW~p?!xvd}h_U5+XWb2D51A#E9upyo7qYWl)lk+}JMI@p+$f{NQ!*of4lgG2c7e^}AF|LX&o~ zImlHID!lby9^$&{W`N1eg}8+bX*Mfu;wL^F>PTt{#CMEjteoiaRNbdlXV|+t6*@Z% zTFvU?UGWO5y_IwkX76LQf7rvgFt8xa{tGy}e!|(%m`;`HRZJ$NnRC>6K-Ht1)$9{n z^I<7Gj8nyy)?&9msbs1CTB@}-QRDKu_jqR`tj6A zQrWvWDP6zm|K2`sdf>qdQB%u(8?LYg&aY+BiFqZArIQMt$FK6>vz_FC9wa15J@Oe} zF0YSzJ^e-|TIvUTdc@36zr^|$}Mgo)F# z?kvmTyh)RveOxuaM_wv^6`?b?FUWS8b{jN&C^B0V3y?QWJ!xFY!e^k&JF15f+#Mgh z$}^UE;XM1rP-ijERD8b|Ajc#)a(tyUU0ZZEz`ED=#CJa#-yt%@IdXSJ;B|H5WbQS7 z7^nhd;FkPMzt^OHaB~f~S zBcVTpH%XBN*A6sujTtu|^0o^?SAMMCipRwk+dDhkX7t8bSIdS@DE{pCsMSbede#FI zpMw|7k0tRC)K=0QeQo(db`$!BbD78qv>qITQ_JnrWdFjfQ*?&FPIPs&4smjPvFM{? zl0V^f+$C0&X-hr&F*_k0uZHbM;+F&ShTjVbI~jbW{F`-S#N8D*gVhO>%GF8`Fk6j( z6dPO2!Q0!6;LTo7mAazMla>!+MC0eZ+@31ZGS}i1>fN+l4@HzM-;AZFWUU95u|`2e z9^9qUkwQXpJk#t&xWAH(>gK+4jgfGJcj>g9Ja~64?RD4JF;iy;1HxGgCHF%QC8?Uj zX@^l3auE@o-o#DL_|f={nMub2HDA>UnSm7)wyS&ed7tn+U3ETJ-8kdq>bwTzxc4hR zJ|kMcMw5nH{q_E8+CB=YM1J}Yxw)RmZU|2HA0g3|x%`ax=*jl+N#){B5d%U{R93Rr zL&EUQ$w~@=50A3uFX-QfMG}MOy*tY4t!d$;3{zbfPG+V=do|{NRTm!&kapiB+n@ZT z%1NTTQS*|&Y%8O5Ptj7wNY=_tP{#8uzA_1LgN2@^cr6P`8xq?JoT(6rAn*_M*~dgr zv6M++^AHjj2S4)ls_Q!xATo*}<}^+%4^_5RDa6pKWgUS~i#KQSKMD z0^7dvk;HL6ShbWop;%YvvJB_twDguHKb&1hrcEM7YJNBMQUO*+u1&hSxOy(5+w5tc z05yLuVd?Fvx&~o0-k$G#kn$$)aHhzbiCppI2>!NOho^xK?$W3v#B~z-uz>oC7$CZI#KlVgT=m=+R+VBKsbT9g^O?F76J`i zL67g>_~!MyEOmXYthiD%QT>wcDqBq7;s8bGlEALIU>M~qubmC|=EmZvMs7Ecq?jE6 zkoAuA4FZ42Df@@w?u(>zfr0|*A6lGd+Y?FgtBZ?^92@OXv}~CMo(V9=%s6WLL!)1? zQ*o2JF2`m|FV~P+luYbv$P@Yw^3&4?D!uq$dl#T5biR0#bS~x?)zYQO_owH{sXrHp zaifKt%+@mUjcHJ!o1&-AS@6Ndk9ie@&rVwsqW^4tNg&7Zd2E`MYf-<<-O=-w$`Da4 z6T(GUV1{^A&SG^?zK^i6%(^*(gc*vZs(4

{VscE^e~M{H#ITR#`uGKAWl1dl=N5KBmYzFd@P;l!kN97UAt#nwc(h2 zh0lRAyqzHP8!zp_+4ZG3<=Wlt*{`ADa=G8^ZKl{&L^S{twG;e_tKcmggV!w!d_1ZL;6gjG57D|F{viRm?UKzGd#NO--3L{LaK z39<4rmq(3vqnWNgd^%qq3a29DTKSz;sxs0A1rw|Tsv#SatSXb#e{(sfp&{-D(P=$t z=5)33txJd?@ygOI$9BD9R213Fx#NKc^xl#$y#Q}Ak z1GtDIY0$2=yPpD==5Mmm5mfTO!IU>Zl~<+r=>Ff=GLOg(i%t)^YZcYJa-nyL+w4U8SGhWi`+B zd4$U7^*IIW2~(uU#o!05q)HqIXYG(>kAnl5sV7j^Qz4sEQ3j$-^Ql1VR!6HW#M_Ym zSyuP?G0cku^Tb-aa){!CQvx^MAOo~A0=lf*Cp{9w#vDBx#8l=TziqP1fog2W^BK(& zqPHI+2}^ z(TX|0vd+4iD`t>1*hzNp4lLNkli($N(R-Y)o8F1oRw|G^=3-nFheR$q$#$_=5LvJD z7lz{McrsEhP@2&rj8_{Ho=89b!m6jqQU(W!S*gOD|K^#!#hZYbrLO88eqP@_R?Or` z6}SQl6>yLxN?}}WzADh&-Ry#46_OJJEFo)-6ix{ zbw4X#=IM|_t7T4&O|gleK|)tF5=eNZTq?n7o~%Q|mRHJYd=R;MIZS#`&ik?0G793) zChD1K&G?$DS}R}JGkbfm2^oI7F5NGUpK43*a$Z6<=m;$v1{ux_ zB=?pweUvuuF5>BTu1961$Xz;LZijyeeX!J- zDO9^r_pvteSUV!?a76YTtNr`kDk^YO5LCWIFLfCW(%UPm3?9)kpli4C`Y8iM!&y@0X#){ukF^Qn}tk;SVtf z^Wb#wz0=Ux0LDoz*PZ_y_KSZk;Nl^IAmz2J&TsX{ zLoMz}X1$N<{WtAI^h8-$w3bV%S3E}Pz*T+)`m+g-+ zgYpH8ziF>LJ@tWY(cKarTODyP^5 z%_Y4^2z=&j#o z3iHVAQIu_GoBp~klSQ97i|y|5iKLl8{{p~5j~X^!jd!1#XlS!yzEnm?PJ}Obd-Ek$>B&)Aj;qnfnfz1nu@$ zqos1LMgAR*5-)w^k)JiL{N&Ohj?hq2oO+^p3MR|CiKW!Qg9iNDuUG{H= zNsmv7Q!rZFaWjIpsGnQ|)PP4`BV1x6XjwHBZv`F6rS><5P6CGgg;dQxB!y1de||*v z-4lew@P5+`S1^}W<0QD~x$c`Y_*$1o?}u=F6+}WInSl;2hivoD2nCOzmtxJ@a_a4> zy2Zz4l?D-*(y02KZ>P7msa~hK&;bRI{EJdjR>fTU*nZ1$i(_th-iqEEyXb}U2P*32 zn2uiDSII55tf2k4hf*Toub&H(A#t?V69!JR0>c6V2CI$0JbDGe6w@`~DB*0R?t@PL z5G?tOywXxNaPcr9Pf-itr+_`~4VTr3MjY7L-XXt$bUgcJ@|;=+a0ttBy_lI98isJhrft=nWo0S~KFd>+%4-~6C@%GqD<5Br zP9Y8j{zT7>@sl_YK?hrAJQ~c`oM{g!hy-a;X;?iyRHkShqi-_88VAdw@=m+81>N*Y z5Wl_bWqa8iMBvMbw0jJy=BcCgp`j2LEUMM7IZR=!??)7K1Ez$dK=5>Jl|Q##=uWF8 z6D%5lglNz5V~-yoYQo2oYgX14=J0o>hwV#9vb&nSA(=V&`I)jU?R%!y0+QdV}}Xk$Raf10EBZ|=|JoxYiy>z8=@tni;F zx$G-dWj0Vw>0|OZUib zW>osP`ErqlBn1*?P%e2s`lfT`2ljRHWNl}~A|vEX>kS;4k&_NT=;FKreZ*8LK}K&K zx$&2j-^u791R^Jl8I9QFzBNqgQSwH+UBYdzK$U4;wK>ViV&I<61DhO#-|s6+ITW5d z*|VEUHWu-zB%GoJiTLL^1>Chn9l>> z3lyj1&YWtHRJc6#Ti3ZQ%WvMvBWoQ(QZAgSujRt{Sf3i#E;eOGFVxuV^%Jp+R!nE@ z;L1Jeuk#S)Of>}s0MY6gqh>z{ZE!9hcOoBd?w;dakJAgJpIm5^K))P3z~;_cRk4ij zoX4b(^mb5R&5MQB#pyVd=eZw67aBE{PPXsMTAi6 zUhLMteSImd)buM?Gq-(k$Qew5gVWCo?o?H@<=7= zzVq53^|^d&M|@n*h=-QKb9rewueQ|dYq8)T(knR0M0f1HnPeJJ=YP~h%~dqy}>N-UV+Aee4_cL+%kUB~px|1IBlllP4%8FzbB6D#?->4>_$ zlfo1>R}-dm2Z{Qwji|vn-B$a~tAURd(oYEqM~^rq=ux`6-WhQ*R$?daCOZ{G)MqHJ|tAHUf)Uenxry z+8ev&!&=dqttsitws;S{l5y@@AJzR?>XYhPpJs_L?j6{kPKC145u_pD=S{(L#eU%^ zPN5v~P9JA8GWRn3Xa>BD(nN3>h}H3F#$5?r)h+X}#RR~p)0832OtI{J6$4cqnXR*| z2q3shpl5{CCgmhm8kp0Jxrn7ld2~PDs#&*Gs^Rz0_ZbrV7R&n<*WTu|IfXqGSr%SX zRLxM|3E*r(Dl5!a1DPD34aZ2m3|76=*}m#;Nn90c&C;u=UOpCKX@nT|VFamH=;jVn zgd_1gD`_=eJzhg1D))$h0&$2)B<&I1YJL%2!w1w!=GGr+DEoZrRlC3T=i;c|zTGP~ zRjN`yW>H||?N8;Cq-mFd#MU5Qf3W7(L_Ex=9$>B;eJPi1CCRZIo(m6PTnWuIy*Ii! z#V~k5K>TrHqr)xJ+}(=+zF^;|iAhMkL%eQSIEPg&$pc__qLv>#9s(n#H%>Sdx+SCj z=H|m=Dvc&ex!D3Pddk9PD*hU#I`;_CJ}=;|OC z#^<+u$c&9Uxh^OiClqv;kZ|2Va-MFfwrAH^^Veo6HJXXb=B(%Ht|8o zJKcf_s4_rKu}SN4J`9PO>1v+UD*e&`bUumc#vLaph2ZtpJFisf zzGeU&nSz-x1QC*kN>wCKI9Klr(=+_tR|$Lcm3UKP;OJQ2WWrqErVX65j6Ag?TzP7x z25EUCyL-VO?JY;eGHXYtao+7~ieH}MWS3KcmPjpkd&5&wONj2zSvQ!CrGICIl`17b zFSVGQckM3grXU*@Z$TL4cA>CK3&~3Gikj&cVg54wJJIJgN`Xrj_hgG_jwu< z4ZGbnql41ER3GB}PRIzbz1zpH1P}(AO6d<7&;(^@bIBv;mr#6VS0hRHjAdT?v86(s zEU)98ka#k%w{k9jLchI1jm6_hL#{%p#2}i@EMyr*Rw=rgz=b zu>GPzH}_;G|FIM~jN~WgCy)TF4Fqd62}!?Jb&FgS%jBZ=24%&=C^N52CwR1J{SGsu zcg2T&nQj@cyE;p^jvYJ3PnJZcq)1o4T3B!=cht$OwFzxqST)^ z+b9rdD6+OUJ}P+ggxMS}WEaoh`r#XnwK7j}Df^nI?9UcmpKhpBm}Bp?Uufrng~6*^^~(`dy{;ATJ@ld&p3w3q@JJ)%4PyZ z5ILWDDB+PjH%20wW2qu+0?q{-?PRIbGsbn^Z+8}4o^Gw3EunH!;E7zmbd&(2^%Ohn>_P3PO6N=WF>9xWt6D!Xk7o6UGxO=b$HC^Cwz6cH z`wlmUgyrGPr^hu~*n-zce~%$~e%s19te&%T?H_k_7GsrWHV!_=40*%#= zvuYXBDA;1XHhfqt*6Iia?R{qgrUm(Zscy1vy9&JBz;!e*X z0dWk^Pbeu29o}_K5I0m=P-|A~V90mx+6akb`{DvOGl-$WOC7c*LD1}A64w1FEZs;_ zSZA?>+;-Nt_rw?RWMvMHrs%H9p zGi+}%SC=;jGrzwwT~?~&|lmI zMEFShS1xZCd5fF*t`=He)2X)C%e99{Z6=te zoXsrDgs}2-C67qESfLDyZpUFLOnGXnEXo-$qsNe8pj#+`#3i4Mea zPTynG1e3?=G(!S1gJ3tG3~0%UN7-?e`yx7rJ6u%SJf#YkAZM-@a&;y8?8)31s7&Cj05px$EdvWNo zzF_~-VxhXn;SOKm?uENI8L68o68^QcHY1bxS1-C)PA|ILcDDn=8cU!bHzT4fs(97k z%5%G_VPEsJdO6Q&@_CYntb9EAh$ic%p=uN$#)Gy6Vg2cj+Hov|G;LS3=||}Uci`o< z@|}Way~2nApP4StnLwuf*_A!HFaYnIZc7%Dkxlqk!3s0&O`4ex1CGrDrV0F_y=kbc z!{K0Ebvx&3X9V)&WvI{Dj;R=dUoI2&mD&XhZKk`Ld4Fjwr_HPA4}rHfywpP`R0I)9 zH=L@b=hG^tf$SklEc#d8X!1#IpTjH&_l!#`)RTu1Wvvlqe|&Vk*r`%4a@qIM>6?oNbP0_X3)eyS140 zP=^s#RZ*ZbxI6#+F3^rKN~{YSq$xUH24LPqZ*;d?G&mpTnfK6es1Q`lY4CGD-vvd6 zlawyzqwS%s6Gs7%?MUOopW>t=ijT{Kzx8@3OKi^dYAniHy&JgV89SFiA7?N#%SfKV$>Ht$Ei!6%k~qYGq`)O1UiVMV1*FEk=PL) z7WR--$hi<2I;sq0_xEUj@k?!r2g~^yY*Ls^$NY8I8{wYK4IfZO>^_WJ)4C7I^tJm= zM$yl9kLkNUz3ID3dyk`YJ0djOPx=~72y1%^LX-afv-g69ur7hV#d^yP@iFo7rcL0I z@z9K900@=J&E|84k%~^!joFn5Oi}DEDx+}Y{u7+$PP18aVT1OJgM7xrBXSEQZ#l(G z!_9q;16JV6yf|QU8XxeFqmfz-i}5gaS!oh+=ela)_QdS}E_DYSoM-7=IskOfIN_sR zG3w!sR}Wukm&gP;Sq_$q!mSGX-4a3Ae&r#nV#BOMDo+sSXT1cRF=;(jV#>Jg=(J zcJ`e320hd)J>2kY*=1@t)HWTW#4d0H{-OYn6=Y){A~Tegm>VTk3NamH+V~@i1T?79Nd@i`5V;>2`%|^EQrA zg2*_XwG9AapTe_{Jo>*lrB2>Nvt?+sG)=r7Ir)y?rCH8kZU0tn0X^ClV^VQ}Z9;(b` ze}tps)YnlHUe@0kc;eOi_Sd|OjLSvU1s!czF1yjr$1-QU(@tQt(ex~PovYI78%9)Y ze$V8VRPkYmmM_R0AxFbS4a2dhJIKP9ZX6rfP&v8-=a=-mc`KCvX@cNr-qp{6hcjMaU+oTuek|G$}j8d+RTO@N*;iN|xXtcoXspoOd zDcf;%Z(XTE;pdM)M(CXt44q1ko(Mu@S+@)o66fWrg}?Z`{>h2cO|8PpRdXtRSm36n zrB3gH->%Z4{hz$v?_EdU88!9uC+~RfTig_nd4g6NZS~47mCA97_NB=S-o{zY@o_ZR zf^+Q1zgOwqG<+jc!JUh46Mk|CD`0G;AeZ-I4$e4OPeQm9b)*-3f0b9GL!4Xz#1_Nu z=wv)fqud!joa|OFHXRnNb3VYQi2$IG{daDK%io=k3M z^Sd9W;cqvu6M`N&=YKM&0}3Y5m+eJoowI?xKPi$R(%@OE()n0|Ci@WLW>6UHW{|rz6%s_XOdJ zL(;8ee8wWwF`S1zrCkIPM>ilzZ7O>GSDinRe+Rz}j_PG;)=DeoFZqehlSGDt{eT)F zAjfgJL29RQmO`U&)JE)Q=N7aM&~Cab&lWc?xx-8Y>&6SubYHQ2->wi zdvcj#ZEjS^%zn`&%4$aIaiiko?;C2UKv$A59IK3W&2%5o?CDZL1EDPQ2zsFDXx3{j zYG_|l=D4fY%^DQ%w)YZEpGZ27RD&8V2O-s!ydJp4S$C8HJ&S5ThF z^hR(t`~}*~vXFTS9bvoSAe@LCdfIzxKc?D{7IehFt)ted=C&_ojy6Y``wL^-gAVU^ zmi%Fv<-A0-G7+}mE?^Xr*$9c&Cal13MI@dEcORVpCCPsO?%jKLw`z)-nxdxP z?mm6`oaZ^`8Ox7=QIj#hinpI{l6w=Y3ZgI9E^T>XS~@V*SiV1bPk@+S3^7E}N(8Du zkl%p01JS|Bt2sljQh2}l^K7Qv?mSc%D`^)@8b)aDZ(SwrE*DK2!aS9$3}d(dQ$t3b zA=KJZQQ6bcvS5ciu&^O9osB?T@8{5H*{pU65;NxzdSs=9`e>&%Lj#s3hP{?%nC+M@b>Au1@ZC@oG#e z998tdb&bpZWo?Dhk4E#t9>+wT+hI)RK;o*MjJ@N+IvK2)FFAim*AvVFokR3WBdrB_ zUA(Z9fX2Uir+xA~W6O8o)L#*;$(glDOKW=Q2^~z6dOb6RSZYho{`WN86Qw)#H}K*h zL|l_Na7+ZnLJ|26q_=~;<@yTR_y(PjI`vW57-h{KiP0W{PR!|7PCMMLS`(BYJas?TQ6nmF;MK3G$u%$8Za1|1%x?L7Q^8E`Y(j zM+3L0r0a`C<<^00Fq2=No}DmBEm!_S3xF|6Yq>1SW!oBAN(=zrIdPo@M_1!FSJqFD z)q|{!DcqH%b3RDS+%E}4e~Ucj)uiIRXB+o$Al!GZ$0X5eAXUnKwdgLub1sl=*K~l$ zY9OI)^3zI#4|8W?!s1-w-`?C*tTP78PB7B1UpU?y;07hQoDAr2Sh6Z);YAGIi@cBk z>N!JHFxGyiuCBw=BZ`I=0%4DympbrIXw%XHCJb-gh=Y-*fOHZNTAA=Cq+2M@5w*FMH+F#rfT-V8qP=gO@)qvytp;Rgp@>7XC1xoX`5!E`0bGt%vn$wn&uB^cDo1zh_Dg_NX=R6g5t0HtOzGe##?Bnomb<)5u zl^&Z(dJ@n%>R~QfCvF?<5X-K34%t8YZ3gWV9MzMk1g9<_uxehNE>ui=WjSt#OhZY1ZOW!fs>^Np4 z`4?G+dPu1_Wcfzo#!KE=!fA-GSsv546#tMm(Z~T1%pf@*3rr@j)M)hG$}V-RTg`O?R-d#k=-qg&!*} zY+C$eMxc*_DH$fK%U5Lb(W+IhY?>jmZe{=#k+EOgPm1f8keWX*5GyvD#ctuGseyV_ zAfS&lg?D*jI&<8c*Ib27y6>CKt`JsCM>*-& zSwKh9HC#~6gZFo`mhN^^H%V_n4;woDPIcC_PEX|+o9aRkC8!|eECveUzvBvU3{_p_ zoL_M&j^APMrp<;^GNPD)we_$EvI6H|2v2L%T~ucGlb5v)?79;~cO4R4c^C zC-uYyDu*HiQ@e%TFa|f#ZxZ}O#T2#P{KddGukZBqLoes4{b?KVeKY-f`ggG>hF%F= zSceIV!9j3wm=2TPJ!CI4AQr^NZuG5bhWX;epD4NMHKRANKsL^1m>OSc(osEa2W2=I z1Bq(Ch1yd&3m@;PxD8))|HvFT|MX!0$w=pxg55Gai0iseh(t_J!p+DargxtJg3Dl+ zx_18!**!q4@AtnbXMg>m-*~y8*mxMDI~%R96qx!+74;XgfW4uCIrU(=$uPK#A{)i_Iu7Cr2F5rk3j>Vn~^yrr_Hshx+mxuSHah&rW2GdSBIHE zVi^@&8&@&(nSe^-mN3^%cxdAb3|`iU(Oj9>_)&W?f5`;5`(zH;)i9nhvnZvni0gT{ zy5m4&QaN2AV#}A<(%D!g3gUw)l~KWLf7~p;LsQb+7=K z-hq-69SjfX6ZUg}8mKmFJ}vLvLO<3RClr_~mZSkSu_i$2Q9i4MbnNAFkUAHoqWp#@ z^KJVg$ky0|!|+w|H_p_{X&KA|ROiLb)0l9XCh*id7(^~)8km4u`@_D`(b9E@SZ{+x zK)FDOMeyZ5D}zVj7PMpS=cClu?x7Z`>{RA2wkBfU4#m^bXsOnV!!@nd6Ig!DU`!o~ zQOaKEo*R{-1vmu@a6;=C0IN)B#sMumhhY5XnszvGkU8ixc@M#Ti23aHPHBtmPDtVj z?Y089JZSlJX>H?!hP|1bb6Np1*YUk=ea(f`Icel?{-Ec`4daYaGDW0h9glR;;ahe_$$Ak8Ql z9a%@#G%=xs?_>@EQy|lftzbJD;)Jw^4JN|Wkr^kM@l6)>4g1Z9H$qgMNu}0@;w2rY z)-1&;38WV<048AYhMIlR@}c{C9Z4LBs_1sfo$nW z^Zwl!BP~!3G3mYhu@l_kVQB5#dh+3-5NGRslMlg7UNAdnNgOExn-8}&L2i$c6hqYs z4Bdt+>j1Zs;Vt%iG9k-PNSdGkkuL>7yK4kN!WVhO$!aq)g1@hc-~G4NvxJ!?!OM1= zRJ+};D4{P$I~jp(&9`(>9i@A#zI`-2mRWz##~|9b?}`+byYBf3*<)|Do8-*RI`K* z@?q|D?lju=zR?;5j5rNYcb(E%%+cm2?Z^3tfeQg1eT5@bkT1)0_Mj;sh&bIpxI>r+ zMKU^Zl-`ULlAYg2xm+Iuei*xSu2PhiR=+sGx|=c`Cxuuqo0^obsTnH(4KptF$6N_JBZ3IeRLccm&H=4UhFdQE>~*AknH*=k z6$omR6Fg2by-a=&e2hzgjv<+G?Xi8zO_cxp4HN-d3EmU|prlWFoXcq0XS(ljBw7=3obfn%X7I(-X$Fo_dA6aKn4$dzt=WvXqRfsX08T zn0%EeRXQ!ocxPD3UwW|44i67CM%zn$g&_WI3O9F7By8 z1}U}79JCrcAN$)X=cvXa_0S_3vzKG$JF$yg&2+BIk&zXWXf>&BR3C1YPu$^DVIEtv z<>+uV9s1cKz68VGT70WL!s5Vkf3G=o+W)g7z?%JMi~2h<*YH~Qep4WZhcO#O#HI!r zF52B_o)#%vi|dRp;|@JzZ8B0g6~n!4E4Yr8mt=E_ya1RPxft)3`pm_gR^bNIno~Ic zPuPAW8jX3=liE8k;r8wWs`lGi7iBLWUKwAwj2BQ0_2nHDJDTsSava|yNN^*~aRjA{ ztUCh?dIzTaN6com3=k>q^CLk>Os&pkxjs4STP+N>Gq zbQ>vmAUn;FWt#%vb=nw@G*H$4+8}b)7wM8#9SVs3`WIOZ!pY*?)k6t6K{f6r0swQY?MNBPG17_E{)zR`4=P-EZ!W(IcwR_ znSnxp3byYdIGjx9jzT!`JLf7{!ko_Bo6c;zSJOIH+LQ-FZ8}6*1PL*Tr1uc>sOic) z-5dLU(&h)4uB6eqL{$xx_yXoKgny;6A0-ODWIhV}XlwVg-k!HTBd@YBUtd^k#1Oz6 zRN*sT8F1{7ZBVp(d%S~hjiyyFpg#?6`H|8Dv-Y!H9*}1UgRx&6@TRz*D(8|oo=aX& zU?E^ditCK4!8Q}JoXdJKc8PyLFn&<06?28_q}j~vmYVr>79;@snHy=bzt%)(ST{h) zV)x=3V?v6edhQH7SS}g0!%2n`uoY0;QcH$^ko&xwgAs?4yRXRSH>ekQmc zY|eD&w!$t&LqQ?)BNEj=cxPp0T?j+9I$B&0f`{_NuFko(YVIOVVNE4FsHzAs7Q~cm zqgNVt>q`0NS6W=Wc^;Fr@-;dFqG4fiDHurB<4tRIkk0@MMA@;Na=#{5U$J5cda)iO zppVND=O6WTx;FJ)WMs5kV=IB1H*kICfm)+?ZIG!BjI(Ji)(7OM7*Z*C7wZ?8cXZzcb z-F(;Q3G5;RVp5sgADNv^OCcC`{{T(SlV*2{HVyrmJ-4T!Q%AG$+y`xD`)eKf5;ED3 z_t>{v;CD2yto5OCDxm(VVfFK;CqJb)#tWfG)jD8Iosqi#O6xkOVO}^P%j)_%{06g0WsY`gL4I7a=-@4()F) z@zzpuv<)snnyC>HqKUE8d7D3~vzpa6>*GD%naw#mDL5hSTrrJfu_~%;LZ>K2ZpJZD z1I3#%O$?cctYS^#=XH|CB6a%r6o_62IJ1Lk} zN@2Y2v^57iSHc7&&+VoP*xoaIQAcXIVws<7Qq!#7Q2^%Z2~>Y=k3Uj$H5_71u7E0P z87X}TGNkr&Mz;<;TK!BHTt} zcEN-|Afu&z!tLvE)xyPHH#SL1cT;UHmX6-N39@%;0ZodD#rH`c6D*$r5A zxtfnO@REuKSqpGRPmaEG6;d)uPI-brKOeM9Vd`) zdVpuIOvWnwWPk|YnFT}5A&My%n5wq}j$0twb)D|oywELUnLBfm>Lgu}4%2ctt9gW(O%ZSb@ zu2UkLGDq!8SP4sobE`)6{%Ms#8t&-fVYRereW2}LQjIrw4SnlJC@vU;JM8RcuZ$jF zL4?fe?%FS(2~OA>OhtWDYbm$aCU8Ou^ao07Kl#`0%AdIe%qyTUP)~b@y7?vcyF9${ zQcT?+dab9zzr}#S8P{FavOpM+d(Y}iOPo}DdC@pwL|$F;Nu$idYE@Bj4!t_DnXCT$ zN~X!>SXw?!wGFkZYnd;`sP5|4ZHCYYeY&4Oc0uCOmC)TxRr*Y6OYEkYs~xxI23-;z zotoqiwVK!aZT(H6gp8o9M`OFj8bIQc4 zflo*&2=L%d2SFc4>t!4JnMRp!j0y|GrCd^T>+8HfLOkp@Ua&a!PP`j0lo@Y!3-R;a zu|H7@<#iTMG6cn&9^n~lO4+#~5xeb7WcEv)rHLZ*W-XA=kOB0I3k*X4Jgsw`wG9^lEn{l?MmVP;;=F_x~DD~yKTOccSoGMo|A7U_cR@dcP zN0h7{wqz0HubTsrykY9-Ak5$srJfM1EL>k}oDLlwDXU{shD51f{O7otO_92AI0U&6%IlA8 zusPhh^z{QkURusV)A|SQvnMK9Nqp3Rr51xhuG}>oyT{WyYQrgy@rjx zY_%PW?~5kk7gvJ=i_KKaaqiq}lgT1Cm`;&`t?FIZ4{bM+*54=UV0G!te}p2kF~qd^ z61#X)HR)}-!}01TRNa490Tcu{xzsLM04fxJI8}>id9YRcuxLzwI%cl=iB-QfuyRwQ zJdyrlrK1yVyPWY7?sF-7+(>p`bt4_Xs8J8S-`-o+8K<}$uuOqxV7}&vK@&LO0M$nb z^Znr@4_8)@oRK$ZQ!YB`zDs(1V-Gncl0p@+7RfYR{w~N7w&k?7r;@;Rd)MV;y+JvC z$~95d)kX;Om13pYDvSn~79>8D@S%gZaz6+R`NS}2X<}Oi>&uvB-zdP}d2`0(qO7ww zC@Pl88Am6kBWG_AJ61TZtgQBWbD~mW{y^dhZ9jlwK-V!v`ET95=}e7!lM$C2wH32R z&4Xu7fo*RswJp2SvRkt5nlD~m(Akt+Ofg5rNTQ06O*2C-SDe7)U&`E5xcfV-VF6z=237_-#o~y__qJY$(zVV>*Q+OmhFo4cj(+W%VL!Gt zTgb@SJ6}qukLMkJkSy$=IUGlq=J;Yzovc^D-e7^(V9F%47+7%KJ zT>4Kv=KqSQ0BW!=^`5w_O9D!C8f9C6qCaWl>&1)}2V*+{lOIO}&w|g|ABS{~`bA$G zew#73y&0Uqlf@{_*ssQnc>Nyz;w!7OTMkQTvn4fi!S~)V3$yGW})&0A&m zwq$5UG+ViF*KI7U4c?7z+wK|LC@|g3CCz8)IJwQcG0*N-qb0r-4kwxh^&bk4p!Fb3_$gRb91`E z?soO5{NBd|x6iNiKj|xvfBM-@ap$SfllI@_dOkD#v}-`96AJ>_*sn6UBNcA&w+AiY z&NuuJ(BPa|SC38V)I_#$pR8ElF;KNWX}B#|pFZ4Pq2M32k}otX=DInXL&3$PZ666E zXD6E8F@W(w%A$R*@jp%ean09I067n~1LJz#bG+9nkOR5Fjw7Dg-9X*ZO8NWMib-#( zRPdOos^Z&_dG-WdIXwvl22irVXoSQ<+V%QwVv*iJC^`d~(Lw|m?q%$C{mn>`y-n{> z-%zYr>wnXFOPhLBQnZe5jXr!0Hm<)vEUtQxRxWSx^mXzaN@UJCK(?cOWfS|hSqiXq zzfIBqyL%KDQOI&$uN*}cuY#wYm&>gzfnJaJJ-Y};(6M$u6-YE=D3|JZp%0k`Q8nFA$ zb46+?MBNDV`+oP?h{}t0B>itP4!z`5@ucsA;Cx50UGQwbPfzRX#&QNryZv1p%o z`B^yEd6Fo*Ol8nep4yT3OG>|O8j^c(WTeEjtt>)I!*>4%4%^jm*z-zi_CX_@|C4(_ zqOZrp`ZFc-e+S{$%Ct6-0)xNs+-|y9dwG0Q4valC`;TxkK|p+>cuB_7tEo^{dz%lA zy5m7UR`cphZO6z-Uor7)8-4#OSGB`sCMGaW%fcL(FRF@DgruQ0uX|C^qq{i8|y07_u2Rar@o zdsUsnmAZ{7jQM?Gt7!sPHS1grsw!;~3$dp$TgVynv-O{!t1_PjaeK*9I;8ltt8b@>g*ivK@gJtbT5y4*QbTVgHCh@zYx;Ih8`e4YRRaCn|EycziVC$C!$|;W zOXjwDmiz#gu$Y)Dce~$)Y6~3fF*6fg(!;BG$FL)JqcW&cP)PaqKP&yUqC)@ry3X9p z*IJcLxav)?_Cg0)BxEg_V}tTd3DnY@2g3(U__p}fh-OM@t5zsbW~d?`Kc+wPZzrd` z=E%;@m0R^Y&wp>Ep_ULG+GM*~=<8r0NOTSu$2u7=f3`|Q~(G&%g5=SHL9#!vsm8v zcUs1hS83wFmB>yTaW}DWtQdZe-RGnrB8oDZERbX_R2mI_y8oBgi9g0Ko72IISaDhg zF2{3M$YfOMC~|IdZds!6nc2ij&7*&~Ki4Go0I!^P)s(Y_C&Yf>rPU&79vlj{hq+YB z%5}D7Rm7OZ7F=4%raJSu7=GFsRDjr#YFqo%%ZG`SoScw?Af1r>DWMlR#r!({o#Se!r?=c99b$mW91;{qJv+^TRK1! ztw#0M|zW?VRM8NeB91nB@Y(e@oLv;ZJu(3<*-**h4s1W$5^I(@nrgu zQkLY0O)qLK(1!zZ9S(_vu@lJ<)>}%l8vUKArqU!1w-2m^Qng5tWRTVJ;y`3U7x!By z|F3}ZB;ih#q#c^)b)E-wZ*7Q^-#T;rb9cW z!c=&#B%c!V{lzPt4_~<+9ePyyH6p=Sw>IM37GK3fySs}0r$Fp_TXK#dWF>tVJMC00NVPFxr=;y)ZpS5`^wss%^T6d0raK~MXuqu*@WqJu<3;$t zy?kIjwYMc-iVJ+=^ATnAX8xQR)w4X{ufHE?xt`lnJKzDqPKlOL(DHJ8k=08il&xNK z5(xn*sd;i;`|C|i*qmjuW)sT~*6nSE0hg@WoxjZzGk(J<1E<1;5u;+A+4OpLFD1huY z6V#h*6yn0)>4<)ep!dxZkCqM0$R{x@Nb)Lcn3gq&b42bs&4`^!{M5EWw?0s+xcj`u za$J6*Xr9~!^6-kpYkQqaY3-I5vl=#$)Q-|=E8RZ>1B&YtgBIDn3!8xR$C!7%ljqC& z4_Bv{(ZU&`HC^-;8XTl()f62a9kYb7rg&?1SVhrOLdiL{ z=`Mg9957A?-;libg0e6;;`}uD3KeRQqeL2nO0h-#f-j zCbCOSSWFe23WU2ulHa~_JlOXBCTu#_aADUhBh!hcQRdO%{ndaTA#9 zuci+t<)>^jbZ_FE^QcTQpB%(y;7e{vtR_BDeuyYndwWJ_vg_9-Q zE>0WbVIq;l9~=4K_PWi@UStr+5X3v*ARHB}iVOaQvj98@gZM9h@tWs{Rq-|8FY3Ah z`~>C{&3>O-8eWmENm`J{;=~i-Ee|Pv+u7o5t^V+BSB2iBCdq|*RekC^Avl~56(-qm zl7w)LDlX@E1*3MmQ>t)l1A6NWR7Y#O3l3!qdvhheTq^V}>{)S+(}+JHv*(Fby`PZy zFZrD8Oj}6u7L##qR(+_|>(%WK@5bRiB1Di0*YsrFQe|gf1`EyUqx7^hiwp$F}nSbdNMu`@d@pKG*}Q*>`q48`Fs>7hkxWxSqOWzJHTft*%qHn?kS z&?*zEc}OqU#V9c&Jau0-OpWAVE*!X)P}5)EsrEW$wQCn~4>>suPL?r?d6Hw4Z5g=ftU81NLzX}QN8qi-Xg&Cx68ce*g%0E|Rwlnu> z!TaVj>#;y_xdesV)%_XVR;|^jEQ5n~Q&W#OQ7AWha)h+z4pZKuQ#rB2LsBqUw#ydp z*3DG_|B~)A^Yiq&Ypj^{bzQo=3-$w|!*O>tjRAcLw9?q-uUap+oRL+VtwUT}_Q~d1 zV5jSvZPo_~@R%KymhSe4Z=1q0skLT-O_=PspC03a%Z8S6Ouv43Yy{P7+#P$RwrG_x8X-hrPA!O8wQ1L-i=N zSrqXERugS=y)HbS<_*s+7|V}R2AJTi*)>QAP)MRF=hZqGJl z#&jzb1$bzMSED&9U!AuSkidPd@sV`s!)I%fIak<45o9BZS1gv-RP<AZdjz5@dQnLO8&Jj>atQb6B4bu+V z{nRUx6tyUBwH$jCzBkgGec@GwcVw6mlHdx@9}$mqdAl&>;TgC6)HL8)y8L5Z{5rQLhCM@{~Nq^ORS_!)(y&30%jb|yXD*nE%k#PKZ>|LX+6NN+j+sziBczXY0zOb$7p>pi zmv!Sz<~h10M# z-%a@4>!+wF(tmJaVA86T40z#Ri++og#rMEvcRH!Mtn~5c=uuFN9`1n=V9Y?A(|7_v%oc?(kH9^X$WI>L9`GEVTdddr>iVg4RlX%43@<(G#pYH^Y z$`kTlFB|>SyF79mKP*3aQK}k{n(2@HeI4t7ann6rNYTvDgSzl75ec#7fx7ke;G6x3 zi-BQo(tIhe{FuHP-4Z+xC^>baBUL{P=M9Sen0O&yf1U!K*Oxjs;0fh!M{oah29NG{ zovfeFnIuQZtww#QLPh8`>TG?f6&A9~l0>=u9GHg(v<$(0;GOFZJE&(40bwW_I-V(V z8UcxTlh){@;^Y`H;c;}9vPoB1oB$LPcwQ9p=lRh_H@=%sax}wG@`orI1y!-1?Z#a4o7o7%tsLVrjFCimGh!JX`>D0gL*Sn82m~= zx}@9+J+}|S%h5Q9B0J$TRppZ1&YACr#=8Ifu+pLl#`s5;wr8Vauj<%zqlDo;bMRfV ze1J0S%Wiy=Go=)MVc=&I8;w@`s-%QfdhV82rEsgd5 zdbLNz9CO`xTs$=`Co2Nc%2I#qUYsVq*7Vrn+8B%&q9}Fa`SHXAJAM_VcE;8kb{%$> zv&=#1W45549!m9+5PSr}hM0(^oS&QVPpdk^+4sf2mAR{zOfNhvU{_MB+AZ+y-kYxI zPve;{GP%PUAa6~yTKP!tyEP@Q0Z;E3fwVPGqQ148&$!Wh9Rf6E%~-bNbJvuk_Og%r zI$c`P)XF7pOfXx5b-Uq9e$>z;7F4rQNPO+tmShum#whI-ZOM@TKw-@jd&c?>g%QSApy77KfGG$qjZMJ*67-Lz(>K z4hovzwptj}XOo@J2n1>P$LnXLTJ|EPx+O*$ZqBzp z`6{0Ihw(Z|m$ULKmqE)ZNtVpQhRkfOUZ@&*eL*C^GQezGg8mvlTw;F&0c!Y{V4E6* zM*Sw#b5NQ;NX2JBh^Q;SnU1C4rFad^+P@k^eG}!C-z0G`fok%GAZ~e?^``Q8BL3Wg zIupsVJCLkx%>7QsLd9p+p4rj3X6L(xi*1J(*1}8~-*CPu&V{)P=;C_MxNM;~tp0xd zw(F>|yRrA6$Oe3$fPC$H|Aujrm_KLb+TJi;*l|3e`Z`>L3t`QDGerCCyj!=;6WrR@ z-X$!S%d-3Dfp-@?4LLUR7Y?^G(4#DPtZSxSOj(nUiVS&*;H z|5-AZeci>N4b9^GMKY(uns<(QH0zkg{`U2K1M@tIO#?E4KPn;Wb5v*ob`8XZs#M7< z^~3u#O>>IecBqcq$Fn=O9)j{})Qh4$ozV3N$m_>ESgU(ZtG?M($0f`cf@!@#!NyfJujf~-25l2efqex6 zb%^6SDgqWySsYgadz2;w!hGshlYklxpS zDGO{ssbd(|Btk>Ep!i&Auy zbKxDTM-_keW`KO)r#oeye7bSb)C?R4a!;z z!HdFYl*oi<8rS4rR#^}dYO^^kRv5}{%khuR7(*W*-#xwAaaWnSyE{pR$F!R=vYlBl zL~QGj!e5=FjZfHZt9~o^;x)5-#ezAe_|TM{#G&!*T+cIOx_%bGDc}x_yH(;7(NTP-KW&bC^uq7;ZNP$`OM=y{&PKlG!_q3dV0qoDX5Q zb{CdIJ+OkFU-e(E4Y3^)$0wM!VYZDqUO5w)eTV~$xoL!|xvoXXV1JAoetXY}8&DX8 z--JsK(6K+J55LjC2i9)h^NgJ^VhXQ~Dg4;fBjwxf`)9Rxj%dIlpPxUP{SWE}?I2L; zaygt!1|QFM#)h^XW;q|3G;cG{GjSf;zqyN8(0|=UEMZt?x@Zk1V zq0m_*S4PDWgToG(@uc#EO{3Bxb6o}&IU6}97j2Lh-_~qYeaQRrQyt+lK>+3){UB?A z6O7K0yr8o5ROb%?=#@lPKj}t1CSw|h=$_(Z>=RPF5o+}c_1Kb2RWx!2)1Au*ukRiA z39PQ_0~Y|!!yk_-ZnNIm=##8bI5K;bD?<`btDMDuQex|~#=H=s=v#v^3XVUauXZ7BU)@{nMugIw zwtv#avk=1fvRC;7r0JJ06VX(M?~5dNOON+X+$n~g?veQ z-A|%l_QnZ2+gb!`Xkr~G)mefx(J!9v=>+Vr=-@*d_@LyfXu^3MwkCw<;T2Nxl<*|a zU~fLRFBsnRytv?*9j#M?INUxbjDK#82dQn^YCshqy4#IY+M;nVnlzXo1)<9}@#gKNgB>N$WLTZO2Z?I3p+P$_YPu>xx(?_5J~t!}eE z4M)o)P|>j}cl+Z_5XhbT`KK~^B*(mn%H7S(7JC(^BpL@Bhh}r#7Dd~FM&Z1GNwGw8 z>UpB+_4*I63~YvdLzYjhrl_C*PrL@bkkMpLF^7pIonsu*-n_y{wuBzIWK*8m%NSrR z6mX!=j=_fDILit1kzLC?kiugAv7a2zS*}>=6IDTh*ULQf96VXP{vm!}$NGNW7~nWc$Qx zfO)ugr7_uddKoA;gKjk!;0XYoXjCt_YVpkyt}H{+zCd{fn8NDJ)&M_jB;|Lu{fY08 zR#LP0wFk>Tt{|pgjjPP-c-rzvWFIHg+$FUfC*q3Jy$J;4bV7d);R$uW zoYh>j!w@e=hIB4G^Lx=4hniFCFnRG5SzZ|*{D;OL9)A;M#{TxtvB*Bsrka3%&a(go(&JNd61RA%AeExuyGkoA73q&W0lvuKOaTuu`nl_&#%&#*{B45I1SsI_2Bb=@!?W*jNMh6Za;ko8PDS+p2e9c z{$LuCh=9xR!O(N*Jmth}FlC>iO+B;0{xC{mv52wD_cW){rZ(6?@i{A%eQ5(`Fi$R6 zA$IWF*qkfbCm;`qg%DSKh|vzJ*vr82f&I$hh}Gfpn(#Z2=Lo(tXCR4RXmk>LTWypp zRP(YgO02lH&^Sy2)&XEENMG9+Gz&0|4ReK;n;|mGpe3<%L65eQp%!AwJ zT5kly)w}3iS-^EO7NvUB<(jHhe6Q#aFFezYxcf0bE?7qaORxyn%^!AH;`Z`5%eu>2 zR>T)gDw-{VM@h@0asiGv6rp4#y#;Vo(4${&iX7XpuyisAN_cMuqpn>K6d)1fizSoP zI6m!=={<+qGlyGe8{`w>_zax;xt<8{;ss$TXWPr079|M5ARbZ&cIC6N9+;y}N$UZ?dh%%c0m6UAf*exenTnbxYf382`Pz8saH=MH|i@qSDDBIYO%#2>;f zgP&S;RaZXh>hB*z&!N3#w6AY6G95<})M7N`woMsNI1hkv>$B%bmNG6pl}H46=E0=P zT;v3F=|w4PnFJ(r?_B7CVy->`F2nMD;BHwUAnNHmXu2sk zQ913#6FJ5V-r5gmDBa<9|0FSlN(et&nfHxRj#Qhjyr+En6||8ocBs_4Rb4reO0=<#R{unvma zsj}@-QJ>FOgAYb#Ay#+-XpXCcVcUMDM88JKWEP-E@a--_9UZsLCg9mY7+I zjNkEX*hfe7j$L$3_jzaJkqinhoW%k~1x(-X0}`qn{Dck8H{a?B#k^N-Ht0qOA@dCo zTb8OjmGw85B`1E}SE=j{>3m$tTo!c{6Pwwnc&H=JooNd^oBm3Nlcp2f(q*KK8`H&V zg?<;R*rn~7F1iPR`50+9S_>>O>RsuP#5db&(KDyCy`Gip4xt~ah;8Qp3S+LIZs7&qCCcJUeM?JdHR4$YsEz*<6o&x^G8TgW`?&lw3g1o|*x!yEB zU1mp)SbW_L-c_Iy?OW+8V%U}BI@@&jXSc^ z_kMTuTs_ajUYk12%r@=aIX!0+U8nmSFJbZ9OB`6CSQkHf33ht3GPS2i3-664)%sni zqTnPFr}R^#YQK$1`oP}pmbS#?YN7Ro6Evw=jmv2^e)e-%Q6LG;mRT^f4`Y#X8g%y& z6cU;D$MsS^DMNZ;_PC$Qw(kSKOhy~+i2XDXDM51wZogA#x*CM-QMGhAjZwjImPQ_i z7V!{4ljW}^_Mu|;GK6jnU-ARr4a@iGlLAKoC<+q2$9_tGa z2gb{6BSGqDQ>86}l++G>XU2LoT5&n1>6f>@@co%|&7b5aTWVKPCy9sAeO6wIO0z(y z9gA77r;a^6Iorm@@Bo-OdifA-rLM)T*>O8kz1da4pI#VN#R0GFa+Vgr4O`9$Qd=Na zYlsFenKy5~+<*U@+dckQo{PAl;`YZ5+(fI}AJP@UziLFR;=j~-8DoEFE&0p(ipPoz zzO3JA@|irnCmoa*^Jh0>^wG#)wHSP6M0^0mn2cKUH%>wXpXE0W$&zx1Vj=gK`w{7m z{>~Hme77!WiRonicJNm3-z+qYQ?!u4;$wwJ`ZjgsZ-?adVQDy-^BsW0X=we}gcrMS z1bHj6QW5?;|M%;YzhVKk8UH$G{Z~-+miQ-qn4d}(Fg=G3JJD*V#R>Vn2LD!-^3QcD zofyBZI0hA6>>3pS8N})b4F35){_edX`Y-pIxedjW*99Q^JbA9umVXUp{4?X}DE$jE zyiWU?hkwqf{ESs(UWfVDcK_$U41&KIe~vb*>X}Ezzd!8mZx{2Q7Wp&E&-6Z;h*tCk zkSl&L&Qy8**N6IFCd*eu^ox`&;yh2EPXh-0p3^xI^&i*s*B1zW`1Pc{!%$&2z*9e) z%>BT?@V^Y%i~0+RSo8a^XYm=Z#=V@@iN7_!e|i)s(O*OIfnT0-qCQ$cK{VEXUeDi0 zEc91iW@WL}Y32_cAHABmqU686Qvc-u&$zegN3ae+>=O}m&R_x~>MBpE|92zDe}ebxQFm4Ybxs0)THPERF3JBeB&^-9 z6X|y?5~#nAJn{b+`^vDmwr$G@2^w4y2p&Rk2@vQAzWUekp_CzuiX$fa3vID);`r0wFIK>!gN4Yn;=eDy zJLP%xLaA+>C7b6NuJn?^D(IgW0tm7^^LfJC({7}vl!>MziR7ZYX1V`lYVG}gB~@)X zi+xD!2|K<1b>{24^W3p;Ug7T>4ORvEmyO4S8o~JIB9wmc?+uR+V(60>lZbH7-lSzk z=CF_X(Zu9`yHzI|2@ioa#YO$Gg348+r1C-hdv=|e#onT&^vXRuf7(= zAU^9Txjd`1ef(Oa7VY==XytgilfO1cZh|{y{^sIKcSxpSqcJ_z;u{(VEgecpd=Kl1_IXD+y*>t1g)6eS1On@P;(u*!4nr9!cbx#Uf zbkStPKKM@p`5A>zVT7sl0e>?Gf`P!eBe_(pf2KWop~MqbUq`~UEQGE1Ew|hc5o2Jj zJJe*oC#(|k=zV>A*tU7F)b!Mu`wxt>k20bUM~;^~S1KW%klj+e)$`gZ$u-X0{g7ly z=J~Usq5sq0|Bevw4pR_Vf`McGhDx2lGk#@+H9PZN9VN3`ug#m)^`i~scHf4Z@2vyg4QV zu~B9jUaAfoedGm7`SC%qH}2ObCS3Mw{(H+US{ydecRa2KX9bHAG4CZhG5D2rOD{bK zdb|Fo2LJPUrUiL6}s2G z;lwcol96ej?6b6+!7LNJNTW@5E1>>39?lkN%G_>*|NQKKe}UQf=h+@Kc>K_kZD+Gh z^B&T<@osVd^IVa5UXG3jz9K>qgn@uHgq3&hbTpAGHBo1$_lC#CI%mx~joaC{XDG?x zQ1`5Nv&HQ+uPc;551U$cqhM#|!5Plk7oOI1<^q#W$~kDNDKV;W>s~%M+nMY~JYR_z z9yVE6L-MJCbM%eqgu`>cWSVWpRhm3Im}%M*M@<=e4ZnkbPuRBo&XC_GDeiNM_P#D z=Xu-XLkt2kws53xkgvdR0L$dCvCY!(uJwiz5O-He|J4fnyrwAk9>q&)SZ&@I zO;(1g48B8Nr?dND0uBP*6jfO!H$6&>^U~x@#n2f240uqJYM+9*488IDb0m=6ng6`$ zTV2W3Z}-KDPbC+6nZ#}tuUxFo(&4mBa(B>ln4?;v>2PzlgH&~Q11}pGWRvr^xZ^@% zK@j{kprSV@ac+o8?r&f*krQv0?yXsiG&et*jwYO^ z)N(s}bZlov^J=i>dp%ft&J~9(HaLpumMJP&DtinUQ8Zo4eY42 z{uK9jZ_{W}xY%1@BAA{N?uy@wFp2ARG*yGl#>brPOo)oG)Blz3V#wfQgILzzH4SO9 z(d$6K=%*~ek?dhZ-rRgflk=r?!*;S8mWC-J<#I2>sMA)I!nNjStym#%+469h_So-e zbGdV_Ni`vLnG8sxm)6?=?4vsM`j54L9F~RANV|O^4yRziz%3c&^^!ugRm*f48l1t4 zj}};1B(g`J0+O7ost+fT4<6?tj0n0W2IA-jms>pc`%`CDhoPB9)cIaMw$}Ft9u_N^ zRlh~7g;gsA-QLW#MVu&$uf+~A@+vYr3*y)iLGGPZ^JG(O;~rNLU%gYx`#$5Mt^Ezv z>p=_|HFrR@oR>naOq(&HfS}Gt(+M@tuJt_pE%#ZI(#PWox32Pb#nweS*;~Jc)iBK9 z2rl&d19OjMUbh_B0{fli8Xr~kOv&tLmqYu-46A8REqABGH8qX#C>jcUEaK4c+H&bf zWbjAb1g{3|#`EnGI*A01l49)&WyM^{O-Sz3jl1(YKUVJ(wg#8|#$LtB0uSvX7^wx; zv=IeKFzYjq%X`{RF}bnL)x!zxh^SD~cs)mn!>4!dU=jWX@H(hz=6 z<*KgUq9xWsZS~cf?p%m6tlo1pw zzZ$#(Q*n4t;S>DFQHf1gniia!KcLm6eRA zr$NLZaY`xFZg7C2PVEcuyL4n%OU;r%jRsQozV(*()b3aG}$ z^;V8!?*-Iv+Vhr@8tK!s-Ejsebfe&RhU;GRaZFwTrdT+0 zK4#hp%v*aRPlnQLG(Bc%m&^G^u9rVBhFb3Z^INAFwgO_kYj@h1+vn8f`s1t`H9g0i z*7+_Bx%v;yJ_MF@?WFBzUHy{->&~GYeGiGTj0%gYnr9^>yiV$(;n&Kx03Wh+qktN9 zAm+uXREIzE#_S4u|HzWZx$^5^{ILQZ)cy?4-RwGHy+d`@zr2Wo<$f_H3Sth&&R{)7 z+MNrqdbG$qhROuFzL!+_I4w~$%PP@%g5ja}jerIM^3>Ul02L~sdomR@>$2@;wd`H5 z2mZ)t_(&ZErJ96;eo&y~>82*$N_!wPd)YUquglz%j56$w#xjKztIZV}95zE#A~gC_xvBuDhW|X8 zx!c8_hTHvcT`I5839O%i)a%Lz_k;Xr#)8&;Xp5K!D^$o{kWGi#u69#Fs-5k}dZkglLF}e2nPn zKuW7Jq$&O;ax+pEW&G;YLaDhQznTrJB6wSUjIb}Hnd0|8n3%<(TKd*AkP*i*%xU50{vW>zc}rcEFSlRpa=797ad>h`CU0)DsTR819V=+MS9 z!DE*gueJtbq#9kU*PT-T8g<1~Lz;UriSG#J--&oNBS zMDU$kZW0(bUm6`sUV5MZ3P3dF#W_I!3OIsKes^~i_eZ}U*Gp^Su$e12m?+iZ$zQ^w zRgOG|&q@J!+8nRj3&1Af<*%o6a9Gcg2?e3YIm2iAW8^?IJT7}*B)N@x&@9G&_)LPV z$y5+eEreVKRID& z)fooh(9NK7{D)&5cBR@8QV*Wj2uv=Nl})aP10y<3&fqoptX&@^27fW%eDfzi|OBAsEhmMB@CdAVFzc5<5oB-w$JgXWvafle(J_x zirOfK#lUIZsD2~lvFrpWAB~pzrOLEFt2er7to!G>+=3YPHcwA_(Y^g$eGOd!A%=^b z75r-uUh^*og&RC8lCf_%J(AxNyiTjz>p?#R^$kZpfA4-~`5^6Cyc()+sY7Y@II~(q z>cv)t%Xn6N(rBMVD1CXbPR#@T;d%;>N{l@f7 zpJV^RZBg0!`PgC5<}jhbDJkNuP#_Vft>mO?I0oqCXT@@hqn6*Gh1=~2vBgqm3dzcR zl?k88}+;=XvexMQ@(wSmd45bcsI{$Uz(Avq>pAQ zueY4m2Dw8u}Bz-paEwC67*|fP?rWV_bXd_n8WUkvu23@~1xC@fT&ZmN*^IdH* zT%UFjpC4vDO2DeWy@SlWi~dE$CoBc7Jox0G!#(_|V9@+l^nJmZHepLT$mE$s4ouOx z=2Yz=W_{}+u8nCaN^I(F(RJ0kxDAQa6@et)S-Yhex&bMCXZ}=LpZWcopq=4`%Z*;u1}7uO${TYA<6)M6S1DFkK*6W~&~|qc`c~-~F0Xw1(+doMa{w%%5-?{E58wNO5lyW;0xh8}04658!Cx`nyrqhR1y3GVk8mety#mF&>V8iJJ zFQ{AtydOI`u7BEpgh%or{Lle+z0I4*`st@r!nsi<$ z1=}!a)x?FRaA>(DbK1}kPeGzIvfmGHHXTC7`pF8LweP5Q_`d{uj|Zleo;Hsp@#u*b zdN-vQ!5caPa*S?kE$_Ix#;*0~W4-SYMdtjw^@getN`kQk#rMVIuJBqZUvD`J5 zlBY145`xilB97<`?;8#30L*H)b?BF^=Zlh1;r6WzI{J@!a?@_w4b7()S`(Er9(aw% z#Y*R+pxf_gyDMq|E#A_Hm-(am++ID>&LvzO0#LfIoR@$^RvdvVmKA5$VxgUKLds=; z?)RiJH3rw+mBw?T920ms#(PUT&{C88;|Zyw-b}%5Ybnm`!lf3c8!lE!;F8|c*;X&a zz6quT9hHvS6HA$2Zu1}@rND@{ zCi{;r=aN2S)||K3-QGC@eWwyipsF6ci}g2(+3xIoE_;R_c_UVRtgSm6*;j=<{P6=3 zvnn>F2zDaS%89W;gTs?5n{^s5PK!3BOvZj^R@y8?%(#)}chn}(=tvUm!0W5())R<% zay>?u9oGEUNtI!9p-i~b9-F(#DccX37 zRN$xFw}}`z|HBoyEp2heL#lxONZ)EZ3@70!<-KPtsvy-%Z+JAoVD)Bo$=XvmwSf($ zXmJ;fRUB9k`S;U0?SlHV1@B$<$GEkzJ#)&z^J>q0&>)=c*aZ>%l|@^Pa=a1PrFVb_g-&p{Vcr5ZX%Z@-v{h2N8hCX`0r@2=xD34HQyx`A`Id9`Wu zdX}LkFshOArQ(BE2!#^oIQ7aX8XUPm2+X$?XH;@kGsM#^u=vUQrA4D7`@Z@pKj-n@ zsa_2)M6OaixlHpvq|_EfwCNq5YTE<0-h6&vnj1jaO_PB(;!k)Cv>$nPT!S;k4O;exM*%|YKf9Y;!cBT8y?!vB^Z<&?J=hO>U3WPVrJk89!5JLV885 zj+*12S515`h(L=G z!TiS?nwGBPK3-{-LyLqY>YBtNHod{Mg8D8z)ZBRVX;zD;)7+TP>3~GT6Ye6kRKR;X zLOWiwJlj>MG`+O+VwS07V=deCJwi5GC2{rL=?Fm06%8Y7tl1`NrEkmTrN+$Tq(xi) zm=wE}Nkb$RoSPeGzH14{Ae8FV324?J<3M(&yu})wcQ!QRCOKfb{>;dJK^pM*aDq#h zRTkG$ZTAP(_3=&Ruh6gZ)oX)PtFQ+l4`?;~_gU5`JCktdD1Qq5(Owl1Zxtciow!HG z{AE+AT8W~@&E>v{+r<3BK5gQ~-jW(VlZGkY>MPQiIYu-J&*P}<-qbGnCVgnG7RJ5c z@`iJrKbXq{#&*uio-m|!6mUk0c~Lp8<8FsA2{@vIVv=*t1Q+wV?-8m&EgsuCq4-Qu zx?VS0L5Q!msmt16dkQU%TZ{#_4~VMCfc}|yNwOW>h9@B*q~${!DTp4tb1?E-pw{}B z0O~O^3&K!ddxbC=jFvV1>%j}*6ptu{%cB(S4fmq;01x|0bovr8lY@Opn`%kmFRNEC znWllw?y;X4%)9bwpG1T1lsKRq0 z;z;xgyLfQ#%~HNrq`dQ8PTXKuX7Ddt%}1Mh3Y`Gq;I?{GUX5%FBFUoo;gZfw+QhYN z^v)iq9;Cd7?>tH`5ybp`Imp?Ey{r6#*g+lF_P28GYEHnHpoF`IKQ<+$2qR`ljPDA( z7Ies=L0bP>cD%+var&nl5!KyN94<|?)S)eLT%GY8|Cg2m0+O$o+^4V+swM6QjGz#% z53WVQC`Wk*^Hh6w_^}b!3W#WLXlCs`HIFV$Ylt9g+NnW=9*0f&AFlVVD-9-9ZyEEQ z&vMUu!&HoY#nLV^xbO4NNKd{^ieX+L9Oa0atASmiubwRfykB+5`fu;hw$tycNeJzj zr@shK+2z(F767VwGV2gFgj442M`=3}uA3liY2wjFSsSfS(-sr!>B}BpDZMM?gQ-sI}+JTzAUt=0j8l z9G&7oi}_;I{q~Q~>1WR{h50QHj>3E1=ILqWb#w^C+}%~SK|%D z`JB6|g7fe`gvkR*<`QQ;=9WBO5vx}`)@}{ZL3TJzbWehWjAP$NuFkB$b47qyPnFnl z5q>Po93Zw6v>rZ?3qN>#lbCz5Fk{RdYdbt`mn)|wm_65P3R%B=){9YYvwr+(uf(1Jw`svJ zz$^M-SM9VjQCN24%7ZM>t@2?(A|t#?*ITg9GKaUcb_HS){*26&{M|;b6oCocmH*Rp zn7ac1(6VilKDX%}cponhr+^fx#1HYJYM1Snk72*#2j45f4%4Bl;9WKDH|!3H=xrLS zDq>oZ=;?9iyE6*w^gh;)JJd-$c0T8VHBh25t3z#nU7dRK3Y6#I@skT-UGRRMTC+Ye zv}PLZ4B&X!^0^OIG9|#X!R@yOoi9($Cgo_#%s08Jj0?yXvsu<<5bbM>lTL1gp1!T} zxJjzc_)bEn#Gg{iY2RWEJu2DE-3dpnCs5U$J?iTDRMGZ1@W*uzylm%7)$+xg{nCdS z9#t-+qT3K`94u}E3Q!l``n=y*x>Vc;D>M=@=eTXeRn(VdeIf%&I6K;WX!pqZT1B#a z^G&0xRPzl=9&U$A+O2*XOE03A0{eR zAb}xnGuf&EYA2uhKn}9+SdIAO^nePqsK?uD^>v3_2ejI@K!~``VpgH`+NESUh}55u zF=qfsE;L(1tGj8Y_O_!sbF~{PRiWG1()M0PL$)gqRaB`I8+PMa=n+-<8SawHWoomQ zV#0K}1M#yYsp9LjLrIz6N08Aamsq>7FDEu0INb! z+b9*}pzPth8klL_&17gPk)=1wh|6;E-RAvHz24eg0wlM(S^ccx3q^K*<8v%&a#Mk` z&MHg_{ALMMzSGzfeQDaJi@k)B6+5NOLE=Ysmvd(AR)?AkNs%V9;CPzz$_+K$T+ANK z0sK=)N96~m6Cba}9p^hTC%YA&aBlK1tt$KMn+AuN*p~;lGWZNyrQNM;7K&13rNr-a zplsYs!VNGRZg}}p($vb6#6vvtIwqagoQIxy>Z&;Ecj;aiH+TJh4-`&JUHafWie~Q= z{P4D>W8T0^diq+FJaeM1OTrK<(D@?Xb%y8Tx*YT)-l&;BjF_vwOpW}z>)|{#WgOy1 zwB^wwUl%h(^m|6Xz_6L1UuOQaD~VV-EUmO^o+7k`TdJ(=t-tL0PvRVoBG(UdB2w65 zDMs;F=j;E1_wi8|`=thmj|t7@tj-xVlD;67qSbTiTG>KhfUMxu=Yr}*hW)s`r&lz^Wm1{bhs@9Gd6W1GWIYZ}AeE=v&O00ntHEQHmZEMo37CS=A;&1wcr8#3hQ1IA-nn-4ggQxAih#oZNZ)4au<)1JjWfEnI*vrLd? zB8`Wrqh>dSFGVU0K4PEY%@nwsy2;g0=6(0Ikd88Id5Q(Z`~yeR)HRQj)N-ebN?Pz! zJ0wGs*wxyrje5gb!AHNpg!%NH4t*T$D^Lng@v2AAJ^0n^0;HE!$Vt-p-b8wJ1!GNQ z3L)l4X9+SBvl%B2rGFfyodt(z@OY|Mphon)lpEVoqSkQKZwyiAa)d>e#U>Q6fVsUP z{Qe9b+9RnCN&4ulMn?{QzpVD)Wv$g6HG&95kL_ZxNPG)Z=@i3n3rL6>=V64Z=Cb}5 zY24RJY0JyDl!+rLWxSsd1JmF@c&u+ufwJVJID|so9`7X!!A|~queuF~#=i6FCj5f5 zmOFqhKy0li4A3Q^*I*somh0${q2Q(Ih$T$n@d)J2Mv$``J{b0w?`8nmnwp5b)j_UnB11gar4>X2#{;ix_lAr znAYgT*}u8OU6W(A6+TnT>7{!*T*taP+0QNK>yNCwy(AF*(G0yMjI`;JM%S03m|2+3 zC@A7>RGsBag|LDDgYbv#0hQ&*qDvvW&LaHfn%396RZ=t+^Zuc_4Tc5j*)u7umQ%$H zi0E&tqoFM>6*vZtSfE*3mv*Pw1HO|3kMojFQcf!hnH09lS{A$aT?K8UX_L1{K2JtM zS%#i#Rklhf&YU_xK=bVYwwH z-(Yp%XIdM)?v0s#Tip73WWFjORCCpohy$z#twlZ+WHo8Pk=FVdIU_?Dw3J~wl1wQS z7@*TTN=xoMQatL6l}Vr2p;T+&cO!e*|G8)B<`q$H0LnL8G*YCY3?8W!$8roK{N;Si z;qM|f`h-AWXyumf2B>+`ErwFBMx<4*UwVQ+WXF;1^{pZH_7%yF6Nx;He?E0={)W=P zEqeMli7D-w1A5H%sRQyGfY6)^wTeqC{CYKC^oYrzkKdOui*jvsX)c`&+S{GX&epf6 zlgsyHT$l>NXZC+88mv2qMkQRTrdx28m}hb-da^euw|fsm6omWtPgY-DyT^rSUUjlG zfoEG)J`Q(pv^xw#U&S9SYQ~}JK5Vdowq z($L_OEk^b0H(v)aK*i?J!fX)1(cAsG3#0to7zvQc4Lw!q<4;bkR`70qHa(M#|2xn{ zFLHm}$Dp%4=(6#+)R0+7^A*nyz`GH5!%I*2D;%UE?rWLvjtV=$wp5z83PdhcpJej< zzVjh%-eJIAqirk1J%O5arh4R$k&ldj_&xwPWw4h}OKVJPd8Hx4+{aCuVZc_+o{TsNS`EUmZiC@-7V z#t@Mw^@GfeW30}&4~?^ln$fG)+bcj(6IXqWRkg$x?fb_^4a4_ za{_VeT*&~)n~7=*r6j<*e>Unh7OmIwzjv;=AMo3w*+e#}`-v&dqDG=SMzoM8cujs* z1n??Jq8gVtdx_Zq1WAu-fctuFFku5HapVSs0bJzzW z?hPSv3=#c`R8oEZ_6DBMcB(95i>}P<+9dqS8!(H)$o(tdG$lSdbytc!!?4sFVtna$ znyf7&XuXXRRrr;Fr^u~WY21J2{Ph&8(6`{&yYBO%9j07%`}DF z?GQA0J%UWi2-5Qb{@l;4?JnNrKROfp({{mk_G>xlHBhZ@=B1ZxQ>UllIu0jO7WZ}S za24HYl}<|h^onv-$yEBgy-D|_2giM=^R>(U`x-dp#6MXNm)y@F5svMsD~KSPsOdV> zGD@aHEm%{lwDti_aQ8|g+(UO-67P&R|KJ3Ac^%WcfuYilOVWYlw`U1(Z51*Th#_0- zR%br5j!73pyn^VYTzR1$tw&W8^#*){Ja`5WtoK(7&O~X2oxEj7#sSXz(|SQ(fv&fa z4}4V4w2u#>E`?wJpS;j>1W!Ea@vcff^u86zdg<4X9T&JB zN;aUm4tyAWdX~2GYKO`I`){^VyUt^Xi)tIg8vffi`n{WH%Rz)b$}yf}jbW=IxD(%f z@p`4W@wfVsP&*rbDgsBlD}W}OwxZ%R01FLQO{Ka43xjEd9A@Cn+(hng3mZy`3%)G# zs#}4B=UvaX6$GyIn%bL?DT2I8`~U1Yf?O}}ma=%JxKyrGcx@eJmUGh)Qdy_XiVgbZ z$prh*{sHkq4KrA>WvE#Fn!V`igmxo|M{Xe?G`=tF_B56q0MkJ0Y)Vd@w&z3wthBOc zSq?WtOhQX4DYPo;h|*tOIiMIE>4UlWt$LgWvuP?T_j>m`^hZ)hma8wEc&0ov4(DOF zT`WTp>dopb#2q-~GCCs9V)*5ck2*zVHiK-?%TQv!9V3#XuG+7jU!-D(+B53BGKi6i zqcL;SqVWHcAC5kX+SE(08*R5-KVnfT$wT0O;Qw>W5`2w;_2gwca{54z=l;izVZl8f zj|;m7_wz#A(>GMR-awvODaSJpfdL!^eMLcq;5}5aYk7fLSlUYg4cwv^R(cIW`W5ta z`E_&EN-@^OQ=j~?c^pvMyY*>E&z^6ASGqP*t4fhFYk%?PVPX0qWG=6c1>gJ5JJk6A z*aPItB&sIuN|zxgzZ%?S?p-&Ne;FM`toJ%!Bfa32aw{MV-S^$e6lxnxp&hEK@b+?- zIOkkp{;xf_Ki68a5ZUHJj+GSF>-iHUuQLd}7S>Xu|1<7$j}E+ce{-P*?reYc#Pq%n zAh*rHuY#YD;=Go-`iU$3+>7zr10vE3^gyTA^s%*NbJ(&h$O!K{F(8+qxN3d5%_RZh z`63=vRx_IdWaD<08^TUNGIskHfY@V$-C|Y?IzQ@YYh%qy?Z9_yll}xcK>76Ty2Tx} z&?0DSG482PiG64-)aX2bA|N;CB*)bZ(1#q))Fdwrd&445{Rhb8v^&#_9ZNcxED{jx zB{51IQr>XTr3(JjZ)Q@;`mN%KNjsBT^}oq??sH#GHF+lWp81BjGk=-;z~%Zt zn#L*Mdljv8ANFb)vz7eFNbjJRl)xVr;B~QM-hu(If-%I_XnrD)$N`v;74Gg@pI46(!I0;6W~=c7aJfPbTVfEt&(^Azf|F(1MD!Rjw;6H*ZpnLSayU)5o`e zY_W(P z=0c=|-H{`o&wsqwhucGmLgj+g=(Fu#lxx$yW7wQl+D3@YRW+F&C@`sNf^Vq zc3$6hnSO};4@%K+Y@~^(B!H9c#ytB0_O^zo!R7&|?j8&$iSYR^| zPddQ2(?A~yx44+OXF05fW3l(FnH!SYHd-In? z`sw52oiFFYg_}dhijl^5Lj{=Gb-w{JrI}l_BI5c@?I~DmR#fa_rUSU>qoR(B8N7W& zz@bXbg1c&`RSVCm081JrHZYRcqQ7Ag4M^obbQjM^aX)O$Zq9c7!1SB==CDO#T~vJs zbH;VxY~Ed0%PL>9Jt)=<5Y+3|0TWIB1%XUfi*uyHe1E zVUdY=+-J~-%kt(^2kv&yVipS^3LXuDU!?rhu&CMg(&Q{%S_w(D!@u0m^9tvD?L2P%c3zw!rzoUBa)BPehN;K%;V!cJxkY2gGhbN&O&8>a0 z(TGGUrI8Ox-Uq~I%ioi#USz$6F*utgt~ky|Ga;mZ>+x15`9bErz~Ox^1pRdYZzrPFXtN zX@jAV^&3YHcj}fBNBS7;m)l1JQyBwr!FT4Bg4q0NuJcO5EL!?0z*Uf+)ZuoHY&;A^ z{+ZWSYSa_M-0C){Iy|@`G-u(T5pLycLAE}UK6~DY-1$nXshlv*w*czcn6TcYP_YD?+P*^sdTv8vi?ogqAQArW9^xb#7kLS=%{!{=2Ix^o3B5d=}np z%h_T^K-q<}>1-l{7trp;+(r8II;f5KPRC2%{wBOo?tg0mC@U6hDbCPG6ppoyTF5B` zAAV|kL+Yj;h`zm54Xy z@$SI)ED55?S#}mvV645q=YD_td^TtN%E+Dg54uAf*Mb13UT&HjD$U%@A4S$@TY;R2 z9GhU7SB*@iGI15nt>JlnKg8gZPe(7`KE>wU8wEePzB#SDzl1|$ruTZWJ9f+%ND{P@ zJY9cQB;fRM1BxlzEOy_qg6VvBLWqH4opMsS!Vl3W-u*Z6LD|&h_6qbOdcdha$kaxk z!fA&d1R!i*C^orVCBRm(Z_17K<|-zd-A=!76{?jn0!j0#3$XzGUD{`4srvwAwPTpZ zg0@?VVu;B?@Oj&rB1;mheKW|KfW!+=np{@}TvJ#e%8M+h`Ya(Xz2$abjS8JZgTza@ zRlzaw&wijBy*=MW;SC*0=d;3NF_wqmb+9#aCdK_44&m(hkz#!laFWjFVG`tyjQ(_Q zTcMYfTpZ55Wu}ajcfkS3flE#|Nwq$Dr~J|yN6HXC9S^v1en2Ee1{|ucaTgm+3%e0O3vgZmD=XiHd56J!+;Z3hk7CUcF^08umksVk*}nM z?Kyy!jaH2{V;IQV99?VBB4bpZWXvFa0EsiSyb1`&HZkw$(Q6lP>2d@x=rxL?UjHAE zjLz*&e6}k0C=o4=hf07YDyHgDRie;lT0qw+bf|L9&G~0odVV?@9CYR)FAx?axd<>>*nG0PE8ApC!nS6KlA0Mb+^^(M;i4l{cUX;YB6cR`kS+#)o`Dw;C zIa_qsbDbvgUGOtBagqR8C2YnO(oHZykbINS3Pd^tCc}7aQ(=$Dc&7xjeGr=^Qt>U= zLFjlw%Izi9I`6E3Z+$JsxKdw)5%(cc5oD9x`406a+Sg(%s;c8B8KxS-h|a-&~5je$KY8BBv`3nAl)r`MpEE)4ianOFP=9lbkkK++84 zdb9SDYv8+IQu0WKyaKt#7L#<&+U=Xn_5W)ZE6fa14WhtO{N1o~$flNCy~Oe*;^_;1 z0o4qChl)(pJ$`Np$Lu+U4Mpasdny9bPk+!T^Hp0r!~V!PeH84jrk4Z6(BLgzi15jb&=m`xb=K>h~%Se8GA>7}CkeiQ>GL~*I-qI%$OeN|dIO0k3 zxm6`KUr_C`-FJE;g}V6FS;Wm26&2z>Pn*z1atR&bVcLt7Jz zbg#BpMMN8ml`g$}`Vin_rD5ofZ!Pj}k&m$J%qy^c$G$QLhh@+)DSg*7`gC!@b4aVO z3e=vJV0KQ{;*h|eZ?w?)grNrJ&}(#>ABbph3KMysD0^?+=*j9{EWt>pM(^CH%e*Yv zrr3_n3m|{MeeFu)bI4@B92zEO$_4d2ha?g0{`_urCNxOC> za3H_SVmjR#!5@mSMoWb^tF1I1cEI0|^fCi_OJYQhTMXtI1h_kfRY1tH{?;10#pQ)=&?7@;inv$ptTzd{Dz3^$@jT_vo=&j_o z4=D|sKPBj|1GL1~ZZEcr)1Rip(?E{t){7@;vI}i$1a8uNb_O`_lBqP zNXVpBA&ER#E%*C z*?%3&7;$N}HsYVlm~_}2$VCXqR<&10&TG2di@P9RBE2Esv#K(cp&u<@nHD1Ft*=FO z#SG&p)yo!4ZXj`o2J}V(r!Qg`k_PwsdOKD?$(fbmG>}2Ji%EQ}4b3J{`CuU6|3ixxA26@6|jaKyC65jkwG1yze5lwIFUmF1sM zoIAp8%Un_NfC|)Ot2X1Aia=qhs^q48O5t{aPSJk72vVyERd8*`!3u;dO&KKZnU9(5 zJof{1qL?MzIN~{!Tql0veOm)lHNb)S&$Z~+uyFSRlqZ;ncNySZc=%p$z>I|3hDXXy#8JX^LFK?u{1{RJ1a#+#N>ZfE+4W;GssX&pRW%GR!UZZ9Y;K-bY^{N{>ylCFclrBxq| z61)>$;xKOSS2kb|)SH$jD9QLaBOVMqiBrN=Wmu77ZT7kS=x}TQL&h9o(kKCvfIi7& z^tvFDC+e&yNw6#>LM-Aj&ey9ghF@8B`a8|~KyvFFX%&Aanncl04hPKiNWui|xEKn) zID#z}IQY^Tu-7iY|Kx{-+7V3deQGc4#?Ik77<58BD|gqYgRNe-&(NN;tW#0xzdlBJ z)gcK~0P?zd6&aSIt&1=hNPei_=u~DEQ7DzbsAU*Yq}pOLRZ~@MzC2~!=w=xRXg*`k z)LWqX$Rl=kG6d7^#Hsz#z^gn+#0~|xx#Ui8Ga?27g8lst>RNJRlhKPnUU}b)kHxz= z$m==A{cGm1nNg6P_IgQNc`f8ot&tc6R9++ZLu@s(L9AH|V-9{8IZC#eyxBQwJF?{S zzN=3`Qmqtb5zv)40yBqxiA^kG;XUhi^MG{8OAT>2Ur-66#M3IZqwt{}rT~7FB*6JR z>lE>~tJz`;_=FJEXW@d?KSe&fGqSJ6hf?>yZO%SRIV3>Q*}WR>RI_o zfX;pQ^BL}QLgX%e^$^_tn);U&&>ayAg8gCj^!SuI>p0z(+a1~=lLghw!{mI>NF}9M z_-*9XlF(QJRI~XyLgG2mnxX`<~i>dh=BS`uVgbzV1f|- zP|79@ORrYYWND?u{uOhsBhLrE}996pt^J^OHUnXSl zKPE)8!15KH)2)^rY>dg_Q-lAO%i(3@Tm=83wKr?*+9| zjk1F#$Sy~22ticfxuu2@x7)7A8y@@QWzpA~8%NUFyvF2H#46+lb>0=7mT-XRljmHI zZ9R^^vV%R~$EG&I`GS14VuhG?is8?z;PA6USWS=b)@sN!{LDqtnTcMZIMR4HRf2SI ze4W~4%XW6fu+M_ay^D+wMEH0&NX&pu`JG-Dw@|miccU*|1-mPPi9luU_b~0=Q9x+I zSv^AvN37tBlbv&>Htr7}Vf15gjkwp)AGR{>-dODGT?L26KG+bJ_a}w2gq(_pOz*tT z(5J+{_|iaMk+SP5 zK6R~medF%Lu$bnV|1XrHSk5S1RdTBg$Vi-?Qxb}ahmhNk4tJXNnr|{+T1p%u@I6NH zCOB|Uh0e>+_Q62yK1OjD*HgrD10pfJuF(KqmrH6s&P#3F4Y`lOX4fJ}dyBl(8Um^dzkL!>`U(n}u45 z3d8Pa)q!R-ywdyl@c`6HJXjiB|2DOq&hVF z0y=GqEvh;`uHRYmsq<)D8C$Skjw6zoA+=jvk~oD2*f0mEhhS#7RBc^XC6wt_DE}|U z-a4$RZtMG31VLIrLK;N6QRzlfknR!z>CR0^D=Cenba%rBq`SL8x*Mc_bKmFuuJ^gm zbKckcFPB``+H0=4W{okv<1^Uu1Db>gL~RqDupK8AHLXo&GQ!EkbEy+p&8lSLcU`9} zwh70I>2I&kUnf|?oPtzwA4--&2|gJ2PV6yQsa8M9L0es@L|Jxh9@|nk$M}kzic%{V zu84!ntiyY0zbADzG<%E2p>1-#dA~q*Y2W%*TOr@bfq<<`8^7Wen(a7&>*#ciVUUr= z*sC?!W*iFH*dji7E)1WtG%@5}UmJrtXfD_#S(6p<%MTtEEM;1>>~kY1BIzZK&n+G8 zcaw2sze||lwgNGbje(R&@}RvBRObd4uP-WeAq2<2D3q#MuN@3}61`2%OqD`26x1mAj2utGOvw;ODhtIWrc~(gO80E(&Lbg4f z?BghScfU0Bc>Du&TI(vu4m=q0pRC^v2iMvjCbX)2cSrcOv12m2$x;Vid#}V3$@5SL ztuGLljx2<5tcrL0T|GjOYR*k6q|fLx6)$>yg%$D7oik8ah|PAlO|U5)pJq~%E2I3l z=9Q<}k_Hi%Q5r5~f9TKU?nuvq6GZtUvC+p7%!9LalHj0G+5jST!J#AqTth1~hx%qy35&zE6(%qW^=1Ty6U3#^!sk zNRwWwzh(c3;=(yLbJTDNky*&oeYIDhNL6Hb<^EKodVEY8ZkUw?LTv!|ePKcF1O4)- zC0d6rCXnD-d`2GByl6Uv9%n_L+S6>AHf6wpy=m$LJmtn{7rC%PEzKM?G z$#i(`a_MLM$mHo=JC00i3hMK3+-LRe410e? zCtHn+2=r5G+Z&`Z5CtsTQWSFT`q9U9)f}{k{p%YZI5Qh>BRFDwa|vtpJ^#2v$QHFkF9jdZSrbmq4Cm< z(%V!?cb;qLajXrjosoJ*jTq9`J)q$OP8k5`N&GaW2G-mL+ zKSm>=qmJGPJ(B6DHJi)v8p~IdM#iHzMB{Rrp!P1wIgDUXEe#y!U*vId@KDT8)tD}K zN;!9BHoC1ERXJ{AQjXek5N4j!Qdo9a7%$|t@Y@R*+$LB zS*`h^BB#!>L;&BnH`QnUpcl-{RMTSZCZ@x{h1;ChPAcN6z4h?^8foi5;nRNcf>trG zLAsig=#-_d!TLfRjK`=+yGSE~9;BMv^++-Dzv(q3vt)P(c-a~P>N;G-Ig|73r z&6+%NvAn@|cEceZ&soR)VUiSrF+NMdl>Mw34V}g-p8}0~q4|TRY7YUM5NMWd0xrGA zd$KrJHn-~6<_meEqYX3lqZMB70~2G>qVZ^K^Igl>jR$+T9SB$ZxKwFqE1IpCc@^lR znG2!ni%*8oF2129RQ2q;U$2ECPn)4KM`b9cS>JLWa=$YQJY##|KJ=7gIn^pG2O?rh zaGbn>7dM37r;@u;lP5g-LAS*D=+`!8=Rsqnc-@)f{EDm7!3(R8N1jje9Xj_lJ{4-@ zCMqfFR4w2OGgG$Nx;Zdke~P$w$0Lv6aXiQmD1ofabe?8~G&BG>Zflof-P#H9mCncF z*4iSqqKcm<(_d!KT?=&U@6yj7G}>S0on1VfX-Vg9I_7M@L@y||W3c>NaOLMHMafZu zZsx%aDepds_j>-5l<1Gl?cs3hSQ61t=G?O>lGz!QrklG)nR$C@S*;^H0rHY8DI)QB z9BGEi=+3OGQLfLo&KsqD(~g?2N$TjE?$3%{*RP7F5ESj>8rNb9rkunfiSZ9_B6zb~ z@9zqrN&$>bMeTF$>17(1%HjpT<(KA>2gfK$jmpo_<+6eZ&MF-T(8$LY%)K=pNE}{%8Db6W7>}*-{8+cMaaBjrW{~k|Kb9j;(x5s_ zutAn^oOXE!xu{-g6=8W5DV8km8!Fl*;!7g(X_iAurn&X!7dGCxd&#v_UvV|5=tvHh z@Uc<1!*u~$wH6T^42q`{co=f&-sG#hVpNznCxh5Yp4h434X=22Z$$VCI$C9Q!|)~v zgbxANT@fqyaL^=5JpauG;U&M>SdsBN)_2=uWiILTeW}X$q4dqf>_sX0+xpzRP6{~z z8<>xM*y<4}@LfOXS@~T3Q1iUFHCdZh(>=h_p}oG?Kc;a*d_`?cOmZxu7O-@g=gJx8 zmfrY0^x=mK?Xw{gVXc`8kBNr<$x`0RfFD7zxDoWti?L?-2Fn^y>!UPW9fe#wqy5t4 zbLt*f?QSYxrsKw}JDrsnUPrI-GYPRg@mY~ib4 z)qQv(Q;WJ|2mEdM8Iln-E@h8jq3`E9DHoZn`p8DH=>MR|&1S_MIE&TY&s%&Ls}^_- zedAwC5ycXEq#SMZlMqFc)T%>_5US>zm{dbe!C`BU^Wcc@<|sQs<3T%@T*Qmg43)|3 z+F1BbRqQl90dSwglnH-L2-YH6amMZd6sgcs!fNR{jJ~?tACcu%D7= z?arkPUZZ0ME<2N*wsL-V@1mB}UCzV~?ivga4tlwLXY&Q_sXX(aP^ta`x#tVS0nFD( zCYs1u|W1_f}tJ)0b^?KF9YZVw{T8l2i?ZENogmG7z*@>LjVm2$q}Fls0Tr4G1WpT{t2X1HB`CedA{ zjhnd`bihIiegI!uwa4=W+8^8?;PyqSP+{7<*Tk-7@p_5 zT)8Ucp$p7ygl@>m z_j1WK5vm4+G5qeXFjm%i9ekw6?NxWyyM&LRh}T2gFvqPCu`HSIzqU7j`%cwaFAIyC z{Cu~2Kku{{ZPj?$QHVui(L{d$|NIFr8XRydYVpV4eMOJ{df-*6)Ps$`kSXM%6<@__ zI9(!XM~sZyIoqI#XEIzMDZ_R836j`F%I&;~|E zvFMngT_0GLSuAGKDv7vPuV#NLI&XH_dT?U=O|$fGG_BVVOq9>A@BS9YQ zW_R>0E8+T#cbH8p_IBh*k^GbA)fP1*T!)n7(>GKCHqm0rQ!}tmC_A@j0MWi4%+_KO z|II5PAP{YQShe8j(H26e>YK)L2aXW0|{CLvxNVn1Ul^_?21Q`Vq!+RG? z@i5|ps{A&(j3waHY4as@$PZ2>tPzN!(UvXo?N8!k7nB{w4}2*_`q~3UGY{GU;&+Z} zv#$#?plH&gm6mdgqlr|I1)P#@}c`47i}`yU3y&y>|V@SoVYE_*iCj{9Mu9 zE?Wz0lD`?l|DwcU62pjp=*Fy%Nkr`NWDI6#8Fh;a&kQ89ZY^y2YdYS_RmdNb0K@0&-ul2@KIc$%SbOyu)5@ieA z9Qt%#0YAL-0lz!nMCmtp3h$qho_FDDgQCf+8&7Te<`Dm8e*902BDfZP0h0WmN+w(* zvje4QE2?1z{^ne5dBk4G8@MEC@c54>>-}`_TbgzK^Yu;+MZ>_Mg$%E};`My$f!7mY zJtjq#8TRJge2azK0ViQZGk;WqM}@`+|F37lnjkm^u#_C8DNXo15ag`kgRwUjBWf{B z+Rrz=s3g7#X33>6o$b^gPk#4DN(U4?xAH9;m$jZ}E_;=ebK9>i=V-tnjRvT@n&{a# z+vEAvC+o~5cs76JNR!3GCQrZYCmAjx*kff{dr$j`xK=?i1|bry@jPW^*-jg8qO20} zFcL|q^O5(i!JxkD?UlpUVp9`?Rt-xRKk!OK7<7h>)^kWm75pv3=kEb&*mU*Ekpo!0 zF@XTqVm1jO4%S-knA@X0Fclm zbu8f~`_RZ@0xI@xr7Ys_`^NufK$C65@LXqu`oX+#;KeQ~!U*`J9-|ZeR>H9UeYiYQ zFSnS@jkurq$KUw?n_u_?bJF;*AM6mMoVGsX*aHZll4X}x*BPW%9*Y?c*BJj-YN6u) zZ5jR_FvoBh%}~P4mb3CFAWfkqzO&C2k{!Je5B>%YQE$7*$MaR?76@5Bb4gSBzIOT( zzcD-j{92bC6DKw)XyVyJ6&x$%W&6GOS7m0COqYN>w+d){spq_Y)FuFz_rh$V00u3} zRcYY%8=>(?vcCE+tI7Xp>HCV^fs9eObNMX0#34jct7xi!!SJNCp$WW2`|uX z>Kh5-(to~b8OB<44qvNTmI4GSVKegQ2LVSVXq|nwFZMC$5JfARQnWuU z0I)T{8mxei#lM_|N5BS(iv}m{e_ty9z4QGwzrNUlo8Hzcc0BO`PtrmBbK?Zz^o2k_ ztG!>ve<}+ud?`23|4eZu(*O|F=Ztb@rvfx!LfsRcApL`zC}917)H5d@2b(?X5?o|| z?uRxBFz^gkO~S4a-!*e=r-+a|{PRtskHJlpt?EleZeSrDGyb^yKgaU_?Rv=z^clu` zHJnQr`t4@p3;Q1yu)o$Y7;IOGQ##S$0eI#kGW~zhyl;X?peN8CayYtN!M3?uyPpLA zvGe?w{|edzJQ)XfVmrPwD(I3W$qn+qnV0{S1}w-4BT1vb=lb{?*5`M@wTS;<6g>g0 z>hLWmLJJG`HsRpS<$dwzo1BqhuY#~SXSn$UznSBd(gyy|H-WK>DVfA(QuE>WVpC6x z0|pWATi9ewmwkf~^QYDLGkgoc?v7fE_YwP20fP8Txp+>7fHk#$GU!=@ABY@xlwgx+ zqsMxi*mFhlqW`(I&M-17zxLf61PQielXE)$jYIgqceua)Vhzh|M?-v*h74OW)?{pw z|J*>#TG$Yr+XyH}@dd9a__O36pz0-l!T{jzE$toQe&D7q+n4|SjQsa@ewhI;^>*(B z&%hYa)jE=0N&W%(-Io@;i+*6Fj~EWPfC)VQ0TF!@1}Z=0ZyG+|1W%k*?0xj-?(;%| zVbq0f?2Pqc`+{2dD(64wy>eLZO>YSFknjN#IAojC=FcDZixR9K@dzJVP%BP6Zf}7IEwtjs?1HI=D|M$4o|7CefC5PdZPp2+& z!34P)8?x*C2OUueTX9vg+1H6s5k}+eid-`O!A;4aBmAkgLy0Y67laz<|6pHa4Fn?& z-=Qvjuo)oo`8OiO|8!yj4UvlkH)TtvT%)ssejtC_8T#ke3BtVwooB&P^V|XUZrmGz z?Eip~-z5XS&PRTpM9m-IogN3ioKe0x@T9m`BpuATFGZEUzF72JBRvy{*%o;Ir|m@$ z6$Z9`oP4@z-32~lt2*ix{*MrTkmjvHgH~raH73jnc!8cYiT-G^p?~THdDsz Rj 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�+`&+iYJYyRfve^dl-eiGd?PJnhZ!Q*=( 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

+YKyXa*(wN&DlH8($OTz1^;zFUf!Y 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 z zwEYiC5y*nu^gj{5)%WT7)O+&eSu~wI$)ufv^Xg<>b&cP*INL-S zwi<-7chm>p--vqpL5Bk|NY0a+)LW)X8BuGg4s`Z;tQ~#=;l9^Df*T&BHL9qX#aL+R zZ`^dM5rnkc0vXNUflGp~1CPy!cp#7(171V}pZA%v4d5};d}Rgt!owA9k9gk~XfcG^ z98&+cUaQosU6_31vTXIZGSWjE>}l7O^K-$y-SK<2mv8pjYA#Tq2OKzaU&8ztqdwCBh-SNdJ7X&A9(?=aeYCTG{3={e2n4e;m3^cz$|Bl<+scv>T1;ypT#)KiELu~*AX zEe=Ua;#J>DW&T=^PvZJ3Yxyts4z5kkcev6u+Ht91&E^pT8_4n^NrKU#7JbHdPY3~y z@34QPgo&6uWmO~waD&jE$QXxEAFU3rj+?i%Ow2OHt)1D@#@5}izl7aIfS)MYM@HT^ z5-)Vk&D~q}I9Ee`SX_(;t7o4X5_ScGkpvegA3@yU= z3w*VRXI>2dPptgrOd_(#A%pne3fjeqU;d>aX|m~@A$}=^+G3rQw0osoMjUKpLme}Rf{u~|55#dk17`&B!KPn zk^>?9&F-%}`^_oup(6^!1t18YWfcEkzy3e)D1ir%tN>|=1;Al0L{R{O~sQ3pUb!MIJWFF8b>ftA>QhzZJoBp?yMlVc$ z@-7Fe33_RJVF<2&5F62Ln%_J4KA|#fQy8%N$Nn7Re>1(*-$KfnYwLbTO9KqN|C$K* zHv^4-+ftfFG{FRJSlz=ciqV6=83_4@V(CYT16po?;`Ot{zhaf`pS*0nG^g|o+!n=a85-)=iJ)z@OXadUwE zPrCurU;r}Mdemf|h*lqd>@~)Ysi5uazuA8UH{=1WGIg_ffK>hF^QXB0Q0_MyW12rJ zW9Bq~5666=)d~+!1$b4+T!B>oz9jz#sni}fQ-9}K`yyEEgRh0|JPpmKKP!`CIxxA^ z773Y562P6aRR)Fqd5jdL4uDHG_WbodAB>XRJR*(npGTd*C_!2RvN_;@b=dSYgZWo~ zSPIH9!0k0nrdtj52L?;Aoj&~wA7%x%cE`1K#->re7QK+t0sKGj@he$iBIDn{O<~vo z(i%=!nE#(x1AIf61DxHAyhi%~K-C5>CR+YkV|uuNm2=vUU=wOaR$x012uc6L3jA6k zMHo|$u;n*t0E+csy+nq;pu_`EI^B<8Z%TfEphN)w=Mj`XGB7$QAH%2}fw9z*Luh|t ztU>^{zv>lW;WFq^bDrOma|Hc)i?9)ZdAw8D;CdkkEPGe(*>+oazbr*$Uj%?|6$F2QmKK}-n2!*TMGh&TO@Yt7o7JW7LO7i;4L5d z*h3CRDW*0c1V97*gAn;ZV3ZDRiSWr5(EwOj z;YE5ay4<$&bXqmm(I@Nu(wC0wCbxm-(UmI*ze*21ADN6|DfWp2=z4Mtszr1FWS(Mn znF51yoQe+Zdfe6(rX4n<@mRjlkc+M z#+{*mJ+Y+0{grT7L-WZW%h~=~V>`j1_leYkpNFykAqltjcU5?OS^e89=aXR(i8nxn zYlL#4D)Z>sk>S5iM)c7#FdK~S$j_l6qAVym{c21JCjIdixGD^UZ_^r_t5FsV#XI_8 zW=Yf>Hm{d;;8RmBbJLI_okmrpB9+4U@uGLsO;TGa|8BoCr(r9`eFm|A@~Hl4;w*lTN9mUpYFKzWqxp+8z3yzt`|qim3AiQ z9pfyueUA65v;V)DkU}5q7+Oc5)T_)u^QE6;N)s}xd96-T8Dcp(dVT+-G3*jGVH=Qj zx^qDJbM)Z#BgimSk>XjHEBL=xy}>K7NEUt@_^;yW(*t~cI4K`%BFdwBN}#NwN=mg< zgE^oN-L4}L17YmVy-qs|o`x|gj5P&ofCS=8JT)uZ0=u`~zRj|di~DF^h4m{jD|7!d62DVnLQ z(r_7ifid)n>R%6d08aa{%$KKwyT-Ai4rn=S^>x-WFSy+E3dT$I^qfCB*;>4|W1|M5 zMRcmbgB{D=`pE&I1bsUbR$mEZYNpDjYB33UUjC~T13nwf*%;t33B$prvu%4XJiuI{ zM~gwi8QT}fC>dp>`^#U+f=y0v*LimeZ2>Hx2>5mdVGYYUa7Z zyzlma28T)Li~8v-uoJyjjkXI%|MV|iHiR(^x7gquI*`aG-A5m@KbXRWMnPrtuiFWP z%ZOnn`elD`<(tepgfWY;-0i(;%Nd508RPk1d&mUrp(&yOpJ^bq(Z70wKGv`^%cea{ zgc0^Q0wXo7C-kB02XQ@9)JOmS8S8UzcPRMaD_uOB_9v$yK51NphYuxs>9T?!;y-r6 zOdR9bOyw}ed8LevqmZ>m8H|bx-^*tfu~yg;xv-m-@?%cNh1K4>X>)%_MqYlH=X1hc zW5NF`#keqcE(@jd&L3vZu#1XfVden+A*$zbJx&k1FsTOGzn*2!0Do!h6`tuW3e5GU zQrDn|J^JL)L?=*-U@<$JvF2_flUmd8Mwj|2N)19t5AeJ$_7t&*17qbviqmK zG4p?8Dt^b(qF@FMPd4$K7Ut{v>zic59@R%y*a{sE7mYYx?$P{zr}+Q*KjjFp+ce2+ zyYk2Y11N2MZ((xSikPRk|kT*U3U@1RNrRPYwik z-ob8NSVxN{jK(XmMEtF;-&;PE6e|@5rnJ9Nm8F>VMmnxuVI&jy)wAr7a#q<^TycA;2<$U6Hfsc%>nPm+xz>m6foeDE=F-OBlYE~gXsC^ruLpQxHWz?FaHr!51j#MpGn~rmyg{J@}Vw~;f`#7@<@QcE9#JRLy(XVX%Nu5%)ZlpGBUk*@mNNw1RG)OF~Q8a7R0}KuWvZr z6~fzmw9 z1S%2qI5{$b9;;GFqA=3>yQeg4&dV%5gx`+wPo*zc@&odPJrnv9MO>x&SJB=qY86T< z9|qbWef>d=CZhpLkn_&>aohe%fK6S%B=fl&sVLqq*P8vgtzc!?yqn7mTlQ)t{hOwU z^lO)J{V1Z9>)dliW!h93ug_ku1aGeTsunJBR8p73iAEybCVkVy zilxiAx_J<5oBKFnmp{9N=M(=ZL#6(NFxYX)5|8`1zMoM#8$M|LM?ExZ9_V|zG@3~l z9kYz>XT+CYi*{zfW!1@ejQtL6bC{l0`yF50loc<_a*2cswu}?6ZvD~Fv8JraZI`o3 zwq_D!L3X=>v{3(QJ2CvEFUt9oeCNWVu0<4!%^(XB7}|toJS|WCRc%;$zu-UnW+m#9bEA74E8s8FCt09$=%NDo+FZBNu3 zdZvoqS`dooOk9T0A;^(b$Tan={?u0KyqIT^j^_ucNl0etbjQjr3TPmF>+=XWRZkIyBfzgI*D!q5QqPTpQ7)s=Z4VTCz4rpw_vCgJWYi#B>x2tX@P(q_CD*Prp4X>`pfQm@u@ z$ydXJpKcF8eH(CMk}Z07Q{jF8P@_;+j?KE`xQNPiC%Jkzf{C0qjv*F07}wx5Ws7ec zgS6ndImC=Fj=uA9O{dn&&!W5e>oa=Ay0TcNcQS7YSXscQITs}r`>mTka7f0d@ir9} z{RCn{;0cmK?4g&DDqrn)%Je_OkJ-$*Ze7|&+03~l-bz1aWx(%GaKgerhjtK)TdnU@ zSG=67mJT>b<#XEM+Xlzcu}FkIzBs><5U4qvHi%Hk(-%{^`2M-0!T`9NHro2>5)Mvf zU&qs{C}KPEF>4i1p?F;E%@nS@_44UY6c9d{B zoaVNjg-8G>_r@Sf8BWL-2h93dY2LYdr-UNy%E@^OBrHCKJidG?K)wk=ZEH(G>+B!U) zWZ+sbF;4Q1w5xog-#vxgs&+C#+Uea2ziNT{0@Uk0bTIhv`0>??tlOmZ#N!Rn?!IeZ z-Em7Ybn$!J;+yQZ_;9)W9^a(up?5(8C%4cA<|fud{OJv^nOeJydONh;YtAniw-3@! zpGtguHUC)f<^A^kM?yw|V_`bb)_1CzDsW{iz0NF@j6}smllPO$D~3ed5ie9vgQ_Xx z)h^lOFEy{eUvti$+V>y6;b#h++>0q7MtpqPFFr$c{y_jF^~|+o^&5W|75rRI+7UVs1W=PqV~3x>hx==CS(+}!zc(iV(elgPH;9}YX8GQ z;g7PahI>1_Pr%zpO|o6*jO7)0JW4Y3QD0+6z9sB^j(;Y&f7#fLc{IW@a8CNZzqJy- zs0|yk6h~C-gW~I7w@J=hvpHL|;3&#aNN7oK<63pmJt{Q1JMr9<2ZZY7tR{>5~_0DW!EHb>s{HS3I*YaJ?;X@i*{RU!d_S9*VYjfJ=~s#ox&wUlnD{>~&^`QyE*-BScOd3y|#5kaMz2&sck1$1k&i&;aWy(7lm4;43t z^RHvD*zFETU#v@kJ8$BqG1Jm&mhSwbh1IA3U|E| zcS5S^esFu)>YY!npjYWse$;R+RwcB44tm?j^5(+A+!f@rD(s5EmwueydMR;o&}od~ zZ!U4~@9}-%3V_yvdRKWqO^@N~^KPmsml>Jg5DL6wO82$+kZ=n0z`##ZNQeZuave~x zy;Q&TWtV&Qu=~~77mFsfHjz=+uTagy(d#Flhe8PlOuPg-XKU-Bc+Gz6JA+6AcEz(- z=+lc@w)Ik1*0EUHM#I&vyX{b^j7?EbNr&OD&ax1j)fc}kmFNWxa1C+SyJvF00PGaY z4@~^ zdE{!PoZ%N)Hs1rO(Xh{xGdw<}DlCfdOo&Lw_pWVoa4}^^Y`LLdtCnhN$XSgH_%qg| zGy(A2cVojwvb;uGU0(5wN}5Bw=a0$e<(MI}FFp%zvT8H6+;a^h$9b7hYP+Zo>)CnD zycsj?^Ofj@i&s&8)>eNnxS>W?CFdD|eWS@OqJduhbZy$ z<^RS4i0Kq#wm0l>8!hS$S;%VcU*MiBR#JK$nep}hNWOV-Pp*!Z-yBm1`6wo5DC&8? z>a?tneDImhur(`!Cn88;u{0*PzokL1;wRDcphs_pNJf>_kGB$oFT_YL_I@zlBHd!E zyQ+5Aytu7h^n;X?56`5{BJ>U18I=r-n6yE=}ohD_=c9dB4zYuzRckZ z`5s+z%3xS_W}JE2^ccDpy`7NdrlzL43N+9+zKDLY3B*gUEwt;do|U z{PAR_wu~bQ^}HlDZjN*7ZFwIecmEjLW|-1*t&XLOe#%)-3q5815@s%J)MZ!U)qz+k zUztNI9jcVv-$`iYO}gGHh`4`sS0P3-Fh}o{aLDDS4GNfG$dH%ISL#{oI&-VixjMnU zw7Mj(-!6JF3UQ$VyL>0UG}~_$<&Y*AGP!8%!RdcQa*lQpz_UV%zfxpSM%vx@ZucyZ zEDgB2)NePLyiO&B$_Rn$78#Q2LA5Bkp|?&ubcZH3Z~OLj`UA=IYr6T%BZc939Vo8X zE{NUa5C#d<*qU@CCURRes83bCR#PcaF^JfUf%zIO%0S+OTGA$0Svsadg6ujeO~$o? z#Snth2_JASM)59Td?P2Pz0Ep#$l$133FuZ&=`2@r_sPf;w1aATJ;BKO8b;^V1x?^B zhwHuRaanyGm$B*4){qogd{$izjfPZGkLDU%4@1$DB3gpJ*Z3W~Dt)Ye2c`Jad)?1J zS>dp@ou%|@t@W1Tbp7PLTn&F5DL2>3%rKvN_uZrN=LLpJwrs~*2&rzleW06{SD~}m zbeW6epzrG*e{)rANUB7tdDA;jAvl4t#y78e? zadtOWuXKW2^cJmOVq=cq@5DdlMzLuXRMMewn zlebe)Cs%W*mnk2=41q&}UgFw#hcL_wBekzh!L>xUYz%RDGGBcMFikAzy&G3c+)XC; z7T4EkXnS`{oAt<>8?N=`{(|Q(Wq^ZZBg6H8x&9I)%r==@vv>0dYK#>Uneom-1v7W z*Ht1x`c2EhEroPO@ccZh#TF>Ie)2og;%C0BW8F|mOr`N%=uo#?f>G7&;{${;VqS~T zy-|f@HprNKUa}rP4+}#=Ewjm_#0f3Vt@+o(2`ujg>=A*{rb&^T(g?w#5%RmyMa!SJ z_W#5Po=r9nzPNH<*99M6SD&QZl~e?VuwrK&ZtKc@Z_x<-I{bP@VTydt5S$*lksflE zoN2@PPXw$CxLj-E-V7)L|K@13AoFE-a`g-ZcWSOx3p6UtDT|x;k$-Lxt0U$yc)Rte z0YUdm;rq-fO$dS#s21~bJ3%zqz@4;3Uc>p~IKhdveSqO`PNoEMh&hQMQE|QDGl&9oUm6!g7*r8>zLRIa@XVa! z+k^r2>%yu1$;|VEM-ZBrPZzsIQ+}q-MZob?Ct3PjknOhUeLikihvW81oL9;q|MwZLIRr61)|Y~?Vs{`U0f!dj53xcak!tJ zt9|ustU0+sW9?7SJLfs9e0VFI5Qw4V*lDxati#f{Vi~hIj)nA!AN~Dg-aDZ(@U(o# z`W+GlH+ke3%{{TYT}$ig{hBHB;7TrqC*@!YPi0EG*TH&5R* z{Pk~ETU|ii+S6Zhagg8`(^#iB{h$l+h!{Iale6Ey=?otje(U_vsD$Wa{aNv9?~e0* za0sdXRKRsuHrZ!*rQokTi?fpUHu?w?bEHq}(h}cQnqq82FKP1y?ON_kqXf^-oTyU3 z4v}cKK!A~Z2rBjJ2Vsl&icu#mvYjenx8X;Q_9hDwAttb zUj|OX-;D0YJ+H8F?GvqUWQ9;(FY0jg2w30DlR54p^~;vOo0{XqK0BB3bwx&h#023f%nP#9419P|xF|y)6SPBFaQ?k|3UPr-TKQX7 z>(?ntM0C%(h+dJM9~-sv7v87g4^Vv`tSD1B1L3(d{RRYh7-!V2t5#n`^|3nUqf(N7b* zPB0x8QHsw%N(6f+5(^3vvBTHnoHnP-OBzJdfJwE^7!##Ez7g^k`)=G^1wVENhuFt4 z+@$|%5M}kXG<%xz7V+$OgDettvoPqs$uS8vosGm{B@1mhp_{^!w+s!U>8|UQ&7{-7 zR5o-wdbUP$G7@x%;H71>qF6X-GkAE;qg=NCoyuf%3DUAD9VzXW^uxh+(c?BwD^A;W zmHCB9pK|@u&FNZiHwDHlf#os+zA2?#Uv9X7_wiCjuWsS2Q-2(Uh0#=E=&syCJRYmO`%YP$cjk2hkbm+kpjkn zzUBGt!X=#@U)QL-5OkmTa%T##Xa@oCeaw@1v39A%_4lI=)Zann8LAq4%2=JLg=F)pKcSA z!OCR$fF&;CS^Q=BWio^g@I~{QZ|fzQa&+lpYum$8X%I2D#kc}e8d^T#vJ3u9JR%s+ z#d1p1sZN#Cx!yNl;M^!IG&vs)UX>Qg>` z-s3g2_i)7IA14Y`qZJt-2cvB__{1gn3+T z_370cCz)w=EwA}+`4z?%Cz%|RVoZVd=+TesZEpR?)e)53WrEX@^+La=kZ@n!!x5$r zWsj$zlK0t0=!}ol-x3iU)an98nol+%GuFLM|i2sfRxK!VA z_X919zdT6bOB1qElbFzXV17_JKAQpoc_*?~*yaPOa4IGMi$%skCkT_mCL+|aj)tpX zmum_;d799s)6)c_JAlyDwCokKXVNlcv=Jj@2_!|^tN*~M%{M?%jJ6DNc2hZe-Djoj z&&MRh+N6F5UApxd`{wB~c+S&zxFhBZogu4Tv=mfYe#oJL#HZ(eD|^npNV8s@@#Om< z8odrbIEo&}mmZ>6I@P8E@@hvrnbflTgtB>W>9*uNA91NtIy)RWos%P)_LJF56V}qE`Xe^H~}xE)4^*v?l$OHpV`#o z9IU@C5q3O}Q-e?DHr?a(p~YQzb41s)^Krp(^i8<&h)Af(_u9pN`3}j%irPh&(0ThG zTt2t$o|o1GG(P5V0-r4(*4HRmSQPn9pgBJvTo5t3n>MI%wox4btt2Ac8X=YJod9qD z-t6j>krD(IG++5OQ>Y*hl=^kR9pqa;RNfIRyh?ynO{4#8b6@@(%JAef&N6zC+#=1< zi4PUeMuO`kr@=|t9_ACndiT&3emb2#$*T6i}#(m zB0p=1IGgLy#7}4zuMti+kV&U79~tRYL4D8|@+2jx=)W#IMGxa`qAcSZK7S=`^%)VB z6$~yvUI}<`JsPJ1-~IrRz9p?<0yLoS4eFjRg=@CZ(1dH6rg*exv}1r2jkS4Ga#9VJ zVl`K3NB7NfCf%FbI{@cA5wu(OAt}6c2wBstv#C=O$}HJd=eNc?xV6p>OROH8r|6&% z5?0`z6f;p{dSz1QRhzCe3Gy^Ja*J}~$GEmh;lrePa@LgXwnUCfI=?B+37}&-)%5F7 zl(JP*`ky)PbRveHCw;uoeNVJB;~zxdZm^QvPL1*T<#L==)8!pcOIgfX*w-lV-df^WZHK{si_IUhIOC{^JyrPi{FK4QYzn>GegQF3At%i*BFq zyuT)u5f^{&N3+A8OzTRXpYslLX_=@Gd!b48TJCk3$I7wfTKj1u68^2%5!OkMk^D1g zoRK#Q=))CCPU2V44-B3ZF9HJ)yHAeuu98WMoFlRDirGHLBAX%0QzF6Zff%1v?d;28 zvw=j5Z|cDnlfqlq<&eus0aKj&jbt{js+=P_+xTO_hXr9MjzJvC`wNTv39IDM=mw_yx}T5Yrgf^%V{mQ zM}NiD+E`(kBzUqrpLVj)gW=0|dZe9t?C95eyK~`*tyPY7L3Y~hvdSDB@^liGD|v6H zq0Mb8VtzGdz!9^EQzvgXW{y1BAY3gKZ$W2)tQ1+uhJa(;auKp6y^MfrFt!`F-*ivC zkB3unoke)Zew(c;7moW*l~(UDJ6={7`7vrOUgqdaHUvNOD|+N?Y#D<@I)~8aARJ+$ zm^{k%HWG>!xP^CZWba5uD?rdMBM>!ePf54Za|<_JLW_HyN)O#rlENZ4)9%??gO%Cr zt48?SCkIF%$qs2k=+lVnWmb}KLRLlQF!zS^%W%Rs85jp%w?aUYMzC>MmlG<(IR(G} z<)1gMe|Rq1HvVbJEdD7F6Z+{`tW{e7W+HTO_y}uW@p&l8NWn+cNbH^)>w(gk&hv{x zoyz1uGaDSbk4H5xCBxo6H}BM9Bjfjo-B_0)m|W@vM+BO5ineeC=VPlBQ|T2BerfPn zX8>|9y|$lDhxx|VHmVpY6EW_N&Dt{g2Jqp4@D6-kN!lC|nC@xnu|GYBwX<(jCGtK= z2$dPV_;S0wY-^2bc!7@&JF@Un5{%hv>Ki%LKeZ-kA7{C9 z)zHs~u+d8K_^j@8leKuqCRm06h8tF4$MLP=LIxQLk$16BYq5;y)`qWh*^MQU&2EXl z!>sJDz%P^u)^+tRO*j%a5gaj?U;7s5d#{g8h=g%TUnX!;{j{h=fJ(nDtMi4$tewvb z@i0Zc3+E`>8L=+ojA`hoBDjKCQCN@0cDgl#V zG=?5EPO|X^@mqt8k!zb+n_A~7YGht}(ui+`u4`lC65V$i9yHEJ3QY}###thS#^ zP0xaxR-7%36Z~=Beyljh%O4A}QSg`@n-K@GZaB>~W&aRz-cZH2`u>zmyx`c}#^Y0! z<-}-FrFXj52AC-GGnRBb6FnY~Dldfdn+mQwx~+vnFaYZ`)@`o8Q0sVJBfPH+zW-4> zFH6#d^o*L|=7< zZJU*X*Lm{F1f6H!#}wLjjfdnfSonNQWlf{dGk=A(#`VZEMMDdATF_?eu!wAfi%H@-!kX|G4MqK6%k0$|f$*?zBC>(d+A9D|Fxp zSp6rQ(rP2xwgPv71{H49PNo=B$xKs?xGIO7y*sEo72l@b1%FyMv!x`X^$c8Zt1$CGTg0D z_4Iu81Bp_7&DT!;?b0^k8(rrgv&|E#<-4t8)dGt+sQiz^K+Kb_QP*;{TX#1?~uu|2gHp^FYYNnUuj zW>D`Zb4sTUe}~pc@URmkD}#z69Uot?DS`-SwN3q>P&$mCJf#=FwHR ztyNfOrkB`$ePrz|dd(%%)#?v-*5;Ds<8C{07Q+3Wap$$vtyVqJ)~Wza&m4+QpEZ^bY5Q8$}aBv{f z+L8gaUwdem7Mt_j8k8(u0>BYN0Yx`tA%AN>j>$oAv6^czi4w)1UOMe$ObnbQ%%c7# znMl$+k=vK2R=*JQWT5V1mO+cEp0!?uez6B`p_v(7Zgq)d0^K@Z5H7>ZB;EzuKC>>1<50+9An#us`qJZsj>7 zMTvQpctx}QU`JK1m2uC?*5moeb#r8`%Y2PSF6p3?uBwrL^$xa zEvpC024I{B=vfUJ*VVAtabSP7XD!JmDDaZ{Pqmz`^jGn1{2D!0!E`=%NEb7-p0ZVs zJoM`9qf@;{o^QAwtf2szCD1E7^NEIV%4FFL;aXH0y0o$CP{I4Xv1y5-9^!%wu7FgL zgY(zvql~k0jx{vi0cx~@qE3aP!Ffmrzm3+(XE)Cd>JhH%^otZh-=n6jO?_Koqd6!Q z|AY42#*OBfTbhIUleQPDO&^b17xUCfL&6n@PXr=C@sX3lW3T1yhnbUwarjcHk_jg1 zP>@Rx_Q$^GIHk*_E60%gT5#SzhHT3>iCpraeX|Q*(tVk(2|5WZn9^EkGWGhr|8in= z>X%7!Z*QV5|Isw*1;y|C#*jGsy>9scX>B5a#~L4FLi_FMye8U|*_SZS=J|1W$y1m$ z5-JH1lJxrBkzs5H)GSm&&xb3_i*6f=v7p>UL8@+NlIV?L^`^~1 znjPqln;J9g;6Bl9eN+CnT65cg=7(+57ez|(BCGvx+#sB{Q)!@J?g^OIZ0xFka8s$i=k4O^(XW45wpwK*$13Bc_kzHmjzaih%-w=Z&94K$cKt@o)Nv)LRviK{T=LRY+_1 zS{e0Ps`aL8u(^f@&ffB@zCCY%Al8~TY}p5=2B_#`3$`*hoW=a6iba3MN- z2yu=;CtU3cF4?i=kmIu@RA&|brL;T(OMYe6535GYyvOV>2_mCdrc6r}E#9M&>m1Qq zt5E{Th3}S-SeF^Pfmfi_hij3ha6?g;PwC!9h`U)9jav?= zm`}B;7SULi^)yq~&6Fe~E95Nsq|8)u>AK7xJpq5VUMH*M@yB&sV)@YNJU_0<%;NPj zJBv|QPC(yhIJ1?VYZ?J1rA{--OFoRjqYgK}Dbfmd0|gPTBitO8tXQ(C zrH6q$9v;RxMy}>Uw$pgobs9)!BZU4actw+NM$!`n)Xzk#*(tL?{&LO1OwsoSX5@hB zrHSo8fz}@x;iIz(oSU2ZozMlZ=wpGqBHeFt`?(cb<7Ze8tHKZW2@)7(o{yPbbK_b*#>w z_c4Gnfsn;~$DvP~Wyyy~D2!nS_du;3?V9X($_T;P0*GCwQUn%YRnC^6-iQi^V&W-n zZ8stmbAY-jHl3fLZctaVo! zjd2%%!j+lTM>toiGp_YHw;u0~D~f!%j=ZQ89v>GN-4#G0gy6CZaRaWGu~2rWOfvkl zZSk7UpA1ZKr>)$*)3sa#PX;zyU5~}=^F1^XB6l>L$SK+x;~e~6OPr(~kd#5Op9 z+JS=f915WGT;%=W_?WzkVw|8LndV2qOZSZ>K%?Y!wk5Z5Toqs%}O^^>9 zWVbpc00UMlz*RhLtjus>g-st-{SZ9TKyul$NO=78cwk_v6?tkV}JR>J217I)H4F6OP?NWe8h_Au2&oIN-M{8GKS5g}h zT-zqVsX&J?wc`}ARTp|c)m!FX7_jwlDx##}Hz}OIDo#7r$BhIb^>~IVam4m>>O_5~ zWa3Kk3LDoGWE_KcS3rszbKc~LdgrP;`u&l_&a!A?n2xOr>gq`bli6&wglnqOwS`}u z;Y9Ke(_?+clBd}}Xdzb{WkYZu7wcpPF@i)2?d+WH(zT7x$>#-xFBEwi!p!OYI@=Xs z7m7yBpr3?WZKv_8>;$;n-wNEdLcgt?4)`I3)IJ$OG=DrJ)o=~gpRFIYsC#xSoaJ7& zj{R&`a7LTr6lr1Bu5Dw_YA_rPS1N_M`ZKHq)X*)z zQjP}74t8mt04FanJ9&vZN<};3Q}QMOa~g$PrXtKFO@>-v>L_ybH_GF zO@0>eUmG-8yBm~irZbTA?cPXS2;7P`M_*iJ9uv%Cy~s>zdd+E zBn=M60(q?6TNm71RNlVgzLAWFWS?4$oBPv_Gj>pt%QM%cwfkUM!=%>DP1T+)N74j| z+NoBH2Vpyy(P6cpmMVk1*fX*S?FM~KknJ&1Ps-x}L9xhc zAqL$A7WUQjp1LI9Xt*T&5T~o@31nFZK(jF5icV^SsueR9^chhoF7(tP*F2W>8}^>Z zcsIhFj`*9Bie;&4No}+#m(z=NRa3IF?5oEtUM2@Hj?}LS5*{zNVfKj)Bhv2oT;4ab zIjC2RCie_YzgT-m5Ff)SA-m&KwY4|`coUShTAt9cVWwzw^4+%*a}EM7w2knQbrpqN z$uW=1#)UAXt$wJl!nbiYTT$;jN;0*3?SoPR=_IbcXGd7QG4=fNaf2XX_|CQUqCPwR z%Okz@y%9iw2&6L4C9hG5AAlQ_6RNadezYb@kuO%_EmRN{9nm4(X3W==Y8~U4!x`aN z5U}$yG~FA|=@Js!wY{UJ*srBGr`9M=kQl9<_Z0VMPrDnwUEMYzQFE;a&Ausf?Lx;o z`oQ3;1#8($BSk}x`h~6_-~XyJZ<;du#_1fIWNel5c7AlTuk@I${<^JcISq^J;a1?_ z^Sj~Bi!>?4-rl(d*_O7Y#+DWS%dZ*BH&-kIjO+0S+OSA>8MnB_dj;-5p3?*h56MjzA$Y^oUkqsk(ksya3Dp-89K)v;M_=)Vw~w( zidgv#ov)+?P|S1J^M-p2d0LnYTMIR=bv$-_;jHg$z7iS|+Sm}Xx+Gj_Q70d zvRvl)ac6w!*GCb6%Y5eqAzLN$gwL@C`f55kpuow-Y<7Y0IkdcU7B9}IeUkEGQ=YaI z@YIbGRy)8Tl>(HSMf^2P&(I{6q&s?rC(kn{*KDlStnStiPRvp1ziNFvG(?yx(wLxI zL>fv;K?4jL+IPs^T`%Cb0hBEOY!C-HtKQ^S%Ad#Ncr49(>t7G}^-btUxxlMd`RvWx zWBKqMF;61T=7{CukW?yF5Xy+P*fPw&roO-#x^Ye?p8Sf@EmKW7hCT6GV#VXy-TCAJ zY3SSTsW$&;wwyzc`gMQ)nC>q~#`Zy3!V!@tF0tc^Ya2$n|BSIks=)gE$^Mb^9D1K` z1(3mK=2inlrFStx{t%{0+X08iOKxUtnQ<^G9+e z!Ty&z5LWRq9_`x&14Zf}V`l_J&Dix`uOtvU(XyCYCtBps`f#pG&&8PYN!a!9|hhK9KG7Gw*!EZsjjs zB+H1DldIzIdzw9|Ih(i{xl`w&%8p|j77?&$o*AIANJ<{i{AH9ORL$u!f)~p z-$!U!NMQpo!E3(?9B7+dpL=vL>`f!ZCG*;{_*K-UG^ONwYh1s(YC_lu*?LaRTlvs{ zzX&=!l`xm7`sQXWjG!8J@}h9*-LXoSI2}%Q!(G}awg=s&|R+Pn*Q$+TFV`*N8mHkCj`$+r|z z3Yeuo!tA_St`Ee)be`OA5%-SH5i4|FbX_U$n;*`PHTy0)f_2~#!B@^K9&bj6 zw?zw=w~dxNM%?u>uF*as{-hN{E1cc*3IOo-n`ZCzeaco}UL z9UyfK);3$FHALK{$O5&uiE>S5^VXwID@1{NK)H`-^Dzqd=MN0fxp-moWT(4+El&Dd za%(^COq|YG7&YkzIiaqBTC8Lr;m4nsUzo2+x|IC%gq_^V?A=YGs1_n)_rPUY1bOn^ zYL{(AP1#y*$D~i>t7#Y6UoQ|fOjlf)(;{e4rbjI4b!-#mnOmgyN$)P$4cEz0C8`Dk zwbGr8lP9Fy?H5LAhIdU23Mg1q>Tr&q7H#f-H35Df=?)bA4Ykg2iKnwcOvDbbI6m^B z+PpQ5oT+%g$O}l_W7nG<0csBvWO>_xB93vm5hiU!?g{MNX`+cC%OsoZO-l<8(PC?e ziAyZTz}?`X&@Ga__*t3^|y9;4YsqO`bDt=p4Ibb5!5Se`SXB+bf(?L<3-v^-73 zd#=%GX`g~7q}CH@6tiU?L0&dK@vl?_JE=>3XrHRJV0ke+7^&g|?prqRZ9}C^6tHg? zOouf=cj@O~MeF1V!((*)ZN{wnrtz9?ttjsgD<9N~z|N((BWgkt#pt?Qyj{Tq%KKWT z;AR7g;Tc&6;{kh9?hI({R^XI^jSIKjd&DSFGqcJR3IlD?ss+RhND2J<68?F1(VDdN_#QHMTIx1+J~ug$@@KF;NBrIe}O)^?y}w5_9%ps30fQ9de#%TI$12bYF84Y0@aDYu?mk|$L%iMe;M+b+S=K5EWq>#! zPRm8AK72@(?*5q5oW16x-J7g1o@nP~!(!wvn=8SzfJ&b5V;;!a*zJw$gGu4eZtY{J z32^GGyWS@5=zsrine7u0fyV^O`<@#@b4>0zqKW^E3kKk1Gmk{GP3z%J$Dh|+i#G?7 z6%8bkHIdfnc2h#reGRcsJ3V}%q$@e`+Z>#FJ|+*a z`8wI!-i=q${^an%x>nd%ofjpbHjh4SLA>M7yfnr*9A7rmYwkAP5iml6PT$tipq#pd z{njejjDzXh`zZCKd*v9}KeTFQfcK?iWigsfy^TEMNE1VWbbv!KNf2tjcF(52A9C69 zNwg+K<5dgmX%aQm=Az-7J}!hIc-JeCn2p8xB&us|5wvG#llUhM*;rS;b9ar^&ASUM z9ziyx`e)oL+Oo>2hkr}<%pDc!TM8TK<(o4b?_Nka;shO@n-F$W@Gq9oH;w=_H>`*5 z3MYf0bj?384nVw0Ce+DV+*viiPzK#LH?ZnD=jt@PRd1hksV6iuj);E)G|j1kwk|uN zo&p;w=DZ%UqkGiHi4AOPrp*Kj%{;5qn@re&wRdh zYaGxRUeng~1yG0&KPN`Ere>BSCnU}FAE{XY@M=TVh`G%XlOlw5r%$@pM*yYK@DSeg zX)c1xZDf@!&{=D#sz|C!h5%(IBLEAN#p$-m$2_yXaSx? zX)Z48b5({BjKarXrY*bc`RWZYmluYF!?<=b-#$fo&Jc?lhe^;~?YS7} z@NoR8l`M8|ElGJB)8xkgkwT8%Tre8Au}Y2k>||*UQJ7P zoM{h6RDj|lEpgO)Kl5?A)x4|NoWziN-nwAh<0*aH%W>#Pv)Nq=a8d028m}t2Mk*E= zDl|~5J@+cNKF%>ZcQC~n|1MygivS#yL&u?rFAM+!j17k2@FV|YLNYczk|~P88*R=9 zvy)c$anDgCA^dI!7RH0fbdRV{$uUspK*?1OpN=7dvl44Qrsb}NnH|JLi|citqOVMI z!hM%SEJpS^0pzYW06IN$oF7~na=G7|&dG|ULFf3kZ|>^~ALQQTc=F+nAD%{&=JHS< zx)Iqy8)8ztV#j}J@LB*axAX-RP@z(33Y{EkT7DCh5M~Y-Jc=eF+vz=$(Ac1#Dook- zMcdx`Zr(3GNOa4vNEsQx_BHX?_DGInS5D*W@C{yIHcKD1q$qa#&NCGy5&|h4?gx5> zRbrDN+Om__y?yf*y6y!`{SvL7NHO#n&OAE0`Qq+^Btz%6GdZ^#|DDiyI1aqPdpfygmz|auAV8)1 z-L!%V4>rphY=^Q@f^wnJ;n$GNc^_-#ixkBxbOiMmchf&HzQoEzhGH*UXfRl@zdaKz(U=@%K8NnJ6ML+e25Y^`No#N~*WaMCtMB2Y#=A!z3 zhxQEMJu9248VH#75A4mM(BaAU|85fqTW};rMR+rHXBG|{Yy`&<3Nq#Fl(*~n#zqzW zlE1B8d!bc2-Qg5>nHk9_NXw6yMwLpC5s?Yn>>%VvC)&>9R-eBRJmf(hZIK>FKK|?b ziv?!qs|6;Z$U_G)YiFUl9Q`xw-A@Nfv&V?pM4I|1wK)*JOXy;o%$buX;@2Wink)xe z_Mp{AphA1#U`F99$3D3M_2dhR+Q6naXRjp)GHY1Z*8*G*P%hET^PQCycWb-@5lek* zqShi?LBb07^nPj4)jeUrld$Em>ftX2teS3(%(n9{0^wMZXA=AW=-oyM3wZ6b;=H3!uz8n`vbeD0!*4~ zFKQhw^>#GMMeHPJ&}JN>Val7{ryyM-#^RxzFCYLIF9fv__!MnJgM5jMJDb+CU(;*( zku4tqI8AVa*uL`53?Io`QG0j3cF6H=ARZVqHA<%}{B#P4cuX3L@;W15W z+E}P89;C9T5Nr(q=1je?$7k)?0JDG>a}7&-+p$?F5>c-l0a}JPUs0UG%hdV%O>jvk zTWl_qyy{H9MS1}C>t5SXRNJEl@~m2k7_l*sjOSq# zE50+)SKdjSq^sgXE{XlBoRhYRZ+gG#W#=6lDr5214DwRC`+WwZ**k2Sv4GKDj5Ba{gBiwwYjXtOe(Y!C?31^&F`&~yV_roOWk0!JMqn(_V zQaVD)IBf_!dU(iM?Nc}ZUTE=bElg8(z+CrkP09 z8Q4~!3?XG9fjdSJ=j1WrofiyP0vYlb<#xvCO3tY}s1bk7p9g@7GCJu76x}?c_3I38 zZRo7qDRm}@n|Io#Q*bp0vTzWnuZo@dnR5@tSmWWx}U6=+W+^LcF<+H99A_z~P!K`ASo z&K>#6&YL4C+>eYtly6WTw8s4^a+|3)0`eR?FXxY<+*-3VyiSbYdrME3n|L@&k>b>^ zaYtO?o}r=xktG)%{`hMrZEK!#5PkdRD<`>*MO&*APsf%f&wMWHV^E7tHIPMT(qI8A5@xBBCNoGhhD?K2Ng_Tsmz%UZ7o&k@Mlr*0DczTkJ z2Z{>NBhMLEa(MNi4hHCV)O|fYR9aBi-mKU@*VjMh%7C9LaNw;Uw^7 z-sdxTEiqQRMX6ZS%SwKVgi+ji$+YwBsn`4TASqdx1xO&+OQby}4{FxWme5Q&mT3Wb z$I?ndzMPGA)S)vU z+;~jOsO9*}*t?S^(#=F_)z(G7(Nr$?Tq@0qj#%G310c1V(P=uUA~_ zfF=msM%?fquCqx7dV@o!F#K|M>Bry!S5ZX-^4Xe&8-t}mh5cjKIO3+FVA>P|yJM`PhD&?Fr_j7(SGoy=Od!Gd~^mzriIw!LPTD!a*l984x#PM0A%;`q@yA$26%4UaDwAfqp* zBT(!pA~pKh__~a@H+^SvTrI@us%Sp|$HkrQH%;qaXo`!mO?q2Zq3B0ZJbwXETAoEBiQ_PnMoEOa%x9X9O!}Fz zsz2^k@lfoSo`4|rn`Rs9~mqtca)dgN)c73DgBk2g>lp$RebxqxNPc7V; zu2KHr-0G-bwe)zS0x>ToWXb58?XV06nVVeXNZGM=1JFv%JlsF5aFXcJPa}9<{Nynj z&?uuq@ymeQk~g&7Ztr}JOEiYbH=P;Y76)}*lMl5s)}n9SaK3263)aLb^o!GD+`Du9 zFs<#<{VaX4=(-2}NT$n9weId_HJ%c}ncFmOfbzKnuc;5Z?VVD9B2sf=NeyR45Qmkv z^B$;+a6=n{_A})b?HF>#665<1W|J}Y`m=-P^m_Bt-&|Yum-u|>CYB?sYCYPdHc14+ z`O5Z86~v56StUe_fGSLF71i!Vt2ajs{*9S{Hw&p*^zP;70VcosAGY9~m+khIklq;1 znDGaCFcPIkYFS?R#bq^0%eaH9{EVpL9_dTC zNRu|67~T99ufIPH(s*QCn5#p#gdjJ+y{?zWb^l2K)aeiwKgK`Y4pbX6NC-d{cV&}a zlp!s9mNAa*f_nt?iRT&5F5%ps2uXZ*zUkia4JNp4$2j_!$OWhEgF?glrjs3f+2@!6 z+R~mQ&@o++tCs=ivd1POd&&~ulJS^mk+jTsS$k%*v=(WErN{j#*Tg1idp*G4wQU_k zUW_&wYv>hLaDx}@@^Bp}{!&x=zJzyhPZ%4nlAnqPS z(qaX`2=CfjDvsz$2nBb&9*Yn<*QhavzYY)GRLR2SAR4aQ$?;;0}NgY{bqDK-MeQV|ssT-RB+(SQ;0) zYq8H-SI}wk(`ReLvGtsGEIuj%N5eqoJh2R)c5bgI$Fsn-EFTWmC5lxTId%STG|G(} z<@1yY9Wf}{mJeN@nq-Ien*oRI z5yH@cBMtIxG80>$lgh%;7;J9f*Uk}_q2?GAGk5g2lkHqRZ%M zZd1>tI((-r#Gh0%ao_0=`{vZ5KXME3QZZ~~Fsw!gdr>q(6YzCAPlS9RmJ8S&kD@8| zVfKbnG5Q`o^jC=+4USaM6>P+&3gyS)ogu94fed(n+%4OS7pTjk0=#lRuxe~_f`!N~ zide=D)|U{2(gxzoB45wb@^^(#()B^Ux(HKQ515&F$TA2-^bd6g!6P&-hFHbNt2isOln7mhQ664OwF6o{2VF z=}U9kX+B5Jo~U>Ex8)@KSOQuK5Km)(T4r8~TeO*C1R;xDfg)Wu7qmOOsK5AThaKm~ zHJI5-WmEb`FYo7o6ns3MV=jeMnyKT{AK?i54sZ)oaWya{3SG^sq@LbqP>A@i-IqvK7R z5;^+r?VIFln_H|>C29LAcW~byI`q7^tl_>mkgDU#hnk~N%c6IaK1bYyOX6t*5t~Dz zr8Sz<`eD`!s#*O><1_;0+-$*?GCANff(17xYtq-YrWR!zJ=@&5ZA4_ARlEPfs~oRC z>ve-di50vxj<#9L)kw5HXs7vR8`rw7y$M#^R+Z6|s(UhKg2{>1^KvNiJEy%tAalX- ztGecgRz9fYxH2X4W~+#am-dTQUn%2QM#jO=cdW})&tY?wkWP#iBc5o~Q8o+0OjVU^ zC8kQ$WhITIS*%LT)iG`oG5lLYH&G5M`aUSwEYdQd0-+QJTh}>epm~IDh!+4QF-s*F z0s4sioo5?A>zTNY48(E#86acA#KrS#pkAo$d*gR6=UpstmMJ6CIlnzc*BqrHGw!kR z*$*Trw<|zKn!r+*m9Aw1yN?%?+N;g=&c_VO-BVGqm2i`m*izg<|g^sfNuyDXm0dy$wo@} zv2-1FxTAE#-EvMe3B$Na6NbiV4b%;%1R&)xo@7yCVZ{0Cs-pSY(vWU!y9Q;7!2 zih_mc!YWPPkOFjZFVf1zH6NnAs{KxW+f|fy$Mshp@PQ8@qXRv1*Y} z`HJ1Y^{3iLn@}X->F9=MS*p$WmJoO!3IV`yho*H7%|B}6e{+3`a6dz(BA6o3gn_{Z zG(&$OS%MHuXm{0nZ+%LIJ|l!rW(e9b2a|;aIZPw?eC(Es)yj{fk>8O&mDCu`&-yXd z4k+Km@M*f0;{M`d>{A1eGZ&$6fQ~w+qTF5?RAZdO1m3q148G$Ux9OF!9$FNnJgh(p z1Ka#YIma(!{;!S$JXgbl$um@}e6(#T69U6M=6~kg}ZO z(6d+-+3%ImeY&IK_vXEg^w{ekGB_b|9{;Pf7>1ZpEvY*%lzN-hGI}B&}deuA>wgS z$x|ps0lZ@*o7lgJQ}xgQ)>UDt$I%S_N}VmSz9^zVxe}SJT}nNKKX~c>ODmyYf5JR3 zRBa<=YeE>kYOO|>A(Oc_&$d`c;?PN>d4%9{fwVy!0v1cJ zbq@}}1E&xTP%#mM?37uaw`DdZpr(Wa?^fG=D@`sbZcezP=sy1wpn>Mn!t`4V6uHp`U!dijeW`_}~QdS{HumRm5RSu|VS zWE$njB@5X;rY!z5J@)HoO8yR%^A}(6pQYou&s=SKO*2<*9K+VK-W?1?_PbwO7Z(3w zK^;#8Bsm*pxzMU!Yq4ZPL6)OqOmImf$O!h^p8ZSl{C&W)4HPjlo@-#$Qo(zNzL6NK zeg$kt>eF^>HM2{Dp zb&5h=|EP-m`_=y(XFneTdjUyM!KB`U_z4{YjO65^4oCCEfMLm)rzqWd9!I7ez4ms) zxkCAw!}?iRm^e0m#(~m}0KH|E?i!zecI0C`i=~E3yij0t&cB=`e^VJE`25d@0P-Qn z?%3;Ic%Y5<+VfKPeDav9a+LZ$ftK<1d}n~x+3p**?-me0jRHcjxJTr+p3ldG$a9m1 z&a59zc&G-^7Y`95?sr$g!x56bMLN>LXP#6lAaYFJ{Cb5&*ge z!x&%1i%RMbXzzdDj~F7rVu0+}$f1_9db_biOim(|9+!Cx6fY( z>X%3!15}AIGorY{I&u!lKTXh(7hSUVP-C%wqLKg2l_G1N--pUfNC_t&J_Bs-)jAKW zzhc2d^~#aMpXC$gV90`N+QCnUj<7k(cS)6(|K>WscKKZLv(4-NP<1$GXwc3$z^C8& zj|<_iMS+h6Fl{Cw(B4*9^`l8d_!srs{{5Bx`>}T@DX=Xz%3i7>Klf1hz_UT~PY?C? z{}((PHU55-mA^VXtWi{i{r%H_KaRY427lbo1W{iA6xWkbu!{e~M*2&U{%(=dThDLs z-0Ffs4Wjlx=nhrM10fgDbFlubf)=AHJ1(B@#7TDk z?%&Vj?|Rtk@L63SYHsL);K>tkW8%M(3jX7={_Apk&v$Ah+IhM0+_Qm$tP=4bH`?Fc z8f!z@ydOgFuQoPh74ZLRm;I@<{*v|cfJfz-R7o&s zfq@vfRU)Xe{PREF;V(%z-=D7kG52sg(#SNQJ?ow?_t%<@ z>4ZrCL64)kBpw%IMxYky(mc*yic6-QQ5Z2lb^EE0w5Xr7W~A74Y0l<<7b&zb&sPEz zvXY;ypqF)PN=$DNh>2nc4Kv#RL|nJeo36FlxtjIauOW>r{x6QtpR4Qd zBB^8pq%?OA*;|-r2{8e?C1&a|c4{%He2G10@xMPdzIWGaR>{umQsufa>};{_N*K;r zYYLOkQ(|Q6hw?XtOjw)c%QEQlbls$3|7ddl{c$phBl#gFrYI8Dt7QD?$BuF3oq;|% zYdUMy(8VkDg3(uak@Pvi;=?Iy6BNV$tVRD?4Zt8W_U;1-WXYK;hAu z8gDye8l!T&*-C|Y?a3lF1l(qfjv(yBKTI)pAjP9Av1TiWOrg^UHoKpvV~YKle;43Cjl-S6*laf=KdILB zwYuLiWg2^sD>sXDj3hprI)-hpc<|MmJgTs#M|1??L^Hr3$dU}&7Q77qgLaaiQM{BI zO-FD6*8BL)(UYx#IJ9E%>dye7{+gM})3Up0rS&2G;jBN#i#`@6i`{iWxa7s$ zK&EB8O!yBam-r;P_L<@BF8{$n#g5D>$@CUo{k?U6xJWor}n(wWp0v86d%Mm z!Uu>6JN{Hoq-xg@u2h(Ee*Eb5jQ)6*h{t$UfRbBREq@7WFgP_%4peDmq*)ic)Gzg) z?3zI#d|||(;_WB$Pv=3Uqh68g)=!TQm9%?ak98}ooxB_XIy-2aW+=YW@}t`wH&)F; VDCxUHycfWasGy`kDW8_l{{i^X;`9Ij literal 0 HcmV?d00001 diff --git a/assets/images/image-01d5564077ed43bda1d921e522df7dd7.png b/assets/images/image-01d5564077ed43bda1d921e522df7dd7.png new file mode 100644 index 0000000000000000000000000000000000000000..6bf653030fa3f43a6ea5434be4804db6c31a3bb7 GIT binary patch literal 74929 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

r_@9KUU?D!jOrq53FHa*3n{1*Z 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 DzhiM>|| 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 literal 0 HcmV?d00001 diff --git a/assets/images/issue-6cc9ac7387e0589d625dded707510641.png b/assets/images/issue-6cc9ac7387e0589d625dded707510641.png new file mode 100644 index 0000000000000000000000000000000000000000..69137a9de8e68c4848afb30a957bf7e56afb9396 GIT binary patch literal 22234 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 ZY&xP}oGguOF{4I}jgTMW-{yNx`46mr>aG9) literal 0 HcmV?d00001 diff --git a/assets/images/python-osism.drawio-19e90813de60b4afa58bc7ee4a3aeae8.png b/assets/images/python-osism.drawio-19e90813de60b4afa58bc7ee4a3aeae8.png new file mode 100644 index 0000000000000000000000000000000000000000..7772f1484e459b92efe65d4ef9414f6a60945f19 GIT binary patch literal 53162 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

uj1Ufrha&98*UzAa8i z>wFUz#6#BGORG}G#jZPCk2-%S5va>`-c7!HJdRsnQMNjuVaGBc_dXYANK~(<5na_V zJH7etYCQOWRNiqQK~IP9r$(nT0m<4v+6(64{D4dGAgH0&Wb+k)@TqLw6=&r!7N2UR z^L{KC#?M?2zdqUWLbW~#1u-KW1&7gqQ(B%4soN_`!)B~(3$1>S30_`4n~%5_zYZvz zy9_JiMoXlrkv%w+W^^WqtG7Aw2hjhj-2WpX{Hryp^)q_UPac+IzLd+BdhzD0VAZUvLmfN30e*= z{N!pjQBb&-JAb7JJE=*AXza1-7gqh%(hkaS!A{eg z91yoo4-nua8| z?APE5;c^BGz2B%$XWLz}WA0qvxw}Vco5_-DUxQFHsVSI`dF?xZovZ8we9~+cS4-l(t@doO{ zvVg#bz^JLy&!>A;4}>um&#{g_FOrQ4e;`t`MZ}tn)K4{?TKR*mX;Hm1qEI0e zI{vB5d|ab%ZT;Gs7@?mJ#dnm@X1tR%e4M!(&nGsNrE@4%Y;`48G+Y+KFkEW_sp=4o zC^0pia^MqD1Upla>+*)AFf$PpXHMmR<*$Ehu7OKdyJ^6>NP@#t{|1@y9eDoX-QCw+ zXOcY9fEBd5j)G+#?<9|~aql+ejy8L2jIfxq5wD$-8-N0W>yzXl(- z7@_M=MgKB%wZlcj`U!l2dtGfjnvy9$y;?;aqn#>_Y)I?!W943>S#{%KSwWx4u(1x1KaiJAa2)SAog{Q>=--{4^1-97uW7lH}m|%QATNSa0ov+Dk*A=f0UohPqVZ|IITyFUk0cBikjxHK24h*mmr7_ ztYpr*!+oP0!7_-SvU{<*QH_mu!JbY^gC9K{?2w&U(^0js+AM@WvI zjqxAGKkfkw#$usrDBU%GUq}PlcxNFJxsSoW0;1M(AAyS1H%Sr22rQA+Phc|s2`4pb z3RorED{D?6as#eEnY2jBj2$`a|0xOl`w_aLI9p|~z_NzezrAIHP}#SqQpLu%vr?sDe+J@*UX<^Gha0O|F&O~oFa@#E3Es;KQYWySi6qjL_R-GM>H z?9}cN>TY*ZP4Pys$e!n5E`%mE977TjFczIwYn|c*M5gB7ml~wk(fRDC^~>QB?hhEv z;iPzXJ}ICvn>)KbPWhx!LM8H0)uUoE?J9SWi56hNi3oe)lUeb4njb=|(kQeUdIHsG zBSw;ff5Hns30$uv8^7BoV17eFwy@(rMmVW3Aj0|c;|~8D;5hPfkHJv`#e1$>`+cjb z#NVcqo`Ty$)>FpYaey&asexW2RV?}0-K)NXml=TnTX@g1n@5n<@MYZdj_ZrVQ}w5o z=TasIW%1aI;k5x|&SNw*+~Z>D*d83HMu8jSGU^^*Q`$6k3|9AcYOqhSUcZh9YDi76z13MLv*qa2%$}bpg|21V-vm0uYeS| z{Mtn2wk544DPvtu$-3)dkE%8QRQ+U9#>h;S$&j*rEK$Ur#{nK9;!cGg!D{XTQYyf{ zPMW~lSIg?JEd^H@!E2Frt_vwAuxEZ_2>)B^tlj)GXM(0*e)#(_YI6n}91YvxkS2u= zvNHVO=&E0t-*Q#jBH*bb2>(;`f-M!L^Vq@B3G)a5UY^Twc^Or$H(d`Rw}3Um{5(Qu zaC=lubr#o(e57WqR>r*GCl7ltrrT;=EQ_QXpHBjnE()5BgRydso z#Z=FUzUa}YTRWcZ&tJmd9Nl3QOrxre#PxGez8?$Ol){+Z0+d1eUXq%z}s}^rh4-h-%+HRj7}RcVByl*w!g@1 zzNFe^%+R`fSDE0!{tNbZBK#lE$oL<)A8r~Y~BL@hu)4+ff=zo4xO{A;ddr0h82}h`V$@m{J5@y zDYsVe=i9pq6ek)DM4+3{sG3Q%8Y;@@6laM4kb1T%K}J6l*2o|Mo|$KZ2y!4Tmi^%{ z4yBXfpqXS?SPp4;I+^xiRAWv&q@@KV!sFSHf?88I=9_yEV)WfdP;Uy$LJa)8K|bxL zJ2Y3CX~_67vxTL{P~=2xJYV89?3t;!y}XPzC~X3WO%UH9_EcK{!9C}?^GqTjY665< zi3RmS`SeNREzrOt!D4aH9ghDpLio3W>(3(^VDKcI57~9FKK*Y88Ue)kw256JmbuK@ zRSaKJ%EtgKKOzdd61DZpud#mF@4n{7t4HBK4rp*~O0M8)oxv4p4Uzn0n)(DhTbmiJ z4#@eZkKbanVQFnF7|p}Wd*0s^I)7g9{~HDJAb|xtJbeL}Oy21d$UQ zz=3fgjL5^=AQY9aDPS2*L2Tv$CWpIN4_5&G6l|~A?(jGV!G!U;Hmij2@lUkKsM7s9 z)w|WM8m+QA%c3g4N9Nk9Iv!FKyl;;w;5s^9IiY%&RMu&KhVIMuP2`W-pY?mgA3AS= zIQfD$$nAlYK`_QHvHfGj6HyL zlr$?pw0f~x!cYY+J%iwLMwYrvV+W;2|8!TTRj=JK%>h zO*&|~OGMGQ?Ag8uDZg6=%K*pXA>ZM0=1xBrJsL3m$}L+btcI$5$leuR%oQ9R`0y@1p8F$<#;qhaUtfsbadU#nwcrw1WpD9 zBV;4}FYI|zXH4@OZ4=}>YDkH(y@GuPmfHr(AZ32C99gFkI+M$0_J5ZnKpSi$q!32) zdsg=L@4B!S!p{FX>IHD7Pj>Ow+w~#Tx$Sip^_eAP1-lSW}-LMgJg zwCLuhq;!^;z_aQ83!wnl2JQ!-RvNBiWO2GUY2~Xw4PsF3t4^}A_iQRhs52Zj zQ=l$r04s(#^PK^}2-D+ka%65On%dePymuK`-T}-a=CO#_rd7b#_=W32n7AoJ^!kTJ!*mt1(qWOH*eu|c*P5PC2 z0DBWF58%%sM9lhq)_`L8ZaX$(U1~B~HH^k;AnuPiA(?iYt2C>!kL40nAJmzar9Jyj zC`?36K&mbt6Hs``$#4Hl1}EG&bA|Ehq(drPpEINRvzoY>u;>(o-Sp~{CtPfD4?`-6 z+r>zaR`8rBz6ewvF`akE1u)zi?d|OyUtF!W>|Gs8vi5F?LhdN0$f@%4H18Thf;pc` z1>_o+{jA<(ZP*(SdtlJu#L&;abv_$bUx>@^1jxn5tvX#I^+~tkX=mBVPrr=I%AiPf z+;||va!08--a1PZ-oqmL8S5+;G=!V7z`D|%Uhs8n##;6+P@kw%Qo0!v+(ZKbEysBj z&~LjAU*6-s!>dzkq*FA#Mn-G7nsJ9-VJ-$*=ayg*3@`D(q3VSCC1257Fa( z4X<)nYKeQZWKk#Qod;Y-S zEGOmZlY%k!`ADUOH{(E_Gdf_0t|TFNCjcw}r2R#7&|A+64G!>lQ{>mF>eLgW!v&aG zB5V(aUhWQ))6INFx_vjsH5pcVbJwDEx&bRh?Eza6dmOIpny&(Kf`VQgaI2k&;=^@{ zE53A~XmO=*Q$IG}K7^Y2vj{`uYRi(0~1=|JxVOh@%C{GN7j8 zMr!Y{w$~y_&BL}8B;5L?Rb=3|c&x>CYXlsfKWo%SL)4_I-NbE@=VmrGc7#4_DwXs- zI@U+)b+uYIzkjx39Z_OEjQv8^tBT_KMKGIEf$R)v=0hOJWuNz?9z#Ql!9k5h7^GiBzc{-Q>MiR~5Vg(E(dw+^B z*e(WdT#6Yu8~D2D9iuztf4{hYUh0YHOZJ=utu@Vs1KhGNlvTZ}Yq0rcj3%7MXb#bWsn^ZYkyO&N!vme>wP#+rsRG!iKA>l(JwUJ_wi+f=hF{|$<0@M2}7wLQ$t>kYi;7RN@d%a zN5qadl}wi|i)>ScsZnFCt@-qr8U?!A#wUUP=D`p9yJVf?()~C=Gry8HkB#3R>}}18 z@}bU$gD#c&kVWfIJh!*a%0hLn)JmxkDnFIoBq^w#yU4u}p4lacWs*i@(sYX z*OYG1$wE5jm>?egVN_K76_uyH;AlJ-YM7%n(vr7LJ)zfS6WFsO6zZ~LQv%}s4)a9g z=ibA&w#gNyh{A4F8W>*U-CIKz9=Hx026?*(x96mJUI~+ErBbj%bNIU>nS%L!wkw8{ z$xRL!>lrEQ7-b6=!J1gwz}Xe!v1sjvo)5&1m~s2GHNE_JWZ>LeydCk8uQ66YL|iaA zVs*jSvl*aU4?uxpkI!+B}%jge$!v4Ur3g8 zREz-p%S_#ewBEYYUr4LWZSapHE48z<67nN3cc9|V@Sk>f2nsNZ;M3=iXyJxbv8%^o zORqFVyq>+IeWT`+iBFpLS{KJF1ye~}lBW#pCQTE3DGYSy;3MA}u~zH20k z=zVN89HHT~_H9(OAGODaOogmZQFUoamA|_Z{XcgdDhOD+R6K&d#kA ze&744*d~M!Ya&7uN>zmz+T@qZ#uPQ9Iz z@NuLJ)I*HJ~A|c%qVTC?tz|) z73jomDp(U9rO9o%Y0zu>{foL@)BWQs-5#;_2}_*q7@1@HCtLbD*iDDfAu8h=h6!+; zjl%QG^O99R&biDygGrow@(`=GX_f~22%@ijr0DdM-n?vxMM{eVyV=KQ(xj zlYaR+I~v0fnAJ-N*=#+#i%IjJFkYg`vs`S5V=}6Ost9)S;uU>8wjIuIZve937iz;8 zG8>X6RhMX5mv`@y9qmzSWq67j!tBQ274om7xw1+FcD+YWBQOK<-U%DnXecfE%gmcd znrtTOAClF3q4NElrMa46mdKaPs-Gu}6v4;g-+hf9y~pX;%>4ZFLIc;oxEv+v{03#4 z|7FHJ8gpWt$yvW>Q9}J{po8<6Yo034QswsSE~)iNq{1!ydQ3Yx zOm*{CCbCuN=EfRIcMJcqJ`>wj(kGRcdUviy#%|YM2O4862VTEgQbHLx?(KruRzTpo z6c;XAT{FV$m{ZLC2}-Kfi0YeR`E;-q#x+i$}<_r6%_xl3n09lOJDhEB5z#y)63#M8{^n zn>CsFH*J&WMXTk^gEaHCN?Tg?spIS+UI*IDvwhX9<8N~mlC$D&w_TdkQ;pe^QVaD9 z)xzXGbr4?YCVhXV{|tG|=5|7H^W`H!A6qSVO{sqdM|#2DWhq(bx>M9}FkVK1e0L|QJt4!Mly z9J_lmEjX6aE-rWXG01xnd7*Tv#52cF0OotOq~hB&yT>&_564)EugJ@GIT*F?C`$Cz zx4B!4dx$e4bzfvIGnRbfD&vcTWwicFg;^xN&67uEOzlQrk;4G zMpX1b^=tWH>HZUDnm+7Bz8QpK{BJ3odXxR4OH2l_M;j}OncxC(7wa#g&9MpPTl$%eZuP*P$B>I6==s#rRzcg=XCi>gi4@{X%2j5D z$I$U>X%!Y=>B<(9lzLIR%P#4JT}-h-MZ&1<9nyQ3#_xr`ckooJQcU22n68b+KR+E2 zc89i|Ma~%ozqCF6l6_tS-ZiarSMzYj%;^KO^HE`c{QNef7#|7|fAc93R)Gla&Bq~w zEUJ0?KI;esIXiX=b(w_>DXKt1Tq*i$L~fwt=Cwb zyWYnN8SvE_=(Ffvo^j;vTE}#m zTw4!xI&;x_<)BVKjh2tRJRCPSk-j|+nGBU3?H268waZo5-WPz4ECo#Jsq`O|| zC0pLeKSRhx@$kfFOG*>&pqF%}>FR+3PNLMu=A_OLBhR?((F$0@sSQr`o6iLEearWv zwku#cMtWLgb=#S2*vXfu<&S8J#>P_`OdmZ8i5vlDpb{H)fQ?xZ%RAd@)VDsJOexIU z1z@$)Kj?tC1gMJEDU@aR3Xtt{v-*Q+KbMPfFr#JokhZ4Sx>uQ7Ovd=KEij^*?>SXE z#B7xCNTqLIjB+7dH)`91G{)NC_XiMBy_rFvVx4x8fKu-i!> zx1JE)jyr7h#n<$q5qnLk@vEL1a&}(pR7r1jX=hS={}mm`5CD**4w;hQ^~LOw+~C+0 zs(qrntGN`vJYmm~F8RF3W`DqqzOz;`g|TW2=G1|M9qT{C-I#3n3(z`{pE$QCJY_=s z@#Qw!``qFQP)&z#pCP^Dww2_P8}lJ`d7iwO<8Z7Wmm`!m*rB!ASS7-IsOF9@o;Ls! zQoT&E?QFBLJNGR7z{V1ZT`vS?RqBk2i^ibY_jsV^9OQnS`yNTb48+zbs%|d?Eq}wf zZ1HR-!<+q|TBhr_QYllUX8Tzm9YgvGegydwl=g0xb-+=# z0MgxH3;>?GA(M@MU5YLg44yZDM}R`8vHrj~Trecy{qm3Vf|>kRs`@gZA(eZf{pKXg z=rQAJMngDbsA_90C}y{8Gh~v_?yXJ8_DqB6Vq?w<)eNoF^m9b8X2JwN()K0|kaJl2 zMIP$>=fD_vVB*qfYm1AE|FQSAYZWZC5g71P?dMj2uLGob-PEtV#!ZvCS5v=xK}@Cz zqqf>LS0WQ*)PHF)wKB~lySufP){mZ-9GvtoJ-EW+DW1!Am&6VoX!4NkAiJVa9cTO7 zSxaGV8?1-AA^RRxO9kNFU01yBmZaZ=BV5?;=~;Ny62|zv8m;KwsZEhu8JPG*()D{LJNjkVo#kXG1GaJNuSUtNVjIZ#f@f`Y*=)kj|J@0E3PR$$hoH zo{peYE`5_&pMSWmQwjOJkoKmWLjS26a(b058MyF_cqIh zJfN9==ri8Q)tY#g+P6-72Y=<%)|2#LR;{G*^6;4yTd#x_c-|u z?n+H5>XKtHQyuLoVbmym@cH+`9&vG1ivaD6lGa!4*ETa?S-LxGb=)AxtZ=ZIb}Pi; z**w6j)R^5Lu#o+npC)037GO~t44K&tdqu5J32U0zM};&dcs(ZqD~X#08xN-iiP7={ zm!Qm!eos+_v-vC{sMuC9z*6wfJteRjP^{Z;z7b7d2=)843tlePm<~A+zLU0l?xZ?2 z{?))`ZL5{)!tR|~4naw0I|exkZV7;*pRJ^&0~J8Qob97!GlMENwuDQT8^$SQ+Q+dG zk7hrcrfQdk#q2f~d1Fvwj1*qSV!pX-0vGX-)$n{2wwtxEGN@#`_A-tE7_>TWu6Uq= zhSyDJEawit6jy|S>jGl62TZxV%`OpC@%OukvLlR zsVV$yaPnF<(9JBoVHld4|A_?uUx~p5xG?L$g_$nWhO#C{gX-zq?cXaeU+)mfkZfkH zfrL-1(Y)T9K6>C|A&2W!6mZ&T@-hJjmd}39W4ryxINr{37<%a=AJc9sdw&Si` zNs*c4#pU~P}X>*{MP9h#MNPt7~jF+I;pzhD=tc(w*dOG5VCbEChrsAM;2-1 z*|^VjIwx^>*`e9=Xw80QdpaNs2NX?pwv28^STx(-cw>TN3uAdjc<25BlONt&vpCx`o9G&Vq^~}hTYZ_u z5P93yG1sc4(=3bs;L+SBpj3h;EsdL_q4Q!N<-TrI3B&{n$2P6!Gk5Zb(b*(KUu^V~ z%d3%;tqU*S%#bBzof3Od;+TOk@;vN5vd%`+fL2=ATUlw8oW zD(pL);OLXvc>dke;;~mf2h%B<7uG7#H*9bJSTI%fp1&E!ITSucx<>ciup6WU{2D*N zpCIb}E{huboop)oa*V+ZR>I`s!uYhVwaMDI?XYxdGsb&sIlp}8NL_;f!y-_Q6ijEO zcyJ5Lq`T>yD3E(Ojm~?>%vqpPgpM7M3+>zld7h+jjBD2v_B;*!oOGOXJWi(C{+lu` zFSqmt=Fd-GfDaf|4)Elkuto zs=f9@7!Gh>{Yzh^#R02PhPKvUkrvDMZTF8yL%1#7Jm2P28@~q)eW)wnJQ$NEZmKnt zuy(7ermLqjk-PyG<+O|Lw;IBrEQhK%-N#3)*w4Dfj zOa(emNJlpK_}1q92V{4`n`jFY!F1XHD7`YZ2OlMfaqME=R8p;xQ7s;LVymlwWK3se zBYus1!N3RstJeXjp5iSJ?sv?!WS%h5x@aoU?=qQ=U{|HL)Vt^j#b%d@&J8FAOrF14 zb7tjb>cm-m&NXM$tdvtGObS(Igiw3;k5I;dG`p3BWU513V6^EE@zy%$OPQgKaYoWw zsqHn06EgU&SGo44*VUuVl^oaiJ2_vTEAS;qwBi(^+ez1yi8^(xp?t*EoaWqz*%5ED zy?%K&^YQFU%nEUv)i>4ALgdXKoWCg`AQ1R^fl1@zb#C~KLCMSRS(WqS+X<3d zp8NTNbype`nLy6)-mE4Ddkj3=Pm)9K#ED)R0P%+2iECe7ys)FP-HKSd2=&+%e9%Yd zfI8IkK^jx^KNF8NY_kH^End^NZ>I48vmn9-sc~C>?4cK%eCa3<7s}9fKqnrI*vca-tU^GSBINT0<5#{jR<4-GeC0m zexFd<6|yKI*c_OI2Wh>#E2 zp%5*gTViOVOuL{P@g)ijy+L7{kD{~=VRkZM(5oSm8(}89F_{$8ZOe2>nwL|4G~r;x z2`g{5x=&NK(sL8LvH|{$Tl!5yBdtg=x`fZ)3S zq`orsi)-pTcG>N4HSQAMr`#SjAC@t9Y99iijQ1X&ZtTQfRk26GJ3Z;rg}{F6oB(%C z=zeK8;kR-5A&2OkKNibu+&WZY5($a`q&k>xe&_*o1}y0ZiVnjy}RFboR}WPD%TdqHDEF9DP50iZj=5Q( zahtNDFwsEHzFvUsL5MYI%vOV>i@Df}{o-ahti9STC);*y z1CweUmq&L<&DmAJ4v=M_|PoR@CLR;2{OB;=K*%v_O0YbvoJ_&lzn~47 zb#n`A_NZ#@=2?$;VCjt-ANB_3#cu7NMBGzIznMNceq}-sm`Y4v4LN=e*=mmN z-pqf0l4_^F1MF?m6=p8+I<%JyE$cT%iz-F6v?d*%3Ud}_%opvX)Fw;qp=7zXq$3R8 z>A@MoGUO@lC+6%^-2e)?6f@DszGgisUVCEEM77#CYOl|s+pA!UyL<=dw0;DTwGOc%stRtorO%0y z7c%n$?iVOUdiz#FCP#(tr;DO60*h{LayXT0Y=wz2m7 z9`CZY9FlD!ITv+_h)JW}g^X%SyT}%$#2`*e`^0MZpd6Cy`V249-IXwBIg_ZE59|Ed z_0JtL03DJ=QEQ@BTB$`-I?>k7?5EftNJg`tVZY>M-}vF{lib)6rxQ);+-JZZk9gw2 z`YOhCvMGlP+Y-uNUkQDd(PuGhVGPvxSV;lbVO$WK%t|-ca4oQO4wKwS2e{!5KgFvv zSxiy!Th;Uxk8~U4+RteyUFwvXpg2LR-$m`6h>=XR-|@Tip?NhNcA4qla}I~u((Ek- zLV}~hpaV@7t&3%)T%w=Pv;P>p0(tbg>9MQF=qBj;)twdr;eGvxC&~xf2hBni*_@Fn zx-$8}vkjaACFa;-ZA)e^xI>h89eMk%6$hE!8vvk^ zrsO*16%zHm@<5Enz10A7nXmHr`2!kIIY#Rs29Y{ZLhGl(a*@a-AqUb%i}VDssI#;1v(fQiRNZ{P`Q z6>N{4r%jmAE5Fhh&XPmCKlv1m?IBxxg74_tXsP-ywDFRP1}7sxdbabsz(R!D;;C;7 zadVOz?NIDz?wC1{5=obNs}5$Az=%s~;cN%665@Aui0bopC`{2H8g{X>EAkvVX)z$f zWGG*HgO5@LJ(6O3@$nrcS?!iI=>l?7??W;I_BcLoL$Y$-II}z@jO9S|{3K1FZiMmwUZOS|IqbM6{<8 zDfernoNbM^rn^>SUevU2qUn7?{9v&d`wow*(8-=`dn>7#n#)$Z`>UoeYrzY>dAM$U zUykD3Q&@OISBntWvl;PY>Ja9Yl2V*af8N`ii*F_7sI+{gVjB;`ZvSr7h7I?@=LfH! zNgp^jDj--Obf8Eg0zrsU$Gx@j8*~bT(r@Z_eZBqIAd`Qe9(z=Qsf?Nab@a}`(6SqU z?CFV?BV1BN@?QKpZhF-A!RvIyZF@Z5HA3KReS1MfTubC1rBkJ?1AT+Dh;@Hoi6|W^ znA-3{`ljg0&={Q$rd;%Sr>!r&GJA}9Zik^r)rr|XDpr_M!`C#>8EpAZkM`UMa_`S( zB4`a@tE*Y~PdjNKaSCh*X0Y3-}pgqfoNsfzj-VrcLvlMdYP>UP}cP$d3_!d@H<^dX4{B@j< zR!ryqgO6U@J#v?}d;io`7*GSB{-z#rKupgsS4p;7(|lXxE6ubvHRKQcuY*t5m0j4r zvX-Sw@vRn%o`nyGB_B$EvC>Eh%Y9yQv*dmJn{r3TRW*4G)nUf1HQou`P3%eP-H)%f zw3yuKD}4Xfixaib7^-EdAA558f-SpEV`L~g6q>ScA_GHk3@JHW;=Lh!z;}RW-)h?k zc0%nYb2x+1fn-{5KI8XOH=THZj!~ur2X|mjb}l7f)E|54j!;m_rsuP5Lb78Qwtq%i zFQyWpLH7fmR<)~sqmD5PfE677xrj?Y&W?(DW#W3z|0QYL^>`$aOdXQwHTUr5tx<0X)S_d(ADW% zftu|*gprP!-_egb_SJ~Ukl8cTZov@S=Re{RS+j!Ym7oaen<_fFC&NHm&JDlj#_dI< zc1Qk!iu0=W4o@ysz07sySIJ9Z0Pq#>VA}zfTii9Twpgw zZe7_^v?3Vy^SQ2lvtHxbRKSZbCPqId^pBFbQ0^L5vTryy`vRI2iu4RcBkK2={XfRu zE2_!1UE7r=A{fAiNNA!WB1QqFg#<+miVzj0NL4^YKza!!p{S@p0BIs6Dj-OeF1-n% zhaw&65PC^M3n}Z#JIDOj_}7^0{pO|{x`W)$eP7pk9*6AH)uE?bnUCk33!nVaJHk%N zn>zPJN&@oboWy$io6*B9i3+hwLOd<0Bh3E%@x1`3$ytf@H)paZxSAJUrIe9`5{TiV z#Kq>3&kCDUdG6k*tlGr+4W_5G(BF@N`h@q)nb=3 zSX4|NJr+s;YWxLrK!{*>OO0H6)#^=&J=-Q!XrUILS9RfCnuwZ%+<_$I=8&qn3L9#R z)hqp5+5jcR?%-fGtFOka-&Ad;ip{*aToaflMoo8Glp-A!kj{o7>z}rf4d+Ek@)4iZ zNM}x0ml)EQuGAX+;74xx#g$-)GFS6ViVVM<`SG7> zA=@nxesd(~#lLQ1FlM|kvsrxfUOjHDz-6SL`2QCM{Xap`ft!}2hf!FUE?qX1-fiq- z>@sHs(eS+6#x%ZN^78%0s~5Y^2SnG^d`OQbxX3w6Pl|^W`+>$}=2T+1iei|RwfmJ{ zL+hd_%0~Z`E`93*W(Eg}Ta=P=i|51U>P{-U<*oL@KvT+ZxH>sca5Xr*cS`?JdUivZ zbBEAy=+MCVca~dn&|}_#>x}(%xTk?-BBx*OfqOqCPZXxRQeSz*6j`i1S$%^vAB7*f z?D-Za6$mkUqH~mZ8^u)ip#ot4S z>@)Yx*w?IQI`6t|p^W(>gr2c_&=CPYQM&2~Kz|kKw)7(d>+~gBSDf3}AVQ?lU`Qky z=)yG&J(+<1V93zp_1w=|SpMbZ@SOdUinKW;#J;-ZynSz01z$C#(#rebiXm)BEnf)Z zAw`u9DVE!<=yDTF+4un=pY!X4JE7W5-iA4(=U>`$cK58yUmLQ{dnAt1-_%c8({Jnh z0kiEc|KGgkPO+gtx*!Ko^XY{gU3Oubh0MK3Sls_+j$Zio*E-Sev z{k+s6{S!rI?pUNyw=w{bd^;9_rldAX66)I$WWDoXJ|=evn|e;z3C`mS$+6EyBE)5+ zkS47U2?aLx=)kPglcH~^wto-(z5~geYC3%Og|KwF#9N7$aaq|RE_F^d;M{<8U9P2( z9Dfy^a~&WIMU5?8h!EX8TNflfH^Sif& zFQ203pSf*#<7S{bWX(u8zjMmaKUt}x$Y7;GhI~oP=KcoYi1XW!(nounA;jI{7?+W! zX}Pl=W<(3uTmd~g`*zJ8N4&t<09%_{4UEA_+xCU}pEuwXj~AozJNcGnFBD$oQI1&qz1e|(uU%`q5o0F68*Y|sm(`i7N2Ca` zZw@_y2VzKz*=F+xXFBczcloC`6T9WNG|Gh~K_%AT==1%GtWaEo+(==yFzLj+%PKoNiLgIkiq$J9Rt8?(-e zCa5OkwbM~}msXeLSi4gBts_qqORD-az?H@*9a{+JP@zF`QVD2r1iz_+M6urm*S<^r z>siurodO=xHc=^vTF1H4+!UkZ1I`$)Mv4l^(NZxB(i^wBN(d{}M@^L%z63YlwW^O` z4cSJ^@;4jQclRN3h~8{dsLF=q;K~>JN1#LY4A-xxUy$D?_QVgP^PG6&S2xdT*zqOcJIj|khpr&c zOW=@iTSCW%)k%e_;4v3*Iu`74yRvE0sH*PK#F-3JI7r26>W*>IknO)ICr zZR6w*u6emFZ~*m$=T!uV8hg#rREh$dZ=mlCd&H)G?HwFSR|P?#+_d!n+Qb{!YVn;3 z1A2ervJ~}f8o)EauY9)86W&p*kQ{nhCM4=7|C#{=@tE@F+NLKlj+%DaMV{yDUcvhG zRJ)}i9R;=yUE?Y3_fvqs>!hc-JKPs~Y>5v?-O#Ov(CuELK4sPZ=hNh$jH6^_Y_J0M zvEJR^4@3|$8B*Mt2X<)#Dc+klvQ{7$Hq;G0d4UA*2s&dWwA;KCSu>Wx(}SId3*IBqSesuUIbDqS6cHYj|~i$P((HwnHoii&g|hxpofQ_e0<_s00Te(j+&I5mnf?{>0A2y$v}PIThicCKey#L|Q|^U>`m^B}T? zIpv4!T|}S>CZ-koBWdqc*DTL(ph>!O+S~W5Hr?R&_pTPf?xVkMu}965TOPy9jZwJG zH-@UlO9Wa5+GJp`AjAuC^lxwm^HAQ4sQtkUSEh*DS#ZzvhUXQSLZ)*oe%wg z**jS6A-wudhXMgCJF8$G!(&7HmA`*br7h#dP_y3*I=^F6Hqd`Y3)6WRMKixANgOia zpzMy>3j7@txxc1Xf|CgW_K?z@;{bXkqJV<+s^u+OF@U@9T@E2X79DcReBHIFo8svGH<*&CA`8Pxj})>RkOZN#UtR z^lKZhA#9Ty&Q)%`FEbQ`M;0dq^d`fkaKRQn&e^N0%uz&uRMkQ2m;jY${8)cBKEM8g z_0NCrZ{U$}?y@NV#{C=oKHZZATI;O+a!o>KjlyLec&!Z8R+h?214K|*%Z!<5P{MwUeoBrilPA-bp^!f} zI>5fw8|(6A0VjlO>3}Z7A}bD(L9|wHLz{UvrcgCTM&S+cA&ReN0^|LeUei;Rc|=CJ zg9f@LA|ZeE%G0u=qc!_~f?a0MMRyD*Gh77Y|!3HdpT5|O~eJGZA znmz(O+ezllf{ffDgvxlEMQ5*3Y0-N~-$L^1n!s-vj347rX&c&iV4V*{y^d_hxlR{`#F#08Oj|R5O(UD6=z%A%N^nBUAZ2Z zBT>dx;iSmBbazLWlp}#N-8?9C53UGVa9Y?kF&z3V(y2zZS+zHJca{4RAFs(dn=8mAX8oRYtJLbTc;W%vk-hc;^+%r)&R&N7|Sbns2UO?!$!Z zsIk@c?v`l^Ce$P7o*O?uGMpImPR%rXny+4JhUoS0lj0(EifYnyfNduZ0iAOOS&;eu zf|oQ?5*H3hkv|Is&Dt=cBZhkDR)c0O;@%G4HWmoG@?%Q7~IZIOqq50?KY;9EjyKSh2@1)PpSn@QKpK) zC)Z1|!Ac183tuobH;|>NcBk2Y&e8HFoXdPp^$SUGs&XE9z|Q9KMJMzK<;EPRX;KtA zPUu3+je;M{f4b0&fKS>$z}3taX!z2byEvOa2|abV#xkZJd0*-Z2P%lohh6J0Ph21< zeUdgnWnB24pTOOTnZM)zbGxtOh&N~4Mh0OCL*g3mv|u;d%>fu?3jFq&?&KoI$}ten zmFZ}1H(Bd`$@`!gKcCcXGSx1yzjWImKK6HW!rteacU|*0S3Am56fha;!GLw^g@`Ed zda8%JHGEr|5ZiLv-nXqrLOzIB^2~n5tZqm+`z@x&WA~jrKV7-q%bYU9zoDk3GiN+3 zc1(X7Xo%JBdz&BlozL$r$%X2fV}%4V`%1RcG2WXCT!2J5QvsJ2X={3@C34mN5(Ru|gI8_*<-)_GyPY$8}r&gOK@kZUzpSelt26tSt#(@OcQ0a(F;9X}U z6cGN4=g-JKahJtlz~4Ow()A+%#y0$2rTQcmhE&;5HY_RLz|KWX7PD4P#0IE{fd*yf z78{L`-(zX)%iulmxIqNrbmhG;x-p^b_VthCcE~byMf>u4Aqq=<)7uCBAx}IRI zZEqk(YYr;|S(G1*UvvHX+&L{}FGyvE9@VByv`tuHRi0Zyy6e~?ls9J%MK}({%PG^g zq-6yi%_2Ah2mrXXXM$5MrU$aIA5pss|MHn)OW@zrd4w^Cl4O53bq=@Ox6bO`zsrQZEIl;cNx0ZXbXKlBn+!C{|E|-xEN)y@4dR;B|=d`>Hj z^5F{Zv`RSwt@Sqe60(nHZLBtFvto1U8USFwIhhCwbg>!=4KjbRIUVMiW!pxMXC&?? zqXyL<(cyp%0}tg8-}QO588(|E#)gvZsiu8NHpoOa;T$;|hY`L{r6kt5bhaA*CcWnG z5yC-dYlXP{J~Zm_u-1jQ>-??rXp`il!LaEjHrYM(3DnmBQ&LOH2XPv3=Nb54ooJ41 zsQR;kUs*9g&O^#CbDx~NMRYzsE2uGffcUPIJ0P)@S zO*UcybZZ@mH>Ung+8ViMi}gl;TY_FBEvlHdyD7?H18Sn{a9?gEQMy2S-m(!}a4bCs z$~Rx2!~RUs(#apW@inia?2Jk6F^N9n&2dC&v2Y!`Tq4>urY&K4Ut~Rx}LV#$E8DO4f6I z0tG*Q4=ue%`b{&ZqRV=$X~=TSVuanOyyK@Q%;&Y3%lkKjVc#QcQ@rHvU+Vr`r?&r^ z;N1x6{B`5!Ag21)IXdt;&lK@8R=I3>DM0qX8bjhhl3f4lp{LLlAe?DMOQ?i~MlO#} z?%gyi&8Vd=W#e_c*&95>$TZ82i}odDMDZ=+6>0C*CS~>McT&yZ4IqQ-+wtBzY)ghd z82bF@RZM2zP}v95?h(JQf6aeVg6g$|%oImvn%E$e7iIf0_ll17e%l3ViY}#RERsj8 zV8u7heLQIaPaRrc?GaMeYS%sQ3U5edQ@ud(mK1|Jb|Kf z--gl8Wc|uV>><>t`GpDXoF{N3KtPN_M(TXIuOTQbWPYo#aFAx7)YDGOtP!eS& z{US|D4F+zgaFp=Ne)O=CB1*?z`W6~`puBHi)oSdrbYaRQ(02(ZlzgB2>Z1Atp#;EFq z8((?z7l|wCReqMCJAQ`|!(b}g-%c;j=U*e_LC~d=CUr5jr(af_C4taCBb)h!qDjX8 z6SbA}j@&oqb3|Rd?Yfw0=7`+~uf;qdLl8rpIf5Y+ryU!B}vX z%SYFmCsSQ_IyXa=f2x$QZs;!az`oK<#V_dQa8`o;HS9ePU0`RsWh5Ez6!&DW>4AMy zY^>GnMu-@&c1={&TPWzS#9CTY5fcV$3DU+Og?of`s|ETyZj4v=_UMi2@4bNOl9$#BW4Z1HZ9<#p`8DK9tgZ^O0!Yfmlr|1BT)^%JmNwS6H)6;LUXLV zyx{NnjLUu~^Ka2UQI98UR{Q2HW=;>6aOOYWZ-&5V`Ww=C!Mi5U z_)*S4Udr;R`OSG8%C}Hw1D^`rZ+xE|lab+5b?XLZ?;TAG4+q{#>61xOmtCh!iEowmf{5!cTa)xGWbz@G>JG znPuIOXZHIk?@~=gT^9PJVpRW#<1t6v?NZ&l##aP>er7}s5`j69dQu-^=nXw7y+G4| z+KesW5ZiY7(h|L<{X{pudA>IWI2}Hnr`L5q*yLLyvo{JQJ{IXDzxr-ZSAcAKKfN{a zhWjpjd&2Z6EYR0Y_e!hZXT>TK1t|~qfMst@W*cQywn=Hi5`y%!Bd>Ubzm64$YO8zq z9h}?jW%~h%kuM*QvZZomOq#lUkp`#bdN8vVLzm2#Ep)L|1!O<%CC>6RY_PzvKjhNf z{N6@R9Ly=cq;1Azo?*P1N6p*8T*;!xc2I6?zX{o77g=nR@UwsVMw;8)#w?@u0?|^) z^?uXUJyOh%83W;}*{M{0_RckAl#E5?nfObAFJ4Xrw20|}lpTGs8z%8$tTCyO$~FhW$Z<%7Nkp_KY6Qgq=|te)3#|H%h7 zy*%mRQGwEa!B6Kh+G2&w_ony>KBU-e+SUl>xah$2s5wJCoo1&l6I}&U`qxUQmnUa) z+?LD72iLK+OF6TXao)>HLPQ_pDg7TM%Sj0+NON};kyBZwkscMfcU4# z#Pe7LLiXWe+Sl>W zmaR0{i%E=6tZ-`{+zx4&{tW{e74in{R8@ZzOHvpNV^7>gsP)w@Ri)nP>@@JRn^DUXeioUU1&o|=5fPn}#QcjNiwU9J0of-^%oqsUxp>#qN{FK)Q zzdHCQa#Fy+{Vp>U+oNF9TdEpyDT`5cX|6xmpfUEccKK|?>sZ|EoGP^fgdu%AFDj#! zUM0Vj;KO|6)!(;u<`y$7q&N_|xFQoFI;{Ogq_g%D7rs~%y>c2=-!d$z&fJu4Nh(~5 zK}LY{6lxZail*m3$1g-zY+P7ZohcfKhH0DY8uCBviem1%rd5vwK8&Y+MAW!^<)bAn z^Qxy>?)}(`0x;}$YJ1nzsppPZ=!Pae>})}bq$9kTvAIA!)@*e4wD|?kd+6C|m)B{P zSVk;AvP4VHWc4kiB0ZeE)r|Gte6*idMXqA>wtQS$xo=n^F18(d&oKcvC}lXjkY(x^ zy*zoEF=><^EX0^Bdg42WkhZzVm2uG!z56j=?t(Y*iO9xx^S$2x5OeN)UH2ivzI|Y6 z;YsJ!lNrfwAe)!v%J{UeEj*{li(va}j(1UovE29#7tBuEdsQ0^M@?iVE*eKb-tYo zv-r5{m(gAV(xM$k_A7gAp5l`+4v+On>-=F~ZCi0(Lr6{8K9OR1T79#qNVQ1+u6Np3 zt(yftwXY z;|TNKvo=*3;yKMYpQOJ0xDpF@ljjU6s~SH_7NLf6z4qIX9U9zX0zvQo37?$DIP<~E zQwSM`KgHOo8UM;Y7~(wSVC({B^hlL|b4c=aIp19HT@-AUr!qSY*4cm9<&k6!@HpC{ zup4&}`t1=7vhbR~C6j^+6SvQqn7J&tY#3|Js-?H=SQjn5f+ZJ0R>Q3#gFmKdr`S76 zaA5kT57oJiZq8l-;efa)$Rq~&gb1gg=Ywc{;wA2yo zpG0@!Rt!EQt{kJ+v=(uVxjrVaf6IL1sUZrOL*O(&*o$u5J-XSFmiq5G? zJAI(X=qArfx^|x-Te#oPTbirb_8%1XZ4RoKvkw7!r$OApClFhYXr>{(=36p@{~oJ! zIM2G84H(d#Fe`87sE(xJ7tj4=at2J_>l-Qo2TwhCHU88{^ksVtQuG8M63ug*yhn&5 zFzFM_YB>o4kL-m&3!l;;&*b2us2pWbtcxh#FBhQp@Usmy2j*aY=`lm2mFTy`Y;)YG z(aW5(v0jsiU2x_$o6R3#-zCD518`YC$>8a7?qpl%6ywS9{9GnGo}B!>3;uJE*m(z} zY^(Fq?UP~}hL_s-=e|vacL`(K! zZ;VcLUbqmn;0KhM8mge~I#K2ZGMT<3?D|r@w@1_%uoi|CReU3hhFdHRw`@a#YYTznd|M$ScHV zA#@`y+XcH(JYT*17yj1^&g;j3CI|a9S#&P*h@x9v(^cue^*7=)xbY&=!dZIqgWlO3 zy6E1yP8P+X=*8ZKkl+l2_^f8D%SBJxZX`cXBHd?s49P>Zs04&rPkT_x)?W%YmKs+cs9}`txzdDFiqR z)VMSjEhe@Y>#BPm_WB=CMT2xT>72jsoD_d;aM1&edZx*%avNmB}O!mbeq)FXQs~K15%4{n-38Y<_S0SDaAd zZJ{b`Dcqd_spr}jE>gZ|uyJeZ&bYSe9?!Vi@~NP9c{)FK5%=?TDubWcPpzeG;GY)= z8k5}Qa7m+gYm0`EiJaJl#JWXjUNh!O@AX}Y#RP@h4eapQOc8(*N|-F~*v<9tU{ZAC zMSH={dbk*XLNOIF>?-;<&9J;zc20GM9r6t6|00+8j?;9rPpUX|+0Y9+()IZ~9a{%6 zaKCr(g7!-8u{L=X&LxmHQ2;tN-fSzE(|@%{-hsixy1o2wgfC zueTJWn}XTAqjY;CT{LtOaa$BIBB%6sV^e@&##XE0_la-3pF!kW9Q>v=q`D?B$*79aVN(?nw#N4b0Eq8Nk4Esg6M1tKv2 zF@vp^P!V7P)^rno<@&+gvsxZpf1!+@`F?8qLxD|&bR<0Q*XQ-4#}n`q;PZ74R~0WC zpygq%)zxm+*_fWf(dge{eGgZAA-7j6`#XR2v6<12h zkL?fuK+$ri_M-vWO3H32R8E%pjljPop;OK&wm8*&eUY_i;6}o18t1VKxwTqlqGq+F zeUIrPZ^ZdD)hg&qW(S!R(b5ioyQsZm^O*Pq&1gQ z26$04w<}gNZYJlTs%iU-22d~+jr|^z!CO8nB|m-d>;!WmJY+`RB-#x;{eulv#gn$X z-VO4zD^rY7o#PIU>Vfl09vB@uh^69+6hr(5oskuXr^8}vPfvMBK(jYp8uqVWJsN3< zVD*afaFZ3EHDTLQ?{dMrFEx~}hbIp_Uc?FZ`Dvi@`}GiccrV5;tud`!_5I zyAKd^Cb?Z|s^JVfA+Y5_OH~s3ljnEB+-Y=n2}a!~Vp+Y{=9jsG%?hL?KTxVYT$mQ>xwvfkYq}LVUzjwy8kZ9``PCdHx^LTwIZ1+Fkr{hj=4-T9@Mg4~%@ysR0o{uPmNKup( zd;lKpzj0oDE~_!D4u#AwPp8?qz6@?bTTFpU5yq}8htSYR0y#y44%CY`wQ+@gO=c2_v zBya9bZ1c<8R}3r|ve&yg8@Yy_{(^Jg$>5xuQ%iGt1X$qW!t0Qu z!Na#pfab1MZA-x18FEG`cQB=FD-MZkMmEcDhk~s2l9^{X4!UoCyJ$>N=pwV*d!9+K z;K?8Rwwr#hxqMkGg?XE}jQiJ^r{yupy3~r;zR`gkZH+(}QBW{DYN=@Yxq18N$YQB4|VY$Bp*h!yK6suA{bA=K^1=icOXQIDT4dlIv>8AgD6x zmqGbx-YNki1fqUdcv8$<#4oPTU%0_iH;-F^qY@b5$Qsl#iw-e!-s7&)+7K@j0_<2_ z_*;?;w_GEB0n0OmW+~qa!^r9f$E$iz5`8|^vSx#U1uBiS)fx}qgR>?6w$+$*ZrJLcWOi4LPZAi)?pgO0YB3tEkE$v^R*Q59l)); zQ!{FQQC_U5@Ac*<7mz(_zSlml{CNkn_t}otrjGGWtPBA|x$pJwk(i&x0!Ewf9f#ZA z$Jc@I(=2|t8jx#y&O%qOuu%LffKn;RfBG2ilNqq)9A(!|vP=2|VshyThFk;ijBX~D z#oyZ_X8vOQ+G8@{8Rc$CVJ=6{-`9bu6N8J}?i}0j_}&fx`8I|H5#X!;kR2%B)%;nE zXacK#*a>7gaJ2Uv1|qs8bJ4r?_}l8>pbv zjwSeVUhV$F$Ut%B zF9RQth7Dni1x*CCVmy;tVnG)Pv~b{z4u8p%-|Z9k1UVYHGyXtg+M)7WjItbhj1pW8 zBG2r>ttBwkG3Rtu9a^OfoyAdKTj_xAo`9nRN+Qv@Ib=Ojw2g%@PomMd-CY0E5gbtW z0q)Rlpm&vfdTa!UH9rTuWD2%O?}lTy@2>(#bsX@$UjOV5bX!HRiyLllU0%9ALb|lL z?n-v8$;{0N7+{XH@PCzsQ$icfVbwFQJ#x)M6xpuo>B?$UzuRE-sd7$F2LOTJrFUm* zMT2hmjwI*;&44-^4hrirG^ADgE|+r{5CZy!2TbuuCtcZ}SE^M>YTi|Oy%kKcx^5#9 zqw#@BEpy*%`xEeDRQ%?$v{9o#ecxUC8QTf}on-aJJIK@7d2`0P{s0@Aa2d$67O;=r zU48P()+2LyunfU0YS;ka4HJiQpn%#CoISg2q>U?6Ww6vcr{Dm~nebd`!jF6k0;r0t zZ1a8kvztx5d+$hxyV!JD>HjuhNAH?%7siKQ-C-$LHXPGdDR6G^aupkY{VpClfAzl% zet^ud0|xy29W_9GkJ$>o;pJ%h{YX!}a8yar7`&upJDRO72=3fx_&0Sm89hXc z^G8=!kHGsGJrjEO_2-dluNQc=EsQ7(gcI-r9a?7v9u_dvxtKj4e=d%cgA7PIaD(;xcg)rI3`GqU}XHX z#pV2gmv8(Gj=Oaoo1|6~SG&r`$gqUGedN;pGR=6ed+-b-3bGYf3!^mPogXMIT4J6Nk$!{Id% zh$K+!n8kg1i7wiW;!R>y$g^b%kBxnWALOMrK3;W%5orv!xhKPBapS&hF4wKNDTy6%Mzq<`!e1vZAZjbsskngVry-)(*`=I!R6& zo5+r1yRJ^!A{i#2+Dt-ju*wo`7?t3|HDT^m<7$V7BLyXZ+5WZ>uvuV>j3`4(oiBa zV6v)Q=|xni-c#Avq$5^#cOrtXPF(T4?V|kF>E)guNA$h=3nY?m$Ddp?gL)SCUu+^J zT@8`qKIh-~&@$BR;pES}182%qKhcS2&sB1ex{a}%MWk=sBK0R~R$5@7dWBLHAZJuf zA^?J2Y5d_kvcDRTy#FvAa>j0g@dljBUQ0K5Dl(-et~mY|(m~Cte)sAc*G+LCxqc)G zPEH_%1wfvb{`LoC5%3ifU{tZRdRSbry8bERv#PQ zvF>1X4%)#|Uxmk?pFJnxG&aO`>kGbJJ0T-|9guAUS&P1-y+n?0B2Q~O8n4`%7r+_y z@UM1T%352QOcH0Kkzzaf4tG-OmI0tcHE3uJsDaQOF24O~rFrYERB70~K~~kPqy6E$ zU}feQD=Y#)g^H}idg3+papEn5hLMiH!ez(_`v~)5XNyhK$-Of(XSQw=f%lS+{?2XS zqV4Iv?*yTBh5}~*IftRP#fV2AAC((nZuN(W8(mUm3ah0Qk&>J)VOFffMIfq6JJxCo zHurXM#A52rwMVoXz?#B;?D9ShvHtH&cuNHqP`18w+G&60@U(In5TJeG+i7pE0RG4O zfd5eJ5Z-zt{>0l|uCtssNk?Xs3j;M^<9>}psFHx5Z*#3$Nfe0R6fYhl>s&Ge2qM;; zCv9a-*o-F7J4d{?q$TpZ{pz}vVz~HJ?&)*erd|JTCX=7H!N*0leadOsel=_|3x3Xd zUX|V6)`dG6fGohJ8DN#0meD1zhELkQNs8TM zKj!c(X_&gr!ZzHj{yn45VeW0I8Mx~goFwOIa2J<6!t787kty~7oQQ3PsR(b+`;~t7}KVB6IkBk_T9+D^UujzRINkz`VygwV>j6^f8O4`Ftk8&wr7qy+5(>R*6q#Pw|95ba{z6 z>pSk1N3iSh5T>wIgp#|a1M10_%bo9wTh{ZTKNoz@*i?-CX#P*!2MnQ@A_1*jpo9&r*DR4)Wbu1 z7lV0{7UK|#yeWw~Fr$pvBkkJZ@m)*E)2ohH@uMpU^uupmP91&SyzW>RojJHmwa-)G4 z-}Z8ci@pwUhj+S_e%0NoP~iI>>9Yhq;Tt)}1bFUAAIzF6M+9FTDmC92b}akb915Lx z-|hur#(UOsjj#rU;7Vjog923Y}rg^|?ZyU<`FH=QfO zC#GkoA18XYB{_ehI%^>R63k|a9O4tEM4o1~IyPyptdO4&Tl(;vv>T@|MXAi^X*XuB zYBEKa0NA~3l3KM2UB&s5rN%+P1UvHU3v&|c=N^u~sX_LUY- zgbI3I)ZU*Gr>}lXHBEs}-Nsm%?XgTRni#eD1>{c?Plo9>L#c$>XJ(w{uTQM~e?b~u zqvPA9!>sfWBRYBSqo2`R(nJEiN?^Vgh^0Ao?qKG^pZZbqAg`ljjugcDELZuM5HLMf z$JhS-i8`r=1@JNJw_nY19=qa(mFmP`ud^xYLD)`XuLIPfda$jL!6BY^Zboi#u31g3 zZzG_f=Qj?^5{hod<@}h-{T;5kZv(KohCJi?c7dy{IM#~I+sE}_mPPl3K{I;=%d)Xs zdgX7*?r-TXR;NMVW}DS%$Y~(gszPItpNp1@G1e5IkXWZg=Sito#9Fcs6WSoMCsoF| zI34=4B8>N*tRD3RqS}{&PHPKDnV>R2rEVAcw#BdLGFlI-u`faEv4`eYS|o7+S89^g zCHNCp7mu7O2n~R$eP(u&d4}4Nbv)w6 zD{-;AB&82a(67k`_j#M|c!~ccsi;+@SiE5l#QKltC8t$!hBB+S6`%b=jTRV z`vYaeAyXb_#4(U(FyC8rWvC9ajPTgcS z^27bAx;Fsng-s0E^y?*P5R*oh-jB}yYfcLQ?!Rus`xAc{`Ti*MljjWbJz88@mCevJ z0L0s00fM<=%vOE|l>-cPJQ(v&n7L}jIa}XOstt-hIr_^`ctzBjFjG)Xgxmb*2UJ|F z+=3y^7~_7*5Py<*is%7$G~R14eme~%i{lPlIJ$fMz+6lAt?PKRxtT~!{r1ryWgxxT zp}eMC;LnlJXj)gJT0G-zXlu~Wr@$tS9cJlblxH_z*pIXqv5x- zE5}TIf;|>3T(K>AwyLxuR>_G0SPhXzS69N6$BPP&Vn8TI%!PZYla8jw?^je!680^4 z=9^Vu%uSauLz73qKnos5vAS^{0+Ul^)?Jvv54lL(IM1d_au|K}=4%D#pPaXfn0}#; z@(|vfgo&KGt!J@yXO139OASb>I#i%*@B}&z;#WmCI&|yWM z5O(H@SisK$2O>^Xx?lUk@CpOIVj;+iL) z%47h?^Zgu$xh_3}@WjUIOzW+D7dFfm?;~Nzu>6zHCz>umR1z$>6l1e-0YjO45Y}`o zovy!CtG?uA5wum1xWOo2;T2x_j%(_++`*{A!<}`>l)Zz9whOxZIdz~kyaT6HQi0^Q12i8`oAM+mY0pt}mtBg%Rk?i0A zC!93?s%PNY&{~uLyKOOZ4^wz7kh!Ju*u*Wetc50AuD^zXS!lo=lb*pn`h1sY+z^7X zGYXK7DVqNxnc8#nR0`CY!C zyU!3X?yidePUueL3Os=skIQwbdRTGr^GxPEC0q84nVRyfa<{TIfD`HGoK^mijyHZA z?*_sJB)Ni#1{Wj)D*$AAs-A2W>Bz1_30O3F@oSgzA2Z&SESzStIjg7ce8KgWE4KMY zW|F3`-isS-pjMXg&l6xdg;R>%6u$!i5ee*5uBU|O*CZg8O*IZ5WBaK>4^P5Bh$gvd z=le?zcFoE-iA!sQ5&#Zi{}a^`@6V@w@6)PgqsRD}FG;GV|{#9)7( zIIt6!jQJvJuRY9#d9WnHvER7|D!9<1UR(> zdIGBt9y``FAI%WKPQCkZwfWt*Z?_$Ig5EX5u2u&fjh5IxbJyw{)~{lnaRNH{%ogWM z$nt0?-$_xy8~NrwUd^%X$|~7TdR#JjZvb4>8%*NACMQRdWIk-<_^r|b z%M5A%coJ}z^e|6}i8Rapm4biLe4RekuQC{x0(U%WdG1!%_Xe`I$Ov8@RLBh>EblZ$=$=yz2 zjPlT;2T1v}SMEEacW*{Z5Lr{bxdCkh-D|O;EsMG~s9f+3fpW*mQ=Jajwv#&T+6OW| zFzlE~L_>=E#SoLn%z7$~HZ4@Ee4?;2Jp^}k^hTNMY~NwZ;7Jk)RM*erEUXkZniP<< zbDlUX`sSXaD5mLzp&|mtjiXQx5TzeFG0msT>m(gaKf-;c_R>JEg&&PnWw#Z+YOBQ% zrtA@iP4f32aaKQyFX$dtd*6E1b7(WAK~mPCYroxKG6QFOv+G=Ya%dHNO4Kf!<7B;# zFBvUu%81&5D@UuCD)g{1oVAuD6}CRs1I;DeTUoR`wtPF~Ic;ntN%;{1@B0EzlPXVGhMMJ zH`b%?Q;bxxyMPigV~((Pv{x>v4flf5A2N@_s0^X<(z{C;|Cg)q|Eu3rJ|yr0 zw08cQaPONb*@DY==sSC$QFX?|~QO?=y;V~wsHg?)sBPzN8F zU}blDbs&z}L&6t?LxuU@%&1M=Z7Os6)%;Z;inRY`qe(Lj$ z$EH1}*sqSb4#*#t0v&s6u&Yp~@J$>bDL4voG?Q5OI7Qnp(zJ z74aGqBB44AE0Rv$V;Ti>e3*0jo}WO9T%vxn9xQ)a2yrB7`x?XOs}50=Qn?N}4|2KZ zlH@!lD@#8xun5m9YKTb+BcBKFo&V`%B?Z6d9TX_^FF-&Q}*bmb||-n9*1ZcTJ+n~G#X1xCxd zS}AH1dwRajiIKp6Bth>!S6dNWx?n!xx1`fe91*+2O(zs-o+ge<0+x7UnLGXW75YsJ zm8sXqPU7WokI!?00rrI)ZbzcZ*K-jE%un6j4*4>BFzP$ECoBp}Xcy4+;nDrKWMXzQ z?pgk9*SNBi^j7Gop4bZtJzP_apE7aS*ZSMdhN<;0LQDN!RfcVd>!7Vf<+}&Zzlu~a ze~_}%_Wv;U=HXDk|KE3?6p5%*$RG)o>=k31N(@;>DJok+NV1H5nMsyO_G}eq5+&J7 zcE&okm~2@yn6YP>G0Yfa=6=ubzOMWF9rt}*-_QM5$I%~c@3ZrKEzjrU*)J<3qe1FQ zwCfMAAucS_8^#tezT+wvvA>(<@RMX1V)RU){?v^8{ZcdSGjf{O5NN)EIpoW4j}juK z@$a-DdBl2Qbp{KCAL_sO1#{#7eSrR-{8r$an%)O}bd+FJC@65v(2E)6e8z076Kk_`3tIO1;Rj z7U%yfFf-n9<`v8vbc=u7b@)tgf2qxhT+DV;>n&xEzTZpT7jqv)Jf*-qH`3l^1!sew zFHLH!Rt%1J7jn?`9-kZ=SLGEZBe3oc;Nw#n@}>eyNg55Cm?!~! z?5k#ro=bX+NBlHP)fSstD%RA>_mwP292tixyIF=DZI$>9TC&_cT?ifkOMl-h(>>M@ z5KppC!=%LuA~qs2x$I8wfYsBGAG%;6aiVav{kX<0>)Y(b&Gl629jxM z3q^F}bRmMqTAU;<*^Us=pxsiu@#Antgbk3SeI!Af(wUC2vj?&xd!^(Pnad026*t5H zW~b*w-3{w^OKJlbdel3kTx8VICTBLfgal}uWmYWE@J+1h@Cq7=PD$r&b_oa&M;f<( zcznCoEgpmn@3CQ$)LE{=6c7J|r}DHPgEwE+3%$;ea0_s{3PpB(z#Jv%s3knzN~wbr z%xDxTpnUYIxslE68aZ%oREv~iAVyL#Yl2vp@b#46Bj%R}sNu0S6!(3XkQMMgdWWcI z9n!Z$Jm7ME{mS24)8hyD*Nyz|gj>lD^@juJW?}>$b|qWfvffHw5KIf3uQsh`&+XNp zH2*(_)V^sgPyU}Qfd7h8ZTcsnspM0$4~+j!ptGw!|2uvnXq5jwzZYoQ@?wq47iWIG z0f2}hkJTWFZl;E(cAe?=8qar3x(VM@`vRw`tvUCEZbd;1biMhp12b~g8}3?-MWG{# z@@*PUjv{RsucZw)nRNFZ@Cng#?ZT$eGd{^FMbq77m$KqSUTk_i5K{PdmTyXhbZeyN znw>z`pSl2bu7+=-(;W171L4xi&m~F0w^-L589~Fp`f^%22{feqy2f)2-~L8^+8|gX z5dN#RpN!IrScBgjGt;p4hokA~6wW8&j?*1Tj9NYsZ6h|K@sL_rWMjg9V^GZ;aF)qi zxV}s%Aq%cE>b`S*vb8|lD-fITmctO*j=DPV^eyar7V^(Z%5l5++W7T$Wp{IOe*v& zT|@9O&xZ3&5*+sKYI^TQ-XIcy;nq;g?#Y%Jh0q-{8Yj@f67O!e`M!Mtux;Ts&$Do2 zHFP&j4ENsVI-ob0sC)ddPEB+_(Mul}@kr+@(z`xHsV5|j)}c``^Be18U_X6J@(zTh zWTQz+<^@rtN2x-FX~OSrVkSfEMMNRPr9b-@>_L>kcKj<=PvMcUx=4>FOba;^2a@PV z1^;{GwM*E5a+9BBgQ>Kj8meZA)u#9OsmAgFq6eaAz; zl0}@P<=;wIGuoOs!^_Xco`J1mKrdl#Yl8b#ek9ZKS>Q{bg0Njid>c&JH zbAx529rd@-$j7c$`y#ZVeBc)0&7kZLGuIMrLv*5_8R*!ypZ?o$6P+xdS4l=Eop@0F5t1nIqV z$Ek6HqYdQqMTjD&Mc<2>i;hONFXBFkqnNd6DFbR1Dp@5ZZISp%rpl{b-Ng<7_4mZQ z(xd34mtoz8ye(*%zlwi+CRWdWVmD^LO1FH(?YA=`Y(uR%rPI(Cb~n{$&BN7#ayT3B zSPqO?p%<`;GvM`*;(n>x!^r!&>i`H4$npy4%e zUR#f+O$bo8PT=4>MDtXEPe^B(uiE}+lNA$+SC8`OR`6oR-vBmq3Ui?G*!Wk*f-ZZ0 zUNQ{Pmz`wrT)9G%7A_e2NKBG?uy2Y(IP*ArPf2WPGwY1I=31Hl9fAk8g^d}fyhw#z?61_CS05j2z@t7mO(a<^PBX@h#b z&sn~#I1e#Ci2jYkhN?nqZ!=pVa$AQGOG@-AilowmozlGxy#cTQgt;+)`PB0_6P!QA zDacnOh^?%~8dbFyFBAx>ofa)MqbyoI3rXk0hsZpk*vU?Y`&{jhK)Wt*0&G6ZjTh`m z6J4fcW(_e6rkeND1eUuP>xZ1GPw~&*I3#5SMnyfF+XKQ{MrGZ31J=XhBytxEG)*Ue z!8+$Tu;)zkoGA`6#6#7zEE!hq{jiqf&@HYHefauWY6e0FxVcvK|5xVy|M#3lH8sDu zHt`Lu5?7w$eTiFR#IoXkO=OX4Ipa;T8Av+Q9j6)nRQ{*PZw=qaUxX6#tau`(qIyo! z_+2d@-$F$ulJK{-McPCSJdAs8JLzA}Ew3dvdv$s}>v`tzz$hw1B=u8IcR=XOI|rfW z_FHF|xz9W%o-ezI{PXRFH~WZ1VZd$AecQcuKKf3lT%f*}Tr|&1@tgUoeTP=7^yhN)YpdH56~-)>B9Jug^$&G!e5F zggb8IA`AX{>hI~W#(m0kAWH|sPD}ZyT_;5fncdF<*bN@{Dir2C>&dtVE$y2~D*|jt zuFqjIXxRcYPR)`g&}V~=;EO8eM|GC+QcmqyhBW?D3UaixWIb6B(7fKb#8aZ?ZD8a7 zEE$3qbKA|9&TEa}HD1Vqn}r~iE#JR#k}0>{w}F>h-E&#qjYV|#2Qht&S;v?gCAJK| z%A$Pa*f+Z@UUjFqIHK%{51iuABQ(Qc7nm-*fe6jkXSClgmDuBQle;t{^K)i=G@Vy} zz?(X2uhA012q1kh!%(M>LMe%Hm}PauTXR(kGdBfJ#j0SLqT*~4N_sB{kgts@vw)nI z2?hqH-6UWMRwe&~E)=@eDL5~CH;~ZHKIC_31i2IgJ6fQ&XEK(%j_m)(=ls7661Wcp z%FvYkAIdmJ;Q{r?@3_b~8~!EECQat=Z_O?c<)}x7nMlNZJ#5zW4 z_3Y~>=1+W`Tsd;Heq}nq6{?~GvZ$Kh{cut;^eVA<*k=ag{f+)7WJJ1W@F^i zng3id+(5~9h;*csxB36J?2_I~P_f7MuXpAKr1D#abUJPJ{!J!#Xz+yWwH>zTg9;_b z#R3qAgcUJd;D~J9TV?N+;;O4bi%{9i&L||2JA)M(Nb>|5Lv@T?d|QrT*?Bb|^k8zdS$}Xlo$YVUkl@w032*8rGtK9dU2c_|N#VeJBUvN(k{YGk>u&U9bhW#x$YIT1~sFnWMok!&agQ;gl&lr&%%7EdrBf-^1uA& zV(r(l(UqiypAPqRfX429czQDatFxJ}ftGcXnviC0yddhx&z$N2H-9E+NbLFq9 zJe77zCBfRe)x39l7YHV30QaP!ij+@x;X5TF=D!2cB2PxYpRBCqgw4mQw_cC&u}KJ`U_h{jRkIlWKyJC&<|j&!O;R5JFn^tFKLpO3^^ zOYcN#Xr6NlR|d|Dz5dXS@;M}~WAAH-{I{ipxnTpz1wPMc))db&{=J)a zxPJ)GqGjaxxU_-%W2f@R=f{8vI)54q z+3A8^?P$<#>UWiYo(j{u`MKq+Jb`L!D)+q3h%Fg}=A0c{54U)ApAAI=IWVplCPL6SHpnGGdfA3zpz0mDEw6v(Fa+$vT`S zvp<9UPN6k_mZw8oi?a-yH{YIe;zwciv?`8a0QDh!;xi%gBC*<~xVoPP!T%!?Vku&^ zfgz**rp7}e1ygrJFX~B%NCKHy9%s=mi2+7S)2n+){0)WgT-}aG($tx)iRfSNOkTa! zM6{gO)ZE(1*MU)GR)s;qavu0zRtA9!@WER{A+XG>0X2jqpxdUvI?HfXFrn5r^~ zq_UK-tT(z}_~(L<+bkude`j)Zmbg<)mbj?!A|05sD(L-Nk;l8=qbJxvB^u0qMgCLP zpN=oM59yu)YAh93PDb~0d7EIp(K0N z!|F-Hj_y7J7p$G!QSM73y`ql+(KhXBey#GByO^%1jOY*t5k8+ff^e%4R5|=GhykEf zKBh@y7@!i)nOpPaZ~hhLC2Sz!@A{&l_|+1uETPX(IHJPcY(LK4q2X_*k*#;?+F!TM?zOYL5NK-nP){Z6fM4aa(ZV=M#x-@*af^g+Vd~6r_fijh^0Riu zQrgKqC_vP#d9rSHts78J4$P=&agW8c?B4Wk8rxhh`rh|6v@@1xU3^N66E34J(U39S z6L=nr(4_6@*FiU0QCFosepVM}Z>U%v2uPXSa6c>CU|P4ZtRyky9(83I;`i|x(?}=? z%9=6FQpWp*PSg@Y&NV2P%vw)qu))O53(`9k*Twxc-l`!k7UoY^k1Y_su%Jo~msMG! z>^VLhbrAsjyE6F1R_{O)GN0GFkpYQj?NT^m?t!!^LuL=zB82|M0DKbGzOQtHkUhI_ z%C_5(C}O(i9UxOGoh9^qEa40PPg623-f&yvhz+#JqzJ0`dHG`<+%23Lw-Wa+k$qsb z;`Hvraz`HTb3XB7eDYmRe2zd@$N7#2?~C7v-gh*#7%@aR7j}F_Lmnd3Ko5d&Gfrv3 za_;=wfn^_up4x^=Z{?eg7yPk&J!9XP$9u~1?t{4$rkmAxzv>YF+<`|c*ZN3H{MJ5Y zbY|wLRa?&<+Fr~_lz3w7b^0! zrx*@qBy0OkY41;lChC}UDXHeT7y86$=Sk%*-sxVMd-Kg(2GkFpp~!d)#PFptBib17 z#0QBBwL`$#@!dh1pWAwYvUbj5y8&$`KM^M39Ttehgc{YoS0saD1E?A`iH)?q8xnKN zl3C{m-d##7hlLIpceu5KPJQ%d z%cD!#myLvjjD%4iR{YMv0)ed1^-=50pGh0JB2iAb!%_SRg1;u9QmmOB|ZfM1=$i zO&wQ2ZWur!7j(=)qTn{XD5TZ1n;){Kw=95cxl>iqFE-OJ??8XeB8r{5Anmf0DrNRg z%7K17@i<|@xVo&7eN*mbrZ0$6Kxm-oEjP<8Z^3E|$5Y4h`LF|XuA=FX**iSC6xIl= zGu5)@f?Uvw&7uD^c>sMmRH3lqsL|>aXRY!Kr;O7$#r2LF18Y5=u}gwus4>R(msfkt z-uIF+V4B>kKk!RmkUhbH5)c&5Op!aMUUo z`A0hnvd}2LM!p#4dpnda+~@W}Lm{aQeFuS2bO_TN3A1yXl=~UhlIM41B@XVrcvHe? z{nE2s-|;sU!2R!Wazx8_nahn5Lj;YDP>7uQp>xo#%1j>xUlh$Op*>kY~S#G5#0T+-!|ARV`?ZEu`y4Aq#)-bD7om_DmS5*`a=l|9K_s zbRgZo*fvC@N@U+LF5%@Pk5tOq>1n&V_HnT-=G|`UJ(yvytt|)XoiqiE=L^PF`G>S4 zceWxi!~R{;X5fKh+ydeX`nsyNe6FkJ{*8pG;#sj)O5=uH)iARLhOpW4xd)^0LV@i` z>xSUZ5by=V(Tk0|0kW9YH3)o5NwctcW!$*beEC7UbnWQzBdol?$&A*_&99e!r;U6+ zue&F^`j@yK(%N6ThVP+I()Br+dSG&|^c^VEO7wy#N* zc^>drh|dVgm~Y?c{IK-?x@z>3Xmi?wa1mnGYzp3QAfMkM4BT?t^QTxZ;qXHi-Eslw z&W4|d5r?W2hYL!kUby?EtXrQYlvljJOjg;qpc_q3uikyoffTmQ5ITB>HkGuFILvbD z7yFwV;32$uw)QFp#F$J!*pJuw`u{IPHyfNM3)5CjO@;jn6)P> zglFW;%PW@KuUEt^*7D8qY}Y-?r_%F@{C`UMgb66)jCu?D)Ypo_z56wykm=KQWQ9;^ z7Ifl+Hnj5!8dMVDNcTaW*MWfBq2((o(wUuda|f-6k=2dtB!y*i6!X7d#UQop^lP0XbHDP1mAuD+=& zN_!dW^J(n7?Q&Y9Qit4Oiiw#hec9?utEP5h1;meN`k?!*Dxy%UezlD`uDh@^+*J6V z_mPiyq{`gg4%m)MBO7nT-AI@dxVWk{vfK4bPf+&!y-+*@VroV5Gv8gqPOb-WMV%VoFClBK>_# zco(K)iRPyh&aL*Ud+mnyj}@$1+1vLGG038**DIjpShZW#aLJ67f>6(U47*aQ{ZOLZ zj38m)<6?FQnF3Dy^|WTKOWHXf;mjBCUtc7$>gCxE3H7-*CwH3q;9`w{X#hssF3j^z z7v2g!qw_k;779tt4vtzWr5JpkwSlT-nYKJ^vOtK&ZNK|Oewk34Nu2~TN3PF z0=(nNd;&kBI}Q49D}K?_D;XkmvgJGFb~g~qrs*xP8mp&Gmo24hS4D|dJt{``Z}%+x z+D;~0+f`U>x@%2VVE=P#fBwLBBCy)ab#)tL?wrbL$h{NDk5+M_acdadF)(sDr$Eg5 zUZ$(<5XQK-{dpe781@l)#Sv&%J&Lx~-in?VF`t9>33xai^~cFYDDk}4z|C$bYA2*w zUfbiB{)~>j&mw~sMO7v8_=8W_w0+8^w&(QeO7a^Riid$MRyuePB>3vz zYir`Jwt+2`7KoW+Qv#{FHJVdIHB_kAAh(ZLyFGaMI(1w}H!Gr0v-1LTYwt#_U+~#P z4W7fl3zw{&XwtT%@^?%l!pVNcA8u-R{Lqj0$mOuWKZp26gA`+}}8t^(!WMGi6Y3kr1UOC`NZKPf_~}jn_J(QDzzO8F;u#y!F(;yE8*@rargU2$;q{18Ufe_ZrQSwLjuC(na~JR_Td*8zsu zKfvb-E!BLz`2O4PB@C4c(>9sxDAyQ3IR7lL&rVKuXOis3=#y6T@UxJ&KB=?n2^Q6^ zTrDmj==k}p&?GNaF{wE!(MZXDu6Xuc$igEr2@B*J`I7kS#_EL7<7-*IB~VHaDwX)6 zcW7ZDTgHTaL|}P!Lewr2JYD2b(w_VsKA!m=jumB+c+pE4-B90`0v?fi3=g{7yL5=f zGR(Fs^Qz}5b{_sgPytp@s8Im2)z?pGY(z|2ltFOd!2he5rjof+J-}wF^|Z8H_G&klZ7GC?=j65=&3_J%C9}Wmx<=W^Ha(GDoLL` zW>mQE&`Rb;wkHcalD+0m^+Nak_7ZQ0?06r4cgQ%1GvB@__|ffYKJaK`ae2HFu>X&lZ=d;oO!}VP9KR)*Fd#i?6u917C*O z^CnsZ8cr|}mu1+NpRar-0I0{O_nmAK?V2b3(9n`4scd~-$r%@0u-9#Wv|14EfZP`J zIS{H*GN&bi!GwubIDS9zC(RDSd$o(u0kw)U64w5MGT5+44`s*%&9+{D-m)Hm-TlD` zoi)Iu;jWh+4de5)Sh0%M?$!f3<5h(Hx>EDC+GEV2Ttq4&sjPR|v!|Zf%=LyagFreA z$eAi1N?#*CvPqK_QnvJlH70MP?41)52;HMyJ0alKkN(Do#)mF3KlMGo6u)UnHFH}0SfL?fy<(GGf=gpH`-xy$R4A5B*jQ9z}P$ds8%L^=3 z4oK<5j2$`d-ui{rue1|?y+N;Iv??KQWkSi;*VmTO8`)bxcq_}+l!%nEIo+YTJXjpd z#tInkZq^UTLd)VMK4*(|z#%Rm*q>#?Ag$FMQEe!R|9d^`X5v{vZ{VC;CTg5$_z8Ak zWGvK$W`?oN4H(W8ePraq#MYE`r)5oGY^&z_(F-oO_TU8jjpKK)j)xJHS%(DHXN2>I zMXtEu7Hg6M2(#u8H(*Z|@)1XAGrML1*ScX34M+)aArmFp8b;O=`IXoOHz($A%M-e` zA*Fxk&R#m91IO?_C=vY4On!Iu#L4~td2z<#Z2R+o-=!XSJSOg_`KYR@9mjp?4(z6% z|9R`?iH>0Ya+P#Bd;Zpei%?Bq2BY#PpDA+ZlX$O^(j7}!Lx0+_Y$CU3qXPbeNN$;z zTa;Go&0rq1N0_8bPi-(mb0rvl=%&)+FX-10@#Q0or@cDw^yNO~TAj!FEDb5e(}7`% z%K&UcFoDDq;NqYob7{}o&Vh6cytT9*vr@y5LsAW`L75)ddN=ImArJk%W?hOG_86qO z2fUQ`=lq^w=4TQwBoNxSv_S6>dBndiUg#bD>4?R$jcF{8V~1HNB3Pm?O^4YT7k6~* zrecf3#LDODHt4CqqtU93RJV_E1O2=wvXd3bEuXriY}o$Out4_InJKBzJfHz_sjDtz z*~ppIJ~|-i7bWOc;d}rK=z4Y~r>2Ea{!@IrS4j_ROka2uG?L#b=~n& z(6@oL>D?YIvnLiH8Pp920DuZb7KdI2ZfZ}gkhG@<9EiO@3>crQ7us}(gXcmNzO4MG zk=Tt#ghOSA)*VPcuE@_OxoG@p2%*gaDF#Tj531>i%}l~Gv!!Q8KoJGn{O@0dD@MEF ze(yz9nf$>IF$2qJ`hf4m5YgJLcC9L;dHJGb<)g24u z0V`&;pNyBfrbs3IBN*6plqGAFBy`qzE?M+!N2mHX6ODJgDQLxCd%!pI7=W!G8o&(D zz;c`jYl4SK`N!MH>tb`6cXv*mLl+`(?TeU7ID<8-#Cj|S{T+`S_^Gp zLu2A^CCPk|pbLQHX4fu+`w)KgR2DVGp7F{4>CA(i_m`!a_+FvLm!IHBI*SHGzD_ya zq{RuNt*w`mMxwJB%)Gh=bX@n~+ar1>#(v3vBe@QDOoq^a`MUJOS^!@4smmhJ_m?Qd z(2fzleG*Lv%yTXd0@_YzAL|+=QwyZ$Op39v(m3<(0LzYATE=wZ!ZBtX6rDWIQSzy8 z5d}-VJNX2!wuqB{&M0PO%?(1^0aDeXcVA>;>ed8yZz7hHKd3qo?NBl6) zzwbC!2PBZy4Ss7pC8O|DM)F4@W`RUntj6X~HDSS!(bnyf>F!%W+)ksNVhm1PSUVKJ z7esyEmd^+JT4lfcJ6B&L?d8LyE#vacI4J0Ps-qQ5X~W#0fq zy3iB-u_tSD*QUWg5cOJ!IV*&-H(+19iY~30f8Wm0e>EgrVRj_T{^78@aUnPedBSL1 zl4TQuXo`TxgAhPwD%P|SfFc*3W|2Ph4rnYODvmTu3cAVxTkq2Cl7xJV@}Yow0LMXu zcb}7+aq^q=?of~bOtb1^9I3JUy38_EdR>yf-l61I4F7u(6WVSpiP(5$Pm|uFd5}&d znmsL)CK_}Hm`Q{lKr(xqVYbqY!YOlnY1uUCp$$I3>8p;R*7W)8(AnhOX+F$A)}bXZ~&-87C&p|ACVhOW?0El8jJ^SbTN;efdch?nF{zvejP0^}3U_%%vm0 zXUPhQ-$Oj+s^j(0(kj-UAL_^`H0HHS%i)uu5@R4s&yb0UQ*0`XJ;aY&zHnOa#iiLK z$#(l*6_UJQvMuQbq)l2iaY_@A5ftR#D~mup61JJ~`1IrCkQ_SjF&us0FTUvWyf(+V zJZ|}jCf_qRVV29X>?9=YYxMZ(u;-55cK1lr&W=?ySSU(h4`ehB;SxQ=R;*)zk+Gw3 zMZ17x?iP_;g;=RNg``4}L%8aIdZM_84RKUf>?RImH=qN+&pjQdtfwgH>Cfw&QAi>j z^4xm0N0iO68^m_#ta-b`RP*W%eiw-0kX4BhsAS0{^D(fCI*f3GzU`_0<& ztVrmQ#}is&w?8~00e%QK7Vt0ZOKw*}lz&PN$lL3e#25FIg}C52f}Rvo=*GXS)uNgZ z$EF)5TQyEc$a1-YOtOrzSQ~)5(e{r=RA}Xi-rsozQaC5v9TJ*+Ql+{ix-OAySzEJX zk-@O(n9fYI;x*Q4O$l7pnSbjzJ{A^u?^I(Fb$}xQ;p=12uxx<-y;>s>V@Vg_P&Yu# z=8o&(kDCacQfEM0@>&bOF`CxRT8naFw^AIMc%Oc{g8I^RkzoBCnV_)*hKC8Xc0ZMG zm*&|~6{u*N*if@#$)<8N;Jqrje{@~?6QyxSiG7@zjh8YSv8X5cRO{I@eV{2+xr0sH zAZ>_Y$zrj>jT=$%X;s+0)mTncz#lDt6hxJ=1aq*fIbuzcFfrhY?-b^;s`-$PxV6yDCk70>G06e*cJE zc4I6Z?1dAB_x%j8_)9oY0TM z@aJ3J^l`NTBoe)b%bD3A3P16c#e4FJ_Kl~XZa3y!x-_GbFfZ2KcivzqPplXJPs>=8 zMr-PVUEuO>#fe{p;FaRliSL0ffBjrTWKTO41{>JSbuK&-LAFUtlm`N?_K^WLaDU&k z&Z(+>Q=)Pkl5%vK|7`?BwBrTL>;d`7-09hUKhD0JD&X5P%c$8J%*i%npvrGR2G_w? zLl=bm{_AsDzHDvpCUaulOcfhg5sC8#2k%Gk9=Tk~Je)nb(Eg)WWLW#ddK8#_HK&cSbvOe}gETb$E(2chve+LmikD z_V8t>mH0>NfuxwIX&quk5f0#NyLPoW-EjPrnv-BPdIU8F=6mS87fL z&hI!pYl>KS&8t79L}9%NZrya<%UxF*mzeYsP+IF}ZKNm?Q>fj(khwiU_Slhwy11 zTd8+YA6-Y2^@Ir--BfQ{`Oo$fpk0jx#y~=jZawwzPxs;`;@%2GcS8UM@pD`sWcNG7 zo%`3bBR`Kd)CR{&pCgzjNQv=uXIv$i``ay)y?<|C^D3ED01JCsSGnIxixb#)g$q&n zX70t->O99h7cWSgfh33@JT$Vc@tomXxq%$(vHLwcQxand$ zn9K3eWUJ^AN&t9N?+ZH1Mt;($o_I0L5xy(qC7IvwP6L!iF+OW$VG zW(OUT&o=Pv{D4I3Z)?r%jHSA6$lV9$Qh8__ephok0-uA*fjG;rygDEvN$!Y_ND$H- zMdO*1#`Avrxf{VNIq(H#HU}O!u7sTbU7FQT6Ao=L-W7K}jF7$enH{%Wsu{ns(GtO{ zgJU;p(+i-QLctq>!}qLy_|90J_5os!zE6zl92X40^Wih%Fne^haReim2_~vbKsyLi zQV>;yeg+~*C zz~CoG@#?8y((boB&X0z`ed@Ws7p=eb;NnCgbPH;hKl1B8XXPf)W%{ly_O8iSi<>udd-&0#~0+O zz?f2wwA8~ViV|h-+pq7DH7t;#*n*|6o(*dlDJLdE8o|?1VE|L^nY^Qpa3?2ht8rqJ zZ!Ni3^O^df>=qRt6DLloo#MsgZ~qMr4FR_tX-?G`M5`BT}F}{b@ zuro%e`l_-1SIo|LOjQ=x+D|ZmQvO358tgCfZjd#UEN+vU2K!3VvAR!1WyM8w!uvD| z_=VE{?o+#hL?d&FRkYKWyOGQ5a*=OeIk)uGZl{>a3cNjP zv(QcJm?+7FMvlF~W8#6qx|nBuc^Dy^O9JCv@5Pwteyhh3K|Zn$ih@N#cN35ae8acQK&w|j2dPPdHidAuwAOmHpwH6)vuo5-*%fM_IKxi9`;JDFX*(F%JoP+ zX-A7vy_p`-n3WD|hZwj{K4Q)%^+C|B1V)56y7dC(*c$j6f_@U6y>AF>JCrzxwzo8g z&-2ni)2`hDO8q_Bgx@o|Kg7Gc;g98XA)IdJb7sSuS-UyIE`gf-d?E)2rvd3-%*Q(k z1G?%P9MPOk0C;}aTU$%RYjnUiAt168VY6^PzZK2qRHd1Ywx{<{2>7AhiWvW;O#fKr znf=J_a;-@G??5Eb-nc(RFuOZ$|J}Prn66$|@m^JSo2DVwX%7)Xj3VY|2=MAOOWO6f zUZ8L7%r7djOkY??Kj5-}r{DVzw|O!gz~ z{Nv&@spjo`kzGJA0~RD9&*Xb<-rJKGif3%EXiXJPQ+`)9{^$aaR{Z?;GUn!^5g$Ir zr(&{ML^=GGcj7;a@{gbG^o;h>W7_1x`2AYIx}t|gSA*ZA&!k@$G|Jb${2p_?N}Z}Y z4R3+JQh5s>?f6y15}6wA^2RNqw_m|BgSkqXmOWdc9Z8c5x1aQ1KCoyAqUfY&w%dD9 zq@3p-RaZUk6@AeEHZ5&n;iwg`fEPLFxz~Nmi8gj?)DNaSg8u{$J5yBFN(Ai<3OGie zd=2seNdrAEaw4m_Wa$(tG|K`6(=BeEN!jkmIaZ&#pqbz(@>OmrIPB!wD?OhIgg_86 z(+7|$OIDnGlVuBv?Y!k6R8WyZL`kauWV_?(qD=A{D_l#ra$c!LI>`M;YGAegm^1qZm5KZfT9-emgrbe^w**OU@Rkzr({zjaVRQ^s_o{XLrs&dQE$@*r zhNL2BU`j150~VANt3hv~ag<#_-~=5!aEMq2R(Y9&2<@-<@Km=OuXy)o4a-_xAVj|A za1Y~=LYhA;{`8j??3jK@a-r@VLxl!P7D%p-ALXgfK2Ft1u>y9@#u>Z{q=ghN(iuCO z+y5JT$bX+q{*?qoUyhR!1`oKw22k!AkrdId-#?~sUEsdfuG#_?A!!tGa@d}Xh5$U; zsmdr@t1A)Pd_cHe`obGy#j!f)3#ebN2yGW*XYQNPcM|qZkgNsd!^Wb&y_N+7+*~7o8R@|8G3IW4@XIr{LVKaVEntyOX~?r^pEb6)|d}?v;FvcBl>I0d{fRT+_5U zacI7J8nj^YI^mb`(yaNn{n>-o+MrMR@2;H?Kbfv-IjA21T~RmtDkpEVB`lzya9MR& zAl1kWXC+{|SHM1SfK?gsvL6uh?}^PJ<^RiU3nXX=`&gSDdZxJu7JIPB=Nqp#b>P(c zIS_?25Zc}rTFPbb-NY76-fMKhQj%3|IQ4Vagur1ch&=@_GPlgn4$%lMPW`;V0D+D3 zCDsKycav7v8`Qf3=rgFQ%N+XY!1ePmU59)Q&5v%q^O z{y0bn2yT+O;RUG2D;3yb##3fD76E60DeO!i4&<%NonngsVO6dO5^K84W3Tn4^4t+E)jKkNe}2oX=Bxg8)j zxU?^Ba$yT5L``Qf%timHlphP#bBYImXq6`+=|O_B!ZTAjCI)k_Mj!*ohoAoaX3~G; z)(RMJ|MARKNZ;%wBJ`d3UjRnQV9+XmFMj~YhreBgI&&?U8?vN9A~|ZfOzMH=q<1(> z3;ee^m&%6%iGBPD%W>ELgjseLN_sYM*`Zlz_^qAgWvj}I-(7Y0=h6!w*imkf08-Q> zt@cbK3Og$KcS&Qd=o{&mGK(q@ME}sMNeT&tt|aQAb9>SU zJ2grPB8l-CuY|e-i^Y+?BLZ?`K9bx^E(&BFW<)+1Us}UZuR;WSmjSJjeu-yW&iKkE zhqBoqa0??oT}_();jHr@SL2zj^$vpLn`1efsDvLFi<$jx?djp7k>bb52>dn}@R3ce z#<-q6a*O>&(Yj>ie?TQJZ9hPp97wTZnu#VOvaTyyUsC&BjF|8l-gjOn!l_dG$>^Lbv8k&n zrTnbT4u2^qATG&!Bi3bce(~LVHeguvQDb!jMpNy4a*Mg5wh%u+Z^W!#304io{&iNe zm}^nLwt2+V;Ezau@oUG>Holg^b=<=-{Nibpqh-^Nn_Fsp;kTK@zlL*h+a!YkAS6&2 zbvR50MmfTpl24Mnc@-J`T@Tw>HX#*}%iBkam=<&--o)xfd+%o@tmfU`i9!ES^x(v5;!Ds*ZiyUHgf9(YSW~xBg9gQ^ZeKx=8sxX(Ioiq&wF@VzzB+laLorCTK6 z6U?!&pd~H;y4*r;NTCr@)2F;IJeVN0OJ}Gv);^Q+7TlBft^zVI|g$+W1>F=hc#Q&75PH8>HInL0< zx+KLdxIv$FAseUuLYFgyxpOx35|r~c88?^DSmO^+zNbX8?%n;D(M=}w1DGUwLNr@+ zO5?rgJRm(qg<7K3BsANM@ycC>9k*N0yUIUJ_>5@31CT~4fBet}LH5+Wpp*_NygBQq zi|+Td5FpdIve-j({71y5aaiD!qJ^XmfE1zX>dxbMUhec`U+2hF^fCG?>4f{Bs>zm= z{ea9;ogze!Z7~7oMqw&W3GVxIM&4Gt9!85i(!ojHH z+Nt5fBYhNJJ*q}6`f|(5(h6!w9)c)RLqCW57QYEngavh5j8|n2NYy~?^jNVkFZrIOVE~pD51HPUF z0f=wbwTQ=P#EjO0>?Eiv)Jj?E1^k}w`t?BCT2gUWaoIM@F{+A|0BD`z8xc~I&|Sf- zh?8KEh{f+T?R67Ftp?%ui`SwlhMC^Rnsh$E>l0$zy%m=x;6DYm-*_op!T6>J?UwE- zU~s8J>5BwfsA6;aUw~_AYAu?GnJzLd-1>@qim1*Rg7`77N}ao(@VnI1DF-w}42RUp z3nZe2{8haOSZr0?|F8Ec7I>eIC8!)#IiuF5GVmbz1XPUYbi~D0h1cF$-U&H~oD+6_6PuR! zKQIwBAZk`7D4XXEb0gZt1HH+-({~GVMe$b-gMYgVC?@5i4fvIB80f?cE?95yY^oQpzi6jZZl8Adn7{>sFE6i2(6Sv zHN@g(t@zbA^}St@#y=@lyw^KJ9#C%uB}{wXm|KoKeS&6v9X}lE_7tqtUUunS1IZ)KwtKfht0KER4dK3)giUM zlXjBPWxwzr7sDTpj;aGPBOF#o<>IaGeJGKGqPM_hq9lO#FfHle zz6+m}=em#*o~YLd>yS#A2aNkJ`<|HpOy5yCe-RUY8`P2FOD7+3;eI@0Xg%Getk7`T z^0~?opS|tO@WM)bb8#7C?8N@$*fv1Z#|Li4n4NW2{Q^{)yU&4{bLeKTN4vF?OlgJh z-Kk{8u$+CjFIMORKqOrFHC$R`xVno?^9Nl4)fx$R81s!rV}RX0WDLq)OxCOWZovgj z3uHXWss-R0cJDPvS0=)I4c{gBrPj6?<^D8ZmM9?5-DlJ4Ejvri?jAS8eXT(NjfA5?MYz$YxdUqYzcLM6@R0z;kJErXOghpWJFSE9^ zOb%phoN6=!OiAtk2mXTtH)h7~7CStaCKEI#4I#v$w6ZTt?SI$iYC>N17I;p0)1huN zeHhE}s~2aDG_3iB1Sr0-dJh_C0Gf2+Nwk_*f^Ht`0wcwzL1|hGquoSEvjUV__cFf4 zBMrmc)+d?Wd}|kaM6YHBA(F6E*^hA>7>4ON6*v6`02u^Lfw2)v;B4A{!^e26<5EF?yobDixKG?K z5pEHIG}@bt`aIEN-w!s@Yj#A3zzk6oVW%(PsxFx1Xk%G*^(%6iJS0{@KF(FDZRw=4 z&)v8YTneHs-|(*fk;!-$xev53E7>5UVbALq*l!7Wh%6JU&2KU683oEh0jg3Rd;Y&{{x8PfJF2O*3-{fMQUpOn5hM^1 zH7Fn;2nhiqq7+er;zlV_1O$}cYobyjf}t0s1O!B+DoBUWyL6@Z&}%{qA?2=o-?{gk zbH}}VpT8L}7+G)LHRpWh^LuD9IMwu}4@5P;3HVYbG1k=8cDTdvlTN$@dge^P;}Cx> ziU;5M83~lA zu59b1{y&C&BtA1EYV}1b&P6%G9Ku6e@#ymY^#;W_oWeU8i?qTZ7A^M5D^GSz5{qxN zfwB-BbGGwo^UkqG#iYWnuIu<+j`T4&3fL;C}>; zjo9EOJPnGfqT`4ki=yQF?Zg7=Y&MJbD&9s>-T$uW5W|!_N%Ye!npiqGat?P-AjeFl zS8Q>bP`FN-9#iWW+7P0cHip$1dC?oPmox>fw>Tw{D zRYToIgQC%_82iv%8z_2R4^q;(tqHSRwqU9XZ{xoLIq`T5ZQ>f@iS3(TEe17qCxXseun3LIf33cyg>!s8vcbEp;#qleS{803^iCy9y=Vk7pqF<%TN(e>n#H{V z*^*ST+Y>-~;naH9a5q4ta1bj$7A7m zBXv7@QT`w)($Zw#Gzu%ugN7`146iin-^2z@l3emAX^y$A;2F=BbFN*{=)WcRa|7Jy$6H`I-WDJvJnf?K5oXCNB@Bsn zg1IGIH*}?B+4pRMXkpYi3*}6|8dSwOI#a65zeRvnZd9)F0|=9$v6Y8>e3YG2X%Sbh zCj$bU!>Wx1NE+Zc-!-lnS#>Df7TZ0Hzu7@v9yJ(mfz92d^NM`HwfJClVu{8kWLw_- zX&%Wf=;A^1Rer(y)&UYL+3IZD+r{W^WOKwg6biG?@BNLizlxswpt$iY{eIcf-pXNU zWfLqM&cw|bD`EZT!uAC!)9*L6qk&))DN_EPKZ|LyZ08*{QdhUIdqV)_%`0wgiHc_H zR?xwAb(8{}%X#=7hK(mCe^)R)r%Egy$GmIZcW41dy_?#k=i(ujjdX+!5zeGrLd=*v?uG(ftwqqH1c;Hiiao0SpB#}m-m`YZ)o3*I;4 zhXZb#-JuBE@Uz{f2*Zvu;%$>q3oGE#I5kGe*gf6KrZ-yB%gp$u?@%EAWNet3s-*zn zn%p6n!&7Xb9GAP_1$G2QPd@y;I+09iuS-l6*7d*Fbc~Nt2Io(?y+eWWdXRjM3p{hlFyAt@o5`E2xfG+zt#)o|KTI&!`K_xIQSj5kTZ|;` zFc}Z_hVW>di##jM28ccSMRt_1Z)wukg=NLHd$$eeNR?S1P-quoKr-PI>D zcFP(($w*3=OWg?#iP`)wbINLXX}416AQ5(&O#$65>4vK+>OjhLE_-jxF;&-P z(iR_wSClGCQ8Wz2zLzTi$UB~O>V`W}+jc3yu&M|-cCB_*6KE=6(BC#p$b*}B&zp<6 znkp*~84@Yw>sM%K!ogkeKq<^YAfI852JlL~xA04Tsl`mn!|^%q&BI_-u^Jf~YyD)o zWv442>Hc#fT~v4l!sWf-M)pN7BkU|chn{Uny=w?7bXs}klK6hE{MS8#PCV8ohKJb1 zTd2z?0o5daHr4g#12LfnrJK!3pgN-c{UW~L{E_8+S507tyInNAFo$dhKL6W{Z=&re z>VVb%3b*x|?O925X6GHTp^?yA)%%Fek1Y?l&7Qt|!oB(73WuORjwuH1w*dNe`2)%$ zq`_CD146a!tQkMKo* znvJ5hLcoJa40tDv?WdRc=0nALVM@!fMh!mv$mEWhmV$c<7(s}nX|cQOu$ zEp5NjR)pGCEKa?+RC2d;uRI>xH~zjHn9|k!f?c^^U(#!Xds+{mg<~fkFCcu)WN)i|Kn7aoJNZ{#>>jV zsne5tPD0Rw!u zAqr1G9ZuVitY4ZxxUQFum=~HRt=Je0>$v^8IkYyxq4jY_UCIAN>jjCN8sr_e$EyZ>>1ZI7n&=opJTDBq#>m^RP9vr zh@J6MU1W>?L6m>L?24fwUv`db)D6H$l$+|`_`4>~hU<&LiqQdIpo+*3qq9?5w3+$< zu9)urSD3iNQI|1?vY)>n*1RzjS&uHY#<*v`dL}UW}s5 zk1UgTy1PZ^G$}Y4+OH1s+B;GEvwjw1YBOdN1s@>Y`V@RM0Nb*x?xlwZjM`Nf!!=uU ztl0|x1_ep9Lf66x#Xlx1hW>Whm>0}3Gp+u*xReoLFg}^0_ve9aUx8{0(H*XxL=^P- zpp2h&7Pf0O7-WvnmyzzS$JBkGj5XWaSkIWWMJ=;SX7g@ojVBiRVUbV^P*CcSK_TaaNuIs`C3uA{i$LCacwQ_OOe1=lvt9W-ijJq?3UBuagwgS<9BW(v|ca=rj zWt!J9gh!)*LWkfwVvF-Sf$f|%Jdz~5)n0H_1(n(k!aHyK@JJMACE)D0YjY%X%c3T@ z2OHn$PKvGbn0fZYP_U2pVD88G1)sD%Q#zv}rWgZv#MAcp9p~w`^xBkB1c@pz&%nYr zh9w~Wbt*U$*}k7cC!vvn3Vx{v2=leBLj#u2sQ{?IQ$t-mZl-w8=Z82c;N5H2KRI0(JMnuzmzds_w-u^}(0IPv zk>tAtd|0EW`VCm`#iksMm3lUsRN|2ua!ba`Gg95zgP%XJCR(g@NyqA}PnPlw;Ff&` zxvwG)_Ma1Tz`XxOvzPR}E znfIvV@r-G;p4fB3m&_=w4^IfqkS;7YaTo`vHr`RPi`GpfMfwsZ-Vr#Q`oE3^>`3vQ zi81r_PZXHWv-f#~^!D_eKHdj#Hi5mhD6^W5^YzHut@Eml=jgykv zq|Aaio`4^vZVmQz@>~fpA)jIO8qD?rqoNgkfG%dA)kP~s1>Bz){u-J>yn=Tp%})5- zOd%N@?E6QW8M%-a>cp}U@Ab!iR%Uu>^h>a0C2#SL8xfu%`UxtEJ=xQ01y{oyKPkVt zf9=#znZB?%wH#~uPX9$jOnGGK=h&#jroxa#RiZX-YaD{Qsk|Rr==P85zq8DR-qO6y z4`$(S#6y(!!_8n#+Bolh+uyh1{b!>mJ+%HqYoNX$bwY##_n7e2AGOO5oL)}l@?$hL zw3@^#jJ`Nqkl(%e6VT9d;RmX>7UG$+w`r_XPH52xpVCfA63Zl&Zgk)FQ*eP?^HofZ47gHj0{S!I7Y0 zf{iUc4+in^C_ZhSX}Eexaz3~Rikt0?(hwvmWi#$Lh9W=x&GvAG1Ai5AaGqs<3+dhW z!h2eUJ5xlFNouG^oZuGAD~!+L+D-E)pXF&!AoCYdwM{k}3lB4qCJjMiKEVB#ky_Ey z^Se?=KM4>*Rn+ZRP(d--P}fUh+<%{GwY>5ozfsouCzlsZT+VxUCKp<`@?bRHZAU|O zaB6>@cPgRglP-{Rf4&*vfb>iGU13PgTtA4!FY=*t%d@Biv815(q^+$>-MiN~^h=d< z^gsRf*Um6;SyAs3B6B>^=r29i37%<#`Cqy}+H@7Z8A`juIgC-s3)qy_&+o>V1!9hwSl_C_mH|N*316RnDDwh|j84Fba-X8%?`@FgSm!UU7H7 zoMYAHo{{yjY-O*Y-818d?i@);_`>Xe!vG1s$&#`k5@G!g0B0|S$wu`(NR;n}jqe{k ze|IM2k?wi?d67V~ek>v3Nv(h5V2x7@MM35f#`7zjy0iZNyX^Xs&;4Xqh4-5ST2JIp zzL~yuPI3Z3I2Vr>w(N(HRna?8Ux@-~#Tz%FcqI}$IJjP+% zEH~3lh$-3dx>ygXY<{S=Ija|<=^S@Oi9>D%q}nheAUTnZzr%2oHUm%XgJ*Jo3~QmH zV#r&BYT=;GlB?Jo zSww|%tc=}5k_L~_^rx+o2el8Wzx#$3C)3wb-h%yq`rJX0M7^V`++^fc8x-d3HmOp_+Q-N==d68xIp$b`J){%-Ydsmw!!V*E2au3L4wB^###k5}*@C#3omsM9xTU{&!s zHsuD1+6**Di~=<~rQu7YtFY*hw`;jU0VR?$0lwFR>}dd&NxRJX4l=8!?-k5a7Nti% zikqwfl0@+jFT=L<#@Cc6v>`X+N8?Ci>@t04LB z=VkV~kGukXJo|l!#D&*YP?C$Mbd4X0Z()+xkliiKl#TE(yYc4^DUK@iI0pSzPSULo zj@3MVA|m;s{-Wvi7zx#&8_sW=fL#}5lZ(v}gEAiYUh zRPYa&g9oTh^ry9z4Y4doktogHJw9T0;=ohl2tYY3m2wbxFd{wOCfj`&nS_|hwHOhgV@XY*FgBti8@xGFnj zU~pLy=cON`l(~un+a<_NX0?|2t-HsYC9+8CPof*)sik5F<-y$lqeqrlRx&^v*K2h? zr=H@>)@Te8t~qjF$)#IsRDdgZcV^aLpzx^tO>}=@e4{f8Ffdgem&=>g7BG#`gr5@2 zlfj-|6nHlDGmO}uE=)?FBn}^4u{nLT23wb!J}gKtQaJL~WLo$mJI_YL>FX)bO9Ac* z%fX!b*(DWT&qz+r_bJPV#i|RYh(H^JZe)Zrv7wpMt=n5RXI5R@MP|(Y?BAQYvZ4$uNBasuS<3{c!EG_CkS7n zaAb7oIhyHGKDag(uSV_TQWw|Tcp$qCng48MhYFkmtkg1_7QOFT-b4Xlx@Li;O2w7t z#02NXNI=f)PZyw@?6(xxin!QbVx+*(j^r141U)@OYn)PWj`TX0(+Zyms<|owB^H=L zp5|q-@&39ka8xGP%NZkW`1H7zL4%*6_1)yrp#2}G<6TW8Ff;u5UyN^-Bv6I!CsDK! zuhCipKFi4E)mgEs9r$w07akoLe4eW?)m&84S5WzbT!Voysb04-hsH*aIw=zSyHm2- z;S4IR4Os=dM-*zkn)f+@96qOE93%vebPhlT#STP3Iy~{bj`e*oy9UdZ9+lKA_5QsX z?W7ygy56|!Gl!ixQl?kk3xLqEmFWAZJJxL~B(-PjV%L!;4sKG|=;RR*&)DUhJhksu|lp9*b(yO50P z#TpjaqXEl0OGaPzg85yUl(O&zZ@xYr8h zTR|lzK`wmhRgtGBj-^F=_59_jT1tfL0QgIX+5tO{{&s1&G1>Ay9*~QFkJ_7T?%tbf zF-z67lVd_4EZ97A=kI9vbc^G--o{X}I8Z8{9ZHF*I6LF1kgL#!*Z!x%-#+MAnw!A{ z0ThV9jB;LT>}A}d5`ck7claL|h#$ZWiQP&G6%pH&P#6B+7!WD%%w&Y(z~gN_up94E zD~2#Cg-td`+rEu62~rLM!uYKh)pfYgY)E)zUqpK8pCj--+vw9)K8q$avYco zy!`K09~P#kR>82ljMz|3wg6{vfOA9{ijB>sud^0pH_#K5QM+ECIf>RcaDG&26|3&2~kl|FjnO^vRs_Sr+J&dPYUe?F(DBR z0>`q#)E*}K&1jYH*vg{;RLDaENpIq?vlWl%%3O@?diVq`)1Ta|kQ z1s3cKftNGd*Sp=Lt3g)Jk3UU*_A=^<&qOPGp5!H@`#mM!V2XQGy7N5j9=&%MbQ}%+ zf_LHv-p~(3q6QXTs<=PuYlrGV#mC(!X>=i?dnMS*LXvBvz{1WXa50uHhQ_vuxtd^p zl=Q>4 zsWQ7dX@_!E()Xfp%B?=ZgVWN=lr>2cgj=sD0Qr#BG2xyO+wH_DjWs{pT~u=EKb}FS zUGBNzP!Ar}CfjX-4ru7TjYGrYZyjL90K$J&zx%0}+MPE*_|MVj1`V&@iEF<#=Y3qK z@lee?FNZi))WTbzC+_msWwCm_74y3L{48o`c(wJfA@=rt9K5GSl--=%aNF_$Rfh$C zdu;f0tHSeWrmrwne9^r4Hm;uPfriNSQD4i$MA_uiQS<=G7{#*4Az_kDe6N>_V ztjJcfUpx&~Ni1bNVuZ7Jze^?OJM>2cb&kdTpm<)mubi-z8HE`x3O-+`Tnvg+79Pqw@e zW>Kj~mpXIZ0m<2HY)`f_P0eZsvq@Wi=8WKq50996CNQ_g-0|;Y3hUW|()y|(V5p0@ z2^!>yQ!A>MS>jonDQ~}$6ka;=A}Pdg>k`CQ%W*40?2a0ihYl=53==MhyqC;UBZcsYh<2f3=hCVok=M6dGhx$3ApnSnb(yFjAd z0brD_S(eG$X&hx!`OUMM5gf+m7O)?=$LFJkG$r{>zhN_?ll~StU7$=f-T8d(=hoV( z2g&>{!VC^GZ}knD_5RX}B!@qvm6b*W^Kqjjz?X4-h^P-9Tjh`piBuH|5&x0?#3~2f zr>mUgXAeZ?NKLBqs0xRFSKEEku%H_u80gPxTY?(p7>wsrFgJ~Sg@Y|@c0la+YJ}{?^ zFa8Su4sTHnser}{$B;yM>R27~esh7d<&jnQ*m3>YC03|-c+2_nj_1DTK&QoXxO%osu%#A~i{}>p; z-mJW8y2K1|U+R!31Xb+c37L&<2iQjulMlfo9MT8-TGuzq_E;4&pV{#&%>(g+OTeD3 ztyd4A)h{kF6WjndXV$hO?BR}XN}w<;7&*B-R0;%<_f7h3PPp$2O_5ucm@f7KN($5T z95@!?>NRYE=}X6mj9U3Lo>UA6wETh!KE16F$huy284y|Z;Lr9?gv-#)`m59fhvYZl z#b^|j$);VME3DZYEzO8aeYrndzUU)9)e(D6q}TO4Vi`+$abNg-x@wdEk@#g?jLqm# z!+etp*ODI9L-}fEpo4<+L)G&)&~@l3^wn3Yt>35v*PB~y+}ZG{nAoWymp1BU@|+WF zRxy{_b}C98R7KF?iQJEpK3FRqbIf20fx$SRg^w9b1Dlk?&Wo?~d)a6Y+!w|@JO;Ua zdAE+y4c}B&BDIMbGa!hBgUEwiVk7nMsyDbBMCpl=?Wt)Eq3tO=sQtZZ1O6rYpB82+!=Hkkuu0J$ zvs-@augu^|z~3@TI&3&s+dC_jwe~iJp1!HLMpz6-|9WLQ;OqzZbTpa9R1LrwEu9)7 zHyLP|yYw0{Q!m`^R`CJX7jtCm*K#dgI3!A2I$>uD_+G3o0a}G4@p=Uzx(|?d`&+!0 zL%P5_40rgA`!MgNbMAKwCI@cX0id^1^$s4#_MvCBqEwXu>Tz7Zq$c%GJe9!WM^FrS z4S64~+$t*F4N)bA_B~LX7@XCDA7dCh)%@Je>gQR;$6ggaaBDksp#F^X1di`{ho8R< z94!9cj09F1Ru}o*b1*t+SSQuy&%r?6a?+_4!@8kFYPAby2%xj#Ul=RU%%nKF&L) zv(?O@a;py-cpgHswsHz$*wbfNd_htTnd^BDi`pTVBabMMTCvVUrRR6W1vn1n+Nli^YewFR+v$fF)%B1TS zLK3L@R|W@Jw1%*?iTTiJopaMjhNQ`D{!29KBEkt@!};eZwR_%2l)78|Zev=MMt^=N zP0Z3)^(BUxjqBd)V=RqK$cgvM*a7o&$_=BFj?QFw=vW}sD(Ggj0 znKuuo4Po?z)g%{TSrRRJ!pb>mMiZ6_8bnb|9YE5CYI#?oY)I^O?UBJEuy3jLi6D#h*~B7!GEl=HpngMC%>z7zyK$iu?&-=xM zl{Sm^$VP7NeE}yH?3_e+0?ve*LAI)$@3jFN1EQYrhTqT6K;m}b1A$|`dzNZpD8SLQ z-okwkd$ButXP_YN$h^8vM+40RW64gnLu7ZfUQzGxdd3r5&-U}lW#iey4U%@W#I{+lTQYF)vj5xa4 z+j|g5T|V(+sX6g8LJnnX>@8F9RL=?(s@flgAHAunQ~QNf5@23Tr}kmy2BPSjU4*SAPM%PwX-9}fO_aWdO?f)D?9Ep zTSurPIe%&gTVT9(vyv>9dfP!;zlzY(pf*$NT*3Ubw2e5bn#7Ge%bDCh#Ev}~1 zF`R32&~1>)Hb*csPJLY^V22~P?Fxx>KY|+wg7!>+_%O37*RPxQdt(HGbm++Evg>Bv zqcbmTlv_`Kw6)<;+0ip5Uqo=fz@4A&y`YXI`v>~N%D}ofXl%w@y*|1{mhjXnpa2yo z)~kKllXbtl+;A)+1qVrSe-tBDF>)}1`zu;Fd^SpqZJ$|RRisb`R=P&t7f#CD*_tld z{osdvtgHn4%aNb3R5%k)tRu5*PeX&Ur*&V@fT#cSdjzg;M0EJ_gCbYWWgg|mp%gJw zbOE?egjueXrfK?JK)5W`M;-*;=mHZW!uhN|9t7@P#kwv%Zi(Xe0q%3syj&;sxarE~ z?aq_!&u)CtdAN0@T8@zi$S3~iPM1y&MBjcjx^1IJ+qz1M!r+h-m7Dp zJ8A(XQC*$Ca$}c2S<^W)3>T2aUyw9{{y#teyiMTw!vhTD)?A9@x|>feD=v;Ooh;#~ zT2UvjSDUxqtI5FK1z5LFdWPUtrCSdD15*Nb=!ct5*wcTxqzwZ+bziKCwT!r{xQn@L z;+SZxWh(KFz=gO?ape4z-)4>5d}~@;d8^BumTgPtWLtg#hy<+7c8X4!ryL-|N9vW7 z1X=}aO5D1zcdLT;fg*5W>8Eb}e868{noEHyfUohooLM{tuf3Bu8!X&~N36W$jn_D-D+6f90;rJNv3pMF85 z657)CEcDORs`TzQjxv}%I(s7c1Y$l`-$;4h$lYQl+FM6^)VI*GcB1=;^xD`I-E+*) z!6XfBlj8AbphcSY+Ic@+S9pGh_Ly=#kz506=}8~n^&RNsb!0CEr7^J-qqju@Dv6Wr zLM@w-q+baC=a6kSTw7$V6W`7sh`b}vmBdeC7lAXdP7s=JpQ6^=ol@nC+RFjiE!C3T z-Uj(YIu#9e=XE4fWL0J1^t}-I=$pPM?~cK_+_dB&42ai*!+)^IAYQ#PL|tKJP4BX7S(}insp$ zl$<7)>2LQh%(at1-aTWBhf(yYUJCx=xfVZ=#`~sasadV@yC9n)i*dNch-ha~yL0>N z_TJX5kfs=L1_W|E@P%iaFG9X1rChd61h8AI4;yMYX~N;yj{p=y_Jk`1-Z9*r$xKiT zFcxrH8QF|9ZA-gq>Z#?@7Iuzn5CF&@ThiPKMU_u$dp(C*ZTJWa{_xxH$0tv@UH_Z94i+g5$bG3&Gt-uhDM4b#eC_-OET>8ftrpBH`T21=ygE zcd`h7;E&_)aRsP+F!R)N`@*5fJ?xWbI_k4?W6rqc*k(v{bw5&Sk?6+HWii$H5Rv{2 zDtgy%*ajD%F$cSMIDTtX9hB4I@e$!1>zdgAtlNO_Z0b6+W4VaP05TYT-IU*FFtVpW zKU5uD7gM}Szfailg2Ko#5d)$i4oA8x&>xlTkmGa@S|ARAbEdVT_-FhlZKwK;^Yh$p7KDYYNLN_XGW~%|D=ZDl`s9NVkhItBa4+aZGD)MG8b;wcGz?-g5`{h|BaI7t)Zi>=q79LjXBxW zjP&L8Gl0FH`zouUt~aY1s~h*>kaMV9{*u2r>zy4Ip|bb%Fup1nB3|BiARVx*^J}?{ z$XYhN1`I!dm>+BGRc{$YR*8zox9-@<`kEvUjWqn%3=7vFMTx2@`IzN|T+5e8TxsEE~ zkO?>0g#hDjmOIPZA^vyOOGPNOW@>rW#azSDty$s(x`lJN*Irf$h4HfKMD zQa>kVUvdrd zUlIY|SYe5!#bT~<;2sAgxwk(#U~go7$(jg~M#u+nMRTnHv8lnHIWFITB)IDr{jWi| z)k2=Is(Dy?Gb7!S>Qmi1bWtJ0nby?=fl@!M^H@5_Flj#+i?etz}^Wm5trH*xPWAl)v80%Di>*{L+{LL?$1x zlz(u@Yo-*Cid43h2EFG8MdhTVi-#re6oNjD>N7al{UwiQ3HRJU9mk7O3qOz)3B-Z7 zuMMq`j=CYQGf=8OWcK=Ra{F*AyPf7f7<0l0I6}(F?!wk;p;P>MO?@`hctkX2isGXz zgkP?hT7Y?yuMM=Tfbv^>eG3Ank;?Olhzr}Ity4*g+GW5%@h6lAL3Qp_q-uxp5M$i{ z=!HV9TLX3<^i6$1x&ui&fnQ!k8}>%icc?Dg8k$#ex%I(`V*j zMpr+SrdD?4GErR$=zyI*%_KgP+Us|`exBvL@88i#j!s#fggDN=La*#H?Q{VbZ4Zgr zx3<3ivZAlO4!i5Ow^du6a8LOL067b?e!`yy12Q zfq{#C^UILpU~Hn**B3IYUUynvx3skgv|MQG?Si(6w(3bHi*kqdh)aoJlHIu$J(a|; zm7>dW8Ta8mu2wIw0R3V^mc1oyht6R~7KfV^uT165#}Gr5P|*yaKO-E{ z8yaGvWPi`sbDK;Anr2kY&G(IiPIINlrCMA9-hUSy2|a8RiztC7w;TDT7r$FuLTF0R zvRi4lWBBc;5L&Xg=Z~;#l|*z9*k|mw(?(>ldB21XY~?)?p8s1DE|<`|03%?!0P=t>zST_X> z&(4FlPA@cM?_~#!T05!L5gP6hL*k`3|5?y6SHETMh^ZEq<$48s9?k1O8jCzwDE8vA zos~0keeO0WBk5Y=GQ9(L4(i0s#LQuNrMXcT=G!Li2Bv_!;}`pNTGixkK?|pP#g?Ru zH}Kt92oK?!0;1M2NhYL|_dS;JqMs&Q8lGvXJPThB|KZvFjM)s?8qM4-7Ond#3}Lkw ze7bz}vjkVSu0fic3;Bjp>qt~Tu<|8VCNNMFR{t@NplDa;L3mj!YE0t!)Z>p7>MMBS z0kLwHum9+OirRh`(T9sn$7zlEF7zu*3M?l~x2IdBpL&L^U76Z3-oZ8MA;#h1=I~6K zEn7zy_e1uv18ql8Y>m2U1!2k7IW{9D;Rhp(UT+;wl<*zBrqGQ0`8Pd88KrwfL~~~3S|fQO&&c<{KZxxoH>p% z{j36=(ZpX0*l8eVa=H30!ly=Bc;I`*X<90To;MXhuTUmdExh|cIxb7vT@f-fPKcC8 zGNF`4!@UP#!Y#p5ZlhFSQrq*iaI@q>hN`d%6SmsHzH zCvO3xTK9h$|A)N3<<=$#y^$&dPFs-0Ww@6iu9flH`im?#@YF zk9#UL@6wUbd&)Bb)q6ka_don)@+`a}y!@SL!erz*G4eu^ld4gLtF_!GIes+o;oE5z zwtN>6tQe5P^7=%>4#a$#r*-i2;E(stRh(Fz|5VMVNDSI18i{t2c{GEO#&tPnwsN63 z&u*6s%9;w&mct9*QcX=C_(EW~S}I2aI=_^$8Lcu*3D_Y> za_Og7aRvjV-~=?g#ueVvw@T#tyR~VV^0n#7$BkwskIxLn5s#axw@5FC^p0LbtAi03 zbI5}&9mahuYO`cOcRgtk<@R;#w@v}YUn!}i0s;o6K21mAH)ud9(c9w9eRuAt=B&zG zN=$Yv&{fuC0Z@xjvq;m>Ho+!Gcjzf zJXb`Jxykt6XjCPvgr13fvftn|OqJ&LfxL@E_!!$-m9Ci>Vqkff)@I|oJl=?lE0)aft%;5S?a$XqM*8Aen3M~7qUG6{MHLw%S)@m z4zOz<>rXaAyVF`OERB65S$ws!wKU%jC$tu|U$9xsveArK6iQVe0E!&4to*1?m<{Jq zf%9?o=8LBbP+Z^0J6QFrtm|uf&8vnsDL3~Wbb3^NokP;XLPSroNFQ9-H?=XqrU)Hw zR5^|1c(e+8m84(~N(;-2AUa+NMJ61Z+YhRncDpwZ2rCnpfM2A{>((FN8;wW_95r?d zA2M@RexcU&X>`Q3f$xRk*ShqjcMjN7+{%^B7Pi?kY~U0+FxKs-481C>DTQ@3hjMqk z0(vmBKhn`U1REP7z*w39ZCTZ;^;ER?Rn)did!$-ZKi!@BqjB&*3g+YR%5M>`MJKpF zdOay)mVX$}UC)uuGfyq-D=UGJ96f(|Xl-ZzcQ8wISEvlDH zu{TP$!_q&^scNYCxbDb-_J{(pLmEJ_5~8Y62l`l8z16CS3|{4K;7u?Rx@ zKR8c0&BLg-to6>ny=(K3{m%7^F=xXCzXZobWmv)P0dXCpT-93;o`z}v4RI$x z(f*|-=ENPz2KFz4DK+2izqkxI4&K+JXCo7iXu>tqg>wQ9%XDJrqSO_MlJ5+=@31ZB zPW;5OFPvIN{5+BbB?LT4DuCY@ek(RLh_!r3?%m5!i43D7jh#t>D5-T$o`(6t6vCw_ zkl|FBip$XD_Vkg-$uc!8W%yCsw{b9017G8vLHHZ(~RKuo}z77c@jb!3(gcd=kNK zTo(OZudWIzpB1Y9#2fAU-sVj09#D?;F|qdid*34h>~{cY7`{eG3EkJjkIEf;`#yae z(J&0?7#i6)lyA(cpiQ!Dnce{WN9Wz{>{Q=x(+b_q>6;%>+@DnG3>3tmOyW{rEO_O zaQaD?qGqkuK4Hz1>R^m6mxmOI%+qMd^%k`svT8UW_th=dZ6Ou-WIrH*{jig9*^V8X z!bspcA&{+mt(x4eu3{2OWcNZF+r(2d9?UmyT{WG}O!Y8RK3f0x`?hN#R^_8nEq`5~ z{AiOp;(4ZF(#p@{PQv4`OG-cYb>AP)g-nkDYMbxb9ocpdXgiwv?fF8cUr70uU)4}Gf2|; z6aKroX2KIbizyCWy=a%Eeizzl8pJs41k5mQX7I#%rdOMh-ldaN*V~c8doD}+%9I-5 zc8&N?{t2;Nl)Gy9BRyENHN6b!rl_piX6| zgxra!RL*349@r5vW5y56HQwf>Bvl`Jikj*kZKE2eNSP2FyyhZd`6)!hqR;dkTy+VX zon+hZKh@iLBH~1qDj=f4^A)BVX%OnRM<#G?AKUFNo5#fBNJcZe|IFTg+QVzh?W1us zBp*nO?1N4UZb82Z{u1~m_(^a`U^+;a{a$C@MnUbSdNXxrovGx{mKNo=uY4Az#8d`C}8&Vw@+o zq`7JO=uF09Z^XtIF8@y~#$R*q(@+bK`mL*@bw3TNAMg*8{g1W!)jn`~lSwr5_y6@s zb^KpC?vqE}cv`7go^KRXH}>Q|5Z26kzXNZmv23$+x74%jEoltz!>UQc&8jtLB?4!h zeh;TNzUB}7vfqHo?9ojVXj<3%;TD_mu0BG|Y=k_$^xV6rEP5`o6~DvvX~ha7L=R-4 zKOb(&78}gU5w4B=n9_#X4)5c4`7#_3Je`t);hHDBU*ZvLdMzbcslk>tSLd!tI0%;Z zPoJ=?{`-2gZZ)uiYS|0smaRgj+)w*p$UgVg4z3rK;S3BswicjscU&JGX*J~U;=1N8 zrgewynY#fvkn#+Z^O=5i{Q?|_@GA*~sx;wBY2pZ4_KxS%mo}7F{-V~)h}~`St!4b7 z!mw#xBck3hp2#`5%=g7Qz#$fi5+ad59)CChFqSJ^wp<2lm|{B?soBBU@WLmJrRM^H zZk(GalfCY&DcD+3qmeS!pB4tp_lwWCkT!uOqIKgjQoG`G&47)|;}bpQx)9}TVX|;* zwioRCT}rs(|3%oDheO%_egA5svQ^5GWfB<*V=H8tq#9C2=}NLCN|J1a8O&5-5{)$~ z%OqP`=#uP=eQX(9DKvu_`!b8c%$Vgl=XXEL@%(XL_y3L~$IPN+~rSkH$heH=l0?vhWoQPwJ$f3`wK*w9U#Ky%HVB<$z z?#nwwdMvK`E3DRFpAhI_zZ+Mn`q%u@K5t%{0O*v@*%ULhVI{NJ@zw*tqz`Hys(2x= zZn<*(PY_Ryu{3xq%31KYv-=O_IOW}vGce`gGe#LkgWWc@3f!C5(sM86sxtrpDks!* zeeDx@NUiBmk9KQG!cy*Si*u6Sz}Z2kjg~?l=pRxKiC6z@!W%ST7Qn;GgNF}Ezd2S` zUp}v-{>?b0%y>!^2Z<5f0R_dX6Ve(rmTlwwOeE=}Du`sK(UG^OP2QcE_nf=c8OZK; ziq?cxTYU=eoVE1r>tDAKuKAfwKD8li1tb&lm!%OGPog>_qTl9GG8;AdojPm4y)^h) zlnILwddIxTn~UP}M5QA$a-y-);;gzn*N$c;_buL(>ZGaigGTKPs2kGl&Mza`fn^fv zPmJCBI+Omij+2Pk3TShpBrfV4OhxNWj=l;jzq{10VPu{-56ztl8WDSO38+c{xgtm< zxc2j-U+NlDY)Ez%fDtp2a)}Sjdvr{n=D8DM$*ff<#c`BuEv_;=gQvpKow=k#b#?PQ z&6Ij39N=>Y|4`>tpP-q**rz~PKCvw7aU1#!xYUCm0Mp~+4eyj1^2vJW+S|$}ghj#! zuCL%3*XnPoeMCIuqD|kctMY$hd(j{SH6e1oaS*i5QMGwRaqoU8 zaCppO{JHe2dlZ;rxdNSjlFt{I{WdZ$1ep^=jvbP3B3hx|W-vX$4;RZqo5bf+ zE_WWG#eOTlP|ClXa1C8_`q4@oy+?mhv8GPp`Reye=C$RaQZqGe3D&OHnMIM*-?UmV z1lfEiJ0h{mR`gE0*^leAH!qJ#j%i}_X3KYOm9JZ0dNsS$zj7FFz2m-5{1aSd(_>rQ zH}Poc=$W9wf^803JYGuYRc8$LH{;`yaD_CGf%#t60NjUXo-lC(+d^%_bx0`>n^Z zRwLjP(IVwUpylGHuQPH!RE-ipMzQCeJHiw}LaP!@Zk_#LTTXr%^Pw8@p5X3E&)&cb zMVN*6{9D$~YFlJ9nRL|>rJSPBQKE=uoT-LyGEtihJ1GIWN#aw5)GaOh8o=>H9Pf*u z?U9@?so;flnkX#(8_m@u_T-d#c`oA(HSvS+q;vJ3=5u-yqIKi?*6$5@~PVo9vGX&yi+g#K?r0hd{;aS zshxXwTX}z+!v2>@&SKxI>Zf%Byq-kKg4YN_Q6*GHQu##6$%@_u;+36EIaoD?$fEG( z9E-Op`utqf-lGej3TYc$fOvkCh*`TXry zFlF&f_b``5$n_>C^oM0$nQH43)b$$$QvG(wdjlz`A1PgPZ~ROBB=T~f1eK~t20**N zMGi>YvwoDJzO5zs9ISc%)zM{6!s~?3wpJ zX=63_n_ZQo=UZQOCDVL6ZYotfh$sV9Rr)a29pK3VV4(^QJDHt47;`9N`j{l|I zR-&8WOuD=#xdL=+ptaX?-d7KKQ8=H1NHqr5+1s`i=)N*)R$so-Sb_=e<|$%X9)ENi zhe(Zp;|DMZ@sbUnKpQa`xb@$LpZ|wEDH7ZC{GZ8yhlzI+gTi+I{-^Ji+&0rzm#}v` z0e3`e&Of?hm8Rw@5z8b^a4GY@)!9=xruaDV)IpS-MuVh@@a3qnnreh&c)3*eiRn<`&^h{HC~qK=;W+v_O6NWTC@aj3ljZe}(AD%(f7X-d zuXJCGOb;g!ucO%hia-B{?YQN+8+~d}ocCcd8{P&@aqK4D`-Y8Vf|gj7o%-wgf~-XF z_o&H)ix3Z?6qN|H_AP5&ifZfskf^}&-nn1%vpvUP!sv^k?FY}P=lOy(#^rFt0V$h9 z3UzfiBm;ldN~lYSh3+>ym(->Pkw1@Wao@Gr8mldCXQC~NVBNlio>+L2XTJ1g(?={` z{`H#So5Z?O93!qJGPjlB6Or2hZ{RubV{2wUdNWss&XTA1KKEF!{eV6ljV_d2&VxXv zYZH39o|*!cErQRqk@mC9)Z69btnf+C@d8GqyA!<`PPcDh9CoveU0X|cFkNVMZQ73p z7=|7gXTF%b5e=~V3=0?rd6jzPkB>$0j07&d=k$Dg)0)MRuI}}5hDe^-pmZd5d{)50*$vm??kwb(pWuCG}} z8pmJq9pgbx>X*njmjwE@7~;Q7Bwa|KY)Ph=#$NjK;YQBh@m8S z+^iXG(c@o?++QsA+=2bv=*U+nx#_do8<8%dGc_B1KS|7gEY=Mq6<%zDe>A4mA}xnqq&YyEd$sUJx67%D36|PQ?D1_Ymsl| z(K39Te?j?Td@;7P?IkS=F&o_-3LkHi2Q#?(cnZ4-Z#oc8^ch;s+!#DUq|doTacb0Q zREpk<9`oR|(z9*^bW1|*T|7J9`xsYVwbgg9;C?jJPS-IIpkg6Ur zaP>W*g9ry+z5T18;n_c1JJ51z9w!;MRiI#mj12Js0X=HB@CYK{0cY>#yii7RIWz!q+*1s~wPkuBw8`$jq8QY%5fHq@*Ar`X zYcLNI@P$z~a-5hqth*)^Mj`@`_;AA>t^YQ^bb|uBanJtxKX0t#|B+~?8~a7b7MoxZ zD?@%fFWeUCS2*T{Q5iL%Sb73P`Eu3|)G-^&bQKgA+5RjO$+DQq ziIPK-346-`&g;p?D_>aSJ(ymm1;T{PvTe zp`42{;F4DLJ)^;7aL(rCWMs{7VHpVZG~ZVVuuees>kI}Kg7y*X+|uR;DU7ZmJlGTCe#^&H;UooI7BIBr6ol&;+X#7QpS zhTv60C$+q6dNS{83D_&sDw2!}J-WpGpl8aIe%AQvPfP-iF&4;MUp5I@*OSngO-tBl z5y5Ed%i+WsG?2k5yZ)QKXg8kjJ$VJ zai+waX_pBCRa8Tg4Jq&;P31>P0xu50*1Cx=nXUNpA8H|M=F21IlT$?=%)Q`;*M~Oi z(>$Ws&01@{E!!BwWN9@1C5}t+y2JTOCy!jR`q$Ny5_Idaj=1+`A8!SYGtJ`+^z}m! z*vG_8$3etxpVO;~)%#XRO8Id`nKI1f?$4E@ANcD5SIO&b$5iPr6daaI8PWDs^H+)G zh$IkxcC5K|PGOs;WIXd+gICRtVcc2uQ!55@K#YyL*PG*WyE&(xciZQs9#Y%tcO7yc z0SGsCr#N@vVg9vbx<*x}*m?u+@W_PB;)IpEoxjNm)H}2dwXCrujr(>E5}g6o;c~$j z#^>e>N|7c~JJ5bl{Mo5h8ztbzWZz(}pyzA#AS+69yg^1rsM~sk9WzoPENlX)mO2Kt zWRjZ)B9W73{Nbqiwiw8HRn!J&C#*sF^8J=S@@XCx#t(SLa#I0vE#~*!nlGT5F>Vcu z1o9mHbhR!16*s{K?dVYHSbEI#n5S9pH${f!M{_Gp3S1q3mCh#WurVWrO)}DY)n}}J zrzpD(2VZ2=6E@$3S@l58vqG;R2Va*p6RU>2gcC6`m4PpdqqWQxfEOK;6iS3z+Twl{ zr@;p&OjgezAI1IjRAd@L{*I%4T2z19ssU@;l&)jGq_|@MS|Y#XER zM^%~MG#EPXuI(w%_Pw}l!f3Hi@@MZU&LmQKu7Xh?Xc-ua=rUP$R-NoJC+_??wH?#> z&|n&jcVQ=$9>4vsag?TWNx*T`>+U@`a?q5})aKY80oIY<|1=W2a7gTQ26TPnbJoHt5DQ}}f zidCDpkiVGp7pGtL4AcT9yzxe2h1C9j$t8+Noz3xe_EGDNMXDs9d##6W&n%^q-@f6( zgW_)KMGzQTHj^n%J`1FtTMJJ{PH&A`TmH3bybP^Xif+5yGIwP`Tpf`=JQg}wLp)uA z2^kbi^#y89QzUldCcz;OWXN6KdExOU611-ce;3caMCK3syHCi-TO2Y)ItUNkdy*G~ zHz{Hm^>vChNum!E=I-dnXq&b4RZDr2u|J(LZPqC^W#UunoVCf80{fcW7aLP&ibxz4 zk8wt`*KD|Q>y*ZeC~nBp{Mc^!TvOdCCv+;V&Q$Nr$R@|04!0cNWD`%ICOxxaBv6bq zR+F5Pqu;_UQNf>(NrALIJhy1eVRLDY>G>a@AyqickWP}Tz z|AwIhrwoA56T>cF5&FNsS$*@%f>g33yk&2zlcenwVirrK*%VSa&g;oz(4Vf&NA=Bloz_^)?A_JB?FIUeMB zeWyzb6{6bZRmZ!u%Yn0>Mq`xY)TZtQ)v1}^G|>e212jl-ee{*@vSe;FR1F(Mi;aZz zTJqbk>?kYjjF=lUKmmxc3|=d0P(3qfemp<0q14XkH~GD9X+dTn>)M;Vf~C30h?iv{ zgSk&zbH5%gXR6lJwFR$vp@{OiUkcMb+1OtCLBuBs-pexO?XJX#U;<449Z>Jv=>BXr z$9x|&V)tTeLslYr-$QiKMI75*Zn^lR?rolAS=xMYw1c~R%hoW~ugF_1CrmXz8#>`` ze7nX=bx^gGLHVkA&>{{HtDh!Wp_nfBIPnmCZc#f_L8qF$KU|&Yq zKgoUDzZN7#ZL&x;)RYZotTS~#49#p7Z{&u3(3wx(K!vs)o^Qy+J($PEPVa-PG0cq% z1Ph0Ac+@fvls~#lIe%xadPt^F#7< z;(1A@#0zQXj_+ih`>gPFA4y$9^|?VGO`&n$3YHs^D~Tvq#uwY+D%c?gOoKbzoSd@_ z+jJQPtq`lrs>&9G<|BOt&AMwTaLK5t15&WRiXK3!(#4!@EM4V{;pM-W-sCyb8;+tO2r}IpKM2^R3ML?&FM#6V$T4;Gni(FnQu#Zi6?> zlz*lrpJ1~%UX^tNLZ%m5SZKk}(|V)=UaA~uFd|8Ax945X@tF?vFj||AxkSb_b*-MR z-T~WaOM$@=ai1f!LYS@*S_q9?y4rjiF3Rmer~$<{VyOr2kc?_9esA9evh=`Ml0OjSYULKqkYWJX|{a|$FA8}TWWm@ zRbqFI6zW89a!}txzr@BfFVU*^Lp5ZG&BU*)(&6?xDlV!(4ZQ4GZ|dWuYUP;QZmm5Q z%A~tC0<^CM`49~V=RdS>v{@vNK%z>#m3tkYHaU?dfjTh^lkZ^Z^>_}Pn#mq;_8Qy{ zn-7T}!4zY=FIdLZ`7+w=R4m|A8oftQ#7L-vCT_UZ$m+7DK(ptf$Aau`h&G%{SA2bo zXa9$3_0aKW#Wa}a$C1Zp+Am!CSAOAz{Nn@Ot)8Ks1pPLJ_V*)7OyGL*<>ndS+i!s> z@U~^?aS()vnVf3LBGPx*P?7J2v?7zOQ%)R`c9Ml=DD9Hc3=aBIK&JSD{+sQx*=22${kX@=K5 z`b@XuZH8&)qHbu9IYeatEm***C#@ZeZlHd~&dc!QVvMyWowkvWB;!Jc#n($Gjz*={ zCkToyH3UB6vAODFjh|wtti~p}timR=m03&dJ)^$lzz#))x_9A0^TC<-Z4N@6sv4z- zIuA+@z!i36Q3vozjk{$b$XPSv?NEfBuNxR1RXu!>4do9(zcEAhSDKd6KQ~~i{CYAm z#!Q93>On!)cf^?@S|=PoXs-Q|9g=AIzcnp8ar=77sQq<6`B{$c7kP%XdnTx+9Rnp<3v zhb7_fA+T!S;Bi@T5DFlfat0g)F^Z^v-2-NbZ(Z)>l6Df3XU)X!is{7VDU}$J z+CDevvJ~?ZDW96Z0 z<-p@zh3hm9K_XWcXY5oe7DVOhALFl_ z*v*hW3kiiQSn4<07xRxa`qC`meNgJaV$uV^_rAL9Ki~N?vVLt@%L4A&SZg1HA67$X zx6(wi6OM$(>4nLKA@B=RfGuHSKV6o#db*ab|L`39Ohgn=SZ*>Z$_)yEHJYdS53RK& zl`f{E45C%{SJyGD8{%k8RFpH1LqwzOSDUuUBrcsuvf5Ecx2d%A*Kur&qRhQ?81FnH zjqn4`mCz+yB6kYoU7r^6sHJ3KD6ECPVrKdQr_UI-6z|F79kW*) zEY@SLnEQ-7OyF3XxR*Im(w-HAIS8gO_hclKAQ3osR`ye8W8!{ z`iVpKe#xdjBTDaMXIF_ss z337w#g=6S!TiJ!R3pwv%9#n@fwRi3BO+{rylJ(MOJ8zv#5?_vMJ)gbwij`gYcD&R3 zqJAhc_`D;_ z&h8nzp%zoR(%*X}HcwJblqrWaeKr2{c&wKXh}su4v;0eIZnLt;ycs`c3VN{FGy0o} zpH~^g2s*bqOkM$kpZP#UqIeB0>X_*<0a`DeQcMJ_EM}%WKklE6ly8w!V7FSeH8?3K z8P@&Qo;?;!P=Nt^(WfK%_K=1LEFjTT`%Rn}EzA*kaARk_F|U-Vew`EO@F=(B`1Uz5 zeh_&C=E*~9=7W{@Xxc`>5`FGGuMxE8L;;VU!JIab5>9QL?4NbUOFaJXakmo=+pm4S zYQ$WJJuvJS2~+}R_u0&e${;R<>9yyz(hufeO>~pIU~plhqb#-stmdvoy4kwPE3jT+ zdq4B(4V_GBmKFl?6!jI6JS8Q^Zj~W}f%50!-`R_nM`NzXc=dyRwFakMJmF_folv#t z(vG`nnD`%SN*~sM;pn3+l?rDW{cmGR)kiA%M%IEzm{K4Treys3J+h%KvY@{i-~Yw2 zwq&=bL`oNwYj{R5fcx^!gWq2B6-ZAUchCQteU5vvPqnt>Lam9!*+sMHQhX@oOkjK?->_zr@nU!KRuKIhz;8K z$PPibdnv`2b@!^u+cNz#eo9OY7(bzL^lJ?PKz~V7maKl8&z8I3oE4UwoqgcIo0e58 zgpWnMK!RW+cR1wf-MarPPnq6({{N{{_OoN1rwIc}K$s!s#mVYH$SyGORQY?Xz8L_1 zGjb3gkTU3Vf$ciiI4aFS6(~@2n}Df)(HBdR`JL6%u>P$~rD4&Xc9&)atmKnWf>oSJ zF0%2mxL33pC#)_g)8f+1{$1gq>q3vDcV*4z8$>bjBvErzTzj$AT1f{Q;`{JiQ2&Tp z)Fz)O~5q$$qos6zh*{Hk|5Xu_}~M9v&!Erj(&t zEpkhDI)!WWB{K_O5|dejEsorOMgONCH~otHcJpCk$cJ9XZ-2tZUabEKClBb=Ee&FM z^#DhBPTu{&fT-mru!Eo=yuIhilOoI1QXDi#G$WiLtrIeSVZ+()zY!Rmabg~F-)Z7DhQRCE$`3gr(9vhkBa z;YAhJ=9}XK0QdMij9rr-JNPYgkuCEZgYz3hv&6+%S3I~7j={uURtyLXiPu zlRLrlZNbFV4AR5=fE47*rCD4lp(GOop(jR3EvHf^XWLB}%qb=yU9L`pq zAt)HWe8$ugfJknQF?5zXlmeAsXKI0@UZW@QG(1%abE`vU`Y?0NgGY~n@sO&QQJw^~ z)y#<`JTN{vVX4Zt%h`uDVQ}f4#x!7{YLe(+xi%c9PFPJsvGUDoS}Y^LXkrSce(hq` z{aU}QBt9Um@r%x6no;2vj5F zXm?hTz;2N=BvO)e;DdNVfK|D}c^)G^SxVPZCU@ij^(LQUmBM?|1|8-UnL5i+Y$RR* zh^7dL@6gOkqzVdz^wm)lysgt02z9EeAgC!);>-{~;tUPgpPP(U7Yp|13&{i#cW$H zTk|n$zQX zUu=DDPs|;NkzbeOt_{@`1nUGXy0wx@o_Gzs4R<(4_`|{+Md*G$@JAG|vRM`86j}}p zJ5>V2D^>1B*D6#NAC1yIr+O4^E;E$LLi&Tvil61+fQb3V+$08+8~UDg@&hSI={g$W zC*SSz?e5=;`0{OzbwR;rn%>x`mIZgZUSk1??#etZzDOIBF;X*|J2v_fwKvcfDJ?Hu zO2L|!PWyw8iH|svTsw>emvDt`piMvt)9n2pC5%{8I(kCRa@{=OU7-9tKK#$ak%0ji z=#M_0nreRz06OfI$c0LV=zif)zTt@2nC*yZ=7*8jPf9J`c-BBdmQ8`fnFfpkbl*5AB1}ZTkZr8z6{-X3J#oKCDGE4 zb5uP`(o7d#BT`uG5l?VKJ@WkT6|Nt@#_&IRN7PC74*1%sskeDd3F6l|azDq!EKByV zG{XA}2NT;Cx%|!9{CG#ih&fgFOpJOqeZ|m&Xeb1z<)G6S|BV)IVxE4~9(+9CP4cc} zC^pLH?Nl~uH39=}-7EfHh50)rHQ#QVb7Gf4KjOB<83Pn2Cy4PhU*XVf!Yn^(GHu@J zD$@x(uW<5D18woOh2l{&qNuti>uYN@Rp#ZqR>1kA*Y3i?t{VmU!>~|TB6U7s`JLKK^%Y&$|ys>`Eak=YU zFvzdPp7|2hNN=+j%p7Oym&H5%G%r6puu44!Pv1;trd_QmO(u7*Sw){|F@*oeMdKXN z9Z3|840U-;S6_Xc6+gFd#3CvZBwkMTEWGyJJir9+B@R z*(T9h(oHg3*%GGm@Cp!YSqkp-h3(G28kn5^(;*WuS_}|lZ@%pTv?j7Exe-A2r71W= zz3%~MI;&gTwL#&M2ohV@?K1U=HQI@uvjN>*>od6kJcbq%tFi|o(P{Dhy*TPnhBy}nq`1oZdSO~-h(}6p1H@SURG+(U2?f$ zsJ-gCyJMknKVcf(KOEXc7|}(&Mw#B^KK;H^4wVMuaANbQ zoxv4>@@|$kUtXosNmklnXGE91$6)qRNt#Govj|=LsD;J5ER@3EZ7Az={i1&YocV~{ zhlzxHZr%M3JO^{9Ms~|o^2q(AL)7HiUR$W{xCz3H8h!mVyTInbvhB@UH+nAWboav- z(3-kVuNo}w!JYTg#ll18i0Z+N)Z*Fi0QcASyXgP--nq ztAg9N%B?0;B%~|lVlto)1gVWizjP0v*kqvNNlBSLP=*0NrU$RBJ-GWkq9wEiV~o8G z-o^>Gjf7<9a>S}t=yaftx7+s5H=EF5`TB_+pDiRZdjEb2LouzHXDxA5U()+=RPLc1 z#(B@7#rPVHgV)h({g}K)l_U5$P&QLHBAAhDk7Ue$6cFprxth_Nwz-nHp%h*BOSvc& zY;?_n@YgQO2AUNfRFtb!EybuOw?P&QY+vdQKjN% z_U5%(!lf(M8H%UP-Z7=t70UCpu+@?=lDAeQleLo`-?K$>4xdAkd(VVTbZ1(pZh^vH z7+w(o2Qoi0P~inI-|uI|p=@g?Ok~>0t+cU!72>A6K|dwp4}jVpi;5<$(ay&TwnsGO zx%&x)vvaTW1E9P~nW_!e0C@l5thrCV$hr5|!_SbM-5>s4myl_^Jk6E?<{!{I7s4^V zjb42Qr!+@j=MO0g_KL^DrGCYqi&K{5h;c4gfp{`6@lJou=?%^XJ!N;CgzW~`r-4`) zxu?%H6KP0|^6`zhcH~M$?kFuNxgLW6O)Z2O1 z=&iP4e}!bHsEKPN|anuk>FQOCN`xX8`VL?idh^?kytX}EK)gB89TLW$*k;hAO}>=T9qtp_O_RDC));CVoL%B8*~2C} zASWdW^hZvLKMuCV2$~EtCEvvayA9f(duZMir8I0(qqwx34DPXeCqrcc-rKT24YQ`- zFI6*f1*t-f!$X#>G-?|Be!Nb4KZ+%*tYE7&C@_7n8DVgz%GRERS!vIEyaRhjjL!-k zJ&|L#NoXw&&KoH?SU3@J+3)6kM860j>gTOZDh zW0)62t;*njb@7_Ph6V7kba2Dkt{1(~avO6>`zC=rel?f(9h5ERC3wq!mj7?^pAv@A zh)8F6kmN8I)FRe6QA$=5=bs1mVzRdJ#ey)cEWCTz?^^+R?IPH=($!scU>DOUV?%nR z({wu7S(*9Z9Ii<%(9Mw4w7W|dG?<3VVJO#iXmQh`+9|`8ub$id-g;~`DSOXUgBh)# zdrTZuV?psWV{g39t)n&8eDYPgl>?U)84IfQ8f5pobgvuhx&1#)`W*ntx~8%cq0*DVZGe>=|{70U7Fh z?p&|VDn32XW1=cHoPAl&Ejj2`Gu&eG+uJH@r+<-NUJC=BY;<_Uaf(}5Vq3CCVqU_w z7uNAHae3O(_v5T5pILv$YKr|W<}Y^PTs`T~5$HL%!*27ja+|OWAY3tt+56Hu-8yvu zxX_U0XCEbPapGhPu&K8lZ?V?`d>_6to-^1Vx;0;L$B&^fJp97iQ0y{7v|Hvsvuf@? z3jhj}>AaBb$83yh48IH+NF06AQ13RFDl0D0a7vQE*>BzL=)lUf&anB*U@n8Fv_CFEK&LM1^94^YCOTK z^|ks1XxpV!*>g|qxz31l;V+fkS?0?vDu|JdsupfIw<0Nus{RBfn$nvAqc_wrDuMD` z{cu#Rzb9fQxfyKs{39-DoBg?#7uyz+0z-Q24u5`ogu88)C2PaLG&}At9fbUshG?WG zC3naLTrjt>@!JLeKY?Nd?5rOECe|f0OsN^bo92#Y zcQT(Ys)UaZaQh3u@Ksp!Ue0vdj)hX?wR7w|ai6n4si!@-Mzz)%wg)p=-1+c&ii&Pd zV;b*i!s1}@NA+2OXreU(66F{+eXtgDZOL3EDBa$KPFwkHF$z9SCti9XY{Vac)VG>p z1DDTK$L<&`iP`btHP}BkvXAwDTmUAlu_v-Lw`YRS*S~#u34%pN8VK@rH15mY-qrI& z7w=_!MMw>>UP)$*)H_5o9s;$0J$D~;DEd}78S^?qA+)D8_L;QGW7#|J3tbA%Il!asRwM~$ul`jGzg98kmKV;vd{(+_(HzIebq z5Z@E@gW!GWtj*BaxBVCk8^|^*u!W5;b|x|Z49B4Um=XDreBYz4pq{*Skx@tS3ID1y zkjJ$Dnnp0OTTa%+SZH8mWBinv)II8cffGld9dwVtPD`YgN~*J-^gh_DT6HnO(x?4s z=24Ext0IAH{kLQ0&6cxTq4>xrHDP+WWIt%iSx~sUpaTrHRi-=mO#J#1fys|?I0vEh zQw{|`)t|johFRG6rbw8s8DS@%yHAs>vwN;*m1Kn3Y6FEyTh8{L$4xh!=jSHq zVRuJN2u3IX3WZmOPy;=TeFQfJdzUh{;z?>~9)s`^HD-qD(XFbmf?1jkdnLiw9)w7B zo2p?2J;irA3GXD3{Lg{WAI(xjL(;e@PGJh*=$?B#m{n=A;kS>+zk9Z)Xku^sechvN zn4duPC)A=Y3yVo|s;_*{!{L}==<2J^`_~19t)SCzz=|6{lRqp)PsOOD*7;yEv@$F48 z);e)ZytPh8gTg7rZ#Umd95&D}ur;_+dJyOiC#Ga#V{?)eD&VG*PjA1qjI6ggDi$Et zoHx%$zwF=d*jUOp4c3iZ?zj*(N{9MM$U1RTG?h- z)~P2v_WWXbLP0M5!L=O&e#K>GyD&Upo@Z4ooEi!ohOk0Ic3=*_+hD?&^szo~X4sP* zmK$Rh1ZkIBCu=ZHy34Lg>b{J0Z^5HpOmAp!Rsn#{f4`oM0imj=l>`Otn22sOKrX68 zo&j|;P;HdDiqtk{YMQ z(E{ropvgu+{WmiM*~BN(oOdWIYlpDGp{!h?%YqEfg^dBJ#(b-kwUl*$PnKl2{SA3_ z*lS*B`4Mj*4Nu82rTX#uT5OklTO^Rn{5^n}!|Jf-^y0RwdLg`T`d6c0{4FX@ckO2Y z;^oS-6%jZpd8-mG)c~~t_VmNs%%EA$ima>no7TH@a;T3WClhY?x{VaiWhJ(9LCfIf zg0r9g9WAlk>K!@w{6`{8LS>-O@%!8`?HOz7rlYsx)SjDnZeOD$duy#oU7Rv>h$pB4 zO?e))WKgPyS$D;%4$NWQJiEnLGR5G1-R5lo?ZqQKFGA@c>5}{ z3LqHXs2}LdiVB_j6KYhQ3NbU#5A{hFPrVv-rnF`=XLind3b4pAwK*npMclM78>`Xd zZYt9~1ASZM?sYwz^r-hvvaAH;JpWjkQW-_614_|pv1Vz~h=(F!$=C`*nQv|{?Ao%$ zg#EVtBy}<&P?`foGPO6c^*PztD{_Fy#PXv&;UxIE;22E)m=RVFzqUFWE4YS^H{Ht` zVJF&X;+B#FM_m%?vBC+ztGpjxTHmi*HH`KX0I}tKDBu>@lz?3$SkIUS*GBQzMymb{ z`MhWYs?J-at=JPMtQMW-%%;8o>O9z}O5f=9(aa5>;(#;4`C#SlE?0|S`cV(8+lXo} zv?Zzj+u1%->DuI|bahKBGWTayCAW=HBAlF4F+^V)DQttQcxB`WgQm1hAWtyiEyJMT z{U3|zy+cpM(RiXNWSDwtg&_T_Io{@13xu{0?m?2t!B06seZiIy5yI zdwyr1-ZJv<@Y7=Xp=7-$WvF*hH5=#_^vLBsr1?bicMv_W*R=@mEz<7sSpABR$MW$x z*+3wF@UsgSehWs<&tfj+?B;@=dT#fmx{L*ed5=-3FF_K0@7A@ciP5-v!^!-tzmnGNUnCvcq6TM)^%kT%V`u zgUo&S2|O^Fd||~*Niyb`JqLMqMk>_SmD}WIQ`l>+d}qt!DAV1fC*}#-6Q7`=C9|SM zpq1AlS{bmA3kcqOZxU)RRKnCo^-3^kRUt-6#$H=M)jspGc|Vqma=`_>S0WnLn6Go? zV`#tAlfiEo&Pe2%fFYC_eJ|@_S|9t-6DoaBm|g3|bFc^=_L}3t1#&GaA)RWU@rRwv zCnx14Urr9fCVwb9;|tLHJpL8cjM@W89K^KG`F7-y27a4UzvgS7GwIM|C>EIBH@&NH zRPl=02SqW(6-VHy{n~o&AQr?(2B0=dvaeRSPhk`hm;qNx#68YRI`~md!gpXE5PdaEC+^J1FKzJ6_mCZ}3?{rq?>gJf{rJ|D+!jkfL6!A}Ib!uMo zpOu_#*;L11UY?9R8Z{ubL0>TAoV${o%_OX6JGla3FsO1pC-*A zBM!vL$p2Y^r@!5_MbZlPdO~X!N(9HSuw`4}9~zJPg?`ZuE7taSE~`rUh_Xp{Z_4-o zj100{o{lCz>m4g3N1u+ zXeS8p9WFb``Yi01@UH*!epDRx3$RrEgZ<_JNUE%`=T^lfo)0#T&tFw$iW27j3H%oQ z<(H$uRdfhv@ZQ_@$LpZSp{{kHEM*DbE9zn!pT5Gl7)1 zY?>lj zJ}NdV@yqv&ChP?K- zCyXs)4tgK7$;zpUs66y2&-Ha;j^5+~;ZPhLC@yWu-vFfZ{q1kTGJfeXXvS9?k8A}} zD(sIu=C4olcJy%C!`supYW@L2;FUQrAhH1)n|~F!`CKAABwq6A^m$W<)WE44aBd|0 zh*0%KJHM|>_6xPYAATorbnhUFC9j<1vPaz`?6O{Ix-a-D1YO%{4HIX@aCPcoo)tn< z>NlYRs~t3mE(*N-HGOYGB9L5A%%~;}ghrQpHx2;KF;cc6N@8~V8D$uDeR@xtr`#Fa zGEWWpN$Sm6(tk;^21EKo?~58Y77KZCQ}D(w*|9fH_=_}Ig{n~B0DRC8tSMPF4k@ln zcsATFiO~BIhsD%PVR#A7JG69p3Tfe^kjA1CD8~*WRO9*bcAjIt^B;vPx0(I^0DvoBUjM&58h+@wa zO|bDZirMyUegHKzB#u%}Asq`CQLMe5CT=RQE>j~r>>v|cB*fJogjj0OQ~4RvdLOK2@~HqqTd;6dkCAgluTQDW_1{0=_J(Fi$426 z0pV~>VovaEh~T6*c-vHczLYk&u$d0YRtJt`rz?s{m-2-##jVU1+P{XvBStfMvHrNJ zBMpp4HbsGvQ>FGT=AYuG${fD_$Lgm7?Lx~PHb*|M*iqNMtVafxS1{4hYv^|m1Yf_L zypgNwP$^}&6MLCk^>(C`R)Ot-Vs#C-_wios{stb z(=D{#ZIf?>@_~);Lu(Y6a>F3?2`B`B!sg~=aqKgpon9g(=@@&U!K zW+cTgS6`^~lY)nXP8nQL6Z>gutne4*eSBWRmJi^#Vud!|O47aTb`O*z=>&yv@eVyH)4Kj<`4d_5Asky$94?wp_Zj|7_~M;V{!BbUrLx{n?fSFAEN7 zy?ylL@m0SkTapj$+i|5_!O`;%nX})jxQB1IO|9>?x1fTBsvyz~Eg~Wa3ZX`d^kM~( zCL#u;1f-V)6%df#1Qu-}O{I5`5`{=rB26HaND`zQf`LFnk~6dRKIdHR_1{-M>&cDF zZ_aPNWsKjDA5uTt0H=;>R>b&o6KrA+qtoN=;5l2iY-Y)EM=7Z-Qs^QLSl+fcr#0~W zn?%_By18FI5>z)>xWiEMqEXCTVA!UJnlH_vzyt!Pe?_zfL1?m)ncDb#agujQcA)kO zd8PkJ;#hZH^xCl!37o}Oy-lfo^tRU;JEkjfnR;rAt!ygTy?V<^JJD=qvfoU)SlQfP zw?Ah2Ym}t>&n&T*m9=WVsg|8d)lPeZHc2{6a-&U3rGNc_qi*Y*Se0Omm!1@j% zJ_)Xng8MWdwC4fuVewiGs%zWmERiZ1raVm4PUX_}huLuY23)6vM!3O3hV&u(B`x}K zYv%i>lg-Ci+l7_0S#aoxt}W#z524UEEitY74RsQ}4B`tL>-flM8ZM%bd=EY5CGb?e~n4BS_h= zCqr1>R^qF<`5v@P(kd?b1kE<^krL81hKDRF4UtJeZar6_tAO3(v>LbNvB2HzO_uS2e%Cdt>Oi0aXhIDEqE!)b@(i{l!UxQ&P9 zxMiJvHGJQ_N=Yuh7NUDIeE4D#rhs?pg7jEfvVJ&_jwj;qY(VB)k@w7f`4CQrh-HVLiA<$>2ScU>>ImRG3TT{U4A6uo7a6Oj1O1F=r__C z#pn5Sb0ww-T~2HsF~m-&Z+!6`EP%MF-{k5GvF_TAN`#HpeR~?=b~3%v;Kp-ML%83p z;1Z3C&-;Ww&i0p<(C=KL8j$N%dq_wwQ`M;PJQjb!=xS}&)IA_9>nsXFaezfXTz~WJ z$=6)}{kvkS7DTTOTXmzCXEFVx2o`-r%n#RPXud<9QV46&Kt`TYb#s>p{`sQ$W1-{L zYF~Lm`Y7nBUVjA&eprOgdkS=#UQaBAim9sUnlaW5B(Y$LPyb$drc@L+Gr!o>dHS{ioA}1Y!nvmV% zX{dU1j7iW5RN7{xC<0@jM^pctF(z@t_3fqX5iukajibN%HCvshE#3=^IbCObc{ zc^|oEhr{+l7ni7gH}@IHx8+>N8qho=vG2-;*a|n*obFu{3J-zxO2m7r*H++iWydgD z!gm}ueAwsX&zC2#nnZR0O5oq8oLBly-LgXqrLLB*L~NzPIYT~D1P+b&`Rz1)5wvRz zngk}u^Xo$-XOf2Rs~@=C9OY$x#8fJk-<~;5g40%c5aOOmI@2$^aCLtx9uL+V)j!x<=_z}1MDAV64Kl@R{GOkL)GUL2o3 zG<57mv#U1jbe}-XT~5(SQCEg_iR}oV(K#6ZF+rniF<1M3$oWNa#{_aJ+V;RkPxs~eEhU`i8SXzRV!m#_D!-Kw zeg?^|pFFrS+foA?y+_x7)O!9>rB0K|3!NvD2~}lP*JWk^g7@ zPEZW_nBh+4eU|qt_KC({S07$F-KT5a(zJDz0PaJ0-W0C3u&=$Q#2=O2`uv^p2Wz%1-2C9FnlttDHL;)A!X~6yNJz~6$RK2) zn>Eiec9? zWDpI6d%T?xQ(dib>;$HH!x5-Jb3#z(+46dR>~1mhu^TH( zkcq_{5824{P5m~KkEGxL{8Vm%?32-bj9Y5g(GiYj-C1F7Sf_$0lSDOm&rqdKC^g>29?*VfSxqSZl!nN%lpBiiFkkOINvVQARuP*TDQF@Hvq<2>6wYWX>RKqxb;u^Rz@S+#A)HdOuxn8U9XW$6LUVJO6M2`CYRL?r8 ze;_IEqY@aT=OA^F_X76C;ljhYpF~qvW;HFF4&zg_*^=FF?=R`R{I&lF1K;U2kxvY? zm}#roi5XWK(eYVC8)>Z=^*bU`mxJk_+b-a)6LR2fr8 zoE7_z6XQc`!GxI5ck~o;deyOGs%Leza&F?ydGE?*JU*1B)GR*3zV5%i3Ya8b6wvQ3VF}rL05T?uSzStIIPWgT$@~!SjeeNVH{y4NR5rVxb0cJ zqQcgLIFX)Tr{H-|V1@RV1v~xHE6=LE)(XK}*Q=xN@4Ei5xHlh28fod&r#Pi=EidNy zZz&B7UFJ7dZ>4J!f(~(k6m{OJMRh2Pb~D7kTXE+~Q4)?!bH!SMW;=U2ih)>CT;rD3 z9VlZMei}yL(3>~Kig>pcEmkr0k*I7RPJNE`OPhb_W@64yqZ{(My8vBs3(lwx@Rz7w z7vt-+w(FUTisIb@VHru|f%81rPuEgoRQpLrj2$~1&01uwapOCA5@Kooy#5)E%ji;Q6!>DCO1WJRMk_Bt*@2AyO}kW;GUZXQz?mw1NYu@Bm{A z2nu!k#||@*?BE97J*&3g42xMUWI-u#%-B(VBugY>ANig2ryYz^bUxv+w-l5Txal5a ze*biN$-f~uLe48$_1igox#B)#nskd>r{ayeu6k9;^DI zb5;O$Y{|WA+Wp2IPLrfrQG7ISy7f%0Hqi*RI{(@;@CC1lmgQ>K*Qczb-_Q}Gj=cwo z@l2O%>c_5*L{vT@JU6Ug4su7uovFu6U zkScs-oO@gV7C?@|JfN^ZyA6HgUVmwvRA3EkGEe&IaG<8bdPAtOPYqmSgErEGLCsOo zO3~VMBZ{PXYCAGw*~kF8Ss**V$LWW1qFG^=RRWQlmj?$!+$my<7ceR%AE~MIJ4~kg zF%1wt<2}pvh^5e?|+!Wn#Ao;Y0<9q;Z5?r`8+djj}TP|IAP$0R$7#Up}%!hL`OwSF!$HVn0AE*h8rw5Mnr<^qhL z_aE8JJ8$mT3P8dNL9eH!L@2}2GweKB!}~oas|S;-+NojZ#7Dn#>0pJA$|7^l%OL|V zq&#tB-BZmkN3iOlD0K>SyG+x3VnmnXf|_F_se#aN{=hfn7vjLu}oN`o*#?XI>pw%Ip6pRWG`cTPcaIM#dLM2GJSgnH3&kQr6?vz%YQ$k zg_5+Kb_UgZtNV8q=Z$x@EVL_TMX{SVt;=`)lA^OGG=@9`c_Ml>NA9tU_1TMSfad){ z1+11&R-#W2c$7`wy7**M7}pd)P_I3#pBxI>q#gFyX)HES|L$6(b+uHbUWV&Qo20e< zvduiVu#KPU?bNRC5u?y)bq3L^v_{OE0%ll?kFLV3r{e#xIh#oE`4B@M^0Hh6J{>~4 z<@srv{uD^7eHvV0zlvBnT?a)U}7#6Vb|j^et4)q;%nsC6|-J+c$- zjo2_y^m2Whp|RH(H(=X)b6fZ}%e=qnuqapzl^}tJKPSFry+5L~=rrO4a0I#OHCwA;E)V4dX`8 zt03L54?);(*Vgx0$}6OZD6NxIQCp=kn)_kv32N(Viwz>%JUbQx|7yh9ECGZNdFj4q z`cfi$Mpn5EP9Hl16EqSi=j*#8>eg>A{{+7u$zOhmU{sj@cIsB_40PIl$9v$fkPop)?&0=Tw#o+ z!gmNeubbCYu97gFy7OJoy3&?!Qs5H)NSLp^U%f`yuk*hJe#}HFEv5jMYY#f&rC;rv z7tD0#k|S#1wINm73$G<#6x<8wjZBEC(+s@&ct2y9Pjvb5 ztTMNzz^<*s(rllA%^o+wzt?H|{HkELIqC}2wyHwneR7AWvA*4v^z|r7=pH`}#M|g0 zVTEkS7#HEzC#yLcYZ?d^hi_be)xiq2JDcX%7Efj-h;NBVu49hh*>GFDs0sETA|;!L zN45oXzx8xp&tuq$tz8m(0jCLVRYxQT%N8cs;HjF_Rx5STM7E@i$VDNVmo2tocGl!GrCpW>A5$;~IP~h9_71%dRJiqI%MzbrjtSkfn zPAtc35K9^R$c)RV!$i__3X_L5^-6iA2+=5Yt9ofrh56U{hu|ZNd-*_QvJncjot)1- zB2n!R8YVElgnbG-o74*@DGHq0Vh+M(T#RH3LTchFEU`l>lGT};>_v^dJkE4daXie8 z<&}eB+?p>TIccbmizQJuL*#aZI>%I3-*)~HzgG>TfD1fWAQY?AVvorxirH#9cI&8i zCI*@BoL6sG@~_WZ?ImD_x76|A%N4XPTCTs%z~0aQOPx$oEo2pMoRLJK;`vs@q?78< zguhL-Tz7^mGRF9sjO6fM!a(|c=T|90V7pu+4DW5x#8qCzZ9__05Vtc$YE?0@HcB(= zlK3I_nZ{G$E+VEQM>%i5%qCyjNo$S6Eu{wX|A-kfvP&;9(~Ji@c*-o`w~e;Eb1o5} zo2ztJrQ_0{<-ESPM8eehBOD5f+m&68am6EC?N9ejov9a5m$v9_K(B3>I))UGFYi&w zL=`UXEg#+$;siB$KCrLnj%A^v4x@8_S?nY+i?&TJ$t^Xo(l~;1l)!8|1^nI?D)^|7 zQH>!KIJTljzZU{dp0uIO53k6YYq^X0tgNMTUBesj zt5FN;B;IYUhCC{x0n(yo&rc0e2l1KYm^_!K?<40nM9~BE7QXUdCXoe9h_C_@cJX_nEe>Qt~;2|^h z+EE=alfr$XLWg2R2a{r=u1~QkQzlAv?x&JC_QZ3~!~|DEE2Q>E3zyG}>0uvpoHdg| zuF6EDqr)8!6v6u>1)L^qX1l~Gsg`rm^6(<2NGCdo*Ln0}?gcdraRL>gEh4m%9`md; zpm2Xwr#lv6kfR=TL?nRM=6-j2naq9|wu@OHU!&*}0Fg=7_&2FJuw}FUs*b}R58=L$ zByB0j4?bIdThxpz2&dT^Mdf~9l9}a0R>y=I-4k_@gU=4gBuAMP1`kShKU)X(PsQx2 zLSY{;{(0cs6QmT9no4ZE2Q8Thq(XWdG^8vcwl)e}IXouyx7Q;p?A!?9x5mcO0};wj zY9RU2UP+>R%gt6L$*MKT@S<79(x!PHF^k@{|K_1E>xDyXJMTUBV~`_vct2xwN424q zqDm-asHIOmz%*nSp<^<$1Wxo(7Kb_)#J2z;rU^QLV7IvyNQc;89+a=ilQ2pT!a6xh zFKj#+gmxlF?Cwj5+uylc6SGD}W-sB5CUsC0pee2oPQc?SB*zCg}t+bx(~%?$a|@WBzey^AUzE2}$}@#=igJ?TqJ zWEi70`>I0vZ>v#RIF-u`$>M;ZJ)qncc0n2m z1e}1-;6|Z*vSas(iC{go(Qb9cJgR{~DHVkDK>bO+WrKR#Car%S?cg#Ne-o0h#Cn;i7+?%etN=S$S!`%^@^uHsypMES1_+eWNP|e8_gSU|D2094G z_i!g`hZ^BSKI6k(VvZ=MA152WB%KKhw1hq$TS3J>#qf@@(^@x(%rvvh?l?)OufE}R zYt6EIrOe(lQCgaf*I0Ul5CU9{(4B0`S|zZ@k%m`l{}KkrO(my`<@@ znCJ5mK$gw+2`d&v3MksW#*V66ej|b~m1n=2KEMEZc?#q?SjnL_CT(pd=n=i@mO4+d zR4084f8R514Wn`6ylU~yjc&QTz_pgU8yg>R8adh~J=_h4?m5<(O{O-Y!d7@QOqMQ5 zET9o^q0!La=F6*Xf1bVh$te`f3rXcYQ@c)%%u&MU6(6}&2VMQ5YSR009Mw|T^`Nd! zJchZK;t{g5IH=it+zAt=ow?xHx`fvxUNK>%Cx;HXyh)>J3eYIK)SacakC&gYG9x^l z`{_Ktx-`wzs3iEW^|NKbMkPe0(IrY0Oia3!@s~`P*pA zPUV94F=2u4z3WoP)y_f`13NRz?L)?-T)VF#q=RARmaSLuYaV#>Q5I1#pVGij(_Ah% z+_hHEGK?uAL0v@n6VCTIe?SmpQexnod%P4zROz@==!R8^kmVzIb+kZ;tb>GA>n^wN z^kMsjoUV&qu+QqQ%?WE5H0L-eD-L9r!BH2H^W`@^VLBLzp^3dOWOE1<1|xZNAX_3q za`7~34D;l%x0oG~Qfvv?`lQ0G zeeAZbhNM>1h+Yy#(ET?Ch*Xm3lfz%vq4;uN5pc-J3~gn?Xu*#4JG|e$v2i7Hkk4WT z?qL4*>-&&L@L^D-eSB8f-e3%8I+X8CYo|r+;f3|P!B$syc0}3*1v_csK(ro_r$f|T zWrCaOvwj5-$h-H_mu^R!J8+6TkM!-gopXKx*)~T+$4P{pv>yB65K>2-k`A-6rtl31 z0v#2M64%MI5gy``D80juWH|;X)7w|K!grE^m%)6|6orW>}rt*sXHK1Zfb) z*PPyn=c5ifUC?r_`-~2<7Ox*s*?3<`l$g=`Iz#}>?_LLXR+GV9I4*@;z)`qdoBd69x@m6u;g`ZffB_Y+gJn1TQab(zZtrK&{|m(2qW9icdro6 z$ECv*e12QuV^MiBQT*Zf?>qol0}|bO>KEt$e#&We_r0d*qae>$3X;m>wyjF!pLN+$ zmQLQDLe+zMl^1MsC@TZj3-Kc?qV|bf&;TEUs3VcfnUIh-tp%FsLPH{y!YE%C_5WMS zPWQP0M{Be6d-y6Sf6ejb4X2tC0mW?T#IT*QnkcIWdksRWXa7E zUv@_|mNpxU9A#4c{HCpL>|6^G3i?wK4=1w)g}b5w+wEZXYcw-Qr#gcd}r`J6m>sl zYIJO?$xw37T_B}if)R#)jvNdSoYckGt3|J3G>oo?m3Zm7xvN={w2JRyO+=o^ICENH z`db+a8Az>yMtog+hN4q*-OW%}3R%zm+L1S83C657R%whU%)U`LPo<#smDE?0?kwf- z)hf$jzR6Xr00a-=FQ`*?e^s!UL$)Xoo*{z6?K2ANSL7_$LycMKxXLJI!*7)T_oLFS z9}9_$WBTsnH;@DIjD8i@Si*zWtJ*uGzZjF$3Zne)UAmq6z>KZ!x~>kod3KOrHXQ!eo8?4{w_17u~6N{f=l^jtd@brdXcKo1;8p!aOgF zgMGHXs#AR&26x}bXq<}~KdejW_!xQu9B)fnP6?lDm=JeaY%4GKi!DKmjj~32tMpWM z^{LSmn9FBqc4Z>7;-m||*vlicQo=Segv5Z<--OQ9WLM5%3PZZYWA z*jQyP{gSbGomKO<<#Z+^zwxuF_*O=8(6u@}C&$$bdHE$e-Da<(4p1pZtv#(s)X6?S zw?PUI%)iYY+w?vwGeDGu@AZ{K!Jzc%V)jx(9irGt z868n*nH`OtDA0=4_pumEPEYZ>si7z2z9`JlChQ6-1}qQRD`;##tdjhj0cjsgauK{NnJ7#d1j1^+Ne7`I%6cEXz3c#H(z3At3bxFq%SS@y?N6h_F0_!^N2cwx4``{ z0s{ec`GV5rUWO$9x&6_SF>N1vRsQw#>$+Q=Vm`Zn3R$!LBJQz}csWGZVB?q8=9{Xc zoT<{5fy(`80cUO+P}I!d*g}k^m`8mtkYY}tX+YgwRsl+0Id=$TaKk^V zX36*62cx{i>Y*aeqUl)G(aQ#QwWR=|pt9uqyrz*L}fjYGA^x%Pn74!jZA^FKpGO&DJEM_O#HDOG^`B!Pv7^JFIKkT;I=x3c3dn^87WD5WYvt|NY!}-8!XMM^_ z-@QFp$6CM{M`h82q_;GNvM9>^cD)PYOOe>4Nnw>mF}kHD*B?z4LL0sG;;P8V(lqGO zmdJF&LzldBH9@r|;sO7r6l2#x6TtPBY*+WXn6K?RWR|lJ5TmG1#+=aS^y&4*tH)%g zzB-&Noj1ng3nY!TCnRa_ObH?ZmqJo?EB>|NqgZH3c&MEIJV=iQpWhiaoWwu7sA1Gg z5^!7!h2$Cflb}tPy5*8_e6C2 z^4s_a^wK#r*Kb6Gz3J}zn#ehJt0*P^7d^9gbx~Xge*+0Hi;{++to_tKR|&~l3-4wb zJ2N%;nML-;>?XzWIikAeu@C#$J(N+)e5gnKQk#ylJ1f_aTJ|*~!g`W@p7*+%W%TDG zY#c*eJw&{kc;5ip>#=3_e8-CddNYAfU|`ypCu6Osp$7`2gb zVBuMu3-4;nlq*;=aEN>M#jI2RdrQnVjQ7ws-Idq#4){@D-P+?{j=_qajuL}m!wtxn z_auVk9LkvpgkKe|oOEKX=Z+DE?t5Y3KOSf_-_H>HFC&l)UaMwb&m_%tb>%o^z5aMV zz{Qx%%m4U7(Q^*a)^DzmJ-=sTa!EIw)k{{k6A8D12R<786vhPix&byvQEh4)MyzxB zhT_u-Vpw0WD9XCe2{_0^C1AGDjy1K!z8-o-ySi=}M#VUQ6)_Ifl1#WNJ266Z1E2|h zv;M<)QbDi~ZzK1L7y-Bw_{@?p&3|YDiGMdasb@g{)tG-Ig{&AdU}gx!uFWh1@>S93 zo9i>2-tI9!ZklcKoYd==dKo4<{;l=6giD6WadsG315Oc1j`xb;b-BOpKf2m;yURz1 z9f-$bw?Vmx!O0iFt`&fA=T!;@E$F4>#mc=)`trI)2La8y!74pGB4}WDeC%@6DPAgp zgsQ0i_*BOcer$9|F|ahz-0jMX?uHCGr^U|?`{{NM7SA&Q657q_#3>m(RCPLQv2Azo zj)bq?dYHBH$%FTQkg}YoEYdGB%*8u9`+D>Ld_@aT5t=IvX12E@U`8yRKwLbmo5Db! zIjXjl_HQ>P@LO;=$FFb?d28QVU)A2vvN>T3kBc@TO4`Yhj#^1(FzM5}#=#f+- z@#$_Ta4y&MKFob(2;c5{CaMj3asE8#@sNwT+#~woA1MI>*2^`m+)Qgs}oz4lvr1o2%lge0m5e_yE zUBu#N2A{}p)7eKhdb!qT*~1#&J{EMXZN8$0bt?`O1k9sd z;gK`1p>~_cp^F)Juxdb7jI2VTqx7);-m}vh<>6HS*y51}J z9pU%aoD?Mk)~Mhs9OKob zMLk=;==)vwSd)$);D@>Pw$KvWrz^48npCh^F5vuUjDoUlk_ex0w`KrarVS+`119s4 zf)38|H9)KnJMX8}_#Oq3v`ueU?|RCw$RZ*}ML-zjJUJ=o>rAqPF)`<3&e__PvfSoS z9f0;z%#L`hvfnA@S(?LUR6qql2MClqlUSA3CGoD$_wO5slx_%EFAeZMUxJi9`>rM` z3>|~c0WT=d;{^cQUzIrdNLtX8LE-pjA_3^Lz5jLaJRH$9!ojpso@XO={k zq$Cw^n}!?|Ks-SO4q2Uh&`psCz1T(nJu~cU{|vjBI}rPdC;aDOg#mWTkToc*IfTycKzd=I^9}styUyk&5)OmkKZ6AH zcr!dtj+o3=fHj>pfw*`3Fy?zJ#D{6@)oq)k`o%CH(W+V5Qj3g!Qv>Vu36&E8k!II~ zXY$KfGRd}0g`vastc!(iF(49j#d(V0mNyOPuk1P-CxIaBAI+7M<)g5dE&f|)x0ng@ zvX4c5(R>Pp?3wi+fw#meN1X-dV*=0SLzWWPgZc8y>u_%tl$phIKSc&QRqP|ZJf$`+ zAz4~0Yg#7{dZkeBv)Tpc-35Fb^|8`2i8ye$TwdQs+;ClAm*eM8ehbp%&<203A+@JrS(h_iPjGJ1>?Q6D3JN-|!a>>gb)GYL0HrdXkrtj9=H);z(CXm3TX#&b^4XDced`|CKEmb)hNq zs$^x$8T1FM%M^0G9yCOuMWr$au1ryTlN!BR82%@`2%cnQHgc%ed5 z8DgGj00w*QUTE)^#bHq$ahI@PVBFp)#?FXP*JkvOh>pqLnP>Y9^#QtFTh8~?9kuE@ z7lBk_bV|fTh2w;*WIli!_9~ATzP6qI;ePO1F~|JxHR{kuIG#+sPkVHg+yNKD&;$KY zr=vT!N$`OC?;Ht%7aa?|-~VvZ{tqMWfHyM^qz&-3AAE-wKZM6kXz1qK4 z6JjAn;d{{h>DMLcg7)7ex)wU5V+o&8X~)qRcjhm~@eqRvJxNEDo?}PX+~Sv_OY`gx zHK+gH`Kg98NKf03Q^)i$$6cO{nt+>hJ{`nqmh(A#qLOW*_Mz1$d0re-ONTWBP|qKZ zKHSxy(85cP!(;zK=G~1Th&!tVa@XRgcYn2$*>$Oil!e>sMx9JHy(ejL&HN|0aH^t~ znS(hT4!B*;XwgV4CTWD799jLv_p#`kc{D$aCW8|~?SApXa{y{i+6i(Va-fIqOh{Do zUa%^$QvLdY)qUj2dU!t_vwMbaLVqexx@CtJf$snW+MTW;gSak-MxFt>-zc>uE&ywz zp5ylTZTe1m7BwKSqxK>j#o}GDErHx!u=Zx;h#yonXe?c0>TKlR7AJ+^Cqk4t#Cay8 z3#c1cZQZRZrwH3;QOV7O1p+nBX6ZlFMEA81b$qVS^OqFj%@W<}RGGTg*O?i{7F7*x z;Nukwz(hVt&U@tgXSVyicSPv`-6PCz9}YZI^uu_CnWI{JEVewVdJ{XN{>-zaiH__HVQ z^?{u81?ZqBij0Lett#Rhoxvx-I|V13bJV?TM{Dhepn|9Np0 z?bmm^Hz_gd=Dp-`Frgq+@)O^@Y%DLKqKY0S8r3&XT+k2@(n=4qz5&h$Na`XH7I$@t z^?%saZNVpMUJ_@pX8J7PmZ@TKW*OBK*0M_{3)HyG;`hEkjuO87HQM+4BF1r7Dwrbs zRZ0?DOqD&aD>Te^YEZ8};eo6Mh>58084M>ZC29ViTK@%v6nhcCVb1ZZ!>UiFnQK$C zA6oyzzx+QbU=NiJC8o5T3F0h9MoaVmVljYhRpplLdJlOj1Yh<1#wKsn0lh=ceuHx5 zSKr*DtVw*af!X?5tKkw|rBj__7ghKJ==hnk)t86!4 z_)tEt*H6U-sHgr+ua5cd!+4#D=hrC-=b!WH>L4E0b9Tovrr+y|gJSe}2Y5nA=2LQM zxST{;i!cba4|Z-IxCNUx$E={8d;lG{-bwNl-m^SE@Z3K(#lXs{ZVr!xVnrU{T6-WKG; zW;4{dtO?{<==OUnuN^wzJ?pga+yf}*SX%T1)xRhPDb2&^HMl6BzaYN80^7F{*K^eT zvNLvUZfxYff@1okafJZ4*8uNs6|-X=oPCcKZ7W+c0!yPx0C*$7l8oiqPwxOkr; z>{5u$QnI3(>=s7T@1vBD-dPzlX%7A~w~{*4fyVV*(X@bH9*kYY>6dZm(B9)JmK~cm2#FUpvbc zuV4nuaS){ckdj5OeZ&5XDpA$S zf4rU*N?z|0iJS!T41SP2oteO@?k4=nTSpKPHWIOL1K3TWD8~Y_%UGVk_c3xFHv*07 zpjL|sn%j>C(esV@v#M9u3rPFd-1?5WqUC>zD35Dq@QKkU`8C9MIY(~bbEKNjgewGcJFK!g%g z^#78A%3smW;yEm!+{6e&*F{g>@;45Ck_0hp^j#I*68P(v>X(78b9=mf+BXKtYC40|bVr&}u)4(&2 z?lSBA(vNVn!QX0?QQykN-c+0_OMK`-JqbBabSC9w_Qbl4)|{kX+8AlM6W_|g%C1Z` zG4M=BL_=Uk&5S2%t9e`!(+3R#T%4+1a`DH(!e$N)zLHLO$LZc1OX4;gAf97iEkduT ze=>N(b`*F$ir=d5eh{vib=GFF0RU<@!n39JOUd@avgka&VRbK${W5d{6U}@w5uq}F z62Sryn~FnEZa}eCxhF#+%BK_FH&+_1vn`}v_Sbv~KymA#nflmOOMCjce%t!!Lf5|u zso9ID|K5=Ui`Uocx1I0Bo{H*FSmZ0oTL*HSt!C#3}hp~?q!e081wUhlK&0^T+oxWo6F0l2x_pKjcCSR$<#5b-P$O zh~hQTI}yb8%vE%h%;VC~b2XLsoz&IJKwgQ?(B02G=SJdU&sfbZ3XEz|mChLcobEdV zHhAaJJXg~nBbPd_vKOBm4E6NH$Aw2r1dQKOu+UNXJDhZobeK>d`W^$!M(28Q=CwDO zm9EwdAww+kFRGKQHE<}OokXl?%pcyPuJ#kd#=-3p0DTzcCP4m;VlkWblUfOZOFDro zAtwKIP5t+6^*{b`DFHYVJ?G&X=G2Fl%EpFA;yEr8V)akhC5!xCWi|>J_niYtwey;2 z0t(@MwKOY@m6DNrHVzY}W?guYVr7?6$8jMH)t&E#HPDDBZvsrcy}}XTQk~=MDoD{& zj)M*P2pndvp_m^20Q~cktulP!*L`G>XCy-uaQ9bj0Xi-4(gsX4F&b}THI=a@3c92% z(EH|5a$K%Ir`%$EdAK}|&&%`8`FviOHU2f20Uc|Qc_16{QlTT3>uRmgyg;d}(x)?I zZ3lF8A5P zr?&;_PIa2_8MI!>yuavq`?_qwW4*Wz^Q(N-I^|zC_8-1YZ%+N;Ew{C^-iASV)0DhbuNn8Hj)mLV2Zh>R-k`5_7BW{e$;4K67Lc8 zLi%|81gNINmVyJCC4tG&pwTz!l)^@<(WgsOBY$Js~}?}@I1-tZdc{m%OnYauVK{wtcDky8AR zb$E6UJK3em0=gm*J)^(EXB-MRbk8evA14dwaTX0uliD)-Vl|08Z;$zcYf6CXehUb; zL+leI;CqrpMb!RQphLu)%ZISSx0df5#p1v`)tx)oCn}t>lH6hZm~y_UZuV+JQ1P0O zji_`b1JpvyAdE;O)+vFNl^e$rIgcBrmvVDHS^SEzpYjW)iv`hJVsslfV)Z4Gt zvjaA51|QcsoDUsOTL&JYdou@L=JPE8Ta3N`+T}Peus6jsgCl~@IZUqk+Hor}_hV7D zTqk88EE8mv+>VtL?sn__QkY;?h;v5;aE^FRW29-BW8gd=Jt<R?Q;V95Nd!3|XYYXhqavQ)N7>W94ZCehs*Ux>A)~Oz_^~A&YMWudM`QwO zO9klx_F9=oAKy`oz+H&==HWQj>%K*&FRhap;p7k^tcWHcePYJ+kpVYMTRCs{DEWlr=F5?y7;&sI2l^B~?>v_8@BZjJzq)i2 z#@COe{u99Rr2${y=hWeun7|9!>X#A$Jx|G+7hC{E^ImTLKF1!jcERB%=8!T?!7^q- zFDjL8+{S`HfiEbaZUm1=k=qHM1>1q)U!1q&Yi-F>z$nRyvwzC8kbA+6dW`Y>a3c;{oaHV8T#wQJ^$2P^`wezz=$ zPEpmB^r}A%x+|2dpj9jyOy(Ev8HB=xR7jTU#Ev&r;F;b+eC9Xwi_pMEd{9a@11A?Ax^ml#g_ z=E%DSQH20^A@M9sDr9(ms;X*r1O5CVn3M7c14T`XrQP~#D)H*?=y+U&W{$Y@B6j-V zm5b2DuYbjQ4r(7{-Y>0k`fI8d&}6pgoS5YOa`$U6Xm-~ZprS`K%?fdhLe??uKHY(48SXc z4HX=}2>y%H_y2wW%uWD@X7K4^#ZUGoWvBDLH1DBTDg_j@6#psbBuX35_loRECuRCK zXBbst%WOkS?r?KxzU>qI3J;r^IR}dQKJbPbtL4rc94qnh!sG{CjzX_&gyKB$02->d z!iJTHNS2Apm#w<wl+#F`YMyka+oD;mb1AM=)_tQ^D(xf!>-%$eulhNGM9S-LN zC5aoue=Aaa6XVtc*~w(Bb{pJ&j2p8$Onn~haat0S;G?Lx!FHx57qIr1T1fLlCyL-% z{3|5jUQ*@y0%23`niMD-!6{bp{Vs3#JAmdl6Yyxm%$-F%-Hcfy$tCxgDbyBbzxQ;m zRj*rL_yau_AR8l(hfVEz+F$Mc0oHutPQDlTpG){pxAh->5#>`_@^hMq%>pL>&0Yvk z8EIwv*34Do!v?8m0@#pRsqvI+#u6_xHbqn2U6mhMo{Q0{bYlTu=L!6ME{jT^;Ws~j zFTUuX@u=yN9bavt6xo#bRUKu~l_E>krrQjkjVLpwZZ4w%_$NpPP=-_-I1{I2p~E zTJ%41yxW4wvAGR2%_x&0W@WHy68}m<;kp$Ked_lprwS5q$N$~{EPcW;`J`;S>2Sb= z*u-?Pp9IHJw)FZ%oSKRUSdYggU%1{Z2?bJ_=HC=fWR>9R z9|+?maaEpgl9i>brR|)}JS8qy-=kU&8nvLS{*3BBXVj_5Ya;|dt3R&B*77v>{;pgN z;09s3p4F<8ABC+)wOVC|NB4O@g2l;qZB=E!Vxkzf!ZowTTmFvKX>q4NkCkv%G%SEG zVVoat9j=UqX+5vlF%@Bp^!s%4^dEmn_w^sMQ1gON2xTyY7PU?)q*fEMvjYo?UH_U= zk51fJgAR^GRJzFuPdbRyBxVJQIQP*`$B7S4dIw&-!abDbh_z_z^;q=kAop&p>+Hp< z$rs&8TCT08lfF|62lRbn3SCB-ha*UM9=7_>sJ%3e1192v5vZ_G)G3mp!}=$(tp4d*p3 zXt&YT7 zQ2c$Jxnh3UUt=Hn4-@qFMC$jyMaw-1e+c`CT>lK+3DG*&V_1CKz$okCy`axYhX1k@AdbWz&M8eS*R*6b8EZ2D*0h0kBlZtyTA-Mq>z z-5U3ZU?=uiQSy)^o`cwFKHa&}V@RGEz$?P^oHh@GPHK27;I;GyE;tm1QIaOVgjy-~ z%SY&%l<4i;D=~oI?Hm4v;v)&p3thd?8ixJcSFCl3uT!LI5Ms^4qt{ z0{R0mHNIXJktM>f8N5)AVzfeUMTO8 z3w7nw#vD^h^g{K9Rq!GT!+e|SDzSRW2GVvtlfd6~p<%UjO~~e}4f1{~o3BAFX1l=> z_fBpa*mC7rXMAdQJcrJhTW^qcDulSX&CPEJ=$hYkkKf857;F@f^kqqwaGu4?ie)90 zG>06T8MTVw+5JcOgFv*~aC{}H(2~Ab5tnFAxV$2EDZ9H63|F$=bUk7eAvRz~;_dCN-EVxy&kDsy&KG;x zZ2z;2{BHzX9yr1Cqrx!ILu9f$W>PBypdQx-f!q8qe_9(qLah-f*ISbKb>4Ks-NY{0 zuP3w|vU}SKaBs-MeK+IOD&B&v0#`cIYhj|@PS*kZP{G9l;|kw(A(sI#HRhaoj@BR! zu6=Fmc5waIb0&t&m8jPH#!`HolOh-wbid#Wq#iM!-+Hl_c^<2!kYaZY1`7QFK$>A9F0?=tV^i-% zZvZXgtrBN}*{*N7a+2<@dh#NDq$kA+&!d1R1D>ZuS@6rxt8p2i>Eb)q$lXPGpT(;R z*!%pa;O!SS(wn1&4&YhjP~ROToqB7|i)G~%Kf8oB&047BZ?9;GRC4Jg3bP9ZM@Pv9 z9#3B7wji1xyDg)XQ}gscDi44qTw%>J_%1tiNe{fS(0Z)>MB5jDAA1G?A>33u76>vM zWMy&Y*ZDmNn+-jaFt5cI$oJqRXUm#ay3nS$j8tPUr?#L`wy{2jkRgrLdizt;1#VCr zzJeEkI`rZ6r{BUzDKl+a+avA`+$Uxs)p22+Jof}GznJ?8fGXC}ZM+`tj>jQ!9xpY5 z3xa%=5$j)T+{}sa8qn{*EN4rwZD;l$YR{2PKB6!9F|zW)awuwjXhLgUhMPmFYEN1ejMy`xkU{?UFZO!oz^MIB;^19F>+SP&IN z^9#S{`rMqzpw^;H|9Bq|8GgEFLrI z|0FPZQ{M_NL;+lC3k8+8(B?>RZwX4^!g+@0B^UldaQ(-)=KNtox{n%H7ADzDtv90J zzgXtK_<*}meEuErK0BwLHvr)TahQP3)c(caE zvs>J6E?Aul`Bev=8oO)8zoHimz1N{mE+l)&AWt5i)`Zl+qFnJ{wcxMSJ$Fq9+88LH zlY#9pMl%dkFHF-H#xP=H#&&sq{bJIj>8dNc-|fs+H}m~!dZa^t18qm9sMW{M>zUkY zt&Xs3Pq=t7t@kkVVY@Apcej(cC-^HaYzZJ1d_*yHa~(2$r$-Tm5#f$eX0t8HNq8q;`6n-<39BJeQTSt*vtgE`GKGzs)G%%k2z{9`1qjf)bMm@ zzaOAIb{F`)pKJRV%0M;RrvLPe(4cf$5!PS3V(-u9kQ9Rdrq$Kd_V~@g|pXi_htk5ncy*N8aeoztn>JB(G&O#sjwOm5#9cw|k@) z2VkujQOy<0i)G1cYq^!t7TKAU_BgYxmo_jcnOmsLva!*s0n;YuLO`6PEod*0qevxf zu!#}3c*fAlP^~GlNFUhckt+72CN@9jzX9e;@3WlSjW&J@-35|94k89uANMPPc2n)GxAOdii0ay9751qjJqUxTni+ z{GRQMQYt3@AZ6}kl<2)%k%l!YCZ59vuFmW1ZR^dIW#@HnI{t2SR#9c=guGfne0FB8 zbY!$p&dX}1(TYBCUe2oq^e}e7zsKj-9<29Q%$Gp7pfXs!Mz?ko6ej5Nijj@DG!+?J z0+gwv{iFl;l73(ZM{hSH@+HgKoQcZwFKI125~SF@VH9K6dY_dmZ0e9Wzl<|>2UuIs zN^BO249M%cvJ%K55<3n9A!3%!V2tr3%%M#ht@{!zK_#@A<&bW9gOKMCq#yEU7whA? z=IMyn1D6guv|X(JLhkZ$Jn=IL-rF{Kk^B*L&=&CqXNdoA-n5d+F_FYO;`RA$(a!l% zwqrmQ+oez-WELkrUs4#lx(pam>}1b$u1S#n&heoB40ZDtAL{43DTQ7J{0SsKQwT9t z(eIK4L5DAJrIc?PQ197CuoUZqK%dP;;#kV?MD)|k$}rJrJ|00CzvO|G*3B?{TZ@ji zs?9SVn$ZU!f@9I>WWGL+Vf76?CpF%(e&157G4mSS>JJKG&KSuHy&{toqm-BVZE+pve z7NhT>a%dP*Coc6}+(CLP@}&yh=OyXq9SXZfn?>Ol9%}0H`9il%XA9-_r{GmpFrhlC z`94n(6ybJmKphW9V)lv;`e0{H+P{Z(?y=r_c8Kv7s+Rta-)i-k@ScDvXs9lau)C*6 z*QZMbmIeG5z`}%~V__;$0w-Q8{!=w{Fwv9~6z&_aTL^@c6|wXt+9C65B`-aC1QOKk zCbTB!U#B?FRCOjA+lg>qD!JHhd;qMYk}L=pJG)u_V&MQ0uwLvx0`M}gz^2_H3ka+8 zSJqYQOI!w2^`&|N{zo>c}b0$5juaL2T4Z9{#+zv1bRQZ-VP99}1$GK#O&* z!u53PkSFnok12ZT=#W*&5TSD*VD9`RWxF35P947s3#XnpW^AUT{G(%DV>&tEma_fv z5(9DH-*2`XKN&U-;UlN%1%SB`!wkd$;3wMS7rK%GYR(7oBe79mLetE5g<;wga{E7p zwt$T%UhMEDpC78y{>p!}(E@iyTSb;b3&e@c-_HNZ5-dSjEPr0d{_ZdobRRGcFlPk_ zvjwJF&*u-aQ)qZ`hjai;9vVMsJ0Sq&V#By&@i~a`0S67BpQGs2@F8pGS}pu8#DZyT?uNwvg9KR^&7MhEEJwa6f+p)Mj&iyiB{ zZY(*GGrdodJ|0GrUW~r7o{-X0{c)d%&m%N8c>VsXdj#6UI;PzyidU?}9NIg)#`3>* zme+=Ks~29Fc#x=k7fbkoIADg1*qc{Oz)oSxjezkZNCcn{dp>;t{Rg_gJu`$l-__Xc~V4UQe(F!iP`Jzf|u`jL& z<@=+j;d-6HR6ufAW4EA0N&Th4!GO8`*>Ido_I=YH$uLig;D1?!tU0%hJ@*#%94Nao zPbx0Lw1)=x8)*3iJ-1!zD7sarB`q5+N2U-`T#Tjr1;2h66;9t+KqGKx={TPwVFSho}P`K;V zB#;ivGM3nj@u)T|yd3;oH#6Z0-bdA^@1vVl?(IqM_p~C<`nKOBSMgG-zc&K`$J(LOYYwCBKuJC51uLf?-V!@o z!b@ruAsx>B^{MQ!&U@v!S@88kMVs8Vc>P{g`W1T@LKGsBPtSZeNadf}X#WN5HF1^Z z*uQ9g4x|dIX@_VB08WqWWIjOVvm_3tETltNf_Y|}G^mGI{fGZ^e!mYr?&aY+LOOn0 z1Lc*W%%fz3tl$s zAFp{ZdE7zqBCDjf7JJrK4xF5>QKd7Z!pq7cUIvKGGx`9hrOf76M_{S%i$r5 zGkzjcYT8oK7510|eZf_bMChdOl7ZqpYxdFLTTul>e0SH3zaTeMW-ifv;y08`&+M%y zJk<5j`E{d087(SM6gp|(GgKmW&Fl|c*gGFKN`E;LHDs8hv0Y{+ z?xn^n?IE5%`h%p-r!%Y?M`p0Jxg^F=cI!ycOT({WGiaN1D|+nl>A92QnMbo{4D@ZV zECsVykEA;W=q(&%k*{2EvM~-fXfJ9~urNA$yZ&$+$InG^--3PHj}w~?qpy6M(Hkf^ z8JaJI+xbssAJ#WklL&}hNFk?geeL(=d(bYu(R-TMZUFp)NeI9I@Ll(>!%W*k{>+Rn zX~~kx<|$UD0l_la_j$mjL}C0>*;gNK=Z|pto3K%)2nM6^u|eu&H#5ra?I6CzuY<>p z6)y>LS@+w&fdg8lOF+bO0%wPRY>FusXstHo6!*O%%MoEZ%kqMNOLvDgCde#GEAMQi zEe#+G2d%vygAX`I$0{mj5L93H2MVOm`%%3MFN5sL4)kxXf(}!Z-Nf%|*S#G}76L4A zwlyI;Rzmb$PslU4ex?Zq4E61TJ^Cm0K!`@9=IL+!IX>H=b(9 z)*5+-dsOt|u0i{PAvWB2EbAMK_2L1$c=I5HPK4%Ghf_K_a;2_jq=;0$Vo|0Z3#rP; ze_3$U(C_@>^W3-B_F#XFsv;=^5LS;`m9~&vc%Dtu7fAc*8ilY+Z;Z6UnyIUw2&lMJ zh~6WJBH}Ymjw@Vob^Q9eu(@IJr+tqbmNZC{k{f_mA%iS9Ih%e##Cz*`HO3tOri}om zTDW@q5#ZoDGaWSPwIh^v@%`gn;M?qstuo`jg~TP1XVf;&$nNg2oQz%yyjREJ^WS|C z0b;^Q$_5cmb-cI?R8~eYTj`6v&SK6_^DEA@zQeZq1^tJWg9nF-^Vnh{s#!NS3v0dX z1`(!)B1MG(!R6#2KwwO-uTJ6^K^;6+K#%ZD*ks-0xVYU3BL{;oJ&tLOzrl3eAt>pP zgSj{et7&X$?`5IobDZ->$-E!GajpQdnzn%V!tEEs_idfI!o&sVm(U{>#7Q4?OHEpz zCth%)mrtL6v+eDFg8_T|eGpRai0@e6@x$D0*hqS0>@8K1R%G2PtFF~Mf2m~Xfz}i4 zw3Vkf`ZPO@9~PfTW`-L#Gf#&(rg6s6|F-@}pID9)sJnR5&pGnwm*0@q&;P=vk``qp z3~i-&ftuYE)6R1NfJohA&ycGF`@GfjGtce7S6Kp&V*n*|1%wO1askyGth<3HC*IXn zjpf`aa|egSre>=F4j{v%1{rSmk+pf;g3_kr)u)K9N0XoK z*zuu;)yib>tp{DIwSFH!!S7d))FCCgy_$a1%td1!VR&*rn}BK|myz~I7aU0R@PUZ?cSeGyJS zUi!gRbH-(+E#98J-kihW6bWGJOXe(yGqHC~*%&{h;}+ccomQ7lKn@;5_AU8^{utY- zKDg@Qa-DkE7HvRn^Etgyz8O7zFg<^pm#T9jLMN_;m8}0+Vx=TvI9V7L?iU8y7s5qe z{cn(+)1af0lsjfo4Vfh6;N*MB4vM8ly#b_s`{)28*{FPN6;zdqQ*rEq&cEgCn%S?cWU+mG`aux;YgwFP=X9MMZmhj% zuRNBmnoRo4*9mOem4@}iw_c#>)wvbti3vAp>Ea7$x(ZDMi3%Ch-qIWQ?SU^0^pQVLjl+)$l*H?MXwhw5VssPcO)GxLi!V zGT)q_Lh6go0j9nU&+zqx9)Ss-m0!p0A;=_9k9dHk;>K+h_0LI4r`F`;`%GM|9&vt8 zC^YuNU-YzJq?#^WnZvh+LWYU8;x+OhznfUldp*>{lBJ5$fj| z5r;lsx=!z)k;~Y!h3jw8=3Eqd(fws;MmbYvf#o$gy{VauGt-<2aqchzJ(DwXm?Tpc zg8v*S{l`4<|2YCmPqCkoP8nI@hGRVVygqRY_Q$*0qwb!EXblMNi+2xeEeNu4$y)iD zXvYOHH(>ApQ{8(3e+C!;mn)=qXH;hDS;dh`nT(FyAGh_32Y!8LMRzIE1QyIfWm-tu z`)QZN$0J(q>88q;!@ql+nezv#&1-x*22fJrrL*dyM^t*l6cx1l-|4Rur!$^CQn}dL z_G?1&%}9AF72`RC21+fw_!6%@uXo}78N$yV&8405 z{EI89{oIC+-!*J?O_1~h3zw2S^?>cl{EPQdv69^3{V%cjp=zhT7QFH2BpLlzp5hH8*~OhQ1A6^O_8%p zSI)MfBpwMBpWIGjmt|+m6IVF-5{j9yM_^3C++18H`s~6t=JL0)95;aeBxA?rWKHA~a7yCD&M&s_mouYSNqt9n_&#n$sa!1esG zknMtg>$?_O5fr8oQ5+br&hsX_BgfI`*;@GX&Op^CC-};`2BHh!P&+yfueMtEda#|P zT^_xsj;;v*9+)hE3$W-iH(I zsOe+IAgES875e$0_{A<&Kh66bV)p@||A{h)!mY0T^>MICQw7V1zF{R>Mk-R3XwFX2 z-PFo1+Aess&}S_%vqQT53jo$8XLg1xcMc65CIYz_6F}AtPahF9*YbhWza>TZkXKr@ zRYIm39rRAPDLOkmCViJ}lyV>6_+N<0950&(GoZ?>rlALO<6$GI5 zxO{9Xt2TeqZy{j+IoL$tQ?HH5E%ER4_(ZjvuM zw0_`kR~5HzfU9i8neCW6hnGLdQ-#E{Khaf9>FV7N^?0A7sv&HyIO>L$-@@MXQmF;w2d4VS~*I_PVith$QRzj_h@$ZFfC&KhX ziD9_OUBFU4%tYFg6bi}Xz#LNep2?C~cQXse3aTaDWuq%H$rTg;516qoacf@LzTKL@ zrnbYV@TyPnGRA?qtSMsZRW2KB(iOQhrbI zAf9fV?0d?qD1ON*4 zEwYyl>3);s(=L9twzNDt^-`1)tY5adpB?RV}R& zE4G?@|H=a3^i&{5c)We4ycTw7qtO=)gw**O^(;VrbeUgm>D9SaTVu>r9RJK!eTV-1 z-;p|17K;Ok_o?^awuCmXB&E6$RzKhGw4eZs{_t+NNksd2ms5ZVSkMaQKIc-xK_R0y z-38a6{~PaSg2IBSrS>;b5wxW{CkMEHS9|I&aM|!^$+^d!{jXnh{(f2T)G4(=kq6b=-)Gia+V|@#E;V+zk%0QFSL*1MnoJw(WYI_R3%2GiuXDCL zPOQ4lhG;2m_tZ@$RB+%D#H=;Nv}yyJecqmluX}kzhvOITj5<6O#`g1XfWd$zzDvnO zwkt+;IBMKXP+PP|_orsQ-b{qh*q;hP_53{P79kg3t15fuC)5Hd61`)`rk~ay-P~hi zvcvuSHMb<*#2!ia!N@0(wiL@Je^yjvZUK9Rj=a%WtR~JNDCOM?ciGh+*T@w62B(t3 z8qPV_vQ?Y=&ms5U^D0a!O;t0D7Rvy|ORXZhUkbYy7ZwMy z(hSJ%)KZrju;2oBqu`HBlx_#4aY#+NP4`FGb+INO8>gpfM4!`?_E;D|P1hs8DmHU_ z42p$5tnqS6N{UoT{5N=hF^D`zwVsn9S$9+!#s--gMsPJVw-X&{Cadf4TBSdgMX%yxL;-t^#ebP+imQ^qWyDA>sQ^ z26K8Z#r>>Xv8mayP-%F$8)gl0vk0R%XHF{FJM4S{owh=o+5Tcm0I4-a%mMbI1t<2I zw_y2|hj`l{nY7FWUZ@6CF9)oB(OYF(AyUt9kHv>XP-27~wAgPR`%9-XF|O4tV!@t3 z3IzDSbwOX7n&Yf(!4MJxE%QtV$#U z0QGAvQb$$Bn`ZXP=3uWvKElxC?f|uu%czs*p8dn4E9d)l!jU*pzo%+lAS$An`u)Tu zp);jhL8v3nug6~daV!d9;C4bb_%GC~VXcSK;`Mx-ZwI{8I!z z!7jJ;sypSuk9|Vy0M5s!&7?cI|UJ<6d?&N~WEp^Qb(|HOG#i)f=%^BF7g2766 zak+jIk}>f-Scp)pS$EkYjQj{q71!Msu|~aC(EC0lCmykFqHlM^%E71^ACL*DnJ%>!EqH z^)a~{|NikMpR^SlHkc*s%$ecQg}`^iiZl)Y2S*WALfyf#waA4~NhKZ@f@%vH3YQ zt=4H?-Tcb-JG!!89WU9_?97)PtoOeMc7g>vuFV1W`6payQ0}=M(+OQ(Q#VS zUffursCS5u4dPQ4%s%g`=E(gXuL$KwP44J94AxkZl-dQP{^(g(W9{EH2^$uEP|>%~ z6iSLn4?De}Z$nkGFT^T7dDl_!dOaf5$Ci)|!rx<-UL$9_13$ZuuxzBzfa^A}3AD=@ z8Zczy`QuJ81pefHH)A*MpU;)gkT5255ok`Q-`H1vYDQKYZokqZ1kVhwdeFn<1N&gB z-+egI+MU_thw^;&3gHZJ{FT;YwSu^NkXokZ(N6Xl1^pFs=isBd1_ER0FnG@QnxI^t z5BAbb7A+hk#6xKQi}SrVNlE#TX*_|gq`gb|L`D%(K7u3lFzR9(2~yz0ox+DZ%*#O+ zFWxjQcubrSGnLl}Q7O(nMQXQBg}nL4g%AvW#`cTjL!6Y))~I7m$7|)bv9Dg%{i5eI zUIV}Ihf!0aHykeKncM4$>S?~Vw7q=A=iU3Ga9kFB8b_bLaD!P$Zgv~hOj3WXY}vX| z*yaiU{nwG^qpKNluRUfb=&9V)M$PU{w-%SuJrP% zQR}x2kmb6Q%DMsq@%28z9plgSBahF0Rp8``6?EL1gG7)B!|bb(TkSB*yah!#dIGXlkD^pZ3F1 z_6$lZt}rUyO2@quuvj3T>>A5!E{gpU%*gCHPAo0X6voC8I@Jjcp#bNjk6`6lO4>UQ z1dzTnt!=4DcY?kgc1{XODre%%e%!l^O%PU8OxxRG|1(0wf=Y77r>(*9*;{tfExF_r ziMu0ca`oqLU5a`~^Xk8Q=Blb%GMX)Nl_wWdwh}Wd%JxzwjDswr2}t+2bPik@N}RBH{2kk9|W zTj&42ht6)w`RW=LO3kbNxUN=9@}&3cvUPEU$o7_lv}Qbmx&i@MGkE(or~ac8MyvqB z`N?jQlsCnRV}v&!Ydw}Qo<++K^Xp9MtGhUT!+`5|17Ia;~D4@vzl*oa5v9Z-Tj zZ8}sUIlL*qyrKi{)eDILSpfB2tf{k2+1@zLzJ8~q;1U1CZyg0c-nO1Be^MjJut&bB zZwOd*X(CP9FG3`Y-%ALc4PGC+K)veCs-6_K0d76Z!fr^!8noK^Ju~4E3K5$}_+epFz}mu?(tntQ<*SbLKon zzcdfz?!=`Ks}&W={D9-mIqvD5s!~3g4`C_yfr>&|euJ==68F?@snQndS3_#rLzl|+ zz4qy{NsQsFjUhYLUV_*v$vhluy*cxYw#Mv~29>p>ce;HF*z>{Po`^c+LlA=Mm5lw& zCKXO?0?z0ZsoiY%Ku(0uh};>j(Iq@FzZ}ep26atIY!lRG*-P;W1DUO^Pet%sk?0prV>Eub}MeF48fF;&N839lQY}|O9So-QV?U}SE=YZXsaakM_h7dFwM@- zXHf!a9cvD3Oiw2q1Ff}Qr9OS8ClGF>zc68u&o$Lsf6=|0WvU|{R#Nfr(O`g{DZcaQmQ`D zx4p+J3!AnET9KW~&5U86?NH`B{SP41*L$U;^iXo1J!!elmwjm%3XX_AWL*(2Y(LZ)FzU?hwYn_f@=A3?1)jKm`I!XMveXaS)L-Iv zi`gW!K*2r_-_EnmNq8aqg>n9$E}APB3!bNKR={>Nk2k9HN z&d4o4MaPzEMg+z#ck!` z0?<8XfWfW}uwX`t4E!9V3w-h{g!8KTM?b304aMH#V~i!&Op986t?-{N<{cHm~B2x*iFerEc58Z6L$DYV-PlMpP#wK4?*}b zS@wg~7!Xra%fdp}+9t^CD=zGw_$LN4HR1Gg?-*(!i2#DEuqb&DMKgDvmCmw3Wn=hO zSfsew9X0?HMNg;ET;|HU`3GUhl=|RTz6*t38-*1jbnM zy?)RMz{oq|TH$bw?TWYgWFp%h*&k;Gx=OH3u)ixkk=}ZVcU`D(;cBDx zb)hldE#@SeJ}K}U7c)9xUF7vT$KmG%?6q6l=dwSSELs>Wj9$?}lTfGf+f@gAs+!4H znG=Fm^11@=*CU^bTDh}LsRBP{b#?tIXdZOM?Sc}Y!n-|-7=PtC5~)36%|GcL6Gu8E;a?CnMhH#=6;ooYoa znL|T|@IQ?CC1^j-cWW^QfRO$6KYWQ7iEQD1_ZR8T10+`LzW51@K6&a(z%zdWeYLLk z>q723Z@T>RFwF-a%14mY=p=5wnYfu}Iqv1G167z6Qxe=&#D6E&#WHkEU?C!Ex+cMU z;!bpM;P1%(4scxq(VCMCOdzHRzfq3p;B$4p)L@~r>#MKD-8o4utg|hH@W_tQ9_m_S z@748Cm=6mezZEd!e@O}+4bdJTO5)JdYMg?`!T3)uXO zsU>RvK%S&pX)k67W{2#?DLLu8wVzzr^P#F9dtE_Qrh}x%19m$V4E#C|SD?sHuBZfO zllrU3iX2|BeR>#3jUG;28%H&lKcI@xlTY=y<@9lxMj~E0gU| z(X0sOIky>)+~s%oCZ0Yiexs}gcNJ`Y_vw3%+N|c>eX(KYW8_Sa^?tx8ACMu$gmaPb z*U|mVKi;?GF3Vf#_T~7>q47|V3NJbxNzPOhr(ADIgf?9ljgj@8Pl3)%lJYgA3SAgT z0fZgnJgk3NyGH%!=ER-;RsF??7-osV-pB2!n7VL9A}b5NAAg&hHrF+c;lXb=hi-ON zIeT%kH!n`JpJaIa(_DSySg`7|NiRFqkMUw09-l8(pDM%EKB#&5e5}LOaD?t+d6zG$ zA1{}6_XQ!p?Gf7mN7*~W<@&`e`|f_D2RBV(xo%p&vODj#Re$|6y2xGpPLhPub@%iwSEC2c2c|Ddi z_=K%SyZE6%2t(tu@(eeLV?FnoH(O(S>0^$f&%Mre=7rCKqkf5M5o!%0$n}E!B7+Vy zwluLR*Zzl6d0xNsBjq`?+ywO4sOQ~85_IGAO!7t2%IR}Uh#^eGoTfjtegjB;FXLaA zeK;owBtwyVUT}BZg0^enHJSn}B+iDfy0P0H4pVs&rct*+W2-#v;Y($b_p#wI^B7n1 zbV;?(%=m|C%*Hoj^=O7rVsrqQZZWoDZXPp`wx73E$cCQI#?SyO3dpiGdeLTD4!QZA z5`dNV#Q%;Vb`qNJXatxQX1L1+fL*c(YLmT0*Qv_%qyw*`o43#9%$Y5_%y>*4B*>xq zIGF>@$P786-rgUD6;k<$D6w?TQKvM*jS$ax;^udunU^qx`uL0Gyh{Pd@v7!U?Yw#n*aTESthde z@+uWjl+zD1Rtisu6Wz1Yy@v{iVPG>oeia1-;soFn$vkA|V*CE>if*tI;i%_mRYFIb z{$ip%DNU~%#{O&ynlDNVE-=2^H!O~>&|ac>*5SrXuSk13wkuoSk2_pf^$ywYK(5N| z&CZx^e$1nM^J({5*hH-H$G~hwoXQ+V4B0PxZo)4qk-TfAZI zGU9M>n;||m44bPlST9r)a8sh)Ut<=hKUtKGJ4941O!|2DMd1Qk?V8I|az@bCU`Iw9cBXHlXB>Zj_gj!SdxFI~IEOrqJIQnJIqr zP;J|GodB{pCNMp;VE8#syD-;&Y+KmS{%-$+J&oYV=Gt0KOM@lScS>Sdf7LVFOO`c=_4^YA5^BG?utWp0@W1mGS`0=YBtr|YZ)5Olkw)cr|>6$Ftq!{l#Y!@M0 z?)n_^v7~wBs;`oe2mJ>xYHn9Z8q-^p*+_G#Wv{gwNH!S#b*i!4v{U zEd@7Mu>eX6Z<^AaA2-GM5)_h#_`lQBeftK!<%fB;g!RuMR-d7&H8=5=I-B1uhnDbJ zH0^+a&ZiCf9?m=0{K+S+LjS|d0^ZjPZqJWWsut0a@xPVHTAG}jJ>AykvzY|mOzt!^ ziFb5dqsEhHI|`oGO0IGr!v@}?4a6^;wI^cjaTrSfudeewGdW|gPaGD_2?H3LcNQqN z{llc4*0rXb+~OC$Ldo^4mhFoxi5|M6xX|Q~5B#wfg*WpXbbDT)M$&f}kNbr&9!G z9Za|$7_)Cv>`4u(R-CdT@>XQGqaAd8bC{Mi)S7%-9RkBN8|rnO);Ipz6fpM$xFO>BNQ^HSAYdnt_4G9FI6&g>ID zt-at;_*y;ScmUzf4yt-IJFe+c0pXIKVr{tFPUnjQ!Y15tf-hJ;dAuNxR&uYb#pl5M zUI2A7u|pSPzZX_m(OtfqpIcvJ!^qK+D4X7CB9=dU{~w^7YmO;gz={HGf6aCIip!l` zm#pLBtwJ*5B{l_5{Ng!2#mz-)P$+xhS+$awk}7?#miU6J?xq2^yx{eP?C0^=0I=yedYp`9sDkMYpHv0=dA&k&Z-r#md-6V87?F?kJ_byeTZrQfbu1@ zqF+@OBX1UR<(@|$o>$O}RH_3i8CqPf>m|ETENmkBj7hn)v)+jM&%r5^1$!m!GX?S~ zD{hM&m%B;tC5Osxfj3JKOSQR`%IP+KWt#B%9{tS=`P?{C+P;+XXkXk`f-E_Iw5dmV zv0&Iz%X=pRtuCn4r17x*u6*n}aK2rF0>vVH)1pV(65p4s`kzh`;GEHruYhs^aqL`2 zl#V^cbta4#*e8L>-29&OUoC>-GNIqL<@sccJ*^Zrn=DYcJqGtZn$KA-$Tzd_GPk*N z@G%v)b*?)h#SU3>aoM4+g3+3IA|n(TCL00AVNO4@(lMGo)obzL3n7c8y3<-r0Ts>QXegr<=w1Wyel?~Z7VKn*-!yh z&8n!vIbxhPs}{l#Q1iqlU%One9vS-YS?B*dGJTC@ul+MMyNHVmA;ea>c&Kzl;QW;A zk#9Ix;n+#j$QU(~D0qw%x|6*&O`v{!H$B+T)#!@#iN@^1q3aWNb|TWUWYhPx<0!Se znIO-q)I}Y?Lw)s`Uff?RiAdc%!n!76UXvpLd#BUDvZ6}?TZMxcPNy{C4nKK~{Hi}+ zQguNs+=+<;6utdZptdVFTM6f z1od}76)?Qn!e8HzjD%wj6^^y+Y92BKO<%Rcfeh9I@&0Z)knK<2N>?UP{Car?b`&Hj zw610ZoBe@>fC#x%EwwAAgHKD|NOd7(P40jJ*kF4 zxx>h?rwS%hCi8^ecGjgyr6e?)+c?}C;78B+Sb`zDR)++LzV{Mcp)h)2r)1_f6F-oA zVg{M3B)-G~((0^8+cNtF3=&SLs440kJ_Zqt9oP{{Qamk2K-_QrfcZb_CoKPY6 zaCQZqr~n#wdWc3YJ+nnIn3}Qx$x8>p^Oe0|`HKQTo~>KylR#<KuYp6BQDKHi6Pb0~}MjI9L%h5#a1%epq~a;|!R&25-< z9>X+p=})mGvqFK*9I3iYMZQQd{uK9c<`90Ga<}1`yD6_n|GGsh-c;hrOy{X+!AzBf z*pOJ5yUki9`qMk(mUlCCbF{(yo)BQ4NhN&RFng|efq9IZG&<@oG8@)|Q?8GgGqYXIP74X+J)Y=T8! z%B0)=?!S90r9Edq>FtHPGIAy(Cq83&X{JsxG6Sot(00gv3-@=ZrGy@t{ug(vJEAW6MSu)kLyElScDK?E?VRl(E&C|Pr2@}5an z=BVEemtNtwO>gQeS4Dosw7P`Ewm>^H?UONG0+CO4M55i&n~ILEZx;S#oh7c%h2D-p zYh$`WrEq8+az!cxQ5a-!EC9aytYzU@-M;v^w{yh^0-zzT6^7!Io~^LvPc3|e8KlbMV(NfT+S^FbI_v5bHkaLO$oJ^PtH}g|W%uNAgO!`l1`R=twK`)L z&5RiJUCRzw&^F0od|Lxqk4YDOf-Y9fXV}guunQjrK0rFn6V5u@TDK_4)&_dzhD9~m zFvJkE(R+*!9vfCauxm=YiNt3kI5x=0A-9{kwEhDj?vEG}>09fp^$~{9bQMc1FZ6xJ zy>I3`^FM{4{(c?d9<=B1knWhM+MmxzY?S5q;E=y!^8Ah@d?--{iv^48Ni`NEuyMj9 z)oVy;^@NIBrScJbNq}5>X1CCKxRP}|@6lKdy0W1xUV27+tFu#!S$hm#!ELS?wE3pk zVRg6YecoEtleW-?XE!JL<(v(L-Qy~=drewR;X7Z>Cbj`~RfI)n9dZTz+x~W@g8PcL z?Ra9ERsw^HvWcv8*;K$%WrO;}R((UN;h9~>cQ~^M@ZY}v($wHjVmWfB{FyXj$#L>@ zFn_+?nTUEwYkJs#rw9w@?#4tTDG5kXhOJuXvCTKM+6-SGAr%VCR`X@paT8mSrcGT0 z<`~xzwstFppvJ3x8SjhtQ6HNzHF-v9e}(uk$}Dtzz_lGyC4sjvbW(D;+0}S6YbaHE z`s;!BsIvyQ4$zzfKJ0r|oZT6f9S|yt#)Mp6r5KFG_snj`;)i+n_*WGi^wrEWz`0@>k9R2QrG%a85n-fFnE|1iBF6SAoEAl&v z`Flhg%0+b_^K#8b?~qb@Ci8uYb>AA_rvn(ZZfVqvF}n@wvS(Ll`EJuqcl=c>Cy3sp z%xs2Ytea(|k4d;(ZRJwsa)V8;#O-Wa|Jk(6kulV)Ma#{Zz^~_N!3UT)*Livtxz50G zD0x^(mh2a{T>&e<`v@_X9!lx{?0#hwl-{1AQR|YoGAN*rxBn3{@C*Duj~2mS#f3(E zIKrB0JC0AfVcX#$_&E7Vw~*r0UuS*^FaVFq)Cq!eJ&>Igs8`rw3Ff8|3@QNz2wK>{ z7vIxSVIFN4nGfw+JQ5GaGMF?hQ)1yfM#iNFjH5ULkYH5MKuKp((#Olt&M*Wa1mUBA zpq&4uAaIi_ShdE4y|dhWG1-u<~F-{D75!WsCaDF33$r;MfI!MaiE^_*WA z9r!t-i0`VR{DyPJ1o=03SJEkRmUw~V6G69|88Q5)Zv_6ms30bq@=6^D{~RO2>Mjns z$YGAEH*d0=TXPUJNeb}k!_y{=;WIT%Y?5cNQM6rm}NE0Pg^xk9^we2Zhs10 z<6E(kUeaZ*C&2YV%nzxTTX?7M=rf5O@937F=8-lot}W)`-#DN9zZKRLOD?#z`pRd4 z227;RxX6u9$*dhjvm(cwq^#;-K^RkEa_osuYChThduu2enZKvxO)J+NYz^C@ebH@d za^tmYB-r}3gzkJr8IHwo-Or8OU+&xkU#*CywSWHIvkNHasCUZ9)r;B1utl4o)hA}GPGGvgEa3z%c6|B3`Pb__Z`MEB=$+pDX45?ywZZ~c zKI?4c?pzqTIy5=BnM)8cjh2+fYJcQ@P~5~4Sj~iK0Rx%Rl=rRM*eaiEjr8nN!%h4^O`8#zw6|Yu1@#9U*(yTkM(!)`C^dbjR)*H$c}!T3vk2fprUe#W28PL8}#1s%XgxiH;Y}qj_1(Lhj)nA@x}}RwjWZYZRUxzVPxH1aB{R+fTc-7@leN^9e=9 zQt>2j-dE|(50fZbFDj+h5g)+{Ob;%~}XJrBGr|<&Wn_L{!+?H8|XNmQDw2vDB$$R5v z>Q}9OcaZY%h-9SVe!+zo`)X&RD ze}C~h0%pESE&^G3!gpd%#1I9|D|2>1sqHD-zH_mOQ#F~F>dM2Ecm*mjX39#+1CtEl zZT)p?WhE&G>V?p1e1_n`3W0%#e|WIla8eJdJDRS6cSo$efKX1}`jC=|z|BN@P!la! zV1@M)a=?g*Vl1FU+EOnDWUjIDX0unvSV;8+yC%r-(EXq;363CwviCdB!&ou&@3k`? z;>-_;B`4Q3s`X0K(P0T}i~wO%emMoCA>Wz%o+d9N&1K}Sbi8Ba_($4DwB-fg#;5ga z;4Zq<+_8&tzc^K-bZvRfqvgb{AonwOhk-+pT$byKp#IX_#Yr&+*WeiE{3?o$porY%cF_E}2RMVknPewug5onG7Q1Qn~FAY=c4M zhWH(!mxm?-!m#hfN)rslzfj=h-qFt5`%n9?GFJoBBY17`HF#HhC~u1oReoxhoUneg zpiirzzw$QEMf86Rrj>APo!fhBW|51AbJH_QI+sBZanCAwoPCFLidz!BbqlSQOp(7Y8w%GYUkwYA!S8Ag|8Z&*hy+9b%#G!NR2 zKyO3d$L^1A5nfIC40DZr{5X{&^9Hgwqzn8r2_@;!8Er;aQabnE`W3~`Niii%R{9^Z zBX~VFzyGw{xFS*`P~iUhF#k91%Slb$9SI|^FABxa`DPdYg1QtYZK zHnlath%k5zp631pvVP>g_tSI1hW1#!dj$czGgP2MlJIC@m^s!z9cgHY!WK-smGALF zZWK)FbF7hJN8$0j+UQN$z!{|uA4*^W7_B=c5#E50meDAO2z?5?{OL8&hrQ;CiZz`F z;E|A~K5u*`<1+kWqqRim42+si(j#+Ic8V&=^x}(#Heghl%Wcq~W8@r)PTa1j9X#yU zevAT(TCixY57xe{5Y-at9oHs#?Kv!sj3hOKTq9QYIc)-k&uj}fW4`pIT`)ELUQ4?G z*W+Wl_!Tibp-?`zL#TVJ7cU2wnXhliKi6R+eeyPX495!QKNPlZX{roQ}L z0Y)M>0fl4;oTj8Vo)bNkCNu5WIrOe0D?rZ5c-@Fg@+7_$9Lhg}ckUg$jC9*R)uP-s zG6?;)U%2E>n+-@!4UNj$1{n#bk-mcave-Uvxd;9djyLm!$sK;$JmcTegU?9l15p#_ zSzLa2d+$T+dgqY&*MQ+*$wj9~OoY#iA^~dAyG&inF@GGzpI#a;EaE*@Pw0F{P{&Wu zoP@SWPRY8Po3CYlz`rZw#x_Z*t(O@4+hS zex}mY`r&~~1i!G=u-+U3IF8D956aO@uK%!pA~2`>1kNUlbaW3@Zf?0&nl=iG8@BW! zg=83yH&QeQMfF(?4QULx-@SZVd79<7w3dM%pM@!^l!*&v8dI z=&JcNql(02L2Nra$E2w;7XTo&Q7cmN74|!&WPkTrm$A1R zf*>e?ca1}b&cUMJ)O~}7(2s^Fq7}`}RG=X1rFeuJ%SsnJuN^gRriEFDCB&vjzB&|1 zjrhRhqCv7~B=~1#I9g(n&zKOC%_Xl_@k;RvwC``2R0>`eR|E!Z~k-C1zhNG zneA-1av|I@c*@<&gb z`_k^Ft&n+l&JG5+l}W4$Nf=0o6H+7FSb1s{W~?12*B8uoHn->BrEy{tq@0Fjp+Ss1 zV()w5m3qdz@A{dx*G6=pl1WRp?Lx;Oa6^!WSl7P6IxFTrN1v64_KW; zEWu8$?WEMQ>vedH!MAXgyy=(B?hj};L*toE#jB^gqP`}q-C=gQ(z=v2jkHv9zfO>! zt+4(mE@)&)9)Txzv@2Q*FXxn~+0JHn2P{qAN0GAl9wIgD8}VUHojvawU&aP!#) z9}Z2wFCd7?_qxyEKknZl8z?mEchtH>xXNF2*Gk>Uu?DCYY3W1Cep+1(dP{g4ZfhpoQrdU+uF19th(tGc)>SGv3rW0_erRiZCA+ofPRuvyiyQ9vR){l}an zc)W*LkjKpM$M47*^Uo#vMp=R>;1M^z_m5LyyMI65h#DK@@&l6{>MQIod~({T1|2iX(zfZvfE{Mpz*eDk$^ zWk|B?Hs+OIRR-) zrPh2Tt}HWqn?k+*z`FG1p@q|p{psAt>MKJ05!TfDW=R+DgRG1SC0NUuytK3KTTw-k zWLKK#0iJ`npW8U^=s$w%17IsDldjo>kb`Z%TgFb^R;<>lN3>)4s`Yrsuqw{rc}cwu zJEw!@T-9tuH;_b)&P2u{9lN28>DR{hPHeqrk-mpmcL4i9D;c?iH9)NEPW;QR_0PxC zEE91;iAuU*%;WS>_bu;i+X#&6O;{xu3 z+PHvD0rTTNL5*Ms{B{8@`obWgJopn?Ve!=DfURr2kSqG#&I{K#z1uGO z8{bbl8iZPt8l?4F$KDQen4>?N=(>e3oD8!r*i+)NynKQn-_fGq2utZ)lfd^!oPcuS zzS@$QY(_2;|Cfappt&!BpH}uw6Lzl5t}|_wQ?*wH&%jG#;4vGVv)ehMS#@68>~xd8 z#;?|T9d&Q4vwF;?@FB?UkZ!H^HIT!O*MaetCSFoWQH$V4;;)mGRWC=&WRV7i$V zxd+ZPYm22>t|TCmV?IIPoTx&E;jHWd zv4*Pmi+|NzZOldo?cT9@Qi;BV!vW-q1Wqe2il9#oa($}&z}crX_fo#34&=Gue$x{A zdV2k{ieR!1FsBAz-1EgHzxJ%2KIqap4_{~TR{>iWU(%abjkAMIO1Pj0M@?IkaX{~nb=r|AYN3*0-skpMFpl+15b^7Z*a1~W#0%ZK{W;VL z&4C;$sbdz~{5b#Qi*$u*Pla>ARnYHq@H;Yw|*eB zo&BTvN6>9N>REQLtyEQ#I4|Dz_x-*x53X*dia3R^2VrufdPI^N%7;HXdgc1pgYJQ;iO> zFI&#j7`FY&8k>-lagnzepz&IYj$ejF^}VHatu#GCgRU6QZwU+)=%e|%*<^I>u%i7- zSCtRc@k1Qc<>wxIbItaGvWl;4Da~q>mFp!{^9(Qv3LWNG?ELx&sqwI6)gXAGEH_P` zvTPO{VAebZTZ5_0MqS%y7j|u){tRw&XvZ3Q?0KzAhEmI|EWlPZ#KfFzWvALP@l*3- znn&Ae2T$Lsy9GsktBug56pep;^y_fNZ!R?Td=K6QZZgN;PRKON$85w#S15zM*`$tb z55W*Vuz5^TO63V^v%-hZy?y@`mHf&@c^$7ZY4>Rs@Pr3-A`&-Q%#&(#V~fD!#1plG z9==gnl<+nnYqjIyDvUBPvC0$t^0p)Mv&sDou4pVc*}m5S)lc1j+D{_tAML&dZ^#RZ z(Qn`O9Ab-U3Kr0ZNCQ^4Az%OlV95eT?|!>Ni218Sc!3!!OSv0@4;y_He8;3;@Om=7 zm1{y#*~Nnt&1nf5^l)uQ9mp#!e?hHp;9g1(JBTfZ6!Tf7yA}x2FbI|KU!wl{YOL!GisJt=1Md%*YhTq%6 zsJMLA3pWxC4_2;@c(|R|7At`Ga_*4Yn@0S@OmUPDOMVR)D9qMB87K#fr;}%~4}(1p9Pb;=L35l?X@WH`zZFE92cZx5%zT8FtvKG_x%9@}&-}?O_IKDNH-l$k7rm=enR>v0uB!2w9@P;F|L( zV&~rGb)`fWv-E83#B_f%;J0s!Zo&|VxlX;SyQqy)^rN*;ZAb{Iuf+NYxfaMD{3}|d z58Xmmo9)i#Ag(snl|GJv*Mr`PF4l1--C85>+myp*;bKUucwh<$t_n8(?o0)6#WPd) zSR%-)<1EXXt@$dFir_S}*qQ8$GIl9otv&aV;N zDJIqs=lD{XM~eAQBA*&wM-nvzPHXL%%(C9A@aGbM;;#sL*_Cne{3c5}y|X zbF>IN@H(8u>DdeH+l{yfH|QA?RC!Sv{@ zvLc5--+h|eD65`661A!OjQ*JZmmd#rt~@%IG0c2{p3CJ{`gxVYk^sBX=3E(biEFqZ ztaBt|0|mZ%Uo!^JGq&R1^C0Psl9yVzq_!Ko`PiIFE!S%d^aDq)tF7@-T~4hngnawT zl5k$$uJ0Je>MxjCUy}&`Rr-wa{gux&SROe6c!<`I2a9WIxdwt!R5(&?gYhM8KKz61 zW;rely;G@nBFuZEoYV63#_fYHuCJJ6ZZW7t%Yjz*Wu`bL|@vnF6~LLr-dmsI{E zg9vIeMhqT|bCWopCYo?=aFcAU?reOz8!Z6pNsRY|#1Oe_cdu);oqZ`IAg~wX8CNR& zE_RPc!?G_IO5@i80WWS(TYzRug)9a-BCD8;Opv~(sH9SGHPx@3*J(vT0 zOGX#;S%uGrv!+rN*Xr=}*0rd$o@bTmT~x5FMPicA*;4x952D2%@Tw5kv9q~*U~pSr zXik$_zrV?Q(25}mTiL^eQ)1wvo2Dawl=Gh5yx5}vad>dLs>0Sfv=*|0hr&8@k(+`> zhLg6SNyWs1emR8S>H7n2VOB^$XYfta>&|be@Jp~oBD*xDJ(Qs@9%h)+hY{hrf_TB( zXMy`8c%`qllF2H2|EQ!%`FbFX;m{|^iSMvrHh?iDQDQwIH-O^{S;>8^P2=@C9Qe{j zkYrQjk-xfFUnN;lEKvz5PPGs_Kc%*lb@~E`h=UQZ)EfKkoiO?-L~Z4h5I+aBC*eNp zbx%GXd_txt!a7unW(%K?-%)dHht4+DR9}q;-~Gp?jmsKxZI*Y5j^dBgPLkd{_R&IK zGcGvge#R*_#LtqsWUv_J>je*4S!Y?q6J%f$UlArjar({?q! zzGHLTw$XN05HX^f_#T~N*6$wR+Jd?Anph|=A-b%+4&%drWGxYG$AsR?oiKsa8k0ba z{iOYLH@Y!N2xB+SRmo5w#@t;q|K_6a=$-m2-+Z_W<>x&fl)nG?$(A{I6PY*Po(cC^ zmK?Z;!}J^YJ&aiLcN-&1Th+}&boKeo)!D>sy_P&NJ#T0%Nx3>BdUTu{LhXvTRQ#|@ z_Z^I(`ESuZ0R_QgwI+gaT}q6)%5?`60CwoMYqY#QUS%zJZrCkO2Ho1%N-@BO1yiej zJ8WDo-qUp><%M`P_Jf|F_kR&JY~e9I_L zF>|R&ovjXaa&pzF_~~@FRaJvIXznBnsVPXZW|XZ-eKBr)E@pIudgQhS;}LecI+f{m zYM5(6@U7bie!@4UhHn;&Mxr_4=FLgt%Y%OW!#iiMZ{+N>2j3=)Xs(XDU|ccn2=o!$ z{MZE&xKvW1$}`d@uLIHqTz8V+9|*+!dQid79{L-d`L^mX7Z!lU&(y8dPw#D5Cl&1k z6?wjXZP{j{NND2!K~Q7N8Zc-s-&q{ZX*j@NscC1~Sbprs_!Ck$iBrQ5U^5 zBbX2q(RZj}Rz55R4Uxb*qYU9VjCQV1D;$4eg{f%eW;FXjmDX5ROmu?b%GIevy-lHM zGfFCs5O7n8=B*Gi1hyb=YurWa7x$@bmeV~KT^7?E7Zdf`eBYF(+Ke_h+vGepMYaPE z?=3GMT;5W3656S`O8N<1aiXq&ec+u&ie4vtyOA5lXjF*u$w8#U7v`^xIO#P5q+~bx zs7+tC;i(mC#^b=?kfJ-wsWj*;Yke;G9pnbz6I;V?_Sj5V4CQ)#2TI&Q^Fz~KU zfdp&nKadyF(zPdPxMZdimN*dEkp^Fp-G1Dqu7RsHM_hmUe>h4!2DpkLJ54N7+a6UJ z%Gd5l-HwAry60YkJ|I|mqLT}T5;KGX6U4LTeV2a9pN0^MY29kZdqeid1=((Vnwzy2 zt+(9iP(U3u#bI(Ih9-Y8mQ5R1Zn)P9qMGr9wsqANnN2a-J_E#+HFqgwl4m{{ntQVT z+4SN14U;5|uInKwu`{r4MxV8AUD4IC^y;8pjK?zyezhXXQ@o*7(8Xb%;ffoYvP#J= z|K>A<-R$WRp*v(x9vl7mQF|#$v)GT!7lNn@$_an6tF-#c0^vYQPkskq`kAf!(SOm5 zM(kHx2q+l;V^R0E88+Wh@%r`X)H?kc2crMJC`D@p>HkwC%wk`dgWN$A)c{F%Ib*g4 z2tOjohZY!egkR2>gWYl1=baK$@bFuY<0_>;9kuA2(}}X9;m8S6$e>-lx|QzMM+~Re zh%_G>0$&WOrD+^I|8ub8@>tiv5x>}ifc%%od6Ek*x;l+FF@6ML*w3;6mF0f}DmPx& zyLwqk$64=i=*vAPX>J6ix{p;Z>2vkRA3|4i!v;6+bz+yT5p$jsnI?^u)mQt`zQvsw zZQKD6Jrn!{S_IJRm7%mpFzs)-A?a)5nv=EL>Tc7E+Al2aS1p}t^|Xg+*X1k$nUWQu zy3+HmEeA<7)ANIE#}+L`MZHgQYyof`;{Wn;azjC9xgn~1izhj0J|VXS_u`T-o$*bS zF+^GzZg(xXVG=P53{|&Aw9*2P>1+lUF{v|l&nkz|?G$MbUSw=|Sh~Qc^re*>g3*to z#1M-YBq*;eOzmF`cBMAQ5K+Mz3C@a9M8EBw0wt}fOoD}T>@F?xmGtU}UN@?Gx8P_e zO`>^XU?V+w3o6x-(69d?)=_6B_pFXcTYtQ@1U`SspI$p_Xn}Z+;yyp~QG}LRezi|J zzW=(x&8hp`WeaT5ZdlanA_q5Jt!iW@Z$EB18+2s%LO*&l7Ajb zs9&W2+SYeZbzRWa3@mqkFJg_qgI#O-Szfg6_}lYZqx=Ik;aR?AQ=N=c#t%M35fb+V zrjMUzP!)n3m0CPS4mLssC>FF3lNu_y%d{t>!FO`$G(LW}7kxMBSlaAxt3#-Gal;qs z&8HJ1CujjFm*yJ6d)|e9XP;3-d{jdO{oE110k(doreiITj>(M|h?-BD`L!C0O1P%A z^m^?v|2&{H8qhx|7iOj1=Y!w%D$3TD$eGT) zqX)b7Dn?gd3!H`x;-S-y6F=YwUYSlqy9-g9tE+()VFa>J+IZyTnk9$)NUf!PKc!h%S}6*hpGJzJ#pT9_jgOyt-!szu`+PYhcW_e?X3_&gsIMYK~pe1`pZsb zguKo=lxY$-I=}SkId(0a$zgWW?{63-%n92uURb`eF0N-REcI&5i{f5Z?7%UdN@+$< zOio-tMio3B41No_yLi0AmE(fMdM^g*=hFIG`lG=;Es3pXaPa*)=R6s#fk}*5HS5ld z2#HrlY#q@@$u-9wm@9+ijhm2oHyknZ%+=kcF&pT0qJ`*kOj`7x5c?dIt2LSjtKHo zQe~R|8<)bNvVF((y_ud0kNox7;g#jjx9kF`zGa4I9U$sHz8J}B2uMKrW@6LNy4V-Pi9NX_4eE>%_TGdYO~b2C*7tYm^}k_( zztNNji2zMG^TQc>2(kxMW3mSll}>kU2X5(#vHr1SbS2Vx%S88Y7g#R#G=2v z(Iv^yf1@cUx9Q)nFs_cR?QA7nZk!gH&O$daFYLN%wY2m%XtLQFBqo;~u=q*Lio6iw z`cgaWj;bT0uFGp2byr(xw(F3K8M`T>butgZzY%coJiIY~8x<;~jzxuMy{M(MY|M7; zT8HDDu^r8!kIzZv>&*4vBNeoez)54_H>fbUFRVUc#rk6(B<|s)=Cd&q#bVh+kZYadya&R1&Wf<+?8aS6V2#oRRP(3maSB&dv)Ur(GR~6- z15x#jWs$2vS@j#iCwUXkyFZ9I&GS0n4CjqlRZ>l}jI`8$W#e~FM{C!@eic9IyF>He z-s#lBt`CUqeq$s0i*VMCvC)Pz2=_N8Ets zV?uI?YL(+nQW3*5pHu~#^zM&F>klXnjyi256cO$Rs8_YARjpl+9875{)5n{i#_!*F z-tW4)(QnPaO3``#3B0y&xQ2HI%vFoCv^UV)yNx%Ma9eRZb`$@(c=QbS@_~P0C!hZ( zb~5IX>$UG`1U^K6t0vvKW!VcRj_(1Dn~jtz=1$dk6njYRf`w98uGSYK8<=V1Sz!Tn zqZkzC)=)d^15R|Fh8!Dr{;a@R<3%ZRAu7lLp1ARR%ab_F`us<9^()km$(Iie7%`~e z!urBVT_}|w%;$(LVTMuG<0kp8r;HGzTgf(KZniSXtYhIYe!cU6^muAB1FRtGs-JPi zTk1riG&h!2p)U5*07}_aO*_4)oSV#wXFezBKGF{CCf{NOjY3_3L+SlAY`Y#W!9V0u zMhghz4IIzIH;fWdZFF(vBU#}hD1EPl`2D0C-+yy|b;Gi-Ojt5zzg$O)aaQvKW+D#<$KErzqNH#^ zXrWK(DdVfSGNZ>j)3HzyLSfJ#1o$uhJ7bay3oPfgodWrZ-sA*Ba;f}UFW2#yNmg-L zGOI|nVjx8F%k_i41&j~;O7~hF5R17j!zk2}Du7(#s2>NJY*0Bt$w*3iMAV$H!f zRbb-V#flmS1{V>!^2?B;zM<~KZJYtiBSl<9vEmxjtN9wQj3;|7g+3>Q*Rw<&>Y%;F zpKrTz2g*NWja&qc)Q-}Fo8D@hC~l#}6Q+xCC^DSXTRn$0+50y{f_KMv$w!Cnz;9|` zZ-n;#6CxpO0jJWB^|dBCYjWt!7!rxKa5%sBw+T{(YRA2f>OK8pHEv=?9wHpxfe)u- ztVG~%YOA`7*ewmW?FIK~4Sd4M$}}d> zk?C_(0fAa@WG5nYWFBcdcc}EH_nV31K22*Oiym$0KX>py(_TdBCElg}5i4B(_iwu> z^Oq?+JP?@M)LH%9T?HT{-^B`KUOu!DR4OHRc(sZ**AH&nhBbaE{0mJjKsV`t;mmp0 zb9;Pjy9@O10x1KGmAgs920_Z5HCH6MKY@2oqp88-Wlw?taa4Df$Cc6{@UzU_qw4{e zl#cC3>EIFfWZ=ELLjs&kny>lF)ht-hw#mK ztfZ6wftARgZ`}SbtYqUKSV_0}^6X_C$@H^aFfM$lGC5iO{f!EJ%bjs*%Q5&Sd{{dN zH@^i9e5hAo7y9N2BQZdnVb=WdTWPDKtbbgk@I<#{2u|Q`<@!IclDU6jB@Mp2H9`g} zmv=Fr%zevF~e$lS%edJj>NX9trh2|pDfEFZ_pklAXOz4vy1NiaOgyF9|r74Zg7`U#aa6t zaIyPMCmU-Xn$d13-_u_tTukMR;AAvGg(Rq)%^SWZT*e9OtY~SsZnQ7}OWYJyTghcG z$>9who|{ST}J5uI~a{-FSDHUSRZ+lXGhSLH}!_0kp6>gjYn^oE`au~XX^ z_TYlSSWSDMm-pUSN$xuFmDo>DzyGz64r!Q11#DNGcv?b8*YMST$SRvo?5}S@0J(Y_ zODR%+%VGtR5Ej4X6WL!cP3MSj6RVo+yeM5-grIavOX=O5@*t!FcY{~mE%(Tsj@#l3 zTwneDv|9X!mXZ_cENPejFf#B^RqvifB5Nym0c*R-qEAfkz0#xOY`?q5PJ25o zrT&Wv<0%f-%QJ*aTm3lg!fi}XU$f;iaSxub1!gf2j=m%-<1 z#y)P*aN0AQ%zei;@2z&rG@txLDn~ZNmDUP4L+R*96XDzAUjnYhx#q=b7ms~mrRfG& zZ@~aGlJGGfj__W6{T$w%)#95QRO~pXFd|4|ZI6IKNizhjBSQ4CiY7PKZ0&sh#g61p zPuxJ;jyQ@{A^&DR{yq`emOyXk`^_9Mq)gRZp@SqiE;^$E-kDb^B(+Pn=zE0t0-6oe zAQ+O@IglgCeN*k|9MVg8OSAoiCP&pyXb%02Xu85Iyg3QpO=~=t?mInRkq(h2)Fa5D^Lp0c!te~14dWV(8H|zt# z8~UhZ+}dv{vxO)M0{^B$1dcX3R8m>A3&fapCXScsG+?Ka8XlGy*~_gbetqa|{1=c{ z^&Po%M3S9};Xy>j6tyol_u0~FDlQ!?ZamUbt(&-?LxJI|=3nM&`?4R|##Z$I<3b`W z91hpYc&dbV>?>a7E}->0#zu7Het)y7SO41mppgVuN9D@<;SHq|aVU-a&(*~R^_YM1 zAiMwKK|EUDF@8WtYj0J2huXkRCGUL`m}&xvchoierq|4XHCDOsjkPfKZ|oriI(RXr z5?tZCfUqXS%-nL_9jgiAveI;jc6#v^BK?JA81hf?#V>l7Tg{Oovnx*ST`fPa$AY8Q(#Hs^-3^!Kzo`#w zP%|3dTu`~T1N+Tl$BUcSs5sQK`I>i}#Fs9&$k;2d=UAtR)a*NgvT~FPxgG(|3gv@J zrG+ILNIeJKMmxN;@XYl&<>?0jnEC8N&?!qu7-@GFo3+t#REOeNov|H)kR-BY=mJzO z(Fwz7azf}?9u5V+0{R?u0BRx+I|lIhE35;Rl+uVCht^3?{$rI8l*6{-h^ zo=Vfj`03lEhe`a4JWInZ^QRgLZj}BkSJy(3+Jrs6Z#{EHfqtK7m!?g6x-zG)8)q;) zx3qakwatcitvezR&!=^Dcb98Tudyt3ANATrsEam-cW!#TL8ONLc+?P8$|MzEdqJDl z-v17RYH?kUV98-@^KNa|lbK+JdAdH=&i{Xr9$mtAPREP+R2Fihm;(Ux_?ESEMeAwv zE@>g7O;W^CG!$^YdbFEL6U{7-1fI19ym1R(?Pf07uyEShV=0}rk6nNlbJICi-Je{j3)_1~@!E9)yZZ>u>Bs;h)OO2jJe|R#UATNi z=1o{XCBJ(ayS7~YA>GF#e?2y0)BV&oD|17njXuKZ-S1h})pR#E%)b0y(9I^jsd!_j zf2W8LHA?a^PQRn(DH@7?iDudHq4b?h`@RqUz`Z3g;T!_&Rbuk0rR2ww86GzqZc(5^4l0i zJsT@#I)yA|+jR(-KL1j8V?eVz=RF`feBw1cEga=6IZ5(bs+|v~&PFQKLHFC+rtMzj z=rdt6ZumFLal}_MnqxXWF92Yx2TEg*VK)4Z+&rck>y_>c*OD&k2r9{rY>o9Hzh2Z% z1@FGOgND%scU{0)hkqNAGL)+hPdQWL=_kx!b@;_1poegTHx(GZj`bF=bx0#0GuCg> zR8NLO3Y>GFMa8`em+^H!Zz3n~7gFV7*YqVI9Z)yKw`zX1st&O|wA8ttRd)?}V>v%g zK5#Jh;Bc`X@Apm?$??rub+fB#5>RwiTXoADRrEhY{zfzQ-y*isSNx@;OhoZ=h?LF0 z%MPbD0d#hc2&(bD+(2vfOwRtb4e1dc>kRD&=a@cm+BNp@IbECb;7ikXlM4OKI@?+o}lFj>cm zmSGa&vF#3)wP?@q3+>*8o!I%l^Us{!rLPjFX-{@Mi94O`!-#o=J2Q*4IwQOB?mAvi*bD=q{A0N;Szi&cPwV_Q* zlZ`?|QZElZ#^;~~c3j1U`0&HThR2-x_P2dMUPGRS6g4*wC*1jE2a3Y#>3K3wUB6(3 z#=6Q;-?OvOTv5%K&v=5t#k@vFNLMOSxQ+W2t%+w1eU>PnU1ePaOUqghpnk zl3g+Bad`?Y5@5tqD7$GTfM=|ni6m7@hTbOZq#@^uemehtZ?Jk{>i#Lga0tm^^MaG6 zvb9Y0Q(RvV`?@WeIv;K#hsZP9y&5Mrd0VMtXZ~bh=b|?|y*_Q5&vCMfr3tFHQG^^1 z%b1)=2V7zc!N7lZ<0o*n+f$WVPUs{mwk24~M6yDdeN&FTw#)BfQbg#GwLTG3vstxf z42^gmm#TTWuOYZnBGpY{HSeTk-&vZ>$r**op-boS+_Dq4pZgkqUK}U&-nX$fxMvw# zed3?4py_gc?)zn}4Z`ZY^HXUp(QL2jBLnL}!fDY9jc3xsxeEvo(ZO z8zI4C+!<8wkdAfu@Ymw9_iL0Z{CMMgLc2a;VuhS z1;qQ9mCR_M+xK-Ur=I)7{!r|c-UKmCc6r|6vK2Kb2N5hV+BepI`zm6=G3RK)>ElWL z5hSp>o4(OM!J}w?eQ(Tm_WQ?aYYl%hAQu*awMu;LE7^h7sGJm@eE$tyU{OqKC_COv zc;dmttwl16d|tbw_{61&%=EIs_g;#QV-KS~{Nc=l1HWDhTNn zEK+iHqpG+AkuLNzLBEXtT=i|e910_iy3l-wO*Y|XpEoG z!P1e~BUv1l2k(r$XN=vda%NrK`1+tH#f*wSpSct?x!-Otzq@7( ziJQ<;k)%Q#IW_^rIs^YD)=4x0HeI3src6l{X)E*Z~V+ zB+^Y1J=3Vn<)4IM#dGhp*0=hXj51VX?w^3jCAx7Mwcn5CFjIdj^HN48yzLiy`q~?L zqptgMc@Q~=57oSomx(3{@|QE7cj%%b33lPBT`QUz){~kW0|T|&*P=o~zQ1v9e)HFx zHaq95-^c5Pw;JdFofSB)-gIKLZFwA%+C;W#DiBy54Jzc$+;9 z=Fm>^ce4|!^VtJ~KsiuDK&*(dOX0cz;595>HI!E9t+i~dgYn$^GUkAfp{5fsc%?o+ z^E~h59{6iBRM>oemt%*46v;tti6pz#)}2l zG%>mcjd8z3;9K;KepklZ@B5k+2Vdp3lnW9Tl~Eaq(y!o#iP+ku(_Enb*BgIdXRe3I z9;+{|@Ee2trGGeO*E=9BHv}(#h5$a}0y|gqKlu!G$BM6-I{s&hiIvONYOmR5|>?bb2$08lvMhdU( zL%P*=^6S-EbGM_J!S@16*-gU@FP5nLmeBxnj|fa!7&0=U&VF!-SUKhU?z^qpgc2t! zQ(ZsQ;O|O)%@8@Ovy?ogR!XpF6^Mf1og?5ZeQ;rtx+1x~;ClZ?aP32eGU4qF_>Kbo zkQsc*;qz)zJ>R%lt8Y^=BYo9($VcH+bH4KRej0GMM~#Heq$YskuG=GEeKE%Ij7Pn( z#II|WI&HmklI~P&L&e6Ws3F%2eh|JTw{>d|zuWNT!v-%_tuc3#T!+%bm?Nd<#L2~m zAYpjTaKg2IVB0UkQTl2kFhro zhr0jU{}VA}%@qobEmJ8=gluEWlC9;6MAjssAxrilBb4lGmWfERZ$sHd){HfbU1Xgw z471PgJ=gEPzsK=Cj_-Y6pTGLA!!a}O*ZcW8pXYf#@Lwu|TT}mw1^vJOBcpyCExy9% z!5xVODaw3>Sj|VpD0o@O6^=~3JUeXvV$Ls`akKkj*=j8^LlN&ijxcDurm35|J7&2H zLNGQVSYe!aU7?=&{f_u2yKjS}ZnTOg80kN`|K)-l;x+8|tM`l12cSzbXBY$t)F`H3 z2Y4VQ7pjV7G9 zj28Wg(M7!yuy7F4#OenR%f^u8Z!=f_)r2cbxK&Pam;XV61bn-rZf?U}5%V2*O@Gxq z8RLXcT?abxK+ZQ`k=6uHvbG<{S?CGRQ zR9bV|mXvzzpmIydL5jyF9dtaMXH&|iq!PFregmYRQe~#s_7+g8?-+Kg`NZG|dJ4zZ z<~IBDP>;c@0ouN}ph(RP@6q{^;^^ptLeq)V6;?l4}dgx7narve0Fzo$ah+@!sLHHL;w4HT_p0|SE``x z02!JZ^{c807kc}DFd7NaL}gFb7ET?ne}t3@ z?!~J@DEjTVRR*~gVYG7>Bo|~kJA=zRr~6O~bWKK|&jZAVNM&d5Wz!N1IRt*(OMaEX z4`;rgNpe2lfXyL-by>eS4mjzvkH%pg`jKJotBe6wL41s?2Cl5_JgtDZb+bh*I>zhK zsT{r=owcV_v2xhkp(A&ZLkLa%54CFNO9WksHu(?mlkcrJ!BZVGJ|Dtn-S;WrC>fMx=ek_c1w6*Vr{4j5Wgx(Zw25_uzSQ z$y$GF?x)Fhic~~(8%~avYyq^jx+40}i&n*1-!U_^afVji#qs}(mij**w9R72J)@c< zh_u9hvCtUlBhal!iC#T5iBq}(YuVjK{)Mas$8{V|C@y&9GkU*N?#!xmlfj{-0^h)G7a9*lU>{oKRXJATWp;d!E zVhMG@)bHJb_OqB;|9L3bd30b>|1~de^CM)%8A>f(`{uu%_aS(v?nqA+!v9JSvrxmE-Qf;;wA2~(jlqjl7XMbri~hX!ciYz7CsBijhOtwV|KT@E zVLLAOppF9vW}V>EI8#>a(mto%2J1W9c=Th&Bk4`AHz-4znM`-2o;bb|F|57f2{8KJ z4r_CZSLi(giZz^$IX)|ODQvj6-gVR5reD&MZ+;Y@u1LL{7y%UlY2!vd2>@sQK(eJU zqfH5Z*b{kdElYkOn^H%p4&X_b*lpg))!6ZVl$$9X8&M-h!TRs!P@9rh1{xHT(djPRSp z9~@qxJySI2)Y<{nq(gO2@(5~rglD=#5BgYzi$zukhnW|-{D?vaRHd zzx)3WME^Ax{g409BiemHMBb@7-CiWn9QpRs-VYyyhOU{2M0jgQz?wpGT42mE|1$Zy z0s+2o&Wz}^z3s93OZ%ToE1v4}>WWK69xU@&TN+5R-W5&Kw=`8Uac$aRu6=NRGh5U^iS4AioFJ&zn@D$ zS_Fm&>9;~qpjM5NuNUb+QE1ZyGM8`s;%&iAVWt?~n&YSWQvKNmLNLdMFeidB7xNA6 zXSl?7_(7fH>Y9P~sMi|PNo@Yyjh~tMF9B0hg1^6|Z z^sAbYjiCaZ2XMA?0S;Se#76Pxf_~5S#=Q?2MP_ojDA*b=|Jy0O3l^uanYreFb_yF z#OuPhsUr)2f`c6YL)&6|XQ*c!x{zLnc#+D^9HQMEY&X$x^y#QNR=l(R4I@VMHgOG3 zx<~pCC*P_^EP1sqn)Qjotb6-Ed?rzy_5C6v20^-iQ-qQ-zAb7s^)m7hdO#k6XCrbJ z_^u(CeqH@gBUS|8oeqvMF6F8B<-5Q5XN=faO0ki#6I+D~S8dMuCP`ab)=Hv5S35cE zU*^1bpJ+K9&quVjCICybvT64G%Q;s9cfW1kDfDjbDC2bAGnp?XSyM}4{6YY%f_3m;ce~L{;!h8la^H~` z%v&4rDQcD8aw-wcbiUy-;-8!5ZA!j@ z7E_gm~!f2=8_cU6c+lqLFCdhc5Z6 zhszn$hA2oZxhELGgE0n_9}Css?M-!O_(u&Qnl*GX&y^&t?S}5ppT{@k*~qMukE}2- znOoHVeRlotS7>`2$ie$;sk62gn;A2f+TiB77oW&;`&qb_{$X6YD_=~VwgbO@c(dLq zF*XtQ>_Ph+`4y%OtDIVK?h)-N?PJMV+rx?q?O7GLC_)q$yMZFHM{sXB86xZvdv}OX zlH+mm#h`1%J$vvjN74yF!l#Du;;QjC@)BIen)t?#LtSj{8_AaUH$QFi+%$od@MK02 zvb!E?a%{!E*g&Lcg={>37+9Cu1Rn}auQIj8-K&NZwrj4TfbhTy)N$ASuZk0Pvp$y z9u?+3nu7j{Q^XYC(%|vx=e~%EkXK7u!EV2YW*;TgsHWb48{t|{3T#49-D}sm1OmB> zTu%~ZE0DX=qWN3Y?sIpv0%?l=v#?zUMTyIXovBHMnjb}Cks3!E(|@o>UsH${^M)_3 zhT!t@s`_@%uQo|Fwd78nLKWf+Aw<)8xr@lG1BBVDo@d*pc@R8g=L7Ui9=QvGM67A; zr7WRe$eG(n2M%RCf-L#T{)-r(>kue83?had8`J)zmzf6d0mDO@=*xm_Q>|BWm?$nf zh36MI^DcSdkZ#)PVRF8ljW@x^%OEkjUPhB-b+>4)=-pH~$300c1Gz5k9hfh%H(jYu z#+zNR$1-NM)pj3yRzOpnr_^}+WpHJNe1I|Y%(#ig)ZkyTmkmdYfjC3vy=)jQNE^Kl9d#jAHuO%0h82E8Jz< z`%wcOnRs|Iy0zuVufxDt{C|AE{nw*7z#q|#2!YjBmgp3EeFGoaiOU@{6w2bXP*d(Y!|N}q zd*`egj$baml6y&!OUOiVfkk=O>pEQ9l@hDz6Z}uzgKb`^(UgX$}W>cJ+E}-i>i}adpVppYV-^i%w26B`-|X& zBin#ejp8cf7}~;)yx2PF#=f>54WsV=c$-BrYgC*iLd)BM0>?lz@?#Af#n5lL+&RXS zoU$Xr=%kLxZY8qMYxPal6;08@4>FgDpe+SH^HT!!oT#Y9?FCoNeatmoTiem@jOiR= zYRFVy5+zsiA{cB7XmV~r>Uq~XpLx9>iw1Z!{b=cpvAS?L)%4X-Yc-hu_zhiY)hc?= zxq^aZZ96xnKs#zYqJo>Knl0xiOzeC79{$_#(T>x1FlP@up%}24DRO^ETP~Ng`RgA% zLfz@xqCY4y5A=r1t=4H|b3BZgyRVm4KmFN}a(@ z(x~j}zys!mMP}yAm9Z04j^0+gTD&4>q@-!^a&PFSwAaVCjTy4chnugdpWDRh57rhz zGrS>glc37F7klFRr=&B+#~wYr(!%CbS>i$6hsgxFSlO+J&DP6^w%G|Gh?(_8F!NNk@I=NG~R)6r+IuXWVfTEVVTI=rr!&z z$^8`EX&$mB?2Y{DSjr=~lV`q=!2ZUfI^%H7F8c%84)YLaPX22W9NJoag-(!~$KQ9n zJ69OyWTLv%*4RAxt3fqTokVC>kq&jSI^*nmM=roD-Ae0X>6RTDU(*ivAZDysQ8-_j zjM`Yz28w%J-1gT5v!peJce5$>ljINcwa&(LW68iCw#k1VBQ9I8SgPsHAJb6i#qeA> zT3Xg)5xP~hCa-!W-od?rV)gQ(+g$mjWR_u#{UVG%{H z+?G@y$u#n!Y@V!f@C!MupexT$Q%BasT+#qg$=urT?^LU70qM8oJck_5z2a^p*yB@* z0vZf28ci4m7UqVHdV!Mvut}rMOC>;t$O|0bF#`> zIiW%%v9K&i_!25?m-jWgkJh`_QjzCo4!ZiX4^&S=d`Vu8xVH;`dKN3+CQqHQp-p-H zq1y7%2AnU4m3(j;g?M5<;MAw$L(vaGMAI&#?6=(8H~&>Oxt|9byeN+B_}kUVYh1ge zwn|IGk+q!cMf$__^|jB=I{S$wR*#Ktn(6!aK4@6=jvDc6LS-jc>&cVViLl+**_Fq^ zc!NdeH;Jnq<~d&Y^p3;v1|JY;^58jI)<*w+FOTDhnT?k{pl7_B;F%REsdd2S93sC) z`f^1yMF}v32 z@W#M+#@&!dIJMO{i@hkjZS^CG3bf2#NU#X!wNVDrD_-M^oaTcc_qztWh zHrcm=959JqgT@6@r;P1zl7IMrZZ-7&aWy4rC8Q?g*75vaW!H0!{(1^cPyTPc>VMo0 zSpId~z?AMNHWq%qPpqiwG@gr?zSkDUnVHNP*EFQ<-kB?T&?T%Y9TSZxvK`_co$+LP z6UMn{@Ho4zE;MKo$HBDnAd|_#@kTG(2An&Ut$6&+AzN)0$WQgv{o58DY2AH?>UT-T zEp;jI-~%-37JgC^*Ev~*=9u7xZ`Q-pb!R^-E^S7GERg%1*UN3s_A6Kq)m_Y7F#?Op z>L&UB3GV@#A+6B{%k~?~@r&;H0!& zpPrB=!2lgNTAW&RBtz`g3y}LV$+~_$CZz7id1Ah3zkS$HAZwBMvN6SfVeP!_*D_96 zzhu}ltjdTu2Z@Wv#roui$e9kBi%HmwP7S9#mwa-_aEZNx#Z>qjM=}> z*Hy=PqERQYcv(nczLm<;rD*iw}oSZdk zv3VYA`n7Y)w}KQon|z|L`ukaTr7~VoadP1;*WH2rZ8dZ)0nubPp`TrUPgAG)(i_~z zD<9`#cDzBXoxx?Zz$3G3(WdlczgWZPd>+u;OhM)(cFWOD?AyT}Y)@R=hHPb9l)$KG z;^qwPL!=7=*iN)n??5*W-cTIS`5v8 zwcQw8hNv2!5^=J>50+vlbG856(6m;!N%nE&`(?c`T(R09+%+~hj}S6*RbB#`|CnuFz|5$ zJ0USk)qJ!;469=W*C0p6(B^?v^YUrW_CvscE|eFvS@QTUC6hv2jOl_L?LpM~wKx7qF|*BR`M4EjvkO0vfJZNj8=Z;7^# z>7YX`G`<{}s#m@)_;HA6u89(QjvbCqo!kF&InESSTfK^8g$I6&|E>WKH26-^@>Fx- zLAB83&6`r9m4Dx2OQA;N5YCHGp&13Ajy6SO~<=-e}2J2iXcOwnCB)+%Miac5zZ<9E5L_( z*KRq6KofcB*kN;DuDTDN98w?|cH>uN$etA~o{)C+iWxD@QI@jijOm`D6n8*{${Di# z<805L@{NoI+RCT8nJ@`<@Y0psuhLW>0sBqcf1jbWff`QkD#(nH84)$Rt425Ub`|{M`7p7;50;0T+5%=U%6=%3!4WI=yzQy7Equ(HWH5HmToy{ z4CFQiB_d%11KC`sz%PMwNS0Vt6oQ~5?3U-o`owL?zP&btN3ES*Gnl;AfIw5!Ng`-} zC{0>DtJmjjQt{R3fS)Rb+ntIdhIySnjW2kEvJ#WnPbv}%bBORntqVch$){u6YGjyg zds3mTY}sFSp)Nv^$ht>m^v%01WcwqA230=;G}qTrE4Pq5e(!=NTf1E(?)k?*iT@Ae z^8vnyw3mrUH;13^H%>+gcX5lu946j-#q5-6D@_f={{kTH`(Cr&J@qGd@Fh#}ZBB|5!ZKW9Zn z0ImhO0(K=+jFD@7_}2oh(Y@Py2>QqDXBd?GS_|iA_^K@RwyJ|RfIO`-O z4fYPVpAEFPte%PMS&=i7tHpz#ZBiNLd9Q;J!-lmDVEv5S1rj(P9XpiicXqY~#TO*) zCjVQz(f)tmDXS#-GVkiz>2PH}c9>|12y+U5psFKwu++)OpyG#LmokCk7m8TRv=a(IDRA1FCz zO)JXP=DM+^fV(^3baQ8vgEppt&v66E7d&Mq>jNaQ_+noj!JYhQaDOe!nB>+kuUxL& z1uGC;Ju?rSTdx?*4=-s(BR&9@5v;2vpD*H9v59~NV{|dTq=N$+-%tByU3KQ z-3w7C1-W+udeq<910gB7SHLEvVS*?%Z)ACcmN|L+Ru6glsBzy$|?G5_LVoUAr9_7f7$J6xr_PIjYV+;wN_=MB?7YA8fF7uLUrG z79j^8z@9;jRrZYeRUoVZuQVU?C+aV&G*zs2K%(7~X~AS{1DIR$VE7}$-^H!65aRPq zbv1@Q$|5*fy`gsh1T(P;Do7X*7B~H#N(U@@9$1sC-=p+u;*ksZ7nIT)ul`4sas;Qp zC^bYh)BOVfjM|NbO=kz1^G z8!n5d_p~`Nqb?_PVxEYhlD zQ`kbDQj&Ys;3fore5`fO#?d|M>hT{O&t+2Eh(BP;x=Q#JqIPdtKRO&I)1VkQQEGQ> z8~E8{$z8pjzy@*UI(903Lpm+9ZunQCzpBix;6*tZN-@B;-#V%pJqlS1e3kEi1pFG? z%s?XvVhilac5RMZBp^Qb3H$eOarQ?poVa2C>9#2|VT;VL!Ftu5*sjt6MD?${b6FRg z;dD0>lut2iz(3Sx88UFD$>SrnH&TmJRQiUf&!EDOJc}lv9G2@1w(pzxl~_9VaXPg6 z*B~-xOQbW^0=i5MopOw>*D(7_z5{}ee}40qo%M3@L3Oul(DFKaLW~c1c6LlsG0M<_ za-UL!-S@IshEam^abwvs^k2U+DJcT1&ZBhx@_fx1qWuxzzb>M-In_3l=6;PXswLM& z5cq=s6FFDRp^FG+y+Do#KEuBM!;d+a^)g!ZSKJb5s}k1riQvY%T$Iq;qf_QJsM1CD zBC6xKyw~gq@#~3U-?&sf*1{Gw|A8?vT-oUi#?*BG*vy#}D3nV&Ixa&F*WOSI{C4+I z4+L%>FaRNqz@sN%!D5s}qO5JC)4Oe+Myno(l=T;ETV}#g(~q$!C;h(-FRYAlTm+ZByz9m9>huz&W#9zy?^%?y zM^7lB7lalvZk%0x6#@Gm414mTfB8Ct%7QUJi>u!M-b(&6LprgLakz1eU(z&jIHNHB zJE4n>n0;B_RQl9!JJlI(BB87U@EmIq4g;lG@LhjA7NC1GP2Xz`Oi4AH=gyJZOpguA zJq7r0WW^mbY)0$hH#vS2V8MQL%>%oBOfKxEYce~1$^0V`oJewpsIm{V)CRBqN(nkR z^AeI5;M54L6a~pA8n$1(4*?Wwr^wvayzO_|a(hEEXW?4-)m0xjc){)y<)HWVAszXJ z7JR2;igNe&^hXPt^iz@G?dtL&vw#E6Cp?&IGhP!tPa6_65AVD8U_AM7I#ome`nKoI z^wG5w=lUbb#(RnQDjwG}WZhS8-4bCP)f%@HS z8Y89AEi=J|iSM)j>QR5zNjLL!achTr`1D~3s>V_l@twf~Le9Ldq_CAGh7}uth!x5ori&oe6kH1k4%1W&Wdt z0Auo}v}rRCz4FvAJBm57;6dKRG7EcMEPr z=D$_AT4hXP`dOxNRU1C-l2Om(5n0Ttz!jhlnG<3wzg1fs(o#2#g2 zqM&c6o=C^jsO-~lDVc>r6;+v*y6cG?F=vBN28O9FQT12v8v`GBy#o>|O0*GuBJ-5E z0E{+or#9FV%5L58+6MgTZ)dfK#a0ruNbA2#uY~iZl&YPX=BVWi8@~+-RF!Um zYt|AaakDGeALAA|(KmfnXudOdg8ccyhJ8(^?U@6a{_832=hd$_5BC$M9Pnt#?AYo`JAgAs=cB^y!Q|J8GMOUu?*=Se$JzV`)6HuFMcs z{!U_-3;YDf&IX^7oi`zxvfs(>U66W9qdFFFYy(4K;Uwz{BRaUBcW8%Q_|VZo9+Oqs zEVnnF=g0Y1RMiLtUYP?-%TPw&;t#m~$6RnTebhhw#@rD$^PvQ6b^6JNx9{XIpPo+> zwP`IY@YkfOw3e$MVfljO1E3Xw=h`4p>qk#}F-V3#pw#oPnyD{uc?^K**!EwJ_;JmCRTiQFo5RK=4uH6%FU;F;b7=F+ z`q{TjP&u{$C#wW@%Q638{aqg3&%#8M_^a%_qL}*$(VB=0(GhMN zfD@@n*`dX2sZ+W7n9dWgbR#)9^8j%5Xu!oc`U}-908j6XHgIbt&mEe1xMZ-6&VAP1 ziVFC>j523Q`Y$oOXHKN;P!>K(f)=dl9nSiE}@B=quq zpC!S~q-5c9+g`csRCTyl-OJNi5+X~Es}-b|_>E#DEhkn$eDDs>ua?Z2RLmS>1PcLj zlpgUwJqpr2G*Q^QN(>{)XE4g`v+zsovdqTD>oF_S&8j*6R_9&U1)rC<9;4IId4dwq zFdT%XB<(klicR0S^5G&p5eCWiy;Ga)&zf;Am=O5lAZY9qF0ieA2f&;@m8q`}MoR01 zbQ-m~ZE3kL-sPUR|EEb6_+ZK%-Old-#wiQ!PuT~^ZLzr)tF#}%@_s#5#2N8pNkKpk zO+`~RiV)UkVmG>(Eee!0U+ZXp?Gps@M$!`PL~f&6AEMf=X`diFw~ou9sPtW}PzHN) z*Ti~XYt=9h>_$3znG3_&#n^9OUw2#U>PlIE8%no$(?$n{uKlN?JQTP&7M4nxuDR~4lApPL%}BMA8v z@zk0acn#Z`{@FF=!vZX#zX*5k{JSQk>!1LL3o4PbtUKi*22wkK*XnJra+TX+X8boX zxqSCqK*?O93h$dnXR!BE`D>9I+uv1a+kiRmN@>W4X){Zsk%4|Ut;g?Yw6TmXP=j7V zMN@=r7my933G*Jlb$q$LCg>E-RS@DKK5wo?T=|U#FdCyVDuETiCE=~cB2vdwrj3(8 zO24SXf=3AIY8|eQWYnL}gh0Lg+Bs>M2sNEcNp+=*k=r*uKPoCrdp7dsiYxv{p5pBV zYwNzBD~|4dD;9uT%e@4y!5^cR$u=hSv!b5t5tWzAQz*V{g-2D+_D8PN;V_8z4A(NB zZvO?@ReZBe5^)Vm|B|bhJYq8A$HjjX+Qu=n-ji2l2RlpQ>zA&o(j0?aOSV9&z<+<` zj~~z%SfFL8oXyivNCdy}GUvHV0{)kIemR z%7_j@PXnE%DGzrn{8x6U1#M%{kGZ|k$jvM$?kH~++DHC0$t0e)vFX(PpJS?JgVu~Lt>Bp#^X&_rwsdp`blHWRae-%Bf1iyw3u)m zMd@FI_W|iu?+ki1Kf7t#Tz<}Os?~x;hl}Yyzn7l2I(t8bY&u+grATE&8qwT$0n-+% zK&4wY83dTehM7}~!R`_N?g49muK(WC8W#T3;etYdXX1D$>eLM-m!i|6djq<>rM*`A z7Yf1;WR$opZ34~9F1%=Q=y;h9M~R$v)fU+6SyM!7)FypBNV_pjkjss5T@XmCJpDX| zUzx9CtFkSumJHx_i@IG++%|}gFJFdeQI>cbbZl9iEvNPt8n%|wt~i!U)fHXoLolIg z&MWCM$7@!Y1)ig_%#8DhBtIzS|Au?KA1vb?sv~nevZ%ii9YOXwiJEpw( zn5lS^Ra%_h7MSr`b$!OF4tgamD_hwGm5`(Ad1rRJ` z=Z(8i3mvau{hzrcV?0(9j0!%Oy&03%i{mh9>oypLBIoM}Gj6O2Xq@D=1~@6 z2>RHzv6s>oYc0RepmND{^t8ftV>T6QU0Pxt=G_CK{W8=wMmE2D6$&J~XPQ34oGT{0 z=Y2Mtk&Eq?m=mV4i+a=N|bN0GVkI~o345d*+iHs=3l@7cW<(yW2- z&rmcv^N^q3vz$S<*np2uc+lt@k*Q|En!p7G8a zGC1~YpNF|FhB>m4^@(EdGwqph+3JTa5uUno`rm5qJ3eyZ*Bx({z1ndJ>cmR~dUar~ z#9k=k-rf5L-(E16vto#dCshTN5Y}I?7*^&gODA!C-dKcZDUS1gbnj{IlN*i^@~F}I z^cL#P3eF1y;E~9HM{-lWf{x#~B@8s$i1``^fN;jly*cN4V)5j_n&isF6iVd3_xi>hDr;b$dPzt zoJ;bM@+C-(ASo`;z2fbVDYCAvB>aF@19UH6BrwrX=kq)uweV{G-QRC5kF!EQi5;rzNGwdl(-b|gN%cDsh(yoB~8?c|C?$=5=?9d^} z|H|Iop0EL<`Y3@B*$=T zzou{|+3fHN#U%?Wi#1<0xv(?Vjz)?INjvy!c#}0cVuk&PWL(rP1RsHt`Q|4)jYqQQ^)$UyVkW` z$dP}RU<_;J81x8iS_mW8$MRawNzVcvhhc;9{4^Nm2C9t5f73cR(Y&QI{gJj7-jP>J z;<5~9Q7P%Id|%ZO<3-m-_O>jhNWRe6KSj80n2>eEIo3HtYt*A@;s6RG2dDD4ah4-{1=(T_ci} z>reMHEYp%p-PvV@A+0*kqPA^c*QgWV05(jynRk?e?qa2N@U_PL<_TTbD<5=~#TcJQ zynp_dPuXmFv<>Xt#aDhMSnhscF8ifUG#-NS6 zdn@~&s$X#y9leTLD;S>!0M>{)ia{+>y@0Y8)R9u#)g_CWduuc+Ac4c|nZZUZ?fKHa z&?S)kd`%-8XHq!`aw~Y~4$reM2)kq0|BfBB0a=gpgzniherP$#)pYuubE_)ihS%%i zemRHzt*FYk0W|1t1do!Yx@<30U2$0E;=h~wBpBDccW6h+t1&QbMdsf_tm=xq&&28= zo84xT+v>bHRI1@{|G;}9L*lj66W+Zx9EL8q=Lv+T_1~;Tcla{*gZSJy>&_|%Pgcf(IMi6HrmLRwh(|Rh=dB1=u!hPt z?{+FL!n|^O-*~Pr_W+$7Bcs;2na^1!(;d#y{^6ss0(>;ijvK16dAsZ9&4ohh`5iS! zN@WvSeaDLq-}!F8x=>1r{62b;Qxs@gVp%v4)f7jPI5wn2L-8xkmrm-=Lljf{%#X#K zTm8Etu^I!`y+GwzzKlrqJ&24|G>zg5_(*>nFMs$!ofVFn)_#Hq@=tXumEfPS4Z)-a zQri!eg=RcF%c1(}_?#3?TEEC+NM0gl-&CU)V)&q|7YQUDCLky4R)OVJDfVSJ;cr7D zlcmk8JM5Xc0J$4GC+%L^(9;Z0y*oXQ6m>H4S2a>k%J{m%18zo-(u=T#<$G52m_+EI zJ-$a=7U(hrxZXWEzfj;k z0I&4*!HTgOOIGl&sYQMoc{}fcZh0s(RrV6)^g491H$J0f+r{(PTt8|+uC19*7Z(c# z-LvUT0oW!jmS0d^Hx>ta!mFR3se9a`j0SP9-pb1pdh-4Ebb=bEc*Q!9z`!h% zvJpOY(S^t#L+u&Nt}ya@1i)RDfM*2Ll$3GvDC z?$5F*h)i}Jl5oMoErXTYmZME*mAH+@7ll|gh-pYCzraK9s-LKy#e{YVk{mzB)ODW` zeJ1|5gmS3T^*+RTZ{W6xuL8E)sM9oQsp-9NF4|yGp?!D??Hl5FKp{8bQ%m3w_V3Px zwJq0l)Mfdk=of$K{!P=eb{Yu4OV~$y(K6pVEk`!eG*@T-0I8-aEHw61f!+1AnJgqF zu_1V}5PDLuG8f>mLH8uErte(#D6DOS)3f_IF&4q8_6t9kRgfEjt>cwJUOOo)d3sJ( z95SEMuE>0`B82>j_=agEmjVZ=sN_j|Zkr{0rC=jDp#S=;=9s>mfqvzZA!3mx*f5hxSL zj-PN0#@1We+{VD}nJOSO?wm|VaTrVyq${pW@^M}CQPe<(ImCtca{SuXcyAXJI}eOy z3!9f^Y{_Z`u<(VajVDeD)G>uQO5b8kyPgI5Rq3+PuqjKb&Qt&6&;T~Wl6vogwp*1T zBfpZ?GTQ@<#+?S!XY7_EU>Cy}Yhs11i;A+GAmbUoH0CLQTfGT-=s0t2@uiLfa7Hg<41;@aLZ zaf|d5;tQNtNIIYg5!l=)kh1u(FeCfpdfqV>L6nUxB;9!)+D2KGv$1hf!QP~2v9qV3 ztvB!37`J@!AO6u{H=mNFDrQdF?&1X)(OxSSl%yOeimt-MqSHDc+f+AqVp}!RA--)? zpP)~W)8LmJZwhJzUSAKIPt&RCzpZt!)=rEA$F^VbBgMFKHkAHh76ZL)5&F_sPrDXY0M)@z-XjT}X8SD04Ew>HTkjXYqY5U6U1>!=<{~OiN+&O zv(VAnYvo_HLq^{W7k$XZJQeQXezDBYtaUn3lzl3_l2TYgI{CU*oefq(I$gX0)yU|P z#gHBV`DILKOu>X>se`AHHC|@=lJLlf9DVX8`C8C)-v=aNELD(N*kYo{pU-J1VLv(p zegm};Pn{?}Jx^*|Sq)51a2@jTTZ~{sZ85-`jX;Xd>NQP<3I*JSpg=7)NFxqRlRl>} zhZJ#Rx=ZPjEi1caNzWQ?_rR?c#~S`2lQP2I9q|%|mYXyFWjaw52;WA_JfU$bMK@J{=CM)@@9-zTDaAN3vh+FY*lL9Va|A3ck@PH~$9$;t!881t)NzA@XdoCEa%1_D&r z?J2+ja2?`;qqvZhUVDV>%* zyDaKU_E#0qQ(p0um;t1xsm-3+E?53Z)52scL@O=wpjDqOzYVzFsf8C_ z{hm6VcQx1|4$vMW+mx#>_g7L0@O%wxV)>sth8_KioRUjbp@2C5fJQ1(!1gqy#(B26 z(Me4TbUKbcKyF=#JcTX=;xaYv#5k@>K-;jJJ;yk+SK+&iTaEx4`S;AVG zF3B->g6?bOepwgpHOjK{xCmPn)r{P?oF7s25-u1FM|IH30KHjIAViz6-LMcASq>}z zh?;0ln~j01u{`b)tG{{z?1;;?Wx6P8D_X7dLhCgX-XrTRkmqiHRj4U(kCzeWR#q+M z`Yac;IhIxBy87Oy%3N)4^lz$;lmBtOslaCkf`2qE{)uu|y%Xiad9(vp)boBn|Q(#39r8RV_qY05preP*Xh2n9~Q((*+79@Bj1mfyhgV@ zLk@}02NoV{*O%Dne2tXA$)@=UQuP&qP%W0M;v7(UT0VUgGNaiYtZ)Ak)G+bobX}MJ zOJ;7>_xL#@jU7S$Hr-5>B0lKuOE}2*5#-bqf>r%_do1_mr9l;&-zNvs@ts9rGR@J3 zWD0VeB+F5)NyDa}KFAF&y`%4q)cZRpy2Pz=pDEIN{>x*Ye2rDUjw4%wr%{eYwZYK96-RT)MWF;(e9;B*CFd7s|hX; z5$dcGolbxf`-EFBW~-SAqq{D87v}{%-D*24^dBgb9NG>Bx?0RxI37po!6Y4ER`Dq7 z`p7gLdN^IoCv90Qd5tqu*yzTSGZ&N<+BxJ3(_t@dVxKJLiN%%0)t(v^t303#hEt`p zJw{n`SDlNb3JUGTVaLEsucne{fHdzx+(U<7ujzT;Puz9yJJ$0yG@KCMHp#H%=BNmHQ@NC{u*Bw^l zXK_arn7b_*=)4WV>alf5B4ZUbQc@C+w-Wki-_hc$j}-|^li$!H??aEK0lz; zMpR}P0=l8H_{=GircHcFy^qA7*}ZK68nJ5GyvL>9Rf(m516Pt>@sKy#5~DHjooL!q z08nt|AT}oK<&!}K?@^U8eO(KG{vqa8zfQts+dB0~b|KKSl(QP8d3UK5FC;}i%*?pO zy6$}#YPQ$p2Rb8-_Sb9{NS48D#rBJmbPCUI+@nqlWF^5=EY;lRT8AT!xcAJ;Udn&! zpv^&cckM`N6&-8>ZR$A}Tt^!HW2$z`T!^@^!s(7yFx}?OrxL+>{=iOp1nYX1Vk&a0 zjf4b_G7VQLM6+@h-LF4KukjEl$@CvVTtI7US&#oGGr7z$;4N7~|KidTLS}j~d8YSI zY#ir$0$$OdFA!CBGvX@8Iy91&)E9d9`q6G?hJ6scSdI8+5o^B`#ZN=$pD^1@a zEJpG?Lx6NI+RP8w=dq%=e(&FCW%cHZV{NPivhD^PVl+Pf>9fj0LYd0zZ&kz7YN{ie ztCoj33>+=LKQ2;UC`@=;ty-_Ez23nOfe5{tpM-&r&AFfLOa$ z=Kb)T8DP(fK`mKM_U|wZpi-zXe}-K#Y-UdkdARt^_GX?v72pJpM?E~ryT|g==;=yL z--CJKki4HTztV-hAvNGsu~~r0gir_nPX?a8`PX+Z3h)5TW5Qo#tueKFt(`9xo%0@((!``Oky_ezJOYNcD$@GT(%f zz#hCfE$iiZeHH8_#22;KdAMQ0pKCIJq-7Rf>-2R&`~;Kx+DpO@E%niNF;@i%TY|+G zq4Y6U6~IYqX^+Wu)h3E;K0Jfxk&c;~(AE5X{T9r5hKF9&h&Ce{I#}zL&eb~ zSXt;tg$8Gy#7g<68!SQ&t|~Ik>+^sk;2S`mm;kke$yjc5OFEUs8E~FW^s90_KUI`r zhw&}zlD53>YT|t4AvS&pl&Sq@gA*L8=5GQqduSW+$(FNn?P_V=A5qrOB;nBxPD@I| z=katR0&JZnKrhU#9Bq&z0Q=#cXLwhqNVW5ux}lQK`E)@*Qh8T$cc_?)7w0uuG0p^p z>#2ywBX$e2JlV{h#L zB(7{z4!l|>%8ZE-PidtpY}DgdGb7K-S@BNPz(r#)!?+syF_GI zUuN+V1lR|VgEj_l1TvNflkLy_H(2FaS&(cMmBw!#xBXnqb~jIdJ^UV}7P;#JTGt1R zPnZZg-PX#v%Resk;j_3|yO_P%-yfZ@lu?~%jrnbD87Ei5^@{2(qnOOO7L%$khL zs*-bK3tAgSB$)`euB^px}jH8jH#K{KTzrQwfOnyH1Tz?XmHWy$u5m^U;;kahaQOrGc)kjvO}A zm_3p$n^H>KBfeQ$e6C$p(5uIdb>EYi|6{;rjq63SH|pr)#t)@~lM(4KLB{+I=!|9>e-U*@h?@eVBdzjKX zlSbIpMFrb>+JL>x>Xo{@=aKVnQ;w7moUlMn?T(NNxT60SD=9IgWK!>9P0c0ORK$vP zIN{c)cb^%CP~D&EICz6;Jvvj{w=prYZgix{DbFolD^BmO`L zW>^fj*{meEwJg^5+R1l>1lcRWpE^p@H`j*JNgXoSAzOnL_K#}a)Ycn@KB;$DlbM06 zMXrwDyY_Sxp$z8A@tr~Qu~Yl>d@>OwDRAsy2Q+K8n@BsB#U4C}=-u3U+)`s31oD^w<8*aX}{rc9_MU2q})M$Q-O3Z|rHJb|se<$Fiug4UB zcjg+F%NQWPJw>dxZK5`u=+Uib8E)>c{tFgN9I#-Xqq6Vhcc$v8l|BovCu_a1-rKOx z1B%m)zA0NHW0P$|WU8tPgcFjE4nge@p>w1AR2We4&doeK8RGodQsepI!51R)FHgO) zJ@o9Vf#l0h&JD(bZpw$IdAa=&VaTweTTcq=^Va9DxCgC0e6a5?4UM$wfw*zxxhx8! zu&R6JK)A-Na*2q2PWiX?erxn`Tten?*A@qg-en5?Gcj7_xm{q!))&PVU!HUu)R4xe zFE3a2N#DWI=i2ZJCdo6A)9kqg(j9P64rYQ?_|iMH2HQl4dl@wUj7&T~Y{(!3o$bop0Eq(%RAKxBtD2RY$M}NG37QncvR{He(>^kv+ zERsdt_x?O-sbB^z&sLhS@!*bG7BkwGp$6aAIPQkAD9u>Px*qfVCBdTfcM4I!0r>Jg z3*&^R28PZ%Z2eEV)qhg~>|n0y2E>Z3Jf8O6%?Jn9t(&SQVlORCG)wr; zKRaQvzEpnS3NoHJG38+{6JIj9yIZu_2xdbxiZoF&Bj@E9F1)j2XsQ6OsbXt5aWDZ5 zt2!!nQ0@w2=BTPdD9b}$z-Tg3x*Xwz!d@HElFU=8dGsxgJxX272mV~ZQHJ}8Dj~K~ z1dKw(Jf?o1+ID#iddvhBR62RW{a+rK=72NX$`_a`Kw9Nf=^MlX7fbm)Yf8~f{=BiV zehgB`quwRUdDpX+9ifstbY_bDcF6d%yJ(3^uuvuq`A#hoS+-~#(B7Np_DepmoC%MV z=~bf!R_rr!eyv0tv}V_3AR=)$Ot!PjXYFgV1f9wLH3y}eW+zbrdpPjyrG@s#W#jRF zCZ&CjD8URz?CUlExa`!I@Q7qjjq|_fXo~V7`(aJ59FPYJ{{^*PrOQv$FG=31@sK~m z>vG?U{1vgJA04r_%S2uIZDm(|0>*d1(#`Cn20`0QE%%_uo<**=97G(d&u0+lvzkP77eB?*; zvEM}{Hb)r0hS2HfyDxqIx4B{Vp)thcGc*U%UKHK?WJWYSFl@(ur=j*ZjPJe+Ito~F ztHL0kJEQXDUGRcv`@u9cgDyc?C z_`2WwJ=$7mu;Xk;>8h5?tn$Ao=gV^tSxM7v@?m34bG?d6qP|h|?T+s`hk}gUkJcPR zLvDH`!QuFTQ_E|M0v4oip>N7&#EfPFeyK(4No}5pcWbI}%{t}pfa~8Qq0+bxxaays z77#J{DCkRB#BPWVT<Sz9)EZFM5cG>?)jLC4{Ggs zYMu4JKg5bwc^^sLfL~hazdw?f^7kY5k|cJh6CrDHBMXm;%xoSTyUy7aoA5)iu>7PN z;X%sG9Yw?Fj!T9l_DiY3ePLF_9h}XSQ}m>njnaj5#b{0ENOq05lI^ccInl2EK&mz! zRk_all%V~DmsK!BGp%}3hLi>C+{>I&7THlcc)?mtWFUp3fSJgS$bB^yph_u?y$&pzIv2qI>a)eo16W`ihg^Af(Or1bs#D@2`fvQZ#@AV2==HQe6Q4>)3*T3oMZt?AT3R6&M z+&weY&n1FCn``yR=(b^_#aT3_sa*`?;%)qODA&Hjjc zY=FR?pm)*>2VumC-&(O=2!PiSA#$Sj$>o13Udtjx7X%%ZUsoR1Gb?a$l~+hg>`m%q zM)wumg?Jru@)BxFY=eFFzyd+^q}19y3;7Rd(o^@n054y=W*Fr|D3@ThZB91YPEr!_ zeEv2zq6?jKaF+;&3ab8cuV(pu__Zq$AfSMKaHCR%YeXIGcWA9VFqPQ|gbxw-0EnxF z1b{~?z~yznGXDwB4Cq!-;ikHe+_kxg@{&U4+w`v9Rme(kAn&1OHCMSii4^>Pz;kfq zdy?qx>W%HX^zXlN6l$z_YnNs&v@7LdbD?M&)B=!`tQ4D`VOn_>L)$n?QV0RKqI-1!tnnwQ78mUjnJQu04D&;QO}ciB~xH&FcDdBWn~1I2EOZ4weD z;!x{Rd41C`IW<>#8Pf^EU4*-!m2PuKZM*CXg}rf&Aemek*mWgic=S-xKPk8|MD}V( zpA+2z#2eANs<~t zKCDpYojR|6^!g`(k&w>oYTAQm{`9TrRJ2_KfeU|y#f9AR1g&#-JQw4u!6Sj|C0*Z1T<9*i2y7@U24TyjHO*uRwK?Cx{1? ze3Iz9@Z)#+qhAETtB(=+=yLPqzi-QYh^)P-rFvGlC;t6Tn8cLBJ^L(0)Jy%3Pb8wO zgiENGKRFzcLp8CtybEW5A9{E)0nM7e8|!bj#;c&rXGY1euGWC;%)@8)y0-|ARuA7U z#F{uuXSkz6`|oClg>DwQ8!dxdH0o|_;Nqg}ciV0MSg0kot7Q3%v}`1}M3CB4d^zhQ zzk>B6=)jTub!sTC>atf_5&ER+LzIp*<%nTuW*bDE88mokRf0RZ4zw7~5|NcX!)DQ` zn6dGLk%gncTtn1htu=8ua|kKg@j^jJnV*UXXAnoc!}kk66J6cJUh#>!518BP;z4_< zpS8bLOZ<@HJvHj#67qkZnmAt=;b#y!VR?D>(Ny>tJ@EPWvp@IY)v}PacQP3v4bxJs zyf!BD@o^CD`Md+WOTR*gcI#*jh1a)um~>K=^eKBB7|ASrfJap0;F8l&Wb<|b&1>|5 zCQguiVoLfQBwdvWPRwD*EO1}f_b6e9*n{oxpAfG+gO+Tmy!w0i+MSEf6)f-=G>6^_ zzUyIRf(l~flM1moBf*chzJwREM}}Tb;sE7F@aYF4^QnK(iChk~T4jkxB+uz!2Ce8r zm1795Pc0e*9)ApYLImYJF*`*J%WP%;X>bTbmHX!2w>qHsXIb3W>TB?5RQGGtZ+L&S0B|}nu+yQ zrbGL>QYmC!A?h%T-Xe}$KZ02Nf@MW?|6~yK<+===+)$e@%n&FmCa|~H7T=n;R|{M@ z)r>ajdlEkBSH2I^+;)R6x}kyQ@q>N3{YZacpG%d-C*BW`uj~_l@W0s%Kl6s(!;W_j z6#wV7x-0=TR%GVuk*T0omU~z*{`J|p;SwnrctM%fmwrO%fJwbcdg8~h41RbFd$Xa+ z9mF!k0OdpZP*3n`$0nCedoC*(1xuZN&a2&0ua7>9yd*$2u zw7V-3Uz5Gl#yB<_Qb1)4G@*2Zzom02NV@LwdbRj^XfX;LxHH9P(eNV}s7}rp=GH3SIsqhHO6f#Mr(=KH0R4mptzi z9^(Adx3Wi@cZPuXHK{>?Xk!8K1q}wRVE7udjJQDq^OS}m@Wr;u^xIz5!WtZsKo9`AtiL%uI){qxzXym zVC#KG*)j?Yh7v$GLhn$r)a1#mV=~-|7F3Vcz>&eT!3f5}+g9G$k)QF8h*~2tPKa#M zk?A74R^2eG@;tHN`qK#KPM|~oTEKj))9}XUtcXCg;WLxve(^g~+mKN5I^>g@8>6TU zu~by~m^W#V@Pc)O>_CE*3PO3oXH#Y}>h14EYyZnJynlzX#Ew`G0lC9xj$A{5L<%Wk zkcn^*#WOS)|MGz)jGmPhTZE_&Xb}dhzZO#t-m(r;Zi(}A9_}~I+vC~2+vi$+SRNZB z#p?m$`3Z-Yc~J&pDL(p4KuKit^YY(yMv#@0z<+qC7o5|#Vr-);BLtZcpGjC|+MYMX zSx$nOd+-`*XH@9p^$Z#J>y=6~;0Ev0F@fiy$uUY?z-7?pT6J)w=ME*bp^=#BKP;qv z{4%Crv@;Ok{RD~Y1whcbCBap zZ0)!)GVQZ5kL_<>_EnK_6onTAeub@17AaNGZz&78Mxf-(Nd8n`Ru9*xY4~O zIu7vycDz8f@o)3ro~bZi0z}HAHJb0Cr3eh;+tIEz>!6z4DHL(0N(O{O^~A^Rb)aR+ zer4vff_I!Me-KH`s|GANFOy6=&f}>H_R!T@UfEONy+A|e zzhE%_-!P*wtSlLJfBo#AVlzd)HO|@b-^XrdxDKbUio4zOaE8gK!xhRkVF9Md5q&9G zpQ6e5Z69*oKw}A%jFg>$cE(O5e)5f6auyf+yP(eBN>L+$lwgN-T>G zd9e1Mp~%mK8}T&-5K@|azc`;sc!8!(#*EyKq!0Zu0SH$aUU-XkeIS$-VJlVjW$E{+ zGCvOS29@cq;@p1^D&Px|-(i&WOaZ$|2d9TY5jb9X-Y(ry@RF@KuYn!qPkG-(`TNij zqc^I>J7K=Nbb#WzD~wOGQ>WL}dAn+siq~Ly1zZ{5wDqx6C0<;dF!*t8nAb>s?Ur!| z=)FFwmwOo6lS2XJV%C{1#(g1ENkh?V4wEUo5x@Atyg*Vgb~Z!xGDVp~kA_%O@nk^H zS=!&WJ>a>PFISkSTbtS((Bo%R5z7`K@KlUGFuO~E$+3CJ z0uWk{X1EX__iBvTl>TCAkL^46ndFT9ek-2a34pY|m@6gf2mj-)R)+4dbSW$xxZ+*x z!AsyE`dbLg7pm1SS70mZl#q+^nS!|kFt|Qsg;z3>G>#MFg4t9HkeNQ+@uKmrP(nFW z4x{FYi41mzsjA*+NMnL4n{@Rk8*EI2SQpSU)-MTDd7d`O>vPU5wlZ;ZO6-fM{uS|D z>*rr|@>v>)yX6O=^iab=vj*i2Ac7bpmy^fL_-LeeN_glZY^FGm3&6R?L(ZXJGZN~~ z)O4#wH~5hh40g%RsMRgxns@BU$gmRZLIyml^d0lmLS+B`K{$l);DIsknl37LsD8uK z`pF5AiE4BJzbW5-(K^X1+8&o(oc0Qsp2Z$C`*YM7x&Oe~)^)Yh-@W{|Zyz!{d*+NW zRxlf~U0gKj?Eb&Z63>oa{`^8FY+Pw}B*n$ulvrmJSSrWRTJ)3Yz;EV*FQnL3Na7UZKr zPm#`eGbOCOg}Jjocj0XU*0-4&tvNNUvor+WJ*)Ur=6;opU=Mi~um9^kcC&Hq-AEYw z;U3k$3TgDKj~a_dU7bBt5g4n8o-UL=;Rw>X6JEtBzF&)ANw*6)44LGN>&<6r)Xkq$hOkH0d`#)2XPP@v+`!cttFZD1mpu@Vw^p>M%+B8~F#y1BN0o$~+0#~-wI z7A|%qah2@u-*%uUN59#pT`B|_yafg{?8x?gZkfEosp4M9KTC&-hzW-`ys&xVG#}}y zCbiPvLp+0{Jc#G6_qPxKv-y`L$=|1(U6_+xM#f&IYYIiNH5U$u@|}DI=FJ^G{KG5BCfqpitgK{ zFE^$T%aiy9g0;9RZdcja84#+n<#W@(M5^|VcVrzn2&*#RuNS(rZwK}nQJ+bJM~e+= zVle;QW`dDA)PFIbk?Hq(@5(Mm+HeJj7w3ji=)ga9IM4pw#AtF=g9qC7)c6z`mJAB`PyGI5-46es3p_Zr{jVctdC;L`cU60qxpRK1&J+)Zwss@$E@$p7mgSU2n ziv+)Sm3MR%IaLGXTRlQSe9X9s3}tsXu7#9nD(vOiRGDqKtiF943PS&9g+;^p4V-)A zDU&f1B0nuRcq8mAcy>#NVWkfv2KX(vcpTtR`D~Lbf9fKfsrOI)oRDN#2UBiF^2p}z zZoh-uz!|T0-@N3+|D5rX@;fYjM?T3v_VMO`t-rW7?l1G*^1;w9*zBU7XrrYk)pYsX zhDxY1&PUC@r~{ijvYV7hgJqgNs}x5RQS!wn6AsMXAWgLuBMX~{E=jXNfLY0yV|?Hi z?ZCBRUpXIEBHEHYw0E-4U7^lr_6N}jw+peECoff-b6}Mv?-xCwJ%a4-UGB1{^b$;RI*H<_S%J1?Ol!Y37A(?dtF~@mUKy7MY z=~nK6GRvp48UR_CTwuSpW{t6*v5wq}5>Y|JN0wft>$eeEb{rCg6^w2eClMQ6+H;6j z-I4Pg6n8``DdySINBnBv@M@`wkyHB`bF84)n_gc1wb#hu7w!!yvy_Ds$|+{gZG5bz zx==5=&yxbCTJMFS<~ddKpxcdX5PZ>%uwg)L?+5>Qi=nW3*-n^tHn|=oUPKNv$n>GE zD+A;y8O+aHrPL4~eQ#x7!$?+0mlRrL^XAsT#_ZafeSp-IYfjE(i+wTY%{yZF9I%G* zqGYG-s?TMkqP!?6CGj{bdlO21yi6~-0*W5>EIhIp-S5jD?w*~Hh>qaDCp2@*_@h$n1KCLUOJCUJ3M3uuR7h!t=BBj$8oKgbyn>lkLKDS}xMtN=U_YlkKSXfO zFWBe-%KY#*!_7}J~*389V@Pg(+y&}U1S&L?UYi>W&`*w4sf(PID1aUt&Hhx%qfQp37(%**=YkTt@>=9!1J%7oG5qzsIr$L zO}OmYrKR>;euUuY=l;yTOE_j{tN6fjB8m2=^kQVMFP*_8%x@?y_C|i8Hzw|KsBBU5 zfxCwrIkG6_U)u{JB;`;SIhy4fwrtEE%zRxFoQ26>?KJ47O`CRwJbu|4ZZ#6CJYV#> z_ii%BD(A@hGBJfF@RBSmRj)I{SL!0w9-K*-SP`sD*s1Q^g;a{Pv>wtb;A>X zIXw2fuNC#Tgl^AOqlcelZ#O+EI>SQKGtgd_IUr||dRYCTO7a<|ztJM>@evEw zg3tQRtU<`}{b*Agym{AJ|2uk*HYRIG5oSXZ8(EEkSRHn~$(I15m8UU8jw5RHMUuX| zyW!qn$C7Og>ISNvu{5D^zuoY_A5kh^3O-%@Z|qsOS|b^zT^X1@Wb7X8SYo^zO$@^b zPDxNT_&bI83o7}yJ6Tz2bGiHS`vFk5@*J~e=^_*-v!c~av!%yXT1|TnGn8`D5JD(Z zHl_;a-H*A%YLn5;S0PJB0N>V6{6V8bq`MJH`>B*#9MiTvc$}fIwZK_w;wYzWjotCV z}(i%C_!gzUE#N;E6`ra9EG7Ii~7HHV|EPfkC1k`Hfp&8DZ#k1NC+ z6_bw#O)(9{$szGGZm5CZBiB6#{<#{aHH>{l$AkDsvyS=B=6n-eX(D`uiW|SQyE^&YPnFKqG>hnh0j3J8XOaHtQ^ZvYB>~4Kv zot)~fo3KFpM6>ErF=2WlQ267oW;P6|7K_L*@)5nfBW9v|84+Du2D<$6i?BMt@)%GT z$zNqIppe}nYBAm|B~iz84v|dZ0)piVMi#7RDvMr9UV35mJ%c+~Vp&ny8;@J;og$Ag z8jrV?`a!ASiMN6$-ff?Xn4zbH9Olkq9BxUVNk;GmdG$BP*DUmFiBto>es^f3vU-Z_ z%-Gv*X%jals3I3zIr0#PIn{<5R@a`*uro}EtgFJikO>7DTY*v@2DttV9rmrjUk&S` zqI=k|Tl*ZZeKt~eudCu*zPE7c`EPj0t8ZZI&s3H!;bbg>q~s2su{P1Y@yHFa?z_!F zdS|hb-U*d3e&kp}hx~Kgl4w2Q2;oSlT4^Bu!O}Q!^sXIzmX=-RhM-Pih%i+e%t(9M zKEfp33_)eBuGFJcSr>FRpBl{v9mn|gi^{XCjRrjuWa4qspSEdx6~Hn2G!^&2p%hiO z~>w$wMvv(WY4mwv+Y@Q|C4Z?;`hR!OX+HqBIqq^z7M}hlX2M7T(ZmS0KZe+r7 zrx%b|0n#f}4Hr?q=5Euhz>$$-Wa9m--~V25ft-UJ>U7UObIDWS^yS;@GN-Rj7%5Zs zHV_0SCx#;#B^sxebOP?nZdcbG5kqulZbvnl9fm=W337p!Xhd+z`2HM@ zsl7D*bmQJ*h2g%+_?H!V1vyrZ2)fh_*Y&qz;r*$7y`q04_~*u|1f6fHdRavZPRUrC zdOeWAf004>@w7xUc)_4xeCcgO&|2hXIGo$QIkl532ZA_gHlrakZh>PVU)^JOBwS5l z2)w;2Z=_!$ub4`DZ&QGGRDKEyA z9W6imyh%KDC<6$I!^yF2$Vl!?iai#mNli@)>zJ<-r&_rS zXTuu@5~QVK=Hp!bC)^0x?d%%`_Dd^2H(QL2U1I%DTa&pL6{oDktj~6s=KgMmJgC0I ze8W*PTEzeM`u7LAX*jSEW6y**FCIo}m90UxpHqus-2bu-g*eYedetiVlFKmL$B{mL z;`@?ct6`d=?XX4h?u4Pc32aoMJ2mfkw?lKp8GNU5_ObS$<=S{7>N}3UY+*NgUY2N$dgmU1-Q8TS(5s$~59Om=?6*2nFOD;2g=O-pWS zxTnuk5q9r4>9Z@F4Ba=?qPsp?PhVqf@ETsZmto^Z311b;h;K$n8GmGX>`4rb{AZK@KT z-7Bn1xR75#vn8Xp3?lE;|A9WZcSl?&zK~{lQsLHplFMS`UbRE(A9DY*a{ccjy(dIz zN+!~sf0Yr3uCg|OY}q1QSz)v;|w+e1B@gjx>YKMLEeZYgOdRCjI7g>J+ zkBTMkrFGB4ndIn0L5Q1=&tFwW9VhxyQzcAr)V@YKBxtrxhjE;!*EBTaOjZuLz#2S< z3Qa+~b{FXUnOe;GBnB%L-mvlu5cy=LcDXsOIm-40<ngU|EZuZna6=HOjqA9NQwx{AccR>fT@yI*# zBC*+bY?j00a7ZYswzN-<)W1feVj@>CYui29ADMVxR1(UMyjZ!u^U#!K zT}^;!Q%d@am5sBd#|M6&vaEfPZ|<{|_(zo`4P!9Ac}BgL$kW-Tw(@sD&h04ns$T4w zLD5$d>ll$zQU29OUxSL52SxtKd@z5_m8k0vJYh9b68gS-M+M?tT zuAaC}F)@?R`CkSz)KL1?Xl+)iMgDO_5c07iON^T}U9I0v9d{u-^d(2fo|9Vm)LkIF zP*GqDH4Ll}Yo?uJ!Dcr~sja^EQmV3-aISRgg!i+V(vZbI~Y56>fVk5 zXYpt%LIFiU^&+7Ik|$71a!hnj)#h6F%+u?x)9yq43}OaiChR9^KAZYbyy0~%50$C* zly&Y27iqa515xU0zf-@WeFYa0`gF*@ebWdDPxdzJJlZ-qKDjI@S6qAwe-zaz;a5@t0^*)^3z#0Z3C8 z5fY%rX_qJ81$c#vsolHm#T!$*n8!uZsYEn)0VKG2TR&x6b$j-~5Qu9S_c-x^VTH|9 zJNGNUI&}Q!Z4!|V`3#qxlLZHgS&HOPMN3TS(UY$c-mM;{lLOV%{6kG9M@hO0$o%3a z){TV?r8P}XH{$sheNLE(8&Q^@NzKD;$NB{~@c6iYw)-^zIo|!(c3)&>?{0=zA@Rbz z1G|nFRDmkG;Nb<(cEBjGf2<&LB&Bb&F0X$&19hh}`KSt)2cuvE-0R>M5$z>Z9Ai;u z?Cwfz6Ef|jAs^nvtbt;{junwR*!G+_Wr=}85x?h;PV#}xCu#TH>$zN6O`)t?yT)}v zj)>OILVgboQ6fgDM$X)df7P`eMF_7jKHMqW^l5nS%&m7H!tLSo8pjnN=&$HMb*Y5q5FiZ%)hjmcb*5tzR_!zV z*IGVHg^ZqNd=f#OVt`hQ5z45{6?i6DOuOn`1#>G+6}~_cT*dna<*BLo^AIa++TXp= zO%Ct%QzmBX`sS%7$sZ@nU?giv;pZ}R&jU?Uw#&Bi{XgA@kl<~Kq#~J6C#(dt3=LrrTqgEj=j~9NiV(Erfkj&741iCe9^Gr1tUWUrIGXhfIksP2;I1HPODz0QPd>G?T2{SsAS7G*+ z52sBIl4K8N$=4q27nUowPgotEf>W1%U)nMkZ7e@?spGyE|D;grR&+j-Fluq~(88L) zMOVqHkYG`LwrmkoA*ynkdR^q3vB0;aXTh(_u%wh_fQ9f<0nIRb&f zTTt6@kHW)A_nX}C+4*(Z=825W5thsa_}+)%cTp1e|3o`D@ew6mL&zbB$O`JZZ z%zFH}@AJN<{?EN%8T0g)+T1FRNKeygyo^jNE{3wE*0iZ?hLAAH>79pDYrpYKf9b0@ zoI3l`_)$em-hZXIPaXD!Pmy{dKZ1OZKc;~@c=`bn6S?Ij_F)i^D^G{@^inR z7HfZ!81tni9q)CG5PoXy2i*M4Opa#xujOjfFM1ijZEY>9l?UfwVx*RdK5@(Z#a7{X zSW8c{mu27HTz${iKR#}EiYg);F{?8j-`jC(0xO^!*72waZ;Ia#fEkPKGLsO_J%XLJ zzrqSc<0!Na%n?G7g4t(gFi#gd!YWf|@aT@{lSPomL={ugQ=(~iOkACld`0gOo=l~jFh_mY@)rYNOP|^1r-&G$6JqAqLgg2bS=ll4;bvxaQpD{|2VNV zo0wm{b28}LZK4$~=2%kLVbX~`=RD4?zp1-I=oZo?Yr6p-BXsB2Vrz6 zN@AS?aV9?{?IWl|s_EFPOdSNAe)yFk@;CV|dp(uOMa1g7vpvM-!eui z``kbTyUw+rx6NOy3;G9v+~5Robz`-h37%6ABTPvb2fVsPKC=#;z+GZ}OF&h5Bpf6A zOed-$$^FK4zOwSEd-KtY*6z2XFF<;LG_hn>4~R$2K~AoBVMc^7{K@eF`e${PdgsG2 z*esXlKD~5Hhwo74)KxI9si2O_a(r5g#wKk|vVhN_O~~Y>8U@&=E3jhQT$Q;*a(cC9 zeOY->)7TEYXY8)9J+_7j$(^XoFqWO9j_DF+-gB7M&p>E$i>B4q4n@92oo$+CPoC_F zWWT58Q?n1OVP9vUemZ%6R9SEp3tQ~ofcG#R5mAYrF?lYGNUp{rQ*HJoGLL(dhj3qM zDtR_Y6(02}$i7lb{~Y0dr~5Mcpu�HoX6}uJAYZVrqHzZzb8g1l=yx{YOl7?Ef2P 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 literal 0 HcmV?d00001 diff --git a/assets/js/0047ab5d.2b37419c.js b/assets/js/0047ab5d.2b37419c.js new file mode 100644 index 0000000000..178bae7ce2 --- /dev/null +++ b/assets/js/0047ab5d.2b37419c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5012],{3905:(e,t,r)=>{r.d(t,{Zo:()=>l,kt:()=>g});var n=r(67294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var a=n.createContext({}),u=function(e){var t=n.useContext(a),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},l=function(e){var t=u(e.components);return n.createElement(a.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,o=e.originalType,a=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),d=u(r),f=i,g=d["".concat(a,".").concat(f)]||d[f]||p[f]||o;return r?n.createElement(g,s(s({ref:t},l),{},{components:r})):n.createElement(g,s({ref:t},l))}));function g(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=r.length,s=new Array(o);s[0]=f;var c={};for(var a in t)hasOwnProperty.call(t,a)&&(c[a]=t[a]);c.originalType=e,c[d]="string"==typeof e?e:i,s[1]=c;for(var u=2;u{r.r(t),r.d(t,{assets:()=>a,contentTitle:()=>s,default:()=>p,frontMatter:()=>o,metadata:()=>c,toc:()=>u});var n=r(87462),i=(r(67294),r(3905));const o={sidebar_label:"Services",sidebar_position:30},s="Services",c={unversionedId:"iaas/guides/configuration-guide/services/index",id:"iaas/guides/configuration-guide/services/index",title:"Services",description:"This section contains the documentation of the Ansible collection osism.services.",source:"@site/docs/02-iaas/guides/configuration-guide/services/index.md",sourceDirName:"02-iaas/guides/configuration-guide/services",slug:"/iaas/guides/configuration-guide/services/",permalink:"/docs/iaas/guides/configuration-guide/services/",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/configuration-guide/services/index.md",tags:[],version:"current",sidebarPosition:30,frontMatter:{sidebar_label:"Services",sidebar_position:30},sidebar:"docs",previous:{title:"Timezone",permalink:"/docs/iaas/guides/configuration-guide/commons/timezone"},next:{title:"Ceph",permalink:"/docs/iaas/guides/configuration-guide/ceph"}},a={},u=[],l={toc:u},d="wrapper";function p(e){let{components:t,...r}=e;return(0,i.kt)(d,(0,n.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"services"},"Services"),(0,i.kt)("p",null,"This section contains the documentation of the Ansible collection ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/osism/ansible-collection-services"},"osism.services"),"."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/01a85c17.9d138910.js b/assets/js/01a85c17.9d138910.js new file mode 100644 index 0000000000..ca2c74e8e0 --- /dev/null +++ b/assets/js/01a85c17.9d138910.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4013],{39058:(e,t,a)=>{a.d(t,{Z:()=>E});var l=a(67294),r=a(86010),n=a(70179),s=a(87524),i=a(39960),c=a(95999);const m={sidebar:"sidebar_re4s",sidebarItemTitle:"sidebarItemTitle_pO2u",sidebarItemList:"sidebarItemList_Yudw",sidebarItem:"sidebarItem__DBe",sidebarItemLink:"sidebarItemLink_mo7H",sidebarItemLinkActive:"sidebarItemLinkActive_I1ZP"};function o(e){let{sidebar:t}=e;return l.createElement("aside",{className:"col col--3"},l.createElement("nav",{className:(0,r.Z)(m.sidebar,"thin-scrollbar"),"aria-label":(0,c.I)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"})},l.createElement("div",{className:(0,r.Z)(m.sidebarItemTitle,"margin-bottom--md")},t.title),l.createElement("ul",{className:(0,r.Z)(m.sidebarItemList,"clean-list")},t.items.map((e=>l.createElement("li",{key:e.permalink,className:m.sidebarItem},l.createElement(i.Z,{isNavLink:!0,to:e.permalink,className:m.sidebarItemLink,activeClassName:m.sidebarItemLinkActive},e.title)))))))}var u=a(13102);function g(e){let{sidebar:t}=e;return l.createElement("ul",{className:"menu__list"},t.items.map((e=>l.createElement("li",{key:e.permalink,className:"menu__list-item"},l.createElement(i.Z,{isNavLink:!0,to:e.permalink,className:"menu__link",activeClassName:"menu__link--active"},e.title)))))}function d(e){return l.createElement(u.Zo,{component:g,props:e})}function b(e){let{sidebar:t}=e;const a=(0,s.i)();return t?.items.length?"mobile"===a?l.createElement(d,{sidebar:t}):l.createElement(o,{sidebar:t}):null}function E(e){const{sidebar:t,toc:a,children:s,...i}=e,c=t&&t.items.length>0;return l.createElement(n.Z,i,l.createElement("div",{className:"container margin-vert--lg"},l.createElement("div",{className:"row"},l.createElement(b,{sidebar:t}),l.createElement("main",{className:(0,r.Z)("col",{"col--7":c,"col--9 col--offset-1":!c}),itemScope:!0,itemType:"http://schema.org/Blog"},s),a&&l.createElement("div",{className:"col col--2"},a))))}},91223:(e,t,a)=>{a.r(t),a.d(t,{default:()=>E});var l=a(67294),r=a(86010),n=a(95999);const s=()=>(0,n.I)({id:"theme.tags.tagsPageTitle",message:"Tags",description:"The title of the tag list page"});var i=a(1944),c=a(35281),m=a(39058),o=a(13008);const u={tag:"tag_Nnez"};function g(e){let{letterEntry:t}=e;return l.createElement("article",null,l.createElement("h2",null,t.letter),l.createElement("ul",{className:"padding--none"},t.tags.map((e=>l.createElement("li",{key:e.permalink,className:u.tag},l.createElement(o.Z,e))))),l.createElement("hr",null))}function d(e){let{tags:t}=e;const a=function(e){const t={};return Object.values(e).forEach((e=>{const a=function(e){return e[0].toUpperCase()}(e.label);t[a]??=[],t[a].push(e)})),Object.entries(t).sort(((e,t)=>{let[a]=e,[l]=t;return a.localeCompare(l)})).map((e=>{let[t,a]=e;return{letter:t,tags:a.sort(((e,t)=>e.label.localeCompare(t.label)))}}))}(t);return l.createElement("section",{className:"margin-vert--lg"},a.map((e=>l.createElement(g,{key:e.letter,letterEntry:e}))))}var b=a(90197);function E(e){let{tags:t,sidebar:a}=e;const n=s();return l.createElement(i.FG,{className:(0,r.Z)(c.k.wrapper.blogPages,c.k.page.blogTagsListPage)},l.createElement(i.d,{title:n}),l.createElement(b.Z,{tag:"blog_tags_list"}),l.createElement(m.Z,{sidebar:a},l.createElement("h1",null,n),l.createElement(d,{tags:t})))}},13008:(e,t,a)=>{a.d(t,{Z:()=>i});var l=a(67294),r=a(86010),n=a(39960);const s={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};function i(e){let{permalink:t,label:a,count:i}=e;return l.createElement(n.Z,{href:t,className:(0,r.Z)(s.tag,i?s.tagWithCount:s.tagRegular)},a,i&&l.createElement("span",null,i))}}}]); \ No newline at end of file diff --git a/assets/js/03c8668f.49e46fdd.js b/assets/js/03c8668f.49e46fdd.js new file mode 100644 index 0000000000..26b67703e0 --- /dev/null +++ b/assets/js/03c8668f.49e46fdd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8275],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>f});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),d=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},p=function(e){var t=d(e.components);return n.createElement(l.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),c=d(r),u=a,f=c["".concat(l,".").concat(u)]||c[u]||m[u]||o;return r?n.createElement(f,i(i({ref:t},p),{},{components:r})):n.createElement(f,i({ref:t},p))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=u;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[c]="string"==typeof e?e:a,i[1]=s;for(var d=2;d{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>s,toc:()=>d});var n=r(87462),a=(r(67294),r(3905));const o={},i="SCS-0412: Metering JSON",s={unversionedId:"ops/scs-0412",id:"ops/scs-0412",title:"SCS-0412: Metering JSON",description:"The SCS-0412 standard addresses the need for a standardized interface to expose IaaS metering data in JSON format within the Sovereign Cloud Stack (SCS). This is to aid cloud operators in integrating SCS IaaS layer data with their existing billing and customer relationship systems. The standard adopts the Ceilometer HTTP hook format provided by the OpenStack Ceilometer project for telemetry and metering, avoiding the need for additional translation layers and implementation components.",source:"@site/standards/ops/scs-0412.md",sourceDirName:"ops",slug:"/ops/scs-0412",permalink:"/standards/ops/scs-0412",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"standards",previous:{title:"Ops Standards",permalink:"/standards/ops/"},next:{title:"Exposition of IaaS metering data as JSON",permalink:"/standards/scs-0412-v1-metering-json"}},l={},d=[],p={toc:d},c="wrapper";function m(e){let{components:t,...r}=e;return(0,a.kt)(c,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"scs-0412-metering-json"},"SCS-0412: Metering JSON"),(0,a.kt)("p",null,"The SCS-0412 standard addresses the need for a standardized interface to expose IaaS metering data in JSON format within the Sovereign Cloud Stack (SCS). This is to aid cloud operators in integrating SCS IaaS layer data with their existing billing and customer relationship systems. The standard adopts the Ceilometer HTTP hook format provided by the OpenStack Ceilometer project for telemetry and metering, avoiding the need for additional translation layers and implementation components."),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Version"),(0,a.kt)("th",{parentName:"tr",align:null},"Type"),(0,a.kt)("th",{parentName:"tr",align:null},"State"),(0,a.kt)("th",{parentName:"tr",align:null},"stabilized"),(0,a.kt)("th",{parentName:"tr",align:null},"obsoleted"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("a",{parentName:"td",href:"/standards/scs-0412-v1-metering-json"},"SCS-0412-v1")),(0,a.kt)("td",{parentName:"tr",align:null},"Standard"),(0,a.kt)("td",{parentName:"tr",align:null},"\ud83d\udfe0 Draft"),(0,a.kt)("td",{parentName:"tr",align:null},"-"),(0,a.kt)("td",{parentName:"tr",align:null},"-")))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/04fe2bfd.11a803b5.js b/assets/js/04fe2bfd.11a803b5.js new file mode 100644 index 0000000000..ca489e4858 --- /dev/null +++ b/assets/js/04fe2bfd.11a803b5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2527],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>g});var o=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function a(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var c=o.createContext({}),l=function(e){var t=o.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},u=function(e){var t=l(e.components);return o.createElement(c.Provider,{value:t},e.children)},m="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},f=o.forwardRef((function(e,t){var r=e.components,n=e.mdxType,i=e.originalType,c=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),m=l(r),f=n,g=m["".concat(c,".").concat(f)]||m[f]||p[f]||i;return r?o.createElement(g,a(a({ref:t},u),{},{components:r})):o.createElement(g,a({ref:t},u))}));function g(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,a=new Array(i);a[0]=f;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[m]="string"==typeof e?e:n,a[1]=s;for(var l=2;l{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>p,frontMatter:()=>i,metadata:()=>s,toc:()=>l});var o=r(87462),n=(r(67294),r(3905));const i={slug:"first-blog-post",title:"First Blog Post",authors:"itrich",tags:["community","howto"]},a=void 0,s={permalink:"/blog/first-blog-post",editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/blog/2022-10-28-first-blog-post.md",source:"@site/blog/2022-10-28-first-blog-post.md",title:"First Blog Post",description:"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet",date:"2022-10-28T00:00:00.000Z",formattedDate:"October 28, 2022",tags:[{label:"community",permalink:"/blog/tags/community"},{label:"howto",permalink:"/blog/tags/howto"}],readingTime:.12,hasTruncateMarker:!1,authors:[{name:"Eduard Itrich",title:"Community Manager @ SCS",url:"https://github.com/itrich",imageURL:"https://github.com/itrich.png",key:"itrich"}],frontMatter:{slug:"first-blog-post",title:"First Blog Post",authors:"itrich",tags:["community","howto"]}},c={authorsImageUrls:[void 0]},l=[],u={toc:l},m="wrapper";function p(e){let{components:t,...r}=e;return(0,n.kt)(m,(0,o.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/059c4264.3f0b191f.js b/assets/js/059c4264.3f0b191f.js new file mode 100644 index 0000000000..a40435fed0 --- /dev/null +++ b/assets/js/059c4264.3f0b191f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2491],{98656:e=>{e.exports=JSON.parse('{"title":"Status Page API","slug":"/category/status-page-api","permalink":"/docs/category/status-page-api","navigation":{"previous":{"title":"Components","permalink":"/docs/category/components-2"},"next":{"title":"Overview","permalink":"/docs/operating-scs/components/status-page/docs/overview"}}}')}}]); \ No newline at end of file diff --git a/assets/js/05e7973d.e9b6c205.js b/assets/js/05e7973d.e9b6c205.js new file mode 100644 index 0000000000..1a8bb305b3 --- /dev/null +++ b/assets/js/05e7973d.e9b6c205.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3299],{3905:(e,t,n)=>{n.d(t,{Zo:()=>m,kt:()=>u});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),d=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},m=function(e){var t=d(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,m=s(e,["components","mdxType","originalType","parentName"]),p=d(n),g=a,u=p["".concat(l,".").concat(g)]||p[g]||c[g]||i;return n?r.createElement(u,o(o({ref:t},m),{},{components:n})):r.createElement(u,o({ref:t},m))}));function u(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,o=new Array(i);o[0]=g;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:a,o[1]=s;for(var d=2;d{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>c,frontMatter:()=>i,metadata:()=>s,toc:()=>d});var r=n(87462),a=(n(67294),n(3905));const i={sidebar_label:"SSH Config"},o="SSH Config",s={unversionedId:"iaas/guides/configuration-guide/commons/sshconfig",id:"iaas/guides/configuration-guide/commons/sshconfig",title:"SSH Config",description:"With the osism.commons.sshconfig role, it is possible to manage a SSH config",source:"@site/docs/02-iaas/guides/configuration-guide/commons/sshconfig.md",sourceDirName:"02-iaas/guides/configuration-guide/commons",slug:"/iaas/guides/configuration-guide/commons/sshconfig",permalink:"/docs/iaas/guides/configuration-guide/commons/sshconfig",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/configuration-guide/commons/sshconfig.md",tags:[],version:"current",frontMatter:{sidebar_label:"SSH Config"},sidebar:"docs",previous:{title:"Services",permalink:"/docs/iaas/guides/configuration-guide/commons/services"},next:{title:"Sysctl",permalink:"/docs/iaas/guides/configuration-guide/commons/sysctl"}},l={},d=[{value:"Example",id:"example",level:2},{value:"Defaults",id:"defaults",level:2}],m={toc:d},p="wrapper";function c(e){let{components:t,...n}=e;return(0,a.kt)(p,(0,r.Z)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"ssh-config"},"SSH Config"),(0,a.kt)("p",null,"With the ",(0,a.kt)("inlineCode",{parentName:"p"},"osism.commons.sshconfig")," role, it is possible to manage a SSH config\nfile in the home directory of the operator user."),(0,a.kt)("h2",{id:"example"},"Example"),(0,a.kt)("p",null,"In the ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/osism/testbed"},"testbed"),"\nthe ",(0,a.kt)("inlineCode",{parentName:"p"},"/home/dragon/.ssh/config")," file is created on the manager node ",(0,a.kt)("inlineCode",{parentName:"p"},"testbed-manager"),"."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-none",metastring:'title="Example for an assembled /home/dragon/.ssh/config file"',title:'"Example',for:!0,an:!0,assembled:!0,"/home/dragon/.ssh/config":!0,'file"':!0},"Host testbed-manager\n HostName testbed-manager.testbed.osism.xyz\n User dragon\n Port 22\n IdentityFile /opt/ansible/secrets/id_rsa.operator\n\n####################\nHost testbed-node-0\n HostName testbed-node-0.testbed.osism.xyz\n User dragon\n Port 22\n IdentityFile /opt/ansible/secrets/id_rsa.operator\n\n####################\nHost testbed-node-1\n HostName testbed-node-1.testbed.osism.xyz\n User dragon\n Port 22\n IdentityFile /opt/ansible/secrets/id_rsa.operator\n\n####################\nHost testbed-node-2\n HostName testbed-node-2.testbed.osism.xyz\n User dragon\n Port 22\n IdentityFile /opt/ansible/secrets/id_rsa.operator\n")),(0,a.kt)("h2",{id:"defaults"},"Defaults"),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},(0,a.kt)("strong",{parentName:"th"},"Parameter")),(0,a.kt)("th",{parentName:"tr",align:null},(0,a.kt)("strong",{parentName:"th"},"Default")),(0,a.kt)("th",{parentName:"tr",align:null},(0,a.kt)("strong",{parentName:"th"},"Description")))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"sshconfig_groupname")),(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"all")),(0,a.kt)("td",{parentName:"tr",align:null},"All nodes in this group are included.")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"sshconfig_order")),(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"20")),(0,a.kt)("td",{parentName:"tr",align:null},"The ",(0,a.kt)("inlineCode",{parentName:"td"},".ssh/config.d")," directory is used to prepare the ",(0,a.kt)("inlineCode",{parentName:"td"},".ssh/config")," file. You can add your own files in this directory. Everything with a filename prefix smaller than ",(0,a.kt)("inlineCode",{parentName:"td"},"sshconfig_order")," is placed at the beginning of the assembled ",(0,a.kt)("inlineCode",{parentName:"td"},".ssh/config")," file. Anything with a filename prefix greater than ",(0,a.kt)("inlineCode",{parentName:"td"},"sshconfig_order")," goes at the end.")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"sshconfig_port")),(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"22")),(0,a.kt)("td",{parentName:"tr",align:null},"The SSH port.")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"sshconfig_private_key_file")),(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"/opt/ansible/secrets/id_rsa.operator")),(0,a.kt)("td",{parentName:"tr",align:null},"The identity file to use. The file itself must already exist there. The file is created by the ",(0,a.kt)("inlineCode",{parentName:"td"},"osism.services.manager")," role.")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"sshconfig_user")),(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},'"{{ operator_user }}"')),(0,a.kt)("td",{parentName:"tr",align:null},"The user in which home directory the ",(0,a.kt)("inlineCode",{parentName:"td"},".ssh/config")," file will be generated.")))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/061d8128.3afef4fd.js b/assets/js/061d8128.3afef4fd.js new file mode 100644 index 0000000000..2066daba79 --- /dev/null +++ b/assets/js/061d8128.3afef4fd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[713],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>c});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=n.createContext({}),p=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},d=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,s=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),m=p(a),h=r,c=m["".concat(s,".").concat(h)]||m[h]||u[h]||i;return a?n.createElement(c,l(l({ref:t},d),{},{components:a})):n.createElement(c,l({ref:t},d))}));function c(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,l=new Array(i);l[0]=h;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[m]="string"==typeof e?e:r,l[1]=o;for(var p=2;p{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>u,frontMatter:()=>i,metadata:()=>o,toc:()=>p});var n=a(87462),r=(a(67294),a(3905));const i={title:"SCS Flavor Naming Standard",type:"Standard",status:"Stable",stabilized_at:new Date("2023-06-14T00:00:00.000Z"),track:"IaaS",replaces:"scs-0100-v2-flavor-naming.md"},l=void 0,o={unversionedId:"scs-0100-v3-flavor-naming",id:"scs-0100-v3-flavor-naming",title:"SCS Flavor Naming Standard",description:"Introduction",source:"@site/standards/scs-0100-v3-flavor-naming.md",sourceDirName:".",slug:"/scs-0100-v3-flavor-naming",permalink:"/standards/scs-0100-v3-flavor-naming",draft:!1,tags:[],version:"current",frontMatter:{title:"SCS Flavor Naming Standard",type:"Standard",status:"Stable",stabilized_at:"2023-06-14T00:00:00.000Z",track:"IaaS",replaces:"scs-0100-v2-flavor-naming.md"},sidebar:"standards",previous:{title:"SCS Flavor Naming Standard",permalink:"/standards/scs-0100-v2-flavor-naming"},next:{title:"SCS-0101: Entropy",permalink:"/standards/iaas/scs-0101"}},s={},p=[{value:"Introduction",id:"introduction",level:2},{value:"Motivation",id:"motivation",level:2},{value:"Design Considerations",id:"design-considerations",level:2},{value:"Type of information included",id:"type-of-information-included",level:3},{value:"Complete Proposal for systematic flavor naming",id:"complete-proposal-for-systematic-flavor-naming",level:2},{value:"Proposal Details",id:"proposal-details",level:2},{value:"REQUIRED CPU Suffixes",id:"required-cpu-suffixes",level:3},{value:"Baseline",id:"baseline",level:4},{value:"Higher oversubscription",id:"higher-oversubscription",level:4},{value:"Insufficient microcode",id:"insufficient-microcode",level:4},{value:"Examples",id:"examples",level:4},{value:"REQUIRED Memory",id:"required-memory",level:3},{value:"Baseline",id:"baseline-1",level:4},{value:"No ECC",id:"no-ecc",level:4},{value:"Enabled Oversubscription",id:"enabled-oversubscription",level:4},{value:"Examples",id:"examples-1",level:4},{value:"OPTIONAL Disk sizes and types",id:"optional-disk-sizes-and-types",level:3},{value:"Baseline",id:"baseline-2",level:4},{value:"Multi-provisioned Disk",id:"multi-provisioned-disk",level:4},{value:"Examples",id:"examples-2",level:4},{value:"Naming policy compliance",id:"naming-policy-compliance",level:2},{value:"Conformance Tests",id:"conformance-tests",level:2},{value:"Extensions",id:"extensions",level:2},{value:"OPTIONAL Hypervisor",id:"optional-hypervisor",level:3},{value:"Examples",id:"examples-3",level:4},{value:"OPTIONAL Hardware virtualization / Nested virtualization",id:"optional-hardware-virtualization--nested-virtualization",level:3},{value:"Examples",id:"examples-4",level:4},{value:"OPTIONAL CPU Architecture Details",id:"optional-cpu-architecture-details",level:3},{value:"Generation and Vendor",id:"generation-and-vendor",level:4},{value:"Frequency Suffixes",id:"frequency-suffixes",level:4},{value:"Examples",id:"examples-5",level:4},{value:"OPTIONAL GPU support",id:"optional-gpu-support",level:3},{value:"OPTIONAL Infiniband",id:"optional-infiniband",level:3},{value:"Naming options advice",id:"naming-options-advice",level:3},{value:"Proposal Examples",id:"proposal-examples",level:2},{value:"Previous standard versions",id:"previous-standard-versions",level:2},{value:"Beyond SCS",id:"beyond-scs",level:2}],d={toc:p},m="wrapper";function u(e){let{components:t,...a}=e;return(0,r.kt)(m,(0,n.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"introduction"},"Introduction"),(0,r.kt)("p",null,"This is the standard v3.1 for SCS Release 5.\nNote that we intend to only extend it (so it's always backwards compatible),\nbut try to avoid changing in incompatible ways.\n(See at the end for the v1 to v2 transition where we have not met that\ngoal, but at least managed to have a 1:1 relationship between v1 and v2 names.)"),(0,r.kt)("h2",{id:"motivation"},"Motivation"),(0,r.kt)("p",null,"In OpenStack environments there is a need to define different flavors for instances.\nThe flavors are pre-defined by the operator, the customer can not change these.\nOpenStack providers thus typically offer a large selection of flavors."),(0,r.kt)("p",null,"While flavors can be discovered (",(0,r.kt)("inlineCode",{parentName:"p"},"openstack flavor list"),"), it is helpful for users (DevOps teams),\nto have a naming scheme that is used across all SCS flavors, so flavor names have the same meaning everywhere."),(0,r.kt)("p",null,"While not all details will be encoded in the name, the key features should be obvious:\nNumber of vCPUs, RAM, Root Disk.\nExtra features are important as well: There will be flavors with GPU support, fast disks for databases,\nmemory-heavy applications, and other useful aspects of an instance."),(0,r.kt)("p",null,"It may also be important to make the CPU generation clearly recognizable, as this is always a topic in\ndiscussions with customers."),(0,r.kt)("p",null,"Note that not all relevant properties of flavors can be discovered; creating a specification\nto address this is a separate but related effort to the name standardization.\nCommonly used infrastructure-as-code tools do not provide a way to use discoverability\nfeatures to express something like \"I want a flavor with 2 vCPUs, 8GiB of RAM, a local\n20GB SSD disk and Infiniband support but I don't care whether it's AMD or intel\" in a\nreasonable manner. Using flavor names to express this will thus continue to be useful\nand we don't expect the need for standardization of flavor names to go away until\nthe commonly used IaC tools work on a higher abstraction layer than they currently do."),(0,r.kt)("h2",{id:"design-considerations"},"Design Considerations"),(0,r.kt)("h3",{id:"type-of-information-included"},"Type of information included"),(0,r.kt)("p",null,"From discussions of our operators with their customers we learned that\nthe following characteristics are important in a flavor description:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"left"},"Type"),(0,r.kt)("th",{parentName:"tr",align:"left"},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Generation"),(0,r.kt)("td",{parentName:"tr",align:"left"},"CPU Generation")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Number of CPU"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Number of vCPUs - suffixed by L,V,T,C (see below)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Amount of RAM"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Amount of memory available for the VM")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Performance Class"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Ability to label high-performance CPUs, disks, network")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"CPU Type"),(0,r.kt)("td",{parentName:"tr",align:"left"},"X86-intel, X86-amd, ARM, RISC-V, Generic")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},'"bms"'),(0,r.kt)("td",{parentName:"tr",align:"left"},"Bare Metal System (no virtualization/hypervisor)")))),(0,r.kt)("p",null,"This list is likely not comprehensive and will grow over time."),(0,r.kt)("p",null,"Rather than using random names ",(0,r.kt)("inlineCode",{parentName:"p"},"s5a.medium")," and assigning a discrete set of properties\nto them, we wanted to come up with a scheme that allows to systematically derive\nnames from properties and vice versa. The scheme allows for short names (by not\nencoding all details) as well as very detailed longer names."),(0,r.kt)("h2",{id:"complete-proposal-for-systematic-flavor-naming"},"Complete Proposal for systematic flavor naming"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Prefix"),(0,r.kt)("th",{parentName:"tr",align:null},"CPUs & Suffix"),(0,r.kt)("th",{parentName:"tr",align:null},"RAM","[GiB]"),(0,r.kt)("th",{parentName:"tr",align:null},"optional: Disk","[GB]","&type"),(0,r.kt)("th",{parentName:"tr",align:null},"opt: extensions"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"SCS-")),(0,r.kt)("td",{parentName:"tr",align:null},"N",(0,r.kt)("inlineCode",{parentName:"td"},"L/V/T/C"),"[",(0,r.kt)("inlineCode",{parentName:"td"},"i"),"]"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"-"),"N","[",(0,r.kt)("inlineCode",{parentName:"td"},"u"),"]","[",(0,r.kt)("inlineCode",{parentName:"td"},"o"),"]"),(0,r.kt)("td",{parentName:"tr",align:null},"[",(0,r.kt)("inlineCode",{parentName:"td"},"-"),"[","M",(0,r.kt)("inlineCode",{parentName:"td"},"x"),"]","N","[",(0,r.kt)("inlineCode",{parentName:"td"},"n/h/s/p"),"]","]"),(0,r.kt)("td",{parentName:"tr",align:null},"[",(0,r.kt)("inlineCode",{parentName:"td"},"_"),"EXT","]")))),(0,r.kt)("p",null,"Note that N and M are placeholders for numbers here.\nThe optional fields are denoted in brackets (and have opt: in the header.\nSee below for extensions."),(0,r.kt)("p",null,"Note that all letters are case-sensitive."),(0,r.kt)("p",null,"Typical flavor names look like ",(0,r.kt)("inlineCode",{parentName:"p"},"SCS-4V-16-50")," for a flavor with 4vCPUs (with limited\noversubscription), 16GiB RAM and a 50GB disk (of unspecified type)."),(0,r.kt)("h2",{id:"proposal-details"},"Proposal Details"),(0,r.kt)("h3",{id:"required-cpu-suffixes"},"[REQUIRED]"," CPU Suffixes"),(0,r.kt)("p",null,"Next to the number of vCPUs, these vCPUs need to be characterized to describe their nature."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Suffix"),(0,r.kt)("th",{parentName:"tr",align:null},"Meaning"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"C"),(0,r.kt)("td",{parentName:"tr",align:null},"dedicated Core")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"T"),(0,r.kt)("td",{parentName:"tr",align:null},"dedicated Thread (SMT)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"V"),(0,r.kt)("td",{parentName:"tr",align:null},"vCPU (oversubscribed)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"L"),(0,r.kt)("td",{parentName:"tr",align:null},"vCPU (heavily oversubscribed)")))),(0,r.kt)("h4",{id:"baseline"},"Baseline"),(0,r.kt)("p",null,"Note that vCPU oversubscription for a ",(0,r.kt)("inlineCode",{parentName:"p"},"V")," vCPU should be implemented such, that we\ncan guarantee ",(0,r.kt)("em",{parentName:"p"},"at least 20% of a core in >99% of the time"),"; this can be achieved by\nlimiting vCPU oversubscription to 5x per core (or 3x per thread when SMT/HT is enabled)\nor by more advanced workload management logic. Otherwise ",(0,r.kt)("inlineCode",{parentName:"p"},"L")," (low performance) instead\nof ",(0,r.kt)("inlineCode",{parentName:"p"},"V")," must be used. The >99% is measured over a month (1% is 7.2h/month)."),(0,r.kt)("p",null,"Note that CPUs should use latest microcode to protect against CPU vulnerabilities (Spectre, Meltdown, L1TF, etc.).\nIn particular,"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"microcode must be updated within less than a month of a new release; for CVSS scores above 8,\nproviders should do it in less than a week."),(0,r.kt)("li",{parentName:"ul"},"all mitigations that are enabled by default in the Linux kernel and the KVM hypervisor\nshould be enabled,"),(0,r.kt)("li",{parentName:"ul"},"CPUs that are susceptible to L1TF (intel x86 pre Cascade Lake) should have hyperthreading\ndisabled OR (in the future) use core scheduling implementations that are deemed to be secure by the SCS security team.")),(0,r.kt)("p",null,"That is to say, except when the suffix ",(0,r.kt)("inlineCode",{parentName:"p"},"i")," is used, the provider commits itself to implementing the appropriate mitigations\nif and when they become available, within the timeframes mentioned above."),(0,r.kt)("p",null,"If a provider does not want to commit to deploying available microcode fixes and upstream kernel/hypervisor updates within a month or\nif the provider wants to enable hyperthreading on compute hosts despite having CPUs susceptible to L1TF there\n(and no SCS-accepted core-scheduling mechanism is used for mitigation),\nthe flavors must be declared insecure with the ",(0,r.kt)("inlineCode",{parentName:"p"},"i")," suffix (see below)."),(0,r.kt)("h4",{id:"higher-oversubscription"},"Higher oversubscription"),(0,r.kt)("p",null,"Must be indicated with a ",(0,r.kt)("inlineCode",{parentName:"p"},"L")," vCPU type (low performance for > 5x/core or > 3x/thread oversubscription and\nthe lack of workload management that would prevent worst case performance <20% in more than 7.2h per month)."),(0,r.kt)("h4",{id:"insufficient-microcode"},"Insufficient microcode"),(0,r.kt)("p",null,"Not using these mitigations must be indicated by an additional ",(0,r.kt)("inlineCode",{parentName:"p"},"i")," suffix for insecure\n(weak protection against CPU vulns through insufficient microcode, lack of disabled hyperthreading\non L1TF susceptible CPUs w/o effective core scheduling or disabled protections on the host/hypervisor)."),(0,r.kt)("h4",{id:"examples"},"Examples"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"SCS-",(0,r.kt)("strong",{parentName:"li"},"2C"),"-4-10n"),(0,r.kt)("li",{parentName:"ul"},"SCS-",(0,r.kt)("strong",{parentName:"li"},"2T"),"-4-10n"),(0,r.kt)("li",{parentName:"ul"},"SCS-",(0,r.kt)("strong",{parentName:"li"},"2V"),"-4-10n"),(0,r.kt)("li",{parentName:"ul"},"SCS-",(0,r.kt)("strong",{parentName:"li"},"2L"),"-4-10n"),(0,r.kt)("li",{parentName:"ul"},"SCS-",(0,r.kt)("strong",{parentName:"li"},"2Li"),"-4-10n"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("del",{parentName:"li"},"SCS-",(0,r.kt)("strong",{parentName:"del"},"2"),"-","*","*","4-10n")," <- CPU suffix missing"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("del",{parentName:"li"},"SCS-",(0,r.kt)("strong",{parentName:"del"},"2iT"),"-4-10n")," <- This order is forbidden")),(0,r.kt)("h3",{id:"required-memory"},"[REQUIRED]"," Memory"),(0,r.kt)("h4",{id:"baseline-1"},"Baseline"),(0,r.kt)("p",null,"Cloud providers should use ECC memory.\nMemory oversubscription should not be used.\nIt is allowed to specify half GiBs (e.g. 3.5), though this is should not be done for larger memory sizes (>= 10GiB)."),(0,r.kt)("h4",{id:"no-ecc"},"No ECC"),(0,r.kt)("p",null,"If no ECC is used, the ",(0,r.kt)("inlineCode",{parentName:"p"},"u")," suffix must indicate this."),(0,r.kt)("h4",{id:"enabled-oversubscription"},"Enabled Oversubscription"),(0,r.kt)("p",null,"If memory is oversubscribed, you must expose this with the ",(0,r.kt)("inlineCode",{parentName:"p"},"o")," suffix."),(0,r.kt)("h4",{id:"examples-1"},"Examples"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"SCS-2C-",(0,r.kt)("strong",{parentName:"li"},"4"),"-10n"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-",(0,r.kt)("strong",{parentName:"li"},"3.5"),"-10n"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-",(0,r.kt)("strong",{parentName:"li"},"4u"),"-10n"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-",(0,r.kt)("strong",{parentName:"li"},"4o"),"-10n"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-",(0,r.kt)("strong",{parentName:"li"},"4uo"),"-10n"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("del",{parentName:"li"},"SCS-2C-",(0,r.kt)("strong",{parentName:"del"},"4ou"),"-10n")," <- This order is forbidden")),(0,r.kt)("h3",{id:"optional-disk-sizes-and-types"},"[OPTIONAL]"," Disk sizes and types"),(0,r.kt)("p",null,"Disk sizes (in GB) should use sizes 5, 10, 20, 50, 100, 200, 500, 1000."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Disk type"),(0,r.kt)("th",{parentName:"tr",align:null},"Meaning"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"n"),(0,r.kt)("td",{parentName:"tr",align:null},"Network shared storage (ceph/cinder)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"h"),(0,r.kt)("td",{parentName:"tr",align:null},"Local disk (HDD: SATA/SAS class)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"s"),(0,r.kt)("td",{parentName:"tr",align:null},"Local SSD disk")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"p"),(0,r.kt)("td",{parentName:"tr",align:null},"Local high-perf NVMe")))),(0,r.kt)("h4",{id:"baseline-2"},"Baseline"),(0,r.kt)("p",null,"Note that disk type might be omitted \u2014 the user then can not take any assumptions\non what storage is provided for the root disk (that the image gets provisioned to)."),(0,r.kt)("p",null,"It does make sense for ",(0,r.kt)("inlineCode",{parentName:"p"},"n")," to be requested explicitly to allow for smooth live migration.\n",(0,r.kt)("inlineCode",{parentName:"p"},"h")," typically provides latency advantages vs ",(0,r.kt)("inlineCode",{parentName:"p"},"n")," (but not necessarily bandwidth and\nalso is more likely to fail), ",(0,r.kt)("inlineCode",{parentName:"p"},"s")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"p")," are for applications that need low\nlatency (high IOPS) and bandwidth disk I/O. ",(0,r.kt)("inlineCode",{parentName:"p"},"n")," storage is expected to survive\nsingle-disk and single-node failure."),(0,r.kt)("p",null,"For specific requirements on the SSD and NVMe disks regarding IOPS and\npower-loss protection, refer to Decision Record ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Standards/scs-0110-v1-ssd-flavors.md"},"scs-0110-ssd-flavors"),"."),(0,r.kt)("p",null,"If the disk size is left out, the cloud is expected to allocate a disk (network or local)\nthat is large enough to fit the root file system (",(0,r.kt)("inlineCode",{parentName:"p"},"min_disk")," in image). This automatic\nallocation is indicated with ",(0,r.kt)("inlineCode",{parentName:"p"},"-")," without a disk size.\nIf the ",(0,r.kt)("inlineCode",{parentName:"p"},"-")," is left out completely, the user must create a boot volume manually and\ntell the instance to boot from it or use the\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.openstack.org/api-ref/compute/?expanded=create-server-detail#create-server"},(0,r.kt)("inlineCode",{parentName:"a"},"block_device_mapping_v2")),"\nmechanism explicitly to create the boot volume from an image."),(0,r.kt)("h4",{id:"multi-provisioned-disk"},"Multi-provisioned Disk"),(0,r.kt)("p",null,"The disk size can be prefixed with ",(0,r.kt)("inlineCode",{parentName:"p"},"Mx prefix"),", where M is an integer specifying that the disk\nis provisioned M times. Multiple disks provided this way should be independent storage media,\nso users can expect some level of parallelism and independence."),(0,r.kt)("h4",{id:"examples-2"},"Examples"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-",(0,r.kt)("strong",{parentName:"li"},"10n")),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-",(0,r.kt)("strong",{parentName:"li"},"10s")),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-",(0,r.kt)("strong",{parentName:"li"},"10s"),"_","bms","_","z3"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-",(0,r.kt)("strong",{parentName:"li"},"3x10s")," <- Cloud creates three 10GB SSDs"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-",(0,r.kt)("strong",{parentName:"li"},"3x10s"),"_","bms","_","z3"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-",(0,r.kt)("strong",{parentName:"li"},"10")," <- Cloud decides disk type"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-",(0,r.kt)("strong",{parentName:"li"},"10"),"_","bms","_","z3"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-",(0,r.kt)("strong",{parentName:"li"},"n")," <- Cloud decides disk size (min","_","disk from image or larger)"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-",(0,r.kt)("strong",{parentName:"li"},"n"),"_","bms","_","3"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4- <- Cloud decides disk type and size"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-","_","bms","_","z3"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-","_","bms","_","z3h","_","GNa-64","_","ib"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-","_","ib"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4 <- You need to specify a boot volume yourself (boot from volume, or use ",(0,r.kt)("inlineCode",{parentName:"li"},"block_device_mapping_v2"),")"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4","_","bms","_","z3"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-3x10 <- Cloud decides type and creates three 10GB volumes"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("del",{parentName:"li"},"SCS-2C-4-",(0,r.kt)("strong",{parentName:"del"},"1.5n"))," <- You must not specify disk sizes which are not in full GiBs")),(0,r.kt)("h2",{id:"naming-policy-compliance"},"Naming policy compliance"),(0,r.kt)("p",null,"You are allowed to understate your performance; you may implement a SCS-1V-1-5 flavor with\na flavor that actually implements SCS-1T-1-5n (i.e. you dedicate a dedicated hyperthread instead\nof higher oversubscription) or even SCS-1C-1.5-8s (1 dedicated core, 50% more RAM and a 8GiB SSD).\nOr you may offer the (v3 mandatory) ",(0,r.kt)("inlineCode",{parentName:"p"},"SCS-2V-4-20s")," with a ",(0,r.kt)("inlineCode",{parentName:"p"},"SCS-2V-4-20p")," (using a local NVMe\ninstead of an SSD)."),(0,r.kt)("p",null,"Flavor names indicating certain capabilities must ",(0,r.kt)("em",{parentName:"p"},"at least")," provide these, otherwise they\nare in violation of the SCS specification and prevent SCS compliance."),(0,r.kt)("p",null,"We expect all cloud providers to offer the short, less specific flavor names (such as SCS-8V-32-100).\nLarger providers that offer more details (using the extension below) are expected to still also\noffer the short variants for usability and easier portability, even beyond the mandated flavors."),(0,r.kt)("p",null,"You must be very careful to expose low vCPU guarantees (",(0,r.kt)("inlineCode",{parentName:"p"},"L")," instead of ",(0,r.kt)("inlineCode",{parentName:"p"},"V"),"), insecure\nhyperthreading/microcode ",(0,r.kt)("inlineCode",{parentName:"p"},"i"),", non-ECC-RAM ",(0,r.kt)("inlineCode",{parentName:"p"},"u"),", memory oversubscription ",(0,r.kt)("inlineCode",{parentName:"p"},"o"),". Note that omitting these qualifiers\nis ",(0,r.kt)("em",{parentName:"p"},"overstating")," your security, reliability or performance properties and may be reason for\nclients to feel betrayed or claim damages. This would prevent SCS compliance and certification;\nin extreme cases, the SCS project might be forced to work with public statements."),(0,r.kt)("p",null,"You may offer additional ",(0,r.kt)("inlineCode",{parentName:"p"},"SCS-")," flavors, following the naming scheme and rules outlined here."),(0,r.kt)("p",null,"You may offer additional flavors, not following above scheme and not starting with ",(0,r.kt)("inlineCode",{parentName:"p"},"SCS-")),(0,r.kt)("p",null,"You must not offer flavors with the ",(0,r.kt)("inlineCode",{parentName:"p"},"SCS-")," prefix which do not follow this naming scheme."),(0,r.kt)("p",null,"You must not extend the SCS naming scheme with your own extensions; you are encouraged however\nto suggest extensions that we can discuss and add to the official scheme."),(0,r.kt)("h2",{id:"conformance-tests"},"Conformance Tests"),(0,r.kt)("p",null,"There is a script in ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Tests/iaas/flavor-naming/flavor-name-check.py"},(0,r.kt)("inlineCode",{parentName:"a"},"flavor-name-check.py")),"\nwhich can be used to decode, validate and construct flavor names.\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Tests/iaas/flavor-naming/flavor-name-describe.py"},(0,r.kt)("inlineCode",{parentName:"a"},"flavor-name-describe.py"))," outputs a human-readable decoding of the SCS flavor names.\nThese scripts must stay in sync with the specification text."),(0,r.kt)("p",null,"Ensure you have your OpenStack tooling (",(0,r.kt)("inlineCode",{parentName:"p"},"python3-openstackclient"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"OS_CLOUD"),") setup and call\n",(0,r.kt)("inlineCode",{parentName:"p"},"tools/flavor-name-check.py -c $(openstack flavor list -f value -c Name)")," to get a report\non the flavor list compliance of the cloud environment."),(0,r.kt)("p",null,"The script ",(0,r.kt)("inlineCode",{parentName:"p"},"flavor-names-openstack.py")," talks to the OpenStack API of the\ncloud specified by the ",(0,r.kt)("inlineCode",{parentName:"p"},"OS_CLOUD")," environment and queries properties and checks\nthe names for standards compliance.\nIt goes beyond the above example in checking that the discoverable\nfeatures of flavors (vCPUs, RAM, Disk) match what the flavor names claim.\nThis is used for SCS-compatible compliance testing."),(0,r.kt)("h2",{id:"extensions"},"Extensions"),(0,r.kt)("p",null,"Extensions provide a possibility for providers that offer a very differentiated set\nof flavors to indicate hypervisors, support for hardware/nested virtualization,\nCPU types and generations, high-frequency models, GPU support and GPU types as\nwell as Infiniband support. (More extensions may be appended in the future.)"),(0,r.kt)("p",null,"Using the systematic naming approach ensures that two providers that offer flavors\nwith the same specific features will use the same name for them, thus simplifying\nlife for their customers when consuming these flavors."),(0,r.kt)("p",null,"Note that there is no need to indicate all details and extra features this way.\nFlavors may always perform better or have more features than indicated in a name.\nUnderperformance (CPU suffixes ",(0,r.kt)("inlineCode",{parentName:"p"},"L")," or ",(0,r.kt)("inlineCode",{parentName:"p"},"i")," or memory suffixes ",(0,r.kt)("inlineCode",{parentName:"p"},"o")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"u"),") on the other\nhand MUST be indicated in the name; this happens rarely in practice."),(0,r.kt)("p",null,"For smaller providers, the ability to e.g. differentiate between an AMD Milan and an intel\nIceLake and exposed the slightly different feature set to customers and have slightly\ndifferent price points is often not worth the extra effort. This is because having\nthis extra differentiation causes fragmentation of the machines (host aggregates)\nthat can offer these flavors, thus resulting in a lower utilization (as the capacity\nmanagement will need to have a certain amount of headroom per machine pool to avoid\nrunning out of capacity)."),(0,r.kt)("p",null,"Note that it is possible for providers to register both the generic short names and the\nlonger, more detailed names and allow them to use the same set of machines (host aggregates).\nNote that machines (hypervisors) can be part of more than one host aggregate."),(0,r.kt)("p",null,"The extensions have the format:"),(0,r.kt)("p",null,"[",(0,r.kt)("inlineCode",{parentName:"p"},"_"),"hyp","]","[",(0,r.kt)("inlineCode",{parentName:"p"},"_hwv"),"]","[",(0,r.kt)("inlineCode",{parentName:"p"},"_"),"arch","[","N","]","[",(0,r.kt)("inlineCode",{parentName:"p"},"h"),"]","]","[",(0,r.kt)("inlineCode",{parentName:"p"},"_"),"[",(0,r.kt)("inlineCode",{parentName:"p"},"G/g"),"]","X","[","N","]","[",(0,r.kt)("inlineCode",{parentName:"p"},"-"),"M","]","[",(0,r.kt)("inlineCode",{parentName:"p"},"h"),"]","]","[",(0,r.kt)("inlineCode",{parentName:"p"},"_ib"),"]"),(0,r.kt)("p",null,"Extensions are individually optional, but the ones that are used must appear in the order\ngiven in the above line."),(0,r.kt)("p",null,"Remember that letters are case-sensitive.\nIn case you wonder: Feature indicators are capitalized, modifiers are lower case.\n(An exception is the uppercase ",(0,r.kt)("inlineCode",{parentName:"p"},"_G")," for a pass-through GPU vs. lowercase ",(0,r.kt)("inlineCode",{parentName:"p"},"_g")," for vGPU.)"),(0,r.kt)("h3",{id:"optional-hypervisor"},"[OPTIONAL]"," Hypervisor"),(0,r.kt)("p",null,"Format: ",(0,r.kt)("inlineCode",{parentName:"p"},"_"),"hyp"),(0,r.kt)("p",null,"The ",(0,r.kt)("em",{parentName:"p"},"default Hypervisor")," is assumed to be ",(0,r.kt)("inlineCode",{parentName:"p"},"KVM"),". Clouds that offer different hypervisors\nor Bare Metal Systems should indicate the Hypervisor according to the following table:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"hyp"),(0,r.kt)("th",{parentName:"tr",align:null},"Meaning"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"kvm"),(0,r.kt)("td",{parentName:"tr",align:null},"KVM")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"xen"),(0,r.kt)("td",{parentName:"tr",align:null},"Xen")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"vmw"),(0,r.kt)("td",{parentName:"tr",align:null},"VMware")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"hyv"),(0,r.kt)("td",{parentName:"tr",align:null},"Hyper-V")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"bms"),(0,r.kt)("td",{parentName:"tr",align:null},"Bare Metal System")))),(0,r.kt)("h4",{id:"examples-3"},"Examples"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-10n"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-10n","_",(0,r.kt)("strong",{parentName:"li"},"bms")),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-10n","_",(0,r.kt)("strong",{parentName:"li"},"bms"),"_","z3h")),(0,r.kt)("h3",{id:"optional-hardware-virtualization--nested-virtualization"},"[OPTIONAL]"," Hardware virtualization / Nested virtualization"),(0,r.kt)("p",null,"Format: ",(0,r.kt)("inlineCode",{parentName:"p"},"_hwv")),(0,r.kt)("p",null,"If the instances that are created with this flavor support hardware-accelerated\nvirtualization, this can be reflected with the ",(0,r.kt)("inlineCode",{parentName:"p"},"_hwv")," flag (after the optional\nHypervisor flag). On x86, this means that in the instance, the CPU flag vmx (intel)\nor svm (AMD) is available. This will be the case on Bare Metal flavors on almost\nall non-ancient x86 CPUs or if your virtualization hypervisor is configured to\nsupport nested virtualization.\nFlavors without the ",(0,r.kt)("inlineCode",{parentName:"p"},"_hwv")," flag may or may not support hardware virtualization (as we\nrecommend enabling nesting, but don't require flavor names to reflect all\ncapabilities. Flavors may over-deliver ...)"),(0,r.kt)("h4",{id:"examples-4"},"Examples"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-10 <- may or may not support HW virtualization in VMs"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-10",(0,r.kt)("em",{parentName:"li"},"kvm"),(0,r.kt)("strong",{parentName:"li"},"hwv")," <- kvm with enabled nested virtualization"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-10","_",(0,r.kt)("strong",{parentName:"li"},"hwv")," <- not recommended, but allowed"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-10","_","bms","_",(0,r.kt)("strong",{parentName:"li"},"hwv")," <- better: bare metal with HW virt support (VMX on intel, SVM on AMD, ...)"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("del",{parentName:"li"},"SCS-2C-4-10","_",(0,r.kt)("strong",{parentName:"del"},"hwv"),"_","xen")," <- illegal, wrong ordering")),(0,r.kt)("h3",{id:"optional-cpu-architecture-details"},"[OPTIONAL]"," CPU Architecture Details"),(0,r.kt)("p",null,"Format: ",(0,r.kt)("inlineCode",{parentName:"p"},"_"),"arch","[","N","]","[",(0,r.kt)("inlineCode",{parentName:"p"},"h"),"]"),(0,r.kt)("p",null,"This extension provides more details on the specific CPU:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"vendor/architecture (arch)"),(0,r.kt)("li",{parentName:"ul"},"generation (N)"),(0,r.kt)("li",{parentName:"ul"},"frequency (h)")),(0,r.kt)("h4",{id:"generation-and-vendor"},"Generation and Vendor"),(0,r.kt)("p",null,"The options for arch are as follows:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Letter"),(0,r.kt)("th",{parentName:"tr",align:null},"vendor/architecture"),(0,r.kt)("th",{parentName:"tr",align:null},"Corresponding image architecture"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"(none)"),(0,r.kt)("td",{parentName:"tr",align:null},"Generic x86-64"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"x86_64"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"i")),(0,r.kt)("td",{parentName:"tr",align:null},"Intel x86-64"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"x86_64"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"z")),(0,r.kt)("td",{parentName:"tr",align:null},"AMD (Zen) x86-64"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"x86_64"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"a")),(0,r.kt)("td",{parentName:"tr",align:null},"ARM v8+"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"aarch64"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"r")),(0,r.kt)("td",{parentName:"tr",align:null},"RISC-V"),(0,r.kt)("td",{parentName:"tr",align:null},"(not yet listed in Glance)")))),(0,r.kt)("p",null,"The generation is vendor specific and can be left out, but it can only be specified in\nconjunction with a vendor. At present, these values are possible:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Generation"),(0,r.kt)("th",{parentName:"tr",align:null},"i (Intel x86-64)"),(0,r.kt)("th",{parentName:"tr",align:null},"z (AMD x86-64)"),(0,r.kt)("th",{parentName:"tr",align:null},"\xa0a (AArch64)"),(0,r.kt)("th",{parentName:"tr",align:null},"r (RISC-V)"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"0"),(0,r.kt)("td",{parentName:"tr",align:null},"pre Skylake"),(0,r.kt)("td",{parentName:"tr",align:null},"pre Zen"),(0,r.kt)("td",{parentName:"tr",align:null},"pre Cortex A76"),(0,r.kt)("td",{parentName:"tr",align:null},"TBD")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1"),(0,r.kt)("td",{parentName:"tr",align:null},"Skylake"),(0,r.kt)("td",{parentName:"tr",align:null},"Zen-1 (Naples)"),(0,r.kt)("td",{parentName:"tr",align:null},"A76/NeoN1 class"),(0,r.kt)("td",{parentName:"tr",align:null},"TBD")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"2"),(0,r.kt)("td",{parentName:"tr",align:null},"Cascade Lake"),(0,r.kt)("td",{parentName:"tr",align:null},"Zen-2 (Rome)"),(0,r.kt)("td",{parentName:"tr",align:null},"A78/x1/NeoV1 class"),(0,r.kt)("td",{parentName:"tr",align:null},"TBD")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"3"),(0,r.kt)("td",{parentName:"tr",align:null},"Ice Lake"),(0,r.kt)("td",{parentName:"tr",align:null},"Zen-3 (Milan)"),(0,r.kt)("td",{parentName:"tr",align:null},"A71x/NeoN2 (ARMv9)"),(0,r.kt)("td",{parentName:"tr",align:null},"TBD")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"4"),(0,r.kt)("td",{parentName:"tr",align:null},"Sapphire Rapids"),(0,r.kt)("td",{parentName:"tr",align:null},"Zen-4 (Genoa)"),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null},"TBD")))),(0,r.kt)("p",null,"It is recommended to leave out the ",(0,r.kt)("inlineCode",{parentName:"p"},"0"),' when specifying the old generation; this will\nhelp the parser tool, which assumes 0 for an unspecified value and does leave it\nout when generating the name for comparison. In other words: 0 has a meaning of\n"rather old or unspecified".'),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"We don't differentiate between Zen-4 (Genoa) and Zen-4c (Bergamo); L3 cache per\nSiena core is smaller on Bergamo and the frequency lower but the cores are otherwise\nidentical. As we already have a qualifier ",(0,r.kt)("inlineCode",{parentName:"p"},"h")," that allows to specify higher frequencies\n(which Genoa thus may use more and Bergamo less or not), we have enough distinction\ncapabilities.")),(0,r.kt)("h4",{id:"frequency-suffixes"},"Frequency Suffixes"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Suffix"),(0,r.kt)("th",{parentName:"tr",align:null},"Meaning"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"h"),(0,r.kt)("td",{parentName:"tr",align:null},">2.75GHz all-core")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"hh"),(0,r.kt)("td",{parentName:"tr",align:null},">3.25GHz all-core")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"hhh"),(0,r.kt)("td",{parentName:"tr",align:null},">3.75GHz all-core")))),(0,r.kt)("h4",{id:"examples-5"},"Examples"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-10n"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-10n","_",(0,r.kt)("strong",{parentName:"li"},"z")),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-10n","_",(0,r.kt)("strong",{parentName:"li"},"z3")),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-10n","_",(0,r.kt)("strong",{parentName:"li"},"z3h")),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-10n","_",(0,r.kt)("strong",{parentName:"li"},"z3hh")),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-10n","_","bms","_",(0,r.kt)("strong",{parentName:"li"},"z")),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-10n","_","bms","_",(0,r.kt)("strong",{parentName:"li"},"z3")),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-10n","_","bms","_",(0,r.kt)("strong",{parentName:"li"},"z3")),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-10n","_","bms","_",(0,r.kt)("strong",{parentName:"li"},"z3h")),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-10n","_","bms","_",(0,r.kt)("strong",{parentName:"li"},"z3hh")," <- Bare Metal, AMD Milan with > 3.25GHz all core freq")),(0,r.kt)("h3",{id:"optional-gpu-support"},"[OPTIONAL]"," GPU support"),(0,r.kt)("p",null,"Format: ",(0,r.kt)("inlineCode",{parentName:"p"},"_"),"[",(0,r.kt)("inlineCode",{parentName:"p"},"G/g"),"]","X","[","N","]","[",(0,r.kt)("inlineCode",{parentName:"p"},"-"),"M","]","[",(0,r.kt)("inlineCode",{parentName:"p"},"h"),"]"),(0,r.kt)("p",null,"This extension provides more details on the specific GPU:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"pass-through (",(0,r.kt)("inlineCode",{parentName:"li"},"G"),") vs. virtual GPU (",(0,r.kt)("inlineCode",{parentName:"li"},"g"),")"),(0,r.kt)("li",{parentName:"ul"},"vendor (X)"),(0,r.kt)("li",{parentName:"ul"},"generation (N)"),(0,r.kt)("li",{parentName:"ul"},"number (M) of processing units that are exposed (for pass-through) or assigned; see table below for vendor-specific terminology"),(0,r.kt)("li",{parentName:"ul"},"high-performance indicator (",(0,r.kt)("inlineCode",{parentName:"li"},"h"),")")),(0,r.kt)("p",null,"Note that the vendor letter X is mandatory, generation and processing units are optional."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"letter X"),(0,r.kt)("th",{parentName:"tr",align:null},"vendor"),(0,r.kt)("th",{parentName:"tr",align:null},"processing units"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"N")),(0,r.kt)("td",{parentName:"tr",align:null},"nVidia"),(0,r.kt)("td",{parentName:"tr",align:null},"streaming multiprocessors (SMs)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"A")),(0,r.kt)("td",{parentName:"tr",align:null},"AMD"),(0,r.kt)("td",{parentName:"tr",align:null},"compute units (CUs)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"I")),(0,r.kt)("td",{parentName:"tr",align:null},"Intel"),(0,r.kt)("td",{parentName:"tr",align:null},"execution units (EUs)")))),(0,r.kt)("p",null,"For nVidia, the generation N can be f=Fermi, k=Kepler, m=Maxwell, p=Pascal, v=Volta, t=turing, a=Ampere, l=Ada Lovelace, ...,\nfor AMD GCN-x=0.x, RDNA1=1, RDNA2=2, RDNA3=3,\nfor Intel Gen9=0.9, Xe(12.1)=1, ...\n(Note: This may need further work to properly reflect what's out there.)"),(0,r.kt)("p",null,"The optional ",(0,r.kt)("inlineCode",{parentName:"p"},"h")," suffix to the compute unit count indicates high-performance (e.g. high freq or special\nhigh bandwidth gfx memory such as HBM);\n",(0,r.kt)("inlineCode",{parentName:"p"},"h")," can be duplicated for even higher performance."),(0,r.kt)("p",null,"Example: ",(0,r.kt)("inlineCode",{parentName:"p"},"SCS-16V-64-500s_GNa-14h"),"\nThis flavor has a pass-through GPU nVidia Ampere with 14 SMs and either high-bandwidth memory or specially high frequencies.\nLooking through GPU specs you could guess it's 1/4 of an A30."),(0,r.kt)("h3",{id:"optional-infiniband"},"[OPTIONAL]"," Infiniband"),(0,r.kt)("p",null,"Format: ",(0,r.kt)("inlineCode",{parentName:"p"},"_ib")),(0,r.kt)("p",null,"This extension indicates Infiniband networking."),(0,r.kt)("p",null,"More extensions may be forthcoming and appended in a later revision of this spec."),(0,r.kt)("p",null,"Extensions need to be specified in the above-mentioned order."),(0,r.kt)("h3",{id:"naming-options-advice"},"Naming options advice"),(0,r.kt)("p",null,"Note that we expect most clouds to prefer short flavor names,\nnot indicating CPU details or hypervisor types. See above list\nof standard flavors to get a feeling."),(0,r.kt)("p",null,"However, more successful providers will often need to differentiate their\nofferings in response to customer demand and allow customers to request\nflavors with specific detailed properties. The goal of this proposal is to avoid\nproviders to invent their own names and then refer customers to (currently\nincompletely standardized) ",(0,r.kt)("inlineCode",{parentName:"p"},"extra_specs"),"\nor worse a non-machine-readable service descriptions to find out the details."),(0,r.kt)("p",null,"So a cloud provider might well evolve from offering ",(0,r.kt)("inlineCode",{parentName:"p"},"SCS-8T-16-50")," to offering\n",(0,r.kt)("inlineCode",{parentName:"p"},"SCS-8T-16-50n"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"SCS-8T-16-50n_i2")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"SCS-8T-16-50n_z2")," to specify that he\nis using network disks and offer a choice b/w intel Cascade-Lake and AMD Rome.\nWe would expect the cloud provider to still offer the generic flavor\n",(0,r.kt)("inlineCode",{parentName:"p"},"SCS-8T-16-50")," and allow the scheduler (placement service) to pick both more\nspecific types (or just one if e.g. capacity management considerations suggest\nso). Providers in such cases should ensure that the price of a requested\nflavor does not depend on the scheduler decisions."),(0,r.kt)("p",null,"We are looking into the ",(0,r.kt)("a",{parentName:"p",href:"https://docs.openstack.org/image-guide/introduction.html#metadata-definition-metadefs-service"},"metadefs"),"\nmechanism and ",(0,r.kt)("a",{parentName:"p",href:"https://docs.openstack.org/api-guide/compute/extra_specs_and_properties.html"},"extra_specs"),"\nto allow customers to ask for specific flavor properties without the need to\nencode all these flavor details into the flavor name, so the optional pieces\nmay not be needed much. However, there must be a way to request flavor\nproperties without encoding the need into an image \u2014 the indirection via\nan image is considered broken by the SCS team."),(0,r.kt)("h2",{id:"proposal-examples"},"Proposal Examples"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Example"),(0,r.kt)("th",{parentName:"tr",align:null},"Decoding"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-2C-4-10n"),(0,r.kt)("td",{parentName:"tr",align:null},"2 dedicated cores (x86-64), 4GiB RAM, 10GB network disk")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-8Ti-32-50p_i1"),(0,r.kt)("td",{parentName:"tr",align:null},"8 dedicated hyperthreads (insecure), Skylake, 32GiB RAM, 50GB local NVMe")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-1L-1u-5"),(0,r.kt)("td",{parentName:"tr",align:null},"1 vCPU (heavily oversubscribed), 1GiB Ram (no ECC), 5GB disk (unspecific)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-16T-64-200s_GNa-64_ib"),(0,r.kt)("td",{parentName:"tr",align:null},"16 dedicated threads, 64GiB RAM, 200GB local SSD, Infiniband, 64 Passthrough nVidia Ampere SMs")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-4C-16-2x200p_a1"),(0,r.kt)("td",{parentName:"tr",align:null},"4 dedicated Arm64 cores (A76 class), 16GiB RAM, 2x200GB local NVMe drives")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-1V-0.5"),(0,r.kt)("td",{parentName:"tr",align:null},"1 vCPU, 0.5GiB RAM, no disk (boot from cinder volume)")))),(0,r.kt)("h2",{id:"previous-standard-versions"},"Previous standard versions"),(0,r.kt)("p",null,"Previous versions up to version 3.0 contained the list of\nmandatory/recommended flavors, which has been moved to\n",(0,r.kt)("a",{parentName:"p",href:"/standards/scs-0103-v1-standard-flavors"},"a standard of its own"),"."),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"/standards/scs-0100-v1-flavor-naming"},"Version 1 of the standard"),"\nused a slightly different naming syntax while the logic was exactly the same.\nWhat is a ",(0,r.kt)("inlineCode",{parentName:"p"},"-")," in v2 used to be a ",(0,r.kt)("inlineCode",{parentName:"p"},":"),"; ",(0,r.kt)("inlineCode",{parentName:"p"},"_")," used to be ",(0,r.kt)("inlineCode",{parentName:"p"},"-"),". The reason for\nthe change was certain Kubernetes tools using the flavor names as labels.\nLabels however are subject to stricter naming rules and in particular don't\nallow for a ",(0,r.kt)("inlineCode",{parentName:"p"},":"),". See ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/issues/190"},"PR #190"),"\nfor a discussion."),(0,r.kt)("p",null,"Version 1 flavor names can be translated to v2 using the following transformation:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"NAMEV2=$(echo \"$NAMEV1\" | sed -e 's/\\-/_/g' -e 's/:/-/g' -e 's/^SCS_/SCS-/')\n")),(0,r.kt)("p",null,"and the way back can be done with"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"NAMEV1=$(echo \"$NAMEV2\" | sed -e 's/\\-/:/g' -e 's/_/-/g' -e 's/^SCS:/SCS-/')\n")),(0,r.kt)("p",null,"For the time being, the validation tools still accept the old names with a warning\n(despite the unchanged ",(0,r.kt)("inlineCode",{parentName:"p"},"SCS-")," prefix) unless you pass option ",(0,r.kt)("inlineCode",{parentName:"p"},"-2")," to them. They will\nhowever not count v1 flavors towards fulfilling the needs against the corresponding\nv2 mandatory flavor list unless you pass the option ",(0,r.kt)("inlineCode",{parentName:"p"},"-1"),".\nIn other words: An IaaS infrastructure with the 26\nv1 mandatory flavors will produce 26 warnings (for using old flavors) and 26\nerrors (for missing the 26 mandatory v2 flavors) unless you pass ",(0,r.kt)("inlineCode",{parentName:"p"},"-1")," in which\ncase no errors and no warnings will be produced. Registering the 26 mandatory\nv2 flavor names in addition will result in passing the test with only 26\nwarnings \u2014 unless you specify ",(0,r.kt)("inlineCode",{parentName:"p"},"-2"),". If you do and want to pass you'll need\nto remove the old v1 names or rename them to no longer start with ",(0,r.kt)("inlineCode",{parentName:"p"},"SCS-"),"."),(0,r.kt)("h2",{id:"beyond-scs"},"Beyond SCS"),(0,r.kt)("p",null,"The Gaia-X provider working group which could have created a superseding standard\ndoes no longer exist."),(0,r.kt)("p",null,"However, we have been reaching out to the OpenStack Public Cloud SIG and the ALASCA\nmembers to seek further alignment."),(0,r.kt)("p",null,"Getting upstream OpenStack support for flavor aliases would provide more flexibility\nand ease migrations between providers, also providers that don't offer the SCS-\nflavors."),(0,r.kt)("p",null,"We also would like to see upstream ",(0,r.kt)("inlineCode",{parentName:"p"},"extra_specs")," standardizing the discoverability of some\nproperties exposed via the SCS names and work on IaC tooling (terraform ...)\nto make use of these when selecting a flavor."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0683500c.2b8b2a8c.js b/assets/js/0683500c.2b8b2a8c.js new file mode 100644 index 0000000000..f177b1fb45 --- /dev/null +++ b/assets/js/0683500c.2b8b2a8c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1294],{3905:(e,t,n)=>{n.d(t,{Zo:()=>l,kt:()=>f});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function c(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),p=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},l=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,l=i(e,["components","mdxType","originalType","parentName"]),d=p(n),m=a,f=d["".concat(s,".").concat(m)]||d[m]||u[m]||o;return n?r.createElement(f,c(c({ref:t},l),{},{components:n})):r.createElement(f,c({ref:t},l))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,c=new Array(o);c[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:a,c[1]=i;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>c,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var r=n(87462),a=(n(67294),n(3905));const o={},c="Application Credentials",i={unversionedId:"container/components/k8s-cluster-api-provider/doc/application-credentials",id:"container/components/k8s-cluster-api-provider/doc/application-credentials",title:"Application Credentials",description:"The terraform creates an application credential that it passes into the created VM. This one is then used to authenticate the cluster API provider against the OpenStack API to allow it to create resources needed for the k8s cluster.",source:"@site/docs/03-container/components/k8s-cluster-api-provider/doc/application-credentials.md",sourceDirName:"03-container/components/k8s-cluster-api-provider/doc",slug:"/container/components/k8s-cluster-api-provider/doc/application-credentials",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/application-credentials",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/03-container/components/k8s-cluster-api-provider/doc/application-credentials.md",tags:[],version:"current",frontMatter:{},sidebar:"docs",previous:{title:"Makefile reference",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/make-reference"},next:{title:"Configuration",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/configuration"}},s={},p=[],l={toc:p},d="wrapper";function u(e){let{components:t,...n}=e;return(0,a.kt)(d,(0,r.Z)({},l,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"application-credentials"},"Application Credentials"),(0,a.kt)("p",null,"The terraform creates an ",(0,a.kt)("a",{parentName:"p",href:"https://docs.openstack.org/keystone/wallaby/user/application_credentials.html"},"application credential")," that it passes into the created VM. This one is then used to authenticate the cluster API provider against the OpenStack API to allow it to create resources needed for the k8s cluster."),(0,a.kt)("p",null,"The AppCredential has a few advantages:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"We take out variance in how the authentication works -- we don't have to deal with a mixture of project_id, project_name, project_domain_name, user_domain_name, only a subset of which is needed depending on the cloud."),(0,a.kt)("li",{parentName:"ul"},"We do not leak the user credentials into the cluster, making any security breach easier to contain."),(0,a.kt)("li",{parentName:"ul"},"AppCreds are connected to one project and can be revoked.")),(0,a.kt)("p",null,"We are using an unrestricted AppCred for the management server which can then create further AppCreds, so we can each cluster its own (restricted) credentials. In the case of breaches, these AppCreds can be revoked."),(0,a.kt)("p",null,"Note that you can have additional projects or clouds listed in your ",(0,a.kt)("inlineCode",{parentName:"p"},"~/.config/openstack/clouds.yaml")," (and ",(0,a.kt)("inlineCode",{parentName:"p"},"secure.yaml"),") and reference them in the ",(0,a.kt)("inlineCode",{parentName:"p"},"OPENSTACK_CLOUD")," setting of your ",(0,a.kt)("inlineCode",{parentName:"p"},"clusterctl.yaml"),", so you can manage clusters in various projects and clouds from the same management server."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/070e71f0.58103e04.js b/assets/js/070e71f0.58103e04.js new file mode 100644 index 0000000000..8d3fe656f6 --- /dev/null +++ b/assets/js/070e71f0.58103e04.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6303],{3905:(e,r,t)=>{t.d(r,{Zo:()=>u,kt:()=>f});var n=t(67294);function a(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function i(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function o(e){for(var r=1;r=0||(a[t]=e[t]);return a}(e,r);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var p=n.createContext({}),s=function(e){var r=n.useContext(p),t=r;return e&&(t="function"==typeof e?e(r):o(o({},r),e)),t},u=function(e){var r=s(e.components);return n.createElement(p.Provider,{value:r},e.children)},d="mdxType",l={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},g=n.forwardRef((function(e,r){var t=e.components,a=e.mdxType,i=e.originalType,p=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),d=s(t),g=a,f=d["".concat(p,".").concat(g)]||d[g]||l[g]||i;return t?n.createElement(f,o(o({ref:r},u),{},{components:t})):n.createElement(f,o({ref:r},u))}));function f(e,r){var t=arguments,a=r&&r.mdxType;if("string"==typeof e||a){var i=t.length,o=new Array(i);o[0]=g;var c={};for(var p in r)hasOwnProperty.call(r,p)&&(c[p]=r[p]);c.originalType=e,c[d]="string"==typeof e?e:a,o[1]=c;for(var s=2;s{t.r(r),t.d(r,{assets:()=>p,contentTitle:()=>o,default:()=>l,frontMatter:()=>i,metadata:()=>c,toc:()=>s});var n=t(87462),a=(t(67294),t(3905));const i={sidebar_label:"Ceph",sidebar_position:20},o="Ceph",c={unversionedId:"iaas/guides/upgrade-guide/ceph",id:"iaas/guides/upgrade-guide/ceph",title:"Ceph",description:"",source:"@site/docs/02-iaas/guides/upgrade-guide/ceph.md",sourceDirName:"02-iaas/guides/upgrade-guide",slug:"/iaas/guides/upgrade-guide/ceph",permalink:"/docs/iaas/guides/upgrade-guide/ceph",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/upgrade-guide/ceph.md",tags:[],version:"current",sidebarPosition:20,frontMatter:{sidebar_label:"Ceph",sidebar_position:20},sidebar:"docs",previous:{title:"Network",permalink:"/docs/iaas/guides/upgrade-guide/network"},next:{title:"Docker",permalink:"/docs/iaas/guides/upgrade-guide/docker"}},p={},s=[],u={toc:s},d="wrapper";function l(e){let{components:r,...t}=e;return(0,a.kt)(d,(0,n.Z)({},u,t,{components:r,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"ceph"},"Ceph"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"osism apply ceph-rolling_update -e ireallymeanit=yes\nosism apply cephclient\n")))}l.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/07d3bac7.51a7e5f9.js b/assets/js/07d3bac7.51a7e5f9.js new file mode 100644 index 0000000000..53bc10a286 --- /dev/null +++ b/assets/js/07d3bac7.51a7e5f9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8581],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>f});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function s(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var l=r.createContext({}),c=function(e){var t=r.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,s=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=c(a),m=n,f=d["".concat(l,".").concat(m)]||d[m]||p[m]||s;return a?r.createElement(f,o(o({ref:t},u),{},{components:a})):r.createElement(f,o({ref:t},u))}));function f(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var s=a.length,o=new Array(s);o[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[d]="string"==typeof e?e:n,o[1]=i;for(var c=2;c{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>s,metadata:()=>i,toc:()=>c});var r=a(87462),n=(a(67294),a(3905));const s={title:"SCS KaaS default storage class",type:"Standard",status:"Stable",stabilized_at:new Date("2023-02-13T00:00:00.000Z"),track:"KaaS"},o=void 0,i={unversionedId:"scs-0211-v1-kaas-default-storage-class",id:"scs-0211-v1-kaas-default-storage-class",title:"SCS KaaS default storage class",description:"Introduction",source:"@site/standards/scs-0211-v1-kaas-default-storage-class.md",sourceDirName:".",slug:"/scs-0211-v1-kaas-default-storage-class",permalink:"/standards/scs-0211-v1-kaas-default-storage-class",draft:!1,tags:[],version:"current",frontMatter:{title:"SCS KaaS default storage class",type:"Standard",status:"Stable",stabilized_at:"2023-02-13T00:00:00.000Z",track:"KaaS"},sidebar:"standards",previous:{title:"SCS-0211: KaaS Default Storage Class",permalink:"/standards/kaas/scs-0211"},next:{title:"IAM Standards",permalink:"/standards/iam/"}},l={},c=[{value:"Introduction",id:"introduction",level:2},{value:"Motivation",id:"motivation",level:2},{value:"Decision",id:"decision",level:2},{value:"Required non-performance-related properties",id:"required-non-performance-related-properties",level:3},{value:"Required performance-related properties",id:"required-performance-related-properties",level:3},{value:"Related Documents",id:"related-documents",level:2},{value:"Conformance Tests",id:"conformance-tests",level:2}],u={toc:c},d="wrapper";function p(e){let{components:t,...a}=e;return(0,n.kt)(d,(0,r.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"introduction"},"Introduction"),(0,n.kt)("p",null,"Cluster consumers can request persistent storage via ",(0,n.kt)("a",{parentName:"p",href:"https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#persistentvolumeclaim-v1-core"},(0,n.kt)("inlineCode",{parentName:"a"},"PersistentVolumeClaims"))," which is provisioned automatically by cloud-provided automation.\nStorage requirements may vary across use cases, so there is the concept of ",(0,n.kt)("inlineCode",{parentName:"p"},"StorageClasses"),". ",(0,n.kt)("inlineCode",{parentName:"p"},"StorageClasses")," define some set of storage properties. So, consumers can choose one of these depending on the use case."),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/storage/persistent-volumes/"},"Kubernetes documentation")),(0,n.kt)("h2",{id:"motivation"},"Motivation"),(0,n.kt)("p",null,"While often times, consumers will choose a ",(0,n.kt)("inlineCode",{parentName:"p"},"StorageClass")," explicitly, usually, there is also a default ",(0,n.kt)("inlineCode",{parentName:"p"},"StorageClass")," to fall back on in case it is ",(0,n.kt)("em",{parentName:"p"},"not")," chosen explicitly (that is, when ",(0,n.kt)("inlineCode",{parentName:"p"},"storageClassName")," is not set on the ",(0,n.kt)("inlineCode",{parentName:"p"},"PersistentVolumeClaim"),")."),(0,n.kt)("p",null,"This document attempts to define the properties this default ",(0,n.kt)("inlineCode",{parentName:"p"},"StorageClass")," should have."),(0,n.kt)("h2",{id:"decision"},"Decision"),(0,n.kt)("p",null,"The default ",(0,n.kt)("inlineCode",{parentName:"p"},"StorageClass")," is made default using the ",(0,n.kt)("inlineCode",{parentName:"p"},"storageclass.kubernetes.io/is-default-class")," annotation, following ",(0,n.kt)("a",{parentName:"p",href:"https://kubernetes.io/docs/tasks/administer-cluster/change-default-storage-class/"},"Kubernetes upstream"),". Hence, standardizing its name is not required for the intents of this standard."),(0,n.kt)("h3",{id:"required-non-performance-related-properties"},"Required non-performance-related properties"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"ReadWriteOnce")," must be a supported ",(0,n.kt)("a",{parentName:"li",href:"https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes"},"access mode")),(0,n.kt)("li",{parentName:"ul"},"volume must be protected against data loss due to hardware failures of a single disk or host"),(0,n.kt)("li",{parentName:"ul"},"volume must not be bound to the lifecycle of a Kubernetes Node")),(0,n.kt)("p",null,"Hence,"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"...volume must not be backed by local storage on the Kubernetes Node VM itself"),(0,n.kt)("li",{parentName:"ul"},"...volume may be backed by some kind of redundant storage within an AZ, across hosts"),(0,n.kt)("li",{parentName:"ul"},"...volume may be backed by some kind of redundant storage across AZ's")),(0,n.kt)("h3",{id:"required-performance-related-properties"},"Required performance-related properties"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("em",{parentName:"li"},"NO")," fixed guarantees regarding latency/bandwidth/IOPS/...")),(0,n.kt)("p",null,"Generally, customers should be able to expect low-tier performance without pricing surprises."),(0,n.kt)("h2",{id:"related-documents"},"Related Documents"),(0,n.kt)("p",null,"This document does not describe performance related properties.\nThis will be done in another document which is yet to be created."),(0,n.kt)("h2",{id:"conformance-tests"},"Conformance Tests"),(0,n.kt)("p",null,"TBD"))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/082859ca.7f7eaa73.js b/assets/js/082859ca.7f7eaa73.js new file mode 100644 index 0000000000..732f340802 --- /dev/null +++ b/assets/js/082859ca.7f7eaa73.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1907],{3905:(e,r,t)=>{t.d(r,{Zo:()=>d,kt:()=>b});var n=t(67294);function a(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function o(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function i(e){for(var r=1;r=0||(a[t]=e[t]);return a}(e,r);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var c=n.createContext({}),p=function(e){var r=n.useContext(c),t=r;return e&&(t="function"==typeof e?e(r):i(i({},r),e)),t},d=function(e){var r=p(e.components);return n.createElement(c.Provider,{value:r},e.children)},u="mdxType",l={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},g=n.forwardRef((function(e,r){var t=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),u=p(t),g=a,b=u["".concat(c,".").concat(g)]||u[g]||l[g]||o;return t?n.createElement(b,i(i({ref:r},d),{},{components:t})):n.createElement(b,i({ref:r},d))}));function b(e,r){var t=arguments,a=r&&r.mdxType;if("string"==typeof e||a){var o=t.length,i=new Array(o);i[0]=g;var s={};for(var c in r)hasOwnProperty.call(r,c)&&(s[c]=r[c]);s.originalType=e,s[u]="string"==typeof e?e:a,i[1]=s;for(var p=2;p{t.r(r),t.d(r,{assets:()=>c,contentTitle:()=>i,default:()=>l,frontMatter:()=>o,metadata:()=>s,toc:()=>p});var n=t(87462),a=(t(67294),t(3905));const o={sidebar_label:"Sandbox Manager",sidebar_position:54},i="Sandbox Manager",s={unversionedId:"iaas/guides/operations-guide/openstack/day2-operations/sandbox-manager",id:"iaas/guides/operations-guide/openstack/day2-operations/sandbox-manager",title:"Sandbox Manager",description:"",source:"@site/docs/02-iaas/guides/operations-guide/openstack/day2-operations/sandbox-manager.md",sourceDirName:"02-iaas/guides/operations-guide/openstack/day2-operations",slug:"/iaas/guides/operations-guide/openstack/day2-operations/sandbox-manager",permalink:"/docs/iaas/guides/operations-guide/openstack/day2-operations/sandbox-manager",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/operations-guide/openstack/day2-operations/sandbox-manager.md",tags:[],version:"current",sidebarPosition:54,frontMatter:{sidebar_label:"Sandbox Manager",sidebar_position:54},sidebar:"docs",previous:{title:"Project Manager",permalink:"/docs/iaas/guides/operations-guide/openstack/day2-operations/project-manager"},next:{title:"Troubleshooting Guide",permalink:"/docs/iaas/guides/troubleshooting-guide/"}},c={},p=[],d={toc:p},u="wrapper";function l(e){let{components:r,...t}=e;return(0,a.kt)(u,(0,n.Z)({},d,t,{components:r,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"sandbox-manager"},"Sandbox Manager"))}l.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0860b861.421e2adb.js b/assets/js/0860b861.421e2adb.js new file mode 100644 index 0000000000..d3f2c0a289 --- /dev/null +++ b/assets/js/0860b861.421e2adb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5646],{72011:s=>{s.exports=JSON.parse('{"title":"SCS-0301","slug":"standards/scs-0301","permalink":"/standards/standards/scs-0301","navigation":{"previous":{"title":"Kubernetes Nodes Anti Affinity","permalink":"/standards/scs-0213-v1-k8s-nodes-anti-affinity"},"next":{"title":"Naming for domains/groups/roles/project when onboarding new customers","permalink":"/standards/scs-0301-v1-naming-conventions"}}}')}}]); \ No newline at end of file diff --git a/assets/js/08bf2ad2.03b3f319.js b/assets/js/08bf2ad2.03b3f319.js new file mode 100644 index 0000000000..0636955b42 --- /dev/null +++ b/assets/js/08bf2ad2.03b3f319.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2711],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>f});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var p=n.createContext({}),c=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},d=function(e){var t=c(e.components);return n.createElement(p.Provider,{value:t},e.children)},u="mdxType",l={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},y=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),u=c(r),y=a,f=u["".concat(p,".").concat(y)]||u[y]||l[y]||o;return r?n.createElement(f,i(i({ref:t},d),{},{components:r})):n.createElement(f,i({ref:t},d))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=y;var s={};for(var p in t)hasOwnProperty.call(t,p)&&(s[p]=t[p]);s.originalType=e,s[u]="string"==typeof e?e:a,i[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>l,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var n=r(87462),a=(r(67294),r(3905));const o={sidebar_label:"Day-2 Operations",sidebar_position:60},i="Day-2 Operations",s={unversionedId:"iaas/guides/operations-guide/openstack/day2-operations/index",id:"iaas/guides/operations-guide/openstack/day2-operations/index",title:"Day-2 Operations",description:"",source:"@site/docs/02-iaas/guides/operations-guide/openstack/day2-operations/index.md",sourceDirName:"02-iaas/guides/operations-guide/openstack/day2-operations",slug:"/iaas/guides/operations-guide/openstack/day2-operations/",permalink:"/docs/iaas/guides/operations-guide/openstack/day2-operations/",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/operations-guide/openstack/day2-operations/index.md",tags:[],version:"current",sidebarPosition:60,frontMatter:{sidebar_label:"Day-2 Operations",sidebar_position:60},sidebar:"docs",previous:{title:"Octavia",permalink:"/docs/iaas/guides/operations-guide/openstack/octavia"},next:{title:"Image Manager",permalink:"/docs/iaas/guides/operations-guide/openstack/day2-operations/image-manager"}},p={},c=[],d={toc:c},u="wrapper";function l(e){let{components:t,...r}=e;return(0,a.kt)(u,(0,n.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"day-2-operations"},"Day-2 Operations"))}l.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/096c51c8.d7561d62.js b/assets/js/096c51c8.d7561d62.js new file mode 100644 index 0000000000..7b0f76a0b7 --- /dev/null +++ b/assets/js/096c51c8.d7561d62.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1266],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>f});var r=n(67294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var c=r.createContext({}),u=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=u(e.components);return r.createElement(c.Provider,{value:t},e.children)},m="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,i=e.mdxType,o=e.originalType,c=e.parentName,p=a(e,["components","mdxType","originalType","parentName"]),m=u(n),d=i,f=m["".concat(c,".").concat(d)]||m[d]||s[d]||o;return n?r.createElement(f,l(l({ref:t},p),{},{components:n})):r.createElement(f,l({ref:t},p))}));function f(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=n.length,l=new Array(o);l[0]=d;var a={};for(var c in t)hasOwnProperty.call(t,c)&&(a[c]=t[c]);a.originalType=e,a[m]="string"==typeof e?e:i,l[1]=a;for(var u=2;u{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>l,default:()=>s,frontMatter:()=>o,metadata:()=>a,toc:()=>u});var r=n(87462),i=(n(67294),n(3905));const o={},l="Linting Guide",a={unversionedId:"contribute/linting-guide",id:"contribute/linting-guide",title:"Linting Guide",description:"In order to have a clean content repository regarding all markdown files we enforce linting on:",source:"@site/community/contribute/linting-guide.md",sourceDirName:"contribute",slug:"/contribute/linting-guide",permalink:"/community/contribute/linting-guide",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"community",previous:{title:"Documentation workflow explanation",permalink:"/community/contribute/docs-workflow-explanation"},next:{title:"Installation",permalink:"/community/contribute/local-docusaurus-development-guide"}},c={},u=[{value:"Pre Commit",id:"pre-commit",level:2},{value:"Github Workflows",id:"github-workflows",level:2}],p={toc:u},m="wrapper";function s(e){let{components:t,...n}=e;return(0,i.kt)(m,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"linting-guide"},"Linting Guide"),(0,i.kt)("p",null,"In order to have a clean content repository regarding all markdown files we enforce linting on:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"all staged files prior committing"),(0,i.kt)("li",{parentName:"ol"},"all Pull Requests")),(0,i.kt)("h2",{id:"pre-commit"},"Pre Commit"),(0,i.kt)("p",null,"Run markdownlint against staged git files with Husky git hook:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/okonet/lint-staged"},"lint-staged")),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/typicode/husky"},"husky"))),(0,i.kt)("p",null,"The rules are enforced on markdown files, for which we use:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/DavidAnson/markdownlint-cli2"},"markdownlint-cli2")," for markdownlint"),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/prettier/prettier"},"prettier")," for code formatting")),(0,i.kt)("p",null,"The markdownlint rules are defined in the configuration file ",(0,i.kt)("inlineCode",{parentName:"p"},".markdownlint-cli2.jsonc")),(0,i.kt)("p",null,"Additionally we use ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/OnkarRuikar/markdownlint-rule-search-replace"},"markdownlint-rule-search-replace")," for fixing"),(0,i.kt)("h2",{id:"github-workflows"},"Github Workflows"),(0,i.kt)("p",null,"There are two actions running on every Pull Request on the ",(0,i.kt)("inlineCode",{parentName:"p"},"main")," branch."),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("inlineCode",{parentName:"li"},"link-validator.yml"),"is checking every link in markdown files."),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("inlineCode",{parentName:"li"},"pr-markdownlint.yml"),"is checking all markdown files regarding to the rules defined within ",(0,i.kt)("inlineCode",{parentName:"li"},".markdownlint-cli2.jsonc"))))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/09adb968.d5282853.js b/assets/js/09adb968.d5282853.js new file mode 100644 index 0000000000..96595e8b6f --- /dev/null +++ b/assets/js/09adb968.d5282853.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3946],{3905:(e,t,n)=>{n.d(t,{Zo:()=>l,kt:()=>f});var r=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var p=r.createContext({}),s=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},l=function(e){var t=s(e.components);return r.createElement(p.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,p=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),u=s(n),d=o,f=u["".concat(p,".").concat(d)]||u[d]||m[d]||a;return n?r.createElement(f,i(i({ref:t},l),{},{components:n})):r.createElement(f,i({ref:t},l))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=d;var c={};for(var p in t)hasOwnProperty.call(t,p)&&(c[p]=t[p]);c.originalType=e,c[u]="string"==typeof e?e:o,i[1]=c;for(var s=2;s{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>m,frontMatter:()=>a,metadata:()=>c,toc:()=>s});var r=n(87462),o=(n(67294),n(3905));const a={},i="Overview",c={unversionedId:"operating-scs/incident-management/index",id:"operating-scs/incident-management/index",title:"Overview",description:"TODO",source:"@site/docs/04-operating-scs/03-incident-management/index.md",sourceDirName:"04-operating-scs/03-incident-management",slug:"/operating-scs/incident-management/",permalink:"/docs/operating-scs/incident-management/",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/04-operating-scs/03-incident-management/index.md",tags:[],version:"current",frontMatter:{}},p={},s=[],l={toc:s},u="wrapper";function m(e){let{components:t,...n}=e;return(0,o.kt)(u,(0,r.Z)({},l,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"overview"},"Overview"),(0,o.kt)("p",null,"TODO"))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/09ba26e2.70c31ef5.js b/assets/js/09ba26e2.70c31ef5.js new file mode 100644 index 0000000000..0adeee9864 --- /dev/null +++ b/assets/js/09ba26e2.70c31ef5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5880],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>m});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),p=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},d=function(e){var t=p(e.components);return n.createElement(l.Provider,{value:t},e.children)},c="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),c=p(r),f=a,m=c["".concat(l,".").concat(f)]||c[f]||u[f]||i;return r?n.createElement(m,o(o({ref:t},d),{},{components:r})):n.createElement(m,o({ref:t},d))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,o=new Array(i);o[0]=f;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[c]="string"==typeof e?e:a,o[1]=s;for(var p=2;p{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var n=r(87462),a=(r(67294),r(3905));const i={sidebar_label:"Deploy Guide",sidebar_position:10},o="Deploy Guide",s={unversionedId:"iaas/guides/deploy-guide/index",id:"iaas/guides/deploy-guide/index",title:"Deploy Guide",description:"\ud83d\udca1 The Deploy Guide describe how to provision, bootstrap and deploy nodes and services.",source:"@site/docs/02-iaas/guides/deploy-guide/index.md",sourceDirName:"02-iaas/guides/deploy-guide",slug:"/iaas/guides/deploy-guide/",permalink:"/docs/iaas/guides/deploy-guide/",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/deploy-guide/index.md",tags:[],version:"current",sidebarPosition:10,frontMatter:{sidebar_label:"Deploy Guide",sidebar_position:10},sidebar:"docs",previous:{title:"IaaS Layer",permalink:"/docs/category/iaas-layer"},next:{title:"Seed",permalink:"/docs/iaas/guides/deploy-guide/seed"}},l={},p=[{value:"Getting started",id:"getting-started",level:2}],d={toc:p},c="wrapper";function u(e){let{components:t,...r}=e;return(0,a.kt)(c,(0,n.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"deploy-guide"},"Deploy Guide"),(0,a.kt)("p",null,"\ud83d\udca1 The Deploy Guide describe how to provision, bootstrap and deploy nodes and services."),(0,a.kt)("p",null,"A classification is made for services. For example, all infrastructure services\nsuch as RabbitMQ or MariaDB are covered in the ",(0,a.kt)("a",{parentName:"p",href:"./services/infrastructure"},"infrastructure section"),"\nof the ",(0,a.kt)("a",{parentName:"p",href:"./services"},"services chapter"),"."),(0,a.kt)("p",null,"The manager node is handled in a ",(0,a.kt)("a",{parentName:"p",href:"./manager"},"separate chapter")," because it must be handled differently when\nbuilding a new environment."),(0,a.kt)("p",null,"Before deploying services to nodes, they must all be bootstrapped. This is covered\nin the ",(0,a.kt)("a",{parentName:"p",href:"./bootstrap"},"bootstrap chapter"),"."),(0,a.kt)("p",null,"The guide always assume that a node is already initially accessible via SSH and only\nneeds to be bootstrapped and integrated into the environment. Deploying bare-metal nodes\nwith an operating system is documented in the ",(0,a.kt)("a",{parentName:"p",href:"./provisioning"},"provisioning chapter"),"."),(0,a.kt)("p",null,"In the examples, the pull of images (if supported by a role) is always run first. While\nthis is optional, it is recommended to speed up the execution of the deploy action in\nthe second step. This significantly reduces the times required for the restart from a\nservice."),(0,a.kt)("h2",{id:"getting-started"},"Getting started"),(0,a.kt)("p",null,"OSISM is deployed in a series of successive phases. The phases are documented in this guide."),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("a",{parentName:"li",href:"../configuration-guide/configuration-repository#creating-a-new-configuration-repository"},"Creation of a configuration repository")),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("a",{parentName:"li",href:"./seed"},"Preparation of a seed node")),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("a",{parentName:"li",href:"./manager"},"Preparation of a manager node")),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("a",{parentName:"li",href:"./provisioning"},"Provisioning of the bare-metal nodes")),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("a",{parentName:"li",href:"./bootstrap"},"Bootstrap of the bare-metal nodes")),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("a",{parentName:"li",href:"./services"},"Deployment of the services"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/09cf625e.1e69a60f.js b/assets/js/09cf625e.1e69a60f.js new file mode 100644 index 0000000000..3ecb7a47a6 --- /dev/null +++ b/assets/js/09cf625e.1e69a60f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1756],{3905:(e,r,t)=>{t.d(r,{Zo:()=>l,kt:()=>d});var n=t(67294);function o(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function c(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function i(e){for(var r=1;r=0||(o[t]=e[t]);return o}(e,r);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var s=n.createContext({}),p=function(e){var r=n.useContext(s),t=r;return e&&(t="function"==typeof e?e(r):i(i({},r),e)),t},l=function(e){var r=p(e.components);return n.createElement(s.Provider,{value:r},e.children)},u="mdxType",f={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},v=n.forwardRef((function(e,r){var t=e.components,o=e.mdxType,c=e.originalType,s=e.parentName,l=a(e,["components","mdxType","originalType","parentName"]),u=p(t),v=o,d=u["".concat(s,".").concat(v)]||u[v]||f[v]||c;return t?n.createElement(d,i(i({ref:r},l),{},{components:t})):n.createElement(d,i({ref:r},l))}));function d(e,r){var t=arguments,o=r&&r.mdxType;if("string"==typeof e||o){var c=t.length,i=new Array(c);i[0]=v;var a={};for(var s in r)hasOwnProperty.call(r,s)&&(a[s]=r[s]);a.originalType=e,a[u]="string"==typeof e?e:o,i[1]=a;for(var p=2;p{t.r(r),t.d(r,{assets:()=>s,contentTitle:()=>i,default:()=>f,frontMatter:()=>c,metadata:()=>a,toc:()=>p});var n=t(87462),o=(t(67294),t(3905));const c={sidebar:1},i="Overview",a={unversionedId:"operating-scs/overview",id:"operating-scs/overview",title:"Overview",description:"TODO",source:"@site/docs/04-operating-scs/overview.md",sourceDirName:"04-operating-scs",slug:"/operating-scs/overview",permalink:"/docs/operating-scs/overview",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/04-operating-scs/overview.md",tags:[],version:"current",frontMatter:{sidebar:1}},s={},p=[],l={toc:p},u="wrapper";function f(e){let{components:r,...t}=e;return(0,o.kt)(u,(0,n.Z)({},l,t,{components:r,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"overview"},"Overview"),(0,o.kt)("p",null,"TODO"))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0a757274.443da196.js b/assets/js/0a757274.443da196.js new file mode 100644 index 0000000000..be65fbf902 --- /dev/null +++ b/assets/js/0a757274.443da196.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[297],{3905:(e,r,t)=>{t.d(r,{Zo:()=>s,kt:()=>v});var n=t(67294);function o(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function a(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function i(e){for(var r=1;r=0||(o[t]=e[t]);return o}(e,r);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var l=n.createContext({}),p=function(e){var r=n.useContext(l),t=r;return e&&(t="function"==typeof e?e(r):i(i({},r),e)),t},s=function(e){var r=p(e.components);return n.createElement(l.Provider,{value:r},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},f=n.forwardRef((function(e,r){var t=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),u=p(t),f=o,v=u["".concat(l,".").concat(f)]||u[f]||d[f]||a;return t?n.createElement(v,i(i({ref:r},s),{},{components:t})):n.createElement(v,i({ref:r},s))}));function v(e,r){var t=arguments,o=r&&r.mdxType;if("string"==typeof e||o){var a=t.length,i=new Array(a);i[0]=f;var c={};for(var l in r)hasOwnProperty.call(r,l)&&(c[l]=r[l]);c.originalType=e,c[u]="string"==typeof e?e:o,i[1]=c;for(var p=2;p{t.r(r),t.d(r,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>c,toc:()=>p});var n=t(87462),o=(t(67294),t(3905));const a={},i="Knowledge",c={unversionedId:"iaas/overview/knowledge",id:"iaas/overview/knowledge",title:"Knowledge",description:"TODO",source:"@site/docs/02-iaas/overview/knowledge.md",sourceDirName:"02-iaas/overview",slug:"/iaas/overview/knowledge",permalink:"/docs/iaas/overview/knowledge",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/overview/knowledge.md",tags:[],version:"current",frontMatter:{}},l={},p=[],s={toc:p},u="wrapper";function d(e){let{components:r,...t}=e;return(0,o.kt)(u,(0,n.Z)({},s,t,{components:r,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"knowledge"},"Knowledge"),(0,o.kt)("p",null,"TODO"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0bcc5672.c34c9f3f.js b/assets/js/0bcc5672.c34c9f3f.js new file mode 100644 index 0000000000..556612c590 --- /dev/null +++ b/assets/js/0bcc5672.c34c9f3f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6892],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>d});var n=r(67294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=n.createContext({}),p=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):c(c({},t),e)),r},s=function(e){var t=p(e.components);return n.createElement(l.Provider,{value:t},e.children)},u="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),u=p(r),m=o,d=u["".concat(l,".").concat(m)]||u[m]||f[m]||a;return r?n.createElement(d,c(c({ref:t},s),{},{components:r})):n.createElement(d,c({ref:t},s))}));function d(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,c=new Array(a);c[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[u]="string"==typeof e?e:o,c[1]=i;for(var p=2;p{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>c,default:()=>f,frontMatter:()=>a,metadata:()=>i,toc:()=>p});var n=r(87462),o=(r(67294),r(3905));const a={},c="Software Requirements",i={unversionedId:"container/deployment-examples/a/software",id:"container/deployment-examples/a/software",title:"Software Requirements",description:"TODO",source:"@site/docs/03-container/deployment-examples/a/software.md",sourceDirName:"03-container/deployment-examples/a",slug:"/container/deployment-examples/a/software",permalink:"/docs/container/deployment-examples/a/software",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/03-container/deployment-examples/a/software.md",tags:[],version:"current",frontMatter:{}},l={},p=[],s={toc:p},u="wrapper";function f(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"software-requirements"},"Software Requirements"),(0,o.kt)("p",null,"TODO"))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0dfeccb2.fb23b4b5.js b/assets/js/0dfeccb2.fb23b4b5.js new file mode 100644 index 0000000000..4ffaaf0377 --- /dev/null +++ b/assets/js/0dfeccb2.fb23b4b5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5923],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var i=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=i.createContext({}),c=function(e){var t=i.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=c(e.components);return i.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},m=i.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,l=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),p=c(n),m=a,h=p["".concat(l,".").concat(m)]||p[m]||d[m]||r;return n?i.createElement(h,s(s({ref:t},u),{},{components:n})):i.createElement(h,s({ref:t},u))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,s=new Array(r);s[0]=m;var o={};for(var l in t)hasOwnProperty.call(t,l)&&(o[l]=t[l]);o.originalType=e,o[p]="string"==typeof e?e:a,s[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>r,metadata:()=>o,toc:()=>c});var i=n(87462),a=(n(67294),n(3905));const r={title:"Gnocchi as database for metering",type:"Decision Record",status:"Draft",track:"Ops"},s=void 0,o={unversionedId:"scs-0410-v1-gnocchi-as-metering-database",id:"scs-0410-v1-gnocchi-as-metering-database",title:"Gnocchi as database for metering",description:"for more info. --\x3e",source:"@site/standards/scs-0410-v1-gnocchi-as-metering-database.md",sourceDirName:".",slug:"/scs-0410-v1-gnocchi-as-metering-database",permalink:"/standards/scs-0410-v1-gnocchi-as-metering-database",draft:!1,tags:[],version:"current",frontMatter:{title:"Gnocchi as database for metering",type:"Decision Record",status:"Draft",track:"Ops"},sidebar:"standards",previous:{title:"SCS-0410",permalink:"/standards/standards/scs-0410"},next:{title:"SCS-0411",permalink:"/standards/standards/scs-0411"}},l={},c=[{value:"Introduction",id:"introduction",level:2},{value:"Definitions",id:"definitions",level:2},{value:"Motivation",id:"motivation",level:2},{value:"Design Considerations",id:"design-considerations",level:2},{value:"Options",id:"options",level:3},{value:"Using Gnocchi",id:"using-gnocchi",level:4},{value:"Using Prometheus",id:"using-prometheus",level:4},{value:"Using InfluxDB",id:"using-influxdb",level:4},{value:"Creating a custom TSDB implementation",id:"creating-a-custom-tsdb-implementation",level:4},{value:"Decision",id:"decision",level:2},{value:"Open questions",id:"open-questions",level:2},{value:"Related Documents",id:"related-documents",level:2},{value:"Conformance Tests",id:"conformance-tests",level:2}],u={toc:c},p="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(p,(0,i.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"introduction"},"Introduction"),(0,a.kt)("p",null,"In the past we noticed missing events in the telemetry stack of OpenStack.\nThis results in situations where the Cloud Service Provider (CSP)\nmay think that a resource is still in use while the owner shut it down,\nor may not be aware of a resource which has been created."),(0,a.kt)("p",null,"Such inaccurate data is a problem,\nwhen it is supposed to be used for billing purposes."),(0,a.kt)("p",null,"This document discusses how such metering data should be stored\nwithin the SCS.\nIn partiuclar,\nit provides rationale for the choice of Gnocchi\nas time-series database for metering data\nwithin SCS."),(0,a.kt)("h2",{id:"definitions"},"Definitions"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"TSDB, time-series database:\nDatabase which is specialised for storing data which is keyed by a timestamp.\nPopular examples are InfluxDB, Graphite, rrd, and Prometheus.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Metering:\nCollection of usage data of a cloud,\nfor the specific purpose of creating invoices\nto bill customers for the resources they have allocated.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"backfilling:\nThe process of adding and modifying data in the past\nwithin a time-series database.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Metric:\nA single time-series vector.\nTypically, a metric represents a single property of a resource,\nsuch as CPU usage of an instance.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Resource metrics:\nA group of metrics belonging to a single resource.\nA compute instance, for instance,\nmay have a metric indicating the number of CPUs allocated,\nanother metric indicating the amount of RAM allocated,\netc."))),(0,a.kt)("h2",{id:"motivation"},"Motivation"),(0,a.kt)("p",null,"Being able to hold users accountable\nfor the resources they use\nis a prerequisite for commercially operating a cloud.\nThe SCS project wants to deliver a cloud stack\nwhich can be used for that purpose,\nhence providing reliable metering data is a requirement."),(0,a.kt)("p",null,"As metering data is inherently keyed by time,\na time-series database is required.\nThe choice of time-series database is an important one\nas different databases come with different trade-offs.\nNot all databases are suitable for the kind of data\nwhich is collected in a metering context."),(0,a.kt)("h2",{id:"design-considerations"},"Design Considerations"),(0,a.kt)("p",null,"The following requirements for a time-series database exist:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"MUST support backfilling:\nAs we need to catch up on changes to resources\nwhich may have happened during a brief network interruption,\nwe need to be able to modify data after it has been written to the TSDB.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"MUST be able to handle lots of resources:\nAs billing should happen with a resource-level granularity,\nwe expect a lot of different metrics inside the TSDB.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"MUST scale to different timescales:\nWe expect to have metrics which change frequently (e.g. object store usage)\nand metrics which change rarely (e.g. cinder volume sizes).\nThe TSDB must be able to cope with both types of metrics efficiently.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"SHOULD provide an efficient way to query all currently alive resources.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"SHOULD allow truncation of storage to remove old data.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"MUST be available under an appropriate Open Source license,\neven for productive use cases."))),(0,a.kt)("h3",{id:"options"},"Options"),(0,a.kt)("h4",{id:"using-gnocchi"},"Using Gnocchi"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://gnocchi.osci.io/"},"Gnocchi")," is a time-series database\nwhich has its origins in the OpenStack ecosystem."),(0,a.kt)("p",null,"It supports all requirements except truncation,\nwhich might have to be implemented."),(0,a.kt)("h4",{id:"using-prometheus"},"Using Prometheus"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://prometheus.io"},"Prometheus")," is a widely used time-series database\nwith its focus on monitoring and incident response.\nWhile it is considered efficient for this use-case,\nit has shortcomings which make it unsuitable for the metering use case:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Explicit recommendation ",(0,a.kt)("a",{parentName:"p",href:"https://prometheus.io/docs/practices/instrumentation/#do-not-overuse-labels"},"against high-cardinality metrics"),":\nAs we would have to label metrics by resource IDs and project IDs,\nwe have to expect a very high cardinality,\nalso with a significant amount of metric churn.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Backfilling, ",(0,a.kt)("a",{parentName:"p",href:"https://prometheus.io/docs/prometheus/latest/storage/#backfilling-from-openmetrics-format"},"albeit possible"),", is not well-supported."))),(0,a.kt)("h4",{id:"using-influxdb"},"Using InfluxDB"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://www.influxdata.com/"},"InfluxDB")," is a widely used time-series database\nwith its focus on monitoring."),(0,a.kt)("p",null,"In contrast to Prometheus, it does support backfilling.\nHowever, like Prometheus,\nit seems to run ",(0,a.kt)("a",{parentName:"p",href:"https://docs.influxdata.com/influxdb/cloud/write-data/best-practices/resolve-high-cardinality/"},"into scalability issues in high-cardinality scenarios"),"."),(0,a.kt)("p",null,"In addition,\nclustering is only available in commercial licensing options."),(0,a.kt)("h4",{id:"creating-a-custom-tsdb-implementation"},"Creating a custom TSDB implementation"),(0,a.kt)("p",null,"A custom TSDB implementation\nis a non-trivial project to pursue."),(0,a.kt)("h2",{id:"decision"},"Decision"),(0,a.kt)("p",null,"We use Gnocchi.\nAccording to research,\nit mostly fulfills the requirements.\nWhile some small development efforts may be needed,\nto make it fully usable,\nthe amount of work is anticipated much less\nthan making Prometheus or Influx fit the bill\n(due to backfilling / cardinality scaling constraints),\nlet alone rolling a custom implementation."),(0,a.kt)("h2",{id:"open-questions"},"Open questions"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"What will be the granularity of the events meta information?"),(0,a.kt)("p",{parentName:"li"},"If we decide to use resource metadata\nas a place to store slow-changing information\n(e.g. instance flavors, volume sizes),\nwe need to know what the granularity of that is."))),(0,a.kt)("h2",{id:"related-documents"},"Related Documents"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"SCS-0411-v1")),(0,a.kt)("h2",{id:"conformance-tests"},"Conformance Tests"),(0,a.kt)("p",null,"None (this is a decision record)."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0ea173ba.bcf8204e.js b/assets/js/0ea173ba.bcf8204e.js new file mode 100644 index 0000000000..616952552a --- /dev/null +++ b/assets/js/0ea173ba.bcf8204e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5258],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>k});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),c=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},u=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),d=c(a),u=n,k=d["".concat(s,".").concat(u)]||d[u]||m[u]||o;return a?r.createElement(k,i(i({ref:t},p),{},{components:a})):r.createElement(k,i({ref:t},p))}));function k(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[d]="string"==typeof e?e:n,i[1]=l;for(var c=2;c{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var r=a(87462),n=(a(67294),a(3905));const o={},i="Certification",l={unversionedId:"certification/overview",id:"certification/overview",title:"Certification",description:"Scopes and versions",source:"@site/standards/certification/overview.md",sourceDirName:"certification",slug:"/certification/overview",permalink:"/standards/certification/overview",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"standards",previous:{title:"Introduction",permalink:"/standards/"},next:{title:"Overview",permalink:"/standards/standards/overview"}},s={},c=[{value:"Scopes and versions",id:"scopes-and-versions",level:2},{value:"Becoming certified",id:"becoming-certified",level:2},{value:"Compliant cloud environments",id:"compliant-cloud-environments",level:2}],p={toc:c},d="wrapper";function m(e){let{components:t,...o}=e;return(0,n.kt)(d,(0,r.Z)({},p,o,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"certification"},"Certification"),(0,n.kt)("h2",{id:"scopes-and-versions"},"Scopes and versions"),(0,n.kt)("p",null,"SCS provides a certification framework consisting of six different kinds of certificates of varying scope.\nThese scopes can be sorted into two dimensions:"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("em",{parentName:"li"},"certification level"),", of which there are three:",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"SCS-compatible"),(0,n.kt)("li",{parentName:"ul"},"SCS-open"),(0,n.kt)("li",{parentName:"ul"},"SCS-sovereign"))),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("em",{parentName:"li"},"cloud layer"),", of which there are two:",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"infastructure as a service (IaaS)"),(0,n.kt)("li",{parentName:"ul"},"Kubernetes as a service (KaaS)")))),(0,n.kt)("p",null,"So, for instance, a certificate can have the scope ",(0,n.kt)("em",{parentName:"p"},"SCS-compatible IaaS")," or ",(0,n.kt)("em",{parentName:"p"},"SCS-sovereign KaaS"),"."),(0,n.kt)("p",null,"Each scope corresponds to a set of standards. As these standards progress, so do the scopes, and we keep track of this by versioning. Each version undergoes a lifecycle of Draft, Stable, and Deprecated, and we aim to keep at most one version stable at the same time, with the exception of a transition period of 4 to 6 weeks."),(0,n.kt)("p",null,(0,n.kt)("img",{alt:"Alt text",src:a(59561).Z,width:"2728",height:"742"})),(0,n.kt)("h2",{id:"becoming-certified"},"Becoming certified"),(0,n.kt)("p",null,"In order for a cloud service offering to obtain a certificate, it has to conform to all standards of the respective scope, which will be tested at regular intervals, and the results of these tests will be made available publicly. For more details on how to become certified, please consult the corresponding ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/issue/337/Standards/scs-xxxx-v1-achieving-certification.md"},"document"),"."),(0,n.kt)("h2",{id:"compliant-cloud-environments"},"Compliant cloud environments"),(0,n.kt)("p",null,"This is a list of clouds that we test on a nightly basis against the certificate scope ",(0,n.kt)("em",{parentName:"p"},"SCS-compatible IaaS"),"."),(0,n.kt)("table",null,(0,n.kt)("thead",{parentName:"table"},(0,n.kt)("tr",{parentName:"thead"},(0,n.kt)("th",{parentName:"tr",align:null},"Name"),(0,n.kt)("th",{parentName:"tr",align:null},"Description"),(0,n.kt)("th",{parentName:"tr",align:null},"Operator"),(0,n.kt)("th",{parentName:"tr",align:"center"},"IaaS Compliance Check"),(0,n.kt)("th",{parentName:"tr",align:"center"},"HealthMon"))),(0,n.kt)("tbody",{parentName:"table"},(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"https://github.com/SovereignCloudStack/docs/blob/main/community/cloud-resources/plusserver-gx-scs.md"},"gx-scs")),(0,n.kt)("td",{parentName:"tr",align:null},"Dev environment provided for SCS & GAIA-X context"),(0,n.kt)("td",{parentName:"tr",align:null},"plusserver GmbH"),(0,n.kt)("td",{parentName:"tr",align:"center"},(0,n.kt)("img",{parentName:"td",src:"https://img.shields.io/github/actions/workflow/status/SovereignCloudStack/standards/check-gx-scs-v1.yml?label=compliant",alt:"GitHub Workflow Status"})),(0,n.kt)("td",{parentName:"tr",align:"center"},(0,n.kt)("a",{parentName:"td",href:"https://health.gx-scs.sovereignit.cloud:3000/"},"HM"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"https://www.plusserver.com/en/products/pluscloud-open"},"pluscloud open - prod1")),(0,n.kt)("td",{parentName:"tr",align:null},"Public cloud for customers"),(0,n.kt)("td",{parentName:"tr",align:null},"plusserver GmbH"),(0,n.kt)("td",{parentName:"tr",align:"center"},(0,n.kt)("img",{parentName:"td",src:"https://img.shields.io/github/actions/workflow/status/SovereignCloudStack/standards/check-pco-prod1-v1.yml?label=compliant",alt:"GitHub Workflow Status"})),(0,n.kt)("td",{parentName:"tr",align:"center"},(0,n.kt)("a",{parentName:"td",href:"https://health.prod1.plusserver.sovereignit.cloud:3000"},"HM"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"https://www.plusserver.com/en/products/pluscloud-open"},"pluscloud open - prod2")),(0,n.kt)("td",{parentName:"tr",align:null},"Public cloud for customers"),(0,n.kt)("td",{parentName:"tr",align:null},"plusserver GmbH"),(0,n.kt)("td",{parentName:"tr",align:"center"},(0,n.kt)("img",{parentName:"td",src:"https://img.shields.io/github/actions/workflow/status/SovereignCloudStack/standards/check-pco-prod2-v1.yml?label=compliant",alt:"GitHub Workflow Status"})),(0,n.kt)("td",{parentName:"tr",align:"center"},(0,n.kt)("a",{parentName:"td",href:"https://health.prod1.plusserver.sovereignit.cloud:3000"},"HM"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"https://www.noris.de/wavestack-cloud/"},"Wavestack")),(0,n.kt)("td",{parentName:"tr",align:null},"Public cloud for customers"),(0,n.kt)("td",{parentName:"tr",align:null},"noris network AG/Wavecon GmbH"),(0,n.kt)("td",{parentName:"tr",align:"center"},(0,n.kt)("img",{parentName:"td",src:"https://img.shields.io/github/actions/workflow/status/SovereignCloudStack/standards/check-wavestack-v3.yml?label=compliant",alt:"GitHub Workflow Status"})),(0,n.kt)("td",{parentName:"tr",align:"center"},(0,n.kt)("a",{parentName:"td",href:"https://health.wavestack1.sovereignit.cloud:3000/"},"HM"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"https://regio.digital"},"REGIO.cloud")),(0,n.kt)("td",{parentName:"tr",align:null},"Public cloud for customers"),(0,n.kt)("td",{parentName:"tr",align:null},"OSISM GmbH"),(0,n.kt)("td",{parentName:"tr",align:"center"},(0,n.kt)("img",{parentName:"td",src:"https://img.shields.io/github/actions/workflow/status/SovereignCloudStack/standards/check-regio-a-v3.yml?label=compliant",alt:"GitHub Workflow Status"})),(0,n.kt)("td",{parentName:"tr",align:"center"},(0,n.kt)("a",{parentName:"td",href:"https://apimon.services.regio.digital/public-dashboards/17cf094a47404398a5b8e35a4a3968d4?orgId=1&refresh=5m"},"Dashboard"))))))}m.isMDXComponent=!0},59561:(e,t,a)=>{a.d(t,{Z:()=>r});const r=a.p+"assets/images/image-123702bb74539962d7c6839715583f29.png"}}]); \ No newline at end of file diff --git a/assets/js/1109f10b.74701188.js b/assets/js/1109f10b.74701188.js new file mode 100644 index 0000000000..e544768a93 --- /dev/null +++ b/assets/js/1109f10b.74701188.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7472],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>m});var n=a(67294);function o(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function s(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function r(e){for(var t=1;t=0||(o[a]=e[a]);return o}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(o[a]=e[a])}return o}var l=n.createContext({}),d=function(e){var t=n.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):r(r({},t),e)),a},c=function(e){var t=d(e.components);return n.createElement(l.Provider,{value:t},e.children)},h="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},p=n.forwardRef((function(e,t){var a=e.components,o=e.mdxType,s=e.originalType,l=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),h=d(a),p=o,m=h["".concat(l,".").concat(p)]||h[p]||u[p]||s;return a?n.createElement(m,r(r({ref:t},c),{},{components:a})):n.createElement(m,r({ref:t},c))}));function m(e,t){var a=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var s=a.length,r=new Array(s);r[0]=p;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[h]="string"==typeof e?e:o,r[1]=i;for(var d=2;d{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>u,frontMatter:()=>s,metadata:()=>i,toc:()=>d});var n=a(87462),o=(a(67294),a(3905));const s={title:"SSD Flavors",type:"Decision Record",status:"Stable",stabilized_at:new Date("2023-06-14T00:00:00.000Z"),track:"IaaS",enhances:"scs-0100-v2-flavor-naming.md"},r=void 0,i={unversionedId:"scs-0110-v1-ssd-flavors",id:"scs-0110-v1-ssd-flavors",title:"SSD Flavors",description:"Introduction",source:"@site/standards/scs-0110-v1-ssd-flavors.md",sourceDirName:".",slug:"/scs-0110-v1-ssd-flavors",permalink:"/standards/scs-0110-v1-ssd-flavors",draft:!1,tags:[],version:"current",frontMatter:{title:"SSD Flavors",type:"Decision Record",status:"Stable",stabilized_at:"2023-06-14T00:00:00.000Z",track:"IaaS",enhances:"scs-0100-v2-flavor-naming.md"},sidebar:"standards",previous:{title:"SCS-0110",permalink:"/standards/scs-0110"},next:{title:"SCS-0111",permalink:"/standards/standards/scs-0111"}},l={},d=[{value:"Introduction",id:"introduction",level:2},{value:"Motivation",id:"motivation",level:2},{value:"Design Considerations",id:"design-considerations",level:2},{value:"Options considered",id:"options-considered",level:3},{value:"One-node etcd (backed by redundant storage)",id:"one-node-etcd-backed-by-redundant-storage",level:4},{value:"RAM (tmpfs) etcd storage",id:"ram-tmpfs-etcd-storage",level:4},{value:"Heartbeat slowdown",id:"heartbeat-slowdown",level:4},{value:"Filesystem tuning",id:"filesystem-tuning",level:4},{value:"Flavors with local storage",id:"flavors-with-local-storage",level:4},{value:"Decision",id:"decision",level:2},{value:"Out of Scope",id:"out-of-scope",level:2},{value:"Implementation note",id:"implementation-note",level:2},{value:"Related Documents",id:"related-documents",level:2},{value:"Conformance Tests",id:"conformance-tests",level:2}],c={toc:d},h="wrapper";function u(e){let{components:t,...a}=e;return(0,o.kt)(h,(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"introduction"},"Introduction"),(0,o.kt)("p",null,"SCS defines an IaaS Flavor Naming standard that mandates a number of standard flavors\nto be available in each SCS-compliant IaaS offering. While offering or exposing\nIaaS is not a requirement for SCS-compliant infrastructure offerings \u2014 SCS allows\nfor platforms only exposing the container layer (plus S3 compatible object storage)\nfor wave 2 (container-based) cloud-native workloads --\nthe SCS reference implementation does include a complete IaaS implementation that\nmany providers want to expose as they have customers desiring access at this layer\nfor wave 1 (VM-based) cloud-native workloads or for the virtualization of more\nclassical (not cloud-native) workloads. The IaaS implementation thus comes with\nstandards."),(0,o.kt)("p",null,"This Decision Record is about adding a few mandatory flavors on the IaaS level\nthat include flavors with local SSD (or better) storage."),(0,o.kt)("h2",{id:"motivation"},"Motivation"),(0,o.kt)("p",null,"The ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Standards/scs-0100-v2-flavor-naming.md"},"currently defined standard flavors"),"\ndo not include\nflavors that use local storage. For certain workloads such as databases or big data\nfilesystems, local storage is highly desirable as replication may be handled at\nthe application layer, making replication/redundancy in a networked storage solution\n(ceph in the SCS reference implementation) an unneeded and undesired property.\nFurthermore, write access to networked and replicated storage typically incurs\na certain latency, as the writes can only be acknowledged once all the replicas\nhave confirmed that the data has hit stable storage. Write latency is critical\nfor e.g. relational database performance."),(0,o.kt)("p",null,"The main purpose for the IaaS layer in SCS is to perform as a solid foundation\nto provide and manage kubernetes container clusters in a multi-tenant scenario.\nAs such the standards at the IaaS layer should ensure that all the needed\ntypes of resources are available for the container clusters. This is not\ncurrently the case: In a scenario with multiple k8s control-plane nodes set\nup via kubeadm (as part of the k8s cluster-api automation), the control plane\nnodes each run an etcd instance and together form an etcd cluster."),(0,o.kt)("p",null,"etcd is sensitive to scheduling, network and storage latencies. While network\nlatencies and scheduling latencies have not been observed to be an issue in\nclusters within one cloud region, the storage latency is. With remote networked\nstorage as delivered from ceph, the long tail of write latency causes etcd\nto often time out heartbeats, causing a new leader election with a leader\nchange, preventing control plane changes on k8s for a few seconds. Too many\nleader changes can slow down cluster operation and even bring it to a halt."),(0,o.kt)("p",null,"The etcd requirements ",(0,o.kt)("a",{parentName:"p",href:"https://etcd.io/docs/v3.5/op-guide/hardware/#example-hardware-configurations"},"are well documented"),".\nIn particular, over a hundred of ",(0,o.kt)("em",{parentName:"p"},"sequential")," IOPS are recommended. This\nrequires write latencies in the range of a single-digit ms (or better)."),(0,o.kt)("h2",{id:"design-considerations"},"Design Considerations"),(0,o.kt)("h3",{id:"options-considered"},"Options considered"),(0,o.kt)("h4",{id:"one-node-etcd-backed-by-redundant-storage"},"One-node etcd (backed by redundant storage)"),(0,o.kt)("p",null,"If k8s uses only one control plane node, there will only be only one etcd node,\navoiding timed out heartbeats. Single node control planes are typically not\nrecommended for production workloads though. They are limited with respect\nto control plane performance, have a higher chance to fail (as a single node failure\ncan create cluster control-plane downtime) and can not undergo rolling upgrades."),(0,o.kt)("p",null,"Though not the normal setup with kubeadm, it is possible to use a multi-node\ncontrol plane using a single-node etcd. This shares some of the challenges of\nsingle-node control-planes, although recovery may be faster to perform at least\nin scenarios where the etcd backend storage is redundant and not affected by the\nsingle-node outage."),(0,o.kt)("p",null,"Neither scenario fulfills typical requirements for production workloads."),(0,o.kt)("h4",{id:"ram-tmpfs-etcd-storage"},"RAM (tmpfs) etcd storage"),(0,o.kt)("p",null,"etcd could keep its database in volatile memory (e.g. on a tmpfs filesystem).\nFor multi-node etcd clusters, this could actually be made work, as long as at\nleast one cluster member stays alive and proper care is taken to remove shut-down\nnodes from the cluster. A loss of power affecting all nodes or a hardware\nmaintenance operation not tracking etcd needs would result in a complete\nloss of all cluster state. The control plane nodes would require live migration\nto avoid this in the maintenance case. For the power loss scenario, a frequent\nbackup might mitigate the cluster state loss case somewhat."),(0,o.kt)("p",null,"The etcd database is normally limited to 2GiB in size, which is something\nthat is realistic to keep in main memory. (Typical database sizes are\nmuch smaller.)"),(0,o.kt)("p",null,"This option requires additional care and may not be suitable for all\nproduction scenarios, but would seem a possible fallback position for\netcd. It does obviously not address the database scenario."),(0,o.kt)("h4",{id:"heartbeat-slowdown"},"Heartbeat slowdown"),(0,o.kt)("p",null,"To avoid causing too many fail-overs by occasional high latencies, the\nfrequency of heartbeats can be lowered from the default 1/100ms.\nThe reelection timeout should change along with it (typically set to\n10 beats)."),(0,o.kt)("p",null,"This will cause etcd to take a bit more time to notice the loss of a node,\nwhich is not typically critical if done within reasonable limits.\nThis change however does not fully address the issue \u2014 occasional write latencies\nabove 100ms will still cause failed heartbeats, just less often."),(0,o.kt)("p",null,"This change has been implemented in SCS's\n",(0,o.kt)("a",{parentName:"p",href:"https://etcd.io/docs/v3.5/op-guide/hardware/#example-hardware-configurations"},"k8s-cluster-api-provider"),"\nreference implementation: The heartbeat has been changed from 1/100ms (10/s)\nto 1/250ms (4/s) and the reelection timeout from 1s to 2.5s."),(0,o.kt)("p",null,"The etcd process also is afforded a higher CPU priority (lower niceness),\nresulting in a lower scheduling latency, as high-prio processes preempt lower-prio\nones when they get woken up. The etcd process also gets its IO priority\nincreased to get treated preferentially in case the IO scheduler has many\noutstanding requests. This has some positive effects with the CFQ IO scheduler."),(0,o.kt)("p",null,"The slower heartbeat and the priority tweaks do lower the amount of leader\nchanges but are insufficient to completely address the issue on the tests\nperformed against networked ceph-backed storage."),(0,o.kt)("h4",{id:"filesystem-tuning"},"Filesystem tuning"),(0,o.kt)("p",null,"Databases must ensure that certain data has hit stable storage before acknowledging\nwrites \u2014 this is required in order to live up to the ",(0,o.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/ACID"},"ACID"),"\nguarantees in situations when disruptions might happen. Databases typically use\n",(0,o.kt)("inlineCode",{parentName:"p"},"fsync()")," calls to ensure that write buffers are written to real persistent storage\nunless they use raw/direct block devices circumventing Linux's page and buffer cache."),(0,o.kt)("p",null,"etcd normally uses a write-ahead-log (WOL) file that lives on a Linux filesystem and\nuses ",(0,o.kt)("inlineCode",{parentName:"p"},"fsync")," to ensure the correct write ordering. Trouble with fsync is that it\nalso causes unrelated data to be written out with most existing Linux filesystems,\nadding to the latency."),(0,o.kt)("p",null,"It is possible to tell the Linux filesystems to not wait for all data to have hit\nstorage before returning from fsync() calls. This avoids the latency caused by\n",(0,o.kt)("inlineCode",{parentName:"p"},"fsync")," but also subverts the very reason for using ",(0,o.kt)("inlineCode",{parentName:"p"},"fsync"),": In case of a disruption\n(OS crash, power outage, loss of connection to storage, ...), the state is likely\nnot consistent, as the kernel has lied to the application about data having been\nwritten out. Recovery from such a scenario can range from smooth to impossible."),(0,o.kt)("p",null,"In a multi-node cluster, this may not be as bad as it sounds \u2014 if only one\nnode is affected by a disruption, the crashed node can be recovered by resyncing\nthe data from other nodes. In practice an inconsistent state would be considered\ntoo risky and it should be preferred to set up a fresh node to join the\nexisting etcd cluster. This would need to be implemented to make this option\nless risky."),(0,o.kt)("p",null,"The reference implementation has an option to use these unsafe filesystem settings.\nHowever, they are not enabled by default for good reasons."),(0,o.kt)("h4",{id:"flavors-with-local-storage"},"Flavors with local storage"),(0,o.kt)("p",null,"Flavors with local storage will have their root filesystem on a local storage\ndevice. To fulfill the need for high IOPS that etcd and especially databases\nhave, the local storage device should be a solid state device \u2014 an SSD or\nNVMe device. While some use cases might even be fulfilled with local\nspinning disks (or raid arrays of local spinning disks)."),(0,o.kt)("p",null,"Local solid state storage avoids any network overhead and offers best latency.\nIt however is not typically redundant, meaning that the loss of the device\nor the complete hardware node will result in data loss. So it is meant to\nbe used with applications such as database clusters, replicating filesystems\nor block devices or etcd which can handle this at the application layer."),(0,o.kt)("p",null,"The flavor naming spec in SCS allows performance to be understated \u2014 a\nflavor with NVMe storage can be advertised under the SSD storage name\n(and of course can be offered under both names)."),(0,o.kt)("p",null,"Note that this addresses the simple case where the root disk with the\nroot filesystem (and possibly additional filesystems that are set up\nwhen first booting) uses the local storage. Scenarios where additional\nlow-latency networked or local storage are made available via cinder\nand attached for database storage are possible and viable options for\nsome scenarios, but not covered here."),(0,o.kt)("h2",{id:"decision"},"Decision"),(0,o.kt)("p",null,"Two new mandatory flavors: ",(0,o.kt)("inlineCode",{parentName:"p"},"SCS-2V-4-20s")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"SCS-4V-16-100s")," are added\nto the SCS flavor naming standard. The first is meant to be a good fit for\nk8s control nodes with etcd while the latter is a solid base for a\nsmall database server. Clouds claiming SCS-compliance for their IaaS\nlayer MUST provide these two additional flavors."),(0,o.kt)("p",null,"Obviously providers MAY offer many more combinations and e.g. create\nflavors with large local SSDs."),(0,o.kt)("p",null,"The local storage advertised this way MUST support more than\n1000 ",(0,o.kt)("em",{parentName:"p"},"sequential")," IOPS per VM of both new mandatory types (which means a\nwrite latency lower than 1ms \u2014 this typically means SSDs/NVMEs that\nsupport at least several 10ks of parallel IOPS, not a challenge for\ncurrent hardware)."),(0,o.kt)("p",null,"Local disks, SSDs, NVMes MUST have Power-Loss-Protection such that\ndata reported to be written, but in reality being stored in RAM or SLC\ncache of an SSD or NVMe, is guaranteed to not be lost in case of a power\nloss."),(0,o.kt)("p",null,"Like with networked storage, the provider must ensure that data\nfrom previous users is not accessible (e.g. by securely erasing it\nor by using a different encryption key) when local storage gets\nallocated to a new VM."),(0,o.kt)("h2",{id:"out-of-scope"},"Out of Scope"),(0,o.kt)("p",null,"Hardware nodes (hypervisors in OpenStack language) that support flavors\nwith local storage (are part of an appropriate OpenStack host aggregate)\nmay have many VMs competing for bandwidth to the attached local storage\ndevices; the host needs to be configured such that it can sustain VMs\nwriting at full speed without causing the host to be overloaded or\nto cause huge queues for these writes."),(0,o.kt)("p",null,"A more generic approach is to apply storage QoS policies to the VMs to\nmanage bandwidth and IOPS and create the ability to have better\nperformance isolation with certain guarantees. While this is desirable,\nit has not been found a necessity for etcd in our tests.\nDisk IO QoS is not part of this spec but may be considered in another one."),(0,o.kt)("p",null,"Live-migration with local storage is significantly more difficult than with\nnetworked storage: The contents of the local disks also need to be replicated\nover to the new host. Live-migration for these VMs may thus take significantly\nlonger or not be possible at all, depending the configuration from the provider.\nNot supporting live-migration is OK for flavors with local disks according\nto the flavor naming spec \u2014 a capability to indicate whether or not\nlive-migration is supported will be subject to a flavor-metadata discoverability\nspec that is planned for the future."),(0,o.kt)("h2",{id:"implementation-note"},"Implementation note"),(0,o.kt)("p",null,"Local storage in OpenStack can be provided directly via nova or via the\ncinder service. While the latter has the advantage of making volumes\nvisible and manageable via most of the normal cinder capabilities, it\nhas the disadvantage of creating an indirection via iSCSI. This\nresults in higher latency. The requirements in the above spec are\nnot meant to mandate or prevent the implementation via either route."),(0,o.kt)("h2",{id:"related-documents"},"Related Documents"),(0,o.kt)("p",null,"The flavors will be added as mandatory flavors to the\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Standards/scs-0100-v2-flavor-naming.md"},"flavor-naming standard"),",\nwhich will thus have to be released in a v3."),(0,o.kt)("p",null,"The IOPS and Power-Loss requirements from this decision should become\npart of the flavor-naming standard for disk type ",(0,o.kt)("inlineCode",{parentName:"p"},"s"),"."),(0,o.kt)("p",null,"When we standardize storage types in the future, additional possibilities\nto solve the latency requirements for databases and etcd may emerge."),(0,o.kt)("p",null,"When we standardize QoS features there, we may amend this standard with\nQoS recommendations or possibly requirements."),(0,o.kt)("p",null,"A future flavor metadata discoverability standard will indicate whether or not\nthese flavors can be live-migrated. A future VM metadata standard will allow\nusers to request live-migration and/or cold migration or restart to be or to\nnot be performed."),(0,o.kt)("h2",{id:"conformance-tests"},"Conformance Tests"),(0,o.kt)("p",null,"The list of mandatory flavors that needs to be present should be added to the\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Tests/iaas/SCS-Spec.MandatoryFlavors.yaml"},"SCS-Spec.MandatoryFlavors.yaml"),"\nspec as soon as this ADR becomes part of the certification requirements."),(0,o.kt)("p",null,"Checks for conforming with IOPS and purging requirements will require\ntest instances to be launched and might become part of a monitoring\nsolution."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1276f6ab.575dfd89.js b/assets/js/1276f6ab.575dfd89.js new file mode 100644 index 0000000000..10393c2036 --- /dev/null +++ b/assets/js/1276f6ab.575dfd89.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6846],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>f});var i=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function r(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=i.createContext({}),c=function(e){var t=i.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},d=function(e){var t=c(e.components);return i.createElement(l.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},h=i.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),u=c(n),h=o,f=u["".concat(l,".").concat(h)]||u[h]||p[h]||a;return n?i.createElement(f,r(r({ref:t},d),{},{components:n})):i.createElement(f,r({ref:t},d))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,r=new Array(a);r[0]=h;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:o,r[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>p,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var i=n(87462),o=(n(67294),n(3905));const a={title:"Push-based approach for providing usage data",type:"Decision Record",status:"Draft",track:"Ops"},r=void 0,s={unversionedId:"scs-0411-v1-publishing_method_for_metering_data",id:"scs-0411-v1-publishing_method_for_metering_data",title:"Push-based approach for providing usage data",description:"for more info. --\x3e",source:"@site/standards/scs-0411-v1-publishing_method_for_metering_data.md",sourceDirName:".",slug:"/scs-0411-v1-publishing_method_for_metering_data",permalink:"/standards/scs-0411-v1-publishing_method_for_metering_data",draft:!1,tags:[],version:"current",frontMatter:{title:"Push-based approach for providing usage data",type:"Decision Record",status:"Draft",track:"Ops"},sidebar:"standards",previous:{title:"SCS-0411",permalink:"/standards/standards/scs-0411"}},l={},c=[{value:"Introduction",id:"introduction",level:2},{value:"Definitions",id:"definitions",level:2},{value:"Motivation",id:"motivation",level:2},{value:"Design Considerations",id:"design-considerations",level:2},{value:"Options",id:"options",level:3},{value:"Push-based flow",id:"push-based-flow",level:4},{value:"Poll-based flow",id:"poll-based-flow",level:4},{value:"Open questions",id:"open-questions",level:2},{value:"Decision",id:"decision",level:2},{value:"Related Documents",id:"related-documents",level:2},{value:"Conformance Tests",id:"conformance-tests",level:2}],d={toc:c},u="wrapper";function p(e){let{components:t,...n}=e;return(0,o.kt)(u,(0,i.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"introduction"},"Introduction"),(0,o.kt)("p",null,"In the past we noticed missing events in the telemetry stack of OpenStack.\nThis results in situations where the Cloud Service Provider (CSP)\nmay think that a resource is still in use while the owner shut it down,\nor may not be aware of a resource which has been created."),(0,o.kt)("p",null,"Such inaccurate data is a problem,\nwhen it is supposed to be used for billing purposes."),(0,o.kt)("p",null,"This document discusses how such metering data should be made available\nto the cloud service provider\nfor forwarding into their own billing solution."),(0,o.kt)("h2",{id:"definitions"},"Definitions"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"Push-based flow:\nIn a push-based flow,\nthe system generating data actively sends that data to a consumer.")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"Pull-based flow:\nIn a pull-based flow,\nthe system generating data waits for the system consuming the data\nto ask for that data.")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"Metering:\nCollection of usage data of a cloud,\nfor the specific purpose of creating invoices\nto bill customers for the resources they have allocated.")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"Billing:\nThe entire process of creation, management and sending of invoices\ngenerated from metering data."))),(0,o.kt)("h2",{id:"motivation"},"Motivation"),(0,o.kt)("p",null,"Being able to bill users\nfor the resources they use\nis a prerequisite for commercially operating a cloud.\nThe SCS project wants to deliver a cloud stack\nwhich can be used for that purpose,\nhence providing reliable metering data is a requirement."),(0,o.kt)("p",null,"We generally expect that cloud providers already have\nsome kind of customer-relation management or billing system in place.\nHence, it is important that the SCS is not too opinionated\non this implementation detail,\nbut provides a system which can easily interface with other systems."),(0,o.kt)("p",null,"This is similar to how the SCS specified the monitoring stack."),(0,o.kt)("h2",{id:"design-considerations"},"Design Considerations"),(0,o.kt)("p",null,"The following requirements exist for the process for providing metrics to the cloud service provider:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"MUST scale to different timescales:\nWe expect to have metrics which change frequently (e.g. object store usage)\nand metrics which change rarely (e.g. cinder volume sizes).")),(0,o.kt)("h3",{id:"options"},"Options"),(0,o.kt)("h4",{id:"push-based-flow"},"Push-based flow"),(0,o.kt)("p",null,"In a push-based flow,\nthe to-be-implemented metering system pushes events to the sink\nas soon as it is reasonably confident\nthat the event can be used for billing purposes."),(0,o.kt)("h4",{id:"poll-based-flow"},"Poll-based flow"),(0,o.kt)("p",null,"In the poll-based flow,\nwhichever system the CSP runs would be responsible for polling the metering API\nin a frequency sufficient to capture all data with sufficient granularity."),(0,o.kt)("h2",{id:"open-questions"},"Open questions"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"What is necessary to extend the availability of sending to various sinks?"),(0,o.kt)("li",{parentName:"ul"},"How does the configuration look like that is needed to push to a sink from the same type that will be already implemented?")),(0,o.kt)("h2",{id:"decision"},"Decision"),(0,o.kt)("p",null,"As we need to support very different time scales of data,\nthe push-based flow is more suitable:\nit allows the producer of the data,\nwhich knows about the interval in which it changes,\nwhen to provide new data to the consumer.\nIn contrast to that,\na poll-based flow would need the consumer to know about change intervals,\nor alternatively poll in the highest change frequency ever expected."),(0,o.kt)("h2",{id:"related-documents"},"Related Documents"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"SCS-0410-v1")),(0,o.kt)("h2",{id:"conformance-tests"},"Conformance Tests"),(0,o.kt)("p",null,"None (this is a decision record)."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/14c1041d.4d50ef28.js b/assets/js/14c1041d.4d50ef28.js new file mode 100644 index 0000000000..4f869fb9eb --- /dev/null +++ b/assets/js/14c1041d.4d50ef28.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4477],{44182:o=>{o.exports=JSON.parse('{"permalink":"/blog/tags/howto","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/14eb3368.75e9f711.js b/assets/js/14eb3368.75e9f711.js new file mode 100644 index 0000000000..d02bb30ada --- /dev/null +++ b/assets/js/14eb3368.75e9f711.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9817],{1310:(e,t,a)=>{a.d(t,{Z:()=>E});var n=a(87462),r=a(67294),i=a(86010),l=a(35281),s=a(53438),c=a(48596),o=a(39960),m=a(95999),d=a(44996);function u(e){return r.createElement("svg",(0,n.Z)({viewBox:"0 0 24 24"},e),r.createElement("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"}))}const h={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function b(){const e=(0,d.Z)("/");return r.createElement("li",{className:"breadcrumbs__item"},r.createElement(o.Z,{"aria-label":(0,m.I)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e},r.createElement(u,{className:h.breadcrumbHomeIcon})))}const v={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function g(e){let{children:t,href:a,isLast:n}=e;const i="breadcrumbs__link";return n?r.createElement("span",{className:i,itemProp:"name"},t):a?r.createElement(o.Z,{className:i,href:a,itemProp:"item"},r.createElement("span",{itemProp:"name"},t)):r.createElement("span",{className:i},t)}function p(e){let{children:t,active:a,index:l,addMicrodata:s}=e;return r.createElement("li",(0,n.Z)({},s&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},{className:(0,i.Z)("breadcrumbs__item",{"breadcrumbs__item--active":a})}),t,r.createElement("meta",{itemProp:"position",content:String(l+1)}))}function E(){const e=(0,s.s1)(),t=(0,c.Ns)();return e?r.createElement("nav",{className:(0,i.Z)(l.k.docs.docBreadcrumbs,v.breadcrumbsContainer),"aria-label":(0,m.I)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"})},r.createElement("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList"},t&&r.createElement(b,null),e.map(((t,a)=>{const n=a===e.length-1;return r.createElement(p,{key:a,active:n,index:a,addMicrodata:!!t.href},r.createElement(g,{href:t.href,isLast:n},t.label))})))):null}},34228:(e,t,a)=>{a.r(t),a.d(t,{default:()=>y});var n=a(67294),r=a(1944),i=a(53438),l=a(44996),s=a(86010),c=a(39960),o=a(13919),m=a(95999);const d={cardContainer:"cardContainer_fWXF",cardTitle:"cardTitle_rnsV",cardDescription:"cardDescription_PWke"};function u(e){let{href:t,children:a}=e;return n.createElement(c.Z,{href:t,className:(0,s.Z)("card padding--lg",d.cardContainer)},a)}function h(e){let{href:t,icon:a,title:r,description:i}=e;return n.createElement(u,{href:t},n.createElement("h2",{className:(0,s.Z)("text--truncate",d.cardTitle),title:r},a," ",r),i&&n.createElement("p",{className:(0,s.Z)("text--truncate",d.cardDescription),title:i},i))}function b(e){let{item:t}=e;const a=(0,i.Wl)(t);return a?n.createElement(h,{href:a,icon:"\ud83d\uddc3\ufe0f",title:t.label,description:t.description??(0,m.I)({message:"{count} items",id:"theme.docs.DocCard.categoryDescription",description:"The default description for a category card in the generated index about how many items this category includes"},{count:t.items.length})}):null}function v(e){let{item:t}=e;const a=(0,o.Z)(t.href)?"\ud83d\udcc4\ufe0f":"\ud83d\udd17",r=(0,i.xz)(t.docId??void 0);return n.createElement(h,{href:t.href,icon:a,title:t.label,description:t.description??r?.description})}function g(e){let{item:t}=e;switch(t.type){case"link":return n.createElement(v,{item:t});case"category":return n.createElement(b,{item:t});default:throw new Error(`unknown item type ${JSON.stringify(t)}`)}}function p(e){let{className:t}=e;const a=(0,i.jA)();return n.createElement(E,{items:a.items,className:t})}function E(e){const{items:t,className:a}=e;if(!t)return n.createElement(p,e);const r=(0,i.MN)(t);return n.createElement("section",{className:(0,s.Z)("row",a)},r.map(((e,t)=>n.createElement("article",{key:t,className:"col col--6 margin-bottom--lg"},n.createElement(g,{item:e})))))}var f=a(80049),N=a(23120),Z=a(44364),k=a(1310),L=a(92503);const _={generatedIndexPage:"generatedIndexPage_vN6x",list:"list_eTzJ",title:"title_kItE"};function T(e){let{categoryGeneratedIndex:t}=e;return n.createElement(r.d,{title:t.title,description:t.description,keywords:t.keywords,image:(0,l.Z)(t.image)})}function x(e){let{categoryGeneratedIndex:t}=e;const a=(0,i.jA)();return n.createElement("div",{className:_.generatedIndexPage},n.createElement(N.Z,null),n.createElement(k.Z,null),n.createElement(Z.Z,null),n.createElement("header",null,n.createElement(L.Z,{as:"h1",className:_.title},t.title),t.description&&n.createElement("p",null,t.description)),n.createElement("article",{className:"margin-top--lg"},n.createElement(E,{items:a.items,className:_.list})),n.createElement("footer",{className:"margin-top--lg"},n.createElement(f.Z,{previous:t.navigation.previous,next:t.navigation.next})))}function y(e){return n.createElement(n.Fragment,null,n.createElement(T,e),n.createElement(x,e))}},80049:(e,t,a)=>{a.d(t,{Z:()=>s});var n=a(87462),r=a(67294),i=a(95999),l=a(32244);function s(e){const{previous:t,next:a}=e;return r.createElement("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,i.I)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"})},t&&r.createElement(l.Z,(0,n.Z)({},t,{subLabel:r.createElement(i.Z,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc"},"Previous")})),a&&r.createElement(l.Z,(0,n.Z)({},a,{subLabel:r.createElement(i.Z,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc"},"Next"),isNext:!0})))}},44364:(e,t,a)=>{a.d(t,{Z:()=>c});var n=a(67294),r=a(86010),i=a(95999),l=a(35281),s=a(74477);function c(e){let{className:t}=e;const a=(0,s.E)();return a.badge?n.createElement("span",{className:(0,r.Z)(t,l.k.docs.docVersionBadge,"badge badge--secondary")},n.createElement(i.Z,{id:"theme.docs.versionBadge.label",values:{versionLabel:a.label}},"Version: {versionLabel}")):null}},23120:(e,t,a)=>{a.d(t,{Z:()=>g});var n=a(67294),r=a(86010),i=a(52263),l=a(39960),s=a(95999),c=a(80143),o=a(35281),m=a(60373),d=a(74477);const u={unreleased:function(e){let{siteTitle:t,versionMetadata:a}=e;return n.createElement(s.Z,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:t,versionLabel:n.createElement("b",null,a.label)}},"This is unreleased documentation for {siteTitle} {versionLabel} version.")},unmaintained:function(e){let{siteTitle:t,versionMetadata:a}=e;return n.createElement(s.Z,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:t,versionLabel:n.createElement("b",null,a.label)}},"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained.")}};function h(e){const t=u[e.versionMetadata.banner];return n.createElement(t,e)}function b(e){let{versionLabel:t,to:a,onClick:r}=e;return n.createElement(s.Z,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:n.createElement("b",null,n.createElement(l.Z,{to:a,onClick:r},n.createElement(s.Z,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label"},"latest version")))}},"For up-to-date documentation, see the {latestVersionLink} ({versionLabel}).")}function v(e){let{className:t,versionMetadata:a}=e;const{siteConfig:{title:l}}=(0,i.Z)(),{pluginId:s}=(0,c.gA)({failfast:!0}),{savePreferredVersionName:d}=(0,m.J)(s),{latestDocSuggestion:u,latestVersionSuggestion:v}=(0,c.Jo)(s),g=u??(p=v).docs.find((e=>e.id===p.mainDocId));var p;return n.createElement("div",{className:(0,r.Z)(t,o.k.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert"},n.createElement("div",null,n.createElement(h,{siteTitle:l,versionMetadata:a})),n.createElement("div",{className:"margin-top--md"},n.createElement(b,{versionLabel:v.label,to:g.path,onClick:()=>d(v.name)})))}function g(e){let{className:t}=e;const a=(0,d.E)();return a.banner?n.createElement(v,{className:t,versionMetadata:a}):null}},92503:(e,t,a)=>{a.d(t,{Z:()=>m});var n=a(87462),r=a(67294),i=a(86010),l=a(95999),s=a(86668),c=a(39960);const o={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};function m(e){let{as:t,id:a,...m}=e;const{navbar:{hideOnScroll:d}}=(0,s.L)();if("h1"===t||!a)return r.createElement(t,(0,n.Z)({},m,{id:void 0}));const u=(0,l.I)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof m.children?m.children:a});return r.createElement(t,(0,n.Z)({},m,{className:(0,i.Z)("anchor",d?o.anchorWithHideOnScrollNavbar:o.anchorWithStickyNavbar,m.className),id:a}),m.children,r.createElement(c.Z,{className:"hash-link",to:`#${a}`,"aria-label":u,title:u},"\u200b"))}},32244:(e,t,a)=>{a.d(t,{Z:()=>l});var n=a(67294),r=a(86010),i=a(39960);function l(e){const{permalink:t,title:a,subLabel:l,isNext:s}=e;return n.createElement(i.Z,{className:(0,r.Z)("pagination-nav__link",s?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t},l&&n.createElement("div",{className:"pagination-nav__sublabel"},l),n.createElement("div",{className:"pagination-nav__label"},a))}}}]); \ No newline at end of file diff --git a/assets/js/15336817.ef571073.js b/assets/js/15336817.ef571073.js new file mode 100644 index 0000000000..f7202b37b9 --- /dev/null +++ b/assets/js/15336817.ef571073.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3826],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>k});var r=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=r.createContext({}),l=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=l(e.components);return r.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,s=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),p=l(n),m=o,k=p["".concat(s,".").concat(m)]||p[m]||d[m]||a;return n?r.createElement(k,i(i({ref:t},u),{},{components:n})):r.createElement(k,i({ref:t},u))}));function k(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=m;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c[p]="string"==typeof e?e:o,i[1]=c;for(var l=2;l{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>c,toc:()=>l});var r=n(87462),o=(n(67294),n(3905));const a={},i="Quickstart",c={unversionedId:"container/components/k8s-cluster-api-provider/doc/quickstart",id:"container/components/k8s-cluster-api-provider/doc/quickstart",title:"Quickstart",description:"This guide shows you how to get working Kubernetes clusters on a SCS cloud",source:"@site/docs/03-container/components/k8s-cluster-api-provider/doc/quickstart.md",sourceDirName:"03-container/components/k8s-cluster-api-provider/doc",slug:"/container/components/k8s-cluster-api-provider/doc/quickstart",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/quickstart",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/03-container/components/k8s-cluster-api-provider/doc/quickstart.md",tags:[],version:"current",frontMatter:{},sidebar:"docs",previous:{title:"Requirements",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/requirements"},next:{title:"Makefile reference",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/make-reference"}},s={},l=[{value:"Requirements",id:"requirements",level:2},{value:"Prepare the environment",id:"prepare-the-environment",level:2},{value:"Create a test cluster",id:"create-a-test-cluster",level:2},{value:"Teardown",id:"teardown",level:2},{value:"Beyond quickstart",id:"beyond-quickstart",level:2}],u={toc:l},p="wrapper";function d(e){let{components:t,...n}=e;return(0,o.kt)(p,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"quickstart"},"Quickstart"),(0,o.kt)("p",null,"This guide shows you how to get working Kubernetes clusters on a SCS cloud\nvia ",(0,o.kt)("a",{parentName:"p",href:"https://cluster-api.sigs.k8s.io/"},"cluster-api"),"(CAPI)."),(0,o.kt)("h2",{id:"requirements"},"Requirements"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"make"),(0,o.kt)("li",{parentName:"ul"},"kubectl"),(0,o.kt)("li",{parentName:"ul"},"terraform"),(0,o.kt)("li",{parentName:"ul"},"yq v2 or v4 (see note below)"),(0,o.kt)("li",{parentName:"ul"},"python3-openstackclient, python3-octaviaclient")),(0,o.kt)("h2",{id:"prepare-the-environment"},"Prepare the environment"),(0,o.kt)("p",null,"You need access to an OpenStack project.\nCopy the default environment and adjust the options according to your cloud."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"cp terraform/environments/environment-{default,}.tfvars\n")),(0,o.kt)("p",null,"Edit ",(0,o.kt)("inlineCode",{parentName:"p"},"terraform/environments/environment-.tfvars")," with your favourite text editor. Every option without a\ndefault value must be set.\nAdd\na ",(0,o.kt)("a",{parentName:"p",href:"https://docs.openstack.org/python-openstackclient/latest/configuration/index.html#configuration-files"},"clouds.yaml"),"\ninside the ",(0,o.kt)("inlineCode",{parentName:"p"},"terraform")," dir, in ",(0,o.kt)("inlineCode",{parentName:"p"},"~/.config/openstack")," or ",(0,o.kt)("inlineCode",{parentName:"p"},"/etc/openstack"),"."),(0,o.kt)("p",null,"It is recommended to set the name of the cloud in the ",(0,o.kt)("inlineCode",{parentName:"p"},"clouds.yml")," to the same value as the ",(0,o.kt)("inlineCode",{parentName:"p"},"cloud_provider")," in\nthe ",(0,o.kt)("inlineCode",{parentName:"p"},"environment-.tfvars"),", then you only have to specify the ",(0,o.kt)("inlineCode",{parentName:"p"},"ENVIRONMENT")," or ",(0,o.kt)("inlineCode",{parentName:"p"},"OS_CLOUD")," variable."),(0,o.kt)("h2",{id:"create-a-test-cluster"},"Create a test cluster"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"# Set the ENVIRONMENT to the name specified in the name of the file\n# `cloud_provider` option has to be set in the environment file\n# to the name of the cloud in the clouds.yaml\nexport ENVIRONMENT=`\n\n# Create your environment. This includes a management node as virtual machine\n# in your OpenStack environment as well as a Kubernetes testcluster.\nmake create\n\n# Get the kubeconfig of the testcluster\nmake get-kubeconfig\n\n# Interact with the testcluster\nkubectl --kubeconfig testcluster.yaml. get nodes\n")),(0,o.kt)("h2",{id:"teardown"},"Teardown"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"make clean\n")),(0,o.kt)("p",null,"If ",(0,o.kt)("inlineCode",{parentName:"p"},"make clean")," fails to clean up completely, you can also use the ",(0,o.kt)("inlineCode",{parentName:"p"},"fullclean")," target.\nReview the ",(0,o.kt)("a",{parentName:"p",href:"/docs/container/components/k8s-cluster-api-provider/doc/make-reference#teardown"},"Teardown section of the Makefile reference")," document for more details."),(0,o.kt)("h2",{id:"beyond-quickstart"},"Beyond quickstart"),(0,o.kt)("p",null,"This guide assumes you just create one test cluster directly when creating the\nmanagement server.\nIn a production setting, you would not use this test cluster but create clusters\nvia the management server. You can read more about this in the ",(0,o.kt)("a",{parentName:"p",href:"/docs/container/components/k8s-cluster-api-provider/doc/usage/"},"usage guide"),"."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/15e4a743.0af51b01.js b/assets/js/15e4a743.0af51b01.js new file mode 100644 index 0000000000..d189e0e0e5 --- /dev/null +++ b/assets/js/15e4a743.0af51b01.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7477],{3905:(e,t,r)=>{r.d(t,{Zo:()=>l,kt:()=>d});var n=r(67294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var p=n.createContext({}),s=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):c(c({},t),e)),r},l=function(e){var t=s(e.components);return n.createElement(p.Provider,{value:t},e.children)},u="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,p=e.parentName,l=a(e,["components","mdxType","originalType","parentName"]),u=s(r),m=o,d=u["".concat(p,".").concat(m)]||u[m]||f[m]||i;return r?n.createElement(d,c(c({ref:t},l),{},{components:r})):n.createElement(d,c({ref:t},l))}));function d(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,c=new Array(i);c[0]=m;var a={};for(var p in t)hasOwnProperty.call(t,p)&&(a[p]=t[p]);a.originalType=e,a[u]="string"==typeof e?e:o,c[1]=a;for(var s=2;s{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>c,default:()=>f,frontMatter:()=>i,metadata:()=>a,toc:()=>s});var n=r(87462),o=(r(67294),r(3905));const i={},c="Overview",a={unversionedId:"operating-scs/monitoring/index",id:"operating-scs/monitoring/index",title:"Overview",description:"TODO",source:"@site/docs/04-operating-scs/02-monitoring/index.md",sourceDirName:"04-operating-scs/02-monitoring",slug:"/operating-scs/monitoring/",permalink:"/docs/operating-scs/monitoring/",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/04-operating-scs/02-monitoring/index.md",tags:[],version:"current",frontMatter:{}},p={},s=[],l={toc:s},u="wrapper";function f(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,n.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"overview"},"Overview"),(0,o.kt)("p",null,"TODO"))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/16aafd28.b86ae6c0.js b/assets/js/16aafd28.b86ae6c0.js new file mode 100644 index 0000000000..99908014b9 --- /dev/null +++ b/assets/js/16aafd28.b86ae6c0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9477],{87650:s=>{s.exports=JSON.parse('{"title":"SCS-0212","slug":"standards/scs-0212","permalink":"/standards/standards/scs-0212","navigation":{"previous":{"title":"Decisions for the Volume Type Standard","permalink":"/standards/scs-0111-v1-volume-type-decisions"},"next":{"title":"Requirements for container registry","permalink":"/standards/scs-0212-v1-requirements-for-container-registry"}}}')}}]); \ No newline at end of file diff --git a/assets/js/1722e234.839a439e.js b/assets/js/1722e234.839a439e.js new file mode 100644 index 0000000000..dcf442d652 --- /dev/null +++ b/assets/js/1722e234.839a439e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3197],{3905:(t,e,a)=>{a.d(e,{Zo:()=>c,kt:()=>k});var n=a(67294);function r(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function l(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function i(t){for(var e=1;e=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var p=n.createContext({}),o=function(t){var e=n.useContext(p),a=e;return t&&(a="function"==typeof t?t(e):i(i({},e),t)),a},c=function(t){var e=o(t.components);return n.createElement(p.Provider,{value:e},t.children)},m="mdxType",u={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},s=n.forwardRef((function(t,e){var a=t.components,r=t.mdxType,l=t.originalType,p=t.parentName,c=d(t,["components","mdxType","originalType","parentName"]),m=o(a),s=r,k=m["".concat(p,".").concat(s)]||m[s]||u[s]||l;return a?n.createElement(k,i(i({ref:e},c),{},{components:a})):n.createElement(k,i({ref:e},c))}));function k(t,e){var a=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var l=a.length,i=new Array(l);i[0]=s;var d={};for(var p in e)hasOwnProperty.call(e,p)&&(d[p]=e[p]);d.originalType=t,d[m]="string"==typeof t?t:r,i[1]=d;for(var o=2;o{a.r(e),a.d(e,{assets:()=>p,contentTitle:()=>i,default:()=>u,frontMatter:()=>l,metadata:()=>d,toc:()=>o});var n=a(87462),r=(a(67294),a(3905));const l={},i="Test and development cloud resources",d={unversionedId:"cloud-resources/cloud-resources",id:"cloud-resources/cloud-resources",title:"Test and development cloud resources",description:"This document gives an overview of the test and development cloud resources currently provided by our partners.",source:"@site/community/cloud-resources/cloud-resources.md",sourceDirName:"cloud-resources",slug:"/cloud-resources/",permalink:"/community/cloud-resources/",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"community",previous:{title:"Matrix",permalink:"/community/communication/matrix"},next:{title:"Getting Started with OpenStack",permalink:"/community/cloud-resources/getting-started-openstack"}},p={},o=[{value:"How to request cloud resources",id:"how-to-request-cloud-resources",level:2},{value:"plusserver",id:"plusserver",level:2},{value:"Usage",id:"usage",level:3},{value:"Users",id:"users",level:3},{value:"Service Users",id:"service-users",level:3},{value:"Projects",id:"projects",level:3},{value:"Wavecon",id:"wavecon",level:2},{value:"Service Users",id:"service-users-1",level:3},{value:"Projects",id:"projects-1",level:3}],c={toc:o},m="wrapper";function u(t){let{components:e,...a}=t;return(0,r.kt)(m,(0,n.Z)({},c,a,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"test-and-development-cloud-resources"},"Test and development cloud resources"),(0,r.kt)("p",null,"This document gives an overview of the test and development cloud resources currently provided by our partners."),(0,r.kt)("h2",{id:"how-to-request-cloud-resources"},"How to request cloud resources"),(0,r.kt)("p",null,"To request access to an existing project, please contact the responsible community member. To apply for a new project, please create a pull request against this document (leave ",(0,r.kt)("inlineCode",{parentName:"p"},"Unique Identifier")," blank) and assign it to the particular CSP team (e.g. @SovereignCloudStack/plusserver, @SovereignCloudStack/wavecon, ...)"),(0,r.kt)("h2",{id:"plusserver"},"plusserver"),(0,r.kt)("h3",{id:"usage"},"Usage"),(0,r.kt)("p",null,"A brief guide on how to use the resources provided by plusserver GmbH can be found ",(0,r.kt)("a",{parentName:"p",href:"/community/cloud-resources/plusserver-gx-scs"},"here")),(0,r.kt)("h3",{id:"users"},"Users"),(0,r.kt)("p",null,"As suggested in ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/issues/155"},"#155"),' the username for non-"service users" will contain the users github handle and are prefixed with a plusserver default.\n',(0,r.kt)("inlineCode",{parentName:"p"},"prefix-")),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},(0,r.kt)("strong",{parentName:"p"},"Note"),"\nATM this is not directly connected to the SovereignCloudStack github org membership, accounts will be created manually for now.")),(0,r.kt)("p",null,"Example:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"center"},"github handle"),(0,r.kt)("th",{parentName:"tr",align:"center"},"plusserver login"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"frosty-geek"),(0,r.kt)("td",{parentName:"tr",align:"center"},"u500924-frosty-geek")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"fkr"),(0,r.kt)("td",{parentName:"tr",align:"center"},"u500924-fkr")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"}),(0,r.kt)("td",{parentName:"tr",align:"center"})))),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},(0,r.kt)("strong",{parentName:"p"},"Note"),"\nTo easy collaboration & transparency within the SCS team all users will have their default_project_id set to ",(0,r.kt)("inlineCode",{parentName:"p"},"p500924-scs-community")," by default and will have full access on all projects listed below.")),(0,r.kt)("h3",{id:"service-users"},"Service Users"),(0,r.kt)("p",null,"Service users will have their default_project_id set to a specific project and will NOT be granted full access to other projects by default."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"center"},"Unique Identifier"),(0,r.kt)("th",{parentName:"tr",align:null},"Service User Name"),(0,r.kt)("th",{parentName:"tr",align:null},"Full Access on"),(0,r.kt)("th",{parentName:"tr",align:null},"Community Contact"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"),(0,r.kt)("th",{parentName:"tr",align:"center"},"Needed until"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"9a1576af59644a2dbbace773ad17158d"),(0,r.kt)("td",{parentName:"tr",align:null},"u500924-svc-sig-monitoring"),(0,r.kt)("td",{parentName:"tr",align:null},"p500924-sig-monitoring1"),(0,r.kt)("td",{parentName:"tr",align:null},"fkr"),(0,r.kt)("td",{parentName:"tr",align:null},"Service User - SIG Monitoring"),(0,r.kt)("td",{parentName:"tr",align:"center"},"31.12.2023")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"4925967416894fd78be6701689059653"),(0,r.kt)("td",{parentName:"tr",align:null},"u500924-svc-cloudmon"),(0,r.kt)("td",{parentName:"tr",align:null},"p500924-cloudmon-target"),(0,r.kt)("td",{parentName:"tr",align:null},"costelter"),(0,r.kt)("td",{parentName:"tr",align:null},"Service User - CloudMon Test Project"),(0,r.kt)("td",{parentName:"tr",align:"center"},"31.12.2023")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"f89b3d64ddff4d9d8cadb5e06fa22299"),(0,r.kt)("td",{parentName:"tr",align:null},"u500924-svc-healthmonitor"),(0,r.kt)("td",{parentName:"tr",align:null},"p500924-scs-healthmonitor"),(0,r.kt)("td",{parentName:"tr",align:null},"garloff"),(0,r.kt)("td",{parentName:"tr",align:null},"Service User - SCS Health Monitor"),(0,r.kt)("td",{parentName:"tr",align:"center"},"\u221e")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"49cc3d72fbdf41fe8dc407f57f026dbf"),(0,r.kt)("td",{parentName:"tr",align:null},"u500924-svc-standards"),(0,r.kt)("td",{parentName:"tr",align:null},"p500924-scs-healthmonitor"),(0,r.kt)("td",{parentName:"tr",align:null},"garloff"),(0,r.kt)("td",{parentName:"tr",align:null},"Service User - SCS Standards Compliance Check"),(0,r.kt)("td",{parentName:"tr",align:"center"},"\u221e")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"49cc3d72fbdf41fe8dc407f57f026dbf"),(0,r.kt)("td",{parentName:"tr",align:null},"u500924-svc-zuul"),(0,r.kt)("td",{parentName:"tr",align:null},"p500924-scs-zuul"),(0,r.kt)("td",{parentName:"tr",align:null},"o-otte"),(0,r.kt)("td",{parentName:"tr",align:null},"Service User - SCS Zuul"),(0,r.kt)("td",{parentName:"tr",align:"center"},"30.11.2024")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"}),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:"center"})))),(0,r.kt)("h3",{id:"projects"},"Projects"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"center"},"Unique Identifier"),(0,r.kt)("th",{parentName:"tr",align:null},"Project Name"),(0,r.kt)("th",{parentName:"tr",align:null},"Community Contact"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"),(0,r.kt)("th",{parentName:"tr",align:"center"},"Needed until"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"2237c767cf5f456da19359ed31c1c16b"),(0,r.kt)("td",{parentName:"tr",align:null},"p500924-scs-community"),(0,r.kt)("td",{parentName:"tr",align:null},"fkr"),(0,r.kt)("td",{parentName:"tr",align:null},"SCS Community Project"),(0,r.kt)("td",{parentName:"tr",align:"center"},"\u221e")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"b43cfafbcf1f4eb08865b2886c29e09b"),(0,r.kt)("td",{parentName:"tr",align:null},"p500924-cluster-api-session"),(0,r.kt)("td",{parentName:"tr",align:null},"garloff"),(0,r.kt)("td",{parentName:"tr",align:null},"cluster-api hands on session"),(0,r.kt)("td",{parentName:"tr",align:"center"},"\u221e")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"9b7a73e516be4cd1acbd63d543985c52"),(0,r.kt)("td",{parentName:"tr",align:null},"p500924-gonicus-dev"),(0,r.kt)("td",{parentName:"tr",align:null},"o-otte"),(0,r.kt)("td",{parentName:"tr",align:null},"GONICUS GmbH"),(0,r.kt)("td",{parentName:"tr",align:"center"},"\u221e")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"3829cc7c8f034fc985f5055a1df6f247"),(0,r.kt)("td",{parentName:"tr",align:null},"p500924-scs-healthmonitor"),(0,r.kt)("td",{parentName:"tr",align:null},"garloff"),(0,r.kt)("td",{parentName:"tr",align:null},"SCS Health Monitor"),(0,r.kt)("td",{parentName:"tr",align:"center"},"\u221e")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"b97d38bf128b4479981c4dbe2ef70cd5"),(0,r.kt)("td",{parentName:"tr",align:null},"p500924-SIG-IAM"),(0,r.kt)("td",{parentName:"tr",align:null},"fkr"),(0,r.kt)("td",{parentName:"tr",align:null},"SIG IAM and VP08"),(0,r.kt)("td",{parentName:"tr",align:"center"},"\u221e")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"9de7d8dc2d674e52be44904d6b338b0b"),(0,r.kt)("td",{parentName:"tr",align:null},"p500924-cloudmon"),(0,r.kt)("td",{parentName:"tr",align:null},"costelter"),(0,r.kt)("td",{parentName:"tr",align:null},"CloudMon Test Project"),(0,r.kt)("td",{parentName:"tr",align:"center"},"31.12.2023")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"2c9e0e4ef8d44c36807df50b06b3c81d"),(0,r.kt)("td",{parentName:"tr",align:null},"p500924-cloudmon-target"),(0,r.kt)("td",{parentName:"tr",align:null},"costelter"),(0,r.kt)("td",{parentName:"tr",align:null},"Target project for CloudMon tests"),(0,r.kt)("td",{parentName:"tr",align:"center"},"31.12.2023")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"3501db829014406884990a1016f3e25d"),(0,r.kt)("td",{parentName:"tr",align:null},"p500924-sig-monitoring1"),(0,r.kt)("td",{parentName:"tr",align:null},"fkr"),(0,r.kt)("td",{parentName:"tr",align:null},"SIG Monitoring - cloudmon target"),(0,r.kt)("td",{parentName:"tr",align:"center"},"31.12.2023")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"602778bad3d3470cbe58c4f7611e8eb7"),(0,r.kt)("td",{parentName:"tr",align:null},"p500924-dnation"),(0,r.kt)("td",{parentName:"tr",align:null},"chess-knight"),(0,r.kt)("td",{parentName:"tr",align:null},"dNation dev for VP06c"),(0,r.kt)("td",{parentName:"tr",align:"center"},"\u221e")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"91091d4039a6457db27d48d58bb1b4e4"),(0,r.kt)("td",{parentName:"tr",align:null},"p500924-jschoone"),(0,r.kt)("td",{parentName:"tr",align:null},"jschoone"),(0,r.kt)("td",{parentName:"tr",align:null},"KaaS dev and evaluation"),(0,r.kt)("td",{parentName:"tr",align:"center"},"\u221e")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"93956190702b4a7d8a8886806d57713f"),(0,r.kt)("td",{parentName:"tr",align:null},"p500924-metering"),(0,r.kt)("td",{parentName:"tr",align:null},"cah-link"),(0,r.kt)("td",{parentName:"tr",align:null},"Dev Environment for VP13"),(0,r.kt)("td",{parentName:"tr",align:"center"},"31.12.2023")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"abbe6561cf6248b6af395334aa09af85"),(0,r.kt)("td",{parentName:"tr",align:null},"p500924-harbor"),(0,r.kt)("td",{parentName:"tr",align:null},"chess-knight"),(0,r.kt)("td",{parentName:"tr",align:null},"SCS Harbor for VP06c"),(0,r.kt)("td",{parentName:"tr",align:"center"},"\u221e")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"4ff97734574146ccb4c7e7568bc1e36f"),(0,r.kt)("td",{parentName:"tr",align:null},"p500924-XPanse"),(0,r.kt)("td",{parentName:"tr",align:null},"swaroopar"),(0,r.kt)("td",{parentName:"tr",align:null},"Eclipse XPanse Projekt POC"),(0,r.kt)("td",{parentName:"tr",align:"center"},"31.11.2023")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"e7622c1048ac4520a2d050ae141e826b"),(0,r.kt)("td",{parentName:"tr",align:null},"p500924-tender-6a"),(0,r.kt)("td",{parentName:"tr",align:null},"mxmxchere"),(0,r.kt)("td",{parentName:"tr",align:null},"Dev Environment for VP06a"),(0,r.kt)("td",{parentName:"tr",align:"center"},"\u221e")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"eeed7e0ad33f42f189fb4165116f5a1b"),(0,r.kt)("td",{parentName:"tr",align:null},"p500924-dnation-k8s"),(0,r.kt)("td",{parentName:"tr",align:null},"matofeder"),(0,r.kt)("td",{parentName:"tr",align:null},"dNation dev for VP06c"),(0,r.kt)("td",{parentName:"tr",align:"center"},"\u221e")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"b342f37804f14459bdf703573169bf79"),(0,r.kt)("td",{parentName:"tr",align:null},"p500924-minery"),(0,r.kt)("td",{parentName:"tr",align:null},"90n20"),(0,r.kt)("td",{parentName:"tr",align:null},"Testbed env for Pentesting"),(0,r.kt)("td",{parentName:"tr",align:"center"},"30.11.2024")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"0fa3c3559f0d4f39ba7aa70c7f7188ca"),(0,r.kt)("td",{parentName:"tr",align:null},"p500924-tender-10-3"),(0,r.kt)("td",{parentName:"tr",align:null},"tonifinger"),(0,r.kt)("td",{parentName:"tr",align:null},"Dev Environment for VP10-3"),(0,r.kt)("td",{parentName:"tr",align:"center"},"\u221e")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"b682eb90fb834278afb1182018dd2133"),(0,r.kt)("td",{parentName:"tr",align:null},"p500924-scoopex"),(0,r.kt)("td",{parentName:"tr",align:null},"scoopex"),(0,r.kt)("td",{parentName:"tr",align:null},"Marc's gx-scs project"),(0,r.kt)("td",{parentName:"tr",align:"center"},"\u221e")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"021af0688c594bf88ed675b942d3bea8"),(0,r.kt)("td",{parentName:"tr",align:null},"p500924-gx-cred-generator"),(0,r.kt)("td",{parentName:"tr",align:null},"anjastrunk"),(0,r.kt)("td",{parentName:"tr",align:null},"SCS Gaia-X Self-Description Generator"),(0,r.kt)("td",{parentName:"tr",align:"center"},"\u221e")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"a07c811315ad40f585945b2939ef12dd"),(0,r.kt)("td",{parentName:"tr",align:null},"p500924-scs-zuul"),(0,r.kt)("td",{parentName:"tr",align:null},"o-otte"),(0,r.kt)("td",{parentName:"tr",align:null},"SCS Zuul"),(0,r.kt)("td",{parentName:"tr",align:"center"},"30.11.2024")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"}),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:"center"})))),(0,r.kt)("h2",{id:"wavecon"},"Wavecon"),(0,r.kt)("h3",{id:"service-users-1"},"Service Users"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"center"},"Unique Identifier"),(0,r.kt)("th",{parentName:"tr",align:null},"Service User Name"),(0,r.kt)("th",{parentName:"tr",align:null},"Full Access on"),(0,r.kt)("th",{parentName:"tr",align:null},"Community Contact"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"),(0,r.kt)("th",{parentName:"tr",align:"center"},"Needed until"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"df4af5376bbd4de587c4335622149be7"),(0,r.kt)("td",{parentName:"tr",align:null},"scs-standards"),(0,r.kt)("td",{parentName:"tr",align:null},"scs-standards"),(0,r.kt)("td",{parentName:"tr",align:null},"itrich"),(0,r.kt)("td",{parentName:"tr",align:null},"Service User - SCS Standards Compliance Check"),(0,r.kt)("td",{parentName:"tr",align:"center"},"\u221e")))),(0,r.kt)("h3",{id:"projects-1"},"Projects"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"center"},"Unique Identifier"),(0,r.kt)("th",{parentName:"tr",align:null},"Project Name"),(0,r.kt)("th",{parentName:"tr",align:null},"Community Contact"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"),(0,r.kt)("th",{parentName:"tr",align:"center"},"Needed until"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"718964b4b87446688ac04b151519fb51"),(0,r.kt)("td",{parentName:"tr",align:null},"scs"),(0,r.kt)("td",{parentName:"tr",align:null},"garloff"),(0,r.kt)("td",{parentName:"tr",align:null},"SCS Health Monitor"),(0,r.kt)("td",{parentName:"tr",align:"center"},"\u221e")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"c46ccc9e695c4b23bacee2ad11145d9a"),(0,r.kt)("td",{parentName:"tr",align:null},"scs-health-monitor"),(0,r.kt)("td",{parentName:"tr",align:null},"garloff"),(0,r.kt)("td",{parentName:"tr",align:null},"SCS Health Monitor"),(0,r.kt)("td",{parentName:"tr",align:"center"},"\u221e")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"00de553df86949b49365baee6375fb5a"),(0,r.kt)("td",{parentName:"tr",align:null},"scs-standards"),(0,r.kt)("td",{parentName:"tr",align:null},"itrich"),(0,r.kt)("td",{parentName:"tr",align:null},"SCS Health Monitor"),(0,r.kt)("td",{parentName:"tr",align:"center"},"\u221e")))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/17896441.7488da5b.js b/assets/js/17896441.7488da5b.js new file mode 100644 index 0000000000..483c7d1c24 --- /dev/null +++ b/assets/js/17896441.7488da5b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7918],{1310:(e,t,n)=>{n.d(t,{Z:()=>E});var a=n(87462),l=n(67294),o=n(86010),r=n(35281),s=n(53438),c=n(48596),i=n(39960),d=n(95999),m=n(44996);function u(e){return l.createElement("svg",(0,a.Z)({viewBox:"0 0 24 24"},e),l.createElement("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"}))}const v={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function b(){const e=(0,m.Z)("/");return l.createElement("li",{className:"breadcrumbs__item"},l.createElement(i.Z,{"aria-label":(0,d.I)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e},l.createElement(u,{className:v.breadcrumbHomeIcon})))}const p={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function h(e){let{children:t,href:n,isLast:a}=e;const o="breadcrumbs__link";return a?l.createElement("span",{className:o,itemProp:"name"},t):n?l.createElement(i.Z,{className:o,href:n,itemProp:"item"},l.createElement("span",{itemProp:"name"},t)):l.createElement("span",{className:o},t)}function f(e){let{children:t,active:n,index:r,addMicrodata:s}=e;return l.createElement("li",(0,a.Z)({},s&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},{className:(0,o.Z)("breadcrumbs__item",{"breadcrumbs__item--active":n})}),t,l.createElement("meta",{itemProp:"position",content:String(r+1)}))}function E(){const e=(0,s.s1)(),t=(0,c.Ns)();return e?l.createElement("nav",{className:(0,o.Z)(r.k.docs.docBreadcrumbs,p.breadcrumbsContainer),"aria-label":(0,d.I)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"})},l.createElement("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList"},t&&l.createElement(b,null),e.map(((t,n)=>{const a=n===e.length-1;return l.createElement(f,{key:n,active:a,index:n,addMicrodata:!!t.href},l.createElement(h,{href:t.href,isLast:a},t.label))})))):null}},15154:(e,t,n)=>{n.r(t),n.d(t,{default:()=>j});var a=n(67294),l=n(1944),o=n(902);const r=a.createContext(null);function s(e){let{children:t,content:n}=e;const l=function(e){return(0,a.useMemo)((()=>({metadata:e.metadata,frontMatter:e.frontMatter,assets:e.assets,contentTitle:e.contentTitle,toc:e.toc})),[e])}(n);return a.createElement(r.Provider,{value:l},t)}function c(){const e=(0,a.useContext)(r);if(null===e)throw new o.i6("DocProvider");return e}function i(){const{metadata:e,frontMatter:t,assets:n}=c();return a.createElement(l.d,{title:e.title,description:e.description,keywords:t.keywords,image:n.image??t.image})}var d=n(86010),m=n(87524),u=n(80049);function v(){const{metadata:e}=c();return a.createElement(u.Z,{previous:e.previous,next:e.next})}var b=n(23120),p=n(44364),h=n(35281),f=n(95999);function E(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:n}=e;return a.createElement(f.Z,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:a.createElement("b",null,a.createElement("time",{dateTime:new Date(1e3*t).toISOString()},n))}}," on {date}")}function g(e){let{lastUpdatedBy:t}=e;return a.createElement(f.Z,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:a.createElement("b",null,t)}}," by {user}")}function L(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:n,lastUpdatedBy:l}=e;return a.createElement("span",{className:h.k.common.lastUpdated},a.createElement(f.Z,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:t&&n?a.createElement(E,{lastUpdatedAt:t,formattedLastUpdatedAt:n}):"",byUser:l?a.createElement(g,{lastUpdatedBy:l}):""}},"Last updated{atDate}{byUser}"),!1)}var C=n(84881),N=n(71526);const Z={lastUpdated:"lastUpdated_vwxv"};function k(e){return a.createElement("div",{className:(0,d.Z)(h.k.docs.docFooterTagsRow,"row margin-bottom--sm")},a.createElement("div",{className:"col"},a.createElement(N.Z,e)))}function _(e){let{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:l,formattedLastUpdatedAt:o}=e;return a.createElement("div",{className:(0,d.Z)(h.k.docs.docFooterEditMetaRow,"row")},a.createElement("div",{className:"col"},t&&a.createElement(C.Z,{editUrl:t})),a.createElement("div",{className:(0,d.Z)("col",Z.lastUpdated)},(n||l)&&a.createElement(L,{lastUpdatedAt:n,formattedLastUpdatedAt:o,lastUpdatedBy:l})))}function x(){const{metadata:e}=c(),{editUrl:t,lastUpdatedAt:n,formattedLastUpdatedAt:l,lastUpdatedBy:o,tags:r}=e,s=r.length>0,i=!!(t||n||o);return s||i?a.createElement("footer",{className:(0,d.Z)(h.k.docs.docFooter,"docusaurus-mt-lg")},s&&a.createElement(k,{tags:r}),i&&a.createElement(_,{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:o,formattedLastUpdatedAt:l})):null}var T=n(86043),H=n(93743),U=n(87462);const y={tocCollapsibleButton:"tocCollapsibleButton_TO0P",tocCollapsibleButtonExpanded:"tocCollapsibleButtonExpanded_MG3E"};function A(e){let{collapsed:t,...n}=e;return a.createElement("button",(0,U.Z)({type:"button"},n,{className:(0,d.Z)("clean-btn",y.tocCollapsibleButton,!t&&y.tocCollapsibleButtonExpanded,n.className)}),a.createElement(f.Z,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component"},"On this page"))}const w={tocCollapsible:"tocCollapsible_ETCw",tocCollapsibleContent:"tocCollapsibleContent_vkbj",tocCollapsibleExpanded:"tocCollapsibleExpanded_sAul"};function M(e){let{toc:t,className:n,minHeadingLevel:l,maxHeadingLevel:o}=e;const{collapsed:r,toggleCollapsed:s}=(0,T.u)({initialState:!0});return a.createElement("div",{className:(0,d.Z)(w.tocCollapsible,!r&&w.tocCollapsibleExpanded,n)},a.createElement(A,{collapsed:r,onClick:s}),a.createElement(T.z,{lazy:!0,className:w.tocCollapsibleContent,collapsed:r},a.createElement(H.Z,{toc:t,minHeadingLevel:l,maxHeadingLevel:o})))}const I={tocMobile:"tocMobile_ITEo"};function B(){const{toc:e,frontMatter:t}=c();return a.createElement(M,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:(0,d.Z)(h.k.docs.docTocMobile,I.tocMobile)})}var O=n(39407);function S(){const{toc:e,frontMatter:t}=c();return a.createElement(O.Z,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:h.k.docs.docTocDesktop})}var V=n(92503),P=n(21098);function D(e){let{children:t}=e;const n=function(){const{metadata:e,frontMatter:t,contentTitle:n}=c();return t.hide_title||void 0!==n?null:e.title}();return a.createElement("div",{className:(0,d.Z)(h.k.docs.docMarkdown,"markdown")},n&&a.createElement("header",null,a.createElement(V.Z,{as:"h1"},n)),a.createElement(P.Z,null,t))}var R=n(1310);const F={docItemContainer:"docItemContainer_Djhp",docItemCol:"docItemCol_VOVn"};function z(e){let{children:t}=e;const n=function(){const{frontMatter:e,toc:t}=c(),n=(0,m.i)(),l=e.hide_table_of_contents,o=!l&&t.length>0;return{hidden:l,mobile:o?a.createElement(B,null):void 0,desktop:!o||"desktop"!==n&&"ssr"!==n?void 0:a.createElement(S,null)}}();return a.createElement("div",{className:"row"},a.createElement("div",{className:(0,d.Z)("col",!n.hidden&&F.docItemCol)},a.createElement(b.Z,null),a.createElement("div",{className:F.docItemContainer},a.createElement("article",null,a.createElement(R.Z,null),a.createElement(p.Z,null),n.mobile,a.createElement(D,null,t),a.createElement(x,null)),a.createElement(v,null))),n.desktop&&a.createElement("div",{className:"col col--3"},n.desktop))}function j(e){const t=`docs-doc-id-${e.content.metadata.unversionedId}`,n=e.content;return a.createElement(s,{content:e.content},a.createElement(l.FG,{className:t},a.createElement(i,null),a.createElement(z,null,a.createElement(n,null))))}},80049:(e,t,n)=>{n.d(t,{Z:()=>s});var a=n(87462),l=n(67294),o=n(95999),r=n(32244);function s(e){const{previous:t,next:n}=e;return l.createElement("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,o.I)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"})},t&&l.createElement(r.Z,(0,a.Z)({},t,{subLabel:l.createElement(o.Z,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc"},"Previous")})),n&&l.createElement(r.Z,(0,a.Z)({},n,{subLabel:l.createElement(o.Z,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc"},"Next"),isNext:!0})))}},44364:(e,t,n)=>{n.d(t,{Z:()=>c});var a=n(67294),l=n(86010),o=n(95999),r=n(35281),s=n(74477);function c(e){let{className:t}=e;const n=(0,s.E)();return n.badge?a.createElement("span",{className:(0,l.Z)(t,r.k.docs.docVersionBadge,"badge badge--secondary")},a.createElement(o.Z,{id:"theme.docs.versionBadge.label",values:{versionLabel:n.label}},"Version: {versionLabel}")):null}},23120:(e,t,n)=>{n.d(t,{Z:()=>h});var a=n(67294),l=n(86010),o=n(52263),r=n(39960),s=n(95999),c=n(80143),i=n(35281),d=n(60373),m=n(74477);const u={unreleased:function(e){let{siteTitle:t,versionMetadata:n}=e;return a.createElement(s.Z,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:t,versionLabel:a.createElement("b",null,n.label)}},"This is unreleased documentation for {siteTitle} {versionLabel} version.")},unmaintained:function(e){let{siteTitle:t,versionMetadata:n}=e;return a.createElement(s.Z,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:t,versionLabel:a.createElement("b",null,n.label)}},"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained.")}};function v(e){const t=u[e.versionMetadata.banner];return a.createElement(t,e)}function b(e){let{versionLabel:t,to:n,onClick:l}=e;return a.createElement(s.Z,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:a.createElement("b",null,a.createElement(r.Z,{to:n,onClick:l},a.createElement(s.Z,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label"},"latest version")))}},"For up-to-date documentation, see the {latestVersionLink} ({versionLabel}).")}function p(e){let{className:t,versionMetadata:n}=e;const{siteConfig:{title:r}}=(0,o.Z)(),{pluginId:s}=(0,c.gA)({failfast:!0}),{savePreferredVersionName:m}=(0,d.J)(s),{latestDocSuggestion:u,latestVersionSuggestion:p}=(0,c.Jo)(s),h=u??(f=p).docs.find((e=>e.id===f.mainDocId));var f;return a.createElement("div",{className:(0,l.Z)(t,i.k.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert"},a.createElement("div",null,a.createElement(v,{siteTitle:r,versionMetadata:n})),a.createElement("div",{className:"margin-top--md"},a.createElement(b,{versionLabel:p.label,to:h.path,onClick:()=>m(p.name)})))}function h(e){let{className:t}=e;const n=(0,m.E)();return n.banner?a.createElement(p,{className:t,versionMetadata:n}):null}},39407:(e,t,n)=>{n.d(t,{Z:()=>d});var a=n(87462),l=n(67294),o=n(86010),r=n(93743);const s={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"},c="table-of-contents__link toc-highlight",i="table-of-contents__link--active";function d(e){let{className:t,...n}=e;return l.createElement("div",{className:(0,o.Z)(s.tableOfContents,"thin-scrollbar",t)},l.createElement(r.Z,(0,a.Z)({},n,{linkClassName:c,linkActiveClassName:i})))}},93743:(e,t,n)=>{n.d(t,{Z:()=>b});var a=n(87462),l=n(67294),o=n(86668);function r(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const a=n.slice(2,e.level);e.parentIndex=Math.max(...a),n[e.level]=t}));const a=[];return t.forEach((e=>{const{parentIndex:n,...l}=e;n>=0?t[n].children.push(l):a.push(l)})),a}function s(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return t.flatMap((e=>{const t=s({toc:e.children,minHeadingLevel:n,maxHeadingLevel:a});return function(e){return e.level>=n&&e.level<=a}(e)?[{...e,children:t}]:t}))}function c(e){const t=e.getBoundingClientRect();return t.top===t.bottom?c(e.parentNode):t}function i(e,t){let{anchorTopOffset:n}=t;const a=e.find((e=>c(e).top>=n));if(a){return function(e){return e.top>0&&e.bottom{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function m(e){const t=(0,l.useRef)(void 0),n=d();(0,l.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:a,linkActiveClassName:l,minHeadingLevel:o,maxHeadingLevel:r}=e;function s(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(a),s=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const a=[];for(let l=t;l<=n;l+=1)a.push(`h${l}.anchor`);return Array.from(document.querySelectorAll(a.join()))}({minHeadingLevel:o,maxHeadingLevel:r}),c=i(s,{anchorTopOffset:n.current}),d=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,n){n?(t.current&&t.current!==e&&t.current.classList.remove(l),e.classList.add(l),t.current=e):e.classList.remove(l)}(e,e===d)}))}return document.addEventListener("scroll",s),document.addEventListener("resize",s),s(),()=>{document.removeEventListener("scroll",s),document.removeEventListener("resize",s)}}),[e,n])}function u(e){let{toc:t,className:n,linkClassName:a,isChild:o}=e;return t.length?l.createElement("ul",{className:o?void 0:n},t.map((e=>l.createElement("li",{key:e.id},l.createElement("a",{href:`#${e.id}`,className:a??void 0,dangerouslySetInnerHTML:{__html:e.value}}),l.createElement(u,{isChild:!0,toc:e.children,className:n,linkClassName:a}))))):null}const v=l.memo(u);function b(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:c="table-of-contents__link",linkActiveClassName:i,minHeadingLevel:d,maxHeadingLevel:u,...b}=e;const p=(0,o.L)(),h=d??p.tableOfContents.minHeadingLevel,f=u??p.tableOfContents.maxHeadingLevel,E=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return(0,l.useMemo)((()=>s({toc:r(t),minHeadingLevel:n,maxHeadingLevel:a})),[t,n,a])}({toc:t,minHeadingLevel:h,maxHeadingLevel:f});return m((0,l.useMemo)((()=>{if(c&&i)return{linkClassName:c,linkActiveClassName:i,minHeadingLevel:h,maxHeadingLevel:f}}),[c,i,h,f])),l.createElement(v,(0,a.Z)({toc:E,className:n,linkClassName:c},b))}}}]); \ No newline at end of file diff --git a/assets/js/178df98e.b749cc52.js b/assets/js/178df98e.b749cc52.js new file mode 100644 index 0000000000..ed19636fa3 --- /dev/null +++ b/assets/js/178df98e.b749cc52.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5889],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>f});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),d=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=d(e.components);return r.createElement(l.Provider,{value:t},e.children)},c="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),c=d(n),m=a,f=c["".concat(l,".").concat(m)]||c[m]||u[m]||o;return n?r.createElement(f,i(i({ref:t},p),{},{components:n})):r.createElement(f,i({ref:t},p))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[c]="string"==typeof e?e:a,i[1]=s;for(var d=2;d{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>s,toc:()=>d});var r=n(87462),a=(n(67294),n(3905));const o={},i="Ops Standards",s={unversionedId:"ops/index",id:"ops/index",title:"Ops Standards",description:"Operational Tooling Standards cover the protocols and guidelines associated with tools and utilities used for monitoring, management, and maintenance of the cloud environment. This includes standards for status pages, alerts, logs, and other operational tools, aiming to optimize the reliability, performance, and security of cloud services and resources.",source:"@site/standards/ops/index.md",sourceDirName:"ops",slug:"/ops/",permalink:"/standards/ops/",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"standards",previous:{title:"Requirements for SSO identity federation",permalink:"/standards/scs-0300-v1-requirements-for-sso-identity-federation"},next:{title:"SCS-0412: Metering JSON",permalink:"/standards/ops/scs-0412"}},l={},d=[],p={toc:d},c="wrapper";function u(e){let{components:t,...n}=e;return(0,a.kt)(c,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"ops-standards"},"Ops Standards"),(0,a.kt)("p",null,"Operational Tooling Standards cover the protocols and guidelines associated with tools and utilities used for monitoring, management, and maintenance of the cloud environment. This includes standards for status pages, alerts, logs, and other operational tools, aiming to optimize the reliability, performance, and security of cloud services and resources."),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Standard"),(0,a.kt)("th",{parentName:"tr",align:null},"Most Recent Version"),(0,a.kt)("th",{parentName:"tr",align:null},"State"),(0,a.kt)("th",{parentName:"tr",align:null},"Description"),(0,a.kt)("th",{parentName:"tr",align:null},"stabilized"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("a",{parentName:"td",href:"/standards/ops/scs-0412"},"SCS-0412")),(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("a",{parentName:"td",href:"/standards/scs-0412-v1-metering-json"},"v1")),(0,a.kt)("td",{parentName:"tr",align:null},"\ud83d\udfe0 Draft"),(0,a.kt)("td",{parentName:"tr",align:null},"Exposition of IaaS metering data as JSON"),(0,a.kt)("td",{parentName:"tr",align:null},"-")))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/183af61f.acca119c.js b/assets/js/183af61f.acca119c.js new file mode 100644 index 0000000000..4313750fba --- /dev/null +++ b/assets/js/183af61f.acca119c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[739],{3905:(e,t,r)=>{r.d(t,{Zo:()=>l,kt:()=>y});var n=r(67294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var u=n.createContext({}),p=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):c(c({},t),e)),r},l=function(e){var t=p(e.components);return n.createElement(u.Provider,{value:t},e.children)},s="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,u=e.parentName,l=a(e,["components","mdxType","originalType","parentName"]),s=p(r),f=o,y=s["".concat(u,".").concat(f)]||s[f]||m[f]||i;return r?n.createElement(y,c(c({ref:t},l),{},{components:r})):n.createElement(y,c({ref:t},l))}));function y(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,c=new Array(i);c[0]=f;var a={};for(var u in t)hasOwnProperty.call(t,u)&&(a[u]=t[u]);a.originalType=e,a[s]="string"==typeof e?e:o,c[1]=a;for(var p=2;p{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>c,default:()=>m,frontMatter:()=>i,metadata:()=>a,toc:()=>p});var n=r(87462),o=(r(67294),r(3905));const i={},c=void 0,a={unversionedId:"communication/jitsi",id:"communication/jitsi",title:"jitsi",description:"",source:"@site/community/communication/jitsi.md",sourceDirName:"communication",slug:"/communication/jitsi",permalink:"/community/communication/jitsi",draft:!1,tags:[],version:"current",frontMatter:{}},u={},p=[],l={toc:p},s="wrapper";function m(e){let{components:t,...r}=e;return(0,o.kt)(s,(0,n.Z)({},l,r,{components:t,mdxType:"MDXLayout"}))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/184e5ead.1c8c2a49.js b/assets/js/184e5ead.1c8c2a49.js new file mode 100644 index 0000000000..aa41f7529c --- /dev/null +++ b/assets/js/184e5ead.1c8c2a49.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4165],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>g});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function s(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var l=n.createContext({}),d=function(e){var t=n.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):s(s({},t),e)),a},c=function(e){var t=d(e.components);return n.createElement(l.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,l=e.parentName,c=o(e,["components","mdxType","originalType","parentName"]),p=d(a),m=r,g=p["".concat(l,".").concat(m)]||p[m]||u[m]||i;return a?n.createElement(g,s(s({ref:t},c),{},{components:a})):n.createElement(g,s({ref:t},c))}));function g(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,s=new Array(i);s[0]=m;var o={};for(var l in t)hasOwnProperty.call(t,l)&&(o[l]=t[l]);o.originalType=e,o[p]="string"==typeof e?e:r,s[1]=o;for(var d=2;d{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>u,frontMatter:()=>i,metadata:()=>o,toc:()=>d});var n=a(87462),r=(a(67294),a(3905));const i={},s="SCS-0102: Image Metadata",o={unversionedId:"iaas/scs-0102",id:"iaas/scs-0102",title:"SCS-0102: Image Metadata",description:"The SCS-0102 Image Metadata Standard outlines how to categorize and manage metadata for cloud-based operating system images to ensure usability and clarity. The standard encompasses naming conventions, technical requirements, image handling protocols including updating and origin, and licensing/support details. These guidelines ensure that users can understand, access, and utilize OS images effectively, with clear information on features, updates, and licensing provided through well-defined metadata properties.",source:"@site/standards/iaas/scs-0102.md",sourceDirName:"iaas",slug:"/iaas/scs-0102",permalink:"/standards/iaas/scs-0102",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"standards",previous:{title:"SCS Entropy",permalink:"/standards/scs-0101-v1-entropy"},next:{title:"SCS Image Metadata Standard",permalink:"/standards/scs-0102-v1-image-metadata"}},l={},d=[],c={toc:d},p="wrapper";function u(e){let{components:t,...a}=e;return(0,r.kt)(p,(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"scs-0102-image-metadata"},"SCS-0102: Image Metadata"),(0,r.kt)("p",null,"The SCS-0102 Image Metadata Standard outlines how to categorize and manage metadata for cloud-based operating system images to ensure usability and clarity. The standard encompasses naming conventions, technical requirements, image handling protocols including updating and origin, and licensing/support details. These guidelines ensure that users can understand, access, and utilize OS images effectively, with clear information on features, updates, and licensing provided through well-defined metadata properties."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Version"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"State"),(0,r.kt)("th",{parentName:"tr",align:null},"stabilized"),(0,r.kt)("th",{parentName:"tr",align:null},"obsoleted"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"/standards/scs-0102-v1-image-metadata"},"SCS-0102-v1")),(0,r.kt)("td",{parentName:"tr",align:null},"Standard"),(0,r.kt)("td",{parentName:"tr",align:null},"\ud83d\udfe2 Stable"),(0,r.kt)("td",{parentName:"tr",align:null},"2022-10-31"),(0,r.kt)("td",{parentName:"tr",align:null},"-")))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/19afbcc8.847c21ab.js b/assets/js/19afbcc8.847c21ab.js new file mode 100644 index 0000000000..bbe8db7512 --- /dev/null +++ b/assets/js/19afbcc8.847c21ab.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7039],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>v});var n=r(67294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var s=n.createContext({}),l=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},p=function(e){var t=l(e.components);return n.createElement(s.Provider,{value:t},e.children)},u="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,s=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),u=l(r),d=o,v=u["".concat(s,".").concat(d)]||u[d]||f[d]||i;return r?n.createElement(v,a(a({ref:t},p),{},{components:r})):n.createElement(v,a({ref:t},p))}));function v(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,a=new Array(i);a[0]=d;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c[u]="string"==typeof e?e:o,a[1]=c;for(var l=2;l{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>f,frontMatter:()=>i,metadata:()=>c,toc:()=>l});var n=r(87462),o=(r(67294),r(3905));const i={sidebar:1},a="Overview",c={unversionedId:"getting-started/overview",id:"getting-started/overview",title:"Overview",description:"TODO",source:"@site/docs/01-getting-started/overview.md",sourceDirName:"01-getting-started",slug:"/getting-started/overview",permalink:"/docs/getting-started/overview",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/01-getting-started/overview.md",tags:[],version:"current",frontMatter:{sidebar:1}},s={},l=[],p={toc:l},u="wrapper";function f(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"overview"},"Overview"),(0,o.kt)("p",null,"TODO"))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1a4e3797.9cf10c41.js b/assets/js/1a4e3797.9cf10c41.js new file mode 100644 index 0000000000..cfafb43ce3 --- /dev/null +++ b/assets/js/1a4e3797.9cf10c41.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7920],{88824:(e,t,r)=>{r.d(t,{c:()=>o});var a=r(67294),n=r(52263);const l=["zero","one","two","few","many","other"];function s(e){return l.filter((t=>e.includes(t)))}const c={locale:"en",pluralForms:s(["one","other"]),select:e=>1===e?"one":"other"};function u(){const{i18n:{currentLocale:e}}=(0,n.Z)();return(0,a.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:s(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),c}}),[e])}function o(){const e=u();return{selectMessage:(t,r)=>function(e,t,r){const a=e.split("|");if(1===a.length)return a[0];a.length>r.pluralForms.length&&console.error(`For locale=${r.locale}, a maximum of ${r.pluralForms.length} plural forms are expected (${r.pluralForms.join(",")}), but the message contains ${a.length}: ${e}`);const n=r.select(t),l=r.pluralForms.indexOf(n);return a[Math.min(l,a.length-1)]}(r,t,e)}}},51473:(e,t,r)=>{r.r(t),r.d(t,{default:()=>b});var a=r(67294),n=r(52263),l=r(70179),s=r(35742),c=r(39960),u=r(95999),o=r(88824),m=r(16550),h=r(10412);const i=function(){const e=(0,m.k6)(),t=(0,m.TH)(),{siteConfig:{baseUrl:r}}=(0,n.Z)(),a=h.Z.canUseDOM?new URLSearchParams(t.search):null,l=a?.get("q")||"",s=a?.get("ctx")||"",c=a?.get("version")||"",u=e=>{const r=new URLSearchParams(t.search);return e?r.set("q",e):r.delete("q"),r};return{searchValue:l,searchContext:s,searchVersion:c,updateSearchPath:t=>{const r=u(t);e.replace({search:r.toString()})},generateSearchPageLink:e=>{const t=u(e);return`${r}search?${t.toString()}`}}};var p=r(90022),g=r(98202),d=r(82539),f=r(10726),y=r(91073),E=r(80311),S=r(73926),I=r(61029);const R={searchQueryInput:"searchQueryInput_CFBF",searchResultItem:"searchResultItem_U687",searchResultItemPath:"searchResultItemPath_uIbk",searchResultItemSummary:"searchResultItemSummary_oZHr"};function w(){const{siteConfig:{baseUrl:e}}=(0,n.Z)(),{selectMessage:t}=(0,o.c)(),{searchValue:r,searchContext:l,searchVersion:c,updateSearchPath:m}=i(),[h,d]=(0,a.useState)(r),[f,y]=(0,a.useState)(),[S,I]=(0,a.useState)(),w=`${e}${c}`,b=(0,a.useMemo)((()=>h?(0,u.I)({id:"theme.SearchPage.existingResultsTitle",message:'Search results for "{query}"',description:"The search page title for non-empty query"},{query:h}):(0,u.I)({id:"theme.SearchPage.emptyResultsTitle",message:"Search the documentation",description:"The search page title for empty query"})),[h]);(0,a.useEffect)((()=>{m(h),f&&(h?f(h,(e=>{I(e)})):I(void 0))}),[h,f]);const v=(0,a.useCallback)((e=>{d(e.target.value)}),[]);return(0,a.useEffect)((()=>{r&&r!==h&&d(r)}),[r]),(0,a.useEffect)((()=>{!async function(){const{wrappedIndexes:e,zhDictionary:t}=await(0,p.w)(w,l);y((()=>(0,g.v)(e,t,100)))}()}),[l,w]),a.createElement(a.Fragment,null,a.createElement(s.Z,null,a.createElement("meta",{property:"robots",content:"noindex, follow"}),a.createElement("title",null,b)),a.createElement("div",{className:"container margin-vert--lg"},a.createElement("h1",null,b),a.createElement("input",{type:"search",name:"q",className:R.searchQueryInput,"aria-label":"Search",onChange:v,value:h,autoComplete:"off",autoFocus:!0}),!f&&h&&a.createElement("div",null,a.createElement(E.Z,null)),S&&(S.length>0?a.createElement("p",null,t(S.length,(0,u.I)({id:"theme.SearchPage.documentsFound.plurals",message:"1 document found|{count} documents found",description:'Pluralized label for "{count} documents found". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)'},{count:S.length}))):a.createElement("p",null,(0,u.I)({id:"theme.SearchPage.noResultsText",message:"No documents were found",description:"The paragraph for empty search result"}))),a.createElement("section",null,S&&S.map((e=>a.createElement(P,{key:e.document.i,searchResult:e}))))))}function P(e){let{searchResult:{document:t,type:r,page:n,tokens:l,metadata:s}}=e;const u=0===r,o=2===r,m=(u?t.b:n.b).slice(),h=o?t.s:t.t;u||m.push(n.t);let i="";if(I.vc&&l.length>0){const e=new URLSearchParams;for(const t of l)e.append("_highlight",t);i=`?${e.toString()}`}return a.createElement("article",{className:R.searchResultItem},a.createElement("h2",null,a.createElement(c.Z,{to:t.u+i+(t.h||""),dangerouslySetInnerHTML:{__html:o?(0,d.C)(h,l):(0,f.o)(h,(0,y.m)(s,"t"),l,100)}})),m.length>0&&a.createElement("p",{className:R.searchResultItemPath},(0,S.e)(m)),o&&a.createElement("p",{className:R.searchResultItemSummary,dangerouslySetInnerHTML:{__html:(0,f.o)(t.t,(0,y.m)(s,"t"),l,100)}}))}const b=function(){return a.createElement(l.Z,null,a.createElement(w,null))}}}]); \ No newline at end of file diff --git a/assets/js/1bc22123.4d28e76e.js b/assets/js/1bc22123.4d28e76e.js new file mode 100644 index 0000000000..c765d52546 --- /dev/null +++ b/assets/js/1bc22123.4d28e76e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7190],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>v});var n=r(67294);function s(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(s[r]=e[r]);return s}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(s[r]=e[r])}return s}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,s=e.mdxType,o=e.originalType,l=e.parentName,u=a(e,["components","mdxType","originalType","parentName"]),d=c(r),m=s,v=d["".concat(l,".").concat(m)]||d[m]||p[m]||o;return r?n.createElement(v,i(i({ref:t},u),{},{components:r})):n.createElement(v,i({ref:t},u))}));function v(e,t){var r=arguments,s=t&&t.mdxType;if("string"==typeof e||s){var o=r.length,i=new Array(o);i[0]=m;var a={};for(var l in t)hasOwnProperty.call(t,l)&&(a[l]=t[l]);a.originalType=e,a[d]="string"==typeof e?e:s,i[1]=a;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>p,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var n=r(87462),s=(r(67294),r(3905));const o={},i="Release Notes for SCS Release X",a={unversionedId:"releases/ReleaseX",id:"releases/ReleaseX",title:"Release Notes for SCS Release X",description:"This document is work in progress for the upcoming Release X.",source:"@site/docs/06-releases/ReleaseX.md",sourceDirName:"06-releases",slug:"/releases/ReleaseX",permalink:"/docs/releases/ReleaseX",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/06-releases/ReleaseX.md",tags:[],version:"current",frontMatter:{}},l={},c=[{value:"Scope",id:"scope",level:2},{value:"Component Versions and User-visible improvements (highlights)",id:"component-versions-and-user-visible-improvements-highlights",level:2},{value:"New Features (Highlights)",id:"new-features-highlights",level:2},{value:"Operator focused improvements",id:"operator-focused-improvements",level:3},{value:"SCS Developer focused improvements (testbed and k8s cluster management)",id:"scs-developer-focused-improvements-testbed-and-k8s-cluster-management",level:3},{value:"Upgrade/Migration notes",id:"upgrademigration-notes",level:2},{value:"Removals",id:"removals",level:2},{value:"Deprecations",id:"deprecations",level:2},{value:"Security Fixes",id:"security-fixes",level:2},{value:"Resolved Issues",id:"resolved-issues",level:2},{value:"Standards Conformance",id:"standards-conformance",level:2},{value:"Release Tagging",id:"release-tagging",level:2},{value:"List of known issues & restrictions in RX",id:"list-of-known-issues--restrictions-in-rx",level:2},{value:"Contributing",id:"contributing",level:2},{value:"Thanks",id:"thanks",level:2}],u={toc:c},d="wrapper";function p(e){let{components:t,...r}=e;return(0,s.kt)(d,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,s.kt)("h1",{id:"release-notes-for-scs-release-x"},"Release Notes for SCS Release X"),(0,s.kt)("p",null,"This document is work in progress for the upcoming Release X.\nRelease 4 will be released in .\nThis note will be removed, once Release X is released and these notes are valid."),(0,s.kt)("h2",{id:"scope"},"Scope"),(0,s.kt)("h2",{id:"component-versions-and-user-visible-improvements-highlights"},"Component Versions and User-visible improvements (highlights)"),(0,s.kt)("h2",{id:"new-features-highlights"},"New Features (Highlights)"),(0,s.kt)("h3",{id:"operator-focused-improvements"},"Operator focused improvements"),(0,s.kt)("h3",{id:"scs-developer-focused-improvements-testbed-and-k8s-cluster-management"},"SCS Developer focused improvements (testbed and k8s cluster management)"),(0,s.kt)("h2",{id:"upgrademigration-notes"},"Upgrade/Migration notes"),(0,s.kt)("h2",{id:"removals"},"Removals"),(0,s.kt)("h2",{id:"deprecations"},"Deprecations"),(0,s.kt)("h2",{id:"security-fixes"},"Security Fixes"),(0,s.kt)("h2",{id:"resolved-issues"},"Resolved Issues"),(0,s.kt)("h2",{id:"standards-conformance"},"Standards Conformance"),(0,s.kt)("h2",{id:"release-tagging"},"Release Tagging"),(0,s.kt)("h2",{id:"list-of-known-issues--restrictions-in-rx"},"List of known issues & restrictions in RX"),(0,s.kt)("h2",{id:"contributing"},"Contributing"),(0,s.kt)("p",null,"We appreciate contribution to strategy and implementation, please join\nour community -- or just leave input on the github issues and PRs.\nHave a look at our ",(0,s.kt)("a",{parentName:"p",href:"https://scs.community/contribute/"},"How to contribute page"),"."),(0,s.kt)("h2",{id:"thanks"},"Thanks"))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1be78505.c760445e.js b/assets/js/1be78505.c760445e.js new file mode 100644 index 0000000000..6ae9e5a0d5 --- /dev/null +++ b/assets/js/1be78505.c760445e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9514,4972],{19963:(e,t,n)=>{n.r(t),n.d(t,{default:()=>fe});var a=n(67294),l=n(86010),o=n(1944),r=n(35281),c=n(43320),i=n(53438),s=n(74477),d=n(1116),m=n(70179),u=n(95999),b=n(12466),p=n(85936);const h={backToTopButton:"backToTopButton_sjWU",backToTopButtonShow:"backToTopButtonShow_xfvO"};function E(){const{shown:e,scrollToTop:t}=function(e){let{threshold:t}=e;const[n,l]=(0,a.useState)(!1),o=(0,a.useRef)(!1),{startScroll:r,cancelScroll:c}=(0,b.Ct)();return(0,b.RF)(((e,n)=>{let{scrollY:a}=e;const r=n?.scrollY;r&&(o.current?o.current=!1:a>=r?(c(),l(!1)):a{e.location.hash&&(o.current=!0,l(!1))})),{shown:n,scrollToTop:()=>r(0)}}({threshold:300});return a.createElement("button",{"aria-label":(0,u.I)({id:"theme.BackToTopButton.buttonAriaLabel",message:"Scroll back to top",description:"The ARIA label for the back to top button"}),className:(0,l.Z)("clean-btn",r.k.common.backToTopButton,h.backToTopButton,e&&h.backToTopButtonShow),type:"button",onClick:t})}var g=n(91442),f=n(16550),k=n(87524),v=n(86668),_=n(21327),C=n(87462);function S(e){return a.createElement("svg",(0,C.Z)({width:"20",height:"20","aria-hidden":"true"},e),a.createElement("g",{fill:"#7a7a7a"},a.createElement("path",{d:"M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"}),a.createElement("path",{d:"M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"})))}const I={collapseSidebarButton:"collapseSidebarButton_PEFL",collapseSidebarButtonIcon:"collapseSidebarButtonIcon_kv0_"};function N(e){let{onClick:t}=e;return a.createElement("button",{type:"button",title:(0,u.I)({id:"theme.docs.sidebar.collapseButtonTitle",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),"aria-label":(0,u.I)({id:"theme.docs.sidebar.collapseButtonAriaLabel",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),className:(0,l.Z)("button button--secondary button--outline",I.collapseSidebarButton),onClick:t},a.createElement(S,{className:I.collapseSidebarButtonIcon}))}var T=n(59689),Z=n(902);const x=Symbol("EmptyContext"),B=a.createContext(x);function y(e){let{children:t}=e;const[n,l]=(0,a.useState)(null),o=(0,a.useMemo)((()=>({expandedItem:n,setExpandedItem:l})),[n]);return a.createElement(B.Provider,{value:o},t)}var w=n(86043),L=n(48596),A=n(39960),M=n(72389);function F(e){let{categoryLabel:t,onClick:n}=e;return a.createElement("button",{"aria-label":(0,u.I)({id:"theme.DocSidebarItem.toggleCollapsedCategoryAriaLabel",message:"Toggle the collapsible sidebar category '{label}'",description:"The ARIA label to toggle the collapsible sidebar category"},{label:t}),type:"button",className:"clean-btn menu__caret",onClick:n})}function H(e){let{item:t,onItemClick:n,activePath:o,level:c,index:s,...d}=e;const{items:m,label:u,collapsible:b,className:p,href:h}=t,{docs:{sidebar:{autoCollapseCategories:E}}}=(0,v.L)(),g=function(e){const t=(0,M.Z)();return(0,a.useMemo)((()=>e.href?e.href:!t&&e.collapsible?(0,i.Wl)(e):void 0),[e,t])}(t),f=(0,i._F)(t,o),k=(0,L.Mg)(h,o),{collapsed:_,setCollapsed:S}=(0,w.u)({initialState:()=>!!b&&(!f&&t.collapsed)}),{expandedItem:I,setExpandedItem:N}=function(){const e=(0,a.useContext)(B);if(e===x)throw new Z.i6("DocSidebarItemsExpandedStateProvider");return e}(),T=function(e){void 0===e&&(e=!_),N(e?null:s),S(e)};return function(e){let{isActive:t,collapsed:n,updateCollapsed:l}=e;const o=(0,Z.D9)(t);(0,a.useEffect)((()=>{t&&!o&&n&&l(!1)}),[t,o,n,l])}({isActive:f,collapsed:_,updateCollapsed:T}),(0,a.useEffect)((()=>{b&&null!=I&&I!==s&&E&&S(!0)}),[b,I,s,S,E]),a.createElement("li",{className:(0,l.Z)(r.k.docs.docSidebarItemCategory,r.k.docs.docSidebarItemCategoryLevel(c),"menu__list-item",{"menu__list-item--collapsed":_},p)},a.createElement("div",{className:(0,l.Z)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":k})},a.createElement(A.Z,(0,C.Z)({className:(0,l.Z)("menu__link",{"menu__link--sublist":b,"menu__link--sublist-caret":!h&&b,"menu__link--active":f}),onClick:b?e=>{n?.(t),h?T(!1):(e.preventDefault(),T())}:()=>{n?.(t)},"aria-current":k?"page":void 0,"aria-expanded":b?!_:void 0,href:b?g??"#":g},d),u),h&&b&&a.createElement(F,{categoryLabel:u,onClick:e=>{e.preventDefault(),T()}})),a.createElement(w.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:_},a.createElement(j,{items:m,tabIndex:_?-1:0,onItemClick:n,activePath:o,level:c+1})))}var P=n(13919),W=n(39471);const D={menuExternalLink:"menuExternalLink_NmtK"};function R(e){let{item:t,onItemClick:n,activePath:o,level:c,index:s,...d}=e;const{href:m,label:u,className:b,autoAddBaseUrl:p}=t,h=(0,i._F)(t,o),E=(0,P.Z)(m);return a.createElement("li",{className:(0,l.Z)(r.k.docs.docSidebarItemLink,r.k.docs.docSidebarItemLinkLevel(c),"menu__list-item",b),key:u},a.createElement(A.Z,(0,C.Z)({className:(0,l.Z)("menu__link",!E&&D.menuExternalLink,{"menu__link--active":h}),autoAddBaseUrl:p,"aria-current":h?"page":void 0,to:m},E&&{onClick:n?()=>n(t):void 0},d),u,!E&&a.createElement(W.Z,null)))}const V={menuHtmlItem:"menuHtmlItem_M9Kj"};function U(e){let{item:t,level:n,index:o}=e;const{value:c,defaultStyle:i,className:s}=t;return a.createElement("li",{className:(0,l.Z)(r.k.docs.docSidebarItemLink,r.k.docs.docSidebarItemLinkLevel(n),i&&[V.menuHtmlItem,"menu__list-item"],s),key:o,dangerouslySetInnerHTML:{__html:c}})}function z(e){let{item:t,...n}=e;switch(t.type){case"category":return a.createElement(H,(0,C.Z)({item:t},n));case"html":return a.createElement(U,(0,C.Z)({item:t},n));default:return a.createElement(R,(0,C.Z)({item:t},n))}}function K(e){let{items:t,...n}=e;return a.createElement(y,null,t.map(((e,t)=>a.createElement(z,(0,C.Z)({key:t,item:e,index:t},n)))))}const j=(0,a.memo)(K),G={menu:"menu_SIkG",menuWithAnnouncementBar:"menuWithAnnouncementBar_GW3s"};function Y(e){let{path:t,sidebar:n,className:o}=e;const c=function(){const{isActive:e}=(0,T.nT)(),[t,n]=(0,a.useState)(e);return(0,b.RF)((t=>{let{scrollY:a}=t;e&&n(0===a)}),[e]),e&&t}();return a.createElement("nav",{"aria-label":(0,u.I)({id:"theme.docs.sidebar.navAriaLabel",message:"Docs sidebar",description:"The ARIA label for the sidebar navigation"}),className:(0,l.Z)("menu thin-scrollbar",G.menu,c&&G.menuWithAnnouncementBar,o)},a.createElement("ul",{className:(0,l.Z)(r.k.docs.docSidebarMenu,"menu__list")},a.createElement(j,{items:n,activePath:t,level:1})))}const q="sidebar_njMd",O="sidebarWithHideableNavbar_wUlq",X="sidebarHidden_VK0M",J="sidebarLogo_isFc";function Q(e){let{path:t,sidebar:n,onCollapse:o,isHidden:r}=e;const{navbar:{hideOnScroll:c},docs:{sidebar:{hideable:i}}}=(0,v.L)();return a.createElement("div",{className:(0,l.Z)(q,c&&O,r&&X)},c&&a.createElement(_.Z,{tabIndex:-1,className:J}),a.createElement(Y,{path:t,sidebar:n}),i&&a.createElement(N,{onClick:o}))}const $=a.memo(Q);var ee=n(13102),te=n(93163);const ne=e=>{let{sidebar:t,path:n}=e;const o=(0,te.e)();return a.createElement("ul",{className:(0,l.Z)(r.k.docs.docSidebarMenu,"menu__list")},a.createElement(j,{items:t,activePath:n,onItemClick:e=>{"category"===e.type&&e.href&&o.toggle(),"link"===e.type&&o.toggle()},level:1}))};function ae(e){return a.createElement(ee.Zo,{component:ne,props:e})}const le=a.memo(ae);function oe(e){const t=(0,k.i)(),n="desktop"===t||"ssr"===t,l="mobile"===t;return a.createElement(a.Fragment,null,n&&a.createElement($,e),l&&a.createElement(le,e))}const re={expandButton:"expandButton_m80_",expandButtonIcon:"expandButtonIcon_BlDH"};function ce(e){let{toggleSidebar:t}=e;return a.createElement("div",{className:re.expandButton,title:(0,u.I)({id:"theme.docs.sidebar.expandButtonTitle",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),"aria-label":(0,u.I)({id:"theme.docs.sidebar.expandButtonAriaLabel",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),tabIndex:0,role:"button",onKeyDown:t,onClick:t},a.createElement(S,{className:re.expandButtonIcon}))}const ie={docSidebarContainer:"docSidebarContainer_b6E3",docSidebarContainerHidden:"docSidebarContainerHidden_b3ry",sidebarViewport:"sidebarViewport_Xe31"};function se(e){let{children:t}=e;const n=(0,d.V)();return a.createElement(a.Fragment,{key:n?.name??"noSidebar"},t)}function de(e){let{sidebar:t,hiddenSidebarContainer:n,setHiddenSidebarContainer:o}=e;const{pathname:c}=(0,f.TH)(),[i,s]=(0,a.useState)(!1),d=(0,a.useCallback)((()=>{i&&s(!1),!i&&(0,g.n)()&&s(!0),o((e=>!e))}),[o,i]);return a.createElement("aside",{className:(0,l.Z)(r.k.docs.docSidebarContainer,ie.docSidebarContainer,n&&ie.docSidebarContainerHidden),onTransitionEnd:e=>{e.currentTarget.classList.contains(ie.docSidebarContainer)&&n&&s(!0)}},a.createElement(se,null,a.createElement("div",{className:(0,l.Z)(ie.sidebarViewport,i&&ie.sidebarViewportHidden)},a.createElement(oe,{sidebar:t,path:c,onCollapse:d,isHidden:i}),i&&a.createElement(ce,{toggleSidebar:d}))))}const me={docMainContainer:"docMainContainer_gTbr",docMainContainerEnhanced:"docMainContainerEnhanced_Uz_u",docItemWrapperEnhanced:"docItemWrapperEnhanced_czyv"};function ue(e){let{hiddenSidebarContainer:t,children:n}=e;const o=(0,d.V)();return a.createElement("main",{className:(0,l.Z)(me.docMainContainer,(t||!o)&&me.docMainContainerEnhanced)},a.createElement("div",{className:(0,l.Z)("container padding-top--md padding-bottom--lg",me.docItemWrapper,t&&me.docItemWrapperEnhanced)},n))}const be={docPage:"docPage__5DB",docsWrapper:"docsWrapper_BCFX","themedComponent--light":"themedComponent--light_NU7w"};function pe(e){let{children:t}=e;const n=(0,d.V)(),[l,o]=(0,a.useState)(!1);return a.createElement(m.Z,{wrapperClassName:be.docsWrapper},a.createElement(E,null),a.createElement("div",{className:be.docPage},n&&a.createElement(de,{sidebar:n.items,hiddenSidebarContainer:l,setHiddenSidebarContainer:o}),a.createElement(ue,{hiddenSidebarContainer:l},t)))}var he=n(4972),Ee=n(90197);function ge(e){const{versionMetadata:t}=e;return a.createElement(a.Fragment,null,a.createElement(Ee.Z,{version:t.version,tag:(0,c.os)(t.pluginId,t.version)}),a.createElement(o.d,null,t.noIndex&&a.createElement("meta",{name:"robots",content:"noindex, nofollow"})))}function fe(e){const{versionMetadata:t}=e,n=(0,i.hI)(e);if(!n)return a.createElement(he.default,null);const{docElement:c,sidebarName:m,sidebarItems:u}=n;return a.createElement(a.Fragment,null,a.createElement(ge,e),a.createElement(o.FG,{className:(0,l.Z)(r.k.wrapper.docsPages,r.k.page.docsDocPage,e.versionMetadata.className)},a.createElement(s.q,{version:t},a.createElement(d.b,{name:m,items:u},a.createElement(pe,null,c)))))}},4972:(e,t,n)=>{n.r(t),n.d(t,{default:()=>c});var a=n(67294),l=n(95999),o=n(1944),r=n(70179);function c(){return a.createElement(a.Fragment,null,a.createElement(o.d,{title:(0,l.I)({id:"theme.NotFound.title",message:"Page Not Found"})}),a.createElement(r.Z,null,a.createElement("main",{className:"container margin-vert--xl"},a.createElement("div",{className:"row"},a.createElement("div",{className:"col col--6 col--offset-3"},a.createElement("h1",{className:"hero__title"},a.createElement(l.Z,{id:"theme.NotFound.title",description:"The title of the 404 page"},"Page Not Found")),a.createElement("p",null,a.createElement(l.Z,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page"},"We could not find what you were looking for.")),a.createElement("p",null,a.createElement(l.Z,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page"},"Please contact the owner of the site that linked you to the original URL and let them know their link is broken.")))))))}}}]); \ No newline at end of file diff --git a/assets/js/1c091541.8267c1b7.js b/assets/js/1c091541.8267c1b7.js new file mode 100644 index 0000000000..bf579cdb65 --- /dev/null +++ b/assets/js/1c091541.8267c1b7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8271],{24469:s=>{s.exports=JSON.parse('{"name":"docusaurus-plugin-content-blog","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/1c894279.6c35e1a4.js b/assets/js/1c894279.6c35e1a4.js new file mode 100644 index 0000000000..f6d81ead7f --- /dev/null +++ b/assets/js/1c894279.6c35e1a4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6336],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>h});var a=n(67294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var d=a.createContext({}),s=function(e){var t=a.useContext(d),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=s(e.components);return a.createElement(d.Provider,{value:t},e.children)},c="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,i=e.mdxType,r=e.originalType,d=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),c=s(n),m=i,h=c["".concat(d,".").concat(m)]||c[m]||u[m]||r;return n?a.createElement(h,o(o({ref:t},p),{},{components:n})):a.createElement(h,o({ref:t},p))}));function h(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var r=n.length,o=new Array(r);o[0]=m;var l={};for(var d in t)hasOwnProperty.call(t,d)&&(l[d]=t[d]);l.originalType=e,l[c]="string"==typeof e?e:i,o[1]=l;for(var s=2;s{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>o,default:()=>u,frontMatter:()=>r,metadata:()=>l,toc:()=>s});var a=n(87462),i=(n(67294),n(3905));const r={title:"Sovereign Cloud Standards",type:"Procedural",status:"Stable",track:"Global",stabilized_at:new Date("2022-11-28T00:00:00.000Z")},o=void 0,l={unversionedId:"scs-0001-v1-sovereign-cloud-standards",id:"scs-0001-v1-sovereign-cloud-standards",title:"Sovereign Cloud Standards",description:"Introduction",source:"@site/standards/scs-0001-v1-sovereign-cloud-standards.md",sourceDirName:".",slug:"/scs-0001-v1-sovereign-cloud-standards",permalink:"/standards/scs-0001-v1-sovereign-cloud-standards",draft:!1,tags:[],version:"current",frontMatter:{title:"Sovereign Cloud Standards",type:"Procedural",status:"Stable",track:"Global",stabilized_at:"2022-11-28T00:00:00.000Z"},sidebar:"standards",previous:{title:"SCS-0001: SCS Standards",permalink:"/standards/global/scs-0001"},next:{title:"SCS-0002: Org & Docs Standards",permalink:"/standards/global/scs-0002"}},d={},s=[{value:"Introduction",id:"introduction",level:2},{value:"Requirements",id:"requirements",level:2},{value:"Sovereign Cloud Standard documents",id:"sovereign-cloud-standard-documents",level:2},{value:"Types of documents",id:"types-of-documents",level:3},{value:"Procedural",id:"procedural",level:4},{value:"Standard",id:"standard",level:4},{value:"Decision Record",id:"decision-record",level:4},{value:"Document format",id:"document-format",level:3},{value:"Sections",id:"sections",level:3},{value:"Process",id:"process",level:2},{value:"Proposal phase",id:"proposal-phase",level:3},{value:"Proposal of a new document",id:"proposal-of-a-new-document",level:4},{value:"Proposal of a major update to a stable document",id:"proposal-of-a-major-update-to-a-stable-document",level:4},{value:"Development phase (Draft)",id:"development-phase-draft",level:3},{value:"Stabilized phase (Stable)",id:"stabilized-phase-stable",level:3},{value:"Deprecation phase (Deprecated)",id:"deprecation-phase-deprecated",level:3},{value:"Rejection",id:"rejection",level:3},{value:"Open Questions",id:"open-questions",level:2},{value:"Stabilization criteria",id:"stabilization-criteria",level:3},{value:"Breaking change criteria",id:"breaking-change-criteria",level:3},{value:"Design Considerations",id:"design-considerations",level:2},{value:"Versioning",id:"versioning",level:3},{value:"Acknowledgements",id:"acknowledgements",level:2}],p={toc:s},c="wrapper";function u(e){let{components:t,...n}=e;return(0,i.kt)(c,(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"introduction"},"Introduction"),(0,i.kt)("p",null,"The ",(0,i.kt)("a",{parentName:"p",href:"https://scs.community"},"Sovereign Cloud Stack (SCS)")," provides standards\nfor a range of cloud infrastructure types.\nIt strives for interoperable and sovereign cloud stacks\nwhich can be deployed and used by a wide range of organizations and individuals.\nWherever feasible,\ntransparency and openness both in respect to the inner workings of the platforms standardised by SCS,\nas well as the SCS organisation itself\nare a paradigm we intend to live."),(0,i.kt)("h2",{id:"requirements"},"Requirements"),(0,i.kt)("p",null,'The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in ',(0,i.kt)("a",{parentName:"p",href:"https://datatracker.ietf.org/doc/html/rfc2119"},"RFC 2119"),"."),(0,i.kt)("p",null,'In addition, "FORBIDDEN" is to be interpreted equivalent to "MUST NOT".'),(0,i.kt)("h2",{id:"sovereign-cloud-standard-documents"},"Sovereign Cloud Standard documents"),(0,i.kt)("p",null,"One of the main products of the SCS organisation are Sovereign Cloud Standard documents."),(0,i.kt)("h3",{id:"types-of-documents"},"Types of documents"),(0,i.kt)("h4",{id:"procedural"},"Procedural"),(0,i.kt)("p",null,"A procedural SCS document describes a process, a policy or a guideline\nto which the SCS community adheres."),(0,i.kt)("h4",{id:"standard"},"Standard"),(0,i.kt)("p",null,"A standard SCS document describes a technical standard for SCS compliant clouds.\nNote that it may not be necessary for all clouds to implement all standards."),(0,i.kt)("h4",{id:"decision-record"},"Decision Record"),(0,i.kt)("p",null,"Sometimes during the development of the SCS standard,\na complex technical decision needs to be taken,\nwhich does not directly result in a new standard."),(0,i.kt)("p",null,"The SCS document format formally integrates\nthe documentation of such decisions\nas documents of type ",(0,i.kt)("inlineCode",{parentName:"p"},"Decision Record"),"."),(0,i.kt)("h3",{id:"document-format"},"Document format"),(0,i.kt)("p",null,"The SCS documents are provided in GitHub flavored markdown.\nEach document is assigned a unique number.\nTo disambiguate with other organisations using similar schemes\n(such as XEPs, PEPs or IETF RFCs),\nthe numbers are prefixed with ",(0,i.kt)("inlineCode",{parentName:"p"},"SCS-"),"."),(0,i.kt)("p",null,"To allow a concept to evolve while allowing breaking changes,\neach SCS document is associated with a major version number.\nThis major version number is a positive number\nand the numbering starts at one for each document."),(0,i.kt)("p",null,"In order to make organisation of the SCS documents easier,\neach document also has a slugified title.\nThe slugified title MUST NOT be changed after the acceptance of the document into the repository,\nas it is part of its canonical URL.\nIt MUST consist only of lower-case ASCII letters, numbers and hyphens.\nIt MUST NOT start with a hyphen and SHOULD start with a lower-case letter.\nIt SHOULD NOT contain more than one subsequent hyphen."),(0,i.kt)("p",null,"The file name of an SCS document is formed using the following pattern:\n",(0,i.kt)("inlineCode",{parentName:"p"},"scs-XXXX-vN-T.md"),", where\n",(0,i.kt)("inlineCode",{parentName:"p"},"XXXX")," is replaced with the zero-padded document number,\n",(0,i.kt)("inlineCode",{parentName:"p"},"N")," is replaced with the major version of the document, and\n",(0,i.kt)("inlineCode",{parentName:"p"},"T")," is replaced with the slugified title.\nFor a document with the number 190, with a major version number 2 and a slugified title ",(0,i.kt)("inlineCode",{parentName:"p"},"flavor-naming"),",\nthe resulting file name would be ",(0,i.kt)("inlineCode",{parentName:"p"},"scs-0190-v2-flavor-naming.md"),"."),(0,i.kt)("p",null,"The second digit in ",(0,i.kt)("inlineCode",{parentName:"p"},"XXXX")," describes the track where the document belongs:"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Track"),(0,i.kt)("th",{parentName:"tr",align:null},"Number"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"Global"),(0,i.kt)("td",{parentName:"tr",align:null},"0")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"IaaS"),(0,i.kt)("td",{parentName:"tr",align:null},"1")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"KaaS"),(0,i.kt)("td",{parentName:"tr",align:null},"2")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"IAM"),(0,i.kt)("td",{parentName:"tr",align:null},"3")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"Ops"),(0,i.kt)("td",{parentName:"tr",align:null},"4")))),(0,i.kt)("p",null,"In addition to the number, each document has the following metadata,\nembedded in the markdown header."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Field name"),(0,i.kt)("th",{parentName:"tr",align:null},"Requirement"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"type")),(0,i.kt)("td",{parentName:"tr",align:null},"REQUIRED"),(0,i.kt)("td",{parentName:"tr",align:null},"one of ",(0,i.kt)("inlineCode",{parentName:"td"},"Procedural"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"Standard"),", or ",(0,i.kt)("inlineCode",{parentName:"td"},"Decision Record"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"status")),(0,i.kt)("td",{parentName:"tr",align:null},"REQUIRED"),(0,i.kt)("td",{parentName:"tr",align:null},"one of ",(0,i.kt)("inlineCode",{parentName:"td"},"Proposal"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"Draft"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"Stable"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"Deprecated"),", or ",(0,i.kt)("inlineCode",{parentName:"td"},"Rejected"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"track")),(0,i.kt)("td",{parentName:"tr",align:null},"REQUIRED"),(0,i.kt)("td",{parentName:"tr",align:null},"one of ",(0,i.kt)("inlineCode",{parentName:"td"},"Global"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"IaaS"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"KaaS"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"IAM"),", ",(0,i.kt)("inlineCode",{parentName:"td"},"Ops"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"obsoleted_at")),(0,i.kt)("td",{parentName:"tr",align:null},"REQUIRED if ",(0,i.kt)("inlineCode",{parentName:"td"},"status")," is ",(0,i.kt)("inlineCode",{parentName:"td"},"Deprecated")),(0,i.kt)("td",{parentName:"tr",align:null},"ISO formatted date indicating the date after which the deprecation is in effect")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"stabilized_at")),(0,i.kt)("td",{parentName:"tr",align:null},"REQUIRED if ",(0,i.kt)("inlineCode",{parentName:"td"},"status")," was ever ",(0,i.kt)("inlineCode",{parentName:"td"},"Stable")),(0,i.kt)("td",{parentName:"tr",align:null},"ISO formatted date indicating the date after which the document was considered stable")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"rejected_at")),(0,i.kt)("td",{parentName:"tr",align:null},"REQUIRED if ",(0,i.kt)("inlineCode",{parentName:"td"},"status")," is ",(0,i.kt)("inlineCode",{parentName:"td"},"Rejected")),(0,i.kt)("td",{parentName:"tr",align:null},"ISO formatted date indicating the date on which the document was rejected")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"replaced_by")),(0,i.kt)("td",{parentName:"tr",align:null},"RECOMMENDED if ",(0,i.kt)("inlineCode",{parentName:"td"},"status")," is ",(0,i.kt)("inlineCode",{parentName:"td"},"Deprecated")," or ",(0,i.kt)("inlineCode",{parentName:"td"},"Rejected"),", FORBIDDEN otherwise"),(0,i.kt)("td",{parentName:"tr",align:null},"List of documents which replace this document.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"replaces")),(0,i.kt)("td",{parentName:"tr",align:null},"OPTIONAL"),(0,i.kt)("td",{parentName:"tr",align:null},"List of documents which this document replaces.")))),(0,i.kt)("h3",{id:"sections"},"Sections"),(0,i.kt)("p",null,"Each document SHOULD have the following sections:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"An ",(0,i.kt)("em",{parentName:"li"},"Introduction")," providing context on the document and linking to other relevant materials."),(0,i.kt)("li",{parentName:"ul"},"A ",(0,i.kt)("em",{parentName:"li"},"Motivation")," section which details why this document or the thing it describes is necessary.")),(0,i.kt)("p",null,"In addition, the following OPTIONAL sections should be considered:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"A ",(0,i.kt)("em",{parentName:"li"},"Design Considerations")," section for Standard type documents,\nwhich details other choices\nwhich have been considered for the specific feature\nbut were ultimately rejected."),(0,i.kt)("li",{parentName:"ul"},"An ",(0,i.kt)("em",{parentName:"li"},"Open Questions"),' section which links to issues\ndetailing any open discussion points with respect to a document.\nThis section is RECOMMENDED during the discussion phase (pre 1.0.0)\nas a "table of contents" of things to work on in that context.'),(0,i.kt)("li",{parentName:"ul"},"A ",(0,i.kt)("em",{parentName:"li"},"Related Documents")," section which references related Standards\nor Decisions, both upstream and/or other SCS documents."),(0,i.kt)("li",{parentName:"ul"},"A ",(0,i.kt)("em",{parentName:"li"},"Conformance Tests")," section that contains hints on how to validate\nconformance with this spec, ideally links to conformance test cases.")),(0,i.kt)("h2",{id:"process"},"Process"),(0,i.kt)("p",null,"The lifecycle of an SCS document goes through the following phases:\nProposal, Draft, Stable, Deprecated, and Rejected."),(0,i.kt)("mermaid",{value:"graph TD\n A[Proposal] --\x3e|Pull Request| B[Draft]\n B --\x3e|Pull Request| D[Stable]\n B --\x3e|Pull Request| E[Rejected]\n D --\x3e|Pull Request| F[Deprecated]"}),(0,i.kt)("p",null,"All decisions for phase transitions follow loose consensus,\nwhere the group which has to form the consensus depends on the ",(0,i.kt)("inlineCode",{parentName:"p"},"track")," of the document:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"IaaS: The team working on infrastructure-as-a-service topics"),(0,i.kt)("li",{parentName:"ul"},"KaaS: The team working on Kubernetes-as-a-service topics"),(0,i.kt)("li",{parentName:"ul"},"Ops: The team working on operations topics"),(0,i.kt)("li",{parentName:"ul"},"IAM: The team working on identity and access management topics"),(0,i.kt)("li",{parentName:"ul"},"Global: The entire SCS community")),(0,i.kt)("h3",{id:"proposal-phase"},"Proposal phase"),(0,i.kt)("h4",{id:"proposal-of-a-new-document"},"Proposal of a new document"),(0,i.kt)("p",null,"To propose a new SCS document,\na community participant creates a pull request on GitHub\nagainst the ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards"},"standards repository in the SovereignCloudStack organisation"),"."),(0,i.kt)("p",null,"The pull request MUST add exactly one SCS document,\nin the ",(0,i.kt)("inlineCode",{parentName:"p"},"Standards")," folder.\nIn the proposal phase,\nthe document number MUST be replaced with ",(0,i.kt)("inlineCode",{parentName:"p"},"xxxx")," in the file name.\nThe major version MUST be 1."),(0,i.kt)("p",null,"For a document with a slugified title ",(0,i.kt)("inlineCode",{parentName:"p"},"flavor-naming"),",\nthe file name would for instance be ",(0,i.kt)("inlineCode",{parentName:"p"},"scs-xxxx-v1-flavor-naming.md"),"."),(0,i.kt)("p",null,"The metadata MUST indicate the intended ",(0,i.kt)("inlineCode",{parentName:"p"},"track")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"type")," of the document,\nand the ",(0,i.kt)("inlineCode",{parentName:"p"},"status")," MUST be set to ",(0,i.kt)("inlineCode",{parentName:"p"},"Proposal"),"."),(0,i.kt)("p",null,"Upon acceptance by the group of people identified by the ",(0,i.kt)("inlineCode",{parentName:"p"},"track"),",\na number is assigned\n(the next unused number)\nand the proposer is asked\nto rename the file to replace the ",(0,i.kt)("inlineCode",{parentName:"p"},"xxxx")," with that number."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Note:"),"\nDocuments on the ",(0,i.kt)("inlineCode",{parentName:"p"},"Design Record")," track MAY be proposed or accepted directly into ",(0,i.kt)("inlineCode",{parentName:"p"},"Stable")," state,\nif no further discussion is required."),(0,i.kt)("p",null,"Hereafter,\nthe pull request can be merged\nand henceforth the document is an official SCS document in ",(0,i.kt)("inlineCode",{parentName:"p"},"Draft")," state."),(0,i.kt)("h4",{id:"proposal-of-a-major-update-to-a-stable-document"},"Proposal of a major update to a stable document"),(0,i.kt)("p",null,"To propose major update to a Stable SCS document,\na community participant creates a pull request on GitHub\nagainst the ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards"},"standards repository in the SovereignCloudStack organisation"),"."),(0,i.kt)("p",null,"The pull request MUST add exactly one SCS document,\nin the ",(0,i.kt)("inlineCode",{parentName:"p"},"Standards")," folder.\nThe document number MUST be the same as the document it is updating,\nand the major version number MUST be incremented by 1.\nThe slugified title MAY be changed."),(0,i.kt)("p",null,"It MUST refer to the old document in its ",(0,i.kt)("inlineCode",{parentName:"p"},"replaces")," metadata.\nThe pull request SHOULD NOT modify the previous document;\ndeprecation of the previous document\nas well as adding the ",(0,i.kt)("inlineCode",{parentName:"p"},"replaced_by")," metadata is a separate step,\nand can only be executed once the new document is ",(0,i.kt)("inlineCode",{parentName:"p"},"Stable"),"."),(0,i.kt)("p",null,"For a document updating a hypothetical SCS-0390-v3 document,\nthe file name may be ",(0,i.kt)("inlineCode",{parentName:"p"},"scs-0390-v4-flavor-naming-this-time-its-serious.md"),"."),(0,i.kt)("p",null,"Other than the file naming difference,\nthe proposal process is the same as for new documents.\nIn particular, the new document starts out in ",(0,i.kt)("inlineCode",{parentName:"p"},"Draft")," state\nand does not automatically become part of the normative corpus of an SCS release."),(0,i.kt)("h3",{id:"development-phase-draft"},"Development phase (Draft)"),(0,i.kt)("p",null,"In this phase,\nthe document is developed inside the SCS community."),(0,i.kt)("p",null,"It should not be considered to be normative for any SCS release,\neven if an SCS release happens after the acceptance of the document."),(0,i.kt)("p",null,"Experimental and exploratory implementations are encouraged,\nhowever, implementors must be prepared for breaking changes."),(0,i.kt)("p",null,"Changes to the documents are gated through pull requests."),(0,i.kt)("h3",{id:"stabilized-phase-stable"},"Stabilized phase (Stable)"),(0,i.kt)("p",null,"Once the document is deemed ready for production use,\nits ",(0,i.kt)("inlineCode",{parentName:"p"},"status")," is changed to ",(0,i.kt)("inlineCode",{parentName:"p"},"Stable"),"."),(0,i.kt)("p",null,"After stabilization,\nchanges to the document which may render existing implementations non-conformant\nMUST NOT be made."),(0,i.kt)("p",null,"If a breaking change to an existing SCS document is deemed necessary,\na new document with a new number shall be created\nand the old document SHOULD be deprecated."),(0,i.kt)("h3",{id:"deprecation-phase-deprecated"},"Deprecation phase (Deprecated)"),(0,i.kt)("p",null,"Should a document become obsolete,\nit can be deprecated."),(0,i.kt)("p",null,"Obsoletions SHOULD be announced ahead of their execution by setting the\n",(0,i.kt)("inlineCode",{parentName:"p"},"deprecated_at")," field to a future date and moving the ",(0,i.kt)("inlineCode",{parentName:"p"},"status")," to ",(0,i.kt)("inlineCode",{parentName:"p"},"Deprecated"),".\nThis signals current and future implementors\nthat the subject matter of the document\nis not considered necessary or state of the art anymore."),(0,i.kt)("p",null,"If one or more replacement documents for the document exists,\nit MUST be listed in the ",(0,i.kt)("inlineCode",{parentName:"p"},"replaced_by")," metadata field."),(0,i.kt)("h3",{id:"rejection"},"Rejection"),(0,i.kt)("p",null,"If a document is removed from the normative corpus of SCS standards,\nits status is changed to ",(0,i.kt)("inlineCode",{parentName:"p"},"Rejected"),"."),(0,i.kt)("p",null,"If one or more replacement documents for the document exists,\nit MUST be listed in the ",(0,i.kt)("inlineCode",{parentName:"p"},"replaced_by")," metadata field."),(0,i.kt)("h2",{id:"open-questions"},"Open Questions"),(0,i.kt)("h3",{id:"stabilization-criteria"},"Stabilization criteria"),(0,i.kt)("p",null,"When should a document be stabilized?\nShould we require at least one public implementation?\nShould we require a minimum experimental time?\nWhat about non-Standard track documents?"),(0,i.kt)("h3",{id:"breaking-change-criteria"},"Breaking change criteria"),(0,i.kt)("p",null,'When is a change breaking and cannot be applied to a Stable document?\nWhat about previously undefined behaviour (uncovered edge case)?\nWhat about ambiguous wording?\nDo we need a separate "Errata" section?'),(0,i.kt)("h2",{id:"design-considerations"},"Design Considerations"),(0,i.kt)("h3",{id:"versioning"},"Versioning"),(0,i.kt)("p",null,"An alternative to the proposed scheme for stabilization\nis the use of ",(0,i.kt)("a",{parentName:"p",href:"https://semver.org/"},"SemVer-like")," versioning."),(0,i.kt)("p",null,"In that case, one would have an individual version number with each document,\nwhere a major version greater than zero indicates a stable document.\nThe ",(0,i.kt)("inlineCode",{parentName:"p"},"Stable")," state would be merged with ",(0,i.kt)("inlineCode",{parentName:"p"},"Draft")," state into an ",(0,i.kt)("em",{parentName:"p"},"Active")," state\nand shared between the stabilized and the development phase."),(0,i.kt)("p",null,"The advantages of such an approach are:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"It is easy to recognize whether an SCS document has changed between two SCS\nreleases, just by looking at the released version number."),(0,i.kt)("li",{parentName:"ul"},"It is possible to make breaking changes after stabilization by increasing the\nmajor version number.")),(0,i.kt)("p",null,"The disadvantages of that approach are:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"It is possible to make breaking changes after stabilization.\nPotentially, an hypothetical SCS-1234 document might refer to something completely different\nin a hypothetical R15 release than what it meant in R5,\nif there have been sufficient, gradual breaking changes to the document."),(0,i.kt)("p",{parentName:"li"},"That means that for proper linking,\nit would be required to always include the major version number\nwhen referring to an SCS document."),(0,i.kt)("p",{parentName:"li"},'This implies having to keep all former versions around in a canonical, linkable form.\nThis induces non-trivial organizational and editorial overhead\nand raises questions around which changes are acceptable to "archived" versions,\nif any.')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"It would require a clone of the SemVer spec,\nas that spec is highly specific toward software\nand does not fully\n(at least not in the standard-as-written)\ncover specifics of a standards organisation's use-cases."))),(0,i.kt)("h2",{id:"acknowledgements"},"Acknowledgements"),(0,i.kt)("p",null,"This document is heavily inspired by ",(0,i.kt)("a",{parentName:"p",href:"https://xmpp.org/extensions/xep-0001.html"},"XEP-0001"),", as published by the XMPP Standards Foundation."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1df93b7f.975423cf.js b/assets/js/1df93b7f.975423cf.js new file mode 100644 index 0000000000..89d8fc0c78 --- /dev/null +++ b/assets/js/1df93b7f.975423cf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3237],{83874:(e,t,a)=>{a.r(t),a.d(t,{default:()=>m});var o=a(67294),r=a(39960),n=(a(52263),a(70179));const l={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN",gradient:"gradient_lQw6",marg:"marg_HODB"},c="card_N5DL",s=e=>{const{title:t,body:a,url:n,buttonText:l,maxHeight:s}=e;return o.createElement("div",{className:`${s&&c} card`},o.createElement("div",{className:"card__header"},o.createElement("h3",null,t)),o.createElement("div",{className:"card__body"},o.createElement("p",null,a)),o.createElement("div",{className:"card__footer"},o.createElement(r.Z,{className:"button button--secondary button--lg",to:n},l)))},i=[{title:"Introduction to SCS",body:"Get to know SCS better and learn about the background.",url:"/docs",buttonText:"Get Started"},{title:"Releases",body:"SCS is currently in Release 5. Check out the latest Release Notes.",url:"/docs/releases/Release5",buttonText:"Learn More"},{title:"Frequently Asked Questions",body:"You are curious what SCS is all about, what it can do and what it cant?",url:"/docs/faq",buttonText:"Get Answers"},{title:"Existing Public Clouds",body:"There are public SCS compliant clouds in production.",url:"/standards/certification/overview#compliant-cloud-environments",buttonText:"Test Them"}],d=[{title:"Get in touch",body:"Come into our Matrix Chat in the SCS | Tech Room.",url:"https://matrix.to/#/#scs-tech:matrix.org",buttonText:"Join Now"},{title:"Come to our Meet-Ups",body:"Our working groups and special interest groups meet weekly or biweekly. When? Find out within our public community calendar.",url:"/community/calendar",buttonText:"Learn More"},{title:"Standardization in progress",body:"Get to know our current Decision Records and Standards.",url:"/standards",buttonText:"Start Now"},{title:"Deployment Examples",body:"Get to know different ways to deploy SCS with cloud resources or on bare metal.",url:"/docs/iaas/guides/deploy-guide/examples",buttonText:"Explore Cases"}];function m(){return o.createElement(n.Z,{description:"Documentation and Community Platform for the Sovereign Cloud Stack"},o.createElement("main",null,o.createElement("div",{className:"container"},o.createElement("div",{className:"row",style:{marginTop:"2rem"}},o.createElement("div",{className:"col col--12"},o.createElement("h1",null,"Welcome to the SCS Documentation"),o.createElement("p",null,"Find user guides, code samples, deployment examples, reference, community pages and more."))),o.createElement("div",{className:"row"},i.map(((e,t)=>o.createElement("div",{className:"col col--3",key:t},o.createElement(s,{maxHeight:!0,title:e.title,body:e.body,url:e.url,buttonText:e.buttonText}))))),o.createElement("div",{className:"row",style:{marginTop:"3rem"}},o.createElement("div",{className:"col col--12"},o.createElement("h1",null,"Architectural Layers")),o.createElement("div",{className:`${l.gradient} row`},o.createElement("div",{className:"col col--3"},o.createElement(s,{maxHeight:!0,title:"Ops Layer",body:"Tooling and infrastructure design for easy, efficient and transparent ways to operate an SCS Cloud.",buttonText:"Learn More",url:"/docs/category/operating-scs"})),o.createElement("div",{className:"col col--6"},o.createElement("div",{style:{marginBottom:"3rem"}},o.createElement(s,{title:"Container Layer",body:"SCS offers a robust solution for managing container workloads on a Kubernetes infrastructure.",buttonText:"Learn More",url:"/docs/container",maxHeight:!0})),o.createElement(s,{title:"IaaS Layer",body:"SCS offers OpenStack infrastructure solutions based on KVM virutalization to deploy VM workloads and enabling the container layer optionally.",buttonText:"Learn More",url:"/docs/category/iaas-layer"})),o.createElement("div",{className:"col col--3"},o.createElement(s,{maxHeight:!0,title:"IAM Layer",body:"Working on Keycloak federated identity provider within our Team IAM.",buttonText:"Learn More",url:"/docs/category/identity-and-access-management-iam"})))),o.createElement("div",{className:"row",style:{marginTop:"3rem"}},o.createElement("div",{className:"col col--12"},o.createElement("h1",null,"Additional Resources"))),o.createElement("div",{className:"row",style:{marginBottom:"5rem"}},d.map(((e,t)=>o.createElement("div",{className:"col col--3",key:t},o.createElement(s,{maxHeight:!0,title:e.title,body:e.body,url:e.url,buttonText:e.buttonText}))))))))}}}]); \ No newline at end of file diff --git a/assets/js/1f1274a0.26037ab8.js b/assets/js/1f1274a0.26037ab8.js new file mode 100644 index 0000000000..9c29dee866 --- /dev/null +++ b/assets/js/1f1274a0.26037ab8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3454],{3905:(e,n,t)=>{t.d(n,{Zo:()=>c,kt:()=>k});var r=t(67294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function p(e){for(var n=1;n=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var l=r.createContext({}),s=function(e){var n=r.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):p(p({},n),e)),t},c=function(e){var n=s(e.components);return r.createElement(l.Provider,{value:n},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},y=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,c=o(e,["components","mdxType","originalType","parentName"]),d=s(t),y=a,k=d["".concat(l,".").concat(y)]||d[y]||m[y]||i;return t?r.createElement(k,p(p({ref:n},c),{},{components:t})):r.createElement(k,p({ref:n},c))}));function k(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var i=t.length,p=new Array(i);p[0]=y;var o={};for(var l in n)hasOwnProperty.call(n,l)&&(o[l]=n[l]);o.originalType=e,o[d]="string"==typeof e?e:a,p[1]=o;for(var s=2;s{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>p,default:()=>m,frontMatter:()=>i,metadata:()=>o,toc:()=>s});var r=t(87462),a=(t(67294),t(3905));const i={sidebar_label:"Ceph",sidebar_position:50},p="Ceph",o={unversionedId:"iaas/guides/deploy-guide/services/ceph",id:"iaas/guides/deploy-guide/services/ceph",title:"Ceph",description:"1. Deploy base services.",source:"@site/docs/02-iaas/guides/deploy-guide/services/ceph.md",sourceDirName:"02-iaas/guides/deploy-guide/services",slug:"/iaas/guides/deploy-guide/services/ceph",permalink:"/docs/iaas/guides/deploy-guide/services/ceph",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/deploy-guide/services/ceph.md",tags:[],version:"current",sidebarPosition:50,frontMatter:{sidebar_label:"Ceph",sidebar_position:50},sidebar:"docs",previous:{title:"Logging & Monitoring",permalink:"/docs/iaas/guides/deploy-guide/services/logging-monitoring"},next:{title:"OpenStack",permalink:"/docs/iaas/guides/deploy-guide/services/openstack"}},l={},s=[{value:"RGW service",id:"rgw-service",level:2}],c={toc:s},d="wrapper";function m(e){let{components:n,...t}=e;return(0,a.kt)(d,(0,r.Z)({},c,t,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"ceph"},"Ceph"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"Deploy base services."),(0,a.kt)("pre",{parentName:"li"},(0,a.kt)("code",{parentName:"pre"},"osism apply ceph-mons\nosism apply ceph-mgrs\nosism apply ceph-osds\nosism apply ceph-crash\n")),(0,a.kt)("p",{parentName:"li"},"It's all done here step by step. It is also possible to do this in a single step:"),(0,a.kt)("pre",{parentName:"li"},(0,a.kt)("code",{parentName:"pre"},"osism apply ceph-base\n"))),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"Get ceph keys. This places the necessary keys in ",(0,a.kt)("inlineCode",{parentName:"p"},"/opt/configuration"),"."),(0,a.kt)("pre",{parentName:"li"},(0,a.kt)("code",{parentName:"pre"},"osism apply copy-ceph-keys\n")),(0,a.kt)("p",{parentName:"li"},"After run, these keys must be permanently added to the configuration repository\nvia Git."),(0,a.kt)("pre",{parentName:"li"},(0,a.kt)("code",{parentName:"pre"},"environments/infrastructure/files/ceph/ceph.client.admin.keyring\nenvironments/kolla/files/overlays/gnocchi/ceph.client.gnocchi.keyring\nenvironments/kolla/files/overlays/nova/ceph.client.cinder.keyring\nenvironments/kolla/files/overlays/nova/ceph.client.nova.keyring\nenvironments/kolla/files/overlays/cinder/cinder-backup/ceph.client.cinder.keyring\nenvironments/kolla/files/overlays/cinder/cinder-backup/ceph.client.cinder-backup.keyring\nenvironments/kolla/files/overlays/cinder/cinder-volume/ceph.client.cinder.keyring\nenvironments/kolla/files/overlays/manila/ceph.client.manila.keyring\nenvironments/kolla/files/overlays/glance/ceph.client.glance.keyring\n")),(0,a.kt)("p",{parentName:"li"},"If the ",(0,a.kt)("inlineCode",{parentName:"p"},"osism apply copy-ceph-keys")," fails and the keys are not found in the ",(0,a.kt)("inlineCode",{parentName:"p"},"/share"),"\ndirectory, this can be solved with ",(0,a.kt)("inlineCode",{parentName:"p"},"osism apply ceph-fetch-keys"),".")),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"After the Ceph keys have been persisted in the configuration repository, the Ceph\nclient can be deployed."),(0,a.kt)("pre",{parentName:"li"},(0,a.kt)("code",{parentName:"pre"},"osism apply cephclient\n")))),(0,a.kt)("h2",{id:"rgw-service"},"RGW service"),(0,a.kt)("p",null,"Deployment of the Ceph RGW Service is optional. How the Ceph RGW service can be deployed\nand integrated into OpenStack is described here."),(0,a.kt)("admonition",{type:"info"},(0,a.kt)("p",{parentName:"admonition"},"If an initial deployment is performed and Ceph RGW is not added to an existing deployment,\nsteps 4 and 5 are ",(0,a.kt)("strong",{parentName:"p"},"not")," required. Step 3 is then performed ",(0,a.kt)("strong",{parentName:"p"},"later")," after the OpenStack\nKeystone service has been deployed.")),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},(0,a.kt)("a",{parentName:"p",href:"./../../configuration-guide/ceph#rgw-service"},"Configure the RGW service"))),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"Apply role ",(0,a.kt)("inlineCode",{parentName:"p"},"ceph-rgws")," to deploy the Ceph RGW services."),(0,a.kt)("pre",{parentName:"li"},(0,a.kt)("code",{parentName:"pre"},"osism apply ceph-rgws\n"))),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"Apply role ",(0,a.kt)("inlineCode",{parentName:"p"},"kolla-ceph-rgw")," to add the OpenStack endpoint."),(0,a.kt)("pre",{parentName:"li"},(0,a.kt)("code",{parentName:"pre"},"osism apply kolla-ceph-rgw\n"))),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"Apply role ",(0,a.kt)("inlineCode",{parentName:"p"},"loadbalancer")," to add the HAProxy backend and frontend."),(0,a.kt)("pre",{parentName:"li"},(0,a.kt)("code",{parentName:"pre"},"osism apply loadbalancer\n"))),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"Apply role ",(0,a.kt)("inlineCode",{parentName:"p"},"horizon")," to enable the Swift dashboard."),(0,a.kt)("pre",{parentName:"li"},(0,a.kt)("code",{parentName:"pre"},"osism apply horizon\n")))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1f34ee25.36ef8ed2.js b/assets/js/1f34ee25.36ef8ed2.js new file mode 100644 index 0000000000..a6cad010a2 --- /dev/null +++ b/assets/js/1f34ee25.36ef8ed2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8049],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>v});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=n.createContext({}),l=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):c(c({},t),e)),r},u=function(e){var t=l(e.components);return n.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=l(r),m=a,v=p["".concat(s,".").concat(m)]||p[m]||d[m]||o;return r?n.createElement(v,c(c({ref:t},u),{},{components:r})):n.createElement(v,c({ref:t},u))}));function v(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,c=new Array(o);c[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[p]="string"==typeof e?e:a,c[1]=i;for(var l=2;l{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>c,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>l});var n=r(87462),a=(r(67294),r(3905));const o={title:"Getting Started with Wavestack",version:new Date("2023-03-02T00:00:00.000Z"),author:"Linus Walther"},c=void 0,i={unversionedId:"cloud-resources/wavestack",id:"cloud-resources/wavestack",title:"Getting Started with Wavestack",description:"Getting Started with Wavestack",source:"@site/community/cloud-resources/wavestack.md",sourceDirName:"cloud-resources",slug:"/cloud-resources/wavestack",permalink:"/community/cloud-resources/wavestack",draft:!1,tags:[],version:"current",frontMatter:{title:"Getting Started with Wavestack",version:"2023-03-02T00:00:00.000Z",author:"Linus Walther"},sidebar:"community",previous:{title:"Getting Started Gaia-X Demonstrator @ plusserver",permalink:"/community/cloud-resources/plusserver-gx-scs"},next:{title:"Branch Protection Rules",permalink:"/community/github/branchprotection"}},s={},l=[{value:"Getting Started with Wavestack",id:"getting-started-with-wavestack",level:2},{value:"URLs for access",id:"urls-for-access",level:2},{value:"Authentication (UI)",id:"authentication-ui",level:2},{value:"OpenStackClient (CLI)",id:"openstackclient-cli",level:2}],u={toc:l},p="wrapper";function d(e){let{components:t,...r}=e;return(0,a.kt)(p,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"getting-started-with-wavestack"},"Getting Started with Wavestack"),(0,a.kt)("h2",{id:"urls-for-access"},"URLs for access"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"UI (Horizon): ",(0,a.kt)("a",{parentName:"li",href:"https://dashboard.wavestack.de/"},"https://dashboard.wavestack.de/")),(0,a.kt)("li",{parentName:"ul"},"API auth url (Keystone): ",(0,a.kt)("a",{parentName:"li",href:"https://api.wavestack.de:5000"},"https://api.wavestack.de:5000")),(0,a.kt)("li",{parentName:"ul"},"Object Storage endpoint (S3/SWIFT): ",(0,a.kt)("a",{parentName:"li",href:"https://rgw.muc5.wavestack.de:443"},"https://rgw.muc5.wavestack.de:443"))),(0,a.kt)("h2",{id:"authentication-ui"},"Authentication (UI)"),(0,a.kt)("p",null,"For your login you will need:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Username"),(0,a.kt)("li",{parentName:"ul"},"Password"),(0,a.kt)("li",{parentName:"ul"},"Domain")),(0,a.kt)("h2",{id:"openstackclient-cli"},"OpenStackClient (CLI)"),(0,a.kt)("p",null,"See: ",(0,a.kt)("a",{parentName:"p",href:"/community/cloud-resources/getting-started-openstack"},"Getting Started with OpenStack")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2163574d.81ce3d02.js b/assets/js/2163574d.81ce3d02.js new file mode 100644 index 0000000000..440a87e7c5 --- /dev/null +++ b/assets/js/2163574d.81ce3d02.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3907],{83295:e=>{e.exports=JSON.parse('{"title":"Components","slug":"/category/components-2","permalink":"/docs/category/components-2","navigation":{"previous":{"title":"Operating SCS","permalink":"/docs/category/operating-scs"},"next":{"title":"Status Page API","permalink":"/docs/category/status-page-api"}}}')}}]); \ No newline at end of file diff --git a/assets/js/23cd166f.4301e5b2.js b/assets/js/23cd166f.4301e5b2.js new file mode 100644 index 0000000000..630f6b2c26 --- /dev/null +++ b/assets/js/23cd166f.4301e5b2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6490],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>f});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function c(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),l=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},u=function(e){var t=l(e.components);return r.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=l(n),m=a,f=p["".concat(s,".").concat(m)]||p[m]||d[m]||o;return n?r.createElement(f,c(c({ref:t},u),{},{components:n})):r.createElement(f,c({ref:t},u))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,c=new Array(o);c[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[p]="string"==typeof e?e:a,c[1]=i;for(var l=2;l{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>c,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>l});var r=n(87462),a=(n(67294),n(3905));const o={},c="Create a new cluster",i={unversionedId:"container/components/k8s-cluster-api-provider/doc/usage/create-new-cluster",id:"container/components/k8s-cluster-api-provider/doc/usage/create-new-cluster",title:"Create a new cluster",description:"On the management server (login with make ssh), create a directory (below the home of",source:"@site/docs/03-container/components/k8s-cluster-api-provider/doc/usage/create-new-cluster.md",sourceDirName:"03-container/components/k8s-cluster-api-provider/doc/usage",slug:"/container/components/k8s-cluster-api-provider/doc/usage/create-new-cluster",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/usage/create-new-cluster",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/03-container/components/k8s-cluster-api-provider/doc/usage/create-new-cluster.md",tags:[],version:"current",frontMatter:{},sidebar:"docs",previous:{title:"Usage",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/usage/"},next:{title:"Managing many clusters",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/usage/managing-many-clusters"}},s={},l=[],u={toc:l},p="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(p,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"create-a-new-cluster"},"Create a new cluster"),(0,a.kt)("p",null,"On the management server (login with ",(0,a.kt)("inlineCode",{parentName:"p"},"make ssh"),"), create a directory (below the home of\nthe standard ubuntu user) with the name of your cluster. Copy over ",(0,a.kt)("inlineCode",{parentName:"p"},"clusterctl.yaml")," from\n",(0,a.kt)("inlineCode",{parentName:"p"},"~/cluster-defaults/")," and edit it according to your needs. You can also copy over other\nfiles from ",(0,a.kt)("inlineCode",{parentName:"p"},"~/cluster-defaults/")," and adjust them, but this is only needed in exceptional\ncases.\nNow run ",(0,a.kt)("inlineCode",{parentName:"p"},"create_cluster.sh ")),(0,a.kt)("p",null,"This will copy all missing defaults from ",(0,a.kt)("inlineCode",{parentName:"p"},"~/cluster-defaults/")," into the directory with your\ncluster name and then ask cluster-api to create the cluster. The scripts also take\ncare of security groups, anti-affinity, node image registration (if needed) and\nof deploying CCM, CNI, CSI as well as optional services such as metrics or nginx-ingress\ncontroller."),(0,a.kt)("p",null,"You can access the new cluster with ",(0,a.kt)("inlineCode",{parentName:"p"},"kubectl --context clustername-admin@cluster"),"\nor ",(0,a.kt)("inlineCode",{parentName:"p"},"KUBECONFIG=~/clustername/clustername.yaml kubectl"),"."),(0,a.kt)("p",null,"The management cluster is in context ",(0,a.kt)("inlineCode",{parentName:"p"},"kind-kind"),"."),(0,a.kt)("p",null,"Note that you can always change ",(0,a.kt)("inlineCode",{parentName:"p"},"clusterctl.yaml")," and re-run ",(0,a.kt)("inlineCode",{parentName:"p"},"create_cluster.sh"),". The script is idempotent and running\nit multiple times with the unchanged input file will result in no changes to the cluster."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/23e62f09.0000ff74.js b/assets/js/23e62f09.0000ff74.js new file mode 100644 index 0000000000..c03edf4aa7 --- /dev/null +++ b/assets/js/23e62f09.0000ff74.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8428],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>m});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var d=r.createContext({}),l=function(e){var t=r.useContext(d),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},c=function(e){var t=l(e.components);return r.createElement(d.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},f=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,d=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=l(n),f=a,m=u["".concat(d,".").concat(f)]||u[f]||p[f]||i;return n?r.createElement(m,o(o({ref:t},c),{},{components:n})):r.createElement(m,o({ref:t},c))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,o=new Array(i);o[0]=f;var s={};for(var d in t)hasOwnProperty.call(t,d)&&(s[d]=t[d]);s.originalType=e,s[u]="string"==typeof e?e:a,o[1]=s;for(var l=2;l{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>s,toc:()=>l});var r=n(87462),a=(n(67294),n(3905));const i={},o="SCS-0300: SSO Identity Federation",s={unversionedId:"iam/scs-0300",id:"iam/scs-0300",title:"SCS-0300: SSO Identity Federation",description:"The SCS-0300 standard outlines requirements for Single Sign-On (SSO) identity federation within the Sovereign Cloud Stack (SCS). It addresses the need for customers to access SCS services using credentials stored and managed externally, facilitating user onboarding and reducing the need for additional dedicated SCS accounts. The standard focuses on delegating authentication to external identity providers and mapping users to roles within SCS for authorization, while also considering the use of machine identities. Keycloak is the current choice as an Identity Provider (IdP) for its support of OAuth 2.0 grants and its integration with OpenStack and kolla-ansible.",source:"@site/standards/iam/scs-0300.md",sourceDirName:"iam",slug:"/iam/scs-0300",permalink:"/standards/iam/scs-0300",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"standards",previous:{title:"IAM Standards",permalink:"/standards/iam/"},next:{title:"Requirements for SSO identity federation",permalink:"/standards/scs-0300-v1-requirements-for-sso-identity-federation"}},d={},l=[],c={toc:l},u="wrapper";function p(e){let{components:t,...n}=e;return(0,a.kt)(u,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"scs-0300-sso-identity-federation"},"SCS-0300: SSO Identity Federation"),(0,a.kt)("p",null,"The SCS-0300 standard outlines requirements for Single Sign-On (SSO) identity federation within the Sovereign Cloud Stack (SCS). It addresses the need for customers to access SCS services using credentials stored and managed externally, facilitating user onboarding and reducing the need for additional dedicated SCS accounts. The standard focuses on delegating authentication to external identity providers and mapping users to roles within SCS for authorization, while also considering the use of machine identities. Keycloak is the current choice as an Identity Provider (IdP) for its support of OAuth 2.0 grants and its integration with OpenStack and kolla-ansible."),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Version"),(0,a.kt)("th",{parentName:"tr",align:null},"Type"),(0,a.kt)("th",{parentName:"tr",align:null},"State"),(0,a.kt)("th",{parentName:"tr",align:null},"stabilized"),(0,a.kt)("th",{parentName:"tr",align:null},"obsoleted"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("a",{parentName:"td",href:"/standards/scs-0300-v1-requirements-for-sso-identity-federation"},"SCS-0300-v1")),(0,a.kt)("td",{parentName:"tr",align:null},"Standard"),(0,a.kt)("td",{parentName:"tr",align:null},"\ud83d\udfe2 Stable"),(0,a.kt)("td",{parentName:"tr",align:null},"2023-06-21"),(0,a.kt)("td",{parentName:"tr",align:null},"-")))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/247783bb.49d074f5.js b/assets/js/247783bb.49d074f5.js new file mode 100644 index 0000000000..f8f6d59316 --- /dev/null +++ b/assets/js/247783bb.49d074f5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9334],{83769:s=>{s.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/24fca748.05fabdc8.js b/assets/js/24fca748.05fabdc8.js new file mode 100644 index 0000000000..9b9895f7e8 --- /dev/null +++ b/assets/js/24fca748.05fabdc8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[788],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>m});var o=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var c=o.createContext({}),l=function(e){var t=o.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=l(e.components);return o.createElement(c.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},f=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,c=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=l(n),f=r,m=d["".concat(c,".").concat(f)]||d[f]||u[f]||a;return n?o.createElement(m,i(i({ref:t},p),{},{components:n})):o.createElement(m,i({ref:t},p))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=f;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[d]="string"==typeof e?e:r,i[1]=s;for(var l=2;l{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var o=n(87462),r=(n(67294),n(3905));const a={title:"Identity Federation in SCS",type:null,status:"Draft",track:"Global"},i=void 0,s={unversionedId:"operations/iam/identity-federation-in-scs",id:"operations/iam/identity-federation-in-scs",title:"Identity Federation in SCS",description:"SovereignCloudStack wants to make it possible for operators to delegate",source:"@site/dev-docs/operations/iam/identity-federation-in-scs.md",sourceDirName:"operations/iam",slug:"/operations/iam/identity-federation-in-scs",permalink:"/dev-docs/operations/iam/identity-federation-in-scs",draft:!1,tags:[],version:"current",frontMatter:{title:"Identity Federation in SCS",type:null,status:"Draft",track:"Global"},sidebar:"devDocs",previous:{title:"Documentation for SCS Developers",permalink:"/dev-docs/"},next:{title:"OpenStack Federation via OpenID-Connect",permalink:"/dev-docs/operations/iam/openstack-federation-via-oidc"}},c={},l=[{value:"1. IaaS / OpenStack",id:"1-iaas--openstack",level:2},{value:"2. CaaS",id:"2-caas",level:2}],p={toc:l},d="wrapper";function u(e){let{components:t,...n}=e;return(0,r.kt)(d,(0,o.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"SovereignCloudStack wants to make it possible for operators to delegate\nadministration of user identities to the organizational entities that the\nusers are part of. Usually that's customer organizations but it could also\nbe the operator itself. Federation protocols like OpenID Connect can be used\nto achieve that goal. To simplify connecting the different parts of SCS\nto customer owned IAM solutions, SCS deploys Keycloak as central Identity\nProvider (IdP) service."),(0,r.kt)("p",null,"Currently this is deployed automatically only in the ",(0,r.kt)("a",{parentName:"p",href:"https://docs.scs.community/docs/iaas/guides/deploy-guide/examples/testbed/"},"osism/testbed"),",\nwhich provides ",(0,r.kt)("a",{parentName:"p",href:"https://docs.scs.community/docs/iaas/guides/deploy-guide/examples/testbed#authentication-with-oidc"},"its own documentation for authentication with OIDC"),"."),(0,r.kt)("p",null,"The following sections describe how this is done."),(0,r.kt)("h2",{id:"1-iaas--openstack"},"1. IaaS / OpenStack"),(0,r.kt)("p",null,"To provide Infrastrucure as a Service SCS builds upon\nOpenStack. See section ",(0,r.kt)("a",{parentName:"p",href:"https://docs.scs.community/dev-docs/operations/iam/openstack-federation-via-oidc"},"OpenStack Federation via OpenID-Connect"),"\nfor more details on identity federation for OpenStack."),(0,r.kt)("h2",{id:"2-caas"},"2. CaaS"),(0,r.kt)("p",null,"To provide Container as a Service SCS builds upon\nKubernetes. There is\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/issues/issues/373"},"work in progress"),"\nto optionally connect Kubernetes to Keycloak and to\nmap authorization decisions based on claims via cluster role bindings."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/26bc5a46.56d13ab6.js b/assets/js/26bc5a46.56d13ab6.js new file mode 100644 index 0000000000..8d26f5f8b2 --- /dev/null +++ b/assets/js/26bc5a46.56d13ab6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9478],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>k});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var d=n.createContext({}),s=function(e){var t=n.useContext(d),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},c=function(e){var t=s(e.components);return n.createElement(d.Provider,{value:t},e.children)},l="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},p=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,d=e.parentName,c=u(e,["components","mdxType","originalType","parentName"]),l=s(a),p=r,k=l["".concat(d,".").concat(p)]||l[p]||m[p]||o;return a?n.createElement(k,i(i({ref:t},c),{},{components:a})):n.createElement(k,i({ref:t},c))}));function k(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,i=new Array(o);i[0]=p;var u={};for(var d in t)hasOwnProperty.call(t,d)&&(u[d]=t[d]);u.originalType=e,u[l]="string"==typeof e?e:r,i[1]=u;for(var s=2;s{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>u,toc:()=>s});var n=a(87462),r=(a(67294),a(3905));const o={sidebar_label:"Docker",sidebar_position:20},i="Docker",u={unversionedId:"iaas/guides/upgrade-guide/docker",id:"iaas/guides/upgrade-guide/docker",title:"Docker",description:"The Docker version used is defined via the parameter docker_version in the file",source:"@site/docs/02-iaas/guides/upgrade-guide/docker.md",sourceDirName:"02-iaas/guides/upgrade-guide",slug:"/iaas/guides/upgrade-guide/docker",permalink:"/docs/iaas/guides/upgrade-guide/docker",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/upgrade-guide/docker.md",tags:[],version:"current",sidebarPosition:20,frontMatter:{sidebar_label:"Docker",sidebar_position:20},sidebar:"docs",previous:{title:"Ceph",permalink:"/docs/iaas/guides/upgrade-guide/ceph"},next:{title:"Infrastructure",permalink:"/docs/iaas/guides/upgrade-guide/infrastructure"}},d={},s=[{value:"Restart behaviour",id:"restart-behaviour",level:2}],c={toc:s},l="wrapper";function m(e){let{components:t,...a}=e;return(0,r.kt)(l,(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"docker"},"Docker"),(0,r.kt)("p",null,"The Docker version used is defined via the parameter ",(0,r.kt)("inlineCode",{parentName:"p"},"docker_version")," in the file\n",(0,r.kt)("inlineCode",{parentName:"p"},"environments/configuration.yml"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},"docker_version: '5:20.10.24'\n")),(0,r.kt)("p",null,"All installable versions can be displayed with ",(0,r.kt)("inlineCode",{parentName:"p"},"apt-cache madison docker-ce"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ apt-cache madison docker-ce\n docker-ce | 5:24.0.6-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages\n docker-ce | 5:24.0.5-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages\n docker-ce | 5:24.0.4-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages\n docker-ce | 5:24.0.3-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages\n docker-ce | 5:24.0.2-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages\n docker-ce | 5:24.0.1-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages\n docker-ce | 5:24.0.0-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages\n docker-ce | 5:23.0.6-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages\n docker-ce | 5:23.0.5-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages\n docker-ce | 5:23.0.4-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages\n docker-ce | 5:23.0.3-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages\n docker-ce | 5:23.0.2-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages\n docker-ce | 5:23.0.1-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages\n docker-ce | 5:23.0.0-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages\n docker-ce | 5:20.10.24~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages\n docker-ce | 5:20.10.23~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages\n docker-ce | 5:20.10.22~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages\n docker-ce | 5:20.10.21~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages\n docker-ce | 5:20.10.20~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages\n docker-ce | 5:20.10.19~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages\n docker-ce | 5:20.10.18~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages\n docker-ce | 5:20.10.17~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages\n docker-ce | 5:20.10.16~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages\n docker-ce | 5:20.10.15~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages\n docker-ce | 5:20.10.14~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages\n docker-ce | 5:20.10.13~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages\n")),(0,r.kt)("p",null,"If, for example, you want to change the Docker version from ",(0,r.kt)("inlineCode",{parentName:"p"},"20.10.24")," to ",(0,r.kt)("inlineCode",{parentName:"p"},"24.0.6"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"docker_version")," in\n",(0,r.kt)("inlineCode",{parentName:"p"},"environments/configuration.yml")," is changed accordingly. The ",(0,r.kt)("inlineCode",{parentName:"p"},"5:")," prefix is placed in front of the version. Commit and push the changes to your configuration repository afterwards."),(0,r.kt)("p",null,"The upgrade of Docker is then done with the OSISM CLI. Docker on the manager itself is updated differently.\nThis does not work on the manager itself because the Docker service may be started during the upgrade and\nindividual containers may be started as a result. This would interrupt the run of the role itself."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"osism apply docker -l 'docker:!manager'\n")),(0,r.kt)("p",null,"By default, ",(0,r.kt)("inlineCode",{parentName:"p"},"serial")," is set to ",(0,r.kt)("inlineCode",{parentName:"p"},"1")," so that the the hosts are upgrade one after the other.\nTo adjust this, either use the ",(0,r.kt)("inlineCode",{parentName:"p"},"osism_serial")," dictionary in the ",(0,r.kt)("inlineCode",{parentName:"p"},"environments/configuration.yml")," file\nto change the value in ",(0,r.kt)("inlineCode",{parentName:"p"},"docker")," or append ",(0,r.kt)("inlineCode",{parentName:"p"},"-e serial=10%")," to upgrade, for example, 10%\nwith each iteration."),(0,r.kt)("p",null,"Please note that it is not a good idea to upgrade more than one Docker service at a time.\nThis can lead to anomalies, especially on storage nodes and control nodes. It is recommended\nnot to change the default of 1."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},"osism_serial:\n docker: 10%\n")),(0,r.kt)("p",null,"On the manager itself, the ",(0,r.kt)("inlineCode",{parentName:"p"},"run.sh")," script in the manager environment of the configuration must\ncurrently be used to upgrade the Docker service. In a future release a dedicated ",(0,r.kt)("inlineCode",{parentName:"p"},"osism update docker"),"\ncommand will be available for this purpose."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"cd /opt/configuration/environments/manager\nANSIBLE_ASK_VAULT_PASS=True ./run.sh docker\n")),(0,r.kt)("h2",{id:"restart-behaviour"},"Restart behaviour"),(0,r.kt)("p",null,"When upgrading, the Docker service is restarted. As a result, it can come to a restart of the\nrunning containers. This can lead to interruptions in individual services. A change in\n",(0,r.kt)("inlineCode",{parentName:"p"},"/etc/docker/daemon.json")," due to a new configuration parameter etc. can also result in a\nrequired restart."),(0,r.kt)("p",null,"Whether the containers are restarted when the Docker Service is restarted depends on whether the\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.docker.com/config/containers/live-restore/"},"Live Restore feature")," is used.\nThis can be configured via the parameter ",(0,r.kt)("inlineCode",{parentName:"p"},"docker_live_restore"),". Live restore is enabled by default."),(0,r.kt)("p",null,"It is important to set the ",(0,r.kt)("inlineCode",{parentName:"p"},"docker_live_restore")," parameter explicitly as a string. This means\n",(0,r.kt)("inlineCode",{parentName:"p"},'docker_live_restore: "false"')," or ",(0,r.kt)("inlineCode",{parentName:"p"},'docker_live_restore: "true"'),"."),(0,r.kt)("p",null,"But even if the Live Restore feature is enabled, certain upgrades will cause running containers\nto be restarted:"),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Live restore allows you to keep containers running across Docker daemon updates, but is only\nsupported when installing patch releases (",(0,r.kt)("inlineCode",{parentName:"p"},"YY.MM.x"),"), not for major (",(0,r.kt)("inlineCode",{parentName:"p"},"YY.MM"),") daemon upgrades.")),(0,r.kt)("p",null,"There are two ways to prevent a restart of the Docker service during an upgrade."),(0,r.kt)("p",null,"If the restart behaviour of the Docker service is changed, always make sure to restart the\nDocker service manually afterwards (e.g. by a system reboot)."),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"A host group can be defined via the parameter ",(0,r.kt)("inlineCode",{parentName:"p"},"docker_ignore_restart_groupname"),". The\nrestart of the Docker service is not triggered for all hosts in this group. By default,\n",(0,r.kt)("inlineCode",{parentName:"p"},"docker_ignore_restart_groupname")," is set to ",(0,r.kt)("inlineCode",{parentName:"p"},"manager"),". The parameter is best set in the\n",(0,r.kt)("inlineCode",{parentName:"p"},"environments/configuration.yml")," file when making an adjustment. For example, to prevent\nthe restart on all hosts, ",(0,r.kt)("inlineCode",{parentName:"p"},"docker_ignore_restart_groupname")," is set to ",(0,r.kt)("inlineCode",{parentName:"p"},"generic"),"."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},"docker_ignore_restart_groupname: generic\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"With the parameter ",(0,r.kt)("inlineCode",{parentName:"p"},"docker_allow_restart"),", the restart of the Docker service can be\nprevented. By default, ",(0,r.kt)("inlineCode",{parentName:"p"},"docker_allow_restart")," is set to ",(0,r.kt)("inlineCode",{parentName:"p"},"true"),". It is recommended to set\nthis parameter only at runtime. Otherwise, the best place for the parameter is the\n",(0,r.kt)("inlineCode",{parentName:"p"},"environments/configuration.yml")," file."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"osism apply docker -e docker_allow_restart=false\n")))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/26dd306b.dca4caf2.js b/assets/js/26dd306b.dca4caf2.js new file mode 100644 index 0000000000..1193ad216c --- /dev/null +++ b/assets/js/26dd306b.dca4caf2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6055],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>g});var n=r(67294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var u=n.createContext({}),c=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},d=function(e){var t=c(e.components);return n.createElement(u.Provider,{value:t},e.children)},l="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,o=e.originalType,u=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),l=c(r),f=i,g=l["".concat(u,".").concat(f)]||l[f]||p[f]||o;return r?n.createElement(g,a(a({ref:t},d),{},{components:r})):n.createElement(g,a({ref:t},d))}));function g(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=r.length,a=new Array(o);a[0]=f;var s={};for(var u in t)hasOwnProperty.call(t,u)&&(s[u]=t[u]);s.originalType=e,s[l]="string"==typeof e?e:i,a[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>a,default:()=>p,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var n=r(87462),i=(r(67294),r(3905));const o={sidebar_label:"Other Guides",sidebar_position:60},a="Other Guides",s={unversionedId:"iaas/guides/other-guides/index",id:"iaas/guides/other-guides/index",title:"Other Guides",description:"",source:"@site/docs/02-iaas/guides/other-guides/index.md",sourceDirName:"02-iaas/guides/other-guides",slug:"/iaas/guides/other-guides/",permalink:"/docs/iaas/guides/other-guides/",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/other-guides/index.md",tags:[],version:"current",sidebarPosition:60,frontMatter:{sidebar_label:"Other Guides",sidebar_position:60},sidebar:"docs",previous:{title:"Guides",permalink:"/docs/iaas/guides/"},next:{title:"Contributor Guide",permalink:"/docs/iaas/guides/other-guides/contributor-guide"}},u={},c=[],d={toc:c},l="wrapper";function p(e){let{components:t,...r}=e;return(0,i.kt)(l,(0,n.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"other-guides"},"Other Guides"))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/27f24dfd.c21ec51f.js b/assets/js/27f24dfd.c21ec51f.js new file mode 100644 index 0000000000..d689ea23b4 --- /dev/null +++ b/assets/js/27f24dfd.c21ec51f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3298],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),d=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=d(e.components);return r.createElement(l.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=d(n),h=a,f=u["".concat(l,".").concat(h)]||u[h]||p[h]||o;return n?r.createElement(f,i(i({ref:t},c),{},{components:n})):r.createElement(f,i({ref:t},c))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=h;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:a,i[1]=s;for(var d=2;d{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>p,frontMatter:()=>o,metadata:()=>s,toc:()=>d});var r=n(87462),a=(n(67294),n(3905));const o={title:"Kubernetes Node Distribution and Availability",type:"Standard",status:"Draft",track:"KaaS"},i=void 0,s={unversionedId:"scs-0214-v1-k8s-node-distribution",id:"scs-0214-v1-k8s-node-distribution",title:"Kubernetes Node Distribution and Availability",description:"Introduction",source:"@site/standards/scs-0214-v1-k8s-node-distribution.md",sourceDirName:".",slug:"/scs-0214-v1-k8s-node-distribution",permalink:"/standards/scs-0214-v1-k8s-node-distribution",draft:!1,tags:[],version:"current",frontMatter:{title:"Kubernetes Node Distribution and Availability",type:"Standard",status:"Draft",track:"KaaS"}},l={},d=[{value:"Introduction",id:"introduction",level:2},{value:"Glossary",id:"glossary",level:3},{value:"Motivation",id:"motivation",level:2},{value:"Design Considerations",id:"design-considerations",level:2},{value:"Decision",id:"decision",level:2},{value:"Related Documents",id:"related-documents",level:2},{value:"Conformance Tests",id:"conformance-tests",level:2}],c={toc:d},u="wrapper";function p(e){let{components:t,...n}=e;return(0,a.kt)(u,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"introduction"},"Introduction"),(0,a.kt)("p",null,"A Kubernetes instance is provided as a cluster, which consists of a set of machines,\nso called nodes. A cluster is composed of a control plane and at least one worker node.\nThe control plane manages the worker nodes and therefore the pods in the cluster by making\ndecisions about scheduling, event detection and rights management. Inside the control plane,\nmultiple components exist, which can be duplicated and distributed over multiple nodes\ninside the cluster. Typically, no user workloads are run on these nodes in order to\nseparate the controller component from user workloads, which could pose a security risk."),(0,a.kt)("h3",{id:"glossary"},"Glossary"),(0,a.kt)("p",null,"The following terms are used throughout this document:"),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Term"),(0,a.kt)("th",{parentName:"tr",align:null},"Meaning"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Worker"),(0,a.kt)("td",{parentName:"tr",align:null},"Virtual or bare-metal machine, which hosts workloads of customers")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Control Plane"),(0,a.kt)("td",{parentName:"tr",align:null},"Virtual or bare-metal machine, which hosts the container orchestration layer that exposes the API and interfaces to define, deploy, and manage the lifecycle of containers.")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"Machine"),(0,a.kt)("td",{parentName:"tr",align:null},"Virtual or bare-metal entity with computational capabilities")))),(0,a.kt)("h2",{id:"motivation"},"Motivation"),(0,a.kt)("p",null,'In normal day-to-day operation, it is not unusual for some operational failures, either\ndue to wear and tear of hardware, software misconfigurations, external problems or\nuser errors. Whichever was the source of such an outage, it always means down-time for\noperations and users and possible even data loss.\nTherefore, a Kubernetes cluster in a productive environment should be distributed over\nmultiple "failure zones" in order to provide fault-tolerance and high availability.\nThis is especially important for the control plane of the cluster, since it contains the\nstate of the whole cluster. A failure of this component could mean an unrecoverable failure\nof the whole cluster.'),(0,a.kt)("h2",{id:"design-considerations"},"Design Considerations"),(0,a.kt)("p",null,"Most design considerations of this standard follow the previously written Decision Record\n","[Kubernetes Nodes Anti Affinity]"," as well as the Kubernetes documents about ","[High Availability]","\nand ","[Best practices for large clusters]","."),(0,a.kt)("p",null,"SCS wishes to prefer distributed, highly-available systems due to their obvious advantages\nlike fault-tolerance and data redundancy. But it also understands the costs and overhead\nfor the providers associated with this effort, since the infrastructure needs to have\nhardware which will just be used to provide fail-over safety or duplication."),(0,a.kt)("p",null,"The document ","[Best practices for large clusters]"," describes the concept of a failure zone.\nThis term isn't defined any further, but can in this context be described as a number of\nphysical (computing) machines in such a vicinity to each other (either through physical\nor logical interconnection in some way), that specific problems inside this zone would put\nall these machines at risk of failure/shutdown. It is therefore necessary for important\ndata or services to not be present just on one failure zone.\nHow such a failure zone should be defined is dependent on the risk model of the service/data\nand its owner as well as the capabilities of the provider. Zones could be set from things\nlike single machines or racks up to whole datacenters or even regions, which could be\ncoupled by things like electrical grids. They're therefore purely logical entities, which\nshouldn't be defined further in this document."),(0,a.kt)("h2",{id:"decision"},"Decision"),(0,a.kt)("p",null,"This standard formulates the requirement for the distribution of Kubernetes nodes in order\nto provide a fault-tolerant and available Kubernetes cluster infrastructure.\nSince some providers only have small environments to work with and therefore couldn't\ncomply with this standard, it will be treated as a RECOMMENDED standard, where providers\ncan OPT-OUT."),(0,a.kt)("p",null,"If the standard is used by a provider, the following decisions are binding and valid:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"The control plane nodes MUST be distributed over multiple physical machines. Kubernetes\nprovides best-practices on this topic, which are also RECOMMENDED by SCS.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},'At least one control plane instance MUST be run in each "failure zone", more are\nRECOMMENDED in each "failure zone" to provide fault-tolerance for each zone.')),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},'Worker nodes are RECOMMENDED to be distributed over multiple zones. This policy makes\nit OPTIONAL to provide a worker node in each "failure zone", meaning that worker nodes\ncan also be scaled vertically first before scaling horizontally.')),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},'Worker node distribution MUST be indicated to the user through some kind of labeling\nin order to enable (anti)-affinity for workloads over "failure zones".'))),(0,a.kt)("h2",{id:"related-documents"},"Related Documents"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/high-availability/"},"High Availability"),"\n",(0,a.kt)("a",{parentName:"p",href:"https://kubernetes.io/docs/setup/best-practices/cluster-large/"},"Best practices for large clusters"),"\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Standards/scs-0213-v1-k8s-nodes-anti-affinity.md"},"Kubernetes Nodes Anti Affinity")),(0,a.kt)("h2",{id:"conformance-tests"},"Conformance Tests"),(0,a.kt)("p",null,"Conformance Tests will be written in another issue"))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/29331985.4f0161cb.js b/assets/js/29331985.4f0161cb.js new file mode 100644 index 0000000000..324ab35cab --- /dev/null +++ b/assets/js/29331985.4f0161cb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1653],{23523:e=>{e.exports=JSON.parse('{"title":"IaaS Layer","slug":"/category/iaas-layer","permalink":"/docs/category/iaas-layer","navigation":{"previous":{"title":"Introduction","permalink":"/docs/"},"next":{"title":"Deploy Guide","permalink":"/docs/iaas/guides/deploy-guide/"}}}')}}]); \ No newline at end of file diff --git a/assets/js/29c2cfba.1c8a2c33.js b/assets/js/29c2cfba.1c8a2c33.js new file mode 100644 index 0000000000..31a46351a9 --- /dev/null +++ b/assets/js/29c2cfba.1c8a2c33.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8604],{3905:(t,e,r)=>{r.d(e,{Zo:()=>s,kt:()=>f});var n=r(67294);function i(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function o(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function a(t){for(var e=1;e=0||(i[r]=t[r]);return i}(t,e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,r)&&(i[r]=t[r])}return i}var u=n.createContext({}),c=function(t){var e=n.useContext(u),r=e;return t&&(r="function"==typeof t?t(e):a(a({},e),t)),r},s=function(t){var e=c(t.components);return n.createElement(u.Provider,{value:e},t.children)},d="mdxType",m={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},p=n.forwardRef((function(t,e){var r=t.components,i=t.mdxType,o=t.originalType,u=t.parentName,s=l(t,["components","mdxType","originalType","parentName"]),d=c(r),p=i,f=d["".concat(u,".").concat(p)]||d[p]||m[p]||o;return r?n.createElement(f,a(a({ref:e},s),{},{components:r})):n.createElement(f,a({ref:e},s))}));function f(t,e){var r=arguments,i=e&&e.mdxType;if("string"==typeof t||i){var o=r.length,a=new Array(o);a[0]=p;var l={};for(var u in e)hasOwnProperty.call(e,u)&&(l[u]=e[u]);l.originalType=t,l[d]="string"==typeof t?t:i,a[1]=l;for(var c=2;c{r.r(e),r.d(e,{assets:()=>u,contentTitle:()=>a,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var n=r(87462),i=(r(67294),r(3905));const o={},a="Documentation Files Structure",l={unversionedId:"contribute/doc-files-structure-guide",id:"contribute/doc-files-structure-guide",title:"Documentation Files Structure",description:"Structure Best Practice",source:"@site/community/contribute/doc-files-structure-guide.md",sourceDirName:"contribute",slug:"/contribute/doc-files-structure-guide",permalink:"/community/contribute/doc-files-structure-guide",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"community",previous:{title:"Adding Docs Guide",permalink:"/community/contribute/adding-docs-guide"},next:{title:"Documentation workflow explanation",permalink:"/community/contribute/docs-workflow-explanation"}},u={},c=[{value:"Structure Best Practice",id:"structure-best-practice",level:2},{value:"Overview - mandatory",id:"overview---mandatory",level:3},{value:"Requirements - mandatory",id:"requirements---mandatory",level:3},{value:"Quickstart - optional. If it is possible, then mandatory",id:"quickstart---optional-if-it-is-possible-then-mandatory",level:3},{value:"Getting Started - mandatory",id:"getting-started---mandatory",level:3},{value:"Configuration \u2013 mandatory",id:"configuration--mandatory",level:3},{value:"Contribute \u2013 mandatory",id:"contribute--mandatory",level:3},{value:"FAQ`s \u2013 optional",id:"faqs--optional",level:3}],s={toc:c},d="wrapper";function m(t){let{components:e,...r}=t;return(0,i.kt)(d,(0,n.Z)({},s,r,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"documentation-files-structure"},"Documentation Files Structure"),(0,i.kt)("h2",{id:"structure-best-practice"},"Structure Best Practice"),(0,i.kt)("h3",{id:"overview---mandatory"},"Overview - mandatory"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"What is it and for what do I need this? What benefits does it have for users?"),(0,i.kt)("li",{parentName:"ul"},"What organization/company does this belong to? (Link to company/organization)"),(0,i.kt)("li",{parentName:"ul"},"Where am I \u2013 as module \u2013 within the bigger context of SCS?")),(0,i.kt)("h3",{id:"requirements---mandatory"},"Requirements - mandatory"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"What minimal requirements do i need to quickstart?")),(0,i.kt)("h3",{id:"quickstart---optional-if-it-is-possible-then-mandatory"},"Quickstart - optional. If it is possible, then mandatory"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Link to requirements"),(0,i.kt)("li",{parentName:"ul"},"What is the aim of this quickstart guide?"),(0,i.kt)("li",{parentName:"ul"},"Caution: only for testing, not for production"),(0,i.kt)("li",{parentName:"ul"},"Rule: one line per command for easy copy&paste and one line for description where possible"),(0,i.kt)("li",{parentName:"ul"},"Rule: only one working path for installation!")),(0,i.kt)("h3",{id:"getting-started---mandatory"},"Getting Started - mandatory"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Aim is a production ready installation")),(0,i.kt)("h3",{id:"configuration--mandatory"},"Configuration \u2013 mandatory"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Showing all possible config options")),(0,i.kt)("h3",{id:"contribute--mandatory"},"Contribute \u2013 mandatory"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Description for how can i contribute with Link to Github repository")),(0,i.kt)("h3",{id:"faqs--optional"},"FAQ`s \u2013 optional"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Roadmap - optional")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2c42a58f.ff2f3274.js b/assets/js/2c42a58f.ff2f3274.js new file mode 100644 index 0000000000..c326098e1d --- /dev/null +++ b/assets/js/2c42a58f.ff2f3274.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5183],{3905:(e,t,r)=>{r.d(t,{Zo:()=>l,kt:()=>f});var n=r(67294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var c=n.createContext({}),u=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},l=function(e){var t=u(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,o=e.originalType,c=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),p=u(r),d=i,f=p["".concat(c,".").concat(d)]||p[d]||m[d]||o;return r?n.createElement(f,a(a({ref:t},l),{},{components:r})):n.createElement(f,a({ref:t},l))}));function f(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=r.length,a=new Array(o);a[0]=d;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[p]="string"==typeof e?e:i,a[1]=s;for(var u=2;u{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>m,frontMatter:()=>o,metadata:()=>s,toc:()=>u});var n=r(87462),i=(r(67294),r(3905));const o={},a="Tips and Tricks",s={unversionedId:"github/tips-and-tricks",id:"github/tips-and-tricks",title:"Tips and Tricks",description:"Octo Reminder - your friendly assistant",source:"@site/community/github/tips-and-tricks.md",sourceDirName:"github",slug:"/github/tips-and-tricks",permalink:"/community/github/tips-and-tricks",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"community",previous:{title:"Developer Certificate of Origin + Licenses",permalink:"/community/github/dco-and-licenses"},next:{title:"Contribute",permalink:"/community/category/contribute"}},c={},u=[{value:"Octo Reminder - your friendly assistant",id:"octo-reminder---your-friendly-assistant",level:2}],l={toc:u},p="wrapper";function m(e){let{components:t,...r}=e;return(0,i.kt)(p,(0,n.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"tips-and-tricks"},"Tips and Tricks"),(0,i.kt)("h2",{id:"octo-reminder---your-friendly-assistant"},"Octo Reminder - your friendly assistant"),(0,i.kt)("p",null,"Are you tired of keeping track of planned changes or issues you scheduled for the future? Our ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/apps/octo-reminder"},"Octo Reminder")," is here to safe you from unneeded cognitive load!"),(0,i.kt)("p",null,"The app configuration is stored in our ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/.github/"},(0,i.kt)("inlineCode",{parentName:"a"},".github"))," repository. Using the bot is fairly simple:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"To schedule a reminder, simply comment with ",(0,i.kt)("inlineCode",{parentName:"li"},"/remind-me [date] [message]")," on an issue or pull request. The bot will answer and mention you in the particular issue/pull request upon reaching the configured date."),(0,i.kt)("li",{parentName:"ul"},"If you don't specify a time for the reminder, the bot will use 9:00 CET as default reminder time."),(0,i.kt)("li",{parentName:"ul"},"The date and time can be anything that ",(0,i.kt)("a",{parentName:"li",href:"https://momentjs.com/docs/#/parsing/"},"momentjs")," understands, e.g. an ISO 8601 string or a relative string such as ",(0,i.kt)("inlineCode",{parentName:"li"},"tomorrow")," or ",(0,i.kt)("inlineCode",{parentName:"li"},"next week"),".")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/301607a5.9abced11.js b/assets/js/301607a5.9abced11.js new file mode 100644 index 0000000000..ce87ebc967 --- /dev/null +++ b/assets/js/301607a5.9abced11.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[116],{3905:(e,t,n)=>{n.d(t,{Zo:()=>s,kt:()=>d});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),m=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},s=function(e){var t=m(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},f=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),p=m(n),f=a,d=p["".concat(l,".").concat(f)]||p[f]||u[f]||o;return n?r.createElement(d,i(i({ref:t},s),{},{components:n})):r.createElement(d,i({ref:t},s))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=f;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[p]="string"==typeof e?e:a,i[1]=c;for(var m=2;m{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>c,toc:()=>m});var r=n(87462),a=(n(67294),n(3905));const o={},i="Matrix",c={unversionedId:"communication/matrix",id:"communication/matrix",title:"Matrix",description:"We have created an open community space on the Matrix federation. Feel free to join the several channels and start chatting with our community. A good starting point is entering the General & Announcements and the Tech channel.",source:"@site/community/communication/matrix.md",sourceDirName:"communication",slug:"/communication/matrix",permalink:"/community/communication/matrix",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"community",previous:{title:"Collaboration",permalink:"/community/collaboration"},next:{title:"Test and development cloud resources",permalink:"/community/cloud-resources/"}},l={},m=[{value:"Client and Registration",id:"client-and-registration",level:2}],s={toc:m},p="wrapper";function u(e){let{components:t,...n}=e;return(0,a.kt)(p,(0,r.Z)({},s,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"matrix"},"Matrix"),(0,a.kt)("p",null,"We have created an ",(0,a.kt)("a",{parentName:"p",href:"https://matrix.to/#/!TiDqlLmEUaXqTemaLc:matrix.org?via=matrix.org"},"open community space on the Matrix federation"),". Feel free to join the several channels and start chatting with our community. A good starting point is entering the ",(0,a.kt)("a",{parentName:"p",href:"https://matrix.to/#/#scs-general:matrix.org"},"General & Announcements")," and the ",(0,a.kt)("a",{parentName:"p",href:"https://matrix.to/#/#scs-tech:matrix.org"},"Tech")," channel."),(0,a.kt)("h2",{id:"client-and-registration"},"Client and Registration"),(0,a.kt)("p",null,"To connect to the Matrix federation, you will need an account on a federated homeserver and a client. The easiest way to join us is register on the popular ",(0,a.kt)("inlineCode",{parentName:"p"},"matrix.org")," homeserver via the Element web client: ",(0,a.kt)("a",{parentName:"p",href:"https://app.element.io/#/register"},"https://app.element.io/#/register"),". A list of curated Matrix clients is collected on the official Matrix website: ",(0,a.kt)("a",{parentName:"p",href:"https://matrix.org/clients/"},"https://matrix.org/clients/"),"."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/306a8c6c.46bc9fa6.js b/assets/js/306a8c6c.46bc9fa6.js new file mode 100644 index 0000000000..b0c916ebd0 --- /dev/null +++ b/assets/js/306a8c6c.46bc9fa6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7616],{59479:e=>{e.exports=JSON.parse('{"pluginId":"community","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"community":[{"type":"link","label":"Overview","href":"/community/","docId":"index"},{"type":"link","label":"Calendar","href":"/community/calendar","docId":"calendar"},{"type":"link","label":"Collaboration","href":"/community/collaboration","docId":"collaboration"},{"type":"category","label":"Communication","items":[{"type":"link","label":"Matrix","href":"/community/communication/matrix","docId":"communication/matrix"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Cloud Resources","items":[{"type":"link","label":"Test and development cloud resources","href":"/community/cloud-resources/","docId":"cloud-resources/cloud-resources"},{"type":"link","label":"Getting Started with OpenStack","href":"/community/cloud-resources/getting-started-openstack","docId":"cloud-resources/getting-started-openstack"},{"type":"link","label":"Getting Started Gaia-X Demonstrator @ plusserver","href":"/community/cloud-resources/plusserver-gx-scs","docId":"cloud-resources/plusserver-gx-scs"},{"type":"link","label":"Getting Started with Wavestack","href":"/community/cloud-resources/wavestack","docId":"cloud-resources/wavestack"}],"collapsed":true,"collapsible":true},{"type":"category","label":"GitHub","items":[{"type":"link","label":"Branch Protection Rules","href":"/community/github/branchprotection","docId":"github/branchprotection"},{"type":"link","label":"Developer Certificate of Origin + Licenses","href":"/community/github/dco-and-licenses","docId":"github/dco-and-licenses"},{"type":"link","label":"Tips and Tricks","href":"/community/github/tips-and-tricks","docId":"github/tips-and-tricks"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Contribute","items":[{"type":"link","label":"Adding Docs Guide","href":"/community/contribute/adding-docs-guide","docId":"contribute/adding-docs-guide"},{"type":"link","label":"Documentation Files Structure","href":"/community/contribute/doc-files-structure-guide","docId":"contribute/doc-files-structure-guide"},{"type":"link","label":"Documentation workflow explanation","href":"/community/contribute/docs-workflow-explanation","docId":"contribute/docs-workflow-explanation"},{"type":"link","label":"Linting Guide","href":"/community/contribute/linting-guide","docId":"contribute/linting-guide"},{"type":"link","label":"Installation","href":"/community/contribute/local-docusaurus-development-guide","docId":"contribute/local-docusaurus-development-guide"},{"type":"link","label":"Styleguide","href":"/community/contribute/styleguide","docId":"contribute/styleguide"}],"collapsed":true,"collapsible":true,"href":"/community/category/contribute"},{"type":"link","label":"License considerations for SCS","href":"/community/license-considerations","docId":"license-considerations"}]},"docs":{"calendar":{"id":"calendar","title":"Calendar","description":"We\u2019re an open community","sidebar":"community"},"cloud-resources/cloud-resources":{"id":"cloud-resources/cloud-resources","title":"Test and development cloud resources","description":"This document gives an overview of the test and development cloud resources currently provided by our partners.","sidebar":"community"},"cloud-resources/getting-started-openstack":{"id":"cloud-resources/getting-started-openstack","title":"Getting Started with OpenStack","description":"Getting Started with OpenStack CLI","sidebar":"community"},"cloud-resources/plusserver-gx-scs":{"id":"cloud-resources/plusserver-gx-scs","title":"Getting Started Gaia-X Demonstrator @ plusserver","description":"Getting Started for the Gaia-X Demonstrator @ plusserver","sidebar":"community"},"cloud-resources/wavestack":{"id":"cloud-resources/wavestack","title":"Getting Started with Wavestack","description":"Getting Started with Wavestack","sidebar":"community"},"collaboration":{"id":"collaboration","title":"Collaboration","description":"Collaborating with issues and pull requests","sidebar":"community"},"communication/jitsi":{"id":"communication/jitsi","title":"jitsi","description":""},"communication/mailinglists":{"id":"communication/mailinglists","title":"mailinglists","description":""},"communication/matrix":{"id":"communication/matrix","title":"Matrix","description":"We have created an open community space on the Matrix federation. Feel free to join the several channels and start chatting with our community. A good starting point is entering the General & Announcements and the Tech channel.","sidebar":"community"},"contribute/adding-docs-guide":{"id":"contribute/adding-docs-guide","title":"Adding Docs Guide","description":"In this Guide you will learn how to integrate your documentation to the SCS documentation, which you will find on docs.scs.community.","sidebar":"community"},"contribute/doc-files-structure-guide":{"id":"contribute/doc-files-structure-guide","title":"Documentation Files Structure","description":"Structure Best Practice","sidebar":"community"},"contribute/docs-workflow-explanation":{"id":"contribute/docs-workflow-explanation","title":"Documentation workflow explanation","description":"The aim within this documentation is to have a good developer experience and a low entry barrier to start with SCS. For this to achieve we think all docs that define the SCS stack and have been developed by the SCS community should be within this documentation framework.","sidebar":"community"},"contribute/linting-guide":{"id":"contribute/linting-guide","title":"Linting Guide","description":"In order to have a clean content repository regarding all markdown files we enforce linting on:","sidebar":"community"},"contribute/local-docusaurus-development-guide":{"id":"contribute/local-docusaurus-development-guide","title":"Installation","description":"This Guide shows you how to setup docusaurus on your local machine to run this docs-page in your local development enviroment.","sidebar":"community"},"contribute/styleguide":{"id":"contribute/styleguide","title":"Styleguide","description":"Admonitions","sidebar":"community"},"contribute/styleguides/ansible_styleguide":{"id":"contribute/styleguides/ansible_styleguide","title":"Ansible Style Guide","description":"We use nearly all default rules of ansible lint. A listing of all these rules can be found in the Ansible Lint documentation:"},"github/branchprotection":{"id":"github/branchprotection","title":"Branch Protection Rules","description":"To protect our source code from unwanted changes, we enforce the following branch protection rules for all repositories within our GitHub organization:","sidebar":"community"},"github/dco-and-licenses":{"id":"github/dco-and-licenses","title":"Developer Certificate of Origin + Licenses","description":"The Developer Certificate of Origin (DCO) is a lightweight way for contributors","sidebar":"community"},"github/tips-and-tricks":{"id":"github/tips-and-tricks","title":"Tips and Tricks","description":"Octo Reminder - your friendly assistant","sidebar":"community"},"hackathons/checklist":{"id":"hackathons/checklist","title":"Hackathon planning checklist","description":"This checklist is designed to simplify the planning of hackathons and meetups. All items are suggestions and optionally adaptable"},"index":{"id":"index","title":"Overview","description":"Welcome to our SCS Community","sidebar":"community"},"license-considerations":{"id":"license-considerations","title":"License considerations for SCS","description":"As Sovereign Cloud Stack (SCS), our mission is to provide Operators","sidebar":"community"}}}')}}]); \ No newline at end of file diff --git a/assets/js/316.d513d091.js b/assets/js/316.d513d091.js new file mode 100644 index 0000000000..67fe8499b7 --- /dev/null +++ b/assets/js/316.d513d091.js @@ -0,0 +1,1354 @@ +"use strict"; +exports.id = 316; +exports.ids = [316]; +exports.modules = { + +/***/ 96316: +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ diagram: () => (/* binding */ diagram) +/* harmony export */ }); +/* harmony import */ var _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(87115); +/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(59373); +/* harmony import */ var khroma__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(91619); +/* harmony import */ var khroma__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(12281); +/* harmony import */ var khroma__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(7201); +/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(27484); +/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dayjs__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _braintree_sanitize_url__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(17967); +/* harmony import */ var dompurify__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(20683); +/* harmony import */ var dagre_d3_es_src_dagre_index_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(70277); +/* harmony import */ var dagre_d3_es_src_graphlib_index_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(45625); +/* harmony import */ var dagre_d3_es_src_graphlib_json_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(39354); +/* harmony import */ var dagre_d3_es__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(91518); +/* harmony import */ var dayjs_plugin_isoWeek_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(59542); +/* harmony import */ var dayjs_plugin_isoWeek_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(dayjs_plugin_isoWeek_js__WEBPACK_IMPORTED_MODULE_8__); +/* harmony import */ var dayjs_plugin_customParseFormat_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(10285); +/* harmony import */ var dayjs_plugin_customParseFormat_js__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(dayjs_plugin_customParseFormat_js__WEBPACK_IMPORTED_MODULE_9__); +/* harmony import */ var dayjs_plugin_advancedFormat_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(28734); +/* harmony import */ var dayjs_plugin_advancedFormat_js__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(dayjs_plugin_advancedFormat_js__WEBPACK_IMPORTED_MODULE_10__); + + + + + + + + + + + + + + + + + + + + + + +var parser = function() { + var o = function(k, v, o2, l) { + for (o2 = o2 || {}, l = k.length; l--; o2[k[l]] = v) + ; + return o2; + }, $V0 = [1, 2], $V1 = [1, 5], $V2 = [6, 9, 11, 17, 18, 20, 22, 23, 26, 27, 28], $V3 = [1, 15], $V4 = [1, 16], $V5 = [1, 17], $V6 = [1, 18], $V7 = [1, 19], $V8 = [1, 23], $V9 = [1, 24], $Va = [1, 27], $Vb = [4, 6, 9, 11, 17, 18, 20, 22, 23, 26, 27, 28]; + var parser2 = { + trace: function trace() { + }, + yy: {}, + symbols_: { "error": 2, "start": 3, "timeline": 4, "document": 5, "EOF": 6, "directive": 7, "line": 8, "SPACE": 9, "statement": 10, "NEWLINE": 11, "openDirective": 12, "typeDirective": 13, "closeDirective": 14, ":": 15, "argDirective": 16, "title": 17, "acc_title": 18, "acc_title_value": 19, "acc_descr": 20, "acc_descr_value": 21, "acc_descr_multiline_value": 22, "section": 23, "period_statement": 24, "event_statement": 25, "period": 26, "event": 27, "open_directive": 28, "type_directive": 29, "arg_directive": 30, "close_directive": 31, "$accept": 0, "$end": 1 }, + terminals_: { 2: "error", 4: "timeline", 6: "EOF", 9: "SPACE", 11: "NEWLINE", 15: ":", 17: "title", 18: "acc_title", 19: "acc_title_value", 20: "acc_descr", 21: "acc_descr_value", 22: "acc_descr_multiline_value", 23: "section", 26: "period", 27: "event", 28: "open_directive", 29: "type_directive", 30: "arg_directive", 31: "close_directive" }, + productions_: [0, [3, 3], [3, 2], [5, 0], [5, 2], [8, 2], [8, 1], [8, 1], [8, 1], [7, 4], [7, 6], [10, 1], [10, 2], [10, 2], [10, 1], [10, 1], [10, 1], [10, 1], [10, 1], [24, 1], [25, 1], [12, 1], [13, 1], [16, 1], [14, 1]], + performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) { + var $0 = $$.length - 1; + switch (yystate) { + case 1: + return $$[$0 - 1]; + case 3: + this.$ = []; + break; + case 4: + $$[$0 - 1].push($$[$0]); + this.$ = $$[$0 - 1]; + break; + case 5: + case 6: + this.$ = $$[$0]; + break; + case 7: + case 8: + this.$ = []; + break; + case 11: + yy.getCommonDb().setDiagramTitle($$[$0].substr(6)); + this.$ = $$[$0].substr(6); + break; + case 12: + this.$ = $$[$0].trim(); + yy.getCommonDb().setAccTitle(this.$); + break; + case 13: + case 14: + this.$ = $$[$0].trim(); + yy.getCommonDb().setAccDescription(this.$); + break; + case 15: + yy.addSection($$[$0].substr(8)); + this.$ = $$[$0].substr(8); + break; + case 19: + yy.addTask($$[$0], 0, ""); + this.$ = $$[$0]; + break; + case 20: + yy.addEvent($$[$0].substr(2)); + this.$ = $$[$0]; + break; + case 21: + yy.parseDirective("%%{", "open_directive"); + break; + case 22: + yy.parseDirective($$[$0], "type_directive"); + break; + case 23: + $$[$0] = $$[$0].trim().replace(/'/g, '"'); + yy.parseDirective($$[$0], "arg_directive"); + break; + case 24: + yy.parseDirective("}%%", "close_directive", "timeline"); + break; + } + }, + table: [{ 3: 1, 4: $V0, 7: 3, 12: 4, 28: $V1 }, { 1: [3] }, o($V2, [2, 3], { 5: 6 }), { 3: 7, 4: $V0, 7: 3, 12: 4, 28: $V1 }, { 13: 8, 29: [1, 9] }, { 29: [2, 21] }, { 6: [1, 10], 7: 22, 8: 11, 9: [1, 12], 10: 13, 11: [1, 14], 12: 4, 17: $V3, 18: $V4, 20: $V5, 22: $V6, 23: $V7, 24: 20, 25: 21, 26: $V8, 27: $V9, 28: $V1 }, { 1: [2, 2] }, { 14: 25, 15: [1, 26], 31: $Va }, o([15, 31], [2, 22]), o($V2, [2, 8], { 1: [2, 1] }), o($V2, [2, 4]), { 7: 22, 10: 28, 12: 4, 17: $V3, 18: $V4, 20: $V5, 22: $V6, 23: $V7, 24: 20, 25: 21, 26: $V8, 27: $V9, 28: $V1 }, o($V2, [2, 6]), o($V2, [2, 7]), o($V2, [2, 11]), { 19: [1, 29] }, { 21: [1, 30] }, o($V2, [2, 14]), o($V2, [2, 15]), o($V2, [2, 16]), o($V2, [2, 17]), o($V2, [2, 18]), o($V2, [2, 19]), o($V2, [2, 20]), { 11: [1, 31] }, { 16: 32, 30: [1, 33] }, { 11: [2, 24] }, o($V2, [2, 5]), o($V2, [2, 12]), o($V2, [2, 13]), o($Vb, [2, 9]), { 14: 34, 31: $Va }, { 31: [2, 23] }, { 11: [1, 35] }, o($Vb, [2, 10])], + defaultActions: { 5: [2, 21], 7: [2, 2], 27: [2, 24], 33: [2, 23] }, + parseError: function parseError(str, hash) { + if (hash.recoverable) { + this.trace(str); + } else { + var error = new Error(str); + error.hash = hash; + throw error; + } + }, + parse: function parse(input) { + var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, TERROR = 2, EOF = 1; + var args = lstack.slice.call(arguments, 1); + var lexer2 = Object.create(this.lexer); + var sharedState = { yy: {} }; + for (var k in this.yy) { + if (Object.prototype.hasOwnProperty.call(this.yy, k)) { + sharedState.yy[k] = this.yy[k]; + } + } + lexer2.setInput(input, sharedState.yy); + sharedState.yy.lexer = lexer2; + sharedState.yy.parser = this; + if (typeof lexer2.yylloc == "undefined") { + lexer2.yylloc = {}; + } + var yyloc = lexer2.yylloc; + lstack.push(yyloc); + var ranges = lexer2.options && lexer2.options.ranges; + if (typeof sharedState.yy.parseError === "function") { + this.parseError = sharedState.yy.parseError; + } else { + this.parseError = Object.getPrototypeOf(this).parseError; + } + function lex() { + var token; + token = tstack.pop() || lexer2.lex() || EOF; + if (typeof token !== "number") { + if (token instanceof Array) { + tstack = token; + token = tstack.pop(); + } + token = self.symbols_[token] || token; + } + return token; + } + var symbol, state, action, r, yyval = {}, p, len, newState, expected; + while (true) { + state = stack[stack.length - 1]; + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol === null || typeof symbol == "undefined") { + symbol = lex(); + } + action = table[state] && table[state][symbol]; + } + if (typeof action === "undefined" || !action.length || !action[0]) { + var errStr = ""; + expected = []; + for (p in table[state]) { + if (this.terminals_[p] && p > TERROR) { + expected.push("'" + this.terminals_[p] + "'"); + } + } + if (lexer2.showPosition) { + errStr = "Parse error on line " + (yylineno + 1) + ":\n" + lexer2.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; + } else { + errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == EOF ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'"); + } + this.parseError(errStr, { + text: lexer2.match, + token: this.terminals_[symbol] || symbol, + line: lexer2.yylineno, + loc: yyloc, + expected + }); + } + if (action[0] instanceof Array && action.length > 1) { + throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); + } + switch (action[0]) { + case 1: + stack.push(symbol); + vstack.push(lexer2.yytext); + lstack.push(lexer2.yylloc); + stack.push(action[1]); + symbol = null; + { + yyleng = lexer2.yyleng; + yytext = lexer2.yytext; + yylineno = lexer2.yylineno; + yyloc = lexer2.yylloc; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = { + first_line: lstack[lstack.length - (len || 1)].first_line, + last_line: lstack[lstack.length - 1].last_line, + first_column: lstack[lstack.length - (len || 1)].first_column, + last_column: lstack[lstack.length - 1].last_column + }; + if (ranges) { + yyval._$.range = [ + lstack[lstack.length - (len || 1)].range[0], + lstack[lstack.length - 1].range[1] + ]; + } + r = this.performAction.apply(yyval, [ + yytext, + yyleng, + yylineno, + sharedState.yy, + action[1], + vstack, + lstack + ].concat(args)); + if (typeof r !== "undefined") { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; + } + } + return true; + } + }; + var lexer = function() { + var lexer2 = { + EOF: 1, + parseError: function parseError(str, hash) { + if (this.yy.parser) { + this.yy.parser.parseError(str, hash); + } else { + throw new Error(str); + } + }, + // resets the lexer, sets new input + setInput: function(input, yy) { + this.yy = yy || this.yy || {}; + this._input = input; + this._more = this._backtrack = this.done = false; + this.yylineno = this.yyleng = 0; + this.yytext = this.matched = this.match = ""; + this.conditionStack = ["INITIAL"]; + this.yylloc = { + first_line: 1, + first_column: 0, + last_line: 1, + last_column: 0 + }; + if (this.options.ranges) { + this.yylloc.range = [0, 0]; + } + this.offset = 0; + return this; + }, + // consumes and returns one char from the input + input: function() { + var ch = this._input[0]; + this.yytext += ch; + this.yyleng++; + this.offset++; + this.match += ch; + this.matched += ch; + var lines = ch.match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno++; + this.yylloc.last_line++; + } else { + this.yylloc.last_column++; + } + if (this.options.ranges) { + this.yylloc.range[1]++; + } + this._input = this._input.slice(1); + return ch; + }, + // unshifts one char (or a string) into the input + unput: function(ch) { + var len = ch.length; + var lines = ch.split(/(?:\r\n?|\n)/g); + this._input = ch + this._input; + this.yytext = this.yytext.substr(0, this.yytext.length - len); + this.offset -= len; + var oldLines = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length - 1); + this.matched = this.matched.substr(0, this.matched.length - 1); + if (lines.length - 1) { + this.yylineno -= lines.length - 1; + } + var r = this.yylloc.range; + this.yylloc = { + first_line: this.yylloc.first_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.first_column, + last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len + }; + if (this.options.ranges) { + this.yylloc.range = [r[0], r[0] + this.yyleng - len]; + } + this.yyleng = this.yytext.length; + return this; + }, + // When called from action, caches matched text and appends it on next action + more: function() { + this._more = true; + return this; + }, + // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. + reject: function() { + if (this.options.backtrack_lexer) { + this._backtrack = true; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + return this; + }, + // retain first n characters of the match + less: function(n) { + this.unput(this.match.slice(n)); + }, + // displays already matched input, i.e. for error messages + pastInput: function() { + var past = this.matched.substr(0, this.matched.length - this.match.length); + return (past.length > 20 ? "..." : "") + past.substr(-20).replace(/\n/g, ""); + }, + // displays upcoming input, i.e. for error messages + upcomingInput: function() { + var next = this.match; + if (next.length < 20) { + next += this._input.substr(0, 20 - next.length); + } + return (next.substr(0, 20) + (next.length > 20 ? "..." : "")).replace(/\n/g, ""); + }, + // displays the character position where the lexing error occurred, i.e. for error messages + showPosition: function() { + var pre = this.pastInput(); + var c = new Array(pre.length + 1).join("-"); + return pre + this.upcomingInput() + "\n" + c + "^"; + }, + // test the lexed token: return FALSE when not a match, otherwise return token + test_match: function(match, indexed_rule) { + var token, lines, backup; + if (this.options.backtrack_lexer) { + backup = { + yylineno: this.yylineno, + yylloc: { + first_line: this.yylloc.first_line, + last_line: this.last_line, + first_column: this.yylloc.first_column, + last_column: this.yylloc.last_column + }, + yytext: this.yytext, + match: this.match, + matches: this.matches, + matched: this.matched, + yyleng: this.yyleng, + offset: this.offset, + _more: this._more, + _input: this._input, + yy: this.yy, + conditionStack: this.conditionStack.slice(0), + done: this.done + }; + if (this.options.ranges) { + backup.yylloc.range = this.yylloc.range.slice(0); + } + } + lines = match[0].match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno += lines.length; + } + this.yylloc = { + first_line: this.yylloc.last_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.last_column, + last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length + }; + this.yytext += match[0]; + this.match += match[0]; + this.matches = match; + this.yyleng = this.yytext.length; + if (this.options.ranges) { + this.yylloc.range = [this.offset, this.offset += this.yyleng]; + } + this._more = false; + this._backtrack = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); + if (this.done && this._input) { + this.done = false; + } + if (token) { + return token; + } else if (this._backtrack) { + for (var k in backup) { + this[k] = backup[k]; + } + return false; + } + return false; + }, + // return next match in input + next: function() { + if (this.done) { + return this.EOF; + } + if (!this._input) { + this.done = true; + } + var token, match, tempMatch, index; + if (!this._more) { + this.yytext = ""; + this.match = ""; + } + var rules = this._currentRules(); + for (var i = 0; i < rules.length; i++) { + tempMatch = this._input.match(this.rules[rules[i]]); + if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { + match = tempMatch; + index = i; + if (this.options.backtrack_lexer) { + token = this.test_match(tempMatch, rules[i]); + if (token !== false) { + return token; + } else if (this._backtrack) { + match = false; + continue; + } else { + return false; + } + } else if (!this.options.flex) { + break; + } + } + } + if (match) { + token = this.test_match(match, rules[index]); + if (token !== false) { + return token; + } + return false; + } + if (this._input === "") { + return this.EOF; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". Unrecognized text.\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + }, + // return next match that has a token + lex: function lex() { + var r = this.next(); + if (r) { + return r; + } else { + return this.lex(); + } + }, + // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) + begin: function begin(condition) { + this.conditionStack.push(condition); + }, + // pop the previously active lexer condition state off the condition stack + popState: function popState() { + var n = this.conditionStack.length - 1; + if (n > 0) { + return this.conditionStack.pop(); + } else { + return this.conditionStack[0]; + } + }, + // produce the lexer rule set which is active for the currently active lexer condition state + _currentRules: function _currentRules() { + if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { + return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; + } else { + return this.conditions["INITIAL"].rules; + } + }, + // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available + topState: function topState(n) { + n = this.conditionStack.length - 1 - Math.abs(n || 0); + if (n >= 0) { + return this.conditionStack[n]; + } else { + return "INITIAL"; + } + }, + // alias for begin(condition) + pushState: function pushState(condition) { + this.begin(condition); + }, + // return the number of states currently on the stack + stateStackSize: function stateStackSize() { + return this.conditionStack.length; + }, + options: { "case-insensitive": true }, + performAction: function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) { + switch ($avoiding_name_collisions) { + case 0: + this.begin("open_directive"); + return 28; + case 1: + this.begin("type_directive"); + return 29; + case 2: + this.popState(); + this.begin("arg_directive"); + return 15; + case 3: + this.popState(); + this.popState(); + return 31; + case 4: + return 30; + case 5: + break; + case 6: + break; + case 7: + return 11; + case 8: + break; + case 9: + break; + case 10: + return 4; + case 11: + return 17; + case 12: + this.begin("acc_title"); + return 18; + case 13: + this.popState(); + return "acc_title_value"; + case 14: + this.begin("acc_descr"); + return 20; + case 15: + this.popState(); + return "acc_descr_value"; + case 16: + this.begin("acc_descr_multiline"); + break; + case 17: + this.popState(); + break; + case 18: + return "acc_descr_multiline_value"; + case 19: + return 23; + case 20: + return 27; + case 21: + return 26; + case 22: + return 6; + case 23: + return "INVALID"; + } + }, + rules: [/^(?:%%\{)/i, /^(?:((?:(?!\}%%)[^:.])*))/i, /^(?::)/i, /^(?:\}%%)/i, /^(?:((?:(?!\}%%).|\n)*))/i, /^(?:%(?!\{)[^\n]*)/i, /^(?:[^\}]%%[^\n]*)/i, /^(?:[\n]+)/i, /^(?:\s+)/i, /^(?:#[^\n]*)/i, /^(?:timeline\b)/i, /^(?:title\s[^#\n;]+)/i, /^(?:accTitle\s*:\s*)/i, /^(?:(?!\n||)*[^\n]*)/i, /^(?:accDescr\s*:\s*)/i, /^(?:(?!\n||)*[^\n]*)/i, /^(?:accDescr\s*\{\s*)/i, /^(?:[\}])/i, /^(?:[^\}]*)/i, /^(?:section\s[^#:\n;]+)/i, /^(?::\s[^#:\n;]+)/i, /^(?:[^#:\n;]+)/i, /^(?:$)/i, /^(?:.)/i], + conditions: { "open_directive": { "rules": [1], "inclusive": false }, "type_directive": { "rules": [2, 3], "inclusive": false }, "arg_directive": { "rules": [3, 4], "inclusive": false }, "acc_descr_multiline": { "rules": [17, 18], "inclusive": false }, "acc_descr": { "rules": [15], "inclusive": false }, "acc_title": { "rules": [13], "inclusive": false }, "INITIAL": { "rules": [0, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 19, 20, 21, 22, 23], "inclusive": true } } + }; + return lexer2; + }(); + parser2.lexer = lexer; + function Parser() { + this.yy = {}; + } + Parser.prototype = parser2; + parser2.Parser = Parser; + return new Parser(); +}(); +parser.parser = parser; +const parser$1 = parser; +let currentSection = ""; +let currentTaskId = 0; +const sections = []; +const tasks = []; +const rawTasks = []; +const getCommonDb = () => _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.j; +const parseDirective = (statement, context, type) => { + (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.k)(globalThis, statement, context, type); +}; +const clear = function() { + sections.length = 0; + tasks.length = 0; + currentSection = ""; + rawTasks.length = 0; + (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.m)(); +}; +const addSection = function(txt) { + currentSection = txt; + sections.push(txt); +}; +const getSections = function() { + return sections; +}; +const getTasks = function() { + let allItemsProcessed = compileTasks(); + const maxDepth = 100; + let iterationCount = 0; + while (!allItemsProcessed && iterationCount < maxDepth) { + allItemsProcessed = compileTasks(); + iterationCount++; + } + tasks.push(...rawTasks); + return tasks; +}; +const addTask = function(period, length, event) { + const rawTask = { + id: currentTaskId++, + section: currentSection, + type: currentSection, + task: period, + score: length ? length : 0, + //if event is defined, then add it the events array + events: event ? [event] : [] + }; + rawTasks.push(rawTask); +}; +const addEvent = function(event) { + const currentTask = rawTasks.find((task) => task.id === currentTaskId - 1); + currentTask.events.push(event); +}; +const addTaskOrg = function(descr) { + const newTask = { + section: currentSection, + type: currentSection, + description: descr, + task: descr, + classes: [] + }; + tasks.push(newTask); +}; +const compileTasks = function() { + const compileTask = function(pos) { + return rawTasks[pos].processed; + }; + let allProcessed = true; + for (const [i, rawTask] of rawTasks.entries()) { + compileTask(i); + allProcessed = allProcessed && rawTask.processed; + } + return allProcessed; +}; +const timelineDb = { + clear, + getCommonDb, + addSection, + getSections, + getTasks, + addTask, + addTaskOrg, + addEvent, + parseDirective +}; +const db = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ + __proto__: null, + addEvent, + addSection, + addTask, + addTaskOrg, + clear, + default: timelineDb, + getCommonDb, + getSections, + getTasks, + parseDirective +}, Symbol.toStringTag, { value: "Module" })); +const MAX_SECTIONS = 12; +const drawRect = function(elem, rectData) { + const rectElem = elem.append("rect"); + rectElem.attr("x", rectData.x); + rectElem.attr("y", rectData.y); + rectElem.attr("fill", rectData.fill); + rectElem.attr("stroke", rectData.stroke); + rectElem.attr("width", rectData.width); + rectElem.attr("height", rectData.height); + rectElem.attr("rx", rectData.rx); + rectElem.attr("ry", rectData.ry); + if (rectData.class !== void 0) { + rectElem.attr("class", rectData.class); + } + return rectElem; +}; +const drawFace = function(element, faceData) { + const radius = 15; + const circleElement = element.append("circle").attr("cx", faceData.cx).attr("cy", faceData.cy).attr("class", "face").attr("r", radius).attr("stroke-width", 2).attr("overflow", "visible"); + const face = element.append("g"); + face.append("circle").attr("cx", faceData.cx - radius / 3).attr("cy", faceData.cy - radius / 3).attr("r", 1.5).attr("stroke-width", 2).attr("fill", "#666").attr("stroke", "#666"); + face.append("circle").attr("cx", faceData.cx + radius / 3).attr("cy", faceData.cy - radius / 3).attr("r", 1.5).attr("stroke-width", 2).attr("fill", "#666").attr("stroke", "#666"); + function smile(face2) { + const arc$1 = (0,d3__WEBPACK_IMPORTED_MODULE_0__/* .arc */ .Nb1)().startAngle(Math.PI / 2).endAngle(3 * (Math.PI / 2)).innerRadius(radius / 2).outerRadius(radius / 2.2); + face2.append("path").attr("class", "mouth").attr("d", arc$1).attr("transform", "translate(" + faceData.cx + "," + (faceData.cy + 2) + ")"); + } + function sad(face2) { + const arc$1 = (0,d3__WEBPACK_IMPORTED_MODULE_0__/* .arc */ .Nb1)().startAngle(3 * Math.PI / 2).endAngle(5 * (Math.PI / 2)).innerRadius(radius / 2).outerRadius(radius / 2.2); + face2.append("path").attr("class", "mouth").attr("d", arc$1).attr("transform", "translate(" + faceData.cx + "," + (faceData.cy + 7) + ")"); + } + function ambivalent(face2) { + face2.append("line").attr("class", "mouth").attr("stroke", 2).attr("x1", faceData.cx - 5).attr("y1", faceData.cy + 7).attr("x2", faceData.cx + 5).attr("y2", faceData.cy + 7).attr("class", "mouth").attr("stroke-width", "1px").attr("stroke", "#666"); + } + if (faceData.score > 3) { + smile(face); + } else if (faceData.score < 3) { + sad(face); + } else { + ambivalent(face); + } + return circleElement; +}; +const drawCircle = function(element, circleData) { + const circleElement = element.append("circle"); + circleElement.attr("cx", circleData.cx); + circleElement.attr("cy", circleData.cy); + circleElement.attr("class", "actor-" + circleData.pos); + circleElement.attr("fill", circleData.fill); + circleElement.attr("stroke", circleData.stroke); + circleElement.attr("r", circleData.r); + if (circleElement.class !== void 0) { + circleElement.attr("class", circleElement.class); + } + if (circleData.title !== void 0) { + circleElement.append("title").text(circleData.title); + } + return circleElement; +}; +const drawText = function(elem, textData) { + const nText = textData.text.replace(//gi, " "); + const textElem = elem.append("text"); + textElem.attr("x", textData.x); + textElem.attr("y", textData.y); + textElem.attr("class", "legend"); + textElem.style("text-anchor", textData.anchor); + if (textData.class !== void 0) { + textElem.attr("class", textData.class); + } + const span = textElem.append("tspan"); + span.attr("x", textData.x + textData.textMargin * 2); + span.text(nText); + return textElem; +}; +const drawLabel = function(elem, txtObject) { + function genPoints(x, y, width, height, cut) { + return x + "," + y + " " + (x + width) + "," + y + " " + (x + width) + "," + (y + height - cut) + " " + (x + width - cut * 1.2) + "," + (y + height) + " " + x + "," + (y + height); + } + const polygon = elem.append("polygon"); + polygon.attr("points", genPoints(txtObject.x, txtObject.y, 50, 20, 7)); + polygon.attr("class", "labelBox"); + txtObject.y = txtObject.y + txtObject.labelMargin; + txtObject.x = txtObject.x + 0.5 * txtObject.labelMargin; + drawText(elem, txtObject); +}; +const drawSection = function(elem, section, conf2) { + const g = elem.append("g"); + const rect = getNoteRect(); + rect.x = section.x; + rect.y = section.y; + rect.fill = section.fill; + rect.width = conf2.width; + rect.height = conf2.height; + rect.class = "journey-section section-type-" + section.num; + rect.rx = 3; + rect.ry = 3; + drawRect(g, rect); + _drawTextCandidateFunc(conf2)( + section.text, + g, + rect.x, + rect.y, + rect.width, + rect.height, + { class: "journey-section section-type-" + section.num }, + conf2, + section.colour + ); +}; +let taskCount = -1; +const drawTask = function(elem, task, conf2) { + const center = task.x + conf2.width / 2; + const g = elem.append("g"); + taskCount++; + const maxHeight = 300 + 5 * 30; + g.append("line").attr("id", "task" + taskCount).attr("x1", center).attr("y1", task.y).attr("x2", center).attr("y2", maxHeight).attr("class", "task-line").attr("stroke-width", "1px").attr("stroke-dasharray", "4 2").attr("stroke", "#666"); + drawFace(g, { + cx: center, + cy: 300 + (5 - task.score) * 30, + score: task.score + }); + const rect = getNoteRect(); + rect.x = task.x; + rect.y = task.y; + rect.fill = task.fill; + rect.width = conf2.width; + rect.height = conf2.height; + rect.class = "task task-type-" + task.num; + rect.rx = 3; + rect.ry = 3; + drawRect(g, rect); + task.x + 14; + _drawTextCandidateFunc(conf2)( + task.task, + g, + rect.x, + rect.y, + rect.width, + rect.height, + { class: "task" }, + conf2, + task.colour + ); +}; +const drawBackgroundRect = function(elem, bounds) { + const rectElem = drawRect(elem, { + x: bounds.startx, + y: bounds.starty, + width: bounds.stopx - bounds.startx, + height: bounds.stopy - bounds.starty, + fill: bounds.fill, + class: "rect" + }); + rectElem.lower(); +}; +const getTextObj = function() { + return { + x: 0, + y: 0, + fill: void 0, + "text-anchor": "start", + width: 100, + height: 100, + textMargin: 0, + rx: 0, + ry: 0 + }; +}; +const getNoteRect = function() { + return { + x: 0, + y: 0, + width: 100, + anchor: "start", + height: 100, + rx: 0, + ry: 0 + }; +}; +const _drawTextCandidateFunc = function() { + function byText(content, g, x, y, width, height, textAttrs, colour) { + const text = g.append("text").attr("x", x + width / 2).attr("y", y + height / 2 + 5).style("font-color", colour).style("text-anchor", "middle").text(content); + _setTextAttrs(text, textAttrs); + } + function byTspan(content, g, x, y, width, height, textAttrs, conf2, colour) { + const { taskFontSize, taskFontFamily } = conf2; + const lines = content.split(//gi); + for (let i = 0; i < lines.length; i++) { + const dy = i * taskFontSize - taskFontSize * (lines.length - 1) / 2; + const text = g.append("text").attr("x", x + width / 2).attr("y", y).attr("fill", colour).style("text-anchor", "middle").style("font-size", taskFontSize).style("font-family", taskFontFamily); + text.append("tspan").attr("x", x + width / 2).attr("dy", dy).text(lines[i]); + text.attr("y", y + height / 2).attr("dominant-baseline", "central").attr("alignment-baseline", "central"); + _setTextAttrs(text, textAttrs); + } + } + function byFo(content, g, x, y, width, height, textAttrs, conf2) { + const body = g.append("switch"); + const f = body.append("foreignObject").attr("x", x).attr("y", y).attr("width", width).attr("height", height).attr("position", "fixed"); + const text = f.append("xhtml:div").style("display", "table").style("height", "100%").style("width", "100%"); + text.append("div").attr("class", "label").style("display", "table-cell").style("text-align", "center").style("vertical-align", "middle").text(content); + byTspan(content, body, x, y, width, height, textAttrs, conf2); + _setTextAttrs(text, textAttrs); + } + function _setTextAttrs(toText, fromTextAttrsDict) { + for (const key in fromTextAttrsDict) { + if (key in fromTextAttrsDict) { + toText.attr(key, fromTextAttrsDict[key]); + } + } + } + return function(conf2) { + return conf2.textPlacement === "fo" ? byFo : conf2.textPlacement === "old" ? byText : byTspan; + }; +}(); +const initGraphics = function(graphics) { + graphics.append("defs").append("marker").attr("id", "arrowhead").attr("refX", 5).attr("refY", 2).attr("markerWidth", 6).attr("markerHeight", 4).attr("orient", "auto").append("path").attr("d", "M 0,0 V 4 L6,2 Z"); +}; +function wrap(text, width) { + text.each(function() { + var text2 = (0,d3__WEBPACK_IMPORTED_MODULE_0__/* .select */ .Ys)(this), words = text2.text().split(/(\s+|
)/).reverse(), word, line = [], lineHeight = 1.1, y = text2.attr("y"), dy = parseFloat(text2.attr("dy")), tspan = text2.text(null).append("tspan").attr("x", 0).attr("y", y).attr("dy", dy + "em"); + for (let j = 0; j < words.length; j++) { + word = words[words.length - 1 - j]; + line.push(word); + tspan.text(line.join(" ").trim()); + if (tspan.node().getComputedTextLength() > width || word === "
") { + line.pop(); + tspan.text(line.join(" ").trim()); + if (word === "
") { + line = [""]; + } else { + line = [word]; + } + tspan = text2.append("tspan").attr("x", 0).attr("y", y).attr("dy", lineHeight + "em").text(word); + } + } + }); +} +const drawNode = function(elem, node, fullSection, conf2) { + const section = fullSection % MAX_SECTIONS - 1; + const nodeElem = elem.append("g"); + node.section = section; + nodeElem.attr( + "class", + (node.class ? node.class + " " : "") + "timeline-node " + ("section-" + section) + ); + const bkgElem = nodeElem.append("g"); + const textElem = nodeElem.append("g"); + const txt = textElem.append("text").text(node.descr).attr("dy", "1em").attr("alignment-baseline", "middle").attr("dominant-baseline", "middle").attr("text-anchor", "middle").call(wrap, node.width); + const bbox = txt.node().getBBox(); + const fontSize = conf2.fontSize && conf2.fontSize.replace ? conf2.fontSize.replace("px", "") : conf2.fontSize; + node.height = bbox.height + fontSize * 1.1 * 0.5 + node.padding; + node.height = Math.max(node.height, node.maxHeight); + node.width = node.width + 2 * node.padding; + textElem.attr("transform", "translate(" + node.width / 2 + ", " + node.padding / 2 + ")"); + defaultBkg(bkgElem, node, section); + return node; +}; +const getVirtualNodeHeight = function(elem, node, conf2) { + const textElem = elem.append("g"); + const txt = textElem.append("text").text(node.descr).attr("dy", "1em").attr("alignment-baseline", "middle").attr("dominant-baseline", "middle").attr("text-anchor", "middle").call(wrap, node.width); + const bbox = txt.node().getBBox(); + const fontSize = conf2.fontSize && conf2.fontSize.replace ? conf2.fontSize.replace("px", "") : conf2.fontSize; + textElem.remove(); + return bbox.height + fontSize * 1.1 * 0.5 + node.padding; +}; +const defaultBkg = function(elem, node, section) { + const rd = 5; + elem.append("path").attr("id", "node-" + node.id).attr("class", "node-bkg node-" + node.type).attr( + "d", + `M0 ${node.height - rd} v${-node.height + 2 * rd} q0,-5 5,-5 h${node.width - 2 * rd} q5,0 5,5 v${node.height - rd} H0 Z` + ); + elem.append("line").attr("class", "node-line-" + section).attr("x1", 0).attr("y1", node.height).attr("x2", node.width).attr("y2", node.height); +}; +const svgDraw = { + drawRect, + drawCircle, + drawSection, + drawText, + drawLabel, + drawTask, + drawBackgroundRect, + getTextObj, + getNoteRect, + initGraphics, + drawNode, + getVirtualNodeHeight +}; +const setConf = function(cnf) { + const keys = Object.keys(cnf); + keys.forEach(function(key) { + conf[key] = cnf[key]; + }); +}; +const draw = function(text, id, version, diagObj) { + const conf2 = (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.g)(); + const LEFT_MARGIN = conf2.leftMargin ? conf2.leftMargin : 50; + diagObj.db.clear(); + diagObj.parser.parse(text + "\n"); + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.l.debug("timeline", diagObj.db); + const securityLevel = conf2.securityLevel; + let sandboxElement; + if (securityLevel === "sandbox") { + sandboxElement = (0,d3__WEBPACK_IMPORTED_MODULE_0__/* .select */ .Ys)("#i" + id); + } + const root = securityLevel === "sandbox" ? (0,d3__WEBPACK_IMPORTED_MODULE_0__/* .select */ .Ys)(sandboxElement.nodes()[0].contentDocument.body) : (0,d3__WEBPACK_IMPORTED_MODULE_0__/* .select */ .Ys)("body"); + const svg = root.select("#" + id); + svg.append("g"); + const tasks2 = diagObj.db.getTasks(); + const title = diagObj.db.getCommonDb().getDiagramTitle(); + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.l.debug("task", tasks2); + svgDraw.initGraphics(svg); + const sections2 = diagObj.db.getSections(); + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.l.debug("sections", sections2); + let maxSectionHeight = 0; + let maxTaskHeight = 0; + let depthY = 0; + let sectionBeginY = 0; + let masterX = 50 + LEFT_MARGIN; + let masterY = 50; + sectionBeginY = 50; + let sectionNumber = 0; + let hasSections = true; + sections2.forEach(function(section) { + const sectionNode = { + number: sectionNumber, + descr: section, + section: sectionNumber, + width: 150, + padding: 20, + maxHeight: maxSectionHeight + }; + const sectionHeight = svgDraw.getVirtualNodeHeight(svg, sectionNode, conf2); + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.l.debug("sectionHeight before draw", sectionHeight); + maxSectionHeight = Math.max(maxSectionHeight, sectionHeight + 20); + }); + let maxEventCount = 0; + let maxEventLineLength = 0; + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.l.debug("tasks.length", tasks2.length); + for (const [i, task] of tasks2.entries()) { + const taskNode = { + number: i, + descr: task, + section: task.section, + width: 150, + padding: 20, + maxHeight: maxTaskHeight + }; + const taskHeight = svgDraw.getVirtualNodeHeight(svg, taskNode, conf2); + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.l.debug("taskHeight before draw", taskHeight); + maxTaskHeight = Math.max(maxTaskHeight, taskHeight + 20); + maxEventCount = Math.max(maxEventCount, task.events.length); + let maxEventLineLengthTemp = 0; + for (let j = 0; j < task.events.length; j++) { + const event = task.events[j]; + const eventNode = { + descr: event, + section: task.section, + number: task.section, + width: 150, + padding: 20, + maxHeight: 50 + }; + maxEventLineLengthTemp += svgDraw.getVirtualNodeHeight(svg, eventNode, conf2); + } + maxEventLineLength = Math.max(maxEventLineLength, maxEventLineLengthTemp); + } + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.l.debug("maxSectionHeight before draw", maxSectionHeight); + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.l.debug("maxTaskHeight before draw", maxTaskHeight); + if (sections2 && sections2.length > 0) { + sections2.forEach((section) => { + const sectionNode = { + number: sectionNumber, + descr: section, + section: sectionNumber, + width: 150, + padding: 20, + maxHeight: maxSectionHeight + }; + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.l.debug("sectionNode", sectionNode); + const sectionNodeWrapper = svg.append("g"); + const node = svgDraw.drawNode(sectionNodeWrapper, sectionNode, sectionNumber, conf2); + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.l.debug("sectionNode output", node); + sectionNodeWrapper.attr("transform", `translate(${masterX}, ${sectionBeginY})`); + masterY += maxSectionHeight + 50; + const tasksForSection = tasks2.filter((task) => task.section === section); + if (tasksForSection.length > 0) { + drawTasks( + svg, + tasksForSection, + sectionNumber, + masterX, + masterY, + maxTaskHeight, + conf2, + maxEventCount, + maxEventLineLength, + maxSectionHeight, + false + ); + } + masterX += 200 * Math.max(tasksForSection.length, 1); + masterY = sectionBeginY; + sectionNumber++; + }); + } else { + hasSections = false; + drawTasks( + svg, + tasks2, + sectionNumber, + masterX, + masterY, + maxTaskHeight, + conf2, + maxEventCount, + maxEventLineLength, + maxSectionHeight, + true + ); + } + const box = svg.node().getBBox(); + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.l.debug("bounds", box); + if (title) { + svg.append("text").text(title).attr("x", box.width / 2 - LEFT_MARGIN).attr("font-size", "4ex").attr("font-weight", "bold").attr("y", 20); + } + depthY = hasSections ? maxSectionHeight + maxTaskHeight + 150 : maxTaskHeight + 100; + const lineWrapper = svg.append("g").attr("class", "lineWrapper"); + lineWrapper.append("line").attr("x1", LEFT_MARGIN).attr("y1", depthY).attr("x2", box.width + 3 * LEFT_MARGIN).attr("y2", depthY).attr("stroke-width", 4).attr("stroke", "black").attr("marker-end", "url(#arrowhead)"); + (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.s)( + void 0, + svg, + conf2.timeline.padding ? conf2.timeline.padding : 50, + conf2.timeline.useMaxWidth ? conf2.timeline.useMaxWidth : false + ); +}; +const drawTasks = function(diagram2, tasks2, sectionColor, masterX, masterY, maxTaskHeight, conf2, maxEventCount, maxEventLineLength, maxSectionHeight, isWithoutSections) { + for (const task of tasks2) { + const taskNode = { + descr: task.task, + section: sectionColor, + number: sectionColor, + width: 150, + padding: 20, + maxHeight: maxTaskHeight + }; + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.l.debug("taskNode", taskNode); + const taskWrapper = diagram2.append("g").attr("class", "taskWrapper"); + const node = svgDraw.drawNode(taskWrapper, taskNode, sectionColor, conf2); + const taskHeight = node.height; + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.l.debug("taskHeight after draw", taskHeight); + taskWrapper.attr("transform", `translate(${masterX}, ${masterY})`); + maxTaskHeight = Math.max(maxTaskHeight, taskHeight); + if (task.events) { + const lineWrapper = diagram2.append("g").attr("class", "lineWrapper"); + let linelength = maxTaskHeight; + masterY += 100; + linelength = linelength + drawEvents(diagram2, task.events, sectionColor, masterX, masterY, conf2); + masterY -= 100; + lineWrapper.append("line").attr("x1", masterX + 190 / 2).attr("y1", masterY + maxTaskHeight).attr("x2", masterX + 190 / 2).attr( + "y2", + masterY + maxTaskHeight + (isWithoutSections ? maxTaskHeight : maxSectionHeight) + maxEventLineLength + 120 + ).attr("stroke-width", 2).attr("stroke", "black").attr("marker-end", "url(#arrowhead)").attr("stroke-dasharray", "5,5"); + } + masterX = masterX + 200; + if (isWithoutSections && !(0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.g)().timeline.disableMulticolor) { + sectionColor++; + } + } + masterY = masterY - 10; +}; +const drawEvents = function(diagram2, events, sectionColor, masterX, masterY, conf2) { + let maxEventHeight = 0; + const eventBeginY = masterY; + masterY = masterY + 100; + for (const event of events) { + const eventNode = { + descr: event, + section: sectionColor, + number: sectionColor, + width: 150, + padding: 20, + maxHeight: 50 + }; + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.l.debug("eventNode", eventNode); + const eventWrapper = diagram2.append("g").attr("class", "eventWrapper"); + const node = svgDraw.drawNode(eventWrapper, eventNode, sectionColor, conf2); + const eventHeight = node.height; + maxEventHeight = maxEventHeight + eventHeight; + eventWrapper.attr("transform", `translate(${masterX}, ${masterY})`); + masterY = masterY + 10 + eventHeight; + } + masterY = eventBeginY; + return maxEventHeight; +}; +const renderer = { + setConf, + draw +}; +const genSections = (options) => { + let sections2 = ""; + for (let i = 0; i < options.THEME_COLOR_LIMIT; i++) { + options["lineColor" + i] = options["lineColor" + i] || options["cScaleInv" + i]; + if ((0,khroma__WEBPACK_IMPORTED_MODULE_12__/* ["default"] */ .Z)(options["lineColor" + i])) { + options["lineColor" + i] = (0,khroma__WEBPACK_IMPORTED_MODULE_13__/* ["default"] */ .Z)(options["lineColor" + i], 20); + } else { + options["lineColor" + i] = (0,khroma__WEBPACK_IMPORTED_MODULE_14__/* ["default"] */ .Z)(options["lineColor" + i], 20); + } + } + for (let i = 0; i < options.THEME_COLOR_LIMIT; i++) { + const sw = "" + (17 - 3 * i); + sections2 += ` + .section-${i - 1} rect, .section-${i - 1} path, .section-${i - 1} circle, .section-${i - 1} path { + fill: ${options["cScale" + i]}; + } + .section-${i - 1} text { + fill: ${options["cScaleLabel" + i]}; + } + .node-icon-${i - 1} { + font-size: 40px; + color: ${options["cScaleLabel" + i]}; + } + .section-edge-${i - 1}{ + stroke: ${options["cScale" + i]}; + } + .edge-depth-${i - 1}{ + stroke-width: ${sw}; + } + .section-${i - 1} line { + stroke: ${options["cScaleInv" + i]} ; + stroke-width: 3; + } + + .lineWrapper line{ + stroke: ${options["cScaleLabel" + i]} ; + } + + .disabled, .disabled circle, .disabled text { + fill: lightgray; + } + .disabled text { + fill: #efefef; + } + `; + } + return sections2; +}; +const getStyles = (options) => ` + .edge { + stroke-width: 3; + } + ${genSections(options)} + .section-root rect, .section-root path, .section-root circle { + fill: ${options.git0}; + } + .section-root text { + fill: ${options.gitBranchLabel0}; + } + .icon-container { + height:100%; + display: flex; + justify-content: center; + align-items: center; + } + .edge { + fill: none; + } + .eventWrapper { + filter: brightness(120%); + } +`; +const styles = getStyles; +const diagram = { + db, + renderer, + parser: parser$1, + styles +}; + +//# sourceMappingURL=timeline-definition-8e5a9bc6.js.map + + +/***/ }), + +/***/ 91619: +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + + +// EXPORTS +__webpack_require__.d(__webpack_exports__, { + Z: () => (/* binding */ is_dark) +}); + +// EXTERNAL MODULE: ./node_modules/khroma/dist/utils/index.js + 3 modules +var utils = __webpack_require__(61691); +// EXTERNAL MODULE: ./node_modules/khroma/dist/color/index.js + 4 modules +var dist_color = __webpack_require__(71610); +;// CONCATENATED MODULE: ./node_modules/khroma/dist/methods/luminance.js +/* IMPORT */ + + +/* MAIN */ +//SOURCE: https://planetcalc.com/7779 +const luminance = (color) => { + const { r, g, b } = dist_color/* default */.Z.parse(color); + const luminance = .2126 * utils/* default */.Z.channel.toLinear(r) + .7152 * utils/* default */.Z.channel.toLinear(g) + .0722 * utils/* default */.Z.channel.toLinear(b); + return utils/* default */.Z.lang.round(luminance); +}; +/* EXPORT */ +/* harmony default export */ const methods_luminance = (luminance); + +;// CONCATENATED MODULE: ./node_modules/khroma/dist/methods/is_light.js +/* IMPORT */ + +/* MAIN */ +const isLight = (color) => { + return methods_luminance(color) >= .5; +}; +/* EXPORT */ +/* harmony default export */ const is_light = (isLight); + +;// CONCATENATED MODULE: ./node_modules/khroma/dist/methods/is_dark.js +/* IMPORT */ + +/* MAIN */ +const isDark = (color) => { + return !is_light(color); +}; +/* EXPORT */ +/* harmony default export */ const is_dark = (isDark); + + +/***/ }) + +}; +; \ No newline at end of file diff --git a/assets/js/32227eef.91ab4d35.js b/assets/js/32227eef.91ab4d35.js new file mode 100644 index 0000000000..9bd05a2a00 --- /dev/null +++ b/assets/js/32227eef.91ab4d35.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5938],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=n.createContext({}),d=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},p=function(e){var t=d(e.components);return n.createElement(s.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,s=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),c=d(a),u=r,h=c["".concat(s,".").concat(u)]||c[u]||m[u]||i;return a?n.createElement(h,l(l({ref:t},p),{},{components:a})):n.createElement(h,l({ref:t},p))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,l=new Array(i);l[0]=u;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[c]="string"==typeof e?e:r,l[1]=o;for(var d=2;d{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>m,frontMatter:()=>i,metadata:()=>o,toc:()=>d});var n=a(87462),r=(a(67294),a(3905));const i={title:"Sovereign Cloud Standards YAML",type:"Procedural",status:"Draft",track:"Global"},l=void 0,o={unversionedId:"scs-0003-v1-sovereign-cloud-standards-yaml",id:"scs-0003-v1-sovereign-cloud-standards-yaml",title:"Sovereign Cloud Standards YAML",description:"Introduction",source:"@site/standards/scs-0003-v1-sovereign-cloud-standards-yaml.md",sourceDirName:".",slug:"/scs-0003-v1-sovereign-cloud-standards-yaml",permalink:"/standards/scs-0003-v1-sovereign-cloud-standards-yaml",draft:!1,tags:[],version:"current",frontMatter:{title:"Sovereign Cloud Standards YAML",type:"Procedural",status:"Draft",track:"Global"},sidebar:"standards",previous:{title:"SCS-0003: YAML Standards",permalink:"/standards/global/scs-0003"},next:{title:"IaaS Standards",permalink:"/standards/iaas/"}},s={},d=[{value:"Introduction",id:"introduction",level:2},{value:"Motivation",id:"motivation",level:2},{value:"Overview of mandatory SCS standards",id:"overview-of-mandatory-scs-standards",level:3},{value:"Lifecycle of certificate scopes",id:"lifecycle-of-certificate-scopes",level:3},{value:"Machine-readability for further processing",id:"machine-readability-for-further-processing",level:3},{value:"SCS Certification YAML",id:"scs-certification-yaml",level:2},{value:"Prerequisite",id:"prerequisite",level:3},{value:"Version descriptor",id:"version-descriptor",level:3},{value:"Standard descriptor",id:"standard-descriptor",level:3},{value:"Check tool descriptor",id:"check-tool-descriptor",level:3},{value:"Basic Example",id:"basic-example",level:3},{value:"Process",id:"process",level:2},{value:"Design Considerations",id:"design-considerations",level:2},{value:"File format",id:"file-format",level:3},{value:"Dependency graph for certifications",id:"dependency-graph-for-certifications",level:3},{value:"Tooling",id:"tooling",level:2},{value:"Open Questions",id:"open-questions",level:2},{value:"Acknowledgements",id:"acknowledgements",level:2}],p={toc:d},c="wrapper";function m(e){let{components:t,...a}=e;return(0,r.kt)(c,(0,n.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"introduction"},"Introduction"),(0,r.kt)("p",null,"The ",(0,r.kt)("a",{parentName:"p",href:"https://scs.community"},"Sovereign Cloud Stack (SCS)")," provides standards for a range of cloud infrastructure types.\nIt strives for interoperable and sovereign cloud offerings which can be deployed and used by a wide range of organizations and individuals."),(0,r.kt)("p",null,"SCS plans to offer six kinds of certificates with varying scope. These scopes can be sorted into two dimensions:"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("em",{parentName:"li"},"certification level"),", of which there are three:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"SCS-compatible"),(0,r.kt)("li",{parentName:"ul"},"SCS-open"),(0,r.kt)("li",{parentName:"ul"},"SCS-sovereign"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("em",{parentName:"li"},"cloud layer"),", of which there are two:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"infastructure as a service (IaaS)"),(0,r.kt)("li",{parentName:"ul"},"Kubernetes as a service (KaaS)")))),(0,r.kt)("p",null,"So, for instance, a certificate can have the scope ",(0,r.kt)("em",{parentName:"p"},"SCS-compatible IaaS")," or ",(0,r.kt)("em",{parentName:"p"},"SCS-sovereign KaaS"),".\nNote that we don't currently have separate certification layers for Operations and IAM.\nWe expect that tests for these aspects will exist, but be incorporated into the IaaS\nand KaaS layers."),(0,r.kt)("p",null,'Each certificate scope amounts to a set of standards that have to be fulfilled by the cloud service in question in order for a certificate to be issued.\nIn addition, a certificate with a certain scope may only be issued if some other certificate is already held.\nCase in point: the certification levels are meant to be seen as a progression, where the upper levels build on the lower ones, and\nthe certificate for "SCS-open IaaS" will only be issued if a certificate for "SCS-compatible IaaS" is already held.\nWe say that the latter certificate is a ',(0,r.kt)("em",{parentName:"p"},"prerequisite")," of the former."),(0,r.kt)("p",null,"Naturally, as the state of the art progresses, so do our certificates. We keep track of the changes by means of versioning.\nThat is to say that each certificate scope can come in several versions, each one of them having its distinct timespan when it is in effect.\nFor instance, we might have"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"SCS-compatible IaaS v1, effective 2021-01-01 through 2023-10-31"),(0,r.kt)("li",{parentName:"ul"},"SCS-compatible IaaS v2, effective 2023-03-23 through 2023-11-30")),(0,r.kt)("p",null,"and so on (but usually, we aim to keep at most two versions in effect, with an overlap of 4 to 6 weeks)."),(0,r.kt)("p",null,"This decision record describes two main points:"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"How we denote our certificate scopes by means of a YAML file."),(0,r.kt)("li",{parentName:"ol"},"Our process for constructing and progressing the certificate scopes.")),(0,r.kt)("h2",{id:"motivation"},"Motivation"),(0,r.kt)("p",null,"This decision record establishes a mechanism (by means of the YAML file) with the following three main objectives:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"to provide an overview of the mandatory standards for the different SCS certificate scopes"),(0,r.kt)("li",{parentName:"ul"},"to make the lifecycle of certificate scopes traceable"),(0,r.kt)("li",{parentName:"ul"},"to provide a machine-readable document for further processing (e.g. for a compliance tool suite or continuous integration).")),(0,r.kt)("h3",{id:"overview-of-mandatory-scs-standards"},"Overview of mandatory SCS standards"),(0,r.kt)("p",null,"Digging through a repository of draft, stable, replaced and rejected standards becomes increasingly challenging with a growing number\ndocuments and decision records. A central document that lists all mandatory standards to acquire a certificate with a certain scope can\nresolve this issue. It provides clarity for providers as well as users and helps to understand the value\nproposition of SCS."),(0,r.kt)("h3",{id:"lifecycle-of-certificate-scopes"},"Lifecycle of certificate scopes"),(0,r.kt)("p",null,"Standards and therefore certifications will evolve over time. To provide transparency and traceability for the lifecycle of SCS certificate\nscopes, the whole history of our certifications should be recorded. Pre-notification of changes to our certificate scopes allows\nusers to adapt their environments or deployment automation to the new standards in advance."),(0,r.kt)("h3",{id:"machine-readability-for-further-processing"},"Machine-readability for further processing"),(0,r.kt)("p",null,"By providing a machine-readable document, we can generate web-friendly overviews of our certificate scopes as well as create a tool suite\nthat checks environments against all described standards."),(0,r.kt)("h2",{id:"scs-certification-yaml"},"SCS Certification YAML"),(0,r.kt)("p",null,"Each certificate scope is recorded in a dedicated YAML file, e.g. ",(0,r.kt)("inlineCode",{parentName:"p"},"scs-open-kaas.yaml"),"."),(0,r.kt)("p",null,"The certification YAML ",(0,r.kt)("em",{parentName:"p"},"MUST")," contain the following keys:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Key"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"),(0,r.kt)("th",{parentName:"tr",align:null},"Example"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"name")),(0,r.kt)("td",{parentName:"tr",align:null},"String"),(0,r.kt)("td",{parentName:"tr",align:null},"Full name of this certificate scope"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"SCS Open KaaS"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"url")),(0,r.kt)("td",{parentName:"tr",align:null},"String"),(0,r.kt)("td",{parentName:"tr",align:null},"Valid URL to the latest raw version of this document"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"https://raw.githubusercontent.com/SovereignCloudStack/standards/main/Tests/scs-open-kaas.yaml"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"versions")),(0,r.kt)("td",{parentName:"tr",align:null},"Array of maps"),(0,r.kt)("td",{parentName:"tr",align:null},"List of version descriptors (described below)"),(0,r.kt)("td",{parentName:"tr",align:null},"(see below)")))),(0,r.kt)("p",null,"The certification YAML ",(0,r.kt)("em",{parentName:"p"},"MAY")," contain the following keys:"),(0,r.kt)("h3",{id:"prerequisite"},"Prerequisite"),(0,r.kt)("p",null,"A certificate within a certain level (above SCS-compatible) can only be granted if a valid corresponding certificate of the level below is presented,\nwhere corresponding means: of the same layer. The latter certificate is said to be a prerequisite for the former."),(0,r.kt)("p",null,"We implement this logic by allowing for the designation of a certificate scope as a prerequisite;\nthen a certificate of that prerequisite scope has to be presented before the certificate of the scope in question can be granted."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Key"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"),(0,r.kt)("th",{parentName:"tr",align:null},"Example"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"prerequisite")),(0,r.kt)("td",{parentName:"tr",align:null},"Map"),(0,r.kt)("td",{parentName:"tr",align:null},"Descriptor for the prerequisite certificate scope, if any"),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"prerequisite.name")),(0,r.kt)("td",{parentName:"tr",align:null},"String"),(0,r.kt)("td",{parentName:"tr",align:null},"Full name of the certificate scope"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"SCS Compatible IaaS"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"prerequisite.url")),(0,r.kt)("td",{parentName:"tr",align:null},"String"),(0,r.kt)("td",{parentName:"tr",align:null},"Valid URL to the latest raw version of the certificate scope"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},(0,r.kt)("a",{parentName:"em",href:"https://raw.githubusercontent.com/SovereignCloudStack/standards/main/Tests/scs-compatible-iaas.yaml"},"scs-compatible-iaas.yaml")))))),(0,r.kt)("h3",{id:"version-descriptor"},"Version descriptor"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Key"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"),(0,r.kt)("th",{parentName:"tr",align:null},"Example"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"version")),(0,r.kt)("td",{parentName:"tr",align:null},"String"),(0,r.kt)("td",{parentName:"tr",align:null},"Mandatory: Version of the particular list of standards"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"v3"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"standards")),(0,r.kt)("td",{parentName:"tr",align:null},"Array of maps"),(0,r.kt)("td",{parentName:"tr",align:null},"Mandatory: List of standard descriptors for this particular layer"),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"stabilized_at")),(0,r.kt)("td",{parentName:"tr",align:null},"Date"),(0,r.kt)("td",{parentName:"tr",align:null},"ISO formatted date indicating the date after this version is considered stable."),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"2022-11-09"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"obsoleted_at")),(0,r.kt)("td",{parentName:"tr",align:null},"Date"),(0,r.kt)("td",{parentName:"tr",align:null},"ISO formatted date indicating the date on which this version is expired."),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"2023-04-09"))))),(0,r.kt)("p",null,"Once a version has a ",(0,r.kt)("inlineCode",{parentName:"p"},"stabilized_at")," field, this field may not be changed. The same holds true for the ",(0,r.kt)("inlineCode",{parentName:"p"},"obsoleted_at")," field."),(0,r.kt)("p",null,"Note that at any point in time, all versions that are older (",(0,r.kt)("inlineCode",{parentName:"p"},"stabilized_at")," is at or before this point)\ncan be certified against, unless the version is already obsoleted (the point is after ",(0,r.kt)("inlineCode",{parentName:"p"},"obsoleted_at"),").\nThis means that more than one version may be allowable at a certain point in time. Tooling should default\nto use the newest allowable version (the one with the most recent ",(0,r.kt)("inlineCode",{parentName:"p"},"stabilized_at")," date) then."),(0,r.kt)("p",null,"Note: We intend to keep only one version in effect, except for a grace period of 4 to 6 weeks, when two versions\nare effective at the same time."),(0,r.kt)("h3",{id:"standard-descriptor"},"Standard descriptor"),(0,r.kt)("p",null,"Every list of standards consists of several standards that \u2013 altogether \u2013 define the particular layer standard in the given version."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Key"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"),(0,r.kt)("th",{parentName:"tr",align:null},"Example"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"name")),(0,r.kt)("td",{parentName:"tr",align:null},"String"),(0,r.kt)("td",{parentName:"tr",align:null},"Full name of the particular standard"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"Flavor naming"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"url")),(0,r.kt)("td",{parentName:"tr",align:null},"String"),(0,r.kt)("td",{parentName:"tr",align:null},"Valid URL to the latest raw version of the particular standard"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},(0,r.kt)("a",{parentName:"em",href:"https://raw.githubusercontent.com/SovereignCloudStack/standards/main/Standards/scs-0100-v2-flavor-naming.md"},"Flavor naming")))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"condition")),(0,r.kt)("td",{parentName:"tr",align:null},"String"),(0,r.kt)("td",{parentName:"tr",align:null},"State of the particular standard, currently either ",(0,r.kt)("inlineCode",{parentName:"td"},"mandatory")," or ",(0,r.kt)("inlineCode",{parentName:"td"},"optional"),", default is ",(0,r.kt)("inlineCode",{parentName:"td"},"mandatory")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"mandatory"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"check_tools")),(0,r.kt)("td",{parentName:"tr",align:null},"Array"),(0,r.kt)("td",{parentName:"tr",align:null},"List of check tool descriptors: listing all tools that must pass"),(0,r.kt)("td",{parentName:"tr",align:null})))),(0,r.kt)("h3",{id:"check-tool-descriptor"},"Check tool descriptor"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Key"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"),(0,r.kt)("th",{parentName:"tr",align:null},"Example"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"executable")),(0,r.kt)("td",{parentName:"tr",align:null},"String"),(0,r.kt)("td",{parentName:"tr",align:null},"Valid local filename (relative to the path of scs-compliance-check.py) of a script that verifies compliance with the particular standard"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"image-md-check.py"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"args")),(0,r.kt)("td",{parentName:"tr",align:null},"String"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"Optional")," list of arguments to be passed to the ",(0,r.kt)("inlineCode",{parentName:"td"},"check_tool"),". Preferably none needed."),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"-v"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"condition")),(0,r.kt)("td",{parentName:"tr",align:null},"String"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"Optionally")," overrides the per-standard condition (",(0,r.kt)("inlineCode",{parentName:"td"},"mandatory")," or ",(0,r.kt)("inlineCode",{parentName:"td"},"optional"),")"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"optional"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"classification")),(0,r.kt)("td",{parentName:"tr",align:null},"String"),(0,r.kt)("td",{parentName:"tr",align:null},"One of: ",(0,r.kt)("inlineCode",{parentName:"td"},"light")," (",(0,r.kt)("em",{parentName:"td"},"default"),"), ",(0,r.kt)("inlineCode",{parentName:"td"},"medium"),", ",(0,r.kt)("inlineCode",{parentName:"td"},"heavy"),"; describes the resource usage of the script; used to select an appropiate test interval"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"heavy"))))),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"Note"),": the ",(0,r.kt)("inlineCode",{parentName:"p"},"executable")," could in principle also be given via a URL; however, this is not yet supported due to security considerations."),(0,r.kt)("h3",{id:"basic-example"},"Basic Example"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},"name: SCS Open IaaS\nurl: https://raw.githubusercontent.com/SovereignCloudStack/Docs/main/Certification/scs-open-iaas.yaml\nprerequisite:\n name: SCS Compatible IaaS\n url: https://raw.githubusercontent.com/SovereignCloudStack/standards/main/Tests/scs-compatible-iaas.yaml\nversions:\n - version: v5 # This version is in a draft state and work in progress\n # No stabilized_at: date set yet\n standards:\n - name: Flavor naming\n url: https://raw.githubusercontent.com/SovereignCloudStack/standards/main/Standards/scs-0100-v2-flavor-naming.md\n condition: mandatory # is default and can be left out\n check_tools:\n - executable: flavor-name-check.py\n - name: Image metadata\n url: https://raw.githubusercontent.com/SovereignCloudStack/Docs/main/Standards/SCS-0004-v1-image-metadata.md\n condition: mandatory\n check_tools:\n - executable: image-md-check.py\n args: -v\n - executable: image-md-check2.py\n condition: optional\n - version: v4 # This is the upcoming version with a given target date. No further changes should be done to this set of standards\n stabilized_at: 2022-04-01\n standards:\n - name: ....\n\n - version: v3 # This is the stable set of standards that is currently active\n stabilized_at: 2021-10-01\n obsoleted_at: 2022-11-08\n standards:\n - name: ....\n\n - version: v2 # This set of standards is obsolete and has been replaced by v3\n stabilized_at: 2021-07-01\n obsoleted_at: 2021-11-01\n standards:\n - name: ....\nkaas:\n - ...\n")),(0,r.kt)("h2",{id:"process"},"Process"),(0,r.kt)("p",null,"The lifecycle any version of any certificate scope goes through the following phases:\nDraft, Stable, and Deprecated."),(0,r.kt)("mermaid",{value:"graph TD\n B[Draft] --\x3e|Pull Request| D[Stable]\n D --\x3e|Pull Request| F[Deprecated]"}),(0,r.kt)("p",null,"Note that one pull request can affect multiple versions, but each pull request has to affect\nat most one layer."),(0,r.kt)("p",null,"Each pull request is to be voted upon in the corresponding team meeting. The vote has to be\non the pull request only, i.e., it may not affect any other pull request or issue, and it\nmust be announced 14 days in advance via the corresponding mailing list."),(0,r.kt)("h2",{id:"design-considerations"},"Design Considerations"),(0,r.kt)("h3",{id:"file-format"},"File format"),(0,r.kt)("p",null,"In order to have a document that can be processed by a wide range of tools, we need to opt for a simple but yet well supported format.\nYAML offers readability for humans as well as good support by many frameworks. Since YAML is heavily used in the cloud and container\ndomain, the choice is obvious."),(0,r.kt)("h3",{id:"dependency-graph-for-certifications"},"Dependency graph for certifications"),(0,r.kt)("p",null,"This standard only allows exactly one depending certification, otherwise we would need to use a list of mappings. Since this is\nin accordance to the current plan of the SIG Standardization & Certification, we can safely ignore multiple dependency of\ncertification for now."),(0,r.kt)("h2",{id:"tooling"},"Tooling"),(0,r.kt)("p",null,"The SCS repository Docs has a tool ",(0,r.kt)("inlineCode",{parentName:"p"},"scs-compliance-check.py")," in the ",(0,r.kt)("inlineCode",{parentName:"p"},"Tests")," directory\nwhich parses the SCS Certification YAML and then runs the tests referenced there, returning the results\nof the tests."),(0,r.kt)("h2",{id:"open-questions"},"Open Questions"),(0,r.kt)("h2",{id:"acknowledgements"},"Acknowledgements"),(0,r.kt)("p",null,"This document is heavily inspired by the ",(0,r.kt)("a",{parentName:"p",href:"https://yml.publiccode.tools/"},"publiccode.yml standard"),", as published by the ",(0,r.kt)("a",{parentName:"p",href:"https://publiccode.net/"},"Foundation for Public Code"),"."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/343a1afc.185eefda.js b/assets/js/343a1afc.185eefda.js new file mode 100644 index 0000000000..96208d330d --- /dev/null +++ b/assets/js/343a1afc.185eefda.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7103],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>d});var n=r(67294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=n.createContext({}),p=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):c(c({},t),e)),r},s=function(e){var t=p(e.components);return n.createElement(l.Provider,{value:t},e.children)},u="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,s=a(e,["components","mdxType","originalType","parentName"]),u=p(r),f=o,d=u["".concat(l,".").concat(f)]||u[f]||g[f]||i;return r?n.createElement(d,c(c({ref:t},s),{},{components:r})):n.createElement(d,c({ref:t},s))}));function d(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,c=new Array(i);c[0]=f;var a={};for(var l in t)hasOwnProperty.call(t,l)&&(a[l]=t[l]);a.originalType=e,a[u]="string"==typeof e?e:o,c[1]=a;for(var p=2;p{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>c,default:()=>g,frontMatter:()=>i,metadata:()=>a,toc:()=>p});var n=r(87462),o=(r(67294),r(3905));const i={},c="Overview",a={unversionedId:"operating-scs/logging/index",id:"operating-scs/logging/index",title:"Overview",description:"TODO",source:"@site/docs/04-operating-scs/06-logging/index.md",sourceDirName:"04-operating-scs/06-logging",slug:"/operating-scs/logging/",permalink:"/docs/operating-scs/logging/",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/04-operating-scs/06-logging/index.md",tags:[],version:"current",frontMatter:{}},l={},p=[],s={toc:p},u="wrapper";function g(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"overview"},"Overview"),(0,o.kt)("p",null,"TODO"))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/35fbae7a.de4a7feb.js b/assets/js/35fbae7a.de4a7feb.js new file mode 100644 index 0000000000..49bfd44974 --- /dev/null +++ b/assets/js/35fbae7a.de4a7feb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2656],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>g});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),l=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=l(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=l(r),m=a,g=p["".concat(c,".").concat(m)]||p[m]||d[m]||o;return r?n.createElement(g,i(i({ref:t},u),{},{components:r})):n.createElement(g,i({ref:t},u))}));function g(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=m;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[p]="string"==typeof e?e:a,i[1]=s;for(var l=2;l{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var n=r(87462),a=(r(67294),r(3905));const o={title:"Getting Started Gaia-X Demonstrator @ plusserver",version:new Date("2022-12-22T00:00:00.000Z"),author:"Ralf Heiringhoff, Mathias Fechner"},i=void 0,s={unversionedId:"cloud-resources/plusserver-gx-scs",id:"cloud-resources/plusserver-gx-scs",title:"Getting Started Gaia-X Demonstrator @ plusserver",description:"Getting Started for the Gaia-X Demonstrator @ plusserver",source:"@site/community/cloud-resources/plusserver-gx-scs.md",sourceDirName:"cloud-resources",slug:"/cloud-resources/plusserver-gx-scs",permalink:"/community/cloud-resources/plusserver-gx-scs",draft:!1,tags:[],version:"current",frontMatter:{title:"Getting Started Gaia-X Demonstrator @ plusserver",version:"2022-12-22T00:00:00.000Z",author:"Ralf Heiringhoff, Mathias Fechner"},sidebar:"community",previous:{title:"Getting Started with OpenStack",permalink:"/community/cloud-resources/getting-started-openstack"},next:{title:"Getting Started with Wavestack",permalink:"/community/cloud-resources/wavestack"}},c={},l=[{value:"Getting Started for the Gaia-X Demonstrator @ plusserver",id:"getting-started-for-the-gaia-x-demonstrator--plusserver",level:2},{value:"URLs for access",id:"urls-for-access",level:2},{value:"Authentication (UI)",id:"authentication-ui",level:2},{value:"Getting Started with OpenStack",id:"getting-started-with-openstack",level:2}],u={toc:l},p="wrapper";function d(e){let{components:t,...r}=e;return(0,a.kt)(p,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"getting-started-for-the-gaia-x-demonstrator--plusserver"},"Getting Started for the Gaia-X Demonstrator @ plusserver"),(0,a.kt)("h2",{id:"urls-for-access"},"URLs for access"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"UI (Horizon): ",(0,a.kt)("a",{parentName:"li",href:"https://ui.gx-scs.sovereignit.cloud/"},"https://ui.gx-scs.sovereignit.cloud/")),(0,a.kt)("li",{parentName:"ul"},"API auth url (Keystone): ",(0,a.kt)("a",{parentName:"li",href:"https://api.gx-scs.sovereignit.cloud:5000"},"https://api.gx-scs.sovereignit.cloud:5000")),(0,a.kt)("li",{parentName:"ul"},"Object Storage endpoint (S3/SWIFT): ",(0,a.kt)("a",{parentName:"li",href:"https://api.gx-scs.sovereignit.cloud:8080"},"https://api.gx-scs.sovereignit.cloud:8080"))),(0,a.kt)("h2",{id:"authentication-ui"},"Authentication (UI)"),(0,a.kt)("p",null,"For your login you will need:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Username (",(0,a.kt)("inlineCode",{parentName:"li"},"u500924-"),")"),(0,a.kt)("li",{parentName:"ul"},"Password"),(0,a.kt)("li",{parentName:"ul"},"Domain (",(0,a.kt)("inlineCode",{parentName:"li"},"d500924"),")")),(0,a.kt)("h2",{id:"getting-started-with-openstack"},"Getting Started with OpenStack"),(0,a.kt)("p",null,"See ",(0,a.kt)("a",{parentName:"p",href:"/community/cloud-resources/getting-started-openstack"},"Getting Started with OpenStack")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/36f749d2.ee037847.js b/assets/js/36f749d2.ee037847.js new file mode 100644 index 0000000000..60dbc3d360 --- /dev/null +++ b/assets/js/36f749d2.ee037847.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5980],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var n=r(67294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var s=n.createContext({}),p=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},l="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,s=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),l=p(r),f=o,m=l["".concat(s,".").concat(f)]||l[f]||d[f]||a;return r?n.createElement(m,i(i({ref:t},u),{},{components:r})):n.createElement(m,i({ref:t},u))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=f;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c[l]="string"==typeof e?e:o,i[1]=c;for(var p=2;p{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>c,toc:()=>p});var n=r(87462),o=(r(67294),r(3905));const a={},i="Overview",c={unversionedId:"operating-scs/audits/index",id:"operating-scs/audits/index",title:"Overview",description:"TODO",source:"@site/docs/04-operating-scs/04-audits/index.md",sourceDirName:"04-operating-scs/04-audits",slug:"/operating-scs/audits/",permalink:"/docs/operating-scs/audits/",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/04-operating-scs/04-audits/index.md",tags:[],version:"current",frontMatter:{}},s={},p=[],u={toc:p},l="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(l,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"overview"},"Overview"),(0,o.kt)("p",null,"TODO"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/38b583d2.5ce52315.js b/assets/js/38b583d2.5ce52315.js new file mode 100644 index 0000000000..5e4695c382 --- /dev/null +++ b/assets/js/38b583d2.5ce52315.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9719],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>h});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),u=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=u(e.components);return a.createElement(s.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=u(n),m=r,h=d["".concat(s,".").concat(m)]||d[m]||c[m]||l;return n?a.createElement(h,o(o({ref:t},p),{},{components:n})):a.createElement(h,o({ref:t},p))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,o=new Array(l);o[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:r,o[1]=i;for(var u=2;u{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>c,frontMatter:()=>l,metadata:()=>i,toc:()=>u});var a=n(87462),r=(n(67294),n(3905));const l={title:"SCS k8s-cluster-api-provider upgrade guide",version:new Date("2023-09-07T00:00:00.000Z"),authors:"Kurt Garloff, Roman Hros, Matej Feder",state:"Draft (v0.7)"},o=void 0,i={unversionedId:"container/components/k8s-cluster-api-provider/doc/Upgrade-Guide",id:"container/components/k8s-cluster-api-provider/doc/Upgrade-Guide",title:"SCS k8s-cluster-api-provider upgrade guide",description:"SCS k8s-cluster-api-provider upgrade guide",source:"@site/docs/03-container/components/k8s-cluster-api-provider/doc/Upgrade-Guide.md",sourceDirName:"03-container/components/k8s-cluster-api-provider/doc",slug:"/container/components/k8s-cluster-api-provider/doc/Upgrade-Guide",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/Upgrade-Guide",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/03-container/components/k8s-cluster-api-provider/doc/Upgrade-Guide.md",tags:[],version:"current",frontMatter:{title:"SCS k8s-cluster-api-provider upgrade guide",version:"2023-09-07T00:00:00.000Z",authors:"Kurt Garloff, Roman Hros, Matej Feder",state:"Draft (v0.7)"},sidebar:"docs",previous:{title:"Ingress with externalTrafficPolicy: local",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/LoadBalancer-ExtTrafficLocal"},next:{title:"Roadmap",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/roadmap"}},s={},u=[{value:"SCS k8s-cluster-api-provider upgrade guide",id:"scs-k8s-cluster-api-provider-upgrade-guide",level:2},{value:"Management host (cluster) vs. Workload clusters",id:"management-host-cluster-vs-workload-clusters",level:2},{value:"Updating the management host",id:"updating-the-management-host",level:2},{value:"In-place upgrade",id:"in-place-upgrade",level:3},{value:"Operating system",id:"operating-system",level:4},{value:"k8s-cluster-api-provider git",id:"k8s-cluster-api-provider-git",level:4},{value:"Updating cluster-API and openstack cluster-API provider",id:"updating-cluster-api-and-openstack-cluster-api-provider",level:4},{value:"New templates",id:"new-templates",level:4},{value:"R2 to R3",id:"r2-to-r3",level:5},{value:"R3 to R4",id:"r3-to-r4",level:5},{value:"R4 to R5",id:"r4-to-r5",level:5},{value:"New defaults",id:"new-defaults",level:4},{value:"The clusterctl move approach",id:"the-clusterctl-move-approach",level:3},{value:"Updating workload clusters",id:"updating-workload-clusters",level:2},{value:"k8s version upgrade",id:"k8s-version-upgrade",level:3},{value:"On R2 clusters",id:"on-r2-clusters",level:4},{value:"On R3 and R4 clusters",id:"on-r3-and-r4-clusters",level:4},{value:"On R5 clusters",id:"on-r5-clusters",level:4},{value:"New versions for mandatory components",id:"new-versions-for-mandatory-components",level:3},{value:"New versions for optional components",id:"new-versions-for-optional-components",level:3},{value:"etcd leader changes",id:"etcd-leader-changes",level:3}],p={toc:u},d="wrapper";function c(e){let{components:t,...n}=e;return(0,r.kt)(d,(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"scs-k8s-cluster-api-provider-upgrade-guide"},"SCS k8s-cluster-api-provider upgrade guide"),(0,r.kt)("p",null,"This document explains the steps to upgrade the SCS Kubernetes cluster-API\nbased cluster management solution as follows:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"from the R2 (2022-03) to the R3 (2022-09) state"),(0,r.kt)("li",{parentName:"ul"},"from the R3 (2022-09) to the R4 state"),(0,r.kt)("li",{parentName:"ul"},"from the R4 (2023-09) to the R5 state\nThe document explains how the management cluster and the workload clusters can be\nupgraded without disruption. It is highly recommended to do a step-by-step upgrade\nacross major releases i.e. upgrade from R2 to R3 and then to R4 in the case of\nupgrade from the R2 to the R4. Upgrades across major releases without step-by-step\nprocess is not recommended and could lead to undocumented issues.")),(0,r.kt)("p",null,"The various steps are not very complicated, but there are numerous steps to\ntake, and it is advisable that cluster operators get some experience with\nthis kind of cluster management before applying this to customer clusters\nthat carry important workloads."),(0,r.kt)("p",null,"Note that while the detailed steps are tested and targeted to a R2 -> R3 move,\nR3 -> R4 move or R4 -> R5 move, many of the steps are a generic approach that will apply also for other\nupgrades, so expect a lot of similar steps when moving beyond R5."),(0,r.kt)("p",null,"Upgrades from cluster management prior to R2 is difficult; many changes before\nR2 assumed that you would redeploy the management cluster. Redeploying the\nmanagement cluster can of course always be done, but it's typically disruptive\nto your workload clusters, unless you move your cluster management state into\na new management cluster with ",(0,r.kt)("inlineCode",{parentName:"p"},"clusterctl move"),"."),(0,r.kt)("h2",{id:"management-host-cluster-vs-workload-clusters"},"Management host (cluster) vs. Workload clusters"),(0,r.kt)("p",null,"When you initially deployed the SCS k8s-cluster-api-provider, you create a\nVM with a ",(0,r.kt)("a",{parentName:"p",href:"https://kind.sigs.k8s.io/"},"kind")," cluster inside and a number of\ntemplates, scripts and binaries that are then used to do the cluster management.\nThis is your management host (or more precisely you single-host management\ncluster). Currently, all cluster management including upgrading etc. is done\nby connecting to this host via ssh and performing commands there. (You don't\nneed root privileges to do cluster management there, the normal ubuntu user\nrights are sufficient; there are obviously host management tasks such as\ninstalling package updates that do require root power and the user has the\nsudo rights to do so.)"),(0,r.kt)("p",null,"When you create the management host, you have the option to create your\nfirst workload cluster. This cluster is no different from other workload\nclusters that you create by calling commands on the management host, so you\ncan manage it there. (The default name of this cluster is typically\n",(0,r.kt)("inlineCode",{parentName:"p"},"testcluster"),", though that can be changed since a while, #264)."),(0,r.kt)("p",null,"On the management host, you have the openstack and kubernetes tools\ninstalled and configured, so you can nicely manage all aspects of your\nCaaS setups as well as the underlying IaaS. The kubectl configuration\nis in ",(0,r.kt)("inlineCode",{parentName:"p"},"~/.kube/config")," while you will find the OpenStack configuration\nin ",(0,r.kt)("inlineCode",{parentName:"p"},"~/.config/openstack/clouds.yaml"),". These files are automatically\nmanaged; you can add entries to the files though, and they should\npersist."),(0,r.kt)("h2",{id:"updating-the-management-host"},"Updating the management host"),(0,r.kt)("p",null,"There are two different possibilities to upgrade the management host."),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"You do a component-wise in-place upgrade of it."),(0,r.kt)("li",{parentName:"ol"},"You deploy a new management host and ",(0,r.kt)("inlineCode",{parentName:"li"},"clusterctl move")," the resources\nover to it from the old one. (Note: Config state in ",(0,r.kt)("inlineCode",{parentName:"li"},"~/CLUSTER_NAME/"),")")),(0,r.kt)("p",null,"TODO: Advice when to do what, risks, limitations"),(0,r.kt)("h3",{id:"in-place-upgrade"},"In-place upgrade"),(0,r.kt)("h4",{id:"operating-system"},"Operating system"),(0,r.kt)("p",null,"You should keep the host up-to-date with respect to normal operating system\nupgrades, so perform your normal ",(0,r.kt)("inlineCode",{parentName:"p"},"sudo apt-get update && sudo apt-get upgrade"),".\n",(0,r.kt)("inlineCode",{parentName:"p"},"kubectl"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"kustomize"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"yq"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"lxd")," and a few other tools are installed as\nsnaps, so you may want to upgrade these as well: ",(0,r.kt)("inlineCode",{parentName:"p"},"sudo snap refresh"),".\nFrom R5 ",(0,r.kt)("inlineCode",{parentName:"p"},"sudo apt-get install -y jq")," is also required as this is used by the diskless flavors feature, #424.\nDefault operating system image was changed from Ubuntu 20.04 to Ubuntu 22.04 in R4."),(0,r.kt)("h4",{id:"k8s-cluster-api-provider-git"},"k8s-cluster-api-provider git"),(0,r.kt)("p",null,"The automation is deployed on the management host by cloning ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/k8s-cluster-api-provider"},"the relevant\ngit repository"),".\ninto the ",(0,r.kt)("inlineCode",{parentName:"p"},"k8s-cluster-api-provider")," directory. Note that the checked out\nbranch will be the one that has been used when creating the management host,\nand you might want to change branches from ",(0,r.kt)("inlineCode",{parentName:"p"},"maintained/v3.x")," to ",(0,r.kt)("inlineCode",{parentName:"p"},"maintained/v4.x"),"\nin case of R2 to R3 upgrade, ",(0,r.kt)("inlineCode",{parentName:"p"},"maintained/v5.x")," for R3 to R4 upgrade, or ",(0,r.kt)("inlineCode",{parentName:"p"},"maintained/v6.x"),"\nfor R4 to R5 upgrade.\nUse ",(0,r.kt)("inlineCode",{parentName:"p"},"git branch -rl")," to see available branches in the k8s-cluster-api-provider\nrepository."),(0,r.kt)("p",null,"You can update the scripts and templates by checking out the relevant branch\n",(0,r.kt)("inlineCode",{parentName:"p"},"main"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"maintained/v4.x"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"maintained/v5.x"),", or ",(0,r.kt)("inlineCode",{parentName:"p"},"maintained/v6.x")," and using a ",(0,r.kt)("inlineCode",{parentName:"p"},"git pull")," to ensure\nthe latest content is retrieved. Once you do that, the cluster-management scripts\nwill be up-to-date. (The ",(0,r.kt)("inlineCode",{parentName:"p"},"~/bin")," directory in your search ",(0,r.kt)("inlineCode",{parentName:"p"},"PATH")," is symlinked to the\ncheck-ed out scripts.)"),(0,r.kt)("p",null,"Note however that the binaries and used templates are NOT automatically updated.\nThis should not normally result in problems -- when new features are introduced\nin the management scripts, they ensure to continue to support older templates."),(0,r.kt)("h4",{id:"updating-cluster-api-and-openstack-cluster-api-provider"},"Updating cluster-API and openstack cluster-API provider"),(0,r.kt)("p",null,"To get the latest version of cluster-API, you can download a new clusterctl\nbinary from ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api/releases"},"https://github.com/kubernetes-sigs/cluster-api/releases"),",\nmake it executable ",(0,r.kt)("inlineCode",{parentName:"p"},"chmod +x clusterctl")," and install it to ",(0,r.kt)("inlineCode",{parentName:"p"},"/usr/local/bin/"),",\npossibly saving the old binary by renaming it. ",(0,r.kt)("inlineCode",{parentName:"p"},"clusterctl version")," should now\ndisplay the current version number (v1.3.5 at the time of this writing)."),(0,r.kt)("p",null,"You can now issue the command ",(0,r.kt)("inlineCode",{parentName:"p"},"clusterctl upgrade plan")," and clusterctl will\nlist the components in your (kind) management cluster that can be upgraded.\nHere's an example output:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"ubuntu@capi-old-mgmtcluster:~ [0]$ clusterctl upgrade plan\nChecking cert-manager version...\nCert-Manager is already up to date\n\nChecking new release availability...\n\nLatest release available for the v1beta1 API Version of Cluster API (contract):\n\nNAME NAMESPACE TYPE CURRENT VERSION NEXT VERSION\nbootstrap-kubeadm capi-kubeadm-bootstrap-system BootstrapProvider v1.3.5 v1.5.1\ncontrol-plane-kubeadm capi-kubeadm-control-plane-system ControlPlaneProvider v1.3.5 v1.5.1\ncluster-api capi-system CoreProvider v1.3.5 v1.5.1\ninfrastructure-openstack capo-system InfrastructureProvider v0.7.1 v0.7.3\n\nYou can now apply the upgrade by executing the following command:\n\nclusterctl upgrade apply --contract v1beta1\n")),(0,r.kt)("p",null,"You can then upgrade the components. You can do them one-by-one or simply do\n",(0,r.kt)("inlineCode",{parentName:"p"},"clusterctl upgrade apply --contract v1beta1")),(0,r.kt)("h4",{id:"new-templates"},"New templates"),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"cluster-template.yaml")," template used for the workload clusters is located in\n",(0,r.kt)("inlineCode",{parentName:"p"},"~/k8s-cluster-api-provider/terraform/files/template/")," and copied from there into\n",(0,r.kt)("inlineCode",{parentName:"p"},"~/cluster-defaults/"),". Then workload clusters are created, they will also have a\ncopy of it in ",(0,r.kt)("inlineCode",{parentName:"p"},"~/${CLUSTER_NAME}/"),". If you have not changed it manually, you can\ncopy it over the old templates. (Consider backing up the old one though.)"),(0,r.kt)("p",null,"The next ",(0,r.kt)("inlineCode",{parentName:"p"},"create_cluster.sh ")," run will then use the new template.\nNote that ",(0,r.kt)("inlineCode",{parentName:"p"},"create_cluster.sh")," is idempotent -- it will not perform any changes\non the cluster unless you have changed its configuration by tweaking\n",(0,r.kt)("inlineCode",{parentName:"p"},"cluster-template.yaml")," (which you almost never do!) or ",(0,r.kt)("inlineCode",{parentName:"p"},"clusterctl.yaml"),"\n(which you do often)."),(0,r.kt)("p",null,"The other template file that changed -- however, some terraform logic is used to\nprefill it with values. So you can't copy it from git."),(0,r.kt)("h5",{id:"r2-to-r3"},"R2 to R3"),(0,r.kt)("p",null,"For going from R2 to R3, there is just one real change that you want\nto apply: Add the variables ",(0,r.kt)("inlineCode",{parentName:"p"},"CONTROL_PLANE_MACHINE_GEN: genc01")," and\n",(0,r.kt)("inlineCode",{parentName:"p"},"WORKER_MACHINE_GEN: genw01")," to it. If you have copied over the new\n",(0,r.kt)("inlineCode",{parentName:"p"},"cluster-template.yaml")," as described above, then you're done. Otherwise\nyou can use the script ",(0,r.kt)("inlineCode",{parentName:"p"},"update-R2-R3.sh "),"\nto tweak both ",(0,r.kt)("inlineCode",{parentName:"p"},"clusterctl.yaml")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"cluster-template.yaml")," for the\nrelevant cluster. (You can use ",(0,r.kt)("inlineCode",{parentName:"p"},"cluster-defaults")," to change the templates\nin ",(0,r.kt)("inlineCode",{parentName:"p"},"~/cluster-defaults/")," which get used when creating new clusters.)"),(0,r.kt)("h5",{id:"r3-to-r4"},"R3 to R4"),(0,r.kt)("p",null,"In the R3 to R4, CALICO_VERSION was moved from ",(0,r.kt)("inlineCode",{parentName:"p"},".capi-settings")," to ",(0,r.kt)("inlineCode",{parentName:"p"},"clusterctl.yaml"),". So\nbefore upgrading workload clusters, you must add it also to the ",(0,r.kt)("inlineCode",{parentName:"p"},"~/${CLUSTER_NAME}/clusterctl.yaml"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'echo "CALICO_VERSION: v3.25.0" >> ~/cluster-defaults/clusterctl.yaml\necho "CALICO_VERSION: v3.25.0" >> ~/testcluster/clusterctl.yaml\n')),(0,r.kt)("p",null,"In the R3 to R4 upgrade process, ",(0,r.kt)("inlineCode",{parentName:"p"},"cluster-template.yaml")," changed etcd defrag process in the\nkubeadm control-planes and also security group names by adding ",(0,r.kt)("inlineCode",{parentName:"p"},"${PREFIX}-")," to them, so it\nhas to be changed also in openstack project e.g. (",(0,r.kt)("em",{parentName:"p"},"PREFIX=capi"),"):"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"openstack security group set --name capi-allow-ssh allow-ssh\nopenstack security group set --name capi-allow-icmp allow-icmp\n")),(0,r.kt)("p",null,"We changed immutable fields in the Cluster API templates, so before running\n",(0,r.kt)("inlineCode",{parentName:"p"},"create_cluster.sh")," to upgrade existing workload cluster the ",(0,r.kt)("inlineCode",{parentName:"p"},"CONTROL_PLANE_MACHINE_GEN"),"\nand ",(0,r.kt)("inlineCode",{parentName:"p"},"WORKER_MACHINE_GEN")," needs to be incremented in cluster specific ",(0,r.kt)("inlineCode",{parentName:"p"},"clusterctl.yaml"),"."),(0,r.kt)("p",null,"In the R3 to R4 process, also ",(0,r.kt)("inlineCode",{parentName:"p"},"cloud.conf")," added ",(0,r.kt)("inlineCode",{parentName:"p"},"enable-ingress-hostname=true")," to the\nLoadBalancer section. It is due to ",(0,r.kt)("inlineCode",{parentName:"p"},"NGINX_INGRESS_PROXY")," defaulting to true now. So if\nyou want to use, or you are already using this proxy functionality we recommend you to\nadd this line to your ",(0,r.kt)("inlineCode",{parentName:"p"},"cloud.conf"),", e.g.:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'echo "enable-ingress-hostname=true" >> ~/cluster-defaults/cloud.conf\necho "enable-ingress-hostname=true" >> ~/testcluster/cloud.conf\n')),(0,r.kt)("p",null,"Then, before upgrading workload cluster by ",(0,r.kt)("inlineCode",{parentName:"p"},"create_cluster.sh"),",\nyou should delete cloud-config secret in the kube-system namespace, so it can be recreated. E.g.:\n",(0,r.kt)("inlineCode",{parentName:"p"},"kubectl delete secret cloud-config -n kube-system --kubeconfig=testcluster/testcluster.yaml")),(0,r.kt)("p",null,"Also, the default nginx-ingress version has changed, so we recommend before upgrading cluster\nto delete ingress-nginx jobs, so new job with new image can be created in the update process."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"kubectl delete job ingress-nginx-admission-create -n ingress-nginx --kubeconfig=testcluster/testcluster.yaml\nkubectl delete job ingress-nginx-admission-patch -n ingress-nginx --kubeconfig=testcluster/testcluster.yaml\n")),(0,r.kt)("h5",{id:"r4-to-r5"},"R4 to R5"),(0,r.kt)("p",null,"In R4 to R5, the ",(0,r.kt)("inlineCode",{parentName:"p"},"cluster-template.yaml")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"clusterctl.yaml")," changed (see release notes).\nYou can use script ",(0,r.kt)("inlineCode",{parentName:"p"},"update-R4-to-R5.sh")," to update the cluster's ",(0,r.kt)("inlineCode",{parentName:"p"},"cluster-template.yaml")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"clusterctl.yaml")," from\nR4 to R5. This script could update an existing Kubernetes cluster configuration files\nas well as ",(0,r.kt)("inlineCode",{parentName:"p"},"cluster-defaults")," files that could be used for spawning new R5 clusters."),(0,r.kt)("p",null,"If you want to update an existing cluster configuration files from R4 to R5, just use script as follows:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"update-R4-to-R5.sh \n")),(0,r.kt)("p",null,"After you executed the above you will find that e.g. Calico version has been bumped from\nv3.25.0 to v3.26.1. Note that some software versions are not configurable and are not\ndirectly mentioned in the cluster configuration files, but they are hardcoded\nin R5 scripts (e.g. ingress nginx controller, metrics server), see ",(0,r.kt)("a",{parentName:"p",href:"#new-defaults"},"new-defaults")," section.\nNote that the Kubernetes version was not updated as well the default CNI is not the Cilium yet.\nThis two R5 features are out of scope this script when it is applied on the existing cluster\nconfiguration files as this features require advanced action such as CNI migration\nand step-by-step Kubernetes upgrade of +2 minor releases."),(0,r.kt)("p",null,"If you want to update ",(0,r.kt)("inlineCode",{parentName:"p"},"cluster-defaults")," configuration files from R4 to R5, just use script as follows:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"update-R4-to-R5.sh cluster-defaults\n")),(0,r.kt)("p",null,"The above action updates a cluster-defaults configuration file, which is almost similar\nto updating an existing cluster configuration file described above. The distinction lies\nin the fact that both the Kubernetes version and the default CNI are also updated, specifically\nto Kubernetes version v1.27.5 and Cilium as a default CNI."),(0,r.kt)("p",null,"If you are curious: In R2, doing rolling upgrades of k8s versions required\nedits in ",(0,r.kt)("inlineCode",{parentName:"p"},"cluster-template.yaml")," -- this is no longer the case in R3, R4 and R5.\nJust increase the generation counter for node and control plane nodes if you\nupgrade k8s versions -- or otherwise change the worker or control plane\nnode specs, such as e.g. using a different flavor."),(0,r.kt)("h4",{id:"new-defaults"},"New defaults"),(0,r.kt)("p",null,"You deploy a CNI (calico or cilium), the OpenStack Cloud Controller\nManager (OCCM), the cinder CSI driver to clusters; optionally also a\nmetrics server (default is true), a nginx ingress controller (also\ndefaulting to true), the flux2 controller, the cert-manager.\nSome of these tools come with binaries that you can use for management\npurposes and which get installed on the management host in ",(0,r.kt)("inlineCode",{parentName:"p"},"/usr/local/bin/"),"."),(0,r.kt)("p",null,"The scripts that deploy these components into your workload clusters\ndownload the manifests into ",(0,r.kt)("inlineCode",{parentName:"p"},"~/kubernetes-manifests.d/")," with a version\nspecific name. If you request a new version, a new download will happen;\nalready existing versions will not be re-downloaded."),(0,r.kt)("p",null,"Most binaries in ",(0,r.kt)("inlineCode",{parentName:"p"},"/usr/local/bin/")," are not stored under a version-specific\nname. You need to rename them to case a re-download of a newer version.\n(The reason for not having version specific names is that this would\nbreak scripts from users that assume the unversioned names; the good\nnews is that most of these binaries have no trouble managing somewhat\nolder deployments, so you can typically work with the latest binary\ntool even if you have a variety of versions deployed into various\nclusters.)"),(0,r.kt)("p",null,"The defaults have changed as follows:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null}),(0,r.kt)("th",{parentName:"tr",align:null},"R2"),(0,r.kt)("th",{parentName:"tr",align:null},"R3"),(0,r.kt)("th",{parentName:"tr",align:null},"R4"),(0,r.kt)("th",{parentName:"tr",align:null},"R5"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"kind"),(0,r.kt)("td",{parentName:"tr",align:null},"v0.14.0"),(0,r.kt)("td",{parentName:"tr",align:null},"v0.14.0"),(0,r.kt)("td",{parentName:"tr",align:null},"v0.17.0"),(0,r.kt)("td",{parentName:"tr",align:null},"v0.20.0")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"capi"),(0,r.kt)("td",{parentName:"tr",align:null},"v1.0.5"),(0,r.kt)("td",{parentName:"tr",align:null},"v1.2.2"),(0,r.kt)("td",{parentName:"tr",align:null},"v1.3.5"),(0,r.kt)("td",{parentName:"tr",align:null},"v1.5.1")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"capo"),(0,r.kt)("td",{parentName:"tr",align:null},"v0.5.3"),(0,r.kt)("td",{parentName:"tr",align:null},"v0.6.3"),(0,r.kt)("td",{parentName:"tr",align:null},"v0.7.1"),(0,r.kt)("td",{parentName:"tr",align:null},"v0.7.3")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"helm"),(0,r.kt)("td",{parentName:"tr",align:null},"v3.8.1"),(0,r.kt)("td",{parentName:"tr",align:null},"v3.9.4"),(0,r.kt)("td",{parentName:"tr",align:null},"v3.11.1"),(0,r.kt)("td",{parentName:"tr",align:null},"v3.12.3")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"sonobuoy"),(0,r.kt)("td",{parentName:"tr",align:null},"v0.56.2"),(0,r.kt)("td",{parentName:"tr",align:null},"v0.56.10"),(0,r.kt)("td",{parentName:"tr",align:null},"v0.56.16"),(0,r.kt)("td",{parentName:"tr",align:null},"v0.56.17")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"k9s"),(0,r.kt)("td",{parentName:"tr",align:null},"unversioned"),(0,r.kt)("td",{parentName:"tr",align:null},"unversioned"),(0,r.kt)("td",{parentName:"tr",align:null},"unversioned"),(0,r.kt)("td",{parentName:"tr",align:null},"v0.27.4")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"calico"),(0,r.kt)("td",{parentName:"tr",align:null},"v3.22.1"),(0,r.kt)("td",{parentName:"tr",align:null},"v3.24.1"),(0,r.kt)("td",{parentName:"tr",align:null},"v3.25.0"),(0,r.kt)("td",{parentName:"tr",align:null},"v3.26.1")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"calico CLI"),(0,r.kt)("td",{parentName:"tr",align:null},"v3.22.1"),(0,r.kt)("td",{parentName:"tr",align:null},"v3.24.1"),(0,r.kt)("td",{parentName:"tr",align:null},"v3.25.0"),(0,r.kt)("td",{parentName:"tr",align:null},"v3.26.1")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"cilium"),(0,r.kt)("td",{parentName:"tr",align:null},"unversioned"),(0,r.kt)("td",{parentName:"tr",align:null},"unversioned"),(0,r.kt)("td",{parentName:"tr",align:null},"v1.13.0"),(0,r.kt)("td",{parentName:"tr",align:null},"v1.14.1")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"cilium CLI"),(0,r.kt)("td",{parentName:"tr",align:null},"unversioned"),(0,r.kt)("td",{parentName:"tr",align:null},"unversioned"),(0,r.kt)("td",{parentName:"tr",align:null},"v0.13.1"),(0,r.kt)("td",{parentName:"tr",align:null},"v0.15.7")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"hubble CLI"),(0,r.kt)("td",{parentName:"tr",align:null},"unversioned"),(0,r.kt)("td",{parentName:"tr",align:null},"unversioned"),(0,r.kt)("td",{parentName:"tr",align:null},"v0.11.2"),(0,r.kt)("td",{parentName:"tr",align:null},"v0.12.0")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"nginx-ingress"),(0,r.kt)("td",{parentName:"tr",align:null},"v1.1.2"),(0,r.kt)("td",{parentName:"tr",align:null},"v1.3.0"),(0,r.kt)("td",{parentName:"tr",align:null},"v1.6.4"),(0,r.kt)("td",{parentName:"tr",align:null},"v1.8.1")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"flux2"),(0,r.kt)("td",{parentName:"tr",align:null},"unversioned"),(0,r.kt)("td",{parentName:"tr",align:null},"unversioned"),(0,r.kt)("td",{parentName:"tr",align:null},"v0.40.2"),(0,r.kt)("td",{parentName:"tr",align:null},"v2.1.0")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"cert-manager"),(0,r.kt)("td",{parentName:"tr",align:null},"v1.7.1"),(0,r.kt)("td",{parentName:"tr",align:null},"v1.9.1"),(0,r.kt)("td",{parentName:"tr",align:null},"v1.11.0"),(0,r.kt)("td",{parentName:"tr",align:null},"v1.12.4")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"metrics-server"),(0,r.kt)("td",{parentName:"tr",align:null},"v0.6.1"),(0,r.kt)("td",{parentName:"tr",align:null},"v0.6.1"),(0,r.kt)("td",{parentName:"tr",align:null},"v0.6.1"),(0,r.kt)("td",{parentName:"tr",align:null},"v0.6.4")))),(0,r.kt)("h3",{id:"the-clusterctl-move-approach"},"The clusterctl move approach"),(0,r.kt)("p",null,"To be written"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Create new management host in same project -- avoid name conflicts\nwith different prefix, to be tweaked later. Avoid testcluster creation"),(0,r.kt)("li",{parentName:"ol"},"Ensure it's up and running ..."),(0,r.kt)("li",{parentName:"ol"},"Tweak prefix"),(0,r.kt)("li",{parentName:"ol"},"Copy over configs (and a bit of state though that's uncritical) by using\nthe directories"),(0,r.kt)("li",{parentName:"ol"},"Copy over the openstack credentials clouds.yaml and the kubectl config"),(0,r.kt)("li",{parentName:"ol"},"clusterctl move")),(0,r.kt)("h2",{id:"updating-workload-clusters"},"Updating workload clusters"),(0,r.kt)("h3",{id:"k8s-version-upgrade"},"k8s version upgrade"),(0,r.kt)("h4",{id:"on-r2-clusters"},"On R2 clusters"),(0,r.kt)("p",null,"The old way: Editing cluster-template.yaml. Or better use the\n",(0,r.kt)("inlineCode",{parentName:"p"},"update-R2-to-R3.sh")," script to convert first."),(0,r.kt)("h4",{id:"on-r3-and-r4-clusters"},"On R3 and R4 clusters"),(0,r.kt)("p",null,"Edit ",(0,r.kt)("inlineCode",{parentName:"p"},"~//clusterctl.yaml")," and put the wanted version into the\nfields ",(0,r.kt)("inlineCode",{parentName:"p"},"KUBERNETES_VERSION")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"OPENSTACK_IMAGE_NAME"),". The node image will\nbe downloaded from ",(0,r.kt)("a",{parentName:"p",href:"https://minio.services.osism.tech/openstack-k8s-capi-images"},"https://minio.services.osism.tech/openstack-k8s-capi-images"),"\nand registered if needed. (If you have updated the k8s-cluster-api-provider repo,\nyou can use a version v1.NN.x, where you fill in NN with the wanted k8s version,\nbut leave a literal ",(0,r.kt)("inlineCode",{parentName:"p"},".x")," which will get translated to the newest tested version.)"),(0,r.kt)("p",null,"In the same file, increase the generation counters for ",(0,r.kt)("inlineCode",{parentName:"p"},"CONTROL_PLANE_MACHINE_GEN"),"\nand ",(0,r.kt)("inlineCode",{parentName:"p"},"WORKER_MACHINE_GEN"),"."),(0,r.kt)("p",null,"Now do the normal ",(0,r.kt)("inlineCode",{parentName:"p"},"create_cluster.sh ")," and watch cluster-api\nreplace your worker nodes and doing a rolling upgrade of your control plane.\nIf you used a 3-node (or 5 or higher) control plane node setup, you will have\nuninterrupted access not just to your workloads but also the workload's cluster\ncontrol plane. Use ",(0,r.kt)("inlineCode",{parentName:"p"},"clusterctl describe cluster ")," or simply\n",(0,r.kt)("inlineCode",{parentName:"p"},"kubectl --context -admin@ get nodes -o wide"),"\nto watch the progress of this."),(0,r.kt)("h4",{id:"on-r5-clusters"},"On R5 clusters"),(0,r.kt)("p",null,"If you decide to migrate your existing Kubernetes cluster from R4 to R5 be aware of the following: "),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"R5 features such as per cluster namespaces and Cilium as a default CNI are supported\nonly on new clusters and will not be migrated on the existing clusters"),(0,r.kt)("li",{parentName:"ul"},"R4 default Kubernetes version v1.25.6 can not be directly migrated to the R5 default\nKubernetes version v1.27.5, because +2 minor Kubernetes version upgrade is ",(0,r.kt)("a",{parentName:"li",href:"https://cluster-api.sigs.k8s.io/tasks/experimental-features/cluster-class/operate-cluster.html?highlight=upgrade%20cluster#upgrade-a-cluster"},"not allowed"),".\nSee further migration steps below if you want to upgrade also Kubernetes version to R5")),(0,r.kt)("p",null,"Follow the below steps if you want to migrate an existing cluster from R4 to R5:"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Access your management node"),(0,r.kt)("li",{parentName:"ol"},"Checkout R5 tag",(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"cd k8s-cluster-api-provider\ngit pull\ngit checkout tags/v6.0.0\n"))),(0,r.kt)("li",{parentName:"ol"},"Backup an existing cluster configuration files (recommended)",(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"cd ..\ncp -R -backup\n"))),(0,r.kt)("li",{parentName:"ol"},"Update an existing cluster configuration files from R4 to R5:",(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"update-R4-to-R5.sh \n"))),(0,r.kt)("li",{parentName:"ol"},"Validate updated cluster configuration files. You will find that e.g. Calico version\nhas been bumped from v3.25.0 to v3.26.1. Note that some software versions are not configurable\nand are not directly mentioned in the cluster configuration files, but they are hardcoded\nin R5 scripts (e.g. ingress nginx controller, metrics server). Hence, read carefully the\nR5 release notes too. Also see that Kubernetes version was not updated, and it is still v1.25.6."),(0,r.kt)("li",{parentName:"ol"},"Update an existing cluster (expect Kubernetes version)",(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"create_cluster.sh \n"))),(0,r.kt)("li",{parentName:"ol"},"Update cluster-API and openstack cluster-API provider, see ",(0,r.kt)("a",{parentName:"li",href:"#updating-cluster-api-and-openstack-cluster-api-provider"},"related")," section for details",(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"}," clusterctl upgrade plan\n clusterctl upgrade apply --contract v1beta1\n"))),(0,r.kt)("li",{parentName:"ol"},"Bump Kubernetes version +1 minor release (to v1.26.8) and increase the generation counter for node and control plane nodes",(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sed -i 's/^KUBERNETES_VERSION: v1.25.6/KUBERNETES_VERSION: v1.26.8/' /clusterctl.yaml\nsed -i 's/^OPENSTACK_IMAGE_NAME: ubuntu-capi-image-v1.25.6/OPENSTACK_IMAGE_NAME: ubuntu-capi-image-v1.26.8/' /clusterctl.yaml\nsed -r 's/(^CONTROL_PLANE_MACHINE_GEN: genc)([0-9][0-9])/printf \"\\1%02d\" $((\\2+1))/ge' -i /clusterctl.yaml\nsed -r 's/(^WORKER_MACHINE_GEN: genw)([0-9][0-9])/printf \"\\1%02d\" $((\\2+1))/ge' -i /clusterctl.yaml\n"))),(0,r.kt)("li",{parentName:"ol"},"Update an existing cluster Kubernetes version to v1.26.8",(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"create_cluster.sh \n"))),(0,r.kt)("li",{parentName:"ol"},"Bump Kubernetes version to R5 v1.27.5 and increase the generation counter for node and control plane nodes",(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sed -i 's/^KUBERNETES_VERSION: v1.26.8/KUBERNETES_VERSION: v1.27.5/' /clusterctl.yaml\nsed -i 's/^OPENSTACK_IMAGE_NAME: ubuntu-capi-image-v1.26.8 /OPENSTACK_IMAGE_NAME: ubuntu-capi-image-v1.27.5/' /clusterctl.yaml\nsed -r 's/(^CONTROL_PLANE_MACHINE_GEN: genc)([0-9][0-9])/printf \"\\1%02d\" $((\\2+1))/ge' -i /clusterctl.yaml\nsed -r 's/(^WORKER_MACHINE_GEN: genw)([0-9][0-9])/printf \"\\1%02d\" $((\\2+1))/ge' -i /clusterctl.yaml\n"))),(0,r.kt)("li",{parentName:"ol"},"Update an existing cluster to the R5 Kubernetes version v1.27.5",(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"create_cluster.sh \n")))),(0,r.kt)("h3",{id:"new-versions-for-mandatory-components"},"New versions for mandatory components"),(0,r.kt)("p",null,"OCCM, CNI (calico/cilium), CSI"),(0,r.kt)("h3",{id:"new-versions-for-optional-components"},"New versions for optional components"),(0,r.kt)("p",null,"nginx, metrics (nothing to do), cert-manager, flux"),(0,r.kt)("h3",{id:"etcd-leader-changes"},"etcd leader changes"),(0,r.kt)("p",null,"While testing clusters with >= 3 control nodes, we have observed occasional transient\nerror messages that reported an etcd leader change preventing a command from succeeding.\nThis could result in a dozen of random failed tests in a sonobuoy conformance run.\n(Retrying the commands would let them succeed.)"),(0,r.kt)("p",null,"Too frequent etcd leader changes are detrimental to your control plane performance and\ncan lead to transient failures. They are a sign that the infrastructure supporting your\ncluster is introducing too high latencies."),(0,r.kt)("p",null,"We recommend to deploy the control nodes (which run etcd) on instances with local SSD\nstorage (which we reflect in the default flavor name) and recommend using flavors with\ndedicated cores and that your network does not introduce latencies by significant packet drop."),(0,r.kt)("p",null,"We now always use slower heartbeat (250ms) and increase CPU and IO priority which used to be\ncontrolled by ",(0,r.kt)("inlineCode",{parentName:"p"},"ETCD_PRIO_BOOST"),". This is safe."),(0,r.kt)("p",null,"If you build multi-controller clusters and can not use a flavor with low latency local storage\n(ideally SSD), you can also work around this with ",(0,r.kt)("inlineCode",{parentName:"p"},"ETCD_UNSAFE_FS"),". ",(0,r.kt)("inlineCode",{parentName:"p"},"ETCD_UNSAFE_FS")," is using\n",(0,r.kt)("inlineCode",{parentName:"p"},"barrier=0")," mount option, which violates filesystem ordering guarantees.\nThis works around storage latencies, but introduces the risk of inconsistent\nfilesystem state and inconsistent etcd data in case of an unclean shutdown.\nYou may be able to live with this risk in a multi-controller etcd setup.\nIf you don't have flavors that fulfill the requirements (low-latency\nstorage attached), your choice is between a single-controller cluster\n(without ",(0,r.kt)("inlineCode",{parentName:"p"},"ETCD_UNSAFE_FS"),") and a multi-controller cluster with\n",(0,r.kt)("inlineCode",{parentName:"p"},"ETCD_UNSAFE_FS"),". Neither option is perfect, but we deem the\nmulti-controller cluster preferable in such a scenario."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/38c9ef35.2ecdc10a.js b/assets/js/38c9ef35.2ecdc10a.js new file mode 100644 index 0000000000..66e5ca4510 --- /dev/null +++ b/assets/js/38c9ef35.2ecdc10a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8505],{3905:(t,e,a)=>{a.d(e,{Zo:()=>c,kt:()=>g});var n=a(67294);function r(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function l(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function o(t){for(var e=1;e=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var d=n.createContext({}),i=function(t){var e=n.useContext(d),a=e;return t&&(a="function"==typeof t?t(e):o(o({},e),t)),a},c=function(t){var e=i(t.components);return n.createElement(d.Provider,{value:e},t.children)},p="mdxType",u={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},m=n.forwardRef((function(t,e){var a=t.components,r=t.mdxType,l=t.originalType,d=t.parentName,c=s(t,["components","mdxType","originalType","parentName"]),p=i(a),m=r,g=p["".concat(d,".").concat(m)]||p[m]||u[m]||l;return a?n.createElement(g,o(o({ref:e},c),{},{components:a})):n.createElement(g,o({ref:e},c))}));function g(t,e){var a=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var l=a.length,o=new Array(l);o[0]=m;var s={};for(var d in e)hasOwnProperty.call(e,d)&&(s[d]=e[d]);s.originalType=t,s[p]="string"==typeof t?t:r,o[1]=s;for(var i=2;i{a.r(e),a.d(e,{assets:()=>d,contentTitle:()=>o,default:()=>u,frontMatter:()=>l,metadata:()=>s,toc:()=>i});var n=a(87462),r=(a(67294),a(3905));const l={},o="Global Standards",s={unversionedId:"global/index",id:"global/index",title:"Global Standards",description:"This track encompasses the foundational standards that guide the overall structure, documentation, and general topics related to the Sovereign Cloud Stack. It serves as the core framework, ensuring consistency, clarity, and comprehensibility across all aspects of the cloud stack, fostering an environment where information is easily accessible and understood.",source:"@site/standards/global/index.md",sourceDirName:"global",slug:"/global/",permalink:"/standards/global/",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"standards",previous:{title:"Overview",permalink:"/standards/standards/overview"},next:{title:"SCS-0001: SCS Standards",permalink:"/standards/global/scs-0001"}},d={},i=[],c={toc:i},p="wrapper";function u(t){let{components:e,...a}=t;return(0,r.kt)(p,(0,n.Z)({},c,a,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"global-standards"},"Global Standards"),(0,r.kt)("p",null,"This track encompasses the foundational standards that guide the overall structure, documentation, and general topics related to the Sovereign Cloud Stack. It serves as the core framework, ensuring consistency, clarity, and comprehensibility across all aspects of the cloud stack, fostering an environment where information is easily accessible and understood."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Standard"),(0,r.kt)("th",{parentName:"tr",align:null},"Most Recent Version"),(0,r.kt)("th",{parentName:"tr",align:null},"State"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"),(0,r.kt)("th",{parentName:"tr",align:null},"stabilized"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"/standards/global/scs-0001"},"SCS-001")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"/standards/scs-0001-v1-sovereign-cloud-standards"},"v1")),(0,r.kt)("td",{parentName:"tr",align:null},"\ud83d\udfe2 Stable"),(0,r.kt)("td",{parentName:"tr",align:null},"Sovereign Cloud Standards"),(0,r.kt)("td",{parentName:"tr",align:null},"2022-11-28")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"/standards/global/scs-0002"},"SCS-002")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"/standards/scs-0002-v2-standards-docs-org"},"v2")),(0,r.kt)("td",{parentName:"tr",align:null},"\ud83d\udfe2 Stable"),(0,r.kt)("td",{parentName:"tr",align:null},"Standards, Docs and Organisation"),(0,r.kt)("td",{parentName:"tr",align:null},"2023-03-08")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"/standards/global/scs-0003"},"SCS-003")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"/standards/scs-0003-v1-sovereign-cloud-standards-yaml"},"v1")),(0,r.kt)("td",{parentName:"tr",align:null},"\ud83d\udfe0 Draft"),(0,r.kt)("td",{parentName:"tr",align:null},"Sovereign Cloud Standards YAML"),(0,r.kt)("td",{parentName:"tr",align:null},"-")))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/39eb4dc7.68678439.js b/assets/js/39eb4dc7.68678439.js new file mode 100644 index 0000000000..57f1e14f24 --- /dev/null +++ b/assets/js/39eb4dc7.68678439.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2990],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var r=n(67294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=r.createContext({}),l=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},u=function(e){var t=l(e.components);return r.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var n=e.components,i=e.mdxType,o=e.originalType,s=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),p=l(n),h=i,m=p["".concat(s,".").concat(h)]||p[h]||d[h]||o;return n?r.createElement(m,a(a({ref:t},u),{},{components:n})):r.createElement(m,a({ref:t},u))}));function m(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=n.length,a=new Array(o);a[0]=h;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c[p]="string"==typeof e?e:i,a[1]=c;for(var l=2;l{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>c,toc:()=>l});var r=n(87462),i=(n(67294),n(3905));const o={},a="Developer Certificate of Origin + Licenses",c={unversionedId:"github/dco-and-licenses",id:"github/dco-and-licenses",title:"Developer Certificate of Origin + Licenses",description:"The Developer Certificate of Origin (DCO) is a lightweight way for contributors",source:"@site/community/github/dco-and-licenses.md",sourceDirName:"github",slug:"/github/dco-and-licenses",permalink:"/community/github/dco-and-licenses",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"community",previous:{title:"Branch Protection Rules",permalink:"/community/github/branchprotection"},next:{title:"Tips and Tricks",permalink:"/community/github/tips-and-tricks"}},s={},l=[{value:"Further reading",id:"further-reading",level:2}],u={toc:l},p="wrapper";function d(e){let{components:t,...o}=e;return(0,i.kt)(p,(0,r.Z)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"developer-certificate-of-origin--licenses"},"Developer Certificate of Origin + Licenses"),(0,i.kt)("p",null,"The Developer Certificate of Origin (DCO) is a lightweight way for contributors\nto certify that they wrote or otherwise have the right to submit the code they\nare contributing to the Sovereign Cloud Stack."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"By making a contribution to this project, I certify that:\n\n(a) The contribution was created in whole or in part by me and I\n have the right to submit it under the open source license\n indicated in the file; or\n\n(b) The contribution is based upon previous work that, to the best\n of my knowledge, is covered under an appropriate open source\n license and I have the right under that license to submit that\n work with modifications, whether created in whole or in part\n by me, under the same open source license (unless I am\n permitted to submit under a different license), as indicated\n in the file; or\n\n(c) The contribution was provided directly to me by some other\n person who certified (a), (b) or (c) and I have not modified\n it.\n\n(d) I understand and agree that this project and the contribution\n are public and that a record of the contribution (including all\n personal information I submit with it, including my sign-off) is\n maintained indefinitely and may be redistributed consistent with\n this project or the open source license(s) involved.\n")),(0,i.kt)("p",null,"All contributions to the Sovereign Cloud Stack are licensed under the\n(OSI approved) open source license of the upstream project being used therein\n(very often this is the ",(0,i.kt)("a",{parentName:"p",href:"https://www.apache.org/licenses/LICENSE-2.0"},"Apache Software License v2"),")."),(0,i.kt)("p",null,"Where we create independent code, we prefer to use the ",(0,i.kt)("a",{parentName:"p",href:"https://www.gnu.org/licenses/agpl-3.0.html"},"GNU Affero General Public License 3"),",\nexcept for interface code which we would put under LGPL-3 (weak copyleft).\nOwn documentation content is licensed under ",(0,i.kt)("a",{parentName:"p",href:"https://creativecommons.org/licenses/by-sa/4.0/"},"Creative Commons BY-SA 4.0"),"."),(0,i.kt)("p",null,"Contributors sign-off that they adhere to these requirements by adding a ",(0,i.kt)("inlineCode",{parentName:"p"},"Signed-off-by"),"\nline to commit messages."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"My fancy commit message\n\nSigned-off-by: Christian Berendt \n")),(0,i.kt)("p",null,"Git has a ",(0,i.kt)("inlineCode",{parentName:"p"},"-s")," command line option to append this automatically to your commit message:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"git commit -s -m 'My fancy commit message'\n")),(0,i.kt)("p",null,"The status of a pull request is set to failed if commits do not contain a valid ",(0,i.kt)("inlineCode",{parentName:"p"},"Signed-off-by")," line."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Failed DCO in GitHub",src:n(91274).Z,width:"1868",height:"864"})),(0,i.kt)("p",null,"Considerations behind the choice of AGPLv3, CC-BY-SA and the usage of the DCO can be found ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/docs/blob/main/community/license-considerations.md"},"license-considerations.md"),"."),(0,i.kt)("h2",{id:"further-reading"},"Further reading"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://developercertificate.org/"},"https://developercertificate.org/")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://julien.ponge.org/blog/developer-certificate-of-origin-versus-contributor-license-agreements/"},"https://julien.ponge.org/blog/developer-certificate-of-origin-versus-contributor-license-agreements/")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://lwn.net/Articles/592503/"},"https://lwn.net/Articles/592503/"))))}d.isMDXComponent=!0},91274:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/github-failed-dco-82f9dafea83c36769069087ceb522cdc.png"}}]); \ No newline at end of file diff --git a/assets/js/3a00f46c.eaf48fb4.js b/assets/js/3a00f46c.eaf48fb4.js new file mode 100644 index 0000000000..b6211c9c43 --- /dev/null +++ b/assets/js/3a00f46c.eaf48fb4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6876],{3905:(e,n,t)=>{t.d(n,{Zo:()=>p,kt:()=>h});var o=t(67294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function a(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);n&&(o=o.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,o)}return t}function i(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var u=o.createContext({}),s=function(e){var n=o.useContext(u),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},p=function(e){var n=s(e.components);return o.createElement(u.Provider,{value:n},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var n=e.children;return o.createElement(o.Fragment,{},n)}},m=o.forwardRef((function(e,n){var t=e.components,r=e.mdxType,a=e.originalType,u=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),d=s(t),m=r,h=d["".concat(u,".").concat(m)]||d[m]||c[m]||a;return t?o.createElement(h,i(i({ref:n},p),{},{components:t})):o.createElement(h,i({ref:n},p))}));function h(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var a=t.length,i=new Array(a);i[0]=m;var l={};for(var u in n)hasOwnProperty.call(n,u)&&(l[u]=n[u]);l.originalType=e,l[d]="string"==typeof e?e:r,i[1]=l;for(var s=2;s{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>i,default:()=>c,frontMatter:()=>a,metadata:()=>l,toc:()=>s});var o=t(87462),r=(t(67294),t(3905));const a={sidebar_label:"Zuul CI",sidebar_position:200},i="Zuul CI",l={unversionedId:"iaas/guides/other-guides/zuul",id:"iaas/guides/other-guides/zuul",title:"Zuul CI",description:"We use Zuul CI as a CI service for OSISM. The service is not required for",source:"@site/docs/02-iaas/guides/other-guides/zuul.md",sourceDirName:"02-iaas/guides/other-guides",slug:"/iaas/guides/other-guides/zuul",permalink:"/docs/iaas/guides/other-guides/zuul",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/other-guides/zuul.md",tags:[],version:"current",sidebarPosition:200,frontMatter:{sidebar_label:"Zuul CI",sidebar_position:200},sidebar:"docs",previous:{title:"Style Guide",permalink:"/docs/iaas/guides/other-guides/style-guide"},next:{title:"Components",permalink:"/docs/category/components"}},u={},s=[{value:"Installation",id:"installation",level:2},{value:"Server preparation",id:"server-preparation",level:3},{value:"Define secrets",id:"define-secrets",level:3},{value:"Github App setup",id:"github-app-setup",level:3},{value:"Example Playbook",id:"example-playbook",level:3},{value:"Troubleshooting",id:"troubleshooting",level:2},{value:"Your git repos are not displayed?",id:"your-git-repos-are-not-displayed",level:3},{value:"Your git repos are using the wrong branch?",id:"your-git-repos-are-using-the-wrong-branch",level:3},{value:"Your logs are not displayed in the web-UI?",id:"your-logs-are-not-displayed-in-the-web-ui",level:3}],p={toc:s},d="wrapper";function c(e){let{components:n,...t}=e;return(0,r.kt)(d,(0,o.Z)({},p,t,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"zuul-ci"},"Zuul CI"),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"We use Zuul CI as a CI service for OSISM. The service is not required for\nthe use of OSISM itself. However, as we deploy and provide Zuul CI ourselves,\nthe documentation for this is also included in the OSISM deploy guide.")),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"osism.services.zuul")," is the Ansible role to set up Zuul CI as a single-node\ninstallation with Docker Compose."),(0,r.kt)("h2",{id:"installation"},"Installation"),(0,r.kt)("h3",{id:"server-preparation"},"Server preparation"),(0,r.kt)("p",null,"Set up a server (VM) with Ubuntu Server 22.04 LTS and make\nsure that these packages are installed:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"docker.io"),(0,r.kt)("li",{parentName:"ul"},"docker-compose"),(0,r.kt)("li",{parentName:"ul"},"python3-docker"),(0,r.kt)("li",{parentName:"ul"},"python3-openstackclient")),(0,r.kt)("p",null,"Also configure your deploy user to be in the docker group and set up the\naccount for the zuul user. TCP-Ports 80 and 443 should be accessible\nfrom the internet, port 22 for management via SSH will also often be\nuseful, but not required."),(0,r.kt)("p",null,"If you have an OpenStack tenant where you want to deploy the Zuul\nserver, you can download and adapt this example\nplaybook:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},'---\n- name: Setup zuul server\n hosts: localhost\n vars:\n cloud: mycloud\n flavor: myflavor\n image: Ubuntu 22.04\n keypair: mykeypair\n network: myprivatenet\n project: myproject\n zuul_domain: mydomain.xyz.\n zuul_fqdn: "zuul01.services.{{ zuul_domain }}"\n zuul_host: zuul01\n\n tasks:\n - name: Create security group\n openstack.cloud.security_group:\n cloud: "{{ cloud }}"\n name: "{{ project }}-zuul"\n description: "Default security group for {{ project }}-zuul"\n\n - name: Create security group rule (icmp)\n openstack.cloud.security_group_rule:\n cloud: "{{ cloud }}"\n security_group: "{{ project }}-zuul"\n protocol: icmp\n remote_ip_prefix: 0.0.0.0/0\n\n - name: Create security group rules (tcp)\n openstack.cloud.security_group_rule:\n cloud: "{{ cloud }}"\n security_group: "{{ project }}-zuul"\n protocol: tcp\n remote_ip_prefix: 0.0.0.0/0\n port_range_min: "{{ item }}"\n port_range_max: "{{ item }}"\n loop:\n - 22\n - 80\n - 443\n\n - name: Create zuul server\n openstack.cloud.server:\n cloud: "{{ cloud }}"\n flavor: "{{ flavor }}"\n image: "{{ image }}"\n key_name: "{{ keypair }}"\n name: "{{ zuul_host }}"\n network: "{{ network }}"\n security_groups:\n - default\n - "{{ project }}-zuul"\n meta:\n hostname: "{{ zuul_host }}"\n register: zuul_server\n\n - name: Add host\n ansible.builtin.add_host:\n name: "{{ zuul_server.openstack.accessIPv4 }}"\n groups: zuul\n ansible_user: ubuntu\n\n- name: Initialize zuul server\n hosts: zuul\n gather_facts: false\n vars:\n zuul_user: zuul\n\n tasks:\n - name: Wait for system to become reachable\n ansible.builtin.wait_for_connection:\n\n - name: Update all packages\n ansible.builtin.apt:\n update_cache: true\n name: \'*\'\n state: latest\n become: true\n\n - name: Install required packages\n ansible.builtin.apt:\n name:\n - docker.io\n - docker-compose\n - python3-docker\n - python3-openstackclient\n become: true\n\n - name: Add user to docker group\n ansible.builtin.user:\n name: "{{ ansible_ssh_user }}"\n groups: docker\n append: true\n become: true\n\n - name: Add group\n ansible.builtin.group:\n name: "{{ zuul_user }}"\n become: true\n\n - name: Add user\n ansible.builtin.user:\n name: "{{ zuul_user }}"\n uid: 10001\n shell: /bin/bash\n group: "{{ zuul_user }}"\n groups: sudo\n append: true\n home: "/home/{{ zuul_user }}"\n become: true\n')),(0,r.kt)("h3",{id:"define-secrets"},"Define secrets"),(0,r.kt)("p",null,"There need to be some secrets handed to the deployment, the suggested\nmethod is to have a dedicated file that contains them, which will be\nincluded in the example playbook below via a ",(0,r.kt)("inlineCode",{parentName:"p"},"vars_files")," statement.\nThis allows you to easily protect all your secrets by applying\n",(0,r.kt)("inlineCode",{parentName:"p"},"ansible-vault encrypt")," to that file. The contents of this file should\nlook like:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},"---\nzuul_auth_secret: secret used for zuul web auth\nwebhook_token: token defined for github webhooks\ndb_user_pass: DB password for the zuul user\ndb_root_pass: DB root password\n")),(0,r.kt)("p",null,"In addition you need to prepare some further data that needs to be\nplaced into a ",(0,r.kt)("inlineCode",{parentName:"p"},"files")," directory in order to be consumed by the zuul\nrole. These are:"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"A ",(0,r.kt)("inlineCode",{parentName:"li"},"clouds.yaml")," file for nodepool. This will be used by\n",(0,r.kt)("inlineCode",{parentName:"li"},"nodepool-builder")," to upload the newly created images and by\n",(0,r.kt)("inlineCode",{parentName:"li"},"nodepool-launcher")," to start instances running these images, these\nwill then be handed over to Zuul as CI nodes."),(0,r.kt)("li",{parentName:"ol"},"An SSH private key in the file ",(0,r.kt)("inlineCode",{parentName:"li"},"nodepool")," and the matching public\nkey in ",(0,r.kt)("inlineCode",{parentName:"li"},"nodepool.pub"),". These will be used by nodepool and zuul to\naccess the CI nodes via SSH."),(0,r.kt)("li",{parentName:"ol"},"An SSL private key and certificate pasted together in a file\nnamed ",(0,r.kt)("inlineCode",{parentName:"li"},"server.crt"),". This file will be used in the https setup by\nthe webserver. The certificate should cover both ",(0,r.kt)("inlineCode",{parentName:"li"},"zuul_webserver_fqdn"),"\nand ",(0,r.kt)("inlineCode",{parentName:"li"},"zuul_logserver_fqdn"),".")),(0,r.kt)("h3",{id:"github-app-setup"},"Github App setup"),(0,r.kt)("p",null,"In order for zuul to be able to interact with repositories hosted on\ngithub, you need to set up a github application. Follow the instructions\nat ",(0,r.kt)("a",{parentName:"p",href:"https://zuul-ci.org/docs/zuul/latest/drivers/github.html#application"},"https://zuul-ci.org/docs/zuul/latest/drivers/github.html#application"),"\nto do this. The webhook token to use is the one defined in the\npervious section. Use ",(0,r.kt)("inlineCode",{parentName:"p"},"github")," in place of ",(0,r.kt)("inlineCode",{parentName:"p"},"")," for the\nWebhook URL in the app configuration. After the app has been created,\nplace the PEM files that you downloaded into a\ndirectory named ",(0,r.kt)("inlineCode",{parentName:"p"},"pem-files"),":"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ mkdir -p pem-files\n$ cp ~/Downloads/my-org-zuul.*.private-key.pem pem-files/my-org-zuul.pem\n")),(0,r.kt)("p",null,"Now add the information about your github app to ",(0,r.kt)("inlineCode",{parentName:"p"},"vars.yml"),":"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"github_app_id: 000000\ngithub_pem_name: my-org-zuul\n")),(0,r.kt)("h3",{id:"example-playbook"},"Example Playbook"),(0,r.kt)("p",null,"Save this file as ",(0,r.kt)("inlineCode",{parentName:"p"},"main.yaml"),":"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},'---\n- name: Set up zuul\n hosts: zuul.example.com\n vars_files:\n - vars.yml\n pre_tasks:\n - name: Create /etc/openstack/\n ansible.builtin.file:\n state: directory\n path: /etc/openstack\n owner: root\n group: root\n mode: 0755\n become: true\n\n - name: Deploy clouds.yaml file\n ansible.builtin.copy:\n src: clouds.yaml\n dest: /etc/openstack/clouds.yaml\n owner: root\n group: zuul\n mode: \'0640\'\n become: true\n\n - name: Create keypair in the cloud\n openstack.cloud.keypair:\n cloud: osism-ci\n name: osism-zuul\n public_key: "{{ lookup(\'file\', \'nodepool.pub\') }}"\n become: true\n\n roles:\n - name: Execute zuul role\n role: zuul\n vars:\n zuul_connections:\n github:\n driver: github\n webhook_token: "{{ webhook_token }}"\n app_id: "{{ github_app_id }}"\n app_key: "/etc/zuul/pem-files/{{ github_pem_name }}.pem"\n opendevorg:\n name: opendev\n driver: git\n baseurl: https://opendev.org\n zuul_tenants:\n - tenant:\n name: my-tenant-name\n source:\n opendevorg:\n untrusted-projects:\n - zuul/zuul-jobs:\n include:\n - job\n github:\n config-projects:\n - my-org/zuul_demo_config:\n load-branch: main\n untrusted-projects:\n - my-org/zuul_demo_repo\n become: true\n')),(0,r.kt)("p",null,"Create an ",(0,r.kt)("inlineCode",{parentName:"p"},"inventory")," file containing the login information for your zuul\nserver, it might look like:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"zuul.example.com ansible_host=192.0.2.2 ansible_user=ubuntu\n")),(0,r.kt)("p",null,"Then you can deploy your zuul server by running:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"ansible-playbook -i inventory main.yaml\n")),(0,r.kt)("p",null,"This will deploy a simple zuul setup with sample example repos being\nreferenced. You can fork the example repos from the\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/osism"},"https://github.com/osism")," tenant or just use them as a guide for how\nto build your own."),(0,r.kt)("p",null,"For further information about how to tune this setup for\nyou specific environment, have a look at the sections covering\nnodepool and tenant configuration."),(0,r.kt)("h2",{id:"troubleshooting"},"Troubleshooting"),(0,r.kt)("h3",{id:"your-git-repos-are-not-displayed"},"Your git repos are not displayed?"),(0,r.kt)("p",null,"Have you thought of naming your repos with the prefix of your organization? ",(0,r.kt)("inlineCode",{parentName:"p"},"release")," should be ",(0,r.kt)("inlineCode",{parentName:"p"},"osism/release")," for example."),(0,r.kt)("h3",{id:"your-git-repos-are-using-the-wrong-branch"},"Your git repos are using the wrong branch?"),(0,r.kt)("p",null,"For ",(0,r.kt)("inlineCode",{parentName:"p"},"config-projects")," you set this value in the tenant-configuration with the ",(0,r.kt)("inlineCode",{parentName:"p"},"load-branch")," stanza.\nFor ",(0,r.kt)("inlineCode",{parentName:"p"},"untrusted-projects")," you set this value in the config-projects ",(0,r.kt)("inlineCode",{parentName:"p"},"project")," sections AND in EVERY ",(0,r.kt)("inlineCode",{parentName:"p"},"untrusted-project"),".\nEach ",(0,r.kt)("inlineCode",{parentName:"p"},"project")," section needs to have the ",(0,r.kt)("inlineCode",{parentName:"p"},"default-branch")," stanza."),(0,r.kt)("h3",{id:"your-logs-are-not-displayed-in-the-web-ui"},"Your logs are not displayed in the web-UI?"),(0,r.kt)("p",null,"Check, if the IP of the logfile server is really correct. In combination with GitHub there is a\nbug which keeps the GitHub App posting to the old IP even if the webhook IP was changed. Current\nworkaround: Delete the old GitHub App and create a new one."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3bf9fbe6.8f219a6a.js b/assets/js/3bf9fbe6.8f219a6a.js new file mode 100644 index 0000000000..300be25637 --- /dev/null +++ b/assets/js/3bf9fbe6.8f219a6a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9899],{18715:e=>{e.exports=JSON.parse('{"title":"Releases","slug":"/category/releases","permalink":"/docs/category/releases","navigation":{"previous":{"title":"Proposal for documentation for Keycloak to Keycloak Federation (WebSSO)","permalink":"/docs/iam/intra-SCS-federation-setup-description-for-osism-doc-operations"},"next":{"title":"Release Notes for SCS Release 0","permalink":"/docs/releases/Release0"}}}')}}]); \ No newline at end of file diff --git a/assets/js/3d19221e.556718cc.js b/assets/js/3d19221e.556718cc.js new file mode 100644 index 0000000000..e0d5912168 --- /dev/null +++ b/assets/js/3d19221e.556718cc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7856],{3905:(e,t,n)=>{n.d(t,{Zo:()=>l,kt:()=>g});var r=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=r.createContext({}),m=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},l=function(e){var t=m(e.components);return r.createElement(c.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),u=m(n),d=o,g=u["".concat(c,".").concat(d)]||u[d]||p[d]||a;return n?r.createElement(g,i(i({ref:t},l),{},{components:n})):r.createElement(g,i({ref:t},l))}));function g(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=d;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[u]="string"==typeof e?e:o,i[1]=s;for(var m=2;m{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>a,metadata:()=>s,toc:()=>m});var r=n(87462),o=(n(67294),n(3905));const a={sidebar_label:"Commons",sidebar_position:30},i="Commons",s={unversionedId:"iaas/guides/configuration-guide/commons/index",id:"iaas/guides/configuration-guide/commons/index",title:"Commons",description:"This section contains the documentation of the Ansible collection osism.commons.",source:"@site/docs/02-iaas/guides/configuration-guide/commons/index.md",sourceDirName:"02-iaas/guides/configuration-guide/commons",slug:"/iaas/guides/configuration-guide/commons/",permalink:"/docs/iaas/guides/configuration-guide/commons/",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/configuration-guide/commons/index.md",tags:[],version:"current",sidebarPosition:30,frontMatter:{sidebar_label:"Commons",sidebar_position:30},sidebar:"docs",previous:{title:"Manager",permalink:"/docs/iaas/guides/configuration-guide/manager"},next:{title:"Network",permalink:"/docs/iaas/guides/configuration-guide/commons/network"}},c={},m=[],l={toc:m},u="wrapper";function p(e){let{components:t,...n}=e;return(0,o.kt)(u,(0,r.Z)({},l,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"commons"},"Commons"),(0,o.kt)("p",null,"This section contains the documentation of the Ansible collection ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/osism/ansible-collection-commons"},"osism.commons"),"."),(0,o.kt)("table",null,(0,o.kt)("thead",{parentName:"table"},(0,o.kt)("tr",{parentName:"thead"},(0,o.kt)("th",{parentName:"tr",align:null},(0,o.kt)("strong",{parentName:"th"},"Role")),(0,o.kt)("th",{parentName:"tr",align:null},(0,o.kt)("strong",{parentName:"th"},"Description")))),(0,o.kt)("tbody",{parentName:"table"},(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"osism.commons.network"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"osism.commons.packages"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"osism.commons.services"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"osism.commons.sshconfig"),(0,o.kt)("td",{parentName:"tr",align:null})),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"osism.commons.timezone"),(0,o.kt)("td",{parentName:"tr",align:null})))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3e493f26.8bc7968d.js b/assets/js/3e493f26.8bc7968d.js new file mode 100644 index 0000000000..d91947f71f --- /dev/null +++ b/assets/js/3e493f26.8bc7968d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1757],{3905:(e,r,t)=>{t.d(r,{Zo:()=>s,kt:()=>d});var n=t(67294);function o(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function a(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function i(e){for(var r=1;r=0||(o[t]=e[t]);return o}(e,r);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var l=n.createContext({}),p=function(e){var r=n.useContext(l),t=r;return e&&(t="function"==typeof e?e(r):i(i({},r),e)),t},s=function(e){var r=p(e.components);return n.createElement(l.Provider,{value:r},e.children)},u="mdxType",f={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},v=n.forwardRef((function(e,r){var t=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),u=p(t),v=o,d=u["".concat(l,".").concat(v)]||u[v]||f[v]||a;return t?n.createElement(d,i(i({ref:r},s),{},{components:t})):n.createElement(d,i({ref:r},s))}));function d(e,r){var t=arguments,o=r&&r.mdxType;if("string"==typeof e||o){var a=t.length,i=new Array(a);i[0]=v;var c={};for(var l in r)hasOwnProperty.call(r,l)&&(c[l]=r[l]);c.originalType=e,c[u]="string"==typeof e?e:o,i[1]=c;for(var p=2;p{t.r(r),t.d(r,{assets:()=>l,contentTitle:()=>i,default:()=>f,frontMatter:()=>a,metadata:()=>c,toc:()=>p});var n=t(87462),o=(t(67294),t(3905));const a={},i="Network",c={unversionedId:"iaas/overview/network",id:"iaas/overview/network",title:"Network",description:"TODO",source:"@site/docs/02-iaas/overview/network.md",sourceDirName:"02-iaas/overview",slug:"/iaas/overview/network",permalink:"/docs/iaas/overview/network",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/overview/network.md",tags:[],version:"current",frontMatter:{}},l={},p=[],s={toc:p},u="wrapper";function f(e){let{components:r,...t}=e;return(0,o.kt)(u,(0,n.Z)({},s,t,{components:r,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"network"},"Network"),(0,o.kt)("p",null,"TODO"))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3f3928dc.b46b088f.js b/assets/js/3f3928dc.b46b088f.js new file mode 100644 index 0000000000..1f6d1bd073 --- /dev/null +++ b/assets/js/3f3928dc.b46b088f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9003],{3905:(t,e,a)=>{a.d(e,{Zo:()=>p,kt:()=>f});var r=a(67294);function n(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function l(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,r)}return a}function s(t){for(var e=1;e=0||(n[a]=t[a]);return n}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(n[a]=t[a])}return n}var d=r.createContext({}),o=function(t){var e=r.useContext(d),a=e;return t&&(a="function"==typeof t?t(e):s(s({},e),t)),a},p=function(t){var e=o(t.components);return r.createElement(d.Provider,{value:e},t.children)},u="mdxType",c={inlineCode:"code",wrapper:function(t){var e=t.children;return r.createElement(r.Fragment,{},e)}},m=r.forwardRef((function(t,e){var a=t.components,n=t.mdxType,l=t.originalType,d=t.parentName,p=i(t,["components","mdxType","originalType","parentName"]),u=o(a),m=n,f=u["".concat(d,".").concat(m)]||u[m]||c[m]||l;return a?r.createElement(f,s(s({ref:e},p),{},{components:a})):r.createElement(f,s({ref:e},p))}));function f(t,e){var a=arguments,n=e&&e.mdxType;if("string"==typeof t||n){var l=a.length,s=new Array(l);s[0]=m;var i={};for(var d in e)hasOwnProperty.call(e,d)&&(i[d]=e[d]);i.originalType=t,i[u]="string"==typeof t?t:n,s[1]=i;for(var o=2;o{a.r(e),a.d(e,{assets:()=>d,contentTitle:()=>s,default:()=>c,frontMatter:()=>l,metadata:()=>i,toc:()=>o});var r=a(87462),n=(a(67294),a(3905));const l={},s="IaaS Standards",i={unversionedId:"iaas/index",id:"iaas/index",title:"IaaS Standards",description:"The IaaS Layer Standards track focuses on the protocols, guidelines, and specifications that govern the infrastructure as a service layer. This encompasses standards for virtual machines, storage, networking, and other foundational resources, ensuring seamless, efficient, and secure operation, interoperability, and management of the underlying cloud infrastructure.",source:"@site/standards/iaas/index.md",sourceDirName:"iaas",slug:"/iaas/",permalink:"/standards/iaas/",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"standards",previous:{title:"Sovereign Cloud Standards YAML",permalink:"/standards/scs-0003-v1-sovereign-cloud-standards-yaml"},next:{title:"SCS-0100: Flavor Naming",permalink:"/standards/iaas/scs-0100"}},d={},o=[],p={toc:o},u="wrapper";function c(t){let{components:e,...a}=t;return(0,n.kt)(u,(0,r.Z)({},p,a,{components:e,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"iaas-standards"},"IaaS Standards"),(0,n.kt)("p",null,"The IaaS Layer Standards track focuses on the protocols, guidelines, and specifications that govern the infrastructure as a service layer. This encompasses standards for virtual machines, storage, networking, and other foundational resources, ensuring seamless, efficient, and secure operation, interoperability, and management of the underlying cloud infrastructure."),(0,n.kt)("table",null,(0,n.kt)("thead",{parentName:"table"},(0,n.kt)("tr",{parentName:"thead"},(0,n.kt)("th",{parentName:"tr",align:null},"Standard"),(0,n.kt)("th",{parentName:"tr",align:null},"Most Recent Version"),(0,n.kt)("th",{parentName:"tr",align:null},"State"),(0,n.kt)("th",{parentName:"tr",align:null},"Description"),(0,n.kt)("th",{parentName:"tr",align:null},"stabilized"))),(0,n.kt)("tbody",{parentName:"table"},(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/iaas/scs-0100"},"SCS-0100")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/scs-0100-v3-flavor-naming"},"v3")),(0,n.kt)("td",{parentName:"tr",align:null},"\ud83d\udfe2 Stable"),(0,n.kt)("td",{parentName:"tr",align:null},"Flavor Naming"),(0,n.kt)("td",{parentName:"tr",align:null},"2023-06-14")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/iaas/scs-0101"},"SCS-0101")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/scs-0101-v1-entropy"},"v1")),(0,n.kt)("td",{parentName:"tr",align:null},"\ud83d\udfe0 Draft"),(0,n.kt)("td",{parentName:"tr",align:null},"Entropy"),(0,n.kt)("td",{parentName:"tr",align:null},"2023-03-08")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/iaas/scs-0102"},"SCS-0102")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/scs-0003-v1-sovereign-cloud-standards-yaml"},"v1")),(0,n.kt)("td",{parentName:"tr",align:null},"\ud83d\udfe2 Stable"),(0,n.kt)("td",{parentName:"tr",align:null},"Image Meta Data"),(0,n.kt)("td",{parentName:"tr",align:null},"2022-10-31")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/iaas/scs-0103"},"SCS-0103")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/scs-0003-v1-sovereign-cloud-standards-yaml"},"v1")),(0,n.kt)("td",{parentName:"tr",align:null},"\ud83d\udfe0 Draft"),(0,n.kt)("td",{parentName:"tr",align:null},"Sovereign Cloud Standards YAML"),(0,n.kt)("td",{parentName:"tr",align:null},"-")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/iaas/scs-0104"},"SCS-0104")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/scs-0003-v1-sovereign-cloud-standards-yaml"},"v1")),(0,n.kt)("td",{parentName:"tr",align:null},"\ud83d\udfe0 Draft"),(0,n.kt)("td",{parentName:"tr",align:null},"Sovereign Cloud Standards YAML"),(0,n.kt)("td",{parentName:"tr",align:null},"-")))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3ff13a62.e2f45d6a.js b/assets/js/3ff13a62.e2f45d6a.js new file mode 100644 index 0000000000..e1909756f8 --- /dev/null +++ b/assets/js/3ff13a62.e2f45d6a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5869],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),u=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},c=function(e){var t=u(e.components);return r.createElement(l.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=u(n),m=a,f=d["".concat(l,".").concat(m)]||d[m]||p[m]||i;return n?r.createElement(f,o(o({ref:t},c),{},{components:n})):r.createElement(f,o({ref:t},c))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,o=new Array(i);o[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[d]="string"==typeof e?e:a,o[1]=s;for(var u=2;u{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>s,toc:()=>u});var r=n(87462),a=(n(67294),n(3905));const i={},o="Container Layer Introduction",s={unversionedId:"container/index",id:"container/index",title:"Container Layer Introduction",description:"The container layer within the Sovereign Cloud Stack (SCS) offers a robust solution for managing container workloads on a Kubernetes infrastructure. It facilitates the on-demand creation and scaling of Kubernetes clusters, catering to various needs across development, testing, deployment, and operation of services and applications. While the container layer is versatile for a range of use cases, the most common ones include:",source:"@site/docs/03-container/index.md",sourceDirName:"03-container",slug:"/container/",permalink:"/docs/container/",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/03-container/index.md",tags:[],version:"current",frontMatter:{},sidebar:"docs",previous:{title:"Flavor Manager",permalink:"/docs/iaas/components/flavor-manager"},next:{title:"Components",permalink:"/docs/category/components-1"}},l={},u=[{value:"Target groups",id:"target-groups",level:2},{value:"What is it not",id:"what-is-it-not",level:2},{value:"Prerequisites and Requirements",id:"prerequisites-and-requirements",level:3},{value:"Features",id:"features",level:3},{value:"Limitations",id:"limitations",level:3},{value:"Current state and future Outlook",id:"current-state-and-future-outlook",level:3}],c={toc:u},d="wrapper";function p(e){let{components:t,...n}=e;return(0,a.kt)(d,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"container-layer-introduction"},"Container Layer Introduction"),(0,a.kt)("p",null,"The container layer within the Sovereign Cloud Stack (SCS) offers a robust solution for managing container workloads on a Kubernetes infrastructure. It facilitates the on-demand creation and scaling of Kubernetes clusters, catering to various needs across development, testing, deployment, and operation of services and applications. While the container layer is versatile for a range of use cases, the most common ones include:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Self-Service: Here, entities can empower their development teams with the autonomy to spawn and manage their clusters on demand, fostering a more agile and responsive development environment."),(0,a.kt)("li",{parentName:"ul"},"KaaS (Kubernetes as a Service): In this model, an SCS Cloud provider can offer their customers a managed Kubernetes service, abstracting much of the underlying operational complexity from their customers.")),(0,a.kt)("h2",{id:"target-groups"},"Target groups"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"DevOps/SysOps Teams: They are the primary beneficiaries as the container layer promotes flexible, on-demand operations helpful for continuous development, testing, deployment, and service management."),(0,a.kt)("li",{parentName:"ul"},"Cloud Service Providers: By delivering a standardized container orchestration platform, they can provide more reliable and robust services to their customers, enhancing their product portfolio.")),(0,a.kt)("h2",{id:"what-is-it-not"},"What is it not"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"The container layer is not an alternative to Infrastructure as a Service (IaaS) but rather an extension that allows for more streamlined operation and management of containerized applications."),(0,a.kt)("li",{parentName:"ul"},"Although the container layer doesn't directly support Serverless Containers or Functions as a Service, these can be run on a Kubernetes cluster. However, as of now, the SCS container layer doesn't offer specialized tools for these use cases.")),(0,a.kt)("h3",{id:"prerequisites-and-requirements"},"Prerequisites and Requirements"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Knowledge: Familiarity with Kubernetes, container orchestration, and basic cloud infrastructure principles is pivotal."),(0,a.kt)("li",{parentName:"ul"},"Software: The core software component is the K8s Cluster API Provider, crafted to function optimally on OpenStack environments. Although designed to run on the SCS IaaS layer, with minor configuration adjustments, it can operate on any OpenStack environment."),(0,a.kt)("li",{parentName:"ul"},"Hardware: Virtualization-enabled hardware capable of running OpenStack is essential if hosting the IaaS layer independently. For further details, refer to the IaaS layer documentation.")),(0,a.kt)("h3",{id:"features"},"Features"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Automated Cluster Management: The K8s Cluster API Provider automates the process of creating, scaling, managing and updating Kubernetes clusters, thus significantly reducing the operational overhead."),(0,a.kt)("li",{parentName:"ul"},"Standardized Operations: Upholding SCS standards across various clusters ensures operational consistency and reliability."),(0,a.kt)("li",{parentName:"ul"},"Integration with OpenStack: The K8s Cluster API Provider is tailored to work seamlessly with SCS IaaS (OpenStack), thus offering a unified platform for managing both containers and the underlying infrastructure."),(0,a.kt)("li",{parentName:"ul"},"Container Registry Integration: The container layer has an integrated container registry, facilitating easy management and deployment of container images."),(0,a.kt)("li",{parentName:"ul"},"Certificate Managment: The kubernetes clusters can optionaly include a certbot allowing for ease of deployment of public facing services out of the box."),(0,a.kt)("li",{parentName:"ul"},"Preconfigured ingress: Certificate Management: Optional inclusion of Certbot in Kubernetes clusters facilitates straightforward deployment of publicly accessible services.\nPreconfigured Ingress: Kubernetes clusters come with a preconfigured Nginx ingress, designed with OpenStack in mind, providing a ready-to-use ingress solution with enhancements like out-of-the-box client source IP visibility.")),(0,a.kt)("h3",{id:"limitations"},"Limitations"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"OpenStack Dependency: The current design primarily supports OpenStack environments, which could be a limitation for other infrastructure setups."),(0,a.kt)("li",{parentName:"ul"},"Serverless/Functions as a Service Support: Lack of direct support for serverless containers and Functions as a Service (FaaS) might require additional tools or platforms.")),(0,a.kt)("h3",{id:"current-state-and-future-outlook"},"Current state and future Outlook"),(0,a.kt)("p",null,"The container layer has matured with multiple cloud providers now offering Kubernetes as a Service using this layer to manage a multitude of clusters. It follows a half-yearly release schedule to ensure security and up-to-date Kubernetes clusters, alongside providing backports for significant features into older versions."),(0,a.kt)("p",null,"Looking ahead, a new version based on ClusterStacks is in the pipeline, currently in its Alpha state. This upcoming release aims to be backward compatible, facilitating smooth migration from existing setups, and further extending the capabilities of the SCS container layer."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/40d9468c.d7025893.js b/assets/js/40d9468c.d7025893.js new file mode 100644 index 0000000000..37d518e99d --- /dev/null +++ b/assets/js/40d9468c.d7025893.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8116],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>g});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var l=a.createContext({}),d=function(e){var t=a.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},p=function(e){var t=d(e.components);return a.createElement(l.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,i=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=d(r),c=n,g=u["".concat(l,".").concat(c)]||u[c]||m[c]||i;return r?a.createElement(g,o(o({ref:t},p),{},{components:r})):a.createElement(g,o({ref:t},p))}));function g(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,o=new Array(i);o[0]=c;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:n,o[1]=s;for(var d=2;d{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>d});var a=r(87462),n=(r(67294),r(3905));const i={sidebar_label:"Developer Guide",sidebar_position:90},o="Developer Guide",s={unversionedId:"iaas/guides/other-guides/developer-guide/index",id:"iaas/guides/other-guides/developer-guide/index",title:"Developer Guide",description:"How to add a new service",source:"@site/docs/02-iaas/guides/other-guides/developer-guide/index.md",sourceDirName:"02-iaas/guides/other-guides/developer-guide",slug:"/iaas/guides/other-guides/developer-guide/",permalink:"/docs/iaas/guides/other-guides/developer-guide/",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/other-guides/developer-guide/index.md",tags:[],version:"current",sidebarPosition:90,frontMatter:{sidebar_label:"Developer Guide",sidebar_position:90},sidebar:"docs",previous:{title:"Contributor Guide",permalink:"/docs/iaas/guides/other-guides/contributor-guide"},next:{title:"Releases",permalink:"/docs/iaas/guides/other-guides/developer-guide/releases"}},l={},d=[{value:"How to add a new service",id:"how-to-add-a-new-service",level:2},{value:"How to add a new container image",id:"how-to-add-a-new-container-image",level:2}],p={toc:d},u="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(u,(0,a.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"developer-guide"},"Developer Guide"),(0,n.kt)("h2",{id:"how-to-add-a-new-service"},"How to add a new service"),(0,n.kt)("p",null,"If you want to add a new service to OSISM, this is done via an Ansible role and (most often)\na container image. The following steps are necessary and are demonstrated using the example\nof ",(0,n.kt)("inlineCode",{parentName:"p"},"osism.services.cgit"),"."),(0,n.kt)("table",null,(0,n.kt)("thead",{parentName:"table"},(0,n.kt)("tr",{parentName:"thead"},(0,n.kt)("th",{parentName:"tr",align:null},"Description"),(0,n.kt)("th",{parentName:"tr",align:null},"Example"))),(0,n.kt)("tbody",{parentName:"table"},(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},"Add the Ansible role in one of the Ansible collection repositories"),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"https://github.com/osism/ansible-collection-services/pull/578/files"},"https://github.com/osism/ansible-collection-services/pull/578/files"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},"Add the Ansible playbook"),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"https://github.com/osism/ansible-playbooks/pull/215/files"},"https://github.com/osism/ansible-playbooks/pull/215/files"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},"Add the Ansible inventory group"),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"https://github.com/osism/cfg-generics/pull/225/files"},"https://github.com/osism/cfg-generics/pull/225/files"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},"Add the used container image(s) to the release repository"),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"https://github.com/osism/release/pull/278/files"},"https://github.com/osism/release/pull/278/files"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},"Add the container images(s) to osism-ansible container image"),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"https://github.com/osism/container-image-osism-ansible/pull/215/files"},"https://github.com/osism/container-image-osism-ansible/pull/215/files"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},"Add the container image registry/registries and host(s) to the defaults repository"),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"https://github.com/osism/defaults/pull/54/files"},"https://github.com/osism/defaults/pull/54/files"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},"Add a sample deployment to the testbed"),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"https://github.com/osism/testbed/pull/1043/files"},"https://github.com/osism/testbed/pull/1043/files"))))),(0,n.kt)("h2",{id:"how-to-add-a-new-container-image"},"How to add a new container image"),(0,n.kt)("p",null,"If required, add a new container image in the ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/osism/container-images"},"osism/container-images"),"\nrepository. The example here is from the ",(0,n.kt)("inlineCode",{parentName:"p"},"osism.services.keycloak")," role: ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/osism/container-images/pull/34/files"},"https://github.com/osism/container-images/pull/34/files"),"."),(0,n.kt)("p",null,"Whenever possible, upstream container images should be used. If only minor customizations are necessary,\nalways work with overlay container images based on upstream container images."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4129286c.516ed141.js b/assets/js/4129286c.516ed141.js new file mode 100644 index 0000000000..d3a7bcb9c7 --- /dev/null +++ b/assets/js/4129286c.516ed141.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5156],{12776:s=>{s.exports=JSON.parse('{"name":"@easyops-cn/docusaurus-search-local","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/41ab9761.6a8fa08f.js b/assets/js/41ab9761.6a8fa08f.js new file mode 100644 index 0000000000..be55968f08 --- /dev/null +++ b/assets/js/41ab9761.6a8fa08f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5777],{3905:(e,n,t)=>{t.d(n,{Zo:()=>p,kt:()=>f});var a=t(67294);function i(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function d(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function l(e){for(var n=1;n=0||(i[t]=e[t]);return i}(e,n);if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(i[t]=e[t])}return i}var o=a.createContext({}),r=function(e){var n=a.useContext(o),t=n;return e&&(t="function"==typeof e?e(n):l(l({},n),e)),t},p=function(e){var n=r(e.components);return a.createElement(o.Provider,{value:n},e.children)},y="mdxType",_={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},c=a.forwardRef((function(e,n){var t=e.components,i=e.mdxType,d=e.originalType,o=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),y=r(t),c=i,f=y["".concat(o,".").concat(c)]||y[c]||_[c]||d;return t?a.createElement(f,l(l({ref:n},p),{},{components:t})):a.createElement(f,l({ref:n},p))}));function f(e,n){var t=arguments,i=n&&n.mdxType;if("string"==typeof e||i){var d=t.length,l=new Array(d);l[0]=c;var s={};for(var o in n)hasOwnProperty.call(n,o)&&(s[o]=n[o]);s.originalType=e,s[y]="string"==typeof e?e:i,l[1]=s;for(var r=2;r{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>_,frontMatter:()=>d,metadata:()=>s,toc:()=>r});var a=t(87462),i=(t(67294),t(3905));const d={title:"Metering Configuration",type:null,status:"Draft",track:"Global"},l=void 0,s={unversionedId:"operating-scs/metering/meter_configuration",id:"operating-scs/metering/meter_configuration",title:"Metering Configuration",description:"The Metrics and events we want to use in the metering process can be defined in two ways. The first one is to allow ceilometer to poll distinct metrics and events.",source:"@site/docs/04-operating-scs/07-metering/meter_configuration.md",sourceDirName:"04-operating-scs/07-metering",slug:"/operating-scs/metering/meter_configuration",permalink:"/docs/operating-scs/metering/meter_configuration",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/04-operating-scs/07-metering/meter_configuration.md",tags:[],version:"current",frontMatter:{title:"Metering Configuration",type:null,status:"Draft",track:"Global"},sidebar:"docs",previous:{title:"Metering",permalink:"/docs/category/metering"},next:{title:"Identity and Access Management (IAM)",permalink:"/docs/category/identity-and-access-management-iam"}},o={},r=[{value:"1. ceilometer metering configuration",id:"1-ceilometer-metering-configuration",level:2},{value:"1.1 polling.yaml",id:"11-pollingyaml",level:3},{value:"1.2 event_definitions.yaml",id:"12-event_definitionsyaml",level:3},{value:"1.3 event_pipeline.yaml",id:"13-event_pipelineyaml",level:3},{value:"1.4 pipeline.yaml",id:"14-pipelineyaml",level:3}],p={toc:r},y="wrapper";function _(e){let{components:n,...t}=e;return(0,i.kt)(y,(0,a.Z)({},p,t,{components:n,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"The Metrics and events we want to use in the metering process can be defined in two ways. The first one is to allow ceilometer to poll distinct metrics and events.\nThis can be achived by setting up ceilometers config files."),(0,i.kt)("h2",{id:"1-ceilometer-metering-configuration"},"1. ceilometer metering configuration"),(0,i.kt)("p",null,"there is the polling.yaml file that describes what metrics to poll and when. It allows to create multiple sources for the ceilometer pipeline with different metrics and intervals."),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"https://docs.openstack.org/ceilometer/latest/admin/telemetry-data-collection.html#polling"},"ceilometer polling"),"\n",(0,i.kt)("a",{parentName:"p",href:"https://docs.openstack.org/ceilometer/latest/admin/telemetry-measurements.html#telemetry-bare-metal-service"},"ceilometer polling metrics")),(0,i.kt)("h3",{id:"11-pollingyaml"},"1.1 polling.yaml"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-yaml"},"---\nsources:\n - name: billing_source # 'source name'\n interval: 300 # 'how often the samples should be generated'\n meters:\n - \"volume.size\" # 'meter filter'\n # - \"*\" # 'using all pollsters\n")),(0,i.kt)("p",null,"in the event_definitions file all data structure of events are defined. If a message with a distinct event_type appears, the Fields and values from the message are matched with the Event-object."),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"https://docs.openstack.org/ceilometer/latest/admin/telemetry-events.html"},"ceilometer events"),"\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/openstack/ceilometer/blob/master/ceilometer/pipeline/data/event_definitions.yaml"},"ceilometer event_definitions")),(0,i.kt)("h3",{id:"12-event_definitionsyaml"},"1.2 event_definitions.yaml"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-yaml"},'---\n- event_type: "compute.instance.*"\n traits: &instance_traits\n tenant_id:\n fields: payload.tenant_id\n user_id:\n fields: payload.user_id\n instance_id:\n fields: payload.instance_id\n display_name:\n fields: payload.display_name\n resource_id:\n fields: payload.instance_id\n cell_name:\n fields: payload.cell_name\n host:\n fields: publisher_id.`split(., 1, 1)`\n service:\n fields: publisher_id.`split(., 0, -1)`\n memory_mb:\n type: int\n fields: payload.memory_mb\n disk_gb:\n type: int\n fields: payload.disk_gb\n root_gb:\n type: int\n fields: payload.root_gb\n ephemeral_gb:\n type: int\n fields: payload.ephemeral_gb\n vcpus:\n type: int\n fields: payload.vcpus\n instance_type_id:\n fields: payload.instance_type_id\n instance_type:\n fields: payload.instance_type\n state:\n fields: payload.state\n os_architecture:\n fields: payload.image_meta.\'org.openstack__1__architecture\'\n os_version:\n fields: payload.image_meta.\'org.openstack__1__os_version\'\n os_distro:\n fields: payload.image_meta.\'org.openstack__1__os_distro\'\n launched_at:\n type: datetime\n fields: payload.launched_at\n deleted_at:\n type: datetime\n fields: payload.deleted_at\n- event_type: compute.instance.create.end\n traits:\n <<: *instance_traits\n availability_zone:\n fields: payload.availability_zone\n- event_type: compute.instance.update\n traits:\n <<: *instance_traits\n old_state:\n fields: payload.old_state\n- event_type: compute.instance.exists\n traits:\n <<: *instance_traits\n audit_period_beginning:\n type: datetime\n fields: payload.audit_period_beginning\n audit_period_ending:\n type: datetime\n fields: payload.audit_period_ending\n- event_type:\n [\n "volume.exists",\n "volume.retype",\n "volume.create.*",\n "volume.delete.*",\n "volume.resize.*",\n "volume.attach.*",\n "volume.detach.*",\n "volume.update.*",\n "snapshot.exists",\n "snapshot.create.*",\n "snapshot.delete.*",\n "snapshot.update.*",\n "volume.transfer.accept.end",\n "snapshot.transfer.accept.end",\n ]\n traits: &cinder_traits\n user_id:\n fields: payload.user_id\n project_id:\n fields: payload.tenant_id\n availability_zone:\n fields: payload.availability_zone\n display_name:\n fields: payload.display_name\n replication_status:\n fields: payload.replication_status\n status:\n fields: payload.status\n created_at:\n type: datetime\n fields: payload.created_at\n image_id:\n fields: payload.glance_metadata[?key=image_id].value\n instance_id:\n fields: payload.volume_attachment[0].server_id\n- event_type:\n [\n "volume.transfer.*",\n "volume.exists",\n "volume.retype",\n "volume.create.*",\n "volume.delete.*",\n "volume.resize.*",\n "volume.attach.*",\n "volume.detach.*",\n "volume.update.*",\n "snapshot.transfer.accept.end",\n ]\n traits:\n <<: *cinder_traits\n resource_id:\n fields: payload.volume_id\n host:\n fields: payload.host\n size:\n type: int\n fields: payload.size\n type:\n fields: payload.volume_type\n replication_status:\n fields: payload.replication_status\n- event_type: ["snapshot.transfer.accept.end"]\n traits:\n <<: *cinder_traits\n resource_id:\n fields: payload.snapshot_id\n project_id:\n fields: payload.tenant_id\n- event_type:\n ["share.create.*", "share.delete.*", "share.extend.*", "share.shrink.*"]\n traits: &share_traits\n share_id:\n fields: payload.share_id\n user_id:\n fields: payload.user_id\n project_id:\n fields: payload.tenant_id\n snapshot_id:\n fields: payload.snapshot_id\n availability_zone:\n fields: payload.availability_zone\n status:\n fields: payload.status\n created_at:\n type: datetime\n fields: payload.created_at\n share_group_id:\n fields: payload.share_group_id\n size:\n type: int\n fields: payload.size\n name:\n fields: payload.name\n proto:\n fields: payload.proto\n is_public:\n fields: payload.is_public\n description:\n fields: payload.description\n host:\n fields: payload.host\n- event_type:\n [\n "snapshot.exists",\n "snapshot.create.*",\n "snapshot.delete.*",\n "snapshot.update.*",\n ]\n traits:\n <<: *cinder_traits\n resource_id:\n fields: payload.snapshot_id\n volume_id:\n fields: payload.volume_id\n- event_type: ["image_volume_cache.*"]\n traits:\n image_id:\n fields: payload.image_id\n host:\n fields: payload.host\n- event_type: ["image.create", "image.update", "image.upload", "image.delete"]\n traits: &glance_crud\n project_id:\n fields: payload.owner\n resource_id:\n fields: payload.id\n name:\n fields: payload.name\n status:\n fields: payload.status\n created_at:\n type: datetime\n fields: payload.created_at\n user_id:\n fields: payload.owner\n deleted_at:\n type: datetime\n fields: payload.deleted_at\n size:\n type: int\n fields: payload.size\n- event_type: image.send\n traits: &glance_send\n receiver_project:\n fields: payload.receiver_tenant_id\n receiver_user:\n fields: payload.receiver_user_id\n user_id:\n fields: payload.owner_id\n image_id:\n fields: payload.image_id\n destination_ip:\n fields: payload.destination_ip\n bytes_sent:\n type: int\n fields: payload.bytes_sent\n- event_type: orchestration.stack.*\n traits: &orchestration_crud\n project_id:\n fields: payload.tenant_id\n user_id:\n fields: ["ctxt.trustor_user_id", "ctxt.user_id"]\n resource_id:\n fields: payload.stack_identity\n name:\n fields: payload.name\n- event_type: sahara.cluster.*\n traits: &sahara_crud\n project_id:\n fields: payload.project_id\n user_id:\n fields: ctxt.user_id\n resource_id:\n fields: payload.cluster_id\n name:\n fields: payload.name\n- event_type: sahara.cluster.health\n traits: &sahara_health\n <<: *sahara_crud\n verification_id:\n fields: payload.verification_id\n health_check_status:\n fields: payload.health_check_status\n health_check_name:\n fields: payload.health_check_name\n health_check_description:\n fields: payload.health_check_description\n created_at:\n type: datetime\n fields: payload.created_at\n updated_at:\n type: datetime\n fields: payload.updated_at\n- event_type:\n [\n "identity.user.*",\n "identity.project.*",\n "identity.group.*",\n "identity.role.*",\n "identity.OS-TRUST:trust.*",\n "identity.region.*",\n "identity.service.*",\n "identity.endpoint.*",\n "identity.policy.*",\n ]\n traits: &identity_crud\n resource_id:\n fields: payload.resource_info\n initiator_id:\n fields: payload.initiator.id\n project_id:\n fields: payload.initiator.project_id\n domain_id:\n fields: payload.initiator.domain_id\n- event_type: identity.role_assignment.*\n traits: &identity_role_assignment\n role:\n fields: payload.role\n group:\n fields: payload.group\n domain:\n fields: payload.domain\n user:\n fields: payload.user\n project:\n fields: payload.project\n- event_type: identity.authenticate\n traits: &identity_authenticate\n typeURI:\n fields: payload.typeURI\n id:\n fields: payload.id\n action:\n fields: payload.action\n eventType:\n fields: payload.eventType\n eventTime:\n type: datetime\n fields: payload.eventTime\n outcome:\n fields: payload.outcome\n initiator_typeURI:\n fields: payload.initiator.typeURI\n initiator_id:\n fields: payload.initiator.id\n initiator_name:\n fields: payload.initiator.name\n initiator_host_agent:\n fields: payload.initiator.host.agent\n initiator_host_addr:\n fields: payload.initiator.host.address\n target_typeURI:\n fields: payload.target.typeURI\n target_id:\n fields: payload.target.id\n observer_typeURI:\n fields: payload.observer.typeURI\n observer_id:\n fields: payload.observer.id\n- event_type: objectstore.http.request\n traits: &objectstore_request\n typeURI:\n fields: payload.typeURI\n id:\n fields: payload.id\n action:\n fields: payload.action\n eventType:\n fields: payload.eventType\n eventTime:\n type: datetime\n fields: payload.eventTime\n outcome:\n fields: payload.outcome\n initiator_typeURI:\n fields: payload.initiator.typeURI\n initiator_id:\n fields: payload.initiator.id\n initiator_project_id:\n fields: payload.initiator.project_id\n target_typeURI:\n fields: payload.target.typeURI\n target_id:\n fields: payload.target.id\n target_action:\n fields: payload.target.action\n target_metadata_path:\n fields: payload.target.metadata.path\n target_metadata_version:\n fields: payload.target.metadata.version\n target_metadata_container:\n fields: payload.target.metadata.container\n target_metadata_object:\n fields: payload.target.metadata.object\n observer_id:\n fields: payload.observer.id\n- event_type:\n [\n "network.*",\n "subnet.*",\n "port.*",\n "router.*",\n "floatingip.*",\n "firewall.*",\n "firewall_policy.*",\n "firewall_rule.*",\n "vpnservice.*",\n "ipsecpolicy.*",\n "ikepolicy.*",\n "ipsec_site_connection.*",\n ]\n traits: &network_traits\n user_id:\n fields: ctxt.user_id\n project_id:\n fields: ctxt.tenant_id\n- event_type: network.*\n traits:\n <<: *network_traits\n name:\n fields: payload.network.name\n resource_id:\n fields: ["payload.network.id", "payload.id"]\n- event_type: subnet.*\n traits:\n <<: *network_traits\n name:\n fields: payload.subnet.name\n resource_id:\n fields: ["payload.subnet.id", "payload.id"]\n- event_type: port.*\n traits:\n <<: *network_traits\n name:\n fields: payload.port.name\n resource_id:\n fields: ["payload.port.id", "payload.id"]\n- event_type: router.*\n traits:\n <<: *network_traits\n name:\n fields: payload.router.name\n resource_id:\n fields: ["payload.router.id", "payload.id"]\n- event_type: floatingip.*\n traits:\n <<: *network_traits\n resource_id:\n fields: ["payload.floatingip.id", "payload.id"]\n- event_type: firewall.*\n traits:\n <<: *network_traits\n name:\n fields: payload.firewall.name\n resource_id:\n fields: ["payload.firewall.id", "payload.id"]\n- event_type: firewall_policy.*\n traits:\n <<: *network_traits\n name:\n fields: payload.firewall_policy.name\n resource_id:\n fields: ["payload.firewall_policy.id", "payload.id"]\n- event_type: firewall_rule.*\n traits:\n <<: *network_traits\n name:\n fields: payload.firewall_rule.name\n resource_id:\n fields: ["payload.firewall_rule.id", "payload.id"]\n- event_type: vpnservice.*\n traits:\n <<: *network_traits\n name:\n fields: payload.vpnservice.name\n resource_id:\n fields: ["payload.vpnservice.id", "payload.id"]\n- event_type: ipsecpolicy.*\n traits:\n <<: *network_traits\n name:\n fields: payload.ipsecpolicy.name\n resource_id:\n fields: ["payload.ipsecpolicy.id", "payload.id"]\n- event_type: ikepolicy.*\n traits:\n <<: *network_traits\n name:\n fields: payload.ikepolicy.name\n resource_id:\n fields: ["payload.ikepolicy.id", "payload.id"]\n- event_type: ipsec_site_connection.*\n traits:\n <<: *network_traits\n resource_id:\n fields: ["payload.ipsec_site_connection.id", "payload.id"]\n- event_type: "*http.*"\n traits: &http_audit\n project_id:\n fields: payload.initiator.project_id\n user_id:\n fields: payload.initiator.id\n typeURI:\n fields: payload.typeURI\n eventType:\n fields: payload.eventType\n action:\n fields: payload.action\n outcome:\n fields: payload.outcome\n id:\n fields: payload.id\n eventTime:\n type: datetime\n fields: payload.eventTime\n requestPath:\n fields: payload.requestPath\n observer_id:\n fields: payload.observer.id\n target_id:\n fields: payload.target.id\n target_typeURI:\n fields: payload.target.typeURI\n target_name:\n fields: payload.target.name\n initiator_typeURI:\n fields: payload.initiator.typeURI\n initiator_id:\n fields: payload.initiator.id\n initiator_name:\n fields: payload.initiator.name\n initiator_host_address:\n fields: payload.initiator.host.address\n- event_type: "*http.response"\n traits:\n <<: *http_audit\n reason_code:\n fields: payload.reason.reasonCode\n- event_type: ["dns.domain.create", "dns.domain.update", "dns.domain.delete"]\n traits: &dns_domain_traits\n status:\n fields: payload.status\n retry:\n fields: payload.retry\n description:\n fields: payload.description\n expire:\n fields: payload.expire\n email:\n fields: payload.email\n ttl:\n fields: payload.ttl\n action:\n fields: payload.action\n name:\n fields: payload.name\n resource_id:\n fields: payload.id\n created_at:\n type: datetime\n fields: payload.created_at\n updated_at:\n type: datetime\n fields: payload.updated_at\n version:\n fields: payload.version\n parent_domain_id:\n fields: parent_domain_id\n serial:\n fields: payload.serial\n- event_type: dns.domain.exists\n traits:\n <<: *dns_domain_traits\n audit_period_beginning:\n type: datetime\n fields: payload.audit_period_beginning\n audit_period_ending:\n type: datetime\n fields: payload.audit_period_ending\n- event_type: trove.*\n traits: &trove_base_traits\n instance_type:\n fields: payload.instance_type\n user_id:\n fields: payload.user_id\n resource_id:\n fields: payload.instance_id\n instance_type_id:\n fields: payload.instance_type_id\n launched_at:\n type: datetime\n fields: payload.launched_at\n instance_name:\n fields: payload.instance_name\n state:\n fields: payload.state\n nova_instance_id:\n fields: payload.nova_instance_id\n service_id:\n fields: payload.service_id\n created_at:\n type: datetime\n fields: payload.created_at\n region:\n fields: payload.region\n- event_type:\n [\n "trove.instance.create",\n "trove.instance.modify_volume",\n "trove.instance.modify_flavor",\n "trove.instance.delete",\n ]\n traits: &trove_common_traits\n name:\n fields: payload.name\n availability_zone:\n fields: payload.availability_zone\n instance_size:\n type: int\n fields: payload.instance_size\n volume_size:\n type: int\n fields: payload.volume_size\n nova_volume_id:\n fields: payload.nova_volume_id\n- event_type: trove.instance.create\n traits:\n <<: [*trove_base_traits, *trove_common_traits]\n- event_type: trove.instance.modify_volume\n traits:\n <<: [*trove_base_traits, *trove_common_traits]\n old_volume_size:\n type: int\n fields: payload.old_volume_size\n modify_at:\n type: datetime\n fields: payload.modify_at\n- event_type: trove.instance.modify_flavor\n traits:\n <<: [*trove_base_traits, *trove_common_traits]\n old_instance_size:\n type: int\n fields: payload.old_instance_size\n modify_at:\n type: datetime\n fields: payload.modify_at\n- event_type: trove.instance.delete\n traits:\n <<: [*trove_base_traits, *trove_common_traits]\n deleted_at:\n type: datetime\n fields: payload.deleted_at\n- event_type: trove.instance.exists\n traits:\n <<: *trove_base_traits\n display_name:\n fields: payload.display_name\n audit_period_beginning:\n type: datetime\n fields: payload.audit_period_beginning\n audit_period_ending:\n type: datetime\n fields: payload.audit_period_ending\n- event_type: profiler.*\n traits:\n project:\n fields: payload.project\n service:\n fields: payload.service\n name:\n fields: payload.name\n base_id:\n fields: payload.base_id\n trace_id:\n fields: payload.trace_id\n parent_id:\n fields: payload.parent_id\n timestamp:\n type: datetime\n fields: payload.timestamp\n host:\n fields: payload.info.host\n path:\n fields: payload.info.request.path\n query:\n fields: payload.info.request.query\n method:\n fields: payload.info.request.method\n scheme:\n fields: payload.info.request.scheme\n db.statement:\n fields: payload.info.db.statement\n db.params:\n fields: payload.info.db.params\n- event_type: "magnum.cluster.*"\n traits: &magnum_cluster_crud\n id:\n fields: payload.id\n typeURI:\n fields: payload.typeURI\n eventType:\n fields: payload.eventType\n eventTime:\n type: datetime\n fields: payload.eventTime\n action:\n fields: payload.action\n outcome:\n fields: payload.outcome\n initiator_id:\n fields: payload.initiator.id\n initiator_typeURI:\n fields: payload.initiator.typeURI\n initiator_name:\n fields: payload.initiator.name\n initiator_host_agent:\n fields: payload.initiator.host.agent\n initiator_host_address:\n fields: payload.initiator.host.address\n target_id:\n fields: payload.target.id\n target_typeURI:\n fields: payload.target.typeURI\n observer_id:\n fields: payload.observer.id\n observer_typeURI:\n fields: payload.observer.typeURI\n- event_type: "alarm.*"\n traits:\n id:\n fields: payload.alarm_id\n user_id:\n fields: payload.user_id\n project_id:\n fields: payload.project_id\n on_behalf_of:\n fields: payload.on_behalf_of\n severity:\n fields: payload.severity\n detail:\n fields: payload.detail\n type:\n fields: payload.type\n')),(0,i.kt)("p",null,"The event_pipeline can be used to filter events and pipeline them to different publishers.\nthe notifier publisher is the message queue broadcasster (RabbitMQ)."),(0,i.kt)("h3",{id:"13-event_pipelineyaml"},"1.3 event_pipeline.yaml"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-yaml"},"---\nsources:\n - name: event_source # 'source name'\n events:\n - \"*\" # 'event filter'\n sinks:\n - event_sink # 'sink name'\nsinks:\n - name: event_sink # 'sink name'\n publishers: # 'list of publishers'\n - notifier://\n - http://localhost:8088/post_json\n")),(0,i.kt)("p",null,"The pipeline.yaml can be used to filter and pipeline all metrics and events since events send via the notifier also appears in the meters and send them to different publishers."),(0,i.kt)("p",null,"In our case we want to push to the metering api."),(0,i.kt)("h3",{id:"14-pipelineyaml"},"1.4 pipeline.yaml"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-yaml"},'---\nsources:\n - name: meter_source\n meters:\n - "*"\n sinks:\n - meter_sink\nsinks:\n - name: meter_sink\n publishers:\n - gnocchi://?archive_policy=ceilometer-low&filter_project=service\n - http://localhost:8088/post_json\n')))}_.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/42088e64.b8cc5f7f.js b/assets/js/42088e64.b8cc5f7f.js new file mode 100644 index 0000000000..fcbcf4e0a1 --- /dev/null +++ b/assets/js/42088e64.b8cc5f7f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6861],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>v});var r=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=r.createContext({}),l=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=l(e.components);return r.createElement(c.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),d=l(n),m=o,v=d["".concat(c,".").concat(m)]||d[m]||p[m]||a;return n?r.createElement(v,i(i({ref:t},u),{},{components:n})):r.createElement(v,i({ref:t},u))}));function v(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=m;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[d]="string"==typeof e?e:o,i[1]=s;for(var l=2;l{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var r=n(87462),o=(n(67294),n(3905));const a={},i="Multi-AZ and multi-cloud environments",s={unversionedId:"container/components/k8s-cluster-api-provider/doc/usage/multi-az-and-multi-cloud-environments",id:"container/components/k8s-cluster-api-provider/doc/usage/multi-az-and-multi-cloud-environments",title:"Multi-AZ and multi-cloud environments",description:"The provided cluster-template.yaml assumes that all control nodes on one hand and all worker nodes on the other are",source:"@site/docs/03-container/components/k8s-cluster-api-provider/doc/usage/multi-az-and-multi-cloud-environments.md",sourceDirName:"03-container/components/k8s-cluster-api-provider/doc/usage",slug:"/container/components/k8s-cluster-api-provider/doc/usage/multi-az-and-multi-cloud-environments",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/usage/multi-az-and-multi-cloud-environments",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/03-container/components/k8s-cluster-api-provider/doc/usage/multi-az-and-multi-cloud-environments.md",tags:[],version:"current",frontMatter:{},sidebar:"docs",previous:{title:"Cluster Management on the capi management node",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/usage/cluster-mgmt-capi-mgmt-node"},next:{title:"Testing",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/usage/testing"}},c={},l=[],u={toc:l},d="wrapper";function p(e){let{components:t,...n}=e;return(0,o.kt)(d,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"multi-az-and-multi-cloud-environments"},"Multi-AZ and multi-cloud environments"),(0,o.kt)("p",null,"The provided ",(0,o.kt)("inlineCode",{parentName:"p"},"cluster-template.yaml")," assumes that all control nodes on one hand and all worker nodes on the other are\nequal. They are in the same cloud within the same availability zone, using the same flavor. cluster API allows k8s\nclusters to have varying flavors, span availability zones and even clouds. For this, you can create an advanced\ncluster-template with more different machine descriptions and potentially several secrets. Depending on your changes,\nthe logic in ",(0,o.kt)("inlineCode",{parentName:"p"},"create_cluster.sh")," might also need enhancements to handle this. Extending this is not hard and we're happy\nto hear from your use cases and take patches."),(0,o.kt)("p",null,"However, we are currently investigating to use helm templating for anything beyond the simple use cases instead, see\nnext chapter."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/421b5e65.74a01f86.js b/assets/js/421b5e65.74a01f86.js new file mode 100644 index 0000000000..77e26f8ea8 --- /dev/null +++ b/assets/js/421b5e65.74a01f86.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5482],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>m});var o=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=o.createContext({}),c=function(e){var t=o.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=c(e.components);return o.createElement(s.Provider,{value:t},e.children)},h="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},u=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),h=c(n),u=r,m=h["".concat(s,".").concat(u)]||h[u]||p[u]||a;return n?o.createElement(m,i(i({ref:t},d),{},{components:n})):o.createElement(m,i({ref:t},d))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[h]="string"==typeof e?e:r,i[1]=l;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>p,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var o=n(87462),r=(n(67294),n(3905));const a={},i="Ingress with externalTrafficPolicy: local",l={unversionedId:"container/components/k8s-cluster-api-provider/doc/LoadBalancer-ExtTrafficLocal",id:"container/components/k8s-cluster-api-provider/doc/LoadBalancer-ExtTrafficLocal",title:"Ingress with externalTrafficPolicy: local",description:"Setting up the nginx ingress controller from the upstream deployment templates",source:"@site/docs/03-container/components/k8s-cluster-api-provider/doc/LoadBalancer-ExtTrafficLocal.md",sourceDirName:"03-container/components/k8s-cluster-api-provider/doc",slug:"/container/components/k8s-cluster-api-provider/doc/LoadBalancer-ExtTrafficLocal",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/LoadBalancer-ExtTrafficLocal",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/03-container/components/k8s-cluster-api-provider/doc/LoadBalancer-ExtTrafficLocal.md",tags:[],version:"current",frontMatter:{},sidebar:"docs",previous:{title:"Maintenance and Troubleshooting Guide for SCS k8s-cluster-api-provider",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/Maintenance_and_Troubleshooting"},next:{title:"SCS k8s-cluster-api-provider upgrade guide",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/Upgrade-Guide"}},s={},c=[],d={toc:c},h="wrapper";function p(e){let{components:t,...n}=e;return(0,r.kt)(h,(0,o.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"ingress-with-externaltrafficpolicy-local"},"Ingress with ",(0,r.kt)("inlineCode",{parentName:"h1"},"externalTrafficPolicy: local")),(0,r.kt)("p",null,"Setting up the nginx ingress controller from the upstream deployment templates\nusing the ",(0,r.kt)("inlineCode",{parentName:"p"},"externalTrafficPolicy: local")," setting and -- without any special\ntreatment -- results in a service that is only partially working: Only requests\nthat the LoadBalancer happens to route at the node where the nginx container is\nrunning get a response."),(0,r.kt)("p",null,"nginx could just use the ",(0,r.kt)("inlineCode",{parentName:"p"},"cluster")," setting instead and kube-proxy would forward\nthe network packets. There are two reasons for nginx not to do that"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Having a load-balancer balance the traffic to a node that is not active just\nto have kube-proxy forward it to the active node does not make much sense.\nIt creates an unnecessary hop and makes the LoadBalancer pretty useless.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Packets forwarded by kube-proxy do not carry the original client IP, so any\nsource IP dependant handling in nginx (filtering, QoS, ...) will not be\npossible."))),(0,r.kt)("h1",{id:"getting-it-to-work-for-managed-ingress"},"Getting it to work for managed ingress"),(0,r.kt)("p",null,"There does not seem to be a standard mechanism where k8s tells the LoadBalancer (LB)\nwhich backend members are active, but the load-balancer can find this out by using\na health-monitor that probes for the availability of the service and then takes\nthe inactive nodes out of the rotation. Should the container be rescheduled on\nsome other node, the health-monitor will adapt within a few seconds."),(0,r.kt)("p",null,"Since SCS R2, the deployed nginx-ingress deployment is patched to carry a service\nannotation (a behavior specifically needed by OpenStack) that enables the health-monitor for the LB in\nfront of the ingress. This results in traffic to flow."),(0,r.kt)("p",null,"This covers the nginx ingress controller that is deployed by setting",(0,r.kt)("inlineCode",{parentName:"p"},"\n DEPLOY_NGINX_INGRESS: true")," with the ",(0,r.kt)("inlineCode",{parentName:"p"},"create_cluster.sh")," or ",(0,r.kt)("inlineCode",{parentName:"p"},"apply_nginx_ingress.sh"),'.\nThat the ingress we call the "managed ingress".'),(0,r.kt)("p",null,"For the ingress service to see the client IPs, more is needed. The Octavia LB\nas well as the nginx service both support the proxy protocol, which can be used to\ncommunicate the real client IP. We had plumbing included which we disabled by\ndefault prior to releasing R2, because it broke the access to ingress from\nsoftware that runs inside the cluster."),(0,r.kt)("p",null,"A workaround for this has been implemented, so the default is\n",(0,r.kt)("inlineCode",{parentName:"p"},"NGINX_USE_PROXY: true")," as of R4. So the managed nginx ingress service\ndoes work reliably and gets the client IPs."),(0,r.kt)("h1",{id:"getting-it-to-work-in-general"},"Getting it to work in general"),(0,r.kt)("p",null,"Users that deploy their own nginx or other services with ",(0,r.kt)("inlineCode",{parentName:"p"},"externalTrafficPolicy: local"),"\nwon't be helped by the annotations done by the SCS cluster management. They will\nhave to do similar custom patching or revert to a ",(0,r.kt)("inlineCode",{parentName:"p"},"cluster")," policy and forego the\nvisibility on real client IPs."),(0,r.kt)("p",null,"A generic solution to this would be a different kind of LB that does work at the\nnetworking layer 3 (routing), so the (TCP) connections are not terminated at the\nLB and then data being forwarded on a new connection to the backend member, but\nthe routing would create a direct connection. Google (with Direct Server Return, DSR)\nand Azure support such LB modes."),(0,r.kt)("p",null,"As it turns out, on OpenStack clouds that use OVN as networking (SDN) layer, the OVN\nloadbalancer does almost deliver what's needed."),(0,r.kt)("h1",{id:"ovn-provider-loadbalancer"},"OVN provider LoadBalancer"),(0,r.kt)("p",null,"The OVN provider for the load-balancer does create direct flows to the chosen backend\nmember, so no proxy protocol (or similar hacks) are needed to make the backend service\nsee the client IPs. This has been validated (and can even be monitored by openstack-health-monitor)\non SCS clouds that use OVN."),(0,r.kt)("p",null,"A health-monitor is still needed to ensure that only active members receive requests.\nThere are unfortunately two problems with the health-monitoring on the OVN provider:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The health-monitor does correctly detect members that are not responding and stops\nrouting traffic from the VIP towards the inactive member. Unfortunately the\ntraffic that comes in from the floating IP associated with the VIP is not treated\nthe same, but is still distributed to the inactive members, resulting in a good\nfraction of the requests to go unanswered. This is tracked in bug\n",(0,r.kt)("a",{parentName:"li",href:"https://bugs.launchpad.net/neutron/+bug/1956035"},"https://bugs.launchpad.net/neutron/+bug/1956035")),(0,r.kt)("li",{parentName:"ul"},"The OCCM always tries to create an HTTP health-monitor. The OVN provider however\ndoes not yet support HTTP health-monitors, only TCP. We'll have to wait for (and\npossibly help with) HTTP health-monitors to be implemented upstream.")),(0,r.kt)("p",null,"Due to the HTTP health-monitor not being supported, the created loadbalancer is not\nconsidered functional, so the reconciliation loop creates another loadbalancer until\nyour project runs into quota limits (on the loadbalancer or on ports).\nSo for now, the feature ",(0,r.kt)("inlineCode",{parentName:"p"},"use_ovn_lb_provider")," should not be enabled."),(0,r.kt)("p",null,"Note that the ",(0,r.kt)("inlineCode",{parentName:"p"},"use_ovn_lb_provider")," does not affect the LB in front of the kube API.\nThat one is created by capo and requires other settings. Also note that it would\nnot yet support the CIDR filtering with ",(0,r.kt)("inlineCode",{parentName:"p"},"restrict_kubeapi")," setting."),(0,r.kt)("h1",{id:"disabled-health-monitor-by-default"},"Disabled health-monitor by default"),(0,r.kt)("p",null,"We could enable a health-monitor by default for load-balancers created from OCCM\nin the k8s clusters. This would make services with ",(0,r.kt)("inlineCode",{parentName:"p"},"externalTrafficPolicy: local"),"\nwork, as the traffic would be routed exclusively to active members. But the\nother goal would not be achieved: Getting the real client IPs.\nWe decided against turning on the health-monitor by default, as this might result\nin the wrong impression that ",(0,r.kt)("inlineCode",{parentName:"p"},"local")," fully works. Rather break and then have users take\na decision to go for ",(0,r.kt)("inlineCode",{parentName:"p"},"cluster"),", to enable health-monitoring to get it half-working\nor to do health-monitoring plus some extra plumbing for proxy protocol (or similar)\nto get all aspects working."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/422fff4b.dddbd424.js b/assets/js/422fff4b.dddbd424.js new file mode 100644 index 0000000000..1b9e17188d --- /dev/null +++ b/assets/js/422fff4b.dddbd424.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8934],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>m});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function s(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},p=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,s=e.originalType,l=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=c(r),f=a,m=d["".concat(l,".").concat(f)]||d[f]||u[f]||s;return r?n.createElement(m,o(o({ref:t},p),{},{components:r})):n.createElement(m,o({ref:t},p))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var s=r.length,o=new Array(s);o[0]=f;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[d]="string"==typeof e?e:a,o[1]=i;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>s,metadata:()=>i,toc:()=>c});var n=r(87462),a=(r(67294),r(3905));const s={},o="SCS-0210: k8s New Version Policy",i={unversionedId:"kaas/scs-0210",id:"kaas/scs-0210",title:"SCS-0210: k8s New Version Policy",description:"The SCS-0210 standard outlines the expected pace at which providers should adopt new Kubernetes versions, aiming for alignment with the rapid development cycle of Kubernetes. Providers must offer the latest minor version within four months of its release and the newest patch version within a week, ensuring users have timely access to security updates, bug fixes, and features. The standard emphasizes the need for expedited updates for critical CVEs and expects providers to thoroughly test new versions before deployment.",source:"@site/standards/kaas/scs-0210.md",sourceDirName:"kaas",slug:"/kaas/scs-0210",permalink:"/standards/kaas/scs-0210",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"standards",previous:{title:"KaaS Standards",permalink:"/standards/kaas/"},next:{title:"SCS K8S Version Policy for new Kubernetes versions",permalink:"/standards/scs-0210-v1-k8s-new-version-policy"}},l={},c=[],p={toc:c},d="wrapper";function u(e){let{components:t,...r}=e;return(0,a.kt)(d,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"scs-0210-k8s-new-version-policy"},"SCS-0210: k8s New Version Policy"),(0,a.kt)("p",null,"The SCS-0210 standard outlines the expected pace at which providers should adopt new Kubernetes versions, aiming for alignment with the rapid development cycle of Kubernetes. Providers must offer the latest minor version within four months of its release and the newest patch version within a week, ensuring users have timely access to security updates, bug fixes, and features. The standard emphasizes the need for expedited updates for critical CVEs and expects providers to thoroughly test new versions before deployment."),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Version"),(0,a.kt)("th",{parentName:"tr",align:null},"Type"),(0,a.kt)("th",{parentName:"tr",align:null},"State"),(0,a.kt)("th",{parentName:"tr",align:null},"stabilized"),(0,a.kt)("th",{parentName:"tr",align:null},"obsoleted"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("a",{parentName:"td",href:"/standards/scs-0210-v1-k8s-new-version-policy"},"SCS-0210-v1")),(0,a.kt)("td",{parentName:"tr",align:null},"Standard"),(0,a.kt)("td",{parentName:"tr",align:null},"\ud83d\udfe2 Stable"),(0,a.kt)("td",{parentName:"tr",align:null},"2023-02-07"),(0,a.kt)("td",{parentName:"tr",align:null},"-")))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/431e6cfe.2c1b1bfb.js b/assets/js/431e6cfe.2c1b1bfb.js new file mode 100644 index 0000000000..5c551a9a02 --- /dev/null +++ b/assets/js/431e6cfe.2c1b1bfb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2085],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>k});var a=n(67294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function l(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=a.createContext({}),p=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,i=e.mdxType,r=e.originalType,s=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),c=p(n),m=i,k=c["".concat(s,".").concat(m)]||c[m]||d[m]||r;return n?a.createElement(k,l(l({ref:t},u),{},{components:n})):a.createElement(k,l({ref:t},u))}));function k(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var r=n.length,l=new Array(r);l[0]=m;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[c]="string"==typeof e?e:i,l[1]=o;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>r,metadata:()=>o,toc:()=>p});var a=n(87462),i=(n(67294),n(3905));const r={},l="Continuous integration",o={unversionedId:"container/components/k8s-cluster-api-provider/doc/continuous-integration",id:"container/components/k8s-cluster-api-provider/doc/continuous-integration",title:"Continuous integration",description:"Project k8s-cluster-api-provider uses SCS Zuul CI platform to",source:"@site/docs/03-container/components/k8s-cluster-api-provider/doc/continuous-integration.md",sourceDirName:"03-container/components/k8s-cluster-api-provider/doc",slug:"/container/components/k8s-cluster-api-provider/doc/continuous-integration",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/continuous-integration",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/03-container/components/k8s-cluster-api-provider/doc/continuous-integration.md",tags:[],version:"current",frontMatter:{}},s={},p=[{value:"Configuration",id:"configuration",level:2},{value:"Pipelines",id:"pipelines",level:2},{value:"Jobs",id:"jobs",level:2},{value:"Secrets",id:"secrets",level:3},{value:"Job customization",id:"job-customization",level:3},{value:"FAQ",id:"faq",level:3},{value:"How do developers/reviewers should proceed if they want to CI test this project?",id:"how-do-developersreviewers-should-proceed-if-they-want-to-ci-test-this-project",level:4},{value:"Why do we use PR label as an e2e pipeline trigger instead of e.g. PR comment?",id:"why-do-we-use-pr-label-as-an-e2e-pipeline-trigger-instead-of-eg-pr-comment",level:4},{value:"How do we ensure that any PR update invalidates a previous successful e2e test?",id:"how-do-we-ensure-that-any-pr-update-invalidates-a-previous-successful-e2e-test",level:4}],u={toc:p},c="wrapper";function d(e){let{components:t,...n}=e;return(0,i.kt)(c,(0,a.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"continuous-integration"},"Continuous integration"),(0,i.kt)("p",null,"Project k8s-cluster-api-provider uses ",(0,i.kt)("a",{parentName:"p",href:"https://zuul.scs.community"},"SCS Zuul")," CI platform to\ndrive its continuous integration tests. The project is registered under the ",(0,i.kt)("a",{parentName:"p",href:"https://zuul.scs.community/t/SCS/projects"},"SCS tenant"),"\nand therefore is able to use a set of pre-defined pipelines, jobs, and ansible roles that\nSCS Zuul instance defines and imports. If you want to explore currently available SCS pipelines,\nvisit the ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/zuul-config"},"SCS zuul-config")," project.\nIf you want to see the full list of jobs that are available, visit the ",(0,i.kt)("a",{parentName:"p",href:"https://zuul.scs.community/t/SCS/jobs"},"SCS Zuul UI"),".\nAnd if you are looking for some handy ansible role that SCS Zuul imports, visit they ",(0,i.kt)("a",{parentName:"p",href:"https://opendev.org/zuul/zuul-jobs/src/branch/master/roles"},"source"),". "),(0,i.kt)("p",null,"Refer to SCS ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/docs/pull/54"},"Zuul users guide")," and/or\n",(0,i.kt)("a",{parentName:"p",href:"https://zuul-ci.org/docs/"},"Zuul docs")," for further details on how to define and use Zuul\nCI/CD pipelines and jobs. "),(0,i.kt)("p",null,"Note (for geeks): If you are interested in Zuul CI platform and want to deploy your own development instance of it,\nthen read the official ",(0,i.kt)("a",{parentName:"p",href:"https://zuul-ci.org/docs/zuul/latest/tutorials/quick-start.html"},"quick-start")," manual\nor visit ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/matofederorg/zuul-config"},"this")," tutorial which aims a connection\nof Zuul CI platform with a GitHub organization."),(0,i.kt)("h2",{id:"configuration"},"Configuration"),(0,i.kt)("p",null,"SCS Zuul automatically recognizes ",(0,i.kt)("inlineCode",{parentName:"p"},".zuul.yaml")," configuration file that is located in the\nk8s-cluster-api-provider's root. This file informs Zuul about the project's ",(0,i.kt)("a",{parentName:"p",href:"https://zuul-ci.org/docs/zuul/latest/config/project.html#attr-project.default-branch"},"default-branch")," and\npreferred ",(0,i.kt)("a",{parentName:"p",href:"https://zuul-ci.org/docs/zuul/latest/config/project.html#attr-project.merge-mode"},"merge-mode"),".\nIt also references ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/matofederorg/zuul-config"},"SCS Zuul pipelines")," and\ntheir jobs used by the k8s-cluster-api-provider project. Then, jobs link Ansible playbooks that contain\ntasks for actual CI testing. "),(0,i.kt)("p",null,"See relevant CI configuration files:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-text"},"\u251c\u2500\u2500 .zuul.yaml\n\u251c\u2500\u2500 playbooks\n\u2502 \u251c\u2500\u2500 cleanup.yaml\n\u2502 \u251c\u2500\u2500 dependencies.yaml\n\u2502 \u251c\u2500\u2500 e2e.yaml\n\u2502 \u251c\u2500\u2500 templates\n\u2502 \u2502 \u2514\u2500\u2500 environment.tfvars.j2\n")),(0,i.kt)("h2",{id:"pipelines"},"Pipelines"),(0,i.kt)("p",null,"This section describes an ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/zuul-config/blob/main/zuul.d/gh_pipelines.yaml"},"SCS Zuul pipelines")," that are used by the k8s-cluster-api-provider project."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"e2e-test")),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"It is triggered by the ",(0,i.kt)("inlineCode",{parentName:"li"},"e2e-test")," label in the opened PR"),(0,i.kt)("li",{parentName:"ul"},"It executes ",(0,i.kt)("inlineCode",{parentName:"li"},"k8s-cluster-api-provider-e2e-conformance")," job"),(0,i.kt)("li",{parentName:"ul"},"It applies the PR label ",(0,i.kt)("inlineCode",{parentName:"li"},"successful-e2e-test")," and leaves an informative PR comment when the ",(0,i.kt)("inlineCode",{parentName:"li"},"k8s-cluster-api-provider-e2e-conformance")," job succeeded"),(0,i.kt)("li",{parentName:"ul"},"It applies the PR label ",(0,i.kt)("inlineCode",{parentName:"li"},"failed-e2e-test")," and leaves an informative PR comment when the ",(0,i.kt)("inlineCode",{parentName:"li"},"k8s-cluster-api-provider-e2e-conformance")," job failed"),(0,i.kt)("li",{parentName:"ul"},"It applies the PR label ",(0,i.kt)("inlineCode",{parentName:"li"},"cancelled-e2e-test")," and leaves an informative PR comment when the ",(0,i.kt)("inlineCode",{parentName:"li"},"k8s-cluster-api-provider-e2e-conformance")," job is canceled"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"unlabel-on-update-e2e-test")),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"It is triggered by the PR update only when PR contains the ",(0,i.kt)("inlineCode",{parentName:"li"},"successful-e2e-test")," label"),(0,i.kt)("li",{parentName:"ul"},"It ensures that any PR update invalidates a previous successful e2e test"),(0,i.kt)("li",{parentName:"ul"},"It removes ",(0,i.kt)("inlineCode",{parentName:"li"},"successful-e2e-test")," label from the PR"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"e2e-quick-test")),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"It is triggered by the ",(0,i.kt)("inlineCode",{parentName:"li"},"e2e-quick-test")," label in the opened PR"),(0,i.kt)("li",{parentName:"ul"},"It executes ",(0,i.kt)("inlineCode",{parentName:"li"},"k8s-cluster-api-provider-e2e-quick")," job"),(0,i.kt)("li",{parentName:"ul"},"It applies the PR label ",(0,i.kt)("inlineCode",{parentName:"li"},"successful-e2e-quick-test")," and leaves an informative PR comment when the ",(0,i.kt)("inlineCode",{parentName:"li"},"k8s-cluster-api-provider-e2e-quick")," job succeeded"),(0,i.kt)("li",{parentName:"ul"},"It applies the PR label ",(0,i.kt)("inlineCode",{parentName:"li"},"failed-e2e-quick-test")," and leaves an informative PR comment when the ",(0,i.kt)("inlineCode",{parentName:"li"},"k8s-cluster-api-provider-e2e-quick")," job failed"),(0,i.kt)("li",{parentName:"ul"},"It applies the PR label ",(0,i.kt)("inlineCode",{parentName:"li"},"cancelled-e2e-quick-test")," and leaves an informative PR comment when the ",(0,i.kt)("inlineCode",{parentName:"li"},"k8s-cluster-api-provider-e2e-quick")," job is canceled"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"unlabel-on-update-e2e-quick-test")),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"It is triggered by the PR update only when PR contains the ",(0,i.kt)("inlineCode",{parentName:"li"},"successful-e2e-quick-test")," label"),(0,i.kt)("li",{parentName:"ul"},"It ensures that any PR update invalidates a previous successful e2e test"),(0,i.kt)("li",{parentName:"ul"},"It removes ",(0,i.kt)("inlineCode",{parentName:"li"},"successful-e2e-quick-test")," label from the PR"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"periodic-daily")),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"This pipeline runs jobs daily at 3AM"),(0,i.kt)("li",{parentName:"ul"},"It executes ",(0,i.kt)("inlineCode",{parentName:"li"},"k8s-cluster-api-provider-e2e-conformance")," job"),(0,i.kt)("li",{parentName:"ul"},"The job overrides the ",(0,i.kt)("inlineCode",{parentName:"li"},"git_reference")," variable to ensure that the e2e conformance testing is executed on a specific tag")))),(0,i.kt)("h2",{id:"jobs"},"Jobs"),(0,i.kt)("p",null,"This section describes Zuul jobs defined within the k8s-cluster-api-provider project and linked in the above pipelines."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"k8s-cluster-api-provider-e2e-conformance")),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"It runs a sonobuoy conformance test against Kubernetes cluster spawned by k8s-cluster-api-provider scripts"),(0,i.kt)("li",{parentName:"ul"},"This job is a child job of ",(0,i.kt)("inlineCode",{parentName:"li"},"openstack-access-base")," that ensures OpenStack credentials\navailability in Zuul worker node. Parent job also defines a Zuul semaphore ",(0,i.kt)("inlineCode",{parentName:"li"},"semaphore-openstack-access"),",\nthat ensures that only one ",(0,i.kt)("inlineCode",{parentName:"li"},"openstack-access-base")," job (or its children) can run at a time"),(0,i.kt)("li",{parentName:"ul"},"See a high level ",(0,i.kt)("inlineCode",{parentName:"li"},"k8s-cluster-api-provider-e2e-conformance")," job steps:",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Pre-run playbook ",(0,i.kt)("inlineCode",{parentName:"li"},"dependencies.yaml")," installs project prerequisites, e.g. terraform, yq, etc. "),(0,i.kt)("li",{parentName:"ul"},"Main playbook ",(0,i.kt)("inlineCode",{parentName:"li"},"e2e.yaml")," spawns a k8s cluster, runs sonobuoy conformance test, and cleans created infrastructure, all by k8s-cluster-api-provider scripts"),(0,i.kt)("li",{parentName:"ul"},"Cleanup-run playbook ",(0,i.kt)("inlineCode",{parentName:"li"},"cleanup.yaml")," runs ",(0,i.kt)("inlineCode",{parentName:"li"},"ospurge"),", cleanup created application credentials and keypair to ensure that multiple e2e runs do not interfere"))))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"k8s-cluster-api-provider-e2e-quick")),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"It runs a sonobuoy quick test against Kubernetes cluster spawned by k8s-cluster-api-provider scripts"),(0,i.kt)("li",{parentName:"ul"},"This job is a child job of ",(0,i.kt)("inlineCode",{parentName:"li"},"openstack-access-base")," that ensures OpenStack credentials\navailability in Zuul worker node. Parent job also defines a Zuul semaphore ",(0,i.kt)("inlineCode",{parentName:"li"},"semaphore-openstack-access"),",\nthat ensures that only one ",(0,i.kt)("inlineCode",{parentName:"li"},"openstack-access-base")," job (or its children) can run at a time"),(0,i.kt)("li",{parentName:"ul"},"See a high level ",(0,i.kt)("inlineCode",{parentName:"li"},"k8s-cluster-api-provider-e2e-quick")," job steps:",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Pre-run playbook ",(0,i.kt)("inlineCode",{parentName:"li"},"dependencies.yaml")," installs project prerequisites, e.g. terraform, yq, etc. "),(0,i.kt)("li",{parentName:"ul"},"Main playbook ",(0,i.kt)("inlineCode",{parentName:"li"},"e2e.yaml")," spawns a k8s cluster, runs sonobuoy quick test, and cleans created infrastructure, all by k8s-cluster-api-provider scripts"),(0,i.kt)("li",{parentName:"ul"},"Cleanup-run playbook ",(0,i.kt)("inlineCode",{parentName:"li"},"cleanup.yaml")," runs ",(0,i.kt)("inlineCode",{parentName:"li"},"ospurge"),", cleanup created application credentials and keypair to ensure that multiple e2e runs do not interfere")))))),(0,i.kt)("h3",{id:"secrets"},"Secrets"),(0,i.kt)("p",null,"The parent job ",(0,i.kt)("inlineCode",{parentName:"p"},"openstack-access-base"),", from which e2e jobs inherit, defines secret variable ",(0,i.kt)("inlineCode",{parentName:"p"},"openstack-application-credential"),".\nThis secret is stored directly in the ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/zuul-config/blob/main/zuul.d/secrets.yaml"},"SCS/zuul-config repository")," in an encrypted form.\nIt contains OpenStack application credentials to access the OpenStack project dedicated for CI testing."),(0,i.kt)("p",null,"This secret is encrypted by the SCS/zuul-config repository RSA key that has been generated by SCS Zuul instance.\nSo only SCS Zuul instance is able to decrypt it (read the ",(0,i.kt)("a",{parentName:"p",href:"https://zuul-ci.org/docs/zuul/latest/project-config.html#encryption"},"docs"),")."),(0,i.kt)("p",null,"If you want to re-generate the mentioned secret or add another one using SCS/zuul-config repository RSA key, follow the below instructions:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Install zuul-client")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"pip install zuul-client\n")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},'Encrypt "super-secret" string by the SCS/zuul-config repository public key from SCS Zuul')),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'echo -n "super-secret" | \\\n zuul-client --zuul-url https://zuul.scs.community encrypt \\\n --tenant SCS \\\n --project github.com/SovereignCloudStack/zuul-config\n')),(0,i.kt)("h3",{id:"job-customization"},"Job customization"),(0,i.kt)("p",null,"In some cases you may want to change your ",(0,i.kt)("inlineCode",{parentName:"p"},"environment.tfvars")," file before running the e2e test without changing\nthe ",(0,i.kt)("inlineCode",{parentName:"p"},"environment.tfvars")," file in the repository. For example, you may want to change the ",(0,i.kt)("inlineCode",{parentName:"p"},"image")," variable to test a different\nsystem image without altering the default image used by the project."),(0,i.kt)("p",null,"To do so, you can in the body of the PR add the following text:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-text"},' ```ZUUL_CONFIG\n image = "Ubuntu 20.04"\n ```\n')),(0,i.kt)("h3",{id:"faq"},"FAQ"),(0,i.kt)("h4",{id:"how-do-developersreviewers-should-proceed-if-they-want-to-ci-test-this-project"},"How do developers/reviewers should proceed if they want to CI test this project?"),(0,i.kt)("p",null,"A developer initiates a PR as usual. If a reviewer deems that the PR requires e2e testing,\nthey can apply a specific label to the PR.\nCurrently, the following labels could be applied:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"e2e-test")," (for comprehensive e2e testing, including k8s cluster creation, execution of sonobuoy conformance tests, and cluster deletion)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"e2e-quick-test")," (for expedited e2e testing, involving k8s cluster creation, quick sonobuoy tests, and cluster deletion)")),(0,i.kt)("p",null,"After the e2e test has completed, the reviewer can examine the test results and respond\naccordingly, such as approving the PR if everything appears to be in order or requesting changes.\nSonobuoy test results, along with a link to the e2e logs, are conveyed back to the PR via a comment.\nAdditionally, the PR is labeled appropriately based on the overall e2e test result, using labels like\n",(0,i.kt)("inlineCode",{parentName:"p"},"successful-e2e-test"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"successful-e2e-quick-test"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"failed-e2e-test"),", or ",(0,i.kt)("inlineCode",{parentName:"p"},"failed-e2e-quick-test"),"."),(0,i.kt)("h4",{id:"why-do-we-use-pr-label-as-an-e2e-pipeline-trigger-instead-of-eg-pr-comment"},"Why do we use PR ",(0,i.kt)("inlineCode",{parentName:"h4"},"label")," as an e2e pipeline trigger instead of e.g. PR ",(0,i.kt)("inlineCode",{parentName:"h4"},"comment"),"?"),(0,i.kt)("p",null,"We consider PR labels to be a more secure pipeline trigger compared to, for example, PR comments.\nPR labels can only be applied by developers with ",(0,i.kt)("a",{parentName:"p",href:"https://docs.github.com/en/organizations/managing-user-access-to-your-organizations-repositories/managing-repository-roles/repository-roles-for-an-organization#permissions-for-each-role"},"triage")," repository access or higher.\nIn contrast, PR comments can be added by anyone with a GitHub account."),(0,i.kt)("p",null,"Members of the SCS GitHub organization are automatically granted 'write' access to SCS repositories.\nConsequently, the PR label mechanism ensures that only SCS organization members can trigger e2e pipelines."),(0,i.kt)("h4",{id:"how-do-we-ensure-that-any-pr-update-invalidates-a-previous-successful-e2e-test"},"How do we ensure that any PR update invalidates a previous successful e2e test?"),(0,i.kt)("p",null,"In fact, two mechanisms ensure the invalidation of a previously successful test when a PR is updated. "),(0,i.kt)("p",null,"Firstly, the pipelines ",(0,i.kt)("inlineCode",{parentName:"p"},"unlabel-on-update-")," remove the ",(0,i.kt)("inlineCode",{parentName:"p"},"successful-")," label\nfrom the PR when it's updated after a successful e2e test has finished.\nIf an e2e test is in progress and the PR is updated, the currently running e2e test is\ncanceled, the ",(0,i.kt)("inlineCode",{parentName:"p"},"successful-")," label is removed (if it exists), and the\n",(0,i.kt)("inlineCode",{parentName:"p"},"cancelled-")," label is applied along with an informative PR comment to\ninform the reviewer about the situation."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/437bedbc.714985c6.js b/assets/js/437bedbc.714985c6.js new file mode 100644 index 0000000000..0b0f70e9c6 --- /dev/null +++ b/assets/js/437bedbc.714985c6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7046],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>h});var n=a(67294);function s(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t=0||(s[a]=e[a]);return s}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(s[a]=e[a])}return s}var l=n.createContext({}),c=function(e){var t=n.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},p=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,s=e.mdxType,r=e.originalType,l=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=c(a),m=s,h=u["".concat(l,".").concat(m)]||u[m]||d[m]||r;return a?n.createElement(h,o(o({ref:t},p),{},{components:a})):n.createElement(h,o({ref:t},p))}));function h(e,t){var a=arguments,s=t&&t.mdxType;if("string"==typeof e||s){var r=a.length,o=new Array(r);o[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[u]="string"==typeof e?e:s,o[1]=i;for(var c=2;c{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>r,metadata:()=>i,toc:()=>c});var n=a(87462),s=(a(67294),a(3905));const r={},o="Release Notes for SCS Release 4",i={unversionedId:"releases/Release4",id:"releases/Release4",title:"Release Notes for SCS Release 4",description:"(Release Date: 2023-03-22)",source:"@site/docs/06-releases/Release4.md",sourceDirName:"06-releases",slug:"/releases/Release4",permalink:"/docs/releases/Release4",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/06-releases/Release4.md",tags:[],version:"current",frontMatter:{},sidebar:"docs",previous:{title:"Release Notes for SCS Release 3",permalink:"/docs/releases/Release3"},next:{title:"Release Notes for SCS Release 5",permalink:"/docs/releases/Release5"}},l={},c=[{value:"Scope",id:"scope",level:2},{value:"Component Versions and User-visible improvements (highlights)",id:"component-versions-and-user-visible-improvements-highlights",level:2},{value:"New Features (Highlights)",id:"new-features-highlights",level:2},{value:"Operator focused improvements",id:"operator-focused-improvements",level:3},{value:"SCS Developer focused improvements (testbed and k8s cluster management)",id:"scs-developer-focused-improvements-testbed-and-k8s-cluster-management",level:3},{value:"Upgrade/Migration notes",id:"upgrademigration-notes",level:2},{value:"Removals",id:"removals",level:2},{value:"Deprecations",id:"deprecations",level:2},{value:"Deprecations via OSISM",id:"deprecations-via-osism",level:3},{value:"Security Fixes",id:"security-fixes",level:2},{value:"Resolved Issues",id:"resolved-issues",level:2},{value:"Standards Conformance",id:"standards-conformance",level:2},{value:"Release Tagging",id:"release-tagging",level:2},{value:"List of known issues & restrictions in R4",id:"list-of-known-issues--restrictions-in-r4",level:2},{value:"Contributing",id:"contributing",level:2},{value:"Thanks",id:"thanks",level:2}],p={toc:c},u="wrapper";function d(e){let{components:t,...a}=e;return(0,s.kt)(u,(0,n.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,s.kt)("h1",{id:"release-notes-for-scs-release-4"},"Release Notes for SCS Release 4"),(0,s.kt)("p",null,"(Release Date: 2023-03-22)"),(0,s.kt)("h2",{id:"scope"},"Scope"),(0,s.kt)("p",null,"Release 4 has been developed alongside a set of associated outcomes. These outcomes are comprised of:"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"SCS is standardized"),(0,s.kt)("li",{parentName:"ul"},"SCS is federated"),(0,s.kt)("li",{parentName:"ul"},"SCS is continuously built and tested"),(0,s.kt)("li",{parentName:"ul"},"SCS is understandable"),(0,s.kt)("li",{parentName:"ul"},"SCS enables Operators with an excellent toolbox")),(0,s.kt)("p",null,"The SCS project is completely developed in the open, based on the principles of the four opens. Due to this a lot of our work can be tracked and used continuously without waiting for the half-year releases. Especially, but not limited to, this includes our efforts in regards to documentation and our standards."),(0,s.kt)("p",null,"One of the major highlights that happened in the R4 development cycle is our work on assuring ",(0,s.kt)("em",{parentName:"p"},"SCS is understandable"),".\nBe sure to look at ",(0,s.kt)("a",{parentName:"p",href:"https://docs.scs.community"},"our new documentation entry point"),".\nWe have created a ",(0,s.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/docs/blob/main/community/contribute/adding-docs-guide.md"},"systematic approach")," to structure documentation which already has been implemented for the ",(0,s.kt)("a",{parentName:"p",href:"https://docs.scs.community/docs/category/openstack-image-manager/"},"OpenStack Image Manager"),",\nthe ",(0,s.kt)("a",{parentName:"p",href:"https://docs.scs.community/docs/category/osism-testbed/"},"OSISM testbed")," and the ",(0,s.kt)("a",{parentName:"p",href:"https://docs.scs.community/docs/category/k8s-cluster-api-provider/"},"K8s Cluster API Provider"),". More will follow in a continuous manner."),(0,s.kt)("p",null,"Our community has created a growing amount of ",(0,s.kt)("a",{parentName:"p",href:"https://scs.community/blog/"},"blog articles")," which also help to understand the SCS project, its community and the technology that is worked on."),(0,s.kt)("h2",{id:"component-versions-and-user-visible-improvements-highlights"},"Component Versions and User-visible improvements (highlights)"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://releases.openstack.org/zed/highlights.html"},"OpenStack Zed release")),(0,s.kt)("li",{parentName:"ul"},"Ceph Quincy is available, the default release of Ceph is still Pacific."),(0,s.kt)("li",{parentName:"ul"},"The base infrastructure is provided by\n",(0,s.kt)("a",{parentName:"li",href:"https://release.osism.tech/notes/5.0.0.html"},"OSISM 5.0.0"),"\nwhich in turn builds on top of kolla and kolla-ansible."),(0,s.kt)("li",{parentName:"ul"},"With ",(0,s.kt)("a",{parentName:"li",href:"https://github.com/osism/cloud-in-a-box"},"Cloud-in-a-Box")," there is an easy way to get SCS up and running on a single hardware node as a test environment. There are two blog posts (",(0,s.kt)("a",{parentName:"li",href:"https://scs.community/2023/03/15/ciab/"},"part 1")," and ",(0,s.kt)("a",{parentName:"li",href:"https://scs.community/2023/03/15/ciab-2/"},"part2"),") covering it."),(0,s.kt)("li",{parentName:"ul"},"For new deployments of the IaaS reference implementation Ubuntu 22.04 is recommended while existing installations can be upgraded to R4 while staying on Ubuntu 20.04. With Release 5, upgrading to Ubuntu 22.04 will be required."),(0,s.kt)("li",{parentName:"ul"},"With ",(0,s.kt)("a",{parentName:"li",href:"https://github.com/osism/node-image"},"osism/node-image")," an iso image for much easier bootstrapping of new OSISM environments is available now"),(0,s.kt)("li",{parentName:"ul"},"The software for our ",(0,s.kt)("a",{parentName:"li",href:"https://github.com/SovereignCloudStack/k8s-cluster-api-provider"},"Kubernetes Cluster-API reference implementation")," has been updated and highlights are covered in own ",(0,s.kt)("a",{parentName:"li",href:"https://github.com/SovereignCloudStack/k8s-cluster-api-provider/blob/main/Release-Notes-R4.md"},"release notes"),".")),(0,s.kt)("h2",{id:"new-features-highlights"},"New Features (Highlights)"),(0,s.kt)("h3",{id:"operator-focused-improvements"},"Operator focused improvements"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"The ",(0,s.kt)("a",{parentName:"li",href:"https://github.com/osism/openstack-image-manager"},"Openstack Image Manager")," has seen many improvements and is the reference command to assure the images available comply with the ",(0,s.kt)("a",{parentName:"li",href:"https://github.com/SovereignCloudStack/standards/blob/main/Drafts/Image-Properties-Spec.md"},"SCS Image Standard")),(0,s.kt)("li",{parentName:"ul"},"For Ceph, special playbooks were added to validate the deployment status of the OSD, MON and MGR services in OSISM. The commands for use are ",(0,s.kt)("inlineCode",{parentName:"li"},"osism validate ceph-osds"),", ",(0,s.kt)("inlineCode",{parentName:"li"},"osism validate ceph-mons"),", and ",(0,s.kt)("inlineCode",{parentName:"li"},"osism validate ceph-mgrs"),"."),(0,s.kt)("li",{parentName:"ul"},"OVN has been updated to version 22.09."),(0,s.kt)("li",{parentName:"ul"},"OVS has been updated to version 3.0.1."),(0,s.kt)("li",{parentName:"ul"},"The ",(0,s.kt)("a",{parentName:"li",href:"https://github.com/osism/testbed"},"testbed")," uses per default a proxy for container pulling. This will allow for airgapped installations out of the box. Please note: a full airgap support (with local mirrors, etc.) will follow in a future release."),(0,s.kt)("li",{parentName:"ul"},"The efforts to create a well-maintained status page with well-defined interfaces resulted in an OpenAPI specification (within its own ",(0,s.kt)("a",{parentName:"li",href:"https://github.com/SovereignCloudStack/status-page-openapi"},"repository"),") which is intended to be implementable by multiple implementations."),(0,s.kt)("li",{parentName:"ul"},"The dashboard of the ",(0,s.kt)("a",{parentName:"li",href:"https://github.com/SovereignCloudStack/openstack-health-monitor/"},"OpenStack Health Monitor")," is in use by the SCS operators and has proven helpful a number of times in detecting and addressing issues. That said, it only received a few fixes and minor enhancements, as we plan to replace it with a more generic and more maintainable solution soon."),(0,s.kt)("li",{parentName:"ul"},"The k8s clusters built with our k8s-capi implementation now allow controlling the versions of more components; the latest tested and stable versions are used by default (if enabled). The latest version for the cilium CNI for example allows testing the upcoming k8s gateway API."),(0,s.kt)("li",{parentName:"ul"},"The k8s cluster now allows filtering access to the kubernetes API by IP ranges."),(0,s.kt)("li",{parentName:"ul"},"The k8s clusters now have the proxy protocol enabled with the nginx-ingress controller, so client IPs are visible; the previous issue that blocked internal access could be worked around.")),(0,s.kt)("h3",{id:"scs-developer-focused-improvements-testbed-and-k8s-cluster-management"},"SCS Developer focused improvements (testbed and k8s cluster management)"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"The testbed has been significantly simplified for new operators and developers and a ",(0,s.kt)("a",{parentName:"li",href:"https://docs.osism.tech/testbed/quickstart.html"},"Quick Start")," guide has been added.")),(0,s.kt)("h2",{id:"upgrademigration-notes"},"Upgrade/Migration notes"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"For the IaaS reference implementation, please refer to the ",(0,s.kt)("a",{parentName:"li",href:"https://release.osism.tech/notes/5.0.0.html#upgrade-notes"},"OSISM 5.0.0 Upgrade Notes"),"."),(0,s.kt)("li",{parentName:"ul"},"The k8s Cluster Management solution has an enhanced ",(0,s.kt)("a",{parentName:"li",href:"https://docs.scs.community/docs/k8s-cluster-api-provider/doc/Upgrade-Guide"},"upgrade guide")," that covers the upgrade of clusters as well as the upgrade of the cluster management server.")),(0,s.kt)("h2",{id:"removals"},"Removals"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"The ospurge wrapper script has been removed from the osism.services.openstackclient role. The ospurge project is no longer compatible with the current OpenStack SDK. The command openstack project purge can be used as an alternative."),(0,s.kt)("li",{parentName:"ul"},"The docker-compose package is uninstalled by the osism.commons.docker_compose role. The Compose v2 plugin for Docker is now used instead of the old standalone docker-compose CLI. A dummy script has been added to /usr/local/bin which displays a corresponding message when using docker-compose."),(0,s.kt)("li",{parentName:"ul"},"Further removals from the IaaS reference implementation, please refer to the ",(0,s.kt)("a",{parentName:"li",href:"https://release.osism.tech/notes/5.0.0.html#removals"},"OSISM 5.0.0 Removals Section"),"."),(0,s.kt)("li",{parentName:"ul"},"The k8s cluster parameter ",(0,s.kt)("inlineCode",{parentName:"li"},"ETCD_PRIO_BOOST")," that was already unused has been removed as announced with R3.")),(0,s.kt)("h2",{id:"deprecations"},"Deprecations"),(0,s.kt)("h3",{id:"deprecations-via-osism"},"Deprecations via OSISM"),(0,s.kt)("p",null,"For these please also refer to the ",(0,s.kt)("a",{parentName:"p",href:"https://release.osism.tech/notes/5.0.0.html#deprecations"},"upstream deprecation notices")),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"The role osism.services.bird is deprecated. In future, FRRouting (osism.services.frr) will be used."),(0,s.kt)("li",{parentName:"ul"},"The role osism.services.minikube is deprecated. In future osism.services.k8s will be used."),(0,s.kt)("li",{parentName:"ul"},"Heat is deprecated in favor of more generic Infrastructure as Code tools like Terraform as of now and will be removed in the future (exact removal date is not yet known)"),(0,s.kt)("li",{parentName:"ul"},"Swift (currently available as Technical Preview) will be removed in favor of Ceph RGW"),(0,s.kt)("li",{parentName:"ul"},"Trove (currently available as Technical Preview) will be removed in favor of Kubernetes database operators"),(0,s.kt)("li",{parentName:"ul"},"Skydive (currently available as Technical Preview) will be removed in the future, the project is not maintained anymore, last commit is 8th Jan 2022 (",(0,s.kt)("a",{parentName:"li",href:"https://review.opendev.org/c/openstack/kolla/+/869191"},"https://review.opendev.org/c/openstack/kolla/+/869191"),")"),(0,s.kt)("li",{parentName:"ul"},"The login to a registry with the ",(0,s.kt)("inlineCode",{parentName:"li"},"osism.services.docker")," role is deprecated in favor of the new ",(0,s.kt)("inlineCode",{parentName:"li"},"osism.commons.docker_login")," role.")),(0,s.kt)("h2",{id:"security-fixes"},"Security Fixes"),(0,s.kt)("p",null,"Throughout the Release 4 development cycle, the SCS project issued two security advisories for upstream components:"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("p",{parentName:"li"},"In November 2022 an advisory regarding ",(0,s.kt)("a",{parentName:"p",href:"https://www.openssl.org/news/secadv/20221101.txt"},"CVE-2022-3602 and CVE-2022-3786")," in OpenSSL was issued.\nOur ",(0,s.kt)("a",{parentName:"p",href:"https://scs.community/security/2022/11/01/advisory-spookyssl/"},"advisory"),".")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("p",{parentName:"li"},"In February 2023 an advisory regarding ",(0,s.kt)("a",{parentName:"p",href:"https://cve.report/CVE-2022-47951"},"CVE 2022-47951")," in OpenStack components nova and glance was published.\nOur ",(0,s.kt)("a",{parentName:"p",href:"https://scs.community/security/2023/01/24/cve-2022-47951/"},"advisory"),"."))),(0,s.kt)("p",null,"Fixes were delivered via maintenance updates to existing R3 deployments, but of course also included in the main development branch that became R4."),(0,s.kt)("h2",{id:"resolved-issues"},"Resolved Issues"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"Breakage with old kustomize syntax has been addressed.(",(0,s.kt)("a",{parentName:"li",href:"https://github.com/SovereignCloudStack/k8s-cluster-api-provider/issues/328"},"k8s-capi/#328"),")"),(0,s.kt)("li",{parentName:"ul"},"The move of k8s container images from k8s.gcr.io to registry.k8s.io needed adjustments.(",(0,s.kt)("a",{parentName:"li",href:"https://github.com/SovereignCloudStack/k8s-cluster-api-provider/issues/321"},"k8s-capi/#321"),")")),(0,s.kt)("h2",{id:"standards-conformance"},"Standards Conformance"),(0,s.kt)("p",null,"The last months saw intense work in the standardization area. The process how standards are created has been documented.\nThe standards are collected in its own ",(0,s.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards"},"standards"),' repository.\nA machine readable file lists the required (and optional) standards that apply to "SCS-compatible" conformance at\nthe IaaS and the Container (KaaS) layer. The referenced executables are used by the compliance checking framework\nto test existing implementations for compliance. To run the checker, the tester needs access to the infrastructure\nunder test (normal user privileges are sufficient) and standard openstack and kubernetes client tools -- or just\nuse the docker container that is provided.'),(0,s.kt)("p",null,"The public clouds based on the SCS reference implementation from plusserver and Noris/Wavecon are tested automatically\nfrom us and the live result is visible in ",(0,s.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards"},"standards page"),".\nWe will enhance the standardization and test coverage significantly in the next months and we hope to list a number\nof more clouds there soon."),(0,s.kt)("h2",{id:"release-tagging"},"Release Tagging"),(0,s.kt)("p",null,"The code in OSISM and a number of SCS repositories will receive the ",(0,s.kt)("inlineCode",{parentName:"p"},"v5.0.0")," tag; some repositories use\n",(0,s.kt)("inlineCode",{parentName:"p"},"maintained/v5.0.x")," and ",(0,s.kt)("inlineCode",{parentName:"p"},"maintained/v5.x")," branches for providing code that only gets bug- and security fixes (5.0.x)\nor only those plus selected, backwards-compatible enhancements (5.x)."),(0,s.kt)("h2",{id:"list-of-known-issues--restrictions-in-r4"},"List of known issues & restrictions in R4"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"The k8s cluster-API code does not work well with OpenStack API endpoints that require trusting a custom CA."),(0,s.kt)("li",{parentName:"ul"},"The OpenStack component Horizon has two issues when working with Swift endpoints. One issue is a ",(0,s.kt)("a",{parentName:"li",href:"https://bugs.launchpad.net/horizon/+bug/1993005"},"known bug")," when uploading objects to Swift endpoints. A workaround will be released shortly after R4. The ",(0,s.kt)("a",{parentName:"li",href:"https://github.com/osism/issues/issues/488"},"second issue")," is that existing Swift containers can not be set to public.")),(0,s.kt)("h2",{id:"contributing"},"Contributing"),(0,s.kt)("p",null,"We appreciate contribution to strategy and implementation, please join\nour community -- or just leave input on the github issues and PRs.\nHave a look at our ",(0,s.kt)("a",{parentName:"p",href:"https://scs.community/contribute/"},"How to contribute page"),"."),(0,s.kt)("h2",{id:"thanks"},"Thanks"),(0,s.kt)("p",null,"The work for R4 has been done by many contributors from our community.\nThe special thanks goes out to our contributors who participate in our community\non a very regular base - without these the various team calls and events like\nthe hackathons would be much less successful and fun."),(0,s.kt)("p",null,"Of course we are leveraging a huge amount of open source technology that has been\ncreated by our friends in other communities, many of which are part of the\nCNCF, Linux Foudation, OIF, and others. We participate and contribute where\nwe can and definitely want to acknowledge the great work that we build upon."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/441ae8e9.4fc54eca.js b/assets/js/441ae8e9.4fc54eca.js new file mode 100644 index 0000000000..3e6019b6e4 --- /dev/null +++ b/assets/js/441ae8e9.4fc54eca.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[200],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function s(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),c=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=c(e.components);return a.createElement(l.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=c(n),m=r,h=d["".concat(l,".").concat(m)]||d[m]||p[m]||o;return n?a.createElement(h,s(s({ref:t},u),{},{components:n})):a.createElement(h,s({ref:t},u))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,s=new Array(o);s[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[d]="string"==typeof e?e:r,s[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>p,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var a=n(87462),r=(n(67294),n(3905));const o={title:"Maintenance and Troubleshooting Guide for SCS k8s-cluster-api-provider",version:new Date("2023-03-16T00:00:00.000Z"),authors:"Kurt Garloff, Mathias Fechner, Andrej Friesen, Matej Feder",state:"Draft (v0.3)"},s="Maintenance and Troubleshooting Guide for SCS k8s-cluster-api-provider",i={unversionedId:"container/components/k8s-cluster-api-provider/doc/Maintenance_and_Troubleshooting",id:"container/components/k8s-cluster-api-provider/doc/Maintenance_and_Troubleshooting",title:"Maintenance and Troubleshooting Guide for SCS k8s-cluster-api-provider",description:"Client Certificates in Kubernetes expire after one year.",source:"@site/docs/03-container/components/k8s-cluster-api-provider/doc/Maintenance_and_Troubleshooting.md",sourceDirName:"03-container/components/k8s-cluster-api-provider/doc",slug:"/container/components/k8s-cluster-api-provider/doc/Maintenance_and_Troubleshooting",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/Maintenance_and_Troubleshooting",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/03-container/components/k8s-cluster-api-provider/doc/Maintenance_and_Troubleshooting.md",tags:[],version:"current",frontMatter:{title:"Maintenance and Troubleshooting Guide for SCS k8s-cluster-api-provider",version:"2023-03-16T00:00:00.000Z",authors:"Kurt Garloff, Mathias Fechner, Andrej Friesen, Matej Feder",state:"Draft (v0.3)"},sidebar:"docs",previous:{title:"Configuration",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/configuration"},next:{title:"Ingress with externalTrafficPolicy: local",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/LoadBalancer-ExtTrafficLocal"}},l={},c=[{value:"Client Certificates in Kubernetes expire after one year.",id:"client-certificates-in-kubernetes-expire-after-one-year",level:2},{value:"Certificate Authority expires",id:"certificate-authority-expires",level:2},{value:"Failed cluster deployment debugging",id:"failed-cluster-deployment-debugging",level:2},{value:"Cluster state",id:"cluster-state",level:2},{value:"Etcd maintenance",id:"etcd-maintenance",level:2},{value:"Defragmentation and backup",id:"defragmentation-and-backup",level:3}],u={toc:c},d="wrapper";function p(e){let{components:t,...n}=e;return(0,r.kt)(d,(0,a.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"maintenance-and-troubleshooting-guide-for-scs-k8s-cluster-api-provider"},"Maintenance and Troubleshooting Guide for SCS k8s-cluster-api-provider"),(0,r.kt)("h2",{id:"client-certificates-in-kubernetes-expire-after-one-year"},"Client Certificates in Kubernetes expire after one year."),(0,r.kt)("p",null,"What does a provider need to do in order to ",(0,r.kt)("strong",{parentName:"p"},"NOT")," run into a certificate issue?"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Update the cluster at least once a year to rotate certificates automatically"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-certs/#automatic-certificate-renewal"},"Automatic certificate renewal for cluster upgrades")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("blockquote",{parentName:"li"},(0,r.kt)("p",{parentName:"blockquote"},"kubeadm renews all the certificates during control plane\n",(0,r.kt)("a",{parentName:"p",href:"https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/"},"upgrade"),".\nThis feature is designed for addressing the simplest use cases; if you don't have specific\nrequirements on certificate renewal and perform Kubernetes version upgrades regularly\n(less than 1 year in between each upgrade), kubeadm will take care of keeping your\ncluster up to date and reasonably secure."))))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Renew all certificates with ",(0,r.kt)("inlineCode",{parentName:"p"},"kubeadm certs renew all")),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"You only need to do this when you don't upgrade your cluster"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-certs/#cmd-certs-renew"},"kubeadm certs renew"))))),(0,r.kt)("h2",{id:"certificate-authority-expires"},"Certificate Authority expires"),(0,r.kt)("p",null,"Another problem is that the CA might expire as well (normally after 10 years)"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"kubeadm")," does not have any tooling for this at the time of writing"),(0,r.kt)("li",{parentName:"ul"},"There is documentation for\n",(0,r.kt)("a",{parentName:"li",href:"https://kubernetes.io/docs/tasks/tls/manual-rotation-of-ca-certificates/"},"Manual Rotation of CA Certifcates")),(0,r.kt)("li",{parentName:"ul"},"On the management node, there is a ",(0,r.kt)("inlineCode",{parentName:"li"},"signer.sh")," that can be used to sign server certificates\nafter checking that they belong to the server.")),(0,r.kt)("h2",{id:"failed-cluster-deployment-debugging"},"Failed cluster deployment debugging"),(0,r.kt)("p",null,"NOTE: The following ",(0,r.kt)("inlineCode",{parentName:"p"},"kubectl")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"clusterctl")," commands should be executed against\nthe management Kubernetes cluster API. Keep in mind that these tools and the\n",(0,r.kt)("inlineCode",{parentName:"p"},"kubeconfig")," to access the management Kubernetes cluster are available in the management\nhost, hence it is convenient to execute the following commands from the management host."),(0,r.kt)("p",null,"Ask Kubernetes what went wrong:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"kubectl describe cluster \n")),(0,r.kt)("p",null,"The status and the events may give you a clue what happened. The healthy cluster should\nbe in the phase: ",(0,r.kt)("inlineCode",{parentName:"p"},"Provisioned")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"$ kubectl describe cluster | yq .Status.Phase\nProvisioned\n")),(0,r.kt)("p",null,"You can also have a look at the ",(0,r.kt)("inlineCode",{parentName:"p"},"openstackcluster")," object and see OpenStack related\nstatuses and events. The healthy cluster should be ready:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"$ kubectl describe openstackcluster | yq .Status.Ready\ntrue\n")),(0,r.kt)("p",null,"Note that you can instead execute ",(0,r.kt)("inlineCode",{parentName:"p"},"kubectl get cluster -ojsonpath='{ .status.phase }'"),"\nand ",(0,r.kt)("inlineCode",{parentName:"p"},"kubectl get openstackcluster -ojsonpath='{ .status.ready }'"),"\nif you don't have ",(0,r.kt)("inlineCode",{parentName:"p"},"yq")," at hand."),(0,r.kt)("p",null,"A handy command for cluster health investigation is ",(0,r.kt)("inlineCode",{parentName:"p"},"clusterctl describe cluster "),".\nThis prints infrastructure/control plane/workers readiness status and other relevant\ninformation like a failure reason. The healthy cluster output is similar to this:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"$ clusterctl describe cluster \nNAME READY SEVERITY REASON SINCE MESSAGE\nCluster/testcluster True 21m\n\u251c\u2500ClusterInfrastructure - OpenStackCluster/testcluster\n\u251c\u2500ControlPlane - KubeadmControlPlane/testcluster-control-plane True 23m\n\u2502 \u2514\u25003 Machines... True 21m See testcluster-control-plane-5ftjs, testcluster-control-plane-62cdj, ...\n\n\u2514\u2500Workers\n \u2514\u2500MachineDeployment/capi-testcluster-md-0-no1 True 22m\n \u2514\u25003 Machines... True 21m See capi-testcluster-md-0-no1-84dd86f598-bhxfd, capi-testcluster-md-0-no1-84dd86f598-f6pnl, ...\n")),(0,r.kt)("p",null,"The logs of the capi pod and especially the capo pod are a good source of information.\nTo find out in which condition the deployment status is, you can use the following way:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"kubectl logs -n capo-system -l control-plane=capo-controller-manager -c manager\n")),(0,r.kt)("p",null,"Successful cluster creation will log ",(0,r.kt)("inlineCode",{parentName:"p"},"Reconciled Machine create successfully")," for\nsuccessfully created nodes."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"kubectl logs -n capi-system -l control-plane=controller-manager -c manager\n")),(0,r.kt)("p",null,"In some cases could be a good idea to go through the official ","[capi]","\n(",(0,r.kt)("a",{parentName:"p",href:"https://cluster-api.sigs.k8s.io/user/troubleshooting.html"},"https://cluster-api.sigs.k8s.io/user/troubleshooting.html"),") and ",(0,r.kt)("a",{parentName:"p",href:"https://cluster-api-openstack.sigs.k8s.io/topics/troubleshooting.html"},"capo"),"\ntroubleshooting guides or check whether you hit some known bug already reported in\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api/issues?q=is%3Aissue+is%3Aopen+label%3Akind%2Fbug"},"capi"),"\nor ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api-provider-openstack/issues?q=is%3Aissue+is%3Aopen+label%3Akind%2Fbug"},"capo")," projects."),(0,r.kt)("p",null,"You can also check the OpenStack layer. A cluster deployment should result in a\nrouter,a network, a subnet, a loadbalancer (in front of kubeapi) and a number of servers (VMs)\nfor the control-plane and worker nodes. Have you run out of quota?"),(0,r.kt)("h2",{id:"cluster-state"},"Cluster state"),(0,r.kt)("p",null,"Have a look at the pods that run:\n",(0,r.kt)("inlineCode",{parentName:"p"},"kubectl --context=-admin@ get pods -A")),(0,r.kt)("p",null,"or have a look at the nodes:\n",(0,r.kt)("inlineCode",{parentName:"p"},"kubectl --context=-admin@ get nodes -o wide")),(0,r.kt)("p",null,"If you fall into some Kubernetes specific issues after a successful cluster\ncreation, go through the official ",(0,r.kt)("a",{parentName:"p",href:"https://kubernetes.io/docs/tasks/debug/debug-cluster/"},"Kubernetes"),"\ntroubleshooting guide."),(0,r.kt)("h2",{id:"etcd-maintenance"},"Etcd maintenance"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://etcd.io/"},"Etcd")," is a highly-available key value store used as Kubernetes'\nbacking store for all cluster data. This section contains etcd related maintenance\nnotes from SCS k8s-cluster-api-provider project perspective."),(0,r.kt)("p",null,"For further information about etcd maintenance visit an official ",(0,r.kt)("a",{parentName:"p",href:"https://etcd.io/docs/v3.5/op-guide/maintenance/"},"etcd maintenance guide"),"\nand/or ",(0,r.kt)("a",{parentName:"p",href:"https://kubernetes.io/docs/tasks/administer-cluster/configure-upgrade-etcd/"},"Kubernetes etcd operating guide"),"."),(0,r.kt)("h3",{id:"defragmentation-and-backup"},"Defragmentation and backup"),(0,r.kt)("p",null,"Etcd storage can become fragmented over time, for this, we have included a\nmaintenance script that regularly defragments and then also backups the database.\nThe script, called ",(0,r.kt)("inlineCode",{parentName:"p"},"etcd-defrag.sh")," is located in each control plane node's ",(0,r.kt)("inlineCode",{parentName:"p"},"/root"),"\ndirectory . It is executed through the systemd service unit file ",(0,r.kt)("inlineCode",{parentName:"p"},"etcd-defrag.service"),"\nand scheduled to run each day at 02:30:00 using the ",(0,r.kt)("inlineCode",{parentName:"p"},"etcd-defrag.timer")," systemd timer."),(0,r.kt)("p",null,"The defragmentation strategy is inspired by the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/ugur99/etcd-defrag-cronjob/"},"etcd-defrag-cronjob")," and\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.openshift.com/container-platform/4.9/scalability_and_performance/recommended-host-practices.html#automatic-defrag-etcd-data_recommended-host-practices"},"practices recommended")," by the OpenShift project.\nNote that the proposed strategy could be changed in a future version based on results from\nrelated ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/etcd-io/etcd/issues/15477"},"upstream issue #15477")," which wants to define\nan official solution on how to defragment etcd cluster."),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"etcd-defrag.sh")," script checks multiple conditions before the actual defragmentation as\nfollows:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The script should not be executed on non leader etcd member"),(0,r.kt)("li",{parentName:"ul"},"The script should not be executed on etcd cluster with some unhealthy member"),(0,r.kt)("li",{parentName:"ul"},"The script should not be executed on single member etcd cluster")),(0,r.kt)("p",null,"These pre-flight checks should ensure, that the defragmentation does not cause temporary\netcd cluster failures and/or unwanted etcd leader changes. They also prevent executing\nthe script on a single control-plane node cluster. Single-node etcd clusters are not\nmade for long-term operation. As a workaround, however, you can scale up to three\ncontrol-plane nodes overnight from time to time."),(0,r.kt)("p",null,"After all pre-flight checks passed the etcd cluster defragmentation is performed as follows:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Defragment the non leader etcd members first"),(0,r.kt)("li",{parentName:"ul"},"Change the leadership to the randomly selected and defragmentation completed etcd member"),(0,r.kt)("li",{parentName:"ul"},"Defragment the local (ex-leader) etcd member")),(0,r.kt)("p",null,"At the end of the defragmentation script, the local (ex-leader) etcd member is backed up\nand trimmed. Backup is saved and then compressed in the control plane ",(0,r.kt)("inlineCode",{parentName:"p"},"/root")," directory.\nYou can find it here: ",(0,r.kt)("inlineCode",{parentName:"p"},"/root/etcd-backup.xz"),". File system trim is performed by the ",(0,r.kt)("inlineCode",{parentName:"p"},"fstrim"),"\ncommand that discards unused blocks on a filesystem which could increase write performance\non the long run and also release unused storage. Cluster admins are not supposed to log\nin to the cluster nodes (neither control plane nor workers) and thus won't access or use\nthese backup files. The local backups on these nodes however can prove useful however\nin a disaster recovery scenario."),(0,r.kt)("p",null,"All mentioned pre-flight checks could be skipped by the optional arguments that force\ndefragmentation despite potential failures. Optional arguments are:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"--force-single")," (allows to execute defragmentation on single member etcd cluster)"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"--force-unhealthy")," (allows to execute defragmentation on unhealthy etcd member)"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"--force-nonleader")," (allows to execute defragmentation on non leader etcd member)")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"We do not recommend to log in to the cluster nodes let alone executing manual\ndefragmentation")," using the optional arguments above. If you are aware of potential\nissues, you can access the control plane node and execute the defragmentation script\nmanually as follows:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"/root/etcd-defrag.sh [--force-single] [--force-unhealthy] [--force-nonleader]\n")))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4468ebd1.8749ca1b.js b/assets/js/4468ebd1.8749ca1b.js new file mode 100644 index 0000000000..f7ff15a8c8 --- /dev/null +++ b/assets/js/4468ebd1.8749ca1b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2936],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>g});var o=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function a(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var c=o.createContext({}),l=function(e){var t=o.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},u=function(e){var t=l(e.components);return o.createElement(c.Provider,{value:t},e.children)},m="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},f=o.forwardRef((function(e,t){var r=e.components,n=e.mdxType,i=e.originalType,c=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),m=l(r),f=n,g=m["".concat(c,".").concat(f)]||m[f]||p[f]||i;return r?o.createElement(g,a(a({ref:t},u),{},{components:r})):o.createElement(g,a({ref:t},u))}));function g(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,a=new Array(i);a[0]=f;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[m]="string"==typeof e?e:n,a[1]=s;for(var l=2;l{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>p,frontMatter:()=>i,metadata:()=>s,toc:()=>l});var o=r(87462),n=(r(67294),r(3905));const i={slug:"first-blog-post",title:"First Blog Post",authors:"itrich",tags:["community","howto"]},a=void 0,s={permalink:"/blog/first-blog-post",editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/blog/2022-10-28-first-blog-post.md",source:"@site/blog/2022-10-28-first-blog-post.md",title:"First Blog Post",description:"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet",date:"2022-10-28T00:00:00.000Z",formattedDate:"October 28, 2022",tags:[{label:"community",permalink:"/blog/tags/community"},{label:"howto",permalink:"/blog/tags/howto"}],readingTime:.12,hasTruncateMarker:!1,authors:[{name:"Eduard Itrich",title:"Community Manager @ SCS",url:"https://github.com/itrich",imageURL:"https://github.com/itrich.png",key:"itrich"}],frontMatter:{slug:"first-blog-post",title:"First Blog Post",authors:"itrich",tags:["community","howto"]}},c={authorsImageUrls:[void 0]},l=[],u={toc:l},m="wrapper";function p(e){let{components:t,...r}=e;return(0,n.kt)(m,(0,o.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/45f4377b.7e84abe9.js b/assets/js/45f4377b.7e84abe9.js new file mode 100644 index 0000000000..6bb75620bb --- /dev/null +++ b/assets/js/45f4377b.7e84abe9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3959],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var i=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function a(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=i.createContext({}),d=function(e){var t=i.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},c=function(e){var t=d(e.components);return i.createElement(l.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},g=i.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=d(n),g=o,f=u["".concat(l,".").concat(g)]||u[g]||p[g]||r;return n?i.createElement(f,a(a({ref:t},c),{},{components:n})):i.createElement(f,a({ref:t},c))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,a=new Array(r);a[0]=g;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:o,a[1]=s;for(var d=2;d{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>p,frontMatter:()=>r,metadata:()=>s,toc:()=>d});var i=n(87462),o=(n(67294),n(3905));const r={sidebar_label:"Seed",sidebar_position:10},a="Seed",s={unversionedId:"iaas/guides/deploy-guide/seed",id:"iaas/guides/deploy-guide/seed",title:"Seed",description:"The seed node is used once for the initial bootstrap of the manager node. It is sufficient",source:"@site/docs/02-iaas/guides/deploy-guide/seed.md",sourceDirName:"02-iaas/guides/deploy-guide",slug:"/iaas/guides/deploy-guide/seed",permalink:"/docs/iaas/guides/deploy-guide/seed",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/deploy-guide/seed.md",tags:[],version:"current",sidebarPosition:10,frontMatter:{sidebar_label:"Seed",sidebar_position:10},sidebar:"docs",previous:{title:"Deploy Guide",permalink:"/docs/iaas/guides/deploy-guide/"},next:{title:"Manager",permalink:"/docs/iaas/guides/deploy-guide/manager"}},l={},d=[{value:"Install required packages",id:"install-required-packages",level:2},{value:"Get a copy of the configuration repository",id:"get-a-copy-of-the-configuration-repository",level:2}],c={toc:d},u="wrapper";function p(e){let{components:t,...n}=e;return(0,o.kt)(u,(0,i.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"seed"},"Seed"),(0,o.kt)("p",null,"The seed node is used once for the initial bootstrap of the manager node. It is sufficient\nto use the local workstation. It doesn't have to be a dedicated system. The seed node is\nno longer needed in the further process. The seed node must be able to reach the manager\nnode via SSH."),(0,o.kt)("p",null,"The use of Linux on the seed node is recommended. Other operating systems should also\nwork without problems."),(0,o.kt)("h2",{id:"install-required-packages"},"Install required packages"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"sudo apt-get install git python3-pip python3-virtualenv sshpass\n")),(0,o.kt)("h2",{id:"get-a-copy-of-the-configuration-repository"},"Get a copy of the configuration repository"),(0,o.kt)("p",null,"Each environment managed with OSISM is based on a configuration repository. This was\npreviously created with Cookiecutter and the ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/osism/cfg-cookiecutter"},"osism/cfg-cookiecutter"),"\nrepository."),(0,o.kt)("p",null,"The creation of the configuration repository is covered in chapter\n",(0,o.kt)("a",{parentName:"p",href:"../configuration-guide/configuration-repository#creating-a-new-configuration-repository"},"Creation of a configuration repository"),"\nof the ",(0,o.kt)("a",{parentName:"p",href:"../configuration-guide"},"Configuration Guide"),"."),(0,o.kt)("p",null,"A configuration repository is stored on a Git server (e.g. GitHub, Gitlab, ...). The\nconfiguration repository is individual for each environment and is therefore not provided\nby us."),(0,o.kt)("p",null,"The configuration repository to be used must be available on the seed node. In the following\nexample, replace ",(0,o.kt)("inlineCode",{parentName:"p"},"YOUR_ORG")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"YOUR_NEW_CONFIGURATION_REPOSITORY")," accordingly."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"git clone ssh://git@github.com:YOUR_ORG/YOUR_NEW_CONFIGURATION_REPOSITORY.git\n")),(0,o.kt)("p",null,"Examples:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"The repository is located in the ",(0,o.kt)("inlineCode",{parentName:"li"},"regiocloud")," organisation on GitHub, has the name\nconfiguration and can be accessed via SSH: ",(0,o.kt)("inlineCode",{parentName:"li"},"ssh://git@github.com:regiocloud/configuration.git")),(0,o.kt)("li",{parentName:"ul"},"The repository is located in the ",(0,o.kt)("inlineCode",{parentName:"li"},"regiocloud")," organisation on Gitlab, has the name configuration\nand can be accessed via SSH: ",(0,o.kt)("inlineCode",{parentName:"li"},"ssh://git@gitlab.com:regiocloud/configuration.git")),(0,o.kt)("li",{parentName:"ul"},"The repository is located in the ",(0,o.kt)("inlineCode",{parentName:"li"},"regiocloud")," organisation on an internal Gitlab, has the name\nconfiguration and can be accessed via SSH: ",(0,o.kt)("inlineCode",{parentName:"li"},"ssh://git@git.services.osism.tech:regiocloud/configuration.git"))),(0,o.kt)("p",null,"If necessary, the configuration SSH key can be used for the initial transfer of the repository."),(0,o.kt)("p",null,"For this, the following content is added in ",(0,o.kt)("inlineCode",{parentName:"p"},"~/.ssh/config")," and the SSH privte key is stored in\n",(0,o.kt)("inlineCode",{parentName:"p"},"~/.ssh/id_rsa.configuration"),"."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"Host github.com\n HostName github.com\n User git\n Port 22\n IdentityFile ~/.ssh/id_rsa.configuration\n")))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/477ed06d.df0a39b2.js b/assets/js/477ed06d.df0a39b2.js new file mode 100644 index 0000000000..79ac9c00fd --- /dev/null +++ b/assets/js/477ed06d.df0a39b2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1775],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>m});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},y=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(n),y=a,m=u["".concat(l,".").concat(y)]||u[y]||d[y]||i;return n?r.createElement(m,o(o({ref:t},p),{},{components:n})):r.createElement(m,o({ref:t},p))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,o=new Array(i);o[0]=y;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:a,o[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var r=n(87462),a=(n(67294),n(3905));const i={},o="SCS-0101: Entropy",s={unversionedId:"iaas/scs-0101",id:"iaas/scs-0101",title:"SCS-0101: Entropy",description:"The SCS-0101 Entropy Standard ensures adequate entropy is available in virtual instances, crucial for operations like secure key creation in cryptography. The standard recommends using kernel version 5.18 or higher and activating the hwrngmodel: virtio attribute for images, while compute nodes should employ CPUs with entropy accessing instructions unfiltered by the hypervisor. It allows the infusion of the hosts entropy sources into virtual instances and ensures the availability and quality of entropy in virtual environments, promoting system security and efficiency.",source:"@site/standards/iaas/scs-0101.md",sourceDirName:"iaas",slug:"/iaas/scs-0101",permalink:"/standards/iaas/scs-0101",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"standards",previous:{title:"SCS Flavor Naming Standard",permalink:"/standards/scs-0100-v3-flavor-naming"},next:{title:"SCS Entropy",permalink:"/standards/scs-0101-v1-entropy"}},l={},c=[],p={toc:c},u="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(u,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"scs-0101-entropy"},"SCS-0101: Entropy"),(0,a.kt)("p",null,"The SCS-0101 Entropy Standard ensures adequate entropy is available in virtual instances, crucial for operations like secure key creation in cryptography. The standard recommends using kernel version 5.18 or higher and activating the hw_rng_model: virtio attribute for images, while compute nodes should employ CPUs with entropy accessing instructions unfiltered by the hypervisor. It allows the infusion of the hosts entropy sources into virtual instances and ensures the availability and quality of entropy in virtual environments, promoting system security and efficiency."),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Version"),(0,a.kt)("th",{parentName:"tr",align:null},"Type"),(0,a.kt)("th",{parentName:"tr",align:null},"State"),(0,a.kt)("th",{parentName:"tr",align:null},"stabilized"),(0,a.kt)("th",{parentName:"tr",align:null},"obsoleted"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("a",{parentName:"td",href:"/standards/scs-0101-v1-entropy"},"SCS-0101-v1")),(0,a.kt)("td",{parentName:"tr",align:null},"Standard"),(0,a.kt)("td",{parentName:"tr",align:null},"\ud83d\udfe0 Draft"),(0,a.kt)("td",{parentName:"tr",align:null},"-"),(0,a.kt)("td",{parentName:"tr",align:null},"-")))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/487.7b135b0c.js b/assets/js/487.7b135b0c.js new file mode 100644 index 0000000000..9a656f4224 --- /dev/null +++ b/assets/js/487.7b135b0c.js @@ -0,0 +1,7370 @@ +exports.id = 487; +exports.ids = [487]; +exports.modules = { + +/***/ 17295: +/***/ ((module) => { + +(function(f){if(true){module.exports=f()}else { var g; }})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=undefined;if(!f&&c)return require(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=undefined,i=0;i 0 && arguments[0] !== undefined ? arguments[0] : {}, + _ref$defaultLayoutOpt = _ref.defaultLayoutOptions, + defaultLayoutOptions = _ref$defaultLayoutOpt === undefined ? {} : _ref$defaultLayoutOpt, + _ref$algorithms = _ref.algorithms, + algorithms = _ref$algorithms === undefined ? ['layered', 'stress', 'mrtree', 'radial', 'force', 'disco', 'sporeOverlap', 'sporeCompaction', 'rectpacking'] : _ref$algorithms, + workerFactory = _ref.workerFactory, + workerUrl = _ref.workerUrl; + + _classCallCheck(this, ELK); + + this.defaultLayoutOptions = defaultLayoutOptions; + this.initialized = false; + + // check valid worker construction possible + if (typeof workerUrl === 'undefined' && typeof workerFactory === 'undefined') { + throw new Error("Cannot construct an ELK without both 'workerUrl' and 'workerFactory'."); + } + var factory = workerFactory; + if (typeof workerUrl !== 'undefined' && typeof workerFactory === 'undefined') { + // use default Web Worker + factory = function factory(url) { + return new Worker(url); + }; + } + + // create the worker + var worker = factory(workerUrl); + if (typeof worker.postMessage !== 'function') { + throw new TypeError("Created worker does not provide" + " the required 'postMessage' function."); + } + + // wrap the worker to return promises + this.worker = new PromisedWorker(worker); + + // initially register algorithms + this.worker.postMessage({ + cmd: 'register', + algorithms: algorithms + }).then(function (r) { + return _this.initialized = true; + }).catch(console.err); + } + + _createClass(ELK, [{ + key: 'layout', + value: function layout(graph) { + var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, + _ref2$layoutOptions = _ref2.layoutOptions, + layoutOptions = _ref2$layoutOptions === undefined ? this.defaultLayoutOptions : _ref2$layoutOptions, + _ref2$logging = _ref2.logging, + logging = _ref2$logging === undefined ? false : _ref2$logging, + _ref2$measureExecutio = _ref2.measureExecutionTime, + measureExecutionTime = _ref2$measureExecutio === undefined ? false : _ref2$measureExecutio; + + if (!graph) { + return Promise.reject(new Error("Missing mandatory parameter 'graph'.")); + } + return this.worker.postMessage({ + cmd: 'layout', + graph: graph, + layoutOptions: layoutOptions, + options: { + logging: logging, + measureExecutionTime: measureExecutionTime + } + }); + } + }, { + key: 'knownLayoutAlgorithms', + value: function knownLayoutAlgorithms() { + return this.worker.postMessage({ cmd: 'algorithms' }); + } + }, { + key: 'knownLayoutOptions', + value: function knownLayoutOptions() { + return this.worker.postMessage({ cmd: 'options' }); + } + }, { + key: 'knownLayoutCategories', + value: function knownLayoutCategories() { + return this.worker.postMessage({ cmd: 'categories' }); + } + }, { + key: 'terminateWorker', + value: function terminateWorker() { + this.worker.terminate(); + } + }]); + + return ELK; +}(); + +exports.default = ELK; + +var PromisedWorker = function () { + function PromisedWorker(worker) { + var _this2 = this; + + _classCallCheck(this, PromisedWorker); + + if (worker === undefined) { + throw new Error("Missing mandatory parameter 'worker'."); + } + this.resolvers = {}; + this.worker = worker; + this.worker.onmessage = function (answer) { + // why is this necessary? + setTimeout(function () { + _this2.receive(_this2, answer); + }, 0); + }; + } + + _createClass(PromisedWorker, [{ + key: 'postMessage', + value: function postMessage(msg) { + var id = this.id || 0; + this.id = id + 1; + msg.id = id; + var self = this; + return new Promise(function (resolve, reject) { + // prepare the resolver + self.resolvers[id] = function (err, res) { + if (err) { + self.convertGwtStyleError(err); + reject(err); + } else { + resolve(res); + } + }; + // post the message + self.worker.postMessage(msg); + }); + } + }, { + key: 'receive', + value: function receive(self, answer) { + var json = answer.data; + var resolver = self.resolvers[json.id]; + if (resolver) { + delete self.resolvers[json.id]; + if (json.error) { + resolver(json.error); + } else { + resolver(null, json.data); + } + } + } + }, { + key: 'terminate', + value: function terminate() { + if (this.worker.terminate) { + this.worker.terminate(); + } + } + }, { + key: 'convertGwtStyleError', + value: function convertGwtStyleError(err) { + if (!err) { + return; + } + // Somewhat flatten the way GWT stores nested exception(s) + var javaException = err['__java$exception']; + if (javaException) { + // Note that the property name of the nested exception is different + // in the non-minified ('cause') and the minified (not deterministic) version. + // Hence, the version below only works for the non-minified version. + // However, as the minified stack trace is not of much use anyway, one + // should switch the used version for debugging in such a case. + if (javaException.cause && javaException.cause.backingJsObject) { + err.cause = javaException.cause.backingJsObject; + this.convertGwtStyleError(err.cause); + } + delete err['__java$exception']; + } + } + }]); + + return PromisedWorker; +}(); +},{}],2:[function(require,module,exports){ +(function (global){(function (){ +'use strict'; + +// -------------- FAKE ELEMENTS GWT ASSUMES EXIST -------------- +var $wnd; +if (typeof window !== 'undefined') + $wnd = window +else if (typeof global !== 'undefined') + $wnd = global // nodejs +else if (typeof self !== 'undefined') + $wnd = self // web worker + +var $moduleName, + $moduleBase; + +// -------------- WORKAROUND STRICT MODE, SEE #127 -------------- +var g, i, o; + +// -------------- GENERATED CODE -------------- +function nb(){} +function xb(){} +function Fd(){} +function $g(){} +function _p(){} +function yq(){} +function Sq(){} +function Es(){} +function Jw(){} +function Vw(){} +function VA(){} +function dA(){} +function MA(){} +function PA(){} +function PB(){} +function bx(){} +function cx(){} +function vy(){} +function Nz(){} +function Yz(){} +function Ylb(){} +function Ymb(){} +function xmb(){} +function Fmb(){} +function Qmb(){} +function gcb(){} +function ccb(){} +function jcb(){} +function jtb(){} +function otb(){} +function qtb(){} +function _fb(){} +function bpb(){} +function kpb(){} +function ppb(){} +function Gpb(){} +function drb(){} +function dzb(){} +function fzb(){} +function fxb(){} +function Vxb(){} +function Ovb(){} +function byb(){} +function zyb(){} +function Zyb(){} +function _yb(){} +function hzb(){} +function jzb(){} +function lzb(){} +function nzb(){} +function rzb(){} +function zzb(){} +function Czb(){} +function Ezb(){} +function Gzb(){} +function Izb(){} +function Mzb(){} +function bBb(){} +function NBb(){} +function PBb(){} +function RBb(){} +function iCb(){} +function OCb(){} +function SCb(){} +function GDb(){} +function JDb(){} +function fEb(){} +function xEb(){} +function CEb(){} +function GEb(){} +function yFb(){} +function KGb(){} +function tIb(){} +function vIb(){} +function xIb(){} +function zIb(){} +function OIb(){} +function SIb(){} +function TJb(){} +function VJb(){} +function XJb(){} +function XKb(){} +function fKb(){} +function VKb(){} +function VLb(){} +function jLb(){} +function nLb(){} +function GLb(){} +function KLb(){} +function MLb(){} +function OLb(){} +function RLb(){} +function YLb(){} +function bMb(){} +function gMb(){} +function lMb(){} +function pMb(){} +function wMb(){} +function zMb(){} +function CMb(){} +function FMb(){} +function LMb(){} +function zNb(){} +function PNb(){} +function kOb(){} +function pOb(){} +function tOb(){} +function yOb(){} +function FOb(){} +function GPb(){} +function aQb(){} +function cQb(){} +function eQb(){} +function gQb(){} +function iQb(){} +function CQb(){} +function MQb(){} +function OQb(){} +function ASb(){} +function fTb(){} +function kTb(){} +function STb(){} +function fUb(){} +function DUb(){} +function VUb(){} +function YUb(){} +function _Ub(){} +function _Wb(){} +function QWb(){} +function XWb(){} +function jVb(){} +function DVb(){} +function VVb(){} +function $Vb(){} +function dXb(){} +function hXb(){} +function lXb(){} +function gYb(){} +function HYb(){} +function SYb(){} +function VYb(){} +function dZb(){} +function P$b(){} +function T$b(){} +function h1b(){} +function m1b(){} +function q1b(){} +function u1b(){} +function y1b(){} +function C1b(){} +function e2b(){} +function g2b(){} +function m2b(){} +function q2b(){} +function u2b(){} +function S2b(){} +function U2b(){} +function W2b(){} +function _2b(){} +function e3b(){} +function h3b(){} +function p3b(){} +function t3b(){} +function w3b(){} +function y3b(){} +function A3b(){} +function M3b(){} +function Q3b(){} +function U3b(){} +function Y3b(){} +function l4b(){} +function q4b(){} +function s4b(){} +function u4b(){} +function w4b(){} +function y4b(){} +function L4b(){} +function N4b(){} +function P4b(){} +function R4b(){} +function T4b(){} +function X4b(){} +function I5b(){} +function Q5b(){} +function T5b(){} +function Z5b(){} +function l6b(){} +function o6b(){} +function t6b(){} +function z6b(){} +function L6b(){} +function M6b(){} +function P6b(){} +function X6b(){} +function $6b(){} +function a7b(){} +function c7b(){} +function g7b(){} +function j7b(){} +function m7b(){} +function r7b(){} +function x7b(){} +function D7b(){} +function D9b(){} +function b9b(){} +function h9b(){} +function j9b(){} +function l9b(){} +function w9b(){} +function F9b(){} +function hac(){} +function jac(){} +function pac(){} +function uac(){} +function Iac(){} +function Kac(){} +function Sac(){} +function obc(){} +function rbc(){} +function vbc(){} +function Fbc(){} +function Jbc(){} +function Xbc(){} +function ccc(){} +function fcc(){} +function lcc(){} +function occ(){} +function tcc(){} +function ycc(){} +function Acc(){} +function Ccc(){} +function Ecc(){} +function Gcc(){} +function Zcc(){} +function _cc(){} +function bdc(){} +function fdc(){} +function jdc(){} +function pdc(){} +function sdc(){} +function ydc(){} +function Adc(){} +function Cdc(){} +function Edc(){} +function Idc(){} +function Ndc(){} +function Qdc(){} +function Sdc(){} +function Udc(){} +function Wdc(){} +function Ydc(){} +function aec(){} +function hec(){} +function jec(){} +function lec(){} +function nec(){} +function uec(){} +function wec(){} +function yec(){} +function Aec(){} +function Fec(){} +function Jec(){} +function Lec(){} +function Nec(){} +function Rec(){} +function Uec(){} +function Zec(){} +function Zfc(){} +function lfc(){} +function tfc(){} +function xfc(){} +function zfc(){} +function Ffc(){} +function Jfc(){} +function Nfc(){} +function Pfc(){} +function Vfc(){} +function _fc(){} +function fgc(){} +function jgc(){} +function lgc(){} +function Bgc(){} +function ehc(){} +function ghc(){} +function ihc(){} +function khc(){} +function mhc(){} +function ohc(){} +function qhc(){} +function yhc(){} +function Ahc(){} +function Ghc(){} +function Ihc(){} +function Khc(){} +function Mhc(){} +function Shc(){} +function Uhc(){} +function Whc(){} +function dic(){} +function dlc(){} +function blc(){} +function flc(){} +function hlc(){} +function jlc(){} +function Glc(){} +function Ilc(){} +function Klc(){} +function Mlc(){} +function Mjc(){} +function Qjc(){} +function Qlc(){} +function Ulc(){} +function Ylc(){} +function Lkc(){} +function Nkc(){} +function Pkc(){} +function Rkc(){} +function Xkc(){} +function _kc(){} +function gmc(){} +function kmc(){} +function zmc(){} +function Fmc(){} +function Wmc(){} +function $mc(){} +function anc(){} +function mnc(){} +function wnc(){} +function Hnc(){} +function Jnc(){} +function Lnc(){} +function Nnc(){} +function Pnc(){} +function Ync(){} +function eoc(){} +function Aoc(){} +function Coc(){} +function Eoc(){} +function Joc(){} +function Loc(){} +function Zoc(){} +function _oc(){} +function bpc(){} +function hpc(){} +function kpc(){} +function ppc(){} +function pFc(){} +function Ryc(){} +function QCc(){} +function PDc(){} +function xGc(){} +function HGc(){} +function JGc(){} +function NGc(){} +function GIc(){} +function iKc(){} +function mKc(){} +function wKc(){} +function yKc(){} +function AKc(){} +function EKc(){} +function KKc(){} +function OKc(){} +function QKc(){} +function SKc(){} +function UKc(){} +function YKc(){} +function aLc(){} +function fLc(){} +function hLc(){} +function nLc(){} +function pLc(){} +function tLc(){} +function vLc(){} +function zLc(){} +function BLc(){} +function DLc(){} +function FLc(){} +function sMc(){} +function JMc(){} +function hNc(){} +function RNc(){} +function ZNc(){} +function _Nc(){} +function bOc(){} +function dOc(){} +function fOc(){} +function hOc(){} +function hRc(){} +function jRc(){} +function KRc(){} +function NRc(){} +function NQc(){} +function LQc(){} +function _Qc(){} +function cPc(){} +function iPc(){} +function kPc(){} +function mPc(){} +function xPc(){} +function zPc(){} +function zSc(){} +function BSc(){} +function GSc(){} +function ISc(){} +function NSc(){} +function TSc(){} +function NTc(){} +function NVc(){} +function oVc(){} +function SVc(){} +function VVc(){} +function XVc(){} +function ZVc(){} +function bWc(){} +function bXc(){} +function CXc(){} +function FXc(){} +function IXc(){} +function MXc(){} +function UXc(){} +function bYc(){} +function fYc(){} +function oYc(){} +function qYc(){} +function uYc(){} +function pZc(){} +function G$c(){} +function h0c(){} +function N0c(){} +function k1c(){} +function I1c(){} +function Q1c(){} +function f2c(){} +function i2c(){} +function k2c(){} +function w2c(){} +function O2c(){} +function S2c(){} +function Z2c(){} +function v3c(){} +function x3c(){} +function R3c(){} +function U3c(){} +function e4c(){} +function w4c(){} +function x4c(){} +function z4c(){} +function B4c(){} +function D4c(){} +function F4c(){} +function H4c(){} +function J4c(){} +function L4c(){} +function N4c(){} +function P4c(){} +function R4c(){} +function T4c(){} +function V4c(){} +function X4c(){} +function Z4c(){} +function _4c(){} +function _7c(){} +function b5c(){} +function d5c(){} +function f5c(){} +function h5c(){} +function H5c(){} +function Hfd(){} +function Zfd(){} +function Zed(){} +function ged(){} +function Jed(){} +function Ned(){} +function Red(){} +function Ved(){} +function bbd(){} +function mdd(){} +function _fd(){} +function fgd(){} +function kgd(){} +function Mgd(){} +function Ahd(){} +function Ald(){} +function Tld(){} +function xkd(){} +function rmd(){} +function knd(){} +function Jod(){} +function JCd(){} +function Bpd(){} +function BFd(){} +function oFd(){} +function bqd(){} +function bvd(){} +function jvd(){} +function yud(){} +function Hxd(){} +function EBd(){} +function aDd(){} +function MGd(){} +function vHd(){} +function RHd(){} +function wNd(){} +function zNd(){} +function CNd(){} +function KNd(){} +function XNd(){} +function $Nd(){} +function HPd(){} +function lUd(){} +function XUd(){} +function DWd(){} +function GWd(){} +function JWd(){} +function MWd(){} +function PWd(){} +function SWd(){} +function VWd(){} +function YWd(){} +function _Wd(){} +function xYd(){} +function BYd(){} +function mZd(){} +function EZd(){} +function GZd(){} +function JZd(){} +function MZd(){} +function PZd(){} +function SZd(){} +function VZd(){} +function YZd(){} +function _Zd(){} +function c$d(){} +function f$d(){} +function i$d(){} +function l$d(){} +function o$d(){} +function r$d(){} +function u$d(){} +function x$d(){} +function A$d(){} +function D$d(){} +function G$d(){} +function J$d(){} +function M$d(){} +function P$d(){} +function S$d(){} +function V$d(){} +function Y$d(){} +function _$d(){} +function c_d(){} +function f_d(){} +function i_d(){} +function l_d(){} +function o_d(){} +function r_d(){} +function u_d(){} +function x_d(){} +function A_d(){} +function D_d(){} +function G_d(){} +function J_d(){} +function M_d(){} +function P_d(){} +function S_d(){} +function V_d(){} +function Y_d(){} +function h5d(){} +function U6d(){} +function U9d(){} +function _8d(){} +function fae(){} +function hae(){} +function kae(){} +function nae(){} +function qae(){} +function tae(){} +function wae(){} +function zae(){} +function Cae(){} +function Fae(){} +function Iae(){} +function Lae(){} +function Oae(){} +function Rae(){} +function Uae(){} +function Xae(){} +function $ae(){} +function bbe(){} +function ebe(){} +function hbe(){} +function kbe(){} +function nbe(){} +function qbe(){} +function tbe(){} +function wbe(){} +function zbe(){} +function Cbe(){} +function Fbe(){} +function Ibe(){} +function Lbe(){} +function Obe(){} +function Rbe(){} +function Ube(){} +function Xbe(){} +function $be(){} +function bce(){} +function ece(){} +function hce(){} +function kce(){} +function nce(){} +function qce(){} +function tce(){} +function wce(){} +function zce(){} +function Cce(){} +function Fce(){} +function Ice(){} +function Lce(){} +function Oce(){} +function Rce(){} +function Uce(){} +function Xce(){} +function ude(){} +function Vge(){} +function dhe(){} +function s_b(a){} +function jSd(a){} +function ol(){wb()} +function oPb(){nPb()} +function EPb(){CPb()} +function gFb(){fFb()} +function TRb(){SRb()} +function ySb(){wSb()} +function PSb(){OSb()} +function dTb(){bTb()} +function i4b(){b4b()} +function D2b(){x2b()} +function J6b(){D6b()} +function u9b(){q9b()} +function $9b(){I9b()} +function Umc(){Imc()} +function abc(){Vac()} +function ZCc(){VCc()} +function kCc(){hCc()} +function rCc(){oCc()} +function Tcc(){Occ()} +function xkc(){gkc()} +function xDc(){rDc()} +function iDc(){cDc()} +function kwc(){jwc()} +function tJc(){jJc()} +function dJc(){aJc()} +function Pyc(){Nyc()} +function VBc(){SBc()} +function CFc(){yFc()} +function CUc(){wUc()} +function lUc(){fUc()} +function sUc(){pUc()} +function IUc(){GUc()} +function IWc(){HWc()} +function _Wc(){ZWc()} +function fHc(){dHc()} +function f0c(){d0c()} +function B0c(){A0c()} +function L0c(){J0c()} +function LTc(){JTc()} +function sTc(){rTc()} +function KLc(){ILc()} +function wNc(){tNc()} +function PYc(){OYc()} +function nZc(){lZc()} +function q3c(){p3c()} +function Z7c(){X7c()} +function Z9c(){Y9c()} +function _ad(){Zad()} +function kdd(){idd()} +function $md(){Smd()} +function HGd(){tGd()} +function hLd(){NKd()} +function J6d(){Uge()} +function Mvb(a){uCb(a)} +function Yb(a){this.a=a} +function cc(a){this.a=a} +function cj(a){this.a=a} +function ij(a){this.a=a} +function Dj(a){this.a=a} +function df(a){this.a=a} +function kf(a){this.a=a} +function ah(a){this.a=a} +function lh(a){this.a=a} +function th(a){this.a=a} +function Ph(a){this.a=a} +function vi(a){this.a=a} +function Ci(a){this.a=a} +function Fk(a){this.a=a} +function Ln(a){this.a=a} +function ap(a){this.a=a} +function zp(a){this.a=a} +function Yp(a){this.a=a} +function qq(a){this.a=a} +function Dq(a){this.a=a} +function wr(a){this.a=a} +function Ir(a){this.b=a} +function sj(a){this.c=a} +function sw(a){this.a=a} +function fw(a){this.a=a} +function xw(a){this.a=a} +function Cw(a){this.a=a} +function Qw(a){this.a=a} +function Rw(a){this.a=a} +function Xw(a){this.a=a} +function Xv(a){this.a=a} +function Sv(a){this.a=a} +function eu(a){this.a=a} +function Zx(a){this.a=a} +function _x(a){this.a=a} +function xy(a){this.a=a} +function xB(a){this.a=a} +function HB(a){this.a=a} +function TB(a){this.a=a} +function fC(a){this.a=a} +function wB(){this.a=[]} +function MBb(a,b){a.a=b} +function w_b(a,b){a.a=b} +function x_b(a,b){a.b=b} +function YOb(a,b){a.b=b} +function $Ob(a,b){a.b=b} +function ZGb(a,b){a.j=b} +function qNb(a,b){a.g=b} +function rNb(a,b){a.i=b} +function dRb(a,b){a.c=b} +function eRb(a,b){a.d=b} +function z_b(a,b){a.d=b} +function y_b(a,b){a.c=b} +function __b(a,b){a.k=b} +function E0b(a,b){a.c=b} +function njc(a,b){a.c=b} +function mjc(a,b){a.a=b} +function dFc(a,b){a.a=b} +function eFc(a,b){a.f=b} +function nOc(a,b){a.a=b} +function oOc(a,b){a.b=b} +function pOc(a,b){a.d=b} +function qOc(a,b){a.i=b} +function rOc(a,b){a.o=b} +function sOc(a,b){a.r=b} +function $Pc(a,b){a.a=b} +function _Pc(a,b){a.b=b} +function DVc(a,b){a.e=b} +function EVc(a,b){a.f=b} +function FVc(a,b){a.g=b} +function SZc(a,b){a.e=b} +function TZc(a,b){a.f=b} +function c$c(a,b){a.f=b} +function bJd(a,b){a.n=b} +function A1d(a,b){a.a=b} +function J1d(a,b){a.a=b} +function B1d(a,b){a.c=b} +function K1d(a,b){a.c=b} +function L1d(a,b){a.d=b} +function M1d(a,b){a.e=b} +function N1d(a,b){a.g=b} +function d2d(a,b){a.a=b} +function e2d(a,b){a.c=b} +function f2d(a,b){a.d=b} +function g2d(a,b){a.e=b} +function h2d(a,b){a.f=b} +function i2d(a,b){a.j=b} +function Z8d(a,b){a.a=b} +function $8d(a,b){a.b=b} +function g9d(a,b){a.a=b} +function Cic(a){a.b=a.a} +function Dg(a){a.c=a.d.d} +function vib(a){this.d=a} +function eib(a){this.a=a} +function Pib(a){this.a=a} +function Vib(a){this.a=a} +function $ib(a){this.a=a} +function mcb(a){this.a=a} +function Mcb(a){this.a=a} +function Xcb(a){this.a=a} +function Ndb(a){this.a=a} +function _db(a){this.a=a} +function teb(a){this.a=a} +function Qeb(a){this.a=a} +function djb(a){this.a=a} +function Gjb(a){this.a=a} +function Njb(a){this.a=a} +function Bjb(a){this.b=a} +function lnb(a){this.b=a} +function Dnb(a){this.b=a} +function anb(a){this.a=a} +function Mob(a){this.a=a} +function Rob(a){this.a=a} +function iob(a){this.c=a} +function olb(a){this.c=a} +function qub(a){this.c=a} +function Tub(a){this.a=a} +function Vub(a){this.a=a} +function Xub(a){this.a=a} +function Zub(a){this.a=a} +function tpb(a){this.a=a} +function _pb(a){this.a=a} +function Wqb(a){this.a=a} +function nsb(a){this.a=a} +function Rxb(a){this.a=a} +function Txb(a){this.a=a} +function Xxb(a){this.a=a} +function bzb(a){this.a=a} +function tzb(a){this.a=a} +function vzb(a){this.a=a} +function xzb(a){this.a=a} +function Kzb(a){this.a=a} +function Ozb(a){this.a=a} +function iAb(a){this.a=a} +function kAb(a){this.a=a} +function mAb(a){this.a=a} +function BAb(a){this.a=a} +function hBb(a){this.a=a} +function jBb(a){this.a=a} +function nBb(a){this.a=a} +function TBb(a){this.a=a} +function XBb(a){this.a=a} +function QCb(a){this.a=a} +function WCb(a){this.a=a} +function _Cb(a){this.a=a} +function dEb(a){this.a=a} +function QGb(a){this.a=a} +function YGb(a){this.a=a} +function tKb(a){this.a=a} +function CLb(a){this.a=a} +function JMb(a){this.a=a} +function RNb(a){this.a=a} +function kQb(a){this.a=a} +function mQb(a){this.a=a} +function FQb(a){this.a=a} +function ETb(a){this.a=a} +function UTb(a){this.a=a} +function dUb(a){this.a=a} +function hUb(a){this.a=a} +function EZb(a){this.a=a} +function j$b(a){this.a=a} +function v$b(a){this.e=a} +function J0b(a){this.a=a} +function M0b(a){this.a=a} +function R0b(a){this.a=a} +function U0b(a){this.a=a} +function i2b(a){this.a=a} +function k2b(a){this.a=a} +function o2b(a){this.a=a} +function s2b(a){this.a=a} +function G2b(a){this.a=a} +function I2b(a){this.a=a} +function K2b(a){this.a=a} +function M2b(a){this.a=a} +function W3b(a){this.a=a} +function $3b(a){this.a=a} +function V4b(a){this.a=a} +function u5b(a){this.a=a} +function A7b(a){this.a=a} +function G7b(a){this.a=a} +function J7b(a){this.a=a} +function M7b(a){this.a=a} +function Mbc(a){this.a=a} +function Pbc(a){this.a=a} +function lac(a){this.a=a} +function nac(a){this.a=a} +function qcc(a){this.a=a} +function Gdc(a){this.a=a} +function $dc(a){this.a=a} +function cec(a){this.a=a} +function _ec(a){this.a=a} +function pfc(a){this.a=a} +function Bfc(a){this.a=a} +function Lfc(a){this.a=a} +function ygc(a){this.a=a} +function Dgc(a){this.a=a} +function shc(a){this.a=a} +function uhc(a){this.a=a} +function whc(a){this.a=a} +function Chc(a){this.a=a} +function Ehc(a){this.a=a} +function Ohc(a){this.a=a} +function Yhc(a){this.a=a} +function Tkc(a){this.a=a} +function Vkc(a){this.a=a} +function Olc(a){this.a=a} +function pnc(a){this.a=a} +function rnc(a){this.a=a} +function dpc(a){this.a=a} +function fpc(a){this.a=a} +function GCc(a){this.a=a} +function KCc(a){this.a=a} +function mDc(a){this.a=a} +function jEc(a){this.a=a} +function HEc(a){this.a=a} +function FEc(a){this.c=a} +function qoc(a){this.b=a} +function bFc(a){this.a=a} +function GFc(a){this.a=a} +function iGc(a){this.a=a} +function kGc(a){this.a=a} +function mGc(a){this.a=a} +function $Gc(a){this.a=a} +function hIc(a){this.a=a} +function lIc(a){this.a=a} +function pIc(a){this.a=a} +function tIc(a){this.a=a} +function xIc(a){this.a=a} +function zIc(a){this.a=a} +function CIc(a){this.a=a} +function LIc(a){this.a=a} +function CKc(a){this.a=a} +function IKc(a){this.a=a} +function MKc(a){this.a=a} +function $Kc(a){this.a=a} +function cLc(a){this.a=a} +function jLc(a){this.a=a} +function rLc(a){this.a=a} +function xLc(a){this.a=a} +function OMc(a){this.a=a} +function ZOc(a){this.a=a} +function ZRc(a){this.a=a} +function aSc(a){this.a=a} +function I$c(a){this.a=a} +function K$c(a){this.a=a} +function M$c(a){this.a=a} +function O$c(a){this.a=a} +function U$c(a){this.a=a} +function n1c(a){this.a=a} +function z1c(a){this.a=a} +function B1c(a){this.a=a} +function Q2c(a){this.a=a} +function U2c(a){this.a=a} +function z3c(a){this.a=a} +function med(a){this.a=a} +function Xed(a){this.a=a} +function _ed(a){this.a=a} +function Qfd(a){this.a=a} +function Bgd(a){this.a=a} +function $gd(a){this.a=a} +function lrd(a){this.a=a} +function urd(a){this.a=a} +function vrd(a){this.a=a} +function wrd(a){this.a=a} +function xrd(a){this.a=a} +function yrd(a){this.a=a} +function zrd(a){this.a=a} +function Ard(a){this.a=a} +function Brd(a){this.a=a} +function Crd(a){this.a=a} +function Ird(a){this.a=a} +function Krd(a){this.a=a} +function Lrd(a){this.a=a} +function Mrd(a){this.a=a} +function Nrd(a){this.a=a} +function Prd(a){this.a=a} +function Srd(a){this.a=a} +function Yrd(a){this.a=a} +function Zrd(a){this.a=a} +function _rd(a){this.a=a} +function asd(a){this.a=a} +function bsd(a){this.a=a} +function csd(a){this.a=a} +function dsd(a){this.a=a} +function msd(a){this.a=a} +function osd(a){this.a=a} +function qsd(a){this.a=a} +function ssd(a){this.a=a} +function Wsd(a){this.a=a} +function Lsd(a){this.b=a} +function thd(a){this.f=a} +function qtd(a){this.a=a} +function yBd(a){this.a=a} +function GBd(a){this.a=a} +function MBd(a){this.a=a} +function SBd(a){this.a=a} +function iCd(a){this.a=a} +function YMd(a){this.a=a} +function GNd(a){this.a=a} +function EPd(a){this.a=a} +function EQd(a){this.a=a} +function NTd(a){this.a=a} +function qOd(a){this.b=a} +function lVd(a){this.c=a} +function VVd(a){this.e=a} +function iYd(a){this.a=a} +function RYd(a){this.a=a} +function ZYd(a){this.a=a} +function z0d(a){this.a=a} +function O0d(a){this.a=a} +function s0d(a){this.d=a} +function W5d(a){this.a=a} +function cge(a){this.a=a} +function xfe(a){this.e=a} +function Tfd(){this.a=0} +function jkb(){Vjb(this)} +function Rkb(){Ckb(this)} +function Lqb(){Uhb(this)} +function lEb(){kEb(this)} +function A_b(){s_b(this)} +function UQd(){this.c=FQd} +function v6d(a,b){b.Wb(a)} +function moc(a,b){a.b+=b} +function yXb(a){a.b=new Ji} +function vbb(a){return a.e} +function DB(a){return a.a} +function LB(a){return a.a} +function ZB(a){return a.a} +function lC(a){return a.a} +function EC(a){return a.a} +function wC(){return null} +function SB(){return null} +function hcb(){mvd();ovd()} +function zJb(a){a.b.tf(a.e)} +function j5b(a,b){a.b=b-a.b} +function g5b(a,b){a.a=b-a.a} +function PXc(a,b){b.ad(a.a)} +function plc(a,b){G0b(b,a)} +function hp(a,b,c){a.Od(c,b)} +function As(a,b){a.e=b;b.b=a} +function Zl(a){Ql();this.a=a} +function jq(a){Ql();this.a=a} +function sq(a){Ql();this.a=a} +function Fq(a){im();this.a=a} +function Sz(a){Rz();Qz.be(a)} +function gz(){Xy.call(this)} +function xcb(){Xy.call(this)} +function pcb(){gz.call(this)} +function tcb(){gz.call(this)} +function Bdb(){gz.call(this)} +function Vdb(){gz.call(this)} +function Ydb(){gz.call(this)} +function Geb(){gz.call(this)} +function bgb(){gz.call(this)} +function Apb(){gz.call(this)} +function Jpb(){gz.call(this)} +function utb(){gz.call(this)} +function x2c(){gz.call(this)} +function rQd(){this.a=this} +function MPd(){this.Bb|=256} +function tTb(){this.b=new mt} +function fA(){fA=ccb;new Lqb} +function rcb(){pcb.call(this)} +function dCb(a,b){a.length=b} +function Tvb(a,b){Ekb(a.a,b)} +function sKb(a,b){UHb(a.c,b)} +function SMc(a,b){Qqb(a.b,b)} +function vBd(a,b){uAd(a.a,b)} +function wBd(a,b){vAd(a.a,b)} +function GLd(a,b){Uhd(a.e,b)} +function d7d(a){D2d(a.c,a.b)} +function mj(a,b){a.kc().Nb(b)} +function Odb(a){this.a=Tdb(a)} +function Tqb(){this.a=new Lqb} +function gyb(){this.a=new Lqb} +function Wvb(){this.a=new Rkb} +function KFb(){this.a=new Rkb} +function PFb(){this.a=new Rkb} +function FFb(){this.a=new yFb} +function pGb(){this.a=new MFb} +function ZQb(){this.a=new MQb} +function Gxb(){this.a=new Pwb} +function jUb(){this.a=new PTb} +function sDb(){this.a=new oDb} +function zDb(){this.a=new tDb} +function CWb(){this.a=new Rkb} +function HXb(){this.a=new Rkb} +function nYb(){this.a=new Rkb} +function BYb(){this.a=new Rkb} +function fLb(){this.d=new Rkb} +function vYb(){this.a=new Tqb} +function a2b(){this.a=new Lqb} +function wZb(){this.b=new Lqb} +function TCc(){this.b=new Rkb} +function zJc(){this.e=new Rkb} +function uMc(){this.d=new Rkb} +function wdc(){this.a=new xkc} +function vKc(){Rkb.call(this)} +function twb(){Wvb.call(this)} +function oHb(){$Gb.call(this)} +function LXb(){HXb.call(this)} +function L_b(){H_b.call(this)} +function H_b(){A_b.call(this)} +function p0b(){A_b.call(this)} +function s0b(){p0b.call(this)} +function WMc(){VMc.call(this)} +function bNc(){VMc.call(this)} +function EPc(){CPc.call(this)} +function JPc(){CPc.call(this)} +function OPc(){CPc.call(this)} +function w1c(){s1c.call(this)} +function s7c(){Psb.call(this)} +function apd(){Ald.call(this)} +function ppd(){Ald.call(this)} +function lDd(){YCd.call(this)} +function NDd(){YCd.call(this)} +function mFd(){Lqb.call(this)} +function vFd(){Lqb.call(this)} +function GFd(){Lqb.call(this)} +function KPd(){Tqb.call(this)} +function OJd(){hJd.call(this)} +function aQd(){MPd.call(this)} +function SSd(){FId.call(this)} +function rUd(){FId.call(this)} +function oUd(){Lqb.call(this)} +function NYd(){Lqb.call(this)} +function cZd(){Lqb.call(this)} +function R8d(){MGd.call(this)} +function o9d(){MGd.call(this)} +function i9d(){R8d.call(this)} +function hee(){ude.call(this)} +function Dd(a){yd.call(this,a)} +function Hd(a){yd.call(this,a)} +function ph(a){lh.call(this,a)} +function Sh(a){Wc.call(this,a)} +function oi(a){Sh.call(this,a)} +function Ii(a){Wc.call(this,a)} +function Zdd(){this.a=new Psb} +function CPc(){this.a=new Tqb} +function s1c(){this.a=new Lqb} +function QSc(){this.a=new Rkb} +function D2c(){this.j=new Rkb} +function QXc(){this.a=new UXc} +function e_c(){this.a=new d_c} +function YCd(){this.a=new aDd} +function _k(){_k=ccb;$k=new al} +function Lk(){Lk=ccb;Kk=new Mk} +function wb(){wb=ccb;vb=new xb} +function hs(){hs=ccb;gs=new is} +function rs(a){Sh.call(this,a)} +function Gp(a){Sh.call(this,a)} +function xp(a){Lo.call(this,a)} +function Ep(a){Lo.call(this,a)} +function Tp(a){Wn.call(this,a)} +function wx(a){un.call(this,a)} +function ov(a){dv.call(this,a)} +function Mv(a){Br.call(this,a)} +function Ov(a){Br.call(this,a)} +function Lw(a){Br.call(this,a)} +function hz(a){Yy.call(this,a)} +function MB(a){hz.call(this,a)} +function eC(){fC.call(this,{})} +function Ftb(a){Atb();this.a=a} +function zwb(a){a.b=null;a.c=0} +function Vy(a,b){a.e=b;Sy(a,b)} +function LVb(a,b){a.a=b;NVb(a)} +function lIb(a,b,c){a.a[b.g]=c} +function vfd(a,b,c){Dfd(c,a,b)} +function Odc(a,b){rjc(b.i,a.n)} +function Wyc(a,b){Xyc(a).td(b)} +function ERb(a,b){return a*a/b} +function Xr(a,b){return a.g-b.g} +function tC(a){return new TB(a)} +function vC(a){return new yC(a)} +function ocb(a){hz.call(this,a)} +function qcb(a){hz.call(this,a)} +function ucb(a){hz.call(this,a)} +function vcb(a){Yy.call(this,a)} +function fGc(a){LFc();this.a=a} +function c0d(a){kzd();this.a=a} +function bhd(a){Rgd();this.f=a} +function dhd(a){Rgd();this.f=a} +function Cdb(a){hz.call(this,a)} +function Wdb(a){hz.call(this,a)} +function Zdb(a){hz.call(this,a)} +function Feb(a){hz.call(this,a)} +function Heb(a){hz.call(this,a)} +function Ccb(a){return uCb(a),a} +function Edb(a){return uCb(a),a} +function Gdb(a){return uCb(a),a} +function jfb(a){return uCb(a),a} +function tfb(a){return uCb(a),a} +function akb(a){return a.b==a.c} +function Hwb(a){return !!a&&a.b} +function pIb(a){return !!a&&a.k} +function qIb(a){return !!a&&a.j} +function amb(a){uCb(a);this.a=a} +function wVb(a){qVb(a);return a} +function Blb(a){Glb(a,a.length)} +function cgb(a){hz.call(this,a)} +function cqd(a){hz.call(this,a)} +function n8d(a){hz.call(this,a)} +function y2c(a){hz.call(this,a)} +function z2c(a){hz.call(this,a)} +function mde(a){hz.call(this,a)} +function pc(a){qc.call(this,a,0)} +function Ji(){Ki.call(this,12,3)} +function Kz(){Kz=ccb;Jz=new Nz} +function jz(){jz=ccb;iz=new nb} +function KA(){KA=ccb;JA=new MA} +function OB(){OB=ccb;NB=new PB} +function jc(){throw vbb(new bgb)} +function zh(){throw vbb(new bgb)} +function Pi(){throw vbb(new bgb)} +function Pj(){throw vbb(new bgb)} +function Qj(){throw vbb(new bgb)} +function Ym(){throw vbb(new bgb)} +function Gb(){this.a=GD(Qb(She))} +function oy(a){Ql();this.a=Qb(a)} +function Bs(a,b){a.Td(b);b.Sd(a)} +function iw(a,b){a.a.ec().Mc(b)} +function CYb(a,b,c){a.c.lf(b,c)} +function scb(a){qcb.call(this,a)} +function Oeb(a){Wdb.call(this,a)} +function Hfb(){mcb.call(this,'')} +function Ifb(){mcb.call(this,'')} +function Ufb(){mcb.call(this,'')} +function Vfb(){mcb.call(this,'')} +function Xfb(a){qcb.call(this,a)} +function zob(a){lnb.call(this,a)} +function Yob(a){Inb.call(this,a)} +function Gob(a){zob.call(this,a)} +function Mk(){Fk.call(this,null)} +function al(){Fk.call(this,null)} +function Az(){Az=ccb;!!(Rz(),Qz)} +function wrb(){wrb=ccb;vrb=yrb()} +function Mtb(a){return a.a?a.b:0} +function Vtb(a){return a.a?a.b:0} +function Lcb(a,b){return a.a-b.a} +function Wcb(a,b){return a.a-b.a} +function Peb(a,b){return a.a-b.a} +function eCb(a,b){return PC(a,b)} +function GC(a,b){return rdb(a,b)} +function _B(b,a){return a in b.a} +function _Db(a,b){a.f=b;return a} +function ZDb(a,b){a.b=b;return a} +function $Db(a,b){a.c=b;return a} +function aEb(a,b){a.g=b;return a} +function HGb(a,b){a.a=b;return a} +function IGb(a,b){a.f=b;return a} +function JGb(a,b){a.k=b;return a} +function dLb(a,b){a.a=b;return a} +function eLb(a,b){a.e=b;return a} +function zVb(a,b){a.e=b;return a} +function AVb(a,b){a.f=b;return a} +function KOb(a,b){a.b=true;a.d=b} +function DHb(a,b){a.b=new g7c(b)} +function uvb(a,b,c){b.td(a.a[c])} +function zvb(a,b,c){b.we(a.a[c])} +function wJc(a,b){return a.b-b.b} +function kOc(a,b){return a.g-b.g} +function WQc(a,b){return a.s-b.s} +function Lic(a,b){return a?0:b-1} +function SFc(a,b){return a?0:b-1} +function RFc(a,b){return a?b-1:0} +function M2c(a,b){return b.Yf(a)} +function M3c(a,b){a.b=b;return a} +function L3c(a,b){a.a=b;return a} +function N3c(a,b){a.c=b;return a} +function O3c(a,b){a.d=b;return a} +function P3c(a,b){a.e=b;return a} +function Q3c(a,b){a.f=b;return a} +function b4c(a,b){a.a=b;return a} +function c4c(a,b){a.b=b;return a} +function d4c(a,b){a.c=b;return a} +function z5c(a,b){a.c=b;return a} +function y5c(a,b){a.b=b;return a} +function A5c(a,b){a.d=b;return a} +function B5c(a,b){a.e=b;return a} +function C5c(a,b){a.f=b;return a} +function D5c(a,b){a.g=b;return a} +function E5c(a,b){a.a=b;return a} +function F5c(a,b){a.i=b;return a} +function G5c(a,b){a.j=b;return a} +function Vdd(a,b){a.k=b;return a} +function Wdd(a,b){a.j=b;return a} +function ykc(a,b){gkc();F0b(b,a)} +function T$c(a,b,c){R$c(a.a,b,c)} +function RGc(a){cEc.call(this,a)} +function iHc(a){cEc.call(this,a)} +function t7c(a){Qsb.call(this,a)} +function aPb(a){_Ob.call(this,a)} +function Ixd(a){zud.call(this,a)} +function dCd(a){ZBd.call(this,a)} +function fCd(a){ZBd.call(this,a)} +function p_b(){q_b.call(this,'')} +function d7c(){this.a=0;this.b=0} +function aPc(){this.b=0;this.a=0} +function NJd(a,b){a.b=0;DId(a,b)} +function X1d(a,b){a.c=b;a.b=true} +function Oc(a,b){return a.c._b(b)} +function gdb(a){return a.e&&a.e()} +function Vd(a){return !a?null:a.d} +function sn(a,b){return Gv(a.b,b)} +function Fv(a){return !a?null:a.g} +function Kv(a){return !a?null:a.i} +function hdb(a){fdb(a);return a.o} +function Fhd(){Fhd=ccb;Ehd=ond()} +function Hhd(){Hhd=ccb;Ghd=Cod()} +function LFd(){LFd=ccb;KFd=qZd()} +function p8d(){p8d=ccb;o8d=Y9d()} +function r8d(){r8d=ccb;q8d=dae()} +function mvd(){mvd=ccb;lvd=n4c()} +function Srb(){throw vbb(new bgb)} +function enb(){throw vbb(new bgb)} +function fnb(){throw vbb(new bgb)} +function gnb(){throw vbb(new bgb)} +function jnb(){throw vbb(new bgb)} +function Cnb(){throw vbb(new bgb)} +function Uqb(a){this.a=new Mqb(a)} +function tgb(a){lgb();ngb(this,a)} +function Hxb(a){this.a=new Qwb(a)} +function _ub(a,b){while(a.ye(b));} +function Sub(a,b){while(a.sd(b));} +function Bfb(a,b){a.a+=b;return a} +function Cfb(a,b){a.a+=b;return a} +function Ffb(a,b){a.a+=b;return a} +function Lfb(a,b){a.a+=b;return a} +function WAb(a){Tzb(a);return a.a} +function Wsb(a){return a.b!=a.d.c} +function pD(a){return a.l|a.m<<22} +function aIc(a,b){return a.d[b.p]} +function h2c(a,b){return c2c(a,b)} +function cCb(a,b,c){a.splice(b,c)} +function WHb(a){a.c?VHb(a):XHb(a)} +function jVc(a){this.a=0;this.b=a} +function ZUc(){this.a=new L2c(K$)} +function tRc(){this.b=new L2c(h$)} +function Q$c(){this.b=new L2c(J_)} +function d_c(){this.b=new L2c(J_)} +function OCd(){throw vbb(new bgb)} +function PCd(){throw vbb(new bgb)} +function QCd(){throw vbb(new bgb)} +function RCd(){throw vbb(new bgb)} +function SCd(){throw vbb(new bgb)} +function TCd(){throw vbb(new bgb)} +function UCd(){throw vbb(new bgb)} +function VCd(){throw vbb(new bgb)} +function WCd(){throw vbb(new bgb)} +function XCd(){throw vbb(new bgb)} +function ahe(){throw vbb(new utb)} +function bhe(){throw vbb(new utb)} +function Rge(a){this.a=new ege(a)} +function ege(a){dge(this,a,Vee())} +function Fhe(a){return !a||Ehe(a)} +function dde(a){return $ce[a]!=-1} +function Iz(){xz!=0&&(xz=0);zz=-1} +function Ybb(){Wbb==null&&(Wbb=[])} +function ONd(a,b){Rxd(ZKd(a.a),b)} +function TNd(a,b){Rxd(ZKd(a.a),b)} +function Yf(a,b){zf.call(this,a,b)} +function $f(a,b){Yf.call(this,a,b)} +function Hf(a,b){this.b=a;this.c=b} +function rk(a,b){this.b=a;this.a=b} +function ek(a,b){this.a=a;this.b=b} +function gk(a,b){this.a=a;this.b=b} +function pk(a,b){this.a=a;this.b=b} +function yk(a,b){this.a=a;this.b=b} +function Ak(a,b){this.a=a;this.b=b} +function Fj(a,b){this.a=a;this.b=b} +function _j(a,b){this.a=a;this.b=b} +function dr(a,b){this.a=a;this.b=b} +function zr(a,b){this.b=a;this.a=b} +function So(a,b){this.b=a;this.a=b} +function qp(a,b){this.b=a;this.a=b} +function $q(a,b){this.b=a;this.a=b} +function $r(a,b){this.f=a;this.g=b} +function ne(a,b){this.e=a;this.d=b} +function Wo(a,b){this.g=a;this.i=b} +function bu(a,b){this.a=a;this.b=b} +function qu(a,b){this.a=a;this.f=b} +function qv(a,b){this.b=a;this.c=b} +function ox(a,b){this.a=a;this.b=b} +function Px(a,b){this.a=a;this.b=b} +function mC(a,b){this.a=a;this.b=b} +function Wc(a){Lb(a.dc());this.c=a} +function rf(a){this.b=BD(Qb(a),83)} +function Zv(a){this.a=BD(Qb(a),83)} +function dv(a){this.a=BD(Qb(a),15)} +function $u(a){this.a=BD(Qb(a),15)} +function Br(a){this.b=BD(Qb(a),47)} +function eB(){this.q=new $wnd.Date} +function Zfb(){Zfb=ccb;Yfb=new jcb} +function Emb(){Emb=ccb;Dmb=new Fmb} +function Vhb(a){return a.f.c+a.g.c} +function hnb(a,b){return a.b.Hc(b)} +function inb(a,b){return a.b.Ic(b)} +function knb(a,b){return a.b.Qc(b)} +function Dob(a,b){return a.b.Hc(b)} +function dob(a,b){return a.c.uc(b)} +function Rqb(a,b){return a.a._b(b)} +function fob(a,b){return pb(a.c,b)} +function jt(a,b){return Mhb(a.b,b)} +function Lp(a,b){return a>b&&b0} +function Gbb(a,b){return ybb(a,b)<0} +function Crb(a,b){return a.a.get(b)} +function icb(b,a){return a.split(b)} +function Vrb(a,b){return Mhb(a.e,b)} +function Nvb(a){return uCb(a),false} +function Rub(a){Kub.call(this,a,21)} +function wcb(a,b){Zy.call(this,a,b)} +function mxb(a,b){$r.call(this,a,b)} +function Gyb(a,b){$r.call(this,a,b)} +function zx(a){yx();Wn.call(this,a)} +function zlb(a,b){Dlb(a,a.length,b)} +function Alb(a,b){Flb(a,a.length,b)} +function ABb(a,b,c){b.ud(a.a.Ge(c))} +function uBb(a,b,c){b.we(a.a.Fe(c))} +function GBb(a,b,c){b.td(a.a.Kb(c))} +function Zq(a,b,c){a.Mb(c)&&b.td(c)} +function aCb(a,b,c){a.splice(b,0,c)} +function lDb(a,b){return uqb(a.e,b)} +function pjb(a,b){this.d=a;this.e=b} +function kqb(a,b){this.b=a;this.a=b} +function VBb(a,b){this.b=a;this.a=b} +function BEb(a,b){this.b=a;this.a=b} +function sBb(a,b){this.a=a;this.b=b} +function yBb(a,b){this.a=a;this.b=b} +function EBb(a,b){this.a=a;this.b=b} +function KBb(a,b){this.a=a;this.b=b} +function aDb(a,b){this.a=a;this.b=b} +function tMb(a,b){this.b=a;this.a=b} +function oOb(a,b){this.b=a;this.a=b} +function SOb(a,b){$r.call(this,a,b)} +function SMb(a,b){$r.call(this,a,b)} +function NEb(a,b){$r.call(this,a,b)} +function VEb(a,b){$r.call(this,a,b)} +function sFb(a,b){$r.call(this,a,b)} +function hHb(a,b){$r.call(this,a,b)} +function OHb(a,b){$r.call(this,a,b)} +function FIb(a,b){$r.call(this,a,b)} +function wLb(a,b){$r.call(this,a,b)} +function YRb(a,b){$r.call(this,a,b)} +function zTb(a,b){$r.call(this,a,b)} +function rUb(a,b){$r.call(this,a,b)} +function oWb(a,b){$r.call(this,a,b)} +function SXb(a,b){$r.call(this,a,b)} +function k0b(a,b){$r.call(this,a,b)} +function z5b(a,b){$r.call(this,a,b)} +function T8b(a,b){$r.call(this,a,b)} +function ibc(a,b){$r.call(this,a,b)} +function Cec(a,b){this.a=a;this.b=b} +function rfc(a,b){this.a=a;this.b=b} +function Rfc(a,b){this.a=a;this.b=b} +function Tfc(a,b){this.a=a;this.b=b} +function bgc(a,b){this.a=a;this.b=b} +function ngc(a,b){this.a=a;this.b=b} +function Qhc(a,b){this.a=a;this.b=b} +function $hc(a,b){this.a=a;this.b=b} +function Z0b(a,b){this.a=a;this.b=b} +function ZVb(a,b){this.b=a;this.a=b} +function Dfc(a,b){this.b=a;this.a=b} +function dgc(a,b){this.b=a;this.a=b} +function Bmc(a,b){this.b=a;this.a=b} +function cWb(a,b){this.c=a;this.d=b} +function I$b(a,b){this.e=a;this.d=b} +function Unc(a,b){this.a=a;this.b=b} +function Oic(a,b){this.b=b;this.c=a} +function Bjc(a,b){$r.call(this,a,b)} +function Yjc(a,b){$r.call(this,a,b)} +function Gkc(a,b){$r.call(this,a,b)} +function Bpc(a,b){$r.call(this,a,b)} +function Jpc(a,b){$r.call(this,a,b)} +function Tpc(a,b){$r.call(this,a,b)} +function cqc(a,b){$r.call(this,a,b)} +function oqc(a,b){$r.call(this,a,b)} +function yqc(a,b){$r.call(this,a,b)} +function Hqc(a,b){$r.call(this,a,b)} +function Uqc(a,b){$r.call(this,a,b)} +function arc(a,b){$r.call(this,a,b)} +function mrc(a,b){$r.call(this,a,b)} +function zrc(a,b){$r.call(this,a,b)} +function Prc(a,b){$r.call(this,a,b)} +function Yrc(a,b){$r.call(this,a,b)} +function fsc(a,b){$r.call(this,a,b)} +function nsc(a,b){$r.call(this,a,b)} +function nzc(a,b){$r.call(this,a,b)} +function zzc(a,b){$r.call(this,a,b)} +function Kzc(a,b){$r.call(this,a,b)} +function Xzc(a,b){$r.call(this,a,b)} +function Dtc(a,b){$r.call(this,a,b)} +function lAc(a,b){$r.call(this,a,b)} +function uAc(a,b){$r.call(this,a,b)} +function CAc(a,b){$r.call(this,a,b)} +function LAc(a,b){$r.call(this,a,b)} +function UAc(a,b){$r.call(this,a,b)} +function aBc(a,b){$r.call(this,a,b)} +function uBc(a,b){$r.call(this,a,b)} +function DBc(a,b){$r.call(this,a,b)} +function MBc(a,b){$r.call(this,a,b)} +function sGc(a,b){$r.call(this,a,b)} +function VIc(a,b){$r.call(this,a,b)} +function EIc(a,b){this.b=a;this.a=b} +function qKc(a,b){this.a=a;this.b=b} +function GKc(a,b){this.a=a;this.b=b} +function lLc(a,b){this.a=a;this.b=b} +function mMc(a,b){this.a=a;this.b=b} +function fMc(a,b){$r.call(this,a,b)} +function ZLc(a,b){$r.call(this,a,b)} +function ZMc(a,b){this.b=a;this.d=b} +function IOc(a,b){$r.call(this,a,b)} +function GQc(a,b){$r.call(this,a,b)} +function PQc(a,b){this.a=a;this.b=b} +function RQc(a,b){this.a=a;this.b=b} +function ARc(a,b){$r.call(this,a,b)} +function rSc(a,b){$r.call(this,a,b)} +function TTc(a,b){$r.call(this,a,b)} +function _Tc(a,b){$r.call(this,a,b)} +function RUc(a,b){$r.call(this,a,b)} +function uVc(a,b){$r.call(this,a,b)} +function hWc(a,b){$r.call(this,a,b)} +function rWc(a,b){$r.call(this,a,b)} +function kXc(a,b){$r.call(this,a,b)} +function uXc(a,b){$r.call(this,a,b)} +function AYc(a,b){$r.call(this,a,b)} +function l$c(a,b){$r.call(this,a,b)} +function Z$c(a,b){$r.call(this,a,b)} +function D_c(a,b){$r.call(this,a,b)} +function O_c(a,b){$r.call(this,a,b)} +function c1c(a,b){$r.call(this,a,b)} +function cVb(a,b){return uqb(a.c,b)} +function nnc(a,b){return uqb(b.b,a)} +function x1c(a,b){return -a.b.Je(b)} +function D3c(a,b){return uqb(a.g,b)} +function O5c(a,b){$r.call(this,a,b)} +function a6c(a,b){$r.call(this,a,b)} +function m2c(a,b){this.a=a;this.b=b} +function W2c(a,b){this.a=a;this.b=b} +function f7c(a,b){this.a=a;this.b=b} +function G7c(a,b){$r.call(this,a,b)} +function j8c(a,b){$r.call(this,a,b)} +function iad(a,b){$r.call(this,a,b)} +function rad(a,b){$r.call(this,a,b)} +function Bad(a,b){$r.call(this,a,b)} +function Nad(a,b){$r.call(this,a,b)} +function ibd(a,b){$r.call(this,a,b)} +function tbd(a,b){$r.call(this,a,b)} +function Ibd(a,b){$r.call(this,a,b)} +function Ubd(a,b){$r.call(this,a,b)} +function gcd(a,b){$r.call(this,a,b)} +function scd(a,b){$r.call(this,a,b)} +function Ycd(a,b){$r.call(this,a,b)} +function udd(a,b){$r.call(this,a,b)} +function Jdd(a,b){$r.call(this,a,b)} +function Eed(a,b){$r.call(this,a,b)} +function bfd(a,b){this.a=a;this.b=b} +function dfd(a,b){this.a=a;this.b=b} +function ffd(a,b){this.a=a;this.b=b} +function Kfd(a,b){this.a=a;this.b=b} +function Mfd(a,b){this.a=a;this.b=b} +function Ofd(a,b){this.a=a;this.b=b} +function vgd(a,b){this.a=a;this.b=b} +function qgd(a,b){$r.call(this,a,b)} +function jrd(a,b){this.a=a;this.b=b} +function krd(a,b){this.a=a;this.b=b} +function mrd(a,b){this.a=a;this.b=b} +function nrd(a,b){this.a=a;this.b=b} +function qrd(a,b){this.a=a;this.b=b} +function rrd(a,b){this.a=a;this.b=b} +function srd(a,b){this.b=a;this.a=b} +function trd(a,b){this.b=a;this.a=b} +function Drd(a,b){this.b=a;this.a=b} +function Frd(a,b){this.b=a;this.a=b} +function Hrd(a,b){this.a=a;this.b=b} +function Jrd(a,b){this.a=a;this.b=b} +function Ord(a,b){Xqd(a.a,BD(b,56))} +function BIc(a,b){gIc(a.a,BD(b,11))} +function fIc(a,b){FHc();return b!=a} +function Arb(){wrb();return new vrb} +function CMc(){wMc();this.b=new Tqb} +function NNc(){FNc();this.a=new Tqb} +function eCc(){ZBc();aCc.call(this)} +function Dsd(a,b){$r.call(this,a,b)} +function Urd(a,b){this.a=a;this.b=b} +function Wrd(a,b){this.a=a;this.b=b} +function kGd(a,b){this.a=a;this.b=b} +function nGd(a,b){this.a=a;this.b=b} +function bUd(a,b){this.a=a;this.b=b} +function zVd(a,b){this.a=a;this.b=b} +function C1d(a,b){this.d=a;this.b=b} +function MLd(a,b){this.d=a;this.e=b} +function Wud(a,b){this.f=a;this.c=b} +function f7d(a,b){this.b=a;this.c=b} +function _zd(a,b){this.i=a;this.g=b} +function Y1d(a,b){this.e=a;this.a=b} +function c8d(a,b){this.a=a;this.b=b} +function $Id(a,b){a.i=null;_Id(a,b)} +function ivd(a,b){!!a&&Rhb(cvd,a,b)} +function hCd(a,b){return qAd(a.a,b)} +function e7d(a){return R2d(a.c,a.b)} +function Wd(a){return !a?null:a.dd()} +function PD(a){return a==null?null:a} +function KD(a){return typeof a===Khe} +function LD(a){return typeof a===Lhe} +function ND(a){return typeof a===Mhe} +function Em(a,b){return a.Hd().Xb(b)} +function Kq(a,b){return hr(a.Kc(),b)} +function Bbb(a,b){return ybb(a,b)==0} +function Ebb(a,b){return ybb(a,b)>=0} +function Kbb(a,b){return ybb(a,b)!=0} +function Jdb(a){return ''+(uCb(a),a)} +function pfb(a,b){return a.substr(b)} +function cg(a){ag(a);return a.d.gc()} +function oVb(a){pVb(a,a.c);return a} +function RD(a){CCb(a==null);return a} +function Dfb(a,b){a.a+=''+b;return a} +function Efb(a,b){a.a+=''+b;return a} +function Nfb(a,b){a.a+=''+b;return a} +function Pfb(a,b){a.a+=''+b;return a} +function Qfb(a,b){a.a+=''+b;return a} +function Mfb(a,b){return a.a+=''+b,a} +function Esb(a,b){Gsb(a,b,a.a,a.a.a)} +function Fsb(a,b){Gsb(a,b,a.c.b,a.c)} +function Mqd(a,b,c){Rpd(b,kqd(a,c))} +function Nqd(a,b,c){Rpd(b,kqd(a,c))} +function Dhe(a,b){Hhe(new Fyd(a),b)} +function cB(a,b){a.q.setTime(Sbb(b))} +function fvb(a,b){bvb.call(this,a,b)} +function jvb(a,b){bvb.call(this,a,b)} +function nvb(a,b){bvb.call(this,a,b)} +function Nqb(a){Uhb(this);Ld(this,a)} +function wmb(a){tCb(a,0);return null} +function X6c(a){a.a=0;a.b=0;return a} +function f3c(a,b){a.a=b.g+1;return a} +function PJc(a,b){return a.j[b.p]==2} +function _Pb(a){return VPb(BD(a,79))} +function yJb(){yJb=ccb;xJb=as(wJb())} +function Y8b(){Y8b=ccb;X8b=as(W8b())} +function mt(){this.b=new Mqb(Cv(12))} +function Otb(){this.b=0;this.a=false} +function Wtb(){this.b=0;this.a=false} +function sl(a){this.a=a;ol.call(this)} +function vl(a){this.a=a;ol.call(this)} +function Nsd(a,b){Msd.call(this,a,b)} +function $zd(a,b){Cyd.call(this,a,b)} +function nNd(a,b){_zd.call(this,a,b)} +function s4d(a,b){p4d.call(this,a,b)} +function w4d(a,b){qRd.call(this,a,b)} +function rEd(a,b){pEd();Rhb(oEd,a,b)} +function lcb(a,b){return qfb(a.a,0,b)} +function ww(a,b){return a.a.a.a.cc(b)} +function mb(a,b){return PD(a)===PD(b)} +function Mdb(a,b){return Kdb(a.a,b.a)} +function $db(a,b){return beb(a.a,b.a)} +function seb(a,b){return ueb(a.a,b.a)} +function hfb(a,b){return a.indexOf(b)} +function Ny(a,b){return a==b?0:a?1:-1} +function kB(a){return a<10?'0'+a:''+a} +function Mq(a){return Qb(a),new sl(a)} +function SC(a){return TC(a.l,a.m,a.h)} +function Hdb(a){return QD((uCb(a),a))} +function Idb(a){return QD((uCb(a),a))} +function NIb(a,b){return beb(a.g,b.g)} +function Fbb(a){return typeof a===Lhe} +function mWb(a){return a==hWb||a==kWb} +function nWb(a){return a==hWb||a==iWb} +function G1b(a){return Jkb(a.b.b,a,0)} +function lrb(a){this.a=Arb();this.b=a} +function Frb(a){this.a=Arb();this.b=a} +function swb(a,b){Ekb(a.a,b);return b} +function Z1c(a,b){Ekb(a.c,b);return a} +function E2c(a,b){d3c(a.a,b);return a} +function _gc(a,b){Hgc();return b.a+=a} +function bhc(a,b){Hgc();return b.a+=a} +function ahc(a,b){Hgc();return b.c+=a} +function Nlb(a,b){Klb(a,0,a.length,b)} +function zsb(){Wqb.call(this,new $rb)} +function I_b(){B_b.call(this,0,0,0,0)} +function I6c(){J6c.call(this,0,0,0,0)} +function g7c(a){this.a=a.a;this.b=a.b} +function fad(a){return a==aad||a==bad} +function gad(a){return a==dad||a==_9c} +function Jzc(a){return a==Fzc||a==Ezc} +function fcd(a){return a!=bcd&&a!=ccd} +function oid(a){return a.Lg()&&a.Mg()} +function Gfd(a){return Kkd(BD(a,118))} +function k3c(a){return d3c(new j3c,a)} +function y2d(a,b){return new p4d(b,a)} +function z2d(a,b){return new p4d(b,a)} +function ukd(a,b,c){vkd(a,b);wkd(a,c)} +function _kd(a,b,c){cld(a,b);ald(a,c)} +function bld(a,b,c){dld(a,b);eld(a,c)} +function gmd(a,b,c){hmd(a,b);imd(a,c)} +function nmd(a,b,c){omd(a,b);pmd(a,c)} +function iKd(a,b){$Jd(a,b);_Jd(a,a.D)} +function _ud(a){Wud.call(this,a,true)} +function Xg(a,b,c){Vg.call(this,a,b,c)} +function Ygb(a){Hgb();Zgb.call(this,a)} +function rxb(){mxb.call(this,'Head',1)} +function wxb(){mxb.call(this,'Tail',3)} +function Ckb(a){a.c=KC(SI,Uhe,1,0,5,1)} +function Vjb(a){a.a=KC(SI,Uhe,1,8,5,1)} +function MGb(a){Hkb(a.xf(),new QGb(a))} +function xtb(a){return a!=null?tb(a):0} +function b2b(a,b){return ntd(b,mpd(a))} +function c2b(a,b){return ntd(b,mpd(a))} +function dAb(a,b){return a[a.length]=b} +function gAb(a,b){return a[a.length]=b} +function Vq(a){return lr(a.b.Kc(),a.a)} +function dqd(a,b){return _o(qo(a.d),b)} +function eqd(a,b){return _o(qo(a.g),b)} +function fqd(a,b){return _o(qo(a.j),b)} +function Osd(a,b){Msd.call(this,a.b,b)} +function q0b(a){B_b.call(this,a,a,a,a)} +function HOb(a){a.b&&LOb(a);return a.a} +function IOb(a){a.b&&LOb(a);return a.c} +function uyb(a,b){if(lyb){return}a.b=b} +function lzd(a,b,c){NC(a,b,c);return c} +function mBc(a,b,c){NC(a.c[b.g],b.g,c)} +function _Hd(a,b,c){BD(a.c,69).Xh(b,c)} +function wfd(a,b,c){bld(c,c.i+a,c.j+b)} +function UOd(a,b){wtd(VKd(a.a),XOd(b))} +function bTd(a,b){wtd(QSd(a.a),eTd(b))} +function Lge(a){wfe();xfe.call(this,a)} +function CAd(a){return a==null?0:tb(a)} +function fNc(){fNc=ccb;eNc=new Rpb(v1)} +function h0d(){h0d=ccb;new i0d;new Rkb} +function i0d(){new Lqb;new Lqb;new Lqb} +function GA(){GA=ccb;fA();FA=new Lqb} +function Iy(){Iy=ccb;$wnd.Math.log(2)} +function UVd(){UVd=ccb;TVd=(AFd(),zFd)} +function _ge(){throw vbb(new cgb(Cxe))} +function ohe(){throw vbb(new cgb(Cxe))} +function che(){throw vbb(new cgb(Dxe))} +function rhe(){throw vbb(new cgb(Dxe))} +function Mg(a){this.a=a;Gg.call(this,a)} +function up(a){this.a=a;rf.call(this,a)} +function Bp(a){this.a=a;rf.call(this,a)} +function Okb(a,b){Mlb(a.c,a.c.length,b)} +function llb(a){return a.ab?1:0} +function Deb(a,b){return ybb(a,b)>0?a:b} +function TC(a,b,c){return {l:a,m:b,h:c}} +function Ctb(a,b){a.a!=null&&BIc(b,a.a)} +function Csb(a){a.a=new jtb;a.c=new jtb} +function hDb(a){this.b=a;this.a=new Rkb} +function dOb(a){this.b=new pOb;this.a=a} +function q_b(a){n_b.call(this);this.a=a} +function txb(){mxb.call(this,'Range',2)} +function bUb(){ZTb();this.a=new L2c(zP)} +function Bh(a,b){Qb(b);Ah(a).Jc(new Vw)} +function fKc(a,b){FJc();return b.n.b+=a} +function Tgc(a,b,c){return Rhb(a.g,c,b)} +function LJc(a,b,c){return Rhb(a.k,c,b)} +function r1c(a,b){return Rhb(a.a,b.a,b)} +function jBc(a,b,c){return hBc(b,c,a.c)} +function E6c(a){return new f7c(a.c,a.d)} +function F6c(a){return new f7c(a.c,a.d)} +function R6c(a){return new f7c(a.a,a.b)} +function CQd(a,b){return hA(a.a,b,null)} +function fec(a){QZb(a,null);RZb(a,null)} +function AOc(a){BOc(a,null);COc(a,null)} +function u4d(){qRd.call(this,null,null)} +function y4d(){RRd.call(this,null,null)} +function a7d(a){this.a=a;Lqb.call(this)} +function Pp(a){this.b=(mmb(),new iob(a))} +function Py(a){a.j=KC(VI,nie,310,0,0,1)} +function oAd(a,b,c){a.c.Vc(b,BD(c,133))} +function GAd(a,b,c){a.c.ji(b,BD(c,133))} +function JLd(a,b){Uxd(a);a.Gc(BD(b,15))} +function b7d(a,b){return t2d(a.c,a.b,b)} +function Bv(a,b){return new Qv(a.Kc(),b)} +function Lq(a,b){return rr(a.Kc(),b)!=-1} +function Sqb(a,b){return a.a.Bc(b)!=null} +function pr(a){return a.Ob()?a.Pb():null} +function yfb(a){return zfb(a,0,a.length)} +function JD(a,b){return a!=null&&AD(a,b)} +function $A(a,b){a.q.setHours(b);YA(a,b)} +function Yrb(a,b){if(a.c){jsb(b);isb(b)}} +function nk(a,b,c){BD(a.Kb(c),164).Nb(b)} +function RJc(a,b,c){SJc(a,b,c);return c} +function Eub(a,b,c){a.a=b^1502;a.b=c^kke} +function xHb(a,b,c){return a.a[b.g][c.g]} +function REc(a,b){return a.a[b.c.p][b.p]} +function aEc(a,b){return a.e[b.c.p][b.p]} +function tEc(a,b){return a.c[b.c.p][b.p]} +function OJc(a,b){return a.j[b.p]=aKc(b)} +function k5c(a,b){return cfb(a.f,b.tg())} +function Isd(a,b){return cfb(a.b,b.tg())} +function Sfd(a,b){return a.a0?b*b/a:b*b*100} +function CRb(a,b){return a>0?b/(a*a):b*100} +function G2c(a,b,c){return Ekb(b,I2c(a,c))} +function t3c(a,b,c){p3c();a.Xe(b)&&c.td(a)} +function St(a,b,c){var d;d=a.Zc(b);d.Rb(c)} +function O6c(a,b,c){a.a+=b;a.b+=c;return a} +function Z6c(a,b,c){a.a*=b;a.b*=c;return a} +function b7c(a,b,c){a.a-=b;a.b-=c;return a} +function a7c(a,b){a.a=b.a;a.b=b.b;return a} +function V6c(a){a.a=-a.a;a.b=-a.b;return a} +function Dic(a){this.c=a;this.a=1;this.b=1} +function xed(a){this.c=a;dld(a,0);eld(a,0)} +function u7c(a){Psb.call(this);n7c(this,a)} +function AXb(a){xXb();yXb(this);this.mf(a)} +function GRd(a,b){nRd();qRd.call(this,a,b)} +function dSd(a,b){LRd();RRd.call(this,a,b)} +function hSd(a,b){LRd();RRd.call(this,a,b)} +function fSd(a,b){LRd();dSd.call(this,a,b)} +function sId(a,b,c){dId.call(this,a,b,c,2)} +function zXd(a,b){UVd();nXd.call(this,a,b)} +function BXd(a,b){UVd();zXd.call(this,a,b)} +function DXd(a,b){UVd();zXd.call(this,a,b)} +function FXd(a,b){UVd();DXd.call(this,a,b)} +function PXd(a,b){UVd();nXd.call(this,a,b)} +function RXd(a,b){UVd();PXd.call(this,a,b)} +function XXd(a,b){UVd();nXd.call(this,a,b)} +function pAd(a,b){return a.c.Fc(BD(b,133))} +function w1d(a,b,c){return V1d(p1d(a,b),c)} +function N2d(a,b,c){return b.Qk(a.e,a.c,c)} +function P2d(a,b,c){return b.Rk(a.e,a.c,c)} +function a3d(a,b){return xid(a.e,BD(b,49))} +function aTd(a,b,c){vtd(QSd(a.a),b,eTd(c))} +function TOd(a,b,c){vtd(VKd(a.a),b,XOd(c))} +function ypb(a,b){b.$modCount=a.$modCount} +function MUc(){MUc=ccb;LUc=new Lsd('root')} +function LCd(){LCd=ccb;KCd=new lDd;new NDd} +function KVc(){this.a=new Hp;this.b=new Hp} +function FUd(){hJd.call(this);this.Bb|=Tje} +function t_c(){$r.call(this,'GROW_TREE',0)} +function C9d(a){return a==null?null:cde(a)} +function G9d(a){return a==null?null:jde(a)} +function J9d(a){return a==null?null:fcb(a)} +function K9d(a){return a==null?null:fcb(a)} +function fdb(a){if(a.o!=null){return}vdb(a)} +function DD(a){CCb(a==null||KD(a));return a} +function ED(a){CCb(a==null||LD(a));return a} +function GD(a){CCb(a==null||ND(a));return a} +function gB(a){this.q=new $wnd.Date(Sbb(a))} +function Mf(a,b){this.c=a;ne.call(this,a,b)} +function Sf(a,b){this.a=a;Mf.call(this,a,b)} +function Hg(a,b){this.d=a;Dg(this);this.b=b} +function bAb(a,b){Vzb.call(this,a);this.a=b} +function vAb(a,b){Vzb.call(this,a);this.a=b} +function sNb(a){pNb.call(this,0,0);this.f=a} +function Vg(a,b,c){dg.call(this,a,b,c,null)} +function Yg(a,b,c){dg.call(this,a,b,c,null)} +function Pxb(a,b,c){return a.ue(b,c)<=0?c:b} +function Qxb(a,b,c){return a.ue(b,c)<=0?b:c} +function g4c(a,b){return BD(Wrb(a.b,b),149)} +function i4c(a,b){return BD(Wrb(a.c,b),229)} +function wic(a){return BD(Ikb(a.a,a.b),287)} +function B6c(a){return new f7c(a.c,a.d+a.a)} +function eLc(a){return FJc(),Jzc(BD(a,197))} +function $Jb(){$Jb=ccb;ZJb=pqb((tdd(),sdd))} +function fOb(a,b){b.a?gOb(a,b):Fxb(a.a,b.b)} +function qyb(a,b){if(lyb){return}Ekb(a.a,b)} +function F2b(a,b){x2b();return f_b(b.d.i,a)} +function _9b(a,b){I9b();return new gac(b,a)} +function _Hb(a,b){ytb(b,lle);a.f=b;return a} +function Kld(a,b,c){c=_hd(a,b,3,c);return c} +function bmd(a,b,c){c=_hd(a,b,6,c);return c} +function kpd(a,b,c){c=_hd(a,b,9,c);return c} +function Cvd(a,b,c){++a.j;a.Ki();Atd(a,b,c)} +function Avd(a,b,c){++a.j;a.Hi(b,a.oi(b,c))} +function bRd(a,b,c){var d;d=a.Zc(b);d.Rb(c)} +function c7d(a,b,c){return C2d(a.c,a.b,b,c)} +function DAd(a,b){return (b&Ohe)%a.d.length} +function Msd(a,b){Lsd.call(this,a);this.a=b} +function uVd(a,b){lVd.call(this,a);this.a=b} +function sYd(a,b){lVd.call(this,a);this.a=b} +function zyd(a,b){this.c=a;zud.call(this,b)} +function YOd(a,b){this.a=a;qOd.call(this,b)} +function fTd(a,b){this.a=a;qOd.call(this,b)} +function Xp(a){this.a=(Xj(a,Jie),new Skb(a))} +function cq(a){this.a=(Xj(a,Jie),new Skb(a))} +function LA(a){!a.a&&(a.a=new VA);return a.a} +function XMb(a){if(a>8){return 0}return a+1} +function Ecb(a,b){Bcb();return a==b?0:a?1:-1} +function Opb(a,b,c){return Npb(a,BD(b,22),c)} +function Bz(a,b,c){return a.apply(b,c);var d} +function Sfb(a,b,c){a.a+=zfb(b,0,c);return a} +function ijb(a,b){var c;c=a.e;a.e=b;return c} +function trb(a,b){var c;c=a[hke];c.call(a,b)} +function urb(a,b){var c;c=a[hke];c.call(a,b)} +function Aib(a,b){a.a.Vc(a.b,b);++a.b;a.c=-1} +function Urb(a){Uhb(a.e);a.d.b=a.d;a.d.a=a.d} +function _f(a){a.b?_f(a.b):a.f.c.zc(a.e,a.d)} +function _Ab(a,b,c){EAb();MBb(a,b.Ce(a.a,c))} +function Bxb(a,b){return Vd(Cwb(a.a,b,true))} +function Cxb(a,b){return Vd(Dwb(a.a,b,true))} +function _Bb(a,b){return eCb(new Array(b),a)} +function HD(a){return String.fromCharCode(a)} +function mz(a){return a==null?null:a.message} +function gRb(){this.a=new Rkb;this.b=new Rkb} +function iTb(){this.a=new MQb;this.b=new tTb} +function tDb(){this.b=new d7c;this.c=new Rkb} +function _Qb(){this.d=new d7c;this.e=new d7c} +function n_b(){this.n=new d7c;this.o=new d7c} +function $Gb(){this.n=new p0b;this.i=new I6c} +function sec(){this.a=new Umc;this.b=new mnc} +function NIc(){this.a=new Rkb;this.d=new Rkb} +function LDc(){this.b=new Tqb;this.a=new Tqb} +function hSc(){this.b=new Lqb;this.a=new Lqb} +function HRc(){this.b=new tRc;this.a=new hRc} +function aHb(){$Gb.call(this);this.a=new d7c} +function Ywb(a){Zwb.call(this,a,(lxb(),hxb))} +function J_b(a,b,c,d){B_b.call(this,a,b,c,d)} +function sqd(a,b,c){c!=null&&kmd(b,Wqd(a,c))} +function tqd(a,b,c){c!=null&&lmd(b,Wqd(a,c))} +function Tod(a,b,c){c=_hd(a,b,11,c);return c} +function P6c(a,b){a.a+=b.a;a.b+=b.b;return a} +function c7c(a,b){a.a-=b.a;a.b-=b.b;return a} +function u7b(a,b){return a.n.a=(uCb(b),b)+10} +function v7b(a,b){return a.n.a=(uCb(b),b)+10} +function dLd(a,b){return b==a||pud(UKd(b),a)} +function PYd(a,b){return Rhb(a.a,b,'')==null} +function E2b(a,b){x2b();return !f_b(b.d.i,a)} +function rjc(a,b){fad(a.f)?sjc(a,b):tjc(a,b)} +function h1d(a,b){var c;c=b.Hh(a.a);return c} +function Cyd(a,b){qcb.call(this,gve+a+mue+b)} +function gUd(a,b,c,d){cUd.call(this,a,b,c,d)} +function Q4d(a,b,c,d){cUd.call(this,a,b,c,d)} +function U4d(a,b,c,d){Q4d.call(this,a,b,c,d)} +function n5d(a,b,c,d){i5d.call(this,a,b,c,d)} +function p5d(a,b,c,d){i5d.call(this,a,b,c,d)} +function v5d(a,b,c,d){i5d.call(this,a,b,c,d)} +function t5d(a,b,c,d){p5d.call(this,a,b,c,d)} +function A5d(a,b,c,d){p5d.call(this,a,b,c,d)} +function y5d(a,b,c,d){v5d.call(this,a,b,c,d)} +function D5d(a,b,c,d){A5d.call(this,a,b,c,d)} +function d6d(a,b,c,d){Y5d.call(this,a,b,c,d)} +function Vp(a,b,c){this.a=a;qc.call(this,b,c)} +function tk(a,b,c){this.c=b;this.b=c;this.a=a} +function ik(a,b,c){return a.d=BD(b.Kb(c),164)} +function j6d(a,b){return a.Aj().Nh().Kh(a,b)} +function h6d(a,b){return a.Aj().Nh().Ih(a,b)} +function Fdb(a,b){return uCb(a),PD(a)===PD(b)} +function dfb(a,b){return uCb(a),PD(a)===PD(b)} +function Dxb(a,b){return Vd(Cwb(a.a,b,false))} +function Exb(a,b){return Vd(Dwb(a.a,b,false))} +function vBb(a,b){return a.b.sd(new yBb(a,b))} +function BBb(a,b){return a.b.sd(new EBb(a,b))} +function HBb(a,b){return a.b.sd(new KBb(a,b))} +function lfb(a,b,c){return a.lastIndexOf(b,c)} +function uTb(a,b,c){return Kdb(a[b.b],a[c.b])} +function RTb(a,b){return yNb(b,(Nyc(),Cwc),a)} +function fmc(a,b){return beb(b.a.d.p,a.a.d.p)} +function emc(a,b){return beb(a.a.d.p,b.a.d.p)} +function _Oc(a,b){return Kdb(a.c-a.s,b.c-b.s)} +function S_b(a){return !a.c?-1:Jkb(a.c.a,a,0)} +function Vxd(a){return a<100?null:new Ixd(a)} +function ecd(a){return a==Zbd||a==_bd||a==$bd} +function zAd(a,b){return JD(b,15)&&Btd(a.c,b)} +function vyb(a,b){if(lyb){return}!!b&&(a.d=b)} +function ujb(a,b){var c;c=b;return !!Awb(a,c)} +function czd(a,b){this.c=a;Pyd.call(this,a,b)} +function fBb(a){this.c=a;nvb.call(this,rie,0)} +function Avb(a,b){Bvb.call(this,a,a.length,b)} +function aId(a,b,c){return BD(a.c,69).lk(b,c)} +function bId(a,b,c){return BD(a.c,69).mk(b,c)} +function O2d(a,b,c){return N2d(a,BD(b,332),c)} +function Q2d(a,b,c){return P2d(a,BD(b,332),c)} +function i3d(a,b,c){return h3d(a,BD(b,332),c)} +function k3d(a,b,c){return j3d(a,BD(b,332),c)} +function tn(a,b){return b==null?null:Hv(a.b,b)} +function Kcb(a){return LD(a)?(uCb(a),a):a.ke()} +function Ldb(a){return !isNaN(a)&&!isFinite(a)} +function Wn(a){Ql();this.a=(mmb(),new zob(a))} +function dIc(a){FHc();this.d=a;this.a=new jkb} +function xqb(a,b,c){this.a=a;this.b=b;this.c=c} +function Nrb(a,b,c){this.a=a;this.b=b;this.c=c} +function $sb(a,b,c){this.d=a;this.b=c;this.a=b} +function Qsb(a){Csb(this);Osb(this);ye(this,a)} +function Tkb(a){Ckb(this);bCb(this.c,0,a.Pc())} +function Xwb(a){uib(a.a);Kwb(a.c,a.b);a.b=null} +function iyb(a){this.a=a;Zfb();Cbb(Date.now())} +function JCb(){JCb=ccb;GCb=new nb;ICb=new nb} +function ntb(){ntb=ccb;ltb=new otb;mtb=new qtb} +function kzd(){kzd=ccb;jzd=KC(SI,Uhe,1,0,5,1)} +function tGd(){tGd=ccb;sGd=KC(SI,Uhe,1,0,5,1)} +function $Gd(){$Gd=ccb;ZGd=KC(SI,Uhe,1,0,5,1)} +function Ql(){Ql=ccb;new Zl((mmb(),mmb(),jmb))} +function pxb(a){lxb();return es((zxb(),yxb),a)} +function Hyb(a){Fyb();return es((Kyb(),Jyb),a)} +function OEb(a){MEb();return es((REb(),QEb),a)} +function WEb(a){UEb();return es((ZEb(),YEb),a)} +function tFb(a){rFb();return es((wFb(),vFb),a)} +function iHb(a){gHb();return es((lHb(),kHb),a)} +function PHb(a){NHb();return es((SHb(),RHb),a)} +function GIb(a){EIb();return es((JIb(),IIb),a)} +function vJb(a){qJb();return es((yJb(),xJb),a)} +function xLb(a){vLb();return es((ALb(),zLb),a)} +function TMb(a){RMb();return es((WMb(),VMb),a)} +function TOb(a){ROb();return es((WOb(),VOb),a)} +function ePb(a){cPb();return es((hPb(),gPb),a)} +function ZRb(a){XRb();return es((aSb(),_Rb),a)} +function ATb(a){yTb();return es((DTb(),CTb),a)} +function sUb(a){qUb();return es((vUb(),uUb),a)} +function rWb(a){lWb();return es((uWb(),tWb),a)} +function TXb(a){RXb();return es((WXb(),VXb),a)} +function Mb(a,b){if(!a){throw vbb(new Wdb(b))}} +function l0b(a){j0b();return es((o0b(),n0b),a)} +function r0b(a){B_b.call(this,a.d,a.c,a.a,a.b)} +function K_b(a){B_b.call(this,a.d,a.c,a.a,a.b)} +function mKb(a,b,c){this.b=a;this.c=b;this.a=c} +function BZb(a,b,c){this.b=a;this.a=b;this.c=c} +function TNb(a,b,c){this.a=a;this.b=b;this.c=c} +function uOb(a,b,c){this.a=a;this.b=b;this.c=c} +function S3b(a,b,c){this.a=a;this.b=b;this.c=c} +function Z6b(a,b,c){this.a=a;this.b=b;this.c=c} +function n9b(a,b,c){this.b=a;this.a=b;this.c=c} +function x$b(a,b,c){this.e=b;this.b=a;this.d=c} +function $Ab(a,b,c){EAb();a.a.Od(b,c);return b} +function LGb(a){var b;b=new KGb;b.e=a;return b} +function iLb(a){var b;b=new fLb;b.b=a;return b} +function D6b(){D6b=ccb;B6b=new M6b;C6b=new P6b} +function Hgc(){Hgc=ccb;Fgc=new ghc;Ggc=new ihc} +function jbc(a){gbc();return es((mbc(),lbc),a)} +function Cjc(a){Ajc();return es((Fjc(),Ejc),a)} +function Clc(a){Alc();return es((Flc(),Elc),a)} +function Cpc(a){Apc();return es((Fpc(),Epc),a)} +function Kpc(a){Ipc();return es((Npc(),Mpc),a)} +function Wpc(a){Rpc();return es((Zpc(),Ypc),a)} +function $jc(a){Xjc();return es((bkc(),akc),a)} +function Hkc(a){Fkc();return es((Kkc(),Jkc),a)} +function dqc(a){bqc();return es((gqc(),fqc),a)} +function rqc(a){mqc();return es((uqc(),tqc),a)} +function zqc(a){xqc();return es((Cqc(),Bqc),a)} +function Iqc(a){Gqc();return es((Lqc(),Kqc),a)} +function Vqc(a){Sqc();return es((Yqc(),Xqc),a)} +function brc(a){_qc();return es((erc(),drc),a)} +function nrc(a){lrc();return es((qrc(),prc),a)} +function Arc(a){yrc();return es((Drc(),Crc),a)} +function Qrc(a){Orc();return es((Trc(),Src),a)} +function Zrc(a){Xrc();return es((asc(),_rc),a)} +function gsc(a){esc();return es((jsc(),isc),a)} +function osc(a){msc();return es((rsc(),qsc),a)} +function Etc(a){Ctc();return es((Htc(),Gtc),a)} +function qzc(a){lzc();return es((tzc(),szc),a)} +function Azc(a){xzc();return es((Dzc(),Czc),a)} +function Mzc(a){Izc();return es((Pzc(),Ozc),a)} +function MAc(a){KAc();return es((PAc(),OAc),a)} +function mAc(a){kAc();return es((pAc(),oAc),a)} +function vAc(a){tAc();return es((yAc(),xAc),a)} +function DAc(a){BAc();return es((GAc(),FAc),a)} +function VAc(a){TAc();return es((YAc(),XAc),a)} +function $zc(a){Vzc();return es((bAc(),aAc),a)} +function bBc(a){_Ac();return es((eBc(),dBc),a)} +function vBc(a){tBc();return es((yBc(),xBc),a)} +function EBc(a){CBc();return es((HBc(),GBc),a)} +function NBc(a){LBc();return es((QBc(),PBc),a)} +function tGc(a){rGc();return es((wGc(),vGc),a)} +function WIc(a){UIc();return es((ZIc(),YIc),a)} +function $Lc(a){YLc();return es((bMc(),aMc),a)} +function gMc(a){eMc();return es((jMc(),iMc),a)} +function JOc(a){HOc();return es((MOc(),LOc),a)} +function HQc(a){FQc();return es((KQc(),JQc),a)} +function DRc(a){yRc();return es((GRc(),FRc),a)} +function tSc(a){qSc();return es((wSc(),vSc),a)} +function UTc(a){STc();return es((XTc(),WTc),a)} +function UUc(a){PUc();return es((XUc(),WUc),a)} +function aUc(a){$Tc();return es((dUc(),cUc),a)} +function wVc(a){tVc();return es((zVc(),yVc),a)} +function iWc(a){fWc();return es((lWc(),kWc),a)} +function sWc(a){pWc();return es((vWc(),uWc),a)} +function lXc(a){iXc();return es((oXc(),nXc),a)} +function vXc(a){sXc();return es((yXc(),xXc),a)} +function BYc(a){zYc();return es((EYc(),DYc),a)} +function m$c(a){k$c();return es((p$c(),o$c),a)} +function $$c(a){Y$c();return es((b_c(),a_c),a)} +function n_c(a){i_c();return es((q_c(),p_c),a)} +function w_c(a){s_c();return es((z_c(),y_c),a)} +function E_c(a){C_c();return es((H_c(),G_c),a)} +function P_c(a){N_c();return es((S_c(),R_c),a)} +function W0c(a){R0c();return es((Z0c(),Y0c),a)} +function f1c(a){a1c();return es((i1c(),h1c),a)} +function P5c(a){N5c();return es((S5c(),R5c),a)} +function b6c(a){_5c();return es((e6c(),d6c),a)} +function H7c(a){F7c();return es((K7c(),J7c),a)} +function k8c(a){i8c();return es((n8c(),m8c),a)} +function V8b(a){S8b();return es((Y8b(),X8b),a)} +function A5b(a){y5b();return es((D5b(),C5b),a)} +function jad(a){ead();return es((mad(),lad),a)} +function sad(a){qad();return es((vad(),uad),a)} +function Cad(a){Aad();return es((Fad(),Ead),a)} +function Oad(a){Mad();return es((Rad(),Qad),a)} +function jbd(a){hbd();return es((mbd(),lbd),a)} +function ubd(a){rbd();return es((xbd(),wbd),a)} +function Kbd(a){Hbd();return es((Nbd(),Mbd),a)} +function Vbd(a){Tbd();return es((Ybd(),Xbd),a)} +function hcd(a){dcd();return es((kcd(),jcd),a)} +function vcd(a){rcd();return es((ycd(),xcd),a)} +function vdd(a){tdd();return es((ydd(),xdd),a)} +function Kdd(a){Idd();return es((Ndd(),Mdd),a)} +function $cd(a){Ucd();return es((cdd(),bdd),a)} +function Fed(a){Ded();return es((Ied(),Hed),a)} +function rgd(a){pgd();return es((ugd(),tgd),a)} +function Esd(a){Csd();return es((Hsd(),Gsd),a)} +function Yoc(a,b){return (uCb(a),a)+(uCb(b),b)} +function NNd(a,b){Zfb();return wtd(ZKd(a.a),b)} +function SNd(a,b){Zfb();return wtd(ZKd(a.a),b)} +function bPc(a,b){this.c=a;this.a=b;this.b=b-a} +function nYc(a,b,c){this.a=a;this.b=b;this.c=c} +function L1c(a,b,c){this.a=a;this.b=b;this.c=c} +function T1c(a,b,c){this.a=a;this.b=b;this.c=c} +function Rrd(a,b,c){this.a=a;this.b=b;this.c=c} +function zCd(a,b,c){this.a=a;this.b=b;this.c=c} +function IVd(a,b,c){this.e=a;this.a=b;this.c=c} +function kWd(a,b,c){UVd();cWd.call(this,a,b,c)} +function HXd(a,b,c){UVd();oXd.call(this,a,b,c)} +function TXd(a,b,c){UVd();oXd.call(this,a,b,c)} +function ZXd(a,b,c){UVd();oXd.call(this,a,b,c)} +function JXd(a,b,c){UVd();HXd.call(this,a,b,c)} +function LXd(a,b,c){UVd();HXd.call(this,a,b,c)} +function NXd(a,b,c){UVd();LXd.call(this,a,b,c)} +function VXd(a,b,c){UVd();TXd.call(this,a,b,c)} +function _Xd(a,b,c){UVd();ZXd.call(this,a,b,c)} +function $j(a,b){Qb(a);Qb(b);return new _j(a,b)} +function Nq(a,b){Qb(a);Qb(b);return new Wq(a,b)} +function Rq(a,b){Qb(a);Qb(b);return new ar(a,b)} +function lr(a,b){Qb(a);Qb(b);return new zr(a,b)} +function BD(a,b){CCb(a==null||AD(a,b));return a} +function Nu(a){var b;b=new Rkb;fr(b,a);return b} +function Ex(a){var b;b=new Tqb;fr(b,a);return b} +function Hx(a){var b;b=new Gxb;Jq(b,a);return b} +function Ru(a){var b;b=new Psb;Jq(b,a);return b} +function YEc(a){!a.e&&(a.e=new Rkb);return a.e} +function SMd(a){!a.c&&(a.c=new xYd);return a.c} +function Ekb(a,b){a.c[a.c.length]=b;return true} +function WA(a,b){this.c=a;this.b=b;this.a=false} +function Gg(a){this.d=a;Dg(this);this.b=ed(a.d)} +function pzb(){this.a=';,;';this.b='';this.c=''} +function Bvb(a,b,c){qvb.call(this,b,c);this.a=a} +function fAb(a,b,c){this.b=a;fvb.call(this,b,c)} +function lsb(a,b,c){this.c=a;pjb.call(this,b,c)} +function bCb(a,b,c){$Bb(c,0,a,b,c.length,false)} +function HVb(a,b,c,d,e){a.b=b;a.c=c;a.d=d;a.a=e} +function eBb(a,b){if(b){a.b=b;a.a=(Tzb(b),b.a)}} +function v_b(a,b,c,d,e){a.d=b;a.c=c;a.a=d;a.b=e} +function h5b(a){var b,c;b=a.b;c=a.c;a.b=c;a.c=b} +function k5b(a){var b,c;c=a.d;b=a.a;a.d=b;a.a=c} +function Lbb(a){return zbb(iD(Fbb(a)?Rbb(a):a))} +function rlc(a,b){return beb(D0b(a.d),D0b(b.d))} +function uic(a,b){return b==(Ucd(),Tcd)?a.c:a.d} +function FHc(){FHc=ccb;DHc=(Ucd(),Tcd);EHc=zcd} +function DRb(){this.b=Edb(ED(Ksd((wSb(),vSb))))} +function aBb(a){return EAb(),KC(SI,Uhe,1,a,5,1)} +function C6c(a){return new f7c(a.c+a.b,a.d+a.a)} +function Vmc(a,b){Imc();return beb(a.d.p,b.d.p)} +function Lsb(a){sCb(a.b!=0);return Nsb(a,a.a.a)} +function Msb(a){sCb(a.b!=0);return Nsb(a,a.c.b)} +function rCb(a,b){if(!a){throw vbb(new ucb(b))}} +function mCb(a,b){if(!a){throw vbb(new Wdb(b))}} +function dWb(a,b,c){cWb.call(this,a,b);this.b=c} +function pMd(a,b,c){MLd.call(this,a,b);this.c=c} +function Dnc(a,b,c){Cnc.call(this,b,c);this.d=a} +function _Gd(a){$Gd();MGd.call(this);this.th(a)} +function PNd(a,b,c){this.a=a;nNd.call(this,b,c)} +function UNd(a,b,c){this.a=a;nNd.call(this,b,c)} +function k2d(a,b,c){MLd.call(this,a,b);this.c=c} +function y1d(){T0d();z1d.call(this,(yFd(),xFd))} +function gFd(a){return a!=null&&!OEd(a,CEd,DEd)} +function dFd(a,b){return (jFd(a)<<4|jFd(b))&aje} +function ln(a,b){return Vm(),Wj(a,b),new iy(a,b)} +function Sdd(a,b){var c;if(a.n){c=b;Ekb(a.f,c)}} +function Upd(a,b,c){var d;d=new yC(c);cC(a,b,d)} +function WUd(a,b){var c;c=a.c;VUd(a,b);return c} +function Ydd(a,b){b<0?(a.g=-1):(a.g=b);return a} +function $6c(a,b){W6c(a);a.a*=b;a.b*=b;return a} +function G6c(a,b,c,d,e){a.c=b;a.d=c;a.b=d;a.a=e} +function Dsb(a,b){Gsb(a,b,a.c.b,a.c);return true} +function jsb(a){a.a.b=a.b;a.b.a=a.a;a.a=a.b=null} +function Aq(a){this.b=a;this.a=Wm(this.b.a).Ed()} +function Wq(a,b){this.b=a;this.a=b;ol.call(this)} +function ar(a,b){this.a=a;this.b=b;ol.call(this)} +function vvb(a,b){qvb.call(this,b,1040);this.a=a} +function Eeb(a){return a==0||isNaN(a)?a:a<0?-1:1} +function WPb(a){QPb();return jtd(a)==Xod(ltd(a))} +function XPb(a){QPb();return ltd(a)==Xod(jtd(a))} +function iYb(a,b){return hYb(a,new cWb(b.a,b.b))} +function NZb(a){return !OZb(a)&&a.c.i.c==a.d.i.c} +function _Gb(a){var b;b=a.n;return a.a.b+b.d+b.a} +function YHb(a){var b;b=a.n;return a.e.b+b.d+b.a} +function ZHb(a){var b;b=a.n;return a.e.a+b.b+b.c} +function zfe(a){wfe();++vfe;return new ige(0,a)} +function o_b(a){if(a.a){return a.a}return JZb(a)} +function CCb(a){if(!a){throw vbb(new Cdb(null))}} +function X6d(){X6d=ccb;W6d=(mmb(),new anb(Fwe))} +function ex(){ex=ccb;new gx((_k(),$k),(Lk(),Kk))} +function oeb(){oeb=ccb;neb=KC(JI,nie,19,256,0,1)} +function d$c(a,b,c,d){e$c.call(this,a,b,c,d,0,0)} +function sQc(a,b,c){return Rhb(a.b,BD(c.b,17),b)} +function tQc(a,b,c){return Rhb(a.b,BD(c.b,17),b)} +function xfd(a,b){return Ekb(a,new f7c(b.a,b.b))} +function Bic(a,b){return a.c=b){throw vbb(new rcb)}} +function Pyb(a,b,c){NC(b,0,Bzb(b[0],c[0]));return b} +function _yc(a,b,c){b.Ye(c,Edb(ED(Ohb(a.b,c)))*a.a)} +function n6c(a,b,c){i6c();return m6c(a,b)&&m6c(a,c)} +function tcd(a){rcd();return !a.Hc(ncd)&&!a.Hc(pcd)} +function D6c(a){return new f7c(a.c+a.b/2,a.d+a.a/2)} +function oOd(a,b){return b.kh()?xid(a.b,BD(b,49)):b} +function bvb(a,b){this.e=a;this.d=(b&64)!=0?b|oie:b} +function qvb(a,b){this.c=0;this.d=a;this.b=b|64|oie} +function gub(a){this.b=new Skb(11);this.a=(ipb(),a)} +function Qwb(a){this.b=null;this.a=(ipb(),!a?fpb:a)} +function nHc(a){this.a=lHc(a.a);this.b=new Tkb(a.b)} +function Pzd(a){this.b=a;Oyd.call(this,a);Ozd(this)} +function Xzd(a){this.b=a;bzd.call(this,a);Wzd(this)} +function jUd(a,b,c){this.a=a;gUd.call(this,b,c,5,6)} +function Y5d(a,b,c,d){this.b=a;xMd.call(this,b,c,d)} +function nSd(a,b,c,d,e){oSd.call(this,a,b,c,d,e,-1)} +function DSd(a,b,c,d,e){ESd.call(this,a,b,c,d,e,-1)} +function cUd(a,b,c,d){xMd.call(this,a,b,c);this.b=d} +function i5d(a,b,c,d){pMd.call(this,a,b,c);this.b=d} +function x0d(a){Wud.call(this,a,false);this.a=false} +function Lj(a,b){this.b=a;sj.call(this,a.b);this.a=b} +function px(a,b){im();ox.call(this,a,Dm(new amb(b)))} +function Cfe(a,b){wfe();++vfe;return new Dge(a,b,0)} +function Efe(a,b){wfe();++vfe;return new Dge(6,a,b)} +function nfb(a,b){return dfb(a.substr(0,b.length),b)} +function Mhb(a,b){return ND(b)?Qhb(a,b):!!irb(a.f,b)} +function Rrb(a,b){uCb(b);while(a.Ob()){b.td(a.Pb())}} +function Vgb(a,b,c){Hgb();this.e=a;this.d=b;this.a=c} +function amc(a,b,c,d){var e;e=a.i;e.i=b;e.a=c;e.b=d} +function xJc(a){var b;b=a;while(b.f){b=b.f}return b} +function fkb(a){var b;b=bkb(a);sCb(b!=null);return b} +function gkb(a){var b;b=ckb(a);sCb(b!=null);return b} +function cv(a,b){var c;c=a.a.gc();Sb(b,c);return c-b} +function Glb(a,b){var c;for(c=0;c0?$wnd.Math.log(a/b):-100} +function ueb(a,b){return ybb(a,b)<0?-1:ybb(a,b)>0?1:0} +function HMb(a,b,c){return IMb(a,BD(b,46),BD(c,167))} +function iq(a,b){return BD(Rl(Wm(a.a)).Xb(b),42).cd()} +function Olb(a,b){return avb(b,a.length),new vvb(a,b)} +function Pyd(a,b){this.d=a;Fyd.call(this,a);this.e=b} +function Lub(a){this.d=(uCb(a),a);this.a=0;this.c=rie} +function rge(a,b){xfe.call(this,1);this.a=a;this.b=b} +function Rzb(a,b){!a.c?Ekb(a.b,b):Rzb(a.c,b);return a} +function uB(a,b,c){var d;d=tB(a,b);vB(a,b,c);return d} +function ZBb(a,b){var c;c=a.slice(0,b);return PC(c,a)} +function Flb(a,b,c){var d;for(d=0;d=a.g} +function NHc(a,b,c){var d;d=THc(a,b,c);return MHc(a,d)} +function Qpd(a,b){var c;c=a.a.length;tB(a,c);vB(a,c,b)} +function gCb(a,b){var c;c=console[a];c.call(console,b)} +function Bvd(a,b){var c;++a.j;c=a.Vi();a.Ii(a.oi(c,b))} +function E1c(a,b,c){BD(b.b,65);Hkb(b.a,new L1c(a,c,b))} +function oXd(a,b,c){VVd.call(this,b);this.a=a;this.b=c} +function Dge(a,b,c){xfe.call(this,a);this.a=b;this.b=c} +function dYd(a,b,c){this.a=a;lVd.call(this,b);this.b=c} +function f0d(a,b,c){this.a=a;mxd.call(this,8,b,null,c)} +function z1d(a){this.a=(uCb(Rve),Rve);this.b=a;new oUd} +function ct(a){this.c=a;this.b=this.c.a;this.a=this.c.e} +function usb(a){this.c=a;this.b=a.a.d.a;ypb(a.a.e,this)} +function uib(a){yCb(a.c!=-1);a.d.$c(a.c);a.b=a.c;a.c=-1} +function U6c(a){return $wnd.Math.sqrt(a.a*a.a+a.b*a.b)} +function Uvb(a,b){return _vb(b,a.a.c.length),Ikb(a.a,b)} +function Hb(a,b){return PD(a)===PD(b)||a!=null&&pb(a,b)} +function oAb(a){if(0>=a){return new yAb}return pAb(a-1)} +function Nfe(a){if(!bfe)return false;return Qhb(bfe,a)} +function Ehe(a){if(a)return a.dc();return !a.Kc().Ob()} +function Q_b(a){if(!a.a&&!!a.c){return a.c.b}return a.a} +function LHd(a){!a.a&&(a.a=new xMd(m5,a,4));return a.a} +function LQd(a){!a.d&&(a.d=new xMd(j5,a,1));return a.d} +function uCb(a){if(a==null){throw vbb(new Geb)}return a} +function Qzb(a){if(!a.c){a.d=true;Szb(a)}else{a.c.He()}} +function Tzb(a){if(!a.c){Uzb(a);a.d=true}else{Tzb(a.c)}} +function Kpb(a){Ae(a.a);a.b=KC(SI,Uhe,1,a.b.length,5,1)} +function qlc(a,b){return beb(b.j.c.length,a.j.c.length)} +function igd(a,b){a.c<0||a.b.b=0?a.Bh(c):vid(a,b)} +function WHc(a){var b,c;b=a.c.i.c;c=a.d.i.c;return b==c} +function Wwd(a){if(a.p!=4)throw vbb(new Ydb);return a.e} +function Vwd(a){if(a.p!=3)throw vbb(new Ydb);return a.e} +function Ywd(a){if(a.p!=6)throw vbb(new Ydb);return a.f} +function fxd(a){if(a.p!=6)throw vbb(new Ydb);return a.k} +function cxd(a){if(a.p!=3)throw vbb(new Ydb);return a.j} +function dxd(a){if(a.p!=4)throw vbb(new Ydb);return a.j} +function AYd(a){!a.b&&(a.b=new RYd(new NYd));return a.b} +function $1d(a){a.c==-2&&e2d(a,X0d(a.g,a.b));return a.c} +function pdb(a,b){var c;c=ldb('',a);c.n=b;c.i=1;return c} +function MNb(a,b){$Nb(BD(b.b,65),a);Hkb(b.a,new RNb(a))} +function Cnd(a,b){wtd((!a.a&&(a.a=new fTd(a,a)),a.a),b)} +function Qzd(a,b){this.b=a;Pyd.call(this,a,b);Ozd(this)} +function Yzd(a,b){this.b=a;czd.call(this,a,b);Wzd(this)} +function Ms(a,b,c,d){Wo.call(this,a,b);this.d=c;this.a=d} +function $o(a,b,c,d){Wo.call(this,a,c);this.a=b;this.f=d} +function iy(a,b){Pp.call(this,umb(Qb(a),Qb(b)));this.a=b} +function cae(){fod.call(this,Ewe,(p8d(),o8d));$9d(this)} +function AZd(){fod.call(this,_ve,(LFd(),KFd));uZd(this)} +function T0c(){$r.call(this,'DELAUNAY_TRIANGULATION',0)} +function vfb(a){return String.fromCharCode.apply(null,a)} +function Rhb(a,b,c){return ND(b)?Shb(a,b,c):jrb(a.f,b,c)} +function tmb(a){mmb();return !a?(ipb(),ipb(),hpb):a.ve()} +function d2c(a,b,c){Y1c();return c.pg(a,BD(b.cd(),146))} +function ix(a,b){ex();return new gx(new il(a),new Uk(b))} +function Iu(a){Xj(a,Mie);return Oy(wbb(wbb(5,a),a/10|0))} +function Vm(){Vm=ccb;Um=new wx(OC(GC(CK,1),zie,42,0,[]))} +function hob(a){!a.d&&(a.d=new lnb(a.c.Cc()));return a.d} +function eob(a){!a.a&&(a.a=new Gob(a.c.vc()));return a.a} +function gob(a){!a.b&&(a.b=new zob(a.c.ec()));return a.b} +function keb(a,b){while(b-->0){a=a<<1|(a<0?1:0)}return a} +function wtb(a,b){return PD(a)===PD(b)||a!=null&&pb(a,b)} +function Gbc(a,b){return Bcb(),BD(b.b,19).ad&&++d;return d} +function Nnd(a){var b,c;c=(b=new UQd,b);NQd(c,a);return c} +function Ond(a){var b,c;c=(b=new UQd,b);RQd(c,a);return c} +function hqd(a,b){var c;c=Ohb(a.f,b);Yqd(b,c);return null} +function JZb(a){var b;b=P2b(a);if(b){return b}return null} +function Wod(a){!a.b&&(a.b=new cUd(B2,a,12,3));return a.b} +function YEd(a){return a!=null&&hnb(GEd,a.toLowerCase())} +function ied(a,b){return Kdb(red(a)*qed(a),red(b)*qed(b))} +function jed(a,b){return Kdb(red(a)*qed(a),red(b)*qed(b))} +function wEb(a,b){return Kdb(a.d.c+a.d.b/2,b.d.c+b.d.b/2)} +function UVb(a,b){return Kdb(a.g.c+a.g.b/2,b.g.c+b.g.b/2)} +function pQb(a,b,c){c.a?eld(a,b.b-a.f/2):dld(a,b.a-a.g/2)} +function prd(a,b,c,d){this.a=a;this.b=b;this.c=c;this.d=d} +function ord(a,b,c,d){this.a=a;this.b=b;this.c=c;this.d=d} +function JVd(a,b,c,d){this.e=a;this.a=b;this.c=c;this.d=d} +function ZVd(a,b,c,d){this.a=a;this.c=b;this.d=c;this.b=d} +function cXd(a,b,c,d){UVd();mWd.call(this,b,c,d);this.a=a} +function jXd(a,b,c,d){UVd();mWd.call(this,b,c,d);this.a=a} +function Ng(a,b){this.a=a;Hg.call(this,a,BD(a.d,15).Zc(b))} +function ZBd(a){this.f=a;this.c=this.f.e;a.f>0&&YBd(this)} +function lBb(a,b,c,d){this.b=a;this.c=d;nvb.call(this,b,c)} +function tib(a){sCb(a.b=0&&dfb(a.substr(c,b.length),b)} +function H2d(a,b,c,d,e,f,g){return new O7d(a.e,b,c,d,e,f,g)} +function Cxd(a,b,c,d,e,f){this.a=a;nxd.call(this,b,c,d,e,f)} +function vyd(a,b,c,d,e,f){this.a=a;nxd.call(this,b,c,d,e,f)} +function $Ec(a,b){this.g=a;this.d=OC(GC(OQ,1),kne,10,0,[b])} +function KVd(a,b){this.e=a;this.a=SI;this.b=R5d(b);this.c=b} +function cIb(a,b){$Gb.call(this);THb(this);this.a=a;this.c=b} +function kBc(a,b,c,d){NC(a.c[b.g],c.g,d);NC(a.c[c.g],b.g,d)} +function nBc(a,b,c,d){NC(a.c[b.g],b.g,c);NC(a.b[b.g],b.g,d)} +function cBc(){_Ac();return OC(GC(fX,1),Kie,376,0,[$Ac,ZAc])} +function crc(){_qc();return OC(GC(MW,1),Kie,479,0,[$qc,Zqc])} +function Aqc(){xqc();return OC(GC(JW,1),Kie,419,0,[vqc,wqc])} +function Lpc(){Ipc();return OC(GC(FW,1),Kie,422,0,[Gpc,Hpc])} +function psc(){msc();return OC(GC(SW,1),Kie,420,0,[ksc,lsc])} +function EAc(){BAc();return OC(GC(cX,1),Kie,421,0,[zAc,AAc])} +function XIc(){UIc();return OC(GC(mY,1),Kie,523,0,[TIc,SIc])} +function KOc(){HOc();return OC(GC(DZ,1),Kie,520,0,[GOc,FOc])} +function _Lc(){YLc();return OC(GC(fZ,1),Kie,516,0,[XLc,WLc])} +function hMc(){eMc();return OC(GC(gZ,1),Kie,515,0,[cMc,dMc])} +function IQc(){FQc();return OC(GC(YZ,1),Kie,455,0,[DQc,EQc])} +function bUc(){$Tc();return OC(GC(F$,1),Kie,425,0,[ZTc,YTc])} +function VTc(){STc();return OC(GC(E$,1),Kie,480,0,[QTc,RTc])} +function VUc(){PUc();return OC(GC(K$,1),Kie,495,0,[NUc,OUc])} +function jWc(){fWc();return OC(GC(X$,1),Kie,426,0,[dWc,eWc])} +function g1c(){a1c();return OC(GC(X_,1),Kie,429,0,[_0c,$0c])} +function F_c(){C_c();return OC(GC(P_,1),Kie,430,0,[B_c,A_c])} +function PEb(){MEb();return OC(GC(aN,1),Kie,428,0,[LEb,KEb])} +function XEb(){UEb();return OC(GC(bN,1),Kie,427,0,[SEb,TEb])} +function $Rb(){XRb();return OC(GC(gP,1),Kie,424,0,[VRb,WRb])} +function B5b(){y5b();return OC(GC(ZR,1),Kie,511,0,[x5b,w5b])} +function lid(a,b,c,d){return c>=0?a.jh(b,c,d):a.Sg(null,c,d)} +function hgd(a){if(a.b.b==0){return a.a.$e()}return Lsb(a.b)} +function Xwd(a){if(a.p!=5)throw vbb(new Ydb);return Tbb(a.f)} +function exd(a){if(a.p!=5)throw vbb(new Ydb);return Tbb(a.k)} +function pNd(a){PD(a.a)===PD((NKd(),MKd))&&qNd(a);return a.a} +function by(a){this.a=BD(Qb(a),271);this.b=(mmb(),new Zob(a))} +function bQc(a,b){$Pc(this,new f7c(a.a,a.b));_Pc(this,Ru(b))} +function FQc(){FQc=ccb;DQc=new GQc(jle,0);EQc=new GQc(kle,1)} +function YLc(){YLc=ccb;XLc=new ZLc(kle,0);WLc=new ZLc(jle,1)} +function Hp(){Gp.call(this,new Mqb(Cv(12)));Lb(true);this.a=2} +function Hge(a,b,c){wfe();xfe.call(this,a);this.b=b;this.a=c} +function cWd(a,b,c){UVd();VVd.call(this,b);this.a=a;this.b=c} +function aIb(a){$Gb.call(this);THb(this);this.a=a;this.c=true} +function isb(a){var b;b=a.c.d.b;a.b=b;a.a=a.c.d;b.a=a.c.d.b=a} +function $Cb(a){var b;NGb(a.a);MGb(a.a);b=new YGb(a.a);UGb(b)} +function iKb(a,b){hKb(a,true);Hkb(a.e.wf(),new mKb(a,true,b))} +function tlb(a,b){pCb(b);return vlb(a,KC(WD,oje,25,b,15,1),b)} +function YPb(a,b){QPb();return a==Xod(jtd(b))||a==Xod(ltd(b))} +function Phb(a,b){return b==null?Wd(irb(a.f,null)):Crb(a.g,b)} +function Ksb(a){return a.b==0?null:(sCb(a.b!=0),Nsb(a,a.a.a))} +function QD(a){return Math.max(Math.min(a,Ohe),-2147483648)|0} +function uz(a,b){var c=tz[a.charCodeAt(0)];return c==null?a:c} +function Cx(a,b){Rb(a,'set1');Rb(b,'set2');return new Px(a,b)} +function QUb(a,b){var c;c=zUb(a.f,b);return P6c(V6c(c),a.f.d)} +function Jwb(a,b){var c,d;c=b;d=new fxb;Lwb(a,c,d);return d.d} +function NJb(a,b,c,d){var e;e=new aHb;b.a[c.g]=e;Npb(a.b,d,e)} +function zid(a,b,c){var d;d=a.Yg(b);d>=0?a.sh(d,c):uid(a,b,c)} +function hvd(a,b,c){evd();!!a&&Rhb(dvd,a,b);!!a&&Rhb(cvd,a,c)} +function g_c(a,b,c){this.i=new Rkb;this.b=a;this.g=b;this.a=c} +function VZc(a,b,c){this.c=new Rkb;this.e=a;this.f=b;this.b=c} +function b$c(a,b,c){this.a=new Rkb;this.e=a;this.f=b;this.c=c} +function Zy(a,b){Py(this);this.f=b;this.g=a;Ry(this);this._d()} +function ZA(a,b){var c;c=a.q.getHours();a.q.setDate(b);YA(a,c)} +function no(a,b){var c;Qb(b);for(c=a.a;c;c=c.c){b.Od(c.g,c.i)}} +function Fx(a){var b;b=new Uqb(Cv(a.length));nmb(b,a);return b} +function ecb(a){function b(){} +;b.prototype=a||{};return new b} +function dkb(a,b){if(Zjb(a,b)){wkb(a);return true}return false} +function aC(a,b){if(b==null){throw vbb(new Geb)}return bC(a,b)} +function tdb(a){if(a.qe()){return null}var b=a.n;return _bb[b]} +function Mld(a){if(a.Db>>16!=3)return null;return BD(a.Cb,33)} +function mpd(a){if(a.Db>>16!=9)return null;return BD(a.Cb,33)} +function fmd(a){if(a.Db>>16!=6)return null;return BD(a.Cb,79)} +function Ind(a){if(a.Db>>16!=7)return null;return BD(a.Cb,235)} +function Fod(a){if(a.Db>>16!=7)return null;return BD(a.Cb,160)} +function Xod(a){if(a.Db>>16!=11)return null;return BD(a.Cb,33)} +function nid(a,b){var c;c=a.Yg(b);return c>=0?a.lh(c):tid(a,b)} +function Dtd(a,b){var c;c=new Bsb(b);Ve(c,a);return new Tkb(c)} +function Uud(a){var b;b=a.d;b=a.si(a.f);wtd(a,b);return b.Ob()} +function t_b(a,b){a.b+=b.b;a.c+=b.c;a.d+=b.d;a.a+=b.a;return a} +function A4b(a,b){return $wnd.Math.abs(a)<$wnd.Math.abs(b)?a:b} +function Zod(a){return !a.a&&(a.a=new cUd(E2,a,10,11)),a.a.i>0} +function oDb(){this.a=new zsb;this.e=new Tqb;this.g=0;this.i=0} +function BGc(a){this.a=a;this.b=KC(SX,nie,1944,a.e.length,0,2)} +function RHc(a,b,c){var d;d=SHc(a,b,c);a.b=new BHc(d.c.length)} +function eMc(){eMc=ccb;cMc=new fMc(vle,0);dMc=new fMc('UP',1)} +function STc(){STc=ccb;QTc=new TTc(Yqe,0);RTc=new TTc('FAN',1)} +function evd(){evd=ccb;dvd=new Lqb;cvd=new Lqb;ivd(hK,new jvd)} +function Swd(a){if(a.p!=0)throw vbb(new Ydb);return Kbb(a.f,0)} +function _wd(a){if(a.p!=0)throw vbb(new Ydb);return Kbb(a.k,0)} +function MHd(a){if(a.Db>>16!=3)return null;return BD(a.Cb,147)} +function ZJd(a){if(a.Db>>16!=6)return null;return BD(a.Cb,235)} +function WId(a){if(a.Db>>16!=17)return null;return BD(a.Cb,26)} +function rdb(a,b){var c=a.a=a.a||[];return c[b]||(c[b]=a.le(b))} +function hrb(a,b){var c;c=a.a.get(b);return c==null?new Array:c} +function aB(a,b){var c;c=a.q.getHours();a.q.setMonth(b);YA(a,c)} +function Shb(a,b,c){return b==null?jrb(a.f,null,c):Drb(a.g,b,c)} +function FLd(a,b,c,d,e,f){return new pSd(a.e,b,a.aj(),c,d,e,f)} +function Tfb(a,b,c){a.a=qfb(a.a,0,b)+(''+c)+pfb(a.a,b);return a} +function bq(a,b,c){Ekb(a.a,(Vm(),Wj(b,c),new Wo(b,c)));return a} +function uu(a){ot(a.c);a.e=a.a=a.c;a.c=a.c.c;++a.d;return a.a.f} +function vu(a){ot(a.e);a.c=a.a=a.e;a.e=a.e.e;--a.d;return a.a.f} +function RZb(a,b){!!a.d&&Lkb(a.d.e,a);a.d=b;!!a.d&&Ekb(a.d.e,a)} +function QZb(a,b){!!a.c&&Lkb(a.c.g,a);a.c=b;!!a.c&&Ekb(a.c.g,a)} +function $_b(a,b){!!a.c&&Lkb(a.c.a,a);a.c=b;!!a.c&&Ekb(a.c.a,a)} +function F0b(a,b){!!a.i&&Lkb(a.i.j,a);a.i=b;!!a.i&&Ekb(a.i.j,a)} +function jDb(a,b,c){this.a=b;this.c=a;this.b=(Qb(c),new Tkb(c))} +function qXb(a,b,c){this.a=b;this.c=a;this.b=(Qb(c),new Tkb(c))} +function aOb(a,b){this.a=a;this.c=R6c(this.a);this.b=new K6c(b)} +function IAb(a){var b;Uzb(a);b=new Tqb;return JAb(a,new jBb(b))} +function wCb(a,b){if(a<0||a>b){throw vbb(new qcb(Ake+a+Bke+b))}} +function Ppb(a,b){return vqb(a.a,b)?Qpb(a,BD(b,22).g,null):null} +function WUb(a){LUb();return Bcb(),BD(a.a,81).d.e!=0?true:false} +function qs(){qs=ccb;ps=as((hs(),OC(GC(yG,1),Kie,538,0,[gs])))} +function SBc(){SBc=ccb;RBc=c3c(new j3c,(qUb(),pUb),(S8b(),J8b))} +function ZBc(){ZBc=ccb;YBc=c3c(new j3c,(qUb(),pUb),(S8b(),J8b))} +function oCc(){oCc=ccb;nCc=c3c(new j3c,(qUb(),pUb),(S8b(),J8b))} +function aJc(){aJc=ccb;_Ic=e3c(new j3c,(qUb(),pUb),(S8b(),h8b))} +function FJc(){FJc=ccb;EJc=e3c(new j3c,(qUb(),pUb),(S8b(),h8b))} +function ILc(){ILc=ccb;HLc=e3c(new j3c,(qUb(),pUb),(S8b(),h8b))} +function wMc(){wMc=ccb;vMc=e3c(new j3c,(qUb(),pUb),(S8b(),h8b))} +function fUc(){fUc=ccb;eUc=c3c(new j3c,(yRc(),xRc),(qSc(),kSc))} +function DOc(a,b,c,d){this.c=a;this.d=d;BOc(this,b);COc(this,c)} +function W3c(a){this.c=new Psb;this.b=a.b;this.d=a.c;this.a=a.a} +function e7c(a){this.a=$wnd.Math.cos(a);this.b=$wnd.Math.sin(a)} +function BOc(a,b){!!a.a&&Lkb(a.a.k,a);a.a=b;!!a.a&&Ekb(a.a.k,a)} +function COc(a,b){!!a.b&&Lkb(a.b.f,a);a.b=b;!!a.b&&Ekb(a.b.f,a)} +function D1c(a,b){E1c(a,a.b,a.c);BD(a.b.b,65);!!b&&BD(b.b,65).b} +function BUd(a,b){CUd(a,b);JD(a.Cb,88)&&XMd($Kd(BD(a.Cb,88)),2)} +function cJd(a,b){JD(a.Cb,88)&&XMd($Kd(BD(a.Cb,88)),4);pnd(a,b)} +function lKd(a,b){JD(a.Cb,179)&&(BD(a.Cb,179).tb=null);pnd(a,b)} +function T2d(a,b){return Q6d(),YId(b)?new R7d(b,a):new f7d(b,a)} +function jsd(a,b){var c,d;c=b.c;d=c!=null;d&&Qpd(a,new yC(b.c))} +function XOd(a){var b,c;c=(LFd(),b=new UQd,b);NQd(c,a);return c} +function eTd(a){var b,c;c=(LFd(),b=new UQd,b);NQd(c,a);return c} +function yCc(a,b){var c;c=new H1b(a);b.c[b.c.length]=c;return c} +function Aw(a,b){var c;c=BD(Hv(nd(a.a),b),14);return !c?0:c.gc()} +function UAb(a){var b;Uzb(a);b=(ipb(),ipb(),gpb);return VAb(a,b)} +function nr(a){var b;while(true){b=a.Pb();if(!a.Ob()){return b}}} +function Ki(a,b){Ii.call(this,new Mqb(Cv(a)));Xj(b,mie);this.a=b} +function Jib(a,b,c){xCb(b,c,a.gc());this.c=a;this.a=b;this.b=c-b} +function Mkb(a,b,c){var d;xCb(b,c,a.c.length);d=c-b;cCb(a.c,b,d)} +function Fub(a,b){Eub(a,Tbb(xbb(Obb(b,24),nke)),Tbb(xbb(b,nke)))} +function tCb(a,b){if(a<0||a>=b){throw vbb(new qcb(Ake+a+Bke+b))}} +function BCb(a,b){if(a<0||a>=b){throw vbb(new Xfb(Ake+a+Bke+b))}} +function Kub(a,b){this.b=(uCb(a),a);this.a=(b&Rje)==0?b|64|oie:b} +function kkb(a){Vjb(this);dCb(this.a,geb($wnd.Math.max(8,a))<<1)} +function A0b(a){return l7c(OC(GC(m1,1),nie,8,0,[a.i.n,a.n,a.a]))} +function Iyb(){Fyb();return OC(GC(xL,1),Kie,132,0,[Cyb,Dyb,Eyb])} +function jHb(){gHb();return OC(GC(pN,1),Kie,232,0,[dHb,eHb,fHb])} +function QHb(){NHb();return OC(GC(sN,1),Kie,461,0,[LHb,KHb,MHb])} +function HIb(){EIb();return OC(GC(zN,1),Kie,462,0,[DIb,CIb,BIb])} +function UXb(){RXb();return OC(GC(hQ,1),Kie,423,0,[QXb,PXb,OXb])} +function BTb(){yTb();return OC(GC(oP,1),Kie,379,0,[wTb,vTb,xTb])} +function Bzc(){xzc();return OC(GC(ZW,1),Kie,378,0,[uzc,vzc,wzc])} +function Xpc(){Rpc();return OC(GC(GW,1),Kie,314,0,[Ppc,Opc,Qpc])} +function eqc(){bqc();return OC(GC(HW,1),Kie,337,0,[$pc,aqc,_pc])} +function Jqc(){Gqc();return OC(GC(KW,1),Kie,450,0,[Eqc,Dqc,Fqc])} +function Ikc(){Fkc();return OC(GC(vV,1),Kie,361,0,[Ekc,Dkc,Ckc])} +function hsc(){esc();return OC(GC(RW,1),Kie,303,0,[csc,dsc,bsc])} +function $rc(){Xrc();return OC(GC(QW,1),Kie,292,0,[Vrc,Wrc,Urc])} +function NAc(){KAc();return OC(GC(dX,1),Kie,452,0,[JAc,HAc,IAc])} +function wAc(){tAc();return OC(GC(bX,1),Kie,339,0,[rAc,qAc,sAc])} +function WAc(){TAc();return OC(GC(eX,1),Kie,375,0,[QAc,RAc,SAc])} +function OBc(){LBc();return OC(GC(jX,1),Kie,377,0,[JBc,KBc,IBc])} +function wBc(){tBc();return OC(GC(hX,1),Kie,336,0,[qBc,rBc,sBc])} +function FBc(){CBc();return OC(GC(iX,1),Kie,338,0,[BBc,zBc,ABc])} +function uGc(){rGc();return OC(GC(PX,1),Kie,454,0,[oGc,pGc,qGc])} +function xVc(){tVc();return OC(GC(O$,1),Kie,442,0,[sVc,qVc,rVc])} +function tWc(){pWc();return OC(GC(Y$,1),Kie,380,0,[mWc,nWc,oWc])} +function CYc(){zYc();return OC(GC(q_,1),Kie,381,0,[xYc,yYc,wYc])} +function wXc(){sXc();return OC(GC(b_,1),Kie,293,0,[qXc,rXc,pXc])} +function _$c(){Y$c();return OC(GC(J_,1),Kie,437,0,[V$c,W$c,X$c])} +function kbd(){hbd();return OC(GC(z1,1),Kie,334,0,[fbd,ebd,gbd])} +function tad(){qad();return OC(GC(u1,1),Kie,272,0,[nad,oad,pad])} +function o3d(a,b){return p3d(a,b,JD(b,99)&&(BD(b,18).Bb&Tje)!=0)} +function LZc(a,b,c){var d;d=MZc(a,b,false);return d.b<=b&&d.a<=c} +function tMc(a,b,c){var d;d=new sMc;d.b=b;d.a=c;++b.b;Ekb(a.d,d)} +function fs(a,b){var c;c=(uCb(a),a).g;lCb(!!c);uCb(b);return c(b)} +function av(a,b){var c,d;d=cv(a,b);c=a.a.Zc(d);return new qv(a,c)} +function cKd(a){if(a.Db>>16!=6)return null;return BD(aid(a),235)} +function Uwd(a){if(a.p!=2)throw vbb(new Ydb);return Tbb(a.f)&aje} +function bxd(a){if(a.p!=2)throw vbb(new Ydb);return Tbb(a.k)&aje} +function Z1d(a){a.a==(T0d(),S0d)&&d2d(a,U0d(a.g,a.b));return a.a} +function _1d(a){a.d==(T0d(),S0d)&&f2d(a,Y0d(a.g,a.b));return a.d} +function mlb(a){sCb(a.ad?1:0} +function bjc(a,b){var c,d;c=ajc(b);d=c;return BD(Ohb(a.c,d),19).a} +function iSc(a,b){var c;c=a+'';while(c.length0&&a.a[--a.d]==0);a.a[a.d++]==0&&(a.e=0)} +function wwb(a){return !a.a?a.c:a.e.length==0?a.a.a:a.a.a+(''+a.e)} +function RSd(a){return !!a.a&&QSd(a.a.a).i!=0&&!(!!a.b&&QTd(a.b))} +function cLd(a){return !!a.u&&VKd(a.u.a).i!=0&&!(!!a.n&&FMd(a.n))} +function $i(a){return Zj(a.e.Hd().gc()*a.c.Hd().gc(),16,new ij(a))} +function XA(a,b){return ueb(Cbb(a.q.getTime()),Cbb(b.q.getTime()))} +function k_b(a){return BD(Qkb(a,KC(AQ,jne,17,a.c.length,0,1)),474)} +function l_b(a){return BD(Qkb(a,KC(OQ,kne,10,a.c.length,0,1)),193)} +function cKc(a){FJc();return !OZb(a)&&!(!OZb(a)&&a.c.i.c==a.d.i.c)} +function kDb(a,b,c){var d;d=(Qb(a),new Tkb(a));iDb(new jDb(d,b,c))} +function rXb(a,b,c){var d;d=(Qb(a),new Tkb(a));pXb(new qXb(d,b,c))} +function Nwb(a,b){var c;c=1-b;a.a[c]=Owb(a.a[c],c);return Owb(a,b)} +function YXc(a,b){var c;a.e=new QXc;c=gVc(b);Okb(c,a.c);ZXc(a,c,0)} +function o4c(a,b,c,d){var e;e=new w4c;e.a=b;e.b=c;e.c=d;Dsb(a.a,e)} +function p4c(a,b,c,d){var e;e=new w4c;e.a=b;e.b=c;e.c=d;Dsb(a.b,e)} +function i6d(a){var b,c,d;b=new A6d;c=s6d(b,a);z6d(b);d=c;return d} +function vZd(){var a,b,c;b=(c=(a=new UQd,a),c);Ekb(rZd,b);return b} +function H2c(a){a.j.c=KC(SI,Uhe,1,0,5,1);Ae(a.c);h3c(a.a);return a} +function tgc(a){qgc();if(JD(a.g,10)){return BD(a.g,10)}return null} +function Zw(a){if(Ah(a).dc()){return false}Bh(a,new bx);return true} +function _y(b){if(!('stack' in b)){try{throw b}catch(a){}}return b} +function Pb(a,b){if(a<0||a>=b){throw vbb(new qcb(Ib(a,b)))}return a} +function Tb(a,b,c){if(a<0||bc){throw vbb(new qcb(Kb(a,b,c)))}} +function eVb(a,b){Qqb(a.a,b);if(b.d){throw vbb(new hz(Hke))}b.d=a} +function xpb(a,b){if(b.$modCount!=a.$modCount){throw vbb(new Apb)}} +function $pb(a,b){if(JD(b,42)){return Jd(a.a,BD(b,42))}return false} +function dib(a,b){if(JD(b,42)){return Jd(a.a,BD(b,42))}return false} +function msb(a,b){if(JD(b,42)){return Jd(a.a,BD(b,42))}return false} +function qAb(a,b){if(a.a<=a.b){b.ud(a.a++);return true}return false} +function Sbb(a){var b;if(Fbb(a)){b=a;return b==-0.?0:b}return oD(a)} +function tAb(a){var b;Tzb(a);b=new drb;_ub(a.a,new BAb(b));return b} +function Yzb(a){var b;Tzb(a);b=new Gpb;_ub(a.a,new mAb(b));return b} +function Bib(a,b){this.a=a;vib.call(this,a);wCb(b,a.gc());this.b=b} +function orb(a){this.e=a;this.b=this.e.a.entries();this.a=new Array} +function Oi(a){return Zj(a.e.Hd().gc()*a.c.Hd().gc(),273,new cj(a))} +function Qu(a){return new Skb((Xj(a,Mie),Oy(wbb(wbb(5,a),a/10|0))))} +function m_b(a){return BD(Qkb(a,KC(aR,lne,11,a.c.length,0,1)),1943)} +function sMb(a,b,c){return c.f.c.length>0?HMb(a.a,b,c):HMb(a.b,b,c)} +function SZb(a,b,c){!!a.d&&Lkb(a.d.e,a);a.d=b;!!a.d&&Dkb(a.d.e,c,a)} +function a5b(a,b){i5b(b,a);k5b(a.d);k5b(BD(vNb(a,(Nyc(),wxc)),207))} +function _4b(a,b){f5b(b,a);h5b(a.d);h5b(BD(vNb(a,(Nyc(),wxc)),207))} +function Ypd(a,b){var c,d;c=aC(a,b);d=null;!!c&&(d=c.fe());return d} +function Zpd(a,b){var c,d;c=tB(a,b);d=null;!!c&&(d=c.ie());return d} +function $pd(a,b){var c,d;c=aC(a,b);d=null;!!c&&(d=c.ie());return d} +function _pd(a,b){var c,d;c=aC(a,b);d=null;!!c&&(d=aqd(c));return d} +function Tqd(a,b,c){var d;d=Wpd(c);ro(a.g,d,b);ro(a.i,b,c);return b} +function Ez(a,b,c){var d;d=Cz();try{return Bz(a,b,c)}finally{Fz(d)}} +function C6d(a){var b;b=a.Wg();this.a=JD(b,69)?BD(b,69).Zh():b.Kc()} +function j3c(){D2c.call(this);this.j.c=KC(SI,Uhe,1,0,5,1);this.a=-1} +function mxd(a,b,c,d){this.d=a;this.n=b;this.g=c;this.o=d;this.p=-1} +function jk(a,b,c,d){this.e=d;this.d=null;this.c=a;this.a=b;this.b=c} +function uEc(a,b,c){this.d=new HEc(this);this.e=a;this.i=b;this.f=c} +function msc(){msc=ccb;ksc=new nsc(gle,0);lsc=new nsc('TOP_LEFT',1)} +function cDc(){cDc=ccb;bDc=ix(meb(1),meb(4));aDc=ix(meb(1),meb(2))} +function z_c(){z_c=ccb;y_c=as((s_c(),OC(GC(O_,1),Kie,551,0,[r_c])))} +function q_c(){q_c=ccb;p_c=as((i_c(),OC(GC(N_,1),Kie,482,0,[h_c])))} +function Z0c(){Z0c=ccb;Y0c=as((R0c(),OC(GC(W_,1),Kie,530,0,[Q0c])))} +function hPb(){hPb=ccb;gPb=as((cPb(),OC(GC(GO,1),Kie,481,0,[bPb])))} +function yLb(){vLb();return OC(GC(PN,1),Kie,406,0,[uLb,rLb,sLb,tLb])} +function qxb(){lxb();return OC(GC(iL,1),Kie,297,0,[hxb,ixb,jxb,kxb])} +function UOb(){ROb();return OC(GC(CO,1),Kie,394,0,[OOb,NOb,POb,QOb])} +function UMb(){RMb();return OC(GC(jO,1),Kie,323,0,[OMb,NMb,PMb,QMb])} +function sWb(){lWb();return OC(GC(SP,1),Kie,405,0,[hWb,kWb,iWb,jWb])} +function kbc(){gbc();return OC(GC(VS,1),Kie,360,0,[fbc,dbc,ebc,cbc])} +function Vc(a,b,c,d){return JD(c,54)?new Cg(a,b,c,d):new qg(a,b,c,d)} +function Djc(){Ajc();return OC(GC(mV,1),Kie,411,0,[wjc,xjc,yjc,zjc])} +function okc(a){var b;return a.j==(Ucd(),Rcd)&&(b=pkc(a),uqb(b,zcd))} +function Mdc(a,b){var c;c=b.a;QZb(c,b.c.d);RZb(c,b.d.d);q7c(c.a,a.n)} +function Smc(a,b){return BD(Btb(QAb(BD(Qc(a.k,b),15).Oc(),Hmc)),113)} +function Tmc(a,b){return BD(Btb(RAb(BD(Qc(a.k,b),15).Oc(),Hmc)),113)} +function _w(a){return new Kub(rmb(BD(a.a.dd(),14).gc(),a.a.cd()),16)} +function Qq(a){if(JD(a,14)){return BD(a,14).dc()}return !a.Kc().Ob()} +function ugc(a){qgc();if(JD(a.g,145)){return BD(a.g,145)}return null} +function Ko(a){if(a.e.g!=a.b){throw vbb(new Apb)}return !!a.c&&a.d>0} +function Xsb(a){sCb(a.b!=a.d.c);a.c=a.b;a.b=a.b.a;++a.a;return a.c.c} +function Xjb(a,b){uCb(b);NC(a.a,a.c,b);a.c=a.c+1&a.a.length-1;_jb(a)} +function Wjb(a,b){uCb(b);a.b=a.b-1&a.a.length-1;NC(a.a,a.b,b);_jb(a)} +function A2c(a,b){var c;for(c=a.j.c.length;c0&&$fb(a.g,0,b,0,a.i);return b} +function qEd(a,b){pEd();var c;c=BD(Ohb(oEd,a),55);return !c||c.wj(b)} +function Twd(a){if(a.p!=1)throw vbb(new Ydb);return Tbb(a.f)<<24>>24} +function axd(a){if(a.p!=1)throw vbb(new Ydb);return Tbb(a.k)<<24>>24} +function gxd(a){if(a.p!=7)throw vbb(new Ydb);return Tbb(a.k)<<16>>16} +function Zwd(a){if(a.p!=7)throw vbb(new Ydb);return Tbb(a.f)<<16>>16} +function sr(a){var b;b=0;while(a.Ob()){a.Pb();b=wbb(b,1)}return Oy(b)} +function nx(a,b){var c;c=new Vfb;a.xd(c);c.a+='..';b.yd(c);return c.a} +function Sgc(a,b,c){var d;d=BD(Ohb(a.g,c),57);Ekb(a.a.c,new vgd(b,d))} +function VCb(a,b,c){return Ddb(ED(Wd(irb(a.f,b))),ED(Wd(irb(a.f,c))))} +function E2d(a,b,c){return F2d(a,b,c,JD(b,99)&&(BD(b,18).Bb&Tje)!=0)} +function L2d(a,b,c){return M2d(a,b,c,JD(b,99)&&(BD(b,18).Bb&Tje)!=0)} +function q3d(a,b,c){return r3d(a,b,c,JD(b,99)&&(BD(b,18).Bb&Tje)!=0)} +function JJc(a,b){return a==(j0b(),h0b)&&b==h0b?4:a==h0b||b==h0b?8:32} +function Nd(a,b){return PD(b)===PD(a)?'(this Map)':b==null?Xhe:fcb(b)} +function kFd(a,b){return BD(b==null?Wd(irb(a.f,null)):Crb(a.g,b),281)} +function Rqd(a,b,c){var d;d=Wpd(c);Rhb(a.b,d,b);Rhb(a.c,b,c);return b} +function Bfd(a,b){var c;c=b;while(c){O6c(a,c.i,c.j);c=Xod(c)}return a} +function kt(a,b){var c;c=vmb(Nu(new wu(a,b)));ir(new wu(a,b));return c} +function R6d(a,b){Q6d();var c;c=BD(a,66).Mj();kVd(c,b);return c.Ok(b)} +function TOc(a,b,c,d,e){var f;f=OOc(e,c,d);Ekb(b,tOc(e,f));XOc(a,e,b)} +function mic(a,b,c){a.i=0;a.e=0;if(b==c){return}lic(a,b,c);kic(a,b,c)} +function dB(a,b){var c;c=a.q.getHours();a.q.setFullYear(b+nje);YA(a,c)} +function dC(d,a,b){if(b){var c=b.ee();d.a[a]=c(b)}else{delete d.a[a]}} +function vB(d,a,b){if(b){var c=b.ee();b=c(b)}else{b=undefined}d.a[a]=b} +function pCb(a){if(a<0){throw vbb(new Feb('Negative array size: '+a))}} +function VKd(a){if(!a.n){$Kd(a);a.n=new JMd(a,j5,a);_Kd(a)}return a.n} +function Fqb(a){sCb(a.a=0&&a.a[c]===b[c];c--);return c<0} +function Ucc(a,b){Occ();var c;c=a.j.g-b.j.g;if(c!=0){return c}return 0} +function Dtb(a,b){uCb(b);if(a.a!=null){return Itb(b.Kb(a.a))}return ztb} +function Gx(a){var b;if(a){return new Bsb(a)}b=new zsb;Jq(b,a);return b} +function GAb(a,b){var c;return b.b.Kb(SAb(a,b.c.Ee(),(c=new TBb(b),c)))} +function Hub(a){zub();Eub(this,Tbb(xbb(Obb(a,24),nke)),Tbb(xbb(a,nke)))} +function REb(){REb=ccb;QEb=as((MEb(),OC(GC(aN,1),Kie,428,0,[LEb,KEb])))} +function ZEb(){ZEb=ccb;YEb=as((UEb(),OC(GC(bN,1),Kie,427,0,[SEb,TEb])))} +function aSb(){aSb=ccb;_Rb=as((XRb(),OC(GC(gP,1),Kie,424,0,[VRb,WRb])))} +function D5b(){D5b=ccb;C5b=as((y5b(),OC(GC(ZR,1),Kie,511,0,[x5b,w5b])))} +function Cqc(){Cqc=ccb;Bqc=as((xqc(),OC(GC(JW,1),Kie,419,0,[vqc,wqc])))} +function erc(){erc=ccb;drc=as((_qc(),OC(GC(MW,1),Kie,479,0,[$qc,Zqc])))} +function eBc(){eBc=ccb;dBc=as((_Ac(),OC(GC(fX,1),Kie,376,0,[$Ac,ZAc])))} +function GAc(){GAc=ccb;FAc=as((BAc(),OC(GC(cX,1),Kie,421,0,[zAc,AAc])))} +function Npc(){Npc=ccb;Mpc=as((Ipc(),OC(GC(FW,1),Kie,422,0,[Gpc,Hpc])))} +function rsc(){rsc=ccb;qsc=as((msc(),OC(GC(SW,1),Kie,420,0,[ksc,lsc])))} +function MOc(){MOc=ccb;LOc=as((HOc(),OC(GC(DZ,1),Kie,520,0,[GOc,FOc])))} +function ZIc(){ZIc=ccb;YIc=as((UIc(),OC(GC(mY,1),Kie,523,0,[TIc,SIc])))} +function bMc(){bMc=ccb;aMc=as((YLc(),OC(GC(fZ,1),Kie,516,0,[XLc,WLc])))} +function jMc(){jMc=ccb;iMc=as((eMc(),OC(GC(gZ,1),Kie,515,0,[cMc,dMc])))} +function KQc(){KQc=ccb;JQc=as((FQc(),OC(GC(YZ,1),Kie,455,0,[DQc,EQc])))} +function dUc(){dUc=ccb;cUc=as(($Tc(),OC(GC(F$,1),Kie,425,0,[ZTc,YTc])))} +function XUc(){XUc=ccb;WUc=as((PUc(),OC(GC(K$,1),Kie,495,0,[NUc,OUc])))} +function XTc(){XTc=ccb;WTc=as((STc(),OC(GC(E$,1),Kie,480,0,[QTc,RTc])))} +function lWc(){lWc=ccb;kWc=as((fWc(),OC(GC(X$,1),Kie,426,0,[dWc,eWc])))} +function i1c(){i1c=ccb;h1c=as((a1c(),OC(GC(X_,1),Kie,429,0,[_0c,$0c])))} +function H_c(){H_c=ccb;G_c=as((C_c(),OC(GC(P_,1),Kie,430,0,[B_c,A_c])))} +function UIc(){UIc=ccb;TIc=new VIc('UPPER',0);SIc=new VIc('LOWER',1)} +function Lqd(a,b){var c;c=new eC;Spd(c,'x',b.a);Spd(c,'y',b.b);Qpd(a,c)} +function Oqd(a,b){var c;c=new eC;Spd(c,'x',b.a);Spd(c,'y',b.b);Qpd(a,c)} +function Jic(a,b){var c,d;d=false;do{c=Mic(a,b);d=d|c}while(c);return d} +function zHc(a,b){var c,d;c=b;d=0;while(c>0){d+=a.a[c];c-=c&-c}return d} +function Cfd(a,b){var c;c=b;while(c){O6c(a,-c.i,-c.j);c=Xod(c)}return a} +function reb(a,b){var c,d;uCb(b);for(d=a.Kc();d.Ob();){c=d.Pb();b.td(c)}} +function me(a,b){var c;c=b.cd();return new Wo(c,a.e.pc(c,BD(b.dd(),14)))} +function Gsb(a,b,c,d){var e;e=new jtb;e.c=b;e.b=c;e.a=d;d.b=c.a=e;++a.b} +function Nkb(a,b,c){var d;d=(tCb(b,a.c.length),a.c[b]);a.c[b]=c;return d} +function lFd(a,b,c){return BD(b==null?jrb(a.f,null,c):Drb(a.g,b,c),281)} +function fRb(a){return !!a.c&&!!a.d?oRb(a.c)+'->'+oRb(a.d):'e_'+FCb(a)} +function FAb(a,b){return (Uzb(a),WAb(new YAb(a,new qBb(b,a.a)))).sd(DAb)} +function tUb(){qUb();return OC(GC(zP,1),Kie,356,0,[lUb,mUb,nUb,oUb,pUb])} +function _cd(){Ucd();return OC(GC(F1,1),bne,61,0,[Scd,Acd,zcd,Rcd,Tcd])} +function Dz(b){Az();return function(){return Ez(b,this,arguments);var a}} +function sz(){if(Date.now){return Date.now()}return (new Date).getTime()} +function OZb(a){if(!a.c||!a.d){return false}return !!a.c.i&&a.c.i==a.d.i} +function pv(a){if(!a.c.Sb()){throw vbb(new utb)}a.a=true;return a.c.Ub()} +function ko(a){a.i=0;Alb(a.b,null);Alb(a.c,null);a.a=null;a.e=null;++a.g} +function ycb(a){wcb.call(this,a==null?Xhe:fcb(a),JD(a,78)?BD(a,78):null)} +function PYb(a){MYb();yXb(this);this.a=new Psb;NYb(this,a);Dsb(this.a,a)} +function jYb(){Ckb(this);this.b=new f7c(Pje,Pje);this.a=new f7c(Qje,Qje)} +function rAb(a,b){this.c=0;this.b=b;jvb.call(this,a,17493);this.a=this.c} +function wyb(a){oyb();if(lyb){return}this.c=a;this.e=true;this.a=new Rkb} +function oyb(){oyb=ccb;lyb=true;jyb=false;kyb=false;nyb=false;myb=false} +function C3c(a,b){if(JD(b,149)){return dfb(a.c,BD(b,149).c)}return false} +function zUc(a,b){var c;c=0;!!a&&(c+=a.f.a/2);!!b&&(c+=b.f.a/2);return c} +function j4c(a,b){var c;c=BD(Wrb(a.d,b),23);return c?c:BD(Wrb(a.e,b),23)} +function Lzd(a){this.b=a;Fyd.call(this,a);this.a=BD(Ajd(this.b.a,4),126)} +function Uzd(a){this.b=a;$yd.call(this,a);this.a=BD(Ajd(this.b.a,4),126)} +function $Kd(a){if(!a.t){a.t=new YMd(a);vtd(new c0d(a),0,a.t)}return a.t} +function kad(){ead();return OC(GC(t1,1),Kie,103,0,[cad,bad,aad,_9c,dad])} +function Wbd(){Tbd();return OC(GC(C1,1),Kie,249,0,[Qbd,Sbd,Obd,Pbd,Rbd])} +function Q5c(){N5c();return OC(GC(e1,1),Kie,175,0,[L5c,K5c,I5c,M5c,J5c])} +function Q_c(){N_c();return OC(GC(Q_,1),Kie,316,0,[I_c,J_c,M_c,K_c,L_c])} +function _zc(){Vzc();return OC(GC(_W,1),Kie,315,0,[Uzc,Rzc,Szc,Qzc,Tzc])} +function sqc(){mqc();return OC(GC(IW,1),Kie,335,0,[iqc,hqc,kqc,lqc,jqc])} +function n$c(){k$c();return OC(GC(y_,1),Kie,355,0,[g$c,f$c,i$c,h$c,j$c])} +function _jc(){Xjc();return OC(GC(uV,1),Kie,363,0,[Tjc,Vjc,Wjc,Ujc,Sjc])} +function Ftc(){Ctc();return OC(GC(TW,1),Kie,163,0,[Btc,xtc,ytc,ztc,Atc])} +function T0d(){T0d=ccb;var a,b;R0d=(LFd(),b=new MPd,b);S0d=(a=new OJd,a)} +function yUd(a){var b;if(!a.c){b=a.r;JD(b,88)&&(a.c=BD(b,26))}return a.c} +function zc(a){a.e=3;a.d=a.Yb();if(a.e!=2){a.e=0;return true}return false} +function RC(a){var b,c,d;b=a&Eje;c=a>>22&Eje;d=a<0?Fje:0;return TC(b,c,d)} +function uy(a){var b,c,d,e;for(c=a,d=0,e=c.length;d0?ihb(a,b):lhb(a,-b)} +function Rgb(a,b){if(b==0||a.e==0){return a}return b>0?lhb(a,b):ihb(a,-b)} +function Rr(a){if(Qr(a)){a.c=a.a;return a.a.Pb()}else{throw vbb(new utb)}} +function Yac(a){var b,c;b=a.c.i;c=a.d.i;return b.k==(j0b(),e0b)&&c.k==e0b} +function kZb(a){var b;b=new UZb;tNb(b,a);yNb(b,(Nyc(),jxc),null);return b} +function hid(a,b,c){var d;return d=a.Yg(b),d>=0?a._g(d,c,true):sid(a,b,c)} +function uHb(a,b,c,d){var e;for(e=0;eb){throw vbb(new qcb(Jb(a,b,'index')))}return a} +function zhb(a,b,c,d){var e;e=KC(WD,oje,25,b,15,1);Ahb(e,a,b,c,d);return e} +function _A(a,b){var c;c=a.q.getHours()+(b/60|0);a.q.setMinutes(b);YA(a,c)} +function A$c(a,b){return $wnd.Math.min(S6c(b.a,a.d.d.c),S6c(b.b,a.d.d.c))} +function Thb(a,b){return ND(b)?b==null?krb(a.f,null):Erb(a.g,b):krb(a.f,b)} +function b1b(a){this.c=a;this.a=new olb(this.c.a);this.b=new olb(this.c.b)} +function kRb(){this.e=new Rkb;this.c=new Rkb;this.d=new Rkb;this.b=new Rkb} +function MFb(){this.g=new PFb;this.b=new PFb;this.a=new Rkb;this.k=new Rkb} +function Gjc(a,b,c){this.a=a;this.c=b;this.d=c;Ekb(b.e,this);Ekb(c.b,this)} +function wBb(a,b){fvb.call(this,b.rd(),b.qd()&-6);uCb(a);this.a=a;this.b=b} +function CBb(a,b){jvb.call(this,b.rd(),b.qd()&-6);uCb(a);this.a=a;this.b=b} +function IBb(a,b){nvb.call(this,b.rd(),b.qd()&-6);uCb(a);this.a=a;this.b=b} +function BQc(a,b,c){this.a=a;this.b=b;this.c=c;Ekb(a.t,this);Ekb(b.i,this)} +function SRc(){this.b=new Psb;this.a=new Psb;this.b=new Psb;this.a=new Psb} +function g6c(){g6c=ccb;f6c=new Lsd('org.eclipse.elk.labels.labelManager')} +function Vac(){Vac=ccb;Uac=new Msd('separateLayerConnections',(gbc(),fbc))} +function HOc(){HOc=ccb;GOc=new IOc('REGULAR',0);FOc=new IOc('CRITICAL',1)} +function _Ac(){_Ac=ccb;$Ac=new aBc('STACKED',0);ZAc=new aBc('SEQUENCED',1)} +function C_c(){C_c=ccb;B_c=new D_c('FIXED',0);A_c=new D_c('CENTER_NODE',1)} +function PHc(a,b){var c;c=VHc(a,b);a.b=new BHc(c.c.length);return OHc(a,c)} +function KAd(a,b,c){var d;++a.e;--a.f;d=BD(a.d[b].$c(c),133);return d.dd()} +function JJd(a){var b;if(!a.a){b=a.r;JD(b,148)&&(a.a=BD(b,148))}return a.a} +function poc(a){if(a.a){if(a.e){return poc(a.e)}}else{return a}return null} +function ODc(a,b){if(a.pb.p){return -1}return 0} +function pvb(a,b){uCb(b);if(a.c=0,'Initial capacity must not be negative')} +function lHb(){lHb=ccb;kHb=as((gHb(),OC(GC(pN,1),Kie,232,0,[dHb,eHb,fHb])))} +function SHb(){SHb=ccb;RHb=as((NHb(),OC(GC(sN,1),Kie,461,0,[LHb,KHb,MHb])))} +function JIb(){JIb=ccb;IIb=as((EIb(),OC(GC(zN,1),Kie,462,0,[DIb,CIb,BIb])))} +function Kyb(){Kyb=ccb;Jyb=as((Fyb(),OC(GC(xL,1),Kie,132,0,[Cyb,Dyb,Eyb])))} +function DTb(){DTb=ccb;CTb=as((yTb(),OC(GC(oP,1),Kie,379,0,[wTb,vTb,xTb])))} +function WXb(){WXb=ccb;VXb=as((RXb(),OC(GC(hQ,1),Kie,423,0,[QXb,PXb,OXb])))} +function Zpc(){Zpc=ccb;Ypc=as((Rpc(),OC(GC(GW,1),Kie,314,0,[Ppc,Opc,Qpc])))} +function gqc(){gqc=ccb;fqc=as((bqc(),OC(GC(HW,1),Kie,337,0,[$pc,aqc,_pc])))} +function Lqc(){Lqc=ccb;Kqc=as((Gqc(),OC(GC(KW,1),Kie,450,0,[Eqc,Dqc,Fqc])))} +function Kkc(){Kkc=ccb;Jkc=as((Fkc(),OC(GC(vV,1),Kie,361,0,[Ekc,Dkc,Ckc])))} +function jsc(){jsc=ccb;isc=as((esc(),OC(GC(RW,1),Kie,303,0,[csc,dsc,bsc])))} +function asc(){asc=ccb;_rc=as((Xrc(),OC(GC(QW,1),Kie,292,0,[Vrc,Wrc,Urc])))} +function Dzc(){Dzc=ccb;Czc=as((xzc(),OC(GC(ZW,1),Kie,378,0,[uzc,vzc,wzc])))} +function YAc(){YAc=ccb;XAc=as((TAc(),OC(GC(eX,1),Kie,375,0,[QAc,RAc,SAc])))} +function yAc(){yAc=ccb;xAc=as((tAc(),OC(GC(bX,1),Kie,339,0,[rAc,qAc,sAc])))} +function PAc(){PAc=ccb;OAc=as((KAc(),OC(GC(dX,1),Kie,452,0,[JAc,HAc,IAc])))} +function QBc(){QBc=ccb;PBc=as((LBc(),OC(GC(jX,1),Kie,377,0,[JBc,KBc,IBc])))} +function yBc(){yBc=ccb;xBc=as((tBc(),OC(GC(hX,1),Kie,336,0,[qBc,rBc,sBc])))} +function HBc(){HBc=ccb;GBc=as((CBc(),OC(GC(iX,1),Kie,338,0,[BBc,zBc,ABc])))} +function wGc(){wGc=ccb;vGc=as((rGc(),OC(GC(PX,1),Kie,454,0,[oGc,pGc,qGc])))} +function zVc(){zVc=ccb;yVc=as((tVc(),OC(GC(O$,1),Kie,442,0,[sVc,qVc,rVc])))} +function vWc(){vWc=ccb;uWc=as((pWc(),OC(GC(Y$,1),Kie,380,0,[mWc,nWc,oWc])))} +function EYc(){EYc=ccb;DYc=as((zYc(),OC(GC(q_,1),Kie,381,0,[xYc,yYc,wYc])))} +function yXc(){yXc=ccb;xXc=as((sXc(),OC(GC(b_,1),Kie,293,0,[qXc,rXc,pXc])))} +function b_c(){b_c=ccb;a_c=as((Y$c(),OC(GC(J_,1),Kie,437,0,[V$c,W$c,X$c])))} +function mbd(){mbd=ccb;lbd=as((hbd(),OC(GC(z1,1),Kie,334,0,[fbd,ebd,gbd])))} +function vad(){vad=ccb;uad=as((qad(),OC(GC(u1,1),Kie,272,0,[nad,oad,pad])))} +function icd(){dcd();return OC(GC(D1,1),Kie,98,0,[ccd,bcd,acd,Zbd,_bd,$bd])} +function ikd(a,b){return !a.o&&(a.o=new dId((Thd(),Qhd),S2,a,0)),qAd(a.o,b)} +function NAd(a){!a.g&&(a.g=new JCd);!a.g.d&&(a.g.d=new MBd(a));return a.g.d} +function yAd(a){!a.g&&(a.g=new JCd);!a.g.a&&(a.g.a=new SBd(a));return a.g.a} +function EAd(a){!a.g&&(a.g=new JCd);!a.g.b&&(a.g.b=new GBd(a));return a.g.b} +function FAd(a){!a.g&&(a.g=new JCd);!a.g.c&&(a.g.c=new iCd(a));return a.g.c} +function A2d(a,b,c){var d,e;e=new p4d(b,a);for(d=0;dc||b=0?a._g(c,true,true):sid(a,b,true)} +function s6b(a,b){return Kdb(Edb(ED(vNb(a,(wtc(),htc)))),Edb(ED(vNb(b,htc))))} +function pUc(){pUc=ccb;oUc=b3c(b3c(g3c(new j3c,(yRc(),vRc)),(qSc(),pSc)),lSc)} +function IHc(a,b,c){var d;d=SHc(a,b,c);a.b=new BHc(d.c.length);return KHc(a,d)} +function qhe(a){if(a.b<=0)throw vbb(new utb);--a.b;a.a-=a.c.c;return meb(a.a)} +function ptd(a){var b;if(!a.a){throw vbb(new vtb)}b=a.a;a.a=Xod(a.a);return b} +function dBb(a){while(!a.a){if(!HBb(a.c,new hBb(a))){return false}}return true} +function vr(a){var b;Qb(a);if(JD(a,198)){b=BD(a,198);return b}return new wr(a)} +function r3c(a){p3c();BD(a.We((Y9c(),x9c)),174).Fc((rcd(),ocd));a.Ye(w9c,null)} +function p3c(){p3c=ccb;m3c=new v3c;o3c=new x3c;n3c=mn((Y9c(),w9c),m3c,b9c,o3c)} +function fWc(){fWc=ccb;dWc=new hWc('LEAF_NUMBER',0);eWc=new hWc('NODE_SIZE',1)} +function UMc(a,b,c){a.a=b;a.c=c;a.b.a.$b();Osb(a.d);a.e.a.c=KC(SI,Uhe,1,0,5,1)} +function yHc(a){a.a=KC(WD,oje,25,a.b+1,15,1);a.c=KC(WD,oje,25,a.b,15,1);a.d=0} +function MWb(a,b){if(a.a.ue(b.d,a.b)>0){Ekb(a.c,new dWb(b.c,b.d,a.d));a.b=b.d}} +function nud(a,b){if(a.g==null||b>=a.i)throw vbb(new $zd(b,a.i));return a.g[b]} +function pOd(a,b,c){Itd(a,c);if(c!=null&&!a.wj(c)){throw vbb(new tcb)}return c} +function KLd(a){var b;if(a.Ek()){for(b=a.i-1;b>=0;--b){qud(a,b)}}return wud(a)} +function Bwb(a){var b,c;if(!a.b){return null}c=a.b;while(b=c.a[0]){c=b}return c} +function ulb(a,b){var c,d;pCb(b);return c=(d=a.slice(0,b),PC(d,a)),c.length=b,c} +function Klb(a,b,c,d){var e;d=(ipb(),!d?fpb:d);e=a.slice(b,c);Llb(e,a,b,c,-b,d)} +function bid(a,b,c,d,e){return b<0?sid(a,c,d):BD(c,66).Nj().Pj(a,a.yh(),b,d,e)} +function hZd(a){if(JD(a,172)){return ''+BD(a,172).a}return a==null?null:fcb(a)} +function iZd(a){if(JD(a,172)){return ''+BD(a,172).a}return a==null?null:fcb(a)} +function nDb(a,b){if(b.a){throw vbb(new hz(Hke))}Qqb(a.a,b);b.a=a;!a.j&&(a.j=b)} +function qBb(a,b){nvb.call(this,b.rd(),b.qd()&-16449);uCb(a);this.a=a;this.c=b} +function Ti(a,b){var c,d;d=b/a.c.Hd().gc()|0;c=b%a.c.Hd().gc();return Mi(a,d,c)} +function NHb(){NHb=ccb;LHb=new OHb(jle,0);KHb=new OHb(gle,1);MHb=new OHb(kle,2)} +function lxb(){lxb=ccb;hxb=new mxb('All',0);ixb=new rxb;jxb=new txb;kxb=new wxb} +function zxb(){zxb=ccb;yxb=as((lxb(),OC(GC(iL,1),Kie,297,0,[hxb,ixb,jxb,kxb])))} +function uWb(){uWb=ccb;tWb=as((lWb(),OC(GC(SP,1),Kie,405,0,[hWb,kWb,iWb,jWb])))} +function ALb(){ALb=ccb;zLb=as((vLb(),OC(GC(PN,1),Kie,406,0,[uLb,rLb,sLb,tLb])))} +function WMb(){WMb=ccb;VMb=as((RMb(),OC(GC(jO,1),Kie,323,0,[OMb,NMb,PMb,QMb])))} +function WOb(){WOb=ccb;VOb=as((ROb(),OC(GC(CO,1),Kie,394,0,[OOb,NOb,POb,QOb])))} +function GRc(){GRc=ccb;FRc=as((yRc(),OC(GC(h$,1),Kie,393,0,[uRc,vRc,wRc,xRc])))} +function mbc(){mbc=ccb;lbc=as((gbc(),OC(GC(VS,1),Kie,360,0,[fbc,dbc,ebc,cbc])))} +function oXc(){oXc=ccb;nXc=as((iXc(),OC(GC(a_,1),Kie,340,0,[hXc,fXc,gXc,eXc])))} +function Fjc(){Fjc=ccb;Ejc=as((Ajc(),OC(GC(mV,1),Kie,411,0,[wjc,xjc,yjc,zjc])))} +function Pzc(){Pzc=ccb;Ozc=as((Izc(),OC(GC($W,1),Kie,197,0,[Gzc,Hzc,Fzc,Ezc])))} +function ugd(){ugd=ccb;tgd=as((pgd(),OC(GC(k2,1),Kie,396,0,[mgd,ngd,lgd,ogd])))} +function xbd(){xbd=ccb;wbd=as((rbd(),OC(GC(A1,1),Kie,285,0,[qbd,nbd,obd,pbd])))} +function Fad(){Fad=ccb;Ead=as((Aad(),OC(GC(v1,1),Kie,218,0,[zad,xad,wad,yad])))} +function Ied(){Ied=ccb;Hed=as((Ded(),OC(GC(O1,1),Kie,311,0,[Ced,zed,Bed,Aed])))} +function ydd(){ydd=ccb;xdd=as((tdd(),OC(GC(I1,1),Kie,374,0,[rdd,sdd,qdd,pdd])))} +function A9d(){A9d=ccb;Smd();x9d=Pje;w9d=Qje;z9d=new Ndb(Pje);y9d=new Ndb(Qje)} +function _qc(){_qc=ccb;$qc=new arc(ane,0);Zqc=new arc('IMPROVE_STRAIGHTNESS',1)} +function eIc(a,b){FHc();return Ekb(a,new vgd(b,meb(b.e.c.length+b.g.c.length)))} +function gIc(a,b){FHc();return Ekb(a,new vgd(b,meb(b.e.c.length+b.g.c.length)))} +function PC(a,b){HC(b)!=10&&OC(rb(b),b.hm,b.__elementTypeId$,HC(b),a);return a} +function Lkb(a,b){var c;c=Jkb(a,b,0);if(c==-1){return false}Kkb(a,c);return true} +function Zrb(a,b){var c;c=BD(Thb(a.e,b),387);if(c){jsb(c);return c.e}return null} +function Jbb(a){var b;if(Fbb(a)){b=0-a;if(!isNaN(b)){return b}}return zbb(hD(a))} +function Jkb(a,b,c){for(;c=0?fid(a,c,true,true):sid(a,b,true)} +function vgc(a,b){qgc();var c,d;c=ugc(a);d=ugc(b);return !!c&&!!d&&!omb(c.k,d.k)} +function Gqd(a,b){dld(a,b==null||Ldb((uCb(b),b))||isNaN((uCb(b),b))?0:(uCb(b),b))} +function Hqd(a,b){eld(a,b==null||Ldb((uCb(b),b))||isNaN((uCb(b),b))?0:(uCb(b),b))} +function Iqd(a,b){cld(a,b==null||Ldb((uCb(b),b))||isNaN((uCb(b),b))?0:(uCb(b),b))} +function Jqd(a,b){ald(a,b==null||Ldb((uCb(b),b))||isNaN((uCb(b),b))?0:(uCb(b),b))} +function agd(a){(!this.q?(mmb(),mmb(),kmb):this.q).Ac(!a.q?(mmb(),mmb(),kmb):a.q)} +function S2d(a,b){return JD(b,99)&&(BD(b,18).Bb&Tje)!=0?new s4d(b,a):new p4d(b,a)} +function U2d(a,b){return JD(b,99)&&(BD(b,18).Bb&Tje)!=0?new s4d(b,a):new p4d(b,a)} +function INb(a,b){HNb=new tOb;FNb=b;GNb=a;BD(GNb.b,65);KNb(GNb,HNb,null);JNb(GNb)} +function uud(a,b,c){var d;d=a.g[b];mud(a,b,a.oi(b,c));a.gi(b,c,d);a.ci();return d} +function Ftd(a,b){var c;c=a.Xc(b);if(c>=0){a.$c(c);return true}else{return false}} +function YId(a){var b;if(a.d!=a.r){b=wId(a);a.e=!!b&&b.Cj()==Bve;a.d=b}return a.e} +function fr(a,b){var c;Qb(a);Qb(b);c=false;while(b.Ob()){c=c|a.Fc(b.Pb())}return c} +function Wrb(a,b){var c;c=BD(Ohb(a.e,b),387);if(c){Yrb(a,c);return c.e}return null} +function UA(a){var b,c;b=a/60|0;c=a%60;if(c==0){return ''+b}return ''+b+':'+(''+c)} +function LAb(a,b){var c,d;Uzb(a);d=new IBb(b,a.a);c=new fBb(d);return new YAb(a,c)} +function tB(d,a){var b=d.a[a];var c=(rC(),qC)[typeof b];return c?c(b):xC(typeof b)} +function yzc(a){switch(a.g){case 0:return Ohe;case 1:return -1;default:return 0;}} +function oD(a){if(eD(a,(wD(),vD))<0){return -aD(hD(a))}return a.l+a.m*Hje+a.h*Ije} +function HC(a){return a.__elementTypeCategory$==null?10:a.__elementTypeCategory$} +function dub(a){var b;b=a.b.c.length==0?null:Ikb(a.b,0);b!=null&&fub(a,0);return b} +function uA(a,b){while(b[0]=0){++b[0]}} +function sgb(a,b){this.e=b;this.a=vgb(a);this.a<54?(this.f=Sbb(a)):(this.c=ghb(a))} +function vge(a,b,c,d){wfe();xfe.call(this,26);this.c=a;this.a=b;this.d=c;this.b=d} +function EA(a,b,c){var d,e;d=10;for(e=0;ea.a[d]&&(d=c)}return d} +function fic(a,b){var c;c=Jy(a.e.c,b.e.c);if(c==0){return Kdb(a.e.d,b.e.d)}return c} +function Ogb(a,b){if(b.e==0){return Ggb}if(a.e==0){return Ggb}return Dhb(),Ehb(a,b)} +function nCb(a,b){if(!a){throw vbb(new Wdb(DCb('Enum constant undefined: %s',b)))}} +function AWb(){AWb=ccb;xWb=new XWb;yWb=new _Wb;vWb=new dXb;wWb=new hXb;zWb=new lXb} +function UEb(){UEb=ccb;SEb=new VEb('BY_SIZE',0);TEb=new VEb('BY_SIZE_AND_SHAPE',1)} +function XRb(){XRb=ccb;VRb=new YRb('EADES',0);WRb=new YRb('FRUCHTERMAN_REINGOLD',1)} +function xqc(){xqc=ccb;vqc=new yqc('READING_DIRECTION',0);wqc=new yqc('ROTATION',1)} +function uqc(){uqc=ccb;tqc=as((mqc(),OC(GC(IW,1),Kie,335,0,[iqc,hqc,kqc,lqc,jqc])))} +function bAc(){bAc=ccb;aAc=as((Vzc(),OC(GC(_W,1),Kie,315,0,[Uzc,Rzc,Szc,Qzc,Tzc])))} +function bkc(){bkc=ccb;akc=as((Xjc(),OC(GC(uV,1),Kie,363,0,[Tjc,Vjc,Wjc,Ujc,Sjc])))} +function Htc(){Htc=ccb;Gtc=as((Ctc(),OC(GC(TW,1),Kie,163,0,[Btc,xtc,ytc,ztc,Atc])))} +function S_c(){S_c=ccb;R_c=as((N_c(),OC(GC(Q_,1),Kie,316,0,[I_c,J_c,M_c,K_c,L_c])))} +function S5c(){S5c=ccb;R5c=as((N5c(),OC(GC(e1,1),Kie,175,0,[L5c,K5c,I5c,M5c,J5c])))} +function p$c(){p$c=ccb;o$c=as((k$c(),OC(GC(y_,1),Kie,355,0,[g$c,f$c,i$c,h$c,j$c])))} +function vUb(){vUb=ccb;uUb=as((qUb(),OC(GC(zP,1),Kie,356,0,[lUb,mUb,nUb,oUb,pUb])))} +function mad(){mad=ccb;lad=as((ead(),OC(GC(t1,1),Kie,103,0,[cad,bad,aad,_9c,dad])))} +function Ybd(){Ybd=ccb;Xbd=as((Tbd(),OC(GC(C1,1),Kie,249,0,[Qbd,Sbd,Obd,Pbd,Rbd])))} +function cdd(){cdd=ccb;bdd=as((Ucd(),OC(GC(F1,1),bne,61,0,[Scd,Acd,zcd,Rcd,Tcd])))} +function _1c(a,b){var c;c=BD(Ohb(a.a,b),134);if(!c){c=new zNb;Rhb(a.a,b,c)}return c} +function hoc(a){var b;b=BD(vNb(a,(wtc(),usc)),305);if(b){return b.a==a}return false} +function ioc(a){var b;b=BD(vNb(a,(wtc(),usc)),305);if(b){return b.i==a}return false} +function Jub(a,b){uCb(b);Iub(a);if(a.d.Ob()){b.td(a.d.Pb());return true}return false} +function Oy(a){if(ybb(a,Ohe)>0){return Ohe}if(ybb(a,Rie)<0){return Rie}return Tbb(a)} +function Cv(a){if(a<3){Xj(a,Hie);return a+1}if(a=0&&b=-0.01&&a.a<=ple&&(a.a=0);a.b>=-0.01&&a.b<=ple&&(a.b=0);return a} +function sfb(a,b){return b==(ntb(),ntb(),mtb)?a.toLocaleLowerCase():a.toLowerCase()} +function idb(a){return ((a.i&2)!=0?'interface ':(a.i&1)!=0?'':'class ')+(fdb(a),a.o)} +function Pnd(a){var b,c;c=(b=new SSd,b);wtd((!a.q&&(a.q=new cUd(n5,a,11,10)),a.q),c)} +function Pdd(a,b){var c;c=b>0?b-1:b;return Vdd(Wdd(Xdd(Ydd(new Zdd,c),a.n),a.j),a.k)} +function u2d(a,b,c,d){var e;a.j=-1;Qxd(a,I2d(a,b,c),(Q6d(),e=BD(b,66).Mj(),e.Ok(d)))} +function VWb(a){this.g=a;this.f=new Rkb;this.a=$wnd.Math.min(this.g.c.c,this.g.d.c)} +function mDb(a){this.b=new Rkb;this.a=new Rkb;this.c=new Rkb;this.d=new Rkb;this.e=a} +function Cnc(a,b){this.a=new Lqb;this.e=new Lqb;this.b=(xzc(),wzc);this.c=a;this.b=b} +function bIb(a,b,c){$Gb.call(this);THb(this);this.a=a;this.c=c;this.b=b.d;this.f=b.e} +function yd(a){this.d=a;this.c=a.c.vc().Kc();this.b=null;this.a=null;this.e=(hs(),gs)} +function zud(a){if(a<0){throw vbb(new Wdb('Illegal Capacity: '+a))}this.g=this.ri(a)} +function avb(a,b){if(0>a||a>b){throw vbb(new scb('fromIndex: 0, toIndex: '+a+oke+b))}} +function Gs(a){var b;if(a.a==a.b.a){throw vbb(new utb)}b=a.a;a.c=b;a.a=a.a.e;return b} +function Zsb(a){var b;yCb(!!a.c);b=a.c.a;Nsb(a.d,a.c);a.b==a.c?(a.b=b):--a.a;a.c=null} +function VAb(a,b){var c;Uzb(a);c=new lBb(a,a.a.rd(),a.a.qd()|4,b);return new YAb(a,c)} +function ke(a,b){var c,d;c=BD(Hv(a.d,b),14);if(!c){return null}d=b;return a.e.pc(d,c)} +function xac(a,b){var c,d;for(d=a.Kc();d.Ob();){c=BD(d.Pb(),70);yNb(c,(wtc(),Ssc),b)}} +function t9b(a){var b;b=Edb(ED(vNb(a,(Nyc(),Zwc))));if(b<0){b=0;yNb(a,Zwc,b)}return b} +function ifc(a,b,c){var d;d=$wnd.Math.max(0,a.b/2-0.5);cfc(c,d,1);Ekb(b,new rfc(c,d))} +function NMc(a,b,c){var d;d=a.a.e[BD(b.a,10).p]-a.a.e[BD(c.a,10).p];return QD(Eeb(d))} +function iZb(a,b,c,d,e,f){var g;g=kZb(d);QZb(g,e);RZb(g,f);Rc(a.a,d,new BZb(g,b,c.f))} +function Bid(a,b){var c;c=YKd(a.Tg(),b);if(!c){throw vbb(new Wdb(ite+b+lte))}return c} +function ntd(a,b){var c;c=a;while(Xod(c)){c=Xod(c);if(c==b){return true}}return false} +function Uw(a,b){var c,d,e;d=b.a.cd();c=BD(b.a.dd(),14).gc();for(e=0;e0){a.a/=b;a.b/=b}return a} +function bKd(a){var b;if(a.w){return a.w}else{b=cKd(a);!!b&&!b.kh()&&(a.w=b);return b}} +function gZd(a){var b;if(a==null){return null}else{b=BD(a,190);return Umd(b,b.length)}} +function qud(a,b){if(a.g==null||b>=a.i)throw vbb(new $zd(b,a.i));return a.li(b,a.g[b])} +function Mmc(a){var b,c;b=a.a.d.j;c=a.c.d.j;while(b!=c){rqb(a.b,b);b=Xcd(b)}rqb(a.b,b)} +function Jmc(a){var b;for(b=0;b=14&&b<=16)));return a} +function dcb(a,b,c){var d=function(){return a.apply(d,arguments)};b.apply(d,c);return d} +function TLc(a,b,c){var d,e;d=b;do{e=Edb(a.p[d.p])+c;a.p[d.p]=e;d=a.a[d.p]}while(d!=b)} +function NQd(a,b){var c,d;d=a.a;c=OQd(a,b,null);d!=b&&!a.e&&(c=QQd(a,b,c));!!c&&c.Fi()} +function ADb(a,b){return Iy(),My(Qie),$wnd.Math.abs(a-b)<=Qie||a==b||isNaN(a)&&isNaN(b)} +function Ky(a,b){Iy();My(Qie);return $wnd.Math.abs(a-b)<=Qie||a==b||isNaN(a)&&isNaN(b)} +function Akc(a,b){gkc();return beb(a.b.c.length-a.e.c.length,b.b.c.length-b.e.c.length)} +function oo(a,b){return Kv(uo(a,b,Tbb(Ibb(Eie,keb(Tbb(Ibb(b==null?0:tb(b),Fie)),15)))))} +function o0b(){o0b=ccb;n0b=as((j0b(),OC(GC(NQ,1),Kie,267,0,[h0b,g0b,e0b,i0b,f0b,d0b])))} +function n8c(){n8c=ccb;m8c=as((i8c(),OC(GC(r1,1),Kie,291,0,[h8c,g8c,f8c,d8c,c8c,e8c])))} +function K7c(){K7c=ccb;J7c=as((F7c(),OC(GC(o1,1),Kie,248,0,[z7c,C7c,D7c,E7c,A7c,B7c])))} +function Fpc(){Fpc=ccb;Epc=as((Apc(),OC(GC(EW,1),Kie,227,0,[wpc,ypc,vpc,xpc,zpc,upc])))} +function Drc(){Drc=ccb;Crc=as((yrc(),OC(GC(OW,1),Kie,275,0,[wrc,trc,xrc,vrc,urc,rrc])))} +function qrc(){qrc=ccb;prc=as((lrc(),OC(GC(NW,1),Kie,274,0,[irc,hrc,krc,grc,jrc,frc])))} +function tzc(){tzc=ccb;szc=as((lzc(),OC(GC(YW,1),Kie,313,0,[jzc,hzc,fzc,gzc,kzc,izc])))} +function Yqc(){Yqc=ccb;Xqc=as((Sqc(),OC(GC(LW,1),Kie,276,0,[Nqc,Mqc,Pqc,Oqc,Rqc,Qqc])))} +function wSc(){wSc=ccb;vSc=as((qSc(),OC(GC(t$,1),Kie,327,0,[pSc,lSc,nSc,mSc,oSc,kSc])))} +function ycd(){ycd=ccb;xcd=as((rcd(),OC(GC(E1,1),Kie,273,0,[pcd,ncd,ocd,mcd,lcd,qcd])))} +function Rad(){Rad=ccb;Qad=as((Mad(),OC(GC(w1,1),Kie,312,0,[Kad,Iad,Lad,Gad,Jad,Had])))} +function Lbd(){Hbd();return OC(GC(B1,1),Kie,93,0,[zbd,ybd,Bbd,Gbd,Fbd,Ebd,Cbd,Dbd,Abd])} +function vkd(a,b){var c;c=a.a;a.a=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,0,c,a.a))} +function wkd(a,b){var c;c=a.b;a.b=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,1,c,a.b))} +function hmd(a,b){var c;c=a.b;a.b=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,3,c,a.b))} +function ald(a,b){var c;c=a.f;a.f=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,3,c,a.f))} +function cld(a,b){var c;c=a.g;a.g=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,4,c,a.g))} +function dld(a,b){var c;c=a.i;a.i=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,5,c,a.i))} +function eld(a,b){var c;c=a.j;a.j=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,6,c,a.j))} +function omd(a,b){var c;c=a.j;a.j=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,1,c,a.j))} +function imd(a,b){var c;c=a.c;a.c=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,4,c,a.c))} +function pmd(a,b){var c;c=a.k;a.k=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,2,c,a.k))} +function qQd(a,b){var c;c=a.d;a.d=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new mSd(a,2,c,a.d))} +function AId(a,b){var c;c=a.s;a.s=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new mSd(a,4,c,a.s))} +function DId(a,b){var c;c=a.t;a.t=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new mSd(a,5,c,a.t))} +function _Jd(a,b){var c;c=a.F;a.F=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,5,c,b))} +function izd(a,b){var c;c=BD(Ohb((pEd(),oEd),a),55);return c?c.xj(b):KC(SI,Uhe,1,b,5,1)} +function Xpd(a,b){var c,d;c=b in a.a;if(c){d=aC(a,b).he();if(d){return d.a}}return null} +function ftd(a,b){var c,d,e;c=(d=(Fhd(),e=new Jod,e),!!b&&God(d,b),d);Hod(c,a);return c} +function LLd(a,b,c){Itd(a,c);if(!a.Bk()&&c!=null&&!a.wj(c)){throw vbb(new tcb)}return c} +function Xdd(a,b){a.n=b;if(a.n){a.f=new Rkb;a.e=new Rkb}else{a.f=null;a.e=null}return a} +function ndb(a,b,c,d,e,f){var g;g=ldb(a,b);zdb(c,g);g.i=e?8:0;g.f=d;g.e=e;g.g=f;return g} +function rSd(a,b,c,d,e){this.d=b;this.k=d;this.f=e;this.o=-1;this.p=1;this.c=a;this.a=c} +function tSd(a,b,c,d,e){this.d=b;this.k=d;this.f=e;this.o=-1;this.p=2;this.c=a;this.a=c} +function BSd(a,b,c,d,e){this.d=b;this.k=d;this.f=e;this.o=-1;this.p=6;this.c=a;this.a=c} +function GSd(a,b,c,d,e){this.d=b;this.k=d;this.f=e;this.o=-1;this.p=7;this.c=a;this.a=c} +function xSd(a,b,c,d,e){this.d=b;this.j=d;this.e=e;this.o=-1;this.p=4;this.c=a;this.a=c} +function rDb(a,b){var c,d,e,f;for(d=b,e=0,f=d.length;e=0);if(ekb(a.d,a.c)<0){a.a=a.a-1&a.d.a.length-1;a.b=a.d.c}a.c=-1} +function pgb(a){if(a.a<54){return a.f<0?-1:a.f>0?1:0}return (!a.c&&(a.c=fhb(a.f)),a.c).e} +function My(a){if(!(a>=0)){throw vbb(new Wdb('tolerance ('+a+') must be >= 0'))}return a} +function n4c(){if(!f4c){f4c=new m4c;l4c(f4c,OC(GC(C0,1),Uhe,130,0,[new Z9c]))}return f4c} +function KAc(){KAc=ccb;JAc=new LAc(ole,0);HAc=new LAc('INPUT',1);IAc=new LAc('OUTPUT',2)} +function bqc(){bqc=ccb;$pc=new cqc('ARD',0);aqc=new cqc('MSD',1);_pc=new cqc('MANUAL',2)} +function rGc(){rGc=ccb;oGc=new sGc('BARYCENTER',0);pGc=new sGc(Bne,1);qGc=new sGc(Cne,2)} +function ztd(a,b){var c;c=a.gc();if(b<0||b>c)throw vbb(new Cyd(b,c));return new czd(a,b)} +function JAd(a,b){var c;if(JD(b,42)){return a.c.Mc(b)}else{c=qAd(a,b);LAd(a,b);return c}} +function $nd(a,b,c){yId(a,b);pnd(a,c);AId(a,0);DId(a,1);CId(a,true);BId(a,true);return a} +function Xj(a,b){if(a<0){throw vbb(new Wdb(b+' cannot be negative but was: '+a))}return a} +function Bt(a,b){var c,d;for(c=0,d=a.gc();c0){return BD(Ikb(c.a,d-1),10)}return null} +function Lkd(a,b){var c;c=a.k;a.k=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,2,c,a.k))} +function kmd(a,b){var c;c=a.f;a.f=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,8,c,a.f))} +function lmd(a,b){var c;c=a.i;a.i=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,7,c,a.i))} +function Hod(a,b){var c;c=a.a;a.a=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,8,c,a.a))} +function zpd(a,b){var c;c=a.b;a.b=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,0,c,a.b))} +function UUd(a,b){var c;c=a.b;a.b=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,0,c,a.b))} +function VUd(a,b){var c;c=a.c;a.c=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,1,c,a.c))} +function Apd(a,b){var c;c=a.c;a.c=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,1,c,a.c))} +function pQd(a,b){var c;c=a.c;a.c=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,4,c,a.c))} +function PHd(a,b){var c;c=a.d;a.d=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,1,c,a.d))} +function jKd(a,b){var c;c=a.D;a.D=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,2,c,a.D))} +function Rdd(a,b){if(a.r>0&&a.c0&&a.g!=0&&Rdd(a.i,b/a.r*a.i.d)}} +function dge(a,b,c){var d;a.b=b;a.a=c;d=(a.a&512)==512?new hee:new ude;a.c=ode(d,a.b,a.a)} +function g3d(a,b){return T6d(a.e,b)?(Q6d(),YId(b)?new R7d(b,a):new f7d(b,a)):new c8d(b,a)} +function _o(a,b){return Fv(vo(a.a,b,Tbb(Ibb(Eie,keb(Tbb(Ibb(b==null?0:tb(b),Fie)),15)))))} +function Nyb(a,b,c){return Ayb(a,new Kzb(b),new Mzb,new Ozb(c),OC(GC(xL,1),Kie,132,0,[]))} +function pAb(a){var b,c;if(0>a){return new yAb}b=a+1;c=new rAb(b,a);return new vAb(null,c)} +function umb(a,b){mmb();var c;c=new Mqb(1);ND(a)?Shb(c,a,b):jrb(c.f,a,b);return new iob(c)} +function aMb(a,b){var c,d;c=a.o+a.p;d=b.o+b.p;if(cb){b<<=1;return b>0?b:Iie}return b} +function xc(a){Ub(a.e!=3);switch(a.e){case 2:return false;case 0:return true;}return zc(a)} +function T6c(a,b){var c;if(JD(b,8)){c=BD(b,8);return a.a==c.a&&a.b==c.b}else{return false}} +function _Mb(a,b,c){var d,e,f;f=b>>5;e=b&31;d=xbb(Pbb(a.n[c][f],Tbb(Nbb(e,1))),3);return d} +function IAd(a,b){var c,d;for(d=b.vc().Kc();d.Ob();){c=BD(d.Pb(),42);HAd(a,c.cd(),c.dd())}} +function N1c(a,b){var c;c=new tOb;BD(b.b,65);BD(b.b,65);BD(b.b,65);Hkb(b.a,new T1c(a,c,b))} +function DUd(a,b){var c;c=a.b;a.b=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,21,c,a.b))} +function jmd(a,b){var c;c=a.d;a.d=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,11,c,a.d))} +function _Id(a,b){var c;c=a.j;a.j=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,13,c,a.j))} +function $jb(a,b,c){var d,e,f;f=a.a.length-1;for(e=a.b,d=0;d>>31}d!=0&&(a[c]=d)} +function rmb(a,b){mmb();var c,d;d=new Rkb;for(c=0;c0){this.g=this.ri(this.i+(this.i/8|0)+1);a.Qc(this.g)}} +function u3d(a,b){k2d.call(this,D9,a,b);this.b=this;this.a=S6d(a.Tg(),XKd(this.e.Tg(),this.c))} +function Ld(a,b){var c,d;uCb(b);for(d=b.vc().Kc();d.Ob();){c=BD(d.Pb(),42);a.zc(c.cd(),c.dd())}} +function G2d(a,b,c){var d;for(d=c.Kc();d.Ob();){if(!E2d(a,b,d.Pb())){return false}}return true} +function sVd(a,b,c,d,e){var f;if(c){f=bLd(b.Tg(),a.c);e=c.gh(b,-1-(f==-1?d:f),null,e)}return e} +function tVd(a,b,c,d,e){var f;if(c){f=bLd(b.Tg(),a.c);e=c.ih(b,-1-(f==-1?d:f),null,e)}return e} +function Mgb(a){var b;if(a.b==-2){if(a.e==0){b=-1}else{for(b=0;a.a[b]==0;b++);}a.b=b}return a.b} +function Z4b(a){switch(a.g){case 2:return Ucd(),Tcd;case 4:return Ucd(),zcd;default:return a;}} +function $4b(a){switch(a.g){case 1:return Ucd(),Rcd;case 3:return Ucd(),Acd;default:return a;}} +function nkc(a){var b,c,d;return a.j==(Ucd(),Acd)&&(b=pkc(a),c=uqb(b,zcd),d=uqb(b,Tcd),d||d&&c)} +function oqb(a){var b,c;b=BD(a.e&&a.e(),9);c=BD(ZBb(b,b.length),9);return new xqb(b,c,b.length)} +function l7b(a,b){Odd(b,zne,1);UGb(TGb(new YGb((a$b(),new l$b(a,false,false,new T$b)))));Qdd(b)} +function Fcb(a,b){Bcb();return ND(a)?cfb(a,GD(b)):LD(a)?Ddb(a,ED(b)):KD(a)?Dcb(a,DD(b)):a.wd(b)} +function WZc(a,b){b.q=a;a.d=$wnd.Math.max(a.d,b.r);a.b+=b.d+(a.a.c.length==0?0:a.c);Ekb(a.a,b)} +function m6c(a,b){var c,d,e,f;e=a.c;c=a.c+a.b;f=a.d;d=a.d+a.a;return b.a>e&&b.af&&b.b1||a.Ob()){++a.a;a.g=0;b=a.i;a.Ob();return b}else{throw vbb(new utb)}} +function kNc(a){fNc();var b;if(!Lpb(eNc,a)){b=new hNc;b.a=a;Opb(eNc,a,b)}return BD(Mpb(eNc,a),635)} +function Rbb(a){var b,c,d,e;e=a;d=0;if(e<0){e+=Ije;d=Fje}c=QD(e/Hje);b=QD(e-c*Hje);return TC(b,c,d)} +function Ox(a){var b,c,d;d=0;for(c=new Gqb(a.a);c.a>22);e=a.h+b.h+(d>>22);return TC(c&Eje,d&Eje,e&Fje)} +function nD(a,b){var c,d,e;c=a.l-b.l;d=a.m-b.m+(c>>22);e=a.h-b.h+(d>>22);return TC(c&Eje,d&Eje,e&Fje)} +function bdb(a){var b;if(a<128){b=(ddb(),cdb)[a];!b&&(b=cdb[a]=new Xcb(a));return b}return new Xcb(a)} +function ubb(a){var b;if(JD(a,78)){return a}b=a&&a.__java$exception;if(!b){b=new lz(a);Sz(b)}return b} +function btd(a){if(JD(a,186)){return BD(a,118)}else if(!a){throw vbb(new Heb(gue))}else{return null}} +function Zjb(a,b){if(b==null){return false}while(a.a!=a.b){if(pb(b,vkb(a))){return true}}return false} +function kib(a){if(a.a.Ob()){return true}if(a.a!=a.d){return false}a.a=new orb(a.e.f);return a.a.Ob()} +function Gkb(a,b){var c,d;c=b.Pc();d=c.length;if(d==0){return false}bCb(a.c,a.c.length,c);return true} +function Vyb(a,b,c){var d,e;for(e=b.vc().Kc();e.Ob();){d=BD(e.Pb(),42);a.yc(d.cd(),d.dd(),c)}return a} +function yac(a,b){var c,d;for(d=new olb(a.b);d.a=0,'Negative initial capacity');mCb(b>=0,'Non-positive load factor');Uhb(this)} +function _Ed(a,b,c){if(a>=128)return false;return a<64?Kbb(xbb(Nbb(1,a),c),0):Kbb(xbb(Nbb(1,a-64),b),0)} +function bOb(a,b){if(!a||!b||a==b){return false}return Jy(a.b.c,b.b.c+b.b.b)<0&&Jy(b.b.c,a.b.c+a.b.b)<0} +function I4b(a){var b,c,d;c=a.n;d=a.o;b=a.d;return new J6c(c.a-b.b,c.b-b.d,d.a+(b.b+b.c),d.b+(b.d+b.a))} +function $ic(a){var b,c,d,e;for(c=a.a,d=0,e=c.length;dd)throw vbb(new Cyd(b,d));a.hi()&&(c=Dtd(a,c));return a.Vh(b,c)} +function xNb(a,b,c){return c==null?(!a.q&&(a.q=new Lqb),Thb(a.q,b)):(!a.q&&(a.q=new Lqb),Rhb(a.q,b,c)),a} +function yNb(a,b,c){c==null?(!a.q&&(a.q=new Lqb),Thb(a.q,b)):(!a.q&&(a.q=new Lqb),Rhb(a.q,b,c));return a} +function TQb(a){var b,c;c=new kRb;tNb(c,a);yNb(c,(HSb(),FSb),a);b=new Lqb;VQb(a,c,b);UQb(a,c,b);return c} +function j6c(a){i6c();var b,c,d;c=KC(m1,nie,8,2,0,1);d=0;for(b=0;b<2;b++){d+=0.5;c[b]=r6c(d,a)}return c} +function Mic(a,b){var c,d,e,f;c=false;d=a.a[b].length;for(f=0;f>=1);return b}} +function $C(a){var b,c;c=heb(a.h);if(c==32){b=heb(a.m);return b==32?heb(a.l)+32:b+20-10}else{return c-12}} +function bkb(a){var b;b=a.a[a.b];if(b==null){return null}NC(a.a,a.b,null);a.b=a.b+1&a.a.length-1;return b} +function EDc(a){var b,c;b=a.t-a.k[a.o.p]*a.d+a.j[a.o.p]>a.f;c=a.u+a.e[a.o.p]*a.d>a.f*a.s*a.d;return b||c} +function Iwb(a,b,c){var d,e;d=new exb(b,c);e=new fxb;a.b=Gwb(a,a.b,d,e);e.b||++a.c;a.b.b=false;return e.d} +function djc(a,b,c){var d,e,f,g;g=CHc(b,c);f=0;for(e=g.Kc();e.Ob();){d=BD(e.Pb(),11);Rhb(a.c,d,meb(f++))}} +function xVb(a){var b,c;for(c=new olb(a.a.b);c.ac&&(c=a[b])}return c} +function SHc(a,b,c){var d;d=new Rkb;UHc(a,b,d,(Ucd(),zcd),true,false);UHc(a,c,d,Tcd,false,false);return d} +function crd(a,b,c){var d,e,f,g;f=null;g=b;e=Ypd(g,'labels');d=new Hrd(a,c);f=(Dqd(d.a,d.b,e),e);return f} +function j1d(a,b,c,d){var e;e=r1d(a,b,c,d);if(!e){e=i1d(a,c,d);if(!!e&&!e1d(a,b,e)){return null}}return e} +function m1d(a,b,c,d){var e;e=s1d(a,b,c,d);if(!e){e=l1d(a,c,d);if(!!e&&!e1d(a,b,e)){return null}}return e} +function Xb(a,b){var c;for(c=0;c1||b>=0&&a.b<3} +function w7c(a){var b,c,d;b=new s7c;for(d=Jsb(a,0);d.b!=d.d.c;){c=BD(Xsb(d),8);St(b,0,new g7c(c))}return b} +function qVb(a){var b,c;for(c=new olb(a.a.b);c.ad?1:0} +function NYb(a,b){if(OYb(a,b)){Rc(a.b,BD(vNb(b,(wtc(),Esc)),21),b);Dsb(a.a,b);return true}else{return false}} +function d3b(a){var b,c;b=BD(vNb(a,(wtc(),gtc)),10);if(b){c=b.c;Lkb(c.a,b);c.a.c.length==0&&Lkb(Q_b(b).b,c)}} +function syb(a){if(lyb){return KC(qL,tke,572,0,0,1)}return BD(Qkb(a.a,KC(qL,tke,572,a.a.c.length,0,1)),842)} +function mn(a,b,c,d){Vm();return new wx(OC(GC(CK,1),zie,42,0,[(Wj(a,b),new Wo(a,b)),(Wj(c,d),new Wo(c,d))]))} +function Dnd(a,b,c){var d,e;e=(d=new SSd,d);$nd(e,b,c);wtd((!a.q&&(a.q=new cUd(n5,a,11,10)),a.q),e);return e} +function Zmd(a){var b,c,d,e;e=icb(Rmd,a);c=e.length;d=KC(ZI,nie,2,c,6,1);for(b=0;b=a.b.c.length){return}aub(a,2*b+1);c=2*b+2;c=0&&a[d]===b[d];d--);return d<0?0:Gbb(xbb(a[d],Yje),xbb(b[d],Yje))?-1:1} +function UFc(a,b){var c,d;for(d=Jsb(a,0);d.b!=d.d.c;){c=BD(Xsb(d),214);if(c.e.length>0){b.td(c);c.i&&_Fc(c)}}} +function nzd(a,b){var c,d;d=BD(Ajd(a.a,4),126);c=KC($3,hve,415,b,0,1);d!=null&&$fb(d,0,c,0,d.length);return c} +function JEd(a,b){var c;c=new NEd((a.f&256)!=0,a.i,a.a,a.d,(a.f&16)!=0,a.j,a.g,b);a.e!=null||(c.c=a);return c} +function Dc(a,b){var c,d;for(d=a.Zb().Cc().Kc();d.Ob();){c=BD(d.Pb(),14);if(c.Hc(b)){return true}}return false} +function oNb(a,b,c,d,e){var f,g;for(g=c;g<=e;g++){for(f=b;f<=d;f++){if(YMb(a,f,g)){return true}}}return false} +function Tt(a,b,c){var d,e,f,g;uCb(c);g=false;f=a.Zc(b);for(e=c.Kc();e.Ob();){d=e.Pb();f.Rb(d);g=true}return g} +function Dv(a,b){var c;if(a===b){return true}else if(JD(b,83)){c=BD(b,83);return Ax(Wm(a),c.vc())}return false} +function Nhb(a,b,c){var d,e;for(e=c.Kc();e.Ob();){d=BD(e.Pb(),42);if(a.re(b,d.dd())){return true}}return false} +function Hic(a,b,c){if(!a.d[b.p][c.p]){Gic(a,b,c);a.d[b.p][c.p]=true;a.d[c.p][b.p]=true}return a.a[b.p][c.p]} +function Itd(a,b){if(!a.ai()&&b==null){throw vbb(new Wdb("The 'no null' constraint is violated"))}return b} +function $Jd(a,b){if(a.D==null&&a.B!=null){a.D=a.B;a.B=null}jKd(a,b==null?null:(uCb(b),b));!!a.C&&a.yk(null)} +function XHc(a,b){var c;if(!a||a==b||!wNb(b,(wtc(),Psc))){return false}c=BD(vNb(b,(wtc(),Psc)),10);return c!=a} +function b4d(a){switch(a.i){case 2:{return true}case 1:{return false}case -1:{++a.c}default:{return a.pl()}}} +function c4d(a){switch(a.i){case -2:{return true}case -1:{return false}case 1:{--a.c}default:{return a.ql()}}} +function Xdb(a){Zy.call(this,'The given string does not match the expected format for individual spacings.',a)} +function pgd(){pgd=ccb;mgd=new qgd('ELK',0);ngd=new qgd('JSON',1);lgd=new qgd('DOT',2);ogd=new qgd('SVG',3)} +function pWc(){pWc=ccb;mWc=new rWc(ane,0);nWc=new rWc('RADIAL_COMPACTION',1);oWc=new rWc('WEDGE_COMPACTION',2)} +function Fyb(){Fyb=ccb;Cyb=new Gyb('CONCURRENT',0);Dyb=new Gyb('IDENTITY_FINISH',1);Eyb=new Gyb('UNORDERED',2)} +function nPb(){nPb=ccb;kPb=(cPb(),bPb);jPb=new Nsd(Tle,kPb);iPb=new Lsd(Ule);lPb=new Lsd(Vle);mPb=new Lsd(Wle)} +function Occ(){Occ=ccb;Mcc=new Zcc;Ncc=new _cc;Lcc=new bdc;Kcc=new fdc;Jcc=new jdc;Icc=(uCb(Jcc),new bpb)} +function tBc(){tBc=ccb;qBc=new uBc('CONSERVATIVE',0);rBc=new uBc('CONSERVATIVE_SOFT',1);sBc=new uBc('SLOPPY',2)} +function Zad(){Zad=ccb;Xad=new q0b(15);Wad=new Osd((Y9c(),f9c),Xad);Yad=C9c;Sad=s8c;Tad=Y8c;Vad=_8c;Uad=$8c} +function o7c(a,b,c){var d,e,f;d=new Psb;for(f=Jsb(c,0);f.b!=f.d.c;){e=BD(Xsb(f),8);Dsb(d,new g7c(e))}Tt(a,b,d)} +function r7c(a){var b,c,d;b=0;d=KC(m1,nie,8,a.b,0,1);c=Jsb(a,0);while(c.b!=c.d.c){d[b++]=BD(Xsb(c),8)}return d} +function $Pd(a){var b;b=(!a.a&&(a.a=new cUd(g5,a,9,5)),a.a);if(b.i!=0){return nQd(BD(qud(b,0),678))}return null} +function Ly(a,b){var c;c=wbb(a,b);if(Gbb(Vbb(a,b),0)|Ebb(Vbb(a,c),0)){return c}return wbb(rie,Vbb(Pbb(c,63),1))} +function Yyc(a,b){var c;c=Ksd((dzc(),bzc))!=null&&b.wg()!=null?Edb(ED(b.wg()))/Edb(ED(Ksd(bzc))):1;Rhb(a.b,b,c)} +function le(a,b){var c,d;c=BD(a.d.Bc(b),14);if(!c){return null}d=a.e.hc();d.Gc(c);a.e.d-=c.gc();c.$b();return d} +function AHc(a,b){var c,d;d=a.c[b];if(d==0){return}a.c[b]=0;a.d-=d;c=b+1;while(c0){return _vb(b-1,a.a.c.length),Kkb(a.a,b-1)}else{throw vbb(new Jpb)}} +function C2c(a,b,c){if(b<0){throw vbb(new qcb(ese+b))}if(bb){throw vbb(new Wdb(xke+a+yke+b))}if(a<0||b>c){throw vbb(new scb(xke+a+zke+b+oke+c))}} +function j5c(a){if(!a.a||(a.a.i&8)==0){throw vbb(new Zdb('Enumeration class expected for layout option '+a.f))}} +function vud(a){var b;++a.j;if(a.i==0){a.g=null}else if(a.iRqe?a-c>Rqe:c-a>Rqe} +function pHb(a,b){if(!a){return 0}if(b&&!a.j){return 0}if(JD(a,124)){if(BD(a,124).a.b==0){return 0}}return a.Re()} +function qHb(a,b){if(!a){return 0}if(b&&!a.k){return 0}if(JD(a,124)){if(BD(a,124).a.a==0){return 0}}return a.Se()} +function fhb(a){Hgb();if(a<0){if(a!=-1){return new Tgb(-1,-a)}return Bgb}else return a<=10?Dgb[QD(a)]:new Tgb(1,a)} +function xC(a){rC();throw vbb(new MB("Unexpected typeof result '"+a+"'; please report this bug to the GWT team"))} +function lz(a){jz();Py(this);Ry(this);this.e=a;Sy(this,a);this.g=a==null?Xhe:fcb(a);this.a='';this.b=a;this.a=''} +function F$c(){this.a=new G$c;this.f=new I$c(this);this.b=new K$c(this);this.i=new M$c(this);this.e=new O$c(this)} +function ss(){rs.call(this,new _rb(Cv(16)));Xj(2,mie);this.b=2;this.a=new Ms(null,null,0,null);As(this.a,this.a)} +function xzc(){xzc=ccb;uzc=new zzc('DUMMY_NODE_OVER',0);vzc=new zzc('DUMMY_NODE_UNDER',1);wzc=new zzc('EQUAL',2)} +function LUb(){LUb=ccb;JUb=Fx(OC(GC(t1,1),Kie,103,0,[(ead(),aad),bad]));KUb=Fx(OC(GC(t1,1),Kie,103,0,[dad,_9c]))} +function VQc(a){return (Ucd(),Lcd).Hc(a.j)?Edb(ED(vNb(a,(wtc(),qtc)))):l7c(OC(GC(m1,1),nie,8,0,[a.i.n,a.n,a.a])).b} +function DOb(a){var b,c,d,e;d=a.b.a;for(c=d.a.ec().Kc();c.Ob();){b=BD(c.Pb(),561);e=new MPb(b,a.e,a.f);Ekb(a.g,e)}} +function yId(a,b){var c,d,e;d=a.nk(b,null);e=null;if(b){e=(LFd(),c=new UQd,c);NQd(e,a.r)}d=xId(a,e,d);!!d&&d.Fi()} +function VFc(a,b){var c,d;d=Cub(a.d,1)!=0;c=true;while(c){c=false;c=b.c.Tf(b.e,d);c=c|dGc(a,b,d,false);d=!d}$Fc(a)} +function wZc(a,b){var c,d,e;d=false;c=b.q.d;if(b.de){$Zc(b.q,e);d=c!=b.q.d}}return d} +function PVc(a,b){var c,d,e,f,g,h,i,j;i=b.i;j=b.j;d=a.f;e=d.i;f=d.j;g=i-e;h=j-f;c=$wnd.Math.sqrt(g*g+h*h);return c} +function Rnd(a,b){var c,d;d=jid(a);if(!d){!And&&(And=new lUd);c=(IEd(),PEd(b));d=new s0d(c);wtd(d.Vk(),a)}return d} +function Sc(a,b){var c,d;c=BD(a.c.Bc(b),14);if(!c){return a.jc()}d=a.hc();d.Gc(c);a.d-=c.gc();c.$b();return a.mc(d)} +function j7c(a,b){var c;for(c=0;c=a.c.b:a.a<=a.c.b)){throw vbb(new utb)}b=a.a;a.a+=a.c.c;++a.b;return meb(b)} +function BWb(a){var b;b=new VWb(a);rXb(a.a,zWb,new amb(OC(GC(bQ,1),Uhe,369,0,[b])));!!b.d&&Ekb(b.f,b.d);return b.f} +function Z1b(a){var b;b=new q_b(a.a);tNb(b,a);yNb(b,(wtc(),$sc),a);b.o.a=a.g;b.o.b=a.f;b.n.a=a.i;b.n.b=a.j;return b} +function A9b(a,b,c,d){var e,f;for(f=a.Kc();f.Ob();){e=BD(f.Pb(),70);e.n.a=b.a+(d.a-e.o.a)/2;e.n.b=b.b;b.b+=e.o.b+c}} +function UDb(a,b,c){var d,e;for(e=b.a.a.ec().Kc();e.Ob();){d=BD(e.Pb(),57);if(VDb(a,d,c)){return true}}return false} +function JDc(a){var b,c;for(c=new olb(a.r);c.a=0?b:-b;while(d>0){if(d%2==0){c*=c;d=d/2|0}else{e*=c;d-=1}}return b<0?1/e:e} +function y6c(a,b){var c,d,e;e=1;c=a;d=b>=0?b:-b;while(d>0){if(d%2==0){c*=c;d=d/2|0}else{e*=c;d-=1}}return b<0?1/e:e} +function sAd(a){var b,c,d,e;if(a!=null){for(c=0;c0){c=BD(Ikb(a.a,a.a.c.length-1),570);if(NYb(c,b)){return}}Ekb(a.a,new PYb(b))} +function $gc(a){Hgc();var b,c;b=a.d.c-a.e.c;c=BD(a.g,145);Hkb(c.b,new shc(b));Hkb(c.c,new uhc(b));reb(c.i,new whc(b))} +function gic(a){var b;b=new Ufb;b.a+='VerticalSegment ';Pfb(b,a.e);b.a+=' ';Qfb(b,Eb(new Gb,new olb(a.k)));return b.a} +function u4c(a){var b;b=BD(Wrb(a.c.c,''),229);if(!b){b=new W3c(d4c(c4c(new e4c,''),'Other'));Xrb(a.c.c,'',b)}return b} +function qnd(a){var b;if((a.Db&64)!=0)return Eid(a);b=new Jfb(Eid(a));b.a+=' (name: ';Efb(b,a.zb);b.a+=')';return b.a} +function Jnd(a,b,c){var d,e;e=a.sb;a.sb=b;if((a.Db&4)!=0&&(a.Db&1)==0){d=new nSd(a,1,4,e,b);!c?(c=d):c.Ei(d)}return c} +function _ic(a,b){var c,d,e;c=0;for(e=V_b(a,b).Kc();e.Ob();){d=BD(e.Pb(),11);c+=vNb(d,(wtc(),gtc))!=null?1:0}return c} +function vPc(a,b,c){var d,e,f;d=0;for(f=Jsb(a,0);f.b!=f.d.c;){e=Edb(ED(Xsb(f)));if(e>c){break}else e>=b&&++d}return d} +function RTd(a,b,c){var d,e;d=new pSd(a.e,3,13,null,(e=b.c,e?e:(jGd(),YFd)),HLd(a,b),false);!c?(c=d):c.Ei(d);return c} +function STd(a,b,c){var d,e;d=new pSd(a.e,4,13,(e=b.c,e?e:(jGd(),YFd)),null,HLd(a,b),false);!c?(c=d):c.Ei(d);return c} +function zId(a,b,c){var d,e;e=a.r;a.r=b;if((a.Db&4)!=0&&(a.Db&1)==0){d=new nSd(a,1,8,e,a.r);!c?(c=d):c.Ei(d)}return c} +function o1d(a,b){var c,d;c=BD(b,676);d=c.vk();!d&&c.wk(d=JD(b,88)?new C1d(a,BD(b,26)):new O1d(a,BD(b,148)));return d} +function kud(a,b,c){var d;a.qi(a.i+1);d=a.oi(b,c);b!=a.i&&$fb(a.g,b,a.g,b+1,a.i-b);NC(a.g,b,d);++a.i;a.bi(b,c);a.ci()} +function vwb(a,b){var c;if(b.a){c=b.a.a.length;!a.a?(a.a=new Wfb(a.d)):Qfb(a.a,a.b);Ofb(a.a,b.a,b.d.length,c)}return a} +function __d(a,b){var c,d,e,f;b.vi(a.a);f=BD(Ajd(a.a,8),1936);if(f!=null){for(c=f,d=0,e=c.length;dc){throw vbb(new qcb(xke+a+zke+b+', size: '+c))}if(a>b){throw vbb(new Wdb(xke+a+yke+b))}} +function eid(a,b,c){if(b<0){vid(a,c)}else{if(!c.Ij()){throw vbb(new Wdb(ite+c.ne()+jte))}BD(c,66).Nj().Vj(a,a.yh(),b)}} +function Jlb(a,b,c,d,e,f,g,h){var i;i=c;while(f=d||b=65&&a<=70){return a-65+10}if(a>=97&&a<=102){return a-97+10}if(a>=48&&a<=57){return a-48}return 0} +function QHd(a){var b;if((a.Db&64)!=0)return Eid(a);b=new Jfb(Eid(a));b.a+=' (source: ';Efb(b,a.d);b.a+=')';return b.a} +function OQd(a,b,c){var d,e;e=a.a;a.a=b;if((a.Db&4)!=0&&(a.Db&1)==0){d=new nSd(a,1,5,e,a.a);!c?(c=d):Qwd(c,d)}return c} +function BId(a,b){var c;c=(a.Bb&256)!=0;b?(a.Bb|=256):(a.Bb&=-257);(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new qSd(a,1,2,c,b))} +function eLd(a,b){var c;c=(a.Bb&256)!=0;b?(a.Bb|=256):(a.Bb&=-257);(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new qSd(a,1,8,c,b))} +function LPd(a,b){var c;c=(a.Bb&256)!=0;b?(a.Bb|=256):(a.Bb&=-257);(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new qSd(a,1,8,c,b))} +function CId(a,b){var c;c=(a.Bb&512)!=0;b?(a.Bb|=512):(a.Bb&=-513);(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new qSd(a,1,3,c,b))} +function fLd(a,b){var c;c=(a.Bb&512)!=0;b?(a.Bb|=512):(a.Bb&=-513);(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new qSd(a,1,9,c,b))} +function N7d(a,b){var c;if(a.b==-1&&!!a.a){c=a.a.Gj();a.b=!c?bLd(a.c.Tg(),a.a):a.c.Xg(a.a.aj(),c)}return a.c.Og(a.b,b)} +function meb(a){var b,c;if(a>-129&&a<128){b=a+128;c=(oeb(),neb)[b];!c&&(c=neb[b]=new _db(a));return c}return new _db(a)} +function Web(a){var b,c;if(a>-129&&a<128){b=a+128;c=(Yeb(),Xeb)[b];!c&&(c=Xeb[b]=new Qeb(a));return c}return new Qeb(a)} +function L5b(a){var b,c;b=a.k;if(b==(j0b(),e0b)){c=BD(vNb(a,(wtc(),Hsc)),61);return c==(Ucd(),Acd)||c==Rcd}return false} +function i1d(a,b,c){var d,e,f;f=(e=nUd(a.b,b),e);if(f){d=BD(V1d(p1d(a,f),''),26);if(d){return r1d(a,d,b,c)}}return null} +function l1d(a,b,c){var d,e,f;f=(e=nUd(a.b,b),e);if(f){d=BD(V1d(p1d(a,f),''),26);if(d){return s1d(a,d,b,c)}}return null} +function cTd(a,b){var c,d;for(d=new Fyd(a);d.e!=d.i.gc();){c=BD(Dyd(d),138);if(PD(b)===PD(c)){return true}}return false} +function vtd(a,b,c){var d;d=a.gc();if(b>d)throw vbb(new Cyd(b,d));if(a.hi()&&a.Hc(c)){throw vbb(new Wdb(kue))}a.Xh(b,c)} +function iqd(a,b){var c;c=oo(a.i,b);if(c==null){throw vbb(new cqd('Node did not exist in input.'))}Yqd(b,c);return null} +function $hd(a,b){var c;c=YKd(a,b);if(JD(c,322)){return BD(c,34)}throw vbb(new Wdb(ite+b+"' is not a valid attribute"))} +function V2d(a,b,c){var d,e;e=JD(b,99)&&(BD(b,18).Bb&Tje)!=0?new s4d(b,a):new p4d(b,a);for(d=0;db){return 1}if(a==b){return a==0?Kdb(1/a,1/b):0}return isNaN(a)?isNaN(b)?0:1:-1} +function f4b(a,b){Odd(b,'Sort end labels',1);MAb(JAb(LAb(new YAb(null,new Kub(a.b,16)),new q4b),new s4b),new u4b);Qdd(b)} +function Wxd(a,b,c){var d,e;if(a.ej()){e=a.fj();d=sud(a,b,c);a.$i(a.Zi(7,meb(c),d,b,e));return d}else{return sud(a,b,c)}} +function vAd(a,b){var c,d,e;if(a.d==null){++a.e;--a.f}else{e=b.cd();c=b.Sh();d=(c&Ohe)%a.d.length;KAd(a,d,xAd(a,d,c,e))}} +function ZId(a,b){var c;c=(a.Bb&zte)!=0;b?(a.Bb|=zte):(a.Bb&=-1025);(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new qSd(a,1,10,c,b))} +function dJd(a,b){var c;c=(a.Bb&Rje)!=0;b?(a.Bb|=Rje):(a.Bb&=-4097);(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new qSd(a,1,12,c,b))} +function eJd(a,b){var c;c=(a.Bb&Cve)!=0;b?(a.Bb|=Cve):(a.Bb&=-8193);(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new qSd(a,1,15,c,b))} +function fJd(a,b){var c;c=(a.Bb&Dve)!=0;b?(a.Bb|=Dve):(a.Bb&=-2049);(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new qSd(a,1,11,c,b))} +function jOb(a,b){var c;c=Kdb(a.b.c,b.b.c);if(c!=0){return c}c=Kdb(a.a.a,b.a.a);if(c!=0){return c}return Kdb(a.a.b,b.a.b)} +function jqd(a,b){var c;c=Ohb(a.k,b);if(c==null){throw vbb(new cqd('Port did not exist in input.'))}Yqd(b,c);return null} +function k6d(a){var b,c;for(c=l6d(bKd(a)).Kc();c.Ob();){b=GD(c.Pb());if(Dmd(a,b)){return uFd((tFd(),sFd),b)}}return null} +function n3d(a,b){var c,d,e,f,g;g=S6d(a.e.Tg(),b);f=0;c=BD(a.g,119);for(e=0;e>10)+Uje&aje;b[1]=(a&1023)+56320&aje;return zfb(b,0,b.length)} +function a_b(a){var b,c;c=BD(vNb(a,(Nyc(),Lwc)),103);if(c==(ead(),cad)){b=Edb(ED(vNb(a,owc)));return b>=1?bad:_9c}return c} +function rec(a){switch(BD(vNb(a,(Nyc(),Swc)),218).g){case 1:return new Fmc;case 3:return new wnc;default:return new zmc;}} +function Uzb(a){if(a.c){Uzb(a.c)}else if(a.d){throw vbb(new Zdb("Stream already terminated, can't be modified or used"))}} +function Mkd(a){var b;if((a.Db&64)!=0)return Eid(a);b=new Jfb(Eid(a));b.a+=' (identifier: ';Efb(b,a.k);b.a+=')';return b.a} +function ctd(a,b,c){var d,e;d=(Fhd(),e=new xkd,e);vkd(d,b);wkd(d,c);!!a&&wtd((!a.a&&(a.a=new xMd(y2,a,5)),a.a),d);return d} +function ttb(a,b,c,d){var e,f;uCb(d);uCb(c);e=a.xc(b);f=e==null?c:Myb(BD(e,15),BD(c,14));f==null?a.Bc(b):a.zc(b,f);return f} +function pqb(a){var b,c,d,e;c=(b=BD(gdb((d=a.gm,e=d.f,e==CI?d:e)),9),new xqb(b,BD(_Bb(b,b.length),9),0));rqb(c,a);return c} +function hDc(a,b,c){var d,e;for(e=a.a.ec().Kc();e.Ob();){d=BD(e.Pb(),10);if(Be(c,BD(Ikb(b,d.p),14))){return d}}return null} +function Db(b,c,d){var e;try{Cb(b,c,d)}catch(a){a=ubb(a);if(JD(a,597)){e=a;throw vbb(new ycb(e))}else throw vbb(a)}return c} +function Qbb(a,b){var c;if(Fbb(a)&&Fbb(b)){c=a-b;if(Kje>1;a.k=c-1>>1} +function Gub(){zub();var a,b,c;c=yub+++Date.now();a=QD($wnd.Math.floor(c*lke))&nke;b=QD(c-a*mke);this.a=a^1502;this.b=b^kke} +function O_b(a){var b,c,d;b=new Rkb;for(d=new olb(a.j);d.a3.4028234663852886E38){return Pje}else if(b<-3.4028234663852886E38){return Qje}return b} +function aeb(a){a-=a>>1&1431655765;a=(a>>2&858993459)+(a&858993459);a=(a>>4)+a&252645135;a+=a>>8;a+=a>>16;return a&63} +function Ev(a){var b,c,d,e;b=new cq(a.Hd().gc());e=0;for(d=vr(a.Hd().Kc());d.Ob();){c=d.Pb();bq(b,c,meb(e++))}return fn(b.a)} +function Uyb(a,b){var c,d,e;e=new Lqb;for(d=b.vc().Kc();d.Ob();){c=BD(d.Pb(),42);Rhb(e,c.cd(),Yyb(a,BD(c.dd(),15)))}return e} +function EZc(a,b){a.n.c.length==0&&Ekb(a.n,new VZc(a.s,a.t,a.i));Ekb(a.b,b);QZc(BD(Ikb(a.n,a.n.c.length-1),211),b);GZc(a,b)} +function LFb(a){if(a.c!=a.b.b||a.i!=a.g.b){a.a.c=KC(SI,Uhe,1,0,5,1);Gkb(a.a,a.b);Gkb(a.a,a.g);a.c=a.b.b;a.i=a.g.b}return a.a} +function Ycc(a,b){var c,d,e;e=0;for(d=BD(b.Kb(a),20).Kc();d.Ob();){c=BD(d.Pb(),17);Ccb(DD(vNb(c,(wtc(),ltc))))||++e}return e} +function efc(a,b){var c,d,e;d=tgc(b);e=Edb(ED(pBc(d,(Nyc(),lyc))));c=$wnd.Math.max(0,e/2-0.5);cfc(b,c,1);Ekb(a,new Dfc(b,c))} +function Ctc(){Ctc=ccb;Btc=new Dtc(ane,0);xtc=new Dtc('FIRST',1);ytc=new Dtc(Gne,2);ztc=new Dtc('LAST',3);Atc=new Dtc(Hne,4)} +function Aad(){Aad=ccb;zad=new Bad(ole,0);xad=new Bad('POLYLINE',1);wad=new Bad('ORTHOGONAL',2);yad=new Bad('SPLINES',3)} +function zYc(){zYc=ccb;xYc=new AYc('ASPECT_RATIO_DRIVEN',0);yYc=new AYc('MAX_SCALE_DRIVEN',1);wYc=new AYc('AREA_DRIVEN',2)} +function Y$c(){Y$c=ccb;V$c=new Z$c('P1_STRUCTURE',0);W$c=new Z$c('P2_PROCESSING_ORDER',1);X$c=new Z$c('P3_EXECUTION',2)} +function tVc(){tVc=ccb;sVc=new uVc('OVERLAP_REMOVAL',0);qVc=new uVc('COMPACTION',1);rVc=new uVc('GRAPH_SIZE_CALCULATION',2)} +function Jy(a,b){Iy();return My(Qie),$wnd.Math.abs(a-b)<=Qie||a==b||isNaN(a)&&isNaN(b)?0:ab?1:Ny(isNaN(a),isNaN(b))} +function yOc(a,b){var c,d;c=Jsb(a,0);while(c.b!=c.d.c){d=Gdb(ED(Xsb(c)));if(d==b){return}else if(d>b){Ysb(c);break}}Vsb(c,b)} +function t4c(a,b){var c,d,e,f,g;c=b.f;Xrb(a.c.d,c,b);if(b.g!=null){for(e=b.g,f=0,g=e.length;fb&&d.ue(a[f-1],a[f])>0;--f){g=a[f];NC(a,f,a[f-1]);NC(a,f-1,g)}}} +function did(a,b,c,d){if(b<0){uid(a,c,d)}else{if(!c.Ij()){throw vbb(new Wdb(ite+c.ne()+jte))}BD(c,66).Nj().Tj(a,a.yh(),b,d)}} +function xFb(a,b){if(b==a.d){return a.e}else if(b==a.e){return a.d}else{throw vbb(new Wdb('Node '+b+' not part of edge '+a))}} +function iEb(a,b){switch(b.g){case 2:return a.b;case 1:return a.c;case 4:return a.d;case 3:return a.a;default:return false;}} +function GVb(a,b){switch(b.g){case 2:return a.b;case 1:return a.c;case 4:return a.d;case 3:return a.a;default:return false;}} +function Xkd(a,b,c,d){switch(b){case 3:return a.f;case 4:return a.g;case 5:return a.i;case 6:return a.j;}return Ekd(a,b,c,d)} +function Ljc(a){if(a.k!=(j0b(),h0b)){return false}return FAb(new YAb(null,new Lub(new Sr(ur(U_b(a).a.Kc(),new Sq)))),new Mjc)} +function MEd(a){if(a.e==null){return a}else !a.c&&(a.c=new NEd((a.f&256)!=0,a.i,a.a,a.d,(a.f&16)!=0,a.j,a.g,null));return a.c} +function VC(a,b){if(a.h==Gje&&a.m==0&&a.l==0){b&&(QC=TC(0,0,0));return SC((wD(),uD))}b&&(QC=TC(a.l,a.m,a.h));return TC(0,0,0)} +function fcb(a){var b;if(Array.isArray(a)&&a.im===gcb){return hdb(rb(a))+'@'+(b=tb(a)>>>0,b.toString(16))}return a.toString()} +function Rpb(a){var b;this.a=(b=BD(a.e&&a.e(),9),new xqb(b,BD(_Bb(b,b.length),9),0));this.b=KC(SI,Uhe,1,this.a.a.length,5,1)} +function _Ob(a){var b,c,d;this.a=new zsb;for(d=new olb(a);d.a0&&(BCb(b-1,a.length),a.charCodeAt(b-1)==58)&&!OEd(a,CEd,DEd)} +function OEd(a,b,c){var d,e;for(d=0,e=a.length;d=e){return b.c+c}}return b.c+b.b.gc()} +function NCd(a,b){LCd();var c,d,e,f;d=KLd(a);e=b;Klb(d,0,d.length,e);for(c=0;c0){d+=e;++c}}c>1&&(d+=a.d*(c-1));return d} +function Htd(a){var b,c,d;d=new Hfb;d.a+='[';for(b=0,c=a.gc();b0&&this.b>0&&q$c(this.c,this.b,this.a)} +function ezc(a){dzc();this.c=Ou(OC(GC(h0,1),Uhe,831,0,[Uyc]));this.b=new Lqb;this.a=a;Rhb(this.b,bzc,1);Hkb(czc,new Xed(this))} +function I2c(a,b){var c;if(a.d){if(Mhb(a.b,b)){return BD(Ohb(a.b,b),51)}else{c=b.Kf();Rhb(a.b,b,c);return c}}else{return b.Kf()}} +function Kgb(a,b){var c;if(PD(a)===PD(b)){return true}if(JD(b,91)){c=BD(b,91);return a.e==c.e&&a.d==c.d&&Lgb(a,c.a)}return false} +function Zcd(a){Ucd();switch(a.g){case 4:return Acd;case 1:return zcd;case 3:return Rcd;case 2:return Tcd;default:return Scd;}} +function Ykd(a,b){switch(b){case 3:return a.f!=0;case 4:return a.g!=0;case 5:return a.i!=0;case 6:return a.j!=0;}return Hkd(a,b)} +function gWc(a){switch(a.g){case 0:return new FXc;case 1:return new IXc;default:throw vbb(new Wdb(jre+(a.f!=null?a.f:''+a.g)));}} +function QUc(a){switch(a.g){case 0:return new CXc;case 1:return new MXc;default:throw vbb(new Wdb(Dne+(a.f!=null?a.f:''+a.g)));}} +function b1c(a){switch(a.g){case 0:return new s1c;case 1:return new w1c;default:throw vbb(new Wdb(Mre+(a.f!=null?a.f:''+a.g)));}} +function qWc(a){switch(a.g){case 1:return new SVc;case 2:return new KVc;default:throw vbb(new Wdb(jre+(a.f!=null?a.f:''+a.g)));}} +function ryb(a){var b,c;if(a.b){return a.b}c=lyb?null:a.d;while(c){b=lyb?null:c.b;if(b){return b}c=lyb?null:c.d}return $xb(),Zxb} +function hhb(a){var b,c,d;if(a.e==0){return 0}b=a.d<<5;c=a.a[a.d-1];if(a.e<0){d=Mgb(a);if(d==a.d-1){--c;c=c|0}}b-=heb(c);return b} +function bhb(a){var b,c,d;if(a>5;b=a&31;d=KC(WD,oje,25,c+1,15,1);d[c]=1<3){e*=10;--f}a=(a+(e>>1))/e|0}d.i=a;return true} +function XUb(a){LUb();return Bcb(),GVb(BD(a.a,81).j,BD(a.b,103))||BD(a.a,81).d.e!=0&&GVb(BD(a.a,81).j,BD(a.b,103))?true:false} +function s3c(a){p3c();if(BD(a.We((Y9c(),b9c)),174).Hc((Idd(),Gdd))){BD(a.We(x9c),174).Fc((rcd(),qcd));BD(a.We(b9c),174).Mc(Gdd)}} +function Gxd(a,b){var c,d;if(!b){return false}else{for(c=0;c=0;--d){b=c[d];for(e=0;e>1;this.k=b-1>>1} +function r3b(a,b){Odd(b,'End label post-processing',1);MAb(JAb(LAb(new YAb(null,new Kub(a.b,16)),new w3b),new y3b),new A3b);Qdd(b)} +function NLc(a,b,c){var d,e;d=Edb(a.p[b.i.p])+Edb(a.d[b.i.p])+b.n.b+b.a.b;e=Edb(a.p[c.i.p])+Edb(a.d[c.i.p])+c.n.b+c.a.b;return e-d} +function xhb(a,b,c){var d,e;d=xbb(c,Yje);for(e=0;ybb(d,0)!=0&&e0&&(BCb(0,b.length),b.charCodeAt(0)==43)?b.substr(1):b))} +function T9d(a){var b;return a==null?null:new Ygb((b=Qge(a,true),b.length>0&&(BCb(0,b.length),b.charCodeAt(0)==43)?b.substr(1):b))} +function xud(a,b){var c;if(a.i>0){if(b.lengtha.i&&NC(b,a.i,null);return b} +function Sxd(a,b,c){var d,e,f;if(a.ej()){d=a.i;f=a.fj();kud(a,d,b);e=a.Zi(3,null,b,d,f);!c?(c=e):c.Ei(e)}else{kud(a,a.i,b)}return c} +function HMd(a,b,c){var d,e;d=new pSd(a.e,4,10,(e=b.c,JD(e,88)?BD(e,26):(jGd(),_Fd)),null,HLd(a,b),false);!c?(c=d):c.Ei(d);return c} +function GMd(a,b,c){var d,e;d=new pSd(a.e,3,10,null,(e=b.c,JD(e,88)?BD(e,26):(jGd(),_Fd)),HLd(a,b),false);!c?(c=d):c.Ei(d);return c} +function _Jb(a){$Jb();var b;b=new g7c(BD(a.e.We((Y9c(),_8c)),8));if(a.B.Hc((Idd(),Bdd))){b.a<=0&&(b.a=20);b.b<=0&&(b.b=20)}return b} +function Lzc(a){Izc();var b;(!a.q?(mmb(),mmb(),kmb):a.q)._b((Nyc(),Cxc))?(b=BD(vNb(a,Cxc),197)):(b=BD(vNb(Q_b(a),Dxc),197));return b} +function pBc(a,b){var c,d;d=null;if(wNb(a,(Nyc(),qyc))){c=BD(vNb(a,qyc),94);c.Xe(b)&&(d=c.We(b))}d==null&&(d=vNb(Q_b(a),b));return d} +function Ze(a,b){var c,d,e;if(JD(b,42)){c=BD(b,42);d=c.cd();e=Hv(a.Rc(),d);return Hb(e,c.dd())&&(e!=null||a.Rc()._b(d))}return false} +function qAd(a,b){var c,d,e;if(a.f>0){a.qj();d=b==null?0:tb(b);e=(d&Ohe)%a.d.length;c=xAd(a,e,d,b);return c!=-1}else{return false}} +function AAd(a,b){var c,d,e;if(a.f>0){a.qj();d=b==null?0:tb(b);e=(d&Ohe)%a.d.length;c=wAd(a,e,d,b);if(c){return c.dd()}}return null} +function R2d(a,b){var c,d,e,f;f=S6d(a.e.Tg(),b);c=BD(a.g,119);for(e=0;e1?Mbb(Nbb(b.a[1],32),xbb(b.a[0],Yje)):xbb(b.a[0],Yje),Sbb(Ibb(b.e,c))))} +function Hbb(a,b){var c;if(Fbb(a)&&Fbb(b)){c=a%b;if(Kje>5;b&=31;e=a.d+c+(b==0?0:1);d=KC(WD,oje,25,e,15,1);jhb(d,a.a,c,b);f=new Vgb(a.e,e,d);Jgb(f);return f} +function Ofe(a,b,c){var d,e;d=BD(Phb(Zee,b),117);e=BD(Phb($ee,b),117);if(c){Shb(Zee,a,d);Shb($ee,a,e)}else{Shb($ee,a,d);Shb(Zee,a,e)}} +function Cwb(a,b,c){var d,e,f;e=null;f=a.b;while(f){d=a.a.ue(b,f.d);if(c&&d==0){return f}if(d>=0){f=f.a[1]}else{e=f;f=f.a[0]}}return e} +function Dwb(a,b,c){var d,e,f;e=null;f=a.b;while(f){d=a.a.ue(b,f.d);if(c&&d==0){return f}if(d<=0){f=f.a[0]}else{e=f;f=f.a[1]}}return e} +function Nic(a,b,c,d){var e,f,g;e=false;if(fjc(a.f,c,d)){ijc(a.f,a.a[b][c],a.a[b][d]);f=a.a[b];g=f[d];f[d]=f[c];f[c]=g;e=true}return e} +function QHc(a,b,c,d,e){var f,g,h;g=e;while(b.b!=b.c){f=BD(fkb(b),10);h=BD(V_b(f,d).Xb(0),11);a.d[h.p]=g++;c.c[c.c.length]=h}return g} +function hBc(a,b,c){var d,e,f,g,h;g=a.k;h=b.k;d=c[g.g][h.g];e=ED(pBc(a,d));f=ED(pBc(b,d));return $wnd.Math.max((uCb(e),e),(uCb(f),f))} +function zZc(a,b,c){var d,e,f,g;d=c/a.c.length;e=0;for(g=new olb(a);g.a2000){yz=a;zz=$wnd.setTimeout(Iz,10)}}if(xz++==0){Lz((Kz(),Jz));return true}return false} +function wCc(a,b){var c,d,e;for(d=new Sr(ur(U_b(a).a.Kc(),new Sq));Qr(d);){c=BD(Rr(d),17);e=c.d.i;if(e.c==b){return false}}return true} +function Ek(b,c){var d,e;if(JD(c,245)){e=BD(c,245);try{d=b.vd(e);return d==0}catch(a){a=ubb(a);if(!JD(a,205))throw vbb(a)}}return false} +function Xz(){if(Error.stackTraceLimit>0){$wnd.Error.stackTraceLimit=Error.stackTraceLimit=64;return true}return 'stack' in new Error} +function BDb(a,b){return Iy(),Iy(),My(Qie),($wnd.Math.abs(a-b)<=Qie||a==b||isNaN(a)&&isNaN(b)?0:ab?1:Ny(isNaN(a),isNaN(b)))>0} +function DDb(a,b){return Iy(),Iy(),My(Qie),($wnd.Math.abs(a-b)<=Qie||a==b||isNaN(a)&&isNaN(b)?0:ab?1:Ny(isNaN(a),isNaN(b)))<0} +function CDb(a,b){return Iy(),Iy(),My(Qie),($wnd.Math.abs(a-b)<=Qie||a==b||isNaN(a)&&isNaN(b)?0:ab?1:Ny(isNaN(a),isNaN(b)))<=0} +function ydb(a,b){var c=0;while(!b[c]||b[c]==''){c++}var d=b[c++];for(;cWje){return c.fh()}d=c.Zg();if(!!d||c==a){break}}}return d} +function fvd(a){evd();if(JD(a,156)){return BD(Ohb(cvd,hK),288).vg(a)}if(Mhb(cvd,rb(a))){return BD(Ohb(cvd,rb(a)),288).vg(a)}return null} +function fZd(a){if(efb(kse,a)){return Bcb(),Acb}else if(efb(lse,a)){return Bcb(),zcb}else{throw vbb(new Wdb('Expecting true or false'))}} +function uDc(a,b){if(b.c==a){return b.d}else if(b.d==a){return b.c}throw vbb(new Wdb('Input edge is not connected to the input port.'))} +function Igb(a,b){if(a.e>b.e){return 1}if(a.eb.d){return a.e}if(a.d=48&&a<48+$wnd.Math.min(10,10)){return a-48}if(a>=97&&a<97){return a-97+10}if(a>=65&&a<65){return a-65+10}return -1} +function Ue(a,b){var c;if(PD(b)===PD(a)){return true}if(!JD(b,21)){return false}c=BD(b,21);if(c.gc()!=a.gc()){return false}return a.Ic(c)} +function ekb(a,b){var c,d,e,f;d=a.a.length-1;c=b-a.b&d;f=a.c-b&d;e=a.c-a.b&d;mkb(c=f){hkb(a,b);return -1}else{ikb(a,b);return 1}} +function lA(a,b){var c,d;c=(BCb(b,a.length),a.charCodeAt(b));d=b+1;while(db.e){return 1}else if(a.fb.f){return 1}return tb(a)-tb(b)} +function efb(a,b){uCb(a);if(b==null){return false}if(dfb(a,b)){return true}return a.length==b.length&&dfb(a.toLowerCase(),b.toLowerCase())} +function x6d(a,b){var c,d,e,f;for(d=0,e=b.gc();d0&&ybb(a,128)<0){b=Tbb(a)+128;c=(Ceb(),Beb)[b];!c&&(c=Beb[b]=new teb(a));return c}return new teb(a)} +function _0d(a,b){var c,d;c=b.Hh(a.a);if(c){d=GD(AAd((!c.b&&(c.b=new sId((jGd(),fGd),x6,c)),c.b),fue));if(d!=null){return d}}return b.ne()} +function a1d(a,b){var c,d;c=b.Hh(a.a);if(c){d=GD(AAd((!c.b&&(c.b=new sId((jGd(),fGd),x6,c)),c.b),fue));if(d!=null){return d}}return b.ne()} +function FMc(a,b){wMc();var c,d;for(d=new Sr(ur(O_b(a).a.Kc(),new Sq));Qr(d);){c=BD(Rr(d),17);if(c.d.i==b||c.c.i==b){return c}}return null} +function HUb(a,b,c){this.c=a;this.f=new Rkb;this.e=new d7c;this.j=new IVb;this.n=new IVb;this.b=b;this.g=new J6c(b.c,b.d,b.b,b.a);this.a=c} +function gVb(a){var b,c,d,e;this.a=new zsb;this.d=new Tqb;this.e=0;for(c=a,d=0,e=c.length;d0}else{return false}} +function q2c(a){var b;if(PD(hkd(a,(Y9c(),J8c)))===PD((hbd(),fbd))){if(!Xod(a)){jkd(a,J8c,gbd)}else{b=BD(hkd(Xod(a),J8c),334);jkd(a,J8c,b)}}} +function ijc(a,b,c){var d,e;bIc(a.e,b,c,(Ucd(),Tcd));bIc(a.i,b,c,zcd);if(a.a){e=BD(vNb(b,(wtc(),$sc)),11);d=BD(vNb(c,$sc),11);cIc(a.g,e,d)}} +function OEc(a,b,c){var d,e,f;d=b.c.p;f=b.p;a.b[d][f]=new $Ec(a,b);if(c){a.a[d][f]=new FEc(b);e=BD(vNb(b,(wtc(),Psc)),10);!!e&&Rc(a.d,e,b)}} +function TPb(a,b){var c,d,e;Ekb(PPb,a);b.Fc(a);c=BD(Ohb(OPb,a),21);if(c){for(e=c.Kc();e.Ob();){d=BD(e.Pb(),33);Jkb(PPb,d,0)!=-1||TPb(d,b)}}} +function tyb(a,b,c){var d;(jyb?(ryb(a),true):kyb?($xb(),true):nyb?($xb(),true):myb&&($xb(),false))&&(d=new iyb(b),d.b=c,pyb(a,d),undefined)} +function xKb(a,b){var c;c=!a.A.Hc((tdd(),sdd))||a.q==(dcd(),$bd);a.u.Hc((rcd(),ncd))?c?vKb(a,b):zKb(a,b):a.u.Hc(pcd)&&(c?wKb(a,b):AKb(a,b))} +function b0d(a,b){var c,d;++a.j;if(b!=null){c=(d=a.a.Cb,JD(d,97)?BD(d,97).Jg():null);if(xlb(b,c)){Cjd(a.a,4,c);return}}Cjd(a.a,4,BD(b,126))} +function dYb(a,b,c){return new J6c($wnd.Math.min(a.a,b.a)-c/2,$wnd.Math.min(a.b,b.b)-c/2,$wnd.Math.abs(a.a-b.a)+c,$wnd.Math.abs(a.b-b.b)+c)} +function k4b(a,b){var c,d;c=beb(a.a.c.p,b.a.c.p);if(c!=0){return c}d=beb(a.a.d.i.p,b.a.d.i.p);if(d!=0){return d}return beb(b.a.d.p,a.a.d.p)} +function _Dc(a,b,c){var d,e,f,g;f=b.j;g=c.j;if(f!=g){return f.g-g.g}else{d=a.f[b.p];e=a.f[c.p];return d==0&&e==0?0:d==0?-1:e==0?1:Kdb(d,e)}} +function HFb(a,b,c){var d,e,f;if(c[b.d]){return}c[b.d]=true;for(e=new olb(LFb(b));e.a=e)return e;for(b=b>0?b:0;bd&&NC(b,d,null);return b} +function _lb(a,b){var c,d;d=a.a.length;b.lengthd&&NC(b,d,null);return b} +function Xrb(a,b,c){var d,e,f;e=BD(Ohb(a.e,b),387);if(!e){d=new lsb(a,b,c);Rhb(a.e,b,d);isb(d);return null}else{f=ijb(e,c);Yrb(a,e);return f}} +function P9d(a){var b;if(a==null)return null;b=ide(Qge(a,true));if(b==null){throw vbb(new n8d("Invalid hexBinary value: '"+a+"'"))}return b} +function ghb(a){Hgb();if(ybb(a,0)<0){if(ybb(a,-1)!=0){return new Wgb(-1,Jbb(a))}return Bgb}else return ybb(a,10)<=0?Dgb[Tbb(a)]:new Wgb(1,a)} +function wJb(){qJb();return OC(GC(DN,1),Kie,159,0,[nJb,mJb,oJb,eJb,dJb,fJb,iJb,hJb,gJb,lJb,kJb,jJb,bJb,aJb,cJb,$Ib,ZIb,_Ib,XIb,WIb,YIb,pJb])} +function vjc(a){var b;this.d=new Rkb;this.j=new d7c;this.g=new d7c;b=a.g.b;this.f=BD(vNb(Q_b(b),(Nyc(),Lwc)),103);this.e=Edb(ED(c_b(b,ryc)))} +function Pjc(a){this.b=new Rkb;this.e=new Rkb;this.d=a;this.a=!WAb(JAb(new YAb(null,new Lub(new b1b(a.b))),new Xxb(new Qjc))).sd((EAb(),DAb))} +function N5c(){N5c=ccb;L5c=new O5c('PARENTS',0);K5c=new O5c('NODES',1);I5c=new O5c('EDGES',2);M5c=new O5c('PORTS',3);J5c=new O5c('LABELS',4)} +function Tbd(){Tbd=ccb;Qbd=new Ubd('DISTRIBUTED',0);Sbd=new Ubd('JUSTIFIED',1);Obd=new Ubd('BEGIN',2);Pbd=new Ubd(gle,3);Rbd=new Ubd('END',4)} +function UMd(a){var b;b=a.yi(null);switch(b){case 10:return 0;case 15:return 1;case 14:return 2;case 11:return 3;case 21:return 4;}return -1} +function cYb(a){switch(a.g){case 1:return ead(),dad;case 4:return ead(),aad;case 2:return ead(),bad;case 3:return ead(),_9c;}return ead(),cad} +function kA(a,b,c){var d;d=c.q.getFullYear()-nje+nje;d<0&&(d=-d);switch(b){case 1:a.a+=d;break;case 2:EA(a,d%100,2);break;default:EA(a,d,b);}} +function Jsb(a,b){var c,d;wCb(b,a.b);if(b>=a.b>>1){d=a.c;for(c=a.b;c>b;--c){d=d.b}}else{d=a.a.a;for(c=0;c=64&&b<128&&(e=Mbb(e,Nbb(1,b-64)))}return e} +function c_b(a,b){var c,d;d=null;if(wNb(a,(Y9c(),O9c))){c=BD(vNb(a,O9c),94);c.Xe(b)&&(d=c.We(b))}d==null&&!!Q_b(a)&&(d=vNb(Q_b(a),b));return d} +function oQc(a,b){var c,d,e;e=b.d.i;d=e.k;if(d==(j0b(),h0b)||d==d0b){return}c=new Sr(ur(U_b(e).a.Kc(),new Sq));Qr(c)&&Rhb(a.k,b,BD(Rr(c),17))} +function mid(a,b){var c,d,e;d=XKd(a.Tg(),b);c=b-a.Ah();return c<0?(e=a.Yg(d),e>=0?a.lh(e):tid(a,d)):c<0?tid(a,d):BD(d,66).Nj().Sj(a,a.yh(),c)} +function Ksd(a){var b;if(JD(a.a,4)){b=fvd(a.a);if(b==null){throw vbb(new Zdb(mse+a.b+"'. "+ise+(fdb(Y3),Y3.k)+jse))}return b}else{return a.a}} +function L9d(a){var b;if(a==null)return null;b=bde(Qge(a,true));if(b==null){throw vbb(new n8d("Invalid base64Binary value: '"+a+"'"))}return b} +function Dyd(b){var c;try{c=b.i.Xb(b.e);b.mj();b.g=b.e++;return c}catch(a){a=ubb(a);if(JD(a,73)){b.mj();throw vbb(new utb)}else throw vbb(a)}} +function Zyd(b){var c;try{c=b.c.ki(b.e);b.mj();b.g=b.e++;return c}catch(a){a=ubb(a);if(JD(a,73)){b.mj();throw vbb(new utb)}else throw vbb(a)}} +function CPb(){CPb=ccb;BPb=(Y9c(),K9c);vPb=G8c;qPb=r8c;wPb=f9c;zPb=(fFb(),bFb);yPb=_Eb;APb=dFb;xPb=$Eb;sPb=(nPb(),jPb);rPb=iPb;tPb=lPb;uPb=mPb} +function NWb(a){LWb();this.c=new Rkb;this.d=a;switch(a.g){case 0:case 2:this.a=tmb(KWb);this.b=Pje;break;case 3:case 1:this.a=KWb;this.b=Qje;}} +function ued(a,b,c){var d,e;if(a.c){dld(a.c,a.c.i+b);eld(a.c,a.c.j+c)}else{for(e=new olb(a.b);e.a0){Ekb(a.b,new WA(b.a,c));d=b.a.length;0d&&(b.a+=yfb(KC(TD,$ie,25,-d,15,1)))}} +function JKb(a,b){var c,d,e;c=a.o;for(e=BD(BD(Qc(a.r,b),21),84).Kc();e.Ob();){d=BD(e.Pb(),111);d.e.a=DKb(d,c.a);d.e.b=c.b*Edb(ED(d.b.We(BKb)))}} +function S5b(a,b){var c,d,e,f;e=a.k;c=Edb(ED(vNb(a,(wtc(),htc))));f=b.k;d=Edb(ED(vNb(b,htc)));return f!=(j0b(),e0b)?-1:e!=e0b?1:c==d?0:c=0){return a.hh(b,c,d)}else{!!a.eh()&&(d=(e=a.Vg(),e>=0?a.Qg(d):a.eh().ih(a,-1-e,null,d)));return a.Sg(b,c,d)}} +function zld(a,b){switch(b){case 7:!a.e&&(a.e=new y5d(B2,a,7,4));Uxd(a.e);return;case 8:!a.d&&(a.d=new y5d(B2,a,8,5));Uxd(a.d);return;}$kd(a,b)} +function Ut(b,c){var d;d=b.Zc(c);try{return d.Pb()}catch(a){a=ubb(a);if(JD(a,109)){throw vbb(new qcb("Can't get element "+c))}else throw vbb(a)}} +function Tgb(a,b){this.e=a;if(b=0&&(c.d=a.t);break;case 3:a.t>=0&&(c.a=a.t);}if(a.C){c.b=a.C.b;c.c=a.C.c}} +function RMb(){RMb=ccb;OMb=new SMb(xle,0);NMb=new SMb(yle,1);PMb=new SMb(zle,2);QMb=new SMb(Ale,3);OMb.a=false;NMb.a=true;PMb.a=false;QMb.a=true} +function ROb(){ROb=ccb;OOb=new SOb(xle,0);NOb=new SOb(yle,1);POb=new SOb(zle,2);QOb=new SOb(Ale,3);OOb.a=false;NOb.a=true;POb.a=false;QOb.a=true} +function dac(a){var b;b=a.a;do{b=BD(Rr(new Sr(ur(R_b(b).a.Kc(),new Sq))),17).c.i;b.k==(j0b(),g0b)&&a.b.Fc(b)}while(b.k==(j0b(),g0b));a.b=Su(a.b)} +function CDc(a){var b,c,d;d=a.c.a;a.p=(Qb(d),new Tkb(d));for(c=new olb(d);c.ac.b){return true}}}return false} +function AD(a,b){if(ND(a)){return !!zD[b]}else if(a.hm){return !!a.hm[b]}else if(LD(a)){return !!yD[b]}else if(KD(a)){return !!xD[b]}return false} +function jkd(a,b,c){c==null?(!a.o&&(a.o=new dId((Thd(),Qhd),S2,a,0)),LAd(a.o,b)):(!a.o&&(a.o=new dId((Thd(),Qhd),S2,a,0)),HAd(a.o,b,c));return a} +function jKb(a,b,c,d){var e,f;f=b.Xe((Y9c(),W8c))?BD(b.We(W8c),21):a.j;e=uJb(f);if(e==(qJb(),pJb)){return}if(c&&!sJb(e)){return}UHb(lKb(a,e,d),b)} +function fid(a,b,c,d){var e,f,g;f=XKd(a.Tg(),b);e=b-a.Ah();return e<0?(g=a.Yg(f),g>=0?a._g(g,c,true):sid(a,f,c)):BD(f,66).Nj().Pj(a,a.yh(),e,c,d)} +function u6d(a,b,c,d){var e,f,g;if(c.mh(b)){Q6d();if(YId(b)){e=BD(c.ah(b),153);x6d(a,e)}else{f=(g=b,!g?null:BD(d,49).xh(g));!!f&&v6d(c.ah(b),f)}}} +function H3b(a){switch(a.g){case 1:return vLb(),uLb;case 3:return vLb(),rLb;case 2:return vLb(),tLb;case 4:return vLb(),sLb;default:return null;}} +function kCb(a){switch(typeof(a)){case Mhe:return LCb(a);case Lhe:return QD(a);case Khe:return Bcb(),a?1231:1237;default:return a==null?0:FCb(a);}} +function Gic(a,b,c){if(a.e){switch(a.b){case 1:oic(a.c,b,c);break;case 0:pic(a.c,b,c);}}else{mic(a.c,b,c)}a.a[b.p][c.p]=a.c.i;a.a[c.p][b.p]=a.c.e} +function lHc(a){var b,c;if(a==null){return null}c=KC(OQ,nie,193,a.length,0,2);for(b=0;b=0)return e;if(a.Fk()){for(d=0;d=e)throw vbb(new Cyd(b,e));if(a.hi()){d=a.Xc(c);if(d>=0&&d!=b){throw vbb(new Wdb(kue))}}return a.mi(b,c)} +function gx(a,b){this.a=BD(Qb(a),245);this.b=BD(Qb(b),245);if(a.vd(b)>0||a==(Lk(),Kk)||b==(_k(),$k)){throw vbb(new Wdb('Invalid range: '+nx(a,b)))}} +function mYb(a){var b,c;this.b=new Rkb;this.c=a;this.a=false;for(c=new olb(a.a);c.a0);if((b&-b)==b){return QD(b*Cub(a,31)*4.6566128730773926E-10)}do{c=Cub(a,31);d=c%b}while(c-d+(b-1)<0);return QD(d)} +function LCb(a){JCb();var b,c,d;c=':'+a;d=ICb[c];if(d!=null){return QD((uCb(d),d))}d=GCb[c];b=d==null?KCb(a):QD((uCb(d),d));MCb();ICb[c]=b;return b} +function qZb(a,b,c){Odd(c,'Compound graph preprocessor',1);a.a=new Hp;vZb(a,b,null);pZb(a,b);uZb(a);yNb(b,(wtc(),zsc),a.a);a.a=null;Uhb(a.b);Qdd(c)} +function X$b(a,b,c){switch(c.g){case 1:a.a=b.a/2;a.b=0;break;case 2:a.a=b.a;a.b=b.b/2;break;case 3:a.a=b.a/2;a.b=b.b;break;case 4:a.a=0;a.b=b.b/2;}} +function tkc(a){var b,c,d;for(d=BD(Qc(a.a,(Xjc(),Vjc)),15).Kc();d.Ob();){c=BD(d.Pb(),101);b=Bkc(c);kkc(a,c,b[0],(Fkc(),Ckc),0);kkc(a,c,b[1],Ekc,1)}} +function ukc(a){var b,c,d;for(d=BD(Qc(a.a,(Xjc(),Wjc)),15).Kc();d.Ob();){c=BD(d.Pb(),101);b=Bkc(c);kkc(a,c,b[0],(Fkc(),Ckc),0);kkc(a,c,b[1],Ekc,1)}} +function tXc(a){switch(a.g){case 0:return null;case 1:return new $Xc;case 2:return new QXc;default:throw vbb(new Wdb(jre+(a.f!=null?a.f:''+a.g)));}} +function OZc(a,b,c){var d,e;FZc(a,b-a.s,c-a.t);for(e=new olb(a.n);e.a1&&(f=GFb(a,b));return f} +function dmd(a){var b;if(!!a.f&&a.f.kh()){b=BD(a.f,49);a.f=BD(xid(a,b),82);a.f!=b&&(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,9,8,b,a.f))}return a.f} +function emd(a){var b;if(!!a.i&&a.i.kh()){b=BD(a.i,49);a.i=BD(xid(a,b),82);a.i!=b&&(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,9,7,b,a.i))}return a.i} +function zUd(a){var b;if(!!a.b&&(a.b.Db&64)!=0){b=a.b;a.b=BD(xid(a,b),18);a.b!=b&&(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,9,21,b,a.b))}return a.b} +function uAd(a,b){var c,d,e;if(a.d==null){++a.e;++a.f}else{d=b.Sh();BAd(a,a.f+1);e=(d&Ohe)%a.d.length;c=a.d[e];!c&&(c=a.d[e]=a.uj());c.Fc(b);++a.f}} +function m3d(a,b,c){var d;if(b.Kj()){return false}else if(b.Zj()!=-2){d=b.zj();return d==null?c==null:pb(d,c)}else return b.Hj()==a.e.Tg()&&c==null} +function wo(){var a;Xj(16,Hie);a=Kp(16);this.b=KC(GF,Gie,317,a,0,1);this.c=KC(GF,Gie,317,a,0,1);this.a=null;this.e=null;this.i=0;this.f=a-1;this.g=0} +function b0b(a){n_b.call(this);this.k=(j0b(),h0b);this.j=(Xj(6,Jie),new Skb(6));this.b=(Xj(2,Jie),new Skb(2));this.d=new L_b;this.f=new s0b;this.a=a} +function Scc(a){var b,c;if(a.c.length<=1){return}b=Pcc(a,(Ucd(),Rcd));Rcc(a,BD(b.a,19).a,BD(b.b,19).a);c=Pcc(a,Tcd);Rcc(a,BD(c.a,19).a,BD(c.b,19).a)} +function Vzc(){Vzc=ccb;Uzc=new Xzc('SIMPLE',0);Rzc=new Xzc(Tne,1);Szc=new Xzc('LINEAR_SEGMENTS',2);Qzc=new Xzc('BRANDES_KOEPF',3);Tzc=new Xzc(Aqe,4)} +function XDc(a,b,c){if(!ecd(BD(vNb(b,(Nyc(),Vxc)),98))){WDc(a,b,Y_b(b,c));WDc(a,b,Y_b(b,(Ucd(),Rcd)));WDc(a,b,Y_b(b,Acd));mmb();Okb(b.j,new jEc(a))}} +function HVc(a,b,c,d){var e,f,g;e=d?BD(Qc(a.a,b),21):BD(Qc(a.b,b),21);for(g=e.Kc();g.Ob();){f=BD(g.Pb(),33);if(BVc(a,c,f)){return true}}return false} +function FMd(a){var b,c;for(c=new Fyd(a);c.e!=c.i.gc();){b=BD(Dyd(c),87);if(!!b.e||(!b.d&&(b.d=new xMd(j5,b,1)),b.d).i!=0){return true}}return false} +function QTd(a){var b,c;for(c=new Fyd(a);c.e!=c.i.gc();){b=BD(Dyd(c),87);if(!!b.e||(!b.d&&(b.d=new xMd(j5,b,1)),b.d).i!=0){return true}}return false} +function FDc(a){var b,c,d;b=0;for(d=new olb(a.c.a);d.a102)return -1;if(a<=57)return a-48;if(a<65)return -1;if(a<=70)return a-65+10;if(a<97)return -1;return a-97+10} +function Wj(a,b){if(a==null){throw vbb(new Heb('null key in entry: null='+b))}else if(b==null){throw vbb(new Heb('null value in entry: '+a+'=null'))}} +function kr(a,b){var c,d;while(a.Ob()){if(!b.Ob()){return false}c=a.Pb();d=b.Pb();if(!(PD(c)===PD(d)||c!=null&&pb(c,d))){return false}}return !b.Ob()} +function jIb(a,b){var c;c=OC(GC(UD,1),Vje,25,15,[pHb(a.a[0],b),pHb(a.a[1],b),pHb(a.a[2],b)]);if(a.d){c[0]=$wnd.Math.max(c[0],c[2]);c[2]=c[0]}return c} +function kIb(a,b){var c;c=OC(GC(UD,1),Vje,25,15,[qHb(a.a[0],b),qHb(a.a[1],b),qHb(a.a[2],b)]);if(a.d){c[0]=$wnd.Math.max(c[0],c[2]);c[2]=c[0]}return c} +function mqc(){mqc=ccb;iqc=new oqc('GREEDY',0);hqc=new oqc(Une,1);kqc=new oqc(Tne,2);lqc=new oqc('MODEL_ORDER',3);jqc=new oqc('GREEDY_MODEL_ORDER',4)} +function iUc(a,b){var c,d,e;a.b[b.g]=1;for(d=Jsb(b.d,0);d.b!=d.d.c;){c=BD(Xsb(d),188);e=c.c;a.b[e.g]==1?Dsb(a.a,c):a.b[e.g]==2?(a.b[e.g]=1):iUc(a,e)}} +function V9b(a,b){var c,d,e;e=new Skb(b.gc());for(d=b.Kc();d.Ob();){c=BD(d.Pb(),286);c.c==c.f?K9b(a,c,c.c):L9b(a,c)||(e.c[e.c.length]=c,true)}return e} +function IZc(a,b,c){var d,e,f,g,h;h=a.r+b;a.r+=b;a.d+=c;d=c/a.n.c.length;e=0;for(g=new olb(a.n);g.af&&NC(b,f,null);return b} +function Lu(a,b){var c,d;d=a.gc();if(b==null){for(c=0;c0&&(i+=e);j[k]=g;g+=h*(i+d)}} +function Uoc(a){var b,c,d;d=a.f;a.n=KC(UD,Vje,25,d,15,1);a.d=KC(UD,Vje,25,d,15,1);for(b=0;b0?a.c:0);++e}a.b=d;a.d=f} +function BZc(a,b){var c,d,e,f,g;d=0;e=0;c=0;for(g=new olb(b);g.a0?a.g:0);++c}a.c=e;a.d=d} +function AHb(a,b){var c;c=OC(GC(UD,1),Vje,25,15,[zHb(a,(gHb(),dHb),b),zHb(a,eHb,b),zHb(a,fHb,b)]);if(a.f){c[0]=$wnd.Math.max(c[0],c[2]);c[2]=c[0]}return c} +function lNb(b,c,d){var e;try{aNb(b,c+b.j,d+b.k,false,true)}catch(a){a=ubb(a);if(JD(a,73)){e=a;throw vbb(new qcb(e.g+Gle+c+She+d+').'))}else throw vbb(a)}} +function mNb(b,c,d){var e;try{aNb(b,c+b.j,d+b.k,true,false)}catch(a){a=ubb(a);if(JD(a,73)){e=a;throw vbb(new qcb(e.g+Gle+c+She+d+').'))}else throw vbb(a)}} +function d5b(a){var b;if(!wNb(a,(Nyc(),xxc))){return}b=BD(vNb(a,xxc),21);if(b.Hc((Hbd(),zbd))){b.Mc(zbd);b.Fc(Bbd)}else if(b.Hc(Bbd)){b.Mc(Bbd);b.Fc(zbd)}} +function e5b(a){var b;if(!wNb(a,(Nyc(),xxc))){return}b=BD(vNb(a,xxc),21);if(b.Hc((Hbd(),Gbd))){b.Mc(Gbd);b.Fc(Ebd)}else if(b.Hc(Ebd)){b.Mc(Ebd);b.Fc(Gbd)}} +function udc(a,b,c){Odd(c,'Self-Loop ordering',1);MAb(NAb(JAb(JAb(LAb(new YAb(null,new Kub(b.b,16)),new ydc),new Adc),new Cdc),new Edc),new Gdc(a));Qdd(c)} +function ikc(a,b,c,d){var e,f;for(e=b;e0&&(e.b+=b);return e} +function GXb(a,b){var c,d,e;e=new d7c;for(d=a.Kc();d.Ob();){c=BD(d.Pb(),37);uXb(c,0,e.b);e.b+=c.f.b+b;e.a=$wnd.Math.max(e.a,c.f.a)}e.a>0&&(e.a+=b);return e} +function d_b(a){var b,c,d;d=Ohe;for(c=new olb(a.a);c.a>16==6){return a.Cb.ih(a,5,o5,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?a.zh():c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)} +function Wz(a){Rz();var b=a.e;if(b&&b.stack){var c=b.stack;var d=b+'\n';c.substring(0,d.length)==d&&(c=c.substring(d.length));return c.split('\n')}return []} +function jeb(a){var b;b=(qeb(),peb);return b[a>>>28]|b[a>>24&15]<<4|b[a>>20&15]<<8|b[a>>16&15]<<12|b[a>>12&15]<<16|b[a>>8&15]<<20|b[a>>4&15]<<24|b[a&15]<<28} +function _jb(a){var b,c,d;if(a.b!=a.c){return}d=a.a.length;c=geb($wnd.Math.max(8,d))<<1;if(a.b!=0){b=_Bb(a.a,c);$jb(a,b,d);a.a=b;a.b=0}else{dCb(a.a,c)}a.c=d} +function DKb(a,b){var c;c=a.b;return c.Xe((Y9c(),s9c))?c.Hf()==(Ucd(),Tcd)?-c.rf().a-Edb(ED(c.We(s9c))):b+Edb(ED(c.We(s9c))):c.Hf()==(Ucd(),Tcd)?-c.rf().a:b} +function P_b(a){var b;if(a.b.c.length!=0&&!!BD(Ikb(a.b,0),70).a){return BD(Ikb(a.b,0),70).a}b=JZb(a);if(b!=null){return b}return ''+(!a.c?-1:Jkb(a.c.a,a,0))} +function C0b(a){var b;if(a.f.c.length!=0&&!!BD(Ikb(a.f,0),70).a){return BD(Ikb(a.f,0),70).a}b=JZb(a);if(b!=null){return b}return ''+(!a.i?-1:Jkb(a.i.j,a,0))} +function Ogc(a,b){var c,d;if(b<0||b>=a.gc()){return null}for(c=b;c0?a.c:0);e=$wnd.Math.max(e,b.d);++d}a.e=f;a.b=e} +function shd(a){var b,c;if(!a.b){a.b=Qu(BD(a.f,118).Ag().i);for(c=new Fyd(BD(a.f,118).Ag());c.e!=c.i.gc();){b=BD(Dyd(c),137);Ekb(a.b,new dhd(b))}}return a.b} +function Ctd(a,b){var c,d,e;if(b.dc()){return LCd(),LCd(),KCd}else{c=new zyd(a,b.gc());for(e=new Fyd(a);e.e!=e.i.gc();){d=Dyd(e);b.Hc(d)&&wtd(c,d)}return c}} +function bkd(a,b,c,d){if(b==0){return d?(!a.o&&(a.o=new dId((Thd(),Qhd),S2,a,0)),a.o):(!a.o&&(a.o=new dId((Thd(),Qhd),S2,a,0)),FAd(a.o))}return fid(a,b,c,d)} +function Tnd(a){var b,c;if(a.rb){for(b=0,c=a.rb.i;b>22);e+=d>>22;if(e<0){return false}a.l=c&Eje;a.m=d&Eje;a.h=e&Fje;return true} +function Fwb(a,b,c,d,e,f,g){var h,i;if(b.Ae()&&(i=a.a.ue(c,d),i<0||!e&&i==0)){return false}if(b.Be()&&(h=a.a.ue(c,f),h>0||!g&&h==0)){return false}return true} +function Vcc(a,b){Occ();var c;c=a.j.g-b.j.g;if(c!=0){return 0}switch(a.j.g){case 2:return Ycc(b,Ncc)-Ycc(a,Ncc);case 4:return Ycc(a,Mcc)-Ycc(b,Mcc);}return 0} +function Tqc(a){switch(a.g){case 0:return Mqc;case 1:return Nqc;case 2:return Oqc;case 3:return Pqc;case 4:return Qqc;case 5:return Rqc;default:return null;}} +function End(a,b,c){var d,e;d=(e=new rUd,yId(e,b),pnd(e,c),wtd((!a.c&&(a.c=new cUd(p5,a,12,10)),a.c),e),e);AId(d,0);DId(d,1);CId(d,true);BId(d,true);return d} +function tud(a,b){var c,d;if(b>=a.i)throw vbb(new $zd(b,a.i));++a.j;c=a.g[b];d=a.i-b-1;d>0&&$fb(a.g,b+1,a.g,b,d);NC(a.g,--a.i,null);a.fi(b,c);a.ci();return c} +function UId(a,b){var c,d;if(a.Db>>16==17){return a.Cb.ih(a,21,c5,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?a.zh():c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)} +function iDb(a){var b,c,d,e;mmb();Okb(a.c,a.a);for(e=new olb(a.c);e.ac.a.c.length)){throw vbb(new Wdb('index must be >= 0 and <= layer node count'))}!!a.c&&Lkb(a.c.a,a);a.c=c;!!c&&Dkb(c.a,b,a)} +function p7b(a,b){var c,d,e;for(d=new Sr(ur(O_b(a).a.Kc(),new Sq));Qr(d);){c=BD(Rr(d),17);e=BD(b.Kb(c),10);return new cc(Qb(e.n.b+e.o.b/2))}return wb(),wb(),vb} +function rMc(a,b){this.c=new Lqb;this.a=a;this.b=b;this.d=BD(vNb(a,(wtc(),otc)),304);PD(vNb(a,(Nyc(),yxc)))===PD((_qc(),Zqc))?(this.e=new bNc):(this.e=new WMc)} +function $dd(a,b){var c,d,e,f;f=0;for(d=new olb(a);d.a>16==6){return a.Cb.ih(a,6,B2,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(Thd(),Lhd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)} +function Eod(a,b){var c,d;if(a.Db>>16==7){return a.Cb.ih(a,1,C2,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(Thd(),Nhd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)} +function lpd(a,b){var c,d;if(a.Db>>16==9){return a.Cb.ih(a,9,E2,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(Thd(),Phd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)} +function mQd(a,b){var c,d;if(a.Db>>16==5){return a.Cb.ih(a,9,h5,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(jGd(),VFd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)} +function KHd(a,b){var c,d;if(a.Db>>16==3){return a.Cb.ih(a,0,k5,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(jGd(),OFd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)} +function Snd(a,b){var c,d;if(a.Db>>16==7){return a.Cb.ih(a,6,o5,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(jGd(),cGd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)} +function ird(){this.a=new bqd;this.g=new wo;this.j=new wo;this.b=new Lqb;this.d=new wo;this.i=new wo;this.k=new Lqb;this.c=new Lqb;this.e=new Lqb;this.f=new Lqb} +function MCd(a,b,c){var d,e,f;c<0&&(c=0);f=a.i;for(e=c;eWje){return p6d(a,d)}if(d==a){return true}}}return false} +function HKb(a){CKb();switch(a.q.g){case 5:EKb(a,(Ucd(),Acd));EKb(a,Rcd);break;case 4:FKb(a,(Ucd(),Acd));FKb(a,Rcd);break;default:GKb(a,(Ucd(),Acd));GKb(a,Rcd);}} +function LKb(a){CKb();switch(a.q.g){case 5:IKb(a,(Ucd(),zcd));IKb(a,Tcd);break;case 4:JKb(a,(Ucd(),zcd));JKb(a,Tcd);break;default:KKb(a,(Ucd(),zcd));KKb(a,Tcd);}} +function XQb(a){var b,c;b=BD(vNb(a,(wSb(),pSb)),19);if(b){c=b.a;c==0?yNb(a,(HSb(),GSb),new Gub):yNb(a,(HSb(),GSb),new Hub(c))}else{yNb(a,(HSb(),GSb),new Hub(1))}} +function V$b(a,b){var c;c=a.i;switch(b.g){case 1:return -(a.n.b+a.o.b);case 2:return a.n.a-c.o.a;case 3:return a.n.b-c.o.b;case 4:return -(a.n.a+a.o.a);}return 0} +function hbc(a,b){switch(a.g){case 0:return b==(Ctc(),ytc)?dbc:ebc;case 1:return b==(Ctc(),ytc)?dbc:cbc;case 2:return b==(Ctc(),ytc)?cbc:ebc;default:return cbc;}} +function v$c(a,b){var c,d,e;Lkb(a.a,b);a.e-=b.r+(a.a.c.length==0?0:a.c);e=ere;for(d=new olb(a.a);d.a>16==3){return a.Cb.ih(a,12,E2,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(Thd(),Khd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)} +function Uod(a,b){var c,d;if(a.Db>>16==11){return a.Cb.ih(a,10,E2,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(Thd(),Ohd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)} +function PSd(a,b){var c,d;if(a.Db>>16==10){return a.Cb.ih(a,11,c5,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(jGd(),aGd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)} +function qUd(a,b){var c,d;if(a.Db>>16==10){return a.Cb.ih(a,12,n5,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(jGd(),dGd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)} +function wId(a){var b;if((a.Bb&1)==0&&!!a.r&&a.r.kh()){b=BD(a.r,49);a.r=BD(xid(a,b),138);a.r!=b&&(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,9,8,b,a.r))}return a.r} +function yHb(a,b,c){var d;d=OC(GC(UD,1),Vje,25,15,[BHb(a,(gHb(),dHb),b,c),BHb(a,eHb,b,c),BHb(a,fHb,b,c)]);if(a.f){d[0]=$wnd.Math.max(d[0],d[2]);d[2]=d[0]}return d} +function O9b(a,b){var c,d,e;e=V9b(a,b);if(e.c.length==0){return}Okb(e,new pac);c=e.c.length;for(d=0;d>19;j=b.h>>19;if(i!=j){return j-i}e=a.h;h=b.h;if(e!=h){return e-h}d=a.m;g=b.m;if(d!=g){return d-g}c=a.l;f=b.l;return c-f} +function fFb(){fFb=ccb;eFb=(rFb(),oFb);dFb=new Nsd(Yke,eFb);cFb=(UEb(),TEb);bFb=new Nsd(Zke,cFb);aFb=(MEb(),LEb);_Eb=new Nsd($ke,aFb);$Eb=new Nsd(_ke,(Bcb(),true))} +function cfc(a,b,c){var d,e;d=b*c;if(JD(a.g,145)){e=ugc(a);if(e.f.d){e.f.a||(a.d.a+=d+ple)}else{a.d.d-=d+ple;a.d.a+=d+ple}}else if(JD(a.g,10)){a.d.d-=d;a.d.a+=2*d}} +function vmc(a,b,c){var d,e,f,g,h;e=a[c.g];for(h=new olb(b.d);h.a0?a.g:0);++c}b.b=d;b.e=e} +function to(a){var b,c,d;d=a.b;if(Lp(a.i,d.length)){c=d.length*2;a.b=KC(GF,Gie,317,c,0,1);a.c=KC(GF,Gie,317,c,0,1);a.f=c-1;a.i=0;for(b=a.a;b;b=b.c){po(a,b,b)}++a.g}} +function cNb(a,b,c,d){var e,f,g,h;for(e=0;eg&&(h=g/d);e>f&&(i=f/e);Y6c(a,$wnd.Math.min(h,i));return a} +function ond(){Smd();var b,c;try{c=BD(mUd((yFd(),xFd),yte),2014);if(c){return c}}catch(a){a=ubb(a);if(JD(a,102)){b=a;uvd((h0d(),b))}else throw vbb(a)}return new knd} +function Y9d(){A9d();var b,c;try{c=BD(mUd((yFd(),xFd),Ewe),2024);if(c){return c}}catch(a){a=ubb(a);if(JD(a,102)){b=a;uvd((h0d(),b))}else throw vbb(a)}return new U9d} +function qZd(){Smd();var b,c;try{c=BD(mUd((yFd(),xFd),_ve),1941);if(c){return c}}catch(a){a=ubb(a);if(JD(a,102)){b=a;uvd((h0d(),b))}else throw vbb(a)}return new mZd} +function HQd(a,b,c){var d,e;e=a.e;a.e=b;if((a.Db&4)!=0&&(a.Db&1)==0){d=new nSd(a,1,4,e,b);!c?(c=d):c.Ei(d)}e!=b&&(b?(c=QQd(a,MQd(a,b),c)):(c=QQd(a,a.a,c)));return c} +function nB(){eB.call(this);this.e=-1;this.a=false;this.p=Rie;this.k=-1;this.c=-1;this.b=-1;this.g=false;this.f=-1;this.j=-1;this.n=-1;this.i=-1;this.d=-1;this.o=Rie} +function qEb(a,b){var c,d,e;d=a.b.d.d;a.a||(d+=a.b.d.a);e=b.b.d.d;b.a||(e+=b.b.d.a);c=Kdb(d,e);if(c==0){if(!a.a&&b.a){return -1}else if(!b.a&&a.a){return 1}}return c} +function eOb(a,b){var c,d,e;d=a.b.b.d;a.a||(d+=a.b.b.a);e=b.b.b.d;b.a||(e+=b.b.b.a);c=Kdb(d,e);if(c==0){if(!a.a&&b.a){return -1}else if(!b.a&&a.a){return 1}}return c} +function PVb(a,b){var c,d,e;d=a.b.g.d;a.a||(d+=a.b.g.a);e=b.b.g.d;b.a||(e+=b.b.g.a);c=Kdb(d,e);if(c==0){if(!a.a&&b.a){return -1}else if(!b.a&&a.a){return 1}}return c} +function ZTb(){ZTb=ccb;WTb=c3c(e3c(e3c(e3c(new j3c,(qUb(),oUb),(S8b(),m8b)),oUb,q8b),pUb,x8b),pUb,a8b);YTb=e3c(e3c(new j3c,oUb,S7b),oUb,b8b);XTb=c3c(new j3c,pUb,d8b)} +function s3b(a){var b,c,d,e,f;b=BD(vNb(a,(wtc(),Csc)),83);f=a.n;for(d=b.Cc().Kc();d.Ob();){c=BD(d.Pb(),306);e=c.i;e.c+=f.a;e.d+=f.b;c.c?VHb(c):XHb(c)}yNb(a,Csc,null)} +function qmc(a,b,c){var d,e;e=a.b;d=e.d;switch(b.g){case 1:return -d.d-c;case 2:return e.o.a+d.c+c;case 3:return e.o.b+d.a+c;case 4:return -d.b-c;default:return -1;}} +function BXc(a){var b,c,d,e,f;d=0;e=dme;if(a.b){for(b=0;b<360;b++){c=b*0.017453292519943295;zXc(a,a.d,0,0,dre,c);f=a.b.ig(a.d);if(f0){g=(f&Ohe)%a.d.length;e=wAd(a,g,f,b);if(e){h=e.ed(c);return h}}d=a.tj(f,b,c);a.c.Fc(d);return null} +function t1d(a,b){var c,d,e,f;switch(o1d(a,b)._k()){case 3:case 2:{c=OKd(b);for(e=0,f=c.i;e=0;d--){if(dfb(a[d].d,b)||dfb(a[d].d,c)){a.length>=d+1&&a.splice(0,d+1);break}}return a} +function Abb(a,b){var c;if(Fbb(a)&&Fbb(b)){c=a/b;if(Kje0){a.b+=2;a.a+=d}}else{a.b+=1;a.a+=$wnd.Math.min(d,e)}} +function Rpd(a,b){var c,d;d=false;if(ND(b)){d=true;Qpd(a,new yC(GD(b)))}if(!d){if(JD(b,236)){d=true;Qpd(a,(c=Kcb(BD(b,236)),new TB(c)))}}if(!d){throw vbb(new vcb(Ute))}} +function IMd(a,b,c,d){var e,f,g;e=new pSd(a.e,1,10,(g=b.c,JD(g,88)?BD(g,26):(jGd(),_Fd)),(f=c.c,JD(f,88)?BD(f,26):(jGd(),_Fd)),HLd(a,b),false);!d?(d=e):d.Ei(e);return d} +function T_b(a){var b,c;switch(BD(vNb(Q_b(a),(Nyc(),ixc)),420).g){case 0:b=a.n;c=a.o;return new f7c(b.a+c.a/2,b.b+c.b/2);case 1:return new g7c(a.n);default:return null;}} +function lrc(){lrc=ccb;irc=new mrc(ane,0);hrc=new mrc('LEFTUP',1);krc=new mrc('RIGHTUP',2);grc=new mrc('LEFTDOWN',3);jrc=new mrc('RIGHTDOWN',4);frc=new mrc('BALANCED',5)} +function FFc(a,b,c){var d,e,f;d=Kdb(a.a[b.p],a.a[c.p]);if(d==0){e=BD(vNb(b,(wtc(),Qsc)),15);f=BD(vNb(c,Qsc),15);if(e.Hc(c)){return -1}else if(f.Hc(b)){return 1}}return d} +function jXc(a){switch(a.g){case 1:return new XVc;case 2:return new ZVc;case 3:return new VVc;case 0:return null;default:throw vbb(new Wdb(jre+(a.f!=null?a.f:''+a.g)));}} +function Ikd(a,b,c){switch(b){case 1:!a.n&&(a.n=new cUd(D2,a,1,7));Uxd(a.n);!a.n&&(a.n=new cUd(D2,a,1,7));ytd(a.n,BD(c,14));return;case 2:Lkd(a,GD(c));return;}ekd(a,b,c)} +function Zkd(a,b,c){switch(b){case 3:ald(a,Edb(ED(c)));return;case 4:cld(a,Edb(ED(c)));return;case 5:dld(a,Edb(ED(c)));return;case 6:eld(a,Edb(ED(c)));return;}Ikd(a,b,c)} +function Fnd(a,b,c){var d,e,f;f=(d=new rUd,d);e=xId(f,b,null);!!e&&e.Fi();pnd(f,c);wtd((!a.c&&(a.c=new cUd(p5,a,12,10)),a.c),f);AId(f,0);DId(f,1);CId(f,true);BId(f,true)} +function mUd(a,b){var c,d,e;c=Crb(a.g,b);if(JD(c,235)){e=BD(c,235);e.Qh()==null&&undefined;return e.Nh()}else if(JD(c,498)){d=BD(c,1938);e=d.b;return e}else{return null}} +function Ui(a,b,c,d){var e,f;Qb(b);Qb(c);f=BD(tn(a.d,b),19);Ob(!!f,'Row %s not in %s',b,a.e);e=BD(tn(a.b,c),19);Ob(!!e,'Column %s not in %s',c,a.c);return Wi(a,f.a,e.a,d)} +function JC(a,b,c,d,e,f,g){var h,i,j,k,l;k=e[f];j=f==g-1;h=j?d:0;l=LC(h,k);d!=10&&OC(GC(a,g-f),b[f],c[f],h,l);if(!j){++f;for(i=0;i1||h==-1){f=BD(i,15);e.Wb(t6d(a,f))}else{e.Wb(s6d(a,BD(i,56)))}}}} +function Zbb(b,c,d,e){Ybb();var f=Wbb;$moduleName=c;$moduleBase=d;tbb=e;function g(){for(var a=0;aOqe){return c}else e>-1.0E-6&&++c}return c} +function PQd(a,b){var c;if(b!=a.b){c=null;!!a.b&&(c=lid(a.b,a,-4,c));!!b&&(c=kid(b,a,-4,c));c=GQd(a,b,c);!!c&&c.Fi()}else (a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,3,b,b))} +function SQd(a,b){var c;if(b!=a.f){c=null;!!a.f&&(c=lid(a.f,a,-1,c));!!b&&(c=kid(b,a,-1,c));c=IQd(a,b,c);!!c&&c.Fi()}else (a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,0,b,b))} +function E9d(a){var b,c,d;if(a==null)return null;c=BD(a,15);if(c.dc())return '';d=new Hfb;for(b=c.Kc();b.Ob();){Efb(d,(Q8d(),GD(b.Pb())));d.a+=' '}return lcb(d,d.a.length-1)} +function I9d(a){var b,c,d;if(a==null)return null;c=BD(a,15);if(c.dc())return '';d=new Hfb;for(b=c.Kc();b.Ob();){Efb(d,(Q8d(),GD(b.Pb())));d.a+=' '}return lcb(d,d.a.length-1)} +function qEc(a,b,c){var d,e;d=a.c[b.c.p][b.p];e=a.c[c.c.p][c.p];if(d.a!=null&&e.a!=null){return Ddb(d.a,e.a)}else if(d.a!=null){return -1}else if(e.a!=null){return 1}return 0} +function zqd(a,b){var c,d,e,f,g,h;if(b){f=b.a.length;c=new Yge(f);for(h=(c.b-c.a)*c.c<0?(Xge(),Wge):new she(c);h.Ob();){g=BD(h.Pb(),19);e=Zpd(b,g.a);d=new Crd(a);Aqd(d.a,e)}}} +function Qqd(a,b){var c,d,e,f,g,h;if(b){f=b.a.length;c=new Yge(f);for(h=(c.b-c.a)*c.c<0?(Xge(),Wge):new she(c);h.Ob();){g=BD(h.Pb(),19);e=Zpd(b,g.a);d=new lrd(a);nqd(d.a,e)}}} +function eFd(b){var c;if(b!=null&&b.length>0&&bfb(b,b.length-1)==33){try{c=PEd(qfb(b,0,b.length-1));return c.e==null}catch(a){a=ubb(a);if(!JD(a,32))throw vbb(a)}}return false} +function h3d(a,b,c){var d,e,f;d=b.ak();f=b.dd();e=d.$j()?H2d(a,3,d,null,f,M2d(a,d,f,JD(d,99)&&(BD(d,18).Bb&Tje)!=0),true):H2d(a,1,d,d.zj(),f,-1,true);c?c.Ei(e):(c=e);return c} +function Vee(){var a,b,c;b=0;for(a=0;a<'X'.length;a++){c=Uee((BCb(a,'X'.length),'X'.charCodeAt(a)));if(c==0)throw vbb(new mde('Unknown Option: '+'X'.substr(a)));b|=c}return b} +function mZb(a,b,c){var d,e,f;d=Q_b(b);e=a_b(d);f=new H0b;F0b(f,b);switch(c.g){case 1:G0b(f,Wcd(Zcd(e)));break;case 2:G0b(f,Zcd(e));}yNb(f,(Nyc(),Uxc),ED(vNb(a,Uxc)));return f} +function U9b(a){var b,c;b=BD(Rr(new Sr(ur(R_b(a.a).a.Kc(),new Sq))),17);c=BD(Rr(new Sr(ur(U_b(a.a).a.Kc(),new Sq))),17);return Ccb(DD(vNb(b,(wtc(),ltc))))||Ccb(DD(vNb(c,ltc)))} +function Xjc(){Xjc=ccb;Tjc=new Yjc('ONE_SIDE',0);Vjc=new Yjc('TWO_SIDES_CORNER',1);Wjc=new Yjc('TWO_SIDES_OPPOSING',2);Ujc=new Yjc('THREE_SIDES',3);Sjc=new Yjc('FOUR_SIDES',4)} +function jkc(a,b,c,d,e){var f,g;f=BD(GAb(JAb(b.Oc(),new _kc),Byb(new fzb,new dzb,new Ezb,OC(GC(xL,1),Kie,132,0,[(Fyb(),Dyb)]))),15);g=BD(Si(a.b,c,d),15);e==0?g.Wc(0,f):g.Gc(f)} +function KDc(a,b){var c,d,e,f,g;for(f=new olb(b.a);f.a0&&ric(this,this.c-1,(Ucd(),zcd));this.c0&&a[0].length>0&&(this.c=Ccb(DD(vNb(Q_b(a[0][0]),(wtc(),Rsc)))));this.a=KC(CX,nie,2018,a.length,0,2);this.b=KC(FX,nie,2019,a.length,0,2);this.d=new ss} +function tKc(a){if(a.c.length==0){return false}if((tCb(0,a.c.length),BD(a.c[0],17)).c.i.k==(j0b(),g0b)){return true}return FAb(NAb(new YAb(null,new Kub(a,16)),new wKc),new yKc)} +function rRc(a,b,c){Odd(c,'Tree layout',1);H2c(a.b);K2c(a.b,(yRc(),uRc),uRc);K2c(a.b,vRc,vRc);K2c(a.b,wRc,wRc);K2c(a.b,xRc,xRc);a.a=F2c(a.b,b);sRc(a,b,Udd(c,1));Qdd(c);return b} +function HXc(a,b){var c,d,e,f,g,h,i;h=gVc(b);f=b.f;i=b.g;g=$wnd.Math.sqrt(f*f+i*i);e=0;for(d=new olb(h);d.a=0){c=Abb(a,Jje);d=Hbb(a,Jje)}else{b=Pbb(a,1);c=Abb(b,500000000);d=Hbb(b,500000000);d=wbb(Nbb(d,1),xbb(a,1))}return Mbb(Nbb(d,32),xbb(c,Yje))} +function oQb(a,b,c){var d,e;d=(sCb(b.b!=0),BD(Nsb(b,b.a.a),8));switch(c.g){case 0:d.b=0;break;case 2:d.b=a.f;break;case 3:d.a=0;break;default:d.a=a.g;}e=Jsb(b,0);Vsb(e,d);return b} +function pmc(a,b,c,d){var e,f,g,h,i;i=a.b;f=b.d;g=f.j;h=umc(g,i.d[g.g],c);e=P6c(R6c(f.n),f.a);switch(f.j.g){case 1:case 3:h.a+=e.a;break;case 2:case 4:h.b+=e.b;}Gsb(d,h,d.c.b,d.c)} +function yJc(a,b,c){var d,e,f,g;g=Jkb(a.e,b,0);f=new zJc;f.b=c;d=new Bib(a.e,g);while(d.b1;b>>=1){(b&1)!=0&&(d=Ogb(d,c));c.d==1?(c=Ogb(c,c)):(c=new Xgb(Lhb(c.a,c.d,KC(WD,oje,25,c.d<<1,15,1))))}d=Ogb(d,c);return d} +function zub(){zub=ccb;var a,b,c,d;wub=KC(UD,Vje,25,25,15,1);xub=KC(UD,Vje,25,33,15,1);d=1.52587890625E-5;for(b=32;b>=0;b--){xub[b]=d;d*=0.5}c=1;for(a=24;a>=0;a--){wub[a]=c;c*=0.5}} +function S1b(a){var b,c;if(Ccb(DD(hkd(a,(Nyc(),fxc))))){for(c=new Sr(ur(_sd(a).a.Kc(),new Sq));Qr(c);){b=BD(Rr(c),79);if(Qld(b)){if(Ccb(DD(hkd(b,gxc)))){return true}}}}return false} +function kjc(a,b){var c,d,e;if(Qqb(a.f,b)){b.b=a;d=b.c;Jkb(a.j,d,0)!=-1||Ekb(a.j,d);e=b.d;Jkb(a.j,e,0)!=-1||Ekb(a.j,e);c=b.a.b;if(c.c.length!=0){!a.i&&(a.i=new vjc(a));qjc(a.i,c)}}} +function rmc(a){var b,c,d,e,f;c=a.c.d;d=c.j;e=a.d.d;f=e.j;if(d==f){return c.p=0&&dfb(a.substr(b,'GMT'.length),'GMT')){c[0]=b+3;return tA(a,c,d)}if(b>=0&&dfb(a.substr(b,'UTC'.length),'UTC')){c[0]=b+3;return tA(a,c,d)}return tA(a,c,d)} +function tjc(a,b){var c,d,e,f,g;f=a.g.a;g=a.g.b;for(d=new olb(a.d);d.ac;f--){a[f]|=b[f-c-1]>>>g;a[f-1]=b[f-c-1]<=a.f){break}f.c[f.c.length]=c}return f} +function sfd(a){var b,c,d,e;b=null;for(e=new olb(a.wf());e.a0&&$fb(a.g,b,a.g,b+d,h);g=c.Kc();a.i+=d;for(e=0;ef&&nfb(j,sfb(c[h],ltb))){e=h;f=i}}e>=0&&(d[0]=b+f);return e} +function MIb(a,b){var c;c=NIb(a.b.Hf(),b.b.Hf());if(c!=0){return c}switch(a.b.Hf().g){case 1:case 2:return beb(a.b.sf(),b.b.sf());case 3:case 4:return beb(b.b.sf(),a.b.sf());}return 0} +function iRb(a){var b,c,d;d=a.e.c.length;a.a=IC(WD,[nie,oje],[48,25],15,[d,d],2);for(c=new olb(a.c);c.a>4&15;f=a[d]&15;g[e++]=Qmd[c];g[e++]=Qmd[f]}return zfb(g,0,g.length)}} +function j3d(a,b,c){var d,e,f;d=b.ak();f=b.dd();e=d.$j()?H2d(a,4,d,f,null,M2d(a,d,f,JD(d,99)&&(BD(d,18).Bb&Tje)!=0),true):H2d(a,d.Kj()?2:1,d,f,d.zj(),-1,true);c?c.Ei(e):(c=e);return c} +function wfb(a){var b,c;if(a>=Tje){b=Uje+(a-Tje>>10&1023)&aje;c=56320+(a-Tje&1023)&aje;return String.fromCharCode(b)+(''+String.fromCharCode(c))}else{return String.fromCharCode(a&aje)}} +function bKb(a,b){$Jb();var c,d,e,f;e=BD(BD(Qc(a.r,b),21),84);if(e.gc()>=2){d=BD(e.Kc().Pb(),111);c=a.u.Hc((rcd(),mcd));f=a.u.Hc(qcd);return !d.a&&!c&&(e.gc()==2||f)}else{return false}} +function IVc(a,b,c,d,e){var f,g,h;f=JVc(a,b,c,d,e);h=false;while(!f){AVc(a,e,true);h=true;f=JVc(a,b,c,d,e)}h&&AVc(a,e,false);g=dVc(e);if(g.c.length!=0){!!a.d&&a.d.lg(g);IVc(a,e,c,d,g)}} +function Mad(){Mad=ccb;Kad=new Nad(ane,0);Iad=new Nad('DIRECTED',1);Lad=new Nad('UNDIRECTED',2);Gad=new Nad('ASSOCIATION',3);Jad=new Nad('GENERALIZATION',4);Had=new Nad('DEPENDENCY',5)} +function kfd(a,b){var c;if(!mpd(a)){throw vbb(new Zdb(Sse))}c=mpd(a);switch(b.g){case 1:return -(a.j+a.f);case 2:return a.i-c.g;case 3:return a.j-c.f;case 4:return -(a.i+a.g);}return 0} +function cub(a,b){var c,d;uCb(b);d=a.b.c.length;Ekb(a.b,b);while(d>0){c=d;d=(d-1)/2|0;if(a.a.ue(Ikb(a.b,d),b)<=0){Nkb(a.b,c,b);return true}Nkb(a.b,c,Ikb(a.b,d))}Nkb(a.b,d,b);return true} +function BHb(a,b,c,d){var e,f;e=0;if(!c){for(f=0;f=h} +function Tpd(a,b,c,d){var e;e=false;if(ND(d)){e=true;Upd(b,c,GD(d))}if(!e){if(KD(d)){e=true;Tpd(a,b,c,d)}}if(!e){if(JD(d,236)){e=true;Spd(b,c,BD(d,236))}}if(!e){throw vbb(new vcb(Ute))}} +function W0d(a,b){var c,d,e;c=b.Hh(a.a);if(c){e=AAd((!c.b&&(c.b=new sId((jGd(),fGd),x6,c)),c.b),Sve);if(e!=null){for(d=1;d<(O6d(),K6d).length;++d){if(dfb(K6d[d],e)){return d}}}}return 0} +function X0d(a,b){var c,d,e;c=b.Hh(a.a);if(c){e=AAd((!c.b&&(c.b=new sId((jGd(),fGd),x6,c)),c.b),Sve);if(e!=null){for(d=1;d<(O6d(),L6d).length;++d){if(dfb(L6d[d],e)){return d}}}}return 0} +function Ve(a,b){var c,d,e,f;uCb(b);f=a.a.gc();if(f0?1:0;while(f.a[e]!=c){f=f.a[e];e=a.a.ue(c.d,f.d)>0?1:0}f.a[e]=d;d.b=c.b;d.a[0]=c.a[0];d.a[1]=c.a[1];c.a[0]=null;c.a[1]=null} +function ucd(a){rcd();var b,c;b=qqb(ncd,OC(GC(E1,1),Kie,273,0,[pcd]));if(Ox(Cx(b,a))>1){return false}c=qqb(mcd,OC(GC(E1,1),Kie,273,0,[lcd,qcd]));if(Ox(Cx(c,a))>1){return false}return true} +function fod(a,b){var c;c=Phb((yFd(),xFd),a);JD(c,498)?Shb(xFd,a,new bUd(this,b)):Shb(xFd,a,this);bod(this,b);if(b==(LFd(),KFd)){this.wb=BD(this,1939);BD(b,1941)}else{this.wb=(NFd(),MFd)}} +function lZd(b){var c,d,e;if(b==null){return null}c=null;for(d=0;d=_ie?'error':d>=900?'warn':d>=800?'info':'log');gCb(c,a.a);!!a.b&&hCb(b,c,a.b,'Exception: ',true)} +function vNb(a,b){var c,d;d=(!a.q&&(a.q=new Lqb),Ohb(a.q,b));if(d!=null){return d}c=b.wg();JD(c,4)&&(c==null?(!a.q&&(a.q=new Lqb),Thb(a.q,b)):(!a.q&&(a.q=new Lqb),Rhb(a.q,b,c)),a);return c} +function qUb(){qUb=ccb;lUb=new rUb('P1_CYCLE_BREAKING',0);mUb=new rUb('P2_LAYERING',1);nUb=new rUb('P3_NODE_ORDERING',2);oUb=new rUb('P4_NODE_PLACEMENT',3);pUb=new rUb('P5_EDGE_ROUTING',4)} +function SUb(a,b){var c,d,e,f,g;e=b==1?KUb:JUb;for(d=e.a.ec().Kc();d.Ob();){c=BD(d.Pb(),103);for(g=BD(Qc(a.f.c,c),21).Kc();g.Ob();){f=BD(g.Pb(),46);Lkb(a.b.b,f.b);Lkb(a.b.a,BD(f.b,81).d)}}} +function IWb(a,b){AWb();var c;if(a.c==b.c){if(a.b==b.b||pWb(a.b,b.b)){c=mWb(a.b)?1:-1;if(a.a&&!b.a){return c}else if(!a.a&&b.a){return -c}}return beb(a.b.g,b.b.g)}else{return Kdb(a.c,b.c)}} +function y6b(a,b){var c;Odd(b,'Hierarchical port position processing',1);c=a.b;c.c.length>0&&x6b((tCb(0,c.c.length),BD(c.c[0],29)),a);c.c.length>1&&x6b(BD(Ikb(c,c.c.length-1),29),a);Qdd(b)} +function RVc(a,b){var c,d,e;if(CVc(a,b)){return true}for(d=new olb(b);d.a=e||b<0)throw vbb(new qcb(lue+b+mue+e));if(c>=e||c<0)throw vbb(new qcb(nue+c+mue+e));b!=c?(d=(f=a.Ti(c),a.Hi(b,f),f)):(d=a.Oi(c));return d} +function m6d(a){var b,c,d;d=a;if(a){b=0;for(c=a.Ug();c;c=c.Ug()){if(++b>Wje){return m6d(c)}d=c;if(c==a){throw vbb(new Zdb('There is a cycle in the containment hierarchy of '+a))}}}return d} +function Fe(a){var b,c,d;d=new xwb(She,'[',']');for(c=a.Kc();c.Ob();){b=c.Pb();uwb(d,PD(b)===PD(a)?'(this Collection)':b==null?Xhe:fcb(b))}return !d.a?d.c:d.e.length==0?d.a.a:d.a.a+(''+d.e)} +function CVc(a,b){var c,d;d=false;if(b.gc()<2){return false}for(c=0;cd&&(BCb(b-1,a.length),a.charCodeAt(b-1)<=32)){--b}return d>0||b1&&(a.j.b+=a.e)}else{a.j.a+=c.a;a.j.b=$wnd.Math.max(a.j.b,c.b);a.d.c.length>1&&(a.j.a+=a.e)}} +function gkc(){gkc=ccb;dkc=OC(GC(F1,1),bne,61,0,[(Ucd(),Acd),zcd,Rcd]);ckc=OC(GC(F1,1),bne,61,0,[zcd,Rcd,Tcd]);ekc=OC(GC(F1,1),bne,61,0,[Rcd,Tcd,Acd]);fkc=OC(GC(F1,1),bne,61,0,[Tcd,Acd,zcd])} +function omc(a,b,c,d){var e,f,g,h,i,j,k;g=a.c.d;h=a.d.d;if(g.j==h.j){return}k=a.b;e=g.j;i=null;while(e!=h.j){i=b==0?Xcd(e):Vcd(e);f=umc(e,k.d[e.g],c);j=umc(i,k.d[i.g],c);Dsb(d,P6c(f,j));e=i}} +function oFc(a,b,c,d){var e,f,g,h,i;g=JHc(a.a,b,c);h=BD(g.a,19).a;f=BD(g.b,19).a;if(d){i=BD(vNb(b,(wtc(),gtc)),10);e=BD(vNb(c,gtc),10);if(!!i&&!!e){mic(a.b,i,e);h+=a.b.i;f+=a.b.e}}return h>f} +function oHc(a){var b,c,d,e,f,g,h,i,j;this.a=lHc(a);this.b=new Rkb;for(c=a,d=0,e=c.length;dwic(a.d).c){a.i+=a.g.c;yic(a.d)}else if(wic(a.d).c>wic(a.g).c){a.e+=a.d.c;yic(a.g)}else{a.i+=vic(a.g);a.e+=vic(a.d);yic(a.g);yic(a.d)}}} +function XOc(a,b,c){var d,e,f,g;f=b.q;g=b.r;new DOc((HOc(),FOc),b,f,1);new DOc(FOc,f,g,1);for(e=new olb(c);e.ah&&(i=h/d);e>f&&(j=f/e);g=$wnd.Math.min(i,j);a.a+=g*(b.a-a.a);a.b+=g*(b.b-a.b)} +function sZc(a,b,c,d,e){var f,g;g=false;f=BD(Ikb(c.b,0),33);while(yZc(a,b,f,d,e)){g=true;NZc(c,f);if(c.b.c.length==0){break}f=BD(Ikb(c.b,0),33)}c.b.c.length==0&&v$c(c.j,c);g&&a$c(b.q);return g} +function t6c(a,b){i6c();var c,d,e,f;if(b.b<2){return false}f=Jsb(b,0);c=BD(Xsb(f),8);d=c;while(f.b!=f.d.c){e=BD(Xsb(f),8);if(s6c(a,d,e)){return true}d=e}if(s6c(a,d,c)){return true}return false} +function ckd(a,b,c,d){var e,f;if(c==0){return !a.o&&(a.o=new dId((Thd(),Qhd),S2,a,0)),bId(a.o,b,d)}return f=BD(XKd((e=BD(Ajd(a,16),26),!e?a.zh():e),c),66),f.Nj().Rj(a,yjd(a),c-aLd(a.zh()),b,d)} +function bod(a,b){var c;if(b!=a.sb){c=null;!!a.sb&&(c=BD(a.sb,49).ih(a,1,i5,c));!!b&&(c=BD(b,49).gh(a,1,i5,c));c=Jnd(a,b,c);!!c&&c.Fi()}else (a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,4,b,b))} +function yqd(a,b){var c,d,e,f;if(b){e=Xpd(b,'x');c=new zrd(a);hmd(c.a,(uCb(e),e));f=Xpd(b,'y');d=new Ard(a);imd(d.a,(uCb(f),f))}else{throw vbb(new cqd('All edge sections need an end point.'))}} +function wqd(a,b){var c,d,e,f;if(b){e=Xpd(b,'x');c=new wrd(a);omd(c.a,(uCb(e),e));f=Xpd(b,'y');d=new xrd(a);pmd(d.a,(uCb(f),f))}else{throw vbb(new cqd('All edge sections need a start point.'))}} +function pyb(a,b){var c,d,e,f,g,h,i;for(d=syb(a),f=0,h=d.length;f>22-b;e=a.h<>22-b}else if(b<44){c=0;d=a.l<>44-b}else{c=0;d=0;e=a.l<a){throw vbb(new Wdb('k must be smaller than n'))}else return b==0||b==a?1:a==0?0:q6c(a)/(q6c(b)*q6c(a-b))} +function jfd(a,b){var c,d,e,f;c=new _ud(a);while(c.g==null&&!c.c?Uud(c):c.g==null||c.i!=0&&BD(c.g[c.i-1],47).Ob()){f=BD(Vud(c),56);if(JD(f,160)){d=BD(f,160);for(e=0;e>4];b[c*2+1]=gde[f&15]}return zfb(b,0,b.length)} +function fn(a){Vm();var b,c,d;d=a.c.length;switch(d){case 0:return Um;case 1:b=BD(qr(new olb(a)),42);return ln(b.cd(),b.dd());default:c=BD(Qkb(a,KC(CK,zie,42,a.c.length,0,1)),165);return new wx(c);}} +function ITb(a){var b,c,d,e,f,g;b=new jkb;c=new jkb;Wjb(b,a);Wjb(c,a);while(c.b!=c.c){e=BD(fkb(c),37);for(g=new olb(e.a);g.a0&&WGc(a,c,b);return e}return TGc(a,b,c)} +function MSc(a,b,c){var d,e,f,g;if(b.b!=0){d=new Psb;for(g=Jsb(b,0);g.b!=g.d.c;){f=BD(Xsb(g),86);ye(d,URc(f));e=f.e;e.a=BD(vNb(f,(mTc(),kTc)),19).a;e.b=BD(vNb(f,lTc),19).a}MSc(a,d,Udd(c,d.b/a.a|0))}} +function JZc(a,b){var c,d,e,f,g;if(a.e<=b){return a.g}if(LZc(a,a.g,b)){return a.g}f=a.r;d=a.g;g=a.r;e=(f-d)/2+d;while(d+11&&(a.e.b+=a.a)}else{a.e.a+=c.a;a.e.b=$wnd.Math.max(a.e.b,c.b);a.d.c.length>1&&(a.e.a+=a.a)}} +function cmc(a){var b,c,d,e;e=a.i;b=e.b;d=e.j;c=e.g;switch(e.a.g){case 0:c.a=(a.g.b.o.a-d.a)/2;break;case 1:c.a=b.d.n.a+b.d.a.a;break;case 2:c.a=b.d.n.a+b.d.a.a-d.a;break;case 3:c.b=b.d.n.b+b.d.a.b;}} +function Q6c(a,b,c,d,e){if(dd&&(a.a=d);a.be&&(a.b=e);return a} +function lsd(a){if(JD(a,149)){return esd(BD(a,149))}else if(JD(a,229)){return fsd(BD(a,229))}else if(JD(a,23)){return gsd(BD(a,23))}else{throw vbb(new Wdb(Xte+Fe(new amb(OC(GC(SI,1),Uhe,1,5,[a])))))}} +function mhb(a,b,c,d,e){var f,g,h;f=true;for(g=0;g>>e|c[g+d+1]<>>e;++g}return f} +function zMc(a,b,c,d){var e,f,g;if(b.k==(j0b(),g0b)){for(f=new Sr(ur(R_b(b).a.Kc(),new Sq));Qr(f);){e=BD(Rr(f),17);g=e.c.i.k;if(g==g0b&&a.c.a[e.c.i.c.p]==d&&a.c.a[b.c.p]==c){return true}}}return false} +function mD(a,b){var c,d,e,f;b&=63;c=a.h&Fje;if(b<22){f=c>>>b;e=a.m>>b|c<<22-b;d=a.l>>b|a.m<<22-b}else if(b<44){f=0;e=c>>>b-22;d=a.m>>b-22|a.h<<44-b}else{f=0;e=0;d=c>>>b-44}return TC(d&Eje,e&Eje,f&Fje)} +function Iic(a,b,c,d){var e;this.b=d;this.e=a==(rGc(),pGc);e=b[c];this.d=IC(sbb,[nie,dle],[177,25],16,[e.length,e.length],2);this.a=IC(WD,[nie,oje],[48,25],15,[e.length,e.length],2);this.c=new sic(b,c)} +function ljc(a){var b,c,d;a.k=new Ki((Ucd(),OC(GC(F1,1),bne,61,0,[Scd,Acd,zcd,Rcd,Tcd])).length,a.j.c.length);for(d=new olb(a.j);d.a=c){K9b(a,b,d.p);return true}}return false} +function Iod(a){var b;if((a.Db&64)!=0)return fld(a);b=new Wfb(dte);!a.a||Qfb(Qfb((b.a+=' "',b),a.a),'"');Qfb(Lfb(Qfb(Lfb(Qfb(Lfb(Qfb(Lfb((b.a+=' (',b),a.i),','),a.j),' | '),a.g),','),a.f),')');return b.a} +function Z2d(a,b,c){var d,e,f,g,h;h=S6d(a.e.Tg(),b);e=BD(a.g,119);d=0;for(g=0;gc){return Jb(a,c,'start index')}if(b<0||b>c){return Jb(b,c,'end index')}return hc('end index (%s) must not be less than start index (%s)',OC(GC(SI,1),Uhe,1,5,[meb(b),meb(a)]))} +function Pz(b,c){var d,e,f,g;for(e=0,f=b.length;e0&&iCc(a,f,c))}}b.p=0} +function p5c(a){var b;this.c=new Psb;this.f=a.e;this.e=a.d;this.i=a.g;this.d=a.c;this.b=a.b;this.k=a.j;this.a=a.a;!a.i?(this.j=(b=BD(gdb(e1),9),new xqb(b,BD(_Bb(b,b.length),9),0))):(this.j=a.i);this.g=a.f} +function Wb(a){var b,c,d,e;b=Kfb(Qfb(new Wfb('Predicates.'),'and'),40);c=true;for(e=new vib(a);e.b0?h[g-1]:KC(OQ,kne,10,0,0,1);e=h[g];j=g=0?a.Bh(e):vid(a,d)}else{throw vbb(new Wdb(ite+d.ne()+jte))}}else{eid(a,c,d)}} +function aqd(a){var b,c;c=null;b=false;if(JD(a,204)){b=true;c=BD(a,204).a}if(!b){if(JD(a,258)){b=true;c=''+BD(a,258).a}}if(!b){if(JD(a,483)){b=true;c=''+BD(a,483).a}}if(!b){throw vbb(new vcb(Ute))}return c} +function ORd(a,b){var c,d;if(a.f){while(b.Ob()){c=BD(b.Pb(),72);d=c.ak();if(JD(d,99)&&(BD(d,18).Bb&ote)!=0&&(!a.e||d.Gj()!=x2||d.aj()!=0)&&c.dd()!=null){b.Ub();return true}}return false}else{return b.Ob()}} +function QRd(a,b){var c,d;if(a.f){while(b.Sb()){c=BD(b.Ub(),72);d=c.ak();if(JD(d,99)&&(BD(d,18).Bb&ote)!=0&&(!a.e||d.Gj()!=x2||d.aj()!=0)&&c.dd()!=null){b.Pb();return true}}return false}else{return b.Sb()}} +function I2d(a,b,c){var d,e,f,g,h,i;i=S6d(a.e.Tg(),b);d=0;h=a.i;e=BD(a.g,119);for(g=0;g1&&(b.c[b.c.length]=f,true)}} +function TJc(a){var b,c,d,e;c=new Psb;ye(c,a.o);d=new twb;while(c.b!=0){b=BD(c.b==0?null:(sCb(c.b!=0),Nsb(c,c.a.a)),508);e=KJc(a,b,true);e&&Ekb(d.a,b)}while(d.a.c.length!=0){b=BD(rwb(d),508);KJc(a,b,false)}} +function _5c(){_5c=ccb;$5c=new a6c(ole,0);T5c=new a6c('BOOLEAN',1);X5c=new a6c('INT',2);Z5c=new a6c('STRING',3);U5c=new a6c('DOUBLE',4);V5c=new a6c('ENUM',5);W5c=new a6c('ENUMSET',6);Y5c=new a6c('OBJECT',7)} +function H6c(a,b){var c,d,e,f,g;d=$wnd.Math.min(a.c,b.c);f=$wnd.Math.min(a.d,b.d);e=$wnd.Math.max(a.c+a.b,b.c+b.b);g=$wnd.Math.max(a.d+a.a,b.d+b.a);if(e=(e/2|0)){this.e=!d?null:d.c;this.d=e;while(c++0){uu(this)}}this.b=b;this.a=null} +function rEb(a,b){var c,d;b.a?sEb(a,b):(c=BD(Exb(a.b,b.b),57),!!c&&c==a.a[b.b.f]&&!!c.a&&c.a!=b.b.a&&c.c.Fc(b.b),d=BD(Dxb(a.b,b.b),57),!!d&&a.a[d.f]==b.b&&!!d.a&&d.a!=b.b.a&&b.b.c.Fc(d),Fxb(a.b,b.b),undefined)} +function FJb(a,b){var c,d;c=BD(Mpb(a.b,b),124);if(BD(BD(Qc(a.r,b),21),84).dc()){c.n.b=0;c.n.c=0;return}c.n.b=a.C.b;c.n.c=a.C.c;a.A.Hc((tdd(),sdd))&&KJb(a,b);d=JJb(a,b);KIb(a,b)==(Tbd(),Qbd)&&(d+=2*a.w);c.a.a=d} +function OKb(a,b){var c,d;c=BD(Mpb(a.b,b),124);if(BD(BD(Qc(a.r,b),21),84).dc()){c.n.d=0;c.n.a=0;return}c.n.d=a.C.d;c.n.a=a.C.a;a.A.Hc((tdd(),sdd))&&SKb(a,b);d=RKb(a,b);KIb(a,b)==(Tbd(),Qbd)&&(d+=2*a.w);c.a.b=d} +function cOb(a,b){var c,d,e,f;f=new Rkb;for(d=new olb(b);d.ac.a&&(d.Hc((i8c(),c8c))?(e=(b.a-c.a)/2):d.Hc(e8c)&&(e=b.a-c.a));b.b>c.b&&(d.Hc((i8c(),g8c))?(f=(b.b-c.b)/2):d.Hc(f8c)&&(f=b.b-c.b));Efd(a,e,f)} +function aod(a,b,c,d,e,f,g,h,i,j,k,l,m){JD(a.Cb,88)&&XMd($Kd(BD(a.Cb,88)),4);pnd(a,c);a.f=g;dJd(a,h);fJd(a,i);ZId(a,j);eJd(a,k);CId(a,l);aJd(a,m);BId(a,true);AId(a,e);a.ok(f);yId(a,b);d!=null&&(a.i=null,_Id(a,d))} +function PRd(a){var b,c;if(a.f){while(a.n>0){b=BD(a.k.Xb(a.n-1),72);c=b.ak();if(JD(c,99)&&(BD(c,18).Bb&ote)!=0&&(!a.e||c.Gj()!=x2||c.aj()!=0)&&b.dd()!=null){return true}else{--a.n}}return false}else{return a.n>0}} +function Jb(a,b,c){if(a<0){return hc(The,OC(GC(SI,1),Uhe,1,5,[c,meb(a)]))}else if(b<0){throw vbb(new Wdb(Vhe+b))}else{return hc('%s (%s) must not be greater than size (%s)',OC(GC(SI,1),Uhe,1,5,[c,meb(a),meb(b)]))}} +function Llb(a,b,c,d,e,f){var g,h,i,j;g=d-c;if(g<7){Ilb(b,c,d,f);return}i=c+e;h=d+e;j=i+(h-i>>1);Llb(b,a,i,j,-e,f);Llb(b,a,j,h,-e,f);if(f.ue(a[j-1],a[j])<=0){while(c=0?a.sh(f,c):uid(a,e,c)}else{throw vbb(new Wdb(ite+e.ne()+jte))}}else{did(a,d,e,c)}} +function q6d(b){var c,d,e,f;d=BD(b,49).qh();if(d){try{e=null;c=nUd((yFd(),xFd),LEd(MEd(d)));if(c){f=c.rh();!!f&&(e=f.Wk(tfb(d.e)))}if(!!e&&e!=b){return q6d(e)}}catch(a){a=ubb(a);if(!JD(a,60))throw vbb(a)}}return b} +function jrb(a,b,c){var d,e,f,g;g=b==null?0:a.b.se(b);e=(d=a.a.get(g),d==null?new Array:d);if(e.length==0){a.a.set(g,e)}else{f=grb(a,b,e);if(f){return f.ed(c)}}NC(e,e.length,new pjb(b,c));++a.c;zpb(a.b);return null} +function YUc(a,b){var c,d;H2c(a.a);K2c(a.a,(PUc(),NUc),NUc);K2c(a.a,OUc,OUc);d=new j3c;e3c(d,OUc,(tVc(),sVc));PD(hkd(b,(ZWc(),LWc)))!==PD((pWc(),mWc))&&e3c(d,OUc,qVc);e3c(d,OUc,rVc);E2c(a.a,d);c=F2c(a.a,b);return c} +function uC(a){if(!a){return OB(),NB}var b=a.valueOf?a.valueOf():a;if(b!==a){var c=qC[typeof b];return c?c(b):xC(typeof b)}else if(a instanceof Array||a instanceof $wnd.Array){return new xB(a)}else{return new fC(a)}} +function RJb(a,b,c){var d,e,f;f=a.o;d=BD(Mpb(a.p,c),244);e=d.i;e.b=gIb(d);e.a=fIb(d);e.b=$wnd.Math.max(e.b,f.a);e.b>f.a&&!b&&(e.b=f.a);e.c=-(e.b-f.a)/2;switch(c.g){case 1:e.d=-e.a;break;case 3:e.d=f.b;}hIb(d);iIb(d)} +function SJb(a,b,c){var d,e,f;f=a.o;d=BD(Mpb(a.p,c),244);e=d.i;e.b=gIb(d);e.a=fIb(d);e.a=$wnd.Math.max(e.a,f.b);e.a>f.b&&!b&&(e.a=f.b);e.d=-(e.a-f.b)/2;switch(c.g){case 4:e.c=-e.b;break;case 2:e.c=f.a;}hIb(d);iIb(d)} +function Jgc(a,b){var c,d,e,f,g;if(b.dc()){return}e=BD(b.Xb(0),128);if(b.gc()==1){Igc(a,e,e,1,0,b);return}c=1;while(c0){try{f=Icb(c,Rie,Ohe)}catch(a){a=ubb(a);if(JD(a,127)){e=a;throw vbb(new rFd(e))}else throw vbb(a)}}d=(!b.a&&(b.a=new z0d(b)),b.a);return f=0?BD(qud(d,f),56):null} +function Ib(a,b){if(a<0){return hc(The,OC(GC(SI,1),Uhe,1,5,['index',meb(a)]))}else if(b<0){throw vbb(new Wdb(Vhe+b))}else{return hc('%s (%s) must be less than size (%s)',OC(GC(SI,1),Uhe,1,5,['index',meb(a),meb(b)]))}} +function Slb(a){var b,c,d,e,f;if(a==null){return Xhe}f=new xwb(She,'[',']');for(c=a,d=0,e=c.length;d0){g=a.c.d;h=a.d.d;e=Y6c(c7c(new f7c(h.a,h.b),g),1/(d+1));f=new f7c(g.a,g.b);for(c=new olb(a.a);c.a=0?a._g(c,true,true):sid(a,e,true),153));BD(d,215).ol(b)}else{throw vbb(new Wdb(ite+b.ne()+jte))}} +function ugb(a){var b,c;if(a>-140737488355328&&a<140737488355328){if(a==0){return 0}b=a<0;b&&(a=-a);c=QD($wnd.Math.floor($wnd.Math.log(a)/0.6931471805599453));(!b||a!=$wnd.Math.pow(2,c))&&++c;return c}return vgb(Cbb(a))} +function QOc(a){var b,c,d,e,f,g,h;f=new zsb;for(c=new olb(a);c.a2&&h.e.b+h.j.b<=2){e=h;d=g}f.a.zc(e,f);e.q=d}return f} +function K5b(a,b){var c,d,e;d=new b0b(a);tNb(d,b);yNb(d,(wtc(),Gsc),b);yNb(d,(Nyc(),Vxc),(dcd(),$bd));yNb(d,mwc,(F7c(),B7c));__b(d,(j0b(),e0b));c=new H0b;F0b(c,d);G0b(c,(Ucd(),Tcd));e=new H0b;F0b(e,d);G0b(e,zcd);return d} +function Spc(a){switch(a.g){case 0:return new fGc((rGc(),oGc));case 1:return new CFc;case 2:return new fHc;default:throw vbb(new Wdb('No implementation is available for the crossing minimizer '+(a.f!=null?a.f:''+a.g)));}} +function tDc(a,b){var c,d,e,f,g;a.c[b.p]=true;Ekb(a.a,b);for(g=new olb(b.j);g.a=f){g.$b()}else{e=g.Kc();for(d=0;d0?zh():g<0&&Bw(a,b,-g);return true}else{return false}} +function fIb(a){var b,c,d,e,f,g,h;h=0;if(a.b==0){g=jIb(a,true);b=0;for(d=g,e=0,f=d.length;e0){h+=c;++b}}b>1&&(h+=a.c*(b-1))}else{h=Mtb(Zzb(OAb(JAb(Plb(a.a),new xIb),new zIb)))}return h>0?h+a.n.d+a.n.a:0} +function gIb(a){var b,c,d,e,f,g,h;h=0;if(a.b==0){h=Mtb(Zzb(OAb(JAb(Plb(a.a),new tIb),new vIb)))}else{g=kIb(a,true);b=0;for(d=g,e=0,f=d.length;e0){h+=c;++b}}b>1&&(h+=a.c*(b-1))}return h>0?h+a.n.b+a.n.c:0} +function MJb(a,b){var c,d,e,f;f=BD(Mpb(a.b,b),124);c=f.a;for(e=BD(BD(Qc(a.r,b),21),84).Kc();e.Ob();){d=BD(e.Pb(),111);!!d.c&&(c.a=$wnd.Math.max(c.a,ZHb(d.c)))}if(c.a>0){switch(b.g){case 2:f.n.c=a.s;break;case 4:f.n.b=a.s;}}} +function NQb(a,b){var c,d,e;c=BD(vNb(b,(wSb(),oSb)),19).a-BD(vNb(a,oSb),19).a;if(c==0){d=c7c(R6c(BD(vNb(a,(HSb(),DSb)),8)),BD(vNb(a,ESb),8));e=c7c(R6c(BD(vNb(b,DSb),8)),BD(vNb(b,ESb),8));return Kdb(d.a*d.b,e.a*e.b)}return c} +function iRc(a,b){var c,d,e;c=BD(vNb(b,(JTc(),ETc)),19).a-BD(vNb(a,ETc),19).a;if(c==0){d=c7c(R6c(BD(vNb(a,(mTc(),VSc)),8)),BD(vNb(a,WSc),8));e=c7c(R6c(BD(vNb(b,VSc),8)),BD(vNb(b,WSc),8));return Kdb(d.a*d.b,e.a*e.b)}return c} +function TZb(a){var b,c;c=new Ufb;c.a+='e_';b=KZb(a);b!=null&&(c.a+=''+b,c);if(!!a.c&&!!a.d){Qfb((c.a+=' ',c),C0b(a.c));Qfb(Pfb((c.a+='[',c),a.c.i),']');Qfb((c.a+=gne,c),C0b(a.d));Qfb(Pfb((c.a+='[',c),a.d.i),']')}return c.a} +function zRc(a){switch(a.g){case 0:return new lUc;case 1:return new sUc;case 2:return new CUc;case 3:return new IUc;default:throw vbb(new Wdb('No implementation is available for the layout phase '+(a.f!=null?a.f:''+a.g)));}} +function mfd(a,b,c,d,e){var f;f=0;switch(e.g){case 1:f=$wnd.Math.max(0,b.b+a.b-(c.b+d));break;case 3:f=$wnd.Math.max(0,-a.b-d);break;case 2:f=$wnd.Math.max(0,-a.a-d);break;case 4:f=$wnd.Math.max(0,b.a+a.a-(c.a+d));}return f} +function mqd(a,b,c){var d,e,f,g,h;if(c){e=c.a.length;d=new Yge(e);for(h=(d.b-d.a)*d.c<0?(Xge(),Wge):new she(d);h.Ob();){g=BD(h.Pb(),19);f=Zpd(c,g.a);Lte in f.a||Mte in f.a?$qd(a,f,b):erd(a,f,b);otd(BD(Ohb(a.b,Wpd(f)),79))}}} +function LJd(a){var b,c;switch(a.b){case -1:{return true}case 0:{c=a.t;if(c>1||c==-1){a.b=-1;return true}else{b=wId(a);if(!!b&&(Q6d(),b.Cj()==Bve)){a.b=-1;return true}else{a.b=1;return false}}}default:case 1:{return false}}} +function k1d(a,b){var c,d,e,f,g;d=(!b.s&&(b.s=new cUd(t5,b,21,17)),b.s);f=null;for(e=0,g=d.i;e=0&&f=0?a._g(c,true,true):sid(a,e,true),153));return BD(d,215).ll(b)}else{throw vbb(new Wdb(ite+b.ne()+lte))}} +function BZd(){tZd();var a;if(sZd)return BD(nUd((yFd(),xFd),_ve),1939);rEd(CK,new J_d);CZd();a=BD(JD(Phb((yFd(),xFd),_ve),547)?Phb(xFd,_ve):new AZd,547);sZd=true;yZd(a);zZd(a);Rhb((JFd(),IFd),a,new EZd);Shb(xFd,_ve,a);return a} +function v2d(a,b){var c,d,e,f;a.j=-1;if(oid(a.e)){c=a.i;f=a.i!=0;lud(a,b);d=new pSd(a.e,3,a.c,null,b,c,f);e=b.Qk(a.e,a.c,null);e=h3d(a,b,e);if(!e){Uhd(a.e,d)}else{e.Ei(d);e.Fi()}}else{lud(a,b);e=b.Qk(a.e,a.c,null);!!e&&e.Fi()}} +function rA(a,b){var c,d,e;e=0;d=b[0];if(d>=a.length){return -1}c=(BCb(d,a.length),a.charCodeAt(d));while(c>=48&&c<=57){e=e*10+(c-48);++d;if(d>=a.length){break}c=(BCb(d,a.length),a.charCodeAt(d))}d>b[0]?(b[0]=d):(e=-1);return e} +function vMb(a){var b,c,d,e,f;e=BD(a.a,19).a;f=BD(a.b,19).a;c=e;d=f;b=$wnd.Math.max($wnd.Math.abs(e),$wnd.Math.abs(f));if(e<=0&&e==f){c=0;d=f-1}else{if(e==-b&&f!=b){c=f;d=e;f>=0&&++c}else{c=-f;d=e}}return new vgd(meb(c),meb(d))} +function fNb(a,b,c,d){var e,f,g,h,i,j;for(e=0;e=0&&j>=0&&i=a.i)throw vbb(new qcb(lue+b+mue+a.i));if(c>=a.i)throw vbb(new qcb(nue+c+mue+a.i));d=a.g[c];if(b!=c){b>16);b=d>>16&16;c=16-b;a=a>>b;d=a-256;b=d>>16&8;c+=b;a<<=b;d=a-Rje;b=d>>16&4;c+=b;a<<=b;d=a-oie;b=d>>16&2;c+=b;a<<=b;d=a>>14;b=d&~(d>>1);return c+2-b}} +function $Pb(a){QPb();var b,c,d,e;PPb=new Rkb;OPb=new Lqb;NPb=new Rkb;b=(!a.a&&(a.a=new cUd(E2,a,10,11)),a.a);SPb(b);for(e=new Fyd(b);e.e!=e.i.gc();){d=BD(Dyd(e),33);if(Jkb(PPb,d,0)==-1){c=new Rkb;Ekb(NPb,c);TPb(d,c)}}return NPb} +function BQb(a,b,c){var d,e,f,g;a.a=c.b.d;if(JD(b,352)){e=itd(BD(b,79),false,false);f=ofd(e);d=new FQb(a);reb(f,d);ifd(f,e);b.We((Y9c(),Q8c))!=null&&reb(BD(b.We(Q8c),74),d)}else{g=BD(b,470);g.Hg(g.Dg()+a.a.a);g.Ig(g.Eg()+a.a.b)}} +function _5b(a,b){var c,d,e,f,g,h,i,j;j=Edb(ED(vNb(b,(Nyc(),zyc))));i=a[0].n.a+a[0].o.a+a[0].d.c+j;for(h=1;h=0){return c}h=U6c(c7c(new f7c(g.c+g.b/2,g.d+g.a/2),new f7c(f.c+f.b/2,f.d+f.a/2)));return -(xOb(f,g)-1)*h} +function ufd(a,b,c){var d;MAb(new YAb(null,(!c.a&&(c.a=new cUd(A2,c,6,6)),new Kub(c.a,16))),new Mfd(a,b));MAb(new YAb(null,(!c.n&&(c.n=new cUd(D2,c,1,7)),new Kub(c.n,16))),new Ofd(a,b));d=BD(hkd(c,(Y9c(),Q8c)),74);!!d&&p7c(d,a,b)} +function sid(a,b,c){var d,e,f;f=e1d((O6d(),M6d),a.Tg(),b);if(f){Q6d();BD(f,66).Oj()||(f=_1d(q1d(M6d,f)));e=(d=a.Yg(f),BD(d>=0?a._g(d,true,true):sid(a,f,true),153));return BD(e,215).hl(b,c)}else{throw vbb(new Wdb(ite+b.ne()+lte))}} +function wAd(a,b,c,d){var e,f,g,h,i;e=a.d[b];if(e){f=e.g;i=e.i;if(d!=null){for(h=0;h=c){d=b;j=(i.c+i.a)/2;g=j-c;if(i.c<=j-c){e=new bPc(i.c,g);Dkb(a,d++,e)}h=j+c;if(h<=i.a){f=new bPc(h,i.a);wCb(d,a.c.length);aCb(a.c,d,f)}}} +function u0d(a){var b;if(!a.c&&a.g==null){a.d=a.si(a.f);wtd(a,a.d);b=a.d}else{if(a.g==null){return true}else if(a.i==0){return false}else{b=BD(a.g[a.i-1],47)}}if(b==a.b&&null.km>=null.jm()){Vud(a);return u0d(a)}else{return b.Ob()}} +function KTb(a,b,c){var d,e,f,g,h;h=c;!h&&(h=Ydd(new Zdd,0));Odd(h,Vme,1);aUb(a.c,b);g=EYb(a.a,b);if(g.gc()==1){MTb(BD(g.Xb(0),37),h)}else{f=1/g.gc();for(e=g.Kc();e.Ob();){d=BD(e.Pb(),37);MTb(d,Udd(h,f))}}CYb(a.a,g,b);NTb(b);Qdd(h)} +function qYb(a){this.a=a;if(a.c.i.k==(j0b(),e0b)){this.c=a.c;this.d=BD(vNb(a.c.i,(wtc(),Hsc)),61)}else if(a.d.i.k==e0b){this.c=a.d;this.d=BD(vNb(a.d.i,(wtc(),Hsc)),61)}else{throw vbb(new Wdb('Edge '+a+' is not an external edge.'))}} +function oQd(a,b){var c,d,e;e=a.b;a.b=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,3,e,a.b));if(!b){pnd(a,null);qQd(a,0);pQd(a,null)}else if(b!=a){pnd(a,b.zb);qQd(a,b.d);c=(d=b.c,d==null?b.zb:d);pQd(a,c==null||dfb(c,b.zb)?null:c)}} +function NRd(a){var b,c;if(a.f){while(a.n=g)throw vbb(new Cyd(b,g));e=c[b];if(g==1){d=null}else{d=KC($3,hve,415,g-1,0,1);$fb(c,0,d,0,b);f=g-b-1;f>0&&$fb(c,b+1,d,b,f)}b0d(a,d);a0d(a,b,e);return e} +function m8d(){m8d=ccb;k8d=BD(qud(ZKd((r8d(),q8d).qb),6),34);h8d=BD(qud(ZKd(q8d.qb),3),34);i8d=BD(qud(ZKd(q8d.qb),4),34);j8d=BD(qud(ZKd(q8d.qb),5),18);XId(k8d);XId(h8d);XId(i8d);XId(j8d);l8d=new amb(OC(GC(t5,1),Mve,170,0,[k8d,h8d]))} +function AJb(a,b){var c;this.d=new H_b;this.b=b;this.e=new g7c(b.qf());c=a.u.Hc((rcd(),ocd));a.u.Hc(ncd)?a.D?(this.a=c&&!b.If()):(this.a=true):a.u.Hc(pcd)?c?(this.a=!(b.zf().Kc().Ob()||b.Bf().Kc().Ob())):(this.a=false):(this.a=false)} +function IKb(a,b){var c,d,e,f;c=a.o.a;for(f=BD(BD(Qc(a.r,b),21),84).Kc();f.Ob();){e=BD(f.Pb(),111);e.e.a=(d=e.b,d.Xe((Y9c(),s9c))?d.Hf()==(Ucd(),Tcd)?-d.rf().a-Edb(ED(d.We(s9c))):c+Edb(ED(d.We(s9c))):d.Hf()==(Ucd(),Tcd)?-d.rf().a:c)}} +function Q1b(a,b){var c,d,e,f;c=BD(vNb(a,(Nyc(),Lwc)),103);f=BD(hkd(b,$xc),61);e=BD(vNb(a,Vxc),98);if(e!=(dcd(),bcd)&&e!=ccd){if(f==(Ucd(),Scd)){f=lfd(b,c);f==Scd&&(f=Zcd(c))}}else{d=M1b(b);d>0?(f=Zcd(c)):(f=Wcd(Zcd(c)))}jkd(b,$xc,f)} +function olc(a,b){var c,d,e,f,g;g=a.j;b.a!=b.b&&Okb(g,new Ulc);e=g.c.length/2|0;for(d=0;d0&&WGc(a,c,b);return f}else if(d.a!=null){WGc(a,b,c);return -1}else if(e.a!=null){WGc(a,c,b);return 1}return 0} +function swd(a,b){var c,d,e,f;if(a.ej()){c=a.Vi();f=a.fj();++a.j;a.Hi(c,a.oi(c,b));d=a.Zi(3,null,b,c,f);if(a.bj()){e=a.cj(b,null);if(!e){a.$i(d)}else{e.Ei(d);e.Fi()}}else{a.$i(d)}}else{Bvd(a,b);if(a.bj()){e=a.cj(b,null);!!e&&e.Fi()}}} +function D2d(a,b){var c,d,e,f,g;g=S6d(a.e.Tg(),b);e=new yud;c=BD(a.g,119);for(f=a.i;--f>=0;){d=c[f];g.rl(d.ak())&&wtd(e,d)}!Yxd(a,e)&&oid(a.e)&&GLd(a,b.$j()?H2d(a,6,b,(mmb(),jmb),null,-1,false):H2d(a,b.Kj()?2:1,b,null,null,-1,false))} +function Dhb(){Dhb=ccb;var a,b;Bhb=KC(cJ,nie,91,32,0,1);Chb=KC(cJ,nie,91,32,0,1);a=1;for(b=0;b<=18;b++){Bhb[b]=ghb(a);Chb[b]=ghb(Nbb(a,b));a=Ibb(a,5)}for(;bg){return false}}if(b.q){d=b.C;g=d.c.c.a-d.o.a/2;e=d.n.a-c;if(e>g){return false}}return true} +function wcc(a,b){var c;Odd(b,'Partition preprocessing',1);c=BD(GAb(JAb(LAb(JAb(new YAb(null,new Kub(a.a,16)),new Acc),new Ccc),new Ecc),Byb(new fzb,new dzb,new Ezb,OC(GC(xL,1),Kie,132,0,[(Fyb(),Dyb)]))),15);MAb(c.Oc(),new Gcc);Qdd(b)} +function DMc(a){wMc();var b,c,d,e,f,g,h;c=new $rb;for(e=new olb(a.e.b);e.a1?(a.e*=Edb(a.a)):(a.f/=Edb(a.a));DOb(a);EOb(a);AOb(a);yNb(a.b,(CPb(),uPb),a.g)} +function Y5b(a,b,c){var d,e,f,g,h,i;d=0;i=c;if(!b){d=c*(a.c.length-1);i*=-1}for(f=new olb(a);f.a=0){if(!b){b=new Ifb;d>0&&Efb(b,a.substr(0,d))}b.a+='\\';Afb(b,c&aje)}else !!b&&Afb(b,c&aje)}return b?b.a:a} +function l5c(a){var b;if(!a.a){throw vbb(new Zdb('IDataType class expected for layout option '+a.f))}b=gvd(a.a);if(b==null){throw vbb(new Zdb("Couldn't create new instance of property '"+a.f+"'. "+ise+(fdb(Y3),Y3.k)+jse))}return BD(b,414)} +function aid(a){var b,c,d,e,f;f=a.eh();if(f){if(f.kh()){e=xid(a,f);if(e!=f){c=a.Vg();d=(b=a.Vg(),b>=0?a.Qg(null):a.eh().ih(a,-1-b,null,null));a.Rg(BD(e,49),c);!!d&&d.Fi();a.Lg()&&a.Mg()&&c>-1&&Uhd(a,new nSd(a,9,c,f,e));return e}}}return f} +function nTb(a){var b,c,d,e,f,g,h,i;g=0;f=a.f.e;for(d=0;d>5;if(e>=a.d){return a.e<0}c=a.a[e];b=1<<(b&31);if(a.e<0){d=Mgb(a);if(e>16)),15).Xc(f);if(h0){!(fad(a.a.c)&&b.n.d)&&!(gad(a.a.c)&&b.n.b)&&(b.g.d+=$wnd.Math.max(0,d/2-0.5));!(fad(a.a.c)&&b.n.a)&&!(gad(a.a.c)&&b.n.c)&&(b.g.a-=d-1)}}} +function N3b(a){var b,c,d,e,f;e=new Rkb;f=O3b(a,e);b=BD(vNb(a,(wtc(),gtc)),10);if(b){for(d=new olb(b.j);d.a>b;f=a.m>>b|c<<22-b;e=a.l>>b|a.m<<22-b}else if(b<44){g=d?Fje:0;f=c>>b-22;e=a.m>>b-22|c<<44-b}else{g=d?Fje:0;f=d?Eje:0;e=c>>b-44}return TC(e&Eje,f&Eje,g&Fje)} +function XOb(a){var b,c,d,e,f,g;this.c=new Rkb;this.d=a;d=Pje;e=Pje;b=Qje;c=Qje;for(g=Jsb(a,0);g.b!=g.d.c;){f=BD(Xsb(g),8);d=$wnd.Math.min(d,f.a);e=$wnd.Math.min(e,f.b);b=$wnd.Math.max(b,f.a);c=$wnd.Math.max(c,f.b)}this.a=new J6c(d,e,b-d,c-e)} +function Dac(a,b){var c,d,e,f,g,h;for(f=new olb(a.b);f.a0&&JD(b,42)){a.a.qj();j=BD(b,42);i=j.cd();f=i==null?0:tb(i);g=DAd(a.a,f);c=a.a.d[g];if(c){d=BD(c.g,367);k=c.i;for(h=0;h=2){c=e.Kc();b=ED(c.Pb());while(c.Ob()){f=b;b=ED(c.Pb());d=$wnd.Math.min(d,(uCb(b),b)-(uCb(f),f))}}return d} +function gUc(a,b){var c,d,e,f,g;d=new Psb;Gsb(d,b,d.c.b,d.c);do{c=(sCb(d.b!=0),BD(Nsb(d,d.a.a),86));a.b[c.g]=1;for(f=Jsb(c.d,0);f.b!=f.d.c;){e=BD(Xsb(f),188);g=e.c;a.b[g.g]==1?Dsb(a.a,e):a.b[g.g]==2?(a.b[g.g]=1):Gsb(d,g,d.c.b,d.c)}}while(d.b!=0)} +function Ju(a,b){var c,d,e;if(PD(b)===PD(Qb(a))){return true}if(!JD(b,15)){return false}d=BD(b,15);e=a.gc();if(e!=d.gc()){return false}if(JD(d,54)){for(c=0;c0&&(e=c);for(g=new olb(a.f.e);g.a0){b-=1;c-=1}else{if(d>=0&&e<0){b+=1;c+=1}else{if(d>0&&e>=0){b-=1;c+=1}else{b+=1;c-=1}}}}}return new vgd(meb(b),meb(c))} +function PIc(a,b){if(a.cb.c){return 1}else if(a.bb.b){return 1}else if(a.a!=b.a){return tb(a.a)-tb(b.a)}else if(a.d==(UIc(),TIc)&&b.d==SIc){return -1}else if(a.d==SIc&&b.d==TIc){return 1}return 0} +function aNc(a,b){var c,d,e,f,g;f=b.a;f.c.i==b.b?(g=f.d):(g=f.c);f.c.i==b.b?(d=f.c):(d=f.d);e=NLc(a.a,g,d);if(e>0&&e0}else if(e<0&&-e0}return false} +function RZc(a,b,c,d){var e,f,g,h,i,j,k,l;e=(b-a.d)/a.c.c.length;f=0;a.a+=c;a.d=b;for(l=new olb(a.c);l.a>24}return g} +function vdb(a){if(a.pe()){var b=a.c;b.qe()?(a.o='['+b.n):!b.pe()?(a.o='[L'+b.ne()+';'):(a.o='['+b.ne());a.b=b.me()+'[]';a.k=b.oe()+'[]';return}var c=a.j;var d=a.d;d=d.split('/');a.o=ydb('.',[c,ydb('$',d)]);a.b=ydb('.',[c,ydb('.',d)]);a.k=d[d.length-1]} +function qGb(a,b){var c,d,e,f,g;g=null;for(f=new olb(a.e.a);f.a=0;b-=2){for(c=0;c<=b;c+=2){if(a.b[c]>a.b[c+2]||a.b[c]===a.b[c+2]&&a.b[c+1]>a.b[c+3]){d=a.b[c+2];a.b[c+2]=a.b[c];a.b[c]=d;d=a.b[c+3];a.b[c+3]=a.b[c+1];a.b[c+1]=d}}}a.c=true} +function UUb(a,b){var c,d,e,f,g,h,i,j;g=b==1?KUb:JUb;for(f=g.a.ec().Kc();f.Ob();){e=BD(f.Pb(),103);for(i=BD(Qc(a.f.c,e),21).Kc();i.Ob();){h=BD(i.Pb(),46);d=BD(h.b,81);j=BD(h.a,189);c=j.c;switch(e.g){case 2:case 1:d.g.d+=c;break;case 4:case 3:d.g.c+=c;}}}} +function PFc(a,b){var c,d,e,f,g,h,i,j,k;j=-1;k=0;for(g=a,h=0,i=g.length;h0&&++k}}++j}return k} +function Eid(a){var b,c;c=new Wfb(hdb(a.gm));c.a+='@';Qfb(c,(b=tb(a)>>>0,b.toString(16)));if(a.kh()){c.a+=' (eProxyURI: ';Pfb(c,a.qh());if(a.$g()){c.a+=' eClass: ';Pfb(c,a.$g())}c.a+=')'}else if(a.$g()){c.a+=' (eClass: ';Pfb(c,a.$g());c.a+=')'}return c.a} +function TDb(a){var b,c,d,e;if(a.e){throw vbb(new Zdb((fdb(TM),Jke+TM.k+Kke)))}a.d==(ead(),cad)&&SDb(a,aad);for(c=new olb(a.a.a);c.a>24}return c} +function lKb(a,b,c){var d,e,f;e=BD(Mpb(a.i,b),306);if(!e){e=new bIb(a.d,b,c);Npb(a.i,b,e);if(sJb(b)){CHb(a.a,b.c,b.b,e)}else{f=rJb(b);d=BD(Mpb(a.p,f),244);switch(f.g){case 1:case 3:e.j=true;lIb(d,b.b,e);break;case 4:case 2:e.k=true;lIb(d,b.c,e);}}}return e} +function r3d(a,b,c,d){var e,f,g,h,i,j;h=new yud;i=S6d(a.e.Tg(),b);e=BD(a.g,119);Q6d();if(BD(b,66).Oj()){for(g=0;g=0){return e}else{f=1;for(h=new olb(b.j);h.a0&&b.ue((tCb(e-1,a.c.length),BD(a.c[e-1],10)),f)>0){Nkb(a,e,(tCb(e-1,a.c.length),BD(a.c[e-1],10)));--e}tCb(e,a.c.length);a.c[e]=f}c.a=new Lqb;c.b=new Lqb} +function n5c(a,b,c){var d,e,f,g,h,i,j,k;k=(d=BD(b.e&&b.e(),9),new xqb(d,BD(_Bb(d,d.length),9),0));i=mfb(c,'[\\[\\]\\s,]+');for(f=i,g=0,h=f.length;g0){!(fad(a.a.c)&&b.n.d)&&!(gad(a.a.c)&&b.n.b)&&(b.g.d-=$wnd.Math.max(0,d/2-0.5));!(fad(a.a.c)&&b.n.a)&&!(gad(a.a.c)&&b.n.c)&&(b.g.a+=$wnd.Math.max(0,d-1))}}} +function Hac(a,b,c){var d,e;if((a.c-a.b&a.a.length-1)==2){if(b==(Ucd(),Acd)||b==zcd){xac(BD(bkb(a),15),(rbd(),nbd));xac(BD(bkb(a),15),obd)}else{xac(BD(bkb(a),15),(rbd(),obd));xac(BD(bkb(a),15),nbd)}}else{for(e=new xkb(a);e.a!=e.b;){d=BD(vkb(e),15);xac(d,c)}}} +function htd(a,b){var c,d,e,f,g,h,i;e=Nu(new qtd(a));h=new Bib(e,e.c.length);f=Nu(new qtd(b));i=new Bib(f,f.c.length);g=null;while(h.b>0&&i.b>0){c=(sCb(h.b>0),BD(h.a.Xb(h.c=--h.b),33));d=(sCb(i.b>0),BD(i.a.Xb(i.c=--i.b),33));if(c==d){g=c}else{break}}return g} +function Cub(a,b){var c,d,e,f,g,h;f=a.a*kke+a.b*1502;h=a.b*kke+11;c=$wnd.Math.floor(h*lke);f+=c;h-=c*mke;f%=mke;a.a=f;a.b=h;if(b<=24){return $wnd.Math.floor(a.a*wub[b])}else{e=a.a*(1<=2147483648&&(d-=Zje);return d}} +function Zic(a,b,c){var d,e,f,g;if(bjc(a,b)>bjc(a,c)){d=V_b(c,(Ucd(),zcd));a.d=d.dc()?0:B0b(BD(d.Xb(0),11));g=V_b(b,Tcd);a.b=g.dc()?0:B0b(BD(g.Xb(0),11))}else{e=V_b(c,(Ucd(),Tcd));a.d=e.dc()?0:B0b(BD(e.Xb(0),11));f=V_b(b,zcd);a.b=f.dc()?0:B0b(BD(f.Xb(0),11))}} +function l6d(a){var b,c,d,e,f,g,h;if(a){b=a.Hh(_ve);if(b){g=GD(AAd((!b.b&&(b.b=new sId((jGd(),fGd),x6,b)),b.b),'conversionDelegates'));if(g!=null){h=new Rkb;for(d=mfb(g,'\\w+'),e=0,f=d.length;ea.c){break}else if(e.a>=a.s){f<0&&(f=g);h=g}}i=(a.s+a.c)/2;if(f>=0){d=NOc(a,b,f,h);i=$Oc((tCb(d,b.c.length),BD(b.c[d],329)));YOc(b,d,c)}return i} +function lZc(){lZc=ccb;RYc=new Osd((Y9c(),r8c),1.3);VYc=I8c;gZc=new q0b(15);fZc=new Osd(f9c,gZc);jZc=new Osd(T9c,15);SYc=w8c;_Yc=Y8c;aZc=_8c;bZc=b9c;$Yc=W8c;cZc=e9c;hZc=x9c;eZc=(OYc(),KYc);ZYc=IYc;dZc=JYc;iZc=MYc;WYc=HYc;XYc=O8c;YYc=P8c;UYc=GYc;TYc=FYc;kZc=NYc} +function Bnd(a,b,c){var d,e,f,g,h,i,j;g=(f=new RHd,f);PHd(g,(uCb(b),b));j=(!g.b&&(g.b=new sId((jGd(),fGd),x6,g)),g.b);for(i=1;i0&&JPb(this,e)}} +function IQb(a,b,c,d,e,f){var g,h,i;if(!e[b.b]){e[b.b]=true;g=d;!g&&(g=new kRb);Ekb(g.e,b);for(i=f[b.b].Kc();i.Ob();){h=BD(i.Pb(),282);if(h.d==c||h.c==c){continue}h.c!=b&&IQb(a,h.c,b,g,e,f);h.d!=b&&IQb(a,h.d,b,g,e,f);Ekb(g.c,h);Gkb(g.d,h.b)}return g}return null} +function e4b(a){var b,c,d,e,f,g,h;b=0;for(e=new olb(a.e);e.a=2} +function gec(a,b){var c,d,e,f;Odd(b,'Self-Loop pre-processing',1);for(d=new olb(a.a);d.a1){return false}b=qqb(zbd,OC(GC(B1,1),Kie,93,0,[ybd,Bbd]));if(Ox(Cx(b,a))>1){return false}d=qqb(Gbd,OC(GC(B1,1),Kie,93,0,[Fbd,Ebd]));if(Ox(Cx(d,a))>1){return false}return true} +function U0d(a,b){var c,d,e;c=b.Hh(a.a);if(c){e=GD(AAd((!c.b&&(c.b=new sId((jGd(),fGd),x6,c)),c.b),'affiliation'));if(e!=null){d=kfb(e,wfb(35));return d==-1?l1d(a,u1d(a,bKd(b.Hj())),e):d==0?l1d(a,null,e.substr(1)):l1d(a,e.substr(0,d),e.substr(d+1))}}return null} +function ic(b){var c,d,e;try{return b==null?Xhe:fcb(b)}catch(a){a=ubb(a);if(JD(a,102)){c=a;e=hdb(rb(b))+'@'+(d=(Zfb(),kCb(b))>>>0,d.toString(16));tyb(xyb(),($xb(),'Exception during lenientFormat for '+e),c);return '<'+e+' threw '+hdb(c.gm)+'>'}else throw vbb(a)}} +function mzc(a){switch(a.g){case 0:return new xDc;case 1:return new ZCc;case 2:return new DCc;case 3:return new QCc;case 4:return new LDc;case 5:return new iDc;default:throw vbb(new Wdb('No implementation is available for the layerer '+(a.f!=null?a.f:''+a.g)));}} +function AQc(a,b,c){var d,e,f;for(f=new olb(a.t);f.a0){d.b.n-=d.c;d.b.n<=0&&d.b.u>0&&Dsb(b,d.b)}}for(e=new olb(a.i);e.a0){d.a.u-=d.c;d.a.u<=0&&d.a.n>0&&Dsb(c,d.a)}}} +function Vud(a){var b,c,d,e,f;if(a.g==null){a.d=a.si(a.f);wtd(a,a.d);if(a.c){f=a.f;return f}}b=BD(a.g[a.i-1],47);e=b.Pb();a.e=b;c=a.si(e);if(c.Ob()){a.d=c;wtd(a,c)}else{a.d=null;while(!b.Ob()){NC(a.g,--a.i,null);if(a.i==0){break}d=BD(a.g[a.i-1],47);b=d}}return e} +function r2d(a,b){var c,d,e,f,g,h;d=b;e=d.ak();if(T6d(a.e,e)){if(e.hi()&&E2d(a,e,d.dd())){return false}}else{h=S6d(a.e.Tg(),e);c=BD(a.g,119);for(f=0;f1||c>1){return 2}}if(b+c==1){return 2}return 0} +function WQb(a,b,c){var d,e,f,g,h;Odd(c,'ELK Force',1);Ccb(DD(hkd(b,(wSb(),jSb))))||$Cb((d=new _Cb((Pgd(),new bhd(b))),d));h=TQb(b);XQb(h);YQb(a,BD(vNb(h,fSb),424));g=LQb(a.a,h);for(f=g.Kc();f.Ob();){e=BD(f.Pb(),231);tRb(a.b,e,Udd(c,1/g.gc()))}h=KQb(g);SQb(h);Qdd(c)} +function yoc(a,b){var c,d,e,f,g;Odd(b,'Breaking Point Processor',1);xoc(a);if(Ccb(DD(vNb(a,(Nyc(),Jyc))))){for(e=new olb(a.b);e.a=0?a._g(d,true,true):sid(a,f,true),153));BD(e,215).ml(b,c)}else{throw vbb(new Wdb(ite+b.ne()+jte))}} +function ROc(a,b){var c,d,e,f,g;c=new Rkb;e=LAb(new YAb(null,new Kub(a,16)),new iPc);f=LAb(new YAb(null,new Kub(a,16)),new kPc);g=aAb(_zb(OAb(ty(OC(GC(xM,1),Uhe,833,0,[e,f])),new mPc)));for(d=1;d=2*b&&Ekb(c,new bPc(g[d-1]+b,g[d]-b))}return c} +function AXc(a,b,c){Odd(c,'Eades radial',1);c.n&&!!b&&Tdd(c,i6d(b),(pgd(),mgd));a.d=BD(hkd(b,(MUc(),LUc)),33);a.c=Edb(ED(hkd(b,(ZWc(),VWc))));a.e=tXc(BD(hkd(b,WWc),293));a.a=gWc(BD(hkd(b,YWc),426));a.b=jXc(BD(hkd(b,RWc),340));BXc(a);c.n&&!!b&&Tdd(c,i6d(b),(pgd(),mgd))} +function Fqd(a,b,c){var d,e,f,g,h,j,k,l;if(c){f=c.a.length;d=new Yge(f);for(h=(d.b-d.a)*d.c<0?(Xge(),Wge):new she(d);h.Ob();){g=BD(h.Pb(),19);e=Zpd(c,g.a);!!e&&(i=null,j=Uqd(a,(k=(Fhd(),l=new ppd,l),!!b&&npd(k,b),k),e),Lkd(j,_pd(e,Vte)),grd(e,j),hrd(e,j),crd(a,e,j))}}} +function UKd(a){var b,c,d,e,f,g;if(!a.j){g=new HPd;b=KKd;f=b.a.zc(a,b);if(f==null){for(d=new Fyd(_Kd(a));d.e!=d.i.gc();){c=BD(Dyd(d),26);e=UKd(c);ytd(g,e);wtd(g,c)}b.a.Bc(a)!=null}vud(g);a.j=new nNd((BD(qud(ZKd((NFd(),MFd).o),11),18),g.i),g.g);$Kd(a).b&=-33}return a.j} +function O9d(a){var b,c,d,e;if(a==null){return null}else{d=Qge(a,true);e=Nwe.length;if(dfb(d.substr(d.length-e,e),Nwe)){c=d.length;if(c==4){b=(BCb(0,d.length),d.charCodeAt(0));if(b==43){return z9d}else if(b==45){return y9d}}else if(c==3){return z9d}}return new Odb(d)}} +function _C(a){var b,c,d;c=a.l;if((c&c-1)!=0){return -1}d=a.m;if((d&d-1)!=0){return -1}b=a.h;if((b&b-1)!=0){return -1}if(b==0&&d==0&&c==0){return -1}if(b==0&&d==0&&c!=0){return ieb(c)}if(b==0&&d!=0&&c==0){return ieb(d)+22}if(b!=0&&d==0&&c==0){return ieb(b)+44}return -1} +function qbc(a,b){var c,d,e,f,g;Odd(b,'Edge joining',1);c=Ccb(DD(vNb(a,(Nyc(),Byc))));for(e=new olb(a.b);e.a1){for(e=new olb(a.a);e.a0);f.a.Xb(f.c=--f.b);Aib(f,e);sCb(f.b3&&EA(a,0,b-3)}} +function cUb(a){var b,c,d,e;if(PD(vNb(a,(Nyc(),axc)))===PD((hbd(),ebd))){return !a.e&&PD(vNb(a,Cwc))!==PD((Xrc(),Urc))}d=BD(vNb(a,Dwc),292);e=Ccb(DD(vNb(a,Hwc)))||PD(vNb(a,Iwc))===PD((Rpc(),Opc));b=BD(vNb(a,Bwc),19).a;c=a.a.c.length;return !e&&d!=(Xrc(),Urc)&&(b==0||b>c)} +function lkc(a){var b,c;c=0;for(;c0){break}}if(c>0&&c0){break}}if(b>0&&c>16!=6&&!!b){if(p6d(a,b))throw vbb(new Wdb(ste+qmd(a)));d=null;!!a.Cb&&(d=(c=a.Db>>16,c>=0?cmd(a,d):a.Cb.ih(a,-1-c,null,d)));!!b&&(d=kid(b,a,6,d));d=bmd(a,b,d);!!d&&d.Fi()}else (a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,6,b,b))} +function npd(a,b){var c,d;if(b!=a.Cb||a.Db>>16!=9&&!!b){if(p6d(a,b))throw vbb(new Wdb(ste+opd(a)));d=null;!!a.Cb&&(d=(c=a.Db>>16,c>=0?lpd(a,d):a.Cb.ih(a,-1-c,null,d)));!!b&&(d=kid(b,a,9,d));d=kpd(a,b,d);!!d&&d.Fi()}else (a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,9,b,b))} +function Rld(a,b){var c,d;if(b!=a.Cb||a.Db>>16!=3&&!!b){if(p6d(a,b))throw vbb(new Wdb(ste+Sld(a)));d=null;!!a.Cb&&(d=(c=a.Db>>16,c>=0?Lld(a,d):a.Cb.ih(a,-1-c,null,d)));!!b&&(d=kid(b,a,12,d));d=Kld(a,b,d);!!d&&d.Fi()}else (a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,3,b,b))} +function VId(b){var c,d,e,f,g;e=wId(b);g=b.j;if(g==null&&!!e){return b.$j()?null:e.zj()}else if(JD(e,148)){d=e.Aj();if(d){f=d.Nh();if(f!=b.i){c=BD(e,148);if(c.Ej()){try{b.g=f.Kh(c,g)}catch(a){a=ubb(a);if(JD(a,78)){b.g=null}else throw vbb(a)}}b.i=f}}return b.g}return null} +function wOb(a){var b;b=new Rkb;Ekb(b,new aDb(new f7c(a.c,a.d),new f7c(a.c+a.b,a.d)));Ekb(b,new aDb(new f7c(a.c,a.d),new f7c(a.c,a.d+a.a)));Ekb(b,new aDb(new f7c(a.c+a.b,a.d+a.a),new f7c(a.c+a.b,a.d)));Ekb(b,new aDb(new f7c(a.c+a.b,a.d+a.a),new f7c(a.c,a.d+a.a)));return b} +function IJc(a,b,c,d){var e,f,g;g=LZb(b,c);d.c[d.c.length]=b;if(a.j[g.p]==-1||a.j[g.p]==2||a.a[b.p]){return d}a.j[g.p]=-1;for(f=new Sr(ur(O_b(g).a.Kc(),new Sq));Qr(f);){e=BD(Rr(f),17);if(!(!OZb(e)&&!(!OZb(e)&&e.c.i.c==e.d.i.c))||e==b){continue}return IJc(a,e,g,d)}return d} +function vQb(a,b,c){var d,e,f;for(f=b.a.ec().Kc();f.Ob();){e=BD(f.Pb(),79);d=BD(Ohb(a.b,e),266);!d&&(Xod(jtd(e))==Xod(ltd(e))?uQb(a,e,c):jtd(e)==Xod(ltd(e))?Ohb(a.c,e)==null&&Ohb(a.b,ltd(e))!=null&&xQb(a,e,c,false):Ohb(a.d,e)==null&&Ohb(a.b,jtd(e))!=null&&xQb(a,e,c,true))}} +function jcc(a,b){var c,d,e,f,g,h,i;for(e=a.Kc();e.Ob();){d=BD(e.Pb(),10);h=new H0b;F0b(h,d);G0b(h,(Ucd(),zcd));yNb(h,(wtc(),ftc),(Bcb(),true));for(g=b.Kc();g.Ob();){f=BD(g.Pb(),10);i=new H0b;F0b(i,f);G0b(i,Tcd);yNb(i,ftc,true);c=new UZb;yNb(c,ftc,true);QZb(c,h);RZb(c,i)}}} +function jnc(a,b,c,d){var e,f,g,h;e=hnc(a,b,c);f=hnc(a,c,b);g=BD(Ohb(a.c,b),112);h=BD(Ohb(a.c,c),112);if(ed.b.g&&(f.c[f.c.length]=d,true)}}return f} +function k$c(){k$c=ccb;g$c=new l$c('CANDIDATE_POSITION_LAST_PLACED_RIGHT',0);f$c=new l$c('CANDIDATE_POSITION_LAST_PLACED_BELOW',1);i$c=new l$c('CANDIDATE_POSITION_WHOLE_DRAWING_RIGHT',2);h$c=new l$c('CANDIDATE_POSITION_WHOLE_DRAWING_BELOW',3);j$c=new l$c('WHOLE_DRAWING',4)} +function Xqd(a,b){if(JD(b,239)){return iqd(a,BD(b,33))}else if(JD(b,186)){return jqd(a,BD(b,118))}else if(JD(b,354)){return hqd(a,BD(b,137))}else if(JD(b,352)){return gqd(a,BD(b,79))}else if(b){return null}else{throw vbb(new Wdb(Xte+Fe(new amb(OC(GC(SI,1),Uhe,1,5,[b])))))}} +function aic(a){var b,c,d,e,f,g,h;f=new Psb;for(e=new olb(a.d.a);e.a1){b=nGb((c=new pGb,++a.b,c),a.d);for(h=Jsb(f,0);h.b!=h.d.c;){g=BD(Xsb(h),121);AFb(DFb(CFb(EFb(BFb(new FFb,1),0),b),g))}}} +function $od(a,b){var c,d;if(b!=a.Cb||a.Db>>16!=11&&!!b){if(p6d(a,b))throw vbb(new Wdb(ste+_od(a)));d=null;!!a.Cb&&(d=(c=a.Db>>16,c>=0?Uod(a,d):a.Cb.ih(a,-1-c,null,d)));!!b&&(d=kid(b,a,10,d));d=Tod(a,b,d);!!d&&d.Fi()}else (a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,11,b,b))} +function uZb(a){var b,c,d,e;for(d=new nib((new eib(a.b)).a);d.b;){c=lib(d);e=BD(c.cd(),11);b=BD(c.dd(),10);yNb(b,(wtc(),$sc),e);yNb(e,gtc,b);yNb(e,Nsc,(Bcb(),true));G0b(e,BD(vNb(b,Hsc),61));vNb(b,Hsc);yNb(e.i,(Nyc(),Vxc),(dcd(),acd));BD(vNb(Q_b(e.i),Ksc),21).Fc((Orc(),Krc))}} +function G4b(a,b,c){var d,e,f,g,h,i;f=0;g=0;if(a.c){for(i=new olb(a.d.i.j);i.af.a){return -1}else if(e.ai){k=a.d;a.d=KC(y4,jve,63,2*i+4,0,1);for(f=0;f=9223372036854775807){return wD(),sD}e=false;if(a<0){e=true;a=-a}d=0;if(a>=Ije){d=QD(a/Ije);a-=d*Ije}c=0;if(a>=Hje){c=QD(a/Hje);a-=c*Hje}b=QD(a);f=TC(b,c,d);e&&ZC(f);return f} +function rKb(a,b){var c,d,e,f;c=!b||!a.u.Hc((rcd(),ncd));f=0;for(e=new olb(a.e.Cf());e.a=-b&&d==b){return new vgd(meb(c-1),meb(d))}return new vgd(meb(c),meb(d-1))} +function W8b(){S8b();return OC(GC(AS,1),Kie,77,0,[Y7b,V7b,Z7b,n8b,G8b,r8b,M8b,w8b,E8b,i8b,A8b,v8b,F8b,e8b,O8b,P7b,z8b,I8b,o8b,H8b,Q8b,C8b,Q7b,D8b,R8b,K8b,P8b,p8b,b8b,q8b,m8b,N8b,T7b,_7b,t8b,S7b,u8b,k8b,f8b,x8b,h8b,W7b,U7b,l8b,g8b,y8b,L8b,R7b,B8b,j8b,s8b,c8b,a8b,J8b,$7b,d8b,X7b])} +function Yic(a,b,c){a.d=0;a.b=0;b.k==(j0b(),i0b)&&c.k==i0b&&BD(vNb(b,(wtc(),$sc)),10)==BD(vNb(c,$sc),10)&&(ajc(b).j==(Ucd(),Acd)?Zic(a,b,c):Zic(a,c,b));b.k==i0b&&c.k==g0b?ajc(b).j==(Ucd(),Acd)?(a.d=1):(a.b=1):c.k==i0b&&b.k==g0b&&(ajc(c).j==(Ucd(),Acd)?(a.b=1):(a.d=1));cjc(a,b,c)} +function esd(a){var b,c,d,e,f,g,h,i,j,k,l;l=hsd(a);b=a.a;i=b!=null;i&&Upd(l,'category',a.a);e=Fhe(new Pib(a.d));g=!e;if(g){j=new wB;cC(l,'knownOptions',j);c=new msd(j);reb(new Pib(a.d),c)}f=Fhe(a.g);h=!f;if(h){k=new wB;cC(l,'supportedFeatures',k);d=new osd(k);reb(a.g,d)}return l} +function ty(a){var b,c,d,e,f,g,h,i,j;d=false;b=336;c=0;f=new Xp(a.length);for(h=a,i=0,j=h.length;i>16!=7&&!!b){if(p6d(a,b))throw vbb(new Wdb(ste+Iod(a)));d=null;!!a.Cb&&(d=(c=a.Db>>16,c>=0?Eod(a,d):a.Cb.ih(a,-1-c,null,d)));!!b&&(d=BD(b,49).gh(a,1,C2,d));d=Dod(a,b,d);!!d&&d.Fi()}else (a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,7,b,b))} +function NHd(a,b){var c,d;if(b!=a.Cb||a.Db>>16!=3&&!!b){if(p6d(a,b))throw vbb(new Wdb(ste+QHd(a)));d=null;!!a.Cb&&(d=(c=a.Db>>16,c>=0?KHd(a,d):a.Cb.ih(a,-1-c,null,d)));!!b&&(d=BD(b,49).gh(a,0,k5,d));d=JHd(a,b,d);!!d&&d.Fi()}else (a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,3,b,b))} +function Ehb(a,b){Dhb();var c,d,e,f,g,h,i,j,k;if(b.d>a.d){h=a;a=b;b=h}if(b.d<63){return Ihb(a,b)}g=(a.d&-2)<<4;j=Rgb(a,g);k=Rgb(b,g);d=yhb(a,Qgb(j,g));e=yhb(b,Qgb(k,g));i=Ehb(j,k);c=Ehb(d,e);f=Ehb(yhb(j,d),yhb(e,k));f=thb(thb(f,i),c);f=Qgb(f,g);i=Qgb(i,g<<1);return thb(thb(i,f),c)} +function aGc(a,b,c){var d,e,f,g,h;g=CHc(a,c);h=KC(OQ,kne,10,b.length,0,1);d=0;for(f=g.Kc();f.Ob();){e=BD(f.Pb(),11);Ccb(DD(vNb(e,(wtc(),Nsc))))&&(h[d++]=BD(vNb(e,gtc),10))}if(d=0;f+=c?1:-1){g=g|b.c.Sf(i,f,c,d&&!Ccb(DD(vNb(b.j,(wtc(),Jsc))))&&!Ccb(DD(vNb(b.j,(wtc(),mtc)))));g=g|b.q._f(i,f,c);g=g|cGc(a,i[f],c,d)}Qqb(a.c,b);return g} +function o3b(a,b,c){var d,e,f,g,h,i,j,k,l,m;for(k=m_b(a.j),l=0,m=k.length;l1&&(a.a=true);ZNb(BD(c.b,65),P6c(R6c(BD(b.b,65).c),Y6c(c7c(R6c(BD(c.b,65).a),BD(b.b,65).a),e)));D1c(a,b);F1c(a,c)}} +function rVb(a){var b,c,d,e,f,g,h;for(f=new olb(a.a.a);f.a0&&f>0?(g.p=b++):d>0?(g.p=c++):f>0?(g.p=e++):(g.p=c++);}}mmb();Okb(a.j,new fcc)} +function Vec(a){var b,c;c=null;b=BD(Ikb(a.g,0),17);do{c=b.d.i;if(wNb(c,(wtc(),Wsc))){return BD(vNb(c,Wsc),11).i}if(c.k!=(j0b(),h0b)&&Qr(new Sr(ur(U_b(c).a.Kc(),new Sq)))){b=BD(Rr(new Sr(ur(U_b(c).a.Kc(),new Sq))),17)}else if(c.k!=h0b){return null}}while(!!c&&c.k!=(j0b(),h0b));return c} +function Omc(a,b){var c,d,e,f,g,h,i,j,k;h=b.j;g=b.g;i=BD(Ikb(h,h.c.length-1),113);k=(tCb(0,h.c.length),BD(h.c[0],113));j=Kmc(a,g,i,k);for(f=1;fj){i=c;k=e;j=d}}b.a=k;b.c=i} +function sEb(a,b){var c,d;d=Axb(a.b,b.b);if(!d){throw vbb(new Zdb('Invalid hitboxes for scanline constraint calculation.'))}(mEb(b.b,BD(Cxb(a.b,b.b),57))||mEb(b.b,BD(Bxb(a.b,b.b),57)))&&(Zfb(),b.b+' has overlap.');a.a[b.b.f]=BD(Exb(a.b,b.b),57);c=BD(Dxb(a.b,b.b),57);!!c&&(a.a[c.f]=b.b)} +function AFb(a){if(!a.a.d||!a.a.e){throw vbb(new Zdb((fdb(fN),fN.k+' must have a source and target '+(fdb(jN),jN.k)+' specified.')))}if(a.a.d==a.a.e){throw vbb(new Zdb('Network simplex does not support self-loops: '+a.a+' '+a.a.d+' '+a.a.e))}NFb(a.a.d.g,a.a);NFb(a.a.e.b,a.a);return a.a} +function HHc(a,b,c){var d,e,f,g,h,i,j;j=new Hxb(new tIc(a));for(g=OC(GC(aR,1),lne,11,0,[b,c]),h=0,i=g.length;hi-a.b&&hi-a.a&&h0&&++n}}}++m}return n} +function hUc(a,b){var c,d,e,f,g;g=BD(vNb(b,(JTc(),FTc)),425);for(f=Jsb(b.b,0);f.b!=f.d.c;){e=BD(Xsb(f),86);if(a.b[e.g]==0){switch(g.g){case 0:iUc(a,e);break;case 1:gUc(a,e);}a.b[e.g]=2}}for(d=Jsb(a.a,0);d.b!=d.d.c;){c=BD(Xsb(d),188);ze(c.b.d,c,true);ze(c.c.b,c,true)}yNb(b,(mTc(),gTc),a.a)} +function S6d(a,b){Q6d();var c,d,e,f;if(!b){return P6d}else if(b==(Q8d(),N8d)||(b==v8d||b==t8d||b==u8d)&&a!=s8d){return new Z6d(a,b)}else{d=BD(b,677);c=d.pk();if(!c){a2d(q1d((O6d(),M6d),b));c=d.pk()}f=(!c.i&&(c.i=new Lqb),c.i);e=BD(Wd(irb(f.f,a)),1942);!e&&Rhb(f,a,e=new Z6d(a,b));return e}} +function Tbc(a,b){var c,d,e,f,g,h,i,j,k;i=BD(vNb(a,(wtc(),$sc)),11);j=l7c(OC(GC(m1,1),nie,8,0,[i.i.n,i.n,i.a])).a;k=a.i.n.b;c=k_b(a.e);for(e=c,f=0,g=e.length;f0){if(f.a){h=f.b.rf().a;if(c>h){e=(c-h)/2;f.d.b=e;f.d.c=e}}else{f.d.c=a.s+c}}else if(tcd(a.u)){d=sfd(f.b);d.c<0&&(f.d.b=-d.c);d.c+d.b>f.b.rf().a&&(f.d.c=d.c+d.b-f.b.rf().a)}}} +function Eec(a,b){var c,d,e,f;Odd(b,'Semi-Interactive Crossing Minimization Processor',1);c=false;for(e=new olb(a.b);e.a=0){if(b==c){return new vgd(meb(-b-1),meb(-b-1))}if(b==-c){return new vgd(meb(-b),meb(c+1))}}if($wnd.Math.abs(b)>$wnd.Math.abs(c)){if(b<0){return new vgd(meb(-b),meb(c))}return new vgd(meb(-b),meb(c+1))}return new vgd(meb(b+1),meb(c))} +function q5b(a){var b,c;c=BD(vNb(a,(Nyc(),mxc)),163);b=BD(vNb(a,(wtc(),Osc)),303);if(c==(Ctc(),ytc)){yNb(a,mxc,Btc);yNb(a,Osc,(esc(),dsc))}else if(c==Atc){yNb(a,mxc,Btc);yNb(a,Osc,(esc(),bsc))}else if(b==(esc(),dsc)){yNb(a,mxc,ytc);yNb(a,Osc,csc)}else if(b==bsc){yNb(a,mxc,Atc);yNb(a,Osc,csc)}} +function FNc(){FNc=ccb;DNc=new RNc;zNc=e3c(new j3c,(qUb(),nUb),(S8b(),o8b));CNc=c3c(e3c(new j3c,nUb,C8b),pUb,B8b);ENc=b3c(b3c(g3c(c3c(e3c(new j3c,lUb,M8b),pUb,L8b),oUb),K8b),N8b);ANc=c3c(e3c(e3c(e3c(new j3c,mUb,r8b),oUb,t8b),oUb,u8b),pUb,s8b);BNc=c3c(e3c(e3c(new j3c,oUb,u8b),oUb,_7b),pUb,$7b)} +function hQc(){hQc=ccb;cQc=e3c(c3c(new j3c,(qUb(),pUb),(S8b(),c8b)),nUb,o8b);gQc=b3c(b3c(g3c(c3c(e3c(new j3c,lUb,M8b),pUb,L8b),oUb),K8b),N8b);dQc=c3c(e3c(e3c(e3c(new j3c,mUb,r8b),oUb,t8b),oUb,u8b),pUb,s8b);fQc=e3c(e3c(new j3c,nUb,C8b),pUb,B8b);eQc=c3c(e3c(e3c(new j3c,oUb,u8b),oUb,_7b),pUb,$7b)} +function GNc(a,b,c,d,e){var f,g;if((!OZb(b)&&b.c.i.c==b.d.i.c||!T6c(l7c(OC(GC(m1,1),nie,8,0,[e.i.n,e.n,e.a])),c))&&!OZb(b)){b.c==e?St(b.a,0,new g7c(c)):Dsb(b.a,new g7c(c));if(d&&!Rqb(a.a,c)){g=BD(vNb(b,(Nyc(),jxc)),74);if(!g){g=new s7c;yNb(b,jxc,g)}f=new g7c(c);Gsb(g,f,g.c.b,g.c);Qqb(a.a,f)}}} +function Qac(a){var b,c;for(c=new Sr(ur(R_b(a).a.Kc(),new Sq));Qr(c);){b=BD(Rr(c),17);if(b.c.i.k!=(j0b(),f0b)){throw vbb(new y2c(Fne+P_b(a)+"' has its layer constraint set to FIRST, but has at least one incoming edge that "+' does not come from a FIRST_SEPARATE node. That must not happen.'))}}} +function vjd(a,b,c){var d,e,f,g,h,i,j;e=aeb(a.Db&254);if(e==0){a.Eb=c}else{if(e==1){h=KC(SI,Uhe,1,2,5,1);f=zjd(a,b);if(f==0){h[0]=c;h[1]=a.Eb}else{h[0]=a.Eb;h[1]=c}}else{h=KC(SI,Uhe,1,e+1,5,1);g=CD(a.Eb);for(d=2,i=0,j=0;d<=128;d<<=1){d==b?(h[j++]=c):(a.Db&d)!=0&&(h[j++]=g[i++])}}a.Eb=h}a.Db|=b} +function ENb(a,b,c){var d,e,f,g;this.b=new Rkb;e=0;d=0;for(g=new olb(a);g.a0){f=BD(Ikb(this.b,0),167);e+=f.o;d+=f.p}e*=2;d*=2;b>1?(e=QD($wnd.Math.ceil(e*b))):(d=QD($wnd.Math.ceil(d/b)));this.a=new pNb(e,d)} +function Igc(a,b,c,d,e,f){var g,h,i,j,k,l,m,n,o,p,q,r;k=d;if(b.j&&b.o){n=BD(Ohb(a.f,b.A),57);p=n.d.c+n.d.b;--k}else{p=b.a.c+b.a.b}l=e;if(c.q&&c.o){n=BD(Ohb(a.f,c.C),57);j=n.d.c;++l}else{j=c.a.c}q=j-p;i=$wnd.Math.max(2,l-k);h=q/i;o=p+h;for(m=k;m=0;g+=e?1:-1){h=b[g];i=d==(Ucd(),zcd)?e?V_b(h,d):Su(V_b(h,d)):e?Su(V_b(h,d)):V_b(h,d);f&&(a.c[h.p]=i.gc());for(l=i.Kc();l.Ob();){k=BD(l.Pb(),11);a.d[k.p]=j++}Gkb(c,i)}} +function aQc(a,b,c){var d,e,f,g,h,i,j,k;f=Edb(ED(a.b.Kc().Pb()));j=Edb(ED(Pq(b.b)));d=Y6c(R6c(a.a),j-c);e=Y6c(R6c(b.a),c-f);k=P6c(d,e);Y6c(k,1/(j-f));this.a=k;this.b=new Rkb;h=true;g=a.b.Kc();g.Pb();while(g.Ob()){i=Edb(ED(g.Pb()));if(h&&i-c>Oqe){this.b.Fc(c);h=false}this.b.Fc(i)}h&&this.b.Fc(c)} +function vGb(a){var b,c,d,e;yGb(a,a.n);if(a.d.c.length>0){Blb(a.c);while(GGb(a,BD(mlb(new olb(a.e.a)),121))>5;b&=31;if(d>=a.d){return a.e<0?(Hgb(),Bgb):(Hgb(),Ggb)}f=a.d-d;e=KC(WD,oje,25,f+1,15,1);mhb(e,f,a.a,d,b);if(a.e<0){for(c=0;c0&&a.a[c]<<32-b!=0){for(c=0;c=0){return false}else{c=e1d((O6d(),M6d),e,b);if(!c){return true}else{d=c.Zj();return (d>1||d==-1)&&$1d(q1d(M6d,c))!=3}}}}else{return false}} +function R1b(a,b,c,d){var e,f,g,h,i;h=atd(BD(qud((!b.b&&(b.b=new y5d(z2,b,4,7)),b.b),0),82));i=atd(BD(qud((!b.c&&(b.c=new y5d(z2,b,5,8)),b.c),0),82));if(Xod(h)==Xod(i)){return null}if(ntd(i,h)){return null}g=Mld(b);if(g==c){return d}else{f=BD(Ohb(a.a,g),10);if(f){e=f.e;if(e){return e}}}return null} +function Cac(a,b){var c;c=BD(vNb(a,(Nyc(),Rwc)),276);Odd(b,'Label side selection ('+c+')',1);switch(c.g){case 0:Dac(a,(rbd(),nbd));break;case 1:Dac(a,(rbd(),obd));break;case 2:Bac(a,(rbd(),nbd));break;case 3:Bac(a,(rbd(),obd));break;case 4:Eac(a,(rbd(),nbd));break;case 5:Eac(a,(rbd(),obd));}Qdd(b)} +function bGc(a,b,c){var d,e,f,g,h,i;d=RFc(c,a.length);g=a[d];if(g[0].k!=(j0b(),e0b)){return}f=SFc(c,g.length);i=b.j;for(e=0;e0){c[0]+=a.d;g-=c[0]}if(c[2]>0){c[2]+=a.d;g-=c[2]}f=$wnd.Math.max(0,g);c[1]=$wnd.Math.max(c[1],g);vHb(a,eHb,e.c+d.b+c[0]-(c[1]-g)/2,c);if(b==eHb){a.c.b=f;a.c.c=e.c+d.b+(f-g)/2}} +function AYb(){this.c=KC(UD,Vje,25,(Ucd(),OC(GC(F1,1),bne,61,0,[Scd,Acd,zcd,Rcd,Tcd])).length,15,1);this.b=KC(UD,Vje,25,OC(GC(F1,1),bne,61,0,[Scd,Acd,zcd,Rcd,Tcd]).length,15,1);this.a=KC(UD,Vje,25,OC(GC(F1,1),bne,61,0,[Scd,Acd,zcd,Rcd,Tcd]).length,15,1);zlb(this.c,Pje);zlb(this.b,Qje);zlb(this.a,Qje)} +function Ufe(a,b,c){var d,e,f,g;if(b<=c){e=b;f=c}else{e=c;f=b}d=0;if(a.b==null){a.b=KC(WD,oje,25,2,15,1);a.b[0]=e;a.b[1]=f;a.c=true}else{d=a.b.length;if(a.b[d-1]+1==e){a.b[d-1]=f;return}g=KC(WD,oje,25,d+2,15,1);$fb(a.b,0,g,0,d);a.b=g;a.b[d-1]>=e&&(a.c=false,a.a=false);a.b[d++]=e;a.b[d]=f;a.c||Yfe(a)}} +function inc(a,b,c){var d,e,f,g,h,i,j;j=b.d;a.a=new Skb(j.c.length);a.c=new Lqb;for(h=new olb(j);h.a=0?a._g(j,false,true):sid(a,c,false),58));n:for(f=l.Kc();f.Ob();){e=BD(f.Pb(),56);for(k=0;k1){Xxd(e,e.i-1)}}return d}} +function Z2b(a,b){var c,d,e,f,g,h,i;Odd(b,'Comment post-processing',1);for(f=new olb(a.b);f.aa.d[g.p]){c+=zHc(a.b,f);Wjb(a.a,meb(f))}}while(!akb(a.a)){xHc(a.b,BD(fkb(a.a),19).a)}}return c} +function o2c(a,b,c){var d,e,f,g;f=(!b.a&&(b.a=new cUd(E2,b,10,11)),b.a).i;for(e=new Fyd((!b.a&&(b.a=new cUd(E2,b,10,11)),b.a));e.e!=e.i.gc();){d=BD(Dyd(e),33);(!d.a&&(d.a=new cUd(E2,d,10,11)),d.a).i==0||(f+=o2c(a,d,false))}if(c){g=Xod(b);while(g){f+=(!g.a&&(g.a=new cUd(E2,g,10,11)),g.a).i;g=Xod(g)}}return f} +function Xxd(a,b){var c,d,e,f;if(a.ej()){d=null;e=a.fj();a.ij()&&(d=a.kj(a.pi(b),null));c=a.Zi(4,f=tud(a,b),null,b,e);if(a.bj()&&f!=null){d=a.dj(f,d);if(!d){a.$i(c)}else{d.Ei(c);d.Fi()}}else{if(!d){a.$i(c)}else{d.Ei(c);d.Fi()}}return f}else{f=tud(a,b);if(a.bj()&&f!=null){d=a.dj(f,null);!!d&&d.Fi()}return f}} +function UKb(a){var b,c,d,e,f,g,h,i,j,k;j=a.a;b=new Tqb;i=0;for(d=new olb(a.d);d.ah.d&&(k=h.d+h.a+j)}}c.c.d=k;b.a.zc(c,b);i=$wnd.Math.max(i,c.c.d+c.c.a)}return i} +function Orc(){Orc=ccb;Frc=new Prc('COMMENTS',0);Hrc=new Prc('EXTERNAL_PORTS',1);Irc=new Prc('HYPEREDGES',2);Jrc=new Prc('HYPERNODES',3);Krc=new Prc('NON_FREE_PORTS',4);Lrc=new Prc('NORTH_SOUTH_PORTS',5);Nrc=new Prc(Wne,6);Erc=new Prc('CENTER_LABELS',7);Grc=new Prc('END_LABELS',8);Mrc=new Prc('PARTITIONS',9)} +function gVc(a){var b,c,d,e,f;e=new Rkb;b=new Vqb((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a));for(d=new Sr(ur(_sd(a).a.Kc(),new Sq));Qr(d);){c=BD(Rr(d),79);if(!JD(qud((!c.b&&(c.b=new y5d(z2,c,4,7)),c.b),0),186)){f=atd(BD(qud((!c.c&&(c.c=new y5d(z2,c,5,8)),c.c),0),82));b.a._b(f)||(e.c[e.c.length]=f,true)}}return e} +function fVc(a){var b,c,d,e,f,g;f=new Tqb;b=new Vqb((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a));for(e=new Sr(ur(_sd(a).a.Kc(),new Sq));Qr(e);){d=BD(Rr(e),79);if(!JD(qud((!d.b&&(d.b=new y5d(z2,d,4,7)),d.b),0),186)){g=atd(BD(qud((!d.c&&(d.c=new y5d(z2,d,5,8)),d.c),0),82));b.a._b(g)||(c=f.a.zc(g,f),c==null)}}return f} +function zA(a,b,c,d,e){if(d<0){d=oA(a,e,OC(GC(ZI,1),nie,2,6,[bje,cje,dje,eje,fje,gje,hje,ije,jje,kje,lje,mje]),b);d<0&&(d=oA(a,e,OC(GC(ZI,1),nie,2,6,['Jan','Feb','Mar','Apr',fje,'Jun','Jul','Aug','Sep','Oct','Nov','Dec']),b));if(d<0){return false}c.k=d;return true}else if(d>0){c.k=d-1;return true}return false} +function BA(a,b,c,d,e){if(d<0){d=oA(a,e,OC(GC(ZI,1),nie,2,6,[bje,cje,dje,eje,fje,gje,hje,ije,jje,kje,lje,mje]),b);d<0&&(d=oA(a,e,OC(GC(ZI,1),nie,2,6,['Jan','Feb','Mar','Apr',fje,'Jun','Jul','Aug','Sep','Oct','Nov','Dec']),b));if(d<0){return false}c.k=d;return true}else if(d>0){c.k=d-1;return true}return false} +function DA(a,b,c,d,e,f){var g,h,i,j;h=32;if(d<0){if(b[0]>=a.length){return false}h=bfb(a,b[0]);if(h!=43&&h!=45){return false}++b[0];d=rA(a,b);if(d<0){return false}h==45&&(d=-d)}if(h==32&&b[0]-c==2&&e.b==2){i=new eB;j=i.q.getFullYear()-nje+nje-80;g=j%100;f.a=d==g;d+=(j/100|0)*100+(d=j&&(i=d)}!!i&&(k=$wnd.Math.max(k,i.a.o.a));if(k>m){l=j;m=k}}return l} +function ode(a,b,c){var d,e,f;a.e=c;a.d=0;a.b=0;a.f=1;a.i=b;(a.e&16)==16&&(a.i=Xee(a.i));a.j=a.i.length;nde(a);f=rde(a);if(a.d!=a.j)throw vbb(new mde(tvd((h0d(),sue))));if(a.g){for(d=0;dvre?Okb(i,a.b):d<=vre&&d>wre?Okb(i,a.d):d<=wre&&d>xre?Okb(i,a.c):d<=xre&&Okb(i,a.a);f=ZXc(a,i,f)}return e} +function Hgb(){Hgb=ccb;var a;Cgb=new Ugb(1,1);Egb=new Ugb(1,10);Ggb=new Ugb(0,0);Bgb=new Ugb(-1,1);Dgb=OC(GC(cJ,1),nie,91,0,[Ggb,Cgb,new Ugb(1,2),new Ugb(1,3),new Ugb(1,4),new Ugb(1,5),new Ugb(1,6),new Ugb(1,7),new Ugb(1,8),new Ugb(1,9),Egb]);Fgb=KC(cJ,nie,91,32,0,1);for(a=0;a1;if(h){d=new f7c(e,c.b);Dsb(b.a,d)}n7c(b.a,OC(GC(m1,1),nie,8,0,[m,l]))} +function jdd(a){r4c(a,new E3c(P3c(M3c(O3c(N3c(new R3c,Rse),'ELK Randomizer'),'Distributes the nodes randomly on the plane, leading to very obfuscating layouts. Can be useful to demonstrate the power of "real" layout algorithms.'),new mdd)));p4c(a,Rse,ame,fdd);p4c(a,Rse,wme,15);p4c(a,Rse,yme,meb(0));p4c(a,Rse,_le,tme)} +function hde(){hde=ccb;var a,b,c,d,e,f;fde=KC(SD,wte,25,255,15,1);gde=KC(TD,$ie,25,16,15,1);for(b=0;b<255;b++){fde[b]=-1}for(c=57;c>=48;c--){fde[c]=c-48<<24>>24}for(d=70;d>=65;d--){fde[d]=d-65+10<<24>>24}for(e=102;e>=97;e--){fde[e]=e-97+10<<24>>24}for(f=0;f<10;f++)gde[f]=48+f&aje;for(a=10;a<=15;a++)gde[a]=65+a-10&aje} +function BVc(a,b,c){var d,e,f,g,h,i,j,k;h=b.i-a.g/2;i=c.i-a.g/2;j=b.j-a.g/2;k=c.j-a.g/2;f=b.g+a.g/2;g=c.g+a.g/2;d=b.f+a.g/2;e=c.f+a.g/2;if(h>19!=0){return '-'+qD(hD(a))}c=a;d='';while(!(c.l==0&&c.m==0&&c.h==0)){e=RC(Jje);c=UC(c,e,true);b=''+pD(QC);if(!(c.l==0&&c.m==0&&c.h==0)){f=9-b.length;for(;f>0;f--){b='0'+b}}d=b+d}return d} +function xrb(){if(!Object.create||!Object.getOwnPropertyNames){return false}var a='__proto__';var b=Object.create(null);if(b[a]!==undefined){return false}var c=Object.getOwnPropertyNames(b);if(c.length!=0){return false}b[a]=42;if(b[a]!==42){return false}if(Object.getOwnPropertyNames(b).length==0){return false}return true} +function Pgc(a){var b,c,d,e,f,g,h;b=false;c=0;for(e=new olb(a.d.b);e.a=a.a){return -1}if(!F6b(b,c)){return -1}if(Qq(BD(d.Kb(b),20))){return 1}e=0;for(g=BD(d.Kb(b),20).Kc();g.Ob();){f=BD(g.Pb(),17);i=f.c.i==b?f.d.i:f.c.i;h=G6b(a,i,c,d);if(h==-1){return -1}e=$wnd.Math.max(e,h);if(e>a.c-1){return -1}}return e+1} +function Btd(a,b){var c,d,e,f,g,h;if(PD(b)===PD(a)){return true}if(!JD(b,15)){return false}d=BD(b,15);h=a.gc();if(d.gc()!=h){return false}g=d.Kc();if(a.ni()){for(c=0;c0){a.qj();if(b!=null){for(f=0;f>24}case 97:case 98:case 99:case 100:case 101:case 102:{return a-97+10<<24>>24}case 65:case 66:case 67:case 68:case 69:case 70:{return a-65+10<<24>>24}default:{throw vbb(new Oeb('Invalid hexadecimal'))}}} +function AUc(a,b,c){var d,e,f,g;Odd(c,'Processor order nodes',2);a.a=Edb(ED(vNb(b,(JTc(),HTc))));e=new Psb;for(g=Jsb(b.b,0);g.b!=g.d.c;){f=BD(Xsb(g),86);Ccb(DD(vNb(f,(mTc(),jTc))))&&(Gsb(e,f,e.c.b,e.c),true)}d=(sCb(e.b!=0),BD(e.a.a.c,86));yUc(a,d);!c.b&&Rdd(c,1);BUc(a,d,0-Edb(ED(vNb(d,(mTc(),bTc))))/2,0);!c.b&&Rdd(c,1);Qdd(c)} +function rFb(){rFb=ccb;qFb=new sFb('SPIRAL',0);lFb=new sFb('LINE_BY_LINE',1);mFb=new sFb('MANHATTAN',2);kFb=new sFb('JITTER',3);oFb=new sFb('QUADRANTS_LINE_BY_LINE',4);pFb=new sFb('QUADRANTS_MANHATTAN',5);nFb=new sFb('QUADRANTS_JITTER',6);jFb=new sFb('COMBINE_LINE_BY_LINE_MANHATTAN',7);iFb=new sFb('COMBINE_JITTER_MANHATTAN',8)} +function roc(a,b,c,d){var e,f,g,h,i,j;i=woc(a,c);j=woc(b,c);e=false;while(!!i&&!!j){if(d||uoc(i,j,c)){g=woc(i,c);h=woc(j,c);zoc(b);zoc(a);f=i.c;sbc(i,false);sbc(j,false);if(c){Z_b(b,j.p,f);b.p=j.p;Z_b(a,i.p+1,f);a.p=i.p}else{Z_b(a,i.p,f);a.p=i.p;Z_b(b,j.p+1,f);b.p=j.p}$_b(i,null);$_b(j,null);i=g;j=h;e=true}else{break}}return e} +function VDc(a,b,c,d){var e,f,g,h,i;e=false;f=false;for(h=new olb(d.j);h.a=b.length){throw vbb(new qcb('Greedy SwitchDecider: Free layer not in graph.'))}this.c=b[a];this.e=new dIc(d);THc(this.e,this.c,(Ucd(),Tcd));this.i=new dIc(d);THc(this.i,this.c,zcd);this.f=new ejc(this.c);this.a=!f&&e.i&&!e.s&&this.c[0].k==(j0b(),e0b);this.a&&hjc(this,a,b.length)} +function hKb(a,b){var c,d,e,f,g,h;f=!a.B.Hc((Idd(),zdd));g=a.B.Hc(Cdd);a.a=new FHb(g,f,a.c);!!a.n&&u_b(a.a.n,a.n);lIb(a.g,(gHb(),eHb),a.a);if(!b){d=new mIb(1,f,a.c);d.n.a=a.k;Npb(a.p,(Ucd(),Acd),d);e=new mIb(1,f,a.c);e.n.d=a.k;Npb(a.p,Rcd,e);h=new mIb(0,f,a.c);h.n.c=a.k;Npb(a.p,Tcd,h);c=new mIb(0,f,a.c);c.n.b=a.k;Npb(a.p,zcd,c)}} +function Vgc(a){var b,c,d;b=BD(vNb(a.d,(Nyc(),Swc)),218);switch(b.g){case 2:c=Ngc(a);break;case 3:c=(d=new Rkb,MAb(JAb(NAb(LAb(LAb(new YAb(null,new Kub(a.d.b,16)),new Shc),new Uhc),new Whc),new ehc),new Yhc(d)),d);break;default:throw vbb(new Zdb('Compaction not supported for '+b+' edges.'));}Ugc(a,c);reb(new Pib(a.g),new Ehc(a))} +function a2c(a,b){var c;c=new zNb;!!b&&tNb(c,BD(Ohb(a.a,C2),94));JD(b,470)&&tNb(c,BD(Ohb(a.a,G2),94));if(JD(b,354)){tNb(c,BD(Ohb(a.a,D2),94));return c}JD(b,82)&&tNb(c,BD(Ohb(a.a,z2),94));if(JD(b,239)){tNb(c,BD(Ohb(a.a,E2),94));return c}if(JD(b,186)){tNb(c,BD(Ohb(a.a,F2),94));return c}JD(b,352)&&tNb(c,BD(Ohb(a.a,B2),94));return c} +function wSb(){wSb=ccb;oSb=new Osd((Y9c(),D9c),meb(1));uSb=new Osd(T9c,80);tSb=new Osd(M9c,5);bSb=new Osd(r8c,tme);pSb=new Osd(E9c,meb(1));sSb=new Osd(H9c,(Bcb(),true));lSb=new q0b(50);kSb=new Osd(f9c,lSb);dSb=O8c;mSb=t9c;cSb=new Osd(B8c,false);jSb=e9c;iSb=b9c;hSb=Y8c;gSb=W8c;nSb=x9c;fSb=(SRb(),LRb);vSb=QRb;eSb=KRb;qSb=NRb;rSb=PRb} +function ZXb(a){var b,c,d,e,f,g,h,i;i=new jYb;for(h=new olb(a.a);h.a0&&b=0){return false}else{b.p=c.b;Ekb(c.e,b)}if(e==(j0b(),g0b)||e==i0b){for(g=new olb(b.j);g.a1||g==-1)&&(f|=16);(e.Bb&ote)!=0&&(f|=64)}(c.Bb&Tje)!=0&&(f|=Dve);f|=zte}else{if(JD(b,457)){f|=512}else{d=b.Bj();!!d&&(d.i&1)!=0&&(f|=256)}}(a.Bb&512)!=0&&(f|=128);return f} +function hc(a,b){var c,d,e,f,g;a=a==null?Xhe:(uCb(a),a);for(e=0;ea.d[h.p]){c+=zHc(a.b,f);Wjb(a.a,meb(f))}}else{++g}}c+=a.b.d*g;while(!akb(a.a)){xHc(a.b,BD(fkb(a.a),19).a)}}return c} +function Y6d(a,b){var c;if(a.f==W6d){c=$1d(q1d((O6d(),M6d),b));return a.e?c==4&&b!=(m8d(),k8d)&&b!=(m8d(),h8d)&&b!=(m8d(),i8d)&&b!=(m8d(),j8d):c==2}if(!!a.d&&(a.d.Hc(b)||a.d.Hc(_1d(q1d((O6d(),M6d),b)))||a.d.Hc(e1d((O6d(),M6d),a.b,b)))){return true}if(a.f){if(x1d((O6d(),a.f),b2d(q1d(M6d,b)))){c=$1d(q1d(M6d,b));return a.e?c==4:c==2}}return false} +function iVc(a,b,c,d){var e,f,g,h,i,j,k,l;g=BD(hkd(c,(Y9c(),C9c)),8);i=g.a;k=g.b+a;e=$wnd.Math.atan2(k,i);e<0&&(e+=dre);e+=b;e>dre&&(e-=dre);h=BD(hkd(d,C9c),8);j=h.a;l=h.b+a;f=$wnd.Math.atan2(l,j);f<0&&(f+=dre);f+=b;f>dre&&(f-=dre);return Iy(),My(1.0E-10),$wnd.Math.abs(e-f)<=1.0E-10||e==f||isNaN(e)&&isNaN(f)?0:ef?1:Ny(isNaN(e),isNaN(f))} +function YDb(a){var b,c,d,e,f,g,h;h=new Lqb;for(d=new olb(a.a.b);d.a=b.o){throw vbb(new rcb)}i=c>>5;h=c&31;g=Nbb(1,Tbb(Nbb(h,1)));f?(b.n[d][i]=Mbb(b.n[d][i],g)):(b.n[d][i]=xbb(b.n[d][i],Lbb(g)));g=Nbb(g,1);e?(b.n[d][i]=Mbb(b.n[d][i],g)):(b.n[d][i]=xbb(b.n[d][i],Lbb(g)))}catch(a){a=ubb(a);if(JD(a,320)){throw vbb(new qcb(Dle+b.o+'*'+b.p+Ele+c+She+d+Fle))}else throw vbb(a)}} +function BUc(a,b,c,d){var e,f,g;if(b){f=Edb(ED(vNb(b,(mTc(),fTc))))+d;g=c+Edb(ED(vNb(b,bTc)))/2;yNb(b,kTc,meb(Tbb(Cbb($wnd.Math.round(f)))));yNb(b,lTc,meb(Tbb(Cbb($wnd.Math.round(g)))));b.d.b==0||BUc(a,BD(pr((e=Jsb((new ZRc(b)).a.d,0),new aSc(e))),86),c+Edb(ED(vNb(b,bTc)))+a.a,d+Edb(ED(vNb(b,cTc))));vNb(b,iTc)!=null&&BUc(a,BD(vNb(b,iTc),86),c,d)}} +function N9b(a,b){var c,d,e,f,g,h,i,j,k,l,m;i=Q_b(b.a);e=Edb(ED(vNb(i,(Nyc(),pyc))))*2;k=Edb(ED(vNb(i,wyc)));j=$wnd.Math.max(e,k);f=KC(UD,Vje,25,b.f-b.c+1,15,1);d=-j;c=0;for(h=b.b.Kc();h.Ob();){g=BD(h.Pb(),10);d+=a.a[g.c.p]+j;f[c++]=d}d+=a.a[b.a.c.p]+j;f[c++]=d;for(m=new olb(b.e);m.a0){d=(!a.n&&(a.n=new cUd(D2,a,1,7)),BD(qud(a.n,0),137)).a;!d||Qfb(Qfb((b.a+=' "',b),d),'"')}}else{Qfb(Qfb((b.a+=' "',b),c),'"')}Qfb(Lfb(Qfb(Lfb(Qfb(Lfb(Qfb(Lfb((b.a+=' (',b),a.i),','),a.j),' | '),a.g),','),a.f),')');return b.a} +function opd(a){var b,c,d;if((a.Db&64)!=0)return fld(a);b=new Wfb(fte);c=a.k;if(!c){!a.n&&(a.n=new cUd(D2,a,1,7));if(a.n.i>0){d=(!a.n&&(a.n=new cUd(D2,a,1,7)),BD(qud(a.n,0),137)).a;!d||Qfb(Qfb((b.a+=' "',b),d),'"')}}else{Qfb(Qfb((b.a+=' "',b),c),'"')}Qfb(Lfb(Qfb(Lfb(Qfb(Lfb(Qfb(Lfb((b.a+=' (',b),a.i),','),a.j),' | '),a.g),','),a.f),')');return b.a} +function h4c(a,b){var c,d,e,f,g,h,i;if(b==null||b.length==0){return null}e=BD(Phb(a.a,b),149);if(!e){for(d=(h=(new $ib(a.b)).a.vc().Kc(),new djb(h));d.a.Ob();){c=(f=BD(d.a.Pb(),42),BD(f.dd(),149));g=c.c;i=b.length;if(dfb(g.substr(g.length-i,i),b)&&(b.length==g.length||bfb(g,g.length-b.length-1)==46)){if(e){return null}e=c}}!!e&&Shb(a.a,b,e)}return e} +function QLb(a,b){var c,d,e,f;c=new VLb;d=BD(GAb(NAb(new YAb(null,new Kub(a.f,16)),c),Ayb(new hzb,new jzb,new Gzb,new Izb,OC(GC(xL,1),Kie,132,0,[(Fyb(),Eyb),Dyb]))),21);e=d.gc();d=BD(GAb(NAb(new YAb(null,new Kub(b.f,16)),c),Ayb(new hzb,new jzb,new Gzb,new Izb,OC(GC(xL,1),Kie,132,0,[Eyb,Dyb]))),21);f=d.gc();if(ee.p){G0b(f,Rcd);if(f.d){h=f.o.b;b=f.a.b;f.a.b=h-b}}else if(f.j==Rcd&&e.p>a.p){G0b(f,Acd);if(f.d){h=f.o.b;b=f.a.b;f.a.b=-(h-b)}}break}}return e} +function NOc(a,b,c,d){var e,f,g,h,i,j,k,l,m,n,o;f=c;if(c1;if(h){d=new f7c(e,c.b);Dsb(b.a,d)}n7c(b.a,OC(GC(m1,1),nie,8,0,[m,l]))} +function Nid(a,b,c){var d,e,f,g,h,i;if(!b){return null}else{if(c<=-1){d=XKd(b.Tg(),-1-c);if(JD(d,99)){return BD(d,18)}else{g=BD(b.ah(d),153);for(h=0,i=g.gc();h0){e=i.length;while(e>0&&i[e-1]==''){--e}e=40;g&&FGb(a);wGb(a);vGb(a);c=zGb(a);d=0;while(!!c&&d0&&Dsb(a.f,f)}else{a.c[g]-=j+1;a.c[g]<=0&&a.a[g]>0&&Dsb(a.e,f)}}}}} +function _Kb(a){var b,c,d,e,f,g,h,i,j;h=new Hxb(BD(Qb(new nLb),62));j=Qje;for(c=new olb(a.d);c.a=0&&ic?b:c;j<=l;++j){if(j==c){h=d++}else{f=e[j];k=o.rl(f.ak());j==b&&(i=j==l&&!k?d-1:d);k&&++d}}m=BD(Wxd(a,b,c),72);h!=i&&GLd(a,new ESd(a.e,7,g,meb(h),n.dd(),i));return m}}}else{return BD(sud(a,b,c),72)}return BD(Wxd(a,b,c),72)} +function Qcc(a,b){var c,d,e,f,g,h,i;Odd(b,'Port order processing',1);i=BD(vNb(a,(Nyc(),_xc)),421);for(d=new olb(a.b);d.a=0){h=bD(a,g);if(h){j<22?(i.l|=1<>>1;g.m=k>>>1|(l&1)<<21;g.l=m>>>1|(k&1)<<21;--j}c&&ZC(i);if(f){if(d){QC=hD(a);e&&(QC=nD(QC,(wD(),uD)))}else{QC=TC(a.l,a.m,a.h)}}return i} +function TDc(a,b){var c,d,e,f,g,h,i,j,k,l;j=a.e[b.c.p][b.p]+1;i=b.c.a.c.length+1;for(h=new olb(a.a);h.a0&&(BCb(0,a.length),a.charCodeAt(0)==45||(BCb(0,a.length),a.charCodeAt(0)==43))?1:0;for(d=g;dc){throw vbb(new Oeb(Oje+a+'"'))}return h} +function dnc(a){var b,c,d,e,f,g,h;g=new Psb;for(f=new olb(a.a);f.a1)&&b==1&&BD(a.a[a.b],10).k==(j0b(),f0b)){zac(BD(a.a[a.b],10),(rbd(),nbd))}else if(d&&(!c||(a.c-a.b&a.a.length-1)>1)&&b==1&&BD(a.a[a.c-1&a.a.length-1],10).k==(j0b(),f0b)){zac(BD(a.a[a.c-1&a.a.length-1],10),(rbd(),obd))}else if((a.c-a.b&a.a.length-1)==2){zac(BD(bkb(a),10),(rbd(),nbd));zac(BD(bkb(a),10),obd)}else{wac(a,e)}Yjb(a)} +function pRc(a,b,c){var d,e,f,g,h;f=0;for(e=new Fyd((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a));e.e!=e.i.gc();){d=BD(Dyd(e),33);g='';(!d.n&&(d.n=new cUd(D2,d,1,7)),d.n).i==0||(g=BD(qud((!d.n&&(d.n=new cUd(D2,d,1,7)),d.n),0),137).a);h=new XRc(f++,b,g);tNb(h,d);yNb(h,(mTc(),dTc),d);h.e.b=d.j+d.f/2;h.f.a=$wnd.Math.max(d.g,1);h.e.a=d.i+d.g/2;h.f.b=$wnd.Math.max(d.f,1);Dsb(b.b,h);jrb(c.f,d,h)}} +function B2b(a){var b,c,d,e,f;d=BD(vNb(a,(wtc(),$sc)),33);f=BD(hkd(d,(Nyc(),Fxc)),174).Hc((tdd(),sdd));if(!a.e){e=BD(vNb(a,Ksc),21);b=new f7c(a.f.a+a.d.b+a.d.c,a.f.b+a.d.d+a.d.a);if(e.Hc((Orc(),Hrc))){jkd(d,Vxc,(dcd(),$bd));Afd(d,b.a,b.b,false,true)}else{Ccb(DD(hkd(d,Gxc)))||Afd(d,b.a,b.b,true,true)}}f?jkd(d,Fxc,pqb(sdd)):jkd(d,Fxc,(c=BD(gdb(I1),9),new xqb(c,BD(_Bb(c,c.length),9),0)))} +function tA(a,b,c){var d,e,f,g;if(b[0]>=a.length){c.o=0;return true}switch(bfb(a,b[0])){case 43:e=1;break;case 45:e=-1;break;default:c.o=0;return true;}++b[0];f=b[0];g=rA(a,b);if(g==0&&b[0]==f){return false}if(b[0]=0&&h!=c){f=new nSd(a,1,h,g,null);!d?(d=f):d.Ei(f)}if(c>=0){f=new nSd(a,1,c,h==c?g:null,b);!d?(d=f):d.Ei(f)}}return d} +function LEd(a){var b,c,d;if(a.b==null){d=new Hfb;if(a.i!=null){Efb(d,a.i);d.a+=':'}if((a.f&256)!=0){if((a.f&256)!=0&&a.a!=null){YEd(a.i)||(d.a+='//',d);Efb(d,a.a)}if(a.d!=null){d.a+='/';Efb(d,a.d)}(a.f&16)!=0&&(d.a+='/',d);for(b=0,c=a.j.length;bm){return false}l=(i=MZc(d,m,false),i.a);if(k+h+l<=b.b){KZc(c,f-c.s);c.c=true;KZc(d,f-c.s);OZc(d,c.s,c.t+c.d+h);d.k=true;WZc(c.q,d);n=true;if(e){s$c(b,d);d.j=b;if(a.c.length>g){v$c((tCb(g,a.c.length),BD(a.c[g],200)),d);(tCb(g,a.c.length),BD(a.c[g],200)).a.c.length==0&&Kkb(a,g)}}}return n} +function kcc(a,b){var c,d,e,f,g,h;Odd(b,'Partition midprocessing',1);e=new Hp;MAb(JAb(new YAb(null,new Kub(a.a,16)),new occ),new qcc(e));if(e.d==0){return}h=BD(GAb(UAb((f=e.i,new YAb(null,(!f?(e.i=new zf(e,e.c)):f).Nc()))),Byb(new fzb,new dzb,new Ezb,OC(GC(xL,1),Kie,132,0,[(Fyb(),Dyb)]))),15);d=h.Kc();c=BD(d.Pb(),19);while(d.Ob()){g=BD(d.Pb(),19);jcc(BD(Qc(e,c),21),BD(Qc(e,g),21));c=g}Qdd(b)} +function DYb(a,b,c){var d,e,f,g,h,i,j,k;if(b.p==0){b.p=1;g=c;if(!g){e=new Rkb;f=(d=BD(gdb(F1),9),new xqb(d,BD(_Bb(d,d.length),9),0));g=new vgd(e,f)}BD(g.a,15).Fc(b);b.k==(j0b(),e0b)&&BD(g.b,21).Fc(BD(vNb(b,(wtc(),Hsc)),61));for(i=new olb(b.j);i.a0){e=BD(a.Ab.g,1934);if(b==null){for(f=0;f1){for(d=new olb(e);d.ac.s&&hh){h=e;k.c=KC(SI,Uhe,1,0,5,1)}e==h&&Ekb(k,new vgd(c.c.i,c))}mmb();Okb(k,a.c);Dkb(a.b,i.p,k)}}} +function MMc(a,b){var c,d,e,f,g,h,i,j,k;for(g=new olb(b.b);g.ah){h=e;k.c=KC(SI,Uhe,1,0,5,1)}e==h&&Ekb(k,new vgd(c.d.i,c))}mmb();Okb(k,a.c);Dkb(a.f,i.p,k)}}} +function Y7c(a){r4c(a,new E3c(P3c(M3c(O3c(N3c(new R3c,qse),'ELK Box'),'Algorithm for packing of unconnected boxes, i.e. graphs without edges.'),new _7c)));p4c(a,qse,ame,U7c);p4c(a,qse,wme,15);p4c(a,qse,vme,meb(0));p4c(a,qse,Jre,Ksd(O7c));p4c(a,qse,Fme,Ksd(Q7c));p4c(a,qse,Eme,Ksd(S7c));p4c(a,qse,_le,pse);p4c(a,qse,Ame,Ksd(P7c));p4c(a,qse,Tme,Ksd(R7c));p4c(a,qse,rse,Ksd(M7c));p4c(a,qse,lqe,Ksd(N7c))} +function W$b(a,b){var c,d,e,f,g,h,i,j,k;e=a.i;g=e.o.a;f=e.o.b;if(g<=0&&f<=0){return Ucd(),Scd}j=a.n.a;k=a.n.b;h=a.o.a;c=a.o.b;switch(b.g){case 2:case 1:if(j<0){return Ucd(),Tcd}else if(j+h>g){return Ucd(),zcd}break;case 4:case 3:if(k<0){return Ucd(),Acd}else if(k+c>f){return Ucd(),Rcd}}i=(j+h/2)/g;d=(k+c/2)/f;return i+d<=1&&i-d<=0?(Ucd(),Tcd):i+d>=1&&i-d>=0?(Ucd(),zcd):d<0.5?(Ucd(),Acd):(Ucd(),Rcd)} +function pJc(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p;c=false;k=Edb(ED(vNb(b,(Nyc(),vyc))));o=Qie*k;for(e=new olb(b.b);e.ai+o){p=l.g+m.g;m.a=(m.g*m.a+l.g*l.a)/p;m.g=p;l.f=m;c=true}}f=h;l=m}}return c} +function VGb(a,b,c,d,e,f,g){var h,i,j,k,l,m;m=new I6c;for(j=b.Kc();j.Ob();){h=BD(j.Pb(),839);for(l=new olb(h.wf());l.a0){if(h.a){j=h.b.rf().b;if(e>j){if(a.v||h.c.d.c.length==1){g=(e-j)/2;h.d.d=g;h.d.a=g}else{c=BD(Ikb(h.c.d,0),181).rf().b;d=(c-j)/2;h.d.d=$wnd.Math.max(0,d);h.d.a=e-d-j}}}else{h.d.a=a.t+e}}else if(tcd(a.u)){f=sfd(h.b);f.d<0&&(h.d.d=-f.d);f.d+f.a>h.b.rf().b&&(h.d.a=f.d+f.a-h.b.rf().b)}}} +function FC(a,b){var c;switch(HC(a)){case 6:return ND(b);case 7:return LD(b);case 8:return KD(b);case 3:return Array.isArray(b)&&(c=HC(b),!(c>=14&&c<=16));case 11:return b!=null&&typeof b===Nhe;case 12:return b!=null&&(typeof b===Jhe||typeof b==Nhe);case 0:return AD(b,a.__elementTypeId$);case 2:return OD(b)&&!(b.im===gcb);case 1:return OD(b)&&!(b.im===gcb)||AD(b,a.__elementTypeId$);default:return true;}} +function xOb(a,b){var c,d,e,f;d=$wnd.Math.min($wnd.Math.abs(a.c-(b.c+b.b)),$wnd.Math.abs(a.c+a.b-b.c));f=$wnd.Math.min($wnd.Math.abs(a.d-(b.d+b.a)),$wnd.Math.abs(a.d+a.a-b.d));c=$wnd.Math.abs(a.c+a.b/2-(b.c+b.b/2));if(c>a.b/2+b.b/2){return 1}e=$wnd.Math.abs(a.d+a.a/2-(b.d+b.a/2));if(e>a.a/2+b.a/2){return 1}if(c==0&&e==0){return 0}if(c==0){return f/e+1}if(e==0){return d/c+1}return $wnd.Math.min(d/c,f/e)+1} +function mgb(a,b){var c,d,e,f,g,h;e=pgb(a);h=pgb(b);if(e==h){if(a.e==b.e&&a.a<54&&b.a<54){return a.fb.f?1:0}d=a.e-b.e;c=(a.d>0?a.d:$wnd.Math.floor((a.a-1)*Xje)+1)-(b.d>0?b.d:$wnd.Math.floor((b.a-1)*Xje)+1);if(c>d+1){return e}else if(c0&&(g=Ogb(g,Khb(d)));return Igb(f,g)}}else return e0&&a.d!=(yTb(),xTb)&&(h+=g*(d.d.a+a.a[b.b][d.b]*(b.d.a-d.d.a)/c));c>0&&a.d!=(yTb(),vTb)&&(i+=g*(d.d.b+a.a[b.b][d.b]*(b.d.b-d.d.b)/c))}switch(a.d.g){case 1:return new f7c(h/f,b.d.b);case 2:return new f7c(b.d.a,i/f);default:return new f7c(h/f,i/f);}} +function Wcc(a,b){Occ();var c,d,e,f,g;g=BD(vNb(a.i,(Nyc(),Vxc)),98);f=a.j.g-b.j.g;if(f!=0||!(g==(dcd(),Zbd)||g==_bd||g==$bd)){return 0}if(g==(dcd(),Zbd)){c=BD(vNb(a,Wxc),19);d=BD(vNb(b,Wxc),19);if(!!c&&!!d){e=c.a-d.a;if(e!=0){return e}}}switch(a.j.g){case 1:return Kdb(a.n.a,b.n.a);case 2:return Kdb(a.n.b,b.n.b);case 3:return Kdb(b.n.a,a.n.a);case 4:return Kdb(b.n.b,a.n.b);default:throw vbb(new Zdb(ine));}} +function tfd(a){var b,c,d,e,f,g;c=(!a.a&&(a.a=new xMd(y2,a,5)),a.a).i+2;g=new Skb(c);Ekb(g,new f7c(a.j,a.k));MAb(new YAb(null,(!a.a&&(a.a=new xMd(y2,a,5)),new Kub(a.a,16))),new Qfd(g));Ekb(g,new f7c(a.b,a.c));b=1;while(b0){jEb(i,false,(ead(),aad));jEb(i,true,bad)}Hkb(b.g,new $hc(a,c));Rhb(a.g,b,c)} +function Neb(){Neb=ccb;var a;Jeb=OC(GC(WD,1),oje,25,15,[-1,-1,30,19,15,13,11,11,10,9,9,8,8,8,8,7,7,7,7,7,7,7,6,6,6,6,6,6,6,6,6,6,6,6,6,6,5]);Keb=KC(WD,oje,25,37,15,1);Leb=OC(GC(WD,1),oje,25,15,[-1,-1,63,40,32,28,25,23,21,20,19,19,18,18,17,17,16,16,16,15,15,15,15,14,14,14,14,14,14,13,13,13,13,13,13,13,13]);Meb=KC(XD,Sje,25,37,14,1);for(a=2;a<=36;a++){Keb[a]=QD($wnd.Math.pow(a,Jeb[a]));Meb[a]=Abb(rie,Keb[a])}} +function pfd(a){var b;if((!a.a&&(a.a=new cUd(A2,a,6,6)),a.a).i!=1){throw vbb(new Wdb(Tse+(!a.a&&(a.a=new cUd(A2,a,6,6)),a.a).i))}b=new s7c;!!btd(BD(qud((!a.b&&(a.b=new y5d(z2,a,4,7)),a.b),0),82))&&ye(b,qfd(a,btd(BD(qud((!a.b&&(a.b=new y5d(z2,a,4,7)),a.b),0),82)),false));!!btd(BD(qud((!a.c&&(a.c=new y5d(z2,a,5,8)),a.c),0),82))&&ye(b,qfd(a,btd(BD(qud((!a.c&&(a.c=new y5d(z2,a,5,8)),a.c),0),82)),true));return b} +function _Mc(a,b){var c,d,e,f,g;b.d?(e=a.a.c==(YLc(),XLc)?R_b(b.b):U_b(b.b)):(e=a.a.c==(YLc(),WLc)?R_b(b.b):U_b(b.b));f=false;for(d=new Sr(ur(e.a.Kc(),new Sq));Qr(d);){c=BD(Rr(d),17);g=Ccb(a.a.f[a.a.g[b.b.p].p]);if(!g&&!OZb(c)&&c.c.i.c==c.d.i.c){continue}if(Ccb(a.a.n[a.a.g[b.b.p].p])||Ccb(a.a.n[a.a.g[b.b.p].p])){continue}f=true;if(Rqb(a.b,a.a.g[TMc(c,b.b).p])){b.c=true;b.a=c;return b}}b.c=f;b.a=null;return b} +function bed(a,b,c,d,e){var f,g,h,i,j,k,l;mmb();Okb(a,new Red);h=new Bib(a,0);l=new Rkb;f=0;while(h.bf*2){k=new wed(l);j=red(g)/qed(g);i=fed(k,b,new p0b,c,d,e,j);P6c(X6c(k.e),i);l.c=KC(SI,Uhe,1,0,5,1);f=0;l.c[l.c.length]=k;l.c[l.c.length]=g;f=red(k)*qed(k)+red(g)*qed(g)}else{l.c[l.c.length]=g;f+=red(g)*qed(g)}}return l} +function qwd(a,b,c){var d,e,f,g,h,i,j;d=c.gc();if(d==0){return false}else{if(a.ej()){i=a.fj();zvd(a,b,c);g=d==1?a.Zi(3,null,c.Kc().Pb(),b,i):a.Zi(5,null,c,b,i);if(a.bj()){h=d<100?null:new Ixd(d);f=b+d;for(e=b;e0){for(g=0;g>16==-15&&a.Cb.nh()&&Rwd(new oSd(a.Cb,9,13,c,a.c,HLd(QSd(BD(a.Cb,59)),a)))}else if(JD(a.Cb,88)){if(a.Db>>16==-23&&a.Cb.nh()){b=a.c;JD(b,88)||(b=(jGd(),_Fd));JD(c,88)||(c=(jGd(),_Fd));Rwd(new oSd(a.Cb,9,10,c,b,HLd(VKd(BD(a.Cb,26)),a)))}}}}return a.c} +function f7b(a,b){var c,d,e,f,g,h,i,j,k,l;Odd(b,'Hypernodes processing',1);for(e=new olb(a.b);e.ac);return e} +function XFc(a,b){var c,d,e;d=Cub(a.d,1)!=0;!Ccb(DD(vNb(b.j,(wtc(),Jsc))))&&!Ccb(DD(vNb(b.j,mtc)))||PD(vNb(b.j,(Nyc(),ywc)))===PD((tAc(),rAc))?b.c.Tf(b.e,d):(d=Ccb(DD(vNb(b.j,Jsc))));dGc(a,b,d,true);Ccb(DD(vNb(b.j,mtc)))&&yNb(b.j,mtc,(Bcb(),false));if(Ccb(DD(vNb(b.j,Jsc)))){yNb(b.j,Jsc,(Bcb(),false));yNb(b.j,mtc,true)}c=NFc(a,b);do{$Fc(a);if(c==0){return 0}d=!d;e=c;dGc(a,b,d,false);c=NFc(a,b)}while(e>c);return e} +function uNd(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o;if(b==c){return true}else{b=vNd(a,b);c=vNd(a,c);d=JQd(b);if(d){k=JQd(c);if(k!=d){if(!k){return false}else{i=d.Dj();o=k.Dj();return i==o&&i!=null}}else{g=(!b.d&&(b.d=new xMd(j5,b,1)),b.d);f=g.i;m=(!c.d&&(c.d=new xMd(j5,c,1)),c.d);if(f==m.i){for(j=0;j0;h=xFb(b,f);c?OFb(h.b,b):OFb(h.g,b);LFb(h).c.length==1&&(Gsb(d,h,d.c.b,d.c),true);e=new vgd(f,b);Wjb(a.o,e);Lkb(a.e.a,f)}} +function _Nb(a,b){var c,d,e,f,g,h,i;d=$wnd.Math.abs(D6c(a.b).a-D6c(b.b).a);h=$wnd.Math.abs(D6c(a.b).b-D6c(b.b).b);e=0;i=0;c=1;g=1;if(d>a.b.b/2+b.b.b/2){e=$wnd.Math.min($wnd.Math.abs(a.b.c-(b.b.c+b.b.b)),$wnd.Math.abs(a.b.c+a.b.b-b.b.c));c=1-e/d}if(h>a.b.a/2+b.b.a/2){i=$wnd.Math.min($wnd.Math.abs(a.b.d-(b.b.d+b.b.a)),$wnd.Math.abs(a.b.d+a.b.a-b.b.d));g=1-i/h}f=$wnd.Math.min(c,g);return (1-f)*$wnd.Math.sqrt(d*d+h*h)} +function lQc(a){var b,c,d,e;nQc(a,a.e,a.f,(FQc(),DQc),true,a.c,a.i);nQc(a,a.e,a.f,DQc,false,a.c,a.i);nQc(a,a.e,a.f,EQc,true,a.c,a.i);nQc(a,a.e,a.f,EQc,false,a.c,a.i);mQc(a,a.c,a.e,a.f,a.i);d=new Bib(a.i,0);while(d.b=65;c--){$ce[c]=c-65<<24>>24}for(d=122;d>=97;d--){$ce[d]=d-97+26<<24>>24}for(e=57;e>=48;e--){$ce[e]=e-48+52<<24>>24}$ce[43]=62;$ce[47]=63;for(f=0;f<=25;f++)_ce[f]=65+f&aje;for(g=26,i=0;g<=51;++g,i++)_ce[g]=97+i&aje;for(a=52,h=0;a<=61;++a,h++)_ce[a]=48+h&aje;_ce[62]=43;_ce[63]=47} +function FXb(a,b){var c,d,e,f,g,h,i,j,k,l,m,n;if(a.dc()){return new d7c}j=0;l=0;for(e=a.Kc();e.Ob();){d=BD(e.Pb(),37);f=d.f;j=$wnd.Math.max(j,f.a);l+=f.a*f.b}j=$wnd.Math.max(j,$wnd.Math.sqrt(l)*Edb(ED(vNb(BD(a.Kc().Pb(),37),(Nyc(),owc)))));m=0;n=0;i=0;c=b;for(h=a.Kc();h.Ob();){g=BD(h.Pb(),37);k=g.f;if(m+k.a>j){m=0;n+=i+b;i=0}uXb(g,m,n);c=$wnd.Math.max(c,m+k.a);i=$wnd.Math.max(i,k.b);m+=k.a+b}return new f7c(c+b,n+i+b)} +function mQc(a,b,c,d,e){var f,g,h,i,j,k,l;for(g=new olb(b);g.af){return Ucd(),zcd}break;case 4:case 3:if(i<0){return Ucd(),Acd}else if(i+a.f>e){return Ucd(),Rcd}}g=(h+a.g/2)/f;c=(i+a.f/2)/e;return g+c<=1&&g-c<=0?(Ucd(),Tcd):g+c>=1&&g-c>=0?(Ucd(),zcd):c<0.5?(Ucd(),Acd):(Ucd(),Rcd)} +function vhb(a,b,c,d,e){var f,g;f=wbb(xbb(b[0],Yje),xbb(d[0],Yje));a[0]=Tbb(f);f=Obb(f,32);if(c>=e){for(g=1;g0){e.b[g++]=0;e.b[g++]=f.b[0]-1}for(b=1;b0){pOc(i,i.d-e.d);e.c==(HOc(),FOc)&&nOc(i,i.a-e.d);i.d<=0&&i.i>0&&(Gsb(b,i,b.c.b,b.c),true)}}}for(f=new olb(a.f);f.a0){qOc(h,h.i-e.d);e.c==(HOc(),FOc)&&oOc(h,h.b-e.d);h.i<=0&&h.d>0&&(Gsb(c,h,c.c.b,c.c),true)}}}} +function gSc(a,b,c){var d,e,f,g,h,i,j,k;Odd(c,'Processor compute fanout',1);Uhb(a.b);Uhb(a.a);h=null;f=Jsb(b.b,0);while(!h&&f.b!=f.d.c){j=BD(Xsb(f),86);Ccb(DD(vNb(j,(mTc(),jTc))))&&(h=j)}i=new Psb;Gsb(i,h,i.c.b,i.c);fSc(a,i);for(k=Jsb(b.b,0);k.b!=k.d.c;){j=BD(Xsb(k),86);g=GD(vNb(j,(mTc(),$Sc)));e=Phb(a.b,g)!=null?BD(Phb(a.b,g),19).a:0;yNb(j,ZSc,meb(e));d=1+(Phb(a.a,g)!=null?BD(Phb(a.a,g),19).a:0);yNb(j,XSc,meb(d))}Qdd(c)} +function WPc(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o;m=VPc(a,c);for(i=0;i0);d.a.Xb(d.c=--d.b);l>m+i&&uib(d)}for(g=new olb(n);g.a0);d.a.Xb(d.c=--d.b)}}}} +function Jfe(){wfe();var a,b,c,d,e,f;if(gfe)return gfe;a=(++vfe,new $fe(4));Xfe(a,Kfe(vxe,true));Zfe(a,Kfe('M',true));Zfe(a,Kfe('C',true));f=(++vfe,new $fe(4));for(d=0;d<11;d++){Ufe(f,d,d)}b=(++vfe,new $fe(4));Xfe(b,Kfe('M',true));Ufe(b,4448,4607);Ufe(b,65438,65439);e=(++vfe,new Lge(2));Kge(e,a);Kge(e,ffe);c=(++vfe,new Lge(2));c.$l(Bfe(f,Kfe('L',true)));c.$l(b);c=(++vfe,new lge(3,c));c=(++vfe,new rge(e,c));gfe=c;return gfe} +function S3c(a){var b,c;b=GD(hkd(a,(Y9c(),o8c)));if(T3c(b,a)){return}if(!ikd(a,F9c)&&((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a).i!=0||Ccb(DD(hkd(a,M8c))))){if(b==null||ufb(b).length==0){if(!T3c(sne,a)){c=Qfb(Qfb(new Wfb('Unable to load default layout algorithm '),sne),' for unconfigured node ');yfd(a,c);throw vbb(new y2c(c.a))}}else{c=Qfb(Qfb(new Wfb("Layout algorithm '"),b),"' not found for ");yfd(a,c);throw vbb(new y2c(c.a))}}} +function hIb(a){var b,c,d,e,f,g,h,i,j,k,l,m,n;c=a.i;b=a.n;if(a.b==0){n=c.c+b.b;m=c.b-b.b-b.c;for(g=a.a,i=0,k=g.length;i0){l-=d[0]+a.c;d[0]+=a.c}d[2]>0&&(l-=d[2]+a.c);d[1]=$wnd.Math.max(d[1],l);mHb(a.a[1],c.c+b.b+d[0]-(d[1]-l)/2,d[1])}for(f=a.a,h=0,j=f.length;h0?(a.n.c.length-1)*a.i:0;for(d=new olb(a.n);d.a1){for(d=Jsb(e,0);d.b!=d.d.c;){c=BD(Xsb(d),231);f=0;for(i=new olb(c.e);i.a0){b[0]+=a.c;l-=b[0]}b[2]>0&&(l-=b[2]+a.c);b[1]=$wnd.Math.max(b[1],l);nHb(a.a[1],d.d+c.d+b[0]-(b[1]-l)/2,b[1])}else{o=d.d+c.d;n=d.a-c.d-c.a;for(g=a.a,i=0,k=g.length;i=0&&f!=c){throw vbb(new Wdb(kue))}}e=0;for(i=0;i0||Jy(e.b.d,a.b.d+a.b.a)==0&&d.b<0||Jy(e.b.d+e.b.a,a.b.d)==0&&d.b>0){h=0;break}}else{h=$wnd.Math.min(h,YNb(a,e,d))}h=$wnd.Math.min(h,ONb(a,f,h,d))}return h} +function ifd(a,b){var c,d,e,f,g,h,i;if(a.b<2){throw vbb(new Wdb('The vector chain must contain at least a source and a target point.'))}e=(sCb(a.b!=0),BD(a.a.a.c,8));nmd(b,e.a,e.b);i=new Oyd((!b.a&&(b.a=new xMd(y2,b,5)),b.a));g=Jsb(a,1);while(g.aEdb(REc(g.g,g.d[0]).a)){sCb(i.b>0);i.a.Xb(i.c=--i.b);Aib(i,g);e=true}else if(!!h.e&&h.e.gc()>0){f=(!h.e&&(h.e=new Rkb),h.e).Mc(b);j=(!h.e&&(h.e=new Rkb),h.e).Mc(c);if(f||j){(!h.e&&(h.e=new Rkb),h.e).Fc(g);++g.c}}}e||(d.c[d.c.length]=g,true)} +function odc(a){var b,c,d;if(fcd(BD(vNb(a,(Nyc(),Vxc)),98))){for(c=new olb(a.j);c.a>>0,'0'+b.toString(16));d='\\x'+qfb(c,c.length-2,c.length)}else if(a>=Tje){c=(b=a>>>0,'0'+b.toString(16));d='\\v'+qfb(c,c.length-6,c.length)}else d=''+String.fromCharCode(a&aje);}return d} +function yhb(a,b){var c,d,e,f,g,h,i,j,k,l;g=a.e;i=b.e;if(i==0){return a}if(g==0){return b.e==0?b:new Vgb(-b.e,b.d,b.a)}f=a.d;h=b.d;if(f+h==2){c=xbb(a.a[0],Yje);d=xbb(b.a[0],Yje);g<0&&(c=Jbb(c));i<0&&(d=Jbb(d));return ghb(Qbb(c,d))}e=f!=h?f>h?1:-1:whb(a.a,b.a,f);if(e==-1){l=-i;k=g==i?zhb(b.a,h,a.a,f):uhb(b.a,h,a.a,f)}else{l=g;if(g==i){if(e==0){return Hgb(),Ggb}k=zhb(a.a,f,b.a,h)}else{k=uhb(a.a,f,b.a,h)}}j=new Vgb(l,k.length,k);Jgb(j);return j} +function YPc(a){var b,c,d,e,f,g;this.e=new Rkb;this.a=new Rkb;for(c=a.b-1;c<3;c++){St(a,0,BD(Ut(a,0),8))}if(a.b<4){throw vbb(new Wdb('At (least dimension + 1) control points are necessary!'))}else{this.b=3;this.d=true;this.c=false;TPc(this,a.b+this.b-1);g=new Rkb;f=new olb(this.e);for(b=0;b=b.o&&c.f<=b.f||b.a*0.5<=c.f&&b.a*1.5>=c.f){g=BD(Ikb(b.n,b.n.c.length-1),211);if(g.e+g.d+c.g+e<=d&&(f=BD(Ikb(b.n,b.n.c.length-1),211),f.f-a.f+c.f<=a.b||a.a.c.length==1)){EZc(b,c);return true}else if(b.s+c.g<=d&&(b.t+b.d+c.f+e<=a.b||a.a.c.length==1)){Ekb(b.b,c);h=BD(Ikb(b.n,b.n.c.length-1),211);Ekb(b.n,new VZc(b.s,h.f+h.a+b.i,b.i));QZc(BD(Ikb(b.n,b.n.c.length-1),211),c);GZc(b,c);return true}}return false} +function Zxd(a,b,c){var d,e,f,g;if(a.ej()){e=null;f=a.fj();d=a.Zi(1,g=uud(a,b,c),c,b,f);if(a.bj()&&!(a.ni()&&g!=null?pb(g,c):PD(g)===PD(c))){g!=null&&(e=a.dj(g,e));e=a.cj(c,e);a.ij()&&(e=a.lj(g,c,e));if(!e){a.$i(d)}else{e.Ei(d);e.Fi()}}else{a.ij()&&(e=a.lj(g,c,e));if(!e){a.$i(d)}else{e.Ei(d);e.Fi()}}return g}else{g=uud(a,b,c);if(a.bj()&&!(a.ni()&&g!=null?pb(g,c):PD(g)===PD(c))){e=null;g!=null&&(e=a.dj(g,null));e=a.cj(c,e);!!e&&e.Fi()}return g}} +function YA(a,b){var c,d,e,f,g,h,i,j;b%=24;if(a.q.getHours()!=b){d=new $wnd.Date(a.q.getTime());d.setDate(d.getDate()+1);h=a.q.getTimezoneOffset()-d.getTimezoneOffset();if(h>0){i=h/60|0;j=h%60;e=a.q.getDate();c=a.q.getHours();c+i>=24&&++e;f=new $wnd.Date(a.q.getFullYear(),a.q.getMonth(),e,b+i,a.q.getMinutes()+j,a.q.getSeconds(),a.q.getMilliseconds());a.q.setTime(f.getTime())}}g=a.q.getTime();a.q.setTime(g+3600000);a.q.getHours()!=b&&a.q.setTime(g)} +function opc(a,b){var c,d,e,f,g;Odd(b,'Path-Like Graph Wrapping',1);if(a.b.c.length==0){Qdd(b);return}e=new Xoc(a);g=(e.i==null&&(e.i=Soc(e,new Zoc)),Edb(e.i)*e.f);c=g/(e.i==null&&(e.i=Soc(e,new Zoc)),Edb(e.i));if(e.b>c){Qdd(b);return}switch(BD(vNb(a,(Nyc(),Gyc)),337).g){case 2:f=new hpc;break;case 0:f=new Ync;break;default:f=new kpc;}d=f.Vf(a,e);if(!f.Wf()){switch(BD(vNb(a,Myc),338).g){case 2:d=tpc(e,d);break;case 1:d=rpc(e,d);}}npc(a,e,d);Qdd(b)} +function MFc(a,b){var c,d,e,f;Fub(a.d,a.e);a.c.a.$b();if(Edb(ED(vNb(b.j,(Nyc(),uwc))))!=0||Edb(ED(vNb(b.j,uwc)))!=0){c=dme;PD(vNb(b.j,ywc))!==PD((tAc(),rAc))&&yNb(b.j,(wtc(),Jsc),(Bcb(),true));f=BD(vNb(b.j,Ayc),19).a;for(e=0;ee&&++j;Ekb(g,(tCb(h+j,b.c.length),BD(b.c[h+j],19)));i+=(tCb(h+j,b.c.length),BD(b.c[h+j],19)).a-d;++c;while(c1&&(i>red(h)*qed(h)/2||g.b==0)){l=new wed(m);k=red(h)/qed(h);j=fed(l,b,new p0b,c,d,e,k);P6c(X6c(l.e),j);h=l;n.c[n.c.length]=l;i=0;m.c=KC(SI,Uhe,1,0,5,1)}}}Gkb(n,m);return n} +function y6d(a,b,c,d){var e,f,g,h,i,j,k,l,m,n,o,p;if(c.mh(b)){k=(n=b,!n?null:BD(d,49).xh(n));if(k){p=c.bh(b,a.a);o=b.t;if(o>1||o==-1){l=BD(p,69);m=BD(k,69);if(l.dc()){m.$b()}else{g=!!zUd(b);f=0;for(h=a.a?l.Kc():l.Zh();h.Ob();){j=BD(h.Pb(),56);e=BD(Wrb(a,j),56);if(!e){if(a.b&&!g){m.Xh(f,j);++f}}else{if(g){i=m.Xc(e);i==-1?m.Xh(f,e):f!=i&&m.ji(f,e)}else{m.Xh(f,e)}++f}}}}else{if(p==null){k.Wb(null)}else{e=Wrb(a,p);e==null?a.b&&!zUd(b)&&k.Wb(p):k.Wb(e)}}}}} +function E6b(a,b){var c,d,e,f,g,h,i,j;c=new L6b;for(e=new Sr(ur(R_b(b).a.Kc(),new Sq));Qr(e);){d=BD(Rr(e),17);if(OZb(d)){continue}h=d.c.i;if(F6b(h,C6b)){j=G6b(a,h,C6b,B6b);if(j==-1){continue}c.b=$wnd.Math.max(c.b,j);!c.a&&(c.a=new Rkb);Ekb(c.a,h)}}for(g=new Sr(ur(U_b(b).a.Kc(),new Sq));Qr(g);){f=BD(Rr(g),17);if(OZb(f)){continue}i=f.d.i;if(F6b(i,B6b)){j=G6b(a,i,B6b,C6b);if(j==-1){continue}c.d=$wnd.Math.max(c.d,j);!c.c&&(c.c=new Rkb);Ekb(c.c,i)}}return c} +function Khb(a){Dhb();var b,c,d,e;b=QD(a);if(a1000000){throw vbb(new ocb('power of ten too big'))}if(a<=Ohe){return Qgb(Pgb(Bhb[1],b),b)}d=Pgb(Bhb[1],Ohe);e=d;c=Cbb(a-Ohe);b=QD(a%Ohe);while(ybb(c,Ohe)>0){e=Ogb(e,d);c=Qbb(c,Ohe)}e=Ogb(e,Pgb(Bhb[1],b));e=Qgb(e,Ohe);c=Cbb(a-Ohe);while(ybb(c,Ohe)>0){e=Qgb(e,Ohe);c=Qbb(c,Ohe)}e=Qgb(e,b);return e} +function X5b(a,b){var c,d,e,f,g,h,i,j,k;Odd(b,'Hierarchical port dummy size processing',1);i=new Rkb;k=new Rkb;d=Edb(ED(vNb(a,(Nyc(),myc))));c=d*2;for(f=new olb(a.b);f.aj&&d>j){k=h;j=Edb(b.p[h.p])+Edb(b.d[h.p])+h.o.b+h.d.a}else{e=false;c.n&&Sdd(c,'bk node placement breaks on '+h+' which should have been after '+k);break}}if(!e){break}}c.n&&Sdd(c,b+' is feasible: '+e);return e} +function XNc(a,b,c,d){var e,f,g,h,i,j,k;h=-1;for(k=new olb(a);k.a=q&&a.e[i.p]>o*a.b||t>=c*q){m.c[m.c.length]=h;h=new Rkb;ye(g,f);f.a.$b();j-=k;n=$wnd.Math.max(n,j*a.b+p);j+=t;s=t;t=0;k=0;p=0}}return new vgd(n,m)} +function q4c(a){var b,c,d,e,f,g,h,i,j,k,l,m,n;for(c=(j=(new $ib(a.c.b)).a.vc().Kc(),new djb(j));c.a.Ob();){b=(h=BD(c.a.Pb(),42),BD(h.dd(),149));e=b.a;e==null&&(e='');d=i4c(a.c,e);!d&&e.length==0&&(d=u4c(a));!!d&&!ze(d.c,b,false)&&Dsb(d.c,b)}for(g=Jsb(a.a,0);g.b!=g.d.c;){f=BD(Xsb(g),478);k=j4c(a.c,f.a);n=j4c(a.c,f.b);!!k&&!!n&&Dsb(k.c,new vgd(n,f.c))}Osb(a.a);for(m=Jsb(a.b,0);m.b!=m.d.c;){l=BD(Xsb(m),478);b=g4c(a.c,l.a);i=j4c(a.c,l.b);!!b&&!!i&&B3c(b,i,l.c)}Osb(a.b)} +function qvd(a,b,c){var d,e,f,g,h,i,j,k,l,m,n;f=new fC(a);g=new ird;e=(ko(g.g),ko(g.j),Uhb(g.b),ko(g.d),ko(g.i),Uhb(g.k),Uhb(g.c),Uhb(g.e),n=drd(g,f,null),ard(g,f),n);if(b){j=new fC(b);h=rvd(j);jfd(e,OC(GC(g2,1),Uhe,527,0,[h]))}m=false;l=false;if(c){j=new fC(c);que in j.a&&(m=aC(j,que).ge().a);rue in j.a&&(l=aC(j,rue).ge().a)}k=Vdd(Xdd(new Zdd,m),l);t2c(new w2c,e,k);que in f.a&&cC(f,que,null);if(m||l){i=new eC;nvd(k,i,m,l);cC(f,que,i)}d=new Prd(g);Ghe(new _ud(e),d)} +function pA(a,b,c){var d,e,f,g,h,i,j,k,l;g=new nB;j=OC(GC(WD,1),oje,25,15,[0]);e=-1;f=0;d=0;for(i=0;i0){if(e<0&&k.a){e=i;f=j[0];d=0}if(e>=0){h=k.b;if(i==e){h-=d++;if(h==0){return 0}}if(!wA(b,j,k,h,g)){i=e-1;j[0]=f;continue}}else{e=-1;if(!wA(b,j,k,0,g)){return 0}}}else{e=-1;if(bfb(k.c,0)==32){l=j[0];uA(b,j);if(j[0]>l){continue}}else if(ofb(b,k.c,j[0])){j[0]+=k.c.length;continue}return 0}}if(!mB(g,c)){return 0}return j[0]} +function SKd(a){var b,c,d,e,f,g,h,i;if(!a.f){i=new CNd;h=new CNd;b=KKd;g=b.a.zc(a,b);if(g==null){for(f=new Fyd(_Kd(a));f.e!=f.i.gc();){e=BD(Dyd(f),26);ytd(i,SKd(e))}b.a.Bc(a)!=null;b.a.gc()==0&&undefined}for(d=(!a.s&&(a.s=new cUd(t5,a,21,17)),new Fyd(a.s));d.e!=d.i.gc();){c=BD(Dyd(d),170);JD(c,99)&&wtd(h,BD(c,18))}vud(h);a.r=new UNd(a,(BD(qud(ZKd((NFd(),MFd).o),6),18),h.i),h.g);ytd(i,a.r);vud(i);a.f=new nNd((BD(qud(ZKd(MFd.o),5),18),i.i),i.g);$Kd(a).b&=-3}return a.f} +function rMb(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o;g=a.o;d=KC(WD,oje,25,g,15,1);e=KC(WD,oje,25,g,15,1);c=a.p;b=KC(WD,oje,25,c,15,1);f=KC(WD,oje,25,c,15,1);for(j=0;j=0&&!YMb(a,k,l)){--l}e[k]=l}for(n=0;n=0&&!YMb(a,h,o)){--h}f[o]=h}for(i=0;ib[m]&&md[i]&&aNb(a,i,m,false,true)}}} +function lRb(a){var b,c,d,e,f,g,h,i;c=Ccb(DD(vNb(a,(wSb(),cSb))));f=a.a.c.d;h=a.a.d.d;if(c){g=Y6c(c7c(new f7c(h.a,h.b),f),0.5);i=Y6c(R6c(a.e),0.5);b=c7c(P6c(new f7c(f.a,f.b),g),i);a7c(a.d,b)}else{e=Edb(ED(vNb(a.a,tSb)));d=a.d;if(f.a>=h.a){if(f.b>=h.b){d.a=h.a+(f.a-h.a)/2+e;d.b=h.b+(f.b-h.b)/2-e-a.e.b}else{d.a=h.a+(f.a-h.a)/2+e;d.b=f.b+(h.b-f.b)/2+e}}else{if(f.b>=h.b){d.a=f.a+(h.a-f.a)/2+e;d.b=h.b+(f.b-h.b)/2+e}else{d.a=f.a+(h.a-f.a)/2+e;d.b=f.b+(h.b-f.b)/2-e-a.e.b}}}} +function Qge(a,b){var c,d,e,f,g,h,i;if(a==null){return null}f=a.length;if(f==0){return ''}i=KC(TD,$ie,25,f,15,1);ACb(0,f,a.length);ACb(0,f,i.length);ffb(a,0,f,i,0);c=null;h=b;for(e=0,g=0;e0?qfb(c.a,0,f-1):''}}else{return !c?a:c.a}} +function DPb(a){r4c(a,new E3c(P3c(M3c(O3c(N3c(new R3c,Yle),'ELK DisCo'),'Layouter for arranging unconnected subgraphs. The subgraphs themselves are, by default, not laid out.'),new GPb)));p4c(a,Yle,Zle,Ksd(BPb));p4c(a,Yle,$le,Ksd(vPb));p4c(a,Yle,_le,Ksd(qPb));p4c(a,Yle,ame,Ksd(wPb));p4c(a,Yle,Zke,Ksd(zPb));p4c(a,Yle,$ke,Ksd(yPb));p4c(a,Yle,Yke,Ksd(APb));p4c(a,Yle,_ke,Ksd(xPb));p4c(a,Yle,Tle,Ksd(sPb));p4c(a,Yle,Ule,Ksd(rPb));p4c(a,Yle,Vle,Ksd(tPb));p4c(a,Yle,Wle,Ksd(uPb))} +function Zbc(a,b,c,d){var e,f,g,h,i,j,k,l,m;f=new b0b(a);__b(f,(j0b(),i0b));yNb(f,(Nyc(),Vxc),(dcd(),$bd));e=0;if(b){g=new H0b;yNb(g,(wtc(),$sc),b);yNb(f,$sc,b.i);G0b(g,(Ucd(),Tcd));F0b(g,f);m=k_b(b.e);for(j=m,k=0,l=j.length;k0){c-=d.length-b;if(c>=0){e.a+='0.';for(;c>egb.length;c-=egb.length){Rfb(e,egb)}Sfb(e,egb,QD(c));Qfb(e,d.substr(b))}else{c=b-c;Qfb(e,qfb(d,b,QD(c)));e.a+='.';Qfb(e,pfb(d,QD(c)))}}else{Qfb(e,d.substr(b));for(;c<-egb.length;c+=egb.length){Rfb(e,egb)}Sfb(e,egb,QD(-c))}return e.a} +function v6c(a,b,c,d){var e,f,g,h,i,j,k,l,m;i=c7c(new f7c(c.a,c.b),a);j=i.a*b.b-i.b*b.a;k=b.a*d.b-b.b*d.a;l=(i.a*d.b-i.b*d.a)/k;m=j/k;if(k==0){if(j==0){e=P6c(new f7c(c.a,c.b),Y6c(new f7c(d.a,d.b),0.5));f=S6c(a,e);g=S6c(P6c(new f7c(a.a,a.b),b),e);h=$wnd.Math.sqrt(d.a*d.a+d.b*d.b)*0.5;if(f=0&&l<=1&&m>=0&&m<=1?P6c(new f7c(a.a,a.b),Y6c(new f7c(b.a,b.b),l)):null}} +function OTb(a,b,c){var d,e,f,g,h;d=BD(vNb(a,(Nyc(),zwc)),21);c.a>b.a&&(d.Hc((i8c(),c8c))?(a.c.a+=(c.a-b.a)/2):d.Hc(e8c)&&(a.c.a+=c.a-b.a));c.b>b.b&&(d.Hc((i8c(),g8c))?(a.c.b+=(c.b-b.b)/2):d.Hc(f8c)&&(a.c.b+=c.b-b.b));if(BD(vNb(a,(wtc(),Ksc)),21).Hc((Orc(),Hrc))&&(c.a>b.a||c.b>b.b)){for(h=new olb(a.a);h.ab.a&&(d.Hc((i8c(),c8c))?(a.c.a+=(c.a-b.a)/2):d.Hc(e8c)&&(a.c.a+=c.a-b.a));c.b>b.b&&(d.Hc((i8c(),g8c))?(a.c.b+=(c.b-b.b)/2):d.Hc(f8c)&&(a.c.b+=c.b-b.b));if(BD(vNb(a,(wtc(),Ksc)),21).Hc((Orc(),Hrc))&&(c.a>b.a||c.b>b.b)){for(g=new olb(a.a);g.ab){e=0;f+=k.b+c;l.c[l.c.length]=k;k=new x$c(f,c);d=new PZc(0,k.f,k,c);s$c(k,d);e=0}if(d.b.c.length==0||i.f>=d.o&&i.f<=d.f||d.a*0.5<=i.f&&d.a*1.5>=i.f){EZc(d,i)}else{g=new PZc(d.s+d.r+c,k.f,k,c);s$c(k,g);EZc(g,i)}e=i.i+i.g}l.c[l.c.length]=k;return l} +function OKd(a){var b,c,d,e,f,g,h,i;if(!a.a){a.o=null;i=new GNd(a);b=new KNd;c=KKd;h=c.a.zc(a,c);if(h==null){for(g=new Fyd(_Kd(a));g.e!=g.i.gc();){f=BD(Dyd(g),26);ytd(i,OKd(f))}c.a.Bc(a)!=null;c.a.gc()==0&&undefined}for(e=(!a.s&&(a.s=new cUd(t5,a,21,17)),new Fyd(a.s));e.e!=e.i.gc();){d=BD(Dyd(e),170);JD(d,322)&&wtd(b,BD(d,34))}vud(b);a.k=new PNd(a,(BD(qud(ZKd((NFd(),MFd).o),7),18),b.i),b.g);ytd(i,a.k);vud(i);a.a=new nNd((BD(qud(ZKd(MFd.o),4),18),i.i),i.g);$Kd(a).b&=-2}return a.a} +function vZc(a,b,c,d,e,f,g){var h,i,j,k,l,m;l=false;i=ZZc(c.q,b.f+b.b-c.q.f);m=e-(c.q.e+i-g);if(m=(tCb(f,a.c.length),BD(a.c[f],200)).e;k=(h=MZc(d,m,false),h.a);if(k>b.b&&!j){return false}if(j||k<=b.b){if(j&&k>b.b){c.d=k;KZc(c,JZc(c,k))}else{$Zc(c.q,i);c.c=true}KZc(d,e-(c.s+c.r));OZc(d,c.q.e+c.q.d,b.f);s$c(b,d);if(a.c.length>f){v$c((tCb(f,a.c.length),BD(a.c[f],200)),d);(tCb(f,a.c.length),BD(a.c[f],200)).a.c.length==0&&Kkb(a,f)}l=true}return l} +function C2d(a,b,c,d){var e,f,g,h,i,j,k;k=S6d(a.e.Tg(),b);e=0;f=BD(a.g,119);i=null;Q6d();if(BD(b,66).Oj()){for(h=0;ha.o.a){k=(i-a.o.a)/2;h.b=$wnd.Math.max(h.b,k);h.c=$wnd.Math.max(h.c,k)}} +function rvd(a){var b,c,d,e,f,g,h,i;f=new b2c;Z1c(f,(Y1c(),V1c));for(d=(e=$B(a,KC(ZI,nie,2,0,6,1)),new vib(new amb((new mC(a,e)).b)));d.b0?a.i:0)>b&&i>0){f=0;g+=i+a.i;e=$wnd.Math.max(e,m);d+=i+a.i;i=0;m=0;if(c){++l;Ekb(a.n,new VZc(a.s,g,a.i))}h=0}m+=j.g+(h>0?a.i:0);i=$wnd.Math.max(i,j.f);c&&QZc(BD(Ikb(a.n,l),211),j);f+=j.g+(h>0?a.i:0);++h}e=$wnd.Math.max(e,m);d+=i;if(c){a.r=e;a.d=d;u$c(a.j)}return new J6c(a.s,a.t,e,d)} +function $fb(a,b,c,d,e){Zfb();var f,g,h,i,j,k,l,m,n;vCb(a,'src');vCb(c,'dest');m=rb(a);i=rb(c);rCb((m.i&4)!=0,'srcType is not an array');rCb((i.i&4)!=0,'destType is not an array');l=m.c;g=i.c;rCb((l.i&1)!=0?l==g:(g.i&1)==0,"Array types don't match");n=a.length;j=c.length;if(b<0||d<0||e<0||b+e>n||d+e>j){throw vbb(new pcb)}if((l.i&1)==0&&m!=i){k=CD(a);f=CD(c);if(PD(a)===PD(c)&&bd;){NC(f,h,k[--b])}}else{for(h=d+e;d0&&$Bb(a,b,c,d,e,true)} +function phb(){phb=ccb;nhb=OC(GC(WD,1),oje,25,15,[Rie,1162261467,Iie,1220703125,362797056,1977326743,Iie,387420489,Jje,214358881,429981696,815730721,1475789056,170859375,268435456,410338673,612220032,893871739,1280000000,1801088541,113379904,148035889,191102976,244140625,308915776,387420489,481890304,594823321,729000000,887503681,Iie,1291467969,1544804416,1838265625,60466176]);ohb=OC(GC(WD,1),oje,25,15,[-1,-1,31,19,15,13,11,11,10,9,9,8,8,8,8,7,7,7,7,7,7,7,6,6,6,6,6,6,6,6,6,6,6,6,6,6,5])} +function soc(a){var b,c,d,e,f,g,h,i;for(e=new olb(a.b);e.a=a.b.length){f[e++]=g.b[d++];f[e++]=g.b[d++]}else if(d>=g.b.length){f[e++]=a.b[c++];f[e++]=a.b[c++]}else if(g.b[d]0?a.i:0)}++b}Ce(a.n,i);a.d=c;a.r=d;a.g=0;a.f=0;a.e=0;a.o=Pje;a.p=Pje;for(f=new olb(a.b);f.a0){e=(!a.n&&(a.n=new cUd(D2,a,1,7)),BD(qud(a.n,0),137)).a;!e||Qfb(Qfb((b.a+=' "',b),e),'"')}}else{Qfb(Qfb((b.a+=' "',b),d),'"')}c=(!a.b&&(a.b=new y5d(z2,a,4,7)),!(a.b.i<=1&&(!a.c&&(a.c=new y5d(z2,a,5,8)),a.c.i<=1)));c?(b.a+=' [',b):(b.a+=' ',b);Qfb(b,Eb(new Gb,new Fyd(a.b)));c&&(b.a+=']',b);b.a+=gne;c&&(b.a+='[',b);Qfb(b,Eb(new Gb,new Fyd(a.c)));c&&(b.a+=']',b);return b.a} +function TQd(a,b){var c,d,e,f,g,h,i;if(a.a){h=a.a.ne();i=null;if(h!=null){b.a+=''+h}else{g=a.a.Dj();if(g!=null){f=hfb(g,wfb(91));if(f!=-1){i=g.substr(f);b.a+=''+qfb(g==null?Xhe:(uCb(g),g),0,f)}else{b.a+=''+g}}}if(!!a.d&&a.d.i!=0){e=true;b.a+='<';for(d=new Fyd(a.d);d.e!=d.i.gc();){c=BD(Dyd(d),87);e?(e=false):(b.a+=She,b);TQd(c,b)}b.a+='>'}i!=null&&(b.a+=''+i,b)}else if(a.e){h=a.e.zb;h!=null&&(b.a+=''+h,b)}else{b.a+='?';if(a.b){b.a+=' super ';TQd(a.b,b)}else{if(a.f){b.a+=' extends ';TQd(a.f,b)}}}} +function Z9b(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D;v=a.c;w=b.c;c=Jkb(v.a,a,0);d=Jkb(w.a,b,0);t=BD(W_b(a,(KAc(),HAc)).Kc().Pb(),11);C=BD(W_b(a,IAc).Kc().Pb(),11);u=BD(W_b(b,HAc).Kc().Pb(),11);D=BD(W_b(b,IAc).Kc().Pb(),11);r=k_b(t.e);A=k_b(C.g);s=k_b(u.e);B=k_b(D.g);Z_b(a,d,w);for(g=s,k=0,o=g.length;kk){new DOc((HOc(),GOc),c,b,j-k)}else if(j>0&&k>0){new DOc((HOc(),GOc),b,c,0);new DOc(GOc,c,b,0)}}return g} +function TUb(a,b){var c,d,e,f,g,h;for(g=new nib((new eib(a.f.b)).a);g.b;){f=lib(g);e=BD(f.cd(),594);if(b==1){if(e.gf()!=(ead(),dad)&&e.gf()!=_9c){continue}}else{if(e.gf()!=(ead(),aad)&&e.gf()!=bad){continue}}d=BD(BD(f.dd(),46).b,81);h=BD(BD(f.dd(),46).a,189);c=h.c;switch(e.gf().g){case 2:d.g.c=a.e.a;d.g.b=$wnd.Math.max(1,d.g.b+c);break;case 1:d.g.c=d.g.c+c;d.g.b=$wnd.Math.max(1,d.g.b-c);break;case 4:d.g.d=a.e.b;d.g.a=$wnd.Math.max(1,d.g.a+c);break;case 3:d.g.d=d.g.d+c;d.g.a=$wnd.Math.max(1,d.g.a-c);}}} +function nJc(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p;h=KC(WD,oje,25,b.b.c.length,15,1);j=KC(NQ,Kie,267,b.b.c.length,0,1);i=KC(OQ,kne,10,b.b.c.length,0,1);for(l=a.a,m=0,n=l.length;m0&&!!i[d]&&(o=jBc(a.b,i[d],e));p=$wnd.Math.max(p,e.c.c.b+o)}for(f=new olb(k.e);f.a1){throw vbb(new Wdb(Hwe))}if(!i){f=R6d(b,d.Kc().Pb());g.Fc(f)}}return xtd(a,I2d(a,b,c),g)} +function Pmc(a,b){var c,d,e,f;Jmc(b.b.j);MAb(NAb(new YAb(null,new Kub(b.d,16)),new $mc),new anc);for(f=new olb(b.d);f.aa.o.b){return false}c=V_b(a,zcd);h=b.d+b.a+(c.gc()-1)*g;if(h>a.o.b){return false}}return true} +function thb(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o;g=a.e;i=b.e;if(g==0){return b}if(i==0){return a}f=a.d;h=b.d;if(f+h==2){c=xbb(a.a[0],Yje);d=xbb(b.a[0],Yje);if(g==i){k=wbb(c,d);o=Tbb(k);n=Tbb(Pbb(k,32));return n==0?new Ugb(g,o):new Vgb(g,2,OC(GC(WD,1),oje,25,15,[o,n]))}return ghb(g<0?Qbb(d,c):Qbb(c,d))}else if(g==i){m=g;l=f>=h?uhb(a.a,f,b.a,h):uhb(b.a,h,a.a,f)}else{e=f!=h?f>h?1:-1:whb(a.a,b.a,f);if(e==0){return Hgb(),Ggb}if(e==1){m=g;l=zhb(a.a,f,b.a,h)}else{m=i;l=zhb(b.a,h,a.a,f)}}j=new Vgb(m,l.length,l);Jgb(j);return j} +function oZb(a,b,c,d,e,f,g){var h,i,j,k,l,m,n;l=Ccb(DD(vNb(b,(Nyc(),vxc))));m=null;f==(KAc(),HAc)&&d.c.i==c?(m=d.c):f==IAc&&d.d.i==c&&(m=d.d);j=g;if(!j||!l||!!m){k=(Ucd(),Scd);m?(k=m.j):fcd(BD(vNb(c,Vxc),98))&&(k=f==HAc?Tcd:zcd);i=lZb(a,b,c,f,k,d);h=kZb((Q_b(c),d));if(f==HAc){QZb(h,BD(Ikb(i.j,0),11));RZb(h,e)}else{QZb(h,e);RZb(h,BD(Ikb(i.j,0),11))}j=new yZb(d,h,i,BD(vNb(i,(wtc(),$sc)),11),f,!m)}else{Ekb(j.e,d);n=$wnd.Math.max(Edb(ED(vNb(j.d,Zwc))),Edb(ED(vNb(d,Zwc))));yNb(j.d,Zwc,n)}Rc(a.a,d,new BZb(j.d,b,f));return j} +function V1d(a,b){var c,d,e,f,g,h,i,j,k,l;k=null;!!a.d&&(k=BD(Phb(a.d,b),138));if(!k){f=a.a.Mh();l=f.i;if(!a.d||Vhb(a.d)!=l){i=new Lqb;!!a.d&&Ld(i,a.d);j=i.f.c+i.g.c;for(h=j;h0){n=(o-1)*c;!!h&&(n+=d);!!k&&(n+=d);n=a.b[e+1]){e+=2}else if(c0){d=new Tkb(BD(Qc(a.a,f),21));mmb();Okb(d,new EZb(b));e=new Bib(f.b,0);while(e.bv)){i=2;g=Ohe}else if(i==0){i=1;g=A}else{i=0;g=A}}else{n=A>=g||g-A0?1:Ny(isNaN(d),isNaN(0)))>=0^(null,My(Jqe),($wnd.Math.abs(h)<=Jqe||h==0||isNaN(h)&&isNaN(0)?0:h<0?-1:h>0?1:Ny(isNaN(h),isNaN(0)))>=0)){return $wnd.Math.max(h,d)}My(Jqe);if(($wnd.Math.abs(d)<=Jqe||d==0||isNaN(d)&&isNaN(0)?0:d<0?-1:d>0?1:Ny(isNaN(d),isNaN(0)))>0){return $wnd.Math.sqrt(h*h+d*d)}return -$wnd.Math.sqrt(h*h+d*d)} +function Kge(a,b){var c,d,e,f,g,h;if(!b)return;!a.a&&(a.a=new Wvb);if(a.e==2){Tvb(a.a,b);return}if(b.e==1){for(e=0;e=Tje?Efb(c,Tee(d)):Afb(c,d&aje);g=(++vfe,new Hge(10,null,0));Vvb(a.a,g,h-1)}else{c=(g.bm().length+f,new Ifb);Efb(c,g.bm())}if(b.e==0){d=b._l();d>=Tje?Efb(c,Tee(d)):Afb(c,d&aje)}else{Efb(c,b.bm())}BD(g,521).b=c.a} +function rgb(a){var b,c,d,e,f;if(a.g!=null){return a.g}if(a.a<32){a.g=rhb(Cbb(a.f),QD(a.e));return a.g}e=shb((!a.c&&(a.c=fhb(a.f)),a.c),0);if(a.e==0){return e}b=(!a.c&&(a.c=fhb(a.f)),a.c).e<0?2:1;c=e.length;d=-a.e+c-b;f=new Ufb;f.a+=''+e;if(a.e>0&&d>=-6){if(d>=0){Tfb(f,c-QD(a.e),String.fromCharCode(46))}else{f.a=qfb(f.a,0,b-1)+'0.'+pfb(f.a,b-1);Tfb(f,b+1,zfb(egb,0,-QD(d)-1))}}else{if(c-b>=1){Tfb(f,b,String.fromCharCode(46));++c}Tfb(f,c,String.fromCharCode(69));d>0&&Tfb(f,++c,String.fromCharCode(43));Tfb(f,++c,''+Ubb(Cbb(d)))}a.g=f.a;return a.g} +function npc(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q;if(c.dc()){return}h=0;m=0;d=c.Kc();o=BD(d.Pb(),19).a;while(h1&&(i=j.mg(i,a.a,h))}if(i.c.length==1){return BD(Ikb(i,i.c.length-1),220)}if(i.c.length==2){return lYc((tCb(0,i.c.length),BD(i.c[0],220)),(tCb(1,i.c.length),BD(i.c[1],220)),g,f)}return null} +function JNb(a){var b,c,d,e,f,g;Hkb(a.a,new PNb);for(c=new olb(a.a);c.a=$wnd.Math.abs(d.b)){d.b=0;f.d+f.a>g.d&&f.dg.c&&f.c0){b=new _zd(a.i,a.g);c=a.i;f=c<100?null:new Ixd(c);if(a.ij()){for(d=0;d0){h=a.g;j=a.i;oud(a);f=j<100?null:new Ixd(j);for(d=0;d>13|(a.m&15)<<9;e=a.m>>4&8191;f=a.m>>17|(a.h&255)<<5;g=(a.h&1048320)>>8;h=b.l&8191;i=b.l>>13|(b.m&15)<<9;j=b.m>>4&8191;k=b.m>>17|(b.h&255)<<5;l=(b.h&1048320)>>8;B=c*h;C=d*h;D=e*h;F=f*h;G=g*h;if(i!=0){C+=c*i;D+=d*i;F+=e*i;G+=f*i}if(j!=0){D+=c*j;F+=d*j;G+=e*j}if(k!=0){F+=c*k;G+=d*k}l!=0&&(G+=c*l);n=B&Eje;o=(C&511)<<13;m=n+o;q=B>>22;r=C>>9;s=(D&262143)<<4;t=(F&31)<<17;p=q+r+s+t;v=D>>18;w=F>>5;A=(G&4095)<<8;u=v+w+A;p+=m>>22;m&=Eje;u+=p>>22;p&=Eje;u&=Fje;return TC(m,p,u)} +function o7b(a){var b,c,d,e,f,g,h;h=BD(Ikb(a.j,0),11);if(h.g.c.length!=0&&h.e.c.length!=0){throw vbb(new Zdb('Interactive layout does not support NORTH/SOUTH ports with incoming _and_ outgoing edges.'))}if(h.g.c.length!=0){f=Pje;for(c=new olb(h.g);c.a4){if(a.wj(b)){if(a.rk()){e=BD(b,49);d=e.Ug();i=d==a.e&&(a.Dk()?e.Og(e.Vg(),a.zk())==a.Ak():-1-e.Vg()==a.aj());if(a.Ek()&&!i&&!d&&!!e.Zg()){for(f=0;f0&&(j=a.n.a/f);break;case 2:case 4:e=a.i.o.b;e>0&&(j=a.n.b/e);}yNb(a,(wtc(),htc),j)}i=a.o;g=a.a;if(d){g.a=d.a;g.b=d.b;a.d=true}else if(b!=bcd&&b!=ccd&&h!=Scd){switch(h.g){case 1:g.a=i.a/2;break;case 2:g.a=i.a;g.b=i.b/2;break;case 3:g.a=i.a/2;g.b=i.b;break;case 4:g.b=i.b/2;}}else{g.a=i.a/2;g.b=i.b/2}} +function vwd(a){var b,c,d,e,f,g,h,i,j,k;if(a.ej()){k=a.Vi();i=a.fj();if(k>0){b=new Aud(a.Gi());c=k;f=c<100?null:new Ixd(c);Cvd(a,c,b.g);e=c==1?a.Zi(4,qud(b,0),null,0,i):a.Zi(6,b,null,-1,i);if(a.bj()){for(d=new Fyd(b);d.e!=d.i.gc();){f=a.dj(Dyd(d),f)}if(!f){a.$i(e)}else{f.Ei(e);f.Fi()}}else{if(!f){a.$i(e)}else{f.Ei(e);f.Fi()}}}else{Cvd(a,a.Vi(),a.Wi());a.$i(a.Zi(6,(mmb(),jmb),null,-1,i))}}else if(a.bj()){k=a.Vi();if(k>0){h=a.Wi();j=k;Cvd(a,k,h);f=j<100?null:new Ixd(j);for(d=0;da.d[g.p]){c+=zHc(a.b,f)*BD(i.b,19).a;Wjb(a.a,meb(f))}}while(!akb(a.a)){xHc(a.b,BD(fkb(a.a),19).a)}}return c} +function eed(a,b,c,d){var e,f,g,h,i,j,k,l,m,n,o,p,q;l=new g7c(BD(hkd(a,(X7c(),R7c)),8));l.a=$wnd.Math.max(l.a-c.b-c.c,0);l.b=$wnd.Math.max(l.b-c.d-c.a,0);e=ED(hkd(a,L7c));(e==null||(uCb(e),e)<=0)&&(e=1.3);h=new Rkb;for(o=new Fyd((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a));o.e!=o.i.gc();){n=BD(Dyd(o),33);g=new xed(n);h.c[h.c.length]=g}m=BD(hkd(a,M7c),311);switch(m.g){case 3:q=bed(h,b,l.a,l.b,(j=d,uCb(e),e,j));break;case 1:q=aed(h,b,l.a,l.b,(k=d,uCb(e),e,k));break;default:q=ced(h,b,l.a,l.b,(i=d,uCb(e),e,i));}f=new wed(q);p=fed(f,b,c,l.a,l.b,d,(uCb(e),e));Afd(a,p.a,p.b,false,true)} +function vkc(a,b){var c,d,e,f;c=b.b;f=new Tkb(c.j);e=0;d=c.j;d.c=KC(SI,Uhe,1,0,5,1);hkc(BD(Si(a.b,(Ucd(),Acd),(Fkc(),Ekc)),15),c);e=ikc(f,e,new blc,d);hkc(BD(Si(a.b,Acd,Dkc),15),c);e=ikc(f,e,new dlc,d);hkc(BD(Si(a.b,Acd,Ckc),15),c);hkc(BD(Si(a.b,zcd,Ekc),15),c);hkc(BD(Si(a.b,zcd,Dkc),15),c);e=ikc(f,e,new flc,d);hkc(BD(Si(a.b,zcd,Ckc),15),c);hkc(BD(Si(a.b,Rcd,Ekc),15),c);e=ikc(f,e,new hlc,d);hkc(BD(Si(a.b,Rcd,Dkc),15),c);e=ikc(f,e,new jlc,d);hkc(BD(Si(a.b,Rcd,Ckc),15),c);hkc(BD(Si(a.b,Tcd,Ekc),15),c);e=ikc(f,e,new Pkc,d);hkc(BD(Si(a.b,Tcd,Dkc),15),c);hkc(BD(Si(a.b,Tcd,Ckc),15),c)} +function nbc(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p;Odd(b,'Layer size calculation',1);k=Pje;j=Qje;e=false;for(h=new olb(a.b);h.a0.5?(r-=g*2*(o-0.5)):o<0.5&&(r+=f*2*(0.5-o));e=h.d.b;rq.a-p-k&&(r=q.a-p-k);h.n.a=b+r}} +function ced(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q;h=KC(UD,Vje,25,a.c.length,15,1);m=new gub(new Ned);_tb(m,a);j=0;p=new Rkb;while(m.b.c.length!=0){g=BD(m.b.c.length==0?null:Ikb(m.b,0),157);if(j>1&&red(g)*qed(g)/2>h[0]){f=0;while(fh[f]){++f}o=new Jib(p,0,f+1);l=new wed(o);k=red(g)/qed(g);i=fed(l,b,new p0b,c,d,e,k);P6c(X6c(l.e),i);zCb(cub(m,l));n=new Jib(p,f+1,p.c.length);_tb(m,n);p.c=KC(SI,Uhe,1,0,5,1);j=0;Dlb(h,h.length,0)}else{q=m.b.c.length==0?null:Ikb(m.b,0);q!=null&&fub(m,0);j>0&&(h[j]=h[j-1]);h[j]+=red(g)*qed(g);++j;p.c[p.c.length]=g}}return p} +function Wac(a){var b,c,d,e,f;d=BD(vNb(a,(Nyc(),mxc)),163);if(d==(Ctc(),ytc)){for(c=new Sr(ur(R_b(a).a.Kc(),new Sq));Qr(c);){b=BD(Rr(c),17);if(!Yac(b)){throw vbb(new y2c(Fne+P_b(a)+"' has its layer constraint set to FIRST_SEPARATE, but has at least one incoming edge. "+'FIRST_SEPARATE nodes must not have incoming edges.'))}}}else if(d==Atc){for(f=new Sr(ur(U_b(a).a.Kc(),new Sq));Qr(f);){e=BD(Rr(f),17);if(!Yac(e)){throw vbb(new y2c(Fne+P_b(a)+"' has its layer constraint set to LAST_SEPARATE, but has at least one outgoing edge. "+'LAST_SEPARATE nodes must not have outgoing edges.'))}}}} +function C9b(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o;Odd(b,'Label dummy removal',1);d=Edb(ED(vNb(a,(Nyc(),nyc))));e=Edb(ED(vNb(a,ryc)));j=BD(vNb(a,Lwc),103);for(i=new olb(a.b);i.a0&&iCc(a,h,l)}for(e=new olb(l);e.a>19!=0){b=hD(b);i=!i}g=_C(b);f=false;e=false;d=false;if(a.h==Gje&&a.m==0&&a.l==0){e=true;f=true;if(g==-1){a=SC((wD(),sD));d=true;i=!i}else{h=lD(a,g);i&&ZC(h);c&&(QC=TC(0,0,0));return h}}else if(a.h>>19!=0){f=true;a=hD(a);d=true;i=!i}if(g!=-1){return WC(a,g,i,f,c)}if(eD(a,b)<0){c&&(f?(QC=hD(a)):(QC=TC(a.l,a.m,a.h)));return TC(0,0,0)}return XC(d?a:TC(a.l,a.m,a.h),b,i,f,e,c)} +function F2c(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o;if(a.e&&a.c.cb.f||b.g>a.f){return}c=0;d=0;for(g=a.w.a.ec().Kc();g.Ob();){e=BD(g.Pb(),11);aRc(l7c(OC(GC(m1,1),nie,8,0,[e.i.n,e.n,e.a])).b,b.g,b.f)&&++c}for(h=a.r.a.ec().Kc();h.Ob();){e=BD(h.Pb(),11);aRc(l7c(OC(GC(m1,1),nie,8,0,[e.i.n,e.n,e.a])).b,b.g,b.f)&&--c}for(i=b.w.a.ec().Kc();i.Ob();){e=BD(i.Pb(),11);aRc(l7c(OC(GC(m1,1),nie,8,0,[e.i.n,e.n,e.a])).b,a.g,a.f)&&++d}for(f=b.r.a.ec().Kc();f.Ob();){e=BD(f.Pb(),11);aRc(l7c(OC(GC(m1,1),nie,8,0,[e.i.n,e.n,e.a])).b,a.g,a.f)&&--d}if(c=0){f=wid(b,c.substr(1,h-1));l=c.substr(h+1,j-(h+1));return pid(b,l,f)}}else{d=-1;Vcb==null&&(Vcb=new RegExp('\\d'));if(Vcb.test(String.fromCharCode(i))){d=lfb(c,wfb(46),j-1);if(d>=0){e=BD(hid(b,Bid(b,c.substr(1,d-1)),false),58);k=0;try{k=Icb(c.substr(d+1),Rie,Ohe)}catch(a){a=ubb(a);if(JD(a,127)){g=a;throw vbb(new rFd(g))}else throw vbb(a)}if(k=0){return c}switch($1d(q1d(a,c))){case 2:{if(dfb('',o1d(a,c.Hj()).ne())){i=b2d(q1d(a,c));h=a2d(q1d(a,c));k=r1d(a,b,i,h);if(k){return k}e=f1d(a,b);for(g=0,l=e.gc();g1){throw vbb(new Wdb(Hwe))}k=S6d(a.e.Tg(),b);d=BD(a.g,119);for(g=0;g1;for(j=new b1b(m.b);llb(j.a)||llb(j.b);){i=BD(llb(j.a)?mlb(j.a):mlb(j.b),17);l=i.c==m?i.d:i.c;$wnd.Math.abs(l7c(OC(GC(m1,1),nie,8,0,[l.i.n,l.n,l.a])).b-g.b)>1&&GNc(a,i,g,f,m)}}} +function XPc(a){var b,c,d,e,f,g;e=new Bib(a.e,0);d=new Bib(a.a,0);if(a.d){for(c=0;cOqe){f=b;g=0;while($wnd.Math.abs(b-f)0);e.a.Xb(e.c=--e.b);WPc(a,a.b-g,f,d,e);sCb(e.b0);d.a.Xb(d.c=--d.b)}if(!a.d){for(c=0;c0){a.f[k.p]=n/(k.e.c.length+k.g.c.length);a.c=$wnd.Math.min(a.c,a.f[k.p]);a.b=$wnd.Math.max(a.b,a.f[k.p])}else h&&(a.f[k.p]=n)}} +function $9d(a){a.b=null;a.bb=null;a.fb=null;a.qb=null;a.a=null;a.c=null;a.d=null;a.e=null;a.f=null;a.n=null;a.M=null;a.L=null;a.Q=null;a.R=null;a.K=null;a.db=null;a.eb=null;a.g=null;a.i=null;a.j=null;a.k=null;a.gb=null;a.o=null;a.p=null;a.q=null;a.r=null;a.$=null;a.ib=null;a.S=null;a.T=null;a.t=null;a.s=null;a.u=null;a.v=null;a.w=null;a.B=null;a.A=null;a.C=null;a.D=null;a.F=null;a.G=null;a.H=null;a.I=null;a.J=null;a.P=null;a.Z=null;a.U=null;a.V=null;a.W=null;a.X=null;a.Y=null;a._=null;a.ab=null;a.cb=null;a.hb=null;a.nb=null;a.lb=null;a.mb=null;a.ob=null;a.pb=null;a.jb=null;a.kb=null;a.N=false;a.O=false} +function l5b(a,b,c){var d,e,f,g;Odd(c,'Graph transformation ('+a.a+')',1);g=Mu(b.a);for(f=new olb(b.b);f.a0){a.a=i+(n-1)*f;b.c.b+=a.a;b.f.b+=a.a}}if(o.a.gc()!=0){m=new tPc(1,f);n=sPc(m,b,o,p,b.f.b+i-b.c.b);n>0&&(b.f.b+=i+(n-1)*f)}} +function kKd(a,b){var c,d,e,f;f=a.F;if(b==null){a.F=null;$Jd(a,null)}else{a.F=(uCb(b),b);d=hfb(b,wfb(60));if(d!=-1){e=b.substr(0,d);hfb(b,wfb(46))==-1&&!dfb(e,Khe)&&!dfb(e,Eve)&&!dfb(e,Fve)&&!dfb(e,Gve)&&!dfb(e,Hve)&&!dfb(e,Ive)&&!dfb(e,Jve)&&!dfb(e,Kve)&&(e=Lve);c=kfb(b,wfb(62));c!=-1&&(e+=''+b.substr(c+1));$Jd(a,e)}else{e=b;if(hfb(b,wfb(46))==-1){d=hfb(b,wfb(91));d!=-1&&(e=b.substr(0,d));if(!dfb(e,Khe)&&!dfb(e,Eve)&&!dfb(e,Fve)&&!dfb(e,Gve)&&!dfb(e,Hve)&&!dfb(e,Ive)&&!dfb(e,Jve)&&!dfb(e,Kve)){e=Lve;d!=-1&&(e+=''+b.substr(d))}else{e=b}}$Jd(a,e);e==b&&(a.F=a.D)}}(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,5,f,b))} +function AMc(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t;p=b.b.c.length;if(p<3){return}n=KC(WD,oje,25,p,15,1);l=0;for(k=new olb(b.b);k.ag)&&Qqb(a.b,BD(q.b,17))}}++h}f=g}}}} +function o5c(b,c){var d;if(c==null||dfb(c,Xhe)){return null}if(c.length==0&&b.k!=(_5c(),W5c)){return null}switch(b.k.g){case 1:return efb(c,kse)?(Bcb(),Acb):efb(c,lse)?(Bcb(),zcb):null;case 2:try{return meb(Icb(c,Rie,Ohe))}catch(a){a=ubb(a);if(JD(a,127)){return null}else throw vbb(a)}case 4:try{return Hcb(c)}catch(a){a=ubb(a);if(JD(a,127)){return null}else throw vbb(a)}case 3:return c;case 5:j5c(b);return m5c(b,c);case 6:j5c(b);return n5c(b,b.a,c);case 7:try{d=l5c(b);d.Jf(c);return d}catch(a){a=ubb(a);if(JD(a,32)){return null}else throw vbb(a)}default:throw vbb(new Zdb('Invalid type set for this layout option.'));}} +function JWb(a){AWb();var b,c,d,e,f,g,h;h=new CWb;for(c=new olb(a);c.a=h.b.c)&&(h.b=b);if(!h.c||b.c<=h.c.c){h.d=h.c;h.c=b}(!h.e||b.d>=h.e.d)&&(h.e=b);(!h.f||b.d<=h.f.d)&&(h.f=b)}d=new NWb((lWb(),hWb));rXb(a,yWb,new amb(OC(GC(bQ,1),Uhe,369,0,[d])));g=new NWb(kWb);rXb(a,xWb,new amb(OC(GC(bQ,1),Uhe,369,0,[g])));e=new NWb(iWb);rXb(a,wWb,new amb(OC(GC(bQ,1),Uhe,369,0,[e])));f=new NWb(jWb);rXb(a,vWb,new amb(OC(GC(bQ,1),Uhe,369,0,[f])));DWb(d.c,hWb);DWb(e.c,iWb);DWb(f.c,jWb);DWb(g.c,kWb);h.a.c=KC(SI,Uhe,1,0,5,1);Gkb(h.a,d.c);Gkb(h.a,Su(e.c));Gkb(h.a,f.c);Gkb(h.a,Su(g.c));return h} +function jxd(a){var b;switch(a.d){case 1:{if(a.hj()){return a.o!=-2}break}case 2:{if(a.hj()){return a.o==-2}break}case 3:case 5:case 4:case 6:case 7:{return a.o>-2}default:{return false}}b=a.gj();switch(a.p){case 0:return b!=null&&Ccb(DD(b))!=Kbb(a.k,0);case 1:return b!=null&&BD(b,217).a!=Tbb(a.k)<<24>>24;case 2:return b!=null&&BD(b,172).a!=(Tbb(a.k)&aje);case 6:return b!=null&&Kbb(BD(b,162).a,a.k);case 5:return b!=null&&BD(b,19).a!=Tbb(a.k);case 7:return b!=null&&BD(b,184).a!=Tbb(a.k)<<16>>16;case 3:return b!=null&&Edb(ED(b))!=a.j;case 4:return b!=null&&BD(b,155).a!=a.j;default:return b==null?a.n!=null:!pb(b,a.n);}} +function nOd(a,b,c){var d,e,f,g;if(a.Fk()&&a.Ek()){g=oOd(a,BD(c,56));if(PD(g)!==PD(c)){a.Oi(b);a.Ui(b,pOd(a,b,g));if(a.rk()){f=(e=BD(c,49),a.Dk()?a.Bk()?e.ih(a.b,zUd(BD(XKd(wjd(a.b),a.aj()),18)).n,BD(XKd(wjd(a.b),a.aj()).Yj(),26).Bj(),null):e.ih(a.b,bLd(e.Tg(),zUd(BD(XKd(wjd(a.b),a.aj()),18))),null,null):e.ih(a.b,-1-a.aj(),null,null));!BD(g,49).eh()&&(f=(d=BD(g,49),a.Dk()?a.Bk()?d.gh(a.b,zUd(BD(XKd(wjd(a.b),a.aj()),18)).n,BD(XKd(wjd(a.b),a.aj()).Yj(),26).Bj(),f):d.gh(a.b,bLd(d.Tg(),zUd(BD(XKd(wjd(a.b),a.aj()),18))),null,f):d.gh(a.b,-1-a.aj(),null,f)));!!f&&f.Fi()}oid(a.b)&&a.$i(a.Zi(9,c,g,b,false));return g}}return c} +function Noc(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;k=Edb(ED(vNb(a,(Nyc(),oyc))));d=Edb(ED(vNb(a,Cyc)));m=new _fd;yNb(m,oyc,k+d);j=b;r=j.d;p=j.c.i;s=j.d.i;q=G1b(p.c);t=G1b(s.c);e=new Rkb;for(l=q;l<=t;l++){h=new b0b(a);__b(h,(j0b(),g0b));yNb(h,(wtc(),$sc),j);yNb(h,Vxc,(dcd(),$bd));yNb(h,qyc,m);n=BD(Ikb(a.b,l),29);l==q?Z_b(h,n.a.c.length-c,n):$_b(h,n);u=Edb(ED(vNb(j,Zwc)));if(u<0){u=0;yNb(j,Zwc,u)}h.o.b=u;o=$wnd.Math.floor(u/2);g=new H0b;G0b(g,(Ucd(),Tcd));F0b(g,h);g.n.b=o;i=new H0b;G0b(i,zcd);F0b(i,h);i.n.b=o;RZb(j,g);f=new UZb;tNb(f,j);yNb(f,jxc,null);QZb(f,i);RZb(f,r);Ooc(h,j,f);e.c[e.c.length]=f;j=f}return e} +function sbc(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t;i=BD(Y_b(a,(Ucd(),Tcd)).Kc().Pb(),11).e;n=BD(Y_b(a,zcd).Kc().Pb(),11).g;h=i.c.length;t=A0b(BD(Ikb(a.j,0),11));while(h-->0){p=(tCb(0,i.c.length),BD(i.c[0],17));e=(tCb(0,n.c.length),BD(n.c[0],17));s=e.d.e;f=Jkb(s,e,0);SZb(p,e.d,f);QZb(e,null);RZb(e,null);o=p.a;b&&Dsb(o,new g7c(t));for(d=Jsb(e.a,0);d.b!=d.d.c;){c=BD(Xsb(d),8);Dsb(o,new g7c(c))}r=p.b;for(m=new olb(e.b);m.a0&&(g=$wnd.Math.max(g,IJb(a.C.b+d.d.b,e)))}else{n=m+k.d.c+a.w+d.d.b;g=$wnd.Math.max(g,(Iy(),My(ple),$wnd.Math.abs(l-e)<=ple||l==e||isNaN(l)&&isNaN(e)?0:n/(e-l)))}k=d;l=e;m=f}if(!!a.C&&a.C.c>0){n=m+a.C.c;j&&(n+=k.d.c);g=$wnd.Math.max(g,(Iy(),My(ple),$wnd.Math.abs(l-1)<=ple||l==1||isNaN(l)&&isNaN(1)?0:n/(1-l)))}c.n.b=0;c.a.a=g} +function NKb(a,b){var c,d,e,f,g,h,i,j,k,l,m,n;c=BD(Mpb(a.b,b),124);i=BD(BD(Qc(a.r,b),21),84);if(i.dc()){c.n.d=0;c.n.a=0;return}j=a.u.Hc((rcd(),ncd));g=0;a.A.Hc((tdd(),sdd))&&SKb(a,b);h=i.Kc();k=null;m=0;l=0;while(h.Ob()){d=BD(h.Pb(),111);f=Edb(ED(d.b.We((CKb(),BKb))));e=d.b.rf().b;if(!k){!!a.C&&a.C.d>0&&(g=$wnd.Math.max(g,IJb(a.C.d+d.d.d,f)))}else{n=l+k.d.a+a.w+d.d.d;g=$wnd.Math.max(g,(Iy(),My(ple),$wnd.Math.abs(m-f)<=ple||m==f||isNaN(m)&&isNaN(f)?0:n/(f-m)))}k=d;m=f;l=e}if(!!a.C&&a.C.a>0){n=l+a.C.a;j&&(n+=k.d.a);g=$wnd.Math.max(g,(Iy(),My(ple),$wnd.Math.abs(m-1)<=ple||m==1||isNaN(m)&&isNaN(1)?0:n/(1-m)))}c.n.d=0;c.a.b=g} +function _Ec(a,b,c){var d,e,f,g,h,i;this.g=a;h=b.d.length;i=c.d.length;this.d=KC(OQ,kne,10,h+i,0,1);for(g=0;g0?ZEc(this,this.f/this.a):REc(b.g,b.d[0]).a!=null&&REc(c.g,c.d[0]).a!=null?ZEc(this,(Edb(REc(b.g,b.d[0]).a)+Edb(REc(c.g,c.d[0]).a))/2):REc(b.g,b.d[0]).a!=null?ZEc(this,REc(b.g,b.d[0]).a):REc(c.g,c.d[0]).a!=null&&ZEc(this,REc(c.g,c.d[0]).a)} +function BUb(a,b){var c,d,e,f,g,h,i,j,k,l;a.a=new dVb(oqb(t1));for(d=new olb(b.a);d.a=1){if(q-g>0&&l>=0){i.n.a+=p;i.n.b+=f*g}else if(q-g<0&&k>=0){i.n.a+=p*q;i.n.b+=f}}}a.o.a=b.a;a.o.b=b.b;yNb(a,(Nyc(),Fxc),(tdd(),d=BD(gdb(I1),9),new xqb(d,BD(_Bb(d,d.length),9),0)))} +function iFd(a,b,c,d,e,f){var g;if(!(b==null||!OEd(b,zEd,AEd))){throw vbb(new Wdb('invalid scheme: '+b))}if(!a&&!(c!=null&&hfb(c,wfb(35))==-1&&c.length>0&&(BCb(0,c.length),c.charCodeAt(0)!=47))){throw vbb(new Wdb('invalid opaquePart: '+c))}if(a&&!(b!=null&&hnb(GEd,b.toLowerCase()))&&!(c==null||!OEd(c,CEd,DEd))){throw vbb(new Wdb(mve+c))}if(a&&b!=null&&hnb(GEd,b.toLowerCase())&&!eFd(c)){throw vbb(new Wdb(mve+c))}if(!fFd(d)){throw vbb(new Wdb('invalid device: '+d))}if(!hFd(e)){g=e==null?'invalid segments: null':'invalid segment: '+VEd(e);throw vbb(new Wdb(g))}if(!(f==null||hfb(f,wfb(35))==-1)){throw vbb(new Wdb('invalid query: '+f))}} +function nVc(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;Odd(b,'Calculate Graph Size',1);b.n&&!!a&&Tdd(b,i6d(a),(pgd(),mgd));h=dme;i=dme;f=ere;g=ere;for(l=new Fyd((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a));l.e!=l.i.gc();){j=BD(Dyd(l),33);o=j.i;p=j.j;r=j.g;d=j.f;e=BD(hkd(j,(Y9c(),S8c)),142);h=$wnd.Math.min(h,o-e.b);i=$wnd.Math.min(i,p-e.d);f=$wnd.Math.max(f,o+r+e.c);g=$wnd.Math.max(g,p+d+e.a)}n=BD(hkd(a,(Y9c(),f9c)),116);m=new f7c(h-n.b,i-n.d);for(k=new Fyd((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a));k.e!=k.i.gc();){j=BD(Dyd(k),33);dld(j,j.i-m.a);eld(j,j.j-m.b)}q=f-h+(n.b+n.c);c=g-i+(n.d+n.a);cld(a,q);ald(a,c);b.n&&!!a&&Tdd(b,i6d(a),(pgd(),mgd))} +function rGb(a){var b,c,d,e,f,g,h,i,j,k;d=new Rkb;for(g=new olb(a.e.a);g.a0){gA(a,c,0);c.a+=String.fromCharCode(d);e=lA(b,f);gA(a,c,e);f+=e-1;continue}if(d==39){if(f+11){p=KC(WD,oje,25,a.b.b.c.length,15,1);l=0;for(j=new olb(a.b.b);j.a=h&&e<=i){if(h<=e&&f<=i){c[k++]=e;c[k++]=f;d+=2}else if(h<=e){c[k++]=e;c[k++]=i;a.b[d]=i+1;g+=2}else if(f<=i){c[k++]=h;c[k++]=f;d+=2}else{c[k++]=h;c[k++]=i;a.b[d]=i+1}}else if(iQie)&&h<10);zVb(a.c,new _Ub);OUb(a);vVb(a.c);yUb(a.f)} +function sZb(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q;if(!Ccb(DD(vNb(c,(Nyc(),fxc))))){return}for(h=new olb(c.j);h.a=2){i=Jsb(c,0);g=BD(Xsb(i),8);h=BD(Xsb(i),8);while(h.a0&&jEb(j,true,(ead(),bad));h.k==(j0b(),e0b)&&kEb(j);Rhb(a.f,h,b)}}} +function Bbc(a,b,c){var d,e,f,g,h,i,j,k,l,m;Odd(c,'Node promotion heuristic',1);a.g=b;Abc(a);a.q=BD(vNb(b,(Nyc(),rxc)),260);k=BD(vNb(a.g,qxc),19).a;f=new Jbc;switch(a.q.g){case 2:case 1:Dbc(a,f);break;case 3:a.q=(kAc(),jAc);Dbc(a,f);i=0;for(h=new olb(a.a);h.aa.j){a.q=dAc;Dbc(a,f)}break;case 4:a.q=(kAc(),jAc);Dbc(a,f);j=0;for(e=new olb(a.b);e.aa.k){a.q=gAc;Dbc(a,f)}break;case 6:m=QD($wnd.Math.ceil(a.f.length*k/100));Dbc(a,new Mbc(m));break;case 5:l=QD($wnd.Math.ceil(a.d*k/100));Dbc(a,new Pbc(l));break;default:Dbc(a,f);}Ebc(a,b);Qdd(c)} +function fFc(a,b,c){var d,e,f,g;this.j=a;this.e=WZb(a);this.o=this.j.e;this.i=!!this.o;this.p=this.i?BD(Ikb(c,Q_b(this.o).p),214):null;e=BD(vNb(a,(wtc(),Ksc)),21);this.g=e.Hc((Orc(),Hrc));this.b=new Rkb;this.d=new rHc(this.e);g=BD(vNb(this.j,jtc),230);this.q=wFc(b,g,this.e);this.k=new BGc(this);f=Ou(OC(GC(qY,1),Uhe,225,0,[this,this.d,this.k,this.q]));if(b==(rGc(),oGc)&&!Ccb(DD(vNb(a,(Nyc(),Awc))))){d=new SEc(this.e);f.c[f.c.length]=d;this.c=new uEc(d,g,BD(this.q,402))}else if(b==oGc&&Ccb(DD(vNb(a,(Nyc(),Awc))))){d=new SEc(this.e);f.c[f.c.length]=d;this.c=new XGc(d,g,BD(this.q,402))}else{this.c=new Oic(b,this)}Ekb(f,this.c);$Ic(f,this.e);this.s=AGc(this.k)} +function xUc(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;l=BD(pr((g=Jsb((new ZRc(b)).a.d,0),new aSc(g))),86);o=l?BD(vNb(l,(mTc(),_Sc)),86):null;e=1;while(!!l&&!!o){i=0;u=0;c=l;d=o;for(h=0;h=a.i){++a.i;Ekb(a.a,meb(1));Ekb(a.b,k)}else{d=a.c[b.p][1];Nkb(a.a,j,meb(BD(Ikb(a.a,j),19).a+1-d));Nkb(a.b,j,Edb(ED(Ikb(a.b,j)))+k-d*a.e)}(a.q==(kAc(),dAc)&&(BD(Ikb(a.a,j),19).a>a.j||BD(Ikb(a.a,j-1),19).a>a.j)||a.q==gAc&&(Edb(ED(Ikb(a.b,j)))>a.k||Edb(ED(Ikb(a.b,j-1)))>a.k))&&(i=false);for(g=new Sr(ur(R_b(b).a.Kc(),new Sq));Qr(g);){f=BD(Rr(g),17);h=f.c.i;if(a.f[h.p]==j){l=Cbc(a,h);e=e+BD(l.a,19).a;i=i&&Ccb(DD(l.b))}}a.f[b.p]=j;e=e+a.c[b.p][0];return new vgd(meb(e),(Bcb(),i?true:false))} +function sPc(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q,r;l=new Lqb;g=new Rkb;qPc(a,c,a.d.fg(),g,l);qPc(a,d,a.d.gg(),g,l);a.b=0.2*(p=rPc(LAb(new YAb(null,new Kub(g,16)),new xPc)),q=rPc(LAb(new YAb(null,new Kub(g,16)),new zPc)),$wnd.Math.min(p,q));f=0;for(h=0;h=2&&(r=WNc(g,true,m),!a.e&&(a.e=new ZOc(a)),VOc(a.e,r,g,a.b),undefined);uPc(g,m);wPc(g);n=-1;for(k=new olb(g);k.ah} +function k6b(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p;c=BD(vNb(a,(Nyc(),Vxc)),98);g=a.f;f=a.d;h=g.a+f.b+f.c;i=0-f.d-a.c.b;k=g.b+f.d+f.a-a.c.b;j=new Rkb;l=new Rkb;for(e=new olb(b);e.a0),BD(k.a.Xb(k.c=--k.b),17));while(f!=d&&k.b>0){a.a[f.p]=true;a.a[d.p]=true;f=(sCb(k.b>0),BD(k.a.Xb(k.c=--k.b),17))}k.b>0&&uib(k)}}}} +function Vmd(b,c,d){var e,f,g,h,i,j,k,l,m;if(b.a!=c.Aj()){throw vbb(new Wdb(tte+c.ne()+ute))}e=o1d((O6d(),M6d),c).$k();if(e){return e.Aj().Nh().Ih(e,d)}h=o1d(M6d,c).al();if(h){if(d==null){return null}i=BD(d,15);if(i.dc()){return ''}m=new Hfb;for(g=i.Kc();g.Ob();){f=g.Pb();Efb(m,h.Aj().Nh().Ih(h,f));m.a+=' '}return lcb(m,m.a.length-1)}l=o1d(M6d,c).bl();if(!l.dc()){for(k=l.Kc();k.Ob();){j=BD(k.Pb(),148);if(j.wj(d)){try{m=j.Aj().Nh().Ih(j,d);if(m!=null){return m}}catch(a){a=ubb(a);if(!JD(a,102))throw vbb(a)}}}throw vbb(new Wdb("Invalid value: '"+d+"' for datatype :"+c.ne()))}BD(c,834).Fj();return d==null?null:JD(d,172)?''+BD(d,172).a:rb(d)==$J?CQd(Pmd[0],BD(d,199)):fcb(d)} +function zQc(a){var b,c,d,e,f,g,h,i,j,k;j=new Psb;h=new Psb;for(f=new olb(a);f.a-1){for(e=Jsb(h,0);e.b!=e.d.c;){d=BD(Xsb(e),128);d.v=g}while(h.b!=0){d=BD(Vt(h,0),128);for(c=new olb(d.i);c.a0){c+=i.n.a+i.o.a/2;++l}for(o=new olb(i.j);o.a0&&(c/=l);r=KC(UD,Vje,25,d.a.c.length,15,1);h=0;for(j=new olb(d.a);j.a=h&&e<=i){if(h<=e&&f<=i){d+=2}else if(h<=e){a.b[d]=i+1;g+=2}else if(f<=i){c[k++]=e;c[k++]=h-1;d+=2}else{c[k++]=e;c[k++]=h-1;a.b[d]=i+1;g+=2}}else if(i0?(e-=86400000):(e+=86400000);i=new gB(wbb(Cbb(b.q.getTime()),e))}k=new Vfb;j=a.a.length;for(f=0;f=97&&d<=122||d>=65&&d<=90){for(g=f+1;g=j){throw vbb(new Wdb("Missing trailing '"))}g+10&&c.c==0){!b&&(b=new Rkb);b.c[b.c.length]=c}}if(b){while(b.c.length!=0){c=BD(Kkb(b,0),233);if(!!c.b&&c.b.c.length>0){for(f=(!c.b&&(c.b=new Rkb),new olb(c.b));f.aJkb(a,c,0)){return new vgd(e,c)}}else if(Edb(REc(e.g,e.d[0]).a)>Edb(REc(c.g,c.d[0]).a)){return new vgd(e,c)}}}for(h=(!c.e&&(c.e=new Rkb),c.e).Kc();h.Ob();){g=BD(h.Pb(),233);i=(!g.b&&(g.b=new Rkb),g.b);wCb(0,i.c.length);aCb(i.c,0,c);g.c==i.c.length&&(b.c[b.c.length]=g,true)}}}return null} +function wlb(a,b){var c,d,e,f,g,h,i,j,k;if(a==null){return Xhe}i=b.a.zc(a,b);if(i!=null){return '[...]'}c=new xwb(She,'[',']');for(e=a,f=0,g=e.length;f=14&&k<=16))){if(b.a._b(d)){!c.a?(c.a=new Wfb(c.d)):Qfb(c.a,c.b);Nfb(c.a,'[...]')}else{h=CD(d);j=new Vqb(b);uwb(c,wlb(h,j))}}else JD(d,177)?uwb(c,Xlb(BD(d,177))):JD(d,190)?uwb(c,Qlb(BD(d,190))):JD(d,195)?uwb(c,Rlb(BD(d,195))):JD(d,2012)?uwb(c,Wlb(BD(d,2012))):JD(d,48)?uwb(c,Ulb(BD(d,48))):JD(d,364)?uwb(c,Vlb(BD(d,364))):JD(d,832)?uwb(c,Tlb(BD(d,832))):JD(d,104)&&uwb(c,Slb(BD(d,104)))}else{uwb(c,d==null?Xhe:fcb(d))}}return !c.a?c.c:c.e.length==0?c.a.a:c.a.a+(''+c.e)} +function xQb(a,b,c,d){var e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t;h=itd(b,false,false);r=ofd(h);d&&(r=w7c(r));t=Edb(ED(hkd(b,(CPb(),vPb))));q=(sCb(r.b!=0),BD(r.a.a.c,8));l=BD(Ut(r,1),8);if(r.b>2){k=new Rkb;Gkb(k,new Jib(r,1,r.b));f=sQb(k,t+a.a);s=new XOb(f);tNb(s,b);c.c[c.c.length]=s}else{d?(s=BD(Ohb(a.b,jtd(b)),266)):(s=BD(Ohb(a.b,ltd(b)),266))}i=jtd(b);d&&(i=ltd(b));g=zQb(q,i);j=t+a.a;if(g.a){j+=$wnd.Math.abs(q.b-l.b);p=new f7c(l.a,(l.b+q.b)/2)}else{j+=$wnd.Math.abs(q.a-l.a);p=new f7c((l.a+q.a)/2,l.b)}d?Rhb(a.d,b,new ZOb(s,g,p,j)):Rhb(a.c,b,new ZOb(s,g,p,j));Rhb(a.b,b,s);o=(!b.n&&(b.n=new cUd(D2,b,1,7)),b.n);for(n=new Fyd(o);n.e!=n.i.gc();){m=BD(Dyd(n),137);e=wQb(a,m,true,0,0);c.c[c.c.length]=e}} +function wPc(a){var b,c,d,e,f,g,h,i,j,k;j=new Rkb;h=new Rkb;for(g=new olb(a);g.a-1){for(f=new olb(h);f.a0){continue}rOc(i,$wnd.Math.min(i.o,e.o-1));qOc(i,i.i-1);i.i==0&&(h.c[h.c.length]=i,true)}}}} +function QQd(a,b,c){var d,e,f,g,h,i,j;j=a.c;!b&&(b=FQd);a.c=b;if((a.Db&4)!=0&&(a.Db&1)==0){i=new nSd(a,1,2,j,a.c);!c?(c=i):c.Ei(i)}if(j!=b){if(JD(a.Cb,284)){if(a.Db>>16==-10){c=BD(a.Cb,284).nk(b,c)}else if(a.Db>>16==-15){!b&&(b=(jGd(),YFd));!j&&(j=(jGd(),YFd));if(a.Cb.nh()){i=new pSd(a.Cb,1,13,j,b,HLd(QSd(BD(a.Cb,59)),a),false);!c?(c=i):c.Ei(i)}}}else if(JD(a.Cb,88)){if(a.Db>>16==-23){JD(b,88)||(b=(jGd(),_Fd));JD(j,88)||(j=(jGd(),_Fd));if(a.Cb.nh()){i=new pSd(a.Cb,1,10,j,b,HLd(VKd(BD(a.Cb,26)),a),false);!c?(c=i):c.Ei(i)}}}else if(JD(a.Cb,444)){h=BD(a.Cb,836);g=(!h.b&&(h.b=new RYd(new NYd)),h.b);for(f=(d=new nib((new eib(g.a)).a),new ZYd(d));f.a.b;){e=BD(lib(f.a).cd(),87);c=QQd(e,MQd(e,h),c)}}}return c} +function O1b(a,b){var c,d,e,f,g,h,i,j,k,l,m;g=Ccb(DD(hkd(a,(Nyc(),fxc))));m=BD(hkd(a,Yxc),21);i=false;j=false;l=new Fyd((!a.c&&(a.c=new cUd(F2,a,9,9)),a.c));while(l.e!=l.i.gc()&&(!i||!j)){f=BD(Dyd(l),118);h=0;for(e=ul(pl(OC(GC(KI,1),Uhe,20,0,[(!f.d&&(f.d=new y5d(B2,f,8,5)),f.d),(!f.e&&(f.e=new y5d(B2,f,7,4)),f.e)])));Qr(e);){d=BD(Rr(e),79);k=g&&Qld(d)&&Ccb(DD(hkd(d,gxc)));c=ELd((!d.b&&(d.b=new y5d(z2,d,4,7)),d.b),f)?a==Xod(atd(BD(qud((!d.c&&(d.c=new y5d(z2,d,5,8)),d.c),0),82))):a==Xod(atd(BD(qud((!d.b&&(d.b=new y5d(z2,d,4,7)),d.b),0),82)));if(k||c){++h;if(h>1){break}}}h>0?(i=true):m.Hc((rcd(),ncd))&&(!f.n&&(f.n=new cUd(D2,f,1,7)),f.n).i>0&&(i=true);h>1&&(j=true)}i&&b.Fc((Orc(),Hrc));j&&b.Fc((Orc(),Irc))} +function zfd(a){var b,c,d,e,f,g,h,i,j,k,l,m;m=BD(hkd(a,(Y9c(),Y8c)),21);if(m.dc()){return null}h=0;g=0;if(m.Hc((tdd(),rdd))){k=BD(hkd(a,t9c),98);d=2;c=2;e=2;f=2;b=!Xod(a)?BD(hkd(a,z8c),103):BD(hkd(Xod(a),z8c),103);for(j=new Fyd((!a.c&&(a.c=new cUd(F2,a,9,9)),a.c));j.e!=j.i.gc();){i=BD(Dyd(j),118);l=BD(hkd(i,A9c),61);if(l==(Ucd(),Scd)){l=lfd(i,b);jkd(i,A9c,l)}if(k==(dcd(),$bd)){switch(l.g){case 1:d=$wnd.Math.max(d,i.i+i.g);break;case 2:c=$wnd.Math.max(c,i.j+i.f);break;case 3:e=$wnd.Math.max(e,i.i+i.g);break;case 4:f=$wnd.Math.max(f,i.j+i.f);}}else{switch(l.g){case 1:d+=i.g+2;break;case 2:c+=i.f+2;break;case 3:e+=i.g+2;break;case 4:f+=i.f+2;}}}h=$wnd.Math.max(d,e);g=$wnd.Math.max(c,f)}return Afd(a,h,g,true,true)} +function lnc(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;s=BD(GAb(VAb(JAb(new YAb(null,new Kub(b.d,16)),new pnc(c)),new rnc(c)),Byb(new fzb,new dzb,new Ezb,OC(GC(xL,1),Kie,132,0,[(Fyb(),Dyb)]))),15);l=Ohe;k=Rie;for(i=new olb(b.b.j);i.a0;if(j){if(j){m=r.p;g?++m:--m;l=BD(Ikb(r.c.a,m),10);d=I4b(l);n=!(s6c(d,w,c[0])||n6c(d,w,c[0]))}}else{n=true}}o=false;v=b.D.i;if(!!v&&!!v.c&&h.e){k=g&&v.p>0||!g&&v.p0&&(b.a+=She,b);yfd(BD(Dyd(h),160),b)}b.a+=gne;i=new Oyd((!d.c&&(d.c=new y5d(z2,d,5,8)),d.c));while(i.e!=i.i.gc()){i.e>0&&(b.a+=She,b);yfd(BD(Dyd(i),160),b)}b.a+=')'}}} +function y2b(a,b,c){var d,e,f,g,h,i,j,k,l,m,n;f=BD(vNb(a,(wtc(),$sc)),79);if(!f){return}d=a.a;e=new g7c(c);P6c(e,C2b(a));if(f_b(a.d.i,a.c.i)){m=a.c;l=l7c(OC(GC(m1,1),nie,8,0,[m.n,m.a]));c7c(l,c)}else{l=A0b(a.c)}Gsb(d,l,d.a,d.a.a);n=A0b(a.d);vNb(a,utc)!=null&&P6c(n,BD(vNb(a,utc),8));Gsb(d,n,d.c.b,d.c);q7c(d,e);g=itd(f,true,true);kmd(g,BD(qud((!f.b&&(f.b=new y5d(z2,f,4,7)),f.b),0),82));lmd(g,BD(qud((!f.c&&(f.c=new y5d(z2,f,5,8)),f.c),0),82));ifd(d,g);for(k=new olb(a.b);k.a=0){i=null;h=new Bib(k.a,j+1);while(h.bg?1:Ny(isNaN(0),isNaN(g)))<0&&(null,My(Jqe),($wnd.Math.abs(g-1)<=Jqe||g==1||isNaN(g)&&isNaN(1)?0:g<1?-1:g>1?1:Ny(isNaN(g),isNaN(1)))<0)&&(null,My(Jqe),($wnd.Math.abs(0-h)<=Jqe||0==h||isNaN(0)&&isNaN(h)?0:0h?1:Ny(isNaN(0),isNaN(h)))<0)&&(null,My(Jqe),($wnd.Math.abs(h-1)<=Jqe||h==1||isNaN(h)&&isNaN(1)?0:h<1?-1:h>1?1:Ny(isNaN(h),isNaN(1)))<0));return f} +function z6d(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w;for(l=new usb(new nsb(a));l.b!=l.c.a.d;){k=tsb(l);h=BD(k.d,56);b=BD(k.e,56);g=h.Tg();for(p=0,u=(g.i==null&&TKd(g),g.i).length;p=0&&p=j.c.c.length?(k=JJc((j0b(),h0b),g0b)):(k=JJc((j0b(),g0b),g0b));k*=2;f=c.a.g;c.a.g=$wnd.Math.max(f,f+(k-f));g=c.b.g;c.b.g=$wnd.Math.max(g,g+(k-g));e=b}}} +function VNc(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v;v=Hx(a);k=new Rkb;h=a.c.length;l=h-1;m=h+1;while(v.a.c!=0){while(c.b!=0){t=(sCb(c.b!=0),BD(Nsb(c,c.a.a),112));Jwb(v.a,t)!=null;t.g=l--;YNc(t,b,c,d)}while(b.b!=0){u=(sCb(b.b!=0),BD(Nsb(b,b.a.a),112));Jwb(v.a,u)!=null;u.g=m++;YNc(u,b,c,d)}j=Rie;for(r=(g=new Ywb((new cxb((new Gjb(v.a)).a)).b),new Njb(g));sib(r.a.a);){q=(f=Wwb(r.a),BD(f.cd(),112));if(!d&&q.b>0&&q.a<=0){k.c=KC(SI,Uhe,1,0,5,1);k.c[k.c.length]=q;break}p=q.i-q.d;if(p>=j){if(p>j){k.c=KC(SI,Uhe,1,0,5,1);j=p}k.c[k.c.length]=q}}if(k.c.length!=0){i=BD(Ikb(k,Bub(e,k.c.length)),112);Jwb(v.a,i)!=null;i.g=m++;YNc(i,b,c,d);k.c=KC(SI,Uhe,1,0,5,1)}}s=a.c.length+1;for(o=new olb(a);o.a0){m.d+=k.n.d;m.d+=k.d}if(m.a>0){m.a+=k.n.a;m.a+=k.d}if(m.b>0){m.b+=k.n.b;m.b+=k.d}if(m.c>0){m.c+=k.n.c;m.c+=k.d}return m} +function d6b(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o;m=c.d;l=c.c;f=new f7c(c.f.a+c.d.b+c.d.c,c.f.b+c.d.d+c.d.a);g=f.b;for(j=new olb(a.a);j.a0){a.c[b.c.p][b.p].d+=Cub(a.i,24)*lke*0.07000000029802322-0.03500000014901161;a.c[b.c.p][b.p].a=a.c[b.c.p][b.p].d/a.c[b.c.p][b.p].b}} +function m5b(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q;for(o=new olb(a);o.ad.d;d.d=$wnd.Math.max(d.d,b);if(h&&c){d.d=$wnd.Math.max(d.d,d.a);d.a=d.d+e}break;case 3:c=b>d.a;d.a=$wnd.Math.max(d.a,b);if(h&&c){d.a=$wnd.Math.max(d.a,d.d);d.d=d.a+e}break;case 2:c=b>d.c;d.c=$wnd.Math.max(d.c,b);if(h&&c){d.c=$wnd.Math.max(d.b,d.c);d.b=d.c+e}break;case 4:c=b>d.b;d.b=$wnd.Math.max(d.b,b);if(h&&c){d.b=$wnd.Math.max(d.b,d.c);d.c=d.b+e}}}}} +function l3b(a){var b,c,d,e,f,g,h,i,j,k,l;for(j=new olb(a);j.a0||k.j==Tcd&&k.e.c.length-k.g.c.length<0)){b=false;break}for(e=new olb(k.g);e.a=j&&v>=q){m+=o.n.b+p.n.b+p.a.b-u;++h}}}}if(c){for(g=new olb(s.e);g.a=j&&v>=q){m+=o.n.b+p.n.b+p.a.b-u;++h}}}}}if(h>0){w+=m/h;++n}}if(n>0){b.a=e*w/n;b.g=n}else{b.a=0;b.g=0}} +function oMc(a,b){var c,d,e,f,g,h,i,j,k,l,m;for(e=new olb(a.a.b);e.aQje||b.o==cMc&&k0&&dld(r,u*w);v>0&&eld(r,v*A)}stb(a.b,new CQb);b=new Rkb;for(h=new nib((new eib(a.c)).a);h.b;){g=lib(h);d=BD(g.cd(),79);c=BD(g.dd(),395).a;e=itd(d,false,false);l=oQb(jtd(d),ofd(e),c);ifd(l,e);t=ktd(d);if(!!t&&Jkb(b,t,0)==-1){b.c[b.c.length]=t;pQb(t,(sCb(l.b!=0),BD(l.a.a.c,8)),c)}}for(q=new nib((new eib(a.d)).a);q.b;){p=lib(q);d=BD(p.cd(),79);c=BD(p.dd(),395).a;e=itd(d,false,false);l=oQb(ltd(d),w7c(ofd(e)),c);l=w7c(l);ifd(l,e);t=mtd(d);if(!!t&&Jkb(b,t,0)==-1){b.c[b.c.length]=t;pQb(t,(sCb(l.b!=0),BD(l.c.b.c,8)),c)}}} +function _Vc(a,b,c,d){var e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B;if(c.c.length!=0){o=new Rkb;for(n=new olb(c);n.a1){n=new ZQc(o,t,d);reb(t,new PQc(a,n));g.c[g.c.length]=n;for(l=t.a.ec().Kc();l.Ob();){k=BD(l.Pb(),46);Lkb(f,k.b)}}if(h.a.gc()>1){n=new ZQc(o,h,d);reb(h,new RQc(a,n));g.c[g.c.length]=n;for(l=h.a.ec().Kc();l.Ob();){k=BD(l.Pb(),46);Lkb(f,k.b)}}}} +function $Wc(a){r4c(a,new E3c(L3c(P3c(M3c(O3c(N3c(new R3c,sre),'ELK Radial'),'A radial layout provider which is based on the algorithm of Peter Eades published in "Drawing free trees.", published by International Institute for Advanced Study of Social Information Science, Fujitsu Limited in 1991. The radial layouter takes a tree and places the nodes in radial order around the root. The nodes of the same tree level are placed on the same radius.'),new bXc),sre)));p4c(a,sre,uqe,Ksd(UWc));p4c(a,sre,wme,Ksd(XWc));p4c(a,sre,Fme,Ksd(NWc));p4c(a,sre,Tme,Ksd(OWc));p4c(a,sre,Eme,Ksd(PWc));p4c(a,sre,Gme,Ksd(MWc));p4c(a,sre,Dme,Ksd(QWc));p4c(a,sre,Hme,Ksd(TWc));p4c(a,sre,ore,Ksd(KWc));p4c(a,sre,nre,Ksd(LWc));p4c(a,sre,rre,Ksd(RWc));p4c(a,sre,lre,Ksd(SWc));p4c(a,sre,mre,Ksd(VWc));p4c(a,sre,pre,Ksd(WWc));p4c(a,sre,qre,Ksd(YWc))} +function LIb(a){var b;this.r=Cy(new OIb,new SIb);this.b=new Rpb(BD(Qb(F1),290));this.p=new Rpb(BD(Qb(F1),290));this.i=new Rpb(BD(Qb(DN),290));this.e=a;this.o=new g7c(a.rf());this.D=a.Df()||Ccb(DD(a.We((Y9c(),M8c))));this.A=BD(a.We((Y9c(),Y8c)),21);this.B=BD(a.We(b9c),21);this.q=BD(a.We(t9c),98);this.u=BD(a.We(x9c),21);if(!ucd(this.u)){throw vbb(new y2c('Invalid port label placement: '+this.u))}this.v=Ccb(DD(a.We(z9c)));this.j=BD(a.We(W8c),21);if(!Jbd(this.j)){throw vbb(new y2c('Invalid node label placement: '+this.j))}this.n=BD(bgd(a,U8c),116);this.k=Edb(ED(bgd(a,Q9c)));this.d=Edb(ED(bgd(a,P9c)));this.w=Edb(ED(bgd(a,X9c)));this.s=Edb(ED(bgd(a,R9c)));this.t=Edb(ED(bgd(a,S9c)));this.C=BD(bgd(a,V9c),142);this.c=2*this.d;b=!this.B.Hc((Idd(),zdd));this.f=new mIb(0,b,0);this.g=new mIb(1,b,0);lIb(this.f,(gHb(),eHb),this.g)} +function Lgd(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D;t=0;o=0;n=0;m=1;for(s=new Fyd((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a));s.e!=s.i.gc();){q=BD(Dyd(s),33);m+=sr(new Sr(ur(_sd(q).a.Kc(),new Sq)));B=q.g;o=$wnd.Math.max(o,B);l=q.f;n=$wnd.Math.max(n,l);t+=B*l}p=(!a.a&&(a.a=new cUd(E2,a,10,11)),a.a).i;g=t+2*d*d*m*p;f=$wnd.Math.sqrt(g);i=$wnd.Math.max(f*c,o);h=$wnd.Math.max(f/c,n);for(r=new Fyd((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a));r.e!=r.i.gc();){q=BD(Dyd(r),33);C=e.b+(Cub(b,26)*ike+Cub(b,27)*jke)*(i-q.g);D=e.b+(Cub(b,26)*ike+Cub(b,27)*jke)*(h-q.f);dld(q,C);eld(q,D)}A=i+(e.b+e.c);w=h+(e.d+e.a);for(v=new Fyd((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a));v.e!=v.i.gc();){u=BD(Dyd(v),33);for(k=new Sr(ur(_sd(u).a.Kc(),new Sq));Qr(k);){j=BD(Rr(k),79);Pld(j)||Kgd(j,b,A,w)}}A+=e.b+e.c;w+=e.d+e.a;Afd(a,A,w,false,true)} +function Jcb(a){var b,c,d,e,f,g,h,i,j,k,l;if(a==null){throw vbb(new Oeb(Xhe))}j=a;f=a.length;i=false;if(f>0){b=(BCb(0,a.length),a.charCodeAt(0));if(b==45||b==43){a=a.substr(1);--f;i=b==45}}if(f==0){throw vbb(new Oeb(Oje+j+'"'))}while(a.length>0&&(BCb(0,a.length),a.charCodeAt(0)==48)){a=a.substr(1);--f}if(f>(Neb(),Leb)[10]){throw vbb(new Oeb(Oje+j+'"'))}for(e=0;e0){l=-parseInt(a.substr(0,d),10);a=a.substr(d);f-=d;c=false}while(f>=g){d=parseInt(a.substr(0,g),10);a=a.substr(g);f-=g;if(c){c=false}else{if(ybb(l,h)<0){throw vbb(new Oeb(Oje+j+'"'))}l=Ibb(l,k)}l=Qbb(l,d)}if(ybb(l,0)>0){throw vbb(new Oeb(Oje+j+'"'))}if(!i){l=Jbb(l);if(ybb(l,0)<0){throw vbb(new Oeb(Oje+j+'"'))}}return l} +function Z6d(a,b){X6d();var c,d,e,f,g,h,i;this.a=new a7d(this);this.b=a;this.c=b;this.f=c2d(q1d((O6d(),M6d),b));if(this.f.dc()){if((h=t1d(M6d,a))==b){this.e=true;this.d=new Rkb;this.f=new oFd;this.f.Fc(Ewe);BD(V1d(p1d(M6d,bKd(a)),''),26)==a&&this.f.Fc(u1d(M6d,bKd(a)));for(e=g1d(M6d,a).Kc();e.Ob();){d=BD(e.Pb(),170);switch($1d(q1d(M6d,d))){case 4:{this.d.Fc(d);break}case 5:{this.f.Gc(c2d(q1d(M6d,d)));break}}}}else{Q6d();if(BD(b,66).Oj()){this.e=true;this.f=null;this.d=new Rkb;for(g=0,i=(a.i==null&&TKd(a),a.i).length;g=0&&g0&&(BD(Mpb(a.b,b),124).a.b=c)} +function b3b(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;Odd(b,'Comment pre-processing',1);c=0;i=new olb(a.a);while(i.a0){j=(BCb(0,c.length),c.charCodeAt(0));if(j!=64){if(j==37){m=c.lastIndexOf('%');k=false;if(m!=0&&(m==n-1||(k=(BCb(m+1,c.length),c.charCodeAt(m+1)==46)))){h=c.substr(1,m-1);u=dfb('%',h)?null:QEd(h);e=0;if(k){try{e=Icb(c.substr(m+2),Rie,Ohe)}catch(a){a=ubb(a);if(JD(a,127)){i=a;throw vbb(new rFd(i))}else throw vbb(a)}}for(r=pRd(b.Wg());r.Ob();){p=MRd(r);if(JD(p,510)){f=BD(p,590);t=f.d;if((u==null?t==null:dfb(u,t))&&e--==0){return f}}}return null}}l=c.lastIndexOf('.');o=l==-1?c:c.substr(0,l);d=0;if(l!=-1){try{d=Icb(c.substr(l+1),Rie,Ohe)}catch(a){a=ubb(a);if(JD(a,127)){o=c}else throw vbb(a)}}o=dfb('%',o)?null:QEd(o);for(q=pRd(b.Wg());q.Ob();){p=MRd(q);if(JD(p,191)){g=BD(p,191);s=g.ne();if((o==null?s==null:dfb(o,s))&&d--==0){return g}}}return null}}return rid(b,c)} +function f6b(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F;w=new Rkb;for(o=new olb(a.b);o.a=b.length)return {done:true};var a=b[d++];return {value:[a,c.get(a)],done:false}}}};if(!xrb()){e.prototype.createObject=function(){return {}};e.prototype.get=function(a){return this.obj[':'+a]};e.prototype.set=function(a,b){this.obj[':'+a]=b};e.prototype[hke]=function(a){delete this.obj[':'+a]};e.prototype.keys=function(){var a=[];for(var b in this.obj){b.charCodeAt(0)==58&&a.push(b.substring(1))}return a}}return e} +function cde(a){ade();var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q;if(a==null)return null;l=a.length*8;if(l==0){return ''}h=l%24;n=l/24|0;m=h!=0?n+1:n;f=null;f=KC(TD,$ie,25,m*4,15,1);j=0;k=0;b=0;c=0;d=0;g=0;e=0;for(i=0;i>24;j=(b&3)<<24>>24;o=(b&-128)==0?b>>2<<24>>24:(b>>2^192)<<24>>24;p=(c&-128)==0?c>>4<<24>>24:(c>>4^240)<<24>>24;q=(d&-128)==0?d>>6<<24>>24:(d>>6^252)<<24>>24;f[g++]=_ce[o];f[g++]=_ce[p|j<<4];f[g++]=_ce[k<<2|q];f[g++]=_ce[d&63]}if(h==8){b=a[e];j=(b&3)<<24>>24;o=(b&-128)==0?b>>2<<24>>24:(b>>2^192)<<24>>24;f[g++]=_ce[o];f[g++]=_ce[j<<4];f[g++]=61;f[g++]=61}else if(h==16){b=a[e];c=a[e+1];k=(c&15)<<24>>24;j=(b&3)<<24>>24;o=(b&-128)==0?b>>2<<24>>24:(b>>2^192)<<24>>24;p=(c&-128)==0?c>>4<<24>>24:(c>>4^240)<<24>>24;f[g++]=_ce[o];f[g++]=_ce[p|j<<4];f[g++]=_ce[k<<2];f[g++]=61}return zfb(f,0,f.length)} +function mB(a,b){var c,d,e,f,g,h,i;a.e==0&&a.p>0&&(a.p=-(a.p-1));a.p>Rie&&dB(b,a.p-nje);g=b.q.getDate();ZA(b,1);a.k>=0&&aB(b,a.k);if(a.c>=0){ZA(b,a.c)}else if(a.k>=0){i=new fB(b.q.getFullYear()-nje,b.q.getMonth(),35);d=35-i.q.getDate();ZA(b,$wnd.Math.min(d,g))}else{ZA(b,g)}a.f<0&&(a.f=b.q.getHours());a.b>0&&a.f<12&&(a.f+=12);$A(b,a.f==24&&a.g?0:a.f);a.j>=0&&_A(b,a.j);a.n>=0&&bB(b,a.n);a.i>=0&&cB(b,wbb(Ibb(Abb(Cbb(b.q.getTime()),_ie),_ie),a.i));if(a.a){e=new eB;dB(e,e.q.getFullYear()-nje-80);Gbb(Cbb(b.q.getTime()),Cbb(e.q.getTime()))&&dB(b,e.q.getFullYear()-nje+100)}if(a.d>=0){if(a.c==-1){c=(7+a.d-b.q.getDay())%7;c>3&&(c-=7);h=b.q.getMonth();ZA(b,b.q.getDate()+c);b.q.getMonth()!=h&&ZA(b,b.q.getDate()+(c>0?-7:7))}else{if(b.q.getDay()!=a.d){return false}}}if(a.o>Rie){f=b.q.getTimezoneOffset();cB(b,wbb(Cbb(b.q.getTime()),(a.o-f)*60*_ie))}return true} +function z2b(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;e=vNb(b,(wtc(),$sc));if(!JD(e,239)){return}o=BD(e,33);p=b.e;m=new g7c(b.c);f=b.d;m.a+=f.b;m.b+=f.d;u=BD(hkd(o,(Nyc(),Ixc)),174);if(uqb(u,(Idd(),Add))){n=BD(hkd(o,Kxc),116);w_b(n,f.a);z_b(n,f.d);x_b(n,f.b);y_b(n,f.c)}c=new Rkb;for(k=new olb(b.a);k.a0&&Ekb(a.p,k);Ekb(a.o,k)}b-=d;n=i+b;j+=b*a.e;Nkb(a.a,h,meb(n));Nkb(a.b,h,j);a.j=$wnd.Math.max(a.j,n);a.k=$wnd.Math.max(a.k,j);a.d+=b;b+=p}} +function Ucd(){Ucd=ccb;var a;Scd=new Ycd(ole,0);Acd=new Ycd(xle,1);zcd=new Ycd(yle,2);Rcd=new Ycd(zle,3);Tcd=new Ycd(Ale,4);Fcd=(mmb(),new zob((a=BD(gdb(F1),9),new xqb(a,BD(_Bb(a,a.length),9),0))));Gcd=Up(qqb(Acd,OC(GC(F1,1),bne,61,0,[])));Bcd=Up(qqb(zcd,OC(GC(F1,1),bne,61,0,[])));Ocd=Up(qqb(Rcd,OC(GC(F1,1),bne,61,0,[])));Qcd=Up(qqb(Tcd,OC(GC(F1,1),bne,61,0,[])));Lcd=Up(qqb(Acd,OC(GC(F1,1),bne,61,0,[Rcd])));Ecd=Up(qqb(zcd,OC(GC(F1,1),bne,61,0,[Tcd])));Ncd=Up(qqb(Acd,OC(GC(F1,1),bne,61,0,[Tcd])));Hcd=Up(qqb(Acd,OC(GC(F1,1),bne,61,0,[zcd])));Pcd=Up(qqb(Rcd,OC(GC(F1,1),bne,61,0,[Tcd])));Ccd=Up(qqb(zcd,OC(GC(F1,1),bne,61,0,[Rcd])));Kcd=Up(qqb(Acd,OC(GC(F1,1),bne,61,0,[zcd,Tcd])));Dcd=Up(qqb(zcd,OC(GC(F1,1),bne,61,0,[Rcd,Tcd])));Mcd=Up(qqb(Acd,OC(GC(F1,1),bne,61,0,[Rcd,Tcd])));Icd=Up(qqb(Acd,OC(GC(F1,1),bne,61,0,[zcd,Rcd])));Jcd=Up(qqb(Acd,OC(GC(F1,1),bne,61,0,[zcd,Rcd,Tcd])))} +function fSc(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t;if(b.b!=0){n=new Psb;h=null;o=null;d=QD($wnd.Math.floor($wnd.Math.log(b.b)*$wnd.Math.LOG10E)+1);i=0;for(t=Jsb(b,0);t.b!=t.d.c;){r=BD(Xsb(t),86);if(PD(o)!==PD(vNb(r,(mTc(),$Sc)))){o=GD(vNb(r,$Sc));i=0}o!=null?(h=o+iSc(i++,d)):(h=iSc(i++,d));yNb(r,$Sc,h);for(q=(e=Jsb((new ZRc(r)).a.d,0),new aSc(e));Wsb(q.a);){p=BD(Xsb(q.a),188).c;Gsb(n,p,n.c.b,n.c);yNb(p,$Sc,h)}}m=new Lqb;for(g=0;g=i){sCb(r.b>0);r.a.Xb(r.c=--r.b);break}else if(p.a>j){if(!e){Ekb(p.b,l);p.c=$wnd.Math.min(p.c,j);p.a=$wnd.Math.max(p.a,i);e=p}else{Gkb(e.b,p.b);e.a=$wnd.Math.max(e.a,p.a);uib(r)}}}if(!e){e=new TCc;e.c=j;e.a=i;Aib(r,e);Ekb(e.b,l)}}h=b.b;k=0;for(q=new olb(d);q.ah?1:0}if(a.b){a.b._b(f)&&(e=BD(a.b.xc(f),19).a);a.b._b(i)&&(h=BD(a.b.xc(i),19).a)}return eh?1:0}return b.e.c.length!=0&&c.g.c.length!=0?1:-1} +function acc(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A;Odd(b,Ine,1);p=new Rkb;w=new Rkb;for(j=new olb(a.b);j.a0&&(t-=n);h_b(g,t);k=0;for(m=new olb(g.a);m.a0);h.a.Xb(h.c=--h.b)}i=0.4*d*k;!f&&h.bb.d.c){n=a.c[b.a.d];q=a.c[l.a.d];if(n==q){continue}AFb(DFb(CFb(EFb(BFb(new FFb,1),100),n),q))}}}}}}} +function QEd(a){IEd();var b,c,d,e,f,g,h,i;if(a==null)return null;e=hfb(a,wfb(37));if(e<0){return a}else{i=new Wfb(a.substr(0,e));b=KC(SD,wte,25,4,15,1);h=0;d=0;for(g=a.length;ee+2&&_Ed((BCb(e+1,a.length),a.charCodeAt(e+1)),xEd,yEd)&&_Ed((BCb(e+2,a.length),a.charCodeAt(e+2)),xEd,yEd)){c=dFd((BCb(e+1,a.length),a.charCodeAt(e+1)),(BCb(e+2,a.length),a.charCodeAt(e+2)));e+=2;if(d>0){(c&192)==128?(b[h++]=c<<24>>24):(d=0)}else if(c>=128){if((c&224)==192){b[h++]=c<<24>>24;d=2}else if((c&240)==224){b[h++]=c<<24>>24;d=3}else if((c&248)==240){b[h++]=c<<24>>24;d=4}}if(d>0){if(h==d){switch(h){case 2:{Kfb(i,((b[0]&31)<<6|b[1]&63)&aje);break}case 3:{Kfb(i,((b[0]&15)<<12|(b[1]&63)<<6|b[2]&63)&aje);break}}h=0;d=0}}else{for(f=0;f0){if(g+d>a.length){return false}h=rA(a.substr(0,g+d),b)}else{h=rA(a,b)}}switch(f){case 71:h=oA(a,g,OC(GC(ZI,1),nie,2,6,[pje,qje]),b);e.e=h;return true;case 77:return zA(a,b,e,h,g);case 76:return BA(a,b,e,h,g);case 69:return xA(a,b,g,e);case 99:return AA(a,b,g,e);case 97:h=oA(a,g,OC(GC(ZI,1),nie,2,6,['AM','PM']),b);e.b=h;return true;case 121:return DA(a,b,g,h,c,e);case 100:if(h<=0){return false}e.c=h;return true;case 83:if(h<0){return false}return yA(h,g,b[0],e);case 104:h==12&&(h=0);case 75:case 72:if(h<0){return false}e.f=h;e.g=false;return true;case 107:if(h<0){return false}e.f=h;e.g=true;return true;case 109:if(h<0){return false}e.j=h;return true;case 115:if(h<0){return false}e.n=h;return true;case 90:if(gw&&(o.c=w-o.b);Ekb(g.d,new BLb(o,bLb(g,o)));s=b==Acd?$wnd.Math.max(s,p.b+j.b.rf().b):$wnd.Math.min(s,p.b)}s+=b==Acd?a.t:-a.t;t=cLb((g.e=s,g));t>0&&(BD(Mpb(a.b,b),124).a.b=t);for(k=m.Kc();k.Ob();){j=BD(k.Pb(),111);if(!j.c||j.c.d.c.length<=0){continue}o=j.c.i;o.c-=j.e.a;o.d-=j.e.b}} +function SPb(a){var b,c,d,e,f,g,h,i,j,k,l,m,n;b=new Lqb;for(i=new Fyd(a);i.e!=i.i.gc();){h=BD(Dyd(i),33);c=new Tqb;Rhb(OPb,h,c);n=new aQb;e=BD(GAb(new YAb(null,new Lub(new Sr(ur($sd(h).a.Kc(),new Sq)))),Wyb(n,Byb(new fzb,new dzb,new Ezb,OC(GC(xL,1),Kie,132,0,[(Fyb(),Dyb)])))),83);RPb(c,BD(e.xc((Bcb(),true)),14),new cQb);d=BD(GAb(JAb(BD(e.xc(false),15).Lc(),new eQb),Byb(new fzb,new dzb,new Ezb,OC(GC(xL,1),Kie,132,0,[Dyb]))),15);for(g=d.Kc();g.Ob();){f=BD(g.Pb(),79);m=ktd(f);if(m){j=BD(Wd(irb(b.f,m)),21);if(!j){j=UPb(m);jrb(b.f,m,j)}ye(c,j)}}e=BD(GAb(new YAb(null,new Lub(new Sr(ur(_sd(h).a.Kc(),new Sq)))),Wyb(n,Byb(new fzb,new dzb,new Ezb,OC(GC(xL,1),Kie,132,0,[Dyb])))),83);RPb(c,BD(e.xc(true),14),new gQb);d=BD(GAb(JAb(BD(e.xc(false),15).Lc(),new iQb),Byb(new fzb,new dzb,new Ezb,OC(GC(xL,1),Kie,132,0,[Dyb]))),15);for(l=d.Kc();l.Ob();){k=BD(l.Pb(),79);m=mtd(k);if(m){j=BD(Wd(irb(b.f,m)),21);if(!j){j=UPb(m);jrb(b.f,m,j)}ye(c,j)}}}} +function rhb(a,b){phb();var c,d,e,f,g,h,i,j,k,l,m,n,o,p;i=ybb(a,0)<0;i&&(a=Jbb(a));if(ybb(a,0)==0){switch(b){case 0:return '0';case 1:return $je;case 2:return '0.00';case 3:return '0.000';case 4:return '0.0000';case 5:return '0.00000';case 6:return '0.000000';default:n=new Ufb;b<0?(n.a+='0E+',n):(n.a+='0E',n);n.a+=b==Rie?'2147483648':''+-b;return n.a;}}k=18;l=KC(TD,$ie,25,k+1,15,1);c=k;p=a;do{j=p;p=Abb(p,10);l[--c]=Tbb(wbb(48,Qbb(j,Ibb(p,10))))&aje}while(ybb(p,0)!=0);e=Qbb(Qbb(Qbb(k,c),b),1);if(b==0){i&&(l[--c]=45);return zfb(l,c,k-c)}if(b>0&&ybb(e,-6)>=0){if(ybb(e,0)>=0){f=c+Tbb(e);for(h=k-1;h>=f;h--){l[h+1]=l[h]}l[++f]=46;i&&(l[--c]=45);return zfb(l,c,k-c+1)}for(g=2;Gbb(g,wbb(Jbb(e),1));g++){l[--c]=48}l[--c]=46;l[--c]=48;i&&(l[--c]=45);return zfb(l,c,k-c)}o=c+1;d=k;m=new Vfb;i&&(m.a+='-',m);if(d-o>=1){Kfb(m,l[c]);m.a+='.';m.a+=zfb(l,c+1,k-c-1)}else{m.a+=zfb(l,c,k-c)}m.a+='E';ybb(e,0)>0&&(m.a+='+',m);m.a+=''+Ubb(e);return m.a} +function iQc(a,b,c){var d,e,f,g,h,i,j,k,l,m,n;a.e.a.$b();a.f.a.$b();a.c.c=KC(SI,Uhe,1,0,5,1);a.i.c=KC(SI,Uhe,1,0,5,1);a.g.a.$b();if(b){for(g=new olb(b.a);g.a=1){if(v-j>0&&o>=0){dld(l,l.i+u);eld(l,l.j+i*j)}else if(v-j<0&&n>=0){dld(l,l.i+u*v);eld(l,l.j+i)}}}}jkd(a,(Y9c(),Y8c),(tdd(),f=BD(gdb(I1),9),new xqb(f,BD(_Bb(f,f.length),9),0)));return new f7c(w,k)} +function Yfd(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o;n=Xod(atd(BD(qud((!a.b&&(a.b=new y5d(z2,a,4,7)),a.b),0),82)));o=Xod(atd(BD(qud((!a.c&&(a.c=new y5d(z2,a,5,8)),a.c),0),82)));l=n==o;h=new d7c;b=BD(hkd(a,(Zad(),Sad)),74);if(!!b&&b.b>=2){if((!a.a&&(a.a=new cUd(A2,a,6,6)),a.a).i==0){c=(Fhd(),e=new rmd,e);wtd((!a.a&&(a.a=new cUd(A2,a,6,6)),a.a),c)}else if((!a.a&&(a.a=new cUd(A2,a,6,6)),a.a).i>1){m=new Oyd((!a.a&&(a.a=new cUd(A2,a,6,6)),a.a));while(m.e!=m.i.gc()){Eyd(m)}}ifd(b,BD(qud((!a.a&&(a.a=new cUd(A2,a,6,6)),a.a),0),202))}if(l){for(d=new Fyd((!a.a&&(a.a=new cUd(A2,a,6,6)),a.a));d.e!=d.i.gc();){c=BD(Dyd(d),202);for(j=new Fyd((!c.a&&(c.a=new xMd(y2,c,5)),c.a));j.e!=j.i.gc();){i=BD(Dyd(j),469);h.a=$wnd.Math.max(h.a,i.a);h.b=$wnd.Math.max(h.b,i.b)}}}for(g=new Fyd((!a.n&&(a.n=new cUd(D2,a,1,7)),a.n));g.e!=g.i.gc();){f=BD(Dyd(g),137);k=BD(hkd(f,Yad),8);!!k&&bld(f,k.a,k.b);if(l){h.a=$wnd.Math.max(h.a,f.i+f.g);h.b=$wnd.Math.max(h.b,f.j+f.f)}}return h} +function yMc(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B;t=b.c.length;e=new ULc(a.a,c,null,null);B=KC(UD,Vje,25,t,15,1);p=KC(UD,Vje,25,t,15,1);o=KC(UD,Vje,25,t,15,1);q=0;for(h=0;hB[i]&&(q=i);for(l=new olb(a.a.b);l.an){if(f){Fsb(w,m);Fsb(B,meb(j.b-1))}H=c.b;I+=m+b;m=0;k=$wnd.Math.max(k,c.b+c.c+G)}dld(h,H);eld(h,I);k=$wnd.Math.max(k,H+G+c.c);m=$wnd.Math.max(m,l);H+=G+b}k=$wnd.Math.max(k,d);F=I+m+c.a;if(Fqme;C=$wnd.Math.abs(m.b-o.b)>qme;(!c&&B&&C||c&&(B||C))&&Dsb(q.a,u)}ye(q.a,d);d.b==0?(m=u):(m=(sCb(d.b!=0),BD(d.c.b.c,8)));bZb(n,l,p);if(AZb(e)==A){if(Q_b(A.i)!=e.a){p=new d7c;Y$b(p,Q_b(A.i),s)}yNb(q,utc,p)}cZb(n,q,s);k.a.zc(n,k)}QZb(q,v);RZb(q,A)}for(j=k.a.ec().Kc();j.Ob();){i=BD(j.Pb(),17);QZb(i,null);RZb(i,null)}Qdd(b)} +function KQb(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;if(a.gc()==1){return BD(a.Xb(0),231)}else if(a.gc()<=0){return new kRb}for(e=a.Kc();e.Ob();){c=BD(e.Pb(),231);o=0;k=Ohe;l=Ohe;i=Rie;j=Rie;for(n=new olb(c.e);n.ah){t=0;u+=g+r;g=0}JQb(p,c,t,u);b=$wnd.Math.max(b,t+q.a);g=$wnd.Math.max(g,q.b);t+=q.a+r}return p} +function Ioc(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o;k=new s7c;switch(a.a.g){case 3:m=BD(vNb(b.e,(wtc(),rtc)),15);n=BD(vNb(b.j,rtc),15);o=BD(vNb(b.f,rtc),15);c=BD(vNb(b.e,ptc),15);d=BD(vNb(b.j,ptc),15);e=BD(vNb(b.f,ptc),15);g=new Rkb;Gkb(g,m);n.Jc(new Loc);Gkb(g,JD(n,152)?km(BD(n,152)):JD(n,131)?BD(n,131).a:JD(n,54)?new ov(n):new dv(n));Gkb(g,o);f=new Rkb;Gkb(f,c);Gkb(f,JD(d,152)?km(BD(d,152)):JD(d,131)?BD(d,131).a:JD(d,54)?new ov(d):new dv(d));Gkb(f,e);yNb(b.f,rtc,g);yNb(b.f,ptc,f);yNb(b.f,stc,b.f);yNb(b.e,rtc,null);yNb(b.e,ptc,null);yNb(b.j,rtc,null);yNb(b.j,ptc,null);break;case 1:ye(k,b.e.a);Dsb(k,b.i.n);ye(k,Su(b.j.a));Dsb(k,b.a.n);ye(k,b.f.a);break;default:ye(k,b.e.a);ye(k,Su(b.j.a));ye(k,b.f.a);}Osb(b.f.a);ye(b.f.a,k);QZb(b.f,b.e.c);h=BD(vNb(b.e,(Nyc(),jxc)),74);j=BD(vNb(b.j,jxc),74);i=BD(vNb(b.f,jxc),74);if(!!h||!!j||!!i){l=new s7c;Goc(l,i);Goc(l,j);Goc(l,h);yNb(b.f,jxc,l)}QZb(b.j,null);RZb(b.j,null);QZb(b.e,null);RZb(b.e,null);$_b(b.a,null);$_b(b.i,null);!!b.g&&Ioc(a,b.g)} +function bde(a){ade();var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q;if(a==null)return null;f=rfb(a);o=ede(f);if(o%4!=0){return null}p=o/4|0;if(p==0)return KC(SD,wte,25,0,15,1);l=null;b=0;c=0;d=0;e=0;g=0;h=0;i=0;j=0;n=0;m=0;k=0;l=KC(SD,wte,25,p*3,15,1);for(;n>4)<<24>>24;l[m++]=((c&15)<<4|d>>2&15)<<24>>24;l[m++]=(d<<6|e)<<24>>24}if(!dde(g=f[k++])||!dde(h=f[k++])){return null}b=$ce[g];c=$ce[h];i=f[k++];j=f[k++];if($ce[i]==-1||$ce[j]==-1){if(i==61&&j==61){if((c&15)!=0)return null;q=KC(SD,wte,25,n*3+1,15,1);$fb(l,0,q,0,n*3);q[m]=(b<<2|c>>4)<<24>>24;return q}else if(i!=61&&j==61){d=$ce[i];if((d&3)!=0)return null;q=KC(SD,wte,25,n*3+2,15,1);$fb(l,0,q,0,n*3);q[m++]=(b<<2|c>>4)<<24>>24;q[m]=((c&15)<<4|d>>2&15)<<24>>24;return q}else{return null}}else{d=$ce[i];e=$ce[j];l[m++]=(b<<2|c>>4)<<24>>24;l[m++]=((c&15)<<4|d>>2&15)<<24>>24;l[m++]=(d<<6|e)<<24>>24}return l} +function Sbc(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v;Odd(b,Ine,1);o=BD(vNb(a,(Nyc(),Swc)),218);for(e=new olb(a.b);e.a=2){p=true;m=new olb(f.j);c=BD(mlb(m),11);n=null;while(m.a0){e=BD(Ikb(q.c.a,w-1),10);g=a.i[e.p];B=$wnd.Math.ceil(jBc(a.n,e,q));f=v.a.e-q.d.d-(g.a.e+e.o.b+e.d.a)-B}j=Pje;if(w0&&A.a.e.e-A.a.a-(A.b.e.e-A.b.a)<0;o=t.a.e.e-t.a.a-(t.b.e.e-t.b.a)<0&&A.a.e.e-A.a.a-(A.b.e.e-A.b.a)>0;n=t.a.e.e+t.b.aA.b.e.e+A.a.a;u=0;!p&&!o&&(m?f+l>0?(u=l):j-d>0&&(u=d):n&&(f+h>0?(u=h):j-s>0&&(u=s)));v.a.e+=u;v.b&&(v.d.e+=u);return false} +function XGb(a,b,c){var d,e,f,g,h,i,j,k,l,m;d=new J6c(b.qf().a,b.qf().b,b.rf().a,b.rf().b);e=new I6c;if(a.c){for(g=new olb(b.wf());g.aj&&(d.a+=yfb(KC(TD,$ie,25,-j,15,1)));d.a+='Is';if(hfb(i,wfb(32))>=0){for(e=0;e=d.o.b/2}else{s=!l}if(s){r=BD(vNb(d,(wtc(),vtc)),15);if(!r){f=new Rkb;yNb(d,vtc,f)}else if(m){f=r}else{e=BD(vNb(d,tsc),15);if(!e){f=new Rkb;yNb(d,tsc,f)}else{r.gc()<=e.gc()?(f=r):(f=e)}}}else{e=BD(vNb(d,(wtc(),tsc)),15);if(!e){f=new Rkb;yNb(d,tsc,f)}else if(l){f=e}else{r=BD(vNb(d,vtc),15);if(!r){f=new Rkb;yNb(d,vtc,f)}else{e.gc()<=r.gc()?(f=e):(f=r)}}}f.Fc(a);yNb(a,(wtc(),vsc),c);if(b.d==c){RZb(b,null);c.e.c.length+c.g.c.length==0&&F0b(c,null);d3b(c)}else{QZb(b,null);c.e.c.length+c.g.c.length==0&&F0b(c,null)}Osb(b.a)} +function aoc(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F,G,H;s=new Bib(a.b,0);k=b.Kc();o=0;j=BD(k.Pb(),19).a;v=0;c=new Tqb;A=new zsb;while(s.b=a.a){d=E6b(a,s);k=$wnd.Math.max(k,d.b);u=$wnd.Math.max(u,d.d);Ekb(h,new vgd(s,d))}}B=new Rkb;for(j=0;j0),q.a.Xb(q.c=--q.b),C=new H1b(a.b),Aib(q,C),sCb(q.b0){j=0;!!q&&(j+=h);j+=(C-1)*g;!!t&&(j+=h);B&&!!t&&(j=$wnd.Math.max(j,jQc(t,g,s,A)));if(j0){m=k<100?null:new Ixd(k);j=new Aud(b);o=j.g;r=KC(WD,oje,25,k,15,1);d=0;u=new zud(k);for(e=0;e=0;){if(n!=null?pb(n,o[i]):PD(n)===PD(o[i])){if(r.length<=d){q=r;r=KC(WD,oje,25,2*r.length,15,1);$fb(q,0,r,0,d)}r[d++]=e;wtd(u,o[i]);break v}}n=n;if(PD(n)===PD(h)){break}}}j=u;o=u.g;k=d;if(d>r.length){q=r;r=KC(WD,oje,25,d,15,1);$fb(q,0,r,0,d)}if(d>0){t=true;for(f=0;f=0;){tud(a,r[g])}if(d!=k){for(e=k;--e>=d;){tud(j,e)}q=r;r=KC(WD,oje,25,d,15,1);$fb(q,0,r,0,d)}b=j}}}else{b=Ctd(a,b);for(e=a.i;--e>=0;){if(b.Hc(a.g[e])){tud(a,e);t=true}}}if(t){if(r!=null){c=b.gc();l=c==1?FLd(a,4,b.Kc().Pb(),null,r[0],p):FLd(a,6,b,r,r[0],p);m=c<100?null:new Ixd(c);for(e=b.Kc();e.Ob();){n=e.Pb();m=Q2d(a,BD(n,72),m)}if(!m){Uhd(a.e,l)}else{m.Ei(l);m.Fi()}}else{m=Vxd(b.gc());for(e=b.Kc();e.Ob();){n=e.Pb();m=Q2d(a,BD(n,72),m)}!!m&&m.Fi()}return true}else{return false}} +function fYb(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t;c=new mYb(b);c.a||$Xb(b);j=ZXb(b);i=new Hp;q=new AYb;for(p=new olb(b.a);p.a0||c.o==dMc&&e0){l=BD(Ikb(m.c.a,g-1),10);B=jBc(a.b,m,l);q=m.n.b-m.d.d-(l.n.b+l.o.b+l.d.a+B)}else{q=m.n.b-m.d.d}j=$wnd.Math.min(q,j);if(gg?Anc(a,b,c):Anc(a,c,b);return eg?1:0}}d=BD(vNb(b,(wtc(),Zsc)),19).a;f=BD(vNb(c,Zsc),19).a;d>f?Anc(a,b,c):Anc(a,c,b);return df?1:0} +function u2c(a,b,c,d){var e,f,g,h,i,j,k,l,m,n,o,p,q,r,s;if(Ccb(DD(hkd(b,(Y9c(),d9c))))){return mmb(),mmb(),jmb}j=(!b.a&&(b.a=new cUd(E2,b,10,11)),b.a).i!=0;l=s2c(b);k=!l.dc();if(j||k){e=BD(hkd(b,F9c),149);if(!e){throw vbb(new y2c('Resolved algorithm is not set; apply a LayoutAlgorithmResolver before computing layout.'))}s=D3c(e,(Csd(),ysd));q2c(b);if(!j&&k&&!s){return mmb(),mmb(),jmb}i=new Rkb;if(PD(hkd(b,J8c))===PD((hbd(),ebd))&&(D3c(e,vsd)||D3c(e,usd))){n=p2c(a,b);o=new Psb;ye(o,(!b.a&&(b.a=new cUd(E2,b,10,11)),b.a));while(o.b!=0){m=BD(o.b==0?null:(sCb(o.b!=0),Nsb(o,o.a.a)),33);q2c(m);r=PD(hkd(m,J8c))===PD(gbd);if(r||ikd(m,o8c)&&!C3c(e,hkd(m,F9c))){h=u2c(a,m,c,d);Gkb(i,h);jkd(m,J8c,gbd);hfd(m)}else{ye(o,(!m.a&&(m.a=new cUd(E2,m,10,11)),m.a))}}}else{n=(!b.a&&(b.a=new cUd(E2,b,10,11)),b.a).i;for(g=new Fyd((!b.a&&(b.a=new cUd(E2,b,10,11)),b.a));g.e!=g.i.gc();){f=BD(Dyd(g),33);h=u2c(a,f,c,d);Gkb(i,h);hfd(f)}}for(q=new olb(i);q.a=0?(n=Zcd(h)):(n=Wcd(Zcd(h)));a.Ye($xc,n)}j=new d7c;m=false;if(a.Xe(Txc)){a7c(j,BD(a.We(Txc),8));m=true}else{_6c(j,g.a/2,g.b/2)}switch(n.g){case 4:yNb(k,mxc,(Ctc(),ytc));yNb(k,Bsc,(Gqc(),Fqc));k.o.b=g.b;p<0&&(k.o.a=-p);G0b(l,(Ucd(),zcd));m||(j.a=g.a);j.a-=g.a;break;case 2:yNb(k,mxc,(Ctc(),Atc));yNb(k,Bsc,(Gqc(),Dqc));k.o.b=g.b;p<0&&(k.o.a=-p);G0b(l,(Ucd(),Tcd));m||(j.a=0);break;case 1:yNb(k,Osc,(esc(),dsc));k.o.a=g.a;p<0&&(k.o.b=-p);G0b(l,(Ucd(),Rcd));m||(j.b=g.b);j.b-=g.b;break;case 3:yNb(k,Osc,(esc(),bsc));k.o.a=g.a;p<0&&(k.o.b=-p);G0b(l,(Ucd(),Acd));m||(j.b=0);}a7c(l.n,j);yNb(k,Txc,j);if(b==Zbd||b==_bd||b==$bd){o=0;if(b==Zbd&&a.Xe(Wxc)){switch(n.g){case 1:case 2:o=BD(a.We(Wxc),19).a;break;case 3:case 4:o=-BD(a.We(Wxc),19).a;}}else{switch(n.g){case 4:case 2:o=f.b;b==_bd&&(o/=e.b);break;case 1:case 3:o=f.a;b==_bd&&(o/=e.a);}}yNb(k,htc,o)}yNb(k,Hsc,n);return k} +function AGc(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C;c=Edb(ED(vNb(a.a.j,(Nyc(),Ewc))));if(c<-1||!a.a.i||ecd(BD(vNb(a.a.o,Vxc),98))||V_b(a.a.o,(Ucd(),zcd)).gc()<2&&V_b(a.a.o,Tcd).gc()<2){return true}if(a.a.c.Rf()){return false}v=0;u=0;t=new Rkb;for(i=a.a.e,j=0,k=i.length;j=c} +function ovd(){mvd();function h(f){var g=this;this.dispatch=function(a){var b=a.data;switch(b.cmd){case 'algorithms':var c=pvd((mmb(),new lnb(new $ib(lvd.b))));f.postMessage({id:b.id,data:c});break;case 'categories':var d=pvd((mmb(),new lnb(new $ib(lvd.c))));f.postMessage({id:b.id,data:d});break;case 'options':var e=pvd((mmb(),new lnb(new $ib(lvd.d))));f.postMessage({id:b.id,data:e});break;case 'register':svd(b.algorithms);f.postMessage({id:b.id});break;case 'layout':qvd(b.graph,b.layoutOptions||{},b.options||{});f.postMessage({id:b.id,data:b.graph});break;}};this.saveDispatch=function(b){try{g.dispatch(b)}catch(a){f.postMessage({id:b.data.id,error:a})}}} +function j(b){var c=this;this.dispatcher=new h({postMessage:function(a){c.onmessage({data:a})}});this.postMessage=function(a){setTimeout(function(){c.dispatcher.saveDispatch({data:a})},0)}} +if(typeof document===uke&&typeof self!==uke){var i=new h(self);self.onmessage=i.saveDispatch}else if(typeof module!==uke&&module.exports){Object.defineProperty(exports,'__esModule',{value:true});module.exports={'default':j,Worker:j}}} +function aae(a){if(a.N)return;a.N=true;a.b=Lnd(a,0);Knd(a.b,0);Knd(a.b,1);Knd(a.b,2);a.bb=Lnd(a,1);Knd(a.bb,0);Knd(a.bb,1);a.fb=Lnd(a,2);Knd(a.fb,3);Knd(a.fb,4);Qnd(a.fb,5);a.qb=Lnd(a,3);Knd(a.qb,0);Qnd(a.qb,1);Qnd(a.qb,2);Knd(a.qb,3);Knd(a.qb,4);Qnd(a.qb,5);Knd(a.qb,6);a.a=Mnd(a,4);a.c=Mnd(a,5);a.d=Mnd(a,6);a.e=Mnd(a,7);a.f=Mnd(a,8);a.g=Mnd(a,9);a.i=Mnd(a,10);a.j=Mnd(a,11);a.k=Mnd(a,12);a.n=Mnd(a,13);a.o=Mnd(a,14);a.p=Mnd(a,15);a.q=Mnd(a,16);a.s=Mnd(a,17);a.r=Mnd(a,18);a.t=Mnd(a,19);a.u=Mnd(a,20);a.v=Mnd(a,21);a.w=Mnd(a,22);a.B=Mnd(a,23);a.A=Mnd(a,24);a.C=Mnd(a,25);a.D=Mnd(a,26);a.F=Mnd(a,27);a.G=Mnd(a,28);a.H=Mnd(a,29);a.J=Mnd(a,30);a.I=Mnd(a,31);a.K=Mnd(a,32);a.M=Mnd(a,33);a.L=Mnd(a,34);a.P=Mnd(a,35);a.Q=Mnd(a,36);a.R=Mnd(a,37);a.S=Mnd(a,38);a.T=Mnd(a,39);a.U=Mnd(a,40);a.V=Mnd(a,41);a.X=Mnd(a,42);a.W=Mnd(a,43);a.Y=Mnd(a,44);a.Z=Mnd(a,45);a.$=Mnd(a,46);a._=Mnd(a,47);a.ab=Mnd(a,48);a.cb=Mnd(a,49);a.db=Mnd(a,50);a.eb=Mnd(a,51);a.gb=Mnd(a,52);a.hb=Mnd(a,53);a.ib=Mnd(a,54);a.jb=Mnd(a,55);a.kb=Mnd(a,56);a.lb=Mnd(a,57);a.mb=Mnd(a,58);a.nb=Mnd(a,59);a.ob=Mnd(a,60);a.pb=Mnd(a,61)} +function f5b(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;s=0;if(b.f.a==0){for(q=new olb(a);q.aj&&(tCb(j,b.c.length),BD(b.c[j],200)).a.c.length==0){Lkb(b,(tCb(j,b.c.length),b.c[j]))}}if(!i){--f;continue}if(uZc(b,k,e,i,m,c,j,d)){l=true;continue}if(m){if(vZc(b,k,e,i,c,j,d)){l=true;continue}else if(wZc(k,e)){e.c=true;l=true;continue}}else if(wZc(k,e)){e.c=true;l=true;continue}if(l){continue}}if(wZc(k,e)){e.c=true;l=true;!!i&&(i.k=false);continue}else{a$c(e.q)}}return l} +function fed(a,b,c,d,e,f,g){var h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F,G,H,I;p=0;D=0;for(j=new olb(a.b);j.ap){if(f){Fsb(w,n);Fsb(B,meb(k.b-1));Ekb(a.d,o);h.c=KC(SI,Uhe,1,0,5,1)}H=c.b;I+=n+b;n=0;l=$wnd.Math.max(l,c.b+c.c+G)}h.c[h.c.length]=i;ued(i,H,I);l=$wnd.Math.max(l,H+G+c.c);n=$wnd.Math.max(n,m);H+=G+b;o=i}Gkb(a.a,h);Ekb(a.d,BD(Ikb(h,h.c.length-1),157));l=$wnd.Math.max(l,d);F=I+n+c.a;if(F1&&(g=$wnd.Math.min(g,$wnd.Math.abs(BD(Ut(h.a,1),8).b-k.b)))}}}}}else{for(p=new olb(b.j);p.ae){f=m.a-e;g=Ohe;d.c=KC(SI,Uhe,1,0,5,1);e=m.a}if(m.a>=e){d.c[d.c.length]=h;h.a.b>1&&(g=$wnd.Math.min(g,$wnd.Math.abs(BD(Ut(h.a,h.a.b-2),8).b-m.b)))}}}}}if(d.c.length!=0&&f>b.o.a/2&&g>b.o.b/2){n=new H0b;F0b(n,b);G0b(n,(Ucd(),Acd));n.n.a=b.o.a/2;r=new H0b;F0b(r,b);G0b(r,Rcd);r.n.a=b.o.a/2;r.n.b=b.o.b;for(i=new olb(d);i.a=j.b?QZb(h,r):QZb(h,n)}else{j=BD(Msb(h.a),8);q=h.a.b==0?A0b(h.c):BD(Isb(h.a),8);q.b>=j.b?RZb(h,r):RZb(h,n)}l=BD(vNb(h,(Nyc(),jxc)),74);!!l&&ze(l,j,true)}b.n.a=e-b.o.a/2}} +function erd(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F,G,H,I,J,K;D=null;G=b;F=Rqd(a,dtd(c),G);Lkd(F,_pd(G,Vte));H=BD(oo(a.g,Vpd(aC(G,Cte))),33);m=aC(G,'sourcePort');d=null;!!m&&(d=Vpd(m));I=BD(oo(a.j,d),118);if(!H){h=Wpd(G);o="An edge must have a source node (edge id: '"+h;p=o+$te;throw vbb(new cqd(p))}if(!!I&&!Hb(mpd(I),H)){i=_pd(G,Vte);q="The source port of an edge must be a port of the edge's source node (edge id: '"+i;r=q+$te;throw vbb(new cqd(r))}B=(!F.b&&(F.b=new y5d(z2,F,4,7)),F.b);f=null;I?(f=I):(f=H);wtd(B,f);J=BD(oo(a.g,Vpd(aC(G,bue))),33);n=aC(G,'targetPort');e=null;!!n&&(e=Vpd(n));K=BD(oo(a.j,e),118);if(!J){l=Wpd(G);s="An edge must have a target node (edge id: '"+l;t=s+$te;throw vbb(new cqd(t))}if(!!K&&!Hb(mpd(K),J)){j=_pd(G,Vte);u="The target port of an edge must be a port of the edge's target node (edge id: '"+j;v=u+$te;throw vbb(new cqd(v))}C=(!F.c&&(F.c=new y5d(z2,F,5,8)),F.c);g=null;K?(g=K):(g=J);wtd(C,g);if((!F.b&&(F.b=new y5d(z2,F,4,7)),F.b).i==0||(!F.c&&(F.c=new y5d(z2,F,5,8)),F.c).i==0){k=_pd(G,Vte);w=Zte+k;A=w+$te;throw vbb(new cqd(A))}grd(G,F);frd(G,F);D=crd(a,G,F);return D} +function DXb(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D;l=FXb(zXb(a,(Ucd(),Fcd)),b);o=EXb(zXb(a,Gcd),b);u=EXb(zXb(a,Ocd),b);B=GXb(zXb(a,Qcd),b);m=GXb(zXb(a,Bcd),b);s=EXb(zXb(a,Ncd),b);p=EXb(zXb(a,Hcd),b);w=EXb(zXb(a,Pcd),b);v=EXb(zXb(a,Ccd),b);C=GXb(zXb(a,Ecd),b);r=EXb(zXb(a,Lcd),b);t=EXb(zXb(a,Kcd),b);A=EXb(zXb(a,Dcd),b);D=GXb(zXb(a,Mcd),b);n=GXb(zXb(a,Icd),b);q=EXb(zXb(a,Jcd),b);c=w6c(OC(GC(UD,1),Vje,25,15,[s.a,B.a,w.a,D.a]));d=w6c(OC(GC(UD,1),Vje,25,15,[o.a,l.a,u.a,q.a]));e=r.a;f=w6c(OC(GC(UD,1),Vje,25,15,[p.a,m.a,v.a,n.a]));j=w6c(OC(GC(UD,1),Vje,25,15,[s.b,o.b,p.b,t.b]));i=w6c(OC(GC(UD,1),Vje,25,15,[B.b,l.b,m.b,q.b]));k=C.b;h=w6c(OC(GC(UD,1),Vje,25,15,[w.b,u.b,v.b,A.b]));vXb(zXb(a,Fcd),c+e,j+k);vXb(zXb(a,Jcd),c+e,j+k);vXb(zXb(a,Gcd),c+e,0);vXb(zXb(a,Ocd),c+e,j+k+i);vXb(zXb(a,Qcd),0,j+k);vXb(zXb(a,Bcd),c+e+d,j+k);vXb(zXb(a,Hcd),c+e+d,0);vXb(zXb(a,Pcd),0,j+k+i);vXb(zXb(a,Ccd),c+e+d,j+k+i);vXb(zXb(a,Ecd),0,j);vXb(zXb(a,Lcd),c,0);vXb(zXb(a,Dcd),0,j+k+i);vXb(zXb(a,Icd),c+e+d,0);g=new d7c;g.a=w6c(OC(GC(UD,1),Vje,25,15,[c+d+e+f,C.a,t.a,A.a]));g.b=w6c(OC(GC(UD,1),Vje,25,15,[j+i+k+h,r.b,D.b,n.b]));return g} +function Ngc(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q;p=new Rkb;for(m=new olb(a.d.b);m.ae.d.d+e.d.a){k.f.d=true}else{k.f.d=true;k.f.a=true}}}d.b!=d.d.c&&(b=c)}if(k){f=BD(Ohb(a.f,g.d.i),57);if(b.bf.d.d+f.d.a){k.f.d=true}else{k.f.d=true;k.f.a=true}}}}for(h=new Sr(ur(R_b(n).a.Kc(),new Sq));Qr(h);){g=BD(Rr(h),17);if(g.a.b!=0){b=BD(Isb(g.a),8);if(g.d.j==(Ucd(),Acd)){q=new hic(b,new f7c(b.a,e.d.d),e,g);q.f.a=true;q.a=g.d;p.c[p.c.length]=q}if(g.d.j==Rcd){q=new hic(b,new f7c(b.a,e.d.d+e.d.a),e,g);q.f.d=true;q.a=g.d;p.c[p.c.length]=q}}}}}return p} +function WJc(a,b,c){var d,e,f,g,h,i,j,k,l;Odd(c,'Network simplex node placement',1);a.e=b;a.n=BD(vNb(b,(wtc(),otc)),304);VJc(a);HJc(a);MAb(LAb(new YAb(null,new Kub(a.e.b,16)),new KKc),new MKc(a));MAb(JAb(LAb(JAb(LAb(new YAb(null,new Kub(a.e.b,16)),new zLc),new BLc),new DLc),new FLc),new IKc(a));if(Ccb(DD(vNb(a.e,(Nyc(),Axc))))){g=Udd(c,1);Odd(g,'Straight Edges Pre-Processing',1);UJc(a);Qdd(g)}JFb(a.f);f=BD(vNb(b,Ayc),19).a*a.f.a.c.length;uGb(HGb(IGb(LGb(a.f),f),false),Udd(c,1));if(a.d.a.gc()!=0){g=Udd(c,1);Odd(g,'Flexible Where Space Processing',1);h=BD(Btb(RAb(NAb(new YAb(null,new Kub(a.f.a,16)),new OKc),new iKc)),19).a;i=BD(Btb(QAb(NAb(new YAb(null,new Kub(a.f.a,16)),new QKc),new mKc)),19).a;j=i-h;k=nGb(new pGb,a.f);l=nGb(new pGb,a.f);AFb(DFb(CFb(BFb(EFb(new FFb,20000),j),k),l));MAb(JAb(JAb(Plb(a.i),new SKc),new UKc),new WKc(h,k,j,l));for(e=a.d.a.ec().Kc();e.Ob();){d=BD(e.Pb(),213);d.g=1}uGb(HGb(IGb(LGb(a.f),f),false),Udd(g,1));Qdd(g)}if(Ccb(DD(vNb(b,Axc)))){g=Udd(c,1);Odd(g,'Straight Edges Post-Processing',1);TJc(a);Qdd(g)}GJc(a);a.e=null;a.f=null;a.i=null;a.c=null;Uhb(a.k);a.j=null;a.a=null;a.o=null;a.d.a.$b();Qdd(c)} +function lMc(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v;for(h=new olb(a.a.b);h.a0){d=l.gc();j=QD($wnd.Math.floor((d+1)/2))-1;e=QD($wnd.Math.ceil((d+1)/2))-1;if(b.o==dMc){for(k=e;k>=j;k--){if(b.a[u.p]==u){p=BD(l.Xb(k),46);o=BD(p.a,10);if(!Rqb(c,p.b)&&n>a.b.e[o.p]){b.a[o.p]=u;b.g[u.p]=b.g[o.p];b.a[u.p]=b.g[u.p];b.f[b.g[u.p].p]=(Bcb(),Ccb(b.f[b.g[u.p].p])&u.k==(j0b(),g0b)?true:false);n=a.b.e[o.p]}}}}else{for(k=j;k<=e;k++){if(b.a[u.p]==u){r=BD(l.Xb(k),46);q=BD(r.a,10);if(!Rqb(c,r.b)&&n=o){if(s>o){n.c=KC(SI,Uhe,1,0,5,1);o=s}n.c[n.c.length]=g}}if(n.c.length!=0){m=BD(Ikb(n,Bub(b,n.c.length)),128);F.a.Bc(m)!=null;m.s=p++;AQc(m,C,w);n.c=KC(SI,Uhe,1,0,5,1)}}u=a.c.length+1;for(h=new olb(a);h.aD.s){uib(c);Lkb(D.i,d);if(d.c>0){d.a=D;Ekb(D.t,d);d.b=A;Ekb(A.i,d)}}}}} +function qde(a){var b,c,d,e,f;b=a.c;switch(b){case 11:return a.Ml();case 12:return a.Ol();case 14:return a.Ql();case 15:return a.Tl();case 16:return a.Rl();case 17:return a.Ul();case 21:nde(a);return wfe(),wfe(),ffe;case 10:switch(a.a){case 65:return a.yl();case 90:return a.Dl();case 122:return a.Kl();case 98:return a.El();case 66:return a.zl();case 60:return a.Jl();case 62:return a.Hl();}}f=pde(a);b=a.c;switch(b){case 3:return a.Zl(f);case 4:return a.Xl(f);case 5:return a.Yl(f);case 0:if(a.a==123&&a.d=48&&b<=57){d=b-48;while(e=48&&b<=57){d=d*10+b-48;if(d<0)throw vbb(new mde(tvd((h0d(),bve))))}}else{throw vbb(new mde(tvd((h0d(),Zue))))}c=d;if(b==44){if(e>=a.j){throw vbb(new mde(tvd((h0d(),_ue))))}else if((b=bfb(a.i,e++))>=48&&b<=57){c=b-48;while(e=48&&b<=57){c=c*10+b-48;if(c<0)throw vbb(new mde(tvd((h0d(),bve))))}if(d>c)throw vbb(new mde(tvd((h0d(),ave))))}else{c=-1}}if(b!=125)throw vbb(new mde(tvd((h0d(),$ue))));if(a.sl(e)){f=(wfe(),wfe(),++vfe,new lge(9,f));a.d=e+1}else{f=(wfe(),wfe(),++vfe,new lge(3,f));a.d=e}f.dm(d);f.cm(c);nde(a)}}return f} +function $bc(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F;p=new Skb(b.b);u=new Skb(b.b);m=new Skb(b.b);B=new Skb(b.b);q=new Skb(b.b);for(A=Jsb(b,0);A.b!=A.d.c;){v=BD(Xsb(A),11);for(h=new olb(v.g);h.a0;r=v.g.c.length>0;j&&r?(m.c[m.c.length]=v,true):j?(p.c[p.c.length]=v,true):r&&(u.c[u.c.length]=v,true)}for(o=new olb(p);o.a1){o=new Oyd((!a.a&&(a.a=new cUd(A2,a,6,6)),a.a));while(o.e!=o.i.gc()){Eyd(o)}}g=BD(qud((!a.a&&(a.a=new cUd(A2,a,6,6)),a.a),0),202);q=H;H>v+u?(q=v+u):Hw+p?(r=w+p):Iv-u&&qw-p&&rH+G?(B=H+G):vI+A?(C=I+A):wH-G&&BI-A&&Cc&&(m=c-1);n=N+Cub(b,24)*lke*l-l/2;n<0?(n=1):n>d&&(n=d-1);e=(Fhd(),i=new xkd,i);vkd(e,m);wkd(e,n);wtd((!g.a&&(g.a=new xMd(y2,g,5)),g.a),e)}} +function Nyc(){Nyc=ccb;iyc=(Y9c(),I9c);jyc=J9c;kyc=K9c;lyc=L9c;nyc=M9c;oyc=N9c;ryc=P9c;tyc=R9c;uyc=S9c;syc=Q9c;vyc=T9c;xyc=U9c;zyc=X9c;qyc=O9c;hyc=(jwc(),Bvc);myc=Cvc;pyc=Dvc;wyc=Evc;byc=new Osd(D9c,meb(0));cyc=yvc;dyc=zvc;eyc=Avc;Kyc=awc;Cyc=Hvc;Dyc=Kvc;Gyc=Svc;Eyc=Nvc;Fyc=Pvc;Myc=fwc;Lyc=cwc;Iyc=Yvc;Hyc=Wvc;Jyc=$vc;Cxc=pvc;Dxc=qvc;Xwc=Auc;Ywc=Duc;Lxc=new q0b(12);Kxc=new Osd(f9c,Lxc);Twc=(Aad(),wad);Swc=new Osd(E8c,Twc);Uxc=new Osd(s9c,0);fyc=new Osd(E9c,meb(1));owc=new Osd(r8c,tme);Jxc=d9c;Vxc=t9c;$xc=A9c;Kwc=y8c;mwc=p8c;axc=J8c;gyc=new Osd(H9c,(Bcb(),true));fxc=M8c;gxc=N8c;Fxc=Y8c;Ixc=b9c;Gxc=$8c;Nwc=(ead(),cad);Lwc=new Osd(z8c,Nwc);xxc=W8c;wxc=U8c;Yxc=x9c;Xxc=w9c;Zxc=z9c;Oxc=(Tbd(),Sbd);new Osd(l9c,Oxc);Qxc=o9c;Rxc=p9c;Sxc=q9c;Pxc=n9c;Byc=Gvc;sxc=avc;rxc=$uc;Ayc=Fvc;mxc=Suc;Jwc=muc;Iwc=kuc;Awc=Xtc;Bwc=Ytc;Dwc=buc;Cwc=Ztc;Hwc=iuc;uxc=cvc;vxc=dvc;ixc=Luc;Exc=uvc;zxc=hvc;$wc=Guc;Bxc=nvc;Vwc=wuc;Wwc=yuc;zwc=w8c;yxc=evc;swc=Mtc;rwc=Ktc;qwc=Jtc;cxc=Juc;bxc=Iuc;dxc=Kuc;Hxc=_8c;jxc=Q8c;Zwc=G8c;Qwc=C8c;Pwc=B8c;Ewc=euc;Wxc=v9c;pwc=v8c;exc=L8c;Txc=r9c;Mxc=h9c;Nxc=j9c;oxc=Vuc;pxc=Xuc;ayc=C9c;nwc=Itc;qxc=Zuc;Rwc=suc;Owc=quc;txc=S8c;kxc=Puc;Axc=kvc;yyc=V9c;Mwc=ouc;_xc=wvc;Uwc=uuc;lxc=Ruc;Fwc=guc;hxc=P8c;nxc=Uuc;Gwc=huc;ywc=Vtc;wwc=Stc;uwc=Qtc;vwc=Rtc;xwc=Utc;twc=Otc;_wc=Huc} +function shb(a,b){phb();var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F,G,H;B=a.e;o=a.d;e=a.a;if(B==0){switch(b){case 0:return '0';case 1:return $je;case 2:return '0.00';case 3:return '0.000';case 4:return '0.0000';case 5:return '0.00000';case 6:return '0.000000';default:w=new Ufb;b<0?(w.a+='0E+',w):(w.a+='0E',w);w.a+=-b;return w.a;}}t=o*10+1+7;u=KC(TD,$ie,25,t+1,15,1);c=t;if(o==1){h=e[0];if(h<0){H=xbb(h,Yje);do{p=H;H=Abb(H,10);u[--c]=48+Tbb(Qbb(p,Ibb(H,10)))&aje}while(ybb(H,0)!=0)}else{H=h;do{p=H;H=H/10|0;u[--c]=48+(p-H*10)&aje}while(H!=0)}}else{D=KC(WD,oje,25,o,15,1);G=o;$fb(e,0,D,0,G);I:while(true){A=0;for(j=G-1;j>=0;j--){F=wbb(Nbb(A,32),xbb(D[j],Yje));r=qhb(F);D[j]=Tbb(r);A=Tbb(Obb(r,32))}s=Tbb(A);q=c;do{u[--c]=48+s%10&aje}while((s=s/10|0)!=0&&c!=0);d=9-q+c;for(i=0;i0;i++){u[--c]=48}l=G-1;for(;D[l]==0;l--){if(l==0){break I}}G=l+1}while(u[c]==48){++c}}n=B<0;g=t-c-b-1;if(b==0){n&&(u[--c]=45);return zfb(u,c,t-c)}if(b>0&&g>=-6){if(g>=0){k=c+g;for(m=t-1;m>=k;m--){u[m+1]=u[m]}u[++k]=46;n&&(u[--c]=45);return zfb(u,c,t-c+1)}for(l=2;l<-g+1;l++){u[--c]=48}u[--c]=46;u[--c]=48;n&&(u[--c]=45);return zfb(u,c,t-c)}C=c+1;f=t;v=new Vfb;n&&(v.a+='-',v);if(f-C>=1){Kfb(v,u[c]);v.a+='.';v.a+=zfb(u,c+1,t-c-1)}else{v.a+=zfb(u,c,t-c)}v.a+='E';g>0&&(v.a+='+',v);v.a+=''+g;return v.a} +function z$c(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w;a.c=b;a.g=new Lqb;c=(Pgd(),new bhd(a.c));d=new YGb(c);UGb(d);t=GD(hkd(a.c,(d0c(),Y_c)));i=BD(hkd(a.c,$_c),316);v=BD(hkd(a.c,__c),429);g=BD(hkd(a.c,T_c),482);u=BD(hkd(a.c,Z_c),430);a.j=Edb(ED(hkd(a.c,a0c)));h=a.a;switch(i.g){case 0:h=a.a;break;case 1:h=a.b;break;case 2:h=a.i;break;case 3:h=a.e;break;case 4:h=a.f;break;default:throw vbb(new Wdb(Mre+(i.f!=null?i.f:''+i.g)));}a.d=new g_c(h,v,g);yNb(a.d,(XNb(),VNb),DD(hkd(a.c,V_c)));a.d.c=Ccb(DD(hkd(a.c,U_c)));if(Vod(a.c).i==0){return a.d}for(l=new Fyd(Vod(a.c));l.e!=l.i.gc();){k=BD(Dyd(l),33);n=k.g/2;m=k.f/2;w=new f7c(k.i+n,k.j+m);while(Mhb(a.g,w)){O6c(w,($wnd.Math.random()-0.5)*qme,($wnd.Math.random()-0.5)*qme)}p=BD(hkd(k,(Y9c(),S8c)),142);q=new aOb(w,new J6c(w.a-n-a.j/2-p.b,w.b-m-a.j/2-p.d,k.g+a.j+(p.b+p.c),k.f+a.j+(p.d+p.a)));Ekb(a.d.i,q);Rhb(a.g,w,new vgd(q,k))}switch(u.g){case 0:if(t==null){a.d.d=BD(Ikb(a.d.i,0),65)}else{for(s=new olb(a.d.i);s.a1&&(Gsb(k,r,k.c.b,k.c),true);Zsb(e)}}}r=s}}return k} +function $Bc(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F,G,H,I,J,K,L;Odd(c,'Greedy cycle removal',1);t=b.a;L=t.c.length;a.a=KC(WD,oje,25,L,15,1);a.c=KC(WD,oje,25,L,15,1);a.b=KC(WD,oje,25,L,15,1);j=0;for(r=new olb(t);r.a0?G+1:1}for(g=new olb(w.g);g.a0?G+1:1}}a.c[j]==0?Dsb(a.e,p):a.a[j]==0&&Dsb(a.f,p);++j}o=-1;n=1;l=new Rkb;a.d=BD(vNb(b,(wtc(),jtc)),230);while(L>0){while(a.e.b!=0){I=BD(Lsb(a.e),10);a.b[I.p]=o--;_Bc(a,I);--L}while(a.f.b!=0){J=BD(Lsb(a.f),10);a.b[J.p]=n++;_Bc(a,J);--L}if(L>0){m=Rie;for(s=new olb(t);s.a=m){if(u>m){l.c=KC(SI,Uhe,1,0,5,1);m=u}l.c[l.c.length]=p}}}k=a.Zf(l);a.b[k.p]=n++;_Bc(a,k);--L}}H=t.c.length+1;for(j=0;ja.b[K]){PZb(d,true);yNb(b,Asc,(Bcb(),true))}}}}a.a=null;a.c=null;a.b=null;Osb(a.f);Osb(a.e);Qdd(c)} +function sQb(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;d=new Rkb;h=new Rkb;q=b/2;n=a.gc();e=BD(a.Xb(0),8);r=BD(a.Xb(1),8);o=tQb(e.a,e.b,r.a,r.b,q);Ekb(d,(tCb(0,o.c.length),BD(o.c[0],8)));Ekb(h,(tCb(1,o.c.length),BD(o.c[1],8)));for(j=2;j=0;i--){Dsb(c,(tCb(i,g.c.length),BD(g.c[i],8)))}return c} +function aFd(a){var b,c,d,e,f,g,h,i,j,k,l,m,n;g=true;l=null;d=null;e=null;b=false;n=BEd;j=null;f=null;h=0;i=UEd(a,h,zEd,AEd);if(i=0&&dfb(a.substr(h,'//'.length),'//')){h+=2;i=UEd(a,h,CEd,DEd);d=a.substr(h,i-h);h=i}else if(l!=null&&(h==a.length||(BCb(h,a.length),a.charCodeAt(h)!=47))){g=false;i=ifb(a,wfb(35),h);i==-1&&(i=a.length);d=a.substr(h,i-h);h=i}if(!c&&h0&&bfb(k,k.length-1)==58){e=k;h=i}}if(h=a.j){a.a=-1;a.c=1;return}b=bfb(a.i,a.d++);a.a=b;if(a.b==1){switch(b){case 92:d=10;if(a.d>=a.j)throw vbb(new mde(tvd((h0d(),uue))));a.a=bfb(a.i,a.d++);break;case 45:if((a.e&512)==512&&a.d=a.j)break;if(bfb(a.i,a.d)!=63)break;if(++a.d>=a.j)throw vbb(new mde(tvd((h0d(),vue))));b=bfb(a.i,a.d++);switch(b){case 58:d=13;break;case 61:d=14;break;case 33:d=15;break;case 91:d=19;break;case 62:d=18;break;case 60:if(a.d>=a.j)throw vbb(new mde(tvd((h0d(),vue))));b=bfb(a.i,a.d++);if(b==61){d=16}else if(b==33){d=17}else throw vbb(new mde(tvd((h0d(),wue))));break;case 35:while(a.d=a.j)throw vbb(new mde(tvd((h0d(),uue))));a.a=bfb(a.i,a.d++);break;default:d=0;}a.c=d} +function P5b(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F,G;A=BD(vNb(a,(Nyc(),Vxc)),98);if(!(A!=(dcd(),bcd)&&A!=ccd)){return}o=a.b;n=o.c.length;k=new Skb((Xj(n+2,Mie),Oy(wbb(wbb(5,n+2),(n+2)/10|0))));p=new Skb((Xj(n+2,Mie),Oy(wbb(wbb(5,n+2),(n+2)/10|0))));Ekb(k,new Lqb);Ekb(k,new Lqb);Ekb(p,new Rkb);Ekb(p,new Rkb);w=new Rkb;for(b=0;b=v||!wCc(r,d))&&(d=yCc(b,k));$_b(r,d);for(f=new Sr(ur(R_b(r).a.Kc(),new Sq));Qr(f);){e=BD(Rr(f),17);if(a.a[e.p]){continue}p=e.c.i;--a.e[p.p];a.e[p.p]==0&&(zCb(cub(n,p)),true)}}for(j=k.c.length-1;j>=0;--j){Ekb(b.b,(tCb(j,k.c.length),BD(k.c[j],29)))}b.a.c=KC(SI,Uhe,1,0,5,1);Qdd(c)} +function gee(a){var b,c,d,e,f,g,h,i,j;a.b=1;nde(a);b=null;if(a.c==0&&a.a==94){nde(a);b=(wfe(),wfe(),++vfe,new $fe(4));Ufe(b,0,lxe);h=(null,++vfe,new $fe(4))}else{h=(wfe(),wfe(),++vfe,new $fe(4))}e=true;while((j=a.c)!=1){if(j==0&&a.a==93&&!e){if(b){Zfe(b,h);h=b}break}c=a.a;d=false;if(j==10){switch(c){case 100:case 68:case 119:case 87:case 115:case 83:Xfe(h,fee(c));d=true;break;case 105:case 73:case 99:case 67:c=(Xfe(h,fee(c)),-1);c<0&&(d=true);break;case 112:case 80:i=tde(a,c);if(!i)throw vbb(new mde(tvd((h0d(),Iue))));Xfe(h,i);d=true;break;default:c=eee(a);}}else if(j==24&&!e){if(b){Zfe(b,h);h=b}f=gee(a);Zfe(h,f);if(a.c!=0||a.a!=93)throw vbb(new mde(tvd((h0d(),Mue))));break}nde(a);if(!d){if(j==0){if(c==91)throw vbb(new mde(tvd((h0d(),Nue))));if(c==93)throw vbb(new mde(tvd((h0d(),Oue))));if(c==45&&!e&&a.a!=93)throw vbb(new mde(tvd((h0d(),Pue))))}if(a.c!=0||a.a!=45||c==45&&e){Ufe(h,c,c)}else{nde(a);if((j=a.c)==1)throw vbb(new mde(tvd((h0d(),Kue))));if(j==0&&a.a==93){Ufe(h,c,c);Ufe(h,45,45)}else if(j==0&&a.a==93||j==24){throw vbb(new mde(tvd((h0d(),Pue))))}else{g=a.a;if(j==0){if(g==91)throw vbb(new mde(tvd((h0d(),Nue))));if(g==93)throw vbb(new mde(tvd((h0d(),Oue))));if(g==45)throw vbb(new mde(tvd((h0d(),Pue))))}else j==10&&(g=eee(a));nde(a);if(c>g)throw vbb(new mde(tvd((h0d(),Sue))));Ufe(h,c,g)}}}e=false}if(a.c==1)throw vbb(new mde(tvd((h0d(),Kue))));Yfe(h);Vfe(h);a.b=0;nde(a);return h} +function xZd(a){Bnd(a.c,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'http://www.w3.org/2001/XMLSchema#decimal']));Bnd(a.d,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'http://www.w3.org/2001/XMLSchema#integer']));Bnd(a.e,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'http://www.w3.org/2001/XMLSchema#boolean']));Bnd(a.f,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'EBoolean',fue,'EBoolean:Object']));Bnd(a.i,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'http://www.w3.org/2001/XMLSchema#byte']));Bnd(a.g,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'http://www.w3.org/2001/XMLSchema#hexBinary']));Bnd(a.j,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'EByte',fue,'EByte:Object']));Bnd(a.n,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'EChar',fue,'EChar:Object']));Bnd(a.t,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'http://www.w3.org/2001/XMLSchema#double']));Bnd(a.u,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'EDouble',fue,'EDouble:Object']));Bnd(a.F,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'http://www.w3.org/2001/XMLSchema#float']));Bnd(a.G,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'EFloat',fue,'EFloat:Object']));Bnd(a.I,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'http://www.w3.org/2001/XMLSchema#int']));Bnd(a.J,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'EInt',fue,'EInt:Object']));Bnd(a.N,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'http://www.w3.org/2001/XMLSchema#long']));Bnd(a.O,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'ELong',fue,'ELong:Object']));Bnd(a.Z,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'http://www.w3.org/2001/XMLSchema#short']));Bnd(a.$,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'EShort',fue,'EShort:Object']));Bnd(a._,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'http://www.w3.org/2001/XMLSchema#string']))} +function fRc(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F,G;if(a.c.length==1){return tCb(0,a.c.length),BD(a.c[0],135)}else if(a.c.length<=0){return new SRc}for(i=new olb(a);i.al){F=0;G+=k+A;k=0}eRc(v,g,F,G);b=$wnd.Math.max(b,F+w.a);k=$wnd.Math.max(k,w.b);F+=w.a+A}u=new Lqb;c=new Lqb;for(C=new olb(a);C.aSLc(f))&&(l=f)}}!l&&(l=(tCb(0,q.c.length),BD(q.c[0],180)));for(p=new olb(b.b);p.a=-1900?1:0;c>=4?Qfb(a,OC(GC(ZI,1),nie,2,6,[pje,qje])[h]):Qfb(a,OC(GC(ZI,1),nie,2,6,['BC','AD'])[h]);break;case 121:kA(a,c,d);break;case 77:jA(a,c,d);break;case 107:i=e.q.getHours();i==0?EA(a,24,c):EA(a,i,c);break;case 83:iA(a,c,e);break;case 69:k=d.q.getDay();c==5?Qfb(a,OC(GC(ZI,1),nie,2,6,['S','M','T','W','T','F','S'])[k]):c==4?Qfb(a,OC(GC(ZI,1),nie,2,6,[rje,sje,tje,uje,vje,wje,xje])[k]):Qfb(a,OC(GC(ZI,1),nie,2,6,['Sun','Mon','Tue','Wed','Thu','Fri','Sat'])[k]);break;case 97:e.q.getHours()>=12&&e.q.getHours()<24?Qfb(a,OC(GC(ZI,1),nie,2,6,['AM','PM'])[1]):Qfb(a,OC(GC(ZI,1),nie,2,6,['AM','PM'])[0]);break;case 104:l=e.q.getHours()%12;l==0?EA(a,12,c):EA(a,l,c);break;case 75:m=e.q.getHours()%12;EA(a,m,c);break;case 72:n=e.q.getHours();EA(a,n,c);break;case 99:o=d.q.getDay();c==5?Qfb(a,OC(GC(ZI,1),nie,2,6,['S','M','T','W','T','F','S'])[o]):c==4?Qfb(a,OC(GC(ZI,1),nie,2,6,[rje,sje,tje,uje,vje,wje,xje])[o]):c==3?Qfb(a,OC(GC(ZI,1),nie,2,6,['Sun','Mon','Tue','Wed','Thu','Fri','Sat'])[o]):EA(a,o,1);break;case 76:p=d.q.getMonth();c==5?Qfb(a,OC(GC(ZI,1),nie,2,6,['J','F','M','A','M','J','J','A','S','O','N','D'])[p]):c==4?Qfb(a,OC(GC(ZI,1),nie,2,6,[bje,cje,dje,eje,fje,gje,hje,ije,jje,kje,lje,mje])[p]):c==3?Qfb(a,OC(GC(ZI,1),nie,2,6,['Jan','Feb','Mar','Apr',fje,'Jun','Jul','Aug','Sep','Oct','Nov','Dec'])[p]):EA(a,p+1,c);break;case 81:q=d.q.getMonth()/3|0;c<4?Qfb(a,OC(GC(ZI,1),nie,2,6,['Q1','Q2','Q3','Q4'])[q]):Qfb(a,OC(GC(ZI,1),nie,2,6,['1st quarter','2nd quarter','3rd quarter','4th quarter'])[q]);break;case 100:r=d.q.getDate();EA(a,r,c);break;case 109:j=e.q.getMinutes();EA(a,j,c);break;case 115:g=e.q.getSeconds();EA(a,g,c);break;case 122:c<4?Qfb(a,f.c[0]):Qfb(a,f.c[1]);break;case 118:Qfb(a,f.b);break;case 90:c<3?Qfb(a,OA(f)):c==3?Qfb(a,NA(f)):Qfb(a,QA(f.a));break;default:return false;}return true} +function X1b(a,b,c,d){var e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F,G,H;N1b(b);i=BD(qud((!b.b&&(b.b=new y5d(z2,b,4,7)),b.b),0),82);k=BD(qud((!b.c&&(b.c=new y5d(z2,b,5,8)),b.c),0),82);h=atd(i);j=atd(k);g=(!b.a&&(b.a=new cUd(A2,b,6,6)),b.a).i==0?null:BD(qud((!b.a&&(b.a=new cUd(A2,b,6,6)),b.a),0),202);A=BD(Ohb(a.a,h),10);F=BD(Ohb(a.a,j),10);B=null;G=null;if(JD(i,186)){w=BD(Ohb(a.a,i),299);if(JD(w,11)){B=BD(w,11)}else if(JD(w,10)){A=BD(w,10);B=BD(Ikb(A.j,0),11)}}if(JD(k,186)){D=BD(Ohb(a.a,k),299);if(JD(D,11)){G=BD(D,11)}else if(JD(D,10)){F=BD(D,10);G=BD(Ikb(F.j,0),11)}}if(!A||!F){throw vbb(new z2c('The source or the target of edge '+b+' could not be found. '+'This usually happens when an edge connects a node laid out by ELK Layered to a node in '+'another level of hierarchy laid out by either another instance of ELK Layered or another '+'layout algorithm alltogether. The former can be solved by setting the hierarchyHandling '+'option to INCLUDE_CHILDREN.'))}p=new UZb;tNb(p,b);yNb(p,(wtc(),$sc),b);yNb(p,(Nyc(),jxc),null);n=BD(vNb(d,Ksc),21);A==F&&n.Fc((Orc(),Nrc));if(!B){v=(KAc(),IAc);C=null;if(!!g&&fcd(BD(vNb(A,Vxc),98))){C=new f7c(g.j,g.k);Bfd(C,Mld(b));Cfd(C,c);if(ntd(j,h)){v=HAc;P6c(C,A.n)}}B=$$b(A,C,v,d)}if(!G){v=(KAc(),HAc);H=null;if(!!g&&fcd(BD(vNb(F,Vxc),98))){H=new f7c(g.b,g.c);Bfd(H,Mld(b));Cfd(H,c)}G=$$b(F,H,v,Q_b(F))}QZb(p,B);RZb(p,G);(B.e.c.length>1||B.g.c.length>1||G.e.c.length>1||G.g.c.length>1)&&n.Fc((Orc(),Irc));for(m=new Fyd((!b.n&&(b.n=new cUd(D2,b,1,7)),b.n));m.e!=m.i.gc();){l=BD(Dyd(m),137);if(!Ccb(DD(hkd(l,Jxc)))&&!!l.a){q=Z1b(l);Ekb(p.b,q);switch(BD(vNb(q,Qwc),272).g){case 1:case 2:n.Fc((Orc(),Grc));break;case 0:n.Fc((Orc(),Erc));yNb(q,Qwc,(qad(),nad));}}}f=BD(vNb(d,Iwc),314);r=BD(vNb(d,Exc),315);e=f==(Rpc(),Opc)||r==(Vzc(),Rzc);if(!!g&&(!g.a&&(g.a=new xMd(y2,g,5)),g.a).i!=0&&e){s=ofd(g);o=new s7c;for(u=Jsb(s,0);u.b!=u.d.c;){t=BD(Xsb(u),8);Dsb(o,new g7c(t))}yNb(p,_sc,o)}return p} +function yZd(a){if(a.gb)return;a.gb=true;a.b=Lnd(a,0);Knd(a.b,18);Qnd(a.b,19);a.a=Lnd(a,1);Knd(a.a,1);Qnd(a.a,2);Qnd(a.a,3);Qnd(a.a,4);Qnd(a.a,5);a.o=Lnd(a,2);Knd(a.o,8);Knd(a.o,9);Qnd(a.o,10);Qnd(a.o,11);Qnd(a.o,12);Qnd(a.o,13);Qnd(a.o,14);Qnd(a.o,15);Qnd(a.o,16);Qnd(a.o,17);Qnd(a.o,18);Qnd(a.o,19);Qnd(a.o,20);Qnd(a.o,21);Qnd(a.o,22);Qnd(a.o,23);Pnd(a.o);Pnd(a.o);Pnd(a.o);Pnd(a.o);Pnd(a.o);Pnd(a.o);Pnd(a.o);Pnd(a.o);Pnd(a.o);Pnd(a.o);a.p=Lnd(a,3);Knd(a.p,2);Knd(a.p,3);Knd(a.p,4);Knd(a.p,5);Qnd(a.p,6);Qnd(a.p,7);Pnd(a.p);Pnd(a.p);a.q=Lnd(a,4);Knd(a.q,8);a.v=Lnd(a,5);Qnd(a.v,9);Pnd(a.v);Pnd(a.v);Pnd(a.v);a.w=Lnd(a,6);Knd(a.w,2);Knd(a.w,3);Knd(a.w,4);Qnd(a.w,5);a.B=Lnd(a,7);Qnd(a.B,1);Pnd(a.B);Pnd(a.B);Pnd(a.B);a.Q=Lnd(a,8);Qnd(a.Q,0);Pnd(a.Q);a.R=Lnd(a,9);Knd(a.R,1);a.S=Lnd(a,10);Pnd(a.S);Pnd(a.S);Pnd(a.S);Pnd(a.S);Pnd(a.S);Pnd(a.S);Pnd(a.S);Pnd(a.S);Pnd(a.S);Pnd(a.S);Pnd(a.S);Pnd(a.S);Pnd(a.S);Pnd(a.S);Pnd(a.S);a.T=Lnd(a,11);Qnd(a.T,10);Qnd(a.T,11);Qnd(a.T,12);Qnd(a.T,13);Qnd(a.T,14);Pnd(a.T);Pnd(a.T);a.U=Lnd(a,12);Knd(a.U,2);Knd(a.U,3);Qnd(a.U,4);Qnd(a.U,5);Qnd(a.U,6);Qnd(a.U,7);Pnd(a.U);a.V=Lnd(a,13);Qnd(a.V,10);a.W=Lnd(a,14);Knd(a.W,18);Knd(a.W,19);Knd(a.W,20);Qnd(a.W,21);Qnd(a.W,22);Qnd(a.W,23);a.bb=Lnd(a,15);Knd(a.bb,10);Knd(a.bb,11);Knd(a.bb,12);Knd(a.bb,13);Knd(a.bb,14);Knd(a.bb,15);Knd(a.bb,16);Qnd(a.bb,17);Pnd(a.bb);Pnd(a.bb);a.eb=Lnd(a,16);Knd(a.eb,2);Knd(a.eb,3);Knd(a.eb,4);Knd(a.eb,5);Knd(a.eb,6);Knd(a.eb,7);Qnd(a.eb,8);Qnd(a.eb,9);a.ab=Lnd(a,17);Knd(a.ab,0);Knd(a.ab,1);a.H=Lnd(a,18);Qnd(a.H,0);Qnd(a.H,1);Qnd(a.H,2);Qnd(a.H,3);Qnd(a.H,4);Qnd(a.H,5);Pnd(a.H);a.db=Lnd(a,19);Qnd(a.db,2);a.c=Mnd(a,20);a.d=Mnd(a,21);a.e=Mnd(a,22);a.f=Mnd(a,23);a.i=Mnd(a,24);a.g=Mnd(a,25);a.j=Mnd(a,26);a.k=Mnd(a,27);a.n=Mnd(a,28);a.r=Mnd(a,29);a.s=Mnd(a,30);a.t=Mnd(a,31);a.u=Mnd(a,32);a.fb=Mnd(a,33);a.A=Mnd(a,34);a.C=Mnd(a,35);a.D=Mnd(a,36);a.F=Mnd(a,37);a.G=Mnd(a,38);a.I=Mnd(a,39);a.J=Mnd(a,40);a.L=Mnd(a,41);a.M=Mnd(a,42);a.N=Mnd(a,43);a.O=Mnd(a,44);a.P=Mnd(a,45);a.X=Mnd(a,46);a.Y=Mnd(a,47);a.Z=Mnd(a,48);a.$=Mnd(a,49);a._=Mnd(a,50);a.cb=Mnd(a,51);a.K=Mnd(a,52)} +function Y9c(){Y9c=ccb;var a,b;o8c=new Lsd(sse);F9c=new Lsd(tse);q8c=(F7c(),z7c);p8c=new Nsd($pe,q8c);new Tfd;r8c=new Nsd(_le,null);s8c=new Lsd(use);x8c=(i8c(),qqb(h8c,OC(GC(r1,1),Kie,291,0,[d8c])));w8c=new Nsd(lqe,x8c);y8c=new Nsd(Zpe,(Bcb(),false));A8c=(ead(),cad);z8c=new Nsd(cqe,A8c);F8c=(Aad(),zad);E8c=new Nsd(ype,F8c);I8c=new Nsd(Jre,false);K8c=(hbd(),fbd);J8c=new Nsd(tpe,K8c);g9c=new q0b(12);f9c=new Nsd(ame,g9c);O8c=new Nsd(Ame,false);P8c=new Nsd(xqe,false);e9c=new Nsd(Dme,false);u9c=(dcd(),ccd);t9c=new Nsd(Bme,u9c);C9c=new Lsd(uqe);D9c=new Lsd(vme);E9c=new Lsd(yme);H9c=new Lsd(zme);R8c=new s7c;Q8c=new Nsd(mqe,R8c);v8c=new Nsd(pqe,false);L8c=new Nsd(qqe,false);new Lsd(vse);T8c=new H_b;S8c=new Nsd(vqe,T8c);d9c=new Nsd(Xpe,false);new Tfd;G9c=new Nsd(wse,1);new Nsd(xse,true);meb(0);new Nsd(yse,meb(100));new Nsd(zse,false);meb(0);new Nsd(Ase,meb(4000));meb(0);new Nsd(Bse,meb(400));new Nsd(Cse,false);new Nsd(Dse,false);new Nsd(Ese,true);new Nsd(Fse,false);u8c=(Ded(),Ced);t8c=new Nsd(rse,u8c);I9c=new Nsd(Lpe,10);J9c=new Nsd(Mpe,10);K9c=new Nsd(Zle,20);L9c=new Nsd(Npe,10);M9c=new Nsd(xme,2);N9c=new Nsd(Ope,10);P9c=new Nsd(Ppe,0);Q9c=new Nsd(Spe,5);R9c=new Nsd(Qpe,1);S9c=new Nsd(Rpe,1);T9c=new Nsd(wme,20);U9c=new Nsd(Tpe,10);X9c=new Nsd(Upe,10);O9c=new Lsd(Vpe);W9c=new I_b;V9c=new Nsd(wqe,W9c);j9c=new Lsd(tqe);i9c=false;h9c=new Nsd(sqe,i9c);V8c=new q0b(5);U8c=new Nsd(dqe,V8c);X8c=(Hbd(),b=BD(gdb(B1),9),new xqb(b,BD(_Bb(b,b.length),9),0));W8c=new Nsd(Gme,X8c);m9c=(Tbd(),Qbd);l9c=new Nsd(gqe,m9c);o9c=new Lsd(hqe);p9c=new Lsd(iqe);q9c=new Lsd(jqe);n9c=new Lsd(kqe);Z8c=(a=BD(gdb(I1),9),new xqb(a,BD(_Bb(a,a.length),9),0));Y8c=new Nsd(Fme,Z8c);c9c=pqb((Idd(),Bdd));b9c=new Nsd(Eme,c9c);a9c=new f7c(0,0);_8c=new Nsd(Tme,a9c);$8c=new Nsd(bqe,false);D8c=(qad(),nad);C8c=new Nsd(nqe,D8c);B8c=new Nsd(Cme,false);new Lsd(Gse);meb(1);new Nsd(Hse,null);r9c=new Lsd(rqe);v9c=new Lsd(oqe);B9c=(Ucd(),Scd);A9c=new Nsd(Ype,B9c);s9c=new Lsd(Wpe);y9c=(rcd(),pqb(pcd));x9c=new Nsd(Hme,y9c);w9c=new Nsd(eqe,false);z9c=new Nsd(fqe,true);M8c=new Nsd(_pe,false);N8c=new Nsd(aqe,false);G8c=new Nsd($le,1);H8c=(Mad(),Kad);new Nsd(Ise,H8c);k9c=true} +function wtc(){wtc=ccb;var a,b;$sc=new Lsd(Ime);xsc=new Lsd('coordinateOrigin');itc=new Lsd('processors');wsc=new Msd('compoundNode',(Bcb(),false));Nsc=new Msd('insideConnections',false);_sc=new Lsd('originalBendpoints');atc=new Lsd('originalDummyNodePosition');btc=new Lsd('originalLabelEdge');ktc=new Lsd('representedLabels');Csc=new Lsd('endLabels');Dsc=new Lsd('endLabel.origin');Ssc=new Msd('labelSide',(rbd(),qbd));Ysc=new Msd('maxEdgeThickness',0);ltc=new Msd('reversed',false);jtc=new Lsd(Jme);Vsc=new Msd('longEdgeSource',null);Wsc=new Msd('longEdgeTarget',null);Usc=new Msd('longEdgeHasLabelDummies',false);Tsc=new Msd('longEdgeBeforeLabelDummy',false);Bsc=new Msd('edgeConstraint',(Gqc(),Eqc));Psc=new Lsd('inLayerLayoutUnit');Osc=new Msd('inLayerConstraint',(esc(),csc));Qsc=new Msd('inLayerSuccessorConstraint',new Rkb);Rsc=new Msd('inLayerSuccessorConstraintBetweenNonDummies',false);gtc=new Lsd('portDummy');ysc=new Msd('crossingHint',meb(0));Ksc=new Msd('graphProperties',(b=BD(gdb(PW),9),new xqb(b,BD(_Bb(b,b.length),9),0)));Hsc=new Msd('externalPortSide',(Ucd(),Scd));Isc=new Msd('externalPortSize',new d7c);Fsc=new Lsd('externalPortReplacedDummies');Gsc=new Lsd('externalPortReplacedDummy');Esc=new Msd('externalPortConnections',(a=BD(gdb(F1),9),new xqb(a,BD(_Bb(a,a.length),9),0)));htc=new Msd(tle,0);ssc=new Lsd('barycenterAssociates');vtc=new Lsd('TopSideComments');tsc=new Lsd('BottomSideComments');vsc=new Lsd('CommentConnectionPort');Msc=new Msd('inputCollect',false);etc=new Msd('outputCollect',false);Asc=new Msd('cyclic',false);zsc=new Lsd('crossHierarchyMap');utc=new Lsd('targetOffset');new Msd('splineLabelSize',new d7c);otc=new Lsd('spacings');ftc=new Msd('partitionConstraint',false);usc=new Lsd('breakingPoint.info');stc=new Lsd('splines.survivingEdge');rtc=new Lsd('splines.route.start');ptc=new Lsd('splines.edgeChain');dtc=new Lsd('originalPortConstraints');ntc=new Lsd('selfLoopHolder');qtc=new Lsd('splines.nsPortY');Zsc=new Lsd('modelOrder');Xsc=new Lsd('longEdgeTargetNode');Jsc=new Msd(Xne,false);mtc=new Msd(Xne,false);Lsc=new Lsd('layerConstraints.hiddenNodes');ctc=new Lsd('layerConstraints.opposidePort');ttc=new Lsd('targetNode.modelOrder')} +function jwc(){jwc=ccb;puc=(xqc(),vqc);ouc=new Nsd(Yne,puc);Guc=new Nsd(Zne,(Bcb(),false));Muc=(msc(),ksc);Luc=new Nsd($ne,Muc);cvc=new Nsd(_ne,false);dvc=new Nsd(aoe,true);Itc=new Nsd(boe,false);xvc=(BAc(),zAc);wvc=new Nsd(coe,xvc);meb(1);Fvc=new Nsd(doe,meb(7));Gvc=new Nsd(eoe,false);Huc=new Nsd(foe,false);nuc=(mqc(),iqc);muc=new Nsd(goe,nuc);bvc=(lzc(),jzc);avc=new Nsd(hoe,bvc);Tuc=(Ctc(),Btc);Suc=new Nsd(ioe,Tuc);meb(-1);Ruc=new Nsd(joe,meb(-1));meb(-1);Uuc=new Nsd(koe,meb(-1));meb(-1);Vuc=new Nsd(loe,meb(4));meb(-1);Xuc=new Nsd(moe,meb(2));_uc=(kAc(),iAc);$uc=new Nsd(noe,_uc);meb(0);Zuc=new Nsd(ooe,meb(0));Puc=new Nsd(poe,meb(Ohe));luc=(Rpc(),Ppc);kuc=new Nsd(qoe,luc);Xtc=new Nsd(roe,false);euc=new Nsd(soe,0.1);iuc=new Nsd(toe,false);meb(-1);guc=new Nsd(uoe,meb(-1));meb(-1);huc=new Nsd(voe,meb(-1));meb(0);Ytc=new Nsd(woe,meb(40));cuc=(Xrc(),Wrc);buc=new Nsd(xoe,cuc);$tc=Urc;Ztc=new Nsd(yoe,$tc);vvc=(Vzc(),Qzc);uvc=new Nsd(zoe,vvc);kvc=new Lsd(Aoe);fvc=(_qc(),Zqc);evc=new Nsd(Boe,fvc);ivc=(lrc(),irc);hvc=new Nsd(Coe,ivc);new Tfd;nvc=new Nsd(Doe,0.3);pvc=new Lsd(Eoe);rvc=(Izc(),Gzc);qvc=new Nsd(Foe,rvc);xuc=(TAc(),RAc);wuc=new Nsd(Goe,xuc);zuc=(_Ac(),$Ac);yuc=new Nsd(Hoe,zuc);Buc=(tBc(),sBc);Auc=new Nsd(Ioe,Buc);Duc=new Nsd(Joe,0.2);uuc=new Nsd(Koe,2);Bvc=new Nsd(Loe,null);Dvc=new Nsd(Moe,10);Cvc=new Nsd(Noe,10);Evc=new Nsd(Ooe,20);meb(0);yvc=new Nsd(Poe,meb(0));meb(0);zvc=new Nsd(Qoe,meb(0));meb(0);Avc=new Nsd(Roe,meb(0));Jtc=new Nsd(Soe,false);Ntc=(yrc(),wrc);Mtc=new Nsd(Toe,Ntc);Ltc=(Ipc(),Hpc);Ktc=new Nsd(Uoe,Ltc);Juc=new Nsd(Voe,false);meb(0);Iuc=new Nsd(Woe,meb(16));meb(0);Kuc=new Nsd(Xoe,meb(5));bwc=(LBc(),JBc);awc=new Nsd(Yoe,bwc);Hvc=new Nsd(Zoe,10);Kvc=new Nsd($oe,1);Tvc=(bqc(),aqc);Svc=new Nsd(_oe,Tvc);Nvc=new Lsd(ape);Qvc=meb(1);meb(0);Pvc=new Nsd(bpe,Qvc);gwc=(CBc(),zBc);fwc=new Nsd(cpe,gwc);cwc=new Lsd(dpe);Yvc=new Nsd(epe,true);Wvc=new Nsd(fpe,2);$vc=new Nsd(gpe,true);tuc=(Sqc(),Qqc);suc=new Nsd(hpe,tuc);ruc=(Apc(),wpc);quc=new Nsd(ipe,ruc);Wtc=(tAc(),rAc);Vtc=new Nsd(jpe,Wtc);Utc=new Nsd(kpe,false);Ptc=(RXb(),QXb);Otc=new Nsd(lpe,Ptc);Ttc=(xzc(),uzc);Stc=new Nsd(mpe,Ttc);Qtc=new Nsd(npe,0);Rtc=new Nsd(ope,0);Ouc=kqc;Nuc=Opc;Wuc=izc;Yuc=izc;Quc=fzc;fuc=(hbd(),ebd);juc=Ppc;duc=Ppc;_tc=Ppc;auc=ebd;lvc=Tzc;mvc=Qzc;gvc=Qzc;jvc=Qzc;ovc=Szc;tvc=Tzc;svc=Tzc;Cuc=(Aad(),yad);Euc=yad;Fuc=sBc;vuc=xad;Ivc=KBc;Jvc=IBc;Lvc=KBc;Mvc=IBc;Uvc=KBc;Vvc=IBc;Ovc=_pc;Rvc=aqc;hwc=KBc;iwc=IBc;dwc=KBc;ewc=IBc;Zvc=IBc;Xvc=IBc;_vc=IBc} +function S8b(){S8b=ccb;Y7b=new T8b('DIRECTION_PREPROCESSOR',0);V7b=new T8b('COMMENT_PREPROCESSOR',1);Z7b=new T8b('EDGE_AND_LAYER_CONSTRAINT_EDGE_REVERSER',2);n8b=new T8b('INTERACTIVE_EXTERNAL_PORT_POSITIONER',3);G8b=new T8b('PARTITION_PREPROCESSOR',4);r8b=new T8b('LABEL_DUMMY_INSERTER',5);M8b=new T8b('SELF_LOOP_PREPROCESSOR',6);w8b=new T8b('LAYER_CONSTRAINT_PREPROCESSOR',7);E8b=new T8b('PARTITION_MIDPROCESSOR',8);i8b=new T8b('HIGH_DEGREE_NODE_LAYER_PROCESSOR',9);A8b=new T8b('NODE_PROMOTION',10);v8b=new T8b('LAYER_CONSTRAINT_POSTPROCESSOR',11);F8b=new T8b('PARTITION_POSTPROCESSOR',12);e8b=new T8b('HIERARCHICAL_PORT_CONSTRAINT_PROCESSOR',13);O8b=new T8b('SEMI_INTERACTIVE_CROSSMIN_PROCESSOR',14);P7b=new T8b('BREAKING_POINT_INSERTER',15);z8b=new T8b('LONG_EDGE_SPLITTER',16);I8b=new T8b('PORT_SIDE_PROCESSOR',17);o8b=new T8b('INVERTED_PORT_PROCESSOR',18);H8b=new T8b('PORT_LIST_SORTER',19);Q8b=new T8b('SORT_BY_INPUT_ORDER_OF_MODEL',20);C8b=new T8b('NORTH_SOUTH_PORT_PREPROCESSOR',21);Q7b=new T8b('BREAKING_POINT_PROCESSOR',22);D8b=new T8b(Bne,23);R8b=new T8b(Cne,24);K8b=new T8b('SELF_LOOP_PORT_RESTORER',25);P8b=new T8b('SINGLE_EDGE_GRAPH_WRAPPER',26);p8b=new T8b('IN_LAYER_CONSTRAINT_PROCESSOR',27);b8b=new T8b('END_NODE_PORT_LABEL_MANAGEMENT_PROCESSOR',28);q8b=new T8b('LABEL_AND_NODE_SIZE_PROCESSOR',29);m8b=new T8b('INNERMOST_NODE_MARGIN_CALCULATOR',30);N8b=new T8b('SELF_LOOP_ROUTER',31);T7b=new T8b('COMMENT_NODE_MARGIN_CALCULATOR',32);_7b=new T8b('END_LABEL_PREPROCESSOR',33);t8b=new T8b('LABEL_DUMMY_SWITCHER',34);S7b=new T8b('CENTER_LABEL_MANAGEMENT_PROCESSOR',35);u8b=new T8b('LABEL_SIDE_SELECTOR',36);k8b=new T8b('HYPEREDGE_DUMMY_MERGER',37);f8b=new T8b('HIERARCHICAL_PORT_DUMMY_SIZE_PROCESSOR',38);x8b=new T8b('LAYER_SIZE_AND_GRAPH_HEIGHT_CALCULATOR',39);h8b=new T8b('HIERARCHICAL_PORT_POSITION_PROCESSOR',40);W7b=new T8b('CONSTRAINTS_POSTPROCESSOR',41);U7b=new T8b('COMMENT_POSTPROCESSOR',42);l8b=new T8b('HYPERNODE_PROCESSOR',43);g8b=new T8b('HIERARCHICAL_PORT_ORTHOGONAL_EDGE_ROUTER',44);y8b=new T8b('LONG_EDGE_JOINER',45);L8b=new T8b('SELF_LOOP_POSTPROCESSOR',46);R7b=new T8b('BREAKING_POINT_REMOVER',47);B8b=new T8b('NORTH_SOUTH_PORT_POSTPROCESSOR',48);j8b=new T8b('HORIZONTAL_COMPACTOR',49);s8b=new T8b('LABEL_DUMMY_REMOVER',50);c8b=new T8b('FINAL_SPLINE_BENDPOINTS_CALCULATOR',51);a8b=new T8b('END_LABEL_SORTER',52);J8b=new T8b('REVERSED_EDGE_RESTORER',53);$7b=new T8b('END_LABEL_POSTPROCESSOR',54);d8b=new T8b('HIERARCHICAL_NODE_RESIZER',55);X7b=new T8b('DIRECTION_POSTPROCESSOR',56)} +function KIc(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,$,ab,bb,cb,db,eb,fb,gb,hb,ib,jb,kb,lb;cb=0;for(H=b,K=0,N=H.length;K0&&(a.a[U.p]=cb++)}}hb=0;for(I=c,L=0,O=I.length;L0){U=(sCb(Y.b>0),BD(Y.a.Xb(Y.c=--Y.b),11));X=0;for(h=new olb(U.e);h.a0){if(U.j==(Ucd(),Acd)){a.a[U.p]=hb;++hb}else{a.a[U.p]=hb+P+R;++R}}}hb+=R}W=new Lqb;o=new zsb;for(G=b,J=0,M=G.length;Jj.b&&(j.b=Z)}else if(U.i.c==bb){Zj.c&&(j.c=Z)}}}Klb(p,0,p.length,null);gb=KC(WD,oje,25,p.length,15,1);d=KC(WD,oje,25,hb+1,15,1);for(r=0;r0){A%2>0&&(e+=kb[A+1]);A=(A-1)/2|0;++kb[A]}}C=KC(nY,Uhe,362,p.length*2,0,1);for(u=0;u'?":dfb(wue,a)?"'(?<' or '(? toIndex: ',zke=', toIndex: ',Ake='Index: ',Bke=', Size: ',Cke='org.eclipse.elk.alg.common',Dke={62:1},Eke='org.eclipse.elk.alg.common.compaction',Fke='Scanline/EventHandler',Gke='org.eclipse.elk.alg.common.compaction.oned',Hke='CNode belongs to another CGroup.',Ike='ISpacingsHandler/1',Jke='The ',Kke=' instance has been finished already.',Lke='The direction ',Mke=' is not supported by the CGraph instance.',Nke='OneDimensionalCompactor',Oke='OneDimensionalCompactor/lambda$0$Type',Pke='Quadruplet',Qke='ScanlineConstraintCalculator',Rke='ScanlineConstraintCalculator/ConstraintsScanlineHandler',Ske='ScanlineConstraintCalculator/ConstraintsScanlineHandler/lambda$0$Type',Tke='ScanlineConstraintCalculator/Timestamp',Uke='ScanlineConstraintCalculator/lambda$0$Type',Vke={169:1,45:1},Wke='org.eclipse.elk.alg.common.compaction.options',Xke='org.eclipse.elk.core.data',Yke='org.eclipse.elk.polyomino.traversalStrategy',Zke='org.eclipse.elk.polyomino.lowLevelSort',$ke='org.eclipse.elk.polyomino.highLevelSort',_ke='org.eclipse.elk.polyomino.fill',ale={130:1},ble='polyomino',cle='org.eclipse.elk.alg.common.networksimplex',dle={177:1,3:1,4:1},ele='org.eclipse.elk.alg.common.nodespacing',fle='org.eclipse.elk.alg.common.nodespacing.cellsystem',gle='CENTER',hle={212:1,326:1},ile={3:1,4:1,5:1,595:1},jle='LEFT',kle='RIGHT',lle='Vertical alignment cannot be null',mle='BOTTOM',nle='org.eclipse.elk.alg.common.nodespacing.internal',ole='UNDEFINED',ple=0.01,qle='org.eclipse.elk.alg.common.nodespacing.internal.algorithm',rle='LabelPlacer/lambda$0$Type',sle='LabelPlacer/lambda$1$Type',tle='portRatioOrPosition',ule='org.eclipse.elk.alg.common.overlaps',vle='DOWN',wle='org.eclipse.elk.alg.common.polyomino',xle='NORTH',yle='EAST',zle='SOUTH',Ale='WEST',Ble='org.eclipse.elk.alg.common.polyomino.structures',Cle='Direction',Dle='Grid is only of size ',Ele='. Requested point (',Fle=') is out of bounds.',Gle=' Given center based coordinates were (',Hle='org.eclipse.elk.graph.properties',Ile='IPropertyHolder',Jle={3:1,94:1,134:1},Kle='org.eclipse.elk.alg.common.spore',Lle='org.eclipse.elk.alg.common.utils',Mle={209:1},Nle='org.eclipse.elk.core',Ole='Connected Components Compaction',Ple='org.eclipse.elk.alg.disco',Qle='org.eclipse.elk.alg.disco.graph',Rle='org.eclipse.elk.alg.disco.options',Sle='CompactionStrategy',Tle='org.eclipse.elk.disco.componentCompaction.strategy',Ule='org.eclipse.elk.disco.componentCompaction.componentLayoutAlgorithm',Vle='org.eclipse.elk.disco.debug.discoGraph',Wle='org.eclipse.elk.disco.debug.discoPolys',Xle='componentCompaction',Yle='org.eclipse.elk.disco',Zle='org.eclipse.elk.spacing.componentComponent',$le='org.eclipse.elk.edge.thickness',_le='org.eclipse.elk.aspectRatio',ame='org.eclipse.elk.padding',bme='org.eclipse.elk.alg.disco.transform',cme=1.5707963267948966,dme=1.7976931348623157E308,eme={3:1,4:1,5:1,192:1},fme={3:1,6:1,4:1,5:1,106:1,120:1},gme='org.eclipse.elk.alg.force',hme='ComponentsProcessor',ime='ComponentsProcessor/1',jme='org.eclipse.elk.alg.force.graph',kme='Component Layout',lme='org.eclipse.elk.alg.force.model',mme='org.eclipse.elk.force.model',nme='org.eclipse.elk.force.iterations',ome='org.eclipse.elk.force.repulsivePower',pme='org.eclipse.elk.force.temperature',qme=0.001,rme='org.eclipse.elk.force.repulsion',sme='org.eclipse.elk.alg.force.options',tme=1.600000023841858,ume='org.eclipse.elk.force',vme='org.eclipse.elk.priority',wme='org.eclipse.elk.spacing.nodeNode',xme='org.eclipse.elk.spacing.edgeLabel',yme='org.eclipse.elk.randomSeed',zme='org.eclipse.elk.separateConnectedComponents',Ame='org.eclipse.elk.interactive',Bme='org.eclipse.elk.portConstraints',Cme='org.eclipse.elk.edgeLabels.inline',Dme='org.eclipse.elk.omitNodeMicroLayout',Eme='org.eclipse.elk.nodeSize.options',Fme='org.eclipse.elk.nodeSize.constraints',Gme='org.eclipse.elk.nodeLabels.placement',Hme='org.eclipse.elk.portLabels.placement',Ime='origin',Jme='random',Kme='boundingBox.upLeft',Lme='boundingBox.lowRight',Mme='org.eclipse.elk.stress.fixed',Nme='org.eclipse.elk.stress.desiredEdgeLength',Ome='org.eclipse.elk.stress.dimension',Pme='org.eclipse.elk.stress.epsilon',Qme='org.eclipse.elk.stress.iterationLimit',Rme='org.eclipse.elk.stress',Sme='ELK Stress',Tme='org.eclipse.elk.nodeSize.minimum',Ume='org.eclipse.elk.alg.force.stress',Vme='Layered layout',Wme='org.eclipse.elk.alg.layered',Xme='org.eclipse.elk.alg.layered.compaction.components',Yme='org.eclipse.elk.alg.layered.compaction.oned',Zme='org.eclipse.elk.alg.layered.compaction.oned.algs',$me='org.eclipse.elk.alg.layered.compaction.recthull',_me='org.eclipse.elk.alg.layered.components',ane='NONE',bne={3:1,6:1,4:1,9:1,5:1,122:1},cne={3:1,6:1,4:1,5:1,141:1,106:1,120:1},dne='org.eclipse.elk.alg.layered.compound',ene={51:1},fne='org.eclipse.elk.alg.layered.graph',gne=' -> ',hne='Not supported by LGraph',ine='Port side is undefined',jne={3:1,6:1,4:1,5:1,474:1,141:1,106:1,120:1},kne={3:1,6:1,4:1,5:1,141:1,193:1,203:1,106:1,120:1},lne={3:1,6:1,4:1,5:1,141:1,1943:1,203:1,106:1,120:1},mne='([{"\' \t\r\n',nne=')]}"\' \t\r\n',one='The given string contains parts that cannot be parsed as numbers.',pne='org.eclipse.elk.core.math',qne={3:1,4:1,142:1,207:1,414:1},rne={3:1,4:1,116:1,207:1,414:1},sne='org.eclipse.elk.layered',tne='org.eclipse.elk.alg.layered.graph.transform',une='ElkGraphImporter',vne='ElkGraphImporter/lambda$0$Type',wne='ElkGraphImporter/lambda$1$Type',xne='ElkGraphImporter/lambda$2$Type',yne='ElkGraphImporter/lambda$4$Type',zne='Node margin calculation',Ane='org.eclipse.elk.alg.layered.intermediate',Bne='ONE_SIDED_GREEDY_SWITCH',Cne='TWO_SIDED_GREEDY_SWITCH',Dne='No implementation is available for the layout processor ',Ene='IntermediateProcessorStrategy',Fne="Node '",Gne='FIRST_SEPARATE',Hne='LAST_SEPARATE',Ine='Odd port side processing',Jne='org.eclipse.elk.alg.layered.intermediate.compaction',Kne='org.eclipse.elk.alg.layered.intermediate.greedyswitch',Lne='org.eclipse.elk.alg.layered.p3order.counting',Mne={225:1},Nne='org.eclipse.elk.alg.layered.intermediate.loops',One='org.eclipse.elk.alg.layered.intermediate.loops.ordering',Pne='org.eclipse.elk.alg.layered.intermediate.loops.routing',Qne='org.eclipse.elk.alg.layered.intermediate.preserveorder',Rne='org.eclipse.elk.alg.layered.intermediate.wrapping',Sne='org.eclipse.elk.alg.layered.options',Tne='INTERACTIVE',Une='DEPTH_FIRST',Vne='EDGE_LENGTH',Wne='SELF_LOOPS',Xne='firstTryWithInitialOrder',Yne='org.eclipse.elk.layered.directionCongruency',Zne='org.eclipse.elk.layered.feedbackEdges',$ne='org.eclipse.elk.layered.interactiveReferencePoint',_ne='org.eclipse.elk.layered.mergeEdges',aoe='org.eclipse.elk.layered.mergeHierarchyEdges',boe='org.eclipse.elk.layered.allowNonFlowPortsToSwitchSides',coe='org.eclipse.elk.layered.portSortingStrategy',doe='org.eclipse.elk.layered.thoroughness',eoe='org.eclipse.elk.layered.unnecessaryBendpoints',foe='org.eclipse.elk.layered.generatePositionAndLayerIds',goe='org.eclipse.elk.layered.cycleBreaking.strategy',hoe='org.eclipse.elk.layered.layering.strategy',ioe='org.eclipse.elk.layered.layering.layerConstraint',joe='org.eclipse.elk.layered.layering.layerChoiceConstraint',koe='org.eclipse.elk.layered.layering.layerId',loe='org.eclipse.elk.layered.layering.minWidth.upperBoundOnWidth',moe='org.eclipse.elk.layered.layering.minWidth.upperLayerEstimationScalingFactor',noe='org.eclipse.elk.layered.layering.nodePromotion.strategy',ooe='org.eclipse.elk.layered.layering.nodePromotion.maxIterations',poe='org.eclipse.elk.layered.layering.coffmanGraham.layerBound',qoe='org.eclipse.elk.layered.crossingMinimization.strategy',roe='org.eclipse.elk.layered.crossingMinimization.forceNodeModelOrder',soe='org.eclipse.elk.layered.crossingMinimization.hierarchicalSweepiness',toe='org.eclipse.elk.layered.crossingMinimization.semiInteractive',uoe='org.eclipse.elk.layered.crossingMinimization.positionChoiceConstraint',voe='org.eclipse.elk.layered.crossingMinimization.positionId',woe='org.eclipse.elk.layered.crossingMinimization.greedySwitch.activationThreshold',xoe='org.eclipse.elk.layered.crossingMinimization.greedySwitch.type',yoe='org.eclipse.elk.layered.crossingMinimization.greedySwitchHierarchical.type',zoe='org.eclipse.elk.layered.nodePlacement.strategy',Aoe='org.eclipse.elk.layered.nodePlacement.favorStraightEdges',Boe='org.eclipse.elk.layered.nodePlacement.bk.edgeStraightening',Coe='org.eclipse.elk.layered.nodePlacement.bk.fixedAlignment',Doe='org.eclipse.elk.layered.nodePlacement.linearSegments.deflectionDampening',Eoe='org.eclipse.elk.layered.nodePlacement.networkSimplex.nodeFlexibility',Foe='org.eclipse.elk.layered.nodePlacement.networkSimplex.nodeFlexibility.default',Goe='org.eclipse.elk.layered.edgeRouting.selfLoopDistribution',Hoe='org.eclipse.elk.layered.edgeRouting.selfLoopOrdering',Ioe='org.eclipse.elk.layered.edgeRouting.splines.mode',Joe='org.eclipse.elk.layered.edgeRouting.splines.sloppy.layerSpacingFactor',Koe='org.eclipse.elk.layered.edgeRouting.polyline.slopedEdgeZoneWidth',Loe='org.eclipse.elk.layered.spacing.baseValue',Moe='org.eclipse.elk.layered.spacing.edgeNodeBetweenLayers',Noe='org.eclipse.elk.layered.spacing.edgeEdgeBetweenLayers',Ooe='org.eclipse.elk.layered.spacing.nodeNodeBetweenLayers',Poe='org.eclipse.elk.layered.priority.direction',Qoe='org.eclipse.elk.layered.priority.shortness',Roe='org.eclipse.elk.layered.priority.straightness',Soe='org.eclipse.elk.layered.compaction.connectedComponents',Toe='org.eclipse.elk.layered.compaction.postCompaction.strategy',Uoe='org.eclipse.elk.layered.compaction.postCompaction.constraints',Voe='org.eclipse.elk.layered.highDegreeNodes.treatment',Woe='org.eclipse.elk.layered.highDegreeNodes.threshold',Xoe='org.eclipse.elk.layered.highDegreeNodes.treeHeight',Yoe='org.eclipse.elk.layered.wrapping.strategy',Zoe='org.eclipse.elk.layered.wrapping.additionalEdgeSpacing',$oe='org.eclipse.elk.layered.wrapping.correctionFactor',_oe='org.eclipse.elk.layered.wrapping.cutting.strategy',ape='org.eclipse.elk.layered.wrapping.cutting.cuts',bpe='org.eclipse.elk.layered.wrapping.cutting.msd.freedom',cpe='org.eclipse.elk.layered.wrapping.validify.strategy',dpe='org.eclipse.elk.layered.wrapping.validify.forbiddenIndices',epe='org.eclipse.elk.layered.wrapping.multiEdge.improveCuts',fpe='org.eclipse.elk.layered.wrapping.multiEdge.distancePenalty',gpe='org.eclipse.elk.layered.wrapping.multiEdge.improveWrappedEdges',hpe='org.eclipse.elk.layered.edgeLabels.sideSelection',ipe='org.eclipse.elk.layered.edgeLabels.centerLabelPlacementStrategy',jpe='org.eclipse.elk.layered.considerModelOrder.strategy',kpe='org.eclipse.elk.layered.considerModelOrder.noModelOrder',lpe='org.eclipse.elk.layered.considerModelOrder.components',mpe='org.eclipse.elk.layered.considerModelOrder.longEdgeStrategy',npe='org.eclipse.elk.layered.considerModelOrder.crossingCounterNodeInfluence',ope='org.eclipse.elk.layered.considerModelOrder.crossingCounterPortInfluence',ppe='layering',qpe='layering.minWidth',rpe='layering.nodePromotion',spe='crossingMinimization',tpe='org.eclipse.elk.hierarchyHandling',upe='crossingMinimization.greedySwitch',vpe='nodePlacement',wpe='nodePlacement.bk',xpe='edgeRouting',ype='org.eclipse.elk.edgeRouting',zpe='spacing',Ape='priority',Bpe='compaction',Cpe='compaction.postCompaction',Dpe='Specifies whether and how post-process compaction is applied.',Epe='highDegreeNodes',Fpe='wrapping',Gpe='wrapping.cutting',Hpe='wrapping.validify',Ipe='wrapping.multiEdge',Jpe='edgeLabels',Kpe='considerModelOrder',Lpe='org.eclipse.elk.spacing.commentComment',Mpe='org.eclipse.elk.spacing.commentNode',Npe='org.eclipse.elk.spacing.edgeEdge',Ope='org.eclipse.elk.spacing.edgeNode',Ppe='org.eclipse.elk.spacing.labelLabel',Qpe='org.eclipse.elk.spacing.labelPortHorizontal',Rpe='org.eclipse.elk.spacing.labelPortVertical',Spe='org.eclipse.elk.spacing.labelNode',Tpe='org.eclipse.elk.spacing.nodeSelfLoop',Upe='org.eclipse.elk.spacing.portPort',Vpe='org.eclipse.elk.spacing.individual',Wpe='org.eclipse.elk.port.borderOffset',Xpe='org.eclipse.elk.noLayout',Ype='org.eclipse.elk.port.side',Zpe='org.eclipse.elk.debugMode',$pe='org.eclipse.elk.alignment',_pe='org.eclipse.elk.insideSelfLoops.activate',aqe='org.eclipse.elk.insideSelfLoops.yo',bqe='org.eclipse.elk.nodeSize.fixedGraphSize',cqe='org.eclipse.elk.direction',dqe='org.eclipse.elk.nodeLabels.padding',eqe='org.eclipse.elk.portLabels.nextToPortIfPossible',fqe='org.eclipse.elk.portLabels.treatAsGroup',gqe='org.eclipse.elk.portAlignment.default',hqe='org.eclipse.elk.portAlignment.north',iqe='org.eclipse.elk.portAlignment.south',jqe='org.eclipse.elk.portAlignment.west',kqe='org.eclipse.elk.portAlignment.east',lqe='org.eclipse.elk.contentAlignment',mqe='org.eclipse.elk.junctionPoints',nqe='org.eclipse.elk.edgeLabels.placement',oqe='org.eclipse.elk.port.index',pqe='org.eclipse.elk.commentBox',qqe='org.eclipse.elk.hypernode',rqe='org.eclipse.elk.port.anchor',sqe='org.eclipse.elk.partitioning.activate',tqe='org.eclipse.elk.partitioning.partition',uqe='org.eclipse.elk.position',vqe='org.eclipse.elk.margins',wqe='org.eclipse.elk.spacing.portsSurrounding',xqe='org.eclipse.elk.interactiveLayout',yqe='org.eclipse.elk.core.util',zqe={3:1,4:1,5:1,593:1},Aqe='NETWORK_SIMPLEX',Bqe={123:1,51:1},Cqe='org.eclipse.elk.alg.layered.p1cycles',Dqe='org.eclipse.elk.alg.layered.p2layers',Eqe={402:1,225:1},Fqe={832:1,3:1,4:1},Gqe='org.eclipse.elk.alg.layered.p3order',Hqe='org.eclipse.elk.alg.layered.p4nodes',Iqe={3:1,4:1,5:1,840:1},Jqe=1.0E-5,Kqe='org.eclipse.elk.alg.layered.p4nodes.bk',Lqe='org.eclipse.elk.alg.layered.p5edges',Mqe='org.eclipse.elk.alg.layered.p5edges.orthogonal',Nqe='org.eclipse.elk.alg.layered.p5edges.orthogonal.direction',Oqe=1.0E-6,Pqe='org.eclipse.elk.alg.layered.p5edges.splines',Qqe=0.09999999999999998,Rqe=1.0E-8,Sqe=4.71238898038469,Tqe=3.141592653589793,Uqe='org.eclipse.elk.alg.mrtree',Vqe='org.eclipse.elk.alg.mrtree.graph',Wqe='org.eclipse.elk.alg.mrtree.intermediate',Xqe='Set neighbors in level',Yqe='DESCENDANTS',Zqe='org.eclipse.elk.mrtree.weighting',$qe='org.eclipse.elk.mrtree.searchOrder',_qe='org.eclipse.elk.alg.mrtree.options',are='org.eclipse.elk.mrtree',bre='org.eclipse.elk.tree',cre='org.eclipse.elk.alg.radial',dre=6.283185307179586,ere=4.9E-324,fre='org.eclipse.elk.alg.radial.intermediate',gre='org.eclipse.elk.alg.radial.intermediate.compaction',hre={3:1,4:1,5:1,106:1},ire='org.eclipse.elk.alg.radial.intermediate.optimization',jre='No implementation is available for the layout option ',kre='org.eclipse.elk.alg.radial.options',lre='org.eclipse.elk.radial.orderId',mre='org.eclipse.elk.radial.radius',nre='org.eclipse.elk.radial.compactor',ore='org.eclipse.elk.radial.compactionStepSize',pre='org.eclipse.elk.radial.sorter',qre='org.eclipse.elk.radial.wedgeCriteria',rre='org.eclipse.elk.radial.optimizationCriteria',sre='org.eclipse.elk.radial',tre='org.eclipse.elk.alg.radial.p1position.wedge',ure='org.eclipse.elk.alg.radial.sorting',vre=5.497787143782138,wre=3.9269908169872414,xre=2.356194490192345,yre='org.eclipse.elk.alg.rectpacking',zre='org.eclipse.elk.alg.rectpacking.firstiteration',Are='org.eclipse.elk.alg.rectpacking.options',Bre='org.eclipse.elk.rectpacking.optimizationGoal',Cre='org.eclipse.elk.rectpacking.lastPlaceShift',Dre='org.eclipse.elk.rectpacking.currentPosition',Ere='org.eclipse.elk.rectpacking.desiredPosition',Fre='org.eclipse.elk.rectpacking.onlyFirstIteration',Gre='org.eclipse.elk.rectpacking.rowCompaction',Hre='org.eclipse.elk.rectpacking.expandToAspectRatio',Ire='org.eclipse.elk.rectpacking.targetWidth',Jre='org.eclipse.elk.expandNodes',Kre='org.eclipse.elk.rectpacking',Lre='org.eclipse.elk.alg.rectpacking.util',Mre='No implementation available for ',Nre='org.eclipse.elk.alg.spore',Ore='org.eclipse.elk.alg.spore.options',Pre='org.eclipse.elk.sporeCompaction',Qre='org.eclipse.elk.underlyingLayoutAlgorithm',Rre='org.eclipse.elk.processingOrder.treeConstruction',Sre='org.eclipse.elk.processingOrder.spanningTreeCostFunction',Tre='org.eclipse.elk.processingOrder.preferredRoot',Ure='org.eclipse.elk.processingOrder.rootSelection',Vre='org.eclipse.elk.structure.structureExtractionStrategy',Wre='org.eclipse.elk.compaction.compactionStrategy',Xre='org.eclipse.elk.compaction.orthogonal',Yre='org.eclipse.elk.overlapRemoval.maxIterations',Zre='org.eclipse.elk.overlapRemoval.runScanline',$re='processingOrder',_re='overlapRemoval',ase='org.eclipse.elk.sporeOverlap',bse='org.eclipse.elk.alg.spore.p1structure',cse='org.eclipse.elk.alg.spore.p2processingorder',dse='org.eclipse.elk.alg.spore.p3execution',ese='Invalid index: ',fse='org.eclipse.elk.core.alg',gse={331:1},hse={288:1},ise='Make sure its type is registered with the ',jse=' utility class.',kse='true',lse='false',mse="Couldn't clone property '",nse=0.05,ose='org.eclipse.elk.core.options',pse=1.2999999523162842,qse='org.eclipse.elk.box',rse='org.eclipse.elk.box.packingMode',sse='org.eclipse.elk.algorithm',tse='org.eclipse.elk.resolvedAlgorithm',use='org.eclipse.elk.bendPoints',vse='org.eclipse.elk.labelManager',wse='org.eclipse.elk.scaleFactor',xse='org.eclipse.elk.animate',yse='org.eclipse.elk.animTimeFactor',zse='org.eclipse.elk.layoutAncestors',Ase='org.eclipse.elk.maxAnimTime',Bse='org.eclipse.elk.minAnimTime',Cse='org.eclipse.elk.progressBar',Dse='org.eclipse.elk.validateGraph',Ese='org.eclipse.elk.validateOptions',Fse='org.eclipse.elk.zoomToFit',Gse='org.eclipse.elk.font.name',Hse='org.eclipse.elk.font.size',Ise='org.eclipse.elk.edge.type',Jse='partitioning',Kse='nodeLabels',Lse='portAlignment',Mse='nodeSize',Nse='port',Ose='portLabels',Pse='insideSelfLoops',Qse='org.eclipse.elk.fixed',Rse='org.eclipse.elk.random',Sse='port must have a parent node to calculate the port side',Tse='The edge needs to have exactly one edge section. Found: ',Use='org.eclipse.elk.core.util.adapters',Vse='org.eclipse.emf.ecore',Wse='org.eclipse.elk.graph',Xse='EMapPropertyHolder',Yse='ElkBendPoint',Zse='ElkGraphElement',$se='ElkConnectableShape',_se='ElkEdge',ate='ElkEdgeSection',bte='EModelElement',cte='ENamedElement',dte='ElkLabel',ete='ElkNode',fte='ElkPort',gte={92:1,90:1},hte='org.eclipse.emf.common.notify.impl',ite="The feature '",jte="' is not a valid changeable feature",kte='Expecting null',lte="' is not a valid feature",mte='The feature ID',nte=' is not a valid feature ID',ote=32768,pte={105:1,92:1,90:1,56:1,49:1,97:1},qte='org.eclipse.emf.ecore.impl',rte='org.eclipse.elk.graph.impl',ste='Recursive containment not allowed for ',tte="The datatype '",ute="' is not a valid classifier",vte="The value '",wte={190:1,3:1,4:1},xte="The class '",yte='http://www.eclipse.org/elk/ElkGraph',zte=1024,Ate='property',Bte='value',Cte='source',Dte='properties',Ete='identifier',Fte='height',Gte='width',Hte='parent',Ite='text',Jte='children',Kte='hierarchical',Lte='sources',Mte='targets',Nte='sections',Ote='bendPoints',Pte='outgoingShape',Qte='incomingShape',Rte='outgoingSections',Ste='incomingSections',Tte='org.eclipse.emf.common.util',Ute='Severe implementation error in the Json to ElkGraph importer.',Vte='id',Wte='org.eclipse.elk.graph.json',Xte='Unhandled parameter types: ',Yte='startPoint',Zte="An edge must have at least one source and one target (edge id: '",$te="').",_te='Referenced edge section does not exist: ',aue=" (edge id: '",bue='target',cue='sourcePoint',due='targetPoint',eue='group',fue='name',gue='connectableShape cannot be null',hue='edge cannot be null',iue="Passed edge is not 'simple'.",jue='org.eclipse.elk.graph.util',kue="The 'no duplicates' constraint is violated",lue='targetIndex=',mue=', size=',nue='sourceIndex=',oue={3:1,4:1,20:1,28:1,52:1,14:1,15:1,54:1,67:1,63:1,58:1},pue={3:1,4:1,20:1,28:1,52:1,14:1,47:1,15:1,54:1,67:1,63:1,58:1,588:1},que='logging',rue='measureExecutionTime',sue='parser.parse.1',tue='parser.parse.2',uue='parser.next.1',vue='parser.next.2',wue='parser.next.3',xue='parser.next.4',yue='parser.factor.1',zue='parser.factor.2',Aue='parser.factor.3',Bue='parser.factor.4',Cue='parser.factor.5',Due='parser.factor.6',Eue='parser.atom.1',Fue='parser.atom.2',Gue='parser.atom.3',Hue='parser.atom.4',Iue='parser.atom.5',Jue='parser.cc.1',Kue='parser.cc.2',Lue='parser.cc.3',Mue='parser.cc.5',Nue='parser.cc.6',Oue='parser.cc.7',Pue='parser.cc.8',Que='parser.ope.1',Rue='parser.ope.2',Sue='parser.ope.3',Tue='parser.descape.1',Uue='parser.descape.2',Vue='parser.descape.3',Wue='parser.descape.4',Xue='parser.descape.5',Yue='parser.process.1',Zue='parser.quantifier.1',$ue='parser.quantifier.2',_ue='parser.quantifier.3',ave='parser.quantifier.4',bve='parser.quantifier.5',cve='org.eclipse.emf.common.notify',dve={415:1,672:1},eve={3:1,4:1,20:1,28:1,52:1,14:1,15:1,67:1,58:1},fve={366:1,143:1},gve='index=',hve={3:1,4:1,5:1,126:1},ive={3:1,4:1,20:1,28:1,52:1,14:1,15:1,54:1,67:1,58:1},jve={3:1,6:1,4:1,5:1,192:1},kve={3:1,4:1,5:1,165:1,367:1},lve=';/?:@&=+$,',mve='invalid authority: ',nve='EAnnotation',ove='ETypedElement',pve='EStructuralFeature',qve='EAttribute',rve='EClassifier',sve='EEnumLiteral',tve='EGenericType',uve='EOperation',vve='EParameter',wve='EReference',xve='ETypeParameter',yve='org.eclipse.emf.ecore.util',zve={76:1},Ave={3:1,20:1,14:1,15:1,58:1,589:1,76:1,69:1,95:1},Bve='org.eclipse.emf.ecore.util.FeatureMap$Entry',Cve=8192,Dve=2048,Eve='byte',Fve='char',Gve='double',Hve='float',Ive='int',Jve='long',Kve='short',Lve='java.lang.Object',Mve={3:1,4:1,5:1,247:1},Nve={3:1,4:1,5:1,673:1},Ove={3:1,4:1,20:1,28:1,52:1,14:1,15:1,54:1,67:1,63:1,58:1,69:1},Pve={3:1,4:1,20:1,28:1,52:1,14:1,15:1,54:1,67:1,63:1,58:1,76:1,69:1,95:1},Qve='mixed',Rve='http:///org/eclipse/emf/ecore/util/ExtendedMetaData',Sve='kind',Tve={3:1,4:1,5:1,674:1},Uve={3:1,4:1,20:1,28:1,52:1,14:1,15:1,67:1,58:1,76:1,69:1,95:1},Vve={20:1,28:1,52:1,14:1,15:1,58:1,69:1},Wve={47:1,125:1,279:1},Xve={72:1,332:1},Yve="The value of type '",Zve="' must be of type '",$ve=1316,_ve='http://www.eclipse.org/emf/2002/Ecore',awe=-32768,bwe='constraints',cwe='baseType',dwe='getEStructuralFeature',ewe='getFeatureID',fwe='feature',gwe='getOperationID',hwe='operation',iwe='defaultValue',jwe='eTypeParameters',kwe='isInstance',lwe='getEEnumLiteral',mwe='eContainingClass',nwe={55:1},owe={3:1,4:1,5:1,119:1},pwe='org.eclipse.emf.ecore.resource',qwe={92:1,90:1,591:1,1935:1},rwe='org.eclipse.emf.ecore.resource.impl',swe='unspecified',twe='simple',uwe='attribute',vwe='attributeWildcard',wwe='element',xwe='elementWildcard',ywe='collapse',zwe='itemType',Awe='namespace',Bwe='##targetNamespace',Cwe='whiteSpace',Dwe='wildcards',Ewe='http://www.eclipse.org/emf/2003/XMLType',Fwe='##any',Gwe='uninitialized',Hwe='The multiplicity constraint is violated',Iwe='org.eclipse.emf.ecore.xml.type',Jwe='ProcessingInstruction',Kwe='SimpleAnyType',Lwe='XMLTypeDocumentRoot',Mwe='org.eclipse.emf.ecore.xml.type.impl',Nwe='INF',Owe='processing',Pwe='ENTITIES_._base',Qwe='minLength',Rwe='ENTITY',Swe='NCName',Twe='IDREFS_._base',Uwe='integer',Vwe='token',Wwe='pattern',Xwe='[a-zA-Z]{1,8}(-[a-zA-Z0-9]{1,8})*',Ywe='\\i\\c*',Zwe='[\\i-[:]][\\c-[:]]*',$we='nonPositiveInteger',_we='maxInclusive',axe='NMTOKEN',bxe='NMTOKENS_._base',cxe='nonNegativeInteger',dxe='minInclusive',exe='normalizedString',fxe='unsignedByte',gxe='unsignedInt',hxe='18446744073709551615',ixe='unsignedShort',jxe='processingInstruction',kxe='org.eclipse.emf.ecore.xml.type.internal',lxe=1114111,mxe='Internal Error: shorthands: \\u',nxe='xml:isDigit',oxe='xml:isWord',pxe='xml:isSpace',qxe='xml:isNameChar',rxe='xml:isInitialNameChar',sxe='09\u0660\u0669\u06F0\u06F9\u0966\u096F\u09E6\u09EF\u0A66\u0A6F\u0AE6\u0AEF\u0B66\u0B6F\u0BE7\u0BEF\u0C66\u0C6F\u0CE6\u0CEF\u0D66\u0D6F\u0E50\u0E59\u0ED0\u0ED9\u0F20\u0F29',txe='AZaz\xC0\xD6\xD8\xF6\xF8\u0131\u0134\u013E\u0141\u0148\u014A\u017E\u0180\u01C3\u01CD\u01F0\u01F4\u01F5\u01FA\u0217\u0250\u02A8\u02BB\u02C1\u0386\u0386\u0388\u038A\u038C\u038C\u038E\u03A1\u03A3\u03CE\u03D0\u03D6\u03DA\u03DA\u03DC\u03DC\u03DE\u03DE\u03E0\u03E0\u03E2\u03F3\u0401\u040C\u040E\u044F\u0451\u045C\u045E\u0481\u0490\u04C4\u04C7\u04C8\u04CB\u04CC\u04D0\u04EB\u04EE\u04F5\u04F8\u04F9\u0531\u0556\u0559\u0559\u0561\u0586\u05D0\u05EA\u05F0\u05F2\u0621\u063A\u0641\u064A\u0671\u06B7\u06BA\u06BE\u06C0\u06CE\u06D0\u06D3\u06D5\u06D5\u06E5\u06E6\u0905\u0939\u093D\u093D\u0958\u0961\u0985\u098C\u098F\u0990\u0993\u09A8\u09AA\u09B0\u09B2\u09B2\u09B6\u09B9\u09DC\u09DD\u09DF\u09E1\u09F0\u09F1\u0A05\u0A0A\u0A0F\u0A10\u0A13\u0A28\u0A2A\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59\u0A5C\u0A5E\u0A5E\u0A72\u0A74\u0A85\u0A8B\u0A8D\u0A8D\u0A8F\u0A91\u0A93\u0AA8\u0AAA\u0AB0\u0AB2\u0AB3\u0AB5\u0AB9\u0ABD\u0ABD\u0AE0\u0AE0\u0B05\u0B0C\u0B0F\u0B10\u0B13\u0B28\u0B2A\u0B30\u0B32\u0B33\u0B36\u0B39\u0B3D\u0B3D\u0B5C\u0B5D\u0B5F\u0B61\u0B85\u0B8A\u0B8E\u0B90\u0B92\u0B95\u0B99\u0B9A\u0B9C\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8\u0BAA\u0BAE\u0BB5\u0BB7\u0BB9\u0C05\u0C0C\u0C0E\u0C10\u0C12\u0C28\u0C2A\u0C33\u0C35\u0C39\u0C60\u0C61\u0C85\u0C8C\u0C8E\u0C90\u0C92\u0CA8\u0CAA\u0CB3\u0CB5\u0CB9\u0CDE\u0CDE\u0CE0\u0CE1\u0D05\u0D0C\u0D0E\u0D10\u0D12\u0D28\u0D2A\u0D39\u0D60\u0D61\u0E01\u0E2E\u0E30\u0E30\u0E32\u0E33\u0E40\u0E45\u0E81\u0E82\u0E84\u0E84\u0E87\u0E88\u0E8A\u0E8A\u0E8D\u0E8D\u0E94\u0E97\u0E99\u0E9F\u0EA1\u0EA3\u0EA5\u0EA5\u0EA7\u0EA7\u0EAA\u0EAB\u0EAD\u0EAE\u0EB0\u0EB0\u0EB2\u0EB3\u0EBD\u0EBD\u0EC0\u0EC4\u0F40\u0F47\u0F49\u0F69\u10A0\u10C5\u10D0\u10F6\u1100\u1100\u1102\u1103\u1105\u1107\u1109\u1109\u110B\u110C\u110E\u1112\u113C\u113C\u113E\u113E\u1140\u1140\u114C\u114C\u114E\u114E\u1150\u1150\u1154\u1155\u1159\u1159\u115F\u1161\u1163\u1163\u1165\u1165\u1167\u1167\u1169\u1169\u116D\u116E\u1172\u1173\u1175\u1175\u119E\u119E\u11A8\u11A8\u11AB\u11AB\u11AE\u11AF\u11B7\u11B8\u11BA\u11BA\u11BC\u11C2\u11EB\u11EB\u11F0\u11F0\u11F9\u11F9\u1E00\u1E9B\u1EA0\u1EF9\u1F00\u1F15\u1F18\u1F1D\u1F20\u1F45\u1F48\u1F4D\u1F50\u1F57\u1F59\u1F59\u1F5B\u1F5B\u1F5D\u1F5D\u1F5F\u1F7D\u1F80\u1FB4\u1FB6\u1FBC\u1FBE\u1FBE\u1FC2\u1FC4\u1FC6\u1FCC\u1FD0\u1FD3\u1FD6\u1FDB\u1FE0\u1FEC\u1FF2\u1FF4\u1FF6\u1FFC\u2126\u2126\u212A\u212B\u212E\u212E\u2180\u2182\u3007\u3007\u3021\u3029\u3041\u3094\u30A1\u30FA\u3105\u312C\u4E00\u9FA5\uAC00\uD7A3',uxe='Private Use',vxe='ASSIGNED',wxe='\x00\x7F\x80\xFF\u0100\u017F\u0180\u024F\u0250\u02AF\u02B0\u02FF\u0300\u036F\u0370\u03FF\u0400\u04FF\u0530\u058F\u0590\u05FF\u0600\u06FF\u0700\u074F\u0780\u07BF\u0900\u097F\u0980\u09FF\u0A00\u0A7F\u0A80\u0AFF\u0B00\u0B7F\u0B80\u0BFF\u0C00\u0C7F\u0C80\u0CFF\u0D00\u0D7F\u0D80\u0DFF\u0E00\u0E7F\u0E80\u0EFF\u0F00\u0FFF\u1000\u109F\u10A0\u10FF\u1100\u11FF\u1200\u137F\u13A0\u13FF\u1400\u167F\u1680\u169F\u16A0\u16FF\u1780\u17FF\u1800\u18AF\u1E00\u1EFF\u1F00\u1FFF\u2000\u206F\u2070\u209F\u20A0\u20CF\u20D0\u20FF\u2100\u214F\u2150\u218F\u2190\u21FF\u2200\u22FF\u2300\u23FF\u2400\u243F\u2440\u245F\u2460\u24FF\u2500\u257F\u2580\u259F\u25A0\u25FF\u2600\u26FF\u2700\u27BF\u2800\u28FF\u2E80\u2EFF\u2F00\u2FDF\u2FF0\u2FFF\u3000\u303F\u3040\u309F\u30A0\u30FF\u3100\u312F\u3130\u318F\u3190\u319F\u31A0\u31BF\u3200\u32FF\u3300\u33FF\u3400\u4DB5\u4E00\u9FFF\uA000\uA48F\uA490\uA4CF\uAC00\uD7A3\uE000\uF8FF\uF900\uFAFF\uFB00\uFB4F\uFB50\uFDFF\uFE20\uFE2F\uFE30\uFE4F\uFE50\uFE6F\uFE70\uFEFE\uFEFF\uFEFF\uFF00\uFFEF',xxe='UNASSIGNED',yxe={3:1,117:1},zxe='org.eclipse.emf.ecore.xml.type.util',Axe={3:1,4:1,5:1,368:1},Bxe='org.eclipse.xtext.xbase.lib',Cxe='Cannot add elements to a Range',Dxe='Cannot set elements in a Range',Exe='Cannot remove elements from a Range',Fxe='locale',Gxe='default',Hxe='user.agent';var _,_bb,Wbb,tbb=-1;$wnd.goog=$wnd.goog||{};$wnd.goog.global=$wnd.goog.global||$wnd;acb();bcb(1,null,{},nb);_.Fb=function ob(a){return mb(this,a)};_.Gb=function qb(){return this.gm};_.Hb=function sb(){return FCb(this)};_.Ib=function ub(){var a;return hdb(rb(this))+'@'+(a=tb(this)>>>0,a.toString(16))};_.equals=function(a){return this.Fb(a)};_.hashCode=function(){return this.Hb()};_.toString=function(){return this.Ib()};var xD,yD,zD;bcb(290,1,{290:1,2026:1},jdb);_.le=function kdb(a){var b;b=new jdb;b.i=4;a>1?(b.c=rdb(this,a-1)):(b.c=this);return b};_.me=function qdb(){fdb(this);return this.b};_.ne=function sdb(){return hdb(this)};_.oe=function udb(){return fdb(this),this.k};_.pe=function wdb(){return (this.i&4)!=0};_.qe=function xdb(){return (this.i&1)!=0};_.Ib=function Adb(){return idb(this)};_.i=0;var edb=1;var SI=mdb(Phe,'Object',1);var AI=mdb(Phe,'Class',290);bcb(1998,1,Qhe);var $D=mdb(Rhe,'Optional',1998);bcb(1170,1998,Qhe,xb);_.Fb=function yb(a){return a===this};_.Hb=function zb(){return 2040732332};_.Ib=function Ab(){return 'Optional.absent()'};_.Jb=function Bb(a){Qb(a);return wb(),vb};var vb;var YD=mdb(Rhe,'Absent',1170);bcb(628,1,{},Gb);var ZD=mdb(Rhe,'Joiner',628);var _D=odb(Rhe,'Predicate');bcb(582,1,{169:1,582:1,3:1,45:1},Yb);_.Mb=function ac(a){return Xb(this,a)};_.Lb=function Zb(a){return Xb(this,a)};_.Fb=function $b(a){var b;if(JD(a,582)){b=BD(a,582);return At(this.a,b.a)}return false};_.Hb=function _b(){return qmb(this.a)+306654252};_.Ib=function bc(){return Wb(this.a)};var aE=mdb(Rhe,'Predicates/AndPredicate',582);bcb(408,1998,{408:1,3:1},cc);_.Fb=function dc(a){var b;if(JD(a,408)){b=BD(a,408);return pb(this.a,b.a)}return false};_.Hb=function ec(){return 1502476572+tb(this.a)};_.Ib=function fc(){return Whe+this.a+')'};_.Jb=function gc(a){return new cc(Rb(a.Kb(this.a),'the Function passed to Optional.transform() must not return null.'))};var bE=mdb(Rhe,'Present',408);bcb(198,1,Yhe);_.Nb=function kc(a){Rrb(this,a)};_.Qb=function lc(){jc()};var MH=mdb(Zhe,'UnmodifiableIterator',198);bcb(1978,198,$he);_.Qb=function nc(){jc()};_.Rb=function mc(a){throw vbb(new bgb)};_.Wb=function oc(a){throw vbb(new bgb)};var NH=mdb(Zhe,'UnmodifiableListIterator',1978);bcb(386,1978,$he);_.Ob=function rc(){return this.c0};_.Pb=function tc(){if(this.c>=this.d){throw vbb(new utb)}return this.Xb(this.c++)};_.Tb=function uc(){return this.c};_.Ub=function vc(){if(this.c<=0){throw vbb(new utb)}return this.Xb(--this.c)};_.Vb=function wc(){return this.c-1};_.c=0;_.d=0;var cE=mdb(Zhe,'AbstractIndexedListIterator',386);bcb(699,198,Yhe);_.Ob=function Ac(){return xc(this)};_.Pb=function Bc(){return yc(this)};_.e=1;var dE=mdb(Zhe,'AbstractIterator',699);bcb(1986,1,{224:1});_.Zb=function Hc(){var a;return a=this.f,!a?(this.f=this.ac()):a};_.Fb=function Ic(a){return hw(this,a)};_.Hb=function Jc(){return tb(this.Zb())};_.dc=function Kc(){return this.gc()==0};_.ec=function Lc(){return Ec(this)};_.Ib=function Mc(){return fcb(this.Zb())};var IE=mdb(Zhe,'AbstractMultimap',1986);bcb(726,1986,_he);_.$b=function Xc(){Nc(this)};_._b=function Yc(a){return Oc(this,a)};_.ac=function Zc(){return new ne(this,this.c)};_.ic=function $c(a){return this.hc()};_.bc=function _c(){return new zf(this,this.c)};_.jc=function ad(){return this.mc(this.hc())};_.kc=function bd(){return new Hd(this)};_.lc=function cd(){return Yj(this.c.vc().Nc(),new $g,64,this.d)};_.cc=function dd(a){return Qc(this,a)};_.fc=function gd(a){return Sc(this,a)};_.gc=function hd(){return this.d};_.mc=function jd(a){return mmb(),new lnb(a)};_.nc=function kd(){return new Dd(this)};_.oc=function ld(){return Yj(this.c.Cc().Nc(),new Fd,64,this.d)};_.pc=function md(a,b){return new dg(this,a,b,null)};_.d=0;var DE=mdb(Zhe,'AbstractMapBasedMultimap',726);bcb(1631,726,_he);_.hc=function pd(){return new Skb(this.a)};_.jc=function qd(){return mmb(),mmb(),jmb};_.cc=function sd(a){return BD(Qc(this,a),15)};_.fc=function ud(a){return BD(Sc(this,a),15)};_.Zb=function od(){return nd(this)};_.Fb=function rd(a){return hw(this,a)};_.qc=function td(a){return BD(Qc(this,a),15)};_.rc=function vd(a){return BD(Sc(this,a),15)};_.mc=function wd(a){return vmb(BD(a,15))};_.pc=function xd(a,b){return Vc(this,a,BD(b,15),null)};var eE=mdb(Zhe,'AbstractListMultimap',1631);bcb(732,1,aie);_.Nb=function zd(a){Rrb(this,a)};_.Ob=function Ad(){return this.c.Ob()||this.e.Ob()};_.Pb=function Bd(){var a;if(!this.e.Ob()){a=BD(this.c.Pb(),42);this.b=a.cd();this.a=BD(a.dd(),14);this.e=this.a.Kc()}return this.sc(this.b,this.e.Pb())};_.Qb=function Cd(){this.e.Qb();this.a.dc()&&this.c.Qb();--this.d.d};var mE=mdb(Zhe,'AbstractMapBasedMultimap/Itr',732);bcb(1099,732,aie,Dd);_.sc=function Ed(a,b){return b};var fE=mdb(Zhe,'AbstractMapBasedMultimap/1',1099);bcb(1100,1,{},Fd);_.Kb=function Gd(a){return BD(a,14).Nc()};var gE=mdb(Zhe,'AbstractMapBasedMultimap/1methodref$spliterator$Type',1100);bcb(1101,732,aie,Hd);_.sc=function Id(a,b){return new Wo(a,b)};var hE=mdb(Zhe,'AbstractMapBasedMultimap/2',1101);var DK=odb(bie,'Map');bcb(1967,1,cie);_.wc=function Td(a){stb(this,a)};_.yc=function $d(a,b,c){return ttb(this,a,b,c)};_.$b=function Od(){this.vc().$b()};_.tc=function Pd(a){return Jd(this,a)};_._b=function Qd(a){return !!Kd(this,a,false)};_.uc=function Rd(a){var b,c,d;for(c=this.vc().Kc();c.Ob();){b=BD(c.Pb(),42);d=b.dd();if(PD(a)===PD(d)||a!=null&&pb(a,d)){return true}}return false};_.Fb=function Sd(a){var b,c,d;if(a===this){return true}if(!JD(a,83)){return false}d=BD(a,83);if(this.gc()!=d.gc()){return false}for(c=d.vc().Kc();c.Ob();){b=BD(c.Pb(),42);if(!this.tc(b)){return false}}return true};_.xc=function Ud(a){return Wd(Kd(this,a,false))};_.Hb=function Xd(){return pmb(this.vc())};_.dc=function Yd(){return this.gc()==0};_.ec=function Zd(){return new Pib(this)};_.zc=function _d(a,b){throw vbb(new cgb('Put not supported on this map'))};_.Ac=function ae(a){Ld(this,a)};_.Bc=function be(a){return Wd(Kd(this,a,true))};_.gc=function ce(){return this.vc().gc()};_.Ib=function de(){return Md(this)};_.Cc=function ee(){return new $ib(this)};var sJ=mdb(bie,'AbstractMap',1967);bcb(1987,1967,cie);_.bc=function ge(){return new rf(this)};_.vc=function he(){return fe(this)};_.ec=function ie(){var a;a=this.g;return !a?(this.g=this.bc()):a};_.Cc=function je(){var a;a=this.i;return !a?(this.i=new Zv(this)):a};var bH=mdb(Zhe,'Maps/ViewCachingAbstractMap',1987);bcb(389,1987,cie,ne);_.xc=function se(a){return ke(this,a)};_.Bc=function ve(a){return le(this,a)};_.$b=function oe(){this.d==this.e.c?this.e.$b():ir(new mf(this))};_._b=function pe(a){return Gv(this.d,a)};_.Ec=function qe(){return new df(this)};_.Dc=function(){return this.Ec()};_.Fb=function re(a){return this===a||pb(this.d,a)};_.Hb=function te(){return tb(this.d)};_.ec=function ue(){return this.e.ec()};_.gc=function we(){return this.d.gc()};_.Ib=function xe(){return fcb(this.d)};var lE=mdb(Zhe,'AbstractMapBasedMultimap/AsMap',389);var KI=odb(Phe,'Iterable');bcb(28,1,die);_.Jc=function Le(a){reb(this,a)};_.Lc=function Ne(){return this.Oc()};_.Nc=function Pe(){return new Kub(this,0)};_.Oc=function Qe(){return new YAb(null,this.Nc())};_.Fc=function Ge(a){throw vbb(new cgb('Add not supported on this collection'))};_.Gc=function He(a){return ye(this,a)};_.$b=function Ie(){Ae(this)};_.Hc=function Je(a){return ze(this,a,false)};_.Ic=function Ke(a){return Be(this,a)};_.dc=function Me(){return this.gc()==0};_.Mc=function Oe(a){return ze(this,a,true)};_.Pc=function Re(){return De(this)};_.Qc=function Se(a){return Ee(this,a)};_.Ib=function Te(){return Fe(this)};var dJ=mdb(bie,'AbstractCollection',28);var LK=odb(bie,'Set');bcb(eie,28,fie);_.Nc=function Ye(){return new Kub(this,1)};_.Fb=function We(a){return Ue(this,a)};_.Hb=function Xe(){return pmb(this)};var zJ=mdb(bie,'AbstractSet',eie);bcb(1970,eie,fie);var BH=mdb(Zhe,'Sets/ImprovedAbstractSet',1970);bcb(1971,1970,fie);_.$b=function $e(){this.Rc().$b()};_.Hc=function _e(a){return Ze(this,a)};_.dc=function af(){return this.Rc().dc()};_.Mc=function bf(a){var b;if(this.Hc(a)){b=BD(a,42);return this.Rc().ec().Mc(b.cd())}return false};_.gc=function cf(){return this.Rc().gc()};var WG=mdb(Zhe,'Maps/EntrySet',1971);bcb(1097,1971,fie,df);_.Hc=function ef(a){return Ck(this.a.d.vc(),a)};_.Kc=function ff(){return new mf(this.a)};_.Rc=function gf(){return this.a};_.Mc=function hf(a){var b;if(!Ck(this.a.d.vc(),a)){return false}b=BD(a,42);Tc(this.a.e,b.cd());return true};_.Nc=function jf(){return $j(this.a.d.vc().Nc(),new kf(this.a))};var jE=mdb(Zhe,'AbstractMapBasedMultimap/AsMap/AsMapEntries',1097);bcb(1098,1,{},kf);_.Kb=function lf(a){return me(this.a,BD(a,42))};var iE=mdb(Zhe,'AbstractMapBasedMultimap/AsMap/AsMapEntries/0methodref$wrapEntry$Type',1098);bcb(730,1,aie,mf);_.Nb=function nf(a){Rrb(this,a)};_.Pb=function pf(){var a;return a=BD(this.b.Pb(),42),this.a=BD(a.dd(),14),me(this.c,a)};_.Ob=function of(){return this.b.Ob()};_.Qb=function qf(){Vb(!!this.a);this.b.Qb();this.c.e.d-=this.a.gc();this.a.$b();this.a=null};var kE=mdb(Zhe,'AbstractMapBasedMultimap/AsMap/AsMapIterator',730);bcb(532,1970,fie,rf);_.$b=function sf(){this.b.$b()};_.Hc=function tf(a){return this.b._b(a)};_.Jc=function uf(a){Qb(a);this.b.wc(new Xv(a))};_.dc=function vf(){return this.b.dc()};_.Kc=function wf(){return new Mv(this.b.vc().Kc())};_.Mc=function xf(a){if(this.b._b(a)){this.b.Bc(a);return true}return false};_.gc=function yf(){return this.b.gc()};var $G=mdb(Zhe,'Maps/KeySet',532);bcb(318,532,fie,zf);_.$b=function Af(){var a;ir((a=this.b.vc().Kc(),new Hf(this,a)))};_.Ic=function Bf(a){return this.b.ec().Ic(a)};_.Fb=function Cf(a){return this===a||pb(this.b.ec(),a)};_.Hb=function Df(){return tb(this.b.ec())};_.Kc=function Ef(){var a;return a=this.b.vc().Kc(),new Hf(this,a)};_.Mc=function Ff(a){var b,c;c=0;b=BD(this.b.Bc(a),14);if(b){c=b.gc();b.$b();this.a.d-=c}return c>0};_.Nc=function Gf(){return this.b.ec().Nc()};var oE=mdb(Zhe,'AbstractMapBasedMultimap/KeySet',318);bcb(731,1,aie,Hf);_.Nb=function If(a){Rrb(this,a)};_.Ob=function Jf(){return this.c.Ob()};_.Pb=function Kf(){this.a=BD(this.c.Pb(),42);return this.a.cd()};_.Qb=function Lf(){var a;Vb(!!this.a);a=BD(this.a.dd(),14);this.c.Qb();this.b.a.d-=a.gc();a.$b();this.a=null};var nE=mdb(Zhe,'AbstractMapBasedMultimap/KeySet/1',731);bcb(491,389,{83:1,161:1},Mf);_.bc=function Nf(){return this.Sc()};_.ec=function Pf(){return this.Tc()};_.Sc=function Of(){return new Yf(this.c,this.Uc())};_.Tc=function Qf(){var a;return a=this.b,!a?(this.b=this.Sc()):a};_.Uc=function Rf(){return BD(this.d,161)};var sE=mdb(Zhe,'AbstractMapBasedMultimap/SortedAsMap',491);bcb(542,491,gie,Sf);_.bc=function Tf(){return new $f(this.a,BD(BD(this.d,161),171))};_.Sc=function Uf(){return new $f(this.a,BD(BD(this.d,161),171))};_.ec=function Vf(){var a;return a=this.b,BD(!a?(this.b=new $f(this.a,BD(BD(this.d,161),171))):a,271)};_.Tc=function Wf(){var a;return a=this.b,BD(!a?(this.b=new $f(this.a,BD(BD(this.d,161),171))):a,271)};_.Uc=function Xf(){return BD(BD(this.d,161),171)};var pE=mdb(Zhe,'AbstractMapBasedMultimap/NavigableAsMap',542);bcb(490,318,hie,Yf);_.Nc=function Zf(){return this.b.ec().Nc()};var tE=mdb(Zhe,'AbstractMapBasedMultimap/SortedKeySet',490);bcb(388,490,iie,$f);var qE=mdb(Zhe,'AbstractMapBasedMultimap/NavigableKeySet',388);bcb(541,28,die,dg);_.Fc=function eg(a){var b,c;ag(this);c=this.d.dc();b=this.d.Fc(a);if(b){++this.f.d;c&&_f(this)}return b};_.Gc=function fg(a){var b,c,d;if(a.dc()){return false}d=(ag(this),this.d.gc());b=this.d.Gc(a);if(b){c=this.d.gc();this.f.d+=c-d;d==0&&_f(this)}return b};_.$b=function gg(){var a;a=(ag(this),this.d.gc());if(a==0){return}this.d.$b();this.f.d-=a;bg(this)};_.Hc=function hg(a){ag(this);return this.d.Hc(a)};_.Ic=function ig(a){ag(this);return this.d.Ic(a)};_.Fb=function jg(a){if(a===this){return true}ag(this);return pb(this.d,a)};_.Hb=function kg(){ag(this);return tb(this.d)};_.Kc=function lg(){ag(this);return new Gg(this)};_.Mc=function mg(a){var b;ag(this);b=this.d.Mc(a);if(b){--this.f.d;bg(this)}return b};_.gc=function ng(){return cg(this)};_.Nc=function og(){return ag(this),this.d.Nc()};_.Ib=function pg(){ag(this);return fcb(this.d)};var vE=mdb(Zhe,'AbstractMapBasedMultimap/WrappedCollection',541);var yK=odb(bie,'List');bcb(728,541,{20:1,28:1,14:1,15:1},qg);_.ad=function zg(a){ktb(this,a)};_.Nc=function Ag(){return ag(this),this.d.Nc()};_.Vc=function rg(a,b){var c;ag(this);c=this.d.dc();BD(this.d,15).Vc(a,b);++this.a.d;c&&_f(this)};_.Wc=function sg(a,b){var c,d,e;if(b.dc()){return false}e=(ag(this),this.d.gc());c=BD(this.d,15).Wc(a,b);if(c){d=this.d.gc();this.a.d+=d-e;e==0&&_f(this)}return c};_.Xb=function tg(a){ag(this);return BD(this.d,15).Xb(a)};_.Xc=function ug(a){ag(this);return BD(this.d,15).Xc(a)};_.Yc=function vg(){ag(this);return new Mg(this)};_.Zc=function wg(a){ag(this);return new Ng(this,a)};_.$c=function xg(a){var b;ag(this);b=BD(this.d,15).$c(a);--this.a.d;bg(this);return b};_._c=function yg(a,b){ag(this);return BD(this.d,15)._c(a,b)};_.bd=function Bg(a,b){ag(this);return Vc(this.a,this.e,BD(this.d,15).bd(a,b),!this.b?this:this.b)};var xE=mdb(Zhe,'AbstractMapBasedMultimap/WrappedList',728);bcb(1096,728,{20:1,28:1,14:1,15:1,54:1},Cg);var rE=mdb(Zhe,'AbstractMapBasedMultimap/RandomAccessWrappedList',1096);bcb(620,1,aie,Gg);_.Nb=function Ig(a){Rrb(this,a)};_.Ob=function Jg(){Fg(this);return this.b.Ob()};_.Pb=function Kg(){Fg(this);return this.b.Pb()};_.Qb=function Lg(){Eg(this)};var uE=mdb(Zhe,'AbstractMapBasedMultimap/WrappedCollection/WrappedIterator',620);bcb(729,620,jie,Mg,Ng);_.Qb=function Tg(){Eg(this)};_.Rb=function Og(a){var b;b=cg(this.a)==0;(Fg(this),BD(this.b,125)).Rb(a);++this.a.a.d;b&&_f(this.a)};_.Sb=function Pg(){return (Fg(this),BD(this.b,125)).Sb()};_.Tb=function Qg(){return (Fg(this),BD(this.b,125)).Tb()};_.Ub=function Rg(){return (Fg(this),BD(this.b,125)).Ub()};_.Vb=function Sg(){return (Fg(this),BD(this.b,125)).Vb()};_.Wb=function Ug(a){(Fg(this),BD(this.b,125)).Wb(a)};var wE=mdb(Zhe,'AbstractMapBasedMultimap/WrappedList/WrappedListIterator',729);bcb(727,541,hie,Vg);_.Nc=function Wg(){return ag(this),this.d.Nc()};var AE=mdb(Zhe,'AbstractMapBasedMultimap/WrappedSortedSet',727);bcb(1095,727,iie,Xg);var yE=mdb(Zhe,'AbstractMapBasedMultimap/WrappedNavigableSet',1095);bcb(1094,541,fie,Yg);_.Nc=function Zg(){return ag(this),this.d.Nc()};var zE=mdb(Zhe,'AbstractMapBasedMultimap/WrappedSet',1094);bcb(1103,1,{},$g);_.Kb=function _g(a){return fd(BD(a,42))};var BE=mdb(Zhe,'AbstractMapBasedMultimap/lambda$1$Type',1103);bcb(1102,1,{},ah);_.Kb=function bh(a){return new Wo(this.a,a)};var CE=mdb(Zhe,'AbstractMapBasedMultimap/lambda$2$Type',1102);var CK=odb(bie,'Map/Entry');bcb(345,1,kie);_.Fb=function dh(a){var b;if(JD(a,42)){b=BD(a,42);return Hb(this.cd(),b.cd())&&Hb(this.dd(),b.dd())}return false};_.Hb=function eh(){var a,b;a=this.cd();b=this.dd();return (a==null?0:tb(a))^(b==null?0:tb(b))};_.ed=function fh(a){throw vbb(new bgb)};_.Ib=function gh(){return this.cd()+'='+this.dd()};var EE=mdb(Zhe,lie,345);bcb(1988,28,die);_.$b=function hh(){this.fd().$b()};_.Hc=function ih(a){var b;if(JD(a,42)){b=BD(a,42);return Cc(this.fd(),b.cd(),b.dd())}return false};_.Mc=function jh(a){var b;if(JD(a,42)){b=BD(a,42);return Gc(this.fd(),b.cd(),b.dd())}return false};_.gc=function kh(){return this.fd().d};var fH=mdb(Zhe,'Multimaps/Entries',1988);bcb(733,1988,die,lh);_.Kc=function mh(){return this.a.kc()};_.fd=function nh(){return this.a};_.Nc=function oh(){return this.a.lc()};var FE=mdb(Zhe,'AbstractMultimap/Entries',733);bcb(734,733,fie,ph);_.Nc=function sh(){return this.a.lc()};_.Fb=function qh(a){return Ax(this,a)};_.Hb=function rh(){return Bx(this)};var GE=mdb(Zhe,'AbstractMultimap/EntrySet',734);bcb(735,28,die,th);_.$b=function uh(){this.a.$b()};_.Hc=function vh(a){return Dc(this.a,a)};_.Kc=function wh(){return this.a.nc()};_.gc=function xh(){return this.a.d};_.Nc=function yh(){return this.a.oc()};var HE=mdb(Zhe,'AbstractMultimap/Values',735);bcb(1989,28,{835:1,20:1,28:1,14:1});_.Jc=function Gh(a){Qb(a);Ah(this).Jc(new Xw(a))};_.Nc=function Kh(){var a;return a=Ah(this).Nc(),Yj(a,new cx,64|a.qd()&1296,this.a.d)};_.Fc=function Ch(a){zh();return true};_.Gc=function Dh(a){return Qb(this),Qb(a),JD(a,543)?Zw(BD(a,835)):!a.dc()&&fr(this,a.Kc())};_.Hc=function Eh(a){var b;return b=BD(Hv(nd(this.a),a),14),(!b?0:b.gc())>0};_.Fb=function Fh(a){return $w(this,a)};_.Hb=function Hh(){return tb(Ah(this))};_.dc=function Ih(){return Ah(this).dc()};_.Mc=function Jh(a){return Bw(this,a,1)>0};_.Ib=function Lh(){return fcb(Ah(this))};var KE=mdb(Zhe,'AbstractMultiset',1989);bcb(1991,1970,fie);_.$b=function Mh(){Nc(this.a.a)};_.Hc=function Nh(a){var b,c;if(JD(a,492)){c=BD(a,416);if(BD(c.a.dd(),14).gc()<=0){return false}b=Aw(this.a,c.a.cd());return b==BD(c.a.dd(),14).gc()}return false};_.Mc=function Oh(a){var b,c,d,e;if(JD(a,492)){c=BD(a,416);b=c.a.cd();d=BD(c.a.dd(),14).gc();if(d!=0){e=this.a;return ax(e,b,d)}}return false};var pH=mdb(Zhe,'Multisets/EntrySet',1991);bcb(1109,1991,fie,Ph);_.Kc=function Qh(){return new Lw(fe(nd(this.a.a)).Kc())};_.gc=function Rh(){return nd(this.a.a).gc()};var JE=mdb(Zhe,'AbstractMultiset/EntrySet',1109);bcb(619,726,_he);_.hc=function Uh(){return this.gd()};_.jc=function Vh(){return this.hd()};_.cc=function Yh(a){return this.jd(a)};_.fc=function $h(a){return this.kd(a)};_.Zb=function Th(){var a;return a=this.f,!a?(this.f=this.ac()):a};_.hd=function Wh(){return mmb(),mmb(),lmb};_.Fb=function Xh(a){return hw(this,a)};_.jd=function Zh(a){return BD(Qc(this,a),21)};_.kd=function _h(a){return BD(Sc(this,a),21)};_.mc=function ai(a){return mmb(),new zob(BD(a,21))};_.pc=function bi(a,b){return new Yg(this,a,BD(b,21))};var LE=mdb(Zhe,'AbstractSetMultimap',619);bcb(1657,619,_he);_.hc=function ei(){return new Hxb(this.b)};_.gd=function fi(){return new Hxb(this.b)};_.jc=function gi(){return Ix(new Hxb(this.b))};_.hd=function hi(){return Ix(new Hxb(this.b))};_.cc=function ii(a){return BD(BD(Qc(this,a),21),84)};_.jd=function ji(a){return BD(BD(Qc(this,a),21),84)};_.fc=function ki(a){return BD(BD(Sc(this,a),21),84)};_.kd=function li(a){return BD(BD(Sc(this,a),21),84)};_.mc=function mi(a){return JD(a,271)?Ix(BD(a,271)):(mmb(),new Zob(BD(a,84)))};_.Zb=function di(){var a;return a=this.f,!a?(this.f=JD(this.c,171)?new Sf(this,BD(this.c,171)):JD(this.c,161)?new Mf(this,BD(this.c,161)):new ne(this,this.c)):a};_.pc=function ni(a,b){return JD(b,271)?new Xg(this,a,BD(b,271)):new Vg(this,a,BD(b,84))};var NE=mdb(Zhe,'AbstractSortedSetMultimap',1657);bcb(1658,1657,_he);_.Zb=function pi(){var a;return a=this.f,BD(BD(!a?(this.f=JD(this.c,171)?new Sf(this,BD(this.c,171)):JD(this.c,161)?new Mf(this,BD(this.c,161)):new ne(this,this.c)):a,161),171)};_.ec=function ri(){var a;return a=this.i,BD(BD(!a?(this.i=JD(this.c,171)?new $f(this,BD(this.c,171)):JD(this.c,161)?new Yf(this,BD(this.c,161)):new zf(this,this.c)):a,84),271)};_.bc=function qi(){return JD(this.c,171)?new $f(this,BD(this.c,171)):JD(this.c,161)?new Yf(this,BD(this.c,161)):new zf(this,this.c)};var ME=mdb(Zhe,'AbstractSortedKeySortedSetMultimap',1658);bcb(2010,1,{1947:1});_.Fb=function si(a){return zy(this,a)};_.Hb=function ti(){var a;return pmb((a=this.g,!a?(this.g=new vi(this)):a))};_.Ib=function ui(){var a;return Md((a=this.f,!a?(this.f=new Rj(this)):a))};var QE=mdb(Zhe,'AbstractTable',2010);bcb(665,eie,fie,vi);_.$b=function wi(){Pi()};_.Hc=function xi(a){var b,c;if(JD(a,468)){b=BD(a,682);c=BD(Hv(Vi(this.a),Em(b.c.e,b.b)),83);return !!c&&Ck(c.vc(),new Wo(Em(b.c.c,b.a),Mi(b.c,b.b,b.a)))}return false};_.Kc=function yi(){return Ni(this.a)};_.Mc=function zi(a){var b,c;if(JD(a,468)){b=BD(a,682);c=BD(Hv(Vi(this.a),Em(b.c.e,b.b)),83);return !!c&&Dk(c.vc(),new Wo(Em(b.c.c,b.a),Mi(b.c,b.b,b.a)))}return false};_.gc=function Ai(){return Xi(this.a)};_.Nc=function Bi(){return Oi(this.a)};var OE=mdb(Zhe,'AbstractTable/CellSet',665);bcb(1928,28,die,Ci);_.$b=function Di(){Pi()};_.Hc=function Ei(a){return Qi(this.a,a)};_.Kc=function Fi(){return Zi(this.a)};_.gc=function Gi(){return Xi(this.a)};_.Nc=function Hi(){return $i(this.a)};var PE=mdb(Zhe,'AbstractTable/Values',1928);bcb(1632,1631,_he);var RE=mdb(Zhe,'ArrayListMultimapGwtSerializationDependencies',1632);bcb(513,1632,_he,Ji,Ki);_.hc=function Li(){return new Skb(this.a)};_.a=0;var SE=mdb(Zhe,'ArrayListMultimap',513);bcb(664,2010,{664:1,1947:1,3:1},_i);var cF=mdb(Zhe,'ArrayTable',664);bcb(1924,386,$he,aj);_.Xb=function bj(a){return new hj(this.a,a)};var TE=mdb(Zhe,'ArrayTable/1',1924);bcb(1925,1,{},cj);_.ld=function dj(a){return new hj(this.a,a)};var UE=mdb(Zhe,'ArrayTable/1methodref$getCell$Type',1925);bcb(2011,1,{682:1});_.Fb=function ej(a){var b;if(a===this){return true}if(JD(a,468)){b=BD(a,682);return Hb(Em(this.c.e,this.b),Em(b.c.e,b.b))&&Hb(Em(this.c.c,this.a),Em(b.c.c,b.a))&&Hb(Mi(this.c,this.b,this.a),Mi(b.c,b.b,b.a))}return false};_.Hb=function fj(){return Hlb(OC(GC(SI,1),Uhe,1,5,[Em(this.c.e,this.b),Em(this.c.c,this.a),Mi(this.c,this.b,this.a)]))};_.Ib=function gj(){return '('+Em(this.c.e,this.b)+','+Em(this.c.c,this.a)+')='+Mi(this.c,this.b,this.a)};var JH=mdb(Zhe,'Tables/AbstractCell',2011);bcb(468,2011,{468:1,682:1},hj);_.a=0;_.b=0;_.d=0;var VE=mdb(Zhe,'ArrayTable/2',468);bcb(1927,1,{},ij);_.ld=function jj(a){return Ti(this.a,a)};var WE=mdb(Zhe,'ArrayTable/2methodref$getValue$Type',1927);bcb(1926,386,$he,kj);_.Xb=function lj(a){return Ti(this.a,a)};var XE=mdb(Zhe,'ArrayTable/3',1926);bcb(1979,1967,cie);_.$b=function nj(){ir(this.kc())};_.vc=function oj(){return new Sv(this)};_.lc=function pj(){return new Mub(this.kc(),this.gc())};var YG=mdb(Zhe,'Maps/IteratorBasedAbstractMap',1979);bcb(828,1979,cie);_.$b=function tj(){throw vbb(new bgb)};_._b=function uj(a){return sn(this.c,a)};_.kc=function vj(){return new Jj(this,this.c.b.c.gc())};_.lc=function wj(){return Zj(this.c.b.c.gc(),16,new Dj(this))};_.xc=function xj(a){var b;b=BD(tn(this.c,a),19);return !b?null:this.nd(b.a)};_.dc=function yj(){return this.c.b.c.dc()};_.ec=function zj(){return Xm(this.c)};_.zc=function Aj(a,b){var c;c=BD(tn(this.c,a),19);if(!c){throw vbb(new Wdb(this.md()+' '+a+' not in '+Xm(this.c)))}return this.od(c.a,b)};_.Bc=function Bj(a){throw vbb(new bgb)};_.gc=function Cj(){return this.c.b.c.gc()};var _E=mdb(Zhe,'ArrayTable/ArrayMap',828);bcb(1923,1,{},Dj);_.ld=function Ej(a){return qj(this.a,a)};var YE=mdb(Zhe,'ArrayTable/ArrayMap/0methodref$getEntry$Type',1923);bcb(1921,345,kie,Fj);_.cd=function Gj(){return rj(this.a,this.b)};_.dd=function Hj(){return this.a.nd(this.b)};_.ed=function Ij(a){return this.a.od(this.b,a)};_.b=0;var ZE=mdb(Zhe,'ArrayTable/ArrayMap/1',1921);bcb(1922,386,$he,Jj);_.Xb=function Kj(a){return qj(this.a,a)};var $E=mdb(Zhe,'ArrayTable/ArrayMap/2',1922);bcb(1920,828,cie,Lj);_.md=function Mj(){return 'Column'};_.nd=function Nj(a){return Mi(this.b,this.a,a)};_.od=function Oj(a,b){return Wi(this.b,this.a,a,b)};_.a=0;var bF=mdb(Zhe,'ArrayTable/Row',1920);bcb(829,828,cie,Rj);_.nd=function Tj(a){return new Lj(this.a,a)};_.zc=function Uj(a,b){return BD(b,83),Pj()};_.od=function Vj(a,b){return BD(b,83),Qj()};_.md=function Sj(){return 'Row'};var aF=mdb(Zhe,'ArrayTable/RowMap',829);bcb(1120,1,pie,_j);_.qd=function ak(){return this.a.qd()&-262};_.rd=function bk(){return this.a.rd()};_.Nb=function ck(a){this.a.Nb(new gk(a,this.b))};_.sd=function dk(a){return this.a.sd(new ek(a,this.b))};var lF=mdb(Zhe,'CollectSpliterators/1',1120);bcb(1121,1,qie,ek);_.td=function fk(a){this.a.td(this.b.Kb(a))};var dF=mdb(Zhe,'CollectSpliterators/1/lambda$0$Type',1121);bcb(1122,1,qie,gk);_.td=function hk(a){this.a.td(this.b.Kb(a))};var eF=mdb(Zhe,'CollectSpliterators/1/lambda$1$Type',1122);bcb(1123,1,pie,jk);_.qd=function kk(){return this.a};_.rd=function lk(){!!this.d&&(this.b=Deb(this.b,this.d.rd()));return Deb(this.b,0)};_.Nb=function mk(a){if(this.d){this.d.Nb(a);this.d=null}this.c.Nb(new rk(this.e,a));this.b=0};_.sd=function ok(a){while(true){if(!!this.d&&this.d.sd(a)){Kbb(this.b,rie)&&(this.b=Qbb(this.b,1));return true}else{this.d=null}if(!this.c.sd(new pk(this,this.e))){return false}}};_.a=0;_.b=0;var hF=mdb(Zhe,'CollectSpliterators/1FlatMapSpliterator',1123);bcb(1124,1,qie,pk);_.td=function qk(a){ik(this.a,this.b,a)};var fF=mdb(Zhe,'CollectSpliterators/1FlatMapSpliterator/lambda$0$Type',1124);bcb(1125,1,qie,rk);_.td=function sk(a){nk(this.b,this.a,a)};var gF=mdb(Zhe,'CollectSpliterators/1FlatMapSpliterator/lambda$1$Type',1125);bcb(1117,1,pie,tk);_.qd=function uk(){return 16464|this.b};_.rd=function vk(){return this.a.rd()};_.Nb=function wk(a){this.a.xe(new Ak(a,this.c))};_.sd=function xk(a){return this.a.ye(new yk(a,this.c))};_.b=0;var kF=mdb(Zhe,'CollectSpliterators/1WithCharacteristics',1117);bcb(1118,1,sie,yk);_.ud=function zk(a){this.a.td(this.b.ld(a))};var iF=mdb(Zhe,'CollectSpliterators/1WithCharacteristics/lambda$0$Type',1118);bcb(1119,1,sie,Ak);_.ud=function Bk(a){this.a.td(this.b.ld(a))};var jF=mdb(Zhe,'CollectSpliterators/1WithCharacteristics/lambda$1$Type',1119);bcb(245,1,tie);_.wd=function Hk(a){return this.vd(BD(a,245))};_.vd=function Gk(a){var b;if(a==(_k(),$k)){return 1}if(a==(Lk(),Kk)){return -1}b=(ex(),Fcb(this.a,a.a));if(b!=0){return b}return JD(this,519)==JD(a,519)?0:JD(this,519)?1:-1};_.zd=function Ik(){return this.a};_.Fb=function Jk(a){return Ek(this,a)};var qF=mdb(Zhe,'Cut',245);bcb(1761,245,tie,Mk);_.vd=function Nk(a){return a==this?0:1};_.xd=function Ok(a){throw vbb(new xcb)};_.yd=function Pk(a){a.a+='+\u221E)'};_.zd=function Qk(){throw vbb(new Zdb(uie))};_.Hb=function Rk(){return Zfb(),kCb(this)};_.Ad=function Sk(a){return false};_.Ib=function Tk(){return '+\u221E'};var Kk;var mF=mdb(Zhe,'Cut/AboveAll',1761);bcb(519,245,{245:1,519:1,3:1,35:1},Uk);_.xd=function Vk(a){Pfb((a.a+='(',a),this.a)};_.yd=function Wk(a){Kfb(Pfb(a,this.a),93)};_.Hb=function Xk(){return ~tb(this.a)};_.Ad=function Yk(a){return ex(),Fcb(this.a,a)<0};_.Ib=function Zk(){return '/'+this.a+'\\'};var nF=mdb(Zhe,'Cut/AboveValue',519);bcb(1760,245,tie,al);_.vd=function bl(a){return a==this?0:-1};_.xd=function cl(a){a.a+='(-\u221E'};_.yd=function dl(a){throw vbb(new xcb)};_.zd=function el(){throw vbb(new Zdb(uie))};_.Hb=function fl(){return Zfb(),kCb(this)};_.Ad=function gl(a){return true};_.Ib=function hl(){return '-\u221E'};var $k;var oF=mdb(Zhe,'Cut/BelowAll',1760);bcb(1762,245,tie,il);_.xd=function jl(a){Pfb((a.a+='[',a),this.a)};_.yd=function kl(a){Kfb(Pfb(a,this.a),41)};_.Hb=function ll(){return tb(this.a)};_.Ad=function ml(a){return ex(),Fcb(this.a,a)<=0};_.Ib=function nl(){return '\\'+this.a+'/'};var pF=mdb(Zhe,'Cut/BelowValue',1762);bcb(537,1,vie);_.Jc=function ql(a){reb(this,a)};_.Ib=function rl(){return tr(BD(Rb(this,'use Optional.orNull() instead of Optional.or(null)'),20).Kc())};var uF=mdb(Zhe,'FluentIterable',537);bcb(433,537,vie,sl);_.Kc=function tl(){return new Sr(ur(this.a.Kc(),new Sq))};var rF=mdb(Zhe,'FluentIterable/2',433);bcb(1046,537,vie,vl);_.Kc=function wl(){return ul(this)};var tF=mdb(Zhe,'FluentIterable/3',1046);bcb(708,386,$he,xl);_.Xb=function yl(a){return this.a[a].Kc()};var sF=mdb(Zhe,'FluentIterable/3/1',708);bcb(1972,1,{});_.Ib=function zl(){return fcb(this.Bd().b)};var BF=mdb(Zhe,'ForwardingObject',1972);bcb(1973,1972,wie);_.Bd=function Fl(){return this.Cd()};_.Jc=function Gl(a){reb(this,a)};_.Lc=function Jl(){return this.Oc()};_.Nc=function Ml(){return new Kub(this,0)};_.Oc=function Nl(){return new YAb(null,this.Nc())};_.Fc=function Al(a){return this.Cd(),enb()};_.Gc=function Bl(a){return this.Cd(),fnb()};_.$b=function Cl(){this.Cd(),gnb()};_.Hc=function Dl(a){return this.Cd().Hc(a)};_.Ic=function El(a){return this.Cd().Ic(a)};_.dc=function Hl(){return this.Cd().b.dc()};_.Kc=function Il(){return this.Cd().Kc()};_.Mc=function Kl(a){return this.Cd(),jnb()};_.gc=function Ll(){return this.Cd().b.gc()};_.Pc=function Ol(){return this.Cd().Pc()};_.Qc=function Pl(a){return this.Cd().Qc(a)};var vF=mdb(Zhe,'ForwardingCollection',1973);bcb(1980,28,xie);_.Kc=function Xl(){return this.Ed()};_.Fc=function Sl(a){throw vbb(new bgb)};_.Gc=function Tl(a){throw vbb(new bgb)};_.$b=function Ul(){throw vbb(new bgb)};_.Hc=function Vl(a){return a!=null&&ze(this,a,false)};_.Dd=function Wl(){switch(this.gc()){case 0:return im(),im(),hm;case 1:return im(),new my(Qb(this.Ed().Pb()));default:return new px(this,this.Pc());}};_.Mc=function Yl(a){throw vbb(new bgb)};var WF=mdb(Zhe,'ImmutableCollection',1980);bcb(712,1980,xie,Zl);_.Kc=function cm(){return vr(this.a.Kc())};_.Hc=function $l(a){return a!=null&&this.a.Hc(a)};_.Ic=function _l(a){return this.a.Ic(a)};_.dc=function am(){return this.a.dc()};_.Ed=function bm(){return vr(this.a.Kc())};_.gc=function dm(){return this.a.gc()};_.Pc=function em(){return this.a.Pc()};_.Qc=function fm(a){return this.a.Qc(a)};_.Ib=function gm(){return fcb(this.a)};var wF=mdb(Zhe,'ForwardingImmutableCollection',712);bcb(152,1980,yie);_.Kc=function sm(){return this.Ed()};_.Yc=function tm(){return this.Fd(0)};_.Zc=function vm(a){return this.Fd(a)};_.ad=function zm(a){ktb(this,a)};_.Nc=function Am(){return new Kub(this,16)};_.bd=function Cm(a,b){return this.Gd(a,b)};_.Vc=function lm(a,b){throw vbb(new bgb)};_.Wc=function mm(a,b){throw vbb(new bgb)};_.Fb=function om(a){return Ju(this,a)};_.Hb=function pm(){return Ku(this)};_.Xc=function qm(a){return a==null?-1:Lu(this,a)};_.Ed=function rm(){return this.Fd(0)};_.Fd=function um(a){return jm(this,a)};_.$c=function xm(a){throw vbb(new bgb)};_._c=function ym(a,b){throw vbb(new bgb)};_.Gd=function Bm(a,b){var c;return Dm((c=new $u(this),new Jib(c,a,b)))};var hm;var _F=mdb(Zhe,'ImmutableList',152);bcb(2006,152,yie);_.Kc=function Nm(){return vr(this.Hd().Kc())};_.bd=function Qm(a,b){return Dm(this.Hd().bd(a,b))};_.Hc=function Fm(a){return a!=null&&this.Hd().Hc(a)};_.Ic=function Gm(a){return this.Hd().Ic(a)};_.Fb=function Hm(a){return pb(this.Hd(),a)};_.Xb=function Im(a){return Em(this,a)};_.Hb=function Jm(){return tb(this.Hd())};_.Xc=function Km(a){return this.Hd().Xc(a)};_.dc=function Lm(){return this.Hd().dc()};_.Ed=function Mm(){return vr(this.Hd().Kc())};_.gc=function Om(){return this.Hd().gc()};_.Gd=function Pm(a,b){return Dm(this.Hd().bd(a,b))};_.Pc=function Rm(){return this.Hd().Qc(KC(SI,Uhe,1,this.Hd().gc(),5,1))};_.Qc=function Sm(a){return this.Hd().Qc(a)};_.Ib=function Tm(){return fcb(this.Hd())};var xF=mdb(Zhe,'ForwardingImmutableList',2006);bcb(714,1,Aie);_.vc=function cn(){return Wm(this)};_.wc=function en(a){stb(this,a)};_.ec=function jn(){return Xm(this)};_.yc=function kn(a,b,c){return ttb(this,a,b,c)};_.Cc=function rn(){return this.Ld()};_.$b=function Zm(){throw vbb(new bgb)};_._b=function $m(a){return this.xc(a)!=null};_.uc=function _m(a){return this.Ld().Hc(a)};_.Jd=function an(){return new jq(this)};_.Kd=function bn(){return new sq(this)};_.Fb=function dn(a){return Dv(this,a)};_.Hb=function gn(){return Wm(this).Hb()};_.dc=function hn(){return this.gc()==0};_.zc=function nn(a,b){return Ym()};_.Bc=function on(a){throw vbb(new bgb)};_.Ib=function pn(){return Jv(this)};_.Ld=function qn(){if(this.e){return this.e}return this.e=this.Kd()};_.c=null;_.d=null;_.e=null;var Um;var iG=mdb(Zhe,'ImmutableMap',714);bcb(715,714,Aie);_._b=function vn(a){return sn(this,a)};_.uc=function wn(a){return dob(this.b,a)};_.Id=function xn(){return Vn(new Ln(this))};_.Jd=function yn(){return Vn(gob(this.b))};_.Kd=function zn(){return Ql(),new Zl(hob(this.b))};_.Fb=function An(a){return fob(this.b,a)};_.xc=function Bn(a){return tn(this,a)};_.Hb=function Cn(){return tb(this.b.c)};_.dc=function Dn(){return this.b.c.dc()};_.gc=function En(){return this.b.c.gc()};_.Ib=function Fn(){return fcb(this.b.c)};var zF=mdb(Zhe,'ForwardingImmutableMap',715);bcb(1974,1973,Bie);_.Bd=function Gn(){return this.Md()};_.Cd=function Hn(){return this.Md()};_.Nc=function Kn(){return new Kub(this,1)};_.Fb=function In(a){return a===this||this.Md().Fb(a)};_.Hb=function Jn(){return this.Md().Hb()};var CF=mdb(Zhe,'ForwardingSet',1974);bcb(1069,1974,Bie,Ln);_.Bd=function Nn(){return eob(this.a.b)};_.Cd=function On(){return eob(this.a.b)};_.Hc=function Mn(b){if(JD(b,42)&&BD(b,42).cd()==null){return false}try{return Dob(eob(this.a.b),b)}catch(a){a=ubb(a);if(JD(a,205)){return false}else throw vbb(a)}};_.Md=function Pn(){return eob(this.a.b)};_.Qc=function Qn(a){var b;b=Eob(eob(this.a.b),a);eob(this.a.b).b.gc()=0?'+':'')+(c/60|0);b=kB($wnd.Math.abs(c)%60);return (Dpb(),Bpb)[this.q.getDay()]+' '+Cpb[this.q.getMonth()]+' '+kB(this.q.getDate())+' '+kB(this.q.getHours())+':'+kB(this.q.getMinutes())+':'+kB(this.q.getSeconds())+' GMT'+a+b+' '+this.q.getFullYear()};var $J=mdb(bie,'Date',199);bcb(1915,199,Cje,nB);_.a=false;_.b=0;_.c=0;_.d=0;_.e=0;_.f=0;_.g=false;_.i=0;_.j=0;_.k=0;_.n=0;_.o=0;_.p=0;var eI=mdb('com.google.gwt.i18n.shared.impl','DateRecord',1915);bcb(1966,1,{});_.fe=function oB(){return null};_.ge=function pB(){return null};_.he=function qB(){return null};_.ie=function rB(){return null};_.je=function sB(){return null};var nI=mdb(Dje,'JSONValue',1966);bcb(216,1966,{216:1},wB,xB);_.Fb=function yB(a){if(!JD(a,216)){return false}return qz(this.a,BD(a,216).a)};_.ee=function zB(){return DB};_.Hb=function AB(){return rz(this.a)};_.fe=function BB(){return this};_.Ib=function CB(){var a,b,c;c=new Wfb('[');for(b=0,a=this.a.length;b0&&(c.a+=',',c);Pfb(c,tB(this,b))}c.a+=']';return c.a};var fI=mdb(Dje,'JSONArray',216);bcb(483,1966,{483:1},HB);_.ee=function IB(){return LB};_.ge=function JB(){return this};_.Ib=function KB(){return Bcb(),''+this.a};_.a=false;var EB,FB;var gI=mdb(Dje,'JSONBoolean',483);bcb(985,60,Tie,MB);var hI=mdb(Dje,'JSONException',985);bcb(1023,1966,{},PB);_.ee=function QB(){return SB};_.Ib=function RB(){return Xhe};var NB;var iI=mdb(Dje,'JSONNull',1023);bcb(258,1966,{258:1},TB);_.Fb=function UB(a){if(!JD(a,258)){return false}return this.a==BD(a,258).a};_.ee=function VB(){return ZB};_.Hb=function WB(){return Hdb(this.a)};_.he=function XB(){return this};_.Ib=function YB(){return this.a+''};_.a=0;var jI=mdb(Dje,'JSONNumber',258);bcb(183,1966,{183:1},eC,fC);_.Fb=function gC(a){if(!JD(a,183)){return false}return qz(this.a,BD(a,183).a)};_.ee=function hC(){return lC};_.Hb=function iC(){return rz(this.a)};_.ie=function jC(){return this};_.Ib=function kC(){var a,b,c,d,e,f,g;g=new Wfb('{');a=true;f=$B(this,KC(ZI,nie,2,0,6,1));for(c=f,d=0,e=c.length;d=0?':'+this.c:'')+')'};_.c=0;var VI=mdb(Phe,'StackTraceElement',310);zD={3:1,475:1,35:1,2:1};var ZI=mdb(Phe,Vie,2);bcb(107,418,{475:1},Hfb,Ifb,Jfb);var WI=mdb(Phe,'StringBuffer',107);bcb(100,418,{475:1},Ufb,Vfb,Wfb);var XI=mdb(Phe,'StringBuilder',100);bcb(687,73,Mje,Xfb);var YI=mdb(Phe,'StringIndexOutOfBoundsException',687);bcb(2043,1,{});var Yfb;bcb(844,1,{},_fb);_.Kb=function agb(a){return BD(a,78).e};var $I=mdb(Phe,'Throwable/lambda$0$Type',844);bcb(41,60,{3:1,102:1,60:1,78:1,41:1},bgb,cgb);var aJ=mdb(Phe,'UnsupportedOperationException',41);bcb(240,236,{3:1,35:1,236:1,240:1},sgb,tgb);_.wd=function wgb(a){return mgb(this,BD(a,240))};_.ke=function xgb(){return Hcb(rgb(this))};_.Fb=function ygb(a){var b;if(this===a){return true}if(JD(a,240)){b=BD(a,240);return this.e==b.e&&mgb(this,b)==0}return false};_.Hb=function zgb(){var a;if(this.b!=0){return this.b}if(this.a<54){a=Cbb(this.f);this.b=Tbb(xbb(a,-1));this.b=33*this.b+Tbb(xbb(Obb(a,32),-1));this.b=17*this.b+QD(this.e);return this.b}this.b=17*Ngb(this.c)+QD(this.e);return this.b};_.Ib=function Agb(){return rgb(this)};_.a=0;_.b=0;_.d=0;_.e=0;_.f=0;var dgb,egb,fgb,ggb,hgb,igb,jgb,kgb;var bJ=mdb('java.math','BigDecimal',240);bcb(91,236,{3:1,35:1,236:1,91:1},Tgb,Ugb,Vgb,Wgb,Xgb,Ygb);_.wd=function $gb(a){return Igb(this,BD(a,91))};_.ke=function _gb(){return Hcb(shb(this,0))};_.Fb=function ahb(a){return Kgb(this,a)};_.Hb=function chb(){return Ngb(this)};_.Ib=function ehb(){return shb(this,0)};_.b=-2;_.c=0;_.d=0;_.e=0;var Bgb,Cgb,Dgb,Egb,Fgb,Ggb;var cJ=mdb('java.math','BigInteger',91);var nhb,ohb;var Bhb,Chb;bcb(488,1967,cie);_.$b=function Xhb(){Uhb(this)};_._b=function Yhb(a){return Mhb(this,a)};_.uc=function Zhb(a){return Nhb(this,a,this.g)||Nhb(this,a,this.f)};_.vc=function $hb(){return new eib(this)};_.xc=function _hb(a){return Ohb(this,a)};_.zc=function aib(a,b){return Rhb(this,a,b)};_.Bc=function bib(a){return Thb(this,a)};_.gc=function cib(){return Vhb(this)};var gJ=mdb(bie,'AbstractHashMap',488);bcb(261,eie,fie,eib);_.$b=function fib(){this.a.$b()};_.Hc=function gib(a){return dib(this,a)};_.Kc=function hib(){return new nib(this.a)};_.Mc=function iib(a){var b;if(dib(this,a)){b=BD(a,42).cd();this.a.Bc(b);return true}return false};_.gc=function jib(){return this.a.gc()};var fJ=mdb(bie,'AbstractHashMap/EntrySet',261);bcb(262,1,aie,nib);_.Nb=function oib(a){Rrb(this,a)};_.Pb=function qib(){return lib(this)};_.Ob=function pib(){return this.b};_.Qb=function rib(){mib(this)};_.b=false;var eJ=mdb(bie,'AbstractHashMap/EntrySetIterator',262);bcb(417,1,aie,vib);_.Nb=function wib(a){Rrb(this,a)};_.Ob=function xib(){return sib(this)};_.Pb=function yib(){return tib(this)};_.Qb=function zib(){uib(this)};_.b=0;_.c=-1;var hJ=mdb(bie,'AbstractList/IteratorImpl',417);bcb(96,417,jie,Bib);_.Qb=function Hib(){uib(this)};_.Rb=function Cib(a){Aib(this,a)};_.Sb=function Dib(){return this.b>0};_.Tb=function Eib(){return this.b};_.Ub=function Fib(){return sCb(this.b>0),this.a.Xb(this.c=--this.b)};_.Vb=function Gib(){return this.b-1};_.Wb=function Iib(a){yCb(this.c!=-1);this.a._c(this.c,a)};var iJ=mdb(bie,'AbstractList/ListIteratorImpl',96);bcb(219,52,Lie,Jib);_.Vc=function Kib(a,b){wCb(a,this.b);this.c.Vc(this.a+a,b);++this.b};_.Xb=function Lib(a){tCb(a,this.b);return this.c.Xb(this.a+a)};_.$c=function Mib(a){var b;tCb(a,this.b);b=this.c.$c(this.a+a);--this.b;return b};_._c=function Nib(a,b){tCb(a,this.b);return this.c._c(this.a+a,b)};_.gc=function Oib(){return this.b};_.a=0;_.b=0;var jJ=mdb(bie,'AbstractList/SubList',219);bcb(384,eie,fie,Pib);_.$b=function Qib(){this.a.$b()};_.Hc=function Rib(a){return this.a._b(a)};_.Kc=function Sib(){var a;return a=this.a.vc().Kc(),new Vib(a)};_.Mc=function Tib(a){if(this.a._b(a)){this.a.Bc(a);return true}return false};_.gc=function Uib(){return this.a.gc()};var mJ=mdb(bie,'AbstractMap/1',384);bcb(691,1,aie,Vib);_.Nb=function Wib(a){Rrb(this,a)};_.Ob=function Xib(){return this.a.Ob()};_.Pb=function Yib(){var a;return a=BD(this.a.Pb(),42),a.cd()};_.Qb=function Zib(){this.a.Qb()};var lJ=mdb(bie,'AbstractMap/1/1',691);bcb(226,28,die,$ib);_.$b=function _ib(){this.a.$b()};_.Hc=function ajb(a){return this.a.uc(a)};_.Kc=function bjb(){var a;return a=this.a.vc().Kc(),new djb(a)};_.gc=function cjb(){return this.a.gc()};var oJ=mdb(bie,'AbstractMap/2',226);bcb(294,1,aie,djb);_.Nb=function ejb(a){Rrb(this,a)};_.Ob=function fjb(){return this.a.Ob()};_.Pb=function gjb(){var a;return a=BD(this.a.Pb(),42),a.dd()};_.Qb=function hjb(){this.a.Qb()};var nJ=mdb(bie,'AbstractMap/2/1',294);bcb(484,1,{484:1,42:1});_.Fb=function jjb(a){var b;if(!JD(a,42)){return false}b=BD(a,42);return wtb(this.d,b.cd())&&wtb(this.e,b.dd())};_.cd=function kjb(){return this.d};_.dd=function ljb(){return this.e};_.Hb=function mjb(){return xtb(this.d)^xtb(this.e)};_.ed=function njb(a){return ijb(this,a)};_.Ib=function ojb(){return this.d+'='+this.e};var pJ=mdb(bie,'AbstractMap/AbstractEntry',484);bcb(383,484,{484:1,383:1,42:1},pjb);var qJ=mdb(bie,'AbstractMap/SimpleEntry',383);bcb(1984,1,_je);_.Fb=function qjb(a){var b;if(!JD(a,42)){return false}b=BD(a,42);return wtb(this.cd(),b.cd())&&wtb(this.dd(),b.dd())};_.Hb=function rjb(){return xtb(this.cd())^xtb(this.dd())};_.Ib=function sjb(){return this.cd()+'='+this.dd()};var rJ=mdb(bie,lie,1984);bcb(1992,1967,gie);_.tc=function vjb(a){return tjb(this,a)};_._b=function wjb(a){return ujb(this,a)};_.vc=function xjb(){return new Bjb(this)};_.xc=function yjb(a){var b;b=a;return Wd(Awb(this,b))};_.ec=function Ajb(){return new Gjb(this)};var wJ=mdb(bie,'AbstractNavigableMap',1992);bcb(739,eie,fie,Bjb);_.Hc=function Cjb(a){return JD(a,42)&&tjb(this.b,BD(a,42))};_.Kc=function Djb(){return new Ywb(this.b)};_.Mc=function Ejb(a){var b;if(JD(a,42)){b=BD(a,42);return Kwb(this.b,b)}return false};_.gc=function Fjb(){return this.b.c};var tJ=mdb(bie,'AbstractNavigableMap/EntrySet',739);bcb(493,eie,iie,Gjb);_.Nc=function Mjb(){return new Rub(this)};_.$b=function Hjb(){zwb(this.a)};_.Hc=function Ijb(a){return ujb(this.a,a)};_.Kc=function Jjb(){var a;return a=new Ywb((new cxb(this.a)).b),new Njb(a)};_.Mc=function Kjb(a){if(ujb(this.a,a)){Jwb(this.a,a);return true}return false};_.gc=function Ljb(){return this.a.c};var vJ=mdb(bie,'AbstractNavigableMap/NavigableKeySet',493);bcb(494,1,aie,Njb);_.Nb=function Ojb(a){Rrb(this,a)};_.Ob=function Pjb(){return sib(this.a.a)};_.Pb=function Qjb(){var a;return a=Wwb(this.a),a.cd()};_.Qb=function Rjb(){Xwb(this.a)};var uJ=mdb(bie,'AbstractNavigableMap/NavigableKeySet/1',494);bcb(2004,28,die);_.Fc=function Sjb(a){return zCb(cub(this,a)),true};_.Gc=function Tjb(a){uCb(a);mCb(a!=this,"Can't add a queue to itself");return ye(this,a)};_.$b=function Ujb(){while(dub(this)!=null);};var xJ=mdb(bie,'AbstractQueue',2004);bcb(302,28,{4:1,20:1,28:1,14:1},jkb,kkb);_.Fc=function lkb(a){return Xjb(this,a),true};_.$b=function nkb(){Yjb(this)};_.Hc=function okb(a){return Zjb(new xkb(this),a)};_.dc=function pkb(){return akb(this)};_.Kc=function qkb(){return new xkb(this)};_.Mc=function rkb(a){return dkb(new xkb(this),a)};_.gc=function skb(){return this.c-this.b&this.a.length-1};_.Nc=function tkb(){return new Kub(this,272)};_.Qc=function ukb(a){var b;b=this.c-this.b&this.a.length-1;a.lengthb&&NC(a,b,null);return a};_.b=0;_.c=0;var BJ=mdb(bie,'ArrayDeque',302);bcb(446,1,aie,xkb);_.Nb=function ykb(a){Rrb(this,a)};_.Ob=function zkb(){return this.a!=this.b};_.Pb=function Akb(){return vkb(this)};_.Qb=function Bkb(){wkb(this)};_.a=0;_.b=0;_.c=-1;var AJ=mdb(bie,'ArrayDeque/IteratorImpl',446);bcb(12,52,ake,Rkb,Skb,Tkb);_.Vc=function Ukb(a,b){Dkb(this,a,b)};_.Fc=function Vkb(a){return Ekb(this,a)};_.Wc=function Wkb(a,b){return Fkb(this,a,b)};_.Gc=function Xkb(a){return Gkb(this,a)};_.$b=function Ykb(){this.c=KC(SI,Uhe,1,0,5,1)};_.Hc=function Zkb(a){return Jkb(this,a,0)!=-1};_.Jc=function $kb(a){Hkb(this,a)};_.Xb=function _kb(a){return Ikb(this,a)};_.Xc=function alb(a){return Jkb(this,a,0)};_.dc=function blb(){return this.c.length==0};_.Kc=function clb(){return new olb(this)};_.$c=function dlb(a){return Kkb(this,a)};_.Mc=function elb(a){return Lkb(this,a)};_.Ud=function flb(a,b){Mkb(this,a,b)};_._c=function glb(a,b){return Nkb(this,a,b)};_.gc=function hlb(){return this.c.length};_.ad=function ilb(a){Okb(this,a)};_.Pc=function jlb(){return Pkb(this)};_.Qc=function klb(a){return Qkb(this,a)};var DJ=mdb(bie,'ArrayList',12);bcb(7,1,aie,olb);_.Nb=function plb(a){Rrb(this,a)};_.Ob=function qlb(){return llb(this)};_.Pb=function rlb(){return mlb(this)};_.Qb=function slb(){nlb(this)};_.a=0;_.b=-1;var CJ=mdb(bie,'ArrayList/1',7);bcb(2013,$wnd.Function,{},Ylb);_.te=function Zlb(a,b){return Kdb(a,b)};bcb(154,52,bke,amb);_.Hc=function bmb(a){return Bt(this,a)!=-1};_.Jc=function cmb(a){var b,c,d,e;uCb(a);for(c=this.a,d=0,e=c.length;d>>0,a.toString(16))};_.f=0;_.i=Qje;var PM=mdb(Gke,'CNode',57);bcb(814,1,{},zDb);var OM=mdb(Gke,'CNode/CNodeBuilder',814);var EDb;bcb(1525,1,{},GDb);_.Oe=function HDb(a,b){return 0};_.Pe=function IDb(a,b){return 0};var QM=mdb(Gke,Ike,1525);bcb(1790,1,{},JDb);_.Le=function KDb(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p;j=Pje;for(d=new olb(a.a.b);d.ad.d.c||d.d.c==f.d.c&&d.d.b0?a+this.n.d+this.n.a:0};_.Se=function HHb(){var a,b,c,d,e;e=0;if(this.e){this.b?(e=this.b.a):!!this.a[1][1]&&(e=this.a[1][1].Se())}else if(this.g){e=EHb(this,yHb(this,null,true))}else{for(b=(gHb(),OC(GC(pN,1),Kie,232,0,[dHb,eHb,fHb])),c=0,d=b.length;c0?e+this.n.b+this.n.c:0};_.Te=function IHb(){var a,b,c,d,e;if(this.g){a=yHb(this,null,false);for(c=(gHb(),OC(GC(pN,1),Kie,232,0,[dHb,eHb,fHb])),d=0,e=c.length;d0){d[0]+=this.d;c-=d[0]}if(d[2]>0){d[2]+=this.d;c-=d[2]}this.c.a=$wnd.Math.max(0,c);this.c.d=b.d+a.d+(this.c.a-c)/2;d[1]=$wnd.Math.max(d[1],c);uHb(this,eHb,b.d+a.d+d[0]-(d[1]-c)/2,d)};_.b=null;_.d=0;_.e=false;_.f=false;_.g=false;var rHb=0,sHb=0;var rN=mdb(fle,'GridContainerCell',1473);bcb(461,22,{3:1,35:1,22:1,461:1},OHb);var KHb,LHb,MHb;var sN=ndb(fle,'HorizontalLabelAlignment',461,CI,QHb,PHb);var RHb;bcb(306,212,{212:1,306:1},aIb,bIb,cIb);_.Re=function dIb(){return YHb(this)};_.Se=function eIb(){return ZHb(this)};_.a=0;_.c=false;var tN=mdb(fle,'LabelCell',306);bcb(244,326,{212:1,326:1,244:1},mIb);_.Re=function nIb(){return fIb(this)};_.Se=function oIb(){return gIb(this)};_.Te=function rIb(){hIb(this)};_.Ue=function sIb(){iIb(this)};_.b=0;_.c=0;_.d=false;var yN=mdb(fle,'StripContainerCell',244);bcb(1626,1,Oie,tIb);_.Mb=function uIb(a){return pIb(BD(a,212))};var uN=mdb(fle,'StripContainerCell/lambda$0$Type',1626);bcb(1627,1,{},vIb);_.Fe=function wIb(a){return BD(a,212).Se()};var vN=mdb(fle,'StripContainerCell/lambda$1$Type',1627);bcb(1628,1,Oie,xIb);_.Mb=function yIb(a){return qIb(BD(a,212))};var wN=mdb(fle,'StripContainerCell/lambda$2$Type',1628);bcb(1629,1,{},zIb);_.Fe=function AIb(a){return BD(a,212).Re()};var xN=mdb(fle,'StripContainerCell/lambda$3$Type',1629);bcb(462,22,{3:1,35:1,22:1,462:1},FIb);var BIb,CIb,DIb;var zN=ndb(fle,'VerticalLabelAlignment',462,CI,HIb,GIb);var IIb;bcb(789,1,{},LIb);_.c=0;_.d=0;_.k=0;_.s=0;_.t=0;_.v=false;_.w=0;_.D=false;var CN=mdb(nle,'NodeContext',789);bcb(1471,1,Dke,OIb);_.ue=function PIb(a,b){return NIb(BD(a,61),BD(b,61))};_.Fb=function QIb(a){return this===a};_.ve=function RIb(){return new tpb(this)};var AN=mdb(nle,'NodeContext/0methodref$comparePortSides$Type',1471);bcb(1472,1,Dke,SIb);_.ue=function TIb(a,b){return MIb(BD(a,111),BD(b,111))};_.Fb=function UIb(a){return this===a};_.ve=function VIb(){return new tpb(this)};var BN=mdb(nle,'NodeContext/1methodref$comparePortContexts$Type',1472);bcb(159,22,{3:1,35:1,22:1,159:1},tJb);var WIb,XIb,YIb,ZIb,$Ib,_Ib,aJb,bJb,cJb,dJb,eJb,fJb,gJb,hJb,iJb,jJb,kJb,lJb,mJb,nJb,oJb,pJb;var DN=ndb(nle,'NodeLabelLocation',159,CI,wJb,vJb);var xJb;bcb(111,1,{111:1},AJb);_.a=false;var EN=mdb(nle,'PortContext',111);bcb(1476,1,qie,TJb);_.td=function UJb(a){WHb(BD(a,306))};var FN=mdb(qle,rle,1476);bcb(1477,1,Oie,VJb);_.Mb=function WJb(a){return !!BD(a,111).c};var GN=mdb(qle,sle,1477);bcb(1478,1,qie,XJb);_.td=function YJb(a){WHb(BD(a,111).c)};var HN=mdb(qle,'LabelPlacer/lambda$2$Type',1478);var ZJb;bcb(1475,1,qie,fKb);_.td=function gKb(a){$Jb();zJb(BD(a,111))};var IN=mdb(qle,'NodeLabelAndSizeUtilities/lambda$0$Type',1475);bcb(790,1,qie,mKb);_.td=function nKb(a){kKb(this.b,this.c,this.a,BD(a,181))};_.a=false;_.c=false;var JN=mdb(qle,'NodeLabelCellCreator/lambda$0$Type',790);bcb(1474,1,qie,tKb);_.td=function uKb(a){sKb(this.a,BD(a,181))};var KN=mdb(qle,'PortContextCreator/lambda$0$Type',1474);var BKb;bcb(1829,1,{},VKb);var MN=mdb(ule,'GreedyRectangleStripOverlapRemover',1829);bcb(1830,1,Dke,XKb);_.ue=function YKb(a,b){return WKb(BD(a,222),BD(b,222))};_.Fb=function ZKb(a){return this===a};_.ve=function $Kb(){return new tpb(this)};var LN=mdb(ule,'GreedyRectangleStripOverlapRemover/0methodref$compareByYCoordinate$Type',1830);bcb(1786,1,{},fLb);_.a=5;_.e=0;var SN=mdb(ule,'RectangleStripOverlapRemover',1786);bcb(1787,1,Dke,jLb);_.ue=function kLb(a,b){return gLb(BD(a,222),BD(b,222))};_.Fb=function lLb(a){return this===a};_.ve=function mLb(){return new tpb(this)};var NN=mdb(ule,'RectangleStripOverlapRemover/0methodref$compareLeftRectangleBorders$Type',1787);bcb(1789,1,Dke,nLb);_.ue=function oLb(a,b){return hLb(BD(a,222),BD(b,222))};_.Fb=function pLb(a){return this===a};_.ve=function qLb(){return new tpb(this)};var ON=mdb(ule,'RectangleStripOverlapRemover/1methodref$compareRightRectangleBorders$Type',1789);bcb(406,22,{3:1,35:1,22:1,406:1},wLb);var rLb,sLb,tLb,uLb;var PN=ndb(ule,'RectangleStripOverlapRemover/OverlapRemovalDirection',406,CI,yLb,xLb);var zLb;bcb(222,1,{222:1},BLb);var QN=mdb(ule,'RectangleStripOverlapRemover/RectangleNode',222);bcb(1788,1,qie,CLb);_.td=function DLb(a){aLb(this.a,BD(a,222))};var RN=mdb(ule,'RectangleStripOverlapRemover/lambda$1$Type',1788);bcb(1304,1,Dke,GLb);_.ue=function HLb(a,b){return FLb(BD(a,167),BD(b,167))};_.Fb=function ILb(a){return this===a};_.ve=function JLb(){return new tpb(this)};var WN=mdb(wle,'PolyominoCompactor/CornerCasesGreaterThanRestComparator',1304);bcb(1307,1,{},KLb);_.Kb=function LLb(a){return BD(a,324).a};var TN=mdb(wle,'PolyominoCompactor/CornerCasesGreaterThanRestComparator/lambda$0$Type',1307);bcb(1308,1,Oie,MLb);_.Mb=function NLb(a){return BD(a,323).a};var UN=mdb(wle,'PolyominoCompactor/CornerCasesGreaterThanRestComparator/lambda$1$Type',1308);bcb(1309,1,Oie,OLb);_.Mb=function PLb(a){return BD(a,323).a};var VN=mdb(wle,'PolyominoCompactor/CornerCasesGreaterThanRestComparator/lambda$2$Type',1309);bcb(1302,1,Dke,RLb);_.ue=function SLb(a,b){return QLb(BD(a,167),BD(b,167))};_.Fb=function TLb(a){return this===a};_.ve=function ULb(){return new tpb(this)};var YN=mdb(wle,'PolyominoCompactor/MinNumOfExtensionDirectionsComparator',1302);bcb(1305,1,{},VLb);_.Kb=function WLb(a){return BD(a,324).a};var XN=mdb(wle,'PolyominoCompactor/MinNumOfExtensionDirectionsComparator/lambda$0$Type',1305);bcb(767,1,Dke,YLb);_.ue=function ZLb(a,b){return XLb(BD(a,167),BD(b,167))};_.Fb=function $Lb(a){return this===a};_.ve=function _Lb(){return new tpb(this)};var ZN=mdb(wle,'PolyominoCompactor/MinNumOfExtensionsComparator',767);bcb(1300,1,Dke,bMb);_.ue=function cMb(a,b){return aMb(BD(a,321),BD(b,321))};_.Fb=function dMb(a){return this===a};_.ve=function eMb(){return new tpb(this)};var _N=mdb(wle,'PolyominoCompactor/MinPerimeterComparator',1300);bcb(1301,1,Dke,gMb);_.ue=function hMb(a,b){return fMb(BD(a,321),BD(b,321))};_.Fb=function iMb(a){return this===a};_.ve=function jMb(){return new tpb(this)};var $N=mdb(wle,'PolyominoCompactor/MinPerimeterComparatorWithShape',1301);bcb(1303,1,Dke,lMb);_.ue=function mMb(a,b){return kMb(BD(a,167),BD(b,167))};_.Fb=function nMb(a){return this===a};_.ve=function oMb(){return new tpb(this)};var bO=mdb(wle,'PolyominoCompactor/SingleExtensionSideGreaterThanRestComparator',1303);bcb(1306,1,{},pMb);_.Kb=function qMb(a){return BD(a,324).a};var aO=mdb(wle,'PolyominoCompactor/SingleExtensionSideGreaterThanRestComparator/lambda$0$Type',1306);bcb(777,1,{},tMb);_.Ce=function uMb(a,b){return sMb(this,BD(a,46),BD(b,167))};var cO=mdb(wle,'SuccessorCombination',777);bcb(644,1,{},wMb);_.Ce=function xMb(a,b){var c;return vMb((c=BD(a,46),BD(b,167),c))};var dO=mdb(wle,'SuccessorJitter',644);bcb(643,1,{},zMb);_.Ce=function AMb(a,b){var c;return yMb((c=BD(a,46),BD(b,167),c))};var eO=mdb(wle,'SuccessorLineByLine',643);bcb(568,1,{},CMb);_.Ce=function DMb(a,b){var c;return BMb((c=BD(a,46),BD(b,167),c))};var fO=mdb(wle,'SuccessorManhattan',568);bcb(1356,1,{},FMb);_.Ce=function GMb(a,b){var c;return EMb((c=BD(a,46),BD(b,167),c))};var gO=mdb(wle,'SuccessorMaxNormWindingInMathPosSense',1356);bcb(400,1,{},JMb);_.Ce=function KMb(a,b){return HMb(this,a,b)};_.c=false;_.d=false;_.e=false;_.f=false;var iO=mdb(wle,'SuccessorQuadrantsGeneric',400);bcb(1357,1,{},LMb);_.Kb=function MMb(a){return BD(a,324).a};var hO=mdb(wle,'SuccessorQuadrantsGeneric/lambda$0$Type',1357);bcb(323,22,{3:1,35:1,22:1,323:1},SMb);_.a=false;var NMb,OMb,PMb,QMb;var jO=ndb(Ble,Cle,323,CI,UMb,TMb);var VMb;bcb(1298,1,{});_.Ib=function bNb(){var a,b,c,d,e,f;c=' ';a=meb(0);for(e=0;e=0?'b'+a+'['+fRb(this.a)+']':'b['+fRb(this.a)+']'}return 'b_'+FCb(this)};var YO=mdb(jme,'FBendpoint',559);bcb(282,134,{3:1,282:1,94:1,134:1},gRb);_.Ib=function hRb(){return fRb(this)};var ZO=mdb(jme,'FEdge',282);bcb(231,134,{3:1,231:1,94:1,134:1},kRb);var $O=mdb(jme,'FGraph',231);bcb(447,357,{3:1,447:1,357:1,94:1,134:1},mRb);_.Ib=function nRb(){return this.b==null||this.b.length==0?'l['+fRb(this.a)+']':'l_'+this.b};var _O=mdb(jme,'FLabel',447);bcb(144,357,{3:1,144:1,357:1,94:1,134:1},pRb);_.Ib=function qRb(){return oRb(this)};_.b=0;var aP=mdb(jme,'FNode',144);bcb(2003,1,{});_.bf=function vRb(a){rRb(this,a)};_.cf=function wRb(){sRb(this)};_.d=0;var cP=mdb(lme,'AbstractForceModel',2003);bcb(631,2003,{631:1},xRb);_.af=function zRb(a,b){var c,d,e,f,g;uRb(this.f,a,b);e=c7c(R6c(b.d),a.d);g=$wnd.Math.sqrt(e.a*e.a+e.b*e.b);d=$wnd.Math.max(0,g-U6c(a.e)/2-U6c(b.e)/2);c=jRb(this.e,a,b);c>0?(f=-yRb(d,this.c)*c):(f=CRb(d,this.b)*BD(vNb(a,(wSb(),oSb)),19).a);Y6c(e,f/g);return e};_.bf=function ARb(a){rRb(this,a);this.a=BD(vNb(a,(wSb(),eSb)),19).a;this.c=Edb(ED(vNb(a,uSb)));this.b=Edb(ED(vNb(a,qSb)))};_.df=function BRb(a){return a0&&(f-=ERb(d,this.a)*c);Y6c(e,f*this.b/g);return e};_.bf=function GRb(a){var b,c,d,e,f,g,h;rRb(this,a);this.b=Edb(ED(vNb(a,(wSb(),vSb))));this.c=this.b/BD(vNb(a,eSb),19).a;d=a.e.c.length;f=0;e=0;for(h=new olb(a.e);h.a0};_.a=0;_.b=0;_.c=0;var eP=mdb(lme,'FruchtermanReingoldModel',632);bcb(849,1,ale,TRb);_.Qe=function URb(a){t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,mme),''),'Force Model'),'Determines the model for force calculation.'),MRb),(_5c(),V5c)),gP),pqb((N5c(),L5c)))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,nme),''),'Iterations'),'The number of iterations on the force model.'),meb(300)),X5c),JI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,ome),''),'Repulsive Power'),'Determines how many bend points are added to the edge; such bend points are regarded as repelling particles in the force model'),meb(0)),X5c),JI),pqb(I5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,pme),''),'FR Temperature'),'The temperature is used as a scaling factor for particle displacements.'),qme),U5c),BI),pqb(L5c))));o4c(a,pme,mme,RRb);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,rme),''),'Eades Repulsion'),"Factor for repulsive forces in Eades' model."),5),U5c),BI),pqb(L5c))));o4c(a,rme,mme,ORb);xSb((new ySb,a))};var KRb,LRb,MRb,NRb,ORb,PRb,QRb,RRb;var fP=mdb(sme,'ForceMetaDataProvider',849);bcb(424,22,{3:1,35:1,22:1,424:1},YRb);var VRb,WRb;var gP=ndb(sme,'ForceModelStrategy',424,CI,$Rb,ZRb);var _Rb;bcb(988,1,ale,ySb);_.Qe=function zSb(a){xSb(a)};var bSb,cSb,dSb,eSb,fSb,gSb,hSb,iSb,jSb,kSb,lSb,mSb,nSb,oSb,pSb,qSb,rSb,sSb,tSb,uSb,vSb;var iP=mdb(sme,'ForceOptions',988);bcb(989,1,{},ASb);_.$e=function BSb(){var a;return a=new ZQb,a};_._e=function CSb(a){};var hP=mdb(sme,'ForceOptions/ForceFactory',989);var DSb,ESb,FSb,GSb;bcb(850,1,ale,PSb);_.Qe=function QSb(a){t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Mme),''),'Fixed Position'),'Prevent that the node is moved by the layout algorithm.'),(Bcb(),false)),(_5c(),T5c)),wI),pqb((N5c(),K5c)))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Nme),''),'Desired Edge Length'),'Either specified for parent nodes or for individual edges, where the latter takes higher precedence.'),100),U5c),BI),qqb(L5c,OC(GC(e1,1),Kie,175,0,[I5c])))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Ome),''),'Layout Dimension'),'Dimensions that are permitted to be altered during layout.'),KSb),V5c),oP),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Pme),''),'Stress Epsilon'),'Termination criterion for the iterative process.'),qme),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Qme),''),'Iteration Limit'),"Maximum number of performed iterations. Takes higher precedence than 'epsilon'."),meb(Ohe)),X5c),JI),pqb(L5c))));cTb((new dTb,a))};var ISb,JSb,KSb,LSb,MSb,NSb;var jP=mdb(sme,'StressMetaDataProvider',850);bcb(992,1,ale,dTb);_.Qe=function eTb(a){cTb(a)};var RSb,SSb,TSb,USb,VSb,WSb,XSb,YSb,ZSb,$Sb,_Sb,aTb;var lP=mdb(sme,'StressOptions',992);bcb(993,1,{},fTb);_.$e=function gTb(){var a;return a=new iTb,a};_._e=function hTb(a){};var kP=mdb(sme,'StressOptions/StressFactory',993);bcb(1128,209,Mle,iTb);_.Ze=function jTb(a,b){var c,d,e,f,g;Odd(b,Sme,1);Ccb(DD(hkd(a,(bTb(),VSb))))?Ccb(DD(hkd(a,_Sb)))||$Cb((c=new _Cb((Pgd(),new bhd(a))),c)):WQb(new ZQb,a,Udd(b,1));e=TQb(a);d=LQb(this.a,e);for(g=d.Kc();g.Ob();){f=BD(g.Pb(),231);if(f.e.c.length<=1){continue}sTb(this.b,f);qTb(this.b);Hkb(f.d,new kTb)}e=KQb(d);SQb(e);Qdd(b)};var nP=mdb(Ume,'StressLayoutProvider',1128);bcb(1129,1,qie,kTb);_.td=function lTb(a){lRb(BD(a,447))};var mP=mdb(Ume,'StressLayoutProvider/lambda$0$Type',1129);bcb(990,1,{},tTb);_.c=0;_.e=0;_.g=0;var qP=mdb(Ume,'StressMajorization',990);bcb(379,22,{3:1,35:1,22:1,379:1},zTb);var vTb,wTb,xTb;var oP=ndb(Ume,'StressMajorization/Dimension',379,CI,BTb,ATb);var CTb;bcb(991,1,Dke,ETb);_.ue=function FTb(a,b){return uTb(this.a,BD(a,144),BD(b,144))};_.Fb=function GTb(a){return this===a};_.ve=function HTb(){return new tpb(this)};var pP=mdb(Ume,'StressMajorization/lambda$0$Type',991);bcb(1229,1,{},PTb);var tP=mdb(Wme,'ElkLayered',1229);bcb(1230,1,qie,STb);_.td=function TTb(a){QTb(BD(a,37))};var rP=mdb(Wme,'ElkLayered/lambda$0$Type',1230);bcb(1231,1,qie,UTb);_.td=function VTb(a){RTb(this.a,BD(a,37))};var sP=mdb(Wme,'ElkLayered/lambda$1$Type',1231);bcb(1263,1,{},bUb);var WTb,XTb,YTb;var xP=mdb(Wme,'GraphConfigurator',1263);bcb(759,1,qie,dUb);_.td=function eUb(a){$Tb(this.a,BD(a,10))};var uP=mdb(Wme,'GraphConfigurator/lambda$0$Type',759);bcb(760,1,{},fUb);_.Kb=function gUb(a){return ZTb(),new YAb(null,new Kub(BD(a,29).a,16))};var vP=mdb(Wme,'GraphConfigurator/lambda$1$Type',760);bcb(761,1,qie,hUb);_.td=function iUb(a){$Tb(this.a,BD(a,10))};var wP=mdb(Wme,'GraphConfigurator/lambda$2$Type',761);bcb(1127,209,Mle,jUb);_.Ze=function kUb(a,b){var c;c=U1b(new a2b,a);PD(hkd(a,(Nyc(),axc)))===PD((hbd(),ebd))?JTb(this.a,c,b):KTb(this.a,c,b);z2b(new D2b,c)};var yP=mdb(Wme,'LayeredLayoutProvider',1127);bcb(356,22,{3:1,35:1,22:1,356:1},rUb);var lUb,mUb,nUb,oUb,pUb;var zP=ndb(Wme,'LayeredPhases',356,CI,tUb,sUb);var uUb;bcb(1651,1,{},CUb);_.i=0;var wUb;var CP=mdb(Xme,'ComponentsToCGraphTransformer',1651);var hVb;bcb(1652,1,{},DUb);_.ef=function EUb(a,b){return $wnd.Math.min(a.a!=null?Edb(a.a):a.c.i,b.a!=null?Edb(b.a):b.c.i)};_.ff=function FUb(a,b){return $wnd.Math.min(a.a!=null?Edb(a.a):a.c.i,b.a!=null?Edb(b.a):b.c.i)};var AP=mdb(Xme,'ComponentsToCGraphTransformer/1',1652);bcb(81,1,{81:1});_.i=0;_.k=true;_.o=Qje;var IP=mdb(Yme,'CNode',81);bcb(460,81,{460:1,81:1},GUb,HUb);_.Ib=function IUb(){return ''};var BP=mdb(Xme,'ComponentsToCGraphTransformer/CRectNode',460);bcb(1623,1,{},VUb);var JUb,KUb;var FP=mdb(Xme,'OneDimensionalComponentsCompaction',1623);bcb(1624,1,{},YUb);_.Kb=function ZUb(a){return WUb(BD(a,46))};_.Fb=function $Ub(a){return this===a};var DP=mdb(Xme,'OneDimensionalComponentsCompaction/lambda$0$Type',1624);bcb(1625,1,{},_Ub);_.Kb=function aVb(a){return XUb(BD(a,46))};_.Fb=function bVb(a){return this===a};var EP=mdb(Xme,'OneDimensionalComponentsCompaction/lambda$1$Type',1625);bcb(1654,1,{},dVb);var GP=mdb(Yme,'CGraph',1654);bcb(189,1,{189:1},gVb);_.b=0;_.c=0;_.e=0;_.g=true;_.i=Qje;var HP=mdb(Yme,'CGroup',189);bcb(1653,1,{},jVb);_.ef=function kVb(a,b){return $wnd.Math.max(a.a!=null?Edb(a.a):a.c.i,b.a!=null?Edb(b.a):b.c.i)};_.ff=function lVb(a,b){return $wnd.Math.max(a.a!=null?Edb(a.a):a.c.i,b.a!=null?Edb(b.a):b.c.i)};var JP=mdb(Yme,Ike,1653);bcb(1655,1,{},CVb);_.d=false;var mVb;var LP=mdb(Yme,Nke,1655);bcb(1656,1,{},DVb);_.Kb=function EVb(a){return nVb(),Bcb(),BD(BD(a,46).a,81).d.e!=0?true:false};_.Fb=function FVb(a){return this===a};var KP=mdb(Yme,Oke,1656);bcb(823,1,{},IVb);_.a=false;_.b=false;_.c=false;_.d=false;var MP=mdb(Yme,Pke,823);bcb(1825,1,{},OVb);var RP=mdb(Zme,Qke,1825);var bQ=odb($me,Fke);bcb(1826,1,{369:1},SVb);_.Ke=function TVb(a){QVb(this,BD(a,466))};var OP=mdb(Zme,Rke,1826);bcb(1827,1,Dke,VVb);_.ue=function WVb(a,b){return UVb(BD(a,81),BD(b,81))};_.Fb=function XVb(a){return this===a};_.ve=function YVb(){return new tpb(this)};var NP=mdb(Zme,Ske,1827);bcb(466,1,{466:1},ZVb);_.a=false;var PP=mdb(Zme,Tke,466);bcb(1828,1,Dke,$Vb);_.ue=function _Vb(a,b){return PVb(BD(a,466),BD(b,466))};_.Fb=function aWb(a){return this===a};_.ve=function bWb(){return new tpb(this)};var QP=mdb(Zme,Uke,1828);bcb(140,1,{140:1},cWb,dWb);_.Fb=function eWb(a){var b;if(a==null){return false}if(TP!=rb(a)){return false}b=BD(a,140);return wtb(this.c,b.c)&&wtb(this.d,b.d)};_.Hb=function fWb(){return Hlb(OC(GC(SI,1),Uhe,1,5,[this.c,this.d]))};_.Ib=function gWb(){return '('+this.c+She+this.d+(this.a?'cx':'')+this.b+')'};_.a=true;_.c=0;_.d=0;var TP=mdb($me,'Point',140);bcb(405,22,{3:1,35:1,22:1,405:1},oWb);var hWb,iWb,jWb,kWb;var SP=ndb($me,'Point/Quadrant',405,CI,sWb,rWb);var tWb;bcb(1642,1,{},CWb);_.b=null;_.c=null;_.d=null;_.e=null;_.f=null;var vWb,wWb,xWb,yWb,zWb;var aQ=mdb($me,'RectilinearConvexHull',1642);bcb(574,1,{369:1},NWb);_.Ke=function OWb(a){MWb(this,BD(a,140))};_.b=0;var KWb;var VP=mdb($me,'RectilinearConvexHull/MaximalElementsEventHandler',574);bcb(1644,1,Dke,QWb);_.ue=function RWb(a,b){return PWb(ED(a),ED(b))};_.Fb=function SWb(a){return this===a};_.ve=function TWb(){return new tpb(this)};var UP=mdb($me,'RectilinearConvexHull/MaximalElementsEventHandler/lambda$0$Type',1644);bcb(1643,1,{369:1},VWb);_.Ke=function WWb(a){UWb(this,BD(a,140))};_.a=0;_.b=null;_.c=null;_.d=null;_.e=null;var WP=mdb($me,'RectilinearConvexHull/RectangleEventHandler',1643);bcb(1645,1,Dke,XWb);_.ue=function YWb(a,b){return EWb(BD(a,140),BD(b,140))};_.Fb=function ZWb(a){return this===a};_.ve=function $Wb(){return new tpb(this)};var XP=mdb($me,'RectilinearConvexHull/lambda$0$Type',1645);bcb(1646,1,Dke,_Wb);_.ue=function aXb(a,b){return FWb(BD(a,140),BD(b,140))};_.Fb=function bXb(a){return this===a};_.ve=function cXb(){return new tpb(this)};var YP=mdb($me,'RectilinearConvexHull/lambda$1$Type',1646);bcb(1647,1,Dke,dXb);_.ue=function eXb(a,b){return GWb(BD(a,140),BD(b,140))};_.Fb=function fXb(a){return this===a};_.ve=function gXb(){return new tpb(this)};var ZP=mdb($me,'RectilinearConvexHull/lambda$2$Type',1647);bcb(1648,1,Dke,hXb);_.ue=function iXb(a,b){return HWb(BD(a,140),BD(b,140))};_.Fb=function jXb(a){return this===a};_.ve=function kXb(){return new tpb(this)};var $P=mdb($me,'RectilinearConvexHull/lambda$3$Type',1648);bcb(1649,1,Dke,lXb);_.ue=function mXb(a,b){return IWb(BD(a,140),BD(b,140))};_.Fb=function nXb(a){return this===a};_.ve=function oXb(){return new tpb(this)};var _P=mdb($me,'RectilinearConvexHull/lambda$4$Type',1649);bcb(1650,1,{},qXb);var cQ=mdb($me,'Scanline',1650);bcb(2005,1,{});var dQ=mdb(_me,'AbstractGraphPlacer',2005);bcb(325,1,{325:1},AXb);_.mf=function BXb(a){if(this.nf(a)){Rc(this.b,BD(vNb(a,(wtc(),Esc)),21),a);return true}else{return false}};_.nf=function CXb(a){var b,c,d,e;b=BD(vNb(a,(wtc(),Esc)),21);e=BD(Qc(wXb,b),21);for(d=e.Kc();d.Ob();){c=BD(d.Pb(),21);if(!BD(Qc(this.b,c),15).dc()){return false}}return true};var wXb;var gQ=mdb(_me,'ComponentGroup',325);bcb(765,2005,{},HXb);_.of=function IXb(a){var b,c;for(c=new olb(this.a);c.an){v=0;w+=m+e;m=0}q=g.c;uXb(g,v+q.a,w+q.b);X6c(q);c=$wnd.Math.max(c,v+s.a);m=$wnd.Math.max(m,s.b);v+=s.a+e}b.f.a=c;b.f.b=w+m;if(Ccb(DD(vNb(f,qwc)))){d=new gYb;YXb(d,a,e);for(l=a.Kc();l.Ob();){k=BD(l.Pb(),37);P6c(X6c(k.c),d.e)}P6c(X6c(b.f),d.a)}tXb(b,a)};var uQ=mdb(_me,'SimpleRowGraphPlacer',1291);bcb(1292,1,Dke,VYb);_.ue=function WYb(a,b){return UYb(BD(a,37),BD(b,37))};_.Fb=function XYb(a){return this===a};_.ve=function YYb(){return new tpb(this)};var tQ=mdb(_me,'SimpleRowGraphPlacer/1',1292);var ZYb;bcb(1262,1,Vke,dZb);_.Lb=function eZb(a){var b;return b=BD(vNb(BD(a,243).b,(Nyc(),jxc)),74),!!b&&b.b!=0};_.Fb=function fZb(a){return this===a};_.Mb=function gZb(a){var b;return b=BD(vNb(BD(a,243).b,(Nyc(),jxc)),74),!!b&&b.b!=0};var vQ=mdb(dne,'CompoundGraphPostprocessor/1',1262);bcb(1261,1,ene,wZb);_.pf=function xZb(a,b){qZb(this,BD(a,37),b)};var xQ=mdb(dne,'CompoundGraphPreprocessor',1261);bcb(441,1,{441:1},yZb);_.c=false;var wQ=mdb(dne,'CompoundGraphPreprocessor/ExternalPort',441);bcb(243,1,{243:1},BZb);_.Ib=function CZb(){return Zr(this.c)+':'+TZb(this.b)};var zQ=mdb(dne,'CrossHierarchyEdge',243);bcb(763,1,Dke,EZb);_.ue=function FZb(a,b){return DZb(this,BD(a,243),BD(b,243))};_.Fb=function GZb(a){return this===a};_.ve=function IZb(){return new tpb(this)};var yQ=mdb(dne,'CrossHierarchyEdgeComparator',763);bcb(299,134,{3:1,299:1,94:1,134:1});_.p=0;var JQ=mdb(fne,'LGraphElement',299);bcb(17,299,{3:1,17:1,299:1,94:1,134:1},UZb);_.Ib=function VZb(){return TZb(this)};var AQ=mdb(fne,'LEdge',17);bcb(37,299,{3:1,20:1,37:1,299:1,94:1,134:1},XZb);_.Jc=function YZb(a){reb(this,a)};_.Kc=function ZZb(){return new olb(this.b)};_.Ib=function $Zb(){if(this.b.c.length==0){return 'G-unlayered'+Fe(this.a)}else if(this.a.c.length==0){return 'G-layered'+Fe(this.b)}return 'G[layerless'+Fe(this.a)+', layers'+Fe(this.b)+']'};var KQ=mdb(fne,'LGraph',37);var _Zb;bcb(657,1,{});_.qf=function b$b(){return this.e.n};_.We=function c$b(a){return vNb(this.e,a)};_.rf=function d$b(){return this.e.o};_.sf=function e$b(){return this.e.p};_.Xe=function f$b(a){return wNb(this.e,a)};_.tf=function g$b(a){this.e.n.a=a.a;this.e.n.b=a.b};_.uf=function h$b(a){this.e.o.a=a.a;this.e.o.b=a.b};_.vf=function i$b(a){this.e.p=a};var BQ=mdb(fne,'LGraphAdapters/AbstractLShapeAdapter',657);bcb(577,1,{839:1},j$b);_.wf=function k$b(){var a,b;if(!this.b){this.b=Pu(this.a.b.c.length);for(b=new olb(this.a.b);b.a0&&E_b((BCb(c-1,b.length),b.charCodeAt(c-1)),nne)){--c}if(g> ',a),C0b(c));Qfb(Pfb((a.a+='[',a),c.i),']')}return a.a};_.c=true;_.d=false;var t0b,u0b,v0b,w0b,x0b,y0b;var aR=mdb(fne,'LPort',11);bcb(397,1,vie,J0b);_.Jc=function K0b(a){reb(this,a)};_.Kc=function L0b(){var a;a=new olb(this.a.e);return new M0b(a)};var RQ=mdb(fne,'LPort/1',397);bcb(1290,1,aie,M0b);_.Nb=function N0b(a){Rrb(this,a)};_.Pb=function P0b(){return BD(mlb(this.a),17).c};_.Ob=function O0b(){return llb(this.a)};_.Qb=function Q0b(){nlb(this.a)};var QQ=mdb(fne,'LPort/1/1',1290);bcb(359,1,vie,R0b);_.Jc=function S0b(a){reb(this,a)};_.Kc=function T0b(){var a;return a=new olb(this.a.g),new U0b(a)};var TQ=mdb(fne,'LPort/2',359);bcb(762,1,aie,U0b);_.Nb=function V0b(a){Rrb(this,a)};_.Pb=function X0b(){return BD(mlb(this.a),17).d};_.Ob=function W0b(){return llb(this.a)};_.Qb=function Y0b(){nlb(this.a)};var SQ=mdb(fne,'LPort/2/1',762);bcb(1283,1,vie,Z0b);_.Jc=function $0b(a){reb(this,a)};_.Kc=function _0b(){return new b1b(this)};var VQ=mdb(fne,'LPort/CombineIter',1283);bcb(201,1,aie,b1b);_.Nb=function c1b(a){Rrb(this,a)};_.Qb=function f1b(){Srb()};_.Ob=function d1b(){return a1b(this)};_.Pb=function e1b(){return llb(this.a)?mlb(this.a):mlb(this.b)};var UQ=mdb(fne,'LPort/CombineIter/1',201);bcb(1285,1,Vke,h1b);_.Lb=function i1b(a){return g1b(a)};_.Fb=function j1b(a){return this===a};_.Mb=function k1b(a){return z0b(),BD(a,11).e.c.length!=0};var WQ=mdb(fne,'LPort/lambda$0$Type',1285);bcb(1284,1,Vke,m1b);_.Lb=function n1b(a){return l1b(a)};_.Fb=function o1b(a){return this===a};_.Mb=function p1b(a){return z0b(),BD(a,11).g.c.length!=0};var XQ=mdb(fne,'LPort/lambda$1$Type',1284);bcb(1286,1,Vke,q1b);_.Lb=function r1b(a){return z0b(),BD(a,11).j==(Ucd(),Acd)};_.Fb=function s1b(a){return this===a};_.Mb=function t1b(a){return z0b(),BD(a,11).j==(Ucd(),Acd)};var YQ=mdb(fne,'LPort/lambda$2$Type',1286);bcb(1287,1,Vke,u1b);_.Lb=function v1b(a){return z0b(),BD(a,11).j==(Ucd(),zcd)};_.Fb=function w1b(a){return this===a};_.Mb=function x1b(a){return z0b(),BD(a,11).j==(Ucd(),zcd)};var ZQ=mdb(fne,'LPort/lambda$3$Type',1287);bcb(1288,1,Vke,y1b);_.Lb=function z1b(a){return z0b(),BD(a,11).j==(Ucd(),Rcd)};_.Fb=function A1b(a){return this===a};_.Mb=function B1b(a){return z0b(),BD(a,11).j==(Ucd(),Rcd)};var $Q=mdb(fne,'LPort/lambda$4$Type',1288);bcb(1289,1,Vke,C1b);_.Lb=function D1b(a){return z0b(),BD(a,11).j==(Ucd(),Tcd)};_.Fb=function E1b(a){return this===a};_.Mb=function F1b(a){return z0b(),BD(a,11).j==(Ucd(),Tcd)};var _Q=mdb(fne,'LPort/lambda$5$Type',1289);bcb(29,299,{3:1,20:1,299:1,29:1,94:1,134:1},H1b);_.Jc=function I1b(a){reb(this,a)};_.Kc=function J1b(){return new olb(this.a)};_.Ib=function K1b(){return 'L_'+Jkb(this.b.b,this,0)+Fe(this.a)};var cR=mdb(fne,'Layer',29);bcb(1342,1,{},a2b);var mR=mdb(tne,une,1342);bcb(1346,1,{},e2b);_.Kb=function f2b(a){return atd(BD(a,82))};var dR=mdb(tne,'ElkGraphImporter/0methodref$connectableShapeToNode$Type',1346);bcb(1349,1,{},g2b);_.Kb=function h2b(a){return atd(BD(a,82))};var eR=mdb(tne,'ElkGraphImporter/1methodref$connectableShapeToNode$Type',1349);bcb(1343,1,qie,i2b);_.td=function j2b(a){Q1b(this.a,BD(a,118))};var fR=mdb(tne,vne,1343);bcb(1344,1,qie,k2b);_.td=function l2b(a){Q1b(this.a,BD(a,118))};var gR=mdb(tne,wne,1344);bcb(1345,1,{},m2b);_.Kb=function n2b(a){return new YAb(null,new Kub(Old(BD(a,79)),16))};var hR=mdb(tne,xne,1345);bcb(1347,1,Oie,o2b);_.Mb=function p2b(a){return b2b(this.a,BD(a,33))};var iR=mdb(tne,yne,1347);bcb(1348,1,{},q2b);_.Kb=function r2b(a){return new YAb(null,new Kub(Nld(BD(a,79)),16))};var jR=mdb(tne,'ElkGraphImporter/lambda$5$Type',1348);bcb(1350,1,Oie,s2b);_.Mb=function t2b(a){return c2b(this.a,BD(a,33))};var kR=mdb(tne,'ElkGraphImporter/lambda$7$Type',1350);bcb(1351,1,Oie,u2b);_.Mb=function v2b(a){return d2b(BD(a,79))};var lR=mdb(tne,'ElkGraphImporter/lambda$8$Type',1351);bcb(1278,1,{},D2b);var w2b;var rR=mdb(tne,'ElkGraphLayoutTransferrer',1278);bcb(1279,1,Oie,G2b);_.Mb=function H2b(a){return E2b(this.a,BD(a,17))};var nR=mdb(tne,'ElkGraphLayoutTransferrer/lambda$0$Type',1279);bcb(1280,1,qie,I2b);_.td=function J2b(a){x2b();Ekb(this.a,BD(a,17))};var oR=mdb(tne,'ElkGraphLayoutTransferrer/lambda$1$Type',1280);bcb(1281,1,Oie,K2b);_.Mb=function L2b(a){return F2b(this.a,BD(a,17))};var pR=mdb(tne,'ElkGraphLayoutTransferrer/lambda$2$Type',1281);bcb(1282,1,qie,M2b);_.td=function N2b(a){x2b();Ekb(this.a,BD(a,17))};var qR=mdb(tne,'ElkGraphLayoutTransferrer/lambda$3$Type',1282);bcb(1485,1,ene,S2b);_.pf=function T2b(a,b){Q2b(BD(a,37),b)};var uR=mdb(Ane,'CommentNodeMarginCalculator',1485);bcb(1486,1,{},U2b);_.Kb=function V2b(a){return new YAb(null,new Kub(BD(a,29).a,16))};var sR=mdb(Ane,'CommentNodeMarginCalculator/lambda$0$Type',1486);bcb(1487,1,qie,W2b);_.td=function X2b(a){R2b(BD(a,10))};var tR=mdb(Ane,'CommentNodeMarginCalculator/lambda$1$Type',1487);bcb(1488,1,ene,_2b);_.pf=function a3b(a,b){Z2b(BD(a,37),b)};var vR=mdb(Ane,'CommentPostprocessor',1488);bcb(1489,1,ene,e3b);_.pf=function f3b(a,b){b3b(BD(a,37),b)};var wR=mdb(Ane,'CommentPreprocessor',1489);bcb(1490,1,ene,h3b);_.pf=function i3b(a,b){g3b(BD(a,37),b)};var xR=mdb(Ane,'ConstraintsPostprocessor',1490);bcb(1491,1,ene,p3b);_.pf=function q3b(a,b){n3b(BD(a,37),b)};var yR=mdb(Ane,'EdgeAndLayerConstraintEdgeReverser',1491);bcb(1492,1,ene,t3b);_.pf=function v3b(a,b){r3b(BD(a,37),b)};var CR=mdb(Ane,'EndLabelPostprocessor',1492);bcb(1493,1,{},w3b);_.Kb=function x3b(a){return new YAb(null,new Kub(BD(a,29).a,16))};var zR=mdb(Ane,'EndLabelPostprocessor/lambda$0$Type',1493);bcb(1494,1,Oie,y3b);_.Mb=function z3b(a){return u3b(BD(a,10))};var AR=mdb(Ane,'EndLabelPostprocessor/lambda$1$Type',1494);bcb(1495,1,qie,A3b);_.td=function B3b(a){s3b(BD(a,10))};var BR=mdb(Ane,'EndLabelPostprocessor/lambda$2$Type',1495);bcb(1496,1,ene,M3b);_.pf=function P3b(a,b){I3b(BD(a,37),b)};var JR=mdb(Ane,'EndLabelPreprocessor',1496);bcb(1497,1,{},Q3b);_.Kb=function R3b(a){return new YAb(null,new Kub(BD(a,29).a,16))};var DR=mdb(Ane,'EndLabelPreprocessor/lambda$0$Type',1497);bcb(1498,1,qie,S3b);_.td=function T3b(a){E3b(this.a,this.b,this.c,BD(a,10))};_.a=0;_.b=0;_.c=false;var ER=mdb(Ane,'EndLabelPreprocessor/lambda$1$Type',1498);bcb(1499,1,Oie,U3b);_.Mb=function V3b(a){return PD(vNb(BD(a,70),(Nyc(),Qwc)))===PD((qad(),pad))};var FR=mdb(Ane,'EndLabelPreprocessor/lambda$2$Type',1499);bcb(1500,1,qie,W3b);_.td=function X3b(a){Dsb(this.a,BD(a,70))};var GR=mdb(Ane,'EndLabelPreprocessor/lambda$3$Type',1500);bcb(1501,1,Oie,Y3b);_.Mb=function Z3b(a){return PD(vNb(BD(a,70),(Nyc(),Qwc)))===PD((qad(),oad))};var HR=mdb(Ane,'EndLabelPreprocessor/lambda$4$Type',1501);bcb(1502,1,qie,$3b);_.td=function _3b(a){Dsb(this.a,BD(a,70))};var IR=mdb(Ane,'EndLabelPreprocessor/lambda$5$Type',1502);bcb(1551,1,ene,i4b);_.pf=function j4b(a,b){f4b(BD(a,37),b)};var a4b;var RR=mdb(Ane,'EndLabelSorter',1551);bcb(1552,1,Dke,l4b);_.ue=function m4b(a,b){return k4b(BD(a,456),BD(b,456))};_.Fb=function n4b(a){return this===a};_.ve=function o4b(){return new tpb(this)};var KR=mdb(Ane,'EndLabelSorter/1',1552);bcb(456,1,{456:1},p4b);var LR=mdb(Ane,'EndLabelSorter/LabelGroup',456);bcb(1553,1,{},q4b);_.Kb=function r4b(a){return b4b(),new YAb(null,new Kub(BD(a,29).a,16))};var MR=mdb(Ane,'EndLabelSorter/lambda$0$Type',1553);bcb(1554,1,Oie,s4b);_.Mb=function t4b(a){return b4b(),BD(a,10).k==(j0b(),h0b)};var NR=mdb(Ane,'EndLabelSorter/lambda$1$Type',1554);bcb(1555,1,qie,u4b);_.td=function v4b(a){g4b(BD(a,10))};var OR=mdb(Ane,'EndLabelSorter/lambda$2$Type',1555);bcb(1556,1,Oie,w4b);_.Mb=function x4b(a){return b4b(),PD(vNb(BD(a,70),(Nyc(),Qwc)))===PD((qad(),oad))};var PR=mdb(Ane,'EndLabelSorter/lambda$3$Type',1556);bcb(1557,1,Oie,y4b);_.Mb=function z4b(a){return b4b(),PD(vNb(BD(a,70),(Nyc(),Qwc)))===PD((qad(),pad))};var QR=mdb(Ane,'EndLabelSorter/lambda$4$Type',1557);bcb(1503,1,ene,L4b);_.pf=function M4b(a,b){J4b(this,BD(a,37))};_.b=0;_.c=0;var YR=mdb(Ane,'FinalSplineBendpointsCalculator',1503);bcb(1504,1,{},N4b);_.Kb=function O4b(a){return new YAb(null,new Kub(BD(a,29).a,16))};var SR=mdb(Ane,'FinalSplineBendpointsCalculator/lambda$0$Type',1504);bcb(1505,1,{},P4b);_.Kb=function Q4b(a){return new YAb(null,new Lub(new Sr(ur(U_b(BD(a,10)).a.Kc(),new Sq))))};var TR=mdb(Ane,'FinalSplineBendpointsCalculator/lambda$1$Type',1505);bcb(1506,1,Oie,R4b);_.Mb=function S4b(a){return !OZb(BD(a,17))};var UR=mdb(Ane,'FinalSplineBendpointsCalculator/lambda$2$Type',1506);bcb(1507,1,Oie,T4b);_.Mb=function U4b(a){return wNb(BD(a,17),(wtc(),rtc))};var VR=mdb(Ane,'FinalSplineBendpointsCalculator/lambda$3$Type',1507);bcb(1508,1,qie,V4b);_.td=function W4b(a){C4b(this.a,BD(a,128))};var WR=mdb(Ane,'FinalSplineBendpointsCalculator/lambda$4$Type',1508);bcb(1509,1,qie,X4b);_.td=function Y4b(a){smb(BD(a,17).a)};var XR=mdb(Ane,'FinalSplineBendpointsCalculator/lambda$5$Type',1509);bcb(792,1,ene,u5b);_.pf=function v5b(a,b){l5b(this,BD(a,37),b)};var $R=mdb(Ane,'GraphTransformer',792);bcb(511,22,{3:1,35:1,22:1,511:1},z5b);var w5b,x5b;var ZR=ndb(Ane,'GraphTransformer/Mode',511,CI,B5b,A5b);var C5b;bcb(1510,1,ene,I5b);_.pf=function J5b(a,b){F5b(BD(a,37),b)};var _R=mdb(Ane,'HierarchicalNodeResizingProcessor',1510);bcb(1511,1,ene,Q5b);_.pf=function R5b(a,b){M5b(BD(a,37),b)};var bS=mdb(Ane,'HierarchicalPortConstraintProcessor',1511);bcb(1512,1,Dke,T5b);_.ue=function U5b(a,b){return S5b(BD(a,10),BD(b,10))};_.Fb=function V5b(a){return this===a};_.ve=function W5b(){return new tpb(this)};var aS=mdb(Ane,'HierarchicalPortConstraintProcessor/NodeComparator',1512);bcb(1513,1,ene,Z5b);_.pf=function $5b(a,b){X5b(BD(a,37),b)};var cS=mdb(Ane,'HierarchicalPortDummySizeProcessor',1513);bcb(1514,1,ene,l6b);_.pf=function m6b(a,b){e6b(this,BD(a,37),b)};_.a=0;var fS=mdb(Ane,'HierarchicalPortOrthogonalEdgeRouter',1514);bcb(1515,1,Dke,o6b);_.ue=function p6b(a,b){return n6b(BD(a,10),BD(b,10))};_.Fb=function q6b(a){return this===a};_.ve=function r6b(){return new tpb(this)};var dS=mdb(Ane,'HierarchicalPortOrthogonalEdgeRouter/1',1515);bcb(1516,1,Dke,t6b);_.ue=function u6b(a,b){return s6b(BD(a,10),BD(b,10))};_.Fb=function v6b(a){return this===a};_.ve=function w6b(){return new tpb(this)};var eS=mdb(Ane,'HierarchicalPortOrthogonalEdgeRouter/2',1516);bcb(1517,1,ene,z6b);_.pf=function A6b(a,b){y6b(BD(a,37),b)};var gS=mdb(Ane,'HierarchicalPortPositionProcessor',1517);bcb(1518,1,ene,J6b);_.pf=function K6b(a,b){I6b(this,BD(a,37))};_.a=0;_.c=0;var B6b,C6b;var kS=mdb(Ane,'HighDegreeNodeLayeringProcessor',1518);bcb(571,1,{571:1},L6b);_.b=-1;_.d=-1;var hS=mdb(Ane,'HighDegreeNodeLayeringProcessor/HighDegreeNodeInformation',571);bcb(1519,1,{},M6b);_.Kb=function N6b(a){return D6b(),R_b(BD(a,10))};_.Fb=function O6b(a){return this===a};var iS=mdb(Ane,'HighDegreeNodeLayeringProcessor/lambda$0$Type',1519);bcb(1520,1,{},P6b);_.Kb=function Q6b(a){return D6b(),U_b(BD(a,10))};_.Fb=function R6b(a){return this===a};var jS=mdb(Ane,'HighDegreeNodeLayeringProcessor/lambda$1$Type',1520);bcb(1526,1,ene,X6b);_.pf=function Y6b(a,b){W6b(this,BD(a,37),b)};var pS=mdb(Ane,'HyperedgeDummyMerger',1526);bcb(793,1,{},Z6b);_.a=false;_.b=false;_.c=false;var lS=mdb(Ane,'HyperedgeDummyMerger/MergeState',793);bcb(1527,1,{},$6b);_.Kb=function _6b(a){return new YAb(null,new Kub(BD(a,29).a,16))};var mS=mdb(Ane,'HyperedgeDummyMerger/lambda$0$Type',1527);bcb(1528,1,{},a7b);_.Kb=function b7b(a){return new YAb(null,new Kub(BD(a,10).j,16))};var nS=mdb(Ane,'HyperedgeDummyMerger/lambda$1$Type',1528);bcb(1529,1,qie,c7b);_.td=function d7b(a){BD(a,11).p=-1};var oS=mdb(Ane,'HyperedgeDummyMerger/lambda$2$Type',1529);bcb(1530,1,ene,g7b);_.pf=function h7b(a,b){f7b(BD(a,37),b)};var qS=mdb(Ane,'HypernodesProcessor',1530);bcb(1531,1,ene,j7b);_.pf=function k7b(a,b){i7b(BD(a,37),b)};var rS=mdb(Ane,'InLayerConstraintProcessor',1531);bcb(1532,1,ene,m7b);_.pf=function n7b(a,b){l7b(BD(a,37),b)};var sS=mdb(Ane,'InnermostNodeMarginCalculator',1532);bcb(1533,1,ene,r7b);_.pf=function w7b(a,b){q7b(this,BD(a,37))};_.a=Qje;_.b=Qje;_.c=Pje;_.d=Pje;var zS=mdb(Ane,'InteractiveExternalPortPositioner',1533);bcb(1534,1,{},x7b);_.Kb=function y7b(a){return BD(a,17).d.i};_.Fb=function z7b(a){return this===a};var tS=mdb(Ane,'InteractiveExternalPortPositioner/lambda$0$Type',1534);bcb(1535,1,{},A7b);_.Kb=function B7b(a){return s7b(this.a,ED(a))};_.Fb=function C7b(a){return this===a};var uS=mdb(Ane,'InteractiveExternalPortPositioner/lambda$1$Type',1535);bcb(1536,1,{},D7b);_.Kb=function E7b(a){return BD(a,17).c.i};_.Fb=function F7b(a){return this===a};var vS=mdb(Ane,'InteractiveExternalPortPositioner/lambda$2$Type',1536);bcb(1537,1,{},G7b);_.Kb=function H7b(a){return t7b(this.a,ED(a))};_.Fb=function I7b(a){return this===a};var wS=mdb(Ane,'InteractiveExternalPortPositioner/lambda$3$Type',1537);bcb(1538,1,{},J7b);_.Kb=function K7b(a){return u7b(this.a,ED(a))};_.Fb=function L7b(a){return this===a};var xS=mdb(Ane,'InteractiveExternalPortPositioner/lambda$4$Type',1538);bcb(1539,1,{},M7b);_.Kb=function N7b(a){return v7b(this.a,ED(a))};_.Fb=function O7b(a){return this===a};var yS=mdb(Ane,'InteractiveExternalPortPositioner/lambda$5$Type',1539);bcb(77,22,{3:1,35:1,22:1,77:1,234:1},T8b);_.Kf=function U8b(){switch(this.g){case 15:return new eoc;case 22:return new Aoc;case 47:return new Joc;case 28:case 35:return new uac;case 32:return new S2b;case 42:return new _2b;case 1:return new e3b;case 41:return new h3b;case 56:return new u5b((y5b(),x5b));case 0:return new u5b((y5b(),w5b));case 2:return new p3b;case 54:return new t3b;case 33:return new M3b;case 51:return new L4b;case 55:return new I5b;case 13:return new Q5b;case 38:return new Z5b;case 44:return new l6b;case 40:return new z6b;case 9:return new J6b;case 49:return new sgc;case 37:return new X6b;case 43:return new g7b;case 27:return new j7b;case 30:return new m7b;case 3:return new r7b;case 18:return new b9b;case 29:return new h9b;case 5:return new u9b;case 50:return new D9b;case 34:return new $9b;case 36:return new Iac;case 52:return new i4b;case 11:return new Sac;case 7:return new abc;case 39:return new obc;case 45:return new rbc;case 16:return new vbc;case 10:return new Fbc;case 48:return new Xbc;case 21:return new ccc;case 23:return new fGc((rGc(),pGc));case 8:return new lcc;case 12:return new tcc;case 4:return new ycc;case 19:return new Tcc;case 17:return new pdc;case 53:return new sdc;case 6:return new hec;case 25:return new wdc;case 46:return new Ndc;case 31:return new sec;case 14:return new Fec;case 26:return new ppc;case 20:return new Uec;case 24:return new fGc((rGc(),qGc));default:throw vbb(new Wdb(Dne+(this.f!=null?this.f:''+this.g)));}};var P7b,Q7b,R7b,S7b,T7b,U7b,V7b,W7b,X7b,Y7b,Z7b,$7b,_7b,a8b,b8b,c8b,d8b,e8b,f8b,g8b,h8b,i8b,j8b,k8b,l8b,m8b,n8b,o8b,p8b,q8b,r8b,s8b,t8b,u8b,v8b,w8b,x8b,y8b,z8b,A8b,B8b,C8b,D8b,E8b,F8b,G8b,H8b,I8b,J8b,K8b,L8b,M8b,N8b,O8b,P8b,Q8b,R8b;var AS=ndb(Ane,Ene,77,CI,W8b,V8b);var X8b;bcb(1540,1,ene,b9b);_.pf=function c9b(a,b){_8b(BD(a,37),b)};var BS=mdb(Ane,'InvertedPortProcessor',1540);bcb(1541,1,ene,h9b);_.pf=function i9b(a,b){g9b(BD(a,37),b)};var FS=mdb(Ane,'LabelAndNodeSizeProcessor',1541);bcb(1542,1,Oie,j9b);_.Mb=function k9b(a){return BD(a,10).k==(j0b(),h0b)};var CS=mdb(Ane,'LabelAndNodeSizeProcessor/lambda$0$Type',1542);bcb(1543,1,Oie,l9b);_.Mb=function m9b(a){return BD(a,10).k==(j0b(),e0b)};var DS=mdb(Ane,'LabelAndNodeSizeProcessor/lambda$1$Type',1543);bcb(1544,1,qie,n9b);_.td=function o9b(a){e9b(this.b,this.a,this.c,BD(a,10))};_.a=false;_.c=false;var ES=mdb(Ane,'LabelAndNodeSizeProcessor/lambda$2$Type',1544);bcb(1545,1,ene,u9b);_.pf=function v9b(a,b){s9b(BD(a,37),b)};var p9b;var HS=mdb(Ane,'LabelDummyInserter',1545);bcb(1546,1,Vke,w9b);_.Lb=function x9b(a){return PD(vNb(BD(a,70),(Nyc(),Qwc)))===PD((qad(),nad))};_.Fb=function y9b(a){return this===a};_.Mb=function z9b(a){return PD(vNb(BD(a,70),(Nyc(),Qwc)))===PD((qad(),nad))};var GS=mdb(Ane,'LabelDummyInserter/1',1546);bcb(1547,1,ene,D9b);_.pf=function E9b(a,b){C9b(BD(a,37),b)};var JS=mdb(Ane,'LabelDummyRemover',1547);bcb(1548,1,Oie,F9b);_.Mb=function G9b(a){return Ccb(DD(vNb(BD(a,70),(Nyc(),Pwc))))};var IS=mdb(Ane,'LabelDummyRemover/lambda$0$Type',1548);bcb(1359,1,ene,$9b);_.pf=function cac(a,b){W9b(this,BD(a,37),b)};_.a=null;var H9b;var QS=mdb(Ane,'LabelDummySwitcher',1359);bcb(286,1,{286:1},gac);_.c=0;_.d=null;_.f=0;var KS=mdb(Ane,'LabelDummySwitcher/LabelDummyInfo',286);bcb(1360,1,{},hac);_.Kb=function iac(a){return I9b(),new YAb(null,new Kub(BD(a,29).a,16))};var LS=mdb(Ane,'LabelDummySwitcher/lambda$0$Type',1360);bcb(1361,1,Oie,jac);_.Mb=function kac(a){return I9b(),BD(a,10).k==(j0b(),f0b)};var MS=mdb(Ane,'LabelDummySwitcher/lambda$1$Type',1361);bcb(1362,1,{},lac);_.Kb=function mac(a){return _9b(this.a,BD(a,10))};var NS=mdb(Ane,'LabelDummySwitcher/lambda$2$Type',1362);bcb(1363,1,qie,nac);_.td=function oac(a){aac(this.a,BD(a,286))};var OS=mdb(Ane,'LabelDummySwitcher/lambda$3$Type',1363);bcb(1364,1,Dke,pac);_.ue=function qac(a,b){return bac(BD(a,286),BD(b,286))};_.Fb=function rac(a){return this===a};_.ve=function sac(){return new tpb(this)};var PS=mdb(Ane,'LabelDummySwitcher/lambda$4$Type',1364);bcb(791,1,ene,uac);_.pf=function vac(a,b){tac(BD(a,37),b)};var RS=mdb(Ane,'LabelManagementProcessor',791);bcb(1549,1,ene,Iac);_.pf=function Jac(a,b){Cac(BD(a,37),b)};var TS=mdb(Ane,'LabelSideSelector',1549);bcb(1550,1,Oie,Kac);_.Mb=function Lac(a){return Ccb(DD(vNb(BD(a,70),(Nyc(),Pwc))))};var SS=mdb(Ane,'LabelSideSelector/lambda$0$Type',1550);bcb(1558,1,ene,Sac);_.pf=function Tac(a,b){Oac(BD(a,37),b)};var US=mdb(Ane,'LayerConstraintPostprocessor',1558);bcb(1559,1,ene,abc);_.pf=function bbc(a,b){$ac(BD(a,37),b)};var Uac;var WS=mdb(Ane,'LayerConstraintPreprocessor',1559);bcb(360,22,{3:1,35:1,22:1,360:1},ibc);var cbc,dbc,ebc,fbc;var VS=ndb(Ane,'LayerConstraintPreprocessor/HiddenNodeConnections',360,CI,kbc,jbc);var lbc;bcb(1560,1,ene,obc);_.pf=function pbc(a,b){nbc(BD(a,37),b)};var XS=mdb(Ane,'LayerSizeAndGraphHeightCalculator',1560);bcb(1561,1,ene,rbc);_.pf=function tbc(a,b){qbc(BD(a,37),b)};var YS=mdb(Ane,'LongEdgeJoiner',1561);bcb(1562,1,ene,vbc);_.pf=function xbc(a,b){ubc(BD(a,37),b)};var ZS=mdb(Ane,'LongEdgeSplitter',1562);bcb(1563,1,ene,Fbc);_.pf=function Ibc(a,b){Bbc(this,BD(a,37),b)};_.d=0;_.e=0;_.i=0;_.j=0;_.k=0;_.n=0;var bT=mdb(Ane,'NodePromotion',1563);bcb(1564,1,{},Jbc);_.Kb=function Kbc(a){return BD(a,46),Bcb(),true};_.Fb=function Lbc(a){return this===a};var $S=mdb(Ane,'NodePromotion/lambda$0$Type',1564);bcb(1565,1,{},Mbc);_.Kb=function Nbc(a){return Gbc(this.a,BD(a,46))};_.Fb=function Obc(a){return this===a};_.a=0;var _S=mdb(Ane,'NodePromotion/lambda$1$Type',1565);bcb(1566,1,{},Pbc);_.Kb=function Qbc(a){return Hbc(this.a,BD(a,46))};_.Fb=function Rbc(a){return this===a};_.a=0;var aT=mdb(Ane,'NodePromotion/lambda$2$Type',1566);bcb(1567,1,ene,Xbc);_.pf=function Ybc(a,b){Sbc(BD(a,37),b)};var cT=mdb(Ane,'NorthSouthPortPostprocessor',1567);bcb(1568,1,ene,ccc);_.pf=function ecc(a,b){acc(BD(a,37),b)};var eT=mdb(Ane,'NorthSouthPortPreprocessor',1568);bcb(1569,1,Dke,fcc);_.ue=function gcc(a,b){return dcc(BD(a,11),BD(b,11))};_.Fb=function hcc(a){return this===a};_.ve=function icc(){return new tpb(this)};var dT=mdb(Ane,'NorthSouthPortPreprocessor/lambda$0$Type',1569);bcb(1570,1,ene,lcc);_.pf=function ncc(a,b){kcc(BD(a,37),b)};var hT=mdb(Ane,'PartitionMidprocessor',1570);bcb(1571,1,Oie,occ);_.Mb=function pcc(a){return wNb(BD(a,10),(Nyc(),Nxc))};var fT=mdb(Ane,'PartitionMidprocessor/lambda$0$Type',1571);bcb(1572,1,qie,qcc);_.td=function rcc(a){mcc(this.a,BD(a,10))};var gT=mdb(Ane,'PartitionMidprocessor/lambda$1$Type',1572);bcb(1573,1,ene,tcc);_.pf=function ucc(a,b){scc(BD(a,37),b)};var iT=mdb(Ane,'PartitionPostprocessor',1573);bcb(1574,1,ene,ycc);_.pf=function zcc(a,b){wcc(BD(a,37),b)};var nT=mdb(Ane,'PartitionPreprocessor',1574);bcb(1575,1,Oie,Acc);_.Mb=function Bcc(a){return wNb(BD(a,10),(Nyc(),Nxc))};var jT=mdb(Ane,'PartitionPreprocessor/lambda$0$Type',1575);bcb(1576,1,{},Ccc);_.Kb=function Dcc(a){return new YAb(null,new Lub(new Sr(ur(U_b(BD(a,10)).a.Kc(),new Sq))))};var kT=mdb(Ane,'PartitionPreprocessor/lambda$1$Type',1576);bcb(1577,1,Oie,Ecc);_.Mb=function Fcc(a){return vcc(BD(a,17))};var lT=mdb(Ane,'PartitionPreprocessor/lambda$2$Type',1577);bcb(1578,1,qie,Gcc);_.td=function Hcc(a){xcc(BD(a,17))};var mT=mdb(Ane,'PartitionPreprocessor/lambda$3$Type',1578);bcb(1579,1,ene,Tcc);_.pf=function Xcc(a,b){Qcc(BD(a,37),b)};var Icc,Jcc,Kcc,Lcc,Mcc,Ncc;var tT=mdb(Ane,'PortListSorter',1579);bcb(1580,1,{},Zcc);_.Kb=function $cc(a){return Occ(),BD(a,11).e};var oT=mdb(Ane,'PortListSorter/lambda$0$Type',1580);bcb(1581,1,{},_cc);_.Kb=function adc(a){return Occ(),BD(a,11).g};var pT=mdb(Ane,'PortListSorter/lambda$1$Type',1581);bcb(1582,1,Dke,bdc);_.ue=function cdc(a,b){return Ucc(BD(a,11),BD(b,11))};_.Fb=function ddc(a){return this===a};_.ve=function edc(){return new tpb(this)};var qT=mdb(Ane,'PortListSorter/lambda$2$Type',1582);bcb(1583,1,Dke,fdc);_.ue=function gdc(a,b){return Vcc(BD(a,11),BD(b,11))};_.Fb=function hdc(a){return this===a};_.ve=function idc(){return new tpb(this)};var rT=mdb(Ane,'PortListSorter/lambda$3$Type',1583);bcb(1584,1,Dke,jdc);_.ue=function kdc(a,b){return Wcc(BD(a,11),BD(b,11))};_.Fb=function ldc(a){return this===a};_.ve=function mdc(){return new tpb(this)};var sT=mdb(Ane,'PortListSorter/lambda$4$Type',1584);bcb(1585,1,ene,pdc);_.pf=function qdc(a,b){ndc(BD(a,37),b)};var uT=mdb(Ane,'PortSideProcessor',1585);bcb(1586,1,ene,sdc);_.pf=function tdc(a,b){rdc(BD(a,37),b)};var vT=mdb(Ane,'ReversedEdgeRestorer',1586);bcb(1591,1,ene,wdc);_.pf=function xdc(a,b){udc(this,BD(a,37),b)};var CT=mdb(Ane,'SelfLoopPortRestorer',1591);bcb(1592,1,{},ydc);_.Kb=function zdc(a){return new YAb(null,new Kub(BD(a,29).a,16))};var wT=mdb(Ane,'SelfLoopPortRestorer/lambda$0$Type',1592);bcb(1593,1,Oie,Adc);_.Mb=function Bdc(a){return BD(a,10).k==(j0b(),h0b)};var xT=mdb(Ane,'SelfLoopPortRestorer/lambda$1$Type',1593);bcb(1594,1,Oie,Cdc);_.Mb=function Ddc(a){return wNb(BD(a,10),(wtc(),ntc))};var yT=mdb(Ane,'SelfLoopPortRestorer/lambda$2$Type',1594);bcb(1595,1,{},Edc);_.Kb=function Fdc(a){return BD(vNb(BD(a,10),(wtc(),ntc)),403)};var zT=mdb(Ane,'SelfLoopPortRestorer/lambda$3$Type',1595);bcb(1596,1,qie,Gdc);_.td=function Hdc(a){vdc(this.a,BD(a,403))};var AT=mdb(Ane,'SelfLoopPortRestorer/lambda$4$Type',1596);bcb(794,1,qie,Idc);_.td=function Jdc(a){ljc(BD(a,101))};var BT=mdb(Ane,'SelfLoopPortRestorer/lambda$5$Type',794);bcb(1597,1,ene,Ndc);_.pf=function Pdc(a,b){Kdc(BD(a,37),b)};var LT=mdb(Ane,'SelfLoopPostProcessor',1597);bcb(1598,1,{},Qdc);_.Kb=function Rdc(a){return new YAb(null,new Kub(BD(a,29).a,16))};var DT=mdb(Ane,'SelfLoopPostProcessor/lambda$0$Type',1598);bcb(1599,1,Oie,Sdc);_.Mb=function Tdc(a){return BD(a,10).k==(j0b(),h0b)};var ET=mdb(Ane,'SelfLoopPostProcessor/lambda$1$Type',1599);bcb(1600,1,Oie,Udc);_.Mb=function Vdc(a){return wNb(BD(a,10),(wtc(),ntc))};var FT=mdb(Ane,'SelfLoopPostProcessor/lambda$2$Type',1600);bcb(1601,1,qie,Wdc);_.td=function Xdc(a){Ldc(BD(a,10))};var GT=mdb(Ane,'SelfLoopPostProcessor/lambda$3$Type',1601);bcb(1602,1,{},Ydc);_.Kb=function Zdc(a){return new YAb(null,new Kub(BD(a,101).f,1))};var HT=mdb(Ane,'SelfLoopPostProcessor/lambda$4$Type',1602);bcb(1603,1,qie,$dc);_.td=function _dc(a){Mdc(this.a,BD(a,409))};var IT=mdb(Ane,'SelfLoopPostProcessor/lambda$5$Type',1603);bcb(1604,1,Oie,aec);_.Mb=function bec(a){return !!BD(a,101).i};var JT=mdb(Ane,'SelfLoopPostProcessor/lambda$6$Type',1604);bcb(1605,1,qie,cec);_.td=function dec(a){Odc(this.a,BD(a,101))};var KT=mdb(Ane,'SelfLoopPostProcessor/lambda$7$Type',1605);bcb(1587,1,ene,hec);_.pf=function iec(a,b){gec(BD(a,37),b)};var PT=mdb(Ane,'SelfLoopPreProcessor',1587);bcb(1588,1,{},jec);_.Kb=function kec(a){return new YAb(null,new Kub(BD(a,101).f,1))};var MT=mdb(Ane,'SelfLoopPreProcessor/lambda$0$Type',1588);bcb(1589,1,{},lec);_.Kb=function mec(a){return BD(a,409).a};var NT=mdb(Ane,'SelfLoopPreProcessor/lambda$1$Type',1589);bcb(1590,1,qie,nec);_.td=function oec(a){fec(BD(a,17))};var OT=mdb(Ane,'SelfLoopPreProcessor/lambda$2$Type',1590);bcb(1606,1,ene,sec);_.pf=function tec(a,b){qec(this,BD(a,37),b)};var VT=mdb(Ane,'SelfLoopRouter',1606);bcb(1607,1,{},uec);_.Kb=function vec(a){return new YAb(null,new Kub(BD(a,29).a,16))};var QT=mdb(Ane,'SelfLoopRouter/lambda$0$Type',1607);bcb(1608,1,Oie,wec);_.Mb=function xec(a){return BD(a,10).k==(j0b(),h0b)};var RT=mdb(Ane,'SelfLoopRouter/lambda$1$Type',1608);bcb(1609,1,Oie,yec);_.Mb=function zec(a){return wNb(BD(a,10),(wtc(),ntc))};var ST=mdb(Ane,'SelfLoopRouter/lambda$2$Type',1609);bcb(1610,1,{},Aec);_.Kb=function Bec(a){return BD(vNb(BD(a,10),(wtc(),ntc)),403)};var TT=mdb(Ane,'SelfLoopRouter/lambda$3$Type',1610);bcb(1611,1,qie,Cec);_.td=function Dec(a){pec(this.a,this.b,BD(a,403))};var UT=mdb(Ane,'SelfLoopRouter/lambda$4$Type',1611);bcb(1612,1,ene,Fec);_.pf=function Iec(a,b){Eec(BD(a,37),b)};var $T=mdb(Ane,'SemiInteractiveCrossMinProcessor',1612);bcb(1613,1,Oie,Jec);_.Mb=function Kec(a){return BD(a,10).k==(j0b(),h0b)};var WT=mdb(Ane,'SemiInteractiveCrossMinProcessor/lambda$0$Type',1613);bcb(1614,1,Oie,Lec);_.Mb=function Mec(a){return uNb(BD(a,10))._b((Nyc(),ayc))};var XT=mdb(Ane,'SemiInteractiveCrossMinProcessor/lambda$1$Type',1614);bcb(1615,1,Dke,Nec);_.ue=function Oec(a,b){return Gec(BD(a,10),BD(b,10))};_.Fb=function Pec(a){return this===a};_.ve=function Qec(){return new tpb(this)};var YT=mdb(Ane,'SemiInteractiveCrossMinProcessor/lambda$2$Type',1615);bcb(1616,1,{},Rec);_.Ce=function Sec(a,b){return Hec(BD(a,10),BD(b,10))};var ZT=mdb(Ane,'SemiInteractiveCrossMinProcessor/lambda$3$Type',1616);bcb(1618,1,ene,Uec);_.pf=function Yec(a,b){Tec(BD(a,37),b)};var bU=mdb(Ane,'SortByInputModelProcessor',1618);bcb(1619,1,Oie,Zec);_.Mb=function $ec(a){return BD(a,11).g.c.length!=0};var _T=mdb(Ane,'SortByInputModelProcessor/lambda$0$Type',1619);bcb(1620,1,qie,_ec);_.td=function afc(a){Wec(this.a,BD(a,11))};var aU=mdb(Ane,'SortByInputModelProcessor/lambda$1$Type',1620);bcb(1693,803,{},jfc);_.Me=function kfc(a){var b,c,d,e;this.c=a;switch(this.a.g){case 2:b=new Rkb;MAb(JAb(new YAb(null,new Kub(this.c.a.b,16)),new lgc),new ngc(this,b));nEb(this,new tfc);Hkb(b,new xfc);b.c=KC(SI,Uhe,1,0,5,1);MAb(JAb(new YAb(null,new Kub(this.c.a.b,16)),new zfc),new Bfc(b));nEb(this,new Ffc);Hkb(b,new Jfc);b.c=KC(SI,Uhe,1,0,5,1);c=Ntb($zb(OAb(new YAb(null,new Kub(this.c.a.b,16)),new Lfc(this))),new Nfc);MAb(new YAb(null,new Kub(this.c.a.a,16)),new Rfc(c,b));nEb(this,new Vfc);Hkb(b,new Zfc);b.c=KC(SI,Uhe,1,0,5,1);break;case 3:d=new Rkb;nEb(this,new lfc);e=Ntb($zb(OAb(new YAb(null,new Kub(this.c.a.b,16)),new pfc(this))),new Pfc);MAb(JAb(new YAb(null,new Kub(this.c.a.b,16)),new _fc),new bgc(e,d));nEb(this,new fgc);Hkb(d,new jgc);d.c=KC(SI,Uhe,1,0,5,1);break;default:throw vbb(new x2c);}};_.b=0;var AU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation',1693);bcb(1694,1,Vke,lfc);_.Lb=function mfc(a){return JD(BD(a,57).g,145)};_.Fb=function nfc(a){return this===a};_.Mb=function ofc(a){return JD(BD(a,57).g,145)};var cU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$0$Type',1694);bcb(1695,1,{},pfc);_.Fe=function qfc(a){return dfc(this.a,BD(a,57))};var dU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$1$Type',1695);bcb(1703,1,Pie,rfc);_.Vd=function sfc(){cfc(this.a,this.b,-1)};_.b=0;var eU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$10$Type',1703);bcb(1705,1,Vke,tfc);_.Lb=function ufc(a){return JD(BD(a,57).g,145)};_.Fb=function vfc(a){return this===a};_.Mb=function wfc(a){return JD(BD(a,57).g,145)};var fU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$11$Type',1705);bcb(1706,1,qie,xfc);_.td=function yfc(a){BD(a,365).Vd()};var gU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$12$Type',1706);bcb(1707,1,Oie,zfc);_.Mb=function Afc(a){return JD(BD(a,57).g,10)};var hU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$13$Type',1707);bcb(1709,1,qie,Bfc);_.td=function Cfc(a){efc(this.a,BD(a,57))};var iU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$14$Type',1709);bcb(1708,1,Pie,Dfc);_.Vd=function Efc(){cfc(this.b,this.a,-1)};_.a=0;var jU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$15$Type',1708);bcb(1710,1,Vke,Ffc);_.Lb=function Gfc(a){return JD(BD(a,57).g,10)};_.Fb=function Hfc(a){return this===a};_.Mb=function Ifc(a){return JD(BD(a,57).g,10)};var kU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$16$Type',1710);bcb(1711,1,qie,Jfc);_.td=function Kfc(a){BD(a,365).Vd()};var lU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$17$Type',1711);bcb(1712,1,{},Lfc);_.Fe=function Mfc(a){return ffc(this.a,BD(a,57))};var mU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$18$Type',1712);bcb(1713,1,{},Nfc);_.De=function Ofc(){return 0};var nU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$19$Type',1713);bcb(1696,1,{},Pfc);_.De=function Qfc(){return 0};var oU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$2$Type',1696);bcb(1715,1,qie,Rfc);_.td=function Sfc(a){gfc(this.a,this.b,BD(a,307))};_.a=0;var pU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$20$Type',1715);bcb(1714,1,Pie,Tfc);_.Vd=function Ufc(){bfc(this.a,this.b,-1)};_.b=0;var qU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$21$Type',1714);bcb(1716,1,Vke,Vfc);_.Lb=function Wfc(a){return BD(a,57),true};_.Fb=function Xfc(a){return this===a};_.Mb=function Yfc(a){return BD(a,57),true};var rU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$22$Type',1716);bcb(1717,1,qie,Zfc);_.td=function $fc(a){BD(a,365).Vd()};var sU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$23$Type',1717);bcb(1697,1,Oie,_fc);_.Mb=function agc(a){return JD(BD(a,57).g,10)};var tU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$3$Type',1697);bcb(1699,1,qie,bgc);_.td=function cgc(a){hfc(this.a,this.b,BD(a,57))};_.a=0;var uU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$4$Type',1699);bcb(1698,1,Pie,dgc);_.Vd=function egc(){cfc(this.b,this.a,-1)};_.a=0;var vU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$5$Type',1698);bcb(1700,1,Vke,fgc);_.Lb=function ggc(a){return BD(a,57),true};_.Fb=function hgc(a){return this===a};_.Mb=function igc(a){return BD(a,57),true};var wU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$6$Type',1700);bcb(1701,1,qie,jgc);_.td=function kgc(a){BD(a,365).Vd()};var xU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$7$Type',1701);bcb(1702,1,Oie,lgc);_.Mb=function mgc(a){return JD(BD(a,57).g,145)};var yU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$8$Type',1702);bcb(1704,1,qie,ngc);_.td=function ogc(a){ifc(this.a,this.b,BD(a,57))};var zU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$9$Type',1704);bcb(1521,1,ene,sgc);_.pf=function xgc(a,b){rgc(this,BD(a,37),b)};var pgc;var EU=mdb(Jne,'HorizontalGraphCompactor',1521);bcb(1522,1,{},ygc);_.Oe=function zgc(a,b){var c,d,e;if(vgc(a,b)){return 0}c=tgc(a);d=tgc(b);if(!!c&&c.k==(j0b(),e0b)||!!d&&d.k==(j0b(),e0b)){return 0}e=BD(vNb(this.a.a,(wtc(),otc)),304);return fBc(e,c?c.k:(j0b(),g0b),d?d.k:(j0b(),g0b))};_.Pe=function Agc(a,b){var c,d,e;if(vgc(a,b)){return 1}c=tgc(a);d=tgc(b);e=BD(vNb(this.a.a,(wtc(),otc)),304);return iBc(e,c?c.k:(j0b(),g0b),d?d.k:(j0b(),g0b))};var BU=mdb(Jne,'HorizontalGraphCompactor/1',1522);bcb(1523,1,{},Bgc);_.Ne=function Cgc(a,b){return qgc(),a.a.i==0};var CU=mdb(Jne,'HorizontalGraphCompactor/lambda$0$Type',1523);bcb(1524,1,{},Dgc);_.Ne=function Egc(a,b){return wgc(this.a,a,b)};var DU=mdb(Jne,'HorizontalGraphCompactor/lambda$1$Type',1524);bcb(1664,1,{},Ygc);var Fgc,Ggc;var cV=mdb(Jne,'LGraphToCGraphTransformer',1664);bcb(1672,1,Oie,ehc);_.Mb=function fhc(a){return a!=null};var FU=mdb(Jne,'LGraphToCGraphTransformer/0methodref$nonNull$Type',1672);bcb(1665,1,{},ghc);_.Kb=function hhc(a){return Hgc(),fcb(vNb(BD(BD(a,57).g,10),(wtc(),$sc)))};var GU=mdb(Jne,'LGraphToCGraphTransformer/lambda$0$Type',1665);bcb(1666,1,{},ihc);_.Kb=function jhc(a){return Hgc(),gic(BD(BD(a,57).g,145))};var HU=mdb(Jne,'LGraphToCGraphTransformer/lambda$1$Type',1666);bcb(1675,1,Oie,khc);_.Mb=function lhc(a){return Hgc(),JD(BD(a,57).g,10)};var IU=mdb(Jne,'LGraphToCGraphTransformer/lambda$10$Type',1675);bcb(1676,1,qie,mhc);_.td=function nhc(a){Zgc(BD(a,57))};var JU=mdb(Jne,'LGraphToCGraphTransformer/lambda$11$Type',1676);bcb(1677,1,Oie,ohc);_.Mb=function phc(a){return Hgc(),JD(BD(a,57).g,145)};var KU=mdb(Jne,'LGraphToCGraphTransformer/lambda$12$Type',1677);bcb(1681,1,qie,qhc);_.td=function rhc(a){$gc(BD(a,57))};var LU=mdb(Jne,'LGraphToCGraphTransformer/lambda$13$Type',1681);bcb(1678,1,qie,shc);_.td=function thc(a){_gc(this.a,BD(a,8))};_.a=0;var MU=mdb(Jne,'LGraphToCGraphTransformer/lambda$14$Type',1678);bcb(1679,1,qie,uhc);_.td=function vhc(a){ahc(this.a,BD(a,110))};_.a=0;var NU=mdb(Jne,'LGraphToCGraphTransformer/lambda$15$Type',1679);bcb(1680,1,qie,whc);_.td=function xhc(a){bhc(this.a,BD(a,8))};_.a=0;var OU=mdb(Jne,'LGraphToCGraphTransformer/lambda$16$Type',1680);bcb(1682,1,{},yhc);_.Kb=function zhc(a){return Hgc(),new YAb(null,new Lub(new Sr(ur(U_b(BD(a,10)).a.Kc(),new Sq))))};var PU=mdb(Jne,'LGraphToCGraphTransformer/lambda$17$Type',1682);bcb(1683,1,Oie,Ahc);_.Mb=function Bhc(a){return Hgc(),OZb(BD(a,17))};var QU=mdb(Jne,'LGraphToCGraphTransformer/lambda$18$Type',1683);bcb(1684,1,qie,Chc);_.td=function Dhc(a){Qgc(this.a,BD(a,17))};var RU=mdb(Jne,'LGraphToCGraphTransformer/lambda$19$Type',1684);bcb(1668,1,qie,Ehc);_.td=function Fhc(a){Rgc(this.a,BD(a,145))};var SU=mdb(Jne,'LGraphToCGraphTransformer/lambda$2$Type',1668);bcb(1685,1,{},Ghc);_.Kb=function Hhc(a){return Hgc(),new YAb(null,new Kub(BD(a,29).a,16))};var TU=mdb(Jne,'LGraphToCGraphTransformer/lambda$20$Type',1685);bcb(1686,1,{},Ihc);_.Kb=function Jhc(a){return Hgc(),new YAb(null,new Lub(new Sr(ur(U_b(BD(a,10)).a.Kc(),new Sq))))};var UU=mdb(Jne,'LGraphToCGraphTransformer/lambda$21$Type',1686);bcb(1687,1,{},Khc);_.Kb=function Lhc(a){return Hgc(),BD(vNb(BD(a,17),(wtc(),rtc)),15)};var VU=mdb(Jne,'LGraphToCGraphTransformer/lambda$22$Type',1687);bcb(1688,1,Oie,Mhc);_.Mb=function Nhc(a){return chc(BD(a,15))};var WU=mdb(Jne,'LGraphToCGraphTransformer/lambda$23$Type',1688);bcb(1689,1,qie,Ohc);_.td=function Phc(a){Jgc(this.a,BD(a,15))};var XU=mdb(Jne,'LGraphToCGraphTransformer/lambda$24$Type',1689);bcb(1667,1,qie,Qhc);_.td=function Rhc(a){Sgc(this.a,this.b,BD(a,145))};var YU=mdb(Jne,'LGraphToCGraphTransformer/lambda$3$Type',1667);bcb(1669,1,{},Shc);_.Kb=function Thc(a){return Hgc(),new YAb(null,new Kub(BD(a,29).a,16))};var ZU=mdb(Jne,'LGraphToCGraphTransformer/lambda$4$Type',1669);bcb(1670,1,{},Uhc);_.Kb=function Vhc(a){return Hgc(),new YAb(null,new Lub(new Sr(ur(U_b(BD(a,10)).a.Kc(),new Sq))))};var $U=mdb(Jne,'LGraphToCGraphTransformer/lambda$5$Type',1670);bcb(1671,1,{},Whc);_.Kb=function Xhc(a){return Hgc(),BD(vNb(BD(a,17),(wtc(),rtc)),15)};var _U=mdb(Jne,'LGraphToCGraphTransformer/lambda$6$Type',1671);bcb(1673,1,qie,Yhc);_.td=function Zhc(a){dhc(this.a,BD(a,15))};var aV=mdb(Jne,'LGraphToCGraphTransformer/lambda$8$Type',1673);bcb(1674,1,qie,$hc);_.td=function _hc(a){Tgc(this.a,this.b,BD(a,145))};var bV=mdb(Jne,'LGraphToCGraphTransformer/lambda$9$Type',1674);bcb(1663,1,{},dic);_.Le=function eic(a){var b,c,d,e,f;this.a=a;this.d=new KFb;this.c=KC(jN,Uhe,121,this.a.a.a.c.length,0,1);this.b=0;for(c=new olb(this.a.a.a);c.a=p){Ekb(f,meb(k));s=$wnd.Math.max(s,t[k-1]-l);h+=o;q+=t[k-1]-q;l=t[k-1];o=i[k]}o=$wnd.Math.max(o,i[k]);++k}h+=o}n=$wnd.Math.min(1/s,1/b.b/h);if(n>d){d=n;c=f}}return c};_.Wf=function mpc(){return false};var CW=mdb(Rne,'MSDCutIndexHeuristic',802);bcb(1617,1,ene,ppc);_.pf=function qpc(a,b){opc(BD(a,37),b)};var DW=mdb(Rne,'SingleEdgeGraphWrapper',1617);bcb(227,22,{3:1,35:1,22:1,227:1},Bpc);var upc,vpc,wpc,xpc,ypc,zpc;var EW=ndb(Sne,'CenterEdgeLabelPlacementStrategy',227,CI,Dpc,Cpc);var Epc;bcb(422,22,{3:1,35:1,22:1,422:1},Jpc);var Gpc,Hpc;var FW=ndb(Sne,'ConstraintCalculationStrategy',422,CI,Lpc,Kpc);var Mpc;bcb(314,22,{3:1,35:1,22:1,314:1,246:1,234:1},Tpc);_.Kf=function Vpc(){return Spc(this)};_.Xf=function Upc(){return Spc(this)};var Opc,Ppc,Qpc;var GW=ndb(Sne,'CrossingMinimizationStrategy',314,CI,Xpc,Wpc);var Ypc;bcb(337,22,{3:1,35:1,22:1,337:1},cqc);var $pc,_pc,aqc;var HW=ndb(Sne,'CuttingStrategy',337,CI,eqc,dqc);var fqc;bcb(335,22,{3:1,35:1,22:1,335:1,246:1,234:1},oqc);_.Kf=function qqc(){return nqc(this)};_.Xf=function pqc(){return nqc(this)};var hqc,iqc,jqc,kqc,lqc;var IW=ndb(Sne,'CycleBreakingStrategy',335,CI,sqc,rqc);var tqc;bcb(419,22,{3:1,35:1,22:1,419:1},yqc);var vqc,wqc;var JW=ndb(Sne,'DirectionCongruency',419,CI,Aqc,zqc);var Bqc;bcb(450,22,{3:1,35:1,22:1,450:1},Hqc);var Dqc,Eqc,Fqc;var KW=ndb(Sne,'EdgeConstraint',450,CI,Jqc,Iqc);var Kqc;bcb(276,22,{3:1,35:1,22:1,276:1},Uqc);var Mqc,Nqc,Oqc,Pqc,Qqc,Rqc;var LW=ndb(Sne,'EdgeLabelSideSelection',276,CI,Wqc,Vqc);var Xqc;bcb(479,22,{3:1,35:1,22:1,479:1},arc);var Zqc,$qc;var MW=ndb(Sne,'EdgeStraighteningStrategy',479,CI,crc,brc);var drc;bcb(274,22,{3:1,35:1,22:1,274:1},mrc);var frc,grc,hrc,irc,jrc,krc;var NW=ndb(Sne,'FixedAlignment',274,CI,orc,nrc);var prc;bcb(275,22,{3:1,35:1,22:1,275:1},zrc);var rrc,trc,urc,vrc,wrc,xrc;var OW=ndb(Sne,'GraphCompactionStrategy',275,CI,Brc,Arc);var Crc;bcb(256,22,{3:1,35:1,22:1,256:1},Prc);var Erc,Frc,Grc,Hrc,Irc,Jrc,Krc,Lrc,Mrc,Nrc;var PW=ndb(Sne,'GraphProperties',256,CI,Rrc,Qrc);var Src;bcb(292,22,{3:1,35:1,22:1,292:1},Yrc);var Urc,Vrc,Wrc;var QW=ndb(Sne,'GreedySwitchType',292,CI,$rc,Zrc);var _rc;bcb(303,22,{3:1,35:1,22:1,303:1},fsc);var bsc,csc,dsc;var RW=ndb(Sne,'InLayerConstraint',303,CI,hsc,gsc);var isc;bcb(420,22,{3:1,35:1,22:1,420:1},nsc);var ksc,lsc;var SW=ndb(Sne,'InteractiveReferencePoint',420,CI,psc,osc);var qsc;var ssc,tsc,usc,vsc,wsc,xsc,ysc,zsc,Asc,Bsc,Csc,Dsc,Esc,Fsc,Gsc,Hsc,Isc,Jsc,Ksc,Lsc,Msc,Nsc,Osc,Psc,Qsc,Rsc,Ssc,Tsc,Usc,Vsc,Wsc,Xsc,Ysc,Zsc,$sc,_sc,atc,btc,ctc,dtc,etc,ftc,gtc,htc,itc,jtc,ktc,ltc,mtc,ntc,otc,ptc,qtc,rtc,stc,ttc,utc,vtc;bcb(163,22,{3:1,35:1,22:1,163:1},Dtc);var xtc,ytc,ztc,Atc,Btc;var TW=ndb(Sne,'LayerConstraint',163,CI,Ftc,Etc);var Gtc;bcb(848,1,ale,kwc);_.Qe=function lwc(a){t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Yne),''),'Direction Congruency'),'Specifies how drawings of the same graph with different layout directions compare to each other: either a natural reading direction is preserved or the drawings are rotated versions of each other.'),puc),(_5c(),V5c)),JW),pqb((N5c(),L5c)))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Zne),''),'Feedback Edges'),'Whether feedback edges should be highlighted by routing around the nodes.'),(Bcb(),false)),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,$ne),''),'Interactive Reference Point'),'Determines which point of a node is considered by interactive layout phases.'),Muc),V5c),SW),pqb(L5c))));o4c(a,$ne,goe,Ouc);o4c(a,$ne,qoe,Nuc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,_ne),''),'Merge Edges'),'Edges that have no ports are merged so they touch the connected nodes at the same points. When this option is disabled, one port is created for each edge directly connected to a node. When it is enabled, all such incoming edges share an input port, and all outgoing edges share an output port.'),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,aoe),''),'Merge Hierarchy-Crossing Edges'),'If hierarchical layout is active, hierarchy-crossing edges use as few hierarchical ports as possible. They are broken by the algorithm, with hierarchical ports inserted as required. Usually, one such port is created for each edge at each hierarchy crossing point. With this option set to true, we try to create as few hierarchical ports as possible in the process. In particular, all edges that form a hyperedge can share a port.'),true),T5c),wI),pqb(L5c))));t4c(a,new p5c(C5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,boe),''),'Allow Non-Flow Ports To Switch Sides'),"Specifies whether non-flow ports may switch sides if their node's port constraints are either FIXED_SIDE or FIXED_ORDER. A non-flow port is a port on a side that is not part of the currently configured layout flow. For instance, given a left-to-right layout direction, north and south ports would be considered non-flow ports. Further note that the underlying criterium whether to switch sides or not solely relies on the minimization of edge crossings. Hence, edge length and other aesthetics criteria are not addressed."),false),T5c),wI),pqb(M5c)),OC(GC(ZI,1),nie,2,6,['org.eclipse.elk.layered.northOrSouthPort']))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,coe),''),'Port Sorting Strategy'),"Only relevant for nodes with FIXED_SIDE port constraints. Determines the way a node's ports are distributed on the sides of a node if their order is not prescribed. The option is set on parent nodes."),xvc),V5c),cX),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,doe),''),'Thoroughness'),'How much effort should be spent to produce a nice layout.'),meb(7)),X5c),JI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,eoe),''),'Add Unnecessary Bendpoints'),'Adds bend points even if an edge does not change direction. If true, each long edge dummy will contribute a bend point to its edges and hierarchy-crossing edges will always get a bend point where they cross hierarchy boundaries. By default, bend points are only added where an edge changes direction.'),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,foe),''),'Generate Position and Layer IDs'),'If enabled position id and layer id are generated, which are usually only used internally when setting the interactiveLayout option. This option should be specified on the root node.'),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,goe),'cycleBreaking'),'Cycle Breaking Strategy'),'Strategy for cycle breaking. Cycle breaking looks for cycles in the graph and determines which edges to reverse to break the cycles. Reversed edges will end up pointing to the opposite direction of regular edges (that is, reversed edges will point left if edges usually point right).'),nuc),V5c),IW),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,hoe),ppe),'Node Layering Strategy'),'Strategy for node layering.'),bvc),V5c),YW),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,ioe),ppe),'Layer Constraint'),'Determines a constraint on the placement of the node regarding the layering.'),Tuc),V5c),TW),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,joe),ppe),'Layer Choice Constraint'),"Allows to set a constraint regarding the layer placement of a node. Let i be the value of teh constraint. Assumed the drawing has n layers and i < n. If set to i, it expresses that the node should be placed in i-th layer. Should i>=n be true then the node is placed in the last layer of the drawing. Note that this option is not part of any of ELK Layered's default configurations but is only evaluated as part of the `InteractiveLayeredGraphVisitor`, which must be applied manually or used via the `DiagramLayoutEngine."),meb(-1)),X5c),JI),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,koe),ppe),'Layer ID'),'Layer identifier that was calculated by ELK Layered for a node. This is only generated if interactiveLayot or generatePositionAndLayerIds is set.'),meb(-1)),X5c),JI),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,loe),qpe),'Upper Bound On Width [MinWidth Layerer]'),"Defines a loose upper bound on the width of the MinWidth layerer. If set to '-1' multiple values are tested and the best result is selected."),meb(4)),X5c),JI),pqb(L5c))));o4c(a,loe,hoe,Wuc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,moe),qpe),'Upper Layer Estimation Scaling Factor [MinWidth Layerer]'),"Multiplied with Upper Bound On Width for defining an upper bound on the width of layers which haven't been determined yet, but whose maximum width had been (roughly) estimated by the MinWidth algorithm. Compensates for too high estimations. If set to '-1' multiple values are tested and the best result is selected."),meb(2)),X5c),JI),pqb(L5c))));o4c(a,moe,hoe,Yuc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,noe),rpe),'Node Promotion Strategy'),'Reduces number of dummy nodes after layering phase (if possible).'),_uc),V5c),aX),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,ooe),rpe),'Max Node Promotion Iterations'),'Limits the number of iterations for node promotion.'),meb(0)),X5c),JI),pqb(L5c))));o4c(a,ooe,noe,null);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,poe),'layering.coffmanGraham'),'Layer Bound'),'The maximum number of nodes allowed per layer.'),meb(Ohe)),X5c),JI),pqb(L5c))));o4c(a,poe,hoe,Quc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,qoe),spe),'Crossing Minimization Strategy'),'Strategy for crossing minimization.'),luc),V5c),GW),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,roe),spe),'Force Node Model Order'),'The node order given by the model does not change to produce a better layout. E.g. if node A is before node B in the model this is not changed during crossing minimization. This assumes that the node model order is already respected before crossing minimization. This can be achieved by setting considerModelOrder.strategy to NODES_AND_EDGES.'),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,soe),spe),'Hierarchical Sweepiness'),'How likely it is to use cross-hierarchy (1) vs bottom-up (-1).'),0.1),U5c),BI),pqb(L5c))));o4c(a,soe,tpe,fuc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,toe),spe),'Semi-Interactive Crossing Minimization'),"Preserves the order of nodes within a layer but still minimizes crossings between edges connecting long edge dummies. Derives the desired order from positions specified by the 'org.eclipse.elk.position' layout option. Requires a crossing minimization strategy that is able to process 'in-layer' constraints."),false),T5c),wI),pqb(L5c))));o4c(a,toe,qoe,juc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,uoe),spe),'Position Choice Constraint'),"Allows to set a constraint regarding the position placement of a node in a layer. Assumed the layer in which the node placed includes n other nodes and i < n. If set to i, it expresses that the node should be placed at the i-th position. Should i>=n be true then the node is placed at the last position in the layer. Note that this option is not part of any of ELK Layered's default configurations but is only evaluated as part of the `InteractiveLayeredGraphVisitor`, which must be applied manually or used via the `DiagramLayoutEngine."),meb(-1)),X5c),JI),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,voe),spe),'Position ID'),'Position within a layer that was determined by ELK Layered for a node. This is only generated if interactiveLayot or generatePositionAndLayerIds is set.'),meb(-1)),X5c),JI),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,woe),upe),'Greedy Switch Activation Threshold'),"By default it is decided automatically if the greedy switch is activated or not. The decision is based on whether the size of the input graph (without dummy nodes) is smaller than the value of this option. A '0' enforces the activation."),meb(40)),X5c),JI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,xoe),upe),'Greedy Switch Crossing Minimization'),"Greedy Switch strategy for crossing minimization. The greedy switch heuristic is executed after the regular crossing minimization as a post-processor. Note that if 'hierarchyHandling' is set to 'INCLUDE_CHILDREN', the 'greedySwitchHierarchical.type' option must be used."),cuc),V5c),QW),pqb(L5c))));o4c(a,xoe,qoe,duc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,yoe),'crossingMinimization.greedySwitchHierarchical'),'Greedy Switch Crossing Minimization (hierarchical)'),"Activates the greedy switch heuristic in case hierarchical layout is used. The differences to the non-hierarchical case (see 'greedySwitch.type') are: 1) greedy switch is inactive by default, 3) only the option value set on the node at which hierarchical layout starts is relevant, and 2) if it's activated by the user, it properly addresses hierarchy-crossing edges."),$tc),V5c),QW),pqb(L5c))));o4c(a,yoe,qoe,_tc);o4c(a,yoe,tpe,auc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,zoe),vpe),'Node Placement Strategy'),'Strategy for node placement.'),vvc),V5c),_W),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,Aoe),vpe),'Favor Straight Edges Over Balancing'),"Favor straight edges over a balanced node placement. The default behavior is determined automatically based on the used 'edgeRouting'. For an orthogonal style it is set to true, for all other styles to false."),T5c),wI),pqb(L5c))));o4c(a,Aoe,zoe,lvc);o4c(a,Aoe,zoe,mvc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Boe),wpe),'BK Edge Straightening'),"Specifies whether the Brandes Koepf node placer tries to increase the number of straight edges at the expense of diagram size. There is a subtle difference to the 'favorStraightEdges' option, which decides whether a balanced placement of the nodes is desired, or not. In bk terms this means combining the four alignments into a single balanced one, or not. This option on the other hand tries to straighten additional edges during the creation of each of the four alignments."),fvc),V5c),MW),pqb(L5c))));o4c(a,Boe,zoe,gvc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Coe),wpe),'BK Fixed Alignment'),'Tells the BK node placer to use a certain alignment (out of its four) instead of the one producing the smallest height, or the combination of all four.'),ivc),V5c),NW),pqb(L5c))));o4c(a,Coe,zoe,jvc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Doe),'nodePlacement.linearSegments'),'Linear Segments Deflection Dampening'),'Dampens the movement of nodes to keep the diagram from getting too large.'),0.3),U5c),BI),pqb(L5c))));o4c(a,Doe,zoe,ovc);t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,Eoe),'nodePlacement.networkSimplex'),'Node Flexibility'),"Aims at shorter and straighter edges. Two configurations are possible: (a) allow ports to move freely on the side they are assigned to (the order is always defined beforehand), (b) additionally allow to enlarge a node wherever it helps. If this option is not configured for a node, the 'nodeFlexibility.default' value is used, which is specified for the node's parent."),V5c),$W),pqb(K5c))));o4c(a,Eoe,zoe,tvc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Foe),'nodePlacement.networkSimplex.nodeFlexibility'),'Node Flexibility Default'),"Default value of the 'nodeFlexibility' option for the children of a hierarchical node."),rvc),V5c),$W),pqb(L5c))));o4c(a,Foe,zoe,svc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Goe),xpe),'Self-Loop Distribution'),'Alter the distribution of the loops around the node. It only takes effect for PortConstraints.FREE.'),xuc),V5c),eX),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Hoe),xpe),'Self-Loop Ordering'),'Alter the ordering of the loops they can either be stacked or sequenced. It only takes effect for PortConstraints.FREE.'),zuc),V5c),fX),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Ioe),'edgeRouting.splines'),'Spline Routing Mode'),'Specifies the way control points are assembled for each individual edge. CONSERVATIVE ensures that edges are properly routed around the nodes but feels rather orthogonal at times. SLOPPY uses fewer control points to obtain curvier edge routes but may result in edges overlapping nodes.'),Buc),V5c),hX),pqb(L5c))));o4c(a,Ioe,ype,Cuc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Joe),'edgeRouting.splines.sloppy'),'Sloppy Spline Layer Spacing Factor'),'Spacing factor for routing area between layers when using sloppy spline routing.'),0.2),U5c),BI),pqb(L5c))));o4c(a,Joe,ype,Euc);o4c(a,Joe,Ioe,Fuc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Koe),'edgeRouting.polyline'),'Sloped Edge Zone Width'),'Width of the strip to the left and to the right of each layer where the polyline edge router is allowed to refrain from ensuring that edges are routed horizontally. This prevents awkward bend points for nodes that extent almost to the edge of their layer.'),2),U5c),BI),pqb(L5c))));o4c(a,Koe,ype,vuc);t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,Loe),zpe),'Spacing Base Value'),"An optional base value for all other layout options of the 'spacing' group. It can be used to conveniently alter the overall 'spaciousness' of the drawing. Whenever an explicit value is set for the other layout options, this base value will have no effect. The base value is not inherited, i.e. it must be set for each hierarchical node."),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Moe),zpe),'Edge Node Between Layers Spacing'),"The spacing to be preserved between nodes and edges that are routed next to the node's layer. For the spacing between nodes and edges that cross the node's layer 'spacing.edgeNode' is used."),10),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Noe),zpe),'Edge Edge Between Layer Spacing'),"Spacing to be preserved between pairs of edges that are routed between the same pair of layers. Note that 'spacing.edgeEdge' is used for the spacing between pairs of edges crossing the same layer."),10),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Ooe),zpe),'Node Node Between Layers Spacing'),"The spacing to be preserved between any pair of nodes of two adjacent layers. Note that 'spacing.nodeNode' is used for the spacing between nodes within the layer itself."),20),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Poe),Ape),'Direction Priority'),'Defines how important it is to have a certain edge point into the direction of the overall layout. This option is evaluated during the cycle breaking phase.'),meb(0)),X5c),JI),pqb(I5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Qoe),Ape),'Shortness Priority'),'Defines how important it is to keep an edge as short as possible. This option is evaluated during the layering phase.'),meb(0)),X5c),JI),pqb(I5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Roe),Ape),'Straightness Priority'),'Defines how important it is to keep an edge straight, i.e. aligned with one of the two axes. This option is evaluated during node placement.'),meb(0)),X5c),JI),pqb(I5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Soe),Bpe),Ole),'Tries to further compact components (disconnected sub-graphs).'),false),T5c),wI),pqb(L5c))));o4c(a,Soe,zme,true);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Toe),Cpe),'Post Compaction Strategy'),Dpe),Ntc),V5c),OW),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Uoe),Cpe),'Post Compaction Constraint Calculation'),Dpe),Ltc),V5c),FW),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Voe),Epe),'High Degree Node Treatment'),'Makes room around high degree nodes to place leafs and trees.'),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Woe),Epe),'High Degree Node Threshold'),'Whether a node is considered to have a high degree.'),meb(16)),X5c),JI),pqb(L5c))));o4c(a,Woe,Voe,true);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Xoe),Epe),'High Degree Node Maximum Tree Height'),'Maximum height of a subtree connected to a high degree node to be moved to separate layers.'),meb(5)),X5c),JI),pqb(L5c))));o4c(a,Xoe,Voe,true);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Yoe),Fpe),'Graph Wrapping Strategy'),"For certain graphs and certain prescribed drawing areas it may be desirable to split the laid out graph into chunks that are placed side by side. The edges that connect different chunks are 'wrapped' around from the end of one chunk to the start of the other chunk. The points between the chunks are referred to as 'cuts'."),bwc),V5c),jX),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Zoe),Fpe),'Additional Wrapped Edges Spacing'),'To visually separate edges that are wrapped from regularly routed edges an additional spacing value can be specified in form of this layout option. The spacing is added to the regular edgeNode spacing.'),10),U5c),BI),pqb(L5c))));o4c(a,Zoe,Yoe,Ivc);o4c(a,Zoe,Yoe,Jvc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,$oe),Fpe),'Correction Factor for Wrapping'),"At times and for certain types of graphs the executed wrapping may produce results that are consistently biased in the same fashion: either wrapping to often or to rarely. This factor can be used to correct the bias. Internally, it is simply multiplied with the 'aspect ratio' layout option."),1),U5c),BI),pqb(L5c))));o4c(a,$oe,Yoe,Lvc);o4c(a,$oe,Yoe,Mvc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,_oe),Gpe),'Cutting Strategy'),'The strategy by which the layer indexes are determined at which the layering crumbles into chunks.'),Tvc),V5c),HW),pqb(L5c))));o4c(a,_oe,Yoe,Uvc);o4c(a,_oe,Yoe,Vvc);t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,ape),Gpe),'Manually Specified Cuts'),'Allows the user to specify her own cuts for a certain graph.'),Y5c),yK),pqb(L5c))));o4c(a,ape,_oe,Ovc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,bpe),'wrapping.cutting.msd'),'MSD Freedom'),'The MSD cutting strategy starts with an initial guess on the number of chunks the graph should be split into. The freedom specifies how much the strategy may deviate from this guess. E.g. if an initial number of 3 is computed, a freedom of 1 allows 2, 3, and 4 cuts.'),Qvc),X5c),JI),pqb(L5c))));o4c(a,bpe,_oe,Rvc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,cpe),Hpe),'Validification Strategy'),'When wrapping graphs, one can specify indices that are not allowed as split points. The validification strategy makes sure every computed split point is allowed.'),gwc),V5c),iX),pqb(L5c))));o4c(a,cpe,Yoe,hwc);o4c(a,cpe,Yoe,iwc);t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,dpe),Hpe),'Valid Indices for Wrapping'),null),Y5c),yK),pqb(L5c))));o4c(a,dpe,Yoe,dwc);o4c(a,dpe,Yoe,ewc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,epe),Ipe),'Improve Cuts'),'For general graphs it is important that not too many edges wrap backwards. Thus a compromise between evenly-distributed cuts and the total number of cut edges is sought.'),true),T5c),wI),pqb(L5c))));o4c(a,epe,Yoe,Zvc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,fpe),Ipe),'Distance Penalty When Improving Cuts'),null),2),U5c),BI),pqb(L5c))));o4c(a,fpe,Yoe,Xvc);o4c(a,fpe,epe,true);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,gpe),Ipe),'Improve Wrapped Edges'),'The initial wrapping is performed in a very simple way. As a consequence, edges that wrap from one chunk to another may be unnecessarily long. Activating this option tries to shorten such edges.'),true),T5c),wI),pqb(L5c))));o4c(a,gpe,Yoe,_vc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,hpe),Jpe),'Edge Label Side Selection'),'Method to decide on edge label sides.'),tuc),V5c),LW),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,ipe),Jpe),'Edge Center Label Placement Strategy'),'Determines in which layer center labels of long edges should be placed.'),ruc),V5c),EW),qqb(L5c,OC(GC(e1,1),Kie,175,0,[J5c])))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,jpe),Kpe),'Consider Model Order'),'Preserves the order of nodes and edges in the model file if this does not lead to additional edge crossings. Depending on the strategy this is not always possible since the node and edge order might be conflicting.'),Wtc),V5c),bX),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,kpe),Kpe),'No Model Order'),'Set on a node to not set a model order for this node even though it is a real node.'),false),T5c),wI),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,lpe),Kpe),'Consider Model Order for Components'),'If set to NONE the usual ordering strategy (by cumulative node priority and size of nodes) is used. INSIDE_PORT_SIDES orders the components with external ports only inside the groups with the same port side. FORCE_MODEL_ORDER enforces the mode order on components. This option might produce bad alignments and sub optimal drawings in terms of used area since the ordering should be respected.'),Ptc),V5c),hQ),pqb(L5c))));o4c(a,lpe,zme,null);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,mpe),Kpe),'Long Edge Ordering Strategy'),'Indicates whether long edges are sorted under, over, or equal to nodes that have no connection to a previous layer in a left-to-right or right-to-left layout. Under and over changes to right and left in a vertical layout.'),Ttc),V5c),ZW),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,npe),Kpe),'Crossing Counter Node Order Influence'),'Indicates with what percentage (1 for 100%) violations of the node model order are weighted against the crossings e.g. a value of 0.5 means two model order violations are as important as on edge crossing. This allows some edge crossings in favor of preserving the model order. It is advised to set this value to a very small positive value (e.g. 0.001) to have minimal crossing and a optimal node order. Defaults to no influence (0).'),0),U5c),BI),pqb(L5c))));o4c(a,npe,jpe,null);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,ope),Kpe),'Crossing Counter Port Order Influence'),'Indicates with what percentage (1 for 100%) violations of the port model order are weighted against the crossings e.g. a value of 0.5 means two model order violations are as important as on edge crossing. This allows some edge crossings in favor of preserving the model order. It is advised to set this value to a very small positive value (e.g. 0.001) to have minimal crossing and a optimal port order. Defaults to no influence (0).'),0),U5c),BI),pqb(L5c))));o4c(a,ope,jpe,null);Oyc((new Pyc,a))};var Itc,Jtc,Ktc,Ltc,Mtc,Ntc,Otc,Ptc,Qtc,Rtc,Stc,Ttc,Utc,Vtc,Wtc,Xtc,Ytc,Ztc,$tc,_tc,auc,buc,cuc,duc,euc,fuc,guc,huc,iuc,juc,kuc,luc,muc,nuc,ouc,puc,quc,ruc,suc,tuc,uuc,vuc,wuc,xuc,yuc,zuc,Auc,Buc,Cuc,Duc,Euc,Fuc,Guc,Huc,Iuc,Juc,Kuc,Luc,Muc,Nuc,Ouc,Puc,Quc,Ruc,Suc,Tuc,Uuc,Vuc,Wuc,Xuc,Yuc,Zuc,$uc,_uc,avc,bvc,cvc,dvc,evc,fvc,gvc,hvc,ivc,jvc,kvc,lvc,mvc,nvc,ovc,pvc,qvc,rvc,svc,tvc,uvc,vvc,wvc,xvc,yvc,zvc,Avc,Bvc,Cvc,Dvc,Evc,Fvc,Gvc,Hvc,Ivc,Jvc,Kvc,Lvc,Mvc,Nvc,Ovc,Pvc,Qvc,Rvc,Svc,Tvc,Uvc,Vvc,Wvc,Xvc,Yvc,Zvc,$vc,_vc,awc,bwc,cwc,dwc,ewc,fwc,gwc,hwc,iwc;var UW=mdb(Sne,'LayeredMetaDataProvider',848);bcb(986,1,ale,Pyc);_.Qe=function Qyc(a){Oyc(a)};var mwc,nwc,owc,pwc,qwc,rwc,swc,twc,uwc,vwc,wwc,xwc,ywc,zwc,Awc,Bwc,Cwc,Dwc,Ewc,Fwc,Gwc,Hwc,Iwc,Jwc,Kwc,Lwc,Mwc,Nwc,Owc,Pwc,Qwc,Rwc,Swc,Twc,Uwc,Vwc,Wwc,Xwc,Ywc,Zwc,$wc,_wc,axc,bxc,cxc,dxc,exc,fxc,gxc,hxc,ixc,jxc,kxc,lxc,mxc,nxc,oxc,pxc,qxc,rxc,sxc,txc,uxc,vxc,wxc,xxc,yxc,zxc,Axc,Bxc,Cxc,Dxc,Exc,Fxc,Gxc,Hxc,Ixc,Jxc,Kxc,Lxc,Mxc,Nxc,Oxc,Pxc,Qxc,Rxc,Sxc,Txc,Uxc,Vxc,Wxc,Xxc,Yxc,Zxc,$xc,_xc,ayc,byc,cyc,dyc,eyc,fyc,gyc,hyc,iyc,jyc,kyc,lyc,myc,nyc,oyc,pyc,qyc,ryc,syc,tyc,uyc,vyc,wyc,xyc,yyc,zyc,Ayc,Byc,Cyc,Dyc,Eyc,Fyc,Gyc,Hyc,Iyc,Jyc,Kyc,Lyc,Myc;var WW=mdb(Sne,'LayeredOptions',986);bcb(987,1,{},Ryc);_.$e=function Syc(){var a;return a=new jUb,a};_._e=function Tyc(a){};var VW=mdb(Sne,'LayeredOptions/LayeredFactory',987);bcb(1372,1,{});_.a=0;var Uyc;var $1=mdb(yqe,'ElkSpacings/AbstractSpacingsBuilder',1372);bcb(779,1372,{},ezc);var bzc,czc;var XW=mdb(Sne,'LayeredSpacings/LayeredSpacingsBuilder',779);bcb(313,22,{3:1,35:1,22:1,313:1,246:1,234:1},nzc);_.Kf=function pzc(){return mzc(this)};_.Xf=function ozc(){return mzc(this)};var fzc,gzc,hzc,izc,jzc,kzc;var YW=ndb(Sne,'LayeringStrategy',313,CI,rzc,qzc);var szc;bcb(378,22,{3:1,35:1,22:1,378:1},zzc);var uzc,vzc,wzc;var ZW=ndb(Sne,'LongEdgeOrderingStrategy',378,CI,Bzc,Azc);var Czc;bcb(197,22,{3:1,35:1,22:1,197:1},Kzc);var Ezc,Fzc,Gzc,Hzc;var $W=ndb(Sne,'NodeFlexibility',197,CI,Nzc,Mzc);var Ozc;bcb(315,22,{3:1,35:1,22:1,315:1,246:1,234:1},Xzc);_.Kf=function Zzc(){return Wzc(this)};_.Xf=function Yzc(){return Wzc(this)};var Qzc,Rzc,Szc,Tzc,Uzc;var _W=ndb(Sne,'NodePlacementStrategy',315,CI,_zc,$zc);var aAc;bcb(260,22,{3:1,35:1,22:1,260:1},lAc);var cAc,dAc,eAc,fAc,gAc,hAc,iAc,jAc;var aX=ndb(Sne,'NodePromotionStrategy',260,CI,nAc,mAc);var oAc;bcb(339,22,{3:1,35:1,22:1,339:1},uAc);var qAc,rAc,sAc;var bX=ndb(Sne,'OrderingStrategy',339,CI,wAc,vAc);var xAc;bcb(421,22,{3:1,35:1,22:1,421:1},CAc);var zAc,AAc;var cX=ndb(Sne,'PortSortingStrategy',421,CI,EAc,DAc);var FAc;bcb(452,22,{3:1,35:1,22:1,452:1},LAc);var HAc,IAc,JAc;var dX=ndb(Sne,'PortType',452,CI,NAc,MAc);var OAc;bcb(375,22,{3:1,35:1,22:1,375:1},UAc);var QAc,RAc,SAc;var eX=ndb(Sne,'SelfLoopDistributionStrategy',375,CI,WAc,VAc);var XAc;bcb(376,22,{3:1,35:1,22:1,376:1},aBc);var ZAc,$Ac;var fX=ndb(Sne,'SelfLoopOrderingStrategy',376,CI,cBc,bBc);var dBc;bcb(304,1,{304:1},oBc);var gX=mdb(Sne,'Spacings',304);bcb(336,22,{3:1,35:1,22:1,336:1},uBc);var qBc,rBc,sBc;var hX=ndb(Sne,'SplineRoutingMode',336,CI,wBc,vBc);var xBc;bcb(338,22,{3:1,35:1,22:1,338:1},DBc);var zBc,ABc,BBc;var iX=ndb(Sne,'ValidifyStrategy',338,CI,FBc,EBc);var GBc;bcb(377,22,{3:1,35:1,22:1,377:1},MBc);var IBc,JBc,KBc;var jX=ndb(Sne,'WrappingStrategy',377,CI,OBc,NBc);var PBc;bcb(1383,1,Bqe,VBc);_.Yf=function WBc(a){return BD(a,37),RBc};_.pf=function XBc(a,b){UBc(this,BD(a,37),b)};var RBc;var kX=mdb(Cqe,'DepthFirstCycleBreaker',1383);bcb(782,1,Bqe,aCc);_.Yf=function cCc(a){return BD(a,37),YBc};_.pf=function dCc(a,b){$Bc(this,BD(a,37),b)};_.Zf=function bCc(a){return BD(Ikb(a,Bub(this.d,a.c.length)),10)};var YBc;var lX=mdb(Cqe,'GreedyCycleBreaker',782);bcb(1386,782,Bqe,eCc);_.Zf=function fCc(a){var b,c,d,e;e=null;b=Ohe;for(d=new olb(a);d.a1){Ccb(DD(vNb(Q_b((tCb(0,a.c.length),BD(a.c[0],10))),(Nyc(),Awc))))?YGc(a,this.d,BD(this,660)):(mmb(),Okb(a,this.d));PEc(this.e,a)}};_.Sf=function DEc(a,b,c,d){var e,f,g,h,i,j,k;if(b!=sEc(c,a.length)){f=a[b-(c?1:-1)];UDc(this.f,f,c?(KAc(),IAc):(KAc(),HAc))}e=a[b][0];k=!d||e.k==(j0b(),e0b);j=Ou(a[b]);this.ag(j,k,false,c);g=0;for(i=new olb(j);i.a');a0?(RHc(this.a,a[b-1],a[b]),undefined):!c&&b1){Ccb(DD(vNb(Q_b((tCb(0,a.c.length),BD(a.c[0],10))),(Nyc(),Awc))))?YGc(a,this.d,this):(mmb(),Okb(a,this.d));Ccb(DD(vNb(Q_b((tCb(0,a.c.length),BD(a.c[0],10))),Awc)))||PEc(this.e,a)}};var YX=mdb(Gqe,'ModelOrderBarycenterHeuristic',660);bcb(1803,1,Dke,$Gc);_.ue=function _Gc(a,b){return VGc(this.a,BD(a,10),BD(b,10))};_.Fb=function aHc(a){return this===a};_.ve=function bHc(){return new tpb(this)};var XX=mdb(Gqe,'ModelOrderBarycenterHeuristic/lambda$0$Type',1803);bcb(1403,1,Bqe,fHc);_.Yf=function gHc(a){var b;return BD(a,37),b=k3c(cHc),e3c(b,(qUb(),nUb),(S8b(),H8b)),b};_.pf=function hHc(a,b){eHc((BD(a,37),b))};var cHc;var ZX=mdb(Gqe,'NoCrossingMinimizer',1403);bcb(796,402,Eqe,iHc);_.$f=function jHc(a,b,c){var d,e,f,g,h,i,j,k,l,m,n;l=this.g;switch(c.g){case 1:{e=0;f=0;for(k=new olb(a.j);k.a1&&(e.j==(Ucd(),zcd)?(this.b[a]=true):e.j==Tcd&&a>0&&(this.b[a-1]=true))};_.f=0;var aY=mdb(Lne,'AllCrossingsCounter',1798);bcb(587,1,{},BHc);_.b=0;_.d=0;var bY=mdb(Lne,'BinaryIndexedTree',587);bcb(524,1,{},dIc);var DHc,EHc;var lY=mdb(Lne,'CrossingsCounter',524);bcb(1906,1,Dke,hIc);_.ue=function iIc(a,b){return YHc(this.a,BD(a,11),BD(b,11))};_.Fb=function jIc(a){return this===a};_.ve=function kIc(){return new tpb(this)};var cY=mdb(Lne,'CrossingsCounter/lambda$0$Type',1906);bcb(1907,1,Dke,lIc);_.ue=function mIc(a,b){return ZHc(this.a,BD(a,11),BD(b,11))};_.Fb=function nIc(a){return this===a};_.ve=function oIc(){return new tpb(this)};var dY=mdb(Lne,'CrossingsCounter/lambda$1$Type',1907);bcb(1908,1,Dke,pIc);_.ue=function qIc(a,b){return $Hc(this.a,BD(a,11),BD(b,11))};_.Fb=function rIc(a){return this===a};_.ve=function sIc(){return new tpb(this)};var eY=mdb(Lne,'CrossingsCounter/lambda$2$Type',1908);bcb(1909,1,Dke,tIc);_.ue=function uIc(a,b){return _Hc(this.a,BD(a,11),BD(b,11))};_.Fb=function vIc(a){return this===a};_.ve=function wIc(){return new tpb(this)};var fY=mdb(Lne,'CrossingsCounter/lambda$3$Type',1909);bcb(1910,1,qie,xIc);_.td=function yIc(a){eIc(this.a,BD(a,11))};var gY=mdb(Lne,'CrossingsCounter/lambda$4$Type',1910);bcb(1911,1,Oie,zIc);_.Mb=function AIc(a){return fIc(this.a,BD(a,11))};var hY=mdb(Lne,'CrossingsCounter/lambda$5$Type',1911);bcb(1912,1,qie,CIc);_.td=function DIc(a){BIc(this,a)};var iY=mdb(Lne,'CrossingsCounter/lambda$6$Type',1912);bcb(1913,1,qie,EIc);_.td=function FIc(a){var b;FHc();Wjb(this.b,(b=this.a,BD(a,11),b))};var jY=mdb(Lne,'CrossingsCounter/lambda$7$Type',1913);bcb(826,1,Vke,GIc);_.Lb=function HIc(a){return FHc(),wNb(BD(a,11),(wtc(),gtc))};_.Fb=function IIc(a){return this===a};_.Mb=function JIc(a){return FHc(),wNb(BD(a,11),(wtc(),gtc))};var kY=mdb(Lne,'CrossingsCounter/lambda$8$Type',826);bcb(1905,1,{},LIc);var pY=mdb(Lne,'HyperedgeCrossingsCounter',1905);bcb(467,1,{35:1,467:1},NIc);_.wd=function OIc(a){return MIc(this,BD(a,467))};_.b=0;_.c=0;_.e=0;_.f=0;var oY=mdb(Lne,'HyperedgeCrossingsCounter/Hyperedge',467);bcb(362,1,{35:1,362:1},QIc);_.wd=function RIc(a){return PIc(this,BD(a,362))};_.b=0;_.c=0;var nY=mdb(Lne,'HyperedgeCrossingsCounter/HyperedgeCorner',362);bcb(523,22,{3:1,35:1,22:1,523:1},VIc);var SIc,TIc;var mY=ndb(Lne,'HyperedgeCrossingsCounter/HyperedgeCorner/Type',523,CI,XIc,WIc);var YIc;bcb(1405,1,Bqe,dJc);_.Yf=function eJc(a){return BD(vNb(BD(a,37),(wtc(),Ksc)),21).Hc((Orc(),Hrc))?_Ic:null};_.pf=function fJc(a,b){cJc(this,BD(a,37),b)};var _Ic;var rY=mdb(Hqe,'InteractiveNodePlacer',1405);bcb(1406,1,Bqe,tJc);_.Yf=function uJc(a){return BD(vNb(BD(a,37),(wtc(),Ksc)),21).Hc((Orc(),Hrc))?gJc:null};_.pf=function vJc(a,b){rJc(this,BD(a,37),b)};var gJc,hJc,iJc;var tY=mdb(Hqe,'LinearSegmentsNodePlacer',1406);bcb(257,1,{35:1,257:1},zJc);_.wd=function AJc(a){return wJc(this,BD(a,257))};_.Fb=function BJc(a){var b;if(JD(a,257)){b=BD(a,257);return this.b==b.b}return false};_.Hb=function CJc(){return this.b};_.Ib=function DJc(){return 'ls'+Fe(this.e)};_.a=0;_.b=0;_.c=-1;_.d=-1;_.g=0;var sY=mdb(Hqe,'LinearSegmentsNodePlacer/LinearSegment',257);bcb(1408,1,Bqe,$Jc);_.Yf=function _Jc(a){return BD(vNb(BD(a,37),(wtc(),Ksc)),21).Hc((Orc(),Hrc))?EJc:null};_.pf=function hKc(a,b){WJc(this,BD(a,37),b)};_.b=0;_.g=0;var EJc;var dZ=mdb(Hqe,'NetworkSimplexPlacer',1408);bcb(1427,1,Dke,iKc);_.ue=function jKc(a,b){return beb(BD(a,19).a,BD(b,19).a)};_.Fb=function kKc(a){return this===a};_.ve=function lKc(){return new tpb(this)};var uY=mdb(Hqe,'NetworkSimplexPlacer/0methodref$compare$Type',1427);bcb(1429,1,Dke,mKc);_.ue=function nKc(a,b){return beb(BD(a,19).a,BD(b,19).a)};_.Fb=function oKc(a){return this===a};_.ve=function pKc(){return new tpb(this)};var vY=mdb(Hqe,'NetworkSimplexPlacer/1methodref$compare$Type',1429);bcb(649,1,{649:1},qKc);var wY=mdb(Hqe,'NetworkSimplexPlacer/EdgeRep',649);bcb(401,1,{401:1},rKc);_.b=false;var xY=mdb(Hqe,'NetworkSimplexPlacer/NodeRep',401);bcb(508,12,{3:1,4:1,20:1,28:1,52:1,12:1,14:1,15:1,54:1,508:1},vKc);var CY=mdb(Hqe,'NetworkSimplexPlacer/Path',508);bcb(1409,1,{},wKc);_.Kb=function xKc(a){return BD(a,17).d.i.k};var yY=mdb(Hqe,'NetworkSimplexPlacer/Path/lambda$0$Type',1409);bcb(1410,1,Oie,yKc);_.Mb=function zKc(a){return BD(a,267)==(j0b(),g0b)};var zY=mdb(Hqe,'NetworkSimplexPlacer/Path/lambda$1$Type',1410);bcb(1411,1,{},AKc);_.Kb=function BKc(a){return BD(a,17).d.i};var AY=mdb(Hqe,'NetworkSimplexPlacer/Path/lambda$2$Type',1411);bcb(1412,1,Oie,CKc);_.Mb=function DKc(a){return eLc(Lzc(BD(a,10)))};var BY=mdb(Hqe,'NetworkSimplexPlacer/Path/lambda$3$Type',1412);bcb(1413,1,Oie,EKc);_.Mb=function FKc(a){return dKc(BD(a,11))};var DY=mdb(Hqe,'NetworkSimplexPlacer/lambda$0$Type',1413);bcb(1414,1,qie,GKc);_.td=function HKc(a){LJc(this.a,this.b,BD(a,11))};var EY=mdb(Hqe,'NetworkSimplexPlacer/lambda$1$Type',1414);bcb(1423,1,qie,IKc);_.td=function JKc(a){MJc(this.a,BD(a,17))};var FY=mdb(Hqe,'NetworkSimplexPlacer/lambda$10$Type',1423);bcb(1424,1,{},KKc);_.Kb=function LKc(a){return FJc(),new YAb(null,new Kub(BD(a,29).a,16))};var GY=mdb(Hqe,'NetworkSimplexPlacer/lambda$11$Type',1424);bcb(1425,1,qie,MKc);_.td=function NKc(a){NJc(this.a,BD(a,10))};var HY=mdb(Hqe,'NetworkSimplexPlacer/lambda$12$Type',1425);bcb(1426,1,{},OKc);_.Kb=function PKc(a){return FJc(),meb(BD(a,121).e)};var IY=mdb(Hqe,'NetworkSimplexPlacer/lambda$13$Type',1426);bcb(1428,1,{},QKc);_.Kb=function RKc(a){return FJc(),meb(BD(a,121).e)};var JY=mdb(Hqe,'NetworkSimplexPlacer/lambda$15$Type',1428);bcb(1430,1,Oie,SKc);_.Mb=function TKc(a){return FJc(),BD(a,401).c.k==(j0b(),h0b)};var KY=mdb(Hqe,'NetworkSimplexPlacer/lambda$17$Type',1430);bcb(1431,1,Oie,UKc);_.Mb=function VKc(a){return FJc(),BD(a,401).c.j.c.length>1};var LY=mdb(Hqe,'NetworkSimplexPlacer/lambda$18$Type',1431);bcb(1432,1,qie,WKc);_.td=function XKc(a){eKc(this.c,this.b,this.d,this.a,BD(a,401))};_.c=0;_.d=0;var MY=mdb(Hqe,'NetworkSimplexPlacer/lambda$19$Type',1432);bcb(1415,1,{},YKc);_.Kb=function ZKc(a){return FJc(),new YAb(null,new Kub(BD(a,29).a,16))};var NY=mdb(Hqe,'NetworkSimplexPlacer/lambda$2$Type',1415);bcb(1433,1,qie,$Kc);_.td=function _Kc(a){fKc(this.a,BD(a,11))};_.a=0;var OY=mdb(Hqe,'NetworkSimplexPlacer/lambda$20$Type',1433);bcb(1434,1,{},aLc);_.Kb=function bLc(a){return FJc(),new YAb(null,new Kub(BD(a,29).a,16))};var PY=mdb(Hqe,'NetworkSimplexPlacer/lambda$21$Type',1434);bcb(1435,1,qie,cLc);_.td=function dLc(a){OJc(this.a,BD(a,10))};var QY=mdb(Hqe,'NetworkSimplexPlacer/lambda$22$Type',1435);bcb(1436,1,Oie,fLc);_.Mb=function gLc(a){return eLc(a)};var RY=mdb(Hqe,'NetworkSimplexPlacer/lambda$23$Type',1436);bcb(1437,1,{},hLc);_.Kb=function iLc(a){return FJc(),new YAb(null,new Kub(BD(a,29).a,16))};var SY=mdb(Hqe,'NetworkSimplexPlacer/lambda$24$Type',1437);bcb(1438,1,Oie,jLc);_.Mb=function kLc(a){return PJc(this.a,BD(a,10))};var TY=mdb(Hqe,'NetworkSimplexPlacer/lambda$25$Type',1438);bcb(1439,1,qie,lLc);_.td=function mLc(a){QJc(this.a,this.b,BD(a,10))};var UY=mdb(Hqe,'NetworkSimplexPlacer/lambda$26$Type',1439);bcb(1440,1,Oie,nLc);_.Mb=function oLc(a){return FJc(),!OZb(BD(a,17))};var VY=mdb(Hqe,'NetworkSimplexPlacer/lambda$27$Type',1440);bcb(1441,1,Oie,pLc);_.Mb=function qLc(a){return FJc(),!OZb(BD(a,17))};var WY=mdb(Hqe,'NetworkSimplexPlacer/lambda$28$Type',1441);bcb(1442,1,{},rLc);_.Ce=function sLc(a,b){return RJc(this.a,BD(a,29),BD(b,29))};var XY=mdb(Hqe,'NetworkSimplexPlacer/lambda$29$Type',1442);bcb(1416,1,{},tLc);_.Kb=function uLc(a){return FJc(),new YAb(null,new Lub(new Sr(ur(U_b(BD(a,10)).a.Kc(),new Sq))))};var YY=mdb(Hqe,'NetworkSimplexPlacer/lambda$3$Type',1416);bcb(1417,1,Oie,vLc);_.Mb=function wLc(a){return FJc(),cKc(BD(a,17))};var ZY=mdb(Hqe,'NetworkSimplexPlacer/lambda$4$Type',1417);bcb(1418,1,qie,xLc);_.td=function yLc(a){XJc(this.a,BD(a,17))};var $Y=mdb(Hqe,'NetworkSimplexPlacer/lambda$5$Type',1418);bcb(1419,1,{},zLc);_.Kb=function ALc(a){return FJc(),new YAb(null,new Kub(BD(a,29).a,16))};var _Y=mdb(Hqe,'NetworkSimplexPlacer/lambda$6$Type',1419);bcb(1420,1,Oie,BLc);_.Mb=function CLc(a){return FJc(),BD(a,10).k==(j0b(),h0b)};var aZ=mdb(Hqe,'NetworkSimplexPlacer/lambda$7$Type',1420);bcb(1421,1,{},DLc);_.Kb=function ELc(a){return FJc(),new YAb(null,new Lub(new Sr(ur(O_b(BD(a,10)).a.Kc(),new Sq))))};var bZ=mdb(Hqe,'NetworkSimplexPlacer/lambda$8$Type',1421);bcb(1422,1,Oie,FLc);_.Mb=function GLc(a){return FJc(),NZb(BD(a,17))};var cZ=mdb(Hqe,'NetworkSimplexPlacer/lambda$9$Type',1422);bcb(1404,1,Bqe,KLc);_.Yf=function LLc(a){return BD(vNb(BD(a,37),(wtc(),Ksc)),21).Hc((Orc(),Hrc))?HLc:null};_.pf=function MLc(a,b){JLc(BD(a,37),b)};var HLc;var eZ=mdb(Hqe,'SimpleNodePlacer',1404);bcb(180,1,{180:1},ULc);_.Ib=function VLc(){var a;a='';this.c==(YLc(),XLc)?(a+=kle):this.c==WLc&&(a+=jle);this.o==(eMc(),cMc)?(a+=vle):this.o==dMc?(a+='UP'):(a+='BALANCED');return a};var hZ=mdb(Kqe,'BKAlignedLayout',180);bcb(516,22,{3:1,35:1,22:1,516:1},ZLc);var WLc,XLc;var fZ=ndb(Kqe,'BKAlignedLayout/HDirection',516,CI,_Lc,$Lc);var aMc;bcb(515,22,{3:1,35:1,22:1,515:1},fMc);var cMc,dMc;var gZ=ndb(Kqe,'BKAlignedLayout/VDirection',515,CI,hMc,gMc);var iMc;bcb(1634,1,{},mMc);var iZ=mdb(Kqe,'BKAligner',1634);bcb(1637,1,{},rMc);var lZ=mdb(Kqe,'BKCompactor',1637);bcb(654,1,{654:1},sMc);_.a=0;var jZ=mdb(Kqe,'BKCompactor/ClassEdge',654);bcb(458,1,{458:1},uMc);_.a=null;_.b=0;var kZ=mdb(Kqe,'BKCompactor/ClassNode',458);bcb(1407,1,Bqe,CMc);_.Yf=function GMc(a){return BD(vNb(BD(a,37),(wtc(),Ksc)),21).Hc((Orc(),Hrc))?vMc:null};_.pf=function HMc(a,b){BMc(this,BD(a,37),b)};_.d=false;var vMc;var mZ=mdb(Kqe,'BKNodePlacer',1407);bcb(1635,1,{},JMc);_.d=0;var oZ=mdb(Kqe,'NeighborhoodInformation',1635);bcb(1636,1,Dke,OMc);_.ue=function PMc(a,b){return NMc(this,BD(a,46),BD(b,46))};_.Fb=function QMc(a){return this===a};_.ve=function RMc(){return new tpb(this)};var nZ=mdb(Kqe,'NeighborhoodInformation/NeighborComparator',1636);bcb(808,1,{});var sZ=mdb(Kqe,'ThresholdStrategy',808);bcb(1763,808,{},WMc);_.bg=function XMc(a,b,c){return this.a.o==(eMc(),dMc)?Pje:Qje};_.cg=function YMc(){};var pZ=mdb(Kqe,'ThresholdStrategy/NullThresholdStrategy',1763);bcb(579,1,{579:1},ZMc);_.c=false;_.d=false;var qZ=mdb(Kqe,'ThresholdStrategy/Postprocessable',579);bcb(1764,808,{},bNc);_.bg=function cNc(a,b,c){var d,e,f;e=b==c;d=this.a.a[c.p]==b;if(!(e||d)){return a}f=a;if(this.a.c==(YLc(),XLc)){e&&(f=$Mc(this,b,true));!isNaN(f)&&!isFinite(f)&&d&&(f=$Mc(this,c,false))}else{e&&(f=$Mc(this,b,true));!isNaN(f)&&!isFinite(f)&&d&&(f=$Mc(this,c,false))}return f};_.cg=function dNc(){var a,b,c,d,e;while(this.d.b!=0){e=BD(Ksb(this.d),579);d=_Mc(this,e);if(!d.a){continue}a=d.a;c=Ccb(this.a.f[this.a.g[e.b.p].p]);if(!c&&!OZb(a)&&a.c.i.c==a.d.i.c){continue}b=aNc(this,e);b||swb(this.e,e)}while(this.e.a.c.length!=0){aNc(this,BD(rwb(this.e),579))}};var rZ=mdb(Kqe,'ThresholdStrategy/SimpleThresholdStrategy',1764);bcb(635,1,{635:1,246:1,234:1},hNc);_.Kf=function jNc(){return gNc(this)};_.Xf=function iNc(){return gNc(this)};var eNc;var tZ=mdb(Lqe,'EdgeRouterFactory',635);bcb(1458,1,Bqe,wNc);_.Yf=function xNc(a){return uNc(BD(a,37))};_.pf=function yNc(a,b){vNc(BD(a,37),b)};var lNc,mNc,nNc,oNc,pNc,qNc,rNc,sNc;var uZ=mdb(Lqe,'OrthogonalEdgeRouter',1458);bcb(1451,1,Bqe,NNc);_.Yf=function ONc(a){return INc(BD(a,37))};_.pf=function PNc(a,b){KNc(this,BD(a,37),b)};var zNc,ANc,BNc,CNc,DNc,ENc;var wZ=mdb(Lqe,'PolylineEdgeRouter',1451);bcb(1452,1,Vke,RNc);_.Lb=function SNc(a){return QNc(BD(a,10))};_.Fb=function TNc(a){return this===a};_.Mb=function UNc(a){return QNc(BD(a,10))};var vZ=mdb(Lqe,'PolylineEdgeRouter/1',1452);bcb(1809,1,Oie,ZNc);_.Mb=function $Nc(a){return BD(a,129).c==(HOc(),FOc)};var xZ=mdb(Mqe,'HyperEdgeCycleDetector/lambda$0$Type',1809);bcb(1810,1,{},_Nc);_.Ge=function aOc(a){return BD(a,129).d};var yZ=mdb(Mqe,'HyperEdgeCycleDetector/lambda$1$Type',1810);bcb(1811,1,Oie,bOc);_.Mb=function cOc(a){return BD(a,129).c==(HOc(),FOc)};var zZ=mdb(Mqe,'HyperEdgeCycleDetector/lambda$2$Type',1811);bcb(1812,1,{},dOc);_.Ge=function eOc(a){return BD(a,129).d};var AZ=mdb(Mqe,'HyperEdgeCycleDetector/lambda$3$Type',1812);bcb(1813,1,{},fOc);_.Ge=function gOc(a){return BD(a,129).d};var BZ=mdb(Mqe,'HyperEdgeCycleDetector/lambda$4$Type',1813);bcb(1814,1,{},hOc);_.Ge=function iOc(a){return BD(a,129).d};var CZ=mdb(Mqe,'HyperEdgeCycleDetector/lambda$5$Type',1814);bcb(112,1,{35:1,112:1},uOc);_.wd=function vOc(a){return kOc(this,BD(a,112))};_.Fb=function wOc(a){var b;if(JD(a,112)){b=BD(a,112);return this.g==b.g}return false};_.Hb=function xOc(){return this.g};_.Ib=function zOc(){var a,b,c,d;a=new Wfb('{');d=new olb(this.n);while(d.a'+this.b+' ('+Yr(this.c)+')'};_.d=0;var EZ=mdb(Mqe,'HyperEdgeSegmentDependency',129);bcb(520,22,{3:1,35:1,22:1,520:1},IOc);var FOc,GOc;var DZ=ndb(Mqe,'HyperEdgeSegmentDependency/DependencyType',520,CI,KOc,JOc);var LOc;bcb(1815,1,{},ZOc);var MZ=mdb(Mqe,'HyperEdgeSegmentSplitter',1815);bcb(1816,1,{},aPc);_.a=0;_.b=0;var FZ=mdb(Mqe,'HyperEdgeSegmentSplitter/AreaRating',1816);bcb(329,1,{329:1},bPc);_.a=0;_.b=0;_.c=0;var GZ=mdb(Mqe,'HyperEdgeSegmentSplitter/FreeArea',329);bcb(1817,1,Dke,cPc);_.ue=function dPc(a,b){return _Oc(BD(a,112),BD(b,112))};_.Fb=function ePc(a){return this===a};_.ve=function fPc(){return new tpb(this)};var HZ=mdb(Mqe,'HyperEdgeSegmentSplitter/lambda$0$Type',1817);bcb(1818,1,qie,gPc);_.td=function hPc(a){TOc(this.a,this.d,this.c,this.b,BD(a,112))};_.b=0;var IZ=mdb(Mqe,'HyperEdgeSegmentSplitter/lambda$1$Type',1818);bcb(1819,1,{},iPc);_.Kb=function jPc(a){return new YAb(null,new Kub(BD(a,112).e,16))};var JZ=mdb(Mqe,'HyperEdgeSegmentSplitter/lambda$2$Type',1819);bcb(1820,1,{},kPc);_.Kb=function lPc(a){return new YAb(null,new Kub(BD(a,112).j,16))};var KZ=mdb(Mqe,'HyperEdgeSegmentSplitter/lambda$3$Type',1820);bcb(1821,1,{},mPc);_.Fe=function nPc(a){return Edb(ED(a))};var LZ=mdb(Mqe,'HyperEdgeSegmentSplitter/lambda$4$Type',1821);bcb(655,1,{},tPc);_.a=0;_.b=0;_.c=0;var QZ=mdb(Mqe,'OrthogonalRoutingGenerator',655);bcb(1638,1,{},xPc);_.Kb=function yPc(a){return new YAb(null,new Kub(BD(a,112).e,16))};var OZ=mdb(Mqe,'OrthogonalRoutingGenerator/lambda$0$Type',1638);bcb(1639,1,{},zPc);_.Kb=function APc(a){return new YAb(null,new Kub(BD(a,112).j,16))};var PZ=mdb(Mqe,'OrthogonalRoutingGenerator/lambda$1$Type',1639);bcb(661,1,{});var RZ=mdb(Nqe,'BaseRoutingDirectionStrategy',661);bcb(1807,661,{},EPc);_.dg=function FPc(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p;if(!!a.r&&!a.q){return}k=b+a.o*c;for(j=new olb(a.n);j.aqme){f=k;e=a;d=new f7c(l,f);Dsb(g.a,d);BPc(this,g,e,d,false);m=a.r;if(m){n=Edb(ED(Ut(m.e,0)));d=new f7c(n,f);Dsb(g.a,d);BPc(this,g,e,d,false);f=b+m.o*c;e=m;d=new f7c(n,f);Dsb(g.a,d);BPc(this,g,e,d,false)}d=new f7c(p,f);Dsb(g.a,d);BPc(this,g,e,d,false)}}}}};_.eg=function GPc(a){return a.i.n.a+a.n.a+a.a.a};_.fg=function HPc(){return Ucd(),Rcd};_.gg=function IPc(){return Ucd(),Acd};var SZ=mdb(Nqe,'NorthToSouthRoutingStrategy',1807);bcb(1808,661,{},JPc);_.dg=function KPc(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p;if(!!a.r&&!a.q){return}k=b-a.o*c;for(j=new olb(a.n);j.aqme){f=k;e=a;d=new f7c(l,f);Dsb(g.a,d);BPc(this,g,e,d,false);m=a.r;if(m){n=Edb(ED(Ut(m.e,0)));d=new f7c(n,f);Dsb(g.a,d);BPc(this,g,e,d,false);f=b-m.o*c;e=m;d=new f7c(n,f);Dsb(g.a,d);BPc(this,g,e,d,false)}d=new f7c(p,f);Dsb(g.a,d);BPc(this,g,e,d,false)}}}}};_.eg=function LPc(a){return a.i.n.a+a.n.a+a.a.a};_.fg=function MPc(){return Ucd(),Acd};_.gg=function NPc(){return Ucd(),Rcd};var TZ=mdb(Nqe,'SouthToNorthRoutingStrategy',1808);bcb(1806,661,{},OPc);_.dg=function PPc(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p;if(!!a.r&&!a.q){return}k=b+a.o*c;for(j=new olb(a.n);j.aqme){f=k;e=a;d=new f7c(f,l);Dsb(g.a,d);BPc(this,g,e,d,true);m=a.r;if(m){n=Edb(ED(Ut(m.e,0)));d=new f7c(f,n);Dsb(g.a,d);BPc(this,g,e,d,true);f=b+m.o*c;e=m;d=new f7c(f,n);Dsb(g.a,d);BPc(this,g,e,d,true)}d=new f7c(f,p);Dsb(g.a,d);BPc(this,g,e,d,true)}}}}};_.eg=function QPc(a){return a.i.n.b+a.n.b+a.a.b};_.fg=function RPc(){return Ucd(),zcd};_.gg=function SPc(){return Ucd(),Tcd};var UZ=mdb(Nqe,'WestToEastRoutingStrategy',1806);bcb(813,1,{},YPc);_.Ib=function ZPc(){return Fe(this.a)};_.b=0;_.c=false;_.d=false;_.f=0;var WZ=mdb(Pqe,'NubSpline',813);bcb(407,1,{407:1},aQc,bQc);var VZ=mdb(Pqe,'NubSpline/PolarCP',407);bcb(1453,1,Bqe,vQc);_.Yf=function xQc(a){return qQc(BD(a,37))};_.pf=function yQc(a,b){uQc(this,BD(a,37),b)};var cQc,dQc,eQc,fQc,gQc;var b$=mdb(Pqe,'SplineEdgeRouter',1453);bcb(268,1,{268:1},BQc);_.Ib=function CQc(){return this.a+' ->('+this.c+') '+this.b};_.c=0;var XZ=mdb(Pqe,'SplineEdgeRouter/Dependency',268);bcb(455,22,{3:1,35:1,22:1,455:1},GQc);var DQc,EQc;var YZ=ndb(Pqe,'SplineEdgeRouter/SideToProcess',455,CI,IQc,HQc);var JQc;bcb(1454,1,Oie,LQc);_.Mb=function MQc(a){return hQc(),!BD(a,128).o};var ZZ=mdb(Pqe,'SplineEdgeRouter/lambda$0$Type',1454);bcb(1455,1,{},NQc);_.Ge=function OQc(a){return hQc(),BD(a,128).v+1};var $Z=mdb(Pqe,'SplineEdgeRouter/lambda$1$Type',1455);bcb(1456,1,qie,PQc);_.td=function QQc(a){sQc(this.a,this.b,BD(a,46))};var _Z=mdb(Pqe,'SplineEdgeRouter/lambda$2$Type',1456);bcb(1457,1,qie,RQc);_.td=function SQc(a){tQc(this.a,this.b,BD(a,46))};var a$=mdb(Pqe,'SplineEdgeRouter/lambda$3$Type',1457);bcb(128,1,{35:1,128:1},YQc,ZQc);_.wd=function $Qc(a){return WQc(this,BD(a,128))};_.b=0;_.e=false;_.f=0;_.g=0;_.j=false;_.k=false;_.n=0;_.o=false;_.p=false;_.q=false;_.s=0;_.u=0;_.v=0;_.F=0;var d$=mdb(Pqe,'SplineSegment',128);bcb(459,1,{459:1},_Qc);_.a=0;_.b=false;_.c=false;_.d=false;_.e=false;_.f=0;var c$=mdb(Pqe,'SplineSegment/EdgeInformation',459);bcb(1234,1,{},hRc);var f$=mdb(Uqe,hme,1234);bcb(1235,1,Dke,jRc);_.ue=function kRc(a,b){return iRc(BD(a,135),BD(b,135))};_.Fb=function lRc(a){return this===a};_.ve=function mRc(){return new tpb(this)};var e$=mdb(Uqe,ime,1235);bcb(1233,1,{},tRc);var g$=mdb(Uqe,'MrTree',1233);bcb(393,22,{3:1,35:1,22:1,393:1,246:1,234:1},ARc);_.Kf=function CRc(){return zRc(this)};_.Xf=function BRc(){return zRc(this)};var uRc,vRc,wRc,xRc;var h$=ndb(Uqe,'TreeLayoutPhases',393,CI,ERc,DRc);var FRc;bcb(1130,209,Mle,HRc);_.Ze=function IRc(a,b){var c,d,e,f,g,h,i;Ccb(DD(hkd(a,(JTc(),ATc))))||$Cb((c=new _Cb((Pgd(),new bhd(a))),c));g=(h=new SRc,tNb(h,a),yNb(h,(mTc(),dTc),a),i=new Lqb,pRc(a,h,i),oRc(a,h,i),h);f=gRc(this.a,g);for(e=new olb(f);e.a'+WRc(this.c):'e_'+tb(this)};var l$=mdb(Vqe,'TEdge',188);bcb(135,134,{3:1,135:1,94:1,134:1},SRc);_.Ib=function TRc(){var a,b,c,d,e;e=null;for(d=Jsb(this.b,0);d.b!=d.d.c;){c=BD(Xsb(d),86);e+=(c.c==null||c.c.length==0?'n_'+c.g:'n_'+c.c)+'\n'}for(b=Jsb(this.a,0);b.b!=b.d.c;){a=BD(Xsb(b),188);e+=(!!a.b&&!!a.c?WRc(a.b)+'->'+WRc(a.c):'e_'+tb(a))+'\n'}return e};var n$=mdb(Vqe,'TGraph',135);bcb(633,502,{3:1,502:1,633:1,94:1,134:1});var r$=mdb(Vqe,'TShape',633);bcb(86,633,{3:1,502:1,86:1,633:1,94:1,134:1},XRc);_.Ib=function YRc(){return WRc(this)};var q$=mdb(Vqe,'TNode',86);bcb(255,1,vie,ZRc);_.Jc=function $Rc(a){reb(this,a)};_.Kc=function _Rc(){var a;return a=Jsb(this.a.d,0),new aSc(a)};var p$=mdb(Vqe,'TNode/2',255);bcb(358,1,aie,aSc);_.Nb=function bSc(a){Rrb(this,a)};_.Pb=function dSc(){return BD(Xsb(this.a),188).c};_.Ob=function cSc(){return Wsb(this.a)};_.Qb=function eSc(){Zsb(this.a)};var o$=mdb(Vqe,'TNode/2/1',358);bcb(1840,1,ene,hSc);_.pf=function jSc(a,b){gSc(this,BD(a,135),b)};var s$=mdb(Wqe,'FanProcessor',1840);bcb(327,22,{3:1,35:1,22:1,327:1,234:1},rSc);_.Kf=function sSc(){switch(this.g){case 0:return new QSc;case 1:return new hSc;case 2:return new GSc;case 3:return new zSc;case 4:return new NSc;case 5:return new TSc;default:throw vbb(new Wdb(Dne+(this.f!=null?this.f:''+this.g)));}};var kSc,lSc,mSc,nSc,oSc,pSc;var t$=ndb(Wqe,Ene,327,CI,uSc,tSc);var vSc;bcb(1843,1,ene,zSc);_.pf=function ASc(a,b){xSc(this,BD(a,135),b)};_.a=0;var v$=mdb(Wqe,'LevelHeightProcessor',1843);bcb(1844,1,vie,BSc);_.Jc=function CSc(a){reb(this,a)};_.Kc=function DSc(){return mmb(),Emb(),Dmb};var u$=mdb(Wqe,'LevelHeightProcessor/1',1844);bcb(1841,1,ene,GSc);_.pf=function HSc(a,b){ESc(this,BD(a,135),b)};_.a=0;var x$=mdb(Wqe,'NeighborsProcessor',1841);bcb(1842,1,vie,ISc);_.Jc=function JSc(a){reb(this,a)};_.Kc=function KSc(){return mmb(),Emb(),Dmb};var w$=mdb(Wqe,'NeighborsProcessor/1',1842);bcb(1845,1,ene,NSc);_.pf=function OSc(a,b){LSc(this,BD(a,135),b)};_.a=0;var y$=mdb(Wqe,'NodePositionProcessor',1845);bcb(1839,1,ene,QSc);_.pf=function RSc(a,b){PSc(this,BD(a,135))};var z$=mdb(Wqe,'RootProcessor',1839);bcb(1846,1,ene,TSc);_.pf=function USc(a,b){SSc(BD(a,135))};var A$=mdb(Wqe,'Untreeifyer',1846);var VSc,WSc,XSc,YSc,ZSc,$Sc,_Sc,aTc,bTc,cTc,dTc,eTc,fTc,gTc,hTc,iTc,jTc,kTc,lTc;bcb(851,1,ale,sTc);_.Qe=function tTc(a){t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Zqe),''),'Weighting of Nodes'),'Which weighting to use when computing a node order.'),qTc),(_5c(),V5c)),E$),pqb((N5c(),L5c)))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,$qe),''),'Search Order'),'Which search order to use when computing a spanning tree.'),oTc),V5c),F$),pqb(L5c))));KTc((new LTc,a))};var nTc,oTc,pTc,qTc;var B$=mdb(_qe,'MrTreeMetaDataProvider',851);bcb(994,1,ale,LTc);_.Qe=function MTc(a){KTc(a)};var uTc,vTc,wTc,xTc,yTc,zTc,ATc,BTc,CTc,DTc,ETc,FTc,GTc,HTc,ITc;var D$=mdb(_qe,'MrTreeOptions',994);bcb(995,1,{},NTc);_.$e=function OTc(){var a;return a=new HRc,a};_._e=function PTc(a){};var C$=mdb(_qe,'MrTreeOptions/MrtreeFactory',995);bcb(480,22,{3:1,35:1,22:1,480:1},TTc);var QTc,RTc;var E$=ndb(_qe,'OrderWeighting',480,CI,VTc,UTc);var WTc;bcb(425,22,{3:1,35:1,22:1,425:1},_Tc);var YTc,ZTc;var F$=ndb(_qe,'TreeifyingOrder',425,CI,bUc,aUc);var cUc;bcb(1459,1,Bqe,lUc);_.Yf=function mUc(a){return BD(a,135),eUc};_.pf=function nUc(a,b){kUc(this,BD(a,135),b)};var eUc;var G$=mdb('org.eclipse.elk.alg.mrtree.p1treeify','DFSTreeifyer',1459);bcb(1460,1,Bqe,sUc);_.Yf=function tUc(a){return BD(a,135),oUc};_.pf=function uUc(a,b){rUc(this,BD(a,135),b)};var oUc;var H$=mdb('org.eclipse.elk.alg.mrtree.p2order','NodeOrderer',1460);bcb(1461,1,Bqe,CUc);_.Yf=function DUc(a){return BD(a,135),vUc};_.pf=function EUc(a,b){AUc(this,BD(a,135),b)};_.a=0;var vUc;var I$=mdb('org.eclipse.elk.alg.mrtree.p3place','NodePlacer',1461);bcb(1462,1,Bqe,IUc);_.Yf=function JUc(a){return BD(a,135),FUc};_.pf=function KUc(a,b){HUc(BD(a,135),b)};var FUc;var J$=mdb('org.eclipse.elk.alg.mrtree.p4route','EdgeRouter',1462);var LUc;bcb(495,22,{3:1,35:1,22:1,495:1,246:1,234:1},RUc);_.Kf=function TUc(){return QUc(this)};_.Xf=function SUc(){return QUc(this)};var NUc,OUc;var K$=ndb(cre,'RadialLayoutPhases',495,CI,VUc,UUc);var WUc;bcb(1131,209,Mle,ZUc);_.Ze=function $Uc(a,b){var c,d,e,f,g,h;c=YUc(this,a);Odd(b,'Radial layout',c.c.length);Ccb(DD(hkd(a,(ZWc(),QWc))))||$Cb((d=new _Cb((Pgd(),new bhd(a))),d));h=aVc(a);jkd(a,(MUc(),LUc),h);if(!h){throw vbb(new Wdb('The given graph is not a tree!'))}e=Edb(ED(hkd(a,VWc)));e==0&&(e=_Uc(a));jkd(a,VWc,e);for(g=new olb(YUc(this,a));g.a0&&j7c((BCb(c-1,b.length),b.charCodeAt(c-1)),nne)){--c}if(e>=c){throw vbb(new Wdb('The given string does not contain any numbers.'))}f=mfb(b.substr(e,c-e),',|;|\r|\n');if(f.length!=2){throw vbb(new Wdb('Exactly two numbers are expected, '+f.length+' were found.'))}try{this.a=Hcb(ufb(f[0]));this.b=Hcb(ufb(f[1]))}catch(a){a=ubb(a);if(JD(a,127)){d=a;throw vbb(new Wdb(one+d))}else throw vbb(a)}};_.Ib=function m7c(){return '('+this.a+','+this.b+')'};_.a=0;_.b=0;var m1=mdb(pne,'KVector',8);bcb(74,68,{3:1,4:1,20:1,28:1,52:1,14:1,68:1,15:1,74:1,414:1},s7c,t7c,u7c);_.Pc=function x7c(){return r7c(this)};_.Jf=function v7c(b){var c,d,e,f,g,h;e=mfb(b,',|;|\\(|\\)|\\[|\\]|\\{|\\}| |\t|\n');Osb(this);try{d=0;g=0;f=0;h=0;while(d0){g%2==0?(f=Hcb(e[d])):(h=Hcb(e[d]));g>0&&g%2!=0&&Dsb(this,new f7c(f,h));++g}++d}}catch(a){a=ubb(a);if(JD(a,127)){c=a;throw vbb(new Wdb('The given string does not match the expected format for vectors.'+c))}else throw vbb(a)}};_.Ib=function y7c(){var a,b,c;a=new Wfb('(');b=Jsb(this,0);while(b.b!=b.d.c){c=BD(Xsb(b),8);Qfb(a,c.a+','+c.b);b.b!=b.d.c&&(a.a+='; ',a)}return (a.a+=')',a).a};var l1=mdb(pne,'KVectorChain',74);bcb(248,22,{3:1,35:1,22:1,248:1},G7c);var z7c,A7c,B7c,C7c,D7c,E7c;var o1=ndb(ose,'Alignment',248,CI,I7c,H7c);var J7c;bcb(979,1,ale,Z7c);_.Qe=function $7c(a){Y7c(a)};var L7c,M7c,N7c,O7c,P7c,Q7c,R7c,S7c,T7c,U7c,V7c,W7c;var q1=mdb(ose,'BoxLayouterOptions',979);bcb(980,1,{},_7c);_.$e=function a8c(){var a;return a=new ged,a};_._e=function b8c(a){};var p1=mdb(ose,'BoxLayouterOptions/BoxFactory',980);bcb(291,22,{3:1,35:1,22:1,291:1},j8c);var c8c,d8c,e8c,f8c,g8c,h8c;var r1=ndb(ose,'ContentAlignment',291,CI,l8c,k8c);var m8c;bcb(684,1,ale,Z9c);_.Qe=function $9c(a){t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,sse),''),'Layout Algorithm'),'Select a specific layout algorithm.'),(_5c(),Z5c)),ZI),pqb((N5c(),L5c)))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,tse),''),'Resolved Layout Algorithm'),'Meta data associated with the selected algorithm.'),Y5c),E0),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,$pe),''),'Alignment'),'Alignment of the selected node relative to other nodes; the exact meaning depends on the used algorithm.'),q8c),V5c),o1),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,_le),''),'Aspect Ratio'),'The desired aspect ratio of the drawing, that is the quotient of width by height.'),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,use),''),'Bend Points'),"A fixed list of bend points for the edge. This is used by the 'Fixed Layout' algorithm to specify a pre-defined routing for an edge. The vector chain must include the source point, any bend points, and the target point, so it must have at least two points."),Y5c),l1),pqb(I5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,lqe),''),'Content Alignment'),'Specifies how the content of a node are aligned. Each node can individually control the alignment of its contents. I.e. if a node should be aligned top left in its parent node, the parent node should specify that option.'),x8c),W5c),r1),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Zpe),''),'Debug Mode'),'Whether additional debug information shall be generated.'),(Bcb(),false)),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,cqe),''),Cle),'Overall direction of edges: horizontal (right / left) or vertical (down / up).'),A8c),V5c),t1),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,ype),''),'Edge Routing'),'What kind of edge routing style should be applied for the content of a parent node. Algorithms may also set this option to single edges in order to mark them as splines. The bend point list of edges with this option set to SPLINES must be interpreted as control points for a piecewise cubic spline.'),F8c),V5c),v1),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Jre),''),'Expand Nodes'),'If active, nodes are expanded to fill the area of their parent.'),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,tpe),''),'Hierarchy Handling'),"Determines whether separate layout runs are triggered for different compound nodes in a hierarchical graph. Setting a node's hierarchy handling to `INCLUDE_CHILDREN` will lay out that node and all of its descendants in a single layout run, until a descendant is encountered which has its hierarchy handling set to `SEPARATE_CHILDREN`. In general, `SEPARATE_CHILDREN` will ensure that a new layout run is triggered for a node with that setting. Including multiple levels of hierarchy in a single layout run may allow cross-hierarchical edges to be laid out properly. If the root node is set to `INHERIT` (or not set at all), the default behavior is `SEPARATE_CHILDREN`."),K8c),V5c),z1),qqb(L5c,OC(GC(e1,1),Kie,175,0,[K5c])))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,ame),''),'Padding'),"The padding to be left to a parent element's border when placing child elements. This can also serve as an output option of a layout algorithm if node size calculation is setup appropriately."),g9c),Y5c),j1),qqb(L5c,OC(GC(e1,1),Kie,175,0,[K5c])))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Ame),''),'Interactive'),'Whether the algorithm should be run in interactive mode for the content of a parent node. What this means exactly depends on how the specific algorithm interprets this option. Usually in the interactive mode algorithms try to modify the current layout as little as possible.'),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,xqe),''),'interactive Layout'),'Whether the graph should be changeable interactively and by setting constraints'),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Dme),''),'Omit Node Micro Layout'),"Node micro layout comprises the computation of node dimensions (if requested), the placement of ports and their labels, and the placement of node labels. The functionality is implemented independent of any specific layout algorithm and shouldn't have any negative impact on the layout algorithm's performance itself. Yet, if any unforeseen behavior occurs, this option allows to deactivate the micro layout."),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Bme),''),'Port Constraints'),'Defines constraints of the position of the ports of a node.'),u9c),V5c),D1),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,uqe),''),'Position'),"The position of a node, port, or label. This is used by the 'Fixed Layout' algorithm to specify a pre-defined position."),Y5c),m1),qqb(K5c,OC(GC(e1,1),Kie,175,0,[M5c,J5c])))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,vme),''),'Priority'),'Defines the priority of an object; its meaning depends on the specific layout algorithm and the context where it is used.'),X5c),JI),qqb(K5c,OC(GC(e1,1),Kie,175,0,[I5c])))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,yme),''),'Randomization Seed'),'Seed used for pseudo-random number generators to control the layout algorithm. If the value is 0, the seed shall be determined pseudo-randomly (e.g. from the system time).'),X5c),JI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,zme),''),'Separate Connected Components'),'Whether each connected component should be processed separately.'),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,mqe),''),'Junction Points'),'This option is not used as option, but as output of the layout algorithms. It is attached to edges and determines the points where junction symbols should be drawn in order to represent hyperedges with orthogonal routing. Whether such points are computed depends on the chosen layout algorithm and edge routing style. The points are put into the vector chain with no specific order.'),R8c),Y5c),l1),pqb(I5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,pqe),''),'Comment Box'),'Whether the node should be regarded as a comment box instead of a regular node. In that case its placement should be similar to how labels are handled. Any edges incident to a comment box specify to which graph elements the comment is related.'),false),T5c),wI),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,qqe),''),'Hypernode'),'Whether the node should be handled as a hypernode.'),false),T5c),wI),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,vse),''),'Label Manager'),"Label managers can shorten labels upon a layout algorithm's request."),Y5c),h1),qqb(L5c,OC(GC(e1,1),Kie,175,0,[J5c])))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,vqe),''),'Margins'),"Margins define additional space around the actual bounds of a graph element. For instance, ports or labels being placed on the outside of a node's border might introduce such a margin. The margin is used to guarantee non-overlap of other graph elements with those ports or labels."),T8c),Y5c),i1),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Xpe),''),'No Layout'),"No layout is done for the associated element. This is used to mark parts of a diagram to avoid their inclusion in the layout graph, or to mark parts of the layout graph to prevent layout engines from processing them. If you wish to exclude the contents of a compound node from automatic layout, while the node itself is still considered on its own layer, use the 'Fixed Layout' algorithm for that node."),false),T5c),wI),qqb(K5c,OC(GC(e1,1),Kie,175,0,[I5c,M5c,J5c])))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,wse),''),'Scale Factor'),"The scaling factor to be applied to the corresponding node in recursive layout. It causes the corresponding node's size to be adjusted, and its ports and labels to be sized and placed accordingly after the layout of that node has been determined (and before the node itself and its siblings are arranged). The scaling is not reverted afterwards, so the resulting layout graph contains the adjusted size and position data. This option is currently not supported if 'Layout Hierarchy' is set."),1),U5c),BI),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,xse),''),'Animate'),'Whether the shift from the old layout to the new computed layout shall be animated.'),true),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,yse),''),'Animation Time Factor'),"Factor for computation of animation time. The higher the value, the longer the animation time. If the value is 0, the resulting time is always equal to the minimum defined by 'Minimal Animation Time'."),meb(100)),X5c),JI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,zse),''),'Layout Ancestors'),'Whether the hierarchy levels on the path from the selected element to the root of the diagram shall be included in the layout process.'),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Ase),''),'Maximal Animation Time'),'The maximal time for animations, in milliseconds.'),meb(4000)),X5c),JI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Bse),''),'Minimal Animation Time'),'The minimal time for animations, in milliseconds.'),meb(400)),X5c),JI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Cse),''),'Progress Bar'),'Whether a progress bar shall be displayed during layout computations.'),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Dse),''),'Validate Graph'),'Whether the graph shall be validated before any layout algorithm is applied. If this option is enabled and at least one error is found, the layout process is aborted and a message is shown to the user.'),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Ese),''),'Validate Options'),'Whether layout options shall be validated before any layout algorithm is applied. If this option is enabled and at least one error is found, the layout process is aborted and a message is shown to the user.'),true),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Fse),''),'Zoom to Fit'),'Whether the zoom level shall be set to view the whole diagram after layout.'),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,rse),'box'),'Box Layout Mode'),'Configures the packing mode used by the {@link BoxLayoutProvider}. If SIMPLE is not required (neither priorities are used nor the interactive mode), GROUP_DEC can improve the packing and decrease the area. GROUP_MIXED and GROUP_INC may, in very specific scenarios, work better.'),u8c),V5c),O1),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Lpe),zpe),'Comment Comment Spacing'),'Spacing to be preserved between a comment box and other comment boxes connected to the same node. The space left between comment boxes of different nodes is controlled by the node-node spacing.'),10),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Mpe),zpe),'Comment Node Spacing'),'Spacing to be preserved between a node and its connected comment boxes. The space left between a node and the comments of another node is controlled by the node-node spacing.'),10),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Zle),zpe),'Components Spacing'),"Spacing to be preserved between pairs of connected components. This option is only relevant if 'separateConnectedComponents' is activated."),20),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Npe),zpe),'Edge Spacing'),'Spacing to be preserved between any two edges. Note that while this can somewhat easily be satisfied for the segments of orthogonally drawn edges, it is harder for general polylines or splines.'),10),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,xme),zpe),'Edge Label Spacing'),"The minimal distance to be preserved between a label and the edge it is associated with. Note that the placement of a label is influenced by the 'edgelabels.placement' option."),2),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Ope),zpe),'Edge Node Spacing'),'Spacing to be preserved between nodes and edges.'),10),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Ppe),zpe),'Label Spacing'),'Determines the amount of space to be left between two labels of the same graph element.'),0),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Spe),zpe),'Label Node Spacing'),"Spacing to be preserved between labels and the border of node they are associated with. Note that the placement of a label is influenced by the 'nodelabels.placement' option."),5),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Qpe),zpe),'Horizontal spacing between Label and Port'),"Horizontal spacing to be preserved between labels and the ports they are associated with. Note that the placement of a label is influenced by the 'portlabels.placement' option."),1),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Rpe),zpe),'Vertical spacing between Label and Port'),"Vertical spacing to be preserved between labels and the ports they are associated with. Note that the placement of a label is influenced by the 'portlabels.placement' option."),1),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,wme),zpe),'Node Spacing'),'The minimal distance to be preserved between each two nodes.'),20),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Tpe),zpe),'Node Self Loop Spacing'),'Spacing to be preserved between a node and its self loops.'),10),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Upe),zpe),'Port Spacing'),'Spacing between pairs of ports of the same node.'),10),U5c),BI),qqb(L5c,OC(GC(e1,1),Kie,175,0,[K5c])))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,Vpe),zpe),'Individual Spacing'),"Allows to specify individual spacing values for graph elements that shall be different from the value specified for the element's parent."),Y5c),i2),qqb(K5c,OC(GC(e1,1),Kie,175,0,[I5c,M5c,J5c])))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,wqe),zpe),'Additional Port Space'),'Additional space around the sets of ports on each node side. For each side of a node, this option can reserve additional space before and after the ports on each side. For example, a top spacing of 20 makes sure that the first port on the western and eastern side is 20 units away from the northern border.'),W9c),Y5c),i1),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,tqe),Jse),'Layout Partition'),'Partition to which the node belongs. This requires Layout Partitioning to be active. Nodes with lower partition IDs will appear to the left of nodes with higher partition IDs (assuming a left-to-right layout direction).'),X5c),JI),qqb(L5c,OC(GC(e1,1),Kie,175,0,[K5c])))));o4c(a,tqe,sqe,k9c);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,sqe),Jse),'Layout Partitioning'),'Whether to activate partitioned layout. This will allow to group nodes through the Layout Partition option. a pair of nodes with different partition indices is then placed such that the node with lower index is placed to the left of the other node (with left-to-right layout direction). Depending on the layout algorithm, this may only be guaranteed to work if all nodes have a layout partition configured, or at least if edges that cross partitions are not part of a partition-crossing cycle.'),i9c),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,dqe),Kse),'Node Label Padding'),'Define padding for node labels that are placed inside of a node.'),V8c),Y5c),j1),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Gme),Kse),'Node Label Placement'),"Hints for where node labels are to be placed; if empty, the node label's position is not modified."),X8c),W5c),B1),qqb(K5c,OC(GC(e1,1),Kie,175,0,[J5c])))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,gqe),Lse),'Port Alignment'),'Defines the default port distribution for a node. May be overridden for each side individually.'),m9c),V5c),C1),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,hqe),Lse),'Port Alignment (North)'),"Defines how ports on the northern side are placed, overriding the node's general port alignment."),V5c),C1),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,iqe),Lse),'Port Alignment (South)'),"Defines how ports on the southern side are placed, overriding the node's general port alignment."),V5c),C1),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,jqe),Lse),'Port Alignment (West)'),"Defines how ports on the western side are placed, overriding the node's general port alignment."),V5c),C1),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,kqe),Lse),'Port Alignment (East)'),"Defines how ports on the eastern side are placed, overriding the node's general port alignment."),V5c),C1),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Fme),Mse),'Node Size Constraints'),"What should be taken into account when calculating a node's size. Empty size constraints specify that a node's size is already fixed and should not be changed."),Z8c),W5c),I1),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Eme),Mse),'Node Size Options'),'Options modifying the behavior of the size constraints set on a node. Each member of the set specifies something that should be taken into account when calculating node sizes. The empty set corresponds to no further modifications.'),c9c),W5c),J1),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Tme),Mse),'Node Size Minimum'),'The minimal size to which a node can be reduced.'),a9c),Y5c),m1),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,bqe),Mse),'Fixed Graph Size'),"By default, the fixed layout provider will enlarge a graph until it is large enough to contain its children. If this option is set, it won't do so."),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,nqe),Jpe),'Edge Label Placement'),'Gives a hint on where to put edge labels.'),D8c),V5c),u1),pqb(J5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Cme),Jpe),'Inline Edge Labels'),"If true, an edge label is placed directly on its edge. May only apply to center edge labels. This kind of label placement is only advisable if the label's rendering is such that it is not crossed by its edge and thus stays legible."),false),T5c),wI),pqb(J5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,Gse),'font'),'Font Name'),'Font name used for a label.'),Z5c),ZI),pqb(J5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,Hse),'font'),'Font Size'),'Font size used for a label.'),X5c),JI),pqb(J5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,rqe),Nse),'Port Anchor Offset'),'The offset to the port position where connections shall be attached.'),Y5c),m1),pqb(M5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,oqe),Nse),'Port Index'),"The index of a port in the fixed order around a node. The order is assumed as clockwise, starting with the leftmost port on the top side. This option must be set if 'Port Constraints' is set to FIXED_ORDER and no specific positions are given for the ports. Additionally, the option 'Port Side' must be defined in this case."),X5c),JI),pqb(M5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Ype),Nse),'Port Side'),"The side of a node on which a port is situated. This option must be set if 'Port Constraints' is set to FIXED_SIDE or FIXED_ORDER and no specific positions are given for the ports."),B9c),V5c),F1),pqb(M5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,Wpe),Nse),'Port Border Offset'),"The offset of ports on the node border. With a positive offset the port is moved outside of the node, while with a negative offset the port is moved towards the inside. An offset of 0 means that the port is placed directly on the node border, i.e. if the port side is north, the port's south border touches the nodes's north border; if the port side is east, the port's west border touches the nodes's east border; if the port side is south, the port's north border touches the node's south border; if the port side is west, the port's east border touches the node's west border."),U5c),BI),pqb(M5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Hme),Ose),'Port Label Placement'),"Decides on a placement method for port labels; if empty, the node label's position is not modified."),y9c),W5c),E1),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,eqe),Ose),'Port Labels Next to Port'),"Use 'portLabels.placement': NEXT_TO_PORT_OF_POSSIBLE."),false),T5c),wI),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,fqe),Ose),'Treat Port Labels as Group'),'If this option is true (default), the labels of a port will be treated as a group when it comes to centering them next to their port. If this option is false, only the first label will be centered next to the port, with the others being placed below. This only applies to labels of eastern and western ports and will have no effect if labels are not placed next to their port.'),true),T5c),wI),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,_pe),Pse),'Activate Inside Self Loops'),"Whether this node allows to route self loops inside of it instead of around it. If set to true, this will make the node a compound node if it isn't already, and will require the layout algorithm to support compound nodes with hierarchical ports."),false),T5c),wI),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,aqe),Pse),'Inside Self Loop'),'Whether a self loop should be routed inside a node instead of around that node.'),false),T5c),wI),pqb(I5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,$le),'edge'),'Edge Thickness'),'The thickness of an edge. This is a hint on the line width used to draw an edge, possibly requiring more space to be reserved for it.'),1),U5c),BI),pqb(I5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Ise),'edge'),'Edge Type'),'The type of an edge. This is usually used for UML class diagrams, where associations must be handled differently from generalizations.'),H8c),V5c),w1),pqb(I5c))));s4c(a,new W3c(b4c(d4c(c4c(new e4c,sne),'Layered'),'The layer-based method was introduced by Sugiyama, Tagawa and Toda in 1981. It emphasizes the direction of edges by pointing as many edges as possible into the same direction. The nodes are arranged in layers, which are sometimes called "hierarchies", and then reordered such that the number of edge crossings is minimized. Afterwards, concrete coordinates are computed for the nodes and edge bend points.')));s4c(a,new W3c(b4c(d4c(c4c(new e4c,'org.eclipse.elk.orthogonal'),'Orthogonal'),'Orthogonal methods that follow the "topology-shape-metrics" approach by Batini, Nardelli and Tamassia \'86. The first phase determines the topology of the drawing by applying a planarization technique, which results in a planar representation of the graph. The orthogonal shape is computed in the second phase, which aims at minimizing the number of edge bends, and is called orthogonalization. The third phase leads to concrete coordinates for nodes and edge bend points by applying a compaction method, thus defining the metrics.')));s4c(a,new W3c(b4c(d4c(c4c(new e4c,ume),'Force'),'Layout algorithms that follow physical analogies by simulating a system of attractive and repulsive forces. The first successful method of this kind was proposed by Eades in 1984.')));s4c(a,new W3c(b4c(d4c(c4c(new e4c,'org.eclipse.elk.circle'),'Circle'),'Circular layout algorithms emphasize cycles or biconnected components of a graph by arranging them in circles. This is useful if a drawing is desired where such components are clearly grouped, or where cycles are shown as prominent OPTIONS of the graph.')));s4c(a,new W3c(b4c(d4c(c4c(new e4c,bre),'Tree'),'Specialized layout methods for trees, i.e. acyclic graphs. The regular structure of graphs that have no undirected cycles can be emphasized using an algorithm of this type.')));s4c(a,new W3c(b4c(d4c(c4c(new e4c,'org.eclipse.elk.planar'),'Planar'),'Algorithms that require a planar or upward planar graph. Most of these algorithms are theoretically interesting, but not practically usable.')));s4c(a,new W3c(b4c(d4c(c4c(new e4c,sre),'Radial'),'Radial layout algorithms usually position the nodes of the graph on concentric circles.')));$ad((new _ad,a));Y7c((new Z7c,a));jdd((new kdd,a))};var o8c,p8c,q8c,r8c,s8c,t8c,u8c,v8c,w8c,x8c,y8c,z8c,A8c,B8c,C8c,D8c,E8c,F8c,G8c,H8c,I8c,J8c,K8c,L8c,M8c,N8c,O8c,P8c,Q8c,R8c,S8c,T8c,U8c,V8c,W8c,X8c,Y8c,Z8c,$8c,_8c,a9c,b9c,c9c,d9c,e9c,f9c,g9c,h9c,i9c,j9c,k9c,l9c,m9c,n9c,o9c,p9c,q9c,r9c,s9c,t9c,u9c,v9c,w9c,x9c,y9c,z9c,A9c,B9c,C9c,D9c,E9c,F9c,G9c,H9c,I9c,J9c,K9c,L9c,M9c,N9c,O9c,P9c,Q9c,R9c,S9c,T9c,U9c,V9c,W9c,X9c;var s1=mdb(ose,'CoreOptions',684);bcb(103,22,{3:1,35:1,22:1,103:1},iad);var _9c,aad,bad,cad,dad;var t1=ndb(ose,Cle,103,CI,kad,jad);var lad;bcb(272,22,{3:1,35:1,22:1,272:1},rad);var nad,oad,pad;var u1=ndb(ose,'EdgeLabelPlacement',272,CI,tad,sad);var uad;bcb(218,22,{3:1,35:1,22:1,218:1},Bad);var wad,xad,yad,zad;var v1=ndb(ose,'EdgeRouting',218,CI,Dad,Cad);var Ead;bcb(312,22,{3:1,35:1,22:1,312:1},Nad);var Gad,Had,Iad,Jad,Kad,Lad;var w1=ndb(ose,'EdgeType',312,CI,Pad,Oad);var Qad;bcb(977,1,ale,_ad);_.Qe=function abd(a){$ad(a)};var Sad,Tad,Uad,Vad,Wad,Xad,Yad;var y1=mdb(ose,'FixedLayouterOptions',977);bcb(978,1,{},bbd);_.$e=function cbd(){var a;return a=new Zfd,a};_._e=function dbd(a){};var x1=mdb(ose,'FixedLayouterOptions/FixedFactory',978);bcb(334,22,{3:1,35:1,22:1,334:1},ibd);var ebd,fbd,gbd;var z1=ndb(ose,'HierarchyHandling',334,CI,kbd,jbd);var lbd;bcb(285,22,{3:1,35:1,22:1,285:1},tbd);var nbd,obd,pbd,qbd;var A1=ndb(ose,'LabelSide',285,CI,vbd,ubd);var wbd;bcb(93,22,{3:1,35:1,22:1,93:1},Ibd);var ybd,zbd,Abd,Bbd,Cbd,Dbd,Ebd,Fbd,Gbd;var B1=ndb(ose,'NodeLabelPlacement',93,CI,Lbd,Kbd);var Mbd;bcb(249,22,{3:1,35:1,22:1,249:1},Ubd);var Obd,Pbd,Qbd,Rbd,Sbd;var C1=ndb(ose,'PortAlignment',249,CI,Wbd,Vbd);var Xbd;bcb(98,22,{3:1,35:1,22:1,98:1},gcd);var Zbd,$bd,_bd,acd,bcd,ccd;var D1=ndb(ose,'PortConstraints',98,CI,icd,hcd);var jcd;bcb(273,22,{3:1,35:1,22:1,273:1},scd);var lcd,mcd,ncd,ocd,pcd,qcd;var E1=ndb(ose,'PortLabelPlacement',273,CI,wcd,vcd);var xcd;bcb(61,22,{3:1,35:1,22:1,61:1},Ycd);var zcd,Acd,Bcd,Ccd,Dcd,Ecd,Fcd,Gcd,Hcd,Icd,Jcd,Kcd,Lcd,Mcd,Ncd,Ocd,Pcd,Qcd,Rcd,Scd,Tcd;var F1=ndb(ose,'PortSide',61,CI,_cd,$cd);var bdd;bcb(981,1,ale,kdd);_.Qe=function ldd(a){jdd(a)};var ddd,edd,fdd,gdd,hdd;var H1=mdb(ose,'RandomLayouterOptions',981);bcb(982,1,{},mdd);_.$e=function ndd(){var a;return a=new Mgd,a};_._e=function odd(a){};var G1=mdb(ose,'RandomLayouterOptions/RandomFactory',982);bcb(374,22,{3:1,35:1,22:1,374:1},udd);var pdd,qdd,rdd,sdd;var I1=ndb(ose,'SizeConstraint',374,CI,wdd,vdd);var xdd;bcb(259,22,{3:1,35:1,22:1,259:1},Jdd);var zdd,Add,Bdd,Cdd,Ddd,Edd,Fdd,Gdd,Hdd;var J1=ndb(ose,'SizeOptions',259,CI,Ldd,Kdd);var Mdd;bcb(370,1,{1949:1},Zdd);_.b=false;_.c=0;_.d=-1;_.e=null;_.f=null;_.g=-1;_.j=false;_.k=false;_.n=false;_.o=0;_.q=0;_.r=0;var L1=mdb(yqe,'BasicProgressMonitor',370);bcb(972,209,Mle,ged);_.Ze=function ked(a,b){var c,d,e,f,g,h,i,j,k;Odd(b,'Box layout',2);e=Gdb(ED(hkd(a,(X7c(),W7c))));f=BD(hkd(a,T7c),116);c=Ccb(DD(hkd(a,O7c)));d=Ccb(DD(hkd(a,P7c)));switch(BD(hkd(a,M7c),311).g){case 0:g=(h=new Tkb((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a)),mmb(),Okb(h,new med(d)),h);i=rfd(a);j=ED(hkd(a,L7c));(j==null||(uCb(j),j)<=0)&&(j=1.3);k=ded(g,e,f,i.a,i.b,c,(uCb(j),j));Afd(a,k.a,k.b,false,true);break;default:eed(a,e,f,c);}Qdd(b)};var S1=mdb(yqe,'BoxLayoutProvider',972);bcb(973,1,Dke,med);_.ue=function ned(a,b){return led(this,BD(a,33),BD(b,33))};_.Fb=function oed(a){return this===a};_.ve=function ped(){return new tpb(this)};_.a=false;var M1=mdb(yqe,'BoxLayoutProvider/1',973);bcb(157,1,{157:1},wed,xed);_.Ib=function yed(){return this.c?_od(this.c):Fe(this.b)};var N1=mdb(yqe,'BoxLayoutProvider/Group',157);bcb(311,22,{3:1,35:1,22:1,311:1},Eed);var zed,Aed,Bed,Ced;var O1=ndb(yqe,'BoxLayoutProvider/PackingMode',311,CI,Ged,Fed);var Hed;bcb(974,1,Dke,Jed);_.ue=function Ked(a,b){return hed(BD(a,157),BD(b,157))};_.Fb=function Led(a){return this===a};_.ve=function Med(){return new tpb(this)};var P1=mdb(yqe,'BoxLayoutProvider/lambda$0$Type',974);bcb(975,1,Dke,Ned);_.ue=function Oed(a,b){return ied(BD(a,157),BD(b,157))};_.Fb=function Ped(a){return this===a};_.ve=function Qed(){return new tpb(this)};var Q1=mdb(yqe,'BoxLayoutProvider/lambda$1$Type',975);bcb(976,1,Dke,Red);_.ue=function Sed(a,b){return jed(BD(a,157),BD(b,157))};_.Fb=function Ted(a){return this===a};_.ve=function Ued(){return new tpb(this)};var R1=mdb(yqe,'BoxLayoutProvider/lambda$2$Type',976);bcb(1365,1,{831:1},Ved);_.qg=function Wed(a,b){return Vyc(),!JD(b,160)||h2c((Y1c(),X1c,BD(a,160)),b)};var T1=mdb(yqe,'ElkSpacings/AbstractSpacingsBuilder/lambda$0$Type',1365);bcb(1366,1,qie,Xed);_.td=function Yed(a){Yyc(this.a,BD(a,146))};var U1=mdb(yqe,'ElkSpacings/AbstractSpacingsBuilder/lambda$1$Type',1366);bcb(1367,1,qie,Zed);_.td=function $ed(a){BD(a,94);Vyc()};var V1=mdb(yqe,'ElkSpacings/AbstractSpacingsBuilder/lambda$2$Type',1367);bcb(1371,1,qie,_ed);_.td=function afd(a){Zyc(this.a,BD(a,94))};var W1=mdb(yqe,'ElkSpacings/AbstractSpacingsBuilder/lambda$3$Type',1371);bcb(1369,1,Oie,bfd);_.Mb=function cfd(a){return $yc(this.a,this.b,BD(a,146))};var X1=mdb(yqe,'ElkSpacings/AbstractSpacingsBuilder/lambda$4$Type',1369);bcb(1368,1,Oie,dfd);_.Mb=function efd(a){return azc(this.a,this.b,BD(a,831))};var Y1=mdb(yqe,'ElkSpacings/AbstractSpacingsBuilder/lambda$5$Type',1368);bcb(1370,1,qie,ffd);_.td=function gfd(a){_yc(this.a,this.b,BD(a,146))};var Z1=mdb(yqe,'ElkSpacings/AbstractSpacingsBuilder/lambda$6$Type',1370);bcb(935,1,{},Hfd);_.Kb=function Ifd(a){return Gfd(a)};_.Fb=function Jfd(a){return this===a};var _1=mdb(yqe,'ElkUtil/lambda$0$Type',935);bcb(936,1,qie,Kfd);_.td=function Lfd(a){ufd(this.a,this.b,BD(a,79))};_.a=0;_.b=0;var a2=mdb(yqe,'ElkUtil/lambda$1$Type',936);bcb(937,1,qie,Mfd);_.td=function Nfd(a){vfd(this.a,this.b,BD(a,202))};_.a=0;_.b=0;var b2=mdb(yqe,'ElkUtil/lambda$2$Type',937);bcb(938,1,qie,Ofd);_.td=function Pfd(a){wfd(this.a,this.b,BD(a,137))};_.a=0;_.b=0;var c2=mdb(yqe,'ElkUtil/lambda$3$Type',938);bcb(939,1,qie,Qfd);_.td=function Rfd(a){xfd(this.a,BD(a,469))};var d2=mdb(yqe,'ElkUtil/lambda$4$Type',939);bcb(342,1,{35:1,342:1},Tfd);_.wd=function Ufd(a){return Sfd(this,BD(a,236))};_.Fb=function Vfd(a){var b;if(JD(a,342)){b=BD(a,342);return this.a==b.a}return false};_.Hb=function Wfd(){return QD(this.a)};_.Ib=function Xfd(){return this.a+' (exclusive)'};_.a=0;var e2=mdb(yqe,'ExclusiveBounds/ExclusiveLowerBound',342);bcb(1138,209,Mle,Zfd);_.Ze=function $fd(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B;Odd(b,'Fixed Layout',1);f=BD(hkd(a,(Y9c(),E8c)),218);l=0;m=0;for(s=new Fyd((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a));s.e!=s.i.gc();){q=BD(Dyd(s),33);B=BD(hkd(q,(Zad(),Yad)),8);if(B){bld(q,B.a,B.b);if(BD(hkd(q,Tad),174).Hc((tdd(),pdd))){n=BD(hkd(q,Vad),8);n.a>0&&n.b>0&&Afd(q,n.a,n.b,true,true)}}l=$wnd.Math.max(l,q.i+q.g);m=$wnd.Math.max(m,q.j+q.f);for(j=new Fyd((!q.n&&(q.n=new cUd(D2,q,1,7)),q.n));j.e!=j.i.gc();){h=BD(Dyd(j),137);B=BD(hkd(h,Yad),8);!!B&&bld(h,B.a,B.b);l=$wnd.Math.max(l,q.i+h.i+h.g);m=$wnd.Math.max(m,q.j+h.j+h.f)}for(v=new Fyd((!q.c&&(q.c=new cUd(F2,q,9,9)),q.c));v.e!=v.i.gc();){u=BD(Dyd(v),118);B=BD(hkd(u,Yad),8);!!B&&bld(u,B.a,B.b);w=q.i+u.i;A=q.j+u.j;l=$wnd.Math.max(l,w+u.g);m=$wnd.Math.max(m,A+u.f);for(i=new Fyd((!u.n&&(u.n=new cUd(D2,u,1,7)),u.n));i.e!=i.i.gc();){h=BD(Dyd(i),137);B=BD(hkd(h,Yad),8);!!B&&bld(h,B.a,B.b);l=$wnd.Math.max(l,w+h.i+h.g);m=$wnd.Math.max(m,A+h.j+h.f)}}for(e=new Sr(ur(_sd(q).a.Kc(),new Sq));Qr(e);){c=BD(Rr(e),79);k=Yfd(c);l=$wnd.Math.max(l,k.a);m=$wnd.Math.max(m,k.b)}for(d=new Sr(ur($sd(q).a.Kc(),new Sq));Qr(d);){c=BD(Rr(d),79);if(Xod(jtd(c))!=a){k=Yfd(c);l=$wnd.Math.max(l,k.a);m=$wnd.Math.max(m,k.b)}}}if(f==(Aad(),wad)){for(r=new Fyd((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a));r.e!=r.i.gc();){q=BD(Dyd(r),33);for(d=new Sr(ur(_sd(q).a.Kc(),new Sq));Qr(d);){c=BD(Rr(d),79);g=pfd(c);g.b==0?jkd(c,Q8c,null):jkd(c,Q8c,g)}}}if(!Ccb(DD(hkd(a,(Zad(),Uad))))){t=BD(hkd(a,Wad),116);p=l+t.b+t.c;o=m+t.d+t.a;Afd(a,p,o,true,true)}Qdd(b)};var f2=mdb(yqe,'FixedLayoutProvider',1138);bcb(373,134,{3:1,414:1,373:1,94:1,134:1},_fd,agd);_.Jf=function dgd(b){var c,d,e,f,g,h,i,j,k;if(!b){return}try{j=mfb(b,';,;');for(g=j,h=0,i=g.length;h>16&aje|b^d<<16};_.Kc=function zgd(){return new Bgd(this)};_.Ib=function Agd(){return this.a==null&&this.b==null?'pair(null,null)':this.a==null?'pair(null,'+fcb(this.b)+')':this.b==null?'pair('+fcb(this.a)+',null)':'pair('+fcb(this.a)+','+fcb(this.b)+')'};var n2=mdb(yqe,'Pair',46);bcb(983,1,aie,Bgd);_.Nb=function Cgd(a){Rrb(this,a)};_.Ob=function Dgd(){return !this.c&&(!this.b&&this.a.a!=null||this.a.b!=null)};_.Pb=function Egd(){if(!this.c&&!this.b&&this.a.a!=null){this.b=true;return this.a.a}else if(!this.c&&this.a.b!=null){this.c=true;return this.a.b}throw vbb(new utb)};_.Qb=function Fgd(){this.c&&this.a.b!=null?(this.a.b=null):this.b&&this.a.a!=null&&(this.a.a=null);throw vbb(new Ydb)};_.b=false;_.c=false;var m2=mdb(yqe,'Pair/1',983);bcb(448,1,{448:1},Ggd);_.Fb=function Hgd(a){return wtb(this.a,BD(a,448).a)&&wtb(this.c,BD(a,448).c)&&wtb(this.d,BD(a,448).d)&&wtb(this.b,BD(a,448).b)};_.Hb=function Igd(){return Hlb(OC(GC(SI,1),Uhe,1,5,[this.a,this.c,this.d,this.b]))};_.Ib=function Jgd(){return '('+this.a+She+this.c+She+this.d+She+this.b+')'};var o2=mdb(yqe,'Quadruple',448);bcb(1126,209,Mle,Mgd);_.Ze=function Ngd(a,b){var c,d,e,f,g;Odd(b,'Random Layout',1);if((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a).i==0){Qdd(b);return}f=BD(hkd(a,(idd(),gdd)),19);!!f&&f.a!=0?(e=new Hub(f.a)):(e=new Gub);c=Gdb(ED(hkd(a,ddd)));g=Gdb(ED(hkd(a,hdd)));d=BD(hkd(a,edd),116);Lgd(a,e,c,g,d);Qdd(b)};var p2=mdb(yqe,'RandomLayoutProvider',1126);var Ogd;bcb(553,1,{});_.qf=function Sgd(){return new f7c(this.f.i,this.f.j)};_.We=function Tgd(a){if(Jsd(a,(Y9c(),s9c))){return hkd(this.f,Qgd)}return hkd(this.f,a)};_.rf=function Ugd(){return new f7c(this.f.g,this.f.f)};_.sf=function Vgd(){return this.g};_.Xe=function Wgd(a){return ikd(this.f,a)};_.tf=function Xgd(a){dld(this.f,a.a);eld(this.f,a.b)};_.uf=function Ygd(a){cld(this.f,a.a);ald(this.f,a.b)};_.vf=function Zgd(a){this.g=a};_.g=0;var Qgd;var q2=mdb(Use,'ElkGraphAdapters/AbstractElkGraphElementAdapter',553);bcb(554,1,{839:1},$gd);_.wf=function _gd(){var a,b;if(!this.b){this.b=Qu(Kkd(this.a).i);for(b=new Fyd(Kkd(this.a));b.e!=b.i.gc();){a=BD(Dyd(b),137);Ekb(this.b,new dhd(a))}}return this.b};_.b=null;var r2=mdb(Use,'ElkGraphAdapters/ElkEdgeAdapter',554);bcb(301,553,{},bhd);_.xf=function chd(){return ahd(this)};_.a=null;var s2=mdb(Use,'ElkGraphAdapters/ElkGraphAdapter',301);bcb(630,553,{181:1},dhd);var t2=mdb(Use,'ElkGraphAdapters/ElkLabelAdapter',630);bcb(629,553,{680:1},hhd);_.wf=function khd(){return ehd(this)};_.Af=function lhd(){var a;return a=BD(hkd(this.f,(Y9c(),S8c)),142),!a&&(a=new H_b),a};_.Cf=function nhd(){return fhd(this)};_.Ef=function phd(a){var b;b=new K_b(a);jkd(this.f,(Y9c(),S8c),b)};_.Ff=function qhd(a){jkd(this.f,(Y9c(),f9c),new r0b(a))};_.yf=function ihd(){return this.d};_.zf=function jhd(){var a,b;if(!this.a){this.a=new Rkb;for(b=new Sr(ur($sd(BD(this.f,33)).a.Kc(),new Sq));Qr(b);){a=BD(Rr(b),79);Ekb(this.a,new $gd(a))}}return this.a};_.Bf=function mhd(){var a,b;if(!this.c){this.c=new Rkb;for(b=new Sr(ur(_sd(BD(this.f,33)).a.Kc(),new Sq));Qr(b);){a=BD(Rr(b),79);Ekb(this.c,new $gd(a))}}return this.c};_.Df=function ohd(){return Vod(BD(this.f,33)).i!=0||Ccb(DD(BD(this.f,33).We((Y9c(),M8c))))};_.Gf=function rhd(){ghd(this,(Pgd(),Ogd))};_.a=null;_.b=null;_.c=null;_.d=null;_.e=null;var u2=mdb(Use,'ElkGraphAdapters/ElkNodeAdapter',629);bcb(1266,553,{838:1},thd);_.wf=function vhd(){return shd(this)};_.zf=function uhd(){var a,b;if(!this.a){this.a=Pu(BD(this.f,118).xg().i);for(b=new Fyd(BD(this.f,118).xg());b.e!=b.i.gc();){a=BD(Dyd(b),79);Ekb(this.a,new $gd(a))}}return this.a};_.Bf=function whd(){var a,b;if(!this.c){this.c=Pu(BD(this.f,118).yg().i);for(b=new Fyd(BD(this.f,118).yg());b.e!=b.i.gc();){a=BD(Dyd(b),79);Ekb(this.c,new $gd(a))}}return this.c};_.Hf=function xhd(){return BD(BD(this.f,118).We((Y9c(),A9c)),61)};_.If=function yhd(){var a,b,c,d,e,f,g,h;d=mpd(BD(this.f,118));for(c=new Fyd(BD(this.f,118).yg());c.e!=c.i.gc();){a=BD(Dyd(c),79);for(h=new Fyd((!a.c&&(a.c=new y5d(z2,a,5,8)),a.c));h.e!=h.i.gc();){g=BD(Dyd(h),82);if(ntd(atd(g),d)){return true}else if(atd(g)==d&&Ccb(DD(hkd(a,(Y9c(),N8c))))){return true}}}for(b=new Fyd(BD(this.f,118).xg());b.e!=b.i.gc();){a=BD(Dyd(b),79);for(f=new Fyd((!a.b&&(a.b=new y5d(z2,a,4,7)),a.b));f.e!=f.i.gc();){e=BD(Dyd(f),82);if(ntd(atd(e),d)){return true}}}return false};_.a=null;_.b=null;_.c=null;var v2=mdb(Use,'ElkGraphAdapters/ElkPortAdapter',1266);bcb(1267,1,Dke,Ahd);_.ue=function Bhd(a,b){return zhd(BD(a,118),BD(b,118))};_.Fb=function Chd(a){return this===a};_.ve=function Dhd(){return new tpb(this)};var w2=mdb(Use,'ElkGraphAdapters/PortComparator',1267);var m5=odb(Vse,'EObject');var x2=odb(Wse,Xse);var y2=odb(Wse,Yse);var C2=odb(Wse,Zse);var G2=odb(Wse,'ElkShape');var z2=odb(Wse,$se);var B2=odb(Wse,_se);var A2=odb(Wse,ate);var k5=odb(Vse,bte);var i5=odb(Vse,'EFactory');var Ehd;var l5=odb(Vse,cte);var o5=odb(Vse,'EPackage');var Ghd;var Ihd,Jhd,Khd,Lhd,Mhd,Nhd,Ohd,Phd,Qhd,Rhd,Shd;var D2=odb(Wse,dte);var E2=odb(Wse,ete);var F2=odb(Wse,fte);bcb(90,1,gte);_.Jg=function Vhd(){this.Kg();return null};_.Kg=function Whd(){return null};_.Lg=function Xhd(){return this.Kg(),false};_.Mg=function Yhd(){return false};_.Ng=function Zhd(a){Uhd(this,a)};var b4=mdb(hte,'BasicNotifierImpl',90);bcb(97,90,pte);_.nh=function fjd(){return oid(this)};_.Og=function Fid(a,b){return a};_.Pg=function Gid(){throw vbb(new bgb)};_.Qg=function Hid(a){var b;return b=zUd(BD(XKd(this.Tg(),this.Vg()),18)),this.eh().ih(this,b.n,b.f,a)};_.Rg=function Iid(a,b){throw vbb(new bgb)};_.Sg=function Jid(a,b,c){return _hd(this,a,b,c)};_.Tg=function Kid(){var a;if(this.Pg()){a=this.Pg().ck();if(a){return a}}return this.zh()};_.Ug=function Lid(){return aid(this)};_.Vg=function Mid(){throw vbb(new bgb)};_.Wg=function Oid(){var a,b;b=this.ph().dk();!b&&this.Pg().ik(b=(nRd(),a=pNd(TKd(this.Tg())),a==null?mRd:new qRd(this,a)));return b};_.Xg=function Qid(a,b){return a};_.Yg=function Rid(a){var b;b=a.Gj();return !b?bLd(this.Tg(),a):a.aj()};_.Zg=function Sid(){var a;a=this.Pg();return !a?null:a.fk()};_.$g=function Tid(){return !this.Pg()?null:this.Pg().ck()};_._g=function Uid(a,b,c){return fid(this,a,b,c)};_.ah=function Vid(a){return gid(this,a)};_.bh=function Wid(a,b){return hid(this,a,b)};_.dh=function Xid(){var a;a=this.Pg();return !!a&&a.gk()};_.eh=function Yid(){throw vbb(new bgb)};_.fh=function Zid(){return jid(this)};_.gh=function $id(a,b,c,d){return kid(this,a,b,d)};_.hh=function _id(a,b,c){var d;return d=BD(XKd(this.Tg(),b),66),d.Nj().Qj(this,this.yh(),b-this.Ah(),a,c)};_.ih=function ajd(a,b,c,d){return lid(this,a,b,d)};_.jh=function bjd(a,b,c){var d;return d=BD(XKd(this.Tg(),b),66),d.Nj().Rj(this,this.yh(),b-this.Ah(),a,c)};_.kh=function cjd(){return !!this.Pg()&&!!this.Pg().ek()};_.lh=function djd(a){return mid(this,a)};_.mh=function ejd(a){return nid(this,a)};_.oh=function gjd(a){return rid(this,a)};_.ph=function hjd(){throw vbb(new bgb)};_.qh=function ijd(){return !this.Pg()?null:this.Pg().ek()};_.rh=function jjd(){return jid(this)};_.sh=function kjd(a,b){yid(this,a,b)};_.th=function ljd(a){this.ph().hk(a)};_.uh=function mjd(a){this.ph().kk(a)};_.vh=function njd(a){this.ph().jk(a)};_.wh=function ojd(a,b){var c,d,e,f;f=this.Zg();if(!!f&&!!a){b=Txd(f.Vk(),this,b);f.Zk(this)}d=this.eh();if(d){if((Nid(this,this.eh(),this.Vg()).Bb&Tje)!=0){e=d.fh();!!e&&(!a?e.Yk(this):!f&&e.Zk(this))}else{b=(c=this.Vg(),c>=0?this.Qg(b):this.eh().ih(this,-1-c,null,b));b=this.Sg(null,-1,b)}}this.uh(a);return b};_.xh=function pjd(a){var b,c,d,e,f,g,h,i;c=this.Tg();f=bLd(c,a);b=this.Ah();if(f>=b){return BD(a,66).Nj().Uj(this,this.yh(),f-b)}else if(f<=-1){g=e1d((O6d(),M6d),c,a);if(g){Q6d();BD(g,66).Oj()||(g=_1d(q1d(M6d,g)));e=(d=this.Yg(g),BD(d>=0?this._g(d,true,true):sid(this,g,true),153));i=g.Zj();if(i>1||i==-1){return BD(BD(e,215).hl(a,false),76)}}else{throw vbb(new Wdb(ite+a.ne()+lte))}}else if(a.$j()){return d=this.Yg(a),BD(d>=0?this._g(d,false,true):sid(this,a,false),76)}h=new nGd(this,a);return h};_.yh=function qjd(){return Aid(this)};_.zh=function rjd(){return (NFd(),MFd).S};_.Ah=function sjd(){return aLd(this.zh())};_.Bh=function tjd(a){Cid(this,a)};_.Ib=function ujd(){return Eid(this)};var B5=mdb(qte,'BasicEObjectImpl',97);var zFd;bcb(114,97,{105:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1});_.Ch=function Djd(a){var b;b=xjd(this);return b[a]};_.Dh=function Ejd(a,b){var c;c=xjd(this);NC(c,a,b)};_.Eh=function Fjd(a){var b;b=xjd(this);NC(b,a,null)};_.Jg=function Gjd(){return BD(Ajd(this,4),126)};_.Kg=function Hjd(){throw vbb(new bgb)};_.Lg=function Ijd(){return (this.Db&4)!=0};_.Pg=function Jjd(){throw vbb(new bgb)};_.Fh=function Kjd(a){Cjd(this,2,a)};_.Rg=function Ljd(a,b){this.Db=b<<16|this.Db&255;this.Fh(a)};_.Tg=function Mjd(){return wjd(this)};_.Vg=function Njd(){return this.Db>>16};_.Wg=function Ojd(){var a,b;return nRd(),b=pNd(TKd((a=BD(Ajd(this,16),26),!a?this.zh():a))),b==null?(null,mRd):new qRd(this,b)};_.Mg=function Pjd(){return (this.Db&1)==0};_.Zg=function Qjd(){return BD(Ajd(this,128),1935)};_.$g=function Rjd(){return BD(Ajd(this,16),26)};_.dh=function Sjd(){return (this.Db&32)!=0};_.eh=function Tjd(){return BD(Ajd(this,2),49)};_.kh=function Ujd(){return (this.Db&64)!=0};_.ph=function Vjd(){throw vbb(new bgb)};_.qh=function Wjd(){return BD(Ajd(this,64),281)};_.th=function Xjd(a){Cjd(this,16,a)};_.uh=function Yjd(a){Cjd(this,128,a)};_.vh=function Zjd(a){Cjd(this,64,a)};_.yh=function $jd(){return yjd(this)};_.Db=0;var s8=mdb(qte,'MinimalEObjectImpl',114);bcb(115,114,{105:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1});_.Fh=function _jd(a){this.Cb=a};_.eh=function akd(){return this.Cb};var r8=mdb(qte,'MinimalEObjectImpl/Container',115);bcb(1985,115,{105:1,413:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1});_._g=function kkd(a,b,c){return bkd(this,a,b,c)};_.jh=function lkd(a,b,c){return ckd(this,a,b,c)};_.lh=function mkd(a){return dkd(this,a)};_.sh=function nkd(a,b){ekd(this,a,b)};_.zh=function okd(){return Thd(),Shd};_.Bh=function pkd(a){fkd(this,a)};_.Ve=function qkd(){return gkd(this)};_.We=function rkd(a){return hkd(this,a)};_.Xe=function skd(a){return ikd(this,a)};_.Ye=function tkd(a,b){return jkd(this,a,b)};var H2=mdb(rte,'EMapPropertyHolderImpl',1985);bcb(567,115,{105:1,469:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1},xkd);_._g=function ykd(a,b,c){switch(a){case 0:return this.a;case 1:return this.b;}return fid(this,a,b,c)};_.lh=function zkd(a){switch(a){case 0:return this.a!=0;case 1:return this.b!=0;}return mid(this,a)};_.sh=function Akd(a,b){switch(a){case 0:vkd(this,Edb(ED(b)));return;case 1:wkd(this,Edb(ED(b)));return;}yid(this,a,b)};_.zh=function Bkd(){return Thd(),Ihd};_.Bh=function Ckd(a){switch(a){case 0:vkd(this,0);return;case 1:wkd(this,0);return;}Cid(this,a)};_.Ib=function Dkd(){var a;if((this.Db&64)!=0)return Eid(this);a=new Jfb(Eid(this));a.a+=' (x: ';Bfb(a,this.a);a.a+=', y: ';Bfb(a,this.b);a.a+=')';return a.a};_.a=0;_.b=0;var I2=mdb(rte,'ElkBendPointImpl',567);bcb(723,1985,{105:1,413:1,160:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1});_._g=function Nkd(a,b,c){return Ekd(this,a,b,c)};_.hh=function Okd(a,b,c){return Fkd(this,a,b,c)};_.jh=function Pkd(a,b,c){return Gkd(this,a,b,c)};_.lh=function Qkd(a){return Hkd(this,a)};_.sh=function Rkd(a,b){Ikd(this,a,b)};_.zh=function Skd(){return Thd(),Mhd};_.Bh=function Tkd(a){Jkd(this,a)};_.zg=function Ukd(){return this.k};_.Ag=function Vkd(){return Kkd(this)};_.Ib=function Wkd(){return Mkd(this)};_.k=null;var M2=mdb(rte,'ElkGraphElementImpl',723);bcb(724,723,{105:1,413:1,160:1,470:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1});_._g=function gld(a,b,c){return Xkd(this,a,b,c)};_.lh=function hld(a){return Ykd(this,a)};_.sh=function ild(a,b){Zkd(this,a,b)};_.zh=function jld(){return Thd(),Rhd};_.Bh=function kld(a){$kd(this,a)};_.Bg=function lld(){return this.f};_.Cg=function mld(){return this.g};_.Dg=function nld(){return this.i};_.Eg=function old(){return this.j};_.Fg=function pld(a,b){_kd(this,a,b)};_.Gg=function qld(a,b){bld(this,a,b)};_.Hg=function rld(a){dld(this,a)};_.Ig=function sld(a){eld(this,a)};_.Ib=function tld(){return fld(this)};_.f=0;_.g=0;_.i=0;_.j=0;var T2=mdb(rte,'ElkShapeImpl',724);bcb(725,724,{105:1,413:1,82:1,160:1,470:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1});_._g=function Bld(a,b,c){return uld(this,a,b,c)};_.hh=function Cld(a,b,c){return vld(this,a,b,c)};_.jh=function Dld(a,b,c){return wld(this,a,b,c)};_.lh=function Eld(a){return xld(this,a)};_.sh=function Fld(a,b){yld(this,a,b)};_.zh=function Gld(){return Thd(),Jhd};_.Bh=function Hld(a){zld(this,a)};_.xg=function Ild(){return !this.d&&(this.d=new y5d(B2,this,8,5)),this.d};_.yg=function Jld(){return !this.e&&(this.e=new y5d(B2,this,7,4)),this.e};var J2=mdb(rte,'ElkConnectableShapeImpl',725);bcb(352,723,{105:1,413:1,79:1,160:1,352:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1},Tld);_.Qg=function Uld(a){return Lld(this,a)};_._g=function Vld(a,b,c){switch(a){case 3:return Mld(this);case 4:return !this.b&&(this.b=new y5d(z2,this,4,7)),this.b;case 5:return !this.c&&(this.c=new y5d(z2,this,5,8)),this.c;case 6:return !this.a&&(this.a=new cUd(A2,this,6,6)),this.a;case 7:return Bcb(),!this.b&&(this.b=new y5d(z2,this,4,7)),this.b.i<=1&&(!this.c&&(this.c=new y5d(z2,this,5,8)),this.c.i<=1)?false:true;case 8:return Bcb(),Pld(this)?true:false;case 9:return Bcb(),Qld(this)?true:false;case 10:return Bcb(),!this.b&&(this.b=new y5d(z2,this,4,7)),this.b.i!=0&&(!this.c&&(this.c=new y5d(z2,this,5,8)),this.c.i!=0)?true:false;}return Ekd(this,a,b,c)};_.hh=function Wld(a,b,c){var d;switch(b){case 3:!!this.Cb&&(c=(d=this.Db>>16,d>=0?Lld(this,c):this.Cb.ih(this,-1-d,null,c)));return Kld(this,BD(a,33),c);case 4:return !this.b&&(this.b=new y5d(z2,this,4,7)),Sxd(this.b,a,c);case 5:return !this.c&&(this.c=new y5d(z2,this,5,8)),Sxd(this.c,a,c);case 6:return !this.a&&(this.a=new cUd(A2,this,6,6)),Sxd(this.a,a,c);}return Fkd(this,a,b,c)};_.jh=function Xld(a,b,c){switch(b){case 3:return Kld(this,null,c);case 4:return !this.b&&(this.b=new y5d(z2,this,4,7)),Txd(this.b,a,c);case 5:return !this.c&&(this.c=new y5d(z2,this,5,8)),Txd(this.c,a,c);case 6:return !this.a&&(this.a=new cUd(A2,this,6,6)),Txd(this.a,a,c);}return Gkd(this,a,b,c)};_.lh=function Yld(a){switch(a){case 3:return !!Mld(this);case 4:return !!this.b&&this.b.i!=0;case 5:return !!this.c&&this.c.i!=0;case 6:return !!this.a&&this.a.i!=0;case 7:return !this.b&&(this.b=new y5d(z2,this,4,7)),!(this.b.i<=1&&(!this.c&&(this.c=new y5d(z2,this,5,8)),this.c.i<=1));case 8:return Pld(this);case 9:return Qld(this);case 10:return !this.b&&(this.b=new y5d(z2,this,4,7)),this.b.i!=0&&(!this.c&&(this.c=new y5d(z2,this,5,8)),this.c.i!=0);}return Hkd(this,a)};_.sh=function Zld(a,b){switch(a){case 3:Rld(this,BD(b,33));return;case 4:!this.b&&(this.b=new y5d(z2,this,4,7));Uxd(this.b);!this.b&&(this.b=new y5d(z2,this,4,7));ytd(this.b,BD(b,14));return;case 5:!this.c&&(this.c=new y5d(z2,this,5,8));Uxd(this.c);!this.c&&(this.c=new y5d(z2,this,5,8));ytd(this.c,BD(b,14));return;case 6:!this.a&&(this.a=new cUd(A2,this,6,6));Uxd(this.a);!this.a&&(this.a=new cUd(A2,this,6,6));ytd(this.a,BD(b,14));return;}Ikd(this,a,b)};_.zh=function $ld(){return Thd(),Khd};_.Bh=function _ld(a){switch(a){case 3:Rld(this,null);return;case 4:!this.b&&(this.b=new y5d(z2,this,4,7));Uxd(this.b);return;case 5:!this.c&&(this.c=new y5d(z2,this,5,8));Uxd(this.c);return;case 6:!this.a&&(this.a=new cUd(A2,this,6,6));Uxd(this.a);return;}Jkd(this,a)};_.Ib=function amd(){return Sld(this)};var K2=mdb(rte,'ElkEdgeImpl',352);bcb(439,1985,{105:1,413:1,202:1,439:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1},rmd);_.Qg=function smd(a){return cmd(this,a)};_._g=function tmd(a,b,c){switch(a){case 1:return this.j;case 2:return this.k;case 3:return this.b;case 4:return this.c;case 5:return !this.a&&(this.a=new xMd(y2,this,5)),this.a;case 6:return fmd(this);case 7:if(b)return emd(this);return this.i;case 8:if(b)return dmd(this);return this.f;case 9:return !this.g&&(this.g=new y5d(A2,this,9,10)),this.g;case 10:return !this.e&&(this.e=new y5d(A2,this,10,9)),this.e;case 11:return this.d;}return bkd(this,a,b,c)};_.hh=function umd(a,b,c){var d,e,f;switch(b){case 6:!!this.Cb&&(c=(e=this.Db>>16,e>=0?cmd(this,c):this.Cb.ih(this,-1-e,null,c)));return bmd(this,BD(a,79),c);case 9:return !this.g&&(this.g=new y5d(A2,this,9,10)),Sxd(this.g,a,c);case 10:return !this.e&&(this.e=new y5d(A2,this,10,9)),Sxd(this.e,a,c);}return f=BD(XKd((d=BD(Ajd(this,16),26),!d?(Thd(),Lhd):d),b),66),f.Nj().Qj(this,yjd(this),b-aLd((Thd(),Lhd)),a,c)};_.jh=function vmd(a,b,c){switch(b){case 5:return !this.a&&(this.a=new xMd(y2,this,5)),Txd(this.a,a,c);case 6:return bmd(this,null,c);case 9:return !this.g&&(this.g=new y5d(A2,this,9,10)),Txd(this.g,a,c);case 10:return !this.e&&(this.e=new y5d(A2,this,10,9)),Txd(this.e,a,c);}return ckd(this,a,b,c)};_.lh=function wmd(a){switch(a){case 1:return this.j!=0;case 2:return this.k!=0;case 3:return this.b!=0;case 4:return this.c!=0;case 5:return !!this.a&&this.a.i!=0;case 6:return !!fmd(this);case 7:return !!this.i;case 8:return !!this.f;case 9:return !!this.g&&this.g.i!=0;case 10:return !!this.e&&this.e.i!=0;case 11:return this.d!=null;}return dkd(this,a)};_.sh=function xmd(a,b){switch(a){case 1:omd(this,Edb(ED(b)));return;case 2:pmd(this,Edb(ED(b)));return;case 3:hmd(this,Edb(ED(b)));return;case 4:imd(this,Edb(ED(b)));return;case 5:!this.a&&(this.a=new xMd(y2,this,5));Uxd(this.a);!this.a&&(this.a=new xMd(y2,this,5));ytd(this.a,BD(b,14));return;case 6:mmd(this,BD(b,79));return;case 7:lmd(this,BD(b,82));return;case 8:kmd(this,BD(b,82));return;case 9:!this.g&&(this.g=new y5d(A2,this,9,10));Uxd(this.g);!this.g&&(this.g=new y5d(A2,this,9,10));ytd(this.g,BD(b,14));return;case 10:!this.e&&(this.e=new y5d(A2,this,10,9));Uxd(this.e);!this.e&&(this.e=new y5d(A2,this,10,9));ytd(this.e,BD(b,14));return;case 11:jmd(this,GD(b));return;}ekd(this,a,b)};_.zh=function ymd(){return Thd(),Lhd};_.Bh=function zmd(a){switch(a){case 1:omd(this,0);return;case 2:pmd(this,0);return;case 3:hmd(this,0);return;case 4:imd(this,0);return;case 5:!this.a&&(this.a=new xMd(y2,this,5));Uxd(this.a);return;case 6:mmd(this,null);return;case 7:lmd(this,null);return;case 8:kmd(this,null);return;case 9:!this.g&&(this.g=new y5d(A2,this,9,10));Uxd(this.g);return;case 10:!this.e&&(this.e=new y5d(A2,this,10,9));Uxd(this.e);return;case 11:jmd(this,null);return;}fkd(this,a)};_.Ib=function Amd(){return qmd(this)};_.b=0;_.c=0;_.d=null;_.j=0;_.k=0;var L2=mdb(rte,'ElkEdgeSectionImpl',439);bcb(150,115,{105:1,92:1,90:1,147:1,56:1,108:1,49:1,97:1,150:1,114:1,115:1});_._g=function Emd(a,b,c){var d;if(a==0){return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab}return bid(this,a-aLd(this.zh()),XKd((d=BD(Ajd(this,16),26),!d?this.zh():d),a),b,c)};_.hh=function Fmd(a,b,c){var d,e;if(b==0){return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Sxd(this.Ab,a,c)}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?this.zh():d),b),66),e.Nj().Qj(this,yjd(this),b-aLd(this.zh()),a,c)};_.jh=function Gmd(a,b,c){var d,e;if(b==0){return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Txd(this.Ab,a,c)}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?this.zh():d),b),66),e.Nj().Rj(this,yjd(this),b-aLd(this.zh()),a,c)};_.lh=function Hmd(a){var b;if(a==0){return !!this.Ab&&this.Ab.i!=0}return cid(this,a-aLd(this.zh()),XKd((b=BD(Ajd(this,16),26),!b?this.zh():b),a))};_.oh=function Imd(a){return Bmd(this,a)};_.sh=function Jmd(a,b){var c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;}did(this,a-aLd(this.zh()),XKd((c=BD(Ajd(this,16),26),!c?this.zh():c),a),b)};_.uh=function Kmd(a){Cjd(this,128,a)};_.zh=function Lmd(){return jGd(),ZFd};_.Bh=function Mmd(a){var b;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;}eid(this,a-aLd(this.zh()),XKd((b=BD(Ajd(this,16),26),!b?this.zh():b),a))};_.Gh=function Nmd(){this.Bb|=1};_.Hh=function Omd(a){return Dmd(this,a)};_.Bb=0;var f6=mdb(qte,'EModelElementImpl',150);bcb(704,150,{105:1,92:1,90:1,471:1,147:1,56:1,108:1,49:1,97:1,150:1,114:1,115:1},$md);_.Ih=function _md(a,b){return Vmd(this,a,b)};_.Jh=function and(a){var b,c,d,e,f;if(this.a!=bKd(a)||(a.Bb&256)!=0){throw vbb(new Wdb(xte+a.zb+ute))}for(d=_Kd(a);VKd(d.a).i!=0;){c=BD(nOd(d,0,(b=BD(qud(VKd(d.a),0),87),f=b.c,JD(f,88)?BD(f,26):(jGd(),_Fd))),26);if(dKd(c)){e=bKd(c).Nh().Jh(c);BD(e,49).th(a);return e}d=_Kd(c)}return (a.D!=null?a.D:a.B)=='java.util.Map$Entry'?new lHd(a):new _Gd(a)};_.Kh=function bnd(a,b){return Wmd(this,a,b)};_._g=function cnd(a,b,c){var d;switch(a){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab;case 1:return this.a;}return bid(this,a-aLd((jGd(),WFd)),XKd((d=BD(Ajd(this,16),26),!d?WFd:d),a),b,c)};_.hh=function dnd(a,b,c){var d,e;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Sxd(this.Ab,a,c);case 1:!!this.a&&(c=BD(this.a,49).ih(this,4,o5,c));return Tmd(this,BD(a,235),c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),WFd):d),b),66),e.Nj().Qj(this,yjd(this),b-aLd((jGd(),WFd)),a,c)};_.jh=function end(a,b,c){var d,e;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Txd(this.Ab,a,c);case 1:return Tmd(this,null,c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),WFd):d),b),66),e.Nj().Rj(this,yjd(this),b-aLd((jGd(),WFd)),a,c)};_.lh=function fnd(a){var b;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return !!this.a;}return cid(this,a-aLd((jGd(),WFd)),XKd((b=BD(Ajd(this,16),26),!b?WFd:b),a))};_.sh=function gnd(a,b){var c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:Ymd(this,BD(b,235));return;}did(this,a-aLd((jGd(),WFd)),XKd((c=BD(Ajd(this,16),26),!c?WFd:c),a),b)};_.zh=function hnd(){return jGd(),WFd};_.Bh=function ind(a){var b;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:Ymd(this,null);return;}eid(this,a-aLd((jGd(),WFd)),XKd((b=BD(Ajd(this,16),26),!b?WFd:b),a))};var Pmd,Qmd,Rmd;var d6=mdb(qte,'EFactoryImpl',704);bcb(zte,704,{105:1,2014:1,92:1,90:1,471:1,147:1,56:1,108:1,49:1,97:1,150:1,114:1,115:1},knd);_.Ih=function lnd(a,b){switch(a.yj()){case 12:return BD(b,146).tg();case 13:return fcb(b);default:throw vbb(new Wdb(tte+a.ne()+ute));}};_.Jh=function mnd(a){var b,c,d,e,f,g,h,i;switch(a.G==-1&&(a.G=(b=bKd(a),b?HLd(b.Mh(),a):-1)),a.G){case 4:return f=new Jod,f;case 6:return g=new apd,g;case 7:return h=new ppd,h;case 8:return d=new Tld,d;case 9:return c=new xkd,c;case 10:return e=new rmd,e;case 11:return i=new Bpd,i;default:throw vbb(new Wdb(xte+a.zb+ute));}};_.Kh=function nnd(a,b){switch(a.yj()){case 13:case 12:return null;default:throw vbb(new Wdb(tte+a.ne()+ute));}};var N2=mdb(rte,'ElkGraphFactoryImpl',zte);bcb(438,150,{105:1,92:1,90:1,147:1,191:1,56:1,108:1,49:1,97:1,150:1,114:1,115:1});_.Wg=function rnd(){var a,b;b=(a=BD(Ajd(this,16),26),pNd(TKd(!a?this.zh():a)));return b==null?(nRd(),nRd(),mRd):new GRd(this,b)};_._g=function snd(a,b,c){var d;switch(a){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab;case 1:return this.ne();}return bid(this,a-aLd(this.zh()),XKd((d=BD(Ajd(this,16),26),!d?this.zh():d),a),b,c)};_.lh=function tnd(a){var b;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;}return cid(this,a-aLd(this.zh()),XKd((b=BD(Ajd(this,16),26),!b?this.zh():b),a))};_.sh=function und(a,b){var c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:this.Lh(GD(b));return;}did(this,a-aLd(this.zh()),XKd((c=BD(Ajd(this,16),26),!c?this.zh():c),a),b)};_.zh=function vnd(){return jGd(),$Fd};_.Bh=function wnd(a){var b;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:this.Lh(null);return;}eid(this,a-aLd(this.zh()),XKd((b=BD(Ajd(this,16),26),!b?this.zh():b),a))};_.ne=function xnd(){return this.zb};_.Lh=function ynd(a){pnd(this,a)};_.Ib=function znd(){return qnd(this)};_.zb=null;var j6=mdb(qte,'ENamedElementImpl',438);bcb(179,438,{105:1,92:1,90:1,147:1,191:1,56:1,235:1,108:1,49:1,97:1,150:1,179:1,114:1,115:1,675:1},eod);_.Qg=function god(a){return Snd(this,a)};_._g=function hod(a,b,c){var d;switch(a){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab;case 1:return this.zb;case 2:return this.yb;case 3:return this.xb;case 4:return this.sb;case 5:return !this.rb&&(this.rb=new jUd(this,d5,this)),this.rb;case 6:return !this.vb&&(this.vb=new gUd(o5,this,6,7)),this.vb;case 7:if(b)return this.Db>>16==7?BD(this.Cb,235):null;return Ind(this);}return bid(this,a-aLd((jGd(),cGd)),XKd((d=BD(Ajd(this,16),26),!d?cGd:d),a),b,c)};_.hh=function iod(a,b,c){var d,e,f;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Sxd(this.Ab,a,c);case 4:!!this.sb&&(c=BD(this.sb,49).ih(this,1,i5,c));return Jnd(this,BD(a,471),c);case 5:return !this.rb&&(this.rb=new jUd(this,d5,this)),Sxd(this.rb,a,c);case 6:return !this.vb&&(this.vb=new gUd(o5,this,6,7)),Sxd(this.vb,a,c);case 7:!!this.Cb&&(c=(e=this.Db>>16,e>=0?Snd(this,c):this.Cb.ih(this,-1-e,null,c)));return _hd(this,a,7,c);}return f=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),cGd):d),b),66),f.Nj().Qj(this,yjd(this),b-aLd((jGd(),cGd)),a,c)};_.jh=function jod(a,b,c){var d,e;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Txd(this.Ab,a,c);case 4:return Jnd(this,null,c);case 5:return !this.rb&&(this.rb=new jUd(this,d5,this)),Txd(this.rb,a,c);case 6:return !this.vb&&(this.vb=new gUd(o5,this,6,7)),Txd(this.vb,a,c);case 7:return _hd(this,null,7,c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),cGd):d),b),66),e.Nj().Rj(this,yjd(this),b-aLd((jGd(),cGd)),a,c)};_.lh=function kod(a){var b;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return this.yb!=null;case 3:return this.xb!=null;case 4:return !!this.sb;case 5:return !!this.rb&&this.rb.i!=0;case 6:return !!this.vb&&this.vb.i!=0;case 7:return !!Ind(this);}return cid(this,a-aLd((jGd(),cGd)),XKd((b=BD(Ajd(this,16),26),!b?cGd:b),a))};_.oh=function lod(a){var b;b=Und(this,a);return b?b:Bmd(this,a)};_.sh=function mod(a,b){var c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:pnd(this,GD(b));return;case 2:dod(this,GD(b));return;case 3:cod(this,GD(b));return;case 4:bod(this,BD(b,471));return;case 5:!this.rb&&(this.rb=new jUd(this,d5,this));Uxd(this.rb);!this.rb&&(this.rb=new jUd(this,d5,this));ytd(this.rb,BD(b,14));return;case 6:!this.vb&&(this.vb=new gUd(o5,this,6,7));Uxd(this.vb);!this.vb&&(this.vb=new gUd(o5,this,6,7));ytd(this.vb,BD(b,14));return;}did(this,a-aLd((jGd(),cGd)),XKd((c=BD(Ajd(this,16),26),!c?cGd:c),a),b)};_.vh=function nod(a){var b,c;if(!!a&&!!this.rb){for(c=new Fyd(this.rb);c.e!=c.i.gc();){b=Dyd(c);JD(b,351)&&(BD(b,351).w=null)}}Cjd(this,64,a)};_.zh=function ood(){return jGd(),cGd};_.Bh=function pod(a){var b;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:pnd(this,null);return;case 2:dod(this,null);return;case 3:cod(this,null);return;case 4:bod(this,null);return;case 5:!this.rb&&(this.rb=new jUd(this,d5,this));Uxd(this.rb);return;case 6:!this.vb&&(this.vb=new gUd(o5,this,6,7));Uxd(this.vb);return;}eid(this,a-aLd((jGd(),cGd)),XKd((b=BD(Ajd(this,16),26),!b?cGd:b),a))};_.Gh=function qod(){Tnd(this)};_.Mh=function rod(){return !this.rb&&(this.rb=new jUd(this,d5,this)),this.rb};_.Nh=function sod(){return this.sb};_.Oh=function tod(){return this.ub};_.Ph=function uod(){return this.xb};_.Qh=function vod(){return this.yb};_.Rh=function wod(a){this.ub=a};_.Ib=function xod(){var a;if((this.Db&64)!=0)return qnd(this);a=new Jfb(qnd(this));a.a+=' (nsURI: ';Efb(a,this.yb);a.a+=', nsPrefix: ';Efb(a,this.xb);a.a+=')';return a.a};_.xb=null;_.yb=null;var And;var t6=mdb(qte,'EPackageImpl',179);bcb(555,179,{105:1,2016:1,555:1,92:1,90:1,147:1,191:1,56:1,235:1,108:1,49:1,97:1,150:1,179:1,114:1,115:1,675:1},Bod);_.q=false;_.r=false;var yod=false;var O2=mdb(rte,'ElkGraphPackageImpl',555);bcb(354,724,{105:1,413:1,160:1,137:1,470:1,354:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1},Jod);_.Qg=function Kod(a){return Eod(this,a)};_._g=function Lod(a,b,c){switch(a){case 7:return Fod(this);case 8:return this.a;}return Xkd(this,a,b,c)};_.hh=function Mod(a,b,c){var d;switch(b){case 7:!!this.Cb&&(c=(d=this.Db>>16,d>=0?Eod(this,c):this.Cb.ih(this,-1-d,null,c)));return Dod(this,BD(a,160),c);}return Fkd(this,a,b,c)};_.jh=function Nod(a,b,c){if(b==7){return Dod(this,null,c)}return Gkd(this,a,b,c)};_.lh=function Ood(a){switch(a){case 7:return !!Fod(this);case 8:return !dfb('',this.a);}return Ykd(this,a)};_.sh=function Pod(a,b){switch(a){case 7:God(this,BD(b,160));return;case 8:Hod(this,GD(b));return;}Zkd(this,a,b)};_.zh=function Qod(){return Thd(),Nhd};_.Bh=function Rod(a){switch(a){case 7:God(this,null);return;case 8:Hod(this,'');return;}$kd(this,a)};_.Ib=function Sod(){return Iod(this)};_.a='';var P2=mdb(rte,'ElkLabelImpl',354);bcb(239,725,{105:1,413:1,82:1,160:1,33:1,470:1,239:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1},apd);_.Qg=function bpd(a){return Uod(this,a)};_._g=function cpd(a,b,c){switch(a){case 9:return !this.c&&(this.c=new cUd(F2,this,9,9)),this.c;case 10:return !this.a&&(this.a=new cUd(E2,this,10,11)),this.a;case 11:return Xod(this);case 12:return !this.b&&(this.b=new cUd(B2,this,12,3)),this.b;case 13:return Bcb(),!this.a&&(this.a=new cUd(E2,this,10,11)),this.a.i>0?true:false;}return uld(this,a,b,c)};_.hh=function dpd(a,b,c){var d;switch(b){case 9:return !this.c&&(this.c=new cUd(F2,this,9,9)),Sxd(this.c,a,c);case 10:return !this.a&&(this.a=new cUd(E2,this,10,11)),Sxd(this.a,a,c);case 11:!!this.Cb&&(c=(d=this.Db>>16,d>=0?Uod(this,c):this.Cb.ih(this,-1-d,null,c)));return Tod(this,BD(a,33),c);case 12:return !this.b&&(this.b=new cUd(B2,this,12,3)),Sxd(this.b,a,c);}return vld(this,a,b,c)};_.jh=function epd(a,b,c){switch(b){case 9:return !this.c&&(this.c=new cUd(F2,this,9,9)),Txd(this.c,a,c);case 10:return !this.a&&(this.a=new cUd(E2,this,10,11)),Txd(this.a,a,c);case 11:return Tod(this,null,c);case 12:return !this.b&&(this.b=new cUd(B2,this,12,3)),Txd(this.b,a,c);}return wld(this,a,b,c)};_.lh=function fpd(a){switch(a){case 9:return !!this.c&&this.c.i!=0;case 10:return !!this.a&&this.a.i!=0;case 11:return !!Xod(this);case 12:return !!this.b&&this.b.i!=0;case 13:return !this.a&&(this.a=new cUd(E2,this,10,11)),this.a.i>0;}return xld(this,a)};_.sh=function gpd(a,b){switch(a){case 9:!this.c&&(this.c=new cUd(F2,this,9,9));Uxd(this.c);!this.c&&(this.c=new cUd(F2,this,9,9));ytd(this.c,BD(b,14));return;case 10:!this.a&&(this.a=new cUd(E2,this,10,11));Uxd(this.a);!this.a&&(this.a=new cUd(E2,this,10,11));ytd(this.a,BD(b,14));return;case 11:$od(this,BD(b,33));return;case 12:!this.b&&(this.b=new cUd(B2,this,12,3));Uxd(this.b);!this.b&&(this.b=new cUd(B2,this,12,3));ytd(this.b,BD(b,14));return;}yld(this,a,b)};_.zh=function hpd(){return Thd(),Ohd};_.Bh=function ipd(a){switch(a){case 9:!this.c&&(this.c=new cUd(F2,this,9,9));Uxd(this.c);return;case 10:!this.a&&(this.a=new cUd(E2,this,10,11));Uxd(this.a);return;case 11:$od(this,null);return;case 12:!this.b&&(this.b=new cUd(B2,this,12,3));Uxd(this.b);return;}zld(this,a)};_.Ib=function jpd(){return _od(this)};var Q2=mdb(rte,'ElkNodeImpl',239);bcb(186,725,{105:1,413:1,82:1,160:1,118:1,470:1,186:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1},ppd);_.Qg=function qpd(a){return lpd(this,a)};_._g=function rpd(a,b,c){if(a==9){return mpd(this)}return uld(this,a,b,c)};_.hh=function spd(a,b,c){var d;switch(b){case 9:!!this.Cb&&(c=(d=this.Db>>16,d>=0?lpd(this,c):this.Cb.ih(this,-1-d,null,c)));return kpd(this,BD(a,33),c);}return vld(this,a,b,c)};_.jh=function tpd(a,b,c){if(b==9){return kpd(this,null,c)}return wld(this,a,b,c)};_.lh=function upd(a){if(a==9){return !!mpd(this)}return xld(this,a)};_.sh=function vpd(a,b){switch(a){case 9:npd(this,BD(b,33));return;}yld(this,a,b)};_.zh=function wpd(){return Thd(),Phd};_.Bh=function xpd(a){switch(a){case 9:npd(this,null);return;}zld(this,a)};_.Ib=function ypd(){return opd(this)};var R2=mdb(rte,'ElkPortImpl',186);var J4=odb(Tte,'BasicEMap/Entry');bcb(1092,115,{105:1,42:1,92:1,90:1,133:1,56:1,108:1,49:1,97:1,114:1,115:1},Bpd);_.Fb=function Hpd(a){return this===a};_.cd=function Jpd(){return this.b};_.Hb=function Lpd(){return FCb(this)};_.Uh=function Npd(a){zpd(this,BD(a,146))};_._g=function Cpd(a,b,c){switch(a){case 0:return this.b;case 1:return this.c;}return fid(this,a,b,c)};_.lh=function Dpd(a){switch(a){case 0:return !!this.b;case 1:return this.c!=null;}return mid(this,a)};_.sh=function Epd(a,b){switch(a){case 0:zpd(this,BD(b,146));return;case 1:Apd(this,b);return;}yid(this,a,b)};_.zh=function Fpd(){return Thd(),Qhd};_.Bh=function Gpd(a){switch(a){case 0:zpd(this,null);return;case 1:Apd(this,null);return;}Cid(this,a)};_.Sh=function Ipd(){var a;if(this.a==-1){a=this.b;this.a=!a?0:tb(a)}return this.a};_.dd=function Kpd(){return this.c};_.Th=function Mpd(a){this.a=a};_.ed=function Opd(a){var b;b=this.c;Apd(this,a);return b};_.Ib=function Ppd(){var a;if((this.Db&64)!=0)return Eid(this);a=new Ufb;Qfb(Qfb(Qfb(a,this.b?this.b.tg():Xhe),gne),xfb(this.c));return a.a};_.a=-1;_.c=null;var S2=mdb(rte,'ElkPropertyToValueMapEntryImpl',1092);bcb(984,1,{},bqd);var U2=mdb(Wte,'JsonAdapter',984);bcb(210,60,Tie,cqd);var V2=mdb(Wte,'JsonImportException',210);bcb(857,1,{},ird);var J3=mdb(Wte,'JsonImporter',857);bcb(891,1,{},jrd);var W2=mdb(Wte,'JsonImporter/lambda$0$Type',891);bcb(892,1,{},krd);var X2=mdb(Wte,'JsonImporter/lambda$1$Type',892);bcb(900,1,{},lrd);var Y2=mdb(Wte,'JsonImporter/lambda$10$Type',900);bcb(902,1,{},mrd);var Z2=mdb(Wte,'JsonImporter/lambda$11$Type',902);bcb(903,1,{},nrd);var $2=mdb(Wte,'JsonImporter/lambda$12$Type',903);bcb(909,1,{},ord);var _2=mdb(Wte,'JsonImporter/lambda$13$Type',909);bcb(908,1,{},prd);var a3=mdb(Wte,'JsonImporter/lambda$14$Type',908);bcb(904,1,{},qrd);var b3=mdb(Wte,'JsonImporter/lambda$15$Type',904);bcb(905,1,{},rrd);var c3=mdb(Wte,'JsonImporter/lambda$16$Type',905);bcb(906,1,{},srd);var d3=mdb(Wte,'JsonImporter/lambda$17$Type',906);bcb(907,1,{},trd);var e3=mdb(Wte,'JsonImporter/lambda$18$Type',907);bcb(912,1,{},urd);var f3=mdb(Wte,'JsonImporter/lambda$19$Type',912);bcb(893,1,{},vrd);var g3=mdb(Wte,'JsonImporter/lambda$2$Type',893);bcb(910,1,{},wrd);var h3=mdb(Wte,'JsonImporter/lambda$20$Type',910);bcb(911,1,{},xrd);var i3=mdb(Wte,'JsonImporter/lambda$21$Type',911);bcb(915,1,{},yrd);var j3=mdb(Wte,'JsonImporter/lambda$22$Type',915);bcb(913,1,{},zrd);var k3=mdb(Wte,'JsonImporter/lambda$23$Type',913);bcb(914,1,{},Ard);var l3=mdb(Wte,'JsonImporter/lambda$24$Type',914);bcb(917,1,{},Brd);var m3=mdb(Wte,'JsonImporter/lambda$25$Type',917);bcb(916,1,{},Crd);var n3=mdb(Wte,'JsonImporter/lambda$26$Type',916);bcb(918,1,qie,Drd);_.td=function Erd(a){Bqd(this.b,this.a,GD(a))};var o3=mdb(Wte,'JsonImporter/lambda$27$Type',918);bcb(919,1,qie,Frd);_.td=function Grd(a){Cqd(this.b,this.a,GD(a))};var p3=mdb(Wte,'JsonImporter/lambda$28$Type',919);bcb(920,1,{},Hrd);var q3=mdb(Wte,'JsonImporter/lambda$29$Type',920);bcb(896,1,{},Ird);var r3=mdb(Wte,'JsonImporter/lambda$3$Type',896);bcb(921,1,{},Jrd);var s3=mdb(Wte,'JsonImporter/lambda$30$Type',921);bcb(922,1,{},Krd);var t3=mdb(Wte,'JsonImporter/lambda$31$Type',922);bcb(923,1,{},Lrd);var u3=mdb(Wte,'JsonImporter/lambda$32$Type',923);bcb(924,1,{},Mrd);var v3=mdb(Wte,'JsonImporter/lambda$33$Type',924);bcb(925,1,{},Nrd);var w3=mdb(Wte,'JsonImporter/lambda$34$Type',925);bcb(859,1,{},Prd);var x3=mdb(Wte,'JsonImporter/lambda$35$Type',859);bcb(929,1,{},Rrd);var y3=mdb(Wte,'JsonImporter/lambda$36$Type',929);bcb(926,1,qie,Srd);_.td=function Trd(a){Lqd(this.a,BD(a,469))};var z3=mdb(Wte,'JsonImporter/lambda$37$Type',926);bcb(927,1,qie,Urd);_.td=function Vrd(a){Mqd(this.a,this.b,BD(a,202))};var A3=mdb(Wte,'JsonImporter/lambda$38$Type',927);bcb(928,1,qie,Wrd);_.td=function Xrd(a){Nqd(this.a,this.b,BD(a,202))};var B3=mdb(Wte,'JsonImporter/lambda$39$Type',928);bcb(894,1,{},Yrd);var C3=mdb(Wte,'JsonImporter/lambda$4$Type',894);bcb(930,1,qie,Zrd);_.td=function $rd(a){Oqd(this.a,BD(a,8))};var D3=mdb(Wte,'JsonImporter/lambda$40$Type',930);bcb(895,1,{},_rd);var E3=mdb(Wte,'JsonImporter/lambda$5$Type',895);bcb(899,1,{},asd);var F3=mdb(Wte,'JsonImporter/lambda$6$Type',899);bcb(897,1,{},bsd);var G3=mdb(Wte,'JsonImporter/lambda$7$Type',897);bcb(898,1,{},csd);var H3=mdb(Wte,'JsonImporter/lambda$8$Type',898);bcb(901,1,{},dsd);var I3=mdb(Wte,'JsonImporter/lambda$9$Type',901);bcb(948,1,qie,msd);_.td=function nsd(a){Qpd(this.a,new yC(GD(a)))};var K3=mdb(Wte,'JsonMetaDataConverter/lambda$0$Type',948);bcb(949,1,qie,osd);_.td=function psd(a){isd(this.a,BD(a,237))};var L3=mdb(Wte,'JsonMetaDataConverter/lambda$1$Type',949);bcb(950,1,qie,qsd);_.td=function rsd(a){jsd(this.a,BD(a,149))};var M3=mdb(Wte,'JsonMetaDataConverter/lambda$2$Type',950);bcb(951,1,qie,ssd);_.td=function tsd(a){ksd(this.a,BD(a,175))};var N3=mdb(Wte,'JsonMetaDataConverter/lambda$3$Type',951);bcb(237,22,{3:1,35:1,22:1,237:1},Dsd);var usd,vsd,wsd,xsd,ysd,zsd,Asd,Bsd;var O3=ndb(Hle,'GraphFeature',237,CI,Fsd,Esd);var Gsd;bcb(13,1,{35:1,146:1},Lsd,Msd,Nsd,Osd);_.wd=function Psd(a){return Isd(this,BD(a,146))};_.Fb=function Qsd(a){return Jsd(this,a)};_.wg=function Rsd(){return Ksd(this)};_.tg=function Ssd(){return this.b};_.Hb=function Tsd(){return LCb(this.b)};_.Ib=function Usd(){return this.b};var T3=mdb(Hle,'Property',13);bcb(818,1,Dke,Wsd);_.ue=function Xsd(a,b){return Vsd(this,BD(a,94),BD(b,94))};_.Fb=function Ysd(a){return this===a};_.ve=function Zsd(){return new tpb(this)};var S3=mdb(Hle,'PropertyHolderComparator',818);bcb(695,1,aie,qtd);_.Nb=function rtd(a){Rrb(this,a)};_.Pb=function ttd(){return ptd(this)};_.Qb=function utd(){Srb()};_.Ob=function std(){return !!this.a};var U3=mdb(jue,'ElkGraphUtil/AncestorIterator',695);var T4=odb(Tte,'EList');bcb(67,52,{20:1,28:1,52:1,14:1,15:1,67:1,58:1});_.Vc=function Jtd(a,b){vtd(this,a,b)};_.Fc=function Ktd(a){return wtd(this,a)};_.Wc=function Ltd(a,b){return xtd(this,a,b)};_.Gc=function Mtd(a){return ytd(this,a)};_.Zh=function Ntd(){return new $yd(this)};_.$h=function Otd(){return new bzd(this)};_._h=function Ptd(a){return ztd(this,a)};_.ai=function Qtd(){return true};_.bi=function Rtd(a,b){};_.ci=function Std(){};_.di=function Ttd(a,b){Atd(this,a,b)};_.ei=function Utd(a,b,c){};_.fi=function Vtd(a,b){};_.gi=function Wtd(a,b,c){};_.Fb=function Xtd(a){return Btd(this,a)};_.Hb=function Ytd(){return Etd(this)};_.hi=function Ztd(){return false};_.Kc=function $td(){return new Fyd(this)};_.Yc=function _td(){return new Oyd(this)};_.Zc=function aud(a){var b;b=this.gc();if(a<0||a>b)throw vbb(new Cyd(a,b));return new Pyd(this,a)};_.ji=function bud(a,b){this.ii(a,this.Xc(b))};_.Mc=function cud(a){return Ftd(this,a)};_.li=function dud(a,b){return b};_._c=function eud(a,b){return Gtd(this,a,b)};_.Ib=function fud(){return Htd(this)};_.ni=function gud(){return true};_.oi=function hud(a,b){return Itd(this,b)};var p4=mdb(Tte,'AbstractEList',67);bcb(63,67,oue,yud,zud,Aud);_.Vh=function Bud(a,b){return iud(this,a,b)};_.Wh=function Cud(a){return jud(this,a)};_.Xh=function Dud(a,b){kud(this,a,b)};_.Yh=function Eud(a){lud(this,a)};_.pi=function Fud(a){return nud(this,a)};_.$b=function Gud(){oud(this)};_.Hc=function Hud(a){return pud(this,a)};_.Xb=function Iud(a){return qud(this,a)};_.qi=function Jud(a){var b,c,d;++this.j;c=this.g==null?0:this.g.length;if(a>c){d=this.g;b=c+(c/2|0)+4;b=0){this.$c(b);return true}else{return false}};_.mi=function lwd(a,b){return this.Ui(a,this.oi(a,b))};_.gc=function mwd(){return this.Vi()};_.Pc=function nwd(){return this.Wi()};_.Qc=function owd(a){return this.Xi(a)};_.Ib=function pwd(){return this.Yi()};var M4=mdb(Tte,'DelegatingEList',1995);bcb(1996,1995,eve);_.Vh=function xwd(a,b){return qwd(this,a,b)};_.Wh=function ywd(a){return this.Vh(this.Vi(),a)};_.Xh=function zwd(a,b){rwd(this,a,b)};_.Yh=function Awd(a){swd(this,a)};_.ai=function Bwd(){return !this.bj()};_.$b=function Cwd(){vwd(this)};_.Zi=function Dwd(a,b,c,d,e){return new Cxd(this,a,b,c,d,e)};_.$i=function Ewd(a){Uhd(this.Ai(),a)};_._i=function Fwd(){return null};_.aj=function Gwd(){return -1};_.Ai=function Hwd(){return null};_.bj=function Iwd(){return false};_.cj=function Jwd(a,b){return b};_.dj=function Kwd(a,b){return b};_.ej=function Lwd(){return false};_.fj=function Mwd(){return !this.Ri()};_.ii=function Nwd(a,b){var c,d;if(this.ej()){d=this.fj();c=Dvd(this,a,b);this.$i(this.Zi(7,meb(b),c,a,d));return c}else{return Dvd(this,a,b)}};_.$c=function Owd(a){var b,c,d,e;if(this.ej()){c=null;d=this.fj();b=this.Zi(4,e=Evd(this,a),null,a,d);if(this.bj()&&!!e){c=this.dj(e,c);if(!c){this.$i(b)}else{c.Ei(b);c.Fi()}}else{if(!c){this.$i(b)}else{c.Ei(b);c.Fi()}}return e}else{e=Evd(this,a);if(this.bj()&&!!e){c=this.dj(e,null);!!c&&c.Fi()}return e}};_.mi=function Pwd(a,b){return wwd(this,a,b)};var d4=mdb(hte,'DelegatingNotifyingListImpl',1996);bcb(143,1,fve);_.Ei=function pxd(a){return Qwd(this,a)};_.Fi=function qxd(){Rwd(this)};_.xi=function rxd(){return this.d};_._i=function sxd(){return null};_.gj=function txd(){return null};_.yi=function uxd(a){return -1};_.zi=function vxd(){return $wd(this)};_.Ai=function wxd(){return null};_.Bi=function xxd(){return hxd(this)};_.Ci=function yxd(){return this.o<0?this.o<-2?-2-this.o-1:-1:this.o};_.hj=function zxd(){return false};_.Di=function Axd(a){var b,c,d,e,f,g,h,i,j,k,l;switch(this.d){case 1:case 2:{e=a.xi();switch(e){case 1:case 2:{f=a.Ai();if(PD(f)===PD(this.Ai())&&this.yi(null)==a.yi(null)){this.g=a.zi();a.xi()==1&&(this.d=1);return true}}}}case 4:{e=a.xi();switch(e){case 4:{f=a.Ai();if(PD(f)===PD(this.Ai())&&this.yi(null)==a.yi(null)){j=jxd(this);i=this.o<0?this.o<-2?-2-this.o-1:-1:this.o;g=a.Ci();this.d=6;l=new zud(2);if(i<=g){wtd(l,this.n);wtd(l,a.Bi());this.g=OC(GC(WD,1),oje,25,15,[this.o=i,g+1])}else{wtd(l,a.Bi());wtd(l,this.n);this.g=OC(GC(WD,1),oje,25,15,[this.o=g,i])}this.n=l;j||(this.o=-2-this.o-1);return true}break}}break}case 6:{e=a.xi();switch(e){case 4:{f=a.Ai();if(PD(f)===PD(this.Ai())&&this.yi(null)==a.yi(null)){j=jxd(this);g=a.Ci();k=BD(this.g,48);d=KC(WD,oje,25,k.length+1,15,1);b=0;while(b>>0,b.toString(16)));d.a+=' (eventType: ';switch(this.d){case 1:{d.a+='SET';break}case 2:{d.a+='UNSET';break}case 3:{d.a+='ADD';break}case 5:{d.a+='ADD_MANY';break}case 4:{d.a+='REMOVE';break}case 6:{d.a+='REMOVE_MANY';break}case 7:{d.a+='MOVE';break}case 8:{d.a+='REMOVING_ADAPTER';break}case 9:{d.a+='RESOLVE';break}default:{Cfb(d,this.d);break}}ixd(this)&&(d.a+=', touch: true',d);d.a+=', position: ';Cfb(d,this.o<0?this.o<-2?-2-this.o-1:-1:this.o);d.a+=', notifier: ';Dfb(d,this.Ai());d.a+=', feature: ';Dfb(d,this._i());d.a+=', oldValue: ';Dfb(d,hxd(this));d.a+=', newValue: ';if(this.d==6&&JD(this.g,48)){c=BD(this.g,48);d.a+='[';for(a=0;a10){if(!this.b||this.c.j!=this.a){this.b=new Vqb(this);this.a=this.j}return Rqb(this.b,a)}else{return pud(this,a)}};_.ni=function Byd(){return true};_.a=0;var j4=mdb(Tte,'AbstractEList/1',953);bcb(295,73,Mje,Cyd);var k4=mdb(Tte,'AbstractEList/BasicIndexOutOfBoundsException',295);bcb(40,1,aie,Fyd);_.Nb=function Iyd(a){Rrb(this,a)};_.mj=function Gyd(){if(this.i.j!=this.f){throw vbb(new Apb)}};_.nj=function Hyd(){return Dyd(this)};_.Ob=function Jyd(){return this.e!=this.i.gc()};_.Pb=function Kyd(){return this.nj()};_.Qb=function Lyd(){Eyd(this)};_.e=0;_.f=0;_.g=-1;var l4=mdb(Tte,'AbstractEList/EIterator',40);bcb(278,40,jie,Oyd,Pyd);_.Qb=function Xyd(){Eyd(this)};_.Rb=function Qyd(a){Myd(this,a)};_.oj=function Ryd(){var b;try{b=this.d.Xb(--this.e);this.mj();this.g=this.e;return b}catch(a){a=ubb(a);if(JD(a,73)){this.mj();throw vbb(new utb)}else throw vbb(a)}};_.pj=function Syd(a){Nyd(this,a)};_.Sb=function Tyd(){return this.e!=0};_.Tb=function Uyd(){return this.e};_.Ub=function Vyd(){return this.oj()};_.Vb=function Wyd(){return this.e-1};_.Wb=function Yyd(a){this.pj(a)};var m4=mdb(Tte,'AbstractEList/EListIterator',278);bcb(341,40,aie,$yd);_.nj=function _yd(){return Zyd(this)};_.Qb=function azd(){throw vbb(new bgb)};var n4=mdb(Tte,'AbstractEList/NonResolvingEIterator',341);bcb(385,278,jie,bzd,czd);_.Rb=function dzd(a){throw vbb(new bgb)};_.nj=function ezd(){var b;try{b=this.c.ki(this.e);this.mj();this.g=this.e++;return b}catch(a){a=ubb(a);if(JD(a,73)){this.mj();throw vbb(new utb)}else throw vbb(a)}};_.oj=function fzd(){var b;try{b=this.c.ki(--this.e);this.mj();this.g=this.e;return b}catch(a){a=ubb(a);if(JD(a,73)){this.mj();throw vbb(new utb)}else throw vbb(a)}};_.Qb=function gzd(){throw vbb(new bgb)};_.Wb=function hzd(a){throw vbb(new bgb)};var o4=mdb(Tte,'AbstractEList/NonResolvingEListIterator',385);bcb(1982,67,ive);_.Vh=function pzd(a,b){var c,d,e,f,g,h,i,j,k,l,m;e=b.gc();if(e!=0){j=BD(Ajd(this.a,4),126);k=j==null?0:j.length;m=k+e;d=nzd(this,m);l=k-a;l>0&&$fb(j,a,d,a+e,l);i=b.Kc();for(g=0;gc)throw vbb(new Cyd(a,c));return new Yzd(this,a)};_.$b=function wzd(){var a,b;++this.j;a=BD(Ajd(this.a,4),126);b=a==null?0:a.length;b0d(this,null);Atd(this,b,a)};_.Hc=function xzd(a){var b,c,d,e,f;b=BD(Ajd(this.a,4),126);if(b!=null){if(a!=null){for(d=b,e=0,f=d.length;e=c)throw vbb(new Cyd(a,c));return b[a]};_.Xc=function zzd(a){var b,c,d;b=BD(Ajd(this.a,4),126);if(b!=null){if(a!=null){for(c=0,d=b.length;cc)throw vbb(new Cyd(a,c));return new Qzd(this,a)};_.ii=function Ezd(a,b){var c,d,e;c=mzd(this);e=c==null?0:c.length;if(a>=e)throw vbb(new qcb(lue+a+mue+e));if(b>=e)throw vbb(new qcb(nue+b+mue+e));d=c[b];if(a!=b){a0&&$fb(a,0,b,0,c);return b};_.Qc=function Kzd(a){var b,c,d;b=BD(Ajd(this.a,4),126);d=b==null?0:b.length;if(d>0){if(a.lengthd&&NC(a,d,null);return a};var jzd;var v4=mdb(Tte,'ArrayDelegatingEList',1982);bcb(1038,40,aie,Lzd);_.mj=function Mzd(){if(this.b.j!=this.f||PD(BD(Ajd(this.b.a,4),126))!==PD(this.a)){throw vbb(new Apb)}};_.Qb=function Nzd(){Eyd(this);this.a=BD(Ajd(this.b.a,4),126)};var r4=mdb(Tte,'ArrayDelegatingEList/EIterator',1038);bcb(706,278,jie,Pzd,Qzd);_.mj=function Rzd(){if(this.b.j!=this.f||PD(BD(Ajd(this.b.a,4),126))!==PD(this.a)){throw vbb(new Apb)}};_.pj=function Szd(a){Nyd(this,a);this.a=BD(Ajd(this.b.a,4),126)};_.Qb=function Tzd(){Eyd(this);this.a=BD(Ajd(this.b.a,4),126)};var s4=mdb(Tte,'ArrayDelegatingEList/EListIterator',706);bcb(1039,341,aie,Uzd);_.mj=function Vzd(){if(this.b.j!=this.f||PD(BD(Ajd(this.b.a,4),126))!==PD(this.a)){throw vbb(new Apb)}};var t4=mdb(Tte,'ArrayDelegatingEList/NonResolvingEIterator',1039);bcb(707,385,jie,Xzd,Yzd);_.mj=function Zzd(){if(this.b.j!=this.f||PD(BD(Ajd(this.b.a,4),126))!==PD(this.a)){throw vbb(new Apb)}};var u4=mdb(Tte,'ArrayDelegatingEList/NonResolvingEListIterator',707);bcb(606,295,Mje,$zd);var w4=mdb(Tte,'BasicEList/BasicIndexOutOfBoundsException',606);bcb(696,63,oue,_zd);_.Vc=function aAd(a,b){throw vbb(new bgb)};_.Fc=function bAd(a){throw vbb(new bgb)};_.Wc=function cAd(a,b){throw vbb(new bgb)};_.Gc=function dAd(a){throw vbb(new bgb)};_.$b=function eAd(){throw vbb(new bgb)};_.qi=function fAd(a){throw vbb(new bgb)};_.Kc=function gAd(){return this.Zh()};_.Yc=function hAd(){return this.$h()};_.Zc=function iAd(a){return this._h(a)};_.ii=function jAd(a,b){throw vbb(new bgb)};_.ji=function kAd(a,b){throw vbb(new bgb)};_.$c=function lAd(a){throw vbb(new bgb)};_.Mc=function mAd(a){throw vbb(new bgb)};_._c=function nAd(a,b){throw vbb(new bgb)};var x4=mdb(Tte,'BasicEList/UnmodifiableEList',696);bcb(705,1,{3:1,20:1,14:1,15:1,58:1,589:1});_.Vc=function OAd(a,b){oAd(this,a,BD(b,42))};_.Fc=function PAd(a){return pAd(this,BD(a,42))};_.Jc=function XAd(a){reb(this,a)};_.Xb=function YAd(a){return BD(qud(this.c,a),133)};_.ii=function fBd(a,b){return BD(this.c.ii(a,b),42)};_.ji=function gBd(a,b){GAd(this,a,BD(b,42))};_.Lc=function jBd(){return new YAb(null,new Kub(this,16))};_.$c=function kBd(a){return BD(this.c.$c(a),42)};_._c=function mBd(a,b){return MAd(this,a,BD(b,42))};_.ad=function oBd(a){ktb(this,a)};_.Nc=function pBd(){return new Kub(this,16)};_.Oc=function qBd(){return new YAb(null,new Kub(this,16))};_.Wc=function QAd(a,b){return this.c.Wc(a,b)};_.Gc=function RAd(a){return this.c.Gc(a)};_.$b=function SAd(){this.c.$b()};_.Hc=function TAd(a){return this.c.Hc(a)};_.Ic=function UAd(a){return Be(this.c,a)};_.qj=function VAd(){var a,b,c;if(this.d==null){this.d=KC(y4,jve,63,2*this.f+1,0,1);c=this.e;this.f=0;for(b=this.c.Kc();b.e!=b.i.gc();){a=BD(b.nj(),133);uAd(this,a)}this.e=c}};_.Fb=function WAd(a){return zAd(this,a)};_.Hb=function ZAd(){return Etd(this.c)};_.Xc=function $Ad(a){return this.c.Xc(a)};_.rj=function _Ad(){this.c=new yBd(this)};_.dc=function aBd(){return this.f==0};_.Kc=function bBd(){return this.c.Kc()};_.Yc=function cBd(){return this.c.Yc()};_.Zc=function dBd(a){return this.c.Zc(a)};_.sj=function eBd(){return FAd(this)};_.tj=function hBd(a,b,c){return new zCd(a,b,c)};_.uj=function iBd(){return new EBd};_.Mc=function lBd(a){return JAd(this,a)};_.gc=function nBd(){return this.f};_.bd=function rBd(a,b){return new Jib(this.c,a,b)};_.Pc=function sBd(){return this.c.Pc()};_.Qc=function tBd(a){return this.c.Qc(a)};_.Ib=function uBd(){return Htd(this.c)};_.e=0;_.f=0;var L4=mdb(Tte,'BasicEMap',705);bcb(1033,63,oue,yBd);_.bi=function zBd(a,b){vBd(this,BD(b,133))};_.ei=function BBd(a,b,c){var d;++(d=this,BD(b,133),d).a.e};_.fi=function CBd(a,b){wBd(this,BD(b,133))};_.gi=function DBd(a,b,c){xBd(this,BD(b,133),BD(c,133))};_.di=function ABd(a,b){tAd(this.a)};var z4=mdb(Tte,'BasicEMap/1',1033);bcb(1034,63,oue,EBd);_.ri=function FBd(a){return KC(I4,kve,612,a,0,1)};var A4=mdb(Tte,'BasicEMap/2',1034);bcb(1035,eie,fie,GBd);_.$b=function HBd(){this.a.c.$b()};_.Hc=function IBd(a){return qAd(this.a,a)};_.Kc=function JBd(){return this.a.f==0?(LCd(),KCd.a):new dCd(this.a)};_.Mc=function KBd(a){var b;b=this.a.f;LAd(this.a,a);return this.a.f!=b};_.gc=function LBd(){return this.a.f};var B4=mdb(Tte,'BasicEMap/3',1035);bcb(1036,28,die,MBd);_.$b=function NBd(){this.a.c.$b()};_.Hc=function OBd(a){return rAd(this.a,a)};_.Kc=function PBd(){return this.a.f==0?(LCd(),KCd.a):new fCd(this.a)};_.gc=function QBd(){return this.a.f};var C4=mdb(Tte,'BasicEMap/4',1036);bcb(1037,eie,fie,SBd);_.$b=function TBd(){this.a.c.$b()};_.Hc=function UBd(a){var b,c,d,e,f,g,h,i,j;if(this.a.f>0&&JD(a,42)){this.a.qj();i=BD(a,42);h=i.cd();e=h==null?0:tb(h);f=DAd(this.a,e);b=this.a.d[f];if(b){c=BD(b.g,367);j=b.i;for(g=0;g'+this.c};_.a=0;var I4=mdb(Tte,'BasicEMap/EntryImpl',612);bcb(536,1,{},JCd);var K4=mdb(Tte,'BasicEMap/View',536);var KCd;bcb(768,1,{});_.Fb=function ZCd(a){return At((mmb(),jmb),a)};_.Hb=function $Cd(){return qmb((mmb(),jmb))};_.Ib=function _Cd(){return Fe((mmb(),jmb))};var Q4=mdb(Tte,'ECollections/BasicEmptyUnmodifiableEList',768);bcb(1312,1,jie,aDd);_.Nb=function cDd(a){Rrb(this,a)};_.Rb=function bDd(a){throw vbb(new bgb)};_.Ob=function dDd(){return false};_.Sb=function eDd(){return false};_.Pb=function fDd(){throw vbb(new utb)};_.Tb=function gDd(){return 0};_.Ub=function hDd(){throw vbb(new utb)};_.Vb=function iDd(){return -1};_.Qb=function jDd(){throw vbb(new bgb)};_.Wb=function kDd(a){throw vbb(new bgb)};var P4=mdb(Tte,'ECollections/BasicEmptyUnmodifiableEList/1',1312);bcb(1310,768,{20:1,14:1,15:1,58:1},lDd);_.Vc=function mDd(a,b){OCd()};_.Fc=function nDd(a){return PCd()};_.Wc=function oDd(a,b){return QCd()};_.Gc=function pDd(a){return RCd()};_.$b=function qDd(){SCd()};_.Hc=function rDd(a){return false};_.Ic=function sDd(a){return false};_.Jc=function tDd(a){reb(this,a)};_.Xb=function uDd(a){return wmb((mmb(),jmb,a)),null};_.Xc=function vDd(a){return -1};_.dc=function wDd(){return true};_.Kc=function xDd(){return this.a};_.Yc=function yDd(){return this.a};_.Zc=function zDd(a){return this.a};_.ii=function ADd(a,b){return TCd()};_.ji=function BDd(a,b){UCd()};_.Lc=function CDd(){return new YAb(null,new Kub(this,16))};_.$c=function DDd(a){return VCd()};_.Mc=function EDd(a){return WCd()};_._c=function FDd(a,b){return XCd()};_.gc=function GDd(){return 0};_.ad=function HDd(a){ktb(this,a)};_.Nc=function IDd(){return new Kub(this,16)};_.Oc=function JDd(){return new YAb(null,new Kub(this,16))};_.bd=function KDd(a,b){return mmb(),new Jib(jmb,a,b)};_.Pc=function LDd(){return De((mmb(),jmb))};_.Qc=function MDd(a){return mmb(),Ee(jmb,a)};var R4=mdb(Tte,'ECollections/EmptyUnmodifiableEList',1310);bcb(1311,768,{20:1,14:1,15:1,58:1,589:1},NDd);_.Vc=function ODd(a,b){OCd()};_.Fc=function PDd(a){return PCd()};_.Wc=function QDd(a,b){return QCd()};_.Gc=function RDd(a){return RCd()};_.$b=function SDd(){SCd()};_.Hc=function TDd(a){return false};_.Ic=function UDd(a){return false};_.Jc=function VDd(a){reb(this,a)};_.Xb=function WDd(a){return wmb((mmb(),jmb,a)),null};_.Xc=function XDd(a){return -1};_.dc=function YDd(){return true};_.Kc=function ZDd(){return this.a};_.Yc=function $Dd(){return this.a};_.Zc=function _Dd(a){return this.a};_.ii=function bEd(a,b){return TCd()};_.ji=function cEd(a,b){UCd()};_.Lc=function dEd(){return new YAb(null,new Kub(this,16))};_.$c=function eEd(a){return VCd()};_.Mc=function fEd(a){return WCd()};_._c=function gEd(a,b){return XCd()};_.gc=function hEd(){return 0};_.ad=function iEd(a){ktb(this,a)};_.Nc=function jEd(){return new Kub(this,16)};_.Oc=function kEd(){return new YAb(null,new Kub(this,16))};_.bd=function lEd(a,b){return mmb(),new Jib(jmb,a,b)};_.Pc=function mEd(){return De((mmb(),jmb))};_.Qc=function nEd(a){return mmb(),Ee(jmb,a)};_.sj=function aEd(){return mmb(),mmb(),kmb};var S4=mdb(Tte,'ECollections/EmptyUnmodifiableEMap',1311);var U4=odb(Tte,'Enumerator');var oEd;bcb(281,1,{281:1},NEd);_.Fb=function REd(a){var b;if(this===a)return true;if(!JD(a,281))return false;b=BD(a,281);return this.f==b.f&&TEd(this.i,b.i)&&SEd(this.a,(this.f&256)!=0?(b.f&256)!=0?b.a:null:(b.f&256)!=0?null:b.a)&&SEd(this.d,b.d)&&SEd(this.g,b.g)&&SEd(this.e,b.e)&&KEd(this,b)};_.Hb=function WEd(){return this.f};_.Ib=function cFd(){return LEd(this)};_.f=0;var sEd=0,tEd=0,uEd=0,vEd=0,wEd=0,xEd=0,yEd=0,zEd=0,AEd=0,BEd,CEd=0,DEd=0,EEd=0,FEd=0,GEd,HEd;var Z4=mdb(Tte,'URI',281);bcb(1091,43,fke,mFd);_.zc=function nFd(a,b){return BD(Shb(this,GD(a),BD(b,281)),281)};var Y4=mdb(Tte,'URI/URICache',1091);bcb(497,63,oue,oFd,pFd);_.hi=function qFd(){return true};var $4=mdb(Tte,'UniqueEList',497);bcb(581,60,Tie,rFd);var _4=mdb(Tte,'WrappedException',581);var a5=odb(Vse,nve);var v5=odb(Vse,ove);var t5=odb(Vse,pve);var b5=odb(Vse,qve);var d5=odb(Vse,rve);var c5=odb(Vse,'EClass');var f5=odb(Vse,'EDataType');var sFd;bcb(1183,43,fke,vFd);_.xc=function wFd(a){return ND(a)?Phb(this,a):Wd(irb(this.f,a))};var e5=mdb(Vse,'EDataType/Internal/ConversionDelegate/Factory/Registry/Impl',1183);var h5=odb(Vse,'EEnum');var g5=odb(Vse,sve);var j5=odb(Vse,tve);var n5=odb(Vse,uve);var xFd;var p5=odb(Vse,vve);var q5=odb(Vse,wve);bcb(1029,1,{},BFd);_.Ib=function CFd(){return 'NIL'};var r5=mdb(Vse,'EStructuralFeature/Internal/DynamicValueHolder/1',1029);var DFd;bcb(1028,43,fke,GFd);_.xc=function HFd(a){return ND(a)?Phb(this,a):Wd(irb(this.f,a))};var s5=mdb(Vse,'EStructuralFeature/Internal/SettingDelegate/Factory/Registry/Impl',1028);var u5=odb(Vse,xve);var w5=odb(Vse,'EValidator/PatternMatcher');var IFd;var KFd;var MFd;var OFd,PFd,QFd,RFd,SFd,TFd,UFd,VFd,WFd,XFd,YFd,ZFd,$Fd,_Fd,aGd,bGd,cGd,dGd,eGd,fGd,gGd,hGd,iGd;var E9=odb(yve,'FeatureMap/Entry');bcb(535,1,{72:1},kGd);_.ak=function lGd(){return this.a};_.dd=function mGd(){return this.b};var x5=mdb(qte,'BasicEObjectImpl/1',535);bcb(1027,1,zve,nGd);_.Wj=function oGd(a){return hid(this.a,this.b,a)};_.fj=function pGd(){return nid(this.a,this.b)};_.Wb=function qGd(a){zid(this.a,this.b,a)};_.Xj=function rGd(){Did(this.a,this.b)};var y5=mdb(qte,'BasicEObjectImpl/4',1027);bcb(1983,1,{108:1});_.bk=function uGd(a){this.e=a==0?sGd:KC(SI,Uhe,1,a,5,1)};_.Ch=function vGd(a){return this.e[a]};_.Dh=function wGd(a,b){this.e[a]=b};_.Eh=function xGd(a){this.e[a]=null};_.ck=function yGd(){return this.c};_.dk=function zGd(){throw vbb(new bgb)};_.ek=function AGd(){throw vbb(new bgb)};_.fk=function BGd(){return this.d};_.gk=function CGd(){return this.e!=null};_.hk=function DGd(a){this.c=a};_.ik=function EGd(a){throw vbb(new bgb)};_.jk=function FGd(a){throw vbb(new bgb)};_.kk=function GGd(a){this.d=a};var sGd;var z5=mdb(qte,'BasicEObjectImpl/EPropertiesHolderBaseImpl',1983);bcb(185,1983,{108:1},HGd);_.dk=function IGd(){return this.a};_.ek=function JGd(){return this.b};_.ik=function KGd(a){this.a=a};_.jk=function LGd(a){this.b=a};var A5=mdb(qte,'BasicEObjectImpl/EPropertiesHolderImpl',185);bcb(506,97,pte,MGd);_.Kg=function NGd(){return this.f};_.Pg=function OGd(){return this.k};_.Rg=function PGd(a,b){this.g=a;this.i=b};_.Tg=function QGd(){return (this.j&2)==0?this.zh():this.ph().ck()};_.Vg=function RGd(){return this.i};_.Mg=function SGd(){return (this.j&1)!=0};_.eh=function TGd(){return this.g};_.kh=function UGd(){return (this.j&4)!=0};_.ph=function VGd(){return !this.k&&(this.k=new HGd),this.k};_.th=function WGd(a){this.ph().hk(a);a?(this.j|=2):(this.j&=-3)};_.vh=function XGd(a){this.ph().jk(a);a?(this.j|=4):(this.j&=-5)};_.zh=function YGd(){return (NFd(),MFd).S};_.i=0;_.j=1;var l6=mdb(qte,'EObjectImpl',506);bcb(780,506,{105:1,92:1,90:1,56:1,108:1,49:1,97:1},_Gd);_.Ch=function aHd(a){return this.e[a]};_.Dh=function bHd(a,b){this.e[a]=b};_.Eh=function cHd(a){this.e[a]=null};_.Tg=function dHd(){return this.d};_.Yg=function eHd(a){return bLd(this.d,a)};_.$g=function fHd(){return this.d};_.dh=function gHd(){return this.e!=null};_.ph=function hHd(){!this.k&&(this.k=new vHd);return this.k};_.th=function iHd(a){this.d=a};_.yh=function jHd(){var a;if(this.e==null){a=aLd(this.d);this.e=a==0?ZGd:KC(SI,Uhe,1,a,5,1)}return this};_.Ah=function kHd(){return 0};var ZGd;var E5=mdb(qte,'DynamicEObjectImpl',780);bcb(1376,780,{105:1,42:1,92:1,90:1,133:1,56:1,108:1,49:1,97:1},lHd);_.Fb=function nHd(a){return this===a};_.Hb=function rHd(){return FCb(this)};_.th=function mHd(a){this.d=a;this.b=YKd(a,'key');this.c=YKd(a,Bte)};_.Sh=function oHd(){var a;if(this.a==-1){a=iid(this,this.b);this.a=a==null?0:tb(a)}return this.a};_.cd=function pHd(){return iid(this,this.b)};_.dd=function qHd(){return iid(this,this.c)};_.Th=function sHd(a){this.a=a};_.Uh=function tHd(a){zid(this,this.b,a)};_.ed=function uHd(a){var b;b=iid(this,this.c);zid(this,this.c,a);return b};_.a=0;var C5=mdb(qte,'DynamicEObjectImpl/BasicEMapEntry',1376);bcb(1377,1,{108:1},vHd);_.bk=function wHd(a){throw vbb(new bgb)};_.Ch=function xHd(a){throw vbb(new bgb)};_.Dh=function yHd(a,b){throw vbb(new bgb)};_.Eh=function zHd(a){throw vbb(new bgb)};_.ck=function AHd(){throw vbb(new bgb)};_.dk=function BHd(){return this.a};_.ek=function CHd(){return this.b};_.fk=function DHd(){return this.c};_.gk=function EHd(){throw vbb(new bgb)};_.hk=function FHd(a){throw vbb(new bgb)};_.ik=function GHd(a){this.a=a};_.jk=function HHd(a){this.b=a};_.kk=function IHd(a){this.c=a};var D5=mdb(qte,'DynamicEObjectImpl/DynamicEPropertiesHolderImpl',1377);bcb(510,150,{105:1,92:1,90:1,590:1,147:1,56:1,108:1,49:1,97:1,510:1,150:1,114:1,115:1},RHd);_.Qg=function SHd(a){return KHd(this,a)};_._g=function THd(a,b,c){var d;switch(a){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab;case 1:return this.d;case 2:return c?(!this.b&&(this.b=new sId((jGd(),fGd),x6,this)),this.b):(!this.b&&(this.b=new sId((jGd(),fGd),x6,this)),FAd(this.b));case 3:return MHd(this);case 4:return !this.a&&(this.a=new xMd(m5,this,4)),this.a;case 5:return !this.c&&(this.c=new _4d(m5,this,5)),this.c;}return bid(this,a-aLd((jGd(),OFd)),XKd((d=BD(Ajd(this,16),26),!d?OFd:d),a),b,c)};_.hh=function UHd(a,b,c){var d,e,f;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Sxd(this.Ab,a,c);case 3:!!this.Cb&&(c=(e=this.Db>>16,e>=0?KHd(this,c):this.Cb.ih(this,-1-e,null,c)));return JHd(this,BD(a,147),c);}return f=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),OFd):d),b),66),f.Nj().Qj(this,yjd(this),b-aLd((jGd(),OFd)),a,c)};_.jh=function VHd(a,b,c){var d,e;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Txd(this.Ab,a,c);case 2:return !this.b&&(this.b=new sId((jGd(),fGd),x6,this)),bId(this.b,a,c);case 3:return JHd(this,null,c);case 4:return !this.a&&(this.a=new xMd(m5,this,4)),Txd(this.a,a,c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),OFd):d),b),66),e.Nj().Rj(this,yjd(this),b-aLd((jGd(),OFd)),a,c)};_.lh=function WHd(a){var b;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.d!=null;case 2:return !!this.b&&this.b.f!=0;case 3:return !!MHd(this);case 4:return !!this.a&&this.a.i!=0;case 5:return !!this.c&&this.c.i!=0;}return cid(this,a-aLd((jGd(),OFd)),XKd((b=BD(Ajd(this,16),26),!b?OFd:b),a))};_.sh=function XHd(a,b){var c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:OHd(this,GD(b));return;case 2:!this.b&&(this.b=new sId((jGd(),fGd),x6,this));cId(this.b,b);return;case 3:NHd(this,BD(b,147));return;case 4:!this.a&&(this.a=new xMd(m5,this,4));Uxd(this.a);!this.a&&(this.a=new xMd(m5,this,4));ytd(this.a,BD(b,14));return;case 5:!this.c&&(this.c=new _4d(m5,this,5));Uxd(this.c);!this.c&&(this.c=new _4d(m5,this,5));ytd(this.c,BD(b,14));return;}did(this,a-aLd((jGd(),OFd)),XKd((c=BD(Ajd(this,16),26),!c?OFd:c),a),b)};_.zh=function YHd(){return jGd(),OFd};_.Bh=function ZHd(a){var b;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:PHd(this,null);return;case 2:!this.b&&(this.b=new sId((jGd(),fGd),x6,this));this.b.c.$b();return;case 3:NHd(this,null);return;case 4:!this.a&&(this.a=new xMd(m5,this,4));Uxd(this.a);return;case 5:!this.c&&(this.c=new _4d(m5,this,5));Uxd(this.c);return;}eid(this,a-aLd((jGd(),OFd)),XKd((b=BD(Ajd(this,16),26),!b?OFd:b),a))};_.Ib=function $Hd(){return QHd(this)};_.d=null;var G5=mdb(qte,'EAnnotationImpl',510);bcb(151,705,Ave,dId);_.Xh=function eId(a,b){_Hd(this,a,BD(b,42))};_.lk=function fId(a,b){return aId(this,BD(a,42),b)};_.pi=function gId(a){return BD(BD(this.c,69).pi(a),133)};_.Zh=function hId(){return BD(this.c,69).Zh()};_.$h=function iId(){return BD(this.c,69).$h()};_._h=function jId(a){return BD(this.c,69)._h(a)};_.mk=function kId(a,b){return bId(this,a,b)};_.Wj=function lId(a){return BD(this.c,76).Wj(a)};_.rj=function mId(){};_.fj=function nId(){return BD(this.c,76).fj()};_.tj=function oId(a,b,c){var d;d=BD(bKd(this.b).Nh().Jh(this.b),133);d.Th(a);d.Uh(b);d.ed(c);return d};_.uj=function pId(){return new W5d(this)};_.Wb=function qId(a){cId(this,a)};_.Xj=function rId(){BD(this.c,76).Xj()};var y9=mdb(yve,'EcoreEMap',151);bcb(158,151,Ave,sId);_.qj=function tId(){var a,b,c,d,e,f;if(this.d==null){f=KC(y4,jve,63,2*this.f+1,0,1);for(c=this.c.Kc();c.e!=c.i.gc();){b=BD(c.nj(),133);d=b.Sh();e=(d&Ohe)%f.length;a=f[e];!a&&(a=f[e]=new W5d(this));a.Fc(b)}this.d=f}};var F5=mdb(qte,'EAnnotationImpl/1',158);bcb(284,438,{105:1,92:1,90:1,147:1,191:1,56:1,108:1,472:1,49:1,97:1,150:1,284:1,114:1,115:1});_._g=function GId(a,b,c){var d,e;switch(a){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab;case 1:return this.zb;case 2:return Bcb(),(this.Bb&256)!=0?true:false;case 3:return Bcb(),(this.Bb&512)!=0?true:false;case 4:return meb(this.s);case 5:return meb(this.t);case 6:return Bcb(),this.$j()?true:false;case 7:return Bcb(),e=this.s,e>=1?true:false;case 8:if(b)return wId(this);return this.r;case 9:return this.q;}return bid(this,a-aLd(this.zh()),XKd((d=BD(Ajd(this,16),26),!d?this.zh():d),a),b,c)};_.jh=function HId(a,b,c){var d,e;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Txd(this.Ab,a,c);case 9:return vId(this,c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?this.zh():d),b),66),e.Nj().Rj(this,yjd(this),b-aLd(this.zh()),a,c)};_.lh=function IId(a){var b,c;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return (this.Bb&256)==0;case 3:return (this.Bb&512)==0;case 4:return this.s!=0;case 5:return this.t!=1;case 6:return this.$j();case 7:return c=this.s,c>=1;case 8:return !!this.r&&!this.q.e&&LQd(this.q).i==0;case 9:return !!this.q&&!(!!this.r&&!this.q.e&&LQd(this.q).i==0);}return cid(this,a-aLd(this.zh()),XKd((b=BD(Ajd(this,16),26),!b?this.zh():b),a))};_.sh=function JId(a,b){var c,d;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:this.Lh(GD(b));return;case 2:BId(this,Ccb(DD(b)));return;case 3:CId(this,Ccb(DD(b)));return;case 4:AId(this,BD(b,19).a);return;case 5:this.ok(BD(b,19).a);return;case 8:yId(this,BD(b,138));return;case 9:d=xId(this,BD(b,87),null);!!d&&d.Fi();return;}did(this,a-aLd(this.zh()),XKd((c=BD(Ajd(this,16),26),!c?this.zh():c),a),b)};_.zh=function KId(){return jGd(),hGd};_.Bh=function LId(a){var b,c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:this.Lh(null);return;case 2:BId(this,true);return;case 3:CId(this,true);return;case 4:AId(this,0);return;case 5:this.ok(1);return;case 8:yId(this,null);return;case 9:c=xId(this,null,null);!!c&&c.Fi();return;}eid(this,a-aLd(this.zh()),XKd((b=BD(Ajd(this,16),26),!b?this.zh():b),a))};_.Gh=function MId(){wId(this);this.Bb|=1};_.Yj=function NId(){return wId(this)};_.Zj=function OId(){return this.t};_.$j=function PId(){var a;return a=this.t,a>1||a==-1};_.hi=function QId(){return (this.Bb&512)!=0};_.nk=function RId(a,b){return zId(this,a,b)};_.ok=function SId(a){DId(this,a)};_.Ib=function TId(){return EId(this)};_.s=0;_.t=1;var v7=mdb(qte,'ETypedElementImpl',284);bcb(449,284,{105:1,92:1,90:1,147:1,191:1,56:1,170:1,66:1,108:1,472:1,49:1,97:1,150:1,449:1,284:1,114:1,115:1,677:1});_.Qg=function iJd(a){return UId(this,a)};_._g=function jJd(a,b,c){var d,e;switch(a){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab;case 1:return this.zb;case 2:return Bcb(),(this.Bb&256)!=0?true:false;case 3:return Bcb(),(this.Bb&512)!=0?true:false;case 4:return meb(this.s);case 5:return meb(this.t);case 6:return Bcb(),this.$j()?true:false;case 7:return Bcb(),e=this.s,e>=1?true:false;case 8:if(b)return wId(this);return this.r;case 9:return this.q;case 10:return Bcb(),(this.Bb&zte)!=0?true:false;case 11:return Bcb(),(this.Bb&Dve)!=0?true:false;case 12:return Bcb(),(this.Bb&Rje)!=0?true:false;case 13:return this.j;case 14:return VId(this);case 15:return Bcb(),(this.Bb&Cve)!=0?true:false;case 16:return Bcb(),(this.Bb&oie)!=0?true:false;case 17:return WId(this);}return bid(this,a-aLd(this.zh()),XKd((d=BD(Ajd(this,16),26),!d?this.zh():d),a),b,c)};_.hh=function kJd(a,b,c){var d,e,f;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Sxd(this.Ab,a,c);case 17:!!this.Cb&&(c=(e=this.Db>>16,e>=0?UId(this,c):this.Cb.ih(this,-1-e,null,c)));return _hd(this,a,17,c);}return f=BD(XKd((d=BD(Ajd(this,16),26),!d?this.zh():d),b),66),f.Nj().Qj(this,yjd(this),b-aLd(this.zh()),a,c)};_.jh=function lJd(a,b,c){var d,e;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Txd(this.Ab,a,c);case 9:return vId(this,c);case 17:return _hd(this,null,17,c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?this.zh():d),b),66),e.Nj().Rj(this,yjd(this),b-aLd(this.zh()),a,c)};_.lh=function mJd(a){var b,c;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return (this.Bb&256)==0;case 3:return (this.Bb&512)==0;case 4:return this.s!=0;case 5:return this.t!=1;case 6:return this.$j();case 7:return c=this.s,c>=1;case 8:return !!this.r&&!this.q.e&&LQd(this.q).i==0;case 9:return !!this.q&&!(!!this.r&&!this.q.e&&LQd(this.q).i==0);case 10:return (this.Bb&zte)==0;case 11:return (this.Bb&Dve)!=0;case 12:return (this.Bb&Rje)!=0;case 13:return this.j!=null;case 14:return VId(this)!=null;case 15:return (this.Bb&Cve)!=0;case 16:return (this.Bb&oie)!=0;case 17:return !!WId(this);}return cid(this,a-aLd(this.zh()),XKd((b=BD(Ajd(this,16),26),!b?this.zh():b),a))};_.sh=function nJd(a,b){var c,d;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:cJd(this,GD(b));return;case 2:BId(this,Ccb(DD(b)));return;case 3:CId(this,Ccb(DD(b)));return;case 4:AId(this,BD(b,19).a);return;case 5:this.ok(BD(b,19).a);return;case 8:yId(this,BD(b,138));return;case 9:d=xId(this,BD(b,87),null);!!d&&d.Fi();return;case 10:ZId(this,Ccb(DD(b)));return;case 11:fJd(this,Ccb(DD(b)));return;case 12:dJd(this,Ccb(DD(b)));return;case 13:$Id(this,GD(b));return;case 15:eJd(this,Ccb(DD(b)));return;case 16:aJd(this,Ccb(DD(b)));return;}did(this,a-aLd(this.zh()),XKd((c=BD(Ajd(this,16),26),!c?this.zh():c),a),b)};_.zh=function oJd(){return jGd(),gGd};_.Bh=function pJd(a){var b,c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:JD(this.Cb,88)&&XMd($Kd(BD(this.Cb,88)),4);pnd(this,null);return;case 2:BId(this,true);return;case 3:CId(this,true);return;case 4:AId(this,0);return;case 5:this.ok(1);return;case 8:yId(this,null);return;case 9:c=xId(this,null,null);!!c&&c.Fi();return;case 10:ZId(this,true);return;case 11:fJd(this,false);return;case 12:dJd(this,false);return;case 13:this.i=null;_Id(this,null);return;case 15:eJd(this,false);return;case 16:aJd(this,false);return;}eid(this,a-aLd(this.zh()),XKd((b=BD(Ajd(this,16),26),!b?this.zh():b),a))};_.Gh=function qJd(){a2d(q1d((O6d(),M6d),this));wId(this);this.Bb|=1};_.Gj=function rJd(){return this.f};_.zj=function sJd(){return VId(this)};_.Hj=function tJd(){return WId(this)};_.Lj=function uJd(){return null};_.pk=function vJd(){return this.k};_.aj=function wJd(){return this.n};_.Mj=function xJd(){return XId(this)};_.Nj=function yJd(){var a,b,c,d,e,f,g,h,i;if(!this.p){c=WId(this);(c.i==null&&TKd(c),c.i).length;d=this.Lj();!!d&&aLd(WId(d));e=wId(this);g=e.Bj();a=!g?null:(g.i&1)!=0?g==sbb?wI:g==WD?JI:g==VD?FI:g==UD?BI:g==XD?MI:g==rbb?UI:g==SD?xI:yI:g;b=VId(this);h=e.zj();n6d(this);(this.Bb&oie)!=0&&(!!(f=t1d((O6d(),M6d),c))&&f!=this||!!(f=_1d(q1d(M6d,this))))?(this.p=new zVd(this,f)):this.$j()?this.rk()?!d?(this.Bb&Cve)!=0?!a?this.sk()?(this.p=new KVd(42,this)):(this.p=new KVd(0,this)):a==CK?(this.p=new IVd(50,J4,this)):this.sk()?(this.p=new IVd(43,a,this)):(this.p=new IVd(1,a,this)):!a?this.sk()?(this.p=new KVd(44,this)):(this.p=new KVd(2,this)):a==CK?(this.p=new IVd(41,J4,this)):this.sk()?(this.p=new IVd(45,a,this)):(this.p=new IVd(3,a,this)):(this.Bb&Cve)!=0?!a?this.sk()?(this.p=new LVd(46,this,d)):(this.p=new LVd(4,this,d)):this.sk()?(this.p=new JVd(47,a,this,d)):(this.p=new JVd(5,a,this,d)):!a?this.sk()?(this.p=new LVd(48,this,d)):(this.p=new LVd(6,this,d)):this.sk()?(this.p=new JVd(49,a,this,d)):(this.p=new JVd(7,a,this,d)):JD(e,148)?a==E9?(this.p=new KVd(40,this)):(this.Bb&512)!=0?(this.Bb&Cve)!=0?!a?(this.p=new KVd(8,this)):(this.p=new IVd(9,a,this)):!a?(this.p=new KVd(10,this)):(this.p=new IVd(11,a,this)):(this.Bb&Cve)!=0?!a?(this.p=new KVd(12,this)):(this.p=new IVd(13,a,this)):!a?(this.p=new KVd(14,this)):(this.p=new IVd(15,a,this)):!d?this.sk()?(this.Bb&Cve)!=0?!a?(this.p=new KVd(16,this)):(this.p=new IVd(17,a,this)):!a?(this.p=new KVd(18,this)):(this.p=new IVd(19,a,this)):(this.Bb&Cve)!=0?!a?(this.p=new KVd(20,this)):(this.p=new IVd(21,a,this)):!a?(this.p=new KVd(22,this)):(this.p=new IVd(23,a,this)):(i=d.t,i>1||i==-1?this.sk()?(this.Bb&Cve)!=0?!a?(this.p=new LVd(24,this,d)):(this.p=new JVd(25,a,this,d)):!a?(this.p=new LVd(26,this,d)):(this.p=new JVd(27,a,this,d)):(this.Bb&Cve)!=0?!a?(this.p=new LVd(28,this,d)):(this.p=new JVd(29,a,this,d)):!a?(this.p=new LVd(30,this,d)):(this.p=new JVd(31,a,this,d)):this.sk()?(this.Bb&Cve)!=0?!a?(this.p=new LVd(32,this,d)):(this.p=new JVd(33,a,this,d)):!a?(this.p=new LVd(34,this,d)):(this.p=new JVd(35,a,this,d)):(this.Bb&Cve)!=0?!a?(this.p=new LVd(36,this,d)):(this.p=new JVd(37,a,this,d)):!a?(this.p=new LVd(38,this,d)):(this.p=new JVd(39,a,this,d))):this.qk()?this.sk()?(this.p=new kWd(BD(e,26),this,d)):(this.p=new cWd(BD(e,26),this,d)):JD(e,148)?a==E9?(this.p=new KVd(40,this)):(this.Bb&Cve)!=0?!a?(this.p=new jXd(BD(e,148),b,h,this)):(this.p=new lXd(b,h,this,(CWd(),g==WD?yWd:g==sbb?tWd:g==XD?zWd:g==VD?xWd:g==UD?wWd:g==rbb?BWd:g==SD?uWd:g==TD?vWd:AWd))):!a?(this.p=new cXd(BD(e,148),b,h,this)):(this.p=new eXd(b,h,this,(CWd(),g==WD?yWd:g==sbb?tWd:g==XD?zWd:g==VD?xWd:g==UD?wWd:g==rbb?BWd:g==SD?uWd:g==TD?vWd:AWd))):this.rk()?!d?(this.Bb&Cve)!=0?this.sk()?(this.p=new FXd(BD(e,26),this)):(this.p=new DXd(BD(e,26),this)):this.sk()?(this.p=new BXd(BD(e,26),this)):(this.p=new zXd(BD(e,26),this)):(this.Bb&Cve)!=0?this.sk()?(this.p=new NXd(BD(e,26),this,d)):(this.p=new LXd(BD(e,26),this,d)):this.sk()?(this.p=new JXd(BD(e,26),this,d)):(this.p=new HXd(BD(e,26),this,d)):this.sk()?!d?(this.Bb&Cve)!=0?(this.p=new RXd(BD(e,26),this)):(this.p=new PXd(BD(e,26),this)):(this.Bb&Cve)!=0?(this.p=new VXd(BD(e,26),this,d)):(this.p=new TXd(BD(e,26),this,d)):!d?(this.Bb&Cve)!=0?(this.p=new XXd(BD(e,26),this)):(this.p=new nXd(BD(e,26),this)):(this.Bb&Cve)!=0?(this.p=new _Xd(BD(e,26),this,d)):(this.p=new ZXd(BD(e,26),this,d))}return this.p};_.Ij=function zJd(){return (this.Bb&zte)!=0};_.qk=function AJd(){return false};_.rk=function BJd(){return false};_.Jj=function CJd(){return (this.Bb&oie)!=0};_.Oj=function DJd(){return YId(this)};_.sk=function EJd(){return false};_.Kj=function FJd(){return (this.Bb&Cve)!=0};_.tk=function GJd(a){this.k=a};_.Lh=function HJd(a){cJd(this,a)};_.Ib=function IJd(){return gJd(this)};_.e=false;_.n=0;var n7=mdb(qte,'EStructuralFeatureImpl',449);bcb(322,449,{105:1,92:1,90:1,34:1,147:1,191:1,56:1,170:1,66:1,108:1,472:1,49:1,97:1,322:1,150:1,449:1,284:1,114:1,115:1,677:1},OJd);_._g=function PJd(a,b,c){var d,e;switch(a){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab;case 1:return this.zb;case 2:return Bcb(),(this.Bb&256)!=0?true:false;case 3:return Bcb(),(this.Bb&512)!=0?true:false;case 4:return meb(this.s);case 5:return meb(this.t);case 6:return Bcb(),LJd(this)?true:false;case 7:return Bcb(),e=this.s,e>=1?true:false;case 8:if(b)return wId(this);return this.r;case 9:return this.q;case 10:return Bcb(),(this.Bb&zte)!=0?true:false;case 11:return Bcb(),(this.Bb&Dve)!=0?true:false;case 12:return Bcb(),(this.Bb&Rje)!=0?true:false;case 13:return this.j;case 14:return VId(this);case 15:return Bcb(),(this.Bb&Cve)!=0?true:false;case 16:return Bcb(),(this.Bb&oie)!=0?true:false;case 17:return WId(this);case 18:return Bcb(),(this.Bb&ote)!=0?true:false;case 19:if(b)return KJd(this);return JJd(this);}return bid(this,a-aLd((jGd(),PFd)),XKd((d=BD(Ajd(this,16),26),!d?PFd:d),a),b,c)};_.lh=function QJd(a){var b,c;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return (this.Bb&256)==0;case 3:return (this.Bb&512)==0;case 4:return this.s!=0;case 5:return this.t!=1;case 6:return LJd(this);case 7:return c=this.s,c>=1;case 8:return !!this.r&&!this.q.e&&LQd(this.q).i==0;case 9:return !!this.q&&!(!!this.r&&!this.q.e&&LQd(this.q).i==0);case 10:return (this.Bb&zte)==0;case 11:return (this.Bb&Dve)!=0;case 12:return (this.Bb&Rje)!=0;case 13:return this.j!=null;case 14:return VId(this)!=null;case 15:return (this.Bb&Cve)!=0;case 16:return (this.Bb&oie)!=0;case 17:return !!WId(this);case 18:return (this.Bb&ote)!=0;case 19:return !!JJd(this);}return cid(this,a-aLd((jGd(),PFd)),XKd((b=BD(Ajd(this,16),26),!b?PFd:b),a))};_.sh=function RJd(a,b){var c,d;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:cJd(this,GD(b));return;case 2:BId(this,Ccb(DD(b)));return;case 3:CId(this,Ccb(DD(b)));return;case 4:AId(this,BD(b,19).a);return;case 5:NJd(this,BD(b,19).a);return;case 8:yId(this,BD(b,138));return;case 9:d=xId(this,BD(b,87),null);!!d&&d.Fi();return;case 10:ZId(this,Ccb(DD(b)));return;case 11:fJd(this,Ccb(DD(b)));return;case 12:dJd(this,Ccb(DD(b)));return;case 13:$Id(this,GD(b));return;case 15:eJd(this,Ccb(DD(b)));return;case 16:aJd(this,Ccb(DD(b)));return;case 18:MJd(this,Ccb(DD(b)));return;}did(this,a-aLd((jGd(),PFd)),XKd((c=BD(Ajd(this,16),26),!c?PFd:c),a),b)};_.zh=function SJd(){return jGd(),PFd};_.Bh=function TJd(a){var b,c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:JD(this.Cb,88)&&XMd($Kd(BD(this.Cb,88)),4);pnd(this,null);return;case 2:BId(this,true);return;case 3:CId(this,true);return;case 4:AId(this,0);return;case 5:this.b=0;DId(this,1);return;case 8:yId(this,null);return;case 9:c=xId(this,null,null);!!c&&c.Fi();return;case 10:ZId(this,true);return;case 11:fJd(this,false);return;case 12:dJd(this,false);return;case 13:this.i=null;_Id(this,null);return;case 15:eJd(this,false);return;case 16:aJd(this,false);return;case 18:MJd(this,false);return;}eid(this,a-aLd((jGd(),PFd)),XKd((b=BD(Ajd(this,16),26),!b?PFd:b),a))};_.Gh=function UJd(){KJd(this);a2d(q1d((O6d(),M6d),this));wId(this);this.Bb|=1};_.$j=function VJd(){return LJd(this)};_.nk=function WJd(a,b){this.b=0;this.a=null;return zId(this,a,b)};_.ok=function XJd(a){NJd(this,a)};_.Ib=function YJd(){var a;if((this.Db&64)!=0)return gJd(this);a=new Jfb(gJd(this));a.a+=' (iD: ';Ffb(a,(this.Bb&ote)!=0);a.a+=')';return a.a};_.b=0;var H5=mdb(qte,'EAttributeImpl',322);bcb(351,438,{105:1,92:1,90:1,138:1,147:1,191:1,56:1,108:1,49:1,97:1,351:1,150:1,114:1,115:1,676:1});_.uk=function nKd(a){return a.Tg()==this};_.Qg=function oKd(a){return aKd(this,a)};_.Rg=function pKd(a,b){this.w=null;this.Db=b<<16|this.Db&255;this.Cb=a};_._g=function qKd(a,b,c){var d;switch(a){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab;case 1:return this.zb;case 2:return this.D!=null?this.D:this.B;case 3:return dKd(this);case 4:return this.zj();case 5:return this.F;case 6:if(b)return bKd(this);return ZJd(this);case 7:return !this.A&&(this.A=new K4d(u5,this,7)),this.A;}return bid(this,a-aLd(this.zh()),XKd((d=BD(Ajd(this,16),26),!d?this.zh():d),a),b,c)};_.hh=function rKd(a,b,c){var d,e,f;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Sxd(this.Ab,a,c);case 6:!!this.Cb&&(c=(e=this.Db>>16,e>=0?aKd(this,c):this.Cb.ih(this,-1-e,null,c)));return _hd(this,a,6,c);}return f=BD(XKd((d=BD(Ajd(this,16),26),!d?this.zh():d),b),66),f.Nj().Qj(this,yjd(this),b-aLd(this.zh()),a,c)};_.jh=function sKd(a,b,c){var d,e;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Txd(this.Ab,a,c);case 6:return _hd(this,null,6,c);case 7:return !this.A&&(this.A=new K4d(u5,this,7)),Txd(this.A,a,c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?this.zh():d),b),66),e.Nj().Rj(this,yjd(this),b-aLd(this.zh()),a,c)};_.lh=function tKd(a){var b;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return this.D!=null&&this.D==this.F;case 3:return !!dKd(this);case 4:return this.zj()!=null;case 5:return this.F!=null&&this.F!=this.D&&this.F!=this.B;case 6:return !!ZJd(this);case 7:return !!this.A&&this.A.i!=0;}return cid(this,a-aLd(this.zh()),XKd((b=BD(Ajd(this,16),26),!b?this.zh():b),a))};_.sh=function uKd(a,b){var c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:lKd(this,GD(b));return;case 2:iKd(this,GD(b));return;case 5:kKd(this,GD(b));return;case 7:!this.A&&(this.A=new K4d(u5,this,7));Uxd(this.A);!this.A&&(this.A=new K4d(u5,this,7));ytd(this.A,BD(b,14));return;}did(this,a-aLd(this.zh()),XKd((c=BD(Ajd(this,16),26),!c?this.zh():c),a),b)};_.zh=function vKd(){return jGd(),RFd};_.Bh=function wKd(a){var b;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:JD(this.Cb,179)&&(BD(this.Cb,179).tb=null);pnd(this,null);return;case 2:$Jd(this,null);_Jd(this,this.D);return;case 5:kKd(this,null);return;case 7:!this.A&&(this.A=new K4d(u5,this,7));Uxd(this.A);return;}eid(this,a-aLd(this.zh()),XKd((b=BD(Ajd(this,16),26),!b?this.zh():b),a))};_.yj=function xKd(){var a;return this.G==-1&&(this.G=(a=bKd(this),a?HLd(a.Mh(),this):-1)),this.G};_.zj=function yKd(){return null};_.Aj=function zKd(){return bKd(this)};_.vk=function AKd(){return this.v};_.Bj=function BKd(){return dKd(this)};_.Cj=function CKd(){return this.D!=null?this.D:this.B};_.Dj=function DKd(){return this.F};_.wj=function EKd(a){return fKd(this,a)};_.wk=function FKd(a){this.v=a};_.xk=function GKd(a){gKd(this,a)};_.yk=function HKd(a){this.C=a};_.Lh=function IKd(a){lKd(this,a)};_.Ib=function JKd(){return mKd(this)};_.C=null;_.D=null;_.G=-1;var Z5=mdb(qte,'EClassifierImpl',351);bcb(88,351,{105:1,92:1,90:1,26:1,138:1,147:1,191:1,56:1,108:1,49:1,97:1,88:1,351:1,150:1,473:1,114:1,115:1,676:1},hLd);_.uk=function iLd(a){return dLd(this,a.Tg())};_._g=function jLd(a,b,c){var d;switch(a){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab;case 1:return this.zb;case 2:return this.D!=null?this.D:this.B;case 3:return dKd(this);case 4:return null;case 5:return this.F;case 6:if(b)return bKd(this);return ZJd(this);case 7:return !this.A&&(this.A=new K4d(u5,this,7)),this.A;case 8:return Bcb(),(this.Bb&256)!=0?true:false;case 9:return Bcb(),(this.Bb&512)!=0?true:false;case 10:return _Kd(this);case 11:return !this.q&&(this.q=new cUd(n5,this,11,10)),this.q;case 12:return OKd(this);case 13:return SKd(this);case 14:return SKd(this),this.r;case 15:return OKd(this),this.k;case 16:return PKd(this);case 17:return RKd(this);case 18:return TKd(this);case 19:return UKd(this);case 20:return OKd(this),this.o;case 21:return !this.s&&(this.s=new cUd(t5,this,21,17)),this.s;case 22:return VKd(this);case 23:return QKd(this);}return bid(this,a-aLd((jGd(),QFd)),XKd((d=BD(Ajd(this,16),26),!d?QFd:d),a),b,c)};_.hh=function kLd(a,b,c){var d,e,f;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Sxd(this.Ab,a,c);case 6:!!this.Cb&&(c=(e=this.Db>>16,e>=0?aKd(this,c):this.Cb.ih(this,-1-e,null,c)));return _hd(this,a,6,c);case 11:return !this.q&&(this.q=new cUd(n5,this,11,10)),Sxd(this.q,a,c);case 21:return !this.s&&(this.s=new cUd(t5,this,21,17)),Sxd(this.s,a,c);}return f=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),QFd):d),b),66),f.Nj().Qj(this,yjd(this),b-aLd((jGd(),QFd)),a,c)};_.jh=function lLd(a,b,c){var d,e;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Txd(this.Ab,a,c);case 6:return _hd(this,null,6,c);case 7:return !this.A&&(this.A=new K4d(u5,this,7)),Txd(this.A,a,c);case 11:return !this.q&&(this.q=new cUd(n5,this,11,10)),Txd(this.q,a,c);case 21:return !this.s&&(this.s=new cUd(t5,this,21,17)),Txd(this.s,a,c);case 22:return Txd(VKd(this),a,c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),QFd):d),b),66),e.Nj().Rj(this,yjd(this),b-aLd((jGd(),QFd)),a,c)};_.lh=function mLd(a){var b;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return this.D!=null&&this.D==this.F;case 3:return !!dKd(this);case 4:return false;case 5:return this.F!=null&&this.F!=this.D&&this.F!=this.B;case 6:return !!ZJd(this);case 7:return !!this.A&&this.A.i!=0;case 8:return (this.Bb&256)!=0;case 9:return (this.Bb&512)!=0;case 10:return !!this.u&&VKd(this.u.a).i!=0&&!(!!this.n&&FMd(this.n));case 11:return !!this.q&&this.q.i!=0;case 12:return OKd(this).i!=0;case 13:return SKd(this).i!=0;case 14:return SKd(this),this.r.i!=0;case 15:return OKd(this),this.k.i!=0;case 16:return PKd(this).i!=0;case 17:return RKd(this).i!=0;case 18:return TKd(this).i!=0;case 19:return UKd(this).i!=0;case 20:return OKd(this),!!this.o;case 21:return !!this.s&&this.s.i!=0;case 22:return !!this.n&&FMd(this.n);case 23:return QKd(this).i!=0;}return cid(this,a-aLd((jGd(),QFd)),XKd((b=BD(Ajd(this,16),26),!b?QFd:b),a))};_.oh=function nLd(a){var b;b=this.i==null||!!this.q&&this.q.i!=0?null:YKd(this,a);return b?b:Bmd(this,a)};_.sh=function oLd(a,b){var c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:lKd(this,GD(b));return;case 2:iKd(this,GD(b));return;case 5:kKd(this,GD(b));return;case 7:!this.A&&(this.A=new K4d(u5,this,7));Uxd(this.A);!this.A&&(this.A=new K4d(u5,this,7));ytd(this.A,BD(b,14));return;case 8:eLd(this,Ccb(DD(b)));return;case 9:fLd(this,Ccb(DD(b)));return;case 10:vwd(_Kd(this));ytd(_Kd(this),BD(b,14));return;case 11:!this.q&&(this.q=new cUd(n5,this,11,10));Uxd(this.q);!this.q&&(this.q=new cUd(n5,this,11,10));ytd(this.q,BD(b,14));return;case 21:!this.s&&(this.s=new cUd(t5,this,21,17));Uxd(this.s);!this.s&&(this.s=new cUd(t5,this,21,17));ytd(this.s,BD(b,14));return;case 22:Uxd(VKd(this));ytd(VKd(this),BD(b,14));return;}did(this,a-aLd((jGd(),QFd)),XKd((c=BD(Ajd(this,16),26),!c?QFd:c),a),b)};_.zh=function pLd(){return jGd(),QFd};_.Bh=function qLd(a){var b;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:JD(this.Cb,179)&&(BD(this.Cb,179).tb=null);pnd(this,null);return;case 2:$Jd(this,null);_Jd(this,this.D);return;case 5:kKd(this,null);return;case 7:!this.A&&(this.A=new K4d(u5,this,7));Uxd(this.A);return;case 8:eLd(this,false);return;case 9:fLd(this,false);return;case 10:!!this.u&&vwd(this.u);return;case 11:!this.q&&(this.q=new cUd(n5,this,11,10));Uxd(this.q);return;case 21:!this.s&&(this.s=new cUd(t5,this,21,17));Uxd(this.s);return;case 22:!!this.n&&Uxd(this.n);return;}eid(this,a-aLd((jGd(),QFd)),XKd((b=BD(Ajd(this,16),26),!b?QFd:b),a))};_.Gh=function rLd(){var a,b;OKd(this);SKd(this);PKd(this);RKd(this);TKd(this);UKd(this);QKd(this);oud(SMd($Kd(this)));if(this.s){for(a=0,b=this.s.i;a=0;--b){qud(this,b)}}return xud(this,a)};_.Xj=function nMd(){Uxd(this)};_.oi=function oMd(a,b){return LLd(this,a,b)};var t9=mdb(yve,'EcoreEList',622);bcb(496,622,Pve,pMd);_.ai=function qMd(){return false};_.aj=function rMd(){return this.c};_.bj=function sMd(){return false};_.Fk=function tMd(){return true};_.hi=function uMd(){return true};_.li=function vMd(a,b){return b};_.ni=function wMd(){return false};_.c=0;var d9=mdb(yve,'EObjectEList',496);bcb(85,496,Pve,xMd);_.bj=function yMd(){return true};_.Dk=function zMd(){return false};_.rk=function AMd(){return true};var Z8=mdb(yve,'EObjectContainmentEList',85);bcb(545,85,Pve,BMd);_.ci=function CMd(){this.b=true};_.fj=function DMd(){return this.b};_.Xj=function EMd(){var a;Uxd(this);if(oid(this.e)){a=this.b;this.b=false;Uhd(this.e,new qSd(this.e,2,this.c,a,false))}else{this.b=false}};_.b=false;var Y8=mdb(yve,'EObjectContainmentEList/Unsettable',545);bcb(1140,545,Pve,JMd);_.ii=function NMd(a,b){var c,d;return c=BD(Wxd(this,a,b),87),oid(this.e)&&GLd(this,new ESd(this.a,7,(jGd(),SFd),meb(b),(d=c.c,JD(d,88)?BD(d,26):_Fd),a)),c};_.jj=function OMd(a,b){return GMd(this,BD(a,87),b)};_.kj=function PMd(a,b){return HMd(this,BD(a,87),b)};_.lj=function QMd(a,b,c){return IMd(this,BD(a,87),BD(b,87),c)};_.Zi=function KMd(a,b,c,d,e){switch(a){case 3:{return FLd(this,a,b,c,d,this.i>1)}case 5:{return FLd(this,a,b,c,d,this.i-BD(c,15).gc()>0)}default:{return new pSd(this.e,a,this.c,b,c,d,true)}}};_.ij=function LMd(){return true};_.fj=function MMd(){return FMd(this)};_.Xj=function RMd(){Uxd(this)};var N5=mdb(qte,'EClassImpl/1',1140);bcb(1154,1153,dve);_.ui=function VMd(a){var b,c,d,e,f,g,h;c=a.xi();if(c!=8){d=UMd(a);if(d==0){switch(c){case 1:case 9:{h=a.Bi();if(h!=null){b=$Kd(BD(h,473));!b.c&&(b.c=new xYd);Ftd(b.c,a.Ai())}g=a.zi();if(g!=null){e=BD(g,473);if((e.Bb&1)==0){b=$Kd(e);!b.c&&(b.c=new xYd);wtd(b.c,BD(a.Ai(),26))}}break}case 3:{g=a.zi();if(g!=null){e=BD(g,473);if((e.Bb&1)==0){b=$Kd(e);!b.c&&(b.c=new xYd);wtd(b.c,BD(a.Ai(),26))}}break}case 5:{g=a.zi();if(g!=null){for(f=BD(g,14).Kc();f.Ob();){e=BD(f.Pb(),473);if((e.Bb&1)==0){b=$Kd(e);!b.c&&(b.c=new xYd);wtd(b.c,BD(a.Ai(),26))}}}break}case 4:{h=a.Bi();if(h!=null){e=BD(h,473);if((e.Bb&1)==0){b=$Kd(e);!b.c&&(b.c=new xYd);Ftd(b.c,a.Ai())}}break}case 6:{h=a.Bi();if(h!=null){for(f=BD(h,14).Kc();f.Ob();){e=BD(f.Pb(),473);if((e.Bb&1)==0){b=$Kd(e);!b.c&&(b.c=new xYd);Ftd(b.c,a.Ai())}}}break}}}this.Hk(d)}};_.Hk=function WMd(a){TMd(this,a)};_.b=63;var p7=mdb(qte,'ESuperAdapter',1154);bcb(1155,1154,dve,YMd);_.Hk=function ZMd(a){XMd(this,a)};var I5=mdb(qte,'EClassImpl/10',1155);bcb(1144,696,Pve);_.Vh=function $Md(a,b){return iud(this,a,b)};_.Wh=function _Md(a){return jud(this,a)};_.Xh=function aNd(a,b){kud(this,a,b)};_.Yh=function bNd(a){lud(this,a)};_.pi=function dNd(a){return nud(this,a)};_.mi=function lNd(a,b){return uud(this,a,b)};_.lk=function cNd(a,b){throw vbb(new bgb)};_.Zh=function eNd(){return new $yd(this)};_.$h=function fNd(){return new bzd(this)};_._h=function gNd(a){return ztd(this,a)};_.mk=function hNd(a,b){throw vbb(new bgb)};_.Wj=function iNd(a){return this};_.fj=function jNd(){return this.i!=0};_.Wb=function kNd(a){throw vbb(new bgb)};_.Xj=function mNd(){throw vbb(new bgb)};var s9=mdb(yve,'EcoreEList/UnmodifiableEList',1144);bcb(319,1144,Pve,nNd);_.ni=function oNd(){return false};var r9=mdb(yve,'EcoreEList/UnmodifiableEList/FastCompare',319);bcb(1147,319,Pve,rNd);_.Xc=function sNd(a){var b,c,d;if(JD(a,170)){b=BD(a,170);c=b.aj();if(c!=-1){for(d=this.i;c4){if(this.wj(a)){if(this.rk()){d=BD(a,49);c=d.Ug();h=c==this.b&&(this.Dk()?d.Og(d.Vg(),BD(XKd(wjd(this.b),this.aj()).Yj(),26).Bj())==zUd(BD(XKd(wjd(this.b),this.aj()),18)).n:-1-d.Vg()==this.aj());if(this.Ek()&&!h&&!c&&!!d.Zg()){for(e=0;e1||d==-1)}else{return false}};_.Dk=function COd(){var a,b,c;b=XKd(wjd(this.b),this.aj());if(JD(b,99)){a=BD(b,18);c=zUd(a);return !!c}else{return false}};_.Ek=function DOd(){var a,b;b=XKd(wjd(this.b),this.aj());if(JD(b,99)){a=BD(b,18);return (a.Bb&Tje)!=0}else{return false}};_.Xc=function EOd(a){var b,c,d,e;d=this.Qi(a);if(d>=0)return d;if(this.Fk()){for(c=0,e=this.Vi();c=0;--a){nOd(this,a,this.Oi(a))}}return this.Wi()};_.Qc=function QOd(a){var b;if(this.Ek()){for(b=this.Vi()-1;b>=0;--b){nOd(this,b,this.Oi(b))}}return this.Xi(a)};_.Xj=function ROd(){vwd(this)};_.oi=function SOd(a,b){return pOd(this,a,b)};var K8=mdb(yve,'DelegatingEcoreEList',742);bcb(1150,742,Uve,YOd);_.Hi=function _Od(a,b){TOd(this,a,BD(b,26))};_.Ii=function aPd(a){UOd(this,BD(a,26))};_.Oi=function gPd(a){var b,c;return b=BD(qud(VKd(this.a),a),87),c=b.c,JD(c,88)?BD(c,26):(jGd(),_Fd)};_.Ti=function lPd(a){var b,c;return b=BD(Xxd(VKd(this.a),a),87),c=b.c,JD(c,88)?BD(c,26):(jGd(),_Fd)};_.Ui=function mPd(a,b){return WOd(this,a,BD(b,26))};_.ai=function ZOd(){return false};_.Zi=function $Od(a,b,c,d,e){return null};_.Ji=function bPd(){return new EPd(this)};_.Ki=function cPd(){Uxd(VKd(this.a))};_.Li=function dPd(a){return VOd(this,a)};_.Mi=function ePd(a){var b,c;for(c=a.Kc();c.Ob();){b=c.Pb();if(!VOd(this,b)){return false}}return true};_.Ni=function fPd(a){var b,c,d;if(JD(a,15)){d=BD(a,15);if(d.gc()==VKd(this.a).i){for(b=d.Kc(),c=new Fyd(this);b.Ob();){if(PD(b.Pb())!==PD(Dyd(c))){return false}}return true}}return false};_.Pi=function hPd(){var a,b,c,d,e;c=1;for(b=new Fyd(VKd(this.a));b.e!=b.i.gc();){a=BD(Dyd(b),87);d=(e=a.c,JD(e,88)?BD(e,26):(jGd(),_Fd));c=31*c+(!d?0:FCb(d))}return c};_.Qi=function iPd(a){var b,c,d,e;d=0;for(c=new Fyd(VKd(this.a));c.e!=c.i.gc();){b=BD(Dyd(c),87);if(PD(a)===PD((e=b.c,JD(e,88)?BD(e,26):(jGd(),_Fd)))){return d}++d}return -1};_.Ri=function jPd(){return VKd(this.a).i==0};_.Si=function kPd(){return null};_.Vi=function nPd(){return VKd(this.a).i};_.Wi=function oPd(){var a,b,c,d,e,f;f=VKd(this.a).i;e=KC(SI,Uhe,1,f,5,1);c=0;for(b=new Fyd(VKd(this.a));b.e!=b.i.gc();){a=BD(Dyd(b),87);e[c++]=(d=a.c,JD(d,88)?BD(d,26):(jGd(),_Fd))}return e};_.Xi=function pPd(a){var b,c,d,e,f,g,h;h=VKd(this.a).i;if(a.lengthh&&NC(a,h,null);d=0;for(c=new Fyd(VKd(this.a));c.e!=c.i.gc();){b=BD(Dyd(c),87);f=(g=b.c,JD(g,88)?BD(g,26):(jGd(),_Fd));NC(a,d++,f)}return a};_.Yi=function qPd(){var a,b,c,d,e;e=new Hfb;e.a+='[';a=VKd(this.a);for(b=0,d=VKd(this.a).i;b>16,e>=0?aKd(this,c):this.Cb.ih(this,-1-e,null,c)));return _hd(this,a,6,c);case 9:return !this.a&&(this.a=new cUd(g5,this,9,5)),Sxd(this.a,a,c);}return f=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),UFd):d),b),66),f.Nj().Qj(this,yjd(this),b-aLd((jGd(),UFd)),a,c)};_.jh=function dQd(a,b,c){var d,e;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Txd(this.Ab,a,c);case 6:return _hd(this,null,6,c);case 7:return !this.A&&(this.A=new K4d(u5,this,7)),Txd(this.A,a,c);case 9:return !this.a&&(this.a=new cUd(g5,this,9,5)),Txd(this.a,a,c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),UFd):d),b),66),e.Nj().Rj(this,yjd(this),b-aLd((jGd(),UFd)),a,c)};_.lh=function eQd(a){var b;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return this.D!=null&&this.D==this.F;case 3:return !!dKd(this);case 4:return !!$Pd(this);case 5:return this.F!=null&&this.F!=this.D&&this.F!=this.B;case 6:return !!ZJd(this);case 7:return !!this.A&&this.A.i!=0;case 8:return (this.Bb&256)==0;case 9:return !!this.a&&this.a.i!=0;}return cid(this,a-aLd((jGd(),UFd)),XKd((b=BD(Ajd(this,16),26),!b?UFd:b),a))};_.sh=function fQd(a,b){var c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:lKd(this,GD(b));return;case 2:iKd(this,GD(b));return;case 5:kKd(this,GD(b));return;case 7:!this.A&&(this.A=new K4d(u5,this,7));Uxd(this.A);!this.A&&(this.A=new K4d(u5,this,7));ytd(this.A,BD(b,14));return;case 8:LPd(this,Ccb(DD(b)));return;case 9:!this.a&&(this.a=new cUd(g5,this,9,5));Uxd(this.a);!this.a&&(this.a=new cUd(g5,this,9,5));ytd(this.a,BD(b,14));return;}did(this,a-aLd((jGd(),UFd)),XKd((c=BD(Ajd(this,16),26),!c?UFd:c),a),b)};_.zh=function gQd(){return jGd(),UFd};_.Bh=function hQd(a){var b;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:JD(this.Cb,179)&&(BD(this.Cb,179).tb=null);pnd(this,null);return;case 2:$Jd(this,null);_Jd(this,this.D);return;case 5:kKd(this,null);return;case 7:!this.A&&(this.A=new K4d(u5,this,7));Uxd(this.A);return;case 8:LPd(this,true);return;case 9:!this.a&&(this.a=new cUd(g5,this,9,5));Uxd(this.a);return;}eid(this,a-aLd((jGd(),UFd)),XKd((b=BD(Ajd(this,16),26),!b?UFd:b),a))};_.Gh=function iQd(){var a,b;if(this.a){for(a=0,b=this.a.i;a>16==5?BD(this.Cb,671):null;}return bid(this,a-aLd((jGd(),VFd)),XKd((d=BD(Ajd(this,16),26),!d?VFd:d),a),b,c)};_.hh=function uQd(a,b,c){var d,e,f;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Sxd(this.Ab,a,c);case 5:!!this.Cb&&(c=(e=this.Db>>16,e>=0?mQd(this,c):this.Cb.ih(this,-1-e,null,c)));return _hd(this,a,5,c);}return f=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),VFd):d),b),66),f.Nj().Qj(this,yjd(this),b-aLd((jGd(),VFd)),a,c)};_.jh=function vQd(a,b,c){var d,e;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Txd(this.Ab,a,c);case 5:return _hd(this,null,5,c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),VFd):d),b),66),e.Nj().Rj(this,yjd(this),b-aLd((jGd(),VFd)),a,c)};_.lh=function wQd(a){var b;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return this.d!=0;case 3:return !!this.b;case 4:return this.c!=null;case 5:return !!(this.Db>>16==5?BD(this.Cb,671):null);}return cid(this,a-aLd((jGd(),VFd)),XKd((b=BD(Ajd(this,16),26),!b?VFd:b),a))};_.sh=function xQd(a,b){var c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:pnd(this,GD(b));return;case 2:qQd(this,BD(b,19).a);return;case 3:oQd(this,BD(b,1940));return;case 4:pQd(this,GD(b));return;}did(this,a-aLd((jGd(),VFd)),XKd((c=BD(Ajd(this,16),26),!c?VFd:c),a),b)};_.zh=function yQd(){return jGd(),VFd};_.Bh=function zQd(a){var b;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:pnd(this,null);return;case 2:qQd(this,0);return;case 3:oQd(this,null);return;case 4:pQd(this,null);return;}eid(this,a-aLd((jGd(),VFd)),XKd((b=BD(Ajd(this,16),26),!b?VFd:b),a))};_.Ib=function BQd(){var a;return a=this.c,a==null?this.zb:a};_.b=null;_.c=null;_.d=0;var a6=mdb(qte,'EEnumLiteralImpl',573);var c6=odb(qte,'EFactoryImpl/InternalEDateTimeFormat');bcb(489,1,{2015:1},EQd);var b6=mdb(qte,'EFactoryImpl/1ClientInternalEDateTimeFormat',489);bcb(241,115,{105:1,92:1,90:1,87:1,56:1,108:1,49:1,97:1,241:1,114:1,115:1},UQd);_.Sg=function VQd(a,b,c){var d;c=_hd(this,a,b,c);if(!!this.e&&JD(a,170)){d=MQd(this,this.e);d!=this.c&&(c=QQd(this,d,c))}return c};_._g=function WQd(a,b,c){var d;switch(a){case 0:return this.f;case 1:return !this.d&&(this.d=new xMd(j5,this,1)),this.d;case 2:if(b)return KQd(this);return this.c;case 3:return this.b;case 4:return this.e;case 5:if(b)return JQd(this);return this.a;}return bid(this,a-aLd((jGd(),XFd)),XKd((d=BD(Ajd(this,16),26),!d?XFd:d),a),b,c)};_.jh=function XQd(a,b,c){var d,e;switch(b){case 0:return IQd(this,null,c);case 1:return !this.d&&(this.d=new xMd(j5,this,1)),Txd(this.d,a,c);case 3:return GQd(this,null,c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),XFd):d),b),66),e.Nj().Rj(this,yjd(this),b-aLd((jGd(),XFd)),a,c)};_.lh=function YQd(a){var b;switch(a){case 0:return !!this.f;case 1:return !!this.d&&this.d.i!=0;case 2:return !!this.c;case 3:return !!this.b;case 4:return !!this.e;case 5:return !!this.a;}return cid(this,a-aLd((jGd(),XFd)),XKd((b=BD(Ajd(this,16),26),!b?XFd:b),a))};_.sh=function ZQd(a,b){var c;switch(a){case 0:SQd(this,BD(b,87));return;case 1:!this.d&&(this.d=new xMd(j5,this,1));Uxd(this.d);!this.d&&(this.d=new xMd(j5,this,1));ytd(this.d,BD(b,14));return;case 3:PQd(this,BD(b,87));return;case 4:RQd(this,BD(b,836));return;case 5:NQd(this,BD(b,138));return;}did(this,a-aLd((jGd(),XFd)),XKd((c=BD(Ajd(this,16),26),!c?XFd:c),a),b)};_.zh=function $Qd(){return jGd(),XFd};_.Bh=function _Qd(a){var b;switch(a){case 0:SQd(this,null);return;case 1:!this.d&&(this.d=new xMd(j5,this,1));Uxd(this.d);return;case 3:PQd(this,null);return;case 4:RQd(this,null);return;case 5:NQd(this,null);return;}eid(this,a-aLd((jGd(),XFd)),XKd((b=BD(Ajd(this,16),26),!b?XFd:b),a))};_.Ib=function aRd(){var a;a=new Wfb(Eid(this));a.a+=' (expression: ';TQd(this,a);a.a+=')';return a.a};var FQd;var e6=mdb(qte,'EGenericTypeImpl',241);bcb(1969,1964,Vve);_.Xh=function cRd(a,b){bRd(this,a,b)};_.lk=function dRd(a,b){bRd(this,this.gc(),a);return b};_.pi=function eRd(a){return Ut(this.Gi(),a)};_.Zh=function fRd(){return this.$h()};_.Gi=function gRd(){return new O0d(this)};_.$h=function hRd(){return this._h(0)};_._h=function iRd(a){return this.Gi().Zc(a)};_.mk=function jRd(a,b){ze(this,a,true);return b};_.ii=function kRd(a,b){var c,d;d=Vt(this,b);c=this.Zc(a);c.Rb(d);return d};_.ji=function lRd(a,b){var c;ze(this,b,true);c=this.Zc(a);c.Rb(b)};var B8=mdb(yve,'AbstractSequentialInternalEList',1969);bcb(486,1969,Vve,qRd);_.pi=function rRd(a){return Ut(this.Gi(),a)};_.Zh=function sRd(){if(this.b==null){return LRd(),LRd(),KRd}return this.Jk()};_.Gi=function tRd(){return new w4d(this.a,this.b)};_.$h=function uRd(){if(this.b==null){return LRd(),LRd(),KRd}return this.Jk()};_._h=function vRd(a){var b,c;if(this.b==null){if(a<0||a>1){throw vbb(new qcb(gve+a+', size=0'))}return LRd(),LRd(),KRd}c=this.Jk();for(b=0;b0){b=this.c[--this.d];if((!this.e||b.Gj()!=x2||b.aj()!=0)&&(!this.Mk()||this.b.mh(b))){f=this.b.bh(b,this.Lk());this.f=(Q6d(),BD(b,66).Oj());if(this.f||b.$j()){if(this.Lk()){d=BD(f,15);this.k=d}else{d=BD(f,69);this.k=this.j=d}if(JD(this.k,54)){this.o=this.k.gc();this.n=this.o}else{this.p=!this.j?this.k.Zc(this.k.gc()):this.j._h(this.k.gc())}if(!this.p?PRd(this):QRd(this,this.p)){e=!this.p?!this.j?this.k.Xb(--this.n):this.j.pi(--this.n):this.p.Ub();if(this.f){a=BD(e,72);a.ak();c=a.dd();this.i=c}else{c=e;this.i=c}this.g=-3;return true}}else if(f!=null){this.k=null;this.p=null;c=f;this.i=c;this.g=-2;return true}}}this.k=null;this.p=null;this.g=-1;return false}else{e=!this.p?!this.j?this.k.Xb(--this.n):this.j.pi(--this.n):this.p.Ub();if(this.f){a=BD(e,72);a.ak();c=a.dd();this.i=c}else{c=e;this.i=c}this.g=-3;return true}}}};_.Pb=function XRd(){return MRd(this)};_.Tb=function YRd(){return this.a};_.Ub=function ZRd(){var a;if(this.g<-1||this.Sb()){--this.a;this.g=0;a=this.i;this.Sb();return a}else{throw vbb(new utb)}};_.Vb=function $Rd(){return this.a-1};_.Qb=function _Rd(){throw vbb(new bgb)};_.Lk=function aSd(){return false};_.Wb=function bSd(a){throw vbb(new bgb)};_.Mk=function cSd(){return true};_.a=0;_.d=0;_.f=false;_.g=0;_.n=0;_.o=0;var KRd;var P8=mdb(yve,'EContentsEList/FeatureIteratorImpl',279);bcb(697,279,Wve,dSd);_.Lk=function eSd(){return true};var Q8=mdb(yve,'EContentsEList/ResolvingFeatureIteratorImpl',697);bcb(1157,697,Wve,fSd);_.Mk=function gSd(){return false};var g6=mdb(qte,'ENamedElementImpl/1/1',1157);bcb(1158,279,Wve,hSd);_.Mk=function iSd(){return false};var h6=mdb(qte,'ENamedElementImpl/1/2',1158);bcb(36,143,fve,lSd,mSd,nSd,oSd,pSd,qSd,rSd,sSd,tSd,uSd,vSd,wSd,xSd,ySd,zSd,ASd,BSd,CSd,DSd,ESd,FSd,GSd,HSd,ISd,JSd);_._i=function KSd(){return kSd(this)};_.gj=function LSd(){var a;a=kSd(this);if(a){return a.zj()}return null};_.yi=function MSd(a){this.b==-1&&!!this.a&&(this.b=this.c.Xg(this.a.aj(),this.a.Gj()));return this.c.Og(this.b,a)};_.Ai=function NSd(){return this.c};_.hj=function OSd(){var a;a=kSd(this);if(a){return a.Kj()}return false};_.b=-1;var k6=mdb(qte,'ENotificationImpl',36);bcb(399,284,{105:1,92:1,90:1,147:1,191:1,56:1,59:1,108:1,472:1,49:1,97:1,150:1,399:1,284:1,114:1,115:1},SSd);_.Qg=function TSd(a){return PSd(this,a)};_._g=function USd(a,b,c){var d,e,f;switch(a){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab;case 1:return this.zb;case 2:return Bcb(),(this.Bb&256)!=0?true:false;case 3:return Bcb(),(this.Bb&512)!=0?true:false;case 4:return meb(this.s);case 5:return meb(this.t);case 6:return Bcb(),f=this.t,f>1||f==-1?true:false;case 7:return Bcb(),e=this.s,e>=1?true:false;case 8:if(b)return wId(this);return this.r;case 9:return this.q;case 10:return this.Db>>16==10?BD(this.Cb,26):null;case 11:return !this.d&&(this.d=new K4d(u5,this,11)),this.d;case 12:return !this.c&&(this.c=new cUd(p5,this,12,10)),this.c;case 13:return !this.a&&(this.a=new fTd(this,this)),this.a;case 14:return QSd(this);}return bid(this,a-aLd((jGd(),aGd)),XKd((d=BD(Ajd(this,16),26),!d?aGd:d),a),b,c)};_.hh=function VSd(a,b,c){var d,e,f;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Sxd(this.Ab,a,c);case 10:!!this.Cb&&(c=(e=this.Db>>16,e>=0?PSd(this,c):this.Cb.ih(this,-1-e,null,c)));return _hd(this,a,10,c);case 12:return !this.c&&(this.c=new cUd(p5,this,12,10)),Sxd(this.c,a,c);}return f=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),aGd):d),b),66),f.Nj().Qj(this,yjd(this),b-aLd((jGd(),aGd)),a,c)};_.jh=function WSd(a,b,c){var d,e;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Txd(this.Ab,a,c);case 9:return vId(this,c);case 10:return _hd(this,null,10,c);case 11:return !this.d&&(this.d=new K4d(u5,this,11)),Txd(this.d,a,c);case 12:return !this.c&&(this.c=new cUd(p5,this,12,10)),Txd(this.c,a,c);case 14:return Txd(QSd(this),a,c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),aGd):d),b),66),e.Nj().Rj(this,yjd(this),b-aLd((jGd(),aGd)),a,c)};_.lh=function XSd(a){var b,c,d;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return (this.Bb&256)==0;case 3:return (this.Bb&512)==0;case 4:return this.s!=0;case 5:return this.t!=1;case 6:return d=this.t,d>1||d==-1;case 7:return c=this.s,c>=1;case 8:return !!this.r&&!this.q.e&&LQd(this.q).i==0;case 9:return !!this.q&&!(!!this.r&&!this.q.e&&LQd(this.q).i==0);case 10:return !!(this.Db>>16==10?BD(this.Cb,26):null);case 11:return !!this.d&&this.d.i!=0;case 12:return !!this.c&&this.c.i!=0;case 13:return !!this.a&&QSd(this.a.a).i!=0&&!(!!this.b&&QTd(this.b));case 14:return !!this.b&&QTd(this.b);}return cid(this,a-aLd((jGd(),aGd)),XKd((b=BD(Ajd(this,16),26),!b?aGd:b),a))};_.sh=function YSd(a,b){var c,d;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:pnd(this,GD(b));return;case 2:BId(this,Ccb(DD(b)));return;case 3:CId(this,Ccb(DD(b)));return;case 4:AId(this,BD(b,19).a);return;case 5:DId(this,BD(b,19).a);return;case 8:yId(this,BD(b,138));return;case 9:d=xId(this,BD(b,87),null);!!d&&d.Fi();return;case 11:!this.d&&(this.d=new K4d(u5,this,11));Uxd(this.d);!this.d&&(this.d=new K4d(u5,this,11));ytd(this.d,BD(b,14));return;case 12:!this.c&&(this.c=new cUd(p5,this,12,10));Uxd(this.c);!this.c&&(this.c=new cUd(p5,this,12,10));ytd(this.c,BD(b,14));return;case 13:!this.a&&(this.a=new fTd(this,this));vwd(this.a);!this.a&&(this.a=new fTd(this,this));ytd(this.a,BD(b,14));return;case 14:Uxd(QSd(this));ytd(QSd(this),BD(b,14));return;}did(this,a-aLd((jGd(),aGd)),XKd((c=BD(Ajd(this,16),26),!c?aGd:c),a),b)};_.zh=function ZSd(){return jGd(),aGd};_.Bh=function $Sd(a){var b,c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:pnd(this,null);return;case 2:BId(this,true);return;case 3:CId(this,true);return;case 4:AId(this,0);return;case 5:DId(this,1);return;case 8:yId(this,null);return;case 9:c=xId(this,null,null);!!c&&c.Fi();return;case 11:!this.d&&(this.d=new K4d(u5,this,11));Uxd(this.d);return;case 12:!this.c&&(this.c=new cUd(p5,this,12,10));Uxd(this.c);return;case 13:!!this.a&&vwd(this.a);return;case 14:!!this.b&&Uxd(this.b);return;}eid(this,a-aLd((jGd(),aGd)),XKd((b=BD(Ajd(this,16),26),!b?aGd:b),a))};_.Gh=function _Sd(){var a,b;if(this.c){for(a=0,b=this.c.i;ah&&NC(a,h,null);d=0;for(c=new Fyd(QSd(this.a));c.e!=c.i.gc();){b=BD(Dyd(c),87);f=(g=b.c,g?g:(jGd(),YFd));NC(a,d++,f)}return a};_.Yi=function zTd(){var a,b,c,d,e;e=new Hfb;e.a+='[';a=QSd(this.a);for(b=0,d=QSd(this.a).i;b1)}case 5:{return FLd(this,a,b,c,d,this.i-BD(c,15).gc()>0)}default:{return new pSd(this.e,a,this.c,b,c,d,true)}}};_.ij=function WTd(){return true};_.fj=function XTd(){return QTd(this)};_.Xj=function aUd(){Uxd(this)};var o6=mdb(qte,'EOperationImpl/2',1341);bcb(498,1,{1938:1,498:1},bUd);var q6=mdb(qte,'EPackageImpl/1',498);bcb(16,85,Pve,cUd);_.zk=function dUd(){return this.d};_.Ak=function eUd(){return this.b};_.Dk=function fUd(){return true};_.b=0;var b9=mdb(yve,'EObjectContainmentWithInverseEList',16);bcb(353,16,Pve,gUd);_.Ek=function hUd(){return true};_.li=function iUd(a,b){return ILd(this,a,BD(b,56))};var $8=mdb(yve,'EObjectContainmentWithInverseEList/Resolving',353);bcb(298,353,Pve,jUd);_.ci=function kUd(){this.a.tb=null};var r6=mdb(qte,'EPackageImpl/2',298);bcb(1228,1,{},lUd);var s6=mdb(qte,'EPackageImpl/3',1228);bcb(718,43,fke,oUd);_._b=function pUd(a){return ND(a)?Qhb(this,a):!!irb(this.f,a)};var u6=mdb(qte,'EPackageRegistryImpl',718);bcb(509,284,{105:1,92:1,90:1,147:1,191:1,56:1,2017:1,108:1,472:1,49:1,97:1,150:1,509:1,284:1,114:1,115:1},rUd);_.Qg=function sUd(a){return qUd(this,a)};_._g=function tUd(a,b,c){var d,e,f;switch(a){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab;case 1:return this.zb;case 2:return Bcb(),(this.Bb&256)!=0?true:false;case 3:return Bcb(),(this.Bb&512)!=0?true:false;case 4:return meb(this.s);case 5:return meb(this.t);case 6:return Bcb(),f=this.t,f>1||f==-1?true:false;case 7:return Bcb(),e=this.s,e>=1?true:false;case 8:if(b)return wId(this);return this.r;case 9:return this.q;case 10:return this.Db>>16==10?BD(this.Cb,59):null;}return bid(this,a-aLd((jGd(),dGd)),XKd((d=BD(Ajd(this,16),26),!d?dGd:d),a),b,c)};_.hh=function uUd(a,b,c){var d,e,f;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Sxd(this.Ab,a,c);case 10:!!this.Cb&&(c=(e=this.Db>>16,e>=0?qUd(this,c):this.Cb.ih(this,-1-e,null,c)));return _hd(this,a,10,c);}return f=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),dGd):d),b),66),f.Nj().Qj(this,yjd(this),b-aLd((jGd(),dGd)),a,c)};_.jh=function vUd(a,b,c){var d,e;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Txd(this.Ab,a,c);case 9:return vId(this,c);case 10:return _hd(this,null,10,c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),dGd):d),b),66),e.Nj().Rj(this,yjd(this),b-aLd((jGd(),dGd)),a,c)};_.lh=function wUd(a){var b,c,d;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return (this.Bb&256)==0;case 3:return (this.Bb&512)==0;case 4:return this.s!=0;case 5:return this.t!=1;case 6:return d=this.t,d>1||d==-1;case 7:return c=this.s,c>=1;case 8:return !!this.r&&!this.q.e&&LQd(this.q).i==0;case 9:return !!this.q&&!(!!this.r&&!this.q.e&&LQd(this.q).i==0);case 10:return !!(this.Db>>16==10?BD(this.Cb,59):null);}return cid(this,a-aLd((jGd(),dGd)),XKd((b=BD(Ajd(this,16),26),!b?dGd:b),a))};_.zh=function xUd(){return jGd(),dGd};var v6=mdb(qte,'EParameterImpl',509);bcb(99,449,{105:1,92:1,90:1,147:1,191:1,56:1,18:1,170:1,66:1,108:1,472:1,49:1,97:1,150:1,99:1,449:1,284:1,114:1,115:1,677:1},FUd);_._g=function GUd(a,b,c){var d,e,f,g;switch(a){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab;case 1:return this.zb;case 2:return Bcb(),(this.Bb&256)!=0?true:false;case 3:return Bcb(),(this.Bb&512)!=0?true:false;case 4:return meb(this.s);case 5:return meb(this.t);case 6:return Bcb(),g=this.t,g>1||g==-1?true:false;case 7:return Bcb(),e=this.s,e>=1?true:false;case 8:if(b)return wId(this);return this.r;case 9:return this.q;case 10:return Bcb(),(this.Bb&zte)!=0?true:false;case 11:return Bcb(),(this.Bb&Dve)!=0?true:false;case 12:return Bcb(),(this.Bb&Rje)!=0?true:false;case 13:return this.j;case 14:return VId(this);case 15:return Bcb(),(this.Bb&Cve)!=0?true:false;case 16:return Bcb(),(this.Bb&oie)!=0?true:false;case 17:return WId(this);case 18:return Bcb(),(this.Bb&ote)!=0?true:false;case 19:return Bcb(),f=zUd(this),!!f&&(f.Bb&ote)!=0?true:false;case 20:return Bcb(),(this.Bb&Tje)!=0?true:false;case 21:if(b)return zUd(this);return this.b;case 22:if(b)return AUd(this);return yUd(this);case 23:return !this.a&&(this.a=new _4d(b5,this,23)),this.a;}return bid(this,a-aLd((jGd(),eGd)),XKd((d=BD(Ajd(this,16),26),!d?eGd:d),a),b,c)};_.lh=function HUd(a){var b,c,d,e;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return (this.Bb&256)==0;case 3:return (this.Bb&512)==0;case 4:return this.s!=0;case 5:return this.t!=1;case 6:return e=this.t,e>1||e==-1;case 7:return c=this.s,c>=1;case 8:return !!this.r&&!this.q.e&&LQd(this.q).i==0;case 9:return !!this.q&&!(!!this.r&&!this.q.e&&LQd(this.q).i==0);case 10:return (this.Bb&zte)==0;case 11:return (this.Bb&Dve)!=0;case 12:return (this.Bb&Rje)!=0;case 13:return this.j!=null;case 14:return VId(this)!=null;case 15:return (this.Bb&Cve)!=0;case 16:return (this.Bb&oie)!=0;case 17:return !!WId(this);case 18:return (this.Bb&ote)!=0;case 19:return d=zUd(this),!!d&&(d.Bb&ote)!=0;case 20:return (this.Bb&Tje)==0;case 21:return !!this.b;case 22:return !!yUd(this);case 23:return !!this.a&&this.a.i!=0;}return cid(this,a-aLd((jGd(),eGd)),XKd((b=BD(Ajd(this,16),26),!b?eGd:b),a))};_.sh=function IUd(a,b){var c,d;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:cJd(this,GD(b));return;case 2:BId(this,Ccb(DD(b)));return;case 3:CId(this,Ccb(DD(b)));return;case 4:AId(this,BD(b,19).a);return;case 5:DId(this,BD(b,19).a);return;case 8:yId(this,BD(b,138));return;case 9:d=xId(this,BD(b,87),null);!!d&&d.Fi();return;case 10:ZId(this,Ccb(DD(b)));return;case 11:fJd(this,Ccb(DD(b)));return;case 12:dJd(this,Ccb(DD(b)));return;case 13:$Id(this,GD(b));return;case 15:eJd(this,Ccb(DD(b)));return;case 16:aJd(this,Ccb(DD(b)));return;case 18:BUd(this,Ccb(DD(b)));return;case 20:EUd(this,Ccb(DD(b)));return;case 21:DUd(this,BD(b,18));return;case 23:!this.a&&(this.a=new _4d(b5,this,23));Uxd(this.a);!this.a&&(this.a=new _4d(b5,this,23));ytd(this.a,BD(b,14));return;}did(this,a-aLd((jGd(),eGd)),XKd((c=BD(Ajd(this,16),26),!c?eGd:c),a),b)};_.zh=function JUd(){return jGd(),eGd};_.Bh=function KUd(a){var b,c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:JD(this.Cb,88)&&XMd($Kd(BD(this.Cb,88)),4);pnd(this,null);return;case 2:BId(this,true);return;case 3:CId(this,true);return;case 4:AId(this,0);return;case 5:DId(this,1);return;case 8:yId(this,null);return;case 9:c=xId(this,null,null);!!c&&c.Fi();return;case 10:ZId(this,true);return;case 11:fJd(this,false);return;case 12:dJd(this,false);return;case 13:this.i=null;_Id(this,null);return;case 15:eJd(this,false);return;case 16:aJd(this,false);return;case 18:CUd(this,false);JD(this.Cb,88)&&XMd($Kd(BD(this.Cb,88)),2);return;case 20:EUd(this,true);return;case 21:DUd(this,null);return;case 23:!this.a&&(this.a=new _4d(b5,this,23));Uxd(this.a);return;}eid(this,a-aLd((jGd(),eGd)),XKd((b=BD(Ajd(this,16),26),!b?eGd:b),a))};_.Gh=function LUd(){AUd(this);a2d(q1d((O6d(),M6d),this));wId(this);this.Bb|=1};_.Lj=function MUd(){return zUd(this)};_.qk=function NUd(){var a;return a=zUd(this),!!a&&(a.Bb&ote)!=0};_.rk=function OUd(){return (this.Bb&ote)!=0};_.sk=function PUd(){return (this.Bb&Tje)!=0};_.nk=function QUd(a,b){this.c=null;return zId(this,a,b)};_.Ib=function RUd(){var a;if((this.Db&64)!=0)return gJd(this);a=new Jfb(gJd(this));a.a+=' (containment: ';Ffb(a,(this.Bb&ote)!=0);a.a+=', resolveProxies: ';Ffb(a,(this.Bb&Tje)!=0);a.a+=')';return a.a};var w6=mdb(qte,'EReferenceImpl',99);bcb(548,115,{105:1,42:1,92:1,90:1,133:1,56:1,108:1,49:1,97:1,548:1,114:1,115:1},XUd);_.Fb=function bVd(a){return this===a};_.cd=function dVd(){return this.b};_.dd=function eVd(){return this.c};_.Hb=function fVd(){return FCb(this)};_.Uh=function hVd(a){SUd(this,GD(a))};_.ed=function iVd(a){return WUd(this,GD(a))};_._g=function YUd(a,b,c){var d;switch(a){case 0:return this.b;case 1:return this.c;}return bid(this,a-aLd((jGd(),fGd)),XKd((d=BD(Ajd(this,16),26),!d?fGd:d),a),b,c)};_.lh=function ZUd(a){var b;switch(a){case 0:return this.b!=null;case 1:return this.c!=null;}return cid(this,a-aLd((jGd(),fGd)),XKd((b=BD(Ajd(this,16),26),!b?fGd:b),a))};_.sh=function $Ud(a,b){var c;switch(a){case 0:TUd(this,GD(b));return;case 1:VUd(this,GD(b));return;}did(this,a-aLd((jGd(),fGd)),XKd((c=BD(Ajd(this,16),26),!c?fGd:c),a),b)};_.zh=function _Ud(){return jGd(),fGd};_.Bh=function aVd(a){var b;switch(a){case 0:UUd(this,null);return;case 1:VUd(this,null);return;}eid(this,a-aLd((jGd(),fGd)),XKd((b=BD(Ajd(this,16),26),!b?fGd:b),a))};_.Sh=function cVd(){var a;if(this.a==-1){a=this.b;this.a=a==null?0:LCb(a)}return this.a};_.Th=function gVd(a){this.a=a};_.Ib=function jVd(){var a;if((this.Db&64)!=0)return Eid(this);a=new Jfb(Eid(this));a.a+=' (key: ';Efb(a,this.b);a.a+=', value: ';Efb(a,this.c);a.a+=')';return a.a};_.a=-1;_.b=null;_.c=null;var x6=mdb(qte,'EStringToStringMapEntryImpl',548);var D9=odb(yve,'FeatureMap/Entry/Internal');bcb(565,1,Xve);_.Ok=function mVd(a){return this.Pk(BD(a,49))};_.Pk=function nVd(a){return this.Ok(a)};_.Fb=function oVd(a){var b,c;if(this===a){return true}else if(JD(a,72)){b=BD(a,72);if(b.ak()==this.c){c=this.dd();return c==null?b.dd()==null:pb(c,b.dd())}else{return false}}else{return false}};_.ak=function pVd(){return this.c};_.Hb=function qVd(){var a;a=this.dd();return tb(this.c)^(a==null?0:tb(a))};_.Ib=function rVd(){var a,b;a=this.c;b=bKd(a.Hj()).Ph();a.ne();return (b!=null&&b.length!=0?b+':'+a.ne():a.ne())+'='+this.dd()};var y6=mdb(qte,'EStructuralFeatureImpl/BasicFeatureMapEntry',565);bcb(776,565,Xve,uVd);_.Pk=function vVd(a){return new uVd(this.c,a)};_.dd=function wVd(){return this.a};_.Qk=function xVd(a,b,c){return sVd(this,a,this.a,b,c)};_.Rk=function yVd(a,b,c){return tVd(this,a,this.a,b,c)};var z6=mdb(qte,'EStructuralFeatureImpl/ContainmentUpdatingFeatureMapEntry',776);bcb(1314,1,{},zVd);_.Pj=function AVd(a,b,c,d,e){var f;f=BD(gid(a,this.b),215);return f.nl(this.a).Wj(d)};_.Qj=function BVd(a,b,c,d,e){var f;f=BD(gid(a,this.b),215);return f.el(this.a,d,e)};_.Rj=function CVd(a,b,c,d,e){var f;f=BD(gid(a,this.b),215);return f.fl(this.a,d,e)};_.Sj=function DVd(a,b,c){var d;d=BD(gid(a,this.b),215);return d.nl(this.a).fj()};_.Tj=function EVd(a,b,c,d){var e;e=BD(gid(a,this.b),215);e.nl(this.a).Wb(d)};_.Uj=function FVd(a,b,c){return BD(gid(a,this.b),215).nl(this.a)};_.Vj=function GVd(a,b,c){var d;d=BD(gid(a,this.b),215);d.nl(this.a).Xj()};var A6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateFeatureMapDelegator',1314);bcb(89,1,{},IVd,JVd,KVd,LVd);_.Pj=function MVd(a,b,c,d,e){var f;f=b.Ch(c);f==null&&b.Dh(c,f=HVd(this,a));if(!e){switch(this.e){case 50:case 41:return BD(f,589).sj();case 40:return BD(f,215).kl();}}return f};_.Qj=function NVd(a,b,c,d,e){var f,g;g=b.Ch(c);g==null&&b.Dh(c,g=HVd(this,a));f=BD(g,69).lk(d,e);return f};_.Rj=function OVd(a,b,c,d,e){var f;f=b.Ch(c);f!=null&&(e=BD(f,69).mk(d,e));return e};_.Sj=function PVd(a,b,c){var d;d=b.Ch(c);return d!=null&&BD(d,76).fj()};_.Tj=function QVd(a,b,c,d){var e;e=BD(b.Ch(c),76);!e&&b.Dh(c,e=HVd(this,a));e.Wb(d)};_.Uj=function RVd(a,b,c){var d,e;e=b.Ch(c);e==null&&b.Dh(c,e=HVd(this,a));if(JD(e,76)){return BD(e,76)}else{d=BD(b.Ch(c),15);return new iYd(d)}};_.Vj=function SVd(a,b,c){var d;d=BD(b.Ch(c),76);!d&&b.Dh(c,d=HVd(this,a));d.Xj()};_.b=0;_.e=0;var B6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateMany',89);bcb(504,1,{});_.Qj=function WVd(a,b,c,d,e){throw vbb(new bgb)};_.Rj=function XVd(a,b,c,d,e){throw vbb(new bgb)};_.Uj=function YVd(a,b,c){return new ZVd(this,a,b,c)};var TVd;var i7=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingle',504);bcb(1331,1,zve,ZVd);_.Wj=function $Vd(a){return this.a.Pj(this.c,this.d,this.b,a,true)};_.fj=function _Vd(){return this.a.Sj(this.c,this.d,this.b)};_.Wb=function aWd(a){this.a.Tj(this.c,this.d,this.b,a)};_.Xj=function bWd(){this.a.Vj(this.c,this.d,this.b)};_.b=0;var C6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingle/1',1331);bcb(769,504,{},cWd);_.Pj=function dWd(a,b,c,d,e){return Nid(a,a.eh(),a.Vg())==this.b?this.sk()&&d?aid(a):a.eh():null};_.Qj=function eWd(a,b,c,d,e){var f,g;!!a.eh()&&(e=(f=a.Vg(),f>=0?a.Qg(e):a.eh().ih(a,-1-f,null,e)));g=bLd(a.Tg(),this.e);return a.Sg(d,g,e)};_.Rj=function fWd(a,b,c,d,e){var f;f=bLd(a.Tg(),this.e);return a.Sg(null,f,e)};_.Sj=function gWd(a,b,c){var d;d=bLd(a.Tg(),this.e);return !!a.eh()&&a.Vg()==d};_.Tj=function hWd(a,b,c,d){var e,f,g,h,i;if(d!=null&&!fKd(this.a,d)){throw vbb(new Cdb(Yve+(JD(d,56)?gLd(BD(d,56).Tg()):idb(rb(d)))+Zve+this.a+"'"))}e=a.eh();g=bLd(a.Tg(),this.e);if(PD(d)!==PD(e)||a.Vg()!=g&&d!=null){if(p6d(a,BD(d,56)))throw vbb(new Wdb(ste+a.Ib()));i=null;!!e&&(i=(f=a.Vg(),f>=0?a.Qg(i):a.eh().ih(a,-1-f,null,i)));h=BD(d,49);!!h&&(i=h.gh(a,bLd(h.Tg(),this.b),null,i));i=a.Sg(h,g,i);!!i&&i.Fi()}else{a.Lg()&&a.Mg()&&Uhd(a,new nSd(a,1,g,d,d))}};_.Vj=function iWd(a,b,c){var d,e,f,g;d=a.eh();if(d){g=(e=a.Vg(),e>=0?a.Qg(null):a.eh().ih(a,-1-e,null,null));f=bLd(a.Tg(),this.e);g=a.Sg(null,f,g);!!g&&g.Fi()}else{a.Lg()&&a.Mg()&&Uhd(a,new DSd(a,1,this.e,null,null))}};_.sk=function jWd(){return false};var E6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleContainer',769);bcb(1315,769,{},kWd);_.sk=function lWd(){return true};var D6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleContainerResolving',1315);bcb(563,504,{});_.Pj=function oWd(a,b,c,d,e){var f;return f=b.Ch(c),f==null?this.b:PD(f)===PD(TVd)?null:f};_.Sj=function pWd(a,b,c){var d;d=b.Ch(c);return d!=null&&(PD(d)===PD(TVd)||!pb(d,this.b))};_.Tj=function qWd(a,b,c,d){var e,f;if(a.Lg()&&a.Mg()){e=(f=b.Ch(c),f==null?this.b:PD(f)===PD(TVd)?null:f);if(d==null){if(this.c!=null){b.Dh(c,null);d=this.b}else this.b!=null?b.Dh(c,TVd):b.Dh(c,null)}else{this.Sk(d);b.Dh(c,d)}Uhd(a,this.d.Tk(a,1,this.e,e,d))}else{if(d==null){this.c!=null?b.Dh(c,null):this.b!=null?b.Dh(c,TVd):b.Dh(c,null)}else{this.Sk(d);b.Dh(c,d)}}};_.Vj=function rWd(a,b,c){var d,e;if(a.Lg()&&a.Mg()){d=(e=b.Ch(c),e==null?this.b:PD(e)===PD(TVd)?null:e);b.Eh(c);Uhd(a,this.d.Tk(a,1,this.e,d,this.b))}else{b.Eh(c)}};_.Sk=function sWd(a){throw vbb(new Bdb)};var T6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleData',563);bcb($ve,1,{},DWd);_.Tk=function EWd(a,b,c,d,e){return new DSd(a,b,c,d,e)};_.Uk=function FWd(a,b,c,d,e,f){return new FSd(a,b,c,d,e,f)};var tWd,uWd,vWd,wWd,xWd,yWd,zWd,AWd,BWd;var N6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator',$ve);bcb(1332,$ve,{},GWd);_.Tk=function HWd(a,b,c,d,e){return new ISd(a,b,c,Ccb(DD(d)),Ccb(DD(e)))};_.Uk=function IWd(a,b,c,d,e,f){return new JSd(a,b,c,Ccb(DD(d)),Ccb(DD(e)),f)};var F6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/1',1332);bcb(1333,$ve,{},JWd);_.Tk=function KWd(a,b,c,d,e){return new rSd(a,b,c,BD(d,217).a,BD(e,217).a)};_.Uk=function LWd(a,b,c,d,e,f){return new sSd(a,b,c,BD(d,217).a,BD(e,217).a,f)};var G6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/2',1333);bcb(1334,$ve,{},MWd);_.Tk=function NWd(a,b,c,d,e){return new tSd(a,b,c,BD(d,172).a,BD(e,172).a)};_.Uk=function OWd(a,b,c,d,e,f){return new uSd(a,b,c,BD(d,172).a,BD(e,172).a,f)};var H6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/3',1334);bcb(1335,$ve,{},PWd);_.Tk=function QWd(a,b,c,d,e){return new vSd(a,b,c,Edb(ED(d)),Edb(ED(e)))};_.Uk=function RWd(a,b,c,d,e,f){return new wSd(a,b,c,Edb(ED(d)),Edb(ED(e)),f)};var I6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/4',1335);bcb(1336,$ve,{},SWd);_.Tk=function TWd(a,b,c,d,e){return new xSd(a,b,c,BD(d,155).a,BD(e,155).a)};_.Uk=function UWd(a,b,c,d,e,f){return new ySd(a,b,c,BD(d,155).a,BD(e,155).a,f)};var J6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/5',1336);bcb(1337,$ve,{},VWd);_.Tk=function WWd(a,b,c,d,e){return new zSd(a,b,c,BD(d,19).a,BD(e,19).a)};_.Uk=function XWd(a,b,c,d,e,f){return new ASd(a,b,c,BD(d,19).a,BD(e,19).a,f)};var K6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/6',1337);bcb(1338,$ve,{},YWd);_.Tk=function ZWd(a,b,c,d,e){return new BSd(a,b,c,BD(d,162).a,BD(e,162).a)};_.Uk=function $Wd(a,b,c,d,e,f){return new CSd(a,b,c,BD(d,162).a,BD(e,162).a,f)};var L6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/7',1338);bcb(1339,$ve,{},_Wd);_.Tk=function aXd(a,b,c,d,e){return new GSd(a,b,c,BD(d,184).a,BD(e,184).a)};_.Uk=function bXd(a,b,c,d,e,f){return new HSd(a,b,c,BD(d,184).a,BD(e,184).a,f)};var M6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/8',1339);bcb(1317,563,{},cXd);_.Sk=function dXd(a){if(!this.a.wj(a)){throw vbb(new Cdb(Yve+rb(a)+Zve+this.a+"'"))}};var O6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleDataDynamic',1317);bcb(1318,563,{},eXd);_.Sk=function fXd(a){};var P6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleDataStatic',1318);bcb(770,563,{});_.Sj=function gXd(a,b,c){var d;d=b.Ch(c);return d!=null};_.Tj=function hXd(a,b,c,d){var e,f;if(a.Lg()&&a.Mg()){e=true;f=b.Ch(c);if(f==null){e=false;f=this.b}else PD(f)===PD(TVd)&&(f=null);if(d==null){if(this.c!=null){b.Dh(c,null);d=this.b}else{b.Dh(c,TVd)}}else{this.Sk(d);b.Dh(c,d)}Uhd(a,this.d.Uk(a,1,this.e,f,d,!e))}else{if(d==null){this.c!=null?b.Dh(c,null):b.Dh(c,TVd)}else{this.Sk(d);b.Dh(c,d)}}};_.Vj=function iXd(a,b,c){var d,e;if(a.Lg()&&a.Mg()){d=true;e=b.Ch(c);if(e==null){d=false;e=this.b}else PD(e)===PD(TVd)&&(e=null);b.Eh(c);Uhd(a,this.d.Uk(a,2,this.e,e,this.b,d))}else{b.Eh(c)}};var S6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleDataUnsettable',770);bcb(1319,770,{},jXd);_.Sk=function kXd(a){if(!this.a.wj(a)){throw vbb(new Cdb(Yve+rb(a)+Zve+this.a+"'"))}};var Q6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleDataUnsettableDynamic',1319);bcb(1320,770,{},lXd);_.Sk=function mXd(a){};var R6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleDataUnsettableStatic',1320);bcb(398,504,{},nXd);_.Pj=function pXd(a,b,c,d,e){var f,g,h,i,j;j=b.Ch(c);if(this.Kj()&&PD(j)===PD(TVd)){return null}else if(this.sk()&&d&&j!=null){h=BD(j,49);if(h.kh()){i=xid(a,h);if(h!=i){if(!fKd(this.a,i)){throw vbb(new Cdb(Yve+rb(i)+Zve+this.a+"'"))}b.Dh(c,j=i);if(this.rk()){f=BD(i,49);g=h.ih(a,!this.b?-1-bLd(a.Tg(),this.e):bLd(h.Tg(),this.b),null,null);!f.eh()&&(g=f.gh(a,!this.b?-1-bLd(a.Tg(),this.e):bLd(f.Tg(),this.b),null,g));!!g&&g.Fi()}a.Lg()&&a.Mg()&&Uhd(a,new DSd(a,9,this.e,h,i))}}return j}else{return j}};_.Qj=function qXd(a,b,c,d,e){var f,g;g=b.Ch(c);PD(g)===PD(TVd)&&(g=null);b.Dh(c,d);if(this.bj()){if(PD(g)!==PD(d)&&g!=null){f=BD(g,49);e=f.ih(a,bLd(f.Tg(),this.b),null,e)}}else this.rk()&&g!=null&&(e=BD(g,49).ih(a,-1-bLd(a.Tg(),this.e),null,e));if(a.Lg()&&a.Mg()){!e&&(e=new Ixd(4));e.Ei(new DSd(a,1,this.e,g,d))}return e};_.Rj=function rXd(a,b,c,d,e){var f;f=b.Ch(c);PD(f)===PD(TVd)&&(f=null);b.Eh(c);if(a.Lg()&&a.Mg()){!e&&(e=new Ixd(4));this.Kj()?e.Ei(new DSd(a,2,this.e,f,null)):e.Ei(new DSd(a,1,this.e,f,null))}return e};_.Sj=function sXd(a,b,c){var d;d=b.Ch(c);return d!=null};_.Tj=function tXd(a,b,c,d){var e,f,g,h,i;if(d!=null&&!fKd(this.a,d)){throw vbb(new Cdb(Yve+(JD(d,56)?gLd(BD(d,56).Tg()):idb(rb(d)))+Zve+this.a+"'"))}i=b.Ch(c);h=i!=null;this.Kj()&&PD(i)===PD(TVd)&&(i=null);g=null;if(this.bj()){if(PD(i)!==PD(d)){if(i!=null){e=BD(i,49);g=e.ih(a,bLd(e.Tg(),this.b),null,g)}if(d!=null){e=BD(d,49);g=e.gh(a,bLd(e.Tg(),this.b),null,g)}}}else if(this.rk()){if(PD(i)!==PD(d)){i!=null&&(g=BD(i,49).ih(a,-1-bLd(a.Tg(),this.e),null,g));d!=null&&(g=BD(d,49).gh(a,-1-bLd(a.Tg(),this.e),null,g))}}d==null&&this.Kj()?b.Dh(c,TVd):b.Dh(c,d);if(a.Lg()&&a.Mg()){f=new FSd(a,1,this.e,i,d,this.Kj()&&!h);if(!g){Uhd(a,f)}else{g.Ei(f);g.Fi()}}else !!g&&g.Fi()};_.Vj=function uXd(a,b,c){var d,e,f,g,h;h=b.Ch(c);g=h!=null;this.Kj()&&PD(h)===PD(TVd)&&(h=null);f=null;if(h!=null){if(this.bj()){d=BD(h,49);f=d.ih(a,bLd(d.Tg(),this.b),null,f)}else this.rk()&&(f=BD(h,49).ih(a,-1-bLd(a.Tg(),this.e),null,f))}b.Eh(c);if(a.Lg()&&a.Mg()){e=new FSd(a,this.Kj()?2:1,this.e,h,null,g);if(!f){Uhd(a,e)}else{f.Ei(e);f.Fi()}}else !!f&&f.Fi()};_.bj=function vXd(){return false};_.rk=function wXd(){return false};_.sk=function xXd(){return false};_.Kj=function yXd(){return false};var h7=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObject',398);bcb(564,398,{},zXd);_.rk=function AXd(){return true};var _6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainment',564);bcb(1323,564,{},BXd);_.sk=function CXd(){return true};var U6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentResolving',1323);bcb(772,564,{},DXd);_.Kj=function EXd(){return true};var W6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentUnsettable',772);bcb(1325,772,{},FXd);_.sk=function GXd(){return true};var V6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentUnsettableResolving',1325);bcb(640,564,{},HXd);_.bj=function IXd(){return true};var $6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentWithInverse',640);bcb(1324,640,{},JXd);_.sk=function KXd(){return true};var X6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentWithInverseResolving',1324);bcb(773,640,{},LXd);_.Kj=function MXd(){return true};var Z6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentWithInverseUnsettable',773);bcb(1326,773,{},NXd);_.sk=function OXd(){return true};var Y6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentWithInverseUnsettableResolving',1326);bcb(641,398,{},PXd);_.sk=function QXd(){return true};var d7=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectResolving',641);bcb(1327,641,{},RXd);_.Kj=function SXd(){return true};var a7=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectResolvingUnsettable',1327);bcb(774,641,{},TXd);_.bj=function UXd(){return true};var c7=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectResolvingWithInverse',774);bcb(1328,774,{},VXd);_.Kj=function WXd(){return true};var b7=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectResolvingWithInverseUnsettable',1328);bcb(1321,398,{},XXd);_.Kj=function YXd(){return true};var e7=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectUnsettable',1321);bcb(771,398,{},ZXd);_.bj=function $Xd(){return true};var g7=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectWithInverse',771);bcb(1322,771,{},_Xd);_.Kj=function aYd(){return true};var f7=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectWithInverseUnsettable',1322);bcb(775,565,Xve,dYd);_.Pk=function eYd(a){return new dYd(this.a,this.c,a)};_.dd=function fYd(){return this.b};_.Qk=function gYd(a,b,c){return bYd(this,a,this.b,c)};_.Rk=function hYd(a,b,c){return cYd(this,a,this.b,c)};var j7=mdb(qte,'EStructuralFeatureImpl/InverseUpdatingFeatureMapEntry',775);bcb(1329,1,zve,iYd);_.Wj=function jYd(a){return this.a};_.fj=function kYd(){return JD(this.a,95)?BD(this.a,95).fj():!this.a.dc()};_.Wb=function lYd(a){this.a.$b();this.a.Gc(BD(a,15))};_.Xj=function mYd(){JD(this.a,95)?BD(this.a,95).Xj():this.a.$b()};var k7=mdb(qte,'EStructuralFeatureImpl/SettingMany',1329);bcb(1330,565,Xve,nYd);_.Ok=function oYd(a){return new sYd((Q8d(),P8d),this.b.Ih(this.a,a))};_.dd=function pYd(){return null};_.Qk=function qYd(a,b,c){return c};_.Rk=function rYd(a,b,c){return c};var l7=mdb(qte,'EStructuralFeatureImpl/SimpleContentFeatureMapEntry',1330);bcb(642,565,Xve,sYd);_.Ok=function tYd(a){return new sYd(this.c,a)};_.dd=function uYd(){return this.a};_.Qk=function vYd(a,b,c){return c};_.Rk=function wYd(a,b,c){return c};var m7=mdb(qte,'EStructuralFeatureImpl/SimpleFeatureMapEntry',642);bcb(391,497,oue,xYd);_.ri=function yYd(a){return KC(c5,Uhe,26,a,0,1)};_.ni=function zYd(){return false};var o7=mdb(qte,'ESuperAdapter/1',391);bcb(444,438,{105:1,92:1,90:1,147:1,191:1,56:1,108:1,836:1,49:1,97:1,150:1,444:1,114:1,115:1},BYd);_._g=function CYd(a,b,c){var d;switch(a){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab;case 1:return this.zb;case 2:return !this.a&&(this.a=new KYd(this,j5,this)),this.a;}return bid(this,a-aLd((jGd(),iGd)),XKd((d=BD(Ajd(this,16),26),!d?iGd:d),a),b,c)};_.jh=function DYd(a,b,c){var d,e;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Txd(this.Ab,a,c);case 2:return !this.a&&(this.a=new KYd(this,j5,this)),Txd(this.a,a,c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),iGd):d),b),66),e.Nj().Rj(this,yjd(this),b-aLd((jGd(),iGd)),a,c)};_.lh=function EYd(a){var b;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return !!this.a&&this.a.i!=0;}return cid(this,a-aLd((jGd(),iGd)),XKd((b=BD(Ajd(this,16),26),!b?iGd:b),a))};_.sh=function FYd(a,b){var c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:pnd(this,GD(b));return;case 2:!this.a&&(this.a=new KYd(this,j5,this));Uxd(this.a);!this.a&&(this.a=new KYd(this,j5,this));ytd(this.a,BD(b,14));return;}did(this,a-aLd((jGd(),iGd)),XKd((c=BD(Ajd(this,16),26),!c?iGd:c),a),b)};_.zh=function GYd(){return jGd(),iGd};_.Bh=function HYd(a){var b;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:pnd(this,null);return;case 2:!this.a&&(this.a=new KYd(this,j5,this));Uxd(this.a);return;}eid(this,a-aLd((jGd(),iGd)),XKd((b=BD(Ajd(this,16),26),!b?iGd:b),a))};var u7=mdb(qte,'ETypeParameterImpl',444);bcb(445,85,Pve,KYd);_.cj=function LYd(a,b){return IYd(this,BD(a,87),b)};_.dj=function MYd(a,b){return JYd(this,BD(a,87),b)};var q7=mdb(qte,'ETypeParameterImpl/1',445);bcb(634,43,fke,NYd);_.ec=function OYd(){return new RYd(this)};var t7=mdb(qte,'ETypeParameterImpl/2',634);bcb(556,eie,fie,RYd);_.Fc=function SYd(a){return PYd(this,BD(a,87))};_.Gc=function TYd(a){var b,c,d;d=false;for(c=a.Kc();c.Ob();){b=BD(c.Pb(),87);Rhb(this.a,b,'')==null&&(d=true)}return d};_.$b=function UYd(){Uhb(this.a)};_.Hc=function VYd(a){return Mhb(this.a,a)};_.Kc=function WYd(){var a;return a=new nib((new eib(this.a)).a),new ZYd(a)};_.Mc=function XYd(a){return QYd(this,a)};_.gc=function YYd(){return Vhb(this.a)};var s7=mdb(qte,'ETypeParameterImpl/2/1',556);bcb(557,1,aie,ZYd);_.Nb=function $Yd(a){Rrb(this,a)};_.Pb=function aZd(){return BD(lib(this.a).cd(),87)};_.Ob=function _Yd(){return this.a.b};_.Qb=function bZd(){mib(this.a)};var r7=mdb(qte,'ETypeParameterImpl/2/1/1',557);bcb(1276,43,fke,cZd);_._b=function dZd(a){return ND(a)?Qhb(this,a):!!irb(this.f,a)};_.xc=function eZd(a){var b,c;b=ND(a)?Phb(this,a):Wd(irb(this.f,a));if(JD(b,837)){c=BD(b,837);b=c._j();Rhb(this,BD(a,235),b);return b}else return b!=null?b:a==null?(g5d(),f5d):null};var w7=mdb(qte,'EValidatorRegistryImpl',1276);bcb(1313,704,{105:1,92:1,90:1,471:1,147:1,56:1,108:1,1941:1,49:1,97:1,150:1,114:1,115:1},mZd);_.Ih=function nZd(a,b){switch(a.yj()){case 21:case 22:case 23:case 24:case 26:case 31:case 32:case 37:case 38:case 39:case 40:case 43:case 44:case 48:case 49:case 20:return b==null?null:fcb(b);case 25:return gZd(b);case 27:return hZd(b);case 28:return iZd(b);case 29:return b==null?null:CQd(Pmd[0],BD(b,199));case 41:return b==null?'':hdb(BD(b,290));case 42:return fcb(b);case 50:return GD(b);default:throw vbb(new Wdb(tte+a.ne()+ute));}};_.Jh=function oZd(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q;switch(a.G==-1&&(a.G=(m=bKd(a),m?HLd(m.Mh(),a):-1)),a.G){case 0:return c=new OJd,c;case 1:return b=new RHd,b;case 2:return d=new hLd,d;case 4:return e=new MPd,e;case 5:return f=new aQd,f;case 6:return g=new rQd,g;case 7:return h=new $md,h;case 10:return j=new MGd,j;case 11:return k=new SSd,k;case 12:return l=new eod,l;case 13:return n=new rUd,n;case 14:return o=new FUd,o;case 17:return p=new XUd,p;case 18:return i=new UQd,i;case 19:return q=new BYd,q;default:throw vbb(new Wdb(xte+a.zb+ute));}};_.Kh=function pZd(a,b){switch(a.yj()){case 20:return b==null?null:new tgb(b);case 21:return b==null?null:new Ygb(b);case 23:case 22:return b==null?null:fZd(b);case 26:case 24:return b==null?null:Scb(Icb(b,-128,127)<<24>>24);case 25:return Xmd(b);case 27:return jZd(b);case 28:return kZd(b);case 29:return lZd(b);case 32:case 31:return b==null?null:Hcb(b);case 38:case 37:return b==null?null:new Odb(b);case 40:case 39:return b==null?null:meb(Icb(b,Rie,Ohe));case 41:return null;case 42:return b==null?null:null;case 44:case 43:return b==null?null:Aeb(Jcb(b));case 49:case 48:return b==null?null:Web(Icb(b,awe,32767)<<16>>16);case 50:return b;default:throw vbb(new Wdb(tte+a.ne()+ute));}};var x7=mdb(qte,'EcoreFactoryImpl',1313);bcb(547,179,{105:1,92:1,90:1,147:1,191:1,56:1,235:1,108:1,1939:1,49:1,97:1,150:1,179:1,547:1,114:1,115:1,675:1},AZd);_.gb=false;_.hb=false;var rZd,sZd=false;var o8=mdb(qte,'EcorePackageImpl',547);bcb(1184,1,{837:1},EZd);_._j=function FZd(){return I6d(),H6d};var I7=mdb(qte,'EcorePackageImpl/1',1184);bcb(1193,1,nwe,GZd);_.wj=function HZd(a){return JD(a,147)};_.xj=function IZd(a){return KC(k5,Uhe,147,a,0,1)};var y7=mdb(qte,'EcorePackageImpl/10',1193);bcb(1194,1,nwe,JZd);_.wj=function KZd(a){return JD(a,191)};_.xj=function LZd(a){return KC(l5,Uhe,191,a,0,1)};var z7=mdb(qte,'EcorePackageImpl/11',1194);bcb(1195,1,nwe,MZd);_.wj=function NZd(a){return JD(a,56)};_.xj=function OZd(a){return KC(m5,Uhe,56,a,0,1)};var A7=mdb(qte,'EcorePackageImpl/12',1195);bcb(1196,1,nwe,PZd);_.wj=function QZd(a){return JD(a,399)};_.xj=function RZd(a){return KC(n5,Nve,59,a,0,1)};var B7=mdb(qte,'EcorePackageImpl/13',1196);bcb(1197,1,nwe,SZd);_.wj=function TZd(a){return JD(a,235)};_.xj=function UZd(a){return KC(o5,Uhe,235,a,0,1)};var C7=mdb(qte,'EcorePackageImpl/14',1197);bcb(1198,1,nwe,VZd);_.wj=function WZd(a){return JD(a,509)};_.xj=function XZd(a){return KC(p5,Uhe,2017,a,0,1)};var D7=mdb(qte,'EcorePackageImpl/15',1198);bcb(1199,1,nwe,YZd);_.wj=function ZZd(a){return JD(a,99)};_.xj=function $Zd(a){return KC(q5,Mve,18,a,0,1)};var E7=mdb(qte,'EcorePackageImpl/16',1199);bcb(1200,1,nwe,_Zd);_.wj=function a$d(a){return JD(a,170)};_.xj=function b$d(a){return KC(t5,Mve,170,a,0,1)};var F7=mdb(qte,'EcorePackageImpl/17',1200);bcb(1201,1,nwe,c$d);_.wj=function d$d(a){return JD(a,472)};_.xj=function e$d(a){return KC(v5,Uhe,472,a,0,1)};var G7=mdb(qte,'EcorePackageImpl/18',1201);bcb(1202,1,nwe,f$d);_.wj=function g$d(a){return JD(a,548)};_.xj=function h$d(a){return KC(x6,kve,548,a,0,1)};var H7=mdb(qte,'EcorePackageImpl/19',1202);bcb(1185,1,nwe,i$d);_.wj=function j$d(a){return JD(a,322)};_.xj=function k$d(a){return KC(b5,Mve,34,a,0,1)};var T7=mdb(qte,'EcorePackageImpl/2',1185);bcb(1203,1,nwe,l$d);_.wj=function m$d(a){return JD(a,241)};_.xj=function n$d(a){return KC(j5,Tve,87,a,0,1)};var J7=mdb(qte,'EcorePackageImpl/20',1203);bcb(1204,1,nwe,o$d);_.wj=function p$d(a){return JD(a,444)};_.xj=function q$d(a){return KC(u5,Uhe,836,a,0,1)};var K7=mdb(qte,'EcorePackageImpl/21',1204);bcb(1205,1,nwe,r$d);_.wj=function s$d(a){return KD(a)};_.xj=function t$d(a){return KC(wI,nie,476,a,8,1)};var L7=mdb(qte,'EcorePackageImpl/22',1205);bcb(1206,1,nwe,u$d);_.wj=function v$d(a){return JD(a,190)};_.xj=function w$d(a){return KC(SD,nie,190,a,0,2)};var M7=mdb(qte,'EcorePackageImpl/23',1206);bcb(1207,1,nwe,x$d);_.wj=function y$d(a){return JD(a,217)};_.xj=function z$d(a){return KC(xI,nie,217,a,0,1)};var N7=mdb(qte,'EcorePackageImpl/24',1207);bcb(1208,1,nwe,A$d);_.wj=function B$d(a){return JD(a,172)};_.xj=function C$d(a){return KC(yI,nie,172,a,0,1)};var O7=mdb(qte,'EcorePackageImpl/25',1208);bcb(1209,1,nwe,D$d);_.wj=function E$d(a){return JD(a,199)};_.xj=function F$d(a){return KC($J,nie,199,a,0,1)};var P7=mdb(qte,'EcorePackageImpl/26',1209);bcb(1210,1,nwe,G$d);_.wj=function H$d(a){return false};_.xj=function I$d(a){return KC(O4,Uhe,2110,a,0,1)};var Q7=mdb(qte,'EcorePackageImpl/27',1210);bcb(1211,1,nwe,J$d);_.wj=function K$d(a){return LD(a)};_.xj=function L$d(a){return KC(BI,nie,333,a,7,1)};var R7=mdb(qte,'EcorePackageImpl/28',1211);bcb(1212,1,nwe,M$d);_.wj=function N$d(a){return JD(a,58)};_.xj=function O$d(a){return KC(T4,eme,58,a,0,1)};var S7=mdb(qte,'EcorePackageImpl/29',1212);bcb(1186,1,nwe,P$d);_.wj=function Q$d(a){return JD(a,510)};_.xj=function R$d(a){return KC(a5,{3:1,4:1,5:1,1934:1},590,a,0,1)};var c8=mdb(qte,'EcorePackageImpl/3',1186);bcb(1213,1,nwe,S$d);_.wj=function T$d(a){return JD(a,573)};_.xj=function U$d(a){return KC(U4,Uhe,1940,a,0,1)};var U7=mdb(qte,'EcorePackageImpl/30',1213);bcb(1214,1,nwe,V$d);_.wj=function W$d(a){return JD(a,153)};_.xj=function X$d(a){return KC(O9,eme,153,a,0,1)};var V7=mdb(qte,'EcorePackageImpl/31',1214);bcb(1215,1,nwe,Y$d);_.wj=function Z$d(a){return JD(a,72)};_.xj=function $$d(a){return KC(E9,owe,72,a,0,1)};var W7=mdb(qte,'EcorePackageImpl/32',1215);bcb(1216,1,nwe,_$d);_.wj=function a_d(a){return JD(a,155)};_.xj=function b_d(a){return KC(FI,nie,155,a,0,1)};var X7=mdb(qte,'EcorePackageImpl/33',1216);bcb(1217,1,nwe,c_d);_.wj=function d_d(a){return JD(a,19)};_.xj=function e_d(a){return KC(JI,nie,19,a,0,1)};var Y7=mdb(qte,'EcorePackageImpl/34',1217);bcb(1218,1,nwe,f_d);_.wj=function g_d(a){return JD(a,290)};_.xj=function h_d(a){return KC(AI,Uhe,290,a,0,1)};var Z7=mdb(qte,'EcorePackageImpl/35',1218);bcb(1219,1,nwe,i_d);_.wj=function j_d(a){return JD(a,162)};_.xj=function k_d(a){return KC(MI,nie,162,a,0,1)};var $7=mdb(qte,'EcorePackageImpl/36',1219);bcb(1220,1,nwe,l_d);_.wj=function m_d(a){return JD(a,83)};_.xj=function n_d(a){return KC(DK,Uhe,83,a,0,1)};var _7=mdb(qte,'EcorePackageImpl/37',1220);bcb(1221,1,nwe,o_d);_.wj=function p_d(a){return JD(a,591)};_.xj=function q_d(a){return KC(v8,Uhe,591,a,0,1)};var a8=mdb(qte,'EcorePackageImpl/38',1221);bcb(1222,1,nwe,r_d);_.wj=function s_d(a){return false};_.xj=function t_d(a){return KC(u8,Uhe,2111,a,0,1)};var b8=mdb(qte,'EcorePackageImpl/39',1222);bcb(1187,1,nwe,u_d);_.wj=function v_d(a){return JD(a,88)};_.xj=function w_d(a){return KC(c5,Uhe,26,a,0,1)};var i8=mdb(qte,'EcorePackageImpl/4',1187);bcb(1223,1,nwe,x_d);_.wj=function y_d(a){return JD(a,184)};_.xj=function z_d(a){return KC(UI,nie,184,a,0,1)};var d8=mdb(qte,'EcorePackageImpl/40',1223);bcb(1224,1,nwe,A_d);_.wj=function B_d(a){return ND(a)};_.xj=function C_d(a){return KC(ZI,nie,2,a,6,1)};var e8=mdb(qte,'EcorePackageImpl/41',1224);bcb(1225,1,nwe,D_d);_.wj=function E_d(a){return JD(a,588)};_.xj=function F_d(a){return KC(X4,Uhe,588,a,0,1)};var f8=mdb(qte,'EcorePackageImpl/42',1225);bcb(1226,1,nwe,G_d);_.wj=function H_d(a){return false};_.xj=function I_d(a){return KC(V4,nie,2112,a,0,1)};var g8=mdb(qte,'EcorePackageImpl/43',1226);bcb(1227,1,nwe,J_d);_.wj=function K_d(a){return JD(a,42)};_.xj=function L_d(a){return KC(CK,zie,42,a,0,1)};var h8=mdb(qte,'EcorePackageImpl/44',1227);bcb(1188,1,nwe,M_d);_.wj=function N_d(a){return JD(a,138)};_.xj=function O_d(a){return KC(d5,Uhe,138,a,0,1)};var j8=mdb(qte,'EcorePackageImpl/5',1188);bcb(1189,1,nwe,P_d);_.wj=function Q_d(a){return JD(a,148)};_.xj=function R_d(a){return KC(f5,Uhe,148,a,0,1)};var k8=mdb(qte,'EcorePackageImpl/6',1189);bcb(1190,1,nwe,S_d);_.wj=function T_d(a){return JD(a,457)};_.xj=function U_d(a){return KC(h5,Uhe,671,a,0,1)};var l8=mdb(qte,'EcorePackageImpl/7',1190);bcb(1191,1,nwe,V_d);_.wj=function W_d(a){return JD(a,573)};_.xj=function X_d(a){return KC(g5,Uhe,678,a,0,1)};var m8=mdb(qte,'EcorePackageImpl/8',1191);bcb(1192,1,nwe,Y_d);_.wj=function Z_d(a){return JD(a,471)};_.xj=function $_d(a){return KC(i5,Uhe,471,a,0,1)};var n8=mdb(qte,'EcorePackageImpl/9',1192);bcb(1025,1982,ive,c0d);_.bi=function d0d(a,b){__d(this,BD(b,415))};_.fi=function e0d(a,b){a0d(this,a,BD(b,415))};var q8=mdb(qte,'MinimalEObjectImpl/1ArrayDelegatingAdapterList',1025);bcb(1026,143,fve,f0d);_.Ai=function g0d(){return this.a.a};var p8=mdb(qte,'MinimalEObjectImpl/1ArrayDelegatingAdapterList/1',1026);bcb(1053,1052,{},i0d);var t8=mdb('org.eclipse.emf.ecore.plugin','EcorePlugin',1053);var v8=odb(pwe,'Resource');bcb(781,1378,qwe);_.Yk=function m0d(a){};_.Zk=function n0d(a){};_.Vk=function o0d(){return !this.a&&(this.a=new z0d(this)),this.a};_.Wk=function p0d(a){var b,c,d,e,f;d=a.length;if(d>0){BCb(0,a.length);if(a.charCodeAt(0)==47){f=new Skb(4);e=1;for(b=1;b0&&(a=a.substr(0,c))}}}return k0d(this,a)};_.Xk=function q0d(){return this.c};_.Ib=function r0d(){var a;return hdb(this.gm)+'@'+(a=tb(this)>>>0,a.toString(16))+" uri='"+this.d+"'"};_.b=false;var z8=mdb(rwe,'ResourceImpl',781);bcb(1379,781,qwe,s0d);var w8=mdb(rwe,'BinaryResourceImpl',1379);bcb(1169,694,pue);_.si=function v0d(a){return JD(a,56)?t0d(this,BD(a,56)):JD(a,591)?new Fyd(BD(a,591).Vk()):PD(a)===PD(this.f)?BD(a,14).Kc():(LCd(),KCd.a)};_.Ob=function w0d(){return u0d(this)};_.a=false;var z9=mdb(yve,'EcoreUtil/ContentTreeIterator',1169);bcb(1380,1169,pue,x0d);_.si=function y0d(a){return PD(a)===PD(this.f)?BD(a,15).Kc():new C6d(BD(a,56))};var x8=mdb(rwe,'ResourceImpl/5',1380);bcb(648,1994,Ove,z0d);_.Hc=function A0d(a){return this.i<=4?pud(this,a):JD(a,49)&&BD(a,49).Zg()==this.a};_.bi=function B0d(a,b){a==this.i-1&&(this.a.b||(this.a.b=true,null))};_.di=function C0d(a,b){a==0?this.a.b||(this.a.b=true,null):Atd(this,a,b)};_.fi=function D0d(a,b){};_.gi=function E0d(a,b,c){};_.aj=function F0d(){return 2};_.Ai=function G0d(){return this.a};_.bj=function H0d(){return true};_.cj=function I0d(a,b){var c;c=BD(a,49);b=c.wh(this.a,b);return b};_.dj=function J0d(a,b){var c;c=BD(a,49);return c.wh(null,b)};_.ej=function K0d(){return false};_.hi=function L0d(){return true};_.ri=function M0d(a){return KC(m5,Uhe,56,a,0,1)};_.ni=function N0d(){return false};var y8=mdb(rwe,'ResourceImpl/ContentsEList',648);bcb(957,1964,Lie,O0d);_.Zc=function P0d(a){return this.a._h(a)};_.gc=function Q0d(){return this.a.gc()};var A8=mdb(yve,'AbstractSequentialInternalEList/1',957);var K6d,L6d,M6d,N6d;bcb(624,1,{},y1d);var R0d,S0d;var G8=mdb(yve,'BasicExtendedMetaData',624);bcb(1160,1,{},C1d);_.$k=function D1d(){return null};_._k=function E1d(){this.a==-2&&A1d(this,W0d(this.d,this.b));return this.a};_.al=function F1d(){return null};_.bl=function G1d(){return mmb(),mmb(),jmb};_.ne=function H1d(){this.c==Gwe&&B1d(this,_0d(this.d,this.b));return this.c};_.cl=function I1d(){return 0};_.a=-2;_.c=Gwe;var C8=mdb(yve,'BasicExtendedMetaData/EClassExtendedMetaDataImpl',1160);bcb(1161,1,{},O1d);_.$k=function P1d(){this.a==(T0d(),R0d)&&J1d(this,V0d(this.f,this.b));return this.a};_._k=function Q1d(){return 0};_.al=function R1d(){this.c==(T0d(),R0d)&&K1d(this,Z0d(this.f,this.b));return this.c};_.bl=function S1d(){!this.d&&L1d(this,$0d(this.f,this.b));return this.d};_.ne=function T1d(){this.e==Gwe&&M1d(this,_0d(this.f,this.b));return this.e};_.cl=function U1d(){this.g==-2&&N1d(this,c1d(this.f,this.b));return this.g};_.e=Gwe;_.g=-2;var D8=mdb(yve,'BasicExtendedMetaData/EDataTypeExtendedMetaDataImpl',1161);bcb(1159,1,{},Y1d);_.b=false;_.c=false;var E8=mdb(yve,'BasicExtendedMetaData/EPackageExtendedMetaDataImpl',1159);bcb(1162,1,{},j2d);_.c=-2;_.e=Gwe;_.f=Gwe;var F8=mdb(yve,'BasicExtendedMetaData/EStructuralFeatureExtendedMetaDataImpl',1162);bcb(585,622,Pve,k2d);_.aj=function l2d(){return this.c};_.Fk=function m2d(){return false};_.li=function n2d(a,b){return b};_.c=0;var T8=mdb(yve,'EDataTypeEList',585);var O9=odb(yve,'FeatureMap');bcb(75,585,{3:1,4:1,20:1,28:1,52:1,14:1,15:1,54:1,67:1,63:1,58:1,76:1,153:1,215:1,1937:1,69:1,95:1},u3d);_.Vc=function v3d(a,b){o2d(this,a,BD(b,72))};_.Fc=function w3d(a){return r2d(this,BD(a,72))};_.Yh=function B3d(a){w2d(this,BD(a,72))};_.cj=function M3d(a,b){return O2d(this,BD(a,72),b)};_.dj=function N3d(a,b){return Q2d(this,BD(a,72),b)};_.ii=function P3d(a,b){return W2d(this,a,b)};_.li=function R3d(a,b){return _2d(this,a,BD(b,72))};_._c=function T3d(a,b){return c3d(this,a,BD(b,72))};_.jj=function X3d(a,b){return i3d(this,BD(a,72),b)};_.kj=function Y3d(a,b){return k3d(this,BD(a,72),b)};_.lj=function Z3d(a,b,c){return l3d(this,BD(a,72),BD(b,72),c)};_.oi=function _3d(a,b){return t3d(this,a,BD(b,72))};_.dl=function x3d(a,b){return q2d(this,a,b)};_.Wc=function y3d(a,b){var c,d,e,f,g,h,i,j,k;j=new zud(b.gc());for(e=b.Kc();e.Ob();){d=BD(e.Pb(),72);f=d.ak();if(T6d(this.e,f)){(!f.hi()||!E2d(this,f,d.dd())&&!pud(j,d))&&wtd(j,d)}else{k=S6d(this.e.Tg(),f);c=BD(this.g,119);g=true;for(h=0;h=0){b=a[this.c];if(this.k.rl(b.ak())){this.j=this.f?b:b.dd();this.i=-2;return true}}this.i=-1;this.g=-1;return false};var H8=mdb(yve,'BasicFeatureMap/FeatureEIterator',410);bcb(662,410,jie,s4d);_.Lk=function t4d(){return true};var I8=mdb(yve,'BasicFeatureMap/ResolvingFeatureEIterator',662);bcb(955,486,Vve,u4d);_.Gi=function v4d(){return this};var M8=mdb(yve,'EContentsEList/1',955);bcb(956,486,Vve,w4d);_.Lk=function x4d(){return false};var N8=mdb(yve,'EContentsEList/2',956);bcb(954,279,Wve,y4d);_.Nk=function z4d(a){};_.Ob=function A4d(){return false};_.Sb=function B4d(){return false};var O8=mdb(yve,'EContentsEList/FeatureIteratorImpl/1',954);bcb(825,585,Pve,C4d);_.ci=function D4d(){this.a=true};_.fj=function E4d(){return this.a};_.Xj=function F4d(){var a;Uxd(this);if(oid(this.e)){a=this.a;this.a=false;Uhd(this.e,new qSd(this.e,2,this.c,a,false))}else{this.a=false}};_.a=false;var S8=mdb(yve,'EDataTypeEList/Unsettable',825);bcb(1849,585,Pve,G4d);_.hi=function H4d(){return true};var V8=mdb(yve,'EDataTypeUniqueEList',1849);bcb(1850,825,Pve,I4d);_.hi=function J4d(){return true};var U8=mdb(yve,'EDataTypeUniqueEList/Unsettable',1850);bcb(139,85,Pve,K4d);_.Ek=function L4d(){return true};_.li=function M4d(a,b){return ILd(this,a,BD(b,56))};var W8=mdb(yve,'EObjectContainmentEList/Resolving',139);bcb(1163,545,Pve,N4d);_.Ek=function O4d(){return true};_.li=function P4d(a,b){return ILd(this,a,BD(b,56))};var X8=mdb(yve,'EObjectContainmentEList/Unsettable/Resolving',1163);bcb(748,16,Pve,Q4d);_.ci=function R4d(){this.a=true};_.fj=function S4d(){return this.a};_.Xj=function T4d(){var a;Uxd(this);if(oid(this.e)){a=this.a;this.a=false;Uhd(this.e,new qSd(this.e,2,this.c,a,false))}else{this.a=false}};_.a=false;var a9=mdb(yve,'EObjectContainmentWithInverseEList/Unsettable',748);bcb(1173,748,Pve,U4d);_.Ek=function V4d(){return true};_.li=function W4d(a,b){return ILd(this,a,BD(b,56))};var _8=mdb(yve,'EObjectContainmentWithInverseEList/Unsettable/Resolving',1173);bcb(743,496,Pve,X4d);_.ci=function Y4d(){this.a=true};_.fj=function Z4d(){return this.a};_.Xj=function $4d(){var a;Uxd(this);if(oid(this.e)){a=this.a;this.a=false;Uhd(this.e,new qSd(this.e,2,this.c,a,false))}else{this.a=false}};_.a=false;var c9=mdb(yve,'EObjectEList/Unsettable',743);bcb(328,496,Pve,_4d);_.Ek=function a5d(){return true};_.li=function b5d(a,b){return ILd(this,a,BD(b,56))};var f9=mdb(yve,'EObjectResolvingEList',328);bcb(1641,743,Pve,c5d);_.Ek=function d5d(){return true};_.li=function e5d(a,b){return ILd(this,a,BD(b,56))};var e9=mdb(yve,'EObjectResolvingEList/Unsettable',1641);bcb(1381,1,{},h5d);var f5d;var g9=mdb(yve,'EObjectValidator',1381);bcb(546,496,Pve,i5d);_.zk=function j5d(){return this.d};_.Ak=function k5d(){return this.b};_.bj=function l5d(){return true};_.Dk=function m5d(){return true};_.b=0;var k9=mdb(yve,'EObjectWithInverseEList',546);bcb(1176,546,Pve,n5d);_.Ck=function o5d(){return true};var h9=mdb(yve,'EObjectWithInverseEList/ManyInverse',1176);bcb(625,546,Pve,p5d);_.ci=function q5d(){this.a=true};_.fj=function r5d(){return this.a};_.Xj=function s5d(){var a;Uxd(this);if(oid(this.e)){a=this.a;this.a=false;Uhd(this.e,new qSd(this.e,2,this.c,a,false))}else{this.a=false}};_.a=false;var j9=mdb(yve,'EObjectWithInverseEList/Unsettable',625);bcb(1175,625,Pve,t5d);_.Ck=function u5d(){return true};var i9=mdb(yve,'EObjectWithInverseEList/Unsettable/ManyInverse',1175);bcb(749,546,Pve,v5d);_.Ek=function w5d(){return true};_.li=function x5d(a,b){return ILd(this,a,BD(b,56))};var o9=mdb(yve,'EObjectWithInverseResolvingEList',749);bcb(31,749,Pve,y5d);_.Ck=function z5d(){return true};var l9=mdb(yve,'EObjectWithInverseResolvingEList/ManyInverse',31);bcb(750,625,Pve,A5d);_.Ek=function B5d(){return true};_.li=function C5d(a,b){return ILd(this,a,BD(b,56))};var n9=mdb(yve,'EObjectWithInverseResolvingEList/Unsettable',750);bcb(1174,750,Pve,D5d);_.Ck=function E5d(){return true};var m9=mdb(yve,'EObjectWithInverseResolvingEList/Unsettable/ManyInverse',1174);bcb(1164,622,Pve);_.ai=function F5d(){return (this.b&1792)==0};_.ci=function G5d(){this.b|=1};_.Bk=function H5d(){return (this.b&4)!=0};_.bj=function I5d(){return (this.b&40)!=0};_.Ck=function J5d(){return (this.b&16)!=0};_.Dk=function K5d(){return (this.b&8)!=0};_.Ek=function L5d(){return (this.b&Dve)!=0};_.rk=function M5d(){return (this.b&32)!=0};_.Fk=function N5d(){return (this.b&zte)!=0};_.wj=function O5d(a){return !this.d?this.ak().Yj().wj(a):qEd(this.d,a)};_.fj=function P5d(){return (this.b&2)!=0?(this.b&1)!=0:this.i!=0};_.hi=function Q5d(){return (this.b&128)!=0};_.Xj=function S5d(){var a;Uxd(this);if((this.b&2)!=0){if(oid(this.e)){a=(this.b&1)!=0;this.b&=-2;GLd(this,new qSd(this.e,2,bLd(this.e.Tg(),this.ak()),a,false))}else{this.b&=-2}}};_.ni=function T5d(){return (this.b&1536)==0};_.b=0;var q9=mdb(yve,'EcoreEList/Generic',1164);bcb(1165,1164,Pve,U5d);_.ak=function V5d(){return this.a};var p9=mdb(yve,'EcoreEList/Dynamic',1165);bcb(747,63,oue,W5d);_.ri=function X5d(a){return izd(this.a.a,a)};var u9=mdb(yve,'EcoreEMap/1',747);bcb(746,85,Pve,Y5d);_.bi=function Z5d(a,b){uAd(this.b,BD(b,133))};_.di=function $5d(a,b){tAd(this.b)};_.ei=function _5d(a,b,c){var d;++(d=this.b,BD(b,133),d).e};_.fi=function a6d(a,b){vAd(this.b,BD(b,133))};_.gi=function b6d(a,b,c){vAd(this.b,BD(c,133));PD(c)===PD(b)&&BD(c,133).Th(CAd(BD(b,133).cd()));uAd(this.b,BD(b,133))};var v9=mdb(yve,'EcoreEMap/DelegateEObjectContainmentEList',746);bcb(1171,151,Ave,c6d);var x9=mdb(yve,'EcoreEMap/Unsettable',1171);bcb(1172,746,Pve,d6d);_.ci=function e6d(){this.a=true};_.fj=function f6d(){return this.a};_.Xj=function g6d(){var a;Uxd(this);if(oid(this.e)){a=this.a;this.a=false;Uhd(this.e,new qSd(this.e,2,this.c,a,false))}else{this.a=false}};_.a=false;var w9=mdb(yve,'EcoreEMap/Unsettable/UnsettableDelegateEObjectContainmentEList',1172);bcb(1168,228,fke,A6d);_.a=false;_.b=false;var A9=mdb(yve,'EcoreUtil/Copier',1168);bcb(745,1,aie,C6d);_.Nb=function D6d(a){Rrb(this,a)};_.Ob=function E6d(){return B6d(this)};_.Pb=function F6d(){var a;B6d(this);a=this.b;this.b=null;return a};_.Qb=function G6d(){this.a.Qb()};var B9=mdb(yve,'EcoreUtil/ProperContentIterator',745);bcb(1382,1381,{},J6d);var H6d;var C9=mdb(yve,'EcoreValidator',1382);var P6d;var N9=odb(yve,'FeatureMapUtil/Validator');bcb(1260,1,{1942:1},U6d);_.rl=function V6d(a){return true};var F9=mdb(yve,'FeatureMapUtil/1',1260);bcb(757,1,{1942:1},Z6d);_.rl=function $6d(a){var b;if(this.c==a)return true;b=DD(Ohb(this.a,a));if(b==null){if(Y6d(this,a)){_6d(this.a,a,(Bcb(),Acb));return true}else{_6d(this.a,a,(Bcb(),zcb));return false}}else{return b==(Bcb(),Acb)}};_.e=false;var W6d;var I9=mdb(yve,'FeatureMapUtil/BasicValidator',757);bcb(758,43,fke,a7d);var H9=mdb(yve,'FeatureMapUtil/BasicValidator/Cache',758);bcb(501,52,{20:1,28:1,52:1,14:1,15:1,58:1,76:1,69:1,95:1},f7d);_.Vc=function g7d(a,b){p2d(this.c,this.b,a,b)};_.Fc=function h7d(a){return q2d(this.c,this.b,a)};_.Wc=function i7d(a,b){return s2d(this.c,this.b,a,b)};_.Gc=function j7d(a){return b7d(this,a)};_.Xh=function k7d(a,b){u2d(this.c,this.b,a,b)};_.lk=function l7d(a,b){return x2d(this.c,this.b,a,b)};_.pi=function m7d(a){return J2d(this.c,this.b,a,false)};_.Zh=function n7d(){return y2d(this.c,this.b)};_.$h=function o7d(){return z2d(this.c,this.b)};_._h=function p7d(a){return A2d(this.c,this.b,a)};_.mk=function q7d(a,b){return c7d(this,a,b)};_.$b=function r7d(){d7d(this)};_.Hc=function s7d(a){return E2d(this.c,this.b,a)};_.Ic=function t7d(a){return G2d(this.c,this.b,a)};_.Xb=function u7d(a){return J2d(this.c,this.b,a,true)};_.Wj=function v7d(a){return this};_.Xc=function w7d(a){return L2d(this.c,this.b,a)};_.dc=function x7d(){return e7d(this)};_.fj=function y7d(){return !R2d(this.c,this.b)};_.Kc=function z7d(){return S2d(this.c,this.b)};_.Yc=function A7d(){return U2d(this.c,this.b)};_.Zc=function B7d(a){return V2d(this.c,this.b,a)};_.ii=function C7d(a,b){return X2d(this.c,this.b,a,b)};_.ji=function D7d(a,b){Y2d(this.c,this.b,a,b)};_.$c=function E7d(a){return Z2d(this.c,this.b,a)};_.Mc=function F7d(a){return $2d(this.c,this.b,a)};_._c=function G7d(a,b){return e3d(this.c,this.b,a,b)};_.Wb=function H7d(a){D2d(this.c,this.b);b7d(this,BD(a,15))};_.gc=function I7d(){return n3d(this.c,this.b)};_.Pc=function J7d(){return o3d(this.c,this.b)};_.Qc=function K7d(a){return q3d(this.c,this.b,a)};_.Ib=function L7d(){var a,b;b=new Hfb;b.a+='[';for(a=y2d(this.c,this.b);b4d(a);){Efb(b,xfb(d4d(a)));b4d(a)&&(b.a+=She,b)}b.a+=']';return b.a};_.Xj=function M7d(){D2d(this.c,this.b)};var J9=mdb(yve,'FeatureMapUtil/FeatureEList',501);bcb(627,36,fve,O7d);_.yi=function P7d(a){return N7d(this,a)};_.Di=function Q7d(a){var b,c,d,e,f,g,h;switch(this.d){case 1:case 2:{f=a.Ai();if(PD(f)===PD(this.c)&&N7d(this,null)==a.yi(null)){this.g=a.zi();a.xi()==1&&(this.d=1);return true}break}case 3:{e=a.xi();switch(e){case 3:{f=a.Ai();if(PD(f)===PD(this.c)&&N7d(this,null)==a.yi(null)){this.d=5;b=new zud(2);wtd(b,this.g);wtd(b,a.zi());this.g=b;return true}break}}break}case 5:{e=a.xi();switch(e){case 3:{f=a.Ai();if(PD(f)===PD(this.c)&&N7d(this,null)==a.yi(null)){c=BD(this.g,14);c.Fc(a.zi());return true}break}}break}case 4:{e=a.xi();switch(e){case 3:{f=a.Ai();if(PD(f)===PD(this.c)&&N7d(this,null)==a.yi(null)){this.d=1;this.g=a.zi();return true}break}case 4:{f=a.Ai();if(PD(f)===PD(this.c)&&N7d(this,null)==a.yi(null)){this.d=6;h=new zud(2);wtd(h,this.n);wtd(h,a.Bi());this.n=h;g=OC(GC(WD,1),oje,25,15,[this.o,a.Ci()]);this.g=g;return true}break}}break}case 6:{e=a.xi();switch(e){case 4:{f=a.Ai();if(PD(f)===PD(this.c)&&N7d(this,null)==a.yi(null)){c=BD(this.n,14);c.Fc(a.Bi());g=BD(this.g,48);d=KC(WD,oje,25,g.length+1,15,1);$fb(g,0,d,0,g.length);d[g.length]=a.Ci();this.g=d;return true}break}}break}}return false};var K9=mdb(yve,'FeatureMapUtil/FeatureENotificationImpl',627);bcb(552,501,{20:1,28:1,52:1,14:1,15:1,58:1,76:1,153:1,215:1,1937:1,69:1,95:1},R7d);_.dl=function S7d(a,b){return q2d(this.c,a,b)};_.el=function T7d(a,b,c){return x2d(this.c,a,b,c)};_.fl=function U7d(a,b,c){return C2d(this.c,a,b,c)};_.gl=function V7d(){return this};_.hl=function W7d(a,b){return K2d(this.c,a,b)};_.il=function X7d(a){return BD(J2d(this.c,this.b,a,false),72).ak()};_.jl=function Y7d(a){return BD(J2d(this.c,this.b,a,false),72).dd()};_.kl=function Z7d(){return this.a};_.ll=function $7d(a){return !R2d(this.c,a)};_.ml=function _7d(a,b){f3d(this.c,a,b)};_.nl=function a8d(a){return g3d(this.c,a)};_.ol=function b8d(a){s3d(this.c,a)};var L9=mdb(yve,'FeatureMapUtil/FeatureFeatureMap',552);bcb(1259,1,zve,c8d);_.Wj=function d8d(a){return J2d(this.b,this.a,-1,a)};_.fj=function e8d(){return !R2d(this.b,this.a)};_.Wb=function f8d(a){f3d(this.b,this.a,a)};_.Xj=function g8d(){D2d(this.b,this.a)};var M9=mdb(yve,'FeatureMapUtil/FeatureValue',1259);var h8d,i8d,j8d,k8d,l8d;var Q9=odb(Iwe,'AnyType');bcb(666,60,Tie,n8d);var R9=mdb(Iwe,'InvalidDatatypeValueException',666);var S9=odb(Iwe,Jwe);var T9=odb(Iwe,Kwe);var U9=odb(Iwe,Lwe);var o8d;var q8d;var s8d,t8d,u8d,v8d,w8d,x8d,y8d,z8d,A8d,B8d,C8d,D8d,E8d,F8d,G8d,H8d,I8d,J8d,K8d,L8d,M8d,N8d,O8d,P8d;bcb(830,506,{105:1,92:1,90:1,56:1,49:1,97:1,843:1},R8d);_._g=function S8d(a,b,c){switch(a){case 0:if(c)return !this.c&&(this.c=new u3d(this,0)),this.c;return !this.c&&(this.c=new u3d(this,0)),this.c.b;case 1:if(c)return !this.c&&(this.c=new u3d(this,0)),BD(T2d(this.c,(Q8d(),t8d)),153);return (!this.c&&(this.c=new u3d(this,0)),BD(BD(T2d(this.c,(Q8d(),t8d)),153),215)).kl();case 2:if(c)return !this.b&&(this.b=new u3d(this,2)),this.b;return !this.b&&(this.b=new u3d(this,2)),this.b.b;}return bid(this,a-aLd(this.zh()),XKd((this.j&2)==0?this.zh():(!this.k&&(this.k=new HGd),this.k).ck(),a),b,c)};_.jh=function T8d(a,b,c){var d;switch(b){case 0:return !this.c&&(this.c=new u3d(this,0)),B2d(this.c,a,c);case 1:return (!this.c&&(this.c=new u3d(this,0)),BD(BD(T2d(this.c,(Q8d(),t8d)),153),69)).mk(a,c);case 2:return !this.b&&(this.b=new u3d(this,2)),B2d(this.b,a,c);}return d=BD(XKd((this.j&2)==0?this.zh():(!this.k&&(this.k=new HGd),this.k).ck(),b),66),d.Nj().Rj(this,Aid(this),b-aLd(this.zh()),a,c)};_.lh=function U8d(a){switch(a){case 0:return !!this.c&&this.c.i!=0;case 1:return !(!this.c&&(this.c=new u3d(this,0)),BD(T2d(this.c,(Q8d(),t8d)),153)).dc();case 2:return !!this.b&&this.b.i!=0;}return cid(this,a-aLd(this.zh()),XKd((this.j&2)==0?this.zh():(!this.k&&(this.k=new HGd),this.k).ck(),a))};_.sh=function V8d(a,b){switch(a){case 0:!this.c&&(this.c=new u3d(this,0));d3d(this.c,b);return;case 1:(!this.c&&(this.c=new u3d(this,0)),BD(BD(T2d(this.c,(Q8d(),t8d)),153),215)).Wb(b);return;case 2:!this.b&&(this.b=new u3d(this,2));d3d(this.b,b);return;}did(this,a-aLd(this.zh()),XKd((this.j&2)==0?this.zh():(!this.k&&(this.k=new HGd),this.k).ck(),a),b)};_.zh=function W8d(){return Q8d(),s8d};_.Bh=function X8d(a){switch(a){case 0:!this.c&&(this.c=new u3d(this,0));Uxd(this.c);return;case 1:(!this.c&&(this.c=new u3d(this,0)),BD(T2d(this.c,(Q8d(),t8d)),153)).$b();return;case 2:!this.b&&(this.b=new u3d(this,2));Uxd(this.b);return;}eid(this,a-aLd(this.zh()),XKd((this.j&2)==0?this.zh():(!this.k&&(this.k=new HGd),this.k).ck(),a))};_.Ib=function Y8d(){var a;if((this.j&4)!=0)return Eid(this);a=new Jfb(Eid(this));a.a+=' (mixed: ';Dfb(a,this.c);a.a+=', anyAttribute: ';Dfb(a,this.b);a.a+=')';return a.a};var V9=mdb(Mwe,'AnyTypeImpl',830);bcb(667,506,{105:1,92:1,90:1,56:1,49:1,97:1,2021:1,667:1},_8d);_._g=function a9d(a,b,c){switch(a){case 0:return this.a;case 1:return this.b;}return bid(this,a-aLd((Q8d(),F8d)),XKd((this.j&2)==0?F8d:(!this.k&&(this.k=new HGd),this.k).ck(),a),b,c)};_.lh=function b9d(a){switch(a){case 0:return this.a!=null;case 1:return this.b!=null;}return cid(this,a-aLd((Q8d(),F8d)),XKd((this.j&2)==0?F8d:(!this.k&&(this.k=new HGd),this.k).ck(),a))};_.sh=function c9d(a,b){switch(a){case 0:Z8d(this,GD(b));return;case 1:$8d(this,GD(b));return;}did(this,a-aLd((Q8d(),F8d)),XKd((this.j&2)==0?F8d:(!this.k&&(this.k=new HGd),this.k).ck(),a),b)};_.zh=function d9d(){return Q8d(),F8d};_.Bh=function e9d(a){switch(a){case 0:this.a=null;return;case 1:this.b=null;return;}eid(this,a-aLd((Q8d(),F8d)),XKd((this.j&2)==0?F8d:(!this.k&&(this.k=new HGd),this.k).ck(),a))};_.Ib=function f9d(){var a;if((this.j&4)!=0)return Eid(this);a=new Jfb(Eid(this));a.a+=' (data: ';Efb(a,this.a);a.a+=', target: ';Efb(a,this.b);a.a+=')';return a.a};_.a=null;_.b=null;var W9=mdb(Mwe,'ProcessingInstructionImpl',667);bcb(668,830,{105:1,92:1,90:1,56:1,49:1,97:1,843:1,2022:1,668:1},i9d);_._g=function j9d(a,b,c){switch(a){case 0:if(c)return !this.c&&(this.c=new u3d(this,0)),this.c;return !this.c&&(this.c=new u3d(this,0)),this.c.b;case 1:if(c)return !this.c&&(this.c=new u3d(this,0)),BD(T2d(this.c,(Q8d(),t8d)),153);return (!this.c&&(this.c=new u3d(this,0)),BD(BD(T2d(this.c,(Q8d(),t8d)),153),215)).kl();case 2:if(c)return !this.b&&(this.b=new u3d(this,2)),this.b;return !this.b&&(this.b=new u3d(this,2)),this.b.b;case 3:return !this.c&&(this.c=new u3d(this,0)),GD(K2d(this.c,(Q8d(),I8d),true));case 4:return j6d(this.a,(!this.c&&(this.c=new u3d(this,0)),GD(K2d(this.c,(Q8d(),I8d),true))));case 5:return this.a;}return bid(this,a-aLd((Q8d(),H8d)),XKd((this.j&2)==0?H8d:(!this.k&&(this.k=new HGd),this.k).ck(),a),b,c)};_.lh=function k9d(a){switch(a){case 0:return !!this.c&&this.c.i!=0;case 1:return !(!this.c&&(this.c=new u3d(this,0)),BD(T2d(this.c,(Q8d(),t8d)),153)).dc();case 2:return !!this.b&&this.b.i!=0;case 3:return !this.c&&(this.c=new u3d(this,0)),GD(K2d(this.c,(Q8d(),I8d),true))!=null;case 4:return j6d(this.a,(!this.c&&(this.c=new u3d(this,0)),GD(K2d(this.c,(Q8d(),I8d),true))))!=null;case 5:return !!this.a;}return cid(this,a-aLd((Q8d(),H8d)),XKd((this.j&2)==0?H8d:(!this.k&&(this.k=new HGd),this.k).ck(),a))};_.sh=function l9d(a,b){switch(a){case 0:!this.c&&(this.c=new u3d(this,0));d3d(this.c,b);return;case 1:(!this.c&&(this.c=new u3d(this,0)),BD(BD(T2d(this.c,(Q8d(),t8d)),153),215)).Wb(b);return;case 2:!this.b&&(this.b=new u3d(this,2));d3d(this.b,b);return;case 3:h9d(this,GD(b));return;case 4:h9d(this,h6d(this.a,b));return;case 5:g9d(this,BD(b,148));return;}did(this,a-aLd((Q8d(),H8d)),XKd((this.j&2)==0?H8d:(!this.k&&(this.k=new HGd),this.k).ck(),a),b)};_.zh=function m9d(){return Q8d(),H8d};_.Bh=function n9d(a){switch(a){case 0:!this.c&&(this.c=new u3d(this,0));Uxd(this.c);return;case 1:(!this.c&&(this.c=new u3d(this,0)),BD(T2d(this.c,(Q8d(),t8d)),153)).$b();return;case 2:!this.b&&(this.b=new u3d(this,2));Uxd(this.b);return;case 3:!this.c&&(this.c=new u3d(this,0));f3d(this.c,(Q8d(),I8d),null);return;case 4:h9d(this,h6d(this.a,null));return;case 5:this.a=null;return;}eid(this,a-aLd((Q8d(),H8d)),XKd((this.j&2)==0?H8d:(!this.k&&(this.k=new HGd),this.k).ck(),a))};var X9=mdb(Mwe,'SimpleAnyTypeImpl',668);bcb(669,506,{105:1,92:1,90:1,56:1,49:1,97:1,2023:1,669:1},o9d);_._g=function p9d(a,b,c){switch(a){case 0:if(c)return !this.a&&(this.a=new u3d(this,0)),this.a;return !this.a&&(this.a=new u3d(this,0)),this.a.b;case 1:return c?(!this.b&&(this.b=new dId((jGd(),fGd),x6,this,1)),this.b):(!this.b&&(this.b=new dId((jGd(),fGd),x6,this,1)),FAd(this.b));case 2:return c?(!this.c&&(this.c=new dId((jGd(),fGd),x6,this,2)),this.c):(!this.c&&(this.c=new dId((jGd(),fGd),x6,this,2)),FAd(this.c));case 3:return !this.a&&(this.a=new u3d(this,0)),T2d(this.a,(Q8d(),L8d));case 4:return !this.a&&(this.a=new u3d(this,0)),T2d(this.a,(Q8d(),M8d));case 5:return !this.a&&(this.a=new u3d(this,0)),T2d(this.a,(Q8d(),O8d));case 6:return !this.a&&(this.a=new u3d(this,0)),T2d(this.a,(Q8d(),P8d));}return bid(this,a-aLd((Q8d(),K8d)),XKd((this.j&2)==0?K8d:(!this.k&&(this.k=new HGd),this.k).ck(),a),b,c)};_.jh=function q9d(a,b,c){var d;switch(b){case 0:return !this.a&&(this.a=new u3d(this,0)),B2d(this.a,a,c);case 1:return !this.b&&(this.b=new dId((jGd(),fGd),x6,this,1)),bId(this.b,a,c);case 2:return !this.c&&(this.c=new dId((jGd(),fGd),x6,this,2)),bId(this.c,a,c);case 5:return !this.a&&(this.a=new u3d(this,0)),c7d(T2d(this.a,(Q8d(),O8d)),a,c);}return d=BD(XKd((this.j&2)==0?(Q8d(),K8d):(!this.k&&(this.k=new HGd),this.k).ck(),b),66),d.Nj().Rj(this,Aid(this),b-aLd((Q8d(),K8d)),a,c)};_.lh=function r9d(a){switch(a){case 0:return !!this.a&&this.a.i!=0;case 1:return !!this.b&&this.b.f!=0;case 2:return !!this.c&&this.c.f!=0;case 3:return !this.a&&(this.a=new u3d(this,0)),!e7d(T2d(this.a,(Q8d(),L8d)));case 4:return !this.a&&(this.a=new u3d(this,0)),!e7d(T2d(this.a,(Q8d(),M8d)));case 5:return !this.a&&(this.a=new u3d(this,0)),!e7d(T2d(this.a,(Q8d(),O8d)));case 6:return !this.a&&(this.a=new u3d(this,0)),!e7d(T2d(this.a,(Q8d(),P8d)));}return cid(this,a-aLd((Q8d(),K8d)),XKd((this.j&2)==0?K8d:(!this.k&&(this.k=new HGd),this.k).ck(),a))};_.sh=function s9d(a,b){switch(a){case 0:!this.a&&(this.a=new u3d(this,0));d3d(this.a,b);return;case 1:!this.b&&(this.b=new dId((jGd(),fGd),x6,this,1));cId(this.b,b);return;case 2:!this.c&&(this.c=new dId((jGd(),fGd),x6,this,2));cId(this.c,b);return;case 3:!this.a&&(this.a=new u3d(this,0));d7d(T2d(this.a,(Q8d(),L8d)));!this.a&&(this.a=new u3d(this,0));b7d(T2d(this.a,L8d),BD(b,14));return;case 4:!this.a&&(this.a=new u3d(this,0));d7d(T2d(this.a,(Q8d(),M8d)));!this.a&&(this.a=new u3d(this,0));b7d(T2d(this.a,M8d),BD(b,14));return;case 5:!this.a&&(this.a=new u3d(this,0));d7d(T2d(this.a,(Q8d(),O8d)));!this.a&&(this.a=new u3d(this,0));b7d(T2d(this.a,O8d),BD(b,14));return;case 6:!this.a&&(this.a=new u3d(this,0));d7d(T2d(this.a,(Q8d(),P8d)));!this.a&&(this.a=new u3d(this,0));b7d(T2d(this.a,P8d),BD(b,14));return;}did(this,a-aLd((Q8d(),K8d)),XKd((this.j&2)==0?K8d:(!this.k&&(this.k=new HGd),this.k).ck(),a),b)};_.zh=function t9d(){return Q8d(),K8d};_.Bh=function u9d(a){switch(a){case 0:!this.a&&(this.a=new u3d(this,0));Uxd(this.a);return;case 1:!this.b&&(this.b=new dId((jGd(),fGd),x6,this,1));this.b.c.$b();return;case 2:!this.c&&(this.c=new dId((jGd(),fGd),x6,this,2));this.c.c.$b();return;case 3:!this.a&&(this.a=new u3d(this,0));d7d(T2d(this.a,(Q8d(),L8d)));return;case 4:!this.a&&(this.a=new u3d(this,0));d7d(T2d(this.a,(Q8d(),M8d)));return;case 5:!this.a&&(this.a=new u3d(this,0));d7d(T2d(this.a,(Q8d(),O8d)));return;case 6:!this.a&&(this.a=new u3d(this,0));d7d(T2d(this.a,(Q8d(),P8d)));return;}eid(this,a-aLd((Q8d(),K8d)),XKd((this.j&2)==0?K8d:(!this.k&&(this.k=new HGd),this.k).ck(),a))};_.Ib=function v9d(){var a;if((this.j&4)!=0)return Eid(this);a=new Jfb(Eid(this));a.a+=' (mixed: ';Dfb(a,this.a);a.a+=')';return a.a};var Y9=mdb(Mwe,'XMLTypeDocumentRootImpl',669);bcb(1919,704,{105:1,92:1,90:1,471:1,147:1,56:1,108:1,49:1,97:1,150:1,114:1,115:1,2024:1},U9d);_.Ih=function V9d(a,b){switch(a.yj()){case 7:case 8:case 9:case 10:case 16:case 22:case 23:case 24:case 25:case 26:case 32:case 33:case 34:case 36:case 37:case 44:case 45:case 50:case 51:case 53:case 55:case 56:case 57:case 58:case 60:case 61:case 4:return b==null?null:fcb(b);case 19:case 28:case 29:case 35:case 38:case 39:case 41:case 46:case 52:case 54:case 5:return GD(b);case 6:return C9d(BD(b,190));case 12:case 47:case 49:case 11:return Vmd(this,a,b);case 13:return b==null?null:qgb(BD(b,240));case 15:case 14:return b==null?null:D9d(Edb(ED(b)));case 17:return E9d((Q8d(),b));case 18:return E9d(b);case 21:case 20:return b==null?null:F9d(BD(b,155).a);case 27:return G9d(BD(b,190));case 30:return H9d((Q8d(),BD(b,15)));case 31:return H9d(BD(b,15));case 40:return K9d((Q8d(),b));case 42:return I9d((Q8d(),b));case 43:return I9d(b);case 59:case 48:return J9d((Q8d(),b));default:throw vbb(new Wdb(tte+a.ne()+ute));}};_.Jh=function W9d(a){var b,c,d,e,f;switch(a.G==-1&&(a.G=(c=bKd(a),c?HLd(c.Mh(),a):-1)),a.G){case 0:return b=new R8d,b;case 1:return d=new _8d,d;case 2:return e=new i9d,e;case 3:return f=new o9d,f;default:throw vbb(new Wdb(xte+a.zb+ute));}};_.Kh=function X9d(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;switch(a.yj()){case 5:case 52:case 4:return b;case 6:return L9d(b);case 8:case 7:return b==null?null:B9d(b);case 9:return b==null?null:Scb(Icb((d=Qge(b,true),d.length>0&&(BCb(0,d.length),d.charCodeAt(0)==43)?d.substr(1):d),-128,127)<<24>>24);case 10:return b==null?null:Scb(Icb((e=Qge(b,true),e.length>0&&(BCb(0,e.length),e.charCodeAt(0)==43)?e.substr(1):e),-128,127)<<24>>24);case 11:return GD(Wmd(this,(Q8d(),w8d),b));case 12:return GD(Wmd(this,(Q8d(),x8d),b));case 13:return b==null?null:new tgb(Qge(b,true));case 15:case 14:return M9d(b);case 16:return GD(Wmd(this,(Q8d(),y8d),b));case 17:return N9d((Q8d(),b));case 18:return N9d(b);case 28:case 29:case 35:case 38:case 39:case 41:case 54:case 19:return Qge(b,true);case 21:case 20:return O9d(b);case 22:return GD(Wmd(this,(Q8d(),z8d),b));case 23:return GD(Wmd(this,(Q8d(),A8d),b));case 24:return GD(Wmd(this,(Q8d(),B8d),b));case 25:return GD(Wmd(this,(Q8d(),C8d),b));case 26:return GD(Wmd(this,(Q8d(),D8d),b));case 27:return P9d(b);case 30:return Q9d((Q8d(),b));case 31:return Q9d(b);case 32:return b==null?null:meb(Icb((k=Qge(b,true),k.length>0&&(BCb(0,k.length),k.charCodeAt(0)==43)?k.substr(1):k),Rie,Ohe));case 33:return b==null?null:new Ygb((l=Qge(b,true),l.length>0&&(BCb(0,l.length),l.charCodeAt(0)==43)?l.substr(1):l));case 34:return b==null?null:meb(Icb((m=Qge(b,true),m.length>0&&(BCb(0,m.length),m.charCodeAt(0)==43)?m.substr(1):m),Rie,Ohe));case 36:return b==null?null:Aeb(Jcb((n=Qge(b,true),n.length>0&&(BCb(0,n.length),n.charCodeAt(0)==43)?n.substr(1):n)));case 37:return b==null?null:Aeb(Jcb((o=Qge(b,true),o.length>0&&(BCb(0,o.length),o.charCodeAt(0)==43)?o.substr(1):o)));case 40:return T9d((Q8d(),b));case 42:return R9d((Q8d(),b));case 43:return R9d(b);case 44:return b==null?null:new Ygb((p=Qge(b,true),p.length>0&&(BCb(0,p.length),p.charCodeAt(0)==43)?p.substr(1):p));case 45:return b==null?null:new Ygb((q=Qge(b,true),q.length>0&&(BCb(0,q.length),q.charCodeAt(0)==43)?q.substr(1):q));case 46:return Qge(b,false);case 47:return GD(Wmd(this,(Q8d(),E8d),b));case 59:case 48:return S9d((Q8d(),b));case 49:return GD(Wmd(this,(Q8d(),G8d),b));case 50:return b==null?null:Web(Icb((r=Qge(b,true),r.length>0&&(BCb(0,r.length),r.charCodeAt(0)==43)?r.substr(1):r),awe,32767)<<16>>16);case 51:return b==null?null:Web(Icb((f=Qge(b,true),f.length>0&&(BCb(0,f.length),f.charCodeAt(0)==43)?f.substr(1):f),awe,32767)<<16>>16);case 53:return GD(Wmd(this,(Q8d(),J8d),b));case 55:return b==null?null:Web(Icb((g=Qge(b,true),g.length>0&&(BCb(0,g.length),g.charCodeAt(0)==43)?g.substr(1):g),awe,32767)<<16>>16);case 56:return b==null?null:Web(Icb((h=Qge(b,true),h.length>0&&(BCb(0,h.length),h.charCodeAt(0)==43)?h.substr(1):h),awe,32767)<<16>>16);case 57:return b==null?null:Aeb(Jcb((i=Qge(b,true),i.length>0&&(BCb(0,i.length),i.charCodeAt(0)==43)?i.substr(1):i)));case 58:return b==null?null:Aeb(Jcb((j=Qge(b,true),j.length>0&&(BCb(0,j.length),j.charCodeAt(0)==43)?j.substr(1):j)));case 60:return b==null?null:meb(Icb((c=Qge(b,true),c.length>0&&(BCb(0,c.length),c.charCodeAt(0)==43)?c.substr(1):c),Rie,Ohe));case 61:return b==null?null:meb(Icb(Qge(b,true),Rie,Ohe));default:throw vbb(new Wdb(tte+a.ne()+ute));}};var w9d,x9d,y9d,z9d;var Z9=mdb(Mwe,'XMLTypeFactoryImpl',1919);bcb(586,179,{105:1,92:1,90:1,147:1,191:1,56:1,235:1,108:1,49:1,97:1,150:1,179:1,114:1,115:1,675:1,1945:1,586:1},cae);_.N=false;_.O=false;var Z9d=false;var Yab=mdb(Mwe,'XMLTypePackageImpl',586);bcb(1852,1,{837:1},fae);_._j=function gae(){return Uge(),Tge};var iab=mdb(Mwe,'XMLTypePackageImpl/1',1852);bcb(1861,1,nwe,hae);_.wj=function iae(a){return ND(a)};_.xj=function jae(a){return KC(ZI,nie,2,a,6,1)};var $9=mdb(Mwe,'XMLTypePackageImpl/10',1861);bcb(1862,1,nwe,kae);_.wj=function lae(a){return ND(a)};_.xj=function mae(a){return KC(ZI,nie,2,a,6,1)};var _9=mdb(Mwe,'XMLTypePackageImpl/11',1862);bcb(1863,1,nwe,nae);_.wj=function oae(a){return ND(a)};_.xj=function pae(a){return KC(ZI,nie,2,a,6,1)};var aab=mdb(Mwe,'XMLTypePackageImpl/12',1863);bcb(1864,1,nwe,qae);_.wj=function rae(a){return LD(a)};_.xj=function sae(a){return KC(BI,nie,333,a,7,1)};var bab=mdb(Mwe,'XMLTypePackageImpl/13',1864);bcb(1865,1,nwe,tae);_.wj=function uae(a){return ND(a)};_.xj=function vae(a){return KC(ZI,nie,2,a,6,1)};var cab=mdb(Mwe,'XMLTypePackageImpl/14',1865);bcb(1866,1,nwe,wae);_.wj=function xae(a){return JD(a,15)};_.xj=function yae(a){return KC(yK,eme,15,a,0,1)};var dab=mdb(Mwe,'XMLTypePackageImpl/15',1866);bcb(1867,1,nwe,zae);_.wj=function Aae(a){return JD(a,15)};_.xj=function Bae(a){return KC(yK,eme,15,a,0,1)};var eab=mdb(Mwe,'XMLTypePackageImpl/16',1867);bcb(1868,1,nwe,Cae);_.wj=function Dae(a){return ND(a)};_.xj=function Eae(a){return KC(ZI,nie,2,a,6,1)};var fab=mdb(Mwe,'XMLTypePackageImpl/17',1868);bcb(1869,1,nwe,Fae);_.wj=function Gae(a){return JD(a,155)};_.xj=function Hae(a){return KC(FI,nie,155,a,0,1)};var gab=mdb(Mwe,'XMLTypePackageImpl/18',1869);bcb(1870,1,nwe,Iae);_.wj=function Jae(a){return ND(a)};_.xj=function Kae(a){return KC(ZI,nie,2,a,6,1)};var hab=mdb(Mwe,'XMLTypePackageImpl/19',1870);bcb(1853,1,nwe,Lae);_.wj=function Mae(a){return JD(a,843)};_.xj=function Nae(a){return KC(Q9,Uhe,843,a,0,1)};var tab=mdb(Mwe,'XMLTypePackageImpl/2',1853);bcb(1871,1,nwe,Oae);_.wj=function Pae(a){return ND(a)};_.xj=function Qae(a){return KC(ZI,nie,2,a,6,1)};var jab=mdb(Mwe,'XMLTypePackageImpl/20',1871);bcb(1872,1,nwe,Rae);_.wj=function Sae(a){return ND(a)};_.xj=function Tae(a){return KC(ZI,nie,2,a,6,1)};var kab=mdb(Mwe,'XMLTypePackageImpl/21',1872);bcb(1873,1,nwe,Uae);_.wj=function Vae(a){return ND(a)};_.xj=function Wae(a){return KC(ZI,nie,2,a,6,1)};var lab=mdb(Mwe,'XMLTypePackageImpl/22',1873);bcb(1874,1,nwe,Xae);_.wj=function Yae(a){return ND(a)};_.xj=function Zae(a){return KC(ZI,nie,2,a,6,1)};var mab=mdb(Mwe,'XMLTypePackageImpl/23',1874);bcb(1875,1,nwe,$ae);_.wj=function _ae(a){return JD(a,190)};_.xj=function abe(a){return KC(SD,nie,190,a,0,2)};var nab=mdb(Mwe,'XMLTypePackageImpl/24',1875);bcb(1876,1,nwe,bbe);_.wj=function cbe(a){return ND(a)};_.xj=function dbe(a){return KC(ZI,nie,2,a,6,1)};var oab=mdb(Mwe,'XMLTypePackageImpl/25',1876);bcb(1877,1,nwe,ebe);_.wj=function fbe(a){return ND(a)};_.xj=function gbe(a){return KC(ZI,nie,2,a,6,1)};var pab=mdb(Mwe,'XMLTypePackageImpl/26',1877);bcb(1878,1,nwe,hbe);_.wj=function ibe(a){return JD(a,15)};_.xj=function jbe(a){return KC(yK,eme,15,a,0,1)};var qab=mdb(Mwe,'XMLTypePackageImpl/27',1878);bcb(1879,1,nwe,kbe);_.wj=function lbe(a){return JD(a,15)};_.xj=function mbe(a){return KC(yK,eme,15,a,0,1)};var rab=mdb(Mwe,'XMLTypePackageImpl/28',1879);bcb(1880,1,nwe,nbe);_.wj=function obe(a){return ND(a)};_.xj=function pbe(a){return KC(ZI,nie,2,a,6,1)};var sab=mdb(Mwe,'XMLTypePackageImpl/29',1880);bcb(1854,1,nwe,qbe);_.wj=function rbe(a){return JD(a,667)};_.xj=function sbe(a){return KC(S9,Uhe,2021,a,0,1)};var Eab=mdb(Mwe,'XMLTypePackageImpl/3',1854);bcb(1881,1,nwe,tbe);_.wj=function ube(a){return JD(a,19)};_.xj=function vbe(a){return KC(JI,nie,19,a,0,1)};var uab=mdb(Mwe,'XMLTypePackageImpl/30',1881);bcb(1882,1,nwe,wbe);_.wj=function xbe(a){return ND(a)};_.xj=function ybe(a){return KC(ZI,nie,2,a,6,1)};var vab=mdb(Mwe,'XMLTypePackageImpl/31',1882);bcb(1883,1,nwe,zbe);_.wj=function Abe(a){return JD(a,162)};_.xj=function Bbe(a){return KC(MI,nie,162,a,0,1)};var wab=mdb(Mwe,'XMLTypePackageImpl/32',1883);bcb(1884,1,nwe,Cbe);_.wj=function Dbe(a){return ND(a)};_.xj=function Ebe(a){return KC(ZI,nie,2,a,6,1)};var xab=mdb(Mwe,'XMLTypePackageImpl/33',1884);bcb(1885,1,nwe,Fbe);_.wj=function Gbe(a){return ND(a)};_.xj=function Hbe(a){return KC(ZI,nie,2,a,6,1)};var yab=mdb(Mwe,'XMLTypePackageImpl/34',1885);bcb(1886,1,nwe,Ibe);_.wj=function Jbe(a){return ND(a)};_.xj=function Kbe(a){return KC(ZI,nie,2,a,6,1)};var zab=mdb(Mwe,'XMLTypePackageImpl/35',1886);bcb(1887,1,nwe,Lbe);_.wj=function Mbe(a){return ND(a)};_.xj=function Nbe(a){return KC(ZI,nie,2,a,6,1)};var Aab=mdb(Mwe,'XMLTypePackageImpl/36',1887);bcb(1888,1,nwe,Obe);_.wj=function Pbe(a){return JD(a,15)};_.xj=function Qbe(a){return KC(yK,eme,15,a,0,1)};var Bab=mdb(Mwe,'XMLTypePackageImpl/37',1888);bcb(1889,1,nwe,Rbe);_.wj=function Sbe(a){return JD(a,15)};_.xj=function Tbe(a){return KC(yK,eme,15,a,0,1)};var Cab=mdb(Mwe,'XMLTypePackageImpl/38',1889);bcb(1890,1,nwe,Ube);_.wj=function Vbe(a){return ND(a)};_.xj=function Wbe(a){return KC(ZI,nie,2,a,6,1)};var Dab=mdb(Mwe,'XMLTypePackageImpl/39',1890);bcb(1855,1,nwe,Xbe);_.wj=function Ybe(a){return JD(a,668)};_.xj=function Zbe(a){return KC(T9,Uhe,2022,a,0,1)};var Pab=mdb(Mwe,'XMLTypePackageImpl/4',1855);bcb(1891,1,nwe,$be);_.wj=function _be(a){return ND(a)};_.xj=function ace(a){return KC(ZI,nie,2,a,6,1)};var Fab=mdb(Mwe,'XMLTypePackageImpl/40',1891);bcb(1892,1,nwe,bce);_.wj=function cce(a){return ND(a)};_.xj=function dce(a){return KC(ZI,nie,2,a,6,1)};var Gab=mdb(Mwe,'XMLTypePackageImpl/41',1892);bcb(1893,1,nwe,ece);_.wj=function fce(a){return ND(a)};_.xj=function gce(a){return KC(ZI,nie,2,a,6,1)};var Hab=mdb(Mwe,'XMLTypePackageImpl/42',1893);bcb(1894,1,nwe,hce);_.wj=function ice(a){return ND(a)};_.xj=function jce(a){return KC(ZI,nie,2,a,6,1)};var Iab=mdb(Mwe,'XMLTypePackageImpl/43',1894);bcb(1895,1,nwe,kce);_.wj=function lce(a){return ND(a)};_.xj=function mce(a){return KC(ZI,nie,2,a,6,1)};var Jab=mdb(Mwe,'XMLTypePackageImpl/44',1895);bcb(1896,1,nwe,nce);_.wj=function oce(a){return JD(a,184)};_.xj=function pce(a){return KC(UI,nie,184,a,0,1)};var Kab=mdb(Mwe,'XMLTypePackageImpl/45',1896);bcb(1897,1,nwe,qce);_.wj=function rce(a){return ND(a)};_.xj=function sce(a){return KC(ZI,nie,2,a,6,1)};var Lab=mdb(Mwe,'XMLTypePackageImpl/46',1897);bcb(1898,1,nwe,tce);_.wj=function uce(a){return ND(a)};_.xj=function vce(a){return KC(ZI,nie,2,a,6,1)};var Mab=mdb(Mwe,'XMLTypePackageImpl/47',1898);bcb(1899,1,nwe,wce);_.wj=function xce(a){return ND(a)};_.xj=function yce(a){return KC(ZI,nie,2,a,6,1)};var Nab=mdb(Mwe,'XMLTypePackageImpl/48',1899);bcb(nje,1,nwe,zce);_.wj=function Ace(a){return JD(a,184)};_.xj=function Bce(a){return KC(UI,nie,184,a,0,1)};var Oab=mdb(Mwe,'XMLTypePackageImpl/49',nje);bcb(1856,1,nwe,Cce);_.wj=function Dce(a){return JD(a,669)};_.xj=function Ece(a){return KC(U9,Uhe,2023,a,0,1)};var Tab=mdb(Mwe,'XMLTypePackageImpl/5',1856);bcb(1901,1,nwe,Fce);_.wj=function Gce(a){return JD(a,162)};_.xj=function Hce(a){return KC(MI,nie,162,a,0,1)};var Qab=mdb(Mwe,'XMLTypePackageImpl/50',1901);bcb(1902,1,nwe,Ice);_.wj=function Jce(a){return ND(a)};_.xj=function Kce(a){return KC(ZI,nie,2,a,6,1)};var Rab=mdb(Mwe,'XMLTypePackageImpl/51',1902);bcb(1903,1,nwe,Lce);_.wj=function Mce(a){return JD(a,19)};_.xj=function Nce(a){return KC(JI,nie,19,a,0,1)};var Sab=mdb(Mwe,'XMLTypePackageImpl/52',1903);bcb(1857,1,nwe,Oce);_.wj=function Pce(a){return ND(a)};_.xj=function Qce(a){return KC(ZI,nie,2,a,6,1)};var Uab=mdb(Mwe,'XMLTypePackageImpl/6',1857);bcb(1858,1,nwe,Rce);_.wj=function Sce(a){return JD(a,190)};_.xj=function Tce(a){return KC(SD,nie,190,a,0,2)};var Vab=mdb(Mwe,'XMLTypePackageImpl/7',1858);bcb(1859,1,nwe,Uce);_.wj=function Vce(a){return KD(a)};_.xj=function Wce(a){return KC(wI,nie,476,a,8,1)};var Wab=mdb(Mwe,'XMLTypePackageImpl/8',1859);bcb(1860,1,nwe,Xce);_.wj=function Yce(a){return JD(a,217)};_.xj=function Zce(a){return KC(xI,nie,217,a,0,1)};var Xab=mdb(Mwe,'XMLTypePackageImpl/9',1860);var $ce,_ce;var fde,gde;var kde;bcb(50,60,Tie,mde);var Zab=mdb(kxe,'RegEx/ParseException',50);bcb(820,1,{},ude);_.sl=function vde(a){return ac*16)throw vbb(new mde(tvd((h0d(),Uue))));c=c*16+e}while(true);if(this.a!=125)throw vbb(new mde(tvd((h0d(),Vue))));if(c>lxe)throw vbb(new mde(tvd((h0d(),Wue))));a=c}else{e=0;if(this.c!=0||(e=yde(this.a))<0)throw vbb(new mde(tvd((h0d(),Tue))));c=e;nde(this);if(this.c!=0||(e=yde(this.a))<0)throw vbb(new mde(tvd((h0d(),Tue))));c=c*16+e;a=c}break;case 117:d=0;nde(this);if(this.c!=0||(d=yde(this.a))<0)throw vbb(new mde(tvd((h0d(),Tue))));b=d;nde(this);if(this.c!=0||(d=yde(this.a))<0)throw vbb(new mde(tvd((h0d(),Tue))));b=b*16+d;nde(this);if(this.c!=0||(d=yde(this.a))<0)throw vbb(new mde(tvd((h0d(),Tue))));b=b*16+d;nde(this);if(this.c!=0||(d=yde(this.a))<0)throw vbb(new mde(tvd((h0d(),Tue))));b=b*16+d;a=b;break;case 118:nde(this);if(this.c!=0||(d=yde(this.a))<0)throw vbb(new mde(tvd((h0d(),Tue))));b=d;nde(this);if(this.c!=0||(d=yde(this.a))<0)throw vbb(new mde(tvd((h0d(),Tue))));b=b*16+d;nde(this);if(this.c!=0||(d=yde(this.a))<0)throw vbb(new mde(tvd((h0d(),Tue))));b=b*16+d;nde(this);if(this.c!=0||(d=yde(this.a))<0)throw vbb(new mde(tvd((h0d(),Tue))));b=b*16+d;nde(this);if(this.c!=0||(d=yde(this.a))<0)throw vbb(new mde(tvd((h0d(),Tue))));b=b*16+d;nde(this);if(this.c!=0||(d=yde(this.a))<0)throw vbb(new mde(tvd((h0d(),Tue))));b=b*16+d;if(b>lxe)throw vbb(new mde(tvd((h0d(),'parser.descappe.4'))));a=b;break;case 65:case 90:case 122:throw vbb(new mde(tvd((h0d(),Xue))));}return a};_.ul=function xde(a){var b,c;switch(a){case 100:c=(this.e&32)==32?Kfe('Nd',true):(wfe(),cfe);break;case 68:c=(this.e&32)==32?Kfe('Nd',false):(wfe(),jfe);break;case 119:c=(this.e&32)==32?Kfe('IsWord',true):(wfe(),sfe);break;case 87:c=(this.e&32)==32?Kfe('IsWord',false):(wfe(),lfe);break;case 115:c=(this.e&32)==32?Kfe('IsSpace',true):(wfe(),nfe);break;case 83:c=(this.e&32)==32?Kfe('IsSpace',false):(wfe(),kfe);break;default:throw vbb(new hz((b=a,mxe+b.toString(16))));}return c};_.vl=function zde(a){var b,c,d,e,f,g,h,i,j,k,l,m;this.b=1;nde(this);b=null;if(this.c==0&&this.a==94){nde(this);if(a){k=(wfe(),wfe(),++vfe,new $fe(5))}else{b=(wfe(),wfe(),++vfe,new $fe(4));Ufe(b,0,lxe);k=(null,++vfe,new $fe(4))}}else{k=(wfe(),wfe(),++vfe,new $fe(4))}e=true;while((m=this.c)!=1){if(m==0&&this.a==93&&!e)break;e=false;c=this.a;d=false;if(m==10){switch(c){case 100:case 68:case 119:case 87:case 115:case 83:Xfe(k,this.ul(c));d=true;break;case 105:case 73:case 99:case 67:c=this.Ll(k,c);c<0&&(d=true);break;case 112:case 80:l=tde(this,c);if(!l)throw vbb(new mde(tvd((h0d(),Iue))));Xfe(k,l);d=true;break;default:c=this.tl();}}else if(m==20){g=gfb(this.i,58,this.d);if(g<0)throw vbb(new mde(tvd((h0d(),Jue))));h=true;if(bfb(this.i,this.d)==94){++this.d;h=false}f=qfb(this.i,this.d,g);i=Lfe(f,h,(this.e&512)==512);if(!i)throw vbb(new mde(tvd((h0d(),Lue))));Xfe(k,i);d=true;if(g+1>=this.j||bfb(this.i,g+1)!=93)throw vbb(new mde(tvd((h0d(),Jue))));this.d=g+2}nde(this);if(!d){if(this.c!=0||this.a!=45){Ufe(k,c,c)}else{nde(this);if((m=this.c)==1)throw vbb(new mde(tvd((h0d(),Kue))));if(m==0&&this.a==93){Ufe(k,c,c);Ufe(k,45,45)}else{j=this.a;m==10&&(j=this.tl());nde(this);Ufe(k,c,j)}}}(this.e&zte)==zte&&this.c==0&&this.a==44&&nde(this)}if(this.c==1)throw vbb(new mde(tvd((h0d(),Kue))));if(b){Zfe(b,k);k=b}Yfe(k);Vfe(k);this.b=0;nde(this);return k};_.wl=function Ade(){var a,b,c,d;c=this.vl(false);while((d=this.c)!=7){a=this.a;if(d==0&&(a==45||a==38)||d==4){nde(this);if(this.c!=9)throw vbb(new mde(tvd((h0d(),Que))));b=this.vl(false);if(d==4)Xfe(c,b);else if(a==45)Zfe(c,b);else if(a==38)Wfe(c,b);else throw vbb(new hz('ASSERT'))}else{throw vbb(new mde(tvd((h0d(),Rue))))}}nde(this);return c};_.xl=function Bde(){var a,b;a=this.a-48;b=(wfe(),wfe(),++vfe,new Hge(12,null,a));!this.g&&(this.g=new Wvb);Tvb(this.g,new cge(a));nde(this);return b};_.yl=function Cde(){nde(this);return wfe(),ofe};_.zl=function Dde(){nde(this);return wfe(),mfe};_.Al=function Ede(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Bl=function Fde(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Cl=function Gde(){nde(this);return Ife()};_.Dl=function Hde(){nde(this);return wfe(),qfe};_.El=function Ide(){nde(this);return wfe(),tfe};_.Fl=function Jde(){var a;if(this.d>=this.j||((a=bfb(this.i,this.d++))&65504)!=64)throw vbb(new mde(tvd((h0d(),Eue))));nde(this);return wfe(),wfe(),++vfe,new ige(0,a-64)};_.Gl=function Kde(){nde(this);return Jfe()};_.Hl=function Lde(){nde(this);return wfe(),ufe};_.Il=function Mde(){var a;a=(wfe(),wfe(),++vfe,new ige(0,105));nde(this);return a};_.Jl=function Nde(){nde(this);return wfe(),rfe};_.Kl=function Ode(){nde(this);return wfe(),pfe};_.Ll=function Pde(a,b){return this.tl()};_.Ml=function Qde(){nde(this);return wfe(),hfe};_.Nl=function Rde(){var a,b,c,d,e;if(this.d+1>=this.j)throw vbb(new mde(tvd((h0d(),Bue))));d=-1;b=null;a=bfb(this.i,this.d);if(49<=a&&a<=57){d=a-48;!this.g&&(this.g=new Wvb);Tvb(this.g,new cge(d));++this.d;if(bfb(this.i,this.d)!=41)throw vbb(new mde(tvd((h0d(),yue))));++this.d}else{a==63&&--this.d;nde(this);b=qde(this);switch(b.e){case 20:case 21:case 22:case 23:break;case 8:if(this.c!=7)throw vbb(new mde(tvd((h0d(),yue))));break;default:throw vbb(new mde(tvd((h0d(),Cue))));}}nde(this);e=rde(this);c=null;if(e.e==2){if(e.em()!=2)throw vbb(new mde(tvd((h0d(),Due))));c=e.am(1);e=e.am(0)}if(this.c!=7)throw vbb(new mde(tvd((h0d(),yue))));nde(this);return wfe(),wfe(),++vfe,new vge(d,b,e,c)};_.Ol=function Sde(){nde(this);return wfe(),ife};_.Pl=function Tde(){var a;nde(this);a=Cfe(24,rde(this));if(this.c!=7)throw vbb(new mde(tvd((h0d(),yue))));nde(this);return a};_.Ql=function Ude(){var a;nde(this);a=Cfe(20,rde(this));if(this.c!=7)throw vbb(new mde(tvd((h0d(),yue))));nde(this);return a};_.Rl=function Vde(){var a;nde(this);a=Cfe(22,rde(this));if(this.c!=7)throw vbb(new mde(tvd((h0d(),yue))));nde(this);return a};_.Sl=function Wde(){var a,b,c,d,e;a=0;c=0;b=-1;while(this.d=this.j)throw vbb(new mde(tvd((h0d(),zue))));if(b==45){++this.d;while(this.d=this.j)throw vbb(new mde(tvd((h0d(),zue))))}if(b==58){++this.d;nde(this);d=Dfe(rde(this),a,c);if(this.c!=7)throw vbb(new mde(tvd((h0d(),yue))));nde(this)}else if(b==41){++this.d;nde(this);d=Dfe(rde(this),a,c)}else throw vbb(new mde(tvd((h0d(),Aue))));return d};_.Tl=function Xde(){var a;nde(this);a=Cfe(21,rde(this));if(this.c!=7)throw vbb(new mde(tvd((h0d(),yue))));nde(this);return a};_.Ul=function Yde(){var a;nde(this);a=Cfe(23,rde(this));if(this.c!=7)throw vbb(new mde(tvd((h0d(),yue))));nde(this);return a};_.Vl=function Zde(){var a,b;nde(this);a=this.f++;b=Efe(rde(this),a);if(this.c!=7)throw vbb(new mde(tvd((h0d(),yue))));nde(this);return b};_.Wl=function $de(){var a;nde(this);a=Efe(rde(this),0);if(this.c!=7)throw vbb(new mde(tvd((h0d(),yue))));nde(this);return a};_.Xl=function _de(a){nde(this);if(this.c==5){nde(this);return Bfe(a,(wfe(),wfe(),++vfe,new lge(9,a)))}else return Bfe(a,(wfe(),wfe(),++vfe,new lge(3,a)))};_.Yl=function aee(a){var b;nde(this);b=(wfe(),wfe(),++vfe,new Lge(2));if(this.c==5){nde(this);Kge(b,(null,ffe));Kge(b,a)}else{Kge(b,a);Kge(b,(null,ffe))}return b};_.Zl=function bee(a){nde(this);if(this.c==5){nde(this);return wfe(),wfe(),++vfe,new lge(9,a)}else return wfe(),wfe(),++vfe,new lge(3,a)};_.a=0;_.b=0;_.c=0;_.d=0;_.e=0;_.f=1;_.g=null;_.j=0;var bbb=mdb(kxe,'RegEx/RegexParser',820);bcb(1824,820,{},hee);_.sl=function iee(a){return false};_.tl=function jee(){return eee(this)};_.ul=function lee(a){return fee(a)};_.vl=function mee(a){return gee(this)};_.wl=function nee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.xl=function oee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.yl=function pee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.zl=function qee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Al=function ree(){nde(this);return fee(67)};_.Bl=function see(){nde(this);return fee(73)};_.Cl=function tee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Dl=function uee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.El=function vee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Fl=function wee(){nde(this);return fee(99)};_.Gl=function xee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Hl=function yee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Il=function zee(){nde(this);return fee(105)};_.Jl=function Aee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Kl=function Bee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Ll=function Cee(a,b){return Xfe(a,fee(b)),-1};_.Ml=function Dee(){nde(this);return wfe(),wfe(),++vfe,new ige(0,94)};_.Nl=function Eee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Ol=function Fee(){nde(this);return wfe(),wfe(),++vfe,new ige(0,36)};_.Pl=function Gee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Ql=function Hee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Rl=function Iee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Sl=function Jee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Tl=function Kee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Ul=function Lee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Vl=function Mee(){var a;nde(this);a=Efe(rde(this),0);if(this.c!=7)throw vbb(new mde(tvd((h0d(),yue))));nde(this);return a};_.Wl=function Nee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Xl=function Oee(a){nde(this);return Bfe(a,(wfe(),wfe(),++vfe,new lge(3,a)))};_.Yl=function Pee(a){var b;nde(this);b=(wfe(),wfe(),++vfe,new Lge(2));Kge(b,a);Kge(b,(null,ffe));return b};_.Zl=function Qee(a){nde(this);return wfe(),wfe(),++vfe,new lge(3,a)};var cee=null,dee=null;var $ab=mdb(kxe,'RegEx/ParserForXMLSchema',1824);bcb(117,1,yxe,xfe);_.$l=function yfe(a){throw vbb(new hz('Not supported.'))};_._l=function Gfe(){return -1};_.am=function Hfe(a){return null};_.bm=function Mfe(){return null};_.cm=function Pfe(a){};_.dm=function Qfe(a){};_.em=function Rfe(){return 0};_.Ib=function Sfe(){return this.fm(0)};_.fm=function Tfe(a){return this.e==11?'.':''};_.e=0;var Yee,Zee,$ee,_ee,afe,bfe=null,cfe,dfe=null,efe,ffe,gfe=null,hfe,ife,jfe,kfe,lfe,mfe,nfe,ofe,pfe,qfe,rfe,sfe,tfe,ufe,vfe=0;var lbb=mdb(kxe,'RegEx/Token',117);bcb(136,117,{3:1,136:1,117:1},$fe);_.fm=function bge(a){var b,c,d;if(this.e==4){if(this==efe)c='.';else if(this==cfe)c='\\d';else if(this==sfe)c='\\w';else if(this==nfe)c='\\s';else{d=new Hfb;d.a+='[';for(b=0;b0&&(d.a+=',',d);if(this.b[b]===this.b[b+1]){Efb(d,age(this.b[b]))}else{Efb(d,age(this.b[b]));d.a+='-';Efb(d,age(this.b[b+1]))}}d.a+=']';c=d.a}}else{if(this==jfe)c='\\D';else if(this==lfe)c='\\W';else if(this==kfe)c='\\S';else{d=new Hfb;d.a+='[^';for(b=0;b0&&(d.a+=',',d);if(this.b[b]===this.b[b+1]){Efb(d,age(this.b[b]))}else{Efb(d,age(this.b[b]));d.a+='-';Efb(d,age(this.b[b+1]))}}d.a+=']';c=d.a}}return c};_.a=false;_.c=false;var _ab=mdb(kxe,'RegEx/RangeToken',136);bcb(584,1,{584:1},cge);_.a=0;var abb=mdb(kxe,'RegEx/RegexParser/ReferencePosition',584);bcb(583,1,{3:1,583:1},ege);_.Fb=function fge(a){var b;if(a==null)return false;if(!JD(a,583))return false;b=BD(a,583);return dfb(this.b,b.b)&&this.a==b.a};_.Hb=function gge(){return LCb(this.b+'/'+See(this.a))};_.Ib=function hge(){return this.c.fm(this.a)};_.a=0;var cbb=mdb(kxe,'RegEx/RegularExpression',583);bcb(223,117,yxe,ige);_._l=function jge(){return this.a};_.fm=function kge(a){var b,c,d;switch(this.e){case 0:switch(this.a){case 124:case 42:case 43:case 63:case 40:case 41:case 46:case 91:case 123:case 92:d='\\'+HD(this.a&aje);break;case 12:d='\\f';break;case 10:d='\\n';break;case 13:d='\\r';break;case 9:d='\\t';break;case 27:d='\\e';break;default:if(this.a>=Tje){c=(b=this.a>>>0,'0'+b.toString(16));d='\\v'+qfb(c,c.length-6,c.length)}else d=''+HD(this.a&aje);}break;case 8:this==hfe||this==ife?(d=''+HD(this.a&aje)):(d='\\'+HD(this.a&aje));break;default:d=null;}return d};_.a=0;var dbb=mdb(kxe,'RegEx/Token/CharToken',223);bcb(309,117,yxe,lge);_.am=function mge(a){return this.a};_.cm=function nge(a){this.b=a};_.dm=function oge(a){this.c=a};_.em=function pge(){return 1};_.fm=function qge(a){var b;if(this.e==3){if(this.c<0&&this.b<0){b=this.a.fm(a)+'*'}else if(this.c==this.b){b=this.a.fm(a)+'{'+this.c+'}'}else if(this.c>=0&&this.b>=0){b=this.a.fm(a)+'{'+this.c+','+this.b+'}'}else if(this.c>=0&&this.b<0){b=this.a.fm(a)+'{'+this.c+',}'}else throw vbb(new hz('Token#toString(): CLOSURE '+this.c+She+this.b))}else{if(this.c<0&&this.b<0){b=this.a.fm(a)+'*?'}else if(this.c==this.b){b=this.a.fm(a)+'{'+this.c+'}?'}else if(this.c>=0&&this.b>=0){b=this.a.fm(a)+'{'+this.c+','+this.b+'}?'}else if(this.c>=0&&this.b<0){b=this.a.fm(a)+'{'+this.c+',}?'}else throw vbb(new hz('Token#toString(): NONGREEDYCLOSURE '+this.c+She+this.b))}return b};_.b=0;_.c=0;var ebb=mdb(kxe,'RegEx/Token/ClosureToken',309);bcb(821,117,yxe,rge);_.am=function sge(a){return a==0?this.a:this.b};_.em=function tge(){return 2};_.fm=function uge(a){var b;this.b.e==3&&this.b.am(0)==this.a?(b=this.a.fm(a)+'+'):this.b.e==9&&this.b.am(0)==this.a?(b=this.a.fm(a)+'+?'):(b=this.a.fm(a)+(''+this.b.fm(a)));return b};var fbb=mdb(kxe,'RegEx/Token/ConcatToken',821);bcb(1822,117,yxe,vge);_.am=function wge(a){if(a==0)return this.d;if(a==1)return this.b;throw vbb(new hz('Internal Error: '+a))};_.em=function xge(){return !this.b?1:2};_.fm=function yge(a){var b;this.c>0?(b='(?('+this.c+')'):this.a.e==8?(b='(?('+this.a+')'):(b='(?'+this.a);!this.b?(b+=this.d+')'):(b+=this.d+'|'+this.b+')');return b};_.c=0;var gbb=mdb(kxe,'RegEx/Token/ConditionToken',1822);bcb(1823,117,yxe,zge);_.am=function Age(a){return this.b};_.em=function Bge(){return 1};_.fm=function Cge(a){return '(?'+(this.a==0?'':See(this.a))+(this.c==0?'':See(this.c))+':'+this.b.fm(a)+')'};_.a=0;_.c=0;var hbb=mdb(kxe,'RegEx/Token/ModifierToken',1823);bcb(822,117,yxe,Dge);_.am=function Ege(a){return this.a};_.em=function Fge(){return 1};_.fm=function Gge(a){var b;b=null;switch(this.e){case 6:this.b==0?(b='(?:'+this.a.fm(a)+')'):(b='('+this.a.fm(a)+')');break;case 20:b='(?='+this.a.fm(a)+')';break;case 21:b='(?!'+this.a.fm(a)+')';break;case 22:b='(?<='+this.a.fm(a)+')';break;case 23:b='(?'+this.a.fm(a)+')';}return b};_.b=0;var ibb=mdb(kxe,'RegEx/Token/ParenToken',822);bcb(521,117,{3:1,117:1,521:1},Hge);_.bm=function Ige(){return this.b};_.fm=function Jge(a){return this.e==12?'\\'+this.a:Wee(this.b)};_.a=0;var jbb=mdb(kxe,'RegEx/Token/StringToken',521);bcb(465,117,yxe,Lge);_.$l=function Mge(a){Kge(this,a)};_.am=function Nge(a){return BD(Uvb(this.a,a),117)};_.em=function Oge(){return !this.a?0:this.a.a.c.length};_.fm=function Pge(a){var b,c,d,e,f;if(this.e==1){if(this.a.a.c.length==2){b=BD(Uvb(this.a,0),117);c=BD(Uvb(this.a,1),117);c.e==3&&c.am(0)==b?(e=b.fm(a)+'+'):c.e==9&&c.am(0)==b?(e=b.fm(a)+'+?'):(e=b.fm(a)+(''+c.fm(a)))}else{f=new Hfb;for(d=0;d=this.c.b:this.a<=this.c.b};_.Sb=function whe(){return this.b>0};_.Tb=function yhe(){return this.b};_.Vb=function Ahe(){return this.b-1};_.Qb=function Bhe(){throw vbb(new cgb(Exe))};_.a=0;_.b=0;var pbb=mdb(Bxe,'ExclusiveRange/RangeIterator',254);var TD=pdb(Fve,'C');var WD=pdb(Ive,'I');var sbb=pdb(Khe,'Z');var XD=pdb(Jve,'J');var SD=pdb(Eve,'B');var UD=pdb(Gve,'D');var VD=pdb(Hve,'F');var rbb=pdb(Kve,'S');var h1=odb('org.eclipse.elk.core.labels','ILabelManager');var O4=odb(Tte,'DiagnosticChain');var u8=odb(pwe,'ResourceSet');var V4=mdb(Tte,'InvocationTargetException',null);var Ihe=(Az(),Dz);var gwtOnLoad=gwtOnLoad=Zbb;Xbb(hcb);$bb('permProps',[[[Fxe,Gxe],[Hxe,'gecko1_8']],[[Fxe,Gxe],[Hxe,'ie10']],[[Fxe,Gxe],[Hxe,'ie8']],[[Fxe,Gxe],[Hxe,'ie9']],[[Fxe,Gxe],[Hxe,'safari']]]); +// -------------- RUN GWT INITIALIZATION CODE -------------- +gwtOnLoad(null, 'elk', null); + +}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],3:[function(require,module,exports){ +'use strict'; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +/******************************************************************************* + * Copyright (c) 2021 Kiel University and others. + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0. + * + * SPDX-License-Identifier: EPL-2.0 + *******************************************************************************/ +var ELK = require('./elk-api.js').default; + +var ELKNode = function (_ELK) { + _inherits(ELKNode, _ELK); + + function ELKNode() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + _classCallCheck(this, ELKNode); + + var optionsClone = Object.assign({}, options); + + var workerThreadsExist = false; + try { + require.resolve('web-worker'); + workerThreadsExist = true; + } catch (e) {} + + // user requested a worker + if (options.workerUrl) { + if (workerThreadsExist) { + var Worker = require('web-worker'); + optionsClone.workerFactory = function (url) { + return new Worker(url); + }; + } else { + console.warn('Web worker requested but \'web-worker\' package not installed. \nConsider installing the package or pass your own \'workerFactory\' to ELK\'s constructor.\n... Falling back to non-web worker version.'); + } + } + + // unless no other workerFactory is registered, use the fake worker + if (!optionsClone.workerFactory) { + var _require = require('./elk-worker.min.js'), + _Worker = _require.Worker; + + optionsClone.workerFactory = function (url) { + return new _Worker(url); + }; + } + + return _possibleConstructorReturn(this, (ELKNode.__proto__ || Object.getPrototypeOf(ELKNode)).call(this, optionsClone)); + } + + return ELKNode; +}(ELK); + +Object.defineProperty(module.exports, "__esModule", { + value: true +}); +module.exports = ELKNode; +ELKNode.default = ELKNode; +},{"./elk-api.js":1,"./elk-worker.min.js":2,"web-worker":4}],4:[function(require,module,exports){ +/** + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +module.exports = Worker; +},{}]},{},[3])(3) +}); + + +/***/ }), + +/***/ 19487: +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ diagram: () => (/* binding */ diagram) +/* harmony export */ }); +/* harmony import */ var _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(87115); +/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(59373); +/* harmony import */ var dagre_d3_es_src_dagre_js_label_add_html_label_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(43349); +/* harmony import */ var elkjs_lib_elk_bundled_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(17295); +/* harmony import */ var elkjs_lib_elk_bundled_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(elkjs_lib_elk_bundled_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(27484); +/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(dayjs__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _braintree_sanitize_url__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(17967); +/* harmony import */ var dompurify__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(20683); +/* harmony import */ var dagre_d3_es_src_dagre_index_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(70277); +/* harmony import */ var dagre_d3_es_src_graphlib_index_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(45625); +/* harmony import */ var dagre_d3_es_src_graphlib_json_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(39354); +/* harmony import */ var dagre_d3_es__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(91518); +/* harmony import */ var dayjs_plugin_isoWeek_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(59542); +/* harmony import */ var dayjs_plugin_isoWeek_js__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(dayjs_plugin_isoWeek_js__WEBPACK_IMPORTED_MODULE_9__); +/* harmony import */ var dayjs_plugin_customParseFormat_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(10285); +/* harmony import */ var dayjs_plugin_customParseFormat_js__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(dayjs_plugin_customParseFormat_js__WEBPACK_IMPORTED_MODULE_10__); +/* harmony import */ var dayjs_plugin_advancedFormat_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(28734); +/* harmony import */ var dayjs_plugin_advancedFormat_js__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(dayjs_plugin_advancedFormat_js__WEBPACK_IMPORTED_MODULE_11__); + + + + + + + + + + + + + + + + + + + + + + + +const findCommonAncestor = (id1, id2, treeData) => { + const { parentById } = treeData; + const visited = /* @__PURE__ */ new Set(); + let currentId = id1; + while (currentId) { + visited.add(currentId); + if (currentId === id2) { + return currentId; + } + currentId = parentById[currentId]; + } + currentId = id2; + while (currentId) { + if (visited.has(currentId)) { + return currentId; + } + currentId = parentById[currentId]; + } + return "root"; +}; +const elk = new (elkjs_lib_elk_bundled_js__WEBPACK_IMPORTED_MODULE_1___default())(); +const portPos = {}; +const conf = {}; +let nodeDb = {}; +const addVertices = function(vert, svgId, root, doc, diagObj, parentLookupDb, graph) { + const svg = root.select(`[id="${svgId}"]`); + const nodes = svg.insert("g").attr("class", "nodes"); + const keys = Object.keys(vert); + keys.forEach(function(id) { + const vertex = vert[id]; + let classStr = "default"; + if (vertex.classes.length > 0) { + classStr = vertex.classes.join(" "); + } + const styles2 = (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.a)(vertex.styles); + let vertexText = vertex.text !== void 0 ? vertex.text : vertex.id; + let vertexNode; + const labelData = { width: 0, height: 0 }; + if ((0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.e)((0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.g)().flowchart.htmlLabels)) { + const node2 = { + label: vertexText.replace( + /fa[blrs]?:fa-[\w-]+/g, + (s) => `` + ) + }; + vertexNode = (0,dagre_d3_es_src_dagre_js_label_add_html_label_js__WEBPACK_IMPORTED_MODULE_13__/* .addHtmlLabel */ .a)(svg, node2).node(); + const bbox = vertexNode.getBBox(); + labelData.width = bbox.width; + labelData.height = bbox.height; + labelData.labelNode = vertexNode; + vertexNode.parentNode.removeChild(vertexNode); + } else { + const svgLabel = doc.createElementNS("http://www.w3.org/2000/svg", "text"); + svgLabel.setAttribute("style", styles2.labelStyle.replace("color:", "fill:")); + const rows = vertexText.split(_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.c.lineBreakRegex); + for (const row of rows) { + const tspan = doc.createElementNS("http://www.w3.org/2000/svg", "tspan"); + tspan.setAttributeNS("http://www.w3.org/XML/1998/namespace", "xml:space", "preserve"); + tspan.setAttribute("dy", "1em"); + tspan.setAttribute("x", "1"); + tspan.textContent = row; + svgLabel.appendChild(tspan); + } + vertexNode = svgLabel; + const bbox = vertexNode.getBBox(); + labelData.width = bbox.width; + labelData.height = bbox.height; + labelData.labelNode = vertexNode; + } + const ports = [ + { + id: vertex.id + "-west", + layoutOptions: { + "port.side": "WEST" + } + }, + { + id: vertex.id + "-east", + layoutOptions: { + "port.side": "EAST" + } + }, + { + id: vertex.id + "-south", + layoutOptions: { + "port.side": "SOUTH" + } + }, + { + id: vertex.id + "-north", + layoutOptions: { + "port.side": "NORTH" + } + } + ]; + let radious = 0; + let _shape = ""; + let layoutOptions = {}; + switch (vertex.type) { + case "round": + radious = 5; + _shape = "rect"; + break; + case "square": + _shape = "rect"; + break; + case "diamond": + _shape = "question"; + layoutOptions = { + portConstraints: "FIXED_SIDE" + }; + break; + case "hexagon": + _shape = "hexagon"; + break; + case "odd": + _shape = "rect_left_inv_arrow"; + break; + case "lean_right": + _shape = "lean_right"; + break; + case "lean_left": + _shape = "lean_left"; + break; + case "trapezoid": + _shape = "trapezoid"; + break; + case "inv_trapezoid": + _shape = "inv_trapezoid"; + break; + case "odd_right": + _shape = "rect_left_inv_arrow"; + break; + case "circle": + _shape = "circle"; + break; + case "ellipse": + _shape = "ellipse"; + break; + case "stadium": + _shape = "stadium"; + break; + case "subroutine": + _shape = "subroutine"; + break; + case "cylinder": + _shape = "cylinder"; + break; + case "group": + _shape = "rect"; + break; + case "doublecircle": + _shape = "doublecircle"; + break; + default: + _shape = "rect"; + } + const node = { + labelStyle: styles2.labelStyle, + shape: _shape, + labelText: vertexText, + rx: radious, + ry: radious, + class: classStr, + style: styles2.style, + id: vertex.id, + link: vertex.link, + linkTarget: vertex.linkTarget, + tooltip: diagObj.db.getTooltip(vertex.id) || "", + domId: diagObj.db.lookUpDomId(vertex.id), + haveCallback: vertex.haveCallback, + width: vertex.type === "group" ? 500 : void 0, + dir: vertex.dir, + type: vertex.type, + props: vertex.props, + padding: (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.g)().flowchart.padding + }; + let boundingBox; + let nodeEl; + if (node.type !== "group") { + nodeEl = (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.b)(nodes, node, vertex.dir); + boundingBox = nodeEl.node().getBBox(); + } + const data = { + id: vertex.id, + ports: vertex.type === "diamond" ? ports : [], + // labelStyle: styles.labelStyle, + // shape: _shape, + layoutOptions, + labelText: vertexText, + labelData, + // labels: [{ text: vertexText }], + // rx: radius, + // ry: radius, + // class: classStr, + // style: styles.style, + // link: vertex.link, + // linkTarget: vertex.linkTarget, + // tooltip: diagObj.db.getTooltip(vertex.id) || '', + domId: diagObj.db.lookUpDomId(vertex.id), + // haveCallback: vertex.haveCallback, + width: boundingBox == null ? void 0 : boundingBox.width, + height: boundingBox == null ? void 0 : boundingBox.height, + // dir: vertex.dir, + type: vertex.type, + // props: vertex.props, + // padding: getConfig().flowchart.padding, + // boundingBox, + el: nodeEl, + parent: parentLookupDb.parentById[vertex.id] + }; + nodeDb[node.id] = data; + }); + return graph; +}; +const getNextPosition = (position, edgeDirection, graphDirection) => { + const portPos2 = { + TB: { + in: { + north: "north" + }, + out: { + south: "west", + west: "east", + east: "south" + } + }, + LR: { + in: { + west: "west" + }, + out: { + east: "south", + south: "north", + north: "east" + } + }, + RL: { + in: { + east: "east" + }, + out: { + west: "north", + north: "south", + south: "west" + } + }, + BT: { + in: { + south: "south" + }, + out: { + north: "east", + east: "west", + west: "north" + } + } + }; + portPos2.TD = portPos2.TB; + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.l.info("abc88", graphDirection, edgeDirection, position); + return portPos2[graphDirection][edgeDirection][position]; +}; +const getNextPort = (node, edgeDirection, graphDirection) => { + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.l.info("getNextPort abc88", { node, edgeDirection, graphDirection }); + if (!portPos[node]) { + switch (graphDirection) { + case "TB": + case "TD": + portPos[node] = { + inPosition: "north", + outPosition: "south" + }; + break; + case "BT": + portPos[node] = { + inPosition: "south", + outPosition: "north" + }; + break; + case "RL": + portPos[node] = { + inPosition: "east", + outPosition: "west" + }; + break; + case "LR": + portPos[node] = { + inPosition: "west", + outPosition: "east" + }; + break; + } + } + const result = edgeDirection === "in" ? portPos[node].inPosition : portPos[node].outPosition; + if (edgeDirection === "in") { + portPos[node].inPosition = getNextPosition( + portPos[node].inPosition, + edgeDirection, + graphDirection + ); + } else { + portPos[node].outPosition = getNextPosition( + portPos[node].outPosition, + edgeDirection, + graphDirection + ); + } + return result; +}; +const getEdgeStartEndPoint = (edge, dir) => { + let source = edge.start; + let target = edge.end; + const startNode = nodeDb[source]; + const endNode = nodeDb[target]; + if (!startNode || !endNode) { + return { source, target }; + } + if (startNode.type === "diamond") { + source = `${source}-${getNextPort(source, "out", dir)}`; + } + if (endNode.type === "diamond") { + target = `${target}-${getNextPort(target, "in", dir)}`; + } + return { source, target }; +}; +const addEdges = function(edges, diagObj, graph, svg) { + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.l.info("abc78 edges = ", edges); + const labelsEl = svg.insert("g").attr("class", "edgeLabels"); + let linkIdCnt = {}; + let dir = diagObj.db.getDirection(); + let defaultStyle; + let defaultLabelStyle; + if (edges.defaultStyle !== void 0) { + const defaultStyles = (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.a)(edges.defaultStyle); + defaultStyle = defaultStyles.style; + defaultLabelStyle = defaultStyles.labelStyle; + } + edges.forEach(function(edge) { + var linkIdBase = "L-" + edge.start + "-" + edge.end; + if (linkIdCnt[linkIdBase] === void 0) { + linkIdCnt[linkIdBase] = 0; + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.l.info("abc78 new entry", linkIdBase, linkIdCnt[linkIdBase]); + } else { + linkIdCnt[linkIdBase]++; + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.l.info("abc78 new entry", linkIdBase, linkIdCnt[linkIdBase]); + } + let linkId = linkIdBase + "-" + linkIdCnt[linkIdBase]; + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.l.info("abc78 new link id to be used is", linkIdBase, linkId, linkIdCnt[linkIdBase]); + var linkNameStart = "LS-" + edge.start; + var linkNameEnd = "LE-" + edge.end; + const edgeData = { style: "", labelStyle: "" }; + edgeData.minlen = edge.length || 1; + if (edge.type === "arrow_open") { + edgeData.arrowhead = "none"; + } else { + edgeData.arrowhead = "normal"; + } + edgeData.arrowTypeStart = "arrow_open"; + edgeData.arrowTypeEnd = "arrow_open"; + switch (edge.type) { + case "double_arrow_cross": + edgeData.arrowTypeStart = "arrow_cross"; + case "arrow_cross": + edgeData.arrowTypeEnd = "arrow_cross"; + break; + case "double_arrow_point": + edgeData.arrowTypeStart = "arrow_point"; + case "arrow_point": + edgeData.arrowTypeEnd = "arrow_point"; + break; + case "double_arrow_circle": + edgeData.arrowTypeStart = "arrow_circle"; + case "arrow_circle": + edgeData.arrowTypeEnd = "arrow_circle"; + break; + } + let style = ""; + let labelStyle = ""; + switch (edge.stroke) { + case "normal": + style = "fill:none;"; + if (defaultStyle !== void 0) { + style = defaultStyle; + } + if (defaultLabelStyle !== void 0) { + labelStyle = defaultLabelStyle; + } + edgeData.thickness = "normal"; + edgeData.pattern = "solid"; + break; + case "dotted": + edgeData.thickness = "normal"; + edgeData.pattern = "dotted"; + edgeData.style = "fill:none;stroke-width:2px;stroke-dasharray:3;"; + break; + case "thick": + edgeData.thickness = "thick"; + edgeData.pattern = "solid"; + edgeData.style = "stroke-width: 3.5px;fill:none;"; + break; + } + if (edge.style !== void 0) { + const styles2 = (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.a)(edge.style); + style = styles2.style; + labelStyle = styles2.labelStyle; + } + edgeData.style = edgeData.style += style; + edgeData.labelStyle = edgeData.labelStyle += labelStyle; + if (edge.interpolate !== void 0) { + edgeData.curve = (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.d)(edge.interpolate, d3__WEBPACK_IMPORTED_MODULE_0__/* .curveLinear */ .c_6); + } else if (edges.defaultInterpolate !== void 0) { + edgeData.curve = (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.d)(edges.defaultInterpolate, d3__WEBPACK_IMPORTED_MODULE_0__/* .curveLinear */ .c_6); + } else { + edgeData.curve = (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.d)(conf.curve, d3__WEBPACK_IMPORTED_MODULE_0__/* .curveLinear */ .c_6); + } + if (edge.text === void 0) { + if (edge.style !== void 0) { + edgeData.arrowheadStyle = "fill: #333"; + } + } else { + edgeData.arrowheadStyle = "fill: #333"; + edgeData.labelpos = "c"; + } + edgeData.labelType = "text"; + edgeData.label = edge.text.replace(_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.c.lineBreakRegex, "\n"); + if (edge.style === void 0) { + edgeData.style = edgeData.style || "stroke: #333; stroke-width: 1.5px;fill:none;"; + } + edgeData.labelStyle = edgeData.labelStyle.replace("color:", "fill:"); + edgeData.id = linkId; + edgeData.classes = "flowchart-link " + linkNameStart + " " + linkNameEnd; + const labelEl = (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.f)(labelsEl, edgeData); + const { source, target } = getEdgeStartEndPoint(edge, dir); + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.l.debug("abc78 source and target", source, target); + graph.edges.push({ + id: "e" + edge.start + edge.end, + sources: [source], + targets: [target], + labelEl, + labels: [ + { + width: edgeData.width, + height: edgeData.height, + orgWidth: edgeData.width, + orgHeight: edgeData.height, + text: edgeData.label, + layoutOptions: { + "edgeLabels.inline": "true", + "edgeLabels.placement": "CENTER" + } + } + ], + edgeData + }); + }); + return graph; +}; +const addMarkersToEdge = function(svgPath, edgeData, diagramType, arrowMarkerAbsolute) { + let url = ""; + if (arrowMarkerAbsolute) { + url = window.location.protocol + "//" + window.location.host + window.location.pathname + window.location.search; + url = url.replace(/\(/g, "\\("); + url = url.replace(/\)/g, "\\)"); + } + switch (edgeData.arrowTypeStart) { + case "arrow_cross": + svgPath.attr("marker-start", "url(" + url + "#" + diagramType + "-crossStart)"); + break; + case "arrow_point": + svgPath.attr("marker-start", "url(" + url + "#" + diagramType + "-pointStart)"); + break; + case "arrow_barb": + svgPath.attr("marker-start", "url(" + url + "#" + diagramType + "-barbStart)"); + break; + case "arrow_circle": + svgPath.attr("marker-start", "url(" + url + "#" + diagramType + "-circleStart)"); + break; + case "aggregation": + svgPath.attr("marker-start", "url(" + url + "#" + diagramType + "-aggregationStart)"); + break; + case "extension": + svgPath.attr("marker-start", "url(" + url + "#" + diagramType + "-extensionStart)"); + break; + case "composition": + svgPath.attr("marker-start", "url(" + url + "#" + diagramType + "-compositionStart)"); + break; + case "dependency": + svgPath.attr("marker-start", "url(" + url + "#" + diagramType + "-dependencyStart)"); + break; + case "lollipop": + svgPath.attr("marker-start", "url(" + url + "#" + diagramType + "-lollipopStart)"); + break; + } + switch (edgeData.arrowTypeEnd) { + case "arrow_cross": + svgPath.attr("marker-end", "url(" + url + "#" + diagramType + "-crossEnd)"); + break; + case "arrow_point": + svgPath.attr("marker-end", "url(" + url + "#" + diagramType + "-pointEnd)"); + break; + case "arrow_barb": + svgPath.attr("marker-end", "url(" + url + "#" + diagramType + "-barbEnd)"); + break; + case "arrow_circle": + svgPath.attr("marker-end", "url(" + url + "#" + diagramType + "-circleEnd)"); + break; + case "aggregation": + svgPath.attr("marker-end", "url(" + url + "#" + diagramType + "-aggregationEnd)"); + break; + case "extension": + svgPath.attr("marker-end", "url(" + url + "#" + diagramType + "-extensionEnd)"); + break; + case "composition": + svgPath.attr("marker-end", "url(" + url + "#" + diagramType + "-compositionEnd)"); + break; + case "dependency": + svgPath.attr("marker-end", "url(" + url + "#" + diagramType + "-dependencyEnd)"); + break; + case "lollipop": + svgPath.attr("marker-end", "url(" + url + "#" + diagramType + "-lollipopEnd)"); + break; + } +}; +const getClasses = function(text, diagObj) { + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.l.info("Extracting classes"); + diagObj.db.clear("ver-2"); + try { + diagObj.parse(text); + return diagObj.db.getClasses(); + } catch (e) { + return {}; + } +}; +const addSubGraphs = function(db2) { + const parentLookupDb = { parentById: {}, childrenById: {} }; + const subgraphs = db2.getSubGraphs(); + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.l.info("Subgraphs - ", subgraphs); + subgraphs.forEach(function(subgraph) { + subgraph.nodes.forEach(function(node) { + parentLookupDb.parentById[node] = subgraph.id; + if (parentLookupDb.childrenById[subgraph.id] === void 0) { + parentLookupDb.childrenById[subgraph.id] = []; + } + parentLookupDb.childrenById[subgraph.id].push(node); + }); + }); + subgraphs.forEach(function(subgraph) { + ({ id: subgraph.id }); + if (parentLookupDb.parentById[subgraph.id] !== void 0) { + parentLookupDb.parentById[subgraph.id]; + } + }); + return parentLookupDb; +}; +const calcOffset = function(src, dest, parentLookupDb) { + const ancestor = findCommonAncestor(src, dest, parentLookupDb); + if (ancestor === void 0 || ancestor === "root") { + return { x: 0, y: 0 }; + } + const ancestorOffset = nodeDb[ancestor].offset; + return { x: ancestorOffset.posX, y: ancestorOffset.posY }; +}; +const insertEdge = function(edgesEl, edge, edgeData, diagObj, parentLookupDb) { + const offset = calcOffset(edge.sources[0], edge.targets[0], parentLookupDb); + const src = edge.sections[0].startPoint; + const dest = edge.sections[0].endPoint; + const segments = edge.sections[0].bendPoints ? edge.sections[0].bendPoints : []; + const segPoints = segments.map((segment) => [segment.x + offset.x, segment.y + offset.y]); + const points = [ + [src.x + offset.x, src.y + offset.y], + ...segPoints, + [dest.x + offset.x, dest.y + offset.y] + ]; + const curve = (0,d3__WEBPACK_IMPORTED_MODULE_0__/* .line */ .jvg)().curve(d3__WEBPACK_IMPORTED_MODULE_0__/* .curveLinear */ .c_6); + const edgePath = edgesEl.insert("path").attr("d", curve(points)).attr("class", "path").attr("fill", "none"); + const edgeG = edgesEl.insert("g").attr("class", "edgeLabel"); + const edgeWithLabel = (0,d3__WEBPACK_IMPORTED_MODULE_0__/* .select */ .Ys)(edgeG.node().appendChild(edge.labelEl)); + const box = edgeWithLabel.node().firstChild.getBoundingClientRect(); + edgeWithLabel.attr("width", box.width); + edgeWithLabel.attr("height", box.height); + edgeG.attr( + "transform", + `translate(${edge.labels[0].x + offset.x}, ${edge.labels[0].y + offset.y})` + ); + addMarkersToEdge(edgePath, edgeData, diagObj.type, diagObj.arrowMarkerAbsolute); +}; +const insertChildren = (nodeArray, parentLookupDb) => { + nodeArray.forEach((node) => { + if (!node.children) { + node.children = []; + } + const childIds = parentLookupDb.childrenById[node.id]; + if (childIds) { + childIds.forEach((childId) => { + node.children.push(nodeDb[childId]); + }); + } + insertChildren(node.children, parentLookupDb); + }); +}; +const draw = async function(text, id, _version, diagObj) { + var _a; + diagObj.db.clear(); + nodeDb = {}; + diagObj.db.setGen("gen-2"); + diagObj.parser.parse(text); + const renderEl = (0,d3__WEBPACK_IMPORTED_MODULE_0__/* .select */ .Ys)("body").append("div").attr("style", "height:400px").attr("id", "cy"); + let graph = { + id: "root", + layoutOptions: { + "elk.hierarchyHandling": "INCLUDE_CHILDREN", + "org.eclipse.elk.padding": "[top=100, left=100, bottom=110, right=110]", + "elk.layered.spacing.edgeNodeBetweenLayers": "30", + // 'elk.layered.mergeEdges': 'true', + "elk.direction": "DOWN" + // 'elk.ports.sameLayerEdges': true, + // 'nodePlacement.strategy': 'SIMPLE', + }, + children: [], + edges: [] + }; + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.l.info("Drawing flowchart using v3 renderer", elk); + let dir = diagObj.db.getDirection(); + switch (dir) { + case "BT": + graph.layoutOptions["elk.direction"] = "UP"; + break; + case "TB": + graph.layoutOptions["elk.direction"] = "DOWN"; + break; + case "LR": + graph.layoutOptions["elk.direction"] = "RIGHT"; + break; + case "RL": + graph.layoutOptions["elk.direction"] = "LEFT"; + break; + } + const { securityLevel, flowchart: conf2 } = (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.g)(); + let sandboxElement; + if (securityLevel === "sandbox") { + sandboxElement = (0,d3__WEBPACK_IMPORTED_MODULE_0__/* .select */ .Ys)("#i" + id); + } + const root = securityLevel === "sandbox" ? (0,d3__WEBPACK_IMPORTED_MODULE_0__/* .select */ .Ys)(sandboxElement.nodes()[0].contentDocument.body) : (0,d3__WEBPACK_IMPORTED_MODULE_0__/* .select */ .Ys)("body"); + const doc = securityLevel === "sandbox" ? sandboxElement.nodes()[0].contentDocument : document; + const svg = root.select(`[id="${id}"]`); + const markers = ["point", "circle", "cross"]; + (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.i)(svg, markers, diagObj.type, diagObj.arrowMarkerAbsolute); + const vert = diagObj.db.getVertices(); + let subG; + const subGraphs = diagObj.db.getSubGraphs(); + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.l.info("Subgraphs - ", subGraphs); + for (let i = subGraphs.length - 1; i >= 0; i--) { + subG = subGraphs[i]; + diagObj.db.addVertex(subG.id, subG.title, "group", void 0, subG.classes, subG.dir); + } + const subGraphsEl = svg.insert("g").attr("class", "subgraphs"); + const parentLookupDb = addSubGraphs(diagObj.db); + graph = addVertices(vert, id, root, doc, diagObj, parentLookupDb, graph); + const edgesEl = svg.insert("g").attr("class", "edges edgePath"); + const edges = diagObj.db.getEdges(); + graph = addEdges(edges, diagObj, graph, svg); + const nodes = Object.keys(nodeDb); + nodes.forEach((nodeId) => { + const node = nodeDb[nodeId]; + if (!node.parent) { + graph.children.push(node); + } + if (parentLookupDb.childrenById[nodeId] !== void 0) { + node.labels = [ + { + text: node.labelText, + layoutOptions: { + "nodeLabels.placement": "[H_CENTER, V_TOP, INSIDE]" + }, + width: node.labelData.width, + height: node.labelData.height + } + ]; + delete node.x; + delete node.y; + delete node.width; + delete node.height; + } + }); + insertChildren(graph.children, parentLookupDb); + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.l.info("after layout", JSON.stringify(graph, null, 2)); + const g = await elk.layout(graph); + drawNodes(0, 0, g.children, svg, subGraphsEl, diagObj, 0); + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.l.info("after layout", g); + (_a = g.edges) == null ? void 0 : _a.map((edge) => { + insertEdge(edgesEl, edge, edge.edgeData, diagObj, parentLookupDb); + }); + (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.s)({}, svg, conf2.diagramPadding, conf2.useMaxWidth); + renderEl.remove(); +}; +const drawNodes = (relX, relY, nodeArray, svg, subgraphsEl, diagObj, depth) => { + nodeArray.forEach(function(node) { + if (node) { + nodeDb[node.id].offset = { + posX: node.x + relX, + posY: node.y + relY, + x: relX, + y: relY, + depth, + width: node.width, + height: node.height + }; + if (node.type === "group") { + const subgraphEl = subgraphsEl.insert("g").attr("class", "subgraph"); + subgraphEl.insert("rect").attr("class", "subgraph subgraph-lvl-" + depth % 5 + " node").attr("x", node.x + relX).attr("y", node.y + relY).attr("width", node.width).attr("height", node.height); + const label = subgraphEl.insert("g").attr("class", "label"); + label.attr( + "transform", + `translate(${node.labels[0].x + relX + node.x}, ${node.labels[0].y + relY + node.y})` + ); + label.node().appendChild(node.labelData.labelNode); + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.l.info("Id (UGH)= ", node.type, node.labels); + } else { + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.l.info("Id (UGH)= ", node.id); + node.el.attr( + "transform", + `translate(${node.x + relX + node.width / 2}, ${node.y + relY + node.height / 2})` + ); + } + } + }); + nodeArray.forEach(function(node) { + if (node && node.type === "group") { + drawNodes(relX + node.x, relY + node.y, node.children, svg, subgraphsEl, diagObj, depth + 1); + } + }); +}; +const renderer = { + getClasses, + draw +}; +const genSections = (options) => { + let sections = ""; + for (let i = 0; i < 5; i++) { + sections += ` + .subgraph-lvl-${i} { + fill: ${options[`surface${i}`]}; + stroke: ${options[`surfacePeer${i}`]}; + } + `; + } + return sections; +}; +const getStyles = (options) => `.label { + font-family: ${options.fontFamily}; + color: ${options.nodeTextColor || options.textColor}; + } + .cluster-label text { + fill: ${options.titleColor}; + } + .cluster-label span { + color: ${options.titleColor}; + } + + .label text,span { + fill: ${options.nodeTextColor || options.textColor}; + color: ${options.nodeTextColor || options.textColor}; + } + + .node rect, + .node circle, + .node ellipse, + .node polygon, + .node path { + fill: ${options.mainBkg}; + stroke: ${options.nodeBorder}; + stroke-width: 1px; + } + + .node .label { + text-align: center; + } + .node.clickable { + cursor: pointer; + } + + .arrowheadPath { + fill: ${options.arrowheadColor}; + } + + .edgePath .path { + stroke: ${options.lineColor}; + stroke-width: 2.0px; + } + + .flowchart-link { + stroke: ${options.lineColor}; + fill: none; + } + + .edgeLabel { + background-color: ${options.edgeLabelBackground}; + rect { + opacity: 0.5; + background-color: ${options.edgeLabelBackground}; + fill: ${options.edgeLabelBackground}; + } + text-align: center; + } + + .cluster rect { + fill: ${options.clusterBkg}; + stroke: ${options.clusterBorder}; + stroke-width: 1px; + } + + .cluster text { + fill: ${options.titleColor}; + } + + .cluster span { + color: ${options.titleColor}; + } + /* .cluster div { + color: ${options.titleColor}; + } */ + + div.mermaidTooltip { + position: absolute; + text-align: center; + max-width: 200px; + padding: 2px; + font-family: ${options.fontFamily}; + font-size: 12px; + background: ${options.tertiaryColor}; + border: 1px solid ${options.border2}; + border-radius: 2px; + pointer-events: none; + z-index: 100; + } + + .flowchartTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${options.textColor}; + } + .subgraph { + stroke-width:2; + rx:3; + } + // .subgraph-lvl-1 { + // fill:#ccc; + // // stroke:black; + // } + ${genSections(options)} +`; +const styles = getStyles; +const diagram = { + db: _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.h, + renderer, + parser: _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.p, + styles +}; + +//# sourceMappingURL=flowchart-elk-definition-170a3958.js.map + + +/***/ }) + +}; +; \ No newline at end of file diff --git a/assets/js/495e0345.3521aa1c.js b/assets/js/495e0345.3521aa1c.js new file mode 100644 index 0000000000..57367d15b0 --- /dev/null +++ b/assets/js/495e0345.3521aa1c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6309],{3013:s=>{s.exports=JSON.parse('{"title":"SCS-0410","slug":"standards/scs-0410","permalink":"/standards/standards/scs-0410","navigation":{"previous":{"title":"Status page OpenAPI decision","permalink":"/standards/scs-0402-v1-status-page-openapi-spec-decision"},"next":{"title":"Gnocchi as database for metering","permalink":"/standards/scs-0410-v1-gnocchi-as-metering-database"}}}')}}]); \ No newline at end of file diff --git a/assets/js/4972.908ebfbb.js b/assets/js/4972.908ebfbb.js new file mode 100644 index 0000000000..0db6edb90e --- /dev/null +++ b/assets/js/4972.908ebfbb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4972],{4972:(e,t,n)=>{n.r(t),n.d(t,{default:()=>c});var a=n(67294),l=n(95999),o=n(1944),r=n(70179);function c(){return a.createElement(a.Fragment,null,a.createElement(o.d,{title:(0,l.I)({id:"theme.NotFound.title",message:"Page Not Found"})}),a.createElement(r.Z,null,a.createElement("main",{className:"container margin-vert--xl"},a.createElement("div",{className:"row"},a.createElement("div",{className:"col col--6 col--offset-3"},a.createElement("h1",{className:"hero__title"},a.createElement(l.Z,{id:"theme.NotFound.title",description:"The title of the 404 page"},"Page Not Found")),a.createElement("p",null,a.createElement(l.Z,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page"},"We could not find what you were looking for.")),a.createElement("p",null,a.createElement(l.Z,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page"},"Please contact the owner of the site that linked you to the original URL and let them know their link is broken.")))))))}}}]); \ No newline at end of file diff --git a/assets/js/49993131.ee5e1f6f.js b/assets/js/49993131.ee5e1f6f.js new file mode 100644 index 0000000000..917e7c279d --- /dev/null +++ b/assets/js/49993131.ee5e1f6f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7060],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>u});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),p=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},d=function(e){var t=p(e.components);return a.createElement(l.Provider,{value:t},e.children)},m="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,s=e.originalType,l=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),m=p(n),c=r,u=m["".concat(l,".").concat(c)]||m[c]||h[c]||s;return n?a.createElement(u,o(o({ref:t},d),{},{components:n})):a.createElement(u,o({ref:t},d))}));function u(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var s=n.length,o=new Array(s);o[0]=c;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[m]="string"==typeof e?e:r,o[1]=i;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>s,metadata:()=>i,toc:()=>p});var a=n(87462),r=(n(67294),n(3905));const s={sidebar_label:"Releases",sidebar_position:10},o="Releases",i={unversionedId:"iaas/guides/other-guides/developer-guide/releases",id:"iaas/guides/other-guides/developer-guide/releases",title:"Releases",description:"How we handle releases",source:"@site/docs/02-iaas/guides/other-guides/developer-guide/releases.md",sourceDirName:"02-iaas/guides/other-guides/developer-guide",slug:"/iaas/guides/other-guides/developer-guide/releases",permalink:"/docs/iaas/guides/other-guides/developer-guide/releases",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/other-guides/developer-guide/releases.md",tags:[],version:"current",sidebarPosition:10,frontMatter:{sidebar_label:"Releases",sidebar_position:10},sidebar:"docs",previous:{title:"Developer Guide",permalink:"/docs/iaas/guides/other-guides/developer-guide/"},next:{title:"Scripts",permalink:"/docs/iaas/guides/other-guides/developer-guide/scripts"}},l={},p=[{value:"How we handle releases",id:"how-we-handle-releases",level:2},{value:"How to make a release",id:"how-to-make-a-release",level:2},{value:"Stable release",id:"stable-release",level:3},{value:"How we write release notes",id:"how-we-write-release-notes",level:2},{value:"Installation",id:"installation",level:3},{value:"Usage",id:"usage",level:3},{value:"Example",id:"example",level:3},{value:"Repositories without release notes",id:"repositories-without-release-notes",level:3}],d={toc:p},m="wrapper";function h(e){let{components:t,...n}=e;return(0,r.kt)(m,(0,a.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"releases"},"Releases"),(0,r.kt)("h2",{id:"how-we-handle-releases"},"How we handle releases"),(0,r.kt)("p",null,"Currently we do a major release every 6 months. Minor releases we do when\nneeded and about every 2 weeks."),(0,r.kt)("p",null,"In a minor release, only updates, bug fixes, etc. take place. There are also\nno major upgrades of included components such as OpenStack, Keycloak or Ceph\nin a minor release."),(0,r.kt)("p",null,"It is possible to jump from any minor version within a major version to higher\nminor versions without any intervention."),(0,r.kt)("p",null,"Deprecations, removals, etc. take place in a major release. New mandatory\nfeatures are also added in a major release. Upgrades of the included components\ncan also take place during a major release (e.g. OpenStack Xena -> OpenStack Yoga)."),(0,r.kt)("p",null,"It is possible to jump from the previous major version to the next major version.\nIt may be that manual intervention is necessary. For example, configuration\nparameters may need to be added or services that no longer exist may need to be\nremoved."),(0,r.kt)("h2",{id:"how-to-make-a-release"},"How to make a release"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"On all repositories that are used, check that the versions to be used have an\nappropriate version tag (e.g. ",(0,r.kt)("inlineCode",{parentName:"p"},"v0.20230308.0"),")."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"osism/ansible-collection-commons\nosism/ansible-collection-services\nosism/ansible-collection-validations\nosism/ansible-defaults\nosism/ansible-playbooks\nosism/ansible-playbooks-manager\nosism/cf-generics\nosism/kolla-operations\nosism/python-osism\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Copy the ",(0,r.kt)("inlineCode",{parentName:"p"},"latest")," directory. The release to be created is used as the new name."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"latest -> 6.0.0b\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Remove all ",(0,r.kt)("inlineCode",{parentName:"p"},"# renovate")," lines from the ",(0,r.kt)("inlineCode",{parentName:"p"},"base.yml")," file.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Remove all Ceph and OpenStack releases that should not be part of the pre-release.\nThere is only one OpenStack version and one Ceph version per (pre-)release.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Ensure that the symlinks ",(0,r.kt)("inlineCode",{parentName:"p"},"openstack.yml")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"ceph.yml")," point to the releases\nto be used in this pre-release."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"base.yml\nceph-pacific.yml\nceph.yml -> ceph-pacific.yml\nopenstack-zed.yml\nopenstack.yml -> openstack-zed.yml\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Run ",(0,r.kt)("inlineCode",{parentName:"p"},"src/prepare-release.py"),"."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"RELEASE=6.0.0b python3 src/prepare-release.py\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Do the steps from the ",(0,r.kt)("inlineCode",{parentName:"p"},"Stable release")," starting from the 4th step."))),(0,r.kt)("h3",{id:"stable-release"},"Stable release"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Copy the directory of the last pre-release or the previous stable release.\nThe release to be created is used as the new name."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"5.0.0a -> 5.0.0b\n5.0.0b -> 5.0.0\n5.0.0 -> 5.1.0\n5.1.0 -> 5.2.0\n5.2.0 -> 5.3.0\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Change all necessary versions in the YAML files within the new directory.\nIn any case, the version of the pre-release or the version of the stable\nrelease must be replaced by the release to be created.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"The release to be created is submitted as a pull request as usual and then\nmerged.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Add a tag with the name of the new release to the listed repositories."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"osism/container-image-ceph-ansible\nosism/container-image-inventory-reconciler\nosism/container-image-osism-ansible\nosism/container-images-kolla\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"After completing the creation of the images in repository ",(0,r.kt)("inlineCode",{parentName:"p"},"container-images-kolla"),",\nthe file ",(0,r.kt)("inlineCode",{parentName:"p"},"images.yml")," must be added to repository ",(0,r.kt)("inlineCode",{parentName:"p"},"osism/sbom")," as\n",(0,r.kt)("inlineCode",{parentName:"p"},"5.0.0/openstack.yml")," (instead of ",(0,r.kt)("inlineCode",{parentName:"p"},"5.0.0"),", the corresponding release is used).\nThe file is available as a build artefact of the ",(0,r.kt)("inlineCode",{parentName:"p"},"Release container images")," action\non the created tag."),(0,r.kt)("p",{parentName:"li"},"Before the file is added, it is enhanced with the checksums of the images. The script\nis available in the ",(0,r.kt)("inlineCode",{parentName:"p"},"osism/sbom")," repository."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"VERSION=5.0.0 python3 scripts/add-image-checksum.py\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"If ",(0,r.kt)("inlineCode",{parentName:"p"},"5.0.0/openstack.yml")," is present in ",(0,r.kt)("inlineCode",{parentName:"p"},"osism/sbom"),", repository\n",(0,r.kt)("inlineCode",{parentName:"p"},"osism/container-image-kolla-ansible")," can be tagged like the other\nrepositories before.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Add the created SPDX files from the listed repositories to the ",(0,r.kt)("inlineCode",{parentName:"p"},"osism/sbom")," repository.\nThe file are available as build artefacts of the ",(0,r.kt)("inlineCode",{parentName:"p"},"Build container image")," action\non the created tags."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"osism/container-image-ceph-ansible\nosism/container-image-kolla-ansible\nosism/container-image-osism-ansible\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Add and run temporary CI jobs in ",(0,r.kt)("inlineCode",{parentName:"p"},"osism/testbed")," that uses the pre-release."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},'- job:\n name: testbed-deploy-stable-next\n parent: testbed-deploy\n vars:\n manager_version: "5.0.0a"\n refstack: true\n nodeset: testbed-orchestrator\n\n- job:\n name: testbed-upgrade-stable-next\n parent: testbed-deploy\n vars:\n manager_version: "4.2.0"\n manager_version_next: "5.0.0a"\n nodeset: testbed-orchestrator\n'))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Test. Test. Test.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Prepare a PR to change the stable version to the new stable version in the following Zuul jobs\nin the ",(0,r.kt)("inlineCode",{parentName:"p"},"osism/testbed")," repository. All tests there must pass successfully before the tag is\nset on this repository in the next step. The temporary CI jobs (step 8) are removed again with\nthis PR."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"testbed-deploy-stable\ntestbed-update-stable\ntestbed-update-stable\ntestbed-upgrade-stable\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Add a new release notes file to ",(0,r.kt)("inlineCode",{parentName:"p"},"doc/sorce/notes"),". Generate the versions table with the\nhelp of the ",(0,r.kt)("inlineCode",{parentName:"p"},"release-table.py")," script in the ",(0,r.kt)("inlineCode",{parentName:"p"},"osism/sbom")," repository.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"After all known issues are documented, a corresponding tag, e.g. ",(0,r.kt)("inlineCode",{parentName:"p"},"5.0.0"),", is set on the\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/osism/release/releases"},"osism/release")," repository.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Create a ",(0,r.kt)("a",{parentName:"p",href:"https://docs.github.com/en/repositories/releasing-projects-on-github/managing-releases-in-a-repository"},"GitHub release")," with the new tag on the\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/osism/release/releases"},"osism/release")," repository. The release is\nnow public available.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"As the last of the release process, the previously prepared PR is merged on the\n",(0,r.kt)("inlineCode",{parentName:"p"},"osism/testbed")," repository to change the stable version."))),(0,r.kt)("h2",{id:"how-we-write-release-notes"},"How we write release notes"),(0,r.kt)("p",null,"We use ",(0,r.kt)("a",{parentName:"p",href:"https://docs.openstack.org/reno/latest/"},"Reno")," to manage the release notes."),(0,r.kt)("h3",{id:"installation"},"Installation"),(0,r.kt)("p",null,"Reno is provided as a ",(0,r.kt)("a",{parentName:"p",href:"https://pypi.org/project/reno/"},"Python package")," and can be installed with pip."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"pip3 install reno\n")),(0,r.kt)("h3",{id:"usage"},"Usage"),(0,r.kt)("p",null,"For each change in a repository, a release note is created with Reno.\nSomething meaningful is used as the name for the note. For example, if the\nrequirements file for Ansible is removed, ",(0,r.kt)("inlineCode",{parentName:"p"},"remove-ansible-requirements")," is a good name."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ reno new remove-ansible-requirements\nno configuration file in: ./releasenotes/config.yaml, ./reno.yaml\nCreated new notes file in releasenotes/notes/remove-ansible-requirements-6c6eba43f616bc6b.yaml\n")),(0,r.kt)("p",null,"The created file contains prepared entries for several categories. It is described briefly\nin each instance which contents belong in which category. What is not needed is deleted."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},"prelude: >\n Replace this text with content to appear at the top of the section for this\n release. All of the prelude content is merged together and then rendered\n separately from the items listed in other parts of the file, so the text\n needs to be worded so that both the prelude and the other items make sense\n when read independently. This may mean repeating some details. Not every\n release note requires a prelude. Usually only notes describing major\n features or adding release theme details should have a prelude.\nfeatures:\n - |\n List new features here, or remove this section. All of the list items in\n this section are combined when the release notes are rendered, so the text\n needs to be worded so that it does not depend on any information only\n available in another section, such as the prelude. This may mean repeating\n some details.\nissues:\n - |\n List known issues here, or remove this section. All of the list items in\n this section are combined when the release notes are rendered, so the text\n needs to be worded so that it does not depend on any information only\n available in another section, such as the prelude. This may mean repeating\n some details.\nupgrade:\n - |\n List upgrade notes here, or remove this section. All of the list items in\n this section are combined when the release notes are rendered, so the text\n needs to be worded so that it does not depend on any information only\n available in another section, such as the prelude. This may mean repeating\n some details.\ndeprecations:\n - |\n List deprecations notes here, or remove this section. All of the list\n items in this section are combined when the release notes are rendered, so\n the text needs to be worded so that it does not depend on any information\n only available in another section, such as the prelude. This may mean\n repeating some details.\ncritical:\n - |\n Add critical notes here, or remove this section. All of the list items in\n this section are combined when the release notes are rendered, so the text\n needs to be worded so that it does not depend on any information only\n available in another section, such as the prelude. This may mean repeating\n some details.\nsecurity:\n - |\n Add security notes here, or remove this section. All of the list items in\n this section are combined when the release notes are rendered, so the text\n needs to be worded so that it does not depend on any information only\n available in another section, such as the prelude. This may mean repeating\n some details.\nfixes:\n - |\n Add normal bug fixes here, or remove this section. All of the list items\n in this section are combined when the release notes are rendered, so the\n text needs to be worded so that it does not depend on any information only\n available in another section, such as the prelude. This may mean repeating\n some details.\nother:\n - |\n Add other notes here, or remove this section. All of the list items in\n this section are combined when the release notes are rendered, so the text\n needs to be worded so that it does not depend on any information only\n available in another section, such as the prelude. This may mean repeating\n some details.\n")),(0,r.kt)("h3",{id:"example"},"Example"),(0,r.kt)("p",null,"Here is an example of a ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/osism/cfg-generics/commit/e2f04a9f4a51eb058446d7a8ab6835df53989099"},"commit from the osism/cfg-generics repository"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},"---\nfeatures:\n - |\n The `requirements.yml` has been removed. The version will be set in the `run.sh`\n script for the seed process in the future exactly as later in the update process\n via the parameters `ANSIBLE_COLLECTION_SERVICES_VERSION` and\n `ANSIBLE_PLAYBOOKS_MANAGER_VERSION`.\nupgrade:\n - |\n In existing configuration repositories, the `environments/manager/requirements.yml`\n file can be removed after the generics have been synced.\n")),(0,r.kt)("h3",{id:"repositories-without-release-notes"},"Repositories without release notes"),(0,r.kt)("p",null,"We do not create release notes in the following repositories:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"osism/github-manager"),(0,r.kt)("li",{parentName:"ul"},"osism/osism.github.io"),(0,r.kt)("li",{parentName:"ul"},"osism/release")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/49bc3785.51b02e13.js b/assets/js/49bc3785.51b02e13.js new file mode 100644 index 0000000000..c77cf4aa99 --- /dev/null +++ b/assets/js/49bc3785.51b02e13.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9810],{3905:(t,e,a)=>{a.d(e,{Zo:()=>m,kt:()=>c});var l=a(67294);function n(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function r(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);e&&(l=l.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,l)}return a}function i(t){for(var e=1;e=0||(n[a]=t[a]);return n}(t,e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);for(l=0;l=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(n[a]=t[a])}return n}var s=l.createContext({}),u=function(t){var e=l.useContext(s),a=e;return t&&(a="function"==typeof t?t(e):i(i({},e),t)),a},m=function(t){var e=u(t.components);return l.createElement(s.Provider,{value:e},t.children)},p="mdxType",d={inlineCode:"code",wrapper:function(t){var e=t.children;return l.createElement(l.Fragment,{},e)}},o=l.forwardRef((function(t,e){var a=t.components,n=t.mdxType,r=t.originalType,s=t.parentName,m=k(t,["components","mdxType","originalType","parentName"]),p=u(a),o=n,c=p["".concat(s,".").concat(o)]||p[o]||d[o]||r;return a?l.createElement(c,i(i({ref:e},m),{},{components:a})):l.createElement(c,i({ref:e},m))}));function c(t,e){var a=arguments,n=e&&e.mdxType;if("string"==typeof t||n){var r=a.length,i=new Array(r);i[0]=o;var k={};for(var s in e)hasOwnProperty.call(e,s)&&(k[s]=e[s]);k.originalType=t,k[p]="string"==typeof t?t:n,i[1]=k;for(var u=2;u{a.r(e),a.d(e,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>r,metadata:()=>k,toc:()=>u});var l=a(87462),n=(a(67294),a(3905));const r={},i="Hackathon planning checklist",k={unversionedId:"hackathons/checklist",id:"hackathons/checklist",title:"Hackathon planning checklist",description:"This checklist is designed to simplify the planning of hackathons and meetups. All items are suggestions and optionally adaptable",source:"@site/community/hackathons/checklist.md",sourceDirName:"hackathons",slug:"/hackathons/checklist",permalink:"/community/hackathons/checklist",draft:!1,tags:[],version:"current",frontMatter:{}},s={},u=[{value:"Checklist 6 months before Hackathon",id:"checklist-6-months-before-hackathon",level:2},{value:"Checklist advertising",id:"checklist-advertising",level:2},{value:"Checklist 5 months before Hackathon",id:"checklist-5-months-before-hackathon",level:2},{value:"Checklist hotel",id:"checklist-hotel",level:2},{value:"Iportant things",id:"iportant-things",level:3},{value:"Nice-to-have things",id:"nice-to-have-things",level:3},{value:"Checklist 4 months before Hackathon",id:"checklist-4-months-before-hackathon",level:2},{value:"Checklist for evening before location",id:"checklist-for-evening-before-location",level:2},{value:"Checklist rooms 1",id:"checklist-rooms-1",level:2},{value:"Checklist merch (examples)",id:"checklist-merch-examples",level:2},{value:"Checklist 3 months before Hackathon",id:"checklist-3-months-before-hackathon",level:2},{value:"Checklist evening event",id:"checklist-evening-event",level:2},{value:"Checklist 2 months before Hackathon",id:"checklist-2-months-before-hackathon",level:2},{value:"Snacks checklist",id:"snacks-checklist",level:2},{value:"Breakfast examples",id:"breakfast-examples",level:3},{value:"Snack exemples",id:"snack-exemples",level:3},{value:"Vegan snack examples",id:"vegan-snack-examples",level:3},{value:"Checklist rooms 2",id:"checklist-rooms-2",level:2},{value:"Checklist 1 month before Hackathon",id:"checklist-1-month-before-hackathon",level:2},{value:"Checklist 1 week before Hackathon",id:"checklist-1-week-before-hackathon",level:2},{value:"Checklist one day before Hackathon",id:"checklist-one-day-before-hackathon",level:2},{value:"Checklist Hackathon Day X",id:"checklist-hackathon-day-x",level:2},{value:"Checklist after Hackathon",id:"checklist-after-hackathon",level:2}],m={toc:u},p="wrapper";function d(t){let{components:e,...a}=t;return(0,n.kt)(p,(0,l.Z)({},m,a,{components:e,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"hackathon-planning-checklist"},"Hackathon planning checklist"),(0,n.kt)("p",null,"This checklist is designed to simplify the planning of hackathons and meetups. All items are suggestions and optionally adaptable\nto the situation."),(0,n.kt)("h2",{id:"checklist-6-months-before-hackathon"},"Checklist 6 months before Hackathon"),(0,n.kt)("table",null,(0,n.kt)("thead",{parentName:"table"},(0,n.kt)("tr",{parentName:"thead"},(0,n.kt)("th",{parentName:"tr",align:null}),(0,n.kt)("th",{parentName:"tr",align:null},"Date"),(0,n.kt)("th",{parentName:"tr",align:null},"Task"))),(0,n.kt)("tbody",{parentName:"table"},(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Clarify sponsorship")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Clarify who is responsible for planning. Contact persons of the companies involved. These should then also be present at the hackathon.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Set a specific date.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Clarify responsibilities.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"First advertising in form of advertising in meetings, LinkedIn post, mailing list or similar.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Clarify which advertising measures are required (see checklist advertising).")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Determine venue.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Set the theme for the hackathon and apply it to the design.")))),(0,n.kt)("h2",{id:"checklist-advertising"},"Checklist advertising"),(0,n.kt)("table",null,(0,n.kt)("thead",{parentName:"table"},(0,n.kt)("tr",{parentName:"thead"},(0,n.kt)("th",{parentName:"tr",align:null}),(0,n.kt)("th",{parentName:"tr",align:null},"Topic"),(0,n.kt)("th",{parentName:"tr",align:null},"Task"))),(0,n.kt)("tbody",{parentName:"table"},(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null},"Social Media"),(0,n.kt)("td",{parentName:"tr",align:null},"Create content plan.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Which accounts/people/companies have to be mentioned as well.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Which persons must agree to a publication.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Should hashtags be used, if yes which ones.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null},"Newsletter"),(0,n.kt)("td",{parentName:"tr",align:null},"Create content plan with possible content and frequency.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null},"Website"),(0,n.kt)("td",{parentName:"tr",align:null},"Content plan: Blogposts.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Info landing page.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Registration page.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Special newsletter or just regular.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null},"Other placements"),(0,n.kt)("td",{parentName:"tr",align:null},"Spread the word in meetings or at other events.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null},"Media"),(0,n.kt)("td",{parentName:"tr",align:null},"Should be changeable, specify target audience, language, sources.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null},"Media suggestions"),(0,n.kt)("td",{parentName:"tr",align:null},"Video, images, PDF, texts, merch, graphics. Everything should be planned in advance precisely date, type, releases, scope, size, etc.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null},"Graphics"),(0,n.kt)("td",{parentName:"tr",align:null},"Set design motto.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null},"Key metrics"),(0,n.kt)("td",{parentName:"tr",align:null},"Should the success be tracked by key metrics, if so which ones.")))),(0,n.kt)("h2",{id:"checklist-5-months-before-hackathon"},"Checklist 5 months before Hackathon"),(0,n.kt)("table",null,(0,n.kt)("thead",{parentName:"table"},(0,n.kt)("tr",{parentName:"thead"},(0,n.kt)("th",{parentName:"tr",align:null}),(0,n.kt)("th",{parentName:"tr",align:null},"Date"),(0,n.kt)("th",{parentName:"tr",align:null},"Task"))),(0,n.kt)("tbody",{parentName:"table"},(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Clarify if extra merch is desired and start looking for vendors. Order samples.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Discuss concrete advertising measures.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Check hotels (see checklist hotel).")))),(0,n.kt)("h2",{id:"checklist-hotel"},"Checklist hotel"),(0,n.kt)("h3",{id:"iportant-things"},"Iportant things"),(0,n.kt)("ul",{className:"contains-task-list"},(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Availabilities in the period."),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Way from the hotel to the hackathon."),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Parking at the hotel."),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Way from train station to hotel."),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Checkin / Checkout times."),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Check barrier-free accessibility.")),(0,n.kt)("h3",{id:"nice-to-have-things"},"Nice-to-have things"),(0,n.kt)("ul",{className:"contains-task-list"},(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Bar in the hotel, for relaxed sitting together in the evening."),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Clarify whether employees from on site are also allowed in the bar."),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Clarify whether reservations must be made in the bar, if so, reserve for the evening before."),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Possibility of contingent reservation.")),(0,n.kt)("h2",{id:"checklist-4-months-before-hackathon"},"Checklist 4 months before Hackathon"),(0,n.kt)("table",null,(0,n.kt)("thead",{parentName:"table"},(0,n.kt)("tr",{parentName:"thead"},(0,n.kt)("th",{parentName:"tr",align:null}),(0,n.kt)("th",{parentName:"tr",align:null},"Date"),(0,n.kt)("th",{parentName:"tr",align:null},"Task"))),(0,n.kt)("tbody",{parentName:"table"},(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Determine hotel final and make recommendation. Possibly reserve contingent if the hotel offers it.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Find the location for the evening before (see checklist for evening before location).")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Start organizing venue. (See checklist rooms 1).")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Roughly plan evening event (consider volume level and space available).")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Promotional drumbeat. Social media, website, meetings, newsletter.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Order special merch.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Organize merch in general (see merch checklist).")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Start collecting statements that need to be sent around. (Privacy statements, photo statements, data center statements, security statements).")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Rough sequence of events to be able to plan more precisely at a later date.")))),(0,n.kt)("h2",{id:"checklist-for-evening-before-location"},"Checklist for evening before location"),(0,n.kt)("ul",{className:"contains-task-list"},(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Volume level."),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Consider food possibilities."),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Enough space."),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Availability."),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","If intermediate change from A to B, then plan and include firmly in the plan."),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","If it is necessary to choose two locations because of food, drink, coziness, distance to the hotel: plan both, ask for and book them."),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Ask for flexibility in the reservation. If more people come as registered."),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Plan times."),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Price / performance ratio should fit."),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Way from the hotel to the evening before location.")),(0,n.kt)("h2",{id:"checklist-rooms-1"},"Checklist rooms 1"),(0,n.kt)("ul",{className:"contains-task-list"},(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Space available (Enough space available for: Work area, meet-up area, no-photo area, break room, restrooms?)."),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Provisional room plan."),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","How long are the rooms available?"),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Are there any legal/corporate issues to consider?"),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Do declarations need to be signed to enter the premises?"),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","List what hackathon relevant equipment is on site and if anything needs to be organized. For example, screens, whiteboards, power sockets if necessary,\ntables, chairs, wi-fi, etc.")),(0,n.kt)("h2",{id:"checklist-merch-examples"},"Checklist merch (examples)"),(0,n.kt)("ul",{className:"contains-task-list"},(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Ballpens"),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Lanyards"),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Notepads"),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Stickers"),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","ID card / name badge covers"),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Name badges"),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Snacks")),(0,n.kt)("h2",{id:"checklist-3-months-before-hackathon"},"Checklist 3 months before Hackathon"),(0,n.kt)("table",null,(0,n.kt)("thead",{parentName:"table"},(0,n.kt)("tr",{parentName:"thead"},(0,n.kt)("th",{parentName:"tr",align:null}),(0,n.kt)("th",{parentName:"tr",align:null},"Date"),(0,n.kt)("th",{parentName:"tr",align:null},"Task"))),(0,n.kt)("tbody",{parentName:"table"},(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Required declarations (photo/video usage rights, data center, premises, etc.) are available as a form. Have a look if you can have")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"them confirmed with the registration. Otherwise as a circular email to all who register with the registration confirmation. Well")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"visible. For the photo/video declaration: Give the option of refusing and explain the variant with the no-photo dot.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Promote again: Website, social media, newsletter, meetings, circular email, etc....")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Make reservations for pre-evening event.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Plan evening event and reserve location / tables (see checklist evening event).")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Create a provisional schedule.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Eventually invite people separately. (Special guests).")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Schedule start time and arrival time. Allow enough time for everyone to arrive.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Set presentation time and end time.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Define arrival time evening event. Leave enough time to change, but also do not define too long.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Schedule a fixed cleanup time.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Plan break time.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Activate login page.")))),(0,n.kt)("h2",{id:"checklist-evening-event"},"Checklist evening event"),(0,n.kt)("ul",{className:"contains-task-list"},(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Volume level (It should be possible to have relaxed conversations)"),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Available space"),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Price / performance ratio should be suitable"),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Check availabilities"),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Snacks should be possible"),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Request flexibility with reservation (number of participants)"),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Actions would be a nice-to-have, everyone has been sitting and working all day, so it's good to have a change."),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Way from the hotel to the evening location.")),(0,n.kt)("h2",{id:"checklist-2-months-before-hackathon"},"Checklist 2 months before Hackathon"),(0,n.kt)("table",null,(0,n.kt)("thead",{parentName:"table"},(0,n.kt)("tr",{parentName:"thead"},(0,n.kt)("th",{parentName:"tr",align:null}),(0,n.kt)("th",{parentName:"tr",align:null},"Date"),(0,n.kt)("th",{parentName:"tr",align:null},"Task"))),(0,n.kt)("tbody",{parentName:"table"},(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Start collecting goals and topics.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Work out goals and topics yourself.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Check results from the checklist rooms 1 again.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Go through checklist rooms 2.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Advertising (social media, mailing list, website, blog post, newsletter, room plan video, etc).")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Go through checklists again in general, was anything forgotten?")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Plan food for the break.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Plan snacks / breakfast (See snacks checklist).")))),(0,n.kt)("h2",{id:"snacks-checklist"},"Snacks checklist"),(0,n.kt)("h3",{id:"breakfast-examples"},"Breakfast examples"),(0,n.kt)("ul",{className:"contains-task-list"},(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Sandwiches (rolls)"),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Pretzel sandwiches"),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Sandwiches (toast)"),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Cocktail tomatoes")),(0,n.kt)("h3",{id:"snack-exemples"},"Snack exemples"),(0,n.kt)("ul",{className:"contains-task-list"},(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ",'"Kinder Schokobons"'),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ",'"Kinder Schokoriegel"'),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ",'"Kinder Duplo"'),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Hanuta"),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Gummy bears"),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Apples"),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Bananas"),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Nuts"),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Grapes"),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Dried fruits"),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Salted sticks"),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Salted pretzels")),(0,n.kt)("h3",{id:"vegan-snack-examples"},"Vegan snack examples"),(0,n.kt)("ul",{className:"contains-task-list"},(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ",'"Katjes Fruchtgummi"'),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ",'"Katjes Lakritz"')),(0,n.kt)("h2",{id:"checklist-rooms-2"},"Checklist rooms 2"),(0,n.kt)("ul",{className:"contains-task-list"},(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Create a room plan for publication. In it, work areas, break areas, no-photo area, meet-up places should be clearly\nvisible. Gladly also again as a video."),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","If necessary route map."),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Is wifi available without any problems?"),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Where will drinks be located?"),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Where to set up snacks?"),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Where the food for the break?"),(0,n.kt)("li",{parentName:"ul",className:"task-list-item"},(0,n.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","Are there enough plates, cups, glasses, cutlery, napkins, and bowls for snacks?")),(0,n.kt)("h2",{id:"checklist-1-month-before-hackathon"},"Checklist 1 month before Hackathon"),(0,n.kt)("table",null,(0,n.kt)("thead",{parentName:"table"},(0,n.kt)("tr",{parentName:"thead"},(0,n.kt)("th",{parentName:"tr",align:null}),(0,n.kt)("th",{parentName:"tr",align:null},"Date"),(0,n.kt)("th",{parentName:"tr",align:null},"Task"))),(0,n.kt)("tbody",{parentName:"table"},(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Fix and publish the agenda.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Check the declarations once again, has every declaration been send, have any answered yet?")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Check reservations, expand if necessary.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Check whether all possible special features have been observed (location etc).")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Pre-order food for in-between meals and for the lunch break.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Plan drinks, type and quantity (don't forget coffee, tea, milk, sugar).")))),(0,n.kt)("h2",{id:"checklist-1-week-before-hackathon"},"Checklist 1 week before Hackathon"),(0,n.kt)("table",null,(0,n.kt)("thead",{parentName:"table"},(0,n.kt)("tr",{parentName:"thead"},(0,n.kt)("th",{parentName:"tr",align:null}),(0,n.kt)("th",{parentName:"tr",align:null},"Date"),(0,n.kt)("th",{parentName:"tr",align:null},"Task"))),(0,n.kt)("tbody",{parentName:"table"},(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Print statements and forms.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Advertise again.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Make a list for the snacks (See for inspiration checklist snacks).")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Pre-order the food, if necessary, check whether the quantity still fits with the registrations.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Depending on expand. Firmly plan transport / pickup / delivery.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Create a room plan with the topics, where, when, what takes place.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Organize drinks.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Determine the time when the helpers / organizers meet.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"If necessary create / organize lists and visitor cards.")))),(0,n.kt)("h2",{id:"checklist-one-day-before-hackathon"},"Checklist one day before Hackathon"),(0,n.kt)("table",null,(0,n.kt)("thead",{parentName:"table"},(0,n.kt)("tr",{parentName:"thead"},(0,n.kt)("th",{parentName:"tr",align:null}),(0,n.kt)("th",{parentName:"tr",align:null},"Date"),(0,n.kt)("th",{parentName:"tr",align:null},"Task"))),(0,n.kt)("tbody",{parentName:"table"},(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Buy snacks.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Contact food supplier again if the delivery date is suitable.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Check technology for functionality.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Send around the room plan with the topics by email.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Prepare rooms if necessary / possible.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Put drinks in the refrigerator.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Provide coffee machine.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Provide dishes.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Label rooms.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Check visitor cards and lists for completeness.")))),(0,n.kt)("h2",{id:"checklist-hackathon-day-x"},"Checklist Hackathon Day X"),(0,n.kt)("table",null,(0,n.kt)("thead",{parentName:"table"},(0,n.kt)("tr",{parentName:"thead"},(0,n.kt)("th",{parentName:"tr",align:null}),(0,n.kt)("th",{parentName:"tr",align:null},"Time"),(0,n.kt)("th",{parentName:"tr",align:null},"Task"))),(0,n.kt)("tbody",{parentName:"table"},(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Place snacks on the tables in small bowls or similar.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Distribute merchandise.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Have declarations and forms ready for late deciders.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Have lists and visitor cards ready if necessary.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Check drinks in an interval.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Make coffee if necessary.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Provide tea, coffee, milk, sugar.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Provide breakfast / snacks.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Pick up lunch.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},'Lunch "build up"')),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Cleanup")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Keep an eye on the process (keep times a little bit).")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"See if everyone feels picked up, no one is bored.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Makes Photos.")))),(0,n.kt)("h2",{id:"checklist-after-hackathon"},"Checklist after Hackathon"),(0,n.kt)("table",null,(0,n.kt)("thead",{parentName:"table"},(0,n.kt)("tr",{parentName:"thead"},(0,n.kt)("th",{parentName:"tr",align:null}),(0,n.kt)("th",{parentName:"tr",align:null},"Date"),(0,n.kt)("th",{parentName:"tr",align:null},"Task"))),(0,n.kt)("tbody",{parentName:"table"},(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Collect photos and provide them in a link for review and approval.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Create and send feedback sheet.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Create Blog Post Article.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Eventually create retro video.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Create social media posts. (After all approvals).")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Prepare debriefing.")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("ul",null,(0,n.kt)("li",null,"- ","[ ]"," "))),(0,n.kt)("td",{parentName:"tr",align:null}),(0,n.kt)("td",{parentName:"tr",align:null},"Summarize and process feedback.")))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4b015924.e7f9ce9f.js b/assets/js/4b015924.e7f9ce9f.js new file mode 100644 index 0000000000..cb5ee7281d --- /dev/null +++ b/assets/js/4b015924.e7f9ce9f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4476],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>v});var r=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=r.createContext({}),p=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},c=function(e){var t=p(e.components);return r.createElement(l.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=p(n),m=o,v=u["".concat(l,".").concat(m)]||u[m]||d[m]||i;return n?r.createElement(v,a(a({ref:t},c),{},{components:n})):r.createElement(v,a({ref:t},c))}));function v(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,a=new Array(i);a[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:o,a[1]=s;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var r=n(87462),o=(n(67294),n(3905));const i={sidebar_label:"Network",sidebar_position:15},a="Network",s={unversionedId:"iaas/guides/deploy-guide/services/network",id:"iaas/guides/deploy-guide/services/network",title:"Network",description:"Open vSwitch",source:"@site/docs/02-iaas/guides/deploy-guide/services/network.md",sourceDirName:"02-iaas/guides/deploy-guide/services",slug:"/iaas/guides/deploy-guide/services/network",permalink:"/docs/iaas/guides/deploy-guide/services/network",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/deploy-guide/services/network.md",tags:[],version:"current",sidebarPosition:15,frontMatter:{sidebar_label:"Network",sidebar_position:15},sidebar:"docs",previous:{title:"Infrastructure",permalink:"/docs/iaas/guides/deploy-guide/services/infrastructure"},next:{title:"Logging & Monitoring",permalink:"/docs/iaas/guides/deploy-guide/services/logging-monitoring"}},l={},p=[{value:"Open vSwitch",id:"open-vswitch",level:2},{value:"OVN (if used)",id:"ovn-if-used",level:2}],c={toc:p},u="wrapper";function d(e){let{components:t,...n}=e;return(0,o.kt)(u,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"network"},"Network"),(0,o.kt)("h2",{id:"open-vswitch"},"Open vSwitch"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"osism apply -a pull openvswitch\nosism apply openvswitch\n")),(0,o.kt)("h2",{id:"ovn-if-used"},"OVN (if used)"),(0,o.kt)("p",null,"In ",(0,o.kt)("inlineCode",{parentName:"p"},"environments/kolla/configuration.yml")," the parameter ",(0,o.kt)("inlineCode",{parentName:"p"},"neutron_plugin_agent")," is set to\n",(0,o.kt)("inlineCode",{parentName:"p"},"ovn")," if OVN is used as a network plugin. Otherwise the network plugin is set to ",(0,o.kt)("inlineCode",{parentName:"p"},"openvswitch"),"."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-yaml",metastring:'title="environments/kolla/configuration.yml"',title:'"environments/kolla/configuration.yml"'},'# neutron\nneutron_plugin_agent: "ovn"\nneutron_ovn_availability_zones: [ nova ]\n')),(0,o.kt)("p",null,"The deployment of the Open vSwitch service is non-optional.\nBefore the deployment of OVN, the deployment of Open vSwitch must already have been done."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"osism apply -a pull ovn\nosism apply ovn\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4e6fa974.528e633e.js b/assets/js/4e6fa974.528e633e.js new file mode 100644 index 0000000000..250c8461a3 --- /dev/null +++ b/assets/js/4e6fa974.528e633e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[342],{3905:(e,n,t)=>{t.d(n,{Zo:()=>m,kt:()=>g});var a=t(67294);function i(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function r(e){for(var n=1;n=0||(i[t]=e[t]);return i}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(i[t]=e[t])}return i}var l=a.createContext({}),d=function(e){var n=a.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):r(r({},n),e)),t},m=function(e){var n=d(e.components);return a.createElement(l.Provider,{value:n},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},c=a.forwardRef((function(e,n){var t=e.components,i=e.mdxType,o=e.originalType,l=e.parentName,m=s(e,["components","mdxType","originalType","parentName"]),p=d(t),c=i,g=p["".concat(l,".").concat(c)]||p[c]||u[c]||o;return t?a.createElement(g,r(r({ref:n},m),{},{components:t})):a.createElement(g,r({ref:n},m))}));function g(e,n){var t=arguments,i=n&&n.mdxType;if("string"==typeof e||i){var o=t.length,r=new Array(o);r[0]=c;var s={};for(var l in n)hasOwnProperty.call(n,l)&&(s[l]=n[l]);s.originalType=e,s[p]="string"==typeof e?e:i,r[1]=s;for(var d=2;d{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>u,frontMatter:()=>o,metadata:()=>s,toc:()=>d});var a=t(87462),i=(t(67294),t(3905));const o={title:"Domain Manager configuration for Keystone",type:"Standard",status:"Draft",track:"IAM"},r=void 0,s={unversionedId:"scs-0302-v1-domain-manager-role",id:"scs-0302-v1-domain-manager-role",title:"Domain Manager configuration for Keystone",description:"Introduction",source:"@site/standards/scs-0302-v1-domain-manager-role.md",sourceDirName:".",slug:"/scs-0302-v1-domain-manager-role",permalink:"/standards/scs-0302-v1-domain-manager-role",draft:!1,tags:[],version:"current",frontMatter:{title:"Domain Manager configuration for Keystone",type:"Standard",status:"Draft",track:"IAM"}},l={},d=[{value:"Introduction",id:"introduction",level:2},{value:"Glossary",id:"glossary",level:3},{value:"Impact",id:"impact",level:3},{value:"Motivation",id:"motivation",level:2},{value:"Desired Workflow",id:"desired-workflow",level:3},{value:"Design Considerations",id:"design-considerations",level:2},{value:"Options considered",id:"options-considered",level:3},{value:"Re-using the existing admin role",id:"re-using-the-existing-admin-role",level:4},{value:"Introducing a new role and API policy changes",id:"introducing-a-new-role-and-api-policy-changes",level:4},{value:"Open questions",id:"open-questions",level:2},{value:"Limitations",id:"limitations",level:3},{value:"Decision",id:"decision",level:2},{value:"Policy adjustments",id:"policy-adjustments",level:3},{value:"Specifying manageable roles via "is_domain_managed_role"",id:"specifying-manageable-roles-via-is_domain_managed_role",level:4},{value:"Example: permitting multiple roles",id:"example-permitting-multiple-roles",level:5},{value:"Related Documents",id:"related-documents",level:2},{value:""admin"-ness not properly scoped",id:"admin-ness-not-properly-scoped",level:3},{value:"Consistent and Secure Default RBAC",id:"consistent-and-secure-default-rbac",level:3},{value:"Conformance Tests",id:"conformance-tests",level:2},{value:"Appendix",id:"appendix",level:2},{value:"Decision Record",id:"decision-record",level:3},{value:"Allow flexibility for the roles a Domain Manager can assign/revoke within domain",id:"allow-flexibility-for-the-roles-a-domain-manager-can-assignrevoke-within-domain",level:4},{value:"Extend domain management functionality to Keystone groups",id:"extend-domain-management-functionality-to-keystone-groups",level:4},{value:"Change the naming of the Domain Manager role",id:"change-the-naming-of-the-domain-manager-role",level:4}],m={toc:d},p="wrapper";function u(e){let{components:n,...t}=e;return(0,i.kt)(p,(0,a.Z)({},m,t,{components:n,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"introduction"},"Introduction"),(0,i.kt)("p",null,"SCS Clouds should provide a way to grant Domain Manager rights to SCS Customers which provides IAM self-service capabilities within an OpenStack domain.\nThis is not properly implemented in the default OpenStack configuration and requires specific adjustments to the Keystone identity management configuration.\nTo avoid conflict with the unscoped ",(0,i.kt)("inlineCode",{parentName:"p"},"admin"),' role in OpenStack we want to refer to this new role as "Domain Manager" (',(0,i.kt)("inlineCode",{parentName:"p"},"domain-manager"),")."),(0,i.kt)("h3",{id:"glossary"},"Glossary"),(0,i.kt)("p",null,"The following special terms are used throughout this standard document:"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Term"),(0,i.kt)("th",{parentName:"tr",align:null},"Meaning"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"RBAC"),(0,i.kt)("td",{parentName:"tr",align:null},"Role-Based Access Control",(0,i.kt)("sup",{parentName:"td",id:"fnref-1"},(0,i.kt)("a",{parentName:"sup",href:"#fn-1",className:"footnote-ref"},"1"))," established by OpenStack Keystone")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"project"),(0,i.kt)("td",{parentName:"tr",align:null},"OpenStack project as per Keystone RBAC")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"user"),(0,i.kt)("td",{parentName:"tr",align:null},"OpenStack user as per Keystone RBAC")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"group"),(0,i.kt)("td",{parentName:"tr",align:null},"OpenStack group as per Keystone RBAC")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"role"),(0,i.kt)("td",{parentName:"tr",align:null},"OpenStack role as per Keystone RBAC")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"domain"),(0,i.kt)("td",{parentName:"tr",align:null},"OpenStack domain as per Keystone RBAC")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"IAM"),(0,i.kt)("td",{parentName:"tr",align:null},"identity and access management")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"IAM resources"),(0,i.kt)("td",{parentName:"tr",align:null},"projects, users, groups, roles, domains as managed by OpenStack Keystone")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"CSP"),(0,i.kt)("td",{parentName:"tr",align:null},"Cloud Service Provider, provider managing the OpenStack infrastructure")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"cloud admin"),(0,i.kt)("td",{parentName:"tr",align:null},"OpenStack user belonging to the CSP that possesses the ",(0,i.kt)("inlineCode",{parentName:"td"},"admin")," role")))),(0,i.kt)("h3",{id:"impact"},"Impact"),(0,i.kt)("p",null,"Applying this standard modifies the API policy configuration of Keystone and introduces a new global role definition to Keystone to enable IAM self-service for customers within a domain.\nOnce assigned, the role allows special Domain Manager users within a domain to manage users, project, groups and role assignments as part of the IAM self-service."),(0,i.kt)("p",null,"However, the configuration change introduced by this standard does not automatically assign the Domain Manager role to any users per default.\nAssigning the new role and granting customers the resulting self-service capabilities is a deliberate action to be taken by the CSP on a per-tenant (i.e. per domain) basis."),(0,i.kt)("p",null,"Omitting the provisioning of any Domain Manager users (i.e. not assigning the new role to any user) will result in an OpenStack cloud that behaves identically to a configuration without the standard applied, making the actual usage of the functionality a CSP's choice and entirely optional."),(0,i.kt)("h2",{id:"motivation"},"Motivation"),(0,i.kt)("p",null,"In the default configuration of Keystone, only users with the ",(0,i.kt)("inlineCode",{parentName:"p"},"admin")," role may manage the IAM resources such as projects, groups and users and their relation through role assignments.\nThe ",(0,i.kt)("inlineCode",{parentName:"p"},"admin")," role in OpenStack Keystone is not properly scoped when assigned within a domain or project only as due to hard-coded architectural limitations in OpenStack, a user with the ",(0,i.kt)("inlineCode",{parentName:"p"},"admin")," role may escalate their privileges outside of their assigned project or domain boundaries.\nThus, it is not possible to properly give customers a self-service functionality in regards to project, group and user management with the default configuration."),(0,i.kt)("p",null,"To address this, this standard defines a new Domain Manager role in conjunction with appropriate Keystone API policy adjustments to establish a standardized extension to the default Keystone configuration allowing for IAM self-service capabilities for customers within domains."),(0,i.kt)("h3",{id:"desired-workflow"},"Desired Workflow"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"The cloud admin deploys the Domain Manager policy configuration for Keystone as per this standard if it is not already applied."),(0,i.kt)("li",{parentName:"ol"},"The cloud admin creates the desired domains for the customers for which IAM self-service capabilities are desired."),(0,i.kt)("li",{parentName:"ol"},"The cloud admin creates one or more users within each of the applicable domains and assigns the Domain Manager role to them. These users represent the Domain Managers of the corresponding domain."),(0,i.kt)("li",{parentName:"ol"},"The customer uses the Domain Manager users to manage (create, update, delete) users, projects, groups and corresponding role assignments within their domain.")),(0,i.kt)("h2",{id:"design-considerations"},"Design Considerations"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"the Domain Manager role MUST support managing projects, groups and users within a specific domain"),(0,i.kt)("li",{parentName:"ul"},"the Domain Manager role MUST be properly scoped to a domain, it MUST NOT gain access to resources outside of its owning domain"),(0,i.kt)("li",{parentName:"ul"},"the Domain Manager role MUST NOT be able to manipulate existing roles or create new roles"),(0,i.kt)("li",{parentName:"ul"},"the Domain Manager role MUST only be able to assign specific non-administrative","*"," roles to their managed users where the applicable roles are defined by the CSP"),(0,i.kt)("li",{parentName:"ul"},"Domain Managers MUST NOT be able to abuse the role assignment functionalities to escalate their own privileges or those of other users beyond the roles defined by the CSP")),(0,i.kt)("p",null,"*",' "non-administrative" in this context means this excludes the role "',(0,i.kt)("inlineCode",{parentName:"p"},"admin"),'" and any comparable role that grants permissions beyond domain and tenant scope.\nSince the Domain Manager role as defined in this standard is domain-scoped, it does not count as administrative.'),(0,i.kt)("h3",{id:"options-considered"},"Options considered"),(0,i.kt)("h4",{id:"re-using-the-existing-admin-role"},"Re-using the existing ",(0,i.kt)("inlineCode",{parentName:"h4"},"admin")," role"),(0,i.kt)("p",null,"As role assignments can be scoped to project, groups and domains the most obvious option would be to assign the existing ",(0,i.kt)("inlineCode",{parentName:"p"},"admin")," role to users representing Domain Managers in a scoped fashion."),(0,i.kt)("p",null,"However, due to architectural limitations",(0,i.kt)("sup",{parentName:"p",id:"fnref-2"},(0,i.kt)("a",{parentName:"sup",href:"#fn-2",className:"footnote-ref"},"2"))," of the existing OpenStack implementation of roles, the ",(0,i.kt)("inlineCode",{parentName:"p"},"admin")," role has a special meaning reaching beyond the RBAC checks done by Keystone and other OpenStack components.\nThis results in special permissions being granted to users possessing the role which ignore the project or domain scope of the role assignment.\nThis poses severe security risks as the proper scoping of the ",(0,i.kt)("inlineCode",{parentName:"p"},"admin")," role is impossible.\n",(0,i.kt)("strong",{parentName:"p"},"Due to this, this approach was discarded early.")),(0,i.kt)("p",null,"Upstream (OpenStack) is in the process of addressing this across the services but it has not been fully implemented yet, especially for domains",(0,i.kt)("sup",{parentName:"p",id:"fnref-3"},(0,i.kt)("a",{parentName:"sup",href:"#fn-3",className:"footnote-ref"},"3")),"."),(0,i.kt)("h4",{id:"introducing-a-new-role-and-api-policy-changes"},"Introducing a new role and API policy changes"),(0,i.kt)("p",null,"OpenStack Keystone allows for new roles to be created via its API by administrative users.\nAdditionally, each OpenStack API's RBAC can be adjusted through an API policy file (",(0,i.kt)("inlineCode",{parentName:"p"},"policy.yaml"),") through olso-policy",(0,i.kt)("sup",{parentName:"p",id:"fnref-4"},(0,i.kt)("a",{parentName:"sup",href:"#fn-4",className:"footnote-ref"},"4")),", Keystone included.\nThe possibility of managing users, projects, role assignments and so on is regulated through Keystone's RBAC configured by its API policy file."),(0,i.kt)("p",null,"This means that by creating a new role and extending Keystone's API policy configuration a new Domain Manager role can be established that is limited to a specific subset of the Keystone API to be used to manage users, projects and role assignments within a domain."),(0,i.kt)("h2",{id:"open-questions"},"Open questions"),(0,i.kt)("h3",{id:"limitations"},"Limitations"),(0,i.kt)("p",null,"The approach described in this standard imposes the following limitations:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},'as a result of the "',(0,i.kt)("inlineCode",{parentName:"li"},"identity:list_domains"),'" rule (see below), Domain Managers are able to see all domains via "',(0,i.kt)("inlineCode",{parentName:"li"},"openstack domain list"),'" and can inspect the metadata of other domains with "',(0,i.kt)("inlineCode",{parentName:"li"},"openstack domain show"),'"'),(0,i.kt)("li",{parentName:"ol"},'as a result of the "',(0,i.kt)("inlineCode",{parentName:"li"},"identity:list_roles"),'" rule (see below), Domain Managers are able to see all roles via "',(0,i.kt)("inlineCode",{parentName:"li"},"openstack role list"),'" and can inspect the metadata of other roles with "',(0,i.kt)("inlineCode",{parentName:"li"},"openstack role show"),'"')),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"As a result of points 1 and 2, metadata of all domains and roles will be exposed to all Domain Managers!")),(0,i.kt)("p",null,"If a CSP deems either of these points critical, they may abstain from granting the Domain Manager role to users, effectively disabling the functionality. See ",(0,i.kt)("a",{parentName:"p",href:"#impact"},"Impact"),"."),(0,i.kt)("h2",{id:"decision"},"Decision"),(0,i.kt)("p",null,'A role named "',(0,i.kt)("inlineCode",{parentName:"p"},"domain-manager"),'" is to be created via the Keystone API and the policy adjustments quoted below are to be applied.'),(0,i.kt)("h3",{id:"policy-adjustments"},"Policy adjustments"),(0,i.kt)("p",null,'The following policy has to be applied to Keystone in a verbatim fashion.\nThe "',(0,i.kt)("inlineCode",{parentName:"p"},"is_domain_managed_role"),'" rule definition is the only exception to this (see below).'),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-yaml"},'# classify domain managers with a special role\n"is_domain_manager": "role:domain-manager"\n\n# specify a rule that whitelists roles which domain admins are permitted\n# to assign and revoke within their domain\n"is_domain_managed_role": "\'member\':%(target.role.name)s"\n\n# allow domain admins to retrieve their own domain\n"identity:get_domain": "(rule:is_domain_manager and token.domain.id:%(target.domain.id)s) or rule:admin_required"\n\n# list_domains is needed for GET /v3/domains?name=... requests\n# this is mandatory for things like\n# `create user --domain $DOMAIN_NAME $USER_NAME` to correctly discover\n# domains by name\n"identity:list_domains": "rule:is_domain_manager or rule:admin_required"\n\n# list_roles is needed for GET /v3/roles?name=... requests\n# this is mandatory for things like `role add ... $ROLE_NAME`` to correctly\n# discover roles by name\n"identity:list_roles": "rule:is_domain_manager or rule:admin_required"\n\n# get_role is needed for GET /v3/roles/{role_id} requests\n# this is mandatory for the OpenStack SDK to properly process role assignments\n# which are issued by role id instead of name\n"identity:get_role": "(rule:is_domain_manager and rule:is_domain_managed_role) or rule:admin_required"\n\n# allow domain admins to manage users within their domain\n"identity:list_users": "(rule:is_domain_manager and token.domain.id:%(target.domain_id)s) or rule:admin_required"\n"identity:get_user": "(rule:is_domain_manager and token.domain.id:%(target.user.domain_id)s) or rule:admin_required"\n"identity:create_user": "(rule:is_domain_manager and token.domain.id:%(target.user.domain_id)s) or rule:admin_required"\n"identity:update_user": "(rule:is_domain_manager and token.domain.id:%(target.user.domain_id)s) or rule:admin_required"\n"identity:delete_user": "(rule:is_domain_manager and token.domain.id:%(target.user.domain_id)s) or rule:admin_required"\n\n# allow domain admins to manage projects within their domain\n"identity:list_projects": "(rule:is_domain_manager and token.domain.id:%(target.domain_id)s) or rule:admin_required"\n"identity:get_project": "(rule:is_domain_manager and token.domain.id:%(target.project.domain_id)s) or rule:admin_required"\n"identity:create_project": "(rule:is_domain_manager and token.domain.id:%(target.project.domain_id)s) or rule:admin_required"\n"identity:update_project": "(rule:is_domain_manager and token.domain.id:%(target.project.domain_id)s) or rule:admin_required"\n"identity:delete_project": "(rule:is_domain_manager and token.domain.id:%(target.project.domain_id)s) or rule:admin_required"\n"identity:list_user_projects": "(rule:is_domain_manager and token.domain.id:%(target.user.domain_id)s) or rule:admin_required"\n\n# allow domain managers to manage role assignments within their domain\n# (restricted to specific roles by the \'is_domain_managed_role\' rule)\n#\n# project-level role assignment to user within domain\n"is_domain_user_project_grant": "token.domain.id:%(target.user.domain_id)s and token.domain.id:%(target.project.domain_id)s and rule:is_domain_managed_role"\n# project-level role assignment to group within domain\n"is_domain_group_project_grant": "token.domain.id:%(target.group.domain_id)s and token.domain.id:%(target.project.domain_id)s and rule:is_domain_managed_role"\n# domain-level role assignment to group\n"is_domain_level_group_grant": "token.domain.id:%(target.group.domain_id)s and token.domain.id:%(target.domain.id)s and rule:is_domain_managed_role"\n# domain-level role assignment to user\n"is_domain_level_user_grant": "token.domain.id:%(target.user.domain_id)s and token.domain.id:%(target.domain.id)s and rule:is_domain_managed_role"\n"domain_manager_grant": "rule:is_domain_manager and (rule:is_domain_user_project_grant or rule:is_domain_group_project_grant or rule:is_domain_level_group_grant or rule:is_domain_level_user_grant)"\n"identity:check_grant": "rule:domain_manager_grant or rule:admin_required"\n"identity:list_grants": "rule:domain_manager_grant or rule:admin_required"\n"identity:create_grant": "rule:domain_manager_grant or rule:admin_required"\n"identity:revoke_grant": "rule:domain_manager_grant or rule:admin_required"\n"identity:list_role_assignments": "(rule:is_domain_manager and token.domain.id:%(target.domain_id)s) or rule:admin_required"\n\n# allow domain managers to manage groups within their domain\n"identity:list_groups": "(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s) or rule:admin_required"\n"identity:get_group": "(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s) or rule:admin_required"\n"identity:create_group": "(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s) or rule:admin_required"\n"identity:update_group": "(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s) or rule:admin_required"\n"identity:delete_group": "(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s) or rule:admin_required"\n"identity:list_groups_for_user": "(rule:is_domain_manager and token.domain.id:%(target.user.domain_id)s) or rule:admin_required"\n"identity:list_users_in_group": "(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s) or rule:admin_required"\n"identity:remove_user_from_group": "(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s and token.domain.id:%(target.user.domain_id)s) or rule:admin_required"\n"identity:check_user_in_group": "(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s and token.domain.id:%(target.user.domain_id)s) or rule:admin_required"\n"identity:add_user_to_group": "(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s and token.domain.id:%(target.user.domain_id)s) or rule:admin_required"\n')),(0,i.kt)("h4",{id:"specifying-manageable-roles-via-is_domain_managed_role"},'Specifying manageable roles via "',(0,i.kt)("inlineCode",{parentName:"h4"},"is_domain_managed_role"),'"'),(0,i.kt)("p",null,'The "',(0,i.kt)("inlineCode",{parentName:"p"},"is_domain_managed_role"),'" rule of the above policy template may be adjusted according to the requirements of the CSP and infrastructure architecture to specify different or multiple roles as manageable by Domain Managers as long as the policy rule adheres to the following:'),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},'the "',(0,i.kt)("inlineCode",{parentName:"li"},"is_domain_managed_role"),'" rule MUST NOT contain the "',(0,i.kt)("inlineCode",{parentName:"li"},"admin"),'" role, neither directly nor transitively'),(0,i.kt)("li",{parentName:"ul"},'the "',(0,i.kt)("inlineCode",{parentName:"li"},"is_domain_managed_role"),'" rule MUST define all applicable roles directly, it MUST NOT contain a "',(0,i.kt)("inlineCode",{parentName:"li"},"rule:"),'" reference within itself')),(0,i.kt)("h5",{id:"example-permitting-multiple-roles"},"Example: permitting multiple roles"),(0,i.kt)("p",null,'The following example permits both the "',(0,i.kt)("inlineCode",{parentName:"p"},"member"),'" and "',(0,i.kt)("inlineCode",{parentName:"p"},"reader"),'" role to be assigned/revoked by a Domain Manager.\nFurther roles can be appended using the logical ',(0,i.kt)("inlineCode",{parentName:"p"},"or")," directive."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-yaml"},"\"is_domain_managed_role\": \"'member':%(target.role.name)s or 'reader':%(target.role.name)s\"\n")),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Note regarding the ",(0,i.kt)("inlineCode",{parentName:"strong"},"domain-manager")," role")),(0,i.kt)("p",null,'When adjusting the "',(0,i.kt)("inlineCode",{parentName:"p"},"is_domain_managed_role"),'" rule a CSP might opt to also include the "',(0,i.kt)("inlineCode",{parentName:"p"},"domain-manager"),'" role itself in the manageable roles, resulting in Domain Managers being able to propagate the Domain Manager role to other users within their domain.\nThis increases the self-service capabilities of the customer but introduces risks of Domain Managers also being able to revoke this role from themselves or each other (within their domain) in an unintended fashion.'),(0,i.kt)("p",null,'CSPs have to carefully evaluate whether Domain Manager designation authority should reside solely on their side or be part of the customer self-service scope and decide about adding "',(0,i.kt)("inlineCode",{parentName:"p"},"'domain-manager':%(target.role.name)s"),'" to the rule accordingly.'),(0,i.kt)("h2",{id:"related-documents"},"Related Documents"),(0,i.kt)("h3",{id:"admin-ness-not-properly-scoped"},'"admin"-ness not properly scoped'),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Description:")," Upstream bug report about the underlying architectural issue of the ",(0,i.kt)("inlineCode",{parentName:"p"},"admin")," role not being properly scoped and giving system-level admin permissions regardless of whether the ",(0,i.kt)("inlineCode",{parentName:"p"},"admin")," role assignment was scoped to project or domain level.\nThis is the main reason for the ",(0,i.kt)("inlineCode",{parentName:"p"},"admin")," role being inappropriate to implement Domain Managers."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Link:")," ",(0,i.kt)("a",{parentName:"p",href:"https://bugs.launchpad.net/keystone/+bug/968696"},'Launchpad bug: "admin"-ness not properly scoped')),(0,i.kt)("h3",{id:"consistent-and-secure-default-rbac"},"Consistent and Secure Default RBAC"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Description:")," Upstream rework of the default role definitions and hierarchy across all OpenStack services.\nAims to introduce support for a scoped ",(0,i.kt)("inlineCode",{parentName:"p"},"manager")," role by 2024 but only focuses on project-level scoping for this role so far, not domain-level."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Link:")," ",(0,i.kt)("a",{parentName:"p",href:"https://governance.openstack.org/tc/goals/selected/consistent-and-secure-rbac.html"},"OpenStack Technical Committee Governance Documents: Consistent and Secure Default RBAC")),(0,i.kt)("h2",{id:"conformance-tests"},"Conformance Tests"),(0,i.kt)("p",null,"There is a test suite in ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Tests/iam/domain-manager/domain-manager-check.py"},(0,i.kt)("inlineCode",{parentName:"a"},"domain-manager-check.py")),".\nThe test suite connects to the OpenStack API using two sample domains and corresponding Domain Manager accounts.\nIt verifies the compliance to the standard and the proper domain-scoping as defined by the Keystone policy.\nPlease consult the associated ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Tests/iam/domain-manager/README.md"},"README.md")," for detailed setup and testing instructions."),(0,i.kt)("h2",{id:"appendix"},"Appendix"),(0,i.kt)("h3",{id:"decision-record"},"Decision Record"),(0,i.kt)("h4",{id:"allow-flexibility-for-the-roles-a-domain-manager-can-assignrevoke-within-domain"},"Allow flexibility for the roles a Domain Manager can assign/revoke within domain"),(0,i.kt)("p",null,"Decision Date: 2023-09-27"),(0,i.kt)("p",null,"Decision Maker: Team IaaS, Team IAM"),(0,i.kt)("p",null,"Decision:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},'the standard should not strictly limit the roles a Domain Manager can assign/revoke to/from other users within a domain to the "member" role'),(0,i.kt)("li",{parentName:"ul"},"the standard should allow CSPs to define one or more roles for Domain Managers to manage"),(0,i.kt)("li",{parentName:"ul"},"whether or not this includes the Domain Manager role itself is not to be predefined by the standard and should be up to the CSP to decide instead"),(0,i.kt)("li",{parentName:"ul"},'the standard should only strictly prohibit adding the "admin" role to the list of roles manageable by Domain Managers')),(0,i.kt)("p",null,"Rationale:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"the available and configured roles might differ between CSPs and infrastructures"),(0,i.kt)("li",{parentName:"ul"},"the Domain Manager standard should be flexible enough to adapt to different environments while still offering the intended functionality"),(0,i.kt)("li",{parentName:"ul"},"there might be a tradeoff between self-service flexibility desired by customers and the security regulation a CSP wants to impose, thus allowing or prohibiting the designation of Domain Managers by customers themselves should be up to the CSP to decide")),(0,i.kt)("p",null,"Links / Comments / References:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://input.scs.community/2023-scs-team-iaas?view#Domain-Manager-Standard-markus-hentsch"},"Team IaaS meeting protocol entry"))),(0,i.kt)("h4",{id:"extend-domain-management-functionality-to-keystone-groups"},"Extend domain management functionality to Keystone groups"),(0,i.kt)("p",null,"Decision Date: 2023-08-04"),(0,i.kt)("p",null,"Decision Maker: SIG IAM"),(0,i.kt)("p",null,"Decision:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"the Domain Manager Standard configuration should cover the groups functionality of Keystone, allowing domain manager to manage groups in domains")),(0,i.kt)("p",null,"Rationale:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"the groups functionality is a desired IAM feature for customers")),(0,i.kt)("p",null,"Links / Comments / References:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://input.scs.community/2023-scs-sig-iam#Domain-Admin-rights-for-SCS-IaaS-Customers-184"},"SIG IAM meeting protocol entry")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/SovereignCloudStack/issues/issues/383"},"action item issue"))),(0,i.kt)("h4",{id:"change-the-naming-of-the-domain-manager-role"},"Change the naming of the Domain Manager role"),(0,i.kt)("p",null,"Decision Date: 2023-08-04"),(0,i.kt)("p",null,"Decision Maker: SIG IAM"),(0,i.kt)("p",null,"Decision:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},'the Domain Manager role should be named "domain-manager" not "domain-admin".')),(0,i.kt)("p",null,"Rationale:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"avoid confusion with the unscoped admin role and to be inline with the upstream plan: ",(0,i.kt)("a",{parentName:"li",href:"https://specs.openstack.org/openstack/keystone-specs/specs/keystone/2023.1/default-service-role.html"},"Default Service Role - Identity Specs"))),(0,i.kt)("p",null,"Links / Comments / References:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://input.scs.community/2023-scs-sig-iam#Domain-Admin-rights-for-SCS-IaaS-Customers-184"},"SIG IAM meeting protocol entry")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/SovereignCloudStack/issues/issues/184#issuecomment-1670985934"},"issue commment about decision"))),(0,i.kt)("div",{className:"footnotes"},(0,i.kt)("hr",{parentName:"div"}),(0,i.kt)("ol",{parentName:"div"},(0,i.kt)("li",{parentName:"ol",id:"fn-1"},(0,i.kt)("a",{parentName:"li",href:"https://static.opendev.org/docs/patrole/latest/rbac-overview.html"},"OpenStack Documentation: Role-Based Access Control Overview"),(0,i.kt)("a",{parentName:"li",href:"#fnref-1",className:"footnote-backref"},"\u21a9")),(0,i.kt)("li",{parentName:"ol",id:"fn-2"},(0,i.kt)("a",{parentName:"li",href:"https://bugs.launchpad.net/keystone/+bug/968696"},'Launchpad bug: "admin"-ness not properly scoped'),(0,i.kt)("a",{parentName:"li",href:"#fnref-2",className:"footnote-backref"},"\u21a9")),(0,i.kt)("li",{parentName:"ol",id:"fn-3"},(0,i.kt)("a",{parentName:"li",href:"https://docs.openstack.org/keystone/latest/contributor/services.html#domain-scope"},"OpenStack Documentation: Keystone for Other Services - Domain Scope"),(0,i.kt)("a",{parentName:"li",href:"#fnref-3",className:"footnote-backref"},"\u21a9")),(0,i.kt)("li",{parentName:"ol",id:"fn-4"},(0,i.kt)("a",{parentName:"li",href:"https://docs.openstack.org/oslo.policy/latest/admin/index.html"},"OpenStack Documentation: Administering Applications that use oslo.policy"),(0,i.kt)("a",{parentName:"li",href:"#fnref-4",className:"footnote-backref"},"\u21a9")))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/502adbf6.68fb27d5.js b/assets/js/502adbf6.68fb27d5.js new file mode 100644 index 0000000000..fdf16df2f1 --- /dev/null +++ b/assets/js/502adbf6.68fb27d5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5912],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>m});var n=r(67294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var c=n.createContext({}),u=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},d=function(e){var t=u(e.components);return n.createElement(c.Provider,{value:t},e.children)},l="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,o=e.originalType,c=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),l=u(r),f=i,m=l["".concat(c,".").concat(f)]||l[f]||p[f]||o;return r?n.createElement(m,a(a({ref:t},d),{},{components:r})):n.createElement(m,a({ref:t},d))}));function m(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=r.length,a=new Array(o);a[0]=f;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[l]="string"==typeof e?e:i,a[1]=s;for(var u=2;u{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>p,frontMatter:()=>o,metadata:()=>s,toc:()=>u});var n=r(87462),i=(r(67294),r(3905));const o={sidebar_label:"Guides",sidebar_position:50},a="Guides",s={unversionedId:"iaas/guides/index",id:"iaas/guides/index",title:"Guides",description:"",source:"@site/docs/02-iaas/guides/index.md",sourceDirName:"02-iaas/guides",slug:"/iaas/guides/",permalink:"/docs/iaas/guides/",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/index.md",tags:[],version:"current",sidebarPosition:50,frontMatter:{sidebar_label:"Guides",sidebar_position:50},sidebar:"docs",previous:{title:"OpenStack",permalink:"/docs/iaas/guides/troubleshooting-guide/openstack"},next:{title:"Other Guides",permalink:"/docs/iaas/guides/other-guides/"}},c={},u=[],d={toc:u},l="wrapper";function p(e){let{components:t,...r}=e;return(0,i.kt)(l,(0,n.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"guides"},"Guides"))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/50963409.2fac71a6.js b/assets/js/50963409.2fac71a6.js new file mode 100644 index 0000000000..4a8371f4d3 --- /dev/null +++ b/assets/js/50963409.2fac71a6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4338],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>g});var r=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(n),d=o,g=u["".concat(l,".").concat(d)]||u[d]||m[d]||a;return n?r.createElement(g,i(i({ref:t},p),{},{components:n})):r.createElement(g,i({ref:t},p))}));function g(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:o,i[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>m,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var r=n(87462),o=(n(67294),n(3905));const a={},i="Testing",s={unversionedId:"container/components/k8s-cluster-api-provider/doc/usage/testing",id:"container/components/k8s-cluster-api-provider/doc/usage/testing",title:"Testing",description:"To test the created k8s cluster, there are several tools available.",source:"@site/docs/03-container/components/k8s-cluster-api-provider/doc/usage/testing.md",sourceDirName:"03-container/components/k8s-cluster-api-provider/doc/usage",slug:"/container/components/k8s-cluster-api-provider/doc/usage/testing",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/usage/testing",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/03-container/components/k8s-cluster-api-provider/doc/usage/testing.md",tags:[],version:"current",frontMatter:{},sidebar:"docs",previous:{title:"Multi-AZ and multi-cloud environments",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/usage/multi-az-and-multi-cloud-environments"},next:{title:"Operating SCS",permalink:"/docs/category/operating-scs"}},l={},c=[],p={toc:c},u="wrapper";function m(e){let{components:t,...n}=e;return(0,o.kt)(u,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"testing"},"Testing"),(0,o.kt)("p",null,"To test the created k8s cluster, there are several tools available.\nApply all commands to the testcluster context (by passing the appropriate\n",(0,o.kt)("inlineCode",{parentName:"p"},"--context")," setting to ",(0,o.kt)("inlineCode",{parentName:"p"},"kubectl")," or by using the right ",(0,o.kt)("inlineCode",{parentName:"p"},"KUBECONFIG"),"\nfile)."),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"Looking at all pods (",(0,o.kt)("inlineCode",{parentName:"p"},"kubectl get pods -A"),") to see that they all come\nup (and don't suffer excessive restarts) is a good first check.\nLook at the pod logs to investigate any failures.")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"You can create a very simple deployment with the provided ",(0,o.kt)("inlineCode",{parentName:"p"},"kuard.yaml"),', which is\nan example taken from the O\'Reilly book from B. Burns, J. Beda, K. Hightower:\n"Kubernetes Up & Running" enhanced to also use a persistent volume.')),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"You can deploy ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/GoogleCloudPlatform/microservices-demo"},"Google's demo microservice application"),".")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("inlineCode",{parentName:"p"},"sonobuoy")," runs a subset of the k8s tests, providing a simple way to\nfilter the >5000 existing test cases to only run the CNCF conformance\ntests or to restrict testing to non-disruptive tests. The ",(0,o.kt)("inlineCode",{parentName:"p"},"sonobuoy.sh")," wrapper\nhelps with calling it. There are also ",(0,o.kt)("inlineCode",{parentName:"p"},"Makefile")," targets ",(0,o.kt)("inlineCode",{parentName:"p"},"check-*")," that\ncall various ",(0,o.kt)("a",{parentName:"p",href:"https://sonobuoy.io"},"sonobuoy")," test sets.\nThis is how we call sonobuoy for our CI tests.")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"You can use ",(0,o.kt)("inlineCode",{parentName:"p"},"cilium connectivity test")," to check whether your cilium\nCNI is working properly. You might need to enable hubble to get\na fully successful result."))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5268a994.b87d3303.js b/assets/js/5268a994.b87d3303.js new file mode 100644 index 0000000000..995057fdf8 --- /dev/null +++ b/assets/js/5268a994.b87d3303.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4250],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>m});var r=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=r.createContext({}),s=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},p=function(e){var t=s(e.components);return r.createElement(l.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},f=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),u=s(n),f=o,m=u["".concat(l,".").concat(f)]||u[f]||d[f]||i;return n?r.createElement(m,a(a({ref:t},p),{},{components:n})):r.createElement(m,a({ref:t},p))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,a=new Array(i);a[0]=f;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[u]="string"==typeof e?e:o,a[1]=c;for(var s=2;s{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>c,toc:()=>s});var r=n(87462),o=(n(67294),n(3905));const i={},a="Documentation for SCS Developers",c={unversionedId:"index",id:"index",title:"Documentation for SCS Developers",description:"Welcome to the Dev Docs. This section is primarily for SCS Developers and will contain documentation regarding the Development and Architecture of the Sovereign Cloud Stack and its components. You will find documents, explanations and guides regarding the tooling necessary for the development of SCS.",source:"@site/dev-docs/index.md",sourceDirName:".",slug:"/",permalink:"/dev-docs/",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"devDocs",next:{title:"Identity Federation in SCS",permalink:"/dev-docs/operations/iam/identity-federation-in-scs"}},l={},s=[],p={toc:s},u="wrapper";function d(e){let{components:t,...n}=e;return(0,o.kt)(u,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"documentation-for-scs-developers"},"Documentation for SCS Developers"),(0,o.kt)("p",null,"Welcome to the Dev Docs. This section is primarily for SCS Developers and will contain documentation regarding the Development and Architecture of the Sovereign Cloud Stack and its components. You will find documents, explanations and guides regarding the tooling necessary for the development of SCS."),(0,o.kt)("p",null,"If you want to contribute you can reach out to us via our ",(0,o.kt)("a",{parentName:"p",href:"https://matrix.to/#/!TiDqlLmEUaXqTemaLc:matrix.org?via=matrix.org"},"Matrix Channel"),"."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/526992cf.021d92b1.js b/assets/js/526992cf.021d92b1.js new file mode 100644 index 0000000000..eb57e069ff --- /dev/null +++ b/assets/js/526992cf.021d92b1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2821],{3905:(t,e,a)=>{a.d(e,{Zo:()=>s,kt:()=>N});var n=a(67294);function r(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function l(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function i(t){for(var e=1;e=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var o=n.createContext({}),p=function(t){var e=n.useContext(o),a=e;return t&&(a="function"==typeof t?t(e):i(i({},e),t)),a},s=function(t){var e=p(t.components);return n.createElement(o.Provider,{value:e},t.children)},m="mdxType",k={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},u=n.forwardRef((function(t,e){var a=t.components,r=t.mdxType,l=t.originalType,o=t.parentName,s=d(t,["components","mdxType","originalType","parentName"]),m=p(a),u=r,N=m["".concat(o,".").concat(u)]||m[u]||k[u]||l;return a?n.createElement(N,i(i({ref:e},s),{},{components:a})):n.createElement(N,i({ref:e},s))}));function N(t,e){var a=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var l=a.length,i=new Array(l);i[0]=u;var d={};for(var o in e)hasOwnProperty.call(e,o)&&(d[o]=e[o]);d.originalType=t,d[m]="string"==typeof t?t:r,i[1]=d;for(var p=2;p{a.r(e),a.d(e,{assets:()=>o,contentTitle:()=>i,default:()=>k,frontMatter:()=>l,metadata:()=>d,toc:()=>p});var n=a(87462),r=(a(67294),a(3905));const l={title:"SCS Standard Flavors and Properties",type:"Standard",status:"Draft",track:"IaaS"},i=void 0,d={unversionedId:"scs-0103-v1-standard-flavors",id:"scs-0103-v1-standard-flavors",title:"SCS Standard Flavors and Properties",description:"Introduction",source:"@site/standards/scs-0103-v1-standard-flavors.md",sourceDirName:".",slug:"/scs-0103-v1-standard-flavors",permalink:"/standards/scs-0103-v1-standard-flavors",draft:!1,tags:[],version:"current",frontMatter:{title:"SCS Standard Flavors and Properties",type:"Standard",status:"Draft",track:"IaaS"},sidebar:"standards",previous:{title:"SCS-0103: Standard Flavors",permalink:"/standards/iaas/scs-0103"},next:{title:"SCS-0104: Standard Images",permalink:"/standards/iaas/scs-0104"}},o={},p=[{value:"Introduction",id:"introduction",level:2},{value:"Motivation",id:"motivation",level:2},{value:"Properties (extra specs)",id:"properties-extra-specs",level:2},{value:"Standard SCS flavors",id:"standard-scs-flavors",level:2},{value:"Mandatory",id:"mandatory",level:3},{value:"Recommended",id:"recommended",level:3},{value:"Guarantees and properties",id:"guarantees-and-properties",level:3},{value:"Remarks",id:"remarks",level:3},{value:"Conformance Tests",id:"conformance-tests",level:2},{value:"Operational tooling",id:"operational-tooling",level:2},{value:"Previous standard versions",id:"previous-standard-versions",level:2}],s={toc:p},m="wrapper";function k(t){let{components:e,...a}=t;return(0,r.kt)(m,(0,n.Z)({},s,a,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"introduction"},"Introduction"),(0,r.kt)("h2",{id:"motivation"},"Motivation"),(0,r.kt)("p",null,"In OpenStack environments there is a need to define different flavors for instances.\nThe flavors are pre-defined by the operator, the customer can not change these.\nOpenStack providers thus typically offer a large selection of flavors."),(0,r.kt)("p",null,"While flavors can be discovered (",(0,r.kt)("inlineCode",{parentName:"p"},"openstack flavor list"),"), it is helpful for users (DevOps teams),\nto have a guaranteed set of flavors available on all SCS clouds, so these need not be discovered."),(0,r.kt)("h2",{id:"properties-extra-specs"},"Properties (extra specs)"),(0,r.kt)("p",null,"The following extra specs are recognized, together with the respective semantics:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"scs:name-vN=NAME")," (where ",(0,r.kt)("inlineCode",{parentName:"li"},"N")," is ",(0,r.kt)("inlineCode",{parentName:"li"},"1")," or ",(0,r.kt)("inlineCode",{parentName:"li"},"2"),", and ",(0,r.kt)("inlineCode",{parentName:"li"},"NAME"),' is some string) means that the\nflavor is one of the\nstandard SCS flavors, and the requirements of Section "Standard SCS flavors" below apply.'),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"scs:cpu-type=shared-core")," means that ",(0,r.kt)("em",{parentName:"li"},"at least 20% of a core in >99% of the time"),",\nmeasured over the course of one month (1% is 7,2 h/month). The ",(0,r.kt)("inlineCode",{parentName:"li"},"cpu-type=shared-core"),"\ncorresponds to the ",(0,r.kt)("inlineCode",{parentName:"li"},"V")," cpu modifier in the ",(0,r.kt)("a",{parentName:"li",href:"/standards/scs-0100-v3-flavor-naming"},"flavor-naming spec"),",\nother options are ",(0,r.kt)("inlineCode",{parentName:"li"},"crowded-core")," (",(0,r.kt)("inlineCode",{parentName:"li"},"L"),"), ",(0,r.kt)("inlineCode",{parentName:"li"},"dedicated-thread")," (",(0,r.kt)("inlineCode",{parentName:"li"},"T"),") and ",(0,r.kt)("inlineCode",{parentName:"li"},"dedicated-core")," (",(0,r.kt)("inlineCode",{parentName:"li"},"C"),")."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"scs:diskN-type=ssd")," (where ",(0,r.kt)("inlineCode",{parentName:"li"},"N")," is a nonnegative integer, usually ",(0,r.kt)("inlineCode",{parentName:"li"},"0"),") means that the\nroot disk ",(0,r.kt)("inlineCode",{parentName:"li"},"N")," must support 1000 ",(0,r.kt)("em",{parentName:"li"},"sequential")," IOPS per VM and it must be equipped with\npower-loss protection; see ",(0,r.kt)("a",{parentName:"li",href:"/standards/scs-0110-v1-ssd-flavors"},"scs-0110-v1-ssd-flavors"),".\nThe ",(0,r.kt)("inlineCode",{parentName:"li"},"disk"),"N",(0,r.kt)("inlineCode",{parentName:"li"},"-type=ssd")," setting corresponds to the ",(0,r.kt)("inlineCode",{parentName:"li"},"s")," disk modifier, other options\nare ",(0,r.kt)("inlineCode",{parentName:"li"},"nvme")," (",(0,r.kt)("inlineCode",{parentName:"li"},"p"),"), ",(0,r.kt)("inlineCode",{parentName:"li"},"hdd")," (",(0,r.kt)("inlineCode",{parentName:"li"},"h"),") and ",(0,r.kt)("inlineCode",{parentName:"li"},"network")," (",(0,r.kt)("inlineCode",{parentName:"li"},"n"),"). Only flavors without disk and\nthose with ",(0,r.kt)("inlineCode",{parentName:"li"},"diskN-type=network")," can be expected to support live-migration.")),(0,r.kt)("p",null,"Whenever ANY of these are present on ANY flavor, the corresponding semantics must be satisfied."),(0,r.kt)("h2",{id:"standard-scs-flavors"},"Standard SCS flavors"),(0,r.kt)("p",null,"These are flavors that must exist on standard SCS clouds (x86-64)."),(0,r.kt)("h3",{id:"mandatory"},"Mandatory"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Recommended name"),(0,r.kt)("th",{parentName:"tr",align:null},"vCPUs"),(0,r.kt)("th",{parentName:"tr",align:null},"vCPU type"),(0,r.kt)("th",{parentName:"tr",align:null},"RAM ","[GiB]"),(0,r.kt)("th",{parentName:"tr",align:null},"Root disk ","[GB]"),(0,r.kt)("th",{parentName:"tr",align:null},"Disk type"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-1V-4"),(0,r.kt)("td",{parentName:"tr",align:null},"1"),(0,r.kt)("td",{parentName:"tr",align:null},"shared-core"),(0,r.kt)("td",{parentName:"tr",align:null},"4"),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-2V-8"),(0,r.kt)("td",{parentName:"tr",align:null},"2"),(0,r.kt)("td",{parentName:"tr",align:null},"shared-core"),(0,r.kt)("td",{parentName:"tr",align:null},"8"),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-4V-16"),(0,r.kt)("td",{parentName:"tr",align:null},"4"),(0,r.kt)("td",{parentName:"tr",align:null},"shared-core"),(0,r.kt)("td",{parentName:"tr",align:null},"16"),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-4V-16-100s"),(0,r.kt)("td",{parentName:"tr",align:null},"4"),(0,r.kt)("td",{parentName:"tr",align:null},"shared-core"),(0,r.kt)("td",{parentName:"tr",align:null},"16"),(0,r.kt)("td",{parentName:"tr",align:null},"100"),(0,r.kt)("td",{parentName:"tr",align:null},"ssd")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-8V-32"),(0,r.kt)("td",{parentName:"tr",align:null},"8"),(0,r.kt)("td",{parentName:"tr",align:null},"shared-core"),(0,r.kt)("td",{parentName:"tr",align:null},"32"),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-1V-2"),(0,r.kt)("td",{parentName:"tr",align:null},"1"),(0,r.kt)("td",{parentName:"tr",align:null},"shared-core"),(0,r.kt)("td",{parentName:"tr",align:null},"2"),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-2V-4"),(0,r.kt)("td",{parentName:"tr",align:null},"2"),(0,r.kt)("td",{parentName:"tr",align:null},"shared-core"),(0,r.kt)("td",{parentName:"tr",align:null},"4"),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-2V-4-20s"),(0,r.kt)("td",{parentName:"tr",align:null},"2"),(0,r.kt)("td",{parentName:"tr",align:null},"shared-core"),(0,r.kt)("td",{parentName:"tr",align:null},"4"),(0,r.kt)("td",{parentName:"tr",align:null},"20"),(0,r.kt)("td",{parentName:"tr",align:null},"ssd")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-4V-8"),(0,r.kt)("td",{parentName:"tr",align:null},"4"),(0,r.kt)("td",{parentName:"tr",align:null},"shared-core"),(0,r.kt)("td",{parentName:"tr",align:null},"8"),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-8V-16"),(0,r.kt)("td",{parentName:"tr",align:null},"8"),(0,r.kt)("td",{parentName:"tr",align:null},"shared-core"),(0,r.kt)("td",{parentName:"tr",align:null},"16"),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-16V-32"),(0,r.kt)("td",{parentName:"tr",align:null},"16"),(0,r.kt)("td",{parentName:"tr",align:null},"shared-core"),(0,r.kt)("td",{parentName:"tr",align:null},"32"),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-1V-8"),(0,r.kt)("td",{parentName:"tr",align:null},"1"),(0,r.kt)("td",{parentName:"tr",align:null},"shared-core"),(0,r.kt)("td",{parentName:"tr",align:null},"8"),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-2V-16"),(0,r.kt)("td",{parentName:"tr",align:null},"2"),(0,r.kt)("td",{parentName:"tr",align:null},"shared-core"),(0,r.kt)("td",{parentName:"tr",align:null},"16"),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-4V-32"),(0,r.kt)("td",{parentName:"tr",align:null},"4"),(0,r.kt)("td",{parentName:"tr",align:null},"shared-core"),(0,r.kt)("td",{parentName:"tr",align:null},"32"),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-1L-1"),(0,r.kt)("td",{parentName:"tr",align:null},"1"),(0,r.kt)("td",{parentName:"tr",align:null},"crowded-core"),(0,r.kt)("td",{parentName:"tr",align:null},"1"),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null})))),(0,r.kt)("h3",{id:"recommended"},"Recommended"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Recommended name"),(0,r.kt)("th",{parentName:"tr",align:null},"vCPUs"),(0,r.kt)("th",{parentName:"tr",align:null},"vCPU type"),(0,r.kt)("th",{parentName:"tr",align:null},"RAM ","[GiB]"),(0,r.kt)("th",{parentName:"tr",align:null},"Root disk ","[GB]"),(0,r.kt)("th",{parentName:"tr",align:null},"Disk type"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-1V-4-10"),(0,r.kt)("td",{parentName:"tr",align:null},"1"),(0,r.kt)("td",{parentName:"tr",align:null},"shared-core"),(0,r.kt)("td",{parentName:"tr",align:null},"4"),(0,r.kt)("td",{parentName:"tr",align:null},"10"),(0,r.kt)("td",{parentName:"tr",align:null},"(any)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-2V-8-20"),(0,r.kt)("td",{parentName:"tr",align:null},"2"),(0,r.kt)("td",{parentName:"tr",align:null},"shared-core"),(0,r.kt)("td",{parentName:"tr",align:null},"8"),(0,r.kt)("td",{parentName:"tr",align:null},"20"),(0,r.kt)("td",{parentName:"tr",align:null},"(any)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-4V-16-50"),(0,r.kt)("td",{parentName:"tr",align:null},"4"),(0,r.kt)("td",{parentName:"tr",align:null},"shared-core"),(0,r.kt)("td",{parentName:"tr",align:null},"16"),(0,r.kt)("td",{parentName:"tr",align:null},"50"),(0,r.kt)("td",{parentName:"tr",align:null},"(any)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-8V-32-100"),(0,r.kt)("td",{parentName:"tr",align:null},"8"),(0,r.kt)("td",{parentName:"tr",align:null},"shared-core"),(0,r.kt)("td",{parentName:"tr",align:null},"32"),(0,r.kt)("td",{parentName:"tr",align:null},"100"),(0,r.kt)("td",{parentName:"tr",align:null},"(any)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-1V-2-5"),(0,r.kt)("td",{parentName:"tr",align:null},"1"),(0,r.kt)("td",{parentName:"tr",align:null},"shared-core"),(0,r.kt)("td",{parentName:"tr",align:null},"2"),(0,r.kt)("td",{parentName:"tr",align:null},"5"),(0,r.kt)("td",{parentName:"tr",align:null},"(any)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-2V-4-10"),(0,r.kt)("td",{parentName:"tr",align:null},"2"),(0,r.kt)("td",{parentName:"tr",align:null},"shared-core"),(0,r.kt)("td",{parentName:"tr",align:null},"4"),(0,r.kt)("td",{parentName:"tr",align:null},"10"),(0,r.kt)("td",{parentName:"tr",align:null},"(any)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-4V-8-20"),(0,r.kt)("td",{parentName:"tr",align:null},"4"),(0,r.kt)("td",{parentName:"tr",align:null},"shared-core"),(0,r.kt)("td",{parentName:"tr",align:null},"8"),(0,r.kt)("td",{parentName:"tr",align:null},"20"),(0,r.kt)("td",{parentName:"tr",align:null},"(any)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-8V-16-50"),(0,r.kt)("td",{parentName:"tr",align:null},"8"),(0,r.kt)("td",{parentName:"tr",align:null},"shared-core"),(0,r.kt)("td",{parentName:"tr",align:null},"16"),(0,r.kt)("td",{parentName:"tr",align:null},"50"),(0,r.kt)("td",{parentName:"tr",align:null},"(any)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-16V-32-100"),(0,r.kt)("td",{parentName:"tr",align:null},"16"),(0,r.kt)("td",{parentName:"tr",align:null},"shared-core"),(0,r.kt)("td",{parentName:"tr",align:null},"32"),(0,r.kt)("td",{parentName:"tr",align:null},"100"),(0,r.kt)("td",{parentName:"tr",align:null},"(any)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-1V-8-20"),(0,r.kt)("td",{parentName:"tr",align:null},"1"),(0,r.kt)("td",{parentName:"tr",align:null},"shared-core"),(0,r.kt)("td",{parentName:"tr",align:null},"8"),(0,r.kt)("td",{parentName:"tr",align:null},"20"),(0,r.kt)("td",{parentName:"tr",align:null},"(any)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-2V-16-50"),(0,r.kt)("td",{parentName:"tr",align:null},"2"),(0,r.kt)("td",{parentName:"tr",align:null},"shared-core"),(0,r.kt)("td",{parentName:"tr",align:null},"16"),(0,r.kt)("td",{parentName:"tr",align:null},"50"),(0,r.kt)("td",{parentName:"tr",align:null},"(any)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-4V-32-100"),(0,r.kt)("td",{parentName:"tr",align:null},"4"),(0,r.kt)("td",{parentName:"tr",align:null},"shared-core"),(0,r.kt)("td",{parentName:"tr",align:null},"32"),(0,r.kt)("td",{parentName:"tr",align:null},"100"),(0,r.kt)("td",{parentName:"tr",align:null},"(any)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-1L-1-5"),(0,r.kt)("td",{parentName:"tr",align:null},"1"),(0,r.kt)("td",{parentName:"tr",align:null},"crowded-core"),(0,r.kt)("td",{parentName:"tr",align:null},"1"),(0,r.kt)("td",{parentName:"tr",align:null},"5"),(0,r.kt)("td",{parentName:"tr",align:null},"(any)")))),(0,r.kt)("h3",{id:"guarantees-and-properties"},"Guarantees and properties"),(0,r.kt)("p",null,"The figures given in the table (number of CPUs, amount of RAM, root disk size) must match\nprecisely the corresponding figures in the flavor."),(0,r.kt)("p",null,"In addition, the following properties must be set (in the ",(0,r.kt)("inlineCode",{parentName:"p"},"extra_specs"),"):"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"scs:name-v1")," to the recommended name, but with each dash AFTER the first one replaced by a colon,"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"scs:name-v2")," to the recommended name,"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"scs:cpu-type")," to ",(0,r.kt)("inlineCode",{parentName:"li"},"shared-core")," or ",(0,r.kt)("inlineCode",{parentName:"li"},"crowded-core"),", reflecting the vCPU type,"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"scs:disk0-type")," not set if no disk is provided, otherwise set to ",(0,r.kt)("inlineCode",{parentName:"li"},"ssd")," or some other\nvalue, reflecting the disk type.")),(0,r.kt)("h3",{id:"remarks"},"Remarks"),(0,r.kt)("p",null,"We expect the most used vCPU:RAM","[GiB]"," ratio to be 1:4."),(0,r.kt)("p",null,"Note that all vCPUs of SCS standard flavors are oversubscribed \u2014 the smallest ",(0,r.kt)("inlineCode",{parentName:"p"},"1L-1"),"\nflavor allows for heavy oversubscription (note the ",(0,r.kt)("inlineCode",{parentName:"p"},"L"),"), and thus can be offered very\ncheaply \u2014 imagine jump hosts ..."),(0,r.kt)("p",null,"The design allows for small clouds (with CPUs with 16 Threads, 64GiB RAM\ncompute hosts) to offer all flavors."),(0,r.kt)("p",null,"Except for the two flavors with SSD root volume, disks types are not specified\n(and expected to be network disks (Ceph/Cinder) or local SATA/SAS disks typically)."),(0,r.kt)("p",null,"We only included a limited variation of disk sizes \u2014 this reflects that\nfor the standard networked cinder\ndisks, you can pass ",(0,r.kt)("inlineCode",{parentName:"p"},"block_device_mapping_v2")," on server (VM) creation to\nallocate a boot disk of any size you desire. We have scaled the few\nrecommended disk sizes with the amount of RAM. For each flavor there is\nalso one ",(0,r.kt)("em",{parentName:"p"},"without")," a pre-attached disk \u2014 these are meant to be used\nto boot from a volume (either created beforehand or allocated on-the-fly\nwith ",(0,r.kt)("inlineCode",{parentName:"p"},"block_device_mapping_v2"),", e.g.\n",(0,r.kt)("inlineCode",{parentName:"p"},"openstack server create --flavor SCS-1V-2 --block-device-mapping sda=IMGUUID:image:12:true"),"\nto create a bootable 12G cinder volume from image ",(0,r.kt)("inlineCode",{parentName:"p"},"IMGUUID")," that gets tied to the VM\ninstance life cycle.)"),(0,r.kt)("h2",{id:"conformance-tests"},"Conformance Tests"),(0,r.kt)("p",null,"The script ",(0,r.kt)("inlineCode",{parentName:"p"},"flavors-openstack.py")," will read the lists of mandatory and recommended flavors\nfrom a yaml file provided as command-line argument, connect to an OpenStack installation,\nand check whether the flavors are present and their extra specs are correct. Missing\nflavors will be reported on various logging channels: error for mandatory, info for\nrecommended flavors. Incorrect extra specs will be reported as error in any case.\nThe return code will be non-zero if the test could not be performed or if any error was\nreported."),(0,r.kt)("h2",{id:"operational-tooling"},"Operational tooling"),(0,r.kt)("p",null,"The ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/osism/openstack-flavor-manager"},"openstack-flavor-manager")," is able to\ncreate all standard, mandatory SCS flavors for you. It takes input that can be generated by\n",(0,r.kt)("inlineCode",{parentName:"p"},"flavor-manager-input.py"),"."),(0,r.kt)("h2",{id:"previous-standard-versions"},"Previous standard versions"),(0,r.kt)("p",null,"The list of standard flavors used to be part of the flavor naming standard up until\n",(0,r.kt)("a",{parentName:"p",href:"/standards/scs-0100-v3-flavor-naming"},"version 3"),". The following changes have been made to\nthe list in comparison with said standard:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"the flavor names have been turned into recommendations, and"),(0,r.kt)("li",{parentName:"ul"},"the properties have been introduced in order to help discoverability.")),(0,r.kt)("p",null,"Note that the flavors with fixed size root disks have all moved to Recommended\nwith ",(0,r.kt)("a",{parentName:"p",href:"/standards/scs-0100-v3-flavor-naming"},"scs-0100-v3"),".\nThis means that they are not a certification requirement any longer,\nbut we still recommend implementing these for backwards compatibility reasons.\nAlso in that standard, two flavors with SSD+ root disks have been added, as defined in\n",(0,r.kt)("a",{parentName:"p",href:"/standards/scs-0110-v1-ssd-flavors"},"scs-0110-v1-ssd-flavors.md")))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/52e3f5ca.2c36c8fb.js b/assets/js/52e3f5ca.2c36c8fb.js new file mode 100644 index 0000000000..17e3b745b3 --- /dev/null +++ b/assets/js/52e3f5ca.2c36c8fb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3852],{52193:e=>{e.exports=JSON.parse('{"pluginId":"standards","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"standards":[{"type":"link","label":"Introduction","href":"/standards/","docId":"index"},{"type":"link","label":"Certification","href":"/standards/certification/overview","docId":"certification/overview"},{"type":"category","label":"Standards","items":[{"type":"category","label":"Global","items":[{"type":"category","label":"\ud83d\udfe2 SCS-0001","items":[{"type":"link","label":"V1","href":"/standards/scs-0001-v1-sovereign-cloud-standards","docId":"scs-0001-v1-sovereign-cloud-standards"}],"collapsed":true,"collapsible":true,"href":"/standards/global/scs-0001"},{"type":"category","label":"\ud83d\udfe2 SCS-0002","items":[{"type":"link","label":"V1","href":"/standards/scs-0002-v1-standards-docs-org","docId":"scs-0002-v1-standards-docs-org"},{"type":"link","label":"V2","href":"/standards/scs-0002-v2-standards-docs-org","docId":"scs-0002-v2-standards-docs-org"}],"collapsed":true,"collapsible":true,"href":"/standards/global/scs-0002"},{"type":"category","label":"\ud83d\udfe0 SCS-0003","items":[{"type":"link","label":"V1","href":"/standards/scs-0003-v1-sovereign-cloud-standards-yaml","docId":"scs-0003-v1-sovereign-cloud-standards-yaml"}],"collapsed":true,"collapsible":true,"href":"/standards/global/scs-0003"}],"collapsed":true,"collapsible":true,"href":"/standards/global/"},{"type":"category","label":"IaaS","items":[{"type":"category","label":"\ud83d\udfe2 SCS-0100","items":[{"type":"link","label":"V1","href":"/standards/scs-0100-v1-flavor-naming","docId":"scs-0100-v1-flavor-naming"},{"type":"link","label":"V2","href":"/standards/scs-0100-v2-flavor-naming","docId":"scs-0100-v2-flavor-naming"},{"type":"link","label":"V3","href":"/standards/scs-0100-v3-flavor-naming","docId":"scs-0100-v3-flavor-naming"}],"collapsed":true,"collapsible":true,"href":"/standards/iaas/scs-0100"},{"type":"category","label":"\ud83d\udfe0 SCS-0101","items":[{"type":"link","label":"V1","href":"/standards/scs-0101-v1-entropy","docId":"scs-0101-v1-entropy"}],"collapsed":true,"collapsible":true,"href":"/standards/iaas/scs-0101"},{"type":"category","label":"\ud83d\udfe2 SCS-0102","items":[{"type":"link","label":"V1","href":"/standards/scs-0102-v1-image-metadata","docId":"scs-0102-v1-image-metadata"}],"collapsed":true,"collapsible":true,"href":"/standards/iaas/scs-0102"},{"type":"category","label":"\ud83d\udfe0 SCS-0103","items":[{"type":"link","label":"V1","href":"/standards/scs-0103-v1-standard-flavors","docId":"scs-0103-v1-standard-flavors"}],"collapsed":true,"collapsible":true,"href":"/standards/iaas/scs-0103"},{"type":"category","label":"\ud83d\udfe0 SCS-0104","items":[{"type":"link","label":"V1","href":"/standards/scs-0104-v1-standard-images","docId":"scs-0104-v1-standard-images"}],"collapsed":true,"collapsible":true,"href":"/standards/iaas/scs-0104"}],"collapsed":true,"collapsible":true,"href":"/standards/iaas/"},{"type":"category","label":"KaaS","items":[{"type":"category","label":"\ud83d\udfe2 SCS-0210","items":[{"type":"link","label":"V1","href":"/standards/scs-0210-v1-k8s-new-version-policy","docId":"scs-0210-v1-k8s-new-version-policy"}],"collapsed":true,"collapsible":true,"href":"/standards/kaas/scs-0210"},{"type":"category","label":"\ud83d\udfe2 SCS-0211","items":[{"type":"link","label":"V1","href":"/standards/scs-0211-v1-kaas-default-storage-class","docId":"scs-0211-v1-kaas-default-storage-class"}],"collapsed":true,"collapsible":true,"href":"/standards/kaas/scs-0211"}],"collapsed":true,"collapsible":true,"href":"/standards/kaas/"},{"type":"category","label":"IAM","items":[{"type":"category","label":"\ud83d\udfe2 SCS-0300","items":[{"type":"link","label":"V1","href":"/standards/scs-0300-v1-requirements-for-sso-identity-federation","docId":"scs-0300-v1-requirements-for-sso-identity-federation"}],"collapsed":true,"collapsible":true,"href":"/standards/iam/scs-0300"}],"collapsed":true,"collapsible":true,"href":"/standards/iam/"},{"type":"category","label":"Ops","items":[{"type":"category","label":"\ud83d\udfe0 SCS-0412","items":[{"type":"link","label":"V1","href":"/standards/scs-0412-v1-metering-json","docId":"scs-0412-v1-metering-json"}],"collapsed":true,"collapsible":true,"href":"/standards/ops/scs-0412"}],"collapsed":true,"collapsible":true,"href":"/standards/ops/"}],"collapsed":true,"collapsible":true,"href":"/standards/standards/overview"},{"type":"category","label":"Decision Records","items":[{"type":"category","label":"SCS-0110","items":[{"type":"link","label":"V1","href":"/standards/scs-0110-v1-ssd-flavors","docId":"scs-0110-v1-ssd-flavors"}],"collapsed":true,"collapsible":true,"href":"/standards/scs-0110"},{"type":"category","label":"SCS-0111","items":[{"type":"link","label":"V1","href":"/standards/scs-0111-v1-volume-type-decisions","docId":"scs-0111-v1-volume-type-decisions"}],"collapsed":true,"collapsible":true,"href":"/standards/standards/scs-0111"},{"type":"category","label":"SCS-0212","items":[{"type":"link","label":"V1","href":"/standards/scs-0212-v1-requirements-for-container-registry","docId":"scs-0212-v1-requirements-for-container-registry"}],"collapsed":true,"collapsible":true,"href":"/standards/standards/scs-0212"},{"type":"category","label":"SCS-0213","items":[{"type":"link","label":"V1","href":"/standards/scs-0213-v1-k8s-nodes-anti-affinity","docId":"scs-0213-v1-k8s-nodes-anti-affinity"}],"collapsed":true,"collapsible":true,"href":"/standards/standards/scs-0213"},{"type":"category","label":"SCS-0301","items":[{"type":"link","label":"V1","href":"/standards/scs-0301-v1-naming-conventions","docId":"scs-0301-v1-naming-conventions"}],"collapsed":true,"collapsible":true,"href":"/standards/standards/scs-0301"},{"type":"category","label":"SCS-0400","items":[{"type":"link","label":"V1","href":"/standards/scs-0400-v1-status-page-create-decision","docId":"scs-0400-v1-status-page-create-decision"}],"collapsed":true,"collapsible":true,"href":"/standards/standards/scs-0400"},{"type":"category","label":"SCS-0401","items":[{"type":"link","label":"V1","href":"/standards/scs-0401-v1-status-page-reference-implementation-decision","docId":"scs-0401-v1-status-page-reference-implementation-decision"}],"collapsed":true,"collapsible":true,"href":"/standards/standards/scs-0401"},{"type":"category","label":"SCS-0402","items":[{"type":"link","label":"V1","href":"/standards/scs-0402-v1-status-page-openapi-spec-decision","docId":"scs-0402-v1-status-page-openapi-spec-decision"}],"collapsed":true,"collapsible":true,"href":"/standards/standards/scs-0402"},{"type":"category","label":"SCS-0410","items":[{"type":"link","label":"V1","href":"/standards/scs-0410-v1-gnocchi-as-metering-database","docId":"scs-0410-v1-gnocchi-as-metering-database"}],"collapsed":true,"collapsible":true,"href":"/standards/standards/scs-0410"},{"type":"category","label":"SCS-0411","items":[{"type":"link","label":"V1","href":"/standards/scs-0411-v1-publishing_method_for_metering_data","docId":"scs-0411-v1-publishing_method_for_metering_data"}],"collapsed":true,"collapsible":true,"href":"/standards/standards/scs-0411"}],"collapsed":true,"collapsible":true,"href":"/standards/decision-records"}]},"docs":{"certification/certified-clouds":{"id":"certification/certified-clouds","title":"Certified Clouds","description":"This is a list of clouds that we test on a nightly basis against our scs-compatible certification level."},"certification/get-certified":{"id":"certification/get-certified","title":"How to get certified","description":"1. (optional) Download the compliance check tool and run it on your environment in order to check that all standards for the certification scope are met."},"certification/overview":{"id":"certification/overview","title":"Certification","description":"Scopes and versions","sidebar":"standards"},"certification/subjects-versions":{"id":"certification/subjects-versions","title":"Scopes and Versions","description":"The SCS Certification scopes are discriminated in two dimensions. The first is the technology layer, which is either IaaS (infrastructure) or KaaS (Kubernetes). The second dimension is the level, which refer to the level of sovereignty, which is achieved by the certificate. There are three different levels:"},"global/index":{"id":"global/index","title":"Global Standards","description":"This track encompasses the foundational standards that guide the overall structure, documentation, and general topics related to the Sovereign Cloud Stack. It serves as the core framework, ensuring consistency, clarity, and comprehensibility across all aspects of the cloud stack, fostering an environment where information is easily accessible and understood.","sidebar":"standards"},"global/scs-0001":{"id":"global/scs-0001","title":"SCS-0001: SCS Standards","description":"SCS-0001 outlines the structure, requirements, and lifecycle of standards, procedural documents, and decision records within the Sovereign Cloud Stack (SCS) community, ensuring clarity, organization, and governance in the development and maintenance of interoperable and transparent cloud infrastructure standards.","sidebar":"standards"},"global/scs-0002":{"id":"global/scs-0002","title":"SCS-0002: Org & Docs Standards","description":"SCS-0002 standard outlines the standardized structure and maintenance processes for easily accessible and comprehensible content of the SCS project.","sidebar":"standards"},"global/scs-0003":{"id":"global/scs-0003","title":"SCS-0003: YAML Standards","description":"SCS-0003 outlines the standards and certification processes for interoperable and sovereign cloud offerings, categorizing certifications into levels and layers, and detailing their progression, prerequisites, and versioning in a machine-readable YAML format for clarity, traceability, and tool integration.","sidebar":"standards"},"iaas/index":{"id":"iaas/index","title":"IaaS Standards","description":"The IaaS Layer Standards track focuses on the protocols, guidelines, and specifications that govern the infrastructure as a service layer. This encompasses standards for virtual machines, storage, networking, and other foundational resources, ensuring seamless, efficient, and secure operation, interoperability, and management of the underlying cloud infrastructure.","sidebar":"standards"},"iaas/scs-0100":{"id":"iaas/scs-0100","title":"SCS-0100: Flavor Naming","description":"The SCS Flavor Naming Standard provides a systematic approach for naming instance flavors in OpenStack environments, ensuring backward compatibility and clarity on key features like the number of vCPUs, RAM, and Root Disk, as well as extra features like GPU support and CPU generation. The standard aims for usability and portability across all SCS flavors.","sidebar":"standards"},"iaas/scs-0101":{"id":"iaas/scs-0101","title":"SCS-0101: Entropy","description":"The SCS-0101 Entropy Standard ensures adequate entropy is available in virtual instances, crucial for operations like secure key creation in cryptography. The standard recommends using kernel version 5.18 or higher and activating the hwrngmodel: virtio attribute for images, while compute nodes should employ CPUs with entropy accessing instructions unfiltered by the hypervisor. It allows the infusion of the hosts entropy sources into virtual instances and ensures the availability and quality of entropy in virtual environments, promoting system security and efficiency.","sidebar":"standards"},"iaas/scs-0102":{"id":"iaas/scs-0102","title":"SCS-0102: Image Metadata","description":"The SCS-0102 Image Metadata Standard outlines how to categorize and manage metadata for cloud-based operating system images to ensure usability and clarity. The standard encompasses naming conventions, technical requirements, image handling protocols including updating and origin, and licensing/support details. These guidelines ensure that users can understand, access, and utilize OS images effectively, with clear information on features, updates, and licensing provided through well-defined metadata properties.","sidebar":"standards"},"iaas/scs-0103":{"id":"iaas/scs-0103","title":"SCS-0103: Standard Flavors","description":"The SCS-0103 standard outlines mandatory and recommended specifications for flavors and properties in OpenStack environments to ensure uniformity across SCS clouds. Mandatory and recommended flavors are defined with specific configurations of vCPUs, vCPU types, RAM, and root disk sizes, alongside extra specs like scscpu-type, and scs:diskN-type to detail the flavor\'s specifications. This standard facilitates guaranteed availability and consistency of flavors, simplifying the deployment process for DevOps teams.","sidebar":"standards"},"iaas/scs-0104":{"id":"iaas/scs-0104","title":"SCS-0104: Standard Images","description":"The SCS-0104 standard establishes guidelines for virtual machine images in Sovereign Cloud Stack (SCS) environments, specifying mandatory, recommended, and optional images via a YAML file, ensuring interoperability and streamlined deployments. It mandates that image upload via Glance must be allowed, ensuring flexibility for users. The standard\'s machine-readable document facilitates automated processing for compliance and integration purposes, promoting consistency and reliability in cloud environments.","sidebar":"standards"},"iam/index":{"id":"iam/index","title":"IAM Standards","description":"This track revolves around Identity and Access Management (IAM) standards, providing guidelines for ensuring secure and efficient user authentication, authorization, and administration. It addresses issues related to user identity, permissions, roles, and policies, aiming to safeguard and streamline access to cloud resources and services.","sidebar":"standards"},"iam/scs-0300":{"id":"iam/scs-0300","title":"SCS-0300: SSO Identity Federation","description":"The SCS-0300 standard outlines requirements for Single Sign-On (SSO) identity federation within the Sovereign Cloud Stack (SCS). It addresses the need for customers to access SCS services using credentials stored and managed externally, facilitating user onboarding and reducing the need for additional dedicated SCS accounts. The standard focuses on delegating authentication to external identity providers and mapping users to roles within SCS for authorization, while also considering the use of machine identities. Keycloak is the current choice as an Identity Provider (IdP) for its support of OAuth 2.0 grants and its integration with OpenStack and kolla-ansible.","sidebar":"standards"},"index":{"id":"index","title":"Introduction","description":"The Sovereign Cloud Stack (SCS) is a community-driven project that curates a set of standards\u2014including both existing standards, such as the OpenInfra interoperability guides or the CNCF Kubernetes conformance, and newly created ones\u2014to enable and ensure compatibility, openness, and sovereignty of cloud services across a wide range of providers, particularly small and medium businesses.","sidebar":"standards"},"kaas/index":{"id":"kaas/index","title":"KaaS Standards","description":"Standards in this track are concerned with Kubernetes as a Service layer, outlining norms and best practices for deploying, managing, and operating Kubernetes clusters. These standards aim to ensure that the orchestration of containers is streamlined, secure, and compatible across various cloud environments and platforms.","sidebar":"standards"},"kaas/scs-0210":{"id":"kaas/scs-0210","title":"SCS-0210: k8s New Version Policy","description":"The SCS-0210 standard outlines the expected pace at which providers should adopt new Kubernetes versions, aiming for alignment with the rapid development cycle of Kubernetes. Providers must offer the latest minor version within four months of its release and the newest patch version within a week, ensuring users have timely access to security updates, bug fixes, and features. The standard emphasizes the need for expedited updates for critical CVEs and expects providers to thoroughly test new versions before deployment.","sidebar":"standards"},"kaas/scs-0211":{"id":"kaas/scs-0211","title":"SCS-0211: KaaS Default Storage Class","description":"The SCS-0211 standard outlines the properties required for the default StorageClass in Kubernetes as a Service (KaaS). The standard ensures that the default StorageClass, identified by the \\"storageclass.kubernetes.io/is-default-class\\" annotation, supports the ReadWriteOnce access mode and protects volume data against loss due to single disk or host hardware failures.","sidebar":"standards"},"ops/index":{"id":"ops/index","title":"Ops Standards","description":"Operational Tooling Standards cover the protocols and guidelines associated with tools and utilities used for monitoring, management, and maintenance of the cloud environment. This includes standards for status pages, alerts, logs, and other operational tools, aiming to optimize the reliability, performance, and security of cloud services and resources.","sidebar":"standards"},"ops/scs-0412":{"id":"ops/scs-0412","title":"SCS-0412: Metering JSON","description":"The SCS-0412 standard addresses the need for a standardized interface to expose IaaS metering data in JSON format within the Sovereign Cloud Stack (SCS). This is to aid cloud operators in integrating SCS IaaS layer data with their existing billing and customer relationship systems. The standard adopts the Ceilometer HTTP hook format provided by the OpenStack Ceilometer project for telemetry and metering, avoiding the need for additional translation layers and implementation components.","sidebar":"standards"},"scs-0001-v1-sovereign-cloud-standards":{"id":"scs-0001-v1-sovereign-cloud-standards","title":"Sovereign Cloud Standards","description":"Introduction","sidebar":"standards"},"scs-0002-v1-standards-docs-org":{"id":"scs-0002-v1-standards-docs-org","title":"Standards, Docs and Organisation","description":"Introduction","sidebar":"standards"},"scs-0002-v2-standards-docs-org":{"id":"scs-0002-v2-standards-docs-org","title":"SCS Documentation structure","description":"Introduction","sidebar":"standards"},"scs-0003-v1-sovereign-cloud-standards-yaml":{"id":"scs-0003-v1-sovereign-cloud-standards-yaml","title":"Sovereign Cloud Standards YAML","description":"Introduction","sidebar":"standards"},"scs-0100-v1-flavor-naming":{"id":"scs-0100-v1-flavor-naming","title":"SCS Flavor Naming Standard","description":"Introduction","sidebar":"standards"},"scs-0100-v2-flavor-naming":{"id":"scs-0100-v2-flavor-naming","title":"SCS Flavor Naming Standard","description":"Introduction","sidebar":"standards"},"scs-0100-v3-flavor-naming":{"id":"scs-0100-v3-flavor-naming","title":"SCS Flavor Naming Standard","description":"Introduction","sidebar":"standards"},"scs-0101-v1-entropy":{"id":"scs-0101-v1-entropy","title":"SCS Entropy","description":"Introduction","sidebar":"standards"},"scs-0102-v1-image-metadata":{"id":"scs-0102-v1-image-metadata","title":"SCS Image Metadata Standard","description":"Motivation","sidebar":"standards"},"scs-0103-v1-standard-flavors":{"id":"scs-0103-v1-standard-flavors","title":"SCS Standard Flavors and Properties","description":"Introduction","sidebar":"standards"},"scs-0104-v1-standard-images":{"id":"scs-0104-v1-standard-images","title":"SCS Standard Images","description":"Introduction","sidebar":"standards"},"scs-0110-v1-ssd-flavors":{"id":"scs-0110-v1-ssd-flavors","title":"SSD Flavors","description":"Introduction","sidebar":"standards"},"scs-0111-v1-volume-type-decisions":{"id":"scs-0111-v1-volume-type-decisions","title":"Decisions for the Volume Type Standard","description":"Introduction","sidebar":"standards"},"scs-0210-v1-k8s-new-version-policy":{"id":"scs-0210-v1-k8s-new-version-policy","title":"SCS K8S Version Policy for new Kubernetes versions","description":"Introduction","sidebar":"standards"},"scs-0210-v2-k8s-version-policy":{"id":"scs-0210-v2-k8s-version-policy","title":"SCS K8S Version Policy","description":"Introduction"},"scs-0211-v1-kaas-default-storage-class":{"id":"scs-0211-v1-kaas-default-storage-class","title":"SCS KaaS default storage class","description":"Introduction","sidebar":"standards"},"scs-0212-v1-requirements-for-container-registry":{"id":"scs-0212-v1-requirements-for-container-registry","title":"Requirements for container registry","description":"Introduction","sidebar":"standards"},"scs-0213-v1-k8s-nodes-anti-affinity":{"id":"scs-0213-v1-k8s-nodes-anti-affinity","title":"Kubernetes Nodes Anti Affinity","description":"Introduction","sidebar":"standards"},"scs-0213-v1-requirements-for-testing-cluster-stacks":{"id":"scs-0213-v1-requirements-for-testing-cluster-stacks","title":"Requirements for testing cluster-stacks","description":"Introduction"},"scs-0214-v1-k8s-node-distribution":{"id":"scs-0214-v1-k8s-node-distribution","title":"Kubernetes Node Distribution and Availability","description":"Introduction"},"scs-0300-v1-requirements-for-sso-identity-federation":{"id":"scs-0300-v1-requirements-for-sso-identity-federation","title":"Requirements for SSO identity federation","description":"Introduction","sidebar":"standards"},"scs-0301-v1-naming-conventions":{"id":"scs-0301-v1-naming-conventions","title":"Naming for domains/groups/roles/project when onboarding new customers","description":"\x3c!---","sidebar":"standards"},"scs-0302-v1-domain-manager-role":{"id":"scs-0302-v1-domain-manager-role","title":"Domain Manager configuration for Keystone","description":"Introduction"},"scs-0400-v1-status-page-create-decision":{"id":"scs-0400-v1-status-page-create-decision","title":"Status Page create decision","description":"Introduction","sidebar":"standards"},"scs-0401-v1-status-page-reference-implementation-decision":{"id":"scs-0401-v1-status-page-reference-implementation-decision","title":"Status page reference implementation decision","description":"Introduction","sidebar":"standards"},"scs-0402-v1-status-page-openapi-spec-decision":{"id":"scs-0402-v1-status-page-openapi-spec-decision","title":"Status page OpenAPI decision","description":"Introduction","sidebar":"standards"},"scs-0410-v1-gnocchi-as-metering-database":{"id":"scs-0410-v1-gnocchi-as-metering-database","title":"Gnocchi as database for metering","description":"for more info. --\x3e","sidebar":"standards"},"scs-0411-v1-publishing_method_for_metering_data":{"id":"scs-0411-v1-publishing_method_for_metering_data","title":"Push-based approach for providing usage data","description":"for more info. --\x3e","sidebar":"standards"},"scs-0412-v1-metering-json":{"id":"scs-0412-v1-metering-json","title":"Exposition of IaaS metering data as JSON","description":"Introduction","sidebar":"standards"},"scs-XXXX-vN-template":{"id":"scs-XXXX-vN-template","title":"_Descriptive title_","description":"\x3c!---"},"standards/overview":{"id":"standards/overview","title":"Overview","description":"Standards are the core deliverable of SCS. By standardizing the open source software components of a cloud computing stack, their versions, how they are to be configured, deployed and utilized, SCS guarantees the reproducibility of a certain behavior of this technology.","sidebar":"standards"}}}')}}]); \ No newline at end of file diff --git a/assets/js/53596370.a38fddc7.js b/assets/js/53596370.a38fddc7.js new file mode 100644 index 0000000000..3b94c1a166 --- /dev/null +++ b/assets/js/53596370.a38fddc7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[867],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>d});var o=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function a(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=o.createContext({}),p=function(e){var t=o.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},c=function(e){var t=p(e.components);return o.createElement(l.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},f=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,s=e.originalType,l=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),u=p(n),f=r,d=u["".concat(l,".").concat(f)]||u[f]||m[f]||s;return n?o.createElement(d,a(a({ref:t},c),{},{components:n})):o.createElement(d,a({ref:t},c))}));function d(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var s=n.length,a=new Array(s);a[0]=f;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[u]="string"==typeof e?e:r,a[1]=i;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>m,frontMatter:()=>s,metadata:()=>i,toc:()=>p});var o=n(87462),r=(n(67294),n(3905));const s={},a='"Levels of consensus"',i={unversionedId:"operating-scs/components/status-page/docs/levels_of_consensus",id:"operating-scs/components/status-page/docs/levels_of_consensus",title:'"Levels of consensus"',description:"When implementing any system to be used by a group of potential users, there will be varying use cases and opinions about API's, programming languages, persistence models, authentication, authorization, deployment options and so on.",source:"@site/docs/04-operating-scs/components/status-page/docs/levels_of_consensus.md",sourceDirName:"04-operating-scs/components/status-page/docs",slug:"/operating-scs/components/status-page/docs/levels_of_consensus",permalink:"/docs/operating-scs/components/status-page/docs/levels_of_consensus",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/04-operating-scs/components/status-page/docs/levels_of_consensus.md",tags:[],version:"current",frontMatter:{},sidebar:"docs",previous:{title:"Components",permalink:"/docs/operating-scs/components/status-page/docs/components"},next:{title:"Metering",permalink:"/docs/category/metering"}},l={},p=[],c={toc:p},u="wrapper";function m(e){let{components:t,...n}=e;return(0,r.kt)(u,(0,o.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"levels-of-consensus"},'"Levels of consensus"'),(0,r.kt)("p",null,"When implementing any system to be used by a group of potential users, there will be varying use cases and opinions about API's, programming languages, persistence models, authentication, authorization, deployment options and so on.\nHence, building a complete one-fits-all solution is difficult, but (while offering a pretty un-opinionated reference implementation) even finding consensus on a few basic concepts may make adaptation and integration of different solutions possible."),(0,r.kt)("p",null,'The "levels" of consensus could be split into:'),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Consensus on...")),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("strong",{parentName:"li"},"Resource Definition"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},'"What is an incident?"'),(0,r.kt)("li",{parentName:"ul"},"Core REST API Spec"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("strong",{parentName:"li"},"General Architecture"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},'"Monolithic Web App or multiple components?"'),(0,r.kt)("li",{parentName:"ul"},'"Use static password file or rely on OIDC provider?"'),(0,r.kt)("li",{parentName:"ul"},"(If any:) Interfaces between components:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"AuthN mechanisms"),(0,r.kt)("li",{parentName:"ul"},"AuthZ decisions"))))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("strong",{parentName:"li"},"Implementation of core component(s)"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},'"Use reference implementation components?"'),(0,r.kt)("li",{parentName:"ul"},'"Go vs. JavaScript?"'),(0,r.kt)("li",{parentName:"ul"},'"Postgres vs. MySQL?"'))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("strong",{parentName:"li"},"Choice of all used components"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},'"Policy: Istio vs. traefik?"'),(0,r.kt)("li",{parentName:"ul"},'"Deployment: Helm vs. ansible?"'),(0,r.kt)("li",{parentName:"ul"},'"dex vs. keycloak vs. zitadel?"')))),(0,r.kt)("p",null,"Every user of the Status Page (API) should be able to either make full use of the full reference implementation, building little to none on their own; Or just pick core concepts/API's/automation and build partial compatibility."),(0,r.kt)("p",null,'E.g. while the value on agreeing on every aspect would bring the most value, this most likely is not likely to happen, but adopting only the "Resource Definition", should ideally bring value already.'))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5525.640f1c90.js b/assets/js/5525.640f1c90.js new file mode 100644 index 0000000000..62006abfb4 --- /dev/null +++ b/assets/js/5525.640f1c90.js @@ -0,0 +1 @@ +(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5525],{15525:()=>{}}]); \ No newline at end of file diff --git a/assets/js/5565c8ed.3ad273b7.js b/assets/js/5565c8ed.3ad273b7.js new file mode 100644 index 0000000000..510d098bad --- /dev/null +++ b/assets/js/5565c8ed.3ad273b7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8106],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>h});var n=a(67294);function i(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t=0||(i[a]=e[a]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(i[a]=e[a])}return i}var s=n.createContext({}),p=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},d=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var a=e.components,i=e.mdxType,o=e.originalType,s=e.parentName,d=r(e,["components","mdxType","originalType","parentName"]),u=p(a),c=i,h=u["".concat(s,".").concat(c)]||u[c]||m[c]||o;return a?n.createElement(h,l(l({ref:t},d),{},{components:a})):n.createElement(h,l({ref:t},d))}));function h(e,t){var a=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=a.length,l=new Array(o);l[0]=c;var r={};for(var s in t)hasOwnProperty.call(t,s)&&(r[s]=t[s]);r.originalType=e,r[u]="string"==typeof e?e:i,l[1]=r;for(var p=2;p{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>r,toc:()=>p});var n=a(87462),i=(a(67294),a(3905));const o={sidebar_label:"Cloud in a Box",sidebar_position:10},l="Cloud in a Box - CiaB",r={unversionedId:"iaas/guides/deploy-guide/examples/cloud-in-a-box",id:"iaas/guides/deploy-guide/examples/cloud-in-a-box",title:"Cloud in a Box - CiaB",description:"\ud83d\udca1 Cloud in a Box (CiaB) is a minimalistic installation of the latest stable OSISM release with only services which are needed to",source:"@site/docs/02-iaas/guides/deploy-guide/examples/cloud-in-a-box.md",sourceDirName:"02-iaas/guides/deploy-guide/examples",slug:"/iaas/guides/deploy-guide/examples/cloud-in-a-box",permalink:"/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/deploy-guide/examples/cloud-in-a-box.md",tags:[],version:"current",sidebarPosition:10,frontMatter:{sidebar_label:"Cloud in a Box",sidebar_position:10},sidebar:"docs",previous:{title:"Examples",permalink:"/docs/iaas/guides/deploy-guide/examples/"},next:{title:"Testbed",permalink:"/docs/iaas/guides/deploy-guide/examples/testbed"}},s={},p=[{value:"Requirements",id:"requirements",level:2},{value:"Types",id:"types",level:2},{value:"Installation",id:"installation",level:2},{value:"Automated installation (recommended)",id:"automated-installation-recommended",level:3},{value:"Manual installation",id:"manual-installation",level:3},{value:"Usage",id:"usage",level:2},{value:"Wireguard VPN service access",id:"wireguard-vpn-service-access",level:3},{value:"Webinterfaces",id:"webinterfaces",level:3},{value:"Command-line interfaces",id:"command-line-interfaces",level:3},{value:"Import of additional images",id:"import-of-additional-images",level:3},{value:"Upgrade",id:"upgrade",level:3},{value:"Customisations",id:"customisations",level:2},{value:"Use of 2nd NIC for external network",id:"use-of-2nd-nic-for-external-network",level:3},{value:"Running on a Virtual Machine",id:"running-on-a-virtual-machine",level:3},{value:"Nested virtualization",id:"nested-virtualization",level:4},{value:"Disk space saving",id:"disk-space-saving",level:4},{value:"QEMU guest agent",id:"qemu-guest-agent",level:4},{value:"Troubleshooting",id:"troubleshooting",level:2},{value:"Development",id:"development",level:2}],d={toc:p},u="wrapper";function m(e){let{components:t,...o}=e;return(0,i.kt)(u,(0,n.Z)({},d,o,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"cloud-in-a-box---ciab"},"Cloud in a Box - CiaB"),(0,i.kt)("p",null,"\ud83d\udca1 Cloud in a Box (CiaB) is a minimalistic installation of the latest stable OSISM release with only services which are needed to\nmake it work with Kubernetes. It is intended for use as a development\nsystem on bare-metal or for use in edge environments."),(0,i.kt)("admonition",{type:"warning"},(0,i.kt)("p",{parentName:"admonition"},"At the moment the secrets are stored in plain text in the ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/osism/cloud-in-a-box"},"osism/cloud-in-a-box"),"\nrepository and are not secure. Do not use for public accessible systems. In the future, the secrets will be generated automatically.")),(0,i.kt)("h2",{id:"requirements"},"Requirements"),(0,i.kt)("p",null,"The system to be used as Cloud in a Box must fulfill these minimum requirements."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Type of resource"),(0,i.kt)("th",{parentName:"tr",align:null},"Amount"),(0,i.kt)("th",{parentName:"tr",align:null},"Note"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"CPU"),(0,i.kt)("td",{parentName:"tr",align:null},"at least 1 socket with 4 cores"),(0,i.kt)("td",{parentName:"tr",align:null},"More is better here. This is the minimum where you can't use much payload (LBaaS, VMs). The use of Kubernetes with Cluster API is not possible with this minimum size.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"RAM"),(0,i.kt)("td",{parentName:"tr",align:null},"at least 32 GByte"),(0,i.kt)("td",{parentName:"tr",align:null},"More is better here. In principle, it also works with 8 GByte, but then no payload (LBaaS, VMs) can be used. Kubernetes with Cluster API cannot be used then.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"Storage"),(0,i.kt)("td",{parentName:"tr",align:null},"at least 1 TByte"),(0,i.kt)("td",{parentName:"tr",align:null},"Has to be available as ",(0,i.kt)("inlineCode",{parentName:"td"},"/dev/sda")," or ",(0,i.kt)("inlineCode",{parentName:"td"},"/dev/nvme0n1"),". Less than 1 TByte is also possible, the smaller the less storage is available for use in Ceph.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"Network"),(0,i.kt)("td",{parentName:"tr",align:null},"at least 1 network interface (DHCP and internet access)"),(0,i.kt)("td",{parentName:"tr",align:null},"An optional ",(0,i.kt)("a",{parentName:"td",href:"#use-of-2nd-nic-for-external-network"},"2nd network interface can be used for external connectivity"),".")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"USB stick"),(0,i.kt)("td",{parentName:"tr",align:null},"at least 2 GByte"),(0,i.kt)("td",{parentName:"tr",align:null},"Installation media for Cloud in a Box bootstrapping")))),(0,i.kt)("h2",{id:"types"},"Types"),(0,i.kt)("p",null,"There are two types of Cloud in a Box."),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"The ",(0,i.kt)("strong",{parentName:"p"},"sandbox")," type is intended for developers and demonstrations. A full OSISM installation\nis one there which also includes Ceph and OpenSearch, for example. In the course of the\ninstallation, necessary images, networks, etc. are also created.")),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"The ",(0,i.kt)("strong",{parentName:"p"},"edge")," type is intended to be deployed as an appliance to provide an edge cloud on a\nsingle node. Compared to the sandbox, certain services are not provided there or are\nimplemented differently. For example, OpenSearch is not deployed because the logs are\ndelivered to a central location. The storage backend will also be implemented differently there\nin the future instead of Ceph."))),(0,i.kt)("h2",{id:"installation"},"Installation"),(0,i.kt)("h3",{id:"automated-installation-recommended"},"Automated installation (recommended)"),(0,i.kt)("p",null,"The images currently download and install the\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/osism/cloud-in-a-box"},"latest state of the installation scripts"),",\ntherefore it is mandatory to update the installation media at least when the underlying Ubuntu operating\nsystem release changes. The installation of older releases is currently not supported. "),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Download one of the Cloud in a Box images of type sandbox"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://swift.services.a.regiocloud.tech/swift/v1/AUTH_b182637428444b9aa302bb8d5a5a418c/osism-node-image/ubuntu-autoinstall-cloud-in-a-box-1.iso"},"ubuntu-autoinstall-cloud-in-a-box-1.iso")," (with first block device as ",(0,i.kt)("inlineCode",{parentName:"li"},"/dev/sda"),")"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://swift.services.a.regiocloud.tech/swift/v1/AUTH_b182637428444b9aa302bb8d5a5a418c/osism-node-image/ubuntu-autoinstall-cloud-in-a-box-2.iso"},"ubuntu-autoinstall-cloud-in-a-box-2.iso")," (with first block device as ",(0,i.kt)("inlineCode",{parentName:"li"},"/dev/nvme0n1"),")"))),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Use a tool like ",(0,i.kt)("a",{parentName:"p",href:"https://etcher.balena.io"},"balenaEtcher")," or ",(0,i.kt)("inlineCode",{parentName:"p"},"dd")," to create a bootable USB stick with the Cloud\nin a Box image.")),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Boot from the USB stick. Make sure that the boot from USB is activated in the BIOS."),(0,i.kt)("admonition",{parentName:"li",type:"warning"},(0,i.kt)("p",{parentName:"admonition"},"When booting from this USB stick, all data on the hard disks will be destroyed\nwithout confirmation."))),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"The installation of the operating system (Ubuntu 22.04) will start and take a few minutes. After that the system\nwill shutdown.")),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"The first start of the system"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Remove the USB storage device\n(The USB stick is only needed again if the Cloud in a Box system is to be fully reinstalled.)"),(0,i.kt)("li",{parentName:"ul"},"Connect the first network interface to an ethernet interface that provides access to the internet via DHCP configuration"),(0,i.kt)("li",{parentName:"ul"},"Boot the system from the internal hard disk device"))),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"The deployment will start. This takes some time and the system will shutdown when the\ndeployment is finished. This takes roughly an hour, possibly longer depending on the\nhardware and internet connection.")),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Start the system again. System is ready for use, by default DHCP is tried on the first network device.")),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Login via SSH. Use the user ",(0,i.kt)("inlineCode",{parentName:"p"},"dragon")," with the password ",(0,i.kt)("inlineCode",{parentName:"p"},"password"),".\n(You can obtain the ip address by inspecting the logs of your dhcp server or from the ",(0,i.kt)("em",{parentName:"p"},"issue text")," of the virtual consoles of the system)"),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"ssh dragon@IP_FROM_YOUR_SERVER\npasswd\n")),(0,i.kt)("p",{parentName:"li"},(0,i.kt)("img",{alt:"CiaB Issue Text",src:a(8922).Z,width:"420",height:"109"})))),(0,i.kt)("h3",{id:"manual-installation"},"Manual installation"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Follow the ",(0,i.kt)("a",{parentName:"p",href:"../provisioning"},"provisioning guide"),",\nskip the part about disk layout and do it this way:"),(0,i.kt)("p",{parentName:"li"},(0,i.kt)("img",{alt:"Disk layout",src:a(5633).Z,width:"1033",height:"769"})),(0,i.kt)("ol",{parentName:"li"},(0,i.kt)("li",{parentName:"ol"},"Create a 1 GByte ext4 partition mounted in ",(0,i.kt)("inlineCode",{parentName:"li"},"/boot")),(0,i.kt)("li",{parentName:"ol"},"Create a 8 GByte swap partition"),(0,i.kt)("li",{parentName:"ol"},"Create a 120 GByte unformatted partition"),(0,i.kt)("li",{parentName:"ol"},"Use a ",(0,i.kt)("inlineCode",{parentName:"li"},"Create volume group (LVM)")," to create a volume group called ",(0,i.kt)("inlineCode",{parentName:"li"},"system")," with the size of\n120 GByte on the partition 4 you just created"),(0,i.kt)("li",{parentName:"ol"},"Create a logical volume by selecting the ",(0,i.kt)("inlineCode",{parentName:"li"},"Free Space")," option under ",(0,i.kt)("inlineCode",{parentName:"li"},"system")," LVM. This volume\nshould be mounted in ",(0,i.kt)("inlineCode",{parentName:"li"},"/")," and have size of 100 GByte"),(0,i.kt)("li",{parentName:"ol"},"Create a partition with the size of the rest of the drive's space"),(0,i.kt)("li",{parentName:"ol"},"Create a new LVM volume group on partition 5 called ",(0,i.kt)("inlineCode",{parentName:"li"},"osd-vg")," (will be used for Ceph)"))),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"After the Ubuntu installation, the system will be rebooted")),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Log into the machine via console to get its IP address and then use SSH to connect to the machine")),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Clone the ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/osism/cloud-in-a-box"},"osism/cloud-in-a-box")," repository into ",(0,i.kt)("inlineCode",{parentName:"p"},"/opt/cloud-in-a-box")),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"sudo git clone https://github.com/osism/cloud-in-a-box /opt/cloud-in-a-box\n"))),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Disable conflicting services from the default Ubuntu installation"),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"sudo /opt/cloud-in-a-box/cleanup.sh\n"))),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Install upgrades"),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"sudo apt update\nsudo apt upgrade\n"))),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Run the ",(0,i.kt)("inlineCode",{parentName:"p"},"bootstrap.sh")," script with the required ",(0,i.kt)("a",{parentName:"p",href:"#types"},"type")," (use of ",(0,i.kt)("inlineCode",{parentName:"p"},"sandbox")," is recommended)"),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"sudo /opt/cloud-in-a-box/bootstrap.sh sandbox\n"))),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Run the ",(0,i.kt)("inlineCode",{parentName:"p"},"deploy.sh")," script with the same type as in step 8 to deploy services like Ceph and OpenStack"),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"sudo /opt/cloud-in-a-box/deploy.sh sandbox\n"))),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Shutdown the system"),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"sudo shutdown -h now\n"))),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Start the system again. System is ready for use, by default DHCP is tried on the first network device.")),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Login via SSH. Use the user ",(0,i.kt)("inlineCode",{parentName:"p"},"dragon")," with the password ",(0,i.kt)("inlineCode",{parentName:"p"},"password"),".\n(You can obtain the ip address by inspecting the logs of your dhcp server or from the ",(0,i.kt)("em",{parentName:"p"},"issue text")," of the virtual consoles of the system)"),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"ssh dragon@IP_FROM_YOUR_SERVER\npasswd\n")),(0,i.kt)("p",{parentName:"li"},(0,i.kt)("img",{alt:"CiaB Issue Text",src:a(8922).Z,width:"420",height:"109"})))),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"The scripts are not idempotent yet. In case there is any fail during ",(0,i.kt)("inlineCode",{parentName:"p"},"bootstrap.sh")," or ",(0,i.kt)("inlineCode",{parentName:"p"},"deploy.sh")," you have to\nstart over with fresh installation.")),(0,i.kt)("h2",{id:"usage"},"Usage"),(0,i.kt)("h3",{id:"wireguard-vpn-service-access"},"Wireguard VPN service access"),(0,i.kt)("p",null,"Copy the ",(0,i.kt)("inlineCode",{parentName:"p"},"/home/dragon/wireguard-client.conf")," file from Cloud in a Box to your workstation. This is necessary\nfor using the web endpoints on your workstation. Rename the wireguard config file to something\nlike ",(0,i.kt)("inlineCode",{parentName:"p"},"cloud-in-a-box.conf"),"."),(0,i.kt)("p",null,"If you want to connect to the Cloud in a Box system from multiple clients, change the client IP\naddress in the config file to be different on each client."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"scp dragon@IP_FROM_YOUR_SERVER:/home/dragon/wireguard-client.conf $HOME/cloud-in-a-box.conf\n")),(0,i.kt)("p",null,"Install wireguard on your workstation, if you have not done this before. For instructions how to do\nit on your workstation, please have a look on the documentation of your used distribution. The\nwireguard documentation you will find ",(0,i.kt)("a",{parentName:"p",href:"https://www.wireguard.com/"},"here"),"."),(0,i.kt)("p",null,"Start the wireguard tunnel."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"sudo wg-quick up $HOME/cloud-in-a-box.conf\n")),(0,i.kt)("h3",{id:"webinterfaces"},"Webinterfaces"),(0,i.kt)("p",null,"If you want to access the services please choose the URL from the following list:"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Name"),(0,i.kt)("th",{parentName:"tr",align:null},"URL"),(0,i.kt)("th",{parentName:"tr",align:null},"Username"),(0,i.kt)("th",{parentName:"tr",align:null},"Password"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"ARA"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://ara.services.in-a-box.cloud"},"https://ara.services.in-a-box.cloud")),(0,i.kt)("td",{parentName:"tr",align:null},"ara"),(0,i.kt)("td",{parentName:"tr",align:null},"password")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"Ceph"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"http://manager.systems.in-a-box.cloud:7000"},"http://manager.systems.in-a-box.cloud:7000")),(0,i.kt)("td",{parentName:"tr",align:null},"admin"),(0,i.kt)("td",{parentName:"tr",align:null},"password")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"Flower"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://flower.services.in-a-box.cloud"},"https://flower.services.in-a-box.cloud")),(0,i.kt)("td",{parentName:"tr",align:null},"-"),(0,i.kt)("td",{parentName:"tr",align:null},"-")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"Grafana"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://api.in-a-box.cloud:3000"},"https://api.in-a-box.cloud:3000")),(0,i.kt)("td",{parentName:"tr",align:null},"admin"),(0,i.kt)("td",{parentName:"tr",align:null},"password")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"HAProxy"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"http://manager.systems.in-a-box.cloud:1984"},"http://manager.systems.in-a-box.cloud:1984")),(0,i.kt)("td",{parentName:"tr",align:null},"openstack"),(0,i.kt)("td",{parentName:"tr",align:null},"password")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"Homer"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://homer.services.in-a-box.cloud"},"https://homer.services.in-a-box.cloud")),(0,i.kt)("td",{parentName:"tr",align:null},"-"),(0,i.kt)("td",{parentName:"tr",align:null},"-")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"Horizon - admin project"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://api.in-a-box.cloud"},"https://api.in-a-box.cloud")),(0,i.kt)("td",{parentName:"tr",align:null},"admin"),(0,i.kt)("td",{parentName:"tr",align:null},"password")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"Horizon - test project"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://api.in-a-box.cloud"},"https://api.in-a-box.cloud")),(0,i.kt)("td",{parentName:"tr",align:null},"test"),(0,i.kt)("td",{parentName:"tr",align:null},"test")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"Netbox"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://netbox.services.in-a-box.cloud"},"https://netbox.services.in-a-box.cloud")),(0,i.kt)("td",{parentName:"tr",align:null},"admin"),(0,i.kt)("td",{parentName:"tr",align:null},"password")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"Netdata"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"http://manager.systems.in-a-box.cloud:19999"},"http://manager.systems.in-a-box.cloud:19999")),(0,i.kt)("td",{parentName:"tr",align:null},"-"),(0,i.kt)("td",{parentName:"tr",align:null},"-")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"OpenSearch Dashboards"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://api.in-a-box.cloud:5601"},"https://api.in-a-box.cloud:5601")),(0,i.kt)("td",{parentName:"tr",align:null},"opensearch"),(0,i.kt)("td",{parentName:"tr",align:null},"password")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"PhpMyAdmin"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://phpmyadmin.services.in-a-box.cloud"},"https://phpmyadmin.services.in-a-box.cloud")),(0,i.kt)("td",{parentName:"tr",align:null},"root"),(0,i.kt)("td",{parentName:"tr",align:null},"password")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"RabbitMQ"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://api.in-a-box.cloud:15672"},"https://api.in-a-box.cloud:15672")),(0,i.kt)("td",{parentName:"tr",align:null},"openstack"),(0,i.kt)("td",{parentName:"tr",align:null},"password")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"Skyline - admin project"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://api.in-a-box.cloud:9999"},"https://api.in-a-box.cloud:9999")),(0,i.kt)("td",{parentName:"tr",align:null},"admin"),(0,i.kt)("td",{parentName:"tr",align:null},"password")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"Skyline - test project"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://api.in-a-box.cloud:9999"},"https://api.in-a-box.cloud:9999")),(0,i.kt)("td",{parentName:"tr",align:null},"test"),(0,i.kt)("td",{parentName:"tr",align:null},"test")))),(0,i.kt)("h3",{id:"command-line-interfaces"},"Command-line interfaces"),(0,i.kt)("p",null,"Login to Cloud in a Box as described in step 8 of the installation chapter."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Select one of the preconfigured environments:",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"system")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"admin")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"test")))),(0,i.kt)("li",{parentName:"ul"},"Set the environment by exporting the environment variable: ",(0,i.kt)("inlineCode",{parentName:"li"},"OS_CLOUD"),":",(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"export OS_CLOUD=admin\n"))),(0,i.kt)("li",{parentName:"ul"},"Use ",(0,i.kt)("a",{parentName:"li",href:"https://docs.openstack.org/newton/user-guide/cli.html"},"OpenStack CLI")," via the command ",(0,i.kt)("inlineCode",{parentName:"li"},"openstack"),".",(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"openstack availability zone list\nopenstack image list\nopenstack server list # After installation there are no servers\n")))),(0,i.kt)("h3",{id:"import-of-additional-images"},"Import of additional images"),(0,i.kt)("p",null,"The ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/osism/openstack-image-manager/"},"OpenStack Image Manager")," is used to manage images.\nIn the example, the ",(0,i.kt)("inlineCode",{parentName:"p"},"Garden Linux")," image is imported."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"export OS_CLOUD=admin\nosism manage images --filter 'Garden Linux'\n")),(0,i.kt)("p",null,"All available images can be found in the ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/osism/openstack-image-manager/tree/main/etc/images"},"osism/openstack-image-manager")," repository."),(0,i.kt)("h3",{id:"upgrade"},"Upgrade"),(0,i.kt)("p",null,"It is best to execute the commands within a screen session, it takes some time. Please note\nthat you cannot update the Ceph deployment at the moment. This will be enabled in the future."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"osism apply configuration\n/opt/configuration/upgrade.sh\ndocker system prune -a\n")),(0,i.kt)("h2",{id:"customisations"},"Customisations"),(0,i.kt)("h3",{id:"use-of-2nd-nic-for-external-network"},"Use of 2nd NIC for external network"),(0,i.kt)("p",null,"In the default configuration, the Cloud in a Box is built in such a way that an internal\nVLAN101 is used as an simulated external network and this is made usable via the 1st network\ninterface using masquerading. This makes it possible for instances running on the Cloud\nin a Box to reach the internet. The disadvantage of this is that the instances themselves\ncan only be reached via floating IP addresses from the Cloud in a Box system itself or\nvia the Wireguard tunnel. Especially in edge environments, however, one would usually like\nto have this differently and the instances should be directly accessible via the local\nnetwork."),(0,i.kt)("p",null,"To make this work, first identify the name of a 2nd network card to be used."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"dragon@manager:~$ sudo lshw -class network -short\nH/W path Device Class Description\n============================================================\n/0/100/2.2/0 eno7 network Ethernet Connection X552 10 GbE SFP+\n/0/100/2.2/0.1 eno8 network Ethernet Connection X552 10 GbE SFP+\n/0/100/1c/0 eno1 network I210 Gigabit Network Connection\n/0/100/1c.1/0 eno2 network I210 Gigabit Network Connection\n/0/100/1c.4/0 eno3 network I350 Gigabit Network Connection\n/0/100/1c.4/0.1 eno4 network I350 Gigabit Network Connection\n/0/100/1c.4/0.2 eno5 network I350 Gigabit Network Connection\n/0/100/1c.4/0.3 eno6 network I350 Gigabit Network Connection\n")),(0,i.kt)("p",null,"In the following we use ",(0,i.kt)("inlineCode",{parentName:"p"},"eno7"),". Activate the device manually with ",(0,i.kt)("inlineCode",{parentName:"p"},"sudo ip link set up dev eno7"),".\nThen check that a link is actually present."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"dragon@manager:~$ ethtool eno7\nSettings for eno7:\n Supported ports: [ FIBRE ]\n Supported link modes: 10000baseT/Full\n[...]\n Link detected: yes\n")),(0,i.kt)("p",null,"Now this device is made permanently known in the network configuration. Select the MTU\naccordingly. For 1 GBit rather ",(0,i.kt)("inlineCode",{parentName:"p"},"1500")," than ",(0,i.kt)("inlineCode",{parentName:"p"},"9100"),"."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"/opt/configuration/inventory/group_vars/generic/network.yml")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"/opt/configuration/environments/manager/group_vars/manager.yml"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-yaml"},"network_ethernets:\n eno1:\n dhcp4: true\n eno7:\n mtu: 9100\n")),(0,i.kt)("p",null,"Then, this change is deployed and applied."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"osism apply network\nsudo netplan apply\n")),(0,i.kt)("p",null,"Now the configuration for Neutron and OVN is prepared. ",(0,i.kt)("inlineCode",{parentName:"p"},"network_workload_interface"),"\nis expanded by the 2nd network interface. The order is not random, first ",(0,i.kt)("inlineCode",{parentName:"p"},"vlan101"),"\nthen ",(0,i.kt)("inlineCode",{parentName:"p"},"eno7"),". ",(0,i.kt)("inlineCode",{parentName:"p"},"neutron_bridge_name")," is added."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"/opt/configuration/inventory/group_vars/generic/network.yml")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"/opt/configuration/environments/manager/group_vars/manager.yml"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-yaml"},'network_workload_interface: "vlan101,eno7"\nneutron_bridge_name: "br-ex,br-add"\n')),(0,i.kt)("p",null,"Then, this change is deployed."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"osism reconciler sync\nosism apply openvswitch\nosism apply ovn\nosism apply neutron\n")),(0,i.kt)("p",null,"Now segments and/or subnets can be configured. In this case, ",(0,i.kt)("inlineCode",{parentName:"p"},"eno7")," is configured as an\nuntagged port on the remote side."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"/opt/configuration/environments/openstack/playbook-additional-public-network.yml"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-yaml"},"- name: Create additional public network\n hosts: localhost\n connection: local\n\n tasks:\n - name: Create additional public network\n openstack.cloud.network:\n cloud: admin\n state: present\n name: public-add\n external: true\n provider_network_type: flat\n provider_physical_network: physnet2\n\n - name: Create additional public subnet\n openstack.cloud.subnet:\n cloud: admin\n state: present\n name: subnet-public-add\n network_name: public-add\n cidr: 192.168.23.0/24\n enable_dhcp: false\n allocation_pool_start: 192.168.23.100\n allocation_pool_end: 192.168.23.200\n gateway_ip: 192.168.23.1\n dns_nameservers:\n - 8.8.8.8\n - 9.9.9.9\n")),(0,i.kt)("p",null,"The additional public network can now be made known with\n",(0,i.kt)("inlineCode",{parentName:"p"},"osism apply -e openstack additional-public-network"),"."),(0,i.kt)("p",null,"There is now a 2nd floating IP address pool with the name ",(0,i.kt)("inlineCode",{parentName:"p"},"public-add"),"\navailable for use. If instances are to be started directly in this network,\n",(0,i.kt)("inlineCode",{parentName:"p"},"enable_dhcp: true")," must be set. In this case, it should be clarified in\nadvance with the provider of the external network whether the use of DHCP\nis permitted there."),(0,i.kt)("h3",{id:"running-on-a-virtual-machine"},"Running on a Virtual Machine"),(0,i.kt)("p",null,"The Cloud in a Box has been tested to run on a virtual machine. However, the Cloud in a Box is mainly made\nfor running on bare metal, the automated installation does not work, and other things may not work either."),(0,i.kt)("h4",{id:"nested-virtualization"},"Nested virtualization"),(0,i.kt)("p",null,"You likely want to run virtual machines on top of your Cloud in a Box.\nThe host machine has to support and enabled nested virtualization."),(0,i.kt)("p",null,"To enable nested virtualization the CPU configuration of the VM has to be ",(0,i.kt)("inlineCode",{parentName:"p"},"host-passthrough")," or ",(0,i.kt)("inlineCode",{parentName:"p"},"host-model")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://docs.fedoraproject.org/en-US/quick-docs/using-nested-virtualization-in-kvm/"},"Enabling nested virtualization in Fedora"))),(0,i.kt)("p",null,"The linked guide can be used in other distributions as well."),(0,i.kt)("h4",{id:"disk-space-saving"},"Disk space saving"),(0,i.kt)("p",null,"When using Cloud in a Box in a VM, you can utilize the qcow2 disk image or similar technology to save space.\nIn that case, the base installation requires just around 70 GB instead of a full 1 TB.\n(",(0,i.kt)("em",{parentName:"p"},"The drive still needs to be made with a capacity of at least 1TB; however, the actual disk space usage is lower."),")"),(0,i.kt)("p",null,'Also in case you want to experiment a bit more and "hack around" using the manual installation\nyou can make disk snapshots when turned off after the Ubuntu installs, ',(0,i.kt)("inlineCode",{parentName:"p"},"bootstrap.sh")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"deploy.sh")," to speed up your\nprogress."),(0,i.kt)("p",null,"If you use qemu, you can use following command to do snapshots."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'sudo virsh snapshot-create-as --domain cib bootstrap "run of bootstrap.sh" --disk-only --diskspec sda,snapshot=external,file=/var/lib/libvirt/images/ub2022_cib_boostrap.qcow2 --atomic\n')),(0,i.kt)("h4",{id:"qemu-guest-agent"},"QEMU guest agent"),(0,i.kt)("p",null,"When running inside QEMU, it may be worth it to install the QEMU guest agent."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"sudo apt -y install qemu-guest-agent\nsudo systemctl enable qemu-guest-agent\nsudo systemctl start qemu-guest-agent\n")),(0,i.kt)("h2",{id:"troubleshooting"},"Troubleshooting"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Broken disk setup",src:a(71959).Z,width:"2020",height:"1194"})),(0,i.kt)("p",null,"This error means that your disk setup is broken. Use ",(0,i.kt)("inlineCode",{parentName:"p"},"cfdisk")," and delete all partitions on\nthe system on which you want to install the Cloud in a Box image."),(0,i.kt)("p",null,"With ",(0,i.kt)("inlineCode",{parentName:"p"},"lsblk")," you can verify if the partitions are empty."),(0,i.kt)("h2",{id:"development"},"Development"),(0,i.kt)("p",null,"For the further development of the scripts and the mechanisms of the Cloud in a Box,\nyou need to know the following."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"The operating system is brought onto the node via ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/osism/node-image"},"an automatic Ubuntu installation"),"\nthat uses ",(0,i.kt)("a",{parentName:"li",href:"https://cloud-init.io"},"cloud-init")),(0,i.kt)("li",{parentName:"ul"},"The installation starts the script ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/osism/cloud-in-a-box/blob/main/init.sh"},"init.sh")," which performs\nan initial clone of the ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/osism/cloud-in-a-box"},"osism/cloud-in-a-box")," repository and a checkout of\nthe ",(0,i.kt)("inlineCode",{parentName:"li"},"main")," branch. It also executes the ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/osism/cloud-in-a-box/blob/main/deploy.sh"},"deploy.sh")," and\n",(0,i.kt)("a",{parentName:"li",href:"https://github.com/osism/cloud-in-a-box/blob/main/bootstrap.sh"},"bootstrap.sh")," scripts."),(0,i.kt)("li",{parentName:"ul"},"The installation persists the kernel parameters of the initial boot to the file ",(0,i.kt)("inlineCode",{parentName:"li"},"/etc/.initial-kernel-commandline")),(0,i.kt)("li",{parentName:"ul"},"The status and activities of the deployment are logged in ",(0,i.kt)("inlineCode",{parentName:"li"},"/var/log/install-cloud-in-a-box.log"),". For proper colors use ",(0,i.kt)("inlineCode",{parentName:"li"},"less -r"),".\nSearch for ",(0,i.kt)("inlineCode",{parentName:"li"},"OVERALL STATUS")," to find the result of the specific installation steps."),(0,i.kt)("li",{parentName:"ul"},"Branch and location of the ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/osism/cloud-in-a-box"},"osism/cloud-in-a-box")," repository can be overriden\nby setting the kernel parameters ",(0,i.kt)("inlineCode",{parentName:"li"},"ciab_repo_url")," (a public repository address without authentication) and ",(0,i.kt)("inlineCode",{parentName:"li"},"ciab_branch"),"\n(a name of a branch, use only ASCII chars, ",(0,i.kt)("inlineCode",{parentName:"li"},"-"),", and ",(0,i.kt)("inlineCode",{parentName:"li"},"_"),").")))}m.isMDXComponent=!0},5633:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/disk-layout-db64866af60ef6d2c41245db78dd15d1.png"},8922:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/issue-6cc9ac7387e0589d625dded707510641.png"},71959:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/screenshot1-c880f78ba33fc0577dce811dc2e42724.png"}}]); \ No newline at end of file diff --git a/assets/js/564eabfd.ad788772.js b/assets/js/564eabfd.ad788772.js new file mode 100644 index 0000000000..30d99b0362 --- /dev/null +++ b/assets/js/564eabfd.ad788772.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9468],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>b});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),p=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},c=function(e){var t=p(e.components);return r.createElement(l.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=p(n),m=a,b=d["".concat(l,".").concat(m)]||d[m]||u[m]||o;return n?r.createElement(b,s(s({ref:t},c),{},{components:n})):r.createElement(b,s({ref:t},c))}));function b(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,s=new Array(o);s[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[d]="string"==typeof e?e:a,s[1]=i;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var r=n(87462),a=(n(67294),n(3905));const o={},s="Harbor",i={unversionedId:"container/components/k8s-cluster-api-provider/doc/usage/harbor",id:"container/components/k8s-cluster-api-provider/doc/usage/harbor",title:"Harbor",description:"Project k8s-harbor is used for the SCS Harbor",source:"@site/docs/03-container/components/k8s-cluster-api-provider/doc/usage/harbor.md",sourceDirName:"03-container/components/k8s-cluster-api-provider/doc/usage",slug:"/container/components/k8s-cluster-api-provider/doc/usage/harbor",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/usage/harbor",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/03-container/components/k8s-cluster-api-provider/doc/usage/harbor.md",tags:[],version:"current",frontMatter:{}},l={},p=[{value:"Default deployment",id:"default-deployment",level:2},{value:"Configuration options",id:"configuration-options",level:2},{value:"Persistence",id:"persistence",level:3},{value:"Ingress and TLS",id:"ingress-and-tls",level:3}],c={toc:p},d="wrapper";function u(e){let{components:t,...n}=e;return(0,a.kt)(d,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"harbor"},"Harbor"),(0,a.kt)("p",null,"Project ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/k8s-harbor"},"k8s-harbor")," is used for the SCS Harbor\ncontainer registry deployment ",(0,a.kt)("a",{parentName:"p",href:"https://registry.scs.community/"},"https://registry.scs.community/"),"."),(0,a.kt)("p",null,"With this project, it is possible to deploy Harbor in a similar way into the workload cluster.\nIf you want to deploy Harbor, set terraform variable ",(0,a.kt)("inlineCode",{parentName:"p"},"deploy_harbor = true"),". It will deploy\nHarbor with ",(0,a.kt)("a",{parentName:"p",href:"#default-deployment"},"default options"),". The recommended approach is to\nset up also ",(0,a.kt)("a",{parentName:"p",href:"#persistence"},"persistence")," and ",(0,a.kt)("a",{parentName:"p",href:"#ingress-and-tls"},"ingress with tls"),"."),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"It automatically deploys flux as k8s-harbor requirement.\nIt also expects that the Swift object store is available in the targeting OpenStack project. S3 credentials\n(",(0,a.kt)("inlineCode",{parentName:"p"},"openstack ec2 credentials create"),") are created and saved into ",(0,a.kt)("em",{parentName:"p"},"~/$CLUSTER_NAME/deployed-manifests.d/harbor/.ec2"),".\nBucket (",(0,a.kt)("inlineCode",{parentName:"p"},'openstack container create "$PREFIX-$CLUSTER_NAME-harbor-registry"'),") for storing container images\nis also automatically created in the openstack Swift object store.")),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"Warning: Swift container and ec2 credentials are not removed when the workload cluster is deleted.")),(0,a.kt)("h2",{id:"default-deployment"},"Default deployment"),(0,a.kt)("p",null,"By default, Harbor will be deployed with these options:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-terraform"},'harbor_config = {\n domain_name: "",\n issuer_email: "",\n persistence: false,\n database_size: "1Gi",\n redis_size: "1Gi",\n trivy_size: "5Gi"\n}\n')),(0,a.kt)("p",null,"These options are templated to the mgmt server and used as environment variables\nduring the creation of the workload cluster:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"$ cat ~/cluster-defaults/harbor-settings\nDEPLOY_HARBOR=true\nHARBOR_DATABASE_SIZE=1Gi\nHARBOR_DOMAIN_NAME=\nHARBOR_ISSUER_EMAIL=\nHARBOR_PERSISTENCE=false\nHARBOR_REDIS_SIZE=1Gi\nHARBOR_TRIVY_SIZE=5G\n")),(0,a.kt)("p",null,"When the Harbor is deployed, you can check the status, e.g. by:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"$ flux get helmrelease -n default\nNAME REVISION SUSPENDED READY MESSAGE \nharbor 1.12.4 False True Release reconciliation succeeded\n")),(0,a.kt)("p",null,"or you can simply check if pods are running by ",(0,a.kt)("inlineCode",{parentName:"p"},"kubectl get pods"),"."),(0,a.kt)("p",null,"Harbor components are deployed as deployments and statefulsets:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"$ kubectl get deploy,sts\nNAME READY UP-TO-DATE AVAILABLE AGE\ndeployment.apps/harbor-core 2/2 2 2 11m\ndeployment.apps/harbor-exporter 1/1 1 1 11m\ndeployment.apps/harbor-jobservice 2/2 2 2 11m\ndeployment.apps/harbor-nginx 1/1 1 1 11m\ndeployment.apps/harbor-portal 2/2 2 2 11m\ndeployment.apps/harbor-registry 2/2 2 2 11m\n\nNAME READY AGE\nstatefulset.apps/harbor-database 1/1 11m\nstatefulset.apps/harbor-redis 1/1 11m\nstatefulset.apps/harbor-trivy 2/2 11m\n")),(0,a.kt)("p",null,"Default options deploy Harbor as clusterIP service without pvc persistence for database, redis and trivy.\nSee ",(0,a.kt)("inlineCode",{parentName:"p"},"terraform/files/kubernetes-manifests.d/harbor/envs/clusterIP/")," for further details.\nYou can access it via the k8s service ",(0,a.kt)("inlineCode",{parentName:"p"},"harbor"),", for example, ",(0,a.kt)("em",{parentName:"p"},"port-forward")," it and access it at http://localhost:8080:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"$ kubectl get svc harbor -o wide\nNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR\nharbor ClusterIP 10.109.57.148 80/TCP 11m app=harbor,component=nginx,release=harbor\n$ kubectl port-forward svc/harbor 8080:80\nForwarding from 127.0.0.1:8080 -> 8080\nForwarding from [::1]:8080 -> 8080\n")),(0,a.kt)("p",null,"Admin username is ",(0,a.kt)("inlineCode",{parentName:"p"},"admin")," and password can be obtained from the secret by:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"kubectl get secret harbor-secrets -o jsonpath='{.data.values\\.yaml}' | base64 -d | yq .harborAdminPassword\n")),(0,a.kt)("h2",{id:"configuration-options"},"Configuration options"),(0,a.kt)("h3",{id:"persistence"},"Persistence"),(0,a.kt)("p",null,"By default, ",(0,a.kt)("inlineCode",{parentName:"p"},"persistence")," is set to ",(0,a.kt)("inlineCode",{parentName:"p"},"false"),".\nWhen persistence is set to ",(0,a.kt)("inlineCode",{parentName:"p"},"true"),", i.e. ",(0,a.kt)("inlineCode",{parentName:"p"},"harbor_config = {persistence: true}"),",\nHarbor components (database, redis, trivy) are deployed with PVCs:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"$ kubectl get pvc\nNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE\ndata-harbor-redis-0 Bound pvc-982221c1-64cb-4d3e-a77d-1db5b4429a69 1Gi RWO cinder-default 6m12s\ndata-harbor-trivy-0 Bound pvc-8a2ad60c-c7bf-40e1-8593-0d00b3d40b4f 5Gi RWO cinder-default 6m12s\ndata-harbor-trivy-1 Bound pvc-734f9b6a-9cee-40e4-9e1c-b959d9f7b7cf 5Gi RWO cinder-default 5m11s\ndatabase-data-harbor-database-0 Bound pvc-c5c3a7e6-a99a-4f16-a5cc-792e9b3665d8 1Gi RWO cinder-default 6m12s\n")),(0,a.kt)("p",null,"The size of PVCs can be configured by ",(0,a.kt)("inlineCode",{parentName:"p"},'harbor_config = {_size: "size"}'),".\nTrivy has 2 replicas, i.e. 2 PVCs will be created."),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"When persistence is set to ",(0,a.kt)("inlineCode",{parentName:"p"},"true"),", ",(0,a.kt)("em",{parentName:"p"},"Cinder CSI")," is automatically deployed.")),(0,a.kt)("h3",{id:"ingress-and-tls"},"Ingress and TLS"),(0,a.kt)("p",null,"If you want to deploy ingress in front of Harbor and secure it with SSL/TLS certificate, set the ",(0,a.kt)("inlineCode",{parentName:"p"},"domain_name")," option.\nRelevant files which will be deployed are located in ",(0,a.kt)("inlineCode",{parentName:"p"},"terraform/files/kubernetes-manifests.d/harbor/envs/ingress/"),"."),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"When ",(0,a.kt)("inlineCode",{parentName:"p"},"domain_name")," is set, ",(0,a.kt)("inlineCode",{parentName:"p"},"cert-manager")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"ingress-nginx")," are automatically deployed.")),(0,a.kt)("p",null,"So, instead of default ",(0,a.kt)("em",{parentName:"p"},"harbor")," clusterIP service and ",(0,a.kt)("em",{parentName:"p"},"harbor-nginx")," deployment, ",(0,a.kt)("inlineCode",{parentName:"p"},"harbor-ingress")," will be deployed:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"$ kubectl get ing harbor-ingress\nNAME CLASS HOSTS ADDRESS PORTS AGE\nharbor-ingress nginx harbor.example.com 213.131.230.203.nip.io 80, 443 13m\n")),(0,a.kt)("p",null,"There will be also an additional cert-manager ",(0,a.kt)("em",{parentName:"p"},"issuer")," ",(0,a.kt)("inlineCode",{parentName:"p"},"letsencrypt")," deployed:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"$ kubectl get issuers -o wide\nNAME READY STATUS AGE\nletsencrypt True The ACME account was registered with the ACME server 13m\n")),(0,a.kt)("p",null,"This ACME issuer has an optional email field, which can be set by ",(0,a.kt)("inlineCode",{parentName:"p"},"issuer_email")," option.\nThis is recommended option because it will be used to contact you in case of issues with your account or certificates,\nincluding expiry notification emails."),(0,a.kt)("p",null,"Then, the settings can look like this:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-terraform"},'harbor_config = {\n domain_name: "harbor.example.com",\n issuer_email: "email@example.com",\n}\n')),(0,a.kt)("p",null,"After the deployment, there is one mandatory step to set up proper TLS communication with this Harbor instance.\n",(0,a.kt)("inlineCode",{parentName:"p"},"harbor-ingress")," has special annotation ",(0,a.kt)("inlineCode",{parentName:"p"},"cert-manager.io/issuer: letsencrypt")," which instructs cert-manager\nto create a certificate object:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"$ kubectl get cert -o wide\nNAME READY SECRET ISSUER STATUS AGE\nharbor-crt False harbor-crt letsencrypt Issuing certificate as Secret does not exist 13m\n")),(0,a.kt)("p",null,"The certificate is not ready, because it uses Let\u2019s Encrypt standard ACME HTTP-01 challenge.\nIn this challenge, you need to take the IP address of the ingress load balancer and create a DNS record\nfor your ",(0,a.kt)("inlineCode",{parentName:"p"},"domain_name"),". You can get an IP address (don't look on ",(0,a.kt)("em",{parentName:"p"},"nip.io")," suffix) e.g. by this command:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},'$ kubectl -n ingress-nginx get svc ingress-nginx-controller -o jsonpath=\'{.status.loadBalancer.ingress}\'\n[{"hostname":"213.131.230.203.nip.io"}]\n')),(0,a.kt)("p",null,"And after a while, your cert is ready, and you can access harbor at ",(0,a.kt)("a",{parentName:"p",href:"https://harbor.example.com/"},"https://harbor.example.com/"),":"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"$ kubectl get cert -o wide\nNAME READY SECRET ISSUER STATUS AGE\nharbor-crt True harbor-crt letsencrypt Certificate is up to date and has not expired 18m\n")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5830dd0a.62787c53.js b/assets/js/5830dd0a.62787c53.js new file mode 100644 index 0000000000..868de3fe8d --- /dev/null +++ b/assets/js/5830dd0a.62787c53.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8679],{3905:(t,a,e)=>{e.d(a,{Zo:()=>p,kt:()=>c});var r=e(67294);function n(t,a,e){return a in t?Object.defineProperty(t,a,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[a]=e,t}function l(t,a){var e=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);a&&(r=r.filter((function(a){return Object.getOwnPropertyDescriptor(t,a).enumerable}))),e.push.apply(e,r)}return e}function d(t){for(var a=1;a=0||(n[e]=t[e]);return n}(t,a);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(t,e)&&(n[e]=t[e])}return n}var s=r.createContext({}),o=function(t){var a=r.useContext(s),e=a;return t&&(e="function"==typeof t?t(a):d(d({},a),t)),e},p=function(t){var a=o(t.components);return r.createElement(s.Provider,{value:a},t.children)},m="mdxType",u={inlineCode:"code",wrapper:function(t){var a=t.children;return r.createElement(r.Fragment,{},a)}},k=r.forwardRef((function(t,a){var e=t.components,n=t.mdxType,l=t.originalType,s=t.parentName,p=i(t,["components","mdxType","originalType","parentName"]),m=o(e),k=n,c=m["".concat(s,".").concat(k)]||m[k]||u[k]||l;return e?r.createElement(c,d(d({ref:a},p),{},{components:e})):r.createElement(c,d({ref:a},p))}));function c(t,a){var e=arguments,n=a&&a.mdxType;if("string"==typeof t||n){var l=e.length,d=new Array(l);d[0]=k;var i={};for(var s in a)hasOwnProperty.call(a,s)&&(i[s]=a[s]);i.originalType=t,i[m]="string"==typeof t?t:n,d[1]=i;for(var o=2;o{e.r(a),e.d(a,{assets:()=>s,contentTitle:()=>d,default:()=>u,frontMatter:()=>l,metadata:()=>i,toc:()=>o});var r=e(87462),n=(e(67294),e(3905));const l={},d="Overview",i={unversionedId:"standards/overview",id:"standards/overview",title:"Overview",description:"Standards are the core deliverable of SCS. By standardizing the open source software components of a cloud computing stack, their versions, how they are to be configured, deployed and utilized, SCS guarantees the reproducibility of a certain behavior of this technology.",source:"@site/standards/standards/overview.md",sourceDirName:"standards",slug:"/standards/overview",permalink:"/standards/standards/overview",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"standards",previous:{title:"Certification",permalink:"/standards/certification/overview"},next:{title:"Global Standards",permalink:"/standards/global/"}},s={},o=[{value:"Stabilized Standards",id:"stabilized-standards",level:2},{value:"Drafts",id:"drafts",level:2}],p={toc:o},m="wrapper";function u(t){let{components:a,...e}=t;return(0,n.kt)(m,(0,r.Z)({},p,e,{components:a,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"overview"},"Overview"),(0,n.kt)("p",null,"Standards are the core deliverable of SCS. By standardizing the open source software components of a cloud computing stack, their versions, how they are to be configured, deployed and utilized, SCS guarantees the reproducibility of a certain behavior of this technology."),(0,n.kt)("p",null,"SCS standards are discussed, developed and maintained in the community by the corresponding teams (see Track in the table below), which naturally include existing users of SCS."),(0,n.kt)("h2",{id:"stabilized-standards"},"Stabilized Standards"),(0,n.kt)("table",null,(0,n.kt)("thead",{parentName:"table"},(0,n.kt)("tr",{parentName:"thead"},(0,n.kt)("th",{parentName:"tr",align:null},"Standard"),(0,n.kt)("th",{parentName:"tr",align:null},"Track"),(0,n.kt)("th",{parentName:"tr",align:null},"State"),(0,n.kt)("th",{parentName:"tr",align:null},"Description"),(0,n.kt)("th",{parentName:"tr",align:null},"Active Versions"))),(0,n.kt)("tbody",{parentName:"table"},(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/global/scs-0001"},"SCS-0001")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/global"},"Global")),(0,n.kt)("td",{parentName:"tr",align:null},"\ud83d\udfe2 Stable"),(0,n.kt)("td",{parentName:"tr",align:null},"Sovereign Cloud Standards"),(0,n.kt)("td",{parentName:"tr",align:null},"v1")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/global/scs-0002"},"SCS-0002")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/global"},"Global")),(0,n.kt)("td",{parentName:"tr",align:null},"\ud83d\udfe2 Stable"),(0,n.kt)("td",{parentName:"tr",align:null},"Standards, Docs and Organisation"),(0,n.kt)("td",{parentName:"tr",align:null},"v2")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/iaas/scs-0100"},"SCS-0100")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/iaas"},"IaaS")),(0,n.kt)("td",{parentName:"tr",align:null},"\ud83d\udfe2 Stable"),(0,n.kt)("td",{parentName:"tr",align:null},"Flavor Naming"),(0,n.kt)("td",{parentName:"tr",align:null},"v1 (until 2023-10-31), v3")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/iaas/scs-0102"},"SCS-0102")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/iaas"},"IaaS")),(0,n.kt)("td",{parentName:"tr",align:null},"\ud83d\udfe2 Stable"),(0,n.kt)("td",{parentName:"tr",align:null},"Image Metadata"),(0,n.kt)("td",{parentName:"tr",align:null},"v1")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/kaas/scs-0210"},"SCS-0210")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/kaas"},"KaaS")),(0,n.kt)("td",{parentName:"tr",align:null},"\ud83d\udfe2 Stable"),(0,n.kt)("td",{parentName:"tr",align:null},"New Version Policy"),(0,n.kt)("td",{parentName:"tr",align:null},"v1")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/kaas/scs-0211"},"SCS-0211")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/kaas"},"KaaS")),(0,n.kt)("td",{parentName:"tr",align:null},"\ud83d\udfe2 Stable"),(0,n.kt)("td",{parentName:"tr",align:null},"Default Storage Class"),(0,n.kt)("td",{parentName:"tr",align:null},"v1")))),(0,n.kt)("h2",{id:"drafts"},"Drafts"),(0,n.kt)("table",null,(0,n.kt)("thead",{parentName:"table"},(0,n.kt)("tr",{parentName:"thead"},(0,n.kt)("th",{parentName:"tr",align:null},"Standard"),(0,n.kt)("th",{parentName:"tr",align:null},"Track"),(0,n.kt)("th",{parentName:"tr",align:null},"State"),(0,n.kt)("th",{parentName:"tr",align:null},"Description"),(0,n.kt)("th",{parentName:"tr",align:null},"Active Versions"))),(0,n.kt)("tbody",{parentName:"table"},(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/global/scs-0003"},"SCS-0003")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/global"},"Global")),(0,n.kt)("td",{parentName:"tr",align:null},"\ud83d\udfe0 Draft"),(0,n.kt)("td",{parentName:"tr",align:null},"Sovereign Cloud Standards YAML"),(0,n.kt)("td",{parentName:"tr",align:null},"-")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/iaas/scs-0101"},"SCS-0101")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/iaas"},"IaaS")),(0,n.kt)("td",{parentName:"tr",align:null},"\ud83d\udfe0 Draft"),(0,n.kt)("td",{parentName:"tr",align:null},"Entropy"),(0,n.kt)("td",{parentName:"tr",align:null},"-")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/iaas/scs-0103"},"SCS-0103")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/iaas"},"IaaS")),(0,n.kt)("td",{parentName:"tr",align:null},"\ud83d\udfe0 Draft"),(0,n.kt)("td",{parentName:"tr",align:null},"Standard Flavors"),(0,n.kt)("td",{parentName:"tr",align:null},"-")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/iaas/scs-0104"},"SCS-0104")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/iaas"},"IaaS")),(0,n.kt)("td",{parentName:"tr",align:null},"\ud83d\udfe0 Draft"),(0,n.kt)("td",{parentName:"tr",align:null},"Standard Images"),(0,n.kt)("td",{parentName:"tr",align:null},"-")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/iam/scs-0300"},"SCS-0300")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/iam"},"IAM")),(0,n.kt)("td",{parentName:"tr",align:null},"\ud83d\udfe0 Draft"),(0,n.kt)("td",{parentName:"tr",align:null},"Requirements for SSO identity federation"),(0,n.kt)("td",{parentName:"tr",align:null},"-")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/ops/scs-0412"},"SCS-0412")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/ops"},"Ops")),(0,n.kt)("td",{parentName:"tr",align:null},"\ud83d\udfe0 Draft"),(0,n.kt)("td",{parentName:"tr",align:null},"Exposition of IaaS metering data as JSON"),(0,n.kt)("td",{parentName:"tr",align:null},"-")))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/589280f5.5bb03a5e.js b/assets/js/589280f5.5bb03a5e.js new file mode 100644 index 0000000000..2dfd7a076f --- /dev/null +++ b/assets/js/589280f5.5bb03a5e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1006],{3905:(e,r,t)=>{t.d(r,{Zo:()=>c,kt:()=>b});var n=t(67294);function a(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function o(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function i(e){for(var r=1;r=0||(a[t]=e[t]);return a}(e,r);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var s=n.createContext({}),p=function(e){var r=n.useContext(s),t=r;return e&&(t="function"==typeof e?e(r):i(i({},r),e)),t},c=function(e){var r=p(e.components);return n.createElement(s.Provider,{value:r},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},m=n.forwardRef((function(e,r){var t=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=p(t),m=a,b=u["".concat(s,".").concat(m)]||u[m]||d[m]||o;return t?n.createElement(b,i(i({ref:r},c),{},{components:t})):n.createElement(b,i({ref:r},c))}));function b(e,r){var t=arguments,a=r&&r.mdxType;if("string"==typeof e||a){var o=t.length,i=new Array(o);i[0]=m;var l={};for(var s in r)hasOwnProperty.call(r,s)&&(l[s]=r[s]);l.originalType=e,l[u]="string"==typeof e?e:a,i[1]=l;for(var p=2;p{t.r(r),t.d(r,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var n=t(87462),a=(t(67294),t(3905));const o={sidebar_label:"Infrastructure",sidebar_position:10},i="Infrastructure",l={unversionedId:"iaas/guides/deploy-guide/services/infrastructure",id:"iaas/guides/deploy-guide/services/infrastructure",title:"Infrastructure",description:"Common issues with deploying infrastructure services required by OpenStack",source:"@site/docs/02-iaas/guides/deploy-guide/services/infrastructure.md",sourceDirName:"02-iaas/guides/deploy-guide/services",slug:"/iaas/guides/deploy-guide/services/infrastructure",permalink:"/docs/iaas/guides/deploy-guide/services/infrastructure",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/deploy-guide/services/infrastructure.md",tags:[],version:"current",sidebarPosition:10,frontMatter:{sidebar_label:"Infrastructure",sidebar_position:10},sidebar:"docs",previous:{title:"Services",permalink:"/docs/iaas/guides/deploy-guide/services/"},next:{title:"Network",permalink:"/docs/iaas/guides/deploy-guide/services/network"}},s={},p=[{value:"Cron, Fluentd & Kolla Toolbox",id:"cron-fluentd--kolla-toolbox",level:2},{value:"Loadbalancer",id:"loadbalancer",level:2},{value:"Redis",id:"redis",level:2},{value:"Memcached",id:"memcached",level:2},{value:"RabbitMQ",id:"rabbitmq",level:2},{value:"MariaDB",id:"mariadb",level:2}],c={toc:p},u="wrapper";function d(e){let{components:r,...t}=e;return(0,a.kt)(u,(0,n.Z)({},c,t,{components:r,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"infrastructure"},"Infrastructure"),(0,a.kt)("p",null,"Common issues with deploying infrastructure services required by OpenStack\nare documented in the ",(0,a.kt)("a",{parentName:"p",href:"../../troubleshooting-guide/openstack"},"OpenStack Troubleshooting Guide"),"."),(0,a.kt)("h2",{id:"cron-fluentd--kolla-toolbox"},"Cron, Fluentd & Kolla Toolbox"),(0,a.kt)("p",null,"The common role of Kolla is used to manage the services ",(0,a.kt)("inlineCode",{parentName:"p"},"cron"),", ",(0,a.kt)("inlineCode",{parentName:"p"},"fluentd"),"\nand ",(0,a.kt)("inlineCode",{parentName:"p"},"kolla-toolbox"),"."),(0,a.kt)("p",null,"It is important to do this deployment before any other deployements in the Kolla\nenvironment, as parts of the other deployments depend on the ",(0,a.kt)("inlineCode",{parentName:"p"},"kolla-toolbox"),"\nservice."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"osism apply -a pull common\nosism apply common\n")),(0,a.kt)("h2",{id:"loadbalancer"},"Loadbalancer"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"osism apply -a pull loadbalancer\nosism apply loadbalancer\n")),(0,a.kt)("h2",{id:"redis"},"Redis"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"osism apply -a pull redis\nosism apply redis\n")),(0,a.kt)("h2",{id:"memcached"},"Memcached"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"osism apply -a pull memcached\nosism apply memcached\n")),(0,a.kt)("h2",{id:"rabbitmq"},"RabbitMQ"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"osism apply -a pull rabbitmq\nosism apply rabbitmq\n")),(0,a.kt)("h2",{id:"mariadb"},"MariaDB"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"osism apply -a pull mariadb\nosism apply mariadb\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/59307471.5353ba55.js b/assets/js/59307471.5353ba55.js new file mode 100644 index 0000000000..eff21f3aa6 --- /dev/null +++ b/assets/js/59307471.5353ba55.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9896],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function s(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var i=r.createContext({}),c=function(e){var t=r.useContext(i),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},f=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,s=e.originalType,i=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),d=c(a),f=n,m=d["".concat(i,".").concat(f)]||d[f]||p[f]||s;return a?r.createElement(m,o(o({ref:t},u),{},{components:a})):r.createElement(m,o({ref:t},u))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var s=a.length,o=new Array(s);o[0]=f;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l[d]="string"==typeof e?e:n,o[1]=l;for(var c=2;c{a.r(t),a.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>p,frontMatter:()=>s,metadata:()=>l,toc:()=>c});var r=a(87462),n=(a(67294),a(3905));const s={},o="SCS-0211: KaaS Default Storage Class",l={unversionedId:"kaas/scs-0211",id:"kaas/scs-0211",title:"SCS-0211: KaaS Default Storage Class",description:'The SCS-0211 standard outlines the properties required for the default StorageClass in Kubernetes as a Service (KaaS). The standard ensures that the default StorageClass, identified by the "storageclass.kubernetes.io/is-default-class" annotation, supports the ReadWriteOnce access mode and protects volume data against loss due to single disk or host hardware failures.',source:"@site/standards/kaas/scs-0211.md",sourceDirName:"kaas",slug:"/kaas/scs-0211",permalink:"/standards/kaas/scs-0211",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"standards",previous:{title:"SCS K8S Version Policy for new Kubernetes versions",permalink:"/standards/scs-0210-v1-k8s-new-version-policy"},next:{title:"SCS KaaS default storage class",permalink:"/standards/scs-0211-v1-kaas-default-storage-class"}},i={},c=[],u={toc:c},d="wrapper";function p(e){let{components:t,...a}=e;return(0,n.kt)(d,(0,r.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"scs-0211-kaas-default-storage-class"},"SCS-0211: KaaS Default Storage Class"),(0,n.kt)("p",null,'The SCS-0211 standard outlines the properties required for the default StorageClass in Kubernetes as a Service (KaaS). The standard ensures that the default StorageClass, identified by the "storageclass.kubernetes.io/is-default-class" annotation, supports the ReadWriteOnce access mode and protects volume data against loss due to single disk or host hardware failures.'),(0,n.kt)("table",null,(0,n.kt)("thead",{parentName:"table"},(0,n.kt)("tr",{parentName:"thead"},(0,n.kt)("th",{parentName:"tr",align:null},"Version"),(0,n.kt)("th",{parentName:"tr",align:null},"Type"),(0,n.kt)("th",{parentName:"tr",align:null},"State"),(0,n.kt)("th",{parentName:"tr",align:null},"stabilized"),(0,n.kt)("th",{parentName:"tr",align:null},"obsoleted"))),(0,n.kt)("tbody",{parentName:"table"},(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/scs-0211-v1-kaas-default-storage-class"},"SCS-0211-v1")),(0,n.kt)("td",{parentName:"tr",align:null},"Standard"),(0,n.kt)("td",{parentName:"tr",align:null},"\ud83d\udfe2 Stable"),(0,n.kt)("td",{parentName:"tr",align:null},"2023-02-13"),(0,n.kt)("td",{parentName:"tr",align:null},"-")))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5ad6acbd.603ce1a3.js b/assets/js/5ad6acbd.603ce1a3.js new file mode 100644 index 0000000000..f8bc34002f --- /dev/null +++ b/assets/js/5ad6acbd.603ce1a3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1156],{69128:e=>{e.exports=JSON.parse('{"title":"Decision Records","description":"Decision records within the Sovereign Cloud Stack (SCS) are critical documents that outline the reasoning and determinations made leading to the development of specific standards. They encapsulate the discussions, evaluations, and considerations of various options and alternatives before a final decision is made. These records serve as a transparent and accessible historical account, offering insights into the contextual factors and rationale that underpin each established standard.","slug":"decision-records","permalink":"/standards/decision-records","navigation":{"previous":{"title":"Exposition of IaaS metering data as JSON","permalink":"/standards/scs-0412-v1-metering-json"},"next":{"title":"SCS-0110","permalink":"/standards/scs-0110"}}}')}}]); \ No newline at end of file diff --git a/assets/js/5b235e06.ed305ad4.js b/assets/js/5b235e06.ed305ad4.js new file mode 100644 index 0000000000..b86fdd1b9f --- /dev/null +++ b/assets/js/5b235e06.ed305ad4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[972],{3905:(e,t,r)=>{r.d(t,{Zo:()=>l,kt:()=>h});var o=r(67294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function s(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var u=o.createContext({}),c=function(e){var t=o.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},l=function(e){var t=c(e.components);return o.createElement(u.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},b=o.forwardRef((function(e,t){var r=e.components,i=e.mdxType,n=e.originalType,u=e.parentName,l=a(e,["components","mdxType","originalType","parentName"]),d=c(r),b=i,h=d["".concat(u,".").concat(b)]||d[b]||p[b]||n;return r?o.createElement(h,s(s({ref:t},l),{},{components:r})):o.createElement(h,s({ref:t},l))}));function h(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var n=r.length,s=new Array(n);s[0]=b;var a={};for(var u in t)hasOwnProperty.call(t,u)&&(a[u]=t[u]);a.originalType=e,a[d]="string"==typeof e?e:i,s[1]=a;for(var c=2;c{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>p,frontMatter:()=>n,metadata:()=>a,toc:()=>c});var o=r(87462),i=(r(67294),r(3905));const n={sidebar_label:"Contributor Guide",sidebar_position:80},s="Contributor Guide",a={unversionedId:"iaas/guides/other-guides/contributor-guide",id:"iaas/guides/other-guides/contributor-guide",title:"Contributor Guide",description:"We welcome any issues, change requests or general feedback. Do not hestiate to open an issue.",source:"@site/docs/02-iaas/guides/other-guides/contributor-guide.md",sourceDirName:"02-iaas/guides/other-guides",slug:"/iaas/guides/other-guides/contributor-guide",permalink:"/docs/iaas/guides/other-guides/contributor-guide",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/other-guides/contributor-guide.md",tags:[],version:"current",sidebarPosition:80,frontMatter:{sidebar_label:"Contributor Guide",sidebar_position:80},sidebar:"docs",previous:{title:"Other Guides",permalink:"/docs/iaas/guides/other-guides/"},next:{title:"Developer Guide",permalink:"/docs/iaas/guides/other-guides/developer-guide/"}},u={},c=[],l={toc:c},d="wrapper";function p(e){let{components:t,...r}=e;return(0,i.kt)(d,(0,o.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"contributor-guide"},"Contributor Guide"),(0,i.kt)("p",null,"We welcome any issues, change requests or general feedback. Do not hestiate to ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/osism/issues/issues/new"},"open an issue"),"."),(0,i.kt)("p",null,"We use GitHub Issues to capture feature requests, feedback, bugs, etc. The tracker is available in the\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/osism/issues/issues"},"osism/issues")," repository. There are no specific requirements for the creation of an issue.\nError cases should be described in such a way that they are directly reproducible. The more outputs there are,\nthe better."),(0,i.kt)("p",null,"We use GitHub pull requests for contributions. The use of pull requets is documented in the\nofficial ",(0,i.kt)("a",{parentName:"p",href:"https://docs.github.com/en/github/collaborating-with-pull-requests"},"GitHub documentation"),".\nThe process in detail for the creation of a fork, branch etc. is also documented in the\nofficial ",(0,i.kt)("a",{parentName:"p",href:"https://docs.github.com/en/github/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests"},"GitHub documentation"),".\nIt is recommended to use the ",(0,i.kt)("a",{parentName:"p",href:"https://cli.github.com"},"GitHub CLI"),". Makes many steps easier."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5b402526.4c477e61.js b/assets/js/5b402526.4c477e61.js new file mode 100644 index 0000000000..888dda97d9 --- /dev/null +++ b/assets/js/5b402526.4c477e61.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1548],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>f});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=r.createContext({}),l=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=l(e.components);return r.createElement(c.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),u=l(n),m=a,f=u["".concat(c,".").concat(m)]||u[m]||p[m]||o;return n?r.createElement(f,i(i({ref:t},d),{},{components:n})):r.createElement(f,i({ref:t},d))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[u]="string"==typeof e?e:a,i[1]=s;for(var l=2;l{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var r=n(87462),a=(n(67294),n(3905));const o={title:"Standards, Docs and Organisation",type:"Procedural",status:"Stable",stabilized_at:new Date("2023-02-06T00:00:00.000Z"),track:"Global"},i=void 0,s={unversionedId:"scs-0002-v1-standards-docs-org",id:"scs-0002-v1-standards-docs-org",title:"Standards, Docs and Organisation",description:"Introduction",source:"@site/standards/scs-0002-v1-standards-docs-org.md",sourceDirName:".",slug:"/scs-0002-v1-standards-docs-org",permalink:"/standards/scs-0002-v1-standards-docs-org",draft:!1,tags:[],version:"current",frontMatter:{title:"Standards, Docs and Organisation",type:"Procedural",status:"Stable",stabilized_at:"2023-02-06T00:00:00.000Z",track:"Global"},sidebar:"standards",previous:{title:"SCS-0002: Org & Docs Standards",permalink:"/standards/global/scs-0002"},next:{title:"SCS Documentation structure",permalink:"/standards/scs-0002-v2-standards-docs-org"}},c={},l=[{value:"Introduction",id:"introduction",level:2},{value:"Motivation",id:"motivation",level:2},{value:"Suggested cleanup (step 1)",id:"suggested-cleanup-step-1",level:2}],d={toc:l},u="wrapper";function p(e){let{components:t,...n}=e;return(0,a.kt)(u,(0,r.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"introduction"},"Introduction"),(0,a.kt)("p",null,"The old Docs repository had a subdirectory ",(0,a.kt)("inlineCode",{parentName:"p"},"Design-Docs/")," which holds Docs on\nDesign Considerations, older Architecture Decision Records (ADRs) and even\nStandards. It also has a ",(0,a.kt)("inlineCode",{parentName:"p"},"Design-Docs/tools/")," subdirectory with conformance\nchecks and our overall conformance check driver (from PR#182)."),(0,a.kt)("h2",{id:"motivation"},"Motivation"),(0,a.kt)("p",null,"This directory structure is confusing in a number of ways:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"The conformance checks are hard to find."),(0,a.kt)("li",{parentName:"ul"},"The mixture of document types requires searching at two or three places.")),(0,a.kt)("p",null,"We want to improve this (while avoiding unnecessary churn)."),(0,a.kt)("h2",{id:"suggested-cleanup-step-1"},"Suggested cleanup (step 1)"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Move ",(0,a.kt)("inlineCode",{parentName:"li"},"Design-Docs/tools/")," contents to ",(0,a.kt)("inlineCode",{parentName:"li"},"Tests/"),(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Also create subdirectories then for layers and test, while the overall\nconformance check tool, certification specs and README remain in ",(0,a.kt)("inlineCode",{parentName:"li"},"Tests/"),"."))),(0,a.kt)("li",{parentName:"ul"},"Rename ",(0,a.kt)("inlineCode",{parentName:"li"},"Design-Docs/")," to ",(0,a.kt)("inlineCode",{parentName:"li"},"Drafts/"),".",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Use individual PRs to rewrite existing ADRs and Standards there to conform\nto our standards and move them over to ",(0,a.kt)("inlineCode",{parentName:"li"},"Standards/"),".")))),(0,a.kt)("p",null,"Some documents with findings will remain in the ",(0,a.kt)("inlineCode",{parentName:"p"},"Drafts")," directory.\nWe may want to categorize these and have a folder e.g. for research results."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5b9bf978.423a0463.js b/assets/js/5b9bf978.423a0463.js new file mode 100644 index 0000000000..939bd7b880 --- /dev/null +++ b/assets/js/5b9bf978.423a0463.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2114],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>g});var n=r(67294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var c=n.createContext({}),l=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},u=function(e){var t=l(e.components);return n.createElement(c.Provider,{value:t},e.children)},d="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},p=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,o=e.originalType,c=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),d=l(r),p=i,g=d["".concat(c,".").concat(p)]||d[p]||f[p]||o;return r?n.createElement(g,a(a({ref:t},u),{},{components:r})):n.createElement(g,a({ref:t},u))}));function g(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=r.length,a=new Array(o);a[0]=p;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[d]="string"==typeof e?e:i,a[1]=s;for(var l=2;l{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>f,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var n=r(87462),i=(r(67294),r(3905));const o={sidebar_label:"Self-signed certificates",sidebar_position:100},a="Self-signed certificates",s={unversionedId:"iaas/guides/configuration-guide/self-signed-certificates",id:"iaas/guides/configuration-guide/self-signed-certificates",title:"Self-signed certificates",description:"OpenStack",source:"@site/docs/02-iaas/guides/configuration-guide/self-signed-certificates.md",sourceDirName:"02-iaas/guides/configuration-guide",slug:"/iaas/guides/configuration-guide/self-signed-certificates",permalink:"/docs/iaas/guides/configuration-guide/self-signed-certificates",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/configuration-guide/self-signed-certificates.md",tags:[],version:"current",sidebarPosition:100,frontMatter:{sidebar_label:"Self-signed certificates",sidebar_position:100},sidebar:"docs",previous:{title:"Proxy",permalink:"/docs/iaas/guides/configuration-guide/proxy"},next:{title:"Operations Guide",permalink:"/docs/iaas/guides/operations-guide/"}},c={},l=[{value:"OpenStack",id:"openstack",level:2},{value:"Horizon",id:"horizon",level:3}],u={toc:l},d="wrapper";function f(e){let{components:t,...r}=e;return(0,i.kt)(d,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"self-signed-certificates"},"Self-signed certificates"),(0,i.kt)("h2",{id:"openstack"},"OpenStack"),(0,i.kt)("h3",{id:"horizon"},"Horizon"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-python",metastring:'title="environments/kolla/files/overlays/horizon/custom_local_settings"',title:'"environments/kolla/files/overlays/horizon/custom_local_settings"'},"OPENSTACK_SSL_NO_VERIFY = True\n")))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5bd7bc3b.6f984540.js b/assets/js/5bd7bc3b.6f984540.js new file mode 100644 index 0000000000..3bac50d200 --- /dev/null +++ b/assets/js/5bd7bc3b.6f984540.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1770],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>f});var i=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=i.createContext({}),c=function(e){var t=i.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},d=function(e){var t=c(e.components);return i.createElement(l.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},m=i.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),p=c(n),m=r,f=p["".concat(l,".").concat(m)]||p[m]||u[m]||a;return n?i.createElement(f,o(o({ref:t},d),{},{components:n})):i.createElement(f,o({ref:t},d))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,o=new Array(a);o[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:r,o[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var i=n(87462),r=(n(67294),n(3905));const a={sidebar_label:"Operations Guide",sidebar_position:30},o="Operations Guide",s={unversionedId:"iaas/guides/operations-guide/index",id:"iaas/guides/operations-guide/index",title:"Operations Guide",description:"Node states",source:"@site/docs/02-iaas/guides/operations-guide/index.md",sourceDirName:"02-iaas/guides/operations-guide",slug:"/iaas/guides/operations-guide/",permalink:"/docs/iaas/guides/operations-guide/",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/operations-guide/index.md",tags:[],version:"current",sidebarPosition:30,frontMatter:{sidebar_label:"Operations Guide",sidebar_position:30},sidebar:"docs",previous:{title:"Self-signed certificates",permalink:"/docs/iaas/guides/configuration-guide/self-signed-certificates"},next:{title:"Manager",permalink:"/docs/iaas/guides/operations-guide/manager/"}},l={},c=[{value:"Node states",id:"node-states",level:2},{value:"Maintenance",id:"maintenance",level:3},{value:"Bootstrap",id:"bootstrap",level:3}],d={toc:c},p="wrapper";function u(e){let{components:t,...n}=e;return(0,r.kt)(p,(0,i.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"operations-guide"},"Operations Guide"),(0,r.kt)("h2",{id:"node-states"},"Node states"),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"This feature is currently under development and it is only usable with latest.")),(0,r.kt)("p",null,"A node can be in different states. Depending on the state, different actions\nare possible or are triggered."),(0,r.kt)("p",null,"The individual states of a node can be retrieved via Ansible Facts and local\nfiles on the node itself."),(0,r.kt)("h3",{id:"maintenance"},"Maintenance"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"osism set maintenance NODE\nosism noset maintenance NODE\n")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Ansible fact: ",(0,r.kt)("inlineCode",{parentName:"li"},"ansible_local.osism.maintenance")),(0,r.kt)("li",{parentName:"ul"},"State file: ",(0,r.kt)("inlineCode",{parentName:"li"},"/etc/osism/maintenance"))),(0,r.kt)("h3",{id:"bootstrap"},"Bootstrap"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"osism set bootstrap NODE\nosism noset bootstrap NODE\n")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Ansible fact: ",(0,r.kt)("inlineCode",{parentName:"li"},"ansible_local.osism.bootstrap")),(0,r.kt)("li",{parentName:"ul"},"State file: ",(0,r.kt)("inlineCode",{parentName:"li"},"/etc/osism/bootstrap"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5c201b0a.9f1a2f88.js b/assets/js/5c201b0a.9f1a2f88.js new file mode 100644 index 0000000000..01eee38d24 --- /dev/null +++ b/assets/js/5c201b0a.9f1a2f88.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1893],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function s(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var l=n.createContext({}),p=function(e){var t=n.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):s(s({},t),e)),a},d=function(e){var t=p(e.components);return n.createElement(l.Provider,{value:t},e.children)},c="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),c=p(a),m=r,h=c["".concat(l,".").concat(m)]||c[m]||u[m]||o;return a?n.createElement(h,s(s({ref:t},d),{},{components:a})):n.createElement(h,s({ref:t},d))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,s=new Array(o);s[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[c]="string"==typeof e?e:r,s[1]=i;for(var p=2;p{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var n=a(87462),r=(a(67294),a(3905));const o={},s="Release Notes for SCS Release 3",i={unversionedId:"releases/Release3",id:"releases/Release3",title:"Release Notes for SCS Release 3",description:"(Release Date: 2022-09-21)",source:"@site/docs/06-releases/Release3.md",sourceDirName:"06-releases",slug:"/releases/Release3",permalink:"/docs/releases/Release3",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/06-releases/Release3.md",tags:[],version:"current",frontMatter:{},sidebar:"docs",previous:{title:"Release Notes for SCS Release 2",permalink:"/docs/releases/Release2"},next:{title:"Release Notes for SCS Release 4",permalink:"/docs/releases/Release4"}},l={},p=[{value:"Scope",id:"scope",level:2},{value:"Component Versions and User-visible improvements (highlights)",id:"component-versions-and-user-visible-improvements-highlights",level:2},{value:"New Features (Highlights)",id:"new-features-highlights",level:2},{value:"Operator focused improvements",id:"operator-focused-improvements",level:3},{value:"SCS Developer focused improvements (testbed and k8s cluster management)",id:"scs-developer-focused-improvements-testbed-and-k8s-cluster-management",level:3},{value:"Upgrade/Migration notes",id:"upgrademigration-notes",level:2},{value:"Cluster Management",id:"cluster-management",level:3},{value:"OSISM",id:"osism",level:3},{value:"Removals",id:"removals",level:2},{value:"Deprecations",id:"deprecations",level:2},{value:"Security Fixes",id:"security-fixes",level:2},{value:"Resolved Issues",id:"resolved-issues",level:2},{value:"Standards Conformance",id:"standards-conformance",level:2},{value:"Release Tagging",id:"release-tagging",level:2},{value:"List of known issues & restrictions in R3",id:"list-of-known-issues--restrictions-in-r3",level:2},{value:"Contributing",id:"contributing",level:2},{value:"Thanks",id:"thanks",level:2}],d={toc:p},c="wrapper";function u(e){let{components:t,...a}=e;return(0,r.kt)(c,(0,n.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"release-notes-for-scs-release-3"},"Release Notes for SCS Release 3"),(0,r.kt)("p",null,"(Release Date: 2022-09-21)"),(0,r.kt)("h2",{id:"scope"},"Scope"),(0,r.kt)("p",null,"Main goals for Release 3 (R3) were user federation, increase in deployment and upgrade\nvelocity by improving automated test coverage as well as bringing disk encryption based on\ntang from the state of a technical preview to be fully supported."),(0,r.kt)("h2",{id:"component-versions-and-user-visible-improvements-highlights"},"Component Versions and User-visible improvements (highlights)"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We support the latest ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.25.md"},"Kubernetes 1.25"),"\nreleases."),(0,r.kt)("li",{parentName:"ul"},"The Kubernetes Cluster API is now available in a stable v1beta1\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/kubernetes-sigs/cluster-api/releases"},"release 1.2.x"),"\nwith the corresponding ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/kubernetes-sigs/cluster-api/releases"},"cluster-api-provider-openstack 0.6.x"),"."),(0,r.kt)("li",{parentName:"ul"},"The ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/SovereignCloudStack/k8s-cluster-api-provider/"},"Kubernetes Cluster API cluster management service"),"\nhas seen major managability improvements.\nPlease consult the\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/SovereignCloudStack/k8s-cluster-api-provider/blob/main/Release-Notes-R3.md"},"k8s cluster api provider release notes"),"\nfor more details."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://releases.openstack.org/yoga/highlights.html"},"OpenStack Yoga release")),(0,r.kt)("li",{parentName:"ul"},"Ceph Quincy is available, the default release of Ceph is still Pacific."),(0,r.kt)("li",{parentName:"ul"},"The base infrastructure is provided by\n",(0,r.kt)("a",{parentName:"li",href:"https://release.osism.tech/notes/4.0.0.html"},"OSISM 4.0.0"),"\nwhich in turn builds on top of kolla and kolla-ansible."),(0,r.kt)("li",{parentName:"ul"},"Disk encryption based on Network bound disk encryption (NBDE) is available.")),(0,r.kt)("h2",{id:"new-features-highlights"},"New Features (Highlights)"),(0,r.kt)("h3",{id:"operator-focused-improvements"},"Operator focused improvements"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Work is underway to supersede ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/openstack-health-monitor"},"openstack-health-monitor"),"\nwith a comprehensive approach using scenarios with ansible playbooks\nthat has been developed and used by T-Systems for their Open Telekom Cloud.\nMeanwhile, openstack-health-monitor has seen the addition of data\ncollection with telegraf and influxdb as well as a good dashboard\nwith grafana.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We have used our keystone to keycloak federation to use keycloak as identity\nbroker to federate identities from other (SCS) clouds' keycloaks.\nThis works well for the Web-Interface; we have still some work to do to also make it smooth\nalso for API/CLI usage. We have ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Design-Docs/IAM-federation/keystone-keycloak-federation.md"},"documented the current status"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We believe that Gaia-X self-descriptions should also contain a description of\ntechnical properties of services; higher-level services and workloads can than\ndeclare their requirements and be matched against lower level services / platforms.\nIn good platforms, most (or all) technical properties are discoverable. In the\nGaia-X Hackathon #4, we have worked on a demonstrator that characterizes some\naspects of an OpenStack-based IaaS platform and which produces self-descriptions\nthat can be submitted to the Gaia-X trust service, pass the tests and you can\nbe awared a verifiable credential. Code is available in the\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/gx-self-description-generator"},"gx-self-description-generator repo")))),(0,r.kt)("h3",{id:"scs-developer-focused-improvements-testbed-and-k8s-cluster-management"},"SCS Developer focused improvements (testbed and k8s cluster management)"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Following significant discussions on how to standardize our cluster management solution,\nthere is a draft concept as part of R3 now, which will be further worked on during\nthe R4 cycle. See ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/k8s-cluster-api-provider/blob/main/Release-Notes-R3.md#cluster-standardization"},"Cluster standardization"),"\nsection of the release notes from k8s-cluster-api-provider.\nWhile our reference implementation uses the concepts and code from k8s cluster API on\ntop of our SCS reference implementation (OpenStack automated by OSISM), we want to\nassure that non-OpenStack IaaS and solutions that diverge from cluster-API have the possibility\nto be SCS compliant.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Workload clusters managed by our SCS cluster management solutions can now much\nmore easily receive k8s version upgrades, ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/k8s-cluster-api-provider/blob/main/Release-Notes-R3.md#simplified-rolling-node-upgrades-223"},"as the cluster-template no longer needs\nto be touched for this"),". There is an ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/k8s-cluster-api-provider/blob/main/doc/Upgrade-Guide.md"},"Upgrade Guide")," available now.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"LUKS encryption is now documented and enabled in the testbed by default.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Further noteworthy improvements to testbed:"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Public DNS for testbed is now available (",(0,r.kt)("inlineCode",{parentName:"li"},"testbed.osism.xyz"),"), allowing to access services\nvia TLS protected by a wildcard CA certificate."),(0,r.kt)("li",{parentName:"ul"},"The wireguard VPN service is deployed in the testbed by default.")))),(0,r.kt)("p",null,"An overview over the used software versions is available from the\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/osism/release"},"OSISM release")," repository as input\nfor a complete SBOM. This allows to e.g. investigate the contents of the\nused (v4.0.0) images."),(0,r.kt)("h2",{id:"upgrademigration-notes"},"Upgrade/Migration notes"),(0,r.kt)("h3",{id:"cluster-management"},"Cluster Management"),(0,r.kt)("p",null,"Upgrade from R2 to R3 for cluster management and clusters:\nSee ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/k8s-cluster-api-provider/blob/main/Release-Notes-R3.md#incompatible-changes"},"k8s-cluster-api-provider Release Notes"),"\nfor more details. There is an Upgrade Guide written specifically to address the steps needed for upgrading\nyour cluster management and the workload clusters."),(0,r.kt)("h3",{id:"osism"},"OSISM"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"In ",(0,r.kt)("inlineCode",{parentName:"p"},"environments/kolla/secrets.yml")," the parameter ",(0,r.kt)("inlineCode",{parentName:"p"},"neutron_ssh_key")," must be\nadded."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"neutron_ssh_key:\n private_key:\n public_key:\n")),(0,r.kt)("p",{parentName:"li"},"The ssh key can be generated as follows: ",(0,r.kt)("inlineCode",{parentName:"p"},'ssh-keygen -t rsa -b 4096 -N "" -f id_rsa.neutron -C "" -m PEM')))),(0,r.kt)("h2",{id:"removals"},"Removals"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The Cockpit service has been removed.")),(0,r.kt)("h2",{id:"deprecations"},"Deprecations"),(0,r.kt)("p",null,"Deprecations happen according to our ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Design-Docs/Release-Policies.md#deprecation"},"deprecation policy"),"."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Linux bridge support has been deprecated by the Neutron team and marked as experimental.\nIf Linux bridge is used in deployments, migrating to OpenVSwitch is recommended."),(0,r.kt)("li",{parentName:"ul"},"Debian dropped hddtemp (",(0,r.kt)("a",{parentName:"li",href:"https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1002484"},"https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1002484"),"),\ntherefore the ",(0,r.kt)("inlineCode",{parentName:"li"},"hddtemp")," service will be removed from the next OSISM release, as there is\nno package available for Ubuntu 22.04."),(0,r.kt)("li",{parentName:"ul"},"Heat will no longer be offered by default in the testbed in the future"),(0,r.kt)("li",{parentName:"ul"},"The following services are currently not used and are deprecated and scheduled for removal as of now: Falco, Jenkins, Rundeck, Lynis, Trivy"),(0,r.kt)("li",{parentName:"ul"},"The docker-compose CLI will be removed and replaced by the new compose plugin for Docker.\ndocker-compose is then no longer available and docker compose must be used instead"),(0,r.kt)("li",{parentName:"ul"},"The ",(0,r.kt)("inlineCode",{parentName:"li"},"cleanup-elasticsearch")," playbook is deprecated. In the future,\nthe ",(0,r.kt)("inlineCode",{parentName:"li"},"elasticsearch-curator")," service (part of Kolla) has to be used\nfor Elasticsearch cleanup."),(0,r.kt)("li",{parentName:"ul"},"All osism- scripts on the manager are deprecated and will be replaced by the new OSISM CLI. The scripts will be removed in the next release")),(0,r.kt)("h2",{id:"security-fixes"},"Security Fixes"),(0,r.kt)("p",null,"No severe security issues need to be highlighted since Release 2. However, by updating to the latest stable version of\nthe integrated open source components, we benefit from the upstream security fixes and thus recommend to upgrade all\nSCS environments. Please note that Release 2 maintenance by the SCS project team will end by the end of October."),(0,r.kt)("h2",{id:"resolved-issues"},"Resolved Issues"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Certificates in k8s clusters are subject to expiration - typically after one year.\nWe ensure these are renewed on control-plane upgrades, but operators may need manual attention\nin case upgrades are not performed for extended periods of time. This is documented in\nthe k8s-cluster-api-provider's\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/SovereignCloudStack/k8s-cluster-api-provider/blob/main/doc/Maintenance_and_Troubleshooting.md"},"Maintenance and Troubleshooting Guide"),".")),(0,r.kt)("h2",{id:"standards-conformance"},"Standards Conformance"),(0,r.kt)("p",null,"The clusters created with our cluster-API cluster management solution pass\nthe ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Design-Docs/Image-Properties-Spec.md"},"CNCF conformance tests"),"\nas reported by ",(0,r.kt)("a",{parentName:"p",href:"https://sonobuoy.io/"},"sonobuoy"),"."),(0,r.kt)("p",null,"The ",(0,r.kt)("a",{parentName:"p",href:"https://openstack.org/"},"OpenStack")," layer passes the\n",(0,r.kt)("a",{parentName:"p",href:"https://openinfra.dev/"},"OIF")," trademark tests, so cloud providers\nleveraging the stack should easily be able to achieve the\n",(0,r.kt)("a",{parentName:"p",href:"https://www.openstack.org/brand/interop/"},'"OpenStack powered compute"'),"\ntrademark certification."),(0,r.kt)("p",null,"Our partner plusserver has ",(0,r.kt)("a",{parentName:"p",href:"https://www.openstack.org/brand/interop/"},"achieved"),"\na ",(0,r.kt)("a",{parentName:"p",href:"https://www.bsi.bund.de/EN/Themen/Unternehmen-und-Organisationen/Informationen-und-Empfehlungen/Empfehlungen-nach-Angriffszielen/Cloud-Computing/Kriterienkatalog-C5/kriterienkatalog-c5_node.html"},"BSI C5"),"\nsecurity certification for their SCS implementation pluscloud open."),(0,r.kt)("p",null,"We are working within ",(0,r.kt)("a",{parentName:"p",href:"https://gaia-x.eu/"},"Gaia-X")," to further the power\nof Gaia-X self-descriptions and are closely working with the\n",(0,r.kt)("a",{parentName:"p",href:"https://gxfs.de/"},"GXFS project"),"\nto jointly deliver a standard toolbox for Gaia-X compliant\ninfrastructure and service offerings."),(0,r.kt)("p",null,"The SCS standards for ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Design-Docs/flavor-naming.md"},"flavor naming")," and\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Design-Docs/Image-Properties-Spec.md"},"image metadata"),"\nare largely unchanged since R1. We have however\nmade progress in our reference implementation fully implementing\nthem without any further tweaks. The\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Design-Docs/tools/flavor-name-check.py"},"conformance test for the flavor naming"),"\nhas seen minor improvements; a\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Design-Docs/tools/image-md-check.py"},"conformance test for the image metadata"),"\nhas been added."),(0,r.kt)("h2",{id:"release-tagging"},"Release Tagging"),(0,r.kt)("p",null,"See ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Design-Docs/Release-Numbering-Scheme.md"},"Release Numbering scheme")," -- unchanged from R0.\nWe have added the tag ",(0,r.kt)("inlineCode",{parentName:"p"},"v4.0.0")," to the relevant repositories to designate the ",(0,r.kt)("inlineCode",{parentName:"p"},"SCS_RELEASE_R3"),"."),(0,r.kt)("p",null,"Note that we will release R4 (v5.0.0) in March 2023 and stop providing maintenance\nupdates for R3 at the end of April 2023."),(0,r.kt)("h2",{id:"list-of-known-issues--restrictions-in-r3"},"List of known issues & restrictions in R3"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Distributed Virtual Routing (DVR) is not officially supported by OSISM, not tested and not recommended.")),(0,r.kt)("h2",{id:"contributing"},"Contributing"),(0,r.kt)("p",null,"We appreciate contribution to strategy and implementation, please join\nour community -- or just leave input on the github issues and PRs.\nHave a look at our ",(0,r.kt)("a",{parentName:"p",href:"https://scs.community/contribute/"},"How to contribute page"),"."),(0,r.kt)("h2",{id:"thanks"},"Thanks"),(0,r.kt)("p",null,"The work for R3 has been done by many contributors from our community.\nWe have not collected detailed stats that would split out the individual contributor's\nand companies shares ... we may do so in the future. We are grateful to have such an\nactive and engaged community that has done so much work! Thanks to our contributors!"),(0,r.kt)("p",null,"Of course we are leveraging a huge amount of open source technology that has been\ncreated by our friends in other communities, many of which are part of the\nCNCF, Linux Foudation, OIF, and others. We participate and contribute where\nwe can and definitely want to acknowledge the great work that we build upon."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5d54de92.69868db2.js b/assets/js/5d54de92.69868db2.js new file mode 100644 index 0000000000..bff6f35535 --- /dev/null +++ b/assets/js/5d54de92.69868db2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1505],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>h});var n=a(67294);function o(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t=0||(o[a]=e[a]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(o[a]=e[a])}return o}var l=n.createContext({}),p=function(e){var t=n.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},d=function(e){var t=p(e.components);return n.createElement(l.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var a=e.components,o=e.mdxType,r=e.originalType,l=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),c=p(a),u=o,h=c["".concat(l,".").concat(u)]||c[u]||m[u]||r;return a?n.createElement(h,i(i({ref:t},d),{},{components:a})):n.createElement(h,i({ref:t},d))}));function h(e,t){var a=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=a.length,i=new Array(r);i[0]=u;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[c]="string"==typeof e?e:o,i[1]=s;for(var p=2;p{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>m,frontMatter:()=>r,metadata:()=>s,toc:()=>p});var n=a(87462),o=(a(67294),a(3905));const r={sidebar_label:"Ceph",sidebar_position:50},i="Ceph operations cheatsheet",s={unversionedId:"iaas/guides/operations-guide/ceph",id:"iaas/guides/operations-guide/ceph",title:"Ceph operations cheatsheet",description:"Where to find docs",source:"@site/docs/02-iaas/guides/operations-guide/ceph.md",sourceDirName:"02-iaas/guides/operations-guide",slug:"/iaas/guides/operations-guide/ceph",permalink:"/docs/iaas/guides/operations-guide/ceph",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/operations-guide/ceph.md",tags:[],version:"current",sidebarPosition:50,frontMatter:{sidebar_label:"Ceph",sidebar_position:50},sidebar:"docs",previous:{title:"Task",permalink:"/docs/iaas/guides/operations-guide/manager/task"},next:{title:"OpenStack",permalink:"/docs/iaas/guides/operations-guide/openstack/"}},l={},p=[{value:"Where to find docs",id:"where-to-find-docs",level:2},{value:"Advice on Ceph releases",id:"advice-on-ceph-releases",level:2},{value:"General maintenance",id:"general-maintenance",level:2},{value:"60 seconds cluster overview",id:"60-seconds-cluster-overview",level:3},{value:"Mute/Unmute a health warning",id:"muteunmute-a-health-warning",level:3},{value:"Disable/Enable (deep-)scrubbing",id:"disableenable-deep-scrubbing",level:3},{value:"Reboot a single node",id:"reboot-a-single-node",level:3},{value:"Gathering information about block devices",id:"gathering-information-about-block-devices",level:2},{value:"Enumerate typical storage devices and LVM",id:"enumerate-typical-storage-devices-and-lvm",level:3},{value:"SMART data for SATA/SAS and NVME devices",id:"smart-data-for-satasas-and-nvme-devices",level:3},{value:"Check format of a NVME device",id:"check-format-of-a-nvme-device",level:3},{value:"Format a NVME device to a different LBA format using nvme-cli",id:"format-a-nvme-device-to-a-different-lba-format-using-nvme-cli",level:3},{value:"Secure Erase a NVME drive using nvme-cli",id:"secure-erase-a-nvme-drive-using-nvme-cli",level:3},{value:"Secure Erase a SATA/SAS drive using hdparm",id:"secure-erase-a-satasas-drive-using-hdparm",level:3},{value:"OSD maintenance tasks",id:"osd-maintenance-tasks",level:2},{value:"Locate a specific OSD in the cluster",id:"locate-a-specific-osd-in-the-cluster",level:3},{value:"Get OSD metadata (global and single OSD)",id:"get-osd-metadata-global-and-single-osd",level:3},{value:"Add a new OSD using ceph-ansible",id:"add-a-new-osd-using-ceph-ansible",level:3},{value:"Remove a OSD using ceph-ansible",id:"remove-a-osd-using-ceph-ansible",level:3},{value:"Replace a defect OSD",id:"replace-a-defect-osd",level:3},{value:"Remove a single OSD node",id:"remove-a-single-osd-node",level:3},{value:"Remove an OSD (removing it completely, not reprovisioning it again) without double rebalance",id:"remove-an-osd-removing-it-completely-not-reprovisioning-it-again-without-double-rebalance",level:3},{value:"Remove an OSD (temporarily e.g. when replacing a broken disk)",id:"remove-an-osd-temporarily-eg-when-replacing-a-broken-disk",level:3},{value:"Disable backfills/recovery completely",id:"disable-backfillsrecovery-completely",level:3},{value:"Rebalance OSDs",id:"rebalance-osds",level:3},{value:"Placement Group maintenance",id:"placement-group-maintenance",level:2},{value:"Dump placement groups",id:"dump-placement-groups",level:3},{value:"Query a PG about its status",id:"query-a-pg-about-its-status",level:3},{value:"Start (deep-)scrubbing of a placement group",id:"start-deep-scrubbing-of-a-placement-group",level:3},{value:"HEALTH_WARN - Large omap objects found...",id:"health_warn---large-omap-objects-found",level:3},{value:"Instruct a PG to repair in case of scrub errors (inconsistent PG)",id:"instruct-a-pg-to-repair-in-case-of-scrub-errors-inconsistent-pg",level:3},{value:"RADOS Pool maintenance",id:"rados-pool-maintenance",level:2},{value:"Get pools and their configuration",id:"get-pools-and-their-configuration",level:3},{value:"Dump all CRUSH rules",id:"dump-all-crush-rules",level:3},{value:"Get autoscaler status",id:"get-autoscaler-status",level:3},{value:"Create a replicated pool",id:"create-a-replicated-pool",level:3},{value:"Enabling an application on a pool",id:"enabling-an-application-on-a-pool",level:3},{value:"Delete a pool",id:"delete-a-pool",level:3},{value:"Set number of PGs for a pool",id:"set-number-of-pgs-for-a-pool",level:3},{value:"Create CRUSH rules for different storage classes",id:"create-crush-rules-for-different-storage-classes",level:3},{value:"Change CRUSH rule for a pool ("move pool")",id:"change-crush-rule-for-a-pool-move-pool",level:3},{value:"Advanced topics",id:"advanced-topics",level:2},{value:"Configure and create LVM devices for ceph-ansible using OSISM",id:"configure-and-create-lvm-devices-for-ceph-ansible-using-osism",level:3},{value:"Validating Ceph using OSISM playbooks",id:"validating-ceph-using-osism-playbooks",level:3},{value:"Shutdown a Ceph cluster",id:"shutdown-a-ceph-cluster",level:3},{value:"Restart a Ceph cluster after manual shutdown",id:"restart-a-ceph-cluster-after-manual-shutdown",level:3},{value:"Where and how to get further help",id:"where-and-how-to-get-further-help",level:2}],d={toc:p},c="wrapper";function m(e){let{components:t,...a}=e;return(0,o.kt)(c,(0,n.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"ceph-operations-cheatsheet"},"Ceph operations cheatsheet"),(0,o.kt)("h2",{id:"where-to-find-docs"},"Where to find docs"),(0,o.kt)("p",null,"The official Ceph documentation is located on ",(0,o.kt)("a",{parentName:"p",href:"https://docs.ceph.com/en/latest"},"https://docs.ceph.com/en/latest")),(0,o.kt)("p",null,"It is ",(0,o.kt)("strong",{parentName:"p"},"strongly advised")," to use the documentation for the version being used."),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Pacific - ",(0,o.kt)("a",{parentName:"li",href:"https://docs.ceph.com/en/pacific"},"https://docs.ceph.com/en/pacific")),(0,o.kt)("li",{parentName:"ul"},"Quincy - ",(0,o.kt)("a",{parentName:"li",href:"https://docs.ceph.com/en/quincy"},"https://docs.ceph.com/en/quincy")),(0,o.kt)("li",{parentName:"ul"},"Reef - ",(0,o.kt)("a",{parentName:"li",href:"https://docs.ceph.com/en/reef"},"https://docs.ceph.com/en/reef"))),(0,o.kt)("p",null,"ceph-ansible documentation is located on ",(0,o.kt)("a",{parentName:"p",href:"https://docs.ceph.com/projects/ceph-ansible/en/latest/"},"https://docs.ceph.com/projects/ceph-ansible/en/latest/")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Do not take information in the documentation at face value.\nEspecially when it comes to advanced/rarely used/very new features it is ",(0,o.kt)("strong",{parentName:"p"},"strongly advised"),"\nto test any claims made in the documentation about any particular feature."),(0,o.kt)("p",{parentName:"admonition"},"Never assume that things will work as written without actually testing it on a test setup\nas close to your real workload scenario as possible.")),(0,o.kt)("h2",{id:"advice-on-ceph-releases"},"Advice on Ceph releases"),(0,o.kt)("p",null,"The current Ceph releases and their support status can be found on ",(0,o.kt)("a",{parentName:"p",href:"https://docs.ceph.com/en/latest/releases/"},"https://docs.ceph.com/en/latest/releases/")),(0,o.kt)("p",null,"When a new Ceph stable version is released you are ",(0,o.kt)("strong",{parentName:"p"},"strongly advised"),"\nto not roll it out on any production cluster whatsoever.\nEven though its listed as \"stable\" it doesn't mean that this is actually true.\nEspecially avoid using .0 releases on anything remotely production\nunless you really, really now what you're doing and can live with a possible catastrophic failure."),(0,o.kt)("p",null,"Be ",(0,o.kt)("strong",{parentName:"p"},"very")," conservative about what version you run on production systems."),(0,o.kt)("p",null,"Shiny new features aren't worth the risk of total or partial data loss/corruption."),(0,o.kt)("h2",{id:"general-maintenance"},"General maintenance"),(0,o.kt)("h3",{id:"60-seconds-cluster-overview"},"60 seconds cluster overview"),(0,o.kt)("p",null,"The following commands can be used to quickly check the status of Ceph:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"$ ceph -s # Print overall cluster status\n$ ceph health detail # Print detailed health information\n$ ceph osd tree # Display current OSD tree\n$ ceph df # Cluster storage usage by pool and storage class\n$ ceph osd pool ls detail # List pools with detailed configuration\n$ ceph osd df {plain|tree} {class e.g. hdd|ssd} # Get usage stats for OSDs\n$ ceph -w # Watch Ceph health messages sequentially\n$ ceph versions # List daemon versions running in the cluster\n")),(0,o.kt)("p",null,"Also you can run the following on each node running ceph-daemons,\nto provide further debug information about the environment:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"# lscpu\n# cat /proc/cpuinfo # if lscpu isn't available\n# free -g\n# ip l\n# ethtool # for each network adapter\n")),(0,o.kt)("h3",{id:"muteunmute-a-health-warning"},"Mute/Unmute a health warning"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"$ ceph health mute \n$ ceph health unmute \n")),(0,o.kt)("h3",{id:"disableenable-deep-scrubbing"},"Disable/Enable (deep-)scrubbing"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"$ ceph osd set noscrub\n$ ceph osd set nodeep-scrub\n$ ceph osd unset noscrub\n$ ceph osd unset nodeep-scrub\n")),(0,o.kt)("admonition",{type:"warning"},(0,o.kt)("p",{parentName:"admonition"},"Use this sparingly only in emergency situations.\nSetting these flags will cause a HEALTH_WARN status,\nincrease risk of data corruption and also the risk of generating\na HEALTH_WARN due to PGs not being (deep-)scrubbed in time.")),(0,o.kt)("h3",{id:"reboot-a-single-node"},"Reboot a single node"),(0,o.kt)("p",null,"The traditional way of doing this is by setting the ",(0,o.kt)("inlineCode",{parentName:"p"},"noout")," flag,\ndo the appropriate maintenance work and after the node is back online\nunset the flag like so:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"ceph osd set noout\n")),(0,o.kt)("p",null,"After maintenance is done and host is back up:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"ceph osd unset noout\n")),(0,o.kt)("p",null,"On versions Luminous or above you can set the flag individually for single\nOSDs or entire CRUSH buckets, which can be a safer option in case of prolonged\nmaintenance periods."),(0,o.kt)("p",null,"Add noout for a OSD:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"ceph osd add-noout osd.\n")),(0,o.kt)("p",null,"Remove noout for a OSD:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"ceph osd rm-noout osd.\n")),(0,o.kt)("p",null,"Add noout for CRUSH bucket (e.g. host name as seen in ",(0,o.kt)("inlineCode",{parentName:"p"},"ceph osd tree"),"):"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"ceph osd set-group noout \n")),(0,o.kt)("p",null,"Remove noout for CRUSH bucket:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"ceph osd unset-group noout \n")),(0,o.kt)("h2",{id:"gathering-information-about-block-devices"},"Gathering information about block devices"),(0,o.kt)("h3",{id:"enumerate-typical-storage-devices-and-lvm"},"Enumerate typical storage devices and LVM"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"# lsblk\n# lsblk -S\n# lsscsi\n# nvme list\n# pvs\n# vgs\n# lvs\n")),(0,o.kt)("h3",{id:"smart-data-for-satasas-and-nvme-devices"},"SMART data for SATA/SAS and NVME devices"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"# smartctl -a /dev/sdX\n# nvme smart-log /dev/nvmeXnY\n")),(0,o.kt)("h3",{id:"check-format-of-a-nvme-device"},"Check format of a NVME device"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"# nvme id-ns -H /dev/nvmeXnY\n")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},'Check the last lines named "LBA Format".\nIt will show which formats are supported,\nwhich format is in use and which format offers the best performance\naccording to the vendor.')),(0,o.kt)("h3",{id:"format-a-nvme-device-to-a-different-lba-format-using-nvme-cli"},"Format a NVME device to a different LBA format using nvme-cli"),(0,o.kt)("admonition",{type:"warning"},(0,o.kt)("p",{parentName:"admonition"},"This will destroy all data on the device!")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"# nvme format --lbaf= /dev/nvmeXnY\n")),(0,o.kt)("h3",{id:"secure-erase-a-nvme-drive-using-nvme-cli"},"Secure Erase a NVME drive using nvme-cli"),(0,o.kt)("admonition",{type:"warning"},(0,o.kt)("p",{parentName:"admonition"},"This will destroy all data on the device!")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"# nvme format -s2 /dev/nvmeXnY\n# blkdiscard /dev/nvmeXnY\n# nvme format -s1 /dev/nvmeXnY\n")),(0,o.kt)("h3",{id:"secure-erase-a-satasas-drive-using-hdparm"},"Secure Erase a SATA/SAS drive using hdparm"),(0,o.kt)("admonition",{type:"warning"},(0,o.kt)("p",{parentName:"admonition"},"This will destroy all data on the device!")),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Gather device info:"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"# hdparm -I /dev/sdX\n")),(0,o.kt)("p",{parentName:"li"},"Check that the output says ",(0,o.kt)("strong",{parentName:"p"},'"not frozen"')," and ",(0,o.kt)("strong",{parentName:"p"},'"not locked"'),",\nalso it should list support for enhanced erase and list time estimates\nfor ",(0,o.kt)("strong",{parentName:"p"},"SECURITY ERASE UNIT")," and/or ",(0,o.kt)("strong",{parentName:"p"},"ENHANCED SECURITY ERASE UNIT"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Set a master password for the disk (required, will be automatically removed after wipe)"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"# hdparm --user-master wipeit --security-set-pass wipeit /dev/sdX\n# hdparm -I /dev/sdX\n")),(0,o.kt)("p",{parentName:"li"},'Check that "Security level" is now ',(0,o.kt)("strong",{parentName:"p"},'"high"')," and master password is now\n",(0,o.kt)("strong",{parentName:"p"},'"enabled"')," instead of ",(0,o.kt)("strong",{parentName:"p"},'"not enabled"')," before")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Wipe the device"),(0,o.kt)("p",{parentName:"li"},"If device supports enhanced security erase (better), use the following:"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"# hdparm --user-master wipeit --security-erase-enhanced wipeit /dev/sdX\n")),(0,o.kt)("p",{parentName:"li"},"If not, use standard security erase:"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"# hdparm --user-master wipeit --security-erase wipeit /dev/sdX\n")))),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},'On some systems the system firmware might "freeze" the device,\nwhich makes it impossible to issue a secure erase or reformat the device.\nIn that case it might be necessary to either "unfreeze" the drive or\nto install the drive in another system where it can be unfrozen.\nAlso make sure that the device is ',(0,o.kt)("em",{parentName:"p"},"actually")," wiped. Its recommended to\nat least perform a blanking pass on HDDs with a tool like nwipe.")),(0,o.kt)("h2",{id:"osd-maintenance-tasks"},"OSD maintenance tasks"),(0,o.kt)("h3",{id:"locate-a-specific-osd-in-the-cluster"},"Locate a specific OSD in the cluster"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"$ ceph osd find osd.\n")),(0,o.kt)("h3",{id:"get-osd-metadata-global-and-single-osd"},"Get OSD metadata (global and single OSD)"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"$ ceph osd metadata\n$ ceph osd metadata osd.\n")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("pre",{parentName:"admonition"},(0,o.kt)("code",{parentName:"pre"}," Interesting fields:\n osd_objectstore, rotational, hostname, devices, device_ids, device_paths,\n bluefs_db_rotational, bluefs_wal_rotational,\n bluefs_dedicated_db, bluefs_dedicated_wal,\n bluestore_bdev_rotational\n"))),(0,o.kt)("h3",{id:"add-a-new-osd-using-ceph-ansible"},"Add a new OSD using ceph-ansible"),(0,o.kt)("h3",{id:"remove-a-osd-using-ceph-ansible"},"Remove a OSD using ceph-ansible"),(0,o.kt)("h3",{id:"replace-a-defect-osd"},"Replace a defect OSD"),(0,o.kt)("h3",{id:"remove-a-single-osd-node"},"Remove a single OSD node"),(0,o.kt)("h3",{id:"remove-an-osd-removing-it-completely-not-reprovisioning-it-again-without-double-rebalance"},"Remove an OSD (removing it completely, not reprovisioning it again) without double rebalance"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"$ ceph osd crush reweight osd. 0.0\n... Wait for rebalance to complete, then mark it OUT:\n$ ceph osd out osd.\n# systemctl stop ceph-osd@\n# systemctl disable ceph-osd@\n$ ceph osd purge osd. --yes-i-really-mean-it\n")),(0,o.kt)("h3",{id:"remove-an-osd-temporarily-eg-when-replacing-a-broken-disk"},"Remove an OSD (temporarily e.g. when replacing a broken disk)"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"$ ceph osd out osd.\n# systemctl stop ceph-osd@\n# systemctl disable ceph-osd@\n")),(0,o.kt)("h3",{id:"disable-backfillsrecovery-completely"},"Disable backfills/recovery completely"),(0,o.kt)("admonition",{type:"warning"},(0,o.kt)("p",{parentName:"admonition"},"Use only in emergency situations!")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"$ ceph osd set nobackfill\n$ ceph osd set norecovery\n$ ceph osd set norebalance\n")),(0,o.kt)("p",null,"Unset the flags with ",(0,o.kt)("inlineCode",{parentName:"p"},"ceph osd unset "),"."),(0,o.kt)("h3",{id:"rebalance-osds"},"Rebalance OSDs"),(0,o.kt)("h2",{id:"placement-group-maintenance"},"Placement Group maintenance"),(0,o.kt)("h3",{id:"dump-placement-groups"},"Dump placement groups"),(0,o.kt)("p",null,"Usually only useful when parsing it, so here are two ways to get the data:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"$ ceph pg dump\n$ ceph pg dump --format=json-pretty\n")),(0,o.kt)("h3",{id:"query-a-pg-about-its-status"},"Query a PG about its status"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"$ ceph pg query\n")),(0,o.kt)("h3",{id:"start-deep-scrubbing-of-a-placement-group"},"Start (deep-)scrubbing of a placement group"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"$ ceph pg scrub \n$ ceph pg deep-scrub \n")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Instructing a PG to (deep-)scrub does not mean that it will do so immediately,\nit can take some time for the scrub to start.")),(0,o.kt)("h3",{id:"health_warn---large-omap-objects-found"},"HEALTH_WARN - Large omap objects found..."),(0,o.kt)("p",null,"Finding PGs which have large OMAP objects:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"# ceph pg dump --format=json | jq '.pg_map.pg_stats[] |\nselect(.stat_sum.num_large_omap_objects != 0) |\n(.pgid, .stat_sum.num_large_omap_objects, .up, .acting)'\n")),(0,o.kt)("p",null,"(Remove the line breaks between the single quotes or ",(0,o.kt)("inlineCode",{parentName:"p"},"jq")," might act weird!)"),(0,o.kt)("p",null,"This will dump all PG IDs with large OMAP objects and their up/acting OSDs.\nYou then can grep the logs of these OSDs for ",(0,o.kt)("strong",{parentName:"p"},'"Large omap object"'),"\nto find the actual objects causing the health warning."),(0,o.kt)("p",null,"Also the PG ID before the dot is equal to the pool ID it belongs to."),(0,o.kt)("p",null,"In case the logs have been rotated, instruct those OSDs to do a deep-scrub\nand watch the logs for the message to appear."),(0,o.kt)("p",null,"From there you can investigate the issue further,\nmostly it'll be due to the index of a RGW bucket getting too big due to too many objects,\nthus resharding that bucket's index will be necessary."),(0,o.kt)("h3",{id:"instruct-a-pg-to-repair-in-case-of-scrub-errors-inconsistent-pg"},"Instruct a PG to repair in case of scrub errors (inconsistent PG)"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"$ ceph pg repair \n")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Recovery might not start immediately and might take some time.\nYou can query the status of the recovery through ",(0,o.kt)("inlineCode",{parentName:"p"},"ceph pg query"),".\nBe sure to read the Ceph manual about this topic ",(0,o.kt)("em",{parentName:"p"},"thoroughly"),":"),(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("a",{parentName:"p",href:"https://docs.ceph.com/en/latest/rados/operations/pg-repair/"},"https://docs.ceph.com/en/latest/rados/operations/pg-repair/"))),(0,o.kt)("h2",{id:"rados-pool-maintenance"},"RADOS Pool maintenance"),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Read the RADOS pool operations documentation in detail before playing around with pools.\nEspecially when considering making changes to the CRUSH map.\nWrong decisions there can lead to data loss or other catastrophic failures."),(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("a",{parentName:"p",href:"https://docs.ceph.com/en/latest/rados/operations/pools/"},"https://docs.ceph.com/en/latest/rados/operations/pools/"))),(0,o.kt)("h3",{id:"get-pools-and-their-configuration"},"Get pools and their configuration"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"$ ceph osd pool ls detail\n")),(0,o.kt)("h3",{id:"dump-all-crush-rules"},"Dump all CRUSH rules"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"$ ceph osd crush rule dump\n")),(0,o.kt)("h3",{id:"get-autoscaler-status"},"Get autoscaler status"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"$ ceph osd pool autoscale-status\n")),(0,o.kt)("h3",{id:"create-a-replicated-pool"},"Create a replicated pool"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"$ ceph osd pool create replicated []\n")),(0,o.kt)("h3",{id:"enabling-an-application-on-a-pool"},"Enabling an application on a pool"),(0,o.kt)("p",null,"Required, otherwise a health warning will be raised after some time."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"$ ceph osd pool application enable # Syntax\n$ ceph osd pool application enable cinder rbd # Example\n")),(0,o.kt)("p",null,"Typical application names are: rbd, rgw, cephfs"),(0,o.kt)("h3",{id:"delete-a-pool"},"Delete a pool"),(0,o.kt)("admonition",{type:"warning"},(0,o.kt)("p",{parentName:"admonition"},"This will delete all data in that pool. There is no undo/undelete.")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"$ ceph osd pool delete --yes-i-really-really-mean-it\n")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In order to be able to delete pools, it has to be enabled on the monitors\nby setting the ",(0,o.kt)("inlineCode",{parentName:"p"},"mon_allow_pool_delete")," flag to true. Default is false."),(0,o.kt)("p",{parentName:"admonition"},"See: ",(0,o.kt)("a",{parentName:"p",href:"https://docs.ceph.com/en/latest/rados/configuration/mon-config-ref"},"https://docs.ceph.com/en/latest/rados/configuration/mon-config-ref"))),(0,o.kt)("h3",{id:"set-number-of-pgs-for-a-pool"},"Set number of PGs for a pool"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"$ ceph osd pool set pg_num \n")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Num PGs must be a power of two! Be careful about changing number of PGs.\nChanging pg_num to a new value will gradually increase pgp_num on newer versions of Ceph."),(0,o.kt)("p",{parentName:"admonition"},"In older versions one also has to set pgp_num manually, either in increments or in one big leap.")),(0,o.kt)("h3",{id:"create-crush-rules-for-different-storage-classes"},"Create CRUSH rules for different storage classes"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"$ ceph osd crush rule create-replicated replicated_hdd default host hdd\n$ ceph osd crush rule create-replicated replicated_ssd default host ssd\n$ ceph osd crush rule create-replicated replicated_nvme default host nvme\n")),(0,o.kt)("h3",{id:"change-crush-rule-for-a-pool-move-pool"},'Change CRUSH rule for a pool ("move pool")'),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"$ ceph osd pool set crush_rule \n")),(0,o.kt)("p",null,"This can be used to move a pool from e.g. HDD to SSD or NVME class\nor anything else that the new CRUSH rule specifies."),(0,o.kt)("h2",{id:"advanced-topics"},"Advanced topics"),(0,o.kt)("h3",{id:"configure-and-create-lvm-devices-for-ceph-ansible-using-osism"},"Configure and create LVM devices for ceph-ansible using OSISM"),(0,o.kt)("p",null,"For more advanced OSD layout requirements leave out the ",(0,o.kt)("inlineCode",{parentName:"p"},"devices")," key\nand instead use ",(0,o.kt)("inlineCode",{parentName:"p"},"lvm_volumes"),"."),(0,o.kt)("p",null,"Details for this can be found on the official ",(0,o.kt)("a",{parentName:"p",href:"https://docs.ceph.com/projects/ceph-ansible/en/latest/osds/scenarios.html"},"ceph-ansible OSD Scenario")," documentation."),(0,o.kt)("p",null,"In order to aid in creating the ",(0,o.kt)("inlineCode",{parentName:"p"},"lvm_volumes")," config entries and provision the LVM devices for them,\nOSISM has the two playbooks ",(0,o.kt)("inlineCode",{parentName:"p"},"configure-lvm-devices")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"create-lvm-devices")," available."),(0,o.kt)("p",null,"Their usage is as follows:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"For each Ceph storage node edit the file ",(0,o.kt)("inlineCode",{parentName:"p"},"inventory/host_vars/.yml"),"\nadd a configuration like the following to it:"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},'ceph_osd_db_wal_devices_buffer_space_percent: 10\n# optional percentage of VGs to leave free,\n# defaults to false\n# Can be helpful for SSD performance of some older SSD models\n# or to extend lifetime of SSDs in general\n\nceph_db_devices:\n nvme0n1: # required, PV for a DB VG\n # Will be prefixed by /dev/ and can also be specified\n # like "by-path/foo" or other things under /dev/\n num_osds: 6 # required, number of OSDs that shall be\n # maximum deployed to this device\n db_size: 30 GB # optional, if not set, defaults to\n # (VG size - buffer space (if enabled)) / num_osds\nceph_wal_devices:\n nvme1n1: # See above, PV for a WAL VG\n num_osds: 6 # See above\n wal_size: 2 GB # optional, if not set, defaults to 2 GiB\n\nceph_db_wal_devices:\nnvme2n1: # See above, PV for combined WAL+DB VG\n num_osds: 3 # See above\n db_size: 30 GB # See above, except that it also considers\n # total WAL size when calculating LV sizes\n wal_size: 2 GB # See above\n\nceph_osd_devices:\n sda: # Device name, will be prefixed by /dev/, see above conventions\n # This would create a "block only" OSD without DB/WAL\n # In reality, to ensure each device is uniquely identifiable,\n # you should use WWN or EUI-64\n # (in that case the entry here would be something like \n # disk/by-id/wwn- or disk/by-id/nvme-eui.)\n sdb: # Create an OSD with dedicated DB\n db_pv: nvme0n1 # Must be one device configured in ceph_db_devices\n # or ceph_db_wal_devices\n sdc: # Create an OSD with dedicated WAL\n wal_pv: nvme1n1 # Must be one device configured in ceph_wal_devices\n # or ceph_db_wal_devices\n sdb: # Create an OSD with dedicated DB/WAL residing on different devices\n db_pv: nvme0n1 # See above\n wal_pv: nvme1n1 # See above\n sdc: # Create an OSD with dedicated DB/WAL residing on the same VG/PV\n db_pv: nvme2n1 # Must be one device configured in ceph_db_wal_devices\n wal_pv: nvme2n1 # Must be the same device configured in ceph_db_wal_devices\n'))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Push the configuration to your configuration repository and after that do the following"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"$ osism apply configuration\n$ osism apply facts\n"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"After the configuration has been pulled and facts updated,\nyou can run the LVM configuration playbook:"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"$ osism apply ceph-configure-lvm-volumes [-l INVENTORY HOST PATTERN]\n")),(0,o.kt)("p",{parentName:"li"},"This will generate a new configuration file for each node in ",(0,o.kt)("inlineCode",{parentName:"p"},"/tmp"),"\non the first manager node named ",(0,o.kt)("inlineCode",{parentName:"p"},"-ceph-lvm-configuration.yml"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Take the generated configuration file from ",(0,o.kt)("inlineCode",{parentName:"p"},"/tmp")," and ",(0,o.kt)("strong",{parentName:"p"},"replace the previously generated configuration")," for each node.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Push the updated configuration ",(0,o.kt)("strong",{parentName:"p"},"again")," to your configuration repository and re-run:"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"$ osism apply configuration\n$ osism apply facts\n"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Finally you can let OSISM create the LVM devices for you, because\n",(0,o.kt)("inlineCode",{parentName:"p"},"ceph-ansible")," will not do that. To do that you simply run:"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"$ osism apply ceph-create-lvm-devices [-l INVENTORY HOST PATTERN]\n"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Deploy OSDs with ceph-ansible"),(0,o.kt)("p",{parentName:"li"},"When everything has finished and is ready to be deployed,\nyou can run:"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"$ osism apply ceph-osds [-l INVENTORY HOST PATTERN]\n")),(0,o.kt)("p",{parentName:"li"},"This should then have ",(0,o.kt)("inlineCode",{parentName:"p"},"ceph-ansible")," create new OSDs on the node."))),(0,o.kt)("h3",{id:"validating-ceph-using-osism-playbooks"},"Validating Ceph using OSISM playbooks"),(0,o.kt)("p",null,"For Ceph, special playbooks were added to validate the deployment status of\nthe OSD, MON and MGR services. The commands for use are ",(0,o.kt)("inlineCode",{parentName:"p"},"osism validate ceph-osds"),",\n",(0,o.kt)("inlineCode",{parentName:"p"},"osism validate ceph-mons"),", and ",(0,o.kt)("inlineCode",{parentName:"p"},"osism validate ceph-mgrs"),"."),(0,o.kt)("p",null,"These playbooks will validate that the deployed Ceph environment matches\nthe configuration and is overall in a healthy state. The playbooks will\ngenerate report files in JSON format on the first manager node in ",(0,o.kt)("inlineCode",{parentName:"p"},"/opt/reports/validator"),"."),(0,o.kt)("h3",{id:"shutdown-a-ceph-cluster"},"Shutdown a Ceph cluster"),(0,o.kt)("p",null,"In order to fully shutdown a Ceph cluster safely, you first do the following steps:"),(0,o.kt)("admonition",{type:"warning"},(0,o.kt)("p",{parentName:"admonition"},"Take GOOD NOTES of the unit names and OSD IDs running on each node.\nYou will need them to restart the cluster later.")),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Stop the workload that is using the cluster"),(0,o.kt)("p",{parentName:"li"},"This will vary depending on your environment and is not covered here.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Pause/Stop operations on the cluster by setting flags"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"$ ceph osd set noout\n$ ceph osd set nobackfill\n$ ceph osd set norecover\n$ ceph osd set norebalance\n$ ceph osd set nodown\n$ ceph osd set pause\n"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Stop and disable the ",(0,o.kt)("inlineCode",{parentName:"p"},"radosgw")," services on all nodes (on each rgw node) (if RGW is used)"),(0,o.kt)("p",{parentName:"li"},"Get the name of the unit (globs not supported for disable) and\nmake a note of the unit name for that node:"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"# systemctl | grep ceph-radosgw\n")),(0,o.kt)("p",{parentName:"li"},"Then disable and stop the unit:"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"# systemctl disable --now ceph-radosgw@.service\n"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Stop all CephFS file systems (if CephFS is used)"),(0,o.kt)("p",{parentName:"li"},"List all Ceph file systems"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"$ ceph fs ls\n")),(0,o.kt)("p",{parentName:"li"},"For each CephFS do:"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"$ ceph fs down true\n"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"After that disable and stop all ",(0,o.kt)("inlineCode",{parentName:"p"},"ceph-mds")," services on all nodes (do this on each node)"),(0,o.kt)("p",{parentName:"li"},"Get the name of the unit (globs not supported for disable) and\nmake a note of the unit name for that node:"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"# systemctl | grep ceph-mds\n")),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"# systemctl disable --now ceph-mds@.service\n"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Stop and disable the ",(0,o.kt)("inlineCode",{parentName:"p"},"ceph-mgr")," services on all nodes (do this on each node)"),(0,o.kt)("p",{parentName:"li"},"Get the name of the unit (globs not supported for disable) and\nmake a note of the unit name for that node:"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"# systemctl | grep ceph-mgr\n")),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"# systemctl disable --now ceph-mgr@.service\n"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Stop and disable the ",(0,o.kt)("inlineCode",{parentName:"p"},"ceph-osd")," services on all nodes (do this on each node)"),(0,o.kt)("p",{parentName:"li"},"Get the names of the units (globs not supported for disable) and\nmake a note of the unit names for that node (best to save it to a file):"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"# systemctl | grep ceph-osd\n")),(0,o.kt)("p",{parentName:"li"},"For each OSD unit execute:"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"# systemctl disable ceph-osd@.service\n")),(0,o.kt)("p",{parentName:"li"},"Stop all OSDs at once:"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"# systemctl stop ceph-osd\\*.service\n"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Finally stop the ",(0,o.kt)("inlineCode",{parentName:"p"},"ceph-mon")," services on all nodes (do this on each node)"),(0,o.kt)("p",{parentName:"li"},"Get the name of the unit (globs not supported for disable) and\nmake a note of the unit name for that node:"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"# systemctl | grep ceph-mon\n")),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"# systemctl disable --now ceph-mon@.service\n")))),(0,o.kt)("h3",{id:"restart-a-ceph-cluster-after-manual-shutdown"},"Restart a Ceph cluster after manual shutdown"),(0,o.kt)("admonition",{type:"warning"},(0,o.kt)("p",{parentName:"admonition"},"You will need the notes taken during shutdown of the unit names.\nIt ",(0,o.kt)("strong",{parentName:"p"},"can")," be done without, but then it'll be way more work finding out the names.")),(0,o.kt)("p",null,"In order to restart a Ceph cluster after performing a manual shutdown like described\nin the section above, you do the following:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Enable & start the ",(0,o.kt)("inlineCode",{parentName:"p"},"ceph-mon")," services on all nodes (do this on each node)"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"# systemctl enable --now ceph-mon@.service\n"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Enable & start the ",(0,o.kt)("inlineCode",{parentName:"p"},"ceph-osd")," services on all nodes (do this on each node)"),(0,o.kt)("p",{parentName:"li"},"For each Ceph OSD on that node do:"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"# systemctl enable --now ceph-osd@.service\n")),(0,o.kt)("p",{parentName:"li"},"Depending on the number of OSDs on that node it can take a while.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Enable & start the ",(0,o.kt)("inlineCode",{parentName:"p"},"ceph-mgr")," services on all nodes (do this on each node)"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"# systemctl enable --now ceph-mgr@.service\n"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Check the status of your cluster and wait for all OSDs to come online"),(0,o.kt)("p",{parentName:"li"},"You can watch the status periodically by running:"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"$ watch ceph -s\n")),(0,o.kt)("p",{parentName:"li"},"You should wait until all OSDs are up + in again, before removing flags.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Remove flags to unpause operations"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"$ ceph osd unset pause\n$ ceph osd unset nodown\n$ ceph osd unset noout\n$ ceph osd unset nobackfill\n$ ceph osd unset norecover\n$ ceph osd unset norebalance\n"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Wait for cluster to resume operations"),(0,o.kt)("p",{parentName:"li"},'See step #4 of this SOP.\nNow you wait until the cluster seems "happy enough" to accept clients.\n(i.e. rebalancing finished etc.)\nMaybe it will complain about MDS being down, but that\'s normal for now.')),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Enable & start the ",(0,o.kt)("inlineCode",{parentName:"p"},"ceph-mds")," services on each node (if CephFS is used)"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"# systemctl enable --now ceph-mds@.service\n"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Start CephFS file systems again"),(0,o.kt)("p",{parentName:"li"},"List all Ceph file systems"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"$ ceph fs ls\n")),(0,o.kt)("p",{parentName:"li"},"For each CephFS do:"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"$ ceph fs down false\n"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Enable & start the ",(0,o.kt)("inlineCode",{parentName:"p"},"radosgw")," services on each node (if RGW is used)"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"# systemctl enable --now ceph-radosgw@.service\n")))),(0,o.kt)("h2",{id:"where-and-how-to-get-further-help"},"Where and how to get further help"),(0,o.kt)("p",null,"Join the ",(0,o.kt)("strong",{parentName:"p"},"#ceph")," IRC channel on ",(0,o.kt)("strong",{parentName:"p"},"irc.oftc.net"),', state the problem with as many details as possible\nincluding information about what steps have already been taken to solve the problem\nalso provide information from the command output from the "60 seconds cluster overview" above\nthrough a pastebin or a similar service. In order for people to be able\nto help, details and some patience are important.'))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6048.9ebfb35f.js b/assets/js/6048.9ebfb35f.js new file mode 100644 index 0000000000..547a038a34 --- /dev/null +++ b/assets/js/6048.9ebfb35f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6048],{39058:(e,t,a)=>{a.d(t,{Z:()=>h});var l=a(67294),r=a(86010),n=a(70179),o=a(87524),s=a(39960),i=a(95999);const m={sidebar:"sidebar_re4s",sidebarItemTitle:"sidebarItemTitle_pO2u",sidebarItemList:"sidebarItemList_Yudw",sidebarItem:"sidebarItem__DBe",sidebarItemLink:"sidebarItemLink_mo7H",sidebarItemLinkActive:"sidebarItemLinkActive_I1ZP"};function c(e){let{sidebar:t}=e;return l.createElement("aside",{className:"col col--3"},l.createElement("nav",{className:(0,r.Z)(m.sidebar,"thin-scrollbar"),"aria-label":(0,i.I)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"})},l.createElement("div",{className:(0,r.Z)(m.sidebarItemTitle,"margin-bottom--md")},t.title),l.createElement("ul",{className:(0,r.Z)(m.sidebarItemList,"clean-list")},t.items.map((e=>l.createElement("li",{key:e.permalink,className:m.sidebarItem},l.createElement(s.Z,{isNavLink:!0,to:e.permalink,className:m.sidebarItemLink,activeClassName:m.sidebarItemLinkActive},e.title)))))))}var u=a(13102);function d(e){let{sidebar:t}=e;return l.createElement("ul",{className:"menu__list"},t.items.map((e=>l.createElement("li",{key:e.permalink,className:"menu__list-item"},l.createElement(s.Z,{isNavLink:!0,to:e.permalink,className:"menu__link",activeClassName:"menu__link--active"},e.title)))))}function g(e){return l.createElement(u.Zo,{component:d,props:e})}function p(e){let{sidebar:t}=e;const a=(0,o.i)();return t?.items.length?"mobile"===a?l.createElement(g,{sidebar:t}):l.createElement(c,{sidebar:t}):null}function h(e){const{sidebar:t,toc:a,children:o,...s}=e,i=t&&t.items.length>0;return l.createElement(n.Z,s,l.createElement("div",{className:"container margin-vert--lg"},l.createElement("div",{className:"row"},l.createElement(p,{sidebar:t}),l.createElement("main",{className:(0,r.Z)("col",{"col--7":i,"col--9 col--offset-1":!i}),itemScope:!0,itemType:"http://schema.org/Blog"},o),a&&l.createElement("div",{className:"col col--2"},a))))}},30390:(e,t,a)=>{a.d(t,{Z:()=>A});var l=a(67294),r=a(86010),n=a(9460),o=a(44996);function s(e){let{children:t,className:a}=e;const{frontMatter:r,assets:s,metadata:{description:i}}=(0,n.C)(),{withBaseUrl:m}=(0,o.C)(),c=s.image??r.image,u=r.keywords??[];return l.createElement("article",{className:a,itemProp:"blogPost",itemScope:!0,itemType:"http://schema.org/BlogPosting"},i&&l.createElement("meta",{itemProp:"description",content:i}),c&&l.createElement("link",{itemProp:"image",href:m(c,{absolute:!0})}),u.length>0&&l.createElement("meta",{itemProp:"keywords",content:u.join(",")}),t)}var i=a(39960);const m={title:"title_f1Hy"};function c(e){let{className:t}=e;const{metadata:a,isBlogPostPage:o}=(0,n.C)(),{permalink:s,title:c}=a,u=o?"h1":"h2";return l.createElement(u,{className:(0,r.Z)(m.title,t),itemProp:"headline"},o?c:l.createElement(i.Z,{itemProp:"url",to:s},c))}var u=a(95999),d=a(88824);const g={container:"container_mt6G"};function p(e){let{readingTime:t}=e;const a=function(){const{selectMessage:e}=(0,d.c)();return t=>{const a=Math.ceil(t);return e(a,(0,u.I)({id:"theme.blog.post.readingTime.plurals",description:'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One min read|{readingTime} min read"},{readingTime:a}))}}();return l.createElement(l.Fragment,null,a(t))}function h(e){let{date:t,formattedDate:a}=e;return l.createElement("time",{dateTime:t,itemProp:"datePublished"},a)}function E(){return l.createElement(l.Fragment,null," \xb7 ")}function b(e){let{className:t}=e;const{metadata:a}=(0,n.C)(),{date:o,formattedDate:s,readingTime:i}=a;return l.createElement("div",{className:(0,r.Z)(g.container,"margin-vert--md",t)},l.createElement(h,{date:o,formattedDate:s}),void 0!==i&&l.createElement(l.Fragment,null,l.createElement(E,null),l.createElement(p,{readingTime:i})))}function f(e){return e.href?l.createElement(i.Z,e):l.createElement(l.Fragment,null,e.children)}function v(e){let{author:t,className:a}=e;const{name:n,title:o,url:s,imageURL:i,email:m}=t,c=s||m&&`mailto:${m}`||void 0;return l.createElement("div",{className:(0,r.Z)("avatar margin-bottom--sm",a)},i&&l.createElement(f,{href:c,className:"avatar__photo-link"},l.createElement("img",{className:"avatar__photo",src:i,alt:n,itemProp:"image"})),n&&l.createElement("div",{className:"avatar__intro",itemProp:"author",itemScope:!0,itemType:"https://schema.org/Person"},l.createElement("div",{className:"avatar__name"},l.createElement(f,{href:c,itemProp:"url"},l.createElement("span",{itemProp:"name"},n))),o&&l.createElement("small",{className:"avatar__subtitle",itemProp:"description"},o)))}const P={authorCol:"authorCol_Hf19",imageOnlyAuthorRow:"imageOnlyAuthorRow_pa_O",imageOnlyAuthorCol:"imageOnlyAuthorCol_G86a"};function N(e){let{className:t}=e;const{metadata:{authors:a},assets:o}=(0,n.C)();if(0===a.length)return null;const s=a.every((e=>{let{name:t}=e;return!t}));return l.createElement("div",{className:(0,r.Z)("margin-top--md margin-bottom--sm",s?P.imageOnlyAuthorRow:"row",t)},a.map(((e,t)=>l.createElement("div",{className:(0,r.Z)(!s&&"col col--6",s?P.imageOnlyAuthorCol:P.authorCol),key:t},l.createElement(v,{author:{...e,imageURL:o.authorsImageUrls[t]??e.imageURL}})))))}function _(){return l.createElement("header",null,l.createElement(c,null),l.createElement(b,null),l.createElement(N,null))}var k=a(18780),Z=a(21098);function I(e){let{children:t,className:a}=e;const{isBlogPostPage:o}=(0,n.C)();return l.createElement("div",{id:o?k.blogPostContainerID:void 0,className:(0,r.Z)("markdown",a),itemProp:"articleBody"},l.createElement(Z.Z,null,t))}var C=a(84881),w=a(71526),y=a(87462);function T(){return l.createElement("b",null,l.createElement(u.Z,{id:"theme.blog.post.readMore",description:"The label used in blog post item excerpts to link to full blog posts"},"Read More"))}function F(e){const{blogPostTitle:t,...a}=e;return l.createElement(i.Z,(0,y.Z)({"aria-label":(0,u.I)({message:"Read more about {title}",id:"theme.blog.post.readMoreLabel",description:"The ARIA label for the link to full blog posts from excerpts"},{title:t})},a),l.createElement(T,null))}const L={blogPostFooterDetailsFull:"blogPostFooterDetailsFull_mRVl"};function B(){const{metadata:e,isBlogPostPage:t}=(0,n.C)(),{tags:a,title:o,editUrl:s,hasTruncateMarker:i}=e,m=!t&&i,c=a.length>0;return c||m||s?l.createElement("footer",{className:(0,r.Z)("row docusaurus-mt-lg",t&&L.blogPostFooterDetailsFull)},c&&l.createElement("div",{className:(0,r.Z)("col",{"col--9":m})},l.createElement(w.Z,{tags:a})),t&&s&&l.createElement("div",{className:"col margin-top--sm"},l.createElement(C.Z,{editUrl:s})),m&&l.createElement("div",{className:(0,r.Z)("col text--right",{"col--3":c})},l.createElement(F,{blogPostTitle:o,to:e.permalink}))):null}function A(e){let{children:t,className:a}=e;const o=function(){const{isBlogPostPage:e}=(0,n.C)();return e?void 0:"margin-bottom--xl"}();return l.createElement(s,{className:(0,r.Z)(o,a)},l.createElement(_,null),l.createElement(I,null,t),l.createElement(B,null))}},9460:(e,t,a)=>{a.d(t,{C:()=>s,n:()=>o});var l=a(67294),r=a(902);const n=l.createContext(null);function o(e){let{children:t,content:a,isBlogPostPage:r=!1}=e;const o=function(e){let{content:t,isBlogPostPage:a}=e;return(0,l.useMemo)((()=>({metadata:t.metadata,frontMatter:t.frontMatter,assets:t.assets,toc:t.toc,isBlogPostPage:a})),[t,a])}({content:a,isBlogPostPage:r});return l.createElement(n.Provider,{value:o},t)}function s(){const e=(0,l.useContext)(n);if(null===e)throw new r.i6("BlogPostProvider");return e}},88824:(e,t,a)=>{a.d(t,{c:()=>m});var l=a(67294),r=a(52263);const n=["zero","one","two","few","many","other"];function o(e){return n.filter((t=>e.includes(t)))}const s={locale:"en",pluralForms:o(["one","other"]),select:e=>1===e?"one":"other"};function i(){const{i18n:{currentLocale:e}}=(0,r.Z)();return(0,l.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:o(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),s}}),[e])}function m(){const e=i();return{selectMessage:(t,a)=>function(e,t,a){const l=e.split("|");if(1===l.length)return l[0];l.length>a.pluralForms.length&&console.error(`For locale=${a.locale}, a maximum of ${a.pluralForms.length} plural forms are expected (${a.pluralForms.join(",")}), but the message contains ${l.length}: ${e}`);const r=a.select(t),n=a.pluralForms.indexOf(r);return l[Math.min(n,l.length-1)]}(a,t,e)}}}}]); \ No newline at end of file diff --git a/assets/js/60fc342f.dae6297c.js b/assets/js/60fc342f.dae6297c.js new file mode 100644 index 0000000000..b7fac71479 --- /dev/null +++ b/assets/js/60fc342f.dae6297c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4561],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>m});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var c=n.createContext({}),p=function(e){var t=n.useContext(c),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=p(e.components);return n.createElement(c.Provider,{value:t},e.children)},d="mdxType",l={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,c=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),d=p(a),g=r,m=d["".concat(c,".").concat(g)]||d[g]||l[g]||i;return a?n.createElement(m,o(o({ref:t},u),{},{components:a})):n.createElement(m,o({ref:t},u))}));function m(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,o=new Array(i);o[0]=g;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[d]="string"==typeof e?e:r,o[1]=s;for(var p=2;p{a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>l,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var n=a(87462),r=(a(67294),a(3905));const i={sidebar_label:"Packages"},o="Packages",s={unversionedId:"iaas/guides/configuration-guide/commons/packages",id:"iaas/guides/configuration-guide/commons/packages",title:"Packages",description:"With the osism.commons.packages role, it is possible to add packages on a node",source:"@site/docs/02-iaas/guides/configuration-guide/commons/packages.md",sourceDirName:"02-iaas/guides/configuration-guide/commons",slug:"/iaas/guides/configuration-guide/commons/packages",permalink:"/docs/iaas/guides/configuration-guide/commons/packages",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/configuration-guide/commons/packages.md",tags:[],version:"current",frontMatter:{sidebar_label:"Packages"},sidebar:"docs",previous:{title:"Network",permalink:"/docs/iaas/guides/configuration-guide/commons/network"},next:{title:"Services",permalink:"/docs/iaas/guides/configuration-guide/commons/services"}},c={},p=[{value:"Distribution specific packages",id:"distribution-specific-packages",level:2},{value:"Debian",id:"debian",level:3},{value:"Upgrade of packages",id:"upgrade-of-packages",level:2}],u={toc:p},d="wrapper";function l(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,n.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"packages"},"Packages"),(0,r.kt)("p",null,"With the ",(0,r.kt)("inlineCode",{parentName:"p"},"osism.commons.packages")," role, it is possible to add packages on a node\nin a general form."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},'required_packages_default:\n - ethtool\n - jq\n - rsyslog\n\nrequired_packages_extra: []\nrequired_packages: "{{ required_packages_default + required_packages_extra + required_packages_distribution }}"\n')),(0,r.kt)("h2",{id:"distribution-specific-packages"},"Distribution specific packages"),(0,r.kt)("h3",{id:"debian"},"Debian"),(0,r.kt)("p",null,"With Debian, the packages listed in ",(0,r.kt)("inlineCode",{parentName:"p"},"required_packages_distribution")," are installed by default."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"required_packages_distribution:\n - debsums\n - selinux-utils\n - ssh\n")),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"apt_cache_valid_time")," parameter can be used to set the ",(0,r.kt)("inlineCode",{parentName:"p"},"cache_valid_time")," paremter\nof the ",(0,r.kt)("inlineCode",{parentName:"p"},"ansible.builtin.apt")," module. The module updates the apt cache if it is older than\nthe ",(0,r.kt)("inlineCode",{parentName:"p"},"cache_valid_time"),". The parameter is set in seconds and defaults to ",(0,r.kt)("inlineCode",{parentName:"p"},"3600"),"."),(0,r.kt)("h2",{id:"upgrade-of-packages"},"Upgrade of packages"),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"upgrade_packages")," parameter can be used to configure the upgrade of packages.\nThe parameter is set to ",(0,r.kt)("inlineCode",{parentName:"p"},"true")," by default."))}l.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/61ce23c3.bb3640ae.js b/assets/js/61ce23c3.bb3640ae.js new file mode 100644 index 0000000000..1d90f3229b --- /dev/null +++ b/assets/js/61ce23c3.bb3640ae.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1302],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>m});var a=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function l(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=a.createContext({}),u=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=u(e.components);return a.createElement(s.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,s=e.parentName,p=r(e,["components","mdxType","originalType","parentName"]),c=u(n),h=o,m=c["".concat(s,".").concat(h)]||c[h]||d[h]||i;return n?a.createElement(m,l(l({ref:t},p),{},{components:n})):a.createElement(m,l({ref:t},p))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,l=new Array(i);l[0]=h;var r={};for(var s in t)hasOwnProperty.call(t,s)&&(r[s]=t[s]);r.originalType=e,r[c]="string"==typeof e?e:o,l[1]=r;for(var u=2;u{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>i,metadata:()=>r,toc:()=>u});var a=n(87462),o=(n(67294),n(3905));const i={},l="Zuul users guide",r={unversionedId:"operations/operations/zuul-ci-cd-quickstart-user-guide",id:"operations/operations/zuul-ci-cd-quickstart-user-guide",title:"Zuul users guide",description:"Prerequisites",source:"@site/dev-docs/operations/operations/zuul-ci-cd-quickstart-user-guide.md",sourceDirName:"operations/operations",slug:"/operations/operations/zuul-ci-cd-quickstart-user-guide",permalink:"/dev-docs/operations/operations/zuul-ci-cd-quickstart-user-guide",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"devDocs",previous:{title:"OpenStack Federation via OpenID-Connect",permalink:"/dev-docs/operations/iam/openstack-federation-via-oidc"}},s={},u=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Who is it for?",id:"who-is-it-for",level:2},{value:"Where do I start?",id:"where-do-i-start",level:2},{value:"Where to save the Zuul relevant data?",id:"where-to-save-the-zuul-relevant-data",level:2},{value:"Projects",id:"projects",level:3},{value:"Pipelines",id:"pipelines",level:3},{value:"1. check",id:"1-check",level:4},{value:"2. gate",id:"2-gate",level:4},{value:"3. post",id:"3-post",level:4},{value:"4. tag",id:"4-tag",level:4},{value:"5. e2e-test",id:"5-e2e-test",level:4},{value:"6. e2e-quick-test",id:"6-e2e-quick-test",level:4},{value:"7. unlabel-on-update-e2e-test",id:"7-unlabel-on-update-e2e-test",level:4},{value:"8. unlabel-on-update-e2e-quick-test",id:"8-unlabel-on-update-e2e-quick-test",level:4},{value:"9. periodic-hourly",id:"9-periodic-hourly",level:4},{value:"10. periodic-daily",id:"10-periodic-daily",level:4},{value:"11. compliance_check",id:"11-compliance_check",level:4},{value:"Jobs",id:"jobs",level:3},{value:"What about secrets?",id:"what-about-secrets",level:4},{value:"Let's put it all together",id:"lets-put-it-all-together",level:4}],p={toc:u},c="wrapper";function d(e){let{components:t,...n}=e;return(0,o.kt)(c,(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"zuul-users-guide"},"Zuul users guide"),(0,o.kt)("h2",{id:"prerequisites"},"Prerequisites"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Repository is known by ",(0,o.kt)("a",{parentName:"li",href:"https://zuul.scs.community"},"SCS Zuul")),(0,o.kt)("li",{parentName:"ol"},"Basic ansible knowledge"),(0,o.kt)("li",{parentName:"ol"},"Basic yaml knowledge"),(0,o.kt)("li",{parentName:"ol"},"zuul-client installed (Only if you want to create secrets. ",(0,o.kt)("a",{parentName:"li",href:"#what-about-secrets"},"See also"),")")),(0,o.kt)("p",null,"Check ",(0,o.kt)("a",{parentName:"p",href:"https://zuul.scs.community/t/SCS/projects"},"SCS Zuul projects")," for your repository to\nbe available. If it is missing you need an administrator to get your repository\nconfigured to Zuul."),(0,o.kt)("h2",{id:"who-is-it-for"},"Who is it for?"),(0,o.kt)("p",null,"You may have heard about Zuul and may ask yourself if it is capable to support you.\nBasically everything you use ansible for can be done using Zuul. That is not always\na good thing since you may get careless and your workload will exceed the CI/CD concept."),(0,o.kt)("p",null,"If you find yourself doing things under the following list you are at the right place."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Code testing"),(0,o.kt)("li",{parentName:"ol"},"Deployment tests using IaC")),(0,o.kt)("p",null,"If you want to, let's say, monitor something using Zuul, that is possible but not the\nintended use case."),(0,o.kt)("h2",{id:"where-do-i-start"},"Where do I start?"),(0,o.kt)("p",null,"Right in your project's repository! The only prerequisite is that\nyour repository you want Zuul to work on is known by Zuul. This is done by the Zuul's\ntenant configuration. To update this configuration you need access to the Zuul instance\nor ask an administrator for help."),(0,o.kt)("p",null,'We assume that Zuul knows about your repository so we can get started. There are three\ntopics that you should know about. To get jobs running you need the "job" itself. Jobs run\nwithin a "pipeline". The third important thing is to provide a "project" definition.'),(0,o.kt)("h2",{id:"where-to-save-the-zuul-relevant-data"},"Where to save the Zuul relevant data?"),(0,o.kt)("p",null,'Zuul will parse all branches of the untrusted repositories that Zuul knows about.\nYour repository is most likely an untrusted one since only the configuration repositories should\nhave the "trusted" state.\nSo it doesn\'t matter whether you have just one branch containing Zuul files or all branches. Zuul\nis looking for the following pathes on your repositories root.'),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"./zuul.yaml # everything is in here\n\n./.zuul.yaml # ... or here\n\n./zuul.d/ # use directory style to get a bit of a structure\n\u251c\u2500\u2500 jobs.yaml\n\u2514\u2500\u2500 project.yaml\n\n./.zuul.d/ # the same as before just hidden\n\u251c\u2500\u2500 jobs.yaml\n\u2514\u2500\u2500 project.yaml\n")),(0,o.kt)("p",null,"Just use exactly one of the four possibilities."),(0,o.kt)("p",null,"If using the directory style configuration all ",(0,o.kt)("inlineCode",{parentName:"p"},"yaml")," files within this directory will be\nprocessed. If your projects configuration is small enough you may put all information in\na single file called ",(0,o.kt)("inlineCode",{parentName:"p"},"zuul.yaml"),". It is also possible to create the file or the directory\nwith a leading dot to hide them for non zuul related work within the repository."),(0,o.kt)("h3",{id:"projects"},"Projects"),(0,o.kt)("p",null,"If Zuul is configured to observe your repository it will have a look at your projects\ndefinition. Minimal example:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-yaml"},'- project:\n name: my-org/my-repo\n default-branch: main\n merge-mode: "squash-merge"\n my_pipeline1:\n jobs:\n - my_job1\n - my_job2\n ......\n my_pipeline2:\n jobs:\n - my_jobs\n ...\n\n')),(0,o.kt)("p",null,"By default Zuul will observe all branches for such files. We have to set the repository name\nthat have to match the exact value that was set for Zuul. Set a default-branch where actions\nthat don't match an explicit branch are executed on. Set the merge-mode that Zuul has to use.\nBut beware that not all issue tracker support all methods. For github squash-merge will work."),(0,o.kt)("p",null,"After these three properties add the pipelines you want to use to the project definition.\nWith the ",(0,o.kt)("inlineCode",{parentName:"p"},"jobs")," list you define which jobs to run in which pipeline."),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://zuul-ci.org/docs/zuul/latest/config/project.html"},"See official documentation")),(0,o.kt)("h3",{id:"pipelines"},"Pipelines"),(0,o.kt)("p",null,"Every Zuul instance will have at least one repository that is used for configuration. There\nyou will find the available pipelines. Pipelines are used to run your jobs on a periodic or\nevent driven base. Pipelines can be used to run other pipelines and to keep your jobs in a\ndefined order if you need this."),(0,o.kt)("p",null,"Have a look at the configuration repository to utilize the pipelines for your repository.\nSee available ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/zuul-config/blob/main/zuul.d/gh_pipelines.yaml"},"pipelines"),' for SCS.\nYou are not able to define new pipelines outside of a so called "configuration" repository. Since,\nby default your repo is considered "untrusted". So in the first place you don\'t need to\nthink about, how to create a pipeline. Just use one that fits your needs as close as possible. Next you will\nfind an enumeration and a small description about the available pipelines in SCS Zuul.'),(0,o.kt)("p",null,"Pipelines available in SCS Zuul:"),(0,o.kt)("h4",{id:"1-check"},"1. check"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"event driven pipeline"),(0,o.kt)("li",{parentName:"ul"},"runs if a pull request is created, changed or reopened"),(0,o.kt)("li",{parentName:"ul"},"re-runs if a comment contains ",(0,o.kt)("inlineCode",{parentName:"li"},"recheck"))),(0,o.kt)("h4",{id:"2-gate"},"2. gate"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"event driven pipeline"),(0,o.kt)("li",{parentName:"ul"},"trigger events: pull_request_review, pull_request, check_run")),(0,o.kt)("h4",{id:"3-post"},"3. post"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"event driven pipeline"),(0,o.kt)("li",{parentName:"ul"},"trigger event: post")),(0,o.kt)("h4",{id:"4-tag"},"4. tag"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"event driven pipeline"),(0,o.kt)("li",{parentName:"ul"},"trigger event: push")),(0,o.kt)("h4",{id:"5-e2e-test"},"5. e2e-test"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"event driven pipeline"),(0,o.kt)("li",{parentName:"ul"},"trigger event: pull_request")),(0,o.kt)("h4",{id:"6-e2e-quick-test"},"6. e2e-quick-test"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"event driven pipeline"),(0,o.kt)("li",{parentName:"ul"},"trigger event: pull_request")),(0,o.kt)("h4",{id:"7-unlabel-on-update-e2e-test"},"7. unlabel-on-update-e2e-test"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"event driven pipeline"),(0,o.kt)("li",{parentName:"ul"},"trigger event: pull_request")),(0,o.kt)("h4",{id:"8-unlabel-on-update-e2e-quick-test"},"8. unlabel-on-update-e2e-quick-test"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"event driven pipeline"),(0,o.kt)("li",{parentName:"ul"},"trigger event: pull_request")),(0,o.kt)("h4",{id:"9-periodic-hourly"},"9. periodic-hourly"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"time based pipeline that runs every hour")),(0,o.kt)("h4",{id:"10-periodic-daily"},"10. periodic-daily"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"time based pipeline that runs every day at 3 o'clock am.")),(0,o.kt)("h4",{id:"11-compliance_check"},"11. compliance_check"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"time based pipeline that runs every 15 minutes")),(0,o.kt)("p",null,"If you want to know more about pipelines: ",(0,o.kt)("a",{parentName:"p",href:"https://zuul-ci.org/docs/zuul/latest/config/pipeline.html"},"See official documentation")),(0,o.kt)("h3",{id:"jobs"},"Jobs"),(0,o.kt)("p",null,"All jobs that your Zuul instances knows of can be used for your own purposes.\nCall them directly or implement a job that uses an existing job as parent.\nDidn't find the right job? Than we have to create a new one. Existing jobs\ncan be found in the web ui of your Zuul instance: ",(0,o.kt)("a",{parentName:"p",href:"https://zuul.scs.community/t/SCS/jobs"},"Example")),(0,o.kt)("p",null,"First have a look on a basic job example:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-yaml"},"- job:\n name: base\n parent: null\n description: |\n The recommended base job.\n\n All jobs ultimately inherit from this. It runs a pre-playbook\n which copies all of the job's prepared git repos on to all of\n the nodes in the nodeset.\n\n It also sets a default timeout value (which may be overidden).\n pre-run: playbooks/base/pre.yaml\n post-run:\n - playbooks/base/post.yaml\n - playbooks/base/post-logs.yaml\n roles:\n - zuul: zuul/zuul-jobs\n timeout: 1800\n nodeset:\n nodes:\n - name: ubuntu-jammy\n label: ubuntu-jammy\n")),(0,o.kt)("p",null,'Each job needs a name that has to be unique within the whole tenant.\nA useful convention to achieve this is to prepend the name of the repository.\nEach job need to define whether there is parent job or not.\nJobs without a parent are called "base" jobs. Usually you don\'t want to implement base jobs since\nthere are already some base jobs that implement often used stuff. A description may not be mandatory\nbut is obviously useful.'),(0,o.kt)("p",null,"Necessary for Zuul to do anything you just need to add a ",(0,o.kt)("inlineCode",{parentName:"p"},"run")," or ",(0,o.kt)("inlineCode",{parentName:"p"},"roles")," property. Within a job that is\nlike a ",(0,o.kt)("inlineCode",{parentName:"p"},"noop")," job or just printing something to stdout that is everything you need to run your first job.\nSince anything we want to do requires a little bit more you have to define a nodeset. The nodes\nare used to run your playbooks on. In 99,9% you will need this too."),(0,o.kt)("p",null,"The properties ",(0,o.kt)("inlineCode",{parentName:"p"},"pre-run")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"post-run")," are useful for bootstrap and cleanup. If your actual job wants to create\nbootstrap some infrastructure you can to this in the ",(0,o.kt)("inlineCode",{parentName:"p"},"pre-run"),". Using an cloud provider you want to release\nno longer used resources. That can be done in the ",(0,o.kt)("inlineCode",{parentName:"p"},"post-run"),'. If you are using a parent job it is likely\nthat the parent job may has pre- and post-run playbooks. In this case your pre- and post-run playbooks are\n"nested". Example:'),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"pre-run parent"),(0,o.kt)("li",{parentName:"ol"},"pre-run my job"),(0,o.kt)("li",{parentName:"ol"},"post-run my job"),(0,o.kt)("li",{parentName:"ol"},"post-run parent")),(0,o.kt)("p",null,"If your job exceeds the defined timeout, the job is considered as failed."),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://zuul-ci.org/docs/zuul/latest/config/job.html"},"See official documentation")),(0,o.kt)("h4",{id:"what-about-secrets"},"What about secrets?"),(0,o.kt)("p",null,"Right now you should be able to run basic tasks. But what if you try to test something\nthat needs credentials to connect to an outside service? Or you have to address additional\nressources in an openstack environment and you have to use something like app credentials?"),(0,o.kt)("p",null,"That is where job secrets are used. Example:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-yaml"},"- job:\n name: SOME_JOB\n parent: base\n description: |\n A job basic job used as example\n secrets:\n - name: clouds_conf\n secret: app_credential_cloud_conf\n run: playbooks/my-playbook.yaml\n")),(0,o.kt)("p",null,"Secrets for a job are simply defined by the keyword ",(0,o.kt)("inlineCode",{parentName:"p"},"secrets"),".\nEach secret needs a name that can be used in your playbooks.\nThe property ",(0,o.kt)("inlineCode",{parentName:"p"},"secret")," references the secret that is defined within your project."),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"ATTENTION!")," If your job is using a secret ",(0,o.kt)("inlineCode",{parentName:"p"},"job.post-review")," is automatically\nset to ",(0,o.kt)("inlineCode",{parentName:"p"},"true"),". For untrusted projects, that means that your job is only called\nin piplines that have the ",(0,o.kt)("inlineCode",{parentName:"p"},"pipeline.post-review")," flag set to ",(0,o.kt)("inlineCode",{parentName:"p"},"true"),". In SCS context\nthat means you may run these jobs only with the pipelines ",(0,o.kt)("inlineCode",{parentName:"p"},"tag")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"post"),"."),(0,o.kt)("p",null,"If you want to run jobs on pipelines that have ",(0,o.kt)("inlineCode",{parentName:"p"},"post-review")," set to ",(0,o.kt)("inlineCode",{parentName:"p"},"false"),", which\nis default, and your job needs a secret, the secret may be defined in the zuul-config repository."),(0,o.kt)("p",null,"Example:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-yaml"},"- secret:\n name: app_credential_cloud_conf\n data:\n credentials: my-secret-value\n")),(0,o.kt)("p",null,"Within ",(0,o.kt)("inlineCode",{parentName:"p"},"my-playbook.yaml")," you can reference the secret value using ",(0,o.kt)("inlineCode",{parentName:"p"},'"{{ clouds_conf.credentials }}"'),".\nIn this example ",(0,o.kt)("inlineCode",{parentName:"p"},"my-secret-value")," is clear readable text. That is not something we want to keep\nsecrets. But how do you encrypt secrets in a way that they are secure and also can be decrypted by\nZuul?"),(0,o.kt)("p",null,"For this purpose Zuul creates its own public/private key pair for each project. Everyone may use the\npublic key to create secrets. But only Zuul will be able to decrypt these values. To avoid the user\nto be responsible for the correct encryption there is an zuul-client tool that will do this for you."),(0,o.kt)("p",null,"Example (reading from stdin and writing to stdout):"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"zuul-client --zuul-url ZUUL_URL encrypt --tenant SCS --project SovereignCloudStack/REPO\n")),(0,o.kt)("p",null,"Add ",(0,o.kt)("inlineCode",{parentName:"p"},"--infile INFILE")," or ",(0,o.kt)("inlineCode",{parentName:"p"},"--outfile OUTFILE")," if you prefer to work with files directly."),(0,o.kt)("p",null,"The output might look like this:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-yaml"},"- secret:\n name: \n data:\n : !encrypted/pkcs1-oaep\n - IGZ2Wu47R9mEY4fjetbxSAUGNaz4HR1mjk9lCLq3HsUMjHGj9YPlb2MvnPQw1LCJSvpaK\n ogth7hi2zYwrs5tNAik/qlVSB7AM+LQRP7lmlM4JmD6WOyR7DisHu7oMD1Gqem2ZuMggA\n DIBn5+DeBIvnwihDOcS+BKPTVMEtXOJNkuObZHE8DweB/RQIGUvjyeq5yoAmz/y+qGVqe\n 0Vk4pTYFIBgk5DMzwVnDzDkqs/QokoOupMUoBcpapmM11do4ymjbDpeINjayoro6VXTtX\n Mkk9fDv9wuJIQTuyHAOfMD+UYS/HqVSF/Hm9ScUvfhw02gTdzKCxliWhFHJOj7RbdUUMK\n OYYcUkNp5cXZUYFnflMhxVEnzREbdAIklNPfoHOizsxLPaUZ9yk6XcFRflFfMvqBtUS00\n LCx0Uh906NwdaEUrv2ZdrN123rwfwfw4333232rDFDFfsdfddsfdDFSFSdqrrtwms5Mi0\n szUBaM4j+Mayep+41vl0cpsLU91GzXEATWMaPIN8OnEHF6qQIv0wB6VaKd5aeAyERisb3\n wFdjEo4faLO70RWzR33k+4xqAYNIIFyTMpWJz21CUSfoYG8ygL6t7RJGgyjA+0KsVEyj+\n ewEtiaUOLYyD7pXtqdw1HgzjqiXnfxk+wSv/y5y/TGGYpQj8zU76jS7Zj0ft/0=\n")),(0,o.kt)("p",null,"You may use this content or the file to provide it as a secret. You just have to update the ",(0,o.kt)("inlineCode",{parentName:"p"},"")," and the\n",(0,o.kt)("inlineCode",{parentName:"p"},"")," part."),(0,o.kt)("p",null,"The secret name has to be unique across all projects. Because of this, we have a naming convention in the\n",(0,o.kt)("inlineCode",{parentName:"p"},"SovereignCloudStack")," organisation that ensures that a secret has a unique name."),(0,o.kt)("p",null,"Our convention is as follows. There is only one secret per Zuul configuration per project (for exceptions,\nsee below). This secret always has a name in the form\n",(0,o.kt)("inlineCode",{parentName:"p"},"SECRET_REPOSITORY_NAME"),". For instance, if a secret in the ",(0,o.kt)("inlineCode",{parentName:"p"},"SovereignCloudStack/k8s-cluster-api-provider"),"\nrepository is\nto be used, it is given the name ",(0,o.kt)("inlineCode",{parentName:"p"},"SECRET_K8S_CLUSTER_API_PROVIDER"),". The name of the repository is\nalways written in capital letters. A dash is replaced with an underscore. Any number of values\n(",(0,o.kt)("inlineCode",{parentName:"p"},": !encrypted/pkcs1-oaep"),") can then be assigned to this one secret."),(0,o.kt)("p",null,"In certain cases, it can be undesireable to expose all secret information to all jobs in a project.\nThen additional secrets may be used, whose names have to be formed by appending an underscore and some\nupper-case prefix to the name of the primary secret. For instance, we might use the\nname ",(0,o.kt)("inlineCode",{parentName:"p"},"SECRET_REPOSITORY_NAME_FOOBAR"),"."),(0,o.kt)("p",null,"Official documentation:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("a",{parentName:"li",href:"https://zuul-ci.org/docs/zuul/latest/config/secret.html#secret"},"Secrets documentation")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("a",{parentName:"li",href:"https://zuul-ci.org/docs/zuul/latest/project-config.html#encryption"},"Encryption documentation"))),(0,o.kt)("h4",{id:"lets-put-it-all-together"},"Let's put it all together"),(0,o.kt)("p",null,"For a basic but working example the following content may be written into a ",(0,o.kt)("inlineCode",{parentName:"p"},"zuul.yaml")," file."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-yaml"},'# zuul.yaml content\n---\n- secret:\n name: SECRET_REPOSITORY_NAME\n data:\n secretValue1: !encrypted/pkcs1-oaep\n - \n secretValue2: !encrypted/pkcs1-oaep\n - \n secretValue3: !encrypted/pkcs1-oaep\n - \n\n- job:\n name: myFirstTestJob\n parent: base\n secrets:\n - name: secretName # The name of the secret that is used within "playbooks/testPlaybook.yaml"\n secret: SECRET_REPOSITORY_NAME\n run: playbooks/testPlaybook.yaml\n\n- job:\n name: mySecondTestJob\n parent: base\n run: playbooks/testPlaybookTwo.yaml\n\n- project:\n tag:\n jobs:\n - myFirstTestJob\n check:\n jobs:\n - mySecondTestJob\n')),(0,o.kt)("p",null,"This will run the job ",(0,o.kt)("inlineCode",{parentName:"p"},"myFirstTestJob")," whenever the ",(0,o.kt)("inlineCode",{parentName:"p"},"tag")," pipeline is triggered, and\n",(0,o.kt)("inlineCode",{parentName:"p"},"mySecondTestJob")," whenever ",(0,o.kt)("inlineCode",{parentName:"p"},"check")," is triggered."),(0,o.kt)("p",null,"Within SCS the ",(0,o.kt)("inlineCode",{parentName:"p"},"check")," pipeline is always triggered if you open, change or reopen a pull request.\nThis pipeline can also be triggered manually if you write a comment on an already\nexisting pull request and place the string ",(0,o.kt)("inlineCode",{parentName:"p"},"recheck")," in it."),(0,o.kt)("p",null,"Recall that the first test job cannot run on the same pipeline because it uses a secret.\nThe ",(0,o.kt)("inlineCode",{parentName:"p"},"tag")," pipeline is run whenever a new tag is created."),(0,o.kt)("p",null,"The path to you playbook is always the full path within the repository. The playbook\ncontains the tasks you actually want to run on all or a specific subset of nodes.\nExample playbook:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-yaml"},"# playbooks/testPlaybook.yaml content\n---\n- hosts: all\n tasks:\n - debug:\n msg: 'Debug print my secrets! {{ secretName.secretValue1 }}' # do not do this as it will expose your secrets\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6316.97d4676f.js b/assets/js/6316.97d4676f.js new file mode 100644 index 0000000000..f21e07a57d --- /dev/null +++ b/assets/js/6316.97d4676f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6316],{96316:(t,e,n)=>{n.d(e,{diagram:()=>A});var i=n(16432),s=n(59373),r=n(91619),a=n(12281),o=n(7201),c=(n(27484),n(17967),n(27856),n(70277),n(45625),n(39354),n(91518),n(59542),n(10285),n(28734),function(){var t=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},e=[1,2],n=[1,5],i=[6,9,11,17,18,20,22,23,26,27,28],s=[1,15],r=[1,16],a=[1,17],o=[1,18],c=[1,19],l=[1,23],h=[1,24],d=[1,27],u=[4,6,9,11,17,18,20,22,23,26,27,28],p={trace:function(){},yy:{},symbols_:{error:2,start:3,timeline:4,document:5,EOF:6,directive:7,line:8,SPACE:9,statement:10,NEWLINE:11,openDirective:12,typeDirective:13,closeDirective:14,":":15,argDirective:16,title:17,acc_title:18,acc_title_value:19,acc_descr:20,acc_descr_value:21,acc_descr_multiline_value:22,section:23,period_statement:24,event_statement:25,period:26,event:27,open_directive:28,type_directive:29,arg_directive:30,close_directive:31,$accept:0,$end:1},terminals_:{2:"error",4:"timeline",6:"EOF",9:"SPACE",11:"NEWLINE",15:":",17:"title",18:"acc_title",19:"acc_title_value",20:"acc_descr",21:"acc_descr_value",22:"acc_descr_multiline_value",23:"section",26:"period",27:"event",28:"open_directive",29:"type_directive",30:"arg_directive",31:"close_directive"},productions_:[0,[3,3],[3,2],[5,0],[5,2],[8,2],[8,1],[8,1],[8,1],[7,4],[7,6],[10,1],[10,2],[10,2],[10,1],[10,1],[10,1],[10,1],[10,1],[24,1],[25,1],[12,1],[13,1],[16,1],[14,1]],performAction:function(t,e,n,i,s,r,a){var o=r.length-1;switch(s){case 1:return r[o-1];case 3:case 7:case 8:this.$=[];break;case 4:r[o-1].push(r[o]),this.$=r[o-1];break;case 5:case 6:this.$=r[o];break;case 11:i.getCommonDb().setDiagramTitle(r[o].substr(6)),this.$=r[o].substr(6);break;case 12:this.$=r[o].trim(),i.getCommonDb().setAccTitle(this.$);break;case 13:case 14:this.$=r[o].trim(),i.getCommonDb().setAccDescription(this.$);break;case 15:i.addSection(r[o].substr(8)),this.$=r[o].substr(8);break;case 19:i.addTask(r[o],0,""),this.$=r[o];break;case 20:i.addEvent(r[o].substr(2)),this.$=r[o];break;case 21:i.parseDirective("%%{","open_directive");break;case 22:i.parseDirective(r[o],"type_directive");break;case 23:r[o]=r[o].trim().replace(/'/g,'"'),i.parseDirective(r[o],"arg_directive");break;case 24:i.parseDirective("}%%","close_directive","timeline")}},table:[{3:1,4:e,7:3,12:4,28:n},{1:[3]},t(i,[2,3],{5:6}),{3:7,4:e,7:3,12:4,28:n},{13:8,29:[1,9]},{29:[2,21]},{6:[1,10],7:22,8:11,9:[1,12],10:13,11:[1,14],12:4,17:s,18:r,20:a,22:o,23:c,24:20,25:21,26:l,27:h,28:n},{1:[2,2]},{14:25,15:[1,26],31:d},t([15,31],[2,22]),t(i,[2,8],{1:[2,1]}),t(i,[2,4]),{7:22,10:28,12:4,17:s,18:r,20:a,22:o,23:c,24:20,25:21,26:l,27:h,28:n},t(i,[2,6]),t(i,[2,7]),t(i,[2,11]),{19:[1,29]},{21:[1,30]},t(i,[2,14]),t(i,[2,15]),t(i,[2,16]),t(i,[2,17]),t(i,[2,18]),t(i,[2,19]),t(i,[2,20]),{11:[1,31]},{16:32,30:[1,33]},{11:[2,24]},t(i,[2,5]),t(i,[2,12]),t(i,[2,13]),t(u,[2,9]),{14:34,31:d},{31:[2,23]},{11:[1,35]},t(u,[2,10])],defaultActions:{5:[2,21],7:[2,2],27:[2,24],33:[2,23]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],s=[null],r=[],a=this.table,o="",c=0,l=0,h=r.slice.call(arguments,1),d=Object.create(this.lexer),u={yy:{}};for(var p in this.yy)Object.prototype.hasOwnProperty.call(this.yy,p)&&(u.yy[p]=this.yy[p]);d.setInput(t,u.yy),u.yy.lexer=d,u.yy.parser=this,void 0===d.yylloc&&(d.yylloc={});var y=d.yylloc;r.push(y);var g=d.options&&d.options.ranges;"function"==typeof u.yy.parseError?this.parseError=u.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var f,m,_,b,k,x,v,S,w,$={};;){if(m=n[n.length-1],this.defaultActions[m]?_=this.defaultActions[m]:(null==f&&(w=void 0,"number"!=typeof(w=i.pop()||d.lex()||1)&&(w instanceof Array&&(w=(i=w).pop()),w=e.symbols_[w]||w),f=w),_=a[m]&&a[m][f]),void 0===_||!_.length||!_[0]){var E="";for(k in S=[],a[m])this.terminals_[k]&&k>2&&S.push("'"+this.terminals_[k]+"'");E=d.showPosition?"Parse error on line "+(c+1)+":\n"+d.showPosition()+"\nExpecting "+S.join(", ")+", got '"+(this.terminals_[f]||f)+"'":"Parse error on line "+(c+1)+": Unexpected "+(1==f?"end of input":"'"+(this.terminals_[f]||f)+"'"),this.parseError(E,{text:d.match,token:this.terminals_[f]||f,line:d.yylineno,loc:y,expected:S})}if(_[0]instanceof Array&&_.length>1)throw new Error("Parse Error: multiple actions possible at state: "+m+", token: "+f);switch(_[0]){case 1:n.push(f),s.push(d.yytext),r.push(d.yylloc),n.push(_[1]),f=null,l=d.yyleng,o=d.yytext,c=d.yylineno,y=d.yylloc;break;case 2:if(x=this.productions_[_[1]][1],$.$=s[s.length-x],$._$={first_line:r[r.length-(x||1)].first_line,last_line:r[r.length-1].last_line,first_column:r[r.length-(x||1)].first_column,last_column:r[r.length-1].last_column},g&&($._$.range=[r[r.length-(x||1)].range[0],r[r.length-1].range[1]]),void 0!==(b=this.performAction.apply($,[o,l,c,u.yy,_[1],s,r].concat(h))))return b;x&&(n=n.slice(0,-1*x*2),s=s.slice(0,-1*x),r=r.slice(0,-1*x)),n.push(this.productions_[_[1]][0]),s.push($.$),r.push($._$),v=a[n[n.length-2]][n[n.length-1]],n.push(v);break;case 3:return!0}}return!0}},y={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var s=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[s[0],s[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,s;if(this.options.backtrack_lexer&&(s={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(s.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var r in s)this[r]=s[r];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var s=this._currentRules(),r=0;re[0].length)){if(e=n,i=r,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,s[r])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,s[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),28;case 1:return this.begin("type_directive"),29;case 2:return this.popState(),this.begin("arg_directive"),15;case 3:return this.popState(),this.popState(),31;case 4:return 30;case 5:case 6:case 8:case 9:break;case 7:return 11;case 10:return 4;case 11:return 17;case 12:return this.begin("acc_title"),18;case 13:return this.popState(),"acc_title_value";case 14:return this.begin("acc_descr"),20;case 15:return this.popState(),"acc_descr_value";case 16:this.begin("acc_descr_multiline");break;case 17:this.popState();break;case 18:return"acc_descr_multiline_value";case 19:return 23;case 20:return 27;case 21:return 26;case 22:return 6;case 23:return"INVALID"}},rules:[/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:timeline\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:section\s[^#:\n;]+)/i,/^(?::\s[^#:\n;]+)/i,/^(?:[^#:\n;]+)/i,/^(?:$)/i,/^(?:.)/i],conditions:{open_directive:{rules:[1],inclusive:!1},type_directive:{rules:[2,3],inclusive:!1},arg_directive:{rules:[3,4],inclusive:!1},acc_descr_multiline:{rules:[17,18],inclusive:!1},acc_descr:{rules:[15],inclusive:!1},acc_title:{rules:[13],inclusive:!1},INITIAL:{rules:[0,5,6,7,8,9,10,11,12,14,16,19,20,21,22,23],inclusive:!0}}};function g(){this.yy={}}return p.lexer=y,g.prototype=p,p.Parser=g,new g}());c.parser=c;const l=c;let h="",d=0;const u=[],p=[],y=[],g=()=>i.j,f=(t,e,n)=>{(0,i.k)(globalThis,t,e,n)},m=function(){u.length=0,p.length=0,h="",y.length=0,(0,i.m)()},_=function(t){h=t,u.push(t)},b=function(){return u},k=function(){let t=w();let e=0;for(;!t&&e<100;)t=w(),e++;return p.push(...y),p},x=function(t,e,n){const i={id:d++,section:h,type:h,task:t,score:e||0,events:n?[n]:[]};y.push(i)},v=function(t){y.find((t=>t.id===d-1)).events.push(t)},S=function(t){const e={section:h,type:h,description:t,task:t,classes:[]};p.push(e)},w=function(){let t=!0;for(const[e,n]of y.entries())y[e].processed,t=t&&n.processed;return t},$={clear:m,getCommonDb:g,addSection:_,getSections:b,getTasks:k,addTask:x,addTaskOrg:S,addEvent:v,parseDirective:f},E=Object.freeze(Object.defineProperty({__proto__:null,addEvent:v,addSection:_,addTask:x,addTaskOrg:S,clear:m,default:$,getCommonDb:g,getSections:b,getTasks:k,parseDirective:f},Symbol.toStringTag,{value:"Module"}));!function(){function t(t,e,n,s,r,a,o,c){i(e.append("text").attr("x",n+r/2).attr("y",s+a/2+5).style("font-color",c).style("text-anchor","middle").text(t),o)}function e(t,e,n,s,r,a,o,c,l){const{taskFontSize:h,taskFontFamily:d}=c,u=t.split(//gi);for(let p=0;p)/).reverse(),r=[],a=n.attr("y"),o=parseFloat(n.attr("dy")),c=n.text(null).append("tspan").attr("x",0).attr("y",a).attr("dy",o+"em");for(let s=0;se||"
"===t)&&(r.pop(),c.text(r.join(" ").trim()),r="
"===t?[""]:[t],c=n.append("tspan").attr("x",0).attr("y",a).attr("dy","1.1em").text(t))}))}const T=function(t,e,n){t.append("path").attr("id","node-"+e.id).attr("class","node-bkg node-"+e.type).attr("d",`M0 ${e.height-5} v${10-e.height} q0,-5 5,-5 h${e.width-10} q5,0 5,5 v${e.height-5} H0 Z`),t.append("line").attr("class","node-line-"+n).attr("x1",0).attr("y1",e.height).attr("x2",e.width).attr("y2",e.height)},D=function(t){t.append("defs").append("marker").attr("id","arrowhead").attr("refX",5).attr("refY",2).attr("markerWidth",6).attr("markerHeight",4).attr("orient","auto").append("path").attr("d","M 0,0 V 4 L6,2 Z")},L=function(t,e,n,i){const s=n%12-1,r=t.append("g");e.section=s,r.attr("class",(e.class?e.class+" ":"")+"timeline-node section-"+s);const a=r.append("g"),o=r.append("g"),c=o.append("text").text(e.descr).attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle").call(I,e.width).node().getBBox(),l=i.fontSize&&i.fontSize.replace?i.fontSize.replace("px",""):i.fontSize;return e.height=c.height+1.1*l*.5+e.padding,e.height=Math.max(e.height,e.maxHeight),e.width=e.width+2*e.padding,o.attr("transform","translate("+e.width/2+", "+e.padding/2+")"),T(a,e,s),e},C=function(t,e,n){const i=t.append("g"),s=i.append("text").text(e.descr).attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle").call(I,e.width).node().getBBox(),r=n.fontSize&&n.fontSize.replace?n.fontSize.replace("px",""):n.fontSize;return i.remove(),s.height+1.1*r*.5+e.padding},M=function(t,e,n,s,r,a,o,c,l,h,d){for(const u of e){const e={descr:u.task,section:n,number:n,width:150,padding:20,maxHeight:a};i.l.debug("taskNode",e);const c=t.append("g").attr("class","taskWrapper"),p=L(c,e,n,o).height;if(i.l.debug("taskHeight after draw",p),c.attr("transform",`translate(${s}, ${r})`),a=Math.max(a,p),u.events){const e=t.append("g").attr("class","lineWrapper");let i=a;r+=100,i+=O(t,u.events,n,s,r,o),r-=100,e.append("line").attr("x1",s+95).attr("y1",r+a).attr("x2",s+95).attr("y2",r+a+(d?a:h)+l+120).attr("stroke-width",2).attr("stroke","black").attr("marker-end","url(#arrowhead)").attr("stroke-dasharray","5,5")}s+=200,d&&!(0,i.g)().timeline.disableMulticolor&&n++}r-=10},O=function(t,e,n,s,r,a){let o=0;const c=r;r+=100;for(const l of e){const e={descr:l,section:n,number:n,width:150,padding:20,maxHeight:50};i.l.debug("eventNode",e);const c=t.append("g").attr("class","eventWrapper"),h=L(c,e,n,a).height;o+=h,c.attr("transform",`translate(${s}, ${r})`),r=r+10+h}return r=c,o},A={db:E,renderer:{setConf:function(t){Object.keys(t).forEach((function(e){conf[e]=t[e]}))},draw:function(t,e,n,r){const a=(0,i.g)(),o=a.leftMargin?a.leftMargin:50;r.db.clear(),r.parser.parse(t+"\n"),i.l.debug("timeline",r.db);const c=a.securityLevel;let l;"sandbox"===c&&(l=(0,s.Ys)("#i"+e));const h=("sandbox"===c?(0,s.Ys)(l.nodes()[0].contentDocument.body):(0,s.Ys)("body")).select("#"+e);h.append("g");const d=r.db.getTasks(),u=r.db.getCommonDb().getDiagramTitle();i.l.debug("task",d),D(h);const p=r.db.getSections();i.l.debug("sections",p);let y=0,g=0,f=0,m=0,_=50+o,b=50;m=50;let k=0,x=!0;p.forEach((function(t){const e=C(h,{number:k,descr:t,section:k,width:150,padding:20,maxHeight:y},a);i.l.debug("sectionHeight before draw",e),y=Math.max(y,e+20)}));let v=0,S=0;i.l.debug("tasks.length",d.length);for(const[s,$]of d.entries()){const t={number:s,descr:$,section:$.section,width:150,padding:20,maxHeight:g},e=C(h,t,a);i.l.debug("taskHeight before draw",e),g=Math.max(g,e+20),v=Math.max(v,$.events.length);let n=0;for(let i=0;i<$.events.length;i++){const t={descr:$.events[i],section:$.section,number:$.section,width:150,padding:20,maxHeight:50};n+=C(h,t,a)}S=Math.max(S,n)}i.l.debug("maxSectionHeight before draw",y),i.l.debug("maxTaskHeight before draw",g),p&&p.length>0?p.forEach((t=>{const e={number:k,descr:t,section:k,width:150,padding:20,maxHeight:y};i.l.debug("sectionNode",e);const n=h.append("g"),s=L(n,e,k,a);i.l.debug("sectionNode output",s),n.attr("transform",`translate(${_}, 50)`),b+=y+50;const r=d.filter((e=>e.section===t));r.length>0&&M(h,r,k,_,b,g,a,v,S,y,!1),_+=200*Math.max(r.length,1),b=50,k++})):(x=!1,M(h,d,k,_,b,g,a,v,S,y,!0));const w=h.node().getBBox();i.l.debug("bounds",w),u&&h.append("text").text(u).attr("x",w.width/2-o).attr("font-size","4ex").attr("font-weight","bold").attr("y",20),f=x?y+g+150:g+100;h.append("g").attr("class","lineWrapper").append("line").attr("x1",o).attr("y1",f).attr("x2",w.width+3*o).attr("y2",f).attr("stroke-width",4).attr("stroke","black").attr("marker-end","url(#arrowhead)"),(0,i.s)(void 0,h,a.timeline.padding?a.timeline.padding:50,!!a.timeline.useMaxWidth&&a.timeline.useMaxWidth)}},parser:l,styles:t=>`\n .edge {\n stroke-width: 3;\n }\n ${(t=>{let e="";for(let n=0;n{n.d(e,{Z:()=>o});var i=n(61691),s=n(71610);const r=t=>{const{r:e,g:n,b:r}=s.Z.parse(t),a=.2126*i.Z.channel.toLinear(e)+.7152*i.Z.channel.toLinear(n)+.0722*i.Z.channel.toLinear(r);return i.Z.lang.round(a)},a=t=>r(t)>=.5,o=t=>!a(t)}}]); \ No newline at end of file diff --git a/assets/js/63c8fde6.64de5717.js b/assets/js/63c8fde6.64de5717.js new file mode 100644 index 0000000000..67fd4467aa --- /dev/null +++ b/assets/js/63c8fde6.64de5717.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6264],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>h});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),d=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=d(e.components);return a.createElement(l.Provider,{value:t},e.children)},u="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=d(n),m=r,h=u["".concat(l,".").concat(m)]||u[m]||c[m]||o;return n?a.createElement(h,i(i({ref:t},p),{},{components:n})):a.createElement(h,i({ref:t},p))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:r,i[1]=s;for(var d=2;d{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>s,toc:()=>d});var a=n(87462),r=(n(67294),n(3905));const o={title:"SCS Entropy",type:"Standard",status:"Draft",track:"IaaS"},i=void 0,s={unversionedId:"scs-0101-v1-entropy",id:"scs-0101-v1-entropy",title:"SCS Entropy",description:"Introduction",source:"@site/standards/scs-0101-v1-entropy.md",sourceDirName:".",slug:"/scs-0101-v1-entropy",permalink:"/standards/scs-0101-v1-entropy",draft:!1,tags:[],version:"current",frontMatter:{title:"SCS Entropy",type:"Standard",status:"Draft",track:"IaaS"},sidebar:"standards",previous:{title:"SCS-0101: Entropy",permalink:"/standards/iaas/scs-0101"},next:{title:"SCS-0102: Image Metadata",permalink:"/standards/iaas/scs-0102"}},l={},d=[{value:"Introduction",id:"introduction",level:2},{value:"Entropy in information technology",id:"entropy-in-information-technology",level:3},{value:"Real-world uses of entropy",id:"real-world-uses-of-entropy",level:3},{value:"Sources of entropy",id:"sources-of-entropy",level:3},{value:"Entropy in virtual instances",id:"entropy-in-virtual-instances",level:3},{value:"Motivation",id:"motivation",level:2},{value:"Entropy in SCS clouds",id:"entropy-in-scs-clouds",level:2},{value:"Flavors",id:"flavors",level:3},{value:"Images",id:"images",level:3},{value:"Compute nodes",id:"compute-nodes",level:3}],p={toc:d},u="wrapper";function c(e){let{components:t,...n}=e;return(0,r.kt)(u,(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"introduction"},"Introduction"),(0,r.kt)("h3",{id:"entropy-in-information-technology"},"Entropy in information technology"),(0,r.kt)("p",null,"Entropy is a concept that is widely used in the scope of information\ntechnology. It is a measurement of the amount of disorder or randomness in\na system. Entropy is used to measure the amount of information in a\nself-contained system, as well as the amount of incertitude that exists in this\nsystem."),(0,r.kt)("h3",{id:"real-world-uses-of-entropy"},"Real-world uses of entropy"),(0,r.kt)("p",null,"Cryptography is a very prominent, albeit not the only application that\nheavily relies on entropy for operations such as creating secure keys.\nWhen the available ",(0,r.kt)("em",{parentName:"p"},"entropy runs out"),", said operations can stall and\ntake an abnormally long amount of time, which in turn can lead to\nmalfunctions, e.g., with OpenSSL or load balancers."),(0,r.kt)("h3",{id:"sources-of-entropy"},"Sources of entropy"),(0,r.kt)("p",null,"In ",(0,r.kt)("em",{parentName:"p"},"traditional baremetal systems")," the amount of incertitude is sourced\nfrom the randomness of the read/write cycles of the disk heads of a disk drive,\nbus timings, or keyboard timings, to name a few."),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"More recent methods")," of generating entropy include measuring IRQ jitter\n(available in Linux since kernel 5.4 or, before that, via a daemon such as\n",(0,r.kt)("a",{parentName:"p",href:"http://www.issihosts.com/haveged/"},"HavegeD"),") as well as dedicated CPU\ninstructions (available in virtually all major CPUs: RDSEED or RDRAND\non x86_64 and RNDR on arm64)."),(0,r.kt)("p",null,"Finally, a dedicated device can be utilized \u2014 if present \u2014 that is\ncalled ",(0,r.kt)("em",{parentName:"p"},"hardware random number generator")," or HRNG for short. For instance,\nthe ",(0,r.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Trusted_Platform_Module"},"Trusted Platform Module"),"\nincludes a HRNG. On Linux systems, the HRNG appears as ",(0,r.kt)("inlineCode",{parentName:"p"},"/dev/hwrng"),".\nNote that, while the dedicated CPU instructions can be construed as\na HRNG, they are not treated as such by the kernel, i.e., they ",(0,r.kt)("em",{parentName:"p"},"do not"),"\nappear as ",(0,r.kt)("inlineCode",{parentName:"p"},"/dev/hwrng"),"!"),(0,r.kt)("p",null,"The Linux kernel combines multiple sources of entropy into a pool. To this\nend, it will use all of the sources discussed so far with one exception:\nthe HRNG must be fed into the pool (if so desired) via the daemon ",(0,r.kt)("inlineCode",{parentName:"p"},"rngd"),".\nThe kernel converts the entropy from the pool into cryptographically\nsecure random numbers that appear under ",(0,r.kt)("inlineCode",{parentName:"p"},"/dev/random")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"/dev/urandom"),"."),(0,r.kt)("p",null,"With kernel 5.18, the algorithm that accomplishes\nsaid conversion has been drastically improved (see\n",(0,r.kt)("a",{parentName:"p",href:"https://web.archive.org/web/20230321040526/https://www.zx2c4.com/projects/linux-rng-5.17-5.18/"},"linux-rng-5.17-18"),"),\nso much so that running out of entropy is virtually ruled out.\nThese patches have now also arrived in the upstream LTS images."),(0,r.kt)("h3",{id:"entropy-in-virtual-instances"},"Entropy in virtual instances"),(0,r.kt)("p",null,"Virtual instances or virtual machines do not have the traditional sources\nof entropy mentioned above. However, the more recent methods mentioned\nabove do work just fine (the CPU instructions are not privileged)."),(0,r.kt)("p",null,"Alternatively, a virtualized HRNG called ",(0,r.kt)("inlineCode",{parentName:"p"},"virtio-rng")," can be established\nthat injects entropy from the host into the instance, where this\nentropy can be sourced optionally from either the host's ",(0,r.kt)("inlineCode",{parentName:"p"},"/dev/random")," or\nsome HRNG in the host. This virtualized HRNG behaves just like a real\none, that is, it appears as ",(0,r.kt)("inlineCode",{parentName:"p"},"/dev/hwrng"),", and the daemon ",(0,r.kt)("inlineCode",{parentName:"p"},"rngd")," must\nbe used to feed it into the kernel's entropy pool."),(0,r.kt)("p",null,"On a side note, the kernel exposes available HRNGs via the special\ndirectory ",(0,r.kt)("inlineCode",{parentName:"p"},"/sys/devices/virtual/misc/hw_random"),". In particular, the\nfile ",(0,r.kt)("inlineCode",{parentName:"p"},"rng_available")," lists availabe HRNGs while the file ",(0,r.kt)("inlineCode",{parentName:"p"},"rng_current"),"\ncontains the HRNG currently used."),(0,r.kt)("p",null,"In summary, with current kernels and CPUs entropy in virtual instances\nis readily available to a sufficient degree. In addition, the host's\nentropy sources can be injected using ",(0,r.kt)("inlineCode",{parentName:"p"},"virtio-rng")," if so desired, e.g.,\nto enable access to a HRNG."),(0,r.kt)("h2",{id:"motivation"},"Motivation"),(0,r.kt)("p",null,"As stated above, good sources of entropy are paramount for many\nimportant applications. This standard ensures that sufficient entropy\nwill be available in virtual instances."),(0,r.kt)("h2",{id:"entropy-in-scs-clouds"},"Entropy in SCS clouds"),(0,r.kt)("h3",{id:"flavors"},"Flavors"),(0,r.kt)("p",null,"It is recommended that all flavors have the following attribute:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-console"},"hw_rng:allowed=True\n")),(0,r.kt)("p",null,"The following attributes are optional:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-console"},"hw_rng:rate_bytes - The allowed amount of bytes for the the guest\n to read from the host's entropy per period.\nhw_rng:rate_period - Sets the duration of a read period in seconds.\n")),(0,r.kt)("h3",{id:"images"},"Images"),(0,r.kt)("p",null,"It is recommended to use images having a kernel (patch level) version 5.18\nor up. This condition is already satisfied by every mandatory image defined\nin the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Standards/scs-0102-v1-image-metadata.md"},"Image Metadata Standard"),"."),(0,r.kt)("p",null,"It is recommended that images activate the attribute ",(0,r.kt)("inlineCode",{parentName:"p"},"hw_rng_model: virtio"),"."),(0,r.kt)("p",null,"The daemon ",(0,r.kt)("inlineCode",{parentName:"p"},"rngd")," must be installed (usually from ",(0,r.kt)("inlineCode",{parentName:"p"},"rng-tools"),"\nor ",(0,r.kt)("inlineCode",{parentName:"p"},"rng-utils"),")."),(0,r.kt)("p",null,"The user may choose to use the ",(0,r.kt)("inlineCode",{parentName:"p"},"virtio-rng")," device via ",(0,r.kt)("inlineCode",{parentName:"p"},"rngd"),"."),(0,r.kt)("h3",{id:"compute-nodes"},"Compute nodes"),(0,r.kt)("p",null,"Compute nodes must use CPUs that offer instructions for accessing\nentropy (such as RDSEED or RDRAND on x86_64 or RNDR on arm64), and\nthese instructions may not be filtered by the hypervisor.\nIf this requirement cannot be verified directly, then at least the\nfollowing two conditions must be satisfied in a virtual instance:"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"The special file ",(0,r.kt)("inlineCode",{parentName:"p"},"/proc/sys/kernel/random/entropy_avail")," must contain\nthe value 256 (pinned since kernel 5.18).")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"The number of FIPS 140-2 failures must not exceed 3 out of 1000 blocks\ntested, as determined by ",(0,r.kt)("inlineCode",{parentName:"p"},"cat /dev/random | rngtest -c 1000")," ."))),(0,r.kt)("p",null,"Compute nodes may provide a HRNG via ",(0,r.kt)("inlineCode",{parentName:"p"},"rngd"),"."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/644d3432.6b01bab3.js b/assets/js/644d3432.6b01bab3.js new file mode 100644 index 0000000000..c2f71c22d2 --- /dev/null +++ b/assets/js/644d3432.6b01bab3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7859],{15018:s=>{s.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"dev-docs"}')}}]); \ No newline at end of file diff --git a/assets/js/653904f7.3520249c.js b/assets/js/653904f7.3520249c.js new file mode 100644 index 0000000000..eb3dd55835 --- /dev/null +++ b/assets/js/653904f7.3520249c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4342],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>k});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),s=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=s(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,d=c(e,["components","mdxType","originalType","parentName"]),p=s(n),m=a,k=p["".concat(l,".").concat(m)]||p[m]||u[m]||o;return n?r.createElement(k,i(i({ref:t},d),{},{components:n})):r.createElement(k,i({ref:t},d))}));function k(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[p]="string"==typeof e?e:a,i[1]=c;for(var s=2;s{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>c,toc:()=>s});var r=n(87462),a=(n(67294),n(3905));const o={},i="Custom CA",c={unversionedId:"container/components/k8s-cluster-api-provider/doc/usage/custom-ca",id:"container/components/k8s-cluster-api-provider/doc/usage/custom-ca",title:"Custom CA",description:"OpenStack provides public-facing API endpoints which protection by SSL/TLS certificates",source:"@site/docs/03-container/components/k8s-cluster-api-provider/doc/usage/custom-ca.md",sourceDirName:"03-container/components/k8s-cluster-api-provider/doc/usage",slug:"/container/components/k8s-cluster-api-provider/doc/usage/custom-ca",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/usage/custom-ca",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/03-container/components/k8s-cluster-api-provider/doc/usage/custom-ca.md",tags:[],version:"current",frontMatter:{}},l={},s=[{value:"Rotation",id:"rotation",level:2}],d={toc:s},p="wrapper";function u(e){let{components:t,...n}=e;return(0,a.kt)(p,(0,r.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"custom-ca"},"Custom CA"),(0,a.kt)("p",null,"OpenStack provides public-facing API endpoints which protection by SSL/TLS certificates\nis highly recommended in production environments.\nThese certificates are usually issued by public CA but also the custom or private CA could be used."),(0,a.kt)("p",null,"If the communication with OpenStack API is protected by the certificate issued by custom CA\nthe ",(0,a.kt)("inlineCode",{parentName:"p"},"cacert")," setting needs to be provided inside clouds.yaml, e.g.:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},"clouds:\n devstack:\n cacert: ca-bundle.pem\n auth:\n auth_url: https://10.0.3.15/identity\n project_domain_id: default\n project_name: demo\n user_domain_id: default\n identity_api_version: 3\n region_name: RegionOne\n interface: public\n")),(0,a.kt)("p",null,"Here the file ",(0,a.kt)("inlineCode",{parentName:"p"},"ca-bundle.pem")," contains custom root CA and potentially intermediate CA(s)."),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"The ",(0,a.kt)("inlineCode",{parentName:"p"},"ca-bundle.pem")," file will be copied to the management server and used by CAPO\nin the management cluster. Also, it will be copied to the workload cluster (control plane and worker nodes)\nand mounted and used by OCCM and CCSI pods.\nSo provide only the necessary certificates in that file.")),(0,a.kt)("p",null,"Steps of what happens with the custom cacert in k8s-cluster-api-provider:"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("inlineCode",{parentName:"li"},"cacert")," setting is provided inside clouds.yaml"),(0,a.kt)("li",{parentName:"ol"},"Cacert file referenced by ",(0,a.kt)("inlineCode",{parentName:"li"},"cacert")," key (1.) is copied to the management server\ndirectory ",(0,a.kt)("inlineCode",{parentName:"li"},"~/cluster-defaults/${cloud_provider}-cacert")," by Terraform"),(0,a.kt)("li",{parentName:"ol"},"During the management server bootstrap process cacert is injected to\nthe ",(0,a.kt)("em",{parentName:"li"},"~/cluster-defaults/cluster-template.yaml")," to ",(0,a.kt)("em",{parentName:"li"},"KubeadmControlPlane")," and ",(0,a.kt)("em",{parentName:"li"},"KubeadmConfigTemplate")," files\nas file with cacert content from already defined secret ",(0,a.kt)("em",{parentName:"li"},"${CLUSTER_NAME}-cloud-config")," and will be later\ntemplated and copied to the workload cluster (control plane and worker nodes) provisioned by CAPO, e.g.:",(0,a.kt)("pre",{parentName:"li"},(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},'files:\n- contentFrom:\n secret:\n key: cacert\n name: ${CLUSTER_NAME}-cloud-config\n owner: root:root\n path: /etc/ssl/certs/devstack-cacert\n permissions: "0644"\n'))),(0,a.kt)("li",{parentName:"ol"},"When the creation of the workload cluster (",(0,a.kt)("em",{parentName:"li"},"create_cluster.sh"),") starts,\n",(0,a.kt)("em",{parentName:"li"},"~/cluster-defaults/cluster-template.yaml")," is copied into workload cluster directory (",(0,a.kt)("em",{parentName:"li"},"~/$CLUSTER_NAME/"),")"),(0,a.kt)("li",{parentName:"ol"},"Then the cacert file content is base64 encoded and saved in OPENSTACK_CLOUD_CACERT_B64 variable\ninside ",(0,a.kt)("em",{parentName:"li"},"~/$CLUSTER_NAME/clusterctl.yaml"),", so it can be used during\nthe workload cluster templating"),(0,a.kt)("li",{parentName:"ol"},"Later, when the workload cluster templates are applied to the management cluster,\nsecret ",(0,a.kt)("em",{parentName:"li"},"${CLUSTER_NAME}-cloud-config")," with base64 encoded cacert is created and used by CAPO"),(0,a.kt)("li",{parentName:"ol"},"CAPO will create workload cluster (thanks to steps 5. and 6.) and cacert is\ntransferred to the control plane and worker nodes (thanks to steps 3. and 4.)"),(0,a.kt)("li",{parentName:"ol"},"OCCM and CCSI pods mount cacert via hostPath volume\nand use it for e.g. creating load balancers or volumes")),(0,a.kt)("h2",{id:"rotation"},"Rotation"),(0,a.kt)("p",null,"When the custom CA expires or otherwise changes it needs to be rotated.\nCAPO uses the custom CA certificate in the management cluster for creating the infrastructure\nfor the workload clusters and in the workload clusters by OCCM and CCSI for e.g. creating load balancers or volumes.\nIn both cases, cacert is provided via secret ",(0,a.kt)("em",{parentName:"p"},"${CLUSTER_NAME}-cloud-config")," and needs to be updated."),(0,a.kt)("p",null,"There are 3 steps in this rotation process:"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"Replace/append custom CA certificate in ",(0,a.kt)("inlineCode",{parentName:"li"},"~/cluster-defaults/${cloud_provider}-cacert")),(0,a.kt)("li",{parentName:"ol"},"Increase generation counters ",(0,a.kt)("inlineCode",{parentName:"li"},"CONTROL_PLANE_MACHINE_GEN")," and ",(0,a.kt)("inlineCode",{parentName:"li"},"WORKER_MACHINE_GEN")," in ",(0,a.kt)("inlineCode",{parentName:"li"},"~/$CLUSTER_NAME/clusterctl.yaml")),(0,a.kt)("li",{parentName:"ol"},"Run ",(0,a.kt)("inlineCode",{parentName:"li"},"create_cluster.sh $CLUSTER_NAME")," and wait for the rolling update of your workload cluster")),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"In step 1, appending can be useful for avoiding downtime of your services.\nYour cacert file will contain two CA certificates - old and new.\nThis should help with a smooth transition to a new certificate and later, the old one can be removed.")),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"Steps 2 and 3 need to be done per workload cluster.")),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"When step 2 is omitted, only cacert secret in the management cluster is updated and no rolling update of\nthe workload cluster in step 3 is started and existing nodes remain with the old certificate.")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/65c90e53.e76dec9c.js b/assets/js/65c90e53.e76dec9c.js new file mode 100644 index 0000000000..fa481adb75 --- /dev/null +++ b/assets/js/65c90e53.e76dec9c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6730],{40975:e=>{e.exports=JSON.parse('{"title":"Components","slug":"/category/components-1","permalink":"/docs/category/components-1","navigation":{"previous":{"title":"Container Layer Introduction","permalink":"/docs/container/"},"next":{"title":"K8s Cluster API Provider","permalink":"/docs/category/k8s-cluster-api-provider"}}}')}}]); \ No newline at end of file diff --git a/assets/js/670b12e1.9f8c72b5.js b/assets/js/670b12e1.9f8c72b5.js new file mode 100644 index 0000000000..25d9daacea --- /dev/null +++ b/assets/js/670b12e1.9f8c72b5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7836],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>b});var o=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function s(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=o.createContext({}),p=function(e){var t=o.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},d=function(e){var t=p(e.components);return o.createElement(l.Provider,{value:t},e.children)},c="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},m=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),c=p(n),m=r,b=c["".concat(l,".").concat(m)]||c[m]||u[m]||a;return n?o.createElement(b,s(s({ref:t},d),{},{components:n})):o.createElement(b,s({ref:t},d))}));function b(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,s=new Array(a);s[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[c]="string"==typeof e?e:r,s[1]=i;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>p});var o=n(87462),r=(n(67294),n(3905));const a={sidebar_label:"Console",sidebar_position:15},s="Console",i={unversionedId:"iaas/guides/operations-guide/manager/console",id:"iaas/guides/operations-guide/manager/console",title:"Console",description:"A console command is available in the OSISM CLI. This allows specific parts of the",source:"@site/docs/02-iaas/guides/operations-guide/manager/console.md",sourceDirName:"02-iaas/guides/operations-guide/manager",slug:"/iaas/guides/operations-guide/manager/console",permalink:"/docs/iaas/guides/operations-guide/manager/console",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/operations-guide/manager/console.md",tags:[],version:"current",sidebarPosition:15,frontMatter:{sidebar_label:"Console",sidebar_position:15},sidebar:"docs",previous:{title:"Logging",permalink:"/docs/iaas/guides/operations-guide/manager/log"},next:{title:"Task",permalink:"/docs/iaas/guides/operations-guide/manager/task"}},l={},p=[{value:"Ansible",id:"ansible",level:2},{value:"Clush",id:"clush",level:2},{value:"Container",id:"container",level:2},{value:"SSH",id:"ssh",level:2}],d={toc:p},c="wrapper";function u(e){let{components:t,...n}=e;return(0,r.kt)(c,(0,o.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"console"},"Console"),(0,r.kt)("p",null,"A ",(0,r.kt)("inlineCode",{parentName:"p"},"console")," command is available in the OSISM CLI. This allows specific parts of the\nenvironment to be operated interactively."),(0,r.kt)("h2",{id:"ansible"},"Ansible"),(0,r.kt)("p",null,"Used tool: ",(0,r.kt)("a",{parentName:"p",href:"https://docs.ansible.com/ansible/latest/cli/ansible-console.html"},"ansible-console")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ osism console --type ansible testbed-node-0\nWelcome to the ansible console. Type help or ? to list commands.\n\ndragon@testbed-node-0 (1)[f:5]$ !uptime\ntestbed-node-0 | CHANGED | rc=0 >>\n 18:14:15 up 80 days, 33 min, 0 users, load average: 4.00, 3.07, 2.67\ndragon@testbed-node-0 (1)[f:5]$\n")),(0,r.kt)("p",null,"Shortcut: ",(0,r.kt)("inlineCode",{parentName:"p"},"osism console .testbed-node-0")),(0,r.kt)("h2",{id:"clush"},"Clush"),(0,r.kt)("p",null,"Used tool: ",(0,r.kt)("a",{parentName:"p",href:"https://clustershell.readthedocs.io"},"ClusterShell")),(0,r.kt)("p",null,"The same groups as defined in the Ansible Inventory can be used."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ osism console --type clush control\nEnter 'quit' to leave this interactive mode\nWorking with nodes: testbed-node-[0-2]\nclush>\n")),(0,r.kt)("p",null,"Shortcut: ",(0,r.kt)("inlineCode",{parentName:"p"},"osism console :control")),(0,r.kt)("h2",{id:"container"},"Container"),(0,r.kt)("p",null,"Used tool: ",(0,r.kt)("a",{parentName:"p",href:"https://python-prompt-toolkit.readthedocs.io/en/master/index.html"},"Python Prompt Toolkit")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ osism console --type container testbed-node-0/fluentd\n(fluentd)[td-agent@testbed-node-0 /]$ ps ax\n PID TTY STAT TIME COMMAND\n 1 ? Ss 0:00 dumb-init --single-child -- kolla_start\n 7 ? Sl 24:28 /opt/td-agent/bin/ruby /usr/sbin/td-agent -o /var/log/kolla/fluentd/fluent\n 25 ? Sl 3519:55 /opt/td-agent/bin/ruby -Eascii-8bit:ascii-8bit /usr/sbin/td-agent -o /var\n 238 pts/0 Ss 0:00 bash\n 247 pts/0 R+ 0:00 ps ax\n")),(0,r.kt)("p",null,"Shortcut: ",(0,r.kt)("inlineCode",{parentName:"p"},"osism console testbed-node-0/fluentd")),(0,r.kt)("h2",{id:"ssh"},"SSH"),(0,r.kt)("p",null,"Used tool: ",(0,r.kt)("a",{parentName:"p",href:"https://www.openssh.com"},"OpenSSH")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ osism console --type ssh testbed-node-0\nYou have new mail.\nLast login: Wed Sep 27 18:15:39 2023 from 192.168.16.5\ndragon@testbed-node-0:~$ uptime\n 18:16:25 up 80 days, 35 min, 1 user, load average: 2.85, 3.04, 2.71\n")),(0,r.kt)("p",null,"Shortcut: ",(0,r.kt)("inlineCode",{parentName:"p"},"osism console testbed-node-0")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/67dad519.3679338b.js b/assets/js/67dad519.3679338b.js new file mode 100644 index 0000000000..38cf2fff2c --- /dev/null +++ b/assets/js/67dad519.3679338b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3976],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>h});var a=n(67294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function r(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=a.createContext({}),p=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},d=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var n=e.components,i=e.mdxType,o=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),m=p(n),c=i,h=m["".concat(s,".").concat(c)]||m[c]||u[c]||o;return n?a.createElement(h,r(r({ref:t},d),{},{components:n})):a.createElement(h,r({ref:t},d))}));function h(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=n.length,r=new Array(o);r[0]=c;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[m]="string"==typeof e?e:i,r[1]=l;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var a=n(87462),i=(n(67294),n(3905));const o={sidebar_label:"Provisioning",sidebar_position:30},r="Provisioning of management and control plane nodes",l={unversionedId:"iaas/guides/deploy-guide/provisioning",id:"iaas/guides/deploy-guide/provisioning",title:"Provisioning of management and control plane nodes",description:"For the initial deployment of the management plane and the control plane of OSISM,",source:"@site/docs/02-iaas/guides/deploy-guide/provisioning.md",sourceDirName:"02-iaas/guides/deploy-guide",slug:"/iaas/guides/deploy-guide/provisioning",permalink:"/docs/iaas/guides/deploy-guide/provisioning",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/deploy-guide/provisioning.md",tags:[],version:"current",sidebarPosition:30,frontMatter:{sidebar_label:"Provisioning",sidebar_position:30},sidebar:"docs",previous:{title:"Manager",permalink:"/docs/iaas/guides/deploy-guide/manager"},next:{title:"Bootstrap",permalink:"/docs/iaas/guides/deploy-guide/bootstrap"}},s={},p=[{value:"Manual provisioning",id:"manual-provisioning",level:3}],d={toc:p},m="wrapper";function u(e){let{components:t,...n}=e;return(0,i.kt)(m,(0,a.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"provisioning-of-management-and-control-plane-nodes"},"Provisioning of management and control plane nodes"),(0,i.kt)("p",null,"For the initial deployment of the management plane and the control plane of OSISM,\nthe nodes must be pre-provisioned with Ubuntu 22.04. Currently, only Ubuntu 22.04 is supported\nby OSISM."),(0,i.kt)("p",null,"Data plane nodes can be automatically provisioned after the initial deployment and\ndo not need to be pre-provisioned."),(0,i.kt)("p",null,"It is recommended not to install the initial nodes of the management plane and the\ncontrol plane manually. An ISO image is provided for this purpose which automatically\nprovisions a node. The ISO images are available for download in the\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/osism/node-image"},"osism/node-image")," repository."),(0,i.kt)("p",null,"There are different variants of the ISO image. The variants differ in the disc layout.\nThe available variants are described in the README file of the ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/osism/node-image"},"osism/node-image"),"\nrepository."),(0,i.kt)("h3",{id:"manual-provisioning"},"Manual provisioning"),(0,i.kt)("p",null,"If none of the provided variants is suitable, this section describes the manual\ninstallation with the help of the Ubuntu 22.04 live ISO image. The manual installation\nis possible without network connectivity."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Download the latest ISO image for Ubuntu 22.04 from ",(0,i.kt)("a",{parentName:"li",href:"https://www.releases.ubuntu.com/22.04/"},"releases.ubuntu.com"),".",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Use the ",(0,i.kt)("inlineCode",{parentName:"li"},"ubuntu-22.04.1-live-server-amd64.iso")," image."),(0,i.kt)("li",{parentName:"ul"},"The version number may be different, always use the latest available version of 22.04 LTS."))),(0,i.kt)("li",{parentName:"ul"},"Choose ",(0,i.kt)("inlineCode",{parentName:"li"},"English")," as language."),(0,i.kt)("li",{parentName:"ul"},"Choose ",(0,i.kt)("inlineCode",{parentName:"li"},"Install Ubuntu Server"),"."),(0,i.kt)("li",{parentName:"ul"},"Choose ",(0,i.kt)("inlineCode",{parentName:"li"},"English as language")," (again)."),(0,i.kt)("li",{parentName:"ul"},"Choose your location (e.g. ",(0,i.kt)("inlineCode",{parentName:"li"},"Germany"),")."),(0,i.kt)("li",{parentName:"ul"},"Choose ",(0,i.kt)("inlineCode",{parentName:"li"},"en_US.UTF-8")," as locale."),(0,i.kt)("li",{parentName:"ul"},"Choose the keyboard layout from a list, use ",(0,i.kt)("inlineCode",{parentName:"li"},"English (US)"),"."),(0,i.kt)("li",{parentName:"ul"},"Choose and configure the primary network interface.",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Depending on the environment, the network may not work at this point. Then select any interface\nand then select ",(0,i.kt)("inlineCode",{parentName:"li"},"Do not configure the network at this time")," in the next step."))),(0,i.kt)("li",{parentName:"ul"},"Set the hostname.",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"The hostname is e.g. ",(0,i.kt)("inlineCode",{parentName:"li"},"node")," and not a FQDN like ",(0,i.kt)("inlineCode",{parentName:"li"},"node.systems.osism.xyz"),"."))),(0,i.kt)("li",{parentName:"ul"},"Set ",(0,i.kt)("inlineCode",{parentName:"li"},"osism")," as full name for the new user."),(0,i.kt)("li",{parentName:"ul"},"Set ",(0,i.kt)("inlineCode",{parentName:"li"},"osism")," as the username for the account.",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"The later used operator user ",(0,i.kt)("inlineCode",{parentName:"li"},"dragon")," is created during the bootstrap and ",(0,i.kt)("strong",{parentName:"li"},"should not be created")," during the installation"),(0,i.kt)("li",{parentName:"ul"},"The account is only needed initially and can be deleted after completion of the bootstrap."))),(0,i.kt)("li",{parentName:"ul"},"Set a password for the account."),(0,i.kt)("li",{parentName:"ul"},"Choose ",(0,i.kt)("inlineCode",{parentName:"li"},"Manual")," as partitioning method and execute the partitioning according to company specifications",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"The use of a UEFI is recommended"),(0,i.kt)("li",{parentName:"ul"},"The use of a RAID is recommended. We prefer the use of software RAIDs to make us less dependent on hardware.\nBut there is nothing against using hardware RAIDs."),(0,i.kt)("li",{parentName:"ul"},"The use of a LVM2 is recommended. ",(0,i.kt)("inlineCode",{parentName:"li"},"system")," is recommended as the name for the volume group."),(0,i.kt)("li",{parentName:"ul"},"Dedicated disks may be provided for ",(0,i.kt)("inlineCode",{parentName:"li"},"/var/lib/docker")," on the controller nodes. In this case, do not\nuse an LV for ",(0,i.kt)("inlineCode",{parentName:"li"},"/var/lib/docker")," but the devices provided for it."),(0,i.kt)("li",{parentName:"ul"},"Do not configure devices that are not required for the operating system."),(0,i.kt)("li",{parentName:"ul"},"The use of own file systems for the following mountpoints is recommended. The size of the individual partitions\nis minimal. Depending on the node type, the individual partitions should be made larger. This applies in\nparticular to ",(0,i.kt)("inlineCode",{parentName:"li"},"/var/lib/docker"),". On controllers at least 100 GByte should be used.",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"/")," (10 GByte, logical volume ",(0,i.kt)("inlineCode",{parentName:"li"},"root"),")"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"/home")," (2 GByte, logical volume ",(0,i.kt)("inlineCode",{parentName:"li"},"home"),")"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"/tmp")," (5 GByte, logical volume ",(0,i.kt)("inlineCode",{parentName:"li"},"tmp"),")"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"/var/lib/ceph")," (50 GByte, logical volume ",(0,i.kt)("inlineCode",{parentName:"li"},"ceph"),") (optional for storage nodes)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"/var/lib/docker")," (30 GByte, logical volume ",(0,i.kt)("inlineCode",{parentName:"li"},"docker"),", do not set the ",(0,i.kt)("inlineCode",{parentName:"li"},"nosuid")," flag on ",(0,i.kt)("inlineCode",{parentName:"li"},"/var/lib/docker"),")",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"When using XFS as the file system for ",(0,i.kt)("inlineCode",{parentName:"li"},"/var/lib/docker"),", note the following: Running on XFS without ",(0,i.kt)("inlineCode",{parentName:"li"},"d_type")," support\ncauses Docker to skip the attempt to use the ",(0,i.kt)("inlineCode",{parentName:"li"},"overlay")," or ",(0,i.kt)("inlineCode",{parentName:"li"},"overlay2")," driver."))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"/var/log/audit")," (1 GByte, logical volume ",(0,i.kt)("inlineCode",{parentName:"li"},"audit"),")"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"/var")," (10 GByte, logical volume ",(0,i.kt)("inlineCode",{parentName:"li"},"var"),")"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"swap")," (min 8 GByte, logical volume ",(0,i.kt)("inlineCode",{parentName:"li"},"swap"),")"))))),(0,i.kt)("li",{parentName:"ul"},"Choose ",(0,i.kt)("inlineCode",{parentName:"li"},"No automatic updates"),"."),(0,i.kt)("li",{parentName:"ul"},"Choose ",(0,i.kt)("inlineCode",{parentName:"li"},"OpenSSH server")," as software to install.",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Do not install any other software component.")," Everything you need will be installed later by OSISM.\nIn particular, it is not necessary to install a desktop environment."))),(0,i.kt)("li",{parentName:"ul"},"After completion, restart the system.")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/684abe8e.5aee6941.js b/assets/js/684abe8e.5aee6941.js new file mode 100644 index 0000000000..48a53e30ae --- /dev/null +++ b/assets/js/684abe8e.5aee6941.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9729],{3905:(e,r,a)=>{a.d(r,{Zo:()=>d,kt:()=>m});var t=a(67294);function o(e,r,a){return r in e?Object.defineProperty(e,r,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[r]=a,e}function n(e,r){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);r&&(t=t.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),a.push.apply(a,t)}return a}function i(e){for(var r=1;r=0||(o[a]=e[a]);return o}(e,r);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(o[a]=e[a])}return o}var c=t.createContext({}),p=function(e){var r=t.useContext(c),a=r;return e&&(a="function"==typeof e?e(r):i(i({},r),e)),a},d=function(e){var r=p(e.components);return t.createElement(c.Provider,{value:r},e.children)},u="mdxType",l={inlineCode:"code",wrapper:function(e){var r=e.children;return t.createElement(t.Fragment,{},r)}},g=t.forwardRef((function(e,r){var a=e.components,o=e.mdxType,n=e.originalType,c=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),u=p(a),g=o,m=u["".concat(c,".").concat(g)]||u[g]||l[g]||n;return a?t.createElement(m,i(i({ref:r},d),{},{components:a})):t.createElement(m,i({ref:r},d))}));function m(e,r){var a=arguments,o=r&&r.mdxType;if("string"==typeof e||o){var n=a.length,i=new Array(n);i[0]=g;var s={};for(var c in r)hasOwnProperty.call(r,c)&&(s[c]=r[c]);s.originalType=e,s[u]="string"==typeof e?e:o,i[1]=s;for(var p=2;p{a.r(r),a.d(r,{assets:()=>c,contentTitle:()=>i,default:()=>l,frontMatter:()=>n,metadata:()=>s,toc:()=>p});var t=a(87462),o=(a(67294),a(3905));const n={sidebar_label:"Resource Manager",sidebar_position:52},i="Resource Manager",s={unversionedId:"iaas/guides/operations-guide/openstack/day2-operations/resource-manager",id:"iaas/guides/operations-guide/openstack/day2-operations/resource-manager",title:"Resource Manager",description:"Octavia",source:"@site/docs/02-iaas/guides/operations-guide/openstack/day2-operations/resource-manager.md",sourceDirName:"02-iaas/guides/operations-guide/openstack/day2-operations",slug:"/iaas/guides/operations-guide/openstack/day2-operations/resource-manager",permalink:"/docs/iaas/guides/operations-guide/openstack/day2-operations/resource-manager",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/operations-guide/openstack/day2-operations/resource-manager.md",tags:[],version:"current",sidebarPosition:52,frontMatter:{sidebar_label:"Resource Manager",sidebar_position:52},sidebar:"docs",previous:{title:"Flavor Manager",permalink:"/docs/iaas/guides/operations-guide/openstack/day2-operations/flavor-manager"},next:{title:"Project Manager",permalink:"/docs/iaas/guides/operations-guide/openstack/day2-operations/project-manager"}},c={},p=[{value:"Octavia",id:"octavia",level:2},{value:"Amphora rotation",id:"amphora-rotation",level:3}],d={toc:p},u="wrapper";function l(e){let{components:r,...a}=e;return(0,o.kt)(u,(0,t.Z)({},d,a,{components:r,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"resource-manager"},"Resource Manager"),(0,o.kt)("h2",{id:"octavia"},"Octavia"),(0,o.kt)("h3",{id:"amphora-rotation"},"Amphora rotation"),(0,o.kt)("p",null,"Rotation of amphorae older than 30 days."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"$ python3 src/amphora.py --rotate\n2023-10-12 21:00:38 | INFO | Amphora 95a07c43-c0f9-44d2-bde8-a989e52427fa is older than 30 days\n2023-10-12 21:00:38 | INFO | Amphora 95a07c43-c0f9-44d2-bde8-a989e52427fa of loadbalancer 9008d3d7-f593-4bc3-941c-a740c178148d is rotated by a loadbalancer failover\n")))}l.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/685813dc.4342e07f.js b/assets/js/685813dc.4342e07f.js new file mode 100644 index 0000000000..22c7117784 --- /dev/null +++ b/assets/js/685813dc.4342e07f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3006],{3905:(e,r,t)=>{t.d(r,{Zo:()=>l,kt:()=>f});var n=t(67294);function a(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function o(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function c(e){for(var r=1;r=0||(a[t]=e[t]);return a}(e,r);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var s=n.createContext({}),p=function(e){var r=n.useContext(s),t=r;return e&&(t="function"==typeof e?e(r):c(c({},r),e)),t},l=function(e){var r=p(e.components);return n.createElement(s.Provider,{value:r},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},m=n.forwardRef((function(e,r){var t=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,l=i(e,["components","mdxType","originalType","parentName"]),u=p(t),m=a,f=u["".concat(s,".").concat(m)]||u[m]||d[m]||o;return t?n.createElement(f,c(c({ref:r},l),{},{components:t})):n.createElement(f,c({ref:r},l))}));function f(e,r){var t=arguments,a=r&&r.mdxType;if("string"==typeof e||a){var o=t.length,c=new Array(o);c[0]=m;var i={};for(var s in r)hasOwnProperty.call(r,s)&&(i[s]=r[s]);i.originalType=e,i[u]="string"==typeof e?e:a,c[1]=i;for(var p=2;p{t.r(r),t.d(r,{assets:()=>s,contentTitle:()=>c,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var n=t(87462),a=(t(67294),t(3905));const o={sidebar_label:"Resource Manager",sidebar_position:52},c="Resource Manager",i={unversionedId:"iaas/components/resource-manager",id:"iaas/components/resource-manager",title:"Resource Manager",description:"Octavia",source:"@site/docs/02-iaas/components/resource-manager.md",sourceDirName:"02-iaas/components",slug:"/iaas/components/resource-manager",permalink:"/docs/iaas/components/resource-manager",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/components/resource-manager.md",tags:[],version:"current",sidebarPosition:52,frontMatter:{sidebar_label:"Resource Manager",sidebar_position:52}},s={},p=[{value:"Octavia",id:"octavia",level:2},{value:"Amphora rotation",id:"amphora-rotation",level:3}],l={toc:p},u="wrapper";function d(e){let{components:r,...t}=e;return(0,a.kt)(u,(0,n.Z)({},l,t,{components:r,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"resource-manager"},"Resource Manager"),(0,a.kt)("h2",{id:"octavia"},"Octavia"),(0,a.kt)("h3",{id:"amphora-rotation"},"Amphora rotation"),(0,a.kt)("p",null,"Rotation of amphorae older than 30 days."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"$ python3 src/amphora.py --rotate\n2023-10-12 21:00:38 | INFO | Amphora 95a07c43-c0f9-44d2-bde8-a989e52427fa is older than 30 days\n2023-10-12 21:00:38 | INFO | Amphora 95a07c43-c0f9-44d2-bde8-a989e52427fa of loadbalancer 9008d3d7-f593-4bc3-941c-a740c178148d is rotated by a loadbalancer failover\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6875c492.177d3290.js b/assets/js/6875c492.177d3290.js new file mode 100644 index 0000000000..3a42eac0d6 --- /dev/null +++ b/assets/js/6875c492.177d3290.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8610],{99703:(e,t,a)=>{a.d(t,{Z:()=>s});var n=a(67294),l=a(95999),r=a(32244);function s(e){const{metadata:t}=e,{previousPage:a,nextPage:s}=t;return n.createElement("nav",{className:"pagination-nav","aria-label":(0,l.I)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"})},a&&n.createElement(r.Z,{permalink:a,title:n.createElement(l.Z,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)"},"Newer Entries")}),s&&n.createElement(r.Z,{permalink:s,title:n.createElement(l.Z,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)"},"Older Entries"),isNext:!0}))}},79985:(e,t,a)=>{a.d(t,{Z:()=>s});var n=a(67294),l=a(9460),r=a(30390);function s(e){let{items:t,component:a=r.Z}=e;return n.createElement(n.Fragment,null,t.map((e=>{let{content:t}=e;return n.createElement(l.n,{key:t.metadata.permalink,content:t},n.createElement(a,null,n.createElement(t,null)))})))}},41714:(e,t,a)=>{a.r(t),a.d(t,{default:()=>E});var n=a(67294),l=a(86010),r=a(95999),s=a(88824),o=a(1944),i=a(35281),g=a(39960),c=a(39058),m=a(99703),p=a(90197),u=a(79985);function d(e){const t=function(){const{selectMessage:e}=(0,s.c)();return t=>e(t,(0,r.I)({id:"theme.blog.post.plurals",description:'Pluralized label for "{count} posts". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One post|{count} posts"},{count:t}))}();return(0,r.I)({id:"theme.blog.tagTitle",description:"The title of the page for a blog tag",message:'{nPosts} tagged with "{tagName}"'},{nPosts:t(e.count),tagName:e.label})}function h(e){let{tag:t}=e;const a=d(t);return n.createElement(n.Fragment,null,n.createElement(o.d,{title:a}),n.createElement(p.Z,{tag:"blog_tags_posts"}))}function b(e){let{tag:t,items:a,sidebar:l,listMetadata:s}=e;const o=d(t);return n.createElement(c.Z,{sidebar:l},n.createElement("header",{className:"margin-bottom--xl"},n.createElement("h1",null,o),n.createElement(g.Z,{href:t.allTagsPath},n.createElement(r.Z,{id:"theme.tags.tagsPageLink",description:"The label of the link targeting the tag list page"},"View All Tags"))),n.createElement(u.Z,{items:a}),n.createElement(m.Z,{metadata:s}))}function E(e){return n.createElement(o.FG,{className:(0,l.Z)(i.k.wrapper.blogPages,i.k.page.blogTagPostListPage)},n.createElement(h,e),n.createElement(b,e))}}}]); \ No newline at end of file diff --git a/assets/js/699c0e5c.2f09704f.js b/assets/js/699c0e5c.2f09704f.js new file mode 100644 index 0000000000..c72fcd7366 --- /dev/null +++ b/assets/js/699c0e5c.2f09704f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5101],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>m});var n=a(67294);function o(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function r(e){for(var t=1;t=0||(o[a]=e[a]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(o[a]=e[a])}return o}var l=n.createContext({}),d=function(e){var t=n.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):r(r({},t),e)),a},c=function(e){var t=d(e.components);return n.createElement(l.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var a=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=d(a),h=o,m=p["".concat(l,".").concat(h)]||p[h]||u[h]||i;return a?n.createElement(m,r(r({ref:t},c),{},{components:a})):n.createElement(m,r({ref:t},c))}));function m(e,t){var a=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=a.length,r=new Array(i);r[0]=h;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:o,r[1]=s;for(var d=2;d{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>u,frontMatter:()=>i,metadata:()=>s,toc:()=>d});var n=a(87462),o=(a(67294),a(3905));const i={title:"Decisions for the Volume Type Standard",type:"Decision Record",status:"Draft",track:"IaaS"},r=void 0,s={unversionedId:"scs-0111-v1-volume-type-decisions",id:"scs-0111-v1-volume-type-decisions",title:"Decisions for the Volume Type Standard",description:"Introduction",source:"@site/standards/scs-0111-v1-volume-type-decisions.md",sourceDirName:".",slug:"/scs-0111-v1-volume-type-decisions",permalink:"/standards/scs-0111-v1-volume-type-decisions",draft:!1,tags:[],version:"current",frontMatter:{title:"Decisions for the Volume Type Standard",type:"Decision Record",status:"Draft",track:"IaaS"},sidebar:"standards",previous:{title:"SCS-0111",permalink:"/standards/standards/scs-0111"},next:{title:"SCS-0212",permalink:"/standards/standards/scs-0212"}},l={},d=[{value:"Introduction",id:"introduction",level:2},{value:"Motivation",id:"motivation",level:2},{value:"Design Considerations",id:"design-considerations",level:2},{value:"Options considered",id:"options-considered",level:3},{value:"Encryption",id:"encryption",level:4},{value:"Backend Name",id:"backend-name",level:4},{value:"Availability Zones",id:"availability-zones",level:4},{value:"Multiattach",id:"multiattach",level:4},{value:"Replication",id:"replication",level:4},{value:"QoS",id:"qos",level:4},{value:"Other Backend-specific Highlights",id:"other-backend-specific-highlights",level:4},{value:"Open questions",id:"open-questions",level:2},{value:"Decision",id:"decision",level:2},{value:"Related Documents",id:"related-documents",level:2}],c={toc:d},p="wrapper";function u(e){let{components:t,...a}=e;return(0,o.kt)(p,(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"introduction"},"Introduction"),(0,o.kt)("p",null,"Volumes in OpenStack are virtual drives. They are managed by the storage service Cinder, which abstracts creation and usage of many different storage backends. While it is possible to use a backend like lvm which can reside on the same host as the hypervisor, the SCS wants to make a more clear differentiation between volumes and the ephemeral storage of a virtual machine. For all SCS deployments we want to assume that volumes are always residing in a storage backend that is NOT on the same host as a hypervisor - in short terms: Volumes are network storage. Ephemeral storage on the other hand is the only storage residing on a compute host. It is created by creating a VM directly from an Image and is automatically los as soon as the VM cease to exist. Volumes on the other hand have to be created from Images and only after that can be used for VMs. They are persistent and will remain in the last state a VM has written on them before they cease to exit. Being persistent and not relying on the host where the VM resides, Volumes can easily be attached to another VM in case of a node outage and VMs be migrated way more easily, because only metadata and data in RAM has to be shifted to another host, accelerating any migration or evacuation of a VM."),(0,o.kt)("p",null,"Volume Types are used to classify volumes and provide a basic decision for what kind of volume should be created. These volume types can sometimes very be backend-specific and it might be hard for a user to choose the most suitable volume type, if there is more than one default type. Nevertheless the most of configuration is done in the backends themself, so volume types only work as a rough classification."),(0,o.kt)("h2",{id:"motivation"},"Motivation"),(0,o.kt)("p",null,"We want to standardize a few varieties of volume types. While a user can choose simple things like size when creating a volume, Volume Types define a few broader aspects of volume. Encryption of volumes for example is solely decided by the volume type. And whether the volume will be replicated is a mix between definiton in the volume type and backend specific configuration, but it's visiblity can only be reached in the volume type."),(0,o.kt)("p",null,"In General: what the different volume types are capable of is highly dependend on both the used backend and the configurations of OpenStack. A few options are worth being at least recommended."),(0,o.kt)("h2",{id:"design-considerations"},"Design Considerations"),(0,o.kt)("p",null,"We want to have a discoverable Standard. So there should be no naming conventions as per request by operators."),(0,o.kt)("p",null,"This first decision will have impacts on upstream OpenStack development, as those things, that would be nice to discover, may not be currently dicoverable by users or not at all."),(0,o.kt)("p",null,"There are severel aspects of volume types, which will be discussed in the following:"),(0,o.kt)("h3",{id:"options-considered"},"Options considered"),(0,o.kt)("h4",{id:"encryption"},"Encryption"),(0,o.kt)("p",null,"Encryption for volumes is an option which has to be configured within the volume type. As an admin it is possible to set encryption-provider, key size, cipher and control location. As an admin it is also currently possible to see these configurations in a volume type with list and show commands. A user should not see these parameters in detail, but a boolean value that descibes whether encryption is used or not. Currently this is not possible in upstream OpenStack."),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Conclusion"),": This is a solid aspect to be standardized. But it will need work on OpenStack, to have a boolean value presented to the users."),(0,o.kt)("h4",{id:"backend-name"},"Backend Name"),(0,o.kt)("p",null,"OpenStack Cinder works with a lot of different backends. They all have some kind of special features, which might be attractive for a user. But showing the name of the backend to users is also considered a security risk by Cinder developers. Overall it is always an option to make users aware of special features through the name and description of a volume type and sometimes even through extra_specs."),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Conclusion"),": This should not be standardized."),(0,o.kt)("h4",{id:"availability-zones"},"Availability Zones"),(0,o.kt)("p",null,"Availability Zones are used in Nova and Cinder seperatly to provide an often also physical separation of compute hosts or storage nodes. This leads to two options to consider:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Multiple Volume AZs: This might be used if there are different backends present in one IaaS structure. The different volume types are usually used for the different volume AZs. This makes migration between those AZs only be possible for administrators.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Volume Types that can be attached to multiple Nova Azs: This option can be seen in the extra specs of a volume type also by normal users. Another option is to use backend specific options, as for example with ceph that directly interacts with nova for this. In that case there will not be any visible extra specs for the users."))),(0,o.kt)("p",null,"Another question is how many providers use one of these options or both."),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Conclusion"),": The first part doesn't make much sense to standardize, as migration between the volume types can only be done by admins. However the second part might be noteable, but due to the variety of configuration options very hard to standardize."),(0,o.kt)("h4",{id:"multiattach"},"Multiattach"),(0,o.kt)("p",null,"It is possible in a few backends to attach a volume to multiple VMs. This has to be configured in the Volume Type and this information is also accessable for users. Nevertheless this option also needs a lot of work from users, as those types of volumes have to have a file system, that is capable of multiattach. Many providers don't provide multiattach."),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Conclusion"),": It might be noteable, that this already is a discoverable option."),(0,o.kt)("h4",{id:"replication"},"Replication"),(0,o.kt)("p",null,"Replication states, whether or not there are multiple replicas of a volume. Thus answers the question, whether the data could survive a node outage. Again there are different ways to achive replicated volumes. It can either be defined in the volume type and is discoverable also by normal users or it is configured in the backend. The last option is usually used with ceph for example. This makes it hard to discover, whether a volume is replicated or not. Another point is the number of replicas, that exist."),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Conclusion"),": Replication is a good option to be standardized. Whether this should be done as a boolean option or if the number of replicas is also something users need to know should still be discussed. Nevertheless due to the different options to configure replication this will be quite complex."),(0,o.kt)("h4",{id:"qos"},"QoS"),(0,o.kt)("p",null,"Quality of Service parameters can be stated in a volume qos object. These objects can then be associated to a volume type (or directly to a volume as an admin only option). But this is optional and thus even good or very good volume QoS parameters that are aquired through hardware configuration and storage parameters, might go by unmentioned.\nFurthermore the indirection makes it harder to discover the qos for a volume type. Only admins will see the associated qos ID and will have to take a closer look at the qos after discovering the volume type. PLUS: there can only be one qos association for one volume type. But a qos can be used for multiple volumes."),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Conclusion"),": The benefit of displaying qos parameters is clear, thus this option should be noted. But are volume qos objects widely used? If not, standardization process would be too much work."),(0,o.kt)("h4",{id:"other-backend-specific-highlights"},"Other Backend-specific Highlights"),(0,o.kt)("p",null,"While every option above described things, that can at least be partly or for admins only visible in volume types, there are many different configuration options in hardware and backend providers can make use of. It is sadly not possible to get them into the volume type directly, but we recommend, that notable configurations are written into the description of a volume type to achieve transparency for the users."),(0,o.kt)("h2",{id:"open-questions"},"Open questions"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"How often are the different options used by providers and users respectively? Especially important for qos and replication!"),(0,o.kt)("li",{parentName:"ol"},"Regarding Replication: Is the number of replicas needed by users and is it okay for providers to provide this information?")),(0,o.kt)("h2",{id:"decision"},"Decision"),(0,o.kt)("table",null,(0,o.kt)("thead",{parentName:"table"},(0,o.kt)("tr",{parentName:"thead"},(0,o.kt)("th",{parentName:"tr",align:null},"Aspect"),(0,o.kt)("th",{parentName:"tr",align:null},"Standardize?"),(0,o.kt)("th",{parentName:"tr",align:null},"Discoverability"),(0,o.kt)("th",{parentName:"tr",align:null},"other Things"))),(0,o.kt)("tbody",{parentName:"table"},(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"encryption"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("strong",{parentName:"td"},"Recommended")),(0,o.kt)("td",{parentName:"tr",align:null},"work needed"),(0,o.kt)("td",{parentName:"tr",align:null},"extra_spec: encrypted=True/False")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Backend name"),(0,o.kt)("td",{parentName:"tr",align:null},"-"),(0,o.kt)("td",{parentName:"tr",align:null},"-"),(0,o.kt)("td",{parentName:"tr",align:null},"-")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"AZs"),(0,o.kt)("td",{parentName:"tr",align:null},"-"),(0,o.kt)("td",{parentName:"tr",align:null},"-"),(0,o.kt)("td",{parentName:"tr",align:null},"describe as optional and backend-dependend")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"multiattach"),(0,o.kt)("td",{parentName:"tr",align:null},"-"),(0,o.kt)("td",{parentName:"tr",align:null},"yes"),(0,o.kt)("td",{parentName:"tr",align:null},"describe as optional")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Replication"),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("strong",{parentName:"td"},"Recommended")),(0,o.kt)("td",{parentName:"tr",align:null},"lot of work"),(0,o.kt)("td",{parentName:"tr",align:null},"either get from backend to OS or as extra_spec defined by deployer")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Number of Replicas, etc"),(0,o.kt)("td",{parentName:"tr",align:null},"?"),(0,o.kt)("td",{parentName:"tr",align:null},"lot of work"),(0,o.kt)("td",{parentName:"tr",align:null},"optional, work on it after Replication is standardized")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Volume QoS"),(0,o.kt)("td",{parentName:"tr",align:null},"?"),(0,o.kt)("td",{parentName:"tr",align:null},"admin only"),(0,o.kt)("td",{parentName:"tr",align:null},"needs further discussion, should be at least described as optional")))),(0,o.kt)("h2",{id:"related-documents"},"Related Documents"),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://input.scs.community/JnaY5i70R_yc7JkSNVtlKQ"},"This is an etherpad")," with a further look into the Options and a few examples."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/69b09ea9.9965528d.js b/assets/js/69b09ea9.9965528d.js new file mode 100644 index 0000000000..e5667b484e --- /dev/null +++ b/assets/js/69b09ea9.9965528d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[498],{22332:s=>{s.exports=JSON.parse('{"label":"community","permalink":"/blog/tags/community","allTagsPath":"/blog/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/6a15e24c.e21634b6.js b/assets/js/6a15e24c.e21634b6.js new file mode 100644 index 0000000000..4fa1d6ce50 --- /dev/null +++ b/assets/js/6a15e24c.e21634b6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9658],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>m});var o=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=o.createContext({}),p=function(e){var t=o.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=p(e.components);return o.createElement(c.Provider,{value:t},e.children)},l="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},h=o.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,c=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),l=p(n),h=a,m=l["".concat(c,".").concat(h)]||l[h]||u[h]||r;return n?o.createElement(m,i(i({ref:t},d),{},{components:n})):o.createElement(m,i({ref:t},d))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,i=new Array(r);i[0]=h;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[l]="string"==typeof e?e:a,i[1]=s;for(var p=2;p{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>r,metadata:()=>s,toc:()=>p});var o=n(87462),a=(n(67294),n(3905));const r={title:"OpenStack Federation via OpenID-Connect",type:null,status:"Draft",track:"Global"},i=void 0,s={unversionedId:"operations/iam/openstack-federation-via-oidc",id:"operations/iam/openstack-federation-via-oidc",title:"OpenStack Federation via OpenID-Connect",description:"Keystone supports federating authentication and authorization decisions via several mechanisms",source:"@site/dev-docs/operations/iam/openstack-federation-via-oidc.md",sourceDirName:"operations/iam",slug:"/operations/iam/openstack-federation-via-oidc",permalink:"/dev-docs/operations/iam/openstack-federation-via-oidc",draft:!1,tags:[],version:"current",frontMatter:{title:"OpenStack Federation via OpenID-Connect",type:null,status:"Draft",track:"Global"},sidebar:"devDocs",previous:{title:"Identity Federation in SCS",permalink:"/dev-docs/operations/iam/identity-federation-in-scs"},next:{title:"Zuul users guide",permalink:"/dev-docs/operations/operations/zuul-ci-cd-quickstart-user-guide"}},c={},p=[{value:"1. Keystone",id:"1-keystone",level:2},{value:"1.1 Keycloak IdP realm discovery",id:"11-keycloak-idp-realm-discovery",level:3},{value:"1.2 Keystone mapping of token claims",id:"12-keystone-mapping-of-token-claims",level:3},{value:"1.3 Horizon WebSSO for federated users",id:"13-horizon-websso-for-federated-users",level:3},{value:"1.4 OpenStack CLI and API access for federated users",id:"14-openstack-cli-and-api-access-for-federated-users",level:3},{value:"1.5 SSO Federation between to SCS deployments",id:"15-sso-federation-between-to-scs-deployments",level:3}],d={toc:p},l="wrapper";function u(e){let{components:t,...n}=e;return(0,a.kt)(l,(0,o.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"Keystone supports federating authentication and authorization decisions via several mechanisms\nas ",(0,a.kt)("a",{parentName:"p",href:"https://docs.openstack.org/keystone/latest/admin/federation/introduction.html"},"documented by the project"),"."),(0,a.kt)("p",null,"In SCS OpenID Connect is used for federation between Keystone and the IdP, which is\n",(0,a.kt)("a",{parentName:"p",href:"https://docs.scs.community/standards/scs-0300-v1-requirements-for-sso-identity-federation"},"currently provided by Keycloak"),"\nin SCS."),(0,a.kt)("p",null,"The following sections describe the setup."),(0,a.kt)("h2",{id:"1-keystone"},"1. Keystone"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://docs.openstack.org/keystone/latest/admin/federation/federated_identity.html"},"Keystone supports federated identities"),".\nTo allow SCS to consume identities managed in external IAM solutions,\nfederation protocols like OpenID Connect or SAML can be used.\nKeystone currently makes use of third party apache modules like\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/OpenIDC/mod_auth_openidc"},"mod_auth_openidc"),",\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/OpenIDC/mod_oauth2"},"mod_oauth2")," and\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/UNINETT/mod_auth_mellon"},"mod_auth_mellon")," to delegate\nauthentication to a SSO IdP (i.e. SAML IdP or OpenID Connect provider)."),(0,a.kt)("p",null,"In OpenStack the apache modules are configured using the\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/openstack/kolla-ansible/tree/master/ansible/roles/keystone/templates"},"wsgi-keystone.conf template"),"."),(0,a.kt)("p",null,"In SCS we make use of the OAuth 2.0 Authorization Code Grant flow between Keystone and Keycloak\nand use PKCE (RFC 7636) with the S256 challenge method."),(0,a.kt)("p",null,"In addition to the usual SSL CA of the environment, Keycloak uses separate certificates to sign the OIDC tokens."),(0,a.kt)("p",null,"Due to the way the Keystone container image runs apache (in the foreground) and keystone itself (as WSGI module),\nreconfiguring the apache URL locations on the fly is not possible currently without a downtime of several seconds.\nThat is the reason why SCS currently makes use of a single central proxy realm in Keycloak, to which Keystone\nconnects."),(0,a.kt)("h3",{id:"11-keycloak-idp-realm-discovery"},"1.1 Keycloak IdP realm discovery"),(0,a.kt)("p",null,"Keycloak offers standard OIDC service discovery via ",(0,a.kt)("inlineCode",{parentName:"p"},".well-known")," documents to advertise its endpoints."),(0,a.kt)("p",null,"In SCS we want to represent each customer by a separate dedicated Keycloak realm, which can enventually be used\nfor customer self service and to federate out to customer owned IAM external solutions."),(0,a.kt)("p",null,"In the SCS testbed we currently experiment with the implications of using a single central proxy realm in Keycloak\nand chaining federation from there to customer specific realms, also hosted in the same Keycloak instance.\nTo make this usable, SCS makes use of the\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/sventorben/keycloak-home-idp-discovery"},"Keycloak Home IdP Discovery"),"\nextension."),(0,a.kt)("h3",{id:"12-keystone-mapping-of-token-claims"},"1.2 Keystone mapping of token claims"),(0,a.kt)("p",null,"Upon login of a user Keystone evaluates the credentials obtained from the ID token that the IdP issued.\nThese include group memberships and roles, which can be used to assign the user to a certain project.\nKeystone maps these external identities to internal (shadow) users.\nIt can either attempt to map the obtained information to a ",(0,a.kt)("inlineCode",{parentName:"p"},"local")," type user, which needs to be\nprovisioned before authentication by external tooling, or it can be instructed via the mapping to\ngenerate an ",(0,a.kt)("inlineCode",{parentName:"p"},"ephemeral")," type user. ",(0,a.kt)("inlineCode",{parentName:"p"},"ephemeral")," users are cleaned up automatically after some time\nof inactivity and with that, they lose access to projects, iff the access is granted indirectly\nvia group membership rather than directly to the user itself."),(0,a.kt)("p",null,"Group memberships for ",(0,a.kt)("inlineCode",{parentName:"p"},"ephemeral")," users are only represented via their tokens, but not stored in the\nKeystone backend database."),(0,a.kt)("p",null,"After successful authorization Keystone issues an OpenStack specific ",(0,a.kt)("inlineCode",{parentName:"p"},"fernet")," token to the user,\nwhich is the currency that is understood by other OpenStack services and can be used to access them."),(0,a.kt)("p",null,"In SCS we want to represent each customer by a sepatate dedicated OpenStack domain to host\ntheir projects and (shadow) user accounts."),(0,a.kt)("p",null,"The processing of information from the OIDC tokens is configured by two parts. The first part is the\n",(0,a.kt)("inlineCode",{parentName:"p"},"rules.json")," mapping which is described in the\n",(0,a.kt)("a",{parentName:"p",href:"https://docs.openstack.org/keystone/latest/admin/federation/mapping_combinations.html"},"OpenStack federation mapping combinations"),"\ndocument. This file is used to configure Keystones internal mapping engine\nand it needs to be attached to some OpenStack domain, which is named ",(0,a.kt)("inlineCode",{parentName:"p"},"keycloak")," by default in SCS."),(0,a.kt)("p",null,"The second (static) part is the ",(0,a.kt)("inlineCode",{parentName:"p"},"[auth]")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"[mapped]")," sections in ",(0,a.kt)("inlineCode",{parentName:"p"},"keystone.conf")," (see e.g.\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/osism/testbed/tree/main/environments/kolla/files/overlays/keystone"},"the overlays currently used in the OSISM testbed"),"\n)."),(0,a.kt)("h3",{id:"13-horizon-websso-for-federated-users"},"1.3 Horizon WebSSO for federated users"),(0,a.kt)("p",null,"The Horizon dashboard supports login via OpenID Connect via Keystone endpoint.\nSCS adjusted the logout behavior to invalidate both, the OpenID Connect session\nwith the IdP and the Keystone token."),(0,a.kt)("h3",{id:"14-openstack-cli-and-api-access-for-federated-users"},"1.4 OpenStack CLI and API access for federated users"),(0,a.kt)("p",null,"To support OpenStack CLI and API access, SCS implemented support for the OIDC Device Authorization Grant\nin Keystone. On top we added support for PKCE (RFC 7636) in combination with that."),(0,a.kt)("h3",{id:"15-sso-federation-between-to-scs-deployments"},"1.5 SSO Federation between to SCS deployments"),(0,a.kt)("p",null,"To show the potential of this approach to federation SCS created a\n",(0,a.kt)("a",{parentName:"p",href:"https://docs-staging.scs.community/docs/iam/intra-SCS-federation-setup-description-for-osism-doc-operations"},"Howto for OIDC federation between SCS deployments"),"."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6ad9ab45.1eada8ec.js b/assets/js/6ad9ab45.1eada8ec.js new file mode 100644 index 0000000000..97e1b91e36 --- /dev/null +++ b/assets/js/6ad9ab45.1eada8ec.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8235],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function s(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var l=r.createContext({}),d=function(e){var t=r.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},c=function(e){var t=d(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},u=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,s=e.originalType,l=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),p=d(a),u=n,m=p["".concat(l,".").concat(u)]||p[u]||f[u]||s;return a?r.createElement(m,o(o({ref:t},c),{},{components:a})):r.createElement(m,o({ref:t},c))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var s=a.length,o=new Array(s);o[0]=u;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[p]="string"==typeof e?e:n,o[1]=i;for(var d=2;d{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>f,frontMatter:()=>s,metadata:()=>i,toc:()=>d});var r=a(87462),n=(a(67294),a(3905));const s={},o="SCS-0103: Standard Flavors",i={unversionedId:"iaas/scs-0103",id:"iaas/scs-0103",title:"SCS-0103: Standard Flavors",description:"The SCS-0103 standard outlines mandatory and recommended specifications for flavors and properties in OpenStack environments to ensure uniformity across SCS clouds. Mandatory and recommended flavors are defined with specific configurations of vCPUs, vCPU types, RAM, and root disk sizes, alongside extra specs like scscpu-type, and scs:diskN-type to detail the flavor's specifications. This standard facilitates guaranteed availability and consistency of flavors, simplifying the deployment process for DevOps teams.",source:"@site/standards/iaas/scs-0103.md",sourceDirName:"iaas",slug:"/iaas/scs-0103",permalink:"/standards/iaas/scs-0103",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"standards",previous:{title:"SCS Image Metadata Standard",permalink:"/standards/scs-0102-v1-image-metadata"},next:{title:"SCS Standard Flavors and Properties",permalink:"/standards/scs-0103-v1-standard-flavors"}},l={},d=[],c={toc:d},p="wrapper";function f(e){let{components:t,...a}=e;return(0,n.kt)(p,(0,r.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"scs-0103-standard-flavors"},"SCS-0103: Standard Flavors"),(0,n.kt)("p",null,"The SCS-0103 standard outlines mandatory and recommended specifications for flavors and properties in OpenStack environments to ensure uniformity across SCS clouds. Mandatory and recommended flavors are defined with specific configurations of vCPUs, vCPU types, RAM, and root disk sizes, alongside extra specs like scs:name-vN, scs:cpu-type, and scs:diskN-type to detail the flavor's specifications. This standard facilitates guaranteed availability and consistency of flavors, simplifying the deployment process for DevOps teams."),(0,n.kt)("table",null,(0,n.kt)("thead",{parentName:"table"},(0,n.kt)("tr",{parentName:"thead"},(0,n.kt)("th",{parentName:"tr",align:null},"Version"),(0,n.kt)("th",{parentName:"tr",align:null},"Type"),(0,n.kt)("th",{parentName:"tr",align:null},"State"),(0,n.kt)("th",{parentName:"tr",align:null},"stabilized"),(0,n.kt)("th",{parentName:"tr",align:null},"obsoleted"))),(0,n.kt)("tbody",{parentName:"table"},(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/scs-0103-v1-standard-flavors"},"SCS-0103-v1")),(0,n.kt)("td",{parentName:"tr",align:null},"Standard"),(0,n.kt)("td",{parentName:"tr",align:null},"\ud83d\udfe0 Draft"),(0,n.kt)("td",{parentName:"tr",align:null},"-"),(0,n.kt)("td",{parentName:"tr",align:null},"-")))))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6c33bb99.28960205.js b/assets/js/6c33bb99.28960205.js new file mode 100644 index 0000000000..bc832d97d6 --- /dev/null +++ b/assets/js/6c33bb99.28960205.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4981],{3905:(e,n,t)=>{t.d(n,{Zo:()=>c,kt:()=>g});var r=t(67294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function o(e){for(var n=1;n=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var p=r.createContext({}),s=function(e){var n=r.useContext(p),t=n;return e&&(t="function"==typeof e?e(n):o(o({},n),e)),t},c=function(e){var n=s(e.components);return r.createElement(p.Provider,{value:n},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},u=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,i=e.originalType,p=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),d=s(t),u=a,g=d["".concat(p,".").concat(u)]||d[u]||m[u]||i;return t?r.createElement(g,o(o({ref:n},c),{},{components:t})):r.createElement(g,o({ref:n},c))}));function g(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var i=t.length,o=new Array(i);o[0]=u;var l={};for(var p in n)hasOwnProperty.call(n,p)&&(l[p]=n[p]);l.originalType=e,l[d]="string"==typeof e?e:a,o[1]=l;for(var s=2;s{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var r=t(87462),a=(t(67294),t(3905));const i={sidebar_label:"Ceph",sidebar_position:40},o="Ceph",l={unversionedId:"iaas/guides/configuration-guide/ceph",id:"iaas/guides/configuration-guide/ceph",title:"Ceph",description:"Unique Identifier",source:"@site/docs/02-iaas/guides/configuration-guide/ceph.md",sourceDirName:"02-iaas/guides/configuration-guide",slug:"/iaas/guides/configuration-guide/ceph",permalink:"/docs/iaas/guides/configuration-guide/ceph",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/configuration-guide/ceph.md",tags:[],version:"current",sidebarPosition:40,frontMatter:{sidebar_label:"Ceph",sidebar_position:40},sidebar:"docs",previous:{title:"Services",permalink:"/docs/iaas/guides/configuration-guide/services/"},next:{title:"OpenStack",permalink:"/docs/iaas/guides/configuration-guide/openstack/"}},p={},s=[{value:"Unique Identifier",id:"unique-identifier",level:2},{value:"Client",id:"client",level:2},{value:"Swappiness",id:"swappiness",level:2},{value:"RGW service",id:"rgw-service",level:2},{value:"Extra pools",id:"extra-pools",level:2}],c={toc:s},d="wrapper";function m(e){let{components:n,...t}=e;return(0,a.kt)(d,(0,r.Z)({},c,t,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"ceph"},"Ceph"),(0,a.kt)("h2",{id:"unique-identifier"},"Unique Identifier"),(0,a.kt)("p",null,"The File System ID is a unique identifier for the cluster.\nThe identifier is set via the parameter ",(0,a.kt)("inlineCode",{parentName:"p"},"fsid")," in ",(0,a.kt)("inlineCode",{parentName:"p"},"environments/ceph/configuration.yml"),"\nand must be unique. It can be generated with ",(0,a.kt)("inlineCode",{parentName:"p"},"uuidgen"),"."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml",metastring:'title="environments/ceph/configuration.yml"',title:'"environments/ceph/configuration.yml"'},"fsid: c2120a4a-669c-4769-a32c-b7e9d7b848f4\n")),(0,a.kt)("h2",{id:"client"},"Client"),(0,a.kt)("p",null,"The ",(0,a.kt)("inlineCode",{parentName:"p"},"client.admin")," keyring is placed in the file ",(0,a.kt)("inlineCode",{parentName:"p"},"environments/infrastructure/files/ceph/ceph.client.admin.keyring"),"."),(0,a.kt)("h2",{id:"swappiness"},"Swappiness"),(0,a.kt)("p",null,"The swappiness is set via the ",(0,a.kt)("inlineCode",{parentName:"p"},"os_tuning_params")," dictionary. The dictionary can\nonly be completely overwritten via an entry in the file ",(0,a.kt)("inlineCode",{parentName:"p"},"environments/ceph/configuration.yml"),"."),(0,a.kt)("p",null,"By default, the dictionary looks like this:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},'os_tuning_params:\n - { name: fs.file-max, value: 26234859 }\n - { name: vm.zone_reclaim_mode, value: 0 }\n - { name: vm.swappiness, value: 10 }\n - { name: vm.min_free_kbytes, value: "{{ vm_min_free_kbytes }}" }\n')),(0,a.kt)("p",null,"The sysctl paremeters are written to the file ",(0,a.kt)("inlineCode",{parentName:"p"},"/etc/sysctl.d/ceph-tuning.conf"),"\non the storage nodes."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"# cat /etc/sysctl.d/ceph-tuning.conf\nfs.aio-max-nr=1048576\nfs.file-max=26234859\nvm.zone_reclaim_mode=0\nvm.swappiness=10\nvm.min_free_kbytes=4194303\n")),(0,a.kt)("h2",{id:"rgw-service"},"RGW service"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"Add following configuration in ",(0,a.kt)("inlineCode",{parentName:"p"},"environments/ceph/configuration.yml")),(0,a.kt)("pre",{parentName:"li"},(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},'ceph_conf_overrides:\n "client.rgw.{{ hostvars[inventory_hostname][\'ansible_hostname\'] }}.rgw0":\n "rgw content length compat": "true"\n "rgw enable apis": "swift, s3, admin"\n "rgw keystone accepted roles": "member, admin"\n "rgw keystone accepted admin roles": "admin"\n "rgw keystone admin domain": "default"\n "rgw keystone admin password": "{{ ceph_rgw_keystone_password }}"\n "rgw keystone admin project": "service"\n "rgw keystone admin tenant": "service"\n "rgw keystone admin user": "ceph_rgw"\n "rgw keystone api version": "3"\n "rgw keystone url": "https://api-int.testbed.osism.xyz:5000"\n "rgw keystone verify ssl": "false"\n "rgw keystone implicit tenants": "true"\n "rgw s3 auth use keystone": "true"\n "rgw swift account in url": "true"\n "rgw swift versioning enabled": "true"\n')),(0,a.kt)("p",{parentName:"li"},"If the ",(0,a.kt)("inlineCode",{parentName:"p"},"ceph_conf_overrides")," parameter already exists in ",(0,a.kt)("inlineCode",{parentName:"p"},"environments/ceph/configuration.yml"),",\nexpand it and do not overwrite it."),(0,a.kt)("p",{parentName:"li"},"If self-signed SSL certificates are used, two additional parameters must be set."),(0,a.kt)("pre",{parentName:"li"},(0,a.kt)("code",{parentName:"pre"},' "rgw keystone verify ssl": "false"\n "rgw verify ssl": "false"\n')),(0,a.kt)("p",{parentName:"li"},"For all possible configuration parameters visit the\n",(0,a.kt)("a",{parentName:"p",href:"https://docs.ceph.com/en/quincy/radosgw/config-ref/"},"Ceph configuration reference"),".")),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"Add the ",(0,a.kt)("inlineCode",{parentName:"p"},"ceph_rgw_keystone_password")," from ",(0,a.kt)("inlineCode",{parentName:"p"},"environments/kolla/secrets.yml")," to\n",(0,a.kt)("inlineCode",{parentName:"p"},"environments/ceph/secrets.yml"),".")),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"Add following configuration in ",(0,a.kt)("inlineCode",{parentName:"p"},"environments/kolla/configuration.yml")),(0,a.kt)("pre",{parentName:"li"},(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},"enable_ceph_rgw: true\nenable_ceph_rgw_keystone: true\n\nceph_rgw_swift_compatibility: false\nceph_rgw_swift_account_in_url: true\n")))),(0,a.kt)("h2",{id:"extra-pools"},"Extra pools"),(0,a.kt)("p",null,"Extra pools can be defined via the ",(0,a.kt)("inlineCode",{parentName:"p"},"openstack_pools_extra")," parameter."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml",metastring:'title="inventory/group_vars/generic/ceph.yml"',title:'"inventory/group_vars/generic/ceph.yml"'},'openstack_cinder_extra001_pool:\n name: extra001\n pg_num: "{{ openstack_pool_default_pg_num }}"\n pgp_num: "{{ openstack_pool_default_pg_num }}"\n rule_name: "replicated_rule"\n min_size: "{{ openstack_pool_default_min_size }}"\n application: "rbd"\n\nopenstack_pools_extra:\n - "{{ openstack_cinder_extra001_pool }}"\n')),(0,a.kt)("p",null,"If more than one Ceph cluster is managed with one manager, do not place the\nparameters in ",(0,a.kt)("inlineCode",{parentName:"p"},"inventory/group_vars/generic")," but in a corresponding directory."),(0,a.kt)("p",null,"If, for example, the inventory group of the Ceph cluster on which the additional\npools are to be created is ",(0,a.kt)("inlineCode",{parentName:"p"},"ceph.rbd"),", then the parameters would be stored in\n",(0,a.kt)("inlineCode",{parentName:"p"},"inventory/group_vars/ceph.rbd.yml")," accordingly."),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Parameter"),(0,a.kt)("th",{parentName:"tr",align:null},"Default value"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"openstack_pool_default_pg_num"),(0,a.kt)("td",{parentName:"tr",align:null},"64")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},"openstack_pool_default_min_size"),(0,a.kt)("td",{parentName:"tr",align:null},"0")))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6c4198a1.ff28e6e9.js b/assets/js/6c4198a1.ff28e6e9.js new file mode 100644 index 0000000000..4c84f342a7 --- /dev/null +++ b/assets/js/6c4198a1.ff28e6e9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6686],{3905:(e,t,a)=>{a.d(t,{Zo:()=>m,kt:()=>k});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),l=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},m=function(e){var t=l(e.components);return n.createElement(p.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,m=s(e,["components","mdxType","originalType","parentName"]),c=l(a),u=r,k=c["".concat(p,".").concat(u)]||c[u]||d[u]||o;return a?n.createElement(k,i(i({ref:t},m),{},{components:a})):n.createElement(k,i({ref:t},m))}));function k(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,i=new Array(o);i[0]=u;var s={};for(var p in t)hasOwnProperty.call(t,p)&&(s[p]=t[p]);s.originalType=e,s[c]="string"==typeof e?e:r,i[1]=s;for(var l=2;l{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var n=a(87462),r=(a(67294),a(3905));const o={sidebar_label:"Bootstrap",sidebar_position:40},i="Bootstrap",s={unversionedId:"iaas/guides/deploy-guide/bootstrap",id:"iaas/guides/deploy-guide/bootstrap",title:"Bootstrap",description:"Before the nodes can be bootstrapped, they must all have already been provisioned.",source:"@site/docs/02-iaas/guides/deploy-guide/bootstrap.md",sourceDirName:"02-iaas/guides/deploy-guide",slug:"/iaas/guides/deploy-guide/bootstrap",permalink:"/docs/iaas/guides/deploy-guide/bootstrap",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/deploy-guide/bootstrap.md",tags:[],version:"current",sidebarPosition:40,frontMatter:{sidebar_label:"Bootstrap",sidebar_position:40},sidebar:"docs",previous:{title:"Provisioning",permalink:"/docs/iaas/guides/deploy-guide/provisioning"},next:{title:"Services",permalink:"/docs/iaas/guides/deploy-guide/services/"}},p={},l=[],m={toc:l},c="wrapper";function d(e){let{components:t,...a}=e;return(0,r.kt)(c,(0,n.Z)({},m,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"bootstrap"},"Bootstrap"),(0,r.kt)("p",null,"Before the nodes can be bootstrapped, they must all have already been provisioned.\nThe guide for this can be found in the section\n",(0,r.kt)("a",{parentName:"p",href:"./provisioning"},"Provisioning of management and control plane nodes")),(0,r.kt)("p",null,"The following steps are applied to bootstrap all nodes. After the completion of the bootstrap,\nthe nodes are already ready for use."),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Create operator user."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"osism apply operator -u osism\n")),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"When using the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/osism/node-image"},"osism/node-image")," the user is ",(0,r.kt)("inlineCode",{parentName:"p"},"osism"),"\nand the password of this user is ",(0,r.kt)("inlineCode",{parentName:"p"},"password"),". If you install Ubuntu manually the user usually\nis ",(0,r.kt)("inlineCode",{parentName:"p"},"ubuntu"),". If you want to use any other user here, that's no problem. It is important that\nthis user has sudo rights. The password according to what you have set yourself.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"The operator public SSH key has to be added in advance on all nodes to ",(0,r.kt)("inlineCode",{parentName:"p"},"authorized_keys")," file\nof the user specified with ",(0,r.kt)("inlineCode",{parentName:"p"},"-u"),". This key is stored as ",(0,r.kt)("inlineCode",{parentName:"p"},"operator_public_key")," in the file\n",(0,r.kt)("inlineCode",{parentName:"p"},"environments/configuration.yml"),"."),(0,r.kt)("p",{parentName:"li"},"Alternatively (not recommended), the password can be stored in plain text in a file ",(0,r.kt)("inlineCode",{parentName:"p"},"/opt/configuration/secrets/conn_password"),".\nThe parameter ",(0,r.kt)("inlineCode",{parentName:"p"},"--conn-pass-file /opt/configuration/secrets/conn_password")," must then also be specified:"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"osism apply operator -u osism \\\n --conn-pass-file /opt/configuration/secrets/conn_password\n"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"It is important that this user has sudo rights with ",(0,r.kt)("inlineCode",{parentName:"p"},"NOPASSWD"),"."),(0,r.kt)("p",{parentName:"li"},"Alternatively (not recommended), the password can be stored in plain text in a file ",(0,r.kt)("inlineCode",{parentName:"p"},"/opt/configuration/secrets/become_password"),".\nThe parameter ",(0,r.kt)("inlineCode",{parentName:"p"},"--become-pass-file /opt/configuration/secrets/become_password")," must then also be specified:"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"osism apply operator -u osism \\\n --become-pass-file /opt/configuration/secrets/become_password\n"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"If a password is required for both sudo and login, use both arguments at the same time."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"osism apply operator -u osism \\\n --become-pass-file /opt/configuration/secrets/become_password \\\n --conn-pass-file /opt/configuration/secrets/conn_password\n"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"When using the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/osism/node-image"},"osism/node-image")," the user is ",(0,r.kt)("inlineCode",{parentName:"p"},"osism")," and the password of this\nuser is ",(0,r.kt)("inlineCode",{parentName:"p"},"password"),". If you install Ubuntu manually the user usually is ",(0,r.kt)("inlineCode",{parentName:"p"},"ubuntu"),". The password according to what you\nhave set yourself")))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Proxy deployment (optional). This is only necessary if you use the proxy on the manager to enable external access to\nthe nodes."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"osism apply squid\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Proxy configuration (optional). This is only necessary if you use the proxy on the manager to enable external access to\nthe nodes."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"osism apply proxy\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Network configuration. It is recommended to backup the existing network configuration."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"osism apply network\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Reboot (optional). The reboot at this point is recommended to ensure that the network configuration is working."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"osism apply reboot -l 'all:!manager' -e ireallymeanit=yes\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Check if all systems are reachable (you probably have to do this several times until all systems are accessible)."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"osism apply ping\n")),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"System is currently rebooting and is not yet accessible via network."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},'fatal: [net003]: UNREACHABLE! => {"changed": false, "msg": "Connection timed\nout.", "unreachable": true}``\n'))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"System has already been rebooted and is not accessible via the network."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},'fatal: [net003]: UNREACHABLE! => {"changed": false, "msg": "EOF on stream;\nlast 100 lines received:\\nssh: connect to host 10.15.0.33 port 22: No route\nto host\\r", "unreachable": true}\n'))))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Refresh facts."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"osism apply facts\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Bootstrap."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"osism apply bootstrap\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Reboot (non-optional). Since the kernel version often changes after the initial bootstrap,\nthe reboot should always be performed."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"osism apply reboot -l 'all:!manager' -e ireallymeanit=yes\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Prepare the SSH configuration of the manager node."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"osism apply sshconfig\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Make all SSH public keys known."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"osism apply known-hosts\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Check again if all systems are reachable (you probably have to do this several times until all systems are accessible)."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"osism apply ping\n")))),(0,r.kt)("p",null,"Ready. All nodes are now bootstrapped and available to deploy services."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6d32cafb.417ec17e.js b/assets/js/6d32cafb.417ec17e.js new file mode 100644 index 0000000000..6ef014b113 --- /dev/null +++ b/assets/js/6d32cafb.417ec17e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8848],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>g});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var l=n.createContext({}),s=function(e){var t=n.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=s(e.components);return n.createElement(l.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,l=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),c=s(a),m=r,g=c["".concat(l,".").concat(m)]||c[m]||d[m]||i;return a?n.createElement(g,o(o({ref:t},u),{},{components:a})):n.createElement(g,o({ref:t},u))}));function g(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,o=new Array(i);o[0]=m;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p[c]="string"==typeof e?e:r,o[1]=p;for(var s=2;s{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>p,toc:()=>s});var n=a(87462),r=(a(67294),a(3905));const i={sidebar_label:"OpenStack",sidebar_position:40},o="OpenStack",p={unversionedId:"iaas/guides/upgrade-guide/openstack",id:"iaas/guides/upgrade-guide/openstack",title:"OpenStack",description:"Keystone",source:"@site/docs/02-iaas/guides/upgrade-guide/openstack.md",sourceDirName:"02-iaas/guides/upgrade-guide",slug:"/iaas/guides/upgrade-guide/openstack",permalink:"/docs/iaas/guides/upgrade-guide/openstack",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/upgrade-guide/openstack.md",tags:[],version:"current",sidebarPosition:40,frontMatter:{sidebar_label:"OpenStack",sidebar_position:40},sidebar:"docs",previous:{title:"Logging & Monitoring",permalink:"/docs/iaas/guides/upgrade-guide/logging-monitoring"},next:{title:"Configuration Guide",permalink:"/docs/iaas/guides/configuration-guide/"}},l={},s=[{value:"Keystone",id:"keystone",level:2},{value:"Glance",id:"glance",level:2},{value:"Designate",id:"designate",level:2},{value:"Placement",id:"placement",level:2},{value:"Cinder",id:"cinder",level:2},{value:"Neutron",id:"neutron",level:2},{value:"Nova",id:"nova",level:2},{value:"Octavia",id:"octavia",level:2},{value:"Amphora image update",id:"amphora-image-update",level:3},{value:"Amphora rotation",id:"amphora-rotation",level:3},{value:"Horizon",id:"horizon",level:2},{value:"OpenStack client",id:"openstack-client",level:2}],u={toc:s},c="wrapper";function d(e){let{components:t,...a}=e;return(0,r.kt)(c,(0,n.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"openstack"},"OpenStack"),(0,r.kt)("h2",{id:"keystone"},"Keystone"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"osism apply -a pull keystone\nosism apply -a upgrade keystone\n")),(0,r.kt)("h2",{id:"glance"},"Glance"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"osism apply -a pull glance\nosism apply -a rolling-upgrade glance\n")),(0,r.kt)("h2",{id:"designate"},"Designate"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"osism apply -a pull designate\nosism apply -a upgrade designate\n")),(0,r.kt)("h2",{id:"placement"},"Placement"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"osism apply -a pull placement\nosism apply -a upgrade placement\n")),(0,r.kt)("h2",{id:"cinder"},"Cinder"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"osism apply -a pull cinder\nosism apply -a upgrade cinder\n")),(0,r.kt)("h2",{id:"neutron"},"Neutron"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"osism apply -a pull neutron\nosism apply -a rolling-upgrade neutron\n")),(0,r.kt)("h2",{id:"nova"},"Nova"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"osism apply -a pull nova\nosism apply -a rolling-upgrade nova\n")),(0,r.kt)("h2",{id:"octavia"},"Octavia"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"osism apply -a pull octavia\nosism apply -a upgrade octavia\n")),(0,r.kt)("h3",{id:"amphora-image-update"},"Amphora image update"),(0,r.kt)("p",null,"This step is only necessary if the Amphora Driver is used. If OVN is used as the driver,\nthis step is not necessary."),(0,r.kt)("h3",{id:"amphora-rotation"},"Amphora rotation"),(0,r.kt)("p",null,"This step is only necessary if the Amphora Driver is used. If OVN is used as the driver,\nthis step is not necessary."),(0,r.kt)("h2",{id:"horizon"},"Horizon"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"osism apply -a pull horizon\nosism apply -a upgrade horizon\n")),(0,r.kt)("h2",{id:"openstack-client"},"OpenStack client"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"osism apply openstackclient\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6d890b23.b42a27b6.js b/assets/js/6d890b23.b42a27b6.js new file mode 100644 index 0000000000..1225321608 --- /dev/null +++ b/assets/js/6d890b23.b42a27b6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4573],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>g});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=c(r),m=a,g=d["".concat(l,".").concat(m)]||d[m]||p[m]||o;return r?n.createElement(g,s(s({ref:t},u),{},{components:r})):n.createElement(g,s({ref:t},u))}));function g(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,s=new Array(o);s[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[d]="string"==typeof e?e:a,s[1]=i;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>p,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var n=r(87462),a=(r(67294),r(3905));const o={sidebar_label:"Task",sidebar_position:20},s="Task",i={unversionedId:"iaas/guides/operations-guide/manager/task",id:"iaas/guides/operations-guide/manager/task",title:"Task",description:"List",source:"@site/docs/02-iaas/guides/operations-guide/manager/task.md",sourceDirName:"02-iaas/guides/operations-guide/manager",slug:"/iaas/guides/operations-guide/manager/task",permalink:"/docs/iaas/guides/operations-guide/manager/task",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/operations-guide/manager/task.md",tags:[],version:"current",sidebarPosition:20,frontMatter:{sidebar_label:"Task",sidebar_position:20},sidebar:"docs",previous:{title:"Console",permalink:"/docs/iaas/guides/operations-guide/manager/console"},next:{title:"Ceph",permalink:"/docs/iaas/guides/operations-guide/ceph"}},l={},c=[{value:"List",id:"list",level:2},{value:"Broker reset",id:"broker-reset",level:2}],u={toc:c},d="wrapper";function p(e){let{components:t,...r}=e;return(0,a.kt)(d,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"task"},"Task"),(0,a.kt)("h2",{id:"list"},"List"),(0,a.kt)("p",null,"All running or scheduled tasks can be listed with ",(0,a.kt)("inlineCode",{parentName:"p"},"osism task list"),"."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"+----------------------+--------------------------------------+-------------------------+----------+----------------------------+-----------------------------------------------+\n| Worker | ID | Name | Status | Start time | Arguments |\n|----------------------+--------------------------------------+-------------------------+----------+----------------------------+-----------------------------------------------|\n| celery@kolla-ansible | 8a553e69-c532-4ba0-a5d4-08a983bde692 | osism.tasks.kolla.run | ACTIVE | 2023-09-27 17:55:54.252250 | ['kolla', 'common', ['-e kolla_action=pull']] |\n| celery@osism-ansible | dba72dd5-1885-408f-9262-e0ded111a007 | osism.tasks.ansible.run | ACTIVE | 2023-09-27 18:00:31.215879 | ['generic', 'facts', []] |\n+----------------------+--------------------------------------+-------------------------+----------+----------------------------+-----------------------------------------------+\n")),(0,a.kt)("h2",{id:"broker-reset"},"Broker reset"),(0,a.kt)("p",null,"Sometimes tasks get stuck. Due to the internal locks it is then not possible to re-execute\nplays with the same name. Also it is currently not possible to cancel already running tasks\n(is on the todo list). The only way to unblock the situation is to stop the manager service\nand remove the Redis volume. Afterwards the manager is started again."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"cd /opt/manager\ndocker compose down\ndocker volume rm manager_redis\ndocker compose up -d\n")))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6db2ece2.bdb3ea87.js b/assets/js/6db2ece2.bdb3ea87.js new file mode 100644 index 0000000000..c51dadf2b4 --- /dev/null +++ b/assets/js/6db2ece2.bdb3ea87.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6990],{3905:(e,n,r)=>{r.d(n,{Zo:()=>d,kt:()=>g});var t=r(67294);function i(e,n,r){return n in e?Object.defineProperty(e,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[n]=r,e}function o(e,n){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);n&&(t=t.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),r.push.apply(r,t)}return r}function a(e){for(var n=1;n=0||(i[r]=e[r]);return i}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var l=t.createContext({}),c=function(e){var n=t.useContext(l),r=n;return e&&(r="function"==typeof e?e(n):a(a({},n),e)),r},d=function(e){var n=c(e.components);return t.createElement(l.Provider,{value:n},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var n=e.children;return t.createElement(t.Fragment,{},n)}},f=t.forwardRef((function(e,n){var r=e.components,i=e.mdxType,o=e.originalType,l=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),u=c(r),f=i,g=u["".concat(l,".").concat(f)]||u[f]||p[f]||o;return r?t.createElement(g,a(a({ref:n},d),{},{components:r})):t.createElement(g,a({ref:n},d))}));function g(e,n){var r=arguments,i=n&&n.mdxType;if("string"==typeof e||i){var o=r.length,a=new Array(o);a[0]=f;var s={};for(var l in n)hasOwnProperty.call(n,l)&&(s[l]=n[l]);s.originalType=e,s[u]="string"==typeof e?e:i,a[1]=s;for(var c=2;c{r.r(n),r.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>p,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var t=r(87462),i=(r(67294),r(3905));const o={sidebar_label:"Inventory",sidebar_position:10},a="Inventory",s={unversionedId:"iaas/guides/configuration-guide/inventory",id:"iaas/guides/configuration-guide/inventory",title:"Inventory",description:"The inventory used for the environment is located in the inventory directory.",source:"@site/docs/02-iaas/guides/configuration-guide/inventory.md",sourceDirName:"02-iaas/guides/configuration-guide",slug:"/iaas/guides/configuration-guide/inventory",permalink:"/docs/iaas/guides/configuration-guide/inventory",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/configuration-guide/inventory.md",tags:[],version:"current",sidebarPosition:10,frontMatter:{sidebar_label:"Inventory",sidebar_position:10},sidebar:"docs",previous:{title:"Configuration repository",permalink:"/docs/iaas/guides/configuration-guide/configuration-repository"},next:{title:"Manager",permalink:"/docs/iaas/guides/configuration-guide/manager"}},l={},c=[{value:"Manager",id:"manager",level:2},{value:"Reconciler",id:"reconciler",level:2},{value:"Host Vars",id:"host-vars",level:2},{value:"Group Vars",id:"group-vars",level:2},{value:"Define variable for all nodes",id:"define-variable-for-all-nodes",level:3}],d={toc:c},u="wrapper";function p(e){let{components:n,...o}=e;return(0,i.kt)(u,(0,t.Z)({},d,o,{components:n,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"inventory"},"Inventory"),(0,i.kt)("p",null,"The inventory used for the environment is located in the ",(0,i.kt)("inlineCode",{parentName:"p"},"inventory")," directory."),(0,i.kt)("h2",{id:"manager"},"Manager"),(0,i.kt)("p",null,"The manager has his own inventory which is used exclusively for the seed phase of the manager.\nIt is located in the directory ",(0,i.kt)("inlineCode",{parentName:"p"},"environments/manager"),". There is a ",(0,i.kt)("inlineCode",{parentName:"p"},"hosts")," file with only the\nmanager node in it."),(0,i.kt)("h2",{id:"reconciler"},"Reconciler"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Inventory Reconciler",src:r(61192).Z,width:"1366",height:"768"})),(0,i.kt)("h2",{id:"host-vars"},"Host Vars"),(0,i.kt)("h2",{id:"group-vars"},"Group Vars"),(0,i.kt)("h3",{id:"define-variable-for-all-nodes"},"Define variable for all nodes"),(0,i.kt)("p",null,"The Ansible group ",(0,i.kt)("inlineCode",{parentName:"p"},"all")," is specifically used internally by OSISM, is reserved and is not supported\nfor additional variables. When variables are added in the configuration repository for the all group,\nthey are ignored. In OSISM the group ",(0,i.kt)("inlineCode",{parentName:"p"},"generic")," can be used to store variables for all nodes."))}p.isMDXComponent=!0},61192:(e,n,r)=>{r.d(n,{Z:()=>t});const t=r.p+"assets/images/inventory-reconciler-acd822767003069a8935e016081383a5.png"}}]); \ No newline at end of file diff --git a/assets/js/6e35e719.32fa9b7d.js b/assets/js/6e35e719.32fa9b7d.js new file mode 100644 index 0000000000..3eed364ad8 --- /dev/null +++ b/assets/js/6e35e719.32fa9b7d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2286],{93968:s=>{s.exports=JSON.parse('{"title":"SCS-0402","slug":"standards/scs-0402","permalink":"/standards/standards/scs-0402","navigation":{"previous":{"title":"Status page reference implementation decision","permalink":"/standards/scs-0401-v1-status-page-reference-implementation-decision"},"next":{"title":"Status page OpenAPI decision","permalink":"/standards/scs-0402-v1-status-page-openapi-spec-decision"}}}')}}]); \ No newline at end of file diff --git a/assets/js/6e7e1a19.3537e037.js b/assets/js/6e7e1a19.3537e037.js new file mode 100644 index 0000000000..ffbbe96684 --- /dev/null +++ b/assets/js/6e7e1a19.3537e037.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3200],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>b});var n=r(67294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var l=n.createContext({}),s=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},c=function(e){var t=s(e.components);return n.createElement(l.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,a=e.originalType,l=e.parentName,c=u(e,["components","mdxType","originalType","parentName"]),d=s(r),m=i,b=d["".concat(l,".").concat(m)]||d[m]||p[m]||a;return r?n.createElement(b,o(o({ref:t},c),{},{components:r})):n.createElement(b,o({ref:t},c))}));function b(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=r.length,o=new Array(a);o[0]=m;var u={};for(var l in t)hasOwnProperty.call(t,l)&&(u[l]=t[l]);u.originalType=e,u[d]="string"==typeof e?e:i,o[1]=u;for(var s=2;s{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>a,metadata:()=>u,toc:()=>s});var n=r(87462),i=(r(67294),r(3905));const a={sidebar_label:"Zuul Ci",sidebar_position:30},o="Zuul CI",u={unversionedId:"iaas/guides/other-guides/developer-guide/zuul-ci",id:"iaas/guides/other-guides/developer-guide/zuul-ci",title:"Zuul CI",description:"We use Zuul CI for our CI. Our Zuul CI instance is available",source:"@site/docs/02-iaas/guides/other-guides/developer-guide/zuul-ci.md",sourceDirName:"02-iaas/guides/other-guides/developer-guide",slug:"/iaas/guides/other-guides/developer-guide/zuul-ci",permalink:"/docs/iaas/guides/other-guides/developer-guide/zuul-ci",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/other-guides/developer-guide/zuul-ci.md",tags:[],version:"current",sidebarPosition:30,frontMatter:{sidebar_label:"Zuul Ci",sidebar_position:30},sidebar:"docs",previous:{title:"Scripts",permalink:"/docs/iaas/guides/other-guides/developer-guide/scripts"},next:{title:"Style Guide",permalink:"/docs/iaas/guides/other-guides/style-guide"}},l={},s=[{value:"The zuul label",id:"the-zuul-label",level:2}],c={toc:s},d="wrapper";function p(e){let{components:t,...r}=e;return(0,i.kt)(d,(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"zuul-ci"},"Zuul CI"),(0,i.kt)("p",null,"We use ",(0,i.kt)("a",{parentName:"p",href:"https://zuul-ci.org"},"Zuul CI")," for our CI. Our Zuul CI instance is available\nat ",(0,i.kt)("a",{parentName:"p",href:"https://zuul.services.betacloud.xyz/t/osism/status"},"zuul.services.betacloud.xyz"),"."),(0,i.kt)("h2",{id:"the-zuul-label"},"The ",(0,i.kt)("inlineCode",{parentName:"h2"},"zuul")," label"),(0,i.kt)("p",null,"On CI jobs that consume a lot of resources and have long runtimes we use a label\n",(0,i.kt)("inlineCode",{parentName:"p"},"zuul")," to run these jobs."),(0,i.kt)("p",null,"These CI jobs run in the ",(0,i.kt)("a",{parentName:"p",href:"https://zuul.services.betacloud.xyz/t/osism/buildsets?pipeline=label"},"label pipeline"),"\nand are only started once after the label has been assigned. If changes are made\nto a PR, the label must first be removed and then reassigned for a new run of the\nCI jobs."),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"zuul")," label is usable in the following repositories:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/osism/container-images-kolla"},"osism/container-images-kolla")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/osism/testbed"},"osism/testbed"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6f1c571c.221182a2.js b/assets/js/6f1c571c.221182a2.js new file mode 100644 index 0000000000..ca9df73064 --- /dev/null +++ b/assets/js/6f1c571c.221182a2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[87],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>f});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),p=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},c=function(e){var t=p(e.components);return n.createElement(l.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=p(r),m=a,f=d["".concat(l,".").concat(m)]||d[m]||u[m]||o;return r?n.createElement(f,i(i({ref:t},c),{},{components:r})):n.createElement(f,i({ref:t},c))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[d]="string"==typeof e?e:a,i[1]=s;for(var p=2;p{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>s,toc:()=>p});var n=r(87462),a=(r(67294),r(3905));const o={sidebar_label:"Examples",sidebar_position:120},i="Examples",s={unversionedId:"iaas/guides/deploy-guide/examples/index",id:"iaas/guides/deploy-guide/examples/index",title:"Examples",description:"",source:"@site/docs/02-iaas/guides/deploy-guide/examples/index.md",sourceDirName:"02-iaas/guides/deploy-guide/examples",slug:"/iaas/guides/deploy-guide/examples/",permalink:"/docs/iaas/guides/deploy-guide/examples/",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/deploy-guide/examples/index.md",tags:[],version:"current",sidebarPosition:120,frontMatter:{sidebar_label:"Examples",sidebar_position:120},sidebar:"docs",previous:{title:"OpenStack",permalink:"/docs/iaas/guides/deploy-guide/services/openstack"},next:{title:"Cloud in a Box",permalink:"/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box"}},l={},p=[],c={toc:p},d="wrapper";function u(e){let{components:t,...r}=e;return(0,a.kt)(d,(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"examples"},"Examples"))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6f4a06ca.9c263a3e.js b/assets/js/6f4a06ca.9c263a3e.js new file mode 100644 index 0000000000..1ac312a2a2 --- /dev/null +++ b/assets/js/6f4a06ca.9c263a3e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4081],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>c});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var p=a.createContext({}),s=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=s(e.components);return a.createElement(p.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},k=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),u=s(n),k=r,c=u["".concat(p,".").concat(k)]||u[k]||m[k]||o;return n?a.createElement(c,i(i({ref:t},d),{},{components:n})):a.createElement(c,i({ref:t},d))}));function c(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=k;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[u]="string"==typeof e?e:r,i[1]=l;for(var s=2;s{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var a=n(87462),r=(n(67294),n(3905));const o={sidebar_label:"Manager",sidebar_position:20},i="Manager",l={unversionedId:"iaas/guides/deploy-guide/manager",id:"iaas/guides/deploy-guide/manager",title:"Manager",description:"Change into the configuration/environments/manager directory of the configuration repository.",source:"@site/docs/02-iaas/guides/deploy-guide/manager.md",sourceDirName:"02-iaas/guides/deploy-guide",slug:"/iaas/guides/deploy-guide/manager",permalink:"/docs/iaas/guides/deploy-guide/manager",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/deploy-guide/manager.md",tags:[],version:"current",sidebarPosition:20,frontMatter:{sidebar_label:"Manager",sidebar_position:20},sidebar:"docs",previous:{title:"Seed",permalink:"/docs/iaas/guides/deploy-guide/seed"},next:{title:"Provisioning",permalink:"/docs/iaas/guides/deploy-guide/provisioning"}},p={},s=[{value:"Create operator user",id:"create-operator-user",level:2},{value:"Apply the network configuration",id:"apply-the-network-configuration",level:2},{value:"Bootstrap",id:"bootstrap",level:2},{value:"Deploy",id:"deploy",level:2}],d={toc:s},u="wrapper";function m(e){let{components:t,...n}=e;return(0,r.kt)(u,(0,a.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"manager"},"Manager"),(0,r.kt)("p",null,"Change into the ",(0,r.kt)("inlineCode",{parentName:"p"},"configuration/environments/manager")," directory of the configuration repository.\non the seed node."),(0,r.kt)("p",null,"The deployment of the seed node is documented in the ",(0,r.kt)("a",{parentName:"p",href:"../deploy-guide/seed"},"Deploy Guide for the seed node"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"cd configuration/environments/manager\n")),(0,r.kt)("h2",{id:"create-operator-user"},"Create operator user"),(0,r.kt)("p",null,"The operator user is created on each node. It is used as a service account for OSISM. All\ncontainers run with this user. Ansible also uses this user to access the nodes. Commands\non the manager node need to be run as this user. The name of the operator user is always ",(0,r.kt)("inlineCode",{parentName:"p"},"dragon"),"."),(0,r.kt)("p",null,"With ",(0,r.kt)("inlineCode",{parentName:"p"},"ANSIBLE_USER")," the existing user account is set after the provsioning of the management\nnode. When using the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/osism/node-image"},"osism/node-image")," the user is ",(0,r.kt)("inlineCode",{parentName:"p"},"osism"),"\nand the password of this user is ",(0,r.kt)("inlineCode",{parentName:"p"},"password"),". If you install Ubuntu manually the user usually\nis ",(0,r.kt)("inlineCode",{parentName:"p"},"ubuntu"),". If you want to use any other user here, that's no problem. It is important that\nthis user has sudo rights. The password according to what you have set yourself."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"ANSIBLE_BECOME_ASK_PASS=True \\\nANSIBLE_ASK_VAULT_PASS=True \\\nANSIBLE_ASK_PASS=True \\\nANSIBLE_USER=osism \\\n./run.sh operator\n")),(0,r.kt)("p",null,"When the ",(0,r.kt)("inlineCode",{parentName:"p"},"./run.sh operator")," is executed, the following prompts are displayed."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Prompt"),(0,r.kt)("th",{parentName:"tr",align:null},"Value"),(0,r.kt)("th",{parentName:"tr",align:null},"Comment"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"SSH password:")),(0,r.kt)("td",{parentName:"tr",align:null},"Password so that the ",(0,r.kt)("inlineCode",{parentName:"td"},"ANSIBLE_USER")," can login"),(0,r.kt)("td",{parentName:"tr",align:null},"Enabled by ",(0,r.kt)("inlineCode",{parentName:"td"},"ANSIBLE_ASK_PASS"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"BECOME password[defaults to SSH password]:")),(0,r.kt)("td",{parentName:"tr",align:null},"Password so that the ",(0,r.kt)("inlineCode",{parentName:"td"},"ANSIBLE_USER")," can use ",(0,r.kt)("inlineCode",{parentName:"td"},"sudo")),(0,r.kt)("td",{parentName:"tr",align:null},"Enabled by ",(0,r.kt)("inlineCode",{parentName:"td"},"ANSIBLE_BECOME_ASK_PASS"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Vault password:")),(0,r.kt)("td",{parentName:"tr",align:null},"Value of ",(0,r.kt)("inlineCode",{parentName:"td"},"secrets/vaultpass")),(0,r.kt)("td",{parentName:"tr",align:null},"Enabled by ",(0,r.kt)("inlineCode",{parentName:"td"},"ANSIBLE_ASK_VAULT_PASS"))))),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"If a password is required to login to the manager node, ",(0,r.kt)("inlineCode",{parentName:"p"},"ANSIBLE_ASK_PASS=True")," must be set.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"If an SSH key is required to login to the manager node, the key has to be added on the manager\nnode to ",(0,r.kt)("inlineCode",{parentName:"p"},"~/.ssh/authorized_keys")," in the home directory of the user specified as ",(0,r.kt)("inlineCode",{parentName:"p"},"ANSIBLE_USER")," first.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"If the error ",(0,r.kt)("inlineCode",{parentName:"p"},"ERROR! Attempting to decrypt but no vault secrets found")," occurs, ",(0,r.kt)("inlineCode",{parentName:"p"},"ANSIBLE_ASK_VAULT_PASS=True"),"\nhas to be set.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"If the error ",(0,r.kt)("inlineCode",{parentName:"p"},"/bin/sh: 1: /usr/bin/python: not found occurs"),", Python has to be installed first on\nthe manager node:"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"ANSIBLE_USER=osism ./run.sh python3\n"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"If you receive the following error message ",(0,r.kt)("inlineCode",{parentName:"p"},"ssh: Too many authentication failures")," set\n",(0,r.kt)("inlineCode",{parentName:"p"},"ANSIBLE_SSH_ARGS")," environment variable to use only the operator ssh key for authentication."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},'export ANSIBLE_SSH_ARGS="-o IdentitiesOnly=yes"\n'))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"The warning message ",(0,r.kt)("inlineCode",{parentName:"p"},"[WARNING]: running playbook inside collection osism.manager")," can be ignored")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"If Ansible Vault is used, let Ansible ask for the Vault password:"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"export ANSIBLE_ASK_VAULT_PASS=True\n")))),(0,r.kt)("p",null,"Details on all parameters can be found in\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.ansible.com/ansible/latest/reference_appendices/config.html"},"Ansible Configuration Settings"),"\nin the Ansible documentation."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Environment variable"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"ANSIBLE_ASK_PASS")),(0,r.kt)("td",{parentName:"tr",align:null},"Boolean"),(0,r.kt)("td",{parentName:"tr",align:null},"This controls whether an Ansible playbook should prompt for a login password. If using SSH keys for authentication, you probably do not need to change this setting.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"ANSIBLE_ASK_VAULT_PASS")),(0,r.kt)("td",{parentName:"tr",align:null},"Boolean"),(0,r.kt)("td",{parentName:"tr",align:null},"This controls whether an Ansible playbook should prompt for a vault password.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"ANSIBLE_BECOME_ASK_PASS")),(0,r.kt)("td",{parentName:"tr",align:null},"Boolean"),(0,r.kt)("td",{parentName:"tr",align:null},"Toggle to prompt for privilege escalation password.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"ANSIBLE_SSH_ARGS")),(0,r.kt)("td",{parentName:"tr",align:null},"String"),(0,r.kt)("td",{parentName:"tr",align:null},"If set, this will override the Ansible default ssh arguments.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"ANSIBLE_USER")),(0,r.kt)("td",{parentName:"tr",align:null},"String"),(0,r.kt)("td",{parentName:"tr",align:null},"The user Ansible \u2018logs in\u2019 as.")))),(0,r.kt)("p",null,"To verify the creation of the operator user, use the private key file ",(0,r.kt)("inlineCode",{parentName:"p"},"id_rsa.operator"),". Make\nsure you purge all keys from ssh-agent identity cache using ",(0,r.kt)("inlineCode",{parentName:"p"},"ssh-add -D"),". You can print the list\nusing ",(0,r.kt)("inlineCode",{parentName:"p"},"ssh-add -l"),". The list should be empty."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"ssh-add -D\nssh -o IdentitiesOnly=yes -i id_rsa.operator dragon@testbed-manager\n")),(0,r.kt)("h2",{id:"apply-the-network-configuration"},"Apply the network configuration"),(0,r.kt)("p",null,"Most of the parameters required for Ansible (",(0,r.kt)("inlineCode",{parentName:"p"},"ANSIBLE_BECOME_ASK_PASS"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"ANSIBLE_ASK_PASS"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"ANSIBLE_USER"),", ...)\nin the previous step are no longer necessary. If Ansible Vault is used, however, ",(0,r.kt)("inlineCode",{parentName:"p"},"ANSIBLE_ASK_VAULT_PASS"),"\nmust still be set."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"export ANSIBLE_ASK_VAULT_PASS=True\n")),(0,r.kt)("p",null,"To prevent recurring installation of Ansible Collections, ",(0,r.kt)("inlineCode",{parentName:"p"},"export INSTALL_ANSIBLE_ROLES=False")," can be set."),(0,r.kt)("p",null,"The network configuration, already present on a node should be backuped before this step.\nThen you can deploy the network configuration with the network role."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"./run.sh network\n")),(0,r.kt)("p",null,"Upon completion of the network configurtion, a node reboot should be performed to ensure the configuration\nis functional and reboot safe. Since network services are not restarted automatically, later changes to the\nnetwork configuration are not effective without a manual apply of the network configuration or reboot of the\nnodes."),(0,r.kt)("h2",{id:"bootstrap"},"Bootstrap"),(0,r.kt)("p",null,"Most of the parameters required for Ansible (",(0,r.kt)("inlineCode",{parentName:"p"},"ANSIBLE_BECOME_ASK_PASS"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"ANSIBLE_ASK_PASS"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"ANSIBLE_USER"),", ...)\nin the previous step are no longer necessary."),(0,r.kt)("p",null,"If Ansible Vault is used, however, ",(0,r.kt)("inlineCode",{parentName:"p"},"export ANSIBLE_ASK_VAULT_PASS=True")," must still be set."),(0,r.kt)("p",null,"To prevent recurring installation of Ansible Collections, ",(0,r.kt)("inlineCode",{parentName:"p"},"export INSTALL_ANSIBLE_ROLES=False")," can be set.\nThis is recommended."),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Bootstrap the manager node."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"./run.sh bootstrap\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Reboot the manager node."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"./run.sh reboot\n")))),(0,r.kt)("h2",{id:"deploy"},"Deploy"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Transfer the configuration repository."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"./run.sh configuration\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Deploy the Traefik service. This is optional and only necessary if the Traefik service is to be used."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"./run.sh traefik\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Deploy the Netbox service. This is optional and only necessary if the Netbox service is to be used."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"./run.sh netbox\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Deploy the manager service."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"./run.sh manager\n")))),(0,r.kt)("p",null,"Finally, the Ansible Vault password is made known on the manager node."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"osism set vault password\nAnsible Vault password: ********\n")),(0,r.kt)("p",null,"Ready. The manager is now prepared and you can continue with the bootstrap of the other nodes.\nThe seed node used until here is no longer necessary."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/724.d7e60c08.js b/assets/js/724.d7e60c08.js new file mode 100644 index 0000000000..51dcae6e9d --- /dev/null +++ b/assets/js/724.d7e60c08.js @@ -0,0 +1,41606 @@ +exports.id = 724; +exports.ids = [724]; +exports.modules = { + +/***/ 84182: +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +(function webpackUniversalModuleDefinition(root, factory) { + if(true) + module.exports = factory(__webpack_require__(82241)); + else {} +})(this, function(__WEBPACK_EXTERNAL_MODULE_0__) { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __nested_webpack_require_643__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __nested_webpack_require_643__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __nested_webpack_require_643__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __nested_webpack_require_643__.c = installedModules; +/******/ +/******/ // identity function for calling harmony imports with the correct context +/******/ __nested_webpack_require_643__.i = function(value) { return value; }; +/******/ +/******/ // define getter function for harmony exports +/******/ __nested_webpack_require_643__.d = function(exports, name, getter) { +/******/ if(!__nested_webpack_require_643__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { +/******/ configurable: false, +/******/ enumerable: true, +/******/ get: getter +/******/ }); +/******/ } +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __nested_webpack_require_643__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __nested_webpack_require_643__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __nested_webpack_require_643__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __nested_webpack_require_643__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __nested_webpack_require_643__(__nested_webpack_require_643__.s = 7); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports) { + +module.exports = __WEBPACK_EXTERNAL_MODULE_0__; + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __nested_webpack_require_3185__) { + +"use strict"; + + +var FDLayoutConstants = __nested_webpack_require_3185__(0).FDLayoutConstants; + +function CoSEConstants() {} + +//CoSEConstants inherits static props in FDLayoutConstants +for (var prop in FDLayoutConstants) { + CoSEConstants[prop] = FDLayoutConstants[prop]; +} + +CoSEConstants.DEFAULT_USE_MULTI_LEVEL_SCALING = false; +CoSEConstants.DEFAULT_RADIAL_SEPARATION = FDLayoutConstants.DEFAULT_EDGE_LENGTH; +CoSEConstants.DEFAULT_COMPONENT_SEPERATION = 60; +CoSEConstants.TILE = true; +CoSEConstants.TILING_PADDING_VERTICAL = 10; +CoSEConstants.TILING_PADDING_HORIZONTAL = 10; +CoSEConstants.TREE_REDUCTION_ON_INCREMENTAL = false; // make this true when cose is used incrementally as a part of other non-incremental layout + +module.exports = CoSEConstants; + +/***/ }), +/* 2 */ +/***/ (function(module, exports, __nested_webpack_require_4002__) { + +"use strict"; + + +var FDLayoutEdge = __nested_webpack_require_4002__(0).FDLayoutEdge; + +function CoSEEdge(source, target, vEdge) { + FDLayoutEdge.call(this, source, target, vEdge); +} + +CoSEEdge.prototype = Object.create(FDLayoutEdge.prototype); +for (var prop in FDLayoutEdge) { + CoSEEdge[prop] = FDLayoutEdge[prop]; +} + +module.exports = CoSEEdge; + +/***/ }), +/* 3 */ +/***/ (function(module, exports, __nested_webpack_require_4409__) { + +"use strict"; + + +var LGraph = __nested_webpack_require_4409__(0).LGraph; + +function CoSEGraph(parent, graphMgr, vGraph) { + LGraph.call(this, parent, graphMgr, vGraph); +} + +CoSEGraph.prototype = Object.create(LGraph.prototype); +for (var prop in LGraph) { + CoSEGraph[prop] = LGraph[prop]; +} + +module.exports = CoSEGraph; + +/***/ }), +/* 4 */ +/***/ (function(module, exports, __nested_webpack_require_4790__) { + +"use strict"; + + +var LGraphManager = __nested_webpack_require_4790__(0).LGraphManager; + +function CoSEGraphManager(layout) { + LGraphManager.call(this, layout); +} + +CoSEGraphManager.prototype = Object.create(LGraphManager.prototype); +for (var prop in LGraphManager) { + CoSEGraphManager[prop] = LGraphManager[prop]; +} + +module.exports = CoSEGraphManager; + +/***/ }), +/* 5 */ +/***/ (function(module, exports, __nested_webpack_require_5205__) { + +"use strict"; + + +var FDLayoutNode = __nested_webpack_require_5205__(0).FDLayoutNode; +var IMath = __nested_webpack_require_5205__(0).IMath; + +function CoSENode(gm, loc, size, vNode) { + FDLayoutNode.call(this, gm, loc, size, vNode); +} + +CoSENode.prototype = Object.create(FDLayoutNode.prototype); +for (var prop in FDLayoutNode) { + CoSENode[prop] = FDLayoutNode[prop]; +} + +CoSENode.prototype.move = function () { + var layout = this.graphManager.getLayout(); + this.displacementX = layout.coolingFactor * (this.springForceX + this.repulsionForceX + this.gravitationForceX) / this.noOfChildren; + this.displacementY = layout.coolingFactor * (this.springForceY + this.repulsionForceY + this.gravitationForceY) / this.noOfChildren; + + if (Math.abs(this.displacementX) > layout.coolingFactor * layout.maxNodeDisplacement) { + this.displacementX = layout.coolingFactor * layout.maxNodeDisplacement * IMath.sign(this.displacementX); + } + + if (Math.abs(this.displacementY) > layout.coolingFactor * layout.maxNodeDisplacement) { + this.displacementY = layout.coolingFactor * layout.maxNodeDisplacement * IMath.sign(this.displacementY); + } + + // a simple node, just move it + if (this.child == null) { + this.moveBy(this.displacementX, this.displacementY); + } + // an empty compound node, again just move it + else if (this.child.getNodes().length == 0) { + this.moveBy(this.displacementX, this.displacementY); + } + // non-empty compound node, propogate movement to children as well + else { + this.propogateDisplacementToChildren(this.displacementX, this.displacementY); + } + + layout.totalDisplacement += Math.abs(this.displacementX) + Math.abs(this.displacementY); + + this.springForceX = 0; + this.springForceY = 0; + this.repulsionForceX = 0; + this.repulsionForceY = 0; + this.gravitationForceX = 0; + this.gravitationForceY = 0; + this.displacementX = 0; + this.displacementY = 0; +}; + +CoSENode.prototype.propogateDisplacementToChildren = function (dX, dY) { + var nodes = this.getChild().getNodes(); + var node; + for (var i = 0; i < nodes.length; i++) { + node = nodes[i]; + if (node.getChild() == null) { + node.moveBy(dX, dY); + node.displacementX += dX; + node.displacementY += dY; + } else { + node.propogateDisplacementToChildren(dX, dY); + } + } +}; + +CoSENode.prototype.setPred1 = function (pred1) { + this.pred1 = pred1; +}; + +CoSENode.prototype.getPred1 = function () { + return pred1; +}; + +CoSENode.prototype.getPred2 = function () { + return pred2; +}; + +CoSENode.prototype.setNext = function (next) { + this.next = next; +}; + +CoSENode.prototype.getNext = function () { + return next; +}; + +CoSENode.prototype.setProcessed = function (processed) { + this.processed = processed; +}; + +CoSENode.prototype.isProcessed = function () { + return processed; +}; + +module.exports = CoSENode; + +/***/ }), +/* 6 */ +/***/ (function(module, exports, __nested_webpack_require_8085__) { + +"use strict"; + + +var FDLayout = __nested_webpack_require_8085__(0).FDLayout; +var CoSEGraphManager = __nested_webpack_require_8085__(4); +var CoSEGraph = __nested_webpack_require_8085__(3); +var CoSENode = __nested_webpack_require_8085__(5); +var CoSEEdge = __nested_webpack_require_8085__(2); +var CoSEConstants = __nested_webpack_require_8085__(1); +var FDLayoutConstants = __nested_webpack_require_8085__(0).FDLayoutConstants; +var LayoutConstants = __nested_webpack_require_8085__(0).LayoutConstants; +var Point = __nested_webpack_require_8085__(0).Point; +var PointD = __nested_webpack_require_8085__(0).PointD; +var Layout = __nested_webpack_require_8085__(0).Layout; +var Integer = __nested_webpack_require_8085__(0).Integer; +var IGeometry = __nested_webpack_require_8085__(0).IGeometry; +var LGraph = __nested_webpack_require_8085__(0).LGraph; +var Transform = __nested_webpack_require_8085__(0).Transform; + +function CoSELayout() { + FDLayout.call(this); + + this.toBeTiled = {}; // Memorize if a node is to be tiled or is tiled +} + +CoSELayout.prototype = Object.create(FDLayout.prototype); + +for (var prop in FDLayout) { + CoSELayout[prop] = FDLayout[prop]; +} + +CoSELayout.prototype.newGraphManager = function () { + var gm = new CoSEGraphManager(this); + this.graphManager = gm; + return gm; +}; + +CoSELayout.prototype.newGraph = function (vGraph) { + return new CoSEGraph(null, this.graphManager, vGraph); +}; + +CoSELayout.prototype.newNode = function (vNode) { + return new CoSENode(this.graphManager, vNode); +}; + +CoSELayout.prototype.newEdge = function (vEdge) { + return new CoSEEdge(null, null, vEdge); +}; + +CoSELayout.prototype.initParameters = function () { + FDLayout.prototype.initParameters.call(this, arguments); + if (!this.isSubLayout) { + if (CoSEConstants.DEFAULT_EDGE_LENGTH < 10) { + this.idealEdgeLength = 10; + } else { + this.idealEdgeLength = CoSEConstants.DEFAULT_EDGE_LENGTH; + } + + this.useSmartIdealEdgeLengthCalculation = CoSEConstants.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION; + this.springConstant = FDLayoutConstants.DEFAULT_SPRING_STRENGTH; + this.repulsionConstant = FDLayoutConstants.DEFAULT_REPULSION_STRENGTH; + this.gravityConstant = FDLayoutConstants.DEFAULT_GRAVITY_STRENGTH; + this.compoundGravityConstant = FDLayoutConstants.DEFAULT_COMPOUND_GRAVITY_STRENGTH; + this.gravityRangeFactor = FDLayoutConstants.DEFAULT_GRAVITY_RANGE_FACTOR; + this.compoundGravityRangeFactor = FDLayoutConstants.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR; + + // variables for tree reduction support + this.prunedNodesAll = []; + this.growTreeIterations = 0; + this.afterGrowthIterations = 0; + this.isTreeGrowing = false; + this.isGrowthFinished = false; + + // variables for cooling + this.coolingCycle = 0; + this.maxCoolingCycle = this.maxIterations / FDLayoutConstants.CONVERGENCE_CHECK_PERIOD; + this.finalTemperature = FDLayoutConstants.CONVERGENCE_CHECK_PERIOD / this.maxIterations; + this.coolingAdjuster = 1; + } +}; + +CoSELayout.prototype.layout = function () { + var createBendsAsNeeded = LayoutConstants.DEFAULT_CREATE_BENDS_AS_NEEDED; + if (createBendsAsNeeded) { + this.createBendpoints(); + this.graphManager.resetAllEdges(); + } + + this.level = 0; + return this.classicLayout(); +}; + +CoSELayout.prototype.classicLayout = function () { + this.nodesWithGravity = this.calculateNodesToApplyGravitationTo(); + this.graphManager.setAllNodesToApplyGravitation(this.nodesWithGravity); + this.calcNoOfChildrenForAllNodes(); + this.graphManager.calcLowestCommonAncestors(); + this.graphManager.calcInclusionTreeDepths(); + this.graphManager.getRoot().calcEstimatedSize(); + this.calcIdealEdgeLengths(); + + if (!this.incremental) { + var forest = this.getFlatForest(); + + // The graph associated with this layout is flat and a forest + if (forest.length > 0) { + this.positionNodesRadially(forest); + } + // The graph associated with this layout is not flat or a forest + else { + // Reduce the trees when incremental mode is not enabled and graph is not a forest + this.reduceTrees(); + // Update nodes that gravity will be applied + this.graphManager.resetAllNodesToApplyGravitation(); + var allNodes = new Set(this.getAllNodes()); + var intersection = this.nodesWithGravity.filter(function (x) { + return allNodes.has(x); + }); + this.graphManager.setAllNodesToApplyGravitation(intersection); + + this.positionNodesRandomly(); + } + } else { + if (CoSEConstants.TREE_REDUCTION_ON_INCREMENTAL) { + // Reduce the trees in incremental mode if only this constant is set to true + this.reduceTrees(); + // Update nodes that gravity will be applied + this.graphManager.resetAllNodesToApplyGravitation(); + var allNodes = new Set(this.getAllNodes()); + var intersection = this.nodesWithGravity.filter(function (x) { + return allNodes.has(x); + }); + this.graphManager.setAllNodesToApplyGravitation(intersection); + } + } + + this.initSpringEmbedder(); + this.runSpringEmbedder(); + + return true; +}; + +CoSELayout.prototype.tick = function () { + this.totalIterations++; + + if (this.totalIterations === this.maxIterations && !this.isTreeGrowing && !this.isGrowthFinished) { + if (this.prunedNodesAll.length > 0) { + this.isTreeGrowing = true; + } else { + return true; + } + } + + if (this.totalIterations % FDLayoutConstants.CONVERGENCE_CHECK_PERIOD == 0 && !this.isTreeGrowing && !this.isGrowthFinished) { + if (this.isConverged()) { + if (this.prunedNodesAll.length > 0) { + this.isTreeGrowing = true; + } else { + return true; + } + } + + this.coolingCycle++; + + if (this.layoutQuality == 0) { + // quality - "draft" + this.coolingAdjuster = this.coolingCycle; + } else if (this.layoutQuality == 1) { + // quality - "default" + this.coolingAdjuster = this.coolingCycle / 3; + } + + // cooling schedule is based on http://www.btluke.com/simanf1.html -> cooling schedule 3 + this.coolingFactor = Math.max(this.initialCoolingFactor - Math.pow(this.coolingCycle, Math.log(100 * (this.initialCoolingFactor - this.finalTemperature)) / Math.log(this.maxCoolingCycle)) / 100 * this.coolingAdjuster, this.finalTemperature); + this.animationPeriod = Math.ceil(this.initialAnimationPeriod * Math.sqrt(this.coolingFactor)); + } + // Operations while tree is growing again + if (this.isTreeGrowing) { + if (this.growTreeIterations % 10 == 0) { + if (this.prunedNodesAll.length > 0) { + this.graphManager.updateBounds(); + this.updateGrid(); + this.growTree(this.prunedNodesAll); + // Update nodes that gravity will be applied + this.graphManager.resetAllNodesToApplyGravitation(); + var allNodes = new Set(this.getAllNodes()); + var intersection = this.nodesWithGravity.filter(function (x) { + return allNodes.has(x); + }); + this.graphManager.setAllNodesToApplyGravitation(intersection); + + this.graphManager.updateBounds(); + this.updateGrid(); + this.coolingFactor = FDLayoutConstants.DEFAULT_COOLING_FACTOR_INCREMENTAL; + } else { + this.isTreeGrowing = false; + this.isGrowthFinished = true; + } + } + this.growTreeIterations++; + } + // Operations after growth is finished + if (this.isGrowthFinished) { + if (this.isConverged()) { + return true; + } + if (this.afterGrowthIterations % 10 == 0) { + this.graphManager.updateBounds(); + this.updateGrid(); + } + this.coolingFactor = FDLayoutConstants.DEFAULT_COOLING_FACTOR_INCREMENTAL * ((100 - this.afterGrowthIterations) / 100); + this.afterGrowthIterations++; + } + + var gridUpdateAllowed = !this.isTreeGrowing && !this.isGrowthFinished; + var forceToNodeSurroundingUpdate = this.growTreeIterations % 10 == 1 && this.isTreeGrowing || this.afterGrowthIterations % 10 == 1 && this.isGrowthFinished; + + this.totalDisplacement = 0; + this.graphManager.updateBounds(); + this.calcSpringForces(); + this.calcRepulsionForces(gridUpdateAllowed, forceToNodeSurroundingUpdate); + this.calcGravitationalForces(); + this.moveNodes(); + this.animate(); + + return false; // Layout is not ended yet return false +}; + +CoSELayout.prototype.getPositionsData = function () { + var allNodes = this.graphManager.getAllNodes(); + var pData = {}; + for (var i = 0; i < allNodes.length; i++) { + var rect = allNodes[i].rect; + var id = allNodes[i].id; + pData[id] = { + id: id, + x: rect.getCenterX(), + y: rect.getCenterY(), + w: rect.width, + h: rect.height + }; + } + + return pData; +}; + +CoSELayout.prototype.runSpringEmbedder = function () { + this.initialAnimationPeriod = 25; + this.animationPeriod = this.initialAnimationPeriod; + var layoutEnded = false; + + // If aminate option is 'during' signal that layout is supposed to start iterating + if (FDLayoutConstants.ANIMATE === 'during') { + this.emit('layoutstarted'); + } else { + // If aminate option is 'during' tick() function will be called on index.js + while (!layoutEnded) { + layoutEnded = this.tick(); + } + + this.graphManager.updateBounds(); + } +}; + +CoSELayout.prototype.calculateNodesToApplyGravitationTo = function () { + var nodeList = []; + var graph; + + var graphs = this.graphManager.getGraphs(); + var size = graphs.length; + var i; + for (i = 0; i < size; i++) { + graph = graphs[i]; + + graph.updateConnected(); + + if (!graph.isConnected) { + nodeList = nodeList.concat(graph.getNodes()); + } + } + + return nodeList; +}; + +CoSELayout.prototype.createBendpoints = function () { + var edges = []; + edges = edges.concat(this.graphManager.getAllEdges()); + var visited = new Set(); + var i; + for (i = 0; i < edges.length; i++) { + var edge = edges[i]; + + if (!visited.has(edge)) { + var source = edge.getSource(); + var target = edge.getTarget(); + + if (source == target) { + edge.getBendpoints().push(new PointD()); + edge.getBendpoints().push(new PointD()); + this.createDummyNodesForBendpoints(edge); + visited.add(edge); + } else { + var edgeList = []; + + edgeList = edgeList.concat(source.getEdgeListToNode(target)); + edgeList = edgeList.concat(target.getEdgeListToNode(source)); + + if (!visited.has(edgeList[0])) { + if (edgeList.length > 1) { + var k; + for (k = 0; k < edgeList.length; k++) { + var multiEdge = edgeList[k]; + multiEdge.getBendpoints().push(new PointD()); + this.createDummyNodesForBendpoints(multiEdge); + } + } + edgeList.forEach(function (edge) { + visited.add(edge); + }); + } + } + } + + if (visited.size == edges.length) { + break; + } + } +}; + +CoSELayout.prototype.positionNodesRadially = function (forest) { + // We tile the trees to a grid row by row; first tree starts at (0,0) + var currentStartingPoint = new Point(0, 0); + var numberOfColumns = Math.ceil(Math.sqrt(forest.length)); + var height = 0; + var currentY = 0; + var currentX = 0; + var point = new PointD(0, 0); + + for (var i = 0; i < forest.length; i++) { + if (i % numberOfColumns == 0) { + // Start of a new row, make the x coordinate 0, increment the + // y coordinate with the max height of the previous row + currentX = 0; + currentY = height; + + if (i != 0) { + currentY += CoSEConstants.DEFAULT_COMPONENT_SEPERATION; + } + + height = 0; + } + + var tree = forest[i]; + + // Find the center of the tree + var centerNode = Layout.findCenterOfTree(tree); + + // Set the staring point of the next tree + currentStartingPoint.x = currentX; + currentStartingPoint.y = currentY; + + // Do a radial layout starting with the center + point = CoSELayout.radialLayout(tree, centerNode, currentStartingPoint); + + if (point.y > height) { + height = Math.floor(point.y); + } + + currentX = Math.floor(point.x + CoSEConstants.DEFAULT_COMPONENT_SEPERATION); + } + + this.transform(new PointD(LayoutConstants.WORLD_CENTER_X - point.x / 2, LayoutConstants.WORLD_CENTER_Y - point.y / 2)); +}; + +CoSELayout.radialLayout = function (tree, centerNode, startingPoint) { + var radialSep = Math.max(this.maxDiagonalInTree(tree), CoSEConstants.DEFAULT_RADIAL_SEPARATION); + CoSELayout.branchRadialLayout(centerNode, null, 0, 359, 0, radialSep); + var bounds = LGraph.calculateBounds(tree); + + var transform = new Transform(); + transform.setDeviceOrgX(bounds.getMinX()); + transform.setDeviceOrgY(bounds.getMinY()); + transform.setWorldOrgX(startingPoint.x); + transform.setWorldOrgY(startingPoint.y); + + for (var i = 0; i < tree.length; i++) { + var node = tree[i]; + node.transform(transform); + } + + var bottomRight = new PointD(bounds.getMaxX(), bounds.getMaxY()); + + return transform.inverseTransformPoint(bottomRight); +}; + +CoSELayout.branchRadialLayout = function (node, parentOfNode, startAngle, endAngle, distance, radialSeparation) { + // First, position this node by finding its angle. + var halfInterval = (endAngle - startAngle + 1) / 2; + + if (halfInterval < 0) { + halfInterval += 180; + } + + var nodeAngle = (halfInterval + startAngle) % 360; + var teta = nodeAngle * IGeometry.TWO_PI / 360; + + // Make polar to java cordinate conversion. + var cos_teta = Math.cos(teta); + var x_ = distance * Math.cos(teta); + var y_ = distance * Math.sin(teta); + + node.setCenter(x_, y_); + + // Traverse all neighbors of this node and recursively call this + // function. + var neighborEdges = []; + neighborEdges = neighborEdges.concat(node.getEdges()); + var childCount = neighborEdges.length; + + if (parentOfNode != null) { + childCount--; + } + + var branchCount = 0; + + var incEdgesCount = neighborEdges.length; + var startIndex; + + var edges = node.getEdgesBetween(parentOfNode); + + // If there are multiple edges, prune them until there remains only one + // edge. + while (edges.length > 1) { + //neighborEdges.remove(edges.remove(0)); + var temp = edges[0]; + edges.splice(0, 1); + var index = neighborEdges.indexOf(temp); + if (index >= 0) { + neighborEdges.splice(index, 1); + } + incEdgesCount--; + childCount--; + } + + if (parentOfNode != null) { + //assert edges.length == 1; + startIndex = (neighborEdges.indexOf(edges[0]) + 1) % incEdgesCount; + } else { + startIndex = 0; + } + + var stepAngle = Math.abs(endAngle - startAngle) / childCount; + + for (var i = startIndex; branchCount != childCount; i = ++i % incEdgesCount) { + var currentNeighbor = neighborEdges[i].getOtherEnd(node); + + // Don't back traverse to root node in current tree. + if (currentNeighbor == parentOfNode) { + continue; + } + + var childStartAngle = (startAngle + branchCount * stepAngle) % 360; + var childEndAngle = (childStartAngle + stepAngle) % 360; + + CoSELayout.branchRadialLayout(currentNeighbor, node, childStartAngle, childEndAngle, distance + radialSeparation, radialSeparation); + + branchCount++; + } +}; + +CoSELayout.maxDiagonalInTree = function (tree) { + var maxDiagonal = Integer.MIN_VALUE; + + for (var i = 0; i < tree.length; i++) { + var node = tree[i]; + var diagonal = node.getDiagonal(); + + if (diagonal > maxDiagonal) { + maxDiagonal = diagonal; + } + } + + return maxDiagonal; +}; + +CoSELayout.prototype.calcRepulsionRange = function () { + // formula is 2 x (level + 1) x idealEdgeLength + return 2 * (this.level + 1) * this.idealEdgeLength; +}; + +// Tiling methods + +// Group zero degree members whose parents are not to be tiled, create dummy parents where needed and fill memberGroups by their dummp parent id's +CoSELayout.prototype.groupZeroDegreeMembers = function () { + var self = this; + // array of [parent_id x oneDegreeNode_id] + var tempMemberGroups = {}; // A temporary map of parent node and its zero degree members + this.memberGroups = {}; // A map of dummy parent node and its zero degree members whose parents are not to be tiled + this.idToDummyNode = {}; // A map of id to dummy node + + var zeroDegree = []; // List of zero degree nodes whose parents are not to be tiled + var allNodes = this.graphManager.getAllNodes(); + + // Fill zero degree list + for (var i = 0; i < allNodes.length; i++) { + var node = allNodes[i]; + var parent = node.getParent(); + // If a node has zero degree and its parent is not to be tiled if exists add that node to zeroDegres list + if (this.getNodeDegreeWithChildren(node) === 0 && (parent.id == undefined || !this.getToBeTiled(parent))) { + zeroDegree.push(node); + } + } + + // Create a map of parent node and its zero degree members + for (var i = 0; i < zeroDegree.length; i++) { + var node = zeroDegree[i]; // Zero degree node itself + var p_id = node.getParent().id; // Parent id + + if (typeof tempMemberGroups[p_id] === "undefined") tempMemberGroups[p_id] = []; + + tempMemberGroups[p_id] = tempMemberGroups[p_id].concat(node); // Push node to the list belongs to its parent in tempMemberGroups + } + + // If there are at least two nodes at a level, create a dummy compound for them + Object.keys(tempMemberGroups).forEach(function (p_id) { + if (tempMemberGroups[p_id].length > 1) { + var dummyCompoundId = "DummyCompound_" + p_id; // The id of dummy compound which will be created soon + self.memberGroups[dummyCompoundId] = tempMemberGroups[p_id]; // Add dummy compound to memberGroups + + var parent = tempMemberGroups[p_id][0].getParent(); // The parent of zero degree nodes will be the parent of new dummy compound + + // Create a dummy compound with calculated id + var dummyCompound = new CoSENode(self.graphManager); + dummyCompound.id = dummyCompoundId; + dummyCompound.paddingLeft = parent.paddingLeft || 0; + dummyCompound.paddingRight = parent.paddingRight || 0; + dummyCompound.paddingBottom = parent.paddingBottom || 0; + dummyCompound.paddingTop = parent.paddingTop || 0; + + self.idToDummyNode[dummyCompoundId] = dummyCompound; + + var dummyParentGraph = self.getGraphManager().add(self.newGraph(), dummyCompound); + var parentGraph = parent.getChild(); + + // Add dummy compound to parent the graph + parentGraph.add(dummyCompound); + + // For each zero degree node in this level remove it from its parent graph and add it to the graph of dummy parent + for (var i = 0; i < tempMemberGroups[p_id].length; i++) { + var node = tempMemberGroups[p_id][i]; + + parentGraph.remove(node); + dummyParentGraph.add(node); + } + } + }); +}; + +CoSELayout.prototype.clearCompounds = function () { + var childGraphMap = {}; + var idToNode = {}; + + // Get compound ordering by finding the inner one first + this.performDFSOnCompounds(); + + for (var i = 0; i < this.compoundOrder.length; i++) { + + idToNode[this.compoundOrder[i].id] = this.compoundOrder[i]; + childGraphMap[this.compoundOrder[i].id] = [].concat(this.compoundOrder[i].getChild().getNodes()); + + // Remove children of compounds + this.graphManager.remove(this.compoundOrder[i].getChild()); + this.compoundOrder[i].child = null; + } + + this.graphManager.resetAllNodes(); + + // Tile the removed children + this.tileCompoundMembers(childGraphMap, idToNode); +}; + +CoSELayout.prototype.clearZeroDegreeMembers = function () { + var self = this; + var tiledZeroDegreePack = this.tiledZeroDegreePack = []; + + Object.keys(this.memberGroups).forEach(function (id) { + var compoundNode = self.idToDummyNode[id]; // Get the dummy compound + + tiledZeroDegreePack[id] = self.tileNodes(self.memberGroups[id], compoundNode.paddingLeft + compoundNode.paddingRight); + + // Set the width and height of the dummy compound as calculated + compoundNode.rect.width = tiledZeroDegreePack[id].width; + compoundNode.rect.height = tiledZeroDegreePack[id].height; + }); +}; + +CoSELayout.prototype.repopulateCompounds = function () { + for (var i = this.compoundOrder.length - 1; i >= 0; i--) { + var lCompoundNode = this.compoundOrder[i]; + var id = lCompoundNode.id; + var horizontalMargin = lCompoundNode.paddingLeft; + var verticalMargin = lCompoundNode.paddingTop; + + this.adjustLocations(this.tiledMemberPack[id], lCompoundNode.rect.x, lCompoundNode.rect.y, horizontalMargin, verticalMargin); + } +}; + +CoSELayout.prototype.repopulateZeroDegreeMembers = function () { + var self = this; + var tiledPack = this.tiledZeroDegreePack; + + Object.keys(tiledPack).forEach(function (id) { + var compoundNode = self.idToDummyNode[id]; // Get the dummy compound by its id + var horizontalMargin = compoundNode.paddingLeft; + var verticalMargin = compoundNode.paddingTop; + + // Adjust the positions of nodes wrt its compound + self.adjustLocations(tiledPack[id], compoundNode.rect.x, compoundNode.rect.y, horizontalMargin, verticalMargin); + }); +}; + +CoSELayout.prototype.getToBeTiled = function (node) { + var id = node.id; + //firstly check the previous results + if (this.toBeTiled[id] != null) { + return this.toBeTiled[id]; + } + + //only compound nodes are to be tiled + var childGraph = node.getChild(); + if (childGraph == null) { + this.toBeTiled[id] = false; + return false; + } + + var children = childGraph.getNodes(); // Get the children nodes + + //a compound node is not to be tiled if all of its compound children are not to be tiled + for (var i = 0; i < children.length; i++) { + var theChild = children[i]; + + if (this.getNodeDegree(theChild) > 0) { + this.toBeTiled[id] = false; + return false; + } + + //pass the children not having the compound structure + if (theChild.getChild() == null) { + this.toBeTiled[theChild.id] = false; + continue; + } + + if (!this.getToBeTiled(theChild)) { + this.toBeTiled[id] = false; + return false; + } + } + this.toBeTiled[id] = true; + return true; +}; + +// Get degree of a node depending of its edges and independent of its children +CoSELayout.prototype.getNodeDegree = function (node) { + var id = node.id; + var edges = node.getEdges(); + var degree = 0; + + // For the edges connected + for (var i = 0; i < edges.length; i++) { + var edge = edges[i]; + if (edge.getSource().id !== edge.getTarget().id) { + degree = degree + 1; + } + } + return degree; +}; + +// Get degree of a node with its children +CoSELayout.prototype.getNodeDegreeWithChildren = function (node) { + var degree = this.getNodeDegree(node); + if (node.getChild() == null) { + return degree; + } + var children = node.getChild().getNodes(); + for (var i = 0; i < children.length; i++) { + var child = children[i]; + degree += this.getNodeDegreeWithChildren(child); + } + return degree; +}; + +CoSELayout.prototype.performDFSOnCompounds = function () { + this.compoundOrder = []; + this.fillCompexOrderByDFS(this.graphManager.getRoot().getNodes()); +}; + +CoSELayout.prototype.fillCompexOrderByDFS = function (children) { + for (var i = 0; i < children.length; i++) { + var child = children[i]; + if (child.getChild() != null) { + this.fillCompexOrderByDFS(child.getChild().getNodes()); + } + if (this.getToBeTiled(child)) { + this.compoundOrder.push(child); + } + } +}; + +/** +* This method places each zero degree member wrt given (x,y) coordinates (top left). +*/ +CoSELayout.prototype.adjustLocations = function (organization, x, y, compoundHorizontalMargin, compoundVerticalMargin) { + x += compoundHorizontalMargin; + y += compoundVerticalMargin; + + var left = x; + + for (var i = 0; i < organization.rows.length; i++) { + var row = organization.rows[i]; + x = left; + var maxHeight = 0; + + for (var j = 0; j < row.length; j++) { + var lnode = row[j]; + + lnode.rect.x = x; // + lnode.rect.width / 2; + lnode.rect.y = y; // + lnode.rect.height / 2; + + x += lnode.rect.width + organization.horizontalPadding; + + if (lnode.rect.height > maxHeight) maxHeight = lnode.rect.height; + } + + y += maxHeight + organization.verticalPadding; + } +}; + +CoSELayout.prototype.tileCompoundMembers = function (childGraphMap, idToNode) { + var self = this; + this.tiledMemberPack = []; + + Object.keys(childGraphMap).forEach(function (id) { + // Get the compound node + var compoundNode = idToNode[id]; + + self.tiledMemberPack[id] = self.tileNodes(childGraphMap[id], compoundNode.paddingLeft + compoundNode.paddingRight); + + compoundNode.rect.width = self.tiledMemberPack[id].width; + compoundNode.rect.height = self.tiledMemberPack[id].height; + }); +}; + +CoSELayout.prototype.tileNodes = function (nodes, minWidth) { + var verticalPadding = CoSEConstants.TILING_PADDING_VERTICAL; + var horizontalPadding = CoSEConstants.TILING_PADDING_HORIZONTAL; + var organization = { + rows: [], + rowWidth: [], + rowHeight: [], + width: 0, + height: minWidth, // assume minHeight equals to minWidth + verticalPadding: verticalPadding, + horizontalPadding: horizontalPadding + }; + + // Sort the nodes in ascending order of their areas + nodes.sort(function (n1, n2) { + if (n1.rect.width * n1.rect.height > n2.rect.width * n2.rect.height) return -1; + if (n1.rect.width * n1.rect.height < n2.rect.width * n2.rect.height) return 1; + return 0; + }); + + // Create the organization -> tile members + for (var i = 0; i < nodes.length; i++) { + var lNode = nodes[i]; + + if (organization.rows.length == 0) { + this.insertNodeToRow(organization, lNode, 0, minWidth); + } else if (this.canAddHorizontal(organization, lNode.rect.width, lNode.rect.height)) { + this.insertNodeToRow(organization, lNode, this.getShortestRowIndex(organization), minWidth); + } else { + this.insertNodeToRow(organization, lNode, organization.rows.length, minWidth); + } + + this.shiftToLastRow(organization); + } + + return organization; +}; + +CoSELayout.prototype.insertNodeToRow = function (organization, node, rowIndex, minWidth) { + var minCompoundSize = minWidth; + + // Add new row if needed + if (rowIndex == organization.rows.length) { + var secondDimension = []; + + organization.rows.push(secondDimension); + organization.rowWidth.push(minCompoundSize); + organization.rowHeight.push(0); + } + + // Update row width + var w = organization.rowWidth[rowIndex] + node.rect.width; + + if (organization.rows[rowIndex].length > 0) { + w += organization.horizontalPadding; + } + + organization.rowWidth[rowIndex] = w; + // Update compound width + if (organization.width < w) { + organization.width = w; + } + + // Update height + var h = node.rect.height; + if (rowIndex > 0) h += organization.verticalPadding; + + var extraHeight = 0; + if (h > organization.rowHeight[rowIndex]) { + extraHeight = organization.rowHeight[rowIndex]; + organization.rowHeight[rowIndex] = h; + extraHeight = organization.rowHeight[rowIndex] - extraHeight; + } + + organization.height += extraHeight; + + // Insert node + organization.rows[rowIndex].push(node); +}; + +//Scans the rows of an organization and returns the one with the min width +CoSELayout.prototype.getShortestRowIndex = function (organization) { + var r = -1; + var min = Number.MAX_VALUE; + + for (var i = 0; i < organization.rows.length; i++) { + if (organization.rowWidth[i] < min) { + r = i; + min = organization.rowWidth[i]; + } + } + return r; +}; + +//Scans the rows of an organization and returns the one with the max width +CoSELayout.prototype.getLongestRowIndex = function (organization) { + var r = -1; + var max = Number.MIN_VALUE; + + for (var i = 0; i < organization.rows.length; i++) { + + if (organization.rowWidth[i] > max) { + r = i; + max = organization.rowWidth[i]; + } + } + + return r; +}; + +/** +* This method checks whether adding extra width to the organization violates +* the aspect ratio(1) or not. +*/ +CoSELayout.prototype.canAddHorizontal = function (organization, extraWidth, extraHeight) { + + var sri = this.getShortestRowIndex(organization); + + if (sri < 0) { + return true; + } + + var min = organization.rowWidth[sri]; + + if (min + organization.horizontalPadding + extraWidth <= organization.width) return true; + + var hDiff = 0; + + // Adding to an existing row + if (organization.rowHeight[sri] < extraHeight) { + if (sri > 0) hDiff = extraHeight + organization.verticalPadding - organization.rowHeight[sri]; + } + + var add_to_row_ratio; + if (organization.width - min >= extraWidth + organization.horizontalPadding) { + add_to_row_ratio = (organization.height + hDiff) / (min + extraWidth + organization.horizontalPadding); + } else { + add_to_row_ratio = (organization.height + hDiff) / organization.width; + } + + // Adding a new row for this node + hDiff = extraHeight + organization.verticalPadding; + var add_new_row_ratio; + if (organization.width < extraWidth) { + add_new_row_ratio = (organization.height + hDiff) / extraWidth; + } else { + add_new_row_ratio = (organization.height + hDiff) / organization.width; + } + + if (add_new_row_ratio < 1) add_new_row_ratio = 1 / add_new_row_ratio; + + if (add_to_row_ratio < 1) add_to_row_ratio = 1 / add_to_row_ratio; + + return add_to_row_ratio < add_new_row_ratio; +}; + +//If moving the last node from the longest row and adding it to the last +//row makes the bounding box smaller, do it. +CoSELayout.prototype.shiftToLastRow = function (organization) { + var longest = this.getLongestRowIndex(organization); + var last = organization.rowWidth.length - 1; + var row = organization.rows[longest]; + var node = row[row.length - 1]; + + var diff = node.width + organization.horizontalPadding; + + // Check if there is enough space on the last row + if (organization.width - organization.rowWidth[last] > diff && longest != last) { + // Remove the last element of the longest row + row.splice(-1, 1); + + // Push it to the last row + organization.rows[last].push(node); + + organization.rowWidth[longest] = organization.rowWidth[longest] - diff; + organization.rowWidth[last] = organization.rowWidth[last] + diff; + organization.width = organization.rowWidth[instance.getLongestRowIndex(organization)]; + + // Update heights of the organization + var maxHeight = Number.MIN_VALUE; + for (var i = 0; i < row.length; i++) { + if (row[i].height > maxHeight) maxHeight = row[i].height; + } + if (longest > 0) maxHeight += organization.verticalPadding; + + var prevTotal = organization.rowHeight[longest] + organization.rowHeight[last]; + + organization.rowHeight[longest] = maxHeight; + if (organization.rowHeight[last] < node.height + organization.verticalPadding) organization.rowHeight[last] = node.height + organization.verticalPadding; + + var finalTotal = organization.rowHeight[longest] + organization.rowHeight[last]; + organization.height += finalTotal - prevTotal; + + this.shiftToLastRow(organization); + } +}; + +CoSELayout.prototype.tilingPreLayout = function () { + if (CoSEConstants.TILE) { + // Find zero degree nodes and create a compound for each level + this.groupZeroDegreeMembers(); + // Tile and clear children of each compound + this.clearCompounds(); + // Separately tile and clear zero degree nodes for each level + this.clearZeroDegreeMembers(); + } +}; + +CoSELayout.prototype.tilingPostLayout = function () { + if (CoSEConstants.TILE) { + this.repopulateZeroDegreeMembers(); + this.repopulateCompounds(); + } +}; + +// ----------------------------------------------------------------------------- +// Section: Tree Reduction methods +// ----------------------------------------------------------------------------- +// Reduce trees +CoSELayout.prototype.reduceTrees = function () { + var prunedNodesAll = []; + var containsLeaf = true; + var node; + + while (containsLeaf) { + var allNodes = this.graphManager.getAllNodes(); + var prunedNodesInStepTemp = []; + containsLeaf = false; + + for (var i = 0; i < allNodes.length; i++) { + node = allNodes[i]; + if (node.getEdges().length == 1 && !node.getEdges()[0].isInterGraph && node.getChild() == null) { + prunedNodesInStepTemp.push([node, node.getEdges()[0], node.getOwner()]); + containsLeaf = true; + } + } + if (containsLeaf == true) { + var prunedNodesInStep = []; + for (var j = 0; j < prunedNodesInStepTemp.length; j++) { + if (prunedNodesInStepTemp[j][0].getEdges().length == 1) { + prunedNodesInStep.push(prunedNodesInStepTemp[j]); + prunedNodesInStepTemp[j][0].getOwner().remove(prunedNodesInStepTemp[j][0]); + } + } + prunedNodesAll.push(prunedNodesInStep); + this.graphManager.resetAllNodes(); + this.graphManager.resetAllEdges(); + } + } + this.prunedNodesAll = prunedNodesAll; +}; + +// Grow tree one step +CoSELayout.prototype.growTree = function (prunedNodesAll) { + var lengthOfPrunedNodesInStep = prunedNodesAll.length; + var prunedNodesInStep = prunedNodesAll[lengthOfPrunedNodesInStep - 1]; + + var nodeData; + for (var i = 0; i < prunedNodesInStep.length; i++) { + nodeData = prunedNodesInStep[i]; + + this.findPlaceforPrunedNode(nodeData); + + nodeData[2].add(nodeData[0]); + nodeData[2].add(nodeData[1], nodeData[1].source, nodeData[1].target); + } + + prunedNodesAll.splice(prunedNodesAll.length - 1, 1); + this.graphManager.resetAllNodes(); + this.graphManager.resetAllEdges(); +}; + +// Find an appropriate position to replace pruned node, this method can be improved +CoSELayout.prototype.findPlaceforPrunedNode = function (nodeData) { + + var gridForPrunedNode; + var nodeToConnect; + var prunedNode = nodeData[0]; + if (prunedNode == nodeData[1].source) { + nodeToConnect = nodeData[1].target; + } else { + nodeToConnect = nodeData[1].source; + } + var startGridX = nodeToConnect.startX; + var finishGridX = nodeToConnect.finishX; + var startGridY = nodeToConnect.startY; + var finishGridY = nodeToConnect.finishY; + + var upNodeCount = 0; + var downNodeCount = 0; + var rightNodeCount = 0; + var leftNodeCount = 0; + var controlRegions = [upNodeCount, rightNodeCount, downNodeCount, leftNodeCount]; + + if (startGridY > 0) { + for (var i = startGridX; i <= finishGridX; i++) { + controlRegions[0] += this.grid[i][startGridY - 1].length + this.grid[i][startGridY].length - 1; + } + } + if (finishGridX < this.grid.length - 1) { + for (var i = startGridY; i <= finishGridY; i++) { + controlRegions[1] += this.grid[finishGridX + 1][i].length + this.grid[finishGridX][i].length - 1; + } + } + if (finishGridY < this.grid[0].length - 1) { + for (var i = startGridX; i <= finishGridX; i++) { + controlRegions[2] += this.grid[i][finishGridY + 1].length + this.grid[i][finishGridY].length - 1; + } + } + if (startGridX > 0) { + for (var i = startGridY; i <= finishGridY; i++) { + controlRegions[3] += this.grid[startGridX - 1][i].length + this.grid[startGridX][i].length - 1; + } + } + var min = Integer.MAX_VALUE; + var minCount; + var minIndex; + for (var j = 0; j < controlRegions.length; j++) { + if (controlRegions[j] < min) { + min = controlRegions[j]; + minCount = 1; + minIndex = j; + } else if (controlRegions[j] == min) { + minCount++; + } + } + + if (minCount == 3 && min == 0) { + if (controlRegions[0] == 0 && controlRegions[1] == 0 && controlRegions[2] == 0) { + gridForPrunedNode = 1; + } else if (controlRegions[0] == 0 && controlRegions[1] == 0 && controlRegions[3] == 0) { + gridForPrunedNode = 0; + } else if (controlRegions[0] == 0 && controlRegions[2] == 0 && controlRegions[3] == 0) { + gridForPrunedNode = 3; + } else if (controlRegions[1] == 0 && controlRegions[2] == 0 && controlRegions[3] == 0) { + gridForPrunedNode = 2; + } + } else if (minCount == 2 && min == 0) { + var random = Math.floor(Math.random() * 2); + if (controlRegions[0] == 0 && controlRegions[1] == 0) { + ; + if (random == 0) { + gridForPrunedNode = 0; + } else { + gridForPrunedNode = 1; + } + } else if (controlRegions[0] == 0 && controlRegions[2] == 0) { + if (random == 0) { + gridForPrunedNode = 0; + } else { + gridForPrunedNode = 2; + } + } else if (controlRegions[0] == 0 && controlRegions[3] == 0) { + if (random == 0) { + gridForPrunedNode = 0; + } else { + gridForPrunedNode = 3; + } + } else if (controlRegions[1] == 0 && controlRegions[2] == 0) { + if (random == 0) { + gridForPrunedNode = 1; + } else { + gridForPrunedNode = 2; + } + } else if (controlRegions[1] == 0 && controlRegions[3] == 0) { + if (random == 0) { + gridForPrunedNode = 1; + } else { + gridForPrunedNode = 3; + } + } else { + if (random == 0) { + gridForPrunedNode = 2; + } else { + gridForPrunedNode = 3; + } + } + } else if (minCount == 4 && min == 0) { + var random = Math.floor(Math.random() * 4); + gridForPrunedNode = random; + } else { + gridForPrunedNode = minIndex; + } + + if (gridForPrunedNode == 0) { + prunedNode.setCenter(nodeToConnect.getCenterX(), nodeToConnect.getCenterY() - nodeToConnect.getHeight() / 2 - FDLayoutConstants.DEFAULT_EDGE_LENGTH - prunedNode.getHeight() / 2); + } else if (gridForPrunedNode == 1) { + prunedNode.setCenter(nodeToConnect.getCenterX() + nodeToConnect.getWidth() / 2 + FDLayoutConstants.DEFAULT_EDGE_LENGTH + prunedNode.getWidth() / 2, nodeToConnect.getCenterY()); + } else if (gridForPrunedNode == 2) { + prunedNode.setCenter(nodeToConnect.getCenterX(), nodeToConnect.getCenterY() + nodeToConnect.getHeight() / 2 + FDLayoutConstants.DEFAULT_EDGE_LENGTH + prunedNode.getHeight() / 2); + } else { + prunedNode.setCenter(nodeToConnect.getCenterX() - nodeToConnect.getWidth() / 2 - FDLayoutConstants.DEFAULT_EDGE_LENGTH - prunedNode.getWidth() / 2, nodeToConnect.getCenterY()); + } +}; + +module.exports = CoSELayout; + +/***/ }), +/* 7 */ +/***/ (function(module, exports, __nested_webpack_require_45620__) { + +"use strict"; + + +var coseBase = {}; + +coseBase.layoutBase = __nested_webpack_require_45620__(0); +coseBase.CoSEConstants = __nested_webpack_require_45620__(1); +coseBase.CoSEEdge = __nested_webpack_require_45620__(2); +coseBase.CoSEGraph = __nested_webpack_require_45620__(3); +coseBase.CoSEGraphManager = __nested_webpack_require_45620__(4); +coseBase.CoSELayout = __nested_webpack_require_45620__(6); +coseBase.CoSENode = __nested_webpack_require_45620__(5); + +module.exports = coseBase; + +/***/ }) +/******/ ]); +}); + +/***/ }), + +/***/ 14607: +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +(function webpackUniversalModuleDefinition(root, factory) { + if(true) + module.exports = factory(__webpack_require__(84182)); + else {} +})(this, function(__WEBPACK_EXTERNAL_MODULE_0__) { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __nested_webpack_require_659__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __nested_webpack_require_659__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __nested_webpack_require_659__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __nested_webpack_require_659__.c = installedModules; +/******/ +/******/ // identity function for calling harmony imports with the correct context +/******/ __nested_webpack_require_659__.i = function(value) { return value; }; +/******/ +/******/ // define getter function for harmony exports +/******/ __nested_webpack_require_659__.d = function(exports, name, getter) { +/******/ if(!__nested_webpack_require_659__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { +/******/ configurable: false, +/******/ enumerable: true, +/******/ get: getter +/******/ }); +/******/ } +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __nested_webpack_require_659__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __nested_webpack_require_659__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __nested_webpack_require_659__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __nested_webpack_require_659__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __nested_webpack_require_659__(__nested_webpack_require_659__.s = 1); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports) { + +module.exports = __WEBPACK_EXTERNAL_MODULE_0__; + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __nested_webpack_require_3201__) { + +"use strict"; + + +var LayoutConstants = __nested_webpack_require_3201__(0).layoutBase.LayoutConstants; +var FDLayoutConstants = __nested_webpack_require_3201__(0).layoutBase.FDLayoutConstants; +var CoSEConstants = __nested_webpack_require_3201__(0).CoSEConstants; +var CoSELayout = __nested_webpack_require_3201__(0).CoSELayout; +var CoSENode = __nested_webpack_require_3201__(0).CoSENode; +var PointD = __nested_webpack_require_3201__(0).layoutBase.PointD; +var DimensionD = __nested_webpack_require_3201__(0).layoutBase.DimensionD; + +var defaults = { + // Called on `layoutready` + ready: function ready() {}, + // Called on `layoutstop` + stop: function stop() {}, + // 'draft', 'default' or 'proof" + // - 'draft' fast cooling rate + // - 'default' moderate cooling rate + // - "proof" slow cooling rate + quality: 'default', + // include labels in node dimensions + nodeDimensionsIncludeLabels: false, + // number of ticks per frame; higher is faster but more jerky + refresh: 30, + // Whether to fit the network view after when done + fit: true, + // Padding on fit + padding: 10, + // Whether to enable incremental mode + randomize: true, + // Node repulsion (non overlapping) multiplier + nodeRepulsion: 4500, + // Ideal edge (non nested) length + idealEdgeLength: 50, + // Divisor to compute edge forces + edgeElasticity: 0.45, + // Nesting factor (multiplier) to compute ideal edge length for nested edges + nestingFactor: 0.1, + // Gravity force (constant) + gravity: 0.25, + // Maximum number of iterations to perform + numIter: 2500, + // For enabling tiling + tile: true, + // Type of layout animation. The option set is {'during', 'end', false} + animate: 'end', + // Duration for animate:end + animationDuration: 500, + // Represents the amount of the vertical space to put between the zero degree members during the tiling operation(can also be a function) + tilingPaddingVertical: 10, + // Represents the amount of the horizontal space to put between the zero degree members during the tiling operation(can also be a function) + tilingPaddingHorizontal: 10, + // Gravity range (constant) for compounds + gravityRangeCompound: 1.5, + // Gravity force (constant) for compounds + gravityCompound: 1.0, + // Gravity range (constant) + gravityRange: 3.8, + // Initial cooling factor for incremental layout + initialEnergyOnIncremental: 0.5 +}; + +function extend(defaults, options) { + var obj = {}; + + for (var i in defaults) { + obj[i] = defaults[i]; + } + + for (var i in options) { + obj[i] = options[i]; + } + + return obj; +}; + +function _CoSELayout(_options) { + this.options = extend(defaults, _options); + getUserOptions(this.options); +} + +var getUserOptions = function getUserOptions(options) { + if (options.nodeRepulsion != null) CoSEConstants.DEFAULT_REPULSION_STRENGTH = FDLayoutConstants.DEFAULT_REPULSION_STRENGTH = options.nodeRepulsion; + if (options.idealEdgeLength != null) CoSEConstants.DEFAULT_EDGE_LENGTH = FDLayoutConstants.DEFAULT_EDGE_LENGTH = options.idealEdgeLength; + if (options.edgeElasticity != null) CoSEConstants.DEFAULT_SPRING_STRENGTH = FDLayoutConstants.DEFAULT_SPRING_STRENGTH = options.edgeElasticity; + if (options.nestingFactor != null) CoSEConstants.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR = FDLayoutConstants.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR = options.nestingFactor; + if (options.gravity != null) CoSEConstants.DEFAULT_GRAVITY_STRENGTH = FDLayoutConstants.DEFAULT_GRAVITY_STRENGTH = options.gravity; + if (options.numIter != null) CoSEConstants.MAX_ITERATIONS = FDLayoutConstants.MAX_ITERATIONS = options.numIter; + if (options.gravityRange != null) CoSEConstants.DEFAULT_GRAVITY_RANGE_FACTOR = FDLayoutConstants.DEFAULT_GRAVITY_RANGE_FACTOR = options.gravityRange; + if (options.gravityCompound != null) CoSEConstants.DEFAULT_COMPOUND_GRAVITY_STRENGTH = FDLayoutConstants.DEFAULT_COMPOUND_GRAVITY_STRENGTH = options.gravityCompound; + if (options.gravityRangeCompound != null) CoSEConstants.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR = FDLayoutConstants.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR = options.gravityRangeCompound; + if (options.initialEnergyOnIncremental != null) CoSEConstants.DEFAULT_COOLING_FACTOR_INCREMENTAL = FDLayoutConstants.DEFAULT_COOLING_FACTOR_INCREMENTAL = options.initialEnergyOnIncremental; + + if (options.quality == 'draft') LayoutConstants.QUALITY = 0;else if (options.quality == 'proof') LayoutConstants.QUALITY = 2;else LayoutConstants.QUALITY = 1; + + CoSEConstants.NODE_DIMENSIONS_INCLUDE_LABELS = FDLayoutConstants.NODE_DIMENSIONS_INCLUDE_LABELS = LayoutConstants.NODE_DIMENSIONS_INCLUDE_LABELS = options.nodeDimensionsIncludeLabels; + CoSEConstants.DEFAULT_INCREMENTAL = FDLayoutConstants.DEFAULT_INCREMENTAL = LayoutConstants.DEFAULT_INCREMENTAL = !options.randomize; + CoSEConstants.ANIMATE = FDLayoutConstants.ANIMATE = LayoutConstants.ANIMATE = options.animate; + CoSEConstants.TILE = options.tile; + CoSEConstants.TILING_PADDING_VERTICAL = typeof options.tilingPaddingVertical === 'function' ? options.tilingPaddingVertical.call() : options.tilingPaddingVertical; + CoSEConstants.TILING_PADDING_HORIZONTAL = typeof options.tilingPaddingHorizontal === 'function' ? options.tilingPaddingHorizontal.call() : options.tilingPaddingHorizontal; +}; + +_CoSELayout.prototype.run = function () { + var ready; + var frameId; + var options = this.options; + var idToLNode = this.idToLNode = {}; + var layout = this.layout = new CoSELayout(); + var self = this; + + self.stopped = false; + + this.cy = this.options.cy; + + this.cy.trigger({ type: 'layoutstart', layout: this }); + + var gm = layout.newGraphManager(); + this.gm = gm; + + var nodes = this.options.eles.nodes(); + var edges = this.options.eles.edges(); + + this.root = gm.addRoot(); + this.processChildrenList(this.root, this.getTopMostNodes(nodes), layout); + + for (var i = 0; i < edges.length; i++) { + var edge = edges[i]; + var sourceNode = this.idToLNode[edge.data("source")]; + var targetNode = this.idToLNode[edge.data("target")]; + if (sourceNode !== targetNode && sourceNode.getEdgesBetween(targetNode).length == 0) { + var e1 = gm.add(layout.newEdge(), sourceNode, targetNode); + e1.id = edge.id(); + } + } + + var getPositions = function getPositions(ele, i) { + if (typeof ele === "number") { + ele = i; + } + var theId = ele.data('id'); + var lNode = self.idToLNode[theId]; + + return { + x: lNode.getRect().getCenterX(), + y: lNode.getRect().getCenterY() + }; + }; + + /* + * Reposition nodes in iterations animatedly + */ + var iterateAnimated = function iterateAnimated() { + // Thigs to perform after nodes are repositioned on screen + var afterReposition = function afterReposition() { + if (options.fit) { + options.cy.fit(options.eles, options.padding); + } + + if (!ready) { + ready = true; + self.cy.one('layoutready', options.ready); + self.cy.trigger({ type: 'layoutready', layout: self }); + } + }; + + var ticksPerFrame = self.options.refresh; + var isDone; + + for (var i = 0; i < ticksPerFrame && !isDone; i++) { + isDone = self.stopped || self.layout.tick(); + } + + // If layout is done + if (isDone) { + // If the layout is not a sublayout and it is successful perform post layout. + if (layout.checkLayoutSuccess() && !layout.isSubLayout) { + layout.doPostLayout(); + } + + // If layout has a tilingPostLayout function property call it. + if (layout.tilingPostLayout) { + layout.tilingPostLayout(); + } + + layout.isLayoutFinished = true; + + self.options.eles.nodes().positions(getPositions); + + afterReposition(); + + // trigger layoutstop when the layout stops (e.g. finishes) + self.cy.one('layoutstop', self.options.stop); + self.cy.trigger({ type: 'layoutstop', layout: self }); + + if (frameId) { + cancelAnimationFrame(frameId); + } + + ready = false; + return; + } + + var animationData = self.layout.getPositionsData(); // Get positions of layout nodes note that all nodes may not be layout nodes because of tiling + + // Position nodes, for the nodes whose id does not included in data (because they are removed from their parents and included in dummy compounds) + // use position of their ancestors or dummy ancestors + options.eles.nodes().positions(function (ele, i) { + if (typeof ele === "number") { + ele = i; + } + // If ele is a compound node, then its position will be defined by its children + if (!ele.isParent()) { + var theId = ele.id(); + var pNode = animationData[theId]; + var temp = ele; + // If pNode is undefined search until finding position data of its first ancestor (It may be dummy as well) + while (pNode == null) { + pNode = animationData[temp.data('parent')] || animationData['DummyCompound_' + temp.data('parent')]; + animationData[theId] = pNode; + temp = temp.parent()[0]; + if (temp == undefined) { + break; + } + } + if (pNode != null) { + return { + x: pNode.x, + y: pNode.y + }; + } else { + return { + x: ele.position('x'), + y: ele.position('y') + }; + } + } + }); + + afterReposition(); + + frameId = requestAnimationFrame(iterateAnimated); + }; + + /* + * Listen 'layoutstarted' event and start animated iteration if animate option is 'during' + */ + layout.addListener('layoutstarted', function () { + if (self.options.animate === 'during') { + frameId = requestAnimationFrame(iterateAnimated); + } + }); + + layout.runLayout(); // Run cose layout + + /* + * If animate option is not 'during' ('end' or false) perform these here (If it is 'during' similar things are already performed) + */ + if (this.options.animate !== "during") { + self.options.eles.nodes().not(":parent").layoutPositions(self, self.options, getPositions); // Use layout positions to reposition the nodes it considers the options parameter + ready = false; + } + + return this; // chaining +}; + +//Get the top most ones of a list of nodes +_CoSELayout.prototype.getTopMostNodes = function (nodes) { + var nodesMap = {}; + for (var i = 0; i < nodes.length; i++) { + nodesMap[nodes[i].id()] = true; + } + var roots = nodes.filter(function (ele, i) { + if (typeof ele === "number") { + ele = i; + } + var parent = ele.parent()[0]; + while (parent != null) { + if (nodesMap[parent.id()]) { + return false; + } + parent = parent.parent()[0]; + } + return true; + }); + + return roots; +}; + +_CoSELayout.prototype.processChildrenList = function (parent, children, layout) { + var size = children.length; + for (var i = 0; i < size; i++) { + var theChild = children[i]; + var children_of_children = theChild.children(); + var theNode; + + var dimensions = theChild.layoutDimensions({ + nodeDimensionsIncludeLabels: this.options.nodeDimensionsIncludeLabels + }); + + if (theChild.outerWidth() != null && theChild.outerHeight() != null) { + theNode = parent.add(new CoSENode(layout.graphManager, new PointD(theChild.position('x') - dimensions.w / 2, theChild.position('y') - dimensions.h / 2), new DimensionD(parseFloat(dimensions.w), parseFloat(dimensions.h)))); + } else { + theNode = parent.add(new CoSENode(this.graphManager)); + } + // Attach id to the layout node + theNode.id = theChild.data("id"); + // Attach the paddings of cy node to layout node + theNode.paddingLeft = parseInt(theChild.css('padding')); + theNode.paddingTop = parseInt(theChild.css('padding')); + theNode.paddingRight = parseInt(theChild.css('padding')); + theNode.paddingBottom = parseInt(theChild.css('padding')); + + //Attach the label properties to compound if labels will be included in node dimensions + if (this.options.nodeDimensionsIncludeLabels) { + if (theChild.isParent()) { + var labelWidth = theChild.boundingBox({ includeLabels: true, includeNodes: false }).w; + var labelHeight = theChild.boundingBox({ includeLabels: true, includeNodes: false }).h; + var labelPos = theChild.css("text-halign"); + theNode.labelWidth = labelWidth; + theNode.labelHeight = labelHeight; + theNode.labelPos = labelPos; + } + } + + // Map the layout node + this.idToLNode[theChild.data("id")] = theNode; + + if (isNaN(theNode.rect.x)) { + theNode.rect.x = 0; + } + + if (isNaN(theNode.rect.y)) { + theNode.rect.y = 0; + } + + if (children_of_children != null && children_of_children.length > 0) { + var theNewGraph; + theNewGraph = layout.getGraphManager().add(layout.newGraph(), theNode); + this.processChildrenList(theNewGraph, children_of_children, layout); + } + } +}; + +/** + * @brief : called on continuous layouts to stop them before they finish + */ +_CoSELayout.prototype.stop = function () { + this.stopped = true; + + return this; // chaining +}; + +var register = function register(cytoscape) { + // var Layout = getLayout( cytoscape ); + + cytoscape('layout', 'cose-bilkent', _CoSELayout); +}; + +// auto reg for globals +if (typeof cytoscape !== 'undefined') { + register(cytoscape); +} + +module.exports = register; + +/***/ }) +/******/ ]); +}); + +/***/ }), + +/***/ 71377: +/***/ (function(module) { + +/** + * Copyright (c) 2016-2023, The Cytoscape Consortium. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the “Software”), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +(function (global, factory) { + true ? module.exports = factory() : + 0; +})(this, (function () { 'use strict'; + + function _typeof(obj) { + "@babel/helpers - typeof"; + + return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { + return typeof obj; + } : function (obj) { + return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }, _typeof(obj); + } + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + Object.defineProperty(Constructor, "prototype", { + writable: false + }); + return Constructor; + } + + function _defineProperty$1(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; + } + + function _slicedToArray(arr, i) { + return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); + } + + function _arrayWithHoles(arr) { + if (Array.isArray(arr)) return arr; + } + + function _iterableToArrayLimit(arr, i) { + var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; + + if (_i == null) return; + var _arr = []; + var _n = true; + var _d = false; + + var _s, _e; + + try { + for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { + _arr.push(_s.value); + + if (i && _arr.length === i) break; + } + } catch (err) { + _d = true; + _e = err; + } finally { + try { + if (!_n && _i["return"] != null) _i["return"](); + } finally { + if (_d) throw _e; + } + } + + return _arr; + } + + function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); + } + + function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; + + return arr2; + } + + function _nonIterableRest() { + throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + + var _window = typeof window === 'undefined' ? null : window; // eslint-disable-line no-undef + + var navigator = _window ? _window.navigator : null; + _window ? _window.document : null; + + var typeofstr = _typeof(''); + + var typeofobj = _typeof({}); + + var typeoffn = _typeof(function () {}); + + var typeofhtmlele = typeof HTMLElement === "undefined" ? "undefined" : _typeof(HTMLElement); + + var instanceStr = function instanceStr(obj) { + return obj && obj.instanceString && fn$6(obj.instanceString) ? obj.instanceString() : null; + }; + + var string = function string(obj) { + return obj != null && _typeof(obj) == typeofstr; + }; + var fn$6 = function fn(obj) { + return obj != null && _typeof(obj) === typeoffn; + }; + var array = function array(obj) { + return !elementOrCollection(obj) && (Array.isArray ? Array.isArray(obj) : obj != null && obj instanceof Array); + }; + var plainObject = function plainObject(obj) { + return obj != null && _typeof(obj) === typeofobj && !array(obj) && obj.constructor === Object; + }; + var object = function object(obj) { + return obj != null && _typeof(obj) === typeofobj; + }; + var number$1 = function number(obj) { + return obj != null && _typeof(obj) === _typeof(1) && !isNaN(obj); + }; + var integer = function integer(obj) { + return number$1(obj) && Math.floor(obj) === obj; + }; + var htmlElement = function htmlElement(obj) { + if ('undefined' === typeofhtmlele) { + return undefined; + } else { + return null != obj && obj instanceof HTMLElement; + } + }; + var elementOrCollection = function elementOrCollection(obj) { + return element(obj) || collection(obj); + }; + var element = function element(obj) { + return instanceStr(obj) === 'collection' && obj._private.single; + }; + var collection = function collection(obj) { + return instanceStr(obj) === 'collection' && !obj._private.single; + }; + var core = function core(obj) { + return instanceStr(obj) === 'core'; + }; + var stylesheet = function stylesheet(obj) { + return instanceStr(obj) === 'stylesheet'; + }; + var event = function event(obj) { + return instanceStr(obj) === 'event'; + }; + var emptyString = function emptyString(obj) { + if (obj === undefined || obj === null) { + // null is empty + return true; + } else if (obj === '' || obj.match(/^\s+$/)) { + return true; // empty string is empty + } + + return false; // otherwise, we don't know what we've got + }; + var domElement = function domElement(obj) { + if (typeof HTMLElement === 'undefined') { + return false; // we're not in a browser so it doesn't matter + } else { + return obj instanceof HTMLElement; + } + }; + var boundingBox = function boundingBox(obj) { + return plainObject(obj) && number$1(obj.x1) && number$1(obj.x2) && number$1(obj.y1) && number$1(obj.y2); + }; + var promise = function promise(obj) { + return object(obj) && fn$6(obj.then); + }; + var ms = function ms() { + return navigator && navigator.userAgent.match(/msie|trident|edge/i); + }; // probably a better way to detect this... + + var memoize$1 = function memoize(fn, keyFn) { + if (!keyFn) { + keyFn = function keyFn() { + if (arguments.length === 1) { + return arguments[0]; + } else if (arguments.length === 0) { + return 'undefined'; + } + + var args = []; + + for (var i = 0; i < arguments.length; i++) { + args.push(arguments[i]); + } + + return args.join('$'); + }; + } + + var memoizedFn = function memoizedFn() { + var self = this; + var args = arguments; + var ret; + var k = keyFn.apply(self, args); + var cache = memoizedFn.cache; + + if (!(ret = cache[k])) { + ret = cache[k] = fn.apply(self, args); + } + + return ret; + }; + + memoizedFn.cache = {}; + return memoizedFn; + }; + + var camel2dash = memoize$1(function (str) { + return str.replace(/([A-Z])/g, function (v) { + return '-' + v.toLowerCase(); + }); + }); + var dash2camel = memoize$1(function (str) { + return str.replace(/(-\w)/g, function (v) { + return v[1].toUpperCase(); + }); + }); + var prependCamel = memoize$1(function (prefix, str) { + return prefix + str[0].toUpperCase() + str.substring(1); + }, function (prefix, str) { + return prefix + '$' + str; + }); + var capitalize = function capitalize(str) { + if (emptyString(str)) { + return str; + } + + return str.charAt(0).toUpperCase() + str.substring(1); + }; + + var number = '(?:[-+]?(?:(?:\\d+|\\d*\\.\\d+)(?:[Ee][+-]?\\d+)?))'; + var rgba = 'rgb[a]?\\((' + number + '[%]?)\\s*,\\s*(' + number + '[%]?)\\s*,\\s*(' + number + '[%]?)(?:\\s*,\\s*(' + number + '))?\\)'; + var rgbaNoBackRefs = 'rgb[a]?\\((?:' + number + '[%]?)\\s*,\\s*(?:' + number + '[%]?)\\s*,\\s*(?:' + number + '[%]?)(?:\\s*,\\s*(?:' + number + '))?\\)'; + var hsla = 'hsl[a]?\\((' + number + ')\\s*,\\s*(' + number + '[%])\\s*,\\s*(' + number + '[%])(?:\\s*,\\s*(' + number + '))?\\)'; + var hslaNoBackRefs = 'hsl[a]?\\((?:' + number + ')\\s*,\\s*(?:' + number + '[%])\\s*,\\s*(?:' + number + '[%])(?:\\s*,\\s*(?:' + number + '))?\\)'; + var hex3 = '\\#[0-9a-fA-F]{3}'; + var hex6 = '\\#[0-9a-fA-F]{6}'; + + var ascending = function ascending(a, b) { + if (a < b) { + return -1; + } else if (a > b) { + return 1; + } else { + return 0; + } + }; + var descending = function descending(a, b) { + return -1 * ascending(a, b); + }; + + var extend = Object.assign != null ? Object.assign.bind(Object) : function (tgt) { + var args = arguments; + + for (var i = 1; i < args.length; i++) { + var obj = args[i]; + + if (obj == null) { + continue; + } + + var keys = Object.keys(obj); + + for (var j = 0; j < keys.length; j++) { + var k = keys[j]; + tgt[k] = obj[k]; + } + } + + return tgt; + }; + + var hex2tuple = function hex2tuple(hex) { + if (!(hex.length === 4 || hex.length === 7) || hex[0] !== '#') { + return; + } + + var shortHex = hex.length === 4; + var r, g, b; + var base = 16; + + if (shortHex) { + r = parseInt(hex[1] + hex[1], base); + g = parseInt(hex[2] + hex[2], base); + b = parseInt(hex[3] + hex[3], base); + } else { + r = parseInt(hex[1] + hex[2], base); + g = parseInt(hex[3] + hex[4], base); + b = parseInt(hex[5] + hex[6], base); + } + + return [r, g, b]; + }; // get [r, g, b, a] from hsl(0, 0, 0) or hsla(0, 0, 0, 0) + + var hsl2tuple = function hsl2tuple(hsl) { + var ret; + var h, s, l, a, r, g, b; + + function hue2rgb(p, q, t) { + if (t < 0) t += 1; + if (t > 1) t -= 1; + if (t < 1 / 6) return p + (q - p) * 6 * t; + if (t < 1 / 2) return q; + if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; + return p; + } + + var m = new RegExp('^' + hsla + '$').exec(hsl); + + if (m) { + // get hue + h = parseInt(m[1]); + + if (h < 0) { + h = (360 - -1 * h % 360) % 360; + } else if (h > 360) { + h = h % 360; + } + + h /= 360; // normalise on [0, 1] + + s = parseFloat(m[2]); + + if (s < 0 || s > 100) { + return; + } // saturation is [0, 100] + + + s = s / 100; // normalise on [0, 1] + + l = parseFloat(m[3]); + + if (l < 0 || l > 100) { + return; + } // lightness is [0, 100] + + + l = l / 100; // normalise on [0, 1] + + a = m[4]; + + if (a !== undefined) { + a = parseFloat(a); + + if (a < 0 || a > 1) { + return; + } // alpha is [0, 1] + + } // now, convert to rgb + // code from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript + + + if (s === 0) { + r = g = b = Math.round(l * 255); // achromatic + } else { + var q = l < 0.5 ? l * (1 + s) : l + s - l * s; + var p = 2 * l - q; + r = Math.round(255 * hue2rgb(p, q, h + 1 / 3)); + g = Math.round(255 * hue2rgb(p, q, h)); + b = Math.round(255 * hue2rgb(p, q, h - 1 / 3)); + } + + ret = [r, g, b, a]; + } + + return ret; + }; // get [r, g, b, a] from rgb(0, 0, 0) or rgba(0, 0, 0, 0) + + var rgb2tuple = function rgb2tuple(rgb) { + var ret; + var m = new RegExp('^' + rgba + '$').exec(rgb); + + if (m) { + ret = []; + var isPct = []; + + for (var i = 1; i <= 3; i++) { + var channel = m[i]; + + if (channel[channel.length - 1] === '%') { + isPct[i] = true; + } + + channel = parseFloat(channel); + + if (isPct[i]) { + channel = channel / 100 * 255; // normalise to [0, 255] + } + + if (channel < 0 || channel > 255) { + return; + } // invalid channel value + + + ret.push(Math.floor(channel)); + } + + var atLeastOneIsPct = isPct[1] || isPct[2] || isPct[3]; + var allArePct = isPct[1] && isPct[2] && isPct[3]; + + if (atLeastOneIsPct && !allArePct) { + return; + } // must all be percent values if one is + + + var alpha = m[4]; + + if (alpha !== undefined) { + alpha = parseFloat(alpha); + + if (alpha < 0 || alpha > 1) { + return; + } // invalid alpha value + + + ret.push(alpha); + } + } + + return ret; + }; + var colorname2tuple = function colorname2tuple(color) { + return colors[color.toLowerCase()]; + }; + var color2tuple = function color2tuple(color) { + return (array(color) ? color : null) || colorname2tuple(color) || hex2tuple(color) || rgb2tuple(color) || hsl2tuple(color); + }; + var colors = { + // special colour names + transparent: [0, 0, 0, 0], + // NB alpha === 0 + // regular colours + aliceblue: [240, 248, 255], + antiquewhite: [250, 235, 215], + aqua: [0, 255, 255], + aquamarine: [127, 255, 212], + azure: [240, 255, 255], + beige: [245, 245, 220], + bisque: [255, 228, 196], + black: [0, 0, 0], + blanchedalmond: [255, 235, 205], + blue: [0, 0, 255], + blueviolet: [138, 43, 226], + brown: [165, 42, 42], + burlywood: [222, 184, 135], + cadetblue: [95, 158, 160], + chartreuse: [127, 255, 0], + chocolate: [210, 105, 30], + coral: [255, 127, 80], + cornflowerblue: [100, 149, 237], + cornsilk: [255, 248, 220], + crimson: [220, 20, 60], + cyan: [0, 255, 255], + darkblue: [0, 0, 139], + darkcyan: [0, 139, 139], + darkgoldenrod: [184, 134, 11], + darkgray: [169, 169, 169], + darkgreen: [0, 100, 0], + darkgrey: [169, 169, 169], + darkkhaki: [189, 183, 107], + darkmagenta: [139, 0, 139], + darkolivegreen: [85, 107, 47], + darkorange: [255, 140, 0], + darkorchid: [153, 50, 204], + darkred: [139, 0, 0], + darksalmon: [233, 150, 122], + darkseagreen: [143, 188, 143], + darkslateblue: [72, 61, 139], + darkslategray: [47, 79, 79], + darkslategrey: [47, 79, 79], + darkturquoise: [0, 206, 209], + darkviolet: [148, 0, 211], + deeppink: [255, 20, 147], + deepskyblue: [0, 191, 255], + dimgray: [105, 105, 105], + dimgrey: [105, 105, 105], + dodgerblue: [30, 144, 255], + firebrick: [178, 34, 34], + floralwhite: [255, 250, 240], + forestgreen: [34, 139, 34], + fuchsia: [255, 0, 255], + gainsboro: [220, 220, 220], + ghostwhite: [248, 248, 255], + gold: [255, 215, 0], + goldenrod: [218, 165, 32], + gray: [128, 128, 128], + grey: [128, 128, 128], + green: [0, 128, 0], + greenyellow: [173, 255, 47], + honeydew: [240, 255, 240], + hotpink: [255, 105, 180], + indianred: [205, 92, 92], + indigo: [75, 0, 130], + ivory: [255, 255, 240], + khaki: [240, 230, 140], + lavender: [230, 230, 250], + lavenderblush: [255, 240, 245], + lawngreen: [124, 252, 0], + lemonchiffon: [255, 250, 205], + lightblue: [173, 216, 230], + lightcoral: [240, 128, 128], + lightcyan: [224, 255, 255], + lightgoldenrodyellow: [250, 250, 210], + lightgray: [211, 211, 211], + lightgreen: [144, 238, 144], + lightgrey: [211, 211, 211], + lightpink: [255, 182, 193], + lightsalmon: [255, 160, 122], + lightseagreen: [32, 178, 170], + lightskyblue: [135, 206, 250], + lightslategray: [119, 136, 153], + lightslategrey: [119, 136, 153], + lightsteelblue: [176, 196, 222], + lightyellow: [255, 255, 224], + lime: [0, 255, 0], + limegreen: [50, 205, 50], + linen: [250, 240, 230], + magenta: [255, 0, 255], + maroon: [128, 0, 0], + mediumaquamarine: [102, 205, 170], + mediumblue: [0, 0, 205], + mediumorchid: [186, 85, 211], + mediumpurple: [147, 112, 219], + mediumseagreen: [60, 179, 113], + mediumslateblue: [123, 104, 238], + mediumspringgreen: [0, 250, 154], + mediumturquoise: [72, 209, 204], + mediumvioletred: [199, 21, 133], + midnightblue: [25, 25, 112], + mintcream: [245, 255, 250], + mistyrose: [255, 228, 225], + moccasin: [255, 228, 181], + navajowhite: [255, 222, 173], + navy: [0, 0, 128], + oldlace: [253, 245, 230], + olive: [128, 128, 0], + olivedrab: [107, 142, 35], + orange: [255, 165, 0], + orangered: [255, 69, 0], + orchid: [218, 112, 214], + palegoldenrod: [238, 232, 170], + palegreen: [152, 251, 152], + paleturquoise: [175, 238, 238], + palevioletred: [219, 112, 147], + papayawhip: [255, 239, 213], + peachpuff: [255, 218, 185], + peru: [205, 133, 63], + pink: [255, 192, 203], + plum: [221, 160, 221], + powderblue: [176, 224, 230], + purple: [128, 0, 128], + red: [255, 0, 0], + rosybrown: [188, 143, 143], + royalblue: [65, 105, 225], + saddlebrown: [139, 69, 19], + salmon: [250, 128, 114], + sandybrown: [244, 164, 96], + seagreen: [46, 139, 87], + seashell: [255, 245, 238], + sienna: [160, 82, 45], + silver: [192, 192, 192], + skyblue: [135, 206, 235], + slateblue: [106, 90, 205], + slategray: [112, 128, 144], + slategrey: [112, 128, 144], + snow: [255, 250, 250], + springgreen: [0, 255, 127], + steelblue: [70, 130, 180], + tan: [210, 180, 140], + teal: [0, 128, 128], + thistle: [216, 191, 216], + tomato: [255, 99, 71], + turquoise: [64, 224, 208], + violet: [238, 130, 238], + wheat: [245, 222, 179], + white: [255, 255, 255], + whitesmoke: [245, 245, 245], + yellow: [255, 255, 0], + yellowgreen: [154, 205, 50] + }; + + var setMap = function setMap(options) { + var obj = options.map; + var keys = options.keys; + var l = keys.length; + + for (var i = 0; i < l; i++) { + var key = keys[i]; + + if (plainObject(key)) { + throw Error('Tried to set map with object key'); + } + + if (i < keys.length - 1) { + // extend the map if necessary + if (obj[key] == null) { + obj[key] = {}; + } + + obj = obj[key]; + } else { + // set the value + obj[key] = options.value; + } + } + }; // gets the value in a map even if it's not built in places + + var getMap = function getMap(options) { + var obj = options.map; + var keys = options.keys; + var l = keys.length; + + for (var i = 0; i < l; i++) { + var key = keys[i]; + + if (plainObject(key)) { + throw Error('Tried to get map with object key'); + } + + obj = obj[key]; + + if (obj == null) { + return obj; + } + } + + return obj; + }; // deletes the entry in the map + + /** + * Checks if `value` is the + * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) + * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(_.noop); + * // => true + * + * _.isObject(null); + * // => false + */ + function isObject(value) { + var type = typeof value; + return value != null && (type == 'object' || type == 'function'); + } + + var isObject_1 = isObject; + + var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; + + function createCommonjsModule(fn, module) { + return module = { exports: {} }, fn(module, module.exports), module.exports; + } + + /** Detect free variable `global` from Node.js. */ + var freeGlobal = typeof commonjsGlobal == 'object' && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal; + + var _freeGlobal = freeGlobal; + + /** Detect free variable `self`. */ + var freeSelf = typeof self == 'object' && self && self.Object === Object && self; + + /** Used as a reference to the global object. */ + var root = _freeGlobal || freeSelf || Function('return this')(); + + var _root = root; + + /** + * Gets the timestamp of the number of milliseconds that have elapsed since + * the Unix epoch (1 January 1970 00:00:00 UTC). + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Date + * @returns {number} Returns the timestamp. + * @example + * + * _.defer(function(stamp) { + * console.log(_.now() - stamp); + * }, _.now()); + * // => Logs the number of milliseconds it took for the deferred invocation. + */ + var now = function() { + return _root.Date.now(); + }; + + var now_1 = now; + + /** Used to match a single whitespace character. */ + var reWhitespace = /\s/; + + /** + * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace + * character of `string`. + * + * @private + * @param {string} string The string to inspect. + * @returns {number} Returns the index of the last non-whitespace character. + */ + function trimmedEndIndex(string) { + var index = string.length; + + while (index-- && reWhitespace.test(string.charAt(index))) {} + return index; + } + + var _trimmedEndIndex = trimmedEndIndex; + + /** Used to match leading whitespace. */ + var reTrimStart = /^\s+/; + + /** + * The base implementation of `_.trim`. + * + * @private + * @param {string} string The string to trim. + * @returns {string} Returns the trimmed string. + */ + function baseTrim(string) { + return string + ? string.slice(0, _trimmedEndIndex(string) + 1).replace(reTrimStart, '') + : string; + } + + var _baseTrim = baseTrim; + + /** Built-in value references. */ + var Symbol$1 = _root.Symbol; + + var _Symbol = Symbol$1; + + /** Used for built-in method references. */ + var objectProto$5 = Object.prototype; + + /** Used to check objects for own properties. */ + var hasOwnProperty$4 = objectProto$5.hasOwnProperty; + + /** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ + var nativeObjectToString$1 = objectProto$5.toString; + + /** Built-in value references. */ + var symToStringTag$1 = _Symbol ? _Symbol.toStringTag : undefined; + + /** + * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the raw `toStringTag`. + */ + function getRawTag(value) { + var isOwn = hasOwnProperty$4.call(value, symToStringTag$1), + tag = value[symToStringTag$1]; + + try { + value[symToStringTag$1] = undefined; + var unmasked = true; + } catch (e) {} + + var result = nativeObjectToString$1.call(value); + if (unmasked) { + if (isOwn) { + value[symToStringTag$1] = tag; + } else { + delete value[symToStringTag$1]; + } + } + return result; + } + + var _getRawTag = getRawTag; + + /** Used for built-in method references. */ + var objectProto$4 = Object.prototype; + + /** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ + var nativeObjectToString = objectProto$4.toString; + + /** + * Converts `value` to a string using `Object.prototype.toString`. + * + * @private + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + */ + function objectToString(value) { + return nativeObjectToString.call(value); + } + + var _objectToString = objectToString; + + /** `Object#toString` result references. */ + var nullTag = '[object Null]', + undefinedTag = '[object Undefined]'; + + /** Built-in value references. */ + var symToStringTag = _Symbol ? _Symbol.toStringTag : undefined; + + /** + * The base implementation of `getTag` without fallbacks for buggy environments. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ + function baseGetTag(value) { + if (value == null) { + return value === undefined ? undefinedTag : nullTag; + } + return (symToStringTag && symToStringTag in Object(value)) + ? _getRawTag(value) + : _objectToString(value); + } + + var _baseGetTag = baseGetTag; + + /** + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false + */ + function isObjectLike(value) { + return value != null && typeof value == 'object'; + } + + var isObjectLike_1 = isObjectLike; + + /** `Object#toString` result references. */ + var symbolTag = '[object Symbol]'; + + /** + * Checks if `value` is classified as a `Symbol` primitive or object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. + * @example + * + * _.isSymbol(Symbol.iterator); + * // => true + * + * _.isSymbol('abc'); + * // => false + */ + function isSymbol(value) { + return typeof value == 'symbol' || + (isObjectLike_1(value) && _baseGetTag(value) == symbolTag); + } + + var isSymbol_1 = isSymbol; + + /** Used as references for various `Number` constants. */ + var NAN = 0 / 0; + + /** Used to detect bad signed hexadecimal string values. */ + var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; + + /** Used to detect binary string values. */ + var reIsBinary = /^0b[01]+$/i; + + /** Used to detect octal string values. */ + var reIsOctal = /^0o[0-7]+$/i; + + /** Built-in method references without a dependency on `root`. */ + var freeParseInt = parseInt; + + /** + * Converts `value` to a number. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to process. + * @returns {number} Returns the number. + * @example + * + * _.toNumber(3.2); + * // => 3.2 + * + * _.toNumber(Number.MIN_VALUE); + * // => 5e-324 + * + * _.toNumber(Infinity); + * // => Infinity + * + * _.toNumber('3.2'); + * // => 3.2 + */ + function toNumber(value) { + if (typeof value == 'number') { + return value; + } + if (isSymbol_1(value)) { + return NAN; + } + if (isObject_1(value)) { + var other = typeof value.valueOf == 'function' ? value.valueOf() : value; + value = isObject_1(other) ? (other + '') : other; + } + if (typeof value != 'string') { + return value === 0 ? value : +value; + } + value = _baseTrim(value); + var isBinary = reIsBinary.test(value); + return (isBinary || reIsOctal.test(value)) + ? freeParseInt(value.slice(2), isBinary ? 2 : 8) + : (reIsBadHex.test(value) ? NAN : +value); + } + + var toNumber_1 = toNumber; + + /** Error message constants. */ + var FUNC_ERROR_TEXT$1 = 'Expected a function'; + + /* Built-in method references for those with the same name as other `lodash` methods. */ + var nativeMax = Math.max, + nativeMin = Math.min; + + /** + * Creates a debounced function that delays invoking `func` until after `wait` + * milliseconds have elapsed since the last time the debounced function was + * invoked. The debounced function comes with a `cancel` method to cancel + * delayed `func` invocations and a `flush` method to immediately invoke them. + * Provide `options` to indicate whether `func` should be invoked on the + * leading and/or trailing edge of the `wait` timeout. The `func` is invoked + * with the last arguments provided to the debounced function. Subsequent + * calls to the debounced function return the result of the last `func` + * invocation. + * + * **Note:** If `leading` and `trailing` options are `true`, `func` is + * invoked on the trailing edge of the timeout only if the debounced function + * is invoked more than once during the `wait` timeout. + * + * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred + * until to the next tick, similar to `setTimeout` with a timeout of `0`. + * + * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) + * for details over the differences between `_.debounce` and `_.throttle`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to debounce. + * @param {number} [wait=0] The number of milliseconds to delay. + * @param {Object} [options={}] The options object. + * @param {boolean} [options.leading=false] + * Specify invoking on the leading edge of the timeout. + * @param {number} [options.maxWait] + * The maximum time `func` is allowed to be delayed before it's invoked. + * @param {boolean} [options.trailing=true] + * Specify invoking on the trailing edge of the timeout. + * @returns {Function} Returns the new debounced function. + * @example + * + * // Avoid costly calculations while the window size is in flux. + * jQuery(window).on('resize', _.debounce(calculateLayout, 150)); + * + * // Invoke `sendMail` when clicked, debouncing subsequent calls. + * jQuery(element).on('click', _.debounce(sendMail, 300, { + * 'leading': true, + * 'trailing': false + * })); + * + * // Ensure `batchLog` is invoked once after 1 second of debounced calls. + * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 }); + * var source = new EventSource('/stream'); + * jQuery(source).on('message', debounced); + * + * // Cancel the trailing debounced invocation. + * jQuery(window).on('popstate', debounced.cancel); + */ + function debounce(func, wait, options) { + var lastArgs, + lastThis, + maxWait, + result, + timerId, + lastCallTime, + lastInvokeTime = 0, + leading = false, + maxing = false, + trailing = true; + + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT$1); + } + wait = toNumber_1(wait) || 0; + if (isObject_1(options)) { + leading = !!options.leading; + maxing = 'maxWait' in options; + maxWait = maxing ? nativeMax(toNumber_1(options.maxWait) || 0, wait) : maxWait; + trailing = 'trailing' in options ? !!options.trailing : trailing; + } + + function invokeFunc(time) { + var args = lastArgs, + thisArg = lastThis; + + lastArgs = lastThis = undefined; + lastInvokeTime = time; + result = func.apply(thisArg, args); + return result; + } + + function leadingEdge(time) { + // Reset any `maxWait` timer. + lastInvokeTime = time; + // Start the timer for the trailing edge. + timerId = setTimeout(timerExpired, wait); + // Invoke the leading edge. + return leading ? invokeFunc(time) : result; + } + + function remainingWait(time) { + var timeSinceLastCall = time - lastCallTime, + timeSinceLastInvoke = time - lastInvokeTime, + timeWaiting = wait - timeSinceLastCall; + + return maxing + ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) + : timeWaiting; + } + + function shouldInvoke(time) { + var timeSinceLastCall = time - lastCallTime, + timeSinceLastInvoke = time - lastInvokeTime; + + // Either this is the first call, activity has stopped and we're at the + // trailing edge, the system time has gone backwards and we're treating + // it as the trailing edge, or we've hit the `maxWait` limit. + return (lastCallTime === undefined || (timeSinceLastCall >= wait) || + (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait)); + } + + function timerExpired() { + var time = now_1(); + if (shouldInvoke(time)) { + return trailingEdge(time); + } + // Restart the timer. + timerId = setTimeout(timerExpired, remainingWait(time)); + } + + function trailingEdge(time) { + timerId = undefined; + + // Only invoke if we have `lastArgs` which means `func` has been + // debounced at least once. + if (trailing && lastArgs) { + return invokeFunc(time); + } + lastArgs = lastThis = undefined; + return result; + } + + function cancel() { + if (timerId !== undefined) { + clearTimeout(timerId); + } + lastInvokeTime = 0; + lastArgs = lastCallTime = lastThis = timerId = undefined; + } + + function flush() { + return timerId === undefined ? result : trailingEdge(now_1()); + } + + function debounced() { + var time = now_1(), + isInvoking = shouldInvoke(time); + + lastArgs = arguments; + lastThis = this; + lastCallTime = time; + + if (isInvoking) { + if (timerId === undefined) { + return leadingEdge(lastCallTime); + } + if (maxing) { + // Handle invocations in a tight loop. + clearTimeout(timerId); + timerId = setTimeout(timerExpired, wait); + return invokeFunc(lastCallTime); + } + } + if (timerId === undefined) { + timerId = setTimeout(timerExpired, wait); + } + return result; + } + debounced.cancel = cancel; + debounced.flush = flush; + return debounced; + } + + var debounce_1 = debounce; + + var performance = _window ? _window.performance : null; + var pnow = performance && performance.now ? function () { + return performance.now(); + } : function () { + return Date.now(); + }; + + var raf = function () { + if (_window) { + if (_window.requestAnimationFrame) { + return function (fn) { + _window.requestAnimationFrame(fn); + }; + } else if (_window.mozRequestAnimationFrame) { + return function (fn) { + _window.mozRequestAnimationFrame(fn); + }; + } else if (_window.webkitRequestAnimationFrame) { + return function (fn) { + _window.webkitRequestAnimationFrame(fn); + }; + } else if (_window.msRequestAnimationFrame) { + return function (fn) { + _window.msRequestAnimationFrame(fn); + }; + } + } + + return function (fn) { + if (fn) { + setTimeout(function () { + fn(pnow()); + }, 1000 / 60); + } + }; + }(); + + var requestAnimationFrame = function requestAnimationFrame(fn) { + return raf(fn); + }; + var performanceNow = pnow; + + var DEFAULT_HASH_SEED = 9261; + var K = 65599; // 37 also works pretty well + + var DEFAULT_HASH_SEED_ALT = 5381; + var hashIterableInts = function hashIterableInts(iterator) { + var seed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_HASH_SEED; + // sdbm/string-hash + var hash = seed; + var entry; + + for (;;) { + entry = iterator.next(); + + if (entry.done) { + break; + } + + hash = hash * K + entry.value | 0; + } + + return hash; + }; + var hashInt = function hashInt(num) { + var seed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_HASH_SEED; + // sdbm/string-hash + return seed * K + num | 0; + }; + var hashIntAlt = function hashIntAlt(num) { + var seed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_HASH_SEED_ALT; + // djb2/string-hash + return (seed << 5) + seed + num | 0; + }; + var combineHashes = function combineHashes(hash1, hash2) { + return hash1 * 0x200000 + hash2; + }; + var combineHashesArray = function combineHashesArray(hashes) { + return hashes[0] * 0x200000 + hashes[1]; + }; + var hashArrays = function hashArrays(hashes1, hashes2) { + return [hashInt(hashes1[0], hashes2[0]), hashIntAlt(hashes1[1], hashes2[1])]; + }; + var hashIntsArray = function hashIntsArray(ints, seed) { + var entry = { + value: 0, + done: false + }; + var i = 0; + var length = ints.length; + var iterator = { + next: function next() { + if (i < length) { + entry.value = ints[i++]; + } else { + entry.done = true; + } + + return entry; + } + }; + return hashIterableInts(iterator, seed); + }; + var hashString = function hashString(str, seed) { + var entry = { + value: 0, + done: false + }; + var i = 0; + var length = str.length; + var iterator = { + next: function next() { + if (i < length) { + entry.value = str.charCodeAt(i++); + } else { + entry.done = true; + } + + return entry; + } + }; + return hashIterableInts(iterator, seed); + }; + var hashStrings = function hashStrings() { + return hashStringsArray(arguments); + }; + var hashStringsArray = function hashStringsArray(strs) { + var hash; + + for (var i = 0; i < strs.length; i++) { + var str = strs[i]; + + if (i === 0) { + hash = hashString(str); + } else { + hash = hashString(str, hash); + } + } + + return hash; + }; + + /*global console */ + var warningsEnabled = true; + var warnSupported = console.warn != null; // eslint-disable-line no-console + + var traceSupported = console.trace != null; // eslint-disable-line no-console + + var MAX_INT$1 = Number.MAX_SAFE_INTEGER || 9007199254740991; + var trueify = function trueify() { + return true; + }; + var falsify = function falsify() { + return false; + }; + var zeroify = function zeroify() { + return 0; + }; + var noop$1 = function noop() {}; + var error = function error(msg) { + throw new Error(msg); + }; + var warnings = function warnings(enabled) { + if (enabled !== undefined) { + warningsEnabled = !!enabled; + } else { + return warningsEnabled; + } + }; + var warn = function warn(msg) { + /* eslint-disable no-console */ + if (!warnings()) { + return; + } + + if (warnSupported) { + console.warn(msg); + } else { + console.log(msg); + + if (traceSupported) { + console.trace(); + } + } + }; + /* eslint-enable */ + + var clone = function clone(obj) { + return extend({}, obj); + }; // gets a shallow copy of the argument + + var copy = function copy(obj) { + if (obj == null) { + return obj; + } + + if (array(obj)) { + return obj.slice(); + } else if (plainObject(obj)) { + return clone(obj); + } else { + return obj; + } + }; + var copyArray$1 = function copyArray(arr) { + return arr.slice(); + }; + var uuid = function uuid(a, b + /* placeholders */ + ) { + for ( // loop :) + b = a = ''; // b - result , a - numeric letiable + a++ < 36; // + b += a * 51 & 52 // if "a" is not 9 or 14 or 19 or 24 + ? // return a random number or 4 + (a ^ 15 // if "a" is not 15 + ? // generate a random number from 0 to 15 + 8 ^ Math.random() * (a ^ 20 ? 16 : 4) // unless "a" is 20, in which case a random number from 8 to 11 + : 4 // otherwise 4 + ).toString(16) : '-' // in other cases (if "a" is 9,14,19,24) insert "-" + ) { + } + + return b; + }; + var _staticEmptyObject = {}; + var staticEmptyObject = function staticEmptyObject() { + return _staticEmptyObject; + }; + var defaults$g = function defaults(_defaults) { + var keys = Object.keys(_defaults); + return function (opts) { + var filledOpts = {}; + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var optVal = opts == null ? undefined : opts[key]; + filledOpts[key] = optVal === undefined ? _defaults[key] : optVal; + } + + return filledOpts; + }; + }; + var removeFromArray = function removeFromArray(arr, ele, oneCopy) { + for (var i = arr.length - 1; i >= 0; i--) { + if (arr[i] === ele) { + arr.splice(i, 1); + + if (oneCopy) { + break; + } + } + } + }; + var clearArray = function clearArray(arr) { + arr.splice(0, arr.length); + }; + var push = function push(arr, otherArr) { + for (var i = 0; i < otherArr.length; i++) { + var el = otherArr[i]; + arr.push(el); + } + }; + var getPrefixedProperty = function getPrefixedProperty(obj, propName, prefix) { + if (prefix) { + propName = prependCamel(prefix, propName); // e.g. (labelWidth, source) => sourceLabelWidth + } + + return obj[propName]; + }; + var setPrefixedProperty = function setPrefixedProperty(obj, propName, prefix, value) { + if (prefix) { + propName = prependCamel(prefix, propName); // e.g. (labelWidth, source) => sourceLabelWidth + } + + obj[propName] = value; + }; + + /* global Map */ + var ObjectMap = /*#__PURE__*/function () { + function ObjectMap() { + _classCallCheck(this, ObjectMap); + + this._obj = {}; + } + + _createClass(ObjectMap, [{ + key: "set", + value: function set(key, val) { + this._obj[key] = val; + return this; + } + }, { + key: "delete", + value: function _delete(key) { + this._obj[key] = undefined; + return this; + } + }, { + key: "clear", + value: function clear() { + this._obj = {}; + } + }, { + key: "has", + value: function has(key) { + return this._obj[key] !== undefined; + } + }, { + key: "get", + value: function get(key) { + return this._obj[key]; + } + }]); + + return ObjectMap; + }(); + + var Map$2 = typeof Map !== 'undefined' ? Map : ObjectMap; + + /* global Set */ + var undef = "undefined" ; + + var ObjectSet = /*#__PURE__*/function () { + function ObjectSet(arrayOrObjectSet) { + _classCallCheck(this, ObjectSet); + + this._obj = Object.create(null); + this.size = 0; + + if (arrayOrObjectSet != null) { + var arr; + + if (arrayOrObjectSet.instanceString != null && arrayOrObjectSet.instanceString() === this.instanceString()) { + arr = arrayOrObjectSet.toArray(); + } else { + arr = arrayOrObjectSet; + } + + for (var i = 0; i < arr.length; i++) { + this.add(arr[i]); + } + } + } + + _createClass(ObjectSet, [{ + key: "instanceString", + value: function instanceString() { + return 'set'; + } + }, { + key: "add", + value: function add(val) { + var o = this._obj; + + if (o[val] !== 1) { + o[val] = 1; + this.size++; + } + } + }, { + key: "delete", + value: function _delete(val) { + var o = this._obj; + + if (o[val] === 1) { + o[val] = 0; + this.size--; + } + } + }, { + key: "clear", + value: function clear() { + this._obj = Object.create(null); + } + }, { + key: "has", + value: function has(val) { + return this._obj[val] === 1; + } + }, { + key: "toArray", + value: function toArray() { + var _this = this; + + return Object.keys(this._obj).filter(function (key) { + return _this.has(key); + }); + } + }, { + key: "forEach", + value: function forEach(callback, thisArg) { + return this.toArray().forEach(callback, thisArg); + } + }]); + + return ObjectSet; + }(); + + var Set$1 = (typeof Set === "undefined" ? "undefined" : _typeof(Set)) !== undef ? Set : ObjectSet; + + var Element = function Element(cy, params) { + var restore = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; + + if (cy === undefined || params === undefined || !core(cy)) { + error('An element must have a core reference and parameters set'); + return; + } + + var group = params.group; // try to automatically infer the group if unspecified + + if (group == null) { + if (params.data && params.data.source != null && params.data.target != null) { + group = 'edges'; + } else { + group = 'nodes'; + } + } // validate group + + + if (group !== 'nodes' && group !== 'edges') { + error('An element must be of type `nodes` or `edges`; you specified `' + group + '`'); + return; + } // make the element array-like, just like a collection + + + this.length = 1; + this[0] = this; // NOTE: when something is added here, add also to ele.json() + + var _p = this._private = { + cy: cy, + single: true, + // indicates this is an element + data: params.data || {}, + // data object + position: params.position || { + x: 0, + y: 0 + }, + // (x, y) position pair + autoWidth: undefined, + // width and height of nodes calculated by the renderer when set to special 'auto' value + autoHeight: undefined, + autoPadding: undefined, + compoundBoundsClean: false, + // whether the compound dimensions need to be recalculated the next time dimensions are read + listeners: [], + // array of bound listeners + group: group, + // string; 'nodes' or 'edges' + style: {}, + // properties as set by the style + rstyle: {}, + // properties for style sent from the renderer to the core + styleCxts: [], + // applied style contexts from the styler + styleKeys: {}, + // per-group keys of style property values + removed: true, + // whether it's inside the vis; true if removed (set true here since we call restore) + selected: params.selected ? true : false, + // whether it's selected + selectable: params.selectable === undefined ? true : params.selectable ? true : false, + // whether it's selectable + locked: params.locked ? true : false, + // whether the element is locked (cannot be moved) + grabbed: false, + // whether the element is grabbed by the mouse; renderer sets this privately + grabbable: params.grabbable === undefined ? true : params.grabbable ? true : false, + // whether the element can be grabbed + pannable: params.pannable === undefined ? group === 'edges' ? true : false : params.pannable ? true : false, + // whether the element has passthrough panning enabled + active: false, + // whether the element is active from user interaction + classes: new Set$1(), + // map ( className => true ) + animation: { + // object for currently-running animations + current: [], + queue: [] + }, + rscratch: {}, + // object in which the renderer can store information + scratch: params.scratch || {}, + // scratch objects + edges: [], + // array of connected edges + children: [], + // array of children + parent: params.parent && params.parent.isNode() ? params.parent : null, + // parent ref + traversalCache: {}, + // cache of output of traversal functions + backgrounding: false, + // whether background images are loading + bbCache: null, + // cache of the current bounding box + bbCacheShift: { + x: 0, + y: 0 + }, + // shift applied to cached bb to be applied on next get + bodyBounds: null, + // bounds cache of element body, w/o overlay + overlayBounds: null, + // bounds cache of element body, including overlay + labelBounds: { + // bounds cache of labels + all: null, + source: null, + target: null, + main: null + }, + arrowBounds: { + // bounds cache of edge arrows + source: null, + target: null, + 'mid-source': null, + 'mid-target': null + } + }; + + if (_p.position.x == null) { + _p.position.x = 0; + } + + if (_p.position.y == null) { + _p.position.y = 0; + } // renderedPosition overrides if specified + + + if (params.renderedPosition) { + var rpos = params.renderedPosition; + var pan = cy.pan(); + var zoom = cy.zoom(); + _p.position = { + x: (rpos.x - pan.x) / zoom, + y: (rpos.y - pan.y) / zoom + }; + } + + var classes = []; + + if (array(params.classes)) { + classes = params.classes; + } else if (string(params.classes)) { + classes = params.classes.split(/\s+/); + } + + for (var i = 0, l = classes.length; i < l; i++) { + var cls = classes[i]; + + if (!cls || cls === '') { + continue; + } + + _p.classes.add(cls); + } + + this.createEmitter(); + var bypass = params.style || params.css; + + if (bypass) { + warn('Setting a `style` bypass at element creation should be done only when absolutely necessary. Try to use the stylesheet instead.'); + this.style(bypass); + } + + if (restore === undefined || restore) { + this.restore(); + } + }; + + var defineSearch = function defineSearch(params) { + params = { + bfs: params.bfs || !params.dfs, + dfs: params.dfs || !params.bfs + }; // from pseudocode on wikipedia + + return function searchFn(roots, fn, directed) { + var options; + + if (plainObject(roots) && !elementOrCollection(roots)) { + options = roots; + roots = options.roots || options.root; + fn = options.visit; + directed = options.directed; + } + + directed = arguments.length === 2 && !fn$6(fn) ? fn : directed; + fn = fn$6(fn) ? fn : function () {}; + var cy = this._private.cy; + var v = roots = string(roots) ? this.filter(roots) : roots; + var Q = []; + var connectedNodes = []; + var connectedBy = {}; + var id2depth = {}; + var V = {}; + var j = 0; + var found; + + var _this$byGroup = this.byGroup(), + nodes = _this$byGroup.nodes, + edges = _this$byGroup.edges; // enqueue v + + + for (var i = 0; i < v.length; i++) { + var vi = v[i]; + var viId = vi.id(); + + if (vi.isNode()) { + Q.unshift(vi); + + if (params.bfs) { + V[viId] = true; + connectedNodes.push(vi); + } + + id2depth[viId] = 0; + } + } + + var _loop = function _loop() { + var v = params.bfs ? Q.shift() : Q.pop(); + var vId = v.id(); + + if (params.dfs) { + if (V[vId]) { + return "continue"; + } + + V[vId] = true; + connectedNodes.push(v); + } + + var depth = id2depth[vId]; + var prevEdge = connectedBy[vId]; + var src = prevEdge != null ? prevEdge.source() : null; + var tgt = prevEdge != null ? prevEdge.target() : null; + var prevNode = prevEdge == null ? undefined : v.same(src) ? tgt[0] : src[0]; + var ret = void 0; + ret = fn(v, prevEdge, prevNode, j++, depth); + + if (ret === true) { + found = v; + return "break"; + } + + if (ret === false) { + return "break"; + } + + var vwEdges = v.connectedEdges().filter(function (e) { + return (!directed || e.source().same(v)) && edges.has(e); + }); + + for (var _i2 = 0; _i2 < vwEdges.length; _i2++) { + var e = vwEdges[_i2]; + var w = e.connectedNodes().filter(function (n) { + return !n.same(v) && nodes.has(n); + }); + var wId = w.id(); + + if (w.length !== 0 && !V[wId]) { + w = w[0]; + Q.push(w); + + if (params.bfs) { + V[wId] = true; + connectedNodes.push(w); + } + + connectedBy[wId] = e; + id2depth[wId] = id2depth[vId] + 1; + } + } + }; + + while (Q.length !== 0) { + var _ret = _loop(); + + if (_ret === "continue") continue; + if (_ret === "break") break; + } + + var connectedEles = cy.collection(); + + for (var _i = 0; _i < connectedNodes.length; _i++) { + var node = connectedNodes[_i]; + var edge = connectedBy[node.id()]; + + if (edge != null) { + connectedEles.push(edge); + } + + connectedEles.push(node); + } + + return { + path: cy.collection(connectedEles), + found: cy.collection(found) + }; + }; + }; // search, spanning trees, etc + + + var elesfn$v = { + breadthFirstSearch: defineSearch({ + bfs: true + }), + depthFirstSearch: defineSearch({ + dfs: true + }) + }; // nice, short mathematical alias + + elesfn$v.bfs = elesfn$v.breadthFirstSearch; + elesfn$v.dfs = elesfn$v.depthFirstSearch; + + var heap$1 = createCommonjsModule(function (module, exports) { + // Generated by CoffeeScript 1.8.0 + (function() { + var Heap, defaultCmp, floor, heapify, heappop, heappush, heappushpop, heapreplace, insort, min, nlargest, nsmallest, updateItem, _siftdown, _siftup; + + floor = Math.floor, min = Math.min; + + + /* + Default comparison function to be used + */ + + defaultCmp = function(x, y) { + if (x < y) { + return -1; + } + if (x > y) { + return 1; + } + return 0; + }; + + + /* + Insert item x in list a, and keep it sorted assuming a is sorted. + + If x is already in a, insert it to the right of the rightmost x. + + Optional args lo (default 0) and hi (default a.length) bound the slice + of a to be searched. + */ + + insort = function(a, x, lo, hi, cmp) { + var mid; + if (lo == null) { + lo = 0; + } + if (cmp == null) { + cmp = defaultCmp; + } + if (lo < 0) { + throw new Error('lo must be non-negative'); + } + if (hi == null) { + hi = a.length; + } + while (lo < hi) { + mid = floor((lo + hi) / 2); + if (cmp(x, a[mid]) < 0) { + hi = mid; + } else { + lo = mid + 1; + } + } + return ([].splice.apply(a, [lo, lo - lo].concat(x)), x); + }; + + + /* + Push item onto heap, maintaining the heap invariant. + */ + + heappush = function(array, item, cmp) { + if (cmp == null) { + cmp = defaultCmp; + } + array.push(item); + return _siftdown(array, 0, array.length - 1, cmp); + }; + + + /* + Pop the smallest item off the heap, maintaining the heap invariant. + */ + + heappop = function(array, cmp) { + var lastelt, returnitem; + if (cmp == null) { + cmp = defaultCmp; + } + lastelt = array.pop(); + if (array.length) { + returnitem = array[0]; + array[0] = lastelt; + _siftup(array, 0, cmp); + } else { + returnitem = lastelt; + } + return returnitem; + }; + + + /* + Pop and return the current smallest value, and add the new item. + + This is more efficient than heappop() followed by heappush(), and can be + more appropriate when using a fixed size heap. Note that the value + returned may be larger than item! That constrains reasonable use of + this routine unless written as part of a conditional replacement: + if item > array[0] + item = heapreplace(array, item) + */ + + heapreplace = function(array, item, cmp) { + var returnitem; + if (cmp == null) { + cmp = defaultCmp; + } + returnitem = array[0]; + array[0] = item; + _siftup(array, 0, cmp); + return returnitem; + }; + + + /* + Fast version of a heappush followed by a heappop. + */ + + heappushpop = function(array, item, cmp) { + var _ref; + if (cmp == null) { + cmp = defaultCmp; + } + if (array.length && cmp(array[0], item) < 0) { + _ref = [array[0], item], item = _ref[0], array[0] = _ref[1]; + _siftup(array, 0, cmp); + } + return item; + }; + + + /* + Transform list into a heap, in-place, in O(array.length) time. + */ + + heapify = function(array, cmp) { + var i, _i, _len, _ref1, _results, _results1; + if (cmp == null) { + cmp = defaultCmp; + } + _ref1 = (function() { + _results1 = []; + for (var _j = 0, _ref = floor(array.length / 2); 0 <= _ref ? _j < _ref : _j > _ref; 0 <= _ref ? _j++ : _j--){ _results1.push(_j); } + return _results1; + }).apply(this).reverse(); + _results = []; + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + i = _ref1[_i]; + _results.push(_siftup(array, i, cmp)); + } + return _results; + }; + + + /* + Update the position of the given item in the heap. + This function should be called every time the item is being modified. + */ + + updateItem = function(array, item, cmp) { + var pos; + if (cmp == null) { + cmp = defaultCmp; + } + pos = array.indexOf(item); + if (pos === -1) { + return; + } + _siftdown(array, 0, pos, cmp); + return _siftup(array, pos, cmp); + }; + + + /* + Find the n largest elements in a dataset. + */ + + nlargest = function(array, n, cmp) { + var elem, result, _i, _len, _ref; + if (cmp == null) { + cmp = defaultCmp; + } + result = array.slice(0, n); + if (!result.length) { + return result; + } + heapify(result, cmp); + _ref = array.slice(n); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + elem = _ref[_i]; + heappushpop(result, elem, cmp); + } + return result.sort(cmp).reverse(); + }; + + + /* + Find the n smallest elements in a dataset. + */ + + nsmallest = function(array, n, cmp) { + var elem, los, result, _i, _j, _len, _ref, _ref1, _results; + if (cmp == null) { + cmp = defaultCmp; + } + if (n * 10 <= array.length) { + result = array.slice(0, n).sort(cmp); + if (!result.length) { + return result; + } + los = result[result.length - 1]; + _ref = array.slice(n); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + elem = _ref[_i]; + if (cmp(elem, los) < 0) { + insort(result, elem, 0, null, cmp); + result.pop(); + los = result[result.length - 1]; + } + } + return result; + } + heapify(array, cmp); + _results = []; + for (_j = 0, _ref1 = min(n, array.length); 0 <= _ref1 ? _j < _ref1 : _j > _ref1; 0 <= _ref1 ? ++_j : --_j) { + _results.push(heappop(array, cmp)); + } + return _results; + }; + + _siftdown = function(array, startpos, pos, cmp) { + var newitem, parent, parentpos; + if (cmp == null) { + cmp = defaultCmp; + } + newitem = array[pos]; + while (pos > startpos) { + parentpos = (pos - 1) >> 1; + parent = array[parentpos]; + if (cmp(newitem, parent) < 0) { + array[pos] = parent; + pos = parentpos; + continue; + } + break; + } + return array[pos] = newitem; + }; + + _siftup = function(array, pos, cmp) { + var childpos, endpos, newitem, rightpos, startpos; + if (cmp == null) { + cmp = defaultCmp; + } + endpos = array.length; + startpos = pos; + newitem = array[pos]; + childpos = 2 * pos + 1; + while (childpos < endpos) { + rightpos = childpos + 1; + if (rightpos < endpos && !(cmp(array[childpos], array[rightpos]) < 0)) { + childpos = rightpos; + } + array[pos] = array[childpos]; + pos = childpos; + childpos = 2 * pos + 1; + } + array[pos] = newitem; + return _siftdown(array, startpos, pos, cmp); + }; + + Heap = (function() { + Heap.push = heappush; + + Heap.pop = heappop; + + Heap.replace = heapreplace; + + Heap.pushpop = heappushpop; + + Heap.heapify = heapify; + + Heap.updateItem = updateItem; + + Heap.nlargest = nlargest; + + Heap.nsmallest = nsmallest; + + function Heap(cmp) { + this.cmp = cmp != null ? cmp : defaultCmp; + this.nodes = []; + } + + Heap.prototype.push = function(x) { + return heappush(this.nodes, x, this.cmp); + }; + + Heap.prototype.pop = function() { + return heappop(this.nodes, this.cmp); + }; + + Heap.prototype.peek = function() { + return this.nodes[0]; + }; + + Heap.prototype.contains = function(x) { + return this.nodes.indexOf(x) !== -1; + }; + + Heap.prototype.replace = function(x) { + return heapreplace(this.nodes, x, this.cmp); + }; + + Heap.prototype.pushpop = function(x) { + return heappushpop(this.nodes, x, this.cmp); + }; + + Heap.prototype.heapify = function() { + return heapify(this.nodes, this.cmp); + }; + + Heap.prototype.updateItem = function(x) { + return updateItem(this.nodes, x, this.cmp); + }; + + Heap.prototype.clear = function() { + return this.nodes = []; + }; + + Heap.prototype.empty = function() { + return this.nodes.length === 0; + }; + + Heap.prototype.size = function() { + return this.nodes.length; + }; + + Heap.prototype.clone = function() { + var heap; + heap = new Heap(); + heap.nodes = this.nodes.slice(0); + return heap; + }; + + Heap.prototype.toArray = function() { + return this.nodes.slice(0); + }; + + Heap.prototype.insert = Heap.prototype.push; + + Heap.prototype.top = Heap.prototype.peek; + + Heap.prototype.front = Heap.prototype.peek; + + Heap.prototype.has = Heap.prototype.contains; + + Heap.prototype.copy = Heap.prototype.clone; + + return Heap; + + })(); + + (function(root, factory) { + { + return module.exports = factory(); + } + })(this, function() { + return Heap; + }); + + }).call(commonjsGlobal); + }); + + var heap = heap$1; + + var dijkstraDefaults = defaults$g({ + root: null, + weight: function weight(edge) { + return 1; + }, + directed: false + }); + var elesfn$u = { + dijkstra: function dijkstra(options) { + if (!plainObject(options)) { + var args = arguments; + options = { + root: args[0], + weight: args[1], + directed: args[2] + }; + } + + var _dijkstraDefaults = dijkstraDefaults(options), + root = _dijkstraDefaults.root, + weight = _dijkstraDefaults.weight, + directed = _dijkstraDefaults.directed; + + var eles = this; + var weightFn = weight; + var source = string(root) ? this.filter(root)[0] : root[0]; + var dist = {}; + var prev = {}; + var knownDist = {}; + + var _this$byGroup = this.byGroup(), + nodes = _this$byGroup.nodes, + edges = _this$byGroup.edges; + + edges.unmergeBy(function (ele) { + return ele.isLoop(); + }); + + var getDist = function getDist(node) { + return dist[node.id()]; + }; + + var setDist = function setDist(node, d) { + dist[node.id()] = d; + Q.updateItem(node); + }; + + var Q = new heap(function (a, b) { + return getDist(a) - getDist(b); + }); + + for (var i = 0; i < nodes.length; i++) { + var node = nodes[i]; + dist[node.id()] = node.same(source) ? 0 : Infinity; + Q.push(node); + } + + var distBetween = function distBetween(u, v) { + var uvs = (directed ? u.edgesTo(v) : u.edgesWith(v)).intersect(edges); + var smallestDistance = Infinity; + var smallestEdge; + + for (var _i = 0; _i < uvs.length; _i++) { + var edge = uvs[_i]; + + var _weight = weightFn(edge); + + if (_weight < smallestDistance || !smallestEdge) { + smallestDistance = _weight; + smallestEdge = edge; + } + } + + return { + edge: smallestEdge, + dist: smallestDistance + }; + }; + + while (Q.size() > 0) { + var u = Q.pop(); + var smalletsDist = getDist(u); + var uid = u.id(); + knownDist[uid] = smalletsDist; + + if (smalletsDist === Infinity) { + continue; + } + + var neighbors = u.neighborhood().intersect(nodes); + + for (var _i2 = 0; _i2 < neighbors.length; _i2++) { + var v = neighbors[_i2]; + var vid = v.id(); + var vDist = distBetween(u, v); + var alt = smalletsDist + vDist.dist; + + if (alt < getDist(v)) { + setDist(v, alt); + prev[vid] = { + node: u, + edge: vDist.edge + }; + } + } // for + + } // while + + + return { + distanceTo: function distanceTo(node) { + var target = string(node) ? nodes.filter(node)[0] : node[0]; + return knownDist[target.id()]; + }, + pathTo: function pathTo(node) { + var target = string(node) ? nodes.filter(node)[0] : node[0]; + var S = []; + var u = target; + var uid = u.id(); + + if (target.length > 0) { + S.unshift(target); + + while (prev[uid]) { + var p = prev[uid]; + S.unshift(p.edge); + S.unshift(p.node); + u = p.node; + uid = u.id(); + } + } + + return eles.spawn(S); + } + }; + } + }; + + var elesfn$t = { + // kruskal's algorithm (finds min spanning tree, assuming undirected graph) + // implemented from pseudocode from wikipedia + kruskal: function kruskal(weightFn) { + weightFn = weightFn || function (edge) { + return 1; + }; + + var _this$byGroup = this.byGroup(), + nodes = _this$byGroup.nodes, + edges = _this$byGroup.edges; + + var numNodes = nodes.length; + var forest = new Array(numNodes); + var A = nodes; // assumes byGroup() creates new collections that can be safely mutated + + var findSetIndex = function findSetIndex(ele) { + for (var i = 0; i < forest.length; i++) { + var eles = forest[i]; + + if (eles.has(ele)) { + return i; + } + } + }; // start with one forest per node + + + for (var i = 0; i < numNodes; i++) { + forest[i] = this.spawn(nodes[i]); + } + + var S = edges.sort(function (a, b) { + return weightFn(a) - weightFn(b); + }); + + for (var _i = 0; _i < S.length; _i++) { + var edge = S[_i]; + var u = edge.source()[0]; + var v = edge.target()[0]; + var setUIndex = findSetIndex(u); + var setVIndex = findSetIndex(v); + var setU = forest[setUIndex]; + var setV = forest[setVIndex]; + + if (setUIndex !== setVIndex) { + A.merge(edge); // combine forests for u and v + + setU.merge(setV); + forest.splice(setVIndex, 1); + } + } + + return A; + } + }; + + var aStarDefaults = defaults$g({ + root: null, + goal: null, + weight: function weight(edge) { + return 1; + }, + heuristic: function heuristic(edge) { + return 0; + }, + directed: false + }); + var elesfn$s = { + // Implemented from pseudocode from wikipedia + aStar: function aStar(options) { + var cy = this.cy(); + + var _aStarDefaults = aStarDefaults(options), + root = _aStarDefaults.root, + goal = _aStarDefaults.goal, + heuristic = _aStarDefaults.heuristic, + directed = _aStarDefaults.directed, + weight = _aStarDefaults.weight; + + root = cy.collection(root)[0]; + goal = cy.collection(goal)[0]; + var sid = root.id(); + var tid = goal.id(); + var gScore = {}; + var fScore = {}; + var closedSetIds = {}; + var openSet = new heap(function (a, b) { + return fScore[a.id()] - fScore[b.id()]; + }); + var openSetIds = new Set$1(); + var cameFrom = {}; + var cameFromEdge = {}; + + var addToOpenSet = function addToOpenSet(ele, id) { + openSet.push(ele); + openSetIds.add(id); + }; + + var cMin, cMinId; + + var popFromOpenSet = function popFromOpenSet() { + cMin = openSet.pop(); + cMinId = cMin.id(); + openSetIds["delete"](cMinId); + }; + + var isInOpenSet = function isInOpenSet(id) { + return openSetIds.has(id); + }; + + addToOpenSet(root, sid); + gScore[sid] = 0; + fScore[sid] = heuristic(root); // Counter + + var steps = 0; // Main loop + + while (openSet.size() > 0) { + popFromOpenSet(); + steps++; // If we've found our goal, then we are done + + if (cMinId === tid) { + var path = []; + var pathNode = goal; + var pathNodeId = tid; + var pathEdge = cameFromEdge[pathNodeId]; + + for (;;) { + path.unshift(pathNode); + + if (pathEdge != null) { + path.unshift(pathEdge); + } + + pathNode = cameFrom[pathNodeId]; + + if (pathNode == null) { + break; + } + + pathNodeId = pathNode.id(); + pathEdge = cameFromEdge[pathNodeId]; + } + + return { + found: true, + distance: gScore[cMinId], + path: this.spawn(path), + steps: steps + }; + } // Add cMin to processed nodes + + + closedSetIds[cMinId] = true; // Update scores for neighbors of cMin + // Take into account if graph is directed or not + + var vwEdges = cMin._private.edges; + + for (var i = 0; i < vwEdges.length; i++) { + var e = vwEdges[i]; // edge must be in set of calling eles + + if (!this.hasElementWithId(e.id())) { + continue; + } // cMin must be the source of edge if directed + + + if (directed && e.data('source') !== cMinId) { + continue; + } + + var wSrc = e.source(); + var wTgt = e.target(); + var w = wSrc.id() !== cMinId ? wSrc : wTgt; + var wid = w.id(); // node must be in set of calling eles + + if (!this.hasElementWithId(wid)) { + continue; + } // if node is in closedSet, ignore it + + + if (closedSetIds[wid]) { + continue; + } // New tentative score for node w + + + var tempScore = gScore[cMinId] + weight(e); // Update gScore for node w if: + // w not present in openSet + // OR + // tentative gScore is less than previous value + // w not in openSet + + if (!isInOpenSet(wid)) { + gScore[wid] = tempScore; + fScore[wid] = tempScore + heuristic(w); + addToOpenSet(w, wid); + cameFrom[wid] = cMin; + cameFromEdge[wid] = e; + continue; + } // w already in openSet, but with greater gScore + + + if (tempScore < gScore[wid]) { + gScore[wid] = tempScore; + fScore[wid] = tempScore + heuristic(w); + cameFrom[wid] = cMin; + cameFromEdge[wid] = e; + } + } // End of neighbors update + + } // End of main loop + // If we've reached here, then we've not reached our goal + + + return { + found: false, + distance: undefined, + path: undefined, + steps: steps + }; + } + }; // elesfn + + var floydWarshallDefaults = defaults$g({ + weight: function weight(edge) { + return 1; + }, + directed: false + }); + var elesfn$r = { + // Implemented from pseudocode from wikipedia + floydWarshall: function floydWarshall(options) { + var cy = this.cy(); + + var _floydWarshallDefault = floydWarshallDefaults(options), + weight = _floydWarshallDefault.weight, + directed = _floydWarshallDefault.directed; + + var weightFn = weight; + + var _this$byGroup = this.byGroup(), + nodes = _this$byGroup.nodes, + edges = _this$byGroup.edges; + + var N = nodes.length; + var Nsq = N * N; + + var indexOf = function indexOf(node) { + return nodes.indexOf(node); + }; + + var atIndex = function atIndex(i) { + return nodes[i]; + }; // Initialize distance matrix + + + var dist = new Array(Nsq); + + for (var n = 0; n < Nsq; n++) { + var j = n % N; + var i = (n - j) / N; + + if (i === j) { + dist[n] = 0; + } else { + dist[n] = Infinity; + } + } // Initialize matrix used for path reconstruction + // Initialize distance matrix + + + var next = new Array(Nsq); + var edgeNext = new Array(Nsq); // Process edges + + for (var _i = 0; _i < edges.length; _i++) { + var edge = edges[_i]; + var src = edge.source()[0]; + var tgt = edge.target()[0]; + + if (src === tgt) { + continue; + } // exclude loops + + + var s = indexOf(src); + var t = indexOf(tgt); + var st = s * N + t; // source to target index + + var _weight = weightFn(edge); // Check if already process another edge between same 2 nodes + + + if (dist[st] > _weight) { + dist[st] = _weight; + next[st] = t; + edgeNext[st] = edge; + } // If undirected graph, process 'reversed' edge + + + if (!directed) { + var ts = t * N + s; // target to source index + + if (!directed && dist[ts] > _weight) { + dist[ts] = _weight; + next[ts] = s; + edgeNext[ts] = edge; + } + } + } // Main loop + + + for (var k = 0; k < N; k++) { + for (var _i2 = 0; _i2 < N; _i2++) { + var ik = _i2 * N + k; + + for (var _j = 0; _j < N; _j++) { + var ij = _i2 * N + _j; + var kj = k * N + _j; + + if (dist[ik] + dist[kj] < dist[ij]) { + dist[ij] = dist[ik] + dist[kj]; + next[ij] = next[ik]; + } + } + } + } + + var getArgEle = function getArgEle(ele) { + return (string(ele) ? cy.filter(ele) : ele)[0]; + }; + + var indexOfArgEle = function indexOfArgEle(ele) { + return indexOf(getArgEle(ele)); + }; + + var res = { + distance: function distance(from, to) { + var i = indexOfArgEle(from); + var j = indexOfArgEle(to); + return dist[i * N + j]; + }, + path: function path(from, to) { + var i = indexOfArgEle(from); + var j = indexOfArgEle(to); + var fromNode = atIndex(i); + + if (i === j) { + return fromNode.collection(); + } + + if (next[i * N + j] == null) { + return cy.collection(); + } + + var path = cy.collection(); + var prev = i; + var edge; + path.merge(fromNode); + + while (i !== j) { + prev = i; + i = next[i * N + j]; + edge = edgeNext[prev * N + i]; + path.merge(edge); + path.merge(atIndex(i)); + } + + return path; + } + }; + return res; + } // floydWarshall + + }; // elesfn + + var bellmanFordDefaults = defaults$g({ + weight: function weight(edge) { + return 1; + }, + directed: false, + root: null + }); + var elesfn$q = { + // Implemented from pseudocode from wikipedia + bellmanFord: function bellmanFord(options) { + var _this = this; + + var _bellmanFordDefaults = bellmanFordDefaults(options), + weight = _bellmanFordDefaults.weight, + directed = _bellmanFordDefaults.directed, + root = _bellmanFordDefaults.root; + + var weightFn = weight; + var eles = this; + var cy = this.cy(); + + var _this$byGroup = this.byGroup(), + edges = _this$byGroup.edges, + nodes = _this$byGroup.nodes; + + var numNodes = nodes.length; + var infoMap = new Map$2(); + var hasNegativeWeightCycle = false; + var negativeWeightCycles = []; + root = cy.collection(root)[0]; // in case selector passed + + edges.unmergeBy(function (edge) { + return edge.isLoop(); + }); + var numEdges = edges.length; + + var getInfo = function getInfo(node) { + var obj = infoMap.get(node.id()); + + if (!obj) { + obj = {}; + infoMap.set(node.id(), obj); + } + + return obj; + }; + + var getNodeFromTo = function getNodeFromTo(to) { + return (string(to) ? cy.$(to) : to)[0]; + }; + + var distanceTo = function distanceTo(to) { + return getInfo(getNodeFromTo(to)).dist; + }; + + var pathTo = function pathTo(to) { + var thisStart = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : root; + var end = getNodeFromTo(to); + var path = []; + var node = end; + + for (;;) { + if (node == null) { + return _this.spawn(); + } + + var _getInfo = getInfo(node), + edge = _getInfo.edge, + pred = _getInfo.pred; + + path.unshift(node[0]); + + if (node.same(thisStart) && path.length > 0) { + break; + } + + if (edge != null) { + path.unshift(edge); + } + + node = pred; + } + + return eles.spawn(path); + }; // Initializations { dist, pred, edge } + + + for (var i = 0; i < numNodes; i++) { + var node = nodes[i]; + var info = getInfo(node); + + if (node.same(root)) { + info.dist = 0; + } else { + info.dist = Infinity; + } + + info.pred = null; + info.edge = null; + } // Edges relaxation + + + var replacedEdge = false; + + var checkForEdgeReplacement = function checkForEdgeReplacement(node1, node2, edge, info1, info2, weight) { + var dist = info1.dist + weight; + + if (dist < info2.dist && !edge.same(info1.edge)) { + info2.dist = dist; + info2.pred = node1; + info2.edge = edge; + replacedEdge = true; + } + }; + + for (var _i = 1; _i < numNodes; _i++) { + replacedEdge = false; + + for (var e = 0; e < numEdges; e++) { + var edge = edges[e]; + var src = edge.source(); + var tgt = edge.target(); + + var _weight = weightFn(edge); + + var srcInfo = getInfo(src); + var tgtInfo = getInfo(tgt); + checkForEdgeReplacement(src, tgt, edge, srcInfo, tgtInfo, _weight); // If undirected graph, we need to take into account the 'reverse' edge + + if (!directed) { + checkForEdgeReplacement(tgt, src, edge, tgtInfo, srcInfo, _weight); + } + } + + if (!replacedEdge) { + break; + } + } + + if (replacedEdge) { + // Check for negative weight cycles + var negativeWeightCycleIds = []; + + for (var _e = 0; _e < numEdges; _e++) { + var _edge = edges[_e]; + + var _src = _edge.source(); + + var _tgt = _edge.target(); + + var _weight2 = weightFn(_edge); + + var srcDist = getInfo(_src).dist; + var tgtDist = getInfo(_tgt).dist; + + if (srcDist + _weight2 < tgtDist || !directed && tgtDist + _weight2 < srcDist) { + if (!hasNegativeWeightCycle) { + warn('Graph contains a negative weight cycle for Bellman-Ford'); + hasNegativeWeightCycle = true; + } + + if (options.findNegativeWeightCycles !== false) { + var negativeNodes = []; + + if (srcDist + _weight2 < tgtDist) { + negativeNodes.push(_src); + } + + if (!directed && tgtDist + _weight2 < srcDist) { + negativeNodes.push(_tgt); + } + + var numNegativeNodes = negativeNodes.length; + + for (var n = 0; n < numNegativeNodes; n++) { + var start = negativeNodes[n]; + var cycle = [start]; + cycle.push(getInfo(start).edge); + var _node = getInfo(start).pred; + + while (cycle.indexOf(_node) === -1) { + cycle.push(_node); + cycle.push(getInfo(_node).edge); + _node = getInfo(_node).pred; + } + + cycle = cycle.slice(cycle.indexOf(_node)); + var smallestId = cycle[0].id(); + var smallestIndex = 0; + + for (var c = 2; c < cycle.length; c += 2) { + if (cycle[c].id() < smallestId) { + smallestId = cycle[c].id(); + smallestIndex = c; + } + } + + cycle = cycle.slice(smallestIndex).concat(cycle.slice(0, smallestIndex)); + cycle.push(cycle[0]); + var cycleId = cycle.map(function (el) { + return el.id(); + }).join(","); + + if (negativeWeightCycleIds.indexOf(cycleId) === -1) { + negativeWeightCycles.push(eles.spawn(cycle)); + negativeWeightCycleIds.push(cycleId); + } + } + } else { + break; + } + } + } + } + + return { + distanceTo: distanceTo, + pathTo: pathTo, + hasNegativeWeightCycle: hasNegativeWeightCycle, + negativeWeightCycles: negativeWeightCycles + }; + } // bellmanFord + + }; // elesfn + + var sqrt2 = Math.sqrt(2); // Function which colapses 2 (meta) nodes into one + // Updates the remaining edge lists + // Receives as a paramater the edge which causes the collapse + + var collapse = function collapse(edgeIndex, nodeMap, remainingEdges) { + if (remainingEdges.length === 0) { + error("Karger-Stein must be run on a connected (sub)graph"); + } + + var edgeInfo = remainingEdges[edgeIndex]; + var sourceIn = edgeInfo[1]; + var targetIn = edgeInfo[2]; + var partition1 = nodeMap[sourceIn]; + var partition2 = nodeMap[targetIn]; + var newEdges = remainingEdges; // re-use array + // Delete all edges between partition1 and partition2 + + for (var i = newEdges.length - 1; i >= 0; i--) { + var edge = newEdges[i]; + var src = edge[1]; + var tgt = edge[2]; + + if (nodeMap[src] === partition1 && nodeMap[tgt] === partition2 || nodeMap[src] === partition2 && nodeMap[tgt] === partition1) { + newEdges.splice(i, 1); + } + } // All edges pointing to partition2 should now point to partition1 + + + for (var _i = 0; _i < newEdges.length; _i++) { + var _edge = newEdges[_i]; + + if (_edge[1] === partition2) { + // Check source + newEdges[_i] = _edge.slice(); // copy + + newEdges[_i][1] = partition1; + } else if (_edge[2] === partition2) { + // Check target + newEdges[_i] = _edge.slice(); // copy + + newEdges[_i][2] = partition1; + } + } // Move all nodes from partition2 to partition1 + + + for (var _i2 = 0; _i2 < nodeMap.length; _i2++) { + if (nodeMap[_i2] === partition2) { + nodeMap[_i2] = partition1; + } + } + + return newEdges; + }; // Contracts a graph until we reach a certain number of meta nodes + + + var contractUntil = function contractUntil(metaNodeMap, remainingEdges, size, sizeLimit) { + while (size > sizeLimit) { + // Choose an edge randomly + var edgeIndex = Math.floor(Math.random() * remainingEdges.length); // Collapse graph based on edge + + remainingEdges = collapse(edgeIndex, metaNodeMap, remainingEdges); + size--; + } + + return remainingEdges; + }; + + var elesfn$p = { + // Computes the minimum cut of an undirected graph + // Returns the correct answer with high probability + kargerStein: function kargerStein() { + var _this = this; + + var _this$byGroup = this.byGroup(), + nodes = _this$byGroup.nodes, + edges = _this$byGroup.edges; + + edges.unmergeBy(function (edge) { + return edge.isLoop(); + }); + var numNodes = nodes.length; + var numEdges = edges.length; + var numIter = Math.ceil(Math.pow(Math.log(numNodes) / Math.LN2, 2)); + var stopSize = Math.floor(numNodes / sqrt2); + + if (numNodes < 2) { + error('At least 2 nodes are required for Karger-Stein algorithm'); + return undefined; + } // Now store edge destination as indexes + // Format for each edge (edge index, source node index, target node index) + + + var edgeIndexes = []; + + for (var i = 0; i < numEdges; i++) { + var e = edges[i]; + edgeIndexes.push([i, nodes.indexOf(e.source()), nodes.indexOf(e.target())]); + } // We will store the best cut found here + + + var minCutSize = Infinity; + var minCutEdgeIndexes = []; + var minCutNodeMap = new Array(numNodes); // Initial meta node partition + + var metaNodeMap = new Array(numNodes); + var metaNodeMap2 = new Array(numNodes); + + var copyNodesMap = function copyNodesMap(from, to) { + for (var _i3 = 0; _i3 < numNodes; _i3++) { + to[_i3] = from[_i3]; + } + }; // Main loop + + + for (var iter = 0; iter <= numIter; iter++) { + // Reset meta node partition + for (var _i4 = 0; _i4 < numNodes; _i4++) { + metaNodeMap[_i4] = _i4; + } // Contract until stop point (stopSize nodes) + + + var edgesState = contractUntil(metaNodeMap, edgeIndexes.slice(), numNodes, stopSize); + var edgesState2 = edgesState.slice(); // copy + // Create a copy of the colapsed nodes state + + copyNodesMap(metaNodeMap, metaNodeMap2); // Run 2 iterations starting in the stop state + + var res1 = contractUntil(metaNodeMap, edgesState, stopSize, 2); + var res2 = contractUntil(metaNodeMap2, edgesState2, stopSize, 2); // Is any of the 2 results the best cut so far? + + if (res1.length <= res2.length && res1.length < minCutSize) { + minCutSize = res1.length; + minCutEdgeIndexes = res1; + copyNodesMap(metaNodeMap, minCutNodeMap); + } else if (res2.length <= res1.length && res2.length < minCutSize) { + minCutSize = res2.length; + minCutEdgeIndexes = res2; + copyNodesMap(metaNodeMap2, minCutNodeMap); + } + } // end of main loop + // Construct result + + + var cut = this.spawn(minCutEdgeIndexes.map(function (e) { + return edges[e[0]]; + })); + var partition1 = this.spawn(); + var partition2 = this.spawn(); // traverse metaNodeMap for best cut + + var witnessNodePartition = minCutNodeMap[0]; + + for (var _i5 = 0; _i5 < minCutNodeMap.length; _i5++) { + var partitionId = minCutNodeMap[_i5]; + var node = nodes[_i5]; + + if (partitionId === witnessNodePartition) { + partition1.merge(node); + } else { + partition2.merge(node); + } + } // construct components corresponding to each disjoint subset of nodes + + + var constructComponent = function constructComponent(subset) { + var component = _this.spawn(); + + subset.forEach(function (node) { + component.merge(node); + node.connectedEdges().forEach(function (edge) { + // ensure edge is within calling collection and edge is not in cut + if (_this.contains(edge) && !cut.contains(edge)) { + component.merge(edge); + } + }); + }); + return component; + }; + + var components = [constructComponent(partition1), constructComponent(partition2)]; + var ret = { + cut: cut, + components: components, + // n.b. partitions are included to be compatible with the old api spec + // (could be removed in a future major version) + partition1: partition1, + partition2: partition2 + }; + return ret; + } + }; // elesfn + + var copyPosition = function copyPosition(p) { + return { + x: p.x, + y: p.y + }; + }; + var modelToRenderedPosition = function modelToRenderedPosition(p, zoom, pan) { + return { + x: p.x * zoom + pan.x, + y: p.y * zoom + pan.y + }; + }; + var renderedToModelPosition = function renderedToModelPosition(p, zoom, pan) { + return { + x: (p.x - pan.x) / zoom, + y: (p.y - pan.y) / zoom + }; + }; + var array2point = function array2point(arr) { + return { + x: arr[0], + y: arr[1] + }; + }; + var min = function min(arr) { + var begin = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + var end = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : arr.length; + var min = Infinity; + + for (var i = begin; i < end; i++) { + var val = arr[i]; + + if (isFinite(val)) { + min = Math.min(val, min); + } + } + + return min; + }; + var max = function max(arr) { + var begin = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + var end = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : arr.length; + var max = -Infinity; + + for (var i = begin; i < end; i++) { + var val = arr[i]; + + if (isFinite(val)) { + max = Math.max(val, max); + } + } + + return max; + }; + var mean = function mean(arr) { + var begin = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + var end = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : arr.length; + var total = 0; + var n = 0; + + for (var i = begin; i < end; i++) { + var val = arr[i]; + + if (isFinite(val)) { + total += val; + n++; + } + } + + return total / n; + }; + var median = function median(arr) { + var begin = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + var end = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : arr.length; + var copy = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var sort = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true; + var includeHoles = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true; + + if (copy) { + arr = arr.slice(begin, end); + } else { + if (end < arr.length) { + arr.splice(end, arr.length - end); + } + + if (begin > 0) { + arr.splice(0, begin); + } + } // all non finite (e.g. Infinity, NaN) elements must be -Infinity so they go to the start + + + var off = 0; // offset from non-finite values + + for (var i = arr.length - 1; i >= 0; i--) { + var v = arr[i]; + + if (includeHoles) { + if (!isFinite(v)) { + arr[i] = -Infinity; + off++; + } + } else { + // just remove it if we don't want to consider holes + arr.splice(i, 1); + } + } + + if (sort) { + arr.sort(function (a, b) { + return a - b; + }); // requires copy = true if you don't want to change the orig + } + + var len = arr.length; + var mid = Math.floor(len / 2); + + if (len % 2 !== 0) { + return arr[mid + 1 + off]; + } else { + return (arr[mid - 1 + off] + arr[mid + off]) / 2; + } + }; + var deg2rad = function deg2rad(deg) { + return Math.PI * deg / 180; + }; + var getAngleFromDisp = function getAngleFromDisp(dispX, dispY) { + return Math.atan2(dispY, dispX) - Math.PI / 2; + }; + var log2 = Math.log2 || function (n) { + return Math.log(n) / Math.log(2); + }; + var signum = function signum(x) { + if (x > 0) { + return 1; + } else if (x < 0) { + return -1; + } else { + return 0; + } + }; + var dist = function dist(p1, p2) { + return Math.sqrt(sqdist(p1, p2)); + }; + var sqdist = function sqdist(p1, p2) { + var dx = p2.x - p1.x; + var dy = p2.y - p1.y; + return dx * dx + dy * dy; + }; + var inPlaceSumNormalize = function inPlaceSumNormalize(v) { + var length = v.length; // First, get sum of all elements + + var total = 0; + + for (var i = 0; i < length; i++) { + total += v[i]; + } // Now, divide each by the sum of all elements + + + for (var _i = 0; _i < length; _i++) { + v[_i] = v[_i] / total; + } + + return v; + }; + + var qbezierAt = function qbezierAt(p0, p1, p2, t) { + return (1 - t) * (1 - t) * p0 + 2 * (1 - t) * t * p1 + t * t * p2; + }; + var qbezierPtAt = function qbezierPtAt(p0, p1, p2, t) { + return { + x: qbezierAt(p0.x, p1.x, p2.x, t), + y: qbezierAt(p0.y, p1.y, p2.y, t) + }; + }; + var lineAt = function lineAt(p0, p1, t, d) { + var vec = { + x: p1.x - p0.x, + y: p1.y - p0.y + }; + var vecDist = dist(p0, p1); + var normVec = { + x: vec.x / vecDist, + y: vec.y / vecDist + }; + t = t == null ? 0 : t; + d = d != null ? d : t * vecDist; + return { + x: p0.x + normVec.x * d, + y: p0.y + normVec.y * d + }; + }; + var bound = function bound(min, val, max) { + return Math.max(min, Math.min(max, val)); + }; // makes a full bb (x1, y1, x2, y2, w, h) from implicit params + + var makeBoundingBox = function makeBoundingBox(bb) { + if (bb == null) { + return { + x1: Infinity, + y1: Infinity, + x2: -Infinity, + y2: -Infinity, + w: 0, + h: 0 + }; + } else if (bb.x1 != null && bb.y1 != null) { + if (bb.x2 != null && bb.y2 != null && bb.x2 >= bb.x1 && bb.y2 >= bb.y1) { + return { + x1: bb.x1, + y1: bb.y1, + x2: bb.x2, + y2: bb.y2, + w: bb.x2 - bb.x1, + h: bb.y2 - bb.y1 + }; + } else if (bb.w != null && bb.h != null && bb.w >= 0 && bb.h >= 0) { + return { + x1: bb.x1, + y1: bb.y1, + x2: bb.x1 + bb.w, + y2: bb.y1 + bb.h, + w: bb.w, + h: bb.h + }; + } + } + }; + var copyBoundingBox = function copyBoundingBox(bb) { + return { + x1: bb.x1, + x2: bb.x2, + w: bb.w, + y1: bb.y1, + y2: bb.y2, + h: bb.h + }; + }; + var clearBoundingBox = function clearBoundingBox(bb) { + bb.x1 = Infinity; + bb.y1 = Infinity; + bb.x2 = -Infinity; + bb.y2 = -Infinity; + bb.w = 0; + bb.h = 0; + }; + var updateBoundingBox = function updateBoundingBox(bb1, bb2) { + // update bb1 with bb2 bounds + bb1.x1 = Math.min(bb1.x1, bb2.x1); + bb1.x2 = Math.max(bb1.x2, bb2.x2); + bb1.w = bb1.x2 - bb1.x1; + bb1.y1 = Math.min(bb1.y1, bb2.y1); + bb1.y2 = Math.max(bb1.y2, bb2.y2); + bb1.h = bb1.y2 - bb1.y1; + }; + var expandBoundingBoxByPoint = function expandBoundingBoxByPoint(bb, x, y) { + bb.x1 = Math.min(bb.x1, x); + bb.x2 = Math.max(bb.x2, x); + bb.w = bb.x2 - bb.x1; + bb.y1 = Math.min(bb.y1, y); + bb.y2 = Math.max(bb.y2, y); + bb.h = bb.y2 - bb.y1; + }; + var expandBoundingBox = function expandBoundingBox(bb) { + var padding = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + bb.x1 -= padding; + bb.x2 += padding; + bb.y1 -= padding; + bb.y2 += padding; + bb.w = bb.x2 - bb.x1; + bb.h = bb.y2 - bb.y1; + return bb; + }; + var expandBoundingBoxSides = function expandBoundingBoxSides(bb) { + var padding = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [0]; + var top, right, bottom, left; + + if (padding.length === 1) { + top = right = bottom = left = padding[0]; + } else if (padding.length === 2) { + top = bottom = padding[0]; + left = right = padding[1]; + } else if (padding.length === 4) { + var _padding = _slicedToArray(padding, 4); + + top = _padding[0]; + right = _padding[1]; + bottom = _padding[2]; + left = _padding[3]; + } + + bb.x1 -= left; + bb.x2 += right; + bb.y1 -= top; + bb.y2 += bottom; + bb.w = bb.x2 - bb.x1; + bb.h = bb.y2 - bb.y1; + return bb; + }; + + var assignBoundingBox = function assignBoundingBox(bb1, bb2) { + bb1.x1 = bb2.x1; + bb1.y1 = bb2.y1; + bb1.x2 = bb2.x2; + bb1.y2 = bb2.y2; + bb1.w = bb1.x2 - bb1.x1; + bb1.h = bb1.y2 - bb1.y1; + }; + var boundingBoxesIntersect = function boundingBoxesIntersect(bb1, bb2) { + // case: one bb to right of other + if (bb1.x1 > bb2.x2) { + return false; + } + + if (bb2.x1 > bb1.x2) { + return false; + } // case: one bb to left of other + + + if (bb1.x2 < bb2.x1) { + return false; + } + + if (bb2.x2 < bb1.x1) { + return false; + } // case: one bb above other + + + if (bb1.y2 < bb2.y1) { + return false; + } + + if (bb2.y2 < bb1.y1) { + return false; + } // case: one bb below other + + + if (bb1.y1 > bb2.y2) { + return false; + } + + if (bb2.y1 > bb1.y2) { + return false; + } // otherwise, must have some overlap + + + return true; + }; + var inBoundingBox = function inBoundingBox(bb, x, y) { + return bb.x1 <= x && x <= bb.x2 && bb.y1 <= y && y <= bb.y2; + }; + var pointInBoundingBox = function pointInBoundingBox(bb, pt) { + return inBoundingBox(bb, pt.x, pt.y); + }; + var boundingBoxInBoundingBox = function boundingBoxInBoundingBox(bb1, bb2) { + return inBoundingBox(bb1, bb2.x1, bb2.y1) && inBoundingBox(bb1, bb2.x2, bb2.y2); + }; + var roundRectangleIntersectLine = function roundRectangleIntersectLine(x, y, nodeX, nodeY, width, height, padding) { + var cornerRadius = getRoundRectangleRadius(width, height); + var halfWidth = width / 2; + var halfHeight = height / 2; // Check intersections with straight line segments + + var straightLineIntersections; // Top segment, left to right + + { + var topStartX = nodeX - halfWidth + cornerRadius - padding; + var topStartY = nodeY - halfHeight - padding; + var topEndX = nodeX + halfWidth - cornerRadius + padding; + var topEndY = topStartY; + straightLineIntersections = finiteLinesIntersect(x, y, nodeX, nodeY, topStartX, topStartY, topEndX, topEndY, false); + + if (straightLineIntersections.length > 0) { + return straightLineIntersections; + } + } // Right segment, top to bottom + + { + var rightStartX = nodeX + halfWidth + padding; + var rightStartY = nodeY - halfHeight + cornerRadius - padding; + var rightEndX = rightStartX; + var rightEndY = nodeY + halfHeight - cornerRadius + padding; + straightLineIntersections = finiteLinesIntersect(x, y, nodeX, nodeY, rightStartX, rightStartY, rightEndX, rightEndY, false); + + if (straightLineIntersections.length > 0) { + return straightLineIntersections; + } + } // Bottom segment, left to right + + { + var bottomStartX = nodeX - halfWidth + cornerRadius - padding; + var bottomStartY = nodeY + halfHeight + padding; + var bottomEndX = nodeX + halfWidth - cornerRadius + padding; + var bottomEndY = bottomStartY; + straightLineIntersections = finiteLinesIntersect(x, y, nodeX, nodeY, bottomStartX, bottomStartY, bottomEndX, bottomEndY, false); + + if (straightLineIntersections.length > 0) { + return straightLineIntersections; + } + } // Left segment, top to bottom + + { + var leftStartX = nodeX - halfWidth - padding; + var leftStartY = nodeY - halfHeight + cornerRadius - padding; + var leftEndX = leftStartX; + var leftEndY = nodeY + halfHeight - cornerRadius + padding; + straightLineIntersections = finiteLinesIntersect(x, y, nodeX, nodeY, leftStartX, leftStartY, leftEndX, leftEndY, false); + + if (straightLineIntersections.length > 0) { + return straightLineIntersections; + } + } // Check intersections with arc segments + + var arcIntersections; // Top Left + + { + var topLeftCenterX = nodeX - halfWidth + cornerRadius; + var topLeftCenterY = nodeY - halfHeight + cornerRadius; + arcIntersections = intersectLineCircle(x, y, nodeX, nodeY, topLeftCenterX, topLeftCenterY, cornerRadius + padding); // Ensure the intersection is on the desired quarter of the circle + + if (arcIntersections.length > 0 && arcIntersections[0] <= topLeftCenterX && arcIntersections[1] <= topLeftCenterY) { + return [arcIntersections[0], arcIntersections[1]]; + } + } // Top Right + + { + var topRightCenterX = nodeX + halfWidth - cornerRadius; + var topRightCenterY = nodeY - halfHeight + cornerRadius; + arcIntersections = intersectLineCircle(x, y, nodeX, nodeY, topRightCenterX, topRightCenterY, cornerRadius + padding); // Ensure the intersection is on the desired quarter of the circle + + if (arcIntersections.length > 0 && arcIntersections[0] >= topRightCenterX && arcIntersections[1] <= topRightCenterY) { + return [arcIntersections[0], arcIntersections[1]]; + } + } // Bottom Right + + { + var bottomRightCenterX = nodeX + halfWidth - cornerRadius; + var bottomRightCenterY = nodeY + halfHeight - cornerRadius; + arcIntersections = intersectLineCircle(x, y, nodeX, nodeY, bottomRightCenterX, bottomRightCenterY, cornerRadius + padding); // Ensure the intersection is on the desired quarter of the circle + + if (arcIntersections.length > 0 && arcIntersections[0] >= bottomRightCenterX && arcIntersections[1] >= bottomRightCenterY) { + return [arcIntersections[0], arcIntersections[1]]; + } + } // Bottom Left + + { + var bottomLeftCenterX = nodeX - halfWidth + cornerRadius; + var bottomLeftCenterY = nodeY + halfHeight - cornerRadius; + arcIntersections = intersectLineCircle(x, y, nodeX, nodeY, bottomLeftCenterX, bottomLeftCenterY, cornerRadius + padding); // Ensure the intersection is on the desired quarter of the circle + + if (arcIntersections.length > 0 && arcIntersections[0] <= bottomLeftCenterX && arcIntersections[1] >= bottomLeftCenterY) { + return [arcIntersections[0], arcIntersections[1]]; + } + } + return []; // if nothing + }; + var inLineVicinity = function inLineVicinity(x, y, lx1, ly1, lx2, ly2, tolerance) { + var t = tolerance; + var x1 = Math.min(lx1, lx2); + var x2 = Math.max(lx1, lx2); + var y1 = Math.min(ly1, ly2); + var y2 = Math.max(ly1, ly2); + return x1 - t <= x && x <= x2 + t && y1 - t <= y && y <= y2 + t; + }; + var inBezierVicinity = function inBezierVicinity(x, y, x1, y1, x2, y2, x3, y3, tolerance) { + var bb = { + x1: Math.min(x1, x3, x2) - tolerance, + x2: Math.max(x1, x3, x2) + tolerance, + y1: Math.min(y1, y3, y2) - tolerance, + y2: Math.max(y1, y3, y2) + tolerance + }; // if outside the rough bounding box for the bezier, then it can't be a hit + + if (x < bb.x1 || x > bb.x2 || y < bb.y1 || y > bb.y2) { + // console.log('bezier out of rough bb') + return false; + } else { + // console.log('do more expensive check'); + return true; + } + }; + var solveQuadratic = function solveQuadratic(a, b, c, val) { + c -= val; + var r = b * b - 4 * a * c; + + if (r < 0) { + return []; + } + + var sqrtR = Math.sqrt(r); + var denom = 2 * a; + var root1 = (-b + sqrtR) / denom; + var root2 = (-b - sqrtR) / denom; + return [root1, root2]; + }; + var solveCubic = function solveCubic(a, b, c, d, result) { + // Solves a cubic function, returns root in form [r1, i1, r2, i2, r3, i3], where + // r is the real component, i is the imaginary component + // An implementation of the Cardano method from the year 1545 + // http://en.wikipedia.org/wiki/Cubic_function#The_nature_of_the_roots + var epsilon = 0.00001; // avoid division by zero while keeping the overall expression close in value + + if (a === 0) { + a = epsilon; + } + + b /= a; + c /= a; + d /= a; + var discriminant, q, r, dum1, s, t, term1, r13; + q = (3.0 * c - b * b) / 9.0; + r = -(27.0 * d) + b * (9.0 * c - 2.0 * (b * b)); + r /= 54.0; + discriminant = q * q * q + r * r; + result[1] = 0; + term1 = b / 3.0; + + if (discriminant > 0) { + s = r + Math.sqrt(discriminant); + s = s < 0 ? -Math.pow(-s, 1.0 / 3.0) : Math.pow(s, 1.0 / 3.0); + t = r - Math.sqrt(discriminant); + t = t < 0 ? -Math.pow(-t, 1.0 / 3.0) : Math.pow(t, 1.0 / 3.0); + result[0] = -term1 + s + t; + term1 += (s + t) / 2.0; + result[4] = result[2] = -term1; + term1 = Math.sqrt(3.0) * (-t + s) / 2; + result[3] = term1; + result[5] = -term1; + return; + } + + result[5] = result[3] = 0; + + if (discriminant === 0) { + r13 = r < 0 ? -Math.pow(-r, 1.0 / 3.0) : Math.pow(r, 1.0 / 3.0); + result[0] = -term1 + 2.0 * r13; + result[4] = result[2] = -(r13 + term1); + return; + } + + q = -q; + dum1 = q * q * q; + dum1 = Math.acos(r / Math.sqrt(dum1)); + r13 = 2.0 * Math.sqrt(q); + result[0] = -term1 + r13 * Math.cos(dum1 / 3.0); + result[2] = -term1 + r13 * Math.cos((dum1 + 2.0 * Math.PI) / 3.0); + result[4] = -term1 + r13 * Math.cos((dum1 + 4.0 * Math.PI) / 3.0); + return; + }; + var sqdistToQuadraticBezier = function sqdistToQuadraticBezier(x, y, x1, y1, x2, y2, x3, y3) { + // Find minimum distance by using the minimum of the distance + // function between the given point and the curve + // This gives the coefficients of the resulting cubic equation + // whose roots tell us where a possible minimum is + // (Coefficients are divided by 4) + var a = 1.0 * x1 * x1 - 4 * x1 * x2 + 2 * x1 * x3 + 4 * x2 * x2 - 4 * x2 * x3 + x3 * x3 + y1 * y1 - 4 * y1 * y2 + 2 * y1 * y3 + 4 * y2 * y2 - 4 * y2 * y3 + y3 * y3; + var b = 1.0 * 9 * x1 * x2 - 3 * x1 * x1 - 3 * x1 * x3 - 6 * x2 * x2 + 3 * x2 * x3 + 9 * y1 * y2 - 3 * y1 * y1 - 3 * y1 * y3 - 6 * y2 * y2 + 3 * y2 * y3; + var c = 1.0 * 3 * x1 * x1 - 6 * x1 * x2 + x1 * x3 - x1 * x + 2 * x2 * x2 + 2 * x2 * x - x3 * x + 3 * y1 * y1 - 6 * y1 * y2 + y1 * y3 - y1 * y + 2 * y2 * y2 + 2 * y2 * y - y3 * y; + var d = 1.0 * x1 * x2 - x1 * x1 + x1 * x - x2 * x + y1 * y2 - y1 * y1 + y1 * y - y2 * y; // debug("coefficients: " + a / a + ", " + b / a + ", " + c / a + ", " + d / a); + + var roots = []; // Use the cubic solving algorithm + + solveCubic(a, b, c, d, roots); + var zeroThreshold = 0.0000001; + var params = []; + + for (var index = 0; index < 6; index += 2) { + if (Math.abs(roots[index + 1]) < zeroThreshold && roots[index] >= 0 && roots[index] <= 1.0) { + params.push(roots[index]); + } + } + + params.push(1.0); + params.push(0.0); + var minDistanceSquared = -1; + var curX, curY, distSquared; + + for (var i = 0; i < params.length; i++) { + curX = Math.pow(1.0 - params[i], 2.0) * x1 + 2.0 * (1 - params[i]) * params[i] * x2 + params[i] * params[i] * x3; + curY = Math.pow(1 - params[i], 2.0) * y1 + 2 * (1.0 - params[i]) * params[i] * y2 + params[i] * params[i] * y3; + distSquared = Math.pow(curX - x, 2) + Math.pow(curY - y, 2); // debug('distance for param ' + params[i] + ": " + Math.sqrt(distSquared)); + + if (minDistanceSquared >= 0) { + if (distSquared < minDistanceSquared) { + minDistanceSquared = distSquared; + } + } else { + minDistanceSquared = distSquared; + } + } + + return minDistanceSquared; + }; + var sqdistToFiniteLine = function sqdistToFiniteLine(x, y, x1, y1, x2, y2) { + var offset = [x - x1, y - y1]; + var line = [x2 - x1, y2 - y1]; + var lineSq = line[0] * line[0] + line[1] * line[1]; + var hypSq = offset[0] * offset[0] + offset[1] * offset[1]; + var dotProduct = offset[0] * line[0] + offset[1] * line[1]; + var adjSq = dotProduct * dotProduct / lineSq; + + if (dotProduct < 0) { + return hypSq; + } + + if (adjSq > lineSq) { + return (x - x2) * (x - x2) + (y - y2) * (y - y2); + } + + return hypSq - adjSq; + }; + var pointInsidePolygonPoints = function pointInsidePolygonPoints(x, y, points) { + var x1, y1, x2, y2; + var y3; // Intersect with vertical line through (x, y) + + var up = 0; // let down = 0; + + for (var i = 0; i < points.length / 2; i++) { + x1 = points[i * 2]; + y1 = points[i * 2 + 1]; + + if (i + 1 < points.length / 2) { + x2 = points[(i + 1) * 2]; + y2 = points[(i + 1) * 2 + 1]; + } else { + x2 = points[(i + 1 - points.length / 2) * 2]; + y2 = points[(i + 1 - points.length / 2) * 2 + 1]; + } + + if (x1 == x && x2 == x) ; else if (x1 >= x && x >= x2 || x1 <= x && x <= x2) { + y3 = (x - x1) / (x2 - x1) * (y2 - y1) + y1; + + if (y3 > y) { + up++; + } // if( y3 < y ){ + // down++; + // } + + } else { + continue; + } + } + + if (up % 2 === 0) { + return false; + } else { + return true; + } + }; + var pointInsidePolygon = function pointInsidePolygon(x, y, basePoints, centerX, centerY, width, height, direction, padding) { + var transformedPoints = new Array(basePoints.length); // Gives negative angle + + var angle; + + if (direction[0] != null) { + angle = Math.atan(direction[1] / direction[0]); + + if (direction[0] < 0) { + angle = angle + Math.PI / 2; + } else { + angle = -angle - Math.PI / 2; + } + } else { + angle = direction; + } + + var cos = Math.cos(-angle); + var sin = Math.sin(-angle); // console.log("base: " + basePoints); + + for (var i = 0; i < transformedPoints.length / 2; i++) { + transformedPoints[i * 2] = width / 2 * (basePoints[i * 2] * cos - basePoints[i * 2 + 1] * sin); + transformedPoints[i * 2 + 1] = height / 2 * (basePoints[i * 2 + 1] * cos + basePoints[i * 2] * sin); + transformedPoints[i * 2] += centerX; + transformedPoints[i * 2 + 1] += centerY; + } + + var points; + + if (padding > 0) { + var expandedLineSet = expandPolygon(transformedPoints, -padding); + points = joinLines(expandedLineSet); + } else { + points = transformedPoints; + } + + return pointInsidePolygonPoints(x, y, points); + }; + var pointInsideRoundPolygon = function pointInsideRoundPolygon(x, y, basePoints, centerX, centerY, width, height) { + var cutPolygonPoints = new Array(basePoints.length); + var halfW = width / 2; + var halfH = height / 2; + var cornerRadius = getRoundPolygonRadius(width, height); + var squaredCornerRadius = cornerRadius * cornerRadius; + + for (var i = 0; i < basePoints.length / 4; i++) { + var sourceUv = void 0, + destUv = void 0; + + if (i === 0) { + sourceUv = basePoints.length - 2; + } else { + sourceUv = i * 4 - 2; + } + + destUv = i * 4 + 2; + var px = centerX + halfW * basePoints[i * 4]; + var py = centerY + halfH * basePoints[i * 4 + 1]; + var cosTheta = -basePoints[sourceUv] * basePoints[destUv] - basePoints[sourceUv + 1] * basePoints[destUv + 1]; + var offset = cornerRadius / Math.tan(Math.acos(cosTheta) / 2); + var cp0x = px - offset * basePoints[sourceUv]; + var cp0y = py - offset * basePoints[sourceUv + 1]; + var cp1x = px + offset * basePoints[destUv]; + var cp1y = py + offset * basePoints[destUv + 1]; + cutPolygonPoints[i * 4] = cp0x; + cutPolygonPoints[i * 4 + 1] = cp0y; + cutPolygonPoints[i * 4 + 2] = cp1x; + cutPolygonPoints[i * 4 + 3] = cp1y; + var orthx = basePoints[sourceUv + 1]; + var orthy = -basePoints[sourceUv]; + var cosAlpha = orthx * basePoints[destUv] + orthy * basePoints[destUv + 1]; + + if (cosAlpha < 0) { + orthx *= -1; + orthy *= -1; + } + + var cx = cp0x + orthx * cornerRadius; + var cy = cp0y + orthy * cornerRadius; + var squaredDistance = Math.pow(cx - x, 2) + Math.pow(cy - y, 2); + + if (squaredDistance <= squaredCornerRadius) { + return true; + } + } + + return pointInsidePolygonPoints(x, y, cutPolygonPoints); + }; + var joinLines = function joinLines(lineSet) { + var vertices = new Array(lineSet.length / 2); + var currentLineStartX, currentLineStartY, currentLineEndX, currentLineEndY; + var nextLineStartX, nextLineStartY, nextLineEndX, nextLineEndY; + + for (var i = 0; i < lineSet.length / 4; i++) { + currentLineStartX = lineSet[i * 4]; + currentLineStartY = lineSet[i * 4 + 1]; + currentLineEndX = lineSet[i * 4 + 2]; + currentLineEndY = lineSet[i * 4 + 3]; + + if (i < lineSet.length / 4 - 1) { + nextLineStartX = lineSet[(i + 1) * 4]; + nextLineStartY = lineSet[(i + 1) * 4 + 1]; + nextLineEndX = lineSet[(i + 1) * 4 + 2]; + nextLineEndY = lineSet[(i + 1) * 4 + 3]; + } else { + nextLineStartX = lineSet[0]; + nextLineStartY = lineSet[1]; + nextLineEndX = lineSet[2]; + nextLineEndY = lineSet[3]; + } + + var intersection = finiteLinesIntersect(currentLineStartX, currentLineStartY, currentLineEndX, currentLineEndY, nextLineStartX, nextLineStartY, nextLineEndX, nextLineEndY, true); + vertices[i * 2] = intersection[0]; + vertices[i * 2 + 1] = intersection[1]; + } + + return vertices; + }; + var expandPolygon = function expandPolygon(points, pad) { + var expandedLineSet = new Array(points.length * 2); + var currentPointX, currentPointY, nextPointX, nextPointY; + + for (var i = 0; i < points.length / 2; i++) { + currentPointX = points[i * 2]; + currentPointY = points[i * 2 + 1]; + + if (i < points.length / 2 - 1) { + nextPointX = points[(i + 1) * 2]; + nextPointY = points[(i + 1) * 2 + 1]; + } else { + nextPointX = points[0]; + nextPointY = points[1]; + } // Current line: [currentPointX, currentPointY] to [nextPointX, nextPointY] + // Assume CCW polygon winding + + + var offsetX = nextPointY - currentPointY; + var offsetY = -(nextPointX - currentPointX); // Normalize + + var offsetLength = Math.sqrt(offsetX * offsetX + offsetY * offsetY); + var normalizedOffsetX = offsetX / offsetLength; + var normalizedOffsetY = offsetY / offsetLength; + expandedLineSet[i * 4] = currentPointX + normalizedOffsetX * pad; + expandedLineSet[i * 4 + 1] = currentPointY + normalizedOffsetY * pad; + expandedLineSet[i * 4 + 2] = nextPointX + normalizedOffsetX * pad; + expandedLineSet[i * 4 + 3] = nextPointY + normalizedOffsetY * pad; + } + + return expandedLineSet; + }; + var intersectLineEllipse = function intersectLineEllipse(x, y, centerX, centerY, ellipseWradius, ellipseHradius) { + var dispX = centerX - x; + var dispY = centerY - y; + dispX /= ellipseWradius; + dispY /= ellipseHradius; + var len = Math.sqrt(dispX * dispX + dispY * dispY); + var newLength = len - 1; + + if (newLength < 0) { + return []; + } + + var lenProportion = newLength / len; + return [(centerX - x) * lenProportion + x, (centerY - y) * lenProportion + y]; + }; + var checkInEllipse = function checkInEllipse(x, y, width, height, centerX, centerY, padding) { + x -= centerX; + y -= centerY; + x /= width / 2 + padding; + y /= height / 2 + padding; + return x * x + y * y <= 1; + }; // Returns intersections of increasing distance from line's start point + + var intersectLineCircle = function intersectLineCircle(x1, y1, x2, y2, centerX, centerY, radius) { + // Calculate d, direction vector of line + var d = [x2 - x1, y2 - y1]; // Direction vector of line + + var f = [x1 - centerX, y1 - centerY]; + var a = d[0] * d[0] + d[1] * d[1]; + var b = 2 * (f[0] * d[0] + f[1] * d[1]); + var c = f[0] * f[0] + f[1] * f[1] - radius * radius; + var discriminant = b * b - 4 * a * c; + + if (discriminant < 0) { + return []; + } + + var t1 = (-b + Math.sqrt(discriminant)) / (2 * a); + var t2 = (-b - Math.sqrt(discriminant)) / (2 * a); + var tMin = Math.min(t1, t2); + var tMax = Math.max(t1, t2); + var inRangeParams = []; + + if (tMin >= 0 && tMin <= 1) { + inRangeParams.push(tMin); + } + + if (tMax >= 0 && tMax <= 1) { + inRangeParams.push(tMax); + } + + if (inRangeParams.length === 0) { + return []; + } + + var nearIntersectionX = inRangeParams[0] * d[0] + x1; + var nearIntersectionY = inRangeParams[0] * d[1] + y1; + + if (inRangeParams.length > 1) { + if (inRangeParams[0] == inRangeParams[1]) { + return [nearIntersectionX, nearIntersectionY]; + } else { + var farIntersectionX = inRangeParams[1] * d[0] + x1; + var farIntersectionY = inRangeParams[1] * d[1] + y1; + return [nearIntersectionX, nearIntersectionY, farIntersectionX, farIntersectionY]; + } + } else { + return [nearIntersectionX, nearIntersectionY]; + } + }; + var midOfThree = function midOfThree(a, b, c) { + if (b <= a && a <= c || c <= a && a <= b) { + return a; + } else if (a <= b && b <= c || c <= b && b <= a) { + return b; + } else { + return c; + } + }; // (x1,y1)=>(x2,y2) intersect with (x3,y3)=>(x4,y4) + + var finiteLinesIntersect = function finiteLinesIntersect(x1, y1, x2, y2, x3, y3, x4, y4, infiniteLines) { + var dx13 = x1 - x3; + var dx21 = x2 - x1; + var dx43 = x4 - x3; + var dy13 = y1 - y3; + var dy21 = y2 - y1; + var dy43 = y4 - y3; + var ua_t = dx43 * dy13 - dy43 * dx13; + var ub_t = dx21 * dy13 - dy21 * dx13; + var u_b = dy43 * dx21 - dx43 * dy21; + + if (u_b !== 0) { + var ua = ua_t / u_b; + var ub = ub_t / u_b; + var flptThreshold = 0.001; + + var _min = 0 - flptThreshold; + + var _max = 1 + flptThreshold; + + if (_min <= ua && ua <= _max && _min <= ub && ub <= _max) { + return [x1 + ua * dx21, y1 + ua * dy21]; + } else { + if (!infiniteLines) { + return []; + } else { + return [x1 + ua * dx21, y1 + ua * dy21]; + } + } + } else { + if (ua_t === 0 || ub_t === 0) { + // Parallel, coincident lines. Check if overlap + // Check endpoint of second line + if (midOfThree(x1, x2, x4) === x4) { + return [x4, y4]; + } // Check start point of second line + + + if (midOfThree(x1, x2, x3) === x3) { + return [x3, y3]; + } // Endpoint of first line + + + if (midOfThree(x3, x4, x2) === x2) { + return [x2, y2]; + } + + return []; + } else { + // Parallel, non-coincident + return []; + } + } + }; // math.polygonIntersectLine( x, y, basePoints, centerX, centerY, width, height, padding ) + // intersect a node polygon (pts transformed) + // + // math.polygonIntersectLine( x, y, basePoints, centerX, centerY ) + // intersect the points (no transform) + + var polygonIntersectLine = function polygonIntersectLine(x, y, basePoints, centerX, centerY, width, height, padding) { + var intersections = []; + var intersection; + var transformedPoints = new Array(basePoints.length); + var doTransform = true; + + if (width == null) { + doTransform = false; + } + + var points; + + if (doTransform) { + for (var i = 0; i < transformedPoints.length / 2; i++) { + transformedPoints[i * 2] = basePoints[i * 2] * width + centerX; + transformedPoints[i * 2 + 1] = basePoints[i * 2 + 1] * height + centerY; + } + + if (padding > 0) { + var expandedLineSet = expandPolygon(transformedPoints, -padding); + points = joinLines(expandedLineSet); + } else { + points = transformedPoints; + } + } else { + points = basePoints; + } + + var currentX, currentY, nextX, nextY; + + for (var _i2 = 0; _i2 < points.length / 2; _i2++) { + currentX = points[_i2 * 2]; + currentY = points[_i2 * 2 + 1]; + + if (_i2 < points.length / 2 - 1) { + nextX = points[(_i2 + 1) * 2]; + nextY = points[(_i2 + 1) * 2 + 1]; + } else { + nextX = points[0]; + nextY = points[1]; + } + + intersection = finiteLinesIntersect(x, y, centerX, centerY, currentX, currentY, nextX, nextY); + + if (intersection.length !== 0) { + intersections.push(intersection[0], intersection[1]); + } + } + + return intersections; + }; + var roundPolygonIntersectLine = function roundPolygonIntersectLine(x, y, basePoints, centerX, centerY, width, height, padding) { + var intersections = []; + var intersection; + var lines = new Array(basePoints.length); + var halfW = width / 2; + var halfH = height / 2; + var cornerRadius = getRoundPolygonRadius(width, height); + + for (var i = 0; i < basePoints.length / 4; i++) { + var sourceUv = void 0, + destUv = void 0; + + if (i === 0) { + sourceUv = basePoints.length - 2; + } else { + sourceUv = i * 4 - 2; + } + + destUv = i * 4 + 2; + var px = centerX + halfW * basePoints[i * 4]; + var py = centerY + halfH * basePoints[i * 4 + 1]; + var cosTheta = -basePoints[sourceUv] * basePoints[destUv] - basePoints[sourceUv + 1] * basePoints[destUv + 1]; + var offset = cornerRadius / Math.tan(Math.acos(cosTheta) / 2); + var cp0x = px - offset * basePoints[sourceUv]; + var cp0y = py - offset * basePoints[sourceUv + 1]; + var cp1x = px + offset * basePoints[destUv]; + var cp1y = py + offset * basePoints[destUv + 1]; + + if (i === 0) { + lines[basePoints.length - 2] = cp0x; + lines[basePoints.length - 1] = cp0y; + } else { + lines[i * 4 - 2] = cp0x; + lines[i * 4 - 1] = cp0y; + } + + lines[i * 4] = cp1x; + lines[i * 4 + 1] = cp1y; + var orthx = basePoints[sourceUv + 1]; + var orthy = -basePoints[sourceUv]; + var cosAlpha = orthx * basePoints[destUv] + orthy * basePoints[destUv + 1]; + + if (cosAlpha < 0) { + orthx *= -1; + orthy *= -1; + } + + var cx = cp0x + orthx * cornerRadius; + var cy = cp0y + orthy * cornerRadius; + intersection = intersectLineCircle(x, y, centerX, centerY, cx, cy, cornerRadius); + + if (intersection.length !== 0) { + intersections.push(intersection[0], intersection[1]); + } + } + + for (var _i3 = 0; _i3 < lines.length / 4; _i3++) { + intersection = finiteLinesIntersect(x, y, centerX, centerY, lines[_i3 * 4], lines[_i3 * 4 + 1], lines[_i3 * 4 + 2], lines[_i3 * 4 + 3], false); + + if (intersection.length !== 0) { + intersections.push(intersection[0], intersection[1]); + } + } + + if (intersections.length > 2) { + var lowestIntersection = [intersections[0], intersections[1]]; + var lowestSquaredDistance = Math.pow(lowestIntersection[0] - x, 2) + Math.pow(lowestIntersection[1] - y, 2); + + for (var _i4 = 1; _i4 < intersections.length / 2; _i4++) { + var squaredDistance = Math.pow(intersections[_i4 * 2] - x, 2) + Math.pow(intersections[_i4 * 2 + 1] - y, 2); + + if (squaredDistance <= lowestSquaredDistance) { + lowestIntersection[0] = intersections[_i4 * 2]; + lowestIntersection[1] = intersections[_i4 * 2 + 1]; + lowestSquaredDistance = squaredDistance; + } + } + + return lowestIntersection; + } + + return intersections; + }; + var shortenIntersection = function shortenIntersection(intersection, offset, amount) { + var disp = [intersection[0] - offset[0], intersection[1] - offset[1]]; + var length = Math.sqrt(disp[0] * disp[0] + disp[1] * disp[1]); + var lenRatio = (length - amount) / length; + + if (lenRatio < 0) { + lenRatio = 0.00001; + } + + return [offset[0] + lenRatio * disp[0], offset[1] + lenRatio * disp[1]]; + }; + var generateUnitNgonPointsFitToSquare = function generateUnitNgonPointsFitToSquare(sides, rotationRadians) { + var points = generateUnitNgonPoints(sides, rotationRadians); + points = fitPolygonToSquare(points); + return points; + }; + var fitPolygonToSquare = function fitPolygonToSquare(points) { + var x, y; + var sides = points.length / 2; + var minX = Infinity, + minY = Infinity, + maxX = -Infinity, + maxY = -Infinity; + + for (var i = 0; i < sides; i++) { + x = points[2 * i]; + y = points[2 * i + 1]; + minX = Math.min(minX, x); + maxX = Math.max(maxX, x); + minY = Math.min(minY, y); + maxY = Math.max(maxY, y); + } // stretch factors + + + var sx = 2 / (maxX - minX); + var sy = 2 / (maxY - minY); + + for (var _i5 = 0; _i5 < sides; _i5++) { + x = points[2 * _i5] = points[2 * _i5] * sx; + y = points[2 * _i5 + 1] = points[2 * _i5 + 1] * sy; + minX = Math.min(minX, x); + maxX = Math.max(maxX, x); + minY = Math.min(minY, y); + maxY = Math.max(maxY, y); + } + + if (minY < -1) { + for (var _i6 = 0; _i6 < sides; _i6++) { + y = points[2 * _i6 + 1] = points[2 * _i6 + 1] + (-1 - minY); + } + } + + return points; + }; + var generateUnitNgonPoints = function generateUnitNgonPoints(sides, rotationRadians) { + var increment = 1.0 / sides * 2 * Math.PI; + var startAngle = sides % 2 === 0 ? Math.PI / 2.0 + increment / 2.0 : Math.PI / 2.0; + startAngle += rotationRadians; + var points = new Array(sides * 2); + var currentAngle; + + for (var i = 0; i < sides; i++) { + currentAngle = i * increment + startAngle; + points[2 * i] = Math.cos(currentAngle); // x + + points[2 * i + 1] = Math.sin(-currentAngle); // y + } + + return points; + }; // Set the default radius, unless half of width or height is smaller than default + + var getRoundRectangleRadius = function getRoundRectangleRadius(width, height) { + return Math.min(width / 4, height / 4, 8); + }; // Set the default radius + + var getRoundPolygonRadius = function getRoundPolygonRadius(width, height) { + return Math.min(width / 10, height / 10, 8); + }; + var getCutRectangleCornerLength = function getCutRectangleCornerLength() { + return 8; + }; + var bezierPtsToQuadCoeff = function bezierPtsToQuadCoeff(p0, p1, p2) { + return [p0 - 2 * p1 + p2, 2 * (p1 - p0), p0]; + }; // get curve width, height, and control point position offsets as a percentage of node height / width + + var getBarrelCurveConstants = function getBarrelCurveConstants(width, height) { + return { + heightOffset: Math.min(15, 0.05 * height), + widthOffset: Math.min(100, 0.25 * width), + ctrlPtOffsetPct: 0.05 + }; + }; + + var pageRankDefaults = defaults$g({ + dampingFactor: 0.8, + precision: 0.000001, + iterations: 200, + weight: function weight(edge) { + return 1; + } + }); + var elesfn$o = { + pageRank: function pageRank(options) { + var _pageRankDefaults = pageRankDefaults(options), + dampingFactor = _pageRankDefaults.dampingFactor, + precision = _pageRankDefaults.precision, + iterations = _pageRankDefaults.iterations, + weight = _pageRankDefaults.weight; + + var cy = this._private.cy; + + var _this$byGroup = this.byGroup(), + nodes = _this$byGroup.nodes, + edges = _this$byGroup.edges; + + var numNodes = nodes.length; + var numNodesSqd = numNodes * numNodes; + var numEdges = edges.length; // Construct transposed adjacency matrix + // First lets have a zeroed matrix of the right size + // We'll also keep track of the sum of each column + + var matrix = new Array(numNodesSqd); + var columnSum = new Array(numNodes); + var additionalProb = (1 - dampingFactor) / numNodes; // Create null matrix + + for (var i = 0; i < numNodes; i++) { + for (var j = 0; j < numNodes; j++) { + var n = i * numNodes + j; + matrix[n] = 0; + } + + columnSum[i] = 0; + } // Now, process edges + + + for (var _i = 0; _i < numEdges; _i++) { + var edge = edges[_i]; + var srcId = edge.data('source'); + var tgtId = edge.data('target'); // Don't include loops in the matrix + + if (srcId === tgtId) { + continue; + } + + var s = nodes.indexOfId(srcId); + var t = nodes.indexOfId(tgtId); + var w = weight(edge); + + var _n = t * numNodes + s; // Update matrix + + + matrix[_n] += w; // Update column sum + + columnSum[s] += w; + } // Add additional probability based on damping factor + // Also, take into account columns that have sum = 0 + + + var p = 1.0 / numNodes + additionalProb; // Shorthand + // Traverse matrix, column by column + + for (var _j = 0; _j < numNodes; _j++) { + if (columnSum[_j] === 0) { + // No 'links' out from node jth, assume equal probability for each possible node + for (var _i2 = 0; _i2 < numNodes; _i2++) { + var _n2 = _i2 * numNodes + _j; + + matrix[_n2] = p; + } + } else { + // Node jth has outgoing link, compute normalized probabilities + for (var _i3 = 0; _i3 < numNodes; _i3++) { + var _n3 = _i3 * numNodes + _j; + + matrix[_n3] = matrix[_n3] / columnSum[_j] + additionalProb; + } + } + } // Compute dominant eigenvector using power method + + + var eigenvector = new Array(numNodes); + var temp = new Array(numNodes); + var previous; // Start with a vector of all 1's + // Also, initialize a null vector which will be used as shorthand + + for (var _i4 = 0; _i4 < numNodes; _i4++) { + eigenvector[_i4] = 1; + } + + for (var iter = 0; iter < iterations; iter++) { + // Temp array with all 0's + for (var _i5 = 0; _i5 < numNodes; _i5++) { + temp[_i5] = 0; + } // Multiply matrix with previous result + + + for (var _i6 = 0; _i6 < numNodes; _i6++) { + for (var _j2 = 0; _j2 < numNodes; _j2++) { + var _n4 = _i6 * numNodes + _j2; + + temp[_i6] += matrix[_n4] * eigenvector[_j2]; + } + } + + inPlaceSumNormalize(temp); + previous = eigenvector; + eigenvector = temp; + temp = previous; + var diff = 0; // Compute difference (squared module) of both vectors + + for (var _i7 = 0; _i7 < numNodes; _i7++) { + var delta = previous[_i7] - eigenvector[_i7]; + diff += delta * delta; + } // If difference is less than the desired threshold, stop iterating + + + if (diff < precision) { + break; + } + } // Construct result + + + var res = { + rank: function rank(node) { + node = cy.collection(node)[0]; + return eigenvector[nodes.indexOf(node)]; + } + }; + return res; + } // pageRank + + }; // elesfn + + var defaults$f = defaults$g({ + root: null, + weight: function weight(edge) { + return 1; + }, + directed: false, + alpha: 0 + }); + var elesfn$n = { + degreeCentralityNormalized: function degreeCentralityNormalized(options) { + options = defaults$f(options); + var cy = this.cy(); + var nodes = this.nodes(); + var numNodes = nodes.length; + + if (!options.directed) { + var degrees = {}; + var maxDegree = 0; + + for (var i = 0; i < numNodes; i++) { + var node = nodes[i]; // add current node to the current options object and call degreeCentrality + + options.root = node; + var currDegree = this.degreeCentrality(options); + + if (maxDegree < currDegree.degree) { + maxDegree = currDegree.degree; + } + + degrees[node.id()] = currDegree.degree; + } + + return { + degree: function degree(node) { + if (maxDegree === 0) { + return 0; + } + + if (string(node)) { + // from is a selector string + node = cy.filter(node); + } + + return degrees[node.id()] / maxDegree; + } + }; + } else { + var indegrees = {}; + var outdegrees = {}; + var maxIndegree = 0; + var maxOutdegree = 0; + + for (var _i = 0; _i < numNodes; _i++) { + var _node = nodes[_i]; + + var id = _node.id(); // add current node to the current options object and call degreeCentrality + + + options.root = _node; + + var _currDegree = this.degreeCentrality(options); + + if (maxIndegree < _currDegree.indegree) maxIndegree = _currDegree.indegree; + if (maxOutdegree < _currDegree.outdegree) maxOutdegree = _currDegree.outdegree; + indegrees[id] = _currDegree.indegree; + outdegrees[id] = _currDegree.outdegree; + } + + return { + indegree: function indegree(node) { + if (maxIndegree == 0) { + return 0; + } + + if (string(node)) { + // from is a selector string + node = cy.filter(node); + } + + return indegrees[node.id()] / maxIndegree; + }, + outdegree: function outdegree(node) { + if (maxOutdegree === 0) { + return 0; + } + + if (string(node)) { + // from is a selector string + node = cy.filter(node); + } + + return outdegrees[node.id()] / maxOutdegree; + } + }; + } + }, + // degreeCentralityNormalized + // Implemented from the algorithm in Opsahl's paper + // "Node centrality in weighted networks: Generalizing degree and shortest paths" + // check the heading 2 "Degree" + degreeCentrality: function degreeCentrality(options) { + options = defaults$f(options); + var cy = this.cy(); + var callingEles = this; + var _options = options, + root = _options.root, + weight = _options.weight, + directed = _options.directed, + alpha = _options.alpha; + root = cy.collection(root)[0]; + + if (!directed) { + var connEdges = root.connectedEdges().intersection(callingEles); + var k = connEdges.length; + var s = 0; // Now, sum edge weights + + for (var i = 0; i < connEdges.length; i++) { + s += weight(connEdges[i]); + } + + return { + degree: Math.pow(k, 1 - alpha) * Math.pow(s, alpha) + }; + } else { + var edges = root.connectedEdges(); + var incoming = edges.filter(function (edge) { + return edge.target().same(root) && callingEles.has(edge); + }); + var outgoing = edges.filter(function (edge) { + return edge.source().same(root) && callingEles.has(edge); + }); + var k_in = incoming.length; + var k_out = outgoing.length; + var s_in = 0; + var s_out = 0; // Now, sum incoming edge weights + + for (var _i2 = 0; _i2 < incoming.length; _i2++) { + s_in += weight(incoming[_i2]); + } // Now, sum outgoing edge weights + + + for (var _i3 = 0; _i3 < outgoing.length; _i3++) { + s_out += weight(outgoing[_i3]); + } + + return { + indegree: Math.pow(k_in, 1 - alpha) * Math.pow(s_in, alpha), + outdegree: Math.pow(k_out, 1 - alpha) * Math.pow(s_out, alpha) + }; + } + } // degreeCentrality + + }; // elesfn + // nice, short mathematical alias + + elesfn$n.dc = elesfn$n.degreeCentrality; + elesfn$n.dcn = elesfn$n.degreeCentralityNormalised = elesfn$n.degreeCentralityNormalized; + + var defaults$e = defaults$g({ + harmonic: true, + weight: function weight() { + return 1; + }, + directed: false, + root: null + }); + var elesfn$m = { + closenessCentralityNormalized: function closenessCentralityNormalized(options) { + var _defaults = defaults$e(options), + harmonic = _defaults.harmonic, + weight = _defaults.weight, + directed = _defaults.directed; + + var cy = this.cy(); + var closenesses = {}; + var maxCloseness = 0; + var nodes = this.nodes(); + var fw = this.floydWarshall({ + weight: weight, + directed: directed + }); // Compute closeness for every node and find the maximum closeness + + for (var i = 0; i < nodes.length; i++) { + var currCloseness = 0; + var node_i = nodes[i]; + + for (var j = 0; j < nodes.length; j++) { + if (i !== j) { + var d = fw.distance(node_i, nodes[j]); + + if (harmonic) { + currCloseness += 1 / d; + } else { + currCloseness += d; + } + } + } + + if (!harmonic) { + currCloseness = 1 / currCloseness; + } + + if (maxCloseness < currCloseness) { + maxCloseness = currCloseness; + } + + closenesses[node_i.id()] = currCloseness; + } + + return { + closeness: function closeness(node) { + if (maxCloseness == 0) { + return 0; + } + + if (string(node)) { + // from is a selector string + node = cy.filter(node)[0].id(); + } else { + // from is a node + node = node.id(); + } + + return closenesses[node] / maxCloseness; + } + }; + }, + // Implemented from pseudocode from wikipedia + closenessCentrality: function closenessCentrality(options) { + var _defaults2 = defaults$e(options), + root = _defaults2.root, + weight = _defaults2.weight, + directed = _defaults2.directed, + harmonic = _defaults2.harmonic; + + root = this.filter(root)[0]; // we need distance from this node to every other node + + var dijkstra = this.dijkstra({ + root: root, + weight: weight, + directed: directed + }); + var totalDistance = 0; + var nodes = this.nodes(); + + for (var i = 0; i < nodes.length; i++) { + var n = nodes[i]; + + if (!n.same(root)) { + var d = dijkstra.distanceTo(n); + + if (harmonic) { + totalDistance += 1 / d; + } else { + totalDistance += d; + } + } + } + + return harmonic ? totalDistance : 1 / totalDistance; + } // closenessCentrality + + }; // elesfn + // nice, short mathematical alias + + elesfn$m.cc = elesfn$m.closenessCentrality; + elesfn$m.ccn = elesfn$m.closenessCentralityNormalised = elesfn$m.closenessCentralityNormalized; + + var defaults$d = defaults$g({ + weight: null, + directed: false + }); + var elesfn$l = { + // Implemented from the algorithm in the paper "On Variants of Shortest-Path Betweenness Centrality and their Generic Computation" by Ulrik Brandes + betweennessCentrality: function betweennessCentrality(options) { + var _defaults = defaults$d(options), + directed = _defaults.directed, + weight = _defaults.weight; + + var weighted = weight != null; + var cy = this.cy(); // starting + + var V = this.nodes(); + var A = {}; + var _C = {}; + var max = 0; + var C = { + set: function set(key, val) { + _C[key] = val; + + if (val > max) { + max = val; + } + }, + get: function get(key) { + return _C[key]; + } + }; // A contains the neighborhoods of every node + + for (var i = 0; i < V.length; i++) { + var v = V[i]; + var vid = v.id(); + + if (directed) { + A[vid] = v.outgoers().nodes(); // get outgoers of every node + } else { + A[vid] = v.openNeighborhood().nodes(); // get neighbors of every node + } + + C.set(vid, 0); + } + + var _loop = function _loop(s) { + var sid = V[s].id(); + var S = []; // stack + + var P = {}; + var g = {}; + var d = {}; + var Q = new heap(function (a, b) { + return d[a] - d[b]; + }); // queue + // init dictionaries + + for (var _i = 0; _i < V.length; _i++) { + var _vid = V[_i].id(); + + P[_vid] = []; + g[_vid] = 0; + d[_vid] = Infinity; + } + + g[sid] = 1; // sigma + + d[sid] = 0; // distance to s + + Q.push(sid); + + while (!Q.empty()) { + var _v = Q.pop(); + + S.push(_v); + + if (weighted) { + for (var j = 0; j < A[_v].length; j++) { + var w = A[_v][j]; + var vEle = cy.getElementById(_v); + var edge = void 0; + + if (vEle.edgesTo(w).length > 0) { + edge = vEle.edgesTo(w)[0]; + } else { + edge = w.edgesTo(vEle)[0]; + } + + var edgeWeight = weight(edge); + w = w.id(); + + if (d[w] > d[_v] + edgeWeight) { + d[w] = d[_v] + edgeWeight; + + if (Q.nodes.indexOf(w) < 0) { + //if w is not in Q + Q.push(w); + } else { + // update position if w is in Q + Q.updateItem(w); + } + + g[w] = 0; + P[w] = []; + } + + if (d[w] == d[_v] + edgeWeight) { + g[w] = g[w] + g[_v]; + P[w].push(_v); + } + } + } else { + for (var _j = 0; _j < A[_v].length; _j++) { + var _w = A[_v][_j].id(); + + if (d[_w] == Infinity) { + Q.push(_w); + d[_w] = d[_v] + 1; + } + + if (d[_w] == d[_v] + 1) { + g[_w] = g[_w] + g[_v]; + + P[_w].push(_v); + } + } + } + } + + var e = {}; + + for (var _i2 = 0; _i2 < V.length; _i2++) { + e[V[_i2].id()] = 0; + } + + while (S.length > 0) { + var _w2 = S.pop(); + + for (var _j2 = 0; _j2 < P[_w2].length; _j2++) { + var _v2 = P[_w2][_j2]; + e[_v2] = e[_v2] + g[_v2] / g[_w2] * (1 + e[_w2]); + } + + if (_w2 != V[s].id()) { + C.set(_w2, C.get(_w2) + e[_w2]); + } + } + }; + + for (var s = 0; s < V.length; s++) { + _loop(s); + } + + var ret = { + betweenness: function betweenness(node) { + var id = cy.collection(node).id(); + return C.get(id); + }, + betweennessNormalized: function betweennessNormalized(node) { + if (max == 0) { + return 0; + } + + var id = cy.collection(node).id(); + return C.get(id) / max; + } + }; // alias + + ret.betweennessNormalised = ret.betweennessNormalized; + return ret; + } // betweennessCentrality + + }; // elesfn + // nice, short mathematical alias + + elesfn$l.bc = elesfn$l.betweennessCentrality; + + // Implemented by Zoe Xi @zoexi for GSOC 2016 + /* eslint-disable no-unused-vars */ + + var defaults$c = defaults$g({ + expandFactor: 2, + // affects time of computation and cluster granularity to some extent: M * M + inflateFactor: 2, + // affects cluster granularity (the greater the value, the more clusters): M(i,j) / E(j) + multFactor: 1, + // optional self loops for each node. Use a neutral value to improve cluster computations. + maxIterations: 20, + // maximum number of iterations of the MCL algorithm in a single run + attributes: [// attributes/features used to group nodes, ie. similarity values between nodes + function (edge) { + return 1; + }] + }); + /* eslint-enable */ + + var setOptions$3 = function setOptions(options) { + return defaults$c(options); + }; + /* eslint-enable */ + + + var getSimilarity$1 = function getSimilarity(edge, attributes) { + var total = 0; + + for (var i = 0; i < attributes.length; i++) { + total += attributes[i](edge); + } + + return total; + }; + + var addLoops = function addLoops(M, n, val) { + for (var i = 0; i < n; i++) { + M[i * n + i] = val; + } + }; + + var normalize = function normalize(M, n) { + var sum; + + for (var col = 0; col < n; col++) { + sum = 0; + + for (var row = 0; row < n; row++) { + sum += M[row * n + col]; + } + + for (var _row = 0; _row < n; _row++) { + M[_row * n + col] = M[_row * n + col] / sum; + } + } + }; // TODO: blocked matrix multiplication? + + + var mmult = function mmult(A, B, n) { + var C = new Array(n * n); + + for (var i = 0; i < n; i++) { + for (var j = 0; j < n; j++) { + C[i * n + j] = 0; + } + + for (var k = 0; k < n; k++) { + for (var _j = 0; _j < n; _j++) { + C[i * n + _j] += A[i * n + k] * B[k * n + _j]; + } + } + } + + return C; + }; + + var expand = function expand(M, n, expandFactor + /** power **/ + ) { + var _M = M.slice(0); + + for (var p = 1; p < expandFactor; p++) { + M = mmult(M, _M, n); + } + + return M; + }; + + var inflate = function inflate(M, n, inflateFactor + /** r **/ + ) { + var _M = new Array(n * n); // M(i,j) ^ inflatePower + + + for (var i = 0; i < n * n; i++) { + _M[i] = Math.pow(M[i], inflateFactor); + } + + normalize(_M, n); + return _M; + }; + + var hasConverged = function hasConverged(M, _M, n2, roundFactor) { + // Check that both matrices have the same elements (i,j) + for (var i = 0; i < n2; i++) { + var v1 = Math.round(M[i] * Math.pow(10, roundFactor)) / Math.pow(10, roundFactor); // truncate to 'roundFactor' decimal places + + var v2 = Math.round(_M[i] * Math.pow(10, roundFactor)) / Math.pow(10, roundFactor); + + if (v1 !== v2) { + return false; + } + } + + return true; + }; + + var assign$2 = function assign(M, n, nodes, cy) { + var clusters = []; + + for (var i = 0; i < n; i++) { + var cluster = []; + + for (var j = 0; j < n; j++) { + // Row-wise attractors and elements that they attract belong in same cluster + if (Math.round(M[i * n + j] * 1000) / 1000 > 0) { + cluster.push(nodes[j]); + } + } + + if (cluster.length !== 0) { + clusters.push(cy.collection(cluster)); + } + } + + return clusters; + }; + + var isDuplicate = function isDuplicate(c1, c2) { + for (var i = 0; i < c1.length; i++) { + if (!c2[i] || c1[i].id() !== c2[i].id()) { + return false; + } + } + + return true; + }; + + var removeDuplicates = function removeDuplicates(clusters) { + for (var i = 0; i < clusters.length; i++) { + for (var j = 0; j < clusters.length; j++) { + if (i != j && isDuplicate(clusters[i], clusters[j])) { + clusters.splice(j, 1); + } + } + } + + return clusters; + }; + + var markovClustering = function markovClustering(options) { + var nodes = this.nodes(); + var edges = this.edges(); + var cy = this.cy(); // Set parameters of algorithm: + + var opts = setOptions$3(options); // Map each node to its position in node array + + var id2position = {}; + + for (var i = 0; i < nodes.length; i++) { + id2position[nodes[i].id()] = i; + } // Generate stochastic matrix M from input graph G (should be symmetric/undirected) + + + var n = nodes.length, + n2 = n * n; + + var M = new Array(n2), + _M; + + for (var _i = 0; _i < n2; _i++) { + M[_i] = 0; + } + + for (var e = 0; e < edges.length; e++) { + var edge = edges[e]; + var _i2 = id2position[edge.source().id()]; + var j = id2position[edge.target().id()]; + var sim = getSimilarity$1(edge, opts.attributes); + M[_i2 * n + j] += sim; // G should be symmetric and undirected + + M[j * n + _i2] += sim; + } // Begin Markov cluster algorithm + // Step 1: Add self loops to each node, ie. add multFactor to matrix diagonal + + + addLoops(M, n, opts.multFactor); // Step 2: M = normalize( M ); + + normalize(M, n); + var isStillMoving = true; + var iterations = 0; + + while (isStillMoving && iterations < opts.maxIterations) { + isStillMoving = false; // Step 3: + + _M = expand(M, n, opts.expandFactor); // Step 4: + + M = inflate(_M, n, opts.inflateFactor); // Step 5: check to see if ~steady state has been reached + + if (!hasConverged(M, _M, n2, 4)) { + isStillMoving = true; + } + + iterations++; + } // Build clusters from matrix + + + var clusters = assign$2(M, n, nodes, cy); // Remove duplicate clusters due to symmetry of graph and M matrix + + clusters = removeDuplicates(clusters); + return clusters; + }; + + var markovClustering$1 = { + markovClustering: markovClustering, + mcl: markovClustering + }; + + // Common distance metrics for clustering algorithms + + var identity = function identity(x) { + return x; + }; + + var absDiff = function absDiff(p, q) { + return Math.abs(q - p); + }; + + var addAbsDiff = function addAbsDiff(total, p, q) { + return total + absDiff(p, q); + }; + + var addSquaredDiff = function addSquaredDiff(total, p, q) { + return total + Math.pow(q - p, 2); + }; + + var sqrt = function sqrt(x) { + return Math.sqrt(x); + }; + + var maxAbsDiff = function maxAbsDiff(currentMax, p, q) { + return Math.max(currentMax, absDiff(p, q)); + }; + + var getDistance = function getDistance(length, getP, getQ, init, visit) { + var post = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : identity; + var ret = init; + var p, q; + + for (var dim = 0; dim < length; dim++) { + p = getP(dim); + q = getQ(dim); + ret = visit(ret, p, q); + } + + return post(ret); + }; + + var distances = { + euclidean: function euclidean(length, getP, getQ) { + if (length >= 2) { + return getDistance(length, getP, getQ, 0, addSquaredDiff, sqrt); + } else { + // for single attr case, more efficient to avoid sqrt + return getDistance(length, getP, getQ, 0, addAbsDiff); + } + }, + squaredEuclidean: function squaredEuclidean(length, getP, getQ) { + return getDistance(length, getP, getQ, 0, addSquaredDiff); + }, + manhattan: function manhattan(length, getP, getQ) { + return getDistance(length, getP, getQ, 0, addAbsDiff); + }, + max: function max(length, getP, getQ) { + return getDistance(length, getP, getQ, -Infinity, maxAbsDiff); + } + }; // in case the user accidentally doesn't use camel case + + distances['squared-euclidean'] = distances['squaredEuclidean']; + distances['squaredeuclidean'] = distances['squaredEuclidean']; + function clusteringDistance (method, length, getP, getQ, nodeP, nodeQ) { + var impl; + + if (fn$6(method)) { + impl = method; + } else { + impl = distances[method] || distances.euclidean; + } + + if (length === 0 && fn$6(method)) { + return impl(nodeP, nodeQ); + } else { + return impl(length, getP, getQ, nodeP, nodeQ); + } + } + + var defaults$b = defaults$g({ + k: 2, + m: 2, + sensitivityThreshold: 0.0001, + distance: 'euclidean', + maxIterations: 10, + attributes: [], + testMode: false, + testCentroids: null + }); + + var setOptions$2 = function setOptions(options) { + return defaults$b(options); + }; + /* eslint-enable */ + + + var getDist = function getDist(type, node, centroid, attributes, mode) { + var noNodeP = mode !== 'kMedoids'; + var getP = noNodeP ? function (i) { + return centroid[i]; + } : function (i) { + return attributes[i](centroid); + }; + + var getQ = function getQ(i) { + return attributes[i](node); + }; + + var nodeP = centroid; + var nodeQ = node; + return clusteringDistance(type, attributes.length, getP, getQ, nodeP, nodeQ); + }; + + var randomCentroids = function randomCentroids(nodes, k, attributes) { + var ndim = attributes.length; + var min = new Array(ndim); + var max = new Array(ndim); + var centroids = new Array(k); + var centroid = null; // Find min, max values for each attribute dimension + + for (var i = 0; i < ndim; i++) { + min[i] = nodes.min(attributes[i]).value; + max[i] = nodes.max(attributes[i]).value; + } // Build k centroids, each represented as an n-dim feature vector + + + for (var c = 0; c < k; c++) { + centroid = []; + + for (var _i = 0; _i < ndim; _i++) { + centroid[_i] = Math.random() * (max[_i] - min[_i]) + min[_i]; // random initial value + } + + centroids[c] = centroid; + } + + return centroids; + }; + + var classify = function classify(node, centroids, distance, attributes, type) { + var min = Infinity; + var index = 0; + + for (var i = 0; i < centroids.length; i++) { + var dist = getDist(distance, node, centroids[i], attributes, type); + + if (dist < min) { + min = dist; + index = i; + } + } + + return index; + }; + + var buildCluster = function buildCluster(centroid, nodes, assignment) { + var cluster = []; + var node = null; + + for (var n = 0; n < nodes.length; n++) { + node = nodes[n]; + + if (assignment[node.id()] === centroid) { + //console.log("Node " + node.id() + " is associated with medoid #: " + m); + cluster.push(node); + } + } + + return cluster; + }; + + var haveValuesConverged = function haveValuesConverged(v1, v2, sensitivityThreshold) { + return Math.abs(v2 - v1) <= sensitivityThreshold; + }; + + var haveMatricesConverged = function haveMatricesConverged(v1, v2, sensitivityThreshold) { + for (var i = 0; i < v1.length; i++) { + for (var j = 0; j < v1[i].length; j++) { + var diff = Math.abs(v1[i][j] - v2[i][j]); + + if (diff > sensitivityThreshold) { + return false; + } + } + } + + return true; + }; + + var seenBefore = function seenBefore(node, medoids, n) { + for (var i = 0; i < n; i++) { + if (node === medoids[i]) return true; + } + + return false; + }; + + var randomMedoids = function randomMedoids(nodes, k) { + var medoids = new Array(k); // For small data sets, the probability of medoid conflict is greater, + // so we need to check to see if we've already seen or chose this node before. + + if (nodes.length < 50) { + // Randomly select k medoids from the n nodes + for (var i = 0; i < k; i++) { + var node = nodes[Math.floor(Math.random() * nodes.length)]; // If we've already chosen this node to be a medoid, don't choose it again (for small data sets). + // Instead choose a different random node. + + while (seenBefore(node, medoids, i)) { + node = nodes[Math.floor(Math.random() * nodes.length)]; + } + + medoids[i] = node; + } + } else { + // Relatively large data set, so pretty safe to not check and just select random nodes + for (var _i2 = 0; _i2 < k; _i2++) { + medoids[_i2] = nodes[Math.floor(Math.random() * nodes.length)]; + } + } + + return medoids; + }; + + var findCost = function findCost(potentialNewMedoid, cluster, attributes) { + var cost = 0; + + for (var n = 0; n < cluster.length; n++) { + cost += getDist('manhattan', cluster[n], potentialNewMedoid, attributes, 'kMedoids'); + } + + return cost; + }; + + var kMeans = function kMeans(options) { + var cy = this.cy(); + var nodes = this.nodes(); + var node = null; // Set parameters of algorithm: # of clusters, distance metric, etc. + + var opts = setOptions$2(options); // Begin k-means algorithm + + var clusters = new Array(opts.k); + var assignment = {}; + var centroids; // Step 1: Initialize centroid positions + + if (opts.testMode) { + if (typeof opts.testCentroids === 'number') { + // TODO: implement a seeded random number generator. + opts.testCentroids; + centroids = randomCentroids(nodes, opts.k, opts.attributes); + } else if (_typeof(opts.testCentroids) === 'object') { + centroids = opts.testCentroids; + } else { + centroids = randomCentroids(nodes, opts.k, opts.attributes); + } + } else { + centroids = randomCentroids(nodes, opts.k, opts.attributes); + } + + var isStillMoving = true; + var iterations = 0; + + while (isStillMoving && iterations < opts.maxIterations) { + // Step 2: Assign nodes to the nearest centroid + for (var n = 0; n < nodes.length; n++) { + node = nodes[n]; // Determine which cluster this node belongs to: node id => cluster # + + assignment[node.id()] = classify(node, centroids, opts.distance, opts.attributes, 'kMeans'); + } // Step 3: For each of the k clusters, update its centroid + + + isStillMoving = false; + + for (var c = 0; c < opts.k; c++) { + // Get all nodes that belong to this cluster + var cluster = buildCluster(c, nodes, assignment); + + if (cluster.length === 0) { + // If cluster is empty, break out early & move to next cluster + continue; + } // Update centroids by calculating avg of all nodes within the cluster. + + + var ndim = opts.attributes.length; + var centroid = centroids[c]; // [ dim_1, dim_2, dim_3, ... , dim_n ] + + var newCentroid = new Array(ndim); + var sum = new Array(ndim); + + for (var d = 0; d < ndim; d++) { + sum[d] = 0.0; + + for (var i = 0; i < cluster.length; i++) { + node = cluster[i]; + sum[d] += opts.attributes[d](node); + } + + newCentroid[d] = sum[d] / cluster.length; // Check to see if algorithm has converged, i.e. when centroids no longer change + + if (!haveValuesConverged(newCentroid[d], centroid[d], opts.sensitivityThreshold)) { + isStillMoving = true; + } + } + + centroids[c] = newCentroid; + clusters[c] = cy.collection(cluster); + } + + iterations++; + } + + return clusters; + }; + + var kMedoids = function kMedoids(options) { + var cy = this.cy(); + var nodes = this.nodes(); + var node = null; + var opts = setOptions$2(options); // Begin k-medoids algorithm + + var clusters = new Array(opts.k); + var medoids; + var assignment = {}; + var curCost; + var minCosts = new Array(opts.k); // minimum cost configuration for each cluster + // Step 1: Initialize k medoids + + if (opts.testMode) { + if (typeof opts.testCentroids === 'number') ; else if (_typeof(opts.testCentroids) === 'object') { + medoids = opts.testCentroids; + } else { + medoids = randomMedoids(nodes, opts.k); + } + } else { + medoids = randomMedoids(nodes, opts.k); + } + + var isStillMoving = true; + var iterations = 0; + + while (isStillMoving && iterations < opts.maxIterations) { + // Step 2: Assign nodes to the nearest medoid + for (var n = 0; n < nodes.length; n++) { + node = nodes[n]; // Determine which cluster this node belongs to: node id => cluster # + + assignment[node.id()] = classify(node, medoids, opts.distance, opts.attributes, 'kMedoids'); + } + + isStillMoving = false; // Step 3: For each medoid m, and for each node associated with mediod m, + // select the node with the lowest configuration cost as new medoid. + + for (var m = 0; m < medoids.length; m++) { + // Get all nodes that belong to this medoid + var cluster = buildCluster(m, nodes, assignment); + + if (cluster.length === 0) { + // If cluster is empty, break out early & move to next cluster + continue; + } + + minCosts[m] = findCost(medoids[m], cluster, opts.attributes); // original cost + // Select different medoid if its configuration has the lowest cost + + for (var _n = 0; _n < cluster.length; _n++) { + curCost = findCost(cluster[_n], cluster, opts.attributes); + + if (curCost < minCosts[m]) { + minCosts[m] = curCost; + medoids[m] = cluster[_n]; + isStillMoving = true; + } + } + + clusters[m] = cy.collection(cluster); + } + + iterations++; + } + + return clusters; + }; + + var updateCentroids = function updateCentroids(centroids, nodes, U, weight, opts) { + var numerator, denominator; + + for (var n = 0; n < nodes.length; n++) { + for (var c = 0; c < centroids.length; c++) { + weight[n][c] = Math.pow(U[n][c], opts.m); + } + } + + for (var _c = 0; _c < centroids.length; _c++) { + for (var dim = 0; dim < opts.attributes.length; dim++) { + numerator = 0; + denominator = 0; + + for (var _n2 = 0; _n2 < nodes.length; _n2++) { + numerator += weight[_n2][_c] * opts.attributes[dim](nodes[_n2]); + denominator += weight[_n2][_c]; + } + + centroids[_c][dim] = numerator / denominator; + } + } + }; + + var updateMembership = function updateMembership(U, _U, centroids, nodes, opts) { + // Save previous step + for (var i = 0; i < U.length; i++) { + _U[i] = U[i].slice(); + } + + var sum, numerator, denominator; + var pow = 2 / (opts.m - 1); + + for (var c = 0; c < centroids.length; c++) { + for (var n = 0; n < nodes.length; n++) { + sum = 0; + + for (var k = 0; k < centroids.length; k++) { + // against all other centroids + numerator = getDist(opts.distance, nodes[n], centroids[c], opts.attributes, 'cmeans'); + denominator = getDist(opts.distance, nodes[n], centroids[k], opts.attributes, 'cmeans'); + sum += Math.pow(numerator / denominator, pow); + } + + U[n][c] = 1 / sum; + } + } + }; + + var assign$1 = function assign(nodes, U, opts, cy) { + var clusters = new Array(opts.k); + + for (var c = 0; c < clusters.length; c++) { + clusters[c] = []; + } + + var max; + var index; + + for (var n = 0; n < U.length; n++) { + // for each node (U is N x C matrix) + max = -Infinity; + index = -1; // Determine which cluster the node is most likely to belong in + + for (var _c2 = 0; _c2 < U[0].length; _c2++) { + if (U[n][_c2] > max) { + max = U[n][_c2]; + index = _c2; + } + } + + clusters[index].push(nodes[n]); + } // Turn every array into a collection of nodes + + + for (var _c3 = 0; _c3 < clusters.length; _c3++) { + clusters[_c3] = cy.collection(clusters[_c3]); + } + + return clusters; + }; + + var fuzzyCMeans = function fuzzyCMeans(options) { + var cy = this.cy(); + var nodes = this.nodes(); + var opts = setOptions$2(options); // Begin fuzzy c-means algorithm + + var clusters; + var centroids; + var U; + + var _U; + + var weight; // Step 1: Initialize letiables. + + _U = new Array(nodes.length); + + for (var i = 0; i < nodes.length; i++) { + // N x C matrix + _U[i] = new Array(opts.k); + } + + U = new Array(nodes.length); + + for (var _i3 = 0; _i3 < nodes.length; _i3++) { + // N x C matrix + U[_i3] = new Array(opts.k); + } + + for (var _i4 = 0; _i4 < nodes.length; _i4++) { + var total = 0; + + for (var j = 0; j < opts.k; j++) { + U[_i4][j] = Math.random(); + total += U[_i4][j]; + } + + for (var _j = 0; _j < opts.k; _j++) { + U[_i4][_j] = U[_i4][_j] / total; + } + } + + centroids = new Array(opts.k); + + for (var _i5 = 0; _i5 < opts.k; _i5++) { + centroids[_i5] = new Array(opts.attributes.length); + } + + weight = new Array(nodes.length); + + for (var _i6 = 0; _i6 < nodes.length; _i6++) { + // N x C matrix + weight[_i6] = new Array(opts.k); + } // end init FCM + + + var isStillMoving = true; + var iterations = 0; + + while (isStillMoving && iterations < opts.maxIterations) { + isStillMoving = false; // Step 2: Calculate the centroids for each step. + + updateCentroids(centroids, nodes, U, weight, opts); // Step 3: Update the partition matrix U. + + updateMembership(U, _U, centroids, nodes, opts); // Step 4: Check for convergence. + + if (!haveMatricesConverged(U, _U, opts.sensitivityThreshold)) { + isStillMoving = true; + } + + iterations++; + } // Assign nodes to clusters with highest probability. + + + clusters = assign$1(nodes, U, opts, cy); + return { + clusters: clusters, + degreeOfMembership: U + }; + }; + + var kClustering = { + kMeans: kMeans, + kMedoids: kMedoids, + fuzzyCMeans: fuzzyCMeans, + fcm: fuzzyCMeans + }; + + // Implemented by Zoe Xi @zoexi for GSOC 2016 + var defaults$a = defaults$g({ + distance: 'euclidean', + // distance metric to compare nodes + linkage: 'min', + // linkage criterion : how to determine the distance between clusters of nodes + mode: 'threshold', + // mode:'threshold' => clusters must be threshold distance apart + threshold: Infinity, + // the distance threshold + // mode:'dendrogram' => the nodes are organised as leaves in a tree (siblings are close), merging makes clusters + addDendrogram: false, + // whether to add the dendrogram to the graph for viz + dendrogramDepth: 0, + // depth at which dendrogram branches are merged into the returned clusters + attributes: [] // array of attr functions + + }); + var linkageAliases = { + 'single': 'min', + 'complete': 'max' + }; + + var setOptions$1 = function setOptions(options) { + var opts = defaults$a(options); + var preferredAlias = linkageAliases[opts.linkage]; + + if (preferredAlias != null) { + opts.linkage = preferredAlias; + } + + return opts; + }; + + var mergeClosest = function mergeClosest(clusters, index, dists, mins, opts) { + // Find two closest clusters from cached mins + var minKey = 0; + var min = Infinity; + var dist; + var attrs = opts.attributes; + + var getDist = function getDist(n1, n2) { + return clusteringDistance(opts.distance, attrs.length, function (i) { + return attrs[i](n1); + }, function (i) { + return attrs[i](n2); + }, n1, n2); + }; + + for (var i = 0; i < clusters.length; i++) { + var key = clusters[i].key; + var _dist = dists[key][mins[key]]; + + if (_dist < min) { + minKey = key; + min = _dist; + } + } + + if (opts.mode === 'threshold' && min >= opts.threshold || opts.mode === 'dendrogram' && clusters.length === 1) { + return false; + } + + var c1 = index[minKey]; + var c2 = index[mins[minKey]]; + var merged; // Merge two closest clusters + + if (opts.mode === 'dendrogram') { + merged = { + left: c1, + right: c2, + key: c1.key + }; + } else { + merged = { + value: c1.value.concat(c2.value), + key: c1.key + }; + } + + clusters[c1.index] = merged; + clusters.splice(c2.index, 1); + index[c1.key] = merged; // Update distances with new merged cluster + + for (var _i = 0; _i < clusters.length; _i++) { + var cur = clusters[_i]; + + if (c1.key === cur.key) { + dist = Infinity; + } else if (opts.linkage === 'min') { + dist = dists[c1.key][cur.key]; + + if (dists[c1.key][cur.key] > dists[c2.key][cur.key]) { + dist = dists[c2.key][cur.key]; + } + } else if (opts.linkage === 'max') { + dist = dists[c1.key][cur.key]; + + if (dists[c1.key][cur.key] < dists[c2.key][cur.key]) { + dist = dists[c2.key][cur.key]; + } + } else if (opts.linkage === 'mean') { + dist = (dists[c1.key][cur.key] * c1.size + dists[c2.key][cur.key] * c2.size) / (c1.size + c2.size); + } else { + if (opts.mode === 'dendrogram') dist = getDist(cur.value, c1.value);else dist = getDist(cur.value[0], c1.value[0]); + } + + dists[c1.key][cur.key] = dists[cur.key][c1.key] = dist; // distance matrix is symmetric + } // Update cached mins + + + for (var _i2 = 0; _i2 < clusters.length; _i2++) { + var key1 = clusters[_i2].key; + + if (mins[key1] === c1.key || mins[key1] === c2.key) { + var _min = key1; + + for (var j = 0; j < clusters.length; j++) { + var key2 = clusters[j].key; + + if (dists[key1][key2] < dists[key1][_min]) { + _min = key2; + } + } + + mins[key1] = _min; + } + + clusters[_i2].index = _i2; + } // Clean up meta data used for clustering + + + c1.key = c2.key = c1.index = c2.index = null; + return true; + }; + + var getAllChildren = function getAllChildren(root, arr, cy) { + if (!root) return; + + if (root.value) { + arr.push(root.value); + } else { + if (root.left) getAllChildren(root.left, arr); + if (root.right) getAllChildren(root.right, arr); + } + }; + + var buildDendrogram = function buildDendrogram(root, cy) { + if (!root) return ''; + + if (root.left && root.right) { + var leftStr = buildDendrogram(root.left, cy); + var rightStr = buildDendrogram(root.right, cy); + var node = cy.add({ + group: 'nodes', + data: { + id: leftStr + ',' + rightStr + } + }); + cy.add({ + group: 'edges', + data: { + source: leftStr, + target: node.id() + } + }); + cy.add({ + group: 'edges', + data: { + source: rightStr, + target: node.id() + } + }); + return node.id(); + } else if (root.value) { + return root.value.id(); + } + }; + + var buildClustersFromTree = function buildClustersFromTree(root, k, cy) { + if (!root) return []; + var left = [], + right = [], + leaves = []; + + if (k === 0) { + // don't cut tree, simply return all nodes as 1 single cluster + if (root.left) getAllChildren(root.left, left); + if (root.right) getAllChildren(root.right, right); + leaves = left.concat(right); + return [cy.collection(leaves)]; + } else if (k === 1) { + // cut at root + if (root.value) { + // leaf node + return [cy.collection(root.value)]; + } else { + if (root.left) getAllChildren(root.left, left); + if (root.right) getAllChildren(root.right, right); + return [cy.collection(left), cy.collection(right)]; + } + } else { + if (root.value) { + return [cy.collection(root.value)]; + } else { + if (root.left) left = buildClustersFromTree(root.left, k - 1, cy); + if (root.right) right = buildClustersFromTree(root.right, k - 1, cy); + return left.concat(right); + } + } + }; + /* eslint-enable */ + + + var hierarchicalClustering = function hierarchicalClustering(options) { + var cy = this.cy(); + var nodes = this.nodes(); // Set parameters of algorithm: linkage type, distance metric, etc. + + var opts = setOptions$1(options); + var attrs = opts.attributes; + + var getDist = function getDist(n1, n2) { + return clusteringDistance(opts.distance, attrs.length, function (i) { + return attrs[i](n1); + }, function (i) { + return attrs[i](n2); + }, n1, n2); + }; // Begin hierarchical algorithm + + + var clusters = []; + var dists = []; // distances between each pair of clusters + + var mins = []; // closest cluster for each cluster + + var index = []; // hash of all clusters by key + // In agglomerative (bottom-up) clustering, each node starts as its own cluster + + for (var n = 0; n < nodes.length; n++) { + var cluster = { + value: opts.mode === 'dendrogram' ? nodes[n] : [nodes[n]], + key: n, + index: n + }; + clusters[n] = cluster; + index[n] = cluster; + dists[n] = []; + mins[n] = 0; + } // Calculate the distance between each pair of clusters + + + for (var i = 0; i < clusters.length; i++) { + for (var j = 0; j <= i; j++) { + var dist = void 0; + + if (opts.mode === 'dendrogram') { + // modes store cluster values differently + dist = i === j ? Infinity : getDist(clusters[i].value, clusters[j].value); + } else { + dist = i === j ? Infinity : getDist(clusters[i].value[0], clusters[j].value[0]); + } + + dists[i][j] = dist; + dists[j][i] = dist; + + if (dist < dists[i][mins[i]]) { + mins[i] = j; // Cache mins: closest cluster to cluster i is cluster j + } + } + } // Find the closest pair of clusters and merge them into a single cluster. + // Update distances between new cluster and each of the old clusters, and loop until threshold reached. + + + var merged = mergeClosest(clusters, index, dists, mins, opts); + + while (merged) { + merged = mergeClosest(clusters, index, dists, mins, opts); + } + + var retClusters; // Dendrogram mode builds the hierarchy and adds intermediary nodes + edges + // in addition to returning the clusters. + + if (opts.mode === 'dendrogram') { + retClusters = buildClustersFromTree(clusters[0], opts.dendrogramDepth, cy); + if (opts.addDendrogram) buildDendrogram(clusters[0], cy); + } else { + // Regular mode simply returns the clusters + retClusters = new Array(clusters.length); + clusters.forEach(function (cluster, i) { + // Clean up meta data used for clustering + cluster.key = cluster.index = null; + retClusters[i] = cy.collection(cluster.value); + }); + } + + return retClusters; + }; + + var hierarchicalClustering$1 = { + hierarchicalClustering: hierarchicalClustering, + hca: hierarchicalClustering + }; + + // Implemented by Zoe Xi @zoexi for GSOC 2016 + var defaults$9 = defaults$g({ + distance: 'euclidean', + // distance metric to compare attributes between two nodes + preference: 'median', + // suitability of a data point to serve as an exemplar + damping: 0.8, + // damping factor between [0.5, 1) + maxIterations: 1000, + // max number of iterations to run + minIterations: 100, + // min number of iterations to run in order for clustering to stop + attributes: [// functions to quantify the similarity between any two points + // e.g. node => node.data('weight') + ] + }); + + var setOptions = function setOptions(options) { + var dmp = options.damping; + var pref = options.preference; + + if (!(0.5 <= dmp && dmp < 1)) { + error("Damping must range on [0.5, 1). Got: ".concat(dmp)); + } + + var validPrefs = ['median', 'mean', 'min', 'max']; + + if (!(validPrefs.some(function (v) { + return v === pref; + }) || number$1(pref))) { + error("Preference must be one of [".concat(validPrefs.map(function (p) { + return "'".concat(p, "'"); + }).join(', '), "] or a number. Got: ").concat(pref)); + } + + return defaults$9(options); + }; + /* eslint-enable */ + + + var getSimilarity = function getSimilarity(type, n1, n2, attributes) { + var attr = function attr(n, i) { + return attributes[i](n); + }; // nb negative because similarity should have an inverse relationship to distance + + + return -clusteringDistance(type, attributes.length, function (i) { + return attr(n1, i); + }, function (i) { + return attr(n2, i); + }, n1, n2); + }; + + var getPreference = function getPreference(S, preference) { + // larger preference = greater # of clusters + var p = null; + + if (preference === 'median') { + p = median(S); + } else if (preference === 'mean') { + p = mean(S); + } else if (preference === 'min') { + p = min(S); + } else if (preference === 'max') { + p = max(S); + } else { + // Custom preference number, as set by user + p = preference; + } + + return p; + }; + + var findExemplars = function findExemplars(n, R, A) { + var indices = []; + + for (var i = 0; i < n; i++) { + if (R[i * n + i] + A[i * n + i] > 0) { + indices.push(i); + } + } + + return indices; + }; + + var assignClusters = function assignClusters(n, S, exemplars) { + var clusters = []; + + for (var i = 0; i < n; i++) { + var index = -1; + var max = -Infinity; + + for (var ei = 0; ei < exemplars.length; ei++) { + var e = exemplars[ei]; + + if (S[i * n + e] > max) { + index = e; + max = S[i * n + e]; + } + } + + if (index > 0) { + clusters.push(index); + } + } + + for (var _ei = 0; _ei < exemplars.length; _ei++) { + clusters[exemplars[_ei]] = exemplars[_ei]; + } + + return clusters; + }; + + var assign = function assign(n, S, exemplars) { + var clusters = assignClusters(n, S, exemplars); + + for (var ei = 0; ei < exemplars.length; ei++) { + var ii = []; + + for (var c = 0; c < clusters.length; c++) { + if (clusters[c] === exemplars[ei]) { + ii.push(c); + } + } + + var maxI = -1; + var maxSum = -Infinity; + + for (var i = 0; i < ii.length; i++) { + var sum = 0; + + for (var j = 0; j < ii.length; j++) { + sum += S[ii[j] * n + ii[i]]; + } + + if (sum > maxSum) { + maxI = i; + maxSum = sum; + } + } + + exemplars[ei] = ii[maxI]; + } + + clusters = assignClusters(n, S, exemplars); + return clusters; + }; + + var affinityPropagation = function affinityPropagation(options) { + var cy = this.cy(); + var nodes = this.nodes(); + var opts = setOptions(options); // Map each node to its position in node array + + var id2position = {}; + + for (var i = 0; i < nodes.length; i++) { + id2position[nodes[i].id()] = i; + } // Begin affinity propagation algorithm + + + var n; // number of data points + + var n2; // size of matrices + + var S; // similarity matrix (1D array) + + var p; // preference/suitability of a data point to serve as an exemplar + + var R; // responsibility matrix (1D array) + + var A; // availability matrix (1D array) + + n = nodes.length; + n2 = n * n; // Initialize and build S similarity matrix + + S = new Array(n2); + + for (var _i = 0; _i < n2; _i++) { + S[_i] = -Infinity; // for cases where two data points shouldn't be linked together + } + + for (var _i2 = 0; _i2 < n; _i2++) { + for (var j = 0; j < n; j++) { + if (_i2 !== j) { + S[_i2 * n + j] = getSimilarity(opts.distance, nodes[_i2], nodes[j], opts.attributes); + } + } + } // Place preferences on the diagonal of S + + + p = getPreference(S, opts.preference); + + for (var _i3 = 0; _i3 < n; _i3++) { + S[_i3 * n + _i3] = p; + } // Initialize R responsibility matrix + + + R = new Array(n2); + + for (var _i4 = 0; _i4 < n2; _i4++) { + R[_i4] = 0.0; + } // Initialize A availability matrix + + + A = new Array(n2); + + for (var _i5 = 0; _i5 < n2; _i5++) { + A[_i5] = 0.0; + } + + var old = new Array(n); + var Rp = new Array(n); + var se = new Array(n); + + for (var _i6 = 0; _i6 < n; _i6++) { + old[_i6] = 0.0; + Rp[_i6] = 0.0; + se[_i6] = 0; + } + + var e = new Array(n * opts.minIterations); + + for (var _i7 = 0; _i7 < e.length; _i7++) { + e[_i7] = 0; + } + + var iter; + + for (iter = 0; iter < opts.maxIterations; iter++) { + // main algorithmic loop + // Update R responsibility matrix + for (var _i8 = 0; _i8 < n; _i8++) { + var max = -Infinity, + max2 = -Infinity, + maxI = -1, + AS = 0.0; + + for (var _j = 0; _j < n; _j++) { + old[_j] = R[_i8 * n + _j]; + AS = A[_i8 * n + _j] + S[_i8 * n + _j]; + + if (AS >= max) { + max2 = max; + max = AS; + maxI = _j; + } else if (AS > max2) { + max2 = AS; + } + } + + for (var _j2 = 0; _j2 < n; _j2++) { + R[_i8 * n + _j2] = (1 - opts.damping) * (S[_i8 * n + _j2] - max) + opts.damping * old[_j2]; + } + + R[_i8 * n + maxI] = (1 - opts.damping) * (S[_i8 * n + maxI] - max2) + opts.damping * old[maxI]; + } // Update A availability matrix + + + for (var _i9 = 0; _i9 < n; _i9++) { + var sum = 0; + + for (var _j3 = 0; _j3 < n; _j3++) { + old[_j3] = A[_j3 * n + _i9]; + Rp[_j3] = Math.max(0, R[_j3 * n + _i9]); + sum += Rp[_j3]; + } + + sum -= Rp[_i9]; + Rp[_i9] = R[_i9 * n + _i9]; + sum += Rp[_i9]; + + for (var _j4 = 0; _j4 < n; _j4++) { + A[_j4 * n + _i9] = (1 - opts.damping) * Math.min(0, sum - Rp[_j4]) + opts.damping * old[_j4]; + } + + A[_i9 * n + _i9] = (1 - opts.damping) * (sum - Rp[_i9]) + opts.damping * old[_i9]; + } // Check for convergence + + + var K = 0; + + for (var _i10 = 0; _i10 < n; _i10++) { + var E = A[_i10 * n + _i10] + R[_i10 * n + _i10] > 0 ? 1 : 0; + e[iter % opts.minIterations * n + _i10] = E; + K += E; + } + + if (K > 0 && (iter >= opts.minIterations - 1 || iter == opts.maxIterations - 1)) { + var _sum = 0; + + for (var _i11 = 0; _i11 < n; _i11++) { + se[_i11] = 0; + + for (var _j5 = 0; _j5 < opts.minIterations; _j5++) { + se[_i11] += e[_j5 * n + _i11]; + } + + if (se[_i11] === 0 || se[_i11] === opts.minIterations) { + _sum++; + } + } + + if (_sum === n) { + // then we have convergence + break; + } + } + } // Identify exemplars (cluster centers) + + + var exemplarsIndices = findExemplars(n, R, A); // Assign nodes to clusters + + var clusterIndices = assign(n, S, exemplarsIndices); + var clusters = {}; + + for (var c = 0; c < exemplarsIndices.length; c++) { + clusters[exemplarsIndices[c]] = []; + } + + for (var _i12 = 0; _i12 < nodes.length; _i12++) { + var pos = id2position[nodes[_i12].id()]; + + var clusterIndex = clusterIndices[pos]; + + if (clusterIndex != null) { + // the node may have not been assigned a cluster if no valid attributes were specified + clusters[clusterIndex].push(nodes[_i12]); + } + } + + var retClusters = new Array(exemplarsIndices.length); + + for (var _c = 0; _c < exemplarsIndices.length; _c++) { + retClusters[_c] = cy.collection(clusters[exemplarsIndices[_c]]); + } + + return retClusters; + }; + + var affinityPropagation$1 = { + affinityPropagation: affinityPropagation, + ap: affinityPropagation + }; + + var hierholzerDefaults = defaults$g({ + root: undefined, + directed: false + }); + var elesfn$k = { + hierholzer: function hierholzer(options) { + if (!plainObject(options)) { + var args = arguments; + options = { + root: args[0], + directed: args[1] + }; + } + + var _hierholzerDefaults = hierholzerDefaults(options), + root = _hierholzerDefaults.root, + directed = _hierholzerDefaults.directed; + + var eles = this; + var dflag = false; + var oddIn; + var oddOut; + var startVertex; + if (root) startVertex = string(root) ? this.filter(root)[0].id() : root[0].id(); + var nodes = {}; + var edges = {}; + + if (directed) { + eles.forEach(function (ele) { + var id = ele.id(); + + if (ele.isNode()) { + var ind = ele.indegree(true); + var outd = ele.outdegree(true); + var d1 = ind - outd; + var d2 = outd - ind; + + if (d1 == 1) { + if (oddIn) dflag = true;else oddIn = id; + } else if (d2 == 1) { + if (oddOut) dflag = true;else oddOut = id; + } else if (d2 > 1 || d1 > 1) { + dflag = true; + } + + nodes[id] = []; + ele.outgoers().forEach(function (e) { + if (e.isEdge()) nodes[id].push(e.id()); + }); + } else { + edges[id] = [undefined, ele.target().id()]; + } + }); + } else { + eles.forEach(function (ele) { + var id = ele.id(); + + if (ele.isNode()) { + var d = ele.degree(true); + + if (d % 2) { + if (!oddIn) oddIn = id;else if (!oddOut) oddOut = id;else dflag = true; + } + + nodes[id] = []; + ele.connectedEdges().forEach(function (e) { + return nodes[id].push(e.id()); + }); + } else { + edges[id] = [ele.source().id(), ele.target().id()]; + } + }); + } + + var result = { + found: false, + trail: undefined + }; + if (dflag) return result;else if (oddOut && oddIn) { + if (directed) { + if (startVertex && oddOut != startVertex) { + return result; + } + + startVertex = oddOut; + } else { + if (startVertex && oddOut != startVertex && oddIn != startVertex) { + return result; + } else if (!startVertex) { + startVertex = oddOut; + } + } + } else { + if (!startVertex) startVertex = eles[0].id(); + } + + var walk = function walk(v) { + var currentNode = v; + var subtour = [v]; + var adj, adjTail, adjHead; + + while (nodes[currentNode].length) { + adj = nodes[currentNode].shift(); + adjTail = edges[adj][0]; + adjHead = edges[adj][1]; + + if (currentNode != adjHead) { + nodes[adjHead] = nodes[adjHead].filter(function (e) { + return e != adj; + }); + currentNode = adjHead; + } else if (!directed && currentNode != adjTail) { + nodes[adjTail] = nodes[adjTail].filter(function (e) { + return e != adj; + }); + currentNode = adjTail; + } + + subtour.unshift(adj); + subtour.unshift(currentNode); + } + + return subtour; + }; + + var trail = []; + var subtour = []; + subtour = walk(startVertex); + + while (subtour.length != 1) { + if (nodes[subtour[0]].length == 0) { + trail.unshift(eles.getElementById(subtour.shift())); + trail.unshift(eles.getElementById(subtour.shift())); + } else { + subtour = walk(subtour.shift()).concat(subtour); + } + } + + trail.unshift(eles.getElementById(subtour.shift())); // final node + + for (var d in nodes) { + if (nodes[d].length) { + return result; + } + } + + result.found = true; + result.trail = this.spawn(trail, true); + return result; + } + }; + + var hopcroftTarjanBiconnected = function hopcroftTarjanBiconnected() { + var eles = this; + var nodes = {}; + var id = 0; + var edgeCount = 0; + var components = []; + var stack = []; + var visitedEdges = {}; + + var buildComponent = function buildComponent(x, y) { + var i = stack.length - 1; + var cutset = []; + var component = eles.spawn(); + + while (stack[i].x != x || stack[i].y != y) { + cutset.push(stack.pop().edge); + i--; + } + + cutset.push(stack.pop().edge); + cutset.forEach(function (edge) { + var connectedNodes = edge.connectedNodes().intersection(eles); + component.merge(edge); + connectedNodes.forEach(function (node) { + var nodeId = node.id(); + var connectedEdges = node.connectedEdges().intersection(eles); + component.merge(node); + + if (!nodes[nodeId].cutVertex) { + component.merge(connectedEdges); + } else { + component.merge(connectedEdges.filter(function (edge) { + return edge.isLoop(); + })); + } + }); + }); + components.push(component); + }; + + var biconnectedSearch = function biconnectedSearch(root, currentNode, parent) { + if (root === parent) edgeCount += 1; + nodes[currentNode] = { + id: id, + low: id++, + cutVertex: false + }; + var edges = eles.getElementById(currentNode).connectedEdges().intersection(eles); + + if (edges.size() === 0) { + components.push(eles.spawn(eles.getElementById(currentNode))); + } else { + var sourceId, targetId, otherNodeId, edgeId; + edges.forEach(function (edge) { + sourceId = edge.source().id(); + targetId = edge.target().id(); + otherNodeId = sourceId === currentNode ? targetId : sourceId; + + if (otherNodeId !== parent) { + edgeId = edge.id(); + + if (!visitedEdges[edgeId]) { + visitedEdges[edgeId] = true; + stack.push({ + x: currentNode, + y: otherNodeId, + edge: edge + }); + } + + if (!(otherNodeId in nodes)) { + biconnectedSearch(root, otherNodeId, currentNode); + nodes[currentNode].low = Math.min(nodes[currentNode].low, nodes[otherNodeId].low); + + if (nodes[currentNode].id <= nodes[otherNodeId].low) { + nodes[currentNode].cutVertex = true; + buildComponent(currentNode, otherNodeId); + } + } else { + nodes[currentNode].low = Math.min(nodes[currentNode].low, nodes[otherNodeId].id); + } + } + }); + } + }; + + eles.forEach(function (ele) { + if (ele.isNode()) { + var nodeId = ele.id(); + + if (!(nodeId in nodes)) { + edgeCount = 0; + biconnectedSearch(nodeId, nodeId); + nodes[nodeId].cutVertex = edgeCount > 1; + } + } + }); + var cutVertices = Object.keys(nodes).filter(function (id) { + return nodes[id].cutVertex; + }).map(function (id) { + return eles.getElementById(id); + }); + return { + cut: eles.spawn(cutVertices), + components: components + }; + }; + + var hopcroftTarjanBiconnected$1 = { + hopcroftTarjanBiconnected: hopcroftTarjanBiconnected, + htbc: hopcroftTarjanBiconnected, + htb: hopcroftTarjanBiconnected, + hopcroftTarjanBiconnectedComponents: hopcroftTarjanBiconnected + }; + + var tarjanStronglyConnected = function tarjanStronglyConnected() { + var eles = this; + var nodes = {}; + var index = 0; + var components = []; + var stack = []; + var cut = eles.spawn(eles); + + var stronglyConnectedSearch = function stronglyConnectedSearch(sourceNodeId) { + stack.push(sourceNodeId); + nodes[sourceNodeId] = { + index: index, + low: index++, + explored: false + }; + var connectedEdges = eles.getElementById(sourceNodeId).connectedEdges().intersection(eles); + connectedEdges.forEach(function (edge) { + var targetNodeId = edge.target().id(); + + if (targetNodeId !== sourceNodeId) { + if (!(targetNodeId in nodes)) { + stronglyConnectedSearch(targetNodeId); + } + + if (!nodes[targetNodeId].explored) { + nodes[sourceNodeId].low = Math.min(nodes[sourceNodeId].low, nodes[targetNodeId].low); + } + } + }); + + if (nodes[sourceNodeId].index === nodes[sourceNodeId].low) { + var componentNodes = eles.spawn(); + + for (;;) { + var nodeId = stack.pop(); + componentNodes.merge(eles.getElementById(nodeId)); + nodes[nodeId].low = nodes[sourceNodeId].index; + nodes[nodeId].explored = true; + + if (nodeId === sourceNodeId) { + break; + } + } + + var componentEdges = componentNodes.edgesWith(componentNodes); + var component = componentNodes.merge(componentEdges); + components.push(component); + cut = cut.difference(component); + } + }; + + eles.forEach(function (ele) { + if (ele.isNode()) { + var nodeId = ele.id(); + + if (!(nodeId in nodes)) { + stronglyConnectedSearch(nodeId); + } + } + }); + return { + cut: cut, + components: components + }; + }; + + var tarjanStronglyConnected$1 = { + tarjanStronglyConnected: tarjanStronglyConnected, + tsc: tarjanStronglyConnected, + tscc: tarjanStronglyConnected, + tarjanStronglyConnectedComponents: tarjanStronglyConnected + }; + + var elesfn$j = {}; + [elesfn$v, elesfn$u, elesfn$t, elesfn$s, elesfn$r, elesfn$q, elesfn$p, elesfn$o, elesfn$n, elesfn$m, elesfn$l, markovClustering$1, kClustering, hierarchicalClustering$1, affinityPropagation$1, elesfn$k, hopcroftTarjanBiconnected$1, tarjanStronglyConnected$1].forEach(function (props) { + extend(elesfn$j, props); + }); + + /*! + Embeddable Minimum Strictly-Compliant Promises/A+ 1.1.1 Thenable + Copyright (c) 2013-2014 Ralf S. Engelschall (http://engelschall.com) + Licensed under The MIT License (http://opensource.org/licenses/MIT) + */ + + /* promise states [Promises/A+ 2.1] */ + var STATE_PENDING = 0; + /* [Promises/A+ 2.1.1] */ + + var STATE_FULFILLED = 1; + /* [Promises/A+ 2.1.2] */ + + var STATE_REJECTED = 2; + /* [Promises/A+ 2.1.3] */ + + /* promise object constructor */ + + var api = function api(executor) { + /* optionally support non-constructor/plain-function call */ + if (!(this instanceof api)) return new api(executor); + /* initialize object */ + + this.id = 'Thenable/1.0.7'; + this.state = STATE_PENDING; + /* initial state */ + + this.fulfillValue = undefined; + /* initial value */ + + /* [Promises/A+ 1.3, 2.1.2.2] */ + + this.rejectReason = undefined; + /* initial reason */ + + /* [Promises/A+ 1.5, 2.1.3.2] */ + + this.onFulfilled = []; + /* initial handlers */ + + this.onRejected = []; + /* initial handlers */ + + /* provide optional information-hiding proxy */ + + this.proxy = { + then: this.then.bind(this) + }; + /* support optional executor function */ + + if (typeof executor === 'function') executor.call(this, this.fulfill.bind(this), this.reject.bind(this)); + }; + /* promise API methods */ + + + api.prototype = { + /* promise resolving methods */ + fulfill: function fulfill(value) { + return deliver(this, STATE_FULFILLED, 'fulfillValue', value); + }, + reject: function reject(value) { + return deliver(this, STATE_REJECTED, 'rejectReason', value); + }, + + /* "The then Method" [Promises/A+ 1.1, 1.2, 2.2] */ + then: function then(onFulfilled, onRejected) { + var curr = this; + var next = new api(); + /* [Promises/A+ 2.2.7] */ + + curr.onFulfilled.push(resolver(onFulfilled, next, 'fulfill')); + /* [Promises/A+ 2.2.2/2.2.6] */ + + curr.onRejected.push(resolver(onRejected, next, 'reject')); + /* [Promises/A+ 2.2.3/2.2.6] */ + + execute(curr); + return next.proxy; + /* [Promises/A+ 2.2.7, 3.3] */ + } + }; + /* deliver an action */ + + var deliver = function deliver(curr, state, name, value) { + if (curr.state === STATE_PENDING) { + curr.state = state; + /* [Promises/A+ 2.1.2.1, 2.1.3.1] */ + + curr[name] = value; + /* [Promises/A+ 2.1.2.2, 2.1.3.2] */ + + execute(curr); + } + + return curr; + }; + /* execute all handlers */ + + + var execute = function execute(curr) { + if (curr.state === STATE_FULFILLED) execute_handlers(curr, 'onFulfilled', curr.fulfillValue);else if (curr.state === STATE_REJECTED) execute_handlers(curr, 'onRejected', curr.rejectReason); + }; + /* execute particular set of handlers */ + + + var execute_handlers = function execute_handlers(curr, name, value) { + /* global setImmediate: true */ + + /* global setTimeout: true */ + + /* short-circuit processing */ + if (curr[name].length === 0) return; + /* iterate over all handlers, exactly once */ + + var handlers = curr[name]; + curr[name] = []; + /* [Promises/A+ 2.2.2.3, 2.2.3.3] */ + + var func = function func() { + for (var i = 0; i < handlers.length; i++) { + handlers[i](value); + } + /* [Promises/A+ 2.2.5] */ + + }; + /* execute procedure asynchronously */ + + /* [Promises/A+ 2.2.4, 3.1] */ + + + if (typeof setImmediate === 'function') setImmediate(func);else setTimeout(func, 0); + }; + /* generate a resolver function */ + + + var resolver = function resolver(cb, next, method) { + return function (value) { + if (typeof cb !== 'function') + /* [Promises/A+ 2.2.1, 2.2.7.3, 2.2.7.4] */ + next[method].call(next, value); + /* [Promises/A+ 2.2.7.3, 2.2.7.4] */ + else { + var result; + + try { + result = cb(value); + } + /* [Promises/A+ 2.2.2.1, 2.2.3.1, 2.2.5, 3.2] */ + catch (e) { + next.reject(e); + /* [Promises/A+ 2.2.7.2] */ + + return; + } + + resolve(next, result); + /* [Promises/A+ 2.2.7.1] */ + } + }; + }; + /* "Promise Resolution Procedure" */ + + /* [Promises/A+ 2.3] */ + + + var resolve = function resolve(promise, x) { + /* sanity check arguments */ + + /* [Promises/A+ 2.3.1] */ + if (promise === x || promise.proxy === x) { + promise.reject(new TypeError('cannot resolve promise with itself')); + return; + } + /* surgically check for a "then" method + (mainly to just call the "getter" of "then" only once) */ + + + var then; + + if (_typeof(x) === 'object' && x !== null || typeof x === 'function') { + try { + then = x.then; + } + /* [Promises/A+ 2.3.3.1, 3.5] */ + catch (e) { + promise.reject(e); + /* [Promises/A+ 2.3.3.2] */ + + return; + } + } + /* handle own Thenables [Promises/A+ 2.3.2] + and similar "thenables" [Promises/A+ 2.3.3] */ + + + if (typeof then === 'function') { + var resolved = false; + + try { + /* call retrieved "then" method */ + + /* [Promises/A+ 2.3.3.3] */ + then.call(x, + /* resolvePromise */ + + /* [Promises/A+ 2.3.3.3.1] */ + function (y) { + if (resolved) return; + resolved = true; + /* [Promises/A+ 2.3.3.3.3] */ + + if (y === x) + /* [Promises/A+ 3.6] */ + promise.reject(new TypeError('circular thenable chain'));else resolve(promise, y); + }, + /* rejectPromise */ + + /* [Promises/A+ 2.3.3.3.2] */ + function (r) { + if (resolved) return; + resolved = true; + /* [Promises/A+ 2.3.3.3.3] */ + + promise.reject(r); + }); + } catch (e) { + if (!resolved) + /* [Promises/A+ 2.3.3.3.3] */ + promise.reject(e); + /* [Promises/A+ 2.3.3.3.4] */ + } + + return; + } + /* handle other values */ + + + promise.fulfill(x); + /* [Promises/A+ 2.3.4, 2.3.3.4] */ + }; // so we always have Promise.all() + + + api.all = function (ps) { + return new api(function (resolveAll, rejectAll) { + var vals = new Array(ps.length); + var doneCount = 0; + + var fulfill = function fulfill(i, val) { + vals[i] = val; + doneCount++; + + if (doneCount === ps.length) { + resolveAll(vals); + } + }; + + for (var i = 0; i < ps.length; i++) { + (function (i) { + var p = ps[i]; + var isPromise = p != null && p.then != null; + + if (isPromise) { + p.then(function (val) { + fulfill(i, val); + }, function (err) { + rejectAll(err); + }); + } else { + var val = p; + fulfill(i, val); + } + })(i); + } + }); + }; + + api.resolve = function (val) { + return new api(function (resolve, reject) { + resolve(val); + }); + }; + + api.reject = function (val) { + return new api(function (resolve, reject) { + reject(val); + }); + }; + + var Promise$1 = typeof Promise !== 'undefined' ? Promise : api; // eslint-disable-line no-undef + + var Animation = function Animation(target, opts, opts2) { + var isCore = core(target); + var isEle = !isCore; + + var _p = this._private = extend({ + duration: 1000 + }, opts, opts2); + + _p.target = target; + _p.style = _p.style || _p.css; + _p.started = false; + _p.playing = false; + _p.hooked = false; + _p.applying = false; + _p.progress = 0; + _p.completes = []; + _p.frames = []; + + if (_p.complete && fn$6(_p.complete)) { + _p.completes.push(_p.complete); + } + + if (isEle) { + var pos = target.position(); + _p.startPosition = _p.startPosition || { + x: pos.x, + y: pos.y + }; + _p.startStyle = _p.startStyle || target.cy().style().getAnimationStartStyle(target, _p.style); + } + + if (isCore) { + var pan = target.pan(); + _p.startPan = { + x: pan.x, + y: pan.y + }; + _p.startZoom = target.zoom(); + } // for future timeline/animations impl + + + this.length = 1; + this[0] = this; + }; + + var anifn = Animation.prototype; + extend(anifn, { + instanceString: function instanceString() { + return 'animation'; + }, + hook: function hook() { + var _p = this._private; + + if (!_p.hooked) { + // add to target's animation queue + var q; + var tAni = _p.target._private.animation; + + if (_p.queue) { + q = tAni.queue; + } else { + q = tAni.current; + } + + q.push(this); // add to the animation loop pool + + if (elementOrCollection(_p.target)) { + _p.target.cy().addToAnimationPool(_p.target); + } + + _p.hooked = true; + } + + return this; + }, + play: function play() { + var _p = this._private; // autorewind + + if (_p.progress === 1) { + _p.progress = 0; + } + + _p.playing = true; + _p.started = false; // needs to be started by animation loop + + _p.stopped = false; + this.hook(); // the animation loop will start the animation... + + return this; + }, + playing: function playing() { + return this._private.playing; + }, + apply: function apply() { + var _p = this._private; + _p.applying = true; + _p.started = false; // needs to be started by animation loop + + _p.stopped = false; + this.hook(); // the animation loop will apply the animation at this progress + + return this; + }, + applying: function applying() { + return this._private.applying; + }, + pause: function pause() { + var _p = this._private; + _p.playing = false; + _p.started = false; + return this; + }, + stop: function stop() { + var _p = this._private; + _p.playing = false; + _p.started = false; + _p.stopped = true; // to be removed from animation queues + + return this; + }, + rewind: function rewind() { + return this.progress(0); + }, + fastforward: function fastforward() { + return this.progress(1); + }, + time: function time(t) { + var _p = this._private; + + if (t === undefined) { + return _p.progress * _p.duration; + } else { + return this.progress(t / _p.duration); + } + }, + progress: function progress(p) { + var _p = this._private; + var wasPlaying = _p.playing; + + if (p === undefined) { + return _p.progress; + } else { + if (wasPlaying) { + this.pause(); + } + + _p.progress = p; + _p.started = false; + + if (wasPlaying) { + this.play(); + } + } + + return this; + }, + completed: function completed() { + return this._private.progress === 1; + }, + reverse: function reverse() { + var _p = this._private; + var wasPlaying = _p.playing; + + if (wasPlaying) { + this.pause(); + } + + _p.progress = 1 - _p.progress; + _p.started = false; + + var swap = function swap(a, b) { + var _pa = _p[a]; + + if (_pa == null) { + return; + } + + _p[a] = _p[b]; + _p[b] = _pa; + }; + + swap('zoom', 'startZoom'); + swap('pan', 'startPan'); + swap('position', 'startPosition'); // swap styles + + if (_p.style) { + for (var i = 0; i < _p.style.length; i++) { + var prop = _p.style[i]; + var name = prop.name; + var startStyleProp = _p.startStyle[name]; + _p.startStyle[name] = prop; + _p.style[i] = startStyleProp; + } + } + + if (wasPlaying) { + this.play(); + } + + return this; + }, + promise: function promise(type) { + var _p = this._private; + var arr; + + switch (type) { + case 'frame': + arr = _p.frames; + break; + + default: + case 'complete': + case 'completed': + arr = _p.completes; + } + + return new Promise$1(function (resolve, reject) { + arr.push(function () { + resolve(); + }); + }); + } + }); + anifn.complete = anifn.completed; + anifn.run = anifn.play; + anifn.running = anifn.playing; + + var define$3 = { + animated: function animated() { + return function animatedImpl() { + var self = this; + var selfIsArrayLike = self.length !== undefined; + var all = selfIsArrayLike ? self : [self]; // put in array if not array-like + + var cy = this._private.cy || this; + + if (!cy.styleEnabled()) { + return false; + } + + var ele = all[0]; + + if (ele) { + return ele._private.animation.current.length > 0; + } + }; + }, + // animated + clearQueue: function clearQueue() { + return function clearQueueImpl() { + var self = this; + var selfIsArrayLike = self.length !== undefined; + var all = selfIsArrayLike ? self : [self]; // put in array if not array-like + + var cy = this._private.cy || this; + + if (!cy.styleEnabled()) { + return this; + } + + for (var i = 0; i < all.length; i++) { + var ele = all[i]; + ele._private.animation.queue = []; + } + + return this; + }; + }, + // clearQueue + delay: function delay() { + return function delayImpl(time, complete) { + var cy = this._private.cy || this; + + if (!cy.styleEnabled()) { + return this; + } + + return this.animate({ + delay: time, + duration: time, + complete: complete + }); + }; + }, + // delay + delayAnimation: function delayAnimation() { + return function delayAnimationImpl(time, complete) { + var cy = this._private.cy || this; + + if (!cy.styleEnabled()) { + return this; + } + + return this.animation({ + delay: time, + duration: time, + complete: complete + }); + }; + }, + // delay + animation: function animation() { + return function animationImpl(properties, params) { + var self = this; + var selfIsArrayLike = self.length !== undefined; + var all = selfIsArrayLike ? self : [self]; // put in array if not array-like + + var cy = this._private.cy || this; + var isCore = !selfIsArrayLike; + var isEles = !isCore; + + if (!cy.styleEnabled()) { + return this; + } + + var style = cy.style(); + properties = extend({}, properties, params); + var propertiesEmpty = Object.keys(properties).length === 0; + + if (propertiesEmpty) { + return new Animation(all[0], properties); // nothing to animate + } + + if (properties.duration === undefined) { + properties.duration = 400; + } + + switch (properties.duration) { + case 'slow': + properties.duration = 600; + break; + + case 'fast': + properties.duration = 200; + break; + } + + if (isEles) { + properties.style = style.getPropsList(properties.style || properties.css); + properties.css = undefined; + } + + if (isEles && properties.renderedPosition != null) { + var rpos = properties.renderedPosition; + var pan = cy.pan(); + var zoom = cy.zoom(); + properties.position = renderedToModelPosition(rpos, zoom, pan); + } // override pan w/ panBy if set + + + if (isCore && properties.panBy != null) { + var panBy = properties.panBy; + var cyPan = cy.pan(); + properties.pan = { + x: cyPan.x + panBy.x, + y: cyPan.y + panBy.y + }; + } // override pan w/ center if set + + + var center = properties.center || properties.centre; + + if (isCore && center != null) { + var centerPan = cy.getCenterPan(center.eles, properties.zoom); + + if (centerPan != null) { + properties.pan = centerPan; + } + } // override pan & zoom w/ fit if set + + + if (isCore && properties.fit != null) { + var fit = properties.fit; + var fitVp = cy.getFitViewport(fit.eles || fit.boundingBox, fit.padding); + + if (fitVp != null) { + properties.pan = fitVp.pan; + properties.zoom = fitVp.zoom; + } + } // override zoom (& potentially pan) w/ zoom obj if set + + + if (isCore && plainObject(properties.zoom)) { + var vp = cy.getZoomedViewport(properties.zoom); + + if (vp != null) { + if (vp.zoomed) { + properties.zoom = vp.zoom; + } + + if (vp.panned) { + properties.pan = vp.pan; + } + } else { + properties.zoom = null; // an inavalid zoom (e.g. no delta) gets automatically destroyed + } + } + + return new Animation(all[0], properties); + }; + }, + // animate + animate: function animate() { + return function animateImpl(properties, params) { + var self = this; + var selfIsArrayLike = self.length !== undefined; + var all = selfIsArrayLike ? self : [self]; // put in array if not array-like + + var cy = this._private.cy || this; + + if (!cy.styleEnabled()) { + return this; + } + + if (params) { + properties = extend({}, properties, params); + } // manually hook and run the animation + + + for (var i = 0; i < all.length; i++) { + var ele = all[i]; + var queue = ele.animated() && (properties.queue === undefined || properties.queue); + var ani = ele.animation(properties, queue ? { + queue: true + } : undefined); + ani.play(); + } + + return this; // chaining + }; + }, + // animate + stop: function stop() { + return function stopImpl(clearQueue, jumpToEnd) { + var self = this; + var selfIsArrayLike = self.length !== undefined; + var all = selfIsArrayLike ? self : [self]; // put in array if not array-like + + var cy = this._private.cy || this; + + if (!cy.styleEnabled()) { + return this; + } + + for (var i = 0; i < all.length; i++) { + var ele = all[i]; + var _p = ele._private; + var anis = _p.animation.current; + + for (var j = 0; j < anis.length; j++) { + var ani = anis[j]; + var ani_p = ani._private; + + if (jumpToEnd) { + // next iteration of the animation loop, the animation + // will go straight to the end and be removed + ani_p.duration = 0; + } + } // clear the queue of future animations + + + if (clearQueue) { + _p.animation.queue = []; + } + + if (!jumpToEnd) { + _p.animation.current = []; + } + } // we have to notify (the animation loop doesn't do it for us on `stop`) + + + cy.notify('draw'); + return this; + }; + } // stop + + }; // define + + /** + * Checks if `value` is classified as an `Array` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array, else `false`. + * @example + * + * _.isArray([1, 2, 3]); + * // => true + * + * _.isArray(document.body.children); + * // => false + * + * _.isArray('abc'); + * // => false + * + * _.isArray(_.noop); + * // => false + */ + var isArray = Array.isArray; + + var isArray_1 = isArray; + + /** Used to match property names within property paths. */ + var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, + reIsPlainProp = /^\w*$/; + + /** + * Checks if `value` is a property name and not a property path. + * + * @private + * @param {*} value The value to check. + * @param {Object} [object] The object to query keys on. + * @returns {boolean} Returns `true` if `value` is a property name, else `false`. + */ + function isKey(value, object) { + if (isArray_1(value)) { + return false; + } + var type = typeof value; + if (type == 'number' || type == 'symbol' || type == 'boolean' || + value == null || isSymbol_1(value)) { + return true; + } + return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || + (object != null && value in Object(object)); + } + + var _isKey = isKey; + + /** `Object#toString` result references. */ + var asyncTag = '[object AsyncFunction]', + funcTag = '[object Function]', + genTag = '[object GeneratorFunction]', + proxyTag = '[object Proxy]'; + + /** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a function, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ + function isFunction(value) { + if (!isObject_1(value)) { + return false; + } + // The use of `Object#toString` avoids issues with the `typeof` operator + // in Safari 9 which returns 'object' for typed arrays and other constructors. + var tag = _baseGetTag(value); + return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; + } + + var isFunction_1 = isFunction; + + /** Used to detect overreaching core-js shims. */ + var coreJsData = _root['__core-js_shared__']; + + var _coreJsData = coreJsData; + + /** Used to detect methods masquerading as native. */ + var maskSrcKey = (function() { + var uid = /[^.]+$/.exec(_coreJsData && _coreJsData.keys && _coreJsData.keys.IE_PROTO || ''); + return uid ? ('Symbol(src)_1.' + uid) : ''; + }()); + + /** + * Checks if `func` has its source masked. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` is masked, else `false`. + */ + function isMasked(func) { + return !!maskSrcKey && (maskSrcKey in func); + } + + var _isMasked = isMasked; + + /** Used for built-in method references. */ + var funcProto$1 = Function.prototype; + + /** Used to resolve the decompiled source of functions. */ + var funcToString$1 = funcProto$1.toString; + + /** + * Converts `func` to its source code. + * + * @private + * @param {Function} func The function to convert. + * @returns {string} Returns the source code. + */ + function toSource(func) { + if (func != null) { + try { + return funcToString$1.call(func); + } catch (e) {} + try { + return (func + ''); + } catch (e) {} + } + return ''; + } + + var _toSource = toSource; + + /** + * Used to match `RegExp` + * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). + */ + var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; + + /** Used to detect host constructors (Safari). */ + var reIsHostCtor = /^\[object .+?Constructor\]$/; + + /** Used for built-in method references. */ + var funcProto = Function.prototype, + objectProto$3 = Object.prototype; + + /** Used to resolve the decompiled source of functions. */ + var funcToString = funcProto.toString; + + /** Used to check objects for own properties. */ + var hasOwnProperty$3 = objectProto$3.hasOwnProperty; + + /** Used to detect if a method is native. */ + var reIsNative = RegExp('^' + + funcToString.call(hasOwnProperty$3).replace(reRegExpChar, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' + ); + + /** + * The base implementation of `_.isNative` without bad shim checks. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, + * else `false`. + */ + function baseIsNative(value) { + if (!isObject_1(value) || _isMasked(value)) { + return false; + } + var pattern = isFunction_1(value) ? reIsNative : reIsHostCtor; + return pattern.test(_toSource(value)); + } + + var _baseIsNative = baseIsNative; + + /** + * Gets the value at `key` of `object`. + * + * @private + * @param {Object} [object] The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ + function getValue$1(object, key) { + return object == null ? undefined : object[key]; + } + + var _getValue = getValue$1; + + /** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ + function getNative(object, key) { + var value = _getValue(object, key); + return _baseIsNative(value) ? value : undefined; + } + + var _getNative = getNative; + + /* Built-in method references that are verified to be native. */ + var nativeCreate = _getNative(Object, 'create'); + + var _nativeCreate = nativeCreate; + + /** + * Removes all key-value entries from the hash. + * + * @private + * @name clear + * @memberOf Hash + */ + function hashClear() { + this.__data__ = _nativeCreate ? _nativeCreate(null) : {}; + this.size = 0; + } + + var _hashClear = hashClear; + + /** + * Removes `key` and its value from the hash. + * + * @private + * @name delete + * @memberOf Hash + * @param {Object} hash The hash to modify. + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function hashDelete(key) { + var result = this.has(key) && delete this.__data__[key]; + this.size -= result ? 1 : 0; + return result; + } + + var _hashDelete = hashDelete; + + /** Used to stand-in for `undefined` hash values. */ + var HASH_UNDEFINED$1 = '__lodash_hash_undefined__'; + + /** Used for built-in method references. */ + var objectProto$2 = Object.prototype; + + /** Used to check objects for own properties. */ + var hasOwnProperty$2 = objectProto$2.hasOwnProperty; + + /** + * Gets the hash value for `key`. + * + * @private + * @name get + * @memberOf Hash + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function hashGet(key) { + var data = this.__data__; + if (_nativeCreate) { + var result = data[key]; + return result === HASH_UNDEFINED$1 ? undefined : result; + } + return hasOwnProperty$2.call(data, key) ? data[key] : undefined; + } + + var _hashGet = hashGet; + + /** Used for built-in method references. */ + var objectProto$1 = Object.prototype; + + /** Used to check objects for own properties. */ + var hasOwnProperty$1 = objectProto$1.hasOwnProperty; + + /** + * Checks if a hash value for `key` exists. + * + * @private + * @name has + * @memberOf Hash + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function hashHas(key) { + var data = this.__data__; + return _nativeCreate ? (data[key] !== undefined) : hasOwnProperty$1.call(data, key); + } + + var _hashHas = hashHas; + + /** Used to stand-in for `undefined` hash values. */ + var HASH_UNDEFINED = '__lodash_hash_undefined__'; + + /** + * Sets the hash `key` to `value`. + * + * @private + * @name set + * @memberOf Hash + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the hash instance. + */ + function hashSet(key, value) { + var data = this.__data__; + this.size += this.has(key) ? 0 : 1; + data[key] = (_nativeCreate && value === undefined) ? HASH_UNDEFINED : value; + return this; + } + + var _hashSet = hashSet; + + /** + * Creates a hash object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function Hash(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + + // Add methods to `Hash`. + Hash.prototype.clear = _hashClear; + Hash.prototype['delete'] = _hashDelete; + Hash.prototype.get = _hashGet; + Hash.prototype.has = _hashHas; + Hash.prototype.set = _hashSet; + + var _Hash = Hash; + + /** + * Removes all key-value entries from the list cache. + * + * @private + * @name clear + * @memberOf ListCache + */ + function listCacheClear() { + this.__data__ = []; + this.size = 0; + } + + var _listCacheClear = listCacheClear; + + /** + * Performs a + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * comparison between two values to determine if they are equivalent. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; + * + * _.eq(object, object); + * // => true + * + * _.eq(object, other); + * // => false + * + * _.eq('a', 'a'); + * // => true + * + * _.eq('a', Object('a')); + * // => false + * + * _.eq(NaN, NaN); + * // => true + */ + function eq(value, other) { + return value === other || (value !== value && other !== other); + } + + var eq_1 = eq; + + /** + * Gets the index at which the `key` is found in `array` of key-value pairs. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} key The key to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function assocIndexOf(array, key) { + var length = array.length; + while (length--) { + if (eq_1(array[length][0], key)) { + return length; + } + } + return -1; + } + + var _assocIndexOf = assocIndexOf; + + /** Used for built-in method references. */ + var arrayProto = Array.prototype; + + /** Built-in value references. */ + var splice = arrayProto.splice; + + /** + * Removes `key` and its value from the list cache. + * + * @private + * @name delete + * @memberOf ListCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function listCacheDelete(key) { + var data = this.__data__, + index = _assocIndexOf(data, key); + + if (index < 0) { + return false; + } + var lastIndex = data.length - 1; + if (index == lastIndex) { + data.pop(); + } else { + splice.call(data, index, 1); + } + --this.size; + return true; + } + + var _listCacheDelete = listCacheDelete; + + /** + * Gets the list cache value for `key`. + * + * @private + * @name get + * @memberOf ListCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function listCacheGet(key) { + var data = this.__data__, + index = _assocIndexOf(data, key); + + return index < 0 ? undefined : data[index][1]; + } + + var _listCacheGet = listCacheGet; + + /** + * Checks if a list cache value for `key` exists. + * + * @private + * @name has + * @memberOf ListCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function listCacheHas(key) { + return _assocIndexOf(this.__data__, key) > -1; + } + + var _listCacheHas = listCacheHas; + + /** + * Sets the list cache `key` to `value`. + * + * @private + * @name set + * @memberOf ListCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the list cache instance. + */ + function listCacheSet(key, value) { + var data = this.__data__, + index = _assocIndexOf(data, key); + + if (index < 0) { + ++this.size; + data.push([key, value]); + } else { + data[index][1] = value; + } + return this; + } + + var _listCacheSet = listCacheSet; + + /** + * Creates an list cache object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function ListCache(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + + // Add methods to `ListCache`. + ListCache.prototype.clear = _listCacheClear; + ListCache.prototype['delete'] = _listCacheDelete; + ListCache.prototype.get = _listCacheGet; + ListCache.prototype.has = _listCacheHas; + ListCache.prototype.set = _listCacheSet; + + var _ListCache = ListCache; + + /* Built-in method references that are verified to be native. */ + var Map$1 = _getNative(_root, 'Map'); + + var _Map = Map$1; + + /** + * Removes all key-value entries from the map. + * + * @private + * @name clear + * @memberOf MapCache + */ + function mapCacheClear() { + this.size = 0; + this.__data__ = { + 'hash': new _Hash, + 'map': new (_Map || _ListCache), + 'string': new _Hash + }; + } + + var _mapCacheClear = mapCacheClear; + + /** + * Checks if `value` is suitable for use as unique object key. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is suitable, else `false`. + */ + function isKeyable(value) { + var type = typeof value; + return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') + ? (value !== '__proto__') + : (value === null); + } + + var _isKeyable = isKeyable; + + /** + * Gets the data for `map`. + * + * @private + * @param {Object} map The map to query. + * @param {string} key The reference key. + * @returns {*} Returns the map data. + */ + function getMapData(map, key) { + var data = map.__data__; + return _isKeyable(key) + ? data[typeof key == 'string' ? 'string' : 'hash'] + : data.map; + } + + var _getMapData = getMapData; + + /** + * Removes `key` and its value from the map. + * + * @private + * @name delete + * @memberOf MapCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function mapCacheDelete(key) { + var result = _getMapData(this, key)['delete'](key); + this.size -= result ? 1 : 0; + return result; + } + + var _mapCacheDelete = mapCacheDelete; + + /** + * Gets the map value for `key`. + * + * @private + * @name get + * @memberOf MapCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function mapCacheGet(key) { + return _getMapData(this, key).get(key); + } + + var _mapCacheGet = mapCacheGet; + + /** + * Checks if a map value for `key` exists. + * + * @private + * @name has + * @memberOf MapCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function mapCacheHas(key) { + return _getMapData(this, key).has(key); + } + + var _mapCacheHas = mapCacheHas; + + /** + * Sets the map `key` to `value`. + * + * @private + * @name set + * @memberOf MapCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the map cache instance. + */ + function mapCacheSet(key, value) { + var data = _getMapData(this, key), + size = data.size; + + data.set(key, value); + this.size += data.size == size ? 0 : 1; + return this; + } + + var _mapCacheSet = mapCacheSet; + + /** + * Creates a map cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function MapCache(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + + // Add methods to `MapCache`. + MapCache.prototype.clear = _mapCacheClear; + MapCache.prototype['delete'] = _mapCacheDelete; + MapCache.prototype.get = _mapCacheGet; + MapCache.prototype.has = _mapCacheHas; + MapCache.prototype.set = _mapCacheSet; + + var _MapCache = MapCache; + + /** Error message constants. */ + var FUNC_ERROR_TEXT = 'Expected a function'; + + /** + * Creates a function that memoizes the result of `func`. If `resolver` is + * provided, it determines the cache key for storing the result based on the + * arguments provided to the memoized function. By default, the first argument + * provided to the memoized function is used as the map cache key. The `func` + * is invoked with the `this` binding of the memoized function. + * + * **Note:** The cache is exposed as the `cache` property on the memoized + * function. Its creation may be customized by replacing the `_.memoize.Cache` + * constructor with one whose instances implement the + * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) + * method interface of `clear`, `delete`, `get`, `has`, and `set`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to have its output memoized. + * @param {Function} [resolver] The function to resolve the cache key. + * @returns {Function} Returns the new memoized function. + * @example + * + * var object = { 'a': 1, 'b': 2 }; + * var other = { 'c': 3, 'd': 4 }; + * + * var values = _.memoize(_.values); + * values(object); + * // => [1, 2] + * + * values(other); + * // => [3, 4] + * + * object.a = 2; + * values(object); + * // => [1, 2] + * + * // Modify the result cache. + * values.cache.set(object, ['a', 'b']); + * values(object); + * // => ['a', 'b'] + * + * // Replace `_.memoize.Cache`. + * _.memoize.Cache = WeakMap; + */ + function memoize(func, resolver) { + if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) { + throw new TypeError(FUNC_ERROR_TEXT); + } + var memoized = function() { + var args = arguments, + key = resolver ? resolver.apply(this, args) : args[0], + cache = memoized.cache; + + if (cache.has(key)) { + return cache.get(key); + } + var result = func.apply(this, args); + memoized.cache = cache.set(key, result) || cache; + return result; + }; + memoized.cache = new (memoize.Cache || _MapCache); + return memoized; + } + + // Expose `MapCache`. + memoize.Cache = _MapCache; + + var memoize_1 = memoize; + + /** Used as the maximum memoize cache size. */ + var MAX_MEMOIZE_SIZE = 500; + + /** + * A specialized version of `_.memoize` which clears the memoized function's + * cache when it exceeds `MAX_MEMOIZE_SIZE`. + * + * @private + * @param {Function} func The function to have its output memoized. + * @returns {Function} Returns the new memoized function. + */ + function memoizeCapped(func) { + var result = memoize_1(func, function(key) { + if (cache.size === MAX_MEMOIZE_SIZE) { + cache.clear(); + } + return key; + }); + + var cache = result.cache; + return result; + } + + var _memoizeCapped = memoizeCapped; + + /** Used to match property names within property paths. */ + var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; + + /** Used to match backslashes in property paths. */ + var reEscapeChar = /\\(\\)?/g; + + /** + * Converts `string` to a property path array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the property path array. + */ + var stringToPath = _memoizeCapped(function(string) { + var result = []; + if (string.charCodeAt(0) === 46 /* . */) { + result.push(''); + } + string.replace(rePropName, function(match, number, quote, subString) { + result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match)); + }); + return result; + }); + + var _stringToPath = stringToPath; + + /** + * A specialized version of `_.map` for arrays without support for iteratee + * shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + */ + function arrayMap(array, iteratee) { + var index = -1, + length = array == null ? 0 : array.length, + result = Array(length); + + while (++index < length) { + result[index] = iteratee(array[index], index, array); + } + return result; + } + + var _arrayMap = arrayMap; + + /** Used as references for various `Number` constants. */ + var INFINITY$1 = 1 / 0; + + /** Used to convert symbols to primitives and strings. */ + var symbolProto = _Symbol ? _Symbol.prototype : undefined, + symbolToString = symbolProto ? symbolProto.toString : undefined; + + /** + * The base implementation of `_.toString` which doesn't convert nullish + * values to empty strings. + * + * @private + * @param {*} value The value to process. + * @returns {string} Returns the string. + */ + function baseToString(value) { + // Exit early for strings to avoid a performance hit in some environments. + if (typeof value == 'string') { + return value; + } + if (isArray_1(value)) { + // Recursively convert values (susceptible to call stack limits). + return _arrayMap(value, baseToString) + ''; + } + if (isSymbol_1(value)) { + return symbolToString ? symbolToString.call(value) : ''; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY$1) ? '-0' : result; + } + + var _baseToString = baseToString; + + /** + * Converts `value` to a string. An empty string is returned for `null` + * and `undefined` values. The sign of `-0` is preserved. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + * @example + * + * _.toString(null); + * // => '' + * + * _.toString(-0); + * // => '-0' + * + * _.toString([1, 2, 3]); + * // => '1,2,3' + */ + function toString$1(value) { + return value == null ? '' : _baseToString(value); + } + + var toString_1 = toString$1; + + /** + * Casts `value` to a path array if it's not one. + * + * @private + * @param {*} value The value to inspect. + * @param {Object} [object] The object to query keys on. + * @returns {Array} Returns the cast property path array. + */ + function castPath(value, object) { + if (isArray_1(value)) { + return value; + } + return _isKey(value, object) ? [value] : _stringToPath(toString_1(value)); + } + + var _castPath = castPath; + + /** Used as references for various `Number` constants. */ + var INFINITY = 1 / 0; + + /** + * Converts `value` to a string key if it's not a string or symbol. + * + * @private + * @param {*} value The value to inspect. + * @returns {string|symbol} Returns the key. + */ + function toKey(value) { + if (typeof value == 'string' || isSymbol_1(value)) { + return value; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; + } + + var _toKey = toKey; + + /** + * The base implementation of `_.get` without support for default values. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @returns {*} Returns the resolved value. + */ + function baseGet(object, path) { + path = _castPath(path, object); + + var index = 0, + length = path.length; + + while (object != null && index < length) { + object = object[_toKey(path[index++])]; + } + return (index && index == length) ? object : undefined; + } + + var _baseGet = baseGet; + + /** + * Gets the value at `path` of `object`. If the resolved value is + * `undefined`, the `defaultValue` is returned in its place. + * + * @static + * @memberOf _ + * @since 3.7.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @param {*} [defaultValue] The value returned for `undefined` resolved values. + * @returns {*} Returns the resolved value. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.get(object, 'a[0].b.c'); + * // => 3 + * + * _.get(object, ['a', '0', 'b', 'c']); + * // => 3 + * + * _.get(object, 'a.b.c', 'default'); + * // => 'default' + */ + function get(object, path, defaultValue) { + var result = object == null ? undefined : _baseGet(object, path); + return result === undefined ? defaultValue : result; + } + + var get_1 = get; + + var defineProperty = (function() { + try { + var func = _getNative(Object, 'defineProperty'); + func({}, '', {}); + return func; + } catch (e) {} + }()); + + var _defineProperty = defineProperty; + + /** + * The base implementation of `assignValue` and `assignMergeValue` without + * value checks. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ + function baseAssignValue(object, key, value) { + if (key == '__proto__' && _defineProperty) { + _defineProperty(object, key, { + 'configurable': true, + 'enumerable': true, + 'value': value, + 'writable': true + }); + } else { + object[key] = value; + } + } + + var _baseAssignValue = baseAssignValue; + + /** Used for built-in method references. */ + var objectProto = Object.prototype; + + /** Used to check objects for own properties. */ + var hasOwnProperty = objectProto.hasOwnProperty; + + /** + * Assigns `value` to `key` of `object` if the existing value is not equivalent + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ + function assignValue(object, key, value) { + var objValue = object[key]; + if (!(hasOwnProperty.call(object, key) && eq_1(objValue, value)) || + (value === undefined && !(key in object))) { + _baseAssignValue(object, key, value); + } + } + + var _assignValue = assignValue; + + /** Used as references for various `Number` constants. */ + var MAX_SAFE_INTEGER = 9007199254740991; + + /** Used to detect unsigned integer values. */ + var reIsUint = /^(?:0|[1-9]\d*)$/; + + /** + * Checks if `value` is a valid array-like index. + * + * @private + * @param {*} value The value to check. + * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. + * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. + */ + function isIndex(value, length) { + var type = typeof value; + length = length == null ? MAX_SAFE_INTEGER : length; + + return !!length && + (type == 'number' || + (type != 'symbol' && reIsUint.test(value))) && + (value > -1 && value % 1 == 0 && value < length); + } + + var _isIndex = isIndex; + + /** + * The base implementation of `_.set`. + * + * @private + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {*} value The value to set. + * @param {Function} [customizer] The function to customize path creation. + * @returns {Object} Returns `object`. + */ + function baseSet(object, path, value, customizer) { + if (!isObject_1(object)) { + return object; + } + path = _castPath(path, object); + + var index = -1, + length = path.length, + lastIndex = length - 1, + nested = object; + + while (nested != null && ++index < length) { + var key = _toKey(path[index]), + newValue = value; + + if (key === '__proto__' || key === 'constructor' || key === 'prototype') { + return object; + } + + if (index != lastIndex) { + var objValue = nested[key]; + newValue = customizer ? customizer(objValue, key, nested) : undefined; + if (newValue === undefined) { + newValue = isObject_1(objValue) + ? objValue + : (_isIndex(path[index + 1]) ? [] : {}); + } + } + _assignValue(nested, key, newValue); + nested = nested[key]; + } + return object; + } + + var _baseSet = baseSet; + + /** + * Sets the value at `path` of `object`. If a portion of `path` doesn't exist, + * it's created. Arrays are created for missing index properties while objects + * are created for all other missing properties. Use `_.setWith` to customize + * `path` creation. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 3.7.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {*} value The value to set. + * @returns {Object} Returns `object`. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.set(object, 'a[0].b.c', 4); + * console.log(object.a[0].b.c); + * // => 4 + * + * _.set(object, ['x', '0', 'y', 'z'], 5); + * console.log(object.x[0].y.z); + * // => 5 + */ + function set(object, path, value) { + return object == null ? object : _baseSet(object, path, value); + } + + var set_1 = set; + + /** + * Copies the values of `source` to `array`. + * + * @private + * @param {Array} source The array to copy values from. + * @param {Array} [array=[]] The array to copy values to. + * @returns {Array} Returns `array`. + */ + function copyArray(source, array) { + var index = -1, + length = source.length; + + array || (array = Array(length)); + while (++index < length) { + array[index] = source[index]; + } + return array; + } + + var _copyArray = copyArray; + + /** + * Converts `value` to a property path array. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Util + * @param {*} value The value to convert. + * @returns {Array} Returns the new property path array. + * @example + * + * _.toPath('a.b.c'); + * // => ['a', 'b', 'c'] + * + * _.toPath('a[0].b.c'); + * // => ['a', '0', 'b', 'c'] + */ + function toPath(value) { + if (isArray_1(value)) { + return _arrayMap(value, _toKey); + } + return isSymbol_1(value) ? [value] : _copyArray(_stringToPath(toString_1(value))); + } + + var toPath_1 = toPath; + + var define$2 = { + // access data field + data: function data(params) { + var defaults = { + field: 'data', + bindingEvent: 'data', + allowBinding: false, + allowSetting: false, + allowGetting: false, + settingEvent: 'data', + settingTriggersEvent: false, + triggerFnName: 'trigger', + immutableKeys: {}, + // key => true if immutable + updateStyle: false, + beforeGet: function beforeGet(self) {}, + beforeSet: function beforeSet(self, obj) {}, + onSet: function onSet(self) {}, + canSet: function canSet(self) { + return true; + } + }; + params = extend({}, defaults, params); + return function dataImpl(name, value) { + var p = params; + var self = this; + var selfIsArrayLike = self.length !== undefined; + var all = selfIsArrayLike ? self : [self]; // put in array if not array-like + + var single = selfIsArrayLike ? self[0] : self; // .data('foo', ...) + + if (string(name)) { + // set or get property + var isPathLike = name.indexOf('.') !== -1; // there might be a normal field with a dot + + var path = isPathLike && toPath_1(name); // .data('foo') + + if (p.allowGetting && value === undefined) { + // get + var ret; + + if (single) { + p.beforeGet(single); // check if it's path and a field with the same name doesn't exist + + if (path && single._private[p.field][name] === undefined) { + ret = get_1(single._private[p.field], path); + } else { + ret = single._private[p.field][name]; + } + } + + return ret; // .data('foo', 'bar') + } else if (p.allowSetting && value !== undefined) { + // set + var valid = !p.immutableKeys[name]; + + if (valid) { + var change = _defineProperty$1({}, name, value); + + p.beforeSet(self, change); + + for (var i = 0, l = all.length; i < l; i++) { + var ele = all[i]; + + if (p.canSet(ele)) { + if (path && single._private[p.field][name] === undefined) { + set_1(ele._private[p.field], path, value); + } else { + ele._private[p.field][name] = value; + } + } + } // update mappers if asked + + + if (p.updateStyle) { + self.updateStyle(); + } // call onSet callback + + + p.onSet(self); + + if (p.settingTriggersEvent) { + self[p.triggerFnName](p.settingEvent); + } + } + } // .data({ 'foo': 'bar' }) + + } else if (p.allowSetting && plainObject(name)) { + // extend + var obj = name; + var k, v; + var keys = Object.keys(obj); + p.beforeSet(self, obj); + + for (var _i = 0; _i < keys.length; _i++) { + k = keys[_i]; + v = obj[k]; + + var _valid = !p.immutableKeys[k]; + + if (_valid) { + for (var j = 0; j < all.length; j++) { + var _ele = all[j]; + + if (p.canSet(_ele)) { + _ele._private[p.field][k] = v; + } + } + } + } // update mappers if asked + + + if (p.updateStyle) { + self.updateStyle(); + } // call onSet callback + + + p.onSet(self); + + if (p.settingTriggersEvent) { + self[p.triggerFnName](p.settingEvent); + } // .data(function(){ ... }) + + } else if (p.allowBinding && fn$6(name)) { + // bind to event + var fn = name; + self.on(p.bindingEvent, fn); // .data() + } else if (p.allowGetting && name === undefined) { + // get whole object + var _ret; + + if (single) { + p.beforeGet(single); + _ret = single._private[p.field]; + } + + return _ret; + } + + return self; // maintain chainability + }; // function + }, + // data + // remove data field + removeData: function removeData(params) { + var defaults = { + field: 'data', + event: 'data', + triggerFnName: 'trigger', + triggerEvent: false, + immutableKeys: {} // key => true if immutable + + }; + params = extend({}, defaults, params); + return function removeDataImpl(names) { + var p = params; + var self = this; + var selfIsArrayLike = self.length !== undefined; + var all = selfIsArrayLike ? self : [self]; // put in array if not array-like + // .removeData('foo bar') + + if (string(names)) { + // then get the list of keys, and delete them + var keys = names.split(/\s+/); + var l = keys.length; + + for (var i = 0; i < l; i++) { + // delete each non-empty key + var key = keys[i]; + + if (emptyString(key)) { + continue; + } + + var valid = !p.immutableKeys[key]; // not valid if immutable + + if (valid) { + for (var i_a = 0, l_a = all.length; i_a < l_a; i_a++) { + all[i_a]._private[p.field][key] = undefined; + } + } + } + + if (p.triggerEvent) { + self[p.triggerFnName](p.event); + } // .removeData() + + } else if (names === undefined) { + // then delete all keys + for (var _i_a = 0, _l_a = all.length; _i_a < _l_a; _i_a++) { + var _privateFields = all[_i_a]._private[p.field]; + + var _keys = Object.keys(_privateFields); + + for (var _i2 = 0; _i2 < _keys.length; _i2++) { + var _key = _keys[_i2]; + var validKeyToDelete = !p.immutableKeys[_key]; + + if (validKeyToDelete) { + _privateFields[_key] = undefined; + } + } + } + + if (p.triggerEvent) { + self[p.triggerFnName](p.event); + } + } + + return self; // maintain chaining + }; // function + } // removeData + + }; // define + + var define$1 = { + eventAliasesOn: function eventAliasesOn(proto) { + var p = proto; + p.addListener = p.listen = p.bind = p.on; + p.unlisten = p.unbind = p.off = p.removeListener; + p.trigger = p.emit; // this is just a wrapper alias of .on() + + p.pon = p.promiseOn = function (events, selector) { + var self = this; + var args = Array.prototype.slice.call(arguments, 0); + return new Promise$1(function (resolve, reject) { + var callback = function callback(e) { + self.off.apply(self, offArgs); + resolve(e); + }; + + var onArgs = args.concat([callback]); + var offArgs = onArgs.concat([]); + self.on.apply(self, onArgs); + }); + }; + } + }; // define + + // use this module to cherry pick functions into your prototype + var define = {}; + [define$3, define$2, define$1].forEach(function (m) { + extend(define, m); + }); + + var elesfn$i = { + animate: define.animate(), + animation: define.animation(), + animated: define.animated(), + clearQueue: define.clearQueue(), + delay: define.delay(), + delayAnimation: define.delayAnimation(), + stop: define.stop() + }; + + var elesfn$h = { + classes: function classes(_classes) { + var self = this; + + if (_classes === undefined) { + var ret = []; + + self[0]._private.classes.forEach(function (cls) { + return ret.push(cls); + }); + + return ret; + } else if (!array(_classes)) { + // extract classes from string + _classes = (_classes || '').match(/\S+/g) || []; + } + + var changed = []; + var classesSet = new Set$1(_classes); // check and update each ele + + for (var j = 0; j < self.length; j++) { + var ele = self[j]; + var _p = ele._private; + var eleClasses = _p.classes; + var changedEle = false; // check if ele has all of the passed classes + + for (var i = 0; i < _classes.length; i++) { + var cls = _classes[i]; + var eleHasClass = eleClasses.has(cls); + + if (!eleHasClass) { + changedEle = true; + break; + } + } // check if ele has classes outside of those passed + + + if (!changedEle) { + changedEle = eleClasses.size !== _classes.length; + } + + if (changedEle) { + _p.classes = classesSet; + changed.push(ele); + } + } // trigger update style on those eles that had class changes + + + if (changed.length > 0) { + this.spawn(changed).updateStyle().emit('class'); + } + + return self; + }, + addClass: function addClass(classes) { + return this.toggleClass(classes, true); + }, + hasClass: function hasClass(className) { + var ele = this[0]; + return ele != null && ele._private.classes.has(className); + }, + toggleClass: function toggleClass(classes, toggle) { + if (!array(classes)) { + // extract classes from string + classes = classes.match(/\S+/g) || []; + } + + var self = this; + var toggleUndefd = toggle === undefined; + var changed = []; // eles who had classes changed + + for (var i = 0, il = self.length; i < il; i++) { + var ele = self[i]; + var eleClasses = ele._private.classes; + var changedEle = false; + + for (var j = 0; j < classes.length; j++) { + var cls = classes[j]; + var hasClass = eleClasses.has(cls); + var changedNow = false; + + if (toggle || toggleUndefd && !hasClass) { + eleClasses.add(cls); + changedNow = true; + } else if (!toggle || toggleUndefd && hasClass) { + eleClasses["delete"](cls); + changedNow = true; + } + + if (!changedEle && changedNow) { + changed.push(ele); + changedEle = true; + } + } // for j classes + + } // for i eles + // trigger update style on those eles that had class changes + + + if (changed.length > 0) { + this.spawn(changed).updateStyle().emit('class'); + } + + return self; + }, + removeClass: function removeClass(classes) { + return this.toggleClass(classes, false); + }, + flashClass: function flashClass(classes, duration) { + var self = this; + + if (duration == null) { + duration = 250; + } else if (duration === 0) { + return self; // nothing to do really + } + + self.addClass(classes); + setTimeout(function () { + self.removeClass(classes); + }, duration); + return self; + } + }; + elesfn$h.className = elesfn$h.classNames = elesfn$h.classes; + + var tokens = { + metaChar: '[\\!\\"\\#\\$\\%\\&\\\'\\(\\)\\*\\+\\,\\.\\/\\:\\;\\<\\=\\>\\?\\@\\[\\]\\^\\`\\{\\|\\}\\~]', + // chars we need to escape in let names, etc + comparatorOp: '=|\\!=|>|>=|<|<=|\\$=|\\^=|\\*=', + // binary comparison op (used in data selectors) + boolOp: '\\?|\\!|\\^', + // boolean (unary) operators (used in data selectors) + string: '"(?:\\\\"|[^"])*"' + '|' + "'(?:\\\\'|[^'])*'", + // string literals (used in data selectors) -- doublequotes | singlequotes + number: number, + // number literal (used in data selectors) --- e.g. 0.1234, 1234, 12e123 + meta: 'degree|indegree|outdegree', + // allowed metadata fields (i.e. allowed functions to use from Collection) + separator: '\\s*,\\s*', + // queries are separated by commas, e.g. edge[foo = 'bar'], node.someClass + descendant: '\\s+', + child: '\\s+>\\s+', + subject: '\\$', + group: 'node|edge|\\*', + directedEdge: '\\s+->\\s+', + undirectedEdge: '\\s+<->\\s+' + }; + tokens.variable = '(?:[\\w-.]|(?:\\\\' + tokens.metaChar + '))+'; // a variable name can have letters, numbers, dashes, and periods + + tokens.className = '(?:[\\w-]|(?:\\\\' + tokens.metaChar + '))+'; // a class name has the same rules as a variable except it can't have a '.' in the name + + tokens.value = tokens.string + '|' + tokens.number; // a value literal, either a string or number + + tokens.id = tokens.variable; // an element id (follows variable conventions) + + (function () { + var ops, op, i; // add @ variants to comparatorOp + + ops = tokens.comparatorOp.split('|'); + + for (i = 0; i < ops.length; i++) { + op = ops[i]; + tokens.comparatorOp += '|@' + op; + } // add ! variants to comparatorOp + + + ops = tokens.comparatorOp.split('|'); + + for (i = 0; i < ops.length; i++) { + op = ops[i]; + + if (op.indexOf('!') >= 0) { + continue; + } // skip ops that explicitly contain ! + + + if (op === '=') { + continue; + } // skip = b/c != is explicitly defined + + + tokens.comparatorOp += '|\\!' + op; + } + })(); + + /** + * Make a new query object + * + * @prop type {Type} The type enum (int) of the query + * @prop checks List of checks to make against an ele to test for a match + */ + var newQuery = function newQuery() { + return { + checks: [] + }; + }; + + /** + * A check type enum-like object. Uses integer values for fast match() lookup. + * The ordering does not matter as long as the ints are unique. + */ + var Type = { + /** E.g. node */ + GROUP: 0, + + /** A collection of elements */ + COLLECTION: 1, + + /** A filter(ele) function */ + FILTER: 2, + + /** E.g. [foo > 1] */ + DATA_COMPARE: 3, + + /** E.g. [foo] */ + DATA_EXIST: 4, + + /** E.g. [?foo] */ + DATA_BOOL: 5, + + /** E.g. [[degree > 2]] */ + META_COMPARE: 6, + + /** E.g. :selected */ + STATE: 7, + + /** E.g. #foo */ + ID: 8, + + /** E.g. .foo */ + CLASS: 9, + + /** E.g. #foo <-> #bar */ + UNDIRECTED_EDGE: 10, + + /** E.g. #foo -> #bar */ + DIRECTED_EDGE: 11, + + /** E.g. $#foo -> #bar */ + NODE_SOURCE: 12, + + /** E.g. #foo -> $#bar */ + NODE_TARGET: 13, + + /** E.g. $#foo <-> #bar */ + NODE_NEIGHBOR: 14, + + /** E.g. #foo > #bar */ + CHILD: 15, + + /** E.g. #foo #bar */ + DESCENDANT: 16, + + /** E.g. $#foo > #bar */ + PARENT: 17, + + /** E.g. $#foo #bar */ + ANCESTOR: 18, + + /** E.g. #foo > $bar > #baz */ + COMPOUND_SPLIT: 19, + + /** Always matches, useful placeholder for subject in `COMPOUND_SPLIT` */ + TRUE: 20 + }; + + var stateSelectors = [{ + selector: ':selected', + matches: function matches(ele) { + return ele.selected(); + } + }, { + selector: ':unselected', + matches: function matches(ele) { + return !ele.selected(); + } + }, { + selector: ':selectable', + matches: function matches(ele) { + return ele.selectable(); + } + }, { + selector: ':unselectable', + matches: function matches(ele) { + return !ele.selectable(); + } + }, { + selector: ':locked', + matches: function matches(ele) { + return ele.locked(); + } + }, { + selector: ':unlocked', + matches: function matches(ele) { + return !ele.locked(); + } + }, { + selector: ':visible', + matches: function matches(ele) { + return ele.visible(); + } + }, { + selector: ':hidden', + matches: function matches(ele) { + return !ele.visible(); + } + }, { + selector: ':transparent', + matches: function matches(ele) { + return ele.transparent(); + } + }, { + selector: ':grabbed', + matches: function matches(ele) { + return ele.grabbed(); + } + }, { + selector: ':free', + matches: function matches(ele) { + return !ele.grabbed(); + } + }, { + selector: ':removed', + matches: function matches(ele) { + return ele.removed(); + } + }, { + selector: ':inside', + matches: function matches(ele) { + return !ele.removed(); + } + }, { + selector: ':grabbable', + matches: function matches(ele) { + return ele.grabbable(); + } + }, { + selector: ':ungrabbable', + matches: function matches(ele) { + return !ele.grabbable(); + } + }, { + selector: ':animated', + matches: function matches(ele) { + return ele.animated(); + } + }, { + selector: ':unanimated', + matches: function matches(ele) { + return !ele.animated(); + } + }, { + selector: ':parent', + matches: function matches(ele) { + return ele.isParent(); + } + }, { + selector: ':childless', + matches: function matches(ele) { + return ele.isChildless(); + } + }, { + selector: ':child', + matches: function matches(ele) { + return ele.isChild(); + } + }, { + selector: ':orphan', + matches: function matches(ele) { + return ele.isOrphan(); + } + }, { + selector: ':nonorphan', + matches: function matches(ele) { + return ele.isChild(); + } + }, { + selector: ':compound', + matches: function matches(ele) { + if (ele.isNode()) { + return ele.isParent(); + } else { + return ele.source().isParent() || ele.target().isParent(); + } + } + }, { + selector: ':loop', + matches: function matches(ele) { + return ele.isLoop(); + } + }, { + selector: ':simple', + matches: function matches(ele) { + return ele.isSimple(); + } + }, { + selector: ':active', + matches: function matches(ele) { + return ele.active(); + } + }, { + selector: ':inactive', + matches: function matches(ele) { + return !ele.active(); + } + }, { + selector: ':backgrounding', + matches: function matches(ele) { + return ele.backgrounding(); + } + }, { + selector: ':nonbackgrounding', + matches: function matches(ele) { + return !ele.backgrounding(); + } + }].sort(function (a, b) { + // n.b. selectors that are starting substrings of others must have the longer ones first + return descending(a.selector, b.selector); + }); + + var lookup = function () { + var selToFn = {}; + var s; + + for (var i = 0; i < stateSelectors.length; i++) { + s = stateSelectors[i]; + selToFn[s.selector] = s.matches; + } + + return selToFn; + }(); + + var stateSelectorMatches = function stateSelectorMatches(sel, ele) { + return lookup[sel](ele); + }; + var stateSelectorRegex = '(' + stateSelectors.map(function (s) { + return s.selector; + }).join('|') + ')'; + + // so that values get compared properly in Selector.filter() + + var cleanMetaChars = function cleanMetaChars(str) { + return str.replace(new RegExp('\\\\(' + tokens.metaChar + ')', 'g'), function (match, $1) { + return $1; + }); + }; + + var replaceLastQuery = function replaceLastQuery(selector, examiningQuery, replacementQuery) { + selector[selector.length - 1] = replacementQuery; + }; // NOTE: add new expression syntax here to have it recognised by the parser; + // - a query contains all adjacent (i.e. no separator in between) expressions; + // - the current query is stored in selector[i] + // - you need to check the query objects in match() for it actually filter properly, but that's pretty straight forward + + + var exprs = [{ + name: 'group', + // just used for identifying when debugging + query: true, + regex: '(' + tokens.group + ')', + populate: function populate(selector, query, _ref) { + var _ref2 = _slicedToArray(_ref, 1), + group = _ref2[0]; + + query.checks.push({ + type: Type.GROUP, + value: group === '*' ? group : group + 's' + }); + } + }, { + name: 'state', + query: true, + regex: stateSelectorRegex, + populate: function populate(selector, query, _ref3) { + var _ref4 = _slicedToArray(_ref3, 1), + state = _ref4[0]; + + query.checks.push({ + type: Type.STATE, + value: state + }); + } + }, { + name: 'id', + query: true, + regex: '\\#(' + tokens.id + ')', + populate: function populate(selector, query, _ref5) { + var _ref6 = _slicedToArray(_ref5, 1), + id = _ref6[0]; + + query.checks.push({ + type: Type.ID, + value: cleanMetaChars(id) + }); + } + }, { + name: 'className', + query: true, + regex: '\\.(' + tokens.className + ')', + populate: function populate(selector, query, _ref7) { + var _ref8 = _slicedToArray(_ref7, 1), + className = _ref8[0]; + + query.checks.push({ + type: Type.CLASS, + value: cleanMetaChars(className) + }); + } + }, { + name: 'dataExists', + query: true, + regex: '\\[\\s*(' + tokens.variable + ')\\s*\\]', + populate: function populate(selector, query, _ref9) { + var _ref10 = _slicedToArray(_ref9, 1), + variable = _ref10[0]; + + query.checks.push({ + type: Type.DATA_EXIST, + field: cleanMetaChars(variable) + }); + } + }, { + name: 'dataCompare', + query: true, + regex: '\\[\\s*(' + tokens.variable + ')\\s*(' + tokens.comparatorOp + ')\\s*(' + tokens.value + ')\\s*\\]', + populate: function populate(selector, query, _ref11) { + var _ref12 = _slicedToArray(_ref11, 3), + variable = _ref12[0], + comparatorOp = _ref12[1], + value = _ref12[2]; + + var valueIsString = new RegExp('^' + tokens.string + '$').exec(value) != null; + + if (valueIsString) { + value = value.substring(1, value.length - 1); + } else { + value = parseFloat(value); + } + + query.checks.push({ + type: Type.DATA_COMPARE, + field: cleanMetaChars(variable), + operator: comparatorOp, + value: value + }); + } + }, { + name: 'dataBool', + query: true, + regex: '\\[\\s*(' + tokens.boolOp + ')\\s*(' + tokens.variable + ')\\s*\\]', + populate: function populate(selector, query, _ref13) { + var _ref14 = _slicedToArray(_ref13, 2), + boolOp = _ref14[0], + variable = _ref14[1]; + + query.checks.push({ + type: Type.DATA_BOOL, + field: cleanMetaChars(variable), + operator: boolOp + }); + } + }, { + name: 'metaCompare', + query: true, + regex: '\\[\\[\\s*(' + tokens.meta + ')\\s*(' + tokens.comparatorOp + ')\\s*(' + tokens.number + ')\\s*\\]\\]', + populate: function populate(selector, query, _ref15) { + var _ref16 = _slicedToArray(_ref15, 3), + meta = _ref16[0], + comparatorOp = _ref16[1], + number = _ref16[2]; + + query.checks.push({ + type: Type.META_COMPARE, + field: cleanMetaChars(meta), + operator: comparatorOp, + value: parseFloat(number) + }); + } + }, { + name: 'nextQuery', + separator: true, + regex: tokens.separator, + populate: function populate(selector, query) { + var currentSubject = selector.currentSubject; + var edgeCount = selector.edgeCount; + var compoundCount = selector.compoundCount; + var lastQ = selector[selector.length - 1]; + + if (currentSubject != null) { + lastQ.subject = currentSubject; + selector.currentSubject = null; + } + + lastQ.edgeCount = edgeCount; + lastQ.compoundCount = compoundCount; + selector.edgeCount = 0; + selector.compoundCount = 0; // go on to next query + + var nextQuery = selector[selector.length++] = newQuery(); + return nextQuery; // this is the new query to be filled by the following exprs + } + }, { + name: 'directedEdge', + separator: true, + regex: tokens.directedEdge, + populate: function populate(selector, query) { + if (selector.currentSubject == null) { + // undirected edge + var edgeQuery = newQuery(); + var source = query; + var target = newQuery(); + edgeQuery.checks.push({ + type: Type.DIRECTED_EDGE, + source: source, + target: target + }); // the query in the selector should be the edge rather than the source + + replaceLastQuery(selector, query, edgeQuery); + selector.edgeCount++; // we're now populating the target query with expressions that follow + + return target; + } else { + // source/target + var srcTgtQ = newQuery(); + var _source = query; + + var _target = newQuery(); + + srcTgtQ.checks.push({ + type: Type.NODE_SOURCE, + source: _source, + target: _target + }); // the query in the selector should be the neighbourhood rather than the node + + replaceLastQuery(selector, query, srcTgtQ); + selector.edgeCount++; + return _target; // now populating the target with the following expressions + } + } + }, { + name: 'undirectedEdge', + separator: true, + regex: tokens.undirectedEdge, + populate: function populate(selector, query) { + if (selector.currentSubject == null) { + // undirected edge + var edgeQuery = newQuery(); + var source = query; + var target = newQuery(); + edgeQuery.checks.push({ + type: Type.UNDIRECTED_EDGE, + nodes: [source, target] + }); // the query in the selector should be the edge rather than the source + + replaceLastQuery(selector, query, edgeQuery); + selector.edgeCount++; // we're now populating the target query with expressions that follow + + return target; + } else { + // neighbourhood + var nhoodQ = newQuery(); + var node = query; + var neighbor = newQuery(); + nhoodQ.checks.push({ + type: Type.NODE_NEIGHBOR, + node: node, + neighbor: neighbor + }); // the query in the selector should be the neighbourhood rather than the node + + replaceLastQuery(selector, query, nhoodQ); + return neighbor; // now populating the neighbor with following expressions + } + } + }, { + name: 'child', + separator: true, + regex: tokens.child, + populate: function populate(selector, query) { + if (selector.currentSubject == null) { + // default: child query + var parentChildQuery = newQuery(); + var child = newQuery(); + var parent = selector[selector.length - 1]; + parentChildQuery.checks.push({ + type: Type.CHILD, + parent: parent, + child: child + }); // the query in the selector should be the '>' itself + + replaceLastQuery(selector, query, parentChildQuery); + selector.compoundCount++; // we're now populating the child query with expressions that follow + + return child; + } else if (selector.currentSubject === query) { + // compound split query + var compound = newQuery(); + var left = selector[selector.length - 1]; + var right = newQuery(); + var subject = newQuery(); + + var _child = newQuery(); + + var _parent = newQuery(); // set up the root compound q + + + compound.checks.push({ + type: Type.COMPOUND_SPLIT, + left: left, + right: right, + subject: subject + }); // populate the subject and replace the q at the old spot (within left) with TRUE + + subject.checks = query.checks; // take the checks from the left + + query.checks = [{ + type: Type.TRUE + }]; // checks under left refs the subject implicitly + // set up the right q + + _parent.checks.push({ + type: Type.TRUE + }); // parent implicitly refs the subject + + + right.checks.push({ + type: Type.PARENT, + // type is swapped on right side queries + parent: _parent, + child: _child // empty for now + + }); + replaceLastQuery(selector, left, compound); // update the ref since we moved things around for `query` + + selector.currentSubject = subject; + selector.compoundCount++; + return _child; // now populating the right side's child + } else { + // parent query + // info for parent query + var _parent2 = newQuery(); + + var _child2 = newQuery(); + + var pcQChecks = [{ + type: Type.PARENT, + parent: _parent2, + child: _child2 + }]; // the parent-child query takes the place of the query previously being populated + + _parent2.checks = query.checks; // the previous query contains the checks for the parent + + query.checks = pcQChecks; // pc query takes over + + selector.compoundCount++; + return _child2; // we're now populating the child + } + } + }, { + name: 'descendant', + separator: true, + regex: tokens.descendant, + populate: function populate(selector, query) { + if (selector.currentSubject == null) { + // default: descendant query + var ancChQuery = newQuery(); + var descendant = newQuery(); + var ancestor = selector[selector.length - 1]; + ancChQuery.checks.push({ + type: Type.DESCENDANT, + ancestor: ancestor, + descendant: descendant + }); // the query in the selector should be the '>' itself + + replaceLastQuery(selector, query, ancChQuery); + selector.compoundCount++; // we're now populating the descendant query with expressions that follow + + return descendant; + } else if (selector.currentSubject === query) { + // compound split query + var compound = newQuery(); + var left = selector[selector.length - 1]; + var right = newQuery(); + var subject = newQuery(); + + var _descendant = newQuery(); + + var _ancestor = newQuery(); // set up the root compound q + + + compound.checks.push({ + type: Type.COMPOUND_SPLIT, + left: left, + right: right, + subject: subject + }); // populate the subject and replace the q at the old spot (within left) with TRUE + + subject.checks = query.checks; // take the checks from the left + + query.checks = [{ + type: Type.TRUE + }]; // checks under left refs the subject implicitly + // set up the right q + + _ancestor.checks.push({ + type: Type.TRUE + }); // ancestor implicitly refs the subject + + + right.checks.push({ + type: Type.ANCESTOR, + // type is swapped on right side queries + ancestor: _ancestor, + descendant: _descendant // empty for now + + }); + replaceLastQuery(selector, left, compound); // update the ref since we moved things around for `query` + + selector.currentSubject = subject; + selector.compoundCount++; + return _descendant; // now populating the right side's descendant + } else { + // ancestor query + // info for parent query + var _ancestor2 = newQuery(); + + var _descendant2 = newQuery(); + + var adQChecks = [{ + type: Type.ANCESTOR, + ancestor: _ancestor2, + descendant: _descendant2 + }]; // the parent-child query takes the place of the query previously being populated + + _ancestor2.checks = query.checks; // the previous query contains the checks for the parent + + query.checks = adQChecks; // pc query takes over + + selector.compoundCount++; + return _descendant2; // we're now populating the child + } + } + }, { + name: 'subject', + modifier: true, + regex: tokens.subject, + populate: function populate(selector, query) { + if (selector.currentSubject != null && selector.currentSubject !== query) { + warn('Redefinition of subject in selector `' + selector.toString() + '`'); + return false; + } + + selector.currentSubject = query; + var topQ = selector[selector.length - 1]; + var topChk = topQ.checks[0]; + var topType = topChk == null ? null : topChk.type; + + if (topType === Type.DIRECTED_EDGE) { + // directed edge with subject on the target + // change to target node check + topChk.type = Type.NODE_TARGET; + } else if (topType === Type.UNDIRECTED_EDGE) { + // undirected edge with subject on the second node + // change to neighbor check + topChk.type = Type.NODE_NEIGHBOR; + topChk.node = topChk.nodes[1]; // second node is subject + + topChk.neighbor = topChk.nodes[0]; // clean up unused fields for new type + + topChk.nodes = null; + } + } + }]; + exprs.forEach(function (e) { + return e.regexObj = new RegExp('^' + e.regex); + }); + + /** + * Of all the expressions, find the first match in the remaining text. + * @param {string} remaining The remaining text to parse + * @returns The matched expression and the newly remaining text `{ expr, match, name, remaining }` + */ + + var consumeExpr = function consumeExpr(remaining) { + var expr; + var match; + var name; + + for (var j = 0; j < exprs.length; j++) { + var e = exprs[j]; + var n = e.name; + var m = remaining.match(e.regexObj); + + if (m != null) { + match = m; + expr = e; + name = n; + var consumed = m[0]; + remaining = remaining.substring(consumed.length); + break; // we've consumed one expr, so we can return now + } + } + + return { + expr: expr, + match: match, + name: name, + remaining: remaining + }; + }; + /** + * Consume all the leading whitespace + * @param {string} remaining The text to consume + * @returns The text with the leading whitespace removed + */ + + + var consumeWhitespace = function consumeWhitespace(remaining) { + var match = remaining.match(/^\s+/); + + if (match) { + var consumed = match[0]; + remaining = remaining.substring(consumed.length); + } + + return remaining; + }; + /** + * Parse the string and store the parsed representation in the Selector. + * @param {string} selector The selector string + * @returns `true` if the selector was successfully parsed, `false` otherwise + */ + + + var parse = function parse(selector) { + var self = this; + var remaining = self.inputText = selector; + var currentQuery = self[0] = newQuery(); + self.length = 1; + remaining = consumeWhitespace(remaining); // get rid of leading whitespace + + for (;;) { + var exprInfo = consumeExpr(remaining); + + if (exprInfo.expr == null) { + warn('The selector `' + selector + '`is invalid'); + return false; + } else { + var args = exprInfo.match.slice(1); // let the token populate the selector object in currentQuery + + var ret = exprInfo.expr.populate(self, currentQuery, args); + + if (ret === false) { + return false; // exit if population failed + } else if (ret != null) { + currentQuery = ret; // change the current query to be filled if the expr specifies + } + } + + remaining = exprInfo.remaining; // we're done when there's nothing left to parse + + if (remaining.match(/^\s*$/)) { + break; + } + } + + var lastQ = self[self.length - 1]; + + if (self.currentSubject != null) { + lastQ.subject = self.currentSubject; + } + + lastQ.edgeCount = self.edgeCount; + lastQ.compoundCount = self.compoundCount; + + for (var i = 0; i < self.length; i++) { + var q = self[i]; // in future, this could potentially be allowed if there were operator precedence and detection of invalid combinations + + if (q.compoundCount > 0 && q.edgeCount > 0) { + warn('The selector `' + selector + '` is invalid because it uses both a compound selector and an edge selector'); + return false; + } + + if (q.edgeCount > 1) { + warn('The selector `' + selector + '` is invalid because it uses multiple edge selectors'); + return false; + } else if (q.edgeCount === 1) { + warn('The selector `' + selector + '` is deprecated. Edge selectors do not take effect on changes to source and target nodes after an edge is added, for performance reasons. Use a class or data selector on edges instead, updating the class or data of an edge when your app detects a change in source or target nodes.'); + } + } + + return true; // success + }; + /** + * Get the selector represented as a string. This value uses default formatting, + * so things like spacing may differ from the input text passed to the constructor. + * @returns {string} The selector string + */ + + + var toString = function toString() { + if (this.toStringCache != null) { + return this.toStringCache; + } + + var clean = function clean(obj) { + if (obj == null) { + return ''; + } else { + return obj; + } + }; + + var cleanVal = function cleanVal(val) { + if (string(val)) { + return '"' + val + '"'; + } else { + return clean(val); + } + }; + + var space = function space(val) { + return ' ' + val + ' '; + }; + + var checkToString = function checkToString(check, subject) { + var type = check.type, + value = check.value; + + switch (type) { + case Type.GROUP: + { + var group = clean(value); + return group.substring(0, group.length - 1); + } + + case Type.DATA_COMPARE: + { + var field = check.field, + operator = check.operator; + return '[' + field + space(clean(operator)) + cleanVal(value) + ']'; + } + + case Type.DATA_BOOL: + { + var _operator = check.operator, + _field = check.field; + return '[' + clean(_operator) + _field + ']'; + } + + case Type.DATA_EXIST: + { + var _field2 = check.field; + return '[' + _field2 + ']'; + } + + case Type.META_COMPARE: + { + var _operator2 = check.operator, + _field3 = check.field; + return '[[' + _field3 + space(clean(_operator2)) + cleanVal(value) + ']]'; + } + + case Type.STATE: + { + return value; + } + + case Type.ID: + { + return '#' + value; + } + + case Type.CLASS: + { + return '.' + value; + } + + case Type.PARENT: + case Type.CHILD: + { + return queryToString(check.parent, subject) + space('>') + queryToString(check.child, subject); + } + + case Type.ANCESTOR: + case Type.DESCENDANT: + { + return queryToString(check.ancestor, subject) + ' ' + queryToString(check.descendant, subject); + } + + case Type.COMPOUND_SPLIT: + { + var lhs = queryToString(check.left, subject); + var sub = queryToString(check.subject, subject); + var rhs = queryToString(check.right, subject); + return lhs + (lhs.length > 0 ? ' ' : '') + sub + rhs; + } + + case Type.TRUE: + { + return ''; + } + } + }; + + var queryToString = function queryToString(query, subject) { + return query.checks.reduce(function (str, chk, i) { + return str + (subject === query && i === 0 ? '$' : '') + checkToString(chk, subject); + }, ''); + }; + + var str = ''; + + for (var i = 0; i < this.length; i++) { + var query = this[i]; + str += queryToString(query, query.subject); + + if (this.length > 1 && i < this.length - 1) { + str += ', '; + } + } + + this.toStringCache = str; + return str; + }; + var parse$1 = { + parse: parse, + toString: toString + }; + + var valCmp = function valCmp(fieldVal, operator, value) { + var matches; + var isFieldStr = string(fieldVal); + var isFieldNum = number$1(fieldVal); + var isValStr = string(value); + var fieldStr, valStr; + var caseInsensitive = false; + var notExpr = false; + var isIneqCmp = false; + + if (operator.indexOf('!') >= 0) { + operator = operator.replace('!', ''); + notExpr = true; + } + + if (operator.indexOf('@') >= 0) { + operator = operator.replace('@', ''); + caseInsensitive = true; + } + + if (isFieldStr || isValStr || caseInsensitive) { + fieldStr = !isFieldStr && !isFieldNum ? '' : '' + fieldVal; + valStr = '' + value; + } // if we're doing a case insensitive comparison, then we're using a STRING comparison + // even if we're comparing numbers + + + if (caseInsensitive) { + fieldVal = fieldStr = fieldStr.toLowerCase(); + value = valStr = valStr.toLowerCase(); + } + + switch (operator) { + case '*=': + matches = fieldStr.indexOf(valStr) >= 0; + break; + + case '$=': + matches = fieldStr.indexOf(valStr, fieldStr.length - valStr.length) >= 0; + break; + + case '^=': + matches = fieldStr.indexOf(valStr) === 0; + break; + + case '=': + matches = fieldVal === value; + break; + + case '>': + isIneqCmp = true; + matches = fieldVal > value; + break; + + case '>=': + isIneqCmp = true; + matches = fieldVal >= value; + break; + + case '<': + isIneqCmp = true; + matches = fieldVal < value; + break; + + case '<=': + isIneqCmp = true; + matches = fieldVal <= value; + break; + + default: + matches = false; + break; + } // apply the not op, but null vals for inequalities should always stay non-matching + + + if (notExpr && (fieldVal != null || !isIneqCmp)) { + matches = !matches; + } + + return matches; + }; + var boolCmp = function boolCmp(fieldVal, operator) { + switch (operator) { + case '?': + return fieldVal ? true : false; + + case '!': + return fieldVal ? false : true; + + case '^': + return fieldVal === undefined; + } + }; + var existCmp = function existCmp(fieldVal) { + return fieldVal !== undefined; + }; + var data$1 = function data(ele, field) { + return ele.data(field); + }; + var meta = function meta(ele, field) { + return ele[field](); + }; + + /** A lookup of `match(check, ele)` functions by `Type` int */ + + var match = []; + /** + * Returns whether the query matches for the element + * @param query The `{ type, value, ... }` query object + * @param ele The element to compare against + */ + + var matches$1 = function matches(query, ele) { + return query.checks.every(function (chk) { + return match[chk.type](chk, ele); + }); + }; + + match[Type.GROUP] = function (check, ele) { + var group = check.value; + return group === '*' || group === ele.group(); + }; + + match[Type.STATE] = function (check, ele) { + var stateSelector = check.value; + return stateSelectorMatches(stateSelector, ele); + }; + + match[Type.ID] = function (check, ele) { + var id = check.value; + return ele.id() === id; + }; + + match[Type.CLASS] = function (check, ele) { + var cls = check.value; + return ele.hasClass(cls); + }; + + match[Type.META_COMPARE] = function (check, ele) { + var field = check.field, + operator = check.operator, + value = check.value; + return valCmp(meta(ele, field), operator, value); + }; + + match[Type.DATA_COMPARE] = function (check, ele) { + var field = check.field, + operator = check.operator, + value = check.value; + return valCmp(data$1(ele, field), operator, value); + }; + + match[Type.DATA_BOOL] = function (check, ele) { + var field = check.field, + operator = check.operator; + return boolCmp(data$1(ele, field), operator); + }; + + match[Type.DATA_EXIST] = function (check, ele) { + var field = check.field; + check.operator; + return existCmp(data$1(ele, field)); + }; + + match[Type.UNDIRECTED_EDGE] = function (check, ele) { + var qA = check.nodes[0]; + var qB = check.nodes[1]; + var src = ele.source(); + var tgt = ele.target(); + return matches$1(qA, src) && matches$1(qB, tgt) || matches$1(qB, src) && matches$1(qA, tgt); + }; + + match[Type.NODE_NEIGHBOR] = function (check, ele) { + return matches$1(check.node, ele) && ele.neighborhood().some(function (n) { + return n.isNode() && matches$1(check.neighbor, n); + }); + }; + + match[Type.DIRECTED_EDGE] = function (check, ele) { + return matches$1(check.source, ele.source()) && matches$1(check.target, ele.target()); + }; + + match[Type.NODE_SOURCE] = function (check, ele) { + return matches$1(check.source, ele) && ele.outgoers().some(function (n) { + return n.isNode() && matches$1(check.target, n); + }); + }; + + match[Type.NODE_TARGET] = function (check, ele) { + return matches$1(check.target, ele) && ele.incomers().some(function (n) { + return n.isNode() && matches$1(check.source, n); + }); + }; + + match[Type.CHILD] = function (check, ele) { + return matches$1(check.child, ele) && matches$1(check.parent, ele.parent()); + }; + + match[Type.PARENT] = function (check, ele) { + return matches$1(check.parent, ele) && ele.children().some(function (c) { + return matches$1(check.child, c); + }); + }; + + match[Type.DESCENDANT] = function (check, ele) { + return matches$1(check.descendant, ele) && ele.ancestors().some(function (a) { + return matches$1(check.ancestor, a); + }); + }; + + match[Type.ANCESTOR] = function (check, ele) { + return matches$1(check.ancestor, ele) && ele.descendants().some(function (d) { + return matches$1(check.descendant, d); + }); + }; + + match[Type.COMPOUND_SPLIT] = function (check, ele) { + return matches$1(check.subject, ele) && matches$1(check.left, ele) && matches$1(check.right, ele); + }; + + match[Type.TRUE] = function () { + return true; + }; + + match[Type.COLLECTION] = function (check, ele) { + var collection = check.value; + return collection.has(ele); + }; + + match[Type.FILTER] = function (check, ele) { + var filter = check.value; + return filter(ele); + }; + + var filter = function filter(collection) { + var self = this; // for 1 id #foo queries, just get the element + + if (self.length === 1 && self[0].checks.length === 1 && self[0].checks[0].type === Type.ID) { + return collection.getElementById(self[0].checks[0].value).collection(); + } + + var selectorFunction = function selectorFunction(element) { + for (var j = 0; j < self.length; j++) { + var query = self[j]; + + if (matches$1(query, element)) { + return true; + } + } + + return false; + }; + + if (self.text() == null) { + selectorFunction = function selectorFunction() { + return true; + }; + } + + return collection.filter(selectorFunction); + }; // filter + // does selector match a single element? + + + var matches = function matches(ele) { + var self = this; + + for (var j = 0; j < self.length; j++) { + var query = self[j]; + + if (matches$1(query, ele)) { + return true; + } + } + + return false; + }; // matches + + + var matching = { + matches: matches, + filter: filter + }; + + var Selector = function Selector(selector) { + this.inputText = selector; + this.currentSubject = null; + this.compoundCount = 0; + this.edgeCount = 0; + this.length = 0; + + if (selector == null || string(selector) && selector.match(/^\s*$/)) ; else if (elementOrCollection(selector)) { + this.addQuery({ + checks: [{ + type: Type.COLLECTION, + value: selector.collection() + }] + }); + } else if (fn$6(selector)) { + this.addQuery({ + checks: [{ + type: Type.FILTER, + value: selector + }] + }); + } else if (string(selector)) { + if (!this.parse(selector)) { + this.invalid = true; + } + } else { + error('A selector must be created from a string; found '); + } + }; + + var selfn = Selector.prototype; + [parse$1, matching].forEach(function (p) { + return extend(selfn, p); + }); + + selfn.text = function () { + return this.inputText; + }; + + selfn.size = function () { + return this.length; + }; + + selfn.eq = function (i) { + return this[i]; + }; + + selfn.sameText = function (otherSel) { + return !this.invalid && !otherSel.invalid && this.text() === otherSel.text(); + }; + + selfn.addQuery = function (q) { + this[this.length++] = q; + }; + + selfn.selector = selfn.toString; + + var elesfn$g = { + allAre: function allAre(selector) { + var selObj = new Selector(selector); + return this.every(function (ele) { + return selObj.matches(ele); + }); + }, + is: function is(selector) { + var selObj = new Selector(selector); + return this.some(function (ele) { + return selObj.matches(ele); + }); + }, + some: function some(fn, thisArg) { + for (var i = 0; i < this.length; i++) { + var ret = !thisArg ? fn(this[i], i, this) : fn.apply(thisArg, [this[i], i, this]); + + if (ret) { + return true; + } + } + + return false; + }, + every: function every(fn, thisArg) { + for (var i = 0; i < this.length; i++) { + var ret = !thisArg ? fn(this[i], i, this) : fn.apply(thisArg, [this[i], i, this]); + + if (!ret) { + return false; + } + } + + return true; + }, + same: function same(collection) { + // cheap collection ref check + if (this === collection) { + return true; + } + + collection = this.cy().collection(collection); + var thisLength = this.length; + var collectionLength = collection.length; // cheap length check + + if (thisLength !== collectionLength) { + return false; + } // cheap element ref check + + + if (thisLength === 1) { + return this[0] === collection[0]; + } + + return this.every(function (ele) { + return collection.hasElementWithId(ele.id()); + }); + }, + anySame: function anySame(collection) { + collection = this.cy().collection(collection); + return this.some(function (ele) { + return collection.hasElementWithId(ele.id()); + }); + }, + allAreNeighbors: function allAreNeighbors(collection) { + collection = this.cy().collection(collection); + var nhood = this.neighborhood(); + return collection.every(function (ele) { + return nhood.hasElementWithId(ele.id()); + }); + }, + contains: function contains(collection) { + collection = this.cy().collection(collection); + var self = this; + return collection.every(function (ele) { + return self.hasElementWithId(ele.id()); + }); + } + }; + elesfn$g.allAreNeighbours = elesfn$g.allAreNeighbors; + elesfn$g.has = elesfn$g.contains; + elesfn$g.equal = elesfn$g.equals = elesfn$g.same; + + var cache = function cache(fn, name) { + return function traversalCache(arg1, arg2, arg3, arg4) { + var selectorOrEles = arg1; + var eles = this; + var key; + + if (selectorOrEles == null) { + key = ''; + } else if (elementOrCollection(selectorOrEles) && selectorOrEles.length === 1) { + key = selectorOrEles.id(); + } + + if (eles.length === 1 && key) { + var _p = eles[0]._private; + var tch = _p.traversalCache = _p.traversalCache || {}; + var ch = tch[name] = tch[name] || []; + var hash = hashString(key); + var cacheHit = ch[hash]; + + if (cacheHit) { + return cacheHit; + } else { + return ch[hash] = fn.call(eles, arg1, arg2, arg3, arg4); + } + } else { + return fn.call(eles, arg1, arg2, arg3, arg4); + } + }; + }; + + var elesfn$f = { + parent: function parent(selector) { + var parents = []; // optimisation for single ele call + + if (this.length === 1) { + var parent = this[0]._private.parent; + + if (parent) { + return parent; + } + } + + for (var i = 0; i < this.length; i++) { + var ele = this[i]; + var _parent = ele._private.parent; + + if (_parent) { + parents.push(_parent); + } + } + + return this.spawn(parents, true).filter(selector); + }, + parents: function parents(selector) { + var parents = []; + var eles = this.parent(); + + while (eles.nonempty()) { + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + parents.push(ele); + } + + eles = eles.parent(); + } + + return this.spawn(parents, true).filter(selector); + }, + commonAncestors: function commonAncestors(selector) { + var ancestors; + + for (var i = 0; i < this.length; i++) { + var ele = this[i]; + var parents = ele.parents(); + ancestors = ancestors || parents; + ancestors = ancestors.intersect(parents); // current list must be common with current ele parents set + } + + return ancestors.filter(selector); + }, + orphans: function orphans(selector) { + return this.stdFilter(function (ele) { + return ele.isOrphan(); + }).filter(selector); + }, + nonorphans: function nonorphans(selector) { + return this.stdFilter(function (ele) { + return ele.isChild(); + }).filter(selector); + }, + children: cache(function (selector) { + var children = []; + + for (var i = 0; i < this.length; i++) { + var ele = this[i]; + var eleChildren = ele._private.children; + + for (var j = 0; j < eleChildren.length; j++) { + children.push(eleChildren[j]); + } + } + + return this.spawn(children, true).filter(selector); + }, 'children'), + siblings: function siblings(selector) { + return this.parent().children().not(this).filter(selector); + }, + isParent: function isParent() { + var ele = this[0]; + + if (ele) { + return ele.isNode() && ele._private.children.length !== 0; + } + }, + isChildless: function isChildless() { + var ele = this[0]; + + if (ele) { + return ele.isNode() && ele._private.children.length === 0; + } + }, + isChild: function isChild() { + var ele = this[0]; + + if (ele) { + return ele.isNode() && ele._private.parent != null; + } + }, + isOrphan: function isOrphan() { + var ele = this[0]; + + if (ele) { + return ele.isNode() && ele._private.parent == null; + } + }, + descendants: function descendants(selector) { + var elements = []; + + function add(eles) { + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + elements.push(ele); + + if (ele.children().nonempty()) { + add(ele.children()); + } + } + } + + add(this.children()); + return this.spawn(elements, true).filter(selector); + } + }; + + function forEachCompound(eles, fn, includeSelf, recursiveStep) { + var q = []; + var did = new Set$1(); + var cy = eles.cy(); + var hasCompounds = cy.hasCompoundNodes(); + + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + + if (includeSelf) { + q.push(ele); + } else if (hasCompounds) { + recursiveStep(q, did, ele); + } + } + + while (q.length > 0) { + var _ele = q.shift(); + + fn(_ele); + did.add(_ele.id()); + + if (hasCompounds) { + recursiveStep(q, did, _ele); + } + } + + return eles; + } + + function addChildren(q, did, ele) { + if (ele.isParent()) { + var children = ele._private.children; + + for (var i = 0; i < children.length; i++) { + var child = children[i]; + + if (!did.has(child.id())) { + q.push(child); + } + } + } + } // very efficient version of eles.add( eles.descendants() ).forEach() + // for internal use + + + elesfn$f.forEachDown = function (fn) { + var includeSelf = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + return forEachCompound(this, fn, includeSelf, addChildren); + }; + + function addParent(q, did, ele) { + if (ele.isChild()) { + var parent = ele._private.parent; + + if (!did.has(parent.id())) { + q.push(parent); + } + } + } + + elesfn$f.forEachUp = function (fn) { + var includeSelf = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + return forEachCompound(this, fn, includeSelf, addParent); + }; + + function addParentAndChildren(q, did, ele) { + addParent(q, did, ele); + addChildren(q, did, ele); + } + + elesfn$f.forEachUpAndDown = function (fn) { + var includeSelf = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + return forEachCompound(this, fn, includeSelf, addParentAndChildren); + }; // aliases + + + elesfn$f.ancestors = elesfn$f.parents; + + var fn$5, elesfn$e; + fn$5 = elesfn$e = { + data: define.data({ + field: 'data', + bindingEvent: 'data', + allowBinding: true, + allowSetting: true, + settingEvent: 'data', + settingTriggersEvent: true, + triggerFnName: 'trigger', + allowGetting: true, + immutableKeys: { + 'id': true, + 'source': true, + 'target': true, + 'parent': true + }, + updateStyle: true + }), + removeData: define.removeData({ + field: 'data', + event: 'data', + triggerFnName: 'trigger', + triggerEvent: true, + immutableKeys: { + 'id': true, + 'source': true, + 'target': true, + 'parent': true + }, + updateStyle: true + }), + scratch: define.data({ + field: 'scratch', + bindingEvent: 'scratch', + allowBinding: true, + allowSetting: true, + settingEvent: 'scratch', + settingTriggersEvent: true, + triggerFnName: 'trigger', + allowGetting: true, + updateStyle: true + }), + removeScratch: define.removeData({ + field: 'scratch', + event: 'scratch', + triggerFnName: 'trigger', + triggerEvent: true, + updateStyle: true + }), + rscratch: define.data({ + field: 'rscratch', + allowBinding: false, + allowSetting: true, + settingTriggersEvent: false, + allowGetting: true + }), + removeRscratch: define.removeData({ + field: 'rscratch', + triggerEvent: false + }), + id: function id() { + var ele = this[0]; + + if (ele) { + return ele._private.data.id; + } + } + }; // aliases + + fn$5.attr = fn$5.data; + fn$5.removeAttr = fn$5.removeData; + var data = elesfn$e; + + var elesfn$d = {}; + + function defineDegreeFunction(callback) { + return function (includeLoops) { + var self = this; + + if (includeLoops === undefined) { + includeLoops = true; + } + + if (self.length === 0) { + return; + } + + if (self.isNode() && !self.removed()) { + var degree = 0; + var node = self[0]; + var connectedEdges = node._private.edges; + + for (var i = 0; i < connectedEdges.length; i++) { + var edge = connectedEdges[i]; + + if (!includeLoops && edge.isLoop()) { + continue; + } + + degree += callback(node, edge); + } + + return degree; + } else { + return; + } + }; + } + + extend(elesfn$d, { + degree: defineDegreeFunction(function (node, edge) { + if (edge.source().same(edge.target())) { + return 2; + } else { + return 1; + } + }), + indegree: defineDegreeFunction(function (node, edge) { + if (edge.target().same(node)) { + return 1; + } else { + return 0; + } + }), + outdegree: defineDegreeFunction(function (node, edge) { + if (edge.source().same(node)) { + return 1; + } else { + return 0; + } + }) + }); + + function defineDegreeBoundsFunction(degreeFn, callback) { + return function (includeLoops) { + var ret; + var nodes = this.nodes(); + + for (var i = 0; i < nodes.length; i++) { + var ele = nodes[i]; + var degree = ele[degreeFn](includeLoops); + + if (degree !== undefined && (ret === undefined || callback(degree, ret))) { + ret = degree; + } + } + + return ret; + }; + } + + extend(elesfn$d, { + minDegree: defineDegreeBoundsFunction('degree', function (degree, min) { + return degree < min; + }), + maxDegree: defineDegreeBoundsFunction('degree', function (degree, max) { + return degree > max; + }), + minIndegree: defineDegreeBoundsFunction('indegree', function (degree, min) { + return degree < min; + }), + maxIndegree: defineDegreeBoundsFunction('indegree', function (degree, max) { + return degree > max; + }), + minOutdegree: defineDegreeBoundsFunction('outdegree', function (degree, min) { + return degree < min; + }), + maxOutdegree: defineDegreeBoundsFunction('outdegree', function (degree, max) { + return degree > max; + }) + }); + extend(elesfn$d, { + totalDegree: function totalDegree(includeLoops) { + var total = 0; + var nodes = this.nodes(); + + for (var i = 0; i < nodes.length; i++) { + total += nodes[i].degree(includeLoops); + } + + return total; + } + }); + + var fn$4, elesfn$c; + + var beforePositionSet = function beforePositionSet(eles, newPos, silent) { + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + + if (!ele.locked()) { + var oldPos = ele._private.position; + var delta = { + x: newPos.x != null ? newPos.x - oldPos.x : 0, + y: newPos.y != null ? newPos.y - oldPos.y : 0 + }; + + if (ele.isParent() && !(delta.x === 0 && delta.y === 0)) { + ele.children().shift(delta, silent); + } + + ele.dirtyBoundingBoxCache(); + } + } + }; + + var positionDef = { + field: 'position', + bindingEvent: 'position', + allowBinding: true, + allowSetting: true, + settingEvent: 'position', + settingTriggersEvent: true, + triggerFnName: 'emitAndNotify', + allowGetting: true, + validKeys: ['x', 'y'], + beforeGet: function beforeGet(ele) { + ele.updateCompoundBounds(); + }, + beforeSet: function beforeSet(eles, newPos) { + beforePositionSet(eles, newPos, false); + }, + onSet: function onSet(eles) { + eles.dirtyCompoundBoundsCache(); + }, + canSet: function canSet(ele) { + return !ele.locked(); + } + }; + fn$4 = elesfn$c = { + position: define.data(positionDef), + // position but no notification to renderer + silentPosition: define.data(extend({}, positionDef, { + allowBinding: false, + allowSetting: true, + settingTriggersEvent: false, + allowGetting: false, + beforeSet: function beforeSet(eles, newPos) { + beforePositionSet(eles, newPos, true); + }, + onSet: function onSet(eles) { + eles.dirtyCompoundBoundsCache(); + } + })), + positions: function positions(pos, silent) { + if (plainObject(pos)) { + if (silent) { + this.silentPosition(pos); + } else { + this.position(pos); + } + } else if (fn$6(pos)) { + var _fn = pos; + var cy = this.cy(); + cy.startBatch(); + + for (var i = 0; i < this.length; i++) { + var ele = this[i]; + + var _pos = void 0; + + if (_pos = _fn(ele, i)) { + if (silent) { + ele.silentPosition(_pos); + } else { + ele.position(_pos); + } + } + } + + cy.endBatch(); + } + + return this; // chaining + }, + silentPositions: function silentPositions(pos) { + return this.positions(pos, true); + }, + shift: function shift(dim, val, silent) { + var delta; + + if (plainObject(dim)) { + delta = { + x: number$1(dim.x) ? dim.x : 0, + y: number$1(dim.y) ? dim.y : 0 + }; + silent = val; + } else if (string(dim) && number$1(val)) { + delta = { + x: 0, + y: 0 + }; + delta[dim] = val; + } + + if (delta != null) { + var cy = this.cy(); + cy.startBatch(); + + for (var i = 0; i < this.length; i++) { + var ele = this[i]; // exclude any node that is a descendant of the calling collection + + if (cy.hasCompoundNodes() && ele.isChild() && ele.ancestors().anySame(this)) { + continue; + } + + var pos = ele.position(); + var newPos = { + x: pos.x + delta.x, + y: pos.y + delta.y + }; + + if (silent) { + ele.silentPosition(newPos); + } else { + ele.position(newPos); + } + } + + cy.endBatch(); + } + + return this; + }, + silentShift: function silentShift(dim, val) { + if (plainObject(dim)) { + this.shift(dim, true); + } else if (string(dim) && number$1(val)) { + this.shift(dim, val, true); + } + + return this; + }, + // get/set the rendered (i.e. on screen) positon of the element + renderedPosition: function renderedPosition(dim, val) { + var ele = this[0]; + var cy = this.cy(); + var zoom = cy.zoom(); + var pan = cy.pan(); + var rpos = plainObject(dim) ? dim : undefined; + var setting = rpos !== undefined || val !== undefined && string(dim); + + if (ele && ele.isNode()) { + // must have an element and must be a node to return position + if (setting) { + for (var i = 0; i < this.length; i++) { + var _ele = this[i]; + + if (val !== undefined) { + // set one dimension + _ele.position(dim, (val - pan[dim]) / zoom); + } else if (rpos !== undefined) { + // set whole position + _ele.position(renderedToModelPosition(rpos, zoom, pan)); + } + } + } else { + // getting + var pos = ele.position(); + rpos = modelToRenderedPosition(pos, zoom, pan); + + if (dim === undefined) { + // then return the whole rendered position + return rpos; + } else { + // then return the specified dimension + return rpos[dim]; + } + } + } else if (!setting) { + return undefined; // for empty collection case + } + + return this; // chaining + }, + // get/set the position relative to the parent + relativePosition: function relativePosition(dim, val) { + var ele = this[0]; + var cy = this.cy(); + var ppos = plainObject(dim) ? dim : undefined; + var setting = ppos !== undefined || val !== undefined && string(dim); + var hasCompoundNodes = cy.hasCompoundNodes(); + + if (ele && ele.isNode()) { + // must have an element and must be a node to return position + if (setting) { + for (var i = 0; i < this.length; i++) { + var _ele2 = this[i]; + var parent = hasCompoundNodes ? _ele2.parent() : null; + var hasParent = parent && parent.length > 0; + var relativeToParent = hasParent; + + if (hasParent) { + parent = parent[0]; + } + + var origin = relativeToParent ? parent.position() : { + x: 0, + y: 0 + }; + + if (val !== undefined) { + // set one dimension + _ele2.position(dim, val + origin[dim]); + } else if (ppos !== undefined) { + // set whole position + _ele2.position({ + x: ppos.x + origin.x, + y: ppos.y + origin.y + }); + } + } + } else { + // getting + var pos = ele.position(); + + var _parent = hasCompoundNodes ? ele.parent() : null; + + var _hasParent = _parent && _parent.length > 0; + + var _relativeToParent = _hasParent; + + if (_hasParent) { + _parent = _parent[0]; + } + + var _origin = _relativeToParent ? _parent.position() : { + x: 0, + y: 0 + }; + + ppos = { + x: pos.x - _origin.x, + y: pos.y - _origin.y + }; + + if (dim === undefined) { + // then return the whole rendered position + return ppos; + } else { + // then return the specified dimension + return ppos[dim]; + } + } + } else if (!setting) { + return undefined; // for empty collection case + } + + return this; // chaining + } + }; // aliases + + fn$4.modelPosition = fn$4.point = fn$4.position; + fn$4.modelPositions = fn$4.points = fn$4.positions; + fn$4.renderedPoint = fn$4.renderedPosition; + fn$4.relativePoint = fn$4.relativePosition; + var position = elesfn$c; + + var fn$3, elesfn$b; + fn$3 = elesfn$b = {}; + + elesfn$b.renderedBoundingBox = function (options) { + var bb = this.boundingBox(options); + var cy = this.cy(); + var zoom = cy.zoom(); + var pan = cy.pan(); + var x1 = bb.x1 * zoom + pan.x; + var x2 = bb.x2 * zoom + pan.x; + var y1 = bb.y1 * zoom + pan.y; + var y2 = bb.y2 * zoom + pan.y; + return { + x1: x1, + x2: x2, + y1: y1, + y2: y2, + w: x2 - x1, + h: y2 - y1 + }; + }; + + elesfn$b.dirtyCompoundBoundsCache = function () { + var silent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + var cy = this.cy(); + + if (!cy.styleEnabled() || !cy.hasCompoundNodes()) { + return this; + } + + this.forEachUp(function (ele) { + if (ele.isParent()) { + var _p = ele._private; + _p.compoundBoundsClean = false; + _p.bbCache = null; + + if (!silent) { + ele.emitAndNotify('bounds'); + } + } + }); + return this; + }; + + elesfn$b.updateCompoundBounds = function () { + var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + var cy = this.cy(); // not possible to do on non-compound graphs or with the style disabled + + if (!cy.styleEnabled() || !cy.hasCompoundNodes()) { + return this; + } // save cycles when batching -- but bounds will be stale (or not exist yet) + + + if (!force && cy.batching()) { + return this; + } + + function update(parent) { + if (!parent.isParent()) { + return; + } + + var _p = parent._private; + var children = parent.children(); + var includeLabels = parent.pstyle('compound-sizing-wrt-labels').value === 'include'; + var min = { + width: { + val: parent.pstyle('min-width').pfValue, + left: parent.pstyle('min-width-bias-left'), + right: parent.pstyle('min-width-bias-right') + }, + height: { + val: parent.pstyle('min-height').pfValue, + top: parent.pstyle('min-height-bias-top'), + bottom: parent.pstyle('min-height-bias-bottom') + } + }; + var bb = children.boundingBox({ + includeLabels: includeLabels, + includeOverlays: false, + // updating the compound bounds happens outside of the regular + // cache cycle (i.e. before fired events) + useCache: false + }); + var pos = _p.position; // if children take up zero area then keep position and fall back on stylesheet w/h + + if (bb.w === 0 || bb.h === 0) { + bb = { + w: parent.pstyle('width').pfValue, + h: parent.pstyle('height').pfValue + }; + bb.x1 = pos.x - bb.w / 2; + bb.x2 = pos.x + bb.w / 2; + bb.y1 = pos.y - bb.h / 2; + bb.y2 = pos.y + bb.h / 2; + } + + function computeBiasValues(propDiff, propBias, propBiasComplement) { + var biasDiff = 0; + var biasComplementDiff = 0; + var biasTotal = propBias + propBiasComplement; + + if (propDiff > 0 && biasTotal > 0) { + biasDiff = propBias / biasTotal * propDiff; + biasComplementDiff = propBiasComplement / biasTotal * propDiff; + } + + return { + biasDiff: biasDiff, + biasComplementDiff: biasComplementDiff + }; + } + + function computePaddingValues(width, height, paddingObject, relativeTo) { + // Assuming percentage is number from 0 to 1 + if (paddingObject.units === '%') { + switch (relativeTo) { + case 'width': + return width > 0 ? paddingObject.pfValue * width : 0; + + case 'height': + return height > 0 ? paddingObject.pfValue * height : 0; + + case 'average': + return width > 0 && height > 0 ? paddingObject.pfValue * (width + height) / 2 : 0; + + case 'min': + return width > 0 && height > 0 ? width > height ? paddingObject.pfValue * height : paddingObject.pfValue * width : 0; + + case 'max': + return width > 0 && height > 0 ? width > height ? paddingObject.pfValue * width : paddingObject.pfValue * height : 0; + + default: + return 0; + } + } else if (paddingObject.units === 'px') { + return paddingObject.pfValue; + } else { + return 0; + } + } + + var leftVal = min.width.left.value; + + if (min.width.left.units === 'px' && min.width.val > 0) { + leftVal = leftVal * 100 / min.width.val; + } + + var rightVal = min.width.right.value; + + if (min.width.right.units === 'px' && min.width.val > 0) { + rightVal = rightVal * 100 / min.width.val; + } + + var topVal = min.height.top.value; + + if (min.height.top.units === 'px' && min.height.val > 0) { + topVal = topVal * 100 / min.height.val; + } + + var bottomVal = min.height.bottom.value; + + if (min.height.bottom.units === 'px' && min.height.val > 0) { + bottomVal = bottomVal * 100 / min.height.val; + } + + var widthBiasDiffs = computeBiasValues(min.width.val - bb.w, leftVal, rightVal); + var diffLeft = widthBiasDiffs.biasDiff; + var diffRight = widthBiasDiffs.biasComplementDiff; + var heightBiasDiffs = computeBiasValues(min.height.val - bb.h, topVal, bottomVal); + var diffTop = heightBiasDiffs.biasDiff; + var diffBottom = heightBiasDiffs.biasComplementDiff; + _p.autoPadding = computePaddingValues(bb.w, bb.h, parent.pstyle('padding'), parent.pstyle('padding-relative-to').value); + _p.autoWidth = Math.max(bb.w, min.width.val); + pos.x = (-diffLeft + bb.x1 + bb.x2 + diffRight) / 2; + _p.autoHeight = Math.max(bb.h, min.height.val); + pos.y = (-diffTop + bb.y1 + bb.y2 + diffBottom) / 2; + } + + for (var i = 0; i < this.length; i++) { + var ele = this[i]; + var _p = ele._private; + + if (!_p.compoundBoundsClean || force) { + update(ele); + + if (!cy.batching()) { + _p.compoundBoundsClean = true; + } + } + } + + return this; + }; + + var noninf = function noninf(x) { + if (x === Infinity || x === -Infinity) { + return 0; + } + + return x; + }; + + var updateBounds = function updateBounds(b, x1, y1, x2, y2) { + // don't update with zero area boxes + if (x2 - x1 === 0 || y2 - y1 === 0) { + return; + } // don't update with null dim + + + if (x1 == null || y1 == null || x2 == null || y2 == null) { + return; + } + + b.x1 = x1 < b.x1 ? x1 : b.x1; + b.x2 = x2 > b.x2 ? x2 : b.x2; + b.y1 = y1 < b.y1 ? y1 : b.y1; + b.y2 = y2 > b.y2 ? y2 : b.y2; + b.w = b.x2 - b.x1; + b.h = b.y2 - b.y1; + }; + + var updateBoundsFromBox = function updateBoundsFromBox(b, b2) { + if (b2 == null) { + return b; + } + + return updateBounds(b, b2.x1, b2.y1, b2.x2, b2.y2); + }; + + var prefixedProperty = function prefixedProperty(obj, field, prefix) { + return getPrefixedProperty(obj, field, prefix); + }; + + var updateBoundsFromArrow = function updateBoundsFromArrow(bounds, ele, prefix) { + if (ele.cy().headless()) { + return; + } + + var _p = ele._private; + var rstyle = _p.rstyle; + var halfArW = rstyle.arrowWidth / 2; + var arrowType = ele.pstyle(prefix + '-arrow-shape').value; + var x; + var y; + + if (arrowType !== 'none') { + if (prefix === 'source') { + x = rstyle.srcX; + y = rstyle.srcY; + } else if (prefix === 'target') { + x = rstyle.tgtX; + y = rstyle.tgtY; + } else { + x = rstyle.midX; + y = rstyle.midY; + } // always store the individual arrow bounds + + + var bbs = _p.arrowBounds = _p.arrowBounds || {}; + var bb = bbs[prefix] = bbs[prefix] || {}; + bb.x1 = x - halfArW; + bb.y1 = y - halfArW; + bb.x2 = x + halfArW; + bb.y2 = y + halfArW; + bb.w = bb.x2 - bb.x1; + bb.h = bb.y2 - bb.y1; + expandBoundingBox(bb, 1); + updateBounds(bounds, bb.x1, bb.y1, bb.x2, bb.y2); + } + }; + + var updateBoundsFromLabel = function updateBoundsFromLabel(bounds, ele, prefix) { + if (ele.cy().headless()) { + return; + } + + var prefixDash; + + if (prefix) { + prefixDash = prefix + '-'; + } else { + prefixDash = ''; + } + + var _p = ele._private; + var rstyle = _p.rstyle; + var label = ele.pstyle(prefixDash + 'label').strValue; + + if (label) { + var halign = ele.pstyle('text-halign'); + var valign = ele.pstyle('text-valign'); + var labelWidth = prefixedProperty(rstyle, 'labelWidth', prefix); + var labelHeight = prefixedProperty(rstyle, 'labelHeight', prefix); + var labelX = prefixedProperty(rstyle, 'labelX', prefix); + var labelY = prefixedProperty(rstyle, 'labelY', prefix); + var marginX = ele.pstyle(prefixDash + 'text-margin-x').pfValue; + var marginY = ele.pstyle(prefixDash + 'text-margin-y').pfValue; + var isEdge = ele.isEdge(); + var rotation = ele.pstyle(prefixDash + 'text-rotation'); + var outlineWidth = ele.pstyle('text-outline-width').pfValue; + var borderWidth = ele.pstyle('text-border-width').pfValue; + var halfBorderWidth = borderWidth / 2; + var padding = ele.pstyle('text-background-padding').pfValue; + var marginOfError = 2; // expand to work around browser dimension inaccuracies + + var lh = labelHeight; + var lw = labelWidth; + var lw_2 = lw / 2; + var lh_2 = lh / 2; + var lx1, lx2, ly1, ly2; + + if (isEdge) { + lx1 = labelX - lw_2; + lx2 = labelX + lw_2; + ly1 = labelY - lh_2; + ly2 = labelY + lh_2; + } else { + switch (halign.value) { + case 'left': + lx1 = labelX - lw; + lx2 = labelX; + break; + + case 'center': + lx1 = labelX - lw_2; + lx2 = labelX + lw_2; + break; + + case 'right': + lx1 = labelX; + lx2 = labelX + lw; + break; + } + + switch (valign.value) { + case 'top': + ly1 = labelY - lh; + ly2 = labelY; + break; + + case 'center': + ly1 = labelY - lh_2; + ly2 = labelY + lh_2; + break; + + case 'bottom': + ly1 = labelY; + ly2 = labelY + lh; + break; + } + } // shift by margin and expand by outline and border + + + lx1 += marginX - Math.max(outlineWidth, halfBorderWidth) - padding - marginOfError; + lx2 += marginX + Math.max(outlineWidth, halfBorderWidth) + padding + marginOfError; + ly1 += marginY - Math.max(outlineWidth, halfBorderWidth) - padding - marginOfError; + ly2 += marginY + Math.max(outlineWidth, halfBorderWidth) + padding + marginOfError; // always store the unrotated label bounds separately + + var bbPrefix = prefix || 'main'; + var bbs = _p.labelBounds; + var bb = bbs[bbPrefix] = bbs[bbPrefix] || {}; + bb.x1 = lx1; + bb.y1 = ly1; + bb.x2 = lx2; + bb.y2 = ly2; + bb.w = lx2 - lx1; + bb.h = ly2 - ly1; + var isAutorotate = isEdge && rotation.strValue === 'autorotate'; + var isPfValue = rotation.pfValue != null && rotation.pfValue !== 0; + + if (isAutorotate || isPfValue) { + var theta = isAutorotate ? prefixedProperty(_p.rstyle, 'labelAngle', prefix) : rotation.pfValue; + var cos = Math.cos(theta); + var sin = Math.sin(theta); // rotation point (default value for center-center) + + var xo = (lx1 + lx2) / 2; + var yo = (ly1 + ly2) / 2; + + if (!isEdge) { + switch (halign.value) { + case 'left': + xo = lx2; + break; + + case 'right': + xo = lx1; + break; + } + + switch (valign.value) { + case 'top': + yo = ly2; + break; + + case 'bottom': + yo = ly1; + break; + } + } + + var rotate = function rotate(x, y) { + x = x - xo; + y = y - yo; + return { + x: x * cos - y * sin + xo, + y: x * sin + y * cos + yo + }; + }; + + var px1y1 = rotate(lx1, ly1); + var px1y2 = rotate(lx1, ly2); + var px2y1 = rotate(lx2, ly1); + var px2y2 = rotate(lx2, ly2); + lx1 = Math.min(px1y1.x, px1y2.x, px2y1.x, px2y2.x); + lx2 = Math.max(px1y1.x, px1y2.x, px2y1.x, px2y2.x); + ly1 = Math.min(px1y1.y, px1y2.y, px2y1.y, px2y2.y); + ly2 = Math.max(px1y1.y, px1y2.y, px2y1.y, px2y2.y); + } + + var bbPrefixRot = bbPrefix + 'Rot'; + var bbRot = bbs[bbPrefixRot] = bbs[bbPrefixRot] || {}; + bbRot.x1 = lx1; + bbRot.y1 = ly1; + bbRot.x2 = lx2; + bbRot.y2 = ly2; + bbRot.w = lx2 - lx1; + bbRot.h = ly2 - ly1; + updateBounds(bounds, lx1, ly1, lx2, ly2); + updateBounds(_p.labelBounds.all, lx1, ly1, lx2, ly2); + } + + return bounds; + }; // get the bounding box of the elements (in raw model position) + + + var boundingBoxImpl = function boundingBoxImpl(ele, options) { + var cy = ele._private.cy; + var styleEnabled = cy.styleEnabled(); + var headless = cy.headless(); + var bounds = makeBoundingBox(); + var _p = ele._private; + var isNode = ele.isNode(); + var isEdge = ele.isEdge(); + var ex1, ex2, ey1, ey2; // extrema of body / lines + + var x, y; // node pos + + var rstyle = _p.rstyle; + var manualExpansion = isNode && styleEnabled ? ele.pstyle('bounds-expansion').pfValue : [0]; // must use `display` prop only, as reading `compound.width()` causes recursion + // (other factors like width values will be considered later in this function anyway) + + var isDisplayed = function isDisplayed(ele) { + return ele.pstyle('display').value !== 'none'; + }; + + var displayed = !styleEnabled || isDisplayed(ele) // must take into account connected nodes b/c of implicit edge hiding on display:none node + && (!isEdge || isDisplayed(ele.source()) && isDisplayed(ele.target())); + + if (displayed) { + // displayed suffices, since we will find zero area eles anyway + var overlayOpacity = 0; + var overlayPadding = 0; + + if (styleEnabled && options.includeOverlays) { + overlayOpacity = ele.pstyle('overlay-opacity').value; + + if (overlayOpacity !== 0) { + overlayPadding = ele.pstyle('overlay-padding').value; + } + } + + var underlayOpacity = 0; + var underlayPadding = 0; + + if (styleEnabled && options.includeUnderlays) { + underlayOpacity = ele.pstyle('underlay-opacity').value; + + if (underlayOpacity !== 0) { + underlayPadding = ele.pstyle('underlay-padding').value; + } + } + + var padding = Math.max(overlayPadding, underlayPadding); + var w = 0; + var wHalf = 0; + + if (styleEnabled) { + w = ele.pstyle('width').pfValue; + wHalf = w / 2; + } + + if (isNode && options.includeNodes) { + var pos = ele.position(); + x = pos.x; + y = pos.y; + + var _w = ele.outerWidth(); + + var halfW = _w / 2; + var h = ele.outerHeight(); + var halfH = h / 2; // handle node dimensions + ///////////////////////// + + ex1 = x - halfW; + ex2 = x + halfW; + ey1 = y - halfH; + ey2 = y + halfH; + updateBounds(bounds, ex1, ey1, ex2, ey2); + } else if (isEdge && options.includeEdges) { + if (styleEnabled && !headless) { + var curveStyle = ele.pstyle('curve-style').strValue; // handle edge dimensions (rough box estimate) + ////////////////////////////////////////////// + + ex1 = Math.min(rstyle.srcX, rstyle.midX, rstyle.tgtX); + ex2 = Math.max(rstyle.srcX, rstyle.midX, rstyle.tgtX); + ey1 = Math.min(rstyle.srcY, rstyle.midY, rstyle.tgtY); + ey2 = Math.max(rstyle.srcY, rstyle.midY, rstyle.tgtY); // take into account edge width + + ex1 -= wHalf; + ex2 += wHalf; + ey1 -= wHalf; + ey2 += wHalf; + updateBounds(bounds, ex1, ey1, ex2, ey2); // precise edges + //////////////// + + if (curveStyle === 'haystack') { + var hpts = rstyle.haystackPts; + + if (hpts && hpts.length === 2) { + ex1 = hpts[0].x; + ey1 = hpts[0].y; + ex2 = hpts[1].x; + ey2 = hpts[1].y; + + if (ex1 > ex2) { + var temp = ex1; + ex1 = ex2; + ex2 = temp; + } + + if (ey1 > ey2) { + var _temp = ey1; + ey1 = ey2; + ey2 = _temp; + } + + updateBounds(bounds, ex1 - wHalf, ey1 - wHalf, ex2 + wHalf, ey2 + wHalf); + } + } else if (curveStyle === 'bezier' || curveStyle === 'unbundled-bezier' || curveStyle === 'segments' || curveStyle === 'taxi') { + var pts; + + switch (curveStyle) { + case 'bezier': + case 'unbundled-bezier': + pts = rstyle.bezierPts; + break; + + case 'segments': + case 'taxi': + pts = rstyle.linePts; + break; + } + + if (pts != null) { + for (var j = 0; j < pts.length; j++) { + var pt = pts[j]; + ex1 = pt.x - wHalf; + ex2 = pt.x + wHalf; + ey1 = pt.y - wHalf; + ey2 = pt.y + wHalf; + updateBounds(bounds, ex1, ey1, ex2, ey2); + } + } + } // bezier-like or segment-like edge + + } else { + // headless or style disabled + // fallback on source and target positions + ////////////////////////////////////////// + var n1 = ele.source(); + var n1pos = n1.position(); + var n2 = ele.target(); + var n2pos = n2.position(); + ex1 = n1pos.x; + ex2 = n2pos.x; + ey1 = n1pos.y; + ey2 = n2pos.y; + + if (ex1 > ex2) { + var _temp2 = ex1; + ex1 = ex2; + ex2 = _temp2; + } + + if (ey1 > ey2) { + var _temp3 = ey1; + ey1 = ey2; + ey2 = _temp3; + } // take into account edge width + + + ex1 -= wHalf; + ex2 += wHalf; + ey1 -= wHalf; + ey2 += wHalf; + updateBounds(bounds, ex1, ey1, ex2, ey2); + } // headless or style disabled + + } // edges + // handle edge arrow size + ///////////////////////// + + + if (styleEnabled && options.includeEdges && isEdge) { + updateBoundsFromArrow(bounds, ele, 'mid-source'); + updateBoundsFromArrow(bounds, ele, 'mid-target'); + updateBoundsFromArrow(bounds, ele, 'source'); + updateBoundsFromArrow(bounds, ele, 'target'); + } // ghost + //////// + + + if (styleEnabled) { + var ghost = ele.pstyle('ghost').value === 'yes'; + + if (ghost) { + var gx = ele.pstyle('ghost-offset-x').pfValue; + var gy = ele.pstyle('ghost-offset-y').pfValue; + updateBounds(bounds, bounds.x1 + gx, bounds.y1 + gy, bounds.x2 + gx, bounds.y2 + gy); + } + } // always store the body bounds separately from the labels + + + var bbBody = _p.bodyBounds = _p.bodyBounds || {}; + assignBoundingBox(bbBody, bounds); + expandBoundingBoxSides(bbBody, manualExpansion); + expandBoundingBox(bbBody, 1); // expand to work around browser dimension inaccuracies + // overlay + ////////// + + if (styleEnabled) { + ex1 = bounds.x1; + ex2 = bounds.x2; + ey1 = bounds.y1; + ey2 = bounds.y2; + updateBounds(bounds, ex1 - padding, ey1 - padding, ex2 + padding, ey2 + padding); + } // always store the body bounds separately from the labels + + + var bbOverlay = _p.overlayBounds = _p.overlayBounds || {}; + assignBoundingBox(bbOverlay, bounds); + expandBoundingBoxSides(bbOverlay, manualExpansion); + expandBoundingBox(bbOverlay, 1); // expand to work around browser dimension inaccuracies + // handle label dimensions + ////////////////////////// + + var bbLabels = _p.labelBounds = _p.labelBounds || {}; + + if (bbLabels.all != null) { + clearBoundingBox(bbLabels.all); + } else { + bbLabels.all = makeBoundingBox(); + } + + if (styleEnabled && options.includeLabels) { + if (options.includeMainLabels) { + updateBoundsFromLabel(bounds, ele, null); + } + + if (isEdge) { + if (options.includeSourceLabels) { + updateBoundsFromLabel(bounds, ele, 'source'); + } + + if (options.includeTargetLabels) { + updateBoundsFromLabel(bounds, ele, 'target'); + } + } + } // style enabled for labels + + } // if displayed + + + bounds.x1 = noninf(bounds.x1); + bounds.y1 = noninf(bounds.y1); + bounds.x2 = noninf(bounds.x2); + bounds.y2 = noninf(bounds.y2); + bounds.w = noninf(bounds.x2 - bounds.x1); + bounds.h = noninf(bounds.y2 - bounds.y1); + + if (bounds.w > 0 && bounds.h > 0 && displayed) { + expandBoundingBoxSides(bounds, manualExpansion); // expand bounds by 1 because antialiasing can increase the visual/effective size by 1 on all sides + + expandBoundingBox(bounds, 1); + } + + return bounds; + }; + + var getKey = function getKey(opts) { + var i = 0; + + var tf = function tf(val) { + return (val ? 1 : 0) << i++; + }; + + var key = 0; + key += tf(opts.incudeNodes); + key += tf(opts.includeEdges); + key += tf(opts.includeLabels); + key += tf(opts.includeMainLabels); + key += tf(opts.includeSourceLabels); + key += tf(opts.includeTargetLabels); + key += tf(opts.includeOverlays); + return key; + }; + + var getBoundingBoxPosKey = function getBoundingBoxPosKey(ele) { + if (ele.isEdge()) { + var p1 = ele.source().position(); + var p2 = ele.target().position(); + + var r = function r(x) { + return Math.round(x); + }; + + return hashIntsArray([r(p1.x), r(p1.y), r(p2.x), r(p2.y)]); + } else { + return 0; + } + }; + + var cachedBoundingBoxImpl = function cachedBoundingBoxImpl(ele, opts) { + var _p = ele._private; + var bb; + var isEdge = ele.isEdge(); + var key = opts == null ? defBbOptsKey : getKey(opts); + var usingDefOpts = key === defBbOptsKey; + var currPosKey = getBoundingBoxPosKey(ele); + var isPosKeySame = _p.bbCachePosKey === currPosKey; + var useCache = opts.useCache && isPosKeySame; + + var isDirty = function isDirty(ele) { + return ele._private.bbCache == null || ele._private.styleDirty; + }; + + var needRecalc = !useCache || isDirty(ele) || isEdge && isDirty(ele.source()) || isDirty(ele.target()); + + if (needRecalc) { + if (!isPosKeySame) { + ele.recalculateRenderedStyle(useCache); + } + + bb = boundingBoxImpl(ele, defBbOpts); + _p.bbCache = bb; + _p.bbCachePosKey = currPosKey; + } else { + bb = _p.bbCache; + } // not using def opts => need to build up bb from combination of sub bbs + + + if (!usingDefOpts) { + var isNode = ele.isNode(); + bb = makeBoundingBox(); + + if (opts.includeNodes && isNode || opts.includeEdges && !isNode) { + if (opts.includeOverlays) { + updateBoundsFromBox(bb, _p.overlayBounds); + } else { + updateBoundsFromBox(bb, _p.bodyBounds); + } + } + + if (opts.includeLabels) { + if (opts.includeMainLabels && (!isEdge || opts.includeSourceLabels && opts.includeTargetLabels)) { + updateBoundsFromBox(bb, _p.labelBounds.all); + } else { + if (opts.includeMainLabels) { + updateBoundsFromBox(bb, _p.labelBounds.mainRot); + } + + if (opts.includeSourceLabels) { + updateBoundsFromBox(bb, _p.labelBounds.sourceRot); + } + + if (opts.includeTargetLabels) { + updateBoundsFromBox(bb, _p.labelBounds.targetRot); + } + } + } + + bb.w = bb.x2 - bb.x1; + bb.h = bb.y2 - bb.y1; + } + + return bb; + }; + + var defBbOpts = { + includeNodes: true, + includeEdges: true, + includeLabels: true, + includeMainLabels: true, + includeSourceLabels: true, + includeTargetLabels: true, + includeOverlays: true, + includeUnderlays: true, + useCache: true + }; + var defBbOptsKey = getKey(defBbOpts); + var filledBbOpts = defaults$g(defBbOpts); + + elesfn$b.boundingBox = function (options) { + var bounds; // the main usecase is ele.boundingBox() for a single element with no/def options + // specified s.t. the cache is used, so check for this case to make it faster by + // avoiding the overhead of the rest of the function + + if (this.length === 1 && this[0]._private.bbCache != null && !this[0]._private.styleDirty && (options === undefined || options.useCache === undefined || options.useCache === true)) { + if (options === undefined) { + options = defBbOpts; + } else { + options = filledBbOpts(options); + } + + bounds = cachedBoundingBoxImpl(this[0], options); + } else { + bounds = makeBoundingBox(); + options = options || defBbOpts; + var opts = filledBbOpts(options); + var eles = this; + var cy = eles.cy(); + var styleEnabled = cy.styleEnabled(); + + if (styleEnabled) { + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + var _p = ele._private; + var currPosKey = getBoundingBoxPosKey(ele); + var isPosKeySame = _p.bbCachePosKey === currPosKey; + var useCache = opts.useCache && isPosKeySame && !_p.styleDirty; + ele.recalculateRenderedStyle(useCache); + } + } + + this.updateCompoundBounds(!options.useCache); + + for (var _i = 0; _i < eles.length; _i++) { + var _ele = eles[_i]; + updateBoundsFromBox(bounds, cachedBoundingBoxImpl(_ele, opts)); + } + } + + bounds.x1 = noninf(bounds.x1); + bounds.y1 = noninf(bounds.y1); + bounds.x2 = noninf(bounds.x2); + bounds.y2 = noninf(bounds.y2); + bounds.w = noninf(bounds.x2 - bounds.x1); + bounds.h = noninf(bounds.y2 - bounds.y1); + return bounds; + }; + + elesfn$b.dirtyBoundingBoxCache = function () { + for (var i = 0; i < this.length; i++) { + var _p = this[i]._private; + _p.bbCache = null; + _p.bbCachePosKey = null; + _p.bodyBounds = null; + _p.overlayBounds = null; + _p.labelBounds.all = null; + _p.labelBounds.source = null; + _p.labelBounds.target = null; + _p.labelBounds.main = null; + _p.labelBounds.sourceRot = null; + _p.labelBounds.targetRot = null; + _p.labelBounds.mainRot = null; + _p.arrowBounds.source = null; + _p.arrowBounds.target = null; + _p.arrowBounds['mid-source'] = null; + _p.arrowBounds['mid-target'] = null; + } + + this.emitAndNotify('bounds'); + return this; + }; // private helper to get bounding box for custom node positions + // - good for perf in certain cases but currently requires dirtying the rendered style + // - would be better to not modify the nodes but the nodes are read directly everywhere in the renderer... + // - try to use for only things like discrete layouts where the node position would change anyway + + + elesfn$b.boundingBoxAt = function (fn) { + var nodes = this.nodes(); + var cy = this.cy(); + var hasCompoundNodes = cy.hasCompoundNodes(); + var parents = cy.collection(); + + if (hasCompoundNodes) { + parents = nodes.filter(function (node) { + return node.isParent(); + }); + nodes = nodes.not(parents); + } + + if (plainObject(fn)) { + var obj = fn; + + fn = function fn() { + return obj; + }; + } + + var storeOldPos = function storeOldPos(node, i) { + return node._private.bbAtOldPos = fn(node, i); + }; + + var getOldPos = function getOldPos(node) { + return node._private.bbAtOldPos; + }; + + cy.startBatch(); + nodes.forEach(storeOldPos).silentPositions(fn); + + if (hasCompoundNodes) { + parents.dirtyCompoundBoundsCache(); + parents.dirtyBoundingBoxCache(); + parents.updateCompoundBounds(true); // force update b/c we're inside a batch cycle + } + + var bb = copyBoundingBox(this.boundingBox({ + useCache: false + })); + nodes.silentPositions(getOldPos); + + if (hasCompoundNodes) { + parents.dirtyCompoundBoundsCache(); + parents.dirtyBoundingBoxCache(); + parents.updateCompoundBounds(true); // force update b/c we're inside a batch cycle + } + + cy.endBatch(); + return bb; + }; + + fn$3.boundingbox = fn$3.bb = fn$3.boundingBox; + fn$3.renderedBoundingbox = fn$3.renderedBoundingBox; + var bounds = elesfn$b; + + var fn$2, elesfn$a; + fn$2 = elesfn$a = {}; + + var defineDimFns = function defineDimFns(opts) { + opts.uppercaseName = capitalize(opts.name); + opts.autoName = 'auto' + opts.uppercaseName; + opts.labelName = 'label' + opts.uppercaseName; + opts.outerName = 'outer' + opts.uppercaseName; + opts.uppercaseOuterName = capitalize(opts.outerName); + + fn$2[opts.name] = function dimImpl() { + var ele = this[0]; + var _p = ele._private; + var cy = _p.cy; + var styleEnabled = cy._private.styleEnabled; + + if (ele) { + if (styleEnabled) { + if (ele.isParent()) { + ele.updateCompoundBounds(); + return _p[opts.autoName] || 0; + } + + var d = ele.pstyle(opts.name); + + switch (d.strValue) { + case 'label': + ele.recalculateRenderedStyle(); + return _p.rstyle[opts.labelName] || 0; + + default: + return d.pfValue; + } + } else { + return 1; + } + } + }; + + fn$2['outer' + opts.uppercaseName] = function outerDimImpl() { + var ele = this[0]; + var _p = ele._private; + var cy = _p.cy; + var styleEnabled = cy._private.styleEnabled; + + if (ele) { + if (styleEnabled) { + var dim = ele[opts.name](); + var border = ele.pstyle('border-width').pfValue; // n.b. 1/2 each side + + var padding = 2 * ele.padding(); + return dim + border + padding; + } else { + return 1; + } + } + }; + + fn$2['rendered' + opts.uppercaseName] = function renderedDimImpl() { + var ele = this[0]; + + if (ele) { + var d = ele[opts.name](); + return d * this.cy().zoom(); + } + }; + + fn$2['rendered' + opts.uppercaseOuterName] = function renderedOuterDimImpl() { + var ele = this[0]; + + if (ele) { + var od = ele[opts.outerName](); + return od * this.cy().zoom(); + } + }; + }; + + defineDimFns({ + name: 'width' + }); + defineDimFns({ + name: 'height' + }); + + elesfn$a.padding = function () { + var ele = this[0]; + var _p = ele._private; + + if (ele.isParent()) { + ele.updateCompoundBounds(); + + if (_p.autoPadding !== undefined) { + return _p.autoPadding; + } else { + return ele.pstyle('padding').pfValue; + } + } else { + return ele.pstyle('padding').pfValue; + } + }; + + elesfn$a.paddedHeight = function () { + var ele = this[0]; + return ele.height() + 2 * ele.padding(); + }; + + elesfn$a.paddedWidth = function () { + var ele = this[0]; + return ele.width() + 2 * ele.padding(); + }; + + var widthHeight = elesfn$a; + + var ifEdge = function ifEdge(ele, getValue) { + if (ele.isEdge()) { + return getValue(ele); + } + }; + + var ifEdgeRenderedPosition = function ifEdgeRenderedPosition(ele, getPoint) { + if (ele.isEdge()) { + var cy = ele.cy(); + return modelToRenderedPosition(getPoint(ele), cy.zoom(), cy.pan()); + } + }; + + var ifEdgeRenderedPositions = function ifEdgeRenderedPositions(ele, getPoints) { + if (ele.isEdge()) { + var cy = ele.cy(); + var pan = cy.pan(); + var zoom = cy.zoom(); + return getPoints(ele).map(function (p) { + return modelToRenderedPosition(p, zoom, pan); + }); + } + }; + + var controlPoints = function controlPoints(ele) { + return ele.renderer().getControlPoints(ele); + }; + + var segmentPoints = function segmentPoints(ele) { + return ele.renderer().getSegmentPoints(ele); + }; + + var sourceEndpoint = function sourceEndpoint(ele) { + return ele.renderer().getSourceEndpoint(ele); + }; + + var targetEndpoint = function targetEndpoint(ele) { + return ele.renderer().getTargetEndpoint(ele); + }; + + var midpoint = function midpoint(ele) { + return ele.renderer().getEdgeMidpoint(ele); + }; + + var pts = { + controlPoints: { + get: controlPoints, + mult: true + }, + segmentPoints: { + get: segmentPoints, + mult: true + }, + sourceEndpoint: { + get: sourceEndpoint + }, + targetEndpoint: { + get: targetEndpoint + }, + midpoint: { + get: midpoint + } + }; + + var renderedName = function renderedName(name) { + return 'rendered' + name[0].toUpperCase() + name.substr(1); + }; + + var edgePoints = Object.keys(pts).reduce(function (obj, name) { + var spec = pts[name]; + var rName = renderedName(name); + + obj[name] = function () { + return ifEdge(this, spec.get); + }; + + if (spec.mult) { + obj[rName] = function () { + return ifEdgeRenderedPositions(this, spec.get); + }; + } else { + obj[rName] = function () { + return ifEdgeRenderedPosition(this, spec.get); + }; + } + + return obj; + }, {}); + + var dimensions = extend({}, position, bounds, widthHeight, edgePoints); + + /*! + Event object based on jQuery events, MIT license + + https://jquery.org/license/ + https://tldrlegal.com/license/mit-license + https://github.com/jquery/jquery/blob/master/src/event.js + */ + var Event = function Event(src, props) { + this.recycle(src, props); + }; + + function returnFalse() { + return false; + } + + function returnTrue() { + return true; + } // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html + + + Event.prototype = { + instanceString: function instanceString() { + return 'event'; + }, + recycle: function recycle(src, props) { + this.isImmediatePropagationStopped = this.isPropagationStopped = this.isDefaultPrevented = returnFalse; + + if (src != null && src.preventDefault) { + // Browser Event object + this.type = src.type; // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + + this.isDefaultPrevented = src.defaultPrevented ? returnTrue : returnFalse; + } else if (src != null && src.type) { + // Plain object containing all event details + props = src; + } else { + // Event string + this.type = src; + } // Put explicitly provided properties onto the event object + + + if (props != null) { + // more efficient to manually copy fields we use + this.originalEvent = props.originalEvent; + this.type = props.type != null ? props.type : this.type; + this.cy = props.cy; + this.target = props.target; + this.position = props.position; + this.renderedPosition = props.renderedPosition; + this.namespace = props.namespace; + this.layout = props.layout; + } + + if (this.cy != null && this.position != null && this.renderedPosition == null) { + // create a rendered position based on the passed position + var pos = this.position; + var zoom = this.cy.zoom(); + var pan = this.cy.pan(); + this.renderedPosition = { + x: pos.x * zoom + pan.x, + y: pos.y * zoom + pan.y + }; + } // Create a timestamp if incoming event doesn't have one + + + this.timeStamp = src && src.timeStamp || Date.now(); + }, + preventDefault: function preventDefault() { + this.isDefaultPrevented = returnTrue; + var e = this.originalEvent; + + if (!e) { + return; + } // if preventDefault exists run it on the original event + + + if (e.preventDefault) { + e.preventDefault(); + } + }, + stopPropagation: function stopPropagation() { + this.isPropagationStopped = returnTrue; + var e = this.originalEvent; + + if (!e) { + return; + } // if stopPropagation exists run it on the original event + + + if (e.stopPropagation) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function stopImmediatePropagation() { + this.isImmediatePropagationStopped = returnTrue; + this.stopPropagation(); + }, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse + }; + + var eventRegex = /^([^.]+)(\.(?:[^.]+))?$/; // regex for matching event strings (e.g. "click.namespace") + + var universalNamespace = '.*'; // matches as if no namespace specified and prevents users from unbinding accidentally + + var defaults$8 = { + qualifierCompare: function qualifierCompare(q1, q2) { + return q1 === q2; + }, + eventMatches: function + /*context, listener, eventObj*/ + eventMatches() { + return true; + }, + addEventFields: function + /*context, evt*/ + addEventFields() {}, + callbackContext: function callbackContext(context + /*, listener, eventObj*/ + ) { + return context; + }, + beforeEmit: function + /* context, listener, eventObj */ + beforeEmit() {}, + afterEmit: function + /* context, listener, eventObj */ + afterEmit() {}, + bubble: function + /*context*/ + bubble() { + return false; + }, + parent: function + /*context*/ + parent() { + return null; + }, + context: null + }; + var defaultsKeys = Object.keys(defaults$8); + var emptyOpts = {}; + + function Emitter() { + var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : emptyOpts; + var context = arguments.length > 1 ? arguments[1] : undefined; + + // micro-optimisation vs Object.assign() -- reduces Element instantiation time + for (var i = 0; i < defaultsKeys.length; i++) { + var key = defaultsKeys[i]; + this[key] = opts[key] || defaults$8[key]; + } + + this.context = context || this.context; + this.listeners = []; + this.emitting = 0; + } + + var p = Emitter.prototype; + + var forEachEvent = function forEachEvent(self, handler, events, qualifier, callback, conf, confOverrides) { + if (fn$6(qualifier)) { + callback = qualifier; + qualifier = null; + } + + if (confOverrides) { + if (conf == null) { + conf = confOverrides; + } else { + conf = extend({}, conf, confOverrides); + } + } + + var eventList = array(events) ? events : events.split(/\s+/); + + for (var i = 0; i < eventList.length; i++) { + var evt = eventList[i]; + + if (emptyString(evt)) { + continue; + } + + var match = evt.match(eventRegex); // type[.namespace] + + if (match) { + var type = match[1]; + var namespace = match[2] ? match[2] : null; + var ret = handler(self, evt, type, namespace, qualifier, callback, conf); + + if (ret === false) { + break; + } // allow exiting early + + } + } + }; + + var makeEventObj = function makeEventObj(self, obj) { + self.addEventFields(self.context, obj); + return new Event(obj.type, obj); + }; + + var forEachEventObj = function forEachEventObj(self, handler, events) { + if (event(events)) { + handler(self, events); + return; + } else if (plainObject(events)) { + handler(self, makeEventObj(self, events)); + return; + } + + var eventList = array(events) ? events : events.split(/\s+/); + + for (var i = 0; i < eventList.length; i++) { + var evt = eventList[i]; + + if (emptyString(evt)) { + continue; + } + + var match = evt.match(eventRegex); // type[.namespace] + + if (match) { + var type = match[1]; + var namespace = match[2] ? match[2] : null; + var eventObj = makeEventObj(self, { + type: type, + namespace: namespace, + target: self.context + }); + handler(self, eventObj); + } + } + }; + + p.on = p.addListener = function (events, qualifier, callback, conf, confOverrides) { + forEachEvent(this, function (self, event, type, namespace, qualifier, callback, conf) { + if (fn$6(callback)) { + self.listeners.push({ + event: event, + // full event string + callback: callback, + // callback to run + type: type, + // the event type (e.g. 'click') + namespace: namespace, + // the event namespace (e.g. ".foo") + qualifier: qualifier, + // a restriction on whether to match this emitter + conf: conf // additional configuration + + }); + } + }, events, qualifier, callback, conf, confOverrides); + return this; + }; + + p.one = function (events, qualifier, callback, conf) { + return this.on(events, qualifier, callback, conf, { + one: true + }); + }; + + p.removeListener = p.off = function (events, qualifier, callback, conf) { + var _this = this; + + if (this.emitting !== 0) { + this.listeners = copyArray$1(this.listeners); + } + + var listeners = this.listeners; + + var _loop = function _loop(i) { + var listener = listeners[i]; + forEachEvent(_this, function (self, event, type, namespace, qualifier, callback + /*, conf*/ + ) { + if ((listener.type === type || events === '*') && (!namespace && listener.namespace !== '.*' || listener.namespace === namespace) && (!qualifier || self.qualifierCompare(listener.qualifier, qualifier)) && (!callback || listener.callback === callback)) { + listeners.splice(i, 1); + return false; + } + }, events, qualifier, callback, conf); + }; + + for (var i = listeners.length - 1; i >= 0; i--) { + _loop(i); + } + + return this; + }; + + p.removeAllListeners = function () { + return this.removeListener('*'); + }; + + p.emit = p.trigger = function (events, extraParams, manualCallback) { + var listeners = this.listeners; + var numListenersBeforeEmit = listeners.length; + this.emitting++; + + if (!array(extraParams)) { + extraParams = [extraParams]; + } + + forEachEventObj(this, function (self, eventObj) { + if (manualCallback != null) { + listeners = [{ + event: eventObj.event, + type: eventObj.type, + namespace: eventObj.namespace, + callback: manualCallback + }]; + numListenersBeforeEmit = listeners.length; + } + + var _loop2 = function _loop2(i) { + var listener = listeners[i]; + + if (listener.type === eventObj.type && (!listener.namespace || listener.namespace === eventObj.namespace || listener.namespace === universalNamespace) && self.eventMatches(self.context, listener, eventObj)) { + var args = [eventObj]; + + if (extraParams != null) { + push(args, extraParams); + } + + self.beforeEmit(self.context, listener, eventObj); + + if (listener.conf && listener.conf.one) { + self.listeners = self.listeners.filter(function (l) { + return l !== listener; + }); + } + + var context = self.callbackContext(self.context, listener, eventObj); + var ret = listener.callback.apply(context, args); + self.afterEmit(self.context, listener, eventObj); + + if (ret === false) { + eventObj.stopPropagation(); + eventObj.preventDefault(); + } + } // if listener matches + + }; + + for (var i = 0; i < numListenersBeforeEmit; i++) { + _loop2(i); + } // for listener + + + if (self.bubble(self.context) && !eventObj.isPropagationStopped()) { + self.parent(self.context).emit(eventObj, extraParams); + } + }, events); + this.emitting--; + return this; + }; + + var emitterOptions$1 = { + qualifierCompare: function qualifierCompare(selector1, selector2) { + if (selector1 == null || selector2 == null) { + return selector1 == null && selector2 == null; + } else { + return selector1.sameText(selector2); + } + }, + eventMatches: function eventMatches(ele, listener, eventObj) { + var selector = listener.qualifier; + + if (selector != null) { + return ele !== eventObj.target && element(eventObj.target) && selector.matches(eventObj.target); + } + + return true; + }, + addEventFields: function addEventFields(ele, evt) { + evt.cy = ele.cy(); + evt.target = ele; + }, + callbackContext: function callbackContext(ele, listener, eventObj) { + return listener.qualifier != null ? eventObj.target : ele; + }, + beforeEmit: function beforeEmit(context, listener + /*, eventObj*/ + ) { + if (listener.conf && listener.conf.once) { + listener.conf.onceCollection.removeListener(listener.event, listener.qualifier, listener.callback); + } + }, + bubble: function bubble() { + return true; + }, + parent: function parent(ele) { + return ele.isChild() ? ele.parent() : ele.cy(); + } + }; + + var argSelector$1 = function argSelector(arg) { + if (string(arg)) { + return new Selector(arg); + } else { + return arg; + } + }; + + var elesfn$9 = { + createEmitter: function createEmitter() { + for (var i = 0; i < this.length; i++) { + var ele = this[i]; + var _p = ele._private; + + if (!_p.emitter) { + _p.emitter = new Emitter(emitterOptions$1, ele); + } + } + + return this; + }, + emitter: function emitter() { + return this._private.emitter; + }, + on: function on(events, selector, callback) { + var argSel = argSelector$1(selector); + + for (var i = 0; i < this.length; i++) { + var ele = this[i]; + ele.emitter().on(events, argSel, callback); + } + + return this; + }, + removeListener: function removeListener(events, selector, callback) { + var argSel = argSelector$1(selector); + + for (var i = 0; i < this.length; i++) { + var ele = this[i]; + ele.emitter().removeListener(events, argSel, callback); + } + + return this; + }, + removeAllListeners: function removeAllListeners() { + for (var i = 0; i < this.length; i++) { + var ele = this[i]; + ele.emitter().removeAllListeners(); + } + + return this; + }, + one: function one(events, selector, callback) { + var argSel = argSelector$1(selector); + + for (var i = 0; i < this.length; i++) { + var ele = this[i]; + ele.emitter().one(events, argSel, callback); + } + + return this; + }, + once: function once(events, selector, callback) { + var argSel = argSelector$1(selector); + + for (var i = 0; i < this.length; i++) { + var ele = this[i]; + ele.emitter().on(events, argSel, callback, { + once: true, + onceCollection: this + }); + } + }, + emit: function emit(events, extraParams) { + for (var i = 0; i < this.length; i++) { + var ele = this[i]; + ele.emitter().emit(events, extraParams); + } + + return this; + }, + emitAndNotify: function emitAndNotify(event, extraParams) { + // for internal use only + if (this.length === 0) { + return; + } // empty collections don't need to notify anything + // notify renderer + + + this.cy().notify(event, this); + this.emit(event, extraParams); + return this; + } + }; + define.eventAliasesOn(elesfn$9); + + var elesfn$8 = { + nodes: function nodes(selector) { + return this.filter(function (ele) { + return ele.isNode(); + }).filter(selector); + }, + edges: function edges(selector) { + return this.filter(function (ele) { + return ele.isEdge(); + }).filter(selector); + }, + // internal helper to get nodes and edges as separate collections with single iteration over elements + byGroup: function byGroup() { + var nodes = this.spawn(); + var edges = this.spawn(); + + for (var i = 0; i < this.length; i++) { + var ele = this[i]; + + if (ele.isNode()) { + nodes.push(ele); + } else { + edges.push(ele); + } + } + + return { + nodes: nodes, + edges: edges + }; + }, + filter: function filter(_filter, thisArg) { + if (_filter === undefined) { + // check this first b/c it's the most common/performant case + return this; + } else if (string(_filter) || elementOrCollection(_filter)) { + return new Selector(_filter).filter(this); + } else if (fn$6(_filter)) { + var filterEles = this.spawn(); + var eles = this; + + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + var include = thisArg ? _filter.apply(thisArg, [ele, i, eles]) : _filter(ele, i, eles); + + if (include) { + filterEles.push(ele); + } + } + + return filterEles; + } + + return this.spawn(); // if not handled by above, give 'em an empty collection + }, + not: function not(toRemove) { + if (!toRemove) { + return this; + } else { + if (string(toRemove)) { + toRemove = this.filter(toRemove); + } + + var elements = this.spawn(); + + for (var i = 0; i < this.length; i++) { + var element = this[i]; + var remove = toRemove.has(element); + + if (!remove) { + elements.push(element); + } + } + + return elements; + } + }, + absoluteComplement: function absoluteComplement() { + var cy = this.cy(); + return cy.mutableElements().not(this); + }, + intersect: function intersect(other) { + // if a selector is specified, then filter by it instead + if (string(other)) { + var selector = other; + return this.filter(selector); + } + + var elements = this.spawn(); + var col1 = this; + var col2 = other; + var col1Smaller = this.length < other.length; + var colS = col1Smaller ? col1 : col2; + var colL = col1Smaller ? col2 : col1; + + for (var i = 0; i < colS.length; i++) { + var ele = colS[i]; + + if (colL.has(ele)) { + elements.push(ele); + } + } + + return elements; + }, + xor: function xor(other) { + var cy = this._private.cy; + + if (string(other)) { + other = cy.$(other); + } + + var elements = this.spawn(); + var col1 = this; + var col2 = other; + + var add = function add(col, other) { + for (var i = 0; i < col.length; i++) { + var ele = col[i]; + var id = ele._private.data.id; + var inOther = other.hasElementWithId(id); + + if (!inOther) { + elements.push(ele); + } + } + }; + + add(col1, col2); + add(col2, col1); + return elements; + }, + diff: function diff(other) { + var cy = this._private.cy; + + if (string(other)) { + other = cy.$(other); + } + + var left = this.spawn(); + var right = this.spawn(); + var both = this.spawn(); + var col1 = this; + var col2 = other; + + var add = function add(col, other, retEles) { + for (var i = 0; i < col.length; i++) { + var ele = col[i]; + var id = ele._private.data.id; + var inOther = other.hasElementWithId(id); + + if (inOther) { + both.merge(ele); + } else { + retEles.push(ele); + } + } + }; + + add(col1, col2, left); + add(col2, col1, right); + return { + left: left, + right: right, + both: both + }; + }, + add: function add(toAdd) { + var cy = this._private.cy; + + if (!toAdd) { + return this; + } + + if (string(toAdd)) { + var selector = toAdd; + toAdd = cy.mutableElements().filter(selector); + } + + var elements = this.spawnSelf(); + + for (var i = 0; i < toAdd.length; i++) { + var ele = toAdd[i]; + var add = !this.has(ele); + + if (add) { + elements.push(ele); + } + } + + return elements; + }, + // in place merge on calling collection + merge: function merge(toAdd) { + var _p = this._private; + var cy = _p.cy; + + if (!toAdd) { + return this; + } + + if (toAdd && string(toAdd)) { + var selector = toAdd; + toAdd = cy.mutableElements().filter(selector); + } + + var map = _p.map; + + for (var i = 0; i < toAdd.length; i++) { + var toAddEle = toAdd[i]; + var id = toAddEle._private.data.id; + var add = !map.has(id); + + if (add) { + var index = this.length++; + this[index] = toAddEle; + map.set(id, { + ele: toAddEle, + index: index + }); + } + } + + return this; // chaining + }, + unmergeAt: function unmergeAt(i) { + var ele = this[i]; + var id = ele.id(); + var _p = this._private; + var map = _p.map; // remove ele + + this[i] = undefined; + map["delete"](id); + var unmergedLastEle = i === this.length - 1; // replace empty spot with last ele in collection + + if (this.length > 1 && !unmergedLastEle) { + var lastEleI = this.length - 1; + var lastEle = this[lastEleI]; + var lastEleId = lastEle._private.data.id; + this[lastEleI] = undefined; + this[i] = lastEle; + map.set(lastEleId, { + ele: lastEle, + index: i + }); + } // the collection is now 1 ele smaller + + + this.length--; + return this; + }, + // remove single ele in place in calling collection + unmergeOne: function unmergeOne(ele) { + ele = ele[0]; + var _p = this._private; + var id = ele._private.data.id; + var map = _p.map; + var entry = map.get(id); + + if (!entry) { + return this; // no need to remove + } + + var i = entry.index; + this.unmergeAt(i); + return this; + }, + // remove eles in place on calling collection + unmerge: function unmerge(toRemove) { + var cy = this._private.cy; + + if (!toRemove) { + return this; + } + + if (toRemove && string(toRemove)) { + var selector = toRemove; + toRemove = cy.mutableElements().filter(selector); + } + + for (var i = 0; i < toRemove.length; i++) { + this.unmergeOne(toRemove[i]); + } + + return this; // chaining + }, + unmergeBy: function unmergeBy(toRmFn) { + for (var i = this.length - 1; i >= 0; i--) { + var ele = this[i]; + + if (toRmFn(ele)) { + this.unmergeAt(i); + } + } + + return this; + }, + map: function map(mapFn, thisArg) { + var arr = []; + var eles = this; + + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + var ret = thisArg ? mapFn.apply(thisArg, [ele, i, eles]) : mapFn(ele, i, eles); + arr.push(ret); + } + + return arr; + }, + reduce: function reduce(fn, initialValue) { + var val = initialValue; + var eles = this; + + for (var i = 0; i < eles.length; i++) { + val = fn(val, eles[i], i, eles); + } + + return val; + }, + max: function max(valFn, thisArg) { + var max = -Infinity; + var maxEle; + var eles = this; + + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + var val = thisArg ? valFn.apply(thisArg, [ele, i, eles]) : valFn(ele, i, eles); + + if (val > max) { + max = val; + maxEle = ele; + } + } + + return { + value: max, + ele: maxEle + }; + }, + min: function min(valFn, thisArg) { + var min = Infinity; + var minEle; + var eles = this; + + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + var val = thisArg ? valFn.apply(thisArg, [ele, i, eles]) : valFn(ele, i, eles); + + if (val < min) { + min = val; + minEle = ele; + } + } + + return { + value: min, + ele: minEle + }; + } + }; // aliases + + var fn$1 = elesfn$8; + fn$1['u'] = fn$1['|'] = fn$1['+'] = fn$1.union = fn$1.or = fn$1.add; + fn$1['\\'] = fn$1['!'] = fn$1['-'] = fn$1.difference = fn$1.relativeComplement = fn$1.subtract = fn$1.not; + fn$1['n'] = fn$1['&'] = fn$1['.'] = fn$1.and = fn$1.intersection = fn$1.intersect; + fn$1['^'] = fn$1['(+)'] = fn$1['(-)'] = fn$1.symmetricDifference = fn$1.symdiff = fn$1.xor; + fn$1.fnFilter = fn$1.filterFn = fn$1.stdFilter = fn$1.filter; + fn$1.complement = fn$1.abscomp = fn$1.absoluteComplement; + + var elesfn$7 = { + isNode: function isNode() { + return this.group() === 'nodes'; + }, + isEdge: function isEdge() { + return this.group() === 'edges'; + }, + isLoop: function isLoop() { + return this.isEdge() && this.source()[0] === this.target()[0]; + }, + isSimple: function isSimple() { + return this.isEdge() && this.source()[0] !== this.target()[0]; + }, + group: function group() { + var ele = this[0]; + + if (ele) { + return ele._private.group; + } + } + }; + + /** + * Elements are drawn in a specific order based on compound depth (low to high), the element type (nodes above edges), + * and z-index (low to high). These styles affect how this applies: + * + * z-compound-depth: May be `bottom | orphan | auto | top`. The first drawn is `bottom`, then `orphan` which is the + * same depth as the root of the compound graph, followed by the default value `auto` which draws in order from + * root to leaves of the compound graph. The last drawn is `top`. + * z-index-compare: May be `auto | manual`. The default value is `auto` which always draws edges under nodes. + * `manual` ignores this convention and draws based on the `z-index` value setting. + * z-index: An integer value that affects the relative draw order of elements. In general, an element with a higher + * `z-index` will be drawn on top of an element with a lower `z-index`. + */ + + var zIndexSort = function zIndexSort(a, b) { + var cy = a.cy(); + var hasCompoundNodes = cy.hasCompoundNodes(); + + function getDepth(ele) { + var style = ele.pstyle('z-compound-depth'); + + if (style.value === 'auto') { + return hasCompoundNodes ? ele.zDepth() : 0; + } else if (style.value === 'bottom') { + return -1; + } else if (style.value === 'top') { + return MAX_INT$1; + } // 'orphan' + + + return 0; + } + + var depthDiff = getDepth(a) - getDepth(b); + + if (depthDiff !== 0) { + return depthDiff; + } + + function getEleDepth(ele) { + var style = ele.pstyle('z-index-compare'); + + if (style.value === 'auto') { + return ele.isNode() ? 1 : 0; + } // 'manual' + + + return 0; + } + + var eleDiff = getEleDepth(a) - getEleDepth(b); + + if (eleDiff !== 0) { + return eleDiff; + } + + var zDiff = a.pstyle('z-index').value - b.pstyle('z-index').value; + + if (zDiff !== 0) { + return zDiff; + } // compare indices in the core (order added to graph w/ last on top) + + + return a.poolIndex() - b.poolIndex(); + }; + + var elesfn$6 = { + forEach: function forEach(fn, thisArg) { + if (fn$6(fn)) { + var N = this.length; + + for (var i = 0; i < N; i++) { + var ele = this[i]; + var ret = thisArg ? fn.apply(thisArg, [ele, i, this]) : fn(ele, i, this); + + if (ret === false) { + break; + } // exit each early on return false + + } + } + + return this; + }, + toArray: function toArray() { + var array = []; + + for (var i = 0; i < this.length; i++) { + array.push(this[i]); + } + + return array; + }, + slice: function slice(start, end) { + var array = []; + var thisSize = this.length; + + if (end == null) { + end = thisSize; + } + + if (start == null) { + start = 0; + } + + if (start < 0) { + start = thisSize + start; + } + + if (end < 0) { + end = thisSize + end; + } + + for (var i = start; i >= 0 && i < end && i < thisSize; i++) { + array.push(this[i]); + } + + return this.spawn(array); + }, + size: function size() { + return this.length; + }, + eq: function eq(i) { + return this[i] || this.spawn(); + }, + first: function first() { + return this[0] || this.spawn(); + }, + last: function last() { + return this[this.length - 1] || this.spawn(); + }, + empty: function empty() { + return this.length === 0; + }, + nonempty: function nonempty() { + return !this.empty(); + }, + sort: function sort(sortFn) { + if (!fn$6(sortFn)) { + return this; + } + + var sorted = this.toArray().sort(sortFn); + return this.spawn(sorted); + }, + sortByZIndex: function sortByZIndex() { + return this.sort(zIndexSort); + }, + zDepth: function zDepth() { + var ele = this[0]; + + if (!ele) { + return undefined; + } // let cy = ele.cy(); + + + var _p = ele._private; + var group = _p.group; + + if (group === 'nodes') { + var depth = _p.data.parent ? ele.parents().size() : 0; + + if (!ele.isParent()) { + return MAX_INT$1 - 1; // childless nodes always on top + } + + return depth; + } else { + var src = _p.source; + var tgt = _p.target; + var srcDepth = src.zDepth(); + var tgtDepth = tgt.zDepth(); + return Math.max(srcDepth, tgtDepth, 0); // depth of deepest parent + } + } + }; + elesfn$6.each = elesfn$6.forEach; + + var defineSymbolIterator = function defineSymbolIterator() { + var typeofUndef = "undefined" ; + var isIteratorSupported = (typeof Symbol === "undefined" ? "undefined" : _typeof(Symbol)) != typeofUndef && _typeof(Symbol.iterator) != typeofUndef; // eslint-disable-line no-undef + + if (isIteratorSupported) { + elesfn$6[Symbol.iterator] = function () { + var _this = this; + + // eslint-disable-line no-undef + var entry = { + value: undefined, + done: false + }; + var i = 0; + var length = this.length; + return _defineProperty$1({ + next: function next() { + if (i < length) { + entry.value = _this[i++]; + } else { + entry.value = undefined; + entry.done = true; + } + + return entry; + } + }, Symbol.iterator, function () { + // eslint-disable-line no-undef + return this; + }); + }; + } + }; + + defineSymbolIterator(); + + var getLayoutDimensionOptions = defaults$g({ + nodeDimensionsIncludeLabels: false + }); + var elesfn$5 = { + // Calculates and returns node dimensions { x, y } based on options given + layoutDimensions: function layoutDimensions(options) { + options = getLayoutDimensionOptions(options); + var dims; + + if (!this.takesUpSpace()) { + dims = { + w: 0, + h: 0 + }; + } else if (options.nodeDimensionsIncludeLabels) { + var bbDim = this.boundingBox(); + dims = { + w: bbDim.w, + h: bbDim.h + }; + } else { + dims = { + w: this.outerWidth(), + h: this.outerHeight() + }; + } // sanitise the dimensions for external layouts (avoid division by zero) + + + if (dims.w === 0 || dims.h === 0) { + dims.w = dims.h = 1; + } + + return dims; + }, + // using standard layout options, apply position function (w/ or w/o animation) + layoutPositions: function layoutPositions(layout, options, fn) { + var nodes = this.nodes().filter(function (n) { + return !n.isParent(); + }); + var cy = this.cy(); + var layoutEles = options.eles; // nodes & edges + + var getMemoizeKey = function getMemoizeKey(node) { + return node.id(); + }; + + var fnMem = memoize$1(fn, getMemoizeKey); // memoized version of position function + + layout.emit({ + type: 'layoutstart', + layout: layout + }); + layout.animations = []; + + var calculateSpacing = function calculateSpacing(spacing, nodesBb, pos) { + var center = { + x: nodesBb.x1 + nodesBb.w / 2, + y: nodesBb.y1 + nodesBb.h / 2 + }; + var spacingVector = { + // scale from center of bounding box (not necessarily 0,0) + x: (pos.x - center.x) * spacing, + y: (pos.y - center.y) * spacing + }; + return { + x: center.x + spacingVector.x, + y: center.y + spacingVector.y + }; + }; + + var useSpacingFactor = options.spacingFactor && options.spacingFactor !== 1; + + var spacingBb = function spacingBb() { + if (!useSpacingFactor) { + return null; + } + + var bb = makeBoundingBox(); + + for (var i = 0; i < nodes.length; i++) { + var node = nodes[i]; + var pos = fnMem(node, i); + expandBoundingBoxByPoint(bb, pos.x, pos.y); + } + + return bb; + }; + + var bb = spacingBb(); + var getFinalPos = memoize$1(function (node, i) { + var newPos = fnMem(node, i); + + if (useSpacingFactor) { + var spacing = Math.abs(options.spacingFactor); + newPos = calculateSpacing(spacing, bb, newPos); + } + + if (options.transform != null) { + newPos = options.transform(node, newPos); + } + + return newPos; + }, getMemoizeKey); + + if (options.animate) { + for (var i = 0; i < nodes.length; i++) { + var node = nodes[i]; + var newPos = getFinalPos(node, i); + var animateNode = options.animateFilter == null || options.animateFilter(node, i); + + if (animateNode) { + var ani = node.animation({ + position: newPos, + duration: options.animationDuration, + easing: options.animationEasing + }); + layout.animations.push(ani); + } else { + node.position(newPos); + } + } + + if (options.fit) { + var fitAni = cy.animation({ + fit: { + boundingBox: layoutEles.boundingBoxAt(getFinalPos), + padding: options.padding + }, + duration: options.animationDuration, + easing: options.animationEasing + }); + layout.animations.push(fitAni); + } else if (options.zoom !== undefined && options.pan !== undefined) { + var zoomPanAni = cy.animation({ + zoom: options.zoom, + pan: options.pan, + duration: options.animationDuration, + easing: options.animationEasing + }); + layout.animations.push(zoomPanAni); + } + + layout.animations.forEach(function (ani) { + return ani.play(); + }); + layout.one('layoutready', options.ready); + layout.emit({ + type: 'layoutready', + layout: layout + }); + Promise$1.all(layout.animations.map(function (ani) { + return ani.promise(); + })).then(function () { + layout.one('layoutstop', options.stop); + layout.emit({ + type: 'layoutstop', + layout: layout + }); + }); + } else { + nodes.positions(getFinalPos); + + if (options.fit) { + cy.fit(options.eles, options.padding); + } + + if (options.zoom != null) { + cy.zoom(options.zoom); + } + + if (options.pan) { + cy.pan(options.pan); + } + + layout.one('layoutready', options.ready); + layout.emit({ + type: 'layoutready', + layout: layout + }); + layout.one('layoutstop', options.stop); + layout.emit({ + type: 'layoutstop', + layout: layout + }); + } + + return this; // chaining + }, + layout: function layout(options) { + var cy = this.cy(); + return cy.makeLayout(extend({}, options, { + eles: this + })); + } + }; // aliases: + + elesfn$5.createLayout = elesfn$5.makeLayout = elesfn$5.layout; + + function styleCache(key, fn, ele) { + var _p = ele._private; + var cache = _p.styleCache = _p.styleCache || []; + var val; + + if ((val = cache[key]) != null) { + return val; + } else { + val = cache[key] = fn(ele); + return val; + } + } + + function cacheStyleFunction(key, fn) { + key = hashString(key); + return function cachedStyleFunction(ele) { + return styleCache(key, fn, ele); + }; + } + + function cachePrototypeStyleFunction(key, fn) { + key = hashString(key); + + var selfFn = function selfFn(ele) { + return fn.call(ele); + }; + + return function cachedPrototypeStyleFunction() { + var ele = this[0]; + + if (ele) { + return styleCache(key, selfFn, ele); + } + }; + } + + var elesfn$4 = { + recalculateRenderedStyle: function recalculateRenderedStyle(useCache) { + var cy = this.cy(); + var renderer = cy.renderer(); + var styleEnabled = cy.styleEnabled(); + + if (renderer && styleEnabled) { + renderer.recalculateRenderedStyle(this, useCache); + } + + return this; + }, + dirtyStyleCache: function dirtyStyleCache() { + var cy = this.cy(); + + var dirty = function dirty(ele) { + return ele._private.styleCache = null; + }; + + if (cy.hasCompoundNodes()) { + var eles; + eles = this.spawnSelf().merge(this.descendants()).merge(this.parents()); + eles.merge(eles.connectedEdges()); + eles.forEach(dirty); + } else { + this.forEach(function (ele) { + dirty(ele); + ele.connectedEdges().forEach(dirty); + }); + } + + return this; + }, + // fully updates (recalculates) the style for the elements + updateStyle: function updateStyle(notifyRenderer) { + var cy = this._private.cy; + + if (!cy.styleEnabled()) { + return this; + } + + if (cy.batching()) { + var bEles = cy._private.batchStyleEles; + bEles.merge(this); + return this; // chaining and exit early when batching + } + + var hasCompounds = cy.hasCompoundNodes(); + var updatedEles = this; + notifyRenderer = notifyRenderer || notifyRenderer === undefined ? true : false; + + if (hasCompounds) { + // then add everything up and down for compound selector checks + updatedEles = this.spawnSelf().merge(this.descendants()).merge(this.parents()); + } // let changedEles = style.apply( updatedEles ); + + + var changedEles = updatedEles; + + if (notifyRenderer) { + changedEles.emitAndNotify('style'); // let renderer know we changed style + } else { + changedEles.emit('style'); // just fire the event + } + + updatedEles.forEach(function (ele) { + return ele._private.styleDirty = true; + }); + return this; // chaining + }, + // private: clears dirty flag and recalculates style + cleanStyle: function cleanStyle() { + var cy = this.cy(); + + if (!cy.styleEnabled()) { + return; + } + + for (var i = 0; i < this.length; i++) { + var ele = this[i]; + + if (ele._private.styleDirty) { + // n.b. this flag should be set before apply() to avoid potential infinite recursion + ele._private.styleDirty = false; + cy.style().apply(ele); + } + } + }, + // get the internal parsed style object for the specified property + parsedStyle: function parsedStyle(property) { + var includeNonDefault = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + var ele = this[0]; + var cy = ele.cy(); + + if (!cy.styleEnabled()) { + return; + } + + if (ele) { + this.cleanStyle(); + var overriddenStyle = ele._private.style[property]; + + if (overriddenStyle != null) { + return overriddenStyle; + } else if (includeNonDefault) { + return cy.style().getDefaultProperty(property); + } else { + return null; + } + } + }, + numericStyle: function numericStyle(property) { + var ele = this[0]; + + if (!ele.cy().styleEnabled()) { + return; + } + + if (ele) { + var pstyle = ele.pstyle(property); + return pstyle.pfValue !== undefined ? pstyle.pfValue : pstyle.value; + } + }, + numericStyleUnits: function numericStyleUnits(property) { + var ele = this[0]; + + if (!ele.cy().styleEnabled()) { + return; + } + + if (ele) { + return ele.pstyle(property).units; + } + }, + // get the specified css property as a rendered value (i.e. on-screen value) + // or get the whole rendered style if no property specified (NB doesn't allow setting) + renderedStyle: function renderedStyle(property) { + var cy = this.cy(); + + if (!cy.styleEnabled()) { + return this; + } + + var ele = this[0]; + + if (ele) { + return cy.style().getRenderedStyle(ele, property); + } + }, + // read the calculated css style of the element or override the style (via a bypass) + style: function style(name, value) { + var cy = this.cy(); + + if (!cy.styleEnabled()) { + return this; + } + + var updateTransitions = false; + var style = cy.style(); + + if (plainObject(name)) { + // then extend the bypass + var props = name; + style.applyBypass(this, props, updateTransitions); + this.emitAndNotify('style'); // let the renderer know we've updated style + } else if (string(name)) { + if (value === undefined) { + // then get the property from the style + var ele = this[0]; + + if (ele) { + return style.getStylePropertyValue(ele, name); + } else { + // empty collection => can't get any value + return; + } + } else { + // then set the bypass with the property value + style.applyBypass(this, name, value, updateTransitions); + this.emitAndNotify('style'); // let the renderer know we've updated style + } + } else if (name === undefined) { + var _ele = this[0]; + + if (_ele) { + return style.getRawStyle(_ele); + } else { + // empty collection => can't get any value + return; + } + } + + return this; // chaining + }, + removeStyle: function removeStyle(names) { + var cy = this.cy(); + + if (!cy.styleEnabled()) { + return this; + } + + var updateTransitions = false; + var style = cy.style(); + var eles = this; + + if (names === undefined) { + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + style.removeAllBypasses(ele, updateTransitions); + } + } else { + names = names.split(/\s+/); + + for (var _i = 0; _i < eles.length; _i++) { + var _ele2 = eles[_i]; + style.removeBypasses(_ele2, names, updateTransitions); + } + } + + this.emitAndNotify('style'); // let the renderer know we've updated style + + return this; // chaining + }, + show: function show() { + this.css('display', 'element'); + return this; // chaining + }, + hide: function hide() { + this.css('display', 'none'); + return this; // chaining + }, + effectiveOpacity: function effectiveOpacity() { + var cy = this.cy(); + + if (!cy.styleEnabled()) { + return 1; + } + + var hasCompoundNodes = cy.hasCompoundNodes(); + var ele = this[0]; + + if (ele) { + var _p = ele._private; + var parentOpacity = ele.pstyle('opacity').value; + + if (!hasCompoundNodes) { + return parentOpacity; + } + + var parents = !_p.data.parent ? null : ele.parents(); + + if (parents) { + for (var i = 0; i < parents.length; i++) { + var parent = parents[i]; + var opacity = parent.pstyle('opacity').value; + parentOpacity = opacity * parentOpacity; + } + } + + return parentOpacity; + } + }, + transparent: function transparent() { + var cy = this.cy(); + + if (!cy.styleEnabled()) { + return false; + } + + var ele = this[0]; + var hasCompoundNodes = ele.cy().hasCompoundNodes(); + + if (ele) { + if (!hasCompoundNodes) { + return ele.pstyle('opacity').value === 0; + } else { + return ele.effectiveOpacity() === 0; + } + } + }, + backgrounding: function backgrounding() { + var cy = this.cy(); + + if (!cy.styleEnabled()) { + return false; + } + + var ele = this[0]; + return ele._private.backgrounding ? true : false; + } + }; + + function checkCompound(ele, parentOk) { + var _p = ele._private; + var parents = _p.data.parent ? ele.parents() : null; + + if (parents) { + for (var i = 0; i < parents.length; i++) { + var parent = parents[i]; + + if (!parentOk(parent)) { + return false; + } + } + } + + return true; + } + + function defineDerivedStateFunction(specs) { + var ok = specs.ok; + var edgeOkViaNode = specs.edgeOkViaNode || specs.ok; + var parentOk = specs.parentOk || specs.ok; + return function () { + var cy = this.cy(); + + if (!cy.styleEnabled()) { + return true; + } + + var ele = this[0]; + var hasCompoundNodes = cy.hasCompoundNodes(); + + if (ele) { + var _p = ele._private; + + if (!ok(ele)) { + return false; + } + + if (ele.isNode()) { + return !hasCompoundNodes || checkCompound(ele, parentOk); + } else { + var src = _p.source; + var tgt = _p.target; + return edgeOkViaNode(src) && (!hasCompoundNodes || checkCompound(src, edgeOkViaNode)) && (src === tgt || edgeOkViaNode(tgt) && (!hasCompoundNodes || checkCompound(tgt, edgeOkViaNode))); + } + } + }; + } + + var eleTakesUpSpace = cacheStyleFunction('eleTakesUpSpace', function (ele) { + return ele.pstyle('display').value === 'element' && ele.width() !== 0 && (ele.isNode() ? ele.height() !== 0 : true); + }); + elesfn$4.takesUpSpace = cachePrototypeStyleFunction('takesUpSpace', defineDerivedStateFunction({ + ok: eleTakesUpSpace + })); + var eleInteractive = cacheStyleFunction('eleInteractive', function (ele) { + return ele.pstyle('events').value === 'yes' && ele.pstyle('visibility').value === 'visible' && eleTakesUpSpace(ele); + }); + var parentInteractive = cacheStyleFunction('parentInteractive', function (parent) { + return parent.pstyle('visibility').value === 'visible' && eleTakesUpSpace(parent); + }); + elesfn$4.interactive = cachePrototypeStyleFunction('interactive', defineDerivedStateFunction({ + ok: eleInteractive, + parentOk: parentInteractive, + edgeOkViaNode: eleTakesUpSpace + })); + + elesfn$4.noninteractive = function () { + var ele = this[0]; + + if (ele) { + return !ele.interactive(); + } + }; + + var eleVisible = cacheStyleFunction('eleVisible', function (ele) { + return ele.pstyle('visibility').value === 'visible' && ele.pstyle('opacity').pfValue !== 0 && eleTakesUpSpace(ele); + }); + var edgeVisibleViaNode = eleTakesUpSpace; + elesfn$4.visible = cachePrototypeStyleFunction('visible', defineDerivedStateFunction({ + ok: eleVisible, + edgeOkViaNode: edgeVisibleViaNode + })); + + elesfn$4.hidden = function () { + var ele = this[0]; + + if (ele) { + return !ele.visible(); + } + }; + + elesfn$4.isBundledBezier = cachePrototypeStyleFunction('isBundledBezier', function () { + if (!this.cy().styleEnabled()) { + return false; + } + + return !this.removed() && this.pstyle('curve-style').value === 'bezier' && this.takesUpSpace(); + }); + elesfn$4.bypass = elesfn$4.css = elesfn$4.style; + elesfn$4.renderedCss = elesfn$4.renderedStyle; + elesfn$4.removeBypass = elesfn$4.removeCss = elesfn$4.removeStyle; + elesfn$4.pstyle = elesfn$4.parsedStyle; + + var elesfn$3 = {}; + + function defineSwitchFunction(params) { + return function () { + var args = arguments; + var changedEles = []; // e.g. cy.nodes().select( data, handler ) + + if (args.length === 2) { + var data = args[0]; + var handler = args[1]; + this.on(params.event, data, handler); + } // e.g. cy.nodes().select( handler ) + else if (args.length === 1 && fn$6(args[0])) { + var _handler = args[0]; + this.on(params.event, _handler); + } // e.g. cy.nodes().select() + // e.g. (private) cy.nodes().select(['tapselect']) + else if (args.length === 0 || args.length === 1 && array(args[0])) { + var addlEvents = args.length === 1 ? args[0] : null; + + for (var i = 0; i < this.length; i++) { + var ele = this[i]; + var able = !params.ableField || ele._private[params.ableField]; + var changed = ele._private[params.field] != params.value; + + if (params.overrideAble) { + var overrideAble = params.overrideAble(ele); + + if (overrideAble !== undefined) { + able = overrideAble; + + if (!overrideAble) { + return this; + } // to save cycles assume not able for all on override + + } + } + + if (able) { + ele._private[params.field] = params.value; + + if (changed) { + changedEles.push(ele); + } + } + } + + var changedColl = this.spawn(changedEles); + changedColl.updateStyle(); // change of state => possible change of style + + changedColl.emit(params.event); + + if (addlEvents) { + changedColl.emit(addlEvents); + } + } + + return this; + }; + } + + function defineSwitchSet(params) { + elesfn$3[params.field] = function () { + var ele = this[0]; + + if (ele) { + if (params.overrideField) { + var val = params.overrideField(ele); + + if (val !== undefined) { + return val; + } + } + + return ele._private[params.field]; + } + }; + + elesfn$3[params.on] = defineSwitchFunction({ + event: params.on, + field: params.field, + ableField: params.ableField, + overrideAble: params.overrideAble, + value: true + }); + elesfn$3[params.off] = defineSwitchFunction({ + event: params.off, + field: params.field, + ableField: params.ableField, + overrideAble: params.overrideAble, + value: false + }); + } + + defineSwitchSet({ + field: 'locked', + overrideField: function overrideField(ele) { + return ele.cy().autolock() ? true : undefined; + }, + on: 'lock', + off: 'unlock' + }); + defineSwitchSet({ + field: 'grabbable', + overrideField: function overrideField(ele) { + return ele.cy().autoungrabify() || ele.pannable() ? false : undefined; + }, + on: 'grabify', + off: 'ungrabify' + }); + defineSwitchSet({ + field: 'selected', + ableField: 'selectable', + overrideAble: function overrideAble(ele) { + return ele.cy().autounselectify() ? false : undefined; + }, + on: 'select', + off: 'unselect' + }); + defineSwitchSet({ + field: 'selectable', + overrideField: function overrideField(ele) { + return ele.cy().autounselectify() ? false : undefined; + }, + on: 'selectify', + off: 'unselectify' + }); + elesfn$3.deselect = elesfn$3.unselect; + + elesfn$3.grabbed = function () { + var ele = this[0]; + + if (ele) { + return ele._private.grabbed; + } + }; + + defineSwitchSet({ + field: 'active', + on: 'activate', + off: 'unactivate' + }); + defineSwitchSet({ + field: 'pannable', + on: 'panify', + off: 'unpanify' + }); + + elesfn$3.inactive = function () { + var ele = this[0]; + + if (ele) { + return !ele._private.active; + } + }; + + var elesfn$2 = {}; // DAG functions + //////////////// + + var defineDagExtremity = function defineDagExtremity(params) { + return function dagExtremityImpl(selector) { + var eles = this; + var ret = []; + + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + + if (!ele.isNode()) { + continue; + } + + var disqualified = false; + var edges = ele.connectedEdges(); + + for (var j = 0; j < edges.length; j++) { + var edge = edges[j]; + var src = edge.source(); + var tgt = edge.target(); + + if (params.noIncomingEdges && tgt === ele && src !== ele || params.noOutgoingEdges && src === ele && tgt !== ele) { + disqualified = true; + break; + } + } + + if (!disqualified) { + ret.push(ele); + } + } + + return this.spawn(ret, true).filter(selector); + }; + }; + + var defineDagOneHop = function defineDagOneHop(params) { + return function (selector) { + var eles = this; + var oEles = []; + + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + + if (!ele.isNode()) { + continue; + } + + var edges = ele.connectedEdges(); + + for (var j = 0; j < edges.length; j++) { + var edge = edges[j]; + var src = edge.source(); + var tgt = edge.target(); + + if (params.outgoing && src === ele) { + oEles.push(edge); + oEles.push(tgt); + } else if (params.incoming && tgt === ele) { + oEles.push(edge); + oEles.push(src); + } + } + } + + return this.spawn(oEles, true).filter(selector); + }; + }; + + var defineDagAllHops = function defineDagAllHops(params) { + return function (selector) { + var eles = this; + var sEles = []; + var sElesIds = {}; + + for (;;) { + var next = params.outgoing ? eles.outgoers() : eles.incomers(); + + if (next.length === 0) { + break; + } // done if none left + + + var newNext = false; + + for (var i = 0; i < next.length; i++) { + var n = next[i]; + var nid = n.id(); + + if (!sElesIds[nid]) { + sElesIds[nid] = true; + sEles.push(n); + newNext = true; + } + } + + if (!newNext) { + break; + } // done if touched all outgoers already + + + eles = next; + } + + return this.spawn(sEles, true).filter(selector); + }; + }; + + elesfn$2.clearTraversalCache = function () { + for (var i = 0; i < this.length; i++) { + this[i]._private.traversalCache = null; + } + }; + + extend(elesfn$2, { + // get the root nodes in the DAG + roots: defineDagExtremity({ + noIncomingEdges: true + }), + // get the leaf nodes in the DAG + leaves: defineDagExtremity({ + noOutgoingEdges: true + }), + // normally called children in graph theory + // these nodes =edges=> outgoing nodes + outgoers: cache(defineDagOneHop({ + outgoing: true + }), 'outgoers'), + // aka DAG descendants + successors: defineDagAllHops({ + outgoing: true + }), + // normally called parents in graph theory + // these nodes <=edges= incoming nodes + incomers: cache(defineDagOneHop({ + incoming: true + }), 'incomers'), + // aka DAG ancestors + predecessors: defineDagAllHops({ + incoming: true + }) + }); // Neighbourhood functions + ////////////////////////// + + extend(elesfn$2, { + neighborhood: cache(function (selector) { + var elements = []; + var nodes = this.nodes(); + + for (var i = 0; i < nodes.length; i++) { + // for all nodes + var node = nodes[i]; + var connectedEdges = node.connectedEdges(); // for each connected edge, add the edge and the other node + + for (var j = 0; j < connectedEdges.length; j++) { + var edge = connectedEdges[j]; + var src = edge.source(); + var tgt = edge.target(); + var otherNode = node === src ? tgt : src; // need check in case of loop + + if (otherNode.length > 0) { + elements.push(otherNode[0]); // add node 1 hop away + } // add connected edge + + + elements.push(edge[0]); + } + } + + return this.spawn(elements, true).filter(selector); + }, 'neighborhood'), + closedNeighborhood: function closedNeighborhood(selector) { + return this.neighborhood().add(this).filter(selector); + }, + openNeighborhood: function openNeighborhood(selector) { + return this.neighborhood(selector); + } + }); // aliases + + elesfn$2.neighbourhood = elesfn$2.neighborhood; + elesfn$2.closedNeighbourhood = elesfn$2.closedNeighborhood; + elesfn$2.openNeighbourhood = elesfn$2.openNeighborhood; // Edge functions + ///////////////// + + extend(elesfn$2, { + source: cache(function sourceImpl(selector) { + var ele = this[0]; + var src; + + if (ele) { + src = ele._private.source || ele.cy().collection(); + } + + return src && selector ? src.filter(selector) : src; + }, 'source'), + target: cache(function targetImpl(selector) { + var ele = this[0]; + var tgt; + + if (ele) { + tgt = ele._private.target || ele.cy().collection(); + } + + return tgt && selector ? tgt.filter(selector) : tgt; + }, 'target'), + sources: defineSourceFunction({ + attr: 'source' + }), + targets: defineSourceFunction({ + attr: 'target' + }) + }); + + function defineSourceFunction(params) { + return function sourceImpl(selector) { + var sources = []; + + for (var i = 0; i < this.length; i++) { + var ele = this[i]; + var src = ele._private[params.attr]; + + if (src) { + sources.push(src); + } + } + + return this.spawn(sources, true).filter(selector); + }; + } + + extend(elesfn$2, { + edgesWith: cache(defineEdgesWithFunction(), 'edgesWith'), + edgesTo: cache(defineEdgesWithFunction({ + thisIsSrc: true + }), 'edgesTo') + }); + + function defineEdgesWithFunction(params) { + return function edgesWithImpl(otherNodes) { + var elements = []; + var cy = this._private.cy; + var p = params || {}; // get elements if a selector is specified + + if (string(otherNodes)) { + otherNodes = cy.$(otherNodes); + } + + for (var h = 0; h < otherNodes.length; h++) { + var edges = otherNodes[h]._private.edges; + + for (var i = 0; i < edges.length; i++) { + var edge = edges[i]; + var edgeData = edge._private.data; + var thisToOther = this.hasElementWithId(edgeData.source) && otherNodes.hasElementWithId(edgeData.target); + var otherToThis = otherNodes.hasElementWithId(edgeData.source) && this.hasElementWithId(edgeData.target); + var edgeConnectsThisAndOther = thisToOther || otherToThis; + + if (!edgeConnectsThisAndOther) { + continue; + } + + if (p.thisIsSrc || p.thisIsTgt) { + if (p.thisIsSrc && !thisToOther) { + continue; + } + + if (p.thisIsTgt && !otherToThis) { + continue; + } + } + + elements.push(edge); + } + } + + return this.spawn(elements, true); + }; + } + + extend(elesfn$2, { + connectedEdges: cache(function (selector) { + var retEles = []; + var eles = this; + + for (var i = 0; i < eles.length; i++) { + var node = eles[i]; + + if (!node.isNode()) { + continue; + } + + var edges = node._private.edges; + + for (var j = 0; j < edges.length; j++) { + var edge = edges[j]; + retEles.push(edge); + } + } + + return this.spawn(retEles, true).filter(selector); + }, 'connectedEdges'), + connectedNodes: cache(function (selector) { + var retEles = []; + var eles = this; + + for (var i = 0; i < eles.length; i++) { + var edge = eles[i]; + + if (!edge.isEdge()) { + continue; + } + + retEles.push(edge.source()[0]); + retEles.push(edge.target()[0]); + } + + return this.spawn(retEles, true).filter(selector); + }, 'connectedNodes'), + parallelEdges: cache(defineParallelEdgesFunction(), 'parallelEdges'), + codirectedEdges: cache(defineParallelEdgesFunction({ + codirected: true + }), 'codirectedEdges') + }); + + function defineParallelEdgesFunction(params) { + var defaults = { + codirected: false + }; + params = extend({}, defaults, params); + return function parallelEdgesImpl(selector) { + // micro-optimised for renderer + var elements = []; + var edges = this.edges(); + var p = params; // look at all the edges in the collection + + for (var i = 0; i < edges.length; i++) { + var edge1 = edges[i]; + var edge1_p = edge1._private; + var src1 = edge1_p.source; + var srcid1 = src1._private.data.id; + var tgtid1 = edge1_p.data.target; + var srcEdges1 = src1._private.edges; // look at edges connected to the src node of this edge + + for (var j = 0; j < srcEdges1.length; j++) { + var edge2 = srcEdges1[j]; + var edge2data = edge2._private.data; + var tgtid2 = edge2data.target; + var srcid2 = edge2data.source; + var codirected = tgtid2 === tgtid1 && srcid2 === srcid1; + var oppdirected = srcid1 === tgtid2 && tgtid1 === srcid2; + + if (p.codirected && codirected || !p.codirected && (codirected || oppdirected)) { + elements.push(edge2); + } + } + } + + return this.spawn(elements, true).filter(selector); + }; + } // Misc functions + ///////////////// + + + extend(elesfn$2, { + components: function components(root) { + var self = this; + var cy = self.cy(); + var visited = cy.collection(); + var unvisited = root == null ? self.nodes() : root.nodes(); + var components = []; + + if (root != null && unvisited.empty()) { + // root may contain only edges + unvisited = root.sources(); // doesn't matter which node to use (undirected), so just use the source sides + } + + var visitInComponent = function visitInComponent(node, component) { + visited.merge(node); + unvisited.unmerge(node); + component.merge(node); + }; + + if (unvisited.empty()) { + return self.spawn(); + } + + var _loop = function _loop() { + // each iteration yields a component + var cmpt = cy.collection(); + components.push(cmpt); + var root = unvisited[0]; + visitInComponent(root, cmpt); + self.bfs({ + directed: false, + roots: root, + visit: function visit(v) { + return visitInComponent(v, cmpt); + } + }); + cmpt.forEach(function (node) { + node.connectedEdges().forEach(function (e) { + // connectedEdges() usually cached + if (self.has(e) && cmpt.has(e.source()) && cmpt.has(e.target())) { + // has() is cheap + cmpt.merge(e); // forEach() only considers nodes -- sets N at call time + } + }); + }); + }; + + do { + _loop(); + } while (unvisited.length > 0); + + return components; + }, + component: function component() { + var ele = this[0]; + return ele.cy().mutableElements().components(ele)[0]; + } + }); + elesfn$2.componentsOf = elesfn$2.components; + + var Collection = function Collection(cy, elements) { + var unique = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var removed = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; + + if (cy === undefined) { + error('A collection must have a reference to the core'); + return; + } + + var map = new Map$2(); + var createdElements = false; + + if (!elements) { + elements = []; + } else if (elements.length > 0 && plainObject(elements[0]) && !element(elements[0])) { + createdElements = true; // make elements from json and restore all at once later + + var eles = []; + var elesIds = new Set$1(); + + for (var i = 0, l = elements.length; i < l; i++) { + var json = elements[i]; + + if (json.data == null) { + json.data = {}; + } + + var _data = json.data; // make sure newly created elements have valid ids + + if (_data.id == null) { + _data.id = uuid(); + } else if (cy.hasElementWithId(_data.id) || elesIds.has(_data.id)) { + continue; // can't create element if prior id already exists + } + + var ele = new Element(cy, json, false); + eles.push(ele); + elesIds.add(_data.id); + } + + elements = eles; + } + + this.length = 0; + + for (var _i = 0, _l = elements.length; _i < _l; _i++) { + var element$1 = elements[_i][0]; // [0] in case elements is an array of collections, rather than array of elements + + if (element$1 == null) { + continue; + } + + var id = element$1._private.data.id; + + if (!unique || !map.has(id)) { + if (unique) { + map.set(id, { + index: this.length, + ele: element$1 + }); + } + + this[this.length] = element$1; + this.length++; + } + } + + this._private = { + eles: this, + cy: cy, + + get map() { + if (this.lazyMap == null) { + this.rebuildMap(); + } + + return this.lazyMap; + }, + + set map(m) { + this.lazyMap = m; + }, + + rebuildMap: function rebuildMap() { + var m = this.lazyMap = new Map$2(); + var eles = this.eles; + + for (var _i2 = 0; _i2 < eles.length; _i2++) { + var _ele = eles[_i2]; + m.set(_ele.id(), { + index: _i2, + ele: _ele + }); + } + } + }; + + if (unique) { + this._private.map = map; + } // restore the elements if we created them from json + + + if (createdElements && !removed) { + this.restore(); + } + }; // Functions + //////////////////////////////////////////////////////////////////////////////////////////////////// + // keep the prototypes in sync (an element has the same functions as a collection) + // and use elefn and elesfn as shorthands to the prototypes + + + var elesfn$1 = Element.prototype = Collection.prototype = Object.create(Array.prototype); + + elesfn$1.instanceString = function () { + return 'collection'; + }; + + elesfn$1.spawn = function (eles, unique) { + return new Collection(this.cy(), eles, unique); + }; + + elesfn$1.spawnSelf = function () { + return this.spawn(this); + }; + + elesfn$1.cy = function () { + return this._private.cy; + }; + + elesfn$1.renderer = function () { + return this._private.cy.renderer(); + }; + + elesfn$1.element = function () { + return this[0]; + }; + + elesfn$1.collection = function () { + if (collection(this)) { + return this; + } else { + // an element + return new Collection(this._private.cy, [this]); + } + }; + + elesfn$1.unique = function () { + return new Collection(this._private.cy, this, true); + }; + + elesfn$1.hasElementWithId = function (id) { + id = '' + id; // id must be string + + return this._private.map.has(id); + }; + + elesfn$1.getElementById = function (id) { + id = '' + id; // id must be string + + var cy = this._private.cy; + + var entry = this._private.map.get(id); + + return entry ? entry.ele : new Collection(cy); // get ele or empty collection + }; + + elesfn$1.$id = elesfn$1.getElementById; + + elesfn$1.poolIndex = function () { + var cy = this._private.cy; + var eles = cy._private.elements; + var id = this[0]._private.data.id; + return eles._private.map.get(id).index; + }; + + elesfn$1.indexOf = function (ele) { + var id = ele[0]._private.data.id; + return this._private.map.get(id).index; + }; + + elesfn$1.indexOfId = function (id) { + id = '' + id; // id must be string + + return this._private.map.get(id).index; + }; + + elesfn$1.json = function (obj) { + var ele = this.element(); + var cy = this.cy(); + + if (ele == null && obj) { + return this; + } // can't set to no eles + + + if (ele == null) { + return undefined; + } // can't get from no eles + + + var p = ele._private; + + if (plainObject(obj)) { + // set + cy.startBatch(); + + if (obj.data) { + ele.data(obj.data); + var _data2 = p.data; + + if (ele.isEdge()) { + // source and target are immutable via data() + var move = false; + var spec = {}; + var src = obj.data.source; + var tgt = obj.data.target; + + if (src != null && src != _data2.source) { + spec.source = '' + src; // id must be string + + move = true; + } + + if (tgt != null && tgt != _data2.target) { + spec.target = '' + tgt; // id must be string + + move = true; + } + + if (move) { + ele = ele.move(spec); + } + } else { + // parent is immutable via data() + var newParentValSpecd = ('parent' in obj.data); + var parent = obj.data.parent; + + if (newParentValSpecd && (parent != null || _data2.parent != null) && parent != _data2.parent) { + if (parent === undefined) { + // can't set undefined imperatively, so use null + parent = null; + } + + if (parent != null) { + parent = '' + parent; // id must be string + } + + ele = ele.move({ + parent: parent + }); + } + } + } + + if (obj.position) { + ele.position(obj.position); + } // ignore group -- immutable + + + var checkSwitch = function checkSwitch(k, trueFnName, falseFnName) { + var obj_k = obj[k]; + + if (obj_k != null && obj_k !== p[k]) { + if (obj_k) { + ele[trueFnName](); + } else { + ele[falseFnName](); + } + } + }; + + checkSwitch('removed', 'remove', 'restore'); + checkSwitch('selected', 'select', 'unselect'); + checkSwitch('selectable', 'selectify', 'unselectify'); + checkSwitch('locked', 'lock', 'unlock'); + checkSwitch('grabbable', 'grabify', 'ungrabify'); + checkSwitch('pannable', 'panify', 'unpanify'); + + if (obj.classes != null) { + ele.classes(obj.classes); + } + + cy.endBatch(); + return this; + } else if (obj === undefined) { + // get + var json = { + data: copy(p.data), + position: copy(p.position), + group: p.group, + removed: p.removed, + selected: p.selected, + selectable: p.selectable, + locked: p.locked, + grabbable: p.grabbable, + pannable: p.pannable, + classes: null + }; + json.classes = ''; + var i = 0; + p.classes.forEach(function (cls) { + return json.classes += i++ === 0 ? cls : ' ' + cls; + }); + return json; + } + }; + + elesfn$1.jsons = function () { + var jsons = []; + + for (var i = 0; i < this.length; i++) { + var ele = this[i]; + var json = ele.json(); + jsons.push(json); + } + + return jsons; + }; + + elesfn$1.clone = function () { + var cy = this.cy(); + var elesArr = []; + + for (var i = 0; i < this.length; i++) { + var ele = this[i]; + var json = ele.json(); + var clone = new Element(cy, json, false); // NB no restore + + elesArr.push(clone); + } + + return new Collection(cy, elesArr); + }; + + elesfn$1.copy = elesfn$1.clone; + + elesfn$1.restore = function () { + var notifyRenderer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + var addToPool = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + var self = this; + var cy = self.cy(); + var cy_p = cy._private; // create arrays of nodes and edges, since we need to + // restore the nodes first + + var nodes = []; + var edges = []; + var elements; + + for (var _i3 = 0, l = self.length; _i3 < l; _i3++) { + var ele = self[_i3]; + + if (addToPool && !ele.removed()) { + // don't need to handle this ele + continue; + } // keep nodes first in the array and edges after + + + if (ele.isNode()) { + // put to front of array if node + nodes.push(ele); + } else { + // put to end of array if edge + edges.push(ele); + } + } + + elements = nodes.concat(edges); + var i; + + var removeFromElements = function removeFromElements() { + elements.splice(i, 1); + i--; + }; // now, restore each element + + + for (i = 0; i < elements.length; i++) { + var _ele2 = elements[i]; + var _private = _ele2._private; + var _data3 = _private.data; // the traversal cache should start fresh when ele is added + + _ele2.clearTraversalCache(); // set id and validate + + + if (!addToPool && !_private.removed) ; else if (_data3.id === undefined) { + _data3.id = uuid(); + } else if (number$1(_data3.id)) { + _data3.id = '' + _data3.id; // now it's a string + } else if (emptyString(_data3.id) || !string(_data3.id)) { + error('Can not create element with invalid string ID `' + _data3.id + '`'); // can't create element if it has empty string as id or non-string id + + removeFromElements(); + continue; + } else if (cy.hasElementWithId(_data3.id)) { + error('Can not create second element with ID `' + _data3.id + '`'); // can't create element if one already has that id + + removeFromElements(); + continue; + } + + var id = _data3.id; // id is finalised, now let's keep a ref + + if (_ele2.isNode()) { + // extra checks for nodes + var pos = _private.position; // make sure the nodes have a defined position + + if (pos.x == null) { + pos.x = 0; + } + + if (pos.y == null) { + pos.y = 0; + } + } + + if (_ele2.isEdge()) { + // extra checks for edges + var edge = _ele2; + var fields = ['source', 'target']; + var fieldsLength = fields.length; + var badSourceOrTarget = false; + + for (var j = 0; j < fieldsLength; j++) { + var field = fields[j]; + var val = _data3[field]; + + if (number$1(val)) { + val = _data3[field] = '' + _data3[field]; // now string + } + + if (val == null || val === '') { + // can't create if source or target is not defined properly + error('Can not create edge `' + id + '` with unspecified ' + field); + badSourceOrTarget = true; + } else if (!cy.hasElementWithId(val)) { + // can't create edge if one of its nodes doesn't exist + error('Can not create edge `' + id + '` with nonexistant ' + field + ' `' + val + '`'); + badSourceOrTarget = true; + } + } + + if (badSourceOrTarget) { + removeFromElements(); + continue; + } // can't create this + + + var src = cy.getElementById(_data3.source); + var tgt = cy.getElementById(_data3.target); // only one edge in node if loop + + if (src.same(tgt)) { + src._private.edges.push(edge); + } else { + src._private.edges.push(edge); + + tgt._private.edges.push(edge); + } + + edge._private.source = src; + edge._private.target = tgt; + } // if is edge + // create mock ids / indexes maps for element so it can be used like collections + + + _private.map = new Map$2(); + + _private.map.set(id, { + ele: _ele2, + index: 0 + }); + + _private.removed = false; + + if (addToPool) { + cy.addToPool(_ele2); + } + } // for each element + // do compound node sanity checks + + + for (var _i4 = 0; _i4 < nodes.length; _i4++) { + // each node + var node = nodes[_i4]; + var _data4 = node._private.data; + + if (number$1(_data4.parent)) { + // then automake string + _data4.parent = '' + _data4.parent; + } + + var parentId = _data4.parent; + var specifiedParent = parentId != null; + + if (specifiedParent || node._private.parent) { + var parent = node._private.parent ? cy.collection().merge(node._private.parent) : cy.getElementById(parentId); + + if (parent.empty()) { + // non-existant parent; just remove it + _data4.parent = undefined; + } else if (parent[0].removed()) { + warn('Node added with missing parent, reference to parent removed'); + _data4.parent = undefined; + node._private.parent = null; + } else { + var selfAsParent = false; + var ancestor = parent; + + while (!ancestor.empty()) { + if (node.same(ancestor)) { + // mark self as parent and remove from data + selfAsParent = true; + _data4.parent = undefined; // remove parent reference + // exit or we loop forever + + break; + } + + ancestor = ancestor.parent(); + } + + if (!selfAsParent) { + // connect with children + parent[0]._private.children.push(node); + + node._private.parent = parent[0]; // let the core know we have a compound graph + + cy_p.hasCompoundNodes = true; + } + } // else + + } // if specified parent + + } // for each node + + + if (elements.length > 0) { + var restored = elements.length === self.length ? self : new Collection(cy, elements); + + for (var _i5 = 0; _i5 < restored.length; _i5++) { + var _ele3 = restored[_i5]; + + if (_ele3.isNode()) { + continue; + } // adding an edge invalidates the traversal caches for the parallel edges + + + _ele3.parallelEdges().clearTraversalCache(); // adding an edge invalidates the traversal cache for the connected nodes + + + _ele3.source().clearTraversalCache(); + + _ele3.target().clearTraversalCache(); + } + + var toUpdateStyle; + + if (cy_p.hasCompoundNodes) { + toUpdateStyle = cy.collection().merge(restored).merge(restored.connectedNodes()).merge(restored.parent()); + } else { + toUpdateStyle = restored; + } + + toUpdateStyle.dirtyCompoundBoundsCache().dirtyBoundingBoxCache().updateStyle(notifyRenderer); + + if (notifyRenderer) { + restored.emitAndNotify('add'); + } else if (addToPool) { + restored.emit('add'); + } + } + + return self; // chainability + }; + + elesfn$1.removed = function () { + var ele = this[0]; + return ele && ele._private.removed; + }; + + elesfn$1.inside = function () { + var ele = this[0]; + return ele && !ele._private.removed; + }; + + elesfn$1.remove = function () { + var notifyRenderer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + var removeFromPool = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + var self = this; + var elesToRemove = []; + var elesToRemoveIds = {}; + var cy = self._private.cy; // add connected edges + + function addConnectedEdges(node) { + var edges = node._private.edges; + + for (var i = 0; i < edges.length; i++) { + add(edges[i]); + } + } // add descendant nodes + + + function addChildren(node) { + var children = node._private.children; + + for (var i = 0; i < children.length; i++) { + add(children[i]); + } + } + + function add(ele) { + var alreadyAdded = elesToRemoveIds[ele.id()]; + + if (removeFromPool && ele.removed() || alreadyAdded) { + return; + } else { + elesToRemoveIds[ele.id()] = true; + } + + if (ele.isNode()) { + elesToRemove.push(ele); // nodes are removed last + + addConnectedEdges(ele); + addChildren(ele); + } else { + elesToRemove.unshift(ele); // edges are removed first + } + } // make the list of elements to remove + // (may be removing more than specified due to connected edges etc) + + + for (var i = 0, l = self.length; i < l; i++) { + var ele = self[i]; + add(ele); + } + + function removeEdgeRef(node, edge) { + var connectedEdges = node._private.edges; + removeFromArray(connectedEdges, edge); // removing an edges invalidates the traversal cache for its nodes + + node.clearTraversalCache(); + } + + function removeParallelRef(pllEdge) { + // removing an edge invalidates the traversal caches for the parallel edges + pllEdge.clearTraversalCache(); + } + + var alteredParents = []; + alteredParents.ids = {}; + + function removeChildRef(parent, ele) { + ele = ele[0]; + parent = parent[0]; + var children = parent._private.children; + var pid = parent.id(); + removeFromArray(children, ele); // remove parent => child ref + + ele._private.parent = null; // remove child => parent ref + + if (!alteredParents.ids[pid]) { + alteredParents.ids[pid] = true; + alteredParents.push(parent); + } + } + + self.dirtyCompoundBoundsCache(); + + if (removeFromPool) { + cy.removeFromPool(elesToRemove); // remove from core pool + } + + for (var _i6 = 0; _i6 < elesToRemove.length; _i6++) { + var _ele4 = elesToRemove[_i6]; + + if (_ele4.isEdge()) { + // remove references to this edge in its connected nodes + var src = _ele4.source()[0]; + + var tgt = _ele4.target()[0]; + + removeEdgeRef(src, _ele4); + removeEdgeRef(tgt, _ele4); + + var pllEdges = _ele4.parallelEdges(); + + for (var j = 0; j < pllEdges.length; j++) { + var pllEdge = pllEdges[j]; + removeParallelRef(pllEdge); + + if (pllEdge.isBundledBezier()) { + pllEdge.dirtyBoundingBoxCache(); + } + } + } else { + // remove reference to parent + var parent = _ele4.parent(); + + if (parent.length !== 0) { + removeChildRef(parent, _ele4); + } + } + + if (removeFromPool) { + // mark as removed + _ele4._private.removed = true; + } + } // check to see if we have a compound graph or not + + + var elesStillInside = cy._private.elements; + cy._private.hasCompoundNodes = false; + + for (var _i7 = 0; _i7 < elesStillInside.length; _i7++) { + var _ele5 = elesStillInside[_i7]; + + if (_ele5.isParent()) { + cy._private.hasCompoundNodes = true; + break; + } + } + + var removedElements = new Collection(this.cy(), elesToRemove); + + if (removedElements.size() > 0) { + // must manually notify since trigger won't do this automatically once removed + if (notifyRenderer) { + removedElements.emitAndNotify('remove'); + } else if (removeFromPool) { + removedElements.emit('remove'); + } + } // the parents who were modified by the removal need their style updated + + + for (var _i8 = 0; _i8 < alteredParents.length; _i8++) { + var _ele6 = alteredParents[_i8]; + + if (!removeFromPool || !_ele6.removed()) { + _ele6.updateStyle(); + } + } + + return removedElements; + }; + + elesfn$1.move = function (struct) { + var cy = this._private.cy; + var eles = this; // just clean up refs, caches, etc. in the same way as when removing and then restoring + // (our calls to remove/restore do not remove from the graph or make events) + + var notifyRenderer = false; + var modifyPool = false; + + var toString = function toString(id) { + return id == null ? id : '' + id; + }; // id must be string + + + if (struct.source !== undefined || struct.target !== undefined) { + var srcId = toString(struct.source); + var tgtId = toString(struct.target); + var srcExists = srcId != null && cy.hasElementWithId(srcId); + var tgtExists = tgtId != null && cy.hasElementWithId(tgtId); + + if (srcExists || tgtExists) { + cy.batch(function () { + // avoid duplicate style updates + eles.remove(notifyRenderer, modifyPool); // clean up refs etc. + + eles.emitAndNotify('moveout'); + + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + var _data5 = ele._private.data; + + if (ele.isEdge()) { + if (srcExists) { + _data5.source = srcId; + } + + if (tgtExists) { + _data5.target = tgtId; + } + } + } + + eles.restore(notifyRenderer, modifyPool); // make new refs, style, etc. + }); + eles.emitAndNotify('move'); + } + } else if (struct.parent !== undefined) { + // move node to new parent + var parentId = toString(struct.parent); + var parentExists = parentId === null || cy.hasElementWithId(parentId); + + if (parentExists) { + var pidToAssign = parentId === null ? undefined : parentId; + cy.batch(function () { + // avoid duplicate style updates + var updated = eles.remove(notifyRenderer, modifyPool); // clean up refs etc. + + updated.emitAndNotify('moveout'); + + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + var _data6 = ele._private.data; + + if (ele.isNode()) { + _data6.parent = pidToAssign; + } + } + + updated.restore(notifyRenderer, modifyPool); // make new refs, style, etc. + }); + eles.emitAndNotify('move'); + } + } + + return this; + }; + + [elesfn$j, elesfn$i, elesfn$h, elesfn$g, elesfn$f, data, elesfn$d, dimensions, elesfn$9, elesfn$8, elesfn$7, elesfn$6, elesfn$5, elesfn$4, elesfn$3, elesfn$2].forEach(function (props) { + extend(elesfn$1, props); + }); + + var corefn$9 = { + add: function add(opts) { + var elements; + var cy = this; // add the elements + + if (elementOrCollection(opts)) { + var eles = opts; + + if (eles._private.cy === cy) { + // same instance => just restore + elements = eles.restore(); + } else { + // otherwise, copy from json + var jsons = []; + + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + jsons.push(ele.json()); + } + + elements = new Collection(cy, jsons); + } + } // specify an array of options + else if (array(opts)) { + var _jsons = opts; + elements = new Collection(cy, _jsons); + } // specify via opts.nodes and opts.edges + else if (plainObject(opts) && (array(opts.nodes) || array(opts.edges))) { + var elesByGroup = opts; + var _jsons2 = []; + var grs = ['nodes', 'edges']; + + for (var _i = 0, il = grs.length; _i < il; _i++) { + var group = grs[_i]; + var elesArray = elesByGroup[group]; + + if (array(elesArray)) { + for (var j = 0, jl = elesArray.length; j < jl; j++) { + var json = extend({ + group: group + }, elesArray[j]); + + _jsons2.push(json); + } + } + } + + elements = new Collection(cy, _jsons2); + } // specify options for one element + else { + var _json = opts; + elements = new Element(cy, _json).collection(); + } + + return elements; + }, + remove: function remove(collection) { + if (elementOrCollection(collection)) ; else if (string(collection)) { + var selector = collection; + collection = this.$(selector); + } + + return collection.remove(); + } + }; + + /* global Float32Array */ + + /*! Bezier curve function generator. Copyright Gaetan Renaudeau. MIT License: http://en.wikipedia.org/wiki/MIT_License */ + function generateCubicBezier(mX1, mY1, mX2, mY2) { + var NEWTON_ITERATIONS = 4, + NEWTON_MIN_SLOPE = 0.001, + SUBDIVISION_PRECISION = 0.0000001, + SUBDIVISION_MAX_ITERATIONS = 10, + kSplineTableSize = 11, + kSampleStepSize = 1.0 / (kSplineTableSize - 1.0), + float32ArraySupported = typeof Float32Array !== 'undefined'; + /* Must contain four arguments. */ + + if (arguments.length !== 4) { + return false; + } + /* Arguments must be numbers. */ + + + for (var i = 0; i < 4; ++i) { + if (typeof arguments[i] !== "number" || isNaN(arguments[i]) || !isFinite(arguments[i])) { + return false; + } + } + /* X values must be in the [0, 1] range. */ + + + mX1 = Math.min(mX1, 1); + mX2 = Math.min(mX2, 1); + mX1 = Math.max(mX1, 0); + mX2 = Math.max(mX2, 0); + var mSampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize); + + function A(aA1, aA2) { + return 1.0 - 3.0 * aA2 + 3.0 * aA1; + } + + function B(aA1, aA2) { + return 3.0 * aA2 - 6.0 * aA1; + } + + function C(aA1) { + return 3.0 * aA1; + } + + function calcBezier(aT, aA1, aA2) { + return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT; + } + + function getSlope(aT, aA1, aA2) { + return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1); + } + + function newtonRaphsonIterate(aX, aGuessT) { + for (var _i = 0; _i < NEWTON_ITERATIONS; ++_i) { + var currentSlope = getSlope(aGuessT, mX1, mX2); + + if (currentSlope === 0.0) { + return aGuessT; + } + + var currentX = calcBezier(aGuessT, mX1, mX2) - aX; + aGuessT -= currentX / currentSlope; + } + + return aGuessT; + } + + function calcSampleValues() { + for (var _i2 = 0; _i2 < kSplineTableSize; ++_i2) { + mSampleValues[_i2] = calcBezier(_i2 * kSampleStepSize, mX1, mX2); + } + } + + function binarySubdivide(aX, aA, aB) { + var currentX, + currentT, + i = 0; + + do { + currentT = aA + (aB - aA) / 2.0; + currentX = calcBezier(currentT, mX1, mX2) - aX; + + if (currentX > 0.0) { + aB = currentT; + } else { + aA = currentT; + } + } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS); + + return currentT; + } + + function getTForX(aX) { + var intervalStart = 0.0, + currentSample = 1, + lastSample = kSplineTableSize - 1; + + for (; currentSample !== lastSample && mSampleValues[currentSample] <= aX; ++currentSample) { + intervalStart += kSampleStepSize; + } + + --currentSample; + var dist = (aX - mSampleValues[currentSample]) / (mSampleValues[currentSample + 1] - mSampleValues[currentSample]), + guessForT = intervalStart + dist * kSampleStepSize, + initialSlope = getSlope(guessForT, mX1, mX2); + + if (initialSlope >= NEWTON_MIN_SLOPE) { + return newtonRaphsonIterate(aX, guessForT); + } else if (initialSlope === 0.0) { + return guessForT; + } else { + return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize); + } + } + + var _precomputed = false; + + function precompute() { + _precomputed = true; + + if (mX1 !== mY1 || mX2 !== mY2) { + calcSampleValues(); + } + } + + var f = function f(aX) { + if (!_precomputed) { + precompute(); + } + + if (mX1 === mY1 && mX2 === mY2) { + return aX; + } + + if (aX === 0) { + return 0; + } + + if (aX === 1) { + return 1; + } + + return calcBezier(getTForX(aX), mY1, mY2); + }; + + f.getControlPoints = function () { + return [{ + x: mX1, + y: mY1 + }, { + x: mX2, + y: mY2 + }]; + }; + + var str = "generateBezier(" + [mX1, mY1, mX2, mY2] + ")"; + + f.toString = function () { + return str; + }; + + return f; + } + + /*! Runge-Kutta spring physics function generator. Adapted from Framer.js, copyright Koen Bok. MIT License: http://en.wikipedia.org/wiki/MIT_License */ + + /* Given a tension, friction, and duration, a simulation at 60FPS will first run without a defined duration in order to calculate the full path. A second pass + then adjusts the time delta -- using the relation between actual time and duration -- to calculate the path for the duration-constrained animation. */ + var generateSpringRK4 = function () { + function springAccelerationForState(state) { + return -state.tension * state.x - state.friction * state.v; + } + + function springEvaluateStateWithDerivative(initialState, dt, derivative) { + var state = { + x: initialState.x + derivative.dx * dt, + v: initialState.v + derivative.dv * dt, + tension: initialState.tension, + friction: initialState.friction + }; + return { + dx: state.v, + dv: springAccelerationForState(state) + }; + } + + function springIntegrateState(state, dt) { + var a = { + dx: state.v, + dv: springAccelerationForState(state) + }, + b = springEvaluateStateWithDerivative(state, dt * 0.5, a), + c = springEvaluateStateWithDerivative(state, dt * 0.5, b), + d = springEvaluateStateWithDerivative(state, dt, c), + dxdt = 1.0 / 6.0 * (a.dx + 2.0 * (b.dx + c.dx) + d.dx), + dvdt = 1.0 / 6.0 * (a.dv + 2.0 * (b.dv + c.dv) + d.dv); + state.x = state.x + dxdt * dt; + state.v = state.v + dvdt * dt; + return state; + } + + return function springRK4Factory(tension, friction, duration) { + var initState = { + x: -1, + v: 0, + tension: null, + friction: null + }, + path = [0], + time_lapsed = 0, + tolerance = 1 / 10000, + DT = 16 / 1000, + have_duration, + dt, + last_state; + tension = parseFloat(tension) || 500; + friction = parseFloat(friction) || 20; + duration = duration || null; + initState.tension = tension; + initState.friction = friction; + have_duration = duration !== null; + /* Calculate the actual time it takes for this animation to complete with the provided conditions. */ + + if (have_duration) { + /* Run the simulation without a duration. */ + time_lapsed = springRK4Factory(tension, friction); + /* Compute the adjusted time delta. */ + + dt = time_lapsed / duration * DT; + } else { + dt = DT; + } + + for (;;) { + /* Next/step function .*/ + last_state = springIntegrateState(last_state || initState, dt); + /* Store the position. */ + + path.push(1 + last_state.x); + time_lapsed += 16; + /* If the change threshold is reached, break. */ + + if (!(Math.abs(last_state.x) > tolerance && Math.abs(last_state.v) > tolerance)) { + break; + } + } + /* If duration is not defined, return the actual time required for completing this animation. Otherwise, return a closure that holds the + computed path and returns a snapshot of the position according to a given percentComplete. */ + + + return !have_duration ? time_lapsed : function (percentComplete) { + return path[percentComplete * (path.length - 1) | 0]; + }; + }; + }(); + + var cubicBezier = function cubicBezier(t1, p1, t2, p2) { + var bezier = generateCubicBezier(t1, p1, t2, p2); + return function (start, end, percent) { + return start + (end - start) * bezier(percent); + }; + }; + + var easings = { + 'linear': function linear(start, end, percent) { + return start + (end - start) * percent; + }, + // default easings + 'ease': cubicBezier(0.25, 0.1, 0.25, 1), + 'ease-in': cubicBezier(0.42, 0, 1, 1), + 'ease-out': cubicBezier(0, 0, 0.58, 1), + 'ease-in-out': cubicBezier(0.42, 0, 0.58, 1), + // sine + 'ease-in-sine': cubicBezier(0.47, 0, 0.745, 0.715), + 'ease-out-sine': cubicBezier(0.39, 0.575, 0.565, 1), + 'ease-in-out-sine': cubicBezier(0.445, 0.05, 0.55, 0.95), + // quad + 'ease-in-quad': cubicBezier(0.55, 0.085, 0.68, 0.53), + 'ease-out-quad': cubicBezier(0.25, 0.46, 0.45, 0.94), + 'ease-in-out-quad': cubicBezier(0.455, 0.03, 0.515, 0.955), + // cubic + 'ease-in-cubic': cubicBezier(0.55, 0.055, 0.675, 0.19), + 'ease-out-cubic': cubicBezier(0.215, 0.61, 0.355, 1), + 'ease-in-out-cubic': cubicBezier(0.645, 0.045, 0.355, 1), + // quart + 'ease-in-quart': cubicBezier(0.895, 0.03, 0.685, 0.22), + 'ease-out-quart': cubicBezier(0.165, 0.84, 0.44, 1), + 'ease-in-out-quart': cubicBezier(0.77, 0, 0.175, 1), + // quint + 'ease-in-quint': cubicBezier(0.755, 0.05, 0.855, 0.06), + 'ease-out-quint': cubicBezier(0.23, 1, 0.32, 1), + 'ease-in-out-quint': cubicBezier(0.86, 0, 0.07, 1), + // expo + 'ease-in-expo': cubicBezier(0.95, 0.05, 0.795, 0.035), + 'ease-out-expo': cubicBezier(0.19, 1, 0.22, 1), + 'ease-in-out-expo': cubicBezier(1, 0, 0, 1), + // circ + 'ease-in-circ': cubicBezier(0.6, 0.04, 0.98, 0.335), + 'ease-out-circ': cubicBezier(0.075, 0.82, 0.165, 1), + 'ease-in-out-circ': cubicBezier(0.785, 0.135, 0.15, 0.86), + // user param easings... + 'spring': function spring(tension, friction, duration) { + if (duration === 0) { + // can't get a spring w/ duration 0 + return easings.linear; // duration 0 => jump to end so impl doesn't matter + } + + var spring = generateSpringRK4(tension, friction, duration); + return function (start, end, percent) { + return start + (end - start) * spring(percent); + }; + }, + 'cubic-bezier': cubicBezier + }; + + function getEasedValue(type, start, end, percent, easingFn) { + if (percent === 1) { + return end; + } + + if (start === end) { + return end; + } + + var val = easingFn(start, end, percent); + + if (type == null) { + return val; + } + + if (type.roundValue || type.color) { + val = Math.round(val); + } + + if (type.min !== undefined) { + val = Math.max(val, type.min); + } + + if (type.max !== undefined) { + val = Math.min(val, type.max); + } + + return val; + } + + function getValue(prop, spec) { + if (prop.pfValue != null || prop.value != null) { + if (prop.pfValue != null && (spec == null || spec.type.units !== '%')) { + return prop.pfValue; + } else { + return prop.value; + } + } else { + return prop; + } + } + + function ease(startProp, endProp, percent, easingFn, propSpec) { + var type = propSpec != null ? propSpec.type : null; + + if (percent < 0) { + percent = 0; + } else if (percent > 1) { + percent = 1; + } + + var start = getValue(startProp, propSpec); + var end = getValue(endProp, propSpec); + + if (number$1(start) && number$1(end)) { + return getEasedValue(type, start, end, percent, easingFn); + } else if (array(start) && array(end)) { + var easedArr = []; + + for (var i = 0; i < end.length; i++) { + var si = start[i]; + var ei = end[i]; + + if (si != null && ei != null) { + var val = getEasedValue(type, si, ei, percent, easingFn); + easedArr.push(val); + } else { + easedArr.push(ei); + } + } + + return easedArr; + } + + return undefined; + } + + function step$1(self, ani, now, isCore) { + var isEles = !isCore; + var _p = self._private; + var ani_p = ani._private; + var pEasing = ani_p.easing; + var startTime = ani_p.startTime; + var cy = isCore ? self : self.cy(); + var style = cy.style(); + + if (!ani_p.easingImpl) { + if (pEasing == null) { + // use default + ani_p.easingImpl = easings['linear']; + } else { + // then define w/ name + var easingVals; + + if (string(pEasing)) { + var easingProp = style.parse('transition-timing-function', pEasing); + easingVals = easingProp.value; + } else { + // then assume preparsed array + easingVals = pEasing; + } + + var name, args; + + if (string(easingVals)) { + name = easingVals; + args = []; + } else { + name = easingVals[1]; + args = easingVals.slice(2).map(function (n) { + return +n; + }); + } + + if (args.length > 0) { + // create with args + if (name === 'spring') { + args.push(ani_p.duration); // need duration to generate spring + } + + ani_p.easingImpl = easings[name].apply(null, args); + } else { + // static impl by name + ani_p.easingImpl = easings[name]; + } + } + } + + var easing = ani_p.easingImpl; + var percent; + + if (ani_p.duration === 0) { + percent = 1; + } else { + percent = (now - startTime) / ani_p.duration; + } + + if (ani_p.applying) { + percent = ani_p.progress; + } + + if (percent < 0) { + percent = 0; + } else if (percent > 1) { + percent = 1; + } + + if (ani_p.delay == null) { + // then update + var startPos = ani_p.startPosition; + var endPos = ani_p.position; + + if (endPos && isEles && !self.locked()) { + var newPos = {}; + + if (valid(startPos.x, endPos.x)) { + newPos.x = ease(startPos.x, endPos.x, percent, easing); + } + + if (valid(startPos.y, endPos.y)) { + newPos.y = ease(startPos.y, endPos.y, percent, easing); + } + + self.position(newPos); + } + + var startPan = ani_p.startPan; + var endPan = ani_p.pan; + var pan = _p.pan; + var animatingPan = endPan != null && isCore; + + if (animatingPan) { + if (valid(startPan.x, endPan.x)) { + pan.x = ease(startPan.x, endPan.x, percent, easing); + } + + if (valid(startPan.y, endPan.y)) { + pan.y = ease(startPan.y, endPan.y, percent, easing); + } + + self.emit('pan'); + } + + var startZoom = ani_p.startZoom; + var endZoom = ani_p.zoom; + var animatingZoom = endZoom != null && isCore; + + if (animatingZoom) { + if (valid(startZoom, endZoom)) { + _p.zoom = bound(_p.minZoom, ease(startZoom, endZoom, percent, easing), _p.maxZoom); + } + + self.emit('zoom'); + } + + if (animatingPan || animatingZoom) { + self.emit('viewport'); + } + + var props = ani_p.style; + + if (props && props.length > 0 && isEles) { + for (var i = 0; i < props.length; i++) { + var prop = props[i]; + var _name = prop.name; + var end = prop; + var start = ani_p.startStyle[_name]; + var propSpec = style.properties[start.name]; + var easedVal = ease(start, end, percent, easing, propSpec); + style.overrideBypass(self, _name, easedVal); + } // for props + + + self.emit('style'); + } // if + + } + + ani_p.progress = percent; + return percent; + } + + function valid(start, end) { + if (start == null || end == null) { + return false; + } + + if (number$1(start) && number$1(end)) { + return true; + } else if (start && end) { + return true; + } + + return false; + } + + function startAnimation(self, ani, now, isCore) { + var ani_p = ani._private; + ani_p.started = true; + ani_p.startTime = now - ani_p.progress * ani_p.duration; + } + + function stepAll(now, cy) { + var eles = cy._private.aniEles; + var doneEles = []; + + function stepOne(ele, isCore) { + var _p = ele._private; + var current = _p.animation.current; + var queue = _p.animation.queue; + var ranAnis = false; // if nothing currently animating, get something from the queue + + if (current.length === 0) { + var next = queue.shift(); + + if (next) { + current.push(next); + } + } + + var callbacks = function callbacks(_callbacks) { + for (var j = _callbacks.length - 1; j >= 0; j--) { + var cb = _callbacks[j]; + cb(); + } + + _callbacks.splice(0, _callbacks.length); + }; // step and remove if done + + + for (var i = current.length - 1; i >= 0; i--) { + var ani = current[i]; + var ani_p = ani._private; + + if (ani_p.stopped) { + current.splice(i, 1); + ani_p.hooked = false; + ani_p.playing = false; + ani_p.started = false; + callbacks(ani_p.frames); + continue; + } + + if (!ani_p.playing && !ani_p.applying) { + continue; + } // an apply() while playing shouldn't do anything + + + if (ani_p.playing && ani_p.applying) { + ani_p.applying = false; + } + + if (!ani_p.started) { + startAnimation(ele, ani, now); + } + + step$1(ele, ani, now, isCore); + + if (ani_p.applying) { + ani_p.applying = false; + } + + callbacks(ani_p.frames); + + if (ani_p.step != null) { + ani_p.step(now); + } + + if (ani.completed()) { + current.splice(i, 1); + ani_p.hooked = false; + ani_p.playing = false; + ani_p.started = false; + callbacks(ani_p.completes); + } + + ranAnis = true; + } + + if (!isCore && current.length === 0 && queue.length === 0) { + doneEles.push(ele); + } + + return ranAnis; + } // stepElement + // handle all eles + + + var ranEleAni = false; + + for (var e = 0; e < eles.length; e++) { + var ele = eles[e]; + var handledThisEle = stepOne(ele); + ranEleAni = ranEleAni || handledThisEle; + } // each element + + + var ranCoreAni = stepOne(cy, true); // notify renderer + + if (ranEleAni || ranCoreAni) { + if (eles.length > 0) { + cy.notify('draw', eles); + } else { + cy.notify('draw'); + } + } // remove elements from list of currently animating if its queues are empty + + + eles.unmerge(doneEles); + cy.emit('step'); + } // stepAll + + var corefn$8 = { + // pull in animation functions + animate: define.animate(), + animation: define.animation(), + animated: define.animated(), + clearQueue: define.clearQueue(), + delay: define.delay(), + delayAnimation: define.delayAnimation(), + stop: define.stop(), + addToAnimationPool: function addToAnimationPool(eles) { + var cy = this; + + if (!cy.styleEnabled()) { + return; + } // save cycles when no style used + + + cy._private.aniEles.merge(eles); + }, + stopAnimationLoop: function stopAnimationLoop() { + this._private.animationsRunning = false; + }, + startAnimationLoop: function startAnimationLoop() { + var cy = this; + cy._private.animationsRunning = true; + + if (!cy.styleEnabled()) { + return; + } // save cycles when no style used + // NB the animation loop will exec in headless environments if style enabled + // and explicit cy.destroy() is necessary to stop the loop + + + function headlessStep() { + if (!cy._private.animationsRunning) { + return; + } + + requestAnimationFrame(function animationStep(now) { + stepAll(now, cy); + headlessStep(); + }); + } + + var renderer = cy.renderer(); + + if (renderer && renderer.beforeRender) { + // let the renderer schedule animations + renderer.beforeRender(function rendererAnimationStep(willDraw, now) { + stepAll(now, cy); + }, renderer.beforeRenderPriorities.animations); + } else { + // manage the animation loop ourselves + headlessStep(); // first call + } + } + }; + + var emitterOptions = { + qualifierCompare: function qualifierCompare(selector1, selector2) { + if (selector1 == null || selector2 == null) { + return selector1 == null && selector2 == null; + } else { + return selector1.sameText(selector2); + } + }, + eventMatches: function eventMatches(cy, listener, eventObj) { + var selector = listener.qualifier; + + if (selector != null) { + return cy !== eventObj.target && element(eventObj.target) && selector.matches(eventObj.target); + } + + return true; + }, + addEventFields: function addEventFields(cy, evt) { + evt.cy = cy; + evt.target = cy; + }, + callbackContext: function callbackContext(cy, listener, eventObj) { + return listener.qualifier != null ? eventObj.target : cy; + } + }; + + var argSelector = function argSelector(arg) { + if (string(arg)) { + return new Selector(arg); + } else { + return arg; + } + }; + + var elesfn = { + createEmitter: function createEmitter() { + var _p = this._private; + + if (!_p.emitter) { + _p.emitter = new Emitter(emitterOptions, this); + } + + return this; + }, + emitter: function emitter() { + return this._private.emitter; + }, + on: function on(events, selector, callback) { + this.emitter().on(events, argSelector(selector), callback); + return this; + }, + removeListener: function removeListener(events, selector, callback) { + this.emitter().removeListener(events, argSelector(selector), callback); + return this; + }, + removeAllListeners: function removeAllListeners() { + this.emitter().removeAllListeners(); + return this; + }, + one: function one(events, selector, callback) { + this.emitter().one(events, argSelector(selector), callback); + return this; + }, + once: function once(events, selector, callback) { + this.emitter().one(events, argSelector(selector), callback); + return this; + }, + emit: function emit(events, extraParams) { + this.emitter().emit(events, extraParams); + return this; + }, + emitAndNotify: function emitAndNotify(event, eles) { + this.emit(event); + this.notify(event, eles); + return this; + } + }; + define.eventAliasesOn(elesfn); + + var corefn$7 = { + png: function png(options) { + var renderer = this._private.renderer; + options = options || {}; + return renderer.png(options); + }, + jpg: function jpg(options) { + var renderer = this._private.renderer; + options = options || {}; + options.bg = options.bg || '#fff'; + return renderer.jpg(options); + } + }; + corefn$7.jpeg = corefn$7.jpg; + + var corefn$6 = { + layout: function layout(options) { + var cy = this; + + if (options == null) { + error('Layout options must be specified to make a layout'); + return; + } + + if (options.name == null) { + error('A `name` must be specified to make a layout'); + return; + } + + var name = options.name; + var Layout = cy.extension('layout', name); + + if (Layout == null) { + error('No such layout `' + name + '` found. Did you forget to import it and `cytoscape.use()` it?'); + return; + } + + var eles; + + if (string(options.eles)) { + eles = cy.$(options.eles); + } else { + eles = options.eles != null ? options.eles : cy.$(); + } + + var layout = new Layout(extend({}, options, { + cy: cy, + eles: eles + })); + return layout; + } + }; + corefn$6.createLayout = corefn$6.makeLayout = corefn$6.layout; + + var corefn$5 = { + notify: function notify(eventName, eventEles) { + var _p = this._private; + + if (this.batching()) { + _p.batchNotifications = _p.batchNotifications || {}; + var eles = _p.batchNotifications[eventName] = _p.batchNotifications[eventName] || this.collection(); + + if (eventEles != null) { + eles.merge(eventEles); + } + + return; // notifications are disabled during batching + } + + if (!_p.notificationsEnabled) { + return; + } // exit on disabled + + + var renderer = this.renderer(); // exit if destroy() called on core or renderer in between frames #1499 #1528 + + if (this.destroyed() || !renderer) { + return; + } + + renderer.notify(eventName, eventEles); + }, + notifications: function notifications(bool) { + var p = this._private; + + if (bool === undefined) { + return p.notificationsEnabled; + } else { + p.notificationsEnabled = bool ? true : false; + } + + return this; + }, + noNotifications: function noNotifications(callback) { + this.notifications(false); + callback(); + this.notifications(true); + }, + batching: function batching() { + return this._private.batchCount > 0; + }, + startBatch: function startBatch() { + var _p = this._private; + + if (_p.batchCount == null) { + _p.batchCount = 0; + } + + if (_p.batchCount === 0) { + _p.batchStyleEles = this.collection(); + _p.batchNotifications = {}; + } + + _p.batchCount++; + return this; + }, + endBatch: function endBatch() { + var _p = this._private; + + if (_p.batchCount === 0) { + return this; + } + + _p.batchCount--; + + if (_p.batchCount === 0) { + // update style for dirty eles + _p.batchStyleEles.updateStyle(); + + var renderer = this.renderer(); // notify the renderer of queued eles and event types + + Object.keys(_p.batchNotifications).forEach(function (eventName) { + var eles = _p.batchNotifications[eventName]; + + if (eles.empty()) { + renderer.notify(eventName); + } else { + renderer.notify(eventName, eles); + } + }); + } + + return this; + }, + batch: function batch(callback) { + this.startBatch(); + callback(); + this.endBatch(); + return this; + }, + // for backwards compatibility + batchData: function batchData(map) { + var cy = this; + return this.batch(function () { + var ids = Object.keys(map); + + for (var i = 0; i < ids.length; i++) { + var id = ids[i]; + var data = map[id]; + var ele = cy.getElementById(id); + ele.data(data); + } + }); + } + }; + + var rendererDefaults = defaults$g({ + hideEdgesOnViewport: false, + textureOnViewport: false, + motionBlur: false, + motionBlurOpacity: 0.05, + pixelRatio: undefined, + desktopTapThreshold: 4, + touchTapThreshold: 8, + wheelSensitivity: 1, + debug: false, + showFps: false + }); + var corefn$4 = { + renderTo: function renderTo(context, zoom, pan, pxRatio) { + var r = this._private.renderer; + r.renderTo(context, zoom, pan, pxRatio); + return this; + }, + renderer: function renderer() { + return this._private.renderer; + }, + forceRender: function forceRender() { + this.notify('draw'); + return this; + }, + resize: function resize() { + this.invalidateSize(); + this.emitAndNotify('resize'); + return this; + }, + initRenderer: function initRenderer(options) { + var cy = this; + var RendererProto = cy.extension('renderer', options.name); + + if (RendererProto == null) { + error("Can not initialise: No such renderer `".concat(options.name, "` found. Did you forget to import it and `cytoscape.use()` it?")); + return; + } + + if (options.wheelSensitivity !== undefined) { + warn("You have set a custom wheel sensitivity. This will make your app zoom unnaturally when using mainstream mice. You should change this value from the default only if you can guarantee that all your users will use the same hardware and OS configuration as your current machine."); + } + + var rOpts = rendererDefaults(options); + rOpts.cy = cy; + cy._private.renderer = new RendererProto(rOpts); + this.notify('init'); + }, + destroyRenderer: function destroyRenderer() { + var cy = this; + cy.notify('destroy'); // destroy the renderer + + var domEle = cy.container(); + + if (domEle) { + domEle._cyreg = null; + + while (domEle.childNodes.length > 0) { + domEle.removeChild(domEle.childNodes[0]); + } + } + + cy._private.renderer = null; // to be extra safe, remove the ref + + cy.mutableElements().forEach(function (ele) { + var _p = ele._private; + _p.rscratch = {}; + _p.rstyle = {}; + _p.animation.current = []; + _p.animation.queue = []; + }); + }, + onRender: function onRender(fn) { + return this.on('render', fn); + }, + offRender: function offRender(fn) { + return this.off('render', fn); + } + }; + corefn$4.invalidateDimensions = corefn$4.resize; + + var corefn$3 = { + // get a collection + // - empty collection on no args + // - collection of elements in the graph on selector arg + // - guarantee a returned collection when elements or collection specified + collection: function collection(eles, opts) { + if (string(eles)) { + return this.$(eles); + } else if (elementOrCollection(eles)) { + return eles.collection(); + } else if (array(eles)) { + if (!opts) { + opts = {}; + } + + return new Collection(this, eles, opts.unique, opts.removed); + } + + return new Collection(this); + }, + nodes: function nodes(selector) { + var nodes = this.$(function (ele) { + return ele.isNode(); + }); + + if (selector) { + return nodes.filter(selector); + } + + return nodes; + }, + edges: function edges(selector) { + var edges = this.$(function (ele) { + return ele.isEdge(); + }); + + if (selector) { + return edges.filter(selector); + } + + return edges; + }, + // search the graph like jQuery + $: function $(selector) { + var eles = this._private.elements; + + if (selector) { + return eles.filter(selector); + } else { + return eles.spawnSelf(); + } + }, + mutableElements: function mutableElements() { + return this._private.elements; + } + }; // aliases + + corefn$3.elements = corefn$3.filter = corefn$3.$; + + var styfn$8 = {}; // keys for style blocks, e.g. ttfftt + + var TRUE = 't'; + var FALSE = 'f'; // (potentially expensive calculation) + // apply the style to the element based on + // - its bypass + // - what selectors match it + + styfn$8.apply = function (eles) { + var self = this; + var _p = self._private; + var cy = _p.cy; + var updatedEles = cy.collection(); + + for (var ie = 0; ie < eles.length; ie++) { + var ele = eles[ie]; + var cxtMeta = self.getContextMeta(ele); + + if (cxtMeta.empty) { + continue; + } + + var cxtStyle = self.getContextStyle(cxtMeta); + var app = self.applyContextStyle(cxtMeta, cxtStyle, ele); + + if (ele._private.appliedInitStyle) { + self.updateTransitions(ele, app.diffProps); + } else { + ele._private.appliedInitStyle = true; + } + + var hintsDiff = self.updateStyleHints(ele); + + if (hintsDiff) { + updatedEles.push(ele); + } + } // for elements + + + return updatedEles; + }; + + styfn$8.getPropertiesDiff = function (oldCxtKey, newCxtKey) { + var self = this; + var cache = self._private.propDiffs = self._private.propDiffs || {}; + var dualCxtKey = oldCxtKey + '-' + newCxtKey; + var cachedVal = cache[dualCxtKey]; + + if (cachedVal) { + return cachedVal; + } + + var diffProps = []; + var addedProp = {}; + + for (var i = 0; i < self.length; i++) { + var cxt = self[i]; + var oldHasCxt = oldCxtKey[i] === TRUE; + var newHasCxt = newCxtKey[i] === TRUE; + var cxtHasDiffed = oldHasCxt !== newHasCxt; + var cxtHasMappedProps = cxt.mappedProperties.length > 0; + + if (cxtHasDiffed || newHasCxt && cxtHasMappedProps) { + var props = void 0; + + if (cxtHasDiffed && cxtHasMappedProps) { + props = cxt.properties; // suffices b/c mappedProperties is a subset of properties + } else if (cxtHasDiffed) { + props = cxt.properties; // need to check them all + } else if (cxtHasMappedProps) { + props = cxt.mappedProperties; // only need to check mapped + } + + for (var j = 0; j < props.length; j++) { + var prop = props[j]; + var name = prop.name; // if a later context overrides this property, then the fact that this context has switched/diffed doesn't matter + // (semi expensive check since it makes this function O(n^2) on context length, but worth it since overall result + // is cached) + + var laterCxtOverrides = false; + + for (var k = i + 1; k < self.length; k++) { + var laterCxt = self[k]; + var hasLaterCxt = newCxtKey[k] === TRUE; + + if (!hasLaterCxt) { + continue; + } // can't override unless the context is active + + + laterCxtOverrides = laterCxt.properties[prop.name] != null; + + if (laterCxtOverrides) { + break; + } // exit early as long as one later context overrides + + } + + if (!addedProp[name] && !laterCxtOverrides) { + addedProp[name] = true; + diffProps.push(name); + } + } // for props + + } // if + + } // for contexts + + + cache[dualCxtKey] = diffProps; + return diffProps; + }; + + styfn$8.getContextMeta = function (ele) { + var self = this; + var cxtKey = ''; + var diffProps; + var prevKey = ele._private.styleCxtKey || ''; // get the cxt key + + for (var i = 0; i < self.length; i++) { + var context = self[i]; + var contextSelectorMatches = context.selector && context.selector.matches(ele); // NB: context.selector may be null for 'core' + + if (contextSelectorMatches) { + cxtKey += TRUE; + } else { + cxtKey += FALSE; + } + } // for context + + + diffProps = self.getPropertiesDiff(prevKey, cxtKey); + ele._private.styleCxtKey = cxtKey; + return { + key: cxtKey, + diffPropNames: diffProps, + empty: diffProps.length === 0 + }; + }; // gets a computed ele style object based on matched contexts + + + styfn$8.getContextStyle = function (cxtMeta) { + var cxtKey = cxtMeta.key; + var self = this; + var cxtStyles = this._private.contextStyles = this._private.contextStyles || {}; // if already computed style, returned cached copy + + if (cxtStyles[cxtKey]) { + return cxtStyles[cxtKey]; + } + + var style = { + _private: { + key: cxtKey + } + }; + + for (var i = 0; i < self.length; i++) { + var cxt = self[i]; + var hasCxt = cxtKey[i] === TRUE; + + if (!hasCxt) { + continue; + } + + for (var j = 0; j < cxt.properties.length; j++) { + var prop = cxt.properties[j]; + style[prop.name] = prop; + } + } + + cxtStyles[cxtKey] = style; + return style; + }; + + styfn$8.applyContextStyle = function (cxtMeta, cxtStyle, ele) { + var self = this; + var diffProps = cxtMeta.diffPropNames; + var retDiffProps = {}; + var types = self.types; + + for (var i = 0; i < diffProps.length; i++) { + var diffPropName = diffProps[i]; + var cxtProp = cxtStyle[diffPropName]; + var eleProp = ele.pstyle(diffPropName); + + if (!cxtProp) { + // no context prop means delete + if (!eleProp) { + continue; // no existing prop means nothing needs to be removed + // nb affects initial application on mapped values like control-point-distances + } else if (eleProp.bypass) { + cxtProp = { + name: diffPropName, + deleteBypassed: true + }; + } else { + cxtProp = { + name: diffPropName, + "delete": true + }; + } + } // save cycles when the context prop doesn't need to be applied + + + if (eleProp === cxtProp) { + continue; + } // save cycles when a mapped context prop doesn't need to be applied + + + if (cxtProp.mapped === types.fn // context prop is function mapper + && eleProp != null // some props can be null even by default (e.g. a prop that overrides another one) + && eleProp.mapping != null // ele prop is a concrete value from from a mapper + && eleProp.mapping.value === cxtProp.value // the current prop on the ele is a flat prop value for the function mapper + ) { + // NB don't write to cxtProp, as it's shared among eles (stored in stylesheet) + var mapping = eleProp.mapping; // can write to mapping, as it's a per-ele copy + + var fnValue = mapping.fnValue = cxtProp.value(ele); // temporarily cache the value in case of a miss + + if (fnValue === mapping.prevFnValue) { + continue; + } + } + + var retDiffProp = retDiffProps[diffPropName] = { + prev: eleProp + }; + self.applyParsedProperty(ele, cxtProp); + retDiffProp.next = ele.pstyle(diffPropName); + + if (retDiffProp.next && retDiffProp.next.bypass) { + retDiffProp.next = retDiffProp.next.bypassed; + } + } + + return { + diffProps: retDiffProps + }; + }; + + styfn$8.updateStyleHints = function (ele) { + var _p = ele._private; + var self = this; + var propNames = self.propertyGroupNames; + var propGrKeys = self.propertyGroupKeys; + + var propHash = function propHash(ele, propNames, seedKey) { + return self.getPropertiesHash(ele, propNames, seedKey); + }; + + var oldStyleKey = _p.styleKey; + + if (ele.removed()) { + return false; + } + + var isNode = _p.group === 'nodes'; // get the style key hashes per prop group + // but lazily -- only use non-default prop values to reduce the number of hashes + // + + var overriddenStyles = ele._private.style; + propNames = Object.keys(overriddenStyles); + + for (var i = 0; i < propGrKeys.length; i++) { + var grKey = propGrKeys[i]; + _p.styleKeys[grKey] = [DEFAULT_HASH_SEED, DEFAULT_HASH_SEED_ALT]; + } + + var updateGrKey1 = function updateGrKey1(val, grKey) { + return _p.styleKeys[grKey][0] = hashInt(val, _p.styleKeys[grKey][0]); + }; + + var updateGrKey2 = function updateGrKey2(val, grKey) { + return _p.styleKeys[grKey][1] = hashIntAlt(val, _p.styleKeys[grKey][1]); + }; + + var updateGrKey = function updateGrKey(val, grKey) { + updateGrKey1(val, grKey); + updateGrKey2(val, grKey); + }; + + var updateGrKeyWStr = function updateGrKeyWStr(strVal, grKey) { + for (var j = 0; j < strVal.length; j++) { + var ch = strVal.charCodeAt(j); + updateGrKey1(ch, grKey); + updateGrKey2(ch, grKey); + } + }; // - hashing works on 32 bit ints b/c we use bitwise ops + // - small numbers get cut off (e.g. 0.123 is seen as 0 by the hashing function) + // - raise up small numbers so more significant digits are seen by hashing + // - make small numbers larger than a normal value to avoid collisions + // - works in practice and it's relatively cheap + + + var N = 2000000000; + + var cleanNum = function cleanNum(val) { + return -128 < val && val < 128 && Math.floor(val) !== val ? N - (val * 1024 | 0) : val; + }; + + for (var _i = 0; _i < propNames.length; _i++) { + var name = propNames[_i]; + var parsedProp = overriddenStyles[name]; + + if (parsedProp == null) { + continue; + } + + var propInfo = this.properties[name]; + var type = propInfo.type; + var _grKey = propInfo.groupKey; + var normalizedNumberVal = void 0; + + if (propInfo.hashOverride != null) { + normalizedNumberVal = propInfo.hashOverride(ele, parsedProp); + } else if (parsedProp.pfValue != null) { + normalizedNumberVal = parsedProp.pfValue; + } // might not be a number if it allows enums + + + var numberVal = propInfo.enums == null ? parsedProp.value : null; + var haveNormNum = normalizedNumberVal != null; + var haveUnitedNum = numberVal != null; + var haveNum = haveNormNum || haveUnitedNum; + var units = parsedProp.units; // numbers are cheaper to hash than strings + // 1 hash op vs n hash ops (for length n string) + + if (type.number && haveNum && !type.multiple) { + var v = haveNormNum ? normalizedNumberVal : numberVal; + updateGrKey(cleanNum(v), _grKey); + + if (!haveNormNum && units != null) { + updateGrKeyWStr(units, _grKey); + } + } else { + updateGrKeyWStr(parsedProp.strValue, _grKey); + } + } // overall style key + // + + + var hash = [DEFAULT_HASH_SEED, DEFAULT_HASH_SEED_ALT]; + + for (var _i2 = 0; _i2 < propGrKeys.length; _i2++) { + var _grKey2 = propGrKeys[_i2]; + var grHash = _p.styleKeys[_grKey2]; + hash[0] = hashInt(grHash[0], hash[0]); + hash[1] = hashIntAlt(grHash[1], hash[1]); + } + + _p.styleKey = combineHashes(hash[0], hash[1]); // label dims + // + + var sk = _p.styleKeys; + _p.labelDimsKey = combineHashesArray(sk.labelDimensions); + var labelKeys = propHash(ele, ['label'], sk.labelDimensions); + _p.labelKey = combineHashesArray(labelKeys); + _p.labelStyleKey = combineHashesArray(hashArrays(sk.commonLabel, labelKeys)); + + if (!isNode) { + var sourceLabelKeys = propHash(ele, ['source-label'], sk.labelDimensions); + _p.sourceLabelKey = combineHashesArray(sourceLabelKeys); + _p.sourceLabelStyleKey = combineHashesArray(hashArrays(sk.commonLabel, sourceLabelKeys)); + var targetLabelKeys = propHash(ele, ['target-label'], sk.labelDimensions); + _p.targetLabelKey = combineHashesArray(targetLabelKeys); + _p.targetLabelStyleKey = combineHashesArray(hashArrays(sk.commonLabel, targetLabelKeys)); + } // node + // + + + if (isNode) { + var _p$styleKeys = _p.styleKeys, + nodeBody = _p$styleKeys.nodeBody, + nodeBorder = _p$styleKeys.nodeBorder, + backgroundImage = _p$styleKeys.backgroundImage, + compound = _p$styleKeys.compound, + pie = _p$styleKeys.pie; + var nodeKeys = [nodeBody, nodeBorder, backgroundImage, compound, pie].filter(function (k) { + return k != null; + }).reduce(hashArrays, [DEFAULT_HASH_SEED, DEFAULT_HASH_SEED_ALT]); + _p.nodeKey = combineHashesArray(nodeKeys); + _p.hasPie = pie != null && pie[0] !== DEFAULT_HASH_SEED && pie[1] !== DEFAULT_HASH_SEED_ALT; + } + + return oldStyleKey !== _p.styleKey; + }; + + styfn$8.clearStyleHints = function (ele) { + var _p = ele._private; + _p.styleCxtKey = ''; + _p.styleKeys = {}; + _p.styleKey = null; + _p.labelKey = null; + _p.labelStyleKey = null; + _p.sourceLabelKey = null; + _p.sourceLabelStyleKey = null; + _p.targetLabelKey = null; + _p.targetLabelStyleKey = null; + _p.nodeKey = null; + _p.hasPie = null; + }; // apply a property to the style (for internal use) + // returns whether application was successful + // + // now, this function flattens the property, and here's how: + // + // for parsedProp:{ bypass: true, deleteBypass: true } + // no property is generated, instead the bypass property in the + // element's style is replaced by what's pointed to by the `bypassed` + // field in the bypass property (i.e. restoring the property the + // bypass was overriding) + // + // for parsedProp:{ mapped: truthy } + // the generated flattenedProp:{ mapping: prop } + // + // for parsedProp:{ bypass: true } + // the generated flattenedProp:{ bypassed: parsedProp } + + + styfn$8.applyParsedProperty = function (ele, parsedProp) { + var self = this; + var prop = parsedProp; + var style = ele._private.style; + var flatProp; + var types = self.types; + var type = self.properties[prop.name].type; + var propIsBypass = prop.bypass; + var origProp = style[prop.name]; + var origPropIsBypass = origProp && origProp.bypass; + var _p = ele._private; + var flatPropMapping = 'mapping'; + + var getVal = function getVal(p) { + if (p == null) { + return null; + } else if (p.pfValue != null) { + return p.pfValue; + } else { + return p.value; + } + }; + + var checkTriggers = function checkTriggers() { + var fromVal = getVal(origProp); + var toVal = getVal(prop); + self.checkTriggers(ele, prop.name, fromVal, toVal); + }; + + if (prop && prop.name.substr(0, 3) === 'pie') { + warn('The pie style properties are deprecated. Create charts using background images instead.'); + } // edge sanity checks to prevent the client from making serious mistakes + + + if (parsedProp.name === 'curve-style' && ele.isEdge() && ( // loops must be bundled beziers + parsedProp.value !== 'bezier' && ele.isLoop() || // edges connected to compound nodes can not be haystacks + parsedProp.value === 'haystack' && (ele.source().isParent() || ele.target().isParent()))) { + prop = parsedProp = this.parse(parsedProp.name, 'bezier', propIsBypass); + } + + if (prop["delete"]) { + // delete the property and use the default value on falsey value + style[prop.name] = undefined; + checkTriggers(); + return true; + } + + if (prop.deleteBypassed) { + // delete the property that the + if (!origProp) { + checkTriggers(); + return true; // can't delete if no prop + } else if (origProp.bypass) { + // delete bypassed + origProp.bypassed = undefined; + checkTriggers(); + return true; + } else { + return false; // we're unsuccessful deleting the bypassed + } + } // check if we need to delete the current bypass + + + if (prop.deleteBypass) { + // then this property is just here to indicate we need to delete + if (!origProp) { + checkTriggers(); + return true; // property is already not defined + } else if (origProp.bypass) { + // then replace the bypass property with the original + // because the bypassed property was already applied (and therefore parsed), we can just replace it (no reapplying necessary) + style[prop.name] = origProp.bypassed; + checkTriggers(); + return true; + } else { + return false; // we're unsuccessful deleting the bypass + } + } + + var printMappingErr = function printMappingErr() { + warn('Do not assign mappings to elements without corresponding data (i.e. ele `' + ele.id() + '` has no mapping for property `' + prop.name + '` with data field `' + prop.field + '`); try a `[' + prop.field + ']` selector to limit scope to elements with `' + prop.field + '` defined'); + }; // put the property in the style objects + + + switch (prop.mapped) { + // flatten the property if mapped + case types.mapData: + { + // flatten the field (e.g. data.foo.bar) + var fields = prop.field.split('.'); + var fieldVal = _p.data; + + for (var i = 0; i < fields.length && fieldVal; i++) { + var field = fields[i]; + fieldVal = fieldVal[field]; + } + + if (fieldVal == null) { + printMappingErr(); + return false; + } + + var percent; + + if (!number$1(fieldVal)) { + // then don't apply and fall back on the existing style + warn('Do not use continuous mappers without specifying numeric data (i.e. `' + prop.field + ': ' + fieldVal + '` for `' + ele.id() + '` is non-numeric)'); + return false; + } else { + var fieldWidth = prop.fieldMax - prop.fieldMin; + + if (fieldWidth === 0) { + // safety check -- not strictly necessary as no props of zero range should be passed here + percent = 0; + } else { + percent = (fieldVal - prop.fieldMin) / fieldWidth; + } + } // make sure to bound percent value + + + if (percent < 0) { + percent = 0; + } else if (percent > 1) { + percent = 1; + } + + if (type.color) { + var r1 = prop.valueMin[0]; + var r2 = prop.valueMax[0]; + var g1 = prop.valueMin[1]; + var g2 = prop.valueMax[1]; + var b1 = prop.valueMin[2]; + var b2 = prop.valueMax[2]; + var a1 = prop.valueMin[3] == null ? 1 : prop.valueMin[3]; + var a2 = prop.valueMax[3] == null ? 1 : prop.valueMax[3]; + var clr = [Math.round(r1 + (r2 - r1) * percent), Math.round(g1 + (g2 - g1) * percent), Math.round(b1 + (b2 - b1) * percent), Math.round(a1 + (a2 - a1) * percent)]; + flatProp = { + // colours are simple, so just create the flat property instead of expensive string parsing + bypass: prop.bypass, + // we're a bypass if the mapping property is a bypass + name: prop.name, + value: clr, + strValue: 'rgb(' + clr[0] + ', ' + clr[1] + ', ' + clr[2] + ')' + }; + } else if (type.number) { + var calcValue = prop.valueMin + (prop.valueMax - prop.valueMin) * percent; + flatProp = this.parse(prop.name, calcValue, prop.bypass, flatPropMapping); + } else { + return false; // can only map to colours and numbers + } + + if (!flatProp) { + // if we can't flatten the property, then don't apply the property and fall back on the existing style + printMappingErr(); + return false; + } + + flatProp.mapping = prop; // keep a reference to the mapping + + prop = flatProp; // the flattened (mapped) property is the one we want + + break; + } + // direct mapping + + case types.data: + { + // flatten the field (e.g. data.foo.bar) + var _fields = prop.field.split('.'); + + var _fieldVal = _p.data; + + for (var _i3 = 0; _i3 < _fields.length && _fieldVal; _i3++) { + var _field = _fields[_i3]; + _fieldVal = _fieldVal[_field]; + } + + if (_fieldVal != null) { + flatProp = this.parse(prop.name, _fieldVal, prop.bypass, flatPropMapping); + } + + if (!flatProp) { + // if we can't flatten the property, then don't apply and fall back on the existing style + printMappingErr(); + return false; + } + + flatProp.mapping = prop; // keep a reference to the mapping + + prop = flatProp; // the flattened (mapped) property is the one we want + + break; + } + + case types.fn: + { + var fn = prop.value; + var fnRetVal = prop.fnValue != null ? prop.fnValue : fn(ele); // check for cached value before calling function + + prop.prevFnValue = fnRetVal; + + if (fnRetVal == null) { + warn('Custom function mappers may not return null (i.e. `' + prop.name + '` for ele `' + ele.id() + '` is null)'); + return false; + } + + flatProp = this.parse(prop.name, fnRetVal, prop.bypass, flatPropMapping); + + if (!flatProp) { + warn('Custom function mappers may not return invalid values for the property type (i.e. `' + prop.name + '` for ele `' + ele.id() + '` is invalid)'); + return false; + } + + flatProp.mapping = copy(prop); // keep a reference to the mapping + + prop = flatProp; // the flattened (mapped) property is the one we want + + break; + } + + case undefined: + break; + // just set the property + + default: + return false; + // not a valid mapping + } // if the property is a bypass property, then link the resultant property to the original one + + + if (propIsBypass) { + if (origPropIsBypass) { + // then this bypass overrides the existing one + prop.bypassed = origProp.bypassed; // steal bypassed prop from old bypass + } else { + // then link the orig prop to the new bypass + prop.bypassed = origProp; + } + + style[prop.name] = prop; // and set + } else { + // prop is not bypass + if (origPropIsBypass) { + // then keep the orig prop (since it's a bypass) and link to the new prop + origProp.bypassed = prop; + } else { + // then just replace the old prop with the new one + style[prop.name] = prop; + } + } + + checkTriggers(); + return true; + }; + + styfn$8.cleanElements = function (eles, keepBypasses) { + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + this.clearStyleHints(ele); + ele.dirtyCompoundBoundsCache(); + ele.dirtyBoundingBoxCache(); + + if (!keepBypasses) { + ele._private.style = {}; + } else { + var style = ele._private.style; + var propNames = Object.keys(style); + + for (var j = 0; j < propNames.length; j++) { + var propName = propNames[j]; + var eleProp = style[propName]; + + if (eleProp != null) { + if (eleProp.bypass) { + eleProp.bypassed = null; + } else { + style[propName] = null; + } + } + } + } + } + }; // updates the visual style for all elements (useful for manual style modification after init) + + + styfn$8.update = function () { + var cy = this._private.cy; + var eles = cy.mutableElements(); + eles.updateStyle(); + }; // diffProps : { name => { prev, next } } + + + styfn$8.updateTransitions = function (ele, diffProps) { + var self = this; + var _p = ele._private; + var props = ele.pstyle('transition-property').value; + var duration = ele.pstyle('transition-duration').pfValue; + var delay = ele.pstyle('transition-delay').pfValue; + + if (props.length > 0 && duration > 0) { + var style = {}; // build up the style to animate towards + + var anyPrev = false; + + for (var i = 0; i < props.length; i++) { + var prop = props[i]; + var styProp = ele.pstyle(prop); + var diffProp = diffProps[prop]; + + if (!diffProp) { + continue; + } + + var prevProp = diffProp.prev; + var fromProp = prevProp; + var toProp = diffProp.next != null ? diffProp.next : styProp; + var diff = false; + var initVal = void 0; + var initDt = 0.000001; // delta time % value for initVal (allows animating out of init zero opacity) + + if (!fromProp) { + continue; + } // consider px values + + + if (number$1(fromProp.pfValue) && number$1(toProp.pfValue)) { + diff = toProp.pfValue - fromProp.pfValue; // nonzero is truthy + + initVal = fromProp.pfValue + initDt * diff; // consider numerical values + } else if (number$1(fromProp.value) && number$1(toProp.value)) { + diff = toProp.value - fromProp.value; // nonzero is truthy + + initVal = fromProp.value + initDt * diff; // consider colour values + } else if (array(fromProp.value) && array(toProp.value)) { + diff = fromProp.value[0] !== toProp.value[0] || fromProp.value[1] !== toProp.value[1] || fromProp.value[2] !== toProp.value[2]; + initVal = fromProp.strValue; + } // the previous value is good for an animation only if it's different + + + if (diff) { + style[prop] = toProp.strValue; // to val + + this.applyBypass(ele, prop, initVal); // from val + + anyPrev = true; + } + } // end if props allow ani + // can't transition if there's nothing previous to transition from + + + if (!anyPrev) { + return; + } + + _p.transitioning = true; + new Promise$1(function (resolve) { + if (delay > 0) { + ele.delayAnimation(delay).play().promise().then(resolve); + } else { + resolve(); + } + }).then(function () { + return ele.animation({ + style: style, + duration: duration, + easing: ele.pstyle('transition-timing-function').value, + queue: false + }).play().promise(); + }).then(function () { + // if( !isBypass ){ + self.removeBypasses(ele, props); + ele.emitAndNotify('style'); // } + + _p.transitioning = false; + }); + } else if (_p.transitioning) { + this.removeBypasses(ele, props); + ele.emitAndNotify('style'); + _p.transitioning = false; + } + }; + + styfn$8.checkTrigger = function (ele, name, fromValue, toValue, getTrigger, onTrigger) { + var prop = this.properties[name]; + var triggerCheck = getTrigger(prop); + + if (triggerCheck != null && triggerCheck(fromValue, toValue)) { + onTrigger(prop); + } + }; + + styfn$8.checkZOrderTrigger = function (ele, name, fromValue, toValue) { + var _this = this; + + this.checkTrigger(ele, name, fromValue, toValue, function (prop) { + return prop.triggersZOrder; + }, function () { + _this._private.cy.notify('zorder', ele); + }); + }; + + styfn$8.checkBoundsTrigger = function (ele, name, fromValue, toValue) { + this.checkTrigger(ele, name, fromValue, toValue, function (prop) { + return prop.triggersBounds; + }, function (prop) { + ele.dirtyCompoundBoundsCache(); + ele.dirtyBoundingBoxCache(); // if the prop change makes the bb of pll bezier edges invalid, + // then dirty the pll edge bb cache as well + + if ( // only for beziers -- so performance of other edges isn't affected + prop.triggersBoundsOfParallelBeziers && (name === 'curve-style' && (fromValue === 'bezier' || toValue === 'bezier') || name === 'display' && (fromValue === 'none' || toValue === 'none'))) { + ele.parallelEdges().forEach(function (pllEdge) { + if (pllEdge.isBundledBezier()) { + pllEdge.dirtyBoundingBoxCache(); + } + }); + } + }); + }; + + styfn$8.checkTriggers = function (ele, name, fromValue, toValue) { + ele.dirtyStyleCache(); + this.checkZOrderTrigger(ele, name, fromValue, toValue); + this.checkBoundsTrigger(ele, name, fromValue, toValue); + }; + + var styfn$7 = {}; // bypasses are applied to an existing style on an element, and just tacked on temporarily + // returns true iff application was successful for at least 1 specified property + + styfn$7.applyBypass = function (eles, name, value, updateTransitions) { + var self = this; + var props = []; + var isBypass = true; // put all the properties (can specify one or many) in an array after parsing them + + if (name === '*' || name === '**') { + // apply to all property names + if (value !== undefined) { + for (var i = 0; i < self.properties.length; i++) { + var prop = self.properties[i]; + var _name = prop.name; + var parsedProp = this.parse(_name, value, true); + + if (parsedProp) { + props.push(parsedProp); + } + } + } + } else if (string(name)) { + // then parse the single property + var _parsedProp = this.parse(name, value, true); + + if (_parsedProp) { + props.push(_parsedProp); + } + } else if (plainObject(name)) { + // then parse each property + var specifiedProps = name; + updateTransitions = value; + var names = Object.keys(specifiedProps); + + for (var _i = 0; _i < names.length; _i++) { + var _name2 = names[_i]; + var _value = specifiedProps[_name2]; + + if (_value === undefined) { + // try camel case name too + _value = specifiedProps[dash2camel(_name2)]; + } + + if (_value !== undefined) { + var _parsedProp2 = this.parse(_name2, _value, true); + + if (_parsedProp2) { + props.push(_parsedProp2); + } + } + } + } else { + // can't do anything without well defined properties + return false; + } // we've failed if there are no valid properties + + + if (props.length === 0) { + return false; + } // now, apply the bypass properties on the elements + + + var ret = false; // return true if at least one succesful bypass applied + + for (var _i2 = 0; _i2 < eles.length; _i2++) { + // for each ele + var ele = eles[_i2]; + var diffProps = {}; + var diffProp = void 0; + + for (var j = 0; j < props.length; j++) { + // for each prop + var _prop = props[j]; + + if (updateTransitions) { + var prevProp = ele.pstyle(_prop.name); + diffProp = diffProps[_prop.name] = { + prev: prevProp + }; + } + + ret = this.applyParsedProperty(ele, copy(_prop)) || ret; + + if (updateTransitions) { + diffProp.next = ele.pstyle(_prop.name); + } + } // for props + + + if (ret) { + this.updateStyleHints(ele); + } + + if (updateTransitions) { + this.updateTransitions(ele, diffProps, isBypass); + } + } // for eles + + + return ret; + }; // only useful in specific cases like animation + + + styfn$7.overrideBypass = function (eles, name, value) { + name = camel2dash(name); + + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + var prop = ele._private.style[name]; + var type = this.properties[name].type; + var isColor = type.color; + var isMulti = type.mutiple; + var oldValue = !prop ? null : prop.pfValue != null ? prop.pfValue : prop.value; + + if (!prop || !prop.bypass) { + // need a bypass if one doesn't exist + this.applyBypass(ele, name, value); + } else { + prop.value = value; + + if (prop.pfValue != null) { + prop.pfValue = value; + } + + if (isColor) { + prop.strValue = 'rgb(' + value.join(',') + ')'; + } else if (isMulti) { + prop.strValue = value.join(' '); + } else { + prop.strValue = '' + value; + } + + this.updateStyleHints(ele); + } + + this.checkTriggers(ele, name, oldValue, value); + } + }; + + styfn$7.removeAllBypasses = function (eles, updateTransitions) { + return this.removeBypasses(eles, this.propertyNames, updateTransitions); + }; + + styfn$7.removeBypasses = function (eles, props, updateTransitions) { + var isBypass = true; + + for (var j = 0; j < eles.length; j++) { + var ele = eles[j]; + var diffProps = {}; + + for (var i = 0; i < props.length; i++) { + var name = props[i]; + var prop = this.properties[name]; + var prevProp = ele.pstyle(prop.name); + + if (!prevProp || !prevProp.bypass) { + // if a bypass doesn't exist for the prop, nothing needs to be removed + continue; + } + + var value = ''; // empty => remove bypass + + var parsedProp = this.parse(name, value, true); + var diffProp = diffProps[prop.name] = { + prev: prevProp + }; + this.applyParsedProperty(ele, parsedProp); + diffProp.next = ele.pstyle(prop.name); + } // for props + + + this.updateStyleHints(ele); + + if (updateTransitions) { + this.updateTransitions(ele, diffProps, isBypass); + } + } // for eles + + }; + + var styfn$6 = {}; // gets what an em size corresponds to in pixels relative to a dom element + + styfn$6.getEmSizeInPixels = function () { + var px = this.containerCss('font-size'); + + if (px != null) { + return parseFloat(px); + } else { + return 1; // for headless + } + }; // gets css property from the core container + + + styfn$6.containerCss = function (propName) { + var cy = this._private.cy; + var domElement = cy.container(); + var containerWindow = cy.window(); + + if (containerWindow && domElement && containerWindow.getComputedStyle) { + return containerWindow.getComputedStyle(domElement).getPropertyValue(propName); + } + }; + + var styfn$5 = {}; // gets the rendered style for an element + + styfn$5.getRenderedStyle = function (ele, prop) { + if (prop) { + return this.getStylePropertyValue(ele, prop, true); + } else { + return this.getRawStyle(ele, true); + } + }; // gets the raw style for an element + + + styfn$5.getRawStyle = function (ele, isRenderedVal) { + var self = this; + ele = ele[0]; // insure it's an element + + if (ele) { + var rstyle = {}; + + for (var i = 0; i < self.properties.length; i++) { + var prop = self.properties[i]; + var val = self.getStylePropertyValue(ele, prop.name, isRenderedVal); + + if (val != null) { + rstyle[prop.name] = val; + rstyle[dash2camel(prop.name)] = val; + } + } + + return rstyle; + } + }; + + styfn$5.getIndexedStyle = function (ele, property, subproperty, index) { + var pstyle = ele.pstyle(property)[subproperty][index]; + return pstyle != null ? pstyle : ele.cy().style().getDefaultProperty(property)[subproperty][0]; + }; + + styfn$5.getStylePropertyValue = function (ele, propName, isRenderedVal) { + var self = this; + ele = ele[0]; // insure it's an element + + if (ele) { + var prop = self.properties[propName]; + + if (prop.alias) { + prop = prop.pointsTo; + } + + var type = prop.type; + var styleProp = ele.pstyle(prop.name); + + if (styleProp) { + var value = styleProp.value, + units = styleProp.units, + strValue = styleProp.strValue; + + if (isRenderedVal && type.number && value != null && number$1(value)) { + var zoom = ele.cy().zoom(); + + var getRenderedValue = function getRenderedValue(val) { + return val * zoom; + }; + + var getValueStringWithUnits = function getValueStringWithUnits(val, units) { + return getRenderedValue(val) + units; + }; + + var isArrayValue = array(value); + var haveUnits = isArrayValue ? units.every(function (u) { + return u != null; + }) : units != null; + + if (haveUnits) { + if (isArrayValue) { + return value.map(function (v, i) { + return getValueStringWithUnits(v, units[i]); + }).join(' '); + } else { + return getValueStringWithUnits(value, units); + } + } else { + if (isArrayValue) { + return value.map(function (v) { + return string(v) ? v : '' + getRenderedValue(v); + }).join(' '); + } else { + return '' + getRenderedValue(value); + } + } + } else if (strValue != null) { + return strValue; + } + } + + return null; + } + }; + + styfn$5.getAnimationStartStyle = function (ele, aniProps) { + var rstyle = {}; + + for (var i = 0; i < aniProps.length; i++) { + var aniProp = aniProps[i]; + var name = aniProp.name; + var styleProp = ele.pstyle(name); + + if (styleProp !== undefined) { + // then make a prop of it + if (plainObject(styleProp)) { + styleProp = this.parse(name, styleProp.strValue); + } else { + styleProp = this.parse(name, styleProp); + } + } + + if (styleProp) { + rstyle[name] = styleProp; + } + } + + return rstyle; + }; + + styfn$5.getPropsList = function (propsObj) { + var self = this; + var rstyle = []; + var style = propsObj; + var props = self.properties; + + if (style) { + var names = Object.keys(style); + + for (var i = 0; i < names.length; i++) { + var name = names[i]; + var val = style[name]; + var prop = props[name] || props[camel2dash(name)]; + var styleProp = this.parse(prop.name, val); + + if (styleProp) { + rstyle.push(styleProp); + } + } + } + + return rstyle; + }; + + styfn$5.getNonDefaultPropertiesHash = function (ele, propNames, seed) { + var hash = seed.slice(); + var name, val, strVal, chVal; + var i, j; + + for (i = 0; i < propNames.length; i++) { + name = propNames[i]; + val = ele.pstyle(name, false); + + if (val == null) { + continue; + } else if (val.pfValue != null) { + hash[0] = hashInt(chVal, hash[0]); + hash[1] = hashIntAlt(chVal, hash[1]); + } else { + strVal = val.strValue; + + for (j = 0; j < strVal.length; j++) { + chVal = strVal.charCodeAt(j); + hash[0] = hashInt(chVal, hash[0]); + hash[1] = hashIntAlt(chVal, hash[1]); + } + } + } + + return hash; + }; + + styfn$5.getPropertiesHash = styfn$5.getNonDefaultPropertiesHash; + + var styfn$4 = {}; + + styfn$4.appendFromJson = function (json) { + var style = this; + + for (var i = 0; i < json.length; i++) { + var context = json[i]; + var selector = context.selector; + var props = context.style || context.css; + var names = Object.keys(props); + style.selector(selector); // apply selector + + for (var j = 0; j < names.length; j++) { + var name = names[j]; + var value = props[name]; + style.css(name, value); // apply property + } + } + + return style; + }; // accessible cy.style() function + + + styfn$4.fromJson = function (json) { + var style = this; + style.resetToDefault(); + style.appendFromJson(json); + return style; + }; // get json from cy.style() api + + + styfn$4.json = function () { + var json = []; + + for (var i = this.defaultLength; i < this.length; i++) { + var cxt = this[i]; + var selector = cxt.selector; + var props = cxt.properties; + var css = {}; + + for (var j = 0; j < props.length; j++) { + var prop = props[j]; + css[prop.name] = prop.strValue; + } + + json.push({ + selector: !selector ? 'core' : selector.toString(), + style: css + }); + } + + return json; + }; + + var styfn$3 = {}; + + styfn$3.appendFromString = function (string) { + var self = this; + var style = this; + var remaining = '' + string; + var selAndBlockStr; + var blockRem; + var propAndValStr; // remove comments from the style string + + remaining = remaining.replace(/[/][*](\s|.)+?[*][/]/g, ''); + + function removeSelAndBlockFromRemaining() { + // remove the parsed selector and block from the remaining text to parse + if (remaining.length > selAndBlockStr.length) { + remaining = remaining.substr(selAndBlockStr.length); + } else { + remaining = ''; + } + } + + function removePropAndValFromRem() { + // remove the parsed property and value from the remaining block text to parse + if (blockRem.length > propAndValStr.length) { + blockRem = blockRem.substr(propAndValStr.length); + } else { + blockRem = ''; + } + } + + for (;;) { + var nothingLeftToParse = remaining.match(/^\s*$/); + + if (nothingLeftToParse) { + break; + } + + var selAndBlock = remaining.match(/^\s*((?:.|\s)+?)\s*\{((?:.|\s)+?)\}/); + + if (!selAndBlock) { + warn('Halting stylesheet parsing: String stylesheet contains more to parse but no selector and block found in: ' + remaining); + break; + } + + selAndBlockStr = selAndBlock[0]; // parse the selector + + var selectorStr = selAndBlock[1]; + + if (selectorStr !== 'core') { + var selector = new Selector(selectorStr); + + if (selector.invalid) { + warn('Skipping parsing of block: Invalid selector found in string stylesheet: ' + selectorStr); // skip this selector and block + + removeSelAndBlockFromRemaining(); + continue; + } + } // parse the block of properties and values + + + var blockStr = selAndBlock[2]; + var invalidBlock = false; + blockRem = blockStr; + var props = []; + + for (;;) { + var _nothingLeftToParse = blockRem.match(/^\s*$/); + + if (_nothingLeftToParse) { + break; + } + + var propAndVal = blockRem.match(/^\s*(.+?)\s*:\s*(.+?)(?:\s*;|\s*$)/); + + if (!propAndVal) { + warn('Skipping parsing of block: Invalid formatting of style property and value definitions found in:' + blockStr); + invalidBlock = true; + break; + } + + propAndValStr = propAndVal[0]; + var propStr = propAndVal[1]; + var valStr = propAndVal[2]; + var prop = self.properties[propStr]; + + if (!prop) { + warn('Skipping property: Invalid property name in: ' + propAndValStr); // skip this property in the block + + removePropAndValFromRem(); + continue; + } + + var parsedProp = style.parse(propStr, valStr); + + if (!parsedProp) { + warn('Skipping property: Invalid property definition in: ' + propAndValStr); // skip this property in the block + + removePropAndValFromRem(); + continue; + } + + props.push({ + name: propStr, + val: valStr + }); + removePropAndValFromRem(); + } + + if (invalidBlock) { + removeSelAndBlockFromRemaining(); + break; + } // put the parsed block in the style + + + style.selector(selectorStr); + + for (var i = 0; i < props.length; i++) { + var _prop = props[i]; + style.css(_prop.name, _prop.val); + } + + removeSelAndBlockFromRemaining(); + } + + return style; + }; + + styfn$3.fromString = function (string) { + var style = this; + style.resetToDefault(); + style.appendFromString(string); + return style; + }; + + var styfn$2 = {}; + + (function () { + var number$1 = number; + var rgba = rgbaNoBackRefs; + var hsla = hslaNoBackRefs; + var hex3$1 = hex3; + var hex6$1 = hex6; + + var data = function data(prefix) { + return '^' + prefix + '\\s*\\(\\s*([\\w\\.]+)\\s*\\)$'; + }; + + var mapData = function mapData(prefix) { + var mapArg = number$1 + '|\\w+|' + rgba + '|' + hsla + '|' + hex3$1 + '|' + hex6$1; + return '^' + prefix + '\\s*\\(([\\w\\.]+)\\s*\\,\\s*(' + number$1 + ')\\s*\\,\\s*(' + number$1 + ')\\s*,\\s*(' + mapArg + ')\\s*\\,\\s*(' + mapArg + ')\\)$'; + }; + + var urlRegexes = ['^url\\s*\\(\\s*[\'"]?(.+?)[\'"]?\\s*\\)$', '^(none)$', '^(.+)$']; // each visual style property has a type and needs to be validated according to it + + styfn$2.types = { + time: { + number: true, + min: 0, + units: 's|ms', + implicitUnits: 'ms' + }, + percent: { + number: true, + min: 0, + max: 100, + units: '%', + implicitUnits: '%' + }, + percentages: { + number: true, + min: 0, + max: 100, + units: '%', + implicitUnits: '%', + multiple: true + }, + zeroOneNumber: { + number: true, + min: 0, + max: 1, + unitless: true + }, + zeroOneNumbers: { + number: true, + min: 0, + max: 1, + unitless: true, + multiple: true + }, + nOneOneNumber: { + number: true, + min: -1, + max: 1, + unitless: true + }, + nonNegativeInt: { + number: true, + min: 0, + integer: true, + unitless: true + }, + position: { + enums: ['parent', 'origin'] + }, + nodeSize: { + number: true, + min: 0, + enums: ['label'] + }, + number: { + number: true, + unitless: true + }, + numbers: { + number: true, + unitless: true, + multiple: true + }, + positiveNumber: { + number: true, + unitless: true, + min: 0, + strictMin: true + }, + size: { + number: true, + min: 0 + }, + bidirectionalSize: { + number: true + }, + // allows negative + bidirectionalSizeMaybePercent: { + number: true, + allowPercent: true + }, + // allows negative + bidirectionalSizes: { + number: true, + multiple: true + }, + // allows negative + sizeMaybePercent: { + number: true, + min: 0, + allowPercent: true + }, + axisDirection: { + enums: ['horizontal', 'leftward', 'rightward', 'vertical', 'upward', 'downward', 'auto'] + }, + paddingRelativeTo: { + enums: ['width', 'height', 'average', 'min', 'max'] + }, + bgWH: { + number: true, + min: 0, + allowPercent: true, + enums: ['auto'], + multiple: true + }, + bgPos: { + number: true, + allowPercent: true, + multiple: true + }, + bgRelativeTo: { + enums: ['inner', 'include-padding'], + multiple: true + }, + bgRepeat: { + enums: ['repeat', 'repeat-x', 'repeat-y', 'no-repeat'], + multiple: true + }, + bgFit: { + enums: ['none', 'contain', 'cover'], + multiple: true + }, + bgCrossOrigin: { + enums: ['anonymous', 'use-credentials', 'null'], + multiple: true + }, + bgClip: { + enums: ['none', 'node'], + multiple: true + }, + bgContainment: { + enums: ['inside', 'over'], + multiple: true + }, + color: { + color: true + }, + colors: { + color: true, + multiple: true + }, + fill: { + enums: ['solid', 'linear-gradient', 'radial-gradient'] + }, + bool: { + enums: ['yes', 'no'] + }, + bools: { + enums: ['yes', 'no'], + multiple: true + }, + lineStyle: { + enums: ['solid', 'dotted', 'dashed'] + }, + lineCap: { + enums: ['butt', 'round', 'square'] + }, + borderStyle: { + enums: ['solid', 'dotted', 'dashed', 'double'] + }, + curveStyle: { + enums: ['bezier', 'unbundled-bezier', 'haystack', 'segments', 'straight', 'straight-triangle', 'taxi'] + }, + fontFamily: { + regex: '^([\\w- \\"]+(?:\\s*,\\s*[\\w- \\"]+)*)$' + }, + fontStyle: { + enums: ['italic', 'normal', 'oblique'] + }, + fontWeight: { + enums: ['normal', 'bold', 'bolder', 'lighter', '100', '200', '300', '400', '500', '600', '800', '900', 100, 200, 300, 400, 500, 600, 700, 800, 900] + }, + textDecoration: { + enums: ['none', 'underline', 'overline', 'line-through'] + }, + textTransform: { + enums: ['none', 'uppercase', 'lowercase'] + }, + textWrap: { + enums: ['none', 'wrap', 'ellipsis'] + }, + textOverflowWrap: { + enums: ['whitespace', 'anywhere'] + }, + textBackgroundShape: { + enums: ['rectangle', 'roundrectangle', 'round-rectangle'] + }, + nodeShape: { + enums: ['rectangle', 'roundrectangle', 'round-rectangle', 'cutrectangle', 'cut-rectangle', 'bottomroundrectangle', 'bottom-round-rectangle', 'barrel', 'ellipse', 'triangle', 'round-triangle', 'square', 'pentagon', 'round-pentagon', 'hexagon', 'round-hexagon', 'concavehexagon', 'concave-hexagon', 'heptagon', 'round-heptagon', 'octagon', 'round-octagon', 'tag', 'round-tag', 'star', 'diamond', 'round-diamond', 'vee', 'rhomboid', 'right-rhomboid', 'polygon'] + }, + overlayShape: { + enums: ['roundrectangle', 'round-rectangle', 'ellipse'] + }, + compoundIncludeLabels: { + enums: ['include', 'exclude'] + }, + arrowShape: { + enums: ['tee', 'triangle', 'triangle-tee', 'circle-triangle', 'triangle-cross', 'triangle-backcurve', 'vee', 'square', 'circle', 'diamond', 'chevron', 'none'] + }, + arrowFill: { + enums: ['filled', 'hollow'] + }, + display: { + enums: ['element', 'none'] + }, + visibility: { + enums: ['hidden', 'visible'] + }, + zCompoundDepth: { + enums: ['bottom', 'orphan', 'auto', 'top'] + }, + zIndexCompare: { + enums: ['auto', 'manual'] + }, + valign: { + enums: ['top', 'center', 'bottom'] + }, + halign: { + enums: ['left', 'center', 'right'] + }, + justification: { + enums: ['left', 'center', 'right', 'auto'] + }, + text: { + string: true + }, + data: { + mapping: true, + regex: data('data') + }, + layoutData: { + mapping: true, + regex: data('layoutData') + }, + scratch: { + mapping: true, + regex: data('scratch') + }, + mapData: { + mapping: true, + regex: mapData('mapData') + }, + mapLayoutData: { + mapping: true, + regex: mapData('mapLayoutData') + }, + mapScratch: { + mapping: true, + regex: mapData('mapScratch') + }, + fn: { + mapping: true, + fn: true + }, + url: { + regexes: urlRegexes, + singleRegexMatchValue: true + }, + urls: { + regexes: urlRegexes, + singleRegexMatchValue: true, + multiple: true + }, + propList: { + propList: true + }, + angle: { + number: true, + units: 'deg|rad', + implicitUnits: 'rad' + }, + textRotation: { + number: true, + units: 'deg|rad', + implicitUnits: 'rad', + enums: ['none', 'autorotate'] + }, + polygonPointList: { + number: true, + multiple: true, + evenMultiple: true, + min: -1, + max: 1, + unitless: true + }, + edgeDistances: { + enums: ['intersection', 'node-position'] + }, + edgeEndpoint: { + number: true, + multiple: true, + units: '%|px|em|deg|rad', + implicitUnits: 'px', + enums: ['inside-to-node', 'outside-to-node', 'outside-to-node-or-label', 'outside-to-line', 'outside-to-line-or-label'], + singleEnum: true, + validate: function validate(valArr, unitsArr) { + switch (valArr.length) { + case 2: + // can be % or px only + return unitsArr[0] !== 'deg' && unitsArr[0] !== 'rad' && unitsArr[1] !== 'deg' && unitsArr[1] !== 'rad'; + + case 1: + // can be enum, deg, or rad only + return string(valArr[0]) || unitsArr[0] === 'deg' || unitsArr[0] === 'rad'; + + default: + return false; + } + } + }, + easing: { + regexes: ['^(spring)\\s*\\(\\s*(' + number$1 + ')\\s*,\\s*(' + number$1 + ')\\s*\\)$', '^(cubic-bezier)\\s*\\(\\s*(' + number$1 + ')\\s*,\\s*(' + number$1 + ')\\s*,\\s*(' + number$1 + ')\\s*,\\s*(' + number$1 + ')\\s*\\)$'], + enums: ['linear', 'ease', 'ease-in', 'ease-out', 'ease-in-out', 'ease-in-sine', 'ease-out-sine', 'ease-in-out-sine', 'ease-in-quad', 'ease-out-quad', 'ease-in-out-quad', 'ease-in-cubic', 'ease-out-cubic', 'ease-in-out-cubic', 'ease-in-quart', 'ease-out-quart', 'ease-in-out-quart', 'ease-in-quint', 'ease-out-quint', 'ease-in-out-quint', 'ease-in-expo', 'ease-out-expo', 'ease-in-out-expo', 'ease-in-circ', 'ease-out-circ', 'ease-in-out-circ'] + }, + gradientDirection: { + enums: ['to-bottom', 'to-top', 'to-left', 'to-right', 'to-bottom-right', 'to-bottom-left', 'to-top-right', 'to-top-left', 'to-right-bottom', 'to-left-bottom', 'to-right-top', 'to-left-top' // different order + ] + }, + boundsExpansion: { + number: true, + multiple: true, + min: 0, + validate: function validate(valArr) { + var length = valArr.length; + return length === 1 || length === 2 || length === 4; + } + } + }; + var diff = { + zeroNonZero: function zeroNonZero(val1, val2) { + if ((val1 == null || val2 == null) && val1 !== val2) { + return true; // null cases could represent any value + } + + if (val1 == 0 && val2 != 0) { + return true; + } else if (val1 != 0 && val2 == 0) { + return true; + } else { + return false; + } + }, + any: function any(val1, val2) { + return val1 != val2; + }, + emptyNonEmpty: function emptyNonEmpty(str1, str2) { + var empty1 = emptyString(str1); + var empty2 = emptyString(str2); + return empty1 && !empty2 || !empty1 && empty2; + } + }; // define visual style properties + // + // - n.b. adding a new group of props may require updates to updateStyleHints() + // - adding new props to an existing group gets handled automatically + + var t = styfn$2.types; + var mainLabel = [{ + name: 'label', + type: t.text, + triggersBounds: diff.any, + triggersZOrder: diff.emptyNonEmpty + }, { + name: 'text-rotation', + type: t.textRotation, + triggersBounds: diff.any + }, { + name: 'text-margin-x', + type: t.bidirectionalSize, + triggersBounds: diff.any + }, { + name: 'text-margin-y', + type: t.bidirectionalSize, + triggersBounds: diff.any + }]; + var sourceLabel = [{ + name: 'source-label', + type: t.text, + triggersBounds: diff.any + }, { + name: 'source-text-rotation', + type: t.textRotation, + triggersBounds: diff.any + }, { + name: 'source-text-margin-x', + type: t.bidirectionalSize, + triggersBounds: diff.any + }, { + name: 'source-text-margin-y', + type: t.bidirectionalSize, + triggersBounds: diff.any + }, { + name: 'source-text-offset', + type: t.size, + triggersBounds: diff.any + }]; + var targetLabel = [{ + name: 'target-label', + type: t.text, + triggersBounds: diff.any + }, { + name: 'target-text-rotation', + type: t.textRotation, + triggersBounds: diff.any + }, { + name: 'target-text-margin-x', + type: t.bidirectionalSize, + triggersBounds: diff.any + }, { + name: 'target-text-margin-y', + type: t.bidirectionalSize, + triggersBounds: diff.any + }, { + name: 'target-text-offset', + type: t.size, + triggersBounds: diff.any + }]; + var labelDimensions = [{ + name: 'font-family', + type: t.fontFamily, + triggersBounds: diff.any + }, { + name: 'font-style', + type: t.fontStyle, + triggersBounds: diff.any + }, { + name: 'font-weight', + type: t.fontWeight, + triggersBounds: diff.any + }, { + name: 'font-size', + type: t.size, + triggersBounds: diff.any + }, { + name: 'text-transform', + type: t.textTransform, + triggersBounds: diff.any + }, { + name: 'text-wrap', + type: t.textWrap, + triggersBounds: diff.any + }, { + name: 'text-overflow-wrap', + type: t.textOverflowWrap, + triggersBounds: diff.any + }, { + name: 'text-max-width', + type: t.size, + triggersBounds: diff.any + }, { + name: 'text-outline-width', + type: t.size, + triggersBounds: diff.any + }, { + name: 'line-height', + type: t.positiveNumber, + triggersBounds: diff.any + }]; + var commonLabel = [{ + name: 'text-valign', + type: t.valign, + triggersBounds: diff.any + }, { + name: 'text-halign', + type: t.halign, + triggersBounds: diff.any + }, { + name: 'color', + type: t.color + }, { + name: 'text-outline-color', + type: t.color + }, { + name: 'text-outline-opacity', + type: t.zeroOneNumber + }, { + name: 'text-background-color', + type: t.color + }, { + name: 'text-background-opacity', + type: t.zeroOneNumber + }, { + name: 'text-background-padding', + type: t.size, + triggersBounds: diff.any + }, { + name: 'text-border-opacity', + type: t.zeroOneNumber + }, { + name: 'text-border-color', + type: t.color + }, { + name: 'text-border-width', + type: t.size, + triggersBounds: diff.any + }, { + name: 'text-border-style', + type: t.borderStyle, + triggersBounds: diff.any + }, { + name: 'text-background-shape', + type: t.textBackgroundShape, + triggersBounds: diff.any + }, { + name: 'text-justification', + type: t.justification + }]; + var behavior = [{ + name: 'events', + type: t.bool + }, { + name: 'text-events', + type: t.bool + }]; + var visibility = [{ + name: 'display', + type: t.display, + triggersZOrder: diff.any, + triggersBounds: diff.any, + triggersBoundsOfParallelBeziers: true + }, { + name: 'visibility', + type: t.visibility, + triggersZOrder: diff.any + }, { + name: 'opacity', + type: t.zeroOneNumber, + triggersZOrder: diff.zeroNonZero + }, { + name: 'text-opacity', + type: t.zeroOneNumber + }, { + name: 'min-zoomed-font-size', + type: t.size + }, { + name: 'z-compound-depth', + type: t.zCompoundDepth, + triggersZOrder: diff.any + }, { + name: 'z-index-compare', + type: t.zIndexCompare, + triggersZOrder: diff.any + }, { + name: 'z-index', + type: t.nonNegativeInt, + triggersZOrder: diff.any + }]; + var overlay = [{ + name: 'overlay-padding', + type: t.size, + triggersBounds: diff.any + }, { + name: 'overlay-color', + type: t.color + }, { + name: 'overlay-opacity', + type: t.zeroOneNumber, + triggersBounds: diff.zeroNonZero + }, { + name: 'overlay-shape', + type: t.overlayShape, + triggersBounds: diff.any + }]; + var underlay = [{ + name: 'underlay-padding', + type: t.size, + triggersBounds: diff.any + }, { + name: 'underlay-color', + type: t.color + }, { + name: 'underlay-opacity', + type: t.zeroOneNumber, + triggersBounds: diff.zeroNonZero + }, { + name: 'underlay-shape', + type: t.overlayShape, + triggersBounds: diff.any + }]; + var transition = [{ + name: 'transition-property', + type: t.propList + }, { + name: 'transition-duration', + type: t.time + }, { + name: 'transition-delay', + type: t.time + }, { + name: 'transition-timing-function', + type: t.easing + }]; + + var nodeSizeHashOverride = function nodeSizeHashOverride(ele, parsedProp) { + if (parsedProp.value === 'label') { + return -ele.poolIndex(); // no hash key hits is using label size (hitrate for perf probably low anyway) + } else { + return parsedProp.pfValue; + } + }; + + var nodeBody = [{ + name: 'height', + type: t.nodeSize, + triggersBounds: diff.any, + hashOverride: nodeSizeHashOverride + }, { + name: 'width', + type: t.nodeSize, + triggersBounds: diff.any, + hashOverride: nodeSizeHashOverride + }, { + name: 'shape', + type: t.nodeShape, + triggersBounds: diff.any + }, { + name: 'shape-polygon-points', + type: t.polygonPointList, + triggersBounds: diff.any + }, { + name: 'background-color', + type: t.color + }, { + name: 'background-fill', + type: t.fill + }, { + name: 'background-opacity', + type: t.zeroOneNumber + }, { + name: 'background-blacken', + type: t.nOneOneNumber + }, { + name: 'background-gradient-stop-colors', + type: t.colors + }, { + name: 'background-gradient-stop-positions', + type: t.percentages + }, { + name: 'background-gradient-direction', + type: t.gradientDirection + }, { + name: 'padding', + type: t.sizeMaybePercent, + triggersBounds: diff.any + }, { + name: 'padding-relative-to', + type: t.paddingRelativeTo, + triggersBounds: diff.any + }, { + name: 'bounds-expansion', + type: t.boundsExpansion, + triggersBounds: diff.any + }]; + var nodeBorder = [{ + name: 'border-color', + type: t.color + }, { + name: 'border-opacity', + type: t.zeroOneNumber + }, { + name: 'border-width', + type: t.size, + triggersBounds: diff.any + }, { + name: 'border-style', + type: t.borderStyle + }]; + var backgroundImage = [{ + name: 'background-image', + type: t.urls + }, { + name: 'background-image-crossorigin', + type: t.bgCrossOrigin + }, { + name: 'background-image-opacity', + type: t.zeroOneNumbers + }, { + name: 'background-image-containment', + type: t.bgContainment + }, { + name: 'background-image-smoothing', + type: t.bools + }, { + name: 'background-position-x', + type: t.bgPos + }, { + name: 'background-position-y', + type: t.bgPos + }, { + name: 'background-width-relative-to', + type: t.bgRelativeTo + }, { + name: 'background-height-relative-to', + type: t.bgRelativeTo + }, { + name: 'background-repeat', + type: t.bgRepeat + }, { + name: 'background-fit', + type: t.bgFit + }, { + name: 'background-clip', + type: t.bgClip + }, { + name: 'background-width', + type: t.bgWH + }, { + name: 'background-height', + type: t.bgWH + }, { + name: 'background-offset-x', + type: t.bgPos + }, { + name: 'background-offset-y', + type: t.bgPos + }]; + var compound = [{ + name: 'position', + type: t.position, + triggersBounds: diff.any + }, { + name: 'compound-sizing-wrt-labels', + type: t.compoundIncludeLabels, + triggersBounds: diff.any + }, { + name: 'min-width', + type: t.size, + triggersBounds: diff.any + }, { + name: 'min-width-bias-left', + type: t.sizeMaybePercent, + triggersBounds: diff.any + }, { + name: 'min-width-bias-right', + type: t.sizeMaybePercent, + triggersBounds: diff.any + }, { + name: 'min-height', + type: t.size, + triggersBounds: diff.any + }, { + name: 'min-height-bias-top', + type: t.sizeMaybePercent, + triggersBounds: diff.any + }, { + name: 'min-height-bias-bottom', + type: t.sizeMaybePercent, + triggersBounds: diff.any + }]; + var edgeLine = [{ + name: 'line-style', + type: t.lineStyle + }, { + name: 'line-color', + type: t.color + }, { + name: 'line-fill', + type: t.fill + }, { + name: 'line-cap', + type: t.lineCap + }, { + name: 'line-opacity', + type: t.zeroOneNumber + }, { + name: 'line-dash-pattern', + type: t.numbers + }, { + name: 'line-dash-offset', + type: t.number + }, { + name: 'line-gradient-stop-colors', + type: t.colors + }, { + name: 'line-gradient-stop-positions', + type: t.percentages + }, { + name: 'curve-style', + type: t.curveStyle, + triggersBounds: diff.any, + triggersBoundsOfParallelBeziers: true + }, { + name: 'haystack-radius', + type: t.zeroOneNumber, + triggersBounds: diff.any + }, { + name: 'source-endpoint', + type: t.edgeEndpoint, + triggersBounds: diff.any + }, { + name: 'target-endpoint', + type: t.edgeEndpoint, + triggersBounds: diff.any + }, { + name: 'control-point-step-size', + type: t.size, + triggersBounds: diff.any + }, { + name: 'control-point-distances', + type: t.bidirectionalSizes, + triggersBounds: diff.any + }, { + name: 'control-point-weights', + type: t.numbers, + triggersBounds: diff.any + }, { + name: 'segment-distances', + type: t.bidirectionalSizes, + triggersBounds: diff.any + }, { + name: 'segment-weights', + type: t.numbers, + triggersBounds: diff.any + }, { + name: 'taxi-turn', + type: t.bidirectionalSizeMaybePercent, + triggersBounds: diff.any + }, { + name: 'taxi-turn-min-distance', + type: t.size, + triggersBounds: diff.any + }, { + name: 'taxi-direction', + type: t.axisDirection, + triggersBounds: diff.any + }, { + name: 'edge-distances', + type: t.edgeDistances, + triggersBounds: diff.any + }, { + name: 'arrow-scale', + type: t.positiveNumber, + triggersBounds: diff.any + }, { + name: 'loop-direction', + type: t.angle, + triggersBounds: diff.any + }, { + name: 'loop-sweep', + type: t.angle, + triggersBounds: diff.any + }, { + name: 'source-distance-from-node', + type: t.size, + triggersBounds: diff.any + }, { + name: 'target-distance-from-node', + type: t.size, + triggersBounds: diff.any + }]; + var ghost = [{ + name: 'ghost', + type: t.bool, + triggersBounds: diff.any + }, { + name: 'ghost-offset-x', + type: t.bidirectionalSize, + triggersBounds: diff.any + }, { + name: 'ghost-offset-y', + type: t.bidirectionalSize, + triggersBounds: diff.any + }, { + name: 'ghost-opacity', + type: t.zeroOneNumber + }]; + var core = [{ + name: 'selection-box-color', + type: t.color + }, { + name: 'selection-box-opacity', + type: t.zeroOneNumber + }, { + name: 'selection-box-border-color', + type: t.color + }, { + name: 'selection-box-border-width', + type: t.size + }, { + name: 'active-bg-color', + type: t.color + }, { + name: 'active-bg-opacity', + type: t.zeroOneNumber + }, { + name: 'active-bg-size', + type: t.size + }, { + name: 'outside-texture-bg-color', + type: t.color + }, { + name: 'outside-texture-bg-opacity', + type: t.zeroOneNumber + }]; // pie backgrounds for nodes + + var pie = []; + styfn$2.pieBackgroundN = 16; // because the pie properties are numbered, give access to a constant N (for renderer use) + + pie.push({ + name: 'pie-size', + type: t.sizeMaybePercent + }); + + for (var i = 1; i <= styfn$2.pieBackgroundN; i++) { + pie.push({ + name: 'pie-' + i + '-background-color', + type: t.color + }); + pie.push({ + name: 'pie-' + i + '-background-size', + type: t.percent + }); + pie.push({ + name: 'pie-' + i + '-background-opacity', + type: t.zeroOneNumber + }); + } // edge arrows + + + var edgeArrow = []; + var arrowPrefixes = styfn$2.arrowPrefixes = ['source', 'mid-source', 'target', 'mid-target']; + [{ + name: 'arrow-shape', + type: t.arrowShape, + triggersBounds: diff.any + }, { + name: 'arrow-color', + type: t.color + }, { + name: 'arrow-fill', + type: t.arrowFill + }].forEach(function (prop) { + arrowPrefixes.forEach(function (prefix) { + var name = prefix + '-' + prop.name; + var type = prop.type, + triggersBounds = prop.triggersBounds; + edgeArrow.push({ + name: name, + type: type, + triggersBounds: triggersBounds + }); + }); + }, {}); + var props = styfn$2.properties = [].concat(behavior, transition, visibility, overlay, underlay, ghost, commonLabel, labelDimensions, mainLabel, sourceLabel, targetLabel, nodeBody, nodeBorder, backgroundImage, pie, compound, edgeLine, edgeArrow, core); + var propGroups = styfn$2.propertyGroups = { + // common to all eles + behavior: behavior, + transition: transition, + visibility: visibility, + overlay: overlay, + underlay: underlay, + ghost: ghost, + // labels + commonLabel: commonLabel, + labelDimensions: labelDimensions, + mainLabel: mainLabel, + sourceLabel: sourceLabel, + targetLabel: targetLabel, + // node props + nodeBody: nodeBody, + nodeBorder: nodeBorder, + backgroundImage: backgroundImage, + pie: pie, + compound: compound, + // edge props + edgeLine: edgeLine, + edgeArrow: edgeArrow, + core: core + }; + var propGroupNames = styfn$2.propertyGroupNames = {}; + var propGroupKeys = styfn$2.propertyGroupKeys = Object.keys(propGroups); + propGroupKeys.forEach(function (key) { + propGroupNames[key] = propGroups[key].map(function (prop) { + return prop.name; + }); + propGroups[key].forEach(function (prop) { + return prop.groupKey = key; + }); + }); // define aliases + + var aliases = styfn$2.aliases = [{ + name: 'content', + pointsTo: 'label' + }, { + name: 'control-point-distance', + pointsTo: 'control-point-distances' + }, { + name: 'control-point-weight', + pointsTo: 'control-point-weights' + }, { + name: 'edge-text-rotation', + pointsTo: 'text-rotation' + }, { + name: 'padding-left', + pointsTo: 'padding' + }, { + name: 'padding-right', + pointsTo: 'padding' + }, { + name: 'padding-top', + pointsTo: 'padding' + }, { + name: 'padding-bottom', + pointsTo: 'padding' + }]; // list of property names + + styfn$2.propertyNames = props.map(function (p) { + return p.name; + }); // allow access of properties by name ( e.g. style.properties.height ) + + for (var _i = 0; _i < props.length; _i++) { + var prop = props[_i]; + props[prop.name] = prop; // allow lookup by name + } // map aliases + + + for (var _i2 = 0; _i2 < aliases.length; _i2++) { + var alias = aliases[_i2]; + var pointsToProp = props[alias.pointsTo]; + var aliasProp = { + name: alias.name, + alias: true, + pointsTo: pointsToProp + }; // add alias prop for parsing + + props.push(aliasProp); + props[alias.name] = aliasProp; // allow lookup by name + } + })(); + + styfn$2.getDefaultProperty = function (name) { + return this.getDefaultProperties()[name]; + }; + + styfn$2.getDefaultProperties = function () { + var _p = this._private; + + if (_p.defaultProperties != null) { + return _p.defaultProperties; + } + + var rawProps = extend({ + // core props + 'selection-box-color': '#ddd', + 'selection-box-opacity': 0.65, + 'selection-box-border-color': '#aaa', + 'selection-box-border-width': 1, + 'active-bg-color': 'black', + 'active-bg-opacity': 0.15, + 'active-bg-size': 30, + 'outside-texture-bg-color': '#000', + 'outside-texture-bg-opacity': 0.125, + // common node/edge props + 'events': 'yes', + 'text-events': 'no', + 'text-valign': 'top', + 'text-halign': 'center', + 'text-justification': 'auto', + 'line-height': 1, + 'color': '#000', + 'text-outline-color': '#000', + 'text-outline-width': 0, + 'text-outline-opacity': 1, + 'text-opacity': 1, + 'text-decoration': 'none', + 'text-transform': 'none', + 'text-wrap': 'none', + 'text-overflow-wrap': 'whitespace', + 'text-max-width': 9999, + 'text-background-color': '#000', + 'text-background-opacity': 0, + 'text-background-shape': 'rectangle', + 'text-background-padding': 0, + 'text-border-opacity': 0, + 'text-border-width': 0, + 'text-border-style': 'solid', + 'text-border-color': '#000', + 'font-family': 'Helvetica Neue, Helvetica, sans-serif', + 'font-style': 'normal', + 'font-weight': 'normal', + 'font-size': 16, + 'min-zoomed-font-size': 0, + 'text-rotation': 'none', + 'source-text-rotation': 'none', + 'target-text-rotation': 'none', + 'visibility': 'visible', + 'display': 'element', + 'opacity': 1, + 'z-compound-depth': 'auto', + 'z-index-compare': 'auto', + 'z-index': 0, + 'label': '', + 'text-margin-x': 0, + 'text-margin-y': 0, + 'source-label': '', + 'source-text-offset': 0, + 'source-text-margin-x': 0, + 'source-text-margin-y': 0, + 'target-label': '', + 'target-text-offset': 0, + 'target-text-margin-x': 0, + 'target-text-margin-y': 0, + 'overlay-opacity': 0, + 'overlay-color': '#000', + 'overlay-padding': 10, + 'overlay-shape': 'round-rectangle', + 'underlay-opacity': 0, + 'underlay-color': '#000', + 'underlay-padding': 10, + 'underlay-shape': 'round-rectangle', + 'transition-property': 'none', + 'transition-duration': 0, + 'transition-delay': 0, + 'transition-timing-function': 'linear', + // node props + 'background-blacken': 0, + 'background-color': '#999', + 'background-fill': 'solid', + 'background-opacity': 1, + 'background-image': 'none', + 'background-image-crossorigin': 'anonymous', + 'background-image-opacity': 1, + 'background-image-containment': 'inside', + 'background-image-smoothing': 'yes', + 'background-position-x': '50%', + 'background-position-y': '50%', + 'background-offset-x': 0, + 'background-offset-y': 0, + 'background-width-relative-to': 'include-padding', + 'background-height-relative-to': 'include-padding', + 'background-repeat': 'no-repeat', + 'background-fit': 'none', + 'background-clip': 'node', + 'background-width': 'auto', + 'background-height': 'auto', + 'border-color': '#000', + 'border-opacity': 1, + 'border-width': 0, + 'border-style': 'solid', + 'height': 30, + 'width': 30, + 'shape': 'ellipse', + 'shape-polygon-points': '-1, -1, 1, -1, 1, 1, -1, 1', + 'bounds-expansion': 0, + // node gradient + 'background-gradient-direction': 'to-bottom', + 'background-gradient-stop-colors': '#999', + 'background-gradient-stop-positions': '0%', + // ghost props + 'ghost': 'no', + 'ghost-offset-y': 0, + 'ghost-offset-x': 0, + 'ghost-opacity': 0, + // compound props + 'padding': 0, + 'padding-relative-to': 'width', + 'position': 'origin', + 'compound-sizing-wrt-labels': 'include', + 'min-width': 0, + 'min-width-bias-left': 0, + 'min-width-bias-right': 0, + 'min-height': 0, + 'min-height-bias-top': 0, + 'min-height-bias-bottom': 0 + }, { + // node pie bg + 'pie-size': '100%' + }, [{ + name: 'pie-{{i}}-background-color', + value: 'black' + }, { + name: 'pie-{{i}}-background-size', + value: '0%' + }, { + name: 'pie-{{i}}-background-opacity', + value: 1 + }].reduce(function (css, prop) { + for (var i = 1; i <= styfn$2.pieBackgroundN; i++) { + var name = prop.name.replace('{{i}}', i); + var val = prop.value; + css[name] = val; + } + + return css; + }, {}), { + // edge props + 'line-style': 'solid', + 'line-color': '#999', + 'line-fill': 'solid', + 'line-cap': 'butt', + 'line-opacity': 1, + 'line-gradient-stop-colors': '#999', + 'line-gradient-stop-positions': '0%', + 'control-point-step-size': 40, + 'control-point-weights': 0.5, + 'segment-weights': 0.5, + 'segment-distances': 20, + 'taxi-turn': '50%', + 'taxi-turn-min-distance': 10, + 'taxi-direction': 'auto', + 'edge-distances': 'intersection', + 'curve-style': 'haystack', + 'haystack-radius': 0, + 'arrow-scale': 1, + 'loop-direction': '-45deg', + 'loop-sweep': '-90deg', + 'source-distance-from-node': 0, + 'target-distance-from-node': 0, + 'source-endpoint': 'outside-to-node', + 'target-endpoint': 'outside-to-node', + 'line-dash-pattern': [6, 3], + 'line-dash-offset': 0 + }, [{ + name: 'arrow-shape', + value: 'none' + }, { + name: 'arrow-color', + value: '#999' + }, { + name: 'arrow-fill', + value: 'filled' + }].reduce(function (css, prop) { + styfn$2.arrowPrefixes.forEach(function (prefix) { + var name = prefix + '-' + prop.name; + var val = prop.value; + css[name] = val; + }); + return css; + }, {})); + var parsedProps = {}; + + for (var i = 0; i < this.properties.length; i++) { + var prop = this.properties[i]; + + if (prop.pointsTo) { + continue; + } + + var name = prop.name; + var val = rawProps[name]; + var parsedProp = this.parse(name, val); + parsedProps[name] = parsedProp; + } + + _p.defaultProperties = parsedProps; + return _p.defaultProperties; + }; + + styfn$2.addDefaultStylesheet = function () { + this.selector(':parent').css({ + 'shape': 'rectangle', + 'padding': 10, + 'background-color': '#eee', + 'border-color': '#ccc', + 'border-width': 1 + }).selector('edge').css({ + 'width': 3 + }).selector(':loop').css({ + 'curve-style': 'bezier' + }).selector('edge:compound').css({ + 'curve-style': 'bezier', + 'source-endpoint': 'outside-to-line', + 'target-endpoint': 'outside-to-line' + }).selector(':selected').css({ + 'background-color': '#0169D9', + 'line-color': '#0169D9', + 'source-arrow-color': '#0169D9', + 'target-arrow-color': '#0169D9', + 'mid-source-arrow-color': '#0169D9', + 'mid-target-arrow-color': '#0169D9' + }).selector(':parent:selected').css({ + 'background-color': '#CCE1F9', + 'border-color': '#aec8e5' + }).selector(':active').css({ + 'overlay-color': 'black', + 'overlay-padding': 10, + 'overlay-opacity': 0.25 + }); + this.defaultLength = this.length; + }; + + var styfn$1 = {}; // a caching layer for property parsing + + styfn$1.parse = function (name, value, propIsBypass, propIsFlat) { + var self = this; // function values can't be cached in all cases, and there isn't much benefit of caching them anyway + + if (fn$6(value)) { + return self.parseImplWarn(name, value, propIsBypass, propIsFlat); + } + + var flatKey = propIsFlat === 'mapping' || propIsFlat === true || propIsFlat === false || propIsFlat == null ? 'dontcare' : propIsFlat; + var bypassKey = propIsBypass ? 't' : 'f'; + var valueKey = '' + value; + var argHash = hashStrings(name, valueKey, bypassKey, flatKey); + var propCache = self.propCache = self.propCache || []; + var ret; + + if (!(ret = propCache[argHash])) { + ret = propCache[argHash] = self.parseImplWarn(name, value, propIsBypass, propIsFlat); + } // - bypasses can't be shared b/c the value can be changed by animations or otherwise overridden + // - mappings can't be shared b/c mappings are per-element + + + if (propIsBypass || propIsFlat === 'mapping') { + // need a copy since props are mutated later in their lifecycles + ret = copy(ret); + + if (ret) { + ret.value = copy(ret.value); // because it could be an array, e.g. colour + } + } + + return ret; + }; + + styfn$1.parseImplWarn = function (name, value, propIsBypass, propIsFlat) { + var prop = this.parseImpl(name, value, propIsBypass, propIsFlat); + + if (!prop && value != null) { + warn("The style property `".concat(name, ": ").concat(value, "` is invalid")); + } + + if (prop && (prop.name === 'width' || prop.name === 'height') && value === 'label') { + warn('The style value of `label` is deprecated for `' + prop.name + '`'); + } + + return prop; + }; // parse a property; return null on invalid; return parsed property otherwise + // fields : + // - name : the name of the property + // - value : the parsed, native-typed value of the property + // - strValue : a string value that represents the property value in valid css + // - bypass : true iff the property is a bypass property + + + styfn$1.parseImpl = function (name, value, propIsBypass, propIsFlat) { + var self = this; + name = camel2dash(name); // make sure the property name is in dash form (e.g. 'property-name' not 'propertyName') + + var property = self.properties[name]; + var passedValue = value; + var types = self.types; + + if (!property) { + return null; + } // return null on property of unknown name + + + if (value === undefined) { + return null; + } // can't assign undefined + // the property may be an alias + + + if (property.alias) { + property = property.pointsTo; + name = property.name; + } + + var valueIsString = string(value); + + if (valueIsString) { + // trim the value to make parsing easier + value = value.trim(); + } + + var type = property.type; + + if (!type) { + return null; + } // no type, no luck + // check if bypass is null or empty string (i.e. indication to delete bypass property) + + + if (propIsBypass && (value === '' || value === null)) { + return { + name: name, + value: value, + bypass: true, + deleteBypass: true + }; + } // check if value is a function used as a mapper + + + if (fn$6(value)) { + return { + name: name, + value: value, + strValue: 'fn', + mapped: types.fn, + bypass: propIsBypass + }; + } // check if value is mapped + + + var data, mapData; + + if (!valueIsString || propIsFlat || value.length < 7 || value[1] !== 'a') ; else if (value.length >= 7 && value[0] === 'd' && (data = new RegExp(types.data.regex).exec(value))) { + if (propIsBypass) { + return false; + } // mappers not allowed in bypass + + + var mapped = types.data; + return { + name: name, + value: data, + strValue: '' + value, + mapped: mapped, + field: data[1], + bypass: propIsBypass + }; + } else if (value.length >= 10 && value[0] === 'm' && (mapData = new RegExp(types.mapData.regex).exec(value))) { + if (propIsBypass) { + return false; + } // mappers not allowed in bypass + + + if (type.multiple) { + return false; + } // impossible to map to num + + + var _mapped = types.mapData; // we can map only if the type is a colour or a number + + if (!(type.color || type.number)) { + return false; + } + + var valueMin = this.parse(name, mapData[4]); // parse to validate + + if (!valueMin || valueMin.mapped) { + return false; + } // can't be invalid or mapped + + + var valueMax = this.parse(name, mapData[5]); // parse to validate + + if (!valueMax || valueMax.mapped) { + return false; + } // can't be invalid or mapped + // check if valueMin and valueMax are the same + + + if (valueMin.pfValue === valueMax.pfValue || valueMin.strValue === valueMax.strValue) { + warn('`' + name + ': ' + value + '` is not a valid mapper because the output range is zero; converting to `' + name + ': ' + valueMin.strValue + '`'); + return this.parse(name, valueMin.strValue); // can't make much of a mapper without a range + } else if (type.color) { + var c1 = valueMin.value; + var c2 = valueMax.value; + var same = c1[0] === c2[0] // red + && c1[1] === c2[1] // green + && c1[2] === c2[2] // blue + && ( // optional alpha + c1[3] === c2[3] // same alpha outright + || (c1[3] == null || c1[3] === 1 // full opacity for colour 1? + ) && (c2[3] == null || c2[3] === 1) // full opacity for colour 2? + ); + + if (same) { + return false; + } // can't make a mapper without a range + + } + + return { + name: name, + value: mapData, + strValue: '' + value, + mapped: _mapped, + field: mapData[1], + fieldMin: parseFloat(mapData[2]), + // min & max are numeric + fieldMax: parseFloat(mapData[3]), + valueMin: valueMin.value, + valueMax: valueMax.value, + bypass: propIsBypass + }; + } + + if (type.multiple && propIsFlat !== 'multiple') { + var vals; + + if (valueIsString) { + vals = value.split(/\s+/); + } else if (array(value)) { + vals = value; + } else { + vals = [value]; + } + + if (type.evenMultiple && vals.length % 2 !== 0) { + return null; + } + + var valArr = []; + var unitsArr = []; + var pfValArr = []; + var strVal = ''; + var hasEnum = false; + + for (var i = 0; i < vals.length; i++) { + var p = self.parse(name, vals[i], propIsBypass, 'multiple'); + hasEnum = hasEnum || string(p.value); + valArr.push(p.value); + pfValArr.push(p.pfValue != null ? p.pfValue : p.value); + unitsArr.push(p.units); + strVal += (i > 0 ? ' ' : '') + p.strValue; + } + + if (type.validate && !type.validate(valArr, unitsArr)) { + return null; + } + + if (type.singleEnum && hasEnum) { + if (valArr.length === 1 && string(valArr[0])) { + return { + name: name, + value: valArr[0], + strValue: valArr[0], + bypass: propIsBypass + }; + } else { + return null; + } + } + + return { + name: name, + value: valArr, + pfValue: pfValArr, + strValue: strVal, + bypass: propIsBypass, + units: unitsArr + }; + } // several types also allow enums + + + var checkEnums = function checkEnums() { + for (var _i = 0; _i < type.enums.length; _i++) { + var en = type.enums[_i]; + + if (en === value) { + return { + name: name, + value: value, + strValue: '' + value, + bypass: propIsBypass + }; + } + } + + return null; + }; // check the type and return the appropriate object + + + if (type.number) { + var units; + var implicitUnits = 'px'; // not set => px + + if (type.units) { + // use specified units if set + units = type.units; + } + + if (type.implicitUnits) { + implicitUnits = type.implicitUnits; + } + + if (!type.unitless) { + if (valueIsString) { + var unitsRegex = 'px|em' + (type.allowPercent ? '|\\%' : ''); + + if (units) { + unitsRegex = units; + } // only allow explicit units if so set + + + var match = value.match('^(' + number + ')(' + unitsRegex + ')?' + '$'); + + if (match) { + value = match[1]; + units = match[2] || implicitUnits; + } + } else if (!units || type.implicitUnits) { + units = implicitUnits; // implicitly px if unspecified + } + } + + value = parseFloat(value); // if not a number and enums not allowed, then the value is invalid + + if (isNaN(value) && type.enums === undefined) { + return null; + } // check if this number type also accepts special keywords in place of numbers + // (i.e. `left`, `auto`, etc) + + + if (isNaN(value) && type.enums !== undefined) { + value = passedValue; + return checkEnums(); + } // check if value must be an integer + + + if (type.integer && !integer(value)) { + return null; + } // check value is within range + + + if (type.min !== undefined && (value < type.min || type.strictMin && value === type.min) || type.max !== undefined && (value > type.max || type.strictMax && value === type.max)) { + return null; + } + + var ret = { + name: name, + value: value, + strValue: '' + value + (units ? units : ''), + units: units, + bypass: propIsBypass + }; // normalise value in pixels + + if (type.unitless || units !== 'px' && units !== 'em') { + ret.pfValue = value; + } else { + ret.pfValue = units === 'px' || !units ? value : this.getEmSizeInPixels() * value; + } // normalise value in ms + + + if (units === 'ms' || units === 's') { + ret.pfValue = units === 'ms' ? value : 1000 * value; + } // normalise value in rad + + + if (units === 'deg' || units === 'rad') { + ret.pfValue = units === 'rad' ? value : deg2rad(value); + } // normalize value in % + + + if (units === '%') { + ret.pfValue = value / 100; + } + + return ret; + } else if (type.propList) { + var props = []; + var propsStr = '' + value; + + if (propsStr === 'none') ; else { + // go over each prop + var propsSplit = propsStr.split(/\s*,\s*|\s+/); + + for (var _i2 = 0; _i2 < propsSplit.length; _i2++) { + var propName = propsSplit[_i2].trim(); + + if (self.properties[propName]) { + props.push(propName); + } else { + warn('`' + propName + '` is not a valid property name'); + } + } + + if (props.length === 0) { + return null; + } + } + + return { + name: name, + value: props, + strValue: props.length === 0 ? 'none' : props.join(' '), + bypass: propIsBypass + }; + } else if (type.color) { + var tuple = color2tuple(value); + + if (!tuple) { + return null; + } + + return { + name: name, + value: tuple, + pfValue: tuple, + strValue: 'rgb(' + tuple[0] + ',' + tuple[1] + ',' + tuple[2] + ')', + // n.b. no spaces b/c of multiple support + bypass: propIsBypass + }; + } else if (type.regex || type.regexes) { + // first check enums + if (type.enums) { + var enumProp = checkEnums(); + + if (enumProp) { + return enumProp; + } + } + + var regexes = type.regexes ? type.regexes : [type.regex]; + + for (var _i3 = 0; _i3 < regexes.length; _i3++) { + var regex = new RegExp(regexes[_i3]); // make a regex from the type string + + var m = regex.exec(value); + + if (m) { + // regex matches + return { + name: name, + value: type.singleRegexMatchValue ? m[1] : m, + strValue: '' + value, + bypass: propIsBypass + }; + } + } + + return null; // didn't match any + } else if (type.string) { + // just return + return { + name: name, + value: '' + value, + strValue: '' + value, + bypass: propIsBypass + }; + } else if (type.enums) { + // check enums last because it's a combo type in others + return checkEnums(); + } else { + return null; // not a type we can handle + } + }; + + var Style = function Style(cy) { + if (!(this instanceof Style)) { + return new Style(cy); + } + + if (!core(cy)) { + error('A style must have a core reference'); + return; + } + + this._private = { + cy: cy, + coreStyle: {} + }; + this.length = 0; + this.resetToDefault(); + }; + + var styfn = Style.prototype; + + styfn.instanceString = function () { + return 'style'; + }; // remove all contexts + + + styfn.clear = function () { + var _p = this._private; + var cy = _p.cy; + var eles = cy.elements(); + + for (var i = 0; i < this.length; i++) { + this[i] = undefined; + } + + this.length = 0; + _p.contextStyles = {}; + _p.propDiffs = {}; + this.cleanElements(eles, true); + eles.forEach(function (ele) { + var ele_p = ele[0]._private; + ele_p.styleDirty = true; + ele_p.appliedInitStyle = false; + }); + return this; // chaining + }; + + styfn.resetToDefault = function () { + this.clear(); + this.addDefaultStylesheet(); + return this; + }; // builds a style object for the 'core' selector + + + styfn.core = function (propName) { + return this._private.coreStyle[propName] || this.getDefaultProperty(propName); + }; // create a new context from the specified selector string and switch to that context + + + styfn.selector = function (selectorStr) { + // 'core' is a special case and does not need a selector + var selector = selectorStr === 'core' ? null : new Selector(selectorStr); + var i = this.length++; // new context means new index + + this[i] = { + selector: selector, + properties: [], + mappedProperties: [], + index: i + }; + return this; // chaining + }; // add one or many css rules to the current context + + + styfn.css = function () { + var self = this; + var args = arguments; + + if (args.length === 1) { + var map = args[0]; + + for (var i = 0; i < self.properties.length; i++) { + var prop = self.properties[i]; + var mapVal = map[prop.name]; + + if (mapVal === undefined) { + mapVal = map[dash2camel(prop.name)]; + } + + if (mapVal !== undefined) { + this.cssRule(prop.name, mapVal); + } + } + } else if (args.length === 2) { + this.cssRule(args[0], args[1]); + } // do nothing if args are invalid + + + return this; // chaining + }; + + styfn.style = styfn.css; // add a single css rule to the current context + + styfn.cssRule = function (name, value) { + // name-value pair + var property = this.parse(name, value); // add property to current context if valid + + if (property) { + var i = this.length - 1; + this[i].properties.push(property); + this[i].properties[property.name] = property; // allow access by name as well + + if (property.name.match(/pie-(\d+)-background-size/) && property.value) { + this._private.hasPie = true; + } + + if (property.mapped) { + this[i].mappedProperties.push(property); + } // add to core style if necessary + + + var currentSelectorIsCore = !this[i].selector; + + if (currentSelectorIsCore) { + this._private.coreStyle[property.name] = property; + } + } + + return this; // chaining + }; + + styfn.append = function (style) { + if (stylesheet(style)) { + style.appendToStyle(this); + } else if (array(style)) { + this.appendFromJson(style); + } else if (string(style)) { + this.appendFromString(style); + } // you probably wouldn't want to append a Style, since you'd duplicate the default parts + + + return this; + }; // static function + + + Style.fromJson = function (cy, json) { + var style = new Style(cy); + style.fromJson(json); + return style; + }; + + Style.fromString = function (cy, string) { + return new Style(cy).fromString(string); + }; + + [styfn$8, styfn$7, styfn$6, styfn$5, styfn$4, styfn$3, styfn$2, styfn$1].forEach(function (props) { + extend(styfn, props); + }); + Style.types = styfn.types; + Style.properties = styfn.properties; + Style.propertyGroups = styfn.propertyGroups; + Style.propertyGroupNames = styfn.propertyGroupNames; + Style.propertyGroupKeys = styfn.propertyGroupKeys; + + var corefn$2 = { + style: function style(newStyle) { + if (newStyle) { + var s = this.setStyle(newStyle); + s.update(); + } + + return this._private.style; + }, + setStyle: function setStyle(style) { + var _p = this._private; + + if (stylesheet(style)) { + _p.style = style.generateStyle(this); + } else if (array(style)) { + _p.style = Style.fromJson(this, style); + } else if (string(style)) { + _p.style = Style.fromString(this, style); + } else { + _p.style = Style(this); + } + + return _p.style; + }, + // e.g. cy.data() changed => recalc ele mappers + updateStyle: function updateStyle() { + this.mutableElements().updateStyle(); // just send to all eles + } + }; + + var defaultSelectionType = 'single'; + var corefn$1 = { + autolock: function autolock(bool) { + if (bool !== undefined) { + this._private.autolock = bool ? true : false; + } else { + return this._private.autolock; + } + + return this; // chaining + }, + autoungrabify: function autoungrabify(bool) { + if (bool !== undefined) { + this._private.autoungrabify = bool ? true : false; + } else { + return this._private.autoungrabify; + } + + return this; // chaining + }, + autounselectify: function autounselectify(bool) { + if (bool !== undefined) { + this._private.autounselectify = bool ? true : false; + } else { + return this._private.autounselectify; + } + + return this; // chaining + }, + selectionType: function selectionType(selType) { + var _p = this._private; + + if (_p.selectionType == null) { + _p.selectionType = defaultSelectionType; + } + + if (selType !== undefined) { + if (selType === 'additive' || selType === 'single') { + _p.selectionType = selType; + } + } else { + return _p.selectionType; + } + + return this; + }, + panningEnabled: function panningEnabled(bool) { + if (bool !== undefined) { + this._private.panningEnabled = bool ? true : false; + } else { + return this._private.panningEnabled; + } + + return this; // chaining + }, + userPanningEnabled: function userPanningEnabled(bool) { + if (bool !== undefined) { + this._private.userPanningEnabled = bool ? true : false; + } else { + return this._private.userPanningEnabled; + } + + return this; // chaining + }, + zoomingEnabled: function zoomingEnabled(bool) { + if (bool !== undefined) { + this._private.zoomingEnabled = bool ? true : false; + } else { + return this._private.zoomingEnabled; + } + + return this; // chaining + }, + userZoomingEnabled: function userZoomingEnabled(bool) { + if (bool !== undefined) { + this._private.userZoomingEnabled = bool ? true : false; + } else { + return this._private.userZoomingEnabled; + } + + return this; // chaining + }, + boxSelectionEnabled: function boxSelectionEnabled(bool) { + if (bool !== undefined) { + this._private.boxSelectionEnabled = bool ? true : false; + } else { + return this._private.boxSelectionEnabled; + } + + return this; // chaining + }, + pan: function pan() { + var args = arguments; + var pan = this._private.pan; + var dim, val, dims, x, y; + + switch (args.length) { + case 0: + // .pan() + return pan; + + case 1: + if (string(args[0])) { + // .pan('x') + dim = args[0]; + return pan[dim]; + } else if (plainObject(args[0])) { + // .pan({ x: 0, y: 100 }) + if (!this._private.panningEnabled) { + return this; + } + + dims = args[0]; + x = dims.x; + y = dims.y; + + if (number$1(x)) { + pan.x = x; + } + + if (number$1(y)) { + pan.y = y; + } + + this.emit('pan viewport'); + } + + break; + + case 2: + // .pan('x', 100) + if (!this._private.panningEnabled) { + return this; + } + + dim = args[0]; + val = args[1]; + + if ((dim === 'x' || dim === 'y') && number$1(val)) { + pan[dim] = val; + } + + this.emit('pan viewport'); + break; + // invalid + } + + this.notify('viewport'); + return this; // chaining + }, + panBy: function panBy(arg0, arg1) { + var args = arguments; + var pan = this._private.pan; + var dim, val, dims, x, y; + + if (!this._private.panningEnabled) { + return this; + } + + switch (args.length) { + case 1: + if (plainObject(arg0)) { + // .panBy({ x: 0, y: 100 }) + dims = args[0]; + x = dims.x; + y = dims.y; + + if (number$1(x)) { + pan.x += x; + } + + if (number$1(y)) { + pan.y += y; + } + + this.emit('pan viewport'); + } + + break; + + case 2: + // .panBy('x', 100) + dim = arg0; + val = arg1; + + if ((dim === 'x' || dim === 'y') && number$1(val)) { + pan[dim] += val; + } + + this.emit('pan viewport'); + break; + // invalid + } + + this.notify('viewport'); + return this; // chaining + }, + fit: function fit(elements, padding) { + var viewportState = this.getFitViewport(elements, padding); + + if (viewportState) { + var _p = this._private; + _p.zoom = viewportState.zoom; + _p.pan = viewportState.pan; + this.emit('pan zoom viewport'); + this.notify('viewport'); + } + + return this; // chaining + }, + getFitViewport: function getFitViewport(elements, padding) { + if (number$1(elements) && padding === undefined) { + // elements is optional + padding = elements; + elements = undefined; + } + + if (!this._private.panningEnabled || !this._private.zoomingEnabled) { + return; + } + + var bb; + + if (string(elements)) { + var sel = elements; + elements = this.$(sel); + } else if (boundingBox(elements)) { + // assume bb + var bbe = elements; + bb = { + x1: bbe.x1, + y1: bbe.y1, + x2: bbe.x2, + y2: bbe.y2 + }; + bb.w = bb.x2 - bb.x1; + bb.h = bb.y2 - bb.y1; + } else if (!elementOrCollection(elements)) { + elements = this.mutableElements(); + } + + if (elementOrCollection(elements) && elements.empty()) { + return; + } // can't fit to nothing + + + bb = bb || elements.boundingBox(); + var w = this.width(); + var h = this.height(); + var zoom; + padding = number$1(padding) ? padding : 0; + + if (!isNaN(w) && !isNaN(h) && w > 0 && h > 0 && !isNaN(bb.w) && !isNaN(bb.h) && bb.w > 0 && bb.h > 0) { + zoom = Math.min((w - 2 * padding) / bb.w, (h - 2 * padding) / bb.h); // crop zoom + + zoom = zoom > this._private.maxZoom ? this._private.maxZoom : zoom; + zoom = zoom < this._private.minZoom ? this._private.minZoom : zoom; + var pan = { + // now pan to middle + x: (w - zoom * (bb.x1 + bb.x2)) / 2, + y: (h - zoom * (bb.y1 + bb.y2)) / 2 + }; + return { + zoom: zoom, + pan: pan + }; + } + + return; + }, + zoomRange: function zoomRange(min, max) { + var _p = this._private; + + if (max == null) { + var opts = min; + min = opts.min; + max = opts.max; + } + + if (number$1(min) && number$1(max) && min <= max) { + _p.minZoom = min; + _p.maxZoom = max; + } else if (number$1(min) && max === undefined && min <= _p.maxZoom) { + _p.minZoom = min; + } else if (number$1(max) && min === undefined && max >= _p.minZoom) { + _p.maxZoom = max; + } + + return this; + }, + minZoom: function minZoom(zoom) { + if (zoom === undefined) { + return this._private.minZoom; + } else { + return this.zoomRange({ + min: zoom + }); + } + }, + maxZoom: function maxZoom(zoom) { + if (zoom === undefined) { + return this._private.maxZoom; + } else { + return this.zoomRange({ + max: zoom + }); + } + }, + getZoomedViewport: function getZoomedViewport(params) { + var _p = this._private; + var currentPan = _p.pan; + var currentZoom = _p.zoom; + var pos; // in rendered px + + var zoom; + var bail = false; + + if (!_p.zoomingEnabled) { + // zooming disabled + bail = true; + } + + if (number$1(params)) { + // then set the zoom + zoom = params; + } else if (plainObject(params)) { + // then zoom about a point + zoom = params.level; + + if (params.position != null) { + pos = modelToRenderedPosition(params.position, currentZoom, currentPan); + } else if (params.renderedPosition != null) { + pos = params.renderedPosition; + } + + if (pos != null && !_p.panningEnabled) { + // panning disabled + bail = true; + } + } // crop zoom + + + zoom = zoom > _p.maxZoom ? _p.maxZoom : zoom; + zoom = zoom < _p.minZoom ? _p.minZoom : zoom; // can't zoom with invalid params + + if (bail || !number$1(zoom) || zoom === currentZoom || pos != null && (!number$1(pos.x) || !number$1(pos.y))) { + return null; + } + + if (pos != null) { + // set zoom about position + var pan1 = currentPan; + var zoom1 = currentZoom; + var zoom2 = zoom; + var pan2 = { + x: -zoom2 / zoom1 * (pos.x - pan1.x) + pos.x, + y: -zoom2 / zoom1 * (pos.y - pan1.y) + pos.y + }; + return { + zoomed: true, + panned: true, + zoom: zoom2, + pan: pan2 + }; + } else { + // just set the zoom + return { + zoomed: true, + panned: false, + zoom: zoom, + pan: currentPan + }; + } + }, + zoom: function zoom(params) { + if (params === undefined) { + // get + return this._private.zoom; + } else { + // set + var vp = this.getZoomedViewport(params); + var _p = this._private; + + if (vp == null || !vp.zoomed) { + return this; + } + + _p.zoom = vp.zoom; + + if (vp.panned) { + _p.pan.x = vp.pan.x; + _p.pan.y = vp.pan.y; + } + + this.emit('zoom' + (vp.panned ? ' pan' : '') + ' viewport'); + this.notify('viewport'); + return this; // chaining + } + }, + viewport: function viewport(opts) { + var _p = this._private; + var zoomDefd = true; + var panDefd = true; + var events = []; // to trigger + + var zoomFailed = false; + var panFailed = false; + + if (!opts) { + return this; + } + + if (!number$1(opts.zoom)) { + zoomDefd = false; + } + + if (!plainObject(opts.pan)) { + panDefd = false; + } + + if (!zoomDefd && !panDefd) { + return this; + } + + if (zoomDefd) { + var z = opts.zoom; + + if (z < _p.minZoom || z > _p.maxZoom || !_p.zoomingEnabled) { + zoomFailed = true; + } else { + _p.zoom = z; + events.push('zoom'); + } + } + + if (panDefd && (!zoomFailed || !opts.cancelOnFailedZoom) && _p.panningEnabled) { + var p = opts.pan; + + if (number$1(p.x)) { + _p.pan.x = p.x; + panFailed = false; + } + + if (number$1(p.y)) { + _p.pan.y = p.y; + panFailed = false; + } + + if (!panFailed) { + events.push('pan'); + } + } + + if (events.length > 0) { + events.push('viewport'); + this.emit(events.join(' ')); + this.notify('viewport'); + } + + return this; // chaining + }, + center: function center(elements) { + var pan = this.getCenterPan(elements); + + if (pan) { + this._private.pan = pan; + this.emit('pan viewport'); + this.notify('viewport'); + } + + return this; // chaining + }, + getCenterPan: function getCenterPan(elements, zoom) { + if (!this._private.panningEnabled) { + return; + } + + if (string(elements)) { + var selector = elements; + elements = this.mutableElements().filter(selector); + } else if (!elementOrCollection(elements)) { + elements = this.mutableElements(); + } + + if (elements.length === 0) { + return; + } // can't centre pan to nothing + + + var bb = elements.boundingBox(); + var w = this.width(); + var h = this.height(); + zoom = zoom === undefined ? this._private.zoom : zoom; + var pan = { + // middle + x: (w - zoom * (bb.x1 + bb.x2)) / 2, + y: (h - zoom * (bb.y1 + bb.y2)) / 2 + }; + return pan; + }, + reset: function reset() { + if (!this._private.panningEnabled || !this._private.zoomingEnabled) { + return this; + } + + this.viewport({ + pan: { + x: 0, + y: 0 + }, + zoom: 1 + }); + return this; // chaining + }, + invalidateSize: function invalidateSize() { + this._private.sizeCache = null; + }, + size: function size() { + var _p = this._private; + var container = _p.container; + var cy = this; + return _p.sizeCache = _p.sizeCache || (container ? function () { + var style = cy.window().getComputedStyle(container); + + var val = function val(name) { + return parseFloat(style.getPropertyValue(name)); + }; + + return { + width: container.clientWidth - val('padding-left') - val('padding-right'), + height: container.clientHeight - val('padding-top') - val('padding-bottom') + }; + }() : { + // fallback if no container (not 0 b/c can be used for dividing etc) + width: 1, + height: 1 + }); + }, + width: function width() { + return this.size().width; + }, + height: function height() { + return this.size().height; + }, + extent: function extent() { + var pan = this._private.pan; + var zoom = this._private.zoom; + var rb = this.renderedExtent(); + var b = { + x1: (rb.x1 - pan.x) / zoom, + x2: (rb.x2 - pan.x) / zoom, + y1: (rb.y1 - pan.y) / zoom, + y2: (rb.y2 - pan.y) / zoom + }; + b.w = b.x2 - b.x1; + b.h = b.y2 - b.y1; + return b; + }, + renderedExtent: function renderedExtent() { + var width = this.width(); + var height = this.height(); + return { + x1: 0, + y1: 0, + x2: width, + y2: height, + w: width, + h: height + }; + }, + multiClickDebounceTime: function multiClickDebounceTime(_int) { + if (_int) this._private.multiClickDebounceTime = _int;else return this._private.multiClickDebounceTime; + return this; // chaining + } + }; // aliases + + corefn$1.centre = corefn$1.center; // backwards compatibility + + corefn$1.autolockNodes = corefn$1.autolock; + corefn$1.autoungrabifyNodes = corefn$1.autoungrabify; + + var fn = { + data: define.data({ + field: 'data', + bindingEvent: 'data', + allowBinding: true, + allowSetting: true, + settingEvent: 'data', + settingTriggersEvent: true, + triggerFnName: 'trigger', + allowGetting: true, + updateStyle: true + }), + removeData: define.removeData({ + field: 'data', + event: 'data', + triggerFnName: 'trigger', + triggerEvent: true, + updateStyle: true + }), + scratch: define.data({ + field: 'scratch', + bindingEvent: 'scratch', + allowBinding: true, + allowSetting: true, + settingEvent: 'scratch', + settingTriggersEvent: true, + triggerFnName: 'trigger', + allowGetting: true, + updateStyle: true + }), + removeScratch: define.removeData({ + field: 'scratch', + event: 'scratch', + triggerFnName: 'trigger', + triggerEvent: true, + updateStyle: true + }) + }; // aliases + + fn.attr = fn.data; + fn.removeAttr = fn.removeData; + + var Core = function Core(opts) { + var cy = this; + opts = extend({}, opts); + var container = opts.container; // allow for passing a wrapped jquery object + // e.g. cytoscape({ container: $('#cy') }) + + if (container && !htmlElement(container) && htmlElement(container[0])) { + container = container[0]; + } + + var reg = container ? container._cyreg : null; // e.g. already registered some info (e.g. readies) via jquery + + reg = reg || {}; + + if (reg && reg.cy) { + reg.cy.destroy(); + reg = {}; // old instance => replace reg completely + } + + var readies = reg.readies = reg.readies || []; + + if (container) { + container._cyreg = reg; + } // make sure container assoc'd reg points to this cy + + + reg.cy = cy; + var head = _window !== undefined && container !== undefined && !opts.headless; + var options = opts; + options.layout = extend({ + name: head ? 'grid' : 'null' + }, options.layout); + options.renderer = extend({ + name: head ? 'canvas' : 'null' + }, options.renderer); + + var defVal = function defVal(def, val, altVal) { + if (val !== undefined) { + return val; + } else if (altVal !== undefined) { + return altVal; + } else { + return def; + } + }; + + var _p = this._private = { + container: container, + // html dom ele container + ready: false, + // whether ready has been triggered + options: options, + // cached options + elements: new Collection(this), + // elements in the graph + listeners: [], + // list of listeners + aniEles: new Collection(this), + // elements being animated + data: options.data || {}, + // data for the core + scratch: {}, + // scratch object for core + layout: null, + renderer: null, + destroyed: false, + // whether destroy was called + notificationsEnabled: true, + // whether notifications are sent to the renderer + minZoom: 1e-50, + maxZoom: 1e50, + zoomingEnabled: defVal(true, options.zoomingEnabled), + userZoomingEnabled: defVal(true, options.userZoomingEnabled), + panningEnabled: defVal(true, options.panningEnabled), + userPanningEnabled: defVal(true, options.userPanningEnabled), + boxSelectionEnabled: defVal(true, options.boxSelectionEnabled), + autolock: defVal(false, options.autolock, options.autolockNodes), + autoungrabify: defVal(false, options.autoungrabify, options.autoungrabifyNodes), + autounselectify: defVal(false, options.autounselectify), + styleEnabled: options.styleEnabled === undefined ? head : options.styleEnabled, + zoom: number$1(options.zoom) ? options.zoom : 1, + pan: { + x: plainObject(options.pan) && number$1(options.pan.x) ? options.pan.x : 0, + y: plainObject(options.pan) && number$1(options.pan.y) ? options.pan.y : 0 + }, + animation: { + // object for currently-running animations + current: [], + queue: [] + }, + hasCompoundNodes: false, + multiClickDebounceTime: defVal(250, options.multiClickDebounceTime) + }; + + this.createEmitter(); // set selection type + + this.selectionType(options.selectionType); // init zoom bounds + + this.zoomRange({ + min: options.minZoom, + max: options.maxZoom + }); + + var loadExtData = function loadExtData(extData, next) { + var anyIsPromise = extData.some(promise); + + if (anyIsPromise) { + return Promise$1.all(extData).then(next); // load all data asynchronously, then exec rest of init + } else { + next(extData); // exec synchronously for convenience + } + }; // start with the default stylesheet so we have something before loading an external stylesheet + + + if (_p.styleEnabled) { + cy.setStyle([]); + } // create the renderer + + + var rendererOptions = extend({}, options, options.renderer); // allow rendering hints in top level options + + cy.initRenderer(rendererOptions); + + var setElesAndLayout = function setElesAndLayout(elements, onload, ondone) { + cy.notifications(false); // remove old elements + + var oldEles = cy.mutableElements(); + + if (oldEles.length > 0) { + oldEles.remove(); + } + + if (elements != null) { + if (plainObject(elements) || array(elements)) { + cy.add(elements); + } + } + + cy.one('layoutready', function (e) { + cy.notifications(true); + cy.emit(e); // we missed this event by turning notifications off, so pass it on + + cy.one('load', onload); + cy.emitAndNotify('load'); + }).one('layoutstop', function () { + cy.one('done', ondone); + cy.emit('done'); + }); + var layoutOpts = extend({}, cy._private.options.layout); + layoutOpts.eles = cy.elements(); + cy.layout(layoutOpts).run(); + }; + + loadExtData([options.style, options.elements], function (thens) { + var initStyle = thens[0]; + var initEles = thens[1]; // init style + + if (_p.styleEnabled) { + cy.style().append(initStyle); + } // initial load + + + setElesAndLayout(initEles, function () { + // onready + cy.startAnimationLoop(); + _p.ready = true; // if a ready callback is specified as an option, the bind it + + if (fn$6(options.ready)) { + cy.on('ready', options.ready); + } // bind all the ready handlers registered before creating this instance + + + for (var i = 0; i < readies.length; i++) { + var fn = readies[i]; + cy.on('ready', fn); + } + + if (reg) { + reg.readies = []; + } // clear b/c we've bound them all and don't want to keep it around in case a new core uses the same div etc + + + cy.emit('ready'); + }, options.done); + }); + }; + + var corefn = Core.prototype; // short alias + + extend(corefn, { + instanceString: function instanceString() { + return 'core'; + }, + isReady: function isReady() { + return this._private.ready; + }, + destroyed: function destroyed() { + return this._private.destroyed; + }, + ready: function ready(fn) { + if (this.isReady()) { + this.emitter().emit('ready', [], fn); // just calls fn as though triggered via ready event + } else { + this.on('ready', fn); + } + + return this; + }, + destroy: function destroy() { + var cy = this; + if (cy.destroyed()) return; + cy.stopAnimationLoop(); + cy.destroyRenderer(); + this.emit('destroy'); + cy._private.destroyed = true; + return cy; + }, + hasElementWithId: function hasElementWithId(id) { + return this._private.elements.hasElementWithId(id); + }, + getElementById: function getElementById(id) { + return this._private.elements.getElementById(id); + }, + hasCompoundNodes: function hasCompoundNodes() { + return this._private.hasCompoundNodes; + }, + headless: function headless() { + return this._private.renderer.isHeadless(); + }, + styleEnabled: function styleEnabled() { + return this._private.styleEnabled; + }, + addToPool: function addToPool(eles) { + this._private.elements.merge(eles); + + return this; // chaining + }, + removeFromPool: function removeFromPool(eles) { + this._private.elements.unmerge(eles); + + return this; + }, + container: function container() { + return this._private.container || null; + }, + window: function window() { + var container = this._private.container; + if (container == null) return _window; + var ownerDocument = this._private.container.ownerDocument; + + if (ownerDocument === undefined || ownerDocument == null) { + return _window; + } + + return ownerDocument.defaultView || _window; + }, + mount: function mount(container) { + if (container == null) { + return; + } + + var cy = this; + var _p = cy._private; + var options = _p.options; + + if (!htmlElement(container) && htmlElement(container[0])) { + container = container[0]; + } + + cy.stopAnimationLoop(); + cy.destroyRenderer(); + _p.container = container; + _p.styleEnabled = true; + cy.invalidateSize(); + cy.initRenderer(extend({}, options, options.renderer, { + // allow custom renderer name to be re-used, otherwise use canvas + name: options.renderer.name === 'null' ? 'canvas' : options.renderer.name + })); + cy.startAnimationLoop(); + cy.style(options.style); + cy.emit('mount'); + return cy; + }, + unmount: function unmount() { + var cy = this; + cy.stopAnimationLoop(); + cy.destroyRenderer(); + cy.initRenderer({ + name: 'null' + }); + cy.emit('unmount'); + return cy; + }, + options: function options() { + return copy(this._private.options); + }, + json: function json(obj) { + var cy = this; + var _p = cy._private; + var eles = cy.mutableElements(); + + var getFreshRef = function getFreshRef(ele) { + return cy.getElementById(ele.id()); + }; + + if (plainObject(obj)) { + // set + cy.startBatch(); + + if (obj.elements) { + var idInJson = {}; + + var updateEles = function updateEles(jsons, gr) { + var toAdd = []; + var toMod = []; + + for (var i = 0; i < jsons.length; i++) { + var json = jsons[i]; + + if (!json.data.id) { + warn('cy.json() cannot handle elements without an ID attribute'); + continue; + } + + var id = '' + json.data.id; // id must be string + + var ele = cy.getElementById(id); + idInJson[id] = true; + + if (ele.length !== 0) { + // existing element should be updated + toMod.push({ + ele: ele, + json: json + }); + } else { + // otherwise should be added + if (gr) { + json.group = gr; + toAdd.push(json); + } else { + toAdd.push(json); + } + } + } + + cy.add(toAdd); + + for (var _i = 0; _i < toMod.length; _i++) { + var _toMod$_i = toMod[_i], + _ele = _toMod$_i.ele, + _json = _toMod$_i.json; + + _ele.json(_json); + } + }; + + if (array(obj.elements)) { + // elements: [] + updateEles(obj.elements); + } else { + // elements: { nodes: [], edges: [] } + var grs = ['nodes', 'edges']; + + for (var i = 0; i < grs.length; i++) { + var gr = grs[i]; + var elements = obj.elements[gr]; + + if (array(elements)) { + updateEles(elements, gr); + } + } + } + + var parentsToRemove = cy.collection(); + eles.filter(function (ele) { + return !idInJson[ele.id()]; + }).forEach(function (ele) { + if (ele.isParent()) { + parentsToRemove.merge(ele); + } else { + ele.remove(); + } + }); // so that children are not removed w/parent + + parentsToRemove.forEach(function (ele) { + return ele.children().move({ + parent: null + }); + }); // intermediate parents may be moved by prior line, so make sure we remove by fresh refs + + parentsToRemove.forEach(function (ele) { + return getFreshRef(ele).remove(); + }); + } + + if (obj.style) { + cy.style(obj.style); + } + + if (obj.zoom != null && obj.zoom !== _p.zoom) { + cy.zoom(obj.zoom); + } + + if (obj.pan) { + if (obj.pan.x !== _p.pan.x || obj.pan.y !== _p.pan.y) { + cy.pan(obj.pan); + } + } + + if (obj.data) { + cy.data(obj.data); + } + + var fields = ['minZoom', 'maxZoom', 'zoomingEnabled', 'userZoomingEnabled', 'panningEnabled', 'userPanningEnabled', 'boxSelectionEnabled', 'autolock', 'autoungrabify', 'autounselectify', 'multiClickDebounceTime']; + + for (var _i2 = 0; _i2 < fields.length; _i2++) { + var f = fields[_i2]; + + if (obj[f] != null) { + cy[f](obj[f]); + } + } + + cy.endBatch(); + return this; // chaining + } else { + // get + var flat = !!obj; + var json = {}; + + if (flat) { + json.elements = this.elements().map(function (ele) { + return ele.json(); + }); + } else { + json.elements = {}; + eles.forEach(function (ele) { + var group = ele.group(); + + if (!json.elements[group]) { + json.elements[group] = []; + } + + json.elements[group].push(ele.json()); + }); + } + + if (this._private.styleEnabled) { + json.style = cy.style().json(); + } + + json.data = copy(cy.data()); + var options = _p.options; + json.zoomingEnabled = _p.zoomingEnabled; + json.userZoomingEnabled = _p.userZoomingEnabled; + json.zoom = _p.zoom; + json.minZoom = _p.minZoom; + json.maxZoom = _p.maxZoom; + json.panningEnabled = _p.panningEnabled; + json.userPanningEnabled = _p.userPanningEnabled; + json.pan = copy(_p.pan); + json.boxSelectionEnabled = _p.boxSelectionEnabled; + json.renderer = copy(options.renderer); + json.hideEdgesOnViewport = options.hideEdgesOnViewport; + json.textureOnViewport = options.textureOnViewport; + json.wheelSensitivity = options.wheelSensitivity; + json.motionBlur = options.motionBlur; + json.multiClickDebounceTime = options.multiClickDebounceTime; + return json; + } + } + }); + corefn.$id = corefn.getElementById; + [corefn$9, corefn$8, elesfn, corefn$7, corefn$6, corefn$5, corefn$4, corefn$3, corefn$2, corefn$1, fn].forEach(function (props) { + extend(corefn, props); + }); + + /* eslint-disable no-unused-vars */ + + var defaults$7 = { + fit: true, + // whether to fit the viewport to the graph + directed: false, + // whether the tree is directed downwards (or edges can point in any direction if false) + padding: 30, + // padding on fit + circle: false, + // put depths in concentric circles if true, put depths top down if false + grid: false, + // whether to create an even grid into which the DAG is placed (circle:false only) + spacingFactor: 1.75, + // positive spacing factor, larger => more space between nodes (N.B. n/a if causes overlap) + boundingBox: undefined, + // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h } + avoidOverlap: true, + // prevents node overlap, may overflow boundingBox if not enough space + nodeDimensionsIncludeLabels: false, + // Excludes the label when calculating node bounding boxes for the layout algorithm + roots: undefined, + // the roots of the trees + depthSort: undefined, + // a sorting function to order nodes at equal depth. e.g. function(a, b){ return a.data('weight') - b.data('weight') } + animate: false, + // whether to transition the node positions + animationDuration: 500, + // duration of animation in ms if enabled + animationEasing: undefined, + // easing of animation if enabled, + animateFilter: function animateFilter(node, i) { + return true; + }, + // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts + ready: undefined, + // callback on layoutready + stop: undefined, + // callback on layoutstop + transform: function transform(node, position) { + return position; + } // transform a given node position. Useful for changing flow direction in discrete layouts + + }; + var deprecatedOptionDefaults = { + maximal: false, + // whether to shift nodes down their natural BFS depths in order to avoid upwards edges (DAGS only); setting acyclic to true sets maximal to true also + acyclic: false // whether the tree is acyclic and thus a node could be shifted (due to the maximal option) multiple times without causing an infinite loop; setting to true sets maximal to true also; if you are uncertain whether a tree is acyclic, set to false to avoid potential infinite loops + + }; + /* eslint-enable */ + + var getInfo = function getInfo(ele) { + return ele.scratch('breadthfirst'); + }; + + var setInfo = function setInfo(ele, obj) { + return ele.scratch('breadthfirst', obj); + }; + + function BreadthFirstLayout(options) { + this.options = extend({}, defaults$7, deprecatedOptionDefaults, options); + } + + BreadthFirstLayout.prototype.run = function () { + var params = this.options; + var options = params; + var cy = params.cy; + var eles = options.eles; + var nodes = eles.nodes().filter(function (n) { + return !n.isParent(); + }); + var graph = eles; + var directed = options.directed; + var maximal = options.acyclic || options.maximal || options.maximalAdjustments > 0; // maximalAdjustments for compat. w/ old code; also, setting acyclic to true sets maximal to true + + var bb = makeBoundingBox(options.boundingBox ? options.boundingBox : { + x1: 0, + y1: 0, + w: cy.width(), + h: cy.height() + }); + var roots; + + if (elementOrCollection(options.roots)) { + roots = options.roots; + } else if (array(options.roots)) { + var rootsArray = []; + + for (var i = 0; i < options.roots.length; i++) { + var id = options.roots[i]; + var ele = cy.getElementById(id); + rootsArray.push(ele); + } + + roots = cy.collection(rootsArray); + } else if (string(options.roots)) { + roots = cy.$(options.roots); + } else { + if (directed) { + roots = nodes.roots(); + } else { + var components = eles.components(); + roots = cy.collection(); + + var _loop = function _loop(_i) { + var comp = components[_i]; + var maxDegree = comp.maxDegree(false); + var compRoots = comp.filter(function (ele) { + return ele.degree(false) === maxDegree; + }); + roots = roots.add(compRoots); + }; + + for (var _i = 0; _i < components.length; _i++) { + _loop(_i); + } + } + } + + var depths = []; + var foundByBfs = {}; + + var addToDepth = function addToDepth(ele, d) { + if (depths[d] == null) { + depths[d] = []; + } + + var i = depths[d].length; + depths[d].push(ele); + setInfo(ele, { + index: i, + depth: d + }); + }; + + var changeDepth = function changeDepth(ele, newDepth) { + var _getInfo = getInfo(ele), + depth = _getInfo.depth, + index = _getInfo.index; + + depths[depth][index] = null; + addToDepth(ele, newDepth); + }; // find the depths of the nodes + + + graph.bfs({ + roots: roots, + directed: options.directed, + visit: function visit(node, edge, pNode, i, depth) { + var ele = node[0]; + var id = ele.id(); + addToDepth(ele, depth); + foundByBfs[id] = true; + } + }); // check for nodes not found by bfs + + var orphanNodes = []; + + for (var _i2 = 0; _i2 < nodes.length; _i2++) { + var _ele = nodes[_i2]; + + if (foundByBfs[_ele.id()]) { + continue; + } else { + orphanNodes.push(_ele); + } + } // assign the nodes a depth and index + + + var assignDepthsAt = function assignDepthsAt(i) { + var eles = depths[i]; + + for (var j = 0; j < eles.length; j++) { + var _ele2 = eles[j]; + + if (_ele2 == null) { + eles.splice(j, 1); + j--; + continue; + } + + setInfo(_ele2, { + depth: i, + index: j + }); + } + }; + + var assignDepths = function assignDepths() { + for (var _i3 = 0; _i3 < depths.length; _i3++) { + assignDepthsAt(_i3); + } + }; + + var adjustMaximally = function adjustMaximally(ele, shifted) { + var eInfo = getInfo(ele); + var incomers = ele.incomers().filter(function (el) { + return el.isNode() && eles.has(el); + }); + var maxDepth = -1; + var id = ele.id(); + + for (var k = 0; k < incomers.length; k++) { + var incmr = incomers[k]; + var iInfo = getInfo(incmr); + maxDepth = Math.max(maxDepth, iInfo.depth); + } + + if (eInfo.depth <= maxDepth) { + if (!options.acyclic && shifted[id]) { + return null; + } + + var newDepth = maxDepth + 1; + changeDepth(ele, newDepth); + shifted[id] = newDepth; + return true; + } + + return false; + }; // for the directed case, try to make the edges all go down (i.e. depth i => depth i + 1) + + + if (directed && maximal) { + var Q = []; + var shifted = {}; + + var enqueue = function enqueue(n) { + return Q.push(n); + }; + + var dequeue = function dequeue() { + return Q.shift(); + }; + + nodes.forEach(function (n) { + return Q.push(n); + }); + + while (Q.length > 0) { + var _ele3 = dequeue(); + + var didShift = adjustMaximally(_ele3, shifted); + + if (didShift) { + _ele3.outgoers().filter(function (el) { + return el.isNode() && eles.has(el); + }).forEach(enqueue); + } else if (didShift === null) { + warn('Detected double maximal shift for node `' + _ele3.id() + '`. Bailing maximal adjustment due to cycle. Use `options.maximal: true` only on DAGs.'); + break; // exit on failure + } + } + } + + assignDepths(); // clear holes + // find min distance we need to leave between nodes + + var minDistance = 0; + + if (options.avoidOverlap) { + for (var _i4 = 0; _i4 < nodes.length; _i4++) { + var n = nodes[_i4]; + var nbb = n.layoutDimensions(options); + var w = nbb.w; + var h = nbb.h; + minDistance = Math.max(minDistance, w, h); + } + } // get the weighted percent for an element based on its connectivity to other levels + + + var cachedWeightedPercent = {}; + + var getWeightedPercent = function getWeightedPercent(ele) { + if (cachedWeightedPercent[ele.id()]) { + return cachedWeightedPercent[ele.id()]; + } + + var eleDepth = getInfo(ele).depth; + var neighbors = ele.neighborhood(); + var percent = 0; + var samples = 0; + + for (var _i5 = 0; _i5 < neighbors.length; _i5++) { + var neighbor = neighbors[_i5]; + + if (neighbor.isEdge() || neighbor.isParent() || !nodes.has(neighbor)) { + continue; + } + + var bf = getInfo(neighbor); + + if (bf == null) { + continue; + } + + var index = bf.index; + var depth = bf.depth; // unassigned neighbours shouldn't affect the ordering + + if (index == null || depth == null) { + continue; + } + + var nDepth = depths[depth].length; + + if (depth < eleDepth) { + // only get influenced by elements above + percent += index / nDepth; + samples++; + } + } + + samples = Math.max(1, samples); + percent = percent / samples; + + if (samples === 0) { + // put lone nodes at the start + percent = 0; + } + + cachedWeightedPercent[ele.id()] = percent; + return percent; + }; // rearrange the indices in each depth level based on connectivity + + + var sortFn = function sortFn(a, b) { + var apct = getWeightedPercent(a); + var bpct = getWeightedPercent(b); + var diff = apct - bpct; + + if (diff === 0) { + return ascending(a.id(), b.id()); // make sure sort doesn't have don't-care comparisons + } else { + return diff; + } + }; + + if (options.depthSort !== undefined) { + sortFn = options.depthSort; + } // sort each level to make connected nodes closer + + + for (var _i6 = 0; _i6 < depths.length; _i6++) { + depths[_i6].sort(sortFn); + + assignDepthsAt(_i6); + } // assign orphan nodes to a new top-level depth + + + var orphanDepth = []; + + for (var _i7 = 0; _i7 < orphanNodes.length; _i7++) { + orphanDepth.push(orphanNodes[_i7]); + } + + depths.unshift(orphanDepth); + assignDepths(); + var biggestDepthSize = 0; + + for (var _i8 = 0; _i8 < depths.length; _i8++) { + biggestDepthSize = Math.max(depths[_i8].length, biggestDepthSize); + } + + var center = { + x: bb.x1 + bb.w / 2, + y: bb.x1 + bb.h / 2 + }; + var maxDepthSize = depths.reduce(function (max, eles) { + return Math.max(max, eles.length); + }, 0); + + var getPosition = function getPosition(ele) { + var _getInfo2 = getInfo(ele), + depth = _getInfo2.depth, + index = _getInfo2.index; + + var depthSize = depths[depth].length; + var distanceX = Math.max(bb.w / ((options.grid ? maxDepthSize : depthSize) + 1), minDistance); + var distanceY = Math.max(bb.h / (depths.length + 1), minDistance); + var radiusStepSize = Math.min(bb.w / 2 / depths.length, bb.h / 2 / depths.length); + radiusStepSize = Math.max(radiusStepSize, minDistance); + + if (!options.circle) { + var epos = { + x: center.x + (index + 1 - (depthSize + 1) / 2) * distanceX, + y: (depth + 1) * distanceY + }; + return epos; + } else { + var radius = radiusStepSize * depth + radiusStepSize - (depths.length > 0 && depths[0].length <= 3 ? radiusStepSize / 2 : 0); + var theta = 2 * Math.PI / depths[depth].length * index; + + if (depth === 0 && depths[0].length === 1) { + radius = 1; + } + + return { + x: center.x + radius * Math.cos(theta), + y: center.y + radius * Math.sin(theta) + }; + } + }; + + eles.nodes().layoutPositions(this, options, getPosition); + return this; // chaining + }; + + var defaults$6 = { + fit: true, + // whether to fit the viewport to the graph + padding: 30, + // the padding on fit + boundingBox: undefined, + // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h } + avoidOverlap: true, + // prevents node overlap, may overflow boundingBox and radius if not enough space + nodeDimensionsIncludeLabels: false, + // Excludes the label when calculating node bounding boxes for the layout algorithm + spacingFactor: undefined, + // Applies a multiplicative factor (>0) to expand or compress the overall area that the nodes take up + radius: undefined, + // the radius of the circle + startAngle: 3 / 2 * Math.PI, + // where nodes start in radians + sweep: undefined, + // how many radians should be between the first and last node (defaults to full circle) + clockwise: true, + // whether the layout should go clockwise (true) or counterclockwise/anticlockwise (false) + sort: undefined, + // a sorting function to order the nodes; e.g. function(a, b){ return a.data('weight') - b.data('weight') } + animate: false, + // whether to transition the node positions + animationDuration: 500, + // duration of animation in ms if enabled + animationEasing: undefined, + // easing of animation if enabled + animateFilter: function animateFilter(node, i) { + return true; + }, + // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts + ready: undefined, + // callback on layoutready + stop: undefined, + // callback on layoutstop + transform: function transform(node, position) { + return position; + } // transform a given node position. Useful for changing flow direction in discrete layouts + + }; + + function CircleLayout(options) { + this.options = extend({}, defaults$6, options); + } + + CircleLayout.prototype.run = function () { + var params = this.options; + var options = params; + var cy = params.cy; + var eles = options.eles; + var clockwise = options.counterclockwise !== undefined ? !options.counterclockwise : options.clockwise; + var nodes = eles.nodes().not(':parent'); + + if (options.sort) { + nodes = nodes.sort(options.sort); + } + + var bb = makeBoundingBox(options.boundingBox ? options.boundingBox : { + x1: 0, + y1: 0, + w: cy.width(), + h: cy.height() + }); + var center = { + x: bb.x1 + bb.w / 2, + y: bb.y1 + bb.h / 2 + }; + var sweep = options.sweep === undefined ? 2 * Math.PI - 2 * Math.PI / nodes.length : options.sweep; + var dTheta = sweep / Math.max(1, nodes.length - 1); + var r; + var minDistance = 0; + + for (var i = 0; i < nodes.length; i++) { + var n = nodes[i]; + var nbb = n.layoutDimensions(options); + var w = nbb.w; + var h = nbb.h; + minDistance = Math.max(minDistance, w, h); + } + + if (number$1(options.radius)) { + r = options.radius; + } else if (nodes.length <= 1) { + r = 0; + } else { + r = Math.min(bb.h, bb.w) / 2 - minDistance; + } // calculate the radius + + + if (nodes.length > 1 && options.avoidOverlap) { + // but only if more than one node (can't overlap) + minDistance *= 1.75; // just to have some nice spacing + + var dcos = Math.cos(dTheta) - Math.cos(0); + var dsin = Math.sin(dTheta) - Math.sin(0); + var rMin = Math.sqrt(minDistance * minDistance / (dcos * dcos + dsin * dsin)); // s.t. no nodes overlapping + + r = Math.max(rMin, r); + } + + var getPos = function getPos(ele, i) { + var theta = options.startAngle + i * dTheta * (clockwise ? 1 : -1); + var rx = r * Math.cos(theta); + var ry = r * Math.sin(theta); + var pos = { + x: center.x + rx, + y: center.y + ry + }; + return pos; + }; + + eles.nodes().layoutPositions(this, options, getPos); + return this; // chaining + }; + + var defaults$5 = { + fit: true, + // whether to fit the viewport to the graph + padding: 30, + // the padding on fit + startAngle: 3 / 2 * Math.PI, + // where nodes start in radians + sweep: undefined, + // how many radians should be between the first and last node (defaults to full circle) + clockwise: true, + // whether the layout should go clockwise (true) or counterclockwise/anticlockwise (false) + equidistant: false, + // whether levels have an equal radial distance betwen them, may cause bounding box overflow + minNodeSpacing: 10, + // min spacing between outside of nodes (used for radius adjustment) + boundingBox: undefined, + // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h } + avoidOverlap: true, + // prevents node overlap, may overflow boundingBox if not enough space + nodeDimensionsIncludeLabels: false, + // Excludes the label when calculating node bounding boxes for the layout algorithm + height: undefined, + // height of layout area (overrides container height) + width: undefined, + // width of layout area (overrides container width) + spacingFactor: undefined, + // Applies a multiplicative factor (>0) to expand or compress the overall area that the nodes take up + concentric: function concentric(node) { + // returns numeric value for each node, placing higher nodes in levels towards the centre + return node.degree(); + }, + levelWidth: function levelWidth(nodes) { + // the variation of concentric values in each level + return nodes.maxDegree() / 4; + }, + animate: false, + // whether to transition the node positions + animationDuration: 500, + // duration of animation in ms if enabled + animationEasing: undefined, + // easing of animation if enabled + animateFilter: function animateFilter(node, i) { + return true; + }, + // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts + ready: undefined, + // callback on layoutready + stop: undefined, + // callback on layoutstop + transform: function transform(node, position) { + return position; + } // transform a given node position. Useful for changing flow direction in discrete layouts + + }; + + function ConcentricLayout(options) { + this.options = extend({}, defaults$5, options); + } + + ConcentricLayout.prototype.run = function () { + var params = this.options; + var options = params; + var clockwise = options.counterclockwise !== undefined ? !options.counterclockwise : options.clockwise; + var cy = params.cy; + var eles = options.eles; + var nodes = eles.nodes().not(':parent'); + var bb = makeBoundingBox(options.boundingBox ? options.boundingBox : { + x1: 0, + y1: 0, + w: cy.width(), + h: cy.height() + }); + var center = { + x: bb.x1 + bb.w / 2, + y: bb.y1 + bb.h / 2 + }; + var nodeValues = []; // { node, value } + + var maxNodeSize = 0; + + for (var i = 0; i < nodes.length; i++) { + var node = nodes[i]; + var value = void 0; // calculate the node value + + value = options.concentric(node); + nodeValues.push({ + value: value, + node: node + }); // for style mapping + + node._private.scratch.concentric = value; + } // in case we used the `concentric` in style + + + nodes.updateStyle(); // calculate max size now based on potentially updated mappers + + for (var _i = 0; _i < nodes.length; _i++) { + var _node = nodes[_i]; + + var nbb = _node.layoutDimensions(options); + + maxNodeSize = Math.max(maxNodeSize, nbb.w, nbb.h); + } // sort node values in descreasing order + + + nodeValues.sort(function (a, b) { + return b.value - a.value; + }); + var levelWidth = options.levelWidth(nodes); // put the values into levels + + var levels = [[]]; + var currentLevel = levels[0]; + + for (var _i2 = 0; _i2 < nodeValues.length; _i2++) { + var val = nodeValues[_i2]; + + if (currentLevel.length > 0) { + var diff = Math.abs(currentLevel[0].value - val.value); + + if (diff >= levelWidth) { + currentLevel = []; + levels.push(currentLevel); + } + } + + currentLevel.push(val); + } // create positions from levels + + + var minDist = maxNodeSize + options.minNodeSpacing; // min dist between nodes + + if (!options.avoidOverlap) { + // then strictly constrain to bb + var firstLvlHasMulti = levels.length > 0 && levels[0].length > 1; + var maxR = Math.min(bb.w, bb.h) / 2 - minDist; + var rStep = maxR / (levels.length + firstLvlHasMulti ? 1 : 0); + minDist = Math.min(minDist, rStep); + } // find the metrics for each level + + + var r = 0; + + for (var _i3 = 0; _i3 < levels.length; _i3++) { + var level = levels[_i3]; + var sweep = options.sweep === undefined ? 2 * Math.PI - 2 * Math.PI / level.length : options.sweep; + var dTheta = level.dTheta = sweep / Math.max(1, level.length - 1); // calculate the radius + + if (level.length > 1 && options.avoidOverlap) { + // but only if more than one node (can't overlap) + var dcos = Math.cos(dTheta) - Math.cos(0); + var dsin = Math.sin(dTheta) - Math.sin(0); + var rMin = Math.sqrt(minDist * minDist / (dcos * dcos + dsin * dsin)); // s.t. no nodes overlapping + + r = Math.max(rMin, r); + } + + level.r = r; + r += minDist; + } + + if (options.equidistant) { + var rDeltaMax = 0; + var _r = 0; + + for (var _i4 = 0; _i4 < levels.length; _i4++) { + var _level = levels[_i4]; + var rDelta = _level.r - _r; + rDeltaMax = Math.max(rDeltaMax, rDelta); + } + + _r = 0; + + for (var _i5 = 0; _i5 < levels.length; _i5++) { + var _level2 = levels[_i5]; + + if (_i5 === 0) { + _r = _level2.r; + } + + _level2.r = _r; + _r += rDeltaMax; + } + } // calculate the node positions + + + var pos = {}; // id => position + + for (var _i6 = 0; _i6 < levels.length; _i6++) { + var _level3 = levels[_i6]; + var _dTheta = _level3.dTheta; + var _r2 = _level3.r; + + for (var j = 0; j < _level3.length; j++) { + var _val = _level3[j]; + var theta = options.startAngle + (clockwise ? 1 : -1) * _dTheta * j; + var p = { + x: center.x + _r2 * Math.cos(theta), + y: center.y + _r2 * Math.sin(theta) + }; + pos[_val.node.id()] = p; + } + } // position the nodes + + + eles.nodes().layoutPositions(this, options, function (ele) { + var id = ele.id(); + return pos[id]; + }); + return this; // chaining + }; + + /* + The CoSE layout was written by Gerardo Huck. + https://www.linkedin.com/in/gerardohuck/ + + Based on the following article: + http://dl.acm.org/citation.cfm?id=1498047 + + Modifications tracked on Github. + */ + var DEBUG; + /** + * @brief : default layout options + */ + + var defaults$4 = { + // Called on `layoutready` + ready: function ready() {}, + // Called on `layoutstop` + stop: function stop() {}, + // Whether to animate while running the layout + // true : Animate continuously as the layout is running + // false : Just show the end result + // 'end' : Animate with the end result, from the initial positions to the end positions + animate: true, + // Easing of the animation for animate:'end' + animationEasing: undefined, + // The duration of the animation for animate:'end' + animationDuration: undefined, + // A function that determines whether the node should be animated + // All nodes animated by default on animate enabled + // Non-animated nodes are positioned immediately when the layout starts + animateFilter: function animateFilter(node, i) { + return true; + }, + // The layout animates only after this many milliseconds for animate:true + // (prevents flashing on fast runs) + animationThreshold: 250, + // Number of iterations between consecutive screen positions update + refresh: 20, + // Whether to fit the network view after when done + fit: true, + // Padding on fit + padding: 30, + // Constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h } + boundingBox: undefined, + // Excludes the label when calculating node bounding boxes for the layout algorithm + nodeDimensionsIncludeLabels: false, + // Randomize the initial positions of the nodes (true) or use existing positions (false) + randomize: false, + // Extra spacing between components in non-compound graphs + componentSpacing: 40, + // Node repulsion (non overlapping) multiplier + nodeRepulsion: function nodeRepulsion(node) { + return 2048; + }, + // Node repulsion (overlapping) multiplier + nodeOverlap: 4, + // Ideal edge (non nested) length + idealEdgeLength: function idealEdgeLength(edge) { + return 32; + }, + // Divisor to compute edge forces + edgeElasticity: function edgeElasticity(edge) { + return 32; + }, + // Nesting factor (multiplier) to compute ideal edge length for nested edges + nestingFactor: 1.2, + // Gravity force (constant) + gravity: 1, + // Maximum number of iterations to perform + numIter: 1000, + // Initial temperature (maximum node displacement) + initialTemp: 1000, + // Cooling factor (how the temperature is reduced between consecutive iterations + coolingFactor: 0.99, + // Lower temperature threshold (below this point the layout will end) + minTemp: 1.0 + }; + /** + * @brief : constructor + * @arg options : object containing layout options + */ + + function CoseLayout(options) { + this.options = extend({}, defaults$4, options); + this.options.layout = this; + } + /** + * @brief : runs the layout + */ + + + CoseLayout.prototype.run = function () { + var options = this.options; + var cy = options.cy; + var layout = this; + layout.stopped = false; + + if (options.animate === true || options.animate === false) { + layout.emit({ + type: 'layoutstart', + layout: layout + }); + } // Set DEBUG - Global variable + + + if (true === options.debug) { + DEBUG = true; + } else { + DEBUG = false; + } // Initialize layout info + + + var layoutInfo = createLayoutInfo(cy, layout, options); // Show LayoutInfo contents if debugging + + if (DEBUG) { + printLayoutInfo(layoutInfo); + } // If required, randomize node positions + + + if (options.randomize) { + randomizePositions(layoutInfo); + } + + var startTime = performanceNow(); + + var refresh = function refresh() { + refreshPositions(layoutInfo, cy, options); // Fit the graph if necessary + + if (true === options.fit) { + cy.fit(options.padding); + } + }; + + var mainLoop = function mainLoop(i) { + if (layout.stopped || i >= options.numIter) { + // logDebug("Layout manually stopped. Stopping computation in step " + i); + return false; + } // Do one step in the phisical simulation + + + step(layoutInfo, options); // Update temperature + + layoutInfo.temperature = layoutInfo.temperature * options.coolingFactor; // logDebug("New temperature: " + layoutInfo.temperature); + + if (layoutInfo.temperature < options.minTemp) { + // logDebug("Temperature drop below minimum threshold. Stopping computation in step " + i); + return false; + } + + return true; + }; + + var done = function done() { + if (options.animate === true || options.animate === false) { + refresh(); // Layout has finished + + layout.one('layoutstop', options.stop); + layout.emit({ + type: 'layoutstop', + layout: layout + }); + } else { + var nodes = options.eles.nodes(); + var getScaledPos = getScaleInBoundsFn(layoutInfo, options, nodes); + nodes.layoutPositions(layout, options, getScaledPos); + } + }; + + var i = 0; + var loopRet = true; + + if (options.animate === true) { + var frame = function frame() { + var f = 0; + + while (loopRet && f < options.refresh) { + loopRet = mainLoop(i); + i++; + f++; + } + + if (!loopRet) { + // it's done + separateComponents(layoutInfo, options); + done(); + } else { + var now = performanceNow(); + + if (now - startTime >= options.animationThreshold) { + refresh(); + } + + requestAnimationFrame(frame); + } + }; + + frame(); + } else { + while (loopRet) { + loopRet = mainLoop(i); + i++; + } + + separateComponents(layoutInfo, options); + done(); + } + + return this; // chaining + }; + /** + * @brief : called on continuous layouts to stop them before they finish + */ + + + CoseLayout.prototype.stop = function () { + this.stopped = true; + + if (this.thread) { + this.thread.stop(); + } + + this.emit('layoutstop'); + return this; // chaining + }; + + CoseLayout.prototype.destroy = function () { + if (this.thread) { + this.thread.stop(); + } + + return this; // chaining + }; + /** + * @brief : Creates an object which is contains all the data + * used in the layout process + * @arg cy : cytoscape.js object + * @return : layoutInfo object initialized + */ + + + var createLayoutInfo = function createLayoutInfo(cy, layout, options) { + // Shortcut + var edges = options.eles.edges(); + var nodes = options.eles.nodes(); + var bb = makeBoundingBox(options.boundingBox ? options.boundingBox : { + x1: 0, + y1: 0, + w: cy.width(), + h: cy.height() + }); + var layoutInfo = { + isCompound: cy.hasCompoundNodes(), + layoutNodes: [], + idToIndex: {}, + nodeSize: nodes.size(), + graphSet: [], + indexToGraph: [], + layoutEdges: [], + edgeSize: edges.size(), + temperature: options.initialTemp, + clientWidth: bb.w, + clientHeight: bb.h, + boundingBox: bb + }; + var components = options.eles.components(); + var id2cmptId = {}; + + for (var i = 0; i < components.length; i++) { + var component = components[i]; + + for (var j = 0; j < component.length; j++) { + var node = component[j]; + id2cmptId[node.id()] = i; + } + } // Iterate over all nodes, creating layout nodes + + + for (var i = 0; i < layoutInfo.nodeSize; i++) { + var n = nodes[i]; + var nbb = n.layoutDimensions(options); + var tempNode = {}; + tempNode.isLocked = n.locked(); + tempNode.id = n.data('id'); + tempNode.parentId = n.data('parent'); + tempNode.cmptId = id2cmptId[n.id()]; + tempNode.children = []; + tempNode.positionX = n.position('x'); + tempNode.positionY = n.position('y'); + tempNode.offsetX = 0; + tempNode.offsetY = 0; + tempNode.height = nbb.w; + tempNode.width = nbb.h; + tempNode.maxX = tempNode.positionX + tempNode.width / 2; + tempNode.minX = tempNode.positionX - tempNode.width / 2; + tempNode.maxY = tempNode.positionY + tempNode.height / 2; + tempNode.minY = tempNode.positionY - tempNode.height / 2; + tempNode.padLeft = parseFloat(n.style('padding')); + tempNode.padRight = parseFloat(n.style('padding')); + tempNode.padTop = parseFloat(n.style('padding')); + tempNode.padBottom = parseFloat(n.style('padding')); // forces + + tempNode.nodeRepulsion = fn$6(options.nodeRepulsion) ? options.nodeRepulsion(n) : options.nodeRepulsion; // Add new node + + layoutInfo.layoutNodes.push(tempNode); // Add entry to id-index map + + layoutInfo.idToIndex[tempNode.id] = i; + } // Inline implementation of a queue, used for traversing the graph in BFS order + + + var queue = []; + var start = 0; // Points to the start the queue + + var end = -1; // Points to the end of the queue + + var tempGraph = []; // Second pass to add child information and + // initialize queue for hierarchical traversal + + for (var i = 0; i < layoutInfo.nodeSize; i++) { + var n = layoutInfo.layoutNodes[i]; + var p_id = n.parentId; // Check if node n has a parent node + + if (null != p_id) { + // Add node Id to parent's list of children + layoutInfo.layoutNodes[layoutInfo.idToIndex[p_id]].children.push(n.id); + } else { + // If a node doesn't have a parent, then it's in the root graph + queue[++end] = n.id; + tempGraph.push(n.id); + } + } // Add root graph to graphSet + + + layoutInfo.graphSet.push(tempGraph); // Traverse the graph, level by level, + + while (start <= end) { + // Get the node to visit and remove it from queue + var node_id = queue[start++]; + var node_ix = layoutInfo.idToIndex[node_id]; + var node = layoutInfo.layoutNodes[node_ix]; + var children = node.children; + + if (children.length > 0) { + // Add children nodes as a new graph to graph set + layoutInfo.graphSet.push(children); // Add children to que queue to be visited + + for (var i = 0; i < children.length; i++) { + queue[++end] = children[i]; + } + } + } // Create indexToGraph map + + + for (var i = 0; i < layoutInfo.graphSet.length; i++) { + var graph = layoutInfo.graphSet[i]; + + for (var j = 0; j < graph.length; j++) { + var index = layoutInfo.idToIndex[graph[j]]; + layoutInfo.indexToGraph[index] = i; + } + } // Iterate over all edges, creating Layout Edges + + + for (var i = 0; i < layoutInfo.edgeSize; i++) { + var e = edges[i]; + var tempEdge = {}; + tempEdge.id = e.data('id'); + tempEdge.sourceId = e.data('source'); + tempEdge.targetId = e.data('target'); // Compute ideal length + + var idealLength = fn$6(options.idealEdgeLength) ? options.idealEdgeLength(e) : options.idealEdgeLength; + var elasticity = fn$6(options.edgeElasticity) ? options.edgeElasticity(e) : options.edgeElasticity; // Check if it's an inter graph edge + + var sourceIx = layoutInfo.idToIndex[tempEdge.sourceId]; + var targetIx = layoutInfo.idToIndex[tempEdge.targetId]; + var sourceGraph = layoutInfo.indexToGraph[sourceIx]; + var targetGraph = layoutInfo.indexToGraph[targetIx]; + + if (sourceGraph != targetGraph) { + // Find lowest common graph ancestor + var lca = findLCA(tempEdge.sourceId, tempEdge.targetId, layoutInfo); // Compute sum of node depths, relative to lca graph + + var lcaGraph = layoutInfo.graphSet[lca]; + var depth = 0; // Source depth + + var tempNode = layoutInfo.layoutNodes[sourceIx]; + + while (-1 === lcaGraph.indexOf(tempNode.id)) { + tempNode = layoutInfo.layoutNodes[layoutInfo.idToIndex[tempNode.parentId]]; + depth++; + } // Target depth + + + tempNode = layoutInfo.layoutNodes[targetIx]; + + while (-1 === lcaGraph.indexOf(tempNode.id)) { + tempNode = layoutInfo.layoutNodes[layoutInfo.idToIndex[tempNode.parentId]]; + depth++; + } // logDebug('LCA of nodes ' + tempEdge.sourceId + ' and ' + tempEdge.targetId + + // ". Index: " + lca + " Contents: " + lcaGraph.toString() + + // ". Depth: " + depth); + // Update idealLength + + + idealLength *= depth * options.nestingFactor; + } + + tempEdge.idealLength = idealLength; + tempEdge.elasticity = elasticity; + layoutInfo.layoutEdges.push(tempEdge); + } // Finally, return layoutInfo object + + + return layoutInfo; + }; + /** + * @brief : This function finds the index of the lowest common + * graph ancestor between 2 nodes in the subtree + * (from the graph hierarchy induced tree) whose + * root is graphIx + * + * @arg node1: node1's ID + * @arg node2: node2's ID + * @arg layoutInfo: layoutInfo object + * + */ + + + var findLCA = function findLCA(node1, node2, layoutInfo) { + // Find their common ancester, starting from the root graph + var res = findLCA_aux(node1, node2, 0, layoutInfo); + + if (2 > res.count) { + // If aux function couldn't find the common ancester, + // then it is the root graph + return 0; + } else { + return res.graph; + } + }; + /** + * @brief : Auxiliary function used for LCA computation + * + * @arg node1 : node1's ID + * @arg node2 : node2's ID + * @arg graphIx : subgraph index + * @arg layoutInfo : layoutInfo object + * + * @return : object of the form {count: X, graph: Y}, where: + * X is the number of ancestors (max: 2) found in + * graphIx (and it's subgraphs), + * Y is the graph index of the lowest graph containing + * all X nodes + */ + + + var findLCA_aux = function findLCA_aux(node1, node2, graphIx, layoutInfo) { + var graph = layoutInfo.graphSet[graphIx]; // If both nodes belongs to graphIx + + if (-1 < graph.indexOf(node1) && -1 < graph.indexOf(node2)) { + return { + count: 2, + graph: graphIx + }; + } // Make recursive calls for all subgraphs + + + var c = 0; + + for (var i = 0; i < graph.length; i++) { + var nodeId = graph[i]; + var nodeIx = layoutInfo.idToIndex[nodeId]; + var children = layoutInfo.layoutNodes[nodeIx].children; // If the node has no child, skip it + + if (0 === children.length) { + continue; + } + + var childGraphIx = layoutInfo.indexToGraph[layoutInfo.idToIndex[children[0]]]; + var result = findLCA_aux(node1, node2, childGraphIx, layoutInfo); + + if (0 === result.count) { + // Neither node1 nor node2 are present in this subgraph + continue; + } else if (1 === result.count) { + // One of (node1, node2) is present in this subgraph + c++; + + if (2 === c) { + // We've already found both nodes, no need to keep searching + break; + } + } else { + // Both nodes are present in this subgraph + return result; + } + } + + return { + count: c, + graph: graphIx + }; + }; + /** + * @brief: printsLayoutInfo into js console + * Only used for debbuging + */ + + +var printLayoutInfo; + /** + * @brief : Randomizes the position of all nodes + */ + + + var randomizePositions = function randomizePositions(layoutInfo, cy) { + var width = layoutInfo.clientWidth; + var height = layoutInfo.clientHeight; + + for (var i = 0; i < layoutInfo.nodeSize; i++) { + var n = layoutInfo.layoutNodes[i]; // No need to randomize compound nodes or locked nodes + + if (0 === n.children.length && !n.isLocked) { + n.positionX = Math.random() * width; + n.positionY = Math.random() * height; + } + } + }; + + var getScaleInBoundsFn = function getScaleInBoundsFn(layoutInfo, options, nodes) { + var bb = layoutInfo.boundingBox; + var coseBB = { + x1: Infinity, + x2: -Infinity, + y1: Infinity, + y2: -Infinity + }; + + if (options.boundingBox) { + nodes.forEach(function (node) { + var lnode = layoutInfo.layoutNodes[layoutInfo.idToIndex[node.data('id')]]; + coseBB.x1 = Math.min(coseBB.x1, lnode.positionX); + coseBB.x2 = Math.max(coseBB.x2, lnode.positionX); + coseBB.y1 = Math.min(coseBB.y1, lnode.positionY); + coseBB.y2 = Math.max(coseBB.y2, lnode.positionY); + }); + coseBB.w = coseBB.x2 - coseBB.x1; + coseBB.h = coseBB.y2 - coseBB.y1; + } + + return function (ele, i) { + var lnode = layoutInfo.layoutNodes[layoutInfo.idToIndex[ele.data('id')]]; + + if (options.boundingBox) { + // then add extra bounding box constraint + var pctX = (lnode.positionX - coseBB.x1) / coseBB.w; + var pctY = (lnode.positionY - coseBB.y1) / coseBB.h; + return { + x: bb.x1 + pctX * bb.w, + y: bb.y1 + pctY * bb.h + }; + } else { + return { + x: lnode.positionX, + y: lnode.positionY + }; + } + }; + }; + /** + * @brief : Updates the positions of nodes in the network + * @arg layoutInfo : LayoutInfo object + * @arg cy : Cytoscape object + * @arg options : Layout options + */ + + + var refreshPositions = function refreshPositions(layoutInfo, cy, options) { + // var s = 'Refreshing positions'; + // logDebug(s); + var layout = options.layout; + var nodes = options.eles.nodes(); + var getScaledPos = getScaleInBoundsFn(layoutInfo, options, nodes); + nodes.positions(getScaledPos); // Trigger layoutReady only on first call + + if (true !== layoutInfo.ready) { + // s = 'Triggering layoutready'; + // logDebug(s); + layoutInfo.ready = true; + layout.one('layoutready', options.ready); + layout.emit({ + type: 'layoutready', + layout: this + }); + } + }; + /** + * @brief : Logs a debug message in JS console, if DEBUG is ON + */ + // var logDebug = function(text) { + // if (DEBUG) { + // console.debug(text); + // } + // }; + + /** + * @brief : Performs one iteration of the physical simulation + * @arg layoutInfo : LayoutInfo object already initialized + * @arg cy : Cytoscape object + * @arg options : Layout options + */ + + + var step = function step(layoutInfo, options, _step) { + // var s = "\n\n###############################"; + // s += "\nSTEP: " + step; + // s += "\n###############################\n"; + // logDebug(s); + // Calculate node repulsions + calculateNodeForces(layoutInfo, options); // Calculate edge forces + + calculateEdgeForces(layoutInfo); // Calculate gravity forces + + calculateGravityForces(layoutInfo, options); // Propagate forces from parent to child + + propagateForces(layoutInfo); // Update positions based on calculated forces + + updatePositions(layoutInfo); + }; + /** + * @brief : Computes the node repulsion forces + */ + + + var calculateNodeForces = function calculateNodeForces(layoutInfo, options) { + // Go through each of the graphs in graphSet + // Nodes only repel each other if they belong to the same graph + // var s = 'calculateNodeForces'; + // logDebug(s); + for (var i = 0; i < layoutInfo.graphSet.length; i++) { + var graph = layoutInfo.graphSet[i]; + var numNodes = graph.length; // s = "Set: " + graph.toString(); + // logDebug(s); + // Now get all the pairs of nodes + // Only get each pair once, (A, B) = (B, A) + + for (var j = 0; j < numNodes; j++) { + var node1 = layoutInfo.layoutNodes[layoutInfo.idToIndex[graph[j]]]; + + for (var k = j + 1; k < numNodes; k++) { + var node2 = layoutInfo.layoutNodes[layoutInfo.idToIndex[graph[k]]]; + nodeRepulsion(node1, node2, layoutInfo, options); + } + } + } + }; + + var randomDistance = function randomDistance(max) { + return -max + 2 * max * Math.random(); + }; + /** + * @brief : Compute the node repulsion forces between a pair of nodes + */ + + + var nodeRepulsion = function nodeRepulsion(node1, node2, layoutInfo, options) { + // var s = "Node repulsion. Node1: " + node1.id + " Node2: " + node2.id; + var cmptId1 = node1.cmptId; + var cmptId2 = node2.cmptId; + + if (cmptId1 !== cmptId2 && !layoutInfo.isCompound) { + return; + } // Get direction of line connecting both node centers + + + var directionX = node2.positionX - node1.positionX; + var directionY = node2.positionY - node1.positionY; + var maxRandDist = 1; // s += "\ndirectionX: " + directionX + ", directionY: " + directionY; + // If both centers are the same, apply a random force + + if (0 === directionX && 0 === directionY) { + directionX = randomDistance(maxRandDist); + directionY = randomDistance(maxRandDist); + } + + var overlap = nodesOverlap(node1, node2, directionX, directionY); + + if (overlap > 0) { + // s += "\nNodes DO overlap."; + // s += "\nOverlap: " + overlap; + // If nodes overlap, repulsion force is proportional + // to the overlap + var force = options.nodeOverlap * overlap; // Compute the module and components of the force vector + + var distance = Math.sqrt(directionX * directionX + directionY * directionY); // s += "\nDistance: " + distance; + + var forceX = force * directionX / distance; + var forceY = force * directionY / distance; + } else { + // s += "\nNodes do NOT overlap."; + // If there's no overlap, force is inversely proportional + // to squared distance + // Get clipping points for both nodes + var point1 = findClippingPoint(node1, directionX, directionY); + var point2 = findClippingPoint(node2, -1 * directionX, -1 * directionY); // Use clipping points to compute distance + + var distanceX = point2.x - point1.x; + var distanceY = point2.y - point1.y; + var distanceSqr = distanceX * distanceX + distanceY * distanceY; + var distance = Math.sqrt(distanceSqr); // s += "\nDistance: " + distance; + // Compute the module and components of the force vector + + var force = (node1.nodeRepulsion + node2.nodeRepulsion) / distanceSqr; + var forceX = force * distanceX / distance; + var forceY = force * distanceY / distance; + } // Apply force + + + if (!node1.isLocked) { + node1.offsetX -= forceX; + node1.offsetY -= forceY; + } + + if (!node2.isLocked) { + node2.offsetX += forceX; + node2.offsetY += forceY; + } // s += "\nForceX: " + forceX + " ForceY: " + forceY; + // logDebug(s); + + + return; + }; + /** + * @brief : Determines whether two nodes overlap or not + * @return : Amount of overlapping (0 => no overlap) + */ + + + var nodesOverlap = function nodesOverlap(node1, node2, dX, dY) { + if (dX > 0) { + var overlapX = node1.maxX - node2.minX; + } else { + var overlapX = node2.maxX - node1.minX; + } + + if (dY > 0) { + var overlapY = node1.maxY - node2.minY; + } else { + var overlapY = node2.maxY - node1.minY; + } + + if (overlapX >= 0 && overlapY >= 0) { + return Math.sqrt(overlapX * overlapX + overlapY * overlapY); + } else { + return 0; + } + }; + /** + * @brief : Finds the point in which an edge (direction dX, dY) intersects + * the rectangular bounding box of it's source/target node + */ + + + var findClippingPoint = function findClippingPoint(node, dX, dY) { + // Shorcuts + var X = node.positionX; + var Y = node.positionY; + var H = node.height || 1; + var W = node.width || 1; + var dirSlope = dY / dX; + var nodeSlope = H / W; // var s = 'Computing clipping point of node ' + node.id + + // " . Height: " + H + ", Width: " + W + + // "\nDirection " + dX + ", " + dY; + // + // Compute intersection + + var res = {}; // Case: Vertical direction (up) + + if (0 === dX && 0 < dY) { + res.x = X; // s += "\nUp direction"; + + res.y = Y + H / 2; + return res; + } // Case: Vertical direction (down) + + + if (0 === dX && 0 > dY) { + res.x = X; + res.y = Y + H / 2; // s += "\nDown direction"; + + return res; + } // Case: Intersects the right border + + + if (0 < dX && -1 * nodeSlope <= dirSlope && dirSlope <= nodeSlope) { + res.x = X + W / 2; + res.y = Y + W * dY / 2 / dX; // s += "\nRightborder"; + + return res; + } // Case: Intersects the left border + + + if (0 > dX && -1 * nodeSlope <= dirSlope && dirSlope <= nodeSlope) { + res.x = X - W / 2; + res.y = Y - W * dY / 2 / dX; // s += "\nLeftborder"; + + return res; + } // Case: Intersects the top border + + + if (0 < dY && (dirSlope <= -1 * nodeSlope || dirSlope >= nodeSlope)) { + res.x = X + H * dX / 2 / dY; + res.y = Y + H / 2; // s += "\nTop border"; + + return res; + } // Case: Intersects the bottom border + + + if (0 > dY && (dirSlope <= -1 * nodeSlope || dirSlope >= nodeSlope)) { + res.x = X - H * dX / 2 / dY; + res.y = Y - H / 2; // s += "\nBottom border"; + + return res; + } // s += "\nClipping point found at " + res.x + ", " + res.y; + // logDebug(s); + + + return res; + }; + /** + * @brief : Calculates all edge forces + */ + + + var calculateEdgeForces = function calculateEdgeForces(layoutInfo, options) { + // Iterate over all edges + for (var i = 0; i < layoutInfo.edgeSize; i++) { + // Get edge, source & target nodes + var edge = layoutInfo.layoutEdges[i]; + var sourceIx = layoutInfo.idToIndex[edge.sourceId]; + var source = layoutInfo.layoutNodes[sourceIx]; + var targetIx = layoutInfo.idToIndex[edge.targetId]; + var target = layoutInfo.layoutNodes[targetIx]; // Get direction of line connecting both node centers + + var directionX = target.positionX - source.positionX; + var directionY = target.positionY - source.positionY; // If both centers are the same, do nothing. + // A random force has already been applied as node repulsion + + if (0 === directionX && 0 === directionY) { + continue; + } // Get clipping points for both nodes + + + var point1 = findClippingPoint(source, directionX, directionY); + var point2 = findClippingPoint(target, -1 * directionX, -1 * directionY); + var lx = point2.x - point1.x; + var ly = point2.y - point1.y; + var l = Math.sqrt(lx * lx + ly * ly); + var force = Math.pow(edge.idealLength - l, 2) / edge.elasticity; + + if (0 !== l) { + var forceX = force * lx / l; + var forceY = force * ly / l; + } else { + var forceX = 0; + var forceY = 0; + } // Add this force to target and source nodes + + + if (!source.isLocked) { + source.offsetX += forceX; + source.offsetY += forceY; + } + + if (!target.isLocked) { + target.offsetX -= forceX; + target.offsetY -= forceY; + } // var s = 'Edge force between nodes ' + source.id + ' and ' + target.id; + // s += "\nDistance: " + l + " Force: (" + forceX + ", " + forceY + ")"; + // logDebug(s); + + } + }; + /** + * @brief : Computes gravity forces for all nodes + */ + + + var calculateGravityForces = function calculateGravityForces(layoutInfo, options) { + if (options.gravity === 0) { + return; + } + + var distThreshold = 1; // var s = 'calculateGravityForces'; + // logDebug(s); + + for (var i = 0; i < layoutInfo.graphSet.length; i++) { + var graph = layoutInfo.graphSet[i]; + var numNodes = graph.length; // s = "Set: " + graph.toString(); + // logDebug(s); + // Compute graph center + + if (0 === i) { + var centerX = layoutInfo.clientHeight / 2; + var centerY = layoutInfo.clientWidth / 2; + } else { + // Get Parent node for this graph, and use its position as center + var temp = layoutInfo.layoutNodes[layoutInfo.idToIndex[graph[0]]]; + var parent = layoutInfo.layoutNodes[layoutInfo.idToIndex[temp.parentId]]; + var centerX = parent.positionX; + var centerY = parent.positionY; + } // s = "Center found at: " + centerX + ", " + centerY; + // logDebug(s); + // Apply force to all nodes in graph + + + for (var j = 0; j < numNodes; j++) { + var node = layoutInfo.layoutNodes[layoutInfo.idToIndex[graph[j]]]; // s = "Node: " + node.id; + + if (node.isLocked) { + continue; + } + + var dx = centerX - node.positionX; + var dy = centerY - node.positionY; + var d = Math.sqrt(dx * dx + dy * dy); + + if (d > distThreshold) { + var fx = options.gravity * dx / d; + var fy = options.gravity * dy / d; + node.offsetX += fx; + node.offsetY += fy; // s += ": Applied force: " + fx + ", " + fy; + } // logDebug(s); + + } + } + }; + /** + * @brief : This function propagates the existing offsets from + * parent nodes to its descendents. + * @arg layoutInfo : layoutInfo Object + * @arg cy : cytoscape Object + * @arg options : Layout options + */ + + + var propagateForces = function propagateForces(layoutInfo, options) { + // Inline implementation of a queue, used for traversing the graph in BFS order + var queue = []; + var start = 0; // Points to the start the queue + + var end = -1; // Points to the end of the queue + // logDebug('propagateForces'); + // Start by visiting the nodes in the root graph + + queue.push.apply(queue, layoutInfo.graphSet[0]); + end += layoutInfo.graphSet[0].length; // Traverse the graph, level by level, + + while (start <= end) { + // Get the node to visit and remove it from queue + var nodeId = queue[start++]; + var nodeIndex = layoutInfo.idToIndex[nodeId]; + var node = layoutInfo.layoutNodes[nodeIndex]; + var children = node.children; // We only need to process the node if it's compound + + if (0 < children.length && !node.isLocked) { + var offX = node.offsetX; + var offY = node.offsetY; // var s = "Propagating offset from parent node : " + node.id + + // ". OffsetX: " + offX + ". OffsetY: " + offY; + // s += "\n Children: " + children.toString(); + // logDebug(s); + + for (var i = 0; i < children.length; i++) { + var childNode = layoutInfo.layoutNodes[layoutInfo.idToIndex[children[i]]]; // Propagate offset + + childNode.offsetX += offX; + childNode.offsetY += offY; // Add children to queue to be visited + + queue[++end] = children[i]; + } // Reset parent offsets + + + node.offsetX = 0; + node.offsetY = 0; + } + } + }; + /** + * @brief : Updates the layout model positions, based on + * the accumulated forces + */ + + + var updatePositions = function updatePositions(layoutInfo, options) { + // var s = 'Updating positions'; + // logDebug(s); + // Reset boundaries for compound nodes + for (var i = 0; i < layoutInfo.nodeSize; i++) { + var n = layoutInfo.layoutNodes[i]; + + if (0 < n.children.length) { + // logDebug("Resetting boundaries of compound node: " + n.id); + n.maxX = undefined; + n.minX = undefined; + n.maxY = undefined; + n.minY = undefined; + } + } + + for (var i = 0; i < layoutInfo.nodeSize; i++) { + var n = layoutInfo.layoutNodes[i]; + + if (0 < n.children.length || n.isLocked) { + // No need to set compound or locked node position + // logDebug("Skipping position update of node: " + n.id); + continue; + } // s = "Node: " + n.id + " Previous position: (" + + // n.positionX + ", " + n.positionY + ")."; + // Limit displacement in order to improve stability + + + var tempForce = limitForce(n.offsetX, n.offsetY, layoutInfo.temperature); + n.positionX += tempForce.x; + n.positionY += tempForce.y; + n.offsetX = 0; + n.offsetY = 0; + n.minX = n.positionX - n.width; + n.maxX = n.positionX + n.width; + n.minY = n.positionY - n.height; + n.maxY = n.positionY + n.height; // s += " New Position: (" + n.positionX + ", " + n.positionY + ")."; + // logDebug(s); + // Update ancestry boudaries + + updateAncestryBoundaries(n, layoutInfo); + } // Update size, position of compund nodes + + + for (var i = 0; i < layoutInfo.nodeSize; i++) { + var n = layoutInfo.layoutNodes[i]; + + if (0 < n.children.length && !n.isLocked) { + n.positionX = (n.maxX + n.minX) / 2; + n.positionY = (n.maxY + n.minY) / 2; + n.width = n.maxX - n.minX; + n.height = n.maxY - n.minY; // s = "Updating position, size of compound node " + n.id; + // s += "\nPositionX: " + n.positionX + ", PositionY: " + n.positionY; + // s += "\nWidth: " + n.width + ", Height: " + n.height; + // logDebug(s); + } + } + }; + /** + * @brief : Limits a force (forceX, forceY) to be not + * greater (in modulo) than max. + 8 Preserves force direction. + */ + + + var limitForce = function limitForce(forceX, forceY, max) { + // var s = "Limiting force: (" + forceX + ", " + forceY + "). Max: " + max; + var force = Math.sqrt(forceX * forceX + forceY * forceY); + + if (force > max) { + var res = { + x: max * forceX / force, + y: max * forceY / force + }; + } else { + var res = { + x: forceX, + y: forceY + }; + } // s += ".\nResult: (" + res.x + ", " + res.y + ")"; + // logDebug(s); + + + return res; + }; + /** + * @brief : Function used for keeping track of compound node + * sizes, since they should bound all their subnodes. + */ + + + var updateAncestryBoundaries = function updateAncestryBoundaries(node, layoutInfo) { + // var s = "Propagating new position/size of node " + node.id; + var parentId = node.parentId; + + if (null == parentId) { + // If there's no parent, we are done + // s += ". No parent node."; + // logDebug(s); + return; + } // Get Parent Node + + + var p = layoutInfo.layoutNodes[layoutInfo.idToIndex[parentId]]; + var flag = false; // MaxX + + if (null == p.maxX || node.maxX + p.padRight > p.maxX) { + p.maxX = node.maxX + p.padRight; + flag = true; // s += "\nNew maxX for parent node " + p.id + ": " + p.maxX; + } // MinX + + + if (null == p.minX || node.minX - p.padLeft < p.minX) { + p.minX = node.minX - p.padLeft; + flag = true; // s += "\nNew minX for parent node " + p.id + ": " + p.minX; + } // MaxY + + + if (null == p.maxY || node.maxY + p.padBottom > p.maxY) { + p.maxY = node.maxY + p.padBottom; + flag = true; // s += "\nNew maxY for parent node " + p.id + ": " + p.maxY; + } // MinY + + + if (null == p.minY || node.minY - p.padTop < p.minY) { + p.minY = node.minY - p.padTop; + flag = true; // s += "\nNew minY for parent node " + p.id + ": " + p.minY; + } // If updated boundaries, propagate changes upward + + + if (flag) { + // logDebug(s); + return updateAncestryBoundaries(p, layoutInfo); + } // s += ". No changes in boundaries/position of parent node " + p.id; + // logDebug(s); + + + return; + }; + + var separateComponents = function separateComponents(layoutInfo, options) { + var nodes = layoutInfo.layoutNodes; + var components = []; + + for (var i = 0; i < nodes.length; i++) { + var node = nodes[i]; + var cid = node.cmptId; + var component = components[cid] = components[cid] || []; + component.push(node); + } + + var totalA = 0; + + for (var i = 0; i < components.length; i++) { + var c = components[i]; + + if (!c) { + continue; + } + + c.x1 = Infinity; + c.x2 = -Infinity; + c.y1 = Infinity; + c.y2 = -Infinity; + + for (var j = 0; j < c.length; j++) { + var n = c[j]; + c.x1 = Math.min(c.x1, n.positionX - n.width / 2); + c.x2 = Math.max(c.x2, n.positionX + n.width / 2); + c.y1 = Math.min(c.y1, n.positionY - n.height / 2); + c.y2 = Math.max(c.y2, n.positionY + n.height / 2); + } + + c.w = c.x2 - c.x1; + c.h = c.y2 - c.y1; + totalA += c.w * c.h; + } + + components.sort(function (c1, c2) { + return c2.w * c2.h - c1.w * c1.h; + }); + var x = 0; + var y = 0; + var usedW = 0; + var rowH = 0; + var maxRowW = Math.sqrt(totalA) * layoutInfo.clientWidth / layoutInfo.clientHeight; + + for (var i = 0; i < components.length; i++) { + var c = components[i]; + + if (!c) { + continue; + } + + for (var j = 0; j < c.length; j++) { + var n = c[j]; + + if (!n.isLocked) { + n.positionX += x - c.x1; + n.positionY += y - c.y1; + } + } + + x += c.w + options.componentSpacing; + usedW += c.w + options.componentSpacing; + rowH = Math.max(rowH, c.h); + + if (usedW > maxRowW) { + y += rowH + options.componentSpacing; + x = 0; + usedW = 0; + rowH = 0; + } + } + }; + + var defaults$3 = { + fit: true, + // whether to fit the viewport to the graph + padding: 30, + // padding used on fit + boundingBox: undefined, + // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h } + avoidOverlap: true, + // prevents node overlap, may overflow boundingBox if not enough space + avoidOverlapPadding: 10, + // extra spacing around nodes when avoidOverlap: true + nodeDimensionsIncludeLabels: false, + // Excludes the label when calculating node bounding boxes for the layout algorithm + spacingFactor: undefined, + // Applies a multiplicative factor (>0) to expand or compress the overall area that the nodes take up + condense: false, + // uses all available space on false, uses minimal space on true + rows: undefined, + // force num of rows in the grid + cols: undefined, + // force num of columns in the grid + position: function position(node) {}, + // returns { row, col } for element + sort: undefined, + // a sorting function to order the nodes; e.g. function(a, b){ return a.data('weight') - b.data('weight') } + animate: false, + // whether to transition the node positions + animationDuration: 500, + // duration of animation in ms if enabled + animationEasing: undefined, + // easing of animation if enabled + animateFilter: function animateFilter(node, i) { + return true; + }, + // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts + ready: undefined, + // callback on layoutready + stop: undefined, + // callback on layoutstop + transform: function transform(node, position) { + return position; + } // transform a given node position. Useful for changing flow direction in discrete layouts + + }; + + function GridLayout(options) { + this.options = extend({}, defaults$3, options); + } + + GridLayout.prototype.run = function () { + var params = this.options; + var options = params; + var cy = params.cy; + var eles = options.eles; + var nodes = eles.nodes().not(':parent'); + + if (options.sort) { + nodes = nodes.sort(options.sort); + } + + var bb = makeBoundingBox(options.boundingBox ? options.boundingBox : { + x1: 0, + y1: 0, + w: cy.width(), + h: cy.height() + }); + + if (bb.h === 0 || bb.w === 0) { + eles.nodes().layoutPositions(this, options, function (ele) { + return { + x: bb.x1, + y: bb.y1 + }; + }); + } else { + // width/height * splits^2 = cells where splits is number of times to split width + var cells = nodes.size(); + var splits = Math.sqrt(cells * bb.h / bb.w); + var rows = Math.round(splits); + var cols = Math.round(bb.w / bb.h * splits); + + var small = function small(val) { + if (val == null) { + return Math.min(rows, cols); + } else { + var min = Math.min(rows, cols); + + if (min == rows) { + rows = val; + } else { + cols = val; + } + } + }; + + var large = function large(val) { + if (val == null) { + return Math.max(rows, cols); + } else { + var max = Math.max(rows, cols); + + if (max == rows) { + rows = val; + } else { + cols = val; + } + } + }; + + var oRows = options.rows; + var oCols = options.cols != null ? options.cols : options.columns; // if rows or columns were set in options, use those values + + if (oRows != null && oCols != null) { + rows = oRows; + cols = oCols; + } else if (oRows != null && oCols == null) { + rows = oRows; + cols = Math.ceil(cells / rows); + } else if (oRows == null && oCols != null) { + cols = oCols; + rows = Math.ceil(cells / cols); + } // otherwise use the automatic values and adjust accordingly + // if rounding was up, see if we can reduce rows or columns + else if (cols * rows > cells) { + var sm = small(); + var lg = large(); // reducing the small side takes away the most cells, so try it first + + if ((sm - 1) * lg >= cells) { + small(sm - 1); + } else if ((lg - 1) * sm >= cells) { + large(lg - 1); + } + } else { + // if rounding was too low, add rows or columns + while (cols * rows < cells) { + var _sm = small(); + + var _lg = large(); // try to add to larger side first (adds less in multiplication) + + + if ((_lg + 1) * _sm >= cells) { + large(_lg + 1); + } else { + small(_sm + 1); + } + } + } + + var cellWidth = bb.w / cols; + var cellHeight = bb.h / rows; + + if (options.condense) { + cellWidth = 0; + cellHeight = 0; + } + + if (options.avoidOverlap) { + for (var i = 0; i < nodes.length; i++) { + var node = nodes[i]; + var pos = node._private.position; + + if (pos.x == null || pos.y == null) { + // for bb + pos.x = 0; + pos.y = 0; + } + + var nbb = node.layoutDimensions(options); + var p = options.avoidOverlapPadding; + var w = nbb.w + p; + var h = nbb.h + p; + cellWidth = Math.max(cellWidth, w); + cellHeight = Math.max(cellHeight, h); + } + } + + var cellUsed = {}; // e.g. 'c-0-2' => true + + var used = function used(row, col) { + return cellUsed['c-' + row + '-' + col] ? true : false; + }; + + var use = function use(row, col) { + cellUsed['c-' + row + '-' + col] = true; + }; // to keep track of current cell position + + + var row = 0; + var col = 0; + + var moveToNextCell = function moveToNextCell() { + col++; + + if (col >= cols) { + col = 0; + row++; + } + }; // get a cache of all the manual positions + + + var id2manPos = {}; + + for (var _i = 0; _i < nodes.length; _i++) { + var _node = nodes[_i]; + var rcPos = options.position(_node); + + if (rcPos && (rcPos.row !== undefined || rcPos.col !== undefined)) { + // must have at least row or col def'd + var _pos = { + row: rcPos.row, + col: rcPos.col + }; + + if (_pos.col === undefined) { + // find unused col + _pos.col = 0; + + while (used(_pos.row, _pos.col)) { + _pos.col++; + } + } else if (_pos.row === undefined) { + // find unused row + _pos.row = 0; + + while (used(_pos.row, _pos.col)) { + _pos.row++; + } + } + + id2manPos[_node.id()] = _pos; + use(_pos.row, _pos.col); + } + } + + var getPos = function getPos(element, i) { + var x, y; + + if (element.locked() || element.isParent()) { + return false; + } // see if we have a manual position set + + + var rcPos = id2manPos[element.id()]; + + if (rcPos) { + x = rcPos.col * cellWidth + cellWidth / 2 + bb.x1; + y = rcPos.row * cellHeight + cellHeight / 2 + bb.y1; + } else { + // otherwise set automatically + while (used(row, col)) { + moveToNextCell(); + } + + x = col * cellWidth + cellWidth / 2 + bb.x1; + y = row * cellHeight + cellHeight / 2 + bb.y1; + use(row, col); + moveToNextCell(); + } + + return { + x: x, + y: y + }; + }; + + nodes.layoutPositions(this, options, getPos); + } + + return this; // chaining + }; + + var defaults$2 = { + ready: function ready() {}, + // on layoutready + stop: function stop() {} // on layoutstop + + }; // constructor + // options : object containing layout options + + function NullLayout(options) { + this.options = extend({}, defaults$2, options); + } // runs the layout + + + NullLayout.prototype.run = function () { + var options = this.options; + var eles = options.eles; // elements to consider in the layout + + var layout = this; // cy is automatically populated for us in the constructor + // (disable eslint for next line as this serves as example layout code to external developers) + // eslint-disable-next-line no-unused-vars + + options.cy; + layout.emit('layoutstart'); // puts all nodes at (0, 0) + // n.b. most layouts would use layoutPositions(), instead of positions() and manual events + + eles.nodes().positions(function () { + return { + x: 0, + y: 0 + }; + }); // trigger layoutready when each node has had its position set at least once + + layout.one('layoutready', options.ready); + layout.emit('layoutready'); // trigger layoutstop when the layout stops (e.g. finishes) + + layout.one('layoutstop', options.stop); + layout.emit('layoutstop'); + return this; // chaining + }; // called on continuous layouts to stop them before they finish + + + NullLayout.prototype.stop = function () { + return this; // chaining + }; + + var defaults$1 = { + positions: undefined, + // map of (node id) => (position obj); or function(node){ return somPos; } + zoom: undefined, + // the zoom level to set (prob want fit = false if set) + pan: undefined, + // the pan level to set (prob want fit = false if set) + fit: true, + // whether to fit to viewport + padding: 30, + // padding on fit + animate: false, + // whether to transition the node positions + animationDuration: 500, + // duration of animation in ms if enabled + animationEasing: undefined, + // easing of animation if enabled + animateFilter: function animateFilter(node, i) { + return true; + }, + // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts + ready: undefined, + // callback on layoutready + stop: undefined, + // callback on layoutstop + transform: function transform(node, position) { + return position; + } // transform a given node position. Useful for changing flow direction in discrete layouts + + }; + + function PresetLayout(options) { + this.options = extend({}, defaults$1, options); + } + + PresetLayout.prototype.run = function () { + var options = this.options; + var eles = options.eles; + var nodes = eles.nodes(); + var posIsFn = fn$6(options.positions); + + function getPosition(node) { + if (options.positions == null) { + return copyPosition(node.position()); + } + + if (posIsFn) { + return options.positions(node); + } + + var pos = options.positions[node._private.data.id]; + + if (pos == null) { + return null; + } + + return pos; + } + + nodes.layoutPositions(this, options, function (node, i) { + var position = getPosition(node); + + if (node.locked() || position == null) { + return false; + } + + return position; + }); + return this; // chaining + }; + + var defaults = { + fit: true, + // whether to fit to viewport + padding: 30, + // fit padding + boundingBox: undefined, + // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h } + animate: false, + // whether to transition the node positions + animationDuration: 500, + // duration of animation in ms if enabled + animationEasing: undefined, + // easing of animation if enabled + animateFilter: function animateFilter(node, i) { + return true; + }, + // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts + ready: undefined, + // callback on layoutready + stop: undefined, + // callback on layoutstop + transform: function transform(node, position) { + return position; + } // transform a given node position. Useful for changing flow direction in discrete layouts + + }; + + function RandomLayout(options) { + this.options = extend({}, defaults, options); + } + + RandomLayout.prototype.run = function () { + var options = this.options; + var cy = options.cy; + var eles = options.eles; + var bb = makeBoundingBox(options.boundingBox ? options.boundingBox : { + x1: 0, + y1: 0, + w: cy.width(), + h: cy.height() + }); + + var getPos = function getPos(node, i) { + return { + x: bb.x1 + Math.round(Math.random() * bb.w), + y: bb.y1 + Math.round(Math.random() * bb.h) + }; + }; + + eles.nodes().layoutPositions(this, options, getPos); + return this; // chaining + }; + + var layout = [{ + name: 'breadthfirst', + impl: BreadthFirstLayout + }, { + name: 'circle', + impl: CircleLayout + }, { + name: 'concentric', + impl: ConcentricLayout + }, { + name: 'cose', + impl: CoseLayout + }, { + name: 'grid', + impl: GridLayout + }, { + name: 'null', + impl: NullLayout + }, { + name: 'preset', + impl: PresetLayout + }, { + name: 'random', + impl: RandomLayout + }]; + + function NullRenderer(options) { + this.options = options; + this.notifications = 0; // for testing + } + + var noop = function noop() {}; + + var throwImgErr = function throwImgErr() { + throw new Error('A headless instance can not render images'); + }; + + NullRenderer.prototype = { + recalculateRenderedStyle: noop, + notify: function notify() { + this.notifications++; + }, + init: noop, + isHeadless: function isHeadless() { + return true; + }, + png: throwImgErr, + jpg: throwImgErr + }; + + var BRp$f = {}; + BRp$f.arrowShapeWidth = 0.3; + + BRp$f.registerArrowShapes = function () { + var arrowShapes = this.arrowShapes = {}; + var renderer = this; // Contract for arrow shapes: + // 0, 0 is arrow tip + // (0, 1) is direction towards node + // (1, 0) is right + // + // functional api: + // collide: check x, y in shape + // roughCollide: called before collide, no false negatives + // draw: draw + // spacing: dist(arrowTip, nodeBoundary) + // gap: dist(edgeTip, nodeBoundary), edgeTip may != arrowTip + + var bbCollide = function bbCollide(x, y, size, angle, translation, edgeWidth, padding) { + var x1 = translation.x - size / 2 - padding; + var x2 = translation.x + size / 2 + padding; + var y1 = translation.y - size / 2 - padding; + var y2 = translation.y + size / 2 + padding; + var inside = x1 <= x && x <= x2 && y1 <= y && y <= y2; + return inside; + }; + + var transform = function transform(x, y, size, angle, translation) { + var xRotated = x * Math.cos(angle) - y * Math.sin(angle); + var yRotated = x * Math.sin(angle) + y * Math.cos(angle); + var xScaled = xRotated * size; + var yScaled = yRotated * size; + var xTranslated = xScaled + translation.x; + var yTranslated = yScaled + translation.y; + return { + x: xTranslated, + y: yTranslated + }; + }; + + var transformPoints = function transformPoints(pts, size, angle, translation) { + var retPts = []; + + for (var i = 0; i < pts.length; i += 2) { + var x = pts[i]; + var y = pts[i + 1]; + retPts.push(transform(x, y, size, angle, translation)); + } + + return retPts; + }; + + var pointsToArr = function pointsToArr(pts) { + var ret = []; + + for (var i = 0; i < pts.length; i++) { + var p = pts[i]; + ret.push(p.x, p.y); + } + + return ret; + }; + + var standardGap = function standardGap(edge) { + return edge.pstyle('width').pfValue * edge.pstyle('arrow-scale').pfValue * 2; + }; + + var defineArrowShape = function defineArrowShape(name, defn) { + if (string(defn)) { + defn = arrowShapes[defn]; + } + + arrowShapes[name] = extend({ + name: name, + points: [-0.15, -0.3, 0.15, -0.3, 0.15, 0.3, -0.15, 0.3], + collide: function collide(x, y, size, angle, translation, padding) { + var points = pointsToArr(transformPoints(this.points, size + 2 * padding, angle, translation)); + var inside = pointInsidePolygonPoints(x, y, points); + return inside; + }, + roughCollide: bbCollide, + draw: function draw(context, size, angle, translation) { + var points = transformPoints(this.points, size, angle, translation); + renderer.arrowShapeImpl('polygon')(context, points); + }, + spacing: function spacing(edge) { + return 0; + }, + gap: standardGap + }, defn); + }; + + defineArrowShape('none', { + collide: falsify, + roughCollide: falsify, + draw: noop$1, + spacing: zeroify, + gap: zeroify + }); + defineArrowShape('triangle', { + points: [-0.15, -0.3, 0, 0, 0.15, -0.3] + }); + defineArrowShape('arrow', 'triangle'); + defineArrowShape('triangle-backcurve', { + points: arrowShapes['triangle'].points, + controlPoint: [0, -0.15], + roughCollide: bbCollide, + draw: function draw(context, size, angle, translation, edgeWidth) { + var ptsTrans = transformPoints(this.points, size, angle, translation); + var ctrlPt = this.controlPoint; + var ctrlPtTrans = transform(ctrlPt[0], ctrlPt[1], size, angle, translation); + renderer.arrowShapeImpl(this.name)(context, ptsTrans, ctrlPtTrans); + }, + gap: function gap(edge) { + return standardGap(edge) * 0.8; + } + }); + defineArrowShape('triangle-tee', { + points: [0, 0, 0.15, -0.3, -0.15, -0.3, 0, 0], + pointsTee: [-0.15, -0.4, -0.15, -0.5, 0.15, -0.5, 0.15, -0.4], + collide: function collide(x, y, size, angle, translation, edgeWidth, padding) { + var triPts = pointsToArr(transformPoints(this.points, size + 2 * padding, angle, translation)); + var teePts = pointsToArr(transformPoints(this.pointsTee, size + 2 * padding, angle, translation)); + var inside = pointInsidePolygonPoints(x, y, triPts) || pointInsidePolygonPoints(x, y, teePts); + return inside; + }, + draw: function draw(context, size, angle, translation, edgeWidth) { + var triPts = transformPoints(this.points, size, angle, translation); + var teePts = transformPoints(this.pointsTee, size, angle, translation); + renderer.arrowShapeImpl(this.name)(context, triPts, teePts); + } + }); + defineArrowShape('circle-triangle', { + radius: 0.15, + pointsTr: [0, -0.15, 0.15, -0.45, -0.15, -0.45, 0, -0.15], + collide: function collide(x, y, size, angle, translation, edgeWidth, padding) { + var t = translation; + var circleInside = Math.pow(t.x - x, 2) + Math.pow(t.y - y, 2) <= Math.pow((size + 2 * padding) * this.radius, 2); + var triPts = pointsToArr(transformPoints(this.points, size + 2 * padding, angle, translation)); + return pointInsidePolygonPoints(x, y, triPts) || circleInside; + }, + draw: function draw(context, size, angle, translation, edgeWidth) { + var triPts = transformPoints(this.pointsTr, size, angle, translation); + renderer.arrowShapeImpl(this.name)(context, triPts, translation.x, translation.y, this.radius * size); + }, + spacing: function spacing(edge) { + return renderer.getArrowWidth(edge.pstyle('width').pfValue, edge.pstyle('arrow-scale').value) * this.radius; + } + }); + defineArrowShape('triangle-cross', { + points: [0, 0, 0.15, -0.3, -0.15, -0.3, 0, 0], + baseCrossLinePts: [-0.15, -0.4, // first half of the rectangle + -0.15, -0.4, 0.15, -0.4, // second half of the rectangle + 0.15, -0.4], + crossLinePts: function crossLinePts(size, edgeWidth) { + // shift points so that the distance between the cross points matches edge width + var p = this.baseCrossLinePts.slice(); + var shiftFactor = edgeWidth / size; + var y0 = 3; + var y1 = 5; + p[y0] = p[y0] - shiftFactor; + p[y1] = p[y1] - shiftFactor; + return p; + }, + collide: function collide(x, y, size, angle, translation, edgeWidth, padding) { + var triPts = pointsToArr(transformPoints(this.points, size + 2 * padding, angle, translation)); + var teePts = pointsToArr(transformPoints(this.crossLinePts(size, edgeWidth), size + 2 * padding, angle, translation)); + var inside = pointInsidePolygonPoints(x, y, triPts) || pointInsidePolygonPoints(x, y, teePts); + return inside; + }, + draw: function draw(context, size, angle, translation, edgeWidth) { + var triPts = transformPoints(this.points, size, angle, translation); + var crossLinePts = transformPoints(this.crossLinePts(size, edgeWidth), size, angle, translation); + renderer.arrowShapeImpl(this.name)(context, triPts, crossLinePts); + } + }); + defineArrowShape('vee', { + points: [-0.15, -0.3, 0, 0, 0.15, -0.3, 0, -0.15], + gap: function gap(edge) { + return standardGap(edge) * 0.525; + } + }); + defineArrowShape('circle', { + radius: 0.15, + collide: function collide(x, y, size, angle, translation, edgeWidth, padding) { + var t = translation; + var inside = Math.pow(t.x - x, 2) + Math.pow(t.y - y, 2) <= Math.pow((size + 2 * padding) * this.radius, 2); + return inside; + }, + draw: function draw(context, size, angle, translation, edgeWidth) { + renderer.arrowShapeImpl(this.name)(context, translation.x, translation.y, this.radius * size); + }, + spacing: function spacing(edge) { + return renderer.getArrowWidth(edge.pstyle('width').pfValue, edge.pstyle('arrow-scale').value) * this.radius; + } + }); + defineArrowShape('tee', { + points: [-0.15, 0, -0.15, -0.1, 0.15, -0.1, 0.15, 0], + spacing: function spacing(edge) { + return 1; + }, + gap: function gap(edge) { + return 1; + } + }); + defineArrowShape('square', { + points: [-0.15, 0.00, 0.15, 0.00, 0.15, -0.3, -0.15, -0.3] + }); + defineArrowShape('diamond', { + points: [-0.15, -0.15, 0, -0.3, 0.15, -0.15, 0, 0], + gap: function gap(edge) { + return edge.pstyle('width').pfValue * edge.pstyle('arrow-scale').value; + } + }); + defineArrowShape('chevron', { + points: [0, 0, -0.15, -0.15, -0.1, -0.2, 0, -0.1, 0.1, -0.2, 0.15, -0.15], + gap: function gap(edge) { + return 0.95 * edge.pstyle('width').pfValue * edge.pstyle('arrow-scale').value; + } + }); + }; + + var BRp$e = {}; // Project mouse + + BRp$e.projectIntoViewport = function (clientX, clientY) { + var cy = this.cy; + var offsets = this.findContainerClientCoords(); + var offsetLeft = offsets[0]; + var offsetTop = offsets[1]; + var scale = offsets[4]; + var pan = cy.pan(); + var zoom = cy.zoom(); + var x = ((clientX - offsetLeft) / scale - pan.x) / zoom; + var y = ((clientY - offsetTop) / scale - pan.y) / zoom; + return [x, y]; + }; + + BRp$e.findContainerClientCoords = function () { + if (this.containerBB) { + return this.containerBB; + } + + var container = this.container; + var rect = container.getBoundingClientRect(); + var style = this.cy.window().getComputedStyle(container); + + var styleValue = function styleValue(name) { + return parseFloat(style.getPropertyValue(name)); + }; + + var padding = { + left: styleValue('padding-left'), + right: styleValue('padding-right'), + top: styleValue('padding-top'), + bottom: styleValue('padding-bottom') + }; + var border = { + left: styleValue('border-left-width'), + right: styleValue('border-right-width'), + top: styleValue('border-top-width'), + bottom: styleValue('border-bottom-width') + }; + var clientWidth = container.clientWidth; + var clientHeight = container.clientHeight; + var paddingHor = padding.left + padding.right; + var paddingVer = padding.top + padding.bottom; + var borderHor = border.left + border.right; + var scale = rect.width / (clientWidth + borderHor); + var unscaledW = clientWidth - paddingHor; + var unscaledH = clientHeight - paddingVer; + var left = rect.left + padding.left + border.left; + var top = rect.top + padding.top + border.top; + return this.containerBB = [left, top, unscaledW, unscaledH, scale]; + }; + + BRp$e.invalidateContainerClientCoordsCache = function () { + this.containerBB = null; + }; + + BRp$e.findNearestElement = function (x, y, interactiveElementsOnly, isTouch) { + return this.findNearestElements(x, y, interactiveElementsOnly, isTouch)[0]; + }; + + BRp$e.findNearestElements = function (x, y, interactiveElementsOnly, isTouch) { + var self = this; + var r = this; + var eles = r.getCachedZSortedEles(); + var near = []; // 1 node max, 1 edge max + + var zoom = r.cy.zoom(); + var hasCompounds = r.cy.hasCompoundNodes(); + var edgeThreshold = (isTouch ? 24 : 8) / zoom; + var nodeThreshold = (isTouch ? 8 : 2) / zoom; + var labelThreshold = (isTouch ? 8 : 2) / zoom; + var minSqDist = Infinity; + var nearEdge; + var nearNode; + + if (interactiveElementsOnly) { + eles = eles.interactive; + } + + function addEle(ele, sqDist) { + if (ele.isNode()) { + if (nearNode) { + return; // can't replace node + } else { + nearNode = ele; + near.push(ele); + } + } + + if (ele.isEdge() && (sqDist == null || sqDist < minSqDist)) { + if (nearEdge) { + // then replace existing edge + // can replace only if same z-index + if (nearEdge.pstyle('z-compound-depth').value === ele.pstyle('z-compound-depth').value && nearEdge.pstyle('z-compound-depth').value === ele.pstyle('z-compound-depth').value) { + for (var i = 0; i < near.length; i++) { + if (near[i].isEdge()) { + near[i] = ele; + nearEdge = ele; + minSqDist = sqDist != null ? sqDist : minSqDist; + break; + } + } + } + } else { + near.push(ele); + nearEdge = ele; + minSqDist = sqDist != null ? sqDist : minSqDist; + } + } + } + + function checkNode(node) { + var width = node.outerWidth() + 2 * nodeThreshold; + var height = node.outerHeight() + 2 * nodeThreshold; + var hw = width / 2; + var hh = height / 2; + var pos = node.position(); + + if (pos.x - hw <= x && x <= pos.x + hw // bb check x + && pos.y - hh <= y && y <= pos.y + hh // bb check y + ) { + var shape = r.nodeShapes[self.getNodeShape(node)]; + + if (shape.checkPoint(x, y, 0, width, height, pos.x, pos.y)) { + addEle(node, 0); + return true; + } + } + } + + function checkEdge(edge) { + var _p = edge._private; + var rs = _p.rscratch; + var styleWidth = edge.pstyle('width').pfValue; + var scale = edge.pstyle('arrow-scale').value; + var width = styleWidth / 2 + edgeThreshold; // more like a distance radius from centre + + var widthSq = width * width; + var width2 = width * 2; + var src = _p.source; + var tgt = _p.target; + var sqDist; + + if (rs.edgeType === 'segments' || rs.edgeType === 'straight' || rs.edgeType === 'haystack') { + var pts = rs.allpts; + + for (var i = 0; i + 3 < pts.length; i += 2) { + if (inLineVicinity(x, y, pts[i], pts[i + 1], pts[i + 2], pts[i + 3], width2) && widthSq > (sqDist = sqdistToFiniteLine(x, y, pts[i], pts[i + 1], pts[i + 2], pts[i + 3]))) { + addEle(edge, sqDist); + return true; + } + } + } else if (rs.edgeType === 'bezier' || rs.edgeType === 'multibezier' || rs.edgeType === 'self' || rs.edgeType === 'compound') { + var pts = rs.allpts; + + for (var i = 0; i + 5 < rs.allpts.length; i += 4) { + if (inBezierVicinity(x, y, pts[i], pts[i + 1], pts[i + 2], pts[i + 3], pts[i + 4], pts[i + 5], width2) && widthSq > (sqDist = sqdistToQuadraticBezier(x, y, pts[i], pts[i + 1], pts[i + 2], pts[i + 3], pts[i + 4], pts[i + 5]))) { + addEle(edge, sqDist); + return true; + } + } + } // if we're close to the edge but didn't hit it, maybe we hit its arrows + + + var src = src || _p.source; + var tgt = tgt || _p.target; + var arSize = self.getArrowWidth(styleWidth, scale); + var arrows = [{ + name: 'source', + x: rs.arrowStartX, + y: rs.arrowStartY, + angle: rs.srcArrowAngle + }, { + name: 'target', + x: rs.arrowEndX, + y: rs.arrowEndY, + angle: rs.tgtArrowAngle + }, { + name: 'mid-source', + x: rs.midX, + y: rs.midY, + angle: rs.midsrcArrowAngle + }, { + name: 'mid-target', + x: rs.midX, + y: rs.midY, + angle: rs.midtgtArrowAngle + }]; + + for (var i = 0; i < arrows.length; i++) { + var ar = arrows[i]; + var shape = r.arrowShapes[edge.pstyle(ar.name + '-arrow-shape').value]; + var edgeWidth = edge.pstyle('width').pfValue; + + if (shape.roughCollide(x, y, arSize, ar.angle, { + x: ar.x, + y: ar.y + }, edgeWidth, edgeThreshold) && shape.collide(x, y, arSize, ar.angle, { + x: ar.x, + y: ar.y + }, edgeWidth, edgeThreshold)) { + addEle(edge); + return true; + } + } // for compound graphs, hitting edge may actually want a connected node instead (b/c edge may have greater z-index precedence) + + + if (hasCompounds && near.length > 0) { + checkNode(src); + checkNode(tgt); + } + } + + function preprop(obj, name, pre) { + return getPrefixedProperty(obj, name, pre); + } + + function checkLabel(ele, prefix) { + var _p = ele._private; + var th = labelThreshold; + var prefixDash; + + if (prefix) { + prefixDash = prefix + '-'; + } else { + prefixDash = ''; + } + + ele.boundingBox(); + var bb = _p.labelBounds[prefix || 'main']; + var text = ele.pstyle(prefixDash + 'label').value; + var eventsEnabled = ele.pstyle('text-events').strValue === 'yes'; + + if (!eventsEnabled || !text) { + return; + } + + var lx = preprop(_p.rscratch, 'labelX', prefix); + var ly = preprop(_p.rscratch, 'labelY', prefix); + var theta = preprop(_p.rscratch, 'labelAngle', prefix); + var ox = ele.pstyle(prefixDash + 'text-margin-x').pfValue; + var oy = ele.pstyle(prefixDash + 'text-margin-y').pfValue; + var lx1 = bb.x1 - th - ox; // (-ox, -oy) as bb already includes margin + + var lx2 = bb.x2 + th - ox; // and rotation is about (lx, ly) + + var ly1 = bb.y1 - th - oy; + var ly2 = bb.y2 + th - oy; + + if (theta) { + var cos = Math.cos(theta); + var sin = Math.sin(theta); + + var rotate = function rotate(x, y) { + x = x - lx; + y = y - ly; + return { + x: x * cos - y * sin + lx, + y: x * sin + y * cos + ly + }; + }; + + var px1y1 = rotate(lx1, ly1); + var px1y2 = rotate(lx1, ly2); + var px2y1 = rotate(lx2, ly1); + var px2y2 = rotate(lx2, ly2); + var points = [// with the margin added after the rotation is applied + px1y1.x + ox, px1y1.y + oy, px2y1.x + ox, px2y1.y + oy, px2y2.x + ox, px2y2.y + oy, px1y2.x + ox, px1y2.y + oy]; + + if (pointInsidePolygonPoints(x, y, points)) { + addEle(ele); + return true; + } + } else { + // do a cheaper bb check + if (inBoundingBox(bb, x, y)) { + addEle(ele); + return true; + } + } + } + + for (var i = eles.length - 1; i >= 0; i--) { + // reverse order for precedence + var ele = eles[i]; + + if (ele.isNode()) { + checkNode(ele) || checkLabel(ele); + } else { + // then edge + checkEdge(ele) || checkLabel(ele) || checkLabel(ele, 'source') || checkLabel(ele, 'target'); + } + } + + return near; + }; // 'Give me everything from this box' + + + BRp$e.getAllInBox = function (x1, y1, x2, y2) { + var eles = this.getCachedZSortedEles().interactive; + var box = []; + var x1c = Math.min(x1, x2); + var x2c = Math.max(x1, x2); + var y1c = Math.min(y1, y2); + var y2c = Math.max(y1, y2); + x1 = x1c; + x2 = x2c; + y1 = y1c; + y2 = y2c; + var boxBb = makeBoundingBox({ + x1: x1, + y1: y1, + x2: x2, + y2: y2 + }); + + for (var e = 0; e < eles.length; e++) { + var ele = eles[e]; + + if (ele.isNode()) { + var node = ele; + var nodeBb = node.boundingBox({ + includeNodes: true, + includeEdges: false, + includeLabels: false + }); + + if (boundingBoxesIntersect(boxBb, nodeBb) && !boundingBoxInBoundingBox(nodeBb, boxBb)) { + box.push(node); + } + } else { + var edge = ele; + var _p = edge._private; + var rs = _p.rscratch; + + if (rs.startX != null && rs.startY != null && !inBoundingBox(boxBb, rs.startX, rs.startY)) { + continue; + } + + if (rs.endX != null && rs.endY != null && !inBoundingBox(boxBb, rs.endX, rs.endY)) { + continue; + } + + if (rs.edgeType === 'bezier' || rs.edgeType === 'multibezier' || rs.edgeType === 'self' || rs.edgeType === 'compound' || rs.edgeType === 'segments' || rs.edgeType === 'haystack') { + var pts = _p.rstyle.bezierPts || _p.rstyle.linePts || _p.rstyle.haystackPts; + var allInside = true; + + for (var i = 0; i < pts.length; i++) { + if (!pointInBoundingBox(boxBb, pts[i])) { + allInside = false; + break; + } + } + + if (allInside) { + box.push(edge); + } + } else if (rs.edgeType === 'haystack' || rs.edgeType === 'straight') { + box.push(edge); + } + } + } + + return box; + }; + + var BRp$d = {}; + + BRp$d.calculateArrowAngles = function (edge) { + var rs = edge._private.rscratch; + var isHaystack = rs.edgeType === 'haystack'; + var isBezier = rs.edgeType === 'bezier'; + var isMultibezier = rs.edgeType === 'multibezier'; + var isSegments = rs.edgeType === 'segments'; + var isCompound = rs.edgeType === 'compound'; + var isSelf = rs.edgeType === 'self'; // Displacement gives direction for arrowhead orientation + + var dispX, dispY; + var startX, startY, endX, endY, midX, midY; + + if (isHaystack) { + startX = rs.haystackPts[0]; + startY = rs.haystackPts[1]; + endX = rs.haystackPts[2]; + endY = rs.haystackPts[3]; + } else { + startX = rs.arrowStartX; + startY = rs.arrowStartY; + endX = rs.arrowEndX; + endY = rs.arrowEndY; + } + + midX = rs.midX; + midY = rs.midY; // source + // + + if (isSegments) { + dispX = startX - rs.segpts[0]; + dispY = startY - rs.segpts[1]; + } else if (isMultibezier || isCompound || isSelf || isBezier) { + var pts = rs.allpts; + var bX = qbezierAt(pts[0], pts[2], pts[4], 0.1); + var bY = qbezierAt(pts[1], pts[3], pts[5], 0.1); + dispX = startX - bX; + dispY = startY - bY; + } else { + dispX = startX - midX; + dispY = startY - midY; + } + + rs.srcArrowAngle = getAngleFromDisp(dispX, dispY); // mid target + // + + var midX = rs.midX; + var midY = rs.midY; + + if (isHaystack) { + midX = (startX + endX) / 2; + midY = (startY + endY) / 2; + } + + dispX = endX - startX; + dispY = endY - startY; + + if (isSegments) { + var pts = rs.allpts; + + if (pts.length / 2 % 2 === 0) { + var i2 = pts.length / 2; + var i1 = i2 - 2; + dispX = pts[i2] - pts[i1]; + dispY = pts[i2 + 1] - pts[i1 + 1]; + } else { + var i2 = pts.length / 2 - 1; + var i1 = i2 - 2; + var i3 = i2 + 2; + dispX = pts[i2] - pts[i1]; + dispY = pts[i2 + 1] - pts[i1 + 1]; + } + } else if (isMultibezier || isCompound || isSelf) { + var pts = rs.allpts; + var cpts = rs.ctrlpts; + var bp0x, bp0y; + var bp1x, bp1y; + + if (cpts.length / 2 % 2 === 0) { + var p0 = pts.length / 2 - 1; // startpt + + var ic = p0 + 2; + var p1 = ic + 2; + bp0x = qbezierAt(pts[p0], pts[ic], pts[p1], 0.0); + bp0y = qbezierAt(pts[p0 + 1], pts[ic + 1], pts[p1 + 1], 0.0); + bp1x = qbezierAt(pts[p0], pts[ic], pts[p1], 0.0001); + bp1y = qbezierAt(pts[p0 + 1], pts[ic + 1], pts[p1 + 1], 0.0001); + } else { + var ic = pts.length / 2 - 1; // ctrpt + + var p0 = ic - 2; // startpt + + var p1 = ic + 2; // endpt + + bp0x = qbezierAt(pts[p0], pts[ic], pts[p1], 0.4999); + bp0y = qbezierAt(pts[p0 + 1], pts[ic + 1], pts[p1 + 1], 0.4999); + bp1x = qbezierAt(pts[p0], pts[ic], pts[p1], 0.5); + bp1y = qbezierAt(pts[p0 + 1], pts[ic + 1], pts[p1 + 1], 0.5); + } + + dispX = bp1x - bp0x; + dispY = bp1y - bp0y; + } + + rs.midtgtArrowAngle = getAngleFromDisp(dispX, dispY); + rs.midDispX = dispX; + rs.midDispY = dispY; // mid source + // + + dispX *= -1; + dispY *= -1; + + if (isSegments) { + var pts = rs.allpts; + + if (pts.length / 2 % 2 === 0) ; else { + var i2 = pts.length / 2 - 1; + var i3 = i2 + 2; + dispX = -(pts[i3] - pts[i2]); + dispY = -(pts[i3 + 1] - pts[i2 + 1]); + } + } + + rs.midsrcArrowAngle = getAngleFromDisp(dispX, dispY); // target + // + + if (isSegments) { + dispX = endX - rs.segpts[rs.segpts.length - 2]; + dispY = endY - rs.segpts[rs.segpts.length - 1]; + } else if (isMultibezier || isCompound || isSelf || isBezier) { + var pts = rs.allpts; + var l = pts.length; + var bX = qbezierAt(pts[l - 6], pts[l - 4], pts[l - 2], 0.9); + var bY = qbezierAt(pts[l - 5], pts[l - 3], pts[l - 1], 0.9); + dispX = endX - bX; + dispY = endY - bY; + } else { + dispX = endX - midX; + dispY = endY - midY; + } + + rs.tgtArrowAngle = getAngleFromDisp(dispX, dispY); + }; + + BRp$d.getArrowWidth = BRp$d.getArrowHeight = function (edgeWidth, scale) { + var cache = this.arrowWidthCache = this.arrowWidthCache || {}; + var cachedVal = cache[edgeWidth + ', ' + scale]; + + if (cachedVal) { + return cachedVal; + } + + cachedVal = Math.max(Math.pow(edgeWidth * 13.37, 0.9), 29) * scale; + cache[edgeWidth + ', ' + scale] = cachedVal; + return cachedVal; + }; + + var BRp$c = {}; + + BRp$c.findHaystackPoints = function (edges) { + for (var i = 0; i < edges.length; i++) { + var edge = edges[i]; + var _p = edge._private; + var rs = _p.rscratch; + + if (!rs.haystack) { + var angle = Math.random() * 2 * Math.PI; + rs.source = { + x: Math.cos(angle), + y: Math.sin(angle) + }; + angle = Math.random() * 2 * Math.PI; + rs.target = { + x: Math.cos(angle), + y: Math.sin(angle) + }; + } + + var src = _p.source; + var tgt = _p.target; + var srcPos = src.position(); + var tgtPos = tgt.position(); + var srcW = src.width(); + var tgtW = tgt.width(); + var srcH = src.height(); + var tgtH = tgt.height(); + var radius = edge.pstyle('haystack-radius').value; + var halfRadius = radius / 2; // b/c have to half width/height + + rs.haystackPts = rs.allpts = [rs.source.x * srcW * halfRadius + srcPos.x, rs.source.y * srcH * halfRadius + srcPos.y, rs.target.x * tgtW * halfRadius + tgtPos.x, rs.target.y * tgtH * halfRadius + tgtPos.y]; + rs.midX = (rs.allpts[0] + rs.allpts[2]) / 2; + rs.midY = (rs.allpts[1] + rs.allpts[3]) / 2; // always override as haystack in case set to different type previously + + rs.edgeType = 'haystack'; + rs.haystack = true; + this.storeEdgeProjections(edge); + this.calculateArrowAngles(edge); + this.recalculateEdgeLabelProjections(edge); + this.calculateLabelAngles(edge); + } + }; + + BRp$c.findSegmentsPoints = function (edge, pairInfo) { + // Segments (multiple straight lines) + var rs = edge._private.rscratch; + var posPts = pairInfo.posPts, + intersectionPts = pairInfo.intersectionPts, + vectorNormInverse = pairInfo.vectorNormInverse; + var edgeDistances = edge.pstyle('edge-distances').value; + var segmentWs = edge.pstyle('segment-weights'); + var segmentDs = edge.pstyle('segment-distances'); + var segmentsN = Math.min(segmentWs.pfValue.length, segmentDs.pfValue.length); + rs.edgeType = 'segments'; + rs.segpts = []; + + for (var s = 0; s < segmentsN; s++) { + var w = segmentWs.pfValue[s]; + var d = segmentDs.pfValue[s]; + var w1 = 1 - w; + var w2 = w; + var midptPts = edgeDistances === 'node-position' ? posPts : intersectionPts; + var adjustedMidpt = { + x: midptPts.x1 * w1 + midptPts.x2 * w2, + y: midptPts.y1 * w1 + midptPts.y2 * w2 + }; + rs.segpts.push(adjustedMidpt.x + vectorNormInverse.x * d, adjustedMidpt.y + vectorNormInverse.y * d); + } + }; + + BRp$c.findLoopPoints = function (edge, pairInfo, i, edgeIsUnbundled) { + // Self-edge + var rs = edge._private.rscratch; + var dirCounts = pairInfo.dirCounts, + srcPos = pairInfo.srcPos; + var ctrlptDists = edge.pstyle('control-point-distances'); + var ctrlptDist = ctrlptDists ? ctrlptDists.pfValue[0] : undefined; + var loopDir = edge.pstyle('loop-direction').pfValue; + var loopSwp = edge.pstyle('loop-sweep').pfValue; + var stepSize = edge.pstyle('control-point-step-size').pfValue; + rs.edgeType = 'self'; + var j = i; + var loopDist = stepSize; + + if (edgeIsUnbundled) { + j = 0; + loopDist = ctrlptDist; + } + + var loopAngle = loopDir - Math.PI / 2; + var outAngle = loopAngle - loopSwp / 2; + var inAngle = loopAngle + loopSwp / 2; // increase by step size for overlapping loops, keyed on direction and sweep values + + var dc = String(loopDir + '_' + loopSwp); + j = dirCounts[dc] === undefined ? dirCounts[dc] = 0 : ++dirCounts[dc]; + rs.ctrlpts = [srcPos.x + Math.cos(outAngle) * 1.4 * loopDist * (j / 3 + 1), srcPos.y + Math.sin(outAngle) * 1.4 * loopDist * (j / 3 + 1), srcPos.x + Math.cos(inAngle) * 1.4 * loopDist * (j / 3 + 1), srcPos.y + Math.sin(inAngle) * 1.4 * loopDist * (j / 3 + 1)]; + }; + + BRp$c.findCompoundLoopPoints = function (edge, pairInfo, i, edgeIsUnbundled) { + // Compound edge + var rs = edge._private.rscratch; + rs.edgeType = 'compound'; + var srcPos = pairInfo.srcPos, + tgtPos = pairInfo.tgtPos, + srcW = pairInfo.srcW, + srcH = pairInfo.srcH, + tgtW = pairInfo.tgtW, + tgtH = pairInfo.tgtH; + var stepSize = edge.pstyle('control-point-step-size').pfValue; + var ctrlptDists = edge.pstyle('control-point-distances'); + var ctrlptDist = ctrlptDists ? ctrlptDists.pfValue[0] : undefined; + var j = i; + var loopDist = stepSize; + + if (edgeIsUnbundled) { + j = 0; + loopDist = ctrlptDist; + } + + var loopW = 50; + var loopaPos = { + x: srcPos.x - srcW / 2, + y: srcPos.y - srcH / 2 + }; + var loopbPos = { + x: tgtPos.x - tgtW / 2, + y: tgtPos.y - tgtH / 2 + }; + var loopPos = { + x: Math.min(loopaPos.x, loopbPos.x), + y: Math.min(loopaPos.y, loopbPos.y) + }; // avoids cases with impossible beziers + + var minCompoundStretch = 0.5; + var compoundStretchA = Math.max(minCompoundStretch, Math.log(srcW * 0.01)); + var compoundStretchB = Math.max(minCompoundStretch, Math.log(tgtW * 0.01)); + rs.ctrlpts = [loopPos.x, loopPos.y - (1 + Math.pow(loopW, 1.12) / 100) * loopDist * (j / 3 + 1) * compoundStretchA, loopPos.x - (1 + Math.pow(loopW, 1.12) / 100) * loopDist * (j / 3 + 1) * compoundStretchB, loopPos.y]; + }; + + BRp$c.findStraightEdgePoints = function (edge) { + // Straight edge within bundle + edge._private.rscratch.edgeType = 'straight'; + }; + + BRp$c.findBezierPoints = function (edge, pairInfo, i, edgeIsUnbundled, edgeIsSwapped) { + var rs = edge._private.rscratch; + var vectorNormInverse = pairInfo.vectorNormInverse, + posPts = pairInfo.posPts, + intersectionPts = pairInfo.intersectionPts; + var edgeDistances = edge.pstyle('edge-distances').value; + var stepSize = edge.pstyle('control-point-step-size').pfValue; + var ctrlptDists = edge.pstyle('control-point-distances'); + var ctrlptWs = edge.pstyle('control-point-weights'); + var bezierN = ctrlptDists && ctrlptWs ? Math.min(ctrlptDists.value.length, ctrlptWs.value.length) : 1; + var ctrlptDist = ctrlptDists ? ctrlptDists.pfValue[0] : undefined; + var ctrlptWeight = ctrlptWs.value[0]; // (Multi)bezier + + var multi = edgeIsUnbundled; + rs.edgeType = multi ? 'multibezier' : 'bezier'; + rs.ctrlpts = []; + + for (var b = 0; b < bezierN; b++) { + var normctrlptDist = (0.5 - pairInfo.eles.length / 2 + i) * stepSize * (edgeIsSwapped ? -1 : 1); + var manctrlptDist = void 0; + var sign = signum(normctrlptDist); + + if (multi) { + ctrlptDist = ctrlptDists ? ctrlptDists.pfValue[b] : stepSize; // fall back on step size + + ctrlptWeight = ctrlptWs.value[b]; + } + + if (edgeIsUnbundled) { + // multi or single unbundled + manctrlptDist = ctrlptDist; + } else { + manctrlptDist = ctrlptDist !== undefined ? sign * ctrlptDist : undefined; + } + + var distanceFromMidpoint = manctrlptDist !== undefined ? manctrlptDist : normctrlptDist; + var w1 = 1 - ctrlptWeight; + var w2 = ctrlptWeight; + var midptPts = edgeDistances === 'node-position' ? posPts : intersectionPts; + var adjustedMidpt = { + x: midptPts.x1 * w1 + midptPts.x2 * w2, + y: midptPts.y1 * w1 + midptPts.y2 * w2 + }; + rs.ctrlpts.push(adjustedMidpt.x + vectorNormInverse.x * distanceFromMidpoint, adjustedMidpt.y + vectorNormInverse.y * distanceFromMidpoint); + } + }; + + BRp$c.findTaxiPoints = function (edge, pairInfo) { + // Taxicab geometry with two turns maximum + var rs = edge._private.rscratch; + rs.edgeType = 'segments'; + var VERTICAL = 'vertical'; + var HORIZONTAL = 'horizontal'; + var LEFTWARD = 'leftward'; + var RIGHTWARD = 'rightward'; + var DOWNWARD = 'downward'; + var UPWARD = 'upward'; + var AUTO = 'auto'; + var posPts = pairInfo.posPts, + srcW = pairInfo.srcW, + srcH = pairInfo.srcH, + tgtW = pairInfo.tgtW, + tgtH = pairInfo.tgtH; + var edgeDistances = edge.pstyle('edge-distances').value; + var dIncludesNodeBody = edgeDistances !== 'node-position'; + var taxiDir = edge.pstyle('taxi-direction').value; + var rawTaxiDir = taxiDir; // unprocessed value + + var taxiTurn = edge.pstyle('taxi-turn'); + var turnIsPercent = taxiTurn.units === '%'; + var taxiTurnPfVal = taxiTurn.pfValue; + var turnIsNegative = taxiTurnPfVal < 0; // i.e. from target side + + var minD = edge.pstyle('taxi-turn-min-distance').pfValue; + var dw = dIncludesNodeBody ? (srcW + tgtW) / 2 : 0; + var dh = dIncludesNodeBody ? (srcH + tgtH) / 2 : 0; + var pdx = posPts.x2 - posPts.x1; + var pdy = posPts.y2 - posPts.y1; // take away the effective w/h from the magnitude of the delta value + + var subDWH = function subDWH(dxy, dwh) { + if (dxy > 0) { + return Math.max(dxy - dwh, 0); + } else { + return Math.min(dxy + dwh, 0); + } + }; + + var dx = subDWH(pdx, dw); + var dy = subDWH(pdy, dh); + var isExplicitDir = false; + + if (rawTaxiDir === AUTO) { + taxiDir = Math.abs(dx) > Math.abs(dy) ? HORIZONTAL : VERTICAL; + } else if (rawTaxiDir === UPWARD || rawTaxiDir === DOWNWARD) { + taxiDir = VERTICAL; + isExplicitDir = true; + } else if (rawTaxiDir === LEFTWARD || rawTaxiDir === RIGHTWARD) { + taxiDir = HORIZONTAL; + isExplicitDir = true; + } + + var isVert = taxiDir === VERTICAL; + var l = isVert ? dy : dx; + var pl = isVert ? pdy : pdx; + var sgnL = signum(pl); + var forcedDir = false; + + if (!(isExplicitDir && (turnIsPercent || turnIsNegative)) // forcing in this case would cause weird growing in the opposite direction + && (rawTaxiDir === DOWNWARD && pl < 0 || rawTaxiDir === UPWARD && pl > 0 || rawTaxiDir === LEFTWARD && pl > 0 || rawTaxiDir === RIGHTWARD && pl < 0)) { + sgnL *= -1; + l = sgnL * Math.abs(l); + forcedDir = true; + } + + var d; + + if (turnIsPercent) { + var p = taxiTurnPfVal < 0 ? 1 + taxiTurnPfVal : taxiTurnPfVal; + d = p * l; + } else { + var k = taxiTurnPfVal < 0 ? l : 0; + d = k + taxiTurnPfVal * sgnL; + } + + var getIsTooClose = function getIsTooClose(d) { + return Math.abs(d) < minD || Math.abs(d) >= Math.abs(l); + }; + + var isTooCloseSrc = getIsTooClose(d); + var isTooCloseTgt = getIsTooClose(Math.abs(l) - Math.abs(d)); + var isTooClose = isTooCloseSrc || isTooCloseTgt; + + if (isTooClose && !forcedDir) { + // non-ideal routing + if (isVert) { + // vertical fallbacks + var lShapeInsideSrc = Math.abs(pl) <= srcH / 2; + var lShapeInsideTgt = Math.abs(pdx) <= tgtW / 2; + + if (lShapeInsideSrc) { + // horizontal Z-shape (direction not respected) + var x = (posPts.x1 + posPts.x2) / 2; + var y1 = posPts.y1, + y2 = posPts.y2; + rs.segpts = [x, y1, x, y2]; + } else if (lShapeInsideTgt) { + // vertical Z-shape (distance not respected) + var y = (posPts.y1 + posPts.y2) / 2; + var x1 = posPts.x1, + x2 = posPts.x2; + rs.segpts = [x1, y, x2, y]; + } else { + // L-shape fallback (turn distance not respected, but works well with tree siblings) + rs.segpts = [posPts.x1, posPts.y2]; + } + } else { + // horizontal fallbacks + var _lShapeInsideSrc = Math.abs(pl) <= srcW / 2; + + var _lShapeInsideTgt = Math.abs(pdy) <= tgtH / 2; + + if (_lShapeInsideSrc) { + // vertical Z-shape (direction not respected) + var _y = (posPts.y1 + posPts.y2) / 2; + + var _x = posPts.x1, + _x2 = posPts.x2; + rs.segpts = [_x, _y, _x2, _y]; + } else if (_lShapeInsideTgt) { + // horizontal Z-shape (turn distance not respected) + var _x3 = (posPts.x1 + posPts.x2) / 2; + + var _y2 = posPts.y1, + _y3 = posPts.y2; + rs.segpts = [_x3, _y2, _x3, _y3]; + } else { + // L-shape (turn distance not respected, but works well for tree siblings) + rs.segpts = [posPts.x2, posPts.y1]; + } + } + } else { + // ideal routing + if (isVert) { + var _y4 = posPts.y1 + d + (dIncludesNodeBody ? srcH / 2 * sgnL : 0); + + var _x4 = posPts.x1, + _x5 = posPts.x2; + rs.segpts = [_x4, _y4, _x5, _y4]; + } else { + // horizontal + var _x6 = posPts.x1 + d + (dIncludesNodeBody ? srcW / 2 * sgnL : 0); + + var _y5 = posPts.y1, + _y6 = posPts.y2; + rs.segpts = [_x6, _y5, _x6, _y6]; + } + } + }; + + BRp$c.tryToCorrectInvalidPoints = function (edge, pairInfo) { + var rs = edge._private.rscratch; // can only correct beziers for now... + + if (rs.edgeType === 'bezier') { + var srcPos = pairInfo.srcPos, + tgtPos = pairInfo.tgtPos, + srcW = pairInfo.srcW, + srcH = pairInfo.srcH, + tgtW = pairInfo.tgtW, + tgtH = pairInfo.tgtH, + srcShape = pairInfo.srcShape, + tgtShape = pairInfo.tgtShape; + var badStart = !number$1(rs.startX) || !number$1(rs.startY); + var badAStart = !number$1(rs.arrowStartX) || !number$1(rs.arrowStartY); + var badEnd = !number$1(rs.endX) || !number$1(rs.endY); + var badAEnd = !number$1(rs.arrowEndX) || !number$1(rs.arrowEndY); + var minCpADistFactor = 3; + var arrowW = this.getArrowWidth(edge.pstyle('width').pfValue, edge.pstyle('arrow-scale').value) * this.arrowShapeWidth; + var minCpADist = minCpADistFactor * arrowW; + var startACpDist = dist({ + x: rs.ctrlpts[0], + y: rs.ctrlpts[1] + }, { + x: rs.startX, + y: rs.startY + }); + var closeStartACp = startACpDist < minCpADist; + var endACpDist = dist({ + x: rs.ctrlpts[0], + y: rs.ctrlpts[1] + }, { + x: rs.endX, + y: rs.endY + }); + var closeEndACp = endACpDist < minCpADist; + var overlapping = false; + + if (badStart || badAStart || closeStartACp) { + overlapping = true; // project control point along line from src centre to outside the src shape + // (otherwise intersection will yield nothing) + + var cpD = { + // delta + x: rs.ctrlpts[0] - srcPos.x, + y: rs.ctrlpts[1] - srcPos.y + }; + var cpL = Math.sqrt(cpD.x * cpD.x + cpD.y * cpD.y); // length of line + + var cpM = { + // normalised delta + x: cpD.x / cpL, + y: cpD.y / cpL + }; + var radius = Math.max(srcW, srcH); + var cpProj = { + // *2 radius guarantees outside shape + x: rs.ctrlpts[0] + cpM.x * 2 * radius, + y: rs.ctrlpts[1] + cpM.y * 2 * radius + }; + var srcCtrlPtIntn = srcShape.intersectLine(srcPos.x, srcPos.y, srcW, srcH, cpProj.x, cpProj.y, 0); + + if (closeStartACp) { + rs.ctrlpts[0] = rs.ctrlpts[0] + cpM.x * (minCpADist - startACpDist); + rs.ctrlpts[1] = rs.ctrlpts[1] + cpM.y * (minCpADist - startACpDist); + } else { + rs.ctrlpts[0] = srcCtrlPtIntn[0] + cpM.x * minCpADist; + rs.ctrlpts[1] = srcCtrlPtIntn[1] + cpM.y * minCpADist; + } + } + + if (badEnd || badAEnd || closeEndACp) { + overlapping = true; // project control point along line from tgt centre to outside the tgt shape + // (otherwise intersection will yield nothing) + + var _cpD = { + // delta + x: rs.ctrlpts[0] - tgtPos.x, + y: rs.ctrlpts[1] - tgtPos.y + }; + + var _cpL = Math.sqrt(_cpD.x * _cpD.x + _cpD.y * _cpD.y); // length of line + + + var _cpM = { + // normalised delta + x: _cpD.x / _cpL, + y: _cpD.y / _cpL + }; + + var _radius = Math.max(srcW, srcH); + + var _cpProj = { + // *2 radius guarantees outside shape + x: rs.ctrlpts[0] + _cpM.x * 2 * _radius, + y: rs.ctrlpts[1] + _cpM.y * 2 * _radius + }; + var tgtCtrlPtIntn = tgtShape.intersectLine(tgtPos.x, tgtPos.y, tgtW, tgtH, _cpProj.x, _cpProj.y, 0); + + if (closeEndACp) { + rs.ctrlpts[0] = rs.ctrlpts[0] + _cpM.x * (minCpADist - endACpDist); + rs.ctrlpts[1] = rs.ctrlpts[1] + _cpM.y * (minCpADist - endACpDist); + } else { + rs.ctrlpts[0] = tgtCtrlPtIntn[0] + _cpM.x * minCpADist; + rs.ctrlpts[1] = tgtCtrlPtIntn[1] + _cpM.y * minCpADist; + } + } + + if (overlapping) { + // recalc endpts + this.findEndpoints(edge); + } + } + }; + + BRp$c.storeAllpts = function (edge) { + var rs = edge._private.rscratch; + + if (rs.edgeType === 'multibezier' || rs.edgeType === 'bezier' || rs.edgeType === 'self' || rs.edgeType === 'compound') { + rs.allpts = []; + rs.allpts.push(rs.startX, rs.startY); + + for (var b = 0; b + 1 < rs.ctrlpts.length; b += 2) { + // ctrl pt itself + rs.allpts.push(rs.ctrlpts[b], rs.ctrlpts[b + 1]); // the midpt between ctrlpts as intermediate destination pts + + if (b + 3 < rs.ctrlpts.length) { + rs.allpts.push((rs.ctrlpts[b] + rs.ctrlpts[b + 2]) / 2, (rs.ctrlpts[b + 1] + rs.ctrlpts[b + 3]) / 2); + } + } + + rs.allpts.push(rs.endX, rs.endY); + var m, mt; + + if (rs.ctrlpts.length / 2 % 2 === 0) { + m = rs.allpts.length / 2 - 1; + rs.midX = rs.allpts[m]; + rs.midY = rs.allpts[m + 1]; + } else { + m = rs.allpts.length / 2 - 3; + mt = 0.5; + rs.midX = qbezierAt(rs.allpts[m], rs.allpts[m + 2], rs.allpts[m + 4], mt); + rs.midY = qbezierAt(rs.allpts[m + 1], rs.allpts[m + 3], rs.allpts[m + 5], mt); + } + } else if (rs.edgeType === 'straight') { + // need to calc these after endpts + rs.allpts = [rs.startX, rs.startY, rs.endX, rs.endY]; // default midpt for labels etc + + rs.midX = (rs.startX + rs.endX + rs.arrowStartX + rs.arrowEndX) / 4; + rs.midY = (rs.startY + rs.endY + rs.arrowStartY + rs.arrowEndY) / 4; + } else if (rs.edgeType === 'segments') { + rs.allpts = []; + rs.allpts.push(rs.startX, rs.startY); + rs.allpts.push.apply(rs.allpts, rs.segpts); + rs.allpts.push(rs.endX, rs.endY); + + if (rs.segpts.length % 4 === 0) { + var i2 = rs.segpts.length / 2; + var i1 = i2 - 2; + rs.midX = (rs.segpts[i1] + rs.segpts[i2]) / 2; + rs.midY = (rs.segpts[i1 + 1] + rs.segpts[i2 + 1]) / 2; + } else { + var _i = rs.segpts.length / 2 - 1; + + rs.midX = rs.segpts[_i]; + rs.midY = rs.segpts[_i + 1]; + } + } + }; + + BRp$c.checkForInvalidEdgeWarning = function (edge) { + var rs = edge[0]._private.rscratch; + + if (rs.nodesOverlap || number$1(rs.startX) && number$1(rs.startY) && number$1(rs.endX) && number$1(rs.endY)) { + rs.loggedErr = false; + } else { + if (!rs.loggedErr) { + rs.loggedErr = true; + warn('Edge `' + edge.id() + '` has invalid endpoints and so it is impossible to draw. Adjust your edge style (e.g. control points) accordingly or use an alternative edge type. This is expected behaviour when the source node and the target node overlap.'); + } + } + }; + + BRp$c.findEdgeControlPoints = function (edges) { + var _this = this; + + if (!edges || edges.length === 0) { + return; + } + + var r = this; + var cy = r.cy; + var hasCompounds = cy.hasCompoundNodes(); + var hashTable = { + map: new Map$2(), + get: function get(pairId) { + var map2 = this.map.get(pairId[0]); + + if (map2 != null) { + return map2.get(pairId[1]); + } else { + return null; + } + }, + set: function set(pairId, val) { + var map2 = this.map.get(pairId[0]); + + if (map2 == null) { + map2 = new Map$2(); + this.map.set(pairId[0], map2); + } + + map2.set(pairId[1], val); + } + }; + var pairIds = []; + var haystackEdges = []; // create a table of edge (src, tgt) => list of edges between them + + for (var i = 0; i < edges.length; i++) { + var edge = edges[i]; + var _p = edge._private; + var curveStyle = edge.pstyle('curve-style').value; // ignore edges who are not to be displayed + // they shouldn't take up space + + if (edge.removed() || !edge.takesUpSpace()) { + continue; + } + + if (curveStyle === 'haystack') { + haystackEdges.push(edge); + continue; + } + + var edgeIsUnbundled = curveStyle === 'unbundled-bezier' || curveStyle === 'segments' || curveStyle === 'straight' || curveStyle === 'straight-triangle' || curveStyle === 'taxi'; + var edgeIsBezier = curveStyle === 'unbundled-bezier' || curveStyle === 'bezier'; + var src = _p.source; + var tgt = _p.target; + var srcIndex = src.poolIndex(); + var tgtIndex = tgt.poolIndex(); + var pairId = [srcIndex, tgtIndex].sort(); + var tableEntry = hashTable.get(pairId); + + if (tableEntry == null) { + tableEntry = { + eles: [] + }; + hashTable.set(pairId, tableEntry); + pairIds.push(pairId); + } + + tableEntry.eles.push(edge); + + if (edgeIsUnbundled) { + tableEntry.hasUnbundled = true; + } + + if (edgeIsBezier) { + tableEntry.hasBezier = true; + } + } // for each pair (src, tgt), create the ctrl pts + // Nested for loop is OK; total number of iterations for both loops = edgeCount + + + var _loop = function _loop(p) { + var pairId = pairIds[p]; + var pairInfo = hashTable.get(pairId); + var swappedpairInfo = void 0; + + if (!pairInfo.hasUnbundled) { + var pllEdges = pairInfo.eles[0].parallelEdges().filter(function (e) { + return e.isBundledBezier(); + }); + clearArray(pairInfo.eles); + pllEdges.forEach(function (edge) { + return pairInfo.eles.push(edge); + }); // for each pair id, the edges should be sorted by index + + pairInfo.eles.sort(function (edge1, edge2) { + return edge1.poolIndex() - edge2.poolIndex(); + }); + } + + var firstEdge = pairInfo.eles[0]; + var src = firstEdge.source(); + var tgt = firstEdge.target(); // make sure src/tgt distinction is consistent w.r.t. pairId + + if (src.poolIndex() > tgt.poolIndex()) { + var temp = src; + src = tgt; + tgt = temp; + } + + var srcPos = pairInfo.srcPos = src.position(); + var tgtPos = pairInfo.tgtPos = tgt.position(); + var srcW = pairInfo.srcW = src.outerWidth(); + var srcH = pairInfo.srcH = src.outerHeight(); + var tgtW = pairInfo.tgtW = tgt.outerWidth(); + var tgtH = pairInfo.tgtH = tgt.outerHeight(); + + var srcShape = pairInfo.srcShape = r.nodeShapes[_this.getNodeShape(src)]; + + var tgtShape = pairInfo.tgtShape = r.nodeShapes[_this.getNodeShape(tgt)]; + + pairInfo.dirCounts = { + 'north': 0, + 'west': 0, + 'south': 0, + 'east': 0, + 'northwest': 0, + 'southwest': 0, + 'northeast': 0, + 'southeast': 0 + }; + + for (var _i2 = 0; _i2 < pairInfo.eles.length; _i2++) { + var _edge = pairInfo.eles[_i2]; + var rs = _edge[0]._private.rscratch; + + var _curveStyle = _edge.pstyle('curve-style').value; + + var _edgeIsUnbundled = _curveStyle === 'unbundled-bezier' || _curveStyle === 'segments' || _curveStyle === 'taxi'; // whether the normalised pair order is the reverse of the edge's src-tgt order + + + var edgeIsSwapped = !src.same(_edge.source()); + + if (!pairInfo.calculatedIntersection && src !== tgt && (pairInfo.hasBezier || pairInfo.hasUnbundled)) { + pairInfo.calculatedIntersection = true; // pt outside src shape to calc distance/displacement from src to tgt + + var srcOutside = srcShape.intersectLine(srcPos.x, srcPos.y, srcW, srcH, tgtPos.x, tgtPos.y, 0); + var srcIntn = pairInfo.srcIntn = srcOutside; // pt outside tgt shape to calc distance/displacement from src to tgt + + var tgtOutside = tgtShape.intersectLine(tgtPos.x, tgtPos.y, tgtW, tgtH, srcPos.x, srcPos.y, 0); + var tgtIntn = pairInfo.tgtIntn = tgtOutside; + var intersectionPts = pairInfo.intersectionPts = { + x1: srcOutside[0], + x2: tgtOutside[0], + y1: srcOutside[1], + y2: tgtOutside[1] + }; + var posPts = pairInfo.posPts = { + x1: srcPos.x, + x2: tgtPos.x, + y1: srcPos.y, + y2: tgtPos.y + }; + var dy = tgtOutside[1] - srcOutside[1]; + var dx = tgtOutside[0] - srcOutside[0]; + var l = Math.sqrt(dx * dx + dy * dy); + var vector = pairInfo.vector = { + x: dx, + y: dy + }; + var vectorNorm = pairInfo.vectorNorm = { + x: vector.x / l, + y: vector.y / l + }; + var vectorNormInverse = { + x: -vectorNorm.y, + y: vectorNorm.x + }; // if node shapes overlap, then no ctrl pts to draw + + pairInfo.nodesOverlap = !number$1(l) || tgtShape.checkPoint(srcOutside[0], srcOutside[1], 0, tgtW, tgtH, tgtPos.x, tgtPos.y) || srcShape.checkPoint(tgtOutside[0], tgtOutside[1], 0, srcW, srcH, srcPos.x, srcPos.y); + pairInfo.vectorNormInverse = vectorNormInverse; + swappedpairInfo = { + nodesOverlap: pairInfo.nodesOverlap, + dirCounts: pairInfo.dirCounts, + calculatedIntersection: true, + hasBezier: pairInfo.hasBezier, + hasUnbundled: pairInfo.hasUnbundled, + eles: pairInfo.eles, + srcPos: tgtPos, + tgtPos: srcPos, + srcW: tgtW, + srcH: tgtH, + tgtW: srcW, + tgtH: srcH, + srcIntn: tgtIntn, + tgtIntn: srcIntn, + srcShape: tgtShape, + tgtShape: srcShape, + posPts: { + x1: posPts.x2, + y1: posPts.y2, + x2: posPts.x1, + y2: posPts.y1 + }, + intersectionPts: { + x1: intersectionPts.x2, + y1: intersectionPts.y2, + x2: intersectionPts.x1, + y2: intersectionPts.y1 + }, + vector: { + x: -vector.x, + y: -vector.y + }, + vectorNorm: { + x: -vectorNorm.x, + y: -vectorNorm.y + }, + vectorNormInverse: { + x: -vectorNormInverse.x, + y: -vectorNormInverse.y + } + }; + } + + var passedPairInfo = edgeIsSwapped ? swappedpairInfo : pairInfo; + rs.nodesOverlap = passedPairInfo.nodesOverlap; + rs.srcIntn = passedPairInfo.srcIntn; + rs.tgtIntn = passedPairInfo.tgtIntn; + + if (hasCompounds && (src.isParent() || src.isChild() || tgt.isParent() || tgt.isChild()) && (src.parents().anySame(tgt) || tgt.parents().anySame(src) || src.same(tgt) && src.isParent())) { + _this.findCompoundLoopPoints(_edge, passedPairInfo, _i2, _edgeIsUnbundled); + } else if (src === tgt) { + _this.findLoopPoints(_edge, passedPairInfo, _i2, _edgeIsUnbundled); + } else if (_curveStyle === 'segments') { + _this.findSegmentsPoints(_edge, passedPairInfo); + } else if (_curveStyle === 'taxi') { + _this.findTaxiPoints(_edge, passedPairInfo); + } else if (_curveStyle === 'straight' || !_edgeIsUnbundled && pairInfo.eles.length % 2 === 1 && _i2 === Math.floor(pairInfo.eles.length / 2)) { + _this.findStraightEdgePoints(_edge); + } else { + _this.findBezierPoints(_edge, passedPairInfo, _i2, _edgeIsUnbundled, edgeIsSwapped); + } + + _this.findEndpoints(_edge); + + _this.tryToCorrectInvalidPoints(_edge, passedPairInfo); + + _this.checkForInvalidEdgeWarning(_edge); + + _this.storeAllpts(_edge); + + _this.storeEdgeProjections(_edge); + + _this.calculateArrowAngles(_edge); + + _this.recalculateEdgeLabelProjections(_edge); + + _this.calculateLabelAngles(_edge); + } // for pair edges + + }; + + for (var p = 0; p < pairIds.length; p++) { + _loop(p); + } // for pair ids + // haystacks avoid the expense of pairInfo stuff (intersections etc.) + + + this.findHaystackPoints(haystackEdges); + }; + + function getPts(pts) { + var retPts = []; + + if (pts == null) { + return; + } + + for (var i = 0; i < pts.length; i += 2) { + var x = pts[i]; + var y = pts[i + 1]; + retPts.push({ + x: x, + y: y + }); + } + + return retPts; + } + + BRp$c.getSegmentPoints = function (edge) { + var rs = edge[0]._private.rscratch; + var type = rs.edgeType; + + if (type === 'segments') { + this.recalculateRenderedStyle(edge); + return getPts(rs.segpts); + } + }; + + BRp$c.getControlPoints = function (edge) { + var rs = edge[0]._private.rscratch; + var type = rs.edgeType; + + if (type === 'bezier' || type === 'multibezier' || type === 'self' || type === 'compound') { + this.recalculateRenderedStyle(edge); + return getPts(rs.ctrlpts); + } + }; + + BRp$c.getEdgeMidpoint = function (edge) { + var rs = edge[0]._private.rscratch; + this.recalculateRenderedStyle(edge); + return { + x: rs.midX, + y: rs.midY + }; + }; + + var BRp$b = {}; + + BRp$b.manualEndptToPx = function (node, prop) { + var r = this; + var npos = node.position(); + var w = node.outerWidth(); + var h = node.outerHeight(); + + if (prop.value.length === 2) { + var p = [prop.pfValue[0], prop.pfValue[1]]; + + if (prop.units[0] === '%') { + p[0] = p[0] * w; + } + + if (prop.units[1] === '%') { + p[1] = p[1] * h; + } + + p[0] += npos.x; + p[1] += npos.y; + return p; + } else { + var angle = prop.pfValue[0]; + angle = -Math.PI / 2 + angle; // start at 12 o'clock + + var l = 2 * Math.max(w, h); + var _p = [npos.x + Math.cos(angle) * l, npos.y + Math.sin(angle) * l]; + return r.nodeShapes[this.getNodeShape(node)].intersectLine(npos.x, npos.y, w, h, _p[0], _p[1], 0); + } + }; + + BRp$b.findEndpoints = function (edge) { + var r = this; + var intersect; + var source = edge.source()[0]; + var target = edge.target()[0]; + var srcPos = source.position(); + var tgtPos = target.position(); + var tgtArShape = edge.pstyle('target-arrow-shape').value; + var srcArShape = edge.pstyle('source-arrow-shape').value; + var tgtDist = edge.pstyle('target-distance-from-node').pfValue; + var srcDist = edge.pstyle('source-distance-from-node').pfValue; + var curveStyle = edge.pstyle('curve-style').value; + var rs = edge._private.rscratch; + var et = rs.edgeType; + var taxi = curveStyle === 'taxi'; + var self = et === 'self' || et === 'compound'; + var bezier = et === 'bezier' || et === 'multibezier' || self; + var multi = et !== 'bezier'; + var lines = et === 'straight' || et === 'segments'; + var segments = et === 'segments'; + var hasEndpts = bezier || multi || lines; + var overrideEndpts = self || taxi; + var srcManEndpt = edge.pstyle('source-endpoint'); + var srcManEndptVal = overrideEndpts ? 'outside-to-node' : srcManEndpt.value; + var tgtManEndpt = edge.pstyle('target-endpoint'); + var tgtManEndptVal = overrideEndpts ? 'outside-to-node' : tgtManEndpt.value; + rs.srcManEndpt = srcManEndpt; + rs.tgtManEndpt = tgtManEndpt; + var p1; // last known point of edge on target side + + var p2; // last known point of edge on source side + + var p1_i; // point to intersect with target shape + + var p2_i; // point to intersect with source shape + + if (bezier) { + var cpStart = [rs.ctrlpts[0], rs.ctrlpts[1]]; + var cpEnd = multi ? [rs.ctrlpts[rs.ctrlpts.length - 2], rs.ctrlpts[rs.ctrlpts.length - 1]] : cpStart; + p1 = cpEnd; + p2 = cpStart; + } else if (lines) { + var srcArrowFromPt = !segments ? [tgtPos.x, tgtPos.y] : rs.segpts.slice(0, 2); + var tgtArrowFromPt = !segments ? [srcPos.x, srcPos.y] : rs.segpts.slice(rs.segpts.length - 2); + p1 = tgtArrowFromPt; + p2 = srcArrowFromPt; + } + + if (tgtManEndptVal === 'inside-to-node') { + intersect = [tgtPos.x, tgtPos.y]; + } else if (tgtManEndpt.units) { + intersect = this.manualEndptToPx(target, tgtManEndpt); + } else if (tgtManEndptVal === 'outside-to-line') { + intersect = rs.tgtIntn; // use cached value from ctrlpt calc + } else { + if (tgtManEndptVal === 'outside-to-node' || tgtManEndptVal === 'outside-to-node-or-label') { + p1_i = p1; + } else if (tgtManEndptVal === 'outside-to-line' || tgtManEndptVal === 'outside-to-line-or-label') { + p1_i = [srcPos.x, srcPos.y]; + } + + intersect = r.nodeShapes[this.getNodeShape(target)].intersectLine(tgtPos.x, tgtPos.y, target.outerWidth(), target.outerHeight(), p1_i[0], p1_i[1], 0); + + if (tgtManEndptVal === 'outside-to-node-or-label' || tgtManEndptVal === 'outside-to-line-or-label') { + var trs = target._private.rscratch; + var lw = trs.labelWidth; + var lh = trs.labelHeight; + var lx = trs.labelX; + var ly = trs.labelY; + var lw2 = lw / 2; + var lh2 = lh / 2; + var va = target.pstyle('text-valign').value; + + if (va === 'top') { + ly -= lh2; + } else if (va === 'bottom') { + ly += lh2; + } + + var ha = target.pstyle('text-halign').value; + + if (ha === 'left') { + lx -= lw2; + } else if (ha === 'right') { + lx += lw2; + } + + var labelIntersect = polygonIntersectLine(p1_i[0], p1_i[1], [lx - lw2, ly - lh2, lx + lw2, ly - lh2, lx + lw2, ly + lh2, lx - lw2, ly + lh2], tgtPos.x, tgtPos.y); + + if (labelIntersect.length > 0) { + var refPt = srcPos; + var intSqdist = sqdist(refPt, array2point(intersect)); + var labIntSqdist = sqdist(refPt, array2point(labelIntersect)); + var minSqDist = intSqdist; + + if (labIntSqdist < intSqdist) { + intersect = labelIntersect; + minSqDist = labIntSqdist; + } + + if (labelIntersect.length > 2) { + var labInt2SqDist = sqdist(refPt, { + x: labelIntersect[2], + y: labelIntersect[3] + }); + + if (labInt2SqDist < minSqDist) { + intersect = [labelIntersect[2], labelIntersect[3]]; + } + } + } + } + } + + var arrowEnd = shortenIntersection(intersect, p1, r.arrowShapes[tgtArShape].spacing(edge) + tgtDist); + var edgeEnd = shortenIntersection(intersect, p1, r.arrowShapes[tgtArShape].gap(edge) + tgtDist); + rs.endX = edgeEnd[0]; + rs.endY = edgeEnd[1]; + rs.arrowEndX = arrowEnd[0]; + rs.arrowEndY = arrowEnd[1]; + + if (srcManEndptVal === 'inside-to-node') { + intersect = [srcPos.x, srcPos.y]; + } else if (srcManEndpt.units) { + intersect = this.manualEndptToPx(source, srcManEndpt); + } else if (srcManEndptVal === 'outside-to-line') { + intersect = rs.srcIntn; // use cached value from ctrlpt calc + } else { + if (srcManEndptVal === 'outside-to-node' || srcManEndptVal === 'outside-to-node-or-label') { + p2_i = p2; + } else if (srcManEndptVal === 'outside-to-line' || srcManEndptVal === 'outside-to-line-or-label') { + p2_i = [tgtPos.x, tgtPos.y]; + } + + intersect = r.nodeShapes[this.getNodeShape(source)].intersectLine(srcPos.x, srcPos.y, source.outerWidth(), source.outerHeight(), p2_i[0], p2_i[1], 0); + + if (srcManEndptVal === 'outside-to-node-or-label' || srcManEndptVal === 'outside-to-line-or-label') { + var srs = source._private.rscratch; + var _lw = srs.labelWidth; + var _lh = srs.labelHeight; + var _lx = srs.labelX; + var _ly = srs.labelY; + + var _lw2 = _lw / 2; + + var _lh2 = _lh / 2; + + var _va = source.pstyle('text-valign').value; + + if (_va === 'top') { + _ly -= _lh2; + } else if (_va === 'bottom') { + _ly += _lh2; + } + + var _ha = source.pstyle('text-halign').value; + + if (_ha === 'left') { + _lx -= _lw2; + } else if (_ha === 'right') { + _lx += _lw2; + } + + var _labelIntersect = polygonIntersectLine(p2_i[0], p2_i[1], [_lx - _lw2, _ly - _lh2, _lx + _lw2, _ly - _lh2, _lx + _lw2, _ly + _lh2, _lx - _lw2, _ly + _lh2], srcPos.x, srcPos.y); + + if (_labelIntersect.length > 0) { + var _refPt = tgtPos; + + var _intSqdist = sqdist(_refPt, array2point(intersect)); + + var _labIntSqdist = sqdist(_refPt, array2point(_labelIntersect)); + + var _minSqDist = _intSqdist; + + if (_labIntSqdist < _intSqdist) { + intersect = [_labelIntersect[0], _labelIntersect[1]]; + _minSqDist = _labIntSqdist; + } + + if (_labelIntersect.length > 2) { + var _labInt2SqDist = sqdist(_refPt, { + x: _labelIntersect[2], + y: _labelIntersect[3] + }); + + if (_labInt2SqDist < _minSqDist) { + intersect = [_labelIntersect[2], _labelIntersect[3]]; + } + } + } + } + } + + var arrowStart = shortenIntersection(intersect, p2, r.arrowShapes[srcArShape].spacing(edge) + srcDist); + var edgeStart = shortenIntersection(intersect, p2, r.arrowShapes[srcArShape].gap(edge) + srcDist); + rs.startX = edgeStart[0]; + rs.startY = edgeStart[1]; + rs.arrowStartX = arrowStart[0]; + rs.arrowStartY = arrowStart[1]; + + if (hasEndpts) { + if (!number$1(rs.startX) || !number$1(rs.startY) || !number$1(rs.endX) || !number$1(rs.endY)) { + rs.badLine = true; + } else { + rs.badLine = false; + } + } + }; + + BRp$b.getSourceEndpoint = function (edge) { + var rs = edge[0]._private.rscratch; + this.recalculateRenderedStyle(edge); + + switch (rs.edgeType) { + case 'haystack': + return { + x: rs.haystackPts[0], + y: rs.haystackPts[1] + }; + + default: + return { + x: rs.arrowStartX, + y: rs.arrowStartY + }; + } + }; + + BRp$b.getTargetEndpoint = function (edge) { + var rs = edge[0]._private.rscratch; + this.recalculateRenderedStyle(edge); + + switch (rs.edgeType) { + case 'haystack': + return { + x: rs.haystackPts[2], + y: rs.haystackPts[3] + }; + + default: + return { + x: rs.arrowEndX, + y: rs.arrowEndY + }; + } + }; + + var BRp$a = {}; + + function pushBezierPts(r, edge, pts) { + var qbezierAt$1 = function qbezierAt$1(p1, p2, p3, t) { + return qbezierAt(p1, p2, p3, t); + }; + + var _p = edge._private; + var bpts = _p.rstyle.bezierPts; + + for (var i = 0; i < r.bezierProjPcts.length; i++) { + var p = r.bezierProjPcts[i]; + bpts.push({ + x: qbezierAt$1(pts[0], pts[2], pts[4], p), + y: qbezierAt$1(pts[1], pts[3], pts[5], p) + }); + } + } + + BRp$a.storeEdgeProjections = function (edge) { + var _p = edge._private; + var rs = _p.rscratch; + var et = rs.edgeType; // clear the cached points state + + _p.rstyle.bezierPts = null; + _p.rstyle.linePts = null; + _p.rstyle.haystackPts = null; + + if (et === 'multibezier' || et === 'bezier' || et === 'self' || et === 'compound') { + _p.rstyle.bezierPts = []; + + for (var i = 0; i + 5 < rs.allpts.length; i += 4) { + pushBezierPts(this, edge, rs.allpts.slice(i, i + 6)); + } + } else if (et === 'segments') { + var lpts = _p.rstyle.linePts = []; + + for (var i = 0; i + 1 < rs.allpts.length; i += 2) { + lpts.push({ + x: rs.allpts[i], + y: rs.allpts[i + 1] + }); + } + } else if (et === 'haystack') { + var hpts = rs.haystackPts; + _p.rstyle.haystackPts = [{ + x: hpts[0], + y: hpts[1] + }, { + x: hpts[2], + y: hpts[3] + }]; + } + + _p.rstyle.arrowWidth = this.getArrowWidth(edge.pstyle('width').pfValue, edge.pstyle('arrow-scale').value) * this.arrowShapeWidth; + }; + + BRp$a.recalculateEdgeProjections = function (edges) { + this.findEdgeControlPoints(edges); + }; + + /* global document */ + + var BRp$9 = {}; + + BRp$9.recalculateNodeLabelProjection = function (node) { + var content = node.pstyle('label').strValue; + + if (emptyString(content)) { + return; + } + + var textX, textY; + var _p = node._private; + var nodeWidth = node.width(); + var nodeHeight = node.height(); + var padding = node.padding(); + var nodePos = node.position(); + var textHalign = node.pstyle('text-halign').strValue; + var textValign = node.pstyle('text-valign').strValue; + var rs = _p.rscratch; + var rstyle = _p.rstyle; + + switch (textHalign) { + case 'left': + textX = nodePos.x - nodeWidth / 2 - padding; + break; + + case 'right': + textX = nodePos.x + nodeWidth / 2 + padding; + break; + + default: + // e.g. center + textX = nodePos.x; + } + + switch (textValign) { + case 'top': + textY = nodePos.y - nodeHeight / 2 - padding; + break; + + case 'bottom': + textY = nodePos.y + nodeHeight / 2 + padding; + break; + + default: + // e.g. middle + textY = nodePos.y; + } + + rs.labelX = textX; + rs.labelY = textY; + rstyle.labelX = textX; + rstyle.labelY = textY; + this.calculateLabelAngles(node); + this.applyLabelDimensions(node); + }; + + var lineAngleFromDelta = function lineAngleFromDelta(dx, dy) { + var angle = Math.atan(dy / dx); + + if (dx === 0 && angle < 0) { + angle = angle * -1; + } + + return angle; + }; + + var lineAngle = function lineAngle(p0, p1) { + var dx = p1.x - p0.x; + var dy = p1.y - p0.y; + return lineAngleFromDelta(dx, dy); + }; + + var bezierAngle = function bezierAngle(p0, p1, p2, t) { + var t0 = bound(0, t - 0.001, 1); + var t1 = bound(0, t + 0.001, 1); + var lp0 = qbezierPtAt(p0, p1, p2, t0); + var lp1 = qbezierPtAt(p0, p1, p2, t1); + return lineAngle(lp0, lp1); + }; + + BRp$9.recalculateEdgeLabelProjections = function (edge) { + var p; + var _p = edge._private; + var rs = _p.rscratch; + var r = this; + var content = { + mid: edge.pstyle('label').strValue, + source: edge.pstyle('source-label').strValue, + target: edge.pstyle('target-label').strValue + }; + + if (content.mid || content.source || content.target) ; else { + return; // no labels => no calcs + } // add center point to style so bounding box calculations can use it + // + + + p = { + x: rs.midX, + y: rs.midY + }; + + var setRs = function setRs(propName, prefix, value) { + setPrefixedProperty(_p.rscratch, propName, prefix, value); + setPrefixedProperty(_p.rstyle, propName, prefix, value); + }; + + setRs('labelX', null, p.x); + setRs('labelY', null, p.y); + var midAngle = lineAngleFromDelta(rs.midDispX, rs.midDispY); + setRs('labelAutoAngle', null, midAngle); + + var createControlPointInfo = function createControlPointInfo() { + if (createControlPointInfo.cache) { + return createControlPointInfo.cache; + } // use cache so only 1x per edge + + + var ctrlpts = []; // store each ctrlpt info init + + for (var i = 0; i + 5 < rs.allpts.length; i += 4) { + var p0 = { + x: rs.allpts[i], + y: rs.allpts[i + 1] + }; + var p1 = { + x: rs.allpts[i + 2], + y: rs.allpts[i + 3] + }; // ctrlpt + + var p2 = { + x: rs.allpts[i + 4], + y: rs.allpts[i + 5] + }; + ctrlpts.push({ + p0: p0, + p1: p1, + p2: p2, + startDist: 0, + length: 0, + segments: [] + }); + } + + var bpts = _p.rstyle.bezierPts; + var nProjs = r.bezierProjPcts.length; + + function addSegment(cp, p0, p1, t0, t1) { + var length = dist(p0, p1); + var prevSegment = cp.segments[cp.segments.length - 1]; + var segment = { + p0: p0, + p1: p1, + t0: t0, + t1: t1, + startDist: prevSegment ? prevSegment.startDist + prevSegment.length : 0, + length: length + }; + cp.segments.push(segment); + cp.length += length; + } // update each ctrlpt with segment info + + + for (var _i = 0; _i < ctrlpts.length; _i++) { + var cp = ctrlpts[_i]; + var prevCp = ctrlpts[_i - 1]; + + if (prevCp) { + cp.startDist = prevCp.startDist + prevCp.length; + } + + addSegment(cp, cp.p0, bpts[_i * nProjs], 0, r.bezierProjPcts[0]); // first + + for (var j = 0; j < nProjs - 1; j++) { + addSegment(cp, bpts[_i * nProjs + j], bpts[_i * nProjs + j + 1], r.bezierProjPcts[j], r.bezierProjPcts[j + 1]); + } + + addSegment(cp, bpts[_i * nProjs + nProjs - 1], cp.p2, r.bezierProjPcts[nProjs - 1], 1); // last + } + + return createControlPointInfo.cache = ctrlpts; + }; + + var calculateEndProjection = function calculateEndProjection(prefix) { + var angle; + var isSrc = prefix === 'source'; + + if (!content[prefix]) { + return; + } + + var offset = edge.pstyle(prefix + '-text-offset').pfValue; + + switch (rs.edgeType) { + case 'self': + case 'compound': + case 'bezier': + case 'multibezier': + { + var cps = createControlPointInfo(); + var selected; + var startDist = 0; + var totalDist = 0; // find the segment we're on + + for (var i = 0; i < cps.length; i++) { + var _cp = cps[isSrc ? i : cps.length - 1 - i]; + + for (var j = 0; j < _cp.segments.length; j++) { + var _seg = _cp.segments[isSrc ? j : _cp.segments.length - 1 - j]; + var lastSeg = i === cps.length - 1 && j === _cp.segments.length - 1; + startDist = totalDist; + totalDist += _seg.length; + + if (totalDist >= offset || lastSeg) { + selected = { + cp: _cp, + segment: _seg + }; + break; + } + } + + if (selected) { + break; + } + } + + var cp = selected.cp; + var seg = selected.segment; + var tSegment = (offset - startDist) / seg.length; + var segDt = seg.t1 - seg.t0; + var t = isSrc ? seg.t0 + segDt * tSegment : seg.t1 - segDt * tSegment; + t = bound(0, t, 1); + p = qbezierPtAt(cp.p0, cp.p1, cp.p2, t); + angle = bezierAngle(cp.p0, cp.p1, cp.p2, t); + break; + } + + case 'straight': + case 'segments': + case 'haystack': + { + var d = 0, + di, + d0; + var p0, p1; + var l = rs.allpts.length; + + for (var _i2 = 0; _i2 + 3 < l; _i2 += 2) { + if (isSrc) { + p0 = { + x: rs.allpts[_i2], + y: rs.allpts[_i2 + 1] + }; + p1 = { + x: rs.allpts[_i2 + 2], + y: rs.allpts[_i2 + 3] + }; + } else { + p0 = { + x: rs.allpts[l - 2 - _i2], + y: rs.allpts[l - 1 - _i2] + }; + p1 = { + x: rs.allpts[l - 4 - _i2], + y: rs.allpts[l - 3 - _i2] + }; + } + + di = dist(p0, p1); + d0 = d; + d += di; + + if (d >= offset) { + break; + } + } + + var pD = offset - d0; + + var _t = pD / di; + + _t = bound(0, _t, 1); + p = lineAt(p0, p1, _t); + angle = lineAngle(p0, p1); + break; + } + } + + setRs('labelX', prefix, p.x); + setRs('labelY', prefix, p.y); + setRs('labelAutoAngle', prefix, angle); + }; + + calculateEndProjection('source'); + calculateEndProjection('target'); + this.applyLabelDimensions(edge); + }; + + BRp$9.applyLabelDimensions = function (ele) { + this.applyPrefixedLabelDimensions(ele); + + if (ele.isEdge()) { + this.applyPrefixedLabelDimensions(ele, 'source'); + this.applyPrefixedLabelDimensions(ele, 'target'); + } + }; + + BRp$9.applyPrefixedLabelDimensions = function (ele, prefix) { + var _p = ele._private; + var text = this.getLabelText(ele, prefix); + var labelDims = this.calculateLabelDimensions(ele, text); + var lineHeight = ele.pstyle('line-height').pfValue; + var textWrap = ele.pstyle('text-wrap').strValue; + var lines = getPrefixedProperty(_p.rscratch, 'labelWrapCachedLines', prefix) || []; + var numLines = textWrap !== 'wrap' ? 1 : Math.max(lines.length, 1); + var normPerLineHeight = labelDims.height / numLines; + var labelLineHeight = normPerLineHeight * lineHeight; + var width = labelDims.width; + var height = labelDims.height + (numLines - 1) * (lineHeight - 1) * normPerLineHeight; + setPrefixedProperty(_p.rstyle, 'labelWidth', prefix, width); + setPrefixedProperty(_p.rscratch, 'labelWidth', prefix, width); + setPrefixedProperty(_p.rstyle, 'labelHeight', prefix, height); + setPrefixedProperty(_p.rscratch, 'labelHeight', prefix, height); + setPrefixedProperty(_p.rscratch, 'labelLineHeight', prefix, labelLineHeight); + }; + + BRp$9.getLabelText = function (ele, prefix) { + var _p = ele._private; + var pfd = prefix ? prefix + '-' : ''; + var text = ele.pstyle(pfd + 'label').strValue; + var textTransform = ele.pstyle('text-transform').value; + + var rscratch = function rscratch(propName, value) { + if (value) { + setPrefixedProperty(_p.rscratch, propName, prefix, value); + return value; + } else { + return getPrefixedProperty(_p.rscratch, propName, prefix); + } + }; // for empty text, skip all processing + + + if (!text) { + return ''; + } + + if (textTransform == 'none') ; else if (textTransform == 'uppercase') { + text = text.toUpperCase(); + } else if (textTransform == 'lowercase') { + text = text.toLowerCase(); + } + + var wrapStyle = ele.pstyle('text-wrap').value; + + if (wrapStyle === 'wrap') { + var labelKey = rscratch('labelKey'); // save recalc if the label is the same as before + + if (labelKey != null && rscratch('labelWrapKey') === labelKey) { + return rscratch('labelWrapCachedText'); + } + + var zwsp = "\u200B"; + var lines = text.split('\n'); + var maxW = ele.pstyle('text-max-width').pfValue; + var overflow = ele.pstyle('text-overflow-wrap').value; + var overflowAny = overflow === 'anywhere'; + var wrappedLines = []; + var wordsRegex = /[\s\u200b]+/; + var wordSeparator = overflowAny ? '' : ' '; + + for (var l = 0; l < lines.length; l++) { + var line = lines[l]; + var lineDims = this.calculateLabelDimensions(ele, line); + var lineW = lineDims.width; + + if (overflowAny) { + var processedLine = line.split('').join(zwsp); + line = processedLine; + } + + if (lineW > maxW) { + // line is too long + var words = line.split(wordsRegex); + var subline = ''; + + for (var w = 0; w < words.length; w++) { + var word = words[w]; + var testLine = subline.length === 0 ? word : subline + wordSeparator + word; + var testDims = this.calculateLabelDimensions(ele, testLine); + var testW = testDims.width; + + if (testW <= maxW) { + // word fits on current line + subline += word + wordSeparator; + } else { + // word starts new line + if (subline) { + wrappedLines.push(subline); + } + + subline = word + wordSeparator; + } + } // if there's remaining text, put it in a wrapped line + + + if (!subline.match(/^[\s\u200b]+$/)) { + wrappedLines.push(subline); + } + } else { + // line is already short enough + wrappedLines.push(line); + } + } // for + + + rscratch('labelWrapCachedLines', wrappedLines); + text = rscratch('labelWrapCachedText', wrappedLines.join('\n')); + rscratch('labelWrapKey', labelKey); + } else if (wrapStyle === 'ellipsis') { + var _maxW = ele.pstyle('text-max-width').pfValue; + var ellipsized = ''; + var ellipsis = "\u2026"; + var incLastCh = false; + + if (this.calculateLabelDimensions(ele, text).width < _maxW) { + // the label already fits + return text; + } + + for (var i = 0; i < text.length; i++) { + var widthWithNextCh = this.calculateLabelDimensions(ele, ellipsized + text[i] + ellipsis).width; + + if (widthWithNextCh > _maxW) { + break; + } + + ellipsized += text[i]; + + if (i === text.length - 1) { + incLastCh = true; + } + } + + if (!incLastCh) { + ellipsized += ellipsis; + } + + return ellipsized; + } // if ellipsize + + + return text; + }; + + BRp$9.getLabelJustification = function (ele) { + var justification = ele.pstyle('text-justification').strValue; + var textHalign = ele.pstyle('text-halign').strValue; + + if (justification === 'auto') { + if (ele.isNode()) { + switch (textHalign) { + case 'left': + return 'right'; + + case 'right': + return 'left'; + + default: + return 'center'; + } + } else { + return 'center'; + } + } else { + return justification; + } + }; + + BRp$9.calculateLabelDimensions = function (ele, text) { + var r = this; + var cacheKey = hashString(text, ele._private.labelDimsKey); + var cache = r.labelDimCache || (r.labelDimCache = []); + var existingVal = cache[cacheKey]; + + if (existingVal != null) { + return existingVal; + } + + var padding = 0; // add padding around text dims, as the measurement isn't that accurate + + var fStyle = ele.pstyle('font-style').strValue; + var size = ele.pstyle('font-size').pfValue; + var family = ele.pstyle('font-family').strValue; + var weight = ele.pstyle('font-weight').strValue; + var canvas = this.labelCalcCanvas; + var c2d = this.labelCalcCanvasContext; + + if (!canvas) { + canvas = this.labelCalcCanvas = document.createElement('canvas'); + c2d = this.labelCalcCanvasContext = canvas.getContext('2d'); + var ds = canvas.style; + ds.position = 'absolute'; + ds.left = '-9999px'; + ds.top = '-9999px'; + ds.zIndex = '-1'; + ds.visibility = 'hidden'; + ds.pointerEvents = 'none'; + } + + c2d.font = "".concat(fStyle, " ").concat(weight, " ").concat(size, "px ").concat(family); + var width = 0; + var height = 0; + var lines = text.split('\n'); + + for (var i = 0; i < lines.length; i++) { + var line = lines[i]; + var metrics = c2d.measureText(line); + var w = Math.ceil(metrics.width); + var h = size; + width = Math.max(w, width); + height += h; + } + + width += padding; + height += padding; + return cache[cacheKey] = { + width: width, + height: height + }; + }; + + BRp$9.calculateLabelAngle = function (ele, prefix) { + var _p = ele._private; + var rs = _p.rscratch; + var isEdge = ele.isEdge(); + var prefixDash = prefix ? prefix + '-' : ''; + var rot = ele.pstyle(prefixDash + 'text-rotation'); + var rotStr = rot.strValue; + + if (rotStr === 'none') { + return 0; + } else if (isEdge && rotStr === 'autorotate') { + return rs.labelAutoAngle; + } else if (rotStr === 'autorotate') { + return 0; + } else { + return rot.pfValue; + } + }; + + BRp$9.calculateLabelAngles = function (ele) { + var r = this; + var isEdge = ele.isEdge(); + var _p = ele._private; + var rs = _p.rscratch; + rs.labelAngle = r.calculateLabelAngle(ele); + + if (isEdge) { + rs.sourceLabelAngle = r.calculateLabelAngle(ele, 'source'); + rs.targetLabelAngle = r.calculateLabelAngle(ele, 'target'); + } + }; + + var BRp$8 = {}; + var TOO_SMALL_CUT_RECT = 28; + var warnedCutRect = false; + + BRp$8.getNodeShape = function (node) { + var r = this; + var shape = node.pstyle('shape').value; + + if (shape === 'cutrectangle' && (node.width() < TOO_SMALL_CUT_RECT || node.height() < TOO_SMALL_CUT_RECT)) { + if (!warnedCutRect) { + warn('The `cutrectangle` node shape can not be used at small sizes so `rectangle` is used instead'); + warnedCutRect = true; + } + + return 'rectangle'; + } + + if (node.isParent()) { + if (shape === 'rectangle' || shape === 'roundrectangle' || shape === 'round-rectangle' || shape === 'cutrectangle' || shape === 'cut-rectangle' || shape === 'barrel') { + return shape; + } else { + return 'rectangle'; + } + } + + if (shape === 'polygon') { + var points = node.pstyle('shape-polygon-points').value; + return r.nodeShapes.makePolygon(points).name; + } + + return shape; + }; + + var BRp$7 = {}; + + BRp$7.registerCalculationListeners = function () { + var cy = this.cy; + var elesToUpdate = cy.collection(); + var r = this; + + var enqueue = function enqueue(eles) { + var dirtyStyleCaches = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + elesToUpdate.merge(eles); + + if (dirtyStyleCaches) { + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + var _p = ele._private; + var rstyle = _p.rstyle; + rstyle.clean = false; + rstyle.cleanConnected = false; + } + } + }; + + r.binder(cy).on('bounds.* dirty.*', function onDirtyBounds(e) { + var ele = e.target; + enqueue(ele); + }).on('style.* background.*', function onDirtyStyle(e) { + var ele = e.target; + enqueue(ele, false); + }); + + var updateEleCalcs = function updateEleCalcs(willDraw) { + if (willDraw) { + var fns = r.onUpdateEleCalcsFns; // because we need to have up-to-date style (e.g. stylesheet mappers) + // before calculating rendered style (and pstyle might not be called yet) + + elesToUpdate.cleanStyle(); + + for (var i = 0; i < elesToUpdate.length; i++) { + var ele = elesToUpdate[i]; + var rstyle = ele._private.rstyle; + + if (ele.isNode() && !rstyle.cleanConnected) { + enqueue(ele.connectedEdges()); + rstyle.cleanConnected = true; + } + } + + if (fns) { + for (var _i = 0; _i < fns.length; _i++) { + var fn = fns[_i]; + fn(willDraw, elesToUpdate); + } + } + + r.recalculateRenderedStyle(elesToUpdate); + elesToUpdate = cy.collection(); + } + }; + + r.flushRenderedStyleQueue = function () { + updateEleCalcs(true); + }; + + r.beforeRender(updateEleCalcs, r.beforeRenderPriorities.eleCalcs); + }; + + BRp$7.onUpdateEleCalcs = function (fn) { + var fns = this.onUpdateEleCalcsFns = this.onUpdateEleCalcsFns || []; + fns.push(fn); + }; + + BRp$7.recalculateRenderedStyle = function (eles, useCache) { + var isCleanConnected = function isCleanConnected(ele) { + return ele._private.rstyle.cleanConnected; + }; + + var edges = []; + var nodes = []; // the renderer can't be used for calcs when destroyed, e.g. ele.boundingBox() + + if (this.destroyed) { + return; + } // use cache by default for perf + + + if (useCache === undefined) { + useCache = true; + } + + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + var _p = ele._private; + var rstyle = _p.rstyle; // an edge may be implicitly dirty b/c of one of its connected nodes + // (and a request for recalc may come in between frames) + + if (ele.isEdge() && (!isCleanConnected(ele.source()) || !isCleanConnected(ele.target()))) { + rstyle.clean = false; + } // only update if dirty and in graph + + + if (useCache && rstyle.clean || ele.removed()) { + continue; + } // only update if not display: none + + + if (ele.pstyle('display').value === 'none') { + continue; + } + + if (_p.group === 'nodes') { + nodes.push(ele); + } else { + // edges + edges.push(ele); + } + + rstyle.clean = true; + } // update node data from projections + + + for (var _i2 = 0; _i2 < nodes.length; _i2++) { + var _ele = nodes[_i2]; + var _p2 = _ele._private; + var _rstyle = _p2.rstyle; + + var pos = _ele.position(); + + this.recalculateNodeLabelProjection(_ele); + _rstyle.nodeX = pos.x; + _rstyle.nodeY = pos.y; + _rstyle.nodeW = _ele.pstyle('width').pfValue; + _rstyle.nodeH = _ele.pstyle('height').pfValue; + } + + this.recalculateEdgeProjections(edges); // update edge data from projections + + for (var _i3 = 0; _i3 < edges.length; _i3++) { + var _ele2 = edges[_i3]; + var _p3 = _ele2._private; + var _rstyle2 = _p3.rstyle; + var rs = _p3.rscratch; // update rstyle positions + + _rstyle2.srcX = rs.arrowStartX; + _rstyle2.srcY = rs.arrowStartY; + _rstyle2.tgtX = rs.arrowEndX; + _rstyle2.tgtY = rs.arrowEndY; + _rstyle2.midX = rs.midX; + _rstyle2.midY = rs.midY; + _rstyle2.labelAngle = rs.labelAngle; + _rstyle2.sourceLabelAngle = rs.sourceLabelAngle; + _rstyle2.targetLabelAngle = rs.targetLabelAngle; + } + }; + + var BRp$6 = {}; + + BRp$6.updateCachedGrabbedEles = function () { + var eles = this.cachedZSortedEles; + + if (!eles) { + // just let this be recalculated on the next z sort tick + return; + } + + eles.drag = []; + eles.nondrag = []; + var grabTargets = []; + + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + var rs = ele._private.rscratch; + + if (ele.grabbed() && !ele.isParent()) { + grabTargets.push(ele); + } else if (rs.inDragLayer) { + eles.drag.push(ele); + } else { + eles.nondrag.push(ele); + } + } // put the grab target nodes last so it's on top of its neighbourhood + + + for (var i = 0; i < grabTargets.length; i++) { + var ele = grabTargets[i]; + eles.drag.push(ele); + } + }; + + BRp$6.invalidateCachedZSortedEles = function () { + this.cachedZSortedEles = null; + }; + + BRp$6.getCachedZSortedEles = function (forceRecalc) { + if (forceRecalc || !this.cachedZSortedEles) { + var eles = this.cy.mutableElements().toArray(); + eles.sort(zIndexSort); + eles.interactive = eles.filter(function (ele) { + return ele.interactive(); + }); + this.cachedZSortedEles = eles; + this.updateCachedGrabbedEles(); + } else { + eles = this.cachedZSortedEles; + } + + return eles; + }; + + var BRp$5 = {}; + [BRp$e, BRp$d, BRp$c, BRp$b, BRp$a, BRp$9, BRp$8, BRp$7, BRp$6].forEach(function (props) { + extend(BRp$5, props); + }); + + var BRp$4 = {}; + + BRp$4.getCachedImage = function (url, crossOrigin, onLoad) { + var r = this; + var imageCache = r.imageCache = r.imageCache || {}; + var cache = imageCache[url]; + + if (cache) { + if (!cache.image.complete) { + cache.image.addEventListener('load', onLoad); + } + + return cache.image; + } else { + cache = imageCache[url] = imageCache[url] || {}; + var image = cache.image = new Image(); // eslint-disable-line no-undef + + image.addEventListener('load', onLoad); + image.addEventListener('error', function () { + image.error = true; + }); // #1582 safari doesn't load data uris with crossOrigin properly + // https://bugs.webkit.org/show_bug.cgi?id=123978 + + var dataUriPrefix = 'data:'; + var isDataUri = url.substring(0, dataUriPrefix.length).toLowerCase() === dataUriPrefix; + + if (!isDataUri) { + // if crossorigin is 'null'(stringified), then manually set it to null + crossOrigin = crossOrigin === 'null' ? null : crossOrigin; + image.crossOrigin = crossOrigin; // prevent tainted canvas + } + + image.src = url; + return image; + } + }; + + var BRp$3 = {}; + /* global document, window, ResizeObserver, MutationObserver */ + + BRp$3.registerBinding = function (target, event, handler, useCapture) { + // eslint-disable-line no-unused-vars + var args = Array.prototype.slice.apply(arguments, [1]); // copy + + var b = this.binder(target); + return b.on.apply(b, args); + }; + + BRp$3.binder = function (tgt) { + var r = this; + var containerWindow = r.cy.window(); + var tgtIsDom = tgt === containerWindow || tgt === containerWindow.document || tgt === containerWindow.document.body || domElement(tgt); + + if (r.supportsPassiveEvents == null) { + // from https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md#feature-detection + var supportsPassive = false; + + try { + var opts = Object.defineProperty({}, 'passive', { + get: function get() { + supportsPassive = true; + return true; + } + }); + containerWindow.addEventListener('test', null, opts); + } catch (err) {// not supported + } + + r.supportsPassiveEvents = supportsPassive; + } + + var on = function on(event, handler, useCapture) { + var args = Array.prototype.slice.call(arguments); + + if (tgtIsDom && r.supportsPassiveEvents) { + // replace useCapture w/ opts obj + args[2] = { + capture: useCapture != null ? useCapture : false, + passive: false, + once: false + }; + } + + r.bindings.push({ + target: tgt, + args: args + }); + (tgt.addEventListener || tgt.on).apply(tgt, args); + return this; + }; + + return { + on: on, + addEventListener: on, + addListener: on, + bind: on + }; + }; + + BRp$3.nodeIsDraggable = function (node) { + return node && node.isNode() && !node.locked() && node.grabbable(); + }; + + BRp$3.nodeIsGrabbable = function (node) { + return this.nodeIsDraggable(node) && node.interactive(); + }; + + BRp$3.load = function () { + var r = this; + var containerWindow = r.cy.window(); + + var isSelected = function isSelected(ele) { + return ele.selected(); + }; + + var triggerEvents = function triggerEvents(target, names, e, position) { + if (target == null) { + target = r.cy; + } + + for (var i = 0; i < names.length; i++) { + var name = names[i]; + target.emit({ + originalEvent: e, + type: name, + position: position + }); + } + }; + + var isMultSelKeyDown = function isMultSelKeyDown(e) { + return e.shiftKey || e.metaKey || e.ctrlKey; // maybe e.altKey + }; + + var allowPanningPassthrough = function allowPanningPassthrough(down, downs) { + var allowPassthrough = true; + + if (r.cy.hasCompoundNodes() && down && down.pannable()) { + // a grabbable compound node below the ele => no passthrough panning + for (var i = 0; downs && i < downs.length; i++) { + var down = downs[i]; //if any parent node in event hierarchy isn't pannable, reject passthrough + + if (down.isNode() && down.isParent() && !down.pannable()) { + allowPassthrough = false; + break; + } + } + } else { + allowPassthrough = true; + } + + return allowPassthrough; + }; + + var setGrabbed = function setGrabbed(ele) { + ele[0]._private.grabbed = true; + }; + + var setFreed = function setFreed(ele) { + ele[0]._private.grabbed = false; + }; + + var setInDragLayer = function setInDragLayer(ele) { + ele[0]._private.rscratch.inDragLayer = true; + }; + + var setOutDragLayer = function setOutDragLayer(ele) { + ele[0]._private.rscratch.inDragLayer = false; + }; + + var setGrabTarget = function setGrabTarget(ele) { + ele[0]._private.rscratch.isGrabTarget = true; + }; + + var removeGrabTarget = function removeGrabTarget(ele) { + ele[0]._private.rscratch.isGrabTarget = false; + }; + + var addToDragList = function addToDragList(ele, opts) { + var list = opts.addToList; + var listHasEle = list.has(ele); + + if (!listHasEle && ele.grabbable() && !ele.locked()) { + list.merge(ele); + setGrabbed(ele); + } + }; // helper function to determine which child nodes and inner edges + // of a compound node to be dragged as well as the grabbed and selected nodes + + + var addDescendantsToDrag = function addDescendantsToDrag(node, opts) { + if (!node.cy().hasCompoundNodes()) { + return; + } + + if (opts.inDragLayer == null && opts.addToList == null) { + return; + } // nothing to do + + + var innerNodes = node.descendants(); + + if (opts.inDragLayer) { + innerNodes.forEach(setInDragLayer); + innerNodes.connectedEdges().forEach(setInDragLayer); + } + + if (opts.addToList) { + addToDragList(innerNodes, opts); + } + }; // adds the given nodes and its neighbourhood to the drag layer + + + var addNodesToDrag = function addNodesToDrag(nodes, opts) { + opts = opts || {}; + var hasCompoundNodes = nodes.cy().hasCompoundNodes(); + + if (opts.inDragLayer) { + nodes.forEach(setInDragLayer); + nodes.neighborhood().stdFilter(function (ele) { + return !hasCompoundNodes || ele.isEdge(); + }).forEach(setInDragLayer); + } + + if (opts.addToList) { + nodes.forEach(function (ele) { + addToDragList(ele, opts); + }); + } + + addDescendantsToDrag(nodes, opts); // always add to drag + // also add nodes and edges related to the topmost ancestor + + updateAncestorsInDragLayer(nodes, { + inDragLayer: opts.inDragLayer + }); + r.updateCachedGrabbedEles(); + }; + + var addNodeToDrag = addNodesToDrag; + + var freeDraggedElements = function freeDraggedElements(grabbedEles) { + if (!grabbedEles) { + return; + } // just go over all elements rather than doing a bunch of (possibly expensive) traversals + + + r.getCachedZSortedEles().forEach(function (ele) { + setFreed(ele); + setOutDragLayer(ele); + removeGrabTarget(ele); + }); + r.updateCachedGrabbedEles(); + }; // helper function to determine which ancestor nodes and edges should go + // to the drag layer (or should be removed from drag layer). + + + var updateAncestorsInDragLayer = function updateAncestorsInDragLayer(node, opts) { + if (opts.inDragLayer == null && opts.addToList == null) { + return; + } // nothing to do + + + if (!node.cy().hasCompoundNodes()) { + return; + } // find top-level parent + + + var parent = node.ancestors().orphans(); // no parent node: no nodes to add to the drag layer + + if (parent.same(node)) { + return; + } + + var nodes = parent.descendants().spawnSelf().merge(parent).unmerge(node).unmerge(node.descendants()); + var edges = nodes.connectedEdges(); + + if (opts.inDragLayer) { + edges.forEach(setInDragLayer); + nodes.forEach(setInDragLayer); + } + + if (opts.addToList) { + nodes.forEach(function (ele) { + addToDragList(ele, opts); + }); + } + }; + + var blurActiveDomElement = function blurActiveDomElement() { + if (document.activeElement != null && document.activeElement.blur != null) { + document.activeElement.blur(); + } + }; + + var haveMutationsApi = typeof MutationObserver !== 'undefined'; + var haveResizeObserverApi = typeof ResizeObserver !== 'undefined'; // watch for when the cy container is removed from the dom + + if (haveMutationsApi) { + r.removeObserver = new MutationObserver(function (mutns) { + // eslint-disable-line no-undef + for (var i = 0; i < mutns.length; i++) { + var mutn = mutns[i]; + var rNodes = mutn.removedNodes; + + if (rNodes) { + for (var j = 0; j < rNodes.length; j++) { + var rNode = rNodes[j]; + + if (rNode === r.container) { + r.destroy(); + break; + } + } + } + } + }); + + if (r.container.parentNode) { + r.removeObserver.observe(r.container.parentNode, { + childList: true + }); + } + } else { + r.registerBinding(r.container, 'DOMNodeRemoved', function (e) { + // eslint-disable-line no-unused-vars + r.destroy(); + }); + } + + var onResize = debounce_1(function () { + r.cy.resize(); + }, 100); + + if (haveMutationsApi) { + r.styleObserver = new MutationObserver(onResize); // eslint-disable-line no-undef + + r.styleObserver.observe(r.container, { + attributes: true + }); + } // auto resize + + + r.registerBinding(containerWindow, 'resize', onResize); // eslint-disable-line no-undef + + if (haveResizeObserverApi) { + r.resizeObserver = new ResizeObserver(onResize); // eslint-disable-line no-undef + + r.resizeObserver.observe(r.container); + } + + var forEachUp = function forEachUp(domEle, fn) { + while (domEle != null) { + fn(domEle); + domEle = domEle.parentNode; + } + }; + + var invalidateCoords = function invalidateCoords() { + r.invalidateContainerClientCoordsCache(); + }; + + forEachUp(r.container, function (domEle) { + r.registerBinding(domEle, 'transitionend', invalidateCoords); + r.registerBinding(domEle, 'animationend', invalidateCoords); + r.registerBinding(domEle, 'scroll', invalidateCoords); + }); // stop right click menu from appearing on cy + + r.registerBinding(r.container, 'contextmenu', function (e) { + e.preventDefault(); + }); + + var inBoxSelection = function inBoxSelection() { + return r.selection[4] !== 0; + }; + + var eventInContainer = function eventInContainer(e) { + // save cycles if mouse events aren't to be captured + var containerPageCoords = r.findContainerClientCoords(); + var x = containerPageCoords[0]; + var y = containerPageCoords[1]; + var width = containerPageCoords[2]; + var height = containerPageCoords[3]; + var positions = e.touches ? e.touches : [e]; + var atLeastOnePosInside = false; + + for (var i = 0; i < positions.length; i++) { + var p = positions[i]; + + if (x <= p.clientX && p.clientX <= x + width && y <= p.clientY && p.clientY <= y + height) { + atLeastOnePosInside = true; + break; + } + } + + if (!atLeastOnePosInside) { + return false; + } + + var container = r.container; + var target = e.target; + var tParent = target.parentNode; + var containerIsTarget = false; + + while (tParent) { + if (tParent === container) { + containerIsTarget = true; + break; + } + + tParent = tParent.parentNode; + } + + if (!containerIsTarget) { + return false; + } // if target is outisde cy container, then this event is not for us + + + return true; + }; // Primary key + + + r.registerBinding(r.container, 'mousedown', function mousedownHandler(e) { + if (!eventInContainer(e)) { + return; + } + + e.preventDefault(); + blurActiveDomElement(); + r.hoverData.capture = true; + r.hoverData.which = e.which; + var cy = r.cy; + var gpos = [e.clientX, e.clientY]; + var pos = r.projectIntoViewport(gpos[0], gpos[1]); + var select = r.selection; + var nears = r.findNearestElements(pos[0], pos[1], true, false); + var near = nears[0]; + var draggedElements = r.dragData.possibleDragElements; + r.hoverData.mdownPos = pos; + r.hoverData.mdownGPos = gpos; + + var checkForTaphold = function checkForTaphold() { + r.hoverData.tapholdCancelled = false; + clearTimeout(r.hoverData.tapholdTimeout); + r.hoverData.tapholdTimeout = setTimeout(function () { + if (r.hoverData.tapholdCancelled) { + return; + } else { + var ele = r.hoverData.down; + + if (ele) { + ele.emit({ + originalEvent: e, + type: 'taphold', + position: { + x: pos[0], + y: pos[1] + } + }); + } else { + cy.emit({ + originalEvent: e, + type: 'taphold', + position: { + x: pos[0], + y: pos[1] + } + }); + } + } + }, r.tapholdDuration); + }; // Right click button + + + if (e.which == 3) { + r.hoverData.cxtStarted = true; + var cxtEvt = { + originalEvent: e, + type: 'cxttapstart', + position: { + x: pos[0], + y: pos[1] + } + }; + + if (near) { + near.activate(); + near.emit(cxtEvt); + r.hoverData.down = near; + } else { + cy.emit(cxtEvt); + } + + r.hoverData.downTime = new Date().getTime(); + r.hoverData.cxtDragged = false; // Primary button + } else if (e.which == 1) { + if (near) { + near.activate(); + } // Element dragging + + + { + // If something is under the cursor and it is draggable, prepare to grab it + if (near != null) { + if (r.nodeIsGrabbable(near)) { + var makeEvent = function makeEvent(type) { + return { + originalEvent: e, + type: type, + position: { + x: pos[0], + y: pos[1] + } + }; + }; + + var triggerGrab = function triggerGrab(ele) { + ele.emit(makeEvent('grab')); + }; + + setGrabTarget(near); + + if (!near.selected()) { + draggedElements = r.dragData.possibleDragElements = cy.collection(); + addNodeToDrag(near, { + addToList: draggedElements + }); + near.emit(makeEvent('grabon')).emit(makeEvent('grab')); + } else { + draggedElements = r.dragData.possibleDragElements = cy.collection(); + var selectedNodes = cy.$(function (ele) { + return ele.isNode() && ele.selected() && r.nodeIsGrabbable(ele); + }); + addNodesToDrag(selectedNodes, { + addToList: draggedElements + }); + near.emit(makeEvent('grabon')); + selectedNodes.forEach(triggerGrab); + } + + r.redrawHint('eles', true); + r.redrawHint('drag', true); + } + } + + r.hoverData.down = near; + r.hoverData.downs = nears; + r.hoverData.downTime = new Date().getTime(); + } + triggerEvents(near, ['mousedown', 'tapstart', 'vmousedown'], e, { + x: pos[0], + y: pos[1] + }); + + if (near == null) { + select[4] = 1; + r.data.bgActivePosistion = { + x: pos[0], + y: pos[1] + }; + r.redrawHint('select', true); + r.redraw(); + } else if (near.pannable()) { + select[4] = 1; // for future pan + } + + checkForTaphold(); + } // Initialize selection box coordinates + + + select[0] = select[2] = pos[0]; + select[1] = select[3] = pos[1]; + }, false); + r.registerBinding(containerWindow, 'mousemove', function mousemoveHandler(e) { + // eslint-disable-line no-undef + var capture = r.hoverData.capture; + + if (!capture && !eventInContainer(e)) { + return; + } + + var preventDefault = false; + var cy = r.cy; + var zoom = cy.zoom(); + var gpos = [e.clientX, e.clientY]; + var pos = r.projectIntoViewport(gpos[0], gpos[1]); + var mdownPos = r.hoverData.mdownPos; + var mdownGPos = r.hoverData.mdownGPos; + var select = r.selection; + var near = null; + + if (!r.hoverData.draggingEles && !r.hoverData.dragging && !r.hoverData.selecting) { + near = r.findNearestElement(pos[0], pos[1], true, false); + } + + var last = r.hoverData.last; + var down = r.hoverData.down; + var disp = [pos[0] - select[2], pos[1] - select[3]]; + var draggedElements = r.dragData.possibleDragElements; + var isOverThresholdDrag; + + if (mdownGPos) { + var dx = gpos[0] - mdownGPos[0]; + var dx2 = dx * dx; + var dy = gpos[1] - mdownGPos[1]; + var dy2 = dy * dy; + var dist2 = dx2 + dy2; + r.hoverData.isOverThresholdDrag = isOverThresholdDrag = dist2 >= r.desktopTapThreshold2; + } + + var multSelKeyDown = isMultSelKeyDown(e); + + if (isOverThresholdDrag) { + r.hoverData.tapholdCancelled = true; + } + + var updateDragDelta = function updateDragDelta() { + var dragDelta = r.hoverData.dragDelta = r.hoverData.dragDelta || []; + + if (dragDelta.length === 0) { + dragDelta.push(disp[0]); + dragDelta.push(disp[1]); + } else { + dragDelta[0] += disp[0]; + dragDelta[1] += disp[1]; + } + }; + + preventDefault = true; + triggerEvents(near, ['mousemove', 'vmousemove', 'tapdrag'], e, { + x: pos[0], + y: pos[1] + }); + + var goIntoBoxMode = function goIntoBoxMode() { + r.data.bgActivePosistion = undefined; + + if (!r.hoverData.selecting) { + cy.emit({ + originalEvent: e, + type: 'boxstart', + position: { + x: pos[0], + y: pos[1] + } + }); + } + + select[4] = 1; + r.hoverData.selecting = true; + r.redrawHint('select', true); + r.redraw(); + }; // trigger context drag if rmouse down + + + if (r.hoverData.which === 3) { + // but only if over threshold + if (isOverThresholdDrag) { + var cxtEvt = { + originalEvent: e, + type: 'cxtdrag', + position: { + x: pos[0], + y: pos[1] + } + }; + + if (down) { + down.emit(cxtEvt); + } else { + cy.emit(cxtEvt); + } + + r.hoverData.cxtDragged = true; + + if (!r.hoverData.cxtOver || near !== r.hoverData.cxtOver) { + if (r.hoverData.cxtOver) { + r.hoverData.cxtOver.emit({ + originalEvent: e, + type: 'cxtdragout', + position: { + x: pos[0], + y: pos[1] + } + }); + } + + r.hoverData.cxtOver = near; + + if (near) { + near.emit({ + originalEvent: e, + type: 'cxtdragover', + position: { + x: pos[0], + y: pos[1] + } + }); + } + } + } // Check if we are drag panning the entire graph + + } else if (r.hoverData.dragging) { + preventDefault = true; + + if (cy.panningEnabled() && cy.userPanningEnabled()) { + var deltaP; + + if (r.hoverData.justStartedPan) { + var mdPos = r.hoverData.mdownPos; + deltaP = { + x: (pos[0] - mdPos[0]) * zoom, + y: (pos[1] - mdPos[1]) * zoom + }; + r.hoverData.justStartedPan = false; + } else { + deltaP = { + x: disp[0] * zoom, + y: disp[1] * zoom + }; + } + + cy.panBy(deltaP); + cy.emit('dragpan'); + r.hoverData.dragged = true; + } // Needs reproject due to pan changing viewport + + + pos = r.projectIntoViewport(e.clientX, e.clientY); // Checks primary button down & out of time & mouse not moved much + } else if (select[4] == 1 && (down == null || down.pannable())) { + if (isOverThresholdDrag) { + if (!r.hoverData.dragging && cy.boxSelectionEnabled() && (multSelKeyDown || !cy.panningEnabled() || !cy.userPanningEnabled())) { + goIntoBoxMode(); + } else if (!r.hoverData.selecting && cy.panningEnabled() && cy.userPanningEnabled()) { + var allowPassthrough = allowPanningPassthrough(down, r.hoverData.downs); + + if (allowPassthrough) { + r.hoverData.dragging = true; + r.hoverData.justStartedPan = true; + select[4] = 0; + r.data.bgActivePosistion = array2point(mdownPos); + r.redrawHint('select', true); + r.redraw(); + } + } + + if (down && down.pannable() && down.active()) { + down.unactivate(); + } + } + } else { + if (down && down.pannable() && down.active()) { + down.unactivate(); + } + + if ((!down || !down.grabbed()) && near != last) { + if (last) { + triggerEvents(last, ['mouseout', 'tapdragout'], e, { + x: pos[0], + y: pos[1] + }); + } + + if (near) { + triggerEvents(near, ['mouseover', 'tapdragover'], e, { + x: pos[0], + y: pos[1] + }); + } + + r.hoverData.last = near; + } + + if (down) { + if (isOverThresholdDrag) { + // then we can take action + if (cy.boxSelectionEnabled() && multSelKeyDown) { + // then selection overrides + if (down && down.grabbed()) { + freeDraggedElements(draggedElements); + down.emit('freeon'); + draggedElements.emit('free'); + + if (r.dragData.didDrag) { + down.emit('dragfreeon'); + draggedElements.emit('dragfree'); + } + } + + goIntoBoxMode(); + } else if (down && down.grabbed() && r.nodeIsDraggable(down)) { + // drag node + var justStartedDrag = !r.dragData.didDrag; + + if (justStartedDrag) { + r.redrawHint('eles', true); + } + + r.dragData.didDrag = true; // indicate that we actually did drag the node + // now, add the elements to the drag layer if not done already + + if (!r.hoverData.draggingEles) { + addNodesToDrag(draggedElements, { + inDragLayer: true + }); + } + + var totalShift = { + x: 0, + y: 0 + }; + + if (number$1(disp[0]) && number$1(disp[1])) { + totalShift.x += disp[0]; + totalShift.y += disp[1]; + + if (justStartedDrag) { + var dragDelta = r.hoverData.dragDelta; + + if (dragDelta && number$1(dragDelta[0]) && number$1(dragDelta[1])) { + totalShift.x += dragDelta[0]; + totalShift.y += dragDelta[1]; + } + } + } + + r.hoverData.draggingEles = true; + draggedElements.silentShift(totalShift).emit('position drag'); + r.redrawHint('drag', true); + r.redraw(); + } + } else { + // otherwise save drag delta for when we actually start dragging so the relative grab pos is constant + updateDragDelta(); + } + } // prevent the dragging from triggering text selection on the page + + + preventDefault = true; + } + + select[2] = pos[0]; + select[3] = pos[1]; + + if (preventDefault) { + if (e.stopPropagation) e.stopPropagation(); + if (e.preventDefault) e.preventDefault(); + return false; + } + }, false); + var clickTimeout, didDoubleClick, prevClickTimeStamp; + r.registerBinding(containerWindow, 'mouseup', function mouseupHandler(e) { + // eslint-disable-line no-undef + var capture = r.hoverData.capture; + + if (!capture) { + return; + } + + r.hoverData.capture = false; + var cy = r.cy; + var pos = r.projectIntoViewport(e.clientX, e.clientY); + var select = r.selection; + var near = r.findNearestElement(pos[0], pos[1], true, false); + var draggedElements = r.dragData.possibleDragElements; + var down = r.hoverData.down; + var multSelKeyDown = isMultSelKeyDown(e); + + if (r.data.bgActivePosistion) { + r.redrawHint('select', true); + r.redraw(); + } + + r.hoverData.tapholdCancelled = true; + r.data.bgActivePosistion = undefined; // not active bg now + + if (down) { + down.unactivate(); + } + + if (r.hoverData.which === 3) { + var cxtEvt = { + originalEvent: e, + type: 'cxttapend', + position: { + x: pos[0], + y: pos[1] + } + }; + + if (down) { + down.emit(cxtEvt); + } else { + cy.emit(cxtEvt); + } + + if (!r.hoverData.cxtDragged) { + var cxtTap = { + originalEvent: e, + type: 'cxttap', + position: { + x: pos[0], + y: pos[1] + } + }; + + if (down) { + down.emit(cxtTap); + } else { + cy.emit(cxtTap); + } + } + + r.hoverData.cxtDragged = false; + r.hoverData.which = null; + } else if (r.hoverData.which === 1) { + triggerEvents(near, ['mouseup', 'tapend', 'vmouseup'], e, { + x: pos[0], + y: pos[1] + }); + + if (!r.dragData.didDrag && // didn't move a node around + !r.hoverData.dragged && // didn't pan + !r.hoverData.selecting && // not box selection + !r.hoverData.isOverThresholdDrag // didn't move too much + ) { + triggerEvents(down, ["click", "tap", "vclick"], e, { + x: pos[0], + y: pos[1] + }); + didDoubleClick = false; + + if (e.timeStamp - prevClickTimeStamp <= cy.multiClickDebounceTime()) { + clickTimeout && clearTimeout(clickTimeout); + didDoubleClick = true; + prevClickTimeStamp = null; + triggerEvents(down, ["dblclick", "dbltap", "vdblclick"], e, { + x: pos[0], + y: pos[1] + }); + } else { + clickTimeout = setTimeout(function () { + if (didDoubleClick) return; + triggerEvents(down, ["oneclick", "onetap", "voneclick"], e, { + x: pos[0], + y: pos[1] + }); + }, cy.multiClickDebounceTime()); + prevClickTimeStamp = e.timeStamp; + } + } // Deselect all elements if nothing is currently under the mouse cursor and we aren't dragging something + + + if (down == null // not mousedown on node + && !r.dragData.didDrag // didn't move the node around + && !r.hoverData.selecting // not box selection + && !r.hoverData.dragged // didn't pan + && !isMultSelKeyDown(e)) { + cy.$(isSelected).unselect(['tapunselect']); + + if (draggedElements.length > 0) { + r.redrawHint('eles', true); + } + + r.dragData.possibleDragElements = draggedElements = cy.collection(); + } // Single selection + + + if (near == down && !r.dragData.didDrag && !r.hoverData.selecting) { + if (near != null && near._private.selectable) { + if (r.hoverData.dragging) ; else if (cy.selectionType() === 'additive' || multSelKeyDown) { + if (near.selected()) { + near.unselect(['tapunselect']); + } else { + near.select(['tapselect']); + } + } else { + if (!multSelKeyDown) { + cy.$(isSelected).unmerge(near).unselect(['tapunselect']); + near.select(['tapselect']); + } + } + + r.redrawHint('eles', true); + } + } + + if (r.hoverData.selecting) { + var box = cy.collection(r.getAllInBox(select[0], select[1], select[2], select[3])); + r.redrawHint('select', true); + + if (box.length > 0) { + r.redrawHint('eles', true); + } + + cy.emit({ + type: 'boxend', + originalEvent: e, + position: { + x: pos[0], + y: pos[1] + } + }); + + var eleWouldBeSelected = function eleWouldBeSelected(ele) { + return ele.selectable() && !ele.selected(); + }; + + if (cy.selectionType() === 'additive') { + box.emit('box').stdFilter(eleWouldBeSelected).select().emit('boxselect'); + } else { + if (!multSelKeyDown) { + cy.$(isSelected).unmerge(box).unselect(); + } + + box.emit('box').stdFilter(eleWouldBeSelected).select().emit('boxselect'); + } // always need redraw in case eles unselectable + + + r.redraw(); + } // Cancel drag pan + + + if (r.hoverData.dragging) { + r.hoverData.dragging = false; + r.redrawHint('select', true); + r.redrawHint('eles', true); + r.redraw(); + } + + if (!select[4]) { + r.redrawHint('drag', true); + r.redrawHint('eles', true); + var downWasGrabbed = down && down.grabbed(); + freeDraggedElements(draggedElements); + + if (downWasGrabbed) { + down.emit('freeon'); + draggedElements.emit('free'); + + if (r.dragData.didDrag) { + down.emit('dragfreeon'); + draggedElements.emit('dragfree'); + } + } + } + } // else not right mouse + + + select[4] = 0; + r.hoverData.down = null; + r.hoverData.cxtStarted = false; + r.hoverData.draggingEles = false; + r.hoverData.selecting = false; + r.hoverData.isOverThresholdDrag = false; + r.dragData.didDrag = false; + r.hoverData.dragged = false; + r.hoverData.dragDelta = []; + r.hoverData.mdownPos = null; + r.hoverData.mdownGPos = null; + }, false); + + var wheelHandler = function wheelHandler(e) { + if (r.scrollingPage) { + return; + } // while scrolling, ignore wheel-to-zoom + + + var cy = r.cy; + var zoom = cy.zoom(); + var pan = cy.pan(); + var pos = r.projectIntoViewport(e.clientX, e.clientY); + var rpos = [pos[0] * zoom + pan.x, pos[1] * zoom + pan.y]; + + if (r.hoverData.draggingEles || r.hoverData.dragging || r.hoverData.cxtStarted || inBoxSelection()) { + // if pan dragging or cxt dragging, wheel movements make no zoom + e.preventDefault(); + return; + } + + if (cy.panningEnabled() && cy.userPanningEnabled() && cy.zoomingEnabled() && cy.userZoomingEnabled()) { + e.preventDefault(); + r.data.wheelZooming = true; + clearTimeout(r.data.wheelTimeout); + r.data.wheelTimeout = setTimeout(function () { + r.data.wheelZooming = false; + r.redrawHint('eles', true); + r.redraw(); + }, 150); + var diff; + + if (e.deltaY != null) { + diff = e.deltaY / -250; + } else if (e.wheelDeltaY != null) { + diff = e.wheelDeltaY / 1000; + } else { + diff = e.wheelDelta / 1000; + } + + diff = diff * r.wheelSensitivity; + var needsWheelFix = e.deltaMode === 1; + + if (needsWheelFix) { + // fixes slow wheel events on ff/linux and ff/windows + diff *= 33; + } + + var newZoom = cy.zoom() * Math.pow(10, diff); + + if (e.type === 'gesturechange') { + newZoom = r.gestureStartZoom * e.scale; + } + + cy.zoom({ + level: newZoom, + renderedPosition: { + x: rpos[0], + y: rpos[1] + } + }); + cy.emit(e.type === 'gesturechange' ? 'pinchzoom' : 'scrollzoom'); + } + }; // Functions to help with whether mouse wheel should trigger zooming + // -- + + + r.registerBinding(r.container, 'wheel', wheelHandler, true); // disable nonstandard wheel events + // r.registerBinding(r.container, 'mousewheel', wheelHandler, true); + // r.registerBinding(r.container, 'DOMMouseScroll', wheelHandler, true); + // r.registerBinding(r.container, 'MozMousePixelScroll', wheelHandler, true); // older firefox + + r.registerBinding(containerWindow, 'scroll', function scrollHandler(e) { + // eslint-disable-line no-unused-vars + r.scrollingPage = true; + clearTimeout(r.scrollingPageTimeout); + r.scrollingPageTimeout = setTimeout(function () { + r.scrollingPage = false; + }, 250); + }, true); // desktop safari pinch to zoom start + + r.registerBinding(r.container, 'gesturestart', function gestureStartHandler(e) { + r.gestureStartZoom = r.cy.zoom(); + + if (!r.hasTouchStarted) { + // don't affect touch devices like iphone + e.preventDefault(); + } + }, true); + r.registerBinding(r.container, 'gesturechange', function (e) { + if (!r.hasTouchStarted) { + // don't affect touch devices like iphone + wheelHandler(e); + } + }, true); // Functions to help with handling mouseout/mouseover on the Cytoscape container + // Handle mouseout on Cytoscape container + + r.registerBinding(r.container, 'mouseout', function mouseOutHandler(e) { + var pos = r.projectIntoViewport(e.clientX, e.clientY); + r.cy.emit({ + originalEvent: e, + type: 'mouseout', + position: { + x: pos[0], + y: pos[1] + } + }); + }, false); + r.registerBinding(r.container, 'mouseover', function mouseOverHandler(e) { + var pos = r.projectIntoViewport(e.clientX, e.clientY); + r.cy.emit({ + originalEvent: e, + type: 'mouseover', + position: { + x: pos[0], + y: pos[1] + } + }); + }, false); + var f1x1, f1y1, f2x1, f2y1; // starting points for pinch-to-zoom + + var distance1, distance1Sq; // initial distance between finger 1 and finger 2 for pinch-to-zoom + + var center1, modelCenter1; // center point on start pinch to zoom + + var offsetLeft, offsetTop; + var containerWidth, containerHeight; + var twoFingersStartInside; + + var distance = function distance(x1, y1, x2, y2) { + return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); + }; + + var distanceSq = function distanceSq(x1, y1, x2, y2) { + return (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1); + }; + + var touchstartHandler; + r.registerBinding(r.container, 'touchstart', touchstartHandler = function touchstartHandler(e) { + r.hasTouchStarted = true; + + if (!eventInContainer(e)) { + return; + } + + blurActiveDomElement(); + r.touchData.capture = true; + r.data.bgActivePosistion = undefined; + var cy = r.cy; + var now = r.touchData.now; + var earlier = r.touchData.earlier; + + if (e.touches[0]) { + var pos = r.projectIntoViewport(e.touches[0].clientX, e.touches[0].clientY); + now[0] = pos[0]; + now[1] = pos[1]; + } + + if (e.touches[1]) { + var pos = r.projectIntoViewport(e.touches[1].clientX, e.touches[1].clientY); + now[2] = pos[0]; + now[3] = pos[1]; + } + + if (e.touches[2]) { + var pos = r.projectIntoViewport(e.touches[2].clientX, e.touches[2].clientY); + now[4] = pos[0]; + now[5] = pos[1]; + } // record starting points for pinch-to-zoom + + + if (e.touches[1]) { + r.touchData.singleTouchMoved = true; + freeDraggedElements(r.dragData.touchDragEles); + var offsets = r.findContainerClientCoords(); + offsetLeft = offsets[0]; + offsetTop = offsets[1]; + containerWidth = offsets[2]; + containerHeight = offsets[3]; + f1x1 = e.touches[0].clientX - offsetLeft; + f1y1 = e.touches[0].clientY - offsetTop; + f2x1 = e.touches[1].clientX - offsetLeft; + f2y1 = e.touches[1].clientY - offsetTop; + twoFingersStartInside = 0 <= f1x1 && f1x1 <= containerWidth && 0 <= f2x1 && f2x1 <= containerWidth && 0 <= f1y1 && f1y1 <= containerHeight && 0 <= f2y1 && f2y1 <= containerHeight; + var pan = cy.pan(); + var zoom = cy.zoom(); + distance1 = distance(f1x1, f1y1, f2x1, f2y1); + distance1Sq = distanceSq(f1x1, f1y1, f2x1, f2y1); + center1 = [(f1x1 + f2x1) / 2, (f1y1 + f2y1) / 2]; + modelCenter1 = [(center1[0] - pan.x) / zoom, (center1[1] - pan.y) / zoom]; // consider context tap + + var cxtDistThreshold = 200; + var cxtDistThresholdSq = cxtDistThreshold * cxtDistThreshold; + + if (distance1Sq < cxtDistThresholdSq && !e.touches[2]) { + var near1 = r.findNearestElement(now[0], now[1], true, true); + var near2 = r.findNearestElement(now[2], now[3], true, true); + + if (near1 && near1.isNode()) { + near1.activate().emit({ + originalEvent: e, + type: 'cxttapstart', + position: { + x: now[0], + y: now[1] + } + }); + r.touchData.start = near1; + } else if (near2 && near2.isNode()) { + near2.activate().emit({ + originalEvent: e, + type: 'cxttapstart', + position: { + x: now[0], + y: now[1] + } + }); + r.touchData.start = near2; + } else { + cy.emit({ + originalEvent: e, + type: 'cxttapstart', + position: { + x: now[0], + y: now[1] + } + }); + } + + if (r.touchData.start) { + r.touchData.start._private.grabbed = false; + } + + r.touchData.cxt = true; + r.touchData.cxtDragged = false; + r.data.bgActivePosistion = undefined; + r.redraw(); + return; + } + } + + if (e.touches[2]) { + // ignore + // safari on ios pans the page otherwise (normally you should be able to preventdefault on touchmove...) + if (cy.boxSelectionEnabled()) { + e.preventDefault(); + } + } else if (e.touches[1]) ; else if (e.touches[0]) { + var nears = r.findNearestElements(now[0], now[1], true, true); + var near = nears[0]; + + if (near != null) { + near.activate(); + r.touchData.start = near; + r.touchData.starts = nears; + + if (r.nodeIsGrabbable(near)) { + var draggedEles = r.dragData.touchDragEles = cy.collection(); + var selectedNodes = null; + r.redrawHint('eles', true); + r.redrawHint('drag', true); + + if (near.selected()) { + // reset drag elements, since near will be added again + selectedNodes = cy.$(function (ele) { + return ele.selected() && r.nodeIsGrabbable(ele); + }); + addNodesToDrag(selectedNodes, { + addToList: draggedEles + }); + } else { + addNodeToDrag(near, { + addToList: draggedEles + }); + } + + setGrabTarget(near); + + var makeEvent = function makeEvent(type) { + return { + originalEvent: e, + type: type, + position: { + x: now[0], + y: now[1] + } + }; + }; + + near.emit(makeEvent('grabon')); + + if (selectedNodes) { + selectedNodes.forEach(function (n) { + n.emit(makeEvent('grab')); + }); + } else { + near.emit(makeEvent('grab')); + } + } + } + + triggerEvents(near, ['touchstart', 'tapstart', 'vmousedown'], e, { + x: now[0], + y: now[1] + }); + + if (near == null) { + r.data.bgActivePosistion = { + x: pos[0], + y: pos[1] + }; + r.redrawHint('select', true); + r.redraw(); + } // Tap, taphold + // ----- + + + r.touchData.singleTouchMoved = false; + r.touchData.singleTouchStartTime = +new Date(); + clearTimeout(r.touchData.tapholdTimeout); + r.touchData.tapholdTimeout = setTimeout(function () { + if (r.touchData.singleTouchMoved === false && !r.pinching // if pinching, then taphold unselect shouldn't take effect + && !r.touchData.selecting // box selection shouldn't allow taphold through + ) { + triggerEvents(r.touchData.start, ['taphold'], e, { + x: now[0], + y: now[1] + }); + } + }, r.tapholdDuration); + } + + if (e.touches.length >= 1) { + var sPos = r.touchData.startPosition = [null, null, null, null, null, null]; + + for (var i = 0; i < now.length; i++) { + sPos[i] = earlier[i] = now[i]; + } + + var touch0 = e.touches[0]; + r.touchData.startGPosition = [touch0.clientX, touch0.clientY]; + } + }, false); + var touchmoveHandler; + r.registerBinding(window, 'touchmove', touchmoveHandler = function touchmoveHandler(e) { + // eslint-disable-line no-undef + var capture = r.touchData.capture; + + if (!capture && !eventInContainer(e)) { + return; + } + + var select = r.selection; + var cy = r.cy; + var now = r.touchData.now; + var earlier = r.touchData.earlier; + var zoom = cy.zoom(); + + if (e.touches[0]) { + var pos = r.projectIntoViewport(e.touches[0].clientX, e.touches[0].clientY); + now[0] = pos[0]; + now[1] = pos[1]; + } + + if (e.touches[1]) { + var pos = r.projectIntoViewport(e.touches[1].clientX, e.touches[1].clientY); + now[2] = pos[0]; + now[3] = pos[1]; + } + + if (e.touches[2]) { + var pos = r.projectIntoViewport(e.touches[2].clientX, e.touches[2].clientY); + now[4] = pos[0]; + now[5] = pos[1]; + } + + var startGPos = r.touchData.startGPosition; + var isOverThresholdDrag; + + if (capture && e.touches[0] && startGPos) { + var disp = []; + + for (var j = 0; j < now.length; j++) { + disp[j] = now[j] - earlier[j]; + } + + var dx = e.touches[0].clientX - startGPos[0]; + var dx2 = dx * dx; + var dy = e.touches[0].clientY - startGPos[1]; + var dy2 = dy * dy; + var dist2 = dx2 + dy2; + isOverThresholdDrag = dist2 >= r.touchTapThreshold2; + } // context swipe cancelling + + + if (capture && r.touchData.cxt) { + e.preventDefault(); + var f1x2 = e.touches[0].clientX - offsetLeft, + f1y2 = e.touches[0].clientY - offsetTop; + var f2x2 = e.touches[1].clientX - offsetLeft, + f2y2 = e.touches[1].clientY - offsetTop; // var distance2 = distance( f1x2, f1y2, f2x2, f2y2 ); + + var distance2Sq = distanceSq(f1x2, f1y2, f2x2, f2y2); + var factorSq = distance2Sq / distance1Sq; + var distThreshold = 150; + var distThresholdSq = distThreshold * distThreshold; + var factorThreshold = 1.5; + var factorThresholdSq = factorThreshold * factorThreshold; // cancel ctx gestures if the distance b/t the fingers increases + + if (factorSq >= factorThresholdSq || distance2Sq >= distThresholdSq) { + r.touchData.cxt = false; + r.data.bgActivePosistion = undefined; + r.redrawHint('select', true); + var cxtEvt = { + originalEvent: e, + type: 'cxttapend', + position: { + x: now[0], + y: now[1] + } + }; + + if (r.touchData.start) { + r.touchData.start.unactivate().emit(cxtEvt); + r.touchData.start = null; + } else { + cy.emit(cxtEvt); + } + } + } // context swipe + + + if (capture && r.touchData.cxt) { + var cxtEvt = { + originalEvent: e, + type: 'cxtdrag', + position: { + x: now[0], + y: now[1] + } + }; + r.data.bgActivePosistion = undefined; + r.redrawHint('select', true); + + if (r.touchData.start) { + r.touchData.start.emit(cxtEvt); + } else { + cy.emit(cxtEvt); + } + + if (r.touchData.start) { + r.touchData.start._private.grabbed = false; + } + + r.touchData.cxtDragged = true; + var near = r.findNearestElement(now[0], now[1], true, true); + + if (!r.touchData.cxtOver || near !== r.touchData.cxtOver) { + if (r.touchData.cxtOver) { + r.touchData.cxtOver.emit({ + originalEvent: e, + type: 'cxtdragout', + position: { + x: now[0], + y: now[1] + } + }); + } + + r.touchData.cxtOver = near; + + if (near) { + near.emit({ + originalEvent: e, + type: 'cxtdragover', + position: { + x: now[0], + y: now[1] + } + }); + } + } // box selection + + } else if (capture && e.touches[2] && cy.boxSelectionEnabled()) { + e.preventDefault(); + r.data.bgActivePosistion = undefined; + this.lastThreeTouch = +new Date(); + + if (!r.touchData.selecting) { + cy.emit({ + originalEvent: e, + type: 'boxstart', + position: { + x: now[0], + y: now[1] + } + }); + } + + r.touchData.selecting = true; + r.touchData.didSelect = true; + select[4] = 1; + + if (!select || select.length === 0 || select[0] === undefined) { + select[0] = (now[0] + now[2] + now[4]) / 3; + select[1] = (now[1] + now[3] + now[5]) / 3; + select[2] = (now[0] + now[2] + now[4]) / 3 + 1; + select[3] = (now[1] + now[3] + now[5]) / 3 + 1; + } else { + select[2] = (now[0] + now[2] + now[4]) / 3; + select[3] = (now[1] + now[3] + now[5]) / 3; + } + + r.redrawHint('select', true); + r.redraw(); // pinch to zoom + } else if (capture && e.touches[1] && !r.touchData.didSelect // don't allow box selection to degrade to pinch-to-zoom + && cy.zoomingEnabled() && cy.panningEnabled() && cy.userZoomingEnabled() && cy.userPanningEnabled()) { + // two fingers => pinch to zoom + e.preventDefault(); + r.data.bgActivePosistion = undefined; + r.redrawHint('select', true); + var draggedEles = r.dragData.touchDragEles; + + if (draggedEles) { + r.redrawHint('drag', true); + + for (var i = 0; i < draggedEles.length; i++) { + var de_p = draggedEles[i]._private; + de_p.grabbed = false; + de_p.rscratch.inDragLayer = false; + } + } + + var _start = r.touchData.start; // (x2, y2) for fingers 1 and 2 + + var f1x2 = e.touches[0].clientX - offsetLeft, + f1y2 = e.touches[0].clientY - offsetTop; + var f2x2 = e.touches[1].clientX - offsetLeft, + f2y2 = e.touches[1].clientY - offsetTop; + var distance2 = distance(f1x2, f1y2, f2x2, f2y2); // var distance2Sq = distanceSq( f1x2, f1y2, f2x2, f2y2 ); + // var factor = Math.sqrt( distance2Sq ) / Math.sqrt( distance1Sq ); + + var factor = distance2 / distance1; + + if (twoFingersStartInside) { + // delta finger1 + var df1x = f1x2 - f1x1; + var df1y = f1y2 - f1y1; // delta finger 2 + + var df2x = f2x2 - f2x1; + var df2y = f2y2 - f2y1; // translation is the normalised vector of the two fingers movement + // i.e. so pinching cancels out and moving together pans + + var tx = (df1x + df2x) / 2; + var ty = (df1y + df2y) / 2; // now calculate the zoom + + var zoom1 = cy.zoom(); + var zoom2 = zoom1 * factor; + var pan1 = cy.pan(); // the model center point converted to the current rendered pos + + var ctrx = modelCenter1[0] * zoom1 + pan1.x; + var ctry = modelCenter1[1] * zoom1 + pan1.y; + var pan2 = { + x: -zoom2 / zoom1 * (ctrx - pan1.x - tx) + ctrx, + y: -zoom2 / zoom1 * (ctry - pan1.y - ty) + ctry + }; // remove dragged eles + + if (_start && _start.active()) { + var draggedEles = r.dragData.touchDragEles; + freeDraggedElements(draggedEles); + r.redrawHint('drag', true); + r.redrawHint('eles', true); + + _start.unactivate().emit('freeon'); + + draggedEles.emit('free'); + + if (r.dragData.didDrag) { + _start.emit('dragfreeon'); + + draggedEles.emit('dragfree'); + } + } + + cy.viewport({ + zoom: zoom2, + pan: pan2, + cancelOnFailedZoom: true + }); + cy.emit('pinchzoom'); + distance1 = distance2; + f1x1 = f1x2; + f1y1 = f1y2; + f2x1 = f2x2; + f2y1 = f2y2; + r.pinching = true; + } // Re-project + + + if (e.touches[0]) { + var pos = r.projectIntoViewport(e.touches[0].clientX, e.touches[0].clientY); + now[0] = pos[0]; + now[1] = pos[1]; + } + + if (e.touches[1]) { + var pos = r.projectIntoViewport(e.touches[1].clientX, e.touches[1].clientY); + now[2] = pos[0]; + now[3] = pos[1]; + } + + if (e.touches[2]) { + var pos = r.projectIntoViewport(e.touches[2].clientX, e.touches[2].clientY); + now[4] = pos[0]; + now[5] = pos[1]; + } + } else if (e.touches[0] && !r.touchData.didSelect // don't allow box selection to degrade to single finger events like panning + ) { + var start = r.touchData.start; + var last = r.touchData.last; + var near; + + if (!r.hoverData.draggingEles && !r.swipePanning) { + near = r.findNearestElement(now[0], now[1], true, true); + } + + if (capture && start != null) { + e.preventDefault(); + } // dragging nodes + + + if (capture && start != null && r.nodeIsDraggable(start)) { + if (isOverThresholdDrag) { + // then dragging can happen + var draggedEles = r.dragData.touchDragEles; + var justStartedDrag = !r.dragData.didDrag; + + if (justStartedDrag) { + addNodesToDrag(draggedEles, { + inDragLayer: true + }); + } + + r.dragData.didDrag = true; + var totalShift = { + x: 0, + y: 0 + }; + + if (number$1(disp[0]) && number$1(disp[1])) { + totalShift.x += disp[0]; + totalShift.y += disp[1]; + + if (justStartedDrag) { + r.redrawHint('eles', true); + var dragDelta = r.touchData.dragDelta; + + if (dragDelta && number$1(dragDelta[0]) && number$1(dragDelta[1])) { + totalShift.x += dragDelta[0]; + totalShift.y += dragDelta[1]; + } + } + } + + r.hoverData.draggingEles = true; + draggedEles.silentShift(totalShift).emit('position drag'); + r.redrawHint('drag', true); + + if (r.touchData.startPosition[0] == earlier[0] && r.touchData.startPosition[1] == earlier[1]) { + r.redrawHint('eles', true); + } + + r.redraw(); + } else { + // otherwise keep track of drag delta for later + var dragDelta = r.touchData.dragDelta = r.touchData.dragDelta || []; + + if (dragDelta.length === 0) { + dragDelta.push(disp[0]); + dragDelta.push(disp[1]); + } else { + dragDelta[0] += disp[0]; + dragDelta[1] += disp[1]; + } + } + } // touchmove + + + { + triggerEvents(start || near, ['touchmove', 'tapdrag', 'vmousemove'], e, { + x: now[0], + y: now[1] + }); + + if ((!start || !start.grabbed()) && near != last) { + if (last) { + last.emit({ + originalEvent: e, + type: 'tapdragout', + position: { + x: now[0], + y: now[1] + } + }); + } + + if (near) { + near.emit({ + originalEvent: e, + type: 'tapdragover', + position: { + x: now[0], + y: now[1] + } + }); + } + } + + r.touchData.last = near; + } // check to cancel taphold + + if (capture) { + for (var i = 0; i < now.length; i++) { + if (now[i] && r.touchData.startPosition[i] && isOverThresholdDrag) { + r.touchData.singleTouchMoved = true; + } + } + } // panning + + + if (capture && (start == null || start.pannable()) && cy.panningEnabled() && cy.userPanningEnabled()) { + var allowPassthrough = allowPanningPassthrough(start, r.touchData.starts); + + if (allowPassthrough) { + e.preventDefault(); + + if (!r.data.bgActivePosistion) { + r.data.bgActivePosistion = array2point(r.touchData.startPosition); + } + + if (r.swipePanning) { + cy.panBy({ + x: disp[0] * zoom, + y: disp[1] * zoom + }); + cy.emit('dragpan'); + } else if (isOverThresholdDrag) { + r.swipePanning = true; + cy.panBy({ + x: dx * zoom, + y: dy * zoom + }); + cy.emit('dragpan'); + + if (start) { + start.unactivate(); + r.redrawHint('select', true); + r.touchData.start = null; + } + } + } // Re-project + + + var pos = r.projectIntoViewport(e.touches[0].clientX, e.touches[0].clientY); + now[0] = pos[0]; + now[1] = pos[1]; + } + } + + for (var j = 0; j < now.length; j++) { + earlier[j] = now[j]; + } // the active bg indicator should be removed when making a swipe that is neither for dragging nodes or panning + + + if (capture && e.touches.length > 0 && !r.hoverData.draggingEles && !r.swipePanning && r.data.bgActivePosistion != null) { + r.data.bgActivePosistion = undefined; + r.redrawHint('select', true); + r.redraw(); + } + }, false); + var touchcancelHandler; + r.registerBinding(containerWindow, 'touchcancel', touchcancelHandler = function touchcancelHandler(e) { + // eslint-disable-line no-unused-vars + var start = r.touchData.start; + r.touchData.capture = false; + + if (start) { + start.unactivate(); + } + }); + var touchendHandler, didDoubleTouch, touchTimeout, prevTouchTimeStamp; + r.registerBinding(containerWindow, 'touchend', touchendHandler = function touchendHandler(e) { + // eslint-disable-line no-unused-vars + var start = r.touchData.start; + var capture = r.touchData.capture; + + if (capture) { + if (e.touches.length === 0) { + r.touchData.capture = false; + } + + e.preventDefault(); + } else { + return; + } + + var select = r.selection; + r.swipePanning = false; + r.hoverData.draggingEles = false; + var cy = r.cy; + var zoom = cy.zoom(); + var now = r.touchData.now; + var earlier = r.touchData.earlier; + + if (e.touches[0]) { + var pos = r.projectIntoViewport(e.touches[0].clientX, e.touches[0].clientY); + now[0] = pos[0]; + now[1] = pos[1]; + } + + if (e.touches[1]) { + var pos = r.projectIntoViewport(e.touches[1].clientX, e.touches[1].clientY); + now[2] = pos[0]; + now[3] = pos[1]; + } + + if (e.touches[2]) { + var pos = r.projectIntoViewport(e.touches[2].clientX, e.touches[2].clientY); + now[4] = pos[0]; + now[5] = pos[1]; + } + + if (start) { + start.unactivate(); + } + + var ctxTapend; + + if (r.touchData.cxt) { + ctxTapend = { + originalEvent: e, + type: 'cxttapend', + position: { + x: now[0], + y: now[1] + } + }; + + if (start) { + start.emit(ctxTapend); + } else { + cy.emit(ctxTapend); + } + + if (!r.touchData.cxtDragged) { + var ctxTap = { + originalEvent: e, + type: 'cxttap', + position: { + x: now[0], + y: now[1] + } + }; + + if (start) { + start.emit(ctxTap); + } else { + cy.emit(ctxTap); + } + } + + if (r.touchData.start) { + r.touchData.start._private.grabbed = false; + } + + r.touchData.cxt = false; + r.touchData.start = null; + r.redraw(); + return; + } // no more box selection if we don't have three fingers + + + if (!e.touches[2] && cy.boxSelectionEnabled() && r.touchData.selecting) { + r.touchData.selecting = false; + var box = cy.collection(r.getAllInBox(select[0], select[1], select[2], select[3])); + select[0] = undefined; + select[1] = undefined; + select[2] = undefined; + select[3] = undefined; + select[4] = 0; + r.redrawHint('select', true); + cy.emit({ + type: 'boxend', + originalEvent: e, + position: { + x: now[0], + y: now[1] + } + }); + + var eleWouldBeSelected = function eleWouldBeSelected(ele) { + return ele.selectable() && !ele.selected(); + }; + + box.emit('box').stdFilter(eleWouldBeSelected).select().emit('boxselect'); + + if (box.nonempty()) { + r.redrawHint('eles', true); + } + + r.redraw(); + } + + if (start != null) { + start.unactivate(); + } + + if (e.touches[2]) { + r.data.bgActivePosistion = undefined; + r.redrawHint('select', true); + } else if (e.touches[1]) ; else if (e.touches[0]) ; else if (!e.touches[0]) { + r.data.bgActivePosistion = undefined; + r.redrawHint('select', true); + var draggedEles = r.dragData.touchDragEles; + + if (start != null) { + var startWasGrabbed = start._private.grabbed; + freeDraggedElements(draggedEles); + r.redrawHint('drag', true); + r.redrawHint('eles', true); + + if (startWasGrabbed) { + start.emit('freeon'); + draggedEles.emit('free'); + + if (r.dragData.didDrag) { + start.emit('dragfreeon'); + draggedEles.emit('dragfree'); + } + } + + triggerEvents(start, ['touchend', 'tapend', 'vmouseup', 'tapdragout'], e, { + x: now[0], + y: now[1] + }); + start.unactivate(); + r.touchData.start = null; + } else { + var near = r.findNearestElement(now[0], now[1], true, true); + triggerEvents(near, ['touchend', 'tapend', 'vmouseup', 'tapdragout'], e, { + x: now[0], + y: now[1] + }); + } + + var dx = r.touchData.startPosition[0] - now[0]; + var dx2 = dx * dx; + var dy = r.touchData.startPosition[1] - now[1]; + var dy2 = dy * dy; + var dist2 = dx2 + dy2; + var rdist2 = dist2 * zoom * zoom; // Tap event, roughly same as mouse click event for touch + + if (!r.touchData.singleTouchMoved) { + if (!start) { + cy.$(':selected').unselect(['tapunselect']); + } + + triggerEvents(start, ['tap', 'vclick'], e, { + x: now[0], + y: now[1] + }); + didDoubleTouch = false; + + if (e.timeStamp - prevTouchTimeStamp <= cy.multiClickDebounceTime()) { + touchTimeout && clearTimeout(touchTimeout); + didDoubleTouch = true; + prevTouchTimeStamp = null; + triggerEvents(start, ['dbltap', 'vdblclick'], e, { + x: now[0], + y: now[1] + }); + } else { + touchTimeout = setTimeout(function () { + if (didDoubleTouch) return; + triggerEvents(start, ['onetap', 'voneclick'], e, { + x: now[0], + y: now[1] + }); + }, cy.multiClickDebounceTime()); + prevTouchTimeStamp = e.timeStamp; + } + } // Prepare to select the currently touched node, only if it hasn't been dragged past a certain distance + + + if (start != null && !r.dragData.didDrag // didn't drag nodes around + && start._private.selectable && rdist2 < r.touchTapThreshold2 && !r.pinching // pinch to zoom should not affect selection + ) { + if (cy.selectionType() === 'single') { + cy.$(isSelected).unmerge(start).unselect(['tapunselect']); + start.select(['tapselect']); + } else { + if (start.selected()) { + start.unselect(['tapunselect']); + } else { + start.select(['tapselect']); + } + } + + r.redrawHint('eles', true); + } + + r.touchData.singleTouchMoved = true; + } + + for (var j = 0; j < now.length; j++) { + earlier[j] = now[j]; + } + + r.dragData.didDrag = false; // reset for next touchstart + + if (e.touches.length === 0) { + r.touchData.dragDelta = []; + r.touchData.startPosition = [null, null, null, null, null, null]; + r.touchData.startGPosition = null; + r.touchData.didSelect = false; + } + + if (e.touches.length < 2) { + if (e.touches.length === 1) { + // the old start global pos'n may not be the same finger that remains + r.touchData.startGPosition = [e.touches[0].clientX, e.touches[0].clientY]; + } + + r.pinching = false; + r.redrawHint('eles', true); + r.redraw(); + } //r.redraw(); + + }, false); // fallback compatibility layer for ms pointer events + + if (typeof TouchEvent === 'undefined') { + var pointers = []; + + var makeTouch = function makeTouch(e) { + return { + clientX: e.clientX, + clientY: e.clientY, + force: 1, + identifier: e.pointerId, + pageX: e.pageX, + pageY: e.pageY, + radiusX: e.width / 2, + radiusY: e.height / 2, + screenX: e.screenX, + screenY: e.screenY, + target: e.target + }; + }; + + var makePointer = function makePointer(e) { + return { + event: e, + touch: makeTouch(e) + }; + }; + + var addPointer = function addPointer(e) { + pointers.push(makePointer(e)); + }; + + var removePointer = function removePointer(e) { + for (var i = 0; i < pointers.length; i++) { + var p = pointers[i]; + + if (p.event.pointerId === e.pointerId) { + pointers.splice(i, 1); + return; + } + } + }; + + var updatePointer = function updatePointer(e) { + var p = pointers.filter(function (p) { + return p.event.pointerId === e.pointerId; + })[0]; + p.event = e; + p.touch = makeTouch(e); + }; + + var addTouchesToEvent = function addTouchesToEvent(e) { + e.touches = pointers.map(function (p) { + return p.touch; + }); + }; + + var pointerIsMouse = function pointerIsMouse(e) { + return e.pointerType === 'mouse' || e.pointerType === 4; + }; + + r.registerBinding(r.container, 'pointerdown', function (e) { + if (pointerIsMouse(e)) { + return; + } // mouse already handled + + + e.preventDefault(); + addPointer(e); + addTouchesToEvent(e); + touchstartHandler(e); + }); + r.registerBinding(r.container, 'pointerup', function (e) { + if (pointerIsMouse(e)) { + return; + } // mouse already handled + + + removePointer(e); + addTouchesToEvent(e); + touchendHandler(e); + }); + r.registerBinding(r.container, 'pointercancel', function (e) { + if (pointerIsMouse(e)) { + return; + } // mouse already handled + + + removePointer(e); + addTouchesToEvent(e); + touchcancelHandler(e); + }); + r.registerBinding(r.container, 'pointermove', function (e) { + if (pointerIsMouse(e)) { + return; + } // mouse already handled + + + e.preventDefault(); + updatePointer(e); + addTouchesToEvent(e); + touchmoveHandler(e); + }); + } + }; + + var BRp$2 = {}; + + BRp$2.generatePolygon = function (name, points) { + return this.nodeShapes[name] = { + renderer: this, + name: name, + points: points, + draw: function draw(context, centerX, centerY, width, height) { + this.renderer.nodeShapeImpl('polygon', context, centerX, centerY, width, height, this.points); + }, + intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding) { + return polygonIntersectLine(x, y, this.points, nodeX, nodeY, width / 2, height / 2, padding); + }, + checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY) { + return pointInsidePolygon(x, y, this.points, centerX, centerY, width, height, [0, -1], padding); + } + }; + }; + + BRp$2.generateEllipse = function () { + return this.nodeShapes['ellipse'] = { + renderer: this, + name: 'ellipse', + draw: function draw(context, centerX, centerY, width, height) { + this.renderer.nodeShapeImpl(this.name, context, centerX, centerY, width, height); + }, + intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding) { + return intersectLineEllipse(x, y, nodeX, nodeY, width / 2 + padding, height / 2 + padding); + }, + checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY) { + return checkInEllipse(x, y, width, height, centerX, centerY, padding); + } + }; + }; + + BRp$2.generateRoundPolygon = function (name, points) { + // Pre-compute control points + // Since these points depend on the radius length (which in turns depend on the width/height of the node) we will only pre-compute + // the unit vectors. + // For simplicity the layout will be: + // [ p0, UnitVectorP0P1, p1, UniVectorP1P2, ..., pn, UnitVectorPnP0 ] + var allPoints = new Array(points.length * 2); + + for (var i = 0; i < points.length / 2; i++) { + var sourceIndex = i * 2; + var destIndex = void 0; + + if (i < points.length / 2 - 1) { + destIndex = (i + 1) * 2; + } else { + destIndex = 0; + } + + allPoints[i * 4] = points[sourceIndex]; + allPoints[i * 4 + 1] = points[sourceIndex + 1]; + var xDest = points[destIndex] - points[sourceIndex]; + var yDest = points[destIndex + 1] - points[sourceIndex + 1]; + var norm = Math.sqrt(xDest * xDest + yDest * yDest); + allPoints[i * 4 + 2] = xDest / norm; + allPoints[i * 4 + 3] = yDest / norm; + } + + return this.nodeShapes[name] = { + renderer: this, + name: name, + points: allPoints, + draw: function draw(context, centerX, centerY, width, height) { + this.renderer.nodeShapeImpl('round-polygon', context, centerX, centerY, width, height, this.points); + }, + intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding) { + return roundPolygonIntersectLine(x, y, this.points, nodeX, nodeY, width, height); + }, + checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY) { + return pointInsideRoundPolygon(x, y, this.points, centerX, centerY, width, height); + } + }; + }; + + BRp$2.generateRoundRectangle = function () { + return this.nodeShapes['round-rectangle'] = this.nodeShapes['roundrectangle'] = { + renderer: this, + name: 'round-rectangle', + points: generateUnitNgonPointsFitToSquare(4, 0), + draw: function draw(context, centerX, centerY, width, height) { + this.renderer.nodeShapeImpl(this.name, context, centerX, centerY, width, height); + }, + intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding) { + return roundRectangleIntersectLine(x, y, nodeX, nodeY, width, height, padding); + }, + checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY) { + var cornerRadius = getRoundRectangleRadius(width, height); + var diam = cornerRadius * 2; // Check hBox + + if (pointInsidePolygon(x, y, this.points, centerX, centerY, width, height - diam, [0, -1], padding)) { + return true; + } // Check vBox + + + if (pointInsidePolygon(x, y, this.points, centerX, centerY, width - diam, height, [0, -1], padding)) { + return true; + } // Check top left quarter circle + + + if (checkInEllipse(x, y, diam, diam, centerX - width / 2 + cornerRadius, centerY - height / 2 + cornerRadius, padding)) { + return true; + } // Check top right quarter circle + + + if (checkInEllipse(x, y, diam, diam, centerX + width / 2 - cornerRadius, centerY - height / 2 + cornerRadius, padding)) { + return true; + } // Check bottom right quarter circle + + + if (checkInEllipse(x, y, diam, diam, centerX + width / 2 - cornerRadius, centerY + height / 2 - cornerRadius, padding)) { + return true; + } // Check bottom left quarter circle + + + if (checkInEllipse(x, y, diam, diam, centerX - width / 2 + cornerRadius, centerY + height / 2 - cornerRadius, padding)) { + return true; + } + + return false; + } + }; + }; + + BRp$2.generateCutRectangle = function () { + return this.nodeShapes['cut-rectangle'] = this.nodeShapes['cutrectangle'] = { + renderer: this, + name: 'cut-rectangle', + cornerLength: getCutRectangleCornerLength(), + points: generateUnitNgonPointsFitToSquare(4, 0), + draw: function draw(context, centerX, centerY, width, height) { + this.renderer.nodeShapeImpl(this.name, context, centerX, centerY, width, height); + }, + generateCutTrianglePts: function generateCutTrianglePts(width, height, centerX, centerY) { + var cl = this.cornerLength; + var hh = height / 2; + var hw = width / 2; + var xBegin = centerX - hw; + var xEnd = centerX + hw; + var yBegin = centerY - hh; + var yEnd = centerY + hh; // points are in clockwise order, inner (imaginary) triangle pt on [4, 5] + + return { + topLeft: [xBegin, yBegin + cl, xBegin + cl, yBegin, xBegin + cl, yBegin + cl], + topRight: [xEnd - cl, yBegin, xEnd, yBegin + cl, xEnd - cl, yBegin + cl], + bottomRight: [xEnd, yEnd - cl, xEnd - cl, yEnd, xEnd - cl, yEnd - cl], + bottomLeft: [xBegin + cl, yEnd, xBegin, yEnd - cl, xBegin + cl, yEnd - cl] + }; + }, + intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding) { + var cPts = this.generateCutTrianglePts(width + 2 * padding, height + 2 * padding, nodeX, nodeY); + var pts = [].concat.apply([], [cPts.topLeft.splice(0, 4), cPts.topRight.splice(0, 4), cPts.bottomRight.splice(0, 4), cPts.bottomLeft.splice(0, 4)]); + return polygonIntersectLine(x, y, pts, nodeX, nodeY); + }, + checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY) { + // Check hBox + if (pointInsidePolygon(x, y, this.points, centerX, centerY, width, height - 2 * this.cornerLength, [0, -1], padding)) { + return true; + } // Check vBox + + + if (pointInsidePolygon(x, y, this.points, centerX, centerY, width - 2 * this.cornerLength, height, [0, -1], padding)) { + return true; + } + + var cutTrianglePts = this.generateCutTrianglePts(width, height, centerX, centerY); + return pointInsidePolygonPoints(x, y, cutTrianglePts.topLeft) || pointInsidePolygonPoints(x, y, cutTrianglePts.topRight) || pointInsidePolygonPoints(x, y, cutTrianglePts.bottomRight) || pointInsidePolygonPoints(x, y, cutTrianglePts.bottomLeft); + } + }; + }; + + BRp$2.generateBarrel = function () { + return this.nodeShapes['barrel'] = { + renderer: this, + name: 'barrel', + points: generateUnitNgonPointsFitToSquare(4, 0), + draw: function draw(context, centerX, centerY, width, height) { + this.renderer.nodeShapeImpl(this.name, context, centerX, centerY, width, height); + }, + intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding) { + // use two fixed t values for the bezier curve approximation + var t0 = 0.15; + var t1 = 0.5; + var t2 = 0.85; + var bPts = this.generateBarrelBezierPts(width + 2 * padding, height + 2 * padding, nodeX, nodeY); + + var approximateBarrelCurvePts = function approximateBarrelCurvePts(pts) { + // approximate curve pts based on the two t values + var m0 = qbezierPtAt({ + x: pts[0], + y: pts[1] + }, { + x: pts[2], + y: pts[3] + }, { + x: pts[4], + y: pts[5] + }, t0); + var m1 = qbezierPtAt({ + x: pts[0], + y: pts[1] + }, { + x: pts[2], + y: pts[3] + }, { + x: pts[4], + y: pts[5] + }, t1); + var m2 = qbezierPtAt({ + x: pts[0], + y: pts[1] + }, { + x: pts[2], + y: pts[3] + }, { + x: pts[4], + y: pts[5] + }, t2); + return [pts[0], pts[1], m0.x, m0.y, m1.x, m1.y, m2.x, m2.y, pts[4], pts[5]]; + }; + + var pts = [].concat(approximateBarrelCurvePts(bPts.topLeft), approximateBarrelCurvePts(bPts.topRight), approximateBarrelCurvePts(bPts.bottomRight), approximateBarrelCurvePts(bPts.bottomLeft)); + return polygonIntersectLine(x, y, pts, nodeX, nodeY); + }, + generateBarrelBezierPts: function generateBarrelBezierPts(width, height, centerX, centerY) { + var hh = height / 2; + var hw = width / 2; + var xBegin = centerX - hw; + var xEnd = centerX + hw; + var yBegin = centerY - hh; + var yEnd = centerY + hh; + var curveConstants = getBarrelCurveConstants(width, height); + var hOffset = curveConstants.heightOffset; + var wOffset = curveConstants.widthOffset; + var ctrlPtXOffset = curveConstants.ctrlPtOffsetPct * width; // points are in clockwise order, inner (imaginary) control pt on [4, 5] + + var pts = { + topLeft: [xBegin, yBegin + hOffset, xBegin + ctrlPtXOffset, yBegin, xBegin + wOffset, yBegin], + topRight: [xEnd - wOffset, yBegin, xEnd - ctrlPtXOffset, yBegin, xEnd, yBegin + hOffset], + bottomRight: [xEnd, yEnd - hOffset, xEnd - ctrlPtXOffset, yEnd, xEnd - wOffset, yEnd], + bottomLeft: [xBegin + wOffset, yEnd, xBegin + ctrlPtXOffset, yEnd, xBegin, yEnd - hOffset] + }; + pts.topLeft.isTop = true; + pts.topRight.isTop = true; + pts.bottomLeft.isBottom = true; + pts.bottomRight.isBottom = true; + return pts; + }, + checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY) { + var curveConstants = getBarrelCurveConstants(width, height); + var hOffset = curveConstants.heightOffset; + var wOffset = curveConstants.widthOffset; // Check hBox + + if (pointInsidePolygon(x, y, this.points, centerX, centerY, width, height - 2 * hOffset, [0, -1], padding)) { + return true; + } // Check vBox + + + if (pointInsidePolygon(x, y, this.points, centerX, centerY, width - 2 * wOffset, height, [0, -1], padding)) { + return true; + } + + var barrelCurvePts = this.generateBarrelBezierPts(width, height, centerX, centerY); + + var getCurveT = function getCurveT(x, y, curvePts) { + var x0 = curvePts[4]; + var x1 = curvePts[2]; + var x2 = curvePts[0]; + var y0 = curvePts[5]; // var y1 = curvePts[ 3 ]; + + var y2 = curvePts[1]; + var xMin = Math.min(x0, x2); + var xMax = Math.max(x0, x2); + var yMin = Math.min(y0, y2); + var yMax = Math.max(y0, y2); + + if (xMin <= x && x <= xMax && yMin <= y && y <= yMax) { + var coeff = bezierPtsToQuadCoeff(x0, x1, x2); + var roots = solveQuadratic(coeff[0], coeff[1], coeff[2], x); + var validRoots = roots.filter(function (r) { + return 0 <= r && r <= 1; + }); + + if (validRoots.length > 0) { + return validRoots[0]; + } + } + + return null; + }; + + var curveRegions = Object.keys(barrelCurvePts); + + for (var i = 0; i < curveRegions.length; i++) { + var corner = curveRegions[i]; + var cornerPts = barrelCurvePts[corner]; + var t = getCurveT(x, y, cornerPts); + + if (t == null) { + continue; + } + + var y0 = cornerPts[5]; + var y1 = cornerPts[3]; + var y2 = cornerPts[1]; + var bezY = qbezierAt(y0, y1, y2, t); + + if (cornerPts.isTop && bezY <= y) { + return true; + } + + if (cornerPts.isBottom && y <= bezY) { + return true; + } + } + + return false; + } + }; + }; + + BRp$2.generateBottomRoundrectangle = function () { + return this.nodeShapes['bottom-round-rectangle'] = this.nodeShapes['bottomroundrectangle'] = { + renderer: this, + name: 'bottom-round-rectangle', + points: generateUnitNgonPointsFitToSquare(4, 0), + draw: function draw(context, centerX, centerY, width, height) { + this.renderer.nodeShapeImpl(this.name, context, centerX, centerY, width, height); + }, + intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding) { + var topStartX = nodeX - (width / 2 + padding); + var topStartY = nodeY - (height / 2 + padding); + var topEndY = topStartY; + var topEndX = nodeX + (width / 2 + padding); + var topIntersections = finiteLinesIntersect(x, y, nodeX, nodeY, topStartX, topStartY, topEndX, topEndY, false); + + if (topIntersections.length > 0) { + return topIntersections; + } + + return roundRectangleIntersectLine(x, y, nodeX, nodeY, width, height, padding); + }, + checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY) { + var cornerRadius = getRoundRectangleRadius(width, height); + var diam = 2 * cornerRadius; // Check hBox + + if (pointInsidePolygon(x, y, this.points, centerX, centerY, width, height - diam, [0, -1], padding)) { + return true; + } // Check vBox + + + if (pointInsidePolygon(x, y, this.points, centerX, centerY, width - diam, height, [0, -1], padding)) { + return true; + } // check non-rounded top side + + + var outerWidth = width / 2 + 2 * padding; + var outerHeight = height / 2 + 2 * padding; + var points = [centerX - outerWidth, centerY - outerHeight, centerX - outerWidth, centerY, centerX + outerWidth, centerY, centerX + outerWidth, centerY - outerHeight]; + + if (pointInsidePolygonPoints(x, y, points)) { + return true; + } // Check bottom right quarter circle + + + if (checkInEllipse(x, y, diam, diam, centerX + width / 2 - cornerRadius, centerY + height / 2 - cornerRadius, padding)) { + return true; + } // Check bottom left quarter circle + + + if (checkInEllipse(x, y, diam, diam, centerX - width / 2 + cornerRadius, centerY + height / 2 - cornerRadius, padding)) { + return true; + } + + return false; + } + }; + }; + + BRp$2.registerNodeShapes = function () { + var nodeShapes = this.nodeShapes = {}; + var renderer = this; + this.generateEllipse(); + this.generatePolygon('triangle', generateUnitNgonPointsFitToSquare(3, 0)); + this.generateRoundPolygon('round-triangle', generateUnitNgonPointsFitToSquare(3, 0)); + this.generatePolygon('rectangle', generateUnitNgonPointsFitToSquare(4, 0)); + nodeShapes['square'] = nodeShapes['rectangle']; + this.generateRoundRectangle(); + this.generateCutRectangle(); + this.generateBarrel(); + this.generateBottomRoundrectangle(); + { + var diamondPoints = [0, 1, 1, 0, 0, -1, -1, 0]; + this.generatePolygon('diamond', diamondPoints); + this.generateRoundPolygon('round-diamond', diamondPoints); + } + this.generatePolygon('pentagon', generateUnitNgonPointsFitToSquare(5, 0)); + this.generateRoundPolygon('round-pentagon', generateUnitNgonPointsFitToSquare(5, 0)); + this.generatePolygon('hexagon', generateUnitNgonPointsFitToSquare(6, 0)); + this.generateRoundPolygon('round-hexagon', generateUnitNgonPointsFitToSquare(6, 0)); + this.generatePolygon('heptagon', generateUnitNgonPointsFitToSquare(7, 0)); + this.generateRoundPolygon('round-heptagon', generateUnitNgonPointsFitToSquare(7, 0)); + this.generatePolygon('octagon', generateUnitNgonPointsFitToSquare(8, 0)); + this.generateRoundPolygon('round-octagon', generateUnitNgonPointsFitToSquare(8, 0)); + var star5Points = new Array(20); + { + var outerPoints = generateUnitNgonPoints(5, 0); + var innerPoints = generateUnitNgonPoints(5, Math.PI / 5); // Outer radius is 1; inner radius of star is smaller + + var innerRadius = 0.5 * (3 - Math.sqrt(5)); + innerRadius *= 1.57; + + for (var i = 0; i < innerPoints.length / 2; i++) { + innerPoints[i * 2] *= innerRadius; + innerPoints[i * 2 + 1] *= innerRadius; + } + + for (var i = 0; i < 20 / 4; i++) { + star5Points[i * 4] = outerPoints[i * 2]; + star5Points[i * 4 + 1] = outerPoints[i * 2 + 1]; + star5Points[i * 4 + 2] = innerPoints[i * 2]; + star5Points[i * 4 + 3] = innerPoints[i * 2 + 1]; + } + } + star5Points = fitPolygonToSquare(star5Points); + this.generatePolygon('star', star5Points); + this.generatePolygon('vee', [-1, -1, 0, -0.333, 1, -1, 0, 1]); + this.generatePolygon('rhomboid', [-1, -1, 0.333, -1, 1, 1, -0.333, 1]); + this.generatePolygon('right-rhomboid', [-0.333, -1, 1, -1, 0.333, 1, -1, 1]); + this.nodeShapes['concavehexagon'] = this.generatePolygon('concave-hexagon', [-1, -0.95, -0.75, 0, -1, 0.95, 1, 0.95, 0.75, 0, 1, -0.95]); + { + var tagPoints = [-1, -1, 0.25, -1, 1, 0, 0.25, 1, -1, 1]; + this.generatePolygon('tag', tagPoints); + this.generateRoundPolygon('round-tag', tagPoints); + } + + nodeShapes.makePolygon = function (points) { + // use caching on user-specified polygons so they are as fast as native shapes + var key = points.join('$'); + var name = 'polygon-' + key; + var shape; + + if (shape = this[name]) { + // got cached shape + return shape; + } // create and cache new shape + + + return renderer.generatePolygon(name, points); + }; + }; + + var BRp$1 = {}; + + BRp$1.timeToRender = function () { + return this.redrawTotalTime / this.redrawCount; + }; + + BRp$1.redraw = function (options) { + options = options || staticEmptyObject(); + var r = this; + + if (r.averageRedrawTime === undefined) { + r.averageRedrawTime = 0; + } + + if (r.lastRedrawTime === undefined) { + r.lastRedrawTime = 0; + } + + if (r.lastDrawTime === undefined) { + r.lastDrawTime = 0; + } + + r.requestedFrame = true; + r.renderOptions = options; + }; + + BRp$1.beforeRender = function (fn, priority) { + // the renderer can't add tick callbacks when destroyed + if (this.destroyed) { + return; + } + + if (priority == null) { + error('Priority is not optional for beforeRender'); + } + + var cbs = this.beforeRenderCallbacks; + cbs.push({ + fn: fn, + priority: priority + }); // higher priority callbacks executed first + + cbs.sort(function (a, b) { + return b.priority - a.priority; + }); + }; + + var beforeRenderCallbacks = function beforeRenderCallbacks(r, willDraw, startTime) { + var cbs = r.beforeRenderCallbacks; + + for (var i = 0; i < cbs.length; i++) { + cbs[i].fn(willDraw, startTime); + } + }; + + BRp$1.startRenderLoop = function () { + var r = this; + var cy = r.cy; + + if (r.renderLoopStarted) { + return; + } else { + r.renderLoopStarted = true; + } + + var renderFn = function renderFn(requestTime) { + if (r.destroyed) { + return; + } + + if (cy.batching()) ; else if (r.requestedFrame && !r.skipFrame) { + beforeRenderCallbacks(r, true, requestTime); + var startTime = performanceNow(); + r.render(r.renderOptions); + var endTime = r.lastDrawTime = performanceNow(); + + if (r.averageRedrawTime === undefined) { + r.averageRedrawTime = endTime - startTime; + } + + if (r.redrawCount === undefined) { + r.redrawCount = 0; + } + + r.redrawCount++; + + if (r.redrawTotalTime === undefined) { + r.redrawTotalTime = 0; + } + + var duration = endTime - startTime; + r.redrawTotalTime += duration; + r.lastRedrawTime = duration; // use a weighted average with a bias from the previous average so we don't spike so easily + + r.averageRedrawTime = r.averageRedrawTime / 2 + duration / 2; + r.requestedFrame = false; + } else { + beforeRenderCallbacks(r, false, requestTime); + } + + r.skipFrame = false; + requestAnimationFrame(renderFn); + }; + + requestAnimationFrame(renderFn); + }; + + var BaseRenderer = function BaseRenderer(options) { + this.init(options); + }; + + var BR = BaseRenderer; + var BRp = BR.prototype; + BRp.clientFunctions = ['redrawHint', 'render', 'renderTo', 'matchCanvasSize', 'nodeShapeImpl', 'arrowShapeImpl']; + + BRp.init = function (options) { + var r = this; + r.options = options; + r.cy = options.cy; + var ctr = r.container = options.cy.container(); + var containerWindow = r.cy.window(); // prepend a stylesheet in the head such that + + if (containerWindow) { + var document = containerWindow.document; + var head = document.head; + var stylesheetId = '__________cytoscape_stylesheet'; + var className = '__________cytoscape_container'; + var stylesheetAlreadyExists = document.getElementById(stylesheetId) != null; + + if (ctr.className.indexOf(className) < 0) { + ctr.className = (ctr.className || '') + ' ' + className; + } + + if (!stylesheetAlreadyExists) { + var stylesheet = document.createElement('style'); + stylesheet.id = stylesheetId; + stylesheet.textContent = '.' + className + ' { position: relative; }'; + head.insertBefore(stylesheet, head.children[0]); // first so lowest priority + } + + var computedStyle = containerWindow.getComputedStyle(ctr); + var position = computedStyle.getPropertyValue('position'); + + if (position === 'static') { + warn('A Cytoscape container has style position:static and so can not use UI extensions properly'); + } + } + + r.selection = [undefined, undefined, undefined, undefined, 0]; // Coordinates for selection box, plus enabled flag + + r.bezierProjPcts = [0.05, 0.225, 0.4, 0.5, 0.6, 0.775, 0.95]; //--Pointer-related data + + r.hoverData = { + down: null, + last: null, + downTime: null, + triggerMode: null, + dragging: false, + initialPan: [null, null], + capture: false + }; + r.dragData = { + possibleDragElements: [] + }; + r.touchData = { + start: null, + capture: false, + // These 3 fields related to tap, taphold events + startPosition: [null, null, null, null, null, null], + singleTouchStartTime: null, + singleTouchMoved: true, + now: [null, null, null, null, null, null], + earlier: [null, null, null, null, null, null] + }; + r.redraws = 0; + r.showFps = options.showFps; + r.debug = options.debug; + r.hideEdgesOnViewport = options.hideEdgesOnViewport; + r.textureOnViewport = options.textureOnViewport; + r.wheelSensitivity = options.wheelSensitivity; + r.motionBlurEnabled = options.motionBlur; // on by default + + r.forcedPixelRatio = number$1(options.pixelRatio) ? options.pixelRatio : null; + r.motionBlur = options.motionBlur; // for initial kick off + + r.motionBlurOpacity = options.motionBlurOpacity; + r.motionBlurTransparency = 1 - r.motionBlurOpacity; + r.motionBlurPxRatio = 1; + r.mbPxRBlurry = 1; //0.8; + + r.minMbLowQualFrames = 4; + r.fullQualityMb = false; + r.clearedForMotionBlur = []; + r.desktopTapThreshold = options.desktopTapThreshold; + r.desktopTapThreshold2 = options.desktopTapThreshold * options.desktopTapThreshold; + r.touchTapThreshold = options.touchTapThreshold; + r.touchTapThreshold2 = options.touchTapThreshold * options.touchTapThreshold; + r.tapholdDuration = 500; + r.bindings = []; + r.beforeRenderCallbacks = []; + r.beforeRenderPriorities = { + // higher priority execs before lower one + animations: 400, + eleCalcs: 300, + eleTxrDeq: 200, + lyrTxrDeq: 150, + lyrTxrSkip: 100 + }; + r.registerNodeShapes(); + r.registerArrowShapes(); + r.registerCalculationListeners(); + }; + + BRp.notify = function (eventName, eles) { + var r = this; + var cy = r.cy; // the renderer can't be notified after it's destroyed + + if (this.destroyed) { + return; + } + + if (eventName === 'init') { + r.load(); + return; + } + + if (eventName === 'destroy') { + r.destroy(); + return; + } + + if (eventName === 'add' || eventName === 'remove' || eventName === 'move' && cy.hasCompoundNodes() || eventName === 'load' || eventName === 'zorder' || eventName === 'mount') { + r.invalidateCachedZSortedEles(); + } + + if (eventName === 'viewport') { + r.redrawHint('select', true); + } + + if (eventName === 'load' || eventName === 'resize' || eventName === 'mount') { + r.invalidateContainerClientCoordsCache(); + r.matchCanvasSize(r.container); + } + + r.redrawHint('eles', true); + r.redrawHint('drag', true); + this.startRenderLoop(); + this.redraw(); + }; + + BRp.destroy = function () { + var r = this; + r.destroyed = true; + r.cy.stopAnimationLoop(); + + for (var i = 0; i < r.bindings.length; i++) { + var binding = r.bindings[i]; + var b = binding; + var tgt = b.target; + (tgt.off || tgt.removeEventListener).apply(tgt, b.args); + } + + r.bindings = []; + r.beforeRenderCallbacks = []; + r.onUpdateEleCalcsFns = []; + + if (r.removeObserver) { + r.removeObserver.disconnect(); + } + + if (r.styleObserver) { + r.styleObserver.disconnect(); + } + + if (r.resizeObserver) { + r.resizeObserver.disconnect(); + } + + if (r.labelCalcDiv) { + try { + document.body.removeChild(r.labelCalcDiv); // eslint-disable-line no-undef + } catch (e) {// ie10 issue #1014 + } + } + }; + + BRp.isHeadless = function () { + return false; + }; + + [BRp$f, BRp$5, BRp$4, BRp$3, BRp$2, BRp$1].forEach(function (props) { + extend(BRp, props); + }); + + var fullFpsTime = 1000 / 60; // assume 60 frames per second + + var defs = { + setupDequeueing: function setupDequeueing(opts) { + return function setupDequeueingImpl() { + var self = this; + var r = this.renderer; + + if (self.dequeueingSetup) { + return; + } else { + self.dequeueingSetup = true; + } + + var queueRedraw = debounce_1(function () { + r.redrawHint('eles', true); + r.redrawHint('drag', true); + r.redraw(); + }, opts.deqRedrawThreshold); + + var dequeue = function dequeue(willDraw, frameStartTime) { + var startTime = performanceNow(); + var avgRenderTime = r.averageRedrawTime; + var renderTime = r.lastRedrawTime; + var deqd = []; + var extent = r.cy.extent(); + var pixelRatio = r.getPixelRatio(); // if we aren't in a tick that causes a draw, then the rendered style + // queue won't automatically be flushed before dequeueing starts + + if (!willDraw) { + r.flushRenderedStyleQueue(); + } + + while (true) { + // eslint-disable-line no-constant-condition + var now = performanceNow(); + var duration = now - startTime; + var frameDuration = now - frameStartTime; + + if (renderTime < fullFpsTime) { + // if we're rendering faster than the ideal fps, then do dequeueing + // during all of the remaining frame time + var timeAvailable = fullFpsTime - (willDraw ? avgRenderTime : 0); + + if (frameDuration >= opts.deqFastCost * timeAvailable) { + break; + } + } else { + if (willDraw) { + if (duration >= opts.deqCost * renderTime || duration >= opts.deqAvgCost * avgRenderTime) { + break; + } + } else if (frameDuration >= opts.deqNoDrawCost * fullFpsTime) { + break; + } + } + + var thisDeqd = opts.deq(self, pixelRatio, extent); + + if (thisDeqd.length > 0) { + for (var i = 0; i < thisDeqd.length; i++) { + deqd.push(thisDeqd[i]); + } + } else { + break; + } + } // callbacks on dequeue + + + if (deqd.length > 0) { + opts.onDeqd(self, deqd); + + if (!willDraw && opts.shouldRedraw(self, deqd, pixelRatio, extent)) { + queueRedraw(); + } + } + }; + + var priority = opts.priority || noop$1; + r.beforeRender(dequeue, priority(self)); + }; + } + }; + + // Uses keys so elements may share the same cache. + + var ElementTextureCacheLookup = /*#__PURE__*/function () { + function ElementTextureCacheLookup(getKey) { + var doesEleInvalidateKey = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : falsify; + + _classCallCheck(this, ElementTextureCacheLookup); + + this.idsByKey = new Map$2(); + this.keyForId = new Map$2(); + this.cachesByLvl = new Map$2(); + this.lvls = []; + this.getKey = getKey; + this.doesEleInvalidateKey = doesEleInvalidateKey; + } + + _createClass(ElementTextureCacheLookup, [{ + key: "getIdsFor", + value: function getIdsFor(key) { + if (key == null) { + error("Can not get id list for null key"); + } + + var idsByKey = this.idsByKey; + var ids = this.idsByKey.get(key); + + if (!ids) { + ids = new Set$1(); + idsByKey.set(key, ids); + } + + return ids; + } + }, { + key: "addIdForKey", + value: function addIdForKey(key, id) { + if (key != null) { + this.getIdsFor(key).add(id); + } + } + }, { + key: "deleteIdForKey", + value: function deleteIdForKey(key, id) { + if (key != null) { + this.getIdsFor(key)["delete"](id); + } + } + }, { + key: "getNumberOfIdsForKey", + value: function getNumberOfIdsForKey(key) { + if (key == null) { + return 0; + } else { + return this.getIdsFor(key).size; + } + } + }, { + key: "updateKeyMappingFor", + value: function updateKeyMappingFor(ele) { + var id = ele.id(); + var prevKey = this.keyForId.get(id); + var currKey = this.getKey(ele); + this.deleteIdForKey(prevKey, id); + this.addIdForKey(currKey, id); + this.keyForId.set(id, currKey); + } + }, { + key: "deleteKeyMappingFor", + value: function deleteKeyMappingFor(ele) { + var id = ele.id(); + var prevKey = this.keyForId.get(id); + this.deleteIdForKey(prevKey, id); + this.keyForId["delete"](id); + } + }, { + key: "keyHasChangedFor", + value: function keyHasChangedFor(ele) { + var id = ele.id(); + var prevKey = this.keyForId.get(id); + var newKey = this.getKey(ele); + return prevKey !== newKey; + } + }, { + key: "isInvalid", + value: function isInvalid(ele) { + return this.keyHasChangedFor(ele) || this.doesEleInvalidateKey(ele); + } + }, { + key: "getCachesAt", + value: function getCachesAt(lvl) { + var cachesByLvl = this.cachesByLvl, + lvls = this.lvls; + var caches = cachesByLvl.get(lvl); + + if (!caches) { + caches = new Map$2(); + cachesByLvl.set(lvl, caches); + lvls.push(lvl); + } + + return caches; + } + }, { + key: "getCache", + value: function getCache(key, lvl) { + return this.getCachesAt(lvl).get(key); + } + }, { + key: "get", + value: function get(ele, lvl) { + var key = this.getKey(ele); + var cache = this.getCache(key, lvl); // getting for an element may need to add to the id list b/c eles can share keys + + if (cache != null) { + this.updateKeyMappingFor(ele); + } + + return cache; + } + }, { + key: "getForCachedKey", + value: function getForCachedKey(ele, lvl) { + var key = this.keyForId.get(ele.id()); // n.b. use cached key, not newly computed key + + var cache = this.getCache(key, lvl); + return cache; + } + }, { + key: "hasCache", + value: function hasCache(key, lvl) { + return this.getCachesAt(lvl).has(key); + } + }, { + key: "has", + value: function has(ele, lvl) { + var key = this.getKey(ele); + return this.hasCache(key, lvl); + } + }, { + key: "setCache", + value: function setCache(key, lvl, cache) { + cache.key = key; + this.getCachesAt(lvl).set(key, cache); + } + }, { + key: "set", + value: function set(ele, lvl, cache) { + var key = this.getKey(ele); + this.setCache(key, lvl, cache); + this.updateKeyMappingFor(ele); + } + }, { + key: "deleteCache", + value: function deleteCache(key, lvl) { + this.getCachesAt(lvl)["delete"](key); + } + }, { + key: "delete", + value: function _delete(ele, lvl) { + var key = this.getKey(ele); + this.deleteCache(key, lvl); + } + }, { + key: "invalidateKey", + value: function invalidateKey(key) { + var _this = this; + + this.lvls.forEach(function (lvl) { + return _this.deleteCache(key, lvl); + }); + } // returns true if no other eles reference the invalidated cache (n.b. other eles may need the cache with the same key) + + }, { + key: "invalidate", + value: function invalidate(ele) { + var id = ele.id(); + var key = this.keyForId.get(id); // n.b. use stored key rather than current (potential key) + + this.deleteKeyMappingFor(ele); + var entireKeyInvalidated = this.doesEleInvalidateKey(ele); + + if (entireKeyInvalidated) { + // clear mapping for current key + this.invalidateKey(key); + } + + return entireKeyInvalidated || this.getNumberOfIdsForKey(key) === 0; + } + }]); + + return ElementTextureCacheLookup; + }(); + + var minTxrH = 25; // the size of the texture cache for small height eles (special case) + + var txrStepH = 50; // the min size of the regular cache, and the size it increases with each step up + + var minLvl$1 = -4; // when scaling smaller than that we don't need to re-render + + var maxLvl$1 = 3; // when larger than this scale just render directly (caching is not helpful) + + var maxZoom$1 = 7.99; // beyond this zoom level, layered textures are not used + + var eleTxrSpacing = 8; // spacing between elements on textures to avoid blitting overlaps + + var defTxrWidth = 1024; // default/minimum texture width + + var maxTxrW = 1024; // the maximum width of a texture + + var maxTxrH = 1024; // the maximum height of a texture + + var minUtility = 0.2; // if usage of texture is less than this, it is retired + + var maxFullness = 0.8; // fullness of texture after which queue removal is checked + + var maxFullnessChecks = 10; // dequeued after this many checks + + var deqCost$1 = 0.15; // % of add'l rendering cost allowed for dequeuing ele caches each frame + + var deqAvgCost$1 = 0.1; // % of add'l rendering cost compared to average overall redraw time + + var deqNoDrawCost$1 = 0.9; // % of avg frame time that can be used for dequeueing when not drawing + + var deqFastCost$1 = 0.9; // % of frame time to be used when >60fps + + var deqRedrawThreshold$1 = 100; // time to batch redraws together from dequeueing to allow more dequeueing calcs to happen in the meanwhile + + var maxDeqSize$1 = 1; // number of eles to dequeue and render at higher texture in each batch + + var getTxrReasons = { + dequeue: 'dequeue', + downscale: 'downscale', + highQuality: 'highQuality' + }; + var initDefaults = defaults$g({ + getKey: null, + doesEleInvalidateKey: falsify, + drawElement: null, + getBoundingBox: null, + getRotationPoint: null, + getRotationOffset: null, + isVisible: trueify, + allowEdgeTxrCaching: true, + allowParentTxrCaching: true + }); + + var ElementTextureCache = function ElementTextureCache(renderer, initOptions) { + var self = this; + self.renderer = renderer; + self.onDequeues = []; + var opts = initDefaults(initOptions); + extend(self, opts); + self.lookup = new ElementTextureCacheLookup(opts.getKey, opts.doesEleInvalidateKey); + self.setupDequeueing(); + }; + + var ETCp = ElementTextureCache.prototype; + ETCp.reasons = getTxrReasons; // the list of textures in which new subtextures for elements can be placed + + ETCp.getTextureQueue = function (txrH) { + var self = this; + self.eleImgCaches = self.eleImgCaches || {}; + return self.eleImgCaches[txrH] = self.eleImgCaches[txrH] || []; + }; // the list of usused textures which can be recycled (in use in texture queue) + + + ETCp.getRetiredTextureQueue = function (txrH) { + var self = this; + var rtxtrQs = self.eleImgCaches.retired = self.eleImgCaches.retired || {}; + var rtxtrQ = rtxtrQs[txrH] = rtxtrQs[txrH] || []; + return rtxtrQ; + }; // queue of element draw requests at different scale levels + + + ETCp.getElementQueue = function () { + var self = this; + var q = self.eleCacheQueue = self.eleCacheQueue || new heap(function (a, b) { + return b.reqs - a.reqs; + }); + return q; + }; // queue of element draw requests at different scale levels (element id lookup) + + + ETCp.getElementKeyToQueue = function () { + var self = this; + var k2q = self.eleKeyToCacheQueue = self.eleKeyToCacheQueue || {}; + return k2q; + }; + + ETCp.getElement = function (ele, bb, pxRatio, lvl, reason) { + var self = this; + var r = this.renderer; + var zoom = r.cy.zoom(); + var lookup = this.lookup; + + if (!bb || bb.w === 0 || bb.h === 0 || isNaN(bb.w) || isNaN(bb.h) || !ele.visible() || ele.removed()) { + return null; + } + + if (!self.allowEdgeTxrCaching && ele.isEdge() || !self.allowParentTxrCaching && ele.isParent()) { + return null; + } + + if (lvl == null) { + lvl = Math.ceil(log2(zoom * pxRatio)); + } + + if (lvl < minLvl$1) { + lvl = minLvl$1; + } else if (zoom >= maxZoom$1 || lvl > maxLvl$1) { + return null; + } + + var scale = Math.pow(2, lvl); + var eleScaledH = bb.h * scale; + var eleScaledW = bb.w * scale; + var scaledLabelShown = r.eleTextBiggerThanMin(ele, scale); + + if (!this.isVisible(ele, scaledLabelShown)) { + return null; + } + + var eleCache = lookup.get(ele, lvl); // if this get was on an unused/invalidated cache, then restore the texture usage metric + + if (eleCache && eleCache.invalidated) { + eleCache.invalidated = false; + eleCache.texture.invalidatedWidth -= eleCache.width; + } + + if (eleCache) { + return eleCache; + } + + var txrH; // which texture height this ele belongs to + + if (eleScaledH <= minTxrH) { + txrH = minTxrH; + } else if (eleScaledH <= txrStepH) { + txrH = txrStepH; + } else { + txrH = Math.ceil(eleScaledH / txrStepH) * txrStepH; + } + + if (eleScaledH > maxTxrH || eleScaledW > maxTxrW) { + return null; // caching large elements is not efficient + } + + var txrQ = self.getTextureQueue(txrH); // first try the second last one in case it has space at the end + + var txr = txrQ[txrQ.length - 2]; + + var addNewTxr = function addNewTxr() { + return self.recycleTexture(txrH, eleScaledW) || self.addTexture(txrH, eleScaledW); + }; // try the last one if there is no second last one + + + if (!txr) { + txr = txrQ[txrQ.length - 1]; + } // if the last one doesn't exist, we need a first one + + + if (!txr) { + txr = addNewTxr(); + } // if there's no room in the current texture, we need a new one + + + if (txr.width - txr.usedWidth < eleScaledW) { + txr = addNewTxr(); + } + + var scalableFrom = function scalableFrom(otherCache) { + return otherCache && otherCache.scaledLabelShown === scaledLabelShown; + }; + + var deqing = reason && reason === getTxrReasons.dequeue; + var highQualityReq = reason && reason === getTxrReasons.highQuality; + var downscaleReq = reason && reason === getTxrReasons.downscale; + var higherCache; // the nearest cache with a higher level + + for (var l = lvl + 1; l <= maxLvl$1; l++) { + var c = lookup.get(ele, l); + + if (c) { + higherCache = c; + break; + } + } + + var oneUpCache = higherCache && higherCache.level === lvl + 1 ? higherCache : null; + + var downscale = function downscale() { + txr.context.drawImage(oneUpCache.texture.canvas, oneUpCache.x, 0, oneUpCache.width, oneUpCache.height, txr.usedWidth, 0, eleScaledW, eleScaledH); + }; // reset ele area in texture + + + txr.context.setTransform(1, 0, 0, 1, 0, 0); + txr.context.clearRect(txr.usedWidth, 0, eleScaledW, txrH); + + if (scalableFrom(oneUpCache)) { + // then we can relatively cheaply rescale the existing image w/o rerendering + downscale(); + } else if (scalableFrom(higherCache)) { + // then use the higher cache for now and queue the next level down + // to cheaply scale towards the smaller level + if (highQualityReq) { + for (var _l = higherCache.level; _l > lvl; _l--) { + oneUpCache = self.getElement(ele, bb, pxRatio, _l, getTxrReasons.downscale); + } + + downscale(); + } else { + self.queueElement(ele, higherCache.level - 1); + return higherCache; + } + } else { + var lowerCache; // the nearest cache with a lower level + + if (!deqing && !highQualityReq && !downscaleReq) { + for (var _l2 = lvl - 1; _l2 >= minLvl$1; _l2--) { + var _c = lookup.get(ele, _l2); + + if (_c) { + lowerCache = _c; + break; + } + } + } + + if (scalableFrom(lowerCache)) { + // then use the lower quality cache for now and queue the better one for later + self.queueElement(ele, lvl); + return lowerCache; + } + + txr.context.translate(txr.usedWidth, 0); + txr.context.scale(scale, scale); + this.drawElement(txr.context, ele, bb, scaledLabelShown, false); + txr.context.scale(1 / scale, 1 / scale); + txr.context.translate(-txr.usedWidth, 0); + } + + eleCache = { + x: txr.usedWidth, + texture: txr, + level: lvl, + scale: scale, + width: eleScaledW, + height: eleScaledH, + scaledLabelShown: scaledLabelShown + }; + txr.usedWidth += Math.ceil(eleScaledW + eleTxrSpacing); + txr.eleCaches.push(eleCache); + lookup.set(ele, lvl, eleCache); + self.checkTextureFullness(txr); + return eleCache; + }; + + ETCp.invalidateElements = function (eles) { + for (var i = 0; i < eles.length; i++) { + this.invalidateElement(eles[i]); + } + }; + + ETCp.invalidateElement = function (ele) { + var self = this; + var lookup = self.lookup; + var caches = []; + var invalid = lookup.isInvalid(ele); + + if (!invalid) { + return; // override the invalidation request if the element key has not changed + } + + for (var lvl = minLvl$1; lvl <= maxLvl$1; lvl++) { + var cache = lookup.getForCachedKey(ele, lvl); + + if (cache) { + caches.push(cache); + } + } + + var noOtherElesUseCache = lookup.invalidate(ele); + + if (noOtherElesUseCache) { + for (var i = 0; i < caches.length; i++) { + var _cache = caches[i]; + var txr = _cache.texture; // remove space from the texture it belongs to + + txr.invalidatedWidth += _cache.width; // mark the cache as invalidated + + _cache.invalidated = true; // retire the texture if its utility is low + + self.checkTextureUtility(txr); + } + } // remove from queue since the old req was for the old state + + + self.removeFromQueue(ele); + }; + + ETCp.checkTextureUtility = function (txr) { + // invalidate all entries in the cache if the cache size is small + if (txr.invalidatedWidth >= minUtility * txr.width) { + this.retireTexture(txr); + } + }; + + ETCp.checkTextureFullness = function (txr) { + // if texture has been mostly filled and passed over several times, remove + // it from the queue so we don't need to waste time looking at it to put new things + var self = this; + var txrQ = self.getTextureQueue(txr.height); + + if (txr.usedWidth / txr.width > maxFullness && txr.fullnessChecks >= maxFullnessChecks) { + removeFromArray(txrQ, txr); + } else { + txr.fullnessChecks++; + } + }; + + ETCp.retireTexture = function (txr) { + var self = this; + var txrH = txr.height; + var txrQ = self.getTextureQueue(txrH); + var lookup = this.lookup; // retire the texture from the active / searchable queue: + + removeFromArray(txrQ, txr); + txr.retired = true; // remove the refs from the eles to the caches: + + var eleCaches = txr.eleCaches; + + for (var i = 0; i < eleCaches.length; i++) { + var eleCache = eleCaches[i]; + lookup.deleteCache(eleCache.key, eleCache.level); + } + + clearArray(eleCaches); // add the texture to a retired queue so it can be recycled in future: + + var rtxtrQ = self.getRetiredTextureQueue(txrH); + rtxtrQ.push(txr); + }; + + ETCp.addTexture = function (txrH, minW) { + var self = this; + var txrQ = self.getTextureQueue(txrH); + var txr = {}; + txrQ.push(txr); + txr.eleCaches = []; + txr.height = txrH; + txr.width = Math.max(defTxrWidth, minW); + txr.usedWidth = 0; + txr.invalidatedWidth = 0; + txr.fullnessChecks = 0; + txr.canvas = self.renderer.makeOffscreenCanvas(txr.width, txr.height); + txr.context = txr.canvas.getContext('2d'); + return txr; + }; + + ETCp.recycleTexture = function (txrH, minW) { + var self = this; + var txrQ = self.getTextureQueue(txrH); + var rtxtrQ = self.getRetiredTextureQueue(txrH); + + for (var i = 0; i < rtxtrQ.length; i++) { + var txr = rtxtrQ[i]; + + if (txr.width >= minW) { + txr.retired = false; + txr.usedWidth = 0; + txr.invalidatedWidth = 0; + txr.fullnessChecks = 0; + clearArray(txr.eleCaches); + txr.context.setTransform(1, 0, 0, 1, 0, 0); + txr.context.clearRect(0, 0, txr.width, txr.height); + removeFromArray(rtxtrQ, txr); + txrQ.push(txr); + return txr; + } + } + }; + + ETCp.queueElement = function (ele, lvl) { + var self = this; + var q = self.getElementQueue(); + var k2q = self.getElementKeyToQueue(); + var key = this.getKey(ele); + var existingReq = k2q[key]; + + if (existingReq) { + // use the max lvl b/c in between lvls are cheap to make + existingReq.level = Math.max(existingReq.level, lvl); + existingReq.eles.merge(ele); + existingReq.reqs++; + q.updateItem(existingReq); + } else { + var req = { + eles: ele.spawn().merge(ele), + level: lvl, + reqs: 1, + key: key + }; + q.push(req); + k2q[key] = req; + } + }; + + ETCp.dequeue = function (pxRatio + /*, extent*/ + ) { + var self = this; + var q = self.getElementQueue(); + var k2q = self.getElementKeyToQueue(); + var dequeued = []; + var lookup = self.lookup; + + for (var i = 0; i < maxDeqSize$1; i++) { + if (q.size() > 0) { + var req = q.pop(); + var key = req.key; + var ele = req.eles[0]; // all eles have the same key + + var cacheExists = lookup.hasCache(ele, req.level); // clear out the key to req lookup + + k2q[key] = null; // dequeueing isn't necessary with an existing cache + + if (cacheExists) { + continue; + } + + dequeued.push(req); + var bb = self.getBoundingBox(ele); + self.getElement(ele, bb, pxRatio, req.level, getTxrReasons.dequeue); + } else { + break; + } + } + + return dequeued; + }; + + ETCp.removeFromQueue = function (ele) { + var self = this; + var q = self.getElementQueue(); + var k2q = self.getElementKeyToQueue(); + var key = this.getKey(ele); + var req = k2q[key]; + + if (req != null) { + if (req.eles.length === 1) { + // remove if last ele in the req + // bring to front of queue + req.reqs = MAX_INT$1; + q.updateItem(req); + q.pop(); // remove from queue + + k2q[key] = null; // remove from lookup map + } else { + // otherwise just remove ele from req + req.eles.unmerge(ele); + } + } + }; + + ETCp.onDequeue = function (fn) { + this.onDequeues.push(fn); + }; + + ETCp.offDequeue = function (fn) { + removeFromArray(this.onDequeues, fn); + }; + + ETCp.setupDequeueing = defs.setupDequeueing({ + deqRedrawThreshold: deqRedrawThreshold$1, + deqCost: deqCost$1, + deqAvgCost: deqAvgCost$1, + deqNoDrawCost: deqNoDrawCost$1, + deqFastCost: deqFastCost$1, + deq: function deq(self, pxRatio, extent) { + return self.dequeue(pxRatio, extent); + }, + onDeqd: function onDeqd(self, deqd) { + for (var i = 0; i < self.onDequeues.length; i++) { + var fn = self.onDequeues[i]; + fn(deqd); + } + }, + shouldRedraw: function shouldRedraw(self, deqd, pxRatio, extent) { + for (var i = 0; i < deqd.length; i++) { + var eles = deqd[i].eles; + + for (var j = 0; j < eles.length; j++) { + var bb = eles[j].boundingBox(); + + if (boundingBoxesIntersect(bb, extent)) { + return true; + } + } + } + + return false; + }, + priority: function priority(self) { + return self.renderer.beforeRenderPriorities.eleTxrDeq; + } + }); + + var defNumLayers = 1; // default number of layers to use + + var minLvl = -4; // when scaling smaller than that we don't need to re-render + + var maxLvl = 2; // when larger than this scale just render directly (caching is not helpful) + + var maxZoom = 3.99; // beyond this zoom level, layered textures are not used + + var deqRedrawThreshold = 50; // time to batch redraws together from dequeueing to allow more dequeueing calcs to happen in the meanwhile + + var refineEleDebounceTime = 50; // time to debounce sharper ele texture updates + + var deqCost = 0.15; // % of add'l rendering cost allowed for dequeuing ele caches each frame + + var deqAvgCost = 0.1; // % of add'l rendering cost compared to average overall redraw time + + var deqNoDrawCost = 0.9; // % of avg frame time that can be used for dequeueing when not drawing + + var deqFastCost = 0.9; // % of frame time to be used when >60fps + + var maxDeqSize = 1; // number of eles to dequeue and render at higher texture in each batch + + var invalidThreshold = 250; // time threshold for disabling b/c of invalidations + + var maxLayerArea = 4000 * 4000; // layers can't be bigger than this + + var useHighQualityEleTxrReqs = true; // whether to use high quality ele txr requests (generally faster and cheaper in the longterm) + // var log = function(){ console.log.apply( console, arguments ); }; + + var LayeredTextureCache = function LayeredTextureCache(renderer) { + var self = this; + var r = self.renderer = renderer; + var cy = r.cy; + self.layersByLevel = {}; // e.g. 2 => [ layer1, layer2, ..., layerN ] + + self.firstGet = true; + self.lastInvalidationTime = performanceNow() - 2 * invalidThreshold; + self.skipping = false; + self.eleTxrDeqs = cy.collection(); + self.scheduleElementRefinement = debounce_1(function () { + self.refineElementTextures(self.eleTxrDeqs); + self.eleTxrDeqs.unmerge(self.eleTxrDeqs); + }, refineEleDebounceTime); + r.beforeRender(function (willDraw, now) { + if (now - self.lastInvalidationTime <= invalidThreshold) { + self.skipping = true; + } else { + self.skipping = false; + } + }, r.beforeRenderPriorities.lyrTxrSkip); + + var qSort = function qSort(a, b) { + return b.reqs - a.reqs; + }; + + self.layersQueue = new heap(qSort); + self.setupDequeueing(); + }; + + var LTCp = LayeredTextureCache.prototype; + var layerIdPool = 0; + var MAX_INT = Math.pow(2, 53) - 1; + + LTCp.makeLayer = function (bb, lvl) { + var scale = Math.pow(2, lvl); + var w = Math.ceil(bb.w * scale); + var h = Math.ceil(bb.h * scale); + var canvas = this.renderer.makeOffscreenCanvas(w, h); + var layer = { + id: layerIdPool = ++layerIdPool % MAX_INT, + bb: bb, + level: lvl, + width: w, + height: h, + canvas: canvas, + context: canvas.getContext('2d'), + eles: [], + elesQueue: [], + reqs: 0 + }; // log('make layer %s with w %s and h %s and lvl %s', layer.id, layer.width, layer.height, layer.level); + + var cxt = layer.context; + var dx = -layer.bb.x1; + var dy = -layer.bb.y1; // do the transform on creation to save cycles (it's the same for all eles) + + cxt.scale(scale, scale); + cxt.translate(dx, dy); + return layer; + }; + + LTCp.getLayers = function (eles, pxRatio, lvl) { + var self = this; + var r = self.renderer; + var cy = r.cy; + var zoom = cy.zoom(); + var firstGet = self.firstGet; + self.firstGet = false; // log('--\nget layers with %s eles', eles.length); + //log eles.map(function(ele){ return ele.id() }) ); + + if (lvl == null) { + lvl = Math.ceil(log2(zoom * pxRatio)); + + if (lvl < minLvl) { + lvl = minLvl; + } else if (zoom >= maxZoom || lvl > maxLvl) { + return null; + } + } + + self.validateLayersElesOrdering(lvl, eles); + var layersByLvl = self.layersByLevel; + var scale = Math.pow(2, lvl); + var layers = layersByLvl[lvl] = layersByLvl[lvl] || []; + var bb; + var lvlComplete = self.levelIsComplete(lvl, eles); + var tmpLayers; + + var checkTempLevels = function checkTempLevels() { + var canUseAsTmpLvl = function canUseAsTmpLvl(l) { + self.validateLayersElesOrdering(l, eles); + + if (self.levelIsComplete(l, eles)) { + tmpLayers = layersByLvl[l]; + return true; + } + }; + + var checkLvls = function checkLvls(dir) { + if (tmpLayers) { + return; + } + + for (var l = lvl + dir; minLvl <= l && l <= maxLvl; l += dir) { + if (canUseAsTmpLvl(l)) { + break; + } + } + }; + + checkLvls(+1); + checkLvls(-1); // remove the invalid layers; they will be replaced as needed later in this function + + for (var i = layers.length - 1; i >= 0; i--) { + var layer = layers[i]; + + if (layer.invalid) { + removeFromArray(layers, layer); + } + } + }; + + if (!lvlComplete) { + // if the current level is incomplete, then use the closest, best quality layerset temporarily + // and later queue the current layerset so we can get the proper quality level soon + checkTempLevels(); + } else { + // log('level complete, using existing layers\n--'); + return layers; + } + + var getBb = function getBb() { + if (!bb) { + bb = makeBoundingBox(); + + for (var i = 0; i < eles.length; i++) { + updateBoundingBox(bb, eles[i].boundingBox()); + } + } + + return bb; + }; + + var makeLayer = function makeLayer(opts) { + opts = opts || {}; + var after = opts.after; + getBb(); + var area = bb.w * scale * (bb.h * scale); + + if (area > maxLayerArea) { + return null; + } + + var layer = self.makeLayer(bb, lvl); + + if (after != null) { + var index = layers.indexOf(after) + 1; + layers.splice(index, 0, layer); + } else if (opts.insert === undefined || opts.insert) { + // no after specified => first layer made so put at start + layers.unshift(layer); + } // if( tmpLayers ){ + //self.queueLayer( layer ); + // } + + + return layer; + }; + + if (self.skipping && !firstGet) { + // log('skip layers'); + return null; + } // log('do layers'); + + + var layer = null; + var maxElesPerLayer = eles.length / defNumLayers; + var allowLazyQueueing = !firstGet; + + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + var rs = ele._private.rscratch; + var caches = rs.imgLayerCaches = rs.imgLayerCaches || {}; // log('look at ele', ele.id()); + + var existingLayer = caches[lvl]; + + if (existingLayer) { + // reuse layer for later eles + // log('reuse layer for', ele.id()); + layer = existingLayer; + continue; + } + + if (!layer || layer.eles.length >= maxElesPerLayer || !boundingBoxInBoundingBox(layer.bb, ele.boundingBox())) { + // log('make new layer for ele %s', ele.id()); + layer = makeLayer({ + insert: true, + after: layer + }); // if now layer can be built then we can't use layers at this level + + if (!layer) { + return null; + } // log('new layer with id %s', layer.id); + + } + + if (tmpLayers || allowLazyQueueing) { + // log('queue ele %s in layer %s', ele.id(), layer.id); + self.queueLayer(layer, ele); + } else { + // log('draw ele %s in layer %s', ele.id(), layer.id); + self.drawEleInLayer(layer, ele, lvl, pxRatio); + } + + layer.eles.push(ele); + caches[lvl] = layer; + } // log('--'); + + + if (tmpLayers) { + // then we only queued the current layerset and can't draw it yet + return tmpLayers; + } + + if (allowLazyQueueing) { + // log('lazy queue level', lvl); + return null; + } + + return layers; + }; // a layer may want to use an ele cache of a higher level to avoid blurriness + // so the layer level might not equal the ele level + + + LTCp.getEleLevelForLayerLevel = function (lvl, pxRatio) { + return lvl; + }; + + LTCp.drawEleInLayer = function (layer, ele, lvl, pxRatio) { + var self = this; + var r = this.renderer; + var context = layer.context; + var bb = ele.boundingBox(); + + if (bb.w === 0 || bb.h === 0 || !ele.visible()) { + return; + } + + lvl = self.getEleLevelForLayerLevel(lvl, pxRatio); + + { + r.setImgSmoothing(context, false); + } + + { + r.drawCachedElement(context, ele, null, null, lvl, useHighQualityEleTxrReqs); + } + + { + r.setImgSmoothing(context, true); + } + }; + + LTCp.levelIsComplete = function (lvl, eles) { + var self = this; + var layers = self.layersByLevel[lvl]; + + if (!layers || layers.length === 0) { + return false; + } + + var numElesInLayers = 0; + + for (var i = 0; i < layers.length; i++) { + var layer = layers[i]; // if there are any eles needed to be drawn yet, the level is not complete + + if (layer.reqs > 0) { + return false; + } // if the layer is invalid, the level is not complete + + + if (layer.invalid) { + return false; + } + + numElesInLayers += layer.eles.length; + } // we should have exactly the number of eles passed in to be complete + + + if (numElesInLayers !== eles.length) { + return false; + } + + return true; + }; + + LTCp.validateLayersElesOrdering = function (lvl, eles) { + var layers = this.layersByLevel[lvl]; + + if (!layers) { + return; + } // if in a layer the eles are not in the same order, then the layer is invalid + // (i.e. there is an ele in between the eles in the layer) + + + for (var i = 0; i < layers.length; i++) { + var layer = layers[i]; + var offset = -1; // find the offset + + for (var j = 0; j < eles.length; j++) { + if (layer.eles[0] === eles[j]) { + offset = j; + break; + } + } + + if (offset < 0) { + // then the layer has nonexistent elements and is invalid + this.invalidateLayer(layer); + continue; + } // the eles in the layer must be in the same continuous order, else the layer is invalid + + + var o = offset; + + for (var j = 0; j < layer.eles.length; j++) { + if (layer.eles[j] !== eles[o + j]) { + // log('invalidate based on ordering', layer.id); + this.invalidateLayer(layer); + break; + } + } + } + }; + + LTCp.updateElementsInLayers = function (eles, update) { + var self = this; + var isEles = element(eles[0]); // collect udpated elements (cascaded from the layers) and update each + // layer itself along the way + + for (var i = 0; i < eles.length; i++) { + var req = isEles ? null : eles[i]; + var ele = isEles ? eles[i] : eles[i].ele; + var rs = ele._private.rscratch; + var caches = rs.imgLayerCaches = rs.imgLayerCaches || {}; + + for (var l = minLvl; l <= maxLvl; l++) { + var layer = caches[l]; + + if (!layer) { + continue; + } // if update is a request from the ele cache, then it affects only + // the matching level + + + if (req && self.getEleLevelForLayerLevel(layer.level) !== req.level) { + continue; + } + + update(layer, ele, req); + } + } + }; + + LTCp.haveLayers = function () { + var self = this; + var haveLayers = false; + + for (var l = minLvl; l <= maxLvl; l++) { + var layers = self.layersByLevel[l]; + + if (layers && layers.length > 0) { + haveLayers = true; + break; + } + } + + return haveLayers; + }; + + LTCp.invalidateElements = function (eles) { + var self = this; + + if (eles.length === 0) { + return; + } + + self.lastInvalidationTime = performanceNow(); // log('update invalidate layer time from eles'); + + if (eles.length === 0 || !self.haveLayers()) { + return; + } + + self.updateElementsInLayers(eles, function invalAssocLayers(layer, ele, req) { + self.invalidateLayer(layer); + }); + }; + + LTCp.invalidateLayer = function (layer) { + // log('update invalidate layer time'); + this.lastInvalidationTime = performanceNow(); + + if (layer.invalid) { + return; + } // save cycles + + + var lvl = layer.level; + var eles = layer.eles; + var layers = this.layersByLevel[lvl]; // log('invalidate layer', layer.id ); + + removeFromArray(layers, layer); // layer.eles = []; + + layer.elesQueue = []; + layer.invalid = true; + + if (layer.replacement) { + layer.replacement.invalid = true; + } + + for (var i = 0; i < eles.length; i++) { + var caches = eles[i]._private.rscratch.imgLayerCaches; + + if (caches) { + caches[lvl] = null; + } + } + }; + + LTCp.refineElementTextures = function (eles) { + var self = this; // log('refine', eles.length); + + self.updateElementsInLayers(eles, function refineEachEle(layer, ele, req) { + var rLyr = layer.replacement; + + if (!rLyr) { + rLyr = layer.replacement = self.makeLayer(layer.bb, layer.level); + rLyr.replaces = layer; + rLyr.eles = layer.eles; // log('make replacement layer %s for %s with level %s', rLyr.id, layer.id, rLyr.level); + } + + if (!rLyr.reqs) { + for (var i = 0; i < rLyr.eles.length; i++) { + self.queueLayer(rLyr, rLyr.eles[i]); + } // log('queue replacement layer refinement', rLyr.id); + + } + }); + }; + + LTCp.enqueueElementRefinement = function (ele) { + + this.eleTxrDeqs.merge(ele); + this.scheduleElementRefinement(); + }; + + LTCp.queueLayer = function (layer, ele) { + var self = this; + var q = self.layersQueue; + var elesQ = layer.elesQueue; + var hasId = elesQ.hasId = elesQ.hasId || {}; // if a layer is going to be replaced, queuing is a waste of time + + if (layer.replacement) { + return; + } + + if (ele) { + if (hasId[ele.id()]) { + return; + } + + elesQ.push(ele); + hasId[ele.id()] = true; + } + + if (layer.reqs) { + layer.reqs++; + q.updateItem(layer); + } else { + layer.reqs = 1; + q.push(layer); + } + }; + + LTCp.dequeue = function (pxRatio) { + var self = this; + var q = self.layersQueue; + var deqd = []; + var eleDeqs = 0; + + while (eleDeqs < maxDeqSize) { + if (q.size() === 0) { + break; + } + + var layer = q.peek(); // if a layer has been or will be replaced, then don't waste time with it + + if (layer.replacement) { + // log('layer %s in queue skipped b/c it already has a replacement', layer.id); + q.pop(); + continue; + } // if this is a replacement layer that has been superceded, then forget it + + + if (layer.replaces && layer !== layer.replaces.replacement) { + // log('layer is no longer the most uptodate replacement; dequeued', layer.id) + q.pop(); + continue; + } + + if (layer.invalid) { + // log('replacement layer %s is invalid; dequeued', layer.id); + q.pop(); + continue; + } + + var ele = layer.elesQueue.shift(); + + if (ele) { + // log('dequeue layer %s', layer.id); + self.drawEleInLayer(layer, ele, layer.level, pxRatio); + eleDeqs++; + } + + if (deqd.length === 0) { + // we need only one entry in deqd to queue redrawing etc + deqd.push(true); + } // if the layer has all its eles done, then remove from the queue + + + if (layer.elesQueue.length === 0) { + q.pop(); + layer.reqs = 0; // log('dequeue of layer %s complete', layer.id); + // when a replacement layer is dequeued, it replaces the old layer in the level + + if (layer.replaces) { + self.applyLayerReplacement(layer); + } + + self.requestRedraw(); + } + } + + return deqd; + }; + + LTCp.applyLayerReplacement = function (layer) { + var self = this; + var layersInLevel = self.layersByLevel[layer.level]; + var replaced = layer.replaces; + var index = layersInLevel.indexOf(replaced); // if the replaced layer is not in the active list for the level, then replacing + // refs would be a mistake (i.e. overwriting the true active layer) + + if (index < 0 || replaced.invalid) { + // log('replacement layer would have no effect', layer.id); + return; + } + + layersInLevel[index] = layer; // replace level ref + // replace refs in eles + + for (var i = 0; i < layer.eles.length; i++) { + var _p = layer.eles[i]._private; + var cache = _p.imgLayerCaches = _p.imgLayerCaches || {}; + + if (cache) { + cache[layer.level] = layer; + } + } // log('apply replacement layer %s over %s', layer.id, replaced.id); + + + self.requestRedraw(); + }; + + LTCp.requestRedraw = debounce_1(function () { + var r = this.renderer; + r.redrawHint('eles', true); + r.redrawHint('drag', true); + r.redraw(); + }, 100); + LTCp.setupDequeueing = defs.setupDequeueing({ + deqRedrawThreshold: deqRedrawThreshold, + deqCost: deqCost, + deqAvgCost: deqAvgCost, + deqNoDrawCost: deqNoDrawCost, + deqFastCost: deqFastCost, + deq: function deq(self, pxRatio) { + return self.dequeue(pxRatio); + }, + onDeqd: noop$1, + shouldRedraw: trueify, + priority: function priority(self) { + return self.renderer.beforeRenderPriorities.lyrTxrDeq; + } + }); + + var CRp$a = {}; + var impl; + + function polygon(context, points) { + for (var i = 0; i < points.length; i++) { + var pt = points[i]; + context.lineTo(pt.x, pt.y); + } + } + + function triangleBackcurve(context, points, controlPoint) { + var firstPt; + + for (var i = 0; i < points.length; i++) { + var pt = points[i]; + + if (i === 0) { + firstPt = pt; + } + + context.lineTo(pt.x, pt.y); + } + + context.quadraticCurveTo(controlPoint.x, controlPoint.y, firstPt.x, firstPt.y); + } + + function triangleTee(context, trianglePoints, teePoints) { + if (context.beginPath) { + context.beginPath(); + } + + var triPts = trianglePoints; + + for (var i = 0; i < triPts.length; i++) { + var pt = triPts[i]; + context.lineTo(pt.x, pt.y); + } + + var teePts = teePoints; + var firstTeePt = teePoints[0]; + context.moveTo(firstTeePt.x, firstTeePt.y); + + for (var i = 1; i < teePts.length; i++) { + var pt = teePts[i]; + context.lineTo(pt.x, pt.y); + } + + if (context.closePath) { + context.closePath(); + } + } + + function circleTriangle(context, trianglePoints, rx, ry, r) { + if (context.beginPath) { + context.beginPath(); + } + + context.arc(rx, ry, r, 0, Math.PI * 2, false); + var triPts = trianglePoints; + var firstTrPt = triPts[0]; + context.moveTo(firstTrPt.x, firstTrPt.y); + + for (var i = 0; i < triPts.length; i++) { + var pt = triPts[i]; + context.lineTo(pt.x, pt.y); + } + + if (context.closePath) { + context.closePath(); + } + } + + function circle(context, rx, ry, r) { + context.arc(rx, ry, r, 0, Math.PI * 2, false); + } + + CRp$a.arrowShapeImpl = function (name) { + return (impl || (impl = { + 'polygon': polygon, + 'triangle-backcurve': triangleBackcurve, + 'triangle-tee': triangleTee, + 'circle-triangle': circleTriangle, + 'triangle-cross': triangleTee, + 'circle': circle + }))[name]; + }; + + var CRp$9 = {}; + + CRp$9.drawElement = function (context, ele, shiftToOriginWithBb, showLabel, showOverlay, showOpacity) { + var r = this; + + if (ele.isNode()) { + r.drawNode(context, ele, shiftToOriginWithBb, showLabel, showOverlay, showOpacity); + } else { + r.drawEdge(context, ele, shiftToOriginWithBb, showLabel, showOverlay, showOpacity); + } + }; + + CRp$9.drawElementOverlay = function (context, ele) { + var r = this; + + if (ele.isNode()) { + r.drawNodeOverlay(context, ele); + } else { + r.drawEdgeOverlay(context, ele); + } + }; + + CRp$9.drawElementUnderlay = function (context, ele) { + var r = this; + + if (ele.isNode()) { + r.drawNodeUnderlay(context, ele); + } else { + r.drawEdgeUnderlay(context, ele); + } + }; + + CRp$9.drawCachedElementPortion = function (context, ele, eleTxrCache, pxRatio, lvl, reason, getRotation, getOpacity) { + var r = this; + var bb = eleTxrCache.getBoundingBox(ele); + + if (bb.w === 0 || bb.h === 0) { + return; + } // ignore zero size case + + + var eleCache = eleTxrCache.getElement(ele, bb, pxRatio, lvl, reason); + + if (eleCache != null) { + var opacity = getOpacity(r, ele); + + if (opacity === 0) { + return; + } + + var theta = getRotation(r, ele); + var x1 = bb.x1, + y1 = bb.y1, + w = bb.w, + h = bb.h; + var x, y, sx, sy, smooth; + + if (theta !== 0) { + var rotPt = eleTxrCache.getRotationPoint(ele); + sx = rotPt.x; + sy = rotPt.y; + context.translate(sx, sy); + context.rotate(theta); + smooth = r.getImgSmoothing(context); + + if (!smooth) { + r.setImgSmoothing(context, true); + } + + var off = eleTxrCache.getRotationOffset(ele); + x = off.x; + y = off.y; + } else { + x = x1; + y = y1; + } + + var oldGlobalAlpha; + + if (opacity !== 1) { + oldGlobalAlpha = context.globalAlpha; + context.globalAlpha = oldGlobalAlpha * opacity; + } + + context.drawImage(eleCache.texture.canvas, eleCache.x, 0, eleCache.width, eleCache.height, x, y, w, h); + + if (opacity !== 1) { + context.globalAlpha = oldGlobalAlpha; + } + + if (theta !== 0) { + context.rotate(-theta); + context.translate(-sx, -sy); + + if (!smooth) { + r.setImgSmoothing(context, false); + } + } + } else { + eleTxrCache.drawElement(context, ele); // direct draw fallback + } + }; + + var getZeroRotation = function getZeroRotation() { + return 0; + }; + + var getLabelRotation = function getLabelRotation(r, ele) { + return r.getTextAngle(ele, null); + }; + + var getSourceLabelRotation = function getSourceLabelRotation(r, ele) { + return r.getTextAngle(ele, 'source'); + }; + + var getTargetLabelRotation = function getTargetLabelRotation(r, ele) { + return r.getTextAngle(ele, 'target'); + }; + + var getOpacity = function getOpacity(r, ele) { + return ele.effectiveOpacity(); + }; + + var getTextOpacity = function getTextOpacity(e, ele) { + return ele.pstyle('text-opacity').pfValue * ele.effectiveOpacity(); + }; + + CRp$9.drawCachedElement = function (context, ele, pxRatio, extent, lvl, requestHighQuality) { + var r = this; + var _r$data = r.data, + eleTxrCache = _r$data.eleTxrCache, + lblTxrCache = _r$data.lblTxrCache, + slbTxrCache = _r$data.slbTxrCache, + tlbTxrCache = _r$data.tlbTxrCache; + var bb = ele.boundingBox(); + var reason = requestHighQuality === true ? eleTxrCache.reasons.highQuality : null; + + if (bb.w === 0 || bb.h === 0 || !ele.visible()) { + return; + } + + if (!extent || boundingBoxesIntersect(bb, extent)) { + var isEdge = ele.isEdge(); + + var badLine = ele.element()._private.rscratch.badLine; + + r.drawElementUnderlay(context, ele); + r.drawCachedElementPortion(context, ele, eleTxrCache, pxRatio, lvl, reason, getZeroRotation, getOpacity); + + if (!isEdge || !badLine) { + r.drawCachedElementPortion(context, ele, lblTxrCache, pxRatio, lvl, reason, getLabelRotation, getTextOpacity); + } + + if (isEdge && !badLine) { + r.drawCachedElementPortion(context, ele, slbTxrCache, pxRatio, lvl, reason, getSourceLabelRotation, getTextOpacity); + r.drawCachedElementPortion(context, ele, tlbTxrCache, pxRatio, lvl, reason, getTargetLabelRotation, getTextOpacity); + } + + r.drawElementOverlay(context, ele); + } + }; + + CRp$9.drawElements = function (context, eles) { + var r = this; + + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + r.drawElement(context, ele); + } + }; + + CRp$9.drawCachedElements = function (context, eles, pxRatio, extent) { + var r = this; + + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + r.drawCachedElement(context, ele, pxRatio, extent); + } + }; + + CRp$9.drawCachedNodes = function (context, eles, pxRatio, extent) { + var r = this; + + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + + if (!ele.isNode()) { + continue; + } + + r.drawCachedElement(context, ele, pxRatio, extent); + } + }; + + CRp$9.drawLayeredElements = function (context, eles, pxRatio, extent) { + var r = this; + var layers = r.data.lyrTxrCache.getLayers(eles, pxRatio); + + if (layers) { + for (var i = 0; i < layers.length; i++) { + var layer = layers[i]; + var bb = layer.bb; + + if (bb.w === 0 || bb.h === 0) { + continue; + } + + context.drawImage(layer.canvas, bb.x1, bb.y1, bb.w, bb.h); + } + } else { + // fall back on plain caching if no layers + r.drawCachedElements(context, eles, pxRatio, extent); + } + }; + + /* global Path2D */ + var CRp$8 = {}; + + CRp$8.drawEdge = function (context, edge, shiftToOriginWithBb) { + var drawLabel = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var shouldDrawOverlay = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true; + var shouldDrawOpacity = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true; + var r = this; + var rs = edge._private.rscratch; + + if (shouldDrawOpacity && !edge.visible()) { + return; + } // if bezier ctrl pts can not be calculated, then die + + + if (rs.badLine || rs.allpts == null || isNaN(rs.allpts[0])) { + // isNaN in case edge is impossible and browser bugs (e.g. safari) + return; + } + + var bb; + + if (shiftToOriginWithBb) { + bb = shiftToOriginWithBb; + context.translate(-bb.x1, -bb.y1); + } + + var opacity = shouldDrawOpacity ? edge.pstyle('opacity').value : 1; + var lineOpacity = shouldDrawOpacity ? edge.pstyle('line-opacity').value : 1; + var curveStyle = edge.pstyle('curve-style').value; + var lineStyle = edge.pstyle('line-style').value; + var edgeWidth = edge.pstyle('width').pfValue; + var lineCap = edge.pstyle('line-cap').value; + var effectiveLineOpacity = opacity * lineOpacity; // separate arrow opacity would require arrow-opacity property + + var effectiveArrowOpacity = opacity * lineOpacity; + + var drawLine = function drawLine() { + var strokeOpacity = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : effectiveLineOpacity; + + if (curveStyle === 'straight-triangle') { + r.eleStrokeStyle(context, edge, strokeOpacity); + r.drawEdgeTrianglePath(edge, context, rs.allpts); + } else { + context.lineWidth = edgeWidth; + context.lineCap = lineCap; + r.eleStrokeStyle(context, edge, strokeOpacity); + r.drawEdgePath(edge, context, rs.allpts, lineStyle); + context.lineCap = 'butt'; // reset for other drawing functions + } + }; + + var drawOverlay = function drawOverlay() { + if (!shouldDrawOverlay) { + return; + } + + r.drawEdgeOverlay(context, edge); + }; + + var drawUnderlay = function drawUnderlay() { + if (!shouldDrawOverlay) { + return; + } + + r.drawEdgeUnderlay(context, edge); + }; + + var drawArrows = function drawArrows() { + var arrowOpacity = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : effectiveArrowOpacity; + r.drawArrowheads(context, edge, arrowOpacity); + }; + + var drawText = function drawText() { + r.drawElementText(context, edge, null, drawLabel); + }; + + context.lineJoin = 'round'; + var ghost = edge.pstyle('ghost').value === 'yes'; + + if (ghost) { + var gx = edge.pstyle('ghost-offset-x').pfValue; + var gy = edge.pstyle('ghost-offset-y').pfValue; + var ghostOpacity = edge.pstyle('ghost-opacity').value; + var effectiveGhostOpacity = effectiveLineOpacity * ghostOpacity; + context.translate(gx, gy); + drawLine(effectiveGhostOpacity); + drawArrows(effectiveGhostOpacity); + context.translate(-gx, -gy); + } + + drawUnderlay(); + drawLine(); + drawArrows(); + drawOverlay(); + drawText(); + + if (shiftToOriginWithBb) { + context.translate(bb.x1, bb.y1); + } + }; + + var drawEdgeOverlayUnderlay = function drawEdgeOverlayUnderlay(overlayOrUnderlay) { + if (!['overlay', 'underlay'].includes(overlayOrUnderlay)) { + throw new Error('Invalid state'); + } + + return function (context, edge) { + if (!edge.visible()) { + return; + } + + var opacity = edge.pstyle("".concat(overlayOrUnderlay, "-opacity")).value; + + if (opacity === 0) { + return; + } + + var r = this; + var usePaths = r.usePaths(); + var rs = edge._private.rscratch; + var padding = edge.pstyle("".concat(overlayOrUnderlay, "-padding")).pfValue; + var width = 2 * padding; + var color = edge.pstyle("".concat(overlayOrUnderlay, "-color")).value; + context.lineWidth = width; + + if (rs.edgeType === 'self' && !usePaths) { + context.lineCap = 'butt'; + } else { + context.lineCap = 'round'; + } + + r.colorStrokeStyle(context, color[0], color[1], color[2], opacity); + r.drawEdgePath(edge, context, rs.allpts, 'solid'); + }; + }; + + CRp$8.drawEdgeOverlay = drawEdgeOverlayUnderlay('overlay'); + CRp$8.drawEdgeUnderlay = drawEdgeOverlayUnderlay('underlay'); + + CRp$8.drawEdgePath = function (edge, context, pts, type) { + var rs = edge._private.rscratch; + var canvasCxt = context; + var path; + var pathCacheHit = false; + var usePaths = this.usePaths(); + var lineDashPattern = edge.pstyle('line-dash-pattern').pfValue; + var lineDashOffset = edge.pstyle('line-dash-offset').pfValue; + + if (usePaths) { + var pathCacheKey = pts.join('$'); + var keyMatches = rs.pathCacheKey && rs.pathCacheKey === pathCacheKey; + + if (keyMatches) { + path = context = rs.pathCache; + pathCacheHit = true; + } else { + path = context = new Path2D(); + rs.pathCacheKey = pathCacheKey; + rs.pathCache = path; + } + } + + if (canvasCxt.setLineDash) { + // for very outofdate browsers + switch (type) { + case 'dotted': + canvasCxt.setLineDash([1, 1]); + break; + + case 'dashed': + canvasCxt.setLineDash(lineDashPattern); + canvasCxt.lineDashOffset = lineDashOffset; + break; + + case 'solid': + canvasCxt.setLineDash([]); + break; + } + } + + if (!pathCacheHit && !rs.badLine) { + if (context.beginPath) { + context.beginPath(); + } + + context.moveTo(pts[0], pts[1]); + + switch (rs.edgeType) { + case 'bezier': + case 'self': + case 'compound': + case 'multibezier': + for (var i = 2; i + 3 < pts.length; i += 4) { + context.quadraticCurveTo(pts[i], pts[i + 1], pts[i + 2], pts[i + 3]); + } + + break; + + case 'straight': + case 'segments': + case 'haystack': + for (var _i = 2; _i + 1 < pts.length; _i += 2) { + context.lineTo(pts[_i], pts[_i + 1]); + } + + break; + } + } + + context = canvasCxt; + + if (usePaths) { + context.stroke(path); + } else { + context.stroke(); + } // reset any line dashes + + + if (context.setLineDash) { + // for very outofdate browsers + context.setLineDash([]); + } + }; + + CRp$8.drawEdgeTrianglePath = function (edge, context, pts) { + // use line stroke style for triangle fill style + context.fillStyle = context.strokeStyle; + var edgeWidth = edge.pstyle('width').pfValue; + + for (var i = 0; i + 1 < pts.length; i += 2) { + var vector = [pts[i + 2] - pts[i], pts[i + 3] - pts[i + 1]]; + var length = Math.sqrt(vector[0] * vector[0] + vector[1] * vector[1]); + var normal = [vector[1] / length, -vector[0] / length]; + var triangleHead = [normal[0] * edgeWidth / 2, normal[1] * edgeWidth / 2]; + context.beginPath(); + context.moveTo(pts[i] - triangleHead[0], pts[i + 1] - triangleHead[1]); + context.lineTo(pts[i] + triangleHead[0], pts[i + 1] + triangleHead[1]); + context.lineTo(pts[i + 2], pts[i + 3]); + context.closePath(); + context.fill(); + } + }; + + CRp$8.drawArrowheads = function (context, edge, opacity) { + var rs = edge._private.rscratch; + var isHaystack = rs.edgeType === 'haystack'; + + if (!isHaystack) { + this.drawArrowhead(context, edge, 'source', rs.arrowStartX, rs.arrowStartY, rs.srcArrowAngle, opacity); + } + + this.drawArrowhead(context, edge, 'mid-target', rs.midX, rs.midY, rs.midtgtArrowAngle, opacity); + this.drawArrowhead(context, edge, 'mid-source', rs.midX, rs.midY, rs.midsrcArrowAngle, opacity); + + if (!isHaystack) { + this.drawArrowhead(context, edge, 'target', rs.arrowEndX, rs.arrowEndY, rs.tgtArrowAngle, opacity); + } + }; + + CRp$8.drawArrowhead = function (context, edge, prefix, x, y, angle, opacity) { + if (isNaN(x) || x == null || isNaN(y) || y == null || isNaN(angle) || angle == null) { + return; + } + + var self = this; + var arrowShape = edge.pstyle(prefix + '-arrow-shape').value; + + if (arrowShape === 'none') { + return; + } + + var arrowClearFill = edge.pstyle(prefix + '-arrow-fill').value === 'hollow' ? 'both' : 'filled'; + var arrowFill = edge.pstyle(prefix + '-arrow-fill').value; + var edgeWidth = edge.pstyle('width').pfValue; + var edgeOpacity = edge.pstyle('opacity').value; + + if (opacity === undefined) { + opacity = edgeOpacity; + } + + var gco = context.globalCompositeOperation; + + if (opacity !== 1 || arrowFill === 'hollow') { + // then extra clear is needed + context.globalCompositeOperation = 'destination-out'; + self.colorFillStyle(context, 255, 255, 255, 1); + self.colorStrokeStyle(context, 255, 255, 255, 1); + self.drawArrowShape(edge, context, arrowClearFill, edgeWidth, arrowShape, x, y, angle); + context.globalCompositeOperation = gco; + } // otherwise, the opaque arrow clears it for free :) + + + var color = edge.pstyle(prefix + '-arrow-color').value; + self.colorFillStyle(context, color[0], color[1], color[2], opacity); + self.colorStrokeStyle(context, color[0], color[1], color[2], opacity); + self.drawArrowShape(edge, context, arrowFill, edgeWidth, arrowShape, x, y, angle); + }; + + CRp$8.drawArrowShape = function (edge, context, fill, edgeWidth, shape, x, y, angle) { + var r = this; + var usePaths = this.usePaths() && shape !== 'triangle-cross'; + var pathCacheHit = false; + var path; + var canvasContext = context; + var translation = { + x: x, + y: y + }; + var scale = edge.pstyle('arrow-scale').value; + var size = this.getArrowWidth(edgeWidth, scale); + var shapeImpl = r.arrowShapes[shape]; + + if (usePaths) { + var cache = r.arrowPathCache = r.arrowPathCache || []; + var key = hashString(shape); + var cachedPath = cache[key]; + + if (cachedPath != null) { + path = context = cachedPath; + pathCacheHit = true; + } else { + path = context = new Path2D(); + cache[key] = path; + } + } + + if (!pathCacheHit) { + if (context.beginPath) { + context.beginPath(); + } + + if (usePaths) { + // store in the path cache with values easily manipulated later + shapeImpl.draw(context, 1, 0, { + x: 0, + y: 0 + }, 1); + } else { + shapeImpl.draw(context, size, angle, translation, edgeWidth); + } + + if (context.closePath) { + context.closePath(); + } + } + + context = canvasContext; + + if (usePaths) { + // set transform to arrow position/orientation + context.translate(x, y); + context.rotate(angle); + context.scale(size, size); + } + + if (fill === 'filled' || fill === 'both') { + if (usePaths) { + context.fill(path); + } else { + context.fill(); + } + } + + if (fill === 'hollow' || fill === 'both') { + context.lineWidth = (shapeImpl.matchEdgeWidth ? edgeWidth : 1) / (usePaths ? size : 1); + context.lineJoin = 'miter'; + + if (usePaths) { + context.stroke(path); + } else { + context.stroke(); + } + } + + if (usePaths) { + // reset transform by applying inverse + context.scale(1 / size, 1 / size); + context.rotate(-angle); + context.translate(-x, -y); + } + }; + + var CRp$7 = {}; + + CRp$7.safeDrawImage = function (context, img, ix, iy, iw, ih, x, y, w, h) { + // detect problematic cases for old browsers with bad images (cheaper than try-catch) + if (iw <= 0 || ih <= 0 || w <= 0 || h <= 0) { + return; + } + + try { + context.drawImage(img, ix, iy, iw, ih, x, y, w, h); + } catch (e) { + warn(e); + } + }; + + CRp$7.drawInscribedImage = function (context, img, node, index, nodeOpacity) { + var r = this; + var pos = node.position(); + var nodeX = pos.x; + var nodeY = pos.y; + var styleObj = node.cy().style(); + var getIndexedStyle = styleObj.getIndexedStyle.bind(styleObj); + var fit = getIndexedStyle(node, 'background-fit', 'value', index); + var repeat = getIndexedStyle(node, 'background-repeat', 'value', index); + var nodeW = node.width(); + var nodeH = node.height(); + var paddingX2 = node.padding() * 2; + var nodeTW = nodeW + (getIndexedStyle(node, 'background-width-relative-to', 'value', index) === 'inner' ? 0 : paddingX2); + var nodeTH = nodeH + (getIndexedStyle(node, 'background-height-relative-to', 'value', index) === 'inner' ? 0 : paddingX2); + var rs = node._private.rscratch; + var clip = getIndexedStyle(node, 'background-clip', 'value', index); + var shouldClip = clip === 'node'; + var imgOpacity = getIndexedStyle(node, 'background-image-opacity', 'value', index) * nodeOpacity; + var smooth = getIndexedStyle(node, 'background-image-smoothing', 'value', index); + var imgW = img.width || img.cachedW; + var imgH = img.height || img.cachedH; // workaround for broken browsers like ie + + if (null == imgW || null == imgH) { + document.body.appendChild(img); // eslint-disable-line no-undef + + imgW = img.cachedW = img.width || img.offsetWidth; + imgH = img.cachedH = img.height || img.offsetHeight; + document.body.removeChild(img); // eslint-disable-line no-undef + } + + var w = imgW; + var h = imgH; + + if (getIndexedStyle(node, 'background-width', 'value', index) !== 'auto') { + if (getIndexedStyle(node, 'background-width', 'units', index) === '%') { + w = getIndexedStyle(node, 'background-width', 'pfValue', index) * nodeTW; + } else { + w = getIndexedStyle(node, 'background-width', 'pfValue', index); + } + } + + if (getIndexedStyle(node, 'background-height', 'value', index) !== 'auto') { + if (getIndexedStyle(node, 'background-height', 'units', index) === '%') { + h = getIndexedStyle(node, 'background-height', 'pfValue', index) * nodeTH; + } else { + h = getIndexedStyle(node, 'background-height', 'pfValue', index); + } + } + + if (w === 0 || h === 0) { + return; // no point in drawing empty image (and chrome is broken in this case) + } + + if (fit === 'contain') { + var scale = Math.min(nodeTW / w, nodeTH / h); + w *= scale; + h *= scale; + } else if (fit === 'cover') { + var scale = Math.max(nodeTW / w, nodeTH / h); + w *= scale; + h *= scale; + } + + var x = nodeX - nodeTW / 2; // left + + var posXUnits = getIndexedStyle(node, 'background-position-x', 'units', index); + var posXPfVal = getIndexedStyle(node, 'background-position-x', 'pfValue', index); + + if (posXUnits === '%') { + x += (nodeTW - w) * posXPfVal; + } else { + x += posXPfVal; + } + + var offXUnits = getIndexedStyle(node, 'background-offset-x', 'units', index); + var offXPfVal = getIndexedStyle(node, 'background-offset-x', 'pfValue', index); + + if (offXUnits === '%') { + x += (nodeTW - w) * offXPfVal; + } else { + x += offXPfVal; + } + + var y = nodeY - nodeTH / 2; // top + + var posYUnits = getIndexedStyle(node, 'background-position-y', 'units', index); + var posYPfVal = getIndexedStyle(node, 'background-position-y', 'pfValue', index); + + if (posYUnits === '%') { + y += (nodeTH - h) * posYPfVal; + } else { + y += posYPfVal; + } + + var offYUnits = getIndexedStyle(node, 'background-offset-y', 'units', index); + var offYPfVal = getIndexedStyle(node, 'background-offset-y', 'pfValue', index); + + if (offYUnits === '%') { + y += (nodeTH - h) * offYPfVal; + } else { + y += offYPfVal; + } + + if (rs.pathCache) { + x -= nodeX; + y -= nodeY; + nodeX = 0; + nodeY = 0; + } + + var gAlpha = context.globalAlpha; + context.globalAlpha = imgOpacity; + var smoothingEnabled = r.getImgSmoothing(context); + var isSmoothingSwitched = false; + + if (smooth === 'no' && smoothingEnabled) { + r.setImgSmoothing(context, false); + isSmoothingSwitched = true; + } else if (smooth === 'yes' && !smoothingEnabled) { + r.setImgSmoothing(context, true); + isSmoothingSwitched = true; + } + + if (repeat === 'no-repeat') { + if (shouldClip) { + context.save(); + + if (rs.pathCache) { + context.clip(rs.pathCache); + } else { + r.nodeShapes[r.getNodeShape(node)].draw(context, nodeX, nodeY, nodeTW, nodeTH); + context.clip(); + } + } + + r.safeDrawImage(context, img, 0, 0, imgW, imgH, x, y, w, h); + + if (shouldClip) { + context.restore(); + } + } else { + var pattern = context.createPattern(img, repeat); + context.fillStyle = pattern; + r.nodeShapes[r.getNodeShape(node)].draw(context, nodeX, nodeY, nodeTW, nodeTH); + context.translate(x, y); + context.fill(); + context.translate(-x, -y); + } + + context.globalAlpha = gAlpha; + + if (isSmoothingSwitched) { + r.setImgSmoothing(context, smoothingEnabled); + } + }; + + var CRp$6 = {}; + + CRp$6.eleTextBiggerThanMin = function (ele, scale) { + if (!scale) { + var zoom = ele.cy().zoom(); + var pxRatio = this.getPixelRatio(); + var lvl = Math.ceil(log2(zoom * pxRatio)); // the effective texture level + + scale = Math.pow(2, lvl); + } + + var computedSize = ele.pstyle('font-size').pfValue * scale; + var minSize = ele.pstyle('min-zoomed-font-size').pfValue; + + if (computedSize < minSize) { + return false; + } + + return true; + }; + + CRp$6.drawElementText = function (context, ele, shiftToOriginWithBb, force, prefix) { + var useEleOpacity = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true; + var r = this; + + if (force == null) { + if (useEleOpacity && !r.eleTextBiggerThanMin(ele)) { + return; + } + } else if (force === false) { + return; + } + + if (ele.isNode()) { + var label = ele.pstyle('label'); + + if (!label || !label.value) { + return; + } + + var justification = r.getLabelJustification(ele); + context.textAlign = justification; + context.textBaseline = 'bottom'; + } else { + var badLine = ele.element()._private.rscratch.badLine; + + var _label = ele.pstyle('label'); + + var srcLabel = ele.pstyle('source-label'); + var tgtLabel = ele.pstyle('target-label'); + + if (badLine || (!_label || !_label.value) && (!srcLabel || !srcLabel.value) && (!tgtLabel || !tgtLabel.value)) { + return; + } + + context.textAlign = 'center'; + context.textBaseline = 'bottom'; + } + + var applyRotation = !shiftToOriginWithBb; + var bb; + + if (shiftToOriginWithBb) { + bb = shiftToOriginWithBb; + context.translate(-bb.x1, -bb.y1); + } + + if (prefix == null) { + r.drawText(context, ele, null, applyRotation, useEleOpacity); + + if (ele.isEdge()) { + r.drawText(context, ele, 'source', applyRotation, useEleOpacity); + r.drawText(context, ele, 'target', applyRotation, useEleOpacity); + } + } else { + r.drawText(context, ele, prefix, applyRotation, useEleOpacity); + } + + if (shiftToOriginWithBb) { + context.translate(bb.x1, bb.y1); + } + }; + + CRp$6.getFontCache = function (context) { + var cache; + this.fontCaches = this.fontCaches || []; + + for (var i = 0; i < this.fontCaches.length; i++) { + cache = this.fontCaches[i]; + + if (cache.context === context) { + return cache; + } + } + + cache = { + context: context + }; + this.fontCaches.push(cache); + return cache; + }; // set up canvas context with font + // returns transformed text string + + + CRp$6.setupTextStyle = function (context, ele) { + var useEleOpacity = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; + // Font style + var labelStyle = ele.pstyle('font-style').strValue; + var labelSize = ele.pstyle('font-size').pfValue + 'px'; + var labelFamily = ele.pstyle('font-family').strValue; + var labelWeight = ele.pstyle('font-weight').strValue; + var opacity = useEleOpacity ? ele.effectiveOpacity() * ele.pstyle('text-opacity').value : 1; + var outlineOpacity = ele.pstyle('text-outline-opacity').value * opacity; + var color = ele.pstyle('color').value; + var outlineColor = ele.pstyle('text-outline-color').value; + context.font = labelStyle + ' ' + labelWeight + ' ' + labelSize + ' ' + labelFamily; + context.lineJoin = 'round'; // so text outlines aren't jagged + + this.colorFillStyle(context, color[0], color[1], color[2], opacity); + this.colorStrokeStyle(context, outlineColor[0], outlineColor[1], outlineColor[2], outlineOpacity); + }; // TODO ensure re-used + + + function roundRect(ctx, x, y, width, height) { + var radius = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 5; + ctx.beginPath(); + ctx.moveTo(x + radius, y); + ctx.lineTo(x + width - radius, y); + ctx.quadraticCurveTo(x + width, y, x + width, y + radius); + ctx.lineTo(x + width, y + height - radius); + ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height); + ctx.lineTo(x + radius, y + height); + ctx.quadraticCurveTo(x, y + height, x, y + height - radius); + ctx.lineTo(x, y + radius); + ctx.quadraticCurveTo(x, y, x + radius, y); + ctx.closePath(); + ctx.fill(); + } + + CRp$6.getTextAngle = function (ele, prefix) { + var theta; + var _p = ele._private; + var rscratch = _p.rscratch; + var pdash = prefix ? prefix + '-' : ''; + var rotation = ele.pstyle(pdash + 'text-rotation'); + var textAngle = getPrefixedProperty(rscratch, 'labelAngle', prefix); + + if (rotation.strValue === 'autorotate') { + theta = ele.isEdge() ? textAngle : 0; + } else if (rotation.strValue === 'none') { + theta = 0; + } else { + theta = rotation.pfValue; + } + + return theta; + }; + + CRp$6.drawText = function (context, ele, prefix) { + var applyRotation = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var useEleOpacity = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true; + var _p = ele._private; + var rscratch = _p.rscratch; + var parentOpacity = useEleOpacity ? ele.effectiveOpacity() : 1; + + if (useEleOpacity && (parentOpacity === 0 || ele.pstyle('text-opacity').value === 0)) { + return; + } // use 'main' as an alias for the main label (i.e. null prefix) + + + if (prefix === 'main') { + prefix = null; + } + + var textX = getPrefixedProperty(rscratch, 'labelX', prefix); + var textY = getPrefixedProperty(rscratch, 'labelY', prefix); + var orgTextX, orgTextY; // used for rotation + + var text = this.getLabelText(ele, prefix); + + if (text != null && text !== '' && !isNaN(textX) && !isNaN(textY)) { + this.setupTextStyle(context, ele, useEleOpacity); + var pdash = prefix ? prefix + '-' : ''; + var textW = getPrefixedProperty(rscratch, 'labelWidth', prefix); + var textH = getPrefixedProperty(rscratch, 'labelHeight', prefix); + var marginX = ele.pstyle(pdash + 'text-margin-x').pfValue; + var marginY = ele.pstyle(pdash + 'text-margin-y').pfValue; + var isEdge = ele.isEdge(); + var halign = ele.pstyle('text-halign').value; + var valign = ele.pstyle('text-valign').value; + + if (isEdge) { + halign = 'center'; + valign = 'center'; + } + + textX += marginX; + textY += marginY; + var theta; + + if (!applyRotation) { + theta = 0; + } else { + theta = this.getTextAngle(ele, prefix); + } + + if (theta !== 0) { + orgTextX = textX; + orgTextY = textY; + context.translate(orgTextX, orgTextY); + context.rotate(theta); + textX = 0; + textY = 0; + } + + switch (valign) { + case 'top': + break; + + case 'center': + textY += textH / 2; + break; + + case 'bottom': + textY += textH; + break; + } + + var backgroundOpacity = ele.pstyle('text-background-opacity').value; + var borderOpacity = ele.pstyle('text-border-opacity').value; + var textBorderWidth = ele.pstyle('text-border-width').pfValue; + var backgroundPadding = ele.pstyle('text-background-padding').pfValue; + + if (backgroundOpacity > 0 || textBorderWidth > 0 && borderOpacity > 0) { + var bgX = textX - backgroundPadding; + + switch (halign) { + case 'left': + bgX -= textW; + break; + + case 'center': + bgX -= textW / 2; + break; + } + + var bgY = textY - textH - backgroundPadding; + var bgW = textW + 2 * backgroundPadding; + var bgH = textH + 2 * backgroundPadding; + + if (backgroundOpacity > 0) { + var textFill = context.fillStyle; + var textBackgroundColor = ele.pstyle('text-background-color').value; + context.fillStyle = 'rgba(' + textBackgroundColor[0] + ',' + textBackgroundColor[1] + ',' + textBackgroundColor[2] + ',' + backgroundOpacity * parentOpacity + ')'; + var styleShape = ele.pstyle('text-background-shape').strValue; + + if (styleShape.indexOf('round') === 0) { + roundRect(context, bgX, bgY, bgW, bgH, 2); + } else { + context.fillRect(bgX, bgY, bgW, bgH); + } + + context.fillStyle = textFill; + } + + if (textBorderWidth > 0 && borderOpacity > 0) { + var textStroke = context.strokeStyle; + var textLineWidth = context.lineWidth; + var textBorderColor = ele.pstyle('text-border-color').value; + var textBorderStyle = ele.pstyle('text-border-style').value; + context.strokeStyle = 'rgba(' + textBorderColor[0] + ',' + textBorderColor[1] + ',' + textBorderColor[2] + ',' + borderOpacity * parentOpacity + ')'; + context.lineWidth = textBorderWidth; + + if (context.setLineDash) { + // for very outofdate browsers + switch (textBorderStyle) { + case 'dotted': + context.setLineDash([1, 1]); + break; + + case 'dashed': + context.setLineDash([4, 2]); + break; + + case 'double': + context.lineWidth = textBorderWidth / 4; // 50% reserved for white between the two borders + + context.setLineDash([]); + break; + + case 'solid': + context.setLineDash([]); + break; + } + } + + context.strokeRect(bgX, bgY, bgW, bgH); + + if (textBorderStyle === 'double') { + var whiteWidth = textBorderWidth / 2; + context.strokeRect(bgX + whiteWidth, bgY + whiteWidth, bgW - whiteWidth * 2, bgH - whiteWidth * 2); + } + + if (context.setLineDash) { + // for very outofdate browsers + context.setLineDash([]); + } + + context.lineWidth = textLineWidth; + context.strokeStyle = textStroke; + } + } + + var lineWidth = 2 * ele.pstyle('text-outline-width').pfValue; // *2 b/c the stroke is drawn centred on the middle + + if (lineWidth > 0) { + context.lineWidth = lineWidth; + } + + if (ele.pstyle('text-wrap').value === 'wrap') { + var lines = getPrefixedProperty(rscratch, 'labelWrapCachedLines', prefix); + var lineHeight = getPrefixedProperty(rscratch, 'labelLineHeight', prefix); + var halfTextW = textW / 2; + var justification = this.getLabelJustification(ele); + + if (justification === 'auto') ; else if (halign === 'left') { + // auto justification : right + if (justification === 'left') { + textX += -textW; + } else if (justification === 'center') { + textX += -halfTextW; + } // else same as auto + + } else if (halign === 'center') { + // auto justfication : center + if (justification === 'left') { + textX += -halfTextW; + } else if (justification === 'right') { + textX += halfTextW; + } // else same as auto + + } else if (halign === 'right') { + // auto justification : left + if (justification === 'center') { + textX += halfTextW; + } else if (justification === 'right') { + textX += textW; + } // else same as auto + + } + + switch (valign) { + case 'top': + textY -= (lines.length - 1) * lineHeight; + break; + + case 'center': + case 'bottom': + textY -= (lines.length - 1) * lineHeight; + break; + } + + for (var l = 0; l < lines.length; l++) { + if (lineWidth > 0) { + context.strokeText(lines[l], textX, textY); + } + + context.fillText(lines[l], textX, textY); + textY += lineHeight; + } + } else { + if (lineWidth > 0) { + context.strokeText(text, textX, textY); + } + + context.fillText(text, textX, textY); + } + + if (theta !== 0) { + context.rotate(-theta); + context.translate(-orgTextX, -orgTextY); + } + } + }; + + /* global Path2D */ + var CRp$5 = {}; + + CRp$5.drawNode = function (context, node, shiftToOriginWithBb) { + var drawLabel = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var shouldDrawOverlay = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true; + var shouldDrawOpacity = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true; + var r = this; + var nodeWidth, nodeHeight; + var _p = node._private; + var rs = _p.rscratch; + var pos = node.position(); + + if (!number$1(pos.x) || !number$1(pos.y)) { + return; // can't draw node with undefined position + } + + if (shouldDrawOpacity && !node.visible()) { + return; + } + + var eleOpacity = shouldDrawOpacity ? node.effectiveOpacity() : 1; + var usePaths = r.usePaths(); + var path; + var pathCacheHit = false; + var padding = node.padding(); + nodeWidth = node.width() + 2 * padding; + nodeHeight = node.height() + 2 * padding; // + // setup shift + + var bb; + + if (shiftToOriginWithBb) { + bb = shiftToOriginWithBb; + context.translate(-bb.x1, -bb.y1); + } // + // load bg image + + + var bgImgProp = node.pstyle('background-image'); + var urls = bgImgProp.value; + var urlDefined = new Array(urls.length); + var image = new Array(urls.length); + var numImages = 0; + + for (var i = 0; i < urls.length; i++) { + var url = urls[i]; + var defd = urlDefined[i] = url != null && url !== 'none'; + + if (defd) { + var bgImgCrossOrigin = node.cy().style().getIndexedStyle(node, 'background-image-crossorigin', 'value', i); + numImages++; // get image, and if not loaded then ask to redraw when later loaded + + image[i] = r.getCachedImage(url, bgImgCrossOrigin, function () { + _p.backgroundTimestamp = Date.now(); + node.emitAndNotify('background'); + }); + } + } // + // setup styles + + + var darkness = node.pstyle('background-blacken').value; + var borderWidth = node.pstyle('border-width').pfValue; + var bgOpacity = node.pstyle('background-opacity').value * eleOpacity; + var borderColor = node.pstyle('border-color').value; + var borderStyle = node.pstyle('border-style').value; + var borderOpacity = node.pstyle('border-opacity').value * eleOpacity; + context.lineJoin = 'miter'; // so borders are square with the node shape + + var setupShapeColor = function setupShapeColor() { + var bgOpy = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : bgOpacity; + r.eleFillStyle(context, node, bgOpy); + }; + + var setupBorderColor = function setupBorderColor() { + var bdrOpy = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : borderOpacity; + r.colorStrokeStyle(context, borderColor[0], borderColor[1], borderColor[2], bdrOpy); + }; // + // setup shape + + + var styleShape = node.pstyle('shape').strValue; + var shapePts = node.pstyle('shape-polygon-points').pfValue; + + if (usePaths) { + context.translate(pos.x, pos.y); + var pathCache = r.nodePathCache = r.nodePathCache || []; + var key = hashStrings(styleShape === 'polygon' ? styleShape + ',' + shapePts.join(',') : styleShape, '' + nodeHeight, '' + nodeWidth); + var cachedPath = pathCache[key]; + + if (cachedPath != null) { + path = cachedPath; + pathCacheHit = true; + rs.pathCache = path; + } else { + path = new Path2D(); + pathCache[key] = rs.pathCache = path; + } + } + + var drawShape = function drawShape() { + if (!pathCacheHit) { + var npos = pos; + + if (usePaths) { + npos = { + x: 0, + y: 0 + }; + } + + r.nodeShapes[r.getNodeShape(node)].draw(path || context, npos.x, npos.y, nodeWidth, nodeHeight); + } + + if (usePaths) { + context.fill(path); + } else { + context.fill(); + } + }; + + var drawImages = function drawImages() { + var nodeOpacity = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : eleOpacity; + var inside = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + var prevBging = _p.backgrounding; + var totalCompleted = 0; + + for (var _i = 0; _i < image.length; _i++) { + var bgContainment = node.cy().style().getIndexedStyle(node, 'background-image-containment', 'value', _i); + + if (inside && bgContainment === 'over' || !inside && bgContainment === 'inside') { + totalCompleted++; + continue; + } + + if (urlDefined[_i] && image[_i].complete && !image[_i].error) { + totalCompleted++; + r.drawInscribedImage(context, image[_i], node, _i, nodeOpacity); + } + } + + _p.backgrounding = !(totalCompleted === numImages); + + if (prevBging !== _p.backgrounding) { + // update style b/c :backgrounding state changed + node.updateStyle(false); + } + }; + + var drawPie = function drawPie() { + var redrawShape = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + var pieOpacity = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : eleOpacity; + + if (r.hasPie(node)) { + r.drawPie(context, node, pieOpacity); // redraw/restore path if steps after pie need it + + if (redrawShape) { + if (!usePaths) { + r.nodeShapes[r.getNodeShape(node)].draw(context, pos.x, pos.y, nodeWidth, nodeHeight); + } + } + } + }; + + var darken = function darken() { + var darkenOpacity = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : eleOpacity; + var opacity = (darkness > 0 ? darkness : -darkness) * darkenOpacity; + var c = darkness > 0 ? 0 : 255; + + if (darkness !== 0) { + r.colorFillStyle(context, c, c, c, opacity); + + if (usePaths) { + context.fill(path); + } else { + context.fill(); + } + } + }; + + var drawBorder = function drawBorder() { + if (borderWidth > 0) { + context.lineWidth = borderWidth; + context.lineCap = 'butt'; + + if (context.setLineDash) { + // for very outofdate browsers + switch (borderStyle) { + case 'dotted': + context.setLineDash([1, 1]); + break; + + case 'dashed': + context.setLineDash([4, 2]); + break; + + case 'solid': + case 'double': + context.setLineDash([]); + break; + } + } + + if (usePaths) { + context.stroke(path); + } else { + context.stroke(); + } + + if (borderStyle === 'double') { + context.lineWidth = borderWidth / 3; + var gco = context.globalCompositeOperation; + context.globalCompositeOperation = 'destination-out'; + + if (usePaths) { + context.stroke(path); + } else { + context.stroke(); + } + + context.globalCompositeOperation = gco; + } // reset in case we changed the border style + + + if (context.setLineDash) { + // for very outofdate browsers + context.setLineDash([]); + } + } + }; + + var drawOverlay = function drawOverlay() { + if (shouldDrawOverlay) { + r.drawNodeOverlay(context, node, pos, nodeWidth, nodeHeight); + } + }; + + var drawUnderlay = function drawUnderlay() { + if (shouldDrawOverlay) { + r.drawNodeUnderlay(context, node, pos, nodeWidth, nodeHeight); + } + }; + + var drawText = function drawText() { + r.drawElementText(context, node, null, drawLabel); + }; + + var ghost = node.pstyle('ghost').value === 'yes'; + + if (ghost) { + var gx = node.pstyle('ghost-offset-x').pfValue; + var gy = node.pstyle('ghost-offset-y').pfValue; + var ghostOpacity = node.pstyle('ghost-opacity').value; + var effGhostOpacity = ghostOpacity * eleOpacity; + context.translate(gx, gy); + setupShapeColor(ghostOpacity * bgOpacity); + drawShape(); + drawImages(effGhostOpacity, true); + setupBorderColor(ghostOpacity * borderOpacity); + drawBorder(); + drawPie(darkness !== 0 || borderWidth !== 0); + drawImages(effGhostOpacity, false); + darken(effGhostOpacity); + context.translate(-gx, -gy); + } + + if (usePaths) { + context.translate(-pos.x, -pos.y); + } + + drawUnderlay(); + + if (usePaths) { + context.translate(pos.x, pos.y); + } + + setupShapeColor(); + drawShape(); + drawImages(eleOpacity, true); + setupBorderColor(); + drawBorder(); + drawPie(darkness !== 0 || borderWidth !== 0); + drawImages(eleOpacity, false); + darken(); + + if (usePaths) { + context.translate(-pos.x, -pos.y); + } + + drawText(); + drawOverlay(); // + // clean up shift + + if (shiftToOriginWithBb) { + context.translate(bb.x1, bb.y1); + } + }; + + var drawNodeOverlayUnderlay = function drawNodeOverlayUnderlay(overlayOrUnderlay) { + if (!['overlay', 'underlay'].includes(overlayOrUnderlay)) { + throw new Error('Invalid state'); + } + + return function (context, node, pos, nodeWidth, nodeHeight) { + var r = this; + + if (!node.visible()) { + return; + } + + var padding = node.pstyle("".concat(overlayOrUnderlay, "-padding")).pfValue; + var opacity = node.pstyle("".concat(overlayOrUnderlay, "-opacity")).value; + var color = node.pstyle("".concat(overlayOrUnderlay, "-color")).value; + var shape = node.pstyle("".concat(overlayOrUnderlay, "-shape")).value; + + if (opacity > 0) { + pos = pos || node.position(); + + if (nodeWidth == null || nodeHeight == null) { + var _padding = node.padding(); + + nodeWidth = node.width() + 2 * _padding; + nodeHeight = node.height() + 2 * _padding; + } + + r.colorFillStyle(context, color[0], color[1], color[2], opacity); + r.nodeShapes[shape].draw(context, pos.x, pos.y, nodeWidth + padding * 2, nodeHeight + padding * 2); + context.fill(); + } + }; + }; + + CRp$5.drawNodeOverlay = drawNodeOverlayUnderlay('overlay'); + CRp$5.drawNodeUnderlay = drawNodeOverlayUnderlay('underlay'); // does the node have at least one pie piece? + + CRp$5.hasPie = function (node) { + node = node[0]; // ensure ele ref + + return node._private.hasPie; + }; + + CRp$5.drawPie = function (context, node, nodeOpacity, pos) { + node = node[0]; // ensure ele ref + + pos = pos || node.position(); + var cyStyle = node.cy().style(); + var pieSize = node.pstyle('pie-size'); + var x = pos.x; + var y = pos.y; + var nodeW = node.width(); + var nodeH = node.height(); + var radius = Math.min(nodeW, nodeH) / 2; // must fit in node + + var lastPercent = 0; // what % to continue drawing pie slices from on [0, 1] + + var usePaths = this.usePaths(); + + if (usePaths) { + x = 0; + y = 0; + } + + if (pieSize.units === '%') { + radius = radius * pieSize.pfValue; + } else if (pieSize.pfValue !== undefined) { + radius = pieSize.pfValue / 2; + } + + for (var i = 1; i <= cyStyle.pieBackgroundN; i++) { + // 1..N + var size = node.pstyle('pie-' + i + '-background-size').value; + var color = node.pstyle('pie-' + i + '-background-color').value; + var opacity = node.pstyle('pie-' + i + '-background-opacity').value * nodeOpacity; + var percent = size / 100; // map integer range [0, 100] to [0, 1] + // percent can't push beyond 1 + + if (percent + lastPercent > 1) { + percent = 1 - lastPercent; + } + + var angleStart = 1.5 * Math.PI + 2 * Math.PI * lastPercent; // start at 12 o'clock and go clockwise + + var angleDelta = 2 * Math.PI * percent; + var angleEnd = angleStart + angleDelta; // ignore if + // - zero size + // - we're already beyond the full circle + // - adding the current slice would go beyond the full circle + + if (size === 0 || lastPercent >= 1 || lastPercent + percent > 1) { + continue; + } + + context.beginPath(); + context.moveTo(x, y); + context.arc(x, y, radius, angleStart, angleEnd); + context.closePath(); + this.colorFillStyle(context, color[0], color[1], color[2], opacity); + context.fill(); + lastPercent += percent; + } + }; + + var CRp$4 = {}; + var motionBlurDelay = 100; // var isFirefox = typeof InstallTrigger !== 'undefined'; + + CRp$4.getPixelRatio = function () { + var context = this.data.contexts[0]; + + if (this.forcedPixelRatio != null) { + return this.forcedPixelRatio; + } + + var backingStore = context.backingStorePixelRatio || context.webkitBackingStorePixelRatio || context.mozBackingStorePixelRatio || context.msBackingStorePixelRatio || context.oBackingStorePixelRatio || context.backingStorePixelRatio || 1; + return (window.devicePixelRatio || 1) / backingStore; // eslint-disable-line no-undef + }; + + CRp$4.paintCache = function (context) { + var caches = this.paintCaches = this.paintCaches || []; + var needToCreateCache = true; + var cache; + + for (var i = 0; i < caches.length; i++) { + cache = caches[i]; + + if (cache.context === context) { + needToCreateCache = false; + break; + } + } + + if (needToCreateCache) { + cache = { + context: context + }; + caches.push(cache); + } + + return cache; + }; + + CRp$4.createGradientStyleFor = function (context, shapeStyleName, ele, fill, opacity) { + var gradientStyle; + var usePaths = this.usePaths(); + var colors = ele.pstyle(shapeStyleName + '-gradient-stop-colors').value, + positions = ele.pstyle(shapeStyleName + '-gradient-stop-positions').pfValue; + + if (fill === 'radial-gradient') { + if (ele.isEdge()) { + var start = ele.sourceEndpoint(), + end = ele.targetEndpoint(), + mid = ele.midpoint(); + var d1 = dist(start, mid); + var d2 = dist(end, mid); + gradientStyle = context.createRadialGradient(mid.x, mid.y, 0, mid.x, mid.y, Math.max(d1, d2)); + } else { + var pos = usePaths ? { + x: 0, + y: 0 + } : ele.position(), + width = ele.paddedWidth(), + height = ele.paddedHeight(); + gradientStyle = context.createRadialGradient(pos.x, pos.y, 0, pos.x, pos.y, Math.max(width, height)); + } + } else { + if (ele.isEdge()) { + var _start = ele.sourceEndpoint(), + _end = ele.targetEndpoint(); + + gradientStyle = context.createLinearGradient(_start.x, _start.y, _end.x, _end.y); + } else { + var _pos = usePaths ? { + x: 0, + y: 0 + } : ele.position(), + _width = ele.paddedWidth(), + _height = ele.paddedHeight(), + halfWidth = _width / 2, + halfHeight = _height / 2; + + var direction = ele.pstyle('background-gradient-direction').value; + + switch (direction) { + case 'to-bottom': + gradientStyle = context.createLinearGradient(_pos.x, _pos.y - halfHeight, _pos.x, _pos.y + halfHeight); + break; + + case 'to-top': + gradientStyle = context.createLinearGradient(_pos.x, _pos.y + halfHeight, _pos.x, _pos.y - halfHeight); + break; + + case 'to-left': + gradientStyle = context.createLinearGradient(_pos.x + halfWidth, _pos.y, _pos.x - halfWidth, _pos.y); + break; + + case 'to-right': + gradientStyle = context.createLinearGradient(_pos.x - halfWidth, _pos.y, _pos.x + halfWidth, _pos.y); + break; + + case 'to-bottom-right': + case 'to-right-bottom': + gradientStyle = context.createLinearGradient(_pos.x - halfWidth, _pos.y - halfHeight, _pos.x + halfWidth, _pos.y + halfHeight); + break; + + case 'to-top-right': + case 'to-right-top': + gradientStyle = context.createLinearGradient(_pos.x - halfWidth, _pos.y + halfHeight, _pos.x + halfWidth, _pos.y - halfHeight); + break; + + case 'to-bottom-left': + case 'to-left-bottom': + gradientStyle = context.createLinearGradient(_pos.x + halfWidth, _pos.y - halfHeight, _pos.x - halfWidth, _pos.y + halfHeight); + break; + + case 'to-top-left': + case 'to-left-top': + gradientStyle = context.createLinearGradient(_pos.x + halfWidth, _pos.y + halfHeight, _pos.x - halfWidth, _pos.y - halfHeight); + break; + } + } + } + + if (!gradientStyle) return null; // invalid gradient style + + var hasPositions = positions.length === colors.length; + var length = colors.length; + + for (var i = 0; i < length; i++) { + gradientStyle.addColorStop(hasPositions ? positions[i] : i / (length - 1), 'rgba(' + colors[i][0] + ',' + colors[i][1] + ',' + colors[i][2] + ',' + opacity + ')'); + } + + return gradientStyle; + }; + + CRp$4.gradientFillStyle = function (context, ele, fill, opacity) { + var gradientStyle = this.createGradientStyleFor(context, 'background', ele, fill, opacity); + if (!gradientStyle) return null; // error + + context.fillStyle = gradientStyle; + }; + + CRp$4.colorFillStyle = function (context, r, g, b, a) { + context.fillStyle = 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')'; // turn off for now, seems context does its own caching + // var cache = this.paintCache(context); + // var fillStyle = 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')'; + // if( cache.fillStyle !== fillStyle ){ + // context.fillStyle = cache.fillStyle = fillStyle; + // } + }; + + CRp$4.eleFillStyle = function (context, ele, opacity) { + var backgroundFill = ele.pstyle('background-fill').value; + + if (backgroundFill === 'linear-gradient' || backgroundFill === 'radial-gradient') { + this.gradientFillStyle(context, ele, backgroundFill, opacity); + } else { + var backgroundColor = ele.pstyle('background-color').value; + this.colorFillStyle(context, backgroundColor[0], backgroundColor[1], backgroundColor[2], opacity); + } + }; + + CRp$4.gradientStrokeStyle = function (context, ele, fill, opacity) { + var gradientStyle = this.createGradientStyleFor(context, 'line', ele, fill, opacity); + if (!gradientStyle) return null; // error + + context.strokeStyle = gradientStyle; + }; + + CRp$4.colorStrokeStyle = function (context, r, g, b, a) { + context.strokeStyle = 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')'; // turn off for now, seems context does its own caching + // var cache = this.paintCache(context); + // var strokeStyle = 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')'; + // if( cache.strokeStyle !== strokeStyle ){ + // context.strokeStyle = cache.strokeStyle = strokeStyle; + // } + }; + + CRp$4.eleStrokeStyle = function (context, ele, opacity) { + var lineFill = ele.pstyle('line-fill').value; + + if (lineFill === 'linear-gradient' || lineFill === 'radial-gradient') { + this.gradientStrokeStyle(context, ele, lineFill, opacity); + } else { + var lineColor = ele.pstyle('line-color').value; + this.colorStrokeStyle(context, lineColor[0], lineColor[1], lineColor[2], opacity); + } + }; // Resize canvas + + + CRp$4.matchCanvasSize = function (container) { + var r = this; + var data = r.data; + var bb = r.findContainerClientCoords(); + var width = bb[2]; + var height = bb[3]; + var pixelRatio = r.getPixelRatio(); + var mbPxRatio = r.motionBlurPxRatio; + + if (container === r.data.bufferCanvases[r.MOTIONBLUR_BUFFER_NODE] || container === r.data.bufferCanvases[r.MOTIONBLUR_BUFFER_DRAG]) { + pixelRatio = mbPxRatio; + } + + var canvasWidth = width * pixelRatio; + var canvasHeight = height * pixelRatio; + var canvas; + + if (canvasWidth === r.canvasWidth && canvasHeight === r.canvasHeight) { + return; // save cycles if same + } + + r.fontCaches = null; // resizing resets the style + + var canvasContainer = data.canvasContainer; + canvasContainer.style.width = width + 'px'; + canvasContainer.style.height = height + 'px'; + + for (var i = 0; i < r.CANVAS_LAYERS; i++) { + canvas = data.canvases[i]; + canvas.width = canvasWidth; + canvas.height = canvasHeight; + canvas.style.width = width + 'px'; + canvas.style.height = height + 'px'; + } + + for (var i = 0; i < r.BUFFER_COUNT; i++) { + canvas = data.bufferCanvases[i]; + canvas.width = canvasWidth; + canvas.height = canvasHeight; + canvas.style.width = width + 'px'; + canvas.style.height = height + 'px'; + } + + r.textureMult = 1; + + if (pixelRatio <= 1) { + canvas = data.bufferCanvases[r.TEXTURE_BUFFER]; + r.textureMult = 2; + canvas.width = canvasWidth * r.textureMult; + canvas.height = canvasHeight * r.textureMult; + } + + r.canvasWidth = canvasWidth; + r.canvasHeight = canvasHeight; + }; + + CRp$4.renderTo = function (cxt, zoom, pan, pxRatio) { + this.render({ + forcedContext: cxt, + forcedZoom: zoom, + forcedPan: pan, + drawAllLayers: true, + forcedPxRatio: pxRatio + }); + }; + + CRp$4.render = function (options) { + options = options || staticEmptyObject(); + var forcedContext = options.forcedContext; + var drawAllLayers = options.drawAllLayers; + var drawOnlyNodeLayer = options.drawOnlyNodeLayer; + var forcedZoom = options.forcedZoom; + var forcedPan = options.forcedPan; + var r = this; + var pixelRatio = options.forcedPxRatio === undefined ? this.getPixelRatio() : options.forcedPxRatio; + var cy = r.cy; + var data = r.data; + var needDraw = data.canvasNeedsRedraw; + var textureDraw = r.textureOnViewport && !forcedContext && (r.pinching || r.hoverData.dragging || r.swipePanning || r.data.wheelZooming); + var motionBlur = options.motionBlur !== undefined ? options.motionBlur : r.motionBlur; + var mbPxRatio = r.motionBlurPxRatio; + var hasCompoundNodes = cy.hasCompoundNodes(); + var inNodeDragGesture = r.hoverData.draggingEles; + var inBoxSelection = r.hoverData.selecting || r.touchData.selecting ? true : false; + motionBlur = motionBlur && !forcedContext && r.motionBlurEnabled && !inBoxSelection; + var motionBlurFadeEffect = motionBlur; + + if (!forcedContext) { + if (r.prevPxRatio !== pixelRatio) { + r.invalidateContainerClientCoordsCache(); + r.matchCanvasSize(r.container); + r.redrawHint('eles', true); + r.redrawHint('drag', true); + } + + r.prevPxRatio = pixelRatio; + } + + if (!forcedContext && r.motionBlurTimeout) { + clearTimeout(r.motionBlurTimeout); + } + + if (motionBlur) { + if (r.mbFrames == null) { + r.mbFrames = 0; + } + + r.mbFrames++; + + if (r.mbFrames < 3) { + // need several frames before even high quality motionblur + motionBlurFadeEffect = false; + } // go to lower quality blurry frames when several m/b frames have been rendered (avoids flashing) + + + if (r.mbFrames > r.minMbLowQualFrames) { + //r.fullQualityMb = false; + r.motionBlurPxRatio = r.mbPxRBlurry; + } + } + + if (r.clearingMotionBlur) { + r.motionBlurPxRatio = 1; + } // b/c drawToContext() may be async w.r.t. redraw(), keep track of last texture frame + // because a rogue async texture frame would clear needDraw + + + if (r.textureDrawLastFrame && !textureDraw) { + needDraw[r.NODE] = true; + needDraw[r.SELECT_BOX] = true; + } + + var style = cy.style(); + var zoom = cy.zoom(); + var effectiveZoom = forcedZoom !== undefined ? forcedZoom : zoom; + var pan = cy.pan(); + var effectivePan = { + x: pan.x, + y: pan.y + }; + var vp = { + zoom: zoom, + pan: { + x: pan.x, + y: pan.y + } + }; + var prevVp = r.prevViewport; + var viewportIsDiff = prevVp === undefined || vp.zoom !== prevVp.zoom || vp.pan.x !== prevVp.pan.x || vp.pan.y !== prevVp.pan.y; // we want the low quality motionblur only when the viewport is being manipulated etc (where it's not noticed) + + if (!viewportIsDiff && !(inNodeDragGesture && !hasCompoundNodes)) { + r.motionBlurPxRatio = 1; + } + + if (forcedPan) { + effectivePan = forcedPan; + } // apply pixel ratio + + + effectiveZoom *= pixelRatio; + effectivePan.x *= pixelRatio; + effectivePan.y *= pixelRatio; + var eles = r.getCachedZSortedEles(); + + function mbclear(context, x, y, w, h) { + var gco = context.globalCompositeOperation; + context.globalCompositeOperation = 'destination-out'; + r.colorFillStyle(context, 255, 255, 255, r.motionBlurTransparency); + context.fillRect(x, y, w, h); + context.globalCompositeOperation = gco; + } + + function setContextTransform(context, clear) { + var ePan, eZoom, w, h; + + if (!r.clearingMotionBlur && (context === data.bufferContexts[r.MOTIONBLUR_BUFFER_NODE] || context === data.bufferContexts[r.MOTIONBLUR_BUFFER_DRAG])) { + ePan = { + x: pan.x * mbPxRatio, + y: pan.y * mbPxRatio + }; + eZoom = zoom * mbPxRatio; + w = r.canvasWidth * mbPxRatio; + h = r.canvasHeight * mbPxRatio; + } else { + ePan = effectivePan; + eZoom = effectiveZoom; + w = r.canvasWidth; + h = r.canvasHeight; + } + + context.setTransform(1, 0, 0, 1, 0, 0); + + if (clear === 'motionBlur') { + mbclear(context, 0, 0, w, h); + } else if (!forcedContext && (clear === undefined || clear)) { + context.clearRect(0, 0, w, h); + } + + if (!drawAllLayers) { + context.translate(ePan.x, ePan.y); + context.scale(eZoom, eZoom); + } + + if (forcedPan) { + context.translate(forcedPan.x, forcedPan.y); + } + + if (forcedZoom) { + context.scale(forcedZoom, forcedZoom); + } + } + + if (!textureDraw) { + r.textureDrawLastFrame = false; + } + + if (textureDraw) { + r.textureDrawLastFrame = true; + + if (!r.textureCache) { + r.textureCache = {}; + r.textureCache.bb = cy.mutableElements().boundingBox(); + r.textureCache.texture = r.data.bufferCanvases[r.TEXTURE_BUFFER]; + var cxt = r.data.bufferContexts[r.TEXTURE_BUFFER]; + cxt.setTransform(1, 0, 0, 1, 0, 0); + cxt.clearRect(0, 0, r.canvasWidth * r.textureMult, r.canvasHeight * r.textureMult); + r.render({ + forcedContext: cxt, + drawOnlyNodeLayer: true, + forcedPxRatio: pixelRatio * r.textureMult + }); + var vp = r.textureCache.viewport = { + zoom: cy.zoom(), + pan: cy.pan(), + width: r.canvasWidth, + height: r.canvasHeight + }; + vp.mpan = { + x: (0 - vp.pan.x) / vp.zoom, + y: (0 - vp.pan.y) / vp.zoom + }; + } + + needDraw[r.DRAG] = false; + needDraw[r.NODE] = false; + var context = data.contexts[r.NODE]; + var texture = r.textureCache.texture; + var vp = r.textureCache.viewport; + context.setTransform(1, 0, 0, 1, 0, 0); + + if (motionBlur) { + mbclear(context, 0, 0, vp.width, vp.height); + } else { + context.clearRect(0, 0, vp.width, vp.height); + } + + var outsideBgColor = style.core('outside-texture-bg-color').value; + var outsideBgOpacity = style.core('outside-texture-bg-opacity').value; + r.colorFillStyle(context, outsideBgColor[0], outsideBgColor[1], outsideBgColor[2], outsideBgOpacity); + context.fillRect(0, 0, vp.width, vp.height); + var zoom = cy.zoom(); + setContextTransform(context, false); + context.clearRect(vp.mpan.x, vp.mpan.y, vp.width / vp.zoom / pixelRatio, vp.height / vp.zoom / pixelRatio); + context.drawImage(texture, vp.mpan.x, vp.mpan.y, vp.width / vp.zoom / pixelRatio, vp.height / vp.zoom / pixelRatio); + } else if (r.textureOnViewport && !forcedContext) { + // clear the cache since we don't need it + r.textureCache = null; + } + + var extent = cy.extent(); + var vpManip = r.pinching || r.hoverData.dragging || r.swipePanning || r.data.wheelZooming || r.hoverData.draggingEles || r.cy.animated(); + var hideEdges = r.hideEdgesOnViewport && vpManip; + var needMbClear = []; + needMbClear[r.NODE] = !needDraw[r.NODE] && motionBlur && !r.clearedForMotionBlur[r.NODE] || r.clearingMotionBlur; + + if (needMbClear[r.NODE]) { + r.clearedForMotionBlur[r.NODE] = true; + } + + needMbClear[r.DRAG] = !needDraw[r.DRAG] && motionBlur && !r.clearedForMotionBlur[r.DRAG] || r.clearingMotionBlur; + + if (needMbClear[r.DRAG]) { + r.clearedForMotionBlur[r.DRAG] = true; + } + + if (needDraw[r.NODE] || drawAllLayers || drawOnlyNodeLayer || needMbClear[r.NODE]) { + var useBuffer = motionBlur && !needMbClear[r.NODE] && mbPxRatio !== 1; + var context = forcedContext || (useBuffer ? r.data.bufferContexts[r.MOTIONBLUR_BUFFER_NODE] : data.contexts[r.NODE]); + var clear = motionBlur && !useBuffer ? 'motionBlur' : undefined; + setContextTransform(context, clear); + + if (hideEdges) { + r.drawCachedNodes(context, eles.nondrag, pixelRatio, extent); + } else { + r.drawLayeredElements(context, eles.nondrag, pixelRatio, extent); + } + + if (r.debug) { + r.drawDebugPoints(context, eles.nondrag); + } + + if (!drawAllLayers && !motionBlur) { + needDraw[r.NODE] = false; + } + } + + if (!drawOnlyNodeLayer && (needDraw[r.DRAG] || drawAllLayers || needMbClear[r.DRAG])) { + var useBuffer = motionBlur && !needMbClear[r.DRAG] && mbPxRatio !== 1; + var context = forcedContext || (useBuffer ? r.data.bufferContexts[r.MOTIONBLUR_BUFFER_DRAG] : data.contexts[r.DRAG]); + setContextTransform(context, motionBlur && !useBuffer ? 'motionBlur' : undefined); + + if (hideEdges) { + r.drawCachedNodes(context, eles.drag, pixelRatio, extent); + } else { + r.drawCachedElements(context, eles.drag, pixelRatio, extent); + } + + if (r.debug) { + r.drawDebugPoints(context, eles.drag); + } + + if (!drawAllLayers && !motionBlur) { + needDraw[r.DRAG] = false; + } + } + + if (r.showFps || !drawOnlyNodeLayer && needDraw[r.SELECT_BOX] && !drawAllLayers) { + var context = forcedContext || data.contexts[r.SELECT_BOX]; + setContextTransform(context); + + if (r.selection[4] == 1 && (r.hoverData.selecting || r.touchData.selecting)) { + var zoom = r.cy.zoom(); + var borderWidth = style.core('selection-box-border-width').value / zoom; + context.lineWidth = borderWidth; + context.fillStyle = 'rgba(' + style.core('selection-box-color').value[0] + ',' + style.core('selection-box-color').value[1] + ',' + style.core('selection-box-color').value[2] + ',' + style.core('selection-box-opacity').value + ')'; + context.fillRect(r.selection[0], r.selection[1], r.selection[2] - r.selection[0], r.selection[3] - r.selection[1]); + + if (borderWidth > 0) { + context.strokeStyle = 'rgba(' + style.core('selection-box-border-color').value[0] + ',' + style.core('selection-box-border-color').value[1] + ',' + style.core('selection-box-border-color').value[2] + ',' + style.core('selection-box-opacity').value + ')'; + context.strokeRect(r.selection[0], r.selection[1], r.selection[2] - r.selection[0], r.selection[3] - r.selection[1]); + } + } + + if (data.bgActivePosistion && !r.hoverData.selecting) { + var zoom = r.cy.zoom(); + var pos = data.bgActivePosistion; + context.fillStyle = 'rgba(' + style.core('active-bg-color').value[0] + ',' + style.core('active-bg-color').value[1] + ',' + style.core('active-bg-color').value[2] + ',' + style.core('active-bg-opacity').value + ')'; + context.beginPath(); + context.arc(pos.x, pos.y, style.core('active-bg-size').pfValue / zoom, 0, 2 * Math.PI); + context.fill(); + } + + var timeToRender = r.lastRedrawTime; + + if (r.showFps && timeToRender) { + timeToRender = Math.round(timeToRender); + var fps = Math.round(1000 / timeToRender); + context.setTransform(1, 0, 0, 1, 0, 0); + context.fillStyle = 'rgba(255, 0, 0, 0.75)'; + context.strokeStyle = 'rgba(255, 0, 0, 0.75)'; + context.lineWidth = 1; + context.fillText('1 frame = ' + timeToRender + ' ms = ' + fps + ' fps', 0, 20); + var maxFps = 60; + context.strokeRect(0, 30, 250, 20); + context.fillRect(0, 30, 250 * Math.min(fps / maxFps, 1), 20); + } + + if (!drawAllLayers) { + needDraw[r.SELECT_BOX] = false; + } + } // motionblur: blit rendered blurry frames + + + if (motionBlur && mbPxRatio !== 1) { + var cxtNode = data.contexts[r.NODE]; + var txtNode = r.data.bufferCanvases[r.MOTIONBLUR_BUFFER_NODE]; + var cxtDrag = data.contexts[r.DRAG]; + var txtDrag = r.data.bufferCanvases[r.MOTIONBLUR_BUFFER_DRAG]; + + var drawMotionBlur = function drawMotionBlur(cxt, txt, needClear) { + cxt.setTransform(1, 0, 0, 1, 0, 0); + + if (needClear || !motionBlurFadeEffect) { + cxt.clearRect(0, 0, r.canvasWidth, r.canvasHeight); + } else { + mbclear(cxt, 0, 0, r.canvasWidth, r.canvasHeight); + } + + var pxr = mbPxRatio; + cxt.drawImage(txt, // img + 0, 0, // sx, sy + r.canvasWidth * pxr, r.canvasHeight * pxr, // sw, sh + 0, 0, // x, y + r.canvasWidth, r.canvasHeight // w, h + ); + }; + + if (needDraw[r.NODE] || needMbClear[r.NODE]) { + drawMotionBlur(cxtNode, txtNode, needMbClear[r.NODE]); + needDraw[r.NODE] = false; + } + + if (needDraw[r.DRAG] || needMbClear[r.DRAG]) { + drawMotionBlur(cxtDrag, txtDrag, needMbClear[r.DRAG]); + needDraw[r.DRAG] = false; + } + } + + r.prevViewport = vp; + + if (r.clearingMotionBlur) { + r.clearingMotionBlur = false; + r.motionBlurCleared = true; + r.motionBlur = true; + } + + if (motionBlur) { + r.motionBlurTimeout = setTimeout(function () { + r.motionBlurTimeout = null; + r.clearedForMotionBlur[r.NODE] = false; + r.clearedForMotionBlur[r.DRAG] = false; + r.motionBlur = false; + r.clearingMotionBlur = !textureDraw; + r.mbFrames = 0; + needDraw[r.NODE] = true; + needDraw[r.DRAG] = true; + r.redraw(); + }, motionBlurDelay); + } + + if (!forcedContext) { + cy.emit('render'); + } + }; + + var CRp$3 = {}; // @O Polygon drawing + + CRp$3.drawPolygonPath = function (context, x, y, width, height, points) { + var halfW = width / 2; + var halfH = height / 2; + + if (context.beginPath) { + context.beginPath(); + } + + context.moveTo(x + halfW * points[0], y + halfH * points[1]); + + for (var i = 1; i < points.length / 2; i++) { + context.lineTo(x + halfW * points[i * 2], y + halfH * points[i * 2 + 1]); + } + + context.closePath(); + }; + + CRp$3.drawRoundPolygonPath = function (context, x, y, width, height, points) { + var halfW = width / 2; + var halfH = height / 2; + var cornerRadius = getRoundPolygonRadius(width, height); + + if (context.beginPath) { + context.beginPath(); + } + + for (var _i = 0; _i < points.length / 4; _i++) { + var sourceUv = void 0, + destUv = void 0; + + if (_i === 0) { + sourceUv = points.length - 2; + } else { + sourceUv = _i * 4 - 2; + } + + destUv = _i * 4 + 2; + var px = x + halfW * points[_i * 4]; + var py = y + halfH * points[_i * 4 + 1]; + var cosTheta = -points[sourceUv] * points[destUv] - points[sourceUv + 1] * points[destUv + 1]; + var offset = cornerRadius / Math.tan(Math.acos(cosTheta) / 2); + var cp0x = px - offset * points[sourceUv]; + var cp0y = py - offset * points[sourceUv + 1]; + var cp1x = px + offset * points[destUv]; + var cp1y = py + offset * points[destUv + 1]; + + if (_i === 0) { + context.moveTo(cp0x, cp0y); + } else { + context.lineTo(cp0x, cp0y); + } + + context.arcTo(px, py, cp1x, cp1y, cornerRadius); + } + + context.closePath(); + }; // Round rectangle drawing + + + CRp$3.drawRoundRectanglePath = function (context, x, y, width, height) { + var halfWidth = width / 2; + var halfHeight = height / 2; + var cornerRadius = getRoundRectangleRadius(width, height); + + if (context.beginPath) { + context.beginPath(); + } // Start at top middle + + + context.moveTo(x, y - halfHeight); // Arc from middle top to right side + + context.arcTo(x + halfWidth, y - halfHeight, x + halfWidth, y, cornerRadius); // Arc from right side to bottom + + context.arcTo(x + halfWidth, y + halfHeight, x, y + halfHeight, cornerRadius); // Arc from bottom to left side + + context.arcTo(x - halfWidth, y + halfHeight, x - halfWidth, y, cornerRadius); // Arc from left side to topBorder + + context.arcTo(x - halfWidth, y - halfHeight, x, y - halfHeight, cornerRadius); // Join line + + context.lineTo(x, y - halfHeight); + context.closePath(); + }; + + CRp$3.drawBottomRoundRectanglePath = function (context, x, y, width, height) { + var halfWidth = width / 2; + var halfHeight = height / 2; + var cornerRadius = getRoundRectangleRadius(width, height); + + if (context.beginPath) { + context.beginPath(); + } // Start at top middle + + + context.moveTo(x, y - halfHeight); + context.lineTo(x + halfWidth, y - halfHeight); + context.lineTo(x + halfWidth, y); + context.arcTo(x + halfWidth, y + halfHeight, x, y + halfHeight, cornerRadius); + context.arcTo(x - halfWidth, y + halfHeight, x - halfWidth, y, cornerRadius); + context.lineTo(x - halfWidth, y - halfHeight); + context.lineTo(x, y - halfHeight); + context.closePath(); + }; + + CRp$3.drawCutRectanglePath = function (context, x, y, width, height) { + var halfWidth = width / 2; + var halfHeight = height / 2; + var cornerLength = getCutRectangleCornerLength(); + + if (context.beginPath) { + context.beginPath(); + } + + context.moveTo(x - halfWidth + cornerLength, y - halfHeight); + context.lineTo(x + halfWidth - cornerLength, y - halfHeight); + context.lineTo(x + halfWidth, y - halfHeight + cornerLength); + context.lineTo(x + halfWidth, y + halfHeight - cornerLength); + context.lineTo(x + halfWidth - cornerLength, y + halfHeight); + context.lineTo(x - halfWidth + cornerLength, y + halfHeight); + context.lineTo(x - halfWidth, y + halfHeight - cornerLength); + context.lineTo(x - halfWidth, y - halfHeight + cornerLength); + context.closePath(); + }; + + CRp$3.drawBarrelPath = function (context, x, y, width, height) { + var halfWidth = width / 2; + var halfHeight = height / 2; + var xBegin = x - halfWidth; + var xEnd = x + halfWidth; + var yBegin = y - halfHeight; + var yEnd = y + halfHeight; + var barrelCurveConstants = getBarrelCurveConstants(width, height); + var wOffset = barrelCurveConstants.widthOffset; + var hOffset = barrelCurveConstants.heightOffset; + var ctrlPtXOffset = barrelCurveConstants.ctrlPtOffsetPct * wOffset; + + if (context.beginPath) { + context.beginPath(); + } + + context.moveTo(xBegin, yBegin + hOffset); + context.lineTo(xBegin, yEnd - hOffset); + context.quadraticCurveTo(xBegin + ctrlPtXOffset, yEnd, xBegin + wOffset, yEnd); + context.lineTo(xEnd - wOffset, yEnd); + context.quadraticCurveTo(xEnd - ctrlPtXOffset, yEnd, xEnd, yEnd - hOffset); + context.lineTo(xEnd, yBegin + hOffset); + context.quadraticCurveTo(xEnd - ctrlPtXOffset, yBegin, xEnd - wOffset, yBegin); + context.lineTo(xBegin + wOffset, yBegin); + context.quadraticCurveTo(xBegin + ctrlPtXOffset, yBegin, xBegin, yBegin + hOffset); + context.closePath(); + }; + + var sin0 = Math.sin(0); + var cos0 = Math.cos(0); + var sin = {}; + var cos = {}; + var ellipseStepSize = Math.PI / 40; + + for (var i = 0 * Math.PI; i < 2 * Math.PI; i += ellipseStepSize) { + sin[i] = Math.sin(i); + cos[i] = Math.cos(i); + } + + CRp$3.drawEllipsePath = function (context, centerX, centerY, width, height) { + if (context.beginPath) { + context.beginPath(); + } + + if (context.ellipse) { + context.ellipse(centerX, centerY, width / 2, height / 2, 0, 0, 2 * Math.PI); + } else { + var xPos, yPos; + var rw = width / 2; + var rh = height / 2; + + for (var i = 0 * Math.PI; i < 2 * Math.PI; i += ellipseStepSize) { + xPos = centerX - rw * sin[i] * sin0 + rw * cos[i] * cos0; + yPos = centerY + rh * cos[i] * sin0 + rh * sin[i] * cos0; + + if (i === 0) { + context.moveTo(xPos, yPos); + } else { + context.lineTo(xPos, yPos); + } + } + } + + context.closePath(); + }; + + /* global atob, ArrayBuffer, Uint8Array, Blob */ + var CRp$2 = {}; + + CRp$2.createBuffer = function (w, h) { + var buffer = document.createElement('canvas'); // eslint-disable-line no-undef + + buffer.width = w; + buffer.height = h; + return [buffer, buffer.getContext('2d')]; + }; + + CRp$2.bufferCanvasImage = function (options) { + var cy = this.cy; + var eles = cy.mutableElements(); + var bb = eles.boundingBox(); + var ctrRect = this.findContainerClientCoords(); + var width = options.full ? Math.ceil(bb.w) : ctrRect[2]; + var height = options.full ? Math.ceil(bb.h) : ctrRect[3]; + var specdMaxDims = number$1(options.maxWidth) || number$1(options.maxHeight); + var pxRatio = this.getPixelRatio(); + var scale = 1; + + if (options.scale !== undefined) { + width *= options.scale; + height *= options.scale; + scale = options.scale; + } else if (specdMaxDims) { + var maxScaleW = Infinity; + var maxScaleH = Infinity; + + if (number$1(options.maxWidth)) { + maxScaleW = scale * options.maxWidth / width; + } + + if (number$1(options.maxHeight)) { + maxScaleH = scale * options.maxHeight / height; + } + + scale = Math.min(maxScaleW, maxScaleH); + width *= scale; + height *= scale; + } + + if (!specdMaxDims) { + width *= pxRatio; + height *= pxRatio; + scale *= pxRatio; + } + + var buffCanvas = document.createElement('canvas'); // eslint-disable-line no-undef + + buffCanvas.width = width; + buffCanvas.height = height; + buffCanvas.style.width = width + 'px'; + buffCanvas.style.height = height + 'px'; + var buffCxt = buffCanvas.getContext('2d'); // Rasterize the layers, but only if container has nonzero size + + if (width > 0 && height > 0) { + buffCxt.clearRect(0, 0, width, height); + buffCxt.globalCompositeOperation = 'source-over'; + var zsortedEles = this.getCachedZSortedEles(); + + if (options.full) { + // draw the full bounds of the graph + buffCxt.translate(-bb.x1 * scale, -bb.y1 * scale); + buffCxt.scale(scale, scale); + this.drawElements(buffCxt, zsortedEles); + buffCxt.scale(1 / scale, 1 / scale); + buffCxt.translate(bb.x1 * scale, bb.y1 * scale); + } else { + // draw the current view + var pan = cy.pan(); + var translation = { + x: pan.x * scale, + y: pan.y * scale + }; + scale *= cy.zoom(); + buffCxt.translate(translation.x, translation.y); + buffCxt.scale(scale, scale); + this.drawElements(buffCxt, zsortedEles); + buffCxt.scale(1 / scale, 1 / scale); + buffCxt.translate(-translation.x, -translation.y); + } // need to fill bg at end like this in order to fill cleared transparent pixels in jpgs + + + if (options.bg) { + buffCxt.globalCompositeOperation = 'destination-over'; + buffCxt.fillStyle = options.bg; + buffCxt.rect(0, 0, width, height); + buffCxt.fill(); + } + } + + return buffCanvas; + }; + + function b64ToBlob(b64, mimeType) { + var bytes = atob(b64); + var buff = new ArrayBuffer(bytes.length); + var buffUint8 = new Uint8Array(buff); + + for (var i = 0; i < bytes.length; i++) { + buffUint8[i] = bytes.charCodeAt(i); + } + + return new Blob([buff], { + type: mimeType + }); + } + + function b64UriToB64(b64uri) { + var i = b64uri.indexOf(','); + return b64uri.substr(i + 1); + } + + function output(options, canvas, mimeType) { + var getB64Uri = function getB64Uri() { + return canvas.toDataURL(mimeType, options.quality); + }; + + switch (options.output) { + case 'blob-promise': + return new Promise$1(function (resolve, reject) { + try { + canvas.toBlob(function (blob) { + if (blob != null) { + resolve(blob); + } else { + reject(new Error('`canvas.toBlob()` sent a null value in its callback')); + } + }, mimeType, options.quality); + } catch (err) { + reject(err); + } + }); + + case 'blob': + return b64ToBlob(b64UriToB64(getB64Uri()), mimeType); + + case 'base64': + return b64UriToB64(getB64Uri()); + + case 'base64uri': + default: + return getB64Uri(); + } + } + + CRp$2.png = function (options) { + return output(options, this.bufferCanvasImage(options), 'image/png'); + }; + + CRp$2.jpg = function (options) { + return output(options, this.bufferCanvasImage(options), 'image/jpeg'); + }; + + var CRp$1 = {}; + + CRp$1.nodeShapeImpl = function (name, context, centerX, centerY, width, height, points) { + switch (name) { + case 'ellipse': + return this.drawEllipsePath(context, centerX, centerY, width, height); + + case 'polygon': + return this.drawPolygonPath(context, centerX, centerY, width, height, points); + + case 'round-polygon': + return this.drawRoundPolygonPath(context, centerX, centerY, width, height, points); + + case 'roundrectangle': + case 'round-rectangle': + return this.drawRoundRectanglePath(context, centerX, centerY, width, height); + + case 'cutrectangle': + case 'cut-rectangle': + return this.drawCutRectanglePath(context, centerX, centerY, width, height); + + case 'bottomroundrectangle': + case 'bottom-round-rectangle': + return this.drawBottomRoundRectanglePath(context, centerX, centerY, width, height); + + case 'barrel': + return this.drawBarrelPath(context, centerX, centerY, width, height); + } + }; + + var CR = CanvasRenderer; + var CRp = CanvasRenderer.prototype; + CRp.CANVAS_LAYERS = 3; // + + CRp.SELECT_BOX = 0; + CRp.DRAG = 1; + CRp.NODE = 2; + CRp.BUFFER_COUNT = 3; // + + CRp.TEXTURE_BUFFER = 0; + CRp.MOTIONBLUR_BUFFER_NODE = 1; + CRp.MOTIONBLUR_BUFFER_DRAG = 2; + + function CanvasRenderer(options) { + var r = this; + r.data = { + canvases: new Array(CRp.CANVAS_LAYERS), + contexts: new Array(CRp.CANVAS_LAYERS), + canvasNeedsRedraw: new Array(CRp.CANVAS_LAYERS), + bufferCanvases: new Array(CRp.BUFFER_COUNT), + bufferContexts: new Array(CRp.CANVAS_LAYERS) + }; + var tapHlOffAttr = '-webkit-tap-highlight-color'; + var tapHlOffStyle = 'rgba(0,0,0,0)'; + r.data.canvasContainer = document.createElement('div'); // eslint-disable-line no-undef + + var containerStyle = r.data.canvasContainer.style; + r.data.canvasContainer.style[tapHlOffAttr] = tapHlOffStyle; + containerStyle.position = 'relative'; + containerStyle.zIndex = '0'; + containerStyle.overflow = 'hidden'; + var container = options.cy.container(); + container.appendChild(r.data.canvasContainer); + container.style[tapHlOffAttr] = tapHlOffStyle; + var styleMap = { + '-webkit-user-select': 'none', + '-moz-user-select': '-moz-none', + 'user-select': 'none', + '-webkit-tap-highlight-color': 'rgba(0,0,0,0)', + 'outline-style': 'none' + }; + + if (ms()) { + styleMap['-ms-touch-action'] = 'none'; + styleMap['touch-action'] = 'none'; + } + + for (var i = 0; i < CRp.CANVAS_LAYERS; i++) { + var canvas = r.data.canvases[i] = document.createElement('canvas'); // eslint-disable-line no-undef + + r.data.contexts[i] = canvas.getContext('2d'); + Object.keys(styleMap).forEach(function (k) { + canvas.style[k] = styleMap[k]; + }); + canvas.style.position = 'absolute'; + canvas.setAttribute('data-id', 'layer' + i); + canvas.style.zIndex = String(CRp.CANVAS_LAYERS - i); + r.data.canvasContainer.appendChild(canvas); + r.data.canvasNeedsRedraw[i] = false; + } + + r.data.topCanvas = r.data.canvases[0]; + r.data.canvases[CRp.NODE].setAttribute('data-id', 'layer' + CRp.NODE + '-node'); + r.data.canvases[CRp.SELECT_BOX].setAttribute('data-id', 'layer' + CRp.SELECT_BOX + '-selectbox'); + r.data.canvases[CRp.DRAG].setAttribute('data-id', 'layer' + CRp.DRAG + '-drag'); + + for (var i = 0; i < CRp.BUFFER_COUNT; i++) { + r.data.bufferCanvases[i] = document.createElement('canvas'); // eslint-disable-line no-undef + + r.data.bufferContexts[i] = r.data.bufferCanvases[i].getContext('2d'); + r.data.bufferCanvases[i].style.position = 'absolute'; + r.data.bufferCanvases[i].setAttribute('data-id', 'buffer' + i); + r.data.bufferCanvases[i].style.zIndex = String(-i - 1); + r.data.bufferCanvases[i].style.visibility = 'hidden'; //r.data.canvasContainer.appendChild(r.data.bufferCanvases[i]); + } + + r.pathsEnabled = true; + var emptyBb = makeBoundingBox(); + + var getBoxCenter = function getBoxCenter(bb) { + return { + x: (bb.x1 + bb.x2) / 2, + y: (bb.y1 + bb.y2) / 2 + }; + }; + + var getCenterOffset = function getCenterOffset(bb) { + return { + x: -bb.w / 2, + y: -bb.h / 2 + }; + }; + + var backgroundTimestampHasChanged = function backgroundTimestampHasChanged(ele) { + var _p = ele[0]._private; + var same = _p.oldBackgroundTimestamp === _p.backgroundTimestamp; + return !same; + }; + + var getStyleKey = function getStyleKey(ele) { + return ele[0]._private.nodeKey; + }; + + var getLabelKey = function getLabelKey(ele) { + return ele[0]._private.labelStyleKey; + }; + + var getSourceLabelKey = function getSourceLabelKey(ele) { + return ele[0]._private.sourceLabelStyleKey; + }; + + var getTargetLabelKey = function getTargetLabelKey(ele) { + return ele[0]._private.targetLabelStyleKey; + }; + + var drawElement = function drawElement(context, ele, bb, scaledLabelShown, useEleOpacity) { + return r.drawElement(context, ele, bb, false, false, useEleOpacity); + }; + + var drawLabel = function drawLabel(context, ele, bb, scaledLabelShown, useEleOpacity) { + return r.drawElementText(context, ele, bb, scaledLabelShown, 'main', useEleOpacity); + }; + + var drawSourceLabel = function drawSourceLabel(context, ele, bb, scaledLabelShown, useEleOpacity) { + return r.drawElementText(context, ele, bb, scaledLabelShown, 'source', useEleOpacity); + }; + + var drawTargetLabel = function drawTargetLabel(context, ele, bb, scaledLabelShown, useEleOpacity) { + return r.drawElementText(context, ele, bb, scaledLabelShown, 'target', useEleOpacity); + }; + + var getElementBox = function getElementBox(ele) { + ele.boundingBox(); + return ele[0]._private.bodyBounds; + }; + + var getLabelBox = function getLabelBox(ele) { + ele.boundingBox(); + return ele[0]._private.labelBounds.main || emptyBb; + }; + + var getSourceLabelBox = function getSourceLabelBox(ele) { + ele.boundingBox(); + return ele[0]._private.labelBounds.source || emptyBb; + }; + + var getTargetLabelBox = function getTargetLabelBox(ele) { + ele.boundingBox(); + return ele[0]._private.labelBounds.target || emptyBb; + }; + + var isLabelVisibleAtScale = function isLabelVisibleAtScale(ele, scaledLabelShown) { + return scaledLabelShown; + }; + + var getElementRotationPoint = function getElementRotationPoint(ele) { + return getBoxCenter(getElementBox(ele)); + }; + + var addTextMargin = function addTextMargin(prefix, pt, ele) { + var pre = prefix ? prefix + '-' : ''; + return { + x: pt.x + ele.pstyle(pre + 'text-margin-x').pfValue, + y: pt.y + ele.pstyle(pre + 'text-margin-y').pfValue + }; + }; + + var getRsPt = function getRsPt(ele, x, y) { + var rs = ele[0]._private.rscratch; + return { + x: rs[x], + y: rs[y] + }; + }; + + var getLabelRotationPoint = function getLabelRotationPoint(ele) { + return addTextMargin('', getRsPt(ele, 'labelX', 'labelY'), ele); + }; + + var getSourceLabelRotationPoint = function getSourceLabelRotationPoint(ele) { + return addTextMargin('source', getRsPt(ele, 'sourceLabelX', 'sourceLabelY'), ele); + }; + + var getTargetLabelRotationPoint = function getTargetLabelRotationPoint(ele) { + return addTextMargin('target', getRsPt(ele, 'targetLabelX', 'targetLabelY'), ele); + }; + + var getElementRotationOffset = function getElementRotationOffset(ele) { + return getCenterOffset(getElementBox(ele)); + }; + + var getSourceLabelRotationOffset = function getSourceLabelRotationOffset(ele) { + return getCenterOffset(getSourceLabelBox(ele)); + }; + + var getTargetLabelRotationOffset = function getTargetLabelRotationOffset(ele) { + return getCenterOffset(getTargetLabelBox(ele)); + }; + + var getLabelRotationOffset = function getLabelRotationOffset(ele) { + var bb = getLabelBox(ele); + var p = getCenterOffset(getLabelBox(ele)); + + if (ele.isNode()) { + switch (ele.pstyle('text-halign').value) { + case 'left': + p.x = -bb.w; + break; + + case 'right': + p.x = 0; + break; + } + + switch (ele.pstyle('text-valign').value) { + case 'top': + p.y = -bb.h; + break; + + case 'bottom': + p.y = 0; + break; + } + } + + return p; + }; + + var eleTxrCache = r.data.eleTxrCache = new ElementTextureCache(r, { + getKey: getStyleKey, + doesEleInvalidateKey: backgroundTimestampHasChanged, + drawElement: drawElement, + getBoundingBox: getElementBox, + getRotationPoint: getElementRotationPoint, + getRotationOffset: getElementRotationOffset, + allowEdgeTxrCaching: false, + allowParentTxrCaching: false + }); + var lblTxrCache = r.data.lblTxrCache = new ElementTextureCache(r, { + getKey: getLabelKey, + drawElement: drawLabel, + getBoundingBox: getLabelBox, + getRotationPoint: getLabelRotationPoint, + getRotationOffset: getLabelRotationOffset, + isVisible: isLabelVisibleAtScale + }); + var slbTxrCache = r.data.slbTxrCache = new ElementTextureCache(r, { + getKey: getSourceLabelKey, + drawElement: drawSourceLabel, + getBoundingBox: getSourceLabelBox, + getRotationPoint: getSourceLabelRotationPoint, + getRotationOffset: getSourceLabelRotationOffset, + isVisible: isLabelVisibleAtScale + }); + var tlbTxrCache = r.data.tlbTxrCache = new ElementTextureCache(r, { + getKey: getTargetLabelKey, + drawElement: drawTargetLabel, + getBoundingBox: getTargetLabelBox, + getRotationPoint: getTargetLabelRotationPoint, + getRotationOffset: getTargetLabelRotationOffset, + isVisible: isLabelVisibleAtScale + }); + var lyrTxrCache = r.data.lyrTxrCache = new LayeredTextureCache(r); + r.onUpdateEleCalcs(function invalidateTextureCaches(willDraw, eles) { + // each cache should check for sub-key diff to see that the update affects that cache particularly + eleTxrCache.invalidateElements(eles); + lblTxrCache.invalidateElements(eles); + slbTxrCache.invalidateElements(eles); + tlbTxrCache.invalidateElements(eles); // any change invalidates the layers + + lyrTxrCache.invalidateElements(eles); // update the old bg timestamp so diffs can be done in the ele txr caches + + for (var _i = 0; _i < eles.length; _i++) { + var _p = eles[_i]._private; + _p.oldBackgroundTimestamp = _p.backgroundTimestamp; + } + }); + + var refineInLayers = function refineInLayers(reqs) { + for (var i = 0; i < reqs.length; i++) { + lyrTxrCache.enqueueElementRefinement(reqs[i].ele); + } + }; + + eleTxrCache.onDequeue(refineInLayers); + lblTxrCache.onDequeue(refineInLayers); + slbTxrCache.onDequeue(refineInLayers); + tlbTxrCache.onDequeue(refineInLayers); + } + + CRp.redrawHint = function (group, bool) { + var r = this; + + switch (group) { + case 'eles': + r.data.canvasNeedsRedraw[CRp.NODE] = bool; + break; + + case 'drag': + r.data.canvasNeedsRedraw[CRp.DRAG] = bool; + break; + + case 'select': + r.data.canvasNeedsRedraw[CRp.SELECT_BOX] = bool; + break; + } + }; // whether to use Path2D caching for drawing + + + var pathsImpld = typeof Path2D !== 'undefined'; + + CRp.path2dEnabled = function (on) { + if (on === undefined) { + return this.pathsEnabled; + } + + this.pathsEnabled = on ? true : false; + }; + + CRp.usePaths = function () { + return pathsImpld && this.pathsEnabled; + }; + + CRp.setImgSmoothing = function (context, bool) { + if (context.imageSmoothingEnabled != null) { + context.imageSmoothingEnabled = bool; + } else { + context.webkitImageSmoothingEnabled = bool; + context.mozImageSmoothingEnabled = bool; + context.msImageSmoothingEnabled = bool; + } + }; + + CRp.getImgSmoothing = function (context) { + if (context.imageSmoothingEnabled != null) { + return context.imageSmoothingEnabled; + } else { + return context.webkitImageSmoothingEnabled || context.mozImageSmoothingEnabled || context.msImageSmoothingEnabled; + } + }; + + CRp.makeOffscreenCanvas = function (width, height) { + var canvas; + + if ((typeof OffscreenCanvas === "undefined" ? "undefined" : _typeof(OffscreenCanvas)) !== ("undefined" )) { + canvas = new OffscreenCanvas(width, height); + } else { + canvas = document.createElement('canvas'); // eslint-disable-line no-undef + + canvas.width = width; + canvas.height = height; + } + + return canvas; + }; + + [CRp$a, CRp$9, CRp$8, CRp$7, CRp$6, CRp$5, CRp$4, CRp$3, CRp$2, CRp$1].forEach(function (props) { + extend(CRp, props); + }); + + var renderer = [{ + name: 'null', + impl: NullRenderer + }, { + name: 'base', + impl: BR + }, { + name: 'canvas', + impl: CR + }]; + + var incExts = [{ + type: 'layout', + extensions: layout + }, { + type: 'renderer', + extensions: renderer + }]; + + var extensions = {}; // registered modules for extensions, indexed by name + + var modules = {}; + + function setExtension(type, name, registrant) { + var ext = registrant; + + var overrideErr = function overrideErr(field) { + warn('Can not register `' + name + '` for `' + type + '` since `' + field + '` already exists in the prototype and can not be overridden'); + }; + + if (type === 'core') { + if (Core.prototype[name]) { + return overrideErr(name); + } else { + Core.prototype[name] = registrant; + } + } else if (type === 'collection') { + if (Collection.prototype[name]) { + return overrideErr(name); + } else { + Collection.prototype[name] = registrant; + } + } else if (type === 'layout') { + // fill in missing layout functions in the prototype + var Layout = function Layout(options) { + this.options = options; + registrant.call(this, options); // make sure layout has _private for use w/ std apis like .on() + + if (!plainObject(this._private)) { + this._private = {}; + } + + this._private.cy = options.cy; + this._private.listeners = []; + this.createEmitter(); + }; + + var layoutProto = Layout.prototype = Object.create(registrant.prototype); + var optLayoutFns = []; + + for (var i = 0; i < optLayoutFns.length; i++) { + var fnName = optLayoutFns[i]; + + layoutProto[fnName] = layoutProto[fnName] || function () { + return this; + }; + } // either .start() or .run() is defined, so autogen the other + + + if (layoutProto.start && !layoutProto.run) { + layoutProto.run = function () { + this.start(); + return this; + }; + } else if (!layoutProto.start && layoutProto.run) { + layoutProto.start = function () { + this.run(); + return this; + }; + } + + var regStop = registrant.prototype.stop; + + layoutProto.stop = function () { + var opts = this.options; + + if (opts && opts.animate) { + var anis = this.animations; + + if (anis) { + for (var _i = 0; _i < anis.length; _i++) { + anis[_i].stop(); + } + } + } + + if (regStop) { + regStop.call(this); + } else { + this.emit('layoutstop'); + } + + return this; + }; + + if (!layoutProto.destroy) { + layoutProto.destroy = function () { + return this; + }; + } + + layoutProto.cy = function () { + return this._private.cy; + }; + + var getCy = function getCy(layout) { + return layout._private.cy; + }; + + var emitterOpts = { + addEventFields: function addEventFields(layout, evt) { + evt.layout = layout; + evt.cy = getCy(layout); + evt.target = layout; + }, + bubble: function bubble() { + return true; + }, + parent: function parent(layout) { + return getCy(layout); + } + }; + extend(layoutProto, { + createEmitter: function createEmitter() { + this._private.emitter = new Emitter(emitterOpts, this); + return this; + }, + emitter: function emitter() { + return this._private.emitter; + }, + on: function on(evt, cb) { + this.emitter().on(evt, cb); + return this; + }, + one: function one(evt, cb) { + this.emitter().one(evt, cb); + return this; + }, + once: function once(evt, cb) { + this.emitter().one(evt, cb); + return this; + }, + removeListener: function removeListener(evt, cb) { + this.emitter().removeListener(evt, cb); + return this; + }, + removeAllListeners: function removeAllListeners() { + this.emitter().removeAllListeners(); + return this; + }, + emit: function emit(evt, params) { + this.emitter().emit(evt, params); + return this; + } + }); + define.eventAliasesOn(layoutProto); + ext = Layout; // replace with our wrapped layout + } else if (type === 'renderer' && name !== 'null' && name !== 'base') { + // user registered renderers inherit from base + var BaseRenderer = getExtension('renderer', 'base'); + var bProto = BaseRenderer.prototype; + var RegistrantRenderer = registrant; + var rProto = registrant.prototype; + + var Renderer = function Renderer() { + BaseRenderer.apply(this, arguments); + RegistrantRenderer.apply(this, arguments); + }; + + var proto = Renderer.prototype; + + for (var pName in bProto) { + var pVal = bProto[pName]; + var existsInR = rProto[pName] != null; + + if (existsInR) { + return overrideErr(pName); + } + + proto[pName] = pVal; // take impl from base + } + + for (var _pName in rProto) { + proto[_pName] = rProto[_pName]; // take impl from registrant + } + + bProto.clientFunctions.forEach(function (name) { + proto[name] = proto[name] || function () { + error('Renderer does not implement `renderer.' + name + '()` on its prototype'); + }; + }); + ext = Renderer; + } else if (type === '__proto__' || type === 'constructor' || type === 'prototype') { + // to avoid potential prototype pollution + return error(type + ' is an illegal type to be registered, possibly lead to prototype pollutions'); + } + + return setMap({ + map: extensions, + keys: [type, name], + value: ext + }); + } + + function getExtension(type, name) { + return getMap({ + map: extensions, + keys: [type, name] + }); + } + + function setModule(type, name, moduleType, moduleName, registrant) { + return setMap({ + map: modules, + keys: [type, name, moduleType, moduleName], + value: registrant + }); + } + + function getModule(type, name, moduleType, moduleName) { + return getMap({ + map: modules, + keys: [type, name, moduleType, moduleName] + }); + } + + var extension = function extension() { + // e.g. extension('renderer', 'svg') + if (arguments.length === 2) { + return getExtension.apply(null, arguments); + } // e.g. extension('renderer', 'svg', { ... }) + else if (arguments.length === 3) { + return setExtension.apply(null, arguments); + } // e.g. extension('renderer', 'svg', 'nodeShape', 'ellipse') + else if (arguments.length === 4) { + return getModule.apply(null, arguments); + } // e.g. extension('renderer', 'svg', 'nodeShape', 'ellipse', { ... }) + else if (arguments.length === 5) { + return setModule.apply(null, arguments); + } else { + error('Invalid extension access syntax'); + } + }; // allows a core instance to access extensions internally + + + Core.prototype.extension = extension; // included extensions + + incExts.forEach(function (group) { + group.extensions.forEach(function (ext) { + setExtension(group.type, ext.name, ext.impl); + }); + }); + + // (useful for init) + + var Stylesheet = function Stylesheet() { + if (!(this instanceof Stylesheet)) { + return new Stylesheet(); + } + + this.length = 0; + }; + + var sheetfn = Stylesheet.prototype; + + sheetfn.instanceString = function () { + return 'stylesheet'; + }; // just store the selector to be parsed later + + + sheetfn.selector = function (selector) { + var i = this.length++; + this[i] = { + selector: selector, + properties: [] + }; + return this; // chaining + }; // just store the property to be parsed later + + + sheetfn.css = function (name, value) { + var i = this.length - 1; + + if (string(name)) { + this[i].properties.push({ + name: name, + value: value + }); + } else if (plainObject(name)) { + var map = name; + var propNames = Object.keys(map); + + for (var j = 0; j < propNames.length; j++) { + var key = propNames[j]; + var mapVal = map[key]; + + if (mapVal == null) { + continue; + } + + var prop = Style.properties[key] || Style.properties[dash2camel(key)]; + + if (prop == null) { + continue; + } + + var _name = prop.name; + var _value = mapVal; + this[i].properties.push({ + name: _name, + value: _value + }); + } + } + + return this; // chaining + }; + + sheetfn.style = sheetfn.css; // generate a real style object from the dummy stylesheet + + sheetfn.generateStyle = function (cy) { + var style = new Style(cy); + return this.appendToStyle(style); + }; // append a dummy stylesheet object on a real style object + + + sheetfn.appendToStyle = function (style) { + for (var i = 0; i < this.length; i++) { + var context = this[i]; + var selector = context.selector; + var props = context.properties; + style.selector(selector); // apply selector + + for (var j = 0; j < props.length; j++) { + var prop = props[j]; + style.css(prop.name, prop.value); // apply property + } + } + + return style; + }; + + var version = "3.26.0"; + + var cytoscape = function cytoscape(options) { + // if no options specified, use default + if (options === undefined) { + options = {}; + } // create instance + + + if (plainObject(options)) { + return new Core(options); + } // allow for registration of extensions + else if (string(options)) { + return extension.apply(extension, arguments); + } + }; // e.g. cytoscape.use( require('cytoscape-foo'), bar ) + + + cytoscape.use = function (ext) { + var args = Array.prototype.slice.call(arguments, 1); // args to pass to ext + + args.unshift(cytoscape); // cytoscape is first arg to ext + + ext.apply(null, args); + return this; + }; + + cytoscape.warnings = function (bool) { + return warnings(bool); + }; // replaced by build system + + + cytoscape.version = version; // expose public apis (mostly for extensions) + + cytoscape.stylesheet = cytoscape.Stylesheet = Stylesheet; + + return cytoscape; + +})); + + +/***/ }), + +/***/ 82241: +/***/ (function(module) { + +(function webpackUniversalModuleDefinition(root, factory) { + if(true) + module.exports = factory(); + else {} +})(this, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __nested_webpack_require_543__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __nested_webpack_require_543__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __nested_webpack_require_543__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __nested_webpack_require_543__.c = installedModules; +/******/ +/******/ // identity function for calling harmony imports with the correct context +/******/ __nested_webpack_require_543__.i = function(value) { return value; }; +/******/ +/******/ // define getter function for harmony exports +/******/ __nested_webpack_require_543__.d = function(exports, name, getter) { +/******/ if(!__nested_webpack_require_543__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { +/******/ configurable: false, +/******/ enumerable: true, +/******/ get: getter +/******/ }); +/******/ } +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __nested_webpack_require_543__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __nested_webpack_require_543__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __nested_webpack_require_543__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __nested_webpack_require_543__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __nested_webpack_require_543__(__nested_webpack_require_543__.s = 26); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function LayoutConstants() {} + +/** + * Layout Quality: 0:draft, 1:default, 2:proof + */ +LayoutConstants.QUALITY = 1; + +/** + * Default parameters + */ +LayoutConstants.DEFAULT_CREATE_BENDS_AS_NEEDED = false; +LayoutConstants.DEFAULT_INCREMENTAL = false; +LayoutConstants.DEFAULT_ANIMATION_ON_LAYOUT = true; +LayoutConstants.DEFAULT_ANIMATION_DURING_LAYOUT = false; +LayoutConstants.DEFAULT_ANIMATION_PERIOD = 50; +LayoutConstants.DEFAULT_UNIFORM_LEAF_NODE_SIZES = false; + +// ----------------------------------------------------------------------------- +// Section: General other constants +// ----------------------------------------------------------------------------- +/* + * Margins of a graph to be applied on bouding rectangle of its contents. We + * assume margins on all four sides to be uniform. + */ +LayoutConstants.DEFAULT_GRAPH_MARGIN = 15; + +/* + * Whether to consider labels in node dimensions or not + */ +LayoutConstants.NODE_DIMENSIONS_INCLUDE_LABELS = false; + +/* + * Default dimension of a non-compound node. + */ +LayoutConstants.SIMPLE_NODE_SIZE = 40; + +/* + * Default dimension of a non-compound node. + */ +LayoutConstants.SIMPLE_NODE_HALF_SIZE = LayoutConstants.SIMPLE_NODE_SIZE / 2; + +/* + * Empty compound node size. When a compound node is empty, its both + * dimensions should be of this value. + */ +LayoutConstants.EMPTY_COMPOUND_NODE_SIZE = 40; + +/* + * Minimum length that an edge should take during layout + */ +LayoutConstants.MIN_EDGE_LENGTH = 1; + +/* + * World boundaries that layout operates on + */ +LayoutConstants.WORLD_BOUNDARY = 1000000; + +/* + * World boundaries that random positioning can be performed with + */ +LayoutConstants.INITIAL_WORLD_BOUNDARY = LayoutConstants.WORLD_BOUNDARY / 1000; + +/* + * Coordinates of the world center + */ +LayoutConstants.WORLD_CENTER_X = 1200; +LayoutConstants.WORLD_CENTER_Y = 900; + +module.exports = LayoutConstants; + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __nested_webpack_require_4947__) { + +"use strict"; + + +var LGraphObject = __nested_webpack_require_4947__(2); +var IGeometry = __nested_webpack_require_4947__(8); +var IMath = __nested_webpack_require_4947__(9); + +function LEdge(source, target, vEdge) { + LGraphObject.call(this, vEdge); + + this.isOverlapingSourceAndTarget = false; + this.vGraphObject = vEdge; + this.bendpoints = []; + this.source = source; + this.target = target; +} + +LEdge.prototype = Object.create(LGraphObject.prototype); + +for (var prop in LGraphObject) { + LEdge[prop] = LGraphObject[prop]; +} + +LEdge.prototype.getSource = function () { + return this.source; +}; + +LEdge.prototype.getTarget = function () { + return this.target; +}; + +LEdge.prototype.isInterGraph = function () { + return this.isInterGraph; +}; + +LEdge.prototype.getLength = function () { + return this.length; +}; + +LEdge.prototype.isOverlapingSourceAndTarget = function () { + return this.isOverlapingSourceAndTarget; +}; + +LEdge.prototype.getBendpoints = function () { + return this.bendpoints; +}; + +LEdge.prototype.getLca = function () { + return this.lca; +}; + +LEdge.prototype.getSourceInLca = function () { + return this.sourceInLca; +}; + +LEdge.prototype.getTargetInLca = function () { + return this.targetInLca; +}; + +LEdge.prototype.getOtherEnd = function (node) { + if (this.source === node) { + return this.target; + } else if (this.target === node) { + return this.source; + } else { + throw "Node is not incident with this edge"; + } +}; + +LEdge.prototype.getOtherEndInGraph = function (node, graph) { + var otherEnd = this.getOtherEnd(node); + var root = graph.getGraphManager().getRoot(); + + while (true) { + if (otherEnd.getOwner() == graph) { + return otherEnd; + } + + if (otherEnd.getOwner() == root) { + break; + } + + otherEnd = otherEnd.getOwner().getParent(); + } + + return null; +}; + +LEdge.prototype.updateLength = function () { + var clipPointCoordinates = new Array(4); + + this.isOverlapingSourceAndTarget = IGeometry.getIntersection(this.target.getRect(), this.source.getRect(), clipPointCoordinates); + + if (!this.isOverlapingSourceAndTarget) { + this.lengthX = clipPointCoordinates[0] - clipPointCoordinates[2]; + this.lengthY = clipPointCoordinates[1] - clipPointCoordinates[3]; + + if (Math.abs(this.lengthX) < 1.0) { + this.lengthX = IMath.sign(this.lengthX); + } + + if (Math.abs(this.lengthY) < 1.0) { + this.lengthY = IMath.sign(this.lengthY); + } + + this.length = Math.sqrt(this.lengthX * this.lengthX + this.lengthY * this.lengthY); + } +}; + +LEdge.prototype.updateLengthSimple = function () { + this.lengthX = this.target.getCenterX() - this.source.getCenterX(); + this.lengthY = this.target.getCenterY() - this.source.getCenterY(); + + if (Math.abs(this.lengthX) < 1.0) { + this.lengthX = IMath.sign(this.lengthX); + } + + if (Math.abs(this.lengthY) < 1.0) { + this.lengthY = IMath.sign(this.lengthY); + } + + this.length = Math.sqrt(this.lengthX * this.lengthX + this.lengthY * this.lengthY); +}; + +module.exports = LEdge; + +/***/ }), +/* 2 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function LGraphObject(vGraphObject) { + this.vGraphObject = vGraphObject; +} + +module.exports = LGraphObject; + +/***/ }), +/* 3 */ +/***/ (function(module, exports, __nested_webpack_require_8167__) { + +"use strict"; + + +var LGraphObject = __nested_webpack_require_8167__(2); +var Integer = __nested_webpack_require_8167__(10); +var RectangleD = __nested_webpack_require_8167__(13); +var LayoutConstants = __nested_webpack_require_8167__(0); +var RandomSeed = __nested_webpack_require_8167__(16); +var PointD = __nested_webpack_require_8167__(4); + +function LNode(gm, loc, size, vNode) { + //Alternative constructor 1 : LNode(LGraphManager gm, Point loc, Dimension size, Object vNode) + if (size == null && vNode == null) { + vNode = loc; + } + + LGraphObject.call(this, vNode); + + //Alternative constructor 2 : LNode(Layout layout, Object vNode) + if (gm.graphManager != null) gm = gm.graphManager; + + this.estimatedSize = Integer.MIN_VALUE; + this.inclusionTreeDepth = Integer.MAX_VALUE; + this.vGraphObject = vNode; + this.edges = []; + this.graphManager = gm; + + if (size != null && loc != null) this.rect = new RectangleD(loc.x, loc.y, size.width, size.height);else this.rect = new RectangleD(); +} + +LNode.prototype = Object.create(LGraphObject.prototype); +for (var prop in LGraphObject) { + LNode[prop] = LGraphObject[prop]; +} + +LNode.prototype.getEdges = function () { + return this.edges; +}; + +LNode.prototype.getChild = function () { + return this.child; +}; + +LNode.prototype.getOwner = function () { + // if (this.owner != null) { + // if (!(this.owner == null || this.owner.getNodes().indexOf(this) > -1)) { + // throw "assert failed"; + // } + // } + + return this.owner; +}; + +LNode.prototype.getWidth = function () { + return this.rect.width; +}; + +LNode.prototype.setWidth = function (width) { + this.rect.width = width; +}; + +LNode.prototype.getHeight = function () { + return this.rect.height; +}; + +LNode.prototype.setHeight = function (height) { + this.rect.height = height; +}; + +LNode.prototype.getCenterX = function () { + return this.rect.x + this.rect.width / 2; +}; + +LNode.prototype.getCenterY = function () { + return this.rect.y + this.rect.height / 2; +}; + +LNode.prototype.getCenter = function () { + return new PointD(this.rect.x + this.rect.width / 2, this.rect.y + this.rect.height / 2); +}; + +LNode.prototype.getLocation = function () { + return new PointD(this.rect.x, this.rect.y); +}; + +LNode.prototype.getRect = function () { + return this.rect; +}; + +LNode.prototype.getDiagonal = function () { + return Math.sqrt(this.rect.width * this.rect.width + this.rect.height * this.rect.height); +}; + +/** + * This method returns half the diagonal length of this node. + */ +LNode.prototype.getHalfTheDiagonal = function () { + return Math.sqrt(this.rect.height * this.rect.height + this.rect.width * this.rect.width) / 2; +}; + +LNode.prototype.setRect = function (upperLeft, dimension) { + this.rect.x = upperLeft.x; + this.rect.y = upperLeft.y; + this.rect.width = dimension.width; + this.rect.height = dimension.height; +}; + +LNode.prototype.setCenter = function (cx, cy) { + this.rect.x = cx - this.rect.width / 2; + this.rect.y = cy - this.rect.height / 2; +}; + +LNode.prototype.setLocation = function (x, y) { + this.rect.x = x; + this.rect.y = y; +}; + +LNode.prototype.moveBy = function (dx, dy) { + this.rect.x += dx; + this.rect.y += dy; +}; + +LNode.prototype.getEdgeListToNode = function (to) { + var edgeList = []; + var edge; + var self = this; + + self.edges.forEach(function (edge) { + + if (edge.target == to) { + if (edge.source != self) throw "Incorrect edge source!"; + + edgeList.push(edge); + } + }); + + return edgeList; +}; + +LNode.prototype.getEdgesBetween = function (other) { + var edgeList = []; + var edge; + + var self = this; + self.edges.forEach(function (edge) { + + if (!(edge.source == self || edge.target == self)) throw "Incorrect edge source and/or target"; + + if (edge.target == other || edge.source == other) { + edgeList.push(edge); + } + }); + + return edgeList; +}; + +LNode.prototype.getNeighborsList = function () { + var neighbors = new Set(); + + var self = this; + self.edges.forEach(function (edge) { + + if (edge.source == self) { + neighbors.add(edge.target); + } else { + if (edge.target != self) { + throw "Incorrect incidency!"; + } + + neighbors.add(edge.source); + } + }); + + return neighbors; +}; + +LNode.prototype.withChildren = function () { + var withNeighborsList = new Set(); + var childNode; + var children; + + withNeighborsList.add(this); + + if (this.child != null) { + var nodes = this.child.getNodes(); + for (var i = 0; i < nodes.length; i++) { + childNode = nodes[i]; + children = childNode.withChildren(); + children.forEach(function (node) { + withNeighborsList.add(node); + }); + } + } + + return withNeighborsList; +}; + +LNode.prototype.getNoOfChildren = function () { + var noOfChildren = 0; + var childNode; + + if (this.child == null) { + noOfChildren = 1; + } else { + var nodes = this.child.getNodes(); + for (var i = 0; i < nodes.length; i++) { + childNode = nodes[i]; + + noOfChildren += childNode.getNoOfChildren(); + } + } + + if (noOfChildren == 0) { + noOfChildren = 1; + } + return noOfChildren; +}; + +LNode.prototype.getEstimatedSize = function () { + if (this.estimatedSize == Integer.MIN_VALUE) { + throw "assert failed"; + } + return this.estimatedSize; +}; + +LNode.prototype.calcEstimatedSize = function () { + if (this.child == null) { + return this.estimatedSize = (this.rect.width + this.rect.height) / 2; + } else { + this.estimatedSize = this.child.calcEstimatedSize(); + this.rect.width = this.estimatedSize; + this.rect.height = this.estimatedSize; + + return this.estimatedSize; + } +}; + +LNode.prototype.scatter = function () { + var randomCenterX; + var randomCenterY; + + var minX = -LayoutConstants.INITIAL_WORLD_BOUNDARY; + var maxX = LayoutConstants.INITIAL_WORLD_BOUNDARY; + randomCenterX = LayoutConstants.WORLD_CENTER_X + RandomSeed.nextDouble() * (maxX - minX) + minX; + + var minY = -LayoutConstants.INITIAL_WORLD_BOUNDARY; + var maxY = LayoutConstants.INITIAL_WORLD_BOUNDARY; + randomCenterY = LayoutConstants.WORLD_CENTER_Y + RandomSeed.nextDouble() * (maxY - minY) + minY; + + this.rect.x = randomCenterX; + this.rect.y = randomCenterY; +}; + +LNode.prototype.updateBounds = function () { + if (this.getChild() == null) { + throw "assert failed"; + } + if (this.getChild().getNodes().length != 0) { + // wrap the children nodes by re-arranging the boundaries + var childGraph = this.getChild(); + childGraph.updateBounds(true); + + this.rect.x = childGraph.getLeft(); + this.rect.y = childGraph.getTop(); + + this.setWidth(childGraph.getRight() - childGraph.getLeft()); + this.setHeight(childGraph.getBottom() - childGraph.getTop()); + + // Update compound bounds considering its label properties + if (LayoutConstants.NODE_DIMENSIONS_INCLUDE_LABELS) { + + var width = childGraph.getRight() - childGraph.getLeft(); + var height = childGraph.getBottom() - childGraph.getTop(); + + if (this.labelWidth > width) { + this.rect.x -= (this.labelWidth - width) / 2; + this.setWidth(this.labelWidth); + } + + if (this.labelHeight > height) { + if (this.labelPos == "center") { + this.rect.y -= (this.labelHeight - height) / 2; + } else if (this.labelPos == "top") { + this.rect.y -= this.labelHeight - height; + } + this.setHeight(this.labelHeight); + } + } + } +}; + +LNode.prototype.getInclusionTreeDepth = function () { + if (this.inclusionTreeDepth == Integer.MAX_VALUE) { + throw "assert failed"; + } + return this.inclusionTreeDepth; +}; + +LNode.prototype.transform = function (trans) { + var left = this.rect.x; + + if (left > LayoutConstants.WORLD_BOUNDARY) { + left = LayoutConstants.WORLD_BOUNDARY; + } else if (left < -LayoutConstants.WORLD_BOUNDARY) { + left = -LayoutConstants.WORLD_BOUNDARY; + } + + var top = this.rect.y; + + if (top > LayoutConstants.WORLD_BOUNDARY) { + top = LayoutConstants.WORLD_BOUNDARY; + } else if (top < -LayoutConstants.WORLD_BOUNDARY) { + top = -LayoutConstants.WORLD_BOUNDARY; + } + + var leftTop = new PointD(left, top); + var vLeftTop = trans.inverseTransformPoint(leftTop); + + this.setLocation(vLeftTop.x, vLeftTop.y); +}; + +LNode.prototype.getLeft = function () { + return this.rect.x; +}; + +LNode.prototype.getRight = function () { + return this.rect.x + this.rect.width; +}; + +LNode.prototype.getTop = function () { + return this.rect.y; +}; + +LNode.prototype.getBottom = function () { + return this.rect.y + this.rect.height; +}; + +LNode.prototype.getParent = function () { + if (this.owner == null) { + return null; + } + + return this.owner.getParent(); +}; + +module.exports = LNode; + +/***/ }), +/* 4 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function PointD(x, y) { + if (x == null && y == null) { + this.x = 0; + this.y = 0; + } else { + this.x = x; + this.y = y; + } +} + +PointD.prototype.getX = function () { + return this.x; +}; + +PointD.prototype.getY = function () { + return this.y; +}; + +PointD.prototype.setX = function (x) { + this.x = x; +}; + +PointD.prototype.setY = function (y) { + this.y = y; +}; + +PointD.prototype.getDifference = function (pt) { + return new DimensionD(this.x - pt.x, this.y - pt.y); +}; + +PointD.prototype.getCopy = function () { + return new PointD(this.x, this.y); +}; + +PointD.prototype.translate = function (dim) { + this.x += dim.width; + this.y += dim.height; + return this; +}; + +module.exports = PointD; + +/***/ }), +/* 5 */ +/***/ (function(module, exports, __nested_webpack_require_17549__) { + +"use strict"; + + +var LGraphObject = __nested_webpack_require_17549__(2); +var Integer = __nested_webpack_require_17549__(10); +var LayoutConstants = __nested_webpack_require_17549__(0); +var LGraphManager = __nested_webpack_require_17549__(6); +var LNode = __nested_webpack_require_17549__(3); +var LEdge = __nested_webpack_require_17549__(1); +var RectangleD = __nested_webpack_require_17549__(13); +var Point = __nested_webpack_require_17549__(12); +var LinkedList = __nested_webpack_require_17549__(11); + +function LGraph(parent, obj2, vGraph) { + LGraphObject.call(this, vGraph); + this.estimatedSize = Integer.MIN_VALUE; + this.margin = LayoutConstants.DEFAULT_GRAPH_MARGIN; + this.edges = []; + this.nodes = []; + this.isConnected = false; + this.parent = parent; + + if (obj2 != null && obj2 instanceof LGraphManager) { + this.graphManager = obj2; + } else if (obj2 != null && obj2 instanceof Layout) { + this.graphManager = obj2.graphManager; + } +} + +LGraph.prototype = Object.create(LGraphObject.prototype); +for (var prop in LGraphObject) { + LGraph[prop] = LGraphObject[prop]; +} + +LGraph.prototype.getNodes = function () { + return this.nodes; +}; + +LGraph.prototype.getEdges = function () { + return this.edges; +}; + +LGraph.prototype.getGraphManager = function () { + return this.graphManager; +}; + +LGraph.prototype.getParent = function () { + return this.parent; +}; + +LGraph.prototype.getLeft = function () { + return this.left; +}; + +LGraph.prototype.getRight = function () { + return this.right; +}; + +LGraph.prototype.getTop = function () { + return this.top; +}; + +LGraph.prototype.getBottom = function () { + return this.bottom; +}; + +LGraph.prototype.isConnected = function () { + return this.isConnected; +}; + +LGraph.prototype.add = function (obj1, sourceNode, targetNode) { + if (sourceNode == null && targetNode == null) { + var newNode = obj1; + if (this.graphManager == null) { + throw "Graph has no graph mgr!"; + } + if (this.getNodes().indexOf(newNode) > -1) { + throw "Node already in graph!"; + } + newNode.owner = this; + this.getNodes().push(newNode); + + return newNode; + } else { + var newEdge = obj1; + if (!(this.getNodes().indexOf(sourceNode) > -1 && this.getNodes().indexOf(targetNode) > -1)) { + throw "Source or target not in graph!"; + } + + if (!(sourceNode.owner == targetNode.owner && sourceNode.owner == this)) { + throw "Both owners must be this graph!"; + } + + if (sourceNode.owner != targetNode.owner) { + return null; + } + + // set source and target + newEdge.source = sourceNode; + newEdge.target = targetNode; + + // set as intra-graph edge + newEdge.isInterGraph = false; + + // add to graph edge list + this.getEdges().push(newEdge); + + // add to incidency lists + sourceNode.edges.push(newEdge); + + if (targetNode != sourceNode) { + targetNode.edges.push(newEdge); + } + + return newEdge; + } +}; + +LGraph.prototype.remove = function (obj) { + var node = obj; + if (obj instanceof LNode) { + if (node == null) { + throw "Node is null!"; + } + if (!(node.owner != null && node.owner == this)) { + throw "Owner graph is invalid!"; + } + if (this.graphManager == null) { + throw "Owner graph manager is invalid!"; + } + // remove incident edges first (make a copy to do it safely) + var edgesToBeRemoved = node.edges.slice(); + var edge; + var s = edgesToBeRemoved.length; + for (var i = 0; i < s; i++) { + edge = edgesToBeRemoved[i]; + + if (edge.isInterGraph) { + this.graphManager.remove(edge); + } else { + edge.source.owner.remove(edge); + } + } + + // now the node itself + var index = this.nodes.indexOf(node); + if (index == -1) { + throw "Node not in owner node list!"; + } + + this.nodes.splice(index, 1); + } else if (obj instanceof LEdge) { + var edge = obj; + if (edge == null) { + throw "Edge is null!"; + } + if (!(edge.source != null && edge.target != null)) { + throw "Source and/or target is null!"; + } + if (!(edge.source.owner != null && edge.target.owner != null && edge.source.owner == this && edge.target.owner == this)) { + throw "Source and/or target owner is invalid!"; + } + + var sourceIndex = edge.source.edges.indexOf(edge); + var targetIndex = edge.target.edges.indexOf(edge); + if (!(sourceIndex > -1 && targetIndex > -1)) { + throw "Source and/or target doesn't know this edge!"; + } + + edge.source.edges.splice(sourceIndex, 1); + + if (edge.target != edge.source) { + edge.target.edges.splice(targetIndex, 1); + } + + var index = edge.source.owner.getEdges().indexOf(edge); + if (index == -1) { + throw "Not in owner's edge list!"; + } + + edge.source.owner.getEdges().splice(index, 1); + } +}; + +LGraph.prototype.updateLeftTop = function () { + var top = Integer.MAX_VALUE; + var left = Integer.MAX_VALUE; + var nodeTop; + var nodeLeft; + var margin; + + var nodes = this.getNodes(); + var s = nodes.length; + + for (var i = 0; i < s; i++) { + var lNode = nodes[i]; + nodeTop = lNode.getTop(); + nodeLeft = lNode.getLeft(); + + if (top > nodeTop) { + top = nodeTop; + } + + if (left > nodeLeft) { + left = nodeLeft; + } + } + + // Do we have any nodes in this graph? + if (top == Integer.MAX_VALUE) { + return null; + } + + if (nodes[0].getParent().paddingLeft != undefined) { + margin = nodes[0].getParent().paddingLeft; + } else { + margin = this.margin; + } + + this.left = left - margin; + this.top = top - margin; + + // Apply the margins and return the result + return new Point(this.left, this.top); +}; + +LGraph.prototype.updateBounds = function (recursive) { + // calculate bounds + var left = Integer.MAX_VALUE; + var right = -Integer.MAX_VALUE; + var top = Integer.MAX_VALUE; + var bottom = -Integer.MAX_VALUE; + var nodeLeft; + var nodeRight; + var nodeTop; + var nodeBottom; + var margin; + + var nodes = this.nodes; + var s = nodes.length; + for (var i = 0; i < s; i++) { + var lNode = nodes[i]; + + if (recursive && lNode.child != null) { + lNode.updateBounds(); + } + nodeLeft = lNode.getLeft(); + nodeRight = lNode.getRight(); + nodeTop = lNode.getTop(); + nodeBottom = lNode.getBottom(); + + if (left > nodeLeft) { + left = nodeLeft; + } + + if (right < nodeRight) { + right = nodeRight; + } + + if (top > nodeTop) { + top = nodeTop; + } + + if (bottom < nodeBottom) { + bottom = nodeBottom; + } + } + + var boundingRect = new RectangleD(left, top, right - left, bottom - top); + if (left == Integer.MAX_VALUE) { + this.left = this.parent.getLeft(); + this.right = this.parent.getRight(); + this.top = this.parent.getTop(); + this.bottom = this.parent.getBottom(); + } + + if (nodes[0].getParent().paddingLeft != undefined) { + margin = nodes[0].getParent().paddingLeft; + } else { + margin = this.margin; + } + + this.left = boundingRect.x - margin; + this.right = boundingRect.x + boundingRect.width + margin; + this.top = boundingRect.y - margin; + this.bottom = boundingRect.y + boundingRect.height + margin; +}; + +LGraph.calculateBounds = function (nodes) { + var left = Integer.MAX_VALUE; + var right = -Integer.MAX_VALUE; + var top = Integer.MAX_VALUE; + var bottom = -Integer.MAX_VALUE; + var nodeLeft; + var nodeRight; + var nodeTop; + var nodeBottom; + + var s = nodes.length; + + for (var i = 0; i < s; i++) { + var lNode = nodes[i]; + nodeLeft = lNode.getLeft(); + nodeRight = lNode.getRight(); + nodeTop = lNode.getTop(); + nodeBottom = lNode.getBottom(); + + if (left > nodeLeft) { + left = nodeLeft; + } + + if (right < nodeRight) { + right = nodeRight; + } + + if (top > nodeTop) { + top = nodeTop; + } + + if (bottom < nodeBottom) { + bottom = nodeBottom; + } + } + + var boundingRect = new RectangleD(left, top, right - left, bottom - top); + + return boundingRect; +}; + +LGraph.prototype.getInclusionTreeDepth = function () { + if (this == this.graphManager.getRoot()) { + return 1; + } else { + return this.parent.getInclusionTreeDepth(); + } +}; + +LGraph.prototype.getEstimatedSize = function () { + if (this.estimatedSize == Integer.MIN_VALUE) { + throw "assert failed"; + } + return this.estimatedSize; +}; + +LGraph.prototype.calcEstimatedSize = function () { + var size = 0; + var nodes = this.nodes; + var s = nodes.length; + + for (var i = 0; i < s; i++) { + var lNode = nodes[i]; + size += lNode.calcEstimatedSize(); + } + + if (size == 0) { + this.estimatedSize = LayoutConstants.EMPTY_COMPOUND_NODE_SIZE; + } else { + this.estimatedSize = size / Math.sqrt(this.nodes.length); + } + + return this.estimatedSize; +}; + +LGraph.prototype.updateConnected = function () { + var self = this; + if (this.nodes.length == 0) { + this.isConnected = true; + return; + } + + var queue = new LinkedList(); + var visited = new Set(); + var currentNode = this.nodes[0]; + var neighborEdges; + var currentNeighbor; + var childrenOfNode = currentNode.withChildren(); + childrenOfNode.forEach(function (node) { + queue.push(node); + visited.add(node); + }); + + while (queue.length !== 0) { + currentNode = queue.shift(); + + // Traverse all neighbors of this node + neighborEdges = currentNode.getEdges(); + var size = neighborEdges.length; + for (var i = 0; i < size; i++) { + var neighborEdge = neighborEdges[i]; + currentNeighbor = neighborEdge.getOtherEndInGraph(currentNode, this); + + // Add unvisited neighbors to the list to visit + if (currentNeighbor != null && !visited.has(currentNeighbor)) { + var childrenOfNeighbor = currentNeighbor.withChildren(); + + childrenOfNeighbor.forEach(function (node) { + queue.push(node); + visited.add(node); + }); + } + } + } + + this.isConnected = false; + + if (visited.size >= this.nodes.length) { + var noOfVisitedInThisGraph = 0; + + visited.forEach(function (visitedNode) { + if (visitedNode.owner == self) { + noOfVisitedInThisGraph++; + } + }); + + if (noOfVisitedInThisGraph == this.nodes.length) { + this.isConnected = true; + } + } +}; + +module.exports = LGraph; + +/***/ }), +/* 6 */ +/***/ (function(module, exports, __nested_webpack_require_27617__) { + +"use strict"; + + +var LGraph; +var LEdge = __nested_webpack_require_27617__(1); + +function LGraphManager(layout) { + LGraph = __nested_webpack_require_27617__(5); // It may be better to initilize this out of this function but it gives an error (Right-hand side of 'instanceof' is not callable) now. + this.layout = layout; + + this.graphs = []; + this.edges = []; +} + +LGraphManager.prototype.addRoot = function () { + var ngraph = this.layout.newGraph(); + var nnode = this.layout.newNode(null); + var root = this.add(ngraph, nnode); + this.setRootGraph(root); + return this.rootGraph; +}; + +LGraphManager.prototype.add = function (newGraph, parentNode, newEdge, sourceNode, targetNode) { + //there are just 2 parameters are passed then it adds an LGraph else it adds an LEdge + if (newEdge == null && sourceNode == null && targetNode == null) { + if (newGraph == null) { + throw "Graph is null!"; + } + if (parentNode == null) { + throw "Parent node is null!"; + } + if (this.graphs.indexOf(newGraph) > -1) { + throw "Graph already in this graph mgr!"; + } + + this.graphs.push(newGraph); + + if (newGraph.parent != null) { + throw "Already has a parent!"; + } + if (parentNode.child != null) { + throw "Already has a child!"; + } + + newGraph.parent = parentNode; + parentNode.child = newGraph; + + return newGraph; + } else { + //change the order of the parameters + targetNode = newEdge; + sourceNode = parentNode; + newEdge = newGraph; + var sourceGraph = sourceNode.getOwner(); + var targetGraph = targetNode.getOwner(); + + if (!(sourceGraph != null && sourceGraph.getGraphManager() == this)) { + throw "Source not in this graph mgr!"; + } + if (!(targetGraph != null && targetGraph.getGraphManager() == this)) { + throw "Target not in this graph mgr!"; + } + + if (sourceGraph == targetGraph) { + newEdge.isInterGraph = false; + return sourceGraph.add(newEdge, sourceNode, targetNode); + } else { + newEdge.isInterGraph = true; + + // set source and target + newEdge.source = sourceNode; + newEdge.target = targetNode; + + // add edge to inter-graph edge list + if (this.edges.indexOf(newEdge) > -1) { + throw "Edge already in inter-graph edge list!"; + } + + this.edges.push(newEdge); + + // add edge to source and target incidency lists + if (!(newEdge.source != null && newEdge.target != null)) { + throw "Edge source and/or target is null!"; + } + + if (!(newEdge.source.edges.indexOf(newEdge) == -1 && newEdge.target.edges.indexOf(newEdge) == -1)) { + throw "Edge already in source and/or target incidency list!"; + } + + newEdge.source.edges.push(newEdge); + newEdge.target.edges.push(newEdge); + + return newEdge; + } + } +}; + +LGraphManager.prototype.remove = function (lObj) { + if (lObj instanceof LGraph) { + var graph = lObj; + if (graph.getGraphManager() != this) { + throw "Graph not in this graph mgr"; + } + if (!(graph == this.rootGraph || graph.parent != null && graph.parent.graphManager == this)) { + throw "Invalid parent node!"; + } + + // first the edges (make a copy to do it safely) + var edgesToBeRemoved = []; + + edgesToBeRemoved = edgesToBeRemoved.concat(graph.getEdges()); + + var edge; + var s = edgesToBeRemoved.length; + for (var i = 0; i < s; i++) { + edge = edgesToBeRemoved[i]; + graph.remove(edge); + } + + // then the nodes (make a copy to do it safely) + var nodesToBeRemoved = []; + + nodesToBeRemoved = nodesToBeRemoved.concat(graph.getNodes()); + + var node; + s = nodesToBeRemoved.length; + for (var i = 0; i < s; i++) { + node = nodesToBeRemoved[i]; + graph.remove(node); + } + + // check if graph is the root + if (graph == this.rootGraph) { + this.setRootGraph(null); + } + + // now remove the graph itself + var index = this.graphs.indexOf(graph); + this.graphs.splice(index, 1); + + // also reset the parent of the graph + graph.parent = null; + } else if (lObj instanceof LEdge) { + edge = lObj; + if (edge == null) { + throw "Edge is null!"; + } + if (!edge.isInterGraph) { + throw "Not an inter-graph edge!"; + } + if (!(edge.source != null && edge.target != null)) { + throw "Source and/or target is null!"; + } + + // remove edge from source and target nodes' incidency lists + + if (!(edge.source.edges.indexOf(edge) != -1 && edge.target.edges.indexOf(edge) != -1)) { + throw "Source and/or target doesn't know this edge!"; + } + + var index = edge.source.edges.indexOf(edge); + edge.source.edges.splice(index, 1); + index = edge.target.edges.indexOf(edge); + edge.target.edges.splice(index, 1); + + // remove edge from owner graph manager's inter-graph edge list + + if (!(edge.source.owner != null && edge.source.owner.getGraphManager() != null)) { + throw "Edge owner graph or owner graph manager is null!"; + } + if (edge.source.owner.getGraphManager().edges.indexOf(edge) == -1) { + throw "Not in owner graph manager's edge list!"; + } + + var index = edge.source.owner.getGraphManager().edges.indexOf(edge); + edge.source.owner.getGraphManager().edges.splice(index, 1); + } +}; + +LGraphManager.prototype.updateBounds = function () { + this.rootGraph.updateBounds(true); +}; + +LGraphManager.prototype.getGraphs = function () { + return this.graphs; +}; + +LGraphManager.prototype.getAllNodes = function () { + if (this.allNodes == null) { + var nodeList = []; + var graphs = this.getGraphs(); + var s = graphs.length; + for (var i = 0; i < s; i++) { + nodeList = nodeList.concat(graphs[i].getNodes()); + } + this.allNodes = nodeList; + } + return this.allNodes; +}; + +LGraphManager.prototype.resetAllNodes = function () { + this.allNodes = null; +}; + +LGraphManager.prototype.resetAllEdges = function () { + this.allEdges = null; +}; + +LGraphManager.prototype.resetAllNodesToApplyGravitation = function () { + this.allNodesToApplyGravitation = null; +}; + +LGraphManager.prototype.getAllEdges = function () { + if (this.allEdges == null) { + var edgeList = []; + var graphs = this.getGraphs(); + var s = graphs.length; + for (var i = 0; i < graphs.length; i++) { + edgeList = edgeList.concat(graphs[i].getEdges()); + } + + edgeList = edgeList.concat(this.edges); + + this.allEdges = edgeList; + } + return this.allEdges; +}; + +LGraphManager.prototype.getAllNodesToApplyGravitation = function () { + return this.allNodesToApplyGravitation; +}; + +LGraphManager.prototype.setAllNodesToApplyGravitation = function (nodeList) { + if (this.allNodesToApplyGravitation != null) { + throw "assert failed"; + } + + this.allNodesToApplyGravitation = nodeList; +}; + +LGraphManager.prototype.getRoot = function () { + return this.rootGraph; +}; + +LGraphManager.prototype.setRootGraph = function (graph) { + if (graph.getGraphManager() != this) { + throw "Root not in this graph mgr!"; + } + + this.rootGraph = graph; + // root graph must have a root node associated with it for convenience + if (graph.parent == null) { + graph.parent = this.layout.newNode("Root node"); + } +}; + +LGraphManager.prototype.getLayout = function () { + return this.layout; +}; + +LGraphManager.prototype.isOneAncestorOfOther = function (firstNode, secondNode) { + if (!(firstNode != null && secondNode != null)) { + throw "assert failed"; + } + + if (firstNode == secondNode) { + return true; + } + // Is second node an ancestor of the first one? + var ownerGraph = firstNode.getOwner(); + var parentNode; + + do { + parentNode = ownerGraph.getParent(); + + if (parentNode == null) { + break; + } + + if (parentNode == secondNode) { + return true; + } + + ownerGraph = parentNode.getOwner(); + if (ownerGraph == null) { + break; + } + } while (true); + // Is first node an ancestor of the second one? + ownerGraph = secondNode.getOwner(); + + do { + parentNode = ownerGraph.getParent(); + + if (parentNode == null) { + break; + } + + if (parentNode == firstNode) { + return true; + } + + ownerGraph = parentNode.getOwner(); + if (ownerGraph == null) { + break; + } + } while (true); + + return false; +}; + +LGraphManager.prototype.calcLowestCommonAncestors = function () { + var edge; + var sourceNode; + var targetNode; + var sourceAncestorGraph; + var targetAncestorGraph; + + var edges = this.getAllEdges(); + var s = edges.length; + for (var i = 0; i < s; i++) { + edge = edges[i]; + + sourceNode = edge.source; + targetNode = edge.target; + edge.lca = null; + edge.sourceInLca = sourceNode; + edge.targetInLca = targetNode; + + if (sourceNode == targetNode) { + edge.lca = sourceNode.getOwner(); + continue; + } + + sourceAncestorGraph = sourceNode.getOwner(); + + while (edge.lca == null) { + edge.targetInLca = targetNode; + targetAncestorGraph = targetNode.getOwner(); + + while (edge.lca == null) { + if (targetAncestorGraph == sourceAncestorGraph) { + edge.lca = targetAncestorGraph; + break; + } + + if (targetAncestorGraph == this.rootGraph) { + break; + } + + if (edge.lca != null) { + throw "assert failed"; + } + edge.targetInLca = targetAncestorGraph.getParent(); + targetAncestorGraph = edge.targetInLca.getOwner(); + } + + if (sourceAncestorGraph == this.rootGraph) { + break; + } + + if (edge.lca == null) { + edge.sourceInLca = sourceAncestorGraph.getParent(); + sourceAncestorGraph = edge.sourceInLca.getOwner(); + } + } + + if (edge.lca == null) { + throw "assert failed"; + } + } +}; + +LGraphManager.prototype.calcLowestCommonAncestor = function (firstNode, secondNode) { + if (firstNode == secondNode) { + return firstNode.getOwner(); + } + var firstOwnerGraph = firstNode.getOwner(); + + do { + if (firstOwnerGraph == null) { + break; + } + var secondOwnerGraph = secondNode.getOwner(); + + do { + if (secondOwnerGraph == null) { + break; + } + + if (secondOwnerGraph == firstOwnerGraph) { + return secondOwnerGraph; + } + secondOwnerGraph = secondOwnerGraph.getParent().getOwner(); + } while (true); + + firstOwnerGraph = firstOwnerGraph.getParent().getOwner(); + } while (true); + + return firstOwnerGraph; +}; + +LGraphManager.prototype.calcInclusionTreeDepths = function (graph, depth) { + if (graph == null && depth == null) { + graph = this.rootGraph; + depth = 1; + } + var node; + + var nodes = graph.getNodes(); + var s = nodes.length; + for (var i = 0; i < s; i++) { + node = nodes[i]; + node.inclusionTreeDepth = depth; + + if (node.child != null) { + this.calcInclusionTreeDepths(node.child, depth + 1); + } + } +}; + +LGraphManager.prototype.includesInvalidEdge = function () { + var edge; + + var s = this.edges.length; + for (var i = 0; i < s; i++) { + edge = this.edges[i]; + + if (this.isOneAncestorOfOther(edge.source, edge.target)) { + return true; + } + } + return false; +}; + +module.exports = LGraphManager; + +/***/ }), +/* 7 */ +/***/ (function(module, exports, __nested_webpack_require_38707__) { + +"use strict"; + + +var LayoutConstants = __nested_webpack_require_38707__(0); + +function FDLayoutConstants() {} + +//FDLayoutConstants inherits static props in LayoutConstants +for (var prop in LayoutConstants) { + FDLayoutConstants[prop] = LayoutConstants[prop]; +} + +FDLayoutConstants.MAX_ITERATIONS = 2500; + +FDLayoutConstants.DEFAULT_EDGE_LENGTH = 50; +FDLayoutConstants.DEFAULT_SPRING_STRENGTH = 0.45; +FDLayoutConstants.DEFAULT_REPULSION_STRENGTH = 4500.0; +FDLayoutConstants.DEFAULT_GRAVITY_STRENGTH = 0.4; +FDLayoutConstants.DEFAULT_COMPOUND_GRAVITY_STRENGTH = 1.0; +FDLayoutConstants.DEFAULT_GRAVITY_RANGE_FACTOR = 3.8; +FDLayoutConstants.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR = 1.5; +FDLayoutConstants.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION = true; +FDLayoutConstants.DEFAULT_USE_SMART_REPULSION_RANGE_CALCULATION = true; +FDLayoutConstants.DEFAULT_COOLING_FACTOR_INCREMENTAL = 0.3; +FDLayoutConstants.COOLING_ADAPTATION_FACTOR = 0.33; +FDLayoutConstants.ADAPTATION_LOWER_NODE_LIMIT = 1000; +FDLayoutConstants.ADAPTATION_UPPER_NODE_LIMIT = 5000; +FDLayoutConstants.MAX_NODE_DISPLACEMENT_INCREMENTAL = 100.0; +FDLayoutConstants.MAX_NODE_DISPLACEMENT = FDLayoutConstants.MAX_NODE_DISPLACEMENT_INCREMENTAL * 3; +FDLayoutConstants.MIN_REPULSION_DIST = FDLayoutConstants.DEFAULT_EDGE_LENGTH / 10.0; +FDLayoutConstants.CONVERGENCE_CHECK_PERIOD = 100; +FDLayoutConstants.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR = 0.1; +FDLayoutConstants.MIN_EDGE_LENGTH = 1; +FDLayoutConstants.GRID_CALCULATION_CHECK_PERIOD = 10; + +module.exports = FDLayoutConstants; + +/***/ }), +/* 8 */ +/***/ (function(module, exports, __nested_webpack_require_40298__) { + +"use strict"; + + +/** + * This class maintains a list of static geometry related utility methods. + * + * + * Copyright: i-Vis Research Group, Bilkent University, 2007 - present + */ + +var Point = __nested_webpack_require_40298__(12); + +function IGeometry() {} + +/** + * This method calculates *half* the amount in x and y directions of the two + * input rectangles needed to separate them keeping their respective + * positioning, and returns the result in the input array. An input + * separation buffer added to the amount in both directions. We assume that + * the two rectangles do intersect. + */ +IGeometry.calcSeparationAmount = function (rectA, rectB, overlapAmount, separationBuffer) { + if (!rectA.intersects(rectB)) { + throw "assert failed"; + } + + var directions = new Array(2); + + this.decideDirectionsForOverlappingNodes(rectA, rectB, directions); + + overlapAmount[0] = Math.min(rectA.getRight(), rectB.getRight()) - Math.max(rectA.x, rectB.x); + overlapAmount[1] = Math.min(rectA.getBottom(), rectB.getBottom()) - Math.max(rectA.y, rectB.y); + + // update the overlapping amounts for the following cases: + if (rectA.getX() <= rectB.getX() && rectA.getRight() >= rectB.getRight()) { + /* Case x.1: + * + * rectA + * | | + * | _________ | + * | | | | + * |________|_______|______| + * | | + * | | + * rectB + */ + overlapAmount[0] += Math.min(rectB.getX() - rectA.getX(), rectA.getRight() - rectB.getRight()); + } else if (rectB.getX() <= rectA.getX() && rectB.getRight() >= rectA.getRight()) { + /* Case x.2: + * + * rectB + * | | + * | _________ | + * | | | | + * |________|_______|______| + * | | + * | | + * rectA + */ + overlapAmount[0] += Math.min(rectA.getX() - rectB.getX(), rectB.getRight() - rectA.getRight()); + } + if (rectA.getY() <= rectB.getY() && rectA.getBottom() >= rectB.getBottom()) { + /* Case y.1: + * ________ rectA + * | + * | + * ______|____ rectB + * | | + * | | + * ______|____| + * | + * | + * |________ + * + */ + overlapAmount[1] += Math.min(rectB.getY() - rectA.getY(), rectA.getBottom() - rectB.getBottom()); + } else if (rectB.getY() <= rectA.getY() && rectB.getBottom() >= rectA.getBottom()) { + /* Case y.2: + * ________ rectB + * | + * | + * ______|____ rectA + * | | + * | | + * ______|____| + * | + * | + * |________ + * + */ + overlapAmount[1] += Math.min(rectA.getY() - rectB.getY(), rectB.getBottom() - rectA.getBottom()); + } + + // find slope of the line passes two centers + var slope = Math.abs((rectB.getCenterY() - rectA.getCenterY()) / (rectB.getCenterX() - rectA.getCenterX())); + // if centers are overlapped + if (rectB.getCenterY() === rectA.getCenterY() && rectB.getCenterX() === rectA.getCenterX()) { + // assume the slope is 1 (45 degree) + slope = 1.0; + } + + var moveByY = slope * overlapAmount[0]; + var moveByX = overlapAmount[1] / slope; + if (overlapAmount[0] < moveByX) { + moveByX = overlapAmount[0]; + } else { + moveByY = overlapAmount[1]; + } + // return half the amount so that if each rectangle is moved by these + // amounts in opposite directions, overlap will be resolved + overlapAmount[0] = -1 * directions[0] * (moveByX / 2 + separationBuffer); + overlapAmount[1] = -1 * directions[1] * (moveByY / 2 + separationBuffer); +}; + +/** + * This method decides the separation direction of overlapping nodes + * + * if directions[0] = -1, then rectA goes left + * if directions[0] = 1, then rectA goes right + * if directions[1] = -1, then rectA goes up + * if directions[1] = 1, then rectA goes down + */ +IGeometry.decideDirectionsForOverlappingNodes = function (rectA, rectB, directions) { + if (rectA.getCenterX() < rectB.getCenterX()) { + directions[0] = -1; + } else { + directions[0] = 1; + } + + if (rectA.getCenterY() < rectB.getCenterY()) { + directions[1] = -1; + } else { + directions[1] = 1; + } +}; + +/** + * This method calculates the intersection (clipping) points of the two + * input rectangles with line segment defined by the centers of these two + * rectangles. The clipping points are saved in the input double array and + * whether or not the two rectangles overlap is returned. + */ +IGeometry.getIntersection2 = function (rectA, rectB, result) { + //result[0-1] will contain clipPoint of rectA, result[2-3] will contain clipPoint of rectB + var p1x = rectA.getCenterX(); + var p1y = rectA.getCenterY(); + var p2x = rectB.getCenterX(); + var p2y = rectB.getCenterY(); + + //if two rectangles intersect, then clipping points are centers + if (rectA.intersects(rectB)) { + result[0] = p1x; + result[1] = p1y; + result[2] = p2x; + result[3] = p2y; + return true; + } + //variables for rectA + var topLeftAx = rectA.getX(); + var topLeftAy = rectA.getY(); + var topRightAx = rectA.getRight(); + var bottomLeftAx = rectA.getX(); + var bottomLeftAy = rectA.getBottom(); + var bottomRightAx = rectA.getRight(); + var halfWidthA = rectA.getWidthHalf(); + var halfHeightA = rectA.getHeightHalf(); + //variables for rectB + var topLeftBx = rectB.getX(); + var topLeftBy = rectB.getY(); + var topRightBx = rectB.getRight(); + var bottomLeftBx = rectB.getX(); + var bottomLeftBy = rectB.getBottom(); + var bottomRightBx = rectB.getRight(); + var halfWidthB = rectB.getWidthHalf(); + var halfHeightB = rectB.getHeightHalf(); + + //flag whether clipping points are found + var clipPointAFound = false; + var clipPointBFound = false; + + // line is vertical + if (p1x === p2x) { + if (p1y > p2y) { + result[0] = p1x; + result[1] = topLeftAy; + result[2] = p2x; + result[3] = bottomLeftBy; + return false; + } else if (p1y < p2y) { + result[0] = p1x; + result[1] = bottomLeftAy; + result[2] = p2x; + result[3] = topLeftBy; + return false; + } else { + //not line, return null; + } + } + // line is horizontal + else if (p1y === p2y) { + if (p1x > p2x) { + result[0] = topLeftAx; + result[1] = p1y; + result[2] = topRightBx; + result[3] = p2y; + return false; + } else if (p1x < p2x) { + result[0] = topRightAx; + result[1] = p1y; + result[2] = topLeftBx; + result[3] = p2y; + return false; + } else { + //not valid line, return null; + } + } else { + //slopes of rectA's and rectB's diagonals + var slopeA = rectA.height / rectA.width; + var slopeB = rectB.height / rectB.width; + + //slope of line between center of rectA and center of rectB + var slopePrime = (p2y - p1y) / (p2x - p1x); + var cardinalDirectionA = void 0; + var cardinalDirectionB = void 0; + var tempPointAx = void 0; + var tempPointAy = void 0; + var tempPointBx = void 0; + var tempPointBy = void 0; + + //determine whether clipping point is the corner of nodeA + if (-slopeA === slopePrime) { + if (p1x > p2x) { + result[0] = bottomLeftAx; + result[1] = bottomLeftAy; + clipPointAFound = true; + } else { + result[0] = topRightAx; + result[1] = topLeftAy; + clipPointAFound = true; + } + } else if (slopeA === slopePrime) { + if (p1x > p2x) { + result[0] = topLeftAx; + result[1] = topLeftAy; + clipPointAFound = true; + } else { + result[0] = bottomRightAx; + result[1] = bottomLeftAy; + clipPointAFound = true; + } + } + + //determine whether clipping point is the corner of nodeB + if (-slopeB === slopePrime) { + if (p2x > p1x) { + result[2] = bottomLeftBx; + result[3] = bottomLeftBy; + clipPointBFound = true; + } else { + result[2] = topRightBx; + result[3] = topLeftBy; + clipPointBFound = true; + } + } else if (slopeB === slopePrime) { + if (p2x > p1x) { + result[2] = topLeftBx; + result[3] = topLeftBy; + clipPointBFound = true; + } else { + result[2] = bottomRightBx; + result[3] = bottomLeftBy; + clipPointBFound = true; + } + } + + //if both clipping points are corners + if (clipPointAFound && clipPointBFound) { + return false; + } + + //determine Cardinal Direction of rectangles + if (p1x > p2x) { + if (p1y > p2y) { + cardinalDirectionA = this.getCardinalDirection(slopeA, slopePrime, 4); + cardinalDirectionB = this.getCardinalDirection(slopeB, slopePrime, 2); + } else { + cardinalDirectionA = this.getCardinalDirection(-slopeA, slopePrime, 3); + cardinalDirectionB = this.getCardinalDirection(-slopeB, slopePrime, 1); + } + } else { + if (p1y > p2y) { + cardinalDirectionA = this.getCardinalDirection(-slopeA, slopePrime, 1); + cardinalDirectionB = this.getCardinalDirection(-slopeB, slopePrime, 3); + } else { + cardinalDirectionA = this.getCardinalDirection(slopeA, slopePrime, 2); + cardinalDirectionB = this.getCardinalDirection(slopeB, slopePrime, 4); + } + } + //calculate clipping Point if it is not found before + if (!clipPointAFound) { + switch (cardinalDirectionA) { + case 1: + tempPointAy = topLeftAy; + tempPointAx = p1x + -halfHeightA / slopePrime; + result[0] = tempPointAx; + result[1] = tempPointAy; + break; + case 2: + tempPointAx = bottomRightAx; + tempPointAy = p1y + halfWidthA * slopePrime; + result[0] = tempPointAx; + result[1] = tempPointAy; + break; + case 3: + tempPointAy = bottomLeftAy; + tempPointAx = p1x + halfHeightA / slopePrime; + result[0] = tempPointAx; + result[1] = tempPointAy; + break; + case 4: + tempPointAx = bottomLeftAx; + tempPointAy = p1y + -halfWidthA * slopePrime; + result[0] = tempPointAx; + result[1] = tempPointAy; + break; + } + } + if (!clipPointBFound) { + switch (cardinalDirectionB) { + case 1: + tempPointBy = topLeftBy; + tempPointBx = p2x + -halfHeightB / slopePrime; + result[2] = tempPointBx; + result[3] = tempPointBy; + break; + case 2: + tempPointBx = bottomRightBx; + tempPointBy = p2y + halfWidthB * slopePrime; + result[2] = tempPointBx; + result[3] = tempPointBy; + break; + case 3: + tempPointBy = bottomLeftBy; + tempPointBx = p2x + halfHeightB / slopePrime; + result[2] = tempPointBx; + result[3] = tempPointBy; + break; + case 4: + tempPointBx = bottomLeftBx; + tempPointBy = p2y + -halfWidthB * slopePrime; + result[2] = tempPointBx; + result[3] = tempPointBy; + break; + } + } + } + return false; +}; + +/** + * This method returns in which cardinal direction does input point stays + * 1: North + * 2: East + * 3: South + * 4: West + */ +IGeometry.getCardinalDirection = function (slope, slopePrime, line) { + if (slope > slopePrime) { + return line; + } else { + return 1 + line % 4; + } +}; + +/** + * This method calculates the intersection of the two lines defined by + * point pairs (s1,s2) and (f1,f2). + */ +IGeometry.getIntersection = function (s1, s2, f1, f2) { + if (f2 == null) { + return this.getIntersection2(s1, s2, f1); + } + + var x1 = s1.x; + var y1 = s1.y; + var x2 = s2.x; + var y2 = s2.y; + var x3 = f1.x; + var y3 = f1.y; + var x4 = f2.x; + var y4 = f2.y; + var x = void 0, + y = void 0; // intersection point + var a1 = void 0, + a2 = void 0, + b1 = void 0, + b2 = void 0, + c1 = void 0, + c2 = void 0; // coefficients of line eqns. + var denom = void 0; + + a1 = y2 - y1; + b1 = x1 - x2; + c1 = x2 * y1 - x1 * y2; // { a1*x + b1*y + c1 = 0 is line 1 } + + a2 = y4 - y3; + b2 = x3 - x4; + c2 = x4 * y3 - x3 * y4; // { a2*x + b2*y + c2 = 0 is line 2 } + + denom = a1 * b2 - a2 * b1; + + if (denom === 0) { + return null; + } + + x = (b1 * c2 - b2 * c1) / denom; + y = (a2 * c1 - a1 * c2) / denom; + + return new Point(x, y); +}; + +/** + * This method finds and returns the angle of the vector from the + x-axis + * in clockwise direction (compatible w/ Java coordinate system!). + */ +IGeometry.angleOfVector = function (Cx, Cy, Nx, Ny) { + var C_angle = void 0; + + if (Cx !== Nx) { + C_angle = Math.atan((Ny - Cy) / (Nx - Cx)); + + if (Nx < Cx) { + C_angle += Math.PI; + } else if (Ny < Cy) { + C_angle += this.TWO_PI; + } + } else if (Ny < Cy) { + C_angle = this.ONE_AND_HALF_PI; // 270 degrees + } else { + C_angle = this.HALF_PI; // 90 degrees + } + + return C_angle; +}; + +/** + * This method checks whether the given two line segments (one with point + * p1 and p2, the other with point p3 and p4) intersect at a point other + * than these points. + */ +IGeometry.doIntersect = function (p1, p2, p3, p4) { + var a = p1.x; + var b = p1.y; + var c = p2.x; + var d = p2.y; + var p = p3.x; + var q = p3.y; + var r = p4.x; + var s = p4.y; + var det = (c - a) * (s - q) - (r - p) * (d - b); + + if (det === 0) { + return false; + } else { + var lambda = ((s - q) * (r - a) + (p - r) * (s - b)) / det; + var gamma = ((b - d) * (r - a) + (c - a) * (s - b)) / det; + return 0 < lambda && lambda < 1 && 0 < gamma && gamma < 1; + } +}; + +// ----------------------------------------------------------------------------- +// Section: Class Constants +// ----------------------------------------------------------------------------- +/** + * Some useful pre-calculated constants + */ +IGeometry.HALF_PI = 0.5 * Math.PI; +IGeometry.ONE_AND_HALF_PI = 1.5 * Math.PI; +IGeometry.TWO_PI = 2.0 * Math.PI; +IGeometry.THREE_PI = 3.0 * Math.PI; + +module.exports = IGeometry; + +/***/ }), +/* 9 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function IMath() {} + +/** + * This method returns the sign of the input value. + */ +IMath.sign = function (value) { + if (value > 0) { + return 1; + } else if (value < 0) { + return -1; + } else { + return 0; + } +}; + +IMath.floor = function (value) { + return value < 0 ? Math.ceil(value) : Math.floor(value); +}; + +IMath.ceil = function (value) { + return value < 0 ? Math.floor(value) : Math.ceil(value); +}; + +module.exports = IMath; + +/***/ }), +/* 10 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function Integer() {} + +Integer.MAX_VALUE = 2147483647; +Integer.MIN_VALUE = -2147483648; + +module.exports = Integer; + +/***/ }), +/* 11 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var nodeFrom = function nodeFrom(value) { + return { value: value, next: null, prev: null }; +}; + +var add = function add(prev, node, next, list) { + if (prev !== null) { + prev.next = node; + } else { + list.head = node; + } + + if (next !== null) { + next.prev = node; + } else { + list.tail = node; + } + + node.prev = prev; + node.next = next; + + list.length++; + + return node; +}; + +var _remove = function _remove(node, list) { + var prev = node.prev, + next = node.next; + + + if (prev !== null) { + prev.next = next; + } else { + list.head = next; + } + + if (next !== null) { + next.prev = prev; + } else { + list.tail = prev; + } + + node.prev = node.next = null; + + list.length--; + + return node; +}; + +var LinkedList = function () { + function LinkedList(vals) { + var _this = this; + + _classCallCheck(this, LinkedList); + + this.length = 0; + this.head = null; + this.tail = null; + + if (vals != null) { + vals.forEach(function (v) { + return _this.push(v); + }); + } + } + + _createClass(LinkedList, [{ + key: "size", + value: function size() { + return this.length; + } + }, { + key: "insertBefore", + value: function insertBefore(val, otherNode) { + return add(otherNode.prev, nodeFrom(val), otherNode, this); + } + }, { + key: "insertAfter", + value: function insertAfter(val, otherNode) { + return add(otherNode, nodeFrom(val), otherNode.next, this); + } + }, { + key: "insertNodeBefore", + value: function insertNodeBefore(newNode, otherNode) { + return add(otherNode.prev, newNode, otherNode, this); + } + }, { + key: "insertNodeAfter", + value: function insertNodeAfter(newNode, otherNode) { + return add(otherNode, newNode, otherNode.next, this); + } + }, { + key: "push", + value: function push(val) { + return add(this.tail, nodeFrom(val), null, this); + } + }, { + key: "unshift", + value: function unshift(val) { + return add(null, nodeFrom(val), this.head, this); + } + }, { + key: "remove", + value: function remove(node) { + return _remove(node, this); + } + }, { + key: "pop", + value: function pop() { + return _remove(this.tail, this).value; + } + }, { + key: "popNode", + value: function popNode() { + return _remove(this.tail, this); + } + }, { + key: "shift", + value: function shift() { + return _remove(this.head, this).value; + } + }, { + key: "shiftNode", + value: function shiftNode() { + return _remove(this.head, this); + } + }, { + key: "get_object_at", + value: function get_object_at(index) { + if (index <= this.length()) { + var i = 1; + var current = this.head; + while (i < index) { + current = current.next; + i++; + } + return current.value; + } + } + }, { + key: "set_object_at", + value: function set_object_at(index, value) { + if (index <= this.length()) { + var i = 1; + var current = this.head; + while (i < index) { + current = current.next; + i++; + } + current.value = value; + } + } + }]); + + return LinkedList; +}(); + +module.exports = LinkedList; + +/***/ }), +/* 12 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +/* + *This class is the javascript implementation of the Point.java class in jdk + */ +function Point(x, y, p) { + this.x = null; + this.y = null; + if (x == null && y == null && p == null) { + this.x = 0; + this.y = 0; + } else if (typeof x == 'number' && typeof y == 'number' && p == null) { + this.x = x; + this.y = y; + } else if (x.constructor.name == 'Point' && y == null && p == null) { + p = x; + this.x = p.x; + this.y = p.y; + } +} + +Point.prototype.getX = function () { + return this.x; +}; + +Point.prototype.getY = function () { + return this.y; +}; + +Point.prototype.getLocation = function () { + return new Point(this.x, this.y); +}; + +Point.prototype.setLocation = function (x, y, p) { + if (x.constructor.name == 'Point' && y == null && p == null) { + p = x; + this.setLocation(p.x, p.y); + } else if (typeof x == 'number' && typeof y == 'number' && p == null) { + //if both parameters are integer just move (x,y) location + if (parseInt(x) == x && parseInt(y) == y) { + this.move(x, y); + } else { + this.x = Math.floor(x + 0.5); + this.y = Math.floor(y + 0.5); + } + } +}; + +Point.prototype.move = function (x, y) { + this.x = x; + this.y = y; +}; + +Point.prototype.translate = function (dx, dy) { + this.x += dx; + this.y += dy; +}; + +Point.prototype.equals = function (obj) { + if (obj.constructor.name == "Point") { + var pt = obj; + return this.x == pt.x && this.y == pt.y; + } + return this == obj; +}; + +Point.prototype.toString = function () { + return new Point().constructor.name + "[x=" + this.x + ",y=" + this.y + "]"; +}; + +module.exports = Point; + +/***/ }), +/* 13 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function RectangleD(x, y, width, height) { + this.x = 0; + this.y = 0; + this.width = 0; + this.height = 0; + + if (x != null && y != null && width != null && height != null) { + this.x = x; + this.y = y; + this.width = width; + this.height = height; + } +} + +RectangleD.prototype.getX = function () { + return this.x; +}; + +RectangleD.prototype.setX = function (x) { + this.x = x; +}; + +RectangleD.prototype.getY = function () { + return this.y; +}; + +RectangleD.prototype.setY = function (y) { + this.y = y; +}; + +RectangleD.prototype.getWidth = function () { + return this.width; +}; + +RectangleD.prototype.setWidth = function (width) { + this.width = width; +}; + +RectangleD.prototype.getHeight = function () { + return this.height; +}; + +RectangleD.prototype.setHeight = function (height) { + this.height = height; +}; + +RectangleD.prototype.getRight = function () { + return this.x + this.width; +}; + +RectangleD.prototype.getBottom = function () { + return this.y + this.height; +}; + +RectangleD.prototype.intersects = function (a) { + if (this.getRight() < a.x) { + return false; + } + + if (this.getBottom() < a.y) { + return false; + } + + if (a.getRight() < this.x) { + return false; + } + + if (a.getBottom() < this.y) { + return false; + } + + return true; +}; + +RectangleD.prototype.getCenterX = function () { + return this.x + this.width / 2; +}; + +RectangleD.prototype.getMinX = function () { + return this.getX(); +}; + +RectangleD.prototype.getMaxX = function () { + return this.getX() + this.width; +}; + +RectangleD.prototype.getCenterY = function () { + return this.y + this.height / 2; +}; + +RectangleD.prototype.getMinY = function () { + return this.getY(); +}; + +RectangleD.prototype.getMaxY = function () { + return this.getY() + this.height; +}; + +RectangleD.prototype.getWidthHalf = function () { + return this.width / 2; +}; + +RectangleD.prototype.getHeightHalf = function () { + return this.height / 2; +}; + +module.exports = RectangleD; + +/***/ }), +/* 14 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +function UniqueIDGeneretor() {} + +UniqueIDGeneretor.lastID = 0; + +UniqueIDGeneretor.createID = function (obj) { + if (UniqueIDGeneretor.isPrimitive(obj)) { + return obj; + } + if (obj.uniqueID != null) { + return obj.uniqueID; + } + obj.uniqueID = UniqueIDGeneretor.getString(); + UniqueIDGeneretor.lastID++; + return obj.uniqueID; +}; + +UniqueIDGeneretor.getString = function (id) { + if (id == null) id = UniqueIDGeneretor.lastID; + return "Object#" + id + ""; +}; + +UniqueIDGeneretor.isPrimitive = function (arg) { + var type = typeof arg === "undefined" ? "undefined" : _typeof(arg); + return arg == null || type != "object" && type != "function"; +}; + +module.exports = UniqueIDGeneretor; + +/***/ }), +/* 15 */ +/***/ (function(module, exports, __nested_webpack_require_64072__) { + +"use strict"; + + +function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } + +var LayoutConstants = __nested_webpack_require_64072__(0); +var LGraphManager = __nested_webpack_require_64072__(6); +var LNode = __nested_webpack_require_64072__(3); +var LEdge = __nested_webpack_require_64072__(1); +var LGraph = __nested_webpack_require_64072__(5); +var PointD = __nested_webpack_require_64072__(4); +var Transform = __nested_webpack_require_64072__(17); +var Emitter = __nested_webpack_require_64072__(27); + +function Layout(isRemoteUse) { + Emitter.call(this); + + //Layout Quality: 0:draft, 1:default, 2:proof + this.layoutQuality = LayoutConstants.QUALITY; + //Whether layout should create bendpoints as needed or not + this.createBendsAsNeeded = LayoutConstants.DEFAULT_CREATE_BENDS_AS_NEEDED; + //Whether layout should be incremental or not + this.incremental = LayoutConstants.DEFAULT_INCREMENTAL; + //Whether we animate from before to after layout node positions + this.animationOnLayout = LayoutConstants.DEFAULT_ANIMATION_ON_LAYOUT; + //Whether we animate the layout process or not + this.animationDuringLayout = LayoutConstants.DEFAULT_ANIMATION_DURING_LAYOUT; + //Number iterations that should be done between two successive animations + this.animationPeriod = LayoutConstants.DEFAULT_ANIMATION_PERIOD; + /** + * Whether or not leaf nodes (non-compound nodes) are of uniform sizes. When + * they are, both spring and repulsion forces between two leaf nodes can be + * calculated without the expensive clipping point calculations, resulting + * in major speed-up. + */ + this.uniformLeafNodeSizes = LayoutConstants.DEFAULT_UNIFORM_LEAF_NODE_SIZES; + /** + * This is used for creation of bendpoints by using dummy nodes and edges. + * Maps an LEdge to its dummy bendpoint path. + */ + this.edgeToDummyNodes = new Map(); + this.graphManager = new LGraphManager(this); + this.isLayoutFinished = false; + this.isSubLayout = false; + this.isRemoteUse = false; + + if (isRemoteUse != null) { + this.isRemoteUse = isRemoteUse; + } +} + +Layout.RANDOM_SEED = 1; + +Layout.prototype = Object.create(Emitter.prototype); + +Layout.prototype.getGraphManager = function () { + return this.graphManager; +}; + +Layout.prototype.getAllNodes = function () { + return this.graphManager.getAllNodes(); +}; + +Layout.prototype.getAllEdges = function () { + return this.graphManager.getAllEdges(); +}; + +Layout.prototype.getAllNodesToApplyGravitation = function () { + return this.graphManager.getAllNodesToApplyGravitation(); +}; + +Layout.prototype.newGraphManager = function () { + var gm = new LGraphManager(this); + this.graphManager = gm; + return gm; +}; + +Layout.prototype.newGraph = function (vGraph) { + return new LGraph(null, this.graphManager, vGraph); +}; + +Layout.prototype.newNode = function (vNode) { + return new LNode(this.graphManager, vNode); +}; + +Layout.prototype.newEdge = function (vEdge) { + return new LEdge(null, null, vEdge); +}; + +Layout.prototype.checkLayoutSuccess = function () { + return this.graphManager.getRoot() == null || this.graphManager.getRoot().getNodes().length == 0 || this.graphManager.includesInvalidEdge(); +}; + +Layout.prototype.runLayout = function () { + this.isLayoutFinished = false; + + if (this.tilingPreLayout) { + this.tilingPreLayout(); + } + + this.initParameters(); + var isLayoutSuccessfull; + + if (this.checkLayoutSuccess()) { + isLayoutSuccessfull = false; + } else { + isLayoutSuccessfull = this.layout(); + } + + if (LayoutConstants.ANIMATE === 'during') { + // If this is a 'during' layout animation. Layout is not finished yet. + // We need to perform these in index.js when layout is really finished. + return false; + } + + if (isLayoutSuccessfull) { + if (!this.isSubLayout) { + this.doPostLayout(); + } + } + + if (this.tilingPostLayout) { + this.tilingPostLayout(); + } + + this.isLayoutFinished = true; + + return isLayoutSuccessfull; +}; + +/** + * This method performs the operations required after layout. + */ +Layout.prototype.doPostLayout = function () { + //assert !isSubLayout : "Should not be called on sub-layout!"; + // Propagate geometric changes to v-level objects + if (!this.incremental) { + this.transform(); + } + this.update(); +}; + +/** + * This method updates the geometry of the target graph according to + * calculated layout. + */ +Layout.prototype.update2 = function () { + // update bend points + if (this.createBendsAsNeeded) { + this.createBendpointsFromDummyNodes(); + + // reset all edges, since the topology has changed + this.graphManager.resetAllEdges(); + } + + // perform edge, node and root updates if layout is not called + // remotely + if (!this.isRemoteUse) { + // update all edges + var edge; + var allEdges = this.graphManager.getAllEdges(); + for (var i = 0; i < allEdges.length; i++) { + edge = allEdges[i]; + // this.update(edge); + } + + // recursively update nodes + var node; + var nodes = this.graphManager.getRoot().getNodes(); + for (var i = 0; i < nodes.length; i++) { + node = nodes[i]; + // this.update(node); + } + + // update root graph + this.update(this.graphManager.getRoot()); + } +}; + +Layout.prototype.update = function (obj) { + if (obj == null) { + this.update2(); + } else if (obj instanceof LNode) { + var node = obj; + if (node.getChild() != null) { + // since node is compound, recursively update child nodes + var nodes = node.getChild().getNodes(); + for (var i = 0; i < nodes.length; i++) { + update(nodes[i]); + } + } + + // if the l-level node is associated with a v-level graph object, + // then it is assumed that the v-level node implements the + // interface Updatable. + if (node.vGraphObject != null) { + // cast to Updatable without any type check + var vNode = node.vGraphObject; + + // call the update method of the interface + vNode.update(node); + } + } else if (obj instanceof LEdge) { + var edge = obj; + // if the l-level edge is associated with a v-level graph object, + // then it is assumed that the v-level edge implements the + // interface Updatable. + + if (edge.vGraphObject != null) { + // cast to Updatable without any type check + var vEdge = edge.vGraphObject; + + // call the update method of the interface + vEdge.update(edge); + } + } else if (obj instanceof LGraph) { + var graph = obj; + // if the l-level graph is associated with a v-level graph object, + // then it is assumed that the v-level object implements the + // interface Updatable. + + if (graph.vGraphObject != null) { + // cast to Updatable without any type check + var vGraph = graph.vGraphObject; + + // call the update method of the interface + vGraph.update(graph); + } + } +}; + +/** + * This method is used to set all layout parameters to default values + * determined at compile time. + */ +Layout.prototype.initParameters = function () { + if (!this.isSubLayout) { + this.layoutQuality = LayoutConstants.QUALITY; + this.animationDuringLayout = LayoutConstants.DEFAULT_ANIMATION_DURING_LAYOUT; + this.animationPeriod = LayoutConstants.DEFAULT_ANIMATION_PERIOD; + this.animationOnLayout = LayoutConstants.DEFAULT_ANIMATION_ON_LAYOUT; + this.incremental = LayoutConstants.DEFAULT_INCREMENTAL; + this.createBendsAsNeeded = LayoutConstants.DEFAULT_CREATE_BENDS_AS_NEEDED; + this.uniformLeafNodeSizes = LayoutConstants.DEFAULT_UNIFORM_LEAF_NODE_SIZES; + } + + if (this.animationDuringLayout) { + this.animationOnLayout = false; + } +}; + +Layout.prototype.transform = function (newLeftTop) { + if (newLeftTop == undefined) { + this.transform(new PointD(0, 0)); + } else { + // create a transformation object (from Eclipse to layout). When an + // inverse transform is applied, we get upper-left coordinate of the + // drawing or the root graph at given input coordinate (some margins + // already included in calculation of left-top). + + var trans = new Transform(); + var leftTop = this.graphManager.getRoot().updateLeftTop(); + + if (leftTop != null) { + trans.setWorldOrgX(newLeftTop.x); + trans.setWorldOrgY(newLeftTop.y); + + trans.setDeviceOrgX(leftTop.x); + trans.setDeviceOrgY(leftTop.y); + + var nodes = this.getAllNodes(); + var node; + + for (var i = 0; i < nodes.length; i++) { + node = nodes[i]; + node.transform(trans); + } + } + } +}; + +Layout.prototype.positionNodesRandomly = function (graph) { + + if (graph == undefined) { + //assert !this.incremental; + this.positionNodesRandomly(this.getGraphManager().getRoot()); + this.getGraphManager().getRoot().updateBounds(true); + } else { + var lNode; + var childGraph; + + var nodes = graph.getNodes(); + for (var i = 0; i < nodes.length; i++) { + lNode = nodes[i]; + childGraph = lNode.getChild(); + + if (childGraph == null) { + lNode.scatter(); + } else if (childGraph.getNodes().length == 0) { + lNode.scatter(); + } else { + this.positionNodesRandomly(childGraph); + lNode.updateBounds(); + } + } + } +}; + +/** + * This method returns a list of trees where each tree is represented as a + * list of l-nodes. The method returns a list of size 0 when: + * - The graph is not flat or + * - One of the component(s) of the graph is not a tree. + */ +Layout.prototype.getFlatForest = function () { + var flatForest = []; + var isForest = true; + + // Quick reference for all nodes in the graph manager associated with + // this layout. The list should not be changed. + var allNodes = this.graphManager.getRoot().getNodes(); + + // First be sure that the graph is flat + var isFlat = true; + + for (var i = 0; i < allNodes.length; i++) { + if (allNodes[i].getChild() != null) { + isFlat = false; + } + } + + // Return empty forest if the graph is not flat. + if (!isFlat) { + return flatForest; + } + + // Run BFS for each component of the graph. + + var visited = new Set(); + var toBeVisited = []; + var parents = new Map(); + var unProcessedNodes = []; + + unProcessedNodes = unProcessedNodes.concat(allNodes); + + // Each iteration of this loop finds a component of the graph and + // decides whether it is a tree or not. If it is a tree, adds it to the + // forest and continued with the next component. + + while (unProcessedNodes.length > 0 && isForest) { + toBeVisited.push(unProcessedNodes[0]); + + // Start the BFS. Each iteration of this loop visits a node in a + // BFS manner. + while (toBeVisited.length > 0 && isForest) { + //pool operation + var currentNode = toBeVisited[0]; + toBeVisited.splice(0, 1); + visited.add(currentNode); + + // Traverse all neighbors of this node + var neighborEdges = currentNode.getEdges(); + + for (var i = 0; i < neighborEdges.length; i++) { + var currentNeighbor = neighborEdges[i].getOtherEnd(currentNode); + + // If BFS is not growing from this neighbor. + if (parents.get(currentNode) != currentNeighbor) { + // We haven't previously visited this neighbor. + if (!visited.has(currentNeighbor)) { + toBeVisited.push(currentNeighbor); + parents.set(currentNeighbor, currentNode); + } + // Since we have previously visited this neighbor and + // this neighbor is not parent of currentNode, given + // graph contains a component that is not tree, hence + // it is not a forest. + else { + isForest = false; + break; + } + } + } + } + + // The graph contains a component that is not a tree. Empty + // previously found trees. The method will end. + if (!isForest) { + flatForest = []; + } + // Save currently visited nodes as a tree in our forest. Reset + // visited and parents lists. Continue with the next component of + // the graph, if any. + else { + var temp = [].concat(_toConsumableArray(visited)); + flatForest.push(temp); + //flatForest = flatForest.concat(temp); + //unProcessedNodes.removeAll(visited); + for (var i = 0; i < temp.length; i++) { + var value = temp[i]; + var index = unProcessedNodes.indexOf(value); + if (index > -1) { + unProcessedNodes.splice(index, 1); + } + } + visited = new Set(); + parents = new Map(); + } + } + + return flatForest; +}; + +/** + * This method creates dummy nodes (an l-level node with minimal dimensions) + * for the given edge (one per bendpoint). The existing l-level structure + * is updated accordingly. + */ +Layout.prototype.createDummyNodesForBendpoints = function (edge) { + var dummyNodes = []; + var prev = edge.source; + + var graph = this.graphManager.calcLowestCommonAncestor(edge.source, edge.target); + + for (var i = 0; i < edge.bendpoints.length; i++) { + // create new dummy node + var dummyNode = this.newNode(null); + dummyNode.setRect(new Point(0, 0), new Dimension(1, 1)); + + graph.add(dummyNode); + + // create new dummy edge between prev and dummy node + var dummyEdge = this.newEdge(null); + this.graphManager.add(dummyEdge, prev, dummyNode); + + dummyNodes.add(dummyNode); + prev = dummyNode; + } + + var dummyEdge = this.newEdge(null); + this.graphManager.add(dummyEdge, prev, edge.target); + + this.edgeToDummyNodes.set(edge, dummyNodes); + + // remove real edge from graph manager if it is inter-graph + if (edge.isInterGraph()) { + this.graphManager.remove(edge); + } + // else, remove the edge from the current graph + else { + graph.remove(edge); + } + + return dummyNodes; +}; + +/** + * This method creates bendpoints for edges from the dummy nodes + * at l-level. + */ +Layout.prototype.createBendpointsFromDummyNodes = function () { + var edges = []; + edges = edges.concat(this.graphManager.getAllEdges()); + edges = [].concat(_toConsumableArray(this.edgeToDummyNodes.keys())).concat(edges); + + for (var k = 0; k < edges.length; k++) { + var lEdge = edges[k]; + + if (lEdge.bendpoints.length > 0) { + var path = this.edgeToDummyNodes.get(lEdge); + + for (var i = 0; i < path.length; i++) { + var dummyNode = path[i]; + var p = new PointD(dummyNode.getCenterX(), dummyNode.getCenterY()); + + // update bendpoint's location according to dummy node + var ebp = lEdge.bendpoints.get(i); + ebp.x = p.x; + ebp.y = p.y; + + // remove the dummy node, dummy edges incident with this + // dummy node is also removed (within the remove method) + dummyNode.getOwner().remove(dummyNode); + } + + // add the real edge to graph + this.graphManager.add(lEdge, lEdge.source, lEdge.target); + } + } +}; + +Layout.transform = function (sliderValue, defaultValue, minDiv, maxMul) { + if (minDiv != undefined && maxMul != undefined) { + var value = defaultValue; + + if (sliderValue <= 50) { + var minValue = defaultValue / minDiv; + value -= (defaultValue - minValue) / 50 * (50 - sliderValue); + } else { + var maxValue = defaultValue * maxMul; + value += (maxValue - defaultValue) / 50 * (sliderValue - 50); + } + + return value; + } else { + var a, b; + + if (sliderValue <= 50) { + a = 9.0 * defaultValue / 500.0; + b = defaultValue / 10.0; + } else { + a = 9.0 * defaultValue / 50.0; + b = -8 * defaultValue; + } + + return a * sliderValue + b; + } +}; + +/** + * This method finds and returns the center of the given nodes, assuming + * that the given nodes form a tree in themselves. + */ +Layout.findCenterOfTree = function (nodes) { + var list = []; + list = list.concat(nodes); + + var removedNodes = []; + var remainingDegrees = new Map(); + var foundCenter = false; + var centerNode = null; + + if (list.length == 1 || list.length == 2) { + foundCenter = true; + centerNode = list[0]; + } + + for (var i = 0; i < list.length; i++) { + var node = list[i]; + var degree = node.getNeighborsList().size; + remainingDegrees.set(node, node.getNeighborsList().size); + + if (degree == 1) { + removedNodes.push(node); + } + } + + var tempList = []; + tempList = tempList.concat(removedNodes); + + while (!foundCenter) { + var tempList2 = []; + tempList2 = tempList2.concat(tempList); + tempList = []; + + for (var i = 0; i < list.length; i++) { + var node = list[i]; + + var index = list.indexOf(node); + if (index >= 0) { + list.splice(index, 1); + } + + var neighbours = node.getNeighborsList(); + + neighbours.forEach(function (neighbour) { + if (removedNodes.indexOf(neighbour) < 0) { + var otherDegree = remainingDegrees.get(neighbour); + var newDegree = otherDegree - 1; + + if (newDegree == 1) { + tempList.push(neighbour); + } + + remainingDegrees.set(neighbour, newDegree); + } + }); + } + + removedNodes = removedNodes.concat(tempList); + + if (list.length == 1 || list.length == 2) { + foundCenter = true; + centerNode = list[0]; + } + } + + return centerNode; +}; + +/** + * During the coarsening process, this layout may be referenced by two graph managers + * this setter function grants access to change the currently being used graph manager + */ +Layout.prototype.setGraphManager = function (gm) { + this.graphManager = gm; +}; + +module.exports = Layout; + +/***/ }), +/* 16 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function RandomSeed() {} +// adapted from: https://stackoverflow.com/a/19303725 +RandomSeed.seed = 1; +RandomSeed.x = 0; + +RandomSeed.nextDouble = function () { + RandomSeed.x = Math.sin(RandomSeed.seed++) * 10000; + return RandomSeed.x - Math.floor(RandomSeed.x); +}; + +module.exports = RandomSeed; + +/***/ }), +/* 17 */ +/***/ (function(module, exports, __nested_webpack_require_81860__) { + +"use strict"; + + +var PointD = __nested_webpack_require_81860__(4); + +function Transform(x, y) { + this.lworldOrgX = 0.0; + this.lworldOrgY = 0.0; + this.ldeviceOrgX = 0.0; + this.ldeviceOrgY = 0.0; + this.lworldExtX = 1.0; + this.lworldExtY = 1.0; + this.ldeviceExtX = 1.0; + this.ldeviceExtY = 1.0; +} + +Transform.prototype.getWorldOrgX = function () { + return this.lworldOrgX; +}; + +Transform.prototype.setWorldOrgX = function (wox) { + this.lworldOrgX = wox; +}; + +Transform.prototype.getWorldOrgY = function () { + return this.lworldOrgY; +}; + +Transform.prototype.setWorldOrgY = function (woy) { + this.lworldOrgY = woy; +}; + +Transform.prototype.getWorldExtX = function () { + return this.lworldExtX; +}; + +Transform.prototype.setWorldExtX = function (wex) { + this.lworldExtX = wex; +}; + +Transform.prototype.getWorldExtY = function () { + return this.lworldExtY; +}; + +Transform.prototype.setWorldExtY = function (wey) { + this.lworldExtY = wey; +}; + +/* Device related */ + +Transform.prototype.getDeviceOrgX = function () { + return this.ldeviceOrgX; +}; + +Transform.prototype.setDeviceOrgX = function (dox) { + this.ldeviceOrgX = dox; +}; + +Transform.prototype.getDeviceOrgY = function () { + return this.ldeviceOrgY; +}; + +Transform.prototype.setDeviceOrgY = function (doy) { + this.ldeviceOrgY = doy; +}; + +Transform.prototype.getDeviceExtX = function () { + return this.ldeviceExtX; +}; + +Transform.prototype.setDeviceExtX = function (dex) { + this.ldeviceExtX = dex; +}; + +Transform.prototype.getDeviceExtY = function () { + return this.ldeviceExtY; +}; + +Transform.prototype.setDeviceExtY = function (dey) { + this.ldeviceExtY = dey; +}; + +Transform.prototype.transformX = function (x) { + var xDevice = 0.0; + var worldExtX = this.lworldExtX; + if (worldExtX != 0.0) { + xDevice = this.ldeviceOrgX + (x - this.lworldOrgX) * this.ldeviceExtX / worldExtX; + } + + return xDevice; +}; + +Transform.prototype.transformY = function (y) { + var yDevice = 0.0; + var worldExtY = this.lworldExtY; + if (worldExtY != 0.0) { + yDevice = this.ldeviceOrgY + (y - this.lworldOrgY) * this.ldeviceExtY / worldExtY; + } + + return yDevice; +}; + +Transform.prototype.inverseTransformX = function (x) { + var xWorld = 0.0; + var deviceExtX = this.ldeviceExtX; + if (deviceExtX != 0.0) { + xWorld = this.lworldOrgX + (x - this.ldeviceOrgX) * this.lworldExtX / deviceExtX; + } + + return xWorld; +}; + +Transform.prototype.inverseTransformY = function (y) { + var yWorld = 0.0; + var deviceExtY = this.ldeviceExtY; + if (deviceExtY != 0.0) { + yWorld = this.lworldOrgY + (y - this.ldeviceOrgY) * this.lworldExtY / deviceExtY; + } + return yWorld; +}; + +Transform.prototype.inverseTransformPoint = function (inPoint) { + var outPoint = new PointD(this.inverseTransformX(inPoint.x), this.inverseTransformY(inPoint.y)); + return outPoint; +}; + +module.exports = Transform; + +/***/ }), +/* 18 */ +/***/ (function(module, exports, __nested_webpack_require_84747__) { + +"use strict"; + + +function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } + +var Layout = __nested_webpack_require_84747__(15); +var FDLayoutConstants = __nested_webpack_require_84747__(7); +var LayoutConstants = __nested_webpack_require_84747__(0); +var IGeometry = __nested_webpack_require_84747__(8); +var IMath = __nested_webpack_require_84747__(9); + +function FDLayout() { + Layout.call(this); + + this.useSmartIdealEdgeLengthCalculation = FDLayoutConstants.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION; + this.idealEdgeLength = FDLayoutConstants.DEFAULT_EDGE_LENGTH; + this.springConstant = FDLayoutConstants.DEFAULT_SPRING_STRENGTH; + this.repulsionConstant = FDLayoutConstants.DEFAULT_REPULSION_STRENGTH; + this.gravityConstant = FDLayoutConstants.DEFAULT_GRAVITY_STRENGTH; + this.compoundGravityConstant = FDLayoutConstants.DEFAULT_COMPOUND_GRAVITY_STRENGTH; + this.gravityRangeFactor = FDLayoutConstants.DEFAULT_GRAVITY_RANGE_FACTOR; + this.compoundGravityRangeFactor = FDLayoutConstants.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR; + this.displacementThresholdPerNode = 3.0 * FDLayoutConstants.DEFAULT_EDGE_LENGTH / 100; + this.coolingFactor = FDLayoutConstants.DEFAULT_COOLING_FACTOR_INCREMENTAL; + this.initialCoolingFactor = FDLayoutConstants.DEFAULT_COOLING_FACTOR_INCREMENTAL; + this.totalDisplacement = 0.0; + this.oldTotalDisplacement = 0.0; + this.maxIterations = FDLayoutConstants.MAX_ITERATIONS; +} + +FDLayout.prototype = Object.create(Layout.prototype); + +for (var prop in Layout) { + FDLayout[prop] = Layout[prop]; +} + +FDLayout.prototype.initParameters = function () { + Layout.prototype.initParameters.call(this, arguments); + + this.totalIterations = 0; + this.notAnimatedIterations = 0; + + this.useFRGridVariant = FDLayoutConstants.DEFAULT_USE_SMART_REPULSION_RANGE_CALCULATION; + + this.grid = []; +}; + +FDLayout.prototype.calcIdealEdgeLengths = function () { + var edge; + var lcaDepth; + var source; + var target; + var sizeOfSourceInLca; + var sizeOfTargetInLca; + + var allEdges = this.getGraphManager().getAllEdges(); + for (var i = 0; i < allEdges.length; i++) { + edge = allEdges[i]; + + edge.idealLength = this.idealEdgeLength; + + if (edge.isInterGraph) { + source = edge.getSource(); + target = edge.getTarget(); + + sizeOfSourceInLca = edge.getSourceInLca().getEstimatedSize(); + sizeOfTargetInLca = edge.getTargetInLca().getEstimatedSize(); + + if (this.useSmartIdealEdgeLengthCalculation) { + edge.idealLength += sizeOfSourceInLca + sizeOfTargetInLca - 2 * LayoutConstants.SIMPLE_NODE_SIZE; + } + + lcaDepth = edge.getLca().getInclusionTreeDepth(); + + edge.idealLength += FDLayoutConstants.DEFAULT_EDGE_LENGTH * FDLayoutConstants.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR * (source.getInclusionTreeDepth() + target.getInclusionTreeDepth() - 2 * lcaDepth); + } + } +}; + +FDLayout.prototype.initSpringEmbedder = function () { + + var s = this.getAllNodes().length; + if (this.incremental) { + if (s > FDLayoutConstants.ADAPTATION_LOWER_NODE_LIMIT) { + this.coolingFactor = Math.max(this.coolingFactor * FDLayoutConstants.COOLING_ADAPTATION_FACTOR, this.coolingFactor - (s - FDLayoutConstants.ADAPTATION_LOWER_NODE_LIMIT) / (FDLayoutConstants.ADAPTATION_UPPER_NODE_LIMIT - FDLayoutConstants.ADAPTATION_LOWER_NODE_LIMIT) * this.coolingFactor * (1 - FDLayoutConstants.COOLING_ADAPTATION_FACTOR)); + } + this.maxNodeDisplacement = FDLayoutConstants.MAX_NODE_DISPLACEMENT_INCREMENTAL; + } else { + if (s > FDLayoutConstants.ADAPTATION_LOWER_NODE_LIMIT) { + this.coolingFactor = Math.max(FDLayoutConstants.COOLING_ADAPTATION_FACTOR, 1.0 - (s - FDLayoutConstants.ADAPTATION_LOWER_NODE_LIMIT) / (FDLayoutConstants.ADAPTATION_UPPER_NODE_LIMIT - FDLayoutConstants.ADAPTATION_LOWER_NODE_LIMIT) * (1 - FDLayoutConstants.COOLING_ADAPTATION_FACTOR)); + } else { + this.coolingFactor = 1.0; + } + this.initialCoolingFactor = this.coolingFactor; + this.maxNodeDisplacement = FDLayoutConstants.MAX_NODE_DISPLACEMENT; + } + + this.maxIterations = Math.max(this.getAllNodes().length * 5, this.maxIterations); + + this.totalDisplacementThreshold = this.displacementThresholdPerNode * this.getAllNodes().length; + + this.repulsionRange = this.calcRepulsionRange(); +}; + +FDLayout.prototype.calcSpringForces = function () { + var lEdges = this.getAllEdges(); + var edge; + + for (var i = 0; i < lEdges.length; i++) { + edge = lEdges[i]; + + this.calcSpringForce(edge, edge.idealLength); + } +}; + +FDLayout.prototype.calcRepulsionForces = function () { + var gridUpdateAllowed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + var forceToNodeSurroundingUpdate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + var i, j; + var nodeA, nodeB; + var lNodes = this.getAllNodes(); + var processedNodeSet; + + if (this.useFRGridVariant) { + if (this.totalIterations % FDLayoutConstants.GRID_CALCULATION_CHECK_PERIOD == 1 && gridUpdateAllowed) { + this.updateGrid(); + } + + processedNodeSet = new Set(); + + // calculate repulsion forces between each nodes and its surrounding + for (i = 0; i < lNodes.length; i++) { + nodeA = lNodes[i]; + this.calculateRepulsionForceOfANode(nodeA, processedNodeSet, gridUpdateAllowed, forceToNodeSurroundingUpdate); + processedNodeSet.add(nodeA); + } + } else { + for (i = 0; i < lNodes.length; i++) { + nodeA = lNodes[i]; + + for (j = i + 1; j < lNodes.length; j++) { + nodeB = lNodes[j]; + + // If both nodes are not members of the same graph, skip. + if (nodeA.getOwner() != nodeB.getOwner()) { + continue; + } + + this.calcRepulsionForce(nodeA, nodeB); + } + } + } +}; + +FDLayout.prototype.calcGravitationalForces = function () { + var node; + var lNodes = this.getAllNodesToApplyGravitation(); + + for (var i = 0; i < lNodes.length; i++) { + node = lNodes[i]; + this.calcGravitationalForce(node); + } +}; + +FDLayout.prototype.moveNodes = function () { + var lNodes = this.getAllNodes(); + var node; + + for (var i = 0; i < lNodes.length; i++) { + node = lNodes[i]; + node.move(); + } +}; + +FDLayout.prototype.calcSpringForce = function (edge, idealLength) { + var sourceNode = edge.getSource(); + var targetNode = edge.getTarget(); + + var length; + var springForce; + var springForceX; + var springForceY; + + // Update edge length + if (this.uniformLeafNodeSizes && sourceNode.getChild() == null && targetNode.getChild() == null) { + edge.updateLengthSimple(); + } else { + edge.updateLength(); + + if (edge.isOverlapingSourceAndTarget) { + return; + } + } + + length = edge.getLength(); + + if (length == 0) return; + + // Calculate spring forces + springForce = this.springConstant * (length - idealLength); + + // Project force onto x and y axes + springForceX = springForce * (edge.lengthX / length); + springForceY = springForce * (edge.lengthY / length); + + // Apply forces on the end nodes + sourceNode.springForceX += springForceX; + sourceNode.springForceY += springForceY; + targetNode.springForceX -= springForceX; + targetNode.springForceY -= springForceY; +}; + +FDLayout.prototype.calcRepulsionForce = function (nodeA, nodeB) { + var rectA = nodeA.getRect(); + var rectB = nodeB.getRect(); + var overlapAmount = new Array(2); + var clipPoints = new Array(4); + var distanceX; + var distanceY; + var distanceSquared; + var distance; + var repulsionForce; + var repulsionForceX; + var repulsionForceY; + + if (rectA.intersects(rectB)) // two nodes overlap + { + // calculate separation amount in x and y directions + IGeometry.calcSeparationAmount(rectA, rectB, overlapAmount, FDLayoutConstants.DEFAULT_EDGE_LENGTH / 2.0); + + repulsionForceX = 2 * overlapAmount[0]; + repulsionForceY = 2 * overlapAmount[1]; + + var childrenConstant = nodeA.noOfChildren * nodeB.noOfChildren / (nodeA.noOfChildren + nodeB.noOfChildren); + + // Apply forces on the two nodes + nodeA.repulsionForceX -= childrenConstant * repulsionForceX; + nodeA.repulsionForceY -= childrenConstant * repulsionForceY; + nodeB.repulsionForceX += childrenConstant * repulsionForceX; + nodeB.repulsionForceY += childrenConstant * repulsionForceY; + } else // no overlap + { + // calculate distance + + if (this.uniformLeafNodeSizes && nodeA.getChild() == null && nodeB.getChild() == null) // simply base repulsion on distance of node centers + { + distanceX = rectB.getCenterX() - rectA.getCenterX(); + distanceY = rectB.getCenterY() - rectA.getCenterY(); + } else // use clipping points + { + IGeometry.getIntersection(rectA, rectB, clipPoints); + + distanceX = clipPoints[2] - clipPoints[0]; + distanceY = clipPoints[3] - clipPoints[1]; + } + + // No repulsion range. FR grid variant should take care of this. + if (Math.abs(distanceX) < FDLayoutConstants.MIN_REPULSION_DIST) { + distanceX = IMath.sign(distanceX) * FDLayoutConstants.MIN_REPULSION_DIST; + } + + if (Math.abs(distanceY) < FDLayoutConstants.MIN_REPULSION_DIST) { + distanceY = IMath.sign(distanceY) * FDLayoutConstants.MIN_REPULSION_DIST; + } + + distanceSquared = distanceX * distanceX + distanceY * distanceY; + distance = Math.sqrt(distanceSquared); + + repulsionForce = this.repulsionConstant * nodeA.noOfChildren * nodeB.noOfChildren / distanceSquared; + + // Project force onto x and y axes + repulsionForceX = repulsionForce * distanceX / distance; + repulsionForceY = repulsionForce * distanceY / distance; + + // Apply forces on the two nodes + nodeA.repulsionForceX -= repulsionForceX; + nodeA.repulsionForceY -= repulsionForceY; + nodeB.repulsionForceX += repulsionForceX; + nodeB.repulsionForceY += repulsionForceY; + } +}; + +FDLayout.prototype.calcGravitationalForce = function (node) { + var ownerGraph; + var ownerCenterX; + var ownerCenterY; + var distanceX; + var distanceY; + var absDistanceX; + var absDistanceY; + var estimatedSize; + ownerGraph = node.getOwner(); + + ownerCenterX = (ownerGraph.getRight() + ownerGraph.getLeft()) / 2; + ownerCenterY = (ownerGraph.getTop() + ownerGraph.getBottom()) / 2; + distanceX = node.getCenterX() - ownerCenterX; + distanceY = node.getCenterY() - ownerCenterY; + absDistanceX = Math.abs(distanceX) + node.getWidth() / 2; + absDistanceY = Math.abs(distanceY) + node.getHeight() / 2; + + if (node.getOwner() == this.graphManager.getRoot()) // in the root graph + { + estimatedSize = ownerGraph.getEstimatedSize() * this.gravityRangeFactor; + + if (absDistanceX > estimatedSize || absDistanceY > estimatedSize) { + node.gravitationForceX = -this.gravityConstant * distanceX; + node.gravitationForceY = -this.gravityConstant * distanceY; + } + } else // inside a compound + { + estimatedSize = ownerGraph.getEstimatedSize() * this.compoundGravityRangeFactor; + + if (absDistanceX > estimatedSize || absDistanceY > estimatedSize) { + node.gravitationForceX = -this.gravityConstant * distanceX * this.compoundGravityConstant; + node.gravitationForceY = -this.gravityConstant * distanceY * this.compoundGravityConstant; + } + } +}; + +FDLayout.prototype.isConverged = function () { + var converged; + var oscilating = false; + + if (this.totalIterations > this.maxIterations / 3) { + oscilating = Math.abs(this.totalDisplacement - this.oldTotalDisplacement) < 2; + } + + converged = this.totalDisplacement < this.totalDisplacementThreshold; + + this.oldTotalDisplacement = this.totalDisplacement; + + return converged || oscilating; +}; + +FDLayout.prototype.animate = function () { + if (this.animationDuringLayout && !this.isSubLayout) { + if (this.notAnimatedIterations == this.animationPeriod) { + this.update(); + this.notAnimatedIterations = 0; + } else { + this.notAnimatedIterations++; + } + } +}; + +//This method calculates the number of children (weight) for all nodes +FDLayout.prototype.calcNoOfChildrenForAllNodes = function () { + var node; + var allNodes = this.graphManager.getAllNodes(); + + for (var i = 0; i < allNodes.length; i++) { + node = allNodes[i]; + node.noOfChildren = node.getNoOfChildren(); + } +}; + +// ----------------------------------------------------------------------------- +// Section: FR-Grid Variant Repulsion Force Calculation +// ----------------------------------------------------------------------------- + +FDLayout.prototype.calcGrid = function (graph) { + + var sizeX = 0; + var sizeY = 0; + + sizeX = parseInt(Math.ceil((graph.getRight() - graph.getLeft()) / this.repulsionRange)); + sizeY = parseInt(Math.ceil((graph.getBottom() - graph.getTop()) / this.repulsionRange)); + + var grid = new Array(sizeX); + + for (var i = 0; i < sizeX; i++) { + grid[i] = new Array(sizeY); + } + + for (var i = 0; i < sizeX; i++) { + for (var j = 0; j < sizeY; j++) { + grid[i][j] = new Array(); + } + } + + return grid; +}; + +FDLayout.prototype.addNodeToGrid = function (v, left, top) { + + var startX = 0; + var finishX = 0; + var startY = 0; + var finishY = 0; + + startX = parseInt(Math.floor((v.getRect().x - left) / this.repulsionRange)); + finishX = parseInt(Math.floor((v.getRect().width + v.getRect().x - left) / this.repulsionRange)); + startY = parseInt(Math.floor((v.getRect().y - top) / this.repulsionRange)); + finishY = parseInt(Math.floor((v.getRect().height + v.getRect().y - top) / this.repulsionRange)); + + for (var i = startX; i <= finishX; i++) { + for (var j = startY; j <= finishY; j++) { + this.grid[i][j].push(v); + v.setGridCoordinates(startX, finishX, startY, finishY); + } + } +}; + +FDLayout.prototype.updateGrid = function () { + var i; + var nodeA; + var lNodes = this.getAllNodes(); + + this.grid = this.calcGrid(this.graphManager.getRoot()); + + // put all nodes to proper grid cells + for (i = 0; i < lNodes.length; i++) { + nodeA = lNodes[i]; + this.addNodeToGrid(nodeA, this.graphManager.getRoot().getLeft(), this.graphManager.getRoot().getTop()); + } +}; + +FDLayout.prototype.calculateRepulsionForceOfANode = function (nodeA, processedNodeSet, gridUpdateAllowed, forceToNodeSurroundingUpdate) { + + if (this.totalIterations % FDLayoutConstants.GRID_CALCULATION_CHECK_PERIOD == 1 && gridUpdateAllowed || forceToNodeSurroundingUpdate) { + var surrounding = new Set(); + nodeA.surrounding = new Array(); + var nodeB; + var grid = this.grid; + + for (var i = nodeA.startX - 1; i < nodeA.finishX + 2; i++) { + for (var j = nodeA.startY - 1; j < nodeA.finishY + 2; j++) { + if (!(i < 0 || j < 0 || i >= grid.length || j >= grid[0].length)) { + for (var k = 0; k < grid[i][j].length; k++) { + nodeB = grid[i][j][k]; + + // If both nodes are not members of the same graph, + // or both nodes are the same, skip. + if (nodeA.getOwner() != nodeB.getOwner() || nodeA == nodeB) { + continue; + } + + // check if the repulsion force between + // nodeA and nodeB has already been calculated + if (!processedNodeSet.has(nodeB) && !surrounding.has(nodeB)) { + var distanceX = Math.abs(nodeA.getCenterX() - nodeB.getCenterX()) - (nodeA.getWidth() / 2 + nodeB.getWidth() / 2); + var distanceY = Math.abs(nodeA.getCenterY() - nodeB.getCenterY()) - (nodeA.getHeight() / 2 + nodeB.getHeight() / 2); + + // if the distance between nodeA and nodeB + // is less then calculation range + if (distanceX <= this.repulsionRange && distanceY <= this.repulsionRange) { + //then add nodeB to surrounding of nodeA + surrounding.add(nodeB); + } + } + } + } + } + } + + nodeA.surrounding = [].concat(_toConsumableArray(surrounding)); + } + for (i = 0; i < nodeA.surrounding.length; i++) { + this.calcRepulsionForce(nodeA, nodeA.surrounding[i]); + } +}; + +FDLayout.prototype.calcRepulsionRange = function () { + return 0.0; +}; + +module.exports = FDLayout; + +/***/ }), +/* 19 */ +/***/ (function(module, exports, __nested_webpack_require_100902__) { + +"use strict"; + + +var LEdge = __nested_webpack_require_100902__(1); +var FDLayoutConstants = __nested_webpack_require_100902__(7); + +function FDLayoutEdge(source, target, vEdge) { + LEdge.call(this, source, target, vEdge); + this.idealLength = FDLayoutConstants.DEFAULT_EDGE_LENGTH; +} + +FDLayoutEdge.prototype = Object.create(LEdge.prototype); + +for (var prop in LEdge) { + FDLayoutEdge[prop] = LEdge[prop]; +} + +module.exports = FDLayoutEdge; + +/***/ }), +/* 20 */ +/***/ (function(module, exports, __nested_webpack_require_101387__) { + +"use strict"; + + +var LNode = __nested_webpack_require_101387__(3); + +function FDLayoutNode(gm, loc, size, vNode) { + // alternative constructor is handled inside LNode + LNode.call(this, gm, loc, size, vNode); + //Spring, repulsion and gravitational forces acting on this node + this.springForceX = 0; + this.springForceY = 0; + this.repulsionForceX = 0; + this.repulsionForceY = 0; + this.gravitationForceX = 0; + this.gravitationForceY = 0; + //Amount by which this node is to be moved in this iteration + this.displacementX = 0; + this.displacementY = 0; + + //Start and finish grid coordinates that this node is fallen into + this.startX = 0; + this.finishX = 0; + this.startY = 0; + this.finishY = 0; + + //Geometric neighbors of this node + this.surrounding = []; +} + +FDLayoutNode.prototype = Object.create(LNode.prototype); + +for (var prop in LNode) { + FDLayoutNode[prop] = LNode[prop]; +} + +FDLayoutNode.prototype.setGridCoordinates = function (_startX, _finishX, _startY, _finishY) { + this.startX = _startX; + this.finishX = _finishX; + this.startY = _startY; + this.finishY = _finishY; +}; + +module.exports = FDLayoutNode; + +/***/ }), +/* 21 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function DimensionD(width, height) { + this.width = 0; + this.height = 0; + if (width !== null && height !== null) { + this.height = height; + this.width = width; + } +} + +DimensionD.prototype.getWidth = function () { + return this.width; +}; + +DimensionD.prototype.setWidth = function (width) { + this.width = width; +}; + +DimensionD.prototype.getHeight = function () { + return this.height; +}; + +DimensionD.prototype.setHeight = function (height) { + this.height = height; +}; + +module.exports = DimensionD; + +/***/ }), +/* 22 */ +/***/ (function(module, exports, __nested_webpack_require_103173__) { + +"use strict"; + + +var UniqueIDGeneretor = __nested_webpack_require_103173__(14); + +function HashMap() { + this.map = {}; + this.keys = []; +} + +HashMap.prototype.put = function (key, value) { + var theId = UniqueIDGeneretor.createID(key); + if (!this.contains(theId)) { + this.map[theId] = value; + this.keys.push(key); + } +}; + +HashMap.prototype.contains = function (key) { + var theId = UniqueIDGeneretor.createID(key); + return this.map[key] != null; +}; + +HashMap.prototype.get = function (key) { + var theId = UniqueIDGeneretor.createID(key); + return this.map[theId]; +}; + +HashMap.prototype.keySet = function () { + return this.keys; +}; + +module.exports = HashMap; + +/***/ }), +/* 23 */ +/***/ (function(module, exports, __nested_webpack_require_103901__) { + +"use strict"; + + +var UniqueIDGeneretor = __nested_webpack_require_103901__(14); + +function HashSet() { + this.set = {}; +} +; + +HashSet.prototype.add = function (obj) { + var theId = UniqueIDGeneretor.createID(obj); + if (!this.contains(theId)) this.set[theId] = obj; +}; + +HashSet.prototype.remove = function (obj) { + delete this.set[UniqueIDGeneretor.createID(obj)]; +}; + +HashSet.prototype.clear = function () { + this.set = {}; +}; + +HashSet.prototype.contains = function (obj) { + return this.set[UniqueIDGeneretor.createID(obj)] == obj; +}; + +HashSet.prototype.isEmpty = function () { + return this.size() === 0; +}; + +HashSet.prototype.size = function () { + return Object.keys(this.set).length; +}; + +//concats this.set to the given list +HashSet.prototype.addAllTo = function (list) { + var keys = Object.keys(this.set); + var length = keys.length; + for (var i = 0; i < length; i++) { + list.push(this.set[keys[i]]); + } +}; + +HashSet.prototype.size = function () { + return Object.keys(this.set).length; +}; + +HashSet.prototype.addAll = function (list) { + var s = list.length; + for (var i = 0; i < s; i++) { + var v = list[i]; + this.add(v); + } +}; + +module.exports = HashSet; + +/***/ }), +/* 24 */ +/***/ (function(module, exports, __nested_webpack_require_105138__) { + +"use strict"; + + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/** + * A classic Quicksort algorithm with Hoare's partition + * - Works also on LinkedList objects + * + * Copyright: i-Vis Research Group, Bilkent University, 2007 - present + */ + +var LinkedList = __nested_webpack_require_105138__(11); + +var Quicksort = function () { + function Quicksort(A, compareFunction) { + _classCallCheck(this, Quicksort); + + if (compareFunction !== null || compareFunction !== undefined) this.compareFunction = this._defaultCompareFunction; + + var length = void 0; + if (A instanceof LinkedList) length = A.size();else length = A.length; + + this._quicksort(A, 0, length - 1); + } + + _createClass(Quicksort, [{ + key: '_quicksort', + value: function _quicksort(A, p, r) { + if (p < r) { + var q = this._partition(A, p, r); + this._quicksort(A, p, q); + this._quicksort(A, q + 1, r); + } + } + }, { + key: '_partition', + value: function _partition(A, p, r) { + var x = this._get(A, p); + var i = p; + var j = r; + while (true) { + while (this.compareFunction(x, this._get(A, j))) { + j--; + }while (this.compareFunction(this._get(A, i), x)) { + i++; + }if (i < j) { + this._swap(A, i, j); + i++; + j--; + } else return j; + } + } + }, { + key: '_get', + value: function _get(object, index) { + if (object instanceof LinkedList) return object.get_object_at(index);else return object[index]; + } + }, { + key: '_set', + value: function _set(object, index, value) { + if (object instanceof LinkedList) object.set_object_at(index, value);else object[index] = value; + } + }, { + key: '_swap', + value: function _swap(A, i, j) { + var temp = this._get(A, i); + this._set(A, i, this._get(A, j)); + this._set(A, j, temp); + } + }, { + key: '_defaultCompareFunction', + value: function _defaultCompareFunction(a, b) { + return b > a; + } + }]); + + return Quicksort; +}(); + +module.exports = Quicksort; + +/***/ }), +/* 25 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/** + * Needleman-Wunsch algorithm is an procedure to compute the optimal global alignment of two string + * sequences by S.B.Needleman and C.D.Wunsch (1970). + * + * Aside from the inputs, you can assign the scores for, + * - Match: The two characters at the current index are same. + * - Mismatch: The two characters at the current index are different. + * - Insertion/Deletion(gaps): The best alignment involves one letter aligning to a gap in the other string. + */ + +var NeedlemanWunsch = function () { + function NeedlemanWunsch(sequence1, sequence2) { + var match_score = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1; + var mismatch_penalty = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : -1; + var gap_penalty = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : -1; + + _classCallCheck(this, NeedlemanWunsch); + + this.sequence1 = sequence1; + this.sequence2 = sequence2; + this.match_score = match_score; + this.mismatch_penalty = mismatch_penalty; + this.gap_penalty = gap_penalty; + + // Just the remove redundancy + this.iMax = sequence1.length + 1; + this.jMax = sequence2.length + 1; + + // Grid matrix of scores + this.grid = new Array(this.iMax); + for (var i = 0; i < this.iMax; i++) { + this.grid[i] = new Array(this.jMax); + + for (var j = 0; j < this.jMax; j++) { + this.grid[i][j] = 0; + } + } + + // Traceback matrix (2D array, each cell is an array of boolean values for [`Diag`, `Up`, `Left`] positions) + this.tracebackGrid = new Array(this.iMax); + for (var _i = 0; _i < this.iMax; _i++) { + this.tracebackGrid[_i] = new Array(this.jMax); + + for (var _j = 0; _j < this.jMax; _j++) { + this.tracebackGrid[_i][_j] = [null, null, null]; + } + } + + // The aligned sequences (return multiple possibilities) + this.alignments = []; + + // Final alignment score + this.score = -1; + + // Calculate scores and tracebacks + this.computeGrids(); + } + + _createClass(NeedlemanWunsch, [{ + key: "getScore", + value: function getScore() { + return this.score; + } + }, { + key: "getAlignments", + value: function getAlignments() { + return this.alignments; + } + + // Main dynamic programming procedure + + }, { + key: "computeGrids", + value: function computeGrids() { + // Fill in the first row + for (var j = 1; j < this.jMax; j++) { + this.grid[0][j] = this.grid[0][j - 1] + this.gap_penalty; + this.tracebackGrid[0][j] = [false, false, true]; + } + + // Fill in the first column + for (var i = 1; i < this.iMax; i++) { + this.grid[i][0] = this.grid[i - 1][0] + this.gap_penalty; + this.tracebackGrid[i][0] = [false, true, false]; + } + + // Fill the rest of the grid + for (var _i2 = 1; _i2 < this.iMax; _i2++) { + for (var _j2 = 1; _j2 < this.jMax; _j2++) { + // Find the max score(s) among [`Diag`, `Up`, `Left`] + var diag = void 0; + if (this.sequence1[_i2 - 1] === this.sequence2[_j2 - 1]) diag = this.grid[_i2 - 1][_j2 - 1] + this.match_score;else diag = this.grid[_i2 - 1][_j2 - 1] + this.mismatch_penalty; + + var up = this.grid[_i2 - 1][_j2] + this.gap_penalty; + var left = this.grid[_i2][_j2 - 1] + this.gap_penalty; + + // If there exists multiple max values, capture them for multiple paths + var maxOf = [diag, up, left]; + var indices = this.arrayAllMaxIndexes(maxOf); + + // Update Grids + this.grid[_i2][_j2] = maxOf[indices[0]]; + this.tracebackGrid[_i2][_j2] = [indices.includes(0), indices.includes(1), indices.includes(2)]; + } + } + + // Update alignment score + this.score = this.grid[this.iMax - 1][this.jMax - 1]; + } + + // Gets all possible valid sequence combinations + + }, { + key: "alignmentTraceback", + value: function alignmentTraceback() { + var inProcessAlignments = []; + + inProcessAlignments.push({ pos: [this.sequence1.length, this.sequence2.length], + seq1: "", + seq2: "" + }); + + while (inProcessAlignments[0]) { + var current = inProcessAlignments[0]; + var directions = this.tracebackGrid[current.pos[0]][current.pos[1]]; + + if (directions[0]) { + inProcessAlignments.push({ pos: [current.pos[0] - 1, current.pos[1] - 1], + seq1: this.sequence1[current.pos[0] - 1] + current.seq1, + seq2: this.sequence2[current.pos[1] - 1] + current.seq2 + }); + } + if (directions[1]) { + inProcessAlignments.push({ pos: [current.pos[0] - 1, current.pos[1]], + seq1: this.sequence1[current.pos[0] - 1] + current.seq1, + seq2: '-' + current.seq2 + }); + } + if (directions[2]) { + inProcessAlignments.push({ pos: [current.pos[0], current.pos[1] - 1], + seq1: '-' + current.seq1, + seq2: this.sequence2[current.pos[1] - 1] + current.seq2 + }); + } + + if (current.pos[0] === 0 && current.pos[1] === 0) this.alignments.push({ sequence1: current.seq1, + sequence2: current.seq2 + }); + + inProcessAlignments.shift(); + } + + return this.alignments; + } + + // Helper Functions + + }, { + key: "getAllIndexes", + value: function getAllIndexes(arr, val) { + var indexes = [], + i = -1; + while ((i = arr.indexOf(val, i + 1)) !== -1) { + indexes.push(i); + } + return indexes; + } + }, { + key: "arrayAllMaxIndexes", + value: function arrayAllMaxIndexes(array) { + return this.getAllIndexes(array, Math.max.apply(null, array)); + } + }]); + + return NeedlemanWunsch; +}(); + +module.exports = NeedlemanWunsch; + +/***/ }), +/* 26 */ +/***/ (function(module, exports, __nested_webpack_require_115611__) { + +"use strict"; + + +var layoutBase = function layoutBase() { + return; +}; + +layoutBase.FDLayout = __nested_webpack_require_115611__(18); +layoutBase.FDLayoutConstants = __nested_webpack_require_115611__(7); +layoutBase.FDLayoutEdge = __nested_webpack_require_115611__(19); +layoutBase.FDLayoutNode = __nested_webpack_require_115611__(20); +layoutBase.DimensionD = __nested_webpack_require_115611__(21); +layoutBase.HashMap = __nested_webpack_require_115611__(22); +layoutBase.HashSet = __nested_webpack_require_115611__(23); +layoutBase.IGeometry = __nested_webpack_require_115611__(8); +layoutBase.IMath = __nested_webpack_require_115611__(9); +layoutBase.Integer = __nested_webpack_require_115611__(10); +layoutBase.Point = __nested_webpack_require_115611__(12); +layoutBase.PointD = __nested_webpack_require_115611__(4); +layoutBase.RandomSeed = __nested_webpack_require_115611__(16); +layoutBase.RectangleD = __nested_webpack_require_115611__(13); +layoutBase.Transform = __nested_webpack_require_115611__(17); +layoutBase.UniqueIDGeneretor = __nested_webpack_require_115611__(14); +layoutBase.Quicksort = __nested_webpack_require_115611__(24); +layoutBase.LinkedList = __nested_webpack_require_115611__(11); +layoutBase.LGraphObject = __nested_webpack_require_115611__(2); +layoutBase.LGraph = __nested_webpack_require_115611__(5); +layoutBase.LEdge = __nested_webpack_require_115611__(1); +layoutBase.LGraphManager = __nested_webpack_require_115611__(6); +layoutBase.LNode = __nested_webpack_require_115611__(3); +layoutBase.Layout = __nested_webpack_require_115611__(15); +layoutBase.LayoutConstants = __nested_webpack_require_115611__(0); +layoutBase.NeedlemanWunsch = __nested_webpack_require_115611__(25); + +module.exports = layoutBase; + +/***/ }), +/* 27 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function Emitter() { + this.listeners = []; +} + +var p = Emitter.prototype; + +p.addListener = function (event, callback) { + this.listeners.push({ + event: event, + callback: callback + }); +}; + +p.removeListener = function (event, callback) { + for (var i = this.listeners.length; i >= 0; i--) { + var l = this.listeners[i]; + + if (l.event === event && l.callback === callback) { + this.listeners.splice(i, 1); + } + } +}; + +p.emit = function (event, data) { + for (var i = 0; i < this.listeners.length; i++) { + var l = this.listeners[i]; + + if (event === l.event) { + l.callback(data); + } + } +}; + +module.exports = Emitter; + +/***/ }) +/******/ ]); +}); + +/***/ }), + +/***/ 47724: +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ diagram: () => (/* binding */ diagram) +/* harmony export */ }); +/* harmony import */ var _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(87115); +/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(59373); +/* harmony import */ var cytoscape_dist_cytoscape_umd_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(71377); +/* harmony import */ var cytoscape_dist_cytoscape_umd_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(cytoscape_dist_cytoscape_umd_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var cytoscape_cose_bilkent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(14607); +/* harmony import */ var cytoscape_cose_bilkent__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(cytoscape_cose_bilkent__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var khroma__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(91619); +/* harmony import */ var khroma__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(12281); +/* harmony import */ var khroma__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(7201); +/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(27484); +/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(dayjs__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _braintree_sanitize_url__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(17967); +/* harmony import */ var dompurify__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(20683); +/* harmony import */ var dagre_d3_es_src_dagre_index_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(70277); +/* harmony import */ var dagre_d3_es_src_graphlib_index_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(45625); +/* harmony import */ var dagre_d3_es_src_graphlib_json_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(39354); +/* harmony import */ var dagre_d3_es__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(91518); +/* harmony import */ var dayjs_plugin_isoWeek_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(59542); +/* harmony import */ var dayjs_plugin_isoWeek_js__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(dayjs_plugin_isoWeek_js__WEBPACK_IMPORTED_MODULE_10__); +/* harmony import */ var dayjs_plugin_customParseFormat_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(10285); +/* harmony import */ var dayjs_plugin_customParseFormat_js__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(dayjs_plugin_customParseFormat_js__WEBPACK_IMPORTED_MODULE_11__); +/* harmony import */ var dayjs_plugin_advancedFormat_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(28734); +/* harmony import */ var dayjs_plugin_advancedFormat_js__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(dayjs_plugin_advancedFormat_js__WEBPACK_IMPORTED_MODULE_12__); + + + + + + + + + + + + + + + + + + + + + + + + +var parser = function() { + var o = function(k, v, o2, l) { + for (o2 = o2 || {}, l = k.length; l--; o2[k[l]] = v) + ; + return o2; + }, $V0 = [1, 4], $V1 = [1, 13], $V2 = [1, 12], $V3 = [1, 15], $V4 = [1, 16], $V5 = [1, 20], $V6 = [1, 19], $V7 = [6, 7, 8], $V8 = [1, 26], $V9 = [1, 24], $Va = [1, 25], $Vb = [6, 7, 11], $Vc = [1, 6, 13, 15, 16, 19, 22], $Vd = [1, 33], $Ve = [1, 34], $Vf = [1, 6, 7, 11, 13, 15, 16, 19, 22]; + var parser2 = { + trace: function trace() { + }, + yy: {}, + symbols_: { "error": 2, "start": 3, "mindMap": 4, "spaceLines": 5, "SPACELINE": 6, "NL": 7, "MINDMAP": 8, "document": 9, "stop": 10, "EOF": 11, "statement": 12, "SPACELIST": 13, "node": 14, "ICON": 15, "CLASS": 16, "nodeWithId": 17, "nodeWithoutId": 18, "NODE_DSTART": 19, "NODE_DESCR": 20, "NODE_DEND": 21, "NODE_ID": 22, "$accept": 0, "$end": 1 }, + terminals_: { 2: "error", 6: "SPACELINE", 7: "NL", 8: "MINDMAP", 11: "EOF", 13: "SPACELIST", 15: "ICON", 16: "CLASS", 19: "NODE_DSTART", 20: "NODE_DESCR", 21: "NODE_DEND", 22: "NODE_ID" }, + productions_: [0, [3, 1], [3, 2], [5, 1], [5, 2], [5, 2], [4, 2], [4, 3], [10, 1], [10, 1], [10, 1], [10, 2], [10, 2], [9, 3], [9, 2], [12, 2], [12, 2], [12, 2], [12, 1], [12, 1], [12, 1], [12, 1], [12, 1], [14, 1], [14, 1], [18, 3], [17, 1], [17, 4]], + performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) { + var $0 = $$.length - 1; + switch (yystate) { + case 6: + case 7: + return yy; + case 8: + yy.getLogger().trace("Stop NL "); + break; + case 9: + yy.getLogger().trace("Stop EOF "); + break; + case 11: + yy.getLogger().trace("Stop NL2 "); + break; + case 12: + yy.getLogger().trace("Stop EOF2 "); + break; + case 15: + yy.getLogger().info("Node: ", $$[$0].id); + yy.addNode($$[$0 - 1].length, $$[$0].id, $$[$0].descr, $$[$0].type); + break; + case 16: + yy.getLogger().trace("Icon: ", $$[$0]); + yy.decorateNode({ icon: $$[$0] }); + break; + case 17: + case 21: + yy.decorateNode({ class: $$[$0] }); + break; + case 18: + yy.getLogger().trace("SPACELIST"); + break; + case 19: + yy.getLogger().trace("Node: ", $$[$0].id); + yy.addNode(0, $$[$0].id, $$[$0].descr, $$[$0].type); + break; + case 20: + yy.decorateNode({ icon: $$[$0] }); + break; + case 25: + yy.getLogger().trace("node found ..", $$[$0 - 2]); + this.$ = { id: $$[$0 - 1], descr: $$[$0 - 1], type: yy.getType($$[$0 - 2], $$[$0]) }; + break; + case 26: + this.$ = { id: $$[$0], descr: $$[$0], type: yy.nodeType.DEFAULT }; + break; + case 27: + yy.getLogger().trace("node found ..", $$[$0 - 3]); + this.$ = { id: $$[$0 - 3], descr: $$[$0 - 1], type: yy.getType($$[$0 - 2], $$[$0]) }; + break; + } + }, + table: [{ 3: 1, 4: 2, 5: 3, 6: [1, 5], 8: $V0 }, { 1: [3] }, { 1: [2, 1] }, { 4: 6, 6: [1, 7], 7: [1, 8], 8: $V0 }, { 6: $V1, 7: [1, 10], 9: 9, 12: 11, 13: $V2, 14: 14, 15: $V3, 16: $V4, 17: 17, 18: 18, 19: $V5, 22: $V6 }, o($V7, [2, 3]), { 1: [2, 2] }, o($V7, [2, 4]), o($V7, [2, 5]), { 1: [2, 6], 6: $V1, 12: 21, 13: $V2, 14: 14, 15: $V3, 16: $V4, 17: 17, 18: 18, 19: $V5, 22: $V6 }, { 6: $V1, 9: 22, 12: 11, 13: $V2, 14: 14, 15: $V3, 16: $V4, 17: 17, 18: 18, 19: $V5, 22: $V6 }, { 6: $V8, 7: $V9, 10: 23, 11: $Va }, o($Vb, [2, 22], { 17: 17, 18: 18, 14: 27, 15: [1, 28], 16: [1, 29], 19: $V5, 22: $V6 }), o($Vb, [2, 18]), o($Vb, [2, 19]), o($Vb, [2, 20]), o($Vb, [2, 21]), o($Vb, [2, 23]), o($Vb, [2, 24]), o($Vb, [2, 26], { 19: [1, 30] }), { 20: [1, 31] }, { 6: $V8, 7: $V9, 10: 32, 11: $Va }, { 1: [2, 7], 6: $V1, 12: 21, 13: $V2, 14: 14, 15: $V3, 16: $V4, 17: 17, 18: 18, 19: $V5, 22: $V6 }, o($Vc, [2, 14], { 7: $Vd, 11: $Ve }), o($Vf, [2, 8]), o($Vf, [2, 9]), o($Vf, [2, 10]), o($Vb, [2, 15]), o($Vb, [2, 16]), o($Vb, [2, 17]), { 20: [1, 35] }, { 21: [1, 36] }, o($Vc, [2, 13], { 7: $Vd, 11: $Ve }), o($Vf, [2, 11]), o($Vf, [2, 12]), { 21: [1, 37] }, o($Vb, [2, 25]), o($Vb, [2, 27])], + defaultActions: { 2: [2, 1], 6: [2, 2] }, + parseError: function parseError2(str, hash) { + if (hash.recoverable) { + this.trace(str); + } else { + var error = new Error(str); + error.hash = hash; + throw error; + } + }, + parse: function parse(input) { + var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, TERROR = 2, EOF = 1; + var args = lstack.slice.call(arguments, 1); + var lexer2 = Object.create(this.lexer); + var sharedState = { yy: {} }; + for (var k in this.yy) { + if (Object.prototype.hasOwnProperty.call(this.yy, k)) { + sharedState.yy[k] = this.yy[k]; + } + } + lexer2.setInput(input, sharedState.yy); + sharedState.yy.lexer = lexer2; + sharedState.yy.parser = this; + if (typeof lexer2.yylloc == "undefined") { + lexer2.yylloc = {}; + } + var yyloc = lexer2.yylloc; + lstack.push(yyloc); + var ranges = lexer2.options && lexer2.options.ranges; + if (typeof sharedState.yy.parseError === "function") { + this.parseError = sharedState.yy.parseError; + } else { + this.parseError = Object.getPrototypeOf(this).parseError; + } + function lex() { + var token; + token = tstack.pop() || lexer2.lex() || EOF; + if (typeof token !== "number") { + if (token instanceof Array) { + tstack = token; + token = tstack.pop(); + } + token = self.symbols_[token] || token; + } + return token; + } + var symbol, state, action, r, yyval = {}, p, len, newState, expected; + while (true) { + state = stack[stack.length - 1]; + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol === null || typeof symbol == "undefined") { + symbol = lex(); + } + action = table[state] && table[state][symbol]; + } + if (typeof action === "undefined" || !action.length || !action[0]) { + var errStr = ""; + expected = []; + for (p in table[state]) { + if (this.terminals_[p] && p > TERROR) { + expected.push("'" + this.terminals_[p] + "'"); + } + } + if (lexer2.showPosition) { + errStr = "Parse error on line " + (yylineno + 1) + ":\n" + lexer2.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; + } else { + errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == EOF ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'"); + } + this.parseError(errStr, { + text: lexer2.match, + token: this.terminals_[symbol] || symbol, + line: lexer2.yylineno, + loc: yyloc, + expected + }); + } + if (action[0] instanceof Array && action.length > 1) { + throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); + } + switch (action[0]) { + case 1: + stack.push(symbol); + vstack.push(lexer2.yytext); + lstack.push(lexer2.yylloc); + stack.push(action[1]); + symbol = null; + { + yyleng = lexer2.yyleng; + yytext = lexer2.yytext; + yylineno = lexer2.yylineno; + yyloc = lexer2.yylloc; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = { + first_line: lstack[lstack.length - (len || 1)].first_line, + last_line: lstack[lstack.length - 1].last_line, + first_column: lstack[lstack.length - (len || 1)].first_column, + last_column: lstack[lstack.length - 1].last_column + }; + if (ranges) { + yyval._$.range = [ + lstack[lstack.length - (len || 1)].range[0], + lstack[lstack.length - 1].range[1] + ]; + } + r = this.performAction.apply(yyval, [ + yytext, + yyleng, + yylineno, + sharedState.yy, + action[1], + vstack, + lstack + ].concat(args)); + if (typeof r !== "undefined") { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; + } + } + return true; + } + }; + var lexer = function() { + var lexer2 = { + EOF: 1, + parseError: function parseError2(str, hash) { + if (this.yy.parser) { + this.yy.parser.parseError(str, hash); + } else { + throw new Error(str); + } + }, + // resets the lexer, sets new input + setInput: function(input, yy) { + this.yy = yy || this.yy || {}; + this._input = input; + this._more = this._backtrack = this.done = false; + this.yylineno = this.yyleng = 0; + this.yytext = this.matched = this.match = ""; + this.conditionStack = ["INITIAL"]; + this.yylloc = { + first_line: 1, + first_column: 0, + last_line: 1, + last_column: 0 + }; + if (this.options.ranges) { + this.yylloc.range = [0, 0]; + } + this.offset = 0; + return this; + }, + // consumes and returns one char from the input + input: function() { + var ch = this._input[0]; + this.yytext += ch; + this.yyleng++; + this.offset++; + this.match += ch; + this.matched += ch; + var lines = ch.match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno++; + this.yylloc.last_line++; + } else { + this.yylloc.last_column++; + } + if (this.options.ranges) { + this.yylloc.range[1]++; + } + this._input = this._input.slice(1); + return ch; + }, + // unshifts one char (or a string) into the input + unput: function(ch) { + var len = ch.length; + var lines = ch.split(/(?:\r\n?|\n)/g); + this._input = ch + this._input; + this.yytext = this.yytext.substr(0, this.yytext.length - len); + this.offset -= len; + var oldLines = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length - 1); + this.matched = this.matched.substr(0, this.matched.length - 1); + if (lines.length - 1) { + this.yylineno -= lines.length - 1; + } + var r = this.yylloc.range; + this.yylloc = { + first_line: this.yylloc.first_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.first_column, + last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len + }; + if (this.options.ranges) { + this.yylloc.range = [r[0], r[0] + this.yyleng - len]; + } + this.yyleng = this.yytext.length; + return this; + }, + // When called from action, caches matched text and appends it on next action + more: function() { + this._more = true; + return this; + }, + // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. + reject: function() { + if (this.options.backtrack_lexer) { + this._backtrack = true; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + return this; + }, + // retain first n characters of the match + less: function(n) { + this.unput(this.match.slice(n)); + }, + // displays already matched input, i.e. for error messages + pastInput: function() { + var past = this.matched.substr(0, this.matched.length - this.match.length); + return (past.length > 20 ? "..." : "") + past.substr(-20).replace(/\n/g, ""); + }, + // displays upcoming input, i.e. for error messages + upcomingInput: function() { + var next = this.match; + if (next.length < 20) { + next += this._input.substr(0, 20 - next.length); + } + return (next.substr(0, 20) + (next.length > 20 ? "..." : "")).replace(/\n/g, ""); + }, + // displays the character position where the lexing error occurred, i.e. for error messages + showPosition: function() { + var pre = this.pastInput(); + var c = new Array(pre.length + 1).join("-"); + return pre + this.upcomingInput() + "\n" + c + "^"; + }, + // test the lexed token: return FALSE when not a match, otherwise return token + test_match: function(match, indexed_rule) { + var token, lines, backup; + if (this.options.backtrack_lexer) { + backup = { + yylineno: this.yylineno, + yylloc: { + first_line: this.yylloc.first_line, + last_line: this.last_line, + first_column: this.yylloc.first_column, + last_column: this.yylloc.last_column + }, + yytext: this.yytext, + match: this.match, + matches: this.matches, + matched: this.matched, + yyleng: this.yyleng, + offset: this.offset, + _more: this._more, + _input: this._input, + yy: this.yy, + conditionStack: this.conditionStack.slice(0), + done: this.done + }; + if (this.options.ranges) { + backup.yylloc.range = this.yylloc.range.slice(0); + } + } + lines = match[0].match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno += lines.length; + } + this.yylloc = { + first_line: this.yylloc.last_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.last_column, + last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length + }; + this.yytext += match[0]; + this.match += match[0]; + this.matches = match; + this.yyleng = this.yytext.length; + if (this.options.ranges) { + this.yylloc.range = [this.offset, this.offset += this.yyleng]; + } + this._more = false; + this._backtrack = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); + if (this.done && this._input) { + this.done = false; + } + if (token) { + return token; + } else if (this._backtrack) { + for (var k in backup) { + this[k] = backup[k]; + } + return false; + } + return false; + }, + // return next match in input + next: function() { + if (this.done) { + return this.EOF; + } + if (!this._input) { + this.done = true; + } + var token, match, tempMatch, index; + if (!this._more) { + this.yytext = ""; + this.match = ""; + } + var rules = this._currentRules(); + for (var i = 0; i < rules.length; i++) { + tempMatch = this._input.match(this.rules[rules[i]]); + if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { + match = tempMatch; + index = i; + if (this.options.backtrack_lexer) { + token = this.test_match(tempMatch, rules[i]); + if (token !== false) { + return token; + } else if (this._backtrack) { + match = false; + continue; + } else { + return false; + } + } else if (!this.options.flex) { + break; + } + } + } + if (match) { + token = this.test_match(match, rules[index]); + if (token !== false) { + return token; + } + return false; + } + if (this._input === "") { + return this.EOF; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". Unrecognized text.\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + }, + // return next match that has a token + lex: function lex() { + var r = this.next(); + if (r) { + return r; + } else { + return this.lex(); + } + }, + // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) + begin: function begin(condition) { + this.conditionStack.push(condition); + }, + // pop the previously active lexer condition state off the condition stack + popState: function popState() { + var n = this.conditionStack.length - 1; + if (n > 0) { + return this.conditionStack.pop(); + } else { + return this.conditionStack[0]; + } + }, + // produce the lexer rule set which is active for the currently active lexer condition state + _currentRules: function _currentRules() { + if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { + return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; + } else { + return this.conditions["INITIAL"].rules; + } + }, + // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available + topState: function topState(n) { + n = this.conditionStack.length - 1 - Math.abs(n || 0); + if (n >= 0) { + return this.conditionStack[n]; + } else { + return "INITIAL"; + } + }, + // alias for begin(condition) + pushState: function pushState(condition) { + this.begin(condition); + }, + // return the number of states currently on the stack + stateStackSize: function stateStackSize() { + return this.conditionStack.length; + }, + options: { "case-insensitive": true }, + performAction: function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) { + switch ($avoiding_name_collisions) { + case 0: + yy.getLogger().trace("Found comment", yy_.yytext); + break; + case 1: + return 8; + case 2: + this.begin("CLASS"); + break; + case 3: + this.popState(); + return 16; + case 4: + this.popState(); + break; + case 5: + yy.getLogger().trace("Begin icon"); + this.begin("ICON"); + break; + case 6: + yy.getLogger().trace("SPACELINE"); + return 6; + case 7: + return 7; + case 8: + return 15; + case 9: + yy.getLogger().trace("end icon"); + this.popState(); + break; + case 10: + yy.getLogger().trace("Exploding node"); + this.begin("NODE"); + return 19; + case 11: + yy.getLogger().trace("Cloud"); + this.begin("NODE"); + return 19; + case 12: + yy.getLogger().trace("Explosion Bang"); + this.begin("NODE"); + return 19; + case 13: + yy.getLogger().trace("Cloud Bang"); + this.begin("NODE"); + return 19; + case 14: + this.begin("NODE"); + return 19; + case 15: + this.begin("NODE"); + return 19; + case 16: + this.begin("NODE"); + return 19; + case 17: + this.begin("NODE"); + return 19; + case 18: + return 13; + case 19: + return 22; + case 20: + return 11; + case 21: + yy.getLogger().trace("Starting NSTR"); + this.begin("NSTR"); + break; + case 22: + yy.getLogger().trace("description:", yy_.yytext); + return "NODE_DESCR"; + case 23: + this.popState(); + break; + case 24: + this.popState(); + yy.getLogger().trace("node end ))"); + return "NODE_DEND"; + case 25: + this.popState(); + yy.getLogger().trace("node end )"); + return "NODE_DEND"; + case 26: + this.popState(); + yy.getLogger().trace("node end ...", yy_.yytext); + return "NODE_DEND"; + case 27: + this.popState(); + yy.getLogger().trace("node end (("); + return "NODE_DEND"; + case 28: + this.popState(); + yy.getLogger().trace("node end (-"); + return "NODE_DEND"; + case 29: + this.popState(); + yy.getLogger().trace("node end (-"); + return "NODE_DEND"; + case 30: + this.popState(); + yy.getLogger().trace("node end (("); + return "NODE_DEND"; + case 31: + this.popState(); + yy.getLogger().trace("node end (("); + return "NODE_DEND"; + case 32: + yy.getLogger().trace("Long description:", yy_.yytext); + return 20; + case 33: + yy.getLogger().trace("Long description:", yy_.yytext); + return 20; + } + }, + rules: [/^(?:\s*%%.*)/i, /^(?:mindmap\b)/i, /^(?::::)/i, /^(?:.+)/i, /^(?:\n)/i, /^(?:::icon\()/i, /^(?:[\s]+[\n])/i, /^(?:[\n]+)/i, /^(?:[^\)]+)/i, /^(?:\))/i, /^(?:-\))/i, /^(?:\(-)/i, /^(?:\)\))/i, /^(?:\))/i, /^(?:\(\()/i, /^(?:\{\{)/i, /^(?:\()/i, /^(?:\[)/i, /^(?:[\s]+)/i, /^(?:[^\(\[\n\-\)\{\}]+)/i, /^(?:$)/i, /^(?:["])/i, /^(?:[^"]+)/i, /^(?:["])/i, /^(?:[\)]\))/i, /^(?:[\)])/i, /^(?:[\]])/i, /^(?:\}\})/i, /^(?:\(-)/i, /^(?:-\))/i, /^(?:\(\()/i, /^(?:\()/i, /^(?:[^\)\]\(\}]+)/i, /^(?:.+(?!\(\())/i], + conditions: { "CLASS": { "rules": [3, 4], "inclusive": false }, "ICON": { "rules": [8, 9], "inclusive": false }, "NSTR": { "rules": [22, 23], "inclusive": false }, "NODE": { "rules": [21, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33], "inclusive": false }, "INITIAL": { "rules": [0, 1, 2, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], "inclusive": true } } + }; + return lexer2; + }(); + parser2.lexer = lexer; + function Parser() { + this.yy = {}; + } + Parser.prototype = parser2; + parser2.Parser = Parser; + return new Parser(); +}(); +parser.parser = parser; +const mindmapParser = parser; +const sanitizeText = (text) => (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_13__.n)(text, (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_13__.g)()); +let nodes = []; +let cnt = 0; +let elements = {}; +const clear = () => { + nodes = []; + cnt = 0; + elements = {}; +}; +const getParent = function(level) { + for (let i = nodes.length - 1; i >= 0; i--) { + if (nodes[i].level < level) { + return nodes[i]; + } + } + return null; +}; +const getMindmap = () => { + return nodes.length > 0 ? nodes[0] : null; +}; +const addNode = (level, id, descr, type) => { + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_13__.l.info("addNode", level, id, descr, type); + const conf = (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_13__.g)(); + const node = { + id: cnt++, + nodeId: sanitizeText(id), + level, + descr: sanitizeText(descr), + type, + children: [], + width: (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_13__.g)().mindmap.maxNodeWidth + }; + switch (node.type) { + case nodeType.ROUNDED_RECT: + node.padding = 2 * conf.mindmap.padding; + break; + case nodeType.RECT: + node.padding = 2 * conf.mindmap.padding; + break; + case nodeType.HEXAGON: + node.padding = 2 * conf.mindmap.padding; + break; + default: + node.padding = conf.mindmap.padding; + } + const parent = getParent(level); + if (parent) { + parent.children.push(node); + nodes.push(node); + } else { + if (nodes.length === 0) { + nodes.push(node); + } else { + let error = new Error( + 'There can be only one root. No parent could be found for ("' + node.descr + '")' + ); + error.hash = { + text: "branch " + name, + token: "branch " + name, + line: "1", + loc: { first_line: 1, last_line: 1, first_column: 1, last_column: 1 }, + expected: ['"checkout ' + name + '"'] + }; + throw error; + } + } +}; +const nodeType = { + DEFAULT: 0, + NO_BORDER: 0, + ROUNDED_RECT: 1, + RECT: 2, + CIRCLE: 3, + CLOUD: 4, + BANG: 5, + HEXAGON: 6 +}; +const getType = (startStr, endStr) => { + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_13__.l.debug("In get type", startStr, endStr); + switch (startStr) { + case "[": + return nodeType.RECT; + case "(": + return endStr === ")" ? nodeType.ROUNDED_RECT : nodeType.CLOUD; + case "((": + return nodeType.CIRCLE; + case ")": + return nodeType.CLOUD; + case "))": + return nodeType.BANG; + case "{{": + return nodeType.HEXAGON; + default: + return nodeType.DEFAULT; + } +}; +const setElementForId = (id, element) => { + elements[id] = element; +}; +const decorateNode = (decoration) => { + const node = nodes[nodes.length - 1]; + if (decoration && decoration.icon) { + node.icon = sanitizeText(decoration.icon); + } + if (decoration && decoration.class) { + node.class = sanitizeText(decoration.class); + } +}; +const type2Str = (type) => { + switch (type) { + case nodeType.DEFAULT: + return "no-border"; + case nodeType.RECT: + return "rect"; + case nodeType.ROUNDED_RECT: + return "rounded-rect"; + case nodeType.CIRCLE: + return "circle"; + case nodeType.CLOUD: + return "cloud"; + case nodeType.BANG: + return "bang"; + case nodeType.HEXAGON: + return "hexgon"; + default: + return "no-border"; + } +}; +let parseError; +const setErrorHandler = (handler) => { + parseError = handler; +}; +const getLogger = () => _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_13__.l; +const getNodeById = (id) => nodes[id]; +const getElementById = (id) => elements[id]; +const mindmapDb = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ + __proto__: null, + addNode, + clear, + decorateNode, + getElementById, + getLogger, + getMindmap, + getNodeById, + getType, + nodeType, + get parseError() { + return parseError; + }, + sanitizeText, + setElementForId, + setErrorHandler, + type2Str +}, Symbol.toStringTag, { value: "Module" })); +const MAX_SECTIONS = 12; +function wrap(text, width) { + text.each(function() { + var text2 = (0,d3__WEBPACK_IMPORTED_MODULE_0__/* .select */ .Ys)(this), words = text2.text().split(/(\s+|
)/).reverse(), word, line = [], lineHeight = 1.1, y = text2.attr("y"), dy = parseFloat(text2.attr("dy")), tspan = text2.text(null).append("tspan").attr("x", 0).attr("y", y).attr("dy", dy + "em"); + for (let j = 0; j < words.length; j++) { + word = words[words.length - 1 - j]; + line.push(word); + tspan.text(line.join(" ").trim()); + if (tspan.node().getComputedTextLength() > width || word === "
") { + line.pop(); + tspan.text(line.join(" ").trim()); + if (word === "
") { + line = [""]; + } else { + line = [word]; + } + tspan = text2.append("tspan").attr("x", 0).attr("y", y).attr("dy", lineHeight + "em").text(word); + } + } + }); +} +const defaultBkg = function(elem, node, section) { + const rd = 5; + elem.append("path").attr("id", "node-" + node.id).attr("class", "node-bkg node-" + type2Str(node.type)).attr( + "d", + `M0 ${node.height - rd} v${-node.height + 2 * rd} q0,-5 5,-5 h${node.width - 2 * rd} q5,0 5,5 v${node.height - rd} H0 Z` + ); + elem.append("line").attr("class", "node-line-" + section).attr("x1", 0).attr("y1", node.height).attr("x2", node.width).attr("y2", node.height); +}; +const rectBkg = function(elem, node) { + elem.append("rect").attr("id", "node-" + node.id).attr("class", "node-bkg node-" + type2Str(node.type)).attr("height", node.height).attr("width", node.width); +}; +const cloudBkg = function(elem, node) { + const w = node.width; + const h = node.height; + const r1 = 0.15 * w; + const r2 = 0.25 * w; + const r3 = 0.35 * w; + const r4 = 0.2 * w; + elem.append("path").attr("id", "node-" + node.id).attr("class", "node-bkg node-" + type2Str(node.type)).attr( + "d", + `M0 0 a${r1},${r1} 0 0,1 ${w * 0.25},${-1 * w * 0.1} + a${r3},${r3} 1 0,1 ${w * 0.4},${-1 * w * 0.1} + a${r2},${r2} 1 0,1 ${w * 0.35},${1 * w * 0.2} + + a${r1},${r1} 1 0,1 ${w * 0.15},${1 * h * 0.35} + a${r4},${r4} 1 0,1 ${-1 * w * 0.15},${1 * h * 0.65} + + a${r2},${r1} 1 0,1 ${-1 * w * 0.25},${w * 0.15} + a${r3},${r3} 1 0,1 ${-1 * w * 0.5},${0} + a${r1},${r1} 1 0,1 ${-1 * w * 0.25},${-1 * w * 0.15} + + a${r1},${r1} 1 0,1 ${-1 * w * 0.1},${-1 * h * 0.35} + a${r4},${r4} 1 0,1 ${w * 0.1},${-1 * h * 0.65} + + H0 V0 Z` + ); +}; +const bangBkg = function(elem, node) { + const w = node.width; + const h = node.height; + const r = 0.15 * w; + elem.append("path").attr("id", "node-" + node.id).attr("class", "node-bkg node-" + type2Str(node.type)).attr( + "d", + `M0 0 a${r},${r} 1 0,0 ${w * 0.25},${-1 * h * 0.1} + a${r},${r} 1 0,0 ${w * 0.25},${0} + a${r},${r} 1 0,0 ${w * 0.25},${0} + a${r},${r} 1 0,0 ${w * 0.25},${1 * h * 0.1} + + a${r},${r} 1 0,0 ${w * 0.15},${1 * h * 0.33} + a${r * 0.8},${r * 0.8} 1 0,0 ${0},${1 * h * 0.34} + a${r},${r} 1 0,0 ${-1 * w * 0.15},${1 * h * 0.33} + + a${r},${r} 1 0,0 ${-1 * w * 0.25},${h * 0.15} + a${r},${r} 1 0,0 ${-1 * w * 0.25},${0} + a${r},${r} 1 0,0 ${-1 * w * 0.25},${0} + a${r},${r} 1 0,0 ${-1 * w * 0.25},${-1 * h * 0.15} + + a${r},${r} 1 0,0 ${-1 * w * 0.1},${-1 * h * 0.33} + a${r * 0.8},${r * 0.8} 1 0,0 ${0},${-1 * h * 0.34} + a${r},${r} 1 0,0 ${w * 0.1},${-1 * h * 0.33} + + H0 V0 Z` + ); +}; +const circleBkg = function(elem, node) { + elem.append("circle").attr("id", "node-" + node.id).attr("class", "node-bkg node-" + type2Str(node.type)).attr("r", node.width / 2); +}; +function insertPolygonShape(parent, w, h, points, node) { + return parent.insert("polygon", ":first-child").attr( + "points", + points.map(function(d) { + return d.x + "," + d.y; + }).join(" ") + ).attr("transform", "translate(" + (node.width - w) / 2 + ", " + h + ")"); +} +const hexagonBkg = function(elem, node) { + const h = node.height; + const f = 4; + const m = h / f; + const w = node.width - node.padding + 2 * m; + const points = [ + { x: m, y: 0 }, + { x: w - m, y: 0 }, + { x: w, y: -h / 2 }, + { x: w - m, y: -h }, + { x: m, y: -h }, + { x: 0, y: -h / 2 } + ]; + insertPolygonShape(elem, w, h, points, node); +}; +const roundedRectBkg = function(elem, node) { + elem.append("rect").attr("id", "node-" + node.id).attr("class", "node-bkg node-" + type2Str(node.type)).attr("height", node.height).attr("rx", node.padding).attr("ry", node.padding).attr("width", node.width); +}; +const drawNode = function(elem, node, fullSection, conf) { + const section = fullSection % (MAX_SECTIONS - 1); + const nodeElem = elem.append("g"); + node.section = section; + let sectionClass = "section-" + section; + if (section < 0) { + sectionClass += " section-root"; + } + nodeElem.attr("class", (node.class ? node.class + " " : "") + "mindmap-node " + sectionClass); + const bkgElem = nodeElem.append("g"); + const textElem = nodeElem.append("g"); + const txt = textElem.append("text").text(node.descr).attr("dy", "1em").attr("alignment-baseline", "middle").attr("dominant-baseline", "middle").attr("text-anchor", "middle").call(wrap, node.width); + const bbox = txt.node().getBBox(); + const fontSize = conf.fontSize.replace ? conf.fontSize.replace("px", "") : conf.fontSize; + node.height = bbox.height + fontSize * 1.1 * 0.5 + node.padding; + node.width = bbox.width + 2 * node.padding; + if (node.icon) { + if (node.type === nodeType.CIRCLE) { + node.height += 50; + node.width += 50; + const icon = nodeElem.append("foreignObject").attr("height", "50px").attr("width", node.width).attr("style", "text-align: center;"); + icon.append("div").attr("class", "icon-container").append("i").attr("class", "node-icon-" + section + " " + node.icon); + textElem.attr( + "transform", + "translate(" + node.width / 2 + ", " + (node.height / 2 - 1.5 * node.padding) + ")" + ); + } else { + node.width += 50; + const orgHeight = node.height; + node.height = Math.max(orgHeight, 60); + const heightDiff = Math.abs(node.height - orgHeight); + const icon = nodeElem.append("foreignObject").attr("width", "60px").attr("height", node.height).attr("style", "text-align: center;margin-top:" + heightDiff / 2 + "px;"); + icon.append("div").attr("class", "icon-container").append("i").attr("class", "node-icon-" + section + " " + node.icon); + textElem.attr( + "transform", + "translate(" + (25 + node.width / 2) + ", " + (heightDiff / 2 + node.padding / 2) + ")" + ); + } + } else { + textElem.attr("transform", "translate(" + node.width / 2 + ", " + node.padding / 2 + ")"); + } + switch (node.type) { + case nodeType.DEFAULT: + defaultBkg(bkgElem, node, section); + break; + case nodeType.ROUNDED_RECT: + roundedRectBkg(bkgElem, node); + break; + case nodeType.RECT: + rectBkg(bkgElem, node); + break; + case nodeType.CIRCLE: + bkgElem.attr("transform", "translate(" + node.width / 2 + ", " + +node.height / 2 + ")"); + circleBkg(bkgElem, node); + break; + case nodeType.CLOUD: + cloudBkg(bkgElem, node); + break; + case nodeType.BANG: + bangBkg(bkgElem, node); + break; + case nodeType.HEXAGON: + hexagonBkg(bkgElem, node); + break; + } + setElementForId(node.id, nodeElem); + return node.height; +}; +const drawEdge = function drawEdge2(edgesElem, mindmap, parent, depth, fullSection) { + const section = fullSection % (MAX_SECTIONS - 1); + const sx = parent.x + parent.width / 2; + const sy = parent.y + parent.height / 2; + const ex = mindmap.x + mindmap.width / 2; + const ey = mindmap.y + mindmap.height / 2; + const mx = ex > sx ? sx + Math.abs(sx - ex) / 2 : sx - Math.abs(sx - ex) / 2; + const my = ey > sy ? sy + Math.abs(sy - ey) / 2 : sy - Math.abs(sy - ey) / 2; + const qx = ex > sx ? Math.abs(sx - mx) / 2 + sx : -Math.abs(sx - mx) / 2 + sx; + const qy = ey > sy ? Math.abs(sy - my) / 2 + sy : -Math.abs(sy - my) / 2 + sy; + edgesElem.append("path").attr( + "d", + parent.direction === "TB" || parent.direction === "BT" ? `M${sx},${sy} Q${sx},${qy} ${mx},${my} T${ex},${ey}` : `M${sx},${sy} Q${qx},${sy} ${mx},${my} T${ex},${ey}` + ).attr("class", "edge section-edge-" + section + " edge-depth-" + depth); +}; +const positionNode = function(node) { + const nodeElem = getElementById(node.id); + const x = node.x || 0; + const y = node.y || 0; + nodeElem.attr("transform", "translate(" + x + "," + y + ")"); +}; +const svgDraw = { drawNode, positionNode, drawEdge }; +cytoscape_dist_cytoscape_umd_js__WEBPACK_IMPORTED_MODULE_1___default().use((cytoscape_cose_bilkent__WEBPACK_IMPORTED_MODULE_2___default())); +function drawNodes(svg, mindmap, section, conf) { + svgDraw.drawNode(svg, mindmap, section, conf); + if (mindmap.children) { + mindmap.children.forEach((child, index) => { + drawNodes(svg, child, section < 0 ? index : section, conf); + }); + } +} +function drawEdges(edgesEl, cy) { + cy.edges().map((edge, id) => { + const data = edge.data(); + if (edge[0]._private.bodyBounds) { + const bounds = edge[0]._private.rscratch; + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_13__.l.trace("Edge: ", id, data); + edgesEl.insert("path").attr( + "d", + `M ${bounds.startX},${bounds.startY} L ${bounds.midX},${bounds.midY} L${bounds.endX},${bounds.endY} ` + ).attr("class", "edge section-edge-" + data.section + " edge-depth-" + data.depth); + } + }); +} +function addNodes(mindmap, cy, conf, level) { + cy.add({ + group: "nodes", + data: { + id: mindmap.id, + labelText: mindmap.descr, + height: mindmap.height, + width: mindmap.width, + level, + nodeId: mindmap.id, + padding: mindmap.padding, + type: mindmap.type + }, + position: { + x: mindmap.x, + y: mindmap.y + } + }); + if (mindmap.children) { + mindmap.children.forEach((child) => { + addNodes(child, cy, conf, level + 1); + cy.add({ + group: "edges", + data: { + id: `${mindmap.id}_${child.id}`, + source: mindmap.id, + target: child.id, + depth: level, + section: child.section + } + }); + }); + } +} +function layoutMindmap(node, conf) { + return new Promise((resolve) => { + const renderEl = (0,d3__WEBPACK_IMPORTED_MODULE_0__/* .select */ .Ys)("body").append("div").attr("id", "cy").attr("style", "display:none"); + const cy = cytoscape_dist_cytoscape_umd_js__WEBPACK_IMPORTED_MODULE_1___default()({ + container: document.getElementById("cy"), + // container to render in + style: [ + { + selector: "edge", + style: { + "curve-style": "bezier" + } + } + ] + }); + renderEl.remove(); + addNodes(node, cy, conf, 0); + cy.nodes().forEach(function(n) { + n.layoutDimensions = () => { + const data = n.data(); + return { w: data.width, h: data.height }; + }; + }); + cy.layout({ + name: "cose-bilkent", + quality: "proof", + // headless: true, + styleEnabled: false, + animate: false + }).run(); + cy.ready((e) => { + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_13__.l.info("Ready", e); + resolve(cy); + }); + }); +} +function positionNodes(cy) { + cy.nodes().map((node, id) => { + const data = node.data(); + data.x = node.position().x; + data.y = node.position().y; + svgDraw.positionNode(data); + const el = getElementById(data.nodeId); + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_13__.l.info("Id:", id, "Position: (", node.position().x, ", ", node.position().y, ")", data); + el.attr( + "transform", + `translate(${node.position().x - data.width / 2}, ${node.position().y - data.height / 2})` + ); + el.attr("attr", `apa-${id})`); + }); +} +const draw = async (text, id, version, diagObj) => { + const conf = (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_13__.g)(); + diagObj.db.clear(); + diagObj.parser.parse(text); + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_13__.l.debug("Renering info diagram\n" + text); + const securityLevel = (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_13__.g)().securityLevel; + let sandboxElement; + if (securityLevel === "sandbox") { + sandboxElement = (0,d3__WEBPACK_IMPORTED_MODULE_0__/* .select */ .Ys)("#i" + id); + } + const root = securityLevel === "sandbox" ? (0,d3__WEBPACK_IMPORTED_MODULE_0__/* .select */ .Ys)(sandboxElement.nodes()[0].contentDocument.body) : (0,d3__WEBPACK_IMPORTED_MODULE_0__/* .select */ .Ys)("body"); + const svg = root.select("#" + id); + svg.append("g"); + const mm = diagObj.db.getMindmap(); + const edgesElem = svg.append("g"); + edgesElem.attr("class", "mindmap-edges"); + const nodesElem = svg.append("g"); + nodesElem.attr("class", "mindmap-nodes"); + drawNodes(nodesElem, mm, -1, conf); + const cy = await layoutMindmap(mm, conf); + drawEdges(edgesElem, cy); + positionNodes(cy); + (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_13__.s)(void 0, svg, conf.mindmap.padding, conf.mindmap.useMaxWidth); +}; +const mindmapRenderer = { + draw +}; +const genSections = (options) => { + let sections = ""; + for (let i = 0; i < options.THEME_COLOR_LIMIT; i++) { + options["lineColor" + i] = options["lineColor" + i] || options["cScaleInv" + i]; + if ((0,khroma__WEBPACK_IMPORTED_MODULE_14__/* ["default"] */ .Z)(options["lineColor" + i])) { + options["lineColor" + i] = (0,khroma__WEBPACK_IMPORTED_MODULE_15__/* ["default"] */ .Z)(options["lineColor" + i], 20); + } else { + options["lineColor" + i] = (0,khroma__WEBPACK_IMPORTED_MODULE_16__/* ["default"] */ .Z)(options["lineColor" + i], 20); + } + } + for (let i = 0; i < options.THEME_COLOR_LIMIT; i++) { + const sw = "" + (17 - 3 * i); + sections += ` + .section-${i - 1} rect, .section-${i - 1} path, .section-${i - 1} circle, .section-${i - 1} polygon, .section-${i - 1} path { + fill: ${options["cScale" + i]}; + } + .section-${i - 1} text { + fill: ${options["cScaleLabel" + i]}; + } + .node-icon-${i - 1} { + font-size: 40px; + color: ${options["cScaleLabel" + i]}; + } + .section-edge-${i - 1}{ + stroke: ${options["cScale" + i]}; + } + .edge-depth-${i - 1}{ + stroke-width: ${sw}; + } + .section-${i - 1} line { + stroke: ${options["cScaleInv" + i]} ; + stroke-width: 3; + } + + .disabled, .disabled circle, .disabled text { + fill: lightgray; + } + .disabled text { + fill: #efefef; + } + `; + } + return sections; +}; +const getStyles = (options) => ` + .edge { + stroke-width: 3; + } + ${genSections(options)} + .section-root rect, .section-root path, .section-root circle, .section-root polygon { + fill: ${options.git0}; + } + .section-root text { + fill: ${options.gitBranchLabel0}; + } + .icon-container { + height:100%; + display: flex; + justify-content: center; + align-items: center; + } + .edge { + fill: none; + } +`; +const mindmapStyles = getStyles; +const diagram = { + db: mindmapDb, + renderer: mindmapRenderer, + parser: mindmapParser, + styles: mindmapStyles +}; + +//# sourceMappingURL=mindmap-definition-44684416.js.map + + +/***/ }), + +/***/ 91619: +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; + +// EXPORTS +__webpack_require__.d(__webpack_exports__, { + Z: () => (/* binding */ is_dark) +}); + +// EXTERNAL MODULE: ./node_modules/khroma/dist/utils/index.js + 3 modules +var utils = __webpack_require__(61691); +// EXTERNAL MODULE: ./node_modules/khroma/dist/color/index.js + 4 modules +var dist_color = __webpack_require__(71610); +;// CONCATENATED MODULE: ./node_modules/khroma/dist/methods/luminance.js +/* IMPORT */ + + +/* MAIN */ +//SOURCE: https://planetcalc.com/7779 +const luminance = (color) => { + const { r, g, b } = dist_color/* default */.Z.parse(color); + const luminance = .2126 * utils/* default */.Z.channel.toLinear(r) + .7152 * utils/* default */.Z.channel.toLinear(g) + .0722 * utils/* default */.Z.channel.toLinear(b); + return utils/* default */.Z.lang.round(luminance); +}; +/* EXPORT */ +/* harmony default export */ const methods_luminance = (luminance); + +;// CONCATENATED MODULE: ./node_modules/khroma/dist/methods/is_light.js +/* IMPORT */ + +/* MAIN */ +const isLight = (color) => { + return methods_luminance(color) >= .5; +}; +/* EXPORT */ +/* harmony default export */ const is_light = (isLight); + +;// CONCATENATED MODULE: ./node_modules/khroma/dist/methods/is_dark.js +/* IMPORT */ + +/* MAIN */ +const isDark = (color) => { + return !is_light(color); +}; +/* EXPORT */ +/* harmony default export */ const is_dark = (isDark); + + +/***/ }) + +}; +; \ No newline at end of file diff --git a/assets/js/73956345.ebd80645.js b/assets/js/73956345.ebd80645.js new file mode 100644 index 0000000000..fb470d227f --- /dev/null +++ b/assets/js/73956345.ebd80645.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[987],{3905:(e,t,r)=>{r.d(t,{Zo:()=>l,kt:()=>v});var n=r(67294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var p=n.createContext({}),u=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):c(c({},t),e)),r},l=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},s="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,p=e.parentName,l=i(e,["components","mdxType","originalType","parentName"]),s=u(r),m=o,v=s["".concat(p,".").concat(m)]||s[m]||f[m]||a;return r?n.createElement(v,c(c({ref:t},l),{},{components:r})):n.createElement(v,c({ref:t},l))}));function v(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,c=new Array(a);c[0]=m;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[s]="string"==typeof e?e:o,c[1]=i;for(var u=2;u{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>c,default:()=>f,frontMatter:()=>a,metadata:()=>i,toc:()=>u});var n=r(87462),o=(r(67294),r(3905));const a={},c="Compute",i={unversionedId:"iaas/overview/compute",id:"iaas/overview/compute",title:"Compute",description:"TODO",source:"@site/docs/02-iaas/overview/compute.md",sourceDirName:"02-iaas/overview",slug:"/iaas/overview/compute",permalink:"/docs/iaas/overview/compute",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/overview/compute.md",tags:[],version:"current",frontMatter:{}},p={},u=[],l={toc:u},s="wrapper";function f(e){let{components:t,...r}=e;return(0,o.kt)(s,(0,n.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"compute"},"Compute"),(0,o.kt)("p",null,"TODO"))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/739c0ae8.eef7e9df.js b/assets/js/739c0ae8.eef7e9df.js new file mode 100644 index 0000000000..8b52efbfa5 --- /dev/null +++ b/assets/js/739c0ae8.eef7e9df.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4819],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var n=r(67294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var p=n.createContext({}),s=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=s(e.components);return n.createElement(p.Provider,{value:t},e.children)},l="mdxType",y={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,p=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),l=s(r),d=o,m=l["".concat(p,".").concat(d)]||l[d]||y[d]||a;return r?n.createElement(m,i(i({ref:t},u),{},{components:r})):n.createElement(m,i({ref:t},u))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=d;var c={};for(var p in t)hasOwnProperty.call(t,p)&&(c[p]=t[p]);c.originalType=e,c[l]="string"==typeof e?e:o,i[1]=c;for(var s=2;s{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>y,frontMatter:()=>a,metadata:()=>c,toc:()=>s});var n=r(87462),o=(r(67294),r(3905));const a={},i="Gateway-API",c={unversionedId:"container/components/k8s-cluster-api-provider/doc/usage/gateway-api",id:"container/components/k8s-cluster-api-provider/doc/usage/gateway-api",title:"Gateway-API",description:"Starting with R5, this k8s-solution offers experimental kubernetes gateway API support. You need to set deploygatewayapi to true in your environments configuration. Also you need to use cilium as your CNI (default since R5).",source:"@site/docs/03-container/components/k8s-cluster-api-provider/doc/usage/gateway-api.md",sourceDirName:"03-container/components/k8s-cluster-api-provider/doc/usage",slug:"/container/components/k8s-cluster-api-provider/doc/usage/gateway-api",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/usage/gateway-api",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/03-container/components/k8s-cluster-api-provider/doc/usage/gateway-api.md",tags:[],version:"current",frontMatter:{}},p={},s=[],u={toc:s},l="wrapper";function y(e){let{components:t,...r}=e;return(0,o.kt)(l,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"gateway-api"},"Gateway-API"),(0,o.kt)("p",null,"Starting with R5, this k8s-solution offers experimental kubernetes gateway API support. You need to set ",(0,o.kt)("inlineCode",{parentName:"p"},"deploy_gateway_api")," to ",(0,o.kt)("inlineCode",{parentName:"p"},"true")," in your environments configuration. Also you need to use cilium as your CNI (default since R5)."),(0,o.kt)("p",null,"After deploying your cluster, you can use gateway API and deploy Gateways and HTTP-Routes. As a starting point you can deploy this example app:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.11/samples/bookinfo/platform/kube/bookinfo.yaml\n")),(0,o.kt)("p",null,"and this example Gateway and HTTP-Route"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"kubectl apply -f https://raw.githubusercontent.com/cilium/cilium/1.14.1/examples/kubernetes/gateway/basic-http.yaml\n")))}y.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/767805d3.06228b2e.js b/assets/js/767805d3.06228b2e.js new file mode 100644 index 0000000000..35fa68cbdb --- /dev/null +++ b/assets/js/767805d3.06228b2e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9668],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>m});var r=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=r.createContext({}),u=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},d=function(e){var t=u(e.components);return r.createElement(s.Provider,{value:t},e.children)},c="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},k=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),c=u(n),k=o,m=c["".concat(s,".").concat(k)]||c[k]||p[k]||i;return n?r.createElement(m,a(a({ref:t},d),{},{components:n})):r.createElement(m,a({ref:t},d))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,a=new Array(i);a[0]=k;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[c]="string"==typeof e?e:o,a[1]=l;for(var u=2;u{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>p,frontMatter:()=>i,metadata:()=>l,toc:()=>u});var r=n(87462),o=(n(67294),n(3905));const i={sidebar_label:"Configuration repository",sidebar_position:10},a="Configuration Repository",l={unversionedId:"iaas/guides/configuration-guide/configuration-repository",id:"iaas/guides/configuration-guide/configuration-repository",title:"Configuration Repository",description:"The configuration required for OSISM is stored in a single Git monorepo, the configuration repository.",source:"@site/docs/02-iaas/guides/configuration-guide/configuration-repository.md",sourceDirName:"02-iaas/guides/configuration-guide",slug:"/iaas/guides/configuration-guide/configuration-repository",permalink:"/docs/iaas/guides/configuration-guide/configuration-repository",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/configuration-guide/configuration-repository.md",tags:[],version:"current",sidebarPosition:10,frontMatter:{sidebar_label:"Configuration repository",sidebar_position:10},sidebar:"docs",previous:{title:"Configuration Guide",permalink:"/docs/iaas/guides/configuration-guide/"},next:{title:"Inventory",permalink:"/docs/iaas/guides/configuration-guide/inventory"}},s={},u=[{value:"Configuration repository layout",id:"configuration-repository-layout",level:2},{value:"Creating a new configuration repository",id:"creating-a-new-configuration-repository",level:2},{value:"Git repository",id:"git-repository",level:3},{value:"Creation",id:"creation",level:3},{value:"Use of latest",id:"use-of-latest",level:3},{value:"Make commit",id:"make-commit",level:3},{value:"Post-processing",id:"post-processing",level:3},{value:"Notes",id:"notes",level:3},{value:"Parameters",id:"parameters",level:3},{value:"Preparing a new configuration repository",id:"preparing-a-new-configuration-repository",level:2},{value:"Manager environment",id:"manager-environment",level:3},{value:"Inventory",id:"inventory",level:3}],d={toc:u},c="wrapper";function p(e){let{components:t,...n}=e;return(0,o.kt)(c,(0,r.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"configuration-repository"},"Configuration Repository"),(0,o.kt)("p",null,"The configuration required for OSISM is stored in a single Git monorepo, the configuration repository."),(0,o.kt)("h2",{id:"configuration-repository-layout"},"Configuration repository layout"),(0,o.kt)("p",null,"A configuration repository is always composed of the same basic layout."),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("inlineCode",{parentName:"strong"},"environments")," directory"))),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("inlineCode",{parentName:"strong"},"inventory")," directory"))),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("inlineCode",{parentName:"strong"},"netbox")," directory (optional)"))),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("inlineCode",{parentName:"strong"},"requirements.txt")," file")),(0,o.kt)("p",{parentName:"li"},"In the ",(0,o.kt)("inlineCode",{parentName:"p"},"requirements.txt")," the necessary dependencies are listed to be able to execute Gilt.")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("inlineCode",{parentName:"strong"},"gilt.yml")," file")),(0,o.kt)("p",{parentName:"li"},(0,o.kt)("a",{parentName:"p",href:"https://gilt.readthedocs.io"},"Gilt")," is a Git layering tool. We use Gilt to maintain the image versions,\nAnsible configuration and scripts within the ",(0,o.kt)("inlineCode",{parentName:"p"},"environments/manager")," directory."),(0,o.kt)("p",{parentName:"li"},"The ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/osism/cfg-generics/blob/main/gilt.yml"},"current gilt.yml")," file is always\nlocated in the ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/osism/cfg-generics"},"osism/cfg-generics")," repository."),(0,o.kt)("p",{parentName:"li"},"To use Gilt the dependencies are installed first."),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"pip3 install -r requirements.txt\n")),(0,o.kt)("p",{parentName:"li"},"After that you can update the manager environment in ",(0,o.kt)("inlineCode",{parentName:"p"},"environments/manager"),". Since the ",(0,o.kt)("inlineCode",{parentName:"p"},"gilt.yml"),"\nitself is updated with Gilt it is always important to run the command twice."),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"gilt overlay\ngilt overlay\n")))),(0,o.kt)("h2",{id:"creating-a-new-configuration-repository"},"Creating a new configuration repository"),(0,o.kt)("p",null,"The initial content for this repository is generated using the\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/osism/cfg-cookiecutter"},"cookiecutter"),"."),(0,o.kt)("h3",{id:"git-repository"},"Git repository"),(0,o.kt)("p",null,"The content generated by the cookiecutter in the ",(0,o.kt)("inlineCode",{parentName:"p"},"output/configuration")," directory is\ncommitted to a new Git repository. By default, it is assumed that the configuration\nrepository is stored on GitHub. This can also be GitLab or an internal Git service\nas well."),(0,o.kt)("p",null,"Host and path to the Git repository are specified via the ",(0,o.kt)("inlineCode",{parentName:"p"},"git_")," parameters: The\n",(0,o.kt)("inlineCode",{parentName:"p"},"git_")," parameters do not specify the path to the cookiecutter to use."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"}," [8/20] git_host (github.com):\n [9/20] git_port (22):\n [10/20] git_repository (YOUR_ORG/YOUR_NEW_CONFIGURATION_REPOSITORY): regiocloud/configuration\n [11/20] git_username (git):\n [12/20] git_version (main):\n")),(0,o.kt)("p",null,"In this case, the generated configuration in the ",(0,o.kt)("inlineCode",{parentName:"p"},"output/configuration")," directory is\nstored on GitHub in the ",(0,o.kt)("inlineCode",{parentName:"p"},"regiocloud/configuration")," repository."),(0,o.kt)("h3",{id:"creation"},"Creation"),(0,o.kt)("p",null,"In this example a new configuration repository is created with the defaults. The current stable\nversion of OSISM is used. The use of latest is described in the section\n",(0,o.kt)("a",{parentName:"p",href:"#use-of-latest"},"Use of latest"),"."),(0,o.kt)("p",null,"The directory ",(0,o.kt)("inlineCode",{parentName:"p"},"output")," is created and used as output volume."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"mkdir output\n")),(0,o.kt)("p",null,"The cookiecutter is executed within a container. Docker must be usable on the system\non which the cookiecutter is to be used. It should also work with podman."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"docker run --rm -v $(pwd)/output:/output -it quay.io/osism/cookiecutter\n[1/20] with_ceph (1):\n[2/20] ceph_network_backend (192.168.80.0/20):\n[3/20] ceph_network_frontend (192.168.64.0/20):\n[4/20] ceph_version (quincy):\n[5/20] domain (osism.xyz):\n[6/20] fqdn_external (api.osism.xyz):\n[7/20] fqdn_internal (api-int.osism.xyz):\n[8/20] git_host (github.com):\n[9/20] git_port (22):\n[10/20] git_repository (YOUR_ORG/YOUR_NEW_CONFIGURATION_REPOSITORY):\n[11/20] git_username (git):\n[12/20] git_version (main):\n[13/20] ip_external (192.168.96.9):\n[14/20] ip_internal (192.168.32.9):\n[15/20] manager_version (6.0.2):\n[16/20] name_server (149.112.112.112):\n[17/20] ntp_server (de.pool.ntp.org):\n[18/20] openstack_version (2023.1):\n[19/20] project_name (configuration):\n[...]\n")),(0,o.kt)("p",null,"Since we run the cookiecutter inside a container, the user rights are not correct\nafterwards and have to be changed."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"sudo chown -R $USER: output/\n")),(0,o.kt)("h3",{id:"use-of-latest"},"Use of latest"),(0,o.kt)("p",null,"When you want to use latest this is done via the parameter ",(0,o.kt)("inlineCode",{parentName:"p"},"manager_version"),".\nBy default, this is always set to the current stable version."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"manager_version [6.0.2]: latest\n")),(0,o.kt)("p",null,"If the ",(0,o.kt)("inlineCode",{parentName:"p"},"manager_version")," parameter is set to ",(0,o.kt)("inlineCode",{parentName:"p"},"latest")," it is also possible to explicitly\nset the ",(0,o.kt)("inlineCode",{parentName:"p"},"openstack_version")," and the ",(0,o.kt)("inlineCode",{parentName:"p"},"ceph_version"),"."),(0,o.kt)("h3",{id:"make-commit"},"Make commit"),(0,o.kt)("p",null,"The content is now committed to the previously created Git repository."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},'$ git clone git@github.com:YOUR_ORG/YOUR_NEW_CONFIGURATION_REPOSITORY.git YOUR_NEW_CONFIGURATION_REPOSITORY\n$ cp -r output/configuration/* output/configuration/.gitignore YOUR_NEW_CONFIGURATION_REPOSITORY\n$ cd YOUR_NEW_CONFIGURATION_REPOSITORY\n$ git add .gitignore *\n$ git commit -m "Initial commit"\n$ git push\n')),(0,o.kt)("p",null,"The ",(0,o.kt)("inlineCode",{parentName:"p"},"secrets")," directory is not stored in the Git repository. Its contents can be\nstored in a suitable location."),(0,o.kt)("p",null,"The ",(0,o.kt)("inlineCode",{parentName:"p"},"secrets")," directory contains an SSH key pair which is used as a deploy key to\nmake the configuration repository available on the manager node later. Write access\nis not required. The public SSH key is stored in the file ",(0,o.kt)("inlineCode",{parentName:"p"},"secrets/id_rsa.configuration.pub"),"."),(0,o.kt)("p",null,"How to add a deploy key on GitHub is documented in\n",(0,o.kt)("a",{parentName:"p",href:"https://docs.github.com/en/authentication/connecting-to-github-with-ssh/managing-deploy-keys"},"Managing deploy keys"),"."),(0,o.kt)("h3",{id:"post-processing"},"Post-processing"),(0,o.kt)("p",null,"The configuration repository that is initially created with the Cookiecutter is not directly usable.\nFor example, the inventory needs to be built. All further information can be found in the\n",(0,o.kt)("a",{parentName:"p",href:"./"},"Configuration Guide"),"."),(0,o.kt)("h3",{id:"notes"},"Notes"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"The password for Ansible Vault encrypted files, ist stored at ",(0,o.kt)("inlineCode",{parentName:"li"},"secrets/vaultpass"),"."),(0,o.kt)("li",{parentName:"ul"},"The password of the generated Keepass file is ",(0,o.kt)("inlineCode",{parentName:"li"},"password"),". This has to be changed.")),(0,o.kt)("h3",{id:"parameters"},"Parameters"),(0,o.kt)("table",null,(0,o.kt)("tr",null,(0,o.kt)("th",null,"Parameter"),(0,o.kt)("th",null,"Description"),(0,o.kt)("th",null,"Default")),(0,o.kt)("tr",null,(0,o.kt)("td",null,(0,o.kt)("code",null,"ceph_network_backend")),(0,o.kt)("td",null,"Address range for ceph's backend network"),(0,o.kt)("td",null,(0,o.kt)("code",null,"192.168.80.0/20"))),(0,o.kt)("tr",null,(0,o.kt)("td",null,(0,o.kt)("code",null,"ceph_network_frontend")),(0,o.kt)("td",null,"Address range for ceph's frontend network"),(0,o.kt)("td",null,(0,o.kt)("code",null,"192.168.64.0/20"))),(0,o.kt)("tr",null,(0,o.kt)("td",null,(0,o.kt)("code",null,"ceph_version")),(0,o.kt)("td",null,"The version of Ceph. When using a stable OSISM release (",(0,o.kt)("code",null,"manager_version != latest"),"), this value is ignored."),(0,o.kt)("td",null,(0,o.kt)("code",null,"quincy"))),(0,o.kt)("tr",null,(0,o.kt)("td",null,(0,o.kt)("code",null,"domain")),(0,o.kt)("td",null,"The domain used by hostnames"),(0,o.kt)("td",null,(0,o.kt)("code",null,"osism.xyz"))),(0,o.kt)("tr",null,(0,o.kt)("td",null,(0,o.kt)("code",null,"fqdn_external")),(0,o.kt)("td",null,"External API FQDN"),(0,o.kt)("td",null,(0,o.kt)("code",null,"api.osism.xyz"))),(0,o.kt)("tr",null,(0,o.kt)("td",null,(0,o.kt)("code",null,"fqdn_internal")),(0,o.kt)("td",null,"Internal API FQDN"),(0,o.kt)("td",null,(0,o.kt)("code",null,"api-int.osism.xyz"))),(0,o.kt)("tr",null,(0,o.kt)("td",null,(0,o.kt)("code",null,"git_host")),(0,o.kt)("td",null,"Address of the used Git server"),(0,o.kt)("td",null,(0,o.kt)("code",null,"github.com"))),(0,o.kt)("tr",null,(0,o.kt)("td",null,(0,o.kt)("code",null,"git_port")),(0,o.kt)("td",null,"Port of the used Git server"),(0,o.kt)("td",null,(0,o.kt)("code",null,"22"))),(0,o.kt)("tr",null,(0,o.kt)("td",null,(0,o.kt)("code",null,"git_repository")),(0,o.kt)("td",null,"Path to the git configuration repository"),(0,o.kt)("td",null,(0,o.kt)("code",null,"YOUR_ORG/YOUR_NEW_CONFIGURATION_REPOSITORY"))),(0,o.kt)("tr",null,(0,o.kt)("td",null,(0,o.kt)("code",null,"git_username")),(0,o.kt)("td",null,"Username of the git repository"),(0,o.kt)("td",null,(0,o.kt)("code",null,"git"))),(0,o.kt)("tr",null,(0,o.kt)("td",null,(0,o.kt)("code",null,"git_version")),(0,o.kt)("td",null,"Git branch name"),(0,o.kt)("td",null,(0,o.kt)("code",null,"main"))),(0,o.kt)("tr",null,(0,o.kt)("td",null,(0,o.kt)("code",null,"ip_external")),(0,o.kt)("td",null,"The external IP address of the API (resolves to ",(0,o.kt)("code",null,"fqdn_external"),")"),(0,o.kt)("td",null,(0,o.kt)("code",null,"192.168.96.9"))),(0,o.kt)("tr",null,(0,o.kt)("td",null,(0,o.kt)("code",null,"ip_internal")),(0,o.kt)("td",null,"The internal IP address of the API (resolves to ",(0,o.kt)("code",null,"fqdn_internal"),")"),(0,o.kt)("td",null,(0,o.kt)("code",null,"192.168.32.9"))),(0,o.kt)("tr",null,(0,o.kt)("td",null,(0,o.kt)("code",null,"manager_version")),(0,o.kt)("td",null,"The version of OSISM. An overview of available OSISM releases can be found on ",(0,o.kt)("a",{href:"https://release.osism.tech"},"release.osism.tech"),"."),(0,o.kt)("td",null,(0,o.kt)("code",null,"6.0.2"))),(0,o.kt)("tr",null,(0,o.kt)("td",null,(0,o.kt)("code",null,"name_server")),(0,o.kt)("td",null,"Nameserver. Only one nameserver is set here because the query of multiple values in Cooiecutter is weird. Add more nameservers afterwards."),(0,o.kt)("td",null,(0,o.kt)("code",null,"149.112.112.112"))),(0,o.kt)("tr",null,(0,o.kt)("td",null,(0,o.kt)("code",null,"ntp_server")),(0,o.kt)("td",null,"NTP server. Only one NTP server is set here because the query of multiple values in Cooiecutter is weird. Add more NTP servers afterwards."),(0,o.kt)("td",null,(0,o.kt)("code",null,"de.pool.ntp.org"))),(0,o.kt)("tr",null,(0,o.kt)("td",null,(0,o.kt)("code",null,"openstack_version")),(0,o.kt)("td",null,"The version of OpenStack. When using a stable OSISM release (",(0,o.kt)("code",null,"manager_version != latest"),"), this value is ignored."),(0,o.kt)("td",null,(0,o.kt)("code",null,"2023.1"))),(0,o.kt)("tr",null,(0,o.kt)("td",null,(0,o.kt)("code",null,"project_name")),(0,o.kt)("td",null,"Name of the configuration repository directory"),(0,o.kt)("td",null,(0,o.kt)("code",null,"configuration"))),(0,o.kt)("tr",null,(0,o.kt)("td",null,(0,o.kt)("code",null,"with_ceph")),(0,o.kt)("td",null,"1 to use Ceph, 0 to not use Ceph"),(0,o.kt)("td",null,(0,o.kt)("code",null,"1")))),(0,o.kt)("h2",{id:"preparing-a-new-configuration-repository"},"Preparing a new configuration repository"),(0,o.kt)("h3",{id:"manager-environment"},"Manager environment"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-none",metastring:'title="environments/manager/hosts"',title:'"environments/manager/hosts"'},"[manager]\nmanager01\n")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-yaml",metastring:'title="environments/manager/host_vars/manager01.yml"',title:'"environments/manager/host_vars/manager01.yml"'},'---\n##########################################################\n# ansible\n\nansible_host: 192.168.16.5\n\n##########################################################\n# generic\n\ninternal_interface: eno1\n\n##########################################################\n# network\n\nnetwork_type: netplan\nnetwork_ethernets:\n eno1:\n addresses:\n - "192.168.16.10/20"\n gateway4: "192.168.16.1"\n mtu: 1500\n')),(0,o.kt)("h3",{id:"inventory"},"Inventory"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-none",metastring:'title="inventory/20-roles"',title:'"inventory/20-roles"'},'##########################################################\n# roles\n\n# NOTE: If netbox is not used, nothing needs to be changed here. In\n# this case this inventory is used as before. The hosts are\n# then managed here as normal.\n#\n# If netbox is used this file is only used to store the hosts\n# for the initial import into the netbox.\n#\n# After the initial import of the inventory in the netbox,\n# the groups in this file can be emptied. The systems are\n# then assigned to their roles via tags in the netbox.\n\n# The "all" group is not used in OSISM. Therefore it is important\n# that all nodes are explicitly listed here.\n[generic]\nnode01\n\n# Nodes that act as manager (sometimes called deployment node)\n# are included in this group.\n[manager]\nmanager01\n\n# Nodes which are intended for monitoring services belong to\n# this group\n[monitoring]\n\n# Nodes that serve as controllers, so things like scheduler,\n# API or database run there, of the environment.\n[control]\n\n# Virtual systems managed by OpenStack Nova are placed on\n# nodes in this group.\n[compute]\n\n# Network resources managed by OpenStack Neutron, such as\n# L3 routers, are placed on these nodes. This group has nothing\n# to do with the general network configuration.\n[network]\n\n# Nodes that serve as controllers for Ceph, so things like the\n# Ceph Monitor service run here.\n[ceph-control]\n\n# The storage available in these systems is provided in the\n# form of OSDs for Ceph.\n[ceph-resource]\n\n# NOTE: These empty groups are only necessary if netbox is used. After\n# the initial import of the hosts these groups can be commented\n# out. The groups above with the initial hosts can be commented.\n#\n# [generic]\n#\n# [manager]\n#\n# [monitoring]\n#\n# [control]\n#\n# [compute]\n#\n# [network]\n#\n# [ceph-control]\n#\n# [ceph-resource]\n')),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-yaml",metastring:'title="inventory/host_vars/node01.yml"',title:'"inventory/host_vars/node01.yml"'},'---\n##########################################################\n# ansible\n\n# NOTE: Address where the node can be reached via SSH.\nansible_host: 192.168.16.10\n\n##########################################################\n# generic\n\ninternal_interface: eno1\n\n# NOTE: The address of the internal interface.\ninternal_address: 192.168.16.10\n\n##########################################################\n# netdata\n\nnetdata_host_type: client\n\n# NOTE: Uncomment this when this node should be a Netdata server.\n\n# netdata_host_type: server\n\n##########################################################\n# network\n\n# NOTE: This is the initial management interface. Further interfaces\n# must be added.\n\nnetwork_type: netplan\nnetwork_ethernets:\n eno1:\n addresses:\n - "192.168.16.10/20"\n gateway4: "192.168.16.1"\n mtu: 1500\n\n##########################################################\n# kolla\n\nnetwork_interface: eno1\n\n# api_interface:\n# bifrost_network_interface:\n# dns_interface:\n# kolla_external_vip_interface:\n# migration_interface:\n# neutron_external_interface:\n# octavia_network_interface:\n# storage_interface:\n# tunnel_interface:\n\n##########################################################\n# ceph\n\n# NOTE: Uncomment this when this node is a part of the Ceph cluster.\n\n# monitor_address:\n# radosgw_address:\n\n# monitor_interface:\n# radosgw_interface:\n\n# NOTE: Uncomment this when this node should be a OSD node.\n\n# devices:\n# - /dev/sdb\n# - /dev/sdc\n# - /dev/sdd\n# - /dev/sde\n')))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7724.5e8ea986.js b/assets/js/7724.5e8ea986.js new file mode 100644 index 0000000000..c95b8d40ba --- /dev/null +++ b/assets/js/7724.5e8ea986.js @@ -0,0 +1,2 @@ +/*! For license information please see 7724.5e8ea986.js.LICENSE.txt */ +(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7724],{84182:function(e,t,n){var r;r=function(e){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var i=t[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=e,n.c=t,n.i=function(e){return e},n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:r})},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=7)}([function(t,n){t.exports=e},function(e,t,n){"use strict";var r=n(0).FDLayoutConstants;function i(){}for(var a in r)i[a]=r[a];i.DEFAULT_USE_MULTI_LEVEL_SCALING=!1,i.DEFAULT_RADIAL_SEPARATION=r.DEFAULT_EDGE_LENGTH,i.DEFAULT_COMPONENT_SEPERATION=60,i.TILE=!0,i.TILING_PADDING_VERTICAL=10,i.TILING_PADDING_HORIZONTAL=10,i.TREE_REDUCTION_ON_INCREMENTAL=!1,e.exports=i},function(e,t,n){"use strict";var r=n(0).FDLayoutEdge;function i(e,t,n){r.call(this,e,t,n)}for(var a in i.prototype=Object.create(r.prototype),r)i[a]=r[a];e.exports=i},function(e,t,n){"use strict";var r=n(0).LGraph;function i(e,t,n){r.call(this,e,t,n)}for(var a in i.prototype=Object.create(r.prototype),r)i[a]=r[a];e.exports=i},function(e,t,n){"use strict";var r=n(0).LGraphManager;function i(e){r.call(this,e)}for(var a in i.prototype=Object.create(r.prototype),r)i[a]=r[a];e.exports=i},function(e,t,n){"use strict";var r=n(0).FDLayoutNode,i=n(0).IMath;function a(e,t,n,i){r.call(this,e,t,n,i)}for(var o in a.prototype=Object.create(r.prototype),r)a[o]=r[o];a.prototype.move=function(){var e=this.graphManager.getLayout();this.displacementX=e.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.noOfChildren,this.displacementY=e.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.noOfChildren,Math.abs(this.displacementX)>e.coolingFactor*e.maxNodeDisplacement&&(this.displacementX=e.coolingFactor*e.maxNodeDisplacement*i.sign(this.displacementX)),Math.abs(this.displacementY)>e.coolingFactor*e.maxNodeDisplacement&&(this.displacementY=e.coolingFactor*e.maxNodeDisplacement*i.sign(this.displacementY)),null==this.child||0==this.child.getNodes().length?this.moveBy(this.displacementX,this.displacementY):this.propogateDisplacementToChildren(this.displacementX,this.displacementY),e.totalDisplacement+=Math.abs(this.displacementX)+Math.abs(this.displacementY),this.springForceX=0,this.springForceY=0,this.repulsionForceX=0,this.repulsionForceY=0,this.gravitationForceX=0,this.gravitationForceY=0,this.displacementX=0,this.displacementY=0},a.prototype.propogateDisplacementToChildren=function(e,t){for(var n,r=this.getChild().getNodes(),i=0;i0)this.positionNodesRadially(e);else{this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var t=new Set(this.getAllNodes()),n=this.nodesWithGravity.filter((function(e){return t.has(e)}));this.graphManager.setAllNodesToApplyGravitation(n),this.positionNodesRandomly()}}return this.initSpringEmbedder(),this.runSpringEmbedder(),!0},m.prototype.tick=function(){if(this.totalIterations++,this.totalIterations===this.maxIterations&&!this.isTreeGrowing&&!this.isGrowthFinished){if(!(this.prunedNodesAll.length>0))return!0;this.isTreeGrowing=!0}if(this.totalIterations%u.CONVERGENCE_CHECK_PERIOD==0&&!this.isTreeGrowing&&!this.isGrowthFinished){if(this.isConverged()){if(!(this.prunedNodesAll.length>0))return!0;this.isTreeGrowing=!0}this.coolingCycle++,0==this.layoutQuality?this.coolingAdjuster=this.coolingCycle:1==this.layoutQuality&&(this.coolingAdjuster=this.coolingCycle/3),this.coolingFactor=Math.max(this.initialCoolingFactor-Math.pow(this.coolingCycle,Math.log(100*(this.initialCoolingFactor-this.finalTemperature))/Math.log(this.maxCoolingCycle))/100*this.coolingAdjuster,this.finalTemperature),this.animationPeriod=Math.ceil(this.initialAnimationPeriod*Math.sqrt(this.coolingFactor))}if(this.isTreeGrowing){if(this.growTreeIterations%10==0)if(this.prunedNodesAll.length>0){this.graphManager.updateBounds(),this.updateGrid(),this.growTree(this.prunedNodesAll),this.graphManager.resetAllNodesToApplyGravitation();var e=new Set(this.getAllNodes()),t=this.nodesWithGravity.filter((function(t){return e.has(t)}));this.graphManager.setAllNodesToApplyGravitation(t),this.graphManager.updateBounds(),this.updateGrid(),this.coolingFactor=u.DEFAULT_COOLING_FACTOR_INCREMENTAL}else this.isTreeGrowing=!1,this.isGrowthFinished=!0;this.growTreeIterations++}if(this.isGrowthFinished){if(this.isConverged())return!0;this.afterGrowthIterations%10==0&&(this.graphManager.updateBounds(),this.updateGrid()),this.coolingFactor=u.DEFAULT_COOLING_FACTOR_INCREMENTAL*((100-this.afterGrowthIterations)/100),this.afterGrowthIterations++}var n=!this.isTreeGrowing&&!this.isGrowthFinished,r=this.growTreeIterations%10==1&&this.isTreeGrowing||this.afterGrowthIterations%10==1&&this.isGrowthFinished;return this.totalDisplacement=0,this.graphManager.updateBounds(),this.calcSpringForces(),this.calcRepulsionForces(n,r),this.calcGravitationalForces(),this.moveNodes(),this.animate(),!1},m.prototype.getPositionsData=function(){for(var e=this.graphManager.getAllNodes(),t={},n=0;n1)for(s=0;sr&&(r=Math.floor(o.y)),a=Math.floor(o.x+l.DEFAULT_COMPONENT_SEPERATION)}this.transform(new d(c.WORLD_CENTER_X-o.x/2,c.WORLD_CENTER_Y-o.y/2))},m.radialLayout=function(e,t,n){var r=Math.max(this.maxDiagonalInTree(e),l.DEFAULT_RADIAL_SEPARATION);m.branchRadialLayout(t,null,0,359,0,r);var i=v.calculateBounds(e),a=new y;a.setDeviceOrgX(i.getMinX()),a.setDeviceOrgY(i.getMinY()),a.setWorldOrgX(n.x),a.setWorldOrgY(n.y);for(var o=0;o1;){var y=v[0];v.splice(0,1);var b=c.indexOf(y);b>=0&&c.splice(b,1),g--,h--}d=null!=t?(c.indexOf(v[0])+1)%g:0;for(var x=Math.abs(r-n)/h,w=d;p!=h;w=++w%g){var E=c[w].getOtherEnd(e);if(E!=t){var T=(n+p*x)%360,_=(T+x)%360;m.branchRadialLayout(E,e,T,_,i+a,a),p++}}},m.maxDiagonalInTree=function(e){for(var t=g.MIN_VALUE,n=0;nt&&(t=r)}return t},m.prototype.calcRepulsionRange=function(){return 2*(this.level+1)*this.idealEdgeLength},m.prototype.groupZeroDegreeMembers=function(){var e=this,t={};this.memberGroups={},this.idToDummyNode={};for(var n=[],r=this.graphManager.getAllNodes(),i=0;i1){var r="DummyCompound_"+n;e.memberGroups[r]=t[n];var i=t[n][0].getParent(),a=new o(e.graphManager);a.id=r,a.paddingLeft=i.paddingLeft||0,a.paddingRight=i.paddingRight||0,a.paddingBottom=i.paddingBottom||0,a.paddingTop=i.paddingTop||0,e.idToDummyNode[r]=a;var s=e.getGraphManager().add(e.newGraph(),a),l=i.getChild();l.add(a);for(var u=0;u=0;e--){var t=this.compoundOrder[e],n=t.id,r=t.paddingLeft,i=t.paddingTop;this.adjustLocations(this.tiledMemberPack[n],t.rect.x,t.rect.y,r,i)}},m.prototype.repopulateZeroDegreeMembers=function(){var e=this,t=this.tiledZeroDegreePack;Object.keys(t).forEach((function(n){var r=e.idToDummyNode[n],i=r.paddingLeft,a=r.paddingTop;e.adjustLocations(t[n],r.rect.x,r.rect.y,i,a)}))},m.prototype.getToBeTiled=function(e){var t=e.id;if(null!=this.toBeTiled[t])return this.toBeTiled[t];var n=e.getChild();if(null==n)return this.toBeTiled[t]=!1,!1;for(var r=n.getNodes(),i=0;i0)return this.toBeTiled[t]=!1,!1;if(null!=a.getChild()){if(!this.getToBeTiled(a))return this.toBeTiled[t]=!1,!1}else this.toBeTiled[a.id]=!1}return this.toBeTiled[t]=!0,!0},m.prototype.getNodeDegree=function(e){e.id;for(var t=e.getEdges(),n=0,r=0;rl&&(l=c.rect.height)}n+=l+e.verticalPadding}},m.prototype.tileCompoundMembers=function(e,t){var n=this;this.tiledMemberPack=[],Object.keys(e).forEach((function(r){var i=t[r];n.tiledMemberPack[r]=n.tileNodes(e[r],i.paddingLeft+i.paddingRight),i.rect.width=n.tiledMemberPack[r].width,i.rect.height=n.tiledMemberPack[r].height}))},m.prototype.tileNodes=function(e,t){var n={rows:[],rowWidth:[],rowHeight:[],width:0,height:t,verticalPadding:l.TILING_PADDING_VERTICAL,horizontalPadding:l.TILING_PADDING_HORIZONTAL};e.sort((function(e,t){return e.rect.width*e.rect.height>t.rect.width*t.rect.height?-1:e.rect.width*e.rect.height0&&(a+=e.horizontalPadding),e.rowWidth[n]=a,e.width0&&(o+=e.verticalPadding);var s=0;o>e.rowHeight[n]&&(s=e.rowHeight[n],e.rowHeight[n]=o,s=e.rowHeight[n]-s),e.height+=s,e.rows[n].push(t)},m.prototype.getShortestRowIndex=function(e){for(var t=-1,n=Number.MAX_VALUE,r=0;rn&&(t=r,n=e.rowWidth[r]);return t},m.prototype.canAddHorizontal=function(e,t,n){var r=this.getShortestRowIndex(e);if(r<0)return!0;var i=e.rowWidth[r];if(i+e.horizontalPadding+t<=e.width)return!0;var a,o,s=0;return e.rowHeight[r]0&&(s=n+e.verticalPadding-e.rowHeight[r]),a=e.width-i>=t+e.horizontalPadding?(e.height+s)/(i+t+e.horizontalPadding):(e.height+s)/e.width,s=n+e.verticalPadding,(o=e.widtha&&t!=n){r.splice(-1,1),e.rows[n].push(i),e.rowWidth[t]=e.rowWidth[t]-a,e.rowWidth[n]=e.rowWidth[n]+a,e.width=e.rowWidth[instance.getLongestRowIndex(e)];for(var o=Number.MIN_VALUE,s=0;so&&(o=r[s].height);t>0&&(o+=e.verticalPadding);var l=e.rowHeight[t]+e.rowHeight[n];e.rowHeight[t]=o,e.rowHeight[n]0)for(var c=i;c<=a;c++)l[0]+=this.grid[c][o-1].length+this.grid[c][o].length-1;if(a0)for(c=o;c<=s;c++)l[3]+=this.grid[i-1][c].length+this.grid[i][c].length-1;for(var h,d,p=g.MAX_VALUE,f=0;f0&&(o=n.getGraphManager().add(n.newGraph(),a),this.processChildrenList(o,h,n))}},h.prototype.stop=function(){return this.stopped=!0,this};var p=function(e){e("layout","cose-bilkent",h)};"undefined"!=typeof cytoscape&&p(cytoscape),e.exports=p}])},e.exports=r(n(84182))},71377:function(e,t,n){e.exports=function(){"use strict";function e(t){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e(t)}function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){for(var n=0;ne.length)&&(t=e.length);for(var n=0,r=new Array(t);nt?1:0},Z=function(e,t){return-1*K(e,t)},Q=null!=Object.assign?Object.assign.bind(Object):function(e){for(var t=arguments,n=1;n1&&(n-=1),n<1/6?e+6*(t-e)*n:n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e}var c=new RegExp("^"+H+"$").exec(e);if(c){if((n=parseInt(c[1]))<0?n=(360- -1*n%360)%360:n>360&&(n%=360),n/=360,(r=parseFloat(c[2]))<0||r>100)return;if(r/=100,(i=parseFloat(c[3]))<0||i>100)return;if(i/=100,void 0!==(a=c[4])&&((a=parseFloat(a))<0||a>1))return;if(0===r)o=s=l=Math.round(255*i);else{var h=i<.5?i*(1+r):i+r-i*r,d=2*i-h;o=Math.round(255*u(d,h,n+1/3)),s=Math.round(255*u(d,h,n)),l=Math.round(255*u(d,h,n-1/3))}t=[o,s,l,a]}return t},te=function(e){var t,n=new RegExp("^"+U+"$").exec(e);if(n){t=[];for(var r=[],i=1;i<=3;i++){var a=n[i];if("%"===a[a.length-1]&&(r[i]=!0),a=parseFloat(a),r[i]&&(a=a/100*255),a<0||a>255)return;t.push(Math.floor(a))}var o=r[1]||r[2]||r[3],s=r[1]&&r[2]&&r[3];if(o&&!s)return;var l=n[4];if(void 0!==l){if((l=parseFloat(l))<0||l>1)return;t.push(l)}}return t},ne=function(e){return ie[e.toLowerCase()]},re=function(e){return(w(e)?e:null)||ne(e)||J(e)||te(e)||ee(e)},ie={transparent:[0,0,0,0],aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],grey:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},ae=function(e){for(var t=e.map,n=e.keys,r=n.length,i=0;i=t||n<0||h&&e-u>=a}function y(){var e=ge();if(v(e))return m(e);s=setTimeout(y,f(e))}function m(e){return s=void 0,d&&r?p(e):(r=i=void 0,o)}function b(){void 0!==s&&clearTimeout(s),u=0,r=l=i=s=void 0}function x(){return void 0===s?o:m(ge())}function w(){var e=ge(),n=v(e);if(r=arguments,i=this,l=e,n){if(void 0===s)return g(l);if(h)return clearTimeout(s),s=setTimeout(y,t),p(l)}return void 0===s&&(s=setTimeout(y,t)),o}return t=qe(t)||0,le(n)&&(c=!!n.leading,a=(h="maxWait"in n)?$e(qe(n.maxWait)||0,t):a,d="trailing"in n?!!n.trailing:d),w.cancel=b,w.flush=x,w}var Qe=Ze,Je=d?d.performance:null,et=Je&&Je.now?function(){return Je.now()}:function(){return Date.now()},tt=function(){if(d){if(d.requestAnimationFrame)return function(e){d.requestAnimationFrame(e)};if(d.mozRequestAnimationFrame)return function(e){d.mozRequestAnimationFrame(e)};if(d.webkitRequestAnimationFrame)return function(e){d.webkitRequestAnimationFrame(e)};if(d.msRequestAnimationFrame)return function(e){d.msRequestAnimationFrame(e)}}return function(e){e&&setTimeout((function(){e(et())}),1e3/60)}}(),nt=function(e){return tt(e)},rt=et,it=9261,at=65599,ot=5381,st=function(e){for(var t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:it;!(t=e.next()).done;)n=n*at+t.value|0;return n},lt=function(e){return(arguments.length>1&&void 0!==arguments[1]?arguments[1]:it)*at+e|0},ut=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:ot;return(t<<5)+t+e|0},ct=function(e,t){return 2097152*e+t},ht=function(e){return 2097152*e[0]+e[1]},dt=function(e,t){return[lt(e[0],t[0]),ut(e[1],t[1])]},pt=function(e,t){var n={value:0,done:!1},r=0,i=e.length;return st({next:function(){return r=0&&(e[r]!==t||(e.splice(r,1),!n));r--);},Rt=function(e){e.splice(0,e.length)},Bt=function(e,t){for(var n=0;n2&&void 0!==arguments[2])||arguments[2];if(void 0!==e&&void 0!==t&&S(e)){var r=t.group;if(null==r&&(r=t.data&&null!=t.data.source&&null!=t.data.target?"edges":"nodes"),"nodes"===r||"edges"===r){this.length=1,this[0]=this;var i=this._private={cy:e,single:!0,data:t.data||{},position:t.position||{x:0,y:0},autoWidth:void 0,autoHeight:void 0,autoPadding:void 0,compoundBoundsClean:!1,listeners:[],group:r,style:{},rstyle:{},styleCxts:[],styleKeys:{},removed:!0,selected:!!t.selected,selectable:void 0===t.selectable||!!t.selectable,locked:!!t.locked,grabbed:!1,grabbable:void 0===t.grabbable||!!t.grabbable,pannable:void 0===t.pannable?"edges"===r:!!t.pannable,active:!1,classes:new Ut,animation:{current:[],queue:[]},rscratch:{},scratch:t.scratch||{},edges:[],children:[],parent:t.parent&&t.parent.isNode()?t.parent:null,traversalCache:{},backgrounding:!1,bbCache:null,bbCacheShift:{x:0,y:0},bodyBounds:null,overlayBounds:null,labelBounds:{all:null,source:null,target:null,main:null},arrowBounds:{source:null,target:null,"mid-source":null,"mid-target":null}};if(null==i.position.x&&(i.position.x=0),null==i.position.y&&(i.position.y=0),t.renderedPosition){var a=t.renderedPosition,o=e.pan(),s=e.zoom();i.position={x:(a.x-o.x)/s,y:(a.y-o.y)/s}}var l=[];w(t.classes)?l=t.classes:b(t.classes)&&(l=t.classes.split(/\s+/));for(var u=0,c=l.length;ut?1:0},u=function(e,t,i,a,o){var s;if(null==i&&(i=0),null==o&&(o=n),i<0)throw new Error("lo must be non-negative");for(null==a&&(a=e.length);in;0<=n?t++:t--)u.push(t);return u}.apply(this).reverse()).length;af;0<=f?++d:--d)v.push(a(e,r));return v},g=function(e,t,r,i){var a,o,s;for(null==i&&(i=n),a=e[r];r>t&&i(a,o=e[s=r-1>>1])<0;)e[r]=o,r=s;return e[r]=a},f=function(e,t,r){var i,a,o,s,l;for(null==r&&(r=n),a=e.length,l=t,o=e[t],i=2*t+1;i0;){var T=y.pop(),_=f(T),D=T.id();if(h[D]=_,_!==1/0)for(var C=T.neighborhood().intersect(p),N=0;N0)for(n.unshift(t);c[i];){var a=c[i];n.unshift(a.edge),n.unshift(a.node),i=(r=a.node).id()}return o.spawn(n)}}}},Qt={kruskal:function(e){e=e||function(e){return 1};for(var t=this.byGroup(),n=t.nodes,r=t.edges,i=n.length,a=new Array(i),o=n,s=function(e){for(var t=0;t0;){if(x(),E++,u===h){for(var T=[],_=i,D=h,C=m[D];T.unshift(_),null!=C&&T.unshift(C),null!=(_=y[D]);)C=m[D=_.id()];return{found:!0,distance:d[u],path:this.spawn(T),steps:E}}g[u]=!0;for(var N=l._private.edges,A=0;AN&&(p[C]=N,y[C]=D,m[C]=w),!i){var A=D*u+_;!i&&p[A]>N&&(p[A]=N,y[A]=_,m[A]=w)}}}for(var L=0;L1&&void 0!==arguments[1]?arguments[1]:a,r=[],i=m(e);;){if(null==i)return t.spawn();var o=y(i),l=o.edge,u=o.pred;if(r.unshift(i[0]),i.same(n)&&r.length>0)break;null!=l&&r.unshift(l),i=u}return s.spawn(r)},E=0;E=0;u--){var c=l[u],h=c[1],d=c[2];(t[h]===o&&t[d]===s||t[h]===s&&t[d]===o)&&l.splice(u,1)}for(var p=0;pr;){var i=Math.floor(Math.random()*t.length);t=sn(i,e,t),n--}return t},un={kargerStein:function(){var e=this,t=this.byGroup(),n=t.nodes,r=t.edges;r.unmergeBy((function(e){return e.isLoop()}));var i=n.length,a=r.length,o=Math.ceil(Math.pow(Math.log(i)/Math.LN2,2)),s=Math.floor(i/on);if(!(i<2)){for(var l=[],u=0;u1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length,r=1/0,i=t;i1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length,r=-1/0,i=t;i1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length,r=0,i=0,a=t;a1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length,r=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],i=!(arguments.length>5&&void 0!==arguments[5])||arguments[5];arguments.length>3&&void 0!==arguments[3]&&!arguments[3]?(n0&&e.splice(0,t)):e=e.slice(t,n);for(var a=0,o=e.length-1;o>=0;o--){var s=e[o];i?isFinite(s)||(e[o]=-1/0,a++):e.splice(o,1)}r&&e.sort((function(e,t){return e-t}));var l=e.length,u=Math.floor(l/2);return l%2!=0?e[u+1+a]:(e[u-1+a]+e[u+a])/2},mn=function(e){return Math.PI*e/180},bn=function(e,t){return Math.atan2(t,e)-Math.PI/2},xn=Math.log2||function(e){return Math.log(e)/Math.log(2)},wn=function(e){return e>0?1:e<0?-1:0},En=function(e,t){return Math.sqrt(Tn(e,t))},Tn=function(e,t){var n=t.x-e.x,r=t.y-e.y;return n*n+r*r},_n=function(e){for(var t=e.length,n=0,r=0;r=e.x1&&e.y2>=e.y1)return{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,w:e.x2-e.x1,h:e.y2-e.y1};if(null!=e.w&&null!=e.h&&e.w>=0&&e.h>=0)return{x1:e.x1,y1:e.y1,x2:e.x1+e.w,y2:e.y1+e.h,w:e.w,h:e.h}}},Sn=function(e){return{x1:e.x1,x2:e.x2,w:e.w,y1:e.y1,y2:e.y2,h:e.h}},On=function(e){e.x1=1/0,e.y1=1/0,e.x2=-1/0,e.y2=-1/0,e.w=0,e.h=0},In=function(e,t){e.x1=Math.min(e.x1,t.x1),e.x2=Math.max(e.x2,t.x2),e.w=e.x2-e.x1,e.y1=Math.min(e.y1,t.y1),e.y2=Math.max(e.y2,t.y2),e.h=e.y2-e.y1},kn=function(e,t,n){e.x1=Math.min(e.x1,t),e.x2=Math.max(e.x2,t),e.w=e.x2-e.x1,e.y1=Math.min(e.y1,n),e.y2=Math.max(e.y2,n),e.h=e.y2-e.y1},Mn=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return e.x1-=t,e.x2+=t,e.y1-=t,e.y2+=t,e.w=e.x2-e.x1,e.h=e.y2-e.y1,e},Pn=function(e){var t,n,r,i,a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[0];if(1===a.length)t=n=r=i=a[0];else if(2===a.length)t=r=a[0],i=n=a[1];else if(4===a.length){var s=o(a,4);t=s[0],n=s[1],r=s[2],i=s[3]}return e.x1-=i,e.x2+=n,e.y1-=t,e.y2+=r,e.w=e.x2-e.x1,e.h=e.y2-e.y1,e},Rn=function(e,t){e.x1=t.x1,e.y1=t.y1,e.x2=t.x2,e.y2=t.y2,e.w=e.x2-e.x1,e.h=e.y2-e.y1},Bn=function(e,t){return!(e.x1>t.x2||t.x1>e.x2||e.x2t.y2||t.y1>e.y2)},Fn=function(e,t,n){return e.x1<=t&&t<=e.x2&&e.y1<=n&&n<=e.y2},zn=function(e,t){return Fn(e,t.x,t.y)},Gn=function(e,t){return Fn(e,t.x1,t.y1)&&Fn(e,t.x2,t.y2)},Yn=function(e,t,n,r,i,a,o){var s,l=cr(i,a),u=i/2,c=a/2,h=r-c-o;if((s=rr(e,t,n,r,n-u+l-o,h,n+u-l+o,h,!1)).length>0)return s;var d=n+u+o;if((s=rr(e,t,n,r,d,r-c+l-o,d,r+c-l+o,!1)).length>0)return s;var p=r+c+o;if((s=rr(e,t,n,r,n-u+l-o,p,n+u-l+o,p,!1)).length>0)return s;var g,f=n-u-o;if((s=rr(e,t,n,r,f,r-c+l-o,f,r+c-l+o,!1)).length>0)return s;var v=n-u+l,y=r-c+l;if((g=tr(e,t,n,r,v,y,l+o)).length>0&&g[0]<=v&&g[1]<=y)return[g[0],g[1]];var m=n+u-l,b=r-c+l;if((g=tr(e,t,n,r,m,b,l+o)).length>0&&g[0]>=m&&g[1]<=b)return[g[0],g[1]];var x=n+u-l,w=r+c-l;if((g=tr(e,t,n,r,x,w,l+o)).length>0&&g[0]>=x&&g[1]>=w)return[g[0],g[1]];var E=n-u+l,T=r+c-l;return(g=tr(e,t,n,r,E,T,l+o)).length>0&&g[0]<=E&&g[1]>=T?[g[0],g[1]]:[]},Xn=function(e,t,n,r,i,a,o){var s=o,l=Math.min(n,i),u=Math.max(n,i),c=Math.min(r,a),h=Math.max(r,a);return l-s<=e&&e<=u+s&&c-s<=t&&t<=h+s},Vn=function(e,t,n,r,i,a,o,s,l){var u={x1:Math.min(n,o,i)-l,x2:Math.max(n,o,i)+l,y1:Math.min(r,s,a)-l,y2:Math.max(r,s,a)+l};return!(eu.x2||tu.y2)},Un=function(e,t,n,r){var i=t*t-4*e*(n-=r);if(i<0)return[];var a=Math.sqrt(i),o=2*e;return[(-t+a)/o,(-t-a)/o]},jn=function(e,t,n,r,i){var a,o,s,l,u,c,h,d;return 0===e&&(e=1e-5),s=-27*(r/=e)+(t/=e)*(9*(n/=e)-t*t*2),a=(o=(3*n-t*t)/9)*o*o+(s/=54)*s,i[1]=0,h=t/3,a>0?(u=(u=s+Math.sqrt(a))<0?-Math.pow(-u,1/3):Math.pow(u,1/3),c=(c=s-Math.sqrt(a))<0?-Math.pow(-c,1/3):Math.pow(c,1/3),i[0]=-h+u+c,h+=(u+c)/2,i[4]=i[2]=-h,h=Math.sqrt(3)*(-c+u)/2,i[3]=h,void(i[5]=-h)):(i[5]=i[3]=0,0===a?(d=s<0?-Math.pow(-s,1/3):Math.pow(s,1/3),i[0]=2*d-h,void(i[4]=i[2]=-(d+h))):(l=(o=-o)*o*o,l=Math.acos(s/Math.sqrt(l)),d=2*Math.sqrt(o),i[0]=-h+d*Math.cos(l/3),i[2]=-h+d*Math.cos((l+2*Math.PI)/3),void(i[4]=-h+d*Math.cos((l+4*Math.PI)/3))))},Hn=function(e,t,n,r,i,a,o,s){var l=[];jn(1*n*n-4*n*i+2*n*o+4*i*i-4*i*o+o*o+r*r-4*r*a+2*r*s+4*a*a-4*a*s+s*s,9*n*i-3*n*n-3*n*o-6*i*i+3*i*o+9*r*a-3*r*r-3*r*s-6*a*a+3*a*s,3*n*n-6*n*i+n*o-n*e+2*i*i+2*i*e-o*e+3*r*r-6*r*a+r*s-r*t+2*a*a+2*a*t-s*t,1*n*i-n*n+n*e-i*e+r*a-r*r+r*t-a*t,l);for(var u=1e-7,c=[],h=0;h<6;h+=2)Math.abs(l[h+1])=0&&l[h]<=1&&c.push(l[h]);c.push(1),c.push(0);for(var d,p,g,f=-1,v=0;v=0?gl?(e-i)*(e-i)+(t-a)*(t-a):u-h},Wn=function(e,t,n){for(var r,i,a,o,s=0,l=0;l=e&&e>=a||r<=e&&e<=a))continue;(e-r)/(a-r)*(o-i)+i>t&&s++}return s%2!=0},$n=function(e,t,n,r,i,a,o,s,l){var u,c=new Array(n.length);null!=s[0]?(u=Math.atan(s[1]/s[0]),s[0]<0?u+=Math.PI/2:u=-u-Math.PI/2):u=s;for(var h,d=Math.cos(-u),p=Math.sin(-u),g=0;g0){var f=Qn(c,-l);h=Zn(f)}else h=c;return Wn(e,t,h)},Kn=function(e,t,n,r,i,a,o){for(var s=new Array(n.length),l=a/2,u=o/2,c=hr(a,o),h=c*c,d=0;d=0&&g<=1&&v.push(g),f>=0&&f<=1&&v.push(f),0===v.length)return[];var y=v[0]*s[0]+e,m=v[0]*s[1]+t;return v.length>1?v[0]==v[1]?[y,m]:[y,m,v[1]*s[0]+e,v[1]*s[1]+t]:[y,m]},nr=function(e,t,n){return t<=e&&e<=n||n<=e&&e<=t?e:e<=t&&t<=n||n<=t&&t<=e?t:n},rr=function(e,t,n,r,i,a,o,s,l){var u=e-i,c=n-e,h=o-i,d=t-a,p=r-t,g=s-a,f=h*d-g*u,v=c*d-p*u,y=g*c-h*p;if(0!==y){var m=f/y,b=v/y,x=.001,w=0-x,E=1+x;return w<=m&&m<=E&&w<=b&&b<=E||l?[e+m*c,t+m*p]:[]}return 0===f||0===v?nr(e,n,o)===o?[o,s]:nr(e,n,i)===i?[i,a]:nr(i,o,n)===n?[n,r]:[]:[]},ir=function(e,t,n,r,i,a,o,s){var l,u,c,h,d,p,g=[],f=new Array(n.length),v=!0;if(null==a&&(v=!1),v){for(var y=0;y0){var m=Qn(f,-s);u=Zn(m)}else u=f}else u=n;for(var b=0;b2){for(var A=[u[0],u[1]],L=Math.pow(A[0]-e,2)+Math.pow(A[1]-t,2),S=1;Su&&(u=t)},get:function(e){return l[e]}},h=0;h0?m.edgesTo(y)[0]:y.edgesTo(m)[0];var x=r(b);y=y.id(),h[y]>h[f]+x&&(h[y]=h[f]+x,d.nodes.indexOf(y)<0?d.push(y):d.updateItem(y),u[y]=0,l[y]=[]),h[y]==h[f]+x&&(u[y]=u[y]+u[f],l[y].push(f))}else for(var w=0;w0;){for(var D=n.pop(),C=0;C0&&o.push(n[s]);0!==o.length&&i.push(r.collection(o))}return i},kr=function(e,t){for(var n=0;n5&&void 0!==arguments[5]?arguments[5]:Br,o=r,s=0;s=2?Vr(e,t,n,0,Gr,Yr):Vr(e,t,n,0,zr)},squaredEuclidean:function(e,t,n){return Vr(e,t,n,0,Gr)},manhattan:function(e,t,n){return Vr(e,t,n,0,zr)},max:function(e,t,n){return Vr(e,t,n,-1/0,Xr)}};function jr(e,t,n,r,i,a){var o;return o=x(e)?e:Ur[e]||Ur.euclidean,0===t&&x(e)?o(i,a):o(t,n,r,i,a)}Ur["squared-euclidean"]=Ur.squaredEuclidean,Ur.squaredeuclidean=Ur.squaredEuclidean;var Hr=Mt({k:2,m:2,sensitivityThreshold:1e-4,distance:"euclidean",maxIterations:10,attributes:[],testMode:!1,testCentroids:null}),qr=function(e){return Hr(e)},Wr=function(e,t,n,r,i){var a="kMedoids"!==i?function(e){return n[e]}:function(e){return r[e](n)},o=function(e){return r[e](t)},s=n,l=t;return jr(e,r.length,a,o,s,l)},$r=function(e,t,n){for(var r=n.length,i=new Array(r),a=new Array(r),o=new Array(t),s=null,l=0;ln)return!1;return!0},ei=function(e,t,n){for(var r=0;ri&&(i=t[l][u],a=u);o[a].push(e[l])}for(var c=0;c=i.threshold||"dendrogram"===i.mode&&1===e.length)return!1;var p,g=t[o],f=t[r[o]];p="dendrogram"===i.mode?{left:g,right:f,key:g.key}:{value:g.value.concat(f.value),key:g.key},e[g.index]=p,e.splice(f.index,1),t[g.key]=p;for(var v=0;vn[f.key][y.key]&&(a=n[f.key][y.key])):"max"===i.linkage?(a=n[g.key][y.key],n[g.key][y.key]0&&r.push(i);return r},Ei=function(e,t,n){for(var r=[],i=0;io&&(a=l,o=t[i*e+l])}a>0&&r.push(a)}for(var u=0;ul&&(s=u,l=c)}n[i]=a[s]}return r=Ei(e,t,n)},_i=function(e){for(var t,n,r,i,a,o,s=this.cy(),l=this.nodes(),u=mi(e),c={},h=0;h=C?(N=C,C=L,A=S):L>N&&(N=L);for(var O=0;O0?1:0;T[E%u.minIterations*t+B]=F,R+=F}if(R>0&&(E>=u.minIterations-1||E==u.maxIterations-1)){for(var z=0,G=0;G1||o>1)&&(u=!0),c[t]=[],e.outgoers().forEach((function(e){e.isEdge()&&c[t].push(e.id())}))}else h[t]=[void 0,e.target().id()]})):l.forEach((function(e){var t=e.id();e.isNode()?(e.degree(!0)%2&&(n?r?u=!0:r=t:n=t),c[t]=[],e.connectedEdges().forEach((function(e){return c[t].push(e.id())}))):h[t]=[e.source().id(),e.target().id()]}));var d={found:!1,trail:void 0};if(u)return d;if(r&&n)if(s){if(i&&r!=i)return d;i=r}else{if(i&&r!=i&&n!=i)return d;i||(i=r)}else i||(i=l[0].id());var p=function(e){for(var t,n,r,i=e,a=[e];c[i].length;)t=c[i].shift(),n=h[t][0],i!=(r=h[t][1])?(c[r]=c[r].filter((function(e){return e!=t})),i=r):s||i==n||(c[n]=c[n].filter((function(e){return e!=t})),i=n),a.unshift(t),a.unshift(i);return a},g=[],f=[];for(f=p(i);1!=f.length;)0==c[f[0]].length?(g.unshift(l.getElementById(f.shift())),g.unshift(l.getElementById(f.shift()))):f=p(f.shift()).concat(f);for(var v in g.unshift(l.getElementById(f.shift())),c)if(c[v].length)return d;return d.found=!0,d.trail=this.spawn(g,!0),d}},Ai=function(){var e=this,t={},n=0,r=0,i=[],a=[],o={},s=function(n,r){for(var o=a.length-1,s=[],l=e.spawn();a[o].x!=n||a[o].y!=r;)s.push(a.pop().edge),o--;s.push(a.pop().edge),s.forEach((function(n){var r=n.connectedNodes().intersection(e);l.merge(n),r.forEach((function(n){var r=n.id(),i=n.connectedEdges().intersection(e);l.merge(n),t[r].cutVertex?l.merge(i.filter((function(e){return e.isLoop()}))):l.merge(i)}))})),i.push(l)},l=function l(u,c,h){u===h&&(r+=1),t[c]={id:n,low:n++,cutVertex:!1};var d,p,g,f,v=e.getElementById(c).connectedEdges().intersection(e);0===v.size()?i.push(e.spawn(e.getElementById(c))):v.forEach((function(e){d=e.source().id(),p=e.target().id(),(g=d===c?p:d)!==h&&(f=e.id(),o[f]||(o[f]=!0,a.push({x:c,y:g,edge:e})),g in t?t[c].low=Math.min(t[c].low,t[g].id):(l(u,g,c),t[c].low=Math.min(t[c].low,t[g].low),t[c].id<=t[g].low&&(t[c].cutVertex=!0,s(c,g))))}))};e.forEach((function(e){if(e.isNode()){var n=e.id();n in t||(r=0,l(n,n),t[n].cutVertex=r>1)}}));var u=Object.keys(t).filter((function(e){return t[e].cutVertex})).map((function(t){return e.getElementById(t)}));return{cut:e.spawn(u),components:i}},Li=function(){var e=this,t={},n=0,r=[],i=[],a=e.spawn(e),o=function o(s){if(i.push(s),t[s]={index:n,low:n++,explored:!1},e.getElementById(s).connectedEdges().intersection(e).forEach((function(e){var n=e.target().id();n!==s&&(n in t||o(n),t[n].explored||(t[s].low=Math.min(t[s].low,t[n].low)))})),t[s].index===t[s].low){for(var l=e.spawn();;){var u=i.pop();if(l.merge(e.getElementById(u)),t[u].low=t[s].index,t[u].explored=!0,u===s)break}var c=l.edgesWith(l),h=l.merge(c);r.push(h),a=a.difference(h)}};return e.forEach((function(e){if(e.isNode()){var n=e.id();n in t||o(n)}})),{cut:a,components:r}},Si={};[qt,Zt,Qt,en,nn,an,un,vr,mr,xr,Er,Rr,si,vi,Di,Ni,{hopcroftTarjanBiconnected:Ai,htbc:Ai,htb:Ai,hopcroftTarjanBiconnectedComponents:Ai},{tarjanStronglyConnected:Li,tsc:Li,tscc:Li,tarjanStronglyConnectedComponents:Li}].forEach((function(e){Q(Si,e)}));var Oi=0,Ii=1,ki=2,Mi=function e(t){if(!(this instanceof e))return new e(t);this.id="Thenable/1.0.7",this.state=Oi,this.fulfillValue=void 0,this.rejectReason=void 0,this.onFulfilled=[],this.onRejected=[],this.proxy={then:this.then.bind(this)},"function"==typeof t&&t.call(this,this.fulfill.bind(this),this.reject.bind(this))};Mi.prototype={fulfill:function(e){return Pi(this,Ii,"fulfillValue",e)},reject:function(e){return Pi(this,ki,"rejectReason",e)},then:function(e,t){var n=this,r=new Mi;return n.onFulfilled.push(Fi(e,r,"fulfill")),n.onRejected.push(Fi(t,r,"reject")),Ri(n),r.proxy}};var Pi=function(e,t,n,r){return e.state===Oi&&(e.state=t,e[n]=r,Ri(e)),e},Ri=function(e){e.state===Ii?Bi(e,"onFulfilled",e.fulfillValue):e.state===ki&&Bi(e,"onRejected",e.rejectReason)},Bi=function(e,t,n){if(0!==e[t].length){var r=e[t];e[t]=[];var i=function(){for(var e=0;e0:void 0}},clearQueue:function(){return function(){var e=this,t=void 0!==e.length?e:[e];if(!(this._private.cy||this).styleEnabled())return this;for(var n=0;n-1}var Za=Ka;function Qa(e,t){var n=this.__data__,r=Ua(n,e);return r<0?(++this.size,n.push([e,t])):n[r][1]=t,this}var Ja=Qa;function eo(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t-1&&e%1==0&&e0&&this.spawn(r).updateStyle().emit("class"),t},addClass:function(e){return this.toggleClass(e,!0)},hasClass:function(e){var t=this[0];return null!=t&&t._private.classes.has(e)},toggleClass:function(e,t){w(e)||(e=e.match(/\S+/g)||[]);for(var n=this,r=void 0===t,i=[],a=0,o=n.length;a0&&this.spawn(i).updateStyle().emit("class"),n},removeClass:function(e){return this.toggleClass(e,!1)},flashClass:function(e,t){var n=this;if(null==t)t=250;else if(0===t)return n;return n.addClass(e),setTimeout((function(){n.removeClass(e)}),t),n}};ps.className=ps.classNames=ps.classes;var gs={metaChar:"[\\!\\\"\\#\\$\\%\\&\\'\\(\\)\\*\\+\\,\\.\\/\\:\\;\\<\\=\\>\\?\\@\\[\\]\\^\\`\\{\\|\\}\\~]",comparatorOp:"=|\\!=|>|>=|<|<=|\\$=|\\^=|\\*=",boolOp:"\\?|\\!|\\^",string:"\"(?:\\\\\"|[^\"])*\"|'(?:\\\\'|[^'])*'",number:V,meta:"degree|indegree|outdegree",separator:"\\s*,\\s*",descendant:"\\s+",child:"\\s+>\\s+",subject:"\\$",group:"node|edge|\\*",directedEdge:"\\s+->\\s+",undirectedEdge:"\\s+<->\\s+"};gs.variable="(?:[\\w-.]|(?:\\\\"+gs.metaChar+"))+",gs.className="(?:[\\w-]|(?:\\\\"+gs.metaChar+"))+",gs.value=gs.string+"|"+gs.number,gs.id=gs.variable,function(){var e,t,n;for(e=gs.comparatorOp.split("|"),n=0;n=0||"="!==t&&(gs.comparatorOp+="|\\!"+t)}();var fs=function(){return{checks:[]}},vs={GROUP:0,COLLECTION:1,FILTER:2,DATA_COMPARE:3,DATA_EXIST:4,DATA_BOOL:5,META_COMPARE:6,STATE:7,ID:8,CLASS:9,UNDIRECTED_EDGE:10,DIRECTED_EDGE:11,NODE_SOURCE:12,NODE_TARGET:13,NODE_NEIGHBOR:14,CHILD:15,DESCENDANT:16,PARENT:17,ANCESTOR:18,COMPOUND_SPLIT:19,TRUE:20},ys=[{selector:":selected",matches:function(e){return e.selected()}},{selector:":unselected",matches:function(e){return!e.selected()}},{selector:":selectable",matches:function(e){return e.selectable()}},{selector:":unselectable",matches:function(e){return!e.selectable()}},{selector:":locked",matches:function(e){return e.locked()}},{selector:":unlocked",matches:function(e){return!e.locked()}},{selector:":visible",matches:function(e){return e.visible()}},{selector:":hidden",matches:function(e){return!e.visible()}},{selector:":transparent",matches:function(e){return e.transparent()}},{selector:":grabbed",matches:function(e){return e.grabbed()}},{selector:":free",matches:function(e){return!e.grabbed()}},{selector:":removed",matches:function(e){return e.removed()}},{selector:":inside",matches:function(e){return!e.removed()}},{selector:":grabbable",matches:function(e){return e.grabbable()}},{selector:":ungrabbable",matches:function(e){return!e.grabbable()}},{selector:":animated",matches:function(e){return e.animated()}},{selector:":unanimated",matches:function(e){return!e.animated()}},{selector:":parent",matches:function(e){return e.isParent()}},{selector:":childless",matches:function(e){return e.isChildless()}},{selector:":child",matches:function(e){return e.isChild()}},{selector:":orphan",matches:function(e){return e.isOrphan()}},{selector:":nonorphan",matches:function(e){return e.isChild()}},{selector:":compound",matches:function(e){return e.isNode()?e.isParent():e.source().isParent()||e.target().isParent()}},{selector:":loop",matches:function(e){return e.isLoop()}},{selector:":simple",matches:function(e){return e.isSimple()}},{selector:":active",matches:function(e){return e.active()}},{selector:":inactive",matches:function(e){return!e.active()}},{selector:":backgrounding",matches:function(e){return e.backgrounding()}},{selector:":nonbackgrounding",matches:function(e){return!e.backgrounding()}}].sort((function(e,t){return Z(e.selector,t.selector)})),ms=function(){for(var e,t={},n=0;n0&&u.edgeCount>0)return Nt("The selector `"+e+"` is invalid because it uses both a compound selector and an edge selector"),!1;if(u.edgeCount>1)return Nt("The selector `"+e+"` is invalid because it uses multiple edge selectors"),!1;1===u.edgeCount&&Nt("The selector `"+e+"` is deprecated. Edge selectors do not take effect on changes to source and target nodes after an edge is added, for performance reasons. Use a class or data selector on edges instead, updating the class or data of an edge when your app detects a change in source or target nodes.")}return!0},toString:function(){if(null!=this.toStringCache)return this.toStringCache;for(var e=function(e){return null==e?"":e},t=function(t){return b(t)?'"'+t+'"':e(t)},n=function(e){return" "+e+" "},r=function(r,a){var o=r.type,s=r.value;switch(o){case vs.GROUP:var l=e(s);return l.substring(0,l.length-1);case vs.DATA_COMPARE:var u=r.field,c=r.operator;return"["+u+n(e(c))+t(s)+"]";case vs.DATA_BOOL:var h=r.operator,d=r.field;return"["+e(h)+d+"]";case vs.DATA_EXIST:return"["+r.field+"]";case vs.META_COMPARE:var p=r.operator;return"[["+r.field+n(e(p))+t(s)+"]]";case vs.STATE:return s;case vs.ID:return"#"+s;case vs.CLASS:return"."+s;case vs.PARENT:case vs.CHILD:return i(r.parent,a)+n(">")+i(r.child,a);case vs.ANCESTOR:case vs.DESCENDANT:return i(r.ancestor,a)+" "+i(r.descendant,a);case vs.COMPOUND_SPLIT:var g=i(r.left,a),f=i(r.subject,a),v=i(r.right,a);return g+(g.length>0?" ":"")+f+v;case vs.TRUE:return""}},i=function(e,t){return e.checks.reduce((function(n,i,a){return n+(t===e&&0===a?"$":"")+r(i,t)}),"")},a="",o=0;o1&&o=0&&(t=t.replace("!",""),c=!0),t.indexOf("@")>=0&&(t=t.replace("@",""),u=!0),(o||l||u)&&(i=o||s?""+e:"",a=""+n),u&&(e=i=i.toLowerCase(),n=a=a.toLowerCase()),t){case"*=":r=i.indexOf(a)>=0;break;case"$=":r=i.indexOf(a,i.length-a.length)>=0;break;case"^=":r=0===i.indexOf(a);break;case"=":r=e===n;break;case">":h=!0,r=e>n;break;case">=":h=!0,r=e>=n;break;case"<":h=!0,r=e0;){var u=i.shift();t(u),a.add(u.id()),o&&r(i,a,u)}return e}function Vs(e,t,n){if(n.isParent())for(var r=n._private.children,i=0;i1&&void 0!==arguments[1])||arguments[1],Vs)},Ys.forEachUp=function(e){return Xs(this,e,!(arguments.length>1&&void 0!==arguments[1])||arguments[1],Us)},Ys.forEachUpAndDown=function(e){return Xs(this,e,!(arguments.length>1&&void 0!==arguments[1])||arguments[1],js)},Ys.ancestors=Ys.parents,(Fs=zs={data:hs.data({field:"data",bindingEvent:"data",allowBinding:!0,allowSetting:!0,settingEvent:"data",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,immutableKeys:{id:!0,source:!0,target:!0,parent:!0},updateStyle:!0}),removeData:hs.removeData({field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!0,immutableKeys:{id:!0,source:!0,target:!0,parent:!0},updateStyle:!0}),scratch:hs.data({field:"scratch",bindingEvent:"scratch",allowBinding:!0,allowSetting:!0,settingEvent:"scratch",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeScratch:hs.removeData({field:"scratch",event:"scratch",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0}),rscratch:hs.data({field:"rscratch",allowBinding:!1,allowSetting:!0,settingTriggersEvent:!1,allowGetting:!0}),removeRscratch:hs.removeData({field:"rscratch",triggerEvent:!1}),id:function(){var e=this[0];if(e)return e._private.data.id}}).attr=Fs.data,Fs.removeAttr=Fs.removeData;var Hs,qs,Ws=zs,$s={};function Ks(e){return function(t){var n=this;if(void 0===t&&(t=!0),0!==n.length&&n.isNode()&&!n.removed()){for(var r=0,i=n[0],a=i._private.edges,o=0;ot})),minIndegree:Zs("indegree",(function(e,t){return et})),minOutdegree:Zs("outdegree",(function(e,t){return et}))}),Q($s,{totalDegree:function(e){for(var t=0,n=this.nodes(),r=0;r0,c=u;u&&(l=l[0]);var h=c?l.position():{x:0,y:0};return i={x:s.x-h.x,y:s.y-h.y},void 0===e?i:i[e]}for(var d=0;d0,v=f;f&&(g=g[0]);var y=v?g.position():{x:0,y:0};void 0!==t?p.position(e,t+y[e]):void 0!==i&&p.position({x:i.x+y.x,y:i.y+y.y})}}else if(!a)return;return this}}).modelPosition=Hs.point=Hs.position,Hs.modelPositions=Hs.points=Hs.positions,Hs.renderedPoint=Hs.renderedPosition,Hs.relativePoint=Hs.relativePosition;var el,tl,nl=qs;el=tl={},tl.renderedBoundingBox=function(e){var t=this.boundingBox(e),n=this.cy(),r=n.zoom(),i=n.pan(),a=t.x1*r+i.x,o=t.x2*r+i.x,s=t.y1*r+i.y,l=t.y2*r+i.y;return{x1:a,x2:o,y1:s,y2:l,w:o-a,h:l-s}},tl.dirtyCompoundBoundsCache=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=this.cy();return t.styleEnabled()&&t.hasCompoundNodes()?(this.forEachUp((function(t){if(t.isParent()){var n=t._private;n.compoundBoundsClean=!1,n.bbCache=null,e||t.emitAndNotify("bounds")}})),this):this},tl.updateCompoundBounds=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=this.cy();if(!t.styleEnabled()||!t.hasCompoundNodes())return this;if(!e&&t.batching())return this;function n(e){if(e.isParent()){var t=e._private,n=e.children(),r="include"===e.pstyle("compound-sizing-wrt-labels").value,i={width:{val:e.pstyle("min-width").pfValue,left:e.pstyle("min-width-bias-left"),right:e.pstyle("min-width-bias-right")},height:{val:e.pstyle("min-height").pfValue,top:e.pstyle("min-height-bias-top"),bottom:e.pstyle("min-height-bias-bottom")}},a=n.boundingBox({includeLabels:r,includeOverlays:!1,useCache:!1}),o=t.position;0!==a.w&&0!==a.h||((a={w:e.pstyle("width").pfValue,h:e.pstyle("height").pfValue}).x1=o.x-a.w/2,a.x2=o.x+a.w/2,a.y1=o.y-a.h/2,a.y2=o.y+a.h/2);var s=i.width.left.value;"px"===i.width.left.units&&i.width.val>0&&(s=100*s/i.width.val);var l=i.width.right.value;"px"===i.width.right.units&&i.width.val>0&&(l=100*l/i.width.val);var u=i.height.top.value;"px"===i.height.top.units&&i.height.val>0&&(u=100*u/i.height.val);var c=i.height.bottom.value;"px"===i.height.bottom.units&&i.height.val>0&&(c=100*c/i.height.val);var h=y(i.width.val-a.w,s,l),d=h.biasDiff,p=h.biasComplementDiff,g=y(i.height.val-a.h,u,c),f=g.biasDiff,v=g.biasComplementDiff;t.autoPadding=m(a.w,a.h,e.pstyle("padding"),e.pstyle("padding-relative-to").value),t.autoWidth=Math.max(a.w,i.width.val),o.x=(-d+a.x1+a.x2+p)/2,t.autoHeight=Math.max(a.h,i.height.val),o.y=(-f+a.y1+a.y2+v)/2}function y(e,t,n){var r=0,i=0,a=t+n;return e>0&&a>0&&(r=t/a*e,i=n/a*e),{biasDiff:r,biasComplementDiff:i}}function m(e,t,n,r){if("%"!==n.units)return"px"===n.units?n.pfValue:0;switch(r){case"width":return e>0?n.pfValue*e:0;case"height":return t>0?n.pfValue*t:0;case"average":return e>0&&t>0?n.pfValue*(e+t)/2:0;case"min":return e>0&&t>0?e>t?n.pfValue*t:n.pfValue*e:0;case"max":return e>0&&t>0?e>t?n.pfValue*e:n.pfValue*t:0;default:return 0}}}for(var r=0;re.x2?r:e.x2,e.y1=ne.y2?i:e.y2,e.w=e.x2-e.x1,e.h=e.y2-e.y1)},al=function(e,t){return null==t?e:il(e,t.x1,t.y1,t.x2,t.y2)},ol=function(e,t,n){return Ft(e,t,n)},sl=function(e,t,n){if(!t.cy().headless()){var r,i,a=t._private,o=a.rstyle,s=o.arrowWidth/2;if("none"!==t.pstyle(n+"-arrow-shape").value){"source"===n?(r=o.srcX,i=o.srcY):"target"===n?(r=o.tgtX,i=o.tgtY):(r=o.midX,i=o.midY);var l=a.arrowBounds=a.arrowBounds||{},u=l[n]=l[n]||{};u.x1=r-s,u.y1=i-s,u.x2=r+s,u.y2=i+s,u.w=u.x2-u.x1,u.h=u.y2-u.y1,Mn(u,1),il(e,u.x1,u.y1,u.x2,u.y2)}}},ll=function(e,t,n){if(!t.cy().headless()){var r;r=n?n+"-":"";var i=t._private,a=i.rstyle;if(t.pstyle(r+"label").strValue){var o,s,l,u,c=t.pstyle("text-halign"),h=t.pstyle("text-valign"),d=ol(a,"labelWidth",n),p=ol(a,"labelHeight",n),g=ol(a,"labelX",n),f=ol(a,"labelY",n),v=t.pstyle(r+"text-margin-x").pfValue,y=t.pstyle(r+"text-margin-y").pfValue,m=t.isEdge(),b=t.pstyle(r+"text-rotation"),x=t.pstyle("text-outline-width").pfValue,w=t.pstyle("text-border-width").pfValue/2,E=t.pstyle("text-background-padding").pfValue,T=2,_=p,D=d,C=D/2,N=_/2;if(m)o=g-C,s=g+C,l=f-N,u=f+N;else{switch(c.value){case"left":o=g-D,s=g;break;case"center":o=g-C,s=g+C;break;case"right":o=g,s=g+D}switch(h.value){case"top":l=f-_,u=f;break;case"center":l=f-N,u=f+N;break;case"bottom":l=f,u=f+_}}o+=v-Math.max(x,w)-E-T,s+=v+Math.max(x,w)+E+T,l+=y-Math.max(x,w)-E-T,u+=y+Math.max(x,w)+E+T;var A=n||"main",L=i.labelBounds,S=L[A]=L[A]||{};S.x1=o,S.y1=l,S.x2=s,S.y2=u,S.w=s-o,S.h=u-l;var O=m&&"autorotate"===b.strValue,I=null!=b.pfValue&&0!==b.pfValue;if(O||I){var k=O?ol(i.rstyle,"labelAngle",n):b.pfValue,M=Math.cos(k),P=Math.sin(k),R=(o+s)/2,B=(l+u)/2;if(!m){switch(c.value){case"left":R=s;break;case"right":R=o}switch(h.value){case"top":B=u;break;case"bottom":B=l}}var F=function(e,t){return{x:(e-=R)*M-(t-=B)*P+R,y:e*P+t*M+B}},z=F(o,l),G=F(o,u),Y=F(s,l),X=F(s,u);o=Math.min(z.x,G.x,Y.x,X.x),s=Math.max(z.x,G.x,Y.x,X.x),l=Math.min(z.y,G.y,Y.y,X.y),u=Math.max(z.y,G.y,Y.y,X.y)}var V=A+"Rot",U=L[V]=L[V]||{};U.x1=o,U.y1=l,U.x2=s,U.y2=u,U.w=s-o,U.h=u-l,il(e,o,l,s,u),il(i.labelBounds.all,o,l,s,u)}return e}},ul=function(e,t){var n,r,i,a,o,s,l=e._private.cy,u=l.styleEnabled(),c=l.headless(),h=Ln(),d=e._private,p=e.isNode(),g=e.isEdge(),f=d.rstyle,v=p&&u?e.pstyle("bounds-expansion").pfValue:[0],y=function(e){return"none"!==e.pstyle("display").value},m=!u||y(e)&&(!g||y(e.source())&&y(e.target()));if(m){var b=0;u&&t.includeOverlays&&0!==e.pstyle("overlay-opacity").value&&(b=e.pstyle("overlay-padding").value);var x=0;u&&t.includeUnderlays&&0!==e.pstyle("underlay-opacity").value&&(x=e.pstyle("underlay-padding").value);var w=Math.max(b,x),E=0;if(u&&(E=e.pstyle("width").pfValue/2),p&&t.includeNodes){var T=e.position();o=T.x,s=T.y;var _=e.outerWidth()/2,D=e.outerHeight()/2;il(h,n=o-_,i=s-D,r=o+_,a=s+D)}else if(g&&t.includeEdges)if(u&&!c){var C=e.pstyle("curve-style").strValue;if(n=Math.min(f.srcX,f.midX,f.tgtX),r=Math.max(f.srcX,f.midX,f.tgtX),i=Math.min(f.srcY,f.midY,f.tgtY),a=Math.max(f.srcY,f.midY,f.tgtY),il(h,n-=E,i-=E,r+=E,a+=E),"haystack"===C){var N=f.haystackPts;if(N&&2===N.length){if(n=N[0].x,i=N[0].y,n>(r=N[1].x)){var A=n;n=r,r=A}if(i>(a=N[1].y)){var L=i;i=a,a=L}il(h,n-E,i-E,r+E,a+E)}}else if("bezier"===C||"unbundled-bezier"===C||"segments"===C||"taxi"===C){var S;switch(C){case"bezier":case"unbundled-bezier":S=f.bezierPts;break;case"segments":case"taxi":S=f.linePts}if(null!=S)for(var O=0;O(r=M.x)){var P=n;n=r,r=P}if((i=k.y)>(a=M.y)){var R=i;i=a,a=R}il(h,n-=E,i-=E,r+=E,a+=E)}if(u&&t.includeEdges&&g&&(sl(h,e,"mid-source"),sl(h,e,"mid-target"),sl(h,e,"source"),sl(h,e,"target")),u&&"yes"===e.pstyle("ghost").value){var B=e.pstyle("ghost-offset-x").pfValue,F=e.pstyle("ghost-offset-y").pfValue;il(h,h.x1+B,h.y1+F,h.x2+B,h.y2+F)}var z=d.bodyBounds=d.bodyBounds||{};Rn(z,h),Pn(z,v),Mn(z,1),u&&(n=h.x1,r=h.x2,i=h.y1,a=h.y2,il(h,n-w,i-w,r+w,a+w));var G=d.overlayBounds=d.overlayBounds||{};Rn(G,h),Pn(G,v),Mn(G,1);var Y=d.labelBounds=d.labelBounds||{};null!=Y.all?On(Y.all):Y.all=Ln(),u&&t.includeLabels&&(t.includeMainLabels&&ll(h,e,null),g&&(t.includeSourceLabels&&ll(h,e,"source"),t.includeTargetLabels&&ll(h,e,"target")))}return h.x1=rl(h.x1),h.y1=rl(h.y1),h.x2=rl(h.x2),h.y2=rl(h.y2),h.w=rl(h.x2-h.x1),h.h=rl(h.y2-h.y1),h.w>0&&h.h>0&&m&&(Pn(h,v),Mn(h,1)),h},cl=function(e){var t=0,n=function(e){return(e?1:0)<0&&void 0!==arguments[0]?arguments[0]:Pl,t=arguments.length>1?arguments[1]:void 0,n=0;n=0;s--)o(s);return this},Bl.removeAllListeners=function(){return this.removeListener("*")},Bl.emit=Bl.trigger=function(e,t,n){var r=this.listeners,i=r.length;return this.emitting++,w(t)||(t=[t]),Gl(this,(function(e,a){null!=n&&(r=[{event:a.event,type:a.type,namespace:a.namespace,callback:n}],i=r.length);for(var o=function(n){var i=r[n];if(i.type===a.type&&(!i.namespace||i.namespace===a.namespace||i.namespace===Il)&&e.eventMatches(e.context,i,a)){var o=[a];null!=t&&Bt(o,t),e.beforeEmit(e.context,i,a),i.conf&&i.conf.one&&(e.listeners=e.listeners.filter((function(e){return e!==i})));var s=e.callbackContext(e.context,i,a),l=i.callback.apply(s,o);e.afterEmit(e.context,i,a),!1===l&&(a.stopPropagation(),a.preventDefault())}},s=0;s1&&!r){var i=this.length-1,a=this[i],o=a._private.data.id;this[i]=void 0,this[e]=a,n.set(o,{ele:a,index:e})}return this.length--,this},unmergeOne:function(e){e=e[0];var t=this._private,n=e._private.data.id,r=t.map.get(n);if(!r)return this;var i=r.index;return this.unmergeAt(i),this},unmerge:function(e){var t=this._private.cy;if(!e)return this;if(e&&b(e)){var n=e;e=t.mutableElements().filter(n)}for(var r=0;r=0;t--)e(this[t])&&this.unmergeAt(t);return this},map:function(e,t){for(var n=[],r=this,i=0;ir&&(r=s,n=o)}return{value:r,ele:n}},min:function(e,t){for(var n,r=1/0,i=this,a=0;a=0&&i1&&void 0!==arguments[1])||arguments[1],n=this[0],r=n.cy();if(r.styleEnabled()&&n){this.cleanStyle();var i=n._private.style[e];return null!=i?i:t?r.style().getDefaultProperty(e):null}},numericStyle:function(e){var t=this[0];if(t.cy().styleEnabled()&&t){var n=t.pstyle(e);return void 0!==n.pfValue?n.pfValue:n.value}},numericStyleUnits:function(e){var t=this[0];if(t.cy().styleEnabled())return t?t.pstyle(e).units:void 0},renderedStyle:function(e){var t=this.cy();if(!t.styleEnabled())return this;var n=this[0];return n?t.style().getRenderedStyle(n,e):void 0},style:function(e,t){var n=this.cy();if(!n.styleEnabled())return this;var r=!1,i=n.style();if(E(e)){var a=e;i.applyBypass(this,a,r),this.emitAndNotify("style")}else if(b(e)){if(void 0===t){var o=this[0];return o?i.getStylePropertyValue(o,e):void 0}i.applyBypass(this,e,t,r),this.emitAndNotify("style")}else if(void 0===e){var s=this[0];return s?i.getRawStyle(s):void 0}return this},removeStyle:function(e){var t=this.cy();if(!t.styleEnabled())return this;var n=!1,r=t.style(),i=this;if(void 0===e)for(var a=0;a0&&t.push(c[0]),t.push(s[0])}return this.spawn(t,!0).filter(e)}),"neighborhood"),closedNeighborhood:function(e){return this.neighborhood().add(this).filter(e)},openNeighborhood:function(e){return this.neighborhood(e)}}),du.neighbourhood=du.neighborhood,du.closedNeighbourhood=du.closedNeighborhood,du.openNeighbourhood=du.openNeighborhood,Q(du,{source:Gs((function(e){var t,n=this[0];return n&&(t=n._private.source||n.cy().collection()),t&&e?t.filter(e):t}),"source"),target:Gs((function(e){var t,n=this[0];return n&&(t=n._private.target||n.cy().collection()),t&&e?t.filter(e):t}),"target"),sources:vu({attr:"source"}),targets:vu({attr:"target"})}),Q(du,{edgesWith:Gs(yu(),"edgesWith"),edgesTo:Gs(yu({thisIsSrc:!0}),"edgesTo")}),Q(du,{connectedEdges:Gs((function(e){for(var t=[],n=this,r=0;r0);return a},component:function(){var e=this[0];return e.cy().mutableElements().components(e)[0]}}),du.componentsOf=du.components;var bu=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],r=arguments.length>3&&void 0!==arguments[3]&&arguments[3];if(void 0!==e){var i=new Yt,a=!1;if(t){if(t.length>0&&E(t[0])&&!A(t[0])){a=!0;for(var o=[],s=new Ut,l=0,u=t.length;l0&&void 0!==arguments[0])||arguments[0],r=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=this,a=i.cy(),o=a._private,s=[],l=[],u=0,c=i.length;u0){for(var B=e.length===i.length?i:new bu(a,e),F=0;F0&&void 0!==arguments[0])||arguments[0],t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=this,r=[],i={},a=n._private.cy;function o(e){for(var t=e._private.edges,n=0;n0&&(e?D.emitAndNotify("remove"):t&&D.emit("remove"));for(var C=0;C0?i=l:r=l}while(Math.abs(a)>o&&++u=a?m(t,s):0===c?s:x(t,r,r+u)}var E=!1;function T(){E=!0,e===t&&n===r||b()}var _=function(i){return E||T(),e===t&&n===r?i:0===i?0:1===i?1:v(w(i),t,r)};_.getControlPoints=function(){return[{x:e,y:t},{x:n,y:r}]};var D="generateBezier("+[e,t,n,r]+")";return _.toString=function(){return D},_}var Tu=function(){function e(e){return-e.tension*e.x-e.friction*e.v}function t(t,n,r){var i={x:t.x+r.dx*n,v:t.v+r.dv*n,tension:t.tension,friction:t.friction};return{dx:i.v,dv:e(i)}}function n(n,r){var i={dx:n.v,dv:e(n)},a=t(n,.5*r,i),o=t(n,.5*r,a),s=t(n,r,o),l=1/6*(i.dx+2*(a.dx+o.dx)+s.dx),u=1/6*(i.dv+2*(a.dv+o.dv)+s.dv);return n.x=n.x+l*r,n.v=n.v+u*r,n}return function e(t,r,i){var a,o,s,l={x:-1,v:0,tension:null,friction:null},u=[0],c=0,h=1e-4,d=.016;for(t=parseFloat(t)||500,r=parseFloat(r)||20,i=i||null,l.tension=t,l.friction=r,o=(a=null!==i)?(c=e(t,r))/i*d:d;s=n(s||l,o),u.push(1+s.x),c+=16,Math.abs(s.x)>h&&Math.abs(s.v)>h;);return a?function(e){return u[e*(u.length-1)|0]}:c}}(),_u=function(e,t,n,r){var i=Eu(e,t,n,r);return function(e,t,n){return e+(t-e)*i(n)}},Du={linear:function(e,t,n){return e+(t-e)*n},ease:_u(.25,.1,.25,1),"ease-in":_u(.42,0,1,1),"ease-out":_u(0,0,.58,1),"ease-in-out":_u(.42,0,.58,1),"ease-in-sine":_u(.47,0,.745,.715),"ease-out-sine":_u(.39,.575,.565,1),"ease-in-out-sine":_u(.445,.05,.55,.95),"ease-in-quad":_u(.55,.085,.68,.53),"ease-out-quad":_u(.25,.46,.45,.94),"ease-in-out-quad":_u(.455,.03,.515,.955),"ease-in-cubic":_u(.55,.055,.675,.19),"ease-out-cubic":_u(.215,.61,.355,1),"ease-in-out-cubic":_u(.645,.045,.355,1),"ease-in-quart":_u(.895,.03,.685,.22),"ease-out-quart":_u(.165,.84,.44,1),"ease-in-out-quart":_u(.77,0,.175,1),"ease-in-quint":_u(.755,.05,.855,.06),"ease-out-quint":_u(.23,1,.32,1),"ease-in-out-quint":_u(.86,0,.07,1),"ease-in-expo":_u(.95,.05,.795,.035),"ease-out-expo":_u(.19,1,.22,1),"ease-in-out-expo":_u(1,0,0,1),"ease-in-circ":_u(.6,.04,.98,.335),"ease-out-circ":_u(.075,.82,.165,1),"ease-in-out-circ":_u(.785,.135,.15,.86),spring:function(e,t,n){if(0===n)return Du.linear;var r=Tu(e,t,n);return function(e,t,n){return e+(t-e)*r(n)}},"cubic-bezier":_u};function Cu(e,t,n,r,i){if(1===r)return n;if(t===n)return n;var a=i(t,n,r);return null==e||((e.roundValue||e.color)&&(a=Math.round(a)),void 0!==e.min&&(a=Math.max(a,e.min)),void 0!==e.max&&(a=Math.min(a,e.max))),a}function Nu(e,t){return null!=e.pfValue||null!=e.value?null==e.pfValue||null!=t&&"%"===t.type.units?e.value:e.pfValue:e}function Au(e,t,n,r,i){var a=null!=i?i.type:null;n<0?n=0:n>1&&(n=1);var o=Nu(e,i),s=Nu(t,i);if(_(o)&&_(s))return Cu(a,o,s,n,r);if(w(o)&&w(s)){for(var l=[],u=0;u0?("spring"===h&&d.push(o.duration),o.easingImpl=Du[h].apply(null,d)):o.easingImpl=Du[h]}var p,g=o.easingImpl;if(p=0===o.duration?1:(n-l)/o.duration,o.applying&&(p=o.progress),p<0?p=0:p>1&&(p=1),null==o.delay){var f=o.startPosition,v=o.position;if(v&&i&&!e.locked()){var y={};Su(f.x,v.x)&&(y.x=Au(f.x,v.x,p,g)),Su(f.y,v.y)&&(y.y=Au(f.y,v.y,p,g)),e.position(y)}var m=o.startPan,x=o.pan,w=a.pan,E=null!=x&&r;E&&(Su(m.x,x.x)&&(w.x=Au(m.x,x.x,p,g)),Su(m.y,x.y)&&(w.y=Au(m.y,x.y,p,g)),e.emit("pan"));var T=o.startZoom,_=o.zoom,D=null!=_&&r;D&&(Su(T,_)&&(a.zoom=An(a.minZoom,Au(T,_,p,g),a.maxZoom)),e.emit("zoom")),(E||D)&&e.emit("viewport");var C=o.style;if(C&&C.length>0&&i){for(var N=0;N=0;t--)(0,e[t])();e.splice(0,e.length)},c=a.length-1;c>=0;c--){var h=a[c],d=h._private;d.stopped?(a.splice(c,1),d.hooked=!1,d.playing=!1,d.started=!1,u(d.frames)):(d.playing||d.applying)&&(d.playing&&d.applying&&(d.applying=!1),d.started||Ou(t,h,e),Lu(t,h,e,n),d.applying&&(d.applying=!1),u(d.frames),null!=d.step&&d.step(e),h.completed()&&(a.splice(c,1),d.hooked=!1,d.playing=!1,d.started=!1,u(d.completes)),s=!0)}return n||0!==a.length||0!==o.length||r.push(t),s}for(var a=!1,o=0;o0?t.notify("draw",n):t.notify("draw")),n.unmerge(r),t.emit("step")}var ku={animate:hs.animate(),animation:hs.animation(),animated:hs.animated(),clearQueue:hs.clearQueue(),delay:hs.delay(),delayAnimation:hs.delayAnimation(),stop:hs.stop(),addToAnimationPool:function(e){var t=this;t.styleEnabled()&&t._private.aniEles.merge(e)},stopAnimationLoop:function(){this._private.animationsRunning=!1},startAnimationLoop:function(){var e=this;if(e._private.animationsRunning=!0,e.styleEnabled()){var t=e.renderer();t&&t.beforeRender?t.beforeRender((function(t,n){Iu(n,e)}),t.beforeRenderPriorities.animations):n()}function n(){e._private.animationsRunning&&nt((function(t){Iu(t,e),n()}))}}},Mu={qualifierCompare:function(e,t){return null==e||null==t?null==e&&null==t:e.sameText(t)},eventMatches:function(e,t,n){var r=t.qualifier;return null==r||e!==n.target&&A(n.target)&&r.matches(n.target)},addEventFields:function(e,t){t.cy=e,t.target=e},callbackContext:function(e,t,n){return null!=t.qualifier?n.target:e}},Pu=function(e){return b(e)?new Ps(e):e},Ru={createEmitter:function(){var e=this._private;return e.emitter||(e.emitter=new Rl(Mu,this)),this},emitter:function(){return this._private.emitter},on:function(e,t,n){return this.emitter().on(e,Pu(t),n),this},removeListener:function(e,t,n){return this.emitter().removeListener(e,Pu(t),n),this},removeAllListeners:function(){return this.emitter().removeAllListeners(),this},one:function(e,t,n){return this.emitter().one(e,Pu(t),n),this},once:function(e,t,n){return this.emitter().one(e,Pu(t),n),this},emit:function(e,t){return this.emitter().emit(e,t),this},emitAndNotify:function(e,t){return this.emit(e),this.notify(e,t),this}};hs.eventAliasesOn(Ru);var Bu={png:function(e){return e=e||{},this._private.renderer.png(e)},jpg:function(e){var t=this._private.renderer;return(e=e||{}).bg=e.bg||"#fff",t.jpg(e)}};Bu.jpeg=Bu.jpg;var Fu={layout:function(e){var t=this;if(null!=e)if(null!=e.name){var n=e.name,r=t.extension("layout",n);if(null!=r){var i;i=b(e.eles)?t.$(e.eles):null!=e.eles?e.eles:t.$();var a=new r(Q({},e,{cy:t,eles:i}));return a}Dt("No such layout `"+n+"` found. Did you forget to import it and `cytoscape.use()` it?")}else Dt("A `name` must be specified to make a layout");else Dt("Layout options must be specified to make a layout")}};Fu.createLayout=Fu.makeLayout=Fu.layout;var zu={notify:function(e,t){var n=this._private;if(this.batching()){n.batchNotifications=n.batchNotifications||{};var r=n.batchNotifications[e]=n.batchNotifications[e]||this.collection();null!=t&&r.merge(t)}else if(n.notificationsEnabled){var i=this.renderer();!this.destroyed()&&i&&i.notify(e,t)}},notifications:function(e){var t=this._private;return void 0===e?t.notificationsEnabled:(t.notificationsEnabled=!!e,this)},noNotifications:function(e){this.notifications(!1),e(),this.notifications(!0)},batching:function(){return this._private.batchCount>0},startBatch:function(){var e=this._private;return null==e.batchCount&&(e.batchCount=0),0===e.batchCount&&(e.batchStyleEles=this.collection(),e.batchNotifications={}),e.batchCount++,this},endBatch:function(){var e=this._private;if(0===e.batchCount)return this;if(e.batchCount--,0===e.batchCount){e.batchStyleEles.updateStyle();var t=this.renderer();Object.keys(e.batchNotifications).forEach((function(n){var r=e.batchNotifications[n];r.empty()?t.notify(n):t.notify(n,r)}))}return this},batch:function(e){return this.startBatch(),e(),this.endBatch(),this},batchData:function(e){var t=this;return this.batch((function(){for(var n=Object.keys(e),r=0;r0;)t.removeChild(t.childNodes[0]);e._private.renderer=null,e.mutableElements().forEach((function(e){var t=e._private;t.rscratch={},t.rstyle={},t.animation.current=[],t.animation.queue=[]}))},onRender:function(e){return this.on("render",e)},offRender:function(e){return this.off("render",e)}};Yu.invalidateDimensions=Yu.resize;var Xu={collection:function(e,t){return b(e)?this.$(e):N(e)?e.collection():w(e)?(t||(t={}),new bu(this,e,t.unique,t.removed)):new bu(this)},nodes:function(e){var t=this.$((function(e){return e.isNode()}));return e?t.filter(e):t},edges:function(e){var t=this.$((function(e){return e.isEdge()}));return e?t.filter(e):t},$:function(e){var t=this._private.elements;return e?t.filter(e):t.spawnSelf()},mutableElements:function(){return this._private.elements}};Xu.elements=Xu.filter=Xu.$;var Vu={},Uu="t",ju="f";Vu.apply=function(e){for(var t=this,n=t._private.cy.collection(),r=0;r0;if(d||h&&p){var g=void 0;d&&p||d?g=u.properties:p&&(g=u.mappedProperties);for(var f=0;f1&&(v=1),s.color){var w=i.valueMin[0],E=i.valueMax[0],T=i.valueMin[1],D=i.valueMax[1],C=i.valueMin[2],N=i.valueMax[2],A=null==i.valueMin[3]?1:i.valueMin[3],L=null==i.valueMax[3]?1:i.valueMax[3],S=[Math.round(w+(E-w)*v),Math.round(T+(D-T)*v),Math.round(C+(N-C)*v),Math.round(A+(L-A)*v)];n={bypass:i.bypass,name:i.name,value:S,strValue:"rgb("+S[0]+", "+S[1]+", "+S[2]+")"}}else{if(!s.number)return!1;var O=i.valueMin+(i.valueMax-i.valueMin)*v;n=this.parse(i.name,O,i.bypass,d)}if(!n)return f(),!1;n.mapping=i,i=n;break;case o.data:for(var I=i.field.split("."),k=h.data,M=0;M0&&a>0){for(var s={},l=!1,u=0;u0?e.delayAnimation(o).play().promise().then(t):t()})).then((function(){return e.animation({style:s,duration:a,easing:e.pstyle("transition-timing-function").value,queue:!1}).play().promise()})).then((function(){n.removeBypasses(e,i),e.emitAndNotify("style"),r.transitioning=!1}))}else r.transitioning&&(this.removeBypasses(e,i),e.emitAndNotify("style"),r.transitioning=!1)},Vu.checkTrigger=function(e,t,n,r,i,a){var o=this.properties[t],s=i(o);null!=s&&s(n,r)&&a(o)},Vu.checkZOrderTrigger=function(e,t,n,r){var i=this;this.checkTrigger(e,t,n,r,(function(e){return e.triggersZOrder}),(function(){i._private.cy.notify("zorder",e)}))},Vu.checkBoundsTrigger=function(e,t,n,r){this.checkTrigger(e,t,n,r,(function(e){return e.triggersBounds}),(function(i){e.dirtyCompoundBoundsCache(),e.dirtyBoundingBoxCache(),!i.triggersBoundsOfParallelBeziers||("curve-style"!==t||"bezier"!==n&&"bezier"!==r)&&("display"!==t||"none"!==n&&"none"!==r)||e.parallelEdges().forEach((function(e){e.isBundledBezier()&&e.dirtyBoundingBoxCache()}))}))},Vu.checkTriggers=function(e,t,n,r){e.dirtyStyleCache(),this.checkZOrderTrigger(e,t,n,r),this.checkBoundsTrigger(e,t,n,r)};var Hu={applyBypass:function(e,t,n,r){var i=this,a=[],o=!0;if("*"===t||"**"===t){if(void 0!==n)for(var s=0;st.length?o.substr(t.length):""}function l(){n=n.length>r.length?n.substr(r.length):""}for(o=o.replace(/[/][*](\s|.)+?[*][/]/g,"");!o.match(/^\s*$/);){var u=o.match(/^\s*((?:.|\s)+?)\s*\{((?:.|\s)+?)\}/);if(!u){Nt("Halting stylesheet parsing: String stylesheet contains more to parse but no selector and block found in: "+o);break}t=u[0];var c=u[1];if("core"!==c&&new Ps(c).invalid)Nt("Skipping parsing of block: Invalid selector found in string stylesheet: "+c),s();else{var h=u[2],d=!1;n=h;for(var p=[];!n.match(/^\s*$/);){var g=n.match(/^\s*(.+?)\s*:\s*(.+?)(?:\s*;|\s*$)/);if(!g){Nt("Skipping parsing of block: Invalid formatting of style property and value definitions found in:"+h),d=!0;break}r=g[0];var f=g[1],v=g[2];i.properties[f]?a.parse(f,v)?(p.push({name:f,val:v}),l()):(Nt("Skipping property: Invalid property definition in: "+r),l()):(Nt("Skipping property: Invalid property name in: "+r),l())}if(d){s();break}a.selector(c);for(var y=0;y=7&&"d"===t[0]&&(u=new RegExp(s.data.regex).exec(t))){if(n)return!1;var d=s.data;return{name:e,value:u,strValue:""+t,mapped:d,field:u[1],bypass:n}}if(t.length>=10&&"m"===t[0]&&(c=new RegExp(s.mapData.regex).exec(t))){if(n)return!1;if(h.multiple)return!1;var p=s.mapData;if(!h.color&&!h.number)return!1;var g=this.parse(e,c[4]);if(!g||g.mapped)return!1;var f=this.parse(e,c[5]);if(!f||f.mapped)return!1;if(g.pfValue===f.pfValue||g.strValue===f.strValue)return Nt("`"+e+": "+t+"` is not a valid mapper because the output range is zero; converting to `"+e+": "+g.strValue+"`"),this.parse(e,g.strValue);if(h.color){var v=g.value,y=f.value;if(!(v[0]!==y[0]||v[1]!==y[1]||v[2]!==y[2]||v[3]!==y[3]&&(null!=v[3]&&1!==v[3]||null!=y[3]&&1!==y[3])))return!1}return{name:e,value:c,strValue:""+t,mapped:p,field:c[1],fieldMin:parseFloat(c[2]),fieldMax:parseFloat(c[3]),valueMin:g.value,valueMax:f.value,bypass:n}}}if(h.multiple&&"multiple"!==r){var m;if(m=l?t.split(/\s+/):w(t)?t:[t],h.evenMultiple&&m.length%2!=0)return null;for(var E=[],T=[],_=[],C="",N=!1,A=0;A0?" ":"")+L.strValue}return h.validate&&!h.validate(E,T)?null:h.singleEnum&&N?1===E.length&&b(E[0])?{name:e,value:E[0],strValue:E[0],bypass:n}:null:{name:e,value:E,pfValue:_,strValue:C,bypass:n,units:T}}var S=function(){for(var r=0;rh.max||h.strictMax&&t===h.max))return null;var P={name:e,value:t,strValue:""+t+(O||""),units:O,bypass:n};return h.unitless||"px"!==O&&"em"!==O?P.pfValue=t:P.pfValue="px"!==O&&O?this.getEmSizeInPixels()*t:t,"ms"!==O&&"s"!==O||(P.pfValue="ms"===O?t:1e3*t),"deg"!==O&&"rad"!==O||(P.pfValue="rad"===O?t:mn(t)),"%"===O&&(P.pfValue=t/100),P}if(h.propList){var R=[],B=""+t;if("none"===B);else{for(var F=B.split(/\s*,\s*|\s+/),G=0;G0&&s>0&&!isNaN(n.w)&&!isNaN(n.h)&&n.w>0&&n.h>0)return{zoom:a=(a=(a=Math.min((o-2*t)/n.w,(s-2*t)/n.h))>this._private.maxZoom?this._private.maxZoom:a)=n.minZoom&&(n.maxZoom=t),this},minZoom:function(e){return void 0===e?this._private.minZoom:this.zoomRange({min:e})},maxZoom:function(e){return void 0===e?this._private.maxZoom:this.zoomRange({max:e})},getZoomedViewport:function(e){var t,n,r=this._private,i=r.pan,a=r.zoom,o=!1;if(r.zoomingEnabled||(o=!0),_(e)?n=e:E(e)&&(n=e.level,null!=e.position?t=hn(e.position,a,i):null!=e.renderedPosition&&(t=e.renderedPosition),null==t||r.panningEnabled||(o=!0)),n=(n=n>r.maxZoom?r.maxZoom:n)t.maxZoom||!t.zoomingEnabled?a=!0:(t.zoom=s,i.push("zoom"))}if(r&&(!a||!e.cancelOnFailedZoom)&&t.panningEnabled){var l=e.pan;_(l.x)&&(t.pan.x=l.x,o=!1),_(l.y)&&(t.pan.y=l.y,o=!1),o||i.push("pan")}return i.length>0&&(i.push("viewport"),this.emit(i.join(" ")),this.notify("viewport")),this},center:function(e){var t=this.getCenterPan(e);return t&&(this._private.pan=t,this.emit("pan viewport"),this.notify("viewport")),this},getCenterPan:function(e,t){if(this._private.panningEnabled){if(b(e)){var n=e;e=this.mutableElements().filter(n)}else N(e)||(e=this.mutableElements());if(0!==e.length){var r=e.boundingBox(),i=this.width(),a=this.height();return{x:(i-(t=void 0===t?this._private.zoom:t)*(r.x1+r.x2))/2,y:(a-t*(r.y1+r.y2))/2}}}},reset:function(){return this._private.panningEnabled&&this._private.zoomingEnabled?(this.viewport({pan:{x:0,y:0},zoom:1}),this):this},invalidateSize:function(){this._private.sizeCache=null},size:function(){var e,t,n=this._private,r=n.container,i=this;return n.sizeCache=n.sizeCache||(r?(e=i.window().getComputedStyle(r),t=function(t){return parseFloat(e.getPropertyValue(t))},{width:r.clientWidth-t("padding-left")-t("padding-right"),height:r.clientHeight-t("padding-top")-t("padding-bottom")}):{width:1,height:1})},width:function(){return this.size().width},height:function(){return this.size().height},extent:function(){var e=this._private.pan,t=this._private.zoom,n=this.renderedExtent(),r={x1:(n.x1-e.x)/t,x2:(n.x2-e.x)/t,y1:(n.y1-e.y)/t,y2:(n.y2-e.y)/t};return r.w=r.x2-r.x1,r.h=r.y2-r.y1,r},renderedExtent:function(){var e=this.width(),t=this.height();return{x1:0,y1:0,x2:e,y2:t,w:e,h:t}},multiClickDebounceTime:function(e){return e?(this._private.multiClickDebounceTime=e,this):this._private.multiClickDebounceTime}};rc.centre=rc.center,rc.autolockNodes=rc.autolock,rc.autoungrabifyNodes=rc.autoungrabify;var ic={data:hs.data({field:"data",bindingEvent:"data",allowBinding:!0,allowSetting:!0,settingEvent:"data",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeData:hs.removeData({field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0}),scratch:hs.data({field:"scratch",bindingEvent:"scratch",allowBinding:!0,allowSetting:!0,settingEvent:"scratch",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeScratch:hs.removeData({field:"scratch",event:"scratch",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0})};ic.attr=ic.data,ic.removeAttr=ic.removeData;var ac=function(e){var t=this,n=(e=Q({},e)).container;n&&!C(n)&&C(n[0])&&(n=n[0]);var r=n?n._cyreg:null;(r=r||{})&&r.cy&&(r.cy.destroy(),r={});var i=r.readies=r.readies||[];n&&(n._cyreg=r),r.cy=t;var a=void 0!==d&&void 0!==n&&!e.headless,o=e;o.layout=Q({name:a?"grid":"null"},o.layout),o.renderer=Q({name:a?"canvas":"null"},o.renderer);var s=function(e,t,n){return void 0!==t?t:void 0!==n?n:e},l=this._private={container:n,ready:!1,options:o,elements:new bu(this),listeners:[],aniEles:new bu(this),data:o.data||{},scratch:{},layout:null,renderer:null,destroyed:!1,notificationsEnabled:!0,minZoom:1e-50,maxZoom:1e50,zoomingEnabled:s(!0,o.zoomingEnabled),userZoomingEnabled:s(!0,o.userZoomingEnabled),panningEnabled:s(!0,o.panningEnabled),userPanningEnabled:s(!0,o.userPanningEnabled),boxSelectionEnabled:s(!0,o.boxSelectionEnabled),autolock:s(!1,o.autolock,o.autolockNodes),autoungrabify:s(!1,o.autoungrabify,o.autoungrabifyNodes),autounselectify:s(!1,o.autounselectify),styleEnabled:void 0===o.styleEnabled?a:o.styleEnabled,zoom:_(o.zoom)?o.zoom:1,pan:{x:E(o.pan)&&_(o.pan.x)?o.pan.x:0,y:E(o.pan)&&_(o.pan.y)?o.pan.y:0},animation:{current:[],queue:[]},hasCompoundNodes:!1,multiClickDebounceTime:s(250,o.multiClickDebounceTime)};this.createEmitter(),this.selectionType(o.selectionType),this.zoomRange({min:o.minZoom,max:o.maxZoom});var u=function(e,t){if(e.some(R))return Gi.all(e).then(t);t(e)};l.styleEnabled&&t.setStyle([]);var c=Q({},o,o.renderer);t.initRenderer(c);var h=function(e,n,r){t.notifications(!1);var i=t.mutableElements();i.length>0&&i.remove(),null!=e&&(E(e)||w(e))&&t.add(e),t.one("layoutready",(function(e){t.notifications(!0),t.emit(e),t.one("load",n),t.emitAndNotify("load")})).one("layoutstop",(function(){t.one("done",r),t.emit("done")}));var a=Q({},t._private.options.layout);a.eles=t.elements(),t.layout(a).run()};u([o.style,o.elements],(function(e){var n=e[0],a=e[1];l.styleEnabled&&t.style().append(n),h(a,(function(){t.startAnimationLoop(),l.ready=!0,x(o.ready)&&t.on("ready",o.ready);for(var e=0;e0,u=Ln(n.boundingBox?n.boundingBox:{x1:0,y1:0,w:r.width(),h:r.height()});if(N(n.roots))e=n.roots;else if(w(n.roots)){for(var c=[],h=0;h0;){var M=k(),P=L(M,O);if(P)M.outgoers().filter((function(e){return e.isNode()&&i.has(e)})).forEach(I);else if(null===P){Nt("Detected double maximal shift for node `"+M.id()+"`. Bailing maximal adjustment due to cycle. Use `options.maximal: true` only on DAGs.");break}}}A();var R=0;if(n.avoidOverlap)for(var B=0;B0&&y[0].length<=3?l/2:0),h=2*Math.PI/y[r].length*i;return 0===r&&1===y[0].length&&(c=1),{x:$.x+c*Math.cos(h),y:$.y+c*Math.sin(h)}}return{x:$.x+(i+1-(a+1)/2)*o,y:(r+1)*s}};return i.nodes().layoutPositions(this,n,Q),this};var dc={fit:!0,padding:30,boundingBox:void 0,avoidOverlap:!0,nodeDimensionsIncludeLabels:!1,spacingFactor:void 0,radius:void 0,startAngle:1.5*Math.PI,sweep:void 0,clockwise:!0,sort:void 0,animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:function(e,t){return!0},ready:void 0,stop:void 0,transform:function(e,t){return t}};function pc(e){this.options=Q({},dc,e)}pc.prototype.run=function(){var e=this.options,t=e,n=e.cy,r=t.eles,i=void 0!==t.counterclockwise?!t.counterclockwise:t.clockwise,a=r.nodes().not(":parent");t.sort&&(a=a.sort(t.sort));for(var o,s=Ln(t.boundingBox?t.boundingBox:{x1:0,y1:0,w:n.width(),h:n.height()}),l={x:s.x1+s.w/2,y:s.y1+s.h/2},u=(void 0===t.sweep?2*Math.PI-2*Math.PI/a.length:t.sweep)/Math.max(1,a.length-1),c=0,h=0;h1&&t.avoidOverlap){c*=1.75;var f=Math.cos(u)-Math.cos(0),v=Math.sin(u)-Math.sin(0),y=Math.sqrt(c*c/(f*f+v*v));o=Math.max(y,o)}var m=function(e,n){var r=t.startAngle+n*u*(i?1:-1),a=o*Math.cos(r),s=o*Math.sin(r);return{x:l.x+a,y:l.y+s}};return r.nodes().layoutPositions(this,t,m),this};var gc,fc={fit:!0,padding:30,startAngle:1.5*Math.PI,sweep:void 0,clockwise:!0,equidistant:!1,minNodeSpacing:10,boundingBox:void 0,avoidOverlap:!0,nodeDimensionsIncludeLabels:!1,height:void 0,width:void 0,spacingFactor:void 0,concentric:function(e){return e.degree()},levelWidth:function(e){return e.maxDegree()/4},animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:function(e,t){return!0},ready:void 0,stop:void 0,transform:function(e,t){return t}};function vc(e){this.options=Q({},fc,e)}vc.prototype.run=function(){for(var e=this.options,t=e,n=void 0!==t.counterclockwise?!t.counterclockwise:t.clockwise,r=e.cy,i=t.eles,a=i.nodes().not(":parent"),o=Ln(t.boundingBox?t.boundingBox:{x1:0,y1:0,w:r.width(),h:r.height()}),s={x:o.x1+o.w/2,y:o.y1+o.h/2},l=[],u=0,c=0;c0&&Math.abs(y[0].value-b.value)>=f&&(y=[],v.push(y)),y.push(b)}var x=u+t.minNodeSpacing;if(!t.avoidOverlap){var w=v.length>0&&v[0].length>1,E=(Math.min(o.w,o.h)/2-x)/(v.length+w?1:0);x=Math.min(x,E)}for(var T=0,_=0;_1&&t.avoidOverlap){var A=Math.cos(N)-Math.cos(0),L=Math.sin(N)-Math.sin(0),S=Math.sqrt(x*x/(A*A+L*L));T=Math.max(S,T)}D.r=T,T+=x}if(t.equidistant){for(var O=0,I=0,k=0;k=e.numIter||(Cc(r,e),r.temperature=r.temperature*e.coolingFactor,r.temperature=e.animationThreshold&&a(),nt(t)):(Fc(r,e),s())}();else{for(;u;)u=o(l),l++;Fc(r,e),s()}return this},mc.prototype.stop=function(){return this.stopped=!0,this.thread&&this.thread.stop(),this.emit("layoutstop"),this},mc.prototype.destroy=function(){return this.thread&&this.thread.stop(),this};var bc,xc=function(e,t,n){for(var r=n.eles.edges(),i=n.eles.nodes(),a=Ln(n.boundingBox?n.boundingBox:{x1:0,y1:0,w:e.width(),h:e.height()}),o={isCompound:e.hasCompoundNodes(),layoutNodes:[],idToIndex:{},nodeSize:i.size(),graphSet:[],indexToGraph:[],layoutEdges:[],edgeSize:r.size(),temperature:n.initialTemp,clientWidth:a.w,clientHeight:a.h,boundingBox:a},s=n.eles.components(),l={},u=0;u0)for(o.graphSet.push(E),u=0;ur.count?0:r.graph},Ec=function e(t,n,r,i){var a=i.graphSet[r];if(-10)var l=(c=r.nodeOverlap*s)*i/(v=Math.sqrt(i*i+a*a)),u=c*a/v;else{var c,h=Oc(e,i,a),d=Oc(t,-1*i,-1*a),p=d.x-h.x,g=d.y-h.y,f=p*p+g*g,v=Math.sqrt(f);l=(c=(e.nodeRepulsion+t.nodeRepulsion)/f)*p/v,u=c*g/v}e.isLocked||(e.offsetX-=l,e.offsetY-=u),t.isLocked||(t.offsetX+=l,t.offsetY+=u)}},Sc=function(e,t,n,r){if(n>0)var i=e.maxX-t.minX;else i=t.maxX-e.minX;if(r>0)var a=e.maxY-t.minY;else a=t.maxY-e.minY;return i>=0&&a>=0?Math.sqrt(i*i+a*a):0},Oc=function(e,t,n){var r=e.positionX,i=e.positionY,a=e.height||1,o=e.width||1,s=n/t,l=a/o,u={};return 0===t&&0n?(u.x=r,u.y=i+a/2,u):0t&&-1*l<=s&&s<=l?(u.x=r-o/2,u.y=i-o*n/2/t,u):0=l)?(u.x=r+a*t/2/n,u.y=i+a/2,u):0>n&&(s<=-1*l||s>=l)?(u.x=r-a*t/2/n,u.y=i-a/2,u):u},Ic=function(e,t){for(var n=0;nn){var f=t.gravity*d/g,v=t.gravity*p/g;h.offsetX+=f,h.offsetY+=v}}}}},Mc=function(e,t){var n=[],r=0,i=-1;for(n.push.apply(n,e.graphSet[0]),i+=e.graphSet[0].length;r<=i;){var a=n[r++],o=e.idToIndex[a],s=e.layoutNodes[o],l=s.children;if(0n)var i={x:n*e/r,y:n*t/r};else i={x:e,y:t};return i},Bc=function e(t,n){var r=t.parentId;if(null!=r){var i=n.layoutNodes[n.idToIndex[r]],a=!1;return(null==i.maxX||t.maxX+i.padRight>i.maxX)&&(i.maxX=t.maxX+i.padRight,a=!0),(null==i.minX||t.minX-i.padLefti.maxY)&&(i.maxY=t.maxY+i.padBottom,a=!0),(null==i.minY||t.minY-i.padTopg&&(h+=p+t.componentSpacing,c=0,d=0,p=0)}}},zc={fit:!0,padding:30,boundingBox:void 0,avoidOverlap:!0,avoidOverlapPadding:10,nodeDimensionsIncludeLabels:!1,spacingFactor:void 0,condense:!1,rows:void 0,cols:void 0,position:function(e){},sort:void 0,animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:function(e,t){return!0},ready:void 0,stop:void 0,transform:function(e,t){return t}};function Gc(e){this.options=Q({},zc,e)}Gc.prototype.run=function(){var e=this.options,t=e,n=e.cy,r=t.eles,i=r.nodes().not(":parent");t.sort&&(i=i.sort(t.sort));var a=Ln(t.boundingBox?t.boundingBox:{x1:0,y1:0,w:n.width(),h:n.height()});if(0===a.h||0===a.w)r.nodes().layoutPositions(this,t,(function(e){return{x:a.x1,y:a.y1}}));else{var o=i.size(),s=Math.sqrt(o*a.h/a.w),l=Math.round(s),u=Math.round(a.w/a.h*s),c=function(e){if(null==e)return Math.min(l,u);Math.min(l,u)==l?l=e:u=e},h=function(e){if(null==e)return Math.max(l,u);Math.max(l,u)==l?l=e:u=e},d=t.rows,p=null!=t.cols?t.cols:t.columns;if(null!=d&&null!=p)l=d,u=p;else if(null!=d&&null==p)l=d,u=Math.ceil(o/l);else if(null==d&&null!=p)u=p,l=Math.ceil(o/u);else if(u*l>o){var g=c(),f=h();(g-1)*f>=o?c(g-1):(f-1)*g>=o&&h(f-1)}else for(;u*l=o?h(y+1):c(v+1)}var m=a.w/u,b=a.h/l;if(t.condense&&(m=0,b=0),t.avoidOverlap)for(var x=0;x=u&&(O=0,S++)},k={},M=0;M(r=qn(e,t,x[w],x[w+1],x[w+2],x[w+3])))return v(n,r),!0}else if("bezier"===a.edgeType||"multibezier"===a.edgeType||"self"===a.edgeType||"compound"===a.edgeType)for(x=a.allpts,w=0;w+5(r=Hn(e,t,x[w],x[w+1],x[w+2],x[w+3],x[w+4],x[w+5])))return v(n,r),!0;m=m||i.source,b=b||i.target;var E=o.getArrowWidth(l,c),T=[{name:"source",x:a.arrowStartX,y:a.arrowStartY,angle:a.srcArrowAngle},{name:"target",x:a.arrowEndX,y:a.arrowEndY,angle:a.tgtArrowAngle},{name:"mid-source",x:a.midX,y:a.midY,angle:a.midsrcArrowAngle},{name:"mid-target",x:a.midX,y:a.midY,angle:a.midtgtArrowAngle}];for(w=0;w0&&(y(m),y(b))}function b(e,t,n){return Ft(e,t,n)}function x(n,r){var i,a=n._private,o=g;i=r?r+"-":"",n.boundingBox();var s=a.labelBounds[r||"main"],l=n.pstyle(i+"label").value;if("yes"===n.pstyle("text-events").strValue&&l){var u=b(a.rscratch,"labelX",r),c=b(a.rscratch,"labelY",r),h=b(a.rscratch,"labelAngle",r),d=n.pstyle(i+"text-margin-x").pfValue,p=n.pstyle(i+"text-margin-y").pfValue,f=s.x1-o-d,y=s.x2+o-d,m=s.y1-o-p,x=s.y2+o-p;if(h){var w=Math.cos(h),E=Math.sin(h),T=function(e,t){return{x:(e-=u)*w-(t-=c)*E+u,y:e*E+t*w+c}},_=T(f,m),D=T(f,x),C=T(y,m),N=T(y,x),A=[_.x+d,_.y+p,C.x+d,C.y+p,N.x+d,N.y+p,D.x+d,D.y+p];if(Wn(e,t,A))return v(n),!0}else if(Fn(s,e,t))return v(n),!0}}n&&(l=l.interactive);for(var w=l.length-1;w>=0;w--){var E=l[w];E.isNode()?y(E)||x(E):m(E)||x(E)||x(E,"source")||x(E,"target")}return u},getAllInBox:function(e,t,n,r){for(var i=this.getCachedZSortedEles().interactive,a=[],o=Math.min(e,n),s=Math.max(e,n),l=Math.min(t,r),u=Math.max(t,r),c=Ln({x1:e=o,y1:t=l,x2:n=s,y2:r=u}),h=0;h0?Math.max(e-t,0):Math.min(e+t,0)},A=N(D,T),L=N(C,_),S=!1;y===u?v=Math.abs(A)>Math.abs(L)?i:r:y===l||y===s?(v=r,S=!0):y!==a&&y!==o||(v=i,S=!0);var O,I=v===r,k=I?L:A,M=I?C:D,P=wn(M),R=!1;S&&(b||w)||!(y===s&&M<0||y===l&&M>0||y===a&&M>0||y===o&&M<0)||(k=(P*=-1)*Math.abs(k),R=!0);var B=function(e){return Math.abs(e)=Math.abs(k)},F=B(O=b?(x<0?1+x:x)*k:(x<0?k:0)+x*P),z=B(Math.abs(k)-Math.abs(O));if(!F&&!z||R)if(I){var G=c.y1+O+(f?d/2*P:0),Y=c.x1,X=c.x2;n.segpts=[Y,G,X,G]}else{var V=c.x1+O+(f?h/2*P:0),U=c.y1,j=c.y2;n.segpts=[V,U,V,j]}else if(I){var H=Math.abs(M)<=d/2,q=Math.abs(D)<=p/2;if(H){var W=(c.x1+c.x2)/2,$=c.y1,K=c.y2;n.segpts=[W,$,W,K]}else if(q){var Z=(c.y1+c.y2)/2,Q=c.x1,J=c.x2;n.segpts=[Q,Z,J,Z]}else n.segpts=[c.x1,c.y2]}else{var ee=Math.abs(M)<=h/2,te=Math.abs(C)<=g/2;if(ee){var ne=(c.y1+c.y2)/2,re=c.x1,ie=c.x2;n.segpts=[re,ne,ie,ne]}else if(te){var ae=(c.x1+c.x2)/2,oe=c.y1,se=c.y2;n.segpts=[ae,oe,ae,se]}else n.segpts=[c.x2,c.y1]}},eh.tryToCorrectInvalidPoints=function(e,t){var n=e._private.rscratch;if("bezier"===n.edgeType){var r=t.srcPos,i=t.tgtPos,a=t.srcW,o=t.srcH,s=t.tgtW,l=t.tgtH,u=t.srcShape,c=t.tgtShape,h=!_(n.startX)||!_(n.startY),d=!_(n.arrowStartX)||!_(n.arrowStartY),p=!_(n.endX)||!_(n.endY),g=!_(n.arrowEndX)||!_(n.arrowEndY),f=this.getArrowWidth(e.pstyle("width").pfValue,e.pstyle("arrow-scale").value)*this.arrowShapeWidth*3,v=En({x:n.ctrlpts[0],y:n.ctrlpts[1]},{x:n.startX,y:n.startY}),y=vd.poolIndex()){var p=h;h=d,d=p}var g=s.srcPos=h.position(),f=s.tgtPos=d.position(),v=s.srcW=h.outerWidth(),y=s.srcH=h.outerHeight(),m=s.tgtW=d.outerWidth(),b=s.tgtH=d.outerHeight(),x=s.srcShape=n.nodeShapes[t.getNodeShape(h)],w=s.tgtShape=n.nodeShapes[t.getNodeShape(d)];s.dirCounts={north:0,west:0,south:0,east:0,northwest:0,southwest:0,northeast:0,southeast:0};for(var E=0;E0){var X=u,V=Tn(X,pn(t)),U=Tn(X,pn(Y)),j=V;U2&&Tn(X,{x:Y[2],y:Y[3]})0){var ie=c,ae=Tn(ie,pn(t)),oe=Tn(ie,pn(re)),se=ae;oe2&&Tn(ie,{x:re[2],y:re[3]})=u||m){c={cp:f,segment:y};break}}if(c)break}var b=c.cp,x=c.segment,w=(u-d)/x.length,E=x.t1-x.t0,T=s?x.t0+E*w:x.t1-E*w;T=An(0,T,1),t=Cn(b.p0,b.p1,b.p2,T),i=lh(b.p0,b.p1,b.p2,T);break;case"straight":case"segments":case"haystack":for(var _,D,C,N,A=0,L=r.allpts.length,S=0;S+3=u));S+=2);var O=(u-D)/_;O=An(0,O,1),t=Nn(C,N,O),i=sh(C,N)}o("labelX",n,t.x),o("labelY",n,t.y),o("labelAutoAngle",n,i)}};u("source"),u("target"),this.applyLabelDimensions(e)}},ah.applyLabelDimensions=function(e){this.applyPrefixedLabelDimensions(e),e.isEdge()&&(this.applyPrefixedLabelDimensions(e,"source"),this.applyPrefixedLabelDimensions(e,"target"))},ah.applyPrefixedLabelDimensions=function(e,t){var n=e._private,r=this.getLabelText(e,t),i=this.calculateLabelDimensions(e,r),a=e.pstyle("line-height").pfValue,o=e.pstyle("text-wrap").strValue,s=Ft(n.rscratch,"labelWrapCachedLines",t)||[],l="wrap"!==o?1:Math.max(s.length,1),u=i.height/l,c=u*a,h=i.width,d=i.height+(l-1)*(a-1)*u;zt(n.rstyle,"labelWidth",t,h),zt(n.rscratch,"labelWidth",t,h),zt(n.rstyle,"labelHeight",t,d),zt(n.rscratch,"labelHeight",t,d),zt(n.rscratch,"labelLineHeight",t,c)},ah.getLabelText=function(e,t){var n=e._private,r=t?t+"-":"",i=e.pstyle(r+"label").strValue,a=e.pstyle("text-transform").value,o=function(e,r){return r?(zt(n.rscratch,e,t,r),r):Ft(n.rscratch,e,t)};if(!i)return"";"none"==a||("uppercase"==a?i=i.toUpperCase():"lowercase"==a&&(i=i.toLowerCase()));var s=e.pstyle("text-wrap").value;if("wrap"===s){var l=o("labelKey");if(null!=l&&o("labelWrapKey")===l)return o("labelWrapCachedText");for(var u="\u200b",c=i.split("\n"),h=e.pstyle("text-max-width").pfValue,d="anywhere"===e.pstyle("text-overflow-wrap").value,p=[],g=/[\s\u200b]+/,f=d?"":" ",v=0;vh){for(var x=y.split(g),w="",E=0;ED);L++)C+=i[L],L===i.length-1&&(A=!0);return A||(C+=N),C}return i},ah.getLabelJustification=function(e){var t=e.pstyle("text-justification").strValue,n=e.pstyle("text-halign").strValue;if("auto"!==t)return t;if(!e.isNode())return"center";switch(n){case"left":return"right";case"right":return"left";default:return"center"}},ah.calculateLabelDimensions=function(e,t){var n=this,r=gt(t,e._private.labelDimsKey),i=n.labelDimCache||(n.labelDimCache=[]),a=i[r];if(null!=a)return a;var o=0,s=e.pstyle("font-style").strValue,l=e.pstyle("font-size").pfValue,u=e.pstyle("font-family").strValue,c=e.pstyle("font-weight").strValue,h=this.labelCalcCanvas,d=this.labelCalcCanvasContext;if(!h){h=this.labelCalcCanvas=document.createElement("canvas"),d=this.labelCalcCanvasContext=h.getContext("2d");var p=h.style;p.position="absolute",p.left="-9999px",p.top="-9999px",p.zIndex="-1",p.visibility="hidden",p.pointerEvents="none"}d.font="".concat(s," ").concat(c," ").concat(l,"px ").concat(u);for(var g=0,f=0,v=t.split("\n"),y=0;y1&&void 0!==arguments[1])||arguments[1];if(t.merge(e),n)for(var r=0;r=e.desktopTapThreshold2}var C=i(t);f&&(e.hoverData.tapholdCancelled=!0);var N=function(){var t=e.hoverData.dragDelta=e.hoverData.dragDelta||[];0===t.length?(t.push(b[0]),t.push(b[1])):(t[0]+=b[0],t[1]+=b[1])};n=!0,r(p,["mousemove","vmousemove","tapdrag"],t,{x:u[0],y:u[1]});var A=function(){e.data.bgActivePosistion=void 0,e.hoverData.selecting||o.emit({originalEvent:t,type:"boxstart",position:{x:u[0],y:u[1]}}),d[4]=1,e.hoverData.selecting=!0,e.redrawHint("select",!0),e.redraw()};if(3===e.hoverData.which){if(f){var S={originalEvent:t,type:"cxtdrag",position:{x:u[0],y:u[1]}};m?m.emit(S):o.emit(S),e.hoverData.cxtDragged=!0,e.hoverData.cxtOver&&p===e.hoverData.cxtOver||(e.hoverData.cxtOver&&e.hoverData.cxtOver.emit({originalEvent:t,type:"cxtdragout",position:{x:u[0],y:u[1]}}),e.hoverData.cxtOver=p,p&&p.emit({originalEvent:t,type:"cxtdragover",position:{x:u[0],y:u[1]}}))}}else if(e.hoverData.dragging){if(n=!0,o.panningEnabled()&&o.userPanningEnabled()){var O;if(e.hoverData.justStartedPan){var I=e.hoverData.mdownPos;O={x:(u[0]-I[0])*s,y:(u[1]-I[1])*s},e.hoverData.justStartedPan=!1}else O={x:b[0]*s,y:b[1]*s};o.panBy(O),o.emit("dragpan"),e.hoverData.dragged=!0}u=e.projectIntoViewport(t.clientX,t.clientY)}else if(1!=d[4]||null!=m&&!m.pannable()){if(m&&m.pannable()&&m.active()&&m.unactivate(),m&&m.grabbed()||p==y||(y&&r(y,["mouseout","tapdragout"],t,{x:u[0],y:u[1]}),p&&r(p,["mouseover","tapdragover"],t,{x:u[0],y:u[1]}),e.hoverData.last=p),m)if(f){if(o.boxSelectionEnabled()&&C)m&&m.grabbed()&&(v(x),m.emit("freeon"),x.emit("free"),e.dragData.didDrag&&(m.emit("dragfreeon"),x.emit("dragfree"))),A();else if(m&&m.grabbed()&&e.nodeIsDraggable(m)){var k=!e.dragData.didDrag;k&&e.redrawHint("eles",!0),e.dragData.didDrag=!0,e.hoverData.draggingEles||g(x,{inDragLayer:!0});var M={x:0,y:0};if(_(b[0])&&_(b[1])&&(M.x+=b[0],M.y+=b[1],k)){var P=e.hoverData.dragDelta;P&&_(P[0])&&_(P[1])&&(M.x+=P[0],M.y+=P[1])}e.hoverData.draggingEles=!0,x.silentShift(M).emit("position drag"),e.redrawHint("drag",!0),e.redraw()}}else N();n=!0}else f&&(e.hoverData.dragging||!o.boxSelectionEnabled()||!C&&o.panningEnabled()&&o.userPanningEnabled()?!e.hoverData.selecting&&o.panningEnabled()&&o.userPanningEnabled()&&a(m,e.hoverData.downs)&&(e.hoverData.dragging=!0,e.hoverData.justStartedPan=!0,d[4]=0,e.data.bgActivePosistion=pn(c),e.redrawHint("select",!0),e.redraw()):A(),m&&m.pannable()&&m.active()&&m.unactivate());return d[2]=u[0],d[3]=u[1],n?(t.stopPropagation&&t.stopPropagation(),t.preventDefault&&t.preventDefault(),!1):void 0}}),!1),e.registerBinding(t,"mouseup",(function(t){if(e.hoverData.capture){e.hoverData.capture=!1;var a=e.cy,o=e.projectIntoViewport(t.clientX,t.clientY),s=e.selection,l=e.findNearestElement(o[0],o[1],!0,!1),u=e.dragData.possibleDragElements,c=e.hoverData.down,h=i(t);if(e.data.bgActivePosistion&&(e.redrawHint("select",!0),e.redraw()),e.hoverData.tapholdCancelled=!0,e.data.bgActivePosistion=void 0,c&&c.unactivate(),3===e.hoverData.which){var d={originalEvent:t,type:"cxttapend",position:{x:o[0],y:o[1]}};if(c?c.emit(d):a.emit(d),!e.hoverData.cxtDragged){var p={originalEvent:t,type:"cxttap",position:{x:o[0],y:o[1]}};c?c.emit(p):a.emit(p)}e.hoverData.cxtDragged=!1,e.hoverData.which=null}else if(1===e.hoverData.which){if(r(l,["mouseup","tapend","vmouseup"],t,{x:o[0],y:o[1]}),e.dragData.didDrag||e.hoverData.dragged||e.hoverData.selecting||e.hoverData.isOverThresholdDrag||(r(c,["click","tap","vclick"],t,{x:o[0],y:o[1]}),C=!1,t.timeStamp-N<=a.multiClickDebounceTime()?(D&&clearTimeout(D),C=!0,N=null,r(c,["dblclick","dbltap","vdblclick"],t,{x:o[0],y:o[1]})):(D=setTimeout((function(){C||r(c,["oneclick","onetap","voneclick"],t,{x:o[0],y:o[1]})}),a.multiClickDebounceTime()),N=t.timeStamp)),null!=c||e.dragData.didDrag||e.hoverData.selecting||e.hoverData.dragged||i(t)||(a.$(n).unselect(["tapunselect"]),u.length>0&&e.redrawHint("eles",!0),e.dragData.possibleDragElements=u=a.collection()),l!=c||e.dragData.didDrag||e.hoverData.selecting||null!=l&&l._private.selectable&&(e.hoverData.dragging||("additive"===a.selectionType()||h?l.selected()?l.unselect(["tapunselect"]):l.select(["tapselect"]):h||(a.$(n).unmerge(l).unselect(["tapunselect"]),l.select(["tapselect"]))),e.redrawHint("eles",!0)),e.hoverData.selecting){var g=a.collection(e.getAllInBox(s[0],s[1],s[2],s[3]));e.redrawHint("select",!0),g.length>0&&e.redrawHint("eles",!0),a.emit({type:"boxend",originalEvent:t,position:{x:o[0],y:o[1]}});var f=function(e){return e.selectable()&&!e.selected()};"additive"===a.selectionType()||h||a.$(n).unmerge(g).unselect(),g.emit("box").stdFilter(f).select().emit("boxselect"),e.redraw()}if(e.hoverData.dragging&&(e.hoverData.dragging=!1,e.redrawHint("select",!0),e.redrawHint("eles",!0),e.redraw()),!s[4]){e.redrawHint("drag",!0),e.redrawHint("eles",!0);var y=c&&c.grabbed();v(u),y&&(c.emit("freeon"),u.emit("free"),e.dragData.didDrag&&(c.emit("dragfreeon"),u.emit("dragfree")))}}s[4]=0,e.hoverData.down=null,e.hoverData.cxtStarted=!1,e.hoverData.draggingEles=!1,e.hoverData.selecting=!1,e.hoverData.isOverThresholdDrag=!1,e.dragData.didDrag=!1,e.hoverData.dragged=!1,e.hoverData.dragDelta=[],e.hoverData.mdownPos=null,e.hoverData.mdownGPos=null}}),!1);var S,O,I,k,M,P,R,B,F,z,G,Y,X,V=function(t){if(!e.scrollingPage){var n=e.cy,r=n.zoom(),i=n.pan(),a=e.projectIntoViewport(t.clientX,t.clientY),o=[a[0]*r+i.x,a[1]*r+i.y];if(e.hoverData.draggingEles||e.hoverData.dragging||e.hoverData.cxtStarted||A())t.preventDefault();else if(n.panningEnabled()&&n.userPanningEnabled()&&n.zoomingEnabled()&&n.userZoomingEnabled()){var s;t.preventDefault(),e.data.wheelZooming=!0,clearTimeout(e.data.wheelTimeout),e.data.wheelTimeout=setTimeout((function(){e.data.wheelZooming=!1,e.redrawHint("eles",!0),e.redraw()}),150),s=null!=t.deltaY?t.deltaY/-250:null!=t.wheelDeltaY?t.wheelDeltaY/1e3:t.wheelDelta/1e3,s*=e.wheelSensitivity,1===t.deltaMode&&(s*=33);var l=n.zoom()*Math.pow(10,s);"gesturechange"===t.type&&(l=e.gestureStartZoom*t.scale),n.zoom({level:l,renderedPosition:{x:o[0],y:o[1]}}),n.emit("gesturechange"===t.type?"pinchzoom":"scrollzoom")}}};e.registerBinding(e.container,"wheel",V,!0),e.registerBinding(t,"scroll",(function(t){e.scrollingPage=!0,clearTimeout(e.scrollingPageTimeout),e.scrollingPageTimeout=setTimeout((function(){e.scrollingPage=!1}),250)}),!0),e.registerBinding(e.container,"gesturestart",(function(t){e.gestureStartZoom=e.cy.zoom(),e.hasTouchStarted||t.preventDefault()}),!0),e.registerBinding(e.container,"gesturechange",(function(t){e.hasTouchStarted||V(t)}),!0),e.registerBinding(e.container,"mouseout",(function(t){var n=e.projectIntoViewport(t.clientX,t.clientY);e.cy.emit({originalEvent:t,type:"mouseout",position:{x:n[0],y:n[1]}})}),!1),e.registerBinding(e.container,"mouseover",(function(t){var n=e.projectIntoViewport(t.clientX,t.clientY);e.cy.emit({originalEvent:t,type:"mouseover",position:{x:n[0],y:n[1]}})}),!1);var U,j,H,q,W,$,K,Z=function(e,t,n,r){return Math.sqrt((n-e)*(n-e)+(r-t)*(r-t))},Q=function(e,t,n,r){return(n-e)*(n-e)+(r-t)*(r-t)};if(e.registerBinding(e.container,"touchstart",U=function(t){if(e.hasTouchStarted=!0,L(t)){m(),e.touchData.capture=!0,e.data.bgActivePosistion=void 0;var n=e.cy,i=e.touchData.now,a=e.touchData.earlier;if(t.touches[0]){var o=e.projectIntoViewport(t.touches[0].clientX,t.touches[0].clientY);i[0]=o[0],i[1]=o[1]}if(t.touches[1]&&(o=e.projectIntoViewport(t.touches[1].clientX,t.touches[1].clientY),i[2]=o[0],i[3]=o[1]),t.touches[2]&&(o=e.projectIntoViewport(t.touches[2].clientX,t.touches[2].clientY),i[4]=o[0],i[5]=o[1]),t.touches[1]){e.touchData.singleTouchMoved=!0,v(e.dragData.touchDragEles);var s=e.findContainerClientCoords();F=s[0],z=s[1],G=s[2],Y=s[3],S=t.touches[0].clientX-F,O=t.touches[0].clientY-z,I=t.touches[1].clientX-F,k=t.touches[1].clientY-z,X=0<=S&&S<=G&&0<=I&&I<=G&&0<=O&&O<=Y&&0<=k&&k<=Y;var l=n.pan(),u=n.zoom();M=Z(S,O,I,k),P=Q(S,O,I,k),B=[((R=[(S+I)/2,(O+k)/2])[0]-l.x)/u,(R[1]-l.y)/u];var h=200;if(P=1){for(var T=e.touchData.startPosition=[null,null,null,null,null,null],_=0;_=e.touchTapThreshold2}if(n&&e.touchData.cxt){t.preventDefault();var x=t.touches[0].clientX-F,w=t.touches[0].clientY-z,E=t.touches[1].clientX-F,T=t.touches[1].clientY-z,D=Q(x,w,E,T),C=150,N=1.5;if(D/P>=N*N||D>=C*C){e.touchData.cxt=!1,e.data.bgActivePosistion=void 0,e.redrawHint("select",!0);var A={originalEvent:t,type:"cxttapend",position:{x:s[0],y:s[1]}};e.touchData.start?(e.touchData.start.unactivate().emit(A),e.touchData.start=null):o.emit(A)}}if(n&&e.touchData.cxt){A={originalEvent:t,type:"cxtdrag",position:{x:s[0],y:s[1]}},e.data.bgActivePosistion=void 0,e.redrawHint("select",!0),e.touchData.start?e.touchData.start.emit(A):o.emit(A),e.touchData.start&&(e.touchData.start._private.grabbed=!1),e.touchData.cxtDragged=!0;var R=e.findNearestElement(s[0],s[1],!0,!0);e.touchData.cxtOver&&R===e.touchData.cxtOver||(e.touchData.cxtOver&&e.touchData.cxtOver.emit({originalEvent:t,type:"cxtdragout",position:{x:s[0],y:s[1]}}),e.touchData.cxtOver=R,R&&R.emit({originalEvent:t,type:"cxtdragover",position:{x:s[0],y:s[1]}}))}else if(n&&t.touches[2]&&o.boxSelectionEnabled())t.preventDefault(),e.data.bgActivePosistion=void 0,this.lastThreeTouch=+new Date,e.touchData.selecting||o.emit({originalEvent:t,type:"boxstart",position:{x:s[0],y:s[1]}}),e.touchData.selecting=!0,e.touchData.didSelect=!0,i[4]=1,i&&0!==i.length&&void 0!==i[0]?(i[2]=(s[0]+s[2]+s[4])/3,i[3]=(s[1]+s[3]+s[5])/3):(i[0]=(s[0]+s[2]+s[4])/3,i[1]=(s[1]+s[3]+s[5])/3,i[2]=(s[0]+s[2]+s[4])/3+1,i[3]=(s[1]+s[3]+s[5])/3+1),e.redrawHint("select",!0),e.redraw();else if(n&&t.touches[1]&&!e.touchData.didSelect&&o.zoomingEnabled()&&o.panningEnabled()&&o.userZoomingEnabled()&&o.userPanningEnabled()){if(t.preventDefault(),e.data.bgActivePosistion=void 0,e.redrawHint("select",!0),ne=e.dragData.touchDragEles){e.redrawHint("drag",!0);for(var G=0;G0&&!e.hoverData.draggingEles&&!e.swipePanning&&null!=e.data.bgActivePosistion&&(e.data.bgActivePosistion=void 0,e.redrawHint("select",!0),e.redraw())}},!1),e.registerBinding(t,"touchcancel",H=function(t){var n=e.touchData.start;e.touchData.capture=!1,n&&n.unactivate()}),e.registerBinding(t,"touchend",q=function(t){var i=e.touchData.start;if(e.touchData.capture){0===t.touches.length&&(e.touchData.capture=!1),t.preventDefault();var a=e.selection;e.swipePanning=!1,e.hoverData.draggingEles=!1;var o,s=e.cy,l=s.zoom(),u=e.touchData.now,c=e.touchData.earlier;if(t.touches[0]){var h=e.projectIntoViewport(t.touches[0].clientX,t.touches[0].clientY);u[0]=h[0],u[1]=h[1]}if(t.touches[1]&&(h=e.projectIntoViewport(t.touches[1].clientX,t.touches[1].clientY),u[2]=h[0],u[3]=h[1]),t.touches[2]&&(h=e.projectIntoViewport(t.touches[2].clientX,t.touches[2].clientY),u[4]=h[0],u[5]=h[1]),i&&i.unactivate(),e.touchData.cxt){if(o={originalEvent:t,type:"cxttapend",position:{x:u[0],y:u[1]}},i?i.emit(o):s.emit(o),!e.touchData.cxtDragged){var d={originalEvent:t,type:"cxttap",position:{x:u[0],y:u[1]}};i?i.emit(d):s.emit(d)}return e.touchData.start&&(e.touchData.start._private.grabbed=!1),e.touchData.cxt=!1,e.touchData.start=null,void e.redraw()}if(!t.touches[2]&&s.boxSelectionEnabled()&&e.touchData.selecting){e.touchData.selecting=!1;var p=s.collection(e.getAllInBox(a[0],a[1],a[2],a[3]));a[0]=void 0,a[1]=void 0,a[2]=void 0,a[3]=void 0,a[4]=0,e.redrawHint("select",!0),s.emit({type:"boxend",originalEvent:t,position:{x:u[0],y:u[1]}});var g=function(e){return e.selectable()&&!e.selected()};p.emit("box").stdFilter(g).select().emit("boxselect"),p.nonempty()&&e.redrawHint("eles",!0),e.redraw()}if(null!=i&&i.unactivate(),t.touches[2])e.data.bgActivePosistion=void 0,e.redrawHint("select",!0);else if(t.touches[1]);else if(t.touches[0]);else if(!t.touches[0]){e.data.bgActivePosistion=void 0,e.redrawHint("select",!0);var f=e.dragData.touchDragEles;if(null!=i){var y=i._private.grabbed;v(f),e.redrawHint("drag",!0),e.redrawHint("eles",!0),y&&(i.emit("freeon"),f.emit("free"),e.dragData.didDrag&&(i.emit("dragfreeon"),f.emit("dragfree"))),r(i,["touchend","tapend","vmouseup","tapdragout"],t,{x:u[0],y:u[1]}),i.unactivate(),e.touchData.start=null}else{var m=e.findNearestElement(u[0],u[1],!0,!0);r(m,["touchend","tapend","vmouseup","tapdragout"],t,{x:u[0],y:u[1]})}var b=e.touchData.startPosition[0]-u[0],x=b*b,w=e.touchData.startPosition[1]-u[1],E=(x+w*w)*l*l;e.touchData.singleTouchMoved||(i||s.$(":selected").unselect(["tapunselect"]),r(i,["tap","vclick"],t,{x:u[0],y:u[1]}),W=!1,t.timeStamp-K<=s.multiClickDebounceTime()?($&&clearTimeout($),W=!0,K=null,r(i,["dbltap","vdblclick"],t,{x:u[0],y:u[1]})):($=setTimeout((function(){W||r(i,["onetap","voneclick"],t,{x:u[0],y:u[1]})}),s.multiClickDebounceTime()),K=t.timeStamp)),null!=i&&!e.dragData.didDrag&&i._private.selectable&&E0)return p[0]}return null},d=Object.keys(c),p=0;p0?l:Yn(i,a,e,t,n,r,o)},checkPoint:function(e,t,n,r,i,a,o){var s=cr(r,i),l=2*s;if($n(e,t,this.points,a,o,r,i-l,[0,-1],n))return!0;if($n(e,t,this.points,a,o,r-l,i,[0,-1],n))return!0;var u=r/2+2*n,c=i/2+2*n;return!!Wn(e,t,[a-u,o-c,a-u,o,a+u,o,a+u,o-c])||!!er(e,t,l,l,a+r/2-s,o+i/2-s,n)||!!er(e,t,l,l,a-r/2+s,o+i/2-s,n)}}},registerNodeShapes:function(){var e=this.nodeShapes={},t=this;this.generateEllipse(),this.generatePolygon("triangle",sr(3,0)),this.generateRoundPolygon("round-triangle",sr(3,0)),this.generatePolygon("rectangle",sr(4,0)),e.square=e.rectangle,this.generateRoundRectangle(),this.generateCutRectangle(),this.generateBarrel(),this.generateBottomRoundrectangle();var n=[0,1,1,0,0,-1,-1,0];this.generatePolygon("diamond",n),this.generateRoundPolygon("round-diamond",n),this.generatePolygon("pentagon",sr(5,0)),this.generateRoundPolygon("round-pentagon",sr(5,0)),this.generatePolygon("hexagon",sr(6,0)),this.generateRoundPolygon("round-hexagon",sr(6,0)),this.generatePolygon("heptagon",sr(7,0)),this.generateRoundPolygon("round-heptagon",sr(7,0)),this.generatePolygon("octagon",sr(8,0)),this.generateRoundPolygon("round-octagon",sr(8,0));var r=new Array(20),i=ur(5,0),a=ur(5,Math.PI/5),o=.5*(3-Math.sqrt(5));o*=1.57;for(var s=0;s=e.deqFastCost*f)break}else if(i){if(p>=e.deqCost*l||p>=e.deqAvgCost*s)break}else if(g>=e.deqNoDrawCost*Eh)break;var v=e.deq(t,h,c);if(!(v.length>0))break;for(var y=0;y0&&(e.onDeqd(t,u),!i&&e.shouldRedraw(t,u,h,c)&&r())},a=e.priority||_t;n.beforeRender(i,a(t))}}}},_h=function(){function e(n){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Et;t(this,e),this.idsByKey=new Yt,this.keyForId=new Yt,this.cachesByLvl=new Yt,this.lvls=[],this.getKey=n,this.doesEleInvalidateKey=r}return i(e,[{key:"getIdsFor",value:function(e){null==e&&Dt("Can not get id list for null key");var t=this.idsByKey,n=this.idsByKey.get(e);return n||(n=new Ut,t.set(e,n)),n}},{key:"addIdForKey",value:function(e,t){null!=e&&this.getIdsFor(e).add(t)}},{key:"deleteIdForKey",value:function(e,t){null!=e&&this.getIdsFor(e).delete(t)}},{key:"getNumberOfIdsForKey",value:function(e){return null==e?0:this.getIdsFor(e).size}},{key:"updateKeyMappingFor",value:function(e){var t=e.id(),n=this.keyForId.get(t),r=this.getKey(e);this.deleteIdForKey(n,t),this.addIdForKey(r,t),this.keyForId.set(t,r)}},{key:"deleteKeyMappingFor",value:function(e){var t=e.id(),n=this.keyForId.get(t);this.deleteIdForKey(n,t),this.keyForId.delete(t)}},{key:"keyHasChangedFor",value:function(e){var t=e.id();return this.keyForId.get(t)!==this.getKey(e)}},{key:"isInvalid",value:function(e){return this.keyHasChangedFor(e)||this.doesEleInvalidateKey(e)}},{key:"getCachesAt",value:function(e){var t=this.cachesByLvl,n=this.lvls,r=t.get(e);return r||(r=new Yt,t.set(e,r),n.push(e)),r}},{key:"getCache",value:function(e,t){return this.getCachesAt(t).get(e)}},{key:"get",value:function(e,t){var n=this.getKey(e),r=this.getCache(n,t);return null!=r&&this.updateKeyMappingFor(e),r}},{key:"getForCachedKey",value:function(e,t){var n=this.keyForId.get(e.id());return this.getCache(n,t)}},{key:"hasCache",value:function(e,t){return this.getCachesAt(t).has(e)}},{key:"has",value:function(e,t){var n=this.getKey(e);return this.hasCache(n,t)}},{key:"setCache",value:function(e,t,n){n.key=e,this.getCachesAt(t).set(e,n)}},{key:"set",value:function(e,t,n){var r=this.getKey(e);this.setCache(r,t,n),this.updateKeyMappingFor(e)}},{key:"deleteCache",value:function(e,t){this.getCachesAt(t).delete(e)}},{key:"delete",value:function(e,t){var n=this.getKey(e);this.deleteCache(n,t)}},{key:"invalidateKey",value:function(e){var t=this;this.lvls.forEach((function(n){return t.deleteCache(e,n)}))}},{key:"invalidate",value:function(e){var t=e.id(),n=this.keyForId.get(t);this.deleteKeyMappingFor(e);var r=this.doesEleInvalidateKey(e);return r&&this.invalidateKey(n),r||0===this.getNumberOfIdsForKey(n)}}]),e}(),Dh=25,Ch=50,Nh=-4,Ah=3,Lh=7.99,Sh=8,Oh=1024,Ih=1024,kh=1024,Mh=.2,Ph=.8,Rh=10,Bh=.15,Fh=.1,zh=.9,Gh=.9,Yh=100,Xh=1,Vh={dequeue:"dequeue",downscale:"downscale",highQuality:"highQuality"},Uh=Mt({getKey:null,doesEleInvalidateKey:Et,drawElement:null,getBoundingBox:null,getRotationPoint:null,getRotationOffset:null,isVisible:wt,allowEdgeTxrCaching:!0,allowParentTxrCaching:!0}),jh=function(e,t){var n=this;n.renderer=e,n.onDequeues=[];var r=Uh(t);Q(n,r),n.lookup=new _h(r.getKey,r.doesEleInvalidateKey),n.setupDequeueing()},Hh=jh.prototype;Hh.reasons=Vh,Hh.getTextureQueue=function(e){var t=this;return t.eleImgCaches=t.eleImgCaches||{},t.eleImgCaches[e]=t.eleImgCaches[e]||[]},Hh.getRetiredTextureQueue=function(e){var t=this,n=t.eleImgCaches.retired=t.eleImgCaches.retired||{};return n[e]=n[e]||[]},Hh.getElementQueue=function(){var e=this;return e.eleCacheQueue=e.eleCacheQueue||new $t((function(e,t){return t.reqs-e.reqs}))},Hh.getElementKeyToQueue=function(){var e=this;return e.eleKeyToCacheQueue=e.eleKeyToCacheQueue||{}},Hh.getElement=function(e,t,n,r,i){var a=this,o=this.renderer,s=o.cy.zoom(),l=this.lookup;if(!t||0===t.w||0===t.h||isNaN(t.w)||isNaN(t.h)||!e.visible()||e.removed())return null;if(!a.allowEdgeTxrCaching&&e.isEdge()||!a.allowParentTxrCaching&&e.isParent())return null;if(null==r&&(r=Math.ceil(xn(s*n))),r=Lh||r>Ah)return null;var u=Math.pow(2,r),c=t.h*u,h=t.w*u,d=o.eleTextBiggerThanMin(e,u);if(!this.isVisible(e,d))return null;var p,g=l.get(e,r);if(g&&g.invalidated&&(g.invalidated=!1,g.texture.invalidatedWidth-=g.width),g)return g;if(p=c<=Dh?Dh:c<=Ch?Ch:Math.ceil(c/Ch)*Ch,c>kh||h>Ih)return null;var f=a.getTextureQueue(p),v=f[f.length-2],y=function(){return a.recycleTexture(p,h)||a.addTexture(p,h)};v||(v=f[f.length-1]),v||(v=y()),v.width-v.usedWidthr;N--)D=a.getElement(e,t,n,N,Vh.downscale);C()}else{var A;if(!x&&!w&&!E)for(var L=r-1;L>=Nh;L--){var S=l.get(e,L);if(S){A=S;break}}if(b(A))return a.queueElement(e,r),A;v.context.translate(v.usedWidth,0),v.context.scale(u,u),this.drawElement(v.context,e,t,d,!1),v.context.scale(1/u,1/u),v.context.translate(-v.usedWidth,0)}return g={x:v.usedWidth,texture:v,level:r,scale:u,width:h,height:c,scaledLabelShown:d},v.usedWidth+=Math.ceil(h+Sh),v.eleCaches.push(g),l.set(e,r,g),a.checkTextureFullness(v),g},Hh.invalidateElements=function(e){for(var t=0;t=Mh*e.width&&this.retireTexture(e)},Hh.checkTextureFullness=function(e){var t=this.getTextureQueue(e.height);e.usedWidth/e.width>Ph&&e.fullnessChecks>=Rh?Pt(t,e):e.fullnessChecks++},Hh.retireTexture=function(e){var t=this,n=e.height,r=t.getTextureQueue(n),i=this.lookup;Pt(r,e),e.retired=!0;for(var a=e.eleCaches,o=0;o=t)return o.retired=!1,o.usedWidth=0,o.invalidatedWidth=0,o.fullnessChecks=0,Rt(o.eleCaches),o.context.setTransform(1,0,0,1,0,0),o.context.clearRect(0,0,o.width,o.height),Pt(i,o),r.push(o),o}},Hh.queueElement=function(e,t){var n=this,r=n.getElementQueue(),i=n.getElementKeyToQueue(),a=this.getKey(e),o=i[a];if(o)o.level=Math.max(o.level,t),o.eles.merge(e),o.reqs++,r.updateItem(o);else{var s={eles:e.spawn().merge(e),level:t,reqs:1,key:a};r.push(s),i[a]=s}},Hh.dequeue=function(e){for(var t=this,n=t.getElementQueue(),r=t.getElementKeyToQueue(),i=[],a=t.lookup,o=0;o0;o++){var s=n.pop(),l=s.key,u=s.eles[0],c=a.hasCache(u,s.level);if(r[l]=null,!c){i.push(s);var h=t.getBoundingBox(u);t.getElement(u,h,e,s.level,Vh.dequeue)}}return i},Hh.removeFromQueue=function(e){var t=this,n=t.getElementQueue(),r=t.getElementKeyToQueue(),i=this.getKey(e),a=r[i];null!=a&&(1===a.eles.length?(a.reqs=xt,n.updateItem(a),n.pop(),r[i]=null):a.eles.unmerge(e))},Hh.onDequeue=function(e){this.onDequeues.push(e)},Hh.offDequeue=function(e){Pt(this.onDequeues,e)},Hh.setupDequeueing=Th.setupDequeueing({deqRedrawThreshold:Yh,deqCost:Bh,deqAvgCost:Fh,deqNoDrawCost:zh,deqFastCost:Gh,deq:function(e,t,n){return e.dequeue(t,n)},onDeqd:function(e,t){for(var n=0;n=Kh||n>$h)return null;r.validateLayersElesOrdering(n,e);var o,s,l=r.layersByLevel,u=Math.pow(2,n),c=l[n]=l[n]||[],h=function(){var t=function(t){if(r.validateLayersElesOrdering(t,e),r.levelIsComplete(t,e))return s=l[t],!0},i=function(e){if(!s)for(var r=n+e;Wh<=r&&r<=$h&&!t(r);r+=e);};i(1),i(-1);for(var a=c.length-1;a>=0;a--){var o=c[a];o.invalid&&Pt(c,o)}};if(r.levelIsComplete(n,e))return c;h();var d=function(){if(!o){o=Ln();for(var t=0;tad)return null;var i=r.makeLayer(o,n);if(null!=t){var a=c.indexOf(t)+1;c.splice(a,0,i)}else(void 0===e.insert||e.insert)&&c.unshift(i);return i};if(r.skipping&&!a)return null;for(var g=null,f=e.length/qh,v=!a,y=0;y=f||!Gn(g.bb,m.boundingBox()))&&!(g=p({insert:!0,after:g})))return null;s||v?r.queueLayer(g,m):r.drawEleInLayer(g,m,n,t),g.eles.push(m),x[n]=g}}return s||(v?null:c)},ld.getEleLevelForLayerLevel=function(e,t){return e},ld.drawEleInLayer=function(e,t,n,r){var i=this,a=this.renderer,o=e.context,s=t.boundingBox();0!==s.w&&0!==s.h&&t.visible()&&(n=i.getEleLevelForLayerLevel(n,r),a.setImgSmoothing(o,!1),a.drawCachedElement(o,t,null,null,n,od),a.setImgSmoothing(o,!0))},ld.levelIsComplete=function(e,t){var n=this.layersByLevel[e];if(!n||0===n.length)return!1;for(var r=0,i=0;i0)return!1;if(a.invalid)return!1;r+=a.eles.length}return r===t.length},ld.validateLayersElesOrdering=function(e,t){var n=this.layersByLevel[e];if(n)for(var r=0;r0){t=!0;break}}return t},ld.invalidateElements=function(e){var t=this;0!==e.length&&(t.lastInvalidationTime=rt(),0!==e.length&&t.haveLayers()&&t.updateElementsInLayers(e,(function(e,n,r){t.invalidateLayer(e)})))},ld.invalidateLayer=function(e){if(this.lastInvalidationTime=rt(),!e.invalid){var t=e.level,n=e.eles,r=this.layersByLevel[t];Pt(r,e),e.elesQueue=[],e.invalid=!0,e.replacement&&(e.replacement.invalid=!0);for(var i=0;i3&&void 0!==arguments[3])||arguments[3],i=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],a=!(arguments.length>5&&void 0!==arguments[5])||arguments[5],o=this,s=t._private.rscratch;if((!a||t.visible())&&!s.badLine&&null!=s.allpts&&!isNaN(s.allpts[0])){var l;n&&(l=n,e.translate(-l.x1,-l.y1));var u=a?t.pstyle("opacity").value:1,c=a?t.pstyle("line-opacity").value:1,h=t.pstyle("curve-style").value,d=t.pstyle("line-style").value,p=t.pstyle("width").pfValue,g=t.pstyle("line-cap").value,f=u*c,v=u*c,y=function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:f;"straight-triangle"===h?(o.eleStrokeStyle(e,t,n),o.drawEdgeTrianglePath(t,e,s.allpts)):(e.lineWidth=p,e.lineCap=g,o.eleStrokeStyle(e,t,n),o.drawEdgePath(t,e,s.allpts,d),e.lineCap="butt")},m=function(){i&&o.drawEdgeOverlay(e,t)},b=function(){i&&o.drawEdgeUnderlay(e,t)},x=function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:v;o.drawArrowheads(e,t,n)},w=function(){o.drawElementText(e,t,null,r)};if(e.lineJoin="round","yes"===t.pstyle("ghost").value){var E=t.pstyle("ghost-offset-x").pfValue,T=t.pstyle("ghost-offset-y").pfValue,_=t.pstyle("ghost-opacity").value,D=f*_;e.translate(E,T),y(D),x(D),e.translate(-E,-T)}b(),y(),x(),m(),w(),n&&e.translate(l.x1,l.y1)}}},Cd=function(e){if(!["overlay","underlay"].includes(e))throw new Error("Invalid state");return function(t,n){if(n.visible()){var r=n.pstyle("".concat(e,"-opacity")).value;if(0!==r){var i=this,a=i.usePaths(),o=n._private.rscratch,s=2*n.pstyle("".concat(e,"-padding")).pfValue,l=n.pstyle("".concat(e,"-color")).value;t.lineWidth=s,"self"!==o.edgeType||a?t.lineCap="round":t.lineCap="butt",i.colorStrokeStyle(t,l[0],l[1],l[2],r),i.drawEdgePath(n,t,o.allpts,"solid")}}}};Dd.drawEdgeOverlay=Cd("overlay"),Dd.drawEdgeUnderlay=Cd("underlay"),Dd.drawEdgePath=function(e,t,n,r){var i,a=e._private.rscratch,o=t,s=!1,l=this.usePaths(),u=e.pstyle("line-dash-pattern").pfValue,c=e.pstyle("line-dash-offset").pfValue;if(l){var h=n.join("$");a.pathCacheKey&&a.pathCacheKey===h?(i=t=a.pathCache,s=!0):(i=t=new Path2D,a.pathCacheKey=h,a.pathCache=i)}if(o.setLineDash)switch(r){case"dotted":o.setLineDash([1,1]);break;case"dashed":o.setLineDash(u),o.lineDashOffset=c;break;case"solid":o.setLineDash([])}if(!s&&!a.badLine)switch(t.beginPath&&t.beginPath(),t.moveTo(n[0],n[1]),a.edgeType){case"bezier":case"self":case"compound":case"multibezier":for(var d=2;d+35&&void 0!==arguments[5]?arguments[5]:5;e.beginPath(),e.moveTo(t+a,n),e.lineTo(t+r-a,n),e.quadraticCurveTo(t+r,n,t+r,n+a),e.lineTo(t+r,n+i-a),e.quadraticCurveTo(t+r,n+i,t+r-a,n+i),e.lineTo(t+a,n+i),e.quadraticCurveTo(t,n+i,t,n+i-a),e.lineTo(t,n+a),e.quadraticCurveTo(t,n,t+a,n),e.closePath(),e.fill()}Ad.eleTextBiggerThanMin=function(e,t){if(!t){var n=e.cy().zoom(),r=this.getPixelRatio(),i=Math.ceil(xn(n*r));t=Math.pow(2,i)}return!(e.pstyle("font-size").pfValue*t5&&void 0!==arguments[5])||arguments[5],o=this;if(null==r){if(a&&!o.eleTextBiggerThanMin(t))return}else if(!1===r)return;if(t.isNode()){var s=t.pstyle("label");if(!s||!s.value)return;var l=o.getLabelJustification(t);e.textAlign=l,e.textBaseline="bottom"}else{var u=t.element()._private.rscratch.badLine,c=t.pstyle("label"),h=t.pstyle("source-label"),d=t.pstyle("target-label");if(u||(!c||!c.value)&&(!h||!h.value)&&(!d||!d.value))return;e.textAlign="center",e.textBaseline="bottom"}var p,g=!n;n&&(p=n,e.translate(-p.x1,-p.y1)),null==i?(o.drawText(e,t,null,g,a),t.isEdge()&&(o.drawText(e,t,"source",g,a),o.drawText(e,t,"target",g,a))):o.drawText(e,t,i,g,a),n&&e.translate(p.x1,p.y1)},Ad.getFontCache=function(e){var t;this.fontCaches=this.fontCaches||[];for(var n=0;n2&&void 0!==arguments[2])||arguments[2],r=t.pstyle("font-style").strValue,i=t.pstyle("font-size").pfValue+"px",a=t.pstyle("font-family").strValue,o=t.pstyle("font-weight").strValue,s=n?t.effectiveOpacity()*t.pstyle("text-opacity").value:1,l=t.pstyle("text-outline-opacity").value*s,u=t.pstyle("color").value,c=t.pstyle("text-outline-color").value;e.font=r+" "+o+" "+i+" "+a,e.lineJoin="round",this.colorFillStyle(e,u[0],u[1],u[2],s),this.colorStrokeStyle(e,c[0],c[1],c[2],l)},Ad.getTextAngle=function(e,t){var n=e._private.rscratch,r=t?t+"-":"",i=e.pstyle(r+"text-rotation"),a=Ft(n,"labelAngle",t);return"autorotate"===i.strValue?e.isEdge()?a:0:"none"===i.strValue?0:i.pfValue},Ad.drawText=function(e,t,n){var r=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],i=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],a=t._private.rscratch,o=i?t.effectiveOpacity():1;if(!i||0!==o&&0!==t.pstyle("text-opacity").value){"main"===n&&(n=null);var s,l,u=Ft(a,"labelX",n),c=Ft(a,"labelY",n),h=this.getLabelText(t,n);if(null!=h&&""!==h&&!isNaN(u)&&!isNaN(c)){this.setupTextStyle(e,t,i);var d,p=n?n+"-":"",g=Ft(a,"labelWidth",n),f=Ft(a,"labelHeight",n),v=t.pstyle(p+"text-margin-x").pfValue,y=t.pstyle(p+"text-margin-y").pfValue,m=t.isEdge(),b=t.pstyle("text-halign").value,x=t.pstyle("text-valign").value;switch(m&&(b="center",x="center"),u+=v,c+=y,0!==(d=r?this.getTextAngle(t,n):0)&&(s=u,l=c,e.translate(s,l),e.rotate(d),u=0,c=0),x){case"top":break;case"center":c+=f/2;break;case"bottom":c+=f}var w=t.pstyle("text-background-opacity").value,E=t.pstyle("text-border-opacity").value,T=t.pstyle("text-border-width").pfValue,_=t.pstyle("text-background-padding").pfValue;if(w>0||T>0&&E>0){var D=u-_;switch(b){case"left":D-=g;break;case"center":D-=g/2}var C=c-f-_,N=g+2*_,A=f+2*_;if(w>0){var L=e.fillStyle,S=t.pstyle("text-background-color").value;e.fillStyle="rgba("+S[0]+","+S[1]+","+S[2]+","+w*o+")",0===t.pstyle("text-background-shape").strValue.indexOf("round")?Ld(e,D,C,N,A,2):e.fillRect(D,C,N,A),e.fillStyle=L}if(T>0&&E>0){var O=e.strokeStyle,I=e.lineWidth,k=t.pstyle("text-border-color").value,M=t.pstyle("text-border-style").value;if(e.strokeStyle="rgba("+k[0]+","+k[1]+","+k[2]+","+E*o+")",e.lineWidth=T,e.setLineDash)switch(M){case"dotted":e.setLineDash([1,1]);break;case"dashed":e.setLineDash([4,2]);break;case"double":e.lineWidth=T/4,e.setLineDash([]);break;case"solid":e.setLineDash([])}if(e.strokeRect(D,C,N,A),"double"===M){var P=T/2;e.strokeRect(D+P,C+P,N-2*P,A-2*P)}e.setLineDash&&e.setLineDash([]),e.lineWidth=I,e.strokeStyle=O}}var R=2*t.pstyle("text-outline-width").pfValue;if(R>0&&(e.lineWidth=R),"wrap"===t.pstyle("text-wrap").value){var B=Ft(a,"labelWrapCachedLines",n),F=Ft(a,"labelLineHeight",n),z=g/2,G=this.getLabelJustification(t);switch("auto"===G||("left"===b?"left"===G?u+=-g:"center"===G&&(u+=-z):"center"===b?"left"===G?u+=-z:"right"===G&&(u+=z):"right"===b&&("center"===G?u+=z:"right"===G&&(u+=g))),x){case"top":case"center":case"bottom":c-=(B.length-1)*F}for(var Y=0;Y0&&e.strokeText(B[Y],u,c),e.fillText(B[Y],u,c),c+=F}else R>0&&e.strokeText(h,u,c),e.fillText(h,u,c);0!==d&&(e.rotate(-d),e.translate(-s,-l))}}};var Sd={drawNode:function(e,t,n){var r,i,a=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],s=!(arguments.length>5&&void 0!==arguments[5])||arguments[5],l=this,u=t._private,c=u.rscratch,h=t.position();if(_(h.x)&&_(h.y)&&(!s||t.visible())){var d,p,g=s?t.effectiveOpacity():1,f=l.usePaths(),v=!1,y=t.padding();r=t.width()+2*y,i=t.height()+2*y,n&&(p=n,e.translate(-p.x1,-p.y1));for(var m=t.pstyle("background-image").value,b=new Array(m.length),x=new Array(m.length),w=0,E=0;E0&&void 0!==arguments[0]?arguments[0]:A;l.eleFillStyle(e,t,n)},k=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:O;l.colorStrokeStyle(e,L[0],L[1],L[2],t)},M=t.pstyle("shape").strValue,P=t.pstyle("shape-polygon-points").pfValue;if(f){e.translate(h.x,h.y);var R=l.nodePathCache=l.nodePathCache||[],B=ft("polygon"===M?M+","+P.join(","):M,""+i,""+r),F=R[B];null!=F?(d=F,v=!0,c.pathCache=d):(d=new Path2D,R[B]=c.pathCache=d)}var z=function(){if(!v){var n=h;f&&(n={x:0,y:0}),l.nodeShapes[l.getNodeShape(t)].draw(d||e,n.x,n.y,r,i)}f?e.fill(d):e.fill()},G=function(){for(var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:g,r=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=u.backgrounding,a=0,o=0;o0&&void 0!==arguments[0]&&arguments[0],a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:g;l.hasPie(t)&&(l.drawPie(e,t,a),n&&(f||l.nodeShapes[l.getNodeShape(t)].draw(e,h.x,h.y,r,i)))},X=function(){var t=(C>0?C:-C)*(arguments.length>0&&void 0!==arguments[0]?arguments[0]:g),n=C>0?0:255;0!==C&&(l.colorFillStyle(e,n,n,n,t),f?e.fill(d):e.fill())},V=function(){if(N>0){if(e.lineWidth=N,e.lineCap="butt",e.setLineDash)switch(S){case"dotted":e.setLineDash([1,1]);break;case"dashed":e.setLineDash([4,2]);break;case"solid":case"double":e.setLineDash([])}if(f?e.stroke(d):e.stroke(),"double"===S){e.lineWidth=N/3;var t=e.globalCompositeOperation;e.globalCompositeOperation="destination-out",f?e.stroke(d):e.stroke(),e.globalCompositeOperation=t}e.setLineDash&&e.setLineDash([])}},U=function(){o&&l.drawNodeOverlay(e,t,h,r,i)},j=function(){o&&l.drawNodeUnderlay(e,t,h,r,i)},H=function(){l.drawElementText(e,t,null,a)};if("yes"===t.pstyle("ghost").value){var q=t.pstyle("ghost-offset-x").pfValue,W=t.pstyle("ghost-offset-y").pfValue,$=t.pstyle("ghost-opacity").value,K=$*g;e.translate(q,W),I($*A),z(),G(K,!0),k($*O),V(),Y(0!==C||0!==N),G(K,!1),X(K),e.translate(-q,-W)}f&&e.translate(-h.x,-h.y),j(),f&&e.translate(h.x,h.y),I(),z(),G(g,!0),k(),V(),Y(0!==C||0!==N),G(g,!1),X(),f&&e.translate(-h.x,-h.y),H(),U(),n&&e.translate(p.x1,p.y1)}}},Od=function(e){if(!["overlay","underlay"].includes(e))throw new Error("Invalid state");return function(t,n,r,i,a){var o=this;if(n.visible()){var s=n.pstyle("".concat(e,"-padding")).pfValue,l=n.pstyle("".concat(e,"-opacity")).value,u=n.pstyle("".concat(e,"-color")).value,c=n.pstyle("".concat(e,"-shape")).value;if(l>0){if(r=r||n.position(),null==i||null==a){var h=n.padding();i=n.width()+2*h,a=n.height()+2*h}o.colorFillStyle(t,u[0],u[1],u[2],l),o.nodeShapes[c].draw(t,r.x,r.y,i+2*s,a+2*s),t.fill()}}}};Sd.drawNodeOverlay=Od("overlay"),Sd.drawNodeUnderlay=Od("underlay"),Sd.hasPie=function(e){return(e=e[0])._private.hasPie},Sd.drawPie=function(e,t,n,r){t=t[0],r=r||t.position();var i=t.cy().style(),a=t.pstyle("pie-size"),o=r.x,s=r.y,l=t.width(),u=t.height(),c=Math.min(l,u)/2,h=0;this.usePaths()&&(o=0,s=0),"%"===a.units?c*=a.pfValue:void 0!==a.pfValue&&(c=a.pfValue/2);for(var d=1;d<=i.pieBackgroundN;d++){var p=t.pstyle("pie-"+d+"-background-size").value,g=t.pstyle("pie-"+d+"-background-color").value,f=t.pstyle("pie-"+d+"-background-opacity").value*n,v=p/100;v+h>1&&(v=1-h);var y=1.5*Math.PI+2*Math.PI*h,m=y+2*Math.PI*v;0===p||h>=1||h+v>1||(e.beginPath(),e.moveTo(o,s),e.arc(o,s,c,y,m),e.closePath(),this.colorFillStyle(e,g[0],g[1],g[2],f),e.fill(),h+=v)}};var Id={},kd=100;Id.getPixelRatio=function(){var e=this.data.contexts[0];if(null!=this.forcedPixelRatio)return this.forcedPixelRatio;var t=e.backingStorePixelRatio||e.webkitBackingStorePixelRatio||e.mozBackingStorePixelRatio||e.msBackingStorePixelRatio||e.oBackingStorePixelRatio||e.backingStorePixelRatio||1;return(window.devicePixelRatio||1)/t},Id.paintCache=function(e){for(var t,n=this.paintCaches=this.paintCaches||[],r=!0,i=0;io.minMbLowQualFrames&&(o.motionBlurPxRatio=o.mbPxRBlurry)),o.clearingMotionBlur&&(o.motionBlurPxRatio=1),o.textureDrawLastFrame&&!h&&(c[o.NODE]=!0,c[o.SELECT_BOX]=!0);var m=l.style(),b=l.zoom(),x=void 0!==i?i:b,w=l.pan(),E={x:w.x,y:w.y},T={zoom:b,pan:{x:w.x,y:w.y}},_=o.prevViewport;void 0===_||T.zoom!==_.zoom||T.pan.x!==_.pan.x||T.pan.y!==_.pan.y||f&&!g||(o.motionBlurPxRatio=1),a&&(E=a),x*=s,E.x*=s,E.y*=s;var D=o.getCachedZSortedEles();function C(e,t,n,r,i){var a=e.globalCompositeOperation;e.globalCompositeOperation="destination-out",o.colorFillStyle(e,255,255,255,o.motionBlurTransparency),e.fillRect(t,n,r,i),e.globalCompositeOperation=a}function N(e,r){var s,l,c,h;o.clearingMotionBlur||e!==u.bufferContexts[o.MOTIONBLUR_BUFFER_NODE]&&e!==u.bufferContexts[o.MOTIONBLUR_BUFFER_DRAG]?(s=E,l=x,c=o.canvasWidth,h=o.canvasHeight):(s={x:w.x*p,y:w.y*p},l=b*p,c=o.canvasWidth*p,h=o.canvasHeight*p),e.setTransform(1,0,0,1,0,0),"motionBlur"===r?C(e,0,0,c,h):t||void 0!==r&&!r||e.clearRect(0,0,c,h),n||(e.translate(s.x,s.y),e.scale(l,l)),a&&e.translate(a.x,a.y),i&&e.scale(i,i)}if(h||(o.textureDrawLastFrame=!1),h){if(o.textureDrawLastFrame=!0,!o.textureCache){o.textureCache={},o.textureCache.bb=l.mutableElements().boundingBox(),o.textureCache.texture=o.data.bufferCanvases[o.TEXTURE_BUFFER];var A=o.data.bufferContexts[o.TEXTURE_BUFFER];A.setTransform(1,0,0,1,0,0),A.clearRect(0,0,o.canvasWidth*o.textureMult,o.canvasHeight*o.textureMult),o.render({forcedContext:A,drawOnlyNodeLayer:!0,forcedPxRatio:s*o.textureMult}),(T=o.textureCache.viewport={zoom:l.zoom(),pan:l.pan(),width:o.canvasWidth,height:o.canvasHeight}).mpan={x:(0-T.pan.x)/T.zoom,y:(0-T.pan.y)/T.zoom}}c[o.DRAG]=!1,c[o.NODE]=!1;var L=u.contexts[o.NODE],S=o.textureCache.texture;T=o.textureCache.viewport,L.setTransform(1,0,0,1,0,0),d?C(L,0,0,T.width,T.height):L.clearRect(0,0,T.width,T.height);var O=m.core("outside-texture-bg-color").value,I=m.core("outside-texture-bg-opacity").value;o.colorFillStyle(L,O[0],O[1],O[2],I),L.fillRect(0,0,T.width,T.height),b=l.zoom(),N(L,!1),L.clearRect(T.mpan.x,T.mpan.y,T.width/T.zoom/s,T.height/T.zoom/s),L.drawImage(S,T.mpan.x,T.mpan.y,T.width/T.zoom/s,T.height/T.zoom/s)}else o.textureOnViewport&&!t&&(o.textureCache=null);var k=l.extent(),M=o.pinching||o.hoverData.dragging||o.swipePanning||o.data.wheelZooming||o.hoverData.draggingEles||o.cy.animated(),P=o.hideEdgesOnViewport&&M,R=[];if(R[o.NODE]=!c[o.NODE]&&d&&!o.clearedForMotionBlur[o.NODE]||o.clearingMotionBlur,R[o.NODE]&&(o.clearedForMotionBlur[o.NODE]=!0),R[o.DRAG]=!c[o.DRAG]&&d&&!o.clearedForMotionBlur[o.DRAG]||o.clearingMotionBlur,R[o.DRAG]&&(o.clearedForMotionBlur[o.DRAG]=!0),c[o.NODE]||n||r||R[o.NODE]){var B=d&&!R[o.NODE]&&1!==p;N(L=t||(B?o.data.bufferContexts[o.MOTIONBLUR_BUFFER_NODE]:u.contexts[o.NODE]),d&&!B?"motionBlur":void 0),P?o.drawCachedNodes(L,D.nondrag,s,k):o.drawLayeredElements(L,D.nondrag,s,k),o.debug&&o.drawDebugPoints(L,D.nondrag),n||d||(c[o.NODE]=!1)}if(!r&&(c[o.DRAG]||n||R[o.DRAG])&&(B=d&&!R[o.DRAG]&&1!==p,N(L=t||(B?o.data.bufferContexts[o.MOTIONBLUR_BUFFER_DRAG]:u.contexts[o.DRAG]),d&&!B?"motionBlur":void 0),P?o.drawCachedNodes(L,D.drag,s,k):o.drawCachedElements(L,D.drag,s,k),o.debug&&o.drawDebugPoints(L,D.drag),n||d||(c[o.DRAG]=!1)),o.showFps||!r&&c[o.SELECT_BOX]&&!n){if(N(L=t||u.contexts[o.SELECT_BOX]),1==o.selection[4]&&(o.hoverData.selecting||o.touchData.selecting)){b=o.cy.zoom();var F=m.core("selection-box-border-width").value/b;L.lineWidth=F,L.fillStyle="rgba("+m.core("selection-box-color").value[0]+","+m.core("selection-box-color").value[1]+","+m.core("selection-box-color").value[2]+","+m.core("selection-box-opacity").value+")",L.fillRect(o.selection[0],o.selection[1],o.selection[2]-o.selection[0],o.selection[3]-o.selection[1]),F>0&&(L.strokeStyle="rgba("+m.core("selection-box-border-color").value[0]+","+m.core("selection-box-border-color").value[1]+","+m.core("selection-box-border-color").value[2]+","+m.core("selection-box-opacity").value+")",L.strokeRect(o.selection[0],o.selection[1],o.selection[2]-o.selection[0],o.selection[3]-o.selection[1]))}if(u.bgActivePosistion&&!o.hoverData.selecting){b=o.cy.zoom();var z=u.bgActivePosistion;L.fillStyle="rgba("+m.core("active-bg-color").value[0]+","+m.core("active-bg-color").value[1]+","+m.core("active-bg-color").value[2]+","+m.core("active-bg-opacity").value+")",L.beginPath(),L.arc(z.x,z.y,m.core("active-bg-size").pfValue/b,0,2*Math.PI),L.fill()}var G=o.lastRedrawTime;if(o.showFps&&G){G=Math.round(G);var Y=Math.round(1e3/G);L.setTransform(1,0,0,1,0,0),L.fillStyle="rgba(255, 0, 0, 0.75)",L.strokeStyle="rgba(255, 0, 0, 0.75)",L.lineWidth=1,L.fillText("1 frame = "+G+" ms = "+Y+" fps",0,20);var X=60;L.strokeRect(0,30,250,20),L.fillRect(0,30,250*Math.min(Y/X,1),20)}n||(c[o.SELECT_BOX]=!1)}if(d&&1!==p){var V=u.contexts[o.NODE],U=o.data.bufferCanvases[o.MOTIONBLUR_BUFFER_NODE],j=u.contexts[o.DRAG],H=o.data.bufferCanvases[o.MOTIONBLUR_BUFFER_DRAG],q=function(e,t,n){e.setTransform(1,0,0,1,0,0),n||!y?e.clearRect(0,0,o.canvasWidth,o.canvasHeight):C(e,0,0,o.canvasWidth,o.canvasHeight);var r=p;e.drawImage(t,0,0,o.canvasWidth*r,o.canvasHeight*r,0,0,o.canvasWidth,o.canvasHeight)};(c[o.NODE]||R[o.NODE])&&(q(V,U,R[o.NODE]),c[o.NODE]=!1),(c[o.DRAG]||R[o.DRAG])&&(q(j,H,R[o.DRAG]),c[o.DRAG]=!1)}o.prevViewport=T,o.clearingMotionBlur&&(o.clearingMotionBlur=!1,o.motionBlurCleared=!0,o.motionBlur=!0),d&&(o.motionBlurTimeout=setTimeout((function(){o.motionBlurTimeout=null,o.clearedForMotionBlur[o.NODE]=!1,o.clearedForMotionBlur[o.DRAG]=!1,o.motionBlur=!1,o.clearingMotionBlur=!h,o.mbFrames=0,c[o.NODE]=!0,c[o.DRAG]=!0,o.redraw()}),kd)),t||l.emit("render")};for(var Md={drawPolygonPath:function(e,t,n,r,i,a){var o=r/2,s=i/2;e.beginPath&&e.beginPath(),e.moveTo(t+o*a[0],n+s*a[1]);for(var l=1;l0&&a>0){d.clearRect(0,0,i,a),d.globalCompositeOperation="source-over";var p=this.getCachedZSortedEles();if(e.full)d.translate(-n.x1*l,-n.y1*l),d.scale(l,l),this.drawElements(d,p),d.scale(1/l,1/l),d.translate(n.x1*l,n.y1*l);else{var g=t.pan(),f={x:g.x*l,y:g.y*l};l*=t.zoom(),d.translate(f.x,f.y),d.scale(l,l),this.drawElements(d,p),d.scale(1/l,1/l),d.translate(-f.x,-f.y)}e.bg&&(d.globalCompositeOperation="destination-over",d.fillStyle=e.bg,d.rect(0,0,i,a),d.fill())}return h},Yd.png=function(e){return Ud(e,this.bufferCanvasImage(e),"image/png")},Yd.jpg=function(e){return Ud(e,this.bufferCanvasImage(e),"image/jpeg")};var jd={nodeShapeImpl:function(e,t,n,r,i,a,o){switch(e){case"ellipse":return this.drawEllipsePath(t,n,r,i,a);case"polygon":return this.drawPolygonPath(t,n,r,i,a,o);case"round-polygon":return this.drawRoundPolygonPath(t,n,r,i,a,o);case"roundrectangle":case"round-rectangle":return this.drawRoundRectanglePath(t,n,r,i,a);case"cutrectangle":case"cut-rectangle":return this.drawCutRectanglePath(t,n,r,i,a);case"bottomroundrectangle":case"bottom-round-rectangle":return this.drawBottomRoundRectanglePath(t,n,r,i,a);case"barrel":return this.drawBarrelPath(t,n,r,i,a)}}},Hd=Wd,qd=Wd.prototype;function Wd(e){var t=this;t.data={canvases:new Array(qd.CANVAS_LAYERS),contexts:new Array(qd.CANVAS_LAYERS),canvasNeedsRedraw:new Array(qd.CANVAS_LAYERS),bufferCanvases:new Array(qd.BUFFER_COUNT),bufferContexts:new Array(qd.CANVAS_LAYERS)};var n="-webkit-tap-highlight-color",r="rgba(0,0,0,0)";t.data.canvasContainer=document.createElement("div");var i=t.data.canvasContainer.style;t.data.canvasContainer.style[n]=r,i.position="relative",i.zIndex="0",i.overflow="hidden";var a=e.cy.container();a.appendChild(t.data.canvasContainer),a.style[n]=r;var o={"-webkit-user-select":"none","-moz-user-select":"-moz-none","user-select":"none","-webkit-tap-highlight-color":"rgba(0,0,0,0)","outline-style":"none"};B()&&(o["-ms-touch-action"]="none",o["touch-action"]="none");for(var s=0;st&&(this.rect.x-=(this.labelWidth-t)/2,this.setWidth(this.labelWidth)),this.labelHeight>n&&("center"==this.labelPos?this.rect.y-=(this.labelHeight-n)/2:"top"==this.labelPos&&(this.rect.y-=this.labelHeight-n),this.setHeight(this.labelHeight))}}},u.prototype.getInclusionTreeDepth=function(){if(this.inclusionTreeDepth==i.MAX_VALUE)throw"assert failed";return this.inclusionTreeDepth},u.prototype.transform=function(e){var t=this.rect.x;t>o.WORLD_BOUNDARY?t=o.WORLD_BOUNDARY:t<-o.WORLD_BOUNDARY&&(t=-o.WORLD_BOUNDARY);var n=this.rect.y;n>o.WORLD_BOUNDARY?n=o.WORLD_BOUNDARY:n<-o.WORLD_BOUNDARY&&(n=-o.WORLD_BOUNDARY);var r=new l(t,n),i=e.inverseTransformPoint(r);this.setLocation(i.x,i.y)},u.prototype.getLeft=function(){return this.rect.x},u.prototype.getRight=function(){return this.rect.x+this.rect.width},u.prototype.getTop=function(){return this.rect.y},u.prototype.getBottom=function(){return this.rect.y+this.rect.height},u.prototype.getParent=function(){return null==this.owner?null:this.owner.getParent()},e.exports=u},function(e,t,n){"use strict";function r(e,t){null==e&&null==t?(this.x=0,this.y=0):(this.x=e,this.y=t)}r.prototype.getX=function(){return this.x},r.prototype.getY=function(){return this.y},r.prototype.setX=function(e){this.x=e},r.prototype.setY=function(e){this.y=e},r.prototype.getDifference=function(e){return new DimensionD(this.x-e.x,this.y-e.y)},r.prototype.getCopy=function(){return new r(this.x,this.y)},r.prototype.translate=function(e){return this.x+=e.width,this.y+=e.height,this},e.exports=r},function(e,t,n){"use strict";var r=n(2),i=n(10),a=n(0),o=n(6),s=n(3),l=n(1),u=n(13),c=n(12),h=n(11);function d(e,t,n){r.call(this,n),this.estimatedSize=i.MIN_VALUE,this.margin=a.DEFAULT_GRAPH_MARGIN,this.edges=[],this.nodes=[],this.isConnected=!1,this.parent=e,null!=t&&t instanceof o?this.graphManager=t:null!=t&&t instanceof Layout&&(this.graphManager=t.graphManager)}for(var p in d.prototype=Object.create(r.prototype),r)d[p]=r[p];d.prototype.getNodes=function(){return this.nodes},d.prototype.getEdges=function(){return this.edges},d.prototype.getGraphManager=function(){return this.graphManager},d.prototype.getParent=function(){return this.parent},d.prototype.getLeft=function(){return this.left},d.prototype.getRight=function(){return this.right},d.prototype.getTop=function(){return this.top},d.prototype.getBottom=function(){return this.bottom},d.prototype.isConnected=function(){return this.isConnected},d.prototype.add=function(e,t,n){if(null==t&&null==n){var r=e;if(null==this.graphManager)throw"Graph has no graph mgr!";if(this.getNodes().indexOf(r)>-1)throw"Node already in graph!";return r.owner=this,this.getNodes().push(r),r}var i=e;if(!(this.getNodes().indexOf(t)>-1&&this.getNodes().indexOf(n)>-1))throw"Source or target not in graph!";if(t.owner!=n.owner||t.owner!=this)throw"Both owners must be this graph!";return t.owner!=n.owner?null:(i.source=t,i.target=n,i.isInterGraph=!1,this.getEdges().push(i),t.edges.push(i),n!=t&&n.edges.push(i),i)},d.prototype.remove=function(e){var t=e;if(e instanceof s){if(null==t)throw"Node is null!";if(null==t.owner||t.owner!=this)throw"Owner graph is invalid!";if(null==this.graphManager)throw"Owner graph manager is invalid!";for(var n=t.edges.slice(),r=n.length,i=0;i-1&&c>-1))throw"Source and/or target doesn't know this edge!";if(a.source.edges.splice(u,1),a.target!=a.source&&a.target.edges.splice(c,1),-1==(o=a.source.owner.getEdges().indexOf(a)))throw"Not in owner's edge list!";a.source.owner.getEdges().splice(o,1)}},d.prototype.updateLeftTop=function(){for(var e,t,n,r=i.MAX_VALUE,a=i.MAX_VALUE,o=this.getNodes(),s=o.length,l=0;l(e=u.getTop())&&(r=e),a>(t=u.getLeft())&&(a=t)}return r==i.MAX_VALUE?null:(n=null!=o[0].getParent().paddingLeft?o[0].getParent().paddingLeft:this.margin,this.left=a-n,this.top=r-n,new c(this.left,this.top))},d.prototype.updateBounds=function(e){for(var t,n,r,a,o,s=i.MAX_VALUE,l=-i.MAX_VALUE,c=i.MAX_VALUE,h=-i.MAX_VALUE,d=this.nodes,p=d.length,g=0;g(t=f.getLeft())&&(s=t),l<(n=f.getRight())&&(l=n),c>(r=f.getTop())&&(c=r),h<(a=f.getBottom())&&(h=a)}var v=new u(s,c,l-s,h-c);s==i.MAX_VALUE&&(this.left=this.parent.getLeft(),this.right=this.parent.getRight(),this.top=this.parent.getTop(),this.bottom=this.parent.getBottom()),o=null!=d[0].getParent().paddingLeft?d[0].getParent().paddingLeft:this.margin,this.left=v.x-o,this.right=v.x+v.width+o,this.top=v.y-o,this.bottom=v.y+v.height+o},d.calculateBounds=function(e){for(var t,n,r,a,o=i.MAX_VALUE,s=-i.MAX_VALUE,l=i.MAX_VALUE,c=-i.MAX_VALUE,h=e.length,d=0;d(t=p.getLeft())&&(o=t),s<(n=p.getRight())&&(s=n),l>(r=p.getTop())&&(l=r),c<(a=p.getBottom())&&(c=a)}return new u(o,l,s-o,c-l)},d.prototype.getInclusionTreeDepth=function(){return this==this.graphManager.getRoot()?1:this.parent.getInclusionTreeDepth()},d.prototype.getEstimatedSize=function(){if(this.estimatedSize==i.MIN_VALUE)throw"assert failed";return this.estimatedSize},d.prototype.calcEstimatedSize=function(){for(var e=0,t=this.nodes,n=t.length,r=0;r=this.nodes.length){var l=0;i.forEach((function(t){t.owner==e&&l++})),l==this.nodes.length&&(this.isConnected=!0)}}else this.isConnected=!0},e.exports=d},function(e,t,n){"use strict";var r,i=n(1);function a(e){r=n(5),this.layout=e,this.graphs=[],this.edges=[]}a.prototype.addRoot=function(){var e=this.layout.newGraph(),t=this.layout.newNode(null),n=this.add(e,t);return this.setRootGraph(n),this.rootGraph},a.prototype.add=function(e,t,n,r,i){if(null==n&&null==r&&null==i){if(null==e)throw"Graph is null!";if(null==t)throw"Parent node is null!";if(this.graphs.indexOf(e)>-1)throw"Graph already in this graph mgr!";if(this.graphs.push(e),null!=e.parent)throw"Already has a parent!";if(null!=t.child)throw"Already has a child!";return e.parent=t,t.child=e,e}i=n,n=e;var a=(r=t).getOwner(),o=i.getOwner();if(null==a||a.getGraphManager()!=this)throw"Source not in this graph mgr!";if(null==o||o.getGraphManager()!=this)throw"Target not in this graph mgr!";if(a==o)return n.isInterGraph=!1,a.add(n,r,i);if(n.isInterGraph=!0,n.source=r,n.target=i,this.edges.indexOf(n)>-1)throw"Edge already in inter-graph edge list!";if(this.edges.push(n),null==n.source||null==n.target)throw"Edge source and/or target is null!";if(-1!=n.source.edges.indexOf(n)||-1!=n.target.edges.indexOf(n))throw"Edge already in source and/or target incidency list!";return n.source.edges.push(n),n.target.edges.push(n),n},a.prototype.remove=function(e){if(e instanceof r){var t=e;if(t.getGraphManager()!=this)throw"Graph not in this graph mgr";if(t!=this.rootGraph&&(null==t.parent||t.parent.graphManager!=this))throw"Invalid parent node!";for(var n,a=[],o=(a=a.concat(t.getEdges())).length,s=0;s=t.getRight()?n[0]+=Math.min(t.getX()-e.getX(),e.getRight()-t.getRight()):t.getX()<=e.getX()&&t.getRight()>=e.getRight()&&(n[0]+=Math.min(e.getX()-t.getX(),t.getRight()-e.getRight())),e.getY()<=t.getY()&&e.getBottom()>=t.getBottom()?n[1]+=Math.min(t.getY()-e.getY(),e.getBottom()-t.getBottom()):t.getY()<=e.getY()&&t.getBottom()>=e.getBottom()&&(n[1]+=Math.min(e.getY()-t.getY(),t.getBottom()-e.getBottom()));var a=Math.abs((t.getCenterY()-e.getCenterY())/(t.getCenterX()-e.getCenterX()));t.getCenterY()===e.getCenterY()&&t.getCenterX()===e.getCenterX()&&(a=1);var o=a*n[0],s=n[1]/a;n[0]o)return n[0]=r,n[1]=l,n[2]=a,n[3]=b,!1;if(ia)return n[0]=s,n[1]=i,n[2]=y,n[3]=o,!1;if(ra?(n[0]=c,n[1]=h,T=!0):(n[0]=u,n[1]=l,T=!0):D===N&&(r>a?(n[0]=s,n[1]=l,T=!0):(n[0]=d,n[1]=h,T=!0)),-C===N?a>r?(n[2]=m,n[3]=b,_=!0):(n[2]=y,n[3]=v,_=!0):C===N&&(a>r?(n[2]=f,n[3]=v,_=!0):(n[2]=x,n[3]=b,_=!0)),T&&_)return!1;if(r>a?i>o?(A=this.getCardinalDirection(D,N,4),L=this.getCardinalDirection(C,N,2)):(A=this.getCardinalDirection(-D,N,3),L=this.getCardinalDirection(-C,N,1)):i>o?(A=this.getCardinalDirection(-D,N,1),L=this.getCardinalDirection(-C,N,3)):(A=this.getCardinalDirection(D,N,2),L=this.getCardinalDirection(C,N,4)),!T)switch(A){case 1:O=l,S=r+-g/N,n[0]=S,n[1]=O;break;case 2:S=d,O=i+p*N,n[0]=S,n[1]=O;break;case 3:O=h,S=r+g/N,n[0]=S,n[1]=O;break;case 4:S=c,O=i+-p*N,n[0]=S,n[1]=O}if(!_)switch(L){case 1:k=v,I=a+-E/N,n[2]=I,n[3]=k;break;case 2:I=x,k=o+w*N,n[2]=I,n[3]=k;break;case 3:k=b,I=a+E/N,n[2]=I,n[3]=k;break;case 4:I=m,k=o+-w*N,n[2]=I,n[3]=k}}return!1},i.getCardinalDirection=function(e,t,n){return e>t?n:1+n%4},i.getIntersection=function(e,t,n,i){if(null==i)return this.getIntersection2(e,t,n);var a,o,s,l,u,c,h,d=e.x,p=e.y,g=t.x,f=t.y,v=n.x,y=n.y,m=i.x,b=i.y;return 0==(h=(a=f-p)*(l=v-m)-(o=b-y)*(s=d-g))?null:new r((s*(c=m*y-v*b)-l*(u=g*p-d*f))/h,(o*u-a*c)/h)},i.angleOfVector=function(e,t,n,r){var i=void 0;return e!==n?(i=Math.atan((r-t)/(n-e)),n0?1:e<0?-1:0},r.floor=function(e){return e<0?Math.ceil(e):Math.floor(e)},r.ceil=function(e){return e<0?Math.floor(e):Math.ceil(e)},e.exports=r},function(e,t,n){"use strict";function r(){}r.MAX_VALUE=2147483647,r.MIN_VALUE=-2147483648,e.exports=r},function(e,t,n){"use strict";var r=function(){function e(e,t){for(var n=0;n0&&t;){for(s.push(u[0]);s.length>0&&t;){var c=s[0];s.splice(0,1),o.add(c);var h=c.getEdges();for(a=0;a-1&&u.splice(f,1)}o=new Set,l=new Map}else e=[]}return e},d.prototype.createDummyNodesForBendpoints=function(e){for(var t=[],n=e.source,r=this.graphManager.calcLowestCommonAncestor(e.source,e.target),i=0;i0){for(var i=this.edgeToDummyNodes.get(n),a=0;a=0&&t.splice(h,1),c.getNeighborsList().forEach((function(e){if(n.indexOf(e)<0){var t=r.get(e)-1;1==t&&l.push(e),r.set(e,t)}}))}n=n.concat(l),1!=t.length&&2!=t.length||(i=!0,a=t[0])}return a},d.prototype.setGraphManager=function(e){this.graphManager=e},e.exports=d},function(e,t,n){"use strict";function r(){}r.seed=1,r.x=0,r.nextDouble=function(){return r.x=1e4*Math.sin(r.seed++),r.x-Math.floor(r.x)},e.exports=r},function(e,t,n){"use strict";var r=n(4);function i(e,t){this.lworldOrgX=0,this.lworldOrgY=0,this.ldeviceOrgX=0,this.ldeviceOrgY=0,this.lworldExtX=1,this.lworldExtY=1,this.ldeviceExtX=1,this.ldeviceExtY=1}i.prototype.getWorldOrgX=function(){return this.lworldOrgX},i.prototype.setWorldOrgX=function(e){this.lworldOrgX=e},i.prototype.getWorldOrgY=function(){return this.lworldOrgY},i.prototype.setWorldOrgY=function(e){this.lworldOrgY=e},i.prototype.getWorldExtX=function(){return this.lworldExtX},i.prototype.setWorldExtX=function(e){this.lworldExtX=e},i.prototype.getWorldExtY=function(){return this.lworldExtY},i.prototype.setWorldExtY=function(e){this.lworldExtY=e},i.prototype.getDeviceOrgX=function(){return this.ldeviceOrgX},i.prototype.setDeviceOrgX=function(e){this.ldeviceOrgX=e},i.prototype.getDeviceOrgY=function(){return this.ldeviceOrgY},i.prototype.setDeviceOrgY=function(e){this.ldeviceOrgY=e},i.prototype.getDeviceExtX=function(){return this.ldeviceExtX},i.prototype.setDeviceExtX=function(e){this.ldeviceExtX=e},i.prototype.getDeviceExtY=function(){return this.ldeviceExtY},i.prototype.setDeviceExtY=function(e){this.ldeviceExtY=e},i.prototype.transformX=function(e){var t=0,n=this.lworldExtX;return 0!=n&&(t=this.ldeviceOrgX+(e-this.lworldOrgX)*this.ldeviceExtX/n),t},i.prototype.transformY=function(e){var t=0,n=this.lworldExtY;return 0!=n&&(t=this.ldeviceOrgY+(e-this.lworldOrgY)*this.ldeviceExtY/n),t},i.prototype.inverseTransformX=function(e){var t=0,n=this.ldeviceExtX;return 0!=n&&(t=this.lworldOrgX+(e-this.ldeviceOrgX)*this.lworldExtX/n),t},i.prototype.inverseTransformY=function(e){var t=0,n=this.ldeviceExtY;return 0!=n&&(t=this.lworldOrgY+(e-this.ldeviceOrgY)*this.lworldExtY/n),t},i.prototype.inverseTransformPoint=function(e){return new r(this.inverseTransformX(e.x),this.inverseTransformY(e.y))},e.exports=i},function(e,t,n){"use strict";var r=n(15),i=n(7),a=n(0),o=n(8),s=n(9);function l(){r.call(this),this.useSmartIdealEdgeLengthCalculation=i.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION,this.idealEdgeLength=i.DEFAULT_EDGE_LENGTH,this.springConstant=i.DEFAULT_SPRING_STRENGTH,this.repulsionConstant=i.DEFAULT_REPULSION_STRENGTH,this.gravityConstant=i.DEFAULT_GRAVITY_STRENGTH,this.compoundGravityConstant=i.DEFAULT_COMPOUND_GRAVITY_STRENGTH,this.gravityRangeFactor=i.DEFAULT_GRAVITY_RANGE_FACTOR,this.compoundGravityRangeFactor=i.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR,this.displacementThresholdPerNode=3*i.DEFAULT_EDGE_LENGTH/100,this.coolingFactor=i.DEFAULT_COOLING_FACTOR_INCREMENTAL,this.initialCoolingFactor=i.DEFAULT_COOLING_FACTOR_INCREMENTAL,this.totalDisplacement=0,this.oldTotalDisplacement=0,this.maxIterations=i.MAX_ITERATIONS}for(var u in l.prototype=Object.create(r.prototype),r)l[u]=r[u];l.prototype.initParameters=function(){r.prototype.initParameters.call(this,arguments),this.totalIterations=0,this.notAnimatedIterations=0,this.useFRGridVariant=i.DEFAULT_USE_SMART_REPULSION_RANGE_CALCULATION,this.grid=[]},l.prototype.calcIdealEdgeLengths=function(){for(var e,t,n,r,o,s,l=this.getGraphManager().getAllEdges(),u=0;ui.ADAPTATION_LOWER_NODE_LIMIT&&(this.coolingFactor=Math.max(this.coolingFactor*i.COOLING_ADAPTATION_FACTOR,this.coolingFactor-(e-i.ADAPTATION_LOWER_NODE_LIMIT)/(i.ADAPTATION_UPPER_NODE_LIMIT-i.ADAPTATION_LOWER_NODE_LIMIT)*this.coolingFactor*(1-i.COOLING_ADAPTATION_FACTOR))),this.maxNodeDisplacement=i.MAX_NODE_DISPLACEMENT_INCREMENTAL):(e>i.ADAPTATION_LOWER_NODE_LIMIT?this.coolingFactor=Math.max(i.COOLING_ADAPTATION_FACTOR,1-(e-i.ADAPTATION_LOWER_NODE_LIMIT)/(i.ADAPTATION_UPPER_NODE_LIMIT-i.ADAPTATION_LOWER_NODE_LIMIT)*(1-i.COOLING_ADAPTATION_FACTOR)):this.coolingFactor=1,this.initialCoolingFactor=this.coolingFactor,this.maxNodeDisplacement=i.MAX_NODE_DISPLACEMENT),this.maxIterations=Math.max(5*this.getAllNodes().length,this.maxIterations),this.totalDisplacementThreshold=this.displacementThresholdPerNode*this.getAllNodes().length,this.repulsionRange=this.calcRepulsionRange()},l.prototype.calcSpringForces=function(){for(var e,t=this.getAllEdges(),n=0;n0&&void 0!==arguments[0])||arguments[0],s=arguments.length>1&&void 0!==arguments[1]&&arguments[1],l=this.getAllNodes();if(this.useFRGridVariant)for(this.totalIterations%i.GRID_CALCULATION_CHECK_PERIOD==1&&o&&this.updateGrid(),a=new Set,e=0;e(l=t.getEstimatedSize()*this.gravityRangeFactor)||s>l)&&(e.gravitationForceX=-this.gravityConstant*i,e.gravitationForceY=-this.gravityConstant*a):(o>(l=t.getEstimatedSize()*this.compoundGravityRangeFactor)||s>l)&&(e.gravitationForceX=-this.gravityConstant*i*this.compoundGravityConstant,e.gravitationForceY=-this.gravityConstant*a*this.compoundGravityConstant)},l.prototype.isConverged=function(){var e,t=!1;return this.totalIterations>this.maxIterations/3&&(t=Math.abs(this.totalDisplacement-this.oldTotalDisplacement)<2),e=this.totalDisplacement=s.length||u>=s[0].length))for(var c=0;ce}}]),e}();e.exports=a},function(e,t,n){"use strict";var r=function(){function e(e,t){for(var n=0;n2&&void 0!==arguments[2]?arguments[2]:1,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:-1,a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:-1;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.sequence1=t,this.sequence2=n,this.match_score=r,this.mismatch_penalty=i,this.gap_penalty=a,this.iMax=t.length+1,this.jMax=n.length+1,this.grid=new Array(this.iMax);for(var o=0;o=0;n--){var r=this.listeners[n];r.event===e&&r.callback===t&&this.listeners.splice(n,1)}},i.emit=function(e,t){for(var n=0;n{"use strict";n.d(t,{diagram:()=>S});var r=n(16432),i=n(59373),a=n(71377),o=n.n(a),s=n(14607),l=n.n(s),u=n(91619),c=n(12281),h=n(7201),d=(n(27484),n(17967),n(27856),n(70277),n(45625),n(39354),n(91518),n(59542),n(10285),n(28734),function(){var e=function(e,t,n,r){for(n=n||{},r=e.length;r--;n[e[r]]=t);return n},t=[1,4],n=[1,13],r=[1,12],i=[1,15],a=[1,16],o=[1,20],s=[1,19],l=[6,7,8],u=[1,26],c=[1,24],h=[1,25],d=[6,7,11],p=[1,6,13,15,16,19,22],g=[1,33],f=[1,34],v=[1,6,7,11,13,15,16,19,22],y={trace:function(){},yy:{},symbols_:{error:2,start:3,mindMap:4,spaceLines:5,SPACELINE:6,NL:7,MINDMAP:8,document:9,stop:10,EOF:11,statement:12,SPACELIST:13,node:14,ICON:15,CLASS:16,nodeWithId:17,nodeWithoutId:18,NODE_DSTART:19,NODE_DESCR:20,NODE_DEND:21,NODE_ID:22,$accept:0,$end:1},terminals_:{2:"error",6:"SPACELINE",7:"NL",8:"MINDMAP",11:"EOF",13:"SPACELIST",15:"ICON",16:"CLASS",19:"NODE_DSTART",20:"NODE_DESCR",21:"NODE_DEND",22:"NODE_ID"},productions_:[0,[3,1],[3,2],[5,1],[5,2],[5,2],[4,2],[4,3],[10,1],[10,1],[10,1],[10,2],[10,2],[9,3],[9,2],[12,2],[12,2],[12,2],[12,1],[12,1],[12,1],[12,1],[12,1],[14,1],[14,1],[18,3],[17,1],[17,4]],performAction:function(e,t,n,r,i,a,o){var s=a.length-1;switch(i){case 6:case 7:return r;case 8:r.getLogger().trace("Stop NL ");break;case 9:r.getLogger().trace("Stop EOF ");break;case 11:r.getLogger().trace("Stop NL2 ");break;case 12:r.getLogger().trace("Stop EOF2 ");break;case 15:r.getLogger().info("Node: ",a[s].id),r.addNode(a[s-1].length,a[s].id,a[s].descr,a[s].type);break;case 16:r.getLogger().trace("Icon: ",a[s]),r.decorateNode({icon:a[s]});break;case 17:case 21:r.decorateNode({class:a[s]});break;case 18:r.getLogger().trace("SPACELIST");break;case 19:r.getLogger().trace("Node: ",a[s].id),r.addNode(0,a[s].id,a[s].descr,a[s].type);break;case 20:r.decorateNode({icon:a[s]});break;case 25:r.getLogger().trace("node found ..",a[s-2]),this.$={id:a[s-1],descr:a[s-1],type:r.getType(a[s-2],a[s])};break;case 26:this.$={id:a[s],descr:a[s],type:r.nodeType.DEFAULT};break;case 27:r.getLogger().trace("node found ..",a[s-3]),this.$={id:a[s-3],descr:a[s-1],type:r.getType(a[s-2],a[s])}}},table:[{3:1,4:2,5:3,6:[1,5],8:t},{1:[3]},{1:[2,1]},{4:6,6:[1,7],7:[1,8],8:t},{6:n,7:[1,10],9:9,12:11,13:r,14:14,15:i,16:a,17:17,18:18,19:o,22:s},e(l,[2,3]),{1:[2,2]},e(l,[2,4]),e(l,[2,5]),{1:[2,6],6:n,12:21,13:r,14:14,15:i,16:a,17:17,18:18,19:o,22:s},{6:n,9:22,12:11,13:r,14:14,15:i,16:a,17:17,18:18,19:o,22:s},{6:u,7:c,10:23,11:h},e(d,[2,22],{17:17,18:18,14:27,15:[1,28],16:[1,29],19:o,22:s}),e(d,[2,18]),e(d,[2,19]),e(d,[2,20]),e(d,[2,21]),e(d,[2,23]),e(d,[2,24]),e(d,[2,26],{19:[1,30]}),{20:[1,31]},{6:u,7:c,10:32,11:h},{1:[2,7],6:n,12:21,13:r,14:14,15:i,16:a,17:17,18:18,19:o,22:s},e(p,[2,14],{7:g,11:f}),e(v,[2,8]),e(v,[2,9]),e(v,[2,10]),e(d,[2,15]),e(d,[2,16]),e(d,[2,17]),{20:[1,35]},{21:[1,36]},e(p,[2,13],{7:g,11:f}),e(v,[2,11]),e(v,[2,12]),{21:[1,37]},e(d,[2,25]),e(d,[2,27])],defaultActions:{2:[2,1],6:[2,2]},parseError:function(e,t){if(!t.recoverable){var n=new Error(e);throw n.hash=t,n}this.trace(e)},parse:function(e){var t=this,n=[0],r=[],i=[null],a=[],o=this.table,s="",l=0,u=0,c=a.slice.call(arguments,1),h=Object.create(this.lexer),d={yy:{}};for(var p in this.yy)Object.prototype.hasOwnProperty.call(this.yy,p)&&(d.yy[p]=this.yy[p]);h.setInput(e,d.yy),d.yy.lexer=h,d.yy.parser=this,void 0===h.yylloc&&(h.yylloc={});var g=h.yylloc;a.push(g);var f=h.options&&h.options.ranges;"function"==typeof d.yy.parseError?this.parseError=d.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var v,y,m,b,x,w,E,T,_,D={};;){if(y=n[n.length-1],this.defaultActions[y]?m=this.defaultActions[y]:(null==v&&(_=void 0,"number"!=typeof(_=r.pop()||h.lex()||1)&&(_ instanceof Array&&(_=(r=_).pop()),_=t.symbols_[_]||_),v=_),m=o[y]&&o[y][v]),void 0===m||!m.length||!m[0]){var C="";for(x in T=[],o[y])this.terminals_[x]&&x>2&&T.push("'"+this.terminals_[x]+"'");C=h.showPosition?"Parse error on line "+(l+1)+":\n"+h.showPosition()+"\nExpecting "+T.join(", ")+", got '"+(this.terminals_[v]||v)+"'":"Parse error on line "+(l+1)+": Unexpected "+(1==v?"end of input":"'"+(this.terminals_[v]||v)+"'"),this.parseError(C,{text:h.match,token:this.terminals_[v]||v,line:h.yylineno,loc:g,expected:T})}if(m[0]instanceof Array&&m.length>1)throw new Error("Parse Error: multiple actions possible at state: "+y+", token: "+v);switch(m[0]){case 1:n.push(v),i.push(h.yytext),a.push(h.yylloc),n.push(m[1]),v=null,u=h.yyleng,s=h.yytext,l=h.yylineno,g=h.yylloc;break;case 2:if(w=this.productions_[m[1]][1],D.$=i[i.length-w],D._$={first_line:a[a.length-(w||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(w||1)].first_column,last_column:a[a.length-1].last_column},f&&(D._$.range=[a[a.length-(w||1)].range[0],a[a.length-1].range[1]]),void 0!==(b=this.performAction.apply(D,[s,u,l,d.yy,m[1],i,a].concat(c))))return b;w&&(n=n.slice(0,-1*w*2),i=i.slice(0,-1*w),a=a.slice(0,-1*w)),n.push(this.productions_[m[1]][0]),i.push(D.$),a.push(D._$),E=o[n[n.length-2]][n[n.length-1]],n.push(E);break;case 3:return!0}}return!0}},m={EOF:1,parseError:function(e,t){if(!this.yy.parser)throw new Error(e);this.yy.parser.parseError(e,t)},setInput:function(e,t){return this.yy=t||this.yy||{},this._input=e,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var e=this._input[0];return this.yytext+=e,this.yyleng++,this.offset++,this.match+=e,this.matched+=e,e.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),e},unput:function(e){var t=e.length,n=e.split(/(?:\r\n?|\n)/g);this._input=e+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-t),this.offset-=t;var r=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var i=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===r.length?this.yylloc.first_column:0)+r[r.length-n.length].length-n[0].length:this.yylloc.first_column-t},this.options.ranges&&(this.yylloc.range=[i[0],i[0]+this.yyleng-t]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(e){this.unput(this.match.slice(e))},pastInput:function(){var e=this.matched.substr(0,this.matched.length-this.match.length);return(e.length>20?"...":"")+e.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var e=this.match;return e.length<20&&(e+=this._input.substr(0,20-e.length)),(e.substr(0,20)+(e.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var e=this.pastInput(),t=new Array(e.length+1).join("-");return e+this.upcomingInput()+"\n"+t+"^"},test_match:function(e,t){var n,r,i;if(this.options.backtrack_lexer&&(i={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(i.yylloc.range=this.yylloc.range.slice(0))),(r=e[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=r.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:r?r[r.length-1].length-r[r.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+e[0].length},this.yytext+=e[0],this.match+=e[0],this.matches=e,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(e[0].length),this.matched+=e[0],n=this.performAction.call(this,this.yy,this,t,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in i)this[a]=i[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var e,t,n,r;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var i=this._currentRules(),a=0;at[0].length)){if(t=n,r=a,this.options.backtrack_lexer){if(!1!==(e=this.test_match(n,i[a])))return e;if(this._backtrack){t=!1;continue}return!1}if(!this.options.flex)break}return t?!1!==(e=this.test_match(t,i[r]))&&e:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var e=this.next();return e||this.lex()},begin:function(e){this.conditionStack.push(e)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(e){return(e=this.conditionStack.length-1-Math.abs(e||0))>=0?this.conditionStack[e]:"INITIAL"},pushState:function(e){this.begin(e)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(e,t,n,r){switch(n){case 0:e.getLogger().trace("Found comment",t.yytext);break;case 1:return 8;case 2:this.begin("CLASS");break;case 3:return this.popState(),16;case 4:case 23:this.popState();break;case 5:e.getLogger().trace("Begin icon"),this.begin("ICON");break;case 6:return e.getLogger().trace("SPACELINE"),6;case 7:return 7;case 8:return 15;case 9:e.getLogger().trace("end icon"),this.popState();break;case 10:return e.getLogger().trace("Exploding node"),this.begin("NODE"),19;case 11:return e.getLogger().trace("Cloud"),this.begin("NODE"),19;case 12:return e.getLogger().trace("Explosion Bang"),this.begin("NODE"),19;case 13:return e.getLogger().trace("Cloud Bang"),this.begin("NODE"),19;case 14:case 15:case 16:case 17:return this.begin("NODE"),19;case 18:return 13;case 19:return 22;case 20:return 11;case 21:e.getLogger().trace("Starting NSTR"),this.begin("NSTR");break;case 22:return e.getLogger().trace("description:",t.yytext),"NODE_DESCR";case 24:return this.popState(),e.getLogger().trace("node end ))"),"NODE_DEND";case 25:return this.popState(),e.getLogger().trace("node end )"),"NODE_DEND";case 26:return this.popState(),e.getLogger().trace("node end ...",t.yytext),"NODE_DEND";case 27:case 30:case 31:return this.popState(),e.getLogger().trace("node end (("),"NODE_DEND";case 28:case 29:return this.popState(),e.getLogger().trace("node end (-"),"NODE_DEND";case 32:case 33:return e.getLogger().trace("Long description:",t.yytext),20}},rules:[/^(?:\s*%%.*)/i,/^(?:mindmap\b)/i,/^(?::::)/i,/^(?:.+)/i,/^(?:\n)/i,/^(?:::icon\()/i,/^(?:[\s]+[\n])/i,/^(?:[\n]+)/i,/^(?:[^\)]+)/i,/^(?:\))/i,/^(?:-\))/i,/^(?:\(-)/i,/^(?:\)\))/i,/^(?:\))/i,/^(?:\(\()/i,/^(?:\{\{)/i,/^(?:\()/i,/^(?:\[)/i,/^(?:[\s]+)/i,/^(?:[^\(\[\n\-\)\{\}]+)/i,/^(?:$)/i,/^(?:["])/i,/^(?:[^"]+)/i,/^(?:["])/i,/^(?:[\)]\))/i,/^(?:[\)])/i,/^(?:[\]])/i,/^(?:\}\})/i,/^(?:\(-)/i,/^(?:-\))/i,/^(?:\(\()/i,/^(?:\()/i,/^(?:[^\)\]\(\}]+)/i,/^(?:.+(?!\(\())/i],conditions:{CLASS:{rules:[3,4],inclusive:!1},ICON:{rules:[8,9],inclusive:!1},NSTR:{rules:[22,23],inclusive:!1},NODE:{rules:[21,24,25,26,27,28,29,30,31,32,33],inclusive:!1},INITIAL:{rules:[0,1,2,5,6,7,10,11,12,13,14,15,16,17,18,19,20],inclusive:!0}}};function b(){this.yy={}}return y.lexer=m,b.prototype=y,y.Parser=b,new b}());d.parser=d;const p=d,g=e=>(0,r.n)(e,(0,r.g)());let f=[],v=0,y={};const m={DEFAULT:0,NO_BORDER:0,ROUNDED_RECT:1,RECT:2,CIRCLE:3,CLOUD:4,BANG:5,HEXAGON:6},b=(e,t)=>{y[e]=t},x=e=>{switch(e){case m.DEFAULT:return"no-border";case m.RECT:return"rect";case m.ROUNDED_RECT:return"rounded-rect";case m.CIRCLE:return"circle";case m.CLOUD:return"cloud";case m.BANG:return"bang";case m.HEXAGON:return"hexgon";default:return"no-border"}};let w;const E=e=>y[e],T=Object.freeze(Object.defineProperty({__proto__:null,addNode:(e,t,n,i)=>{r.l.info("addNode",e,t,n,i);const a=(0,r.g)(),o={id:v++,nodeId:g(t),level:e,descr:g(n),type:i,children:[],width:(0,r.g)().mindmap.maxNodeWidth};switch(o.type){case m.ROUNDED_RECT:case m.RECT:case m.HEXAGON:o.padding=2*a.mindmap.padding;break;default:o.padding=a.mindmap.padding}const s=function(e){for(let t=f.length-1;t>=0;t--)if(f[t].level{f=[],v=0,y={}},decorateNode:e=>{const t=f[f.length-1];e&&e.icon&&(t.icon=g(e.icon)),e&&e.class&&(t.class=g(e.class))},getElementById:E,getLogger:()=>r.l,getMindmap:()=>f.length>0?f[0]:null,getNodeById:e=>f[e],getType:(e,t)=>{switch(r.l.debug("In get type",e,t),e){case"[":return m.RECT;case"(":return")"===t?m.ROUNDED_RECT:m.CLOUD;case"((":return m.CIRCLE;case")":return m.CLOUD;case"))":return m.BANG;case"{{":return m.HEXAGON;default:return m.DEFAULT}},nodeType:m,get parseError(){return w},sanitizeText:g,setElementForId:b,setErrorHandler:e=>{w=e},type2Str:x},Symbol.toStringTag,{value:"Module"}));function _(e,t){e.each((function(){var e,n=(0,i.Ys)(this),r=n.text().split(/(\s+|
)/).reverse(),a=[],o=n.attr("y"),s=parseFloat(n.attr("dy")),l=n.text(null).append("tspan").attr("x",0).attr("y",o).attr("dy",s+"em");for(let i=0;it||"
"===e)&&(a.pop(),l.text(a.join(" ").trim()),a="
"===e?[""]:[e],l=n.append("tspan").attr("x",0).attr("y",o).attr("dy","1.1em").text(e))}))}const D=function(e,t,n,r){const i=n%11,a=e.append("g");t.section=i;let o="section-"+i;i<0&&(o+=" section-root"),a.attr("class",(t.class?t.class+" ":"")+"mindmap-node "+o);const s=a.append("g"),l=a.append("g"),u=l.append("text").text(t.descr).attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle").call(_,t.width).node().getBBox(),c=r.fontSize.replace?r.fontSize.replace("px",""):r.fontSize;if(t.height=u.height+1.1*c*.5+t.padding,t.width=u.width+2*t.padding,t.icon)if(t.type===m.CIRCLE){t.height+=50,t.width+=50;a.append("foreignObject").attr("height","50px").attr("width",t.width).attr("style","text-align: center;").append("div").attr("class","icon-container").append("i").attr("class","node-icon-"+i+" "+t.icon),l.attr("transform","translate("+t.width/2+", "+(t.height/2-1.5*t.padding)+")")}else{t.width+=50;const e=t.height;t.height=Math.max(e,60);const n=Math.abs(t.height-e);a.append("foreignObject").attr("width","60px").attr("height",t.height).attr("style","text-align: center;margin-top:"+n/2+"px;").append("div").attr("class","icon-container").append("i").attr("class","node-icon-"+i+" "+t.icon),l.attr("transform","translate("+(25+t.width/2)+", "+(n/2+t.padding/2)+")")}else l.attr("transform","translate("+t.width/2+", "+t.padding/2+")");switch(t.type){case m.DEFAULT:!function(e,t,n){e.append("path").attr("id","node-"+t.id).attr("class","node-bkg node-"+x(t.type)).attr("d",`M0 ${t.height-5} v${10-t.height} q0,-5 5,-5 h${t.width-10} q5,0 5,5 v${t.height-5} H0 Z`),e.append("line").attr("class","node-line-"+n).attr("x1",0).attr("y1",t.height).attr("x2",t.width).attr("y2",t.height)}(s,t,i);break;case m.ROUNDED_RECT:!function(e,t){e.append("rect").attr("id","node-"+t.id).attr("class","node-bkg node-"+x(t.type)).attr("height",t.height).attr("rx",t.padding).attr("ry",t.padding).attr("width",t.width)}(s,t);break;case m.RECT:!function(e,t){e.append("rect").attr("id","node-"+t.id).attr("class","node-bkg node-"+x(t.type)).attr("height",t.height).attr("width",t.width)}(s,t);break;case m.CIRCLE:s.attr("transform","translate("+t.width/2+", "+ +t.height/2+")"),function(e,t){e.append("circle").attr("id","node-"+t.id).attr("class","node-bkg node-"+x(t.type)).attr("r",t.width/2)}(s,t);break;case m.CLOUD:!function(e,t){const n=t.width,r=t.height,i=.15*n,a=.25*n,o=.35*n,s=.2*n;e.append("path").attr("id","node-"+t.id).attr("class","node-bkg node-"+x(t.type)).attr("d",`M0 0 a${i},${i} 0 0,1 ${.25*n},${-1*n*.1}\n a${o},${o} 1 0,1 ${.4*n},${-1*n*.1}\n a${a},${a} 1 0,1 ${.35*n},${1*n*.2}\n\n a${i},${i} 1 0,1 ${.15*n},${1*r*.35}\n a${s},${s} 1 0,1 ${-1*n*.15},${1*r*.65}\n\n a${a},${i} 1 0,1 ${-1*n*.25},${.15*n}\n a${o},${o} 1 0,1 ${-1*n*.5},0\n a${i},${i} 1 0,1 ${-1*n*.25},${-1*n*.15}\n\n a${i},${i} 1 0,1 ${-1*n*.1},${-1*r*.35}\n a${s},${s} 1 0,1 ${.1*n},${-1*r*.65}\n\n H0 V0 Z`)}(s,t);break;case m.BANG:!function(e,t){const n=t.width,r=t.height,i=.15*n;e.append("path").attr("id","node-"+t.id).attr("class","node-bkg node-"+x(t.type)).attr("d",`M0 0 a${i},${i} 1 0,0 ${.25*n},${-1*r*.1}\n a${i},${i} 1 0,0 ${.25*n},0\n a${i},${i} 1 0,0 ${.25*n},0\n a${i},${i} 1 0,0 ${.25*n},${1*r*.1}\n\n a${i},${i} 1 0,0 ${.15*n},${1*r*.33}\n a${.8*i},${.8*i} 1 0,0 0,${1*r*.34}\n a${i},${i} 1 0,0 ${-1*n*.15},${1*r*.33}\n\n a${i},${i} 1 0,0 ${-1*n*.25},${.15*r}\n a${i},${i} 1 0,0 ${-1*n*.25},0\n a${i},${i} 1 0,0 ${-1*n*.25},0\n a${i},${i} 1 0,0 ${-1*n*.25},${-1*r*.15}\n\n a${i},${i} 1 0,0 ${-1*n*.1},${-1*r*.33}\n a${.8*i},${.8*i} 1 0,0 0,${-1*r*.34}\n a${i},${i} 1 0,0 ${.1*n},${-1*r*.33}\n\n H0 V0 Z`)}(s,t);break;case m.HEXAGON:!function(e,t){const n=t.height,r=n/4,i=t.width-t.padding+2*r;!function(e,t,n,r,i){e.insert("polygon",":first-child").attr("points",r.map((function(e){return e.x+","+e.y})).join(" ")).attr("transform","translate("+(i.width-t)/2+", "+n+")")}(e,i,n,[{x:r,y:0},{x:i-r,y:0},{x:i,y:-n/2},{x:i-r,y:-n},{x:r,y:-n},{x:0,y:-n/2}],t)}(s,t)}return b(t.id,a),t.height},C=function(e){const t=E(e.id),n=e.x||0,r=e.y||0;t.attr("transform","translate("+n+","+r+")")};function N(e,t,n,r){D(e,t,n,r),t.children&&t.children.forEach(((t,i)=>{N(e,t,n<0?i:n,r)}))}function A(e,t,n,r){t.add({group:"nodes",data:{id:e.id,labelText:e.descr,height:e.height,width:e.width,level:r,nodeId:e.id,padding:e.padding,type:e.type},position:{x:e.x,y:e.y}}),e.children&&e.children.forEach((i=>{A(i,t,n,r+1),t.add({group:"edges",data:{id:`${e.id}_${i.id}`,source:e.id,target:i.id,depth:r,section:i.section}})}))}function L(e,t){return new Promise((n=>{const a=(0,i.Ys)("body").append("div").attr("id","cy").attr("style","display:none"),s=o()({container:document.getElementById("cy"),style:[{selector:"edge",style:{"curve-style":"bezier"}}]});a.remove(),A(e,s,t,0),s.nodes().forEach((function(e){e.layoutDimensions=()=>{const t=e.data();return{w:t.width,h:t.height}}})),s.layout({name:"cose-bilkent",quality:"proof",styleEnabled:!1,animate:!1}).run(),s.ready((e=>{r.l.info("Ready",e),n(s)}))}))}o().use(l());const S={db:T,renderer:{draw:async(e,t,n,a)=>{const o=(0,r.g)();a.db.clear(),a.parser.parse(e),r.l.debug("Renering info diagram\n"+e);const s=(0,r.g)().securityLevel;let l;"sandbox"===s&&(l=(0,i.Ys)("#i"+t));const u=("sandbox"===s?(0,i.Ys)(l.nodes()[0].contentDocument.body):(0,i.Ys)("body")).select("#"+t);u.append("g");const c=a.db.getMindmap(),h=u.append("g");h.attr("class","mindmap-edges");const d=u.append("g");d.attr("class","mindmap-nodes"),N(d,c,-1,o);const p=await L(c,o);!function(e,t){t.edges().map(((t,n)=>{const i=t.data();if(t[0]._private.bodyBounds){const a=t[0]._private.rscratch;r.l.trace("Edge: ",n,i),e.insert("path").attr("d",`M ${a.startX},${a.startY} L ${a.midX},${a.midY} L${a.endX},${a.endY} `).attr("class","edge section-edge-"+i.section+" edge-depth-"+i.depth)}}))}(h,p),function(e){e.nodes().map(((e,t)=>{const n=e.data();n.x=e.position().x,n.y=e.position().y,C(n);const i=E(n.nodeId);r.l.info("Id:",t,"Position: (",e.position().x,", ",e.position().y,")",n),i.attr("transform",`translate(${e.position().x-n.width/2}, ${e.position().y-n.height/2})`),i.attr("attr",`apa-${t})`)}))}(p),(0,r.s)(void 0,u,o.mindmap.padding,o.mindmap.useMaxWidth)}},parser:p,styles:e=>`\n .edge {\n stroke-width: 3;\n }\n ${(e=>{let t="";for(let n=0;n{"use strict";n.d(t,{Z:()=>s});var r=n(61691),i=n(71610);const a=e=>{const{r:t,g:n,b:a}=i.Z.parse(e),o=.2126*r.Z.channel.toLinear(t)+.7152*r.Z.channel.toLinear(n)+.0722*r.Z.channel.toLinear(a);return r.Z.lang.round(o)},o=e=>a(e)>=.5,s=e=>!o(e)}}]); \ No newline at end of file diff --git a/assets/js/7724.5e8ea986.js.LICENSE.txt b/assets/js/7724.5e8ea986.js.LICENSE.txt new file mode 100644 index 0000000000..a58daed496 --- /dev/null +++ b/assets/js/7724.5e8ea986.js.LICENSE.txt @@ -0,0 +1,9 @@ +/*! + Embeddable Minimum Strictly-Compliant Promises/A+ 1.1.1 Thenable + Copyright (c) 2013-2014 Ralf S. Engelschall (http://engelschall.com) + Licensed under The MIT License (http://opensource.org/licenses/MIT) + */ + +/*! Bezier curve function generator. Copyright Gaetan Renaudeau. MIT License: http://en.wikipedia.org/wiki/MIT_License */ + +/*! Runge-Kutta spring physics function generator. Adapted from Framer.js, copyright Koen Bok. MIT License: http://en.wikipedia.org/wiki/MIT_License */ diff --git a/assets/js/7aa2de41.bfeda755.js b/assets/js/7aa2de41.bfeda755.js new file mode 100644 index 0000000000..cdacd05ea0 --- /dev/null +++ b/assets/js/7aa2de41.bfeda755.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5028],{3905:(e,r,t)=>{t.d(r,{Zo:()=>u,kt:()=>m});var n=t(67294);function a(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function o(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function i(e){for(var r=1;r=0||(a[t]=e[t]);return a}(e,r);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var c=n.createContext({}),p=function(e){var r=n.useContext(c),t=r;return e&&(t="function"==typeof e?e(r):i(i({},r),e)),t},u=function(e){var r=p(e.components);return n.createElement(c.Provider,{value:r},e.children)},d="mdxType",l={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},g=n.forwardRef((function(e,r){var t=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),d=p(t),g=a,m=d["".concat(c,".").concat(g)]||d[g]||l[g]||o;return t?n.createElement(m,i(i({ref:r},u),{},{components:t})):n.createElement(m,i({ref:r},u))}));function m(e,r){var t=arguments,a=r&&r.mdxType;if("string"==typeof e||a){var o=t.length,i=new Array(o);i[0]=g;var s={};for(var c in r)hasOwnProperty.call(r,c)&&(s[c]=r[c]);s.originalType=e,s[d]="string"==typeof e?e:a,i[1]=s;for(var p=2;p{t.r(r),t.d(r,{assets:()=>c,contentTitle:()=>i,default:()=>l,frontMatter:()=>o,metadata:()=>s,toc:()=>p});var n=t(87462),a=(t(67294),t(3905));const o={sidebar_label:"Project Manager",sidebar_position:53},i="Project Manager",s={unversionedId:"iaas/guides/operations-guide/openstack/day2-operations/project-manager",id:"iaas/guides/operations-guide/openstack/day2-operations/project-manager",title:"Project Manager",description:"",source:"@site/docs/02-iaas/guides/operations-guide/openstack/day2-operations/project-manager.md",sourceDirName:"02-iaas/guides/operations-guide/openstack/day2-operations",slug:"/iaas/guides/operations-guide/openstack/day2-operations/project-manager",permalink:"/docs/iaas/guides/operations-guide/openstack/day2-operations/project-manager",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/operations-guide/openstack/day2-operations/project-manager.md",tags:[],version:"current",sidebarPosition:53,frontMatter:{sidebar_label:"Project Manager",sidebar_position:53},sidebar:"docs",previous:{title:"Resource Manager",permalink:"/docs/iaas/guides/operations-guide/openstack/day2-operations/resource-manager"},next:{title:"Sandbox Manager",permalink:"/docs/iaas/guides/operations-guide/openstack/day2-operations/sandbox-manager"}},c={},p=[],u={toc:p},d="wrapper";function l(e){let{components:r,...t}=e;return(0,a.kt)(d,(0,n.Z)({},u,t,{components:r,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"project-manager"},"Project Manager"))}l.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7b449e09.e32dd5c7.js b/assets/js/7b449e09.e32dd5c7.js new file mode 100644 index 0000000000..68f55acf80 --- /dev/null +++ b/assets/js/7b449e09.e32dd5c7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4665],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var i=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function r(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=i.createContext({}),c=function(e){var t=i.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},u=function(e){var t=c(e.components);return i.createElement(l.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},p=i.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),d=c(n),p=a,h=d["".concat(l,".").concat(p)]||d[p]||m[p]||o;return n?i.createElement(h,r(r({ref:t},u),{},{components:n})):i.createElement(h,r({ref:t},u))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,r=new Array(o);r[0]=p;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[d]="string"==typeof e?e:a,r[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>m,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var i=n(87462),a=(n(67294),n(3905));const o={title:"SCS Documentation structure",type:"Procedural",version:"2023-08-03-001",authors:"Max Wolfs",status:"Draft",track:"Global",replaces:"scs-0002-v1-standards-docs-org.md"},r=void 0,s={unversionedId:"scs-0002-v2-standards-docs-org",id:"scs-0002-v2-standards-docs-org",title:"SCS Documentation structure",description:"Introduction",source:"@site/standards/scs-0002-v2-standards-docs-org.md",sourceDirName:".",slug:"/scs-0002-v2-standards-docs-org",permalink:"/standards/scs-0002-v2-standards-docs-org",draft:!1,tags:[],version:"current",frontMatter:{title:"SCS Documentation structure",type:"Procedural",version:"2023-08-03-001",authors:"Max Wolfs",status:"Draft",track:"Global",replaces:"scs-0002-v1-standards-docs-org.md"},sidebar:"standards",previous:{title:"Standards, Docs and Organisation",permalink:"/standards/scs-0002-v1-standards-docs-org"},next:{title:"SCS-0003: YAML Standards",permalink:"/standards/global/scs-0003"}},l={},c=[{value:"Introduction",id:"introduction",level:2},{value:"Motivation",id:"motivation",level:2},{value:"Distributed Documentation",id:"distributed-documentation",level:2},{value:"Methodology and Taxonomy",id:"methodology-and-taxonomy",level:2},{value:"Structure Template",id:"structure-template",level:2},{value:"Single Component/Component",id:"single-componentcomponent",level:3},{value:"Overview",id:"overview",level:4},{value:"Requirements",id:"requirements",level:4},{value:"Quickstart",id:"quickstart",level:4},{value:"Configuration",id:"configuration",level:4},{value:"Contribute",id:"contribute",level:4},{value:"Technical Implementation",id:"technical-implementation",level:3},{value:"Documentation Framework",id:"documentation-framework",level:4},{value:"Special Implementation Details",id:"special-implementation-details",level:4},{value:"Writing Style and Format \u2013 Style Guide",id:"writing-style-and-format--style-guide",level:3},{value:"Formatting and Linting",id:"formatting-and-linting",level:4},{value:"Diagrams, Charts, and Images",id:"diagrams-charts-and-images",level:4},{value:"Linting",id:"linting",level:4},{value:"Pre Commit",id:"pre-commit",level:5},{value:"GitHub Workflows",id:"github-workflows",level:5},{value:"Open Questions",id:"open-questions",level:3},{value:"Reference",id:"reference",level:3}],u={toc:c},d="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(d,(0,i.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"introduction"},"Introduction"),(0,a.kt)("p",null,"The Sovereign Cloud Stack (SCS) is a complex ecosystem, comprised of numerous Components and packages designed to accommodate a wide array of use cases. Given the unique functionalities of these components, the creation of a unified and comprehensible documentation presents a significant challenge. This procedural standard aims to define the structure and maintenance process for our documentation, thereby offering seamless and efficient access to users."),(0,a.kt)("h2",{id:"motivation"},"Motivation"),(0,a.kt)("p",null,"SCS promotes a collaborative environment by actively contributing to upstream projects. The involvement of individuals and companies within our community significantly enhances the SCS Bill of Materials (BOM), further amplifying its complexity. Consequently, our documentation must:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Offer an overview and visual representation of the architectural model"),(0,a.kt)("li",{parentName:"ul"},"Foster coherence by maintaining a consistent theme throughout the documentation"),(0,a.kt)("li",{parentName:"ul"},"Facilitate a transparent and inclusive community environment"),(0,a.kt)("li",{parentName:"ul"},"Describe various deployment examples and use cases"),(0,a.kt)("li",{parentName:"ul"},"Reflect the SCS structure in the documentation's navigation")),(0,a.kt)("h2",{id:"distributed-documentation"},"Distributed Documentation"),(0,a.kt)("p",null,"In line with the ",(0,a.kt)("a",{parentName:"p",href:"https://docs.openstack.org/doc-contrib-guide/"},"OpenStack documentation approach"),", most SCS Components and components maintain independent documentation. To keep this documentation up-to-date and eliminate manual duplication, we utilize a custom workflow that synchronizes individual documents during the static documentation page's build process."),(0,a.kt)("h2",{id:"methodology-and-taxonomy"},"Methodology and Taxonomy"),(0,a.kt)("p",null,"Addressing the complexity of SCS requires an effective documentation structure. Accordingly, we have adopted the ",(0,a.kt)("a",{parentName:"p",href:"https://diataxis.fr/"},"Diataxis taxonomy"),", categorizing the documentation into four distinct sections: Tutorials, Guides, References, and Explanations."),(0,a.kt)("h2",{id:"structure-template"},"Structure Template"),(0,a.kt)("p",null,"The technical documentation and navigation should parallel the logical structure of the SCS Architecture. By doing so, users can better comprehend the information hierarchy and effectively visualize the SCS. The proposed structure is as follows:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-tree"},"\u251c\u2500\u2500 Introduction\n\u251c\u2500\u2500 Getting Started\n\u2502 \u251c\u2500\u2500 Overview\n\u2502 \u251c\u2500\u2500 Virtualization\n\u2502 \u2514\u2500\u2500 Containerization\n\u251c\u2500\u2500 IaaS Layer\n\u2502 \u251c\u2500\u2500 Overview\n\u2502 \u2502 \u251c\u2500\u2500 Architecture\n\u2502 \u2502 \u251c\u2500\u2500 Compute\n\u2502 \u2502 \u251c\u2500\u2500 Storage\n\u2502 \u2502 \u251c\u2500\u2500 Knowledge\n\u2502 \u2502 \u2514\u2500\u2500 Network\n\u2502 \u251c\u2500\u2500 Deployment Examples\n\u2502 \u2502 \u251c\u2500\u2500 Example 1\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 Hardware\n\u2502 \u2502 \u2502 \u2514\u2500\u2500 Software\n\u2502 \u2502 \u251c\u2500\u2500 ...\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 Hardware\n\u2502 \u2502 \u2502 \u2514\u2500\u2500 Software\n\u2502 \u2502 \u2514\u2500\u2500 Example x\n\u2502 \u2502 \u251c\u2500\u2500 Hardware\n\u2502 \u2502 \u2514\u2500\u2500 Software\n\u2502 \u251c\u2500\u2500 Guides\n\u2502 \u2502 \u251c\u2500\u2500 Guide 1\n\u2502 \u2502 \u251c ...\n\u2502 \u2502 \u2514\u2500\u2500 Guide x\n\u2502 \u2514\u2500\u2500 Components\n\u2502 \u251c\u2500\u2500 Component 1\n\u2502 \u251c ...\n\u2502 \u2514\u2500\u2500 Component x\n\u251c\u2500\u2500 Container Layer\n\u2502 \u251c\u2500\u2500 Overview\n\u2502 \u2502 \u251c\u2500\u2500 Architecture\n\u2502 \u2502 \u2514\u2500\u2500 ...\n\u2502 \u251c\u2500\u2500 Prerequisites\n\u2502 \u2502 \u251c\u2500\u2500 Hardware\n\u2502 \u2502 \u251c\u2500\u2500 Software\n\u2502 \u2502 \u2514\u2500\u2500 Knowledge\n\u2502 \u251c\u2500\u2500 Guides\n\u2502 \u2502 \u251c\u2500\u2500 Guide 1\n\u2502 \u2502 \u251c\u2500\u2500 ...\n\u2502 \u2502 \u2514\u2500\u2500 Guide x\n\u2502 \u2514\u2500\u2500 Components\n\u2502 \u251c\u2500\u2500 k8s-cluster-api-provider\n\u2502 \u251c ...\n\u2502 \u2514\u2500\u2500 Component x\n\u251c\u2500\u2500 Operating SCS\n\u2502 \u251c\u2500\u2500 Overview\n\u2502 \u251c\u2500\u2500 Guides\n\u2502 \u2502 \u251c\u2500\u2500 Guide 1\n\u2502 \u2502 \u251c\u2500\u2500 ...\n\u2502 \u2502 \u2514\u2500\u2500 Guide x\n\u2502 \u251c\u2500\u2500 Monitoring\n\u2502 \u251c\u2500\u2500 Incident Management\n\u2502 \u251c\u2500\u2500 Audits\n\u2502 \u251c\u2500\u2500 Lifecycle Management: Patches/Updates & Upgrades\n\u2502 \u2514\u2500\u2500 Logging\n\u251c\u2500\u2500 Identity and Access Management (IAM)\n\u251c\u2500\u2500 Releases\n\u251c\u2500\u2500 Standards\n\u251c\u2500\u2500 FAQ\n\u2514\u2500\u2500 Glossary\n")),(0,a.kt)("h3",{id:"single-componentcomponent"},"Single Component/Component"),(0,a.kt)("p",null,"The technical documentation and navigation should parallel the logical structure of the SCS Architecture. By doing so, users can better comprehend the information hierarchy and effectively visualize the SCS. The proposed structure is as follows:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-tree"},"\u2502 \u251c\u2500\u2500 Component\n\u2502 \u2502 \u251c\u2500\u2500 overview.md\n\u2502 \u2502 \u2514\u2500\u2500 requirements.md\n\u2502 \u2502 \u251c\u2500\u2500 quickstart.md\n\u2502 \u2502 \u251c\u2500\u2500 configuration.md\n\u2502 \u2502 \u251c\u2500\u2500 contribute.md\n")),(0,a.kt)("p",null,"Each document serves a specific purpose:"),(0,a.kt)("h4",{id:"overview"},"Overview"),(0,a.kt)("p",null,'This document introduces the Component/component by addressing the basic "Why," "How," and "What" questions, and articulating the problems it solves in the broader SCS context answering the following questions:'),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"What is it and for what do I need this? What benefits does it have for users?"),(0,a.kt)("li",{parentName:"ul"},"What organization/company does this belong to? (Link to company/organization)"),(0,a.kt)("li",{parentName:"ul"},"Where am I \u2013 as module \u2013 within the bigger context of SCS?")),(0,a.kt)("h4",{id:"requirements"},"Requirements"),(0,a.kt)("p",null,"This section enumerates the necessary prerequisites to utilize the component, including software, hardware, and any required technical knowledge. What are the minimal requirements needed for a quickstart?"),(0,a.kt)("h4",{id:"quickstart"},"Quickstart"),(0,a.kt)("p",null,"A concise guide providing users with a quick set up of the component, covering installation instructions, basic configuration, and initial steps. Caution: it is only for testing and not for production."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"What is the aim of this quickstart guide?"),(0,a.kt)("li",{parentName:"ul"},"Rule: one line per command for easy copy&paste and one line for description where possible"),(0,a.kt)("li",{parentName:"ul"},"Rule: only one working path for installation.")),(0,a.kt)("h4",{id:"configuration"},"Configuration"),(0,a.kt)("p",null,"This section elaborates on the configurable aspects of the component, such as options, parameters, or settings that users can modify to suit their needs."),(0,a.kt)("h4",{id:"contribute"},"Contribute"),(0,a.kt)("p",null,"This document provides instructions on how interested parties can contribute to the component's development. It includes information on issue submission, proposed changes, and participation in discussions."),(0,a.kt)("h3",{id:"technical-implementation"},"Technical Implementation"),(0,a.kt)("p",null,"SCS employs Docusaurus, a contemporary static website generator, to implement the Docs Standard. Docusaurus serves as an ideal platform for creating, managing, and deploying extensive documentation."),(0,a.kt)("h4",{id:"documentation-framework"},"Documentation Framework"),(0,a.kt)("p",null,"Docusaurus' robust toolkit assists in crafting and maintaining quality documentation. It offers comprehensive features such as Markdown support, customizable themes, and versioning, making it an excellent choice for our needs. This platform allows us to create user-friendly and visually engaging documentation."),(0,a.kt)("h4",{id:"special-implementation-details"},"Special Implementation Details"),(0,a.kt)("p",null,"SCS's unique architecture necessitates a unique approach to documentation. To ensure seamless integration of reference documentation for Components and components developed for SCS, we have created a custom workflow. This workflow automatically syncs upstream repositories, pulling the most recent documentation at regular intervals."),(0,a.kt)("p",null,"We have accomplished this by utilizing a Node.js post-install script found ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/docs-page/blob/main/getDocs.js"},"here"),"."),(0,a.kt)("p",null,"This script prompts the system to pull the latest docs every eight hours and build the static page. The workflow's specifications can be viewed here."),(0,a.kt)("p",null,"The ",(0,a.kt)("a",{parentName:"p",href:"https://docs.scs.community/"},"SCS documentation")," is built by the tooling from the ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/docs-page/"},"docs-page")," repository, pulling content from ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/docs/"},"docs repository")," as well as many other components as defined in the docs.package.json ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/docs-page/blob/main/docs.package.json"},"here"),"."),(0,a.kt)("h3",{id:"writing-style-and-format--style-guide"},"Writing Style and Format \u2013 Style Guide"),(0,a.kt)("h4",{id:"formatting-and-linting"},"Formatting and Linting"),(0,a.kt)("p",null,"All documentation text files must be provided as markdown files with an .md extension. This prerequisite ensures uniformity across our documents, making them more accessible and comprehensible."),(0,a.kt)("h4",{id:"diagrams-charts-and-images"},"Diagrams, Charts, and Images"),(0,a.kt)("p",null,"When necessary, diagrams, charts, and images can be used to simplify complex information. They should be properly captioned and referenced in the text."),(0,a.kt)("h4",{id:"linting"},"Linting"),(0,a.kt)("p",null,"To maintain a clean and consistent content repository, we enforce linting on:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"All staged files before committing"),(0,a.kt)("li",{parentName:"ul"},"All Pull Requests")),(0,a.kt)("h5",{id:"pre-commit"},"Pre Commit"),(0,a.kt)("p",null,"We run markdownlint against staged Git files using the Husky Git hook. This process is facilitated by ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/okonet/lint-staged"},"lint-staged")," and ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/typicode/husky"},"husky"),"."),(0,a.kt)("p",null,"The markdown files are linted according to the rules specified by ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/DavidAnson/markdownlint-cli2"},"markdownlint-cli2")," and formatted with ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/prettier/prettier"},"prettier"),"."),(0,a.kt)("p",null,"The linting rules are specified in the configuration file .markdownlint-cli2.jsonc. Additionally, ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/OnkarRuikar/markdownlint"},"markdownlint-rule-search-replace")),(0,a.kt)("h5",{id:"github-workflows"},"GitHub Workflows"),(0,a.kt)("p",null,"There are two actions running on every Pull Request on the main branch:"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"link-validator.yml validates every link in the markdown files."),(0,a.kt)("li",{parentName:"ol"},"pr-markdownlint.yml checks all markdown files according to the rules defined within .markdownlint-cli2.jsonc.")),(0,a.kt)("p",null,"The Style Guide can be found ",(0,a.kt)("a",{parentName:"p",href:"https://docs.scs.community/community/community/contribute/styleguide/"},"here"),"."),(0,a.kt)("h3",{id:"open-questions"},"Open Questions"),(0,a.kt)("p",null,"--"),(0,a.kt)("h3",{id:"reference"},"Reference"),(0,a.kt)("p",null,"--"))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7b787d81.a1ba85d0.js b/assets/js/7b787d81.a1ba85d0.js new file mode 100644 index 0000000000..86a8b0b094 --- /dev/null +++ b/assets/js/7b787d81.a1ba85d0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6860],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>m});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function s(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var i=a.createContext({}),c=function(e){var t=a.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},p=function(e){var t=c(e.components);return a.createElement(i.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,i=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=c(n),h=r,m=u["".concat(i,".").concat(h)]||u[h]||d[h]||o;return n?a.createElement(m,s(s({ref:t},p),{},{components:n})):a.createElement(m,s({ref:t},p))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,s=new Array(o);s[0]=h;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l[u]="string"==typeof e?e:r,s[1]=l;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var a=n(87462),r=(n(67294),n(3905));const o={},s="Release Notes for SCS Release 0",l={unversionedId:"releases/Release0",id:"releases/Release0",title:"Release Notes for SCS Release 0",description:"(Release Date: 2021-07-15)",source:"@site/docs/06-releases/Release0.md",sourceDirName:"06-releases",slug:"/releases/Release0",permalink:"/docs/releases/Release0",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/06-releases/Release0.md",tags:[],version:"current",frontMatter:{},sidebar:"docs",previous:{title:"Releases",permalink:"/docs/category/releases"},next:{title:"Release Notes for SCS Release 1",permalink:"/docs/releases/Release1"}},i={},c=[{value:"Scope",id:"scope",level:2},{value:"Features",id:"features",level:2},{value:"Get SCS",id:"get-scs",level:2},{value:"Known Bugs",id:"known-bugs",level:2},{value:"Technical Previews",id:"technical-previews",level:2},{value:"Release tagging",id:"release-tagging",level:2},{value:"Updates",id:"updates",level:2},{value:"Bug reporting",id:"bug-reporting",level:2}],p={toc:c},u="wrapper";function d(e){let{components:t,...n}=e;return(0,r.kt)(u,(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"release-notes-for-scs-release-0"},"Release Notes for SCS Release 0"),(0,r.kt)("p",null,"(Release Date: 2021-07-15)"),(0,r.kt)("h2",{id:"scope"},"Scope"),(0,r.kt)("p",null,"The main focus of R0 is to demonstrate the viability of our approach to a much broader\naudience by providing a well-documented testbed. This will allow anyone interested\nto study the system in real-life, test, contribute, compare, ... it."),(0,r.kt)("p",null,"Also we learn performing the release process."),(0,r.kt)("h2",{id:"features"},"Features"),(0,r.kt)("p",null,"Fully automated virtual (testbed setup) with ansible (terraform bootstrap to create\nstorage, networking and VM resources for bootstrapping via cloud-init injected\nscripts that call ansible).)"),(0,r.kt)("p",null,"The infrastructure, management and openstack services are all deployed in containers."),(0,r.kt)("p",null,"Included tools for Operations: ARA, Netbox, Cockpit, Netdata, Skydive (opt-in),\nPatchman, phpMyAdmin, Elasticsearch (b/f license change), Kibana, Grafana, influxdb"),(0,r.kt)("p",null,"Validation: Rally, Refstack"),(0,r.kt)("p",null,"Infrastructure: Linux, KVM, ceph (pacific), OpenVSwitch, OVN, MariaDB, RabbitMQ, Redis,\nEtcd, HAproxy, Keepalived, Memcached, Keycloak"),(0,r.kt)("p",null,"IaaS (OpenStack - Wallaby): keystone, nova, glance, cinder, neutron, octavia, horizon"),(0,r.kt)("p",null,"Optional OpenStack services: designate, heat, gnocchi, ceilometer, aodh, panko, senlin,\nbarbican, manila, magnum"),(0,r.kt)("p",null,"See ",(0,r.kt)("a",{parentName:"p",href:"https://docs.osism.de/testbed/overview.html#software-bill-of-materials-sbom"},"testbed SBOM")," for\na complete list. The exact versions of the contained components can be retrieved from the\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/osism/release/tree/master/1.0.0"},"release repo")," of OSISM."),(0,r.kt)("h2",{id:"get-scs"},"Get SCS"),(0,r.kt)("p",null,"See ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/docs/blob/main/README.md"},"main README"),"."),(0,r.kt)("h2",{id:"known-bugs"},"Known Bugs"),(0,r.kt)("p",null,"Nothing major known yet."),(0,r.kt)("h2",{id:"technical-previews"},"Technical Previews"),(0,r.kt)("p",null,"While already in productive use (on bare metal) by two providers, the bare metal\nsetup currently has a few more manual steps than we would like. This will improve\nwith the next releases."),(0,r.kt)("p",null,"We have worked hard on supporting identity federation (OIDC and SAML) during the last\nfew months. We have also spent significant effort on getting the k8s stack with\nk8s cluster API into a good shape. However, we have determined that we do not\nyet consider those two key pieces as production-ready. The goal is to change that\nfor R1 (see below)."),(0,r.kt)("p",null,"For now, you can use the software to see where SCS is going and test our technical\npreview code. We really appreciate feedback we get on these pieces as well.\nHowever keep in mind that we do not guarantee to ship technical previews from\na Release as production-ready software in one of the next releases. We certainly\nhope to do so."),(0,r.kt)("p",null,"To test how our k8s aaS platform will look like, have a look at\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/k8s-cluster-api-provider"},"https://github.com/SovereignCloudStack/k8s-cluster-api-provider"),"\nYou can follow the documentation to set up the k8s cluster API on an SCS\ncloud (or other well configured OpenStack clouds that support octavia)."),(0,r.kt)("p",null,"The ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/openstack-health-monitor"},"openstack-health-monitor"),"\nis used by us to monitor that the API works and successfully creates working resources\nin finite time. We plan to integrate it with a dashboard and an alarming mechanism in\nthe next releases."),(0,r.kt)("h2",{id:"release-tagging"},"Release tagging"),(0,r.kt)("p",null,"See ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Design-Docs/Release-Numbering-Scheme.md"},"Release Numbering scheme"),".\nThe containers have version number v1.0.0 for R0."),(0,r.kt)("h2",{id:"updates"},"Updates"),(0,r.kt)("p",null,"Updating the software can conveniently be done from the manager node by running the\nansible playbooks again. Details are in the\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.osism.tech/testbed/usage.html#update-services"},"OSISM testbed documentation"),"."),(0,r.kt)("h2",{id:"bug-reporting"},"Bug reporting"),(0,r.kt)("p",null,"See ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/docs/blob/main/README.md"},"main README")," file."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7bd33c3d.7bf609e7.js b/assets/js/7bd33c3d.7bf609e7.js new file mode 100644 index 0000000000..b8293f10eb --- /dev/null +++ b/assets/js/7bd33c3d.7bf609e7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1498],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>k});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),p=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},c=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),u=p(n),m=r,k=u["".concat(s,".").concat(m)]||u[m]||d[m]||l;return n?a.createElement(k,o(o({ref:t},c),{},{components:n})):a.createElement(k,o({ref:t},c))}));function k(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,o=new Array(l);o[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:r,o[1]=i;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var a=n(87462),r=(n(67294),n(3905));const l={title:"Getting Started with OpenStack",version:new Date("2023-08-04T00:00:00.000Z"),author:"Ralf Heiringhoff, Eduard Itrich, Mathias Fechner"},o=void 0,i={unversionedId:"cloud-resources/getting-started-openstack",id:"cloud-resources/getting-started-openstack",title:"Getting Started with OpenStack",description:"Getting Started with OpenStack CLI",source:"@site/community/cloud-resources/getting-started-openstack.md",sourceDirName:"cloud-resources",slug:"/cloud-resources/getting-started-openstack",permalink:"/community/cloud-resources/getting-started-openstack",draft:!1,tags:[],version:"current",frontMatter:{title:"Getting Started with OpenStack",version:"2023-08-04T00:00:00.000Z",author:"Ralf Heiringhoff, Eduard Itrich, Mathias Fechner"},sidebar:"community",previous:{title:"Test and development cloud resources",permalink:"/community/cloud-resources/"},next:{title:"Getting Started Gaia-X Demonstrator @ plusserver",permalink:"/community/cloud-resources/plusserver-gx-scs"}},s={},p=[{value:"Getting Started with OpenStack CLI",id:"getting-started-with-openstack-cli",level:2},{value:"OpenStackClient (CLI)",id:"openstackclient-cli",level:2},{value:"Object Storage (S3)",id:"object-storage-s3",level:2},{value:"References",id:"references",level:2}],c={toc:p},u="wrapper";function d(e){let{components:t,...l}=e;return(0,r.kt)(u,(0,a.Z)({},c,l,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"getting-started-with-openstack-cli"},"Getting Started with OpenStack CLI"),(0,r.kt)("h2",{id:"openstackclient-cli"},"OpenStackClient (CLI)"),(0,r.kt)("p",null,"The OpenStackClient is installable via all major Linux Distributions:"),(0,r.kt)("p",null,"for debian and ubuntu with apt:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo apt install python3-openstackclient\n")),(0,r.kt)("p",null,"for ubuntu with snap openstack CLI is installable too:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo snap install openstackclients\n")),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"[!NOTE]","\nVersions from Linux repository could be in a stable but old state.")),(0,r.kt)("p",null,"Install it directly via ",(0,r.kt)("a",{parentName:"p",href:"https://pypi.org/project/python-openstackclient"},"pypi"),"\nfrom upstream is the recommend way."),(0,r.kt)("p",null,"Here for example RHEL:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo dnf install python3 python3-devel gcc python3-pip\n")),(0,r.kt)("p",null,"Here for example Debian and Ubuntu:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo apt install python3-minimal python3-pip python3-venv python3-dev build-essential\n")),(0,r.kt)("p",null," Here as example for SUSE"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo zypper in python3-pip python3-venv python3-dev\n")),(0,r.kt)("p",null,"Here for example with Apple's MacOS"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"brew install python3\n")),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"[!NOTE]","\nPython installation for windows systems please use the ",(0,r.kt)("a",{parentName:"p",href:"https://www.python.org/downloads/windows/"},"python installation guide"),"\nor recommend use the ",(0,r.kt)("a",{parentName:"p",href:"https://learn.microsoft.com/de-de/windows/wsl/install"},"Linux Subsystem WSL"))),(0,r.kt)("p",null,"Python Virtualenv"),(0,r.kt)("p",null,"It is also recommended to use virtual environments, here as an example for\nLinux and MacOS:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"python3 -m venv oscli\nsource oscli/bin/activate\npip install --upgrade pip\npip install python-openstackclient \\\npython-cinderclient \\\npython-designateclient \\\npython-glanceclient \\\npython-neutronclient \\\npython-novaclient \\\npython-octaviaclient \\\npython-barbicanclient\n\n")),(0,r.kt)("p",null,"For further Information see the OpenStack Project upstream website\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.openstack.org/python-openstackclient/latest/index.html"},"python-openstackclient"),"."),(0,r.kt)("p",null,"This repo holds examples for ",(0,r.kt)("a",{target:"_blank",href:n(91181).Z},"clouds-public.yaml")," + ",(0,r.kt)("a",{target:"_blank",href:n(130).Z},"clouds.yaml"),"."),(0,r.kt)("p",null,"Alternatively you can download an OpenRC Environment file when you're logged\nin to Horizon:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"upper right side \u27a1\ufe0f ",(0,r.kt)("inlineCode",{parentName:"li"},"")),(0,r.kt)("li",{parentName:"ul"},"OpenStack RC File")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"$ source ./-openrc.sh\nPlease enter your OpenStack Password for project XXX as user YYY:\n")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"openstack --help\n")),(0,r.kt)("p",null,"when you're using clouds.yaml you can specify multiple endpoints and\nselect the specific endpoint by passing ",(0,r.kt)("inlineCode",{parentName:"p"},"--os-cloud=")," to the\nopenstack cmdline or setting ",(0,r.kt)("inlineCode",{parentName:"p"},"OS_CLOUD"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"openstack --os-cloud MYCLOUD\n")),(0,r.kt)("p",null,"or"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"export OS_CLOUD=MYCLOUD\nopenstack\n")),(0,r.kt)("p",null,"OpenStack Client in action inside of the OSISM testbed:\n",(0,r.kt)("img",{alt:"Example OpenStackClient in testbed",src:n(34284).Z,width:"2520",height:"1098"})),(0,r.kt)("h2",{id:"object-storage-s3"},"Object Storage (S3)"),(0,r.kt)("p",null,"Create AWS like credentials with ",(0,r.kt)("inlineCode",{parentName:"p"},"openstack ec2 credentials create"),".\nIf you use libs3, store the access field in ",(0,r.kt)("inlineCode",{parentName:"p"},"S3_ACCESS_KEY_ID")," and the secret\nfield in",(0,r.kt)("inlineCode",{parentName:"p"},"S3_SECRET_ACCESS_KEY")," and set ",(0,r.kt)("inlineCode",{parentName:"p"},"S3_HOSTNAME="),".\nYou will see the same buckets (containers) and objects whether you access your\nobject store via the swift or via the s3 protocol."),(0,r.kt)("h2",{id:"references"},"References"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://www.openstack.org",title:"OpenStack Site"},"OpenStack")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/SovereignCloudStack",title:"SovereignCloudStack on github"},"SovereignCloudStack")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/osism",title:"OSISM on github"},"OSISM")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://docs.ansible.com/ansible/latest/collections/openstack/cloud/index.html",title:"Ansible Module OpenStack"},"ansible")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://registry.terraform.io/providers/terraform-provider-openstack/openstack/latest/docs",title:"OpenStack Terraform Provider"},"terraform")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://cloudinit.readthedocs.io/en/latest/",title:"cloud-init documentation"},"cloud-init"))))}d.isMDXComponent=!0},91181:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/files/clouds-public-e9ba939dfde1c0efe3a32ec6f5d1f612.yaml"},130:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/files/clouds.yaml-9c0c983f9c293bc5adeae683d442174e.sample"},34284:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/getting_started_openstack_anim-d88d134eff244cf8891c5ca1efcfc65a.gif"}}]); \ No newline at end of file diff --git a/assets/js/7e793606.77dcc9f1.js b/assets/js/7e793606.77dcc9f1.js new file mode 100644 index 0000000000..31904319d4 --- /dev/null +++ b/assets/js/7e793606.77dcc9f1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4898],{3905:(e,t,r)=>{r.d(t,{Zo:()=>f,kt:()=>d});var n=r(67294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var c=n.createContext({}),l=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},f=function(e){var t=l(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,o=e.originalType,c=e.parentName,f=s(e,["components","mdxType","originalType","parentName"]),p=l(r),h=i,d=p["".concat(c,".").concat(h)]||p[h]||u[h]||o;return r?n.createElement(d,a(a({ref:t},f),{},{components:r})):n.createElement(d,a({ref:t},f))}));function d(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=r.length,a=new Array(o);a[0]=h;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[p]="string"==typeof e?e:i,a[1]=s;for(var l=2;l{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var n=r(87462),i=(r(67294),r(3905));const o={},a="Scopes and Versions",s={unversionedId:"certification/subjects-versions",id:"certification/subjects-versions",title:"Scopes and Versions",description:"The SCS Certification scopes are discriminated in two dimensions. The first is the technology layer, which is either IaaS (infrastructure) or KaaS (Kubernetes). The second dimension is the level, which refer to the level of sovereignty, which is achieved by the certificate. There are three different levels:",source:"@site/standards/certification/subjects-versions.md",sourceDirName:"certification",slug:"/certification/subjects-versions",permalink:"/standards/certification/subjects-versions",draft:!1,tags:[],version:"current",frontMatter:{}},c={},l=[],f={toc:l},p="wrapper";function u(e){let{components:t,...o}=e;return(0,i.kt)(p,(0,n.Z)({},f,o,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"scopes-and-versions"},"Scopes and Versions"),(0,i.kt)("p",null,"The SCS Certification scopes are discriminated in two dimensions. The first is the technology layer, which is either IaaS (infrastructure) or KaaS (Kubernetes). The second dimension is the level, which refer to the level of sovereignty, which is achieved by the certificate. There are three different levels:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"SCS compatible"),(0,i.kt)("li",{parentName:"ul"},"SCS open"),(0,i.kt)("li",{parentName:"ul"},"SCS sovereign")),(0,i.kt)("p",null,'Consequently, an SCS user can achieve certificates in six different scopes.\nHence, an SCS certification scope examines all standards required to achieve a certain level for a certain layer, e.g. the "SCS-compatible" level for the IaaS-layer.'),(0,i.kt)("p",null,"Like software states, certification scopes are versioned. To achieve the certificate for a scope all standards, which are part of the current version of this scope must be met. A certification scope version has an expiry date after which the next version of this scope becomes valid. An SCS user must fulfil the standards in the actual certification scope version to stay certified. There is a transition period between two versions, in which both versions are valid as shown in the diagram below. It also shows that each scope has its own versioning cycle independent from all other scopes."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Alt text",src:r(59561).Z,width:"2728",height:"742"})))}u.isMDXComponent=!0},59561:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/image-123702bb74539962d7c6839715583f29.png"}}]); \ No newline at end of file diff --git a/assets/js/7e7cf0e4.12d3736a.js b/assets/js/7e7cf0e4.12d3736a.js new file mode 100644 index 0000000000..f39e714bf9 --- /dev/null +++ b/assets/js/7e7cf0e4.12d3736a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[401],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>m});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=n.createContext({}),c=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},d=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),p=c(r),f=a,m=p["".concat(s,".").concat(f)]||p[f]||u[f]||o;return r?n.createElement(m,i(i({ref:t},d),{},{components:r})):n.createElement(m,i({ref:t},d))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=f;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:a,i[1]=l;for(var c=2;c{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var n=r(87462),a=(r(67294),r(3905));const o={},i="SCS-0003: YAML Standards",l={unversionedId:"global/scs-0003",id:"global/scs-0003",title:"SCS-0003: YAML Standards",description:"SCS-0003 outlines the standards and certification processes for interoperable and sovereign cloud offerings, categorizing certifications into levels and layers, and detailing their progression, prerequisites, and versioning in a machine-readable YAML format for clarity, traceability, and tool integration.",source:"@site/standards/global/scs-0003.md",sourceDirName:"global",slug:"/global/scs-0003",permalink:"/standards/global/scs-0003",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"standards",previous:{title:"SCS Documentation structure",permalink:"/standards/scs-0002-v2-standards-docs-org"},next:{title:"Sovereign Cloud Standards YAML",permalink:"/standards/scs-0003-v1-sovereign-cloud-standards-yaml"}},s={},c=[],d={toc:c},p="wrapper";function u(e){let{components:t,...r}=e;return(0,a.kt)(p,(0,n.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"scs-0003-yaml-standards"},"SCS-0003: YAML Standards"),(0,a.kt)("p",null,"SCS-0003 outlines the standards and certification processes for interoperable and sovereign cloud offerings, categorizing certifications into levels and layers, and detailing their progression, prerequisites, and versioning in a machine-readable YAML format for clarity, traceability, and tool integration."),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Version"),(0,a.kt)("th",{parentName:"tr",align:null},"Type"),(0,a.kt)("th",{parentName:"tr",align:null},"State"),(0,a.kt)("th",{parentName:"tr",align:null},"stabilized"),(0,a.kt)("th",{parentName:"tr",align:null},"obsoleted"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("a",{parentName:"td",href:"/standards/scs-0003-v1-sovereign-cloud-standards-yaml"},"SCS-0003-v1")),(0,a.kt)("td",{parentName:"tr",align:null},"Procedural"),(0,a.kt)("td",{parentName:"tr",align:null},"\ud83d\udfe0 Draft"),(0,a.kt)("td",{parentName:"tr",align:null},"-"),(0,a.kt)("td",{parentName:"tr",align:null},"-")))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7f1a31c3.0f6888d8.js b/assets/js/7f1a31c3.0f6888d8.js new file mode 100644 index 0000000000..b769bed248 --- /dev/null +++ b/assets/js/7f1a31c3.0f6888d8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9818],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function s(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var l=n.createContext({}),p=function(e){var t=n.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):s(s({},t),e)),a},u=function(e){var t=p(e.components);return n.createElement(l.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=p(a),c=r,h=d["".concat(l,".").concat(c)]||d[c]||m[c]||o;return a?n.createElement(h,s(s({ref:t},u),{},{components:a})):n.createElement(h,s({ref:t},u))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,s=new Array(o);s[0]=c;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[d]="string"==typeof e?e:r,s[1]=i;for(var p=2;p{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var n=a(87462),r=(a(67294),a(3905));const o={},s="Release Notes for SCS Release 2",i={unversionedId:"releases/Release2",id:"releases/Release2",title:"Release Notes for SCS Release 2",description:"(Release Date: 2022-03-23)",source:"@site/docs/06-releases/Release2.md",sourceDirName:"06-releases",slug:"/releases/Release2",permalink:"/docs/releases/Release2",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/06-releases/Release2.md",tags:[],version:"current",frontMatter:{},sidebar:"docs",previous:{title:"Release Notes for SCS Release 1",permalink:"/docs/releases/Release1"},next:{title:"Release Notes for SCS Release 3",permalink:"/docs/releases/Release3"}},l={},p=[{value:"Scope",id:"scope",level:2},{value:"Component Versions and User-visible improvements (highlights)",id:"component-versions-and-user-visible-improvements-highlights",level:2},{value:"New Features (Highlights)",id:"new-features-highlights",level:2},{value:"Operator focused improvements",id:"operator-focused-improvements",level:3},{value:"SCS Developer focused improvements (testbed)",id:"scs-developer-focused-improvements-testbed",level:3},{value:"Upgrade/Migration notes",id:"upgrademigration-notes",level:2},{value:"Cluster Management",id:"cluster-management",level:3},{value:"OSISM",id:"osism",level:3},{value:"Removals",id:"removals",level:2},{value:"Deprecations",id:"deprecations",level:2},{value:"Security Fixes",id:"security-fixes",level:2},{value:"Resolved Issues",id:"resolved-issues",level:2},{value:"Standards Conformance",id:"standards-conformance",level:2},{value:"Release Tagging",id:"release-tagging",level:2},{value:"List of known issues & restrictions in R2",id:"list-of-known-issues--restrictions-in-r2",level:2},{value:"Future directions (selected Highlights)",id:"future-directions-selected-highlights",level:2},{value:"Contributing",id:"contributing",level:2}],u={toc:p},d="wrapper";function m(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,n.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"release-notes-for-scs-release-2"},"Release Notes for SCS Release 2"),(0,r.kt)("p",null,"(Release Date: 2022-03-23)"),(0,r.kt)("h2",{id:"scope"},"Scope"),(0,r.kt)("p",null,"Main goals for Release 2 (R2) were massive improvements in bare\nmetal deployment and our cluster management layer gaining the\nability to handle many clusters independently with a number\nof optional services."),(0,r.kt)("h2",{id:"component-versions-and-user-visible-improvements-highlights"},"Component Versions and User-visible improvements (highlights)"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We support the latest ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.22.md"},"Kubernetes 1.22")," and\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.23.md"},"1.23")," releases.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"The Kubernetes Cluster API is now available in a stable v1beta1\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api/releases"},"release 1.0.x"),"\nwith the corresponding ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api/releases"},"cluster-api-provider-openstack 0.5.x"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"There are a number of new standard services available for the\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/k8s-cluster-api-provider/"},"k8s capi"),"\nmanaged clusters, amongst which cert-manager and flux. The clusters\nhave better default settings for the nginx-ingress, anti-affinity\nfor the nodes and the ability to chose cilium over calico and\nto have stable multi-controller node setups on clouds without\nlow-latency local storage.\nPlease consult the\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/k8s-cluster-api-provider/blob/master/Release-Notes-R2.md"},"k8s capi provider release notes"),"\nfor more details.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://releases.openstack.org/xena/highlights.html"},"OpenStack Xena release")),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"We have also enabled SPICE support in addition to noVNC to\naccess the graphical console of VMs."))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"The base infrastructure is provided by\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/osism/release/blob/main/notes/3.0.0/NOTES.md"},"OSISM 3.0.0"),"\nwhich in turn build on top of kolla and kolla-ansible."))),(0,r.kt)("h2",{id:"new-features-highlights"},"New Features (Highlights)"),(0,r.kt)("h3",{id:"operator-focused-improvements"},"Operator focused improvements"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"The Cluster Management Node is now well prepared to manage numerous\nclusters with independent settings and different feature sets by\ncreating default settings and then keeping track of various workload\nclusters in own directories. Documentation has been vastly improved.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"The Cluster Management node now gets its artifacts directly from\ngit, making incremental updates to it a lot easier, thus also\navoiding to disrupt workload clusters through redeployed management\nnodes to roll out updates.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Added dashboards for the operators:"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Homer"),(0,r.kt)("li",{parentName:"ul"},"Flower"),(0,r.kt)("li",{parentName:"ul"},"Grafana dashboards"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Work is underway to supersede ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/openstack-health-monitor"},"openstack-health-monitor"),"\nwith a solution that is using tempest and rally. The health-monitor\nhas received improvements though and is at this point still fully\nsupported and recommended -- it has surfaced a number of issues with\ntest clouds, especially failed metadata services.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"User federation has been prepared to be ready for Gaia-X federation integration"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Keystone can consume users from Keycloak via OpenID-Connect"),(0,r.kt)("li",{parentName:"ul"},"Keycloak uses the highly-available Galera database cluster now"),(0,r.kt)("li",{parentName:"ul"},"mod_oauth2 support for Keystone"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Vast improvements in the SCS Deployment automation"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Full automation of bare metal deployment with Bifrost and Ironic"),(0,r.kt)("li",{parentName:"ul"},"Using NetBox as central source of truth for the complete setup"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"New services available (opt-in)"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"ClamAV, dnsdist, cgit, FRRouting, Nexus, Tang"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Traefik centrally routes the connections to Nexus, NetBox, phpMyAdmin, Homer, Flower, ARA, cgit"))),(0,r.kt)("h3",{id:"scs-developer-focused-improvements-testbed"},"SCS Developer focused improvements (testbed)"),(0,r.kt)("p",null,"We now have scripts that allow us to connect to the workload cluster node network\nfor debugging purposes."),(0,r.kt)("p",null,"The configuration of the testbed was minimized and the deployment was made more production-oriented."),(0,r.kt)("p",null,"Further noteworthy improvements to testbed:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"TLS is implemented throughout the services also in testbed"),(0,r.kt)("li",{parentName:"ul"},"Virtual BMC in testbed"),(0,r.kt)("li",{parentName:"ul"},"Public DNS for testbed (",(0,r.kt)("inlineCode",{parentName:"li"},"testbed.osism.xyz"),")")),(0,r.kt)("p",null,"We have a Zuul CI framework running and started migrating CI testing from github actions to\nusing our Zuul infrastructure."),(0,r.kt)("p",null,"Renovate is being used to keep the pinned versions up-to-date and consistent across the\nmany repositories."),(0,r.kt)("p",null,"An overview over the used software versions is available from the\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/osism/release"},"OSISM release")," repository as input\nfor a complete SBOM. This allows to e.g. investigate the contents of the\nused (v3.0.0) images."),(0,r.kt)("h2",{id:"upgrademigration-notes"},"Upgrade/Migration notes"),(0,r.kt)("h3",{id:"cluster-management"},"Cluster Management"),(0,r.kt)("p",null,"The names of a few settings have changed since R1 -- if you have diverged from the defaults,\nthis may require adjusting the ",(0,r.kt)("inlineCode",{parentName:"p"},"environment.tfvars")," or the ",(0,r.kt)("inlineCode",{parentName:"p"},"clusterctl.yaml")," files.\nSee ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/k8s-cluster-api-provider/blob/master/Release-Notes-R2.md#incompatible-changes"},"k8s-cluster-api-provider Release Notes"),"\nfor more details."),(0,r.kt)("p",null,"The updating approach has fundamentally changed:\nIf you were used to deploy fresh management nodes regularly to\nbenefit from the upstream improvements, this need has been vastly reduced now,\nallowing for long-living management nodes and workload clusters managed by them."),(0,r.kt)("h3",{id:"osism"},"OSISM"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Playbook generic-configuration.yml was deprecated. From now on, please use the playbook of\nthe same name in the manager environment (manager-configuration.yml). All configuration\nparameters from environments/configuration.yml should be moved to environments/manager/configuration.yml.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"In kolla-ansible the haproxy role was renamed to loadbalancer. Accordingly, loadbalancer must now be\nused for the deployment of HAProxy."))),(0,r.kt)("h2",{id:"removals"},"Removals"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"OpenStack Victoria images are no longer built and thus no longer kept updated"),(0,r.kt)("li",{parentName:"ul"},"Support for Zabbix has been removed, Prometheus will be used as the only monitoring stack in the future"),(0,r.kt)("li",{parentName:"ul"},"Heimdall as a service was removed, as an alternative Homer is now available")),(0,r.kt)("h2",{id:"deprecations"},"Deprecations"),(0,r.kt)("p",null,"Deprecations happen according to our ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Design-Docs/Release-Policies.md#deprecation"},"deprecation policy"),"."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Cockpit is deprecated in favor of Boundary by HashiCorp or Teleport"),(0,r.kt)("li",{parentName:"ul"},"ceph-ansible is deprecated in preparation for cephadm"),(0,r.kt)("li",{parentName:"ul"},"All osism- scripts on the manager are deprecated and will be replaced by the new OSISM CLI. The scripts will be removed in the next release"),(0,r.kt)("li",{parentName:"ul"},"The following services are currently not used and are deprecated and scheduled for removal as of now: Falco, Jenkins, Rundeck, Lynis, Trivy"),(0,r.kt)("li",{parentName:"ul"},"Heat will no longer be offered by default in the testbed in the future"),(0,r.kt)("li",{parentName:"ul"},"The docker-compose CLI will be removed and replaced by the new compose plugin for Docker.\ndocker-compose is then no longer available and docker compose must be used instead")),(0,r.kt)("h2",{id:"security-fixes"},"Security Fixes"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The Elasticsearch container included in OSISM testbed was exposed to the log4j\nissue -- new images were provided for addressing this. See the\n",(0,r.kt)("a",{parentName:"li",href:"https://scs.community/de/security/2021/12/13/advisory-log4j/"},"security advisory"))),(0,r.kt)("h2",{id:"resolved-issues"},"Resolved Issues"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"The nginx-ingress loadbalancer could run into name conflicts before.\nThe loadbalancer now uses a health monitor to avoid routing to the wrong\nnodes, which typically resulted in 10s delays when connecting to the service\nbehind the ingress controller.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"cAdvisor has now reduced number of Prometheus metrics and labels exported by\ndefault - this will ease the load on the system.\nThis implies that corresponding time series data will no longer be created."))),(0,r.kt)("h2",{id:"standards-conformance"},"Standards Conformance"),(0,r.kt)("p",null,"The clusters created with our cluster-API cluster management solution pass\nthe ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Design-Docs/Image-Properties-Spec.md"},"CNCF conformance tests"),"\nas reported by ",(0,r.kt)("a",{parentName:"p",href:"https://sonobuoy.io/"},"sonobuoy"),"."),(0,r.kt)("p",null,"The ",(0,r.kt)("a",{parentName:"p",href:"https://openstack.org/"},"OpenStack")," layer passes the\n",(0,r.kt)("a",{parentName:"p",href:"https://openinfra.dev/"},"OIF")," trademark tests, so cloud providers\nleveraging the stack should easily be able to achieve the\n",(0,r.kt)("a",{parentName:"p",href:"https://www.openstack.org/brand/interop/"},'"OpenStack powered compute"'),"\ntrademark certification."),(0,r.kt)("p",null,"Our partner plusserver has ",(0,r.kt)("a",{parentName:"p",href:"https://www.openstack.org/brand/interop/"},"achieved"),"\na ",(0,r.kt)("a",{parentName:"p",href:"https://www.bsi.bund.de/EN/Topics/CloudComputing/Compliance_Criteria_Catalogue/Compliance_Criteria_Catalogue_node.html"},"BSI C5"),"\nsecurity certification for their SCS implementation pluscloud open."),(0,r.kt)("p",null,"We are working within ",(0,r.kt)("a",{parentName:"p",href:"https://gaia-x.eu/"},"Gaia-X")," to further the power\nof Gaia-X self-descriptions and are closely working with the\n",(0,r.kt)("a",{parentName:"p",href:"https://gxfs.de/"},"GXFS project"),"\nto jointly deliver a standard toolbox for Gaia-X compliant\ninfrastructure and service offerings."),(0,r.kt)("p",null,"The SCS standards for ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Design-Docs/flavor-naming.md"},"flavor naming")," and\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Design-Docs/Image-Properties-Spec.md"},"image metadata"),"\nare largely unchanged since R1. We have however\nmade progress in our reference implementation fully implementing\nthem without any further tweaks."),(0,r.kt)("h2",{id:"release-tagging"},"Release Tagging"),(0,r.kt)("p",null,"See ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Design-Docs/Release-Numbering-Scheme.md"},"Release Numbering scheme")," -- unchanged from R0.\nWe have added the tag ",(0,r.kt)("inlineCode",{parentName:"p"},"v3.0.0")," to the relevant repositories to designate the ",(0,r.kt)("inlineCode",{parentName:"p"},"SCS_RELEASE_R2"),"."),(0,r.kt)("p",null,"Note that we will release R3 (v4.0.0) in September 2022 and stop providing maintenance\nupdates for R2 at the end of October."),(0,r.kt)("h2",{id:"list-of-known-issues--restrictions-in-r2"},"List of known issues & restrictions in R2"),(0,r.kt)("h2",{id:"future-directions-selected-highlights"},"Future directions (selected Highlights)"),(0,r.kt)("p",null,"Alongside with R2 we published a blog post on some first thoughts on\n",(0,r.kt)("a",{parentName:"p",href:"https://scs.community/tech/2022/03/23/r2-and-future-directions/"},"future directions towards R3"),"."),(0,r.kt)("h2",{id:"contributing"},"Contributing"),(0,r.kt)("p",null,"We appreciate contribution to strategy and implementation, please join\nour community -- or just leave input on the github issues and PRs.\nHave a look at our ",(0,r.kt)("a",{parentName:"p",href:"https://scs.community/docs/contributor/"},"contributor guide"),".\nWe also have worked on a ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/pull/26"},"Code of Conduct"),"\nto document the expected behavior of contributors and how we deal with\ncases where individuals fail to meet the expectation."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7f34127d.ae52c4fe.js b/assets/js/7f34127d.ae52c4fe.js new file mode 100644 index 0000000000..f1cde782fd --- /dev/null +++ b/assets/js/7f34127d.ae52c4fe.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9693],{3905:(e,n,t)=>{t.d(n,{Zo:()=>m,kt:()=>d});var r=t(67294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function o(e){for(var n=1;n=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var l=r.createContext({}),p=function(e){var n=r.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):o(o({},n),e)),t},m=function(e){var n=p(e.components);return r.createElement(l.Provider,{value:n},e.children)},c="mdxType",g={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},u=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,m=s(e,["components","mdxType","originalType","parentName"]),c=p(t),u=a,d=c["".concat(l,".").concat(u)]||c[u]||g[u]||i;return t?r.createElement(d,o(o({ref:n},m),{},{components:t})):r.createElement(d,o({ref:n},m))}));function d(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var i=t.length,o=new Array(i);o[0]=u;var s={};for(var l in n)hasOwnProperty.call(n,l)&&(s[l]=n[l]);s.originalType=e,s[c]="string"==typeof e?e:a,o[1]=s;for(var p=2;p{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>g,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var r=t(87462),a=(t(67294),t(3905));const i={sidebar_label:"Manager",sidebar_position:20},o="Manager",s={unversionedId:"iaas/guides/configuration-guide/manager",id:"iaas/guides/configuration-guide/manager",title:"Manager",description:"Stable release",source:"@site/docs/02-iaas/guides/configuration-guide/manager.md",sourceDirName:"02-iaas/guides/configuration-guide",slug:"/iaas/guides/configuration-guide/manager",permalink:"/docs/iaas/guides/configuration-guide/manager",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/configuration-guide/manager.md",tags:[],version:"current",sidebarPosition:20,frontMatter:{sidebar_label:"Manager",sidebar_position:20},sidebar:"docs",previous:{title:"Inventory",permalink:"/docs/iaas/guides/configuration-guide/inventory"},next:{title:"Commons",permalink:"/docs/iaas/guides/configuration-guide/commons/"}},l={},p=[{value:"Stable release",id:"stable-release",level:2},{value:"OpenSearch integration",id:"opensearch-integration",level:2},{value:"OpenStack broker integration",id:"openstack-broker-integration",level:2}],m={toc:p},c="wrapper";function g(e){let{components:n,...t}=e;return(0,a.kt)(c,(0,r.Z)({},m,t,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"manager"},"Manager"),(0,a.kt)("h2",{id:"stable-release"},"Stable release"),(0,a.kt)("p",null,"It is recommended to use a stable release of OSISM. All available releases are listed on\n",(0,a.kt)("a",{parentName:"p",href:"https://release.osism.tech"},"release.osism.tech"),". Always check there in advance and do not copy\nthe stable release used here as an example."),(0,a.kt)("p",null,"In the example, OSISM release 6.0.0 is used."),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"Sync the image versions in the configuration repository. It is important to do this so\nthat the correct versions are available in ",(0,a.kt)("inlineCode",{parentName:"p"},"environments/manager/images.yml"),"."),(0,a.kt)("pre",{parentName:"li"},(0,a.kt)("code",{parentName:"pre"},"gilt overlay # you have to do this 2x\ngilt overlay\n")),(0,a.kt)("p",{parentName:"li"},"Optionally, this is normally not necessary, it is possible to reference a specific tag of the\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/osism/cfg-generics"},"osism/cfg-generics")," repository. To do this, first\ncheck which version of osism/cfg-generics is used in a particular release. The version is\ndefined in ",(0,a.kt)("inlineCode",{parentName:"p"},"generics_version")," in the ",(0,a.kt)("inlineCode",{parentName:"p"},"base.yml")," file in the ",(0,a.kt)("inlineCode",{parentName:"p"},"osism/release")," repository. For OSISM 6.0.0,\nfor example, this is version ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/osism/release/blob/main/6.0.0/base.yml#L6"},"v0.20230919.0"),".\nThis version is then added to the file ",(0,a.kt)("inlineCode",{parentName:"p"},"gilt.yml")," in the configuration repository instead of\n",(0,a.kt)("inlineCode",{parentName:"p"},"main")," at ",(0,a.kt)("inlineCode",{parentName:"p"},"version"),". This change must be made again after each execution of ",(0,a.kt)("inlineCode",{parentName:"p"},"gilt overlay")," as\nit is overwritten by the call of ",(0,a.kt)("inlineCode",{parentName:"p"},"gilt overlay"),". This cannot be realized differently in the\ncurrent implementation of ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/retr0h/gilt"},"Gilt"),".")),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"Set the new manager version in the configuration repository."),(0,a.kt)("pre",{parentName:"li"},(0,a.kt)("code",{parentName:"pre"},"yq -i '.manager_version = \"6.0.0\"' environments/manager/configuration.yml\n"))),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"If ",(0,a.kt)("inlineCode",{parentName:"p"},"openstack_version")," or ",(0,a.kt)("inlineCode",{parentName:"p"},"ceph_version")," are set in ",(0,a.kt)("inlineCode",{parentName:"p"},"environments/manager/configuration.yml"),"\n(or anywhere else), they must be removed. If these are set, the stable release is not used for\nthese components.")),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"Commit and push changes in the configuration repository. Since everyone here has their own\nworkflows for changes to the configuration repository, only a generic example for Git."),(0,a.kt)("pre",{parentName:"li"},(0,a.kt)("code",{parentName:"pre"},'git commit -a -s -m "manager: use OSISM version 6.0.0"\ngit push\n')))),(0,a.kt)("h2",{id:"opensearch-integration"},"OpenSearch integration"),(0,a.kt)("p",null,"With the command ",(0,a.kt)("inlineCode",{parentName:"p"},"osism log opensearch")," it is possible to send SQL queries\nto the OpenSearch service. For the command to be functional, the OpenSearch\nintegration must be activated in the manager environment and the OpenSearch\naddress and port must be set."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml",metastring:'title="environments/manager/configuration.yml"',title:'"environments/manager/configuration.yml"'},"manager_opensearch_enable: true\nmanager_opensearch_address: api-int.testbed.osism.xyz\nmanager_opensearch_port: 9200\nmanager_opensearch_protocol: https\n")),(0,a.kt)("p",null,"The integration can also be enabled later. ",(0,a.kt)("inlineCode",{parentName:"p"},"osism update manager")," is then\nexecuted after the configuration has been changed."),(0,a.kt)("h2",{id:"openstack-broker-integration"},"OpenStack broker integration"),(0,a.kt)("p",null,"If the Baremetal Service Integration in OSISM is used, the OpenStack Broker integration is\nrequired. The integration itself is activated by setting the parameter ",(0,a.kt)("inlineCode",{parentName:"p"},"enable_listener")," to ",(0,a.kt)("inlineCode",{parentName:"p"},"true"),"."),(0,a.kt)("p",null,"The hosts in the ",(0,a.kt)("inlineCode",{parentName:"p"},"manager_listener_broker_hosts")," list are the control nodes of OpenStack.\nThe user is set via ",(0,a.kt)("inlineCode",{parentName:"p"},"manager_listener_broker_username"),". On OpenStack's RabbitMQ broker, the user ",(0,a.kt)("inlineCode",{parentName:"p"},"openstack"),"\nis present by default."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml",metastring:'title="environments/manager/configuration.yml"',title:'"environments/manager/configuration.yml"'},'enable_listener: true\nmanager_listener_broker_hosts:\n - 192.168.16.10\n - 192.168.16.11\n - 192.168.16.12\nmanager_listener_broker_username: openstack\nmanager_listener_broker_uri: "{% for host in manager_listener_broker_hosts %}amqp://{{ manager_listener_broker_username }}:{{ manager_listener_broker_password }}@{{ host }}:5672/{% if not loop.last %};{% endif %}{% endfor %}"\n')),(0,a.kt)("p",null,"The password used when using the ",(0,a.kt)("inlineCode",{parentName:"p"},"openstack")," user is ",(0,a.kt)("inlineCode",{parentName:"p"},"rabbitmq_password")," from ",(0,a.kt)("inlineCode",{parentName:"p"},"environments/kolla/secrets.yml"),"."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml",metastring:'title="environments/manager/secrets.yml"',title:'"environments/manager/secrets.yml"'},"manager_listener_broker_password: RABBITMQ_PASSWORD\n")))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/814f3328.146ae6f7.js b/assets/js/814f3328.146ae6f7.js new file mode 100644 index 0000000000..d5ee706ce8 --- /dev/null +++ b/assets/js/814f3328.146ae6f7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2535],{45641:s=>{s.exports=JSON.parse('{"title":"Recent posts","items":[{"title":"First Blog Post","permalink":"/blog/first-blog-post"}]}')}}]); \ No newline at end of file diff --git a/assets/js/83100446.3577da70.js b/assets/js/83100446.3577da70.js new file mode 100644 index 0000000000..dc512fc75d --- /dev/null +++ b/assets/js/83100446.3577da70.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4945],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>f});var n=r(67294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=n.createContext({}),p=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):c(c({},t),e)),r},s=function(e){var t=p(e.components);return n.createElement(l.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),u=p(r),d=o,f=u["".concat(l,".").concat(d)]||u[d]||m[d]||a;return r?n.createElement(f,c(c({ref:t},s),{},{components:r})):n.createElement(f,c({ref:t},s))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,c=new Array(a);c[0]=d;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[u]="string"==typeof e?e:o,c[1]=i;for(var p=2;p{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>c,default:()=>m,frontMatter:()=>a,metadata:()=>i,toc:()=>p});var n=r(87462),o=(r(67294),r(3905));const a={},c="Overview",i={unversionedId:"container/deployment-examples/a/index",id:"container/deployment-examples/a/index",title:"Overview",description:"TODO",source:"@site/docs/03-container/deployment-examples/a/index.md",sourceDirName:"03-container/deployment-examples/a",slug:"/container/deployment-examples/a/",permalink:"/docs/container/deployment-examples/a/",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/03-container/deployment-examples/a/index.md",tags:[],version:"current",frontMatter:{}},l={},p=[],s={toc:p},u="wrapper";function m(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"overview"},"Overview"),(0,o.kt)("p",null,"TODO"))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8443.eb0070b3.js b/assets/js/8443.eb0070b3.js new file mode 100644 index 0000000000..898af4eb4d --- /dev/null +++ b/assets/js/8443.eb0070b3.js @@ -0,0 +1,2 @@ +/*! For license information please see 8443.eb0070b3.js.LICENSE.txt */ +(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8443],{68443:(t,e,n)=>{"use strict";t.exports=n(80295)},1228:(t,e,n)=>{"use strict";var i=n(12856),s={wrapper:{position:"relative",display:"inline-block"},hint:{position:"absolute",top:"0",left:"0",borderColor:"transparent",boxShadow:"none",opacity:"1"},input:{position:"relative",verticalAlign:"top",backgroundColor:"transparent"},inputWithNoHint:{position:"relative",verticalAlign:"top"},dropdown:{position:"absolute",top:"100%",left:"0",zIndex:"100",display:"none"},suggestions:{display:"block"},suggestion:{whiteSpace:"nowrap",cursor:"pointer"},suggestionChild:{whiteSpace:"normal"},ltr:{left:"0",right:"auto"},rtl:{left:"auto",right:"0"},defaultClasses:{root:"algolia-autocomplete",prefix:"aa",noPrefix:!1,dropdownMenu:"dropdown-menu",input:"input",hint:"hint",suggestions:"suggestions",suggestion:"suggestion",cursor:"cursor",dataset:"dataset",empty:"empty"},appendTo:{wrapper:{position:"absolute",zIndex:"100",display:"none"},input:{},inputWithNoHint:{},dropdown:{display:"block"}}};i.isMsie()&&i.mixin(s.input,{backgroundImage:"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)"}),i.isMsie()&&i.isMsie()<=7&&i.mixin(s.input,{marginTop:"-1px"}),t.exports=s},9050:(t,e,n)=>{"use strict";var i="aaDataset",s="aaValue",r="aaDatum",o=n(12856),a=n(64910),u=n(63561),c=n(1228),l=n(23109);function h(t){var e;(t=t||{}).templates=t.templates||{},t.source||o.error("missing source"),t.name&&(e=t.name,!/^[_a-zA-Z0-9-]+$/.test(e))&&o.error("invalid dataset name: "+t.name),this.query=null,this._isEmpty=!0,this.highlight=!!t.highlight,this.name=void 0===t.name||null===t.name?o.getUniqueId():t.name,this.source=t.source,this.displayFn=function(t){return t=t||"value",o.isFunction(t)?t:e;function e(e){return e[t]}}(t.display||t.displayKey),this.debounce=t.debounce,this.cache=!1!==t.cache,this.templates=function(t,e){return{empty:t.empty&&o.templatify(t.empty),header:t.header&&o.templatify(t.header),footer:t.footer&&o.templatify(t.footer),suggestion:t.suggestion||n};function n(t){return"

"+e(t)+"

"}}(t.templates,this.displayFn),this.css=o.mixin({},c,t.appendTo?c.appendTo:{}),this.cssClasses=t.cssClasses=o.mixin({},c.defaultClasses,t.cssClasses||{}),this.cssClasses.prefix=t.cssClasses.formattedPrefix||o.formatPrefix(this.cssClasses.prefix,this.cssClasses.noPrefix);var n=o.className(this.cssClasses.prefix,this.cssClasses.dataset);this.$el=t.$menu&&t.$menu.find(n+"-"+this.name).length>0?a.element(t.$menu.find(n+"-"+this.name)[0]):a.element(u.dataset.replace("%CLASS%",this.name).replace("%PREFIX%",this.cssClasses.prefix).replace("%DATASET%",this.cssClasses.dataset)),this.$menu=t.$menu,this.clearCachedSuggestions()}h.extractDatasetName=function(t){return a.element(t).data(i)},h.extractValue=function(t){return a.element(t).data(s)},h.extractDatum=function(t){var e=a.element(t).data(r);return"string"==typeof e&&(e=JSON.parse(e)),e},o.mixin(h.prototype,l,{_render:function(t,e){if(this.$el){var n,c=this,l=[].slice.call(arguments,2);if(this.$el.empty(),n=e&&e.length,this._isEmpty=!n,!n&&this.templates.empty)this.$el.html(function(){var e=[].slice.call(arguments,0);return e=[{query:t,isEmpty:!0}].concat(e),c.templates.empty.apply(this,e)}.apply(this,l)).prepend(c.templates.header?h.apply(this,l):null).append(c.templates.footer?p.apply(this,l):null);else if(n)this.$el.html(function(){var t,n,l=[].slice.call(arguments,0),h=this,p=u.suggestions.replace("%PREFIX%",this.cssClasses.prefix).replace("%SUGGESTIONS%",this.cssClasses.suggestions);return t=a.element(p).css(this.css.suggestions),n=o.map(e,f),t.append.apply(t,n),t;function f(t){var e,n=u.suggestion.replace("%PREFIX%",h.cssClasses.prefix).replace("%SUGGESTION%",h.cssClasses.suggestion);return(e=a.element(n).attr({role:"option",id:["option",Math.floor(1e8*Math.random())].join("-")}).append(c.templates.suggestion.apply(this,[t].concat(l)))).data(i,c.name),e.data(s,c.displayFn(t)||void 0),e.data(r,JSON.stringify(t)),e.children().each((function(){a.element(this).css(h.css.suggestionChild)})),e}}.apply(this,l)).prepend(c.templates.header?h.apply(this,l):null).append(c.templates.footer?p.apply(this,l):null);else if(e&&!Array.isArray(e))throw new TypeError("suggestions must be an array");this.$menu&&this.$menu.addClass(this.cssClasses.prefix+(n?"with":"without")+"-"+this.name).removeClass(this.cssClasses.prefix+(n?"without":"with")+"-"+this.name),this.trigger("rendered",t)}function h(){var e=[].slice.call(arguments,0);return e=[{query:t,isEmpty:!n}].concat(e),c.templates.header.apply(this,e)}function p(){var e=[].slice.call(arguments,0);return e=[{query:t,isEmpty:!n}].concat(e),c.templates.footer.apply(this,e)}},getRoot:function(){return this.$el},update:function(t){function e(e){if(!this.canceled&&t===this.query){var n=[].slice.call(arguments,1);this.cacheSuggestions(t,e,n),this._render.apply(this,[t,e].concat(n))}}if(this.query=t,this.canceled=!1,this.shouldFetchFromCache(t))e.apply(this,[this.cachedSuggestions].concat(this.cachedRenderExtraArgs));else{var n=this,i=function(){n.canceled||n.source(t,e.bind(n))};if(this.debounce){clearTimeout(this.debounceTimeout),this.debounceTimeout=setTimeout((function(){n.debounceTimeout=null,i()}),this.debounce)}else i()}},cacheSuggestions:function(t,e,n){this.cachedQuery=t,this.cachedSuggestions=e,this.cachedRenderExtraArgs=n},shouldFetchFromCache:function(t){return this.cache&&this.cachedQuery===t&&this.cachedSuggestions&&this.cachedSuggestions.length},clearCachedSuggestions:function(){delete this.cachedQuery,delete this.cachedSuggestions,delete this.cachedRenderExtraArgs},cancel:function(){this.canceled=!0},clear:function(){this.$el&&(this.cancel(),this.$el.empty(),this.trigger("rendered",""))},isEmpty:function(){return this._isEmpty},destroy:function(){this.clearCachedSuggestions(),this.$el=null}}),t.exports=h},83354:(t,e,n)=>{"use strict";var i=n(12856),s=n(64910),r=n(23109),o=n(9050),a=n(1228);function u(t){var e,n,r,o=this;(t=t||{}).menu||i.error("menu is required"),i.isArray(t.datasets)||i.isObject(t.datasets)||i.error("1 or more datasets required"),t.datasets||i.error("datasets is required"),this.isOpen=!1,this.isEmpty=!0,this.minLength=t.minLength||0,this.templates={},this.appendTo=t.appendTo||!1,this.css=i.mixin({},a,t.appendTo?a.appendTo:{}),this.cssClasses=t.cssClasses=i.mixin({},a.defaultClasses,t.cssClasses||{}),this.cssClasses.prefix=t.cssClasses.formattedPrefix||i.formatPrefix(this.cssClasses.prefix,this.cssClasses.noPrefix),e=i.bind(this._onSuggestionClick,this),n=i.bind(this._onSuggestionMouseEnter,this),r=i.bind(this._onSuggestionMouseLeave,this);var c=i.className(this.cssClasses.prefix,this.cssClasses.suggestion);this.$menu=s.element(t.menu).on("mouseenter.aa",c,n).on("mouseleave.aa",c,r).on("click.aa",c,e),this.$container=t.appendTo?t.wrapper:this.$menu,t.templates&&t.templates.header&&(this.templates.header=i.templatify(t.templates.header),this.$menu.prepend(this.templates.header())),t.templates&&t.templates.empty&&(this.templates.empty=i.templatify(t.templates.empty),this.$empty=s.element('
'),this.$menu.append(this.$empty),this.$empty.hide()),this.datasets=i.map(t.datasets,(function(e){return function(t,e,n){return new u.Dataset(i.mixin({$menu:t,cssClasses:n},e))}(o.$menu,e,t.cssClasses)})),i.each(this.datasets,(function(t){var e=t.getRoot();e&&0===e.parent().length&&o.$menu.append(e),t.onSync("rendered",o._onRendered,o)})),t.templates&&t.templates.footer&&(this.templates.footer=i.templatify(t.templates.footer),this.$menu.append(this.templates.footer()));var l=this;s.element(window).resize((function(){l._redraw()}))}i.mixin(u.prototype,r,{_onSuggestionClick:function(t){this.trigger("suggestionClicked",s.element(t.currentTarget))},_onSuggestionMouseEnter:function(t){var e=s.element(t.currentTarget);if(!e.hasClass(i.className(this.cssClasses.prefix,this.cssClasses.cursor,!0))){this._removeCursor();var n=this;setTimeout((function(){n._setCursor(e,!1)}),0)}},_onSuggestionMouseLeave:function(t){if(t.relatedTarget&&s.element(t.relatedTarget).closest("."+i.className(this.cssClasses.prefix,this.cssClasses.cursor,!0)).length>0)return;this._removeCursor(),this.trigger("cursorRemoved")},_onRendered:function(t,e){if(this.isEmpty=i.every(this.datasets,(function(t){return t.isEmpty()})),this.isEmpty)if(e.length>=this.minLength&&this.trigger("empty"),this.$empty)if(e.length=this.minLength?this._show():this._hide());this.trigger("datasetRendered")},_hide:function(){this.$container.hide()},_show:function(){this.$container.css("display","block"),this._redraw(),this.trigger("shown")},_redraw:function(){this.isOpen&&this.appendTo&&this.trigger("redrawn")},_getSuggestions:function(){return this.$menu.find(i.className(this.cssClasses.prefix,this.cssClasses.suggestion))},_getCursor:function(){return this.$menu.find(i.className(this.cssClasses.prefix,this.cssClasses.cursor)).first()},_setCursor:function(t,e){t.first().addClass(i.className(this.cssClasses.prefix,this.cssClasses.cursor,!0)).attr("aria-selected","true"),this.trigger("cursorMoved",e)},_removeCursor:function(){this._getCursor().removeClass(i.className(this.cssClasses.prefix,this.cssClasses.cursor,!0)).removeAttr("aria-selected")},_moveCursor:function(t){var e,n,i,s;this.isOpen&&(n=this._getCursor(),e=this._getSuggestions(),this._removeCursor(),-1!==(i=((i=e.index(n)+t)+1)%(e.length+1)-1)?(i<-1&&(i=e.length-1),this._setCursor(s=e.eq(i),!0),this._ensureVisible(s)):this.trigger("cursorRemoved"))},_ensureVisible:function(t){var e,n,i,s;n=(e=t.position().top)+t.height()+parseInt(t.css("margin-top"),10)+parseInt(t.css("margin-bottom"),10),i=this.$menu.scrollTop(),s=this.$menu.height()+parseInt(this.$menu.css("padding-top"),10)+parseInt(this.$menu.css("padding-bottom"),10),e<0?this.$menu.scrollTop(i+e):s{"use strict";var i=n(12856),s=n(64910);function r(t){t&&t.el||i.error("EventBus initialized without el"),this.$el=s.element(t.el)}i.mixin(r.prototype,{trigger:function(t,e,n,s){var r=i.Event("autocomplete:"+t);return this.$el.trigger(r,[e,n,s]),r}}),t.exports=r},23109:(t,e,n)=>{"use strict";var i=n(70624),s=/\s+/;function r(t,e,n,i){var r;if(!n)return this;for(e=e.split(s),n=i?function(t,e){return t.bind?t.bind(e):function(){t.apply(e,[].slice.call(arguments,0))}}(n,i):n,this._callbacks=this._callbacks||{};r=e.shift();)this._callbacks[r]=this._callbacks[r]||{sync:[],async:[]},this._callbacks[r][t].push(n);return this}function o(t,e,n){return function(){for(var i,s=0,r=t.length;!i&&s{"use strict";t.exports={wrapper:'',dropdown:'',dataset:'
',suggestions:'',suggestion:'
'}},32534:(t,e,n)=>{"use strict";var i;i={9:"tab",27:"esc",37:"left",39:"right",13:"enter",38:"up",40:"down"};var s=n(12856),r=n(64910),o=n(23109);function a(t){var e,n,o,a,u,c=this;(t=t||{}).input||s.error("input is missing"),e=s.bind(this._onBlur,this),n=s.bind(this._onFocus,this),o=s.bind(this._onKeydown,this),a=s.bind(this._onInput,this),this.$hint=r.element(t.hint),this.$input=r.element(t.input).on("blur.aa",e).on("focus.aa",n).on("keydown.aa",o),0===this.$hint.length&&(this.setHint=this.getHint=this.clearHint=this.clearHintIfInvalid=s.noop),s.isMsie()?this.$input.on("keydown.aa keypress.aa cut.aa paste.aa",(function(t){i[t.which||t.keyCode]||s.defer(s.bind(c._onInput,c,t))})):this.$input.on("input.aa",a),this.query=this.$input.val(),this.$overflowHelper=(u=this.$input,r.element('').css({position:"absolute",visibility:"hidden",whiteSpace:"pre",fontFamily:u.css("font-family"),fontSize:u.css("font-size"),fontStyle:u.css("font-style"),fontVariant:u.css("font-variant"),fontWeight:u.css("font-weight"),wordSpacing:u.css("word-spacing"),letterSpacing:u.css("letter-spacing"),textIndent:u.css("text-indent"),textRendering:u.css("text-rendering"),textTransform:u.css("text-transform")}).insertAfter(u))}function u(t){return t.altKey||t.ctrlKey||t.metaKey||t.shiftKey}a.normalizeQuery=function(t){return(t||"").replace(/^\s*/g,"").replace(/\s{2,}/g," ")},s.mixin(a.prototype,o,{_onBlur:function(){this.resetInputValue(),this.$input.removeAttr("aria-activedescendant"),this.trigger("blurred")},_onFocus:function(){this.trigger("focused")},_onKeydown:function(t){var e=i[t.which||t.keyCode];this._managePreventDefault(e,t),e&&this._shouldTrigger(e,t)&&this.trigger(e+"Keyed",t)},_onInput:function(){this._checkInputValue()},_managePreventDefault:function(t,e){var n,i,s;switch(t){case"tab":i=this.getHint(),s=this.getInputValue(),n=i&&i!==s&&!u(e);break;case"up":case"down":n=!u(e);break;default:n=!1}n&&e.preventDefault()},_shouldTrigger:function(t,e){var n;if("tab"===t)n=!u(e);else n=!0;return n},_checkInputValue:function(){var t,e,n,i,s;t=this.getInputValue(),i=t,s=this.query,n=!(!(e=a.normalizeQuery(i)===a.normalizeQuery(s))||!this.query)&&this.query.length!==t.length,this.query=t,e?n&&this.trigger("whitespaceChanged",this.query):this.trigger("queryChanged",this.query)},focus:function(){this.$input.focus()},blur:function(){this.$input.blur()},getQuery:function(){return this.query},setQuery:function(t){this.query=t},getInputValue:function(){return this.$input.val()},setInputValue:function(t,e){void 0===t&&(t=this.query),this.$input.val(t),e?this.clearHint():this._checkInputValue()},expand:function(){this.$input.attr("aria-expanded","true")},collapse:function(){this.$input.attr("aria-expanded","false")},setActiveDescendant:function(t){this.$input.attr("aria-activedescendant",t)},removeActiveDescendant:function(){this.$input.removeAttr("aria-activedescendant")},resetInputValue:function(){this.setInputValue(this.query,!0)},getHint:function(){return this.$hint.val()},setHint:function(t){this.$hint.val(t)},clearHint:function(){this.setHint("")},clearHintIfInvalid:function(){var t,e,n;n=(t=this.getInputValue())!==(e=this.getHint())&&0===e.indexOf(t),""!==t&&n&&!this.hasOverflow()||this.clearHint()},getLanguageDirection:function(){return(this.$input.css("direction")||"ltr").toLowerCase()},hasOverflow:function(){var t=this.$input.width()-2;return this.$overflowHelper.text(this.getInputValue()),this.$overflowHelper.width()>=t},isCursorAtEnd:function(){var t,e,n;return t=this.$input.val().length,e=this.$input[0].selectionStart,s.isNumber(e)?e===t:!document.selection||((n=document.selection.createRange()).moveStart("character",-t),t===n.text.length)},destroy:function(){this.$hint.off(".aa"),this.$input.off(".aa"),this.$hint=this.$input=this.$overflowHelper=null}}),t.exports=a},6549:(t,e,n)=>{"use strict";var i="aaAttrs",s=n(12856),r=n(64910),o=n(60050),a=n(32534),u=n(83354),c=n(63561),l=n(1228);function h(t){var e,n;if((t=t||{}).input||s.error("missing input"),this.isActivated=!1,this.debug=!!t.debug,this.autoselect=!!t.autoselect,this.autoselectOnBlur=!!t.autoselectOnBlur,this.openOnFocus=!!t.openOnFocus,this.minLength=s.isNumber(t.minLength)?t.minLength:1,this.autoWidth=void 0===t.autoWidth||!!t.autoWidth,this.clearOnSelected=!!t.clearOnSelected,this.tabAutocomplete=void 0===t.tabAutocomplete||!!t.tabAutocomplete,t.hint=!!t.hint,t.hint&&t.appendTo)throw new Error("[autocomplete.js] hint and appendTo options can't be used at the same time");this.css=t.css=s.mixin({},l,t.appendTo?l.appendTo:{}),this.cssClasses=t.cssClasses=s.mixin({},l.defaultClasses,t.cssClasses||{}),this.cssClasses.prefix=t.cssClasses.formattedPrefix=s.formatPrefix(this.cssClasses.prefix,this.cssClasses.noPrefix),this.listboxId=t.listboxId=[this.cssClasses.root,"listbox",s.getUniqueId()].join("-");var a=function(t){var e,n,o,a;e=r.element(t.input),n=r.element(c.wrapper.replace("%ROOT%",t.cssClasses.root)).css(t.css.wrapper),t.appendTo||"block"!==e.css("display")||"table"!==e.parent().css("display")||n.css("display","table-cell");var u=c.dropdown.replace("%PREFIX%",t.cssClasses.prefix).replace("%DROPDOWN_MENU%",t.cssClasses.dropdownMenu);o=r.element(u).css(t.css.dropdown).attr({role:"listbox",id:t.listboxId}),t.templates&&t.templates.dropdownMenu&&o.html(s.templatify(t.templates.dropdownMenu)());a=e.clone().css(t.css.hint).css(function(t){return{backgroundAttachment:t.css("background-attachment"),backgroundClip:t.css("background-clip"),backgroundColor:t.css("background-color"),backgroundImage:t.css("background-image"),backgroundOrigin:t.css("background-origin"),backgroundPosition:t.css("background-position"),backgroundRepeat:t.css("background-repeat"),backgroundSize:t.css("background-size")}}(e)),a.val("").addClass(s.className(t.cssClasses.prefix,t.cssClasses.hint,!0)).removeAttr("id name placeholder required").prop("readonly",!0).attr({"aria-hidden":"true",autocomplete:"off",spellcheck:"false",tabindex:-1}),a.removeData&&a.removeData();e.data(i,{"aria-autocomplete":e.attr("aria-autocomplete"),"aria-expanded":e.attr("aria-expanded"),"aria-owns":e.attr("aria-owns"),autocomplete:e.attr("autocomplete"),dir:e.attr("dir"),role:e.attr("role"),spellcheck:e.attr("spellcheck"),style:e.attr("style"),type:e.attr("type")}),e.addClass(s.className(t.cssClasses.prefix,t.cssClasses.input,!0)).attr({autocomplete:"off",spellcheck:!1,role:"combobox","aria-autocomplete":t.datasets&&t.datasets[0]&&t.datasets[0].displayKey?"both":"list","aria-expanded":"false","aria-label":t.ariaLabel,"aria-owns":t.listboxId}).css(t.hint?t.css.input:t.css.inputWithNoHint);try{e.attr("dir")||e.attr("dir","auto")}catch(l){}return n=t.appendTo?n.appendTo(r.element(t.appendTo).eq(0)).eq(0):e.wrap(n).parent(),n.prepend(t.hint?a:null).append(o),{wrapper:n,input:e,hint:a,menu:o}}(t);this.$node=a.wrapper;var u=this.$input=a.input;e=a.menu,n=a.hint,t.dropdownMenuContainer&&r.element(t.dropdownMenuContainer).css("position","relative").append(e.css("top","0")),u.on("blur.aa",(function(t){var n=document.activeElement;s.isMsie()&&(e[0]===n||e[0].contains(n))&&(t.preventDefault(),t.stopImmediatePropagation(),s.defer((function(){u.focus()})))})),e.on("mousedown.aa",(function(t){t.preventDefault()})),this.eventBus=t.eventBus||new o({el:u}),this.dropdown=new h.Dropdown({appendTo:t.appendTo,wrapper:this.$node,menu:e,datasets:t.datasets,templates:t.templates,cssClasses:t.cssClasses,minLength:this.minLength}).onSync("suggestionClicked",this._onSuggestionClicked,this).onSync("cursorMoved",this._onCursorMoved,this).onSync("cursorRemoved",this._onCursorRemoved,this).onSync("opened",this._onOpened,this).onSync("closed",this._onClosed,this).onSync("shown",this._onShown,this).onSync("empty",this._onEmpty,this).onSync("redrawn",this._onRedrawn,this).onAsync("datasetRendered",this._onDatasetRendered,this),this.input=new h.Input({input:u,hint:n}).onSync("focused",this._onFocused,this).onSync("blurred",this._onBlurred,this).onSync("enterKeyed",this._onEnterKeyed,this).onSync("tabKeyed",this._onTabKeyed,this).onSync("escKeyed",this._onEscKeyed,this).onSync("upKeyed",this._onUpKeyed,this).onSync("downKeyed",this._onDownKeyed,this).onSync("leftKeyed",this._onLeftKeyed,this).onSync("rightKeyed",this._onRightKeyed,this).onSync("queryChanged",this._onQueryChanged,this).onSync("whitespaceChanged",this._onWhitespaceChanged,this),this._bindKeyboardShortcuts(t),this._setLanguageDirection()}s.mixin(h.prototype,{_bindKeyboardShortcuts:function(t){if(t.keyboardShortcuts){var e=this.$input,n=[];s.each(t.keyboardShortcuts,(function(t){"string"==typeof t&&(t=t.toUpperCase().charCodeAt(0)),n.push(t)})),r.element(document).keydown((function(t){var i=t.target||t.srcElement,s=i.tagName;if(!i.isContentEditable&&"INPUT"!==s&&"SELECT"!==s&&"TEXTAREA"!==s){var r=t.which||t.keyCode;-1!==n.indexOf(r)&&(e.focus(),t.stopPropagation(),t.preventDefault())}}))}},_onSuggestionClicked:function(t,e){var n;(n=this.dropdown.getDatumForSuggestion(e))&&this._select(n,{selectionMethod:"click"})},_onCursorMoved:function(t,e){var n=this.dropdown.getDatumForCursor(),i=this.dropdown.getCurrentCursor().attr("id");this.input.setActiveDescendant(i),n&&(e&&this.input.setInputValue(n.value,!0),this.eventBus.trigger("cursorchanged",n.raw,n.datasetName))},_onCursorRemoved:function(){this.input.resetInputValue(),this._updateHint(),this.eventBus.trigger("cursorremoved")},_onDatasetRendered:function(){this._updateHint(),this.eventBus.trigger("updated")},_onOpened:function(){this._updateHint(),this.input.expand(),this.eventBus.trigger("opened")},_onEmpty:function(){this.eventBus.trigger("empty")},_onRedrawn:function(){this.$node.css("top","0px"),this.$node.css("left","0px");var t=this.$input[0].getBoundingClientRect();this.autoWidth&&this.$node.css("width",t.width+"px");var e=this.$node[0].getBoundingClientRect(),n=t.bottom-e.top;this.$node.css("top",n+"px");var i=t.left-e.left;this.$node.css("left",i+"px"),this.eventBus.trigger("redrawn")},_onShown:function(){this.eventBus.trigger("shown"),this.autoselect&&this.dropdown.cursorTopSuggestion()},_onClosed:function(){this.input.clearHint(),this.input.removeActiveDescendant(),this.input.collapse(),this.eventBus.trigger("closed")},_onFocused:function(){if(this.isActivated=!0,this.openOnFocus){var t=this.input.getQuery();t.length>=this.minLength?this.dropdown.update(t):this.dropdown.empty(),this.dropdown.open()}},_onBlurred:function(){var t,e;t=this.dropdown.getDatumForCursor(),e=this.dropdown.getDatumForTopSuggestion();var n={selectionMethod:"blur"};this.debug||(this.autoselectOnBlur&&t?this._select(t,n):this.autoselectOnBlur&&e?this._select(e,n):(this.isActivated=!1,this.dropdown.empty(),this.dropdown.close()))},_onEnterKeyed:function(t,e){var n,i;n=this.dropdown.getDatumForCursor(),i=this.dropdown.getDatumForTopSuggestion();var s={selectionMethod:"enterKey"};n?(this._select(n,s),e.preventDefault()):this.autoselect&&i&&(this._select(i,s),e.preventDefault())},_onTabKeyed:function(t,e){if(this.tabAutocomplete){var n;(n=this.dropdown.getDatumForCursor())?(this._select(n,{selectionMethod:"tabKey"}),e.preventDefault()):this._autocomplete(!0)}else this.dropdown.close()},_onEscKeyed:function(){this.dropdown.close(),this.input.resetInputValue()},_onUpKeyed:function(){var t=this.input.getQuery();this.dropdown.isEmpty&&t.length>=this.minLength?this.dropdown.update(t):this.dropdown.moveCursorUp(),this.dropdown.open()},_onDownKeyed:function(){var t=this.input.getQuery();this.dropdown.isEmpty&&t.length>=this.minLength?this.dropdown.update(t):this.dropdown.moveCursorDown(),this.dropdown.open()},_onLeftKeyed:function(){"rtl"===this.dir&&this._autocomplete()},_onRightKeyed:function(){"ltr"===this.dir&&this._autocomplete()},_onQueryChanged:function(t,e){this.input.clearHintIfInvalid(),e.length>=this.minLength?this.dropdown.update(e):this.dropdown.empty(),this.dropdown.open(),this._setLanguageDirection()},_onWhitespaceChanged:function(){this._updateHint(),this.dropdown.open()},_setLanguageDirection:function(){var t=this.input.getLanguageDirection();this.dir!==t&&(this.dir=t,this.$node.css("direction",t),this.dropdown.setLanguageDirection(t))},_updateHint:function(){var t,e,n,i,r;(t=this.dropdown.getDatumForTopSuggestion())&&this.dropdown.isVisible()&&!this.input.hasOverflow()?(e=this.input.getInputValue(),n=a.normalizeQuery(e),i=s.escapeRegExChars(n),(r=new RegExp("^(?:"+i+")(.+$)","i").exec(t.value))?this.input.setHint(e+r[1]):this.input.clearHint()):this.input.clearHint()},_autocomplete:function(t){var e,n,i,s;e=this.input.getHint(),n=this.input.getQuery(),i=t||this.input.isCursorAtEnd(),e&&n!==e&&i&&((s=this.dropdown.getDatumForTopSuggestion())&&this.input.setInputValue(s.value),this.eventBus.trigger("autocompleted",s.raw,s.datasetName))},_select:function(t,e){void 0!==t.value&&this.input.setQuery(t.value),this.clearOnSelected?this.setVal(""):this.input.setInputValue(t.value,!0),this._setLanguageDirection(),!1===this.eventBus.trigger("selected",t.raw,t.datasetName,e).isDefaultPrevented()&&(this.dropdown.close(),s.defer(s.bind(this.dropdown.empty,this.dropdown)))},open:function(){if(!this.isActivated){var t=this.input.getInputValue();t.length>=this.minLength?this.dropdown.update(t):this.dropdown.empty()}this.dropdown.open()},close:function(){this.dropdown.close()},setVal:function(t){t=s.toStr(t),this.isActivated?this.input.setInputValue(t):(this.input.setQuery(t),this.input.setInputValue(t,!0)),this._setLanguageDirection()},getVal:function(){return this.input.getQuery()},destroy:function(){this.input.destroy(),this.dropdown.destroy(),function(t,e){var n=t.find(s.className(e.prefix,e.input));s.each(n.data(i),(function(t,e){void 0===t?n.removeAttr(e):n.attr(e,t)})),n.detach().removeClass(s.className(e.prefix,e.input,!0)).insertAfter(t),n.removeData&&n.removeData(i);t.remove()}(this.$node,this.cssClasses),this.$node=null},getWrapper:function(){return this.dropdown.$container[0]}}),h.Dropdown=u,h.Input=a,h.sources=n(28840),t.exports=h},64910:t=>{"use strict";t.exports={element:null}},96177:t=>{"use strict";t.exports=function(t){var e=t.match(/Algolia for JavaScript \((\d+\.)(\d+\.)(\d+)\)/)||t.match(/Algolia for vanilla JavaScript (\d+\.)(\d+\.)(\d+)/);if(e)return[e[1],e[2],e[3]]}},12856:(t,e,n)=>{"use strict";var i,s=n(58820),r=n(64910);function o(t){return t.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}t.exports={isArray:null,isFunction:null,isObject:null,bind:null,each:null,map:null,mixin:null,isMsie:function(t){if(void 0===t&&(t=navigator.userAgent),/(msie|trident)/i.test(t)){var e=t.match(/(msie |rv:)(\d+(.\d+)?)/i);if(e)return e[2]}return!1},escapeRegExChars:function(t){return t.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},isNumber:function(t){return"number"==typeof t},toStr:function(t){return null==t?"":t+""},cloneDeep:function(t){var e=this.mixin({},t),n=this;return this.each(e,(function(t,i){t&&(n.isArray(t)?e[i]=[].concat(t):n.isObject(t)&&(e[i]=n.cloneDeep(t)))})),e},error:function(t){throw new Error(t)},every:function(t,e){var n=!0;return t?(this.each(t,(function(i,s){n&&(n=e.call(null,i,s,t)&&n)})),!!n):n},any:function(t,e){var n=!1;return t?(this.each(t,(function(i,s){if(e.call(null,i,s,t))return n=!0,!1})),n):n},getUniqueId:(i=0,function(){return i++}),templatify:function(t){if(this.isFunction(t))return t;var e=r.element(t);return"SCRIPT"===e.prop("tagName")?function(){return e.text()}:function(){return String(t)}},defer:function(t){setTimeout(t,0)},noop:function(){},formatPrefix:function(t,e){return e?"":t+"-"},className:function(t,e,n){return n?t+e:"."+s(t+e,{isIdentifier:!0})},escapeHighlightedString:function(t,e,n){e=e||"";var i=document.createElement("div");i.appendChild(document.createTextNode(e)),n=n||"";var s=document.createElement("div");s.appendChild(document.createTextNode(n));var r=document.createElement("div");return r.appendChild(document.createTextNode(t)),r.innerHTML.replace(RegExp(o(i.innerHTML),"g"),e).replace(RegExp(o(s.innerHTML),"g"),n)}}},69983:(t,e,n)=>{"use strict";var i=n(12856),s=n(533),r=n(96177);var o,a,u=(o=[],a=window.Promise.resolve(),function(t,e){return function(n,s){(function(t,e){return window.Promise.resolve().then((function(){return o.length&&(a=t.search(o),o=[]),a})).then((function(t){if(t)return t.results[e]}))})(t.as,o.push({indexName:t.indexName,query:n,params:e})-1).then((function(t){t&&s(t.hits,t)})).catch((function(t){i.error(t.message)}))}});t.exports=function(t,e){var n=r(t.as._ua);if(n&&n[0]>=3&&n[1]>20){var i="autocomplete.js "+s;-1===t.as._ua.indexOf(i)&&(t.as._ua+="; "+i)}return u(t,e)}},28840:(t,e,n)=>{"use strict";t.exports={hits:n(69983),popularIn:n(64445)}},64445:(t,e,n)=>{"use strict";var i=n(12856),s=n(533),r=n(96177);t.exports=function(t,e,n,o){var a=r(t.as._ua);if(a&&a[0]>=3&&a[1]>20&&((e=e||{}).additionalUA="autocomplete.js "+s),!n.source)return i.error("Missing 'source' key");var u=i.isFunction(n.source)?n.source:function(t){return t[n.source]};if(!n.index)return i.error("Missing 'index' key");var c=n.index;return o=o||{},function(a,l){t.search(a,e,(function(t,a){if(t)i.error(t.message);else{if(a.hits.length>0){var h=a.hits[0],p=i.mixin({hitsPerPage:0},n);delete p.source,delete p.index;var f=r(c.as._ua);return f&&f[0]>=3&&f[1]>20&&(e.additionalUA="autocomplete.js "+s),void c.search(u(h),p,(function(t,e){if(t)i.error(t.message);else{var n=[];if(o.includeAll){var s=o.allTitle||"All departments";n.push(i.mixin({facet:{value:s,count:e.nbHits}},i.cloneDeep(h)))}i.each(e.facets,(function(t,e){i.each(t,(function(t,s){n.push(i.mixin({facet:{facet:e,value:s,count:t}},i.cloneDeep(h)))}))}));for(var r=1;r{"use strict";var i=n(6990);n(64910).element=i;var s=n(12856);s.isArray=i.isArray,s.isFunction=i.isFunction,s.isObject=i.isPlainObject,s.bind=i.proxy,s.each=function(t,e){i.each(t,(function(t,n){return e(n,t)}))},s.map=i.map,s.mixin=i.extend,s.Event=i.Event;var r="aaAutocomplete",o=n(6549),a=n(60050);function u(t,e,n,u){n=s.isArray(n)?n:[].slice.call(arguments,2);var c=i(t).each((function(t,s){var c=i(s),l=new a({el:c}),h=u||new o({input:c,eventBus:l,dropdownMenuContainer:e.dropdownMenuContainer,hint:void 0===e.hint||!!e.hint,minLength:e.minLength,autoselect:e.autoselect,autoselectOnBlur:e.autoselectOnBlur,tabAutocomplete:e.tabAutocomplete,openOnFocus:e.openOnFocus,templates:e.templates,debug:e.debug,clearOnSelected:e.clearOnSelected,cssClasses:e.cssClasses,datasets:n,keyboardShortcuts:e.keyboardShortcuts,appendTo:e.appendTo,autoWidth:e.autoWidth,ariaLabel:e.ariaLabel||s.getAttribute("aria-label")});c.data(r,h)}));return c.autocomplete={},s.each(["open","close","getVal","setVal","destroy","getWrapper"],(function(t){c.autocomplete[t]=function(){var e,n=arguments;return c.each((function(s,o){var a=i(o).data(r);e=a[t].apply(a,n)})),e}})),c}u.sources=o.sources,u.escapeHighlightedString=s.escapeHighlightedString;var c="autocomplete"in window,l=window.autocomplete;u.noConflict=function(){return c?window.autocomplete=l:delete window.autocomplete,u},t.exports=u},533:t=>{t.exports="0.38.1"},6990:t=>{var e;e=window,t.exports=function(t){var e,n,i=function(){var e,n,i,s,r,o,a=[],u=a.concat,c=a.filter,l=a.slice,h=t.document,p={},f={},d={"column-count":1,columns:1,"font-weight":1,"line-height":1,opacity:1,"z-index":1,zoom:1},g=/^\s*<(\w+|!)[^>]*>/,m=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,y=/^(?:body|html)$/i,w=/([A-Z])/g,b=["val","css","html","text","data","width","height","offset"],C=["after","prepend","before","append"],x=h.createElement("table"),_=h.createElement("tr"),S={tr:h.createElement("tbody"),tbody:x,thead:x,tfoot:x,td:_,th:_,"*":h.createElement("div")},E=/complete|loaded|interactive/,A=/^[\w-]*$/,$={},T=$.toString,O={},D=h.createElement("div"),N={tabindex:"tabIndex",readonly:"readOnly",for:"htmlFor",class:"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},k=Array.isArray||function(t){return t instanceof Array};function I(t){return null==t?String(t):$[T.call(t)]||"object"}function P(t){return"function"==I(t)}function L(t){return null!=t&&t==t.window}function M(t){return null!=t&&t.nodeType==t.DOCUMENT_NODE}function F(t){return"object"==I(t)}function R(t){return F(t)&&!L(t)&&Object.getPrototypeOf(t)==Object.prototype}function q(t){var e=!!t&&"length"in t&&t.length,n=i.type(t);return"function"!=n&&!L(t)&&("array"==n||0===e||"number"==typeof e&&e>0&&e-1 in t)}function V(t){return c.call(t,(function(t){return null!=t}))}function H(t){return t.length>0?i.fn.concat.apply([],t):t}function B(t){return t.replace(/::/g,"/").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/_/g,"-").toLowerCase()}function K(t){return t in f?f[t]:f[t]=new RegExp("(^|\\s)"+t+"(\\s|$)")}function j(t,e){return"number"!=typeof e||d[B(t)]?e:e+"px"}function z(t){var e,n;return p[t]||(e=h.createElement(t),h.body.appendChild(e),n=getComputedStyle(e,"").getPropertyValue("display"),e.parentNode.removeChild(e),"none"==n&&(n="block"),p[t]=n),p[t]}function U(t){return"children"in t?l.call(t.children):i.map(t.childNodes,(function(t){if(1==t.nodeType)return t}))}function Q(t,e){var n,i=t?t.length:0;for(n=0;n")),n===e&&(n=g.test(t)&&RegExp.$1),n in S||(n="*"),(a=S[n]).innerHTML=""+t,r=i.each(l.call(a.childNodes),(function(){a.removeChild(this)}))),R(s)&&(o=i(r),i.each(s,(function(t,e){b.indexOf(t)>-1?o[t](e):o.attr(t,e)}))),r},O.Z=function(t,e){return new Q(t,e)},O.isZ=function(t){return t instanceof O.Z},O.init=function(t,n){var s;if(!t)return O.Z();if("string"==typeof t)if("<"==(t=t.trim())[0]&&g.test(t))s=O.fragment(t,RegExp.$1,n),t=null;else{if(n!==e)return i(n).find(t);s=O.qsa(h,t)}else{if(P(t))return i(h).ready(t);if(O.isZ(t))return t;if(k(t))s=V(t);else if(F(t))s=[t],t=null;else if(g.test(t))s=O.fragment(t.trim(),RegExp.$1,n),t=null;else{if(n!==e)return i(n).find(t);s=O.qsa(h,t)}}return O.Z(s,t)},(i=function(t,e){return O.init(t,e)}).extend=function(t){var e,n=l.call(arguments,1);return"boolean"==typeof t&&(e=t,t=n.shift()),n.forEach((function(n){W(t,n,e)})),t},O.qsa=function(t,e){var n,i="#"==e[0],s=!i&&"."==e[0],r=i||s?e.slice(1):e,o=A.test(r);return t.getElementById&&o&&i?(n=t.getElementById(r))?[n]:[]:1!==t.nodeType&&9!==t.nodeType&&11!==t.nodeType?[]:l.call(o&&!i&&t.getElementsByClassName?s?t.getElementsByClassName(r):t.getElementsByTagName(e):t.querySelectorAll(e))},i.contains=h.documentElement.contains?function(t,e){return t!==e&&t.contains(e)}:function(t,e){for(;e&&(e=e.parentNode);)if(e===t)return!0;return!1},i.type=I,i.isFunction=P,i.isWindow=L,i.isArray=k,i.isPlainObject=R,i.isEmptyObject=function(t){var e;for(e in t)return!1;return!0},i.isNumeric=function(t){var e=Number(t),n=typeof t;return null!=t&&"boolean"!=n&&("string"!=n||t.length)&&!isNaN(e)&&isFinite(e)||!1},i.inArray=function(t,e,n){return a.indexOf.call(e,t,n)},i.camelCase=r,i.trim=function(t){return null==t?"":String.prototype.trim.call(t)},i.uuid=0,i.support={},i.expr={},i.noop=function(){},i.map=function(t,e){var n,i,s,r=[];if(q(t))for(i=0;i=0?t:t+this.length]},toArray:function(){return this.get()},size:function(){return this.length},remove:function(){return this.each((function(){null!=this.parentNode&&this.parentNode.removeChild(this)}))},each:function(t){return a.every.call(this,(function(e,n){return!1!==t.call(e,n,e)})),this},filter:function(t){return P(t)?this.not(this.not(t)):i(c.call(this,(function(e){return O.matches(e,t)})))},add:function(t,e){return i(o(this.concat(i(t,e))))},is:function(t){return this.length>0&&O.matches(this[0],t)},not:function(t){var n=[];if(P(t)&&t.call!==e)this.each((function(e){t.call(this,e)||n.push(this)}));else{var s="string"==typeof t?this.filter(t):q(t)&&P(t.item)?l.call(t):i(t);this.forEach((function(t){s.indexOf(t)<0&&n.push(t)}))}return i(n)},has:function(t){return this.filter((function(){return F(t)?i.contains(this,t):i(this).find(t).size()}))},eq:function(t){return-1===t?this.slice(t):this.slice(t,+t+1)},first:function(){var t=this[0];return t&&!F(t)?t:i(t)},last:function(){var t=this[this.length-1];return t&&!F(t)?t:i(t)},find:function(t){var e=this;return t?"object"==typeof t?i(t).filter((function(){var t=this;return a.some.call(e,(function(e){return i.contains(e,t)}))})):1==this.length?i(O.qsa(this[0],t)):this.map((function(){return O.qsa(this,t)})):i()},closest:function(t,e){var n=[],s="object"==typeof t&&i(t);return this.each((function(i,r){for(;r&&!(s?s.indexOf(r)>=0:O.matches(r,t));)r=r!==e&&!M(r)&&r.parentNode;r&&n.indexOf(r)<0&&n.push(r)})),i(n)},parents:function(t){for(var e=[],n=this;n.length>0;)n=i.map(n,(function(t){if((t=t.parentNode)&&!M(t)&&e.indexOf(t)<0)return e.push(t),t}));return Z(e,t)},parent:function(t){return Z(o(this.pluck("parentNode")),t)},children:function(t){return Z(this.map((function(){return U(this)})),t)},contents:function(){return this.map((function(){return this.contentDocument||l.call(this.childNodes)}))},siblings:function(t){return Z(this.map((function(t,e){return c.call(U(e.parentNode),(function(t){return t!==e}))})),t)},empty:function(){return this.each((function(){this.innerHTML=""}))},pluck:function(t){return i.map(this,(function(e){return e[t]}))},show:function(){return this.each((function(){"none"==this.style.display&&(this.style.display=""),"none"==getComputedStyle(this,"").getPropertyValue("display")&&(this.style.display=z(this.nodeName))}))},replaceWith:function(t){return this.before(t).remove()},wrap:function(t){var e=P(t);if(this[0]&&!e)var n=i(t).get(0),s=n.parentNode||this.length>1;return this.each((function(r){i(this).wrapAll(e?t.call(this,r):s?n.cloneNode(!0):n)}))},wrapAll:function(t){if(this[0]){var e;for(i(this[0]).before(t=i(t));(e=t.children()).length;)t=e.first();i(t).append(this)}return this},wrapInner:function(t){var e=P(t);return this.each((function(n){var s=i(this),r=s.contents(),o=e?t.call(this,n):t;r.length?r.wrapAll(o):s.append(o)}))},unwrap:function(){return this.parent().each((function(){i(this).replaceWith(i(this).children())})),this},clone:function(){return this.map((function(){return this.cloneNode(!0)}))},hide:function(){return this.css("display","none")},toggle:function(t){return this.each((function(){var n=i(this);(t===e?"none"==n.css("display"):t)?n.show():n.hide()}))},prev:function(t){return i(this.pluck("previousElementSibling")).filter(t||"*")},next:function(t){return i(this.pluck("nextElementSibling")).filter(t||"*")},html:function(t){return 0 in arguments?this.each((function(e){var n=this.innerHTML;i(this).empty().append(X(this,t,e,n))})):0 in this?this[0].innerHTML:null},text:function(t){return 0 in arguments?this.each((function(e){var n=X(this,t,e,this.textContent);this.textContent=null==n?"":""+n})):0 in this?this.pluck("textContent").join(""):null},attr:function(t,i){var s;return"string"!=typeof t||1 in arguments?this.each((function(e){if(1===this.nodeType)if(F(t))for(n in t)G(this,n,t[n]);else G(this,t,X(this,i,e,this.getAttribute(t)))})):0 in this&&1==this[0].nodeType&&null!=(s=this[0].getAttribute(t))?s:e},removeAttr:function(t){return this.each((function(){1===this.nodeType&&t.split(" ").forEach((function(t){G(this,t)}),this)}))},prop:function(t,e){return t=N[t]||t,1 in arguments?this.each((function(n){this[t]=X(this,e,n,this[t])})):this[0]&&this[0][t]},removeProp:function(t){return t=N[t]||t,this.each((function(){delete this[t]}))},data:function(t,n){var i="data-"+t.replace(w,"-$1").toLowerCase(),s=1 in arguments?this.attr(i,n):this.attr(i);return null!==s?Y(s):e},val:function(t){return 0 in arguments?(null==t&&(t=""),this.each((function(e){this.value=X(this,t,e,this.value)}))):this[0]&&(this[0].multiple?i(this[0]).find("option").filter((function(){return this.selected})).pluck("value"):this[0].value)},offset:function(e){if(e)return this.each((function(t){var n=i(this),s=X(this,e,t,n.offset()),r=n.offsetParent().offset(),o={top:s.top-r.top,left:s.left-r.left};"static"==n.css("position")&&(o.position="relative"),n.css(o)}));if(!this.length)return null;if(h.documentElement!==this[0]&&!i.contains(h.documentElement,this[0]))return{top:0,left:0};var n=this[0].getBoundingClientRect();return{left:n.left+t.pageXOffset,top:n.top+t.pageYOffset,width:Math.round(n.width),height:Math.round(n.height)}},css:function(t,e){if(arguments.length<2){var s=this[0];if("string"==typeof t){if(!s)return;return s.style[r(t)]||getComputedStyle(s,"").getPropertyValue(t)}if(k(t)){if(!s)return;var o={},a=getComputedStyle(s,"");return i.each(t,(function(t,e){o[e]=s.style[r(e)]||a.getPropertyValue(e)})),o}}var u="";if("string"==I(t))e||0===e?u=B(t)+":"+j(t,e):this.each((function(){this.style.removeProperty(B(t))}));else for(n in t)t[n]||0===t[n]?u+=B(n)+":"+j(n,t[n])+";":this.each((function(){this.style.removeProperty(B(n))}));return this.each((function(){this.style.cssText+=";"+u}))},index:function(t){return t?this.indexOf(i(t)[0]):this.parent().children().indexOf(this[0])},hasClass:function(t){return!!t&&a.some.call(this,(function(t){return this.test(J(t))}),K(t))},addClass:function(t){return t?this.each((function(e){if("className"in this){s=[];var n=J(this);X(this,t,e,n).split(/\s+/g).forEach((function(t){i(this).hasClass(t)||s.push(t)}),this),s.length&&J(this,n+(n?" ":"")+s.join(" "))}})):this},removeClass:function(t){return this.each((function(n){if("className"in this){if(t===e)return J(this,"");s=J(this),X(this,t,n,s).split(/\s+/g).forEach((function(t){s=s.replace(K(t)," ")})),J(this,s.trim())}}))},toggleClass:function(t,n){return t?this.each((function(s){var r=i(this);X(this,t,s,J(this)).split(/\s+/g).forEach((function(t){(n===e?!r.hasClass(t):n)?r.addClass(t):r.removeClass(t)}))})):this},scrollTop:function(t){if(this.length){var n="scrollTop"in this[0];return t===e?n?this[0].scrollTop:this[0].pageYOffset:this.each(n?function(){this.scrollTop=t}:function(){this.scrollTo(this.scrollX,t)})}},scrollLeft:function(t){if(this.length){var n="scrollLeft"in this[0];return t===e?n?this[0].scrollLeft:this[0].pageXOffset:this.each(n?function(){this.scrollLeft=t}:function(){this.scrollTo(t,this.scrollY)})}},position:function(){if(this.length){var t=this[0],e=this.offsetParent(),n=this.offset(),s=y.test(e[0].nodeName)?{top:0,left:0}:e.offset();return n.top-=parseFloat(i(t).css("margin-top"))||0,n.left-=parseFloat(i(t).css("margin-left"))||0,s.top+=parseFloat(i(e[0]).css("border-top-width"))||0,s.left+=parseFloat(i(e[0]).css("border-left-width"))||0,{top:n.top-s.top,left:n.left-s.left}}},offsetParent:function(){return this.map((function(){for(var t=this.offsetParent||h.body;t&&!y.test(t.nodeName)&&"static"==i(t).css("position");)t=t.offsetParent;return t}))}},i.fn.detach=i.fn.remove,["width","height"].forEach((function(t){var n=t.replace(/./,(function(t){return t[0].toUpperCase()}));i.fn[t]=function(s){var r,o=this[0];return s===e?L(o)?o["inner"+n]:M(o)?o.documentElement["scroll"+n]:(r=this.offset())&&r[t]:this.each((function(e){(o=i(this)).css(t,X(this,s,e,o[t]()))}))}})),C.forEach((function(n,s){var r=s%2;i.fn[n]=function(){var n,o,a=i.map(arguments,(function(t){var s=[];return"array"==(n=I(t))?(t.forEach((function(t){return t.nodeType!==e?s.push(t):i.zepto.isZ(t)?s=s.concat(t.get()):void(s=s.concat(O.fragment(t)))})),s):"object"==n||null==t?t:O.fragment(t)})),u=this.length>1;return a.length<1?this:this.each((function(e,n){o=r?n:n.parentNode,n=0==s?n.nextSibling:1==s?n.firstChild:2==s?n:null;var c=i.contains(h.documentElement,o);a.forEach((function(e){if(u)e=e.cloneNode(!0);else if(!o)return i(e).remove();o.insertBefore(e,n),c&&tt(e,(function(e){if(!(null==e.nodeName||"SCRIPT"!==e.nodeName.toUpperCase()||e.type&&"text/javascript"!==e.type||e.src)){var n=e.ownerDocument?e.ownerDocument.defaultView:t;n.eval.call(n,e.innerHTML)}}))}))}))},i.fn[r?n+"To":"insert"+(s?"Before":"After")]=function(t){return i(t)[n](this),this}})),O.Z.prototype=Q.prototype=i.fn,O.uniq=o,O.deserializeValue=Y,i.zepto=O,i}();return function(e){var n,i=1,s=Array.prototype.slice,r=e.isFunction,o=function(t){return"string"==typeof t},a={},u={},c="onfocusin"in t,l={focus:"focusin",blur:"focusout"},h={mouseenter:"mouseover",mouseleave:"mouseout"};function p(t){return t._zid||(t._zid=i++)}function f(t,e,n,i){if((e=d(e)).ns)var s=g(e.ns);return(a[p(t)]||[]).filter((function(t){return t&&(!e.e||t.e==e.e)&&(!e.ns||s.test(t.ns))&&(!n||p(t.fn)===p(n))&&(!i||t.sel==i)}))}function d(t){var e=(""+t).split(".");return{e:e[0],ns:e.slice(1).sort().join(" ")}}function g(t){return new RegExp("(?:^| )"+t.replace(" "," .* ?")+"(?: |$)")}function m(t,e){return t.del&&!c&&t.e in l||!!e}function v(t){return h[t]||c&&l[t]||t}function y(t,i,s,r,o,u,c){var l=p(t),f=a[l]||(a[l]=[]);i.split(/\s/).forEach((function(i){if("ready"==i)return e(document).ready(s);var a=d(i);a.fn=s,a.sel=o,a.e in h&&(s=function(t){var n=t.relatedTarget;if(!n||n!==this&&!e.contains(this,n))return a.fn.apply(this,arguments)}),a.del=u;var l=u||s;a.proxy=function(e){if(!(e=S(e)).isImmediatePropagationStopped()){try{var i=Object.getOwnPropertyDescriptor(e,"data");i&&!i.writable||(e.data=r)}catch(e){}var s=l.apply(t,e._args==n?[e]:[e].concat(e._args));return!1===s&&(e.preventDefault(),e.stopPropagation()),s}},a.i=f.length,f.push(a),"addEventListener"in t&&t.addEventListener(v(a.e),a.proxy,m(a,c))}))}function w(t,e,n,i,s){var r=p(t);(e||"").split(/\s/).forEach((function(e){f(t,e,n,i).forEach((function(e){delete a[r][e.i],"removeEventListener"in t&&t.removeEventListener(v(e.e),e.proxy,m(e,s))}))}))}u.click=u.mousedown=u.mouseup=u.mousemove="MouseEvents",e.event={add:y,remove:w},e.proxy=function(t,n){var i=2 in arguments&&s.call(arguments,2);if(r(t)){var a=function(){return t.apply(n,i?i.concat(s.call(arguments)):arguments)};return a._zid=p(t),a}if(o(n))return i?(i.unshift(t[n],t),e.proxy.apply(null,i)):e.proxy(t[n],t);throw new TypeError("expected function")},e.fn.bind=function(t,e,n){return this.on(t,e,n)},e.fn.unbind=function(t,e){return this.off(t,e)},e.fn.one=function(t,e,n,i){return this.on(t,e,n,i,1)};var b=function(){return!0},C=function(){return!1},x=/^([A-Z]|returnValue$|layer[XY]$|webkitMovement[XY]$)/,_={preventDefault:"isDefaultPrevented",stopImmediatePropagation:"isImmediatePropagationStopped",stopPropagation:"isPropagationStopped"};function S(t,i){if(i||!t.isDefaultPrevented){i||(i=t),e.each(_,(function(e,n){var s=i[e];t[e]=function(){return this[n]=b,s&&s.apply(i,arguments)},t[n]=C}));try{t.timeStamp||(t.timeStamp=Date.now())}catch(s){}(i.defaultPrevented!==n?i.defaultPrevented:"returnValue"in i?!1===i.returnValue:i.getPreventDefault&&i.getPreventDefault())&&(t.isDefaultPrevented=b)}return t}function E(t){var e,i={originalEvent:t};for(e in t)x.test(e)||t[e]===n||(i[e]=t[e]);return S(i,t)}e.fn.delegate=function(t,e,n){return this.on(e,t,n)},e.fn.undelegate=function(t,e,n){return this.off(e,t,n)},e.fn.live=function(t,n){return e(document.body).delegate(this.selector,t,n),this},e.fn.die=function(t,n){return e(document.body).undelegate(this.selector,t,n),this},e.fn.on=function(t,i,a,u,c){var l,h,p=this;return t&&!o(t)?(e.each(t,(function(t,e){p.on(t,i,a,e,c)})),p):(o(i)||r(u)||!1===u||(u=a,a=i,i=n),u!==n&&!1!==a||(u=a,a=n),!1===u&&(u=C),p.each((function(n,r){c&&(l=function(t){return w(r,t.type,u),u.apply(this,arguments)}),i&&(h=function(t){var n,o=e(t.target).closest(i,r).get(0);if(o&&o!==r)return n=e.extend(E(t),{currentTarget:o,liveFired:r}),(l||u).apply(o,[n].concat(s.call(arguments,1)))}),y(r,t,u,a,i,h||l)})))},e.fn.off=function(t,i,s){var a=this;return t&&!o(t)?(e.each(t,(function(t,e){a.off(t,i,e)})),a):(o(i)||r(s)||!1===s||(s=i,i=n),!1===s&&(s=C),a.each((function(){w(this,t,s,i)})))},e.fn.trigger=function(t,n){return(t=o(t)||e.isPlainObject(t)?e.Event(t):S(t))._args=n,this.each((function(){t.type in l&&"function"==typeof this[t.type]?this[t.type]():"dispatchEvent"in this?this.dispatchEvent(t):e(this).triggerHandler(t,n)}))},e.fn.triggerHandler=function(t,n){var i,s;return this.each((function(r,a){(i=E(o(t)?e.Event(t):t))._args=n,i.target=a,e.each(f(a,t.type||t),(function(t,e){if(s=e.proxy(i),i.isImmediatePropagationStopped())return!1}))})),s},"focusin focusout focus blur load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select keydown keypress keyup error".split(" ").forEach((function(t){e.fn[t]=function(e){return 0 in arguments?this.bind(t,e):this.trigger(t)}})),e.Event=function(t,e){o(t)||(t=(e=t).type);var n=document.createEvent(u[t]||"Events"),i=!0;if(e)for(var s in e)"bubbles"==s?i=!!e[s]:n[s]=e[s];return n.initEvent(t,i,!0),S(n)}}(i),n=[],i.fn.remove=function(){return this.each((function(){this.parentNode&&("IMG"===this.tagName&&(n.push(this),this.src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=",e&&clearTimeout(e),e=setTimeout((function(){n=[]}),6e4)),this.parentNode.removeChild(this))}))},function(t){var e={},n=t.fn.data,i=t.camelCase,s=t.expando="Zepto"+ +new Date,r=[];function o(r,o){var u=r[s],c=u&&e[u];if(void 0===o)return c||a(r);if(c){if(o in c)return c[o];var l=i(o);if(l in c)return c[l]}return n.call(t(r),o)}function a(n,r,o){var a=n[s]||(n[s]=++t.uuid),c=e[a]||(e[a]=u(n));return void 0!==r&&(c[i(r)]=o),c}function u(e){var n={};return t.each(e.attributes||r,(function(e,s){0==s.name.indexOf("data-")&&(n[i(s.name.replace("data-",""))]=t.zepto.deserializeValue(s.value))})),n}t.fn.data=function(e,n){return void 0===n?t.isPlainObject(e)?this.each((function(n,i){t.each(e,(function(t,e){a(i,t,e)}))})):0 in this?o(this[0],e):void 0:this.each((function(){a(this,e,n)}))},t.data=function(e,n,i){return t(e).data(n,i)},t.hasData=function(n){var i=n[s],r=i&&e[i];return!!r&&!t.isEmptyObject(r)},t.fn.removeData=function(n){return"string"==typeof n&&(n=n.split(/\s+/)),this.each((function(){var r=this[s],o=r&&e[r];o&&t.each(n||o,(function(t){delete o[n?i(this):t]}))}))},["remove","empty"].forEach((function(e){var n=t.fn[e];t.fn[e]=function(){var t=this.find("*");return"remove"===e&&(t=t.add(this)),t.removeData(),n.call(this)}}))}(i),i}(e)},58820:t=>{"use strict";var e={}.hasOwnProperty,n=/[ -,\.\/:-@\[-\^`\{-~]/,i=/[ -,\.\/:-@\[\]\^`\{-~]/,s=/(^|\\+)?(\\[A-F0-9]{1,6})\x20(?![a-fA-F0-9\x20])/g,r=function t(r,o){"single"!=(o=function(t,n){if(!t)return n;var i={};for(var s in n)i[s]=e.call(t,s)?t[s]:n[s];return i}(o,t.options)).quotes&&"double"!=o.quotes&&(o.quotes="single");for(var a="double"==o.quotes?'"':"'",u=o.isIdentifier,c=r.charAt(0),l="",h=0,p=r.length;h126){if(d>=55296&&d<=56319&&h{"use strict";var i,s,r,o=[n(15525),n(64785),n(28291),n(2709),n(42506),n(79176)],a=-1,u=[],c=!1;function l(){i&&s&&(i=!1,s.length?u=s.concat(u):a=-1,u.length&&h())}function h(){if(!i){c=!1,i=!0;for(var t=u.length,e=setTimeout(l);t;){for(s=u,u=[];s&&++a1)for(var n=1;n{"use strict";e.test=function(){return!n.g.setImmediate&&void 0!==n.g.MessageChannel},e.install=function(t){var e=new n.g.MessageChannel;return e.port1.onmessage=t,function(){e.port2.postMessage(0)}}},28291:(t,e,n)=>{"use strict";var i=n.g.MutationObserver||n.g.WebKitMutationObserver;e.test=function(){return i},e.install=function(t){var e=0,s=new i(t),r=n.g.document.createTextNode("");return s.observe(r,{characterData:!0}),function(){r.data=e=++e%2}}},64785:(t,e,n)=>{"use strict";e.test=function(){return"function"==typeof n.g.queueMicrotask},e.install=function(t){return function(){n.g.queueMicrotask(t)}}},42506:(t,e,n)=>{"use strict";e.test=function(){return"document"in n.g&&"onreadystatechange"in n.g.document.createElement("script")},e.install=function(t){return function(){var e=n.g.document.createElement("script");return e.onreadystatechange=function(){t(),e.onreadystatechange=null,e.parentNode.removeChild(e),e=null},n.g.document.documentElement.appendChild(e),t}}},79176:(t,e)=>{"use strict";e.test=function(){return!0},e.install=function(t){return function(){setTimeout(t,0)}}}}]); \ No newline at end of file diff --git a/assets/js/8443.eb0070b3.js.LICENSE.txt b/assets/js/8443.eb0070b3.js.LICENSE.txt new file mode 100644 index 0000000000..4f7ccd8a76 --- /dev/null +++ b/assets/js/8443.eb0070b3.js.LICENSE.txt @@ -0,0 +1 @@ +/*! https://mths.be/cssesc v3.0.0 by @mathias */ diff --git a/assets/js/86ee3414.80d0289f.js b/assets/js/86ee3414.80d0289f.js new file mode 100644 index 0000000000..41971a1df0 --- /dev/null +++ b/assets/js/86ee3414.80d0289f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8809],{3905:(e,t,r)=>{r.d(t,{Zo:()=>l,kt:()=>m});var n=r(67294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var s=n.createContext({}),p=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},l=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,s=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),u=p(r),f=o,m=u["".concat(s,".").concat(f)]||u[f]||d[f]||a;return r?n.createElement(m,i(i({ref:t},l),{},{components:r})):n.createElement(m,i({ref:t},l))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=f;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c[u]="string"==typeof e?e:o,i[1]=c;for(var p=2;p{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>c,toc:()=>p});var n=r(87462),o=(r(67294),r(3905));const a={sidebar_label:"Day-2 Operations",sidebar_position:60},i="Day-2 Operations",c={unversionedId:"iaas/components/index",id:"iaas/components/index",title:"Day-2 Operations",description:"",source:"@site/docs/02-iaas/components/index.md",sourceDirName:"02-iaas/components",slug:"/iaas/components/",permalink:"/docs/iaas/components/",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/components/index.md",tags:[],version:"current",sidebarPosition:60,frontMatter:{sidebar_label:"Day-2 Operations",sidebar_position:60}},s={},p=[],l={toc:p},u="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,n.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"day-2-operations"},"Day-2 Operations"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/88684b71.a421c8ed.js b/assets/js/88684b71.a421c8ed.js new file mode 100644 index 0000000000..35e7d06626 --- /dev/null +++ b/assets/js/88684b71.a421c8ed.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6152],{3905:(e,a,n)=>{n.d(a,{Zo:()=>c,kt:()=>f});var t=n(67294);function r(e,a,n){return a in e?Object.defineProperty(e,a,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[a]=n,e}function o(e,a){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);a&&(t=t.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),n.push.apply(n,t)}return n}function l(e){for(var a=1;a=0||(r[n]=e[n]);return r}(e,a);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=t.createContext({}),p=function(e){var a=t.useContext(s),n=a;return e&&(n="function"==typeof e?e(a):l(l({},a),e)),n},c=function(e){var a=p(e.components);return t.createElement(s.Provider,{value:a},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var a=e.children;return t.createElement(t.Fragment,{},a)}},u=t.forwardRef((function(e,a){var n=e.components,r=e.mdxType,o=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=p(n),u=r,f=d["".concat(s,".").concat(u)]||d[u]||m[u]||o;return n?t.createElement(f,l(l({ref:a},c),{},{components:n})):t.createElement(f,l({ref:a},c))}));function f(e,a){var n=arguments,r=a&&a.mdxType;if("string"==typeof e||r){var o=n.length,l=new Array(o);l[0]=u;var i={};for(var s in a)hasOwnProperty.call(a,s)&&(i[s]=a[s]);i.originalType=e,i[d]="string"==typeof e?e:r,l[1]=i;for(var p=2;p{n.r(a),n.d(a,{assets:()=>s,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var t=n(87462),r=(n(67294),n(3905));const o={sidebar_label:"Flavor Manager",sidebar_position:51},l="Flavor Manager",i={unversionedId:"iaas/components/flavor-manager",id:"iaas/components/flavor-manager",title:"Flavor Manager",description:"Overview",source:"@site/docs/02-iaas/components/flavor-manager.md",sourceDirName:"02-iaas/components",slug:"/iaas/components/flavor-manager",permalink:"/docs/iaas/components/flavor-manager",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/components/flavor-manager.md",tags:[],version:"current",sidebarPosition:51,frontMatter:{sidebar_label:"Flavor Manager",sidebar_position:51},sidebar:"docs",previous:{title:"Image Manager",permalink:"/docs/iaas/components/image-manager"},next:{title:"Container Layer Introduction",permalink:"/docs/container/"}},s={},p=[{value:"Overview",id:"overview",level:2},{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"Definitions",id:"definitions",level:2},{value:"Name parser and generator",id:"name-parser-and-generator",level:2}],c={toc:p},d="wrapper";function m(e){let{components:a,...o}=e;return(0,r.kt)(d,(0,t.Z)({},c,o,{components:a,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"flavor-manager"},"Flavor Manager"),(0,r.kt)("h2",{id:"overview"},"Overview"),(0,r.kt)("p",null,"The OpenStack Flavor Manager manages the creation, modification, and removal of flavors within an OpenStack environment.\nThe OpenStack Flavor Manager operates as a facilitator that orchestrates compute flavors in alignment\nwith the standard ",(0,r.kt)("a",{parentName:"p",href:"https://docs.scs.community/standards/iaas/scs-0100"},"SCS-0100: Flavor Naming"),"\nby utilizing YAML files provided by the SCS project."),(0,r.kt)("h2",{id:"installation"},"Installation"),(0,r.kt)("p",null,"Install the ",(0,r.kt)("inlineCode",{parentName:"p"},"openstack-flavor-manager")," package with pip."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"pip install openstack-flavor-manager\n")),(0,r.kt)("p",null,"Or clone the repository ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/osism/openstack-flavor-manager"},"osism/openstack-flavor-manager"),"\nand use the OpenStack Flavor Manager from source with tox."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"tox -- --help\n")),(0,r.kt)("h2",{id:"usage"},"Usage"),(0,r.kt)("p",null,"There must be a ",(0,r.kt)("inlineCode",{parentName:"p"},"clouds.yml")," and a ",(0,r.kt)("inlineCode",{parentName:"p"},"secure.yml")," file in the directory where the OpenStack Flavor Manager\nwill be executed. The cloud profile to be used can be specified via the optional ",(0,r.kt)("inlineCode",{parentName:"p"},"--cloud")," parameter.\nBy default the cloud profile with the name ",(0,r.kt)("inlineCode",{parentName:"p"},"admin")," is used. It must be possible to create and delete\nflavors with the used cloud credentials."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ openstack-flavor-manager --help\n\n Usage: openstack-flavor-manager [OPTIONS]\n\n\u256d\u2500 Options \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 --name TEXT Name of flavor definitions. [default: scs] \u2502\n\u2502 --debug Enable debug logging. \u2502\n\u2502 --cloud TEXT Cloud name in clouds.yaml. [default: admin] \u2502\n\u2502 --recommended Create recommended flavors. \u2502\n\u2502 --help Show this message and exit. \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n")),(0,r.kt)("p",null,"To create the mandatory flavors by the SCS Flavor Naming Standard, you run:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"$ openstack-flavor-manager\n")),(0,r.kt)("p",null,"To create the recommended flavors by the SCS Flavor Naming Standard, you run:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"$ openstack-flavor-manager --recommended\n")),(0,r.kt)("p",null,"The output should look like this:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"2023-09-20 13:03:14 | INFO | Flavor 'SCS-1V-4' created.\n2023-09-20 13:03:14 | INFO | Flavor 'SCS-2V-8' created.\n2023-09-20 13:03:14 | INFO | Flavor 'SCS-4V-16' created.\n2023-09-20 13:03:14 | INFO | Flavor 'SCS-8V-32' created.\n...\n")),(0,r.kt)("p",null,"All recommended flavors are now be available in your OpenStack environment.\nCheck yourself by running: "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"openstack --os-cloud admin flavor list\n")),(0,r.kt)("h2",{id:"definitions"},"Definitions"),(0,r.kt)("p",null,"There are two flavor definitions available by default. One for\n",(0,r.kt)("a",{parentName:"p",href:"https://raw.githubusercontent.com/SovereignCloudStack/standards/main/Tests/iaas/SCS-Spec.MandatoryFlavors.verbose.yaml"},"SCS"),"\nand one for ",(0,r.kt)("a",{parentName:"p",href:"https://raw.githubusercontent.com/osism/openstack-flavor-manager/main/flavors.yaml"},"OSISM"),".\nEach definition has its own set of mandatory and recommended flavors."),(0,r.kt)("p",null,"To run the OpenStack Flavor Manager with a specific definition, either ",(0,r.kt)("inlineCode",{parentName:"p"},"scs")," or ",(0,r.kt)("inlineCode",{parentName:"p"},"osism"),",\nuse the optional ",(0,r.kt)("inlineCode",{parentName:"p"},"--name")," parameter. By default the ",(0,r.kt)("a",{parentName:"p",href:"https://docs.scs.community/standards/scs-0100-v3-flavor-naming"},"SCS Flavor Naming Standard"),"\ndefinition will be used."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ openstack-flavor-manager --name osism\n")),(0,r.kt)("h2",{id:"name-parser-and-generator"},"Name parser and generator"),(0,r.kt)("p",null,"A generator and parser for flavor names according to the SCS standard is available on\n",(0,r.kt)("a",{parentName:"p",href:"https://flavors.scs.community"},"flavors.scs.community"),"."),(0,r.kt)("p",null,"The flavor name ",(0,r.kt)("inlineCode",{parentName:"p"},"SCS-2V-4-20s")," is inserted in field ",(0,r.kt)("inlineCode",{parentName:"p"},"Flavor name"),":"),(0,r.kt)("img",{src:n(21384).Z,width:"50%"}),(0,r.kt)("p",null,"The flavor ",(0,r.kt)("inlineCode",{parentName:"p"},"SCS-2V-4-20s")," translated is\n",(0,r.kt)("inlineCode",{parentName:"p"},"2 generic x86-64 vCPUs with 4.0 GiB RAM and SSD 20GB root volume"),":"),(0,r.kt)("img",{src:n(71247).Z,width:"50%"}))}m.isMDXComponent=!0},21384:(e,a,n)=>{n.d(a,{Z:()=>t});const t=n.p+"assets/images/flavors-1-bd8d085759b264b3e58020d1390803fd.png"},71247:(e,a,n)=>{n.d(a,{Z:()=>t});const t=n.p+"assets/images/flavors-2-d9a87ab2a63ed62ace4303facc069b8b.png"}}]); \ No newline at end of file diff --git a/assets/js/88f37d1b.ffc0586d.js b/assets/js/88f37d1b.ffc0586d.js new file mode 100644 index 0000000000..eeb8503f82 --- /dev/null +++ b/assets/js/88f37d1b.ffc0586d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4233],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>u});var o=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function r(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=o.createContext({}),c=function(e){var t=o.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},p=function(e){var t=c(e.components);return o.createElement(s.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},h=o.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),d=c(n),h=a,u=d["".concat(s,".").concat(h)]||d[h]||m[h]||i;return n?o.createElement(u,r(r({ref:t},p),{},{components:n})):o.createElement(u,r({ref:t},p))}));function u(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,r=new Array(i);r[0]=h;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[d]="string"==typeof e?e:a,r[1]=l;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var o=n(87462),a=(n(67294),n(3905));const i={},r="Proposal for documentation for Keycloak to Keycloak Federation (WebSSO)",l={unversionedId:"iam/intra-SCS-federation-setup-description-for-osism-doc-operations",id:"iam/intra-SCS-federation-setup-description-for-osism-doc-operations",title:"Proposal for documentation for Keycloak to Keycloak Federation (WebSSO)",description:"The followig section is a reasonably detailed hands on description of how",source:"@site/docs/05-iam/intra-SCS-federation-setup-description-for-osism-doc-operations.md",sourceDirName:"05-iam",slug:"/iam/intra-SCS-federation-setup-description-for-osism-doc-operations",permalink:"/docs/iam/intra-SCS-federation-setup-description-for-osism-doc-operations",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/05-iam/intra-SCS-federation-setup-description-for-osism-doc-operations.md",tags:[],version:"current",frontMatter:{},sidebar:"docs",previous:{title:"Identity and Access Management (IAM)",permalink:"/docs/category/identity-and-access-management-iam"},next:{title:"Releases",permalink:"/docs/category/releases"}},s={},c=[{value:"Detailed tutorial on how to configure Federation (OpenID Connect) between two Keycloak instances in two separate SCS domains",id:"detailed-tutorial-on-how-to-configure-federation-openid-connect-between-two-keycloak-instances-in-two-separate-scs-domains",level:2}],p={toc:c},d="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(d,(0,o.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"proposal-for-documentation-for-keycloak-to-keycloak-federation-websso"},"Proposal for documentation for Keycloak to Keycloak Federation (WebSSO)"),(0,a.kt)("p",null,"The followig section is a reasonably detailed hands on description of how\nto configure a federation between two separate SCS compliant domains by means\nof Keycloak ",(0,a.kt)("inlineCode",{parentName:"p"},"Identity Brokering"),". If we decide to use Keycloak as a component\nto allow self service by tenants, then this documentation may be a useful addition\nto some tenant facing documentation (or for the SCS operators too)."),(0,a.kt)("p",null,"OTOH one could probably also script pretty much everything of this to allow\ntenants to use a CLI tool to automate the setup. For that purpose the documentation\nmay be useful to guide the implementation of such a scripted solution."),(0,a.kt)("h2",{id:"detailed-tutorial-on-how-to-configure-federation-openid-connect-between-two-keycloak-instances-in-two-separate-scs-domains"},"Detailed tutorial on how to configure Federation (OpenID Connect) between two Keycloak instances in two separate SCS domains"),(0,a.kt)("p",null,'Assume you have two CSPs using SCS. The first one wants to grant access to users of the other.\nSo let\'s call the first domain "resource domain" and the second one "accounts domain".\nBoth domains need to agree upon a name for the "OIDC RP" (which Keycloak calls ',(0,a.kt)("inlineCode",{parentName:"p"},"Clients"),').\nThe Keycloak in the "resource domain" will be the OIDC RP and the Keycloak in the "accounts domain" will be the OIDC OP.\nAssuming the "resource domain" is called ',(0,a.kt)("inlineCode",{parentName:"p"},"foo"),' and the "accounts domain" is called bar, the name for the "OIDC RP" could be ',(0,a.kt)("inlineCode",{parentName:"p"},"oidc-rp-foo"),"."),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"In the accounts domain (",(0,a.kt)("inlineCode",{parentName:"p"},"bar"),") open Keycloak realm ",(0,a.kt)("inlineCode",{parentName:"p"},"osism"),", click on ",(0,a.kt)("inlineCode",{parentName:"p"},"Clients")," in the sidebar and click on ",(0,a.kt)("inlineCode",{parentName:"p"},"Create client"),".\nLeave the client type as ",(0,a.kt)("inlineCode",{parentName:"p"},"OpenID Connect")," and enter the ",(0,a.kt)("inlineCode",{parentName:"p"},"Client ID"),", e.g. ",(0,a.kt)("inlineCode",{parentName:"p"},"oidc-rp-foo"),".\nTurn on ",(0,a.kt)("inlineCode",{parentName:"p"},"Client authentication")," for it and click ",(0,a.kt)("inlineCode",{parentName:"p"},"Save"),"."),(0,a.kt)("p",{parentName:"li"},"On the ",(0,a.kt)("inlineCode",{parentName:"p"},"Client details")," page open the tab ",(0,a.kt)("inlineCode",{parentName:"p"},"Credentials")," and copy the ",(0,a.kt)("inlineCode",{parentName:"p"},"Client secret"),'. Communicate this to the operato of the "resource domain" ',(0,a.kt)("inlineCode",{parentName:"p"},"foo")," via a secure channel.")),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"In the resource domain (",(0,a.kt)("inlineCode",{parentName:"p"},"foo"),") open Keycloak realm ",(0,a.kt)("inlineCode",{parentName:"p"},"osism"),", click on ",(0,a.kt)("inlineCode",{parentName:"p"},"Identity providers"),"\nand create a new provider definition of type ",(0,a.kt)("inlineCode",{parentName:"p"},"OpenID Connect v1.0"),". As ",(0,a.kt)("inlineCode",{parentName:"p"},"Alias")," choose a name,\ne.g. ",(0,a.kt)("inlineCode",{parentName:"p"},"oidc-op-bar"),". Don't copy the ",(0,a.kt)("inlineCode",{parentName:"p"},"Redirect URI")," given at the top yet, because is will change depending\non the chosen ",(0,a.kt)("inlineCode",{parentName:"p"},"Alias"),". Instead, scroll down to the mandatory field ",(0,a.kt)("inlineCode",{parentName:"p"},"Discovery endpoint")," and paste\nthe OpenID Connect metadata URL of the KEycloak realm ",(0,a.kt)("inlineCode",{parentName:"p"},"osism"),' in the "accounts domain" (',(0,a.kt)("inlineCode",{parentName:"p"},"bar"),').\nThe operator of the "accounts domain" (',(0,a.kt)("inlineCode",{parentName:"p"},"bar"),") may easily copy that URL from the ",(0,a.kt)("inlineCode",{parentName:"p"},"Realm Settins")," in the\nsidebar of his Keycloak instance, where the ",(0,a.kt)("inlineCode",{parentName:"p"},"Endpoints")," are listed on the bottom of that form.\nThe URL may have the format ",(0,a.kt)("inlineCode",{parentName:"p"},"https://bar.com/auth/realms/osism/.well-known/openid-configuration"),".\nOnce you leave that input field, Keycloak will attempt to fetch the metadata and extract the required\ndetails about protocol enspoints from the retrieved document. If this shows an error, it will give you\nan HTTP status code. If this shows an error code of 500, then this may be caused by a failure in\ncertificate verification. In that case you may want to check the output of ",(0,a.kt)("inlineCode",{parentName:"p"},"docker logs keycloak")," for\njava stack traces. If you find any, the top of those stack traces may indicate what kind of problem\noccurred to the java code. From here we will assume that the emtadata URL could be fecthed without\nany issues."),(0,a.kt)("p",{parentName:"li"},"Now, go to the bottom of that form and insert tjhe ",(0,a.kt)("inlineCode",{parentName:"p"},"Client ID")," (",(0,a.kt)("inlineCode",{parentName:"p"},"oidc-rp-foo"),") and the\n",(0,a.kt)("inlineCode",{parentName:"p"},"Client secret"),' that was provided by the operator of the "accounts domain" (',(0,a.kt)("inlineCode",{parentName:"p"},"bar"),").\nFinally click on ",(0,a.kt)("inlineCode",{parentName:"p"},"Add"),". From the ",(0,a.kt)("inlineCode",{parentName:"p"},"Provider Details")," page on the top for the ",(0,a.kt)("inlineCode",{parentName:"p"},"Settings")," tab copy the value of the\n",(0,a.kt)("inlineCode",{parentName:"p"},"Redirect URI"),' and communicate it back to the operator of the "accounts domain" (',(0,a.kt)("inlineCode",{parentName:"p"},"bar"),").")),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"In the accounts domain (",(0,a.kt)("inlineCode",{parentName:"p"},"bar"),") open Keycloak realm ",(0,a.kt)("inlineCode",{parentName:"p"},"osism"),", click on ",(0,a.kt)("inlineCode",{parentName:"p"},"Clients")," in the sidebar and click\non the name of the OIDC RP clinent that you created for domain ",(0,a.kt)("inlineCode",{parentName:"p"},"foo")," (e.g. ",(0,a.kt)("inlineCode",{parentName:"p"},"oidc-rp-foo"),").\nOn the ",(0,a.kt)("inlineCode",{parentName:"p"},"Client details")," page on the tab ",(0,a.kt)("inlineCode",{parentName:"p"},"Settings")," fill in the field ",(0,a.kt)("inlineCode",{parentName:"p"},"Valid redirect URIs")," with the value\nobtained from the resource domain (",(0,a.kt)("inlineCode",{parentName:"p"},"foo"),"), which should look similar to\n",(0,a.kt)("inlineCode",{parentName:"p"},"https://foo.com/auth/realms/osism/broker/oidc-op-bar/endpoint"),". Additionally the\n",(0,a.kt)("inlineCode",{parentName:"p"},"Valid post logout redirect URIs")," need to be set to something like ",(0,a.kt)("inlineCode",{parentName:"p"},"https://foo.com/auth/realms/osism/*"),".")),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},'To test federated login in the "resource domain" (',(0,a.kt)("inlineCode",{parentName:"p"},"foo"),") open the URL of the Keycloak admin console for\nthe realm ",(0,a.kt)("inlineCode",{parentName:"p"},"osism"),": ",(0,a.kt)("inlineCode",{parentName:"p"},"https://foo.com/auth/admin/osism/console")," (or ",(0,a.kt)("inlineCode",{parentName:"p"},"https://foo.com/auth/realms/osism/protocol/openid-connect/auth?client_id=security-admin-console"),").\nIgnore the top section of the login form titled\n",(0,a.kt)("inlineCode",{parentName:"p"},"Sign in to your account")," and choose one of the OIDC OP federation choises below the line ",(0,a.kt)("inlineCode",{parentName:"p"},"Or sign in with"),".\nIn this example it would be ",(0,a.kt)("inlineCode",{parentName:"p"},"oidc-op-bar"),'. This should redirect your browser to the authentication endpoint\nof the "accounts domain" (',(0,a.kt)("inlineCode",{parentName:"p"},"https://bar.com/auth/realms/osism/protocol/openid-connect/auth?scope=openid&..."),')\nwhere you should be able to log in with credentials that are valid in the "accounts domain" (',(0,a.kt)("inlineCode",{parentName:"p"},"bar"),').\nAfter successull authentication your broser should be redirected to admin console of the "resource domain",\nwhich may offer you a "first login flow" form where you can choose a username, email, firstname and lastname.\nThe details depend on the ',(0,a.kt)("inlineCode",{parentName:"p"},"Mappers")," that have been configured for the Identity Provider ",(0,a.kt)("inlineCode",{parentName:"p"},"oidc-op-bar"),".\nAfter that you will be presented with a Keycloak themed page with the error message ",(0,a.kt)("inlineCode",{parentName:"p"},"Request failed with status code 403"),",\nwhich is normal because the test account is not authorized to access any elements of the Keycloak admin console."))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/89176cae.00a7820f.js b/assets/js/89176cae.00a7820f.js new file mode 100644 index 0000000000..c081e52803 --- /dev/null +++ b/assets/js/89176cae.00a7820f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3282],{3905:(e,t,r)=>{r.d(t,{Zo:()=>l,kt:()=>m});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=n.createContext({}),d=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):c(c({},t),e)),r},l=function(e){var t=d(e.components);return n.createElement(s.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,l=i(e,["components","mdxType","originalType","parentName"]),p=d(r),f=a,m=p["".concat(s,".").concat(f)]||p[f]||u[f]||o;return r?n.createElement(m,c(c({ref:t},l),{},{components:r})):n.createElement(m,c({ref:t},l))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,c=new Array(o);c[0]=f;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[p]="string"==typeof e?e:a,c[1]=i;for(var d=2;d{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>c,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>d});var n=r(87462),a=(r(67294),r(3905));const o={},c="Standards",i={unversionedId:"standards/index",id:"standards/index",title:"Standards",description:"TODO",source:"@site/docs/07-standards/index.md",sourceDirName:"07-standards",slug:"/standards/",permalink:"/docs/standards/",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/07-standards/index.md",tags:[],version:"current",frontMatter:{}},s={},d=[],l={toc:d},p="wrapper";function u(e){let{components:t,...r}=e;return(0,a.kt)(p,(0,n.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"standards"},"Standards"),(0,a.kt)("p",null,"TODO"))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8954.a36c6917.js b/assets/js/8954.a36c6917.js new file mode 100644 index 0000000000..0a2d013567 --- /dev/null +++ b/assets/js/8954.a36c6917.js @@ -0,0 +1,2 @@ +/*! For license information please see 8954.a36c6917.js.LICENSE.txt */ +(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8954],{17967:(t,e)=>{"use strict";e.Nm=e.Rq=void 0;var n=/^([^\w]*)(javascript|data|vbscript)/im,i=/&#(\w+)(^\w|;)?/g,r=/&(newline|tab);/gi,a=/[\u0000-\u001F\u007F-\u009F\u2000-\u200D\uFEFF]/gim,s=/^.+(:|:)/gim,o=[".","/"];e.Rq="about:blank",e.Nm=function(t){if(!t)return e.Rq;var c,l=(c=t,c.replace(a,"").replace(i,(function(t,e){return String.fromCharCode(e)}))).replace(r,"").replace(a,"").trim();if(!l)return e.Rq;if(function(t){return o.indexOf(t[0])>-1}(l))return l;var h=l.match(s);if(!h)return l;var u=h[0];return n.test(u)?e.Rq:l}},3905:(t,e,n)=>{"use strict";n.d(e,{Zo:()=>h,kt:()=>f});var i=n(67294);function r(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function a(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,i)}return n}function s(t){for(var e=1;e=0||(r[n]=t[n]);return r}(t,e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(r[n]=t[n])}return r}var c=i.createContext({}),l=function(t){var e=i.useContext(c),n=e;return t&&(n="function"==typeof t?t(e):s(s({},e),t)),n},h=function(t){var e=l(t.components);return i.createElement(c.Provider,{value:e},t.children)},u="mdxType",d={inlineCode:"code",wrapper:function(t){var e=t.children;return i.createElement(i.Fragment,{},e)}},p=i.forwardRef((function(t,e){var n=t.components,r=t.mdxType,a=t.originalType,c=t.parentName,h=o(t,["components","mdxType","originalType","parentName"]),u=l(n),p=r,f=u["".concat(c,".").concat(p)]||u[p]||d[p]||a;return n?i.createElement(f,s(s({ref:e},h),{},{components:n})):i.createElement(f,s({ref:e},h))}));function f(t,e){var n=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var a=n.length,s=new Array(a);s[0]=p;var o={};for(var c in e)hasOwnProperty.call(e,c)&&(o[c]=e[c]);o.originalType=t,o[u]="string"==typeof t?t:r,s[1]=o;for(var l=2;l{"use strict";n.d(e,{Z:()=>h});var i=n(67294),r=n(95999),a=n(35281),s=n(87462),o=n(86010);const c={iconEdit:"iconEdit_Z9Sw"};function l(t){let{className:e,...n}=t;return i.createElement("svg",(0,s.Z)({fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,o.Z)(c.iconEdit,e),"aria-hidden":"true"},n),i.createElement("g",null,i.createElement("path",{d:"m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"})))}function h(t){let{editUrl:e}=t;return i.createElement("a",{href:e,target:"_blank",rel:"noreferrer noopener",className:a.k.common.editThisPage},i.createElement(l,null),i.createElement(r.Z,{id:"theme.common.editThisPage",description:"The link label to edit the current page"},"Edit this page"))}},92503:(t,e,n)=>{"use strict";n.d(e,{Z:()=>h});var i=n(87462),r=n(67294),a=n(86010),s=n(95999),o=n(86668),c=n(39960);const l={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};function h(t){let{as:e,id:n,...h}=t;const{navbar:{hideOnScroll:u}}=(0,o.L)();if("h1"===e||!n)return r.createElement(e,(0,i.Z)({},h,{id:void 0}));const d=(0,s.I)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof h.children?h.children:n});return r.createElement(e,(0,i.Z)({},h,{className:(0,a.Z)("anchor",u?l.anchorWithHideOnScrollNavbar:l.anchorWithStickyNavbar,h.className),id:n}),h.children,r.createElement(c.Z,{className:"hash-link",to:`#${n}`,"aria-label":d,title:d},"\u200b"))}},21098:(t,e,n)=>{"use strict";n.d(e,{Z:()=>wt});var i=n(67294),r=n(3905),a=n(87462),s=n(35742);var o=n(72389),c=n(86010),l=n(92949),h=n(86668);function u(){const{prism:t}=(0,h.L)(),{colorMode:e}=(0,l.I)(),n=t.theme,i=t.darkTheme||n;return"dark"===e?i:n}var d=n(35281),p=n(87594),f=n.n(p);const g=/title=(?["'])(?.*?)\1/,y=/\{(?<range>[\d,-]+)\}/,m={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},bash:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"}};function b(t,e){const n=t.map((t=>{const{start:n,end:i}=m[t];return`(?:${n}\\s*(${e.flatMap((t=>[t.line,t.block?.start,t.block?.end].filter(Boolean))).join("|")})\\s*${i})`})).join("|");return new RegExp(`^\\s*(?:${n})\\s*$`)}function _(t,e){let n=t.replace(/\n$/,"");const{language:i,magicComments:r,metastring:a}=e;if(a&&y.test(a)){const t=a.match(y).groups.range;if(0===r.length)throw new Error(`A highlight range has been given in code block's metastring (\`\`\` ${a}), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.`);const e=r[0].className,i=f()(t).filter((t=>t>0)).map((t=>[t-1,[e]]));return{lineClassNames:Object.fromEntries(i),code:n}}if(void 0===i)return{lineClassNames:{},code:n};const s=function(t,e){switch(t){case"js":case"javascript":case"ts":case"typescript":return b(["js","jsBlock"],e);case"jsx":case"tsx":return b(["js","jsBlock","jsx"],e);case"html":return b(["js","jsBlock","html"],e);case"python":case"py":case"bash":return b(["bash"],e);case"markdown":case"md":return b(["html","jsx","bash"],e);default:return b(Object.keys(m),e)}}(i,r),o=n.split("\n"),c=Object.fromEntries(r.map((t=>[t.className,{start:0,range:""}]))),l=Object.fromEntries(r.filter((t=>t.line)).map((t=>{let{className:e,line:n}=t;return[n,e]}))),h=Object.fromEntries(r.filter((t=>t.block)).map((t=>{let{className:e,block:n}=t;return[n.start,e]}))),u=Object.fromEntries(r.filter((t=>t.block)).map((t=>{let{className:e,block:n}=t;return[n.end,e]})));for(let p=0;p<o.length;){const t=o[p].match(s);if(!t){p+=1;continue}const e=t.slice(1).find((t=>void 0!==t));l[e]?c[l[e]].range+=`${p},`:h[e]?c[h[e]].start=p:u[e]&&(c[u[e]].range+=`${c[u[e]].start}-${p-1},`),o.splice(p,1)}n=o.join("\n");const d={};return Object.entries(c).forEach((t=>{let[e,{range:n}]=t;f()(n).forEach((t=>{d[t]??=[],d[t].push(e)}))})),{lineClassNames:d,code:n}}const x={codeBlockContainer:"codeBlockContainer_Ckt0"};function v(t){let{as:e,...n}=t;const r=function(t){const e={color:"--prism-color",backgroundColor:"--prism-background-color"},n={};return Object.entries(t.plain).forEach((t=>{let[i,r]=t;const a=e[i];a&&"string"==typeof r&&(n[a]=r)})),n}(u());return i.createElement(e,(0,a.Z)({},n,{style:r,className:(0,c.Z)(n.className,x.codeBlockContainer,d.k.common.codeBlock)}))}const k={codeBlockContent:"codeBlockContent_biex",codeBlockTitle:"codeBlockTitle_Ktv7",codeBlock:"codeBlock_bY9V",codeBlockStandalone:"codeBlockStandalone_MEMb",codeBlockLines:"codeBlockLines_e6Vv",codeBlockLinesWithNumbering:"codeBlockLinesWithNumbering_o6Pm",buttonGroup:"buttonGroup__atx"};function w(t){let{children:e,className:n}=t;return i.createElement(v,{as:"pre",tabIndex:0,className:(0,c.Z)(k.codeBlockStandalone,"thin-scrollbar",n)},i.createElement("code",{className:k.codeBlockLines},e))}var C=n(902);const T={attributes:!0,characterData:!0,childList:!0,subtree:!0};function E(t,e){const[n,r]=(0,i.useState)(),a=(0,i.useCallback)((()=>{r(t.current?.closest("[role=tabpanel][hidden]"))}),[t,r]);(0,i.useEffect)((()=>{a()}),[a]),function(t,e,n){void 0===n&&(n=T);const r=(0,C.zX)(e),a=(0,C.Ql)(n);(0,i.useEffect)((()=>{const e=new MutationObserver(r);return t&&e.observe(t,a),()=>e.disconnect()}),[t,r,a])}(n,(t=>{t.forEach((t=>{"attributes"===t.type&&"hidden"===t.attributeName&&(e(),a())}))}),{attributes:!0,characterData:!1,childList:!1,subtree:!1})}const S={plain:{backgroundColor:"#2a2734",color:"#9a86fd"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#6c6783"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#e09142"}},{types:["property","function"],style:{color:"#9a86fd"}},{types:["tag-id","selector","atrule-id"],style:{color:"#eeebff"}},{types:["attr-name"],style:{color:"#c4b9fe"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","atrule","placeholder","variable"],style:{color:"#ffcc99"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#c4b9fe"}}]};var A={Prism:n(87410).Z,theme:S};function L(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function B(){return B=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(t[i]=n[i])}return t},B.apply(this,arguments)}var N=/\r\n|\r|\n/,D=function(t){0===t.length?t.push({types:["plain"],content:"\n",empty:!0}):1===t.length&&""===t[0].content&&(t[0].content="\n",t[0].empty=!0)},O=function(t,e){var n=t.length;return n>0&&t[n-1]===e?t:t.concat(e)};function M(t,e){var n={};for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&-1===e.indexOf(i)&&(n[i]=t[i]);return n}var I=function(t){function e(){for(var e=this,n=[],i=arguments.length;i--;)n[i]=arguments[i];t.apply(this,n),L(this,"getThemeDict",(function(t){if(void 0!==e.themeDict&&t.theme===e.prevTheme&&t.language===e.prevLanguage)return e.themeDict;e.prevTheme=t.theme,e.prevLanguage=t.language;var n=t.theme?function(t,e){var n=t.plain,i=Object.create(null),r=t.styles.reduce((function(t,n){var i=n.languages,r=n.style;return i&&!i.includes(e)||n.types.forEach((function(e){var n=B({},t[e],r);t[e]=n})),t}),i);return r.root=n,r.plain=B({},n,{backgroundColor:null}),r}(t.theme,t.language):void 0;return e.themeDict=n})),L(this,"getLineProps",(function(t){var n=t.key,i=t.className,r=t.style,a=B({},M(t,["key","className","style","line"]),{className:"token-line",style:void 0,key:void 0}),s=e.getThemeDict(e.props);return void 0!==s&&(a.style=s.plain),void 0!==r&&(a.style=void 0!==a.style?B({},a.style,r):r),void 0!==n&&(a.key=n),i&&(a.className+=" "+i),a})),L(this,"getStyleForToken",(function(t){var n=t.types,i=t.empty,r=n.length,a=e.getThemeDict(e.props);if(void 0!==a){if(1===r&&"plain"===n[0])return i?{display:"inline-block"}:void 0;if(1===r&&!i)return a[n[0]];var s=i?{display:"inline-block"}:{},o=n.map((function(t){return a[t]}));return Object.assign.apply(Object,[s].concat(o))}})),L(this,"getTokenProps",(function(t){var n=t.key,i=t.className,r=t.style,a=t.token,s=B({},M(t,["key","className","style","token"]),{className:"token "+a.types.join(" "),children:a.content,style:e.getStyleForToken(a),key:void 0});return void 0!==r&&(s.style=void 0!==s.style?B({},s.style,r):r),void 0!==n&&(s.key=n),i&&(s.className+=" "+i),s})),L(this,"tokenize",(function(t,e,n,i){var r={code:e,grammar:n,language:i,tokens:[]};t.hooks.run("before-tokenize",r);var a=r.tokens=t.tokenize(r.code,r.grammar,r.language);return t.hooks.run("after-tokenize",r),a}))}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.render=function(){var t=this.props,e=t.Prism,n=t.language,i=t.code,r=t.children,a=this.getThemeDict(this.props),s=e.languages[n];return r({tokens:function(t){for(var e=[[]],n=[t],i=[0],r=[t.length],a=0,s=0,o=[],c=[o];s>-1;){for(;(a=i[s]++)<r[s];){var l=void 0,h=e[s],u=n[s][a];if("string"==typeof u?(h=s>0?h:["plain"],l=u):(h=O(h,u.type),u.alias&&(h=O(h,u.alias)),l=u.content),"string"==typeof l){var d=l.split(N),p=d.length;o.push({types:h,content:d[0]});for(var f=1;f<p;f++)D(o),c.push(o=[]),o.push({types:h,content:d[f]})}else s++,e.push(h),n.push(l),i.push(0),r.push(l.length)}s--,e.pop(),n.pop(),i.pop(),r.pop()}return D(o),c}(void 0!==s?this.tokenize(e,i,s,n):[i]),className:"prism-code language-"+n,style:void 0!==a?a.root:{},getLineProps:this.getLineProps,getTokenProps:this.getTokenProps})},e}(i.Component);const F=I,$={codeLine:"codeLine_lJS_",codeLineNumber:"codeLineNumber_Tfdd",codeLineContent:"codeLineContent_feaV"};function R(t){let{line:e,classNames:n,showLineNumbers:r,getLineProps:s,getTokenProps:o}=t;1===e.length&&"\n"===e[0].content&&(e[0].content="");const l=s({line:e,className:(0,c.Z)(n,r&&$.codeLine)}),h=e.map(((t,e)=>i.createElement("span",(0,a.Z)({key:e},o({token:t,key:e})))));return i.createElement("span",l,r?i.createElement(i.Fragment,null,i.createElement("span",{className:$.codeLineNumber}),i.createElement("span",{className:$.codeLineContent},h)):h,i.createElement("br",null))}var Z=n(95999);function P(t){return i.createElement("svg",(0,a.Z)({viewBox:"0 0 24 24"},t),i.createElement("path",{fill:"currentColor",d:"M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"}))}function j(t){return i.createElement("svg",(0,a.Z)({viewBox:"0 0 24 24"},t),i.createElement("path",{fill:"currentColor",d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"}))}const Y={copyButtonCopied:"copyButtonCopied_obH4",copyButtonIcons:"copyButtonIcons_eSgA",copyButtonIcon:"copyButtonIcon_y97N",copyButtonSuccessIcon:"copyButtonSuccessIcon_LjdS"};function z(t){let{code:e,className:n}=t;const[r,a]=(0,i.useState)(!1),s=(0,i.useRef)(void 0),o=(0,i.useCallback)((()=>{!function(t,e){let{target:n=document.body}=void 0===e?{}:e;if("string"!=typeof t)throw new TypeError(`Expected parameter \`text\` to be a \`string\`, got \`${typeof t}\`.`);const i=document.createElement("textarea"),r=document.activeElement;i.value=t,i.setAttribute("readonly",""),i.style.contain="strict",i.style.position="absolute",i.style.left="-9999px",i.style.fontSize="12pt";const a=document.getSelection(),s=a.rangeCount>0&&a.getRangeAt(0);n.append(i),i.select(),i.selectionStart=0,i.selectionEnd=t.length;let o=!1;try{o=document.execCommand("copy")}catch{}i.remove(),s&&(a.removeAllRanges(),a.addRange(s)),r&&r.focus()}(e),a(!0),s.current=window.setTimeout((()=>{a(!1)}),1e3)}),[e]);return(0,i.useEffect)((()=>()=>window.clearTimeout(s.current)),[]),i.createElement("button",{type:"button","aria-label":r?(0,Z.I)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,Z.I)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,Z.I)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,c.Z)("clean-btn",n,Y.copyButton,r&&Y.copyButtonCopied),onClick:o},i.createElement("span",{className:Y.copyButtonIcons,"aria-hidden":"true"},i.createElement(P,{className:Y.copyButtonIcon}),i.createElement(j,{className:Y.copyButtonSuccessIcon})))}function U(t){return i.createElement("svg",(0,a.Z)({viewBox:"0 0 24 24"},t),i.createElement("path",{fill:"currentColor",d:"M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"}))}const W={wordWrapButtonIcon:"wordWrapButtonIcon_Bwma",wordWrapButtonEnabled:"wordWrapButtonEnabled_EoeP"};function q(t){let{className:e,onClick:n,isEnabled:r}=t;const a=(0,Z.I)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return i.createElement("button",{type:"button",onClick:n,className:(0,c.Z)("clean-btn",e,r&&W.wordWrapButtonEnabled),"aria-label":a,title:a},i.createElement(U,{className:W.wordWrapButtonIcon,"aria-hidden":"true"}))}function H(t){let{children:e,className:n="",metastring:r,title:s,showLineNumbers:o,language:l}=t;const{prism:{defaultLanguage:d,magicComments:p}}=(0,h.L)(),f=l??function(t){const e=t.split(" ").find((t=>t.startsWith("language-")));return e?.replace(/language-/,"")}(n)??d,y=u(),m=function(){const[t,e]=(0,i.useState)(!1),[n,r]=(0,i.useState)(!1),a=(0,i.useRef)(null),s=(0,i.useCallback)((()=>{const n=a.current.querySelector("code");t?n.removeAttribute("style"):(n.style.whiteSpace="pre-wrap",n.style.overflowWrap="anywhere"),e((t=>!t))}),[a,t]),o=(0,i.useCallback)((()=>{const{scrollWidth:t,clientWidth:e}=a.current,n=t>e||a.current.querySelector("code").hasAttribute("style");r(n)}),[a]);return E(a,o),(0,i.useEffect)((()=>{o()}),[t,o]),(0,i.useEffect)((()=>(window.addEventListener("resize",o,{passive:!0}),()=>{window.removeEventListener("resize",o)})),[o]),{codeBlockRef:a,isEnabled:t,isCodeScrollable:n,toggle:s}}(),b=function(t){return t?.match(g)?.groups.title??""}(r)||s,{lineClassNames:x,code:w}=_(e,{metastring:r,language:f,magicComments:p}),C=o??function(t){return Boolean(t?.includes("showLineNumbers"))}(r);return i.createElement(v,{as:"div",className:(0,c.Z)(n,f&&!n.includes(`language-${f}`)&&`language-${f}`)},b&&i.createElement("div",{className:k.codeBlockTitle},b),i.createElement("div",{className:k.codeBlockContent},i.createElement(F,(0,a.Z)({},A,{theme:y,code:w,language:f??"text"}),(t=>{let{className:e,tokens:n,getLineProps:r,getTokenProps:a}=t;return i.createElement("pre",{tabIndex:0,ref:m.codeBlockRef,className:(0,c.Z)(e,k.codeBlock,"thin-scrollbar")},i.createElement("code",{className:(0,c.Z)(k.codeBlockLines,C&&k.codeBlockLinesWithNumbering)},n.map(((t,e)=>i.createElement(R,{key:e,line:t,getLineProps:r,getTokenProps:a,classNames:x[e],showLineNumbers:C})))))})),i.createElement("div",{className:k.buttonGroup},(m.isEnabled||m.isCodeScrollable)&&i.createElement(q,{className:k.codeButton,onClick:()=>m.toggle(),isEnabled:m.isEnabled}),i.createElement(z,{className:k.codeButton,code:w}))))}function V(t){let{children:e,...n}=t;const r=(0,o.Z)(),s=function(t){return i.Children.toArray(t).some((t=>(0,i.isValidElement)(t)))?t:Array.isArray(t)?t.join(""):t}(e),c="string"==typeof s?H:w;return i.createElement(c,(0,a.Z)({key:String(r)},n),s)}var G=n(39960);var X=n(86043);const Q={details:"details_lb9f",isBrowser:"isBrowser_bmU9",collapsibleContent:"collapsibleContent_i85q"};function K(t){return!!t&&("SUMMARY"===t.tagName||K(t.parentElement))}function J(t,e){return!!t&&(t===e||J(t.parentElement,e))}function tt(t){let{summary:e,children:n,...r}=t;const s=(0,o.Z)(),l=(0,i.useRef)(null),{collapsed:h,setCollapsed:u}=(0,X.u)({initialState:!r.open}),[d,p]=(0,i.useState)(r.open),f=i.isValidElement(e)?e:i.createElement("summary",null,e??"Details");return i.createElement("details",(0,a.Z)({},r,{ref:l,open:d,"data-collapsed":h,className:(0,c.Z)(Q.details,s&&Q.isBrowser,r.className),onMouseDown:t=>{K(t.target)&&t.detail>1&&t.preventDefault()},onClick:t=>{t.stopPropagation();const e=t.target;K(e)&&J(e,l.current)&&(t.preventDefault(),h?(u(!1),p(!0)):u(!0))}}),f,i.createElement(X.z,{lazy:!1,collapsed:h,disableSSRStyle:!0,onCollapseTransitionEnd:t=>{u(t),p(!t)}},i.createElement("div",{className:Q.collapsibleContent},n)))}const et={details:"details_b_Ee"},nt="alert alert--info";function it(t){let{...e}=t;return i.createElement(tt,(0,a.Z)({},e,{className:(0,c.Z)(nt,et.details,e.className)}))}var rt=n(92503);function at(t){return i.createElement(rt.Z,t)}const st={containsTaskList:"containsTaskList_mC6p"};function ot(t){if(void 0!==t)return(0,c.Z)(t,t?.includes("contains-task-list")&&st.containsTaskList)}const ct={img:"img_ev3q"};const lt="admonition_LlT9",ht="admonitionHeading_tbUL",ut="admonitionIcon_kALy",dt="admonitionContent_S0QG";const pt={note:{infimaClassName:"secondary",iconComponent:function(){return i.createElement("svg",{viewBox:"0 0 14 16"},i.createElement("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"}))},label:i.createElement(Z.Z,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)"},"note")},tip:{infimaClassName:"success",iconComponent:function(){return i.createElement("svg",{viewBox:"0 0 12 16"},i.createElement("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"}))},label:i.createElement(Z.Z,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)"},"tip")},danger:{infimaClassName:"danger",iconComponent:function(){return i.createElement("svg",{viewBox:"0 0 12 16"},i.createElement("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"}))},label:i.createElement(Z.Z,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)"},"danger")},info:{infimaClassName:"info",iconComponent:function(){return i.createElement("svg",{viewBox:"0 0 14 16"},i.createElement("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"}))},label:i.createElement(Z.Z,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)"},"info")},caution:{infimaClassName:"warning",iconComponent:function(){return i.createElement("svg",{viewBox:"0 0 16 16"},i.createElement("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"}))},label:i.createElement(Z.Z,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)"},"caution")}},ft={secondary:"note",important:"info",success:"tip",warning:"danger"};function gt(t){const{mdxAdmonitionTitle:e,rest:n}=function(t){const e=i.Children.toArray(t),n=e.find((t=>i.isValidElement(t)&&"mdxAdmonitionTitle"===t.props?.mdxType)),r=i.createElement(i.Fragment,null,e.filter((t=>t!==n)));return{mdxAdmonitionTitle:n,rest:r}}(t.children);return{...t,title:t.title??e,children:n}}function yt(t){let{children:e,fallback:n}=t;return(0,o.Z)()?i.createElement(i.Fragment,null,e?.()):n??null}var mt=n(16432);const bt="docusaurus-mermaid-container";function _t(){const{colorMode:t}=(0,l.I)(),e=(0,h.L)().mermaid,n=e.theme[t],{options:r}=e;return(0,i.useMemo)((()=>({startOnLoad:!1,...r,theme:n})),[n,r])}const xt={container:"container_lyt7"};function vt(t){let{value:e}=t;const n=function(t,e){const n=_t(),r=e??n;return(0,i.useMemo)((()=>{mt.o.mermaidAPI.initialize(r);const e=`mermaid-svg-${Math.round(1e7*Math.random())}`;return mt.o.render(e,t)}),[t,r])}(e);return i.createElement("div",{className:`${bt} ${xt.container}`,dangerouslySetInnerHTML:{__html:n}})}const kt={head:function(t){const e=i.Children.map(t.children,(t=>i.isValidElement(t)?function(t){if(t.props?.mdxType&&t.props.originalType){const{mdxType:e,originalType:n,...r}=t.props;return i.createElement(t.props.originalType,r)}return t}(t):t));return i.createElement(s.Z,t,e)},code:function(t){const e=["a","abbr","b","br","button","cite","code","del","dfn","em","i","img","input","ins","kbd","label","object","output","q","ruby","s","small","span","strong","sub","sup","time","u","var","wbr"];return i.Children.toArray(t.children).every((t=>"string"==typeof t&&!t.includes("\n")||(0,i.isValidElement)(t)&&e.includes(t.props?.mdxType)))?i.createElement("code",t):i.createElement(V,t)},a:function(t){return i.createElement(G.Z,t)},pre:function(t){return i.createElement(V,(0,i.isValidElement)(t.children)&&"code"===t.children.props?.originalType?t.children.props:{...t})},details:function(t){const e=i.Children.toArray(t.children),n=e.find((t=>i.isValidElement(t)&&"summary"===t.props?.mdxType)),r=i.createElement(i.Fragment,null,e.filter((t=>t!==n)));return i.createElement(it,(0,a.Z)({},t,{summary:n}),r)},ul:function(t){return i.createElement("ul",(0,a.Z)({},t,{className:ot(t.className)}))},img:function(t){return i.createElement("img",(0,a.Z)({loading:"lazy"},t,{className:(e=t.className,(0,c.Z)(e,ct.img))}));var e},h1:t=>i.createElement(at,(0,a.Z)({as:"h1"},t)),h2:t=>i.createElement(at,(0,a.Z)({as:"h2"},t)),h3:t=>i.createElement(at,(0,a.Z)({as:"h3"},t)),h4:t=>i.createElement(at,(0,a.Z)({as:"h4"},t)),h5:t=>i.createElement(at,(0,a.Z)({as:"h5"},t)),h6:t=>i.createElement(at,(0,a.Z)({as:"h6"},t)),admonition:function(t){const{children:e,type:n,title:r,icon:a}=gt(t),s=function(t){const e=ft[t]??t,n=pt[e];return n||(console.warn(`No admonition config found for admonition type "${e}". Using Info as fallback.`),pt.info)}(n),o=r??s.label,{iconComponent:l}=s,h=a??i.createElement(l,null);return i.createElement("div",{className:(0,c.Z)(d.k.common.admonition,d.k.common.admonitionType(t.type),"alert",`alert--${s.infimaClassName}`,lt)},i.createElement("div",{className:ht},i.createElement("span",{className:ut},h),o),i.createElement("div",{className:dt},e))},mermaid:function(t){return i.createElement(yt,null,(()=>i.createElement(vt,t)))}};function wt(t){let{children:e}=t;return i.createElement(r.Zo,{components:kt},e)}},32244:(t,e,n)=>{"use strict";n.d(e,{Z:()=>s});var i=n(67294),r=n(86010),a=n(39960);function s(t){const{permalink:e,title:n,subLabel:s,isNext:o}=t;return i.createElement(a.Z,{className:(0,r.Z)("pagination-nav__link",o?"pagination-nav__link--next":"pagination-nav__link--prev"),to:e},s&&i.createElement("div",{className:"pagination-nav__sublabel"},s),i.createElement("div",{className:"pagination-nav__label"},n))}},13008:(t,e,n)=>{"use strict";n.d(e,{Z:()=>o});var i=n(67294),r=n(86010),a=n(39960);const s={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};function o(t){let{permalink:e,label:n,count:o}=t;return i.createElement(a.Z,{href:e,className:(0,r.Z)(s.tag,o?s.tagWithCount:s.tagRegular)},n,o&&i.createElement("span",null,o))}},71526:(t,e,n)=>{"use strict";n.d(e,{Z:()=>c});var i=n(67294),r=n(86010),a=n(95999),s=n(13008);const o={tags:"tags_jXut",tag:"tag_QGVx"};function c(t){let{tags:e}=t;return i.createElement(i.Fragment,null,i.createElement("b",null,i.createElement(a.Z,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list"},"Tags:")),i.createElement("ul",{className:(0,r.Z)(o.tags,"padding--none","margin-left--sm")},e.map((t=>{let{label:e,permalink:n}=t;return i.createElement("li",{key:n,className:o.tag},i.createElement(s.Z,{label:e,permalink:n}))}))))}},27484:function(t){t.exports=function(){"use strict";var t=1e3,e=6e4,n=36e5,i="millisecond",r="second",a="minute",s="hour",o="day",c="week",l="month",h="quarter",u="year",d="date",p="Invalid Date",f=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,g=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,y={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(t){var e=["th","st","nd","rd"],n=t%100;return"["+t+(e[(n-20)%10]||e[n]||e[0])+"]"}},m=function(t,e,n){var i=String(t);return!i||i.length>=e?t:""+Array(e+1-i.length).join(n)+t},b={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),i=Math.floor(n/60),r=n%60;return(e<=0?"+":"-")+m(i,2,"0")+":"+m(r,2,"0")},m:function t(e,n){if(e.date()<n.date())return-t(n,e);var i=12*(n.year()-e.year())+(n.month()-e.month()),r=e.clone().add(i,l),a=n-r<0,s=e.clone().add(i+(a?-1:1),l);return+(-(i+(n-r)/(a?r-s:s-r))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(t){return{M:l,y:u,w:c,d:o,D:d,h:s,m:a,s:r,ms:i,Q:h}[t]||String(t||"").toLowerCase().replace(/s$/,"")},u:function(t){return void 0===t}},_="en",x={};x[_]=y;var v=function(t){return t instanceof T},k=function t(e,n,i){var r;if(!e)return _;if("string"==typeof e){var a=e.toLowerCase();x[a]&&(r=a),n&&(x[a]=n,r=a);var s=e.split("-");if(!r&&s.length>1)return t(s[0])}else{var o=e.name;x[o]=e,r=o}return!i&&r&&(_=r),r||!i&&_},w=function(t,e){if(v(t))return t.clone();var n="object"==typeof e?e:{};return n.date=t,n.args=arguments,new T(n)},C=b;C.l=k,C.i=v,C.w=function(t,e){return w(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var T=function(){function y(t){this.$L=k(t.locale,null,!0),this.parse(t)}var m=y.prototype;return m.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(C.u(e))return new Date;if(e instanceof Date)return new Date(e);if("string"==typeof e&&!/Z$/i.test(e)){var i=e.match(f);if(i){var r=i[2]-1||0,a=(i[7]||"0").substring(0,3);return n?new Date(Date.UTC(i[1],r,i[3]||1,i[4]||0,i[5]||0,i[6]||0,a)):new Date(i[1],r,i[3]||1,i[4]||0,i[5]||0,i[6]||0,a)}}return new Date(e)}(t),this.$x=t.x||{},this.init()},m.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},m.$utils=function(){return C},m.isValid=function(){return!(this.$d.toString()===p)},m.isSame=function(t,e){var n=w(t);return this.startOf(e)<=n&&n<=this.endOf(e)},m.isAfter=function(t,e){return w(t)<this.startOf(e)},m.isBefore=function(t,e){return this.endOf(e)<w(t)},m.$g=function(t,e,n){return C.u(t)?this[e]:this.set(n,t)},m.unix=function(){return Math.floor(this.valueOf()/1e3)},m.valueOf=function(){return this.$d.getTime()},m.startOf=function(t,e){var n=this,i=!!C.u(e)||e,h=C.p(t),p=function(t,e){var r=C.w(n.$u?Date.UTC(n.$y,e,t):new Date(n.$y,e,t),n);return i?r:r.endOf(o)},f=function(t,e){return C.w(n.toDate()[t].apply(n.toDate("s"),(i?[0,0,0,0]:[23,59,59,999]).slice(e)),n)},g=this.$W,y=this.$M,m=this.$D,b="set"+(this.$u?"UTC":"");switch(h){case u:return i?p(1,0):p(31,11);case l:return i?p(1,y):p(0,y+1);case c:var _=this.$locale().weekStart||0,x=(g<_?g+7:g)-_;return p(i?m-x:m+(6-x),y);case o:case d:return f(b+"Hours",0);case s:return f(b+"Minutes",1);case a:return f(b+"Seconds",2);case r:return f(b+"Milliseconds",3);default:return this.clone()}},m.endOf=function(t){return this.startOf(t,!1)},m.$set=function(t,e){var n,c=C.p(t),h="set"+(this.$u?"UTC":""),p=(n={},n[o]=h+"Date",n[d]=h+"Date",n[l]=h+"Month",n[u]=h+"FullYear",n[s]=h+"Hours",n[a]=h+"Minutes",n[r]=h+"Seconds",n[i]=h+"Milliseconds",n)[c],f=c===o?this.$D+(e-this.$W):e;if(c===l||c===u){var g=this.clone().set(d,1);g.$d[p](f),g.init(),this.$d=g.set(d,Math.min(this.$D,g.daysInMonth())).$d}else p&&this.$d[p](f);return this.init(),this},m.set=function(t,e){return this.clone().$set(t,e)},m.get=function(t){return this[C.p(t)]()},m.add=function(i,h){var d,p=this;i=Number(i);var f=C.p(h),g=function(t){var e=w(p);return C.w(e.date(e.date()+Math.round(t*i)),p)};if(f===l)return this.set(l,this.$M+i);if(f===u)return this.set(u,this.$y+i);if(f===o)return g(1);if(f===c)return g(7);var y=(d={},d[a]=e,d[s]=n,d[r]=t,d)[f]||1,m=this.$d.getTime()+i*y;return C.w(m,this)},m.subtract=function(t,e){return this.add(-1*t,e)},m.format=function(t){var e=this,n=this.$locale();if(!this.isValid())return n.invalidDate||p;var i=t||"YYYY-MM-DDTHH:mm:ssZ",r=C.z(this),a=this.$H,s=this.$m,o=this.$M,c=n.weekdays,l=n.months,h=n.meridiem,u=function(t,n,r,a){return t&&(t[n]||t(e,i))||r[n].slice(0,a)},d=function(t){return C.s(a%12||12,t,"0")},f=h||function(t,e,n){var i=t<12?"AM":"PM";return n?i.toLowerCase():i};return i.replace(g,(function(t,i){return i||function(t){switch(t){case"YY":return String(e.$y).slice(-2);case"YYYY":return C.s(e.$y,4,"0");case"M":return o+1;case"MM":return C.s(o+1,2,"0");case"MMM":return u(n.monthsShort,o,l,3);case"MMMM":return u(l,o);case"D":return e.$D;case"DD":return C.s(e.$D,2,"0");case"d":return String(e.$W);case"dd":return u(n.weekdaysMin,e.$W,c,2);case"ddd":return u(n.weekdaysShort,e.$W,c,3);case"dddd":return c[e.$W];case"H":return String(a);case"HH":return C.s(a,2,"0");case"h":return d(1);case"hh":return d(2);case"a":return f(a,s,!0);case"A":return f(a,s,!1);case"m":return String(s);case"mm":return C.s(s,2,"0");case"s":return String(e.$s);case"ss":return C.s(e.$s,2,"0");case"SSS":return C.s(e.$ms,3,"0");case"Z":return r}return null}(t)||r.replace(":","")}))},m.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},m.diff=function(i,d,p){var f,g=this,y=C.p(d),m=w(i),b=(m.utcOffset()-this.utcOffset())*e,_=this-m,x=function(){return C.m(g,m)};switch(y){case u:f=x()/12;break;case l:f=x();break;case h:f=x()/3;break;case c:f=(_-b)/6048e5;break;case o:f=(_-b)/864e5;break;case s:f=_/n;break;case a:f=_/e;break;case r:f=_/t;break;default:f=_}return p?f:C.a(f)},m.daysInMonth=function(){return this.endOf(l).$D},m.$locale=function(){return x[this.$L]},m.locale=function(t,e){if(!t)return this.$L;var n=this.clone(),i=k(t,e,!0);return i&&(n.$L=i),n},m.clone=function(){return C.w(this.$d,this)},m.toDate=function(){return new Date(this.valueOf())},m.toJSON=function(){return this.isValid()?this.toISOString():null},m.toISOString=function(){return this.$d.toISOString()},m.toString=function(){return this.$d.toUTCString()},y}(),E=T.prototype;return w.prototype=E,[["$ms",i],["$s",r],["$m",a],["$H",s],["$W",o],["$M",l],["$y",u],["$D",d]].forEach((function(t){E[t[1]]=function(e){return this.$g(e,t[0],t[1])}})),w.extend=function(t,e){return t.$i||(t(e,T,w),t.$i=!0),w},w.locale=k,w.isDayjs=v,w.unix=function(t){return w(1e3*t)},w.en=x[_],w.Ls=x,w.p={},w}()},28734:function(t){t.exports=function(){"use strict";return function(t,e){var n=e.prototype,i=n.format;n.format=function(t){var e=this,n=this.$locale();if(!this.isValid())return i.bind(this)(t);var r=this.$utils(),a=(t||"YYYY-MM-DDTHH:mm:ssZ").replace(/\[([^\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g,(function(t){switch(t){case"Q":return Math.ceil((e.$M+1)/3);case"Do":return n.ordinal(e.$D);case"gggg":return e.weekYear();case"GGGG":return e.isoWeekYear();case"wo":return n.ordinal(e.week(),"W");case"w":case"ww":return r.s(e.week(),"w"===t?1:2,"0");case"W":case"WW":return r.s(e.isoWeek(),"W"===t?1:2,"0");case"k":case"kk":return r.s(String(0===e.$H?24:e.$H),"k"===t?1:2,"0");case"X":return Math.floor(e.$d.getTime()/1e3);case"x":return e.$d.getTime();case"z":return"["+e.offsetName()+"]";case"zzz":return"["+e.offsetName("long")+"]";default:return t}}));return i.bind(this)(a)}}}()},10285:function(t){t.exports=function(){"use strict";var t={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},e=/(\[[^[]*\])|([-_:/.,()\s]+)|(A|a|YYYY|YY?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g,n=/\d\d/,i=/\d\d?/,r=/\d*[^-_:/,()\s\d]+/,a={},s=function(t){return(t=+t)+(t>68?1900:2e3)},o=function(t){return function(e){this[t]=+e}},c=[/[+-]\d\d:?(\d\d)?|Z/,function(t){(this.zone||(this.zone={})).offset=function(t){if(!t)return 0;if("Z"===t)return 0;var e=t.match(/([+-]|\d\d)/g),n=60*e[1]+(+e[2]||0);return 0===n?0:"+"===e[0]?-n:n}(t)}],l=function(t){var e=a[t];return e&&(e.indexOf?e:e.s.concat(e.f))},h=function(t,e){var n,i=a.meridiem;if(i){for(var r=1;r<=24;r+=1)if(t.indexOf(i(r,0,e))>-1){n=r>12;break}}else n=t===(e?"pm":"PM");return n},u={A:[r,function(t){this.afternoon=h(t,!1)}],a:[r,function(t){this.afternoon=h(t,!0)}],S:[/\d/,function(t){this.milliseconds=100*+t}],SS:[n,function(t){this.milliseconds=10*+t}],SSS:[/\d{3}/,function(t){this.milliseconds=+t}],s:[i,o("seconds")],ss:[i,o("seconds")],m:[i,o("minutes")],mm:[i,o("minutes")],H:[i,o("hours")],h:[i,o("hours")],HH:[i,o("hours")],hh:[i,o("hours")],D:[i,o("day")],DD:[n,o("day")],Do:[r,function(t){var e=a.ordinal,n=t.match(/\d+/);if(this.day=n[0],e)for(var i=1;i<=31;i+=1)e(i).replace(/\[|\]/g,"")===t&&(this.day=i)}],M:[i,o("month")],MM:[n,o("month")],MMM:[r,function(t){var e=l("months"),n=(l("monthsShort")||e.map((function(t){return t.slice(0,3)}))).indexOf(t)+1;if(n<1)throw new Error;this.month=n%12||n}],MMMM:[r,function(t){var e=l("months").indexOf(t)+1;if(e<1)throw new Error;this.month=e%12||e}],Y:[/[+-]?\d+/,o("year")],YY:[n,function(t){this.year=s(t)}],YYYY:[/\d{4}/,o("year")],Z:c,ZZ:c};function d(n){var i,r;i=n,r=a&&a.formats;for(var s=(n=i.replace(/(\[[^\]]+])|(LTS?|l{1,4}|L{1,4})/g,(function(e,n,i){var a=i&&i.toUpperCase();return n||r[i]||t[i]||r[a].replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g,(function(t,e,n){return e||n.slice(1)}))}))).match(e),o=s.length,c=0;c<o;c+=1){var l=s[c],h=u[l],d=h&&h[0],p=h&&h[1];s[c]=p?{regex:d,parser:p}:l.replace(/^\[|\]$/g,"")}return function(t){for(var e={},n=0,i=0;n<o;n+=1){var r=s[n];if("string"==typeof r)i+=r.length;else{var a=r.regex,c=r.parser,l=t.slice(i),h=a.exec(l)[0];c.call(e,h),t=t.replace(h,"")}}return function(t){var e=t.afternoon;if(void 0!==e){var n=t.hours;e?n<12&&(t.hours+=12):12===n&&(t.hours=0),delete t.afternoon}}(e),e}}return function(t,e,n){n.p.customParseFormat=!0,t&&t.parseTwoDigitYear&&(s=t.parseTwoDigitYear);var i=e.prototype,r=i.parse;i.parse=function(t){var e=t.date,i=t.utc,s=t.args;this.$u=i;var o=s[1];if("string"==typeof o){var c=!0===s[2],l=!0===s[3],h=c||l,u=s[2];l&&(u=s[2]),a=this.$locale(),!c&&u&&(a=n.Ls[u]),this.$d=function(t,e,n){try{if(["x","X"].indexOf(e)>-1)return new Date(("X"===e?1e3:1)*t);var i=d(e)(t),r=i.year,a=i.month,s=i.day,o=i.hours,c=i.minutes,l=i.seconds,h=i.milliseconds,u=i.zone,p=new Date,f=s||(r||a?1:p.getDate()),g=r||p.getFullYear(),y=0;r&&!a||(y=a>0?a-1:p.getMonth());var m=o||0,b=c||0,_=l||0,x=h||0;return u?new Date(Date.UTC(g,y,f,m,b,_,x+60*u.offset*1e3)):n?new Date(Date.UTC(g,y,f,m,b,_,x)):new Date(g,y,f,m,b,_,x)}catch(t){return new Date("")}}(e,o,i),this.init(),u&&!0!==u&&(this.$L=this.locale(u).$L),h&&e!=this.format(o)&&(this.$d=new Date("")),a={}}else if(o instanceof Array)for(var p=o.length,f=1;f<=p;f+=1){s[1]=o[f-1];var g=n.apply(this,s);if(g.isValid()){this.$d=g.$d,this.$L=g.$L,this.init();break}f===p&&(this.$d=new Date(""))}else r.call(this,t)}}}()},59542:function(t){t.exports=function(){"use strict";var t="day";return function(e,n,i){var r=function(e){return e.add(4-e.isoWeekday(),t)},a=n.prototype;a.isoWeekYear=function(){return r(this).year()},a.isoWeek=function(e){if(!this.$utils().u(e))return this.add(7*(e-this.isoWeek()),t);var n,a,s,o=r(this),c=(n=this.isoWeekYear(),s=4-(a=(this.$u?i.utc:i)().year(n).startOf("year")).isoWeekday(),a.isoWeekday()>4&&(s+=7),a.add(s,t));return o.diff(c,"week")+1},a.isoWeekday=function(t){return this.$utils().u(t)?this.day()||7:this.day(this.day()%7?t:t-7)};var s=a.startOf;a.startOf=function(t,e){var n=this.$utils(),i=!!n.u(e)||e;return"isoweek"===n.p(t)?i?this.date(this.date()-(this.isoWeekday()-1)).startOf("day"):this.date(this.date()-1-(this.isoWeekday()-1)+7).endOf("day"):s.bind(this)(t,e)}}}()},27856:function(t){t.exports=function(){"use strict";function t(e){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},t(e)}function e(t,n){return e=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t},e(t,n)}function n(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}function i(t,r,a){return i=n()?Reflect.construct:function(t,n,i){var r=[null];r.push.apply(r,n);var a=new(Function.bind.apply(t,r));return i&&e(a,i.prototype),a},i.apply(null,arguments)}function r(t){return a(t)||s(t)||o(t)||l()}function a(t){if(Array.isArray(t))return c(t)}function s(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}function o(t,e){if(t){if("string"==typeof t)return c(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?c(t,e):void 0}}function c(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n<e;n++)i[n]=t[n];return i}function l(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var h=Object.hasOwnProperty,u=Object.setPrototypeOf,d=Object.isFrozen,p=Object.getPrototypeOf,f=Object.getOwnPropertyDescriptor,g=Object.freeze,y=Object.seal,m=Object.create,b="undefined"!=typeof Reflect&&Reflect,_=b.apply,x=b.construct;_||(_=function(t,e,n){return t.apply(e,n)}),g||(g=function(t){return t}),y||(y=function(t){return t}),x||(x=function(t,e){return i(t,r(e))});var v=D(Array.prototype.forEach),k=D(Array.prototype.pop),w=D(Array.prototype.push),C=D(String.prototype.toLowerCase),T=D(String.prototype.toString),E=D(String.prototype.match),S=D(String.prototype.replace),A=D(String.prototype.indexOf),L=D(String.prototype.trim),B=D(RegExp.prototype.test),N=O(TypeError);function D(t){return function(e){for(var n=arguments.length,i=new Array(n>1?n-1:0),r=1;r<n;r++)i[r-1]=arguments[r];return _(t,e,i)}}function O(t){return function(){for(var e=arguments.length,n=new Array(e),i=0;i<e;i++)n[i]=arguments[i];return x(t,n)}}function M(t,e,n){n=n||C,u&&u(t,null);for(var i=e.length;i--;){var r=e[i];if("string"==typeof r){var a=n(r);a!==r&&(d(e)||(e[i]=a),r=a)}t[r]=!0}return t}function I(t){var e,n=m(null);for(e in t)!0===_(h,t,[e])&&(n[e]=t[e]);return n}function F(t,e){for(;null!==t;){var n=f(t,e);if(n){if(n.get)return D(n.get);if("function"==typeof n.value)return D(n.value)}t=p(t)}function i(t){return console.warn("fallback value for",t),null}return i}var $=g(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),R=g(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","filter","font","g","glyph","glyphref","hkern","image","line","lineargradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),Z=g(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),P=g(["animate","color-profile","cursor","discard","fedropshadow","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),j=g(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover"]),Y=g(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),z=g(["#text"]),U=g(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","face","for","headers","height","hidden","high","href","hreflang","id","inputmode","integrity","ismap","kind","label","lang","list","loading","loop","low","max","maxlength","media","method","min","minlength","multiple","muted","name","nonce","noshade","novalidate","nowrap","open","optimum","pattern","placeholder","playsinline","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","xmlns","slot"]),W=g(["accent-height","accumulate","additive","alignment-baseline","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clippathunits","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","specularconstant","specularexponent","spreadmethod","startoffset","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","systemlanguage","tabindex","targetx","targety","transform","transform-origin","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),q=g(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),H=g(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),V=y(/\{\{[\w\W]*|[\w\W]*\}\}/gm),G=y(/<%[\w\W]*|[\w\W]*%>/gm),X=y(/\${[\w\W]*}/gm),Q=y(/^data-[\-\w.\u00B7-\uFFFF]/),K=y(/^aria-[\-\w]+$/),J=y(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),tt=y(/^(?:\w+script|data):/i),et=y(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),nt=y(/^html$/i),it=function(){return"undefined"==typeof window?null:window},rt=function(e,n){if("object"!==t(e)||"function"!=typeof e.createPolicy)return null;var i=null,r="data-tt-policy-suffix";n.currentScript&&n.currentScript.hasAttribute(r)&&(i=n.currentScript.getAttribute(r));var a="dompurify"+(i?"#"+i:"");try{return e.createPolicy(a,{createHTML:function(t){return t},createScriptURL:function(t){return t}})}catch(s){return console.warn("TrustedTypes policy "+a+" could not be created."),null}};function at(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:it(),n=function(t){return at(t)};if(n.version="2.4.3",n.removed=[],!e||!e.document||9!==e.document.nodeType)return n.isSupported=!1,n;var i=e.document,a=e.document,s=e.DocumentFragment,o=e.HTMLTemplateElement,c=e.Node,l=e.Element,h=e.NodeFilter,u=e.NamedNodeMap,d=void 0===u?e.NamedNodeMap||e.MozNamedAttrMap:u,p=e.HTMLFormElement,f=e.DOMParser,y=e.trustedTypes,m=l.prototype,b=F(m,"cloneNode"),_=F(m,"nextSibling"),x=F(m,"childNodes"),D=F(m,"parentNode");if("function"==typeof o){var O=a.createElement("template");O.content&&O.content.ownerDocument&&(a=O.content.ownerDocument)}var st=rt(y,i),ot=st?st.createHTML(""):"",ct=a,lt=ct.implementation,ht=ct.createNodeIterator,ut=ct.createDocumentFragment,dt=ct.getElementsByTagName,pt=i.importNode,ft={};try{ft=I(a).documentMode?a.documentMode:{}}catch(De){}var gt={};n.isSupported="function"==typeof D&<&&void 0!==lt.createHTMLDocument&&9!==ft;var yt,mt,bt=V,_t=G,xt=X,vt=Q,kt=K,wt=tt,Ct=et,Tt=J,Et=null,St=M({},[].concat(r($),r(R),r(Z),r(j),r(z))),At=null,Lt=M({},[].concat(r(U),r(W),r(q),r(H))),Bt=Object.seal(Object.create(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),Nt=null,Dt=null,Ot=!0,Mt=!0,It=!1,Ft=!1,$t=!1,Rt=!1,Zt=!1,Pt=!1,jt=!1,Yt=!1,zt=!0,Ut=!1,Wt="user-content-",qt=!0,Ht=!1,Vt={},Gt=null,Xt=M({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),Qt=null,Kt=M({},["audio","video","img","source","image","track"]),Jt=null,te=M({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),ee="http://www.w3.org/1998/Math/MathML",ne="http://www.w3.org/2000/svg",ie="http://www.w3.org/1999/xhtml",re=ie,ae=!1,se=null,oe=M({},[ee,ne,ie],T),ce=["application/xhtml+xml","text/html"],le="text/html",he=null,ue=a.createElement("form"),de=function(t){return t instanceof RegExp||t instanceof Function},pe=function(e){he&&he===e||(e&&"object"===t(e)||(e={}),e=I(e),yt=yt=-1===ce.indexOf(e.PARSER_MEDIA_TYPE)?le:e.PARSER_MEDIA_TYPE,mt="application/xhtml+xml"===yt?T:C,Et="ALLOWED_TAGS"in e?M({},e.ALLOWED_TAGS,mt):St,At="ALLOWED_ATTR"in e?M({},e.ALLOWED_ATTR,mt):Lt,se="ALLOWED_NAMESPACES"in e?M({},e.ALLOWED_NAMESPACES,T):oe,Jt="ADD_URI_SAFE_ATTR"in e?M(I(te),e.ADD_URI_SAFE_ATTR,mt):te,Qt="ADD_DATA_URI_TAGS"in e?M(I(Kt),e.ADD_DATA_URI_TAGS,mt):Kt,Gt="FORBID_CONTENTS"in e?M({},e.FORBID_CONTENTS,mt):Xt,Nt="FORBID_TAGS"in e?M({},e.FORBID_TAGS,mt):{},Dt="FORBID_ATTR"in e?M({},e.FORBID_ATTR,mt):{},Vt="USE_PROFILES"in e&&e.USE_PROFILES,Ot=!1!==e.ALLOW_ARIA_ATTR,Mt=!1!==e.ALLOW_DATA_ATTR,It=e.ALLOW_UNKNOWN_PROTOCOLS||!1,Ft=e.SAFE_FOR_TEMPLATES||!1,$t=e.WHOLE_DOCUMENT||!1,Pt=e.RETURN_DOM||!1,jt=e.RETURN_DOM_FRAGMENT||!1,Yt=e.RETURN_TRUSTED_TYPE||!1,Zt=e.FORCE_BODY||!1,zt=!1!==e.SANITIZE_DOM,Ut=e.SANITIZE_NAMED_PROPS||!1,qt=!1!==e.KEEP_CONTENT,Ht=e.IN_PLACE||!1,Tt=e.ALLOWED_URI_REGEXP||Tt,re=e.NAMESPACE||ie,e.CUSTOM_ELEMENT_HANDLING&&de(e.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(Bt.tagNameCheck=e.CUSTOM_ELEMENT_HANDLING.tagNameCheck),e.CUSTOM_ELEMENT_HANDLING&&de(e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(Bt.attributeNameCheck=e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),e.CUSTOM_ELEMENT_HANDLING&&"boolean"==typeof e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(Bt.allowCustomizedBuiltInElements=e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),Ft&&(Mt=!1),jt&&(Pt=!0),Vt&&(Et=M({},r(z)),At=[],!0===Vt.html&&(M(Et,$),M(At,U)),!0===Vt.svg&&(M(Et,R),M(At,W),M(At,H)),!0===Vt.svgFilters&&(M(Et,Z),M(At,W),M(At,H)),!0===Vt.mathMl&&(M(Et,j),M(At,q),M(At,H))),e.ADD_TAGS&&(Et===St&&(Et=I(Et)),M(Et,e.ADD_TAGS,mt)),e.ADD_ATTR&&(At===Lt&&(At=I(At)),M(At,e.ADD_ATTR,mt)),e.ADD_URI_SAFE_ATTR&&M(Jt,e.ADD_URI_SAFE_ATTR,mt),e.FORBID_CONTENTS&&(Gt===Xt&&(Gt=I(Gt)),M(Gt,e.FORBID_CONTENTS,mt)),qt&&(Et["#text"]=!0),$t&&M(Et,["html","head","body"]),Et.table&&(M(Et,["tbody"]),delete Nt.tbody),g&&g(e),he=e)},fe=M({},["mi","mo","mn","ms","mtext"]),ge=M({},["foreignobject","desc","title","annotation-xml"]),ye=M({},["title","style","font","a","script"]),me=M({},R);M(me,Z),M(me,P);var be=M({},j);M(be,Y);var _e=function(t){var e=D(t);e&&e.tagName||(e={namespaceURI:re,tagName:"template"});var n=C(t.tagName),i=C(e.tagName);return!!se[t.namespaceURI]&&(t.namespaceURI===ne?e.namespaceURI===ie?"svg"===n:e.namespaceURI===ee?"svg"===n&&("annotation-xml"===i||fe[i]):Boolean(me[n]):t.namespaceURI===ee?e.namespaceURI===ie?"math"===n:e.namespaceURI===ne?"math"===n&&ge[i]:Boolean(be[n]):t.namespaceURI===ie?!(e.namespaceURI===ne&&!ge[i])&&!(e.namespaceURI===ee&&!fe[i])&&!be[n]&&(ye[n]||!me[n]):!("application/xhtml+xml"!==yt||!se[t.namespaceURI]))},xe=function(t){w(n.removed,{element:t});try{t.parentNode.removeChild(t)}catch(De){try{t.outerHTML=ot}catch(De){t.remove()}}},ve=function(t,e){try{w(n.removed,{attribute:e.getAttributeNode(t),from:e})}catch(De){w(n.removed,{attribute:null,from:e})}if(e.removeAttribute(t),"is"===t&&!At[t])if(Pt||jt)try{xe(e)}catch(De){}else try{e.setAttribute(t,"")}catch(De){}},ke=function(t){var e,n;if(Zt)t="<remove></remove>"+t;else{var i=E(t,/^[\r\n\t ]+/);n=i&&i[0]}"application/xhtml+xml"===yt&&re===ie&&(t='<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>'+t+"</body></html>");var r=st?st.createHTML(t):t;if(re===ie)try{e=(new f).parseFromString(r,yt)}catch(De){}if(!e||!e.documentElement){e=lt.createDocument(re,"template",null);try{e.documentElement.innerHTML=ae?ot:r}catch(De){}}var s=e.body||e.documentElement;return t&&n&&s.insertBefore(a.createTextNode(n),s.childNodes[0]||null),re===ie?dt.call(e,$t?"html":"body")[0]:$t?e.documentElement:s},we=function(t){return ht.call(t.ownerDocument||t,t,h.SHOW_ELEMENT|h.SHOW_COMMENT|h.SHOW_TEXT,null,!1)},Ce=function(t){return t instanceof p&&("string"!=typeof t.nodeName||"string"!=typeof t.textContent||"function"!=typeof t.removeChild||!(t.attributes instanceof d)||"function"!=typeof t.removeAttribute||"function"!=typeof t.setAttribute||"string"!=typeof t.namespaceURI||"function"!=typeof t.insertBefore||"function"!=typeof t.hasChildNodes)},Te=function(e){return"object"===t(c)?e instanceof c:e&&"object"===t(e)&&"number"==typeof e.nodeType&&"string"==typeof e.nodeName},Ee=function(t,e,i){gt[t]&&v(gt[t],(function(t){t.call(n,e,i,he)}))},Se=function(t){var e;if(Ee("beforeSanitizeElements",t,null),Ce(t))return xe(t),!0;if(B(/[\u0080-\uFFFF]/,t.nodeName))return xe(t),!0;var i=mt(t.nodeName);if(Ee("uponSanitizeElement",t,{tagName:i,allowedTags:Et}),t.hasChildNodes()&&!Te(t.firstElementChild)&&(!Te(t.content)||!Te(t.content.firstElementChild))&&B(/<[/\w]/g,t.innerHTML)&&B(/<[/\w]/g,t.textContent))return xe(t),!0;if("select"===i&&B(/<template/i,t.innerHTML))return xe(t),!0;if(!Et[i]||Nt[i]){if(!Nt[i]&&Le(i)){if(Bt.tagNameCheck instanceof RegExp&&B(Bt.tagNameCheck,i))return!1;if(Bt.tagNameCheck instanceof Function&&Bt.tagNameCheck(i))return!1}if(qt&&!Gt[i]){var r=D(t)||t.parentNode,a=x(t)||t.childNodes;if(a&&r)for(var s=a.length-1;s>=0;--s)r.insertBefore(b(a[s],!0),_(t))}return xe(t),!0}return t instanceof l&&!_e(t)?(xe(t),!0):"noscript"!==i&&"noembed"!==i||!B(/<\/no(script|embed)/i,t.innerHTML)?(Ft&&3===t.nodeType&&(e=t.textContent,e=S(e,bt," "),e=S(e,_t," "),e=S(e,xt," "),t.textContent!==e&&(w(n.removed,{element:t.cloneNode()}),t.textContent=e)),Ee("afterSanitizeElements",t,null),!1):(xe(t),!0)},Ae=function(t,e,n){if(zt&&("id"===e||"name"===e)&&(n in a||n in ue))return!1;if(Mt&&!Dt[e]&&B(vt,e));else if(Ot&&B(kt,e));else if(!At[e]||Dt[e]){if(!(Le(t)&&(Bt.tagNameCheck instanceof RegExp&&B(Bt.tagNameCheck,t)||Bt.tagNameCheck instanceof Function&&Bt.tagNameCheck(t))&&(Bt.attributeNameCheck instanceof RegExp&&B(Bt.attributeNameCheck,e)||Bt.attributeNameCheck instanceof Function&&Bt.attributeNameCheck(e))||"is"===e&&Bt.allowCustomizedBuiltInElements&&(Bt.tagNameCheck instanceof RegExp&&B(Bt.tagNameCheck,n)||Bt.tagNameCheck instanceof Function&&Bt.tagNameCheck(n))))return!1}else if(Jt[e]);else if(B(Tt,S(n,Ct,"")));else if("src"!==e&&"xlink:href"!==e&&"href"!==e||"script"===t||0!==A(n,"data:")||!Qt[t])if(It&&!B(wt,S(n,Ct,"")));else if(n)return!1;return!0},Le=function(t){return t.indexOf("-")>0},Be=function(e){var i,r,a,s;Ee("beforeSanitizeAttributes",e,null);var o=e.attributes;if(o){var c={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:At};for(s=o.length;s--;){var l=i=o[s],h=l.name,u=l.namespaceURI;if(r="value"===h?i.value:L(i.value),a=mt(h),c.attrName=a,c.attrValue=r,c.keepAttr=!0,c.forceKeepAttr=void 0,Ee("uponSanitizeAttribute",e,c),r=c.attrValue,!c.forceKeepAttr&&(ve(h,e),c.keepAttr))if(B(/\/>/i,r))ve(h,e);else{Ft&&(r=S(r,bt," "),r=S(r,_t," "),r=S(r,xt," "));var d=mt(e.nodeName);if(Ae(d,a,r)){if(!Ut||"id"!==a&&"name"!==a||(ve(h,e),r=Wt+r),st&&"object"===t(y)&&"function"==typeof y.getAttributeType)if(u);else switch(y.getAttributeType(d,a)){case"TrustedHTML":r=st.createHTML(r);break;case"TrustedScriptURL":r=st.createScriptURL(r)}try{u?e.setAttributeNS(u,h,r):e.setAttribute(h,r),k(n.removed)}catch(De){}}}}Ee("afterSanitizeAttributes",e,null)}},Ne=function t(e){var n,i=we(e);for(Ee("beforeSanitizeShadowDOM",e,null);n=i.nextNode();)Ee("uponSanitizeShadowNode",n,null),Se(n)||(n.content instanceof s&&t(n.content),Be(n));Ee("afterSanitizeShadowDOM",e,null)};return n.sanitize=function(r){var a,o,l,h,u,d=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if((ae=!r)&&(r="\x3c!--\x3e"),"string"!=typeof r&&!Te(r)){if("function"!=typeof r.toString)throw N("toString is not a function");if("string"!=typeof(r=r.toString()))throw N("dirty is not a string, aborting")}if(!n.isSupported){if("object"===t(e.toStaticHTML)||"function"==typeof e.toStaticHTML){if("string"==typeof r)return e.toStaticHTML(r);if(Te(r))return e.toStaticHTML(r.outerHTML)}return r}if(Rt||pe(d),n.removed=[],"string"==typeof r&&(Ht=!1),Ht){if(r.nodeName){var p=mt(r.nodeName);if(!Et[p]||Nt[p])throw N("root node is forbidden and cannot be sanitized in-place")}}else if(r instanceof c)1===(o=(a=ke("\x3c!----\x3e")).ownerDocument.importNode(r,!0)).nodeType&&"BODY"===o.nodeName||"HTML"===o.nodeName?a=o:a.appendChild(o);else{if(!Pt&&!Ft&&!$t&&-1===r.indexOf("<"))return st&&Yt?st.createHTML(r):r;if(!(a=ke(r)))return Pt?null:Yt?ot:""}a&&Zt&&xe(a.firstChild);for(var f=we(Ht?r:a);l=f.nextNode();)3===l.nodeType&&l===h||Se(l)||(l.content instanceof s&&Ne(l.content),Be(l),h=l);if(h=null,Ht)return r;if(Pt){if(jt)for(u=ut.call(a.ownerDocument);a.firstChild;)u.appendChild(a.firstChild);else u=a;return At.shadowroot&&(u=pt.call(i,u,!0)),u}var g=$t?a.outerHTML:a.innerHTML;return $t&&Et["!doctype"]&&a.ownerDocument&&a.ownerDocument.doctype&&a.ownerDocument.doctype.name&&B(nt,a.ownerDocument.doctype.name)&&(g="<!DOCTYPE "+a.ownerDocument.doctype.name+">\n"+g),Ft&&(g=S(g,bt," "),g=S(g,_t," "),g=S(g,xt," ")),st&&Yt?st.createHTML(g):g},n.setConfig=function(t){pe(t),Rt=!0},n.clearConfig=function(){he=null,Rt=!1},n.isValidAttribute=function(t,e,n){he||pe({});var i=mt(t),r=mt(e);return Ae(i,r,n)},n.addHook=function(t,e){"function"==typeof e&&(gt[t]=gt[t]||[],w(gt[t],e))},n.removeHook=function(t){if(gt[t])return k(gt[t])},n.removeHooks=function(t){gt[t]&&(gt[t]=[])},n.removeAllHooks=function(){gt={}},n}return at()}()},16432:(t,e,n)=>{"use strict";n.d(e,{a:()=>Pn,b:()=>Ys,c:()=>jt,d:()=>Rn,e:()=>Zt,f:()=>Vs,g:()=>ui,h:()=>wc,i:()=>ys,j:()=>qi,k:()=>Vi,l:()=>Bt,m:()=>Ri,n:()=>It,o:()=>Sp,p:()=>Co,s:()=>_i});const i=function(t){for(var e=[],n=1;n<arguments.length;n++)e[n-1]=arguments[n];var i=Array.from("string"==typeof t?[t]:t);i[i.length-1]=i[i.length-1].replace(/\r?\n([\t ]*)$/,"");var r=i.reduce((function(t,e){var n=e.match(/\n([\t ]+|(?!\s).)/g);return n?t.concat(n.map((function(t){var e,n;return null!==(n=null===(e=t.match(/[\t ]/g))||void 0===e?void 0:e.length)&&void 0!==n?n:0}))):t}),[]);if(r.length){var a=new RegExp("\n[\t ]{"+Math.min.apply(Math,r)+"}","g");i=i.map((function(t){return t.replace(a,"\n")}))}i[0]=i[0].replace(/^\r?\n/,"");var s=i[0];return e.forEach((function(t,e){var n=s.match(/(?:^|\n)( *)$/),r=n?n[1]:"",a=t;"string"==typeof t&&t.includes("\n")&&(a=String(t).split("\n").map((function(t,e){return 0===e?t:""+r+t})).join("\n")),s+=a+i[e+1]})),s};var r=n(27484),a=n.n(r),s=n(17967),o=n(59373),l=n(27856),h=n.n(l),u=n(71610),d=n(61691);const p=(t,e)=>{const n=u.Z.parse(t);for(const i in e)n[i]=d.Z.channel.clamp[i](e[i]);return u.Z.stringify(n)},f=(t,e)=>{const n=u.Z.parse(t),i={};for(const r in e)e[r]&&(i[r]=n[r]+e[r]);return p(t,i)};var g=n(21883);const y=(t,e,n=0,i=1)=>{if("number"!=typeof t)return p(t,{a:e});const r=g.Z.set({r:d.Z.channel.clamp.r(t),g:d.Z.channel.clamp.g(e),b:d.Z.channel.clamp.b(n),a:d.Z.channel.clamp.a(i)});return u.Z.stringify(r)},m=(t,e,n=50)=>{const{r:i,g:r,b:a,a:s}=u.Z.parse(t),{r:o,g:c,b:l,a:h}=u.Z.parse(e),d=n/100,p=2*d-1,f=s-h,g=((p*f==-1?p:(p+f)/(1+p*f))+1)/2,m=1-g;return y(i*g+o*m,r*g+c*m,a*g+l*m,s*d+h*(1-d))},b=(t,e=100)=>{const n=u.Z.parse(t);return n.r=255-n.r,n.g=255-n.g,n.b=255-n.b,m(n,t,e)};var _=n(7201),x=n(12281),v=n(42454),k="comm",w="rule",C="decl",T=Math.abs,E=String.fromCharCode;Object.assign;function S(t){return t.trim()}function A(t,e,n){return t.replace(e,n)}function L(t,e){return t.indexOf(e)}function B(t,e){return 0|t.charCodeAt(e)}function N(t,e,n){return t.slice(e,n)}function D(t){return t.length}function O(t,e){return e.push(t),t}function M(t,e){for(var n="",i=0;i<t.length;i++)n+=e(t[i],i,t,e)||"";return n}function I(t,e,n,i){switch(t.type){case"@layer":if(t.children.length)break;case"@import":case C:return t.return=t.return||t.value;case k:return"";case"@keyframes":return t.return=t.value+"{"+M(t.children,i)+"}";case w:if(!D(t.value=t.props.join(",")))return""}return D(n=M(t.children,i))?t.return=t.value+"{"+n+"}":""}var F=1,$=1,R=0,Z=0,P=0,j="";function Y(t,e,n,i,r,a,s,o){return{value:t,root:e,parent:n,type:i,props:r,children:a,line:F,column:$,length:s,return:"",siblings:o}}function z(){return P=Z>0?B(j,--Z):0,$--,10===P&&($=1,F--),P}function U(){return P=Z<R?B(j,Z++):0,$++,10===P&&($=1,F++),P}function W(){return B(j,Z)}function q(){return Z}function H(t,e){return N(j,t,e)}function V(t){switch(t){case 0:case 9:case 10:case 13:case 32:return 5;case 33:case 43:case 44:case 47:case 62:case 64:case 126:case 59:case 123:case 125:return 4;case 58:return 3;case 34:case 39:case 40:case 91:return 2;case 41:case 93:return 1}return 0}function G(t){return F=$=1,R=D(j=t),Z=0,[]}function X(t){return j="",t}function Q(t){return S(H(Z-1,tt(91===t?t+2:40===t?t+1:t)))}function K(t){for(;(P=W())&&P<33;)U();return V(t)>2||V(P)>3?"":" "}function J(t,e){for(;--e&&U()&&!(P<48||P>102||P>57&&P<65||P>70&&P<97););return H(t,q()+(e<6&&32==W()&&32==U()))}function tt(t){for(;U();)switch(P){case t:return Z;case 34:case 39:34!==t&&39!==t&&tt(P);break;case 40:41===t&&tt(t);break;case 92:U()}return Z}function et(t,e){for(;U()&&t+P!==57&&(t+P!==84||47!==W()););return"/*"+H(e,Z-1)+"*"+E(47===t?t:U())}function nt(t){for(;!V(W());)U();return H(t,Z)}function it(t){return X(rt("",null,null,null,[""],t=G(t),0,[0],t))}function rt(t,e,n,i,r,a,s,o,c){for(var l=0,h=0,u=s,d=0,p=0,f=0,g=1,y=1,m=1,b=0,_="",x=r,v=a,k=i,w=_;y;)switch(f=b,b=U()){case 40:if(108!=f&&58==B(w,u-1)){-1!=L(w+=A(Q(b),"&","&\f"),"&\f")&&(m=-1);break}case 34:case 39:case 91:w+=Q(b);break;case 9:case 10:case 13:case 32:w+=K(f);break;case 92:w+=J(q()-1,7);continue;case 47:switch(W()){case 42:case 47:O(st(et(U(),q()),e,n,c),c);break;default:w+="/"}break;case 123*g:o[l++]=D(w)*m;case 125*g:case 59:case 0:switch(b){case 0:case 125:y=0;case 59+h:-1==m&&(w=A(w,/\f/g,"")),p>0&&D(w)-u&&O(p>32?ot(w+";",i,n,u-1,c):ot(A(w," ","")+";",i,n,u-2,c),c);break;case 59:w+=";";default:if(O(k=at(w,e,n,l,h,r,o,_,x=[],v=[],u,a),a),123===b)if(0===h)rt(w,e,k,k,x,a,u,o,v);else switch(99===d&&110===B(w,3)?100:d){case 100:case 108:case 109:case 115:rt(t,k,k,i&&O(at(t,k,k,0,0,r,o,_,r,x=[],u,v),v),r,v,u,o,i?x:v);break;default:rt(w,k,k,k,[""],v,0,o,v)}}l=h=p=0,g=m=1,_=w="",u=s;break;case 58:u=1+D(w),p=f;default:if(g<1)if(123==b)--g;else if(125==b&&0==g++&&125==z())continue;switch(w+=E(b),b*g){case 38:m=h>0?1:(w+="\f",-1);break;case 44:o[l++]=(D(w)-1)*m,m=1;break;case 64:45===W()&&(w+=Q(U())),d=W(),h=u=D(_=w+=nt(q())),b++;break;case 45:45===f&&2==D(w)&&(g=0)}}return a}function at(t,e,n,i,r,a,s,o,c,l,h,u){for(var d=r-1,p=0===r?a:[""],f=function(t){return t.length}(p),g=0,y=0,m=0;g<i;++g)for(var b=0,_=N(t,d+1,d=T(y=s[g])),x=t;b<f;++b)(x=S(y>0?p[b]+" "+_:A(_,/&\f/g,p[b])))&&(c[m++]=x);return Y(t,e,n,0===r?w:o,c,l,h,u)}function st(t,e,n,i){return Y(t,e,n,k,E(P),N(t,2,-2),0,i)}function ot(t,e,n,i,r){return Y(t,e,n,C,N(t,0,i),N(t,i+1,-1),i,r)}var ct=n(70277),lt=n(45625),ht=n(39354);const ut=[];for(let c=0;c<256;++c)ut.push((c+256).toString(16).slice(1));function dt(t,e=0){return(ut[t[e+0]]+ut[t[e+1]]+ut[t[e+2]]+ut[t[e+3]]+"-"+ut[t[e+4]]+ut[t[e+5]]+"-"+ut[t[e+6]]+ut[t[e+7]]+"-"+ut[t[e+8]]+ut[t[e+9]]+"-"+ut[t[e+10]]+ut[t[e+11]]+ut[t[e+12]]+ut[t[e+13]]+ut[t[e+14]]+ut[t[e+15]]).toLowerCase()}const pt=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;const ft=function(t){return"string"==typeof t&&pt.test(t)};const gt=function(t){if(!ft(t))throw TypeError("Invalid UUID");let e;const n=new Uint8Array(16);return n[0]=(e=parseInt(t.slice(0,8),16))>>>24,n[1]=e>>>16&255,n[2]=e>>>8&255,n[3]=255&e,n[4]=(e=parseInt(t.slice(9,13),16))>>>8,n[5]=255&e,n[6]=(e=parseInt(t.slice(14,18),16))>>>8,n[7]=255&e,n[8]=(e=parseInt(t.slice(19,23),16))>>>8,n[9]=255&e,n[10]=(e=parseInt(t.slice(24,36),16))/1099511627776&255,n[11]=e/4294967296&255,n[12]=e>>>24&255,n[13]=e>>>16&255,n[14]=e>>>8&255,n[15]=255&e,n};function yt(t,e,n,i){switch(t){case 0:return e&n^~e&i;case 1:case 3:return e^n^i;case 2:return e&n^e&i^n&i}}function mt(t,e){return t<<e|t>>>32-e}const bt=function(t){const e=[1518500249,1859775393,2400959708,3395469782],n=[1732584193,4023233417,2562383102,271733878,3285377520];if("string"==typeof t){const e=unescape(encodeURIComponent(t));t=[];for(let n=0;n<e.length;++n)t.push(e.charCodeAt(n))}else Array.isArray(t)||(t=Array.prototype.slice.call(t));t.push(128);const i=t.length/4+2,r=Math.ceil(i/16),a=new Array(r);for(let s=0;s<r;++s){const e=new Uint32Array(16);for(let n=0;n<16;++n)e[n]=t[64*s+4*n]<<24|t[64*s+4*n+1]<<16|t[64*s+4*n+2]<<8|t[64*s+4*n+3];a[s]=e}a[r-1][14]=8*(t.length-1)/Math.pow(2,32),a[r-1][14]=Math.floor(a[r-1][14]),a[r-1][15]=8*(t.length-1)&4294967295;for(let s=0;s<r;++s){const t=new Uint32Array(80);for(let e=0;e<16;++e)t[e]=a[s][e];for(let e=16;e<80;++e)t[e]=mt(t[e-3]^t[e-8]^t[e-14]^t[e-16],1);let i=n[0],r=n[1],o=n[2],c=n[3],l=n[4];for(let n=0;n<80;++n){const a=Math.floor(n/20),s=mt(i,5)+yt(a,r,o,c)+l+e[a]+t[n]>>>0;l=c,c=o,o=mt(r,30)>>>0,r=i,i=s}n[0]=n[0]+i>>>0,n[1]=n[1]+r>>>0,n[2]=n[2]+o>>>0,n[3]=n[3]+c>>>0,n[4]=n[4]+l>>>0}return[n[0]>>24&255,n[0]>>16&255,n[0]>>8&255,255&n[0],n[1]>>24&255,n[1]>>16&255,n[1]>>8&255,255&n[1],n[2]>>24&255,n[2]>>16&255,n[2]>>8&255,255&n[2],n[3]>>24&255,n[3]>>16&255,n[3]>>8&255,255&n[3],n[4]>>24&255,n[4]>>16&255,n[4]>>8&255,255&n[4]]},_t=function(t,e,n){function i(t,i,r,a){var s;if("string"==typeof t&&(t=function(t){t=unescape(encodeURIComponent(t));const e=[];for(let n=0;n<t.length;++n)e.push(t.charCodeAt(n));return e}(t)),"string"==typeof i&&(i=gt(i)),16!==(null===(s=i)||void 0===s?void 0:s.length))throw TypeError("Namespace must be array-like (16 iterable integer values, 0-255)");let o=new Uint8Array(16+t.length);if(o.set(i),o.set(t,i.length),o=n(o),o[6]=15&o[6]|e,o[8]=63&o[8]|128,r){a=a||0;for(let t=0;t<16;++t)r[a+t]=o[t];return r}return dt(o)}try{i.name=t}catch(r){}return i.DNS="6ba7b810-9dad-11d1-80b4-00c04fd430c8",i.URL="6ba7b811-9dad-11d1-80b4-00c04fd430c8",i}("v5",80,bt),xt=_t;n(91518),n(96225);var vt=n(43349),kt=(n(23352),n(22930),n(59542)),wt=n.n(kt),Ct=n(10285),Tt=n.n(Ct),Et=n(28734),St=n.n(Et),At=n(79697);const Lt={trace:0,debug:1,info:2,warn:3,error:4,fatal:5},Bt={trace:(...t)=>{},debug:(...t)=>{},info:(...t)=>{},warn:(...t)=>{},error:(...t)=>{},fatal:(...t)=>{}},Nt=function(t="fatal"){let e=Lt.fatal;"string"==typeof t?(t=t.toLowerCase())in Lt&&(e=Lt[t]):"number"==typeof t&&(e=t),Bt.trace=()=>{},Bt.debug=()=>{},Bt.info=()=>{},Bt.warn=()=>{},Bt.error=()=>{},Bt.fatal=()=>{},e<=Lt.fatal&&(Bt.fatal=console.error?console.error.bind(console,Dt("FATAL"),"color: orange"):console.log.bind(console,"\x1b[35m",Dt("FATAL"))),e<=Lt.error&&(Bt.error=console.error?console.error.bind(console,Dt("ERROR"),"color: orange"):console.log.bind(console,"\x1b[31m",Dt("ERROR"))),e<=Lt.warn&&(Bt.warn=console.warn?console.warn.bind(console,Dt("WARN"),"color: orange"):console.log.bind(console,"\x1b[33m",Dt("WARN"))),e<=Lt.info&&(Bt.info=console.info?console.info.bind(console,Dt("INFO"),"color: lightblue"):console.log.bind(console,"\x1b[34m",Dt("INFO"))),e<=Lt.debug&&(Bt.debug=console.debug?console.debug.bind(console,Dt("DEBUG"),"color: lightgreen"):console.log.bind(console,"\x1b[32m",Dt("DEBUG"))),e<=Lt.trace&&(Bt.trace=console.debug?console.debug.bind(console,Dt("TRACE"),"color: lightgreen"):console.log.bind(console,"\x1b[32m",Dt("TRACE")))},Dt=t=>`%c${a()().format("ss.SSS")} : ${t} : `,Ot=t=>h().sanitize(t),Mt=(t,e)=>{var n;if(!1!==(null==(n=e.flowchart)?void 0:n.htmlLabels)){const n=e.securityLevel;"antiscript"===n||"strict"===n?t=Ot(t):"loose"!==n&&(t=(t=(t=Rt(t)).replace(/</g,"<").replace(/>/g,">")).replace(/=/g,"="),t=$t(t))}return t},It=(t,e)=>t?t=e.dompurifyConfig?h().sanitize(Mt(t,e),e.dompurifyConfig).toString():h().sanitize(Mt(t,e),{FORBID_TAGS:["style"]}).toString():t,Ft=/<br\s*\/?>/gi,$t=t=>t.replace(/#br#/g,"<br/>"),Rt=t=>t.replace(Ft,"#br#"),Zt=t=>!1!==t&&!["false","null","0"].includes(String(t).trim().toLowerCase()),Pt=function(t){let e=t;if(t.split("~").length-1>=2){let t=e;do{e=t,t=e.replace(/~([^\s,:;]+)~/,"<$1>")}while(t!=e);return Pt(t)}return e},jt={getRows:t=>{if(!t)return[""];return Rt(t).replace(/\\n/g,"#br#").split("#br#")},sanitizeText:It,sanitizeTextOrArray:(t,e)=>"string"==typeof t?It(t,e):t.flat().map((t=>It(t,e))),hasBreaks:t=>Ft.test(t),splitBreaks:t=>t.split(Ft),lineBreakRegex:Ft,removeScript:Ot,getUrl:t=>{let e="";return t&&(e=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,e=e.replaceAll(/\(/g,"\\("),e=e.replaceAll(/\)/g,"\\)")),e},evaluate:Zt},Yt=(t,e)=>f(t,e?{s:-40,l:10}:{s:-40,l:-10}),zt="#ffffff",Ut="#f2f2f2";class Wt{constructor(){this.primaryColor="#eee",this.contrast="#707070",this.secondaryColor=(0,x.Z)(this.contrast,55),this.background="#ffffff",this.tertiaryColor=f(this.primaryColor,{h:-160}),this.primaryBorderColor=Yt(this.primaryColor,this.darkMode),this.secondaryBorderColor=Yt(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=Yt(this.tertiaryColor,this.darkMode),this.primaryTextColor=b(this.primaryColor),this.secondaryTextColor=b(this.secondaryColor),this.tertiaryTextColor=b(this.tertiaryColor),this.lineColor=b(this.background),this.textColor=b(this.background),this.mainBkg="#eee",this.secondBkg="calculated",this.lineColor="#666",this.border1="#999",this.border2="calculated",this.note="#ffa",this.text="#333",this.critical="#d42",this.done="#bbb",this.arrowheadColor="#333333",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="calculated",this.edgeLabelBackground="white",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="calculated",this.actorLineColor="calculated",this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="calculated",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="calculated",this.altSectionBkgColor="white",this.sectionBkgColor2="calculated",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="calculated",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="calculated",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="calculated",this.critBkgColor="calculated",this.critBorderColor="calculated",this.todayLineColor="calculated",this.personBorder="calculated",this.personBkg="calculated",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222"}updateColors(){this.secondBkg=(0,x.Z)(this.contrast,55),this.border2=this.contrast,this.cScale0=this.cScale0||"#555",this.cScale1=this.cScale1||"#F4F4F4",this.cScale2=this.cScale2||"#555",this.cScale3=this.cScale3||"#BBB",this.cScale4=this.cScale4||"#777",this.cScale5=this.cScale5||"#999",this.cScale6=this.cScale6||"#DDD",this.cScale7=this.cScale7||"#FFF",this.cScale8=this.cScale8||"#DDD",this.cScale9=this.cScale9||"#BBB",this.cScale10=this.cScale10||"#999",this.cScale11=this.cScale11||"#777";for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleInv"+t]=this["cScaleInv"+t]||b(this["cScale"+t]);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this.darkMode?this["cScalePeer"+t]=this["cScalePeer"+t]||(0,x.Z)(this["cScale"+t],10):this["cScalePeer"+t]=this["cScalePeer"+t]||(0,_.Z)(this["cScale"+t],10);this.scaleLabelColor=this.scaleLabelColor||(this.darkMode?"black":this.labelTextColor),this.cScaleLabel0=this.cScaleLabel0||this.cScale1,this.cScaleLabel2=this.cScaleLabel2||this.cScale1;for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleLabel"+t]=this["cScaleLabel"+t]||this.scaleLabelColor;for(let t=0;t<5;t++)this["surface"+t]=this["surface"+t]||f(this.mainBkg,{l:-(5+5*t)}),this["surfacePeer"+t]=this["surfacePeer"+t]||f(this.mainBkg,{l:-(8+5*t)});this.nodeBkg=this.mainBkg,this.nodeBorder=this.border1,this.clusterBkg=this.secondBkg,this.clusterBorder=this.border2,this.defaultLinkColor=this.lineColor,this.titleColor=this.text,this.actorBorder=(0,x.Z)(this.border1,23),this.actorBkg=this.mainBkg,this.actorTextColor=this.text,this.actorLineColor=this.lineColor,this.signalColor=this.text,this.signalTextColor=this.text,this.labelBoxBkgColor=this.actorBkg,this.labelBoxBorderColor=this.actorBorder,this.labelTextColor=this.text,this.loopTextColor=this.text,this.noteBorderColor="#999",this.noteBkgColor="#666",this.noteTextColor="#fff",this.sectionBkgColor=(0,x.Z)(this.contrast,30),this.sectionBkgColor2=(0,x.Z)(this.contrast,30),this.taskBorderColor=(0,_.Z)(this.contrast,10),this.taskBkgColor=this.contrast,this.taskTextColor=this.taskTextLightColor,this.taskTextDarkColor=this.text,this.taskTextOutsideColor=this.taskTextDarkColor,this.activeTaskBorderColor=this.taskBorderColor,this.activeTaskBkgColor=this.mainBkg,this.gridColor=(0,x.Z)(this.border1,30),this.doneTaskBkgColor=this.done,this.doneTaskBorderColor=this.lineColor,this.critBkgColor=this.critical,this.critBorderColor=(0,_.Z)(this.critBkgColor,10),this.todayLineColor=this.critBkgColor,this.transitionColor=this.transitionColor||"#000",this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||"#f4f4f4",this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.stateBorder=this.stateBorder||"#000",this.innerEndBackground=this.primaryBorderColor,this.specialStateColor="#222",this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.classText=this.primaryTextColor,this.fillType0=this.primaryColor,this.fillType1=this.secondaryColor,this.fillType2=f(this.primaryColor,{h:64}),this.fillType3=f(this.secondaryColor,{h:64}),this.fillType4=f(this.primaryColor,{h:-64}),this.fillType5=f(this.secondaryColor,{h:-64}),this.fillType6=f(this.primaryColor,{h:128}),this.fillType7=f(this.secondaryColor,{h:128});for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["pie"+t]=this["cScale"+t];this.pie12=this.pie0,this.pieTitleTextSize=this.pieTitleTextSize||"25px",this.pieTitleTextColor=this.pieTitleTextColor||this.taskTextDarkColor,this.pieSectionTextSize=this.pieSectionTextSize||"17px",this.pieSectionTextColor=this.pieSectionTextColor||this.textColor,this.pieLegendTextSize=this.pieLegendTextSize||"17px",this.pieLegendTextColor=this.pieLegendTextColor||this.taskTextDarkColor,this.pieStrokeColor=this.pieStrokeColor||"black",this.pieStrokeWidth=this.pieStrokeWidth||"2px",this.pieOpacity=this.pieOpacity||"0.7",this.requirementBackground=this.requirementBackground||this.primaryColor,this.requirementBorderColor=this.requirementBorderColor||this.primaryBorderColor,this.requirementBorderSize=this.requirementBorderSize||this.primaryBorderColor,this.requirementTextColor=this.requirementTextColor||this.primaryTextColor,this.relationColor=this.relationColor||this.lineColor,this.relationLabelBackground=this.relationLabelBackground||this.edgeLabelBackground,this.relationLabelColor=this.relationLabelColor||this.actorTextColor,this.git0=(0,_.Z)(this.pie1,25)||this.primaryColor,this.git1=this.pie2||this.secondaryColor,this.git2=this.pie3||this.tertiaryColor,this.git3=this.pie4||f(this.primaryColor,{h:-30}),this.git4=this.pie5||f(this.primaryColor,{h:-60}),this.git5=this.pie6||f(this.primaryColor,{h:-90}),this.git6=this.pie7||f(this.primaryColor,{h:60}),this.git7=this.pie8||f(this.primaryColor,{h:120}),this.gitInv0=this.gitInv0||b(this.git0),this.gitInv1=this.gitInv1||b(this.git1),this.gitInv2=this.gitInv2||b(this.git2),this.gitInv3=this.gitInv3||b(this.git3),this.gitInv4=this.gitInv4||b(this.git4),this.gitInv5=this.gitInv5||b(this.git5),this.gitInv6=this.gitInv6||b(this.git6),this.gitInv7=this.gitInv7||b(this.git7),this.branchLabelColor=this.branchLabelColor||this.labelTextColor,this.gitBranchLabel0=this.branchLabelColor,this.gitBranchLabel1="white",this.gitBranchLabel2=this.branchLabelColor,this.gitBranchLabel3="white",this.gitBranchLabel4=this.branchLabelColor,this.gitBranchLabel5=this.branchLabelColor,this.gitBranchLabel6=this.branchLabelColor,this.gitBranchLabel7=this.branchLabelColor,this.tagLabelColor=this.tagLabelColor||this.primaryTextColor,this.tagLabelBackground=this.tagLabelBackground||this.primaryColor,this.tagLabelBorder=this.tagBorder||this.primaryBorderColor,this.tagLabelFontSize=this.tagLabelFontSize||"10px",this.commitLabelColor=this.commitLabelColor||this.secondaryTextColor,this.commitLabelBackground=this.commitLabelBackground||this.secondaryColor,this.commitLabelFontSize=this.commitLabelFontSize||"10px",this.attributeBackgroundColorOdd=this.attributeBackgroundColorOdd||zt,this.attributeBackgroundColorEven=this.attributeBackgroundColorEven||Ut}calculate(t){if("object"!=typeof t)return void this.updateColors();const e=Object.keys(t);e.forEach((e=>{this[e]=t[e]})),this.updateColors(),e.forEach((e=>{this[e]=t[e]}))}}const qt={base:{getThemeVariables:t=>{const e=new class{constructor(){this.background="#f4f4f4",this.primaryColor="#fff4dd",this.noteBkgColor="#fff5ad",this.noteTextColor="#333",this.THEME_COLOR_LIMIT=12,this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px"}updateColors(){if(this.primaryTextColor=this.primaryTextColor||(this.darkMode?"#eee":"#333"),this.secondaryColor=this.secondaryColor||f(this.primaryColor,{h:-120}),this.tertiaryColor=this.tertiaryColor||f(this.primaryColor,{h:180,l:5}),this.primaryBorderColor=this.primaryBorderColor||Yt(this.primaryColor,this.darkMode),this.secondaryBorderColor=this.secondaryBorderColor||Yt(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=this.tertiaryBorderColor||Yt(this.tertiaryColor,this.darkMode),this.noteBorderColor=this.noteBorderColor||Yt(this.noteBkgColor,this.darkMode),this.noteBkgColor=this.noteBkgColor||"#fff5ad",this.noteTextColor=this.noteTextColor||"#333",this.secondaryTextColor=this.secondaryTextColor||b(this.secondaryColor),this.tertiaryTextColor=this.tertiaryTextColor||b(this.tertiaryColor),this.lineColor=this.lineColor||b(this.background),this.textColor=this.textColor||this.primaryTextColor,this.nodeBkg=this.nodeBkg||this.primaryColor,this.mainBkg=this.mainBkg||this.primaryColor,this.nodeBorder=this.nodeBorder||this.primaryBorderColor,this.clusterBkg=this.clusterBkg||this.tertiaryColor,this.clusterBorder=this.clusterBorder||this.tertiaryBorderColor,this.defaultLinkColor=this.defaultLinkColor||this.lineColor,this.titleColor=this.titleColor||this.tertiaryTextColor,this.edgeLabelBackground=this.edgeLabelBackground||(this.darkMode?(0,_.Z)(this.secondaryColor,30):this.secondaryColor),this.nodeTextColor=this.nodeTextColor||this.primaryTextColor,this.actorBorder=this.actorBorder||this.primaryBorderColor,this.actorBkg=this.actorBkg||this.mainBkg,this.actorTextColor=this.actorTextColor||this.primaryTextColor,this.actorLineColor=this.actorLineColor||"grey",this.labelBoxBkgColor=this.labelBoxBkgColor||this.actorBkg,this.signalColor=this.signalColor||this.textColor,this.signalTextColor=this.signalTextColor||this.textColor,this.labelBoxBorderColor=this.labelBoxBorderColor||this.actorBorder,this.labelTextColor=this.labelTextColor||this.actorTextColor,this.loopTextColor=this.loopTextColor||this.actorTextColor,this.activationBorderColor=this.activationBorderColor||(0,_.Z)(this.secondaryColor,10),this.activationBkgColor=this.activationBkgColor||this.secondaryColor,this.sequenceNumberColor=this.sequenceNumberColor||b(this.lineColor),this.sectionBkgColor=this.sectionBkgColor||this.tertiaryColor,this.altSectionBkgColor=this.altSectionBkgColor||"white",this.sectionBkgColor=this.sectionBkgColor||this.secondaryColor,this.sectionBkgColor2=this.sectionBkgColor2||this.primaryColor,this.excludeBkgColor=this.excludeBkgColor||"#eeeeee",this.taskBorderColor=this.taskBorderColor||this.primaryBorderColor,this.taskBkgColor=this.taskBkgColor||this.primaryColor,this.activeTaskBorderColor=this.activeTaskBorderColor||this.primaryColor,this.activeTaskBkgColor=this.activeTaskBkgColor||(0,x.Z)(this.primaryColor,23),this.gridColor=this.gridColor||"lightgrey",this.doneTaskBkgColor=this.doneTaskBkgColor||"lightgrey",this.doneTaskBorderColor=this.doneTaskBorderColor||"grey",this.critBorderColor=this.critBorderColor||"#ff8888",this.critBkgColor=this.critBkgColor||"red",this.todayLineColor=this.todayLineColor||"red",this.taskTextColor=this.taskTextColor||this.textColor,this.taskTextOutsideColor=this.taskTextOutsideColor||this.textColor,this.taskTextLightColor=this.taskTextLightColor||this.textColor,this.taskTextColor=this.taskTextColor||this.primaryTextColor,this.taskTextDarkColor=this.taskTextDarkColor||this.textColor,this.taskTextClickableColor=this.taskTextClickableColor||"#003163",this.personBorder=this.personBorder||this.primaryBorderColor,this.personBkg=this.personBkg||this.mainBkg,this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||this.tertiaryColor,this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.nodeBorder,this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.transitionColor=this.transitionColor||this.lineColor,this.specialStateColor=this.lineColor,this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||f(this.primaryColor,{h:30}),this.cScale4=this.cScale4||f(this.primaryColor,{h:60}),this.cScale5=this.cScale5||f(this.primaryColor,{h:90}),this.cScale6=this.cScale6||f(this.primaryColor,{h:120}),this.cScale7=this.cScale7||f(this.primaryColor,{h:150}),this.cScale8=this.cScale8||f(this.primaryColor,{h:210,l:150}),this.cScale9=this.cScale9||f(this.primaryColor,{h:270}),this.cScale10=this.cScale10||f(this.primaryColor,{h:300}),this.cScale11=this.cScale11||f(this.primaryColor,{h:330}),this.darkMode)for(let e=0;e<this.THEME_COLOR_LIMIT;e++)this["cScale"+e]=(0,_.Z)(this["cScale"+e],75);else for(let e=0;e<this.THEME_COLOR_LIMIT;e++)this["cScale"+e]=(0,_.Z)(this["cScale"+e],25);for(let e=0;e<this.THEME_COLOR_LIMIT;e++)this["cScaleInv"+e]=this["cScaleInv"+e]||b(this["cScale"+e]);for(let e=0;e<this.THEME_COLOR_LIMIT;e++)this.darkMode?this["cScalePeer"+e]=this["cScalePeer"+e]||(0,x.Z)(this["cScale"+e],10):this["cScalePeer"+e]=this["cScalePeer"+e]||(0,_.Z)(this["cScale"+e],10);this.scaleLabelColor=this.scaleLabelColor||this.labelTextColor;for(let e=0;e<this.THEME_COLOR_LIMIT;e++)this["cScaleLabel"+e]=this["cScaleLabel"+e]||this.scaleLabelColor;const t=this.darkMode?-4:-1;for(let e=0;e<5;e++)this["surface"+e]=this["surface"+e]||f(this.mainBkg,{h:180,s:-15,l:t*(5+3*e)}),this["surfacePeer"+e]=this["surfacePeer"+e]||f(this.mainBkg,{h:180,s:-15,l:t*(8+3*e)});this.classText=this.classText||this.textColor,this.fillType0=this.fillType0||this.primaryColor,this.fillType1=this.fillType1||this.secondaryColor,this.fillType2=this.fillType2||f(this.primaryColor,{h:64}),this.fillType3=this.fillType3||f(this.secondaryColor,{h:64}),this.fillType4=this.fillType4||f(this.primaryColor,{h:-64}),this.fillType5=this.fillType5||f(this.secondaryColor,{h:-64}),this.fillType6=this.fillType6||f(this.primaryColor,{h:128}),this.fillType7=this.fillType7||f(this.secondaryColor,{h:128}),this.pie1=this.pie1||this.primaryColor,this.pie2=this.pie2||this.secondaryColor,this.pie3=this.pie3||this.tertiaryColor,this.pie4=this.pie4||f(this.primaryColor,{l:-10}),this.pie5=this.pie5||f(this.secondaryColor,{l:-10}),this.pie6=this.pie6||f(this.tertiaryColor,{l:-10}),this.pie7=this.pie7||f(this.primaryColor,{h:60,l:-10}),this.pie8=this.pie8||f(this.primaryColor,{h:-60,l:-10}),this.pie9=this.pie9||f(this.primaryColor,{h:120,l:0}),this.pie10=this.pie10||f(this.primaryColor,{h:60,l:-20}),this.pie11=this.pie11||f(this.primaryColor,{h:-60,l:-20}),this.pie12=this.pie12||f(this.primaryColor,{h:120,l:-10}),this.pieTitleTextSize=this.pieTitleTextSize||"25px",this.pieTitleTextColor=this.pieTitleTextColor||this.taskTextDarkColor,this.pieSectionTextSize=this.pieSectionTextSize||"17px",this.pieSectionTextColor=this.pieSectionTextColor||this.textColor,this.pieLegendTextSize=this.pieLegendTextSize||"17px",this.pieLegendTextColor=this.pieLegendTextColor||this.taskTextDarkColor,this.pieStrokeColor=this.pieStrokeColor||"black",this.pieStrokeWidth=this.pieStrokeWidth||"2px",this.pieOpacity=this.pieOpacity||"0.7",this.requirementBackground=this.requirementBackground||this.primaryColor,this.requirementBorderColor=this.requirementBorderColor||this.primaryBorderColor,this.requirementBorderSize=this.requirementBorderSize||this.primaryBorderColor,this.requirementTextColor=this.requirementTextColor||this.primaryTextColor,this.relationColor=this.relationColor||this.lineColor,this.relationLabelBackground=this.relationLabelBackground||(this.darkMode?(0,_.Z)(this.secondaryColor,30):this.secondaryColor),this.relationLabelColor=this.relationLabelColor||this.actorTextColor,this.git0=this.git0||this.primaryColor,this.git1=this.git1||this.secondaryColor,this.git2=this.git2||this.tertiaryColor,this.git3=this.git3||f(this.primaryColor,{h:-30}),this.git4=this.git4||f(this.primaryColor,{h:-60}),this.git5=this.git5||f(this.primaryColor,{h:-90}),this.git6=this.git6||f(this.primaryColor,{h:60}),this.git7=this.git7||f(this.primaryColor,{h:120}),this.darkMode?(this.git0=(0,x.Z)(this.git0,25),this.git1=(0,x.Z)(this.git1,25),this.git2=(0,x.Z)(this.git2,25),this.git3=(0,x.Z)(this.git3,25),this.git4=(0,x.Z)(this.git4,25),this.git5=(0,x.Z)(this.git5,25),this.git6=(0,x.Z)(this.git6,25),this.git7=(0,x.Z)(this.git7,25)):(this.git0=(0,_.Z)(this.git0,25),this.git1=(0,_.Z)(this.git1,25),this.git2=(0,_.Z)(this.git2,25),this.git3=(0,_.Z)(this.git3,25),this.git4=(0,_.Z)(this.git4,25),this.git5=(0,_.Z)(this.git5,25),this.git6=(0,_.Z)(this.git6,25),this.git7=(0,_.Z)(this.git7,25)),this.gitInv0=this.gitInv0||b(this.git0),this.gitInv1=this.gitInv1||b(this.git1),this.gitInv2=this.gitInv2||b(this.git2),this.gitInv3=this.gitInv3||b(this.git3),this.gitInv4=this.gitInv4||b(this.git4),this.gitInv5=this.gitInv5||b(this.git5),this.gitInv6=this.gitInv6||b(this.git6),this.gitInv7=this.gitInv7||b(this.git7),this.branchLabelColor=this.branchLabelColor||(this.darkMode?"black":this.labelTextColor),this.gitBranchLabel0=this.gitBranchLabel0||this.branchLabelColor,this.gitBranchLabel1=this.gitBranchLabel1||this.branchLabelColor,this.gitBranchLabel2=this.gitBranchLabel2||this.branchLabelColor,this.gitBranchLabel3=this.gitBranchLabel3||this.branchLabelColor,this.gitBranchLabel4=this.gitBranchLabel4||this.branchLabelColor,this.gitBranchLabel5=this.gitBranchLabel5||this.branchLabelColor,this.gitBranchLabel6=this.gitBranchLabel6||this.branchLabelColor,this.gitBranchLabel7=this.gitBranchLabel7||this.branchLabelColor,this.tagLabelColor=this.tagLabelColor||this.primaryTextColor,this.tagLabelBackground=this.tagLabelBackground||this.primaryColor,this.tagLabelBorder=this.tagBorder||this.primaryBorderColor,this.tagLabelFontSize=this.tagLabelFontSize||"10px",this.commitLabelColor=this.commitLabelColor||this.secondaryTextColor,this.commitLabelBackground=this.commitLabelBackground||this.secondaryColor,this.commitLabelFontSize=this.commitLabelFontSize||"10px",this.attributeBackgroundColorOdd=this.attributeBackgroundColorOdd||zt,this.attributeBackgroundColorEven=this.attributeBackgroundColorEven||Ut}calculate(t){if("object"!=typeof t)return void this.updateColors();const e=Object.keys(t);e.forEach((e=>{this[e]=t[e]})),this.updateColors(),e.forEach((e=>{this[e]=t[e]}))}};return e.calculate(t),e}},dark:{getThemeVariables:t=>{const e=new class{constructor(){this.background="#333",this.primaryColor="#1f2020",this.secondaryColor=(0,x.Z)(this.primaryColor,16),this.tertiaryColor=f(this.primaryColor,{h:-160}),this.primaryBorderColor=b(this.background),this.secondaryBorderColor=Yt(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=Yt(this.tertiaryColor,this.darkMode),this.primaryTextColor=b(this.primaryColor),this.secondaryTextColor=b(this.secondaryColor),this.tertiaryTextColor=b(this.tertiaryColor),this.lineColor=b(this.background),this.textColor=b(this.background),this.mainBkg="#1f2020",this.secondBkg="calculated",this.mainContrastColor="lightgrey",this.darkTextColor=(0,x.Z)(b("#323D47"),10),this.lineColor="calculated",this.border1="#81B1DB",this.border2=y(255,255,255,.25),this.arrowheadColor="calculated",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.labelBackground="#181818",this.textColor="#ccc",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="#F9FFFE",this.edgeLabelBackground="calculated",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="calculated",this.actorLineColor="calculated",this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="calculated",this.activationBkgColor="calculated",this.sequenceNumberColor="black",this.sectionBkgColor=(0,_.Z)("#EAE8D9",30),this.altSectionBkgColor="calculated",this.sectionBkgColor2="#EAE8D9",this.taskBorderColor=y(255,255,255,70),this.taskBkgColor="calculated",this.taskTextColor="calculated",this.taskTextLightColor="calculated",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor=y(255,255,255,50),this.activeTaskBkgColor="#81B1DB",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="grey",this.critBorderColor="#E83737",this.critBkgColor="#E83737",this.taskTextDarkColor="calculated",this.todayLineColor="#DB5757",this.personBorder="calculated",this.personBkg="calculated",this.labelColor="calculated",this.errorBkgColor="#a44141",this.errorTextColor="#ddd"}updateColors(){this.secondBkg=(0,x.Z)(this.mainBkg,16),this.lineColor=this.mainContrastColor,this.arrowheadColor=this.mainContrastColor,this.nodeBkg=this.mainBkg,this.nodeBorder=this.border1,this.clusterBkg=this.secondBkg,this.clusterBorder=this.border2,this.defaultLinkColor=this.lineColor,this.edgeLabelBackground=(0,x.Z)(this.labelBackground,25),this.actorBorder=this.border1,this.actorBkg=this.mainBkg,this.actorTextColor=this.mainContrastColor,this.actorLineColor=this.mainContrastColor,this.signalColor=this.mainContrastColor,this.signalTextColor=this.mainContrastColor,this.labelBoxBkgColor=this.actorBkg,this.labelBoxBorderColor=this.actorBorder,this.labelTextColor=this.mainContrastColor,this.loopTextColor=this.mainContrastColor,this.noteBorderColor=this.secondaryBorderColor,this.noteBkgColor=this.secondBkg,this.noteTextColor=this.secondaryTextColor,this.activationBorderColor=this.border1,this.activationBkgColor=this.secondBkg,this.altSectionBkgColor=this.background,this.taskBkgColor=(0,x.Z)(this.mainBkg,23),this.taskTextColor=this.darkTextColor,this.taskTextLightColor=this.mainContrastColor,this.taskTextOutsideColor=this.taskTextLightColor,this.gridColor=this.mainContrastColor,this.doneTaskBkgColor=this.mainContrastColor,this.taskTextDarkColor=this.darkTextColor,this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||"#555",this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.primaryBorderColor,this.specialStateColor="#f4f4f4",this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.fillType0=this.primaryColor,this.fillType1=this.secondaryColor,this.fillType2=f(this.primaryColor,{h:64}),this.fillType3=f(this.secondaryColor,{h:64}),this.fillType4=f(this.primaryColor,{h:-64}),this.fillType5=f(this.secondaryColor,{h:-64}),this.fillType6=f(this.primaryColor,{h:128}),this.fillType7=f(this.secondaryColor,{h:128}),this.cScale1=this.cScale1||"#0b0000",this.cScale2=this.cScale2||"#4d1037",this.cScale3=this.cScale3||"#3f5258",this.cScale4=this.cScale4||"#4f2f1b",this.cScale5=this.cScale5||"#6e0a0a",this.cScale6=this.cScale6||"#3b0048",this.cScale7=this.cScale7||"#995a01",this.cScale8=this.cScale8||"#154706",this.cScale9=this.cScale9||"#161722",this.cScale10=this.cScale10||"#00296f",this.cScale11=this.cScale11||"#01629c",this.cScale12=this.cScale12||"#010029",this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||f(this.primaryColor,{h:30}),this.cScale4=this.cScale4||f(this.primaryColor,{h:60}),this.cScale5=this.cScale5||f(this.primaryColor,{h:90}),this.cScale6=this.cScale6||f(this.primaryColor,{h:120}),this.cScale7=this.cScale7||f(this.primaryColor,{h:150}),this.cScale8=this.cScale8||f(this.primaryColor,{h:210}),this.cScale9=this.cScale9||f(this.primaryColor,{h:270}),this.cScale10=this.cScale10||f(this.primaryColor,{h:300}),this.cScale11=this.cScale11||f(this.primaryColor,{h:330});for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleInv"+t]=this["cScaleInv"+t]||b(this["cScale"+t]);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScalePeer"+t]=this["cScalePeer"+t]||(0,x.Z)(this["cScale"+t],10);for(let t=0;t<5;t++)this["surface"+t]=this["surface"+t]||f(this.mainBkg,{h:30,s:-30,l:-(4*t-10)}),this["surfacePeer"+t]=this["surfacePeer"+t]||f(this.mainBkg,{h:30,s:-30,l:-(4*t-7)});this.scaleLabelColor=this.scaleLabelColor||(this.darkMode?"black":this.labelTextColor);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleLabel"+t]=this["cScaleLabel"+t]||this.scaleLabelColor;for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["pie"+t]=this["cScale"+t];this.pieTitleTextSize=this.pieTitleTextSize||"25px",this.pieTitleTextColor=this.pieTitleTextColor||this.taskTextDarkColor,this.pieSectionTextSize=this.pieSectionTextSize||"17px",this.pieSectionTextColor=this.pieSectionTextColor||this.textColor,this.pieLegendTextSize=this.pieLegendTextSize||"17px",this.pieLegendTextColor=this.pieLegendTextColor||this.taskTextDarkColor,this.pieStrokeColor=this.pieStrokeColor||"black",this.pieStrokeWidth=this.pieStrokeWidth||"2px",this.pieOpacity=this.pieOpacity||"0.7",this.classText=this.primaryTextColor,this.requirementBackground=this.requirementBackground||this.primaryColor,this.requirementBorderColor=this.requirementBorderColor||this.primaryBorderColor,this.requirementBorderSize=this.requirementBorderSize||this.primaryBorderColor,this.requirementTextColor=this.requirementTextColor||this.primaryTextColor,this.relationColor=this.relationColor||this.lineColor,this.relationLabelBackground=this.relationLabelBackground||(this.darkMode?(0,_.Z)(this.secondaryColor,30):this.secondaryColor),this.relationLabelColor=this.relationLabelColor||this.actorTextColor,this.git0=(0,x.Z)(this.secondaryColor,20),this.git1=(0,x.Z)(this.pie2||this.secondaryColor,20),this.git2=(0,x.Z)(this.pie3||this.tertiaryColor,20),this.git3=(0,x.Z)(this.pie4||f(this.primaryColor,{h:-30}),20),this.git4=(0,x.Z)(this.pie5||f(this.primaryColor,{h:-60}),20),this.git5=(0,x.Z)(this.pie6||f(this.primaryColor,{h:-90}),10),this.git6=(0,x.Z)(this.pie7||f(this.primaryColor,{h:60}),10),this.git7=(0,x.Z)(this.pie8||f(this.primaryColor,{h:120}),20),this.gitInv0=this.gitInv0||b(this.git0),this.gitInv1=this.gitInv1||b(this.git1),this.gitInv2=this.gitInv2||b(this.git2),this.gitInv3=this.gitInv3||b(this.git3),this.gitInv4=this.gitInv4||b(this.git4),this.gitInv5=this.gitInv5||b(this.git5),this.gitInv6=this.gitInv6||b(this.git6),this.gitInv7=this.gitInv7||b(this.git7),this.tagLabelColor=this.tagLabelColor||this.primaryTextColor,this.tagLabelBackground=this.tagLabelBackground||this.primaryColor,this.tagLabelBorder=this.tagBorder||this.primaryBorderColor,this.tagLabelFontSize=this.tagLabelFontSize||"10px",this.commitLabelColor=this.commitLabelColor||this.secondaryTextColor,this.commitLabelBackground=this.commitLabelBackground||this.secondaryColor,this.commitLabelFontSize=this.commitLabelFontSize||"10px",this.attributeBackgroundColorOdd=this.attributeBackgroundColorOdd||(0,x.Z)(this.background,12),this.attributeBackgroundColorEven=this.attributeBackgroundColorEven||(0,x.Z)(this.background,2)}calculate(t){if("object"!=typeof t)return void this.updateColors();const e=Object.keys(t);e.forEach((e=>{this[e]=t[e]})),this.updateColors(),e.forEach((e=>{this[e]=t[e]}))}};return e.calculate(t),e}},default:{getThemeVariables:t=>{const e=new class{constructor(){this.background="#f4f4f4",this.primaryColor="#ECECFF",this.secondaryColor=f(this.primaryColor,{h:120}),this.secondaryColor="#ffffde",this.tertiaryColor=f(this.primaryColor,{h:-160}),this.primaryBorderColor=Yt(this.primaryColor,this.darkMode),this.secondaryBorderColor=Yt(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=Yt(this.tertiaryColor,this.darkMode),this.primaryTextColor=b(this.primaryColor),this.secondaryTextColor=b(this.secondaryColor),this.tertiaryTextColor=b(this.tertiaryColor),this.lineColor=b(this.background),this.textColor=b(this.background),this.background="white",this.mainBkg="#ECECFF",this.secondBkg="#ffffde",this.lineColor="#333333",this.border1="#9370DB",this.border2="#aaaa33",this.arrowheadColor="#333333",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.labelBackground="#e8e8e8",this.textColor="#333",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="calculated",this.edgeLabelBackground="calculated",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="black",this.actorLineColor="grey",this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="calculated",this.altSectionBkgColor="calculated",this.sectionBkgColor2="calculated",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="calculated",this.taskTextLightColor="calculated",this.taskTextColor=this.taskTextLightColor,this.taskTextDarkColor="calculated",this.taskTextOutsideColor=this.taskTextDarkColor,this.taskTextClickableColor="calculated",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="calculated",this.critBorderColor="calculated",this.critBkgColor="calculated",this.todayLineColor="calculated",this.sectionBkgColor=y(102,102,255,.49),this.altSectionBkgColor="white",this.sectionBkgColor2="#fff400",this.taskBorderColor="#534fbc",this.taskBkgColor="#8a90dd",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="black",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="#534fbc",this.activeTaskBkgColor="#bfc7ff",this.gridColor="lightgrey",this.doneTaskBkgColor="lightgrey",this.doneTaskBorderColor="grey",this.critBorderColor="#ff8888",this.critBkgColor="red",this.todayLineColor="red",this.personBorder="calculated",this.personBkg="calculated",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222",this.updateColors()}updateColors(){this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||f(this.primaryColor,{h:30}),this.cScale4=this.cScale4||f(this.primaryColor,{h:60}),this.cScale5=this.cScale5||f(this.primaryColor,{h:90}),this.cScale6=this.cScale6||f(this.primaryColor,{h:120}),this.cScale7=this.cScale7||f(this.primaryColor,{h:150}),this.cScale8=this.cScale8||f(this.primaryColor,{h:210}),this.cScale9=this.cScale9||f(this.primaryColor,{h:270}),this.cScale10=this.cScale10||f(this.primaryColor,{h:300}),this.cScale11=this.cScale11||f(this.primaryColor,{h:330}),this.cScalePeer1=this.cScalePeer1||(0,_.Z)(this.secondaryColor,45),this.cScalePeer2=this.cScalePeer2||(0,_.Z)(this.tertiaryColor,40);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScale"+t]=(0,_.Z)(this["cScale"+t],10),this["cScalePeer"+t]=this["cScalePeer"+t]||(0,_.Z)(this["cScale"+t],25);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleInv"+t]=this["cScaleInv"+t]||f(this["cScale"+t],{h:180});for(let t=0;t<5;t++)this["surface"+t]=this["surface"+t]||f(this.mainBkg,{h:30,l:-(5+5*t)}),this["surfacePeer"+t]=this["surfacePeer"+t]||f(this.mainBkg,{h:30,l:-(7+5*t)});if(this.scaleLabelColor="calculated"!==this.scaleLabelColor&&this.scaleLabelColor?this.scaleLabelColor:this.labelTextColor,"calculated"!==this.labelTextColor){this.cScaleLabel0=this.cScaleLabel0||b(this.labelTextColor),this.cScaleLabel3=this.cScaleLabel3||b(this.labelTextColor);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleLabel"+t]=this["cScaleLabel"+t]||this.labelTextColor}this.nodeBkg=this.mainBkg,this.nodeBorder=this.border1,this.clusterBkg=this.secondBkg,this.clusterBorder=this.border2,this.defaultLinkColor=this.lineColor,this.titleColor=this.textColor,this.edgeLabelBackground=this.labelBackground,this.actorBorder=(0,x.Z)(this.border1,23),this.actorBkg=this.mainBkg,this.labelBoxBkgColor=this.actorBkg,this.signalColor=this.textColor,this.signalTextColor=this.textColor,this.labelBoxBorderColor=this.actorBorder,this.labelTextColor=this.actorTextColor,this.loopTextColor=this.actorTextColor,this.noteBorderColor=this.border2,this.noteTextColor=this.actorTextColor,this.taskTextColor=this.taskTextLightColor,this.taskTextOutsideColor=this.taskTextDarkColor,this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||"#f0f0f0",this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.nodeBorder,this.specialStateColor=this.lineColor,this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.transitionColor=this.transitionColor||this.lineColor,this.classText=this.primaryTextColor,this.fillType0=this.primaryColor,this.fillType1=this.secondaryColor,this.fillType2=f(this.primaryColor,{h:64}),this.fillType3=f(this.secondaryColor,{h:64}),this.fillType4=f(this.primaryColor,{h:-64}),this.fillType5=f(this.secondaryColor,{h:-64}),this.fillType6=f(this.primaryColor,{h:128}),this.fillType7=f(this.secondaryColor,{h:128}),this.pie1=this.pie1||this.primaryColor,this.pie2=this.pie2||this.secondaryColor,this.pie3=this.pie3||f(this.tertiaryColor,{l:-40}),this.pie4=this.pie4||f(this.primaryColor,{l:-10}),this.pie5=this.pie5||f(this.secondaryColor,{l:-30}),this.pie6=this.pie6||f(this.tertiaryColor,{l:-20}),this.pie7=this.pie7||f(this.primaryColor,{h:60,l:-20}),this.pie8=this.pie8||f(this.primaryColor,{h:-60,l:-40}),this.pie9=this.pie9||f(this.primaryColor,{h:120,l:-40}),this.pie10=this.pie10||f(this.primaryColor,{h:60,l:-40}),this.pie11=this.pie11||f(this.primaryColor,{h:-90,l:-40}),this.pie12=this.pie12||f(this.primaryColor,{h:120,l:-30}),this.pieTitleTextSize=this.pieTitleTextSize||"25px",this.pieTitleTextColor=this.pieTitleTextColor||this.taskTextDarkColor,this.pieSectionTextSize=this.pieSectionTextSize||"17px",this.pieSectionTextColor=this.pieSectionTextColor||this.textColor,this.pieLegendTextSize=this.pieLegendTextSize||"17px",this.pieLegendTextColor=this.pieLegendTextColor||this.taskTextDarkColor,this.pieStrokeColor=this.pieStrokeColor||"black",this.pieStrokeWidth=this.pieStrokeWidth||"2px",this.pieOpacity=this.pieOpacity||"0.7",this.requirementBackground=this.requirementBackground||this.primaryColor,this.requirementBorderColor=this.requirementBorderColor||this.primaryBorderColor,this.requirementBorderSize=this.requirementBorderSize||this.primaryBorderColor,this.requirementTextColor=this.requirementTextColor||this.primaryTextColor,this.relationColor=this.relationColor||this.lineColor,this.relationLabelBackground=this.relationLabelBackground||this.labelBackground,this.relationLabelColor=this.relationLabelColor||this.actorTextColor,this.git0=this.git0||this.primaryColor,this.git1=this.git1||this.secondaryColor,this.git2=this.git2||this.tertiaryColor,this.git3=this.git3||f(this.primaryColor,{h:-30}),this.git4=this.git4||f(this.primaryColor,{h:-60}),this.git5=this.git5||f(this.primaryColor,{h:-90}),this.git6=this.git6||f(this.primaryColor,{h:60}),this.git7=this.git7||f(this.primaryColor,{h:120}),this.darkMode?(this.git0=(0,x.Z)(this.git0,25),this.git1=(0,x.Z)(this.git1,25),this.git2=(0,x.Z)(this.git2,25),this.git3=(0,x.Z)(this.git3,25),this.git4=(0,x.Z)(this.git4,25),this.git5=(0,x.Z)(this.git5,25),this.git6=(0,x.Z)(this.git6,25),this.git7=(0,x.Z)(this.git7,25)):(this.git0=(0,_.Z)(this.git0,25),this.git1=(0,_.Z)(this.git1,25),this.git2=(0,_.Z)(this.git2,25),this.git3=(0,_.Z)(this.git3,25),this.git4=(0,_.Z)(this.git4,25),this.git5=(0,_.Z)(this.git5,25),this.git6=(0,_.Z)(this.git6,25),this.git7=(0,_.Z)(this.git7,25)),this.gitInv0=this.gitInv0||(0,_.Z)(b(this.git0),25),this.gitInv1=this.gitInv1||b(this.git1),this.gitInv2=this.gitInv2||b(this.git2),this.gitInv3=this.gitInv3||b(this.git3),this.gitInv4=this.gitInv4||b(this.git4),this.gitInv5=this.gitInv5||b(this.git5),this.gitInv6=this.gitInv6||b(this.git6),this.gitInv7=this.gitInv7||b(this.git7),this.gitBranchLabel0=this.gitBranchLabel0||b(this.labelTextColor),this.gitBranchLabel1=this.gitBranchLabel1||this.labelTextColor,this.gitBranchLabel2=this.gitBranchLabel2||this.labelTextColor,this.gitBranchLabel3=this.gitBranchLabel3||b(this.labelTextColor),this.gitBranchLabel4=this.gitBranchLabel4||this.labelTextColor,this.gitBranchLabel5=this.gitBranchLabel5||this.labelTextColor,this.gitBranchLabel6=this.gitBranchLabel6||this.labelTextColor,this.gitBranchLabel7=this.gitBranchLabel7||this.labelTextColor,this.tagLabelColor=this.tagLabelColor||this.primaryTextColor,this.tagLabelBackground=this.tagLabelBackground||this.primaryColor,this.tagLabelBorder=this.tagBorder||this.primaryBorderColor,this.tagLabelFontSize=this.tagLabelFontSize||"10px",this.commitLabelColor=this.commitLabelColor||this.secondaryTextColor,this.commitLabelBackground=this.commitLabelBackground||this.secondaryColor,this.commitLabelFontSize=this.commitLabelFontSize||"10px",this.attributeBackgroundColorOdd=this.attributeBackgroundColorOdd||zt,this.attributeBackgroundColorEven=this.attributeBackgroundColorEven||Ut}calculate(t){if("object"!=typeof t)return void this.updateColors();const e=Object.keys(t);e.forEach((e=>{this[e]=t[e]})),this.updateColors(),e.forEach((e=>{this[e]=t[e]}))}};return e.calculate(t),e}},forest:{getThemeVariables:t=>{const e=new class{constructor(){this.background="#f4f4f4",this.primaryColor="#cde498",this.secondaryColor="#cdffb2",this.background="white",this.mainBkg="#cde498",this.secondBkg="#cdffb2",this.lineColor="green",this.border1="#13540c",this.border2="#6eaa49",this.arrowheadColor="green",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.tertiaryColor=(0,x.Z)("#cde498",10),this.primaryBorderColor=Yt(this.primaryColor,this.darkMode),this.secondaryBorderColor=Yt(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=Yt(this.tertiaryColor,this.darkMode),this.primaryTextColor=b(this.primaryColor),this.secondaryTextColor=b(this.secondaryColor),this.tertiaryTextColor=b(this.primaryColor),this.lineColor=b(this.background),this.textColor=b(this.background),this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="#333",this.edgeLabelBackground="#e8e8e8",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="black",this.actorLineColor="grey",this.signalColor="#333",this.signalTextColor="#333",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="#326932",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="#6eaa49",this.altSectionBkgColor="white",this.sectionBkgColor2="#6eaa49",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="#487e3a",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="black",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="lightgrey",this.doneTaskBkgColor="lightgrey",this.doneTaskBorderColor="grey",this.critBorderColor="#ff8888",this.critBkgColor="red",this.todayLineColor="red",this.personBorder="calculated",this.personBkg="calculated",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222"}updateColors(){this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||f(this.primaryColor,{h:30}),this.cScale4=this.cScale4||f(this.primaryColor,{h:60}),this.cScale5=this.cScale5||f(this.primaryColor,{h:90}),this.cScale6=this.cScale6||f(this.primaryColor,{h:120}),this.cScale7=this.cScale7||f(this.primaryColor,{h:150}),this.cScale8=this.cScale8||f(this.primaryColor,{h:210}),this.cScale9=this.cScale9||f(this.primaryColor,{h:270}),this.cScale10=this.cScale10||f(this.primaryColor,{h:300}),this.cScale11=this.cScale11||f(this.primaryColor,{h:330}),this.cScalePeer1=this.cScalePeer1||(0,_.Z)(this.secondaryColor,45),this.cScalePeer2=this.cScalePeer2||(0,_.Z)(this.tertiaryColor,40);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScale"+t]=(0,_.Z)(this["cScale"+t],10),this["cScalePeer"+t]=this["cScalePeer"+t]||(0,_.Z)(this["cScale"+t],25);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleInv"+t]=this["cScaleInv"+t]||f(this["cScale"+t],{h:180});this.scaleLabelColor="calculated"!==this.scaleLabelColor&&this.scaleLabelColor?this.scaleLabelColor:this.labelTextColor;for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleLabel"+t]=this["cScaleLabel"+t]||this.scaleLabelColor;for(let t=0;t<5;t++)this["surface"+t]=this["surface"+t]||f(this.mainBkg,{h:30,s:-30,l:-(5+5*t)}),this["surfacePeer"+t]=this["surfacePeer"+t]||f(this.mainBkg,{h:30,s:-30,l:-(8+5*t)});this.nodeBkg=this.mainBkg,this.nodeBorder=this.border1,this.clusterBkg=this.secondBkg,this.clusterBorder=this.border2,this.defaultLinkColor=this.lineColor,this.actorBorder=(0,_.Z)(this.mainBkg,20),this.actorBkg=this.mainBkg,this.labelBoxBkgColor=this.actorBkg,this.labelTextColor=this.actorTextColor,this.loopTextColor=this.actorTextColor,this.noteBorderColor=this.border2,this.noteTextColor=this.actorTextColor,this.taskBorderColor=this.border1,this.taskTextColor=this.taskTextLightColor,this.taskTextOutsideColor=this.taskTextDarkColor,this.activeTaskBorderColor=this.taskBorderColor,this.activeTaskBkgColor=this.mainBkg,this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||"#f0f0f0",this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.primaryBorderColor,this.specialStateColor=this.lineColor,this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.transitionColor=this.transitionColor||this.lineColor,this.classText=this.primaryTextColor,this.fillType0=this.primaryColor,this.fillType1=this.secondaryColor,this.fillType2=f(this.primaryColor,{h:64}),this.fillType3=f(this.secondaryColor,{h:64}),this.fillType4=f(this.primaryColor,{h:-64}),this.fillType5=f(this.secondaryColor,{h:-64}),this.fillType6=f(this.primaryColor,{h:128}),this.fillType7=f(this.secondaryColor,{h:128}),this.pie1=this.pie1||this.primaryColor,this.pie2=this.pie2||this.secondaryColor,this.pie3=this.pie3||this.tertiaryColor,this.pie4=this.pie4||f(this.primaryColor,{l:-30}),this.pie5=this.pie5||f(this.secondaryColor,{l:-30}),this.pie6=this.pie6||f(this.tertiaryColor,{h:40,l:-40}),this.pie7=this.pie7||f(this.primaryColor,{h:60,l:-10}),this.pie8=this.pie8||f(this.primaryColor,{h:-60,l:-10}),this.pie9=this.pie9||f(this.primaryColor,{h:120,l:0}),this.pie10=this.pie10||f(this.primaryColor,{h:60,l:-50}),this.pie11=this.pie11||f(this.primaryColor,{h:-60,l:-50}),this.pie12=this.pie12||f(this.primaryColor,{h:120,l:-50}),this.pieTitleTextSize=this.pieTitleTextSize||"25px",this.pieTitleTextColor=this.pieTitleTextColor||this.taskTextDarkColor,this.pieSectionTextSize=this.pieSectionTextSize||"17px",this.pieSectionTextColor=this.pieSectionTextColor||this.textColor,this.pieLegendTextSize=this.pieLegendTextSize||"17px",this.pieLegendTextColor=this.pieLegendTextColor||this.taskTextDarkColor,this.pieStrokeColor=this.pieStrokeColor||"black",this.pieStrokeWidth=this.pieStrokeWidth||"2px",this.pieOpacity=this.pieOpacity||"0.7",this.requirementBackground=this.requirementBackground||this.primaryColor,this.requirementBorderColor=this.requirementBorderColor||this.primaryBorderColor,this.requirementBorderSize=this.requirementBorderSize||this.primaryBorderColor,this.requirementTextColor=this.requirementTextColor||this.primaryTextColor,this.relationColor=this.relationColor||this.lineColor,this.relationLabelBackground=this.relationLabelBackground||this.edgeLabelBackground,this.relationLabelColor=this.relationLabelColor||this.actorTextColor,this.git0=this.git0||this.primaryColor,this.git1=this.git1||this.secondaryColor,this.git2=this.git2||this.tertiaryColor,this.git3=this.git3||f(this.primaryColor,{h:-30}),this.git4=this.git4||f(this.primaryColor,{h:-60}),this.git5=this.git5||f(this.primaryColor,{h:-90}),this.git6=this.git6||f(this.primaryColor,{h:60}),this.git7=this.git7||f(this.primaryColor,{h:120}),this.darkMode?(this.git0=(0,x.Z)(this.git0,25),this.git1=(0,x.Z)(this.git1,25),this.git2=(0,x.Z)(this.git2,25),this.git3=(0,x.Z)(this.git3,25),this.git4=(0,x.Z)(this.git4,25),this.git5=(0,x.Z)(this.git5,25),this.git6=(0,x.Z)(this.git6,25),this.git7=(0,x.Z)(this.git7,25)):(this.git0=(0,_.Z)(this.git0,25),this.git1=(0,_.Z)(this.git1,25),this.git2=(0,_.Z)(this.git2,25),this.git3=(0,_.Z)(this.git3,25),this.git4=(0,_.Z)(this.git4,25),this.git5=(0,_.Z)(this.git5,25),this.git6=(0,_.Z)(this.git6,25),this.git7=(0,_.Z)(this.git7,25)),this.gitInv0=this.gitInv0||b(this.git0),this.gitInv1=this.gitInv1||b(this.git1),this.gitInv2=this.gitInv2||b(this.git2),this.gitInv3=this.gitInv3||b(this.git3),this.gitInv4=this.gitInv4||b(this.git4),this.gitInv5=this.gitInv5||b(this.git5),this.gitInv6=this.gitInv6||b(this.git6),this.gitInv7=this.gitInv7||b(this.git7),this.tagLabelColor=this.tagLabelColor||this.primaryTextColor,this.tagLabelBackground=this.tagLabelBackground||this.primaryColor,this.tagLabelBorder=this.tagBorder||this.primaryBorderColor,this.tagLabelFontSize=this.tagLabelFontSize||"10px",this.commitLabelColor=this.commitLabelColor||this.secondaryTextColor,this.commitLabelBackground=this.commitLabelBackground||this.secondaryColor,this.commitLabelFontSize=this.commitLabelFontSize||"10px",this.attributeBackgroundColorOdd=this.attributeBackgroundColorOdd||zt,this.attributeBackgroundColorEven=this.attributeBackgroundColorEven||Ut}calculate(t){if("object"!=typeof t)return void this.updateColors();const e=Object.keys(t);e.forEach((e=>{this[e]=t[e]})),this.updateColors(),e.forEach((e=>{this[e]=t[e]}))}};return e.calculate(t),e}},neutral:{getThemeVariables:t=>{const e=new Wt;return e.calculate(t),e}}},Ht={theme:"default",themeVariables:qt.default.getThemeVariables(),themeCSS:void 0,maxTextSize:5e4,darkMode:!1,fontFamily:'"trebuchet ms", verdana, arial, sans-serif;',logLevel:5,securityLevel:"strict",startOnLoad:!0,arrowMarkerAbsolute:!1,secure:["secure","securityLevel","startOnLoad","maxTextSize"],deterministicIds:!1,deterministicIDSeed:void 0,flowchart:{titleTopMargin:25,diagramPadding:8,htmlLabels:!0,nodeSpacing:50,rankSpacing:50,curve:"basis",padding:15,useMaxWidth:!0,defaultRenderer:"dagre-wrapper"},sequence:{hideUnusedParticipants:!1,activationWidth:10,diagramMarginX:50,diagramMarginY:10,actorMargin:50,width:150,height:65,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",mirrorActors:!0,forceMenus:!1,bottomMarginAdj:1,useMaxWidth:!0,rightAngles:!1,showSequenceNumbers:!1,actorFontSize:14,actorFontFamily:'"Open Sans", sans-serif',actorFontWeight:400,noteFontSize:14,noteFontFamily:'"trebuchet ms", verdana, arial, sans-serif',noteFontWeight:400,noteAlign:"center",messageFontSize:16,messageFontFamily:'"trebuchet ms", verdana, arial, sans-serif',messageFontWeight:400,wrap:!1,wrapPadding:10,labelBoxWidth:50,labelBoxHeight:20,messageFont:function(){return{fontFamily:this.messageFontFamily,fontSize:this.messageFontSize,fontWeight:this.messageFontWeight}},noteFont:function(){return{fontFamily:this.noteFontFamily,fontSize:this.noteFontSize,fontWeight:this.noteFontWeight}},actorFont:function(){return{fontFamily:this.actorFontFamily,fontSize:this.actorFontSize,fontWeight:this.actorFontWeight}}},gantt:{titleTopMargin:25,barHeight:20,barGap:4,topPadding:50,rightPadding:75,leftPadding:75,gridLineStartPadding:35,fontSize:11,sectionFontSize:11,numberSectionStyles:4,axisFormat:"%Y-%m-%d",tickInterval:void 0,useMaxWidth:!0,topAxis:!1,useWidth:void 0},journey:{diagramMarginX:50,diagramMarginY:10,leftMargin:150,width:150,height:50,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",bottomMarginAdj:1,useMaxWidth:!0,rightAngles:!1,taskFontSize:14,taskFontFamily:'"Open Sans", sans-serif',taskMargin:50,activationWidth:10,textPlacement:"fo",actorColours:["#8FBC8F","#7CFC00","#00FFFF","#20B2AA","#B0E0E6","#FFFFE0"],sectionFills:["#191970","#8B008B","#4B0082","#2F4F4F","#800000","#8B4513","#00008B"],sectionColours:["#fff"]},timeline:{diagramMarginX:50,diagramMarginY:10,leftMargin:150,width:150,height:50,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",bottomMarginAdj:1,useMaxWidth:!0,rightAngles:!1,taskFontSize:14,taskFontFamily:'"Open Sans", sans-serif',taskMargin:50,activationWidth:10,textPlacement:"fo",actorColours:["#8FBC8F","#7CFC00","#00FFFF","#20B2AA","#B0E0E6","#FFFFE0"],sectionFills:["#191970","#8B008B","#4B0082","#2F4F4F","#800000","#8B4513","#00008B"],sectionColours:["#fff"],disableMulticolor:!1},class:{titleTopMargin:25,arrowMarkerAbsolute:!1,dividerMargin:10,padding:5,textHeight:10,useMaxWidth:!0,defaultRenderer:"dagre-wrapper"},state:{titleTopMargin:25,dividerMargin:10,sizeUnit:5,padding:8,textHeight:10,titleShift:-15,noteMargin:10,forkWidth:70,forkHeight:7,miniPadding:2,fontSizeFactor:5.02,fontSize:24,labelHeight:16,edgeLengthFactor:"20",compositTitleSize:35,radius:5,useMaxWidth:!0,defaultRenderer:"dagre-wrapper"},er:{titleTopMargin:25,diagramPadding:20,layoutDirection:"TB",minEntityWidth:100,minEntityHeight:75,entityPadding:15,stroke:"gray",fill:"honeydew",fontSize:12,useMaxWidth:!0},pie:{useWidth:void 0,useMaxWidth:!0},requirement:{useWidth:void 0,useMaxWidth:!0,rect_fill:"#f9f9f9",text_color:"#333",rect_border_size:"0.5px",rect_border_color:"#bbb",rect_min_width:200,rect_min_height:200,fontSize:14,rect_padding:10,line_height:20},gitGraph:{titleTopMargin:25,diagramPadding:8,nodeLabel:{width:75,height:100,x:-25,y:0},mainBranchName:"main",mainBranchOrder:0,showCommitLabel:!0,showBranches:!0,rotateCommitLabel:!0},c4:{useWidth:void 0,diagramMarginX:50,diagramMarginY:10,c4ShapeMargin:50,c4ShapePadding:20,width:216,height:60,boxMargin:10,useMaxWidth:!0,c4ShapeInRow:4,nextLinePaddingX:0,c4BoundaryInRow:2,personFontSize:14,personFontFamily:'"Open Sans", sans-serif',personFontWeight:"normal",external_personFontSize:14,external_personFontFamily:'"Open Sans", sans-serif',external_personFontWeight:"normal",systemFontSize:14,systemFontFamily:'"Open Sans", sans-serif',systemFontWeight:"normal",external_systemFontSize:14,external_systemFontFamily:'"Open Sans", sans-serif',external_systemFontWeight:"normal",system_dbFontSize:14,system_dbFontFamily:'"Open Sans", sans-serif',system_dbFontWeight:"normal",external_system_dbFontSize:14,external_system_dbFontFamily:'"Open Sans", sans-serif',external_system_dbFontWeight:"normal",system_queueFontSize:14,system_queueFontFamily:'"Open Sans", sans-serif',system_queueFontWeight:"normal",external_system_queueFontSize:14,external_system_queueFontFamily:'"Open Sans", sans-serif',external_system_queueFontWeight:"normal",boundaryFontSize:14,boundaryFontFamily:'"Open Sans", sans-serif',boundaryFontWeight:"normal",messageFontSize:12,messageFontFamily:'"Open Sans", sans-serif',messageFontWeight:"normal",containerFontSize:14,containerFontFamily:'"Open Sans", sans-serif',containerFontWeight:"normal",external_containerFontSize:14,external_containerFontFamily:'"Open Sans", sans-serif',external_containerFontWeight:"normal",container_dbFontSize:14,container_dbFontFamily:'"Open Sans", sans-serif',container_dbFontWeight:"normal",external_container_dbFontSize:14,external_container_dbFontFamily:'"Open Sans", sans-serif',external_container_dbFontWeight:"normal",container_queueFontSize:14,container_queueFontFamily:'"Open Sans", sans-serif',container_queueFontWeight:"normal",external_container_queueFontSize:14,external_container_queueFontFamily:'"Open Sans", sans-serif',external_container_queueFontWeight:"normal",componentFontSize:14,componentFontFamily:'"Open Sans", sans-serif',componentFontWeight:"normal",external_componentFontSize:14,external_componentFontFamily:'"Open Sans", sans-serif',external_componentFontWeight:"normal",component_dbFontSize:14,component_dbFontFamily:'"Open Sans", sans-serif',component_dbFontWeight:"normal",external_component_dbFontSize:14,external_component_dbFontFamily:'"Open Sans", sans-serif',external_component_dbFontWeight:"normal",component_queueFontSize:14,component_queueFontFamily:'"Open Sans", sans-serif',component_queueFontWeight:"normal",external_component_queueFontSize:14,external_component_queueFontFamily:'"Open Sans", sans-serif',external_component_queueFontWeight:"normal",wrap:!0,wrapPadding:10,personFont:function(){return{fontFamily:this.personFontFamily,fontSize:this.personFontSize,fontWeight:this.personFontWeight}},external_personFont:function(){return{fontFamily:this.external_personFontFamily,fontSize:this.external_personFontSize,fontWeight:this.external_personFontWeight}},systemFont:function(){return{fontFamily:this.systemFontFamily,fontSize:this.systemFontSize,fontWeight:this.systemFontWeight}},external_systemFont:function(){return{fontFamily:this.external_systemFontFamily,fontSize:this.external_systemFontSize,fontWeight:this.external_systemFontWeight}},system_dbFont:function(){return{fontFamily:this.system_dbFontFamily,fontSize:this.system_dbFontSize,fontWeight:this.system_dbFontWeight}},external_system_dbFont:function(){return{fontFamily:this.external_system_dbFontFamily,fontSize:this.external_system_dbFontSize,fontWeight:this.external_system_dbFontWeight}},system_queueFont:function(){return{fontFamily:this.system_queueFontFamily,fontSize:this.system_queueFontSize,fontWeight:this.system_queueFontWeight}},external_system_queueFont:function(){return{fontFamily:this.external_system_queueFontFamily,fontSize:this.external_system_queueFontSize,fontWeight:this.external_system_queueFontWeight}},containerFont:function(){return{fontFamily:this.containerFontFamily,fontSize:this.containerFontSize,fontWeight:this.containerFontWeight}},external_containerFont:function(){return{fontFamily:this.external_containerFontFamily,fontSize:this.external_containerFontSize,fontWeight:this.external_containerFontWeight}},container_dbFont:function(){return{fontFamily:this.container_dbFontFamily,fontSize:this.container_dbFontSize,fontWeight:this.container_dbFontWeight}},external_container_dbFont:function(){return{fontFamily:this.external_container_dbFontFamily,fontSize:this.external_container_dbFontSize,fontWeight:this.external_container_dbFontWeight}},container_queueFont:function(){return{fontFamily:this.container_queueFontFamily,fontSize:this.container_queueFontSize,fontWeight:this.container_queueFontWeight}},external_container_queueFont:function(){return{fontFamily:this.external_container_queueFontFamily,fontSize:this.external_container_queueFontSize,fontWeight:this.external_container_queueFontWeight}},componentFont:function(){return{fontFamily:this.componentFontFamily,fontSize:this.componentFontSize,fontWeight:this.componentFontWeight}},external_componentFont:function(){return{fontFamily:this.external_componentFontFamily,fontSize:this.external_componentFontSize,fontWeight:this.external_componentFontWeight}},component_dbFont:function(){return{fontFamily:this.component_dbFontFamily,fontSize:this.component_dbFontSize,fontWeight:this.component_dbFontWeight}},external_component_dbFont:function(){return{fontFamily:this.external_component_dbFontFamily,fontSize:this.external_component_dbFontSize,fontWeight:this.external_component_dbFontWeight}},component_queueFont:function(){return{fontFamily:this.component_queueFontFamily,fontSize:this.component_queueFontSize,fontWeight:this.component_queueFontWeight}},external_component_queueFont:function(){return{fontFamily:this.external_component_queueFontFamily,fontSize:this.external_component_queueFontSize,fontWeight:this.external_component_queueFontWeight}},boundaryFont:function(){return{fontFamily:this.boundaryFontFamily,fontSize:this.boundaryFontSize,fontWeight:this.boundaryFontWeight}},messageFont:function(){return{fontFamily:this.messageFontFamily,fontSize:this.messageFontSize,fontWeight:this.messageFontWeight}},person_bg_color:"#08427B",person_border_color:"#073B6F",external_person_bg_color:"#686868",external_person_border_color:"#8A8A8A",system_bg_color:"#1168BD",system_border_color:"#3C7FC0",system_db_bg_color:"#1168BD",system_db_border_color:"#3C7FC0",system_queue_bg_color:"#1168BD",system_queue_border_color:"#3C7FC0",external_system_bg_color:"#999999",external_system_border_color:"#8A8A8A",external_system_db_bg_color:"#999999",external_system_db_border_color:"#8A8A8A",external_system_queue_bg_color:"#999999",external_system_queue_border_color:"#8A8A8A",container_bg_color:"#438DD5",container_border_color:"#3C7FC0",container_db_bg_color:"#438DD5",container_db_border_color:"#3C7FC0",container_queue_bg_color:"#438DD5",container_queue_border_color:"#3C7FC0",external_container_bg_color:"#B3B3B3",external_container_border_color:"#A6A6A6",external_container_db_bg_color:"#B3B3B3",external_container_db_border_color:"#A6A6A6",external_container_queue_bg_color:"#B3B3B3",external_container_queue_border_color:"#A6A6A6",component_bg_color:"#85BBF0",component_border_color:"#78A8D8",component_db_bg_color:"#85BBF0",component_db_border_color:"#78A8D8",component_queue_bg_color:"#85BBF0",component_queue_border_color:"#78A8D8",external_component_bg_color:"#CCCCCC",external_component_border_color:"#BFBFBF",external_component_db_bg_color:"#CCCCCC",external_component_db_border_color:"#BFBFBF",external_component_queue_bg_color:"#CCCCCC",external_component_queue_border_color:"#BFBFBF"},mindmap:{useMaxWidth:!0,padding:10,maxNodeWidth:200},fontSize:16};Ht.class&&(Ht.class.arrowMarkerAbsolute=Ht.arrowMarkerAbsolute),Ht.gitGraph&&(Ht.gitGraph.arrowMarkerAbsolute=Ht.arrowMarkerAbsolute);const Vt=(t,e="")=>Object.keys(t).reduce(((n,i)=>Array.isArray(t[i])?n:"object"==typeof t[i]&&null!==t[i]?[...n,e+i,...Vt(t[i],"")]:[...n,e+i]),[]),Gt=Vt(Ht,""),Xt=Ht;function Qt(t){return null==t}var Kt={isNothing:Qt,isObject:function(t){return"object"==typeof t&&null!==t},toArray:function(t){return Array.isArray(t)?t:Qt(t)?[]:[t]},repeat:function(t,e){var n,i="";for(n=0;n<e;n+=1)i+=t;return i},isNegativeZero:function(t){return 0===t&&Number.NEGATIVE_INFINITY===1/t},extend:function(t,e){var n,i,r,a;if(e)for(n=0,i=(a=Object.keys(e)).length;n<i;n+=1)t[r=a[n]]=e[r];return t}};function Jt(t,e){var n="",i=t.reason||"(unknown reason)";return t.mark?(t.mark.name&&(n+='in "'+t.mark.name+'" '),n+="("+(t.mark.line+1)+":"+(t.mark.column+1)+")",!e&&t.mark.snippet&&(n+="\n\n"+t.mark.snippet),i+" "+n):i}function te(t,e){Error.call(this),this.name="YAMLException",this.reason=t,this.mark=e,this.message=Jt(this,!1),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack||""}te.prototype=Object.create(Error.prototype),te.prototype.constructor=te,te.prototype.toString=function(t){return this.name+": "+Jt(this,t)};var ee=te;function ne(t,e,n,i,r){var a="",s="",o=Math.floor(r/2)-1;return i-e>o&&(e=i-o+(a=" ... ").length),n-i>o&&(n=i+o-(s=" ...").length),{str:a+t.slice(e,n).replace(/\t/g,"\u2192")+s,pos:i-e+a.length}}function ie(t,e){return Kt.repeat(" ",e-t.length)+t}var re=function(t,e){if(e=Object.create(e||null),!t.buffer)return null;e.maxLength||(e.maxLength=79),"number"!=typeof e.indent&&(e.indent=1),"number"!=typeof e.linesBefore&&(e.linesBefore=3),"number"!=typeof e.linesAfter&&(e.linesAfter=2);for(var n,i=/\r?\n|\r|\0/g,r=[0],a=[],s=-1;n=i.exec(t.buffer);)a.push(n.index),r.push(n.index+n[0].length),t.position<=n.index&&s<0&&(s=r.length-2);s<0&&(s=r.length-1);var o,c,l="",h=Math.min(t.line+e.linesAfter,a.length).toString().length,u=e.maxLength-(e.indent+h+3);for(o=1;o<=e.linesBefore&&!(s-o<0);o++)c=ne(t.buffer,r[s-o],a[s-o],t.position-(r[s]-r[s-o]),u),l=Kt.repeat(" ",e.indent)+ie((t.line-o+1).toString(),h)+" | "+c.str+"\n"+l;for(c=ne(t.buffer,r[s],a[s],t.position,u),l+=Kt.repeat(" ",e.indent)+ie((t.line+1).toString(),h)+" | "+c.str+"\n",l+=Kt.repeat("-",e.indent+h+3+c.pos)+"^\n",o=1;o<=e.linesAfter&&!(s+o>=a.length);o++)c=ne(t.buffer,r[s+o],a[s+o],t.position-(r[s]-r[s+o]),u),l+=Kt.repeat(" ",e.indent)+ie((t.line+o+1).toString(),h)+" | "+c.str+"\n";return l.replace(/\n$/,"")},ae=["kind","multi","resolve","construct","instanceOf","predicate","represent","representName","defaultStyle","styleAliases"],se=["scalar","sequence","mapping"];var oe=function(t,e){var n,i;if(e=e||{},Object.keys(e).forEach((function(e){if(-1===ae.indexOf(e))throw new ee('Unknown option "'+e+'" is met in definition of "'+t+'" YAML type.')})),this.options=e,this.tag=t,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(t){return t},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.representName=e.representName||null,this.defaultStyle=e.defaultStyle||null,this.multi=e.multi||!1,this.styleAliases=(n=e.styleAliases||null,i={},null!==n&&Object.keys(n).forEach((function(t){n[t].forEach((function(e){i[String(e)]=t}))})),i),-1===se.indexOf(this.kind))throw new ee('Unknown kind "'+this.kind+'" is specified for "'+t+'" YAML type.')};function ce(t,e){var n=[];return t[e].forEach((function(t){var e=n.length;n.forEach((function(n,i){n.tag===t.tag&&n.kind===t.kind&&n.multi===t.multi&&(e=i)})),n[e]=t})),n}function le(t){return this.extend(t)}le.prototype.extend=function(t){var e=[],n=[];if(t instanceof oe)n.push(t);else if(Array.isArray(t))n=n.concat(t);else{if(!t||!Array.isArray(t.implicit)&&!Array.isArray(t.explicit))throw new ee("Schema.extend argument should be a Type, [ Type ], or a schema definition ({ implicit: [...], explicit: [...] })");t.implicit&&(e=e.concat(t.implicit)),t.explicit&&(n=n.concat(t.explicit))}e.forEach((function(t){if(!(t instanceof oe))throw new ee("Specified list of YAML types (or a single Type object) contains a non-Type object.");if(t.loadKind&&"scalar"!==t.loadKind)throw new ee("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.");if(t.multi)throw new ee("There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.")})),n.forEach((function(t){if(!(t instanceof oe))throw new ee("Specified list of YAML types (or a single Type object) contains a non-Type object.")}));var i=Object.create(le.prototype);return i.implicit=(this.implicit||[]).concat(e),i.explicit=(this.explicit||[]).concat(n),i.compiledImplicit=ce(i,"implicit"),i.compiledExplicit=ce(i,"explicit"),i.compiledTypeMap=function(){var t,e,n={scalar:{},sequence:{},mapping:{},fallback:{},multi:{scalar:[],sequence:[],mapping:[],fallback:[]}};function i(t){t.multi?(n.multi[t.kind].push(t),n.multi.fallback.push(t)):n[t.kind][t.tag]=n.fallback[t.tag]=t}for(t=0,e=arguments.length;t<e;t+=1)arguments[t].forEach(i);return n}(i.compiledImplicit,i.compiledExplicit),i};var he=new le({explicit:[new oe("tag:yaml.org,2002:str",{kind:"scalar",construct:function(t){return null!==t?t:""}}),new oe("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(t){return null!==t?t:[]}}),new oe("tag:yaml.org,2002:map",{kind:"mapping",construct:function(t){return null!==t?t:{}}})]});var ue=new oe("tag:yaml.org,2002:null",{kind:"scalar",resolve:function(t){if(null===t)return!0;var e=t.length;return 1===e&&"~"===t||4===e&&("null"===t||"Null"===t||"NULL"===t)},construct:function(){return null},predicate:function(t){return null===t},represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"},empty:function(){return""}},defaultStyle:"lowercase"});var de=new oe("tag:yaml.org,2002:bool",{kind:"scalar",resolve:function(t){if(null===t)return!1;var e=t.length;return 4===e&&("true"===t||"True"===t||"TRUE"===t)||5===e&&("false"===t||"False"===t||"FALSE"===t)},construct:function(t){return"true"===t||"True"===t||"TRUE"===t},predicate:function(t){return"[object Boolean]"===Object.prototype.toString.call(t)},represent:{lowercase:function(t){return t?"true":"false"},uppercase:function(t){return t?"TRUE":"FALSE"},camelcase:function(t){return t?"True":"False"}},defaultStyle:"lowercase"});function pe(t){return 48<=t&&t<=55}function fe(t){return 48<=t&&t<=57}var ge=new oe("tag:yaml.org,2002:int",{kind:"scalar",resolve:function(t){if(null===t)return!1;var e,n,i=t.length,r=0,a=!1;if(!i)return!1;if("-"!==(e=t[r])&&"+"!==e||(e=t[++r]),"0"===e){if(r+1===i)return!0;if("b"===(e=t[++r])){for(r++;r<i;r++)if("_"!==(e=t[r])){if("0"!==e&&"1"!==e)return!1;a=!0}return a&&"_"!==e}if("x"===e){for(r++;r<i;r++)if("_"!==(e=t[r])){if(!(48<=(n=t.charCodeAt(r))&&n<=57||65<=n&&n<=70||97<=n&&n<=102))return!1;a=!0}return a&&"_"!==e}if("o"===e){for(r++;r<i;r++)if("_"!==(e=t[r])){if(!pe(t.charCodeAt(r)))return!1;a=!0}return a&&"_"!==e}}if("_"===e)return!1;for(;r<i;r++)if("_"!==(e=t[r])){if(!fe(t.charCodeAt(r)))return!1;a=!0}return!(!a||"_"===e)},construct:function(t){var e,n=t,i=1;if(-1!==n.indexOf("_")&&(n=n.replace(/_/g,"")),"-"!==(e=n[0])&&"+"!==e||("-"===e&&(i=-1),e=(n=n.slice(1))[0]),"0"===n)return 0;if("0"===e){if("b"===n[1])return i*parseInt(n.slice(2),2);if("x"===n[1])return i*parseInt(n.slice(2),16);if("o"===n[1])return i*parseInt(n.slice(2),8)}return i*parseInt(n,10)},predicate:function(t){return"[object Number]"===Object.prototype.toString.call(t)&&t%1==0&&!Kt.isNegativeZero(t)},represent:{binary:function(t){return t>=0?"0b"+t.toString(2):"-0b"+t.toString(2).slice(1)},octal:function(t){return t>=0?"0o"+t.toString(8):"-0o"+t.toString(8).slice(1)},decimal:function(t){return t.toString(10)},hexadecimal:function(t){return t>=0?"0x"+t.toString(16).toUpperCase():"-0x"+t.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}}),ye=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");var me=/^[-+]?[0-9]+e/;var be=new oe("tag:yaml.org,2002:float",{kind:"scalar",resolve:function(t){return null!==t&&!(!ye.test(t)||"_"===t[t.length-1])},construct:function(t){var e,n;return n="-"===(e=t.replace(/_/g,"").toLowerCase())[0]?-1:1,"+-".indexOf(e[0])>=0&&(e=e.slice(1)),".inf"===e?1===n?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:".nan"===e?NaN:n*parseFloat(e,10)},predicate:function(t){return"[object Number]"===Object.prototype.toString.call(t)&&(t%1!=0||Kt.isNegativeZero(t))},represent:function(t,e){var n;if(isNaN(t))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===t)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===t)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(Kt.isNegativeZero(t))return"-0.0";return n=t.toString(10),me.test(n)?n.replace("e",".e"):n},defaultStyle:"lowercase"}),_e=he.extend({implicit:[ue,de,ge,be]}),xe=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),ve=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");var ke=new oe("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:function(t){return null!==t&&(null!==xe.exec(t)||null!==ve.exec(t))},construct:function(t){var e,n,i,r,a,s,o,c,l=0,h=null;if(null===(e=xe.exec(t))&&(e=ve.exec(t)),null===e)throw new Error("Date resolve error");if(n=+e[1],i=+e[2]-1,r=+e[3],!e[4])return new Date(Date.UTC(n,i,r));if(a=+e[4],s=+e[5],o=+e[6],e[7]){for(l=e[7].slice(0,3);l.length<3;)l+="0";l=+l}return e[9]&&(h=6e4*(60*+e[10]+ +(e[11]||0)),"-"===e[9]&&(h=-h)),c=new Date(Date.UTC(n,i,r,a,s,o,l)),h&&c.setTime(c.getTime()-h),c},instanceOf:Date,represent:function(t){return t.toISOString()}});var we=new oe("tag:yaml.org,2002:merge",{kind:"scalar",resolve:function(t){return"<<"===t||null===t}}),Ce="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r";var Te=new oe("tag:yaml.org,2002:binary",{kind:"scalar",resolve:function(t){if(null===t)return!1;var e,n,i=0,r=t.length,a=Ce;for(n=0;n<r;n++)if(!((e=a.indexOf(t.charAt(n)))>64)){if(e<0)return!1;i+=6}return i%8==0},construct:function(t){var e,n,i=t.replace(/[\r\n=]/g,""),r=i.length,a=Ce,s=0,o=[];for(e=0;e<r;e++)e%4==0&&e&&(o.push(s>>16&255),o.push(s>>8&255),o.push(255&s)),s=s<<6|a.indexOf(i.charAt(e));return 0===(n=r%4*6)?(o.push(s>>16&255),o.push(s>>8&255),o.push(255&s)):18===n?(o.push(s>>10&255),o.push(s>>2&255)):12===n&&o.push(s>>4&255),new Uint8Array(o)},predicate:function(t){return"[object Uint8Array]"===Object.prototype.toString.call(t)},represent:function(t){var e,n,i="",r=0,a=t.length,s=Ce;for(e=0;e<a;e++)e%3==0&&e&&(i+=s[r>>18&63],i+=s[r>>12&63],i+=s[r>>6&63],i+=s[63&r]),r=(r<<8)+t[e];return 0===(n=a%3)?(i+=s[r>>18&63],i+=s[r>>12&63],i+=s[r>>6&63],i+=s[63&r]):2===n?(i+=s[r>>10&63],i+=s[r>>4&63],i+=s[r<<2&63],i+=s[64]):1===n&&(i+=s[r>>2&63],i+=s[r<<4&63],i+=s[64],i+=s[64]),i}}),Ee=Object.prototype.hasOwnProperty,Se=Object.prototype.toString;var Ae=new oe("tag:yaml.org,2002:omap",{kind:"sequence",resolve:function(t){if(null===t)return!0;var e,n,i,r,a,s=[],o=t;for(e=0,n=o.length;e<n;e+=1){if(i=o[e],a=!1,"[object Object]"!==Se.call(i))return!1;for(r in i)if(Ee.call(i,r)){if(a)return!1;a=!0}if(!a)return!1;if(-1!==s.indexOf(r))return!1;s.push(r)}return!0},construct:function(t){return null!==t?t:[]}}),Le=Object.prototype.toString;var Be=new oe("tag:yaml.org,2002:pairs",{kind:"sequence",resolve:function(t){if(null===t)return!0;var e,n,i,r,a,s=t;for(a=new Array(s.length),e=0,n=s.length;e<n;e+=1){if(i=s[e],"[object Object]"!==Le.call(i))return!1;if(1!==(r=Object.keys(i)).length)return!1;a[e]=[r[0],i[r[0]]]}return!0},construct:function(t){if(null===t)return[];var e,n,i,r,a,s=t;for(a=new Array(s.length),e=0,n=s.length;e<n;e+=1)i=s[e],r=Object.keys(i),a[e]=[r[0],i[r[0]]];return a}}),Ne=Object.prototype.hasOwnProperty;var De=new oe("tag:yaml.org,2002:set",{kind:"mapping",resolve:function(t){if(null===t)return!0;var e,n=t;for(e in n)if(Ne.call(n,e)&&null!==n[e])return!1;return!0},construct:function(t){return null!==t?t:{}}}),Oe=_e.extend({implicit:[ke,we],explicit:[Te,Ae,Be,De]}),Me=Object.prototype.hasOwnProperty,Ie=1,Fe=2,$e=3,Re=4,Ze=1,Pe=2,je=3,Ye=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,ze=/[\x85\u2028\u2029]/,Ue=/[,\[\]\{\}]/,We=/^(?:!|!!|![a-z\-]+!)$/i,qe=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function He(t){return Object.prototype.toString.call(t)}function Ve(t){return 10===t||13===t}function Ge(t){return 9===t||32===t}function Xe(t){return 9===t||32===t||10===t||13===t}function Qe(t){return 44===t||91===t||93===t||123===t||125===t}function Ke(t){var e;return 48<=t&&t<=57?t-48:97<=(e=32|t)&&e<=102?e-97+10:-1}function Je(t){return 48===t?"\0":97===t?"\x07":98===t?"\b":116===t||9===t?"\t":110===t?"\n":118===t?"\v":102===t?"\f":114===t?"\r":101===t?"\x1b":32===t?" ":34===t?'"':47===t?"/":92===t?"\\":78===t?"\x85":95===t?"\xa0":76===t?"\u2028":80===t?"\u2029":""}function tn(t){return t<=65535?String.fromCharCode(t):String.fromCharCode(55296+(t-65536>>10),56320+(t-65536&1023))}for(var en=new Array(256),nn=new Array(256),rn=0;rn<256;rn++)en[rn]=Je(rn)?1:0,nn[rn]=Je(rn);function an(t,e){this.input=t,this.filename=e.filename||null,this.schema=e.schema||Oe,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=t.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.firstTabInLine=-1,this.documents=[]}function sn(t,e){var n={name:t.filename,buffer:t.input.slice(0,-1),position:t.position,line:t.line,column:t.position-t.lineStart};return n.snippet=re(n),new ee(e,n)}function on(t,e){throw sn(t,e)}function cn(t,e){t.onWarning&&t.onWarning.call(null,sn(t,e))}var ln={YAML:function(t,e,n){var i,r,a;null!==t.version&&on(t,"duplication of %YAML directive"),1!==n.length&&on(t,"YAML directive accepts exactly one argument"),null===(i=/^([0-9]+)\.([0-9]+)$/.exec(n[0]))&&on(t,"ill-formed argument of the YAML directive"),r=parseInt(i[1],10),a=parseInt(i[2],10),1!==r&&on(t,"unacceptable YAML version of the document"),t.version=n[0],t.checkLineBreaks=a<2,1!==a&&2!==a&&cn(t,"unsupported YAML version of the document")},TAG:function(t,e,n){var i,r;2!==n.length&&on(t,"TAG directive accepts exactly two arguments"),i=n[0],r=n[1],We.test(i)||on(t,"ill-formed tag handle (first argument) of the TAG directive"),Me.call(t.tagMap,i)&&on(t,'there is a previously declared suffix for "'+i+'" tag handle'),qe.test(r)||on(t,"ill-formed tag prefix (second argument) of the TAG directive");try{r=decodeURIComponent(r)}catch(a){on(t,"tag prefix is malformed: "+r)}t.tagMap[i]=r}};function hn(t,e,n,i){var r,a,s,o;if(e<n){if(o=t.input.slice(e,n),i)for(r=0,a=o.length;r<a;r+=1)9===(s=o.charCodeAt(r))||32<=s&&s<=1114111||on(t,"expected valid JSON character");else Ye.test(o)&&on(t,"the stream contains non-printable characters");t.result+=o}}function un(t,e,n,i){var r,a,s,o;for(Kt.isObject(n)||on(t,"cannot merge mappings; the provided source object is unacceptable"),s=0,o=(r=Object.keys(n)).length;s<o;s+=1)a=r[s],Me.call(e,a)||(e[a]=n[a],i[a]=!0)}function dn(t,e,n,i,r,a,s,o,c){var l,h;if(Array.isArray(r))for(l=0,h=(r=Array.prototype.slice.call(r)).length;l<h;l+=1)Array.isArray(r[l])&&on(t,"nested arrays are not supported inside keys"),"object"==typeof r&&"[object Object]"===He(r[l])&&(r[l]="[object Object]");if("object"==typeof r&&"[object Object]"===He(r)&&(r="[object Object]"),r=String(r),null===e&&(e={}),"tag:yaml.org,2002:merge"===i)if(Array.isArray(a))for(l=0,h=a.length;l<h;l+=1)un(t,e,a[l],n);else un(t,e,a,n);else t.json||Me.call(n,r)||!Me.call(e,r)||(t.line=s||t.line,t.lineStart=o||t.lineStart,t.position=c||t.position,on(t,"duplicated mapping key")),"__proto__"===r?Object.defineProperty(e,r,{configurable:!0,enumerable:!0,writable:!0,value:a}):e[r]=a,delete n[r];return e}function pn(t){var e;10===(e=t.input.charCodeAt(t.position))?t.position++:13===e?(t.position++,10===t.input.charCodeAt(t.position)&&t.position++):on(t,"a line break is expected"),t.line+=1,t.lineStart=t.position,t.firstTabInLine=-1}function fn(t,e,n){for(var i=0,r=t.input.charCodeAt(t.position);0!==r;){for(;Ge(r);)9===r&&-1===t.firstTabInLine&&(t.firstTabInLine=t.position),r=t.input.charCodeAt(++t.position);if(e&&35===r)do{r=t.input.charCodeAt(++t.position)}while(10!==r&&13!==r&&0!==r);if(!Ve(r))break;for(pn(t),r=t.input.charCodeAt(t.position),i++,t.lineIndent=0;32===r;)t.lineIndent++,r=t.input.charCodeAt(++t.position)}return-1!==n&&0!==i&&t.lineIndent<n&&cn(t,"deficient indentation"),i}function gn(t){var e,n=t.position;return!(45!==(e=t.input.charCodeAt(n))&&46!==e||e!==t.input.charCodeAt(n+1)||e!==t.input.charCodeAt(n+2)||(n+=3,0!==(e=t.input.charCodeAt(n))&&!Xe(e)))}function yn(t,e){1===e?t.result+=" ":e>1&&(t.result+=Kt.repeat("\n",e-1))}function mn(t,e){var n,i,r=t.tag,a=t.anchor,s=[],o=!1;if(-1!==t.firstTabInLine)return!1;for(null!==t.anchor&&(t.anchorMap[t.anchor]=s),i=t.input.charCodeAt(t.position);0!==i&&(-1!==t.firstTabInLine&&(t.position=t.firstTabInLine,on(t,"tab characters must not be used in indentation")),45===i)&&Xe(t.input.charCodeAt(t.position+1));)if(o=!0,t.position++,fn(t,!0,-1)&&t.lineIndent<=e)s.push(null),i=t.input.charCodeAt(t.position);else if(n=t.line,xn(t,e,$e,!1,!0),s.push(t.result),fn(t,!0,-1),i=t.input.charCodeAt(t.position),(t.line===n||t.lineIndent>e)&&0!==i)on(t,"bad indentation of a sequence entry");else if(t.lineIndent<e)break;return!!o&&(t.tag=r,t.anchor=a,t.kind="sequence",t.result=s,!0)}function bn(t){var e,n,i,r,a=!1,s=!1;if(33!==(r=t.input.charCodeAt(t.position)))return!1;if(null!==t.tag&&on(t,"duplication of a tag property"),60===(r=t.input.charCodeAt(++t.position))?(a=!0,r=t.input.charCodeAt(++t.position)):33===r?(s=!0,n="!!",r=t.input.charCodeAt(++t.position)):n="!",e=t.position,a){do{r=t.input.charCodeAt(++t.position)}while(0!==r&&62!==r);t.position<t.length?(i=t.input.slice(e,t.position),r=t.input.charCodeAt(++t.position)):on(t,"unexpected end of the stream within a verbatim tag")}else{for(;0!==r&&!Xe(r);)33===r&&(s?on(t,"tag suffix cannot contain exclamation marks"):(n=t.input.slice(e-1,t.position+1),We.test(n)||on(t,"named tag handle cannot contain such characters"),s=!0,e=t.position+1)),r=t.input.charCodeAt(++t.position);i=t.input.slice(e,t.position),Ue.test(i)&&on(t,"tag suffix cannot contain flow indicator characters")}i&&!qe.test(i)&&on(t,"tag name cannot contain such characters: "+i);try{i=decodeURIComponent(i)}catch(o){on(t,"tag name is malformed: "+i)}return a?t.tag=i:Me.call(t.tagMap,n)?t.tag=t.tagMap[n]+i:"!"===n?t.tag="!"+i:"!!"===n?t.tag="tag:yaml.org,2002:"+i:on(t,'undeclared tag handle "'+n+'"'),!0}function _n(t){var e,n;if(38!==(n=t.input.charCodeAt(t.position)))return!1;for(null!==t.anchor&&on(t,"duplication of an anchor property"),n=t.input.charCodeAt(++t.position),e=t.position;0!==n&&!Xe(n)&&!Qe(n);)n=t.input.charCodeAt(++t.position);return t.position===e&&on(t,"name of an anchor node must contain at least one character"),t.anchor=t.input.slice(e,t.position),!0}function xn(t,e,n,i,r){var a,s,o,c,l,h,u,d,p,f=1,g=!1,y=!1;if(null!==t.listener&&t.listener("open",t),t.tag=null,t.anchor=null,t.kind=null,t.result=null,a=s=o=Re===n||$e===n,i&&fn(t,!0,-1)&&(g=!0,t.lineIndent>e?f=1:t.lineIndent===e?f=0:t.lineIndent<e&&(f=-1)),1===f)for(;bn(t)||_n(t);)fn(t,!0,-1)?(g=!0,o=a,t.lineIndent>e?f=1:t.lineIndent===e?f=0:t.lineIndent<e&&(f=-1)):o=!1;if(o&&(o=g||r),1!==f&&Re!==n||(d=Ie===n||Fe===n?e:e+1,p=t.position-t.lineStart,1===f?o&&(mn(t,p)||function(t,e,n){var i,r,a,s,o,c,l,h=t.tag,u=t.anchor,d={},p=Object.create(null),f=null,g=null,y=null,m=!1,b=!1;if(-1!==t.firstTabInLine)return!1;for(null!==t.anchor&&(t.anchorMap[t.anchor]=d),l=t.input.charCodeAt(t.position);0!==l;){if(m||-1===t.firstTabInLine||(t.position=t.firstTabInLine,on(t,"tab characters must not be used in indentation")),i=t.input.charCodeAt(t.position+1),a=t.line,63!==l&&58!==l||!Xe(i)){if(s=t.line,o=t.lineStart,c=t.position,!xn(t,n,Fe,!1,!0))break;if(t.line===a){for(l=t.input.charCodeAt(t.position);Ge(l);)l=t.input.charCodeAt(++t.position);if(58===l)Xe(l=t.input.charCodeAt(++t.position))||on(t,"a whitespace character is expected after the key-value separator within a block mapping"),m&&(dn(t,d,p,f,g,null,s,o,c),f=g=y=null),b=!0,m=!1,r=!1,f=t.tag,g=t.result;else{if(!b)return t.tag=h,t.anchor=u,!0;on(t,"can not read an implicit mapping pair; a colon is missed")}}else{if(!b)return t.tag=h,t.anchor=u,!0;on(t,"can not read a block mapping entry; a multiline key may not be an implicit key")}}else 63===l?(m&&(dn(t,d,p,f,g,null,s,o,c),f=g=y=null),b=!0,m=!0,r=!0):m?(m=!1,r=!0):on(t,"incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line"),t.position+=1,l=i;if((t.line===a||t.lineIndent>e)&&(m&&(s=t.line,o=t.lineStart,c=t.position),xn(t,e,Re,!0,r)&&(m?g=t.result:y=t.result),m||(dn(t,d,p,f,g,y,s,o,c),f=g=y=null),fn(t,!0,-1),l=t.input.charCodeAt(t.position)),(t.line===a||t.lineIndent>e)&&0!==l)on(t,"bad indentation of a mapping entry");else if(t.lineIndent<e)break}return m&&dn(t,d,p,f,g,null,s,o,c),b&&(t.tag=h,t.anchor=u,t.kind="mapping",t.result=d),b}(t,p,d))||function(t,e){var n,i,r,a,s,o,c,l,h,u,d,p,f=!0,g=t.tag,y=t.anchor,m=Object.create(null);if(91===(p=t.input.charCodeAt(t.position)))s=93,l=!1,a=[];else{if(123!==p)return!1;s=125,l=!0,a={}}for(null!==t.anchor&&(t.anchorMap[t.anchor]=a),p=t.input.charCodeAt(++t.position);0!==p;){if(fn(t,!0,e),(p=t.input.charCodeAt(t.position))===s)return t.position++,t.tag=g,t.anchor=y,t.kind=l?"mapping":"sequence",t.result=a,!0;f?44===p&&on(t,"expected the node content, but found ','"):on(t,"missed comma between flow collection entries"),d=null,o=c=!1,63===p&&Xe(t.input.charCodeAt(t.position+1))&&(o=c=!0,t.position++,fn(t,!0,e)),n=t.line,i=t.lineStart,r=t.position,xn(t,e,Ie,!1,!0),u=t.tag,h=t.result,fn(t,!0,e),p=t.input.charCodeAt(t.position),!c&&t.line!==n||58!==p||(o=!0,p=t.input.charCodeAt(++t.position),fn(t,!0,e),xn(t,e,Ie,!1,!0),d=t.result),l?dn(t,a,m,u,h,d,n,i,r):o?a.push(dn(t,null,m,u,h,d,n,i,r)):a.push(h),fn(t,!0,e),44===(p=t.input.charCodeAt(t.position))?(f=!0,p=t.input.charCodeAt(++t.position)):f=!1}on(t,"unexpected end of the stream within a flow collection")}(t,d)?y=!0:(s&&function(t,e){var n,i,r,a,s,o=Ze,c=!1,l=!1,h=e,u=0,d=!1;if(124===(a=t.input.charCodeAt(t.position)))i=!1;else{if(62!==a)return!1;i=!0}for(t.kind="scalar",t.result="";0!==a;)if(43===(a=t.input.charCodeAt(++t.position))||45===a)Ze===o?o=43===a?je:Pe:on(t,"repeat of a chomping mode identifier");else{if(!((r=48<=(s=a)&&s<=57?s-48:-1)>=0))break;0===r?on(t,"bad explicit indentation width of a block scalar; it cannot be less than one"):l?on(t,"repeat of an indentation width identifier"):(h=e+r-1,l=!0)}if(Ge(a)){do{a=t.input.charCodeAt(++t.position)}while(Ge(a));if(35===a)do{a=t.input.charCodeAt(++t.position)}while(!Ve(a)&&0!==a)}for(;0!==a;){for(pn(t),t.lineIndent=0,a=t.input.charCodeAt(t.position);(!l||t.lineIndent<h)&&32===a;)t.lineIndent++,a=t.input.charCodeAt(++t.position);if(!l&&t.lineIndent>h&&(h=t.lineIndent),Ve(a))u++;else{if(t.lineIndent<h){o===je?t.result+=Kt.repeat("\n",c?1+u:u):o===Ze&&c&&(t.result+="\n");break}for(i?Ge(a)?(d=!0,t.result+=Kt.repeat("\n",c?1+u:u)):d?(d=!1,t.result+=Kt.repeat("\n",u+1)):0===u?c&&(t.result+=" "):t.result+=Kt.repeat("\n",u):t.result+=Kt.repeat("\n",c?1+u:u),c=!0,l=!0,u=0,n=t.position;!Ve(a)&&0!==a;)a=t.input.charCodeAt(++t.position);hn(t,n,t.position,!1)}}return!0}(t,d)||function(t,e){var n,i,r;if(39!==(n=t.input.charCodeAt(t.position)))return!1;for(t.kind="scalar",t.result="",t.position++,i=r=t.position;0!==(n=t.input.charCodeAt(t.position));)if(39===n){if(hn(t,i,t.position,!0),39!==(n=t.input.charCodeAt(++t.position)))return!0;i=t.position,t.position++,r=t.position}else Ve(n)?(hn(t,i,r,!0),yn(t,fn(t,!1,e)),i=r=t.position):t.position===t.lineStart&&gn(t)?on(t,"unexpected end of the document within a single quoted scalar"):(t.position++,r=t.position);on(t,"unexpected end of the stream within a single quoted scalar")}(t,d)||function(t,e){var n,i,r,a,s,o,c;if(34!==(o=t.input.charCodeAt(t.position)))return!1;for(t.kind="scalar",t.result="",t.position++,n=i=t.position;0!==(o=t.input.charCodeAt(t.position));){if(34===o)return hn(t,n,t.position,!0),t.position++,!0;if(92===o){if(hn(t,n,t.position,!0),Ve(o=t.input.charCodeAt(++t.position)))fn(t,!1,e);else if(o<256&&en[o])t.result+=nn[o],t.position++;else if((s=120===(c=o)?2:117===c?4:85===c?8:0)>0){for(r=s,a=0;r>0;r--)(s=Ke(o=t.input.charCodeAt(++t.position)))>=0?a=(a<<4)+s:on(t,"expected hexadecimal character");t.result+=tn(a),t.position++}else on(t,"unknown escape sequence");n=i=t.position}else Ve(o)?(hn(t,n,i,!0),yn(t,fn(t,!1,e)),n=i=t.position):t.position===t.lineStart&&gn(t)?on(t,"unexpected end of the document within a double quoted scalar"):(t.position++,i=t.position)}on(t,"unexpected end of the stream within a double quoted scalar")}(t,d)?y=!0:!function(t){var e,n,i;if(42!==(i=t.input.charCodeAt(t.position)))return!1;for(i=t.input.charCodeAt(++t.position),e=t.position;0!==i&&!Xe(i)&&!Qe(i);)i=t.input.charCodeAt(++t.position);return t.position===e&&on(t,"name of an alias node must contain at least one character"),n=t.input.slice(e,t.position),Me.call(t.anchorMap,n)||on(t,'unidentified alias "'+n+'"'),t.result=t.anchorMap[n],fn(t,!0,-1),!0}(t)?function(t,e,n){var i,r,a,s,o,c,l,h,u=t.kind,d=t.result;if(Xe(h=t.input.charCodeAt(t.position))||Qe(h)||35===h||38===h||42===h||33===h||124===h||62===h||39===h||34===h||37===h||64===h||96===h)return!1;if((63===h||45===h)&&(Xe(i=t.input.charCodeAt(t.position+1))||n&&Qe(i)))return!1;for(t.kind="scalar",t.result="",r=a=t.position,s=!1;0!==h;){if(58===h){if(Xe(i=t.input.charCodeAt(t.position+1))||n&&Qe(i))break}else if(35===h){if(Xe(t.input.charCodeAt(t.position-1)))break}else{if(t.position===t.lineStart&&gn(t)||n&&Qe(h))break;if(Ve(h)){if(o=t.line,c=t.lineStart,l=t.lineIndent,fn(t,!1,-1),t.lineIndent>=e){s=!0,h=t.input.charCodeAt(t.position);continue}t.position=a,t.line=o,t.lineStart=c,t.lineIndent=l;break}}s&&(hn(t,r,a,!1),yn(t,t.line-o),r=a=t.position,s=!1),Ge(h)||(a=t.position+1),h=t.input.charCodeAt(++t.position)}return hn(t,r,a,!1),!!t.result||(t.kind=u,t.result=d,!1)}(t,d,Ie===n)&&(y=!0,null===t.tag&&(t.tag="?")):(y=!0,null===t.tag&&null===t.anchor||on(t,"alias node should not have any properties")),null!==t.anchor&&(t.anchorMap[t.anchor]=t.result)):0===f&&(y=o&&mn(t,p))),null===t.tag)null!==t.anchor&&(t.anchorMap[t.anchor]=t.result);else if("?"===t.tag){for(null!==t.result&&"scalar"!==t.kind&&on(t,'unacceptable node kind for !<?> tag; it should be "scalar", not "'+t.kind+'"'),c=0,l=t.implicitTypes.length;c<l;c+=1)if((u=t.implicitTypes[c]).resolve(t.result)){t.result=u.construct(t.result),t.tag=u.tag,null!==t.anchor&&(t.anchorMap[t.anchor]=t.result);break}}else if("!"!==t.tag){if(Me.call(t.typeMap[t.kind||"fallback"],t.tag))u=t.typeMap[t.kind||"fallback"][t.tag];else for(u=null,c=0,l=(h=t.typeMap.multi[t.kind||"fallback"]).length;c<l;c+=1)if(t.tag.slice(0,h[c].tag.length)===h[c].tag){u=h[c];break}u||on(t,"unknown tag !<"+t.tag+">"),null!==t.result&&u.kind!==t.kind&&on(t,"unacceptable node kind for !<"+t.tag+'> tag; it should be "'+u.kind+'", not "'+t.kind+'"'),u.resolve(t.result,t.tag)?(t.result=u.construct(t.result,t.tag),null!==t.anchor&&(t.anchorMap[t.anchor]=t.result)):on(t,"cannot resolve a node with !<"+t.tag+"> explicit tag")}return null!==t.listener&&t.listener("close",t),null!==t.tag||null!==t.anchor||y}function vn(t){var e,n,i,r,a=t.position,s=!1;for(t.version=null,t.checkLineBreaks=t.legacy,t.tagMap=Object.create(null),t.anchorMap=Object.create(null);0!==(r=t.input.charCodeAt(t.position))&&(fn(t,!0,-1),r=t.input.charCodeAt(t.position),!(t.lineIndent>0||37!==r));){for(s=!0,r=t.input.charCodeAt(++t.position),e=t.position;0!==r&&!Xe(r);)r=t.input.charCodeAt(++t.position);for(i=[],(n=t.input.slice(e,t.position)).length<1&&on(t,"directive name must not be less than one character in length");0!==r;){for(;Ge(r);)r=t.input.charCodeAt(++t.position);if(35===r){do{r=t.input.charCodeAt(++t.position)}while(0!==r&&!Ve(r));break}if(Ve(r))break;for(e=t.position;0!==r&&!Xe(r);)r=t.input.charCodeAt(++t.position);i.push(t.input.slice(e,t.position))}0!==r&&pn(t),Me.call(ln,n)?ln[n](t,n,i):cn(t,'unknown document directive "'+n+'"')}fn(t,!0,-1),0===t.lineIndent&&45===t.input.charCodeAt(t.position)&&45===t.input.charCodeAt(t.position+1)&&45===t.input.charCodeAt(t.position+2)?(t.position+=3,fn(t,!0,-1)):s&&on(t,"directives end mark is expected"),xn(t,t.lineIndent-1,Re,!1,!0),fn(t,!0,-1),t.checkLineBreaks&&ze.test(t.input.slice(a,t.position))&&cn(t,"non-ASCII line breaks are interpreted as content"),t.documents.push(t.result),t.position===t.lineStart&&gn(t)?46===t.input.charCodeAt(t.position)&&(t.position+=3,fn(t,!0,-1)):t.position<t.length-1&&on(t,"end of the stream or a document separator is expected")}function kn(t,e){e=e||{},0!==(t=String(t)).length&&(10!==t.charCodeAt(t.length-1)&&13!==t.charCodeAt(t.length-1)&&(t+="\n"),65279===t.charCodeAt(0)&&(t=t.slice(1)));var n=new an(t,e),i=t.indexOf("\0");for(-1!==i&&(n.position=i,on(n,"null byte is not allowed in input")),n.input+="\0";32===n.input.charCodeAt(n.position);)n.lineIndent+=1,n.position+=1;for(;n.position<n.length-1;)vn(n);return n.documents}var wn=he,Cn={loadAll:function(t,e,n){null!==e&&"object"==typeof e&&void 0===n&&(n=e,e=null);var i=kn(t,n);if("function"!=typeof e)return i;for(var r=0,a=i.length;r<a;r+=1)e(i[r])},load:function(t,e){var n=kn(t,e);if(0!==n.length){if(1===n.length)return n[0];throw new ee("expected a single document in the stream, but found more")}}}.load;const Tn=/^-{3}\s*[\n\r](.*?)[\n\r]-{3}\s*[\n\r]+/s;const En=/%{2}{\s*(?:(\w+)\s*:|(\w+))\s*(?:(\w+)|((?:(?!}%{2}).|\r?\n)*))?\s*(?:}%{2})?/gi,Sn=/\s*%%.*\n/gm,An={},Ln=function(t,e){t=t.replace(Tn,"").replace(En,"").replace(Sn,"\n");for(const[n,{detector:i}]of Object.entries(An)){if(i(t,e))return n}throw new Error(`No diagram type detected for text: ${t}`)},Bn=(...t)=>{for(const{id:e,detector:n,loader:i}of t)Nn(e,n,i)},Nn=(t,e,n)=>{An[t]?Bt.error(`Detector with key ${t} already exists`):An[t]={detector:e,loader:n},Bt.debug(`Detector with key ${t} added${n?" with loader":""}`)},Dn=function(t,e,n){const{depth:i,clobber:r}=Object.assign({depth:2,clobber:!1},n);return Array.isArray(e)&&!Array.isArray(t)?(e.forEach((e=>Dn(t,e,n))),t):Array.isArray(e)&&Array.isArray(t)?(e.forEach((e=>{t.includes(e)||t.push(e)})),t):void 0===t||i<=0?null!=t&&"object"==typeof t&&"object"==typeof e?Object.assign(t,e):e:(void 0!==e&&"object"==typeof t&&"object"==typeof e&&Object.keys(e).forEach((n=>{"object"!=typeof e[n]||void 0!==t[n]&&"object"!=typeof t[n]?(r||"object"!=typeof t[n]&&"object"!=typeof e[n])&&(t[n]=e[n]):(void 0===t[n]&&(t[n]=Array.isArray(e[n])?[]:{}),t[n]=Dn(t[n],e[n],{depth:i-1,clobber:r}))})),t)},On=Dn,Mn={curveBasis:o.$0Z,curveBasisClosed:o.Dts,curveBasisOpen:o.WQY,curveBumpX:o.qpX,curveBumpY:o.u93,curveBundle:o.tFB,curveCardinalClosed:o.OvA,curveCardinalOpen:o.dCK,curveCardinal:o.YY7,curveCatmullRomClosed:o.fGX,curveCatmullRomOpen:o.$m7,curveCatmullRom:o.zgE,curveLinear:o.c_6,curveLinearClosed:o.fxm,curveMonotoneX:o.FdL,curveMonotoneY:o.ak_,curveNatural:o.SxZ,curveStep:o.eA_,curveStepAfter:o.jsv,curveStepBefore:o.iJ},In=/%{2}{\s*(?:(\w+)\s*:|(\w+))\s*(?:(\w+)|((?:(?!}%{2}).|\r?\n)*))?\s*(?:}%{2})?/gi,Fn=/\s*(?:(\w+)(?=:):|(\w+))\s*(?:(\w+)|((?:(?!}%{2}).|\r?\n)*))?\s*(?:}%{2})?/gi,$n=function(t,e=null){try{const n=new RegExp(`[%]{2}(?![{]${Fn.source})(?=[}][%]{2}).*\n`,"ig");let i;t=t.trim().replace(n,"").replace(/'/gm,'"'),Bt.debug(`Detecting diagram directive${null!==e?" type:"+e:""} based on the text:${t}`);const r=[];for(;null!==(i=In.exec(t));)if(i.index===In.lastIndex&&In.lastIndex++,i&&!e||e&&i[1]&&i[1].match(e)||e&&i[2]&&i[2].match(e)){const t=i[1]?i[1]:i[2],e=i[3]?i[3].trim():i[4]?JSON.parse(i[4].trim()):null;r.push({type:t,args:e})}return 0===r.length&&r.push({type:t,args:null}),1===r.length?r[0]:r}catch(n){return Bt.error(`ERROR: ${n.message} - Unable to parse directive\n ${null!==e?" type:"+e:""} based on the text:${t}`),{type:null,args:null}}};function Rn(t,e){if(!t)return e;const n=`curve${t.charAt(0).toUpperCase()+t.slice(1)}`;return Mn[n]||e}function Zn(t,e){return t&&e?Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2)):0}function Pn(t){let e="",n="";for(const i of t)void 0!==i&&(i.startsWith("color:")||i.startsWith("text-align:")?n=n+i+";":e=e+i+";");return{style:e,labelStyle:n}}let jn=0;const Yn=()=>(jn++,"id-"+Math.random().toString(36).substr(2,12)+"-"+jn);const zn=t=>function(t){let e="";const n="0123456789abcdef";for(let i=0;i<t;i++)e+=n.charAt(Math.floor(16*Math.random()));return e}(t.length),Un=function(t,e){const n=e.text.replace(jt.lineBreakRegex," "),[,i]=ti(e.fontSize),r=t.append("text");r.attr("x",e.x),r.attr("y",e.y),r.style("text-anchor",e.anchor),r.style("font-family",e.fontFamily),r.style("font-size",i),r.style("font-weight",e.fontWeight),r.attr("fill",e.fill),void 0!==e.class&&r.attr("class",e.class);const a=r.append("tspan");return a.attr("x",e.x+2*e.textMargin),a.attr("fill",e.fill),a.text(n),r},Wn=(0,v.Z)(((t,e,n)=>{if(!t)return t;if(n=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial",joinWith:"<br/>"},n),jt.lineBreakRegex.test(t))return t;const i=t.split(" "),r=[];let a="";return i.forEach(((t,s)=>{const o=Vn(`${t} `,n),c=Vn(a,n);if(o>e){const{hyphenatedStrings:i,remainingWord:s}=qn(t,e,"-",n);r.push(a,...i),a=s}else c+o>=e?(r.push(a),a=t):a=[a,t].filter(Boolean).join(" ");s+1===i.length&&r.push(a)})),r.filter((t=>""!==t)).join(n.joinWith)}),((t,e,n)=>`${t}${e}${n.fontSize}${n.fontWeight}${n.fontFamily}${n.joinWith}`)),qn=(0,v.Z)(((t,e,n="-",i)=>{i=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial",margin:0},i);const r=[...t],a=[];let s="";return r.forEach(((t,o)=>{const c=`${s}${t}`;if(Vn(c,i)>=e){const t=o+1,e=r.length===t,i=`${c}${n}`;a.push(e?c:i),s=""}else s=c})),{hyphenatedStrings:a,remainingWord:s}}),((t,e,n="-",i)=>`${t}${e}${n}${i.fontSize}${i.fontWeight}${i.fontFamily}`));function Hn(t,e){return e=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial",margin:15},e),Gn(t,e).height}function Vn(t,e){return e=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial"},e),Gn(t,e).width}const Gn=(0,v.Z)(((t,e)=>{e=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial"},e);const{fontSize:n,fontFamily:i,fontWeight:r}=e;if(!t)return{width:0,height:0};const[,a]=ti(n),s=["sans-serif",i],c=t.split(jt.lineBreakRegex),l=[],h=(0,o.Ys)("body");if(!h.remove)return{width:0,height:0,lineHeight:0};const u=h.append("svg");for(const o of s){let t=0;const e={width:0,height:0,lineHeight:0};for(const n of c){const i={x:0,y:0,fill:void 0,anchor:"start",style:"#666",width:100,height:100,textMargin:0,rx:0,ry:0,valign:void 0};i.text=n;const s=Un(u,i).style("font-size",a).style("font-weight",r).style("font-family",o),c=(s._groups||s)[0][0].getBBox();e.width=Math.round(Math.max(e.width,c.width)),t=Math.round(c.height),e.height+=t,e.lineHeight=Math.round(Math.max(e.lineHeight,t))}l.push(e)}u.remove();return l[isNaN(l[1].height)||isNaN(l[1].width)||isNaN(l[1].lineHeight)||l[0].height>l[1].height&&l[0].width>l[1].width&&l[0].lineHeight>l[1].lineHeight?0:1]}),((t,e)=>`${t}${e.fontSize}${e.fontWeight}${e.fontFamily}`));let Xn;const Qn=t=>{if(Bt.debug("directiveSanitizer called with",t),"object"==typeof t&&(t.length?t.forEach((t=>Qn(t))):Object.keys(t).forEach((e=>{Bt.debug("Checking key",e),e.startsWith("__")&&(Bt.debug("sanitize deleting __ option",e),delete t[e]),e.includes("proto")&&(Bt.debug("sanitize deleting proto option",e),delete t[e]),e.includes("constr")&&(Bt.debug("sanitize deleting constr option",e),delete t[e]),e.includes("themeCSS")&&(Bt.debug("sanitizing themeCss option"),t[e]=Kn(t[e])),e.includes("fontFamily")&&(Bt.debug("sanitizing fontFamily option"),t[e]=Kn(t[e])),e.includes("altFontFamily")&&(Bt.debug("sanitizing altFontFamily option"),t[e]=Kn(t[e])),Gt.includes(e)?"object"==typeof t[e]&&(Bt.debug("sanitize deleting object",e),Qn(t[e])):(Bt.debug("sanitize deleting option",e),delete t[e])}))),t.themeVariables){const e=Object.keys(t.themeVariables);for(const n of e){const e=t.themeVariables[n];e&&e.match&&!e.match(/^[\d "#%(),.;A-Za-z]+$/)&&(t.themeVariables[n]="")}}Bt.debug("After sanitization",t)},Kn=t=>{let e=0,n=0;for(const i of t){if(e<n)return"{ /* ERROR: Unbalanced CSS */ }";"{"===i?e++:"}"===i&&n++}return e!==n?"{ /* ERROR: Unbalanced CSS */ }":t};function Jn(t){return"str"in t}const ti=t=>{if("number"==typeof t)return[t,t+"px"];const e=parseInt(t,10);return Number.isNaN(e)?[void 0,void 0]:t===String(e)?[e,t+"px"]:[e,t]},ei={assignWithDepth:On,wrapLabel:Wn,calculateTextHeight:Hn,calculateTextWidth:Vn,calculateTextDimensions:Gn,detectInit:function(t,e){const n=$n(t,/(?:init\b)|(?:initialize\b)/);let i={};if(Array.isArray(n)){const t=n.map((t=>t.args));Qn(t),i=On(i,[...t])}else i=n.args;if(i){let n=Ln(t,e);["config"].forEach((t=>{void 0!==i[t]&&("flowchart-v2"===n&&(n="flowchart"),i[n]=i[t],delete i[t])}))}return i},detectDirective:$n,isSubstringInArray:function(t,e){for(const[n,i]of e.entries())if(i.match(t))return n;return-1},interpolateToCurve:Rn,calcLabelPosition:function(t){return 1===t.length?t[0]:function(t){let e,n=0;t.forEach((t=>{n+=Zn(t,e),e=t}));let i,r=n/2;return e=void 0,t.forEach((t=>{if(e&&!i){const n=Zn(t,e);if(n<r)r-=n;else{const a=r/n;a<=0&&(i=e),a>=1&&(i={x:t.x,y:t.y}),a>0&&a<1&&(i={x:(1-a)*e.x+a*t.x,y:(1-a)*e.y+a*t.y})}}e=t})),i}(t)},calcCardinalityPosition:(t,e,n)=>{let i;Bt.info(`our points ${JSON.stringify(e)}`),e[0]!==n&&(e=e.reverse());let r,a=25;i=void 0,e.forEach((t=>{if(i&&!r){const e=Zn(t,i);if(e<a)a-=e;else{const n=a/e;n<=0&&(r=i),n>=1&&(r={x:t.x,y:t.y}),n>0&&n<1&&(r={x:(1-n)*i.x+n*t.x,y:(1-n)*i.y+n*t.y})}}i=t}));const s=t?10:5,o=Math.atan2(e[0].y-r.y,e[0].x-r.x),c={x:0,y:0};return c.x=Math.sin(o)*s+(e[0].x+r.x)/2,c.y=-Math.cos(o)*s+(e[0].y+r.y)/2,c},calcTerminalLabelPosition:function(t,e,n){let i,r=JSON.parse(JSON.stringify(n));Bt.info("our points",r),"start_left"!==e&&"start_right"!==e&&(r=r.reverse()),r.forEach((t=>{i=t}));let a,s=25+t;i=void 0,r.forEach((t=>{if(i&&!a){const e=Zn(t,i);if(e<s)s-=e;else{const n=s/e;n<=0&&(a=i),n>=1&&(a={x:t.x,y:t.y}),n>0&&n<1&&(a={x:(1-n)*i.x+n*t.x,y:(1-n)*i.y+n*t.y})}}i=t}));const o=10+.5*t,c=Math.atan2(r[0].y-a.y,r[0].x-a.x),l={x:0,y:0};return l.x=Math.sin(c)*o+(r[0].x+a.x)/2,l.y=-Math.cos(c)*o+(r[0].y+a.y)/2,"start_left"===e&&(l.x=Math.sin(c+Math.PI)*o+(r[0].x+a.x)/2,l.y=-Math.cos(c+Math.PI)*o+(r[0].y+a.y)/2),"end_right"===e&&(l.x=Math.sin(c-Math.PI)*o+(r[0].x+a.x)/2-5,l.y=-Math.cos(c-Math.PI)*o+(r[0].y+a.y)/2-5),"end_left"===e&&(l.x=Math.sin(c)*o+(r[0].x+a.x)/2-5,l.y=-Math.cos(c)*o+(r[0].y+a.y)/2-5),l},formatUrl:function(t,e){const n=t.trim();if(n)return"loose"!==e.securityLevel?(0,s.Nm)(n):n},getStylesFromArray:Pn,generateId:Yn,random:zn,runFunc:(t,...e)=>{const n=t.split("."),i=n.length-1,r=n[i];let a=window;for(let s=0;s<i;s++)if(a=a[n[s]],!a)return;a[r](...e)},entityDecode:function(t){return Xn=Xn||document.createElement("div"),t=escape(t).replace(/%26/g,"&").replace(/%23/g,"#").replace(/%3B/g,";"),Xn.innerHTML=t,unescape(Xn.textContent)},initIdGenerator:class{constructor(t,e){this.deterministic=t,this.seed=e,this.count=e?e.length:0}next(){return this.deterministic?this.count++:Date.now()}},directiveSanitizer:Qn,sanitizeCss:Kn,insertTitle:(t,e,n,i)=>{if(!i)return;const r=t.node().getBBox();t.append("text").text(i).attr("x",r.x+r.width/2).attr("y",-n).attr("class",e)},parseFontSize:ti},ni="9.4.3",ii=Object.freeze(Xt);let ri,ai=On({},ii),si=[],oi=On({},ii);const ci=(t,e)=>{let n=On({},t),i={};for(const r of e)di(r),i=On(i,r);if(n=On(n,i),i.theme&&i.theme in qt){const t=On({},ri),e=On(t.themeVariables||{},i.themeVariables);n.theme&&n.theme in qt&&(n.themeVariables=qt[n.theme].getThemeVariables(e))}return oi=n,mi(oi),oi},li=()=>On({},ai),hi=t=>(mi(t),On(oi,t),ui()),ui=()=>On({},oi),di=t=>{["secure",...ai.secure??[]].forEach((e=>{void 0!==t[e]&&(Bt.debug(`Denied attempt to modify a secure key ${e}`,t[e]),delete t[e])})),Object.keys(t).forEach((e=>{0===e.indexOf("__")&&delete t[e]})),Object.keys(t).forEach((e=>{"string"==typeof t[e]&&(t[e].includes("<")||t[e].includes(">")||t[e].includes("url(data:"))&&delete t[e],"object"==typeof t[e]&&di(t[e])}))},pi=t=>{t.fontFamily&&(t.themeVariables&&t.themeVariables.fontFamily||(t.themeVariables={fontFamily:t.fontFamily})),si.push(t),ci(ai,si)},fi=(t=ai)=>{si=[],ci(t,si)};var gi=(t=>(t.LAZY_LOAD_DEPRECATED="The configuration options lazyLoadedDiagrams and loadExternalDiagramsAtStartup are deprecated. Please use registerExternalDiagrams instead.",t))(gi||{});const yi={},mi=t=>{var e;t&&((t.lazyLoadedDiagrams||t.loadExternalDiagramsAtStartup)&&(yi[e="LAZY_LOAD_DEPRECATED"]||(Bt.warn(gi[e]),yi[e]=!0)))},bi=function(t,e,n,i){const r=function(t,e,n){let i=new Map;return n?(i.set("width","100%"),i.set("style",`max-width: ${e}px;`)):(i.set("height",t),i.set("width",e)),i}(e,n,i);!function(t,e){for(let n of e)t.attr(n[0],n[1])}(t,r)},_i=function(t,e,n,i){const r=e.node().getBBox(),a=r.width,s=r.height;Bt.info(`SVG bounds: ${a}x${s}`,r);let o=0,c=0;Bt.info(`Graph bounds: ${o}x${c}`,t),o=a+2*n,c=s+2*n,Bt.info(`Calculated bounds: ${o}x${c}`),bi(e,c,o,i);const l=`${r.x-n} ${r.y-n} ${r.width+2*n} ${r.height+2*n}`;e.attr("viewBox",l)},xi=t=>`g.classGroup text {\n fill: ${t.nodeBorder};\n fill: ${t.classText};\n stroke: none;\n font-family: ${t.fontFamily};\n font-size: 10px;\n\n .title {\n font-weight: bolder;\n }\n\n}\n\n.nodeLabel, .edgeLabel {\n color: ${t.classText};\n}\n.edgeLabel .label rect {\n fill: ${t.mainBkg};\n}\n.label text {\n fill: ${t.classText};\n}\n.edgeLabel .label span {\n background: ${t.mainBkg};\n}\n\n.classTitle {\n font-weight: bolder;\n}\n.node rect,\n .node circle,\n .node ellipse,\n .node polygon,\n .node path {\n fill: ${t.mainBkg};\n stroke: ${t.nodeBorder};\n stroke-width: 1px;\n }\n\n\n.divider {\n stroke: ${t.nodeBorder};\n stroke: 1;\n}\n\ng.clickable {\n cursor: pointer;\n}\n\ng.classGroup rect {\n fill: ${t.mainBkg};\n stroke: ${t.nodeBorder};\n}\n\ng.classGroup line {\n stroke: ${t.nodeBorder};\n stroke-width: 1;\n}\n\n.classLabel .box {\n stroke: none;\n stroke-width: 0;\n fill: ${t.mainBkg};\n opacity: 0.5;\n}\n\n.classLabel .label {\n fill: ${t.nodeBorder};\n font-size: 10px;\n}\n\n.relation {\n stroke: ${t.lineColor};\n stroke-width: 1;\n fill: none;\n}\n\n.dashed-line{\n stroke-dasharray: 3;\n}\n\n.dotted-line{\n stroke-dasharray: 1 2;\n}\n\n#compositionStart, .composition {\n fill: ${t.lineColor} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#compositionEnd, .composition {\n fill: ${t.lineColor} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#dependencyStart, .dependency {\n fill: ${t.lineColor} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#dependencyStart, .dependency {\n fill: ${t.lineColor} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#extensionStart, .extension {\n fill: ${t.mainBkg} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#extensionEnd, .extension {\n fill: ${t.mainBkg} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#aggregationStart, .aggregation {\n fill: ${t.mainBkg} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#aggregationEnd, .aggregation {\n fill: ${t.mainBkg} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#lollipopStart, .lollipop {\n fill: ${t.mainBkg} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#lollipopEnd, .lollipop {\n fill: ${t.mainBkg} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n.edgeTerminals {\n font-size: 11px;\n}\n\n.classTitleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${t.textColor};\n}\n`,vi=t=>`\n .entityBox {\n fill: ${t.mainBkg};\n stroke: ${t.nodeBorder};\n }\n\n .attributeBoxOdd {\n fill: ${t.attributeBackgroundColorOdd};\n stroke: ${t.nodeBorder};\n }\n\n .attributeBoxEven {\n fill: ${t.attributeBackgroundColorEven};\n stroke: ${t.nodeBorder};\n }\n\n .relationshipLabelBox {\n fill: ${t.tertiaryColor};\n opacity: 0.7;\n background-color: ${t.tertiaryColor};\n rect {\n opacity: 0.5;\n }\n }\n\n .relationshipLine {\n stroke: ${t.lineColor};\n }\n\n .entityTitleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${t.textColor};\n } \n`,ki=()=>"",wi=t=>`.label {\n font-family: ${t.fontFamily};\n color: ${t.nodeTextColor||t.textColor};\n }\n .cluster-label text {\n fill: ${t.titleColor};\n }\n .cluster-label span {\n color: ${t.titleColor};\n }\n\n .label text,span {\n fill: ${t.nodeTextColor||t.textColor};\n color: ${t.nodeTextColor||t.textColor};\n }\n\n .node rect,\n .node circle,\n .node ellipse,\n .node polygon,\n .node path {\n fill: ${t.mainBkg};\n stroke: ${t.nodeBorder};\n stroke-width: 1px;\n }\n\n .node .label {\n text-align: center;\n }\n .node.clickable {\n cursor: pointer;\n }\n\n .arrowheadPath {\n fill: ${t.arrowheadColor};\n }\n\n .edgePath .path {\n stroke: ${t.lineColor};\n stroke-width: 2.0px;\n }\n\n .flowchart-link {\n stroke: ${t.lineColor};\n fill: none;\n }\n\n .edgeLabel {\n background-color: ${t.edgeLabelBackground};\n rect {\n opacity: 0.5;\n background-color: ${t.edgeLabelBackground};\n fill: ${t.edgeLabelBackground};\n }\n text-align: center;\n }\n\n .cluster rect {\n fill: ${t.clusterBkg};\n stroke: ${t.clusterBorder};\n stroke-width: 1px;\n }\n\n .cluster text {\n fill: ${t.titleColor};\n }\n\n .cluster span {\n color: ${t.titleColor};\n }\n /* .cluster div {\n color: ${t.titleColor};\n } */\n\n div.mermaidTooltip {\n position: absolute;\n text-align: center;\n max-width: 200px;\n padding: 2px;\n font-family: ${t.fontFamily};\n font-size: 12px;\n background: ${t.tertiaryColor};\n border: 1px solid ${t.border2};\n border-radius: 2px;\n pointer-events: none;\n z-index: 100;\n }\n\n .flowchartTitleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${t.textColor};\n }\n`,Ci=t=>`\n .mermaid-main-font {\n font-family: "trebuchet ms", verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n }\n .exclude-range {\n fill: ${t.excludeBkgColor};\n }\n\n .section {\n stroke: none;\n opacity: 0.2;\n }\n\n .section0 {\n fill: ${t.sectionBkgColor};\n }\n\n .section2 {\n fill: ${t.sectionBkgColor2};\n }\n\n .section1,\n .section3 {\n fill: ${t.altSectionBkgColor};\n opacity: 0.2;\n }\n\n .sectionTitle0 {\n fill: ${t.titleColor};\n }\n\n .sectionTitle1 {\n fill: ${t.titleColor};\n }\n\n .sectionTitle2 {\n fill: ${t.titleColor};\n }\n\n .sectionTitle3 {\n fill: ${t.titleColor};\n }\n\n .sectionTitle {\n text-anchor: start;\n // font-size: ${t.ganttFontSize};\n // text-height: 14px;\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n\n }\n\n\n /* Grid and axis */\n\n .grid .tick {\n stroke: ${t.gridColor};\n opacity: 0.8;\n shape-rendering: crispEdges;\n text {\n font-family: ${t.fontFamily};\n fill: ${t.textColor};\n }\n }\n\n .grid path {\n stroke-width: 0;\n }\n\n\n /* Today line */\n\n .today {\n fill: none;\n stroke: ${t.todayLineColor};\n stroke-width: 2px;\n }\n\n\n /* Task styling */\n\n /* Default task */\n\n .task {\n stroke-width: 2;\n }\n\n .taskText {\n text-anchor: middle;\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n }\n\n // .taskText:not([font-size]) {\n // font-size: ${t.ganttFontSize};\n // }\n\n .taskTextOutsideRight {\n fill: ${t.taskTextDarkColor};\n text-anchor: start;\n // font-size: ${t.ganttFontSize};\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n\n }\n\n .taskTextOutsideLeft {\n fill: ${t.taskTextDarkColor};\n text-anchor: end;\n // font-size: ${t.ganttFontSize};\n }\n\n /* Special case clickable */\n .task.clickable {\n cursor: pointer;\n }\n .taskText.clickable {\n cursor: pointer;\n fill: ${t.taskTextClickableColor} !important;\n font-weight: bold;\n }\n\n .taskTextOutsideLeft.clickable {\n cursor: pointer;\n fill: ${t.taskTextClickableColor} !important;\n font-weight: bold;\n }\n\n .taskTextOutsideRight.clickable {\n cursor: pointer;\n fill: ${t.taskTextClickableColor} !important;\n font-weight: bold;\n }\n\n /* Specific task settings for the sections*/\n\n .taskText0,\n .taskText1,\n .taskText2,\n .taskText3 {\n fill: ${t.taskTextColor};\n }\n\n .task0,\n .task1,\n .task2,\n .task3 {\n fill: ${t.taskBkgColor};\n stroke: ${t.taskBorderColor};\n }\n\n .taskTextOutside0,\n .taskTextOutside2\n {\n fill: ${t.taskTextOutsideColor};\n }\n\n .taskTextOutside1,\n .taskTextOutside3 {\n fill: ${t.taskTextOutsideColor};\n }\n\n\n /* Active task */\n\n .active0,\n .active1,\n .active2,\n .active3 {\n fill: ${t.activeTaskBkgColor};\n stroke: ${t.activeTaskBorderColor};\n }\n\n .activeText0,\n .activeText1,\n .activeText2,\n .activeText3 {\n fill: ${t.taskTextDarkColor} !important;\n }\n\n\n /* Completed task */\n\n .done0,\n .done1,\n .done2,\n .done3 {\n stroke: ${t.doneTaskBorderColor};\n fill: ${t.doneTaskBkgColor};\n stroke-width: 2;\n }\n\n .doneText0,\n .doneText1,\n .doneText2,\n .doneText3 {\n fill: ${t.taskTextDarkColor} !important;\n }\n\n\n /* Tasks on the critical line */\n\n .crit0,\n .crit1,\n .crit2,\n .crit3 {\n stroke: ${t.critBorderColor};\n fill: ${t.critBkgColor};\n stroke-width: 2;\n }\n\n .activeCrit0,\n .activeCrit1,\n .activeCrit2,\n .activeCrit3 {\n stroke: ${t.critBorderColor};\n fill: ${t.activeTaskBkgColor};\n stroke-width: 2;\n }\n\n .doneCrit0,\n .doneCrit1,\n .doneCrit2,\n .doneCrit3 {\n stroke: ${t.critBorderColor};\n fill: ${t.doneTaskBkgColor};\n stroke-width: 2;\n cursor: pointer;\n shape-rendering: crispEdges;\n }\n\n .milestone {\n transform: rotate(45deg) scale(0.8,0.8);\n }\n\n .milestoneText {\n font-style: italic;\n }\n .doneCritText0,\n .doneCritText1,\n .doneCritText2,\n .doneCritText3 {\n fill: ${t.taskTextDarkColor} !important;\n }\n\n .activeCritText0,\n .activeCritText1,\n .activeCritText2,\n .activeCritText3 {\n fill: ${t.taskTextDarkColor} !important;\n }\n\n .titleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${t.textColor} ;\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n }\n`,Ti=()=>"",Ei=t=>`\n .pieCircle{\n stroke: ${t.pieStrokeColor};\n stroke-width : ${t.pieStrokeWidth};\n opacity : ${t.pieOpacity};\n }\n .pieTitleText {\n text-anchor: middle;\n font-size: ${t.pieTitleTextSize};\n fill: ${t.pieTitleTextColor};\n font-family: ${t.fontFamily};\n }\n .slice {\n font-family: ${t.fontFamily};\n fill: ${t.pieSectionTextColor};\n font-size:${t.pieSectionTextSize};\n // fill: white;\n }\n .legend text {\n fill: ${t.pieLegendTextColor};\n font-family: ${t.fontFamily};\n font-size: ${t.pieLegendTextSize};\n }\n`,Si=t=>`\n\n marker {\n fill: ${t.relationColor};\n stroke: ${t.relationColor};\n }\n\n marker.cross {\n stroke: ${t.lineColor};\n }\n\n svg {\n font-family: ${t.fontFamily};\n font-size: ${t.fontSize};\n }\n\n .reqBox {\n fill: ${t.requirementBackground};\n fill-opacity: 100%;\n stroke: ${t.requirementBorderColor};\n stroke-width: ${t.requirementBorderSize};\n }\n \n .reqTitle, .reqLabel{\n fill: ${t.requirementTextColor};\n }\n .reqLabelBox {\n fill: ${t.relationLabelBackground};\n fill-opacity: 100%;\n }\n\n .req-title-line {\n stroke: ${t.requirementBorderColor};\n stroke-width: ${t.requirementBorderSize};\n }\n .relationshipLine {\n stroke: ${t.relationColor};\n stroke-width: 1;\n }\n .relationshipLabel {\n fill: ${t.relationLabelColor};\n }\n\n`,Ai=t=>`.actor {\n stroke: ${t.actorBorder};\n fill: ${t.actorBkg};\n }\n\n text.actor > tspan {\n fill: ${t.actorTextColor};\n stroke: none;\n }\n\n .actor-line {\n stroke: ${t.actorLineColor};\n }\n\n .messageLine0 {\n stroke-width: 1.5;\n stroke-dasharray: none;\n stroke: ${t.signalColor};\n }\n\n .messageLine1 {\n stroke-width: 1.5;\n stroke-dasharray: 2, 2;\n stroke: ${t.signalColor};\n }\n\n #arrowhead path {\n fill: ${t.signalColor};\n stroke: ${t.signalColor};\n }\n\n .sequenceNumber {\n fill: ${t.sequenceNumberColor};\n }\n\n #sequencenumber {\n fill: ${t.signalColor};\n }\n\n #crosshead path {\n fill: ${t.signalColor};\n stroke: ${t.signalColor};\n }\n\n .messageText {\n fill: ${t.signalTextColor};\n stroke: none;\n }\n\n .labelBox {\n stroke: ${t.labelBoxBorderColor};\n fill: ${t.labelBoxBkgColor};\n }\n\n .labelText, .labelText > tspan {\n fill: ${t.labelTextColor};\n stroke: none;\n }\n\n .loopText, .loopText > tspan {\n fill: ${t.loopTextColor};\n stroke: none;\n }\n\n .loopLine {\n stroke-width: 2px;\n stroke-dasharray: 2, 2;\n stroke: ${t.labelBoxBorderColor};\n fill: ${t.labelBoxBorderColor};\n }\n\n .note {\n //stroke: #decc93;\n stroke: ${t.noteBorderColor};\n fill: ${t.noteBkgColor};\n }\n\n .noteText, .noteText > tspan {\n fill: ${t.noteTextColor};\n stroke: none;\n }\n\n .activation0 {\n fill: ${t.activationBkgColor};\n stroke: ${t.activationBorderColor};\n }\n\n .activation1 {\n fill: ${t.activationBkgColor};\n stroke: ${t.activationBorderColor};\n }\n\n .activation2 {\n fill: ${t.activationBkgColor};\n stroke: ${t.activationBorderColor};\n }\n\n .actorPopupMenu {\n position: absolute;\n }\n\n .actorPopupMenuPanel {\n position: absolute;\n fill: ${t.actorBkg};\n box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);\n filter: drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));\n}\n .actor-man line {\n stroke: ${t.actorBorder};\n fill: ${t.actorBkg};\n }\n .actor-man circle, line {\n stroke: ${t.actorBorder};\n fill: ${t.actorBkg};\n stroke-width: 2px;\n }\n`,Li=t=>`\ndefs #statediagram-barbEnd {\n fill: ${t.transitionColor};\n stroke: ${t.transitionColor};\n }\ng.stateGroup text {\n fill: ${t.nodeBorder};\n stroke: none;\n font-size: 10px;\n}\ng.stateGroup text {\n fill: ${t.textColor};\n stroke: none;\n font-size: 10px;\n\n}\ng.stateGroup .state-title {\n font-weight: bolder;\n fill: ${t.stateLabelColor};\n}\n\ng.stateGroup rect {\n fill: ${t.mainBkg};\n stroke: ${t.nodeBorder};\n}\n\ng.stateGroup line {\n stroke: ${t.lineColor};\n stroke-width: 1;\n}\n\n.transition {\n stroke: ${t.transitionColor};\n stroke-width: 1;\n fill: none;\n}\n\n.stateGroup .composit {\n fill: ${t.background};\n border-bottom: 1px\n}\n\n.stateGroup .alt-composit {\n fill: #e0e0e0;\n border-bottom: 1px\n}\n\n.state-note {\n stroke: ${t.noteBorderColor};\n fill: ${t.noteBkgColor};\n\n text {\n fill: ${t.noteTextColor};\n stroke: none;\n font-size: 10px;\n }\n}\n\n.stateLabel .box {\n stroke: none;\n stroke-width: 0;\n fill: ${t.mainBkg};\n opacity: 0.5;\n}\n\n.edgeLabel .label rect {\n fill: ${t.labelBackgroundColor};\n opacity: 0.5;\n}\n.edgeLabel .label text {\n fill: ${t.transitionLabelColor||t.tertiaryTextColor};\n}\n.label div .edgeLabel {\n color: ${t.transitionLabelColor||t.tertiaryTextColor};\n}\n\n.stateLabel text {\n fill: ${t.stateLabelColor};\n font-size: 10px;\n font-weight: bold;\n}\n\n.node circle.state-start {\n fill: ${t.specialStateColor};\n stroke: ${t.specialStateColor};\n}\n\n.node .fork-join {\n fill: ${t.specialStateColor};\n stroke: ${t.specialStateColor};\n}\n\n.node circle.state-end {\n fill: ${t.innerEndBackground};\n stroke: ${t.background};\n stroke-width: 1.5\n}\n.end-state-inner {\n fill: ${t.compositeBackground||t.background};\n // stroke: ${t.background};\n stroke-width: 1.5\n}\n\n.node rect {\n fill: ${t.stateBkg||t.mainBkg};\n stroke: ${t.stateBorder||t.nodeBorder};\n stroke-width: 1px;\n}\n.node polygon {\n fill: ${t.mainBkg};\n stroke: ${t.stateBorder||t.nodeBorder};;\n stroke-width: 1px;\n}\n#statediagram-barbEnd {\n fill: ${t.lineColor};\n}\n\n.statediagram-cluster rect {\n fill: ${t.compositeTitleBackground};\n stroke: ${t.stateBorder||t.nodeBorder};\n stroke-width: 1px;\n}\n\n.cluster-label, .nodeLabel {\n color: ${t.stateLabelColor};\n}\n\n.statediagram-cluster rect.outer {\n rx: 5px;\n ry: 5px;\n}\n.statediagram-state .divider {\n stroke: ${t.stateBorder||t.nodeBorder};\n}\n\n.statediagram-state .title-state {\n rx: 5px;\n ry: 5px;\n}\n.statediagram-cluster.statediagram-cluster .inner {\n fill: ${t.compositeBackground||t.background};\n}\n.statediagram-cluster.statediagram-cluster-alt .inner {\n fill: ${t.altBackground?t.altBackground:"#efefef"};\n}\n\n.statediagram-cluster .inner {\n rx:0;\n ry:0;\n}\n\n.statediagram-state rect.basic {\n rx: 5px;\n ry: 5px;\n}\n.statediagram-state rect.divider {\n stroke-dasharray: 10,10;\n fill: ${t.altBackground?t.altBackground:"#efefef"};\n}\n\n.note-edge {\n stroke-dasharray: 5;\n}\n\n.statediagram-note rect {\n fill: ${t.noteBkgColor};\n stroke: ${t.noteBorderColor};\n stroke-width: 1px;\n rx: 0;\n ry: 0;\n}\n.statediagram-note rect {\n fill: ${t.noteBkgColor};\n stroke: ${t.noteBorderColor};\n stroke-width: 1px;\n rx: 0;\n ry: 0;\n}\n\n.statediagram-note text {\n fill: ${t.noteTextColor};\n}\n\n.statediagram-note .nodeLabel {\n color: ${t.noteTextColor};\n}\n.statediagram .edgeLabel {\n color: red; // ${t.noteTextColor};\n}\n\n#dependencyStart, #dependencyEnd {\n fill: ${t.lineColor};\n stroke: ${t.lineColor};\n stroke-width: 1;\n}\n\n.statediagramTitleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${t.textColor};\n}\n`,Bi=t=>`.label {\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n color: ${t.textColor};\n }\n .mouth {\n stroke: #666;\n }\n\n line {\n stroke: ${t.textColor}\n }\n\n .legend {\n fill: ${t.textColor};\n }\n\n .label text {\n fill: #333;\n }\n .label {\n color: ${t.textColor}\n }\n\n .face {\n ${t.faceColor?`fill: ${t.faceColor}`:"fill: #FFF8DC"};\n stroke: #999;\n }\n\n .node rect,\n .node circle,\n .node ellipse,\n .node polygon,\n .node path {\n fill: ${t.mainBkg};\n stroke: ${t.nodeBorder};\n stroke-width: 1px;\n }\n\n .node .label {\n text-align: center;\n }\n .node.clickable {\n cursor: pointer;\n }\n\n .arrowheadPath {\n fill: ${t.arrowheadColor};\n }\n\n .edgePath .path {\n stroke: ${t.lineColor};\n stroke-width: 1.5px;\n }\n\n .flowchart-link {\n stroke: ${t.lineColor};\n fill: none;\n }\n\n .edgeLabel {\n background-color: ${t.edgeLabelBackground};\n rect {\n opacity: 0.5;\n }\n text-align: center;\n }\n\n .cluster rect {\n }\n\n .cluster text {\n fill: ${t.titleColor};\n }\n\n div.mermaidTooltip {\n position: absolute;\n text-align: center;\n max-width: 200px;\n padding: 2px;\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n font-size: 12px;\n background: ${t.tertiaryColor};\n border: 1px solid ${t.border2};\n border-radius: 2px;\n pointer-events: none;\n z-index: 100;\n }\n\n .task-type-0, .section-type-0 {\n ${t.fillType0?`fill: ${t.fillType0}`:""};\n }\n .task-type-1, .section-type-1 {\n ${t.fillType0?`fill: ${t.fillType1}`:""};\n }\n .task-type-2, .section-type-2 {\n ${t.fillType0?`fill: ${t.fillType2}`:""};\n }\n .task-type-3, .section-type-3 {\n ${t.fillType0?`fill: ${t.fillType3}`:""};\n }\n .task-type-4, .section-type-4 {\n ${t.fillType0?`fill: ${t.fillType4}`:""};\n }\n .task-type-5, .section-type-5 {\n ${t.fillType0?`fill: ${t.fillType5}`:""};\n }\n .task-type-6, .section-type-6 {\n ${t.fillType0?`fill: ${t.fillType6}`:""};\n }\n .task-type-7, .section-type-7 {\n ${t.fillType0?`fill: ${t.fillType7}`:""};\n }\n\n .actor-0 {\n ${t.actor0?`fill: ${t.actor0}`:""};\n }\n .actor-1 {\n ${t.actor1?`fill: ${t.actor1}`:""};\n }\n .actor-2 {\n ${t.actor2?`fill: ${t.actor2}`:""};\n }\n .actor-3 {\n ${t.actor3?`fill: ${t.actor3}`:""};\n }\n .actor-4 {\n ${t.actor4?`fill: ${t.actor4}`:""};\n }\n .actor-5 {\n ${t.actor5?`fill: ${t.actor5}`:""};\n }\n`,Ni=t=>`.person {\n stroke: ${t.personBorder};\n fill: ${t.personBkg};\n }\n`,Di={flowchart:wi,"flowchart-v2":wi,sequence:Ai,gantt:Ci,classDiagram:xi,"classDiagram-v2":xi,class:xi,stateDiagram:Li,state:Li,info:Ti,pie:Ei,er:vi,error:ki,journey:Bi,requirement:Si,c4:Ni},Oi=(t,e,n)=>{let i="";return t in Di&&Di[t]?i=Di[t](n):Bt.warn(`No theme found for ${t}`),` & {\n font-family: ${n.fontFamily};\n font-size: ${n.fontSize};\n fill: ${n.textColor}\n }\n\n /* Classes common for multiple diagrams */\n\n & .error-icon {\n fill: ${n.errorBkgColor};\n }\n & .error-text {\n fill: ${n.errorTextColor};\n stroke: ${n.errorTextColor};\n }\n\n & .edge-thickness-normal {\n stroke-width: 2px;\n }\n & .edge-thickness-thick {\n stroke-width: 3.5px\n }\n & .edge-pattern-solid {\n stroke-dasharray: 0;\n }\n\n & .edge-pattern-dashed{\n stroke-dasharray: 3;\n }\n .edge-pattern-dotted {\n stroke-dasharray: 2;\n }\n\n & .marker {\n fill: ${n.lineColor};\n stroke: ${n.lineColor};\n }\n & .marker.cross {\n stroke: ${n.lineColor};\n }\n\n & svg {\n font-family: ${n.fontFamily};\n font-size: ${n.fontSize};\n }\n\n ${i}\n\n ${e}\n`};let Mi="",Ii="",Fi="";const $i=t=>It(t,ui()),Ri=function(){Mi="",Fi="",Ii=""},Zi=function(t){Mi=$i(t).replace(/^\s+/g,"")},Pi=function(){return Mi||Ii},ji=function(t){Fi=$i(t).replace(/\n\s+/g,"\n")},Yi=function(){return Fi},zi=function(t){Ii=$i(t)},Ui=function(){return Ii},Wi={setAccTitle:Zi,getAccTitle:Pi,setDiagramTitle:zi,getDiagramTitle:Ui,getAccDescription:Yi,setAccDescription:ji,clear:Ri},qi=Object.freeze(Object.defineProperty({__proto__:null,clear:Ri,default:Wi,getAccDescription:Yi,getAccTitle:Pi,getDiagramTitle:Ui,setAccDescription:ji,setAccTitle:Zi,setDiagramTitle:zi},Symbol.toStringTag,{value:"Module"}));let Hi={};const Vi=function(t,e,n,i){Bt.debug("parseDirective is being called",e,n,i);try{if(void 0!==e)switch(e=e.trim(),n){case"open_directive":Hi={};break;case"type_directive":if(!Hi)throw new Error("currentDirective is undefined");Hi.type=e.toLowerCase();break;case"arg_directive":if(!Hi)throw new Error("currentDirective is undefined");Hi.args=JSON.parse(e);break;case"close_directive":Gi(t,Hi,i),Hi=void 0}}catch(r){Bt.error(`Error while rendering sequenceDiagram directive: ${e} jison context: ${n}`),Bt.error(r.message)}},Gi=function(t,e,n){switch(Bt.info(`Directive type=${e.type} with args:`,e.args),e.type){case"init":case"initialize":["config"].forEach((t=>{void 0!==e.args[t]&&("flowchart-v2"===n&&(n="flowchart"),e.args[n]=e.args[t],delete e.args[t])})),Bt.info("sanitize in handleDirective",e.args),Qn(e.args),Bt.info("sanitize in handleDirective (done)",e.args),pi(e.args);break;case"wrap":case"nowrap":t&&t.setWrap&&t.setWrap("wrap"===e.type);break;case"themeCss":Bt.warn("themeCss encountered");break;default:Bt.warn(`Unhandled directive: source: '%%{${e.type}: ${JSON.stringify(e.args?e.args:{})}}%%`,e)}},Xi=Bt,Qi=Nt,Ki=ui,Ji=t=>It(t,Ki()),tr=_i,er=(t,e,n,i)=>Vi(t,e,n,i),nr={},ir=(t,e,n)=>{if(nr[t])throw new Error(`Diagram ${t} already registered.`);var i,r;nr[t]=e,n&&Nn(t,n),i=t,r=e.styles,Di[i]=r,e.injectUtils&&e.injectUtils(Xi,Qi,Ki,Ji,tr,qi,er)},rr=t=>{if(t in nr)return nr[t];throw new Error(`Diagram ${t} not found.`)};var ar=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,4],i=[1,7],r=[1,5],a=[1,9],s=[1,6],o=[2,6],c=[1,16],l=[6,8,14,20,22,24,25,27,29,32,37,40,50,55],h=[8,14,20,22,24,25,27,29,32,37,40],u=[8,13,14,20,22,24,25,27,29,32,37,40],d=[1,26],p=[6,8,14,50,55],f=[8,14,55],g=[1,53],y=[1,52],m=[8,14,30,33,35,38,55],b=[1,67],_=[1,68],x=[1,69],v=[8,14,33,35,42,55],k={trace:function(){},yy:{},symbols_:{error:2,start:3,eol:4,directive:5,GG:6,document:7,EOF:8,":":9,DIR:10,options:11,body:12,OPT:13,NL:14,line:15,statement:16,commitStatement:17,mergeStatement:18,cherryPickStatement:19,acc_title:20,acc_title_value:21,acc_descr:22,acc_descr_value:23,acc_descr_multiline_value:24,section:25,branchStatement:26,CHECKOUT:27,ref:28,BRANCH:29,ORDER:30,NUM:31,CHERRY_PICK:32,COMMIT_ID:33,STR:34,COMMIT_TAG:35,EMPTYSTR:36,MERGE:37,COMMIT_TYPE:38,commitType:39,COMMIT:40,commit_arg:41,COMMIT_MSG:42,NORMAL:43,REVERSE:44,HIGHLIGHT:45,openDirective:46,typeDirective:47,closeDirective:48,argDirective:49,open_directive:50,type_directive:51,arg_directive:52,close_directive:53,ID:54,";":55,$accept:0,$end:1},terminals_:{2:"error",6:"GG",8:"EOF",9:":",10:"DIR",13:"OPT",14:"NL",20:"acc_title",21:"acc_title_value",22:"acc_descr",23:"acc_descr_value",24:"acc_descr_multiline_value",25:"section",27:"CHECKOUT",29:"BRANCH",30:"ORDER",31:"NUM",32:"CHERRY_PICK",33:"COMMIT_ID",34:"STR",35:"COMMIT_TAG",36:"EMPTYSTR",37:"MERGE",38:"COMMIT_TYPE",40:"COMMIT",42:"COMMIT_MSG",43:"NORMAL",44:"REVERSE",45:"HIGHLIGHT",50:"open_directive",51:"type_directive",52:"arg_directive",53:"close_directive",54:"ID",55:";"},productions_:[0,[3,2],[3,2],[3,3],[3,4],[3,5],[7,0],[7,2],[11,2],[11,1],[12,0],[12,2],[15,2],[15,1],[16,1],[16,1],[16,1],[16,2],[16,2],[16,1],[16,1],[16,1],[16,2],[26,2],[26,4],[19,3],[19,5],[19,5],[19,5],[19,5],[18,2],[18,4],[18,4],[18,4],[18,6],[18,6],[18,6],[18,6],[18,6],[18,6],[18,8],[18,8],[18,8],[18,8],[18,8],[18,8],[17,2],[17,3],[17,3],[17,5],[17,5],[17,3],[17,5],[17,5],[17,5],[17,5],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,3],[17,5],[17,5],[17,5],[17,5],[17,5],[17,5],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[41,0],[41,1],[39,1],[39,1],[39,1],[5,3],[5,5],[46,1],[47,1],[49,1],[48,1],[28,1],[28,1],[4,1],[4,1],[4,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 3:return a[o];case 4:return a[o-1];case 5:return i.setDirection(a[o-3]),a[o-1];case 7:i.setOptions(a[o-1]),this.$=a[o];break;case 8:a[o-1]+=a[o],this.$=a[o-1];break;case 10:this.$=[];break;case 11:a[o-1].push(a[o]),this.$=a[o-1];break;case 12:this.$=a[o-1];break;case 17:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 18:case 19:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 20:i.addSection(a[o].substr(8)),this.$=a[o].substr(8);break;case 22:i.checkout(a[o]);break;case 23:i.branch(a[o]);break;case 24:i.branch(a[o-2],a[o]);break;case 25:i.cherryPick(a[o],"",void 0);break;case 26:i.cherryPick(a[o-2],"",a[o]);break;case 27:case 29:i.cherryPick(a[o-2],"","");break;case 28:i.cherryPick(a[o],"",a[o-2]);break;case 30:i.merge(a[o],"","","");break;case 31:i.merge(a[o-2],a[o],"","");break;case 32:i.merge(a[o-2],"",a[o],"");break;case 33:i.merge(a[o-2],"","",a[o]);break;case 34:i.merge(a[o-4],a[o],"",a[o-2]);break;case 35:i.merge(a[o-4],"",a[o],a[o-2]);break;case 36:i.merge(a[o-4],"",a[o-2],a[o]);break;case 37:i.merge(a[o-4],a[o-2],a[o],"");break;case 38:i.merge(a[o-4],a[o-2],"",a[o]);break;case 39:i.merge(a[o-4],a[o],a[o-2],"");break;case 40:i.merge(a[o-6],a[o-4],a[o-2],a[o]);break;case 41:i.merge(a[o-6],a[o],a[o-4],a[o-2]);break;case 42:i.merge(a[o-6],a[o-4],a[o],a[o-2]);break;case 43:i.merge(a[o-6],a[o-2],a[o-4],a[o]);break;case 44:i.merge(a[o-6],a[o],a[o-2],a[o-4]);break;case 45:i.merge(a[o-6],a[o-2],a[o],a[o-4]);break;case 46:i.commit(a[o]);break;case 47:i.commit("","",i.commitType.NORMAL,a[o]);break;case 48:i.commit("","",a[o],"");break;case 49:i.commit("","",a[o],a[o-2]);break;case 50:i.commit("","",a[o-2],a[o]);break;case 51:i.commit("",a[o],i.commitType.NORMAL,"");break;case 52:i.commit("",a[o-2],i.commitType.NORMAL,a[o]);break;case 53:i.commit("",a[o],i.commitType.NORMAL,a[o-2]);break;case 54:i.commit("",a[o-2],a[o],"");break;case 55:i.commit("",a[o],a[o-2],"");break;case 56:i.commit("",a[o-4],a[o-2],a[o]);break;case 57:i.commit("",a[o-4],a[o],a[o-2]);break;case 58:i.commit("",a[o-2],a[o-4],a[o]);break;case 59:i.commit("",a[o],a[o-4],a[o-2]);break;case 60:i.commit("",a[o],a[o-2],a[o-4]);break;case 61:i.commit("",a[o-2],a[o],a[o-4]);break;case 62:i.commit(a[o],"",i.commitType.NORMAL,"");break;case 63:i.commit(a[o],"",i.commitType.NORMAL,a[o-2]);break;case 64:i.commit(a[o-2],"",i.commitType.NORMAL,a[o]);break;case 65:i.commit(a[o-2],"",a[o],"");break;case 66:i.commit(a[o],"",a[o-2],"");break;case 67:i.commit(a[o],a[o-2],i.commitType.NORMAL,"");break;case 68:i.commit(a[o-2],a[o],i.commitType.NORMAL,"");break;case 69:i.commit(a[o-4],"",a[o-2],a[o]);break;case 70:i.commit(a[o-4],"",a[o],a[o-2]);break;case 71:i.commit(a[o-2],"",a[o-4],a[o]);break;case 72:i.commit(a[o],"",a[o-4],a[o-2]);break;case 73:i.commit(a[o],"",a[o-2],a[o-4]);break;case 74:i.commit(a[o-2],"",a[o],a[o-4]);break;case 75:i.commit(a[o-4],a[o],a[o-2],"");break;case 76:i.commit(a[o-4],a[o-2],a[o],"");break;case 77:i.commit(a[o-2],a[o],a[o-4],"");break;case 78:i.commit(a[o],a[o-2],a[o-4],"");break;case 79:i.commit(a[o],a[o-4],a[o-2],"");break;case 80:i.commit(a[o-2],a[o-4],a[o],"");break;case 81:i.commit(a[o-4],a[o],i.commitType.NORMAL,a[o-2]);break;case 82:i.commit(a[o-4],a[o-2],i.commitType.NORMAL,a[o]);break;case 83:i.commit(a[o-2],a[o],i.commitType.NORMAL,a[o-4]);break;case 84:i.commit(a[o],a[o-2],i.commitType.NORMAL,a[o-4]);break;case 85:i.commit(a[o],a[o-4],i.commitType.NORMAL,a[o-2]);break;case 86:i.commit(a[o-2],a[o-4],i.commitType.NORMAL,a[o]);break;case 87:i.commit(a[o-6],a[o-4],a[o-2],a[o]);break;case 88:i.commit(a[o-6],a[o-4],a[o],a[o-2]);break;case 89:i.commit(a[o-6],a[o-2],a[o-4],a[o]);break;case 90:i.commit(a[o-6],a[o],a[o-4],a[o-2]);break;case 91:i.commit(a[o-6],a[o-2],a[o],a[o-4]);break;case 92:i.commit(a[o-6],a[o],a[o-2],a[o-4]);break;case 93:i.commit(a[o-4],a[o-6],a[o-2],a[o]);break;case 94:i.commit(a[o-4],a[o-6],a[o],a[o-2]);break;case 95:i.commit(a[o-2],a[o-6],a[o-4],a[o]);break;case 96:i.commit(a[o],a[o-6],a[o-4],a[o-2]);break;case 97:i.commit(a[o-2],a[o-6],a[o],a[o-4]);break;case 98:i.commit(a[o],a[o-6],a[o-2],a[o-4]);break;case 99:i.commit(a[o],a[o-4],a[o-2],a[o-6]);break;case 100:i.commit(a[o-2],a[o-4],a[o],a[o-6]);break;case 101:i.commit(a[o],a[o-2],a[o-4],a[o-6]);break;case 102:i.commit(a[o-2],a[o],a[o-4],a[o-6]);break;case 103:i.commit(a[o-4],a[o-2],a[o],a[o-6]);break;case 104:i.commit(a[o-4],a[o],a[o-2],a[o-6]);break;case 105:i.commit(a[o-2],a[o-4],a[o-6],a[o]);break;case 106:i.commit(a[o],a[o-4],a[o-6],a[o-2]);break;case 107:i.commit(a[o-2],a[o],a[o-6],a[o-4]);break;case 108:i.commit(a[o],a[o-2],a[o-6],a[o-4]);break;case 109:i.commit(a[o-4],a[o-2],a[o-6],a[o]);break;case 110:i.commit(a[o-4],a[o],a[o-6],a[o-2]);break;case 111:this.$="";break;case 112:this.$=a[o];break;case 113:this.$=i.commitType.NORMAL;break;case 114:this.$=i.commitType.REVERSE;break;case 115:this.$=i.commitType.HIGHLIGHT;break;case 118:i.parseDirective("%%{","open_directive");break;case 119:i.parseDirective(a[o],"type_directive");break;case 120:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 121:i.parseDirective("}%%","close_directive","gitGraph")}},table:[{3:1,4:2,5:3,6:n,8:i,14:r,46:8,50:a,55:s},{1:[3]},{3:10,4:2,5:3,6:n,8:i,14:r,46:8,50:a,55:s},{3:11,4:2,5:3,6:n,8:i,14:r,46:8,50:a,55:s},{7:12,8:o,9:[1,13],10:[1,14],11:15,14:c},e(l,[2,124]),e(l,[2,125]),e(l,[2,126]),{47:17,51:[1,18]},{51:[2,118]},{1:[2,1]},{1:[2,2]},{8:[1,19]},{7:20,8:o,11:15,14:c},{9:[1,21]},e(h,[2,10],{12:22,13:[1,23]}),e(u,[2,9]),{9:[1,25],48:24,53:d},e([9,53],[2,119]),{1:[2,3]},{8:[1,27]},{7:28,8:o,11:15,14:c},{8:[2,7],14:[1,31],15:29,16:30,17:32,18:33,19:34,20:[1,35],22:[1,36],24:[1,37],25:[1,38],26:39,27:[1,40],29:[1,44],32:[1,43],37:[1,42],40:[1,41]},e(u,[2,8]),e(p,[2,116]),{49:45,52:[1,46]},e(p,[2,121]),{1:[2,4]},{8:[1,47]},e(h,[2,11]),{4:48,8:i,14:r,55:s},e(h,[2,13]),e(f,[2,14]),e(f,[2,15]),e(f,[2,16]),{21:[1,49]},{23:[1,50]},e(f,[2,19]),e(f,[2,20]),e(f,[2,21]),{28:51,34:g,54:y},e(f,[2,111],{41:54,33:[1,57],34:[1,59],35:[1,55],38:[1,56],42:[1,58]}),{28:60,34:g,54:y},{33:[1,61],35:[1,62]},{28:63,34:g,54:y},{48:64,53:d},{53:[2,120]},{1:[2,5]},e(h,[2,12]),e(f,[2,17]),e(f,[2,18]),e(f,[2,22]),e(m,[2,122]),e(m,[2,123]),e(f,[2,46]),{34:[1,65]},{39:66,43:b,44:_,45:x},{34:[1,70]},{34:[1,71]},e(f,[2,112]),e(f,[2,30],{33:[1,72],35:[1,74],38:[1,73]}),{34:[1,75]},{34:[1,76],36:[1,77]},e(f,[2,23],{30:[1,78]}),e(p,[2,117]),e(f,[2,47],{33:[1,80],38:[1,79],42:[1,81]}),e(f,[2,48],{33:[1,83],35:[1,82],42:[1,84]}),e(v,[2,113]),e(v,[2,114]),e(v,[2,115]),e(f,[2,51],{35:[1,85],38:[1,86],42:[1,87]}),e(f,[2,62],{33:[1,90],35:[1,88],38:[1,89]}),{34:[1,91]},{39:92,43:b,44:_,45:x},{34:[1,93]},e(f,[2,25],{35:[1,94]}),{33:[1,95]},{33:[1,96]},{31:[1,97]},{39:98,43:b,44:_,45:x},{34:[1,99]},{34:[1,100]},{34:[1,101]},{34:[1,102]},{34:[1,103]},{34:[1,104]},{39:105,43:b,44:_,45:x},{34:[1,106]},{34:[1,107]},{39:108,43:b,44:_,45:x},{34:[1,109]},e(f,[2,31],{35:[1,111],38:[1,110]}),e(f,[2,32],{33:[1,113],35:[1,112]}),e(f,[2,33],{33:[1,114],38:[1,115]}),{34:[1,116],36:[1,117]},{34:[1,118]},{34:[1,119]},e(f,[2,24]),e(f,[2,49],{33:[1,120],42:[1,121]}),e(f,[2,53],{38:[1,122],42:[1,123]}),e(f,[2,63],{33:[1,125],38:[1,124]}),e(f,[2,50],{33:[1,126],42:[1,127]}),e(f,[2,55],{35:[1,128],42:[1,129]}),e(f,[2,66],{33:[1,131],35:[1,130]}),e(f,[2,52],{38:[1,132],42:[1,133]}),e(f,[2,54],{35:[1,134],42:[1,135]}),e(f,[2,67],{35:[1,137],38:[1,136]}),e(f,[2,64],{33:[1,139],38:[1,138]}),e(f,[2,65],{33:[1,141],35:[1,140]}),e(f,[2,68],{35:[1,143],38:[1,142]}),{39:144,43:b,44:_,45:x},{34:[1,145]},{34:[1,146]},{34:[1,147]},{34:[1,148]},{39:149,43:b,44:_,45:x},e(f,[2,26]),e(f,[2,27]),e(f,[2,28]),e(f,[2,29]),{34:[1,150]},{34:[1,151]},{39:152,43:b,44:_,45:x},{34:[1,153]},{39:154,43:b,44:_,45:x},{34:[1,155]},{34:[1,156]},{34:[1,157]},{34:[1,158]},{34:[1,159]},{34:[1,160]},{34:[1,161]},{39:162,43:b,44:_,45:x},{34:[1,163]},{34:[1,164]},{34:[1,165]},{39:166,43:b,44:_,45:x},{34:[1,167]},{39:168,43:b,44:_,45:x},{34:[1,169]},{34:[1,170]},{34:[1,171]},{39:172,43:b,44:_,45:x},{34:[1,173]},e(f,[2,37],{35:[1,174]}),e(f,[2,38],{38:[1,175]}),e(f,[2,36],{33:[1,176]}),e(f,[2,39],{35:[1,177]}),e(f,[2,34],{38:[1,178]}),e(f,[2,35],{33:[1,179]}),e(f,[2,60],{42:[1,180]}),e(f,[2,73],{33:[1,181]}),e(f,[2,61],{42:[1,182]}),e(f,[2,84],{38:[1,183]}),e(f,[2,74],{33:[1,184]}),e(f,[2,83],{38:[1,185]}),e(f,[2,59],{42:[1,186]}),e(f,[2,72],{33:[1,187]}),e(f,[2,58],{42:[1,188]}),e(f,[2,78],{35:[1,189]}),e(f,[2,71],{33:[1,190]}),e(f,[2,77],{35:[1,191]}),e(f,[2,57],{42:[1,192]}),e(f,[2,85],{38:[1,193]}),e(f,[2,56],{42:[1,194]}),e(f,[2,79],{35:[1,195]}),e(f,[2,80],{35:[1,196]}),e(f,[2,86],{38:[1,197]}),e(f,[2,70],{33:[1,198]}),e(f,[2,81],{38:[1,199]}),e(f,[2,69],{33:[1,200]}),e(f,[2,75],{35:[1,201]}),e(f,[2,76],{35:[1,202]}),e(f,[2,82],{38:[1,203]}),{34:[1,204]},{39:205,43:b,44:_,45:x},{34:[1,206]},{34:[1,207]},{39:208,43:b,44:_,45:x},{34:[1,209]},{34:[1,210]},{34:[1,211]},{34:[1,212]},{39:213,43:b,44:_,45:x},{34:[1,214]},{39:215,43:b,44:_,45:x},{34:[1,216]},{34:[1,217]},{34:[1,218]},{34:[1,219]},{34:[1,220]},{34:[1,221]},{34:[1,222]},{39:223,43:b,44:_,45:x},{34:[1,224]},{34:[1,225]},{34:[1,226]},{39:227,43:b,44:_,45:x},{34:[1,228]},{39:229,43:b,44:_,45:x},{34:[1,230]},{34:[1,231]},{34:[1,232]},{39:233,43:b,44:_,45:x},e(f,[2,40]),e(f,[2,42]),e(f,[2,41]),e(f,[2,43]),e(f,[2,45]),e(f,[2,44]),e(f,[2,101]),e(f,[2,102]),e(f,[2,99]),e(f,[2,100]),e(f,[2,104]),e(f,[2,103]),e(f,[2,108]),e(f,[2,107]),e(f,[2,106]),e(f,[2,105]),e(f,[2,110]),e(f,[2,109]),e(f,[2,98]),e(f,[2,97]),e(f,[2,96]),e(f,[2,95]),e(f,[2,93]),e(f,[2,94]),e(f,[2,92]),e(f,[2,91]),e(f,[2,90]),e(f,[2,89]),e(f,[2,87]),e(f,[2,88])],defaultActions:{9:[2,118],10:[2,1],11:[2,2],19:[2,3],27:[2,4],46:[2,120],47:[2,5]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=a.slice.call(arguments,1),u=Object.create(this.lexer),d={yy:{}};for(var p in this.yy)Object.prototype.hasOwnProperty.call(this.yy,p)&&(d.yy[p]=this.yy[p]);u.setInput(t,d.yy),d.yy.lexer=u,d.yy.parser=this,void 0===u.yylloc&&(u.yylloc={});var f=u.yylloc;a.push(f);var g=u.options&&u.options.ranges;function y(){var t;return"number"!=typeof(t=i.pop()||u.lex()||1)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof d.yy.parseError?this.parseError=d.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var m,b,_,x,v,k,w,C,T={};;){if(b=n[n.length-1],this.defaultActions[b]?_=this.defaultActions[b]:(null==m&&(m=y()),_=s[b]&&s[b][m]),void 0===_||!_.length||!_[0]){var E="";for(v in C=[],s[b])this.terminals_[v]&&v>2&&C.push("'"+this.terminals_[v]+"'");E=u.showPosition?"Parse error on line "+(c+1)+":\n"+u.showPosition()+"\nExpecting "+C.join(", ")+", got '"+(this.terminals_[m]||m)+"'":"Parse error on line "+(c+1)+": Unexpected "+(1==m?"end of input":"'"+(this.terminals_[m]||m)+"'"),this.parseError(E,{text:u.match,token:this.terminals_[m]||m,line:u.yylineno,loc:f,expected:C})}if(_[0]instanceof Array&&_.length>1)throw new Error("Parse Error: multiple actions possible at state: "+b+", token: "+m);switch(_[0]){case 1:n.push(m),r.push(u.yytext),a.push(u.yylloc),n.push(_[1]),m=null,l=u.yyleng,o=u.yytext,c=u.yylineno,f=u.yylloc;break;case 2:if(k=this.productions_[_[1]][1],T.$=r[r.length-k],T._$={first_line:a[a.length-(k||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(k||1)].first_column,last_column:a[a.length-1].last_column},g&&(T._$.range=[a[a.length-(k||1)].range[0],a[a.length-1].range[1]]),void 0!==(x=this.performAction.apply(T,[o,l,c,d.yy,_[1],r,a].concat(h))))return x;k&&(n=n.slice(0,-1*k*2),r=r.slice(0,-1*k),a=a.slice(0,-1*k)),n.push(this.productions_[_[1]][0]),r.push(T.$),a.push(T._$),w=s[n[n.length-2]][n[n.length-1]],n.push(w);break;case 3:return!0}}return!0}},w=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),50;case 1:return this.begin("type_directive"),51;case 2:return this.popState(),this.begin("arg_directive"),9;case 3:return this.popState(),this.popState(),53;case 4:return 52;case 5:return this.begin("acc_title"),20;case 6:return this.popState(),"acc_title_value";case 7:return this.begin("acc_descr"),22;case 8:return this.popState(),"acc_descr_value";case 9:this.begin("acc_descr_multiline");break;case 10:case 34:case 38:this.popState();break;case 11:return"acc_descr_multiline_value";case 12:return 14;case 13:case 14:break;case 15:return 6;case 16:return 40;case 17:return 33;case 18:return 38;case 19:return 42;case 20:return 43;case 21:return 44;case 22:return 45;case 23:return 35;case 24:return 29;case 25:return 30;case 26:return 37;case 27:return 32;case 28:return 27;case 29:case 30:return 10;case 31:return 9;case 32:return"CARET";case 33:this.begin("options");break;case 35:return 13;case 36:return 36;case 37:this.begin("string");break;case 39:return 34;case 40:return 31;case 41:return 54;case 42:return 8}},rules:[/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:(\r?\n)+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:gitGraph\b)/i,/^(?:commit(?=\s|$))/i,/^(?:id:)/i,/^(?:type:)/i,/^(?:msg:)/i,/^(?:NORMAL\b)/i,/^(?:REVERSE\b)/i,/^(?:HIGHLIGHT\b)/i,/^(?:tag:)/i,/^(?:branch(?=\s|$))/i,/^(?:order:)/i,/^(?:merge(?=\s|$))/i,/^(?:cherry-pick(?=\s|$))/i,/^(?:checkout(?=\s|$))/i,/^(?:LR\b)/i,/^(?:BT\b)/i,/^(?::)/i,/^(?:\^)/i,/^(?:options\r?\n)/i,/^(?:[ \r\n\t]+end\b)/i,/^(?:[\s\S]+(?=[ \r\n\t]+end))/i,/^(?:["]["])/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[0-9]+(?=\s|$))/i,/^(?:\w([-\./\w]*[-\w])?)/i,/^(?:$)/i,/^(?:\s+)/i],conditions:{acc_descr_multiline:{rules:[10,11],inclusive:!1},acc_descr:{rules:[8],inclusive:!1},acc_title:{rules:[6],inclusive:!1},close_directive:{rules:[],inclusive:!1},arg_directive:{rules:[3,4],inclusive:!1},type_directive:{rules:[2,3],inclusive:!1},open_directive:{rules:[1],inclusive:!1},options:{rules:[34,35],inclusive:!1},string:{rules:[38,39],inclusive:!1},INITIAL:{rules:[0,5,7,9,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,36,37,40,41,42,43],inclusive:!0}}},t);function C(){this.yy={}}return k.lexer=w,C.prototype=k,k.Parser=C,new C}();ar.parser=ar;const sr=ar,or=t=>null!==t.match(/^\s*gitGraph/);let cr=ui().gitGraph.mainBranchName,lr=ui().gitGraph.mainBranchOrder,hr={},ur=null,dr={};dr[cr]={name:cr,order:lr};let pr={};pr[cr]=ur;let fr=cr,gr="LR",yr=0;function mr(){return zn({length:7})}let br={};const _r=function(t){if(t=jt.sanitizeText(t,ui()),void 0===pr[t]){let e=new Error('Trying to checkout branch which is not yet created. (Help try using "branch '+t+'")');throw e.hash={text:"checkout "+t,token:"checkout "+t,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:['"branch '+t+'"']},e}{fr=t;const e=pr[fr];ur=hr[e]}};function xr(t,e,n){const i=t.indexOf(e);-1===i?t.push(n):t.splice(i,1,n)}function vr(t){const e=t.reduce(((t,e)=>t.seq>e.seq?t:e),t[0]);let n="";t.forEach((function(t){n+=t===e?"\t*":"\t|"}));const i=[n,e.id,e.seq];for(let r in pr)pr[r]===e.id&&i.push(r);if(Bt.debug(i.join(" ")),e.parents&&2==e.parents.length){const n=hr[e.parents[0]];xr(t,e,n),t.push(hr[e.parents[1]])}else{if(0==e.parents.length)return;{const n=hr[e.parents];xr(t,e,n)}}vr(t=function(t,e){const n=Object.create(null);return t.reduce(((t,i)=>{const r=e(i);return n[r]||(n[r]=!0,t.push(i)),t}),[])}(t,(t=>t.id)))}const kr=function(){const t=Object.keys(hr).map((function(t){return hr[t]}));return t.forEach((function(t){Bt.debug(t.id)})),t.sort(((t,e)=>t.seq-e.seq)),t},wr={NORMAL:0,REVERSE:1,HIGHLIGHT:2,MERGE:3,CHERRY_PICK:4},Cr={parseDirective:function(t,e,n){xp.parseDirective(this,t,e,n)},getConfig:()=>ui().gitGraph,setDirection:function(t){gr=t},setOptions:function(t){Bt.debug("options str",t),t=(t=t&&t.trim())||"{}";try{br=JSON.parse(t)}catch(e){Bt.error("error while parsing gitGraph options",e.message)}},getOptions:function(){return br},commit:function(t,e,n,i){Bt.debug("Entering commit:",t,e,n,i),e=jt.sanitizeText(e,ui()),t=jt.sanitizeText(t,ui()),i=jt.sanitizeText(i,ui());const r={id:e||yr+"-"+mr(),message:t,seq:yr++,type:n||wr.NORMAL,tag:i||"",parents:null==ur?[]:[ur.id],branch:fr};ur=r,hr[r.id]=r,pr[fr]=r.id,Bt.debug("in pushCommit "+r.id)},branch:function(t,e){if(t=jt.sanitizeText(t,ui()),void 0!==pr[t]){let e=new Error('Trying to create an existing branch. (Help: Either use a new name if you want create a new branch or try using "checkout '+t+'")');throw e.hash={text:"branch "+t,token:"branch "+t,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:['"checkout '+t+'"']},e}pr[t]=null!=ur?ur.id:null,dr[t]={name:t,order:e?parseInt(e,10):null},_r(t),Bt.debug("in createBranch")},merge:function(t,e,n,i){t=jt.sanitizeText(t,ui()),e=jt.sanitizeText(e,ui());const r=hr[pr[fr]],a=hr[pr[t]];if(fr===t){let e=new Error('Incorrect usage of "merge". Cannot merge a branch to itself');throw e.hash={text:"merge "+t,token:"merge "+t,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["branch abc"]},e}if(void 0===r||!r){let e=new Error('Incorrect usage of "merge". Current branch ('+fr+")has no commits");throw e.hash={text:"merge "+t,token:"merge "+t,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["commit"]},e}if(void 0===pr[t]){let e=new Error('Incorrect usage of "merge". Branch to be merged ('+t+") does not exist");throw e.hash={text:"merge "+t,token:"merge "+t,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["branch "+t]},e}if(void 0===a||!a){let e=new Error('Incorrect usage of "merge". Branch to be merged ('+t+") has no commits");throw e.hash={text:"merge "+t,token:"merge "+t,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:['"commit"']},e}if(r===a){let e=new Error('Incorrect usage of "merge". Both branches have same head');throw e.hash={text:"merge "+t,token:"merge "+t,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["branch abc"]},e}if(e&&void 0!==hr[e]){let r=new Error('Incorrect usage of "merge". Commit with id:'+e+" already exists, use different custom Id");throw r.hash={text:"merge "+t+e+n+i,token:"merge "+t+e+n+i,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["merge "+t+" "+e+"_UNIQUE "+n+" "+i]},r}const s={id:e||yr+"-"+mr(),message:"merged branch "+t+" into "+fr,seq:yr++,parents:[null==ur?null:ur.id,pr[t]],branch:fr,type:wr.MERGE,customType:n,customId:!!e,tag:i||""};ur=s,hr[s.id]=s,pr[fr]=s.id,Bt.debug(pr),Bt.debug("in mergeBranch")},cherryPick:function(t,e,n){if(Bt.debug("Entering cherryPick:",t,e,n),t=jt.sanitizeText(t,ui()),e=jt.sanitizeText(e,ui()),n=jt.sanitizeText(n,ui()),!t||void 0===hr[t]){let n=new Error('Incorrect usage of "cherryPick". Source commit id should exist and provided');throw n.hash={text:"cherryPick "+t+" "+e,token:"cherryPick "+t+" "+e,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["cherry-pick abc"]},n}let i=hr[t],r=i.branch;if(i.type===wr.MERGE){let n=new Error('Incorrect usage of "cherryPick". Source commit should not be a merge commit');throw n.hash={text:"cherryPick "+t+" "+e,token:"cherryPick "+t+" "+e,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["cherry-pick abc"]},n}if(!e||void 0===hr[e]){if(r===fr){let n=new Error('Incorrect usage of "cherryPick". Source commit is already on current branch');throw n.hash={text:"cherryPick "+t+" "+e,token:"cherryPick "+t+" "+e,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["cherry-pick abc"]},n}const a=hr[pr[fr]];if(void 0===a||!a){let n=new Error('Incorrect usage of "cherry-pick". Current branch ('+fr+")has no commits");throw n.hash={text:"cherryPick "+t+" "+e,token:"cherryPick "+t+" "+e,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["cherry-pick abc"]},n}const s={id:yr+"-"+mr(),message:"cherry-picked "+i+" into "+fr,seq:yr++,parents:[null==ur?null:ur.id,i.id],branch:fr,type:wr.CHERRY_PICK,tag:n??"cherry-pick:"+i.id};ur=s,hr[s.id]=s,pr[fr]=s.id,Bt.debug(pr),Bt.debug("in cherryPick")}},checkout:_r,prettyPrint:function(){Bt.debug(hr);vr([kr()[0]])},clear:function(){hr={},ur=null;let t=ui().gitGraph.mainBranchName,e=ui().gitGraph.mainBranchOrder;pr={},pr[t]=null,dr={},dr[t]={name:t,order:e},fr=t,yr=0,Ri()},getBranchesAsObjArray:function(){const t=Object.values(dr).map(((t,e)=>null!==t.order?t:{...t,order:parseFloat(`0.${e}`,10)})).sort(((t,e)=>t.order-e.order)).map((({name:t})=>({name:t})));return t},getBranches:function(){return pr},getCommits:function(){return hr},getCommitsArray:kr,getCurrentBranch:function(){return fr},getDirection:function(){return gr},getHead:function(){return ur},setAccTitle:Zi,getAccTitle:Pi,getAccDescription:Yi,setAccDescription:ji,setDiagramTitle:zi,getDiagramTitle:Ui,commitType:wr};let Tr={};const Er=0,Sr=1,Ar=2,Lr=3,Br=4;let Nr={},Dr={},Or=[],Mr=0;const Ir=(t,e,n)=>{const i=Ki().gitGraph,r=t.append("g").attr("class","commit-bullets"),a=t.append("g").attr("class","commit-labels");let s=0;Object.keys(e).sort(((t,n)=>e[t].seq-e[n].seq)).forEach((t=>{const o=e[t],c=Nr[o.branch].pos,l=s+10;if(n){let t,e=void 0!==o.customType&&""!==o.customType?o.customType:o.type;switch(e){case Er:t="commit-normal";break;case Sr:t="commit-reverse";break;case Ar:t="commit-highlight";break;case Lr:t="commit-merge";break;case Br:t="commit-cherry-pick";break;default:t="commit-normal"}if(e===Ar){const e=r.append("rect");e.attr("x",l-10),e.attr("y",c-10),e.attr("height",20),e.attr("width",20),e.attr("class",`commit ${o.id} commit-highlight${Nr[o.branch].index%8} ${t}-outer`),r.append("rect").attr("x",l-6).attr("y",c-6).attr("height",12).attr("width",12).attr("class",`commit ${o.id} commit${Nr[o.branch].index%8} ${t}-inner`)}else if(e===Br)r.append("circle").attr("cx",l).attr("cy",c).attr("r",10).attr("class",`commit ${o.id} ${t}`),r.append("circle").attr("cx",l-3).attr("cy",c+2).attr("r",2.75).attr("fill","#fff").attr("class",`commit ${o.id} ${t}`),r.append("circle").attr("cx",l+3).attr("cy",c+2).attr("r",2.75).attr("fill","#fff").attr("class",`commit ${o.id} ${t}`),r.append("line").attr("x1",l+3).attr("y1",c+1).attr("x2",l).attr("y2",c-5).attr("stroke","#fff").attr("class",`commit ${o.id} ${t}`),r.append("line").attr("x1",l-3).attr("y1",c+1).attr("x2",l).attr("y2",c-5).attr("stroke","#fff").attr("class",`commit ${o.id} ${t}`);else{const n=r.append("circle");if(n.attr("cx",l),n.attr("cy",c),n.attr("r",o.type===Lr?9:10),n.attr("class",`commit ${o.id} commit${Nr[o.branch].index%8}`),e===Lr){const e=r.append("circle");e.attr("cx",l),e.attr("cy",c),e.attr("r",6),e.attr("class",`commit ${t} ${o.id} commit${Nr[o.branch].index%8}`)}if(e===Sr){r.append("path").attr("d",`M ${l-5},${c-5}L${l+5},${c+5}M${l-5},${c+5}L${l+5},${c-5}`).attr("class",`commit ${t} ${o.id} commit${Nr[o.branch].index%8}`)}}}if(Dr[o.id]={x:s+10,y:c},n){const t=4,e=2;if(o.type!==Br&&(o.customId&&o.type===Lr||o.type!==Lr)&&i.showCommitLabel){const t=a.append("g"),n=t.insert("rect").attr("class","commit-label-bkg"),r=t.append("text").attr("x",s).attr("y",c+25).attr("class","commit-label").text(o.id);let l=r.node().getBBox();if(n.attr("x",s+10-l.width/2-e).attr("y",c+13.5).attr("width",l.width+2*e).attr("height",l.height+2*e),r.attr("x",s+10-l.width/2),i.rotateCommitLabel){let e=-7.5-(l.width+10)/25*9.5,n=10+l.width/25*8.5;t.attr("transform","translate("+e+", "+n+") rotate("+"-45, "+s+", "+c+")")}}if(o.tag){const n=a.insert("polygon"),i=a.append("circle"),r=a.append("text").attr("y",c-16).attr("class","tag-label").text(o.tag);let l=r.node().getBBox();r.attr("x",s+10-l.width/2);const h=l.height/2,u=c-19.2;n.attr("class","tag-label-bkg").attr("points",`\n ${s-l.width/2-t/2},${u+e}\n ${s-l.width/2-t/2},${u-e}\n ${s+10-l.width/2-t},${u-h-e}\n ${s+10+l.width/2+t},${u-h-e}\n ${s+10+l.width/2+t},${u+h+e}\n ${s+10-l.width/2-t},${u+h+e}`),i.attr("cx",s-l.width/2+t/2).attr("cy",u).attr("r",1.5).attr("class","tag-hole")}}s+=50,s>Mr&&(Mr=s)}))},Fr=(t,e,n=0)=>{const i=t+Math.abs(t-e)/2;if(n>5)return i;if(Or.every((t=>Math.abs(t-i)>=10)))return Or.push(i),i;const r=Math.abs(t-e);return Fr(t,e-r/5,n+1)},$r=(t,e,n,i)=>{const r=Dr[e.id],a=Dr[n.id],s=((t,e,n)=>Object.keys(n).filter((i=>n[i].branch===e.branch&&n[i].seq>t.seq&&n[i].seq<e.seq)).length>0)(e,n,i);let o,c="",l="",h=0,u=0,d=Nr[n.branch].index;if(s){c="A 10 10, 0, 0, 0,",l="A 10 10, 0, 0, 1,",h=10,u=10,d=Nr[n.branch].index;const t=r.y<a.y?Fr(r.y,a.y):Fr(a.y,r.y);o=r.y<a.y?`M ${r.x} ${r.y} L ${r.x} ${t-h} ${c} ${r.x+u} ${t} L ${a.x-h} ${t} ${l} ${a.x} ${t+u} L ${a.x} ${a.y}`:`M ${r.x} ${r.y} L ${r.x} ${t+h} ${l} ${r.x+u} ${t} L ${a.x-h} ${t} ${c} ${a.x} ${t-u} L ${a.x} ${a.y}`}else r.y<a.y&&(c="A 20 20, 0, 0, 0,",h=20,u=20,d=Nr[n.branch].index,o=`M ${r.x} ${r.y} L ${r.x} ${a.y-h} ${c} ${r.x+u} ${a.y} L ${a.x} ${a.y}`),r.y>a.y&&(c="A 20 20, 0, 0, 0,",h=20,u=20,d=Nr[e.branch].index,o=`M ${r.x} ${r.y} L ${a.x-h} ${r.y} ${c} ${a.x} ${r.y-u} L ${a.x} ${a.y}`),r.y===a.y&&(d=Nr[e.branch].index,o=`M ${r.x} ${r.y} L ${r.x} ${a.y-h} ${c} ${r.x+u} ${a.y} L ${a.x} ${a.y}`);t.append("path").attr("d",o).attr("class","arrow arrow"+d%8)},Rr=(t,e)=>{const n=Ki().gitGraph,i=t.append("g");e.forEach(((t,e)=>{const r=e%8,a=Nr[t.name].pos,s=i.append("line");s.attr("x1",0),s.attr("y1",a),s.attr("x2",Mr),s.attr("y2",a),s.attr("class","branch branch"+r),Or.push(a);const o=(t=>{const e=document.createElementNS("http://www.w3.org/2000/svg","text");let n=[];n="string"==typeof t?t.split(/\\n|\n|<br\s*\/?>/gi):Array.isArray(t)?t:[];for(const i of n){const t=document.createElementNS("http://www.w3.org/2000/svg","tspan");t.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),t.setAttribute("dy","1em"),t.setAttribute("x","0"),t.setAttribute("class","row"),t.textContent=i.trim(),e.appendChild(t)}return e})(t.name),c=i.insert("rect"),l=i.insert("g").attr("class","branchLabel").insert("g").attr("class","label branch-label"+r);l.node().appendChild(o);let h=o.getBBox();c.attr("class","branchLabelBkg label"+r).attr("rx",4).attr("ry",4).attr("x",-h.width-4-(!0===n.rotateCommitLabel?30:0)).attr("y",-h.height/2+8).attr("width",h.width+18).attr("height",h.height+4),l.attr("transform","translate("+(-h.width-14-(!0===n.rotateCommitLabel?30:0))+", "+(a-h.height/2-1)+")"),c.attr("transform","translate(-19, "+(a-h.height/2)+")")}))},Zr={draw:function(t,e,n,i){Nr={},Dr={},Tr={},Mr=0,Or=[];const r=Ki(),a=r.gitGraph;Bt.debug("in gitgraph renderer",t+"\n","id:",e,n),Tr=i.db.getCommits();const s=i.db.getBranchesAsObjArray();let c=0;s.forEach(((t,e)=>{Nr[t.name]={pos:c,index:e},c+=50+(a.rotateCommitLabel?40:0)}));const l=(0,o.Ys)(`[id="${e}"]`);Ir(l,Tr,!1),a.showBranches&&Rr(l,s),((t,e)=>{const n=t.append("g").attr("class","commit-arrows");Object.keys(e).forEach((t=>{const i=e[t];i.parents&&i.parents.length>0&&i.parents.forEach((t=>{$r(n,e[t],i,e)}))}))})(l,Tr),Ir(l,Tr,!0),ei.insertTitle(l,"gitTitleText",a.titleTopMargin,i.db.getDiagramTitle()),tr(void 0,l,a.diagramPadding,a.useMaxWidth??r.useMaxWidth)}},Pr=t=>`\n .commit-id,\n .commit-msg,\n .branch-label {\n fill: lightgrey;\n color: lightgrey;\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n }\n ${[0,1,2,3,4,5,6,7].map((e=>`\n .branch-label${e} { fill: ${t["gitBranchLabel"+e]}; }\n .commit${e} { stroke: ${t["git"+e]}; fill: ${t["git"+e]}; }\n .commit-highlight${e} { stroke: ${t["gitInv"+e]}; fill: ${t["gitInv"+e]}; }\n .label${e} { fill: ${t["git"+e]}; }\n .arrow${e} { stroke: ${t["git"+e]}; }\n `)).join("\n")}\n\n .branch {\n stroke-width: 1;\n stroke: ${t.lineColor};\n stroke-dasharray: 2;\n }\n .commit-label { font-size: ${t.commitLabelFontSize}; fill: ${t.commitLabelColor};}\n .commit-label-bkg { font-size: ${t.commitLabelFontSize}; fill: ${t.commitLabelBackground}; opacity: 0.5; }\n .tag-label { font-size: ${t.tagLabelFontSize}; fill: ${t.tagLabelColor};}\n .tag-label-bkg { fill: ${t.tagLabelBackground}; stroke: ${t.tagLabelBorder}; }\n .tag-hole { fill: ${t.textColor}; }\n\n .commit-merge {\n stroke: ${t.primaryColor};\n fill: ${t.primaryColor};\n }\n .commit-reverse {\n stroke: ${t.primaryColor};\n fill: ${t.primaryColor};\n stroke-width: 3;\n }\n .commit-highlight-outer {\n }\n .commit-highlight-inner {\n stroke: ${t.primaryColor};\n fill: ${t.primaryColor};\n }\n\n .arrow { stroke-width: 8; stroke-linecap: round; fill: none}\n .gitTitleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${t.textColor};\n }\n }\n`;var jr=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,6],i=[1,7],r=[1,8],a=[1,9],s=[1,16],o=[1,11],l=[1,12],h=[1,13],u=[1,14],d=[1,15],p=[1,27],f=[1,33],g=[1,34],y=[1,35],m=[1,36],b=[1,37],_=[1,72],x=[1,73],v=[1,74],k=[1,75],w=[1,76],C=[1,77],T=[1,78],E=[1,38],S=[1,39],A=[1,40],L=[1,41],B=[1,42],N=[1,43],D=[1,44],O=[1,45],M=[1,46],I=[1,47],F=[1,48],$=[1,49],R=[1,50],Z=[1,51],P=[1,52],j=[1,53],Y=[1,54],z=[1,55],U=[1,56],W=[1,57],q=[1,59],H=[1,60],V=[1,61],G=[1,62],X=[1,63],Q=[1,64],K=[1,65],J=[1,66],tt=[1,67],et=[1,68],nt=[1,69],it=[24,52],rt=[24,44,46,47,48,49,50,51,52,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84],at=[15,24,44,46,47,48,49,50,51,52,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84],st=[1,94],ot=[1,95],ct=[1,96],lt=[1,97],ht=[15,24,52],ut=[7,8,9,10,18,22,25,26,27,28],dt=[15,24,43,52],pt=[15,24,43,52,86,87,89,90],ft=[15,43],gt=[44,46,47,48,49,50,51,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84],yt={trace:function(){},yy:{},symbols_:{error:2,start:3,mermaidDoc:4,direction:5,directive:6,direction_tb:7,direction_bt:8,direction_rl:9,direction_lr:10,graphConfig:11,openDirective:12,typeDirective:13,closeDirective:14,NEWLINE:15,":":16,argDirective:17,open_directive:18,type_directive:19,arg_directive:20,close_directive:21,C4_CONTEXT:22,statements:23,EOF:24,C4_CONTAINER:25,C4_COMPONENT:26,C4_DYNAMIC:27,C4_DEPLOYMENT:28,otherStatements:29,diagramStatements:30,otherStatement:31,title:32,accDescription:33,acc_title:34,acc_title_value:35,acc_descr:36,acc_descr_value:37,acc_descr_multiline_value:38,boundaryStatement:39,boundaryStartStatement:40,boundaryStopStatement:41,boundaryStart:42,LBRACE:43,ENTERPRISE_BOUNDARY:44,attributes:45,SYSTEM_BOUNDARY:46,BOUNDARY:47,CONTAINER_BOUNDARY:48,NODE:49,NODE_L:50,NODE_R:51,RBRACE:52,diagramStatement:53,PERSON:54,PERSON_EXT:55,SYSTEM:56,SYSTEM_DB:57,SYSTEM_QUEUE:58,SYSTEM_EXT:59,SYSTEM_EXT_DB:60,SYSTEM_EXT_QUEUE:61,CONTAINER:62,CONTAINER_DB:63,CONTAINER_QUEUE:64,CONTAINER_EXT:65,CONTAINER_EXT_DB:66,CONTAINER_EXT_QUEUE:67,COMPONENT:68,COMPONENT_DB:69,COMPONENT_QUEUE:70,COMPONENT_EXT:71,COMPONENT_EXT_DB:72,COMPONENT_EXT_QUEUE:73,REL:74,BIREL:75,REL_U:76,REL_D:77,REL_L:78,REL_R:79,REL_B:80,REL_INDEX:81,UPDATE_EL_STYLE:82,UPDATE_REL_STYLE:83,UPDATE_LAYOUT_CONFIG:84,attribute:85,STR:86,STR_KEY:87,STR_VALUE:88,ATTRIBUTE:89,ATTRIBUTE_EMPTY:90,$accept:0,$end:1},terminals_:{2:"error",7:"direction_tb",8:"direction_bt",9:"direction_rl",10:"direction_lr",15:"NEWLINE",16:":",18:"open_directive",19:"type_directive",20:"arg_directive",21:"close_directive",22:"C4_CONTEXT",24:"EOF",25:"C4_CONTAINER",26:"C4_COMPONENT",27:"C4_DYNAMIC",28:"C4_DEPLOYMENT",32:"title",33:"accDescription",34:"acc_title",35:"acc_title_value",36:"acc_descr",37:"acc_descr_value",38:"acc_descr_multiline_value",43:"LBRACE",44:"ENTERPRISE_BOUNDARY",46:"SYSTEM_BOUNDARY",47:"BOUNDARY",48:"CONTAINER_BOUNDARY",49:"NODE",50:"NODE_L",51:"NODE_R",52:"RBRACE",54:"PERSON",55:"PERSON_EXT",56:"SYSTEM",57:"SYSTEM_DB",58:"SYSTEM_QUEUE",59:"SYSTEM_EXT",60:"SYSTEM_EXT_DB",61:"SYSTEM_EXT_QUEUE",62:"CONTAINER",63:"CONTAINER_DB",64:"CONTAINER_QUEUE",65:"CONTAINER_EXT",66:"CONTAINER_EXT_DB",67:"CONTAINER_EXT_QUEUE",68:"COMPONENT",69:"COMPONENT_DB",70:"COMPONENT_QUEUE",71:"COMPONENT_EXT",72:"COMPONENT_EXT_DB",73:"COMPONENT_EXT_QUEUE",74:"REL",75:"BIREL",76:"REL_U",77:"REL_D",78:"REL_L",79:"REL_R",80:"REL_B",81:"REL_INDEX",82:"UPDATE_EL_STYLE",83:"UPDATE_REL_STYLE",84:"UPDATE_LAYOUT_CONFIG",86:"STR",87:"STR_KEY",88:"STR_VALUE",89:"ATTRIBUTE",90:"ATTRIBUTE_EMPTY"},productions_:[0,[3,1],[3,1],[3,2],[5,1],[5,1],[5,1],[5,1],[4,1],[6,4],[6,6],[12,1],[13,1],[17,1],[14,1],[11,4],[11,4],[11,4],[11,4],[11,4],[23,1],[23,1],[23,2],[29,1],[29,2],[29,3],[31,1],[31,1],[31,2],[31,2],[31,1],[39,3],[40,3],[40,3],[40,4],[42,2],[42,2],[42,2],[42,2],[42,2],[42,2],[42,2],[41,1],[30,1],[30,2],[30,3],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,1],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[45,1],[45,2],[85,1],[85,2],[85,1],[85,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 4:i.setDirection("TB");break;case 5:i.setDirection("BT");break;case 6:i.setDirection("RL");break;case 7:i.setDirection("LR");break;case 11:i.parseDirective("%%{","open_directive");break;case 12:break;case 13:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 14:i.parseDirective("}%%","close_directive","c4Context");break;case 15:case 16:case 17:case 18:case 19:i.setC4Type(a[o-3]);break;case 26:i.setTitle(a[o].substring(6)),this.$=a[o].substring(6);break;case 27:i.setAccDescription(a[o].substring(15)),this.$=a[o].substring(15);break;case 28:this.$=a[o].trim(),i.setTitle(this.$);break;case 29:case 30:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 35:case 36:a[o].splice(2,0,"ENTERPRISE"),i.addPersonOrSystemBoundary(...a[o]),this.$=a[o];break;case 37:i.addPersonOrSystemBoundary(...a[o]),this.$=a[o];break;case 38:a[o].splice(2,0,"CONTAINER"),i.addContainerBoundary(...a[o]),this.$=a[o];break;case 39:i.addDeploymentNode("node",...a[o]),this.$=a[o];break;case 40:i.addDeploymentNode("nodeL",...a[o]),this.$=a[o];break;case 41:i.addDeploymentNode("nodeR",...a[o]),this.$=a[o];break;case 42:i.popBoundaryParseStack();break;case 46:i.addPersonOrSystem("person",...a[o]),this.$=a[o];break;case 47:i.addPersonOrSystem("external_person",...a[o]),this.$=a[o];break;case 48:i.addPersonOrSystem("system",...a[o]),this.$=a[o];break;case 49:i.addPersonOrSystem("system_db",...a[o]),this.$=a[o];break;case 50:i.addPersonOrSystem("system_queue",...a[o]),this.$=a[o];break;case 51:i.addPersonOrSystem("external_system",...a[o]),this.$=a[o];break;case 52:i.addPersonOrSystem("external_system_db",...a[o]),this.$=a[o];break;case 53:i.addPersonOrSystem("external_system_queue",...a[o]),this.$=a[o];break;case 54:i.addContainer("container",...a[o]),this.$=a[o];break;case 55:i.addContainer("container_db",...a[o]),this.$=a[o];break;case 56:i.addContainer("container_queue",...a[o]),this.$=a[o];break;case 57:i.addContainer("external_container",...a[o]),this.$=a[o];break;case 58:i.addContainer("external_container_db",...a[o]),this.$=a[o];break;case 59:i.addContainer("external_container_queue",...a[o]),this.$=a[o];break;case 60:i.addComponent("component",...a[o]),this.$=a[o];break;case 61:i.addComponent("component_db",...a[o]),this.$=a[o];break;case 62:i.addComponent("component_queue",...a[o]),this.$=a[o];break;case 63:i.addComponent("external_component",...a[o]),this.$=a[o];break;case 64:i.addComponent("external_component_db",...a[o]),this.$=a[o];break;case 65:i.addComponent("external_component_queue",...a[o]),this.$=a[o];break;case 67:i.addRel("rel",...a[o]),this.$=a[o];break;case 68:i.addRel("birel",...a[o]),this.$=a[o];break;case 69:i.addRel("rel_u",...a[o]),this.$=a[o];break;case 70:i.addRel("rel_d",...a[o]),this.$=a[o];break;case 71:i.addRel("rel_l",...a[o]),this.$=a[o];break;case 72:i.addRel("rel_r",...a[o]),this.$=a[o];break;case 73:i.addRel("rel_b",...a[o]),this.$=a[o];break;case 74:a[o].splice(0,1),i.addRel("rel",...a[o]),this.$=a[o];break;case 75:i.updateElStyle("update_el_style",...a[o]),this.$=a[o];break;case 76:i.updateRelStyle("update_rel_style",...a[o]),this.$=a[o];break;case 77:i.updateLayoutConfig("update_layout_config",...a[o]),this.$=a[o];break;case 78:this.$=[a[o]];break;case 79:a[o].unshift(a[o-1]),this.$=a[o];break;case 80:case 82:this.$=a[o].trim();break;case 81:let t={};t[a[o-1].trim()]=a[o].trim(),this.$=t;break;case 83:this.$=""}},table:[{3:1,4:2,5:3,6:4,7:n,8:i,9:r,10:a,11:5,12:10,18:s,22:o,25:l,26:h,27:u,28:d},{1:[3]},{1:[2,1]},{1:[2,2]},{3:17,4:2,5:3,6:4,7:n,8:i,9:r,10:a,11:5,12:10,18:s,22:o,25:l,26:h,27:u,28:d},{1:[2,8]},{1:[2,4]},{1:[2,5]},{1:[2,6]},{1:[2,7]},{13:18,19:[1,19]},{15:[1,20]},{15:[1,21]},{15:[1,22]},{15:[1,23]},{15:[1,24]},{19:[2,11]},{1:[2,3]},{14:25,16:[1,26],21:p},e([16,21],[2,12]),{23:28,29:29,30:30,31:31,32:f,33:g,34:y,36:m,38:b,39:58,40:70,42:71,44:_,46:x,47:v,48:k,49:w,50:C,51:T,53:32,54:E,55:S,56:A,57:L,58:B,59:N,60:D,61:O,62:M,63:I,64:F,65:$,66:R,67:Z,68:P,69:j,70:Y,71:z,72:U,73:W,74:q,75:H,76:V,77:G,78:X,79:Q,80:K,81:J,82:tt,83:et,84:nt},{23:79,29:29,30:30,31:31,32:f,33:g,34:y,36:m,38:b,39:58,40:70,42:71,44:_,46:x,47:v,48:k,49:w,50:C,51:T,53:32,54:E,55:S,56:A,57:L,58:B,59:N,60:D,61:O,62:M,63:I,64:F,65:$,66:R,67:Z,68:P,69:j,70:Y,71:z,72:U,73:W,74:q,75:H,76:V,77:G,78:X,79:Q,80:K,81:J,82:tt,83:et,84:nt},{23:80,29:29,30:30,31:31,32:f,33:g,34:y,36:m,38:b,39:58,40:70,42:71,44:_,46:x,47:v,48:k,49:w,50:C,51:T,53:32,54:E,55:S,56:A,57:L,58:B,59:N,60:D,61:O,62:M,63:I,64:F,65:$,66:R,67:Z,68:P,69:j,70:Y,71:z,72:U,73:W,74:q,75:H,76:V,77:G,78:X,79:Q,80:K,81:J,82:tt,83:et,84:nt},{23:81,29:29,30:30,31:31,32:f,33:g,34:y,36:m,38:b,39:58,40:70,42:71,44:_,46:x,47:v,48:k,49:w,50:C,51:T,53:32,54:E,55:S,56:A,57:L,58:B,59:N,60:D,61:O,62:M,63:I,64:F,65:$,66:R,67:Z,68:P,69:j,70:Y,71:z,72:U,73:W,74:q,75:H,76:V,77:G,78:X,79:Q,80:K,81:J,82:tt,83:et,84:nt},{23:82,29:29,30:30,31:31,32:f,33:g,34:y,36:m,38:b,39:58,40:70,42:71,44:_,46:x,47:v,48:k,49:w,50:C,51:T,53:32,54:E,55:S,56:A,57:L,58:B,59:N,60:D,61:O,62:M,63:I,64:F,65:$,66:R,67:Z,68:P,69:j,70:Y,71:z,72:U,73:W,74:q,75:H,76:V,77:G,78:X,79:Q,80:K,81:J,82:tt,83:et,84:nt},{15:[1,83]},{17:84,20:[1,85]},{15:[2,14]},{24:[1,86]},e(it,[2,20],{53:32,39:58,40:70,42:71,30:87,44:_,46:x,47:v,48:k,49:w,50:C,51:T,54:E,55:S,56:A,57:L,58:B,59:N,60:D,61:O,62:M,63:I,64:F,65:$,66:R,67:Z,68:P,69:j,70:Y,71:z,72:U,73:W,74:q,75:H,76:V,77:G,78:X,79:Q,80:K,81:J,82:tt,83:et,84:nt}),e(it,[2,21]),e(rt,[2,23],{15:[1,88]}),e(it,[2,43],{15:[1,89]}),e(at,[2,26]),e(at,[2,27]),{35:[1,90]},{37:[1,91]},e(at,[2,30]),{45:92,85:93,86:st,87:ot,89:ct,90:lt},{45:98,85:93,86:st,87:ot,89:ct,90:lt},{45:99,85:93,86:st,87:ot,89:ct,90:lt},{45:100,85:93,86:st,87:ot,89:ct,90:lt},{45:101,85:93,86:st,87:ot,89:ct,90:lt},{45:102,85:93,86:st,87:ot,89:ct,90:lt},{45:103,85:93,86:st,87:ot,89:ct,90:lt},{45:104,85:93,86:st,87:ot,89:ct,90:lt},{45:105,85:93,86:st,87:ot,89:ct,90:lt},{45:106,85:93,86:st,87:ot,89:ct,90:lt},{45:107,85:93,86:st,87:ot,89:ct,90:lt},{45:108,85:93,86:st,87:ot,89:ct,90:lt},{45:109,85:93,86:st,87:ot,89:ct,90:lt},{45:110,85:93,86:st,87:ot,89:ct,90:lt},{45:111,85:93,86:st,87:ot,89:ct,90:lt},{45:112,85:93,86:st,87:ot,89:ct,90:lt},{45:113,85:93,86:st,87:ot,89:ct,90:lt},{45:114,85:93,86:st,87:ot,89:ct,90:lt},{45:115,85:93,86:st,87:ot,89:ct,90:lt},{45:116,85:93,86:st,87:ot,89:ct,90:lt},e(ht,[2,66]),{45:117,85:93,86:st,87:ot,89:ct,90:lt},{45:118,85:93,86:st,87:ot,89:ct,90:lt},{45:119,85:93,86:st,87:ot,89:ct,90:lt},{45:120,85:93,86:st,87:ot,89:ct,90:lt},{45:121,85:93,86:st,87:ot,89:ct,90:lt},{45:122,85:93,86:st,87:ot,89:ct,90:lt},{45:123,85:93,86:st,87:ot,89:ct,90:lt},{45:124,85:93,86:st,87:ot,89:ct,90:lt},{45:125,85:93,86:st,87:ot,89:ct,90:lt},{45:126,85:93,86:st,87:ot,89:ct,90:lt},{45:127,85:93,86:st,87:ot,89:ct,90:lt},{30:128,39:58,40:70,42:71,44:_,46:x,47:v,48:k,49:w,50:C,51:T,53:32,54:E,55:S,56:A,57:L,58:B,59:N,60:D,61:O,62:M,63:I,64:F,65:$,66:R,67:Z,68:P,69:j,70:Y,71:z,72:U,73:W,74:q,75:H,76:V,77:G,78:X,79:Q,80:K,81:J,82:tt,83:et,84:nt},{15:[1,130],43:[1,129]},{45:131,85:93,86:st,87:ot,89:ct,90:lt},{45:132,85:93,86:st,87:ot,89:ct,90:lt},{45:133,85:93,86:st,87:ot,89:ct,90:lt},{45:134,85:93,86:st,87:ot,89:ct,90:lt},{45:135,85:93,86:st,87:ot,89:ct,90:lt},{45:136,85:93,86:st,87:ot,89:ct,90:lt},{45:137,85:93,86:st,87:ot,89:ct,90:lt},{24:[1,138]},{24:[1,139]},{24:[1,140]},{24:[1,141]},e(ut,[2,9]),{14:142,21:p},{21:[2,13]},{1:[2,15]},e(it,[2,22]),e(rt,[2,24],{31:31,29:143,32:f,33:g,34:y,36:m,38:b}),e(it,[2,44],{29:29,30:30,31:31,53:32,39:58,40:70,42:71,23:144,32:f,33:g,34:y,36:m,38:b,44:_,46:x,47:v,48:k,49:w,50:C,51:T,54:E,55:S,56:A,57:L,58:B,59:N,60:D,61:O,62:M,63:I,64:F,65:$,66:R,67:Z,68:P,69:j,70:Y,71:z,72:U,73:W,74:q,75:H,76:V,77:G,78:X,79:Q,80:K,81:J,82:tt,83:et,84:nt}),e(at,[2,28]),e(at,[2,29]),e(ht,[2,46]),e(dt,[2,78],{85:93,45:145,86:st,87:ot,89:ct,90:lt}),e(pt,[2,80]),{88:[1,146]},e(pt,[2,82]),e(pt,[2,83]),e(ht,[2,47]),e(ht,[2,48]),e(ht,[2,49]),e(ht,[2,50]),e(ht,[2,51]),e(ht,[2,52]),e(ht,[2,53]),e(ht,[2,54]),e(ht,[2,55]),e(ht,[2,56]),e(ht,[2,57]),e(ht,[2,58]),e(ht,[2,59]),e(ht,[2,60]),e(ht,[2,61]),e(ht,[2,62]),e(ht,[2,63]),e(ht,[2,64]),e(ht,[2,65]),e(ht,[2,67]),e(ht,[2,68]),e(ht,[2,69]),e(ht,[2,70]),e(ht,[2,71]),e(ht,[2,72]),e(ht,[2,73]),e(ht,[2,74]),e(ht,[2,75]),e(ht,[2,76]),e(ht,[2,77]),{41:147,52:[1,148]},{15:[1,149]},{43:[1,150]},e(ft,[2,35]),e(ft,[2,36]),e(ft,[2,37]),e(ft,[2,38]),e(ft,[2,39]),e(ft,[2,40]),e(ft,[2,41]),{1:[2,16]},{1:[2,17]},{1:[2,18]},{1:[2,19]},{15:[1,151]},e(rt,[2,25]),e(it,[2,45]),e(dt,[2,79]),e(pt,[2,81]),e(ht,[2,31]),e(ht,[2,42]),e(gt,[2,32]),e(gt,[2,33],{15:[1,152]}),e(ut,[2,10]),e(gt,[2,34])],defaultActions:{2:[2,1],3:[2,2],5:[2,8],6:[2,4],7:[2,5],8:[2,6],9:[2,7],16:[2,11],17:[2,3],27:[2,14],85:[2,13],86:[2,15],138:[2,16],139:[2,17],140:[2,18],141:[2,19]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=a.slice.call(arguments,1),u=Object.create(this.lexer),d={yy:{}};for(var p in this.yy)Object.prototype.hasOwnProperty.call(this.yy,p)&&(d.yy[p]=this.yy[p]);u.setInput(t,d.yy),d.yy.lexer=u,d.yy.parser=this,void 0===u.yylloc&&(u.yylloc={});var f=u.yylloc;a.push(f);var g=u.options&&u.options.ranges;function y(){var t;return"number"!=typeof(t=i.pop()||u.lex()||1)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof d.yy.parseError?this.parseError=d.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var m,b,_,x,v,k,w,C,T={};;){if(b=n[n.length-1],this.defaultActions[b]?_=this.defaultActions[b]:(null==m&&(m=y()),_=s[b]&&s[b][m]),void 0===_||!_.length||!_[0]){var E="";for(v in C=[],s[b])this.terminals_[v]&&v>2&&C.push("'"+this.terminals_[v]+"'");E=u.showPosition?"Parse error on line "+(c+1)+":\n"+u.showPosition()+"\nExpecting "+C.join(", ")+", got '"+(this.terminals_[m]||m)+"'":"Parse error on line "+(c+1)+": Unexpected "+(1==m?"end of input":"'"+(this.terminals_[m]||m)+"'"),this.parseError(E,{text:u.match,token:this.terminals_[m]||m,line:u.yylineno,loc:f,expected:C})}if(_[0]instanceof Array&&_.length>1)throw new Error("Parse Error: multiple actions possible at state: "+b+", token: "+m);switch(_[0]){case 1:n.push(m),r.push(u.yytext),a.push(u.yylloc),n.push(_[1]),m=null,l=u.yyleng,o=u.yytext,c=u.yylineno,f=u.yylloc;break;case 2:if(k=this.productions_[_[1]][1],T.$=r[r.length-k],T._$={first_line:a[a.length-(k||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(k||1)].first_column,last_column:a[a.length-1].last_column},g&&(T._$.range=[a[a.length-(k||1)].range[0],a[a.length-1].range[1]]),void 0!==(x=this.performAction.apply(T,[o,l,c,d.yy,_[1],r,a].concat(h))))return x;k&&(n=n.slice(0,-1*k*2),r=r.slice(0,-1*k),a=a.slice(0,-1*k)),n.push(this.productions_[_[1]][0]),r.push(T.$),a.push(T._$),w=s[n[n.length-2]][n[n.length-1]],n.push(w);break;case 3:return!0}}return!0}},mt=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),18;case 1:return 7;case 2:return 8;case 3:return 9;case 4:return 10;case 5:return this.begin("type_directive"),19;case 6:return this.popState(),this.begin("arg_directive"),16;case 7:return this.popState(),this.popState(),21;case 8:return 20;case 9:return 32;case 10:return 33;case 11:return this.begin("acc_title"),34;case 12:return this.popState(),"acc_title_value";case 13:return this.begin("acc_descr"),36;case 14:return this.popState(),"acc_descr_value";case 15:this.begin("acc_descr_multiline");break;case 16:case 78:this.popState();break;case 17:return"acc_descr_multiline_value";case 18:case 21:case 75:break;case 19:c;break;case 20:return 15;case 22:return 22;case 23:return 25;case 24:return 26;case 25:return 27;case 26:return 28;case 27:return this.begin("person_ext"),55;case 28:return this.begin("person"),54;case 29:return this.begin("system_ext_queue"),61;case 30:return this.begin("system_ext_db"),60;case 31:return this.begin("system_ext"),59;case 32:return this.begin("system_queue"),58;case 33:return this.begin("system_db"),57;case 34:return this.begin("system"),56;case 35:return this.begin("boundary"),47;case 36:return this.begin("enterprise_boundary"),44;case 37:return this.begin("system_boundary"),46;case 38:return this.begin("container_ext_queue"),67;case 39:return this.begin("container_ext_db"),66;case 40:return this.begin("container_ext"),65;case 41:return this.begin("container_queue"),64;case 42:return this.begin("container_db"),63;case 43:return this.begin("container"),62;case 44:return this.begin("container_boundary"),48;case 45:return this.begin("component_ext_queue"),73;case 46:return this.begin("component_ext_db"),72;case 47:return this.begin("component_ext"),71;case 48:return this.begin("component_queue"),70;case 49:return this.begin("component_db"),69;case 50:return this.begin("component"),68;case 51:case 52:return this.begin("node"),49;case 53:return this.begin("node_l"),50;case 54:return this.begin("node_r"),51;case 55:return this.begin("rel"),74;case 56:return this.begin("birel"),75;case 57:case 58:return this.begin("rel_u"),76;case 59:case 60:return this.begin("rel_d"),77;case 61:case 62:return this.begin("rel_l"),78;case 63:case 64:return this.begin("rel_r"),79;case 65:return this.begin("rel_b"),80;case 66:return this.begin("rel_index"),81;case 67:return this.begin("update_el_style"),82;case 68:return this.begin("update_rel_style"),83;case 69:return this.begin("update_layout_config"),84;case 70:return"EOF_IN_STRUCT";case 71:return this.begin("attribute"),"ATTRIBUTE_EMPTY";case 72:this.begin("attribute");break;case 73:case 84:this.popState(),this.popState();break;case 74:case 76:return 90;case 77:this.begin("string");break;case 79:case 85:return"STR";case 80:this.begin("string_kv");break;case 81:return this.begin("string_kv_key"),"STR_KEY";case 82:this.popState(),this.begin("string_kv_value");break;case 83:return"STR_VALUE";case 86:return"LBRACE";case 87:return"RBRACE";case 88:return"SPACE";case 89:return"EOL";case 90:return 24}},rules:[/^(?:%%\{)/,/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:((?:(?!\}%%)[^:.])*))/,/^(?::)/,/^(?:\}%%)/,/^(?:((?:(?!\}%%).|\n)*))/,/^(?:title\s[^#\n;]+)/,/^(?:accDescription\s[^#\n;]+)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/,/^(?:%%[^\n]*(\r?\n)*)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:C4Context\b)/,/^(?:C4Container\b)/,/^(?:C4Component\b)/,/^(?:C4Dynamic\b)/,/^(?:C4Deployment\b)/,/^(?:Person_Ext\b)/,/^(?:Person\b)/,/^(?:SystemQueue_Ext\b)/,/^(?:SystemDb_Ext\b)/,/^(?:System_Ext\b)/,/^(?:SystemQueue\b)/,/^(?:SystemDb\b)/,/^(?:System\b)/,/^(?:Boundary\b)/,/^(?:Enterprise_Boundary\b)/,/^(?:System_Boundary\b)/,/^(?:ContainerQueue_Ext\b)/,/^(?:ContainerDb_Ext\b)/,/^(?:Container_Ext\b)/,/^(?:ContainerQueue\b)/,/^(?:ContainerDb\b)/,/^(?:Container\b)/,/^(?:Container_Boundary\b)/,/^(?:ComponentQueue_Ext\b)/,/^(?:ComponentDb_Ext\b)/,/^(?:Component_Ext\b)/,/^(?:ComponentQueue\b)/,/^(?:ComponentDb\b)/,/^(?:Component\b)/,/^(?:Deployment_Node\b)/,/^(?:Node\b)/,/^(?:Node_L\b)/,/^(?:Node_R\b)/,/^(?:Rel\b)/,/^(?:BiRel\b)/,/^(?:Rel_Up\b)/,/^(?:Rel_U\b)/,/^(?:Rel_Down\b)/,/^(?:Rel_D\b)/,/^(?:Rel_Left\b)/,/^(?:Rel_L\b)/,/^(?:Rel_Right\b)/,/^(?:Rel_R\b)/,/^(?:Rel_Back\b)/,/^(?:RelIndex\b)/,/^(?:UpdateElementStyle\b)/,/^(?:UpdateRelStyle\b)/,/^(?:UpdateLayoutConfig\b)/,/^(?:$)/,/^(?:[(][ ]*[,])/,/^(?:[(])/,/^(?:[)])/,/^(?:,,)/,/^(?:,)/,/^(?:[ ]*["]["])/,/^(?:[ ]*["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:[ ]*[\$])/,/^(?:[^=]*)/,/^(?:[=][ ]*["])/,/^(?:[^"]+)/,/^(?:["])/,/^(?:[^,]+)/,/^(?:\{)/,/^(?:\})/,/^(?:[\s]+)/,/^(?:[\n\r]+)/,/^(?:$)/],conditions:{acc_descr_multiline:{rules:[16,17],inclusive:!1},acc_descr:{rules:[14],inclusive:!1},acc_title:{rules:[12],inclusive:!1},close_directive:{rules:[],inclusive:!1},arg_directive:{rules:[7,8],inclusive:!1},type_directive:{rules:[6,7],inclusive:!1},open_directive:{rules:[5],inclusive:!1},string_kv_value:{rules:[83,84],inclusive:!1},string_kv_key:{rules:[82],inclusive:!1},string_kv:{rules:[81],inclusive:!1},string:{rules:[78,79],inclusive:!1},attribute:{rules:[73,74,75,76,77,80,85],inclusive:!1},update_layout_config:{rules:[70,71,72,73],inclusive:!1},update_rel_style:{rules:[70,71,72,73],inclusive:!1},update_el_style:{rules:[70,71,72,73],inclusive:!1},rel_b:{rules:[70,71,72,73],inclusive:!1},rel_r:{rules:[70,71,72,73],inclusive:!1},rel_l:{rules:[70,71,72,73],inclusive:!1},rel_d:{rules:[70,71,72,73],inclusive:!1},rel_u:{rules:[70,71,72,73],inclusive:!1},rel_bi:{rules:[],inclusive:!1},rel:{rules:[70,71,72,73],inclusive:!1},node_r:{rules:[70,71,72,73],inclusive:!1},node_l:{rules:[70,71,72,73],inclusive:!1},node:{rules:[70,71,72,73],inclusive:!1},index:{rules:[],inclusive:!1},rel_index:{rules:[70,71,72,73],inclusive:!1},component_ext_queue:{rules:[],inclusive:!1},component_ext_db:{rules:[70,71,72,73],inclusive:!1},component_ext:{rules:[70,71,72,73],inclusive:!1},component_queue:{rules:[70,71,72,73],inclusive:!1},component_db:{rules:[70,71,72,73],inclusive:!1},component:{rules:[70,71,72,73],inclusive:!1},container_boundary:{rules:[70,71,72,73],inclusive:!1},container_ext_queue:{rules:[],inclusive:!1},container_ext_db:{rules:[70,71,72,73],inclusive:!1},container_ext:{rules:[70,71,72,73],inclusive:!1},container_queue:{rules:[70,71,72,73],inclusive:!1},container_db:{rules:[70,71,72,73],inclusive:!1},container:{rules:[70,71,72,73],inclusive:!1},birel:{rules:[70,71,72,73],inclusive:!1},system_boundary:{rules:[70,71,72,73],inclusive:!1},enterprise_boundary:{rules:[70,71,72,73],inclusive:!1},boundary:{rules:[70,71,72,73],inclusive:!1},system_ext_queue:{rules:[70,71,72,73],inclusive:!1},system_ext_db:{rules:[70,71,72,73],inclusive:!1},system_ext:{rules:[70,71,72,73],inclusive:!1},system_queue:{rules:[70,71,72,73],inclusive:!1},system_db:{rules:[70,71,72,73],inclusive:!1},system:{rules:[70,71,72,73],inclusive:!1},person_ext:{rules:[70,71,72,73],inclusive:!1},person:{rules:[70,71,72,73],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,9,10,11,13,15,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,86,87,88,89,90],inclusive:!0}}},t);function bt(){this.yy={}}return yt.lexer=mt,bt.prototype=yt,yt.Parser=bt,new bt}();jr.parser=jr;const Yr=jr,zr=t=>null!==t.match(/^\s*C4Context|C4Container|C4Component|C4Dynamic|C4Deployment/);let Ur=[],Wr=[""],qr="global",Hr="",Vr=[{alias:"global",label:{text:"global"},type:{text:"global"},tags:null,link:null,parentBoundary:""}],Gr=[],Xr="",Qr=!1,Kr=4,Jr=2;var ta;const ea=function(t){return null==t?Ur:Ur.filter((e=>e.parentBoundary===t))},na=function(){return Qr},ia={addPersonOrSystem:function(t,e,n,i,r,a,s){if(null===e||null===n)return;let o={};const c=Ur.find((t=>t.alias===e));if(c&&e===c.alias?o=c:(o.alias=e,Ur.push(o)),o.label=null==n?{text:""}:{text:n},null==i)o.descr={text:""};else if("object"==typeof i){let[t,e]=Object.entries(i)[0];o[t]={text:e}}else o.descr={text:i};if("object"==typeof r){let[t,e]=Object.entries(r)[0];o[t]=e}else o.sprite=r;if("object"==typeof a){let[t,e]=Object.entries(a)[0];o[t]=e}else o.tags=a;if("object"==typeof s){let[t,e]=Object.entries(s)[0];o[t]=e}else o.link=s;o.typeC4Shape={text:t},o.parentBoundary=qr,o.wrap=na()},addPersonOrSystemBoundary:function(t,e,n,i,r){if(null===t||null===e)return;let a={};const s=Vr.find((e=>e.alias===t));if(s&&t===s.alias?a=s:(a.alias=t,Vr.push(a)),a.label=null==e?{text:""}:{text:e},null==n)a.type={text:"system"};else if("object"==typeof n){let[t,e]=Object.entries(n)[0];a[t]={text:e}}else a.type={text:n};if("object"==typeof i){let[t,e]=Object.entries(i)[0];a[t]=e}else a.tags=i;if("object"==typeof r){let[t,e]=Object.entries(r)[0];a[t]=e}else a.link=r;a.parentBoundary=qr,a.wrap=na(),Hr=qr,qr=t,Wr.push(Hr)},addContainer:function(t,e,n,i,r,a,s,o){if(null===e||null===n)return;let c={};const l=Ur.find((t=>t.alias===e));if(l&&e===l.alias?c=l:(c.alias=e,Ur.push(c)),c.label=null==n?{text:""}:{text:n},null==i)c.techn={text:""};else if("object"==typeof i){let[t,e]=Object.entries(i)[0];c[t]={text:e}}else c.techn={text:i};if(null==r)c.descr={text:""};else if("object"==typeof r){let[t,e]=Object.entries(r)[0];c[t]={text:e}}else c.descr={text:r};if("object"==typeof a){let[t,e]=Object.entries(a)[0];c[t]=e}else c.sprite=a;if("object"==typeof s){let[t,e]=Object.entries(s)[0];c[t]=e}else c.tags=s;if("object"==typeof o){let[t,e]=Object.entries(o)[0];c[t]=e}else c.link=o;c.wrap=na(),c.typeC4Shape={text:t},c.parentBoundary=qr},addContainerBoundary:function(t,e,n,i,r){if(null===t||null===e)return;let a={};const s=Vr.find((e=>e.alias===t));if(s&&t===s.alias?a=s:(a.alias=t,Vr.push(a)),a.label=null==e?{text:""}:{text:e},null==n)a.type={text:"container"};else if("object"==typeof n){let[t,e]=Object.entries(n)[0];a[t]={text:e}}else a.type={text:n};if("object"==typeof i){let[t,e]=Object.entries(i)[0];a[t]=e}else a.tags=i;if("object"==typeof r){let[t,e]=Object.entries(r)[0];a[t]=e}else a.link=r;a.parentBoundary=qr,a.wrap=na(),Hr=qr,qr=t,Wr.push(Hr)},addComponent:function(t,e,n,i,r,a,s,o){if(null===e||null===n)return;let c={};const l=Ur.find((t=>t.alias===e));if(l&&e===l.alias?c=l:(c.alias=e,Ur.push(c)),c.label=null==n?{text:""}:{text:n},null==i)c.techn={text:""};else if("object"==typeof i){let[t,e]=Object.entries(i)[0];c[t]={text:e}}else c.techn={text:i};if(null==r)c.descr={text:""};else if("object"==typeof r){let[t,e]=Object.entries(r)[0];c[t]={text:e}}else c.descr={text:r};if("object"==typeof a){let[t,e]=Object.entries(a)[0];c[t]=e}else c.sprite=a;if("object"==typeof s){let[t,e]=Object.entries(s)[0];c[t]=e}else c.tags=s;if("object"==typeof o){let[t,e]=Object.entries(o)[0];c[t]=e}else c.link=o;c.wrap=na(),c.typeC4Shape={text:t},c.parentBoundary=qr},addDeploymentNode:function(t,e,n,i,r,a,s,o){if(null===e||null===n)return;let c={};const l=Vr.find((t=>t.alias===e));if(l&&e===l.alias?c=l:(c.alias=e,Vr.push(c)),c.label=null==n?{text:""}:{text:n},null==i)c.type={text:"node"};else if("object"==typeof i){let[t,e]=Object.entries(i)[0];c[t]={text:e}}else c.type={text:i};if(null==r)c.descr={text:""};else if("object"==typeof r){let[t,e]=Object.entries(r)[0];c[t]={text:e}}else c.descr={text:r};if("object"==typeof s){let[t,e]=Object.entries(s)[0];c[t]=e}else c.tags=s;if("object"==typeof o){let[t,e]=Object.entries(o)[0];c[t]=e}else c.link=o;c.nodeType=t,c.parentBoundary=qr,c.wrap=na(),Hr=qr,qr=e,Wr.push(Hr)},popBoundaryParseStack:function(){qr=Hr,Wr.pop(),Hr=Wr.pop(),Wr.push(Hr)},addRel:function(t,e,n,i,r,a,s,o,c){if(null==t||null==e||null==n||null==i)return;let l={};const h=Gr.find((t=>t.from===e&&t.to===n));if(h?l=h:Gr.push(l),l.type=t,l.from=e,l.to=n,l.label={text:i},null==r)l.techn={text:""};else if("object"==typeof r){let[t,e]=Object.entries(r)[0];l[t]={text:e}}else l.techn={text:r};if(null==a)l.descr={text:""};else if("object"==typeof a){let[t,e]=Object.entries(a)[0];l[t]={text:e}}else l.descr={text:a};if("object"==typeof s){let[t,e]=Object.entries(s)[0];l[t]=e}else l.sprite=s;if("object"==typeof o){let[t,e]=Object.entries(o)[0];l[t]=e}else l.tags=o;if("object"==typeof c){let[t,e]=Object.entries(c)[0];l[t]=e}else l.link=c;l.wrap=na()},updateElStyle:function(t,e,n,i,r,a,s,o,c,l,h){let u=Ur.find((t=>t.alias===e));if(void 0!==u||(u=Vr.find((t=>t.alias===e)),void 0!==u)){if(null!=n)if("object"==typeof n){let[t,e]=Object.entries(n)[0];u[t]=e}else u.bgColor=n;if(null!=i)if("object"==typeof i){let[t,e]=Object.entries(i)[0];u[t]=e}else u.fontColor=i;if(null!=r)if("object"==typeof r){let[t,e]=Object.entries(r)[0];u[t]=e}else u.borderColor=r;if(null!=a)if("object"==typeof a){let[t,e]=Object.entries(a)[0];u[t]=e}else u.shadowing=a;if(null!=s)if("object"==typeof s){let[t,e]=Object.entries(s)[0];u[t]=e}else u.shape=s;if(null!=o)if("object"==typeof o){let[t,e]=Object.entries(o)[0];u[t]=e}else u.sprite=o;if(null!=c)if("object"==typeof c){let[t,e]=Object.entries(c)[0];u[t]=e}else u.techn=c;if(null!=l)if("object"==typeof l){let[t,e]=Object.entries(l)[0];u[t]=e}else u.legendText=l;if(null!=h)if("object"==typeof h){let[t,e]=Object.entries(h)[0];u[t]=e}else u.legendSprite=h}},updateRelStyle:function(t,e,n,i,r,a,s){const o=Gr.find((t=>t.from===e&&t.to===n));if(void 0!==o){if(null!=i)if("object"==typeof i){let[t,e]=Object.entries(i)[0];o[t]=e}else o.textColor=i;if(null!=r)if("object"==typeof r){let[t,e]=Object.entries(r)[0];o[t]=e}else o.lineColor=r;if(null!=a)if("object"==typeof a){let[t,e]=Object.entries(a)[0];o[t]=parseInt(e)}else o.offsetX=parseInt(a);if(null!=s)if("object"==typeof s){let[t,e]=Object.entries(s)[0];o[t]=parseInt(e)}else o.offsetY=parseInt(s)}},updateLayoutConfig:function(t,e,n){let i=Kr,r=Jr;if("object"==typeof e){const t=Object.values(e)[0];i=parseInt(t)}else i=parseInt(e);if("object"==typeof n){const t=Object.values(n)[0];r=parseInt(t)}else r=parseInt(n);i>=1&&(Kr=i),r>=1&&(Jr=r)},autoWrap:na,setWrap:function(t){Qr=t},getC4ShapeArray:ea,getC4Shape:function(t){return Ur.find((e=>e.alias===t))},getC4ShapeKeys:function(t){return Object.keys(ea(t))},getBoundarys:function(t){return null==t?Vr:Vr.filter((e=>e.parentBoundary===t))},getCurrentBoundaryParse:function(){return qr},getParentBoundaryParse:function(){return Hr},getRels:function(){return Gr},getTitle:function(){return Xr},getC4Type:function(){return ta},getC4ShapeInRow:function(){return Kr},getC4BoundaryInRow:function(){return Jr},setAccTitle:Zi,getAccTitle:Pi,getAccDescription:Yi,setAccDescription:ji,parseDirective:function(t,e,n){xp.parseDirective(this,t,e,n)},getConfig:()=>ui().c4,clear:function(){Ur=[],Vr=[{alias:"global",label:{text:"global"},type:{text:"global"},tags:null,link:null,parentBoundary:""}],Hr="",qr="global",Wr=[""],Gr=[],Wr=[""],Xr="",Qr=!1,Kr=4,Jr=2},LINETYPE:{SOLID:0,DOTTED:1,NOTE:2,SOLID_CROSS:3,DOTTED_CROSS:4,SOLID_OPEN:5,DOTTED_OPEN:6,LOOP_START:10,LOOP_END:11,ALT_START:12,ALT_ELSE:13,ALT_END:14,OPT_START:15,OPT_END:16,ACTIVE_START:17,ACTIVE_END:18,PAR_START:19,PAR_AND:20,PAR_END:21,RECT_START:22,RECT_END:23,SOLID_POINT:24,DOTTED_POINT:25},ARROWTYPE:{FILLED:0,OPEN:1},PLACEMENT:{LEFTOF:0,RIGHTOF:1,OVER:2},setTitle:function(t){let e=It(t,ui());Xr=e},setC4Type:function(t){let e=It(t,ui());ta=e}},ra=function(t,e){const n=t.append("rect");if(n.attr("x",e.x),n.attr("y",e.y),n.attr("fill",e.fill),n.attr("stroke",e.stroke),n.attr("width",e.width),n.attr("height",e.height),n.attr("rx",e.rx),n.attr("ry",e.ry),"undefined"!==e.attrs&&null!==e.attrs)for(let i in e.attrs)n.attr(i,e.attrs[i]);return"undefined"!==e.class&&n.attr("class",e.class),n},aa=function(t,e,n,i,r,a){const o=t.append("image");o.attr("width",e),o.attr("height",n),o.attr("x",i),o.attr("y",r);let c=a.startsWith("data:image/png;base64")?a:(0,s.Nm)(a);o.attr("xlink:href",c)},sa=function(){return{x:0,y:0,fill:"#EDF2AE",stroke:"#666",width:100,anchor:"start",height:100,rx:0,ry:0}},oa=(t,e)=>({fontFamily:t[e+"FontFamily"],fontSize:t[e+"FontSize"],fontWeight:t[e+"FontWeight"]}),ca=function(){function t(t,e,n,r,a,s,o){i(e.append("text").attr("x",n+a/2).attr("y",r+s/2+5).style("text-anchor","middle").text(t),o)}function e(t,e,n,r,a,s,o,c){const{fontSize:l,fontFamily:h,fontWeight:u}=c,d=t.split(jt.lineBreakRegex);for(let p=0;p<d.length;p++){const t=p*l-l*(d.length-1)/2,s=e.append("text").attr("x",n+a/2).attr("y",r).style("text-anchor","middle").attr("dominant-baseline","middle").style("font-size",l).style("font-weight",u).style("font-family",h);s.append("tspan").attr("dy",t).text(d[p]).attr("alignment-baseline","mathematical"),i(s,o)}}function n(t,n,r,a,s,o,c,l){const h=n.append("switch"),u=h.append("foreignObject").attr("x",r).attr("y",a).attr("width",s).attr("height",o).append("xhtml:div").style("display","table").style("height","100%").style("width","100%");u.append("div").style("display","table-cell").style("text-align","center").style("vertical-align","middle").text(t),e(t,h,r,a,s,0,c,l),i(u,c)}function i(t,e){for(const n in e)e.hasOwnProperty(n)&&t.attr(n,e[n])}return function(i){return"fo"===i.textPlacement?n:"old"===i.textPlacement?t:e}}(),la=function(t,e,n){const i=t.append("g");let r=e.bgColor?e.bgColor:"none",a=e.borderColor?e.borderColor:"#444444",s=e.fontColor?e.fontColor:"black",o={"stroke-width":1,"stroke-dasharray":"7.0,7.0"};e.nodeType&&(o={"stroke-width":1});let c={x:e.x,y:e.y,fill:r,stroke:a,width:e.width,height:e.height,rx:2.5,ry:2.5,attrs:o};ra(i,c);let l=n.boundaryFont();l.fontWeight="bold",l.fontSize=l.fontSize+2,l.fontColor=s,ca(n)(e.label.text,i,e.x,e.y+e.label.Y,e.width,e.height,{fill:"#444444"},l),e.type&&""!==e.type.text&&(l=n.boundaryFont(),l.fontColor=s,ca(n)(e.type.text,i,e.x,e.y+e.type.Y,e.width,e.height,{fill:"#444444"},l)),e.descr&&""!==e.descr.text&&(l=n.boundaryFont(),l.fontSize=l.fontSize-2,l.fontColor=s,ca(n)(e.descr.text,i,e.x,e.y+e.descr.Y,e.width,e.height,{fill:"#444444"},l))},ha=function(t,e,n){var i;let r=e.bgColor?e.bgColor:n[e.typeC4Shape.text+"_bg_color"],a=e.borderColor?e.borderColor:n[e.typeC4Shape.text+"_border_color"],s=e.fontColor?e.fontColor:"#FFFFFF",o="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII=";switch(e.typeC4Shape.text){case"person":o="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII=";break;case"external_person":o="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAAB6ElEQVR4Xu2YLY+EMBCG9+dWr0aj0Wg0Go1Go0+j8Xdv2uTCvv1gpt0ebHKPuhDaeW4605Z9mJvx4AdXUyTUdd08z+u6flmWZRnHsWkafk9DptAwDPu+f0eAYtu2PEaGWuj5fCIZrBAC2eLBAnRCsEkkxmeaJp7iDJ2QMDdHsLg8SxKFEJaAo8lAXnmuOFIhTMpxxKATebo4UiFknuNo4OniSIXQyRxEA3YsnjGCVEjVXD7yLUAqxBGUyPv/Y4W2beMgGuS7kVQIBycH0fD+oi5pezQETxdHKmQKGk1eQEYldK+jw5GxPfZ9z7Mk0Qnhf1W1m3w//EUn5BDmSZsbR44QQLBEqrBHqOrmSKaQAxdnLArCrxZcM7A7ZKs4ioRq8LFC+NpC3WCBJsvpVw5edm9iEXFuyNfxXAgSwfrFQ1c0iNda8AdejvUgnktOtJQQxmcfFzGglc5WVCj7oDgFqU18boeFSs52CUh8LE8BIVQDT1ABrB0HtgSEYlX5doJnCwv9TXocKCaKbnwhdDKPq4lf3SwU3HLq4V/+WYhHVMa/3b4IlfyikAduCkcBc7mQ3/z/Qq/cTuikhkzB12Ae/mcJC9U+Vo8Ej1gWAtgbeGgFsAMHr50BIWOLCbezvhpBFUdY6EJuJ/QDW0XoMX60zZ0AAAAASUVORK5CYII="}const c=t.append("g");c.attr("class","person-man");const l=sa();switch(e.typeC4Shape.text){case"person":case"external_person":case"system":case"external_system":case"container":case"external_container":case"component":case"external_component":l.x=e.x,l.y=e.y,l.fill=r,l.width=e.width,l.height=e.height,l.stroke=a,l.rx=2.5,l.ry=2.5,l.attrs={"stroke-width":.5},ra(c,l);break;case"system_db":case"external_system_db":case"container_db":case"external_container_db":case"component_db":case"external_component_db":c.append("path").attr("fill",r).attr("stroke-width","0.5").attr("stroke",a).attr("d","Mstartx,startyc0,-10 half,-10 half,-10c0,0 half,0 half,10l0,heightc0,10 -half,10 -half,10c0,0 -half,0 -half,-10l0,-height".replaceAll("startx",e.x).replaceAll("starty",e.y).replaceAll("half",e.width/2).replaceAll("height",e.height)),c.append("path").attr("fill","none").attr("stroke-width","0.5").attr("stroke",a).attr("d","Mstartx,startyc0,10 half,10 half,10c0,0 half,0 half,-10".replaceAll("startx",e.x).replaceAll("starty",e.y).replaceAll("half",e.width/2));break;case"system_queue":case"external_system_queue":case"container_queue":case"external_container_queue":case"component_queue":case"external_component_queue":c.append("path").attr("fill",r).attr("stroke-width","0.5").attr("stroke",a).attr("d","Mstartx,startylwidth,0c5,0 5,half 5,halfc0,0 0,half -5,halfl-width,0c-5,0 -5,-half -5,-halfc0,0 0,-half 5,-half".replaceAll("startx",e.x).replaceAll("starty",e.y).replaceAll("width",e.width).replaceAll("half",e.height/2)),c.append("path").attr("fill","none").attr("stroke-width","0.5").attr("stroke",a).attr("d","Mstartx,startyc-5,0 -5,half -5,halfc0,half 5,half 5,half".replaceAll("startx",e.x+e.width).replaceAll("starty",e.y).replaceAll("half",e.height/2))}let h=oa(n,e.typeC4Shape.text);switch(c.append("text").attr("fill",s).attr("font-family",h.fontFamily).attr("font-size",h.fontSize-2).attr("font-style","italic").attr("lengthAdjust","spacing").attr("textLength",e.typeC4Shape.width).attr("x",e.x+e.width/2-e.typeC4Shape.width/2).attr("y",e.y+e.typeC4Shape.Y).text("<<"+e.typeC4Shape.text+">>"),e.typeC4Shape.text){case"person":case"external_person":aa(c,48,48,e.x+e.width/2-24,e.y+e.image.Y,o)}let u=n[e.typeC4Shape.text+"Font"]();return u.fontWeight="bold",u.fontSize=u.fontSize+2,u.fontColor=s,ca(n)(e.label.text,c,e.x,e.y+e.label.Y,e.width,e.height,{fill:s},u),u=n[e.typeC4Shape.text+"Font"](),u.fontColor=s,e.techn&&""!==(null==(i=e.techn)?void 0:i.text)?ca(n)(e.techn.text,c,e.x,e.y+e.techn.Y,e.width,e.height,{fill:s,"font-style":"italic"},u):e.type&&""!==e.type.text&&ca(n)(e.type.text,c,e.x,e.y+e.type.Y,e.width,e.height,{fill:s,"font-style":"italic"},u),e.descr&&""!==e.descr.text&&(u=n.personFont(),u.fontColor=s,ca(n)(e.descr.text,c,e.x,e.y+e.descr.Y,e.width,e.height,{fill:s},u)),e.height},ua=(t,e,n)=>{const i=t.append("g");let r=0;for(let a of e){let t=a.textColor?a.textColor:"#444444",e=a.lineColor?a.lineColor:"#444444",s=a.offsetX?parseInt(a.offsetX):0,o=a.offsetY?parseInt(a.offsetY):0,c="";if(0===r){let t=i.append("line");t.attr("x1",a.startPoint.x),t.attr("y1",a.startPoint.y),t.attr("x2",a.endPoint.x),t.attr("y2",a.endPoint.y),t.attr("stroke-width","1"),t.attr("stroke",e),t.style("fill","none"),"rel_b"!==a.type&&t.attr("marker-end","url("+c+"#arrowhead)"),"birel"!==a.type&&"rel_b"!==a.type||t.attr("marker-start","url("+c+"#arrowend)"),r=-1}else{let t=i.append("path");t.attr("fill","none").attr("stroke-width","1").attr("stroke",e).attr("d","Mstartx,starty Qcontrolx,controly stopx,stopy ".replaceAll("startx",a.startPoint.x).replaceAll("starty",a.startPoint.y).replaceAll("controlx",a.startPoint.x+(a.endPoint.x-a.startPoint.x)/2-(a.endPoint.x-a.startPoint.x)/4).replaceAll("controly",a.startPoint.y+(a.endPoint.y-a.startPoint.y)/2).replaceAll("stopx",a.endPoint.x).replaceAll("stopy",a.endPoint.y)),"rel_b"!==a.type&&t.attr("marker-end","url("+c+"#arrowhead)"),"birel"!==a.type&&"rel_b"!==a.type||t.attr("marker-start","url("+c+"#arrowend)")}let l=n.messageFont();ca(n)(a.label.text,i,Math.min(a.startPoint.x,a.endPoint.x)+Math.abs(a.endPoint.x-a.startPoint.x)/2+s,Math.min(a.startPoint.y,a.endPoint.y)+Math.abs(a.endPoint.y-a.startPoint.y)/2+o,a.label.width,a.label.height,{fill:t},l),a.techn&&""!==a.techn.text&&(l=n.messageFont(),ca(n)("["+a.techn.text+"]",i,Math.min(a.startPoint.x,a.endPoint.x)+Math.abs(a.endPoint.x-a.startPoint.x)/2+s,Math.min(a.startPoint.y,a.endPoint.y)+Math.abs(a.endPoint.y-a.startPoint.y)/2+n.messageFontSize+5+o,Math.max(a.label.width,a.techn.width),a.techn.height,{fill:t,"font-style":"italic"},l))}},da=function(t){t.append("defs").append("marker").attr("id","arrowhead").attr("refX",9).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z")},pa=function(t){t.append("defs").append("marker").attr("id","arrowend").attr("refX",1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 10 0 L 0 5 L 10 10 z")},fa=function(t){t.append("defs").append("marker").attr("id","filled-head").attr("refX",18).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},ga=function(t){const e=t.append("defs").append("marker").attr("id","crosshead").attr("markerWidth",15).attr("markerHeight",8).attr("orient","auto").attr("refX",16).attr("refY",4);e.append("path").attr("fill","black").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1px").attr("d","M 9,2 V 6 L16,4 Z"),e.append("path").attr("fill","none").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1px").attr("d","M 0,1 L 6,7 M 6,1 L 0,7")},ya=function(t){t.append("defs").append("symbol").attr("id","database").attr("fill-rule","evenodd").attr("clip-rule","evenodd").append("path").attr("transform","scale(.5)").attr("d","M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z")},ma=function(t){t.append("defs").append("symbol").attr("id","computer").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z")},ba=function(t){t.append("defs").append("symbol").attr("id","clock").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z")};s.Nm;let _a=0,xa=0,va=4,ka=2;jr.yy=ia;let wa={};class Ca{constructor(t){this.name="",this.data={},this.data.startx=void 0,this.data.stopx=void 0,this.data.starty=void 0,this.data.stopy=void 0,this.data.widthLimit=void 0,this.nextData={},this.nextData.startx=void 0,this.nextData.stopx=void 0,this.nextData.starty=void 0,this.nextData.stopy=void 0,this.nextData.cnt=0,Ta(t.db.getConfig())}setData(t,e,n,i){this.nextData.startx=this.data.startx=t,this.nextData.stopx=this.data.stopx=e,this.nextData.starty=this.data.starty=n,this.nextData.stopy=this.data.stopy=i}updateVal(t,e,n,i){void 0===t[e]?t[e]=n:t[e]=i(n,t[e])}insert(t){this.nextData.cnt=this.nextData.cnt+1;let e=this.nextData.startx===this.nextData.stopx?this.nextData.stopx+t.margin:this.nextData.stopx+2*t.margin,n=e+t.width,i=this.nextData.starty+2*t.margin,r=i+t.height;(e>=this.data.widthLimit||n>=this.data.widthLimit||this.nextData.cnt>va)&&(e=this.nextData.startx+t.margin+wa.nextLinePaddingX,i=this.nextData.stopy+2*t.margin,this.nextData.stopx=n=e+t.width,this.nextData.starty=this.nextData.stopy,this.nextData.stopy=r=i+t.height,this.nextData.cnt=1),t.x=e,t.y=i,this.updateVal(this.data,"startx",e,Math.min),this.updateVal(this.data,"starty",i,Math.min),this.updateVal(this.data,"stopx",n,Math.max),this.updateVal(this.data,"stopy",r,Math.max),this.updateVal(this.nextData,"startx",e,Math.min),this.updateVal(this.nextData,"starty",i,Math.min),this.updateVal(this.nextData,"stopx",n,Math.max),this.updateVal(this.nextData,"stopy",r,Math.max)}init(t){this.name="",this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0,widthLimit:void 0},this.nextData={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0,cnt:0},Ta(t.db.getConfig())}bumpLastMargin(t){this.data.stopx+=t,this.data.stopy+=t}}const Ta=function(t){On(wa,t),t.fontFamily&&(wa.personFontFamily=wa.systemFontFamily=wa.messageFontFamily=t.fontFamily),t.fontSize&&(wa.personFontSize=wa.systemFontSize=wa.messageFontSize=t.fontSize),t.fontWeight&&(wa.personFontWeight=wa.systemFontWeight=wa.messageFontWeight=t.fontWeight)},Ea=(t,e)=>({fontFamily:t[e+"FontFamily"],fontSize:t[e+"FontSize"],fontWeight:t[e+"FontWeight"]}),Sa=t=>({fontFamily:t.boundaryFontFamily,fontSize:t.boundaryFontSize,fontWeight:t.boundaryFontWeight});function Aa(t,e,n,i,r){if(!e[t].width)if(n)e[t].text=Wn(e[t].text,r,i),e[t].textLines=e[t].text.split(jt.lineBreakRegex).length,e[t].width=r,e[t].height=Hn(e[t].text,i);else{let n=e[t].text.split(jt.lineBreakRegex);e[t].textLines=n.length;let r=0;e[t].height=0,e[t].width=0;for(const a of n)e[t].width=Math.max(Vn(a,i),e[t].width),r=Hn(a,i),e[t].height=e[t].height+r}}const La=function(t,e,n){e.x=n.data.startx,e.y=n.data.starty,e.width=n.data.stopx-n.data.startx,e.height=n.data.stopy-n.data.starty,e.label.y=wa.c4ShapeMargin-35;let i=e.wrap&&wa.wrap,r=Sa(wa);r.fontSize=r.fontSize+2,r.fontWeight="bold",Aa("label",e,i,r,Vn(e.label.text,r)),la(t,e,wa)},Ba=function(t,e,n,i){let r=0;for(const a of i){r=0;const i=n[a];let s=Ea(wa,i.typeC4Shape.text);switch(s.fontSize=s.fontSize-2,i.typeC4Shape.width=Vn("<<"+i.typeC4Shape.text+">>",s),i.typeC4Shape.height=s.fontSize+2,i.typeC4Shape.Y=wa.c4ShapePadding,r=i.typeC4Shape.Y+i.typeC4Shape.height-4,i.image={width:0,height:0,Y:0},i.typeC4Shape.text){case"person":case"external_person":i.image.width=48,i.image.height=48,i.image.Y=r,r=i.image.Y+i.image.height}i.sprite&&(i.image.width=48,i.image.height=48,i.image.Y=r,r=i.image.Y+i.image.height);let o=i.wrap&&wa.wrap,c=wa.width-2*wa.c4ShapePadding,l=Ea(wa,i.typeC4Shape.text);if(l.fontSize=l.fontSize+2,l.fontWeight="bold",Aa("label",i,o,l,c),i.label.Y=r+8,r=i.label.Y+i.label.height,i.type&&""!==i.type.text){i.type.text="["+i.type.text+"]",Aa("type",i,o,Ea(wa,i.typeC4Shape.text),c),i.type.Y=r+5,r=i.type.Y+i.type.height}else if(i.techn&&""!==i.techn.text){i.techn.text="["+i.techn.text+"]",Aa("techn",i,o,Ea(wa,i.techn.text),c),i.techn.Y=r+5,r=i.techn.Y+i.techn.height}let h=r,u=i.label.width;if(i.descr&&""!==i.descr.text){Aa("descr",i,o,Ea(wa,i.typeC4Shape.text),c),i.descr.Y=r+20,r=i.descr.Y+i.descr.height,u=Math.max(i.label.width,i.descr.width),h=r-5*i.descr.textLines}u+=wa.c4ShapePadding,i.width=Math.max(i.width||wa.width,u,wa.width),i.height=Math.max(i.height||wa.height,h,wa.height),i.margin=i.margin||wa.c4ShapeMargin,t.insert(i),ha(e,i,wa)}t.bumpLastMargin(wa.c4ShapeMargin)};class Na{constructor(t,e){this.x=t,this.y=e}}let Da=function(t,e){let n=t.x,i=t.y,r=e.x,a=e.y,s=n+t.width/2,o=i+t.height/2,c=Math.abs(n-r),l=Math.abs(i-a),h=l/c,u=t.height/t.width,d=null;return i==a&&n<r?d=new Na(n+t.width,o):i==a&&n>r?d=new Na(n,o):n==r&&i<a?d=new Na(s,i+t.height):n==r&&i>a&&(d=new Na(s,i)),n>r&&i<a?d=u>=h?new Na(n,o+h*t.width/2):new Na(s-c/l*t.height/2,i+t.height):n<r&&i<a?d=u>=h?new Na(n+t.width,o+h*t.width/2):new Na(s+c/l*t.height/2,i+t.height):n<r&&i>a?d=u>=h?new Na(n+t.width,o-h*t.width/2):new Na(s+t.height/2*c/l,i):n>r&&i>a&&(d=u>=h?new Na(n,o-t.width/2*h):new Na(s-t.height/2*c/l,i)),d},Oa=function(t,e){let n={x:0,y:0};n.x=e.x+e.width/2,n.y=e.y+e.height/2;let i=Da(t,n);return n.x=t.x+t.width/2,n.y=t.y+t.height/2,{startPoint:i,endPoint:Da(e,n)}};function Ma(t,e,n,i,r){let a=new Ca(r);a.data.widthLimit=n.data.widthLimit/Math.min(ka,i.length);for(let[s,o]of i.entries()){let i=0;o.image={width:0,height:0,Y:0},o.sprite&&(o.image.width=48,o.image.height=48,o.image.Y=i,i=o.image.Y+o.image.height);let c=o.wrap&&wa.wrap,l=Sa(wa);if(l.fontSize=l.fontSize+2,l.fontWeight="bold",Aa("label",o,c,l,a.data.widthLimit),o.label.Y=i+8,i=o.label.Y+o.label.height,o.type&&""!==o.type.text){o.type.text="["+o.type.text+"]",Aa("type",o,c,Sa(wa),a.data.widthLimit),o.type.Y=i+5,i=o.type.Y+o.type.height}if(o.descr&&""!==o.descr.text){let t=Sa(wa);t.fontSize=t.fontSize-2,Aa("descr",o,c,t,a.data.widthLimit),o.descr.Y=i+20,i=o.descr.Y+o.descr.height}if(0==s||s%ka==0){let t=n.data.startx+wa.diagramMarginX,e=n.data.stopy+wa.diagramMarginY+i;a.setData(t,t,e,e)}else{let t=a.data.stopx!==a.data.startx?a.data.stopx+wa.diagramMarginX:a.data.startx,e=a.data.starty;a.setData(t,t,e,e)}a.name=o.alias;let h=r.db.getC4ShapeArray(o.alias),u=r.db.getC4ShapeKeys(o.alias);u.length>0&&Ba(a,t,h,u),e=o.alias;let d=r.db.getBoundarys(e);d.length>0&&Ma(t,e,a,d,r),"global"!==o.alias&&La(t,o,a),n.data.stopy=Math.max(a.data.stopy+wa.c4ShapeMargin,n.data.stopy),n.data.stopx=Math.max(a.data.stopx+wa.c4ShapeMargin,n.data.stopx),_a=Math.max(_a,n.data.stopx),xa=Math.max(xa,n.data.stopy)}}const Ia={drawPersonOrSystemArray:Ba,drawBoundary:La,setConf:Ta,draw:function(t,e,n,i){wa=ui().c4;const r=ui().securityLevel;let a;"sandbox"===r&&(a=(0,o.Ys)("#i"+e));const s="sandbox"===r?(0,o.Ys)(a.nodes()[0].contentDocument.body):(0,o.Ys)("body");let c=i.db;i.db.setWrap(wa.wrap),va=c.getC4ShapeInRow(),ka=c.getC4BoundaryInRow(),Bt.debug(`C:${JSON.stringify(wa,null,2)}`);const l="sandbox"===r?s.select(`[id="${e}"]`):(0,o.Ys)(`[id="${e}"]`);ma(l),ya(l),ba(l);let h=new Ca(i);h.setData(wa.diagramMarginX,wa.diagramMarginX,wa.diagramMarginY,wa.diagramMarginY),h.data.widthLimit=screen.availWidth,_a=wa.diagramMarginX,xa=wa.diagramMarginY;const u=i.db.getTitle();Ma(l,"",h,i.db.getBoundarys(""),i),da(l),pa(l),ga(l),fa(l),function(t,e,n,i){let r=0;for(let s of e){r+=1;let t=s.wrap&&wa.wrap,e={fontFamily:(a=wa).messageFontFamily,fontSize:a.messageFontSize,fontWeight:a.messageFontWeight};"C4Dynamic"===i.db.getC4Type()&&(s.label.text=r+": "+s.label.text);let o=Vn(s.label.text,e);Aa("label",s,t,e,o),s.techn&&""!==s.techn.text&&(o=Vn(s.techn.text,e),Aa("techn",s,t,e,o)),s.descr&&""!==s.descr.text&&(o=Vn(s.descr.text,e),Aa("descr",s,t,e,o));let c=n(s.from),l=n(s.to),h=Oa(c,l);s.startPoint=h.startPoint,s.endPoint=h.endPoint}var a;ua(t,e,wa)}(l,i.db.getRels(),i.db.getC4Shape,i),h.data.stopx=_a,h.data.stopy=xa;const d=h.data;let p=d.stopy-d.starty+2*wa.diagramMarginY;const f=d.stopx-d.startx+2*wa.diagramMarginX;u&&l.append("text").text(u).attr("x",(d.stopx-d.startx)/2-4*wa.diagramMarginX).attr("y",d.starty+wa.diagramMarginY),bi(l,p,f,wa.useMaxWidth);const g=u?60:0;l.attr("viewBox",d.startx-wa.diagramMarginX+" -"+(wa.diagramMarginY+g)+" "+f+" "+(p+g)),Bt.debug("models:",d)}};var Fa=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,3],i=[1,7],r=[1,8],a=[1,9],s=[1,10],o=[1,13],c=[1,12],l=[1,16,25],h=[1,20],u=[1,32],d=[1,33],p=[1,34],f=[1,36],g=[1,39],y=[1,37],m=[1,38],b=[1,44],_=[1,45],x=[1,40],v=[1,41],k=[1,42],w=[1,43],C=[1,48],T=[1,49],E=[1,50],S=[1,51],A=[16,25],L=[1,65],B=[1,66],N=[1,67],D=[1,68],O=[1,69],M=[1,70],I=[1,71],F=[1,80],$=[16,25,32,45,46,54,60,61,62,63,64,65,66,71,73],R=[16,25,30,32,45,46,50,54,60,61,62,63,64,65,66,71,73,88,89,90,91],Z=[5,8,9,10,11,16,19,23,25],P=[54,88,89,90,91],j=[54,65,66,88,89,90,91],Y=[54,60,61,62,63,64,88,89,90,91],z=[16,25,32],U=[1,107],W={trace:function(){},yy:{},symbols_:{error:2,start:3,mermaidDoc:4,statments:5,direction:6,directive:7,direction_tb:8,direction_bt:9,direction_rl:10,direction_lr:11,graphConfig:12,openDirective:13,typeDirective:14,closeDirective:15,NEWLINE:16,":":17,argDirective:18,open_directive:19,type_directive:20,arg_directive:21,close_directive:22,CLASS_DIAGRAM:23,statements:24,EOF:25,statement:26,className:27,alphaNumToken:28,classLiteralName:29,GENERICTYPE:30,relationStatement:31,LABEL:32,classStatement:33,methodStatement:34,annotationStatement:35,clickStatement:36,cssClassStatement:37,noteStatement:38,acc_title:39,acc_title_value:40,acc_descr:41,acc_descr_value:42,acc_descr_multiline_value:43,CLASS:44,STYLE_SEPARATOR:45,STRUCT_START:46,members:47,STRUCT_STOP:48,ANNOTATION_START:49,ANNOTATION_END:50,MEMBER:51,SEPARATOR:52,relation:53,STR:54,NOTE_FOR:55,noteText:56,NOTE:57,relationType:58,lineType:59,AGGREGATION:60,EXTENSION:61,COMPOSITION:62,DEPENDENCY:63,LOLLIPOP:64,LINE:65,DOTTED_LINE:66,CALLBACK:67,LINK:68,LINK_TARGET:69,CLICK:70,CALLBACK_NAME:71,CALLBACK_ARGS:72,HREF:73,CSSCLASS:74,commentToken:75,textToken:76,graphCodeTokens:77,textNoTagsToken:78,TAGSTART:79,TAGEND:80,"==":81,"--":82,PCT:83,DEFAULT:84,SPACE:85,MINUS:86,keywords:87,UNICODE_TEXT:88,NUM:89,ALPHA:90,BQUOTE_STR:91,$accept:0,$end:1},terminals_:{2:"error",5:"statments",8:"direction_tb",9:"direction_bt",10:"direction_rl",11:"direction_lr",16:"NEWLINE",17:":",19:"open_directive",20:"type_directive",21:"arg_directive",22:"close_directive",23:"CLASS_DIAGRAM",25:"EOF",30:"GENERICTYPE",32:"LABEL",39:"acc_title",40:"acc_title_value",41:"acc_descr",42:"acc_descr_value",43:"acc_descr_multiline_value",44:"CLASS",45:"STYLE_SEPARATOR",46:"STRUCT_START",48:"STRUCT_STOP",49:"ANNOTATION_START",50:"ANNOTATION_END",51:"MEMBER",52:"SEPARATOR",54:"STR",55:"NOTE_FOR",57:"NOTE",60:"AGGREGATION",61:"EXTENSION",62:"COMPOSITION",63:"DEPENDENCY",64:"LOLLIPOP",65:"LINE",66:"DOTTED_LINE",67:"CALLBACK",68:"LINK",69:"LINK_TARGET",70:"CLICK",71:"CALLBACK_NAME",72:"CALLBACK_ARGS",73:"HREF",74:"CSSCLASS",77:"graphCodeTokens",79:"TAGSTART",80:"TAGEND",81:"==",82:"--",83:"PCT",84:"DEFAULT",85:"SPACE",86:"MINUS",87:"keywords",88:"UNICODE_TEXT",89:"NUM",90:"ALPHA",91:"BQUOTE_STR"},productions_:[0,[3,1],[3,1],[3,1],[3,2],[6,1],[6,1],[6,1],[6,1],[4,1],[7,4],[7,6],[13,1],[14,1],[18,1],[15,1],[12,4],[24,1],[24,2],[24,3],[27,1],[27,1],[27,2],[27,2],[27,2],[26,1],[26,2],[26,1],[26,1],[26,1],[26,1],[26,1],[26,1],[26,1],[26,1],[26,2],[26,2],[26,1],[33,2],[33,4],[33,5],[33,7],[35,4],[47,1],[47,2],[34,1],[34,2],[34,1],[34,1],[31,3],[31,4],[31,4],[31,5],[38,3],[38,2],[53,3],[53,2],[53,2],[53,1],[58,1],[58,1],[58,1],[58,1],[58,1],[59,1],[59,1],[36,3],[36,4],[36,3],[36,4],[36,4],[36,5],[36,3],[36,4],[36,4],[36,5],[36,3],[36,4],[36,4],[36,5],[37,3],[75,1],[75,1],[76,1],[76,1],[76,1],[76,1],[76,1],[76,1],[76,1],[78,1],[78,1],[78,1],[78,1],[28,1],[28,1],[28,1],[29,1],[56,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 5:i.setDirection("TB");break;case 6:i.setDirection("BT");break;case 7:i.setDirection("RL");break;case 8:i.setDirection("LR");break;case 12:i.parseDirective("%%{","open_directive");break;case 13:i.parseDirective(a[o],"type_directive");break;case 14:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 15:i.parseDirective("}%%","close_directive","class");break;case 20:case 21:this.$=a[o];break;case 22:this.$=a[o-1]+a[o];break;case 23:case 24:this.$=a[o-1]+"~"+a[o];break;case 25:i.addRelation(a[o]);break;case 26:a[o-1].title=i.cleanupLabel(a[o]),i.addRelation(a[o-1]);break;case 35:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 36:case 37:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 38:i.addClass(a[o]);break;case 39:i.addClass(a[o-2]),i.setCssClass(a[o-2],a[o]);break;case 40:i.addClass(a[o-3]),i.addMembers(a[o-3],a[o-1]);break;case 41:i.addClass(a[o-5]),i.setCssClass(a[o-5],a[o-3]),i.addMembers(a[o-5],a[o-1]);break;case 42:i.addAnnotation(a[o],a[o-2]);break;case 43:this.$=[a[o]];break;case 44:a[o].push(a[o-1]),this.$=a[o];break;case 45:case 47:case 48:break;case 46:i.addMember(a[o-1],i.cleanupLabel(a[o]));break;case 49:this.$={id1:a[o-2],id2:a[o],relation:a[o-1],relationTitle1:"none",relationTitle2:"none"};break;case 50:this.$={id1:a[o-3],id2:a[o],relation:a[o-1],relationTitle1:a[o-2],relationTitle2:"none"};break;case 51:this.$={id1:a[o-3],id2:a[o],relation:a[o-2],relationTitle1:"none",relationTitle2:a[o-1]};break;case 52:this.$={id1:a[o-4],id2:a[o],relation:a[o-2],relationTitle1:a[o-3],relationTitle2:a[o-1]};break;case 53:i.addNote(a[o],a[o-1]);break;case 54:i.addNote(a[o]);break;case 55:this.$={type1:a[o-2],type2:a[o],lineType:a[o-1]};break;case 56:this.$={type1:"none",type2:a[o],lineType:a[o-1]};break;case 57:this.$={type1:a[o-1],type2:"none",lineType:a[o]};break;case 58:this.$={type1:"none",type2:"none",lineType:a[o]};break;case 59:this.$=i.relationType.AGGREGATION;break;case 60:this.$=i.relationType.EXTENSION;break;case 61:this.$=i.relationType.COMPOSITION;break;case 62:this.$=i.relationType.DEPENDENCY;break;case 63:this.$=i.relationType.LOLLIPOP;break;case 64:this.$=i.lineType.LINE;break;case 65:this.$=i.lineType.DOTTED_LINE;break;case 66:case 72:this.$=a[o-2],i.setClickEvent(a[o-1],a[o]);break;case 67:case 73:this.$=a[o-3],i.setClickEvent(a[o-2],a[o-1]),i.setTooltip(a[o-2],a[o]);break;case 68:case 76:this.$=a[o-2],i.setLink(a[o-1],a[o]);break;case 69:case 77:this.$=a[o-3],i.setLink(a[o-2],a[o-1],a[o]);break;case 70:case 78:this.$=a[o-3],i.setLink(a[o-2],a[o-1]),i.setTooltip(a[o-2],a[o]);break;case 71:case 79:this.$=a[o-4],i.setLink(a[o-3],a[o-2],a[o]),i.setTooltip(a[o-3],a[o-1]);break;case 74:this.$=a[o-3],i.setClickEvent(a[o-2],a[o-1],a[o]);break;case 75:this.$=a[o-4],i.setClickEvent(a[o-3],a[o-2],a[o-1]),i.setTooltip(a[o-3],a[o]);break;case 80:i.setCssClass(a[o-1],a[o])}},table:[{3:1,4:2,5:n,6:4,7:5,8:i,9:r,10:a,11:s,12:6,13:11,19:o,23:c},{1:[3]},{1:[2,1]},{1:[2,2]},{1:[2,3]},{3:14,4:2,5:n,6:4,7:5,8:i,9:r,10:a,11:s,12:6,13:11,19:o,23:c},{1:[2,9]},e(l,[2,5]),e(l,[2,6]),e(l,[2,7]),e(l,[2,8]),{14:15,20:[1,16]},{16:[1,17]},{20:[2,12]},{1:[2,4]},{15:18,17:[1,19],22:h},e([17,22],[2,13]),{6:31,7:30,8:i,9:r,10:a,11:s,13:11,19:o,24:21,26:22,27:35,28:46,29:47,31:23,33:24,34:25,35:26,36:27,37:28,38:29,39:u,41:d,43:p,44:f,49:g,51:y,52:m,55:b,57:_,67:x,68:v,70:k,74:w,88:C,89:T,90:E,91:S},{16:[1,52]},{18:53,21:[1,54]},{16:[2,15]},{25:[1,55]},{16:[1,56],25:[2,17]},e(A,[2,25],{32:[1,57]}),e(A,[2,27]),e(A,[2,28]),e(A,[2,29]),e(A,[2,30]),e(A,[2,31]),e(A,[2,32]),e(A,[2,33]),e(A,[2,34]),{40:[1,58]},{42:[1,59]},e(A,[2,37]),e(A,[2,45],{53:60,58:63,59:64,32:[1,62],54:[1,61],60:L,61:B,62:N,63:D,64:O,65:M,66:I}),{27:72,28:46,29:47,88:C,89:T,90:E,91:S},e(A,[2,47]),e(A,[2,48]),{28:73,88:C,89:T,90:E},{27:74,28:46,29:47,88:C,89:T,90:E,91:S},{27:75,28:46,29:47,88:C,89:T,90:E,91:S},{27:76,28:46,29:47,88:C,89:T,90:E,91:S},{54:[1,77]},{27:78,28:46,29:47,88:C,89:T,90:E,91:S},{54:F,56:79},e($,[2,20],{28:46,29:47,27:81,30:[1,82],88:C,89:T,90:E,91:S}),e($,[2,21],{30:[1,83]}),e(R,[2,94]),e(R,[2,95]),e(R,[2,96]),e([16,25,30,32,45,46,54,60,61,62,63,64,65,66,71,73],[2,97]),e(Z,[2,10]),{15:84,22:h},{22:[2,14]},{1:[2,16]},{6:31,7:30,8:i,9:r,10:a,11:s,13:11,19:o,24:85,25:[2,18],26:22,27:35,28:46,29:47,31:23,33:24,34:25,35:26,36:27,37:28,38:29,39:u,41:d,43:p,44:f,49:g,51:y,52:m,55:b,57:_,67:x,68:v,70:k,74:w,88:C,89:T,90:E,91:S},e(A,[2,26]),e(A,[2,35]),e(A,[2,36]),{27:86,28:46,29:47,54:[1,87],88:C,89:T,90:E,91:S},{53:88,58:63,59:64,60:L,61:B,62:N,63:D,64:O,65:M,66:I},e(A,[2,46]),{59:89,65:M,66:I},e(P,[2,58],{58:90,60:L,61:B,62:N,63:D,64:O}),e(j,[2,59]),e(j,[2,60]),e(j,[2,61]),e(j,[2,62]),e(j,[2,63]),e(Y,[2,64]),e(Y,[2,65]),e(A,[2,38],{45:[1,91],46:[1,92]}),{50:[1,93]},{54:[1,94]},{54:[1,95]},{71:[1,96],73:[1,97]},{28:98,88:C,89:T,90:E},{54:F,56:99},e(A,[2,54]),e(A,[2,98]),e($,[2,22]),e($,[2,23]),e($,[2,24]),{16:[1,100]},{25:[2,19]},e(z,[2,49]),{27:101,28:46,29:47,88:C,89:T,90:E,91:S},{27:102,28:46,29:47,54:[1,103],88:C,89:T,90:E,91:S},e(P,[2,57],{58:104,60:L,61:B,62:N,63:D,64:O}),e(P,[2,56]),{28:105,88:C,89:T,90:E},{47:106,51:U},{27:108,28:46,29:47,88:C,89:T,90:E,91:S},e(A,[2,66],{54:[1,109]}),e(A,[2,68],{54:[1,111],69:[1,110]}),e(A,[2,72],{54:[1,112],72:[1,113]}),e(A,[2,76],{54:[1,115],69:[1,114]}),e(A,[2,80]),e(A,[2,53]),e(Z,[2,11]),e(z,[2,51]),e(z,[2,50]),{27:116,28:46,29:47,88:C,89:T,90:E,91:S},e(P,[2,55]),e(A,[2,39],{46:[1,117]}),{48:[1,118]},{47:119,48:[2,43],51:U},e(A,[2,42]),e(A,[2,67]),e(A,[2,69]),e(A,[2,70],{69:[1,120]}),e(A,[2,73]),e(A,[2,74],{54:[1,121]}),e(A,[2,77]),e(A,[2,78],{69:[1,122]}),e(z,[2,52]),{47:123,51:U},e(A,[2,40]),{48:[2,44]},e(A,[2,71]),e(A,[2,75]),e(A,[2,79]),{48:[1,124]},e(A,[2,41])],defaultActions:{2:[2,1],3:[2,2],4:[2,3],6:[2,9],13:[2,12],14:[2,4],20:[2,15],54:[2,14],55:[2,16],85:[2,19],119:[2,44]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=a.slice.call(arguments,1),u=Object.create(this.lexer),d={yy:{}};for(var p in this.yy)Object.prototype.hasOwnProperty.call(this.yy,p)&&(d.yy[p]=this.yy[p]);u.setInput(t,d.yy),d.yy.lexer=u,d.yy.parser=this,void 0===u.yylloc&&(u.yylloc={});var f=u.yylloc;a.push(f);var g=u.options&&u.options.ranges;function y(){var t;return"number"!=typeof(t=i.pop()||u.lex()||1)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof d.yy.parseError?this.parseError=d.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var m,b,_,x,v,k,w,C,T={};;){if(b=n[n.length-1],this.defaultActions[b]?_=this.defaultActions[b]:(null==m&&(m=y()),_=s[b]&&s[b][m]),void 0===_||!_.length||!_[0]){var E="";for(v in C=[],s[b])this.terminals_[v]&&v>2&&C.push("'"+this.terminals_[v]+"'");E=u.showPosition?"Parse error on line "+(c+1)+":\n"+u.showPosition()+"\nExpecting "+C.join(", ")+", got '"+(this.terminals_[m]||m)+"'":"Parse error on line "+(c+1)+": Unexpected "+(1==m?"end of input":"'"+(this.terminals_[m]||m)+"'"),this.parseError(E,{text:u.match,token:this.terminals_[m]||m,line:u.yylineno,loc:f,expected:C})}if(_[0]instanceof Array&&_.length>1)throw new Error("Parse Error: multiple actions possible at state: "+b+", token: "+m);switch(_[0]){case 1:n.push(m),r.push(u.yytext),a.push(u.yylloc),n.push(_[1]),m=null,l=u.yyleng,o=u.yytext,c=u.yylineno,f=u.yylloc;break;case 2:if(k=this.productions_[_[1]][1],T.$=r[r.length-k],T._$={first_line:a[a.length-(k||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(k||1)].first_column,last_column:a[a.length-1].last_column},g&&(T._$.range=[a[a.length-(k||1)].range[0],a[a.length-1].range[1]]),void 0!==(x=this.performAction.apply(T,[o,l,c,d.yy,_[1],r,a].concat(h))))return x;k&&(n=n.slice(0,-1*k*2),r=r.slice(0,-1*k),a=a.slice(0,-1*k)),n.push(this.productions_[_[1]][0]),r.push(T.$),a.push(T._$),w=s[n[n.length-2]][n[n.length-1]],n.push(w);break;case 3:return!0}}return!0}},q=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),19;case 1:return 8;case 2:return 9;case 3:return 10;case 4:return 11;case 5:return this.begin("type_directive"),20;case 6:return this.popState(),this.begin("arg_directive"),17;case 7:return this.popState(),this.popState(),22;case 8:return 21;case 9:case 10:case 19:case 27:break;case 11:return this.begin("acc_title"),39;case 12:return this.popState(),"acc_title_value";case 13:return this.begin("acc_descr"),41;case 14:return this.popState(),"acc_descr_value";case 15:this.begin("acc_descr_multiline");break;case 16:case 39:case 42:case 45:case 48:case 51:case 54:this.popState();break;case 17:return"acc_descr_multiline_value";case 18:return 16;case 20:case 21:return 23;case 22:return this.begin("struct"),46;case 23:return"EDGE_STATE";case 24:return"EOF_IN_STRUCT";case 25:return"OPEN_IN_STRUCT";case 26:return this.popState(),48;case 28:return"MEMBER";case 29:return 44;case 30:return 74;case 31:return 67;case 32:return 68;case 33:return 70;case 34:return 55;case 35:return 57;case 36:return 49;case 37:return 50;case 38:this.begin("generic");break;case 40:return"GENERICTYPE";case 41:this.begin("string");break;case 43:return"STR";case 44:this.begin("bqstring");break;case 46:return"BQUOTE_STR";case 47:this.begin("href");break;case 49:return 73;case 50:this.begin("callback_name");break;case 52:this.popState(),this.begin("callback_args");break;case 53:return 71;case 55:return 72;case 56:case 57:case 58:case 59:return 69;case 60:case 61:return 61;case 62:case 63:return 63;case 64:return 62;case 65:return 60;case 66:return 64;case 67:return 65;case 68:return 66;case 69:return 32;case 70:return 45;case 71:return 86;case 72:return"DOT";case 73:return"PLUS";case 74:return 83;case 75:case 76:return"EQUALS";case 77:return 90;case 78:return"PUNCTUATION";case 79:return 89;case 80:return 88;case 81:return 85;case 82:return 25}},rules:[/^(?:%%\{)/,/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:((?:(?!\}%%)[^:.])*))/,/^(?::)/,/^(?:\}%%)/,/^(?:((?:(?!\}%%).|\n)*))/,/^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/,/^(?:%%[^\n]*(\r?\n)*)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:classDiagram-v2\b)/,/^(?:classDiagram\b)/,/^(?:[{])/,/^(?:\[\*\])/,/^(?:$)/,/^(?:[{])/,/^(?:[}])/,/^(?:[\n])/,/^(?:[^{}\n]*)/,/^(?:class\b)/,/^(?:cssClass\b)/,/^(?:callback\b)/,/^(?:link\b)/,/^(?:click\b)/,/^(?:note for\b)/,/^(?:note\b)/,/^(?:<<)/,/^(?:>>)/,/^(?:[~])/,/^(?:[~])/,/^(?:[^~]*)/,/^(?:["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:[`])/,/^(?:[`])/,/^(?:[^`]+)/,/^(?:href[\s]+["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:call[\s]+)/,/^(?:\([\s]*\))/,/^(?:\()/,/^(?:[^(]*)/,/^(?:\))/,/^(?:[^)]*)/,/^(?:_self\b)/,/^(?:_blank\b)/,/^(?:_parent\b)/,/^(?:_top\b)/,/^(?:\s*<\|)/,/^(?:\s*\|>)/,/^(?:\s*>)/,/^(?:\s*<)/,/^(?:\s*\*)/,/^(?:\s*o\b)/,/^(?:\s*\(\))/,/^(?:--)/,/^(?:\.\.)/,/^(?::{1}[^:\n;]+)/,/^(?::{3})/,/^(?:-)/,/^(?:\.)/,/^(?:\+)/,/^(?:%)/,/^(?:=)/,/^(?:=)/,/^(?:\w+)/,/^(?:[!"#$%&'*+,-.`?\\/])/,/^(?:[0-9]+)/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\s)/,/^(?:$)/],conditions:{acc_descr_multiline:{rules:[16,17],inclusive:!1},acc_descr:{rules:[14],inclusive:!1},acc_title:{rules:[12],inclusive:!1},arg_directive:{rules:[7,8],inclusive:!1},type_directive:{rules:[6,7],inclusive:!1},open_directive:{rules:[5],inclusive:!1},callback_args:{rules:[54,55],inclusive:!1},callback_name:{rules:[51,52,53],inclusive:!1},href:{rules:[48,49],inclusive:!1},struct:{rules:[23,24,25,26,27,28],inclusive:!1},generic:{rules:[39,40],inclusive:!1},bqstring:{rules:[45,46],inclusive:!1},string:{rules:[42,43],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,9,10,11,13,15,18,19,20,21,22,23,29,30,31,32,33,34,35,36,37,38,41,44,47,50,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82],inclusive:!0}}},t);function H(){this.yy={}}return W.lexer=q,H.prototype=W,W.Parser=H,new H}();Fa.parser=Fa;const $a=Fa,Ra=(t,e)=>{var n;return"dagre-wrapper"!==(null==(n=null==e?void 0:e.class)?void 0:n.defaultRenderer)&&null!==t.match(/^\s*classDiagram/)},Za=(t,e)=>{var n;return null!==t.match(/^\s*classDiagram/)&&"dagre-wrapper"===(null==(n=null==e?void 0:e.class)?void 0:n.defaultRenderer)||null!==t.match(/^\s*classDiagram-v2/)},Pa="classid-";let ja=[],Ya={},za=[],Ua=0,Wa=[];const qa=t=>jt.sanitizeText(t,ui()),Ha=function(t){let e="",n=t;if(t.indexOf("~")>0){let i=t.split("~");n=i[0],e=jt.sanitizeText(i[1],ui())}return{className:n,type:e}},Va=function(t){let e=Ha(t);void 0===Ya[e.className]&&(Ya[e.className]={id:e.className,type:e.type,cssClasses:[],methods:[],members:[],annotations:[],domId:Pa+e.className+"-"+Ua},Ua++)},Ga=function(t){const e=Object.keys(Ya);for(const n of e)if(Ya[n].id===t)return Ya[n].domId},Xa=function(t,e){const n=Ha(t).className,i=Ya[n];if("string"==typeof e){const t=e.trim();t.startsWith("<<")&&t.endsWith(">>")?i.annotations.push(qa(t.substring(2,t.length-2))):t.indexOf(")")>0?i.methods.push(qa(t)):t&&i.members.push(qa(t))}},Qa=function(t,e){t.split(",").forEach((function(t){let n=t;t[0].match(/\d/)&&(n=Pa+n),void 0!==Ya[n]&&Ya[n].cssClasses.push(e)}))},Ka=function(t,e,n){const i=ui();let r=t,a=Ga(r);if("loose"===i.securityLevel&&void 0!==e&&void 0!==Ya[r]){let t=[];if("string"==typeof n){t=n.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let e=0;e<t.length;e++){let n=t[e].trim();'"'===n.charAt(0)&&'"'===n.charAt(n.length-1)&&(n=n.substr(1,n.length-2)),t[e]=n}}0===t.length&&t.push(a),Wa.push((function(){const n=document.querySelector(`[id="${a}"]`);null!==n&&n.addEventListener("click",(function(){ei.runFunc(e,...t)}),!1)}))}},Ja=function(t){let e=(0,o.Ys)(".mermaidTooltip");null===(e._groups||e)[0][0]&&(e=(0,o.Ys)("body").append("div").attr("class","mermaidTooltip").style("opacity",0));(0,o.Ys)(t).select("svg").selectAll("g.node").on("mouseover",(function(){const t=(0,o.Ys)(this);if(null===t.attr("title"))return;const n=this.getBoundingClientRect();e.transition().duration(200).style("opacity",".9"),e.text(t.attr("title")).style("left",window.scrollX+n.left+(n.right-n.left)/2+"px").style("top",window.scrollY+n.top-14+document.body.scrollTop+"px"),e.html(e.html().replace(/<br\/>/g,"<br/>")),t.classed("hover",!0)})).on("mouseout",(function(){e.transition().duration(500).style("opacity",0);(0,o.Ys)(this).classed("hover",!1)}))};Wa.push(Ja);let ts="TB";const es={parseDirective:function(t,e,n){xp.parseDirective(this,t,e,n)},setAccTitle:Zi,getAccTitle:Pi,getAccDescription:Yi,setAccDescription:ji,getConfig:()=>ui().class,addClass:Va,bindFunctions:function(t){Wa.forEach((function(e){e(t)}))},clear:function(){ja=[],Ya={},za=[],Wa=[],Wa.push(Ja),Ri()},getClass:function(t){return Ya[t]},getClasses:function(){return Ya},getNotes:function(){return za},addAnnotation:function(t,e){const n=Ha(t).className;Ya[n].annotations.push(e)},addNote:function(t,e){const n={id:`note${za.length}`,class:e,text:t};za.push(n)},getRelations:function(){return ja},addRelation:function(t){Bt.debug("Adding relation: "+JSON.stringify(t)),Va(t.id1),Va(t.id2),t.id1=Ha(t.id1).className,t.id2=Ha(t.id2).className,t.relationTitle1=jt.sanitizeText(t.relationTitle1.trim(),ui()),t.relationTitle2=jt.sanitizeText(t.relationTitle2.trim(),ui()),ja.push(t)},getDirection:()=>ts,setDirection:t=>{ts=t},addMember:Xa,addMembers:function(t,e){Array.isArray(e)&&(e.reverse(),e.forEach((e=>Xa(t,e))))},cleanupLabel:function(t){return":"===t.substring(0,1)?jt.sanitizeText(t.substr(1).trim(),ui()):qa(t.trim())},lineType:{LINE:0,DOTTED_LINE:1},relationType:{AGGREGATION:0,EXTENSION:1,COMPOSITION:2,DEPENDENCY:3,LOLLIPOP:4},setClickEvent:function(t,e,n){t.split(",").forEach((function(t){Ka(t,e,n),Ya[t].haveCallback=!0})),Qa(t,"clickable")},setCssClass:Qa,setLink:function(t,e,n){const i=ui();t.split(",").forEach((function(t){let r=t;t[0].match(/\d/)&&(r=Pa+r),void 0!==Ya[r]&&(Ya[r].link=ei.formatUrl(e,i),"sandbox"===i.securityLevel?Ya[r].linkTarget="_top":Ya[r].linkTarget="string"==typeof n?qa(n):"_blank")})),Qa(t,"clickable")},getTooltip:function(t){return Ya[t].tooltip},setTooltip:function(t,e){const n=ui();t.split(",").forEach((function(t){void 0!==e&&(Ya[t].tooltip=jt.sanitizeText(e,n))}))},lookUpDomId:Ga,setDiagramTitle:zi,getDiagramTitle:Ui};let ns=0;const is=function(t){let e=t.match(/^([#+~-])?(\w+)(~\w+~|\[])?\s+(\w+) *([$*])?$/),n=t.match(/^([#+|~-])?(\w+) *\( *(.*)\) *([$*])? *(\w*[[\]|~]*\s*\w*~?)$/);return e&&!n?rs(e):n?as(n):ss(t)},rs=function(t){let e="",n="";try{let i=t[1]?t[1].trim():"",r=t[2]?t[2].trim():"",a=t[3]?Pt(t[3].trim()):"",s=t[4]?t[4].trim():"",o=t[5]?t[5].trim():"";n=i+r+a+" "+s,e=cs(o)}catch(i){n=t}return{displayText:n,cssStyle:e}},as=function(t){let e="",n="";try{let i=t[1]?t[1].trim():"",r=t[2]?t[2].trim():"",a=t[3]?Pt(t[3].trim()):"",s=t[4]?t[4].trim():"";n=i+r+"("+a+")"+(t[5]?" : "+Pt(t[5]).trim():""),e=cs(s)}catch(i){n=t}return{displayText:n,cssStyle:e}},ss=function(t){let e="",n="",i="",r=t.indexOf("("),a=t.indexOf(")");if(r>1&&a>r&&a<=t.length){let s="",o="",c=t.substring(0,1);c.match(/\w/)?o=t.substring(0,r).trim():(c.match(/[#+~-]/)&&(s=c),o=t.substring(1,r).trim());const l=t.substring(r+1,a);t.substring(a+1,1),n=cs(t.substring(a+1,a+2)),e=s+o+"("+Pt(l.trim())+")",a<t.length&&(i=t.substring(a+2).trim(),""!==i&&(i=" : "+Pt(i),e+=i))}else e=Pt(t);return{displayText:e,cssStyle:n}},os=function(t,e,n,i){let r=is(e);const a=t.append("tspan").attr("x",i.padding).text(r.displayText);""!==r.cssStyle&&a.attr("style",r.cssStyle),n||a.attr("dy",i.textHeight)},cs=function(t){switch(t){case"*":return"font-style:italic;";case"$":return"text-decoration:underline;";default:return""}},ls=function(t,e,n,i){Bt.debug("Rendering class ",e,n);const r=e.id,a={id:r,label:e.id,width:0,height:0},s=t.append("g").attr("id",i.db.lookUpDomId(r)).attr("class","classGroup");let o;o=e.link?s.append("svg:a").attr("xlink:href",e.link).attr("target",e.linkTarget).append("text").attr("y",n.textHeight+n.padding).attr("x",0):s.append("text").attr("y",n.textHeight+n.padding).attr("x",0);let c=!0;e.annotations.forEach((function(t){const e=o.append("tspan").text("\xab"+t+"\xbb");c||e.attr("dy",n.textHeight),c=!1}));let l=e.id;void 0!==e.type&&""!==e.type&&(l+="<"+e.type+">");const h=o.append("tspan").text(l).attr("class","title");c||h.attr("dy",n.textHeight);const u=o.node().getBBox().height,d=s.append("line").attr("x1",0).attr("y1",n.padding+u+n.dividerMargin/2).attr("y2",n.padding+u+n.dividerMargin/2),p=s.append("text").attr("x",n.padding).attr("y",u+n.dividerMargin+n.textHeight).attr("fill","white").attr("class","classText");c=!0,e.members.forEach((function(t){os(p,t,c,n),c=!1}));const f=p.node().getBBox(),g=s.append("line").attr("x1",0).attr("y1",n.padding+u+n.dividerMargin+f.height).attr("y2",n.padding+u+n.dividerMargin+f.height),y=s.append("text").attr("x",n.padding).attr("y",u+2*n.dividerMargin+f.height+n.textHeight).attr("fill","white").attr("class","classText");c=!0,e.methods.forEach((function(t){os(y,t,c,n),c=!1}));const m=s.node().getBBox();var b=" ";e.cssClasses.length>0&&(b+=e.cssClasses.join(" "));const _=s.insert("rect",":first-child").attr("x",0).attr("y",0).attr("width",m.width+2*n.padding).attr("height",m.height+n.padding+.5*n.dividerMargin).attr("class",b).node().getBBox().width;return o.node().childNodes.forEach((function(t){t.setAttribute("x",(_-t.getBBox().width)/2)})),e.tooltip&&o.insert("title").text(e.tooltip),d.attr("x2",_),g.attr("x2",_),a.width=_,a.height=m.height+n.padding+.5*n.dividerMargin,a},hs=function(t,e,n,i,r){const a=function(t){switch(t){case r.db.relationType.AGGREGATION:return"aggregation";case r.db.relationType.EXTENSION:return"extension";case r.db.relationType.COMPOSITION:return"composition";case r.db.relationType.DEPENDENCY:return"dependency";case r.db.relationType.LOLLIPOP:return"lollipop"}};e.points=e.points.filter((t=>!Number.isNaN(t.y)));const s=e.points,c=(0,o.jvg)().x((function(t){return t.x})).y((function(t){return t.y})).curve(o.$0Z),l=t.append("path").attr("d",c(s)).attr("id","edge"+ns).attr("class","relation");let h,u,d="";i.arrowMarkerAbsolute&&(d=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,d=d.replace(/\(/g,"\\("),d=d.replace(/\)/g,"\\)")),1==n.relation.lineType&&l.attr("class","relation dashed-line"),10==n.relation.lineType&&l.attr("class","relation dotted-line"),"none"!==n.relation.type1&&l.attr("marker-start","url("+d+"#"+a(n.relation.type1)+"Start)"),"none"!==n.relation.type2&&l.attr("marker-end","url("+d+"#"+a(n.relation.type2)+"End)");const p=e.points.length;let f,g,y,m,b=ei.calcLabelPosition(e.points);if(h=b.x,u=b.y,p%2!=0&&p>1){let t=ei.calcCardinalityPosition("none"!==n.relation.type1,e.points,e.points[0]),i=ei.calcCardinalityPosition("none"!==n.relation.type2,e.points,e.points[p-1]);Bt.debug("cardinality_1_point "+JSON.stringify(t)),Bt.debug("cardinality_2_point "+JSON.stringify(i)),f=t.x,g=t.y,y=i.x,m=i.y}if(void 0!==n.title){const e=t.append("g").attr("class","classLabel"),r=e.append("text").attr("class","label").attr("x",h).attr("y",u).attr("fill","red").attr("text-anchor","middle").text(n.title);window.label=r;const a=r.node().getBBox();e.insert("rect",":first-child").attr("class","box").attr("x",a.x-i.padding/2).attr("y",a.y-i.padding/2).attr("width",a.width+i.padding).attr("height",a.height+i.padding)}if(Bt.info("Rendering relation "+JSON.stringify(n)),void 0!==n.relationTitle1&&"none"!==n.relationTitle1){t.append("g").attr("class","cardinality").append("text").attr("class","type1").attr("x",f).attr("y",g).attr("fill","black").attr("font-size","6").text(n.relationTitle1)}if(void 0!==n.relationTitle2&&"none"!==n.relationTitle2){t.append("g").attr("class","cardinality").append("text").attr("class","type2").attr("x",y).attr("y",m).attr("fill","black").attr("font-size","6").text(n.relationTitle2)}ns++},us=function(t,e,n,i){Bt.debug("Rendering note ",e,n);const r=e.id,a={id:r,text:e.text,width:0,height:0},s=t.append("g").attr("id",r).attr("class","classGroup");let o=s.append("text").attr("y",n.textHeight+n.padding).attr("x",0);const c=JSON.parse(`"${e.text}"`).split("\n");c.forEach((function(t){Bt.debug(`Adding line: ${t}`),o.append("tspan").text(t).attr("class","title").attr("dy",n.textHeight)}));const l=s.node().getBBox(),h=s.insert("rect",":first-child").attr("x",0).attr("y",0).attr("width",l.width+2*n.padding).attr("height",l.height+c.length*n.textHeight+n.padding+.5*n.dividerMargin).node().getBBox().width;return o.node().childNodes.forEach((function(t){t.setAttribute("x",(h-t.getBBox().width)/2)})),a.width=h,a.height=l.height+c.length*n.textHeight+n.padding+.5*n.dividerMargin,a};let ds={};const ps=function(t){const e=Object.entries(ds).find((e=>e[1].label===t));if(e)return e[0]},fs={draw:function(t,e,n,i){const r=ui().class;ds={},Bt.info("Rendering diagram "+t);const a=ui().securityLevel;let s;"sandbox"===a&&(s=(0,o.Ys)("#i"+e));const c="sandbox"===a?(0,o.Ys)(s.nodes()[0].contentDocument.body):(0,o.Ys)("body"),l=c.select(`[id='${e}']`);var h;(h=l).append("defs").append("marker").attr("id","extensionStart").attr("class","extension").attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 1,7 L18,13 V 1 Z"),h.append("defs").append("marker").attr("id","extensionEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 1,1 V 13 L18,7 Z"),h.append("defs").append("marker").attr("id","compositionStart").attr("class","extension").attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),h.append("defs").append("marker").attr("id","compositionEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),h.append("defs").append("marker").attr("id","aggregationStart").attr("class","extension").attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),h.append("defs").append("marker").attr("id","aggregationEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),h.append("defs").append("marker").attr("id","dependencyStart").attr("class","extension").attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 5,7 L9,13 L1,7 L9,1 Z"),h.append("defs").append("marker").attr("id","dependencyEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z");const u=new lt.k({multigraph:!0});u.setGraph({isMultiGraph:!0}),u.setDefaultEdgeLabel((function(){return{}}));const d=i.db.getClasses(),p=Object.keys(d);for(const o of p){const t=d[o],e=ls(l,t,r,i);ds[e.id]=e,u.setNode(e.id,e),Bt.info("Org height: "+e.height)}i.db.getRelations().forEach((function(t){Bt.info("tjoho"+ps(t.id1)+ps(t.id2)+JSON.stringify(t)),u.setEdge(ps(t.id1),ps(t.id2),{relation:t},t.title||"DEFAULT")}));i.db.getNotes().forEach((function(t){Bt.debug(`Adding note: ${JSON.stringify(t)}`);const e=us(l,t,r,i);ds[e.id]=e,u.setNode(e.id,e),t.class&&t.class in d&&u.setEdge(t.id,ps(t.class),{relation:{id1:t.id,id2:t.class,relation:{type1:"none",type2:"none",lineType:10}}},"DEFAULT")})),(0,ct.bK)(u),u.nodes().forEach((function(t){void 0!==t&&void 0!==u.node(t)&&(Bt.debug("Node "+t+": "+JSON.stringify(u.node(t))),c.select("#"+(i.db.lookUpDomId(t)||t)).attr("transform","translate("+(u.node(t).x-u.node(t).width/2)+","+(u.node(t).y-u.node(t).height/2)+" )"))})),u.edges().forEach((function(t){void 0!==t&&void 0!==u.edge(t)&&(Bt.debug("Edge "+t.v+" -> "+t.w+": "+JSON.stringify(u.edge(t))),hs(l,u.edge(t),u.edge(t).relation,r,i))}));const f=l.node().getBBox(),g=f.width+40,y=f.height+40;bi(l,y,g,r.useMaxWidth);const m=`${f.x-20} ${f.y-20} ${g} ${y}`;Bt.debug(`viewBox ${m}`),l.attr("viewBox",m)}},gs={extension:(t,e,n)=>{Bt.trace("Making markers for ",n),t.append("defs").append("marker").attr("id",e+"-extensionStart").attr("class","marker extension "+e).attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 1,7 L18,13 V 1 Z"),t.append("defs").append("marker").attr("id",e+"-extensionEnd").attr("class","marker extension "+e).attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 1,1 V 13 L18,7 Z")},composition:(t,e)=>{t.append("defs").append("marker").attr("id",e+"-compositionStart").attr("class","marker composition "+e).attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",e+"-compositionEnd").attr("class","marker composition "+e).attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},aggregation:(t,e)=>{t.append("defs").append("marker").attr("id",e+"-aggregationStart").attr("class","marker aggregation "+e).attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",e+"-aggregationEnd").attr("class","marker aggregation "+e).attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},dependency:(t,e)=>{t.append("defs").append("marker").attr("id",e+"-dependencyStart").attr("class","marker dependency "+e).attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 5,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",e+"-dependencyEnd").attr("class","marker dependency "+e).attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},lollipop:(t,e)=>{t.append("defs").append("marker").attr("id",e+"-lollipopStart").attr("class","marker lollipop "+e).attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","white").attr("cx",6).attr("cy",7).attr("r",6)},point:(t,e)=>{t.append("marker").attr("id",e+"-pointEnd").attr("class","marker "+e).attr("viewBox","0 0 12 20").attr("refX",10).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",e+"-pointStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",0).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 5 L 10 10 L 10 0 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},circle:(t,e)=>{t.append("marker").attr("id",e+"-circleEnd").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",11).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",e+"-circleStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",-1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},cross:(t,e)=>{t.append("marker").attr("id",e+"-crossEnd").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",12).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0"),t.append("marker").attr("id",e+"-crossStart").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",-1).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0")},barb:(t,e)=>{t.append("defs").append("marker").attr("id",e+"-barbEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",14).attr("markerUnits","strokeWidth").attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")}},ys=(t,e,n,i)=>{e.forEach((e=>{gs[e](t,n,i)}))};const ms=(t,e,n,i)=>{let r=t||"";if("object"==typeof r&&(r=r[0]),Zt(ui().flowchart.htmlLabels)){r=r.replace(/\\n|\n/g,"<br />"),Bt.info("vertexText"+r);let t=function(t){const e=(0,o.Ys)(document.createElementNS("http://www.w3.org/2000/svg","foreignObject")),n=e.append("xhtml:div"),i=t.label,r=t.isNode?"nodeLabel":"edgeLabel";var a,s;return n.html('<span class="'+r+'" '+(t.labelStyle?'style="'+t.labelStyle+'"':"")+">"+i+"</span>"),a=n,(s=t.labelStyle)&&a.attr("style",s),n.style("display","inline-block"),n.style("white-space","nowrap"),n.attr("xmlns","http://www.w3.org/1999/xhtml"),e.node()}({isNode:i,label:up(r).replace(/fa[blrs]?:fa-[\w-]+/g,(t=>`<i class='${t.replace(":"," ")}'></i>`)),labelStyle:e.replace("fill:","color:")});return t}{const t=document.createElementNS("http://www.w3.org/2000/svg","text");t.setAttribute("style",e.replace("color:","fill:"));let i=[];i="string"==typeof r?r.split(/\\n|\n|<br\s*\/?>/gi):Array.isArray(r)?r:[];for(const e of i){const i=document.createElementNS("http://www.w3.org/2000/svg","tspan");i.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),i.setAttribute("dy","1em"),i.setAttribute("x","0"),n?i.setAttribute("class","title-row"):i.setAttribute("class","row"),i.textContent=e.trim(),t.appendChild(i)}return t}},bs=(t,e,n,i)=>{let r;r=n||"node default";const a=t.insert("g").attr("class",r).attr("id",e.domId||e.id),s=a.insert("g").attr("class","label").attr("style",e.labelStyle);let c;c=void 0===e.labelText?"":"string"==typeof e.labelText?e.labelText:e.labelText[0];const l=s.node().appendChild(ms(It(up(c),ui()),e.labelStyle,!1,i));let h=l.getBBox();if(Zt(ui().flowchart.htmlLabels)){const t=l.children[0],e=(0,o.Ys)(l);h=t.getBoundingClientRect(),e.attr("width",h.width),e.attr("height",h.height)}const u=e.padding/2;return s.attr("transform","translate("+-h.width/2+", "+-h.height/2+")"),{shapeSvg:a,bbox:h,halfPadding:u,label:s}},_s=(t,e)=>{const n=e.node().getBBox();t.width=n.width,t.height=n.height};function xs(t,e,n,i){return t.insert("polygon",":first-child").attr("points",i.map((function(t){return t.x+","+t.y})).join(" ")).attr("class","label-container").attr("transform","translate("+-e/2+","+n/2+")")}let vs={},ks={},ws={};const Cs=(t,e)=>(Bt.trace("In isDecendant",e," ",t," = ",ks[e].includes(t)),!!ks[e].includes(t)),Ts=(t,e,n,i)=>{Bt.warn("Copying children of ",t,"root",i,"data",e.node(t),i);const r=e.children(t)||[];t!==i&&r.push(t),Bt.warn("Copying (nodes) clusterId",t,"nodes",r),r.forEach((r=>{if(e.children(r).length>0)Ts(r,e,n,i);else{const a=e.node(r);Bt.info("cp ",r," to ",i," with parent ",t),n.setNode(r,a),i!==e.parent(r)&&(Bt.warn("Setting parent",r,e.parent(r)),n.setParent(r,e.parent(r))),t!==i&&r!==t?(Bt.debug("Setting parent",r,t),n.setParent(r,t)):(Bt.info("In copy ",t,"root",i,"data",e.node(t),i),Bt.debug("Not Setting parent for node=",r,"cluster!==rootId",t!==i,"node!==clusterId",r!==t));const s=e.edges(r);Bt.debug("Copying Edges",s),s.forEach((r=>{Bt.info("Edge",r);const a=e.edge(r.v,r.w,r.name);Bt.info("Edge data",a,i);try{((t,e)=>(Bt.info("Decendants of ",e," is ",ks[e]),Bt.info("Edge is ",t),t.v!==e&&t.w!==e&&(ks[e]?ks[e].includes(t.v)||Cs(t.v,e)||Cs(t.w,e)||ks[e].includes(t.w):(Bt.debug("Tilt, ",e,",not in decendants"),!1))))(r,i)?(Bt.info("Copying as ",r.v,r.w,a,r.name),n.setEdge(r.v,r.w,a,r.name),Bt.info("newGraph edges ",n.edges(),n.edge(n.edges()[0]))):Bt.info("Skipping copy of edge ",r.v,"--\x3e",r.w," rootId: ",i," clusterId:",t)}catch(s){Bt.error(s)}}))}Bt.debug("Removing node",r),e.removeNode(r)}))},Es=(t,e)=>{const n=e.children(t);let i=[...n];for(const r of n)ws[r]=t,i=[...i,...Es(r,e)];return i},Ss=(t,e)=>{Bt.trace("Searching",t);const n=e.children(t);if(Bt.trace("Searching children of id ",t,n),n.length<1)return Bt.trace("This is a valid node",t),t;for(const i of n){const n=Ss(i,e);if(n)return Bt.trace("Found replacement for",t," => ",n),n}},As=t=>vs[t]&&vs[t].externalConnections&&vs[t]?vs[t].id:t,Ls=(t,e)=>{if(Bt.warn("extractor - ",e,ht.c(t),t.children("D")),e>10)return void Bt.error("Bailing out");let n=t.nodes(),i=!1;for(const r of n){const e=t.children(r);i=i||e.length>0}if(i){Bt.debug("Nodes = ",n,e);for(const i of n)if(Bt.debug("Extracting node",i,vs,vs[i]&&!vs[i].externalConnections,!t.parent(i),t.node(i),t.children("D")," Depth ",e),vs[i])if(!vs[i].externalConnections&&t.children(i)&&t.children(i).length>0){Bt.warn("Cluster without external connections, without a parent and with children",i,e);let n="TB"===t.graph().rankdir?"LR":"TB";vs[i]&&vs[i].clusterData&&vs[i].clusterData.dir&&(n=vs[i].clusterData.dir,Bt.warn("Fixing dir",vs[i].clusterData.dir,n));const r=new lt.k({multigraph:!0,compound:!0}).setGraph({rankdir:n,nodesep:50,ranksep:50,marginx:8,marginy:8}).setDefaultEdgeLabel((function(){return{}}));Bt.warn("Old graph before copy",ht.c(t)),Ts(i,t,r,i),t.setNode(i,{clusterNode:!0,id:i,clusterData:vs[i].clusterData,labelText:vs[i].labelText,graph:r}),Bt.warn("New graph after copy node: (",i,")",ht.c(r)),Bt.debug("Old graph after copy",ht.c(t))}else Bt.warn("Cluster ** ",i," **not meeting the criteria !externalConnections:",!vs[i].externalConnections," no parent: ",!t.parent(i)," children ",t.children(i)&&t.children(i).length>0,t.children("D"),e),Bt.debug(vs);else Bt.debug("Not a cluster",i,e);n=t.nodes(),Bt.warn("New list of nodes",n);for(const i of n){const n=t.node(i);Bt.warn(" Now next level",i,n),n.clusterNode&&Ls(n.graph,e+1)}}else Bt.debug("Done, no node has children",t.nodes())},Bs=(t,e)=>{if(0===e.length)return[];let n=Object.assign(e);return e.forEach((e=>{const i=t.children(e),r=Bs(t,i);n=[...n,...r]})),n};function Ns(t,e,n,i){var r=t.x,a=t.y,s=r-i.x,o=a-i.y,c=Math.sqrt(e*e*o*o+n*n*s*s),l=Math.abs(e*n*s/c);i.x<r&&(l=-l);var h=Math.abs(e*n*o/c);return i.y<a&&(h=-h),{x:r+l,y:a+h}}function Ds(t,e,n,i){var r,a,s,o,c,l,h,u,d,p,f,g,y;if(r=e.y-t.y,s=t.x-e.x,c=e.x*t.y-t.x*e.y,d=r*n.x+s*n.y+c,p=r*i.x+s*i.y+c,!(0!==d&&0!==p&&Os(d,p)||(a=i.y-n.y,o=n.x-i.x,l=i.x*n.y-n.x*i.y,h=a*t.x+o*t.y+l,u=a*e.x+o*e.y+l,0!==h&&0!==u&&Os(h,u)||0==(f=r*o-a*s))))return g=Math.abs(f/2),{x:(y=s*l-o*c)<0?(y-g)/f:(y+g)/f,y:(y=a*c-r*l)<0?(y-g)/f:(y+g)/f}}function Os(t,e){return t*e>0}const Ms=(t,e)=>{var n,i,r=t.x,a=t.y,s=e.x-r,o=e.y-a,c=t.width/2,l=t.height/2;return Math.abs(o)*c>Math.abs(s)*l?(o<0&&(l=-l),n=0===o?0:l*s/o,i=l):(s<0&&(c=-c),n=c,i=0===s?0:c*o/s),{x:r+n,y:a+i}},Is={node:function(t,e){return t.intersect(e)},circle:function(t,e,n){return Ns(t,e,e,n)},ellipse:Ns,polygon:function(t,e,n){var i=t.x,r=t.y,a=[],s=Number.POSITIVE_INFINITY,o=Number.POSITIVE_INFINITY;"function"==typeof e.forEach?e.forEach((function(t){s=Math.min(s,t.x),o=Math.min(o,t.y)})):(s=Math.min(s,e.x),o=Math.min(o,e.y));for(var c=i-t.width/2-s,l=r-t.height/2-o,h=0;h<e.length;h++){var u=e[h],d=e[h<e.length-1?h+1:0],p=Ds(t,n,{x:c+u.x,y:l+u.y},{x:c+d.x,y:l+d.y});p&&a.push(p)}return a.length?(a.length>1&&a.sort((function(t,e){var i=t.x-n.x,r=t.y-n.y,a=Math.sqrt(i*i+r*r),s=e.x-n.x,o=e.y-n.y,c=Math.sqrt(s*s+o*o);return a<c?-1:a===c?0:1})),a[0]):t},rect:Ms},Fs=(t,e)=>{const{shapeSvg:n,bbox:i,halfPadding:r}=bs(t,e,"node "+e.classes,!0);Bt.info("Classes = ",e.classes);const a=n.insert("rect",":first-child");return a.attr("rx",e.rx).attr("ry",e.ry).attr("x",-i.width/2-r).attr("y",-i.height/2-r).attr("width",i.width+e.padding).attr("height",i.height+e.padding),_s(e,a),e.intersect=function(t){return Is.rect(e,t)},n},$s=(t,e)=>{const{shapeSvg:n,bbox:i}=bs(t,e,void 0,!0),r=i.width+e.padding+(i.height+e.padding),a=[{x:r/2,y:0},{x:r,y:-r/2},{x:r/2,y:-r},{x:0,y:-r/2}];Bt.info("Question main (Circle)");const s=xs(n,r,r,a);return s.attr("style",e.style),_s(e,s),e.intersect=function(t){return Bt.warn("Intersect called"),Is.polygon(e,a,t)},n};function Rs(t,e,n,i){const r=[],a=t=>{r.push(t,0)},s=t=>{r.push(0,t)};e.includes("t")?(Bt.debug("add top border"),a(n)):s(n),e.includes("r")?(Bt.debug("add right border"),a(i)):s(i),e.includes("b")?(Bt.debug("add bottom border"),a(n)):s(n),e.includes("l")?(Bt.debug("add left border"),a(i)):s(i),t.attr("stroke-dasharray",r.join(" "))}const Zs=(t,e,n)=>{const i=t.insert("g").attr("class","node default").attr("id",e.domId||e.id);let r=70,a=10;"LR"===n&&(r=10,a=70);const s=i.append("rect").attr("x",-1*r/2).attr("y",-1*a/2).attr("width",r).attr("height",a).attr("class","fork-join");return _s(e,s),e.height=e.height+e.padding/2,e.width=e.width+e.padding/2,e.intersect=function(t){return Is.rect(e,t)},i},Ps={rhombus:$s,question:$s,rect:(t,e)=>{const{shapeSvg:n,bbox:i,halfPadding:r}=bs(t,e,"node "+e.classes,!0);Bt.trace("Classes = ",e.classes);const a=n.insert("rect",":first-child"),s=i.width+e.padding,o=i.height+e.padding;if(a.attr("class","basic label-container").attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("x",-i.width/2-r).attr("y",-i.height/2-r).attr("width",s).attr("height",o),e.props){const t=new Set(Object.keys(e.props));e.props.borders&&(Rs(a,e.props.borders,s,o),t.delete("borders")),t.forEach((t=>{Bt.warn(`Unknown node property ${t}`)}))}return _s(e,a),e.intersect=function(t){return Is.rect(e,t)},n},labelRect:(t,e)=>{const{shapeSvg:n}=bs(t,e,"label",!0);Bt.trace("Classes = ",e.classes);const i=n.insert("rect",":first-child");if(i.attr("width",0).attr("height",0),n.attr("class","label edgeLabel"),e.props){const t=new Set(Object.keys(e.props));e.props.borders&&(Rs(i,e.props.borders,0,0),t.delete("borders")),t.forEach((t=>{Bt.warn(`Unknown node property ${t}`)}))}return _s(e,i),e.intersect=function(t){return Is.rect(e,t)},n},rectWithTitle:(t,e)=>{let n;n=e.classes?"node "+e.classes:"node default";const i=t.insert("g").attr("class",n).attr("id",e.domId||e.id),r=i.insert("rect",":first-child"),a=i.insert("line"),s=i.insert("g").attr("class","label"),c=e.labelText.flat?e.labelText.flat():e.labelText;let l="";l="object"==typeof c?c[0]:c,Bt.info("Label text abc79",l,c,"object"==typeof c);const h=s.node().appendChild(ms(l,e.labelStyle,!0,!0));let u={width:0,height:0};if(Zt(ui().flowchart.htmlLabels)){const t=h.children[0],e=(0,o.Ys)(h);u=t.getBoundingClientRect(),e.attr("width",u.width),e.attr("height",u.height)}Bt.info("Text 2",c);const d=c.slice(1,c.length);let p=h.getBBox();const f=s.node().appendChild(ms(d.join?d.join("<br/>"):d,e.labelStyle,!0,!0));if(Zt(ui().flowchart.htmlLabels)){const t=f.children[0],e=(0,o.Ys)(f);u=t.getBoundingClientRect(),e.attr("width",u.width),e.attr("height",u.height)}const g=e.padding/2;return(0,o.Ys)(f).attr("transform","translate( "+(u.width>p.width?0:(p.width-u.width)/2)+", "+(p.height+g+5)+")"),(0,o.Ys)(h).attr("transform","translate( "+(u.width<p.width?0:-(p.width-u.width)/2)+", 0)"),u=s.node().getBBox(),s.attr("transform","translate("+-u.width/2+", "+(-u.height/2-g+3)+")"),r.attr("class","outer title-state").attr("x",-u.width/2-g).attr("y",-u.height/2-g).attr("width",u.width+e.padding).attr("height",u.height+e.padding),a.attr("class","divider").attr("x1",-u.width/2-g).attr("x2",u.width/2+g).attr("y1",-u.height/2-g+p.height+g).attr("y2",-u.height/2-g+p.height+g),_s(e,r),e.intersect=function(t){return Is.rect(e,t)},i},choice:(t,e)=>{const n=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),i=[{x:0,y:14},{x:14,y:0},{x:0,y:-14},{x:-14,y:0}];return n.insert("polygon",":first-child").attr("points",i.map((function(t){return t.x+","+t.y})).join(" ")).attr("class","state-start").attr("r",7).attr("width",28).attr("height",28),e.width=28,e.height=28,e.intersect=function(t){return Is.circle(e,14,t)},n},circle:(t,e)=>{const{shapeSvg:n,bbox:i,halfPadding:r}=bs(t,e,void 0,!0),a=n.insert("circle",":first-child");return a.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("r",i.width/2+r).attr("width",i.width+e.padding).attr("height",i.height+e.padding),Bt.info("Circle main"),_s(e,a),e.intersect=function(t){return Bt.info("Circle intersect",e,i.width/2+r,t),Is.circle(e,i.width/2+r,t)},n},doublecircle:(t,e)=>{const{shapeSvg:n,bbox:i,halfPadding:r}=bs(t,e,void 0,!0),a=n.insert("g",":first-child"),s=a.insert("circle"),o=a.insert("circle");return s.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("r",i.width/2+r+5).attr("width",i.width+e.padding+10).attr("height",i.height+e.padding+10),o.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("r",i.width/2+r).attr("width",i.width+e.padding).attr("height",i.height+e.padding),Bt.info("DoubleCircle main"),_s(e,s),e.intersect=function(t){return Bt.info("DoubleCircle intersect",e,i.width/2+r+5,t),Is.circle(e,i.width/2+r+5,t)},n},stadium:(t,e)=>{const{shapeSvg:n,bbox:i}=bs(t,e,void 0,!0),r=i.height+e.padding,a=i.width+r/4+e.padding,s=n.insert("rect",":first-child").attr("style",e.style).attr("rx",r/2).attr("ry",r/2).attr("x",-a/2).attr("y",-r/2).attr("width",a).attr("height",r);return _s(e,s),e.intersect=function(t){return Is.rect(e,t)},n},hexagon:(t,e)=>{const{shapeSvg:n,bbox:i}=bs(t,e,void 0,!0),r=i.height+e.padding,a=r/4,s=i.width+2*a+e.padding,o=[{x:a,y:0},{x:s-a,y:0},{x:s,y:-r/2},{x:s-a,y:-r},{x:a,y:-r},{x:0,y:-r/2}],c=xs(n,s,r,o);return c.attr("style",e.style),_s(e,c),e.intersect=function(t){return Is.polygon(e,o,t)},n},rect_left_inv_arrow:(t,e)=>{const{shapeSvg:n,bbox:i}=bs(t,e,void 0,!0),r=i.width+e.padding,a=i.height+e.padding,s=[{x:-a/2,y:0},{x:r,y:0},{x:r,y:-a},{x:-a/2,y:-a},{x:0,y:-a/2}];return xs(n,r,a,s).attr("style",e.style),e.width=r+a,e.height=a,e.intersect=function(t){return Is.polygon(e,s,t)},n},lean_right:(t,e)=>{const{shapeSvg:n,bbox:i}=bs(t,e,void 0,!0),r=i.width+e.padding,a=i.height+e.padding,s=[{x:-2*a/6,y:0},{x:r-a/6,y:0},{x:r+2*a/6,y:-a},{x:a/6,y:-a}],o=xs(n,r,a,s);return o.attr("style",e.style),_s(e,o),e.intersect=function(t){return Is.polygon(e,s,t)},n},lean_left:(t,e)=>{const{shapeSvg:n,bbox:i}=bs(t,e,void 0,!0),r=i.width+e.padding,a=i.height+e.padding,s=[{x:2*a/6,y:0},{x:r+a/6,y:0},{x:r-2*a/6,y:-a},{x:-a/6,y:-a}],o=xs(n,r,a,s);return o.attr("style",e.style),_s(e,o),e.intersect=function(t){return Is.polygon(e,s,t)},n},trapezoid:(t,e)=>{const{shapeSvg:n,bbox:i}=bs(t,e,void 0,!0),r=i.width+e.padding,a=i.height+e.padding,s=[{x:-2*a/6,y:0},{x:r+2*a/6,y:0},{x:r-a/6,y:-a},{x:a/6,y:-a}],o=xs(n,r,a,s);return o.attr("style",e.style),_s(e,o),e.intersect=function(t){return Is.polygon(e,s,t)},n},inv_trapezoid:(t,e)=>{const{shapeSvg:n,bbox:i}=bs(t,e,void 0,!0),r=i.width+e.padding,a=i.height+e.padding,s=[{x:a/6,y:0},{x:r-a/6,y:0},{x:r+2*a/6,y:-a},{x:-2*a/6,y:-a}],o=xs(n,r,a,s);return o.attr("style",e.style),_s(e,o),e.intersect=function(t){return Is.polygon(e,s,t)},n},rect_right_inv_arrow:(t,e)=>{const{shapeSvg:n,bbox:i}=bs(t,e,void 0,!0),r=i.width+e.padding,a=i.height+e.padding,s=[{x:0,y:0},{x:r+a/2,y:0},{x:r,y:-a/2},{x:r+a/2,y:-a},{x:0,y:-a}],o=xs(n,r,a,s);return o.attr("style",e.style),_s(e,o),e.intersect=function(t){return Is.polygon(e,s,t)},n},cylinder:(t,e)=>{const{shapeSvg:n,bbox:i}=bs(t,e,void 0,!0),r=i.width+e.padding,a=r/2,s=a/(2.5+r/50),o=i.height+s+e.padding,c="M 0,"+s+" a "+a+","+s+" 0,0,0 "+r+" 0 a "+a+","+s+" 0,0,0 "+-r+" 0 l 0,"+o+" a "+a+","+s+" 0,0,0 "+r+" 0 l 0,"+-o,l=n.attr("label-offset-y",s).insert("path",":first-child").attr("style",e.style).attr("d",c).attr("transform","translate("+-r/2+","+-(o/2+s)+")");return _s(e,l),e.intersect=function(t){const n=Is.rect(e,t),i=n.x-e.x;if(0!=a&&(Math.abs(i)<e.width/2||Math.abs(i)==e.width/2&&Math.abs(n.y-e.y)>e.height/2-s)){let r=s*s*(1-i*i/(a*a));0!=r&&(r=Math.sqrt(r)),r=s-r,t.y-e.y>0&&(r=-r),n.y+=r}return n},n},start:(t,e)=>{const n=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),i=n.insert("circle",":first-child");return i.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14),_s(e,i),e.intersect=function(t){return Is.circle(e,7,t)},n},end:(t,e)=>{const n=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),i=n.insert("circle",":first-child"),r=n.insert("circle",":first-child");return r.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14),i.attr("class","state-end").attr("r",5).attr("width",10).attr("height",10),_s(e,r),e.intersect=function(t){return Is.circle(e,7,t)},n},note:Fs,subroutine:(t,e)=>{const{shapeSvg:n,bbox:i}=bs(t,e,void 0,!0),r=i.width+e.padding,a=i.height+e.padding,s=[{x:0,y:0},{x:r,y:0},{x:r,y:-a},{x:0,y:-a},{x:0,y:0},{x:-8,y:0},{x:r+8,y:0},{x:r+8,y:-a},{x:-8,y:-a},{x:-8,y:0}],o=xs(n,r,a,s);return o.attr("style",e.style),_s(e,o),e.intersect=function(t){return Is.polygon(e,s,t)},n},fork:Zs,join:Zs,class_box:(t,e)=>{const n=e.padding/2;let i;i=e.classes?"node "+e.classes:"node default";const r=t.insert("g").attr("class",i).attr("id",e.domId||e.id),a=r.insert("rect",":first-child"),s=r.insert("line"),c=r.insert("line");let l=0,h=4;const u=r.insert("g").attr("class","label");let d=0;const p=e.classData.annotations&&e.classData.annotations[0],f=e.classData.annotations[0]?"\xab"+e.classData.annotations[0]+"\xbb":"",g=u.node().appendChild(ms(f,e.labelStyle,!0,!0));let y=g.getBBox();if(Zt(ui().flowchart.htmlLabels)){const t=g.children[0],e=(0,o.Ys)(g);y=t.getBoundingClientRect(),e.attr("width",y.width),e.attr("height",y.height)}e.classData.annotations[0]&&(h+=y.height+4,l+=y.width);let m=e.classData.id;void 0!==e.classData.type&&""!==e.classData.type&&(ui().flowchart.htmlLabels?m+="<"+e.classData.type+">":m+="<"+e.classData.type+">");const b=u.node().appendChild(ms(m,e.labelStyle,!0,!0));(0,o.Ys)(b).attr("class","classTitle");let _=b.getBBox();if(Zt(ui().flowchart.htmlLabels)){const t=b.children[0],e=(0,o.Ys)(b);_=t.getBoundingClientRect(),e.attr("width",_.width),e.attr("height",_.height)}h+=_.height+4,_.width>l&&(l=_.width);const x=[];e.classData.members.forEach((t=>{const n=is(t);let i=n.displayText;ui().flowchart.htmlLabels&&(i=i.replace(/</g,"<").replace(/>/g,">"));const r=u.node().appendChild(ms(i,n.cssStyle?n.cssStyle:e.labelStyle,!0,!0));let a=r.getBBox();if(Zt(ui().flowchart.htmlLabels)){const t=r.children[0],e=(0,o.Ys)(r);a=t.getBoundingClientRect(),e.attr("width",a.width),e.attr("height",a.height)}a.width>l&&(l=a.width),h+=a.height+4,x.push(r)})),h+=8;const v=[];if(e.classData.methods.forEach((t=>{const n=is(t);let i=n.displayText;ui().flowchart.htmlLabels&&(i=i.replace(/</g,"<").replace(/>/g,">"));const r=u.node().appendChild(ms(i,n.cssStyle?n.cssStyle:e.labelStyle,!0,!0));let a=r.getBBox();if(Zt(ui().flowchart.htmlLabels)){const t=r.children[0],e=(0,o.Ys)(r);a=t.getBoundingClientRect(),e.attr("width",a.width),e.attr("height",a.height)}a.width>l&&(l=a.width),h+=a.height+4,v.push(r)})),h+=8,p){let t=(l-y.width)/2;(0,o.Ys)(g).attr("transform","translate( "+(-1*l/2+t)+", "+-1*h/2+")"),d=y.height+4}let k=(l-_.width)/2;return(0,o.Ys)(b).attr("transform","translate( "+(-1*l/2+k)+", "+(-1*h/2+d)+")"),d+=_.height+4,s.attr("class","divider").attr("x1",-l/2-n).attr("x2",l/2+n).attr("y1",-h/2-n+8+d).attr("y2",-h/2-n+8+d),d+=8,x.forEach((t=>{(0,o.Ys)(t).attr("transform","translate( "+-l/2+", "+(-1*h/2+d+4)+")"),d+=_.height+4})),d+=8,c.attr("class","divider").attr("x1",-l/2-n).attr("x2",l/2+n).attr("y1",-h/2-n+8+d).attr("y2",-h/2-n+8+d),d+=8,v.forEach((t=>{(0,o.Ys)(t).attr("transform","translate( "+-l/2+", "+(-1*h/2+d)+")"),d+=_.height+4})),a.attr("class","outer title-state").attr("x",-l/2-n).attr("y",-h/2-n).attr("width",l+e.padding).attr("height",h+e.padding),_s(e,a),e.intersect=function(t){return Is.rect(e,t)},r}};let js={};const Ys=(t,e,n)=>{let i,r;if(e.link){let a;"sandbox"===ui().securityLevel?a="_top":e.linkTarget&&(a=e.linkTarget||"_blank"),i=t.insert("svg:a").attr("xlink:href",e.link).attr("target",a),r=Ps[e.shape](i,e,n)}else r=Ps[e.shape](t,e,n),i=r;return e.tooltip&&r.attr("title",e.tooltip),e.class&&r.attr("class","node default "+e.class),js[e.id]=i,e.haveCallback&&js[e.id].attr("class",js[e.id].attr("class")+" clickable"),i},zs=t=>{const e=js[t.id];Bt.trace("Transforming node",t.diff,t,"translate("+(t.x-t.width/2-5)+", "+t.width/2+")");const n=t.diff||0;return t.clusterNode?e.attr("transform","translate("+(t.x+n-t.width/2)+", "+(t.y-t.height/2-8)+")"):e.attr("transform","translate("+t.x+", "+t.y+")"),n},Us={rect:(t,e)=>{Bt.trace("Creating subgraph rect for ",e.id,e);const n=t.insert("g").attr("class","cluster"+(e.class?" "+e.class:"")).attr("id",e.id),i=n.insert("rect",":first-child"),r=n.insert("g").attr("class","cluster-label"),a=r.node().appendChild(ms(e.labelText,e.labelStyle,void 0,!0));let s=a.getBBox();if(Zt(ui().flowchart.htmlLabels)){const t=a.children[0],e=(0,o.Ys)(a);s=t.getBoundingClientRect(),e.attr("width",s.width),e.attr("height",s.height)}const c=0*e.padding,l=c/2,h=e.width<=s.width+c?s.width+c:e.width;e.width<=s.width+c?e.diff=(s.width-e.width)/2-e.padding/2:e.diff=-e.padding/2,Bt.trace("Data ",e,JSON.stringify(e)),i.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("x",e.x-h/2).attr("y",e.y-e.height/2-l).attr("width",h).attr("height",e.height+c),r.attr("transform","translate("+(e.x-s.width/2)+", "+(e.y-e.height/2)+")");const u=i.node().getBBox();return e.width=u.width,e.height=u.height,e.intersect=function(t){return Ms(e,t)},n},roundedWithTitle:(t,e)=>{const n=t.insert("g").attr("class",e.classes).attr("id",e.id),i=n.insert("rect",":first-child"),r=n.insert("g").attr("class","cluster-label"),a=n.append("rect"),s=r.node().appendChild(ms(e.labelText,e.labelStyle,void 0,!0));let c=s.getBBox();if(Zt(ui().flowchart.htmlLabels)){const t=s.children[0],e=(0,o.Ys)(s);c=t.getBoundingClientRect(),e.attr("width",c.width),e.attr("height",c.height)}c=s.getBBox();const l=0*e.padding,h=l/2,u=e.width<=c.width+e.padding?c.width+e.padding:e.width;e.width<=c.width+e.padding?e.diff=(c.width+0*e.padding-e.width)/2:e.diff=-e.padding/2,i.attr("class","outer").attr("x",e.x-u/2-h).attr("y",e.y-e.height/2-h).attr("width",u+l).attr("height",e.height+l),a.attr("class","inner").attr("x",e.x-u/2-h).attr("y",e.y-e.height/2-h+c.height-1).attr("width",u+l).attr("height",e.height+l-c.height-3),r.attr("transform","translate("+(e.x-c.width/2)+", "+(e.y-e.height/2-e.padding/3+(Zt(ui().flowchart.htmlLabels)?5:3))+")");const d=i.node().getBBox();return e.height=d.height,e.intersect=function(t){return Ms(e,t)},n},noteGroup:(t,e)=>{const n=t.insert("g").attr("class","note-cluster").attr("id",e.id),i=n.insert("rect",":first-child"),r=0*e.padding,a=r/2;i.attr("rx",e.rx).attr("ry",e.ry).attr("x",e.x-e.width/2-a).attr("y",e.y-e.height/2-a).attr("width",e.width+r).attr("height",e.height+r).attr("fill","none");const s=i.node().getBBox();return e.width=s.width,e.height=s.height,e.intersect=function(t){return Ms(e,t)},n},divider:(t,e)=>{const n=t.insert("g").attr("class",e.classes).attr("id",e.id),i=n.insert("rect",":first-child"),r=0*e.padding,a=r/2;i.attr("class","divider").attr("x",e.x-e.width/2-a).attr("y",e.y-e.height/2).attr("width",e.width+r).attr("height",e.height+r);const s=i.node().getBBox();return e.width=s.width,e.height=s.height,e.diff=-e.padding/2,e.intersect=function(t){return Ms(e,t)},n}};let Ws={};let qs={},Hs={};const Vs=(t,e)=>{const n=ms(e.label,e.labelStyle),i=t.insert("g").attr("class","edgeLabel"),r=i.insert("g").attr("class","label");r.node().appendChild(n);let a,s=n.getBBox();if(Zt(ui().flowchart.htmlLabels)){const t=n.children[0],e=(0,o.Ys)(n);s=t.getBoundingClientRect(),e.attr("width",s.width),e.attr("height",s.height)}if(r.attr("transform","translate("+-s.width/2+", "+-s.height/2+")"),qs[e.id]=i,e.width=s.width,e.height=s.height,e.startLabelLeft){const n=ms(e.startLabelLeft,e.labelStyle),i=t.insert("g").attr("class","edgeTerminals"),r=i.insert("g").attr("class","inner");a=r.node().appendChild(n);const s=n.getBBox();r.attr("transform","translate("+-s.width/2+", "+-s.height/2+")"),Hs[e.id]||(Hs[e.id]={}),Hs[e.id].startLeft=i,Gs(a,e.startLabelLeft)}if(e.startLabelRight){const n=ms(e.startLabelRight,e.labelStyle),i=t.insert("g").attr("class","edgeTerminals"),r=i.insert("g").attr("class","inner");a=i.node().appendChild(n),r.node().appendChild(n);const s=n.getBBox();r.attr("transform","translate("+-s.width/2+", "+-s.height/2+")"),Hs[e.id]||(Hs[e.id]={}),Hs[e.id].startRight=i,Gs(a,e.startLabelRight)}if(e.endLabelLeft){const n=ms(e.endLabelLeft,e.labelStyle),i=t.insert("g").attr("class","edgeTerminals"),r=i.insert("g").attr("class","inner");a=r.node().appendChild(n);const s=n.getBBox();r.attr("transform","translate("+-s.width/2+", "+-s.height/2+")"),i.node().appendChild(n),Hs[e.id]||(Hs[e.id]={}),Hs[e.id].endLeft=i,Gs(a,e.endLabelLeft)}if(e.endLabelRight){const n=ms(e.endLabelRight,e.labelStyle),i=t.insert("g").attr("class","edgeTerminals"),r=i.insert("g").attr("class","inner");a=r.node().appendChild(n);const s=n.getBBox();r.attr("transform","translate("+-s.width/2+", "+-s.height/2+")"),i.node().appendChild(n),Hs[e.id]||(Hs[e.id]={}),Hs[e.id].endRight=i,Gs(a,e.endLabelRight)}return n};function Gs(t,e){ui().flowchart.htmlLabels&&t&&(t.style.width=9*e.length+"px",t.style.height="12px")}const Xs=(t,e)=>{Bt.warn("abc88 cutPathAtIntersect",t,e);let n=[],i=t[0],r=!1;return t.forEach((t=>{if(Bt.info("abc88 checking point",t,e),((t,e)=>{const n=t.x,i=t.y,r=Math.abs(e.x-n),a=Math.abs(e.y-i),s=t.width/2,o=t.height/2;return r>=s||a>=o})(e,t)||r)Bt.warn("abc88 outside",t,i),i=t,r||n.push(t);else{const a=((t,e,n)=>{Bt.warn(`intersection calc abc89:\n outsidePoint: ${JSON.stringify(e)}\n insidePoint : ${JSON.stringify(n)}\n node : x:${t.x} y:${t.y} w:${t.width} h:${t.height}`);const i=t.x,r=t.y,a=Math.abs(i-n.x),s=t.width/2;let o=n.x<e.x?s-a:s+a;const c=t.height/2,l=Math.abs(e.y-n.y),h=Math.abs(e.x-n.x);if(Math.abs(r-e.y)*s>Math.abs(i-e.x)*c){let t=n.y<e.y?e.y-c-r:r-c-e.y;o=h*t/l;const i={x:n.x<e.x?n.x+o:n.x-h+o,y:n.y<e.y?n.y+l-t:n.y-l+t};return 0===o&&(i.x=e.x,i.y=e.y),0===h&&(i.x=e.x),0===l&&(i.y=e.y),Bt.warn(`abc89 topp/bott calc, Q ${l}, q ${t}, R ${h}, r ${o}`,i),i}{o=n.x<e.x?e.x-s-i:i-s-e.x;let t=l*o/h,r=n.x<e.x?n.x+h-o:n.x-h+o,a=n.y<e.y?n.y+t:n.y-t;return Bt.warn(`sides calc abc89, Q ${l}, q ${t}, R ${h}, r ${o}`,{_x:r,_y:a}),0===o&&(r=e.x,a=e.y),0===h&&(r=e.x),0===l&&(a=e.y),{x:r,y:a}}})(e,i,t);Bt.warn("abc88 inside",t,i,a),Bt.warn("abc88 intersection",a);let s=!1;n.forEach((t=>{s=s||t.x===a.x&&t.y===a.y})),n.some((t=>t.x===a.x&&t.y===a.y))?Bt.warn("abc88 no intersect",a,n):n.push(a),r=!0}})),Bt.warn("abc88 returning points",n),n},Qs=(t,e,n,i)=>{Bt.info("Graph in recursive render: XXX",ht.c(e),i);const r=e.graph().rankdir;Bt.trace("Dir in recursive render - dir:",r);const a=t.insert("g").attr("class","root");e.nodes()?Bt.info("Recursive render XXX",e.nodes()):Bt.info("No nodes found for",e),e.edges().length>0&&Bt.trace("Recursive edges",e.edge(e.edges()[0]));const s=a.insert("g").attr("class","clusters"),c=a.insert("g").attr("class","edgePaths"),l=a.insert("g").attr("class","edgeLabels"),h=a.insert("g").attr("class","nodes");e.nodes().forEach((function(t){const a=e.node(t);if(void 0!==i){const n=JSON.parse(JSON.stringify(i.clusterData));Bt.info("Setting data for cluster XXX (",t,") ",n,i),e.setNode(i.id,n),e.parent(t)||(Bt.trace("Setting parent",t,i.id),e.setParent(t,i.id,n))}if(Bt.info("(Insert) Node XXX"+t+": "+JSON.stringify(e.node(t))),a&&a.clusterNode){Bt.info("Cluster identified",t,a.width,e.node(t));const i=Qs(h,a.graph,n,e.node(t)),r=i.elem;_s(a,r),a.diff=i.diff||0,Bt.info("Node bounds (abc123)",t,a,a.width,a.x,a.y),((t,e)=>{js[e.id]=t})(r,a),Bt.warn("Recursive render complete ",r,a)}else e.children(t).length>0?(Bt.info("Cluster - the non recursive path XXX",t,a.id,a,e),Bt.info(Ss(a.id,e)),vs[a.id]={id:Ss(a.id,e),node:a}):(Bt.info("Node - the non recursive path",t,a.id,a),Ys(h,e.node(t),r))})),e.edges().forEach((function(t){const n=e.edge(t.v,t.w,t.name);Bt.info("Edge "+t.v+" -> "+t.w+": "+JSON.stringify(t)),Bt.info("Edge "+t.v+" -> "+t.w+": ",t," ",JSON.stringify(e.edge(t))),Bt.info("Fix",vs,"ids:",t.v,t.w,"Translateing: ",vs[t.v],vs[t.w]),Vs(l,n)})),e.edges().forEach((function(t){Bt.info("Edge "+t.v+" -> "+t.w+": "+JSON.stringify(t))})),Bt.info("#############################################"),Bt.info("### Layout ###"),Bt.info("#############################################"),Bt.info(e),(0,ct.bK)(e),Bt.info("Graph after layout:",ht.c(e));let u=0;return(t=>Bs(t,t.children()))(e).forEach((function(t){const n=e.node(t);Bt.info("Position "+t+": "+JSON.stringify(e.node(t))),Bt.info("Position "+t+": ("+n.x,","+n.y,") width: ",n.width," height: ",n.height),n&&n.clusterNode?zs(n):e.children(t).length>0?(((t,e)=>{Bt.trace("Inserting cluster");const n=e.shape||"rect";Ws[e.id]=Us[n](t,e)})(s,n),vs[n.id].node=n):zs(n)})),e.edges().forEach((function(t){const i=e.edge(t);Bt.info("Edge "+t.v+" -> "+t.w+": "+JSON.stringify(i),i);const r=function(t,e,n,i,r,a){let s=n.points,c=!1;const l=a.node(e.v);var h=a.node(e.w);Bt.info("abc88 InsertEdge: ",n),h.intersect&&l.intersect&&(s=s.slice(1,n.points.length-1),s.unshift(l.intersect(s[0])),Bt.info("Last point",s[s.length-1],h,h.intersect(s[s.length-1])),s.push(h.intersect(s[s.length-1]))),n.toCluster&&(Bt.info("to cluster abc88",i[n.toCluster]),s=Xs(n.points,i[n.toCluster].node),c=!0),n.fromCluster&&(Bt.info("from cluster abc88",i[n.fromCluster]),s=Xs(s.reverse(),i[n.fromCluster].node).reverse(),c=!0);const u=s.filter((t=>!Number.isNaN(t.y)));let d;d=("graph"===r||"flowchart"===r)&&n.curve||o.$0Z;const p=(0,o.jvg)().x((function(t){return t.x})).y((function(t){return t.y})).curve(d);let f;switch(n.thickness){case"normal":f="edge-thickness-normal";break;case"thick":f="edge-thickness-thick";break;default:f=""}switch(n.pattern){case"solid":f+=" edge-pattern-solid";break;case"dotted":f+=" edge-pattern-dotted";break;case"dashed":f+=" edge-pattern-dashed"}const g=t.append("path").attr("d",p(u)).attr("id",n.id).attr("class"," "+f+(n.classes?" "+n.classes:"")).attr("style",n.style);let y="";switch((ui().flowchart.arrowMarkerAbsolute||ui().state.arrowMarkerAbsolute)&&(y=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,y=y.replace(/\(/g,"\\("),y=y.replace(/\)/g,"\\)")),Bt.info("arrowTypeStart",n.arrowTypeStart),Bt.info("arrowTypeEnd",n.arrowTypeEnd),n.arrowTypeStart){case"arrow_cross":g.attr("marker-start","url("+y+"#"+r+"-crossStart)");break;case"arrow_point":g.attr("marker-start","url("+y+"#"+r+"-pointStart)");break;case"arrow_barb":g.attr("marker-start","url("+y+"#"+r+"-barbStart)");break;case"arrow_circle":g.attr("marker-start","url("+y+"#"+r+"-circleStart)");break;case"aggregation":g.attr("marker-start","url("+y+"#"+r+"-aggregationStart)");break;case"extension":g.attr("marker-start","url("+y+"#"+r+"-extensionStart)");break;case"composition":g.attr("marker-start","url("+y+"#"+r+"-compositionStart)");break;case"dependency":g.attr("marker-start","url("+y+"#"+r+"-dependencyStart)");break;case"lollipop":g.attr("marker-start","url("+y+"#"+r+"-lollipopStart)")}switch(n.arrowTypeEnd){case"arrow_cross":g.attr("marker-end","url("+y+"#"+r+"-crossEnd)");break;case"arrow_point":g.attr("marker-end","url("+y+"#"+r+"-pointEnd)");break;case"arrow_barb":g.attr("marker-end","url("+y+"#"+r+"-barbEnd)");break;case"arrow_circle":g.attr("marker-end","url("+y+"#"+r+"-circleEnd)");break;case"aggregation":g.attr("marker-end","url("+y+"#"+r+"-aggregationEnd)");break;case"extension":g.attr("marker-end","url("+y+"#"+r+"-extensionEnd)");break;case"composition":g.attr("marker-end","url("+y+"#"+r+"-compositionEnd)");break;case"dependency":g.attr("marker-end","url("+y+"#"+r+"-dependencyEnd)");break;case"lollipop":g.attr("marker-end","url("+y+"#"+r+"-lollipopEnd)")}let m={};return c&&(m.updatedPath=s),m.originalPath=n.points,m}(c,t,i,vs,n,e);((t,e)=>{Bt.info("Moving label abc78 ",t.id,t.label,qs[t.id]);let n=e.updatedPath?e.updatedPath:e.originalPath;if(t.label){const i=qs[t.id];let r=t.x,a=t.y;if(n){const i=ei.calcLabelPosition(n);Bt.info("Moving label "+t.label+" from (",r,",",a,") to (",i.x,",",i.y,") abc78"),e.updatedPath&&(r=i.x,a=i.y)}i.attr("transform","translate("+r+", "+a+")")}if(t.startLabelLeft){const e=Hs[t.id].startLeft;let i=t.x,r=t.y;if(n){const e=ei.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_left",n);i=e.x,r=e.y}e.attr("transform","translate("+i+", "+r+")")}if(t.startLabelRight){const e=Hs[t.id].startRight;let i=t.x,r=t.y;if(n){const e=ei.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_right",n);i=e.x,r=e.y}e.attr("transform","translate("+i+", "+r+")")}if(t.endLabelLeft){const e=Hs[t.id].endLeft;let i=t.x,r=t.y;if(n){const e=ei.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_left",n);i=e.x,r=e.y}e.attr("transform","translate("+i+", "+r+")")}if(t.endLabelRight){const e=Hs[t.id].endRight;let i=t.x,r=t.y;if(n){const e=ei.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_right",n);i=e.x,r=e.y}e.attr("transform","translate("+i+", "+r+")")}})(i,r)})),e.nodes().forEach((function(t){const n=e.node(t);Bt.info(t,n.type,n.diff),"group"===n.type&&(u=n.diff)})),{elem:a,diff:u}},Ks=(t,e,n,i,r)=>{ys(t,n,i,r),js={},qs={},Hs={},Ws={},ks={},ws={},vs={},Bt.warn("Graph at first:",ht.c(e)),((t,e)=>{!t||e>10?Bt.debug("Opting out, no graph "):(Bt.debug("Opting in, graph "),t.nodes().forEach((function(e){t.children(e).length>0&&(Bt.warn("Cluster identified",e," Replacement id in edges: ",Ss(e,t)),ks[e]=Es(e,t),vs[e]={id:Ss(e,t),clusterData:t.node(e)})})),t.nodes().forEach((function(e){const n=t.children(e),i=t.edges();n.length>0?(Bt.debug("Cluster identified",e,ks),i.forEach((t=>{t.v!==e&&t.w!==e&&Cs(t.v,e)^Cs(t.w,e)&&(Bt.warn("Edge: ",t," leaves cluster ",e),Bt.warn("Decendants of XXX ",e,": ",ks[e]),vs[e].externalConnections=!0)}))):Bt.debug("Not a cluster ",e,ks)})),t.edges().forEach((function(e){const n=t.edge(e);Bt.warn("Edge "+e.v+" -> "+e.w+": "+JSON.stringify(e)),Bt.warn("Edge "+e.v+" -> "+e.w+": "+JSON.stringify(t.edge(e)));let i=e.v,r=e.w;if(Bt.warn("Fix XXX",vs,"ids:",e.v,e.w,"Translating: ",vs[e.v]," --- ",vs[e.w]),vs[e.v]&&vs[e.w]&&vs[e.v]===vs[e.w]){Bt.warn("Fixing and trixing link to self - removing XXX",e.v,e.w,e.name),Bt.warn("Fixing and trixing - removing XXX",e.v,e.w,e.name),i=As(e.v),r=As(e.w),t.removeEdge(e.v,e.w,e.name);const a=e.w+"---"+e.v;t.setNode(a,{domId:a,id:a,labelStyle:"",labelText:n.label,padding:0,shape:"labelRect",style:""});const s=JSON.parse(JSON.stringify(n)),o=JSON.parse(JSON.stringify(n));s.label="",s.arrowTypeEnd="none",o.label="",s.fromCluster=e.v,o.toCluster=e.v,t.setEdge(i,a,s,e.name+"-cyclic-special"),t.setEdge(a,r,o,e.name+"-cyclic-special")}else(vs[e.v]||vs[e.w])&&(Bt.warn("Fixing and trixing - removing XXX",e.v,e.w,e.name),i=As(e.v),r=As(e.w),t.removeEdge(e.v,e.w,e.name),i!==e.v&&(n.fromCluster=e.v),r!==e.w&&(n.toCluster=e.w),Bt.warn("Fix Replacing with XXX",i,r,e.name),t.setEdge(i,r,n,e.name))})),Bt.warn("Adjusted Graph",ht.c(t)),Ls(t,0),Bt.trace(vs))})(e),Bt.warn("Graph after:",ht.c(e)),Qs(t,e,i)},Js=t=>jt.sanitizeText(t,ui());let to={dividerMargin:10,padding:5,textHeight:10};function eo(t){let e;switch(t){case 0:e="aggregation";break;case 1:e="extension";break;case 2:e="composition";break;case 3:e="dependency";break;case 4:e="lollipop";break;default:e="none"}return e}const no={setConf:function(t){Object.keys(t).forEach((function(e){to[e]=t[e]}))},draw:function(t,e,n,i){Bt.info("Drawing class - ",e);const r=ui().flowchart,a=ui().securityLevel;Bt.info("config:",r);const s=r.nodeSpacing||50,c=r.rankSpacing||50,l=new lt.k({multigraph:!0,compound:!0}).setGraph({rankdir:i.db.getDirection(),nodesep:s,ranksep:c,marginx:8,marginy:8}).setDefaultEdgeLabel((function(){return{}})),h=i.db.getClasses(),u=i.db.getRelations(),d=i.db.getNotes();let p;Bt.info(u),function(t,e,n,i){const r=Object.keys(t);Bt.info("keys:",r),Bt.info(t),r.forEach((function(n){const r=t[n];let a="";r.cssClasses.length>0&&(a=a+" "+r.cssClasses.join(" "));const s={labelStyle:""};let o=void 0!==r.text?r.text:r.id,c="";r.type,c="class_box",e.setNode(r.id,{labelStyle:s.labelStyle,shape:c,labelText:Js(o),classData:r,rx:0,ry:0,class:a,style:s.style,id:r.id,domId:r.domId,tooltip:i.db.getTooltip(r.id)||"",haveCallback:r.haveCallback,link:r.link,width:"group"===r.type?500:void 0,type:r.type,padding:ui().flowchart.padding}),Bt.info("setNode",{labelStyle:s.labelStyle,shape:c,labelText:o,rx:0,ry:0,class:a,style:s.style,id:r.id,width:"group"===r.type?500:void 0,type:r.type,padding:ui().flowchart.padding})}))}(h,l,0,i),function(t,e){const n=ui().flowchart;let i=0;t.forEach((function(r){i++;const a={classes:"relation"};a.pattern=1==r.relation.lineType?"dashed":"solid",a.id="id"+i,"arrow_open"===r.type?a.arrowhead="none":a.arrowhead="normal",Bt.info(a,r),a.startLabelRight="none"===r.relationTitle1?"":r.relationTitle1,a.endLabelLeft="none"===r.relationTitle2?"":r.relationTitle2,a.arrowTypeStart=eo(r.relation.type1),a.arrowTypeEnd=eo(r.relation.type2);let s="",c="";if(void 0!==r.style){const t=Pn(r.style);s=t.style,c=t.labelStyle}else s="fill:none";a.style=s,a.labelStyle=c,void 0!==r.interpolate?a.curve=Rn(r.interpolate,o.c_6):void 0!==t.defaultInterpolate?a.curve=Rn(t.defaultInterpolate,o.c_6):a.curve=Rn(n.curve,o.c_6),r.text=r.title,void 0===r.text?void 0!==r.style&&(a.arrowheadStyle="fill: #333"):(a.arrowheadStyle="fill: #333",a.labelpos="c",ui().flowchart.htmlLabels?(a.labelType="html",a.label='<span class="edgeLabel">'+r.text+"</span>"):(a.labelType="text",a.label=r.text.replace(jt.lineBreakRegex,"\n"),void 0===r.style&&(a.style=a.style||"stroke: #333; stroke-width: 1.5px;fill:none"),a.labelStyle=a.labelStyle.replace("color:","fill:"))),e.setEdge(r.id1,r.id2,a,i)}))}(u,l),function(t,e,n,i){Bt.info(t),t.forEach((function(t,r){const a=t,s="",c="";let l=a.text,h="note";if(e.setNode(a.id,{labelStyle:s,shape:h,labelText:Js(l),noteData:a,rx:0,ry:0,class:"",style:c,id:a.id,domId:a.id,tooltip:"",type:"note",padding:ui().flowchart.padding}),Bt.info("setNode",{labelStyle:s,shape:h,labelText:l,rx:0,ry:0,style:c,id:a.id,type:"note",padding:ui().flowchart.padding}),!a.class||!(a.class in i))return;const u=n+r,d={classes:"relation",pattern:"dotted"};d.id=`edgeNote${u}`,d.arrowhead="none",Bt.info(`Note edge: ${JSON.stringify(d)}, ${JSON.stringify(a)}`),d.startLabelRight="",d.endLabelLeft="",d.arrowTypeStart="none",d.arrowTypeEnd="none",d.style="fill:none",d.labelStyle="",d.curve=Rn(to.curve,o.c_6),e.setEdge(a.id,a.class,d,u)}))}(d,l,u.length+1,h),"sandbox"===a&&(p=(0,o.Ys)("#i"+e));const f="sandbox"===a?(0,o.Ys)(p.nodes()[0].contentDocument.body):(0,o.Ys)("body"),g=f.select(`[id="${e}"]`),y=f.select("#"+e+" g");if(Ks(y,l,["aggregation","extension","composition","dependency","lollipop"],"classDiagram",e),ei.insertTitle(g,"classTitleText",r.titleTopMargin,i.db.getDiagramTitle()),_i(l,g,r.diagramPadding,r.useMaxWidth),!r.htmlLabels){const t="sandbox"===a?p.nodes()[0].contentDocument:document,n=t.querySelectorAll('[id="'+e+'"] .edgeLabel .label');for(const e of n){const n=e.getBBox(),i=t.createElementNS("http://www.w3.org/2000/svg","rect");i.setAttribute("rx",0),i.setAttribute("ry",0),i.setAttribute("width",n.width),i.setAttribute("height",n.height),e.insertBefore(i,e.firstChild)}}}};var io=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,2],i=[1,5],r=[6,9,11,23,25,27,29,30,31,51],a=[1,17],s=[1,18],o=[1,19],c=[1,20],l=[1,21],h=[1,22],u=[1,25],d=[1,30],p=[1,31],f=[1,32],g=[1,33],y=[6,9,11,15,20,23,25,27,29,30,31,44,45,46,47,51],m=[1,45],b=[30,31,48,49],_=[4,6,9,11,23,25,27,29,30,31,51],x=[44,45,46,47],v=[22,37],k=[1,65],w=[1,64],C=[22,37,39,41],T={trace:function(){},yy:{},symbols_:{error:2,start:3,ER_DIAGRAM:4,document:5,EOF:6,directive:7,line:8,SPACE:9,statement:10,NEWLINE:11,openDirective:12,typeDirective:13,closeDirective:14,":":15,argDirective:16,entityName:17,relSpec:18,role:19,BLOCK_START:20,attributes:21,BLOCK_STOP:22,title:23,title_value:24,acc_title:25,acc_title_value:26,acc_descr:27,acc_descr_value:28,acc_descr_multiline_value:29,ALPHANUM:30,ENTITY_NAME:31,attribute:32,attributeType:33,attributeName:34,attributeKeyTypeList:35,attributeComment:36,ATTRIBUTE_WORD:37,attributeKeyType:38,COMMA:39,ATTRIBUTE_KEY:40,COMMENT:41,cardinality:42,relType:43,ZERO_OR_ONE:44,ZERO_OR_MORE:45,ONE_OR_MORE:46,ONLY_ONE:47,NON_IDENTIFYING:48,IDENTIFYING:49,WORD:50,open_directive:51,type_directive:52,arg_directive:53,close_directive:54,$accept:0,$end:1},terminals_:{2:"error",4:"ER_DIAGRAM",6:"EOF",9:"SPACE",11:"NEWLINE",15:":",20:"BLOCK_START",22:"BLOCK_STOP",23:"title",24:"title_value",25:"acc_title",26:"acc_title_value",27:"acc_descr",28:"acc_descr_value",29:"acc_descr_multiline_value",30:"ALPHANUM",31:"ENTITY_NAME",37:"ATTRIBUTE_WORD",39:"COMMA",40:"ATTRIBUTE_KEY",41:"COMMENT",44:"ZERO_OR_ONE",45:"ZERO_OR_MORE",46:"ONE_OR_MORE",47:"ONLY_ONE",48:"NON_IDENTIFYING",49:"IDENTIFYING",50:"WORD",51:"open_directive",52:"type_directive",53:"arg_directive",54:"close_directive"},productions_:[0,[3,3],[3,2],[5,0],[5,2],[8,2],[8,1],[8,1],[8,1],[7,4],[7,6],[10,1],[10,5],[10,4],[10,3],[10,1],[10,2],[10,2],[10,2],[10,1],[17,1],[17,1],[21,1],[21,2],[32,2],[32,3],[32,3],[32,4],[33,1],[34,1],[35,1],[35,3],[38,1],[36,1],[18,3],[42,1],[42,1],[42,1],[42,1],[43,1],[43,1],[19,1],[19,1],[19,1],[12,1],[13,1],[16,1],[14,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 1:break;case 3:case 7:case 8:this.$=[];break;case 4:a[o-1].push(a[o]),this.$=a[o-1];break;case 5:case 6:case 20:case 43:case 28:case 29:case 32:this.$=a[o];break;case 12:i.addEntity(a[o-4]),i.addEntity(a[o-2]),i.addRelationship(a[o-4],a[o],a[o-2],a[o-3]);break;case 13:i.addEntity(a[o-3]),i.addAttributes(a[o-3],a[o-1]);break;case 14:i.addEntity(a[o-2]);break;case 15:i.addEntity(a[o]);break;case 16:case 17:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 18:case 19:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 21:case 41:case 42:case 33:this.$=a[o].replace(/"/g,"");break;case 22:case 30:this.$=[a[o]];break;case 23:a[o].push(a[o-1]),this.$=a[o];break;case 24:this.$={attributeType:a[o-1],attributeName:a[o]};break;case 25:this.$={attributeType:a[o-2],attributeName:a[o-1],attributeKeyTypeList:a[o]};break;case 26:this.$={attributeType:a[o-2],attributeName:a[o-1],attributeComment:a[o]};break;case 27:this.$={attributeType:a[o-3],attributeName:a[o-2],attributeKeyTypeList:a[o-1],attributeComment:a[o]};break;case 31:a[o-2].push(a[o]),this.$=a[o-2];break;case 34:this.$={cardA:a[o],relType:a[o-1],cardB:a[o-2]};break;case 35:this.$=i.Cardinality.ZERO_OR_ONE;break;case 36:this.$=i.Cardinality.ZERO_OR_MORE;break;case 37:this.$=i.Cardinality.ONE_OR_MORE;break;case 38:this.$=i.Cardinality.ONLY_ONE;break;case 39:this.$=i.Identification.NON_IDENTIFYING;break;case 40:this.$=i.Identification.IDENTIFYING;break;case 44:i.parseDirective("%%{","open_directive");break;case 45:i.parseDirective(a[o],"type_directive");break;case 46:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 47:i.parseDirective("}%%","close_directive","er")}},table:[{3:1,4:n,7:3,12:4,51:i},{1:[3]},e(r,[2,3],{5:6}),{3:7,4:n,7:3,12:4,51:i},{13:8,52:[1,9]},{52:[2,44]},{6:[1,10],7:15,8:11,9:[1,12],10:13,11:[1,14],12:4,17:16,23:a,25:s,27:o,29:c,30:l,31:h,51:i},{1:[2,2]},{14:23,15:[1,24],54:u},e([15,54],[2,45]),e(r,[2,8],{1:[2,1]}),e(r,[2,4]),{7:15,10:26,12:4,17:16,23:a,25:s,27:o,29:c,30:l,31:h,51:i},e(r,[2,6]),e(r,[2,7]),e(r,[2,11]),e(r,[2,15],{18:27,42:29,20:[1,28],44:d,45:p,46:f,47:g}),{24:[1,34]},{26:[1,35]},{28:[1,36]},e(r,[2,19]),e(y,[2,20]),e(y,[2,21]),{11:[1,37]},{16:38,53:[1,39]},{11:[2,47]},e(r,[2,5]),{17:40,30:l,31:h},{21:41,22:[1,42],32:43,33:44,37:m},{43:46,48:[1,47],49:[1,48]},e(b,[2,35]),e(b,[2,36]),e(b,[2,37]),e(b,[2,38]),e(r,[2,16]),e(r,[2,17]),e(r,[2,18]),e(_,[2,9]),{14:49,54:u},{54:[2,46]},{15:[1,50]},{22:[1,51]},e(r,[2,14]),{21:52,22:[2,22],32:43,33:44,37:m},{34:53,37:[1,54]},{37:[2,28]},{42:55,44:d,45:p,46:f,47:g},e(x,[2,39]),e(x,[2,40]),{11:[1,56]},{19:57,30:[1,60],31:[1,59],50:[1,58]},e(r,[2,13]),{22:[2,23]},e(v,[2,24],{35:61,36:62,38:63,40:k,41:w}),e([22,37,40,41],[2,29]),e([30,31],[2,34]),e(_,[2,10]),e(r,[2,12]),e(r,[2,41]),e(r,[2,42]),e(r,[2,43]),e(v,[2,25],{36:66,39:[1,67],41:w}),e(v,[2,26]),e(C,[2,30]),e(v,[2,33]),e(C,[2,32]),e(v,[2,27]),{38:68,40:k},e(C,[2,31])],defaultActions:{5:[2,44],7:[2,2],25:[2,47],39:[2,46],45:[2,28],52:[2,23]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=a.slice.call(arguments,1),u=Object.create(this.lexer),d={yy:{}};for(var p in this.yy)Object.prototype.hasOwnProperty.call(this.yy,p)&&(d.yy[p]=this.yy[p]);u.setInput(t,d.yy),d.yy.lexer=u,d.yy.parser=this,void 0===u.yylloc&&(u.yylloc={});var f=u.yylloc;a.push(f);var g=u.options&&u.options.ranges;function y(){var t;return"number"!=typeof(t=i.pop()||u.lex()||1)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof d.yy.parseError?this.parseError=d.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var m,b,_,x,v,k,w,C,T={};;){if(b=n[n.length-1],this.defaultActions[b]?_=this.defaultActions[b]:(null==m&&(m=y()),_=s[b]&&s[b][m]),void 0===_||!_.length||!_[0]){var E="";for(v in C=[],s[b])this.terminals_[v]&&v>2&&C.push("'"+this.terminals_[v]+"'");E=u.showPosition?"Parse error on line "+(c+1)+":\n"+u.showPosition()+"\nExpecting "+C.join(", ")+", got '"+(this.terminals_[m]||m)+"'":"Parse error on line "+(c+1)+": Unexpected "+(1==m?"end of input":"'"+(this.terminals_[m]||m)+"'"),this.parseError(E,{text:u.match,token:this.terminals_[m]||m,line:u.yylineno,loc:f,expected:C})}if(_[0]instanceof Array&&_.length>1)throw new Error("Parse Error: multiple actions possible at state: "+b+", token: "+m);switch(_[0]){case 1:n.push(m),r.push(u.yytext),a.push(u.yylloc),n.push(_[1]),m=null,l=u.yyleng,o=u.yytext,c=u.yylineno,f=u.yylloc;break;case 2:if(k=this.productions_[_[1]][1],T.$=r[r.length-k],T._$={first_line:a[a.length-(k||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(k||1)].first_column,last_column:a[a.length-1].last_column},g&&(T._$.range=[a[a.length-(k||1)].range[0],a[a.length-1].range[1]]),void 0!==(x=this.performAction.apply(T,[o,l,c,d.yy,_[1],r,a].concat(h))))return x;k&&(n=n.slice(0,-1*k*2),r=r.slice(0,-1*k),a=a.slice(0,-1*k)),n.push(this.productions_[_[1]][0]),r.push(T.$),a.push(T._$),w=s[n[n.length-2]][n[n.length-1]],n.push(w);break;case 3:return!0}}return!0}},E=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("acc_title"),25;case 1:return this.popState(),"acc_title_value";case 2:return this.begin("acc_descr"),27;case 3:return this.popState(),"acc_descr_value";case 4:this.begin("acc_descr_multiline");break;case 5:this.popState();break;case 6:return"acc_descr_multiline_value";case 7:return this.begin("open_directive"),51;case 8:return this.begin("type_directive"),52;case 9:return this.popState(),this.begin("arg_directive"),15;case 10:return this.popState(),this.popState(),54;case 11:return 53;case 12:case 13:case 15:case 22:case 27:break;case 14:return 11;case 16:return 9;case 17:return 31;case 18:return 50;case 19:return 4;case 20:return this.begin("block"),20;case 21:return 39;case 23:return 40;case 24:case 25:return 37;case 26:return 41;case 28:return this.popState(),22;case 29:case 58:return e.yytext[0];case 30:case 34:case 35:case 48:return 44;case 31:case 32:case 33:case 41:case 43:case 50:return 46;case 36:case 37:case 38:case 39:case 40:case 42:case 49:return 45;case 44:case 45:case 46:case 47:return 47;case 51:case 54:case 55:case 56:return 48;case 52:case 53:return 49;case 57:return 30;case 59:return 6}},rules:[/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:[\s]+)/i,/^(?:"[^"%\r\n\v\b\\]+")/i,/^(?:"[^"]*")/i,/^(?:erDiagram\b)/i,/^(?:\{)/i,/^(?:,)/i,/^(?:\s+)/i,/^(?:\b((?:PK)|(?:FK)|(?:UK))\b)/i,/^(?:(.*?)[~](.*?)*[~])/i,/^(?:[A-Za-z_][A-Za-z0-9\-_\[\]\(\)]*)/i,/^(?:"[^"]*")/i,/^(?:[\n]+)/i,/^(?:\})/i,/^(?:.)/i,/^(?:one or zero\b)/i,/^(?:one or more\b)/i,/^(?:one or many\b)/i,/^(?:1\+)/i,/^(?:\|o\b)/i,/^(?:zero or one\b)/i,/^(?:zero or more\b)/i,/^(?:zero or many\b)/i,/^(?:0\+)/i,/^(?:\}o\b)/i,/^(?:many\(0\))/i,/^(?:many\(1\))/i,/^(?:many\b)/i,/^(?:\}\|)/i,/^(?:one\b)/i,/^(?:only one\b)/i,/^(?:1\b)/i,/^(?:\|\|)/i,/^(?:o\|)/i,/^(?:o\{)/i,/^(?:\|\{)/i,/^(?:\.\.)/i,/^(?:--)/i,/^(?:to\b)/i,/^(?:optionally to\b)/i,/^(?:\.-)/i,/^(?:-\.)/i,/^(?:[A-Za-z][A-Za-z0-9\-_]*)/i,/^(?:.)/i,/^(?:$)/i],conditions:{acc_descr_multiline:{rules:[5,6],inclusive:!1},acc_descr:{rules:[3],inclusive:!1},acc_title:{rules:[1],inclusive:!1},open_directive:{rules:[8],inclusive:!1},type_directive:{rules:[9,10],inclusive:!1},arg_directive:{rules:[10,11],inclusive:!1},block:{rules:[21,22,23,24,25,26,27,28,29],inclusive:!1},INITIAL:{rules:[0,2,4,7,12,13,14,15,16,17,18,19,20,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59],inclusive:!0}}},t);function S(){this.yy={}}return T.lexer=E,S.prototype=T,T.Parser=S,new S}();io.parser=io;const ro=io,ao=t=>null!==t.match(/^\s*erDiagram/);let so={},oo=[];const co=function(t){return void 0===so[t]&&(so[t]={attributes:[]},Bt.info("Added new entity :",t)),so[t]},lo={Cardinality:{ZERO_OR_ONE:"ZERO_OR_ONE",ZERO_OR_MORE:"ZERO_OR_MORE",ONE_OR_MORE:"ONE_OR_MORE",ONLY_ONE:"ONLY_ONE"},Identification:{NON_IDENTIFYING:"NON_IDENTIFYING",IDENTIFYING:"IDENTIFYING"},parseDirective:function(t,e,n){xp.parseDirective(this,t,e,n)},getConfig:()=>ui().er,addEntity:co,addAttributes:function(t,e){let n,i=co(t);for(n=e.length-1;n>=0;n--)i.attributes.push(e[n]),Bt.debug("Added attribute ",e[n].attributeName)},getEntities:()=>so,addRelationship:function(t,e,n,i){let r={entityA:t,roleA:e,entityB:n,relSpec:i};oo.push(r),Bt.debug("Added new relationship :",r)},getRelationships:()=>oo,clear:function(){so={},oo=[],Ri()},setAccTitle:Zi,getAccTitle:Pi,setAccDescription:ji,getAccDescription:Yi,setDiagramTitle:zi,getDiagramTitle:Ui},ho={ONLY_ONE_START:"ONLY_ONE_START",ONLY_ONE_END:"ONLY_ONE_END",ZERO_OR_ONE_START:"ZERO_OR_ONE_START",ZERO_OR_ONE_END:"ZERO_OR_ONE_END",ONE_OR_MORE_START:"ONE_OR_MORE_START",ONE_OR_MORE_END:"ONE_OR_MORE_END",ZERO_OR_MORE_START:"ZERO_OR_MORE_START",ZERO_OR_MORE_END:"ZERO_OR_MORE_END"},uo=ho,po=function(t,e){let n;t.append("defs").append("marker").attr("id",ho.ONLY_ONE_START).attr("refX",0).attr("refY",9).attr("markerWidth",18).attr("markerHeight",18).attr("orient","auto").append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M9,0 L9,18 M15,0 L15,18"),t.append("defs").append("marker").attr("id",ho.ONLY_ONE_END).attr("refX",18).attr("refY",9).attr("markerWidth",18).attr("markerHeight",18).attr("orient","auto").append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M3,0 L3,18 M9,0 L9,18"),n=t.append("defs").append("marker").attr("id",ho.ZERO_OR_ONE_START).attr("refX",0).attr("refY",9).attr("markerWidth",30).attr("markerHeight",18).attr("orient","auto"),n.append("circle").attr("stroke",e.stroke).attr("fill","white").attr("cx",21).attr("cy",9).attr("r",6),n.append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M9,0 L9,18"),n=t.append("defs").append("marker").attr("id",ho.ZERO_OR_ONE_END).attr("refX",30).attr("refY",9).attr("markerWidth",30).attr("markerHeight",18).attr("orient","auto"),n.append("circle").attr("stroke",e.stroke).attr("fill","white").attr("cx",9).attr("cy",9).attr("r",6),n.append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M21,0 L21,18"),t.append("defs").append("marker").attr("id",ho.ONE_OR_MORE_START).attr("refX",18).attr("refY",18).attr("markerWidth",45).attr("markerHeight",36).attr("orient","auto").append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M0,18 Q 18,0 36,18 Q 18,36 0,18 M42,9 L42,27"),t.append("defs").append("marker").attr("id",ho.ONE_OR_MORE_END).attr("refX",27).attr("refY",18).attr("markerWidth",45).attr("markerHeight",36).attr("orient","auto").append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M3,9 L3,27 M9,18 Q27,0 45,18 Q27,36 9,18"),n=t.append("defs").append("marker").attr("id",ho.ZERO_OR_MORE_START).attr("refX",18).attr("refY",18).attr("markerWidth",57).attr("markerHeight",36).attr("orient","auto"),n.append("circle").attr("stroke",e.stroke).attr("fill","white").attr("cx",48).attr("cy",18).attr("r",6),n.append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M0,18 Q18,0 36,18 Q18,36 0,18"),n=t.append("defs").append("marker").attr("id",ho.ZERO_OR_MORE_END).attr("refX",39).attr("refY",18).attr("markerWidth",57).attr("markerHeight",36).attr("orient","auto"),n.append("circle").attr("stroke",e.stroke).attr("fill","white").attr("cx",9).attr("cy",18).attr("r",6),n.append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M21,18 Q39,0 57,18 Q39,36 21,18")},fo=/[^\dA-Za-z](\W)*/g;let go={},yo=new Map;const mo=function(t,e,n){let i;return Object.keys(e).forEach((function(r){const a=function(t="",e=""){const n=t.replace(fo,"");return`${vo(e)}${vo(n)}${xt(t,xo)}`}(r,"entity");yo.set(r,a);const s=t.append("g").attr("id",a);i=void 0===i?a:i;const o="text-"+a,c=s.append("text").classed("er entityLabel",!0).attr("id",o).attr("x",0).attr("y",0).style("dominant-baseline","middle").style("text-anchor","middle").style("font-family",ui().fontFamily).style("font-size",go.fontSize+"px").text(r),{width:l,height:h}=((t,e,n)=>{const i=go.entityPadding/3,r=go.entityPadding/3,a=.85*go.fontSize,s=e.node().getBBox(),o=[];let c=!1,l=!1,h=0,u=0,d=0,p=0,f=s.height+2*i,g=1;n.forEach((t=>{void 0!==t.attributeKeyTypeList&&t.attributeKeyTypeList.length>0&&(c=!0),void 0!==t.attributeComment&&(l=!0)})),n.forEach((n=>{const r=`${e.node().id}-attr-${g}`;let s=0;const y=Pt(n.attributeType),m=t.append("text").classed("er entityLabel",!0).attr("id",`${r}-type`).attr("x",0).attr("y",0).style("dominant-baseline","middle").style("text-anchor","left").style("font-family",ui().fontFamily).style("font-size",a+"px").text(y),b=t.append("text").classed("er entityLabel",!0).attr("id",`${r}-name`).attr("x",0).attr("y",0).style("dominant-baseline","middle").style("text-anchor","left").style("font-family",ui().fontFamily).style("font-size",a+"px").text(n.attributeName),_={};_.tn=m,_.nn=b;const x=m.node().getBBox(),v=b.node().getBBox();if(h=Math.max(h,x.width),u=Math.max(u,v.width),s=Math.max(x.height,v.height),c){const e=void 0!==n.attributeKeyTypeList?n.attributeKeyTypeList.join(","):"",i=t.append("text").classed("er entityLabel",!0).attr("id",`${r}-key`).attr("x",0).attr("y",0).style("dominant-baseline","middle").style("text-anchor","left").style("font-family",ui().fontFamily).style("font-size",a+"px").text(e);_.kn=i;const o=i.node().getBBox();d=Math.max(d,o.width),s=Math.max(s,o.height)}if(l){const e=t.append("text").classed("er entityLabel",!0).attr("id",`${r}-comment`).attr("x",0).attr("y",0).style("dominant-baseline","middle").style("text-anchor","left").style("font-family",ui().fontFamily).style("font-size",a+"px").text(n.attributeComment||"");_.cn=e;const i=e.node().getBBox();p=Math.max(p,i.width),s=Math.max(s,i.height)}_.height=s,o.push(_),f+=s+2*i,g+=1}));let y=4;c&&(y+=2),l&&(y+=2);const m=h+u+d+p,b={width:Math.max(go.minEntityWidth,Math.max(s.width+2*go.entityPadding,m+r*y)),height:n.length>0?f:Math.max(go.minEntityHeight,s.height+2*go.entityPadding)};if(n.length>0){const n=Math.max(0,(b.width-m-r*y)/(y/2));e.attr("transform","translate("+b.width/2+","+(i+s.height/2)+")");let a=s.height+2*i,f="attributeBoxOdd";o.forEach((e=>{const s=a+i+e.height/2;e.tn.attr("transform","translate("+r+","+s+")");const o=t.insert("rect","#"+e.tn.node().id).classed(`er ${f}`,!0).attr("x",0).attr("y",a).attr("width",h+2*r+n).attr("height",e.height+2*i),g=parseFloat(o.attr("x"))+parseFloat(o.attr("width"));e.nn.attr("transform","translate("+(g+r)+","+s+")");const y=t.insert("rect","#"+e.nn.node().id).classed(`er ${f}`,!0).attr("x",g).attr("y",a).attr("width",u+2*r+n).attr("height",e.height+2*i);let m=parseFloat(y.attr("x"))+parseFloat(y.attr("width"));if(c){e.kn.attr("transform","translate("+(m+r)+","+s+")");const o=t.insert("rect","#"+e.kn.node().id).classed(`er ${f}`,!0).attr("x",m).attr("y",a).attr("width",d+2*r+n).attr("height",e.height+2*i);m=parseFloat(o.attr("x"))+parseFloat(o.attr("width"))}l&&(e.cn.attr("transform","translate("+(m+r)+","+s+")"),t.insert("rect","#"+e.cn.node().id).classed(`er ${f}`,"true").attr("x",m).attr("y",a).attr("width",p+2*r+n).attr("height",e.height+2*i)),a+=e.height+2*i,f="attributeBoxOdd"===f?"attributeBoxEven":"attributeBoxOdd"}))}else b.height=Math.max(go.minEntityHeight,f),e.attr("transform","translate("+b.width/2+","+b.height/2+")");return b})(s,c,e[r].attributes),u=s.insert("rect","#"+o).classed("er entityBox",!0).attr("x",0).attr("y",0).attr("width",l).attr("height",h).node().getBBox();n.setNode(a,{width:u.width,height:u.height,shape:"rect",id:a})})),i},bo=function(t){return(t.entityA+t.roleA+t.entityB).replace(/\s/g,"")};let _o=0;const xo="28e9f9db-3c8d-5aa5-9faf-44286ae5937c";function vo(t=""){return t.length>0?`${t}-`:""}const ko={setConf:function(t){const e=Object.keys(t);for(const n of e)go[n]=t[n]},draw:function(t,e,n,i){go=ui().er,Bt.info("Drawing ER diagram");const r=ui().securityLevel;let a;"sandbox"===r&&(a=(0,o.Ys)("#i"+e));const s=("sandbox"===r?(0,o.Ys)(a.nodes()[0].contentDocument.body):(0,o.Ys)("body")).select(`[id='${e}']`);let c;po(s,go),c=new lt.k({multigraph:!0,directed:!0,compound:!1}).setGraph({rankdir:go.layoutDirection,marginx:20,marginy:20,nodesep:100,edgesep:100,ranksep:100}).setDefaultEdgeLabel((function(){return{}}));const l=mo(s,i.db.getEntities(),c),h=function(t,e){return t.forEach((function(t){e.setEdge(yo.get(t.entityA),yo.get(t.entityB),{relationship:t},bo(t))})),t}(i.db.getRelationships(),c);var u,d;(0,ct.bK)(c),u=s,(d=c).nodes().forEach((function(t){void 0!==t&&void 0!==d.node(t)&&u.select("#"+t).attr("transform","translate("+(d.node(t).x-d.node(t).width/2)+","+(d.node(t).y-d.node(t).height/2)+" )")})),h.forEach((function(t){!function(t,e,n,i,r){_o++;const a=n.edge(yo.get(e.entityA),yo.get(e.entityB),bo(e)),s=(0,o.jvg)().x((function(t){return t.x})).y((function(t){return t.y})).curve(o.$0Z),c=t.insert("path","#"+i).classed("er relationshipLine",!0).attr("d",s(a.points)).style("stroke",go.stroke).style("fill","none");e.relSpec.relType===r.db.Identification.NON_IDENTIFYING&&c.attr("stroke-dasharray","8,8");let l="";switch(go.arrowMarkerAbsolute&&(l=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,l=l.replace(/\(/g,"\\("),l=l.replace(/\)/g,"\\)")),e.relSpec.cardA){case r.db.Cardinality.ZERO_OR_ONE:c.attr("marker-end","url("+l+"#"+uo.ZERO_OR_ONE_END+")");break;case r.db.Cardinality.ZERO_OR_MORE:c.attr("marker-end","url("+l+"#"+uo.ZERO_OR_MORE_END+")");break;case r.db.Cardinality.ONE_OR_MORE:c.attr("marker-end","url("+l+"#"+uo.ONE_OR_MORE_END+")");break;case r.db.Cardinality.ONLY_ONE:c.attr("marker-end","url("+l+"#"+uo.ONLY_ONE_END+")")}switch(e.relSpec.cardB){case r.db.Cardinality.ZERO_OR_ONE:c.attr("marker-start","url("+l+"#"+uo.ZERO_OR_ONE_START+")");break;case r.db.Cardinality.ZERO_OR_MORE:c.attr("marker-start","url("+l+"#"+uo.ZERO_OR_MORE_START+")");break;case r.db.Cardinality.ONE_OR_MORE:c.attr("marker-start","url("+l+"#"+uo.ONE_OR_MORE_START+")");break;case r.db.Cardinality.ONLY_ONE:c.attr("marker-start","url("+l+"#"+uo.ONLY_ONE_START+")")}const h=c.node().getTotalLength(),u=c.node().getPointAtLength(.5*h),d="rel"+_o,p=t.append("text").classed("er relationshipLabel",!0).attr("id",d).attr("x",u.x).attr("y",u.y).style("text-anchor","middle").style("dominant-baseline","middle").style("font-family",ui().fontFamily).style("font-size",go.fontSize+"px").text(e.roleA).node().getBBox();t.insert("rect","#"+d).classed("er relationshipLabelBox",!0).attr("x",u.x-p.width/2).attr("y",u.y-p.height/2).attr("width",p.width).attr("height",p.height)}(s,t,c,l,i)}));const p=go.diagramPadding;ei.insertTitle(s,"entityTitleText",go.titleTopMargin,i.db.getDiagramTitle());const f=s.node().getBBox(),g=f.width+2*p,y=f.height+2*p;bi(s,y,g,go.useMaxWidth),s.attr("viewBox",`${f.x-p} ${f.y-p} ${g} ${y}`)}};var wo=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,9],i=[1,7],r=[1,6],a=[1,8],s=[1,20,21,22,23,38,44,46,48,52,66,67,86,87,88,89,90,91,95,105,106,109,111,112,118,119,120,121,122,123,124,125,126,127],o=[2,10],c=[1,20],l=[1,21],h=[1,22],u=[1,23],d=[1,30],p=[1,32],f=[1,33],g=[1,34],y=[1,62],m=[1,48],b=[1,52],_=[1,36],x=[1,37],v=[1,38],k=[1,39],w=[1,40],C=[1,56],T=[1,63],E=[1,51],S=[1,53],A=[1,55],L=[1,59],B=[1,60],N=[1,41],D=[1,42],O=[1,43],M=[1,44],I=[1,61],F=[1,50],$=[1,54],R=[1,57],Z=[1,58],P=[1,49],j=[1,66],Y=[1,71],z=[1,20,21,22,23,38,42,44,46,48,52,66,67,86,87,88,89,90,91,95,105,106,109,111,112,118,119,120,121,122,123,124,125,126,127],U=[1,75],W=[1,74],q=[1,76],H=[20,21,23,81,82],V=[1,99],G=[1,104],X=[1,107],Q=[1,108],K=[1,101],J=[1,106],tt=[1,109],et=[1,102],nt=[1,114],it=[1,113],rt=[1,103],at=[1,105],st=[1,110],ot=[1,111],ct=[1,112],lt=[1,115],ht=[20,21,22,23,81,82],ut=[20,21,22,23,53,81,82],dt=[20,21,22,23,40,52,53,55,57,59,61,63,65,66,67,69,71,73,74,76,81,82,91,95,105,106,109,111,112,122,123,124,125,126,127],pt=[20,21,23],ft=[20,21,23,52,66,67,81,82,91,95,105,106,109,111,112,122,123,124,125,126,127],gt=[1,12,20,21,22,23,24,38,42,44,46,48,52,66,67,86,87,88,89,90,91,95,105,106,109,111,112,118,119,120,121,122,123,124,125,126,127],yt=[52,66,67,91,95,105,106,109,111,112,122,123,124,125,126,127],mt=[1,149],bt=[1,157],_t=[1,158],xt=[1,159],vt=[1,160],kt=[1,144],wt=[1,145],Ct=[1,141],Tt=[1,152],Et=[1,153],St=[1,154],At=[1,155],Lt=[1,156],Bt=[1,161],Nt=[1,162],Dt=[1,147],Ot=[1,150],Mt=[1,146],It=[1,143],Ft=[20,21,22,23,38,42,44,46,48,52,66,67,86,87,88,89,90,91,95,105,106,109,111,112,118,119,120,121,122,123,124,125,126,127],$t=[1,165],Rt=[20,21,22,23,26,52,66,67,91,105,106,109,111,112,122,123,124,125,126,127],Zt=[20,21,22,23,24,26,38,40,41,42,52,56,58,60,62,64,66,67,68,70,72,73,75,77,81,82,86,87,88,89,90,91,92,95,105,106,109,111,112,113,114,122,123,124,125,126,127],Pt=[12,21,22,24],jt=[22,106],Yt=[1,250],zt=[1,245],Ut=[1,246],Wt=[1,254],qt=[1,251],Ht=[1,248],Vt=[1,247],Gt=[1,249],Xt=[1,252],Qt=[1,253],Kt=[1,255],Jt=[1,273],te=[20,21,23,106],ee=[20,21,22,23,66,67,86,102,105,106,109,110,111,112,113],ne={trace:function(){},yy:{},symbols_:{error:2,start:3,mermaidDoc:4,directive:5,openDirective:6,typeDirective:7,closeDirective:8,separator:9,":":10,argDirective:11,open_directive:12,type_directive:13,arg_directive:14,close_directive:15,graphConfig:16,document:17,line:18,statement:19,SEMI:20,NEWLINE:21,SPACE:22,EOF:23,GRAPH:24,NODIR:25,DIR:26,FirstStmtSeperator:27,ending:28,endToken:29,spaceList:30,spaceListNewline:31,verticeStatement:32,styleStatement:33,linkStyleStatement:34,classDefStatement:35,classStatement:36,clickStatement:37,subgraph:38,text:39,SQS:40,SQE:41,end:42,direction:43,acc_title:44,acc_title_value:45,acc_descr:46,acc_descr_value:47,acc_descr_multiline_value:48,link:49,node:50,vertex:51,AMP:52,STYLE_SEPARATOR:53,idString:54,DOUBLECIRCLESTART:55,DOUBLECIRCLEEND:56,PS:57,PE:58,"(-":59,"-)":60,STADIUMSTART:61,STADIUMEND:62,SUBROUTINESTART:63,SUBROUTINEEND:64,VERTEX_WITH_PROPS_START:65,ALPHA:66,COLON:67,PIPE:68,CYLINDERSTART:69,CYLINDEREND:70,DIAMOND_START:71,DIAMOND_STOP:72,TAGEND:73,TRAPSTART:74,TRAPEND:75,INVTRAPSTART:76,INVTRAPEND:77,linkStatement:78,arrowText:79,TESTSTR:80,START_LINK:81,LINK:82,textToken:83,STR:84,keywords:85,STYLE:86,LINKSTYLE:87,CLASSDEF:88,CLASS:89,CLICK:90,DOWN:91,UP:92,textNoTags:93,textNoTagsToken:94,DEFAULT:95,stylesOpt:96,alphaNum:97,CALLBACKNAME:98,CALLBACKARGS:99,HREF:100,LINK_TARGET:101,HEX:102,numList:103,INTERPOLATE:104,NUM:105,COMMA:106,style:107,styleComponent:108,MINUS:109,UNIT:110,BRKT:111,DOT:112,PCT:113,TAGSTART:114,alphaNumToken:115,idStringToken:116,alphaNumStatement:117,direction_tb:118,direction_bt:119,direction_rl:120,direction_lr:121,PUNCTUATION:122,UNICODE_TEXT:123,PLUS:124,EQUALS:125,MULT:126,UNDERSCORE:127,graphCodeTokens:128,ARROW_CROSS:129,ARROW_POINT:130,ARROW_CIRCLE:131,ARROW_OPEN:132,QUOTE:133,$accept:0,$end:1},terminals_:{2:"error",10:":",12:"open_directive",13:"type_directive",14:"arg_directive",15:"close_directive",20:"SEMI",21:"NEWLINE",22:"SPACE",23:"EOF",24:"GRAPH",25:"NODIR",26:"DIR",38:"subgraph",40:"SQS",41:"SQE",42:"end",44:"acc_title",45:"acc_title_value",46:"acc_descr",47:"acc_descr_value",48:"acc_descr_multiline_value",52:"AMP",53:"STYLE_SEPARATOR",55:"DOUBLECIRCLESTART",56:"DOUBLECIRCLEEND",57:"PS",58:"PE",59:"(-",60:"-)",61:"STADIUMSTART",62:"STADIUMEND",63:"SUBROUTINESTART",64:"SUBROUTINEEND",65:"VERTEX_WITH_PROPS_START",66:"ALPHA",67:"COLON",68:"PIPE",69:"CYLINDERSTART",70:"CYLINDEREND",71:"DIAMOND_START",72:"DIAMOND_STOP",73:"TAGEND",74:"TRAPSTART",75:"TRAPEND",76:"INVTRAPSTART",77:"INVTRAPEND",80:"TESTSTR",81:"START_LINK",82:"LINK",84:"STR",86:"STYLE",87:"LINKSTYLE",88:"CLASSDEF",89:"CLASS",90:"CLICK",91:"DOWN",92:"UP",95:"DEFAULT",98:"CALLBACKNAME",99:"CALLBACKARGS",100:"HREF",101:"LINK_TARGET",102:"HEX",104:"INTERPOLATE",105:"NUM",106:"COMMA",109:"MINUS",110:"UNIT",111:"BRKT",112:"DOT",113:"PCT",114:"TAGSTART",118:"direction_tb",119:"direction_bt",120:"direction_rl",121:"direction_lr",122:"PUNCTUATION",123:"UNICODE_TEXT",124:"PLUS",125:"EQUALS",126:"MULT",127:"UNDERSCORE",129:"ARROW_CROSS",130:"ARROW_POINT",131:"ARROW_CIRCLE",132:"ARROW_OPEN",133:"QUOTE"},productions_:[0,[3,1],[3,2],[5,4],[5,6],[6,1],[7,1],[11,1],[8,1],[4,2],[17,0],[17,2],[18,1],[18,1],[18,1],[18,1],[18,1],[16,2],[16,2],[16,2],[16,3],[28,2],[28,1],[29,1],[29,1],[29,1],[27,1],[27,1],[27,2],[31,2],[31,2],[31,1],[31,1],[30,2],[30,1],[19,2],[19,2],[19,2],[19,2],[19,2],[19,2],[19,9],[19,6],[19,4],[19,1],[19,2],[19,2],[19,1],[9,1],[9,1],[9,1],[32,3],[32,4],[32,2],[32,1],[50,1],[50,5],[50,3],[51,4],[51,4],[51,6],[51,4],[51,4],[51,4],[51,8],[51,4],[51,4],[51,4],[51,6],[51,4],[51,4],[51,4],[51,4],[51,4],[51,1],[49,2],[49,3],[49,3],[49,1],[49,3],[78,1],[79,3],[39,1],[39,2],[39,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[93,1],[93,2],[35,5],[35,5],[36,5],[37,2],[37,4],[37,3],[37,5],[37,2],[37,4],[37,4],[37,6],[37,2],[37,4],[37,2],[37,4],[37,4],[37,6],[33,5],[33,5],[34,5],[34,5],[34,9],[34,9],[34,7],[34,7],[103,1],[103,3],[96,1],[96,3],[107,1],[107,2],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[94,1],[94,1],[94,1],[94,1],[54,1],[54,2],[97,1],[97,2],[117,1],[117,1],[117,1],[117,1],[43,1],[43,1],[43,1],[43,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 5:i.parseDirective("%%{","open_directive");break;case 6:i.parseDirective(a[o],"type_directive");break;case 7:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 8:i.parseDirective("}%%","close_directive","flowchart");break;case 10:case 36:case 37:case 38:case 39:case 40:this.$=[];break;case 11:(!Array.isArray(a[o])||a[o].length>0)&&a[o-1].push(a[o]),this.$=a[o-1];break;case 12:case 82:case 84:case 96:case 152:case 154:case 155:case 78:case 150:this.$=a[o];break;case 19:i.setDirection("TB"),this.$="TB";break;case 20:i.setDirection(a[o-1]),this.$=a[o-1];break;case 35:this.$=a[o-1].nodes;break;case 41:this.$=i.addSubGraph(a[o-6],a[o-1],a[o-4]);break;case 42:this.$=i.addSubGraph(a[o-3],a[o-1],a[o-3]);break;case 43:this.$=i.addSubGraph(void 0,a[o-1],void 0);break;case 45:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 46:case 47:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 51:i.addLink(a[o-2].stmt,a[o],a[o-1]),this.$={stmt:a[o],nodes:a[o].concat(a[o-2].nodes)};break;case 52:i.addLink(a[o-3].stmt,a[o-1],a[o-2]),this.$={stmt:a[o-1],nodes:a[o-1].concat(a[o-3].nodes)};break;case 53:this.$={stmt:a[o-1],nodes:a[o-1]};break;case 54:this.$={stmt:a[o],nodes:a[o]};break;case 55:case 123:case 125:this.$=[a[o]];break;case 56:this.$=a[o-4].concat(a[o]);break;case 57:this.$=[a[o-2]],i.setClass(a[o-2],a[o]);break;case 58:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"square");break;case 59:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"doublecircle");break;case 60:this.$=a[o-5],i.addVertex(a[o-5],a[o-2],"circle");break;case 61:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"ellipse");break;case 62:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"stadium");break;case 63:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"subroutine");break;case 64:this.$=a[o-7],i.addVertex(a[o-7],a[o-1],"rect",void 0,void 0,void 0,Object.fromEntries([[a[o-5],a[o-3]]]));break;case 65:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"cylinder");break;case 66:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"round");break;case 67:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"diamond");break;case 68:this.$=a[o-5],i.addVertex(a[o-5],a[o-2],"hexagon");break;case 69:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"odd");break;case 70:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"trapezoid");break;case 71:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"inv_trapezoid");break;case 72:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"lean_right");break;case 73:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"lean_left");break;case 74:this.$=a[o],i.addVertex(a[o]);break;case 75:a[o-1].text=a[o],this.$=a[o-1];break;case 76:case 77:a[o-2].text=a[o-1],this.$=a[o-2];break;case 79:var c=i.destructLink(a[o],a[o-2]);this.$={type:c.type,stroke:c.stroke,length:c.length,text:a[o-1]};break;case 80:c=i.destructLink(a[o]);this.$={type:c.type,stroke:c.stroke,length:c.length};break;case 81:this.$=a[o-1];break;case 83:case 97:case 153:case 151:this.$=a[o-1]+""+a[o];break;case 98:case 99:this.$=a[o-4],i.addClass(a[o-2],a[o]);break;case 100:this.$=a[o-4],i.setClass(a[o-2],a[o]);break;case 101:case 109:this.$=a[o-1],i.setClickEvent(a[o-1],a[o]);break;case 102:case 110:this.$=a[o-3],i.setClickEvent(a[o-3],a[o-2]),i.setTooltip(a[o-3],a[o]);break;case 103:this.$=a[o-2],i.setClickEvent(a[o-2],a[o-1],a[o]);break;case 104:this.$=a[o-4],i.setClickEvent(a[o-4],a[o-3],a[o-2]),i.setTooltip(a[o-4],a[o]);break;case 105:case 111:this.$=a[o-1],i.setLink(a[o-1],a[o]);break;case 106:case 112:this.$=a[o-3],i.setLink(a[o-3],a[o-2]),i.setTooltip(a[o-3],a[o]);break;case 107:case 113:this.$=a[o-3],i.setLink(a[o-3],a[o-2],a[o]);break;case 108:case 114:this.$=a[o-5],i.setLink(a[o-5],a[o-4],a[o]),i.setTooltip(a[o-5],a[o-2]);break;case 115:this.$=a[o-4],i.addVertex(a[o-2],void 0,void 0,a[o]);break;case 116:case 118:this.$=a[o-4],i.updateLink(a[o-2],a[o]);break;case 117:this.$=a[o-4],i.updateLink([a[o-2]],a[o]);break;case 119:this.$=a[o-8],i.updateLinkInterpolate([a[o-6]],a[o-2]),i.updateLink([a[o-6]],a[o]);break;case 120:this.$=a[o-8],i.updateLinkInterpolate(a[o-6],a[o-2]),i.updateLink(a[o-6],a[o]);break;case 121:this.$=a[o-6],i.updateLinkInterpolate([a[o-4]],a[o]);break;case 122:this.$=a[o-6],i.updateLinkInterpolate(a[o-4],a[o]);break;case 124:case 126:a[o-2].push(a[o]),this.$=a[o-2];break;case 128:this.$=a[o-1]+a[o];break;case 156:this.$="v";break;case 157:this.$="-";break;case 158:this.$={stmt:"dir",value:"TB"};break;case 159:this.$={stmt:"dir",value:"BT"};break;case 160:this.$={stmt:"dir",value:"RL"};break;case 161:this.$={stmt:"dir",value:"LR"}}},table:[{3:1,4:2,5:3,6:5,12:n,16:4,21:i,22:r,24:a},{1:[3]},{1:[2,1]},{3:10,4:2,5:3,6:5,12:n,16:4,21:i,22:r,24:a},e(s,o,{17:11}),{7:12,13:[1,13]},{16:14,21:i,22:r,24:a},{16:15,21:i,22:r,24:a},{25:[1,16],26:[1,17]},{13:[2,5]},{1:[2,2]},{1:[2,9],18:18,19:19,20:c,21:l,22:h,23:u,32:24,33:25,34:26,35:27,36:28,37:29,38:d,43:31,44:p,46:f,48:g,50:35,51:45,52:y,54:46,66:m,67:b,86:_,87:x,88:v,89:k,90:w,91:C,95:T,105:E,106:S,109:A,111:L,112:B,116:47,118:N,119:D,120:O,121:M,122:I,123:F,124:$,125:R,126:Z,127:P},{8:64,10:[1,65],15:j},e([10,15],[2,6]),e(s,[2,17]),e(s,[2,18]),e(s,[2,19]),{20:[1,68],21:[1,69],22:Y,27:67,30:70},e(z,[2,11]),e(z,[2,12]),e(z,[2,13]),e(z,[2,14]),e(z,[2,15]),e(z,[2,16]),{9:72,20:U,21:W,23:q,49:73,78:77,81:[1,78],82:[1,79]},{9:80,20:U,21:W,23:q},{9:81,20:U,21:W,23:q},{9:82,20:U,21:W,23:q},{9:83,20:U,21:W,23:q},{9:84,20:U,21:W,23:q},{9:86,20:U,21:W,22:[1,85],23:q},e(z,[2,44]),{45:[1,87]},{47:[1,88]},e(z,[2,47]),e(H,[2,54],{30:89,22:Y}),{22:[1,90]},{22:[1,91]},{22:[1,92]},{22:[1,93]},{26:V,52:G,66:X,67:Q,84:[1,97],91:K,97:96,98:[1,94],100:[1,95],105:J,106:tt,109:et,111:nt,112:it,115:100,117:98,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(z,[2,158]),e(z,[2,159]),e(z,[2,160]),e(z,[2,161]),e(ht,[2,55],{53:[1,116]}),e(ut,[2,74],{116:129,40:[1,117],52:y,55:[1,118],57:[1,119],59:[1,120],61:[1,121],63:[1,122],65:[1,123],66:m,67:b,69:[1,124],71:[1,125],73:[1,126],74:[1,127],76:[1,128],91:C,95:T,105:E,106:S,109:A,111:L,112:B,122:I,123:F,124:$,125:R,126:Z,127:P}),e(dt,[2,150]),e(dt,[2,175]),e(dt,[2,176]),e(dt,[2,177]),e(dt,[2,178]),e(dt,[2,179]),e(dt,[2,180]),e(dt,[2,181]),e(dt,[2,182]),e(dt,[2,183]),e(dt,[2,184]),e(dt,[2,185]),e(dt,[2,186]),e(dt,[2,187]),e(dt,[2,188]),e(dt,[2,189]),e(dt,[2,190]),{9:130,20:U,21:W,23:q},{11:131,14:[1,132]},e(pt,[2,8]),e(s,[2,20]),e(s,[2,26]),e(s,[2,27]),{21:[1,133]},e(ft,[2,34],{30:134,22:Y}),e(z,[2,35]),{50:135,51:45,52:y,54:46,66:m,67:b,91:C,95:T,105:E,106:S,109:A,111:L,112:B,116:47,122:I,123:F,124:$,125:R,126:Z,127:P},e(gt,[2,48]),e(gt,[2,49]),e(gt,[2,50]),e(yt,[2,78],{79:136,68:[1,138],80:[1,137]}),{22:mt,24:bt,26:_t,38:xt,39:139,42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:140,84:Ct,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e([52,66,67,68,80,91,95,105,106,109,111,112,122,123,124,125,126,127],[2,80]),e(z,[2,36]),e(z,[2,37]),e(z,[2,38]),e(z,[2,39]),e(z,[2,40]),{22:mt,24:bt,26:_t,38:xt,39:163,42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:140,84:Ct,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(Ft,o,{17:164}),e(z,[2,45]),e(z,[2,46]),e(H,[2,53],{52:$t}),{26:V,52:G,66:X,67:Q,91:K,97:166,102:[1,167],105:J,106:tt,109:et,111:nt,112:it,115:100,117:98,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{95:[1,168],103:169,105:[1,170]},{26:V,52:G,66:X,67:Q,91:K,95:[1,171],97:172,105:J,106:tt,109:et,111:nt,112:it,115:100,117:98,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{26:V,52:G,66:X,67:Q,91:K,97:173,105:J,106:tt,109:et,111:nt,112:it,115:100,117:98,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(pt,[2,101],{22:[1,174],99:[1,175]}),e(pt,[2,105],{22:[1,176]}),e(pt,[2,109],{115:100,117:178,22:[1,177],26:V,52:G,66:X,67:Q,91:K,105:J,106:tt,109:et,111:nt,112:it,122:rt,123:at,124:st,125:ot,126:ct,127:lt}),e(pt,[2,111],{22:[1,179]}),e(Rt,[2,152]),e(Rt,[2,154]),e(Rt,[2,155]),e(Rt,[2,156]),e(Rt,[2,157]),e(Zt,[2,162]),e(Zt,[2,163]),e(Zt,[2,164]),e(Zt,[2,165]),e(Zt,[2,166]),e(Zt,[2,167]),e(Zt,[2,168]),e(Zt,[2,169]),e(Zt,[2,170]),e(Zt,[2,171]),e(Zt,[2,172]),e(Zt,[2,173]),e(Zt,[2,174]),{52:y,54:180,66:m,67:b,91:C,95:T,105:E,106:S,109:A,111:L,112:B,116:47,122:I,123:F,124:$,125:R,126:Z,127:P},{22:mt,24:bt,26:_t,38:xt,39:181,42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:140,84:Ct,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:182,42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:140,84:Ct,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:184,42:vt,52:G,57:[1,183],66:X,67:Q,73:kt,81:wt,83:140,84:Ct,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:185,42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:140,84:Ct,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:186,42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:140,84:Ct,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:187,42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:140,84:Ct,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{66:[1,188]},{22:mt,24:bt,26:_t,38:xt,39:189,42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:140,84:Ct,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:190,42:vt,52:G,66:X,67:Q,71:[1,191],73:kt,81:wt,83:140,84:Ct,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:192,42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:140,84:Ct,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:193,42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:140,84:Ct,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:194,42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:140,84:Ct,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(dt,[2,151]),e(Pt,[2,3]),{8:195,15:j},{15:[2,7]},e(s,[2,28]),e(ft,[2,33]),e(H,[2,51],{30:196,22:Y}),e(yt,[2,75],{22:[1,197]}),{22:[1,198]},{22:mt,24:bt,26:_t,38:xt,39:199,42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:140,84:Ct,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,42:vt,52:G,66:X,67:Q,73:kt,81:wt,82:[1,200],83:201,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(Zt,[2,82]),e(Zt,[2,84]),e(Zt,[2,140]),e(Zt,[2,141]),e(Zt,[2,142]),e(Zt,[2,143]),e(Zt,[2,144]),e(Zt,[2,145]),e(Zt,[2,146]),e(Zt,[2,147]),e(Zt,[2,148]),e(Zt,[2,149]),e(Zt,[2,85]),e(Zt,[2,86]),e(Zt,[2,87]),e(Zt,[2,88]),e(Zt,[2,89]),e(Zt,[2,90]),e(Zt,[2,91]),e(Zt,[2,92]),e(Zt,[2,93]),e(Zt,[2,94]),e(Zt,[2,95]),{9:203,20:U,21:W,22:mt,23:q,24:bt,26:_t,38:xt,40:[1,202],42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:201,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{18:18,19:19,20:c,21:l,22:h,23:u,32:24,33:25,34:26,35:27,36:28,37:29,38:d,42:[1,204],43:31,44:p,46:f,48:g,50:35,51:45,52:y,54:46,66:m,67:b,86:_,87:x,88:v,89:k,90:w,91:C,95:T,105:E,106:S,109:A,111:L,112:B,116:47,118:N,119:D,120:O,121:M,122:I,123:F,124:$,125:R,126:Z,127:P},{22:Y,30:205},{22:[1,206],26:V,52:G,66:X,67:Q,91:K,105:J,106:tt,109:et,111:nt,112:it,115:100,117:178,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:[1,207]},{22:[1,208]},{22:[1,209],106:[1,210]},e(jt,[2,123]),{22:[1,211]},{22:[1,212],26:V,52:G,66:X,67:Q,91:K,105:J,106:tt,109:et,111:nt,112:it,115:100,117:178,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:[1,213],26:V,52:G,66:X,67:Q,91:K,105:J,106:tt,109:et,111:nt,112:it,115:100,117:178,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{84:[1,214]},e(pt,[2,103],{22:[1,215]}),{84:[1,216],101:[1,217]},{84:[1,218]},e(Rt,[2,153]),{84:[1,219],101:[1,220]},e(ht,[2,57],{116:129,52:y,66:m,67:b,91:C,95:T,105:E,106:S,109:A,111:L,112:B,122:I,123:F,124:$,125:R,126:Z,127:P}),{22:mt,24:bt,26:_t,38:xt,41:[1,221],42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:201,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,42:vt,52:G,56:[1,222],66:X,67:Q,73:kt,81:wt,83:201,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:223,42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:140,84:Ct,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,42:vt,52:G,58:[1,224],66:X,67:Q,73:kt,81:wt,83:201,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,42:vt,52:G,60:[1,225],66:X,67:Q,73:kt,81:wt,83:201,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,42:vt,52:G,62:[1,226],66:X,67:Q,73:kt,81:wt,83:201,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,42:vt,52:G,64:[1,227],66:X,67:Q,73:kt,81:wt,83:201,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{67:[1,228]},{22:mt,24:bt,26:_t,38:xt,42:vt,52:G,66:X,67:Q,70:[1,229],73:kt,81:wt,83:201,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,42:vt,52:G,66:X,67:Q,72:[1,230],73:kt,81:wt,83:201,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:231,42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:140,84:Ct,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,41:[1,232],42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:201,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,42:vt,52:G,66:X,67:Q,73:kt,75:[1,233],77:[1,234],81:wt,83:201,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,42:vt,52:G,66:X,67:Q,73:kt,75:[1,236],77:[1,235],81:wt,83:201,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{9:237,20:U,21:W,23:q},e(H,[2,52],{52:$t}),e(yt,[2,77]),e(yt,[2,76]),{22:mt,24:bt,26:_t,38:xt,42:vt,52:G,66:X,67:Q,68:[1,238],73:kt,81:wt,83:201,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(yt,[2,79]),e(Zt,[2,83]),{22:mt,24:bt,26:_t,38:xt,39:239,42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:140,84:Ct,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(Ft,o,{17:240}),e(z,[2,43]),{51:241,52:y,54:46,66:m,67:b,91:C,95:T,105:E,106:S,109:A,111:L,112:B,116:47,122:I,123:F,124:$,125:R,126:Z,127:P},{22:Yt,66:zt,67:Ut,86:Wt,96:242,102:qt,105:Ht,107:243,108:244,109:Vt,110:Gt,111:Xt,112:Qt,113:Kt},{22:Yt,66:zt,67:Ut,86:Wt,96:256,102:qt,105:Ht,107:243,108:244,109:Vt,110:Gt,111:Xt,112:Qt,113:Kt},{22:Yt,66:zt,67:Ut,86:Wt,96:257,102:qt,104:[1,258],105:Ht,107:243,108:244,109:Vt,110:Gt,111:Xt,112:Qt,113:Kt},{22:Yt,66:zt,67:Ut,86:Wt,96:259,102:qt,104:[1,260],105:Ht,107:243,108:244,109:Vt,110:Gt,111:Xt,112:Qt,113:Kt},{105:[1,261]},{22:Yt,66:zt,67:Ut,86:Wt,96:262,102:qt,105:Ht,107:243,108:244,109:Vt,110:Gt,111:Xt,112:Qt,113:Kt},{22:Yt,66:zt,67:Ut,86:Wt,96:263,102:qt,105:Ht,107:243,108:244,109:Vt,110:Gt,111:Xt,112:Qt,113:Kt},{26:V,52:G,66:X,67:Q,91:K,97:264,105:J,106:tt,109:et,111:nt,112:it,115:100,117:98,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(pt,[2,102]),{84:[1,265]},e(pt,[2,106],{22:[1,266]}),e(pt,[2,107]),e(pt,[2,110]),e(pt,[2,112],{22:[1,267]}),e(pt,[2,113]),e(ut,[2,58]),e(ut,[2,59]),{22:mt,24:bt,26:_t,38:xt,42:vt,52:G,58:[1,268],66:X,67:Q,73:kt,81:wt,83:201,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(ut,[2,66]),e(ut,[2,61]),e(ut,[2,62]),e(ut,[2,63]),{66:[1,269]},e(ut,[2,65]),e(ut,[2,67]),{22:mt,24:bt,26:_t,38:xt,42:vt,52:G,66:X,67:Q,72:[1,270],73:kt,81:wt,83:201,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(ut,[2,69]),e(ut,[2,70]),e(ut,[2,72]),e(ut,[2,71]),e(ut,[2,73]),e(Pt,[2,4]),e([22,52,66,67,91,95,105,106,109,111,112,122,123,124,125,126,127],[2,81]),{22:mt,24:bt,26:_t,38:xt,41:[1,271],42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:201,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{18:18,19:19,20:c,21:l,22:h,23:u,32:24,33:25,34:26,35:27,36:28,37:29,38:d,42:[1,272],43:31,44:p,46:f,48:g,50:35,51:45,52:y,54:46,66:m,67:b,86:_,87:x,88:v,89:k,90:w,91:C,95:T,105:E,106:S,109:A,111:L,112:B,116:47,118:N,119:D,120:O,121:M,122:I,123:F,124:$,125:R,126:Z,127:P},e(ht,[2,56]),e(pt,[2,115],{106:Jt}),e(te,[2,125],{108:274,22:Yt,66:zt,67:Ut,86:Wt,102:qt,105:Ht,109:Vt,110:Gt,111:Xt,112:Qt,113:Kt}),e(ee,[2,127]),e(ee,[2,129]),e(ee,[2,130]),e(ee,[2,131]),e(ee,[2,132]),e(ee,[2,133]),e(ee,[2,134]),e(ee,[2,135]),e(ee,[2,136]),e(ee,[2,137]),e(ee,[2,138]),e(ee,[2,139]),e(pt,[2,116],{106:Jt}),e(pt,[2,117],{106:Jt}),{22:[1,275]},e(pt,[2,118],{106:Jt}),{22:[1,276]},e(jt,[2,124]),e(pt,[2,98],{106:Jt}),e(pt,[2,99],{106:Jt}),e(pt,[2,100],{115:100,117:178,26:V,52:G,66:X,67:Q,91:K,105:J,106:tt,109:et,111:nt,112:it,122:rt,123:at,124:st,125:ot,126:ct,127:lt}),e(pt,[2,104]),{101:[1,277]},{101:[1,278]},{58:[1,279]},{68:[1,280]},{72:[1,281]},{9:282,20:U,21:W,23:q},e(z,[2,42]),{22:Yt,66:zt,67:Ut,86:Wt,102:qt,105:Ht,107:283,108:244,109:Vt,110:Gt,111:Xt,112:Qt,113:Kt},e(ee,[2,128]),{26:V,52:G,66:X,67:Q,91:K,97:284,105:J,106:tt,109:et,111:nt,112:it,115:100,117:98,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{26:V,52:G,66:X,67:Q,91:K,97:285,105:J,106:tt,109:et,111:nt,112:it,115:100,117:98,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(pt,[2,108]),e(pt,[2,114]),e(ut,[2,60]),{22:mt,24:bt,26:_t,38:xt,39:286,42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:140,84:Ct,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(ut,[2,68]),e(Ft,o,{17:287}),e(te,[2,126],{108:274,22:Yt,66:zt,67:Ut,86:Wt,102:qt,105:Ht,109:Vt,110:Gt,111:Xt,112:Qt,113:Kt}),e(pt,[2,121],{115:100,117:178,22:[1,288],26:V,52:G,66:X,67:Q,91:K,105:J,106:tt,109:et,111:nt,112:it,122:rt,123:at,124:st,125:ot,126:ct,127:lt}),e(pt,[2,122],{115:100,117:178,22:[1,289],26:V,52:G,66:X,67:Q,91:K,105:J,106:tt,109:et,111:nt,112:it,122:rt,123:at,124:st,125:ot,126:ct,127:lt}),{22:mt,24:bt,26:_t,38:xt,41:[1,290],42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:201,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{18:18,19:19,20:c,21:l,22:h,23:u,32:24,33:25,34:26,35:27,36:28,37:29,38:d,42:[1,291],43:31,44:p,46:f,48:g,50:35,51:45,52:y,54:46,66:m,67:b,86:_,87:x,88:v,89:k,90:w,91:C,95:T,105:E,106:S,109:A,111:L,112:B,116:47,118:N,119:D,120:O,121:M,122:I,123:F,124:$,125:R,126:Z,127:P},{22:Yt,66:zt,67:Ut,86:Wt,96:292,102:qt,105:Ht,107:243,108:244,109:Vt,110:Gt,111:Xt,112:Qt,113:Kt},{22:Yt,66:zt,67:Ut,86:Wt,96:293,102:qt,105:Ht,107:243,108:244,109:Vt,110:Gt,111:Xt,112:Qt,113:Kt},e(ut,[2,64]),e(z,[2,41]),e(pt,[2,119],{106:Jt}),e(pt,[2,120],{106:Jt})],defaultActions:{2:[2,1],9:[2,5],10:[2,2],132:[2,7]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=a.slice.call(arguments,1),u=Object.create(this.lexer),d={yy:{}};for(var p in this.yy)Object.prototype.hasOwnProperty.call(this.yy,p)&&(d.yy[p]=this.yy[p]);u.setInput(t,d.yy),d.yy.lexer=u,d.yy.parser=this,void 0===u.yylloc&&(u.yylloc={});var f=u.yylloc;a.push(f);var g=u.options&&u.options.ranges;function y(){var t;return"number"!=typeof(t=i.pop()||u.lex()||1)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof d.yy.parseError?this.parseError=d.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var m,b,_,x,v,k,w,C,T={};;){if(b=n[n.length-1],this.defaultActions[b]?_=this.defaultActions[b]:(null==m&&(m=y()),_=s[b]&&s[b][m]),void 0===_||!_.length||!_[0]){var E="";for(v in C=[],s[b])this.terminals_[v]&&v>2&&C.push("'"+this.terminals_[v]+"'");E=u.showPosition?"Parse error on line "+(c+1)+":\n"+u.showPosition()+"\nExpecting "+C.join(", ")+", got '"+(this.terminals_[m]||m)+"'":"Parse error on line "+(c+1)+": Unexpected "+(1==m?"end of input":"'"+(this.terminals_[m]||m)+"'"),this.parseError(E,{text:u.match,token:this.terminals_[m]||m,line:u.yylineno,loc:f,expected:C})}if(_[0]instanceof Array&&_.length>1)throw new Error("Parse Error: multiple actions possible at state: "+b+", token: "+m);switch(_[0]){case 1:n.push(m),r.push(u.yytext),a.push(u.yylloc),n.push(_[1]),m=null,l=u.yyleng,o=u.yytext,c=u.yylineno,f=u.yylloc;break;case 2:if(k=this.productions_[_[1]][1],T.$=r[r.length-k],T._$={first_line:a[a.length-(k||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(k||1)].first_column,last_column:a[a.length-1].last_column},g&&(T._$.range=[a[a.length-(k||1)].range[0],a[a.length-1].range[1]]),void 0!==(x=this.performAction.apply(T,[o,l,c,d.yy,_[1],r,a].concat(h))))return x;k&&(n=n.slice(0,-1*k*2),r=r.slice(0,-1*k),a=a.slice(0,-1*k)),n.push(this.productions_[_[1]][0]),r.push(T.$),a.push(T._$),w=s[n[n.length-2]][n[n.length-1]],n.push(w);break;case 3:return!0}}return!0}},ie=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),12;case 1:return this.begin("type_directive"),13;case 2:return this.popState(),this.begin("arg_directive"),10;case 3:return this.popState(),this.popState(),15;case 4:return 14;case 5:case 6:break;case 7:return this.begin("acc_title"),44;case 8:return this.popState(),"acc_title_value";case 9:return this.begin("acc_descr"),46;case 10:return this.popState(),"acc_descr_value";case 11:this.begin("acc_descr_multiline");break;case 12:case 15:case 24:case 27:case 30:case 33:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:this.begin("string");break;case 16:return"STR";case 17:return 86;case 18:return 95;case 19:return 87;case 20:return 104;case 21:return 88;case 22:return 89;case 23:this.begin("href");break;case 25:return 100;case 26:this.begin("callbackname");break;case 28:this.popState(),this.begin("callbackargs");break;case 29:return 98;case 31:return 99;case 32:this.begin("click");break;case 34:return 90;case 35:case 36:case 37:return t.lex.firstGraph()&&this.begin("dir"),24;case 38:return 38;case 39:return 42;case 40:case 41:case 42:case 43:return 101;case 44:return this.popState(),25;case 45:case 46:case 47:case 48:case 49:case 50:case 51:case 52:case 53:case 54:return this.popState(),26;case 55:return 118;case 56:return 119;case 57:return 120;case 58:return 121;case 59:return 105;case 60:return 111;case 61:return 53;case 62:return 67;case 63:return 52;case 64:return 20;case 65:return 106;case 66:return 126;case 67:case 68:case 69:return 82;case 70:case 71:case 72:return 81;case 73:return 59;case 74:return 60;case 75:return 61;case 76:return 62;case 77:return 63;case 78:return 64;case 79:return 65;case 80:return 69;case 81:return 70;case 82:return 55;case 83:return 56;case 84:return 109;case 85:return 112;case 86:return 127;case 87:return 124;case 88:return 113;case 89:case 90:return 125;case 91:return 114;case 92:return 73;case 93:return 92;case 94:return"SEP";case 95:return 91;case 96:return 66;case 97:return 75;case 98:return 74;case 99:return 77;case 100:return 76;case 101:return 122;case 102:return 123;case 103:return 68;case 104:return 57;case 105:return 58;case 106:return 40;case 107:return 41;case 108:return 71;case 109:return 72;case 110:return 133;case 111:return 21;case 112:return 22;case 113:return 23}},rules:[/^(?:%%\{)/,/^(?:((?:(?!\}%%)[^:.])*))/,/^(?::)/,/^(?:\}%%)/,/^(?:((?:(?!\}%%).|\n)*))/,/^(?:%%(?!\{)[^\n]*)/,/^(?:[^\}]%%[^\n]*)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:style\b)/,/^(?:default\b)/,/^(?:linkStyle\b)/,/^(?:interpolate\b)/,/^(?:classDef\b)/,/^(?:class\b)/,/^(?:href[\s]+["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:call[\s]+)/,/^(?:\([\s]*\))/,/^(?:\()/,/^(?:[^(]*)/,/^(?:\))/,/^(?:[^)]*)/,/^(?:click[\s]+)/,/^(?:[\s\n])/,/^(?:[^\s\n]*)/,/^(?:flowchart-elk\b)/,/^(?:graph\b)/,/^(?:flowchart\b)/,/^(?:subgraph\b)/,/^(?:end\b\s*)/,/^(?:_self\b)/,/^(?:_blank\b)/,/^(?:_parent\b)/,/^(?:_top\b)/,/^(?:(\r?\n)*\s*\n)/,/^(?:\s*LR\b)/,/^(?:\s*RL\b)/,/^(?:\s*TB\b)/,/^(?:\s*BT\b)/,/^(?:\s*TD\b)/,/^(?:\s*BR\b)/,/^(?:\s*<)/,/^(?:\s*>)/,/^(?:\s*\^)/,/^(?:\s*v\b)/,/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:[0-9]+)/,/^(?:#)/,/^(?::::)/,/^(?::)/,/^(?:&)/,/^(?:;)/,/^(?:,)/,/^(?:\*)/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?:\s*[xo<]?--\s*)/,/^(?:\s*[xo<]?==\s*)/,/^(?:\s*[xo<]?-\.\s*)/,/^(?:\(-)/,/^(?:-\))/,/^(?:\(\[)/,/^(?:\]\))/,/^(?:\[\[)/,/^(?:\]\])/,/^(?:\[\|)/,/^(?:\[\()/,/^(?:\)\])/,/^(?:\(\(\()/,/^(?:\)\)\))/,/^(?:-)/,/^(?:\.)/,/^(?:[\_])/,/^(?:\+)/,/^(?:%)/,/^(?:=)/,/^(?:=)/,/^(?:<)/,/^(?:>)/,/^(?:\^)/,/^(?:\\\|)/,/^(?:v\b)/,/^(?:[A-Za-z]+)/,/^(?:\\\])/,/^(?:\[\/)/,/^(?:\/\])/,/^(?:\[\\)/,/^(?:[!"#$%&'*+,-.`?\\_/])/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\|)/,/^(?:\()/,/^(?:\))/,/^(?:\[)/,/^(?:\])/,/^(?:\{)/,/^(?:\})/,/^(?:")/,/^(?:(\r?\n)+)/,/^(?:\s)/,/^(?:$)/],conditions:{close_directive:{rules:[],inclusive:!1},arg_directive:{rules:[3,4],inclusive:!1},type_directive:{rules:[2,3],inclusive:!1},open_directive:{rules:[1],inclusive:!1},callbackargs:{rules:[30,31],inclusive:!1},callbackname:{rules:[27,28,29],inclusive:!1},href:{rules:[24,25],inclusive:!1},click:{rules:[33,34],inclusive:!1},vertex:{rules:[],inclusive:!1},dir:{rules:[44,45,46,47,48,49,50,51,52,53,54],inclusive:!1},acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},string:{rules:[15,16],inclusive:!1},INITIAL:{rules:[0,5,6,7,9,11,14,17,18,19,20,21,22,23,26,32,35,36,37,38,39,40,41,42,43,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113],inclusive:!0}}},t);function re(){this.yy={}}return ne.lexer=ie,re.prototype=ne,ne.Parser=re,new re}();wo.parser=wo;const Co=wo,To=(t,e)=>{var n,i;return"dagre-wrapper"!==(null==(n=null==e?void 0:e.flowchart)?void 0:n.defaultRenderer)&&("elk"!==(null==(i=null==e?void 0:e.flowchart)?void 0:i.defaultRenderer)&&null!==t.match(/^\s*graph/))},Eo=(t,e)=>{var n,i;return"dagre-d3"!==(null==(n=null==e?void 0:e.flowchart)?void 0:n.defaultRenderer)&&("elk"!==(null==(i=null==e?void 0:e.flowchart)?void 0:i.defaultRenderer)&&(null!==t.match(/^\s*graph/)||null!==t.match(/^\s*flowchart/)))};let So,Ao,Lo=0,Bo=ui(),No={},Do=[],Oo={},Mo=[],Io={},Fo={},$o=0,Ro=!0,Zo=[];const Po=t=>jt.sanitizeText(t,Bo),jo=function(t,e,n){xp.parseDirective(this,t,e,n)},Yo=function(t){const e=Object.keys(No);for(const n of e)if(No[n].id===t)return No[n].domId;return t},zo=function(t,e,n,i,r,a,s={}){let o,c=t;void 0!==c&&0!==c.trim().length&&(void 0===No[c]&&(No[c]={id:c,domId:"flowchart-"+c+"-"+Lo,styles:[],classes:[]}),Lo++,void 0!==e?(Bo=ui(),o=Po(e.trim()),'"'===o[0]&&'"'===o[o.length-1]&&(o=o.substring(1,o.length-1)),No[c].text=o):void 0===No[c].text&&(No[c].text=t),void 0!==n&&(No[c].type=n),null!=i&&i.forEach((function(t){No[c].styles.push(t)})),null!=r&&r.forEach((function(t){No[c].classes.push(t)})),void 0!==a&&(No[c].dir=a),void 0===No[c].props?No[c].props=s:void 0!==s&&Object.assign(No[c].props,s))},Uo=function(t,e,n,i){const r={start:t,end:e,type:void 0,text:""};void 0!==(i=n.text)&&(r.text=Po(i.trim()),'"'===r.text[0]&&'"'===r.text[r.text.length-1]&&(r.text=r.text.substring(1,r.text.length-1))),void 0!==n&&(r.type=n.type,r.stroke=n.stroke,r.length=n.length),Do.push(r)},Wo=function(t,e,n,i){let r,a;for(r=0;r<t.length;r++)for(a=0;a<e.length;a++)Uo(t[r],e[a],n,i)},qo=function(t,e){t.forEach((function(t){"default"===t?Do.defaultInterpolate=e:Do[t].interpolate=e}))},Ho=function(t,e){t.forEach((function(t){"default"===t?Do.defaultStyle=e:(-1===ei.isSubstringInArray("fill",e)&&e.push("fill:none"),Do[t].style=e)}))},Vo=function(t,e){void 0===Oo[t]&&(Oo[t]={id:t,styles:[],textStyles:[]}),null!=e&&e.forEach((function(e){if(e.match("color")){const n=e.replace("fill","bgFill").replace("color","fill");Oo[t].textStyles.push(n)}Oo[t].styles.push(e)}))},Go=function(t){So=t,So.match(/.*</)&&(So="RL"),So.match(/.*\^/)&&(So="BT"),So.match(/.*>/)&&(So="LR"),So.match(/.*v/)&&(So="TB"),"TD"===So&&(So="TB")},Xo=function(t,e){t.split(",").forEach((function(t){let n=t;void 0!==No[n]&&No[n].classes.push(e),void 0!==Io[n]&&Io[n].classes.push(e)}))},Qo=function(t,e,n){t.split(",").forEach((function(t){void 0!==No[t]&&(No[t].link=ei.formatUrl(e,Bo),No[t].linkTarget=n)})),Xo(t,"clickable")},Ko=function(t){return Fo[t]},Jo=function(t,e,n){t.split(",").forEach((function(t){!function(t,e,n){let i=Yo(t);if("loose"!==ui().securityLevel)return;if(void 0===e)return;let r=[];if("string"==typeof n){r=n.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let t=0;t<r.length;t++){let e=r[t].trim();'"'===e.charAt(0)&&'"'===e.charAt(e.length-1)&&(e=e.substr(1,e.length-2)),r[t]=e}}0===r.length&&r.push(t),void 0!==No[t]&&(No[t].haveCallback=!0,Zo.push((function(){const t=document.querySelector(`[id="${i}"]`);null!==t&&t.addEventListener("click",(function(){ei.runFunc(e,...r)}),!1)})))}(t,e,n)})),Xo(t,"clickable")},tc=function(t){Zo.forEach((function(e){e(t)}))},ec=function(){return So.trim()},nc=function(){return No},ic=function(){return Do},rc=function(){return Oo},ac=function(t){let e=(0,o.Ys)(".mermaidTooltip");null===(e._groups||e)[0][0]&&(e=(0,o.Ys)("body").append("div").attr("class","mermaidTooltip").style("opacity",0));(0,o.Ys)(t).select("svg").selectAll("g.node").on("mouseover",(function(){const t=(0,o.Ys)(this);if(null===t.attr("title"))return;const n=this.getBoundingClientRect();e.transition().duration(200).style("opacity",".9"),e.text(t.attr("title")).style("left",window.scrollX+n.left+(n.right-n.left)/2+"px").style("top",window.scrollY+n.top-14+document.body.scrollTop+"px"),e.html(e.html().replace(/<br\/>/g,"<br/>")),t.classed("hover",!0)})).on("mouseout",(function(){e.transition().duration(500).style("opacity",0);(0,o.Ys)(this).classed("hover",!1)}))};Zo.push(ac);const sc=function(t="gen-1"){No={},Oo={},Do=[],Zo=[ac],Mo=[],Io={},$o=0,Fo=[],Ro=!0,Ao=t,Ri()},oc=t=>{Ao=t||"gen-2"},cc=function(){return"fill:#ffa;stroke: #f66; stroke-width: 3px; stroke-dasharray: 5, 5;fill:#ffa;stroke: #666;"},lc=function(t,e,n){let i=t.trim(),r=n;t===n&&n.match(/\s/)&&(i=void 0);let a=[];const{nodeList:s,dir:o}=function(t){const e={boolean:{},number:{},string:{}},n=[];let i;return{nodeList:t.filter((function(t){const r=typeof t;return t.stmt&&"dir"===t.stmt?(i=t.value,!1):""!==t.trim()&&(r in e?!e[r].hasOwnProperty(t)&&(e[r][t]=!0):!n.includes(t)&&n.push(t))})),dir:i}}(a.concat.apply(a,e));if(a=s,"gen-1"===Ao)for(let l=0;l<a.length;l++)a[l]=Yo(a[l]);i=i||"subGraph"+$o,r=r||"",r=Po(r),$o+=1;const c={id:i,nodes:a,title:r.trim(),classes:[],dir:o};return Bt.info("Adding",c.id,c.nodes,c.dir),c.nodes=xc(c,Mo).nodes,Mo.push(c),Io[i]=c,i},hc=function(t){for(const[e,n]of Mo.entries())if(n.id===t)return e;return-1};let uc=-1;const dc=[],pc=function(t,e){const n=Mo[e].nodes;if(uc+=1,uc>2e3)return;if(dc[uc]=e,Mo[e].id===t)return{result:!0,count:0};let i=0,r=1;for(;i<n.length;){const e=hc(n[i]);if(e>=0){const n=pc(t,e);if(n.result)return{result:!0,count:r+n.count};r+=n.count}i+=1}return{result:!1,count:r}},fc=function(t){return dc[t]},gc=function(){uc=-1,Mo.length>0&&pc("none",Mo.length-1)},yc=function(){return Mo},mc=()=>!!Ro&&(Ro=!1,!0),bc=(t,e)=>{const n=(t=>{const e=t.trim();let n=e.slice(0,-1),i="arrow_open";switch(e.slice(-1)){case"x":i="arrow_cross","x"===e[0]&&(i="double_"+i,n=n.slice(1));break;case">":i="arrow_point","<"===e[0]&&(i="double_"+i,n=n.slice(1));break;case"o":i="arrow_circle","o"===e[0]&&(i="double_"+i,n=n.slice(1))}let r="normal",a=n.length-1;"="===n[0]&&(r="thick");let s=((t,e)=>{const n=e.length;let i=0;for(let r=0;r<n;++r)e[r]===t&&++i;return i})(".",n);return s&&(r="dotted",a=s),{type:i,stroke:r,length:a}})(t);let i;if(e){if(i=(t=>{let e=t.trim(),n="arrow_open";switch(e[0]){case"<":n="arrow_point",e=e.slice(1);break;case"x":n="arrow_cross",e=e.slice(1);break;case"o":n="arrow_circle",e=e.slice(1)}let i="normal";return e.includes("=")&&(i="thick"),e.includes(".")&&(i="dotted"),{type:n,stroke:i}})(e),i.stroke!==n.stroke)return{type:"INVALID",stroke:"INVALID"};if("arrow_open"===i.type)i.type=n.type;else{if(i.type!==n.type)return{type:"INVALID",stroke:"INVALID"};i.type="double_"+i.type}return"double_arrow"===i.type&&(i.type="double_arrow_point"),i.length=n.length,i}return n},_c=(t,e)=>{let n=!1;return t.forEach((t=>{t.nodes.indexOf(e)>=0&&(n=!0)})),n},xc=(t,e)=>{const n=[];return t.nodes.forEach(((i,r)=>{_c(e,i)||n.push(t.nodes[r])})),{nodes:n}},vc={firstGraph:mc},kc={parseDirective:jo,defaultConfig:()=>ii.flowchart,setAccTitle:Zi,getAccTitle:Pi,getAccDescription:Yi,setAccDescription:ji,addVertex:zo,lookUpDomId:Yo,addLink:Wo,updateLinkInterpolate:qo,updateLink:Ho,addClass:Vo,setDirection:Go,setClass:Xo,setTooltip:function(t,e){t.split(",").forEach((function(t){void 0!==e&&(Fo["gen-1"===Ao?Yo(t):t]=Po(e))}))},getTooltip:Ko,setClickEvent:Jo,setLink:Qo,bindFunctions:tc,getDirection:ec,getVertices:nc,getEdges:ic,getClasses:rc,clear:sc,setGen:oc,defaultStyle:cc,addSubGraph:lc,getDepthFirstPos:fc,indexNodes:gc,getSubGraphs:yc,destructLink:bc,lex:vc,exists:_c,makeUniq:xc,setDiagramTitle:zi,getDiagramTitle:Ui},wc=Object.freeze(Object.defineProperty({__proto__:null,addClass:Vo,addLink:Wo,addSingleLink:Uo,addSubGraph:lc,addVertex:zo,bindFunctions:tc,clear:sc,default:kc,defaultStyle:cc,destructLink:bc,firstGraph:mc,getClasses:rc,getDepthFirstPos:fc,getDirection:ec,getEdges:ic,getSubGraphs:yc,getTooltip:Ko,getVertices:nc,indexNodes:gc,lex:vc,lookUpDomId:Yo,parseDirective:jo,setClass:Xo,setClickEvent:Jo,setDirection:Go,setGen:oc,setLink:Qo,updateLink:Ho,updateLinkInterpolate:qo},Symbol.toStringTag,{value:"Module"}));const Cc={},Tc=function(t){const e=Object.keys(t);for(const n of e)Cc[n]=t[n]},Ec={},Sc=function(t,e,n,i,r,a){const s=i.select(`[id="${n}"]`);Object.keys(t).forEach((function(n){const i=t[n];let o="default";i.classes.length>0&&(o=i.classes.join(" "));const c=Pn(i.styles);let l,h=void 0!==i.text?i.text:i.id;if(Zt(ui().flowchart.htmlLabels)){const t={label:h.replace(/fa[blrs]?:fa-[\w-]+/g,(t=>`<i class='${t.replace(":"," ")}'></i>`))};l=(0,vt.a)(s,t).node(),l.parentNode.removeChild(l)}else{const t=r.createElementNS("http://www.w3.org/2000/svg","text");t.setAttribute("style",c.labelStyle.replace("color:","fill:"));const e=h.split(jt.lineBreakRegex);for(const n of e){const e=r.createElementNS("http://www.w3.org/2000/svg","tspan");e.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),e.setAttribute("dy","1em"),e.setAttribute("x","1"),e.textContent=n,t.appendChild(e)}l=t}let u=0,d="";switch(i.type){case"round":u=5,d="rect";break;case"square":case"group":default:d="rect";break;case"diamond":d="question";break;case"hexagon":d="hexagon";break;case"odd":case"odd_right":d="rect_left_inv_arrow";break;case"lean_right":d="lean_right";break;case"lean_left":d="lean_left";break;case"trapezoid":d="trapezoid";break;case"inv_trapezoid":d="inv_trapezoid";break;case"circle":d="circle";break;case"ellipse":d="ellipse";break;case"stadium":d="stadium";break;case"subroutine":d="subroutine";break;case"cylinder":d="cylinder";break;case"doublecircle":d="doublecircle"}e.setNode(i.id,{labelStyle:c.labelStyle,shape:d,labelText:h,rx:u,ry:u,class:o,style:c.style,id:i.id,link:i.link,linkTarget:i.linkTarget,tooltip:a.db.getTooltip(i.id)||"",domId:a.db.lookUpDomId(i.id),haveCallback:i.haveCallback,width:"group"===i.type?500:void 0,dir:i.dir,type:i.type,props:i.props,padding:ui().flowchart.padding}),Bt.info("setNode",{labelStyle:c.labelStyle,shape:d,labelText:h,rx:u,ry:u,class:o,style:c.style,id:i.id,domId:a.db.lookUpDomId(i.id),width:"group"===i.type?500:void 0,type:i.type,dir:i.dir,props:i.props,padding:ui().flowchart.padding})}))},Ac=function(t,e,n){Bt.info("abc78 edges = ",t);let i,r,a=0,s={};if(void 0!==t.defaultStyle){const e=Pn(t.defaultStyle);i=e.style,r=e.labelStyle}t.forEach((function(n){a++;var c="L-"+n.start+"-"+n.end;void 0===s[c]?(s[c]=0,Bt.info("abc78 new entry",c,s[c])):(s[c]++,Bt.info("abc78 new entry",c,s[c]));let l=c+"-"+s[c];Bt.info("abc78 new link id to be used is",c,l,s[c]);var h="LS-"+n.start,u="LE-"+n.end;const d={style:"",labelStyle:""};switch(d.minlen=n.length||1,"arrow_open"===n.type?d.arrowhead="none":d.arrowhead="normal",d.arrowTypeStart="arrow_open",d.arrowTypeEnd="arrow_open",n.type){case"double_arrow_cross":d.arrowTypeStart="arrow_cross";case"arrow_cross":d.arrowTypeEnd="arrow_cross";break;case"double_arrow_point":d.arrowTypeStart="arrow_point";case"arrow_point":d.arrowTypeEnd="arrow_point";break;case"double_arrow_circle":d.arrowTypeStart="arrow_circle";case"arrow_circle":d.arrowTypeEnd="arrow_circle"}let p="",f="";switch(n.stroke){case"normal":p="fill:none;",void 0!==i&&(p=i),void 0!==r&&(f=r),d.thickness="normal",d.pattern="solid";break;case"dotted":d.thickness="normal",d.pattern="dotted",d.style="fill:none;stroke-width:2px;stroke-dasharray:3;";break;case"thick":d.thickness="thick",d.pattern="solid",d.style="stroke-width: 3.5px;fill:none;"}if(void 0!==n.style){const t=Pn(n.style);p=t.style,f=t.labelStyle}d.style=d.style+=p,d.labelStyle=d.labelStyle+=f,void 0!==n.interpolate?d.curve=Rn(n.interpolate,o.c_6):void 0!==t.defaultInterpolate?d.curve=Rn(t.defaultInterpolate,o.c_6):d.curve=Rn(Ec.curve,o.c_6),void 0===n.text?void 0!==n.style&&(d.arrowheadStyle="fill: #333"):(d.arrowheadStyle="fill: #333",d.labelpos="c"),d.labelType="text",d.label=n.text.replace(jt.lineBreakRegex,"\n"),void 0===n.style&&(d.style=d.style||"stroke: #333; stroke-width: 1.5px;fill:none;"),d.labelStyle=d.labelStyle.replace("color:","fill:"),d.id=l,d.classes="flowchart-link "+h+" "+u,e.setEdge(n.start,n.end,d,a)}))},Lc={setConf:function(t){const e=Object.keys(t);for(const n of e)Ec[n]=t[n]},addVertices:Sc,addEdges:Ac,getClasses:function(t,e){Bt.info("Extracting classes"),e.db.clear();try{return e.parse(t),e.db.getClasses()}catch(n){return}},draw:function(t,e,n,i){Bt.info("Drawing flowchart"),i.db.clear(),kc.setGen("gen-2"),i.parser.parse(t);let r=i.db.getDirection();void 0===r&&(r="TD");const{securityLevel:a,flowchart:s}=ui(),c=s.nodeSpacing||50,l=s.rankSpacing||50;let h;"sandbox"===a&&(h=(0,o.Ys)("#i"+e));const u="sandbox"===a?(0,o.Ys)(h.nodes()[0].contentDocument.body):(0,o.Ys)("body"),d="sandbox"===a?h.nodes()[0].contentDocument:document,p=new lt.k({multigraph:!0,compound:!0}).setGraph({rankdir:r,nodesep:c,ranksep:l,marginx:0,marginy:0}).setDefaultEdgeLabel((function(){return{}}));let f;const g=i.db.getSubGraphs();Bt.info("Subgraphs - ",g);for(let o=g.length-1;o>=0;o--)f=g[o],Bt.info("Subgraph - ",f),i.db.addVertex(f.id,f.title,"group",void 0,f.classes,f.dir);const y=i.db.getVertices(),m=i.db.getEdges();Bt.info("Edges",m);let b=0;for(b=g.length-1;b>=0;b--){f=g[b],(0,o.td_)("cluster").append("text");for(let t=0;t<f.nodes.length;t++)Bt.info("Setting up subgraphs",f.nodes[t],f.id),p.setParent(f.nodes[t],f.id)}Sc(y,p,e,u,d,i),Ac(m,p);const _=u.select(`[id="${e}"]`),x=u.select("#"+e+" g");if(Ks(x,p,["point","circle","cross"],"flowchart",e),ei.insertTitle(_,"flowchartTitleText",s.titleTopMargin,i.db.getDiagramTitle()),_i(p,_,s.diagramPadding,s.useMaxWidth),i.db.indexNodes("subGraph"+b),!s.htmlLabels){const t=d.querySelectorAll('[id="'+e+'"] .edgeLabel .label');for(const e of t){const t=e.getBBox(),n=d.createElementNS("http://www.w3.org/2000/svg","rect");n.setAttribute("rx",0),n.setAttribute("ry",0),n.setAttribute("width",t.width),n.setAttribute("height",t.height),e.insertBefore(n,e.firstChild)}}Object.keys(y).forEach((function(t){const n=y[t];if(n.link){const i=(0,o.Ys)("#"+e+' [id="'+t+'"]');if(i){const t=d.createElementNS("http://www.w3.org/2000/svg","a");t.setAttributeNS("http://www.w3.org/2000/svg","class",n.classes.join(" ")),t.setAttributeNS("http://www.w3.org/2000/svg","href",n.link),t.setAttributeNS("http://www.w3.org/2000/svg","rel","noopener"),"sandbox"===a?t.setAttributeNS("http://www.w3.org/2000/svg","target","_top"):n.linkTarget&&t.setAttributeNS("http://www.w3.org/2000/svg","target",n.linkTarget);const e=i.insert((function(){return t}),":first-child"),r=i.select(".label-container");r&&e.append((function(){return r.node()}));const s=i.select(".label");s&&e.append((function(){return s.node()}))}}}))}};var Bc=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,3],i=[1,5],r=[7,9,11,12,13,14,15,16,17,18,19,20,21,23,25,26,28,35,40],a=[1,15],s=[1,16],o=[1,17],c=[1,18],l=[1,19],h=[1,20],u=[1,21],d=[1,22],p=[1,23],f=[1,24],g=[1,25],y=[1,26],m=[1,27],b=[1,29],_=[1,31],x=[1,34],v=[5,7,9,11,12,13,14,15,16,17,18,19,20,21,23,25,26,28,35,40],k={trace:function(){},yy:{},symbols_:{error:2,start:3,directive:4,gantt:5,document:6,EOF:7,line:8,SPACE:9,statement:10,NL:11,dateFormat:12,inclusiveEndDates:13,topAxis:14,axisFormat:15,tickInterval:16,excludes:17,includes:18,todayMarker:19,title:20,acc_title:21,acc_title_value:22,acc_descr:23,acc_descr_value:24,acc_descr_multiline_value:25,section:26,clickStatement:27,taskTxt:28,taskData:29,openDirective:30,typeDirective:31,closeDirective:32,":":33,argDirective:34,click:35,callbackname:36,callbackargs:37,href:38,clickStatementDebug:39,open_directive:40,type_directive:41,arg_directive:42,close_directive:43,$accept:0,$end:1},terminals_:{2:"error",5:"gantt",7:"EOF",9:"SPACE",11:"NL",12:"dateFormat",13:"inclusiveEndDates",14:"topAxis",15:"axisFormat",16:"tickInterval",17:"excludes",18:"includes",19:"todayMarker",20:"title",21:"acc_title",22:"acc_title_value",23:"acc_descr",24:"acc_descr_value",25:"acc_descr_multiline_value",26:"section",28:"taskTxt",29:"taskData",33:":",35:"click",36:"callbackname",37:"callbackargs",38:"href",40:"open_directive",41:"type_directive",42:"arg_directive",43:"close_directive"},productions_:[0,[3,2],[3,3],[6,0],[6,2],[8,2],[8,1],[8,1],[8,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,2],[10,2],[10,1],[10,1],[10,1],[10,2],[10,1],[4,4],[4,6],[27,2],[27,3],[27,3],[27,4],[27,3],[27,4],[27,2],[39,2],[39,3],[39,3],[39,4],[39,3],[39,4],[39,2],[30,1],[31,1],[34,1],[32,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 2:return a[o-1];case 3:case 7:case 8:this.$=[];break;case 4:a[o-1].push(a[o]),this.$=a[o-1];break;case 5:case 6:this.$=a[o];break;case 9:i.setDateFormat(a[o].substr(11)),this.$=a[o].substr(11);break;case 10:i.enableInclusiveEndDates(),this.$=a[o].substr(18);break;case 11:i.TopAxis(),this.$=a[o].substr(8);break;case 12:i.setAxisFormat(a[o].substr(11)),this.$=a[o].substr(11);break;case 13:i.setTickInterval(a[o].substr(13)),this.$=a[o].substr(13);break;case 14:i.setExcludes(a[o].substr(9)),this.$=a[o].substr(9);break;case 15:i.setIncludes(a[o].substr(9)),this.$=a[o].substr(9);break;case 16:i.setTodayMarker(a[o].substr(12)),this.$=a[o].substr(12);break;case 17:i.setDiagramTitle(a[o].substr(6)),this.$=a[o].substr(6);break;case 18:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 19:case 20:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 21:i.addSection(a[o].substr(8)),this.$=a[o].substr(8);break;case 23:i.addTask(a[o-1],a[o]),this.$="task";break;case 27:this.$=a[o-1],i.setClickEvent(a[o-1],a[o],null);break;case 28:this.$=a[o-2],i.setClickEvent(a[o-2],a[o-1],a[o]);break;case 29:this.$=a[o-2],i.setClickEvent(a[o-2],a[o-1],null),i.setLink(a[o-2],a[o]);break;case 30:this.$=a[o-3],i.setClickEvent(a[o-3],a[o-2],a[o-1]),i.setLink(a[o-3],a[o]);break;case 31:this.$=a[o-2],i.setClickEvent(a[o-2],a[o],null),i.setLink(a[o-2],a[o-1]);break;case 32:this.$=a[o-3],i.setClickEvent(a[o-3],a[o-1],a[o]),i.setLink(a[o-3],a[o-2]);break;case 33:this.$=a[o-1],i.setLink(a[o-1],a[o]);break;case 34:case 40:this.$=a[o-1]+" "+a[o];break;case 35:case 36:case 38:this.$=a[o-2]+" "+a[o-1]+" "+a[o];break;case 37:case 39:this.$=a[o-3]+" "+a[o-2]+" "+a[o-1]+" "+a[o];break;case 41:i.parseDirective("%%{","open_directive");break;case 42:i.parseDirective(a[o],"type_directive");break;case 43:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 44:i.parseDirective("}%%","close_directive","gantt")}},table:[{3:1,4:2,5:n,30:4,40:i},{1:[3]},{3:6,4:2,5:n,30:4,40:i},e(r,[2,3],{6:7}),{31:8,41:[1,9]},{41:[2,41]},{1:[2,1]},{4:30,7:[1,10],8:11,9:[1,12],10:13,11:[1,14],12:a,13:s,14:o,15:c,16:l,17:h,18:u,19:d,20:p,21:f,23:g,25:y,26:m,27:28,28:b,30:4,35:_,40:i},{32:32,33:[1,33],43:x},e([33,43],[2,42]),e(r,[2,8],{1:[2,2]}),e(r,[2,4]),{4:30,10:35,12:a,13:s,14:o,15:c,16:l,17:h,18:u,19:d,20:p,21:f,23:g,25:y,26:m,27:28,28:b,30:4,35:_,40:i},e(r,[2,6]),e(r,[2,7]),e(r,[2,9]),e(r,[2,10]),e(r,[2,11]),e(r,[2,12]),e(r,[2,13]),e(r,[2,14]),e(r,[2,15]),e(r,[2,16]),e(r,[2,17]),{22:[1,36]},{24:[1,37]},e(r,[2,20]),e(r,[2,21]),e(r,[2,22]),{29:[1,38]},e(r,[2,24]),{36:[1,39],38:[1,40]},{11:[1,41]},{34:42,42:[1,43]},{11:[2,44]},e(r,[2,5]),e(r,[2,18]),e(r,[2,19]),e(r,[2,23]),e(r,[2,27],{37:[1,44],38:[1,45]}),e(r,[2,33],{36:[1,46]}),e(v,[2,25]),{32:47,43:x},{43:[2,43]},e(r,[2,28],{38:[1,48]}),e(r,[2,29]),e(r,[2,31],{37:[1,49]}),{11:[1,50]},e(r,[2,30]),e(r,[2,32]),e(v,[2,26])],defaultActions:{5:[2,41],6:[2,1],34:[2,44],43:[2,43]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=a.slice.call(arguments,1),u=Object.create(this.lexer),d={yy:{}};for(var p in this.yy)Object.prototype.hasOwnProperty.call(this.yy,p)&&(d.yy[p]=this.yy[p]);u.setInput(t,d.yy),d.yy.lexer=u,d.yy.parser=this,void 0===u.yylloc&&(u.yylloc={});var f=u.yylloc;a.push(f);var g=u.options&&u.options.ranges;function y(){var t;return"number"!=typeof(t=i.pop()||u.lex()||1)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof d.yy.parseError?this.parseError=d.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var m,b,_,x,v,k,w,C,T={};;){if(b=n[n.length-1],this.defaultActions[b]?_=this.defaultActions[b]:(null==m&&(m=y()),_=s[b]&&s[b][m]),void 0===_||!_.length||!_[0]){var E="";for(v in C=[],s[b])this.terminals_[v]&&v>2&&C.push("'"+this.terminals_[v]+"'");E=u.showPosition?"Parse error on line "+(c+1)+":\n"+u.showPosition()+"\nExpecting "+C.join(", ")+", got '"+(this.terminals_[m]||m)+"'":"Parse error on line "+(c+1)+": Unexpected "+(1==m?"end of input":"'"+(this.terminals_[m]||m)+"'"),this.parseError(E,{text:u.match,token:this.terminals_[m]||m,line:u.yylineno,loc:f,expected:C})}if(_[0]instanceof Array&&_.length>1)throw new Error("Parse Error: multiple actions possible at state: "+b+", token: "+m);switch(_[0]){case 1:n.push(m),r.push(u.yytext),a.push(u.yylloc),n.push(_[1]),m=null,l=u.yyleng,o=u.yytext,c=u.yylineno,f=u.yylloc;break;case 2:if(k=this.productions_[_[1]][1],T.$=r[r.length-k],T._$={first_line:a[a.length-(k||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(k||1)].first_column,last_column:a[a.length-1].last_column},g&&(T._$.range=[a[a.length-(k||1)].range[0],a[a.length-1].range[1]]),void 0!==(x=this.performAction.apply(T,[o,l,c,d.yy,_[1],r,a].concat(h))))return x;k&&(n=n.slice(0,-1*k*2),r=r.slice(0,-1*k),a=a.slice(0,-1*k)),n.push(this.productions_[_[1]][0]),r.push(T.$),a.push(T._$),w=s[n[n.length-2]][n[n.length-1]],n.push(w);break;case 3:return!0}}return!0}},w=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),40;case 1:return this.begin("type_directive"),41;case 2:return this.popState(),this.begin("arg_directive"),33;case 3:return this.popState(),this.popState(),43;case 4:return 42;case 5:return this.begin("acc_title"),21;case 6:return this.popState(),"acc_title_value";case 7:return this.begin("acc_descr"),23;case 8:return this.popState(),"acc_descr_value";case 9:this.begin("acc_descr_multiline");break;case 10:case 20:case 23:case 26:case 29:this.popState();break;case 11:return"acc_descr_multiline_value";case 12:case 13:case 14:case 16:case 17:case 18:break;case 15:return 11;case 19:this.begin("href");break;case 21:return 38;case 22:this.begin("callbackname");break;case 24:this.popState(),this.begin("callbackargs");break;case 25:return 36;case 27:return 37;case 28:this.begin("click");break;case 30:return 35;case 31:return 5;case 32:return 12;case 33:return 13;case 34:return 14;case 35:return 15;case 36:return 16;case 37:return 18;case 38:return 17;case 39:return 19;case 40:return"date";case 41:return 20;case 42:return"accDescription";case 43:return 26;case 44:return 28;case 45:return 29;case 46:return 33;case 47:return 7;case 48:return"INVALID"}},rules:[/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:%%(?!\{)*[^\n]*)/i,/^(?:[^\}]%%*[^\n]*)/i,/^(?:%%*[^\n]*[\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:href[\s]+["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:call[\s]+)/i,/^(?:\([\s]*\))/i,/^(?:\()/i,/^(?:[^(]*)/i,/^(?:\))/i,/^(?:[^)]*)/i,/^(?:click[\s]+)/i,/^(?:[\s\n])/i,/^(?:[^\s\n]*)/i,/^(?:gantt\b)/i,/^(?:dateFormat\s[^#\n;]+)/i,/^(?:inclusiveEndDates\b)/i,/^(?:topAxis\b)/i,/^(?:axisFormat\s[^#\n;]+)/i,/^(?:tickInterval\s[^#\n;]+)/i,/^(?:includes\s[^#\n;]+)/i,/^(?:excludes\s[^#\n;]+)/i,/^(?:todayMarker\s[^\n;]+)/i,/^(?:\d\d\d\d-\d\d-\d\d\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:accDescription\s[^#\n;]+)/i,/^(?:section\s[^#:\n;]+)/i,/^(?:[^#:\n;]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[10,11],inclusive:!1},acc_descr:{rules:[8],inclusive:!1},acc_title:{rules:[6],inclusive:!1},close_directive:{rules:[],inclusive:!1},arg_directive:{rules:[3,4],inclusive:!1},type_directive:{rules:[2,3],inclusive:!1},open_directive:{rules:[1],inclusive:!1},callbackargs:{rules:[26,27],inclusive:!1},callbackname:{rules:[23,24,25],inclusive:!1},href:{rules:[20,21],inclusive:!1},click:{rules:[29,30],inclusive:!1},INITIAL:{rules:[0,5,7,9,12,13,14,15,16,17,18,19,22,28,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48],inclusive:!0}}},t);function C(){this.yy={}}return k.lexer=w,C.prototype=k,k.Parser=C,new C}();Bc.parser=Bc;const Nc=Bc,Dc=t=>null!==t.match(/^\s*gantt/);a().extend(wt()),a().extend(Tt()),a().extend(St());let Oc,Mc="",Ic="",Fc="",$c=[],Rc=[],Zc={},Pc=[],jc=[],Yc="";const zc=["active","done","crit","milestone"];let Uc=[],Wc=!1,qc=!1,Hc=0;const Vc=function(t,e,n,i){return!i.includes(t.format(e.trim()))&&(!!(t.isoWeekday()>=6&&n.includes("weekends"))||(!!n.includes(t.format("dddd").toLowerCase())||n.includes(t.format(e.trim()))))},Gc=function(t,e,n,i){if(!n.length||t.manualEndTime)return;let r,s;r=t.startTime instanceof Date?a()(t.startTime):a()(t.startTime,e,!0),r=r.add(1,"d"),s=t.endTime instanceof Date?a()(t.endTime):a()(t.endTime,e,!0);const[o,c]=Xc(r,s,e,n,i);t.endTime=o.toDate(),t.renderEndTime=c},Xc=function(t,e,n,i,r){let a=!1,s=null;for(;t<=e;)a||(s=e.toDate()),a=Vc(t,n,i,r),a&&(e=e.add(1,"d")),t=t.add(1,"d");return[e,s]},Qc=function(t,e,n){n=n.trim();const i=/^after\s+([\d\w- ]+)/.exec(n.trim());if(null!==i){let t=null;if(i[1].split(" ").forEach((function(e){let n=sl(e);void 0!==n&&(t?n.endTime>t.endTime&&(t=n):t=n)})),t)return t.endTime;{const t=new Date;return t.setHours(0,0,0,0),t}}let r=a()(n,e.trim(),!0);if(r.isValid())return r.toDate();{Bt.debug("Invalid date:"+n),Bt.debug("With date format:"+e.trim());const t=new Date(n);if(void 0===t||isNaN(t.getTime()))throw new Error("Invalid date:"+n);return t}},Kc=function(t){const e=/^(\d+(?:\.\d+)?)([Mdhmswy]|ms)$/.exec(t.trim());return null!==e?[Number.parseFloat(e[1]),e[2]]:[NaN,"ms"]},Jc=function(t,e,n,i=!1){n=n.trim();let r=a()(n,e.trim(),!0);if(r.isValid())return i&&(r=r.add(1,"d")),r.toDate();let s=a()(t);const[o,c]=Kc(n);if(!Number.isNaN(o)){const t=s.add(o,c);t.isValid()&&(s=t)}return s.toDate()};let tl=0;const el=function(t){return void 0===t?(tl+=1,"task"+tl):t};let nl,il,rl=[];const al={},sl=function(t){const e=al[t];return rl[e]},ol=function(){const t=function(t){const e=rl[t];let n="";switch(rl[t].raw.startTime.type){case"prevTaskEnd":{const t=sl(e.prevTaskId);e.startTime=t.endTime;break}case"getStartDate":n=Qc(0,Mc,rl[t].raw.startTime.startData),n&&(rl[t].startTime=n)}return rl[t].startTime&&(rl[t].endTime=Jc(rl[t].startTime,Mc,rl[t].raw.endTime.data,Wc),rl[t].endTime&&(rl[t].processed=!0,rl[t].manualEndTime=a()(rl[t].raw.endTime.data,"YYYY-MM-DD",!0).isValid(),Gc(rl[t],Mc,Rc,$c))),rl[t].processed};let e=!0;for(const[n,i]of rl.entries())t(n),e=e&&i.processed;return e},cl=function(t,e){t.split(",").forEach((function(t){let n=sl(t);void 0!==n&&n.classes.push(e)}))},ll=function(t,e){Uc.push((function(){const n=document.querySelector(`[id="${t}"]`);null!==n&&n.addEventListener("click",(function(){e()}))}),(function(){const n=document.querySelector(`[id="${t}-text"]`);null!==n&&n.addEventListener("click",(function(){e()}))}))},hl={parseDirective:function(t,e,n){xp.parseDirective(this,t,e,n)},getConfig:()=>ui().gantt,clear:function(){Pc=[],jc=[],Yc="",Uc=[],tl=0,nl=void 0,il=void 0,rl=[],Mc="",Ic="",Oc=void 0,Fc="",$c=[],Rc=[],Wc=!1,qc=!1,Hc=0,Zc={},Ri()},setDateFormat:function(t){Mc=t},getDateFormat:function(){return Mc},enableInclusiveEndDates:function(){Wc=!0},endDatesAreInclusive:function(){return Wc},enableTopAxis:function(){qc=!0},topAxisEnabled:function(){return qc},setAxisFormat:function(t){Ic=t},getAxisFormat:function(){return Ic},setTickInterval:function(t){Oc=t},getTickInterval:function(){return Oc},setTodayMarker:function(t){Fc=t},getTodayMarker:function(){return Fc},setAccTitle:Zi,getAccTitle:Pi,setDiagramTitle:zi,getDiagramTitle:Ui,setAccDescription:ji,getAccDescription:Yi,addSection:function(t){Yc=t,Pc.push(t)},getSections:function(){return Pc},getTasks:function(){let t=ol();let e=0;for(;!t&&e<10;)t=ol(),e++;return jc=rl,jc},addTask:function(t,e){const n={section:Yc,type:Yc,processed:!1,manualEndTime:!1,renderEndTime:null,raw:{data:e},task:t,classes:[]},i=function(t,e){let n;n=":"===e.substr(0,1)?e.substr(1,e.length):e;const i=n.split(","),r={};ul(i,r,zc);for(let a=0;a<i.length;a++)i[a]=i[a].trim();switch(i.length){case 1:r.id=el(),r.startTime={type:"prevTaskEnd",id:t},r.endTime={data:i[0]};break;case 2:r.id=el(),r.startTime={type:"getStartDate",startData:i[0]},r.endTime={data:i[1]};break;case 3:r.id=el(i[0]),r.startTime={type:"getStartDate",startData:i[1]},r.endTime={data:i[2]}}return r}(il,e);n.raw.startTime=i.startTime,n.raw.endTime=i.endTime,n.id=i.id,n.prevTaskId=il,n.active=i.active,n.done=i.done,n.crit=i.crit,n.milestone=i.milestone,n.order=Hc,Hc++;const r=rl.push(n);il=n.id,al[n.id]=r-1},findTaskById:sl,addTaskOrg:function(t,e){const n={section:Yc,type:Yc,description:t,task:t,classes:[]},i=function(t,e){let n;n=":"===e.substr(0,1)?e.substr(1,e.length):e;const i=n.split(","),r={};ul(i,r,zc);for(let a=0;a<i.length;a++)i[a]=i[a].trim();let s="";switch(i.length){case 1:r.id=el(),r.startTime=t.endTime,s=i[0];break;case 2:r.id=el(),r.startTime=Qc(0,Mc,i[0]),s=i[1];break;case 3:r.id=el(i[0]),r.startTime=Qc(0,Mc,i[1]),s=i[2]}return s&&(r.endTime=Jc(r.startTime,Mc,s,Wc),r.manualEndTime=a()(s,"YYYY-MM-DD",!0).isValid(),Gc(r,Mc,Rc,$c)),r}(nl,e);n.startTime=i.startTime,n.endTime=i.endTime,n.id=i.id,n.active=i.active,n.done=i.done,n.crit=i.crit,n.milestone=i.milestone,nl=n,jc.push(n)},setIncludes:function(t){$c=t.toLowerCase().split(/[\s,]+/)},getIncludes:function(){return $c},setExcludes:function(t){Rc=t.toLowerCase().split(/[\s,]+/)},getExcludes:function(){return Rc},setClickEvent:function(t,e,n){t.split(",").forEach((function(t){!function(t,e,n){if("loose"!==ui().securityLevel)return;if(void 0===e)return;let i=[];if("string"==typeof n){i=n.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let t=0;t<i.length;t++){let e=i[t].trim();'"'===e.charAt(0)&&'"'===e.charAt(e.length-1)&&(e=e.substr(1,e.length-2)),i[t]=e}}0===i.length&&i.push(t),void 0!==sl(t)&&ll(t,(()=>{ei.runFunc(e,...i)}))}(t,e,n)})),cl(t,"clickable")},setLink:function(t,e){let n=e;"loose"!==ui().securityLevel&&(n=(0,s.Nm)(e)),t.split(",").forEach((function(t){void 0!==sl(t)&&(ll(t,(()=>{window.open(n,"_self")})),Zc[t]=n)})),cl(t,"clickable")},getLinks:function(){return Zc},bindFunctions:function(t){Uc.forEach((function(e){e(t)}))},parseDuration:Kc,isInvalidDate:Vc};function ul(t,e,n){let i=!0;for(;i;)i=!1,n.forEach((function(n){const r=new RegExp("^\\s*"+n+"\\s*$");t[0].match(r)&&(e[n]=!0,t.shift(1),i=!0)}))}let dl;const pl={setConf:function(){Bt.debug("Something is calling, setConf, remove the call")},draw:function(t,e,n,i){const r=ui().gantt,s=ui().securityLevel;let c;"sandbox"===s&&(c=(0,o.Ys)("#i"+e));const l="sandbox"===s?(0,o.Ys)(c.nodes()[0].contentDocument.body):(0,o.Ys)("body"),h="sandbox"===s?c.nodes()[0].contentDocument:document,u=h.getElementById(e);dl=u.parentElement.offsetWidth,void 0===dl&&(dl=1200),void 0!==r.useWidth&&(dl=r.useWidth);const d=i.db.getTasks(),p=d.length*(r.barHeight+r.barGap)+2*r.topPadding;u.setAttribute("viewBox","0 0 "+dl+" "+p);const f=l.select(`[id="${e}"]`),g=(0,o.Xf)().domain([(0,o.VV$)(d,(function(t){return t.startTime})),(0,o.Fp7)(d,(function(t){return t.endTime}))]).rangeRound([0,dl-r.leftPadding-r.rightPadding]);let y=[];for(const a of d)y.push(a.type);const m=y;function b(t,e){return function(t){let e=t.length;const n={};for(;e;)n[t[--e]]=(n[t[e]]||0)+1;return n}(e)[t]||0}y=function(t){const e={},n=[];for(let i=0,r=t.length;i<r;++i)Object.prototype.hasOwnProperty.call(e,t[i])||(e[t[i]]=!0,n.push(t[i]));return n}(y),d.sort((function(t,e){const n=t.startTime,i=e.startTime;let r=0;return n>i?r=1:n<i&&(r=-1),r})),function(t,n,s){const c=r.barHeight,l=c+r.barGap,u=r.topPadding,d=r.leftPadding;(0,o.BYU)().domain([0,y.length]).range(["#00B9FA","#F95002"]).interpolate(o.JHv);(function(t,e,n,s,o,c,l,h){const u=c.reduce(((t,{startTime:e})=>t?Math.min(t,e):e),0),d=c.reduce(((t,{endTime:e})=>t?Math.max(t,e):e),0),p=i.db.getDateFormat();if(!u||!d)return;const y=[];let m=null,b=a()(u);for(;b.valueOf()<=d;)i.db.isInvalidDate(b,p,l,h)?m?m.end=b:m={start:b,end:b}:m&&(y.push(m),m=null),b=b.add(1,"d");f.append("g").selectAll("rect").data(y).enter().append("rect").attr("id",(function(t){return"exclude-"+t.start.format("YYYY-MM-DD")})).attr("x",(function(t){return g(t.start)+n})).attr("y",r.gridLineStartPadding).attr("width",(function(t){const e=t.end.add(1,"day");return g(e)-g(t.start)})).attr("height",o-e-r.gridLineStartPadding).attr("transform-origin",(function(e,i){return(g(e.start)+n+.5*(g(e.end)-g(e.start))).toString()+"px "+(i*t+.5*o).toString()+"px"})).attr("class","exclude-range")})(l,u,d,0,s,t,i.db.getExcludes(),i.db.getIncludes()),function(t,e,n,a){let s=(0,o.LLu)(g).tickSize(-a+e+r.gridLineStartPadding).tickFormat((0,o.i$Z)(i.db.getAxisFormat()||r.axisFormat||"%Y-%m-%d"));const c=/^([1-9]\d*)(minute|hour|day|week|month)$/.exec(i.db.getTickInterval()||r.tickInterval);if(null!==c){const t=c[1];switch(c[2]){case"minute":s.ticks(o.Z_i.every(t));break;case"hour":s.ticks(o.WQD.every(t));break;case"day":s.ticks(o.rr1.every(t));break;case"week":s.ticks(o.NGh.every(t));break;case"month":s.ticks(o.F0B.every(t))}}if(f.append("g").attr("class","grid").attr("transform","translate("+t+", "+(a-50)+")").call(s).selectAll("text").style("text-anchor","middle").attr("fill","#000").attr("stroke","none").attr("font-size",10).attr("dy","1em"),i.db.topAxisEnabled()||r.topAxis){let n=(0,o.F5q)(g).tickSize(-a+e+r.gridLineStartPadding).tickFormat((0,o.i$Z)(i.db.getAxisFormat()||r.axisFormat||"%Y-%m-%d"));if(null!==c){const t=c[1];switch(c[2]){case"minute":n.ticks(o.Z_i.every(t));break;case"hour":n.ticks(o.WQD.every(t));break;case"day":n.ticks(o.rr1.every(t));break;case"week":n.ticks(o.NGh.every(t));break;case"month":n.ticks(o.F0B.every(t))}}f.append("g").attr("class","grid").attr("transform","translate("+t+", "+e+")").call(n).selectAll("text").style("text-anchor","middle").attr("fill","#000").attr("stroke","none").attr("font-size",10)}}(d,u,0,s),function(t,n,a,s,c,l,h){f.append("g").selectAll("rect").data(t).enter().append("rect").attr("x",0).attr("y",(function(t,e){return t.order*n+a-2})).attr("width",(function(){return h-r.rightPadding/2})).attr("height",n).attr("class",(function(t){for(const[e,n]of y.entries())if(t.type===n)return"section section"+e%r.numberSectionStyles;return"section section0"}));const u=f.append("g").selectAll("rect").data(t).enter(),d=i.db.getLinks();u.append("rect").attr("id",(function(t){return t.id})).attr("rx",3).attr("ry",3).attr("x",(function(t){return t.milestone?g(t.startTime)+s+.5*(g(t.endTime)-g(t.startTime))-.5*c:g(t.startTime)+s})).attr("y",(function(t,e){return t.order*n+a})).attr("width",(function(t){return t.milestone?c:g(t.renderEndTime||t.endTime)-g(t.startTime)})).attr("height",c).attr("transform-origin",(function(t,e){return e=t.order,(g(t.startTime)+s+.5*(g(t.endTime)-g(t.startTime))).toString()+"px "+(e*n+a+.5*c).toString()+"px"})).attr("class",(function(t){const e="task";let n="";t.classes.length>0&&(n=t.classes.join(" "));let i=0;for(const[s,o]of y.entries())t.type===o&&(i=s%r.numberSectionStyles);let a="";return t.active?t.crit?a+=" activeCrit":a=" active":t.done?a=t.crit?" doneCrit":" done":t.crit&&(a+=" crit"),0===a.length&&(a=" task"),t.milestone&&(a=" milestone "+a),a+=i,a+=" "+n,e+a})),u.append("text").attr("id",(function(t){return t.id+"-text"})).text((function(t){return t.task})).attr("font-size",r.fontSize).attr("x",(function(t){let e=g(t.startTime),n=g(t.renderEndTime||t.endTime);t.milestone&&(e+=.5*(g(t.endTime)-g(t.startTime))-.5*c),t.milestone&&(n=e+c);const i=this.getBBox().width;return i>n-e?n+i+1.5*r.leftPadding>h?e+s-5:n+s+5:(n-e)/2+e+s})).attr("y",(function(t,e){return t.order*n+r.barHeight/2+(r.fontSize/2-2)+a})).attr("text-height",c).attr("class",(function(t){const e=g(t.startTime);let n=g(t.endTime);t.milestone&&(n=e+c);const i=this.getBBox().width;let a="";t.classes.length>0&&(a=t.classes.join(" "));let s=0;for(const[c,l]of y.entries())t.type===l&&(s=c%r.numberSectionStyles);let o="";return t.active&&(o=t.crit?"activeCritText"+s:"activeText"+s),t.done?o=t.crit?o+" doneCritText"+s:o+" doneText"+s:t.crit&&(o=o+" critText"+s),t.milestone&&(o+=" milestoneText"),i>n-e?n+i+1.5*r.leftPadding>h?a+" taskTextOutsideLeft taskTextOutside"+s+" "+o:a+" taskTextOutsideRight taskTextOutside"+s+" "+o+" width-"+i:a+" taskText taskText"+s+" "+o+" width-"+i}));if("sandbox"===ui().securityLevel){let t;t=(0,o.Ys)("#i"+e);const n=t.nodes()[0].contentDocument;u.filter((function(t){return void 0!==d[t.id]})).each((function(t){var e=n.querySelector("#"+t.id),i=n.querySelector("#"+t.id+"-text");const r=e.parentNode;var a=n.createElement("a");a.setAttribute("xlink:href",d[t.id]),a.setAttribute("target","_top"),r.appendChild(a),a.appendChild(e),a.appendChild(i)}))}}(t,l,u,d,c,0,n),function(t,e){const n=[];let i=0;for(const[r,a]of y.entries())n[r]=[a,b(a,m)];f.append("g").selectAll("text").data(n).enter().append((function(t){const e=t[0].split(jt.lineBreakRegex),n=-(e.length-1)/2,i=h.createElementNS("http://www.w3.org/2000/svg","text");i.setAttribute("dy",n+"em");for(const[r,a]of e.entries()){const t=h.createElementNS("http://www.w3.org/2000/svg","tspan");t.setAttribute("alignment-baseline","central"),t.setAttribute("x","10"),r>0&&t.setAttribute("dy","1em"),t.textContent=a,i.appendChild(t)}return i})).attr("x",10).attr("y",(function(r,a){if(!(a>0))return r[1]*t/2+e;for(let s=0;s<a;s++)return i+=n[a-1][1],r[1]*t/2+i*t+e})).attr("font-size",r.sectionFontSize).attr("font-size",r.sectionFontSize).attr("class",(function(t){for(const[e,n]of y.entries())if(t[0]===n)return"sectionTitle sectionTitle"+e%r.numberSectionStyles;return"sectionTitle"}))}(l,u),function(t,e,n,a){const s=i.db.getTodayMarker();if("off"===s)return;const o=f.append("g").attr("class","today"),c=new Date,l=o.append("line");l.attr("x1",g(c)+t).attr("x2",g(c)+t).attr("y1",r.titleTopMargin).attr("y2",a-r.titleTopMargin).attr("class","today"),""!==s&&l.attr("style",s.replace(/,/g,";"))}(d,0,0,s)}(d,dl,p),bi(f,p,dl,r.useMaxWidth),f.append("text").text(i.db.getDiagramTitle()).attr("x",dl/2).attr("y",r.titleTopMargin).attr("class","titleText")}};var fl=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[6,9,10],i={trace:function(){},yy:{},symbols_:{error:2,start:3,info:4,document:5,EOF:6,line:7,statement:8,NL:9,showInfo:10,$accept:0,$end:1},terminals_:{2:"error",4:"info",6:"EOF",9:"NL",10:"showInfo"},productions_:[0,[3,3],[5,0],[5,2],[7,1],[7,1],[8,1]],performAction:function(t,e,n,i,r,a,s){switch(a.length,r){case 1:return i;case 4:break;case 6:i.setInfo(!0)}},table:[{3:1,4:[1,2]},{1:[3]},e(n,[2,2],{5:3}),{6:[1,4],7:5,8:6,9:[1,7],10:[1,8]},{1:[2,1]},e(n,[2,3]),e(n,[2,4]),e(n,[2,5]),e(n,[2,6])],defaultActions:{4:[2,1]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=a.slice.call(arguments,1),u=Object.create(this.lexer),d={yy:{}};for(var p in this.yy)Object.prototype.hasOwnProperty.call(this.yy,p)&&(d.yy[p]=this.yy[p]);u.setInput(t,d.yy),d.yy.lexer=u,d.yy.parser=this,void 0===u.yylloc&&(u.yylloc={});var f=u.yylloc;a.push(f);var g=u.options&&u.options.ranges;function y(){var t;return"number"!=typeof(t=i.pop()||u.lex()||1)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof d.yy.parseError?this.parseError=d.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var m,b,_,x,v,k,w,C,T={};;){if(b=n[n.length-1],this.defaultActions[b]?_=this.defaultActions[b]:(null==m&&(m=y()),_=s[b]&&s[b][m]),void 0===_||!_.length||!_[0]){var E="";for(v in C=[],s[b])this.terminals_[v]&&v>2&&C.push("'"+this.terminals_[v]+"'");E=u.showPosition?"Parse error on line "+(c+1)+":\n"+u.showPosition()+"\nExpecting "+C.join(", ")+", got '"+(this.terminals_[m]||m)+"'":"Parse error on line "+(c+1)+": Unexpected "+(1==m?"end of input":"'"+(this.terminals_[m]||m)+"'"),this.parseError(E,{text:u.match,token:this.terminals_[m]||m,line:u.yylineno,loc:f,expected:C})}if(_[0]instanceof Array&&_.length>1)throw new Error("Parse Error: multiple actions possible at state: "+b+", token: "+m);switch(_[0]){case 1:n.push(m),r.push(u.yytext),a.push(u.yylloc),n.push(_[1]),m=null,l=u.yyleng,o=u.yytext,c=u.yylineno,f=u.yylloc;break;case 2:if(k=this.productions_[_[1]][1],T.$=r[r.length-k],T._$={first_line:a[a.length-(k||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(k||1)].first_column,last_column:a[a.length-1].last_column},g&&(T._$.range=[a[a.length-(k||1)].range[0],a[a.length-1].range[1]]),void 0!==(x=this.performAction.apply(T,[o,l,c,d.yy,_[1],r,a].concat(h))))return x;k&&(n=n.slice(0,-1*k*2),r=r.slice(0,-1*k),a=a.slice(0,-1*k)),n.push(this.productions_[_[1]][0]),r.push(T.$),a.push(T._$),w=s[n[n.length-2]][n[n.length-1]],n.push(w);break;case 3:return!0}}return!0}},r=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,i){switch(n){case 0:return 4;case 1:return 9;case 2:return"space";case 3:return 10;case 4:return 6;case 5:return"TXT"}},rules:[/^(?:info\b)/i,/^(?:[\s\n\r]+)/i,/^(?:[\s]+)/i,/^(?:showInfo\b)/i,/^(?:$)/i,/^(?:.)/i],conditions:{INITIAL:{rules:[0,1,2,3,4,5],inclusive:!0}}},t);function a(){this.yy={}}return i.lexer=r,a.prototype=i,i.Parser=a,new a}();fl.parser=fl;const gl=fl;var yl="",ml=!1;const bl={setMessage:t=>{Bt.debug("Setting message to: "+t),yl=t},getMessage:()=>yl,setInfo:t=>{ml=t},getInfo:()=>ml,clear:Ri},_l={draw:(t,e,n)=>{try{Bt.debug("Rendering info diagram\n"+t);const i=ui().securityLevel;let r;"sandbox"===i&&(r=(0,o.Ys)("#i"+e));const a=("sandbox"===i?(0,o.Ys)(r.nodes()[0].contentDocument.body):(0,o.Ys)("body")).select("#"+e);a.append("g").append("text").attr("x",100).attr("y",40).attr("class","version").attr("font-size","32px").style("text-anchor","middle").text("v "+n),a.attr("height",100),a.attr("width",400)}catch(i){Bt.error("Error while rendering info diagram"),Bt.error(i.message)}}},xl=t=>null!==t.match(/^\s*info/);var vl=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,4],i=[1,5],r=[1,6],a=[1,7],s=[1,9],o=[1,11,13,15,17,19,20,26,27,28,29],c=[2,5],l=[1,6,11,13,15,17,19,20,26,27,28,29],h=[26,27,28],u=[2,8],d=[1,18],p=[1,19],f=[1,20],g=[1,21],y=[1,22],m=[1,23],b=[1,28],_=[6,26,27,28,29],x={trace:function(){},yy:{},symbols_:{error:2,start:3,eol:4,directive:5,PIE:6,document:7,showData:8,line:9,statement:10,txt:11,value:12,title:13,title_value:14,acc_title:15,acc_title_value:16,acc_descr:17,acc_descr_value:18,acc_descr_multiline_value:19,section:20,openDirective:21,typeDirective:22,closeDirective:23,":":24,argDirective:25,NEWLINE:26,";":27,EOF:28,open_directive:29,type_directive:30,arg_directive:31,close_directive:32,$accept:0,$end:1},terminals_:{2:"error",6:"PIE",8:"showData",11:"txt",12:"value",13:"title",14:"title_value",15:"acc_title",16:"acc_title_value",17:"acc_descr",18:"acc_descr_value",19:"acc_descr_multiline_value",20:"section",24:":",26:"NEWLINE",27:";",28:"EOF",29:"open_directive",30:"type_directive",31:"arg_directive",32:"close_directive"},productions_:[0,[3,2],[3,2],[3,2],[3,3],[7,0],[7,2],[9,2],[10,0],[10,2],[10,2],[10,2],[10,2],[10,1],[10,1],[10,1],[5,3],[5,5],[4,1],[4,1],[4,1],[21,1],[22,1],[25,1],[23,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 4:i.setShowData(!0);break;case 7:this.$=a[o-1];break;case 9:i.addSection(a[o-1],i.cleanupValue(a[o]));break;case 10:this.$=a[o].trim(),i.setDiagramTitle(this.$);break;case 11:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 12:case 13:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 14:i.addSection(a[o].substr(8)),this.$=a[o].substr(8);break;case 21:i.parseDirective("%%{","open_directive");break;case 22:i.parseDirective(a[o],"type_directive");break;case 23:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 24:i.parseDirective("}%%","close_directive","pie")}},table:[{3:1,4:2,5:3,6:n,21:8,26:i,27:r,28:a,29:s},{1:[3]},{3:10,4:2,5:3,6:n,21:8,26:i,27:r,28:a,29:s},{3:11,4:2,5:3,6:n,21:8,26:i,27:r,28:a,29:s},e(o,c,{7:12,8:[1,13]}),e(l,[2,18]),e(l,[2,19]),e(l,[2,20]),{22:14,30:[1,15]},{30:[2,21]},{1:[2,1]},{1:[2,2]},e(h,u,{21:8,9:16,10:17,5:24,1:[2,3],11:d,13:p,15:f,17:g,19:y,20:m,29:s}),e(o,c,{7:25}),{23:26,24:[1,27],32:b},e([24,32],[2,22]),e(o,[2,6]),{4:29,26:i,27:r,28:a},{12:[1,30]},{14:[1,31]},{16:[1,32]},{18:[1,33]},e(h,[2,13]),e(h,[2,14]),e(h,[2,15]),e(h,u,{21:8,9:16,10:17,5:24,1:[2,4],11:d,13:p,15:f,17:g,19:y,20:m,29:s}),e(_,[2,16]),{25:34,31:[1,35]},e(_,[2,24]),e(o,[2,7]),e(h,[2,9]),e(h,[2,10]),e(h,[2,11]),e(h,[2,12]),{23:36,32:b},{32:[2,23]},e(_,[2,17])],defaultActions:{9:[2,21],10:[2,1],11:[2,2],35:[2,23]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=a.slice.call(arguments,1),u=Object.create(this.lexer),d={yy:{}};for(var p in this.yy)Object.prototype.hasOwnProperty.call(this.yy,p)&&(d.yy[p]=this.yy[p]);u.setInput(t,d.yy),d.yy.lexer=u,d.yy.parser=this,void 0===u.yylloc&&(u.yylloc={});var f=u.yylloc;a.push(f);var g=u.options&&u.options.ranges;function y(){var t;return"number"!=typeof(t=i.pop()||u.lex()||1)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof d.yy.parseError?this.parseError=d.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var m,b,_,x,v,k,w,C,T={};;){if(b=n[n.length-1],this.defaultActions[b]?_=this.defaultActions[b]:(null==m&&(m=y()),_=s[b]&&s[b][m]),void 0===_||!_.length||!_[0]){var E="";for(v in C=[],s[b])this.terminals_[v]&&v>2&&C.push("'"+this.terminals_[v]+"'");E=u.showPosition?"Parse error on line "+(c+1)+":\n"+u.showPosition()+"\nExpecting "+C.join(", ")+", got '"+(this.terminals_[m]||m)+"'":"Parse error on line "+(c+1)+": Unexpected "+(1==m?"end of input":"'"+(this.terminals_[m]||m)+"'"),this.parseError(E,{text:u.match,token:this.terminals_[m]||m,line:u.yylineno,loc:f,expected:C})}if(_[0]instanceof Array&&_.length>1)throw new Error("Parse Error: multiple actions possible at state: "+b+", token: "+m);switch(_[0]){case 1:n.push(m),r.push(u.yytext),a.push(u.yylloc),n.push(_[1]),m=null,l=u.yyleng,o=u.yytext,c=u.yylineno,f=u.yylloc;break;case 2:if(k=this.productions_[_[1]][1],T.$=r[r.length-k],T._$={first_line:a[a.length-(k||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(k||1)].first_column,last_column:a[a.length-1].last_column},g&&(T._$.range=[a[a.length-(k||1)].range[0],a[a.length-1].range[1]]),void 0!==(x=this.performAction.apply(T,[o,l,c,d.yy,_[1],r,a].concat(h))))return x;k&&(n=n.slice(0,-1*k*2),r=r.slice(0,-1*k),a=a.slice(0,-1*k)),n.push(this.productions_[_[1]][0]),r.push(T.$),a.push(T._$),w=s[n[n.length-2]][n[n.length-1]],n.push(w);break;case 3:return!0}}return!0}},v=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),29;case 1:return this.begin("type_directive"),30;case 2:return this.popState(),this.begin("arg_directive"),24;case 3:return this.popState(),this.popState(),32;case 4:return 31;case 5:case 6:case 8:case 9:break;case 7:return 26;case 10:return this.begin("title"),13;case 11:return this.popState(),"title_value";case 12:return this.begin("acc_title"),15;case 13:return this.popState(),"acc_title_value";case 14:return this.begin("acc_descr"),17;case 15:return this.popState(),"acc_descr_value";case 16:this.begin("acc_descr_multiline");break;case 17:case 20:this.popState();break;case 18:return"acc_descr_multiline_value";case 19:this.begin("string");break;case 21:return"txt";case 22:return 6;case 23:return 8;case 24:return"value";case 25:return 28}},rules:[/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n\r]+)/i,/^(?:%%[^\n]*)/i,/^(?:[\s]+)/i,/^(?:title\b)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:pie\b)/i,/^(?:showData\b)/i,/^(?::[\s]*[\d]+(?:\.[\d]+)?)/i,/^(?:$)/i],conditions:{acc_descr_multiline:{rules:[17,18],inclusive:!1},acc_descr:{rules:[15],inclusive:!1},acc_title:{rules:[13],inclusive:!1},close_directive:{rules:[],inclusive:!1},arg_directive:{rules:[3,4],inclusive:!1},type_directive:{rules:[2,3],inclusive:!1},open_directive:{rules:[1],inclusive:!1},title:{rules:[11],inclusive:!1},string:{rules:[20,21],inclusive:!1},INITIAL:{rules:[0,5,6,7,8,9,10,12,14,16,19,22,23,24,25],inclusive:!0}}},t);function k(){this.yy={}}return x.lexer=v,k.prototype=x,x.Parser=k,new k}();vl.parser=vl;const kl=vl,wl=t=>null!==t.match(/^\s*pie/)||null!==t.match(/^\s*bar/);let Cl={},Tl=!1;const El={parseDirective:function(t,e,n){xp.parseDirective(this,t,e,n)},getConfig:()=>ui().pie,addSection:function(t,e){t=jt.sanitizeText(t,ui()),void 0===Cl[t]&&(Cl[t]=e,Bt.debug("Added new section :",t))},getSections:()=>Cl,cleanupValue:function(t){return":"===t.substring(0,1)?(t=t.substring(1).trim(),Number(t.trim())):Number(t.trim())},clear:function(){Cl={},Tl=!1,Ri()},setAccTitle:Zi,getAccTitle:Pi,setDiagramTitle:zi,getDiagramTitle:Ui,setShowData:function(t){Tl=t},getShowData:function(){return Tl},getAccDescription:Yi,setAccDescription:ji};let Sl,Al=ui();const Ll=450,Bl={draw:(t,e,n,i)=>{try{Al=ui(),Bt.debug("Rendering info diagram\n"+t);const n=ui().securityLevel;let y;"sandbox"===n&&(y=(0,o.Ys)("#i"+e));const m="sandbox"===n?(0,o.Ys)(y.nodes()[0].contentDocument.body):(0,o.Ys)("body"),b="sandbox"===n?y.nodes()[0].contentDocument:document;i.db.clear(),i.parser.parse(t),Bt.debug("Parsed info diagram");const _=b.getElementById(e);Sl=_.parentElement.offsetWidth,void 0===Sl&&(Sl=1200),void 0!==Al.useWidth&&(Sl=Al.useWidth),void 0!==Al.pie.useWidth&&(Sl=Al.pie.useWidth);const x=m.select("#"+e);bi(x,Ll,Sl,Al.pie.useMaxWidth),_.setAttribute("viewBox","0 0 "+Sl+" "+Ll);var r=18,a=Math.min(Sl,Ll)/2-40,s=x.append("g").attr("transform","translate("+Sl/2+",225)"),c=i.db.getSections(),l=0;Object.keys(c).forEach((function(t){l+=c[t]}));const v=Al.themeVariables;var h=[v.pie1,v.pie2,v.pie3,v.pie4,v.pie5,v.pie6,v.pie7,v.pie8,v.pie9,v.pie10,v.pie11,v.pie12],u=(0,o.PKp)().range(h),d=Object.entries(c).map((function(t,e){return{order:e,name:t[0],value:t[1]}})),p=(0,o.ve8)().value((function(t){return t.value})).sort((function(t,e){return t.order-e.order}))(d),f=(0,o.Nb1)().innerRadius(0).outerRadius(a);s.selectAll("mySlices").data(p).enter().append("path").attr("d",f).attr("fill",(function(t){return u(t.data.name)})).attr("class","pieCircle"),s.selectAll("mySlices").data(p).enter().append("text").text((function(t){return(t.data.value/l*100).toFixed(0)+"%"})).attr("transform",(function(t){return"translate("+f.centroid(t)+")"})).style("text-anchor","middle").attr("class","slice"),s.append("text").text(i.db.getDiagramTitle()).attr("x",0).attr("y",-200).attr("class","pieTitleText");var g=s.selectAll(".legend").data(u.domain()).enter().append("g").attr("class","legend").attr("transform",(function(t,e){return"translate(216,"+(22*e-22*u.domain().length/2)+")"}));g.append("rect").attr("width",r).attr("height",r).style("fill",u).style("stroke",u),g.data(p).append("text").attr("x",22).attr("y",14).text((function(t){return i.db.getShowData()||Al.showData||Al.pie.showData?t.data.name+" ["+t.data.value+"]":t.data.name}))}catch(y){Bt.error("Error while rendering info diagram"),Bt.error(y)}}};var Nl=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,3],i=[1,5],r=[1,6],a=[1,7],s=[1,8],o=[5,6,8,14,16,18,19,40,41,42,43,44,45,53,71,72],c=[1,22],l=[2,13],h=[1,26],u=[1,27],d=[1,28],p=[1,29],f=[1,30],g=[1,31],y=[1,24],m=[1,32],b=[1,33],_=[1,36],x=[71,72],v=[5,8,14,16,18,19,40,41,42,43,44,45,53,60,62,71,72],k=[1,56],w=[1,57],C=[1,58],T=[1,59],E=[1,60],S=[1,61],A=[1,62],L=[62,63],B=[1,74],N=[1,70],D=[1,71],O=[1,72],M=[1,73],I=[1,75],F=[1,79],$=[1,80],R=[1,77],Z=[1,78],P=[5,8,14,16,18,19,40,41,42,43,44,45,53,71,72],j={trace:function(){},yy:{},symbols_:{error:2,start:3,directive:4,NEWLINE:5,RD:6,diagram:7,EOF:8,openDirective:9,typeDirective:10,closeDirective:11,":":12,argDirective:13,acc_title:14,acc_title_value:15,acc_descr:16,acc_descr_value:17,acc_descr_multiline_value:18,open_directive:19,type_directive:20,arg_directive:21,close_directive:22,requirementDef:23,elementDef:24,relationshipDef:25,requirementType:26,requirementName:27,STRUCT_START:28,requirementBody:29,ID:30,COLONSEP:31,id:32,TEXT:33,text:34,RISK:35,riskLevel:36,VERIFYMTHD:37,verifyType:38,STRUCT_STOP:39,REQUIREMENT:40,FUNCTIONAL_REQUIREMENT:41,INTERFACE_REQUIREMENT:42,PERFORMANCE_REQUIREMENT:43,PHYSICAL_REQUIREMENT:44,DESIGN_CONSTRAINT:45,LOW_RISK:46,MED_RISK:47,HIGH_RISK:48,VERIFY_ANALYSIS:49,VERIFY_DEMONSTRATION:50,VERIFY_INSPECTION:51,VERIFY_TEST:52,ELEMENT:53,elementName:54,elementBody:55,TYPE:56,type:57,DOCREF:58,ref:59,END_ARROW_L:60,relationship:61,LINE:62,END_ARROW_R:63,CONTAINS:64,COPIES:65,DERIVES:66,SATISFIES:67,VERIFIES:68,REFINES:69,TRACES:70,unqString:71,qString:72,$accept:0,$end:1},terminals_:{2:"error",5:"NEWLINE",6:"RD",8:"EOF",12:":",14:"acc_title",15:"acc_title_value",16:"acc_descr",17:"acc_descr_value",18:"acc_descr_multiline_value",19:"open_directive",20:"type_directive",21:"arg_directive",22:"close_directive",28:"STRUCT_START",30:"ID",31:"COLONSEP",33:"TEXT",35:"RISK",37:"VERIFYMTHD",39:"STRUCT_STOP",40:"REQUIREMENT",41:"FUNCTIONAL_REQUIREMENT",42:"INTERFACE_REQUIREMENT",43:"PERFORMANCE_REQUIREMENT",44:"PHYSICAL_REQUIREMENT",45:"DESIGN_CONSTRAINT",46:"LOW_RISK",47:"MED_RISK",48:"HIGH_RISK",49:"VERIFY_ANALYSIS",50:"VERIFY_DEMONSTRATION",51:"VERIFY_INSPECTION",52:"VERIFY_TEST",53:"ELEMENT",56:"TYPE",58:"DOCREF",60:"END_ARROW_L",62:"LINE",63:"END_ARROW_R",64:"CONTAINS",65:"COPIES",66:"DERIVES",67:"SATISFIES",68:"VERIFIES",69:"REFINES",70:"TRACES",71:"unqString",72:"qString"},productions_:[0,[3,3],[3,2],[3,4],[4,3],[4,5],[4,2],[4,2],[4,1],[9,1],[10,1],[13,1],[11,1],[7,0],[7,2],[7,2],[7,2],[7,2],[7,2],[23,5],[29,5],[29,5],[29,5],[29,5],[29,2],[29,1],[26,1],[26,1],[26,1],[26,1],[26,1],[26,1],[36,1],[36,1],[36,1],[38,1],[38,1],[38,1],[38,1],[24,5],[55,5],[55,5],[55,2],[55,1],[25,5],[25,5],[61,1],[61,1],[61,1],[61,1],[61,1],[61,1],[61,1],[27,1],[27,1],[32,1],[32,1],[34,1],[34,1],[54,1],[54,1],[57,1],[57,1],[59,1],[59,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 6:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 7:case 8:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 9:i.parseDirective("%%{","open_directive");break;case 10:i.parseDirective(a[o],"type_directive");break;case 11:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 12:i.parseDirective("}%%","close_directive","pie");break;case 13:this.$=[];break;case 19:i.addRequirement(a[o-3],a[o-4]);break;case 20:i.setNewReqId(a[o-2]);break;case 21:i.setNewReqText(a[o-2]);break;case 22:i.setNewReqRisk(a[o-2]);break;case 23:i.setNewReqVerifyMethod(a[o-2]);break;case 26:this.$=i.RequirementType.REQUIREMENT;break;case 27:this.$=i.RequirementType.FUNCTIONAL_REQUIREMENT;break;case 28:this.$=i.RequirementType.INTERFACE_REQUIREMENT;break;case 29:this.$=i.RequirementType.PERFORMANCE_REQUIREMENT;break;case 30:this.$=i.RequirementType.PHYSICAL_REQUIREMENT;break;case 31:this.$=i.RequirementType.DESIGN_CONSTRAINT;break;case 32:this.$=i.RiskLevel.LOW_RISK;break;case 33:this.$=i.RiskLevel.MED_RISK;break;case 34:this.$=i.RiskLevel.HIGH_RISK;break;case 35:this.$=i.VerifyType.VERIFY_ANALYSIS;break;case 36:this.$=i.VerifyType.VERIFY_DEMONSTRATION;break;case 37:this.$=i.VerifyType.VERIFY_INSPECTION;break;case 38:this.$=i.VerifyType.VERIFY_TEST;break;case 39:i.addElement(a[o-3]);break;case 40:i.setNewElementType(a[o-2]);break;case 41:i.setNewElementDocRef(a[o-2]);break;case 44:i.addRelationship(a[o-2],a[o],a[o-4]);break;case 45:i.addRelationship(a[o-2],a[o-4],a[o]);break;case 46:this.$=i.Relationships.CONTAINS;break;case 47:this.$=i.Relationships.COPIES;break;case 48:this.$=i.Relationships.DERIVES;break;case 49:this.$=i.Relationships.SATISFIES;break;case 50:this.$=i.Relationships.VERIFIES;break;case 51:this.$=i.Relationships.REFINES;break;case 52:this.$=i.Relationships.TRACES}},table:[{3:1,4:2,6:n,9:4,14:i,16:r,18:a,19:s},{1:[3]},{3:10,4:2,5:[1,9],6:n,9:4,14:i,16:r,18:a,19:s},{5:[1,11]},{10:12,20:[1,13]},{15:[1,14]},{17:[1,15]},e(o,[2,8]),{20:[2,9]},{3:16,4:2,6:n,9:4,14:i,16:r,18:a,19:s},{1:[2,2]},{4:21,5:c,7:17,8:l,9:4,14:i,16:r,18:a,19:s,23:18,24:19,25:20,26:23,32:25,40:h,41:u,42:d,43:p,44:f,45:g,53:y,71:m,72:b},{11:34,12:[1,35],22:_},e([12,22],[2,10]),e(o,[2,6]),e(o,[2,7]),{1:[2,1]},{8:[1,37]},{4:21,5:c,7:38,8:l,9:4,14:i,16:r,18:a,19:s,23:18,24:19,25:20,26:23,32:25,40:h,41:u,42:d,43:p,44:f,45:g,53:y,71:m,72:b},{4:21,5:c,7:39,8:l,9:4,14:i,16:r,18:a,19:s,23:18,24:19,25:20,26:23,32:25,40:h,41:u,42:d,43:p,44:f,45:g,53:y,71:m,72:b},{4:21,5:c,7:40,8:l,9:4,14:i,16:r,18:a,19:s,23:18,24:19,25:20,26:23,32:25,40:h,41:u,42:d,43:p,44:f,45:g,53:y,71:m,72:b},{4:21,5:c,7:41,8:l,9:4,14:i,16:r,18:a,19:s,23:18,24:19,25:20,26:23,32:25,40:h,41:u,42:d,43:p,44:f,45:g,53:y,71:m,72:b},{4:21,5:c,7:42,8:l,9:4,14:i,16:r,18:a,19:s,23:18,24:19,25:20,26:23,32:25,40:h,41:u,42:d,43:p,44:f,45:g,53:y,71:m,72:b},{27:43,71:[1,44],72:[1,45]},{54:46,71:[1,47],72:[1,48]},{60:[1,49],62:[1,50]},e(x,[2,26]),e(x,[2,27]),e(x,[2,28]),e(x,[2,29]),e(x,[2,30]),e(x,[2,31]),e(v,[2,55]),e(v,[2,56]),e(o,[2,4]),{13:51,21:[1,52]},e(o,[2,12]),{1:[2,3]},{8:[2,14]},{8:[2,15]},{8:[2,16]},{8:[2,17]},{8:[2,18]},{28:[1,53]},{28:[2,53]},{28:[2,54]},{28:[1,54]},{28:[2,59]},{28:[2,60]},{61:55,64:k,65:w,66:C,67:T,68:E,69:S,70:A},{61:63,64:k,65:w,66:C,67:T,68:E,69:S,70:A},{11:64,22:_},{22:[2,11]},{5:[1,65]},{5:[1,66]},{62:[1,67]},e(L,[2,46]),e(L,[2,47]),e(L,[2,48]),e(L,[2,49]),e(L,[2,50]),e(L,[2,51]),e(L,[2,52]),{63:[1,68]},e(o,[2,5]),{5:B,29:69,30:N,33:D,35:O,37:M,39:I},{5:F,39:$,55:76,56:R,58:Z},{32:81,71:m,72:b},{32:82,71:m,72:b},e(P,[2,19]),{31:[1,83]},{31:[1,84]},{31:[1,85]},{31:[1,86]},{5:B,29:87,30:N,33:D,35:O,37:M,39:I},e(P,[2,25]),e(P,[2,39]),{31:[1,88]},{31:[1,89]},{5:F,39:$,55:90,56:R,58:Z},e(P,[2,43]),e(P,[2,44]),e(P,[2,45]),{32:91,71:m,72:b},{34:92,71:[1,93],72:[1,94]},{36:95,46:[1,96],47:[1,97],48:[1,98]},{38:99,49:[1,100],50:[1,101],51:[1,102],52:[1,103]},e(P,[2,24]),{57:104,71:[1,105],72:[1,106]},{59:107,71:[1,108],72:[1,109]},e(P,[2,42]),{5:[1,110]},{5:[1,111]},{5:[2,57]},{5:[2,58]},{5:[1,112]},{5:[2,32]},{5:[2,33]},{5:[2,34]},{5:[1,113]},{5:[2,35]},{5:[2,36]},{5:[2,37]},{5:[2,38]},{5:[1,114]},{5:[2,61]},{5:[2,62]},{5:[1,115]},{5:[2,63]},{5:[2,64]},{5:B,29:116,30:N,33:D,35:O,37:M,39:I},{5:B,29:117,30:N,33:D,35:O,37:M,39:I},{5:B,29:118,30:N,33:D,35:O,37:M,39:I},{5:B,29:119,30:N,33:D,35:O,37:M,39:I},{5:F,39:$,55:120,56:R,58:Z},{5:F,39:$,55:121,56:R,58:Z},e(P,[2,20]),e(P,[2,21]),e(P,[2,22]),e(P,[2,23]),e(P,[2,40]),e(P,[2,41])],defaultActions:{8:[2,9],10:[2,2],16:[2,1],37:[2,3],38:[2,14],39:[2,15],40:[2,16],41:[2,17],42:[2,18],44:[2,53],45:[2,54],47:[2,59],48:[2,60],52:[2,11],93:[2,57],94:[2,58],96:[2,32],97:[2,33],98:[2,34],100:[2,35],101:[2,36],102:[2,37],103:[2,38],105:[2,61],106:[2,62],108:[2,63],109:[2,64]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=a.slice.call(arguments,1),u=Object.create(this.lexer),d={yy:{}};for(var p in this.yy)Object.prototype.hasOwnProperty.call(this.yy,p)&&(d.yy[p]=this.yy[p]);u.setInput(t,d.yy),d.yy.lexer=u,d.yy.parser=this,void 0===u.yylloc&&(u.yylloc={});var f=u.yylloc;a.push(f);var g=u.options&&u.options.ranges;function y(){var t;return"number"!=typeof(t=i.pop()||u.lex()||1)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof d.yy.parseError?this.parseError=d.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var m,b,_,x,v,k,w,C,T={};;){if(b=n[n.length-1],this.defaultActions[b]?_=this.defaultActions[b]:(null==m&&(m=y()),_=s[b]&&s[b][m]),void 0===_||!_.length||!_[0]){var E="";for(v in C=[],s[b])this.terminals_[v]&&v>2&&C.push("'"+this.terminals_[v]+"'");E=u.showPosition?"Parse error on line "+(c+1)+":\n"+u.showPosition()+"\nExpecting "+C.join(", ")+", got '"+(this.terminals_[m]||m)+"'":"Parse error on line "+(c+1)+": Unexpected "+(1==m?"end of input":"'"+(this.terminals_[m]||m)+"'"),this.parseError(E,{text:u.match,token:this.terminals_[m]||m,line:u.yylineno,loc:f,expected:C})}if(_[0]instanceof Array&&_.length>1)throw new Error("Parse Error: multiple actions possible at state: "+b+", token: "+m);switch(_[0]){case 1:n.push(m),r.push(u.yytext),a.push(u.yylloc),n.push(_[1]),m=null,l=u.yyleng,o=u.yytext,c=u.yylineno,f=u.yylloc;break;case 2:if(k=this.productions_[_[1]][1],T.$=r[r.length-k],T._$={first_line:a[a.length-(k||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(k||1)].first_column,last_column:a[a.length-1].last_column},g&&(T._$.range=[a[a.length-(k||1)].range[0],a[a.length-1].range[1]]),void 0!==(x=this.performAction.apply(T,[o,l,c,d.yy,_[1],r,a].concat(h))))return x;k&&(n=n.slice(0,-1*k*2),r=r.slice(0,-1*k),a=a.slice(0,-1*k)),n.push(this.productions_[_[1]][0]),r.push(T.$),a.push(T._$),w=s[n[n.length-2]][n[n.length-1]],n.push(w);break;case 3:return!0}}return!0}},Y=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),19;case 1:return this.begin("type_directive"),20;case 2:return this.popState(),this.begin("arg_directive"),12;case 3:return this.popState(),this.popState(),22;case 4:return 21;case 5:return"title";case 6:return this.begin("acc_title"),14;case 7:return this.popState(),"acc_title_value";case 8:return this.begin("acc_descr"),16;case 9:return this.popState(),"acc_descr_value";case 10:this.begin("acc_descr_multiline");break;case 11:case 53:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:return 5;case 14:case 15:case 16:break;case 17:return 8;case 18:return 6;case 19:return 28;case 20:return 39;case 21:return 31;case 22:return 30;case 23:return 33;case 24:return 35;case 25:return 37;case 26:return 40;case 27:return 41;case 28:return 42;case 29:return 43;case 30:return 44;case 31:return 45;case 32:return 46;case 33:return 47;case 34:return 48;case 35:return 49;case 36:return 50;case 37:return 51;case 38:return 52;case 39:return 53;case 40:return 64;case 41:return 65;case 42:return 66;case 43:return 67;case 44:return 68;case 45:return 69;case 46:return 70;case 47:return 56;case 48:return 58;case 49:return 60;case 50:return 63;case 51:return 62;case 52:this.begin("string");break;case 54:return"qString";case 55:return e.yytext=e.yytext.trim(),71}},rules:[/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:title\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:(\r?\n)+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:$)/i,/^(?:requirementDiagram\b)/i,/^(?:\{)/i,/^(?:\})/i,/^(?::)/i,/^(?:id\b)/i,/^(?:text\b)/i,/^(?:risk\b)/i,/^(?:verifyMethod\b)/i,/^(?:requirement\b)/i,/^(?:functionalRequirement\b)/i,/^(?:interfaceRequirement\b)/i,/^(?:performanceRequirement\b)/i,/^(?:physicalRequirement\b)/i,/^(?:designConstraint\b)/i,/^(?:low\b)/i,/^(?:medium\b)/i,/^(?:high\b)/i,/^(?:analysis\b)/i,/^(?:demonstration\b)/i,/^(?:inspection\b)/i,/^(?:test\b)/i,/^(?:element\b)/i,/^(?:contains\b)/i,/^(?:copies\b)/i,/^(?:derives\b)/i,/^(?:satisfies\b)/i,/^(?:verifies\b)/i,/^(?:refines\b)/i,/^(?:traces\b)/i,/^(?:type\b)/i,/^(?:docref\b)/i,/^(?:<-)/i,/^(?:->)/i,/^(?:-)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[\w][^\r\n\{\<\>\-\=]*)/i],conditions:{acc_descr_multiline:{rules:[11,12],inclusive:!1},acc_descr:{rules:[9],inclusive:!1},acc_title:{rules:[7],inclusive:!1},close_directive:{rules:[],inclusive:!1},arg_directive:{rules:[3,4],inclusive:!1},type_directive:{rules:[2,3],inclusive:!1},open_directive:{rules:[1],inclusive:!1},unqString:{rules:[],inclusive:!1},token:{rules:[],inclusive:!1},string:{rules:[53,54],inclusive:!1},INITIAL:{rules:[0,5,6,8,10,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,55],inclusive:!0}}},t);function z(){this.yy={}}return j.lexer=Y,z.prototype=j,j.Parser=z,new z}();Nl.parser=Nl;const Dl=Nl,Ol=t=>null!==t.match(/^\s*requirement(Diagram)?/);let Ml=[],Il={},Fl={},$l={},Rl={};const Zl={RequirementType:{REQUIREMENT:"Requirement",FUNCTIONAL_REQUIREMENT:"Functional Requirement",INTERFACE_REQUIREMENT:"Interface Requirement",PERFORMANCE_REQUIREMENT:"Performance Requirement",PHYSICAL_REQUIREMENT:"Physical Requirement",DESIGN_CONSTRAINT:"Design Constraint"},RiskLevel:{LOW_RISK:"Low",MED_RISK:"Medium",HIGH_RISK:"High"},VerifyType:{VERIFY_ANALYSIS:"Analysis",VERIFY_DEMONSTRATION:"Demonstration",VERIFY_INSPECTION:"Inspection",VERIFY_TEST:"Test"},Relationships:{CONTAINS:"contains",COPIES:"copies",DERIVES:"derives",SATISFIES:"satisfies",VERIFIES:"verifies",REFINES:"refines",TRACES:"traces"},parseDirective:function(t,e,n){xp.parseDirective(this,t,e,n)},getConfig:()=>ui().req,addRequirement:(t,e)=>(void 0===Fl[t]&&(Fl[t]={name:t,type:e,id:Il.id,text:Il.text,risk:Il.risk,verifyMethod:Il.verifyMethod}),Il={},Fl[t]),getRequirements:()=>Fl,setNewReqId:t=>{void 0!==Il&&(Il.id=t)},setNewReqText:t=>{void 0!==Il&&(Il.text=t)},setNewReqRisk:t=>{void 0!==Il&&(Il.risk=t)},setNewReqVerifyMethod:t=>{void 0!==Il&&(Il.verifyMethod=t)},setAccTitle:Zi,getAccTitle:Pi,setAccDescription:ji,getAccDescription:Yi,addElement:t=>(void 0===Rl[t]&&(Rl[t]={name:t,type:$l.type,docRef:$l.docRef},Bt.info("Added new requirement: ",t)),$l={},Rl[t]),getElements:()=>Rl,setNewElementType:t=>{void 0!==$l&&($l.type=t)},setNewElementDocRef:t=>{void 0!==$l&&($l.docRef=t)},addRelationship:(t,e,n)=>{Ml.push({type:t,src:e,dst:n})},getRelationships:()=>Ml,clear:()=>{Ml=[],Il={},Fl={},$l={},Rl={},Ri()}},Pl={CONTAINS:"contains",ARROW:"arrow"},jl=Pl,Yl=(t,e)=>{let n=t.append("defs").append("marker").attr("id",Pl.CONTAINS+"_line_ending").attr("refX",0).attr("refY",e.line_height/2).attr("markerWidth",e.line_height).attr("markerHeight",e.line_height).attr("orient","auto").append("g");n.append("circle").attr("cx",e.line_height/2).attr("cy",e.line_height/2).attr("r",e.line_height/2).attr("fill","none"),n.append("line").attr("x1",0).attr("x2",e.line_height).attr("y1",e.line_height/2).attr("y2",e.line_height/2).attr("stroke-width",1),n.append("line").attr("y1",0).attr("y2",e.line_height).attr("x1",e.line_height/2).attr("x2",e.line_height/2).attr("stroke-width",1),t.append("defs").append("marker").attr("id",Pl.ARROW+"_line_ending").attr("refX",e.line_height).attr("refY",.5*e.line_height).attr("markerWidth",e.line_height).attr("markerHeight",e.line_height).attr("orient","auto").append("path").attr("d",`M0,0\n L${e.line_height},${e.line_height/2}\n M${e.line_height},${e.line_height/2}\n L0,${e.line_height}`).attr("stroke-width",1)};let zl={},Ul=0;const Wl=(t,e)=>t.insert("rect","#"+e).attr("class","req reqBox").attr("x",0).attr("y",0).attr("width",zl.rect_min_width+"px").attr("height",zl.rect_min_height+"px"),ql=(t,e,n)=>{let i=zl.rect_min_width/2,r=t.append("text").attr("class","req reqLabel reqTitle").attr("id",e).attr("x",i).attr("y",zl.rect_padding).attr("dominant-baseline","hanging"),a=0;n.forEach((t=>{0==a?r.append("tspan").attr("text-anchor","middle").attr("x",zl.rect_min_width/2).attr("dy",0).text(t):r.append("tspan").attr("text-anchor","middle").attr("x",zl.rect_min_width/2).attr("dy",.75*zl.line_height).text(t),a++}));let s=1.5*zl.rect_padding+a*zl.line_height*.75;return t.append("line").attr("class","req-title-line").attr("x1","0").attr("x2",zl.rect_min_width).attr("y1",s).attr("y2",s),{titleNode:r,y:s}},Hl=(t,e,n,i)=>{let r=t.append("text").attr("class","req reqLabel").attr("id",e).attr("x",zl.rect_padding).attr("y",i).attr("dominant-baseline","hanging"),a=0;let s=[];return n.forEach((t=>{let e=t.length;for(;e>30&&a<3;){let n=t.substring(0,30);e=(t=t.substring(30,t.length)).length,s[s.length]=n,a++}if(3==a){let t=s[s.length-1];s[s.length-1]=t.substring(0,t.length-4)+"..."}else s[s.length]=t;a=0})),s.forEach((t=>{r.append("tspan").attr("x",zl.rect_padding).attr("dy",zl.line_height).text(t)})),r},Vl=function(t,e,n,i,r){const a=n.edge(Gl(e.src),Gl(e.dst)),s=(0,o.jvg)().x((function(t){return t.x})).y((function(t){return t.y})),c=t.insert("path","#"+i).attr("class","er relationshipLine").attr("d",s(a.points)).attr("fill","none");e.type==r.db.Relationships.CONTAINS?c.attr("marker-start","url("+jt.getUrl(zl.arrowMarkerAbsolute)+"#"+e.type+"_line_ending)"):(c.attr("stroke-dasharray","10,7"),c.attr("marker-end","url("+jt.getUrl(zl.arrowMarkerAbsolute)+"#"+jl.ARROW+"_line_ending)")),((t,e,n,i)=>{const r=e.node().getTotalLength(),a=e.node().getPointAtLength(.5*r),s="rel"+Ul;Ul++;const o=t.append("text").attr("class","req relationshipLabel").attr("id",s).attr("x",a.x).attr("y",a.y).attr("text-anchor","middle").attr("dominant-baseline","middle").text(i).node().getBBox();t.insert("rect","#"+s).attr("class","req reqLabelBox").attr("x",a.x-o.width/2).attr("y",a.y-o.height/2).attr("width",o.width).attr("height",o.height).attr("fill","white").attr("fill-opacity","85%")})(t,c,0,`<<${e.type}>>`)},Gl=t=>t.replace(/\s/g,"").replace(/\./g,"_"),Xl={draw:(t,e,n,i)=>{zl=ui().requirement,i.db.clear(),i.parser.parse(t);const r=zl.securityLevel;let a;"sandbox"===r&&(a=(0,o.Ys)("#i"+e));const s=("sandbox"===r?(0,o.Ys)(a.nodes()[0].contentDocument.body):(0,o.Ys)("body")).select(`[id='${e}']`);Yl(s,zl);const c=new lt.k({multigraph:!1,compound:!1,directed:!0}).setGraph({rankdir:zl.layoutDirection,marginx:20,marginy:20,nodesep:100,edgesep:100,ranksep:100}).setDefaultEdgeLabel((function(){return{}}));let l=i.db.getRequirements(),h=i.db.getElements(),u=i.db.getRelationships();var d,p,f;d=l,p=c,f=s,Object.keys(d).forEach((t=>{let e=d[t];t=Gl(t),Bt.info("Added new requirement: ",t);const n=f.append("g").attr("id",t),i=Wl(n,"req-"+t);let r=ql(n,t+"_title",[`<<${e.type}>>`,`${e.name}`]);Hl(n,t+"_body",[`Id: ${e.id}`,`Text: ${e.text}`,`Risk: ${e.risk}`,`Verification: ${e.verifyMethod}`],r.y);const a=i.node().getBBox();p.setNode(t,{width:a.width,height:a.height,shape:"rect",id:t})})),((t,e,n)=>{Object.keys(t).forEach((i=>{let r=t[i];const a=Gl(i),s=n.append("g").attr("id",a),o="element-"+a,c=Wl(s,o);let l=ql(s,o+"_title",["<<Element>>",`${i}`]);Hl(s,o+"_body",[`Type: ${r.type||"Not Specified"}`,`Doc Ref: ${r.docRef||"None"}`],l.y);const h=c.node().getBBox();e.setNode(a,{width:h.width,height:h.height,shape:"rect",id:a})}))})(h,c,s),((t,e)=>{t.forEach((function(t){let n=Gl(t.src),i=Gl(t.dst);e.setEdge(n,i,{relationship:t})}))})(u,c),(0,ct.bK)(c),function(t,e){e.nodes().forEach((function(n){void 0!==n&&void 0!==e.node(n)&&(t.select("#"+n),t.select("#"+n).attr("transform","translate("+(e.node(n).x-e.node(n).width/2)+","+(e.node(n).y-e.node(n).height/2)+" )"))}))}(s,c),u.forEach((function(t){Vl(s,t,c,e,i)}));const g=zl.rect_padding,y=s.node().getBBox(),m=y.width+2*g,b=y.height+2*g;bi(s,b,m,zl.useMaxWidth),s.attr("viewBox",`${y.x-g} ${y.y-g} ${m} ${b}`)}};var Ql=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,2],i=[1,3],r=[1,5],a=[1,7],s=[2,5],o=[1,15],c=[1,17],l=[1,19],h=[1,21],u=[1,22],d=[1,23],p=[1,29],f=[1,30],g=[1,31],y=[1,32],m=[1,33],b=[1,34],_=[1,35],x=[1,36],v=[1,37],k=[1,38],w=[1,39],C=[1,40],T=[1,42],E=[1,43],S=[1,45],A=[1,46],L=[1,47],B=[1,48],N=[1,49],D=[1,50],O=[1,53],M=[1,4,5,19,21,23,26,28,34,35,36,38,40,41,42,43,44,46,48,50,51,52,53,54,56,57,62,63,64,65,73,83],I=[4,5,21,54,56],F=[4,5,19,21,23,26,28,34,35,36,38,40,41,42,43,44,46,48,50,54,56,57,62,63,64,65,73,83],$=[4,5,19,21,23,26,28,34,35,36,38,40,41,42,43,44,46,48,50,53,54,56,57,62,63,64,65,73,83],R=[4,5,19,21,23,26,28,34,35,36,38,40,41,42,43,44,46,48,50,52,54,56,57,62,63,64,65,73,83],Z=[4,5,19,21,23,26,28,34,35,36,38,40,41,42,43,44,46,48,50,51,54,56,57,62,63,64,65,73,83],P=[71,72,73],j=[1,125],Y=[1,4,5,7,19,21,23,26,28,34,35,36,38,40,41,42,43,44,46,48,50,51,52,53,54,56,57,62,63,64,65,73,83],z={trace:function(){},yy:{},symbols_:{error:2,start:3,SPACE:4,NEWLINE:5,directive:6,SD:7,document:8,line:9,statement:10,box_section:11,box_line:12,participant_statement:13,openDirective:14,typeDirective:15,closeDirective:16,":":17,argDirective:18,box:19,restOfLine:20,end:21,signal:22,autonumber:23,NUM:24,off:25,activate:26,actor:27,deactivate:28,note_statement:29,links_statement:30,link_statement:31,properties_statement:32,details_statement:33,title:34,legacy_title:35,acc_title:36,acc_title_value:37,acc_descr:38,acc_descr_value:39,acc_descr_multiline_value:40,loop:41,rect:42,opt:43,alt:44,else_sections:45,par:46,par_sections:47,critical:48,option_sections:49,break:50,option:51,and:52,else:53,participant:54,AS:55,participant_actor:56,note:57,placement:58,text2:59,over:60,actor_pair:61,links:62,link:63,properties:64,details:65,spaceList:66,",":67,left_of:68,right_of:69,signaltype:70,"+":71,"-":72,ACTOR:73,SOLID_OPEN_ARROW:74,DOTTED_OPEN_ARROW:75,SOLID_ARROW:76,DOTTED_ARROW:77,SOLID_CROSS:78,DOTTED_CROSS:79,SOLID_POINT:80,DOTTED_POINT:81,TXT:82,open_directive:83,type_directive:84,arg_directive:85,close_directive:86,$accept:0,$end:1},terminals_:{2:"error",4:"SPACE",5:"NEWLINE",7:"SD",17:":",19:"box",20:"restOfLine",21:"end",23:"autonumber",24:"NUM",25:"off",26:"activate",28:"deactivate",34:"title",35:"legacy_title",36:"acc_title",37:"acc_title_value",38:"acc_descr",39:"acc_descr_value",40:"acc_descr_multiline_value",41:"loop",42:"rect",43:"opt",44:"alt",46:"par",48:"critical",50:"break",51:"option",52:"and",53:"else",54:"participant",55:"AS",56:"participant_actor",57:"note",60:"over",62:"links",63:"link",64:"properties",65:"details",67:",",68:"left_of",69:"right_of",71:"+",72:"-",73:"ACTOR",74:"SOLID_OPEN_ARROW",75:"DOTTED_OPEN_ARROW",76:"SOLID_ARROW",77:"DOTTED_ARROW",78:"SOLID_CROSS",79:"DOTTED_CROSS",80:"SOLID_POINT",81:"DOTTED_POINT",82:"TXT",83:"open_directive",84:"type_directive",85:"arg_directive",86:"close_directive"},productions_:[0,[3,2],[3,2],[3,2],[3,2],[8,0],[8,2],[9,2],[9,1],[9,1],[11,0],[11,2],[12,2],[12,1],[12,1],[6,4],[6,6],[10,1],[10,4],[10,2],[10,4],[10,3],[10,3],[10,2],[10,3],[10,3],[10,2],[10,2],[10,2],[10,2],[10,2],[10,1],[10,1],[10,2],[10,2],[10,1],[10,4],[10,4],[10,4],[10,4],[10,4],[10,4],[10,4],[10,1],[49,1],[49,4],[47,1],[47,4],[45,1],[45,4],[13,5],[13,3],[13,5],[13,3],[29,4],[29,4],[30,3],[31,3],[32,3],[33,3],[66,2],[66,1],[61,3],[61,1],[58,1],[58,1],[22,5],[22,5],[22,4],[27,1],[70,1],[70,1],[70,1],[70,1],[70,1],[70,1],[70,1],[70,1],[59,1],[14,1],[15,1],[18,1],[16,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 4:return i.apply(a[o]),a[o];case 5:case 10:case 9:case 14:this.$=[];break;case 6:case 11:a[o-1].push(a[o]),this.$=a[o-1];break;case 7:case 8:case 12:case 13:case 63:this.$=a[o];break;case 18:a[o-1].unshift({type:"boxStart",boxData:i.parseBoxData(a[o-2])}),a[o-1].push({type:"boxEnd",boxText:a[o-2]}),this.$=a[o-1];break;case 20:this.$={type:"sequenceIndex",sequenceIndex:Number(a[o-2]),sequenceIndexStep:Number(a[o-1]),sequenceVisible:!0,signalType:i.LINETYPE.AUTONUMBER};break;case 21:this.$={type:"sequenceIndex",sequenceIndex:Number(a[o-1]),sequenceIndexStep:1,sequenceVisible:!0,signalType:i.LINETYPE.AUTONUMBER};break;case 22:this.$={type:"sequenceIndex",sequenceVisible:!1,signalType:i.LINETYPE.AUTONUMBER};break;case 23:this.$={type:"sequenceIndex",sequenceVisible:!0,signalType:i.LINETYPE.AUTONUMBER};break;case 24:this.$={type:"activeStart",signalType:i.LINETYPE.ACTIVE_START,actor:a[o-1]};break;case 25:this.$={type:"activeEnd",signalType:i.LINETYPE.ACTIVE_END,actor:a[o-1]};break;case 31:i.setDiagramTitle(a[o].substring(6)),this.$=a[o].substring(6);break;case 32:i.setDiagramTitle(a[o].substring(7)),this.$=a[o].substring(7);break;case 33:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 34:case 35:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 36:a[o-1].unshift({type:"loopStart",loopText:i.parseMessage(a[o-2]),signalType:i.LINETYPE.LOOP_START}),a[o-1].push({type:"loopEnd",loopText:a[o-2],signalType:i.LINETYPE.LOOP_END}),this.$=a[o-1];break;case 37:a[o-1].unshift({type:"rectStart",color:i.parseMessage(a[o-2]),signalType:i.LINETYPE.RECT_START}),a[o-1].push({type:"rectEnd",color:i.parseMessage(a[o-2]),signalType:i.LINETYPE.RECT_END}),this.$=a[o-1];break;case 38:a[o-1].unshift({type:"optStart",optText:i.parseMessage(a[o-2]),signalType:i.LINETYPE.OPT_START}),a[o-1].push({type:"optEnd",optText:i.parseMessage(a[o-2]),signalType:i.LINETYPE.OPT_END}),this.$=a[o-1];break;case 39:a[o-1].unshift({type:"altStart",altText:i.parseMessage(a[o-2]),signalType:i.LINETYPE.ALT_START}),a[o-1].push({type:"altEnd",signalType:i.LINETYPE.ALT_END}),this.$=a[o-1];break;case 40:a[o-1].unshift({type:"parStart",parText:i.parseMessage(a[o-2]),signalType:i.LINETYPE.PAR_START}),a[o-1].push({type:"parEnd",signalType:i.LINETYPE.PAR_END}),this.$=a[o-1];break;case 41:a[o-1].unshift({type:"criticalStart",criticalText:i.parseMessage(a[o-2]),signalType:i.LINETYPE.CRITICAL_START}),a[o-1].push({type:"criticalEnd",signalType:i.LINETYPE.CRITICAL_END}),this.$=a[o-1];break;case 42:a[o-1].unshift({type:"breakStart",breakText:i.parseMessage(a[o-2]),signalType:i.LINETYPE.BREAK_START}),a[o-1].push({type:"breakEnd",optText:i.parseMessage(a[o-2]),signalType:i.LINETYPE.BREAK_END}),this.$=a[o-1];break;case 45:this.$=a[o-3].concat([{type:"option",optionText:i.parseMessage(a[o-1]),signalType:i.LINETYPE.CRITICAL_OPTION},a[o]]);break;case 47:this.$=a[o-3].concat([{type:"and",parText:i.parseMessage(a[o-1]),signalType:i.LINETYPE.PAR_AND},a[o]]);break;case 49:this.$=a[o-3].concat([{type:"else",altText:i.parseMessage(a[o-1]),signalType:i.LINETYPE.ALT_ELSE},a[o]]);break;case 50:a[o-3].type="addParticipant",a[o-3].description=i.parseMessage(a[o-1]),this.$=a[o-3];break;case 51:a[o-1].type="addParticipant",this.$=a[o-1];break;case 52:a[o-3].type="addActor",a[o-3].description=i.parseMessage(a[o-1]),this.$=a[o-3];break;case 53:a[o-1].type="addActor",this.$=a[o-1];break;case 54:this.$=[a[o-1],{type:"addNote",placement:a[o-2],actor:a[o-1].actor,text:a[o]}];break;case 55:a[o-2]=[].concat(a[o-1],a[o-1]).slice(0,2),a[o-2][0]=a[o-2][0].actor,a[o-2][1]=a[o-2][1].actor,this.$=[a[o-1],{type:"addNote",placement:i.PLACEMENT.OVER,actor:a[o-2].slice(0,2),text:a[o]}];break;case 56:this.$=[a[o-1],{type:"addLinks",actor:a[o-1].actor,text:a[o]}];break;case 57:this.$=[a[o-1],{type:"addALink",actor:a[o-1].actor,text:a[o]}];break;case 58:this.$=[a[o-1],{type:"addProperties",actor:a[o-1].actor,text:a[o]}];break;case 59:this.$=[a[o-1],{type:"addDetails",actor:a[o-1].actor,text:a[o]}];break;case 62:this.$=[a[o-2],a[o]];break;case 64:this.$=i.PLACEMENT.LEFTOF;break;case 65:this.$=i.PLACEMENT.RIGHTOF;break;case 66:this.$=[a[o-4],a[o-1],{type:"addMessage",from:a[o-4].actor,to:a[o-1].actor,signalType:a[o-3],msg:a[o]},{type:"activeStart",signalType:i.LINETYPE.ACTIVE_START,actor:a[o-1]}];break;case 67:this.$=[a[o-4],a[o-1],{type:"addMessage",from:a[o-4].actor,to:a[o-1].actor,signalType:a[o-3],msg:a[o]},{type:"activeEnd",signalType:i.LINETYPE.ACTIVE_END,actor:a[o-4]}];break;case 68:this.$=[a[o-3],a[o-1],{type:"addMessage",from:a[o-3].actor,to:a[o-1].actor,signalType:a[o-2],msg:a[o]}];break;case 69:this.$={type:"addParticipant",actor:a[o]};break;case 70:this.$=i.LINETYPE.SOLID_OPEN;break;case 71:this.$=i.LINETYPE.DOTTED_OPEN;break;case 72:this.$=i.LINETYPE.SOLID;break;case 73:this.$=i.LINETYPE.DOTTED;break;case 74:this.$=i.LINETYPE.SOLID_CROSS;break;case 75:this.$=i.LINETYPE.DOTTED_CROSS;break;case 76:this.$=i.LINETYPE.SOLID_POINT;break;case 77:this.$=i.LINETYPE.DOTTED_POINT;break;case 78:this.$=i.parseMessage(a[o].trim().substring(1));break;case 79:i.parseDirective("%%{","open_directive");break;case 80:i.parseDirective(a[o],"type_directive");break;case 81:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 82:i.parseDirective("}%%","close_directive","sequence")}},table:[{3:1,4:n,5:i,6:4,7:r,14:6,83:a},{1:[3]},{3:8,4:n,5:i,6:4,7:r,14:6,83:a},{3:9,4:n,5:i,6:4,7:r,14:6,83:a},{3:10,4:n,5:i,6:4,7:r,14:6,83:a},e([1,4,5,19,23,26,28,34,35,36,38,40,41,42,43,44,46,48,50,54,56,57,62,63,64,65,73,83],s,{8:11}),{15:12,84:[1,13]},{84:[2,79]},{1:[2,1]},{1:[2,2]},{1:[2,3]},{1:[2,4],4:o,5:c,6:41,9:14,10:16,13:18,14:6,19:l,22:20,23:h,26:u,27:44,28:d,29:24,30:25,31:26,32:27,33:28,34:p,35:f,36:g,38:y,40:m,41:b,42:_,43:x,44:v,46:k,48:w,50:C,54:T,56:E,57:S,62:A,63:L,64:B,65:N,73:D,83:a},{16:51,17:[1,52],86:O},e([17,86],[2,80]),e(M,[2,6]),{6:41,10:54,13:18,14:6,19:l,22:20,23:h,26:u,27:44,28:d,29:24,30:25,31:26,32:27,33:28,34:p,35:f,36:g,38:y,40:m,41:b,42:_,43:x,44:v,46:k,48:w,50:C,54:T,56:E,57:S,62:A,63:L,64:B,65:N,73:D,83:a},e(M,[2,8]),e(M,[2,9]),e(M,[2,17]),{20:[1,55]},{5:[1,56]},{5:[1,59],24:[1,57],25:[1,58]},{27:60,73:D},{27:61,73:D},{5:[1,62]},{5:[1,63]},{5:[1,64]},{5:[1,65]},{5:[1,66]},e(M,[2,31]),e(M,[2,32]),{37:[1,67]},{39:[1,68]},e(M,[2,35]),{20:[1,69]},{20:[1,70]},{20:[1,71]},{20:[1,72]},{20:[1,73]},{20:[1,74]},{20:[1,75]},e(M,[2,43]),{27:76,73:D},{27:77,73:D},{70:78,74:[1,79],75:[1,80],76:[1,81],77:[1,82],78:[1,83],79:[1,84],80:[1,85],81:[1,86]},{58:87,60:[1,88],68:[1,89],69:[1,90]},{27:91,73:D},{27:92,73:D},{27:93,73:D},{27:94,73:D},e([5,55,67,74,75,76,77,78,79,80,81,82],[2,69]),{5:[1,95]},{18:96,85:[1,97]},{5:[2,82]},e(M,[2,7]),e(I,[2,10],{11:98}),e(M,[2,19]),{5:[1,100],24:[1,99]},{5:[1,101]},e(M,[2,23]),{5:[1,102]},{5:[1,103]},e(M,[2,26]),e(M,[2,27]),e(M,[2,28]),e(M,[2,29]),e(M,[2,30]),e(M,[2,33]),e(M,[2,34]),e(F,s,{8:104}),e(F,s,{8:105}),e(F,s,{8:106}),e($,s,{45:107,8:108}),e(R,s,{47:109,8:110}),e(Z,s,{49:111,8:112}),e(F,s,{8:113}),{5:[1,115],55:[1,114]},{5:[1,117],55:[1,116]},{27:120,71:[1,118],72:[1,119],73:D},e(P,[2,70]),e(P,[2,71]),e(P,[2,72]),e(P,[2,73]),e(P,[2,74]),e(P,[2,75]),e(P,[2,76]),e(P,[2,77]),{27:121,73:D},{27:123,61:122,73:D},{73:[2,64]},{73:[2,65]},{59:124,82:j},{59:126,82:j},{59:127,82:j},{59:128,82:j},e(Y,[2,15]),{16:129,86:O},{86:[2,81]},{4:[1,132],5:[1,134],12:131,13:133,21:[1,130],54:T,56:E},{5:[1,135]},e(M,[2,21]),e(M,[2,22]),e(M,[2,24]),e(M,[2,25]),{4:o,5:c,6:41,9:14,10:16,13:18,14:6,19:l,21:[1,136],22:20,23:h,26:u,27:44,28:d,29:24,30:25,31:26,32:27,33:28,34:p,35:f,36:g,38:y,40:m,41:b,42:_,43:x,44:v,46:k,48:w,50:C,54:T,56:E,57:S,62:A,63:L,64:B,65:N,73:D,83:a},{4:o,5:c,6:41,9:14,10:16,13:18,14:6,19:l,21:[1,137],22:20,23:h,26:u,27:44,28:d,29:24,30:25,31:26,32:27,33:28,34:p,35:f,36:g,38:y,40:m,41:b,42:_,43:x,44:v,46:k,48:w,50:C,54:T,56:E,57:S,62:A,63:L,64:B,65:N,73:D,83:a},{4:o,5:c,6:41,9:14,10:16,13:18,14:6,19:l,21:[1,138],22:20,23:h,26:u,27:44,28:d,29:24,30:25,31:26,32:27,33:28,34:p,35:f,36:g,38:y,40:m,41:b,42:_,43:x,44:v,46:k,48:w,50:C,54:T,56:E,57:S,62:A,63:L,64:B,65:N,73:D,83:a},{21:[1,139]},{4:o,5:c,6:41,9:14,10:16,13:18,14:6,19:l,21:[2,48],22:20,23:h,26:u,27:44,28:d,29:24,30:25,31:26,32:27,33:28,34:p,35:f,36:g,38:y,40:m,41:b,42:_,43:x,44:v,46:k,48:w,50:C,53:[1,140],54:T,56:E,57:S,62:A,63:L,64:B,65:N,73:D,83:a},{21:[1,141]},{4:o,5:c,6:41,9:14,10:16,13:18,14:6,19:l,21:[2,46],22:20,23:h,26:u,27:44,28:d,29:24,30:25,31:26,32:27,33:28,34:p,35:f,36:g,38:y,40:m,41:b,42:_,43:x,44:v,46:k,48:w,50:C,52:[1,142],54:T,56:E,57:S,62:A,63:L,64:B,65:N,73:D,83:a},{21:[1,143]},{4:o,5:c,6:41,9:14,10:16,13:18,14:6,19:l,21:[2,44],22:20,23:h,26:u,27:44,28:d,29:24,30:25,31:26,32:27,33:28,34:p,35:f,36:g,38:y,40:m,41:b,42:_,43:x,44:v,46:k,48:w,50:C,51:[1,144],54:T,56:E,57:S,62:A,63:L,64:B,65:N,73:D,83:a},{4:o,5:c,6:41,9:14,10:16,13:18,14:6,19:l,21:[1,145],22:20,23:h,26:u,27:44,28:d,29:24,30:25,31:26,32:27,33:28,34:p,35:f,36:g,38:y,40:m,41:b,42:_,43:x,44:v,46:k,48:w,50:C,54:T,56:E,57:S,62:A,63:L,64:B,65:N,73:D,83:a},{20:[1,146]},e(M,[2,51]),{20:[1,147]},e(M,[2,53]),{27:148,73:D},{27:149,73:D},{59:150,82:j},{59:151,82:j},{59:152,82:j},{67:[1,153],82:[2,63]},{5:[2,56]},{5:[2,78]},{5:[2,57]},{5:[2,58]},{5:[2,59]},{5:[1,154]},e(M,[2,18]),e(I,[2,11]),{13:155,54:T,56:E},e(I,[2,13]),e(I,[2,14]),e(M,[2,20]),e(M,[2,36]),e(M,[2,37]),e(M,[2,38]),e(M,[2,39]),{20:[1,156]},e(M,[2,40]),{20:[1,157]},e(M,[2,41]),{20:[1,158]},e(M,[2,42]),{5:[1,159]},{5:[1,160]},{59:161,82:j},{59:162,82:j},{5:[2,68]},{5:[2,54]},{5:[2,55]},{27:163,73:D},e(Y,[2,16]),e(I,[2,12]),e($,s,{8:108,45:164}),e(R,s,{8:110,47:165}),e(Z,s,{8:112,49:166}),e(M,[2,50]),e(M,[2,52]),{5:[2,66]},{5:[2,67]},{82:[2,62]},{21:[2,49]},{21:[2,47]},{21:[2,45]}],defaultActions:{7:[2,79],8:[2,1],9:[2,2],10:[2,3],53:[2,82],89:[2,64],90:[2,65],97:[2,81],124:[2,56],125:[2,78],126:[2,57],127:[2,58],128:[2,59],150:[2,68],151:[2,54],152:[2,55],161:[2,66],162:[2,67],163:[2,62],164:[2,49],165:[2,47],166:[2,45]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=a.slice.call(arguments,1),u=Object.create(this.lexer),d={yy:{}};for(var p in this.yy)Object.prototype.hasOwnProperty.call(this.yy,p)&&(d.yy[p]=this.yy[p]);u.setInput(t,d.yy),d.yy.lexer=u,d.yy.parser=this,void 0===u.yylloc&&(u.yylloc={});var f=u.yylloc;a.push(f);var g=u.options&&u.options.ranges;function y(){var t;return"number"!=typeof(t=i.pop()||u.lex()||1)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof d.yy.parseError?this.parseError=d.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var m,b,_,x,v,k,w,C,T={};;){if(b=n[n.length-1],this.defaultActions[b]?_=this.defaultActions[b]:(null==m&&(m=y()),_=s[b]&&s[b][m]),void 0===_||!_.length||!_[0]){var E="";for(v in C=[],s[b])this.terminals_[v]&&v>2&&C.push("'"+this.terminals_[v]+"'");E=u.showPosition?"Parse error on line "+(c+1)+":\n"+u.showPosition()+"\nExpecting "+C.join(", ")+", got '"+(this.terminals_[m]||m)+"'":"Parse error on line "+(c+1)+": Unexpected "+(1==m?"end of input":"'"+(this.terminals_[m]||m)+"'"),this.parseError(E,{text:u.match,token:this.terminals_[m]||m,line:u.yylineno,loc:f,expected:C})}if(_[0]instanceof Array&&_.length>1)throw new Error("Parse Error: multiple actions possible at state: "+b+", token: "+m);switch(_[0]){case 1:n.push(m),r.push(u.yytext),a.push(u.yylloc),n.push(_[1]),m=null,l=u.yyleng,o=u.yytext,c=u.yylineno,f=u.yylloc;break;case 2:if(k=this.productions_[_[1]][1],T.$=r[r.length-k],T._$={first_line:a[a.length-(k||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(k||1)].first_column,last_column:a[a.length-1].last_column},g&&(T._$.range=[a[a.length-(k||1)].range[0],a[a.length-1].range[1]]),void 0!==(x=this.performAction.apply(T,[o,l,c,d.yy,_[1],r,a].concat(h))))return x;k&&(n=n.slice(0,-1*k*2),r=r.slice(0,-1*k),a=a.slice(0,-1*k)),n.push(this.productions_[_[1]][0]),r.push(T.$),a.push(T._$),w=s[n[n.length-2]][n[n.length-1]],n.push(w);break;case 3:return!0}}return!0}},U=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),83;case 1:return this.begin("type_directive"),84;case 2:return this.popState(),this.begin("arg_directive"),17;case 3:return this.popState(),this.popState(),86;case 4:return 85;case 5:case 53:case 66:return 5;case 6:case 7:case 8:case 9:case 10:break;case 11:return 24;case 12:return this.begin("LINE"),19;case 13:return this.begin("ID"),54;case 14:return this.begin("ID"),56;case 15:return e.yytext=e.yytext.trim(),this.begin("ALIAS"),73;case 16:return this.popState(),this.popState(),this.begin("LINE"),55;case 17:return this.popState(),this.popState(),5;case 18:return this.begin("LINE"),41;case 19:return this.begin("LINE"),42;case 20:return this.begin("LINE"),43;case 21:return this.begin("LINE"),44;case 22:return this.begin("LINE"),53;case 23:return this.begin("LINE"),46;case 24:return this.begin("LINE"),52;case 25:return this.begin("LINE"),48;case 26:return this.begin("LINE"),51;case 27:return this.begin("LINE"),50;case 28:return this.popState(),20;case 29:return 21;case 30:return 68;case 31:return 69;case 32:return 62;case 33:return 63;case 34:return 64;case 35:return 65;case 36:return 60;case 37:return 57;case 38:return this.begin("ID"),26;case 39:return this.begin("ID"),28;case 40:return 34;case 41:return 35;case 42:return this.begin("acc_title"),36;case 43:return this.popState(),"acc_title_value";case 44:return this.begin("acc_descr"),38;case 45:return this.popState(),"acc_descr_value";case 46:this.begin("acc_descr_multiline");break;case 47:this.popState();break;case 48:return"acc_descr_multiline_value";case 49:return 7;case 50:return 23;case 51:return 25;case 52:return 67;case 54:return e.yytext=e.yytext.trim(),73;case 55:return 76;case 56:return 77;case 57:return 74;case 58:return 75;case 59:return 78;case 60:return 79;case 61:return 80;case 62:return 81;case 63:return 82;case 64:return 71;case 65:return 72;case 67:return"INVALID"}},rules:[/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[0-9]+(?=[ \n]+))/i,/^(?:box\b)/i,/^(?:participant\b)/i,/^(?:actor\b)/i,/^(?:[^\->:\n,;]+?([\-]*[^\->:\n,;]+?)*?(?=((?!\n)\s)+as(?!\n)\s|[#\n;]|$))/i,/^(?:as\b)/i,/^(?:(?:))/i,/^(?:loop\b)/i,/^(?:rect\b)/i,/^(?:opt\b)/i,/^(?:alt\b)/i,/^(?:else\b)/i,/^(?:par\b)/i,/^(?:and\b)/i,/^(?:critical\b)/i,/^(?:option\b)/i,/^(?:break\b)/i,/^(?:(?:[:]?(?:no)?wrap)?[^#\n;]*)/i,/^(?:end\b)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:links\b)/i,/^(?:link\b)/i,/^(?:properties\b)/i,/^(?:details\b)/i,/^(?:over\b)/i,/^(?:note\b)/i,/^(?:activate\b)/i,/^(?:deactivate\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:title:\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:sequenceDiagram\b)/i,/^(?:autonumber\b)/i,/^(?:off\b)/i,/^(?:,)/i,/^(?:;)/i,/^(?:[^\+\->:\n,;]+((?!(-x|--x|-\)|--\)))[\-]*[^\+\->:\n,;]+)*)/i,/^(?:->>)/i,/^(?:-->>)/i,/^(?:->)/i,/^(?:-->)/i,/^(?:-[x])/i,/^(?:--[x])/i,/^(?:-[\)])/i,/^(?:--[\)])/i,/^(?::(?:(?:no)?wrap)?[^#\n;]+)/i,/^(?:\+)/i,/^(?:-)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[47,48],inclusive:!1},acc_descr:{rules:[45],inclusive:!1},acc_title:{rules:[43],inclusive:!1},open_directive:{rules:[1,8],inclusive:!1},type_directive:{rules:[2,3,8],inclusive:!1},arg_directive:{rules:[3,4,8],inclusive:!1},ID:{rules:[7,8,15],inclusive:!1},ALIAS:{rules:[7,8,16,17],inclusive:!1},LINE:{rules:[7,8,28],inclusive:!1},INITIAL:{rules:[0,5,6,8,9,10,11,12,13,14,18,19,20,21,22,23,24,25,26,27,29,30,31,32,33,34,35,36,37,38,39,40,41,42,44,46,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67],inclusive:!0}}},t);function W(){this.yy={}}return z.lexer=U,W.prototype=z,z.Parser=W,new W}();Ql.parser=Ql;const Kl=Ql,Jl=t=>null!==t.match(/^\s*sequenceDiagram/);let th,eh,nh,ih={},rh=[],ah=[],sh=!1;const oh=function(t,e,n,i){let r=nh;const a=ih[t];if(a){if(nh&&a.box&&nh!==a.box)throw new Error("A same participant should only be defined in one Box: "+a.name+" can't be in '"+a.box.name+"' and in '"+nh.name+"' at the same time.");if(r=a.box?a.box:nh,a.box=r,a&&e===a.name&&null==n)return}null!=n&&null!=n.text||(n={text:e,wrap:null,type:i}),null!=i&&null!=n.text||(n={text:e,wrap:null,type:i}),ih[t]={box:r,name:e,description:n.text,wrap:void 0===n.wrap&&hh()||!!n.wrap,prevActor:th,links:{},properties:{},actorCnt:null,rectData:null,type:i||"participant"},th&&ih[th]&&(ih[th].nextActor=t),nh&&nh.actorKeys.push(t),th=t},ch=function(t,e,n={text:void 0,wrap:void 0},i){if(i===uh.ACTIVE_END){const e=(t=>{let e,n=0;for(e=0;e<ah.length;e++)ah[e].type===uh.ACTIVE_START&&ah[e].from.actor===t&&n++,ah[e].type===uh.ACTIVE_END&&ah[e].from.actor===t&&n--;return n})(t.actor);if(e<1){let e=new Error("Trying to inactivate an inactive participant ("+t.actor+")");throw e.hash={text:"->>-",token:"->>-",line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["'ACTIVE_PARTICIPANT'"]},e}}return ah.push({from:t,to:e,message:n.text,wrap:void 0===n.wrap&&hh()||!!n.wrap,type:i}),!0},lh=function(t){return ih[t]},hh=()=>void 0!==eh?eh:ui().sequence.wrap,uh={SOLID:0,DOTTED:1,NOTE:2,SOLID_CROSS:3,DOTTED_CROSS:4,SOLID_OPEN:5,DOTTED_OPEN:6,LOOP_START:10,LOOP_END:11,ALT_START:12,ALT_ELSE:13,ALT_END:14,OPT_START:15,OPT_END:16,ACTIVE_START:17,ACTIVE_END:18,PAR_START:19,PAR_AND:20,PAR_END:21,RECT_START:22,RECT_END:23,SOLID_POINT:24,DOTTED_POINT:25,AUTONUMBER:26,CRITICAL_START:27,CRITICAL_OPTION:28,CRITICAL_END:29,BREAK_START:30,BREAK_END:31},dh=function(t,e,n){n.text,void 0===n.wrap&&hh()||n.wrap;const i=[].concat(t,t);ah.push({from:i[0],to:i[1],message:n.text,wrap:void 0===n.wrap&&hh()||!!n.wrap,type:uh.NOTE,placement:e})},ph=function(t,e){const n=lh(t);try{let t=It(e.text,ui());t=t.replace(/&/g,"&"),t=t.replace(/=/g,"=");fh(n,JSON.parse(t))}catch(i){Bt.error("error while parsing actor link text",i)}};function fh(t,e){if(null==t.links)t.links=e;else for(let n in e)t.links[n]=e[n]}const gh=function(t,e){const n=lh(t);try{let t=It(e.text,ui());yh(n,JSON.parse(t))}catch(i){Bt.error("error while parsing actor properties text",i)}};function yh(t,e){if(null==t.properties)t.properties=e;else for(let n in e)t.properties[n]=e[n]}const mh=function(t,e){const n=lh(t),i=document.getElementById(e.text);try{const t=i.innerHTML,e=JSON.parse(t);e.properties&&yh(n,e.properties),e.links&&fh(n,e.links)}catch(r){Bt.error("error while parsing actor details text",r)}},bh=function(t){if(Array.isArray(t))t.forEach((function(t){bh(t)}));else switch(t.type){case"sequenceIndex":ah.push({from:void 0,to:void 0,message:{start:t.sequenceIndex,step:t.sequenceIndexStep,visible:t.sequenceVisible},wrap:!1,type:t.signalType});break;case"addParticipant":oh(t.actor,t.actor,t.description,"participant");break;case"addActor":oh(t.actor,t.actor,t.description,"actor");break;case"activeStart":case"activeEnd":ch(t.actor,void 0,void 0,t.signalType);break;case"addNote":dh(t.actor,t.placement,t.text);break;case"addLinks":ph(t.actor,t.text);break;case"addALink":!function(t,e){const n=lh(t);try{const t={};let s=It(e.text,ui());var i=s.indexOf("@");s=s.replace(/&/g,"&"),s=s.replace(/=/g,"=");var r=s.slice(0,i-1).trim(),a=s.slice(i+1).trim();t[r]=a,fh(n,t)}catch(s){Bt.error("error while parsing actor link text",s)}}(t.actor,t.text);break;case"addProperties":gh(t.actor,t.text);break;case"addDetails":mh(t.actor,t.text);break;case"addMessage":ch(t.from,t.to,t.msg,t.signalType);break;case"boxStart":e=t.boxData,rh.push({name:e.text,wrap:void 0===e.wrap&&hh()||!!e.wrap,fill:e.color,actorKeys:[]}),nh=rh.slice(-1)[0];break;case"boxEnd":nh=void 0;break;case"loopStart":ch(void 0,void 0,t.loopText,t.signalType);break;case"loopEnd":case"rectEnd":case"optEnd":case"altEnd":case"parEnd":case"criticalEnd":case"breakEnd":ch(void 0,void 0,void 0,t.signalType);break;case"rectStart":ch(void 0,void 0,t.color,t.signalType);break;case"optStart":ch(void 0,void 0,t.optText,t.signalType);break;case"altStart":case"else":ch(void 0,void 0,t.altText,t.signalType);break;case"setAccTitle":Zi(t.text);break;case"parStart":case"and":ch(void 0,void 0,t.parText,t.signalType);break;case"criticalStart":ch(void 0,void 0,t.criticalText,t.signalType);break;case"option":ch(void 0,void 0,t.optionText,t.signalType);break;case"breakStart":ch(void 0,void 0,t.breakText,t.signalType)}var e},_h={addActor:oh,addMessage:function(t,e,n,i){ah.push({from:t,to:e,message:n.text,wrap:void 0===n.wrap&&hh()||!!n.wrap,answer:i})},addSignal:ch,addLinks:ph,addDetails:mh,addProperties:gh,autoWrap:hh,setWrap:function(t){eh=t},enableSequenceNumbers:function(){sh=!0},disableSequenceNumbers:function(){sh=!1},showSequenceNumbers:()=>sh,getMessages:function(){return ah},getActors:function(){return ih},getActor:lh,getActorKeys:function(){return Object.keys(ih)},getActorProperty:function(t,e){if(void 0!==t&&void 0!==t.properties)return t.properties[e]},getAccTitle:Pi,getBoxes:function(){return rh},getDiagramTitle:Ui,setDiagramTitle:zi,parseDirective:function(t,e,n){xp.parseDirective(this,t,e,n)},getConfig:()=>ui().sequence,clear:function(){ih={},rh=[],ah=[],sh=!1,Ri()},parseMessage:function(t){const e=t.trim(),n={text:e.replace(/^:?(?:no)?wrap:/,"").trim(),wrap:null!==e.match(/^:?wrap:/)||null===e.match(/^:?nowrap:/)&&void 0};return Bt.debug("parseMessage:",n),n},parseBoxData:function(t){const e=t.match(/^((?:rgba?|hsla?)\s*\(.*\)|\w*)(.*)$/);let n=null!=e&&e[1]?e[1].trim():"transparent",i=null!=e&&e[2]?e[2].trim():void 0;if(window&&window.CSS)window.CSS.supports("color",n)||(n="transparent",i=t.trim());else{const e=(new Option).style;e.color=n,e.color!==n&&(n="transparent",i=t.trim())}return{color:n,text:void 0!==i?It(i.replace(/^:?(?:no)?wrap:/,""),ui()):void 0,wrap:void 0!==i?null!==i.match(/^:?wrap:/)||null===i.match(/^:?nowrap:/)&&void 0:void 0}},LINETYPE:uh,ARROWTYPE:{FILLED:0,OPEN:1},PLACEMENT:{LEFTOF:0,RIGHTOF:1,OVER:2},addNote:dh,setAccTitle:Zi,apply:bh,setAccDescription:ji,getAccDescription:Yi,hasAtLeastOneBox:function(){return rh.length>0},hasAtLeastOneBoxWithTitle:function(){return rh.some((t=>t.name))}};let xh=[];const vh=()=>{xh.forEach((t=>{t()})),xh=[]},kh=function(t,e){const n=t.append("rect");return n.attr("x",e.x),n.attr("y",e.y),n.attr("fill",e.fill),n.attr("stroke",e.stroke),n.attr("width",e.width),n.attr("height",e.height),n.attr("rx",e.rx),n.attr("ry",e.ry),void 0!==e.class&&n.attr("class",e.class),n},wh=(t,e)=>{var n;n=()=>{const n=document.querySelectorAll(t);0!==n.length&&(n[0].addEventListener("mouseover",(function(){Eh("actor"+e+"_popup")})),n[0].addEventListener("mouseout",(function(){Sh("actor"+e+"_popup")})))},xh.push(n)},Ch=function(t,e,n,i){const r=t.append("image");r.attr("x",e),r.attr("y",n);var a=(0,s.Nm)(i);r.attr("xlink:href",a)},Th=function(t,e,n,i){const r=t.append("use");r.attr("x",e),r.attr("y",n);var a=(0,s.Nm)(i);r.attr("xlink:href","#"+a)},Eh=function(t){var e=document.getElementById(t);null!=e&&(e.style.display="block")},Sh=function(t){var e=document.getElementById(t);null!=e&&(e.style.display="none")},Ah=function(t,e){let n=0,i=0;const r=e.text.split(jt.lineBreakRegex),[a,s]=ti(e.fontSize);let o=[],c=0,l=()=>e.y;if(void 0!==e.valign&&void 0!==e.textMargin&&e.textMargin>0)switch(e.valign){case"top":case"start":l=()=>Math.round(e.y+e.textMargin);break;case"middle":case"center":l=()=>Math.round(e.y+(n+i+e.textMargin)/2);break;case"bottom":case"end":l=()=>Math.round(e.y+(n+i+2*e.textMargin)-e.textMargin)}if(void 0!==e.anchor&&void 0!==e.textMargin&&void 0!==e.width)switch(e.anchor){case"left":case"start":e.x=Math.round(e.x+e.textMargin),e.anchor="start",e.dominantBaseline="middle",e.alignmentBaseline="middle";break;case"middle":case"center":e.x=Math.round(e.x+e.width/2),e.anchor="middle",e.dominantBaseline="middle",e.alignmentBaseline="middle";break;case"right":case"end":e.x=Math.round(e.x+e.width-e.textMargin),e.anchor="end",e.dominantBaseline="middle",e.alignmentBaseline="middle"}for(let[h,u]of r.entries()){void 0!==e.textMargin&&0===e.textMargin&&void 0!==a&&(c=h*a);const r=t.append("text");if(r.attr("x",e.x),r.attr("y",l()),void 0!==e.anchor&&r.attr("text-anchor",e.anchor).attr("dominant-baseline",e.dominantBaseline).attr("alignment-baseline",e.alignmentBaseline),void 0!==e.fontFamily&&r.style("font-family",e.fontFamily),void 0!==s&&r.style("font-size",s),void 0!==e.fontWeight&&r.style("font-weight",e.fontWeight),void 0!==e.fill&&r.attr("fill",e.fill),void 0!==e.class&&r.attr("class",e.class),void 0!==e.dy?r.attr("dy",e.dy):0!==c&&r.attr("dy",c),e.tspan){const t=r.append("tspan");t.attr("x",e.x),void 0!==e.fill&&t.attr("fill",e.fill),t.text(u)}else r.text(u);void 0!==e.valign&&void 0!==e.textMargin&&e.textMargin>0&&(i+=(r._groups||r)[0][0].getBBox().height,n=i),o.push(r)}return o},Lh=function(t,e){const n=t.append("polygon");var i,r,a,s,o;return n.attr("points",(i=e.x,r=e.y,a=e.width,s=e.height,i+","+r+" "+(i+a)+","+r+" "+(i+a)+","+(r+s-(o=7))+" "+(i+a-1.2*o)+","+(r+s)+" "+i+","+(r+s))),n.attr("class","labelBox"),e.y=e.y+e.height/2,Ah(t,e),n};let Bh=-1;const Nh=(t,e)=>{t.selectAll&&t.selectAll(".actor-line").attr("class","200").attr("y2",e-55)},Dh=function(t,e){kh(t,{x:e.startx,y:e.starty,width:e.stopx-e.startx,height:e.stopy-e.starty,fill:e.fill,stroke:e.stroke,class:"rect"}).lower()},Oh=function(){return{x:0,y:0,fill:void 0,anchor:void 0,style:"#666",width:void 0,height:void 0,textMargin:0,rx:0,ry:0,tspan:!0,valign:void 0}},Mh=function(){return{x:0,y:0,fill:"#EDF2AE",stroke:"#666",width:100,anchor:"start",height:100,rx:0,ry:0}},Ih=function(){function t(t,e,n,r,a,s,o){i(e.append("text").attr("x",n+a/2).attr("y",r+s/2+5).style("text-anchor","middle").text(t),o)}function e(t,e,n,r,a,s,o,c){const{actorFontSize:l,actorFontFamily:h,actorFontWeight:u}=c,[d,p]=ti(l),f=t.split(jt.lineBreakRegex);for(let g=0;g<f.length;g++){const t=g*d-d*(f.length-1)/2,c=e.append("text").attr("x",n+a/2).attr("y",r).style("text-anchor","middle").style("font-size",p).style("font-weight",u).style("font-family",h);c.append("tspan").attr("x",n+a/2).attr("dy",t).text(f[g]),c.attr("y",r+s/2).attr("dominant-baseline","central").attr("alignment-baseline","central"),i(c,o)}}function n(t,n,r,a,s,o,c,l){const h=n.append("switch"),u=h.append("foreignObject").attr("x",r).attr("y",a).attr("width",s).attr("height",o).append("xhtml:div").style("display","table").style("height","100%").style("width","100%");u.append("div").style("display","table-cell").style("text-align","center").style("vertical-align","middle").text(t),e(t,h,r,a,s,o,c,l),i(u,c)}function i(t,e){for(const n in e)e.hasOwnProperty(n)&&t.attr(n,e[n])}return function(i){return"fo"===i.textPlacement?n:"old"===i.textPlacement?t:e}}(),Fh=function(){function t(t,e,n,r,a,s,o){i(e.append("text").attr("x",n).attr("y",r).style("text-anchor","start").text(t),o)}function e(t,e,n,r,a,s,o,c){const{actorFontSize:l,actorFontFamily:h,actorFontWeight:u}=c,d=t.split(jt.lineBreakRegex);for(let p=0;p<d.length;p++){const t=p*l-l*(d.length-1)/2,a=e.append("text").attr("x",n).attr("y",r).style("text-anchor","start").style("font-size",l).style("font-weight",u).style("font-family",h);a.append("tspan").attr("x",n).attr("dy",t).text(d[p]),a.attr("y",r+s/2).attr("dominant-baseline","central").attr("alignment-baseline","central"),i(a,o)}}function n(t,n,r,a,s,o,c,l){const h=n.append("switch"),u=h.append("foreignObject").attr("x",r).attr("y",a).attr("width",s).attr("height",o).append("xhtml:div").style("display","table").style("height","100%").style("width","100%");u.append("div").style("display","table-cell").style("text-align","center").style("vertical-align","middle").text(t),e(t,h,r,a,0,o,c,l),i(u,c)}function i(t,e){for(const n in e)e.hasOwnProperty(n)&&t.attr(n,e[n])}return function(i){return"fo"===i.textPlacement?n:"old"===i.textPlacement?t:e}}(),$h={drawRect:kh,drawText:Ah,drawLabel:Lh,drawActor:function(t,e,n,i){switch(e.type){case"actor":return function(t,e,n,i){const r=e.x+e.width/2,a=e.y+80;i||(Bh++,t.append("line").attr("id","actor"+Bh).attr("x1",r).attr("y1",a).attr("x2",r).attr("y2",2e3).attr("class","actor-line").attr("stroke-width","0.5px").attr("stroke","#999"));const s=t.append("g");s.attr("class","actor-man");const o=Mh();o.x=e.x,o.y=e.y,o.fill="#eaeaea",o.width=e.width,o.height=e.height,o.class="actor",o.rx=3,o.ry=3,s.append("line").attr("id","actor-man-torso"+Bh).attr("x1",r).attr("y1",e.y+25).attr("x2",r).attr("y2",e.y+45),s.append("line").attr("id","actor-man-arms"+Bh).attr("x1",r-18).attr("y1",e.y+33).attr("x2",r+18).attr("y2",e.y+33),s.append("line").attr("x1",r-18).attr("y1",e.y+60).attr("x2",r).attr("y2",e.y+45),s.append("line").attr("x1",r).attr("y1",e.y+45).attr("x2",r+16).attr("y2",e.y+60);const c=s.append("circle");c.attr("cx",e.x+e.width/2),c.attr("cy",e.y+10),c.attr("r",15),c.attr("width",e.width),c.attr("height",e.height);const l=s.node().getBBox();return e.height=l.height,Ih(n)(e.description,s,o.x,o.y+35,o.width,o.height,{class:"actor"},n),e.height}(t,e,n,i);case"participant":return function(t,e,n,i){const r=e.x+e.width/2,a=e.y+5,s=t.append("g");var o=s;i||(Bh++,o.append("line").attr("id","actor"+Bh).attr("x1",r).attr("y1",a).attr("x2",r).attr("y2",2e3).attr("class","actor-line").attr("stroke-width","0.5px").attr("stroke","#999"),o=s.append("g"),e.actorCnt=Bh,null!=e.links&&(o.attr("id","root-"+Bh),wh("#root-"+Bh,Bh)));const c=Mh();var l="actor";null!=e.properties&&e.properties.class?l=e.properties.class:c.fill="#eaeaea",c.x=e.x,c.y=e.y,c.width=e.width,c.height=e.height,c.class=l,c.rx=3,c.ry=3;const h=kh(o,c);if(e.rectData=c,null!=e.properties&&e.properties.icon){const t=e.properties.icon.trim();"@"===t.charAt(0)?Th(o,c.x+c.width-20,c.y+10,t.substr(1)):Ch(o,c.x+c.width-20,c.y+10,t)}Ih(n)(e.description,o,c.x,c.y,c.width,c.height,{class:"actor"},n);let u=e.height;if(h.node){const t=h.node().getBBox();e.height=t.height,u=t.height}return u}(t,e,n,i)}},drawBox:function(t,e,n){const i=t.append("g");Dh(i,e),e.name&&Ih(n)(e.name,i,e.x,e.y+(e.textMaxHeight||0)/2,e.width,0,{class:"text"},n),i.lower()},drawPopup:function(t,e,n,i,r){if(void 0===e.links||null===e.links||0===Object.keys(e.links).length)return{height:0,width:0};const a=e.links,o=e.actorCnt,c=e.rectData;var l="none";r&&(l="block !important");const h=t.append("g");h.attr("id","actor"+o+"_popup"),h.attr("class","actorPopupMenu"),h.attr("display",l),wh("#actor"+o+"_popup",o);var u="";void 0!==c.class&&(u=" "+c.class);let d=c.width>n?c.width:n;const p=h.append("rect");if(p.attr("class","actorPopupMenuPanel"+u),p.attr("x",c.x),p.attr("y",c.height),p.attr("fill",c.fill),p.attr("stroke",c.stroke),p.attr("width",d),p.attr("height",c.height),p.attr("rx",c.rx),p.attr("ry",c.ry),null!=a){var f=20;for(let t in a){var g=h.append("a"),y=(0,s.Nm)(a[t]);g.attr("xlink:href",y),g.attr("target","_blank"),Fh(i)(t,g,c.x+10,c.height+f,d,20,{class:"actor"},i),f+=30}}return p.attr("height",f),{height:c.height+f,width:d}},drawImage:Ch,drawEmbeddedImage:Th,anchorElement:function(t){return t.append("g")},drawActivation:function(t,e,n,i,r){const a=Mh(),s=e.anchored;a.x=e.startx,a.y=e.starty,a.class="activation"+r%3,a.width=e.stopx-e.startx,a.height=n-e.starty,kh(s,a)},drawLoop:function(t,e,n,i){const{boxMargin:r,boxTextMargin:a,labelBoxHeight:s,labelBoxWidth:o,messageFontFamily:c,messageFontSize:l,messageFontWeight:h}=i,u=t.append("g"),d=function(t,e,n,i){return u.append("line").attr("x1",t).attr("y1",e).attr("x2",n).attr("y2",i).attr("class","loopLine")};d(e.startx,e.starty,e.stopx,e.starty),d(e.stopx,e.starty,e.stopx,e.stopy),d(e.startx,e.stopy,e.stopx,e.stopy),d(e.startx,e.starty,e.startx,e.stopy),void 0!==e.sections&&e.sections.forEach((function(t){d(e.startx,t.y,e.stopx,t.y).style("stroke-dasharray","3, 3")}));let p=Oh();p.text=n,p.x=e.startx,p.y=e.starty,p.fontFamily=c,p.fontSize=l,p.fontWeight=h,p.anchor="middle",p.valign="middle",p.tspan=!1,p.width=o||50,p.height=s||20,p.textMargin=a,p.class="labelText",Lh(u,p),p=Oh(),p.text=e.title,p.x=e.startx+o/2+(e.stopx-e.startx)/2,p.y=e.starty+r+a,p.anchor="middle",p.valign="middle",p.textMargin=a,p.class="loopText",p.fontFamily=c,p.fontSize=l,p.fontWeight=h,p.wrap=!0;let f=Ah(u,p);return void 0!==e.sectionTitles&&e.sectionTitles.forEach((function(t,n){if(t.message){p.text=t.message,p.x=e.startx+(e.stopx-e.startx)/2,p.y=e.sections[n].y+r+a,p.class="loopText",p.anchor="middle",p.valign="middle",p.tspan=!1,p.fontFamily=c,p.fontSize=l,p.fontWeight=h,p.wrap=e.wrap,f=Ah(u,p);let i=Math.round(f.map((t=>(t._groups||t)[0][0].getBBox().height)).reduce(((t,e)=>t+e)));e.sections[n].height+=i-(r+a)}})),e.height=Math.round(e.stopy-e.starty),u},drawBackgroundRect:Dh,insertArrowHead:function(t){t.append("defs").append("marker").attr("id","arrowhead").attr("refX",9).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z")},insertArrowFilledHead:function(t){t.append("defs").append("marker").attr("id","filled-head").attr("refX",18).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},insertSequenceNumber:function(t){t.append("defs").append("marker").attr("id","sequencenumber").attr("refX",15).attr("refY",15).attr("markerWidth",60).attr("markerHeight",40).attr("orient","auto").append("circle").attr("cx",15).attr("cy",15).attr("r",6)},insertArrowCrossHead:function(t){t.append("defs").append("marker").attr("id","crosshead").attr("markerWidth",15).attr("markerHeight",8).attr("orient","auto").attr("refX",4).attr("refY",5).append("path").attr("fill","none").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1pt").attr("d","M 1,2 L 6,7 M 6,2 L 1,7")},insertDatabaseIcon:function(t){t.append("defs").append("symbol").attr("id","database").attr("fill-rule","evenodd").attr("clip-rule","evenodd").append("path").attr("transform","scale(.5)").attr("d","M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z")},insertComputerIcon:function(t){t.append("defs").append("symbol").attr("id","computer").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z")},insertClockIcon:function(t){t.append("defs").append("symbol").attr("id","clock").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z")},getTextObj:Oh,getNoteRect:Mh,popupMenu:function(t){return"var pu = document.getElementById('"+t+"'); if (pu != null) { pu.style.display = 'block'; }"},popdownMenu:function(t){return"var pu = document.getElementById('"+t+"'); if (pu != null) { pu.style.display = 'none'; }"},fixLifeLineHeights:Nh,sanitizeUrl:s.Nm};let Rh={};const Zh={data:{startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},verticalPos:0,sequenceItems:[],activations:[],models:{getHeight:function(){return Math.max.apply(null,0===this.actors.length?[0]:this.actors.map((t=>t.height||0)))+(0===this.loops.length?0:this.loops.map((t=>t.height||0)).reduce(((t,e)=>t+e)))+(0===this.messages.length?0:this.messages.map((t=>t.height||0)).reduce(((t,e)=>t+e)))+(0===this.notes.length?0:this.notes.map((t=>t.height||0)).reduce(((t,e)=>t+e)))},clear:function(){this.actors=[],this.boxes=[],this.loops=[],this.messages=[],this.notes=[]},addBox:function(t){this.boxes.push(t)},addActor:function(t){this.actors.push(t)},addLoop:function(t){this.loops.push(t)},addMessage:function(t){this.messages.push(t)},addNote:function(t){this.notes.push(t)},lastActor:function(){return this.actors[this.actors.length-1]},lastLoop:function(){return this.loops[this.loops.length-1]},lastMessage:function(){return this.messages[this.messages.length-1]},lastNote:function(){return this.notes[this.notes.length-1]},actors:[],boxes:[],loops:[],messages:[],notes:[]},init:function(){this.sequenceItems=[],this.activations=[],this.models.clear(),this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},this.verticalPos=0,Wh(ui())},updateVal:function(t,e,n,i){void 0===t[e]?t[e]=n:t[e]=i(n,t[e])},updateBounds:function(t,e,n,i){const r=this;let a=0;function s(s){return function(o){a++;const c=r.sequenceItems.length-a+1;r.updateVal(o,"starty",e-c*Rh.boxMargin,Math.min),r.updateVal(o,"stopy",i+c*Rh.boxMargin,Math.max),r.updateVal(Zh.data,"startx",t-c*Rh.boxMargin,Math.min),r.updateVal(Zh.data,"stopx",n+c*Rh.boxMargin,Math.max),"activation"!==s&&(r.updateVal(o,"startx",t-c*Rh.boxMargin,Math.min),r.updateVal(o,"stopx",n+c*Rh.boxMargin,Math.max),r.updateVal(Zh.data,"starty",e-c*Rh.boxMargin,Math.min),r.updateVal(Zh.data,"stopy",i+c*Rh.boxMargin,Math.max))}}this.sequenceItems.forEach(s()),this.activations.forEach(s("activation"))},insert:function(t,e,n,i){const r=Math.min(t,n),a=Math.max(t,n),s=Math.min(e,i),o=Math.max(e,i);this.updateVal(Zh.data,"startx",r,Math.min),this.updateVal(Zh.data,"starty",s,Math.min),this.updateVal(Zh.data,"stopx",a,Math.max),this.updateVal(Zh.data,"stopy",o,Math.max),this.updateBounds(r,s,a,o)},newActivation:function(t,e,n){const i=n[t.from.actor],r=qh(t.from.actor).length||0,a=i.x+i.width/2+(r-1)*Rh.activationWidth/2;this.activations.push({startx:a,starty:this.verticalPos+2,stopx:a+Rh.activationWidth,stopy:void 0,actor:t.from.actor,anchored:$h.anchorElement(e)})},endActivation:function(t){const e=this.activations.map((function(t){return t.actor})).lastIndexOf(t.from.actor);return this.activations.splice(e,1)[0]},createLoop:function(t={message:void 0,wrap:!1,width:void 0},e){return{startx:void 0,starty:this.verticalPos,stopx:void 0,stopy:void 0,title:t.message,wrap:t.wrap,width:t.width,height:0,fill:e}},newLoop:function(t={message:void 0,wrap:!1,width:void 0},e){this.sequenceItems.push(this.createLoop(t,e))},endLoop:function(){return this.sequenceItems.pop()},addSectionToLoop:function(t){const e=this.sequenceItems.pop();e.sections=e.sections||[],e.sectionTitles=e.sectionTitles||[],e.sections.push({y:Zh.getVerticalPos(),height:0}),e.sectionTitles.push(t),this.sequenceItems.push(e)},bumpVerticalPos:function(t){this.verticalPos=this.verticalPos+t,this.data.stopy=this.verticalPos},getVerticalPos:function(){return this.verticalPos},getBounds:function(){return{bounds:this.data,models:this.models}}},Ph=t=>({fontFamily:t.messageFontFamily,fontSize:t.messageFontSize,fontWeight:t.messageFontWeight}),jh=t=>({fontFamily:t.noteFontFamily,fontSize:t.noteFontSize,fontWeight:t.noteFontWeight}),Yh=t=>({fontFamily:t.actorFontFamily,fontSize:t.actorFontSize,fontWeight:t.actorFontWeight});const zh=function(t,e,n,i,r,a,s){if(!0===r.hideUnusedParticipants){const t=new Set;a.forEach((e=>{t.add(e.from),t.add(e.to)})),n=n.filter((e=>t.has(e)))}let o,c=0,l=0,h=0;for(const u of n){const n=e[u],r=n.box;o&&o!=r&&(s||Zh.models.addBox(o),l+=Rh.boxMargin+o.margin),r&&r!=o&&(s||(r.x=c+l,r.y=i),l+=r.margin),n.width=n.width||Rh.width,n.height=Math.max(n.height||Rh.height,Rh.height),n.margin=n.margin||Rh.actorMargin,n.x=c+l,n.y=Zh.getVerticalPos();const a=$h.drawActor(t,n,Rh,s);h=Math.max(h,a),Zh.insert(n.x,i,n.x+n.width,n.height),c+=n.width+l,n.box&&(n.box.width=c+r.margin-n.box.x),l=n.margin,o=n.box,Zh.models.addActor(n)}o&&!s&&Zh.models.addBox(o),Zh.bumpVerticalPos(h)},Uh=function(t,e,n,i){let r=0,a=0;for(const s of n){const n=e[s],o=Gh(n),c=$h.drawPopup(t,n,o,Rh,Rh.forceMenus,i);c.height>r&&(r=c.height),c.width+n.x>a&&(a=c.width+n.x)}return{maxHeight:r,maxWidth:a}},Wh=function(t){On(Rh,t),t.fontFamily&&(Rh.actorFontFamily=Rh.noteFontFamily=Rh.messageFontFamily=t.fontFamily),t.fontSize&&(Rh.actorFontSize=Rh.noteFontSize=Rh.messageFontSize=t.fontSize),t.fontWeight&&(Rh.actorFontWeight=Rh.noteFontWeight=Rh.messageFontWeight=t.fontWeight)},qh=function(t){return Zh.activations.filter((function(e){return e.actor===t}))},Hh=function(t,e){const n=e[t],i=qh(t);return[i.reduce((function(t,e){return Math.min(t,e.startx)}),n.x+n.width/2),i.reduce((function(t,e){return Math.max(t,e.stopx)}),n.x+n.width/2)]};function Vh(t,e,n,i,r){Zh.bumpVerticalPos(n);let a=i;if(e.id&&e.message&&t[e.id]){const n=t[e.id].width,r=Ph(Rh);e.message=ei.wrapLabel(`[${e.message}]`,n-2*Rh.wrapPadding,r),e.width=n,e.wrap=!0;const s=ei.calculateTextDimensions(e.message,r),o=Math.max(s.height,Rh.labelBoxHeight);a=i+o,Bt.debug(`${o} - ${e.message}`)}r(e),Zh.bumpVerticalPos(a)}const Gh=function(t){let e=0;const n=Yh(Rh);for(const i in t.links){const t=ei.calculateTextDimensions(i,n).width+2*Rh.wrapPadding+2*Rh.boxMargin;e<t&&(e=t)}return e};const Xh=function(t,e,n,i){const r={},a=[];let s,o,c;return t.forEach((function(t){switch(t.id=ei.random({length:10}),t.type){case i.db.LINETYPE.LOOP_START:case i.db.LINETYPE.ALT_START:case i.db.LINETYPE.OPT_START:case i.db.LINETYPE.PAR_START:case i.db.LINETYPE.CRITICAL_START:case i.db.LINETYPE.BREAK_START:a.push({id:t.id,msg:t.message,from:Number.MAX_SAFE_INTEGER,to:Number.MIN_SAFE_INTEGER,width:0});break;case i.db.LINETYPE.ALT_ELSE:case i.db.LINETYPE.PAR_AND:case i.db.LINETYPE.CRITICAL_OPTION:t.message&&(s=a.pop(),r[s.id]=s,r[t.id]=s,a.push(s));break;case i.db.LINETYPE.LOOP_END:case i.db.LINETYPE.ALT_END:case i.db.LINETYPE.OPT_END:case i.db.LINETYPE.PAR_END:case i.db.LINETYPE.CRITICAL_END:case i.db.LINETYPE.BREAK_END:s=a.pop(),r[s.id]=s;break;case i.db.LINETYPE.ACTIVE_START:{const n=e[t.from?t.from.actor:t.to.actor],i=qh(t.from?t.from.actor:t.to.actor).length,r=n.x+n.width/2+(i-1)*Rh.activationWidth/2,a={startx:r,stopx:r+Rh.activationWidth,actor:t.from.actor,enabled:!0};Zh.activations.push(a)}break;case i.db.LINETYPE.ACTIVE_END:{const e=Zh.activations.map((t=>t.actor)).lastIndexOf(t.from.actor);delete Zh.activations.splice(e,1)[0]}}void 0!==t.placement?(o=function(t,e,n){const i=e[t.from].x,r=e[t.to].x,a=t.wrap&&t.message;let s=ei.calculateTextDimensions(a?ei.wrapLabel(t.message,Rh.width,jh(Rh)):t.message,jh(Rh));const o={width:a?Rh.width:Math.max(Rh.width,s.width+2*Rh.noteMargin),height:0,startx:e[t.from].x,stopx:0,starty:0,stopy:0,message:t.message};return t.placement===n.db.PLACEMENT.RIGHTOF?(o.width=a?Math.max(Rh.width,s.width):Math.max(e[t.from].width/2+e[t.to].width/2,s.width+2*Rh.noteMargin),o.startx=i+(e[t.from].width+Rh.actorMargin)/2):t.placement===n.db.PLACEMENT.LEFTOF?(o.width=a?Math.max(Rh.width,s.width+2*Rh.noteMargin):Math.max(e[t.from].width/2+e[t.to].width/2,s.width+2*Rh.noteMargin),o.startx=i-o.width+(e[t.from].width-Rh.actorMargin)/2):t.to===t.from?(s=ei.calculateTextDimensions(a?ei.wrapLabel(t.message,Math.max(Rh.width,e[t.from].width),jh(Rh)):t.message,jh(Rh)),o.width=a?Math.max(Rh.width,e[t.from].width):Math.max(e[t.from].width,Rh.width,s.width+2*Rh.noteMargin),o.startx=i+(e[t.from].width-o.width)/2):(o.width=Math.abs(i+e[t.from].width/2-(r+e[t.to].width/2))+Rh.actorMargin,o.startx=i<r?i+e[t.from].width/2-Rh.actorMargin/2:r+e[t.to].width/2-Rh.actorMargin/2),a&&(o.message=ei.wrapLabel(t.message,o.width-2*Rh.wrapPadding,jh(Rh))),Bt.debug(`NM:[${o.startx},${o.stopx},${o.starty},${o.stopy}:${o.width},${o.height}=${t.message}]`),o}(t,e,i),t.noteModel=o,a.forEach((t=>{s=t,s.from=Math.min(s.from,o.startx),s.to=Math.max(s.to,o.startx+o.width),s.width=Math.max(s.width,Math.abs(s.from-s.to))-Rh.labelBoxWidth}))):(c=function(t,e,n){let i=!1;if([n.db.LINETYPE.SOLID_OPEN,n.db.LINETYPE.DOTTED_OPEN,n.db.LINETYPE.SOLID,n.db.LINETYPE.DOTTED,n.db.LINETYPE.SOLID_CROSS,n.db.LINETYPE.DOTTED_CROSS,n.db.LINETYPE.SOLID_POINT,n.db.LINETYPE.DOTTED_POINT].includes(t.type)&&(i=!0),!i)return{};const r=Hh(t.from,e),a=Hh(t.to,e),s=r[0]<=a[0]?1:0,o=r[0]<a[0]?0:1,c=[...r,...a],l=Math.abs(a[o]-r[s]);t.wrap&&t.message&&(t.message=ei.wrapLabel(t.message,Math.max(l+2*Rh.wrapPadding,Rh.width),Ph(Rh)));const h=ei.calculateTextDimensions(t.message,Ph(Rh));return{width:Math.max(t.wrap?0:h.width+2*Rh.wrapPadding,l+2*Rh.wrapPadding,Rh.width),height:0,startx:r[s],stopx:a[o],starty:0,stopy:0,message:t.message,type:t.type,wrap:t.wrap,fromBounds:Math.min.apply(null,c),toBounds:Math.max.apply(null,c)}}(t,e,i),t.msgModel=c,c.startx&&c.stopx&&a.length>0&&a.forEach((n=>{if(s=n,c.startx===c.stopx){const n=e[t.from],i=e[t.to];s.from=Math.min(n.x-c.width/2,n.x-n.width/2,s.from),s.to=Math.max(i.x+c.width/2,i.x+n.width/2,s.to),s.width=Math.max(s.width,Math.abs(s.to-s.from))-Rh.labelBoxWidth}else s.from=Math.min(c.startx,s.from),s.to=Math.max(c.stopx,s.to),s.width=Math.max(s.width,c.width)-Rh.labelBoxWidth})))})),Zh.activations=[],Bt.debug("Loop type widths:",r),r},Qh={bounds:Zh,drawActors:zh,drawActorsPopup:Uh,setConf:Wh,draw:function(t,e,n,i){const{securityLevel:r,sequence:a}=ui();let s;Rh=a,i.db.clear(),i.parser.parse(t),"sandbox"===r&&(s=(0,o.Ys)("#i"+e));const c="sandbox"===r?(0,o.Ys)(s.nodes()[0].contentDocument.body):(0,o.Ys)("body"),l="sandbox"===r?s.nodes()[0].contentDocument:document;Zh.init(),Bt.debug(i.db);const h="sandbox"===r?c.select(`[id="${e}"]`):(0,o.Ys)(`[id="${e}"]`),u=i.db.getActors(),d=i.db.getBoxes(),p=i.db.getActorKeys(),f=i.db.getMessages(),g=i.db.getDiagramTitle(),y=i.db.hasAtLeastOneBox(),m=i.db.hasAtLeastOneBoxWithTitle(),b=function(t,e,n){const i={};return e.forEach((function(e){if(t[e.to]&&t[e.from]){const r=t[e.to];if(e.placement===n.db.PLACEMENT.LEFTOF&&!r.prevActor)return;if(e.placement===n.db.PLACEMENT.RIGHTOF&&!r.nextActor)return;const a=void 0!==e.placement,s=!a,o=a?jh(Rh):Ph(Rh),c=e.wrap?ei.wrapLabel(e.message,Rh.width-2*Rh.wrapPadding,o):e.message,l=ei.calculateTextDimensions(c,o).width+2*Rh.wrapPadding;s&&e.from===r.nextActor?i[e.to]=Math.max(i[e.to]||0,l):s&&e.from===r.prevActor?i[e.from]=Math.max(i[e.from]||0,l):s&&e.from===e.to?(i[e.from]=Math.max(i[e.from]||0,l/2),i[e.to]=Math.max(i[e.to]||0,l/2)):e.placement===n.db.PLACEMENT.RIGHTOF?i[e.from]=Math.max(i[e.from]||0,l):e.placement===n.db.PLACEMENT.LEFTOF?i[r.prevActor]=Math.max(i[r.prevActor]||0,l):e.placement===n.db.PLACEMENT.OVER&&(r.prevActor&&(i[r.prevActor]=Math.max(i[r.prevActor]||0,l/2)),r.nextActor&&(i[e.from]=Math.max(i[e.from]||0,l/2)))}})),Bt.debug("maxMessageWidthPerActor:",i),i}(u,f,i);Rh.height=function(t,e,n){let i=0;Object.keys(t).forEach((e=>{const n=t[e];n.wrap&&(n.description=ei.wrapLabel(n.description,Rh.width-2*Rh.wrapPadding,Yh(Rh)));const r=ei.calculateTextDimensions(n.description,Yh(Rh));n.width=n.wrap?Rh.width:Math.max(Rh.width,r.width+2*Rh.wrapPadding),n.height=n.wrap?Math.max(r.height,Rh.height):Rh.height,i=Math.max(i,n.height)}));for(const a in e){const n=t[a];if(!n)continue;const i=t[n.nextActor];if(!i){const t=e[a]+Rh.actorMargin-n.width/2;n.margin=Math.max(t,Rh.actorMargin);continue}const r=e[a]+Rh.actorMargin-n.width/2-i.width/2;n.margin=Math.max(r,Rh.actorMargin)}let r=0;return n.forEach((e=>{const n=Ph(Rh);let i=e.actorKeys.reduce(((e,n)=>e+(t[n].width+(t[n].margin||0))),0);i-=2*Rh.boxTextMargin,e.wrap&&(e.name=ei.wrapLabel(e.name,i-2*Rh.wrapPadding,n));const a=ei.calculateTextDimensions(e.name,n);r=Math.max(a.height,r);const s=Math.max(i,a.width+2*Rh.wrapPadding);if(e.margin=Rh.boxTextMargin,i<s){const t=(s-i)/2;e.margin+=t}})),n.forEach((t=>t.textMaxHeight=r)),Math.max(i,Rh.height)}(u,b,d),$h.insertComputerIcon(h),$h.insertDatabaseIcon(h),$h.insertClockIcon(h),y&&(Zh.bumpVerticalPos(Rh.boxMargin),m&&Zh.bumpVerticalPos(d[0].textMaxHeight)),zh(h,u,p,0,Rh,f,!1);const _=Xh(f,u,b,i);$h.insertArrowHead(h),$h.insertArrowCrossHead(h),$h.insertArrowFilledHead(h),$h.insertSequenceNumber(h);let x=1,v=1;const k=[];f.forEach((function(t){let e,n,r;switch(t.type){case i.db.LINETYPE.NOTE:n=t.noteModel,function(t,e){Zh.bumpVerticalPos(Rh.boxMargin),e.height=Rh.boxMargin,e.starty=Zh.getVerticalPos();const n=$h.getNoteRect();n.x=e.startx,n.y=e.starty,n.width=e.width||Rh.width,n.class="note";const i=t.append("g"),r=$h.drawRect(i,n),a=$h.getTextObj();a.x=e.startx,a.y=e.starty,a.width=n.width,a.dy="1em",a.text=e.message,a.class="noteText",a.fontFamily=Rh.noteFontFamily,a.fontSize=Rh.noteFontSize,a.fontWeight=Rh.noteFontWeight,a.anchor=Rh.noteAlign,a.textMargin=Rh.noteMargin,a.valign="center";const s=Ah(i,a),o=Math.round(s.map((t=>(t._groups||t)[0][0].getBBox().height)).reduce(((t,e)=>t+e)));r.attr("height",o+2*Rh.noteMargin),e.height+=o+2*Rh.noteMargin,Zh.bumpVerticalPos(o+2*Rh.noteMargin),e.stopy=e.starty+o+2*Rh.noteMargin,e.stopx=e.startx+n.width,Zh.insert(e.startx,e.starty,e.stopx,e.stopy),Zh.models.addNote(e)}(h,n);break;case i.db.LINETYPE.ACTIVE_START:Zh.newActivation(t,h,u);break;case i.db.LINETYPE.ACTIVE_END:!function(t,e){const n=Zh.endActivation(t);n.starty+18>e&&(n.starty=e-6,e+=12),$h.drawActivation(h,n,e,Rh,qh(t.from.actor).length),Zh.insert(n.startx,e-10,n.stopx,e)}(t,Zh.getVerticalPos());break;case i.db.LINETYPE.LOOP_START:Vh(_,t,Rh.boxMargin,Rh.boxMargin+Rh.boxTextMargin,(t=>Zh.newLoop(t)));break;case i.db.LINETYPE.LOOP_END:e=Zh.endLoop(),$h.drawLoop(h,e,"loop",Rh),Zh.bumpVerticalPos(e.stopy-Zh.getVerticalPos()),Zh.models.addLoop(e);break;case i.db.LINETYPE.RECT_START:Vh(_,t,Rh.boxMargin,Rh.boxMargin,(t=>Zh.newLoop(void 0,t.message)));break;case i.db.LINETYPE.RECT_END:e=Zh.endLoop(),$h.drawBackgroundRect(h,e),Zh.models.addLoop(e),Zh.bumpVerticalPos(e.stopy-Zh.getVerticalPos());break;case i.db.LINETYPE.OPT_START:Vh(_,t,Rh.boxMargin,Rh.boxMargin+Rh.boxTextMargin,(t=>Zh.newLoop(t)));break;case i.db.LINETYPE.OPT_END:e=Zh.endLoop(),$h.drawLoop(h,e,"opt",Rh),Zh.bumpVerticalPos(e.stopy-Zh.getVerticalPos()),Zh.models.addLoop(e);break;case i.db.LINETYPE.ALT_START:Vh(_,t,Rh.boxMargin,Rh.boxMargin+Rh.boxTextMargin,(t=>Zh.newLoop(t)));break;case i.db.LINETYPE.ALT_ELSE:Vh(_,t,Rh.boxMargin+Rh.boxTextMargin,Rh.boxMargin,(t=>Zh.addSectionToLoop(t)));break;case i.db.LINETYPE.ALT_END:e=Zh.endLoop(),$h.drawLoop(h,e,"alt",Rh),Zh.bumpVerticalPos(e.stopy-Zh.getVerticalPos()),Zh.models.addLoop(e);break;case i.db.LINETYPE.PAR_START:Vh(_,t,Rh.boxMargin,Rh.boxMargin+Rh.boxTextMargin,(t=>Zh.newLoop(t)));break;case i.db.LINETYPE.PAR_AND:Vh(_,t,Rh.boxMargin+Rh.boxTextMargin,Rh.boxMargin,(t=>Zh.addSectionToLoop(t)));break;case i.db.LINETYPE.PAR_END:e=Zh.endLoop(),$h.drawLoop(h,e,"par",Rh),Zh.bumpVerticalPos(e.stopy-Zh.getVerticalPos()),Zh.models.addLoop(e);break;case i.db.LINETYPE.AUTONUMBER:x=t.message.start||x,v=t.message.step||v,t.message.visible?i.db.enableSequenceNumbers():i.db.disableSequenceNumbers();break;case i.db.LINETYPE.CRITICAL_START:Vh(_,t,Rh.boxMargin,Rh.boxMargin+Rh.boxTextMargin,(t=>Zh.newLoop(t)));break;case i.db.LINETYPE.CRITICAL_OPTION:Vh(_,t,Rh.boxMargin+Rh.boxTextMargin,Rh.boxMargin,(t=>Zh.addSectionToLoop(t)));break;case i.db.LINETYPE.CRITICAL_END:e=Zh.endLoop(),$h.drawLoop(h,e,"critical",Rh),Zh.bumpVerticalPos(e.stopy-Zh.getVerticalPos()),Zh.models.addLoop(e);break;case i.db.LINETYPE.BREAK_START:Vh(_,t,Rh.boxMargin,Rh.boxMargin+Rh.boxTextMargin,(t=>Zh.newLoop(t)));break;case i.db.LINETYPE.BREAK_END:e=Zh.endLoop(),$h.drawLoop(h,e,"break",Rh),Zh.bumpVerticalPos(e.stopy-Zh.getVerticalPos()),Zh.models.addLoop(e);break;default:try{r=t.msgModel,r.starty=Zh.getVerticalPos(),r.sequenceIndex=x,r.sequenceVisible=i.db.showSequenceNumbers();const e=function(t,e){Zh.bumpVerticalPos(10);const{startx:n,stopx:i,message:r}=e,a=jt.splitBreaks(r).length,s=ei.calculateTextDimensions(r,Ph(Rh)),o=s.height/a;let c;e.height+=o,Zh.bumpVerticalPos(o);let l=s.height-10;const h=s.width;if(n===i){c=Zh.getVerticalPos()+l,Rh.rightAngles||(l+=Rh.boxMargin,c=Zh.getVerticalPos()+l),l+=30;const t=Math.max(h/2,Rh.width/2);Zh.insert(n-t,Zh.getVerticalPos()-10+l,i+t,Zh.getVerticalPos()+30+l)}else l+=Rh.boxMargin,c=Zh.getVerticalPos()+l,Zh.insert(n,c-10,i,c);return Zh.bumpVerticalPos(l),e.height+=l,e.stopy=e.starty+e.height,Zh.insert(e.fromBounds,e.starty,e.toBounds,e.stopy),c}(0,r);k.push({messageModel:r,lineStartY:e}),Zh.models.addMessage(r)}catch(a){Bt.error("error while drawing message",a)}}[i.db.LINETYPE.SOLID_OPEN,i.db.LINETYPE.DOTTED_OPEN,i.db.LINETYPE.SOLID,i.db.LINETYPE.DOTTED,i.db.LINETYPE.SOLID_CROSS,i.db.LINETYPE.DOTTED_CROSS,i.db.LINETYPE.SOLID_POINT,i.db.LINETYPE.DOTTED_POINT].includes(t.type)&&(x+=v)})),k.forEach((t=>function(t,e,n,i){const{startx:r,stopx:a,starty:s,message:o,type:c,sequenceIndex:l,sequenceVisible:h}=e,u=ei.calculateTextDimensions(o,Ph(Rh)),d=$h.getTextObj();d.x=r,d.y=s+10,d.width=a-r,d.class="messageText",d.dy="1em",d.text=o,d.fontFamily=Rh.messageFontFamily,d.fontSize=Rh.messageFontSize,d.fontWeight=Rh.messageFontWeight,d.anchor=Rh.messageAlign,d.valign="center",d.textMargin=Rh.wrapPadding,d.tspan=!1,Ah(t,d);const p=u.width;let f;r===a?f=Rh.rightAngles?t.append("path").attr("d",`M ${r},${n} H ${r+Math.max(Rh.width/2,p/2)} V ${n+25} H ${r}`):t.append("path").attr("d","M "+r+","+n+" C "+(r+60)+","+(n-10)+" "+(r+60)+","+(n+30)+" "+r+","+(n+20)):(f=t.append("line"),f.attr("x1",r),f.attr("y1",n),f.attr("x2",a),f.attr("y2",n)),c===i.db.LINETYPE.DOTTED||c===i.db.LINETYPE.DOTTED_CROSS||c===i.db.LINETYPE.DOTTED_POINT||c===i.db.LINETYPE.DOTTED_OPEN?(f.style("stroke-dasharray","3, 3"),f.attr("class","messageLine1")):f.attr("class","messageLine0");let g="";Rh.arrowMarkerAbsolute&&(g=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,g=g.replace(/\(/g,"\\("),g=g.replace(/\)/g,"\\)")),f.attr("stroke-width",2),f.attr("stroke","none"),f.style("fill","none"),c!==i.db.LINETYPE.SOLID&&c!==i.db.LINETYPE.DOTTED||f.attr("marker-end","url("+g+"#arrowhead)"),c!==i.db.LINETYPE.SOLID_POINT&&c!==i.db.LINETYPE.DOTTED_POINT||f.attr("marker-end","url("+g+"#filled-head)"),c!==i.db.LINETYPE.SOLID_CROSS&&c!==i.db.LINETYPE.DOTTED_CROSS||f.attr("marker-end","url("+g+"#crosshead)"),(h||Rh.showSequenceNumbers)&&(f.attr("marker-start","url("+g+"#sequencenumber)"),t.append("text").attr("x",r).attr("y",n+4).attr("font-family","sans-serif").attr("font-size","12px").attr("text-anchor","middle").attr("class","sequenceNumber").text(l))}(h,t.messageModel,t.lineStartY,i))),Rh.mirrorActors&&(Zh.bumpVerticalPos(2*Rh.boxMargin),zh(h,u,p,Zh.getVerticalPos(),Rh,f,!0),Zh.bumpVerticalPos(Rh.boxMargin),Nh(h,Zh.getVerticalPos())),Zh.models.boxes.forEach((function(t){t.height=Zh.getVerticalPos()-t.y,Zh.insert(t.x,t.y,t.x+t.width,t.height),t.startx=t.x,t.starty=t.y,t.stopx=t.startx+t.width,t.stopy=t.starty+t.height,t.stroke="rgb(0,0,0, 0.5)",$h.drawBox(h,t,Rh)})),y&&Zh.bumpVerticalPos(Rh.boxMargin);const w=Uh(h,u,p,l),{bounds:C}=Zh.getBounds();Bt.debug("For line height fix Querying: #"+e+" .actor-line");(0,o.td_)("#"+e+" .actor-line").attr("y2",C.stopy);let T=C.stopy-C.starty;T<w.maxHeight&&(T=w.maxHeight);let E=T+2*Rh.diagramMarginY;Rh.mirrorActors&&(E=E-Rh.boxMargin+Rh.bottomMarginAdj);let S=C.stopx-C.startx;S<w.maxWidth&&(S=w.maxWidth);const A=S+2*Rh.diagramMarginX;g&&h.append("text").text(g).attr("x",(C.stopx-C.startx)/2-2*Rh.diagramMarginX).attr("y",-25),bi(h,E,A,Rh.useMaxWidth);const L=g?40:0;h.attr("viewBox",C.startx-Rh.diagramMarginX+" -"+(Rh.diagramMarginY+L)+" "+A+" "+(E+L)),Bt.debug("models:",Zh.models)}};var Kh=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,2],i=[1,3],r=[1,5],a=[1,7],s=[2,5],o=[1,15],c=[1,17],l=[1,21],h=[1,22],u=[1,23],d=[1,24],p=[1,37],f=[1,25],g=[1,26],y=[1,27],m=[1,28],b=[1,29],_=[1,32],x=[1,33],v=[1,34],k=[1,35],w=[1,36],C=[1,39],T=[1,40],E=[1,41],S=[1,42],A=[1,38],L=[1,45],B=[1,4,5,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,42,50,51,52,53,56,60],N=[1,4,5,14,15,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,42,50,51,52,53,56,60],D=[1,4,5,7,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,42,50,51,52,53,56,60],O=[4,5,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,42,50,51,52,53,56,60],M={trace:function(){},yy:{},symbols_:{error:2,start:3,SPACE:4,NL:5,directive:6,SD:7,document:8,line:9,statement:10,classDefStatement:11,cssClassStatement:12,idStatement:13,DESCR:14,"--\x3e":15,HIDE_EMPTY:16,scale:17,WIDTH:18,COMPOSIT_STATE:19,STRUCT_START:20,STRUCT_STOP:21,STATE_DESCR:22,AS:23,ID:24,FORK:25,JOIN:26,CHOICE:27,CONCURRENT:28,note:29,notePosition:30,NOTE_TEXT:31,direction:32,acc_title:33,acc_title_value:34,acc_descr:35,acc_descr_value:36,acc_descr_multiline_value:37,classDef:38,CLASSDEF_ID:39,CLASSDEF_STYLEOPTS:40,DEFAULT:41,class:42,CLASSENTITY_IDS:43,STYLECLASS:44,openDirective:45,typeDirective:46,closeDirective:47,":":48,argDirective:49,direction_tb:50,direction_bt:51,direction_rl:52,direction_lr:53,eol:54,";":55,EDGE_STATE:56,STYLE_SEPARATOR:57,left_of:58,right_of:59,open_directive:60,type_directive:61,arg_directive:62,close_directive:63,$accept:0,$end:1},terminals_:{2:"error",4:"SPACE",5:"NL",7:"SD",14:"DESCR",15:"--\x3e",16:"HIDE_EMPTY",17:"scale",18:"WIDTH",19:"COMPOSIT_STATE",20:"STRUCT_START",21:"STRUCT_STOP",22:"STATE_DESCR",23:"AS",24:"ID",25:"FORK",26:"JOIN",27:"CHOICE",28:"CONCURRENT",29:"note",31:"NOTE_TEXT",33:"acc_title",34:"acc_title_value",35:"acc_descr",36:"acc_descr_value",37:"acc_descr_multiline_value",38:"classDef",39:"CLASSDEF_ID",40:"CLASSDEF_STYLEOPTS",41:"DEFAULT",42:"class",43:"CLASSENTITY_IDS",44:"STYLECLASS",48:":",50:"direction_tb",51:"direction_bt",52:"direction_rl",53:"direction_lr",55:";",56:"EDGE_STATE",57:"STYLE_SEPARATOR",58:"left_of",59:"right_of",60:"open_directive",61:"type_directive",62:"arg_directive",63:"close_directive"},productions_:[0,[3,2],[3,2],[3,2],[3,2],[8,0],[8,2],[9,2],[9,1],[9,1],[10,1],[10,1],[10,1],[10,2],[10,3],[10,4],[10,1],[10,2],[10,1],[10,4],[10,3],[10,6],[10,1],[10,1],[10,1],[10,1],[10,4],[10,4],[10,1],[10,1],[10,2],[10,2],[10,1],[11,3],[11,3],[12,3],[6,3],[6,5],[32,1],[32,1],[32,1],[32,1],[54,1],[54,1],[13,1],[13,1],[13,3],[13,3],[30,1],[30,1],[45,1],[46,1],[49,1],[47,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 4:return i.setRootDoc(a[o]),a[o];case 5:this.$=[];break;case 6:"nl"!=a[o]&&(a[o-1].push(a[o]),this.$=a[o-1]);break;case 7:case 8:case 12:this.$=a[o];break;case 9:this.$="nl";break;case 13:const t=a[o-1];t.description=i.trimColon(a[o]),this.$=t;break;case 14:this.$={stmt:"relation",state1:a[o-2],state2:a[o]};break;case 15:const e=i.trimColon(a[o]);this.$={stmt:"relation",state1:a[o-3],state2:a[o-1],description:e};break;case 19:this.$={stmt:"state",id:a[o-3],type:"default",description:"",doc:a[o-1]};break;case 20:var c=a[o],l=a[o-2].trim();if(a[o].match(":")){var h=a[o].split(":");c=h[0],l=[l,h[1]]}this.$={stmt:"state",id:c,type:"default",description:l};break;case 21:this.$={stmt:"state",id:a[o-3],type:"default",description:a[o-5],doc:a[o-1]};break;case 22:this.$={stmt:"state",id:a[o],type:"fork"};break;case 23:this.$={stmt:"state",id:a[o],type:"join"};break;case 24:this.$={stmt:"state",id:a[o],type:"choice"};break;case 25:this.$={stmt:"state",id:i.getDividerId(),type:"divider"};break;case 26:this.$={stmt:"state",id:a[o-1].trim(),note:{position:a[o-2].trim(),text:a[o].trim()}};break;case 30:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 31:case 32:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 33:case 34:this.$={stmt:"classDef",id:a[o-1].trim(),classes:a[o].trim()};break;case 35:this.$={stmt:"applyClass",id:a[o-1].trim(),styleClass:a[o].trim()};break;case 38:i.setDirection("TB"),this.$={stmt:"dir",value:"TB"};break;case 39:i.setDirection("BT"),this.$={stmt:"dir",value:"BT"};break;case 40:i.setDirection("RL"),this.$={stmt:"dir",value:"RL"};break;case 41:i.setDirection("LR"),this.$={stmt:"dir",value:"LR"};break;case 44:case 45:this.$={stmt:"state",id:a[o].trim(),type:"default",description:""};break;case 46:case 47:this.$={stmt:"state",id:a[o-2].trim(),classes:[a[o].trim()],type:"default",description:""};break;case 50:i.parseDirective("%%{","open_directive");break;case 51:i.parseDirective(a[o],"type_directive");break;case 52:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 53:i.parseDirective("}%%","close_directive","state")}},table:[{3:1,4:n,5:i,6:4,7:r,45:6,60:a},{1:[3]},{3:8,4:n,5:i,6:4,7:r,45:6,60:a},{3:9,4:n,5:i,6:4,7:r,45:6,60:a},{3:10,4:n,5:i,6:4,7:r,45:6,60:a},e([1,4,5,16,17,19,22,24,25,26,27,28,29,33,35,37,38,42,50,51,52,53,56,60],s,{8:11}),{46:12,61:[1,13]},{61:[2,50]},{1:[2,1]},{1:[2,2]},{1:[2,3]},{1:[2,4],4:o,5:c,6:30,9:14,10:16,11:18,12:19,13:20,16:l,17:h,19:u,22:d,24:p,25:f,26:g,27:y,28:m,29:b,32:31,33:_,35:x,37:v,38:k,42:w,45:6,50:C,51:T,52:E,53:S,56:A,60:a},{47:43,48:[1,44],63:L},e([48,63],[2,51]),e(B,[2,6]),{6:30,10:46,11:18,12:19,13:20,16:l,17:h,19:u,22:d,24:p,25:f,26:g,27:y,28:m,29:b,32:31,33:_,35:x,37:v,38:k,42:w,45:6,50:C,51:T,52:E,53:S,56:A,60:a},e(B,[2,8]),e(B,[2,9]),e(B,[2,10]),e(B,[2,11]),e(B,[2,12],{14:[1,47],15:[1,48]}),e(B,[2,16]),{18:[1,49]},e(B,[2,18],{20:[1,50]}),{23:[1,51]},e(B,[2,22]),e(B,[2,23]),e(B,[2,24]),e(B,[2,25]),{30:52,31:[1,53],58:[1,54],59:[1,55]},e(B,[2,28]),e(B,[2,29]),{34:[1,56]},{36:[1,57]},e(B,[2,32]),{39:[1,58],41:[1,59]},{43:[1,60]},e(N,[2,44],{57:[1,61]}),e(N,[2,45],{57:[1,62]}),e(B,[2,38]),e(B,[2,39]),e(B,[2,40]),e(B,[2,41]),e(D,[2,36]),{49:63,62:[1,64]},e(D,[2,53]),e(B,[2,7]),e(B,[2,13]),{13:65,24:p,56:A},e(B,[2,17]),e(O,s,{8:66}),{24:[1,67]},{24:[1,68]},{23:[1,69]},{24:[2,48]},{24:[2,49]},e(B,[2,30]),e(B,[2,31]),{40:[1,70]},{40:[1,71]},{44:[1,72]},{24:[1,73]},{24:[1,74]},{47:75,63:L},{63:[2,52]},e(B,[2,14],{14:[1,76]}),{4:o,5:c,6:30,9:14,10:16,11:18,12:19,13:20,16:l,17:h,19:u,21:[1,77],22:d,24:p,25:f,26:g,27:y,28:m,29:b,32:31,33:_,35:x,37:v,38:k,42:w,45:6,50:C,51:T,52:E,53:S,56:A,60:a},e(B,[2,20],{20:[1,78]}),{31:[1,79]},{24:[1,80]},e(B,[2,33]),e(B,[2,34]),e(B,[2,35]),e(N,[2,46]),e(N,[2,47]),e(D,[2,37]),e(B,[2,15]),e(B,[2,19]),e(O,s,{8:81}),e(B,[2,26]),e(B,[2,27]),{4:o,5:c,6:30,9:14,10:16,11:18,12:19,13:20,16:l,17:h,19:u,21:[1,82],22:d,24:p,25:f,26:g,27:y,28:m,29:b,32:31,33:_,35:x,37:v,38:k,42:w,45:6,50:C,51:T,52:E,53:S,56:A,60:a},e(B,[2,21])],defaultActions:{7:[2,50],8:[2,1],9:[2,2],10:[2,3],54:[2,48],55:[2,49],64:[2,52]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=a.slice.call(arguments,1),u=Object.create(this.lexer),d={yy:{}};for(var p in this.yy)Object.prototype.hasOwnProperty.call(this.yy,p)&&(d.yy[p]=this.yy[p]);u.setInput(t,d.yy),d.yy.lexer=u,d.yy.parser=this,void 0===u.yylloc&&(u.yylloc={});var f=u.yylloc;a.push(f);var g=u.options&&u.options.ranges;function y(){var t;return"number"!=typeof(t=i.pop()||u.lex()||1)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof d.yy.parseError?this.parseError=d.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var m,b,_,x,v,k,w,C,T={};;){if(b=n[n.length-1],this.defaultActions[b]?_=this.defaultActions[b]:(null==m&&(m=y()),_=s[b]&&s[b][m]),void 0===_||!_.length||!_[0]){var E="";for(v in C=[],s[b])this.terminals_[v]&&v>2&&C.push("'"+this.terminals_[v]+"'");E=u.showPosition?"Parse error on line "+(c+1)+":\n"+u.showPosition()+"\nExpecting "+C.join(", ")+", got '"+(this.terminals_[m]||m)+"'":"Parse error on line "+(c+1)+": Unexpected "+(1==m?"end of input":"'"+(this.terminals_[m]||m)+"'"),this.parseError(E,{text:u.match,token:this.terminals_[m]||m,line:u.yylineno,loc:f,expected:C})}if(_[0]instanceof Array&&_.length>1)throw new Error("Parse Error: multiple actions possible at state: "+b+", token: "+m);switch(_[0]){case 1:n.push(m),r.push(u.yytext),a.push(u.yylloc),n.push(_[1]),m=null,l=u.yyleng,o=u.yytext,c=u.yylineno,f=u.yylloc;break;case 2:if(k=this.productions_[_[1]][1],T.$=r[r.length-k],T._$={first_line:a[a.length-(k||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(k||1)].first_column,last_column:a[a.length-1].last_column},g&&(T._$.range=[a[a.length-(k||1)].range[0],a[a.length-1].range[1]]),void 0!==(x=this.performAction.apply(T,[o,l,c,d.yy,_[1],r,a].concat(h))))return x;k&&(n=n.slice(0,-1*k*2),r=r.slice(0,-1*k),a=a.slice(0,-1*k)),n.push(this.productions_[_[1]][0]),r.push(T.$),a.push(T._$),w=s[n[n.length-2]][n[n.length-1]],n.push(w);break;case 3:return!0}}return!0}},I=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,i){switch(n){case 0:return 41;case 1:case 44:return 50;case 2:case 45:return 51;case 3:case 46:return 52;case 4:case 47:return 53;case 5:return this.begin("open_directive"),60;case 6:return this.begin("type_directive"),61;case 7:return this.popState(),this.begin("arg_directive"),48;case 8:return this.popState(),this.popState(),63;case 9:return 62;case 10:case 11:case 13:case 14:case 15:case 16:case 56:case 58:case 64:break;case 12:case 79:return 5;case 17:case 34:return this.pushState("SCALE"),17;case 18:case 35:return 18;case 19:case 25:case 36:case 51:case 54:this.popState();break;case 20:return this.begin("acc_title"),33;case 21:return this.popState(),"acc_title_value";case 22:return this.begin("acc_descr"),35;case 23:return this.popState(),"acc_descr_value";case 24:this.begin("acc_descr_multiline");break;case 26:return"acc_descr_multiline_value";case 27:return this.pushState("CLASSDEF"),38;case 28:return this.popState(),this.pushState("CLASSDEFID"),"DEFAULT_CLASSDEF_ID";case 29:return this.popState(),this.pushState("CLASSDEFID"),39;case 30:return this.popState(),40;case 31:return this.pushState("CLASS"),42;case 32:return this.popState(),this.pushState("CLASS_STYLE"),43;case 33:return this.popState(),44;case 37:this.pushState("STATE");break;case 38:case 41:return this.popState(),e.yytext=e.yytext.slice(0,-8).trim(),25;case 39:case 42:return this.popState(),e.yytext=e.yytext.slice(0,-8).trim(),26;case 40:case 43:return this.popState(),e.yytext=e.yytext.slice(0,-10).trim(),27;case 48:this.pushState("STATE_STRING");break;case 49:return this.pushState("STATE_ID"),"AS";case 50:case 66:return this.popState(),"ID";case 52:return"STATE_DESCR";case 53:return 19;case 55:return this.popState(),this.pushState("struct"),20;case 57:return this.popState(),21;case 59:return this.begin("NOTE"),29;case 60:return this.popState(),this.pushState("NOTE_ID"),58;case 61:return this.popState(),this.pushState("NOTE_ID"),59;case 62:this.popState(),this.pushState("FLOATING_NOTE");break;case 63:return this.popState(),this.pushState("FLOATING_NOTE_ID"),"AS";case 65:return"NOTE_TEXT";case 67:return this.popState(),this.pushState("NOTE_TEXT"),24;case 68:return this.popState(),e.yytext=e.yytext.substr(2).trim(),31;case 69:return this.popState(),e.yytext=e.yytext.slice(0,-8).trim(),31;case 70:case 71:return 7;case 72:return 16;case 73:return 56;case 74:return 24;case 75:return e.yytext=e.yytext.trim(),14;case 76:return 15;case 77:return 28;case 78:return 57;case 80:return"INVALID"}},rules:[/^(?:default\b)/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:[\s]+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:scale\s+)/i,/^(?:\d+)/i,/^(?:\s+width\b)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:classDef\s+)/i,/^(?:DEFAULT\s+)/i,/^(?:\w+\s+)/i,/^(?:[^\n]*)/i,/^(?:class\s+)/i,/^(?:(\w+)+((,\s*\w+)*))/i,/^(?:[^\n]*)/i,/^(?:scale\s+)/i,/^(?:\d+)/i,/^(?:\s+width\b)/i,/^(?:state\s+)/i,/^(?:.*<<fork>>)/i,/^(?:.*<<join>>)/i,/^(?:.*<<choice>>)/i,/^(?:.*\[\[fork\]\])/i,/^(?:.*\[\[join\]\])/i,/^(?:.*\[\[choice\]\])/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:["])/i,/^(?:\s*as\s+)/i,/^(?:[^\n\{]*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n\s\{]+)/i,/^(?:\n)/i,/^(?:\{)/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:\})/i,/^(?:[\n])/i,/^(?:note\s+)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:")/i,/^(?:\s*as\s*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n]*)/i,/^(?:\s*[^:\n\s\-]+)/i,/^(?:\s*:[^:\n;]+)/i,/^(?:[\s\S]*?end note\b)/i,/^(?:stateDiagram\s+)/i,/^(?:stateDiagram-v2\s+)/i,/^(?:hide empty description\b)/i,/^(?:\[\*\])/i,/^(?:[^:\n\s\-\{]+)/i,/^(?:\s*:[^:\n;]+)/i,/^(?:-->)/i,/^(?:--)/i,/^(?::::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{LINE:{rules:[14,15],inclusive:!1},close_directive:{rules:[14,15],inclusive:!1},arg_directive:{rules:[8,9,14,15],inclusive:!1},type_directive:{rules:[7,8,14,15],inclusive:!1},open_directive:{rules:[6,14,15],inclusive:!1},struct:{rules:[14,15,27,31,37,44,45,46,47,56,57,58,59,73,74,75,76,77],inclusive:!1},FLOATING_NOTE_ID:{rules:[66],inclusive:!1},FLOATING_NOTE:{rules:[63,64,65],inclusive:!1},NOTE_TEXT:{rules:[68,69],inclusive:!1},NOTE_ID:{rules:[67],inclusive:!1},NOTE:{rules:[60,61,62],inclusive:!1},CLASS_STYLE:{rules:[33],inclusive:!1},CLASS:{rules:[32],inclusive:!1},CLASSDEFID:{rules:[30],inclusive:!1},CLASSDEF:{rules:[28,29],inclusive:!1},acc_descr_multiline:{rules:[25,26],inclusive:!1},acc_descr:{rules:[23],inclusive:!1},acc_title:{rules:[21],inclusive:!1},SCALE:{rules:[18,19,35,36],inclusive:!1},ALIAS:{rules:[],inclusive:!1},STATE_ID:{rules:[50],inclusive:!1},STATE_STRING:{rules:[51,52],inclusive:!1},FORK_STATE:{rules:[],inclusive:!1},STATE:{rules:[14,15,38,39,40,41,42,43,48,49,53,54,55],inclusive:!1},ID:{rules:[14,15],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,10,11,12,13,15,16,17,20,22,24,27,31,34,37,55,59,70,71,72,73,74,75,76,78,79,80],inclusive:!0}}},t);function F(){this.yy={}}return M.lexer=I,F.prototype=M,M.Parser=F,new F}();Kh.parser=Kh;const Jh=Kh,tu=(t,e)=>{var n;return"dagre-wrapper"!==(null==(n=null==e?void 0:e.state)?void 0:n.defaultRenderer)&&null!==t.match(/^\s*stateDiagram/)},eu=(t,e)=>{var n;return null!==t.match(/^\s*stateDiagram-v2/)||!(!t.match(/^\s*stateDiagram/)||"dagre-wrapper"!==(null==(n=null==e?void 0:e.state)?void 0:n.defaultRenderer))},nu="state",iu="relation",ru="default",au="divider",su="[*]",ou="start",cu=su,lu="color",hu="fill";let uu="LR",du=[],pu={};let fu={root:{relations:[],states:{},documents:{}}},gu=fu.root,yu=0,mu=0;const bu=t=>JSON.parse(JSON.stringify(t)),_u=(t,e,n)=>{if(e.stmt===iu)_u(t,e.state1,!0),_u(t,e.state2,!1);else if(e.stmt===nu&&("[*]"===e.id?(e.id=n?t.id+"_start":t.id+"_end",e.start=n):e.id=e.id.trim()),e.doc){const t=[];let n,i=[];for(n=0;n<e.doc.length;n++)if(e.doc[n].type===au){const r=bu(e.doc[n]);r.doc=bu(i),t.push(r),i=[]}else i.push(e.doc[n]);if(t.length>0&&i.length>0){const n={stmt:nu,id:Yn(),type:"divider",doc:bu(i)};t.push(bu(n)),e.doc=t}e.doc.forEach((t=>_u(e,t,!0)))}},xu=function(t,e=ru,n=null,i=null,r=null,a=null,s=null,o=null){const c=null==t?void 0:t.trim();if(void 0===gu.states[c]?(Bt.info("Adding state ",c,i),gu.states[c]={id:c,descriptions:[],type:e,doc:n,note:r,classes:[],styles:[],textStyles:[]}):(gu.states[c].doc||(gu.states[c].doc=n),gu.states[c].type||(gu.states[c].type=e)),i&&(Bt.info("Setting state description",c,i),"string"==typeof i&&Eu(c,i.trim()),"object"==typeof i&&i.forEach((t=>Eu(c,t.trim())))),r&&(gu.states[c].note=r,gu.states[c].note.text=jt.sanitizeText(gu.states[c].note.text,ui())),a){Bt.info("Setting state classes",c,a);("string"==typeof a?[a]:a).forEach((t=>Au(c,t.trim())))}if(s){Bt.info("Setting state styles",c,s);("string"==typeof s?[s]:s).forEach((t=>Lu(c,t.trim())))}if(o){Bt.info("Setting state styles",c,s);("string"==typeof o?[o]:o).forEach((t=>Bu(c,t.trim())))}},vu=function(t){fu={root:{relations:[],states:{},documents:{}}},gu=fu.root,yu=0,pu={},t||Ri()},ku=function(t){return gu.states[t]};function wu(t=""){let e=t;return t===su&&(yu++,e=`${ou}${yu}`),e}function Cu(t="",e=ru){return t===su?ou:e}const Tu=function(t,e,n){if("object"==typeof t)!function(t,e,n){let i=wu(t.id.trim()),r=Cu(t.id.trim(),t.type),a=wu(e.id.trim()),s=Cu(e.id.trim(),e.type);xu(i,r,t.doc,t.description,t.note,t.classes,t.styles,t.textStyles),xu(a,s,e.doc,e.description,e.note,e.classes,e.styles,e.textStyles),gu.relations.push({id1:i,id2:a,relationTitle:jt.sanitizeText(n,ui())})}(t,e,n);else{const i=wu(t.trim()),r=Cu(t),a=function(t=""){let e=t;return t===cu&&(yu++,e=`end${yu}`),e}(e.trim()),s=function(t="",e=ru){return t===cu?"end":e}(e);xu(i,r),xu(a,s),gu.relations.push({id1:i,id2:a,title:jt.sanitizeText(n,ui())})}},Eu=function(t,e){const n=gu.states[t],i=e.startsWith(":")?e.replace(":","").trim():e;n.descriptions.push(jt.sanitizeText(i,ui()))},Su=function(t,e=""){void 0===pu[t]&&(pu[t]={id:t,styles:[],textStyles:[]});const n=pu[t];null!=e&&e.split(",").forEach((t=>{const e=t.replace(/([^;]*);/,"$1").trim();if(t.match(lu)){const t=e.replace(hu,"bgFill").replace(lu,hu);n.textStyles.push(t)}n.styles.push(e)}))},Au=function(t,e){t.split(",").forEach((function(t){let n=ku(t);if(void 0===n){const e=t.trim();xu(e),n=ku(e)}n.classes.push(e)}))},Lu=function(t,e){const n=ku(t);void 0!==n&&n.textStyles.push(e)},Bu=function(t,e){const n=ku(t);void 0!==n&&n.textStyles.push(e)},Nu={parseDirective:function(t,e,n){xp.parseDirective(this,t,e,n)},getConfig:()=>ui().state,addState:xu,clear:vu,getState:ku,getStates:function(){return gu.states},getRelations:function(){return gu.relations},getClasses:function(){return pu},getDirection:()=>uu,addRelation:Tu,getDividerId:()=>(mu++,"divider-id-"+mu),setDirection:t=>{uu=t},cleanupLabel:function(t){return":"===t.substring(0,1)?t.substr(2).trim():t.trim()},lineType:{LINE:0,DOTTED_LINE:1},relationType:{AGGREGATION:0,EXTENSION:1,COMPOSITION:2,DEPENDENCY:3},logDocuments:function(){Bt.info("Documents = ",fu)},getRootDoc:()=>du,setRootDoc:t=>{Bt.info("Setting root doc",t),du=t},getRootDocV2:()=>(_u({id:"root"},{id:"root",doc:du},!0),{id:"root",doc:du}),extract:t=>{let e;e=t.doc?t.doc:t,Bt.info(e),vu(!0),Bt.info("Extract",e),e.forEach((t=>{switch(t.stmt){case nu:xu(t.id.trim(),t.type,t.doc,t.description,t.note,t.classes,t.styles,t.textStyles);break;case iu:Tu(t.state1,t.state2,t.description);break;case"classDef":Su(t.id.trim(),t.classes);break;case"applyClass":Au(t.id.trim(),t.styleClass)}}))},trimColon:t=>t&&":"===t[0]?t.substr(1).trim():t.trim(),getAccTitle:Pi,setAccTitle:Zi,getAccDescription:Yi,setAccDescription:ji,addStyleClass:Su,setCssClass:Au,addDescription:Eu,setDiagramTitle:zi,getDiagramTitle:Ui},Du={},Ou=(t,e)=>{Du[t]=e},Mu=(t,e)=>{const n=t.append("text").attr("x",2*ui().state.padding).attr("y",ui().state.textHeight+1.3*ui().state.padding).attr("font-size",ui().state.fontSize).attr("class","state-title").text(e.descriptions[0]).node().getBBox(),i=n.height,r=t.append("text").attr("x",ui().state.padding).attr("y",i+.4*ui().state.padding+ui().state.dividerMargin+ui().state.textHeight).attr("class","state-description");let a=!0,s=!0;e.descriptions.forEach((function(t){a||(!function(t,e,n){const i=t.append("tspan").attr("x",2*ui().state.padding).text(e);n||i.attr("dy",ui().state.textHeight)}(r,t,s),s=!1),a=!1}));const o=t.append("line").attr("x1",ui().state.padding).attr("y1",ui().state.padding+i+ui().state.dividerMargin/2).attr("y2",ui().state.padding+i+ui().state.dividerMargin/2).attr("class","descr-divider"),c=r.node().getBBox(),l=Math.max(c.width,n.width);return o.attr("x2",l+3*ui().state.padding),t.insert("rect",":first-child").attr("x",ui().state.padding).attr("y",ui().state.padding).attr("width",l+2*ui().state.padding).attr("height",c.height+i+2*ui().state.padding).attr("rx",ui().state.radius),t},Iu=(t,e,n)=>{const i=ui().state.padding,r=2*ui().state.padding,a=t.node().getBBox(),s=a.width,o=a.x,c=t.append("text").attr("x",0).attr("y",ui().state.titleShift).attr("font-size",ui().state.fontSize).attr("class","state-title").text(e.id),l=c.node().getBBox().width+r;let h,u=Math.max(l,s);u===s&&(u+=r);const d=t.node().getBBox();e.doc,h=o-i,l>s&&(h=(s-u)/2+i),Math.abs(o-d.x)<i&&l>s&&(h=o-(l-s)/2);const p=1-ui().state.textHeight;return t.insert("rect",":first-child").attr("x",h).attr("y",p).attr("class",n?"alt-composit":"composit").attr("width",u).attr("height",d.height+ui().state.textHeight+ui().state.titleShift+1).attr("rx","0"),c.attr("x",h+i),l<=s&&c.attr("x",o+(u-r)/2-l/2+i),t.insert("rect",":first-child").attr("x",h).attr("y",ui().state.titleShift-ui().state.textHeight-ui().state.padding).attr("width",u).attr("height",3*ui().state.textHeight).attr("rx",ui().state.radius),t.insert("rect",":first-child").attr("x",h).attr("y",ui().state.titleShift-ui().state.textHeight-ui().state.padding).attr("width",u).attr("height",d.height+3+2*ui().state.textHeight).attr("rx",ui().state.radius),t},Fu=(t,e)=>{e.attr("class","state-note");const n=e.append("rect").attr("x",0).attr("y",ui().state.padding),i=e.append("g"),{textWidth:r,textHeight:a}=((t,e,n,i)=>{let r=0;const a=i.append("text");a.style("text-anchor","start"),a.attr("class","noteText");let s=t.replace(/\r\n/g,"<br/>");s=s.replace(/\n/g,"<br/>");const o=s.split(jt.lineBreakRegex);let c=1.25*ui().state.noteMargin;for(const l of o){const t=l.trim();if(t.length>0){const i=a.append("tspan");i.text(t),0===c&&(c+=i.node().getBBox().height),r+=c,i.attr("x",e+ui().state.noteMargin),i.attr("y",n+r+1.25*ui().state.noteMargin)}}return{textWidth:a.node().getBBox().width,textHeight:r}})(t,0,0,i);return n.attr("height",a+2*ui().state.noteMargin),n.attr("width",r+2*ui().state.noteMargin),n},$u=function(t,e){const n=e.id,i={id:n,label:e.id,width:0,height:0},r=t.append("g").attr("id",n).attr("class","stateGroup");"start"===e.type&&(t=>{t.append("circle").attr("class","start-state").attr("r",ui().state.sizeUnit).attr("cx",ui().state.padding+ui().state.sizeUnit).attr("cy",ui().state.padding+ui().state.sizeUnit)})(r),"end"===e.type&&(t=>{t.append("circle").attr("class","end-state-outer").attr("r",ui().state.sizeUnit+ui().state.miniPadding).attr("cx",ui().state.padding+ui().state.sizeUnit+ui().state.miniPadding).attr("cy",ui().state.padding+ui().state.sizeUnit+ui().state.miniPadding),t.append("circle").attr("class","end-state-inner").attr("r",ui().state.sizeUnit).attr("cx",ui().state.padding+ui().state.sizeUnit+2).attr("cy",ui().state.padding+ui().state.sizeUnit+2)})(r),"fork"!==e.type&&"join"!==e.type||((t,e)=>{let n=ui().state.forkWidth,i=ui().state.forkHeight;if(e.parentId){let t=n;n=i,i=t}t.append("rect").style("stroke","black").style("fill","black").attr("width",n).attr("height",i).attr("x",ui().state.padding).attr("y",ui().state.padding)})(r,e),"note"===e.type&&Fu(e.note.text,r),"divider"===e.type&&(t=>{t.append("line").style("stroke","grey").style("stroke-dasharray","3").attr("x1",ui().state.textHeight).attr("class","divider").attr("x2",2*ui().state.textHeight).attr("y1",0).attr("y2",0)})(r),"default"===e.type&&0===e.descriptions.length&&((t,e)=>{const n=t.append("text").attr("x",2*ui().state.padding).attr("y",ui().state.textHeight+2*ui().state.padding).attr("font-size",ui().state.fontSize).attr("class","state-title").text(e.id),i=n.node().getBBox();t.insert("rect",":first-child").attr("x",ui().state.padding).attr("y",ui().state.padding).attr("width",i.width+2*ui().state.padding).attr("height",i.height+2*ui().state.padding).attr("rx",ui().state.radius)})(r,e),"default"===e.type&&e.descriptions.length>0&&Mu(r,e);const a=r.node().getBBox();return i.width=a.width+2*ui().state.padding,i.height=a.height+2*ui().state.padding,Ou(n,i),i};let Ru=0;let Zu;const Pu={},ju=(t,e,n,i,r,a,s)=>{const c=new lt.k({compound:!0,multigraph:!0});let l,h=!0;for(l=0;l<t.length;l++)if("relation"===t[l].stmt){h=!1;break}n?c.setGraph({rankdir:"LR",multigraph:!0,compound:!0,ranker:"tight-tree",ranksep:h?1:Zu.edgeLengthFactor,nodeSep:h?1:50,isMultiGraph:!0}):c.setGraph({rankdir:"TB",multigraph:!0,compound:!0,ranksep:h?1:Zu.edgeLengthFactor,nodeSep:h?1:50,ranker:"tight-tree",isMultiGraph:!0}),c.setDefaultEdgeLabel((function(){return{}})),s.db.extract(t);const u=s.db.getStates(),d=s.db.getRelations(),p=Object.keys(u);for(const o of p){const t=u[o];let l;if(n&&(t.parentId=n),t.doc){let n=e.append("g").attr("id",t.id).attr("class","stateGroup");l=ju(t.doc,n,t.id,!i,r,a,s);{n=Iu(n,t,i);let e=n.node().getBBox();l.width=e.width,l.height=e.height+Zu.padding/2,Pu[t.id]={y:Zu.compositTitleSize}}}else l=$u(e,t);if(t.note){const n={descriptions:[],id:t.id+"-note",note:t.note,type:"note"},i=$u(e,n);"left of"===t.note.position?(c.setNode(l.id+"-note",i),c.setNode(l.id,l)):(c.setNode(l.id,l),c.setNode(l.id+"-note",i)),c.setParent(l.id,l.id+"-group"),c.setParent(l.id+"-note",l.id+"-group")}else c.setNode(l.id,l)}Bt.debug("Count=",c.nodeCount(),c);let f=0;d.forEach((function(t){var e;f++,Bt.debug("Setting edge",t),c.setEdge(t.id1,t.id2,{relation:t,width:(e=t.title,e?e.length*Zu.fontSizeFactor:1),height:Zu.labelHeight*jt.getRows(t.title).length,labelpos:"c"},"id"+f)})),(0,ct.bK)(c),Bt.debug("Graph after layout",c.nodes());const g=e.node();c.nodes().forEach((function(t){if(void 0!==t&&void 0!==c.node(t)){Bt.warn("Node "+t+": "+JSON.stringify(c.node(t))),r.select("#"+g.id+" #"+t).attr("transform","translate("+(c.node(t).x-c.node(t).width/2)+","+(c.node(t).y+(Pu[t]?Pu[t].y:0)-c.node(t).height/2)+" )"),r.select("#"+g.id+" #"+t).attr("data-x-shift",c.node(t).x-c.node(t).width/2);a.querySelectorAll("#"+g.id+" #"+t+" .divider").forEach((t=>{const e=t.parentElement;let n=0,i=0;e&&(e.parentElement&&(n=e.parentElement.getBBox().width),i=parseInt(e.getAttribute("data-x-shift"),10),Number.isNaN(i)&&(i=0)),t.setAttribute("x1",0-i+8),t.setAttribute("x2",n-i-8)}))}else Bt.debug("No Node "+t+": "+JSON.stringify(c.node(t)))}));let y=g.getBBox();c.edges().forEach((function(t){void 0!==t&&void 0!==c.edge(t)&&(Bt.debug("Edge "+t.v+" -> "+t.w+": "+JSON.stringify(c.edge(t))),function(t,e,n){e.points=e.points.filter((t=>!Number.isNaN(t.y)));const i=e.points,r=(0,o.jvg)().x((function(t){return t.x})).y((function(t){return t.y})).curve(o.$0Z),a=t.append("path").attr("d",r(i)).attr("id","edge"+Ru).attr("class","transition");let s="";if(ui().state.arrowMarkerAbsolute&&(s=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,s=s.replace(/\(/g,"\\("),s=s.replace(/\)/g,"\\)")),a.attr("marker-end","url("+s+"#"+function(t){switch(t){case Nu.relationType.AGGREGATION:return"aggregation";case Nu.relationType.EXTENSION:return"extension";case Nu.relationType.COMPOSITION:return"composition";case Nu.relationType.DEPENDENCY:return"dependency"}}(Nu.relationType.DEPENDENCY)+"End)"),void 0!==n.title){const i=t.append("g").attr("class","stateLabel"),{x:r,y:a}=ei.calcLabelPosition(e.points),s=jt.getRows(n.title);let o=0;const c=[];let l=0,h=0;for(let t=0;t<=s.length;t++){const e=i.append("text").attr("text-anchor","middle").text(s[t]).attr("x",r).attr("y",a+o),n=e.node().getBBox();if(l=Math.max(l,n.width),h=Math.min(h,n.x),Bt.info(n.x,r,a+o),0===o){const t=e.node().getBBox();o=t.height,Bt.info("Title height",o,a)}c.push(e)}let u=o*s.length;if(s.length>1){const t=(s.length-1)*o*.5;c.forEach(((e,n)=>e.attr("y",a+n*o-t))),u=o*s.length}const d=i.node().getBBox();i.insert("rect",":first-child").attr("class","box").attr("x",r-l/2-ui().state.padding/2).attr("y",a-u/2-ui().state.padding/2-3.5).attr("width",l+ui().state.padding).attr("height",u+ui().state.padding),Bt.info(d)}Ru++}(e,c.edge(t),c.edge(t).relation))})),y=g.getBBox();const m={id:n||"root",label:n||"root",width:0,height:0};return m.width=y.width+2*Zu.padding,m.height=y.height+2*Zu.padding,Bt.debug("Doc rendered",m,c),m},Yu={setConf:function(){},draw:function(t,e,n,i){Zu=ui().state;const r=ui().securityLevel;let a;"sandbox"===r&&(a=(0,o.Ys)("#i"+e));const s="sandbox"===r?(0,o.Ys)(a.nodes()[0].contentDocument.body):(0,o.Ys)("body"),c="sandbox"===r?a.nodes()[0].contentDocument:document;Bt.debug("Rendering diagram "+t);const l=s.select(`[id='${e}']`);l.append("defs").append("marker").attr("id","dependencyEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z");new lt.k({multigraph:!0,compound:!0,rankdir:"RL"}).setDefaultEdgeLabel((function(){return{}}));const h=i.db.getRootDoc();ju(h,l,void 0,!1,s,c,i);const u=Zu.padding,d=l.node().getBBox(),p=d.width+2*u,f=d.height+2*u;bi(l,f,1.75*p,Zu.useMaxWidth),l.attr("viewBox",`${d.x-Zu.padding} ${d.y-Zu.padding} `+p+" "+f)}},zu="rect",Uu="rectWithTitle",Wu="statediagram",qu=`${Wu}-state`,Hu="transition",Vu=`${Hu} note-edge`,Gu=`${Wu}-note`,Xu=`${Wu}-cluster`,Qu=`${Wu}-cluster-alt`,Ku="parent",Ju="note",td="----",ed=`${td}${Ju}`,nd=`${td}${Ku}`,id="fill:none",rd="fill: #333",ad="text",sd="normal";let od={},cd=0;function ld(t="",e=0,n="",i=td){return`state-${t}${null!==n&&n.length>0?`${i}${n}`:""}-${e}`}const hd=(t,e,n,i,r,a)=>{const s=n.id,o=null==(c=i[s])?"":c.classes?c.classes.join(" "):"";var c;if("root"!==s){let e=zu;!0===n.start&&(e="start"),!1===n.start&&(e="end"),n.type!==ru&&(e=n.type),od[s]||(od[s]={id:s,shape:e,description:jt.sanitizeText(s,ui()),classes:`${o} ${qu}`});const i=od[s];n.description&&(Array.isArray(i.description)?(i.shape=Uu,i.description.push(n.description)):i.description.length>0?(i.shape=Uu,i.description===s?i.description=[n.description]:i.description=[i.description,n.description]):(i.shape=zu,i.description=n.description),i.description=jt.sanitizeTextOrArray(i.description,ui())),1===i.description.length&&i.shape===Uu&&(i.shape=zu),!i.type&&n.doc&&(Bt.info("Setting cluster for ",s,dd(n)),i.type="group",i.dir=dd(n),i.shape=n.type===au?"divider":"roundedWithTitle",i.classes=i.classes+" "+Xu+" "+(a?Qu:""));const r={labelStyle:"",shape:i.shape,labelText:i.description,classes:i.classes,style:"",id:s,dir:i.dir,domId:ld(s,cd),type:i.type,padding:15};if(n.note){const e={labelStyle:"",shape:"note",labelText:n.note.text,classes:Gu,style:"",id:s+ed+"-"+cd,domId:ld(s,cd,Ju),type:i.type,padding:15},a={labelStyle:"",shape:"noteGroup",labelText:n.note.text,classes:i.classes,style:"",id:s+nd,domId:ld(s,cd,Ku),type:"group",padding:0};cd++;const o=s+nd;t.setNode(o,a),t.setNode(e.id,e),t.setNode(s,r),t.setParent(s,o),t.setParent(e.id,o);let c=s,l=e.id;"left of"===n.note.position&&(c=e.id,l=s),t.setEdge(c,l,{arrowhead:"none",arrowType:"",style:id,labelStyle:"",classes:Vu,arrowheadStyle:rd,labelpos:"c",labelType:ad,thickness:sd})}else t.setNode(s,r)}e&&"root"!==e.id&&(Bt.trace("Setting node ",s," to be child of its parent ",e.id),t.setParent(s,e.id)),n.doc&&(Bt.trace("Adding nodes children "),ud(t,n,n.doc,i,r,!a))},ud=(t,e,n,i,r,a)=>{Bt.trace("items",n),n.forEach((n=>{switch(n.stmt){case nu:case ru:hd(t,e,n,i,r,a);break;case iu:{hd(t,e,n.state1,i,r,a),hd(t,e,n.state2,i,r,a);const s={id:"edge"+cd,arrowhead:"normal",arrowTypeEnd:"arrow_barb",style:id,labelStyle:"",label:jt.sanitizeText(n.description,ui()),arrowheadStyle:rd,labelpos:"c",labelType:ad,thickness:sd,classes:Hu};t.setEdge(n.state1.id,n.state2.id,s,cd),cd++}}}))},dd=(t,e="TB")=>{let n=e;if(t.doc)for(let i=0;i<t.doc.length;i++){const e=t.doc[i];"dir"===e.stmt&&(n=e.value)}return n},pd={setConf:function(t){const e=Object.keys(t);for(const n of e)t[n]},getClasses:function(t,e){Bt.trace("Extracting classes"),e.db.clear();try{return e.parser.parse(t),e.db.extract(e.db.getRootDocV2()),e.db.getClasses()}catch(n){return n}},draw:function(t,e,n,i){Bt.info("Drawing state diagram (v2)",e),od={};let r=i.db.getDirection();void 0===r&&(r="LR");const{securityLevel:a,state:s}=ui(),c=s.nodeSpacing||50,l=s.rankSpacing||50;Bt.info(i.db.getRootDocV2()),i.db.extract(i.db.getRootDocV2()),Bt.info(i.db.getRootDocV2());const h=i.db.getStates(),u=new lt.k({multigraph:!0,compound:!0}).setGraph({rankdir:dd(i.db.getRootDocV2()),nodesep:c,ranksep:l,marginx:8,marginy:8}).setDefaultEdgeLabel((function(){return{}}));let d;hd(u,void 0,i.db.getRootDocV2(),h,i.db,!0),"sandbox"===a&&(d=(0,o.Ys)("#i"+e));const p="sandbox"===a?(0,o.Ys)(d.nodes()[0].contentDocument.body):(0,o.Ys)("body"),f=p.select(`[id="${e}"]`),g=p.select("#"+e+" g");Ks(g,u,["barb"],Wu,e);ei.insertTitle(f,"statediagramTitleText",s.titleTopMargin,i.db.getDiagramTitle());const y=f.node().getBBox(),m=y.width+16,b=y.height+16;f.attr("class",Wu);const _=f.node().getBBox();bi(f,b,m,s.useMaxWidth);const x=`${_.x-8} ${_.y-8} ${m} ${b}`;Bt.debug(`viewBox ${x}`),f.attr("viewBox",x);const v=document.querySelectorAll('[id="'+e+'"] .edgeLabel .label');for(const o of v){const t=o.getBBox(),e=document.createElementNS("http://www.w3.org/2000/svg",zu);e.setAttribute("rx",0),e.setAttribute("ry",0),e.setAttribute("width",t.width),e.setAttribute("height",t.height),o.insertBefore(e,o.firstChild)}}};var fd=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,2],i=[1,5],r=[6,9,11,17,18,20,22,23,24,26],a=[1,15],s=[1,16],o=[1,17],c=[1,18],l=[1,19],h=[1,20],u=[1,24],d=[4,6,9,11,17,18,20,22,23,24,26],p={trace:function(){},yy:{},symbols_:{error:2,start:3,journey:4,document:5,EOF:6,directive:7,line:8,SPACE:9,statement:10,NEWLINE:11,openDirective:12,typeDirective:13,closeDirective:14,":":15,argDirective:16,title:17,acc_title:18,acc_title_value:19,acc_descr:20,acc_descr_value:21,acc_descr_multiline_value:22,section:23,taskName:24,taskData:25,open_directive:26,type_directive:27,arg_directive:28,close_directive:29,$accept:0,$end:1},terminals_:{2:"error",4:"journey",6:"EOF",9:"SPACE",11:"NEWLINE",15:":",17:"title",18:"acc_title",19:"acc_title_value",20:"acc_descr",21:"acc_descr_value",22:"acc_descr_multiline_value",23:"section",24:"taskName",25:"taskData",26:"open_directive",27:"type_directive",28:"arg_directive",29:"close_directive"},productions_:[0,[3,3],[3,2],[5,0],[5,2],[8,2],[8,1],[8,1],[8,1],[7,4],[7,6],[10,1],[10,2],[10,2],[10,1],[10,1],[10,2],[10,1],[12,1],[13,1],[16,1],[14,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 1:return a[o-1];case 3:case 7:case 8:this.$=[];break;case 4:a[o-1].push(a[o]),this.$=a[o-1];break;case 5:case 6:this.$=a[o];break;case 11:i.setDiagramTitle(a[o].substr(6)),this.$=a[o].substr(6);break;case 12:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 13:case 14:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 15:i.addSection(a[o].substr(8)),this.$=a[o].substr(8);break;case 16:i.addTask(a[o-1],a[o]),this.$="task";break;case 18:i.parseDirective("%%{","open_directive");break;case 19:i.parseDirective(a[o],"type_directive");break;case 20:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 21:i.parseDirective("}%%","close_directive","journey")}},table:[{3:1,4:n,7:3,12:4,26:i},{1:[3]},e(r,[2,3],{5:6}),{3:7,4:n,7:3,12:4,26:i},{13:8,27:[1,9]},{27:[2,18]},{6:[1,10],7:21,8:11,9:[1,12],10:13,11:[1,14],12:4,17:a,18:s,20:o,22:c,23:l,24:h,26:i},{1:[2,2]},{14:22,15:[1,23],29:u},e([15,29],[2,19]),e(r,[2,8],{1:[2,1]}),e(r,[2,4]),{7:21,10:25,12:4,17:a,18:s,20:o,22:c,23:l,24:h,26:i},e(r,[2,6]),e(r,[2,7]),e(r,[2,11]),{19:[1,26]},{21:[1,27]},e(r,[2,14]),e(r,[2,15]),{25:[1,28]},e(r,[2,17]),{11:[1,29]},{16:30,28:[1,31]},{11:[2,21]},e(r,[2,5]),e(r,[2,12]),e(r,[2,13]),e(r,[2,16]),e(d,[2,9]),{14:32,29:u},{29:[2,20]},{11:[1,33]},e(d,[2,10])],defaultActions:{5:[2,18],7:[2,2],24:[2,21],31:[2,20]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=a.slice.call(arguments,1),u=Object.create(this.lexer),d={yy:{}};for(var p in this.yy)Object.prototype.hasOwnProperty.call(this.yy,p)&&(d.yy[p]=this.yy[p]);u.setInput(t,d.yy),d.yy.lexer=u,d.yy.parser=this,void 0===u.yylloc&&(u.yylloc={});var f=u.yylloc;a.push(f);var g=u.options&&u.options.ranges;function y(){var t;return"number"!=typeof(t=i.pop()||u.lex()||1)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof d.yy.parseError?this.parseError=d.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var m,b,_,x,v,k,w,C,T={};;){if(b=n[n.length-1],this.defaultActions[b]?_=this.defaultActions[b]:(null==m&&(m=y()),_=s[b]&&s[b][m]),void 0===_||!_.length||!_[0]){var E="";for(v in C=[],s[b])this.terminals_[v]&&v>2&&C.push("'"+this.terminals_[v]+"'");E=u.showPosition?"Parse error on line "+(c+1)+":\n"+u.showPosition()+"\nExpecting "+C.join(", ")+", got '"+(this.terminals_[m]||m)+"'":"Parse error on line "+(c+1)+": Unexpected "+(1==m?"end of input":"'"+(this.terminals_[m]||m)+"'"),this.parseError(E,{text:u.match,token:this.terminals_[m]||m,line:u.yylineno,loc:f,expected:C})}if(_[0]instanceof Array&&_.length>1)throw new Error("Parse Error: multiple actions possible at state: "+b+", token: "+m);switch(_[0]){case 1:n.push(m),r.push(u.yytext),a.push(u.yylloc),n.push(_[1]),m=null,l=u.yyleng,o=u.yytext,c=u.yylineno,f=u.yylloc;break;case 2:if(k=this.productions_[_[1]][1],T.$=r[r.length-k],T._$={first_line:a[a.length-(k||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(k||1)].first_column,last_column:a[a.length-1].last_column},g&&(T._$.range=[a[a.length-(k||1)].range[0],a[a.length-1].range[1]]),void 0!==(x=this.performAction.apply(T,[o,l,c,d.yy,_[1],r,a].concat(h))))return x;k&&(n=n.slice(0,-1*k*2),r=r.slice(0,-1*k),a=a.slice(0,-1*k)),n.push(this.productions_[_[1]][0]),r.push(T.$),a.push(T._$),w=s[n[n.length-2]][n[n.length-1]],n.push(w);break;case 3:return!0}}return!0}},f=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),26;case 1:return this.begin("type_directive"),27;case 2:return this.popState(),this.begin("arg_directive"),15;case 3:return this.popState(),this.popState(),29;case 4:return 28;case 5:case 6:case 8:case 9:break;case 7:return 11;case 10:return 4;case 11:return 17;case 12:return this.begin("acc_title"),18;case 13:return this.popState(),"acc_title_value";case 14:return this.begin("acc_descr"),20;case 15:return this.popState(),"acc_descr_value";case 16:this.begin("acc_descr_multiline");break;case 17:this.popState();break;case 18:return"acc_descr_multiline_value";case 19:return 23;case 20:return 24;case 21:return 25;case 22:return 15;case 23:return 6;case 24:return"INVALID"}},rules:[/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:journey\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:section\s[^#:\n;]+)/i,/^(?:[^#:\n;]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{open_directive:{rules:[1],inclusive:!1},type_directive:{rules:[2,3],inclusive:!1},arg_directive:{rules:[3,4],inclusive:!1},acc_descr_multiline:{rules:[17,18],inclusive:!1},acc_descr:{rules:[15],inclusive:!1},acc_title:{rules:[13],inclusive:!1},INITIAL:{rules:[0,5,6,7,8,9,10,11,12,14,16,19,20,21,22,23,24],inclusive:!0}}},t);function g(){this.yy={}}return p.lexer=f,g.prototype=p,p.Parser=g,new g}();fd.parser=fd;const gd=fd,yd=t=>null!==t.match(/^\s*journey/);let md="";const bd=[],_d=[],xd=[],vd=function(){let t=!0;for(const[e,n]of xd.entries())xd[e].processed,t=t&&n.processed;return t},kd={parseDirective:function(t,e,n){xp.parseDirective(this,t,e,n)},getConfig:()=>ui().journey,clear:function(){bd.length=0,_d.length=0,md="",xd.length=0,Ri()},setDiagramTitle:zi,getDiagramTitle:Ui,setAccTitle:Zi,getAccTitle:Pi,setAccDescription:ji,getAccDescription:Yi,addSection:function(t){md=t,bd.push(t)},getSections:function(){return bd},getTasks:function(){let t=vd();let e=0;for(;!t&&e<100;)t=vd(),e++;return _d.push(...xd),_d},addTask:function(t,e){const n=e.substr(1).split(":");let i=0,r=[];1===n.length?(i=Number(n[0]),r=[]):(i=Number(n[0]),r=n[1].split(","));const a=r.map((t=>t.trim())),s={section:md,type:md,people:a,task:t,score:i};xd.push(s)},addTaskOrg:function(t){const e={section:md,type:md,description:t,task:t,classes:[]};_d.push(e)},getActors:function(){return function(){const t=[];return _d.forEach((e=>{e.people&&t.push(...e.people)})),[...new Set(t)].sort()}()}},wd=function(t,e){const n=t.append("rect");return n.attr("x",e.x),n.attr("y",e.y),n.attr("fill",e.fill),n.attr("stroke",e.stroke),n.attr("width",e.width),n.attr("height",e.height),n.attr("rx",e.rx),n.attr("ry",e.ry),void 0!==e.class&&n.attr("class",e.class),n},Cd=function(t,e){const n=t.append("circle");return n.attr("cx",e.cx),n.attr("cy",e.cy),n.attr("class","actor-"+e.pos),n.attr("fill",e.fill),n.attr("stroke",e.stroke),n.attr("r",e.r),void 0!==n.class&&n.attr("class",n.class),void 0!==e.title&&n.append("title").text(e.title),n},Td=function(t,e){const n=e.text.replace(/<br\s*\/?>/gi," "),i=t.append("text");i.attr("x",e.x),i.attr("y",e.y),i.attr("class","legend"),i.style("text-anchor",e.anchor),void 0!==e.class&&i.attr("class",e.class);const r=i.append("tspan");return r.attr("x",e.x+2*e.textMargin),r.text(n),i};let Ed=-1;const Sd=function(){return{x:0,y:0,width:100,anchor:"start",height:100,rx:0,ry:0}},Ad=function(){function t(t,e,n,r,a,s,o,c){i(e.append("text").attr("x",n+a/2).attr("y",r+s/2+5).style("font-color",c).style("text-anchor","middle").text(t),o)}function e(t,e,n,r,a,s,o,c,l){const{taskFontSize:h,taskFontFamily:u}=c,d=t.split(/<br\s*\/?>/gi);for(let p=0;p<d.length;p++){const t=p*h-h*(d.length-1)/2,c=e.append("text").attr("x",n+a/2).attr("y",r).attr("fill",l).style("text-anchor","middle").style("font-size",h).style("font-family",u);c.append("tspan").attr("x",n+a/2).attr("dy",t).text(d[p]),c.attr("y",r+s/2).attr("dominant-baseline","central").attr("alignment-baseline","central"),i(c,o)}}function n(t,n,r,a,s,o,c,l){const h=n.append("switch"),u=h.append("foreignObject").attr("x",r).attr("y",a).attr("width",s).attr("height",o).attr("position","fixed").append("xhtml:div").style("display","table").style("height","100%").style("width","100%");u.append("div").attr("class","label").style("display","table-cell").style("text-align","center").style("vertical-align","middle").text(t),e(t,h,r,a,s,o,c,l),i(u,c)}function i(t,e){for(const n in e)n in e&&t.attr(n,e[n])}return function(i){return"fo"===i.textPlacement?n:"old"===i.textPlacement?t:e}}(),Ld=Cd,Bd=function(t,e,n){const i=t.append("g"),r=Sd();r.x=e.x,r.y=e.y,r.fill=e.fill,r.width=n.width,r.height=n.height,r.class="journey-section section-type-"+e.num,r.rx=3,r.ry=3,wd(i,r),Ad(n)(e.text,i,r.x,r.y,r.width,r.height,{class:"journey-section section-type-"+e.num},n,e.colour)},Nd=Td,Dd=function(t,e,n){const i=e.x+n.width/2,r=t.append("g");Ed++;r.append("line").attr("id","task"+Ed).attr("x1",i).attr("y1",e.y).attr("x2",i).attr("y2",450).attr("class","task-line").attr("stroke-width","1px").attr("stroke-dasharray","4 2").attr("stroke","#666"),function(t,e){const n=15,i=t.append("circle").attr("cx",e.cx).attr("cy",e.cy).attr("class","face").attr("r",n).attr("stroke-width",2).attr("overflow","visible"),r=t.append("g");r.append("circle").attr("cx",e.cx-5).attr("cy",e.cy-5).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666"),r.append("circle").attr("cx",e.cx+5).attr("cy",e.cy-5).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666"),e.score>3?function(t){const i=(0,o.Nb1)().startAngle(Math.PI/2).endAngle(Math.PI/2*3).innerRadius(7.5).outerRadius(n/2.2);t.append("path").attr("class","mouth").attr("d",i).attr("transform","translate("+e.cx+","+(e.cy+2)+")")}(r):e.score<3?function(t){const i=(0,o.Nb1)().startAngle(3*Math.PI/2).endAngle(Math.PI/2*5).innerRadius(7.5).outerRadius(n/2.2);t.append("path").attr("class","mouth").attr("d",i).attr("transform","translate("+e.cx+","+(e.cy+7)+")")}(r):r.append("line").attr("class","mouth").attr("stroke",2).attr("x1",e.cx-5).attr("y1",e.cy+7).attr("x2",e.cx+5).attr("y2",e.cy+7).attr("class","mouth").attr("stroke-width","1px").attr("stroke","#666")}(r,{cx:i,cy:300+30*(5-e.score),score:e.score});const a=Sd();a.x=e.x,a.y=e.y,a.fill=e.fill,a.width=n.width,a.height=n.height,a.class="task task-type-"+e.num,a.rx=3,a.ry=3,wd(r,a);let s=e.x+14;e.people.forEach((t=>{const n=e.actors[t].color,i={cx:s,cy:e.y,r:7,fill:n,stroke:"#000",title:t,pos:e.actors[t].position};Cd(r,i),s+=10})),Ad(n)(e.task,r,a.x,a.y,a.width,a.height,{class:"task"},n,e.colour)},Od=function(t){t.append("defs").append("marker").attr("id","arrowhead").attr("refX",5).attr("refY",2).attr("markerWidth",6).attr("markerHeight",4).attr("orient","auto").append("path").attr("d","M 0,0 V 4 L6,2 Z")},Md={};const Id=ui().journey,Fd=Id.leftMargin,$d={data:{startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},verticalPos:0,sequenceItems:[],init:function(){this.sequenceItems=[],this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},this.verticalPos=0},updateVal:function(t,e,n,i){void 0===t[e]?t[e]=n:t[e]=i(n,t[e])},updateBounds:function(t,e,n,i){const r=ui().journey,a=this;let s=0;var o;this.sequenceItems.forEach((function(c){s++;const l=a.sequenceItems.length-s+1;a.updateVal(c,"starty",e-l*r.boxMargin,Math.min),a.updateVal(c,"stopy",i+l*r.boxMargin,Math.max),a.updateVal($d.data,"startx",t-l*r.boxMargin,Math.min),a.updateVal($d.data,"stopx",n+l*r.boxMargin,Math.max),"activation"!==o&&(a.updateVal(c,"startx",t-l*r.boxMargin,Math.min),a.updateVal(c,"stopx",n+l*r.boxMargin,Math.max),a.updateVal($d.data,"starty",e-l*r.boxMargin,Math.min),a.updateVal($d.data,"stopy",i+l*r.boxMargin,Math.max))}))},insert:function(t,e,n,i){const r=Math.min(t,n),a=Math.max(t,n),s=Math.min(e,i),o=Math.max(e,i);this.updateVal($d.data,"startx",r,Math.min),this.updateVal($d.data,"starty",s,Math.min),this.updateVal($d.data,"stopx",a,Math.max),this.updateVal($d.data,"stopy",o,Math.max),this.updateBounds(r,s,a,o)},bumpVerticalPos:function(t){this.verticalPos=this.verticalPos+t,this.data.stopy=this.verticalPos},getVerticalPos:function(){return this.verticalPos},getBounds:function(){return this.data}},Rd=Id.sectionFills,Zd=Id.sectionColours,Pd=function(t,e,n){const i=ui().journey;let r="";const a=n+(2*i.height+i.diagramMarginY);let s=0,o="#CCC",c="black",l=0;for(const[h,u]of e.entries()){if(r!==u.section){o=Rd[s%Rd.length],l=s%Rd.length,c=Zd[s%Zd.length];const e={x:h*i.taskMargin+h*i.width+Fd,y:50,text:u.section,fill:o,num:l,colour:c};Bd(t,e,i),r=u.section,s++}const e=u.people.reduce(((t,e)=>(Md[e]&&(t[e]=Md[e]),t)),{});u.x=h*i.taskMargin+h*i.width+Fd,u.y=a,u.width=i.diagramMarginX,u.height=i.diagramMarginY,u.colour=c,u.fill=o,u.num=l,u.actors=e,Dd(t,u,i),$d.insert(u.x,u.y,u.x+u.width+i.taskMargin,450)}},jd={setConf:function(t){Object.keys(t).forEach((function(e){Id[e]=t[e]}))},draw:function(t,e,n,i){const r=ui().journey;i.db.clear(),i.parser.parse(t+"\n");const a=ui().securityLevel;let s;"sandbox"===a&&(s=(0,o.Ys)("#i"+e));const c="sandbox"===a?(0,o.Ys)(s.nodes()[0].contentDocument.body):(0,o.Ys)("body");$d.init();const l=c.select("#"+e);Od(l);const h=i.db.getTasks(),u=i.db.getDiagramTitle(),d=i.db.getActors();for(const o in Md)delete Md[o];let p=0;d.forEach((t=>{Md[t]={color:r.actorColours[p%r.actorColours.length],position:p},p++})),function(t){const e=ui().journey;let n=60;Object.keys(Md).forEach((i=>{const r=Md[i].color,a={cx:20,cy:n,r:7,fill:r,stroke:"#000",pos:Md[i].position};Ld(t,a);const s={x:40,y:n+7,fill:"#666",text:i,textMargin:5|e.boxTextMargin};Nd(t,s),n+=20}))}(l),$d.insert(0,0,Fd,50*Object.keys(Md).length),Pd(l,h,0);const f=$d.getBounds();u&&l.append("text").text(u).attr("x",Fd).attr("font-size","4ex").attr("font-weight","bold").attr("y",25);const g=f.stopy-f.starty+2*r.diagramMarginY,y=Fd+f.stopx+2*r.diagramMarginX;bi(l,g,y,r.useMaxWidth),l.append("line").attr("x1",Fd).attr("y1",4*r.height).attr("x2",y-Fd-4).attr("y2",4*r.height).attr("stroke-width",4).attr("stroke","black").attr("marker-end","url(#arrowhead)");const m=u?70:0;l.attr("viewBox",`${f.startx} -25 ${y} ${g+m}`),l.attr("preserveAspectRatio","xMinYMin meet"),l.attr("height",g+m+25)}};let Yd={};const zd={setConf:function(t){Yd={...Yd,...t}},draw:(t,e,n)=>{try{Bt.debug("Renering svg for syntax error\n");const t=(0,o.Ys)("#"+e),i=t.append("g");i.append("path").attr("class","error-icon").attr("d","m411.313,123.313c6.25-6.25 6.25-16.375 0-22.625s-16.375-6.25-22.625,0l-32,32-9.375,9.375-20.688-20.688c-12.484-12.5-32.766-12.5-45.25,0l-16,16c-1.261,1.261-2.304,2.648-3.31,4.051-21.739-8.561-45.324-13.426-70.065-13.426-105.867,0-192,86.133-192,192s86.133,192 192,192 192-86.133 192-192c0-24.741-4.864-48.327-13.426-70.065 1.402-1.007 2.79-2.049 4.051-3.31l16-16c12.5-12.492 12.5-32.758 0-45.25l-20.688-20.688 9.375-9.375 32.001-31.999zm-219.313,100.687c-52.938,0-96,43.063-96,96 0,8.836-7.164,16-16,16s-16-7.164-16-16c0-70.578 57.422-128 128-128 8.836,0 16,7.164 16,16s-7.164,16-16,16z"),i.append("path").attr("class","error-icon").attr("d","m459.02,148.98c-6.25-6.25-16.375-6.25-22.625,0s-6.25,16.375 0,22.625l16,16c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688 6.25-6.25 6.25-16.375 0-22.625l-16.001-16z"),i.append("path").attr("class","error-icon").attr("d","m340.395,75.605c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688 6.25-6.25 6.25-16.375 0-22.625l-16-16c-6.25-6.25-16.375-6.25-22.625,0s-6.25,16.375 0,22.625l15.999,16z"),i.append("path").attr("class","error-icon").attr("d","m400,64c8.844,0 16-7.164 16-16v-32c0-8.836-7.156-16-16-16-8.844,0-16,7.164-16,16v32c0,8.836 7.156,16 16,16z"),i.append("path").attr("class","error-icon").attr("d","m496,96.586h-32c-8.844,0-16,7.164-16,16 0,8.836 7.156,16 16,16h32c8.844,0 16-7.164 16-16 0-8.836-7.156-16-16-16z"),i.append("path").attr("class","error-icon").attr("d","m436.98,75.605c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688l32-32c6.25-6.25 6.25-16.375 0-22.625s-16.375-6.25-22.625,0l-32,32c-6.251,6.25-6.251,16.375-0.001,22.625z"),i.append("text").attr("class","error-text").attr("x",1440).attr("y",250).attr("font-size","150px").style("text-anchor","middle").text("Syntax error in graph"),i.append("text").attr("class","error-text").attr("x",1250).attr("y",400).attr("font-size","100px").style("text-anchor","middle").text("mermaid version "+n),t.attr("height",100),t.attr("width",500),t.attr("viewBox","768 0 912 512")}catch(r){Bt.error("Error while rendering info diagram"),Bt.error((i=r)instanceof Error?i.message:String(i))}var i}},Ud="flowchart-elk",Wd={id:Ud,detector:(t,e)=>{var n;return!!(t.match(/^\s*flowchart-elk/)||t.match(/^\s*flowchart|graph/)&&"elk"===(null==(n=null==e?void 0:e.flowchart)?void 0:n.defaultRenderer))},loader:async()=>{const{diagram:t}=await n.e(9487).then(n.bind(n,19487));return{id:Ud,diagram:t}}},qd="timeline",Hd={id:qd,detector:t=>null!==t.match(/^\s*timeline/),loader:async()=>{const{diagram:t}=await n.e(6316).then(n.bind(n,96316));return{id:qd,diagram:t}}},Vd="mindmap",Gd={id:Vd,detector:t=>null!==t.match(/^\s*mindmap/),loader:async()=>{const{diagram:t}=await n.e(7724).then(n.bind(n,47724));return{id:Vd,diagram:t}}};let Xd=!1;const Qd=()=>{Xd||(Xd=!0,Bn(Wd,Hd,Gd),ir("error",{db:{clear:()=>{}},styles:ki,renderer:zd,parser:{parser:{yy:{}},parse:()=>{}},init:()=>{}},(t=>"error"===t.toLowerCase().trim())),ir("---",{db:{clear:()=>{}},styles:ki,renderer:zd,parser:{parser:{yy:{}},parse:()=>{throw new Error("Diagrams beginning with --- are not valid. If you were trying to use a YAML front-matter, please ensure that you've correctly opened and closed the YAML front-matter with unindented `---` blocks")}},init:()=>null},(t=>t.toLowerCase().trimStart().startsWith("---"))),ir("c4",{parser:Yr,db:ia,renderer:Ia,styles:Ni,init:t=>{Ia.setConf(t.c4)}},zr),ir("class",{parser:$a,db:es,renderer:fs,styles:xi,init:t=>{t.class||(t.class={}),t.class.arrowMarkerAbsolute=t.arrowMarkerAbsolute,es.clear()}},Ra),ir("classDiagram",{parser:$a,db:es,renderer:no,styles:xi,init:t=>{t.class||(t.class={}),t.class.arrowMarkerAbsolute=t.arrowMarkerAbsolute,es.clear()}},Za),ir("er",{parser:ro,db:lo,renderer:ko,styles:vi},ao),ir("gantt",{parser:Nc,db:hl,renderer:pl,styles:Ci},Dc),ir("info",{parser:gl,db:bl,renderer:_l,styles:Ti},xl),ir("pie",{parser:kl,db:El,renderer:Bl,styles:Ei},wl),ir("requirement",{parser:Dl,db:Zl,renderer:Xl,styles:Si},Ol),ir("sequence",{parser:Kl,db:_h,renderer:Qh,styles:Ai,init:t=>{if(t.sequence||(t.sequence={}),t.sequence.arrowMarkerAbsolute=t.arrowMarkerAbsolute,"sequenceDiagram"in t)throw new Error("`mermaid config.sequenceDiagram` has been renamed to `config.sequence`. Please update your mermaid config.");_h.setWrap(t.wrap),Qh.setConf(t.sequence)}},Jl),ir("state",{parser:Jh,db:Nu,renderer:Yu,styles:Li,init:t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute,Nu.clear()}},tu),ir("stateDiagram",{parser:Jh,db:Nu,renderer:pd,styles:Li,init:t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute,Nu.clear()}},eu),ir("journey",{parser:gd,db:kd,renderer:jd,styles:Bi,init:t=>{jd.setConf(t.journey),kd.clear()}},yd),ir("flowchart",{parser:Co,db:kc,renderer:Lc,styles:wi,init:t=>{t.flowchart||(t.flowchart={}),t.flowchart.arrowMarkerAbsolute=t.arrowMarkerAbsolute,Tc(t.flowchart),kc.clear(),kc.setGen("gen-1")}},To),ir("flowchart-v2",{parser:Co,db:kc,renderer:Lc,styles:wi,init:t=>{t.flowchart||(t.flowchart={}),t.flowchart.arrowMarkerAbsolute=t.arrowMarkerAbsolute,hi({flowchart:{arrowMarkerAbsolute:t.arrowMarkerAbsolute}}),Lc.setConf(t.flowchart),kc.clear(),kc.setGen("gen-2")}},Eo),ir("gitGraph",{parser:sr,db:Cr,renderer:Zr,styles:Pr},or))};class Kd{constructor(t,e){var n,i;this.txt=t,this.type="graph",this.detectTypeFailed=!1;const r=ui();this.txt=t;try{this.type=Ln(t,r)}catch(o){this.handleError(o,e),this.type="error",this.detectTypeFailed=!0}const a=rr(this.type);Bt.debug("Type "+this.type),this.db=a.db,null==(i=(n=this.db).clear)||i.call(n),this.renderer=a.renderer,this.parser=a.parser;const s=this.parser.parse.bind(this.parser);this.parser.parse=t=>s(function(t,e){var n;const i=t.match(Tn);if(i){const r=Cn(i[1],{schema:wn});return(null==r?void 0:r.title)&&(null==(n=e.setDiagramTitle)||n.call(e,r.title)),t.slice(i[0].length)}return t}(t,this.db)),this.parser.parser.yy=this.db,a.init&&(a.init(r),Bt.info("Initialized diagram "+this.type,r)),this.txt+="\n",this.parse(this.txt,e)}parse(t,e){var n,i;if(this.detectTypeFailed)return!1;try{return t+="\n",null==(i=(n=this.db).clear)||i.call(n),this.parser.parse(t),!0}catch(r){this.handleError(r,e)}return!1}handleError(t,e){if(void 0===e)throw t;Jn(t)?e(t.str,t.hash):e(t)}getParser(){return this.parser}getType(){return this.type}}const Jd=(t,e)=>{const n=Ln(t,ui());try{rr(n)}catch(i){const r=An[n].loader;if(!r)throw new Error(`Diagram ${n} not found.`);return r().then((({diagram:i})=>(ir(n,i,void 0),new Kd(t,e))))}return new Kd(t,e)},tp=Kd,ep="graphics-document document";const np=["graph","flowchart","flowchart-v2","stateDiagram","stateDiagram-v2"],ip="graph TB;a[Maximum text size in diagram exceeded];style a fill:#faa",rp="sandbox",ap="loose",sp="http://www.w3.org/1999/xlink",op="http://www.w3.org/1999/xhtml",cp=["foreignobject"],lp=["dominant-baseline"];const hp=function(t){let e=t;return e=e.replace(/style.*:\S*#.*;/g,(function(t){return t.substring(0,t.length-1)})),e=e.replace(/classDef.*:\S*#.*;/g,(function(t){return t.substring(0,t.length-1)})),e=e.replace(/#\w+;/g,(function(t){const e=t.substring(1,t.length-1);return/^\+?\d+$/.test(e)?"\ufb02\xb0\xb0"+e+"\xb6\xdf":"\ufb02\xb0"+e+"\xb6\xdf"})),e},up=function(t){let e=t;return e=e.replace(/\ufb02\xb0\xb0/g,"&#"),e=e.replace(/\ufb02\xb0/g,"&"),e=e.replace(/\xb6\xdf/g,";"),e},dp=(t,e,n=[])=>`\n.${t} ${e} { ${n.join(" !important; ")} !important; }`,pp=(t,e,n,i)=>{const r=((t,e,n={})=>{var i;let r="";if(void 0!==t.themeCSS&&(r+=`\n${t.themeCSS}`),void 0!==t.fontFamily&&(r+=`\n:root { --mermaid-font-family: ${t.fontFamily}}`),void 0!==t.altFontFamily&&(r+=`\n:root { --mermaid-alt-font-family: ${t.altFontFamily}}`),!(0,At.Z)(n)&&np.includes(e)){const e=t.htmlLabels||(null==(i=t.flowchart)?void 0:i.htmlLabels)?["> *","span"]:["rect","polygon","ellipse","circle","path"];for(const t in n){const i=n[t];(0,At.Z)(i.styles)||e.forEach((t=>{r+=dp(i.id,t,i.styles)})),(0,At.Z)(i.textStyles)||(r+=dp(i.id,"tspan",i.textStyles))}}return r})(t,e,n);return M(it(`${i}{${Oi(e,r,t.themeVariables)}}`),I)},fp=(t="",e,n)=>{let i=t;return n||e||(i=i.replace(/marker-end="url\(.*?#/g,'marker-end="url(#')),i=up(i),i=i.replace(/<br>/g,"<br/>"),i},gp=(t="",e)=>`<iframe style="width:100%;height:${e?e.viewBox.baseVal.height+"px":"100%"};border:0;margin:0;" src="data:text/html;base64,${btoa('<body style="margin:0">'+t+"</body>")}" sandbox="allow-top-navigation-by-user-activation allow-popups">\n The "iframe" tag is not supported by your browser.\n</iframe>`,yp=(t,e,n,i,r)=>{const a=t.append("div");a.attr("id",n),i&&a.attr("style",i);const s=a.append("svg").attr("id",e).attr("width","100%").attr("xmlns","http://www.w3.org/2000/svg");return r&&s.attr("xmlns:xlink",r),s.append("g"),t};function mp(t,e){return t.append("iframe").attr("id",e).attr("style","width: 100%; height: 100%;").attr("sandbox","")}const bp=(t,e,n,i)=>{var r,a,s;null==(r=t.getElementById(e))||r.remove(),null==(a=t.getElementById(n))||a.remove(),null==(s=t.getElementById(i))||s.remove()};function _p(t,e,n,i){var r,a;a=t,(r=e).attr("role",ep),(0,At.Z)(a)||r.attr("aria-roledescription",a),function(t,e,n,i){if(void 0!==t.insert&&(e||n)){if(n){const e="chart-desc-"+i;t.attr("aria-describedby",e),t.insert("desc",":first-child").attr("id",e).text(n)}if(e){const n="chart-title-"+i;t.attr("aria-labelledby",n),t.insert("title",":first-child").attr("id",n).text(e)}}}(e,n,i,e.attr("id"))}const xp=Object.freeze({render:function(t,e,n,i){var r,a,s,c;Qd(),fi();const l=ei.detectInit(e);l&&(Qn(l),pi(l));const u=ui();Bt.debug(u),e.length>((null==u?void 0:u.maxTextSize)??5e4)&&(e=ip),e=e.replace(/\r\n?/g,"\n");const d="#"+t,p="i"+t,f="#"+p,g="d"+t,y="#"+g;let m=(0,o.Ys)("body");const b=u.securityLevel===rp,_=u.securityLevel===ap,x=u.fontFamily;if(void 0!==i){if(i&&(i.innerHTML=""),b){const t=mp((0,o.Ys)(i),p);m=(0,o.Ys)(t.nodes()[0].contentDocument.body),m.node().style.margin=0}else m=(0,o.Ys)(i);yp(m,t,g,`font-family: ${x}`,sp)}else{if(bp(document,t,g,p),b){const t=mp((0,o.Ys)("body"),p);m=(0,o.Ys)(t.nodes()[0].contentDocument.body),m.node().style.margin=0}else m=(0,o.Ys)("body");yp(m,t,g)}let v,k;e=hp(e);try{if(v=Jd(e),"then"in v)throw new Error("Diagram is a promise. Use renderAsync.")}catch(O){v=new tp("error"),k=O}const w=m.select(y).node(),C=v.type,T=w.firstChild,E=T.firstChild,S=np.includes(C)?v.renderer.getClasses(e,v):{},A=pp(u,C,S,d),L=document.createElement("style");L.innerHTML=A,T.insertBefore(L,E);try{v.renderer.draw(e,t,ni,v)}catch(M){throw zd.draw(e,t,ni),M}_p(C,m.select(`${y} svg`),null==(a=(r=v.db).getAccTitle)?void 0:a.call(r),null==(c=(s=v.db).getAccDescription)?void 0:c.call(s)),m.select(`[id="${t}"]`).selectAll("foreignobject > *").attr("xmlns",op);let B=m.select(y).node().innerHTML;if(Bt.debug("config.arrowMarkerAbsolute",u.arrowMarkerAbsolute),B=fp(B,b,Zt(u.arrowMarkerAbsolute)),b){const t=m.select(y+" svg").node();B=gp(B,t)}else _||(B=h().sanitize(B,{ADD_TAGS:cp,ADD_ATTR:lp}));if(void 0!==n)switch(C){case"flowchart":case"flowchart-v2":n(B,kc.bindFunctions);break;case"gantt":n(B,hl.bindFunctions);break;case"class":case"classDiagram":n(B,es.bindFunctions);break;default:n(B)}else Bt.debug("CB = undefined!");vh();const N=b?f:y,D=(0,o.Ys)(N).node();if(D&&"remove"in D&&D.remove(),k)throw k;return B},renderAsync:async function(t,e,n,i){var r,a,s,c;Qd(),fi();const l=ei.detectInit(e);l&&(Qn(l),pi(l));const u=ui();Bt.debug(u),e.length>((null==u?void 0:u.maxTextSize)??5e4)&&(e=ip),e=e.replace(/\r\n?/g,"\n");const d="#"+t,p="i"+t,f="#"+p,g="d"+t,y="#"+g;let m=(0,o.Ys)("body");const b=u.securityLevel===rp,_=u.securityLevel===ap,x=u.fontFamily;if(void 0!==i){if(i&&(i.innerHTML=""),b){const t=mp((0,o.Ys)(i),p);m=(0,o.Ys)(t.nodes()[0].contentDocument.body),m.node().style.margin=0}else m=(0,o.Ys)(i);yp(m,t,g,`font-family: ${x}`,sp)}else{if(bp(document,t,g,p),b){const t=mp((0,o.Ys)("body"),p);m=(0,o.Ys)(t.nodes()[0].contentDocument.body),m.node().style.margin=0}else m=(0,o.Ys)("body");yp(m,t,g)}let v,k;e=hp(e);try{v=await Jd(e)}catch(O){v=new tp("error"),k=O}const w=m.select(y).node(),C=v.type,T=w.firstChild,E=T.firstChild,S=np.includes(C)?v.renderer.getClasses(e,v):{},A=pp(u,C,S,d),L=document.createElement("style");L.innerHTML=A,T.insertBefore(L,E);try{await v.renderer.draw(e,t,ni,v)}catch(M){throw zd.draw(e,t,ni),M}_p(C,m.select(`${y} svg`),null==(a=(r=v.db).getAccTitle)?void 0:a.call(r),null==(c=(s=v.db).getAccDescription)?void 0:c.call(s)),m.select(`[id="${t}"]`).selectAll("foreignobject > *").attr("xmlns",op);let B=m.select(y).node().innerHTML;if(Bt.debug("config.arrowMarkerAbsolute",u.arrowMarkerAbsolute),B=fp(B,b,Zt(u.arrowMarkerAbsolute)),b){const t=m.select(y+" svg").node();B=gp(B,t)}else _||(B=h().sanitize(B,{ADD_TAGS:cp,ADD_ATTR:lp}));if(void 0!==n)switch(C){case"flowchart":case"flowchart-v2":n(B,kc.bindFunctions);break;case"gantt":n(B,hl.bindFunctions);break;case"class":case"classDiagram":n(B,es.bindFunctions);break;default:n(B)}else Bt.debug("CB = undefined!");vh();const N=b?f:y,D=(0,o.Ys)(N).node();if(D&&"remove"in D&&D.remove(),k)throw k;return B},parse:function(t,e){return Qd(),new tp(t,e).parse(t,e)},parseAsync:async function(t,e){return Qd(),(await Jd(t,e)).parse(t,e)},parseDirective:Vi,initialize:function(t={}){var e;(null==t?void 0:t.fontFamily)&&!(null==(e=t.themeVariables)?void 0:e.fontFamily)&&(t.themeVariables={fontFamily:t.fontFamily}),ri=On({},t),(null==t?void 0:t.theme)&&t.theme in qt?t.themeVariables=qt[t.theme].getThemeVariables(t.themeVariables):t&&(t.themeVariables=qt.default.getThemeVariables(t.themeVariables));const n="object"==typeof t?(t=>(ai=On({},ii),ai=On(ai,t),t.theme&&qt[t.theme]&&(ai.themeVariables=qt[t.theme].getThemeVariables(t.themeVariables)),ci(ai,si),ai))(t):li();Nt(n.logLevel),Qd()},getConfig:ui,setConfig:hi,getSiteConfig:li,updateSiteConfig:t=>(ai=On(ai,t),ci(ai,si),ai),reset:()=>{fi()},globalReset:()=>{fi(ii)},defaultConfig:ii});Nt(ui().logLevel),fi(ui());const vp=(t,e,n)=>{Bt.warn(t),Jn(t)?(n&&n(t.str,t.hash),e.push({...t,message:t.str,error:t})):(n&&n(t),t instanceof Error&&e.push({str:t.message,message:t.message,hash:t.name,error:t}))},kp=async function(t,e,n){const r=xp.getConfig();let a;if(t&&(Sp.sequenceConfig=t),Bt.debug((n?"":"No ")+"Callback function found"),void 0===e)a=document.querySelectorAll(".mermaid");else if("string"==typeof e)a=document.querySelectorAll(e);else if(e instanceof HTMLElement)a=[e];else{if(!(e instanceof NodeList))throw new Error("Invalid argument nodes for mermaid.init");a=e}Bt.debug(`Found ${a.length} diagrams`),void 0!==(null==t?void 0:t.startOnLoad)&&(Bt.debug("Start On Load: "+(null==t?void 0:t.startOnLoad)),xp.updateSiteConfig({startOnLoad:null==t?void 0:t.startOnLoad}));const s=new ei.initIdGenerator(r.deterministicIds,r.deterministicIDSeed);let o;const c=[];for(const h of Array.from(a)){if(Bt.info("Rendering diagram: "+h.id),h.getAttribute("data-processed"))continue;h.setAttribute("data-processed","true");const t=`mermaid-${s.next()}`;o=h.innerHTML,o=i(ei.entityDecode(o)).trim().replace(/<br\s*\/?>/gi,"<br/>");const e=ei.detectInit(o);e&&Bt.debug("Detected early reinit: ",e);try{await xp.renderAsync(t,o,((e,i)=>{h.innerHTML=e,void 0!==n&&n(t),i&&i(h)}),h)}catch(l){vp(l,c,Sp.parseError)}}if(c.length>0)throw c[0]},wp=function(){if(Sp.startOnLoad){const{startOnLoad:t}=xp.getConfig();t&&Sp.init().catch((t=>Bt.error("Mermaid failed to initialize",t)))}};"undefined"!=typeof document&&window.addEventListener("load",wp,!1);const Cp=[];let Tp=!1;const Ep=async()=>{if(!Tp){for(Tp=!0;Cp.length>0;){const e=Cp.shift();if(e)try{await e()}catch(t){Bt.error("Error executing queue",t)}}Tp=!1}},Sp={startOnLoad:!0,diagrams:{},mermaidAPI:xp,parse:t=>xp.parse(t,Sp.parseError),parseAsync:t=>new Promise(((e,n)=>{Cp.push((()=>new Promise(((i,r)=>{xp.parseAsync(t,Sp.parseError).then((t=>{i(t),e(t)}),(t=>{Bt.error("Error parsing",t),r(t),n(t)}))})))),Ep().catch(n)})),render:xp.render,renderAsync:(t,e,n,i)=>new Promise(((r,a)=>{Cp.push((()=>new Promise(((s,o)=>{xp.renderAsync(t,e,n,i).then((t=>{s(t),r(t)}),(t=>{Bt.error("Error parsing",t),o(t),a(t)}))})))),Ep().catch(a)})),init:async function(t,e,n){try{await kp(t,e,n)}catch(i){Bt.warn("Syntax Error rendering"),Jn(i)&&Bt.warn(i.str),Sp.parseError&&Sp.parseError(i)}},initThrowsErrors:function(t,e,n){const r=xp.getConfig();let a;if(t&&(Sp.sequenceConfig=t),Bt.debug((n?"":"No ")+"Callback function found"),void 0===e)a=document.querySelectorAll(".mermaid");else if("string"==typeof e)a=document.querySelectorAll(e);else if(e instanceof HTMLElement)a=[e];else{if(!(e instanceof NodeList))throw new Error("Invalid argument nodes for mermaid.init");a=e}Bt.debug(`Found ${a.length} diagrams`),void 0!==(null==t?void 0:t.startOnLoad)&&(Bt.debug("Start On Load: "+(null==t?void 0:t.startOnLoad)),xp.updateSiteConfig({startOnLoad:null==t?void 0:t.startOnLoad}));const s=new ei.initIdGenerator(r.deterministicIds,r.deterministicIDSeed);let o;const c=[];for(const h of Array.from(a)){if(Bt.info("Rendering diagram: "+h.id),h.getAttribute("data-processed"))continue;h.setAttribute("data-processed","true");const t=`mermaid-${s.next()}`;o=h.innerHTML,o=i(ei.entityDecode(o)).trim().replace(/<br\s*\/?>/gi,"<br/>");const e=ei.detectInit(o);e&&Bt.debug("Detected early reinit: ",e);try{xp.render(t,o,((e,i)=>{h.innerHTML=e,void 0!==n&&n(t),i&&i(h)}),h)}catch(l){vp(l,c,Sp.parseError)}}if(c.length>0)throw c[0]},initThrowsErrorsAsync:kp,registerExternalDiagrams:async(t,{lazyLoad:e=!0}={})=>{e?Bn(...t):await(async(...t)=>{Bt.debug(`Loading ${t.length} external diagrams`);const e=(await Promise.allSettled(t.map((async({id:t,detector:e,loader:n})=>{const{diagram:i}=await n();ir(t,i,e)})))).filter((t=>"rejected"===t.status));if(e.length>0){Bt.error(`Failed to load ${e.length} external diagrams`);for(const t of e)Bt.error(t);throw new Error(`Failed to load ${e.length} external diagrams`)}})(...t)},initialize:function(t){xp.initialize(t)},parseError:void 0,contentLoaded:wp,setParseErrorHandler:function(t){Sp.parseError=t}}},87594:(t,e)=>{function n(t){let e,n=[];for(let i of t.split(",").map((t=>t.trim())))if(/^-?\d+$/.test(i))n.push(parseInt(i,10));else if(e=i.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[t,i,r,a]=e;if(i&&a){i=parseInt(i),a=parseInt(a);const t=i<a?1:-1;"-"!==r&&".."!==r&&"\u2025"!==r||(a+=t);for(let e=i;e!==a;e+=t)n.push(e)}}return n}e.default=n,t.exports=n},59373:(t,e,n)=>{"use strict";function i(t,e){let n;if(void 0===e)for(const i of t)null!=i&&(n<i||void 0===n&&i>=i)&&(n=i);else{let i=-1;for(let r of t)null!=(r=e(r,++i,t))&&(n<r||void 0===n&&r>=r)&&(n=r)}return n}function r(t,e){let n;if(void 0===e)for(const i of t)null!=i&&(n>i||void 0===n&&i>=i)&&(n=i);else{let i=-1;for(let r of t)null!=(r=e(r,++i,t))&&(n>r||void 0===n&&r>=r)&&(n=r)}return n}function a(t){return t}n.d(e,{Nb1:()=>so,LLu:()=>b,F5q:()=>m,$0Z:()=>xo,Dts:()=>ko,WQY:()=>Co,qpX:()=>Eo,u93:()=>So,tFB:()=>Lo,YY7:()=>Do,OvA:()=>Mo,dCK:()=>Fo,zgE:()=>Zo,fGX:()=>jo,$m7:()=>zo,c_6:()=>lo,fxm:()=>Wo,FdL:()=>Jo,ak_:()=>tc,SxZ:()=>ic,eA_:()=>ac,jsv:()=>oc,iJ:()=>sc,JHv:()=>gi,jvg:()=>po,Fp7:()=>i,VV$:()=>r,ve8:()=>yo,BYU:()=>cr,PKp:()=>gr,Xf:()=>Ns,Ys:()=>Ds,td_:()=>Os,YPS:()=>Vn,rr1:()=>Dr,i$Z:()=>ha,WQD:()=>Br,Z_i:()=>Ar,F0B:()=>Qr,NGh:()=>Fr});var s=1,o=2,c=3,l=4,h=1e-6;function u(t){return"translate("+t+",0)"}function d(t){return"translate(0,"+t+")"}function p(t){return e=>+t(e)}function f(t,e){return e=Math.max(0,t.bandwidth()-2*e)/2,t.round()&&(e=Math.round(e)),n=>+t(n)+e}function g(){return!this.__axis}function y(t,e){var n=[],i=null,r=null,y=6,m=6,b=3,_="undefined"!=typeof window&&window.devicePixelRatio>1?0:.5,x=t===s||t===l?-1:1,v=t===l||t===o?"x":"y",k=t===s||t===c?u:d;function w(u){var d=null==i?e.ticks?e.ticks.apply(e,n):e.domain():i,w=null==r?e.tickFormat?e.tickFormat.apply(e,n):a:r,C=Math.max(y,0)+b,T=e.range(),E=+T[0]+_,S=+T[T.length-1]+_,A=(e.bandwidth?f:p)(e.copy(),_),L=u.selection?u.selection():u,B=L.selectAll(".domain").data([null]),N=L.selectAll(".tick").data(d,e).order(),D=N.exit(),O=N.enter().append("g").attr("class","tick"),M=N.select("line"),I=N.select("text");B=B.merge(B.enter().insert("path",".tick").attr("class","domain").attr("stroke","currentColor")),N=N.merge(O),M=M.merge(O.append("line").attr("stroke","currentColor").attr(v+"2",x*y)),I=I.merge(O.append("text").attr("fill","currentColor").attr(v,x*C).attr("dy",t===s?"0em":t===c?"0.71em":"0.32em")),u!==L&&(B=B.transition(u),N=N.transition(u),M=M.transition(u),I=I.transition(u),D=D.transition(u).attr("opacity",h).attr("transform",(function(t){return isFinite(t=A(t))?k(t+_):this.getAttribute("transform")})),O.attr("opacity",h).attr("transform",(function(t){var e=this.parentNode.__axis;return k((e&&isFinite(e=e(t))?e:A(t))+_)}))),D.remove(),B.attr("d",t===l||t===o?m?"M"+x*m+","+E+"H"+_+"V"+S+"H"+x*m:"M"+_+","+E+"V"+S:m?"M"+E+","+x*m+"V"+_+"H"+S+"V"+x*m:"M"+E+","+_+"H"+S),N.attr("opacity",1).attr("transform",(function(t){return k(A(t)+_)})),M.attr(v+"2",x*y),I.attr(v,x*C).text(w),L.filter(g).attr("fill","none").attr("font-size",10).attr("font-family","sans-serif").attr("text-anchor",t===o?"start":t===l?"end":"middle"),L.each((function(){this.__axis=A}))}return w.scale=function(t){return arguments.length?(e=t,w):e},w.ticks=function(){return n=Array.from(arguments),w},w.tickArguments=function(t){return arguments.length?(n=null==t?[]:Array.from(t),w):n.slice()},w.tickValues=function(t){return arguments.length?(i=null==t?null:Array.from(t),w):i&&i.slice()},w.tickFormat=function(t){return arguments.length?(r=t,w):r},w.tickSize=function(t){return arguments.length?(y=m=+t,w):y},w.tickSizeInner=function(t){return arguments.length?(y=+t,w):y},w.tickSizeOuter=function(t){return arguments.length?(m=+t,w):m},w.tickPadding=function(t){return arguments.length?(b=+t,w):b},w.offset=function(t){return arguments.length?(_=+t,w):_},w}function m(t){return y(s,t)}function b(t){return y(c,t)}function _(){}function x(t){return null==t?_:function(){return this.querySelector(t)}}function v(t){return null==t?[]:Array.isArray(t)?t:Array.from(t)}function k(){return[]}function w(t){return null==t?k:function(){return this.querySelectorAll(t)}}function C(t){return function(){return this.matches(t)}}function T(t){return function(e){return e.matches(t)}}var E=Array.prototype.find;function S(){return this.firstElementChild}var A=Array.prototype.filter;function L(){return Array.from(this.children)}function B(t){return new Array(t.length)}function N(t,e){this.ownerDocument=t.ownerDocument,this.namespaceURI=t.namespaceURI,this._next=null,this._parent=t,this.__data__=e}function D(t,e,n,i,r,a){for(var s,o=0,c=e.length,l=a.length;o<l;++o)(s=e[o])?(s.__data__=a[o],i[o]=s):n[o]=new N(t,a[o]);for(;o<c;++o)(s=e[o])&&(r[o]=s)}function O(t,e,n,i,r,a,s){var o,c,l,h=new Map,u=e.length,d=a.length,p=new Array(u);for(o=0;o<u;++o)(c=e[o])&&(p[o]=l=s.call(c,c.__data__,o,e)+"",h.has(l)?r[o]=c:h.set(l,c));for(o=0;o<d;++o)l=s.call(t,a[o],o,a)+"",(c=h.get(l))?(i[o]=c,c.__data__=a[o],h.delete(l)):n[o]=new N(t,a[o]);for(o=0;o<u;++o)(c=e[o])&&h.get(p[o])===c&&(r[o]=c)}function M(t){return t.__data__}function I(t){return"object"==typeof t&&"length"in t?t:Array.from(t)}function F(t,e){return t<e?-1:t>e?1:t>=e?0:NaN}N.prototype={constructor:N,appendChild:function(t){return this._parent.insertBefore(t,this._next)},insertBefore:function(t,e){return this._parent.insertBefore(t,e)},querySelector:function(t){return this._parent.querySelector(t)},querySelectorAll:function(t){return this._parent.querySelectorAll(t)}};var $="http://www.w3.org/1999/xhtml";const R={svg:"http://www.w3.org/2000/svg",xhtml:$,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};function Z(t){var e=t+="",n=e.indexOf(":");return n>=0&&"xmlns"!==(e=t.slice(0,n))&&(t=t.slice(n+1)),R.hasOwnProperty(e)?{space:R[e],local:t}:t}function P(t){return function(){this.removeAttribute(t)}}function j(t){return function(){this.removeAttributeNS(t.space,t.local)}}function Y(t,e){return function(){this.setAttribute(t,e)}}function z(t,e){return function(){this.setAttributeNS(t.space,t.local,e)}}function U(t,e){return function(){var n=e.apply(this,arguments);null==n?this.removeAttribute(t):this.setAttribute(t,n)}}function W(t,e){return function(){var n=e.apply(this,arguments);null==n?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,n)}}function q(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}function H(t){return function(){this.style.removeProperty(t)}}function V(t,e,n){return function(){this.style.setProperty(t,e,n)}}function G(t,e,n){return function(){var i=e.apply(this,arguments);null==i?this.style.removeProperty(t):this.style.setProperty(t,i,n)}}function X(t,e){return t.style.getPropertyValue(e)||q(t).getComputedStyle(t,null).getPropertyValue(e)}function Q(t){return function(){delete this[t]}}function K(t,e){return function(){this[t]=e}}function J(t,e){return function(){var n=e.apply(this,arguments);null==n?delete this[t]:this[t]=n}}function tt(t){return t.trim().split(/^|\s+/)}function et(t){return t.classList||new nt(t)}function nt(t){this._node=t,this._names=tt(t.getAttribute("class")||"")}function it(t,e){for(var n=et(t),i=-1,r=e.length;++i<r;)n.add(e[i])}function rt(t,e){for(var n=et(t),i=-1,r=e.length;++i<r;)n.remove(e[i])}function at(t){return function(){it(this,t)}}function st(t){return function(){rt(this,t)}}function ot(t,e){return function(){(e.apply(this,arguments)?it:rt)(this,t)}}function ct(){this.textContent=""}function lt(t){return function(){this.textContent=t}}function ht(t){return function(){var e=t.apply(this,arguments);this.textContent=null==e?"":e}}function ut(){this.innerHTML=""}function dt(t){return function(){this.innerHTML=t}}function pt(t){return function(){var e=t.apply(this,arguments);this.innerHTML=null==e?"":e}}function ft(){this.nextSibling&&this.parentNode.appendChild(this)}function gt(){this.previousSibling&&this.parentNode.insertBefore(this,this.parentNode.firstChild)}function yt(t){return function(){var e=this.ownerDocument,n=this.namespaceURI;return n===$&&e.documentElement.namespaceURI===$?e.createElement(t):e.createElementNS(n,t)}}function mt(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}function bt(t){var e=Z(t);return(e.local?mt:yt)(e)}function _t(){return null}function xt(){var t=this.parentNode;t&&t.removeChild(this)}function vt(){var t=this.cloneNode(!1),e=this.parentNode;return e?e.insertBefore(t,this.nextSibling):t}function kt(){var t=this.cloneNode(!0),e=this.parentNode;return e?e.insertBefore(t,this.nextSibling):t}function wt(t){return function(){var e=this.__on;if(e){for(var n,i=0,r=-1,a=e.length;i<a;++i)n=e[i],t.type&&n.type!==t.type||n.name!==t.name?e[++r]=n:this.removeEventListener(n.type,n.listener,n.options);++r?e.length=r:delete this.__on}}}function Ct(t,e,n){return function(){var i,r=this.__on,a=function(t){return function(e){t.call(this,e,this.__data__)}}(e);if(r)for(var s=0,o=r.length;s<o;++s)if((i=r[s]).type===t.type&&i.name===t.name)return this.removeEventListener(i.type,i.listener,i.options),this.addEventListener(i.type,i.listener=a,i.options=n),void(i.value=e);this.addEventListener(t.type,a,n),i={type:t.type,name:t.name,value:e,listener:a,options:n},r?r.push(i):this.__on=[i]}}function Tt(t,e,n){var i=q(t),r=i.CustomEvent;"function"==typeof r?r=new r(e,n):(r=i.document.createEvent("Event"),n?(r.initEvent(e,n.bubbles,n.cancelable),r.detail=n.detail):r.initEvent(e,!1,!1)),t.dispatchEvent(r)}function Et(t,e){return function(){return Tt(this,t,e)}}function St(t,e){return function(){return Tt(this,t,e.apply(this,arguments))}}nt.prototype={add:function(t){this._names.indexOf(t)<0&&(this._names.push(t),this._node.setAttribute("class",this._names.join(" ")))},remove:function(t){var e=this._names.indexOf(t);e>=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};var At=[null];function Lt(t,e){this._groups=t,this._parents=e}function Bt(){return new Lt([[document.documentElement]],At)}Lt.prototype=Bt.prototype={constructor:Lt,select:function(t){"function"!=typeof t&&(t=x(t));for(var e=this._groups,n=e.length,i=new Array(n),r=0;r<n;++r)for(var a,s,o=e[r],c=o.length,l=i[r]=new Array(c),h=0;h<c;++h)(a=o[h])&&(s=t.call(a,a.__data__,h,o))&&("__data__"in a&&(s.__data__=a.__data__),l[h]=s);return new Lt(i,this._parents)},selectAll:function(t){t="function"==typeof t?function(t){return function(){return v(t.apply(this,arguments))}}(t):w(t);for(var e=this._groups,n=e.length,i=[],r=[],a=0;a<n;++a)for(var s,o=e[a],c=o.length,l=0;l<c;++l)(s=o[l])&&(i.push(t.call(s,s.__data__,l,o)),r.push(s));return new Lt(i,r)},selectChild:function(t){return this.select(null==t?S:function(t){return function(){return E.call(this.children,t)}}("function"==typeof t?t:T(t)))},selectChildren:function(t){return this.selectAll(null==t?L:function(t){return function(){return A.call(this.children,t)}}("function"==typeof t?t:T(t)))},filter:function(t){"function"!=typeof t&&(t=C(t));for(var e=this._groups,n=e.length,i=new Array(n),r=0;r<n;++r)for(var a,s=e[r],o=s.length,c=i[r]=[],l=0;l<o;++l)(a=s[l])&&t.call(a,a.__data__,l,s)&&c.push(a);return new Lt(i,this._parents)},data:function(t,e){if(!arguments.length)return Array.from(this,M);var n,i=e?O:D,r=this._parents,a=this._groups;"function"!=typeof t&&(n=t,t=function(){return n});for(var s=a.length,o=new Array(s),c=new Array(s),l=new Array(s),h=0;h<s;++h){var u=r[h],d=a[h],p=d.length,f=I(t.call(u,u&&u.__data__,h,r)),g=f.length,y=c[h]=new Array(g),m=o[h]=new Array(g);i(u,d,y,m,l[h]=new Array(p),f,e);for(var b,_,x=0,v=0;x<g;++x)if(b=y[x]){for(x>=v&&(v=x+1);!(_=m[v])&&++v<g;);b._next=_||null}}return(o=new Lt(o,r))._enter=c,o._exit=l,o},enter:function(){return new Lt(this._enter||this._groups.map(B),this._parents)},exit:function(){return new Lt(this._exit||this._groups.map(B),this._parents)},join:function(t,e,n){var i=this.enter(),r=this,a=this.exit();return"function"==typeof t?(i=t(i))&&(i=i.selection()):i=i.append(t+""),null!=e&&(r=e(r))&&(r=r.selection()),null==n?a.remove():n(a),i&&r?i.merge(r).order():r},merge:function(t){for(var e=t.selection?t.selection():t,n=this._groups,i=e._groups,r=n.length,a=i.length,s=Math.min(r,a),o=new Array(r),c=0;c<s;++c)for(var l,h=n[c],u=i[c],d=h.length,p=o[c]=new Array(d),f=0;f<d;++f)(l=h[f]||u[f])&&(p[f]=l);for(;c<r;++c)o[c]=n[c];return new Lt(o,this._parents)},selection:function(){return this},order:function(){for(var t=this._groups,e=-1,n=t.length;++e<n;)for(var i,r=t[e],a=r.length-1,s=r[a];--a>=0;)(i=r[a])&&(s&&4^i.compareDocumentPosition(s)&&s.parentNode.insertBefore(i,s),s=i);return this},sort:function(t){function e(e,n){return e&&n?t(e.__data__,n.__data__):!e-!n}t||(t=F);for(var n=this._groups,i=n.length,r=new Array(i),a=0;a<i;++a){for(var s,o=n[a],c=o.length,l=r[a]=new Array(c),h=0;h<c;++h)(s=o[h])&&(l[h]=s);l.sort(e)}return new Lt(r,this._parents).order()},call:function(){var t=arguments[0];return arguments[0]=this,t.apply(null,arguments),this},nodes:function(){return Array.from(this)},node:function(){for(var t=this._groups,e=0,n=t.length;e<n;++e)for(var i=t[e],r=0,a=i.length;r<a;++r){var s=i[r];if(s)return s}return null},size:function(){let t=0;for(const e of this)++t;return t},empty:function(){return!this.node()},each:function(t){for(var e=this._groups,n=0,i=e.length;n<i;++n)for(var r,a=e[n],s=0,o=a.length;s<o;++s)(r=a[s])&&t.call(r,r.__data__,s,a);return this},attr:function(t,e){var n=Z(t);if(arguments.length<2){var i=this.node();return n.local?i.getAttributeNS(n.space,n.local):i.getAttribute(n)}return this.each((null==e?n.local?j:P:"function"==typeof e?n.local?W:U:n.local?z:Y)(n,e))},style:function(t,e,n){return arguments.length>1?this.each((null==e?H:"function"==typeof e?G:V)(t,e,null==n?"":n)):X(this.node(),t)},property:function(t,e){return arguments.length>1?this.each((null==e?Q:"function"==typeof e?J:K)(t,e)):this.node()[t]},classed:function(t,e){var n=tt(t+"");if(arguments.length<2){for(var i=et(this.node()),r=-1,a=n.length;++r<a;)if(!i.contains(n[r]))return!1;return!0}return this.each(("function"==typeof e?ot:e?at:st)(n,e))},text:function(t){return arguments.length?this.each(null==t?ct:("function"==typeof t?ht:lt)(t)):this.node().textContent},html:function(t){return arguments.length?this.each(null==t?ut:("function"==typeof t?pt:dt)(t)):this.node().innerHTML},raise:function(){return this.each(ft)},lower:function(){return this.each(gt)},append:function(t){var e="function"==typeof t?t:bt(t);return this.select((function(){return this.appendChild(e.apply(this,arguments))}))},insert:function(t,e){var n="function"==typeof t?t:bt(t),i=null==e?_t:"function"==typeof e?e:x(e);return this.select((function(){return this.insertBefore(n.apply(this,arguments),i.apply(this,arguments)||null)}))},remove:function(){return this.each(xt)},clone:function(t){return this.select(t?kt:vt)},datum:function(t){return arguments.length?this.property("__data__",t):this.node().__data__},on:function(t,e,n){var i,r,a=function(t){return t.trim().split(/^|\s+/).map((function(t){var e="",n=t.indexOf(".");return n>=0&&(e=t.slice(n+1),t=t.slice(0,n)),{type:t,name:e}}))}(t+""),s=a.length;if(!(arguments.length<2)){for(o=e?Ct:wt,i=0;i<s;++i)this.each(o(a[i],e,n));return this}var o=this.node().__on;if(o)for(var c,l=0,h=o.length;l<h;++l)for(i=0,c=o[l];i<s;++i)if((r=a[i]).type===c.type&&r.name===c.name)return c.value},dispatch:function(t,e){return this.each(("function"==typeof e?St:Et)(t,e))},[Symbol.iterator]:function*(){for(var t=this._groups,e=0,n=t.length;e<n;++e)for(var i,r=t[e],a=0,s=r.length;a<s;++a)(i=r[a])&&(yield i)}};const Nt=Bt;var Dt={value:()=>{}};function Ot(){for(var t,e=0,n=arguments.length,i={};e<n;++e){if(!(t=arguments[e]+"")||t in i||/[\s.]/.test(t))throw new Error("illegal type: "+t);i[t]=[]}return new Mt(i)}function Mt(t){this._=t}function It(t,e){for(var n,i=0,r=t.length;i<r;++i)if((n=t[i]).name===e)return n.value}function Ft(t,e,n){for(var i=0,r=t.length;i<r;++i)if(t[i].name===e){t[i]=Dt,t=t.slice(0,i).concat(t.slice(i+1));break}return null!=n&&t.push({name:e,value:n}),t}Mt.prototype=Ot.prototype={constructor:Mt,on:function(t,e){var n,i,r=this._,a=(i=r,(t+"").trim().split(/^|\s+/).map((function(t){var e="",n=t.indexOf(".");if(n>=0&&(e=t.slice(n+1),t=t.slice(0,n)),t&&!i.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:e}}))),s=-1,o=a.length;if(!(arguments.length<2)){if(null!=e&&"function"!=typeof e)throw new Error("invalid callback: "+e);for(;++s<o;)if(n=(t=a[s]).type)r[n]=Ft(r[n],t.name,e);else if(null==e)for(n in r)r[n]=Ft(r[n],t.name,null);return this}for(;++s<o;)if((n=(t=a[s]).type)&&(n=It(r[n],t.name)))return n},copy:function(){var t={},e=this._;for(var n in e)t[n]=e[n].slice();return new Mt(t)},call:function(t,e){if((n=arguments.length-2)>0)for(var n,i,r=new Array(n),a=0;a<n;++a)r[a]=arguments[a+2];if(!this._.hasOwnProperty(t))throw new Error("unknown type: "+t);for(a=0,n=(i=this._[t]).length;a<n;++a)i[a].value.apply(e,r)},apply:function(t,e,n){if(!this._.hasOwnProperty(t))throw new Error("unknown type: "+t);for(var i=this._[t],r=0,a=i.length;r<a;++r)i[r].value.apply(e,n)}};const $t=Ot;var Rt,Zt,Pt=0,jt=0,Yt=0,zt=1e3,Ut=0,Wt=0,qt=0,Ht="object"==typeof performance&&performance.now?performance:Date,Vt="object"==typeof window&&window.requestAnimationFrame?window.requestAnimationFrame.bind(window):function(t){setTimeout(t,17)};function Gt(){return Wt||(Vt(Xt),Wt=Ht.now()+qt)}function Xt(){Wt=0}function Qt(){this._call=this._time=this._next=null}function Kt(t,e,n){var i=new Qt;return i.restart(t,e,n),i}function Jt(){Wt=(Ut=Ht.now())+qt,Pt=jt=0;try{!function(){Gt(),++Pt;for(var t,e=Rt;e;)(t=Wt-e._time)>=0&&e._call.call(void 0,t),e=e._next;--Pt}()}finally{Pt=0,function(){var t,e,n=Rt,i=1/0;for(;n;)n._call?(i>n._time&&(i=n._time),t=n,n=n._next):(e=n._next,n._next=null,n=t?t._next=e:Rt=e);Zt=t,ee(i)}(),Wt=0}}function te(){var t=Ht.now(),e=t-Ut;e>zt&&(qt-=e,Ut=t)}function ee(t){Pt||(jt&&(jt=clearTimeout(jt)),t-Wt>24?(t<1/0&&(jt=setTimeout(Jt,t-Ht.now()-qt)),Yt&&(Yt=clearInterval(Yt))):(Yt||(Ut=Ht.now(),Yt=setInterval(te,zt)),Pt=1,Vt(Jt)))}function ne(t,e,n){var i=new Qt;return e=null==e?0:+e,i.restart((n=>{i.stop(),t(n+e)}),e,n),i}Qt.prototype=Kt.prototype={constructor:Qt,restart:function(t,e,n){if("function"!=typeof t)throw new TypeError("callback is not a function");n=(null==n?Gt():+n)+(null==e?0:+e),this._next||Zt===this||(Zt?Zt._next=this:Rt=this,Zt=this),this._call=t,this._time=n,ee()},stop:function(){this._call&&(this._call=null,this._time=1/0,ee())}};var ie=$t("start","end","cancel","interrupt"),re=[],ae=0,se=1,oe=2,ce=3,le=4,he=5,ue=6;function de(t,e,n,i,r,a){var s=t.__transition;if(s){if(n in s)return}else t.__transition={};!function(t,e,n){var i,r=t.__transition;function a(t){n.state=se,n.timer.restart(s,n.delay,n.time),n.delay<=t&&s(t-n.delay)}function s(a){var l,h,u,d;if(n.state!==se)return c();for(l in r)if((d=r[l]).name===n.name){if(d.state===ce)return ne(s);d.state===le?(d.state=ue,d.timer.stop(),d.on.call("interrupt",t,t.__data__,d.index,d.group),delete r[l]):+l<e&&(d.state=ue,d.timer.stop(),d.on.call("cancel",t,t.__data__,d.index,d.group),delete r[l])}if(ne((function(){n.state===ce&&(n.state=le,n.timer.restart(o,n.delay,n.time),o(a))})),n.state=oe,n.on.call("start",t,t.__data__,n.index,n.group),n.state===oe){for(n.state=ce,i=new Array(u=n.tween.length),l=0,h=-1;l<u;++l)(d=n.tween[l].value.call(t,t.__data__,n.index,n.group))&&(i[++h]=d);i.length=h+1}}function o(e){for(var r=e<n.duration?n.ease.call(null,e/n.duration):(n.timer.restart(c),n.state=he,1),a=-1,s=i.length;++a<s;)i[a].call(t,r);n.state===he&&(n.on.call("end",t,t.__data__,n.index,n.group),c())}function c(){for(var i in n.state=ue,n.timer.stop(),delete r[e],r)return;delete t.__transition}r[e]=n,n.timer=Kt(a,0,n.time)}(t,n,{name:e,index:i,group:r,on:ie,tween:re,time:a.time,delay:a.delay,duration:a.duration,ease:a.ease,timer:null,state:ae})}function pe(t,e){var n=ge(t,e);if(n.state>ae)throw new Error("too late; already scheduled");return n}function fe(t,e){var n=ge(t,e);if(n.state>ce)throw new Error("too late; already running");return n}function ge(t,e){var n=t.__transition;if(!n||!(n=n[e]))throw new Error("transition not found");return n}function ye(t,e){return t=+t,e=+e,function(n){return t*(1-n)+e*n}}var me,be=180/Math.PI,_e={translateX:0,translateY:0,rotate:0,skewX:0,scaleX:1,scaleY:1};function xe(t,e,n,i,r,a){var s,o,c;return(s=Math.sqrt(t*t+e*e))&&(t/=s,e/=s),(c=t*n+e*i)&&(n-=t*c,i-=e*c),(o=Math.sqrt(n*n+i*i))&&(n/=o,i/=o,c/=o),t*i<e*n&&(t=-t,e=-e,c=-c,s=-s),{translateX:r,translateY:a,rotate:Math.atan2(e,t)*be,skewX:Math.atan(c)*be,scaleX:s,scaleY:o}}function ve(t,e,n,i){function r(t){return t.length?t.pop()+" ":""}return function(a,s){var o=[],c=[];return a=t(a),s=t(s),function(t,i,r,a,s,o){if(t!==r||i!==a){var c=s.push("translate(",null,e,null,n);o.push({i:c-4,x:ye(t,r)},{i:c-2,x:ye(i,a)})}else(r||a)&&s.push("translate("+r+e+a+n)}(a.translateX,a.translateY,s.translateX,s.translateY,o,c),function(t,e,n,a){t!==e?(t-e>180?e+=360:e-t>180&&(t+=360),a.push({i:n.push(r(n)+"rotate(",null,i)-2,x:ye(t,e)})):e&&n.push(r(n)+"rotate("+e+i)}(a.rotate,s.rotate,o,c),function(t,e,n,a){t!==e?a.push({i:n.push(r(n)+"skewX(",null,i)-2,x:ye(t,e)}):e&&n.push(r(n)+"skewX("+e+i)}(a.skewX,s.skewX,o,c),function(t,e,n,i,a,s){if(t!==n||e!==i){var o=a.push(r(a)+"scale(",null,",",null,")");s.push({i:o-4,x:ye(t,n)},{i:o-2,x:ye(e,i)})}else 1===n&&1===i||a.push(r(a)+"scale("+n+","+i+")")}(a.scaleX,a.scaleY,s.scaleX,s.scaleY,o,c),a=s=null,function(t){for(var e,n=-1,i=c.length;++n<i;)o[(e=c[n]).i]=e.x(t);return o.join("")}}}var ke=ve((function(t){const e=new("function"==typeof DOMMatrix?DOMMatrix:WebKitCSSMatrix)(t+"");return e.isIdentity?_e:xe(e.a,e.b,e.c,e.d,e.e,e.f)}),"px, ","px)","deg)"),we=ve((function(t){return null==t?_e:(me||(me=document.createElementNS("http://www.w3.org/2000/svg","g")),me.setAttribute("transform",t),(t=me.transform.baseVal.consolidate())?xe((t=t.matrix).a,t.b,t.c,t.d,t.e,t.f):_e)}),", ",")",")");function Ce(t,e){var n,i;return function(){var r=fe(this,t),a=r.tween;if(a!==n)for(var s=0,o=(i=n=a).length;s<o;++s)if(i[s].name===e){(i=i.slice()).splice(s,1);break}r.tween=i}}function Te(t,e,n){var i,r;if("function"!=typeof n)throw new Error;return function(){var a=fe(this,t),s=a.tween;if(s!==i){r=(i=s).slice();for(var o={name:e,value:n},c=0,l=r.length;c<l;++c)if(r[c].name===e){r[c]=o;break}c===l&&r.push(o)}a.tween=r}}function Ee(t,e,n){var i=t._id;return t.each((function(){var t=fe(this,i);(t.value||(t.value={}))[e]=n.apply(this,arguments)})),function(t){return ge(t,i).value[e]}}function Se(t,e,n){t.prototype=e.prototype=n,n.constructor=t}function Ae(t,e){var n=Object.create(t.prototype);for(var i in e)n[i]=e[i];return n}function Le(){}var Be=.7,Ne=1/Be,De="\\s*([+-]?\\d+)\\s*",Oe="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*",Me="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*",Ie=/^#([0-9a-f]{3,8})$/,Fe=new RegExp(`^rgb\\(${De},${De},${De}\\)$`),$e=new RegExp(`^rgb\\(${Me},${Me},${Me}\\)$`),Re=new RegExp(`^rgba\\(${De},${De},${De},${Oe}\\)$`),Ze=new RegExp(`^rgba\\(${Me},${Me},${Me},${Oe}\\)$`),Pe=new RegExp(`^hsl\\(${Oe},${Me},${Me}\\)$`),je=new RegExp(`^hsla\\(${Oe},${Me},${Me},${Oe}\\)$`),Ye={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};function ze(){return this.rgb().formatHex()}function Ue(){return this.rgb().formatRgb()}function We(t){var e,n;return t=(t+"").trim().toLowerCase(),(e=Ie.exec(t))?(n=e[1].length,e=parseInt(e[1],16),6===n?qe(e):3===n?new Xe(e>>8&15|e>>4&240,e>>4&15|240&e,(15&e)<<4|15&e,1):8===n?He(e>>24&255,e>>16&255,e>>8&255,(255&e)/255):4===n?He(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|240&e,((15&e)<<4|15&e)/255):null):(e=Fe.exec(t))?new Xe(e[1],e[2],e[3],1):(e=$e.exec(t))?new Xe(255*e[1]/100,255*e[2]/100,255*e[3]/100,1):(e=Re.exec(t))?He(e[1],e[2],e[3],e[4]):(e=Ze.exec(t))?He(255*e[1]/100,255*e[2]/100,255*e[3]/100,e[4]):(e=Pe.exec(t))?nn(e[1],e[2]/100,e[3]/100,1):(e=je.exec(t))?nn(e[1],e[2]/100,e[3]/100,e[4]):Ye.hasOwnProperty(t)?qe(Ye[t]):"transparent"===t?new Xe(NaN,NaN,NaN,0):null}function qe(t){return new Xe(t>>16&255,t>>8&255,255&t,1)}function He(t,e,n,i){return i<=0&&(t=e=n=NaN),new Xe(t,e,n,i)}function Ve(t){return t instanceof Le||(t=We(t)),t?new Xe((t=t.rgb()).r,t.g,t.b,t.opacity):new Xe}function Ge(t,e,n,i){return 1===arguments.length?Ve(t):new Xe(t,e,n,null==i?1:i)}function Xe(t,e,n,i){this.r=+t,this.g=+e,this.b=+n,this.opacity=+i}function Qe(){return`#${en(this.r)}${en(this.g)}${en(this.b)}`}function Ke(){const t=Je(this.opacity);return`${1===t?"rgb(":"rgba("}${tn(this.r)}, ${tn(this.g)}, ${tn(this.b)}${1===t?")":`, ${t})`}`}function Je(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function tn(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function en(t){return((t=tn(t))<16?"0":"")+t.toString(16)}function nn(t,e,n,i){return i<=0?t=e=n=NaN:n<=0||n>=1?t=e=NaN:e<=0&&(t=NaN),new an(t,e,n,i)}function rn(t){if(t instanceof an)return new an(t.h,t.s,t.l,t.opacity);if(t instanceof Le||(t=We(t)),!t)return new an;if(t instanceof an)return t;var e=(t=t.rgb()).r/255,n=t.g/255,i=t.b/255,r=Math.min(e,n,i),a=Math.max(e,n,i),s=NaN,o=a-r,c=(a+r)/2;return o?(s=e===a?(n-i)/o+6*(n<i):n===a?(i-e)/o+2:(e-n)/o+4,o/=c<.5?a+r:2-a-r,s*=60):o=c>0&&c<1?0:s,new an(s,o,c,t.opacity)}function an(t,e,n,i){this.h=+t,this.s=+e,this.l=+n,this.opacity=+i}function sn(t){return(t=(t||0)%360)<0?t+360:t}function on(t){return Math.max(0,Math.min(1,t||0))}function cn(t,e,n){return 255*(t<60?e+(n-e)*t/60:t<180?n:t<240?e+(n-e)*(240-t)/60:e)}function ln(t,e,n,i,r){var a=t*t,s=a*t;return((1-3*t+3*a-s)*e+(4-6*a+3*s)*n+(1+3*t+3*a-3*s)*i+s*r)/6}Se(Le,We,{copy(t){return Object.assign(new this.constructor,this,t)},displayable(){return this.rgb().displayable()},hex:ze,formatHex:ze,formatHex8:function(){return this.rgb().formatHex8()},formatHsl:function(){return rn(this).formatHsl()},formatRgb:Ue,toString:Ue}),Se(Xe,Ge,Ae(Le,{brighter(t){return t=null==t?Ne:Math.pow(Ne,t),new Xe(this.r*t,this.g*t,this.b*t,this.opacity)},darker(t){return t=null==t?Be:Math.pow(Be,t),new Xe(this.r*t,this.g*t,this.b*t,this.opacity)},rgb(){return this},clamp(){return new Xe(tn(this.r),tn(this.g),tn(this.b),Je(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:Qe,formatHex:Qe,formatHex8:function(){return`#${en(this.r)}${en(this.g)}${en(this.b)}${en(255*(isNaN(this.opacity)?1:this.opacity))}`},formatRgb:Ke,toString:Ke})),Se(an,(function(t,e,n,i){return 1===arguments.length?rn(t):new an(t,e,n,null==i?1:i)}),Ae(Le,{brighter(t){return t=null==t?Ne:Math.pow(Ne,t),new an(this.h,this.s,this.l*t,this.opacity)},darker(t){return t=null==t?Be:Math.pow(Be,t),new an(this.h,this.s,this.l*t,this.opacity)},rgb(){var t=this.h%360+360*(this.h<0),e=isNaN(t)||isNaN(this.s)?0:this.s,n=this.l,i=n+(n<.5?n:1-n)*e,r=2*n-i;return new Xe(cn(t>=240?t-240:t+120,r,i),cn(t,r,i),cn(t<120?t+240:t-120,r,i),this.opacity)},clamp(){return new an(sn(this.h),on(this.s),on(this.l),Je(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const t=Je(this.opacity);return`${1===t?"hsl(":"hsla("}${sn(this.h)}, ${100*on(this.s)}%, ${100*on(this.l)}%${1===t?")":`, ${t})`}`}}));const hn=t=>()=>t;function un(t,e){return function(n){return t+n*e}}function dn(t){return 1==(t=+t)?pn:function(e,n){return n-e?function(t,e,n){return t=Math.pow(t,n),e=Math.pow(e,n)-t,n=1/n,function(i){return Math.pow(t+i*e,n)}}(e,n,t):hn(isNaN(e)?n:e)}}function pn(t,e){var n=e-t;return n?un(t,n):hn(isNaN(t)?e:t)}const fn=function t(e){var n=dn(e);function i(t,e){var i=n((t=Ge(t)).r,(e=Ge(e)).r),r=n(t.g,e.g),a=n(t.b,e.b),s=pn(t.opacity,e.opacity);return function(e){return t.r=i(e),t.g=r(e),t.b=a(e),t.opacity=s(e),t+""}}return i.gamma=t,i}(1);function gn(t){return function(e){var n,i,r=e.length,a=new Array(r),s=new Array(r),o=new Array(r);for(n=0;n<r;++n)i=Ge(e[n]),a[n]=i.r||0,s[n]=i.g||0,o[n]=i.b||0;return a=t(a),s=t(s),o=t(o),i.opacity=1,function(t){return i.r=a(t),i.g=s(t),i.b=o(t),i+""}}}gn((function(t){var e=t.length-1;return function(n){var i=n<=0?n=0:n>=1?(n=1,e-1):Math.floor(n*e),r=t[i],a=t[i+1],s=i>0?t[i-1]:2*r-a,o=i<e-1?t[i+2]:2*a-r;return ln((n-i/e)*e,s,r,a,o)}})),gn((function(t){var e=t.length;return function(n){var i=Math.floor(((n%=1)<0?++n:n)*e),r=t[(i+e-1)%e],a=t[i%e],s=t[(i+1)%e],o=t[(i+2)%e];return ln((n-i/e)*e,r,a,s,o)}}));var yn=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,mn=new RegExp(yn.source,"g");function bn(t,e){var n,i,r,a=yn.lastIndex=mn.lastIndex=0,s=-1,o=[],c=[];for(t+="",e+="";(n=yn.exec(t))&&(i=mn.exec(e));)(r=i.index)>a&&(r=e.slice(a,r),o[s]?o[s]+=r:o[++s]=r),(n=n[0])===(i=i[0])?o[s]?o[s]+=i:o[++s]=i:(o[++s]=null,c.push({i:s,x:ye(n,i)})),a=mn.lastIndex;return a<e.length&&(r=e.slice(a),o[s]?o[s]+=r:o[++s]=r),o.length<2?c[0]?function(t){return function(e){return t(e)+""}}(c[0].x):function(t){return function(){return t}}(e):(e=c.length,function(t){for(var n,i=0;i<e;++i)o[(n=c[i]).i]=n.x(t);return o.join("")})}function _n(t,e){var n;return("number"==typeof e?ye:e instanceof We?fn:(n=We(e))?(e=n,fn):bn)(t,e)}function xn(t){return function(){this.removeAttribute(t)}}function vn(t){return function(){this.removeAttributeNS(t.space,t.local)}}function kn(t,e,n){var i,r,a=n+"";return function(){var s=this.getAttribute(t);return s===a?null:s===i?r:r=e(i=s,n)}}function wn(t,e,n){var i,r,a=n+"";return function(){var s=this.getAttributeNS(t.space,t.local);return s===a?null:s===i?r:r=e(i=s,n)}}function Cn(t,e,n){var i,r,a;return function(){var s,o,c=n(this);if(null!=c)return(s=this.getAttribute(t))===(o=c+"")?null:s===i&&o===r?a:(r=o,a=e(i=s,c));this.removeAttribute(t)}}function Tn(t,e,n){var i,r,a;return function(){var s,o,c=n(this);if(null!=c)return(s=this.getAttributeNS(t.space,t.local))===(o=c+"")?null:s===i&&o===r?a:(r=o,a=e(i=s,c));this.removeAttributeNS(t.space,t.local)}}function En(t,e){var n,i;function r(){var r=e.apply(this,arguments);return r!==i&&(n=(i=r)&&function(t,e){return function(n){this.setAttributeNS(t.space,t.local,e.call(this,n))}}(t,r)),n}return r._value=e,r}function Sn(t,e){var n,i;function r(){var r=e.apply(this,arguments);return r!==i&&(n=(i=r)&&function(t,e){return function(n){this.setAttribute(t,e.call(this,n))}}(t,r)),n}return r._value=e,r}function An(t,e){return function(){pe(this,t).delay=+e.apply(this,arguments)}}function Ln(t,e){return e=+e,function(){pe(this,t).delay=e}}function Bn(t,e){return function(){fe(this,t).duration=+e.apply(this,arguments)}}function Nn(t,e){return e=+e,function(){fe(this,t).duration=e}}var Dn=Nt.prototype.constructor;function On(t){return function(){this.style.removeProperty(t)}}var Mn=0;function In(t,e,n,i){this._groups=t,this._parents=e,this._name=n,this._id=i}function Fn(){return++Mn}var $n=Nt.prototype;In.prototype=function(t){return Nt().transition(t)}.prototype={constructor:In,select:function(t){var e=this._name,n=this._id;"function"!=typeof t&&(t=x(t));for(var i=this._groups,r=i.length,a=new Array(r),s=0;s<r;++s)for(var o,c,l=i[s],h=l.length,u=a[s]=new Array(h),d=0;d<h;++d)(o=l[d])&&(c=t.call(o,o.__data__,d,l))&&("__data__"in o&&(c.__data__=o.__data__),u[d]=c,de(u[d],e,n,d,u,ge(o,n)));return new In(a,this._parents,e,n)},selectAll:function(t){var e=this._name,n=this._id;"function"!=typeof t&&(t=w(t));for(var i=this._groups,r=i.length,a=[],s=[],o=0;o<r;++o)for(var c,l=i[o],h=l.length,u=0;u<h;++u)if(c=l[u]){for(var d,p=t.call(c,c.__data__,u,l),f=ge(c,n),g=0,y=p.length;g<y;++g)(d=p[g])&&de(d,e,n,g,p,f);a.push(p),s.push(c)}return new In(a,s,e,n)},selectChild:$n.selectChild,selectChildren:$n.selectChildren,filter:function(t){"function"!=typeof t&&(t=C(t));for(var e=this._groups,n=e.length,i=new Array(n),r=0;r<n;++r)for(var a,s=e[r],o=s.length,c=i[r]=[],l=0;l<o;++l)(a=s[l])&&t.call(a,a.__data__,l,s)&&c.push(a);return new In(i,this._parents,this._name,this._id)},merge:function(t){if(t._id!==this._id)throw new Error;for(var e=this._groups,n=t._groups,i=e.length,r=n.length,a=Math.min(i,r),s=new Array(i),o=0;o<a;++o)for(var c,l=e[o],h=n[o],u=l.length,d=s[o]=new Array(u),p=0;p<u;++p)(c=l[p]||h[p])&&(d[p]=c);for(;o<i;++o)s[o]=e[o];return new In(s,this._parents,this._name,this._id)},selection:function(){return new Dn(this._groups,this._parents)},transition:function(){for(var t=this._name,e=this._id,n=Fn(),i=this._groups,r=i.length,a=0;a<r;++a)for(var s,o=i[a],c=o.length,l=0;l<c;++l)if(s=o[l]){var h=ge(s,e);de(s,t,n,l,o,{time:h.time+h.delay+h.duration,delay:0,duration:h.duration,ease:h.ease})}return new In(i,this._parents,t,n)},call:$n.call,nodes:$n.nodes,node:$n.node,size:$n.size,empty:$n.empty,each:$n.each,on:function(t,e){var n=this._id;return arguments.length<2?ge(this.node(),n).on.on(t):this.each(function(t,e,n){var i,r,a=function(t){return(t+"").trim().split(/^|\s+/).every((function(t){var e=t.indexOf(".");return e>=0&&(t=t.slice(0,e)),!t||"start"===t}))}(e)?pe:fe;return function(){var s=a(this,t),o=s.on;o!==i&&(r=(i=o).copy()).on(e,n),s.on=r}}(n,t,e))},attr:function(t,e){var n=Z(t),i="transform"===n?we:_n;return this.attrTween(t,"function"==typeof e?(n.local?Tn:Cn)(n,i,Ee(this,"attr."+t,e)):null==e?(n.local?vn:xn)(n):(n.local?wn:kn)(n,i,e))},attrTween:function(t,e){var n="attr."+t;if(arguments.length<2)return(n=this.tween(n))&&n._value;if(null==e)return this.tween(n,null);if("function"!=typeof e)throw new Error;var i=Z(t);return this.tween(n,(i.local?En:Sn)(i,e))},style:function(t,e,n){var i="transform"==(t+="")?ke:_n;return null==e?this.styleTween(t,function(t,e){var n,i,r;return function(){var a=X(this,t),s=(this.style.removeProperty(t),X(this,t));return a===s?null:a===n&&s===i?r:r=e(n=a,i=s)}}(t,i)).on("end.style."+t,On(t)):"function"==typeof e?this.styleTween(t,function(t,e,n){var i,r,a;return function(){var s=X(this,t),o=n(this),c=o+"";return null==o&&(this.style.removeProperty(t),c=o=X(this,t)),s===c?null:s===i&&c===r?a:(r=c,a=e(i=s,o))}}(t,i,Ee(this,"style."+t,e))).each(function(t,e){var n,i,r,a,s="style."+e,o="end."+s;return function(){var c=fe(this,t),l=c.on,h=null==c.value[s]?a||(a=On(e)):void 0;l===n&&r===h||(i=(n=l).copy()).on(o,r=h),c.on=i}}(this._id,t)):this.styleTween(t,function(t,e,n){var i,r,a=n+"";return function(){var s=X(this,t);return s===a?null:s===i?r:r=e(i=s,n)}}(t,i,e),n).on("end.style."+t,null)},styleTween:function(t,e,n){var i="style."+(t+="");if(arguments.length<2)return(i=this.tween(i))&&i._value;if(null==e)return this.tween(i,null);if("function"!=typeof e)throw new Error;return this.tween(i,function(t,e,n){var i,r;function a(){var a=e.apply(this,arguments);return a!==r&&(i=(r=a)&&function(t,e,n){return function(i){this.style.setProperty(t,e.call(this,i),n)}}(t,a,n)),i}return a._value=e,a}(t,e,null==n?"":n))},text:function(t){return this.tween("text","function"==typeof t?function(t){return function(){var e=t(this);this.textContent=null==e?"":e}}(Ee(this,"text",t)):function(t){return function(){this.textContent=t}}(null==t?"":t+""))},textTween:function(t){var e="text";if(arguments.length<1)return(e=this.tween(e))&&e._value;if(null==t)return this.tween(e,null);if("function"!=typeof t)throw new Error;return this.tween(e,function(t){var e,n;function i(){var i=t.apply(this,arguments);return i!==n&&(e=(n=i)&&function(t){return function(e){this.textContent=t.call(this,e)}}(i)),e}return i._value=t,i}(t))},remove:function(){return this.on("end.remove",function(t){return function(){var e=this.parentNode;for(var n in this.__transition)if(+n!==t)return;e&&e.removeChild(this)}}(this._id))},tween:function(t,e){var n=this._id;if(t+="",arguments.length<2){for(var i,r=ge(this.node(),n).tween,a=0,s=r.length;a<s;++a)if((i=r[a]).name===t)return i.value;return null}return this.each((null==e?Ce:Te)(n,t,e))},delay:function(t){var e=this._id;return arguments.length?this.each(("function"==typeof t?An:Ln)(e,t)):ge(this.node(),e).delay},duration:function(t){var e=this._id;return arguments.length?this.each(("function"==typeof t?Bn:Nn)(e,t)):ge(this.node(),e).duration},ease:function(t){var e=this._id;return arguments.length?this.each(function(t,e){if("function"!=typeof e)throw new Error;return function(){fe(this,t).ease=e}}(e,t)):ge(this.node(),e).ease},easeVarying:function(t){if("function"!=typeof t)throw new Error;return this.each(function(t,e){return function(){var n=e.apply(this,arguments);if("function"!=typeof n)throw new Error;fe(this,t).ease=n}}(this._id,t))},end:function(){var t,e,n=this,i=n._id,r=n.size();return new Promise((function(a,s){var o={value:s},c={value:function(){0==--r&&a()}};n.each((function(){var n=fe(this,i),r=n.on;r!==t&&((e=(t=r).copy())._.cancel.push(o),e._.interrupt.push(o),e._.end.push(c)),n.on=e})),0===r&&a()}))},[Symbol.iterator]:$n[Symbol.iterator]};var Rn={time:null,delay:0,duration:250,ease:function(t){return((t*=2)<=1?t*t*t:(t-=2)*t*t+2)/2}};function Zn(t,e){for(var n;!(n=t.__transition)||!(n=n[e]);)if(!(t=t.parentNode))throw new Error(`transition ${e} not found`);return n}Nt.prototype.interrupt=function(t){return this.each((function(){!function(t,e){var n,i,r,a=t.__transition,s=!0;if(a){for(r in e=null==e?null:e+"",a)(n=a[r]).name===e?(i=n.state>oe&&n.state<he,n.state=ue,n.timer.stop(),n.on.call(i?"interrupt":"cancel",t,t.__data__,n.index,n.group),delete a[r]):s=!1;s&&delete t.__transition}}(this,t)}))},Nt.prototype.transition=function(t){var e,n;t instanceof In?(e=t._id,t=t._name):(e=Fn(),(n=Rn).time=Gt(),t=null==t?null:t+"");for(var i=this._groups,r=i.length,a=0;a<r;++a)for(var s,o=i[a],c=o.length,l=0;l<c;++l)(s=o[l])&&de(s,t,e,l,o,n||Zn(s,e));return new In(i,this._parents,t,e)};const{abs:Pn,max:jn,min:Yn}=Math;function zn(t){return[+t[0],+t[1]]}function Un(t){return[zn(t[0]),zn(t[1])]}["w","e"].map(Wn),["n","s"].map(Wn),["n","w","e","s","nw","ne","sw","se"].map(Wn);function Wn(t){return{type:t}}function qn(t){if(!t.ok)throw new Error(t.status+" "+t.statusText);return t.text()}function Hn(t){return(e,n)=>function(t,e){return fetch(t,e).then(qn)}(e,n).then((e=>(new DOMParser).parseFromString(e,t)))}Hn("application/xml");Hn("text/html");var Vn=Hn("image/svg+xml");const Gn=Math.PI/180,Xn=180/Math.PI,Qn=.96422,Kn=1,Jn=.82521,ti=4/29,ei=6/29,ni=3*ei*ei,ii=ei*ei*ei;function ri(t){if(t instanceof ai)return new ai(t.l,t.a,t.b,t.opacity);if(t instanceof di)return pi(t);t instanceof Xe||(t=Ve(t));var e,n,i=li(t.r),r=li(t.g),a=li(t.b),s=si((.2225045*i+.7168786*r+.0606169*a)/Kn);return i===r&&r===a?e=n=s:(e=si((.4360747*i+.3850649*r+.1430804*a)/Qn),n=si((.0139322*i+.0971045*r+.7141733*a)/Jn)),new ai(116*s-16,500*(e-s),200*(s-n),t.opacity)}function ai(t,e,n,i){this.l=+t,this.a=+e,this.b=+n,this.opacity=+i}function si(t){return t>ii?Math.pow(t,1/3):t/ni+ti}function oi(t){return t>ei?t*t*t:ni*(t-ti)}function ci(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function li(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function hi(t){if(t instanceof di)return new di(t.h,t.c,t.l,t.opacity);if(t instanceof ai||(t=ri(t)),0===t.a&&0===t.b)return new di(NaN,0<t.l&&t.l<100?0:NaN,t.l,t.opacity);var e=Math.atan2(t.b,t.a)*Xn;return new di(e<0?e+360:e,Math.sqrt(t.a*t.a+t.b*t.b),t.l,t.opacity)}function ui(t,e,n,i){return 1===arguments.length?hi(t):new di(t,e,n,null==i?1:i)}function di(t,e,n,i){this.h=+t,this.c=+e,this.l=+n,this.opacity=+i}function pi(t){if(isNaN(t.h))return new ai(t.l,0,0,t.opacity);var e=t.h*Gn;return new ai(t.l,Math.cos(e)*t.c,Math.sin(e)*t.c,t.opacity)}function fi(t){return function(e,n){var i=t((e=ui(e)).h,(n=ui(n)).h),r=pn(e.c,n.c),a=pn(e.l,n.l),s=pn(e.opacity,n.opacity);return function(t){return e.h=i(t),e.c=r(t),e.l=a(t),e.opacity=s(t),e+""}}}Se(ai,(function(t,e,n,i){return 1===arguments.length?ri(t):new ai(t,e,n,null==i?1:i)}),Ae(Le,{brighter(t){return new ai(this.l+18*(null==t?1:t),this.a,this.b,this.opacity)},darker(t){return new ai(this.l-18*(null==t?1:t),this.a,this.b,this.opacity)},rgb(){var t=(this.l+16)/116,e=isNaN(this.a)?t:t+this.a/500,n=isNaN(this.b)?t:t-this.b/200;return new Xe(ci(3.1338561*(e=Qn*oi(e))-1.6168667*(t=Kn*oi(t))-.4906146*(n=Jn*oi(n))),ci(-.9787684*e+1.9161415*t+.033454*n),ci(.0719453*e-.2289914*t+1.4052427*n),this.opacity)}})),Se(di,ui,Ae(Le,{brighter(t){return new di(this.h,this.c,this.l+18*(null==t?1:t),this.opacity)},darker(t){return new di(this.h,this.c,this.l-18*(null==t?1:t),this.opacity)},rgb(){return pi(this).rgb()}}));const gi=fi((function(t,e){var n=e-t;return n?un(t,n>180||n<-180?n-360*Math.round(n/360):n):hn(isNaN(t)?e:t)}));fi(pn);const yi=Math.sqrt(50),mi=Math.sqrt(10),bi=Math.sqrt(2);function _i(t,e,n){const i=(e-t)/Math.max(0,n),r=Math.floor(Math.log10(i)),a=i/Math.pow(10,r),s=a>=yi?10:a>=mi?5:a>=bi?2:1;let o,c,l;return r<0?(l=Math.pow(10,-r)/s,o=Math.round(t*l),c=Math.round(e*l),o/l<t&&++o,c/l>e&&--c,l=-l):(l=Math.pow(10,r)*s,o=Math.round(t/l),c=Math.round(e/l),o*l<t&&++o,c*l>e&&--c),c<o&&.5<=n&&n<2?_i(t,e,2*n):[o,c,l]}function xi(t,e,n){return _i(t=+t,e=+e,n=+n)[2]}function vi(t,e,n){n=+n;const i=(e=+e)<(t=+t),r=i?xi(e,t,n):xi(t,e,n);return(i?-1:1)*(r<0?1/-r:r)}function ki(t,e){return null==t||null==e?NaN:t<e?-1:t>e?1:t>=e?0:NaN}function wi(t,e){return null==t||null==e?NaN:e<t?-1:e>t?1:e>=t?0:NaN}function Ci(t){let e,n,i;function r(t,i,r=0,a=t.length){if(r<a){if(0!==e(i,i))return a;do{const e=r+a>>>1;n(t[e],i)<0?r=e+1:a=e}while(r<a)}return r}return 2!==t.length?(e=ki,n=(e,n)=>ki(t(e),n),i=(e,n)=>t(e)-n):(e=t===ki||t===wi?t:Ti,n=t,i=t),{left:r,center:function(t,e,n=0,a=t.length){const s=r(t,e,n,a-1);return s>n&&i(t[s-1],e)>-i(t[s],e)?s-1:s},right:function(t,i,r=0,a=t.length){if(r<a){if(0!==e(i,i))return a;do{const e=r+a>>>1;n(t[e],i)<=0?r=e+1:a=e}while(r<a)}return r}}}function Ti(){return 0}const Ei=Ci(ki),Si=Ei.right,Ai=(Ei.left,Ci((function(t){return null===t?NaN:+t})).center,Si);function Li(t,e){var n,i=e?e.length:0,r=t?Math.min(i,t.length):0,a=new Array(r),s=new Array(i);for(n=0;n<r;++n)a[n]=Oi(t[n],e[n]);for(;n<i;++n)s[n]=e[n];return function(t){for(n=0;n<r;++n)s[n]=a[n](t);return s}}function Bi(t,e){var n=new Date;return t=+t,e=+e,function(i){return n.setTime(t*(1-i)+e*i),n}}function Ni(t,e){var n,i={},r={};for(n in null!==t&&"object"==typeof t||(t={}),null!==e&&"object"==typeof e||(e={}),e)n in t?i[n]=Oi(t[n],e[n]):r[n]=e[n];return function(t){for(n in i)r[n]=i[n](t);return r}}function Di(t,e){e||(e=[]);var n,i=t?Math.min(e.length,t.length):0,r=e.slice();return function(a){for(n=0;n<i;++n)r[n]=t[n]*(1-a)+e[n]*a;return r}}function Oi(t,e){var n,i,r=typeof e;return null==e||"boolean"===r?hn(e):("number"===r?ye:"string"===r?(n=We(e))?(e=n,fn):bn:e instanceof We?fn:e instanceof Date?Bi:(i=e,!ArrayBuffer.isView(i)||i instanceof DataView?Array.isArray(e)?Li:"function"!=typeof e.valueOf&&"function"!=typeof e.toString||isNaN(e)?Ni:ye:Di))(t,e)}function Mi(t,e){return t=+t,e=+e,function(n){return Math.round(t*(1-n)+e*n)}}function Ii(t){return+t}var Fi=[0,1];function $i(t){return t}function Ri(t,e){return(e-=t=+t)?function(n){return(n-t)/e}:(n=isNaN(e)?NaN:.5,function(){return n});var n}function Zi(t,e,n){var i=t[0],r=t[1],a=e[0],s=e[1];return r<i?(i=Ri(r,i),a=n(s,a)):(i=Ri(i,r),a=n(a,s)),function(t){return a(i(t))}}function Pi(t,e,n){var i=Math.min(t.length,e.length)-1,r=new Array(i),a=new Array(i),s=-1;for(t[i]<t[0]&&(t=t.slice().reverse(),e=e.slice().reverse());++s<i;)r[s]=Ri(t[s],t[s+1]),a[s]=n(e[s],e[s+1]);return function(e){var n=Ai(t,e,1,i)-1;return a[n](r[n](e))}}function ji(t,e){return e.domain(t.domain()).range(t.range()).interpolate(t.interpolate()).clamp(t.clamp()).unknown(t.unknown())}function Yi(){var t,e,n,i,r,a,s=Fi,o=Fi,c=Oi,l=$i;function h(){var t,e,n,c=Math.min(s.length,o.length);return l!==$i&&(t=s[0],e=s[c-1],t>e&&(n=t,t=e,e=n),l=function(n){return Math.max(t,Math.min(e,n))}),i=c>2?Pi:Zi,r=a=null,u}function u(e){return null==e||isNaN(e=+e)?n:(r||(r=i(s.map(t),o,c)))(t(l(e)))}return u.invert=function(n){return l(e((a||(a=i(o,s.map(t),ye)))(n)))},u.domain=function(t){return arguments.length?(s=Array.from(t,Ii),h()):s.slice()},u.range=function(t){return arguments.length?(o=Array.from(t),h()):o.slice()},u.rangeRound=function(t){return o=Array.from(t),c=Mi,h()},u.clamp=function(t){return arguments.length?(l=!!t||$i,h()):l!==$i},u.interpolate=function(t){return arguments.length?(c=t,h()):c},u.unknown=function(t){return arguments.length?(n=t,u):n},function(n,i){return t=n,e=i,h()}}function zi(){return Yi()($i,$i)}function Ui(t,e){switch(arguments.length){case 0:break;case 1:this.range(t);break;default:this.range(e).domain(t)}return this}var Wi,qi=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function Hi(t){if(!(e=qi.exec(t)))throw new Error("invalid format: "+t);var e;return new Vi({fill:e[1],align:e[2],sign:e[3],symbol:e[4],zero:e[5],width:e[6],comma:e[7],precision:e[8]&&e[8].slice(1),trim:e[9],type:e[10]})}function Vi(t){this.fill=void 0===t.fill?" ":t.fill+"",this.align=void 0===t.align?">":t.align+"",this.sign=void 0===t.sign?"-":t.sign+"",this.symbol=void 0===t.symbol?"":t.symbol+"",this.zero=!!t.zero,this.width=void 0===t.width?void 0:+t.width,this.comma=!!t.comma,this.precision=void 0===t.precision?void 0:+t.precision,this.trim=!!t.trim,this.type=void 0===t.type?"":t.type+""}function Gi(t,e){if((n=(t=e?t.toExponential(e-1):t.toExponential()).indexOf("e"))<0)return null;var n,i=t.slice(0,n);return[i.length>1?i[0]+i.slice(2):i,+t.slice(n+1)]}function Xi(t){return(t=Gi(Math.abs(t)))?t[1]:NaN}function Qi(t,e){var n=Gi(t,e);if(!n)return t+"";var i=n[0],r=n[1];return r<0?"0."+new Array(-r).join("0")+i:i.length>r+1?i.slice(0,r+1)+"."+i.slice(r+1):i+new Array(r-i.length+2).join("0")}Hi.prototype=Vi.prototype,Vi.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(void 0===this.width?"":Math.max(1,0|this.width))+(this.comma?",":"")+(void 0===this.precision?"":"."+Math.max(0,0|this.precision))+(this.trim?"~":"")+this.type};const Ki={"%":(t,e)=>(100*t).toFixed(e),b:t=>Math.round(t).toString(2),c:t=>t+"",d:function(t){return Math.abs(t=Math.round(t))>=1e21?t.toLocaleString("en").replace(/,/g,""):t.toString(10)},e:(t,e)=>t.toExponential(e),f:(t,e)=>t.toFixed(e),g:(t,e)=>t.toPrecision(e),o:t=>Math.round(t).toString(8),p:(t,e)=>Qi(100*t,e),r:Qi,s:function(t,e){var n=Gi(t,e);if(!n)return t+"";var i=n[0],r=n[1],a=r-(Wi=3*Math.max(-8,Math.min(8,Math.floor(r/3))))+1,s=i.length;return a===s?i:a>s?i+new Array(a-s+1).join("0"):a>0?i.slice(0,a)+"."+i.slice(a):"0."+new Array(1-a).join("0")+Gi(t,Math.max(0,e+a-1))[0]},X:t=>Math.round(t).toString(16).toUpperCase(),x:t=>Math.round(t).toString(16)};function Ji(t){return t}var tr,er,nr,ir=Array.prototype.map,rr=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"];function ar(t){var e,n,i=void 0===t.grouping||void 0===t.thousands?Ji:(e=ir.call(t.grouping,Number),n=t.thousands+"",function(t,i){for(var r=t.length,a=[],s=0,o=e[0],c=0;r>0&&o>0&&(c+o+1>i&&(o=Math.max(1,i-c)),a.push(t.substring(r-=o,r+o)),!((c+=o+1)>i));)o=e[s=(s+1)%e.length];return a.reverse().join(n)}),r=void 0===t.currency?"":t.currency[0]+"",a=void 0===t.currency?"":t.currency[1]+"",s=void 0===t.decimal?".":t.decimal+"",o=void 0===t.numerals?Ji:function(t){return function(e){return e.replace(/[0-9]/g,(function(e){return t[+e]}))}}(ir.call(t.numerals,String)),c=void 0===t.percent?"%":t.percent+"",l=void 0===t.minus?"\u2212":t.minus+"",h=void 0===t.nan?"NaN":t.nan+"";function u(t){var e=(t=Hi(t)).fill,n=t.align,u=t.sign,d=t.symbol,p=t.zero,f=t.width,g=t.comma,y=t.precision,m=t.trim,b=t.type;"n"===b?(g=!0,b="g"):Ki[b]||(void 0===y&&(y=12),m=!0,b="g"),(p||"0"===e&&"="===n)&&(p=!0,e="0",n="=");var _="$"===d?r:"#"===d&&/[boxX]/.test(b)?"0"+b.toLowerCase():"",x="$"===d?a:/[%p]/.test(b)?c:"",v=Ki[b],k=/[defgprs%]/.test(b);function w(t){var r,a,c,d=_,w=x;if("c"===b)w=v(t)+w,t="";else{var C=(t=+t)<0||1/t<0;if(t=isNaN(t)?h:v(Math.abs(t),y),m&&(t=function(t){t:for(var e,n=t.length,i=1,r=-1;i<n;++i)switch(t[i]){case".":r=e=i;break;case"0":0===r&&(r=i),e=i;break;default:if(!+t[i])break t;r>0&&(r=0)}return r>0?t.slice(0,r)+t.slice(e+1):t}(t)),C&&0==+t&&"+"!==u&&(C=!1),d=(C?"("===u?u:l:"-"===u||"("===u?"":u)+d,w=("s"===b?rr[8+Wi/3]:"")+w+(C&&"("===u?")":""),k)for(r=-1,a=t.length;++r<a;)if(48>(c=t.charCodeAt(r))||c>57){w=(46===c?s+t.slice(r+1):t.slice(r))+w,t=t.slice(0,r);break}}g&&!p&&(t=i(t,1/0));var T=d.length+t.length+w.length,E=T<f?new Array(f-T+1).join(e):"";switch(g&&p&&(t=i(E+t,E.length?f-w.length:1/0),E=""),n){case"<":t=d+t+w+E;break;case"=":t=d+E+t+w;break;case"^":t=E.slice(0,T=E.length>>1)+d+t+w+E.slice(T);break;default:t=E+d+t+w}return o(t)}return y=void 0===y?6:/[gprs]/.test(b)?Math.max(1,Math.min(21,y)):Math.max(0,Math.min(20,y)),w.toString=function(){return t+""},w}return{format:u,formatPrefix:function(t,e){var n=u(((t=Hi(t)).type="f",t)),i=3*Math.max(-8,Math.min(8,Math.floor(Xi(e)/3))),r=Math.pow(10,-i),a=rr[8+i/3];return function(t){return n(r*t)+a}}}}function sr(t,e,n,i){var r,a=vi(t,e,n);switch((i=Hi(null==i?",f":i)).type){case"s":var s=Math.max(Math.abs(t),Math.abs(e));return null!=i.precision||isNaN(r=function(t,e){return Math.max(0,3*Math.max(-8,Math.min(8,Math.floor(Xi(e)/3)))-Xi(Math.abs(t)))}(a,s))||(i.precision=r),nr(i,s);case"":case"e":case"g":case"p":case"r":null!=i.precision||isNaN(r=function(t,e){return t=Math.abs(t),e=Math.abs(e)-t,Math.max(0,Xi(e)-Xi(t))+1}(a,Math.max(Math.abs(t),Math.abs(e))))||(i.precision=r-("e"===i.type));break;case"f":case"%":null!=i.precision||isNaN(r=function(t){return Math.max(0,-Xi(Math.abs(t)))}(a))||(i.precision=r-2*("%"===i.type))}return er(i)}function or(t){var e=t.domain;return t.ticks=function(t){var n=e();return function(t,e,n){if(!((n=+n)>0))return[];if((t=+t)==(e=+e))return[t];const i=e<t,[r,a,s]=i?_i(e,t,n):_i(t,e,n);if(!(a>=r))return[];const o=a-r+1,c=new Array(o);if(i)if(s<0)for(let l=0;l<o;++l)c[l]=(a-l)/-s;else for(let l=0;l<o;++l)c[l]=(a-l)*s;else if(s<0)for(let l=0;l<o;++l)c[l]=(r+l)/-s;else for(let l=0;l<o;++l)c[l]=(r+l)*s;return c}(n[0],n[n.length-1],null==t?10:t)},t.tickFormat=function(t,n){var i=e();return sr(i[0],i[i.length-1],null==t?10:t,n)},t.nice=function(n){null==n&&(n=10);var i,r,a=e(),s=0,o=a.length-1,c=a[s],l=a[o],h=10;for(l<c&&(r=c,c=l,l=r,r=s,s=o,o=r);h-- >0;){if((r=xi(c,l,n))===i)return a[s]=c,a[o]=l,e(a);if(r>0)c=Math.floor(c/r)*r,l=Math.ceil(l/r)*r;else{if(!(r<0))break;c=Math.ceil(c*r)/r,l=Math.floor(l*r)/r}i=r}return t},t}function cr(){var t=zi();return t.copy=function(){return ji(t,cr())},Ui.apply(t,arguments),or(t)}tr=ar({thousands:",",grouping:[3],currency:["$",""]}),er=tr.format,nr=tr.formatPrefix;class lr extends Map{constructor(t,e=pr){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:e}}),null!=t)for(const[n,i]of t)this.set(n,i)}get(t){return super.get(hr(this,t))}has(t){return super.has(hr(this,t))}set(t,e){return super.set(ur(this,t),e)}delete(t){return super.delete(dr(this,t))}}function hr({_intern:t,_key:e},n){const i=e(n);return t.has(i)?t.get(i):n}function ur({_intern:t,_key:e},n){const i=e(n);return t.has(i)?t.get(i):(t.set(i,n),n)}function dr({_intern:t,_key:e},n){const i=e(n);return t.has(i)&&(n=t.get(i),t.delete(i)),n}function pr(t){return null!==t&&"object"==typeof t?t.valueOf():t}const fr=Symbol("implicit");function gr(){var t=new lr,e=[],n=[],i=fr;function r(r){let a=t.get(r);if(void 0===a){if(i!==fr)return i;t.set(r,a=e.push(r)-1)}return n[a%n.length]}return r.domain=function(n){if(!arguments.length)return e.slice();e=[],t=new lr;for(const i of n)t.has(i)||t.set(i,e.push(i)-1);return r},r.range=function(t){return arguments.length?(n=Array.from(t),r):n.slice()},r.unknown=function(t){return arguments.length?(i=t,r):i},r.copy=function(){return gr(e,n).unknown(i)},Ui.apply(r,arguments),r}const yr=1e3,mr=6e4,br=36e5,_r=864e5,xr=6048e5,vr=2592e6,kr=31536e6,wr=new Date,Cr=new Date;function Tr(t,e,n,i){function r(e){return t(e=0===arguments.length?new Date:new Date(+e)),e}return r.floor=e=>(t(e=new Date(+e)),e),r.ceil=n=>(t(n=new Date(n-1)),e(n,1),t(n),n),r.round=t=>{const e=r(t),n=r.ceil(t);return t-e<n-t?e:n},r.offset=(t,n)=>(e(t=new Date(+t),null==n?1:Math.floor(n)),t),r.range=(n,i,a)=>{const s=[];if(n=r.ceil(n),a=null==a?1:Math.floor(a),!(n<i&&a>0))return s;let o;do{s.push(o=new Date(+n)),e(n,a),t(n)}while(o<n&&n<i);return s},r.filter=n=>Tr((e=>{if(e>=e)for(;t(e),!n(e);)e.setTime(e-1)}),((t,i)=>{if(t>=t)if(i<0)for(;++i<=0;)for(;e(t,-1),!n(t););else for(;--i>=0;)for(;e(t,1),!n(t););})),n&&(r.count=(e,i)=>(wr.setTime(+e),Cr.setTime(+i),t(wr),t(Cr),Math.floor(n(wr,Cr))),r.every=t=>(t=Math.floor(t),isFinite(t)&&t>0?t>1?r.filter(i?e=>i(e)%t==0:e=>r.count(0,e)%t==0):r:null)),r}const Er=Tr((()=>{}),((t,e)=>{t.setTime(+t+e)}),((t,e)=>e-t));Er.every=t=>(t=Math.floor(t),isFinite(t)&&t>0?t>1?Tr((e=>{e.setTime(Math.floor(e/t)*t)}),((e,n)=>{e.setTime(+e+n*t)}),((e,n)=>(n-e)/t)):Er:null);Er.range;const Sr=Tr((t=>{t.setTime(t-t.getMilliseconds())}),((t,e)=>{t.setTime(+t+e*yr)}),((t,e)=>(e-t)/yr),(t=>t.getUTCSeconds())),Ar=(Sr.range,Tr((t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*yr)}),((t,e)=>{t.setTime(+t+e*mr)}),((t,e)=>(e-t)/mr),(t=>t.getMinutes()))),Lr=(Ar.range,Tr((t=>{t.setUTCSeconds(0,0)}),((t,e)=>{t.setTime(+t+e*mr)}),((t,e)=>(e-t)/mr),(t=>t.getUTCMinutes()))),Br=(Lr.range,Tr((t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*yr-t.getMinutes()*mr)}),((t,e)=>{t.setTime(+t+e*br)}),((t,e)=>(e-t)/br),(t=>t.getHours()))),Nr=(Br.range,Tr((t=>{t.setUTCMinutes(0,0,0)}),((t,e)=>{t.setTime(+t+e*br)}),((t,e)=>(e-t)/br),(t=>t.getUTCHours()))),Dr=(Nr.range,Tr((t=>t.setHours(0,0,0,0)),((t,e)=>t.setDate(t.getDate()+e)),((t,e)=>(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*mr)/_r),(t=>t.getDate()-1))),Or=(Dr.range,Tr((t=>{t.setUTCHours(0,0,0,0)}),((t,e)=>{t.setUTCDate(t.getUTCDate()+e)}),((t,e)=>(e-t)/_r),(t=>t.getUTCDate()-1))),Mr=(Or.range,Tr((t=>{t.setUTCHours(0,0,0,0)}),((t,e)=>{t.setUTCDate(t.getUTCDate()+e)}),((t,e)=>(e-t)/_r),(t=>Math.floor(t/_r))));Mr.range;function Ir(t){return Tr((e=>{e.setDate(e.getDate()-(e.getDay()+7-t)%7),e.setHours(0,0,0,0)}),((t,e)=>{t.setDate(t.getDate()+7*e)}),((t,e)=>(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*mr)/xr))}const Fr=Ir(0),$r=Ir(1),Rr=Ir(2),Zr=Ir(3),Pr=Ir(4),jr=Ir(5),Yr=Ir(6);Fr.range,$r.range,Rr.range,Zr.range,Pr.range,jr.range,Yr.range;function zr(t){return Tr((e=>{e.setUTCDate(e.getUTCDate()-(e.getUTCDay()+7-t)%7),e.setUTCHours(0,0,0,0)}),((t,e)=>{t.setUTCDate(t.getUTCDate()+7*e)}),((t,e)=>(e-t)/xr))}const Ur=zr(0),Wr=zr(1),qr=zr(2),Hr=zr(3),Vr=zr(4),Gr=zr(5),Xr=zr(6),Qr=(Ur.range,Wr.range,qr.range,Hr.range,Vr.range,Gr.range,Xr.range,Tr((t=>{t.setDate(1),t.setHours(0,0,0,0)}),((t,e)=>{t.setMonth(t.getMonth()+e)}),((t,e)=>e.getMonth()-t.getMonth()+12*(e.getFullYear()-t.getFullYear())),(t=>t.getMonth()))),Kr=(Qr.range,Tr((t=>{t.setUTCDate(1),t.setUTCHours(0,0,0,0)}),((t,e)=>{t.setUTCMonth(t.getUTCMonth()+e)}),((t,e)=>e.getUTCMonth()-t.getUTCMonth()+12*(e.getUTCFullYear()-t.getUTCFullYear())),(t=>t.getUTCMonth()))),Jr=(Kr.range,Tr((t=>{t.setMonth(0,1),t.setHours(0,0,0,0)}),((t,e)=>{t.setFullYear(t.getFullYear()+e)}),((t,e)=>e.getFullYear()-t.getFullYear()),(t=>t.getFullYear())));Jr.every=t=>isFinite(t=Math.floor(t))&&t>0?Tr((e=>{e.setFullYear(Math.floor(e.getFullYear()/t)*t),e.setMonth(0,1),e.setHours(0,0,0,0)}),((e,n)=>{e.setFullYear(e.getFullYear()+n*t)})):null;Jr.range;const ta=Tr((t=>{t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)}),((t,e)=>{t.setUTCFullYear(t.getUTCFullYear()+e)}),((t,e)=>e.getUTCFullYear()-t.getUTCFullYear()),(t=>t.getUTCFullYear()));ta.every=t=>isFinite(t=Math.floor(t))&&t>0?Tr((e=>{e.setUTCFullYear(Math.floor(e.getUTCFullYear()/t)*t),e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)}),((e,n)=>{e.setUTCFullYear(e.getUTCFullYear()+n*t)})):null;ta.range;function ea(t,e,n,i,r,a){const s=[[Sr,1,yr],[Sr,5,5e3],[Sr,15,15e3],[Sr,30,3e4],[a,1,mr],[a,5,3e5],[a,15,9e5],[a,30,18e5],[r,1,br],[r,3,108e5],[r,6,216e5],[r,12,432e5],[i,1,_r],[i,2,1728e5],[n,1,xr],[e,1,vr],[e,3,7776e6],[t,1,kr]];function o(e,n,i){const r=Math.abs(n-e)/i,a=Ci((([,,t])=>t)).right(s,r);if(a===s.length)return t.every(vi(e/kr,n/kr,i));if(0===a)return Er.every(Math.max(vi(e,n,i),1));const[o,c]=s[r/s[a-1][2]<s[a][2]/r?a-1:a];return o.every(c)}return[function(t,e,n){const i=e<t;i&&([t,e]=[e,t]);const r=n&&"function"==typeof n.range?n:o(t,e,n),a=r?r.range(t,+e+1):[];return i?a.reverse():a},o]}const[na,ia]=ea(ta,Kr,Ur,Mr,Nr,Lr),[ra,aa]=ea(Jr,Qr,Fr,Dr,Br,Ar);function sa(t){if(0<=t.y&&t.y<100){var e=new Date(-1,t.m,t.d,t.H,t.M,t.S,t.L);return e.setFullYear(t.y),e}return new Date(t.y,t.m,t.d,t.H,t.M,t.S,t.L)}function oa(t){if(0<=t.y&&t.y<100){var e=new Date(Date.UTC(-1,t.m,t.d,t.H,t.M,t.S,t.L));return e.setUTCFullYear(t.y),e}return new Date(Date.UTC(t.y,t.m,t.d,t.H,t.M,t.S,t.L))}function ca(t,e,n){return{y:t,m:e,d:n,H:0,M:0,S:0,L:0}}var la,ha,ua={"-":"",_:" ",0:"0"},da=/^\s*\d+/,pa=/^%/,fa=/[\\^$*+?|[\]().{}]/g;function ga(t,e,n){var i=t<0?"-":"",r=(i?-t:t)+"",a=r.length;return i+(a<n?new Array(n-a+1).join(e)+r:r)}function ya(t){return t.replace(fa,"\\$&")}function ma(t){return new RegExp("^(?:"+t.map(ya).join("|")+")","i")}function ba(t){return new Map(t.map(((t,e)=>[t.toLowerCase(),e])))}function _a(t,e,n){var i=da.exec(e.slice(n,n+1));return i?(t.w=+i[0],n+i[0].length):-1}function xa(t,e,n){var i=da.exec(e.slice(n,n+1));return i?(t.u=+i[0],n+i[0].length):-1}function va(t,e,n){var i=da.exec(e.slice(n,n+2));return i?(t.U=+i[0],n+i[0].length):-1}function ka(t,e,n){var i=da.exec(e.slice(n,n+2));return i?(t.V=+i[0],n+i[0].length):-1}function wa(t,e,n){var i=da.exec(e.slice(n,n+2));return i?(t.W=+i[0],n+i[0].length):-1}function Ca(t,e,n){var i=da.exec(e.slice(n,n+4));return i?(t.y=+i[0],n+i[0].length):-1}function Ta(t,e,n){var i=da.exec(e.slice(n,n+2));return i?(t.y=+i[0]+(+i[0]>68?1900:2e3),n+i[0].length):-1}function Ea(t,e,n){var i=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(e.slice(n,n+6));return i?(t.Z=i[1]?0:-(i[2]+(i[3]||"00")),n+i[0].length):-1}function Sa(t,e,n){var i=da.exec(e.slice(n,n+1));return i?(t.q=3*i[0]-3,n+i[0].length):-1}function Aa(t,e,n){var i=da.exec(e.slice(n,n+2));return i?(t.m=i[0]-1,n+i[0].length):-1}function La(t,e,n){var i=da.exec(e.slice(n,n+2));return i?(t.d=+i[0],n+i[0].length):-1}function Ba(t,e,n){var i=da.exec(e.slice(n,n+3));return i?(t.m=0,t.d=+i[0],n+i[0].length):-1}function Na(t,e,n){var i=da.exec(e.slice(n,n+2));return i?(t.H=+i[0],n+i[0].length):-1}function Da(t,e,n){var i=da.exec(e.slice(n,n+2));return i?(t.M=+i[0],n+i[0].length):-1}function Oa(t,e,n){var i=da.exec(e.slice(n,n+2));return i?(t.S=+i[0],n+i[0].length):-1}function Ma(t,e,n){var i=da.exec(e.slice(n,n+3));return i?(t.L=+i[0],n+i[0].length):-1}function Ia(t,e,n){var i=da.exec(e.slice(n,n+6));return i?(t.L=Math.floor(i[0]/1e3),n+i[0].length):-1}function Fa(t,e,n){var i=pa.exec(e.slice(n,n+1));return i?n+i[0].length:-1}function $a(t,e,n){var i=da.exec(e.slice(n));return i?(t.Q=+i[0],n+i[0].length):-1}function Ra(t,e,n){var i=da.exec(e.slice(n));return i?(t.s=+i[0],n+i[0].length):-1}function Za(t,e){return ga(t.getDate(),e,2)}function Pa(t,e){return ga(t.getHours(),e,2)}function ja(t,e){return ga(t.getHours()%12||12,e,2)}function Ya(t,e){return ga(1+Dr.count(Jr(t),t),e,3)}function za(t,e){return ga(t.getMilliseconds(),e,3)}function Ua(t,e){return za(t,e)+"000"}function Wa(t,e){return ga(t.getMonth()+1,e,2)}function qa(t,e){return ga(t.getMinutes(),e,2)}function Ha(t,e){return ga(t.getSeconds(),e,2)}function Va(t){var e=t.getDay();return 0===e?7:e}function Ga(t,e){return ga(Fr.count(Jr(t)-1,t),e,2)}function Xa(t){var e=t.getDay();return e>=4||0===e?Pr(t):Pr.ceil(t)}function Qa(t,e){return t=Xa(t),ga(Pr.count(Jr(t),t)+(4===Jr(t).getDay()),e,2)}function Ka(t){return t.getDay()}function Ja(t,e){return ga($r.count(Jr(t)-1,t),e,2)}function ts(t,e){return ga(t.getFullYear()%100,e,2)}function es(t,e){return ga((t=Xa(t)).getFullYear()%100,e,2)}function ns(t,e){return ga(t.getFullYear()%1e4,e,4)}function is(t,e){var n=t.getDay();return ga((t=n>=4||0===n?Pr(t):Pr.ceil(t)).getFullYear()%1e4,e,4)}function rs(t){var e=t.getTimezoneOffset();return(e>0?"-":(e*=-1,"+"))+ga(e/60|0,"0",2)+ga(e%60,"0",2)}function as(t,e){return ga(t.getUTCDate(),e,2)}function ss(t,e){return ga(t.getUTCHours(),e,2)}function os(t,e){return ga(t.getUTCHours()%12||12,e,2)}function cs(t,e){return ga(1+Or.count(ta(t),t),e,3)}function ls(t,e){return ga(t.getUTCMilliseconds(),e,3)}function hs(t,e){return ls(t,e)+"000"}function us(t,e){return ga(t.getUTCMonth()+1,e,2)}function ds(t,e){return ga(t.getUTCMinutes(),e,2)}function ps(t,e){return ga(t.getUTCSeconds(),e,2)}function fs(t){var e=t.getUTCDay();return 0===e?7:e}function gs(t,e){return ga(Ur.count(ta(t)-1,t),e,2)}function ys(t){var e=t.getUTCDay();return e>=4||0===e?Vr(t):Vr.ceil(t)}function ms(t,e){return t=ys(t),ga(Vr.count(ta(t),t)+(4===ta(t).getUTCDay()),e,2)}function bs(t){return t.getUTCDay()}function _s(t,e){return ga(Wr.count(ta(t)-1,t),e,2)}function xs(t,e){return ga(t.getUTCFullYear()%100,e,2)}function vs(t,e){return ga((t=ys(t)).getUTCFullYear()%100,e,2)}function ks(t,e){return ga(t.getUTCFullYear()%1e4,e,4)}function ws(t,e){var n=t.getUTCDay();return ga((t=n>=4||0===n?Vr(t):Vr.ceil(t)).getUTCFullYear()%1e4,e,4)}function Cs(){return"+0000"}function Ts(){return"%"}function Es(t){return+t}function Ss(t){return Math.floor(+t/1e3)}function As(t){return new Date(t)}function Ls(t){return t instanceof Date?+t:+new Date(+t)}function Bs(t,e,n,i,r,a,s,o,c,l){var h=zi(),u=h.invert,d=h.domain,p=l(".%L"),f=l(":%S"),g=l("%I:%M"),y=l("%I %p"),m=l("%a %d"),b=l("%b %d"),_=l("%B"),x=l("%Y");function v(t){return(c(t)<t?p:o(t)<t?f:s(t)<t?g:a(t)<t?y:i(t)<t?r(t)<t?m:b:n(t)<t?_:x)(t)}return h.invert=function(t){return new Date(u(t))},h.domain=function(t){return arguments.length?d(Array.from(t,Ls)):d().map(As)},h.ticks=function(e){var n=d();return t(n[0],n[n.length-1],null==e?10:e)},h.tickFormat=function(t,e){return null==e?v:l(e)},h.nice=function(t){var n=d();return t&&"function"==typeof t.range||(t=e(n[0],n[n.length-1],null==t?10:t)),t?d(function(t,e){var n,i=0,r=(t=t.slice()).length-1,a=t[i],s=t[r];return s<a&&(n=i,i=r,r=n,n=a,a=s,s=n),t[i]=e.floor(a),t[r]=e.ceil(s),t}(n,t)):h},h.copy=function(){return ji(h,Bs(t,e,n,i,r,a,s,o,c,l))},h}function Ns(){return Ui.apply(Bs(ra,aa,Jr,Qr,Fr,Dr,Br,Ar,Sr,ha).domain([new Date(2e3,0,1),new Date(2e3,0,2)]),arguments)}function Ds(t){return"string"==typeof t?new Lt([[document.querySelector(t)]],[document.documentElement]):new Lt([[t]],At)}function Os(t){return"string"==typeof t?new Lt([document.querySelectorAll(t)],[document.documentElement]):new Lt([v(t)],At)}function Ms(t){return function(){return t}}!function(t){la=function(t){var e=t.dateTime,n=t.date,i=t.time,r=t.periods,a=t.days,s=t.shortDays,o=t.months,c=t.shortMonths,l=ma(r),h=ba(r),u=ma(a),d=ba(a),p=ma(s),f=ba(s),g=ma(o),y=ba(o),m=ma(c),b=ba(c),_={a:function(t){return s[t.getDay()]},A:function(t){return a[t.getDay()]},b:function(t){return c[t.getMonth()]},B:function(t){return o[t.getMonth()]},c:null,d:Za,e:Za,f:Ua,g:es,G:is,H:Pa,I:ja,j:Ya,L:za,m:Wa,M:qa,p:function(t){return r[+(t.getHours()>=12)]},q:function(t){return 1+~~(t.getMonth()/3)},Q:Es,s:Ss,S:Ha,u:Va,U:Ga,V:Qa,w:Ka,W:Ja,x:null,X:null,y:ts,Y:ns,Z:rs,"%":Ts},x={a:function(t){return s[t.getUTCDay()]},A:function(t){return a[t.getUTCDay()]},b:function(t){return c[t.getUTCMonth()]},B:function(t){return o[t.getUTCMonth()]},c:null,d:as,e:as,f:hs,g:vs,G:ws,H:ss,I:os,j:cs,L:ls,m:us,M:ds,p:function(t){return r[+(t.getUTCHours()>=12)]},q:function(t){return 1+~~(t.getUTCMonth()/3)},Q:Es,s:Ss,S:ps,u:fs,U:gs,V:ms,w:bs,W:_s,x:null,X:null,y:xs,Y:ks,Z:Cs,"%":Ts},v={a:function(t,e,n){var i=p.exec(e.slice(n));return i?(t.w=f.get(i[0].toLowerCase()),n+i[0].length):-1},A:function(t,e,n){var i=u.exec(e.slice(n));return i?(t.w=d.get(i[0].toLowerCase()),n+i[0].length):-1},b:function(t,e,n){var i=m.exec(e.slice(n));return i?(t.m=b.get(i[0].toLowerCase()),n+i[0].length):-1},B:function(t,e,n){var i=g.exec(e.slice(n));return i?(t.m=y.get(i[0].toLowerCase()),n+i[0].length):-1},c:function(t,n,i){return C(t,e,n,i)},d:La,e:La,f:Ia,g:Ta,G:Ca,H:Na,I:Na,j:Ba,L:Ma,m:Aa,M:Da,p:function(t,e,n){var i=l.exec(e.slice(n));return i?(t.p=h.get(i[0].toLowerCase()),n+i[0].length):-1},q:Sa,Q:$a,s:Ra,S:Oa,u:xa,U:va,V:ka,w:_a,W:wa,x:function(t,e,i){return C(t,n,e,i)},X:function(t,e,n){return C(t,i,e,n)},y:Ta,Y:Ca,Z:Ea,"%":Fa};function k(t,e){return function(n){var i,r,a,s=[],o=-1,c=0,l=t.length;for(n instanceof Date||(n=new Date(+n));++o<l;)37===t.charCodeAt(o)&&(s.push(t.slice(c,o)),null!=(r=ua[i=t.charAt(++o)])?i=t.charAt(++o):r="e"===i?" ":"0",(a=e[i])&&(i=a(n,r)),s.push(i),c=o+1);return s.push(t.slice(c,o)),s.join("")}}function w(t,e){return function(n){var i,r,a=ca(1900,void 0,1);if(C(a,t,n+="",0)!=n.length)return null;if("Q"in a)return new Date(a.Q);if("s"in a)return new Date(1e3*a.s+("L"in a?a.L:0));if(e&&!("Z"in a)&&(a.Z=0),"p"in a&&(a.H=a.H%12+12*a.p),void 0===a.m&&(a.m="q"in a?a.q:0),"V"in a){if(a.V<1||a.V>53)return null;"w"in a||(a.w=1),"Z"in a?(r=(i=oa(ca(a.y,0,1))).getUTCDay(),i=r>4||0===r?Wr.ceil(i):Wr(i),i=Or.offset(i,7*(a.V-1)),a.y=i.getUTCFullYear(),a.m=i.getUTCMonth(),a.d=i.getUTCDate()+(a.w+6)%7):(r=(i=sa(ca(a.y,0,1))).getDay(),i=r>4||0===r?$r.ceil(i):$r(i),i=Dr.offset(i,7*(a.V-1)),a.y=i.getFullYear(),a.m=i.getMonth(),a.d=i.getDate()+(a.w+6)%7)}else("W"in a||"U"in a)&&("w"in a||(a.w="u"in a?a.u%7:"W"in a?1:0),r="Z"in a?oa(ca(a.y,0,1)).getUTCDay():sa(ca(a.y,0,1)).getDay(),a.m=0,a.d="W"in a?(a.w+6)%7+7*a.W-(r+5)%7:a.w+7*a.U-(r+6)%7);return"Z"in a?(a.H+=a.Z/100|0,a.M+=a.Z%100,oa(a)):sa(a)}}function C(t,e,n,i){for(var r,a,s=0,o=e.length,c=n.length;s<o;){if(i>=c)return-1;if(37===(r=e.charCodeAt(s++))){if(r=e.charAt(s++),!(a=v[r in ua?e.charAt(s++):r])||(i=a(t,n,i))<0)return-1}else if(r!=n.charCodeAt(i++))return-1}return i}return _.x=k(n,_),_.X=k(i,_),_.c=k(e,_),x.x=k(n,x),x.X=k(i,x),x.c=k(e,x),{format:function(t){var e=k(t+="",_);return e.toString=function(){return t},e},parse:function(t){var e=w(t+="",!1);return e.toString=function(){return t},e},utcFormat:function(t){var e=k(t+="",x);return e.toString=function(){return t},e},utcParse:function(t){var e=w(t+="",!0);return e.toString=function(){return t},e}}}(t),ha=la.format,la.parse,la.utcFormat,la.utcParse}({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});const Is=Math.abs,Fs=Math.atan2,$s=Math.cos,Rs=Math.max,Zs=Math.min,Ps=Math.sin,js=Math.sqrt,Ys=1e-12,zs=Math.PI,Us=zs/2,Ws=2*zs;function qs(t){return t>=1?Us:t<=-1?-Us:Math.asin(t)}const Hs=Math.PI,Vs=2*Hs,Gs=1e-6,Xs=Vs-Gs;function Qs(t){this._+=t[0];for(let e=1,n=t.length;e<n;++e)this._+=arguments[e]+t[e]}class Ks{constructor(t){this._x0=this._y0=this._x1=this._y1=null,this._="",this._append=null==t?Qs:function(t){let e=Math.floor(t);if(!(e>=0))throw new Error(`invalid digits: ${t}`);if(e>15)return Qs;const n=10**e;return function(t){this._+=t[0];for(let e=1,i=t.length;e<i;++e)this._+=Math.round(arguments[e]*n)/n+t[e]}}(t)}moveTo(t,e){this._append`M${this._x0=this._x1=+t},${this._y0=this._y1=+e}`}closePath(){null!==this._x1&&(this._x1=this._x0,this._y1=this._y0,this._append`Z`)}lineTo(t,e){this._append`L${this._x1=+t},${this._y1=+e}`}quadraticCurveTo(t,e,n,i){this._append`Q${+t},${+e},${this._x1=+n},${this._y1=+i}`}bezierCurveTo(t,e,n,i,r,a){this._append`C${+t},${+e},${+n},${+i},${this._x1=+r},${this._y1=+a}`}arcTo(t,e,n,i,r){if(t=+t,e=+e,n=+n,i=+i,(r=+r)<0)throw new Error(`negative radius: ${r}`);let a=this._x1,s=this._y1,o=n-t,c=i-e,l=a-t,h=s-e,u=l*l+h*h;if(null===this._x1)this._append`M${this._x1=t},${this._y1=e}`;else if(u>Gs)if(Math.abs(h*o-c*l)>Gs&&r){let d=n-a,p=i-s,f=o*o+c*c,g=d*d+p*p,y=Math.sqrt(f),m=Math.sqrt(u),b=r*Math.tan((Hs-Math.acos((f+u-g)/(2*y*m)))/2),_=b/m,x=b/y;Math.abs(_-1)>Gs&&this._append`L${t+_*l},${e+_*h}`,this._append`A${r},${r},0,0,${+(h*d>l*p)},${this._x1=t+x*o},${this._y1=e+x*c}`}else this._append`L${this._x1=t},${this._y1=e}`;else;}arc(t,e,n,i,r,a){if(t=+t,e=+e,a=!!a,(n=+n)<0)throw new Error(`negative radius: ${n}`);let s=n*Math.cos(i),o=n*Math.sin(i),c=t+s,l=e+o,h=1^a,u=a?i-r:r-i;null===this._x1?this._append`M${c},${l}`:(Math.abs(this._x1-c)>Gs||Math.abs(this._y1-l)>Gs)&&this._append`L${c},${l}`,n&&(u<0&&(u=u%Vs+Vs),u>Xs?this._append`A${n},${n},0,1,${h},${t-s},${e-o}A${n},${n},0,1,${h},${this._x1=c},${this._y1=l}`:u>Gs&&this._append`A${n},${n},0,${+(u>=Hs)},${h},${this._x1=t+n*Math.cos(r)},${this._y1=e+n*Math.sin(r)}`)}rect(t,e,n,i){this._append`M${this._x0=this._x1=+t},${this._y0=this._y1=+e}h${n=+n}v${+i}h${-n}Z`}toString(){return this._}}function Js(t){let e=3;return t.digits=function(n){if(!arguments.length)return e;if(null==n)e=null;else{const t=Math.floor(n);if(!(t>=0))throw new RangeError(`invalid digits: ${n}`);e=t}return t},()=>new Ks(e)}function to(t){return t.innerRadius}function eo(t){return t.outerRadius}function no(t){return t.startAngle}function io(t){return t.endAngle}function ro(t){return t&&t.padAngle}function ao(t,e,n,i,r,a,s){var o=t-n,c=e-i,l=(s?a:-a)/js(o*o+c*c),h=l*c,u=-l*o,d=t+h,p=e+u,f=n+h,g=i+u,y=(d+f)/2,m=(p+g)/2,b=f-d,_=g-p,x=b*b+_*_,v=r-a,k=d*g-f*p,w=(_<0?-1:1)*js(Rs(0,v*v*x-k*k)),C=(k*_-b*w)/x,T=(-k*b-_*w)/x,E=(k*_+b*w)/x,S=(-k*b+_*w)/x,A=C-y,L=T-m,B=E-y,N=S-m;return A*A+L*L>B*B+N*N&&(C=E,T=S),{cx:C,cy:T,x01:-h,y01:-u,x11:C*(r/v-1),y11:T*(r/v-1)}}function so(){var t=to,e=eo,n=Ms(0),i=null,r=no,a=io,s=ro,o=null,c=Js(l);function l(){var l,h,u,d=+t.apply(this,arguments),p=+e.apply(this,arguments),f=r.apply(this,arguments)-Us,g=a.apply(this,arguments)-Us,y=Is(g-f),m=g>f;if(o||(o=l=c()),p<d&&(h=p,p=d,d=h),p>Ys)if(y>Ws-Ys)o.moveTo(p*$s(f),p*Ps(f)),o.arc(0,0,p,f,g,!m),d>Ys&&(o.moveTo(d*$s(g),d*Ps(g)),o.arc(0,0,d,g,f,m));else{var b,_,x=f,v=g,k=f,w=g,C=y,T=y,E=s.apply(this,arguments)/2,S=E>Ys&&(i?+i.apply(this,arguments):js(d*d+p*p)),A=Zs(Is(p-d)/2,+n.apply(this,arguments)),L=A,B=A;if(S>Ys){var N=qs(S/d*Ps(E)),D=qs(S/p*Ps(E));(C-=2*N)>Ys?(k+=N*=m?1:-1,w-=N):(C=0,k=w=(f+g)/2),(T-=2*D)>Ys?(x+=D*=m?1:-1,v-=D):(T=0,x=v=(f+g)/2)}var O=p*$s(x),M=p*Ps(x),I=d*$s(w),F=d*Ps(w);if(A>Ys){var $,R=p*$s(v),Z=p*Ps(v),P=d*$s(k),j=d*Ps(k);if(y<zs)if($=function(t,e,n,i,r,a,s,o){var c=n-t,l=i-e,h=s-r,u=o-a,d=u*c-h*l;if(!(d*d<Ys))return[t+(d=(h*(e-a)-u*(t-r))/d)*c,e+d*l]}(O,M,P,j,R,Z,I,F)){var Y=O-$[0],z=M-$[1],U=R-$[0],W=Z-$[1],q=1/Ps(((u=(Y*U+z*W)/(js(Y*Y+z*z)*js(U*U+W*W)))>1?0:u<-1?zs:Math.acos(u))/2),H=js($[0]*$[0]+$[1]*$[1]);L=Zs(A,(d-H)/(q-1)),B=Zs(A,(p-H)/(q+1))}else L=B=0}T>Ys?B>Ys?(b=ao(P,j,O,M,p,B,m),_=ao(R,Z,I,F,p,B,m),o.moveTo(b.cx+b.x01,b.cy+b.y01),B<A?o.arc(b.cx,b.cy,B,Fs(b.y01,b.x01),Fs(_.y01,_.x01),!m):(o.arc(b.cx,b.cy,B,Fs(b.y01,b.x01),Fs(b.y11,b.x11),!m),o.arc(0,0,p,Fs(b.cy+b.y11,b.cx+b.x11),Fs(_.cy+_.y11,_.cx+_.x11),!m),o.arc(_.cx,_.cy,B,Fs(_.y11,_.x11),Fs(_.y01,_.x01),!m))):(o.moveTo(O,M),o.arc(0,0,p,x,v,!m)):o.moveTo(O,M),d>Ys&&C>Ys?L>Ys?(b=ao(I,F,R,Z,d,-L,m),_=ao(O,M,P,j,d,-L,m),o.lineTo(b.cx+b.x01,b.cy+b.y01),L<A?o.arc(b.cx,b.cy,L,Fs(b.y01,b.x01),Fs(_.y01,_.x01),!m):(o.arc(b.cx,b.cy,L,Fs(b.y01,b.x01),Fs(b.y11,b.x11),!m),o.arc(0,0,d,Fs(b.cy+b.y11,b.cx+b.x11),Fs(_.cy+_.y11,_.cx+_.x11),m),o.arc(_.cx,_.cy,L,Fs(_.y11,_.x11),Fs(_.y01,_.x01),!m))):o.arc(0,0,d,w,k,m):o.lineTo(I,F)}else o.moveTo(0,0);if(o.closePath(),l)return o=null,l+""||null}return l.centroid=function(){var n=(+t.apply(this,arguments)+ +e.apply(this,arguments))/2,i=(+r.apply(this,arguments)+ +a.apply(this,arguments))/2-zs/2;return[$s(i)*n,Ps(i)*n]},l.innerRadius=function(e){return arguments.length?(t="function"==typeof e?e:Ms(+e),l):t},l.outerRadius=function(t){return arguments.length?(e="function"==typeof t?t:Ms(+t),l):e},l.cornerRadius=function(t){return arguments.length?(n="function"==typeof t?t:Ms(+t),l):n},l.padRadius=function(t){return arguments.length?(i=null==t?null:"function"==typeof t?t:Ms(+t),l):i},l.startAngle=function(t){return arguments.length?(r="function"==typeof t?t:Ms(+t),l):r},l.endAngle=function(t){return arguments.length?(a="function"==typeof t?t:Ms(+t),l):a},l.padAngle=function(t){return arguments.length?(s="function"==typeof t?t:Ms(+t),l):s},l.context=function(t){return arguments.length?(o=null==t?null:t,l):o},l}Ks.prototype;Array.prototype.slice;function oo(t){return"object"==typeof t&&"length"in t?t:Array.from(t)}function co(t){this._context=t}function lo(t){return new co(t)}function ho(t){return t[0]}function uo(t){return t[1]}function po(t,e){var n=Ms(!0),i=null,r=lo,a=null,s=Js(o);function o(o){var c,l,h,u=(o=oo(o)).length,d=!1;for(null==i&&(a=r(h=s())),c=0;c<=u;++c)!(c<u&&n(l=o[c],c,o))===d&&((d=!d)?a.lineStart():a.lineEnd()),d&&a.point(+t(l,c,o),+e(l,c,o));if(h)return a=null,h+""||null}return t="function"==typeof t?t:void 0===t?ho:Ms(t),e="function"==typeof e?e:void 0===e?uo:Ms(e),o.x=function(e){return arguments.length?(t="function"==typeof e?e:Ms(+e),o):t},o.y=function(t){return arguments.length?(e="function"==typeof t?t:Ms(+t),o):e},o.defined=function(t){return arguments.length?(n="function"==typeof t?t:Ms(!!t),o):n},o.curve=function(t){return arguments.length?(r=t,null!=i&&(a=r(i)),o):r},o.context=function(t){return arguments.length?(null==t?i=a=null:a=r(i=t),o):i},o}function fo(t,e){return e<t?-1:e>t?1:e>=t?0:NaN}function go(t){return t}function yo(){var t=go,e=fo,n=null,i=Ms(0),r=Ms(Ws),a=Ms(0);function s(s){var o,c,l,h,u,d=(s=oo(s)).length,p=0,f=new Array(d),g=new Array(d),y=+i.apply(this,arguments),m=Math.min(Ws,Math.max(-Ws,r.apply(this,arguments)-y)),b=Math.min(Math.abs(m)/d,a.apply(this,arguments)),_=b*(m<0?-1:1);for(o=0;o<d;++o)(u=g[f[o]=o]=+t(s[o],o,s))>0&&(p+=u);for(null!=e?f.sort((function(t,n){return e(g[t],g[n])})):null!=n&&f.sort((function(t,e){return n(s[t],s[e])})),o=0,l=p?(m-d*_)/p:0;o<d;++o,y=h)c=f[o],h=y+((u=g[c])>0?u*l:0)+_,g[c]={data:s[c],index:o,value:u,startAngle:y,endAngle:h,padAngle:b};return g}return s.value=function(e){return arguments.length?(t="function"==typeof e?e:Ms(+e),s):t},s.sortValues=function(t){return arguments.length?(e=t,n=null,s):e},s.sort=function(t){return arguments.length?(n=t,e=null,s):n},s.startAngle=function(t){return arguments.length?(i="function"==typeof t?t:Ms(+t),s):i},s.endAngle=function(t){return arguments.length?(r="function"==typeof t?t:Ms(+t),s):r},s.padAngle=function(t){return arguments.length?(a="function"==typeof t?t:Ms(+t),s):a},s}function mo(){}function bo(t,e,n){t._context.bezierCurveTo((2*t._x0+t._x1)/3,(2*t._y0+t._y1)/3,(t._x0+2*t._x1)/3,(t._y0+2*t._y1)/3,(t._x0+4*t._x1+e)/6,(t._y0+4*t._y1+n)/6)}function _o(t){this._context=t}function xo(t){return new _o(t)}function vo(t){this._context=t}function ko(t){return new vo(t)}function wo(t){this._context=t}function Co(t){return new wo(t)}co.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:this._context.lineTo(t,e)}}},_o.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:bo(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:bo(this,t,e)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}},vo.prototype={areaStart:mo,areaEnd:mo,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x2,this._y2),this._context.closePath();break;case 2:this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break;case 3:this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4)}},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x2=t,this._y2=e;break;case 1:this._point=2,this._x3=t,this._y3=e;break;case 2:this._point=3,this._x4=t,this._y4=e,this._context.moveTo((this._x0+4*this._x1+t)/6,(this._y0+4*this._y1+e)/6);break;default:bo(this,t,e)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}},wo.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var n=(this._x0+4*this._x1+t)/6,i=(this._y0+4*this._y1+e)/6;this._line?this._context.lineTo(n,i):this._context.moveTo(n,i);break;case 3:this._point=4;default:bo(this,t,e)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}};class To{constructor(t,e){this._context=t,this._x=e}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line}point(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:this._x?this._context.bezierCurveTo(this._x0=(this._x0+t)/2,this._y0,this._x0,e,t,e):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+e)/2,t,this._y0,t,e)}this._x0=t,this._y0=e}}function Eo(t){return new To(t,!0)}function So(t){return new To(t,!1)}function Ao(t,e){this._basis=new _o(t),this._beta=e}Ao.prototype={lineStart:function(){this._x=[],this._y=[],this._basis.lineStart()},lineEnd:function(){var t=this._x,e=this._y,n=t.length-1;if(n>0)for(var i,r=t[0],a=e[0],s=t[n]-r,o=e[n]-a,c=-1;++c<=n;)i=c/n,this._basis.point(this._beta*t[c]+(1-this._beta)*(r+i*s),this._beta*e[c]+(1-this._beta)*(a+i*o));this._x=this._y=null,this._basis.lineEnd()},point:function(t,e){this._x.push(+t),this._y.push(+e)}};const Lo=function t(e){function n(t){return 1===e?new _o(t):new Ao(t,e)}return n.beta=function(e){return t(+e)},n}(.85);function Bo(t,e,n){t._context.bezierCurveTo(t._x1+t._k*(t._x2-t._x0),t._y1+t._k*(t._y2-t._y0),t._x2+t._k*(t._x1-e),t._y2+t._k*(t._y1-n),t._x2,t._y2)}function No(t,e){this._context=t,this._k=(1-e)/6}No.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:Bo(this,this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2,this._x1=t,this._y1=e;break;case 2:this._point=3;default:Bo(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};const Do=function t(e){function n(t){return new No(t,e)}return n.tension=function(e){return t(+e)},n}(0);function Oo(t,e){this._context=t,this._k=(1-e)/6}Oo.prototype={areaStart:mo,areaEnd:mo,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:Bo(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};const Mo=function t(e){function n(t){return new Oo(t,e)}return n.tension=function(e){return t(+e)},n}(0);function Io(t,e){this._context=t,this._k=(1-e)/6}Io.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:Bo(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};const Fo=function t(e){function n(t){return new Io(t,e)}return n.tension=function(e){return t(+e)},n}(0);function $o(t,e,n){var i=t._x1,r=t._y1,a=t._x2,s=t._y2;if(t._l01_a>Ys){var o=2*t._l01_2a+3*t._l01_a*t._l12_a+t._l12_2a,c=3*t._l01_a*(t._l01_a+t._l12_a);i=(i*o-t._x0*t._l12_2a+t._x2*t._l01_2a)/c,r=(r*o-t._y0*t._l12_2a+t._y2*t._l01_2a)/c}if(t._l23_a>Ys){var l=2*t._l23_2a+3*t._l23_a*t._l12_a+t._l12_2a,h=3*t._l23_a*(t._l23_a+t._l12_a);a=(a*l+t._x1*t._l23_2a-e*t._l12_2a)/h,s=(s*l+t._y1*t._l23_2a-n*t._l12_2a)/h}t._context.bezierCurveTo(i,r,a,s,t._x2,t._y2)}function Ro(t,e){this._context=t,this._alpha=e}Ro.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,i=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+i*i,this._alpha))}switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3;default:$o(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};const Zo=function t(e){function n(t){return e?new Ro(t,e):new No(t,0)}return n.alpha=function(e){return t(+e)},n}(.5);function Po(t,e){this._context=t,this._alpha=e}Po.prototype={areaStart:mo,areaEnd:mo,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,i=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+i*i,this._alpha))}switch(this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:$o(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};const jo=function t(e){function n(t){return e?new Po(t,e):new Oo(t,0)}return n.alpha=function(e){return t(+e)},n}(.5);function Yo(t,e){this._context=t,this._alpha=e}Yo.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,i=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+i*i,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:$o(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};const zo=function t(e){function n(t){return e?new Yo(t,e):new Io(t,0)}return n.alpha=function(e){return t(+e)},n}(.5);function Uo(t){this._context=t}function Wo(t){return new Uo(t)}function qo(t){return t<0?-1:1}function Ho(t,e,n){var i=t._x1-t._x0,r=e-t._x1,a=(t._y1-t._y0)/(i||r<0&&-0),s=(n-t._y1)/(r||i<0&&-0),o=(a*r+s*i)/(i+r);return(qo(a)+qo(s))*Math.min(Math.abs(a),Math.abs(s),.5*Math.abs(o))||0}function Vo(t,e){var n=t._x1-t._x0;return n?(3*(t._y1-t._y0)/n-e)/2:e}function Go(t,e,n){var i=t._x0,r=t._y0,a=t._x1,s=t._y1,o=(a-i)/3;t._context.bezierCurveTo(i+o,r+o*e,a-o,s-o*n,a,s)}function Xo(t){this._context=t}function Qo(t){this._context=new Ko(t)}function Ko(t){this._context=t}function Jo(t){return new Xo(t)}function tc(t){return new Qo(t)}function ec(t){this._context=t}function nc(t){var e,n,i=t.length-1,r=new Array(i),a=new Array(i),s=new Array(i);for(r[0]=0,a[0]=2,s[0]=t[0]+2*t[1],e=1;e<i-1;++e)r[e]=1,a[e]=4,s[e]=4*t[e]+2*t[e+1];for(r[i-1]=2,a[i-1]=7,s[i-1]=8*t[i-1]+t[i],e=1;e<i;++e)n=r[e]/a[e-1],a[e]-=n,s[e]-=n*s[e-1];for(r[i-1]=s[i-1]/a[i-1],e=i-2;e>=0;--e)r[e]=(s[e]-r[e+1])/a[e];for(a[i-1]=(t[i]+r[i-1])/2,e=0;e<i-1;++e)a[e]=2*t[e+1]-r[e+1];return[r,a]}function ic(t){return new ec(t)}function rc(t,e){this._context=t,this._t=e}function ac(t){return new rc(t,.5)}function sc(t){return new rc(t,0)}function oc(t){return new rc(t,1)}function cc(t,e,n){this.k=t,this.x=e,this.y=n}Uo.prototype={areaStart:mo,areaEnd:mo,lineStart:function(){this._point=0},lineEnd:function(){this._point&&this._context.closePath()},point:function(t,e){t=+t,e=+e,this._point?this._context.lineTo(t,e):(this._point=1,this._context.moveTo(t,e))}},Xo.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:Go(this,this._t0,Vo(this,this._t0))}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){var n=NaN;if(e=+e,(t=+t)!==this._x1||e!==this._y1){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3,Go(this,Vo(this,n=Ho(this,t,e)),n);break;default:Go(this,this._t0,n=Ho(this,t,e))}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e,this._t0=n}}},(Qo.prototype=Object.create(Xo.prototype)).point=function(t,e){Xo.prototype.point.call(this,e,t)},Ko.prototype={moveTo:function(t,e){this._context.moveTo(e,t)},closePath:function(){this._context.closePath()},lineTo:function(t,e){this._context.lineTo(e,t)},bezierCurveTo:function(t,e,n,i,r,a){this._context.bezierCurveTo(e,t,i,n,a,r)}},ec.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=[],this._y=[]},lineEnd:function(){var t=this._x,e=this._y,n=t.length;if(n)if(this._line?this._context.lineTo(t[0],e[0]):this._context.moveTo(t[0],e[0]),2===n)this._context.lineTo(t[1],e[1]);else for(var i=nc(t),r=nc(e),a=0,s=1;s<n;++a,++s)this._context.bezierCurveTo(i[0][a],r[0][a],i[1][a],r[1][a],t[s],e[s]);(this._line||0!==this._line&&1===n)&&this._context.closePath(),this._line=1-this._line,this._x=this._y=null},point:function(t,e){this._x.push(+t),this._y.push(+e)}},rc.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=this._y=NaN,this._point=0},lineEnd:function(){0<this._t&&this._t<1&&2===this._point&&this._context.lineTo(this._x,this._y),(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line>=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:if(this._t<=0)this._context.lineTo(this._x,e),this._context.lineTo(t,e);else{var n=this._x*(1-this._t)+t*this._t;this._context.lineTo(n,this._y),this._context.lineTo(n,e)}}this._x=t,this._y=e}},cc.prototype={constructor:cc,scale:function(t){return 1===t?this:new cc(this.k*t,this.x,this.y)},translate:function(t,e){return 0===t&0===e?this:new cc(this.k,this.x+this.k*t,this.y+this.k*e)},apply:function(t){return[t[0]*this.k+this.x,t[1]*this.k+this.y]},applyX:function(t){return t*this.k+this.x},applyY:function(t){return t*this.k+this.y},invert:function(t){return[(t[0]-this.x)/this.k,(t[1]-this.y)/this.k]},invertX:function(t){return(t-this.x)/this.k},invertY:function(t){return(t-this.y)/this.k},rescaleX:function(t){return t.copy().domain(t.range().map(this.invertX,this).map(t.invert,t))},rescaleY:function(t){return t.copy().domain(t.range().map(this.invertY,this).map(t.invert,t))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};new cc(1,0,0);cc.prototype},23352:(t,e,n)=>{"use strict";function i(t,e,n,i){var a,s,o,c,l,h,u,d,p,f,g,y,m;if(a=e.y-t.y,o=t.x-e.x,l=e.x*t.y-t.x*e.y,p=a*n.x+o*n.y+l,f=a*i.x+o*i.y+l,!(0!==p&&0!==f&&r(p,f)||(s=i.y-n.y,c=n.x-i.x,h=i.x*n.y-n.x*i.y,u=s*t.x+c*t.y+h,d=s*e.x+c*e.y+h,0!==u&&0!==d&&r(u,d)||0==(g=a*c-s*o))))return y=Math.abs(g/2),{x:(m=o*h-c*l)<0?(m-y)/g:(m+y)/g,y:(m=s*l-a*h)<0?(m-y)/g:(m+y)/g}}function r(t,e){return t*e>0}function a(t,e,n){var r=t.x,a=t.y,s=[],o=Number.POSITIVE_INFINITY,c=Number.POSITIVE_INFINITY;e.forEach((function(t){o=Math.min(o,t.x),c=Math.min(c,t.y)}));for(var l=r-t.width/2-o,h=a-t.height/2-c,u=0;u<e.length;u++){var d=e[u],p=e[u<e.length-1?u+1:0],f=i(t,n,{x:l+d.x,y:h+d.y},{x:l+p.x,y:h+p.y});f&&s.push(f)}return s.length?(s.length>1&&s.sort((function(t,e){var i=t.x-n.x,r=t.y-n.y,a=Math.sqrt(i*i+r*r),s=e.x-n.x,o=e.y-n.y,c=Math.sqrt(s*s+o*o);return a<c?-1:a===c?0:1})),s[0]):(console.log("NO INTERSECTION FOUND, RETURN NODE CENTER",t),t)}n.d(e,{A:()=>a})},22930:(t,e,n)=>{"use strict";function i(t,e){var n,i,r=t.x,a=t.y,s=e.x-r,o=e.y-a,c=t.width/2,l=t.height/2;return Math.abs(o)*c>Math.abs(s)*l?(o<0&&(l=-l),n=0===o?0:l*s/o,i=l):(s<0&&(c=-c),n=c,i=0===s?0:c*o/s),{x:r+n,y:a+i}}n.d(e,{q:()=>i})},43349:(t,e,n)=>{"use strict";n.d(e,{a:()=>r});var i=n(96225);function r(t,e){var n=t.append("foreignObject").attr("width","100000"),r=n.append("xhtml:div");r.attr("xmlns","http://www.w3.org/1999/xhtml");var a=e.label;switch(typeof a){case"function":r.insert(a);break;case"object":r.insert((function(){return a}));break;default:r.html(a)}i.bg(r,e.labelStyle),r.style("display","inline-block"),r.style("white-space","nowrap");var s=r.node().getBoundingClientRect();return n.attr("width",s.width).attr("height",s.height),n}},96225:(t,e,n)=>{"use strict";n.d(e,{$p:()=>h,O1:()=>s,WR:()=>u,bF:()=>a,bg:()=>l});var i=n(37514),r=n(73234);function a(t,e){return!!t.children(e).length}function s(t){return c(t.v)+":"+c(t.w)+":"+c(t.name)}var o=/:/g;function c(t){return t?String(t).replace(o,"\\:"):""}function l(t,e){e&&t.attr("style",e)}function h(t,e,n){e&&t.attr("class",e).attr("class",n+" "+t.attr("class"))}function u(t,e){var n=e.graph();if(i.Z(n)){var a=n.transition;if(r.Z(a))return a(t)}return t}},70277:(t,e,n)=>{"use strict";n.d(e,{bK:()=>Ge});var i=n(70870),r=n(66749),a=n(17452),s=n(62002),o=n(27961),c=n(43836),l=n(74379),h=n(45625);class u{constructor(){var t={};t._next=t._prev=t,this._sentinel=t}dequeue(){var t=this._sentinel,e=t._prev;if(e!==t)return d(e),e}enqueue(t){var e=this._sentinel;t._prev&&t._next&&d(t),t._next=e._next,e._next._prev=t,e._next=t,t._prev=e}toString(){for(var t=[],e=this._sentinel,n=e._prev;n!==e;)t.push(JSON.stringify(n,p)),n=n._prev;return"["+t.join(", ")+"]"}}function d(t){t._prev._next=t._next,t._next._prev=t._prev,delete t._next,delete t._prev}function p(t,e){if("_next"!==t&&"_prev"!==t)return e}var f=s.Z(1);function g(t,e){if(t.nodeCount()<=1)return[];var n=function(t,e){var n=new h.k,r=0,a=0;i.Z(t.nodes(),(function(t){n.setNode(t,{v:t,in:0,out:0})})),i.Z(t.edges(),(function(t){var i=n.edge(t.v,t.w)||0,s=e(t),o=i+s;n.setEdge(t.v,t.w,o),a=Math.max(a,n.node(t.v).out+=s),r=Math.max(r,n.node(t.w).in+=s)}));var s=l.Z(a+r+3).map((function(){return new u})),o=r+1;return i.Z(n.nodes(),(function(t){m(s,o,n.node(t))})),{graph:n,buckets:s,zeroIdx:o}}(t,e||f),r=function(t,e,n){var i,r=[],a=e[e.length-1],s=e[0];for(;t.nodeCount();){for(;i=s.dequeue();)y(t,e,n,i);for(;i=a.dequeue();)y(t,e,n,i);if(t.nodeCount())for(var o=e.length-2;o>0;--o)if(i=e[o].dequeue()){r=r.concat(y(t,e,n,i,!0));break}}return r}(n.graph,n.buckets,n.zeroIdx);return o.Z(c.Z(r,(function(e){return t.outEdges(e.v,e.w)})))}function y(t,e,n,r,a){var s=a?[]:void 0;return i.Z(t.inEdges(r.v),(function(i){var r=t.edge(i),o=t.node(i.v);a&&s.push({v:i.v,w:i.w}),o.out-=r,m(e,n,o)})),i.Z(t.outEdges(r.v),(function(i){var r=t.edge(i),a=i.w,s=t.node(a);s.in-=r,m(e,n,s)})),t.removeNode(r.v),s}function m(t,e,n){n.out?n.in?t[n.out-n.in+e].enqueue(n):t[t.length-1].enqueue(n):t[0].enqueue(n)}function b(t){var e="greedy"===t.graph().acyclicer?g(t,function(t){return function(e){return t.edge(e).weight}}(t)):function(t){var e=[],n={},r={};function s(o){a.Z(r,o)||(r[o]=!0,n[o]=!0,i.Z(t.outEdges(o),(function(t){a.Z(n,t.w)?e.push(t):s(t.w)})),delete n[o])}return i.Z(t.nodes(),s),e}(t);i.Z(e,(function(e){var n=t.edge(e);t.removeEdge(e),n.forwardName=e.name,n.reversed=!0,t.setEdge(e.w,e.v,n,r.Z("rev"))}))}var _=n(31667),x=n(74752),v=n(79651);const k=function(t,e,n){(void 0!==n&&!(0,v.Z)(t[e],n)||void 0===n&&!(e in t))&&(0,x.Z)(t,e,n)};var w=n(61395),C=n(91050),T=n(12701),E=n(87215),S=n(73658),A=n(29169),L=n(27771),B=n(836),N=n(77008),D=n(73234),O=n(77226),M=n(37514),I=n(18843);const F=function(t,e){if(("constructor"!==e||"function"!=typeof t[e])&&"__proto__"!=e)return t[e]};var $=n(31899),R=n(32957);const Z=function(t){return(0,$.Z)(t,(0,R.Z)(t))};const P=function(t,e,n,i,r,a,s){var o=F(t,n),c=F(e,n),l=s.get(c);if(l)k(t,n,l);else{var h=a?a(o,c,n+"",t,e,s):void 0,u=void 0===h;if(u){var d=(0,L.Z)(c),p=!d&&(0,N.Z)(c),f=!d&&!p&&(0,I.Z)(c);h=c,d||p||f?(0,L.Z)(o)?h=o:(0,B.Z)(o)?h=(0,E.Z)(o):p?(u=!1,h=(0,C.Z)(c,!0)):f?(u=!1,h=(0,T.Z)(c,!0)):h=[]:(0,M.Z)(c)||(0,A.Z)(c)?(h=o,(0,A.Z)(o)?h=Z(o):(0,O.Z)(o)&&!(0,D.Z)(o)||(h=(0,S.Z)(c))):u=!1}u&&(s.set(c,h),r(h,c,i,a,s),s.delete(c)),k(t,n,h)}};const j=function t(e,n,i,r,a){e!==n&&(0,w.Z)(n,(function(s,o){if(a||(a=new _.Z),(0,O.Z)(s))P(e,n,o,i,t,r,a);else{var c=r?r(F(e,o),s,o+"",e,n,a):void 0;void 0===c&&(c=s),k(e,o,c)}}),R.Z)};var Y=n(69581),z=n(50439);const U=function(t){return(0,Y.Z)((function(e,n){var i=-1,r=n.length,a=r>1?n[r-1]:void 0,s=r>2?n[2]:void 0;for(a=t.length>3&&"function"==typeof a?(r--,a):void 0,s&&(0,z.Z)(n[0],n[1],s)&&(a=r<3?void 0:a,r=1),e=Object(e);++i<r;){var o=n[i];o&&t(e,o,i,a)}return e}))}((function(t,e,n){j(t,e,n)}));var W=n(61666),q=n(3688),H=n(72714);const V=function(t,e,n){for(var i=-1,r=t.length;++i<r;){var a=t[i],s=e(a);if(null!=s&&(void 0===o?s==s&&!(0,H.Z)(s):n(s,o)))var o=s,c=a}return c};const G=function(t,e){return t>e};var X=n(69203);const Q=function(t){return t&&t.length?V(t,X.Z,G):void 0};const K=function(t){var e=null==t?0:t.length;return e?t[e-1]:void 0};var J=n(2693),tt=n(74765);const et=function(t,e){var n={};return e=(0,tt.Z)(e,3),(0,J.Z)(t,(function(t,i,r){(0,x.Z)(n,i,e(t,i,r))})),n};var nt=n(49360);const it=function(t,e){return t<e};const rt=function(t){return t&&t.length?V(t,X.Z,it):void 0};var at=n(66092);const st=function(){return at.Z.Date.now()};function ot(t,e,n,i){var a;do{a=r.Z(i)}while(t.hasNode(a));return n.dummy=e,t.setNode(a,n),a}function ct(t){var e=new h.k({multigraph:t.isMultigraph()}).setGraph(t.graph());return i.Z(t.nodes(),(function(n){t.children(n).length||e.setNode(n,t.node(n))})),i.Z(t.edges(),(function(n){e.setEdge(n,t.edge(n))})),e}function lt(t,e){var n,i,r=t.x,a=t.y,s=e.x-r,o=e.y-a,c=t.width/2,l=t.height/2;if(!s&&!o)throw new Error("Not possible to find intersection inside of the rectangle");return Math.abs(o)*c>Math.abs(s)*l?(o<0&&(l=-l),n=l*s/o,i=l):(s<0&&(c=-c),n=c,i=c*o/s),{x:r+n,y:a+i}}function ht(t){var e=c.Z(l.Z(dt(t)+1),(function(){return[]}));return i.Z(t.nodes(),(function(n){var i=t.node(n),r=i.rank;nt.Z(r)||(e[r][i.order]=n)})),e}function ut(t,e,n,i){var r={width:0,height:0};return arguments.length>=4&&(r.rank=n,r.order=i),ot(t,"border",r,e)}function dt(t){return Q(c.Z(t.nodes(),(function(e){var n=t.node(e).rank;if(!nt.Z(n))return n})))}function pt(t,e){var n=st();try{return e()}finally{console.log(t+" time: "+(st()-n)+"ms")}}function ft(t,e){return e()}function gt(t,e,n,i,r,a){var s={width:0,height:0,rank:a,borderType:e},o=r[e][a-1],c=ot(t,"border",s,n);r[e][a]=c,t.setParent(c,i),o&&t.setEdge(o,c,{weight:1})}function yt(t){var e=t.graph().rankdir.toLowerCase();"bt"!==e&&"rl"!==e||function(t){i.Z(t.nodes(),(function(e){_t(t.node(e))})),i.Z(t.edges(),(function(e){var n=t.edge(e);i.Z(n.points,_t),a.Z(n,"y")&&_t(n)}))}(t),"lr"!==e&&"rl"!==e||(!function(t){i.Z(t.nodes(),(function(e){xt(t.node(e))})),i.Z(t.edges(),(function(e){var n=t.edge(e);i.Z(n.points,xt),a.Z(n,"x")&&xt(n)}))}(t),mt(t))}function mt(t){i.Z(t.nodes(),(function(e){bt(t.node(e))})),i.Z(t.edges(),(function(e){bt(t.edge(e))}))}function bt(t){var e=t.width;t.width=t.height,t.height=e}function _t(t){t.y=-t.y}function xt(t){var e=t.x;t.x=t.y,t.y=e}function vt(t){t.graph().dummyChains=[],i.Z(t.edges(),(function(e){!function(t,e){var n,i,r,a=e.v,s=t.node(a).rank,o=e.w,c=t.node(o).rank,l=e.name,h=t.edge(e),u=h.labelRank;if(c===s+1)return;for(t.removeEdge(e),r=0,++s;s<c;++r,++s)h.points=[],n=ot(t,"edge",i={width:0,height:0,edgeLabel:h,edgeObj:e,rank:s},"_d"),s===u&&(i.width=h.width,i.height=h.height,i.dummy="edge-label",i.labelpos=h.labelpos),t.setEdge(a,n,{weight:h.weight},l),0===r&&t.graph().dummyChains.push(n),a=n;t.setEdge(a,o,{weight:h.weight},l)}(t,e)}))}const kt=function(t,e){return t&&t.length?V(t,(0,tt.Z)(e,2),it):void 0};function wt(t){var e={};i.Z(t.sources(),(function n(i){var r=t.node(i);if(a.Z(e,i))return r.rank;e[i]=!0;var s=rt(c.Z(t.outEdges(i),(function(e){return n(e.w)-t.edge(e).minlen})));return s!==Number.POSITIVE_INFINITY&&null!=s||(s=0),r.rank=s}))}function Ct(t,e){return t.node(e.w).rank-t.node(e.v).rank-t.edge(e).minlen}function Tt(t){var e,n,i=new h.k({directed:!1}),r=t.nodes()[0],a=t.nodeCount();for(i.setNode(r,{});Et(i,t)<a;)e=St(i,t),n=i.hasNode(e.v)?Ct(t,e):-Ct(t,e),At(i,t,n);return i}function Et(t,e){return i.Z(t.nodes(),(function n(r){i.Z(e.nodeEdges(r),(function(i){var a=i.v,s=r===a?i.w:a;t.hasNode(s)||Ct(e,i)||(t.setNode(s,{}),t.setEdge(r,s,{}),n(s))}))})),t.nodeCount()}function St(t,e){return kt(e.edges(),(function(n){if(t.hasNode(n.v)!==t.hasNode(n.w))return Ct(e,n)}))}function At(t,e,n){i.Z(t.nodes(),(function(t){e.node(t).rank+=n}))}var Lt=n(50585),Bt=n(17179);const Nt=function(t){return function(e,n,i){var r=Object(e);if(!(0,Lt.Z)(e)){var a=(0,tt.Z)(n,3);e=(0,Bt.Z)(e),n=function(t){return a(r[t],t,r)}}var s=t(e,n,i);return s>-1?r[a?e[s]:s]:void 0}};var Dt=n(21692),Ot=n(94099);const Mt=function(t){var e=(0,Ot.Z)(t),n=e%1;return e==e?n?e-n:e:0};var It=Math.max;const Ft=Nt((function(t,e,n){var i=null==t?0:t.length;if(!i)return-1;var r=null==n?0:Mt(n);return r<0&&(r=It(i+r,0)),(0,Dt.Z)(t,(0,tt.Z)(e,3),r)}));var $t=n(13445);s.Z(1);s.Z(1);n(39473),n(83970),n(93589),n(18533);(0,n(54193).Z)("length");RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");var Rt="\\ud800-\\udfff",Zt="["+Rt+"]",Pt="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",jt="\\ud83c[\\udffb-\\udfff]",Yt="[^"+Rt+"]",zt="(?:\\ud83c[\\udde6-\\uddff]){2}",Ut="[\\ud800-\\udbff][\\udc00-\\udfff]",Wt="(?:"+Pt+"|"+jt+")"+"?",qt="[\\ufe0e\\ufe0f]?",Ht=qt+Wt+("(?:\\u200d(?:"+[Yt,zt,Ut].join("|")+")"+qt+Wt+")*"),Vt="(?:"+[Yt+Pt+"?",Pt,zt,Ut,Zt].join("|")+")";RegExp(jt+"(?="+jt+")|"+Vt+Ht,"g");function Gt(){}function Xt(t,e,n){L.Z(e)||(e=[e]);var r=(t.isDirected()?t.successors:t.neighbors).bind(t),a=[],s={};return i.Z(e,(function(e){if(!t.hasNode(e))throw new Error("Graph does not have node: "+e);Qt(t,e,"post"===n,s,r,a)})),a}function Qt(t,e,n,r,s,o){a.Z(r,e)||(r[e]=!0,n||o.push(e),i.Z(s(e),(function(e){Qt(t,e,n,r,s,o)})),n&&o.push(e))}Gt.prototype=new Error;n(52544);function Kt(t){t=function(t){var e=(new h.k).setGraph(t.graph());return i.Z(t.nodes(),(function(n){e.setNode(n,t.node(n))})),i.Z(t.edges(),(function(n){var i=e.edge(n.v,n.w)||{weight:0,minlen:1},r=t.edge(n);e.setEdge(n.v,n.w,{weight:i.weight+r.weight,minlen:Math.max(i.minlen,r.minlen)})})),e}(t),wt(t);var e,n=Tt(t);for(ee(n),Jt(n,t);e=ie(n);)ae(n,t,e,re(n,t,e))}function Jt(t,e){var n=function(t,e){return Xt(t,e,"post")}(t,t.nodes());n=n.slice(0,n.length-1),i.Z(n,(function(n){!function(t,e,n){var i=t.node(n),r=i.parent;t.edge(n,r).cutvalue=te(t,e,n)}(t,e,n)}))}function te(t,e,n){var r=t.node(n).parent,a=!0,s=e.edge(n,r),o=0;return s||(a=!1,s=e.edge(r,n)),o=s.weight,i.Z(e.nodeEdges(n),(function(i){var s,c,l=i.v===n,h=l?i.w:i.v;if(h!==r){var u=l===a,d=e.edge(i).weight;if(o+=u?d:-d,s=n,c=h,t.hasEdge(s,c)){var p=t.edge(n,h).cutvalue;o+=u?-p:p}}})),o}function ee(t,e){arguments.length<2&&(e=t.nodes()[0]),ne(t,{},1,e)}function ne(t,e,n,r,s){var o=n,c=t.node(r);return e[r]=!0,i.Z(t.neighbors(r),(function(i){a.Z(e,i)||(n=ne(t,e,n,i,r))})),c.low=o,c.lim=n++,s?c.parent=s:delete c.parent,n}function ie(t){return Ft(t.edges(),(function(e){return t.edge(e).cutvalue<0}))}function re(t,e,n){var i=n.v,r=n.w;e.hasEdge(i,r)||(i=n.w,r=n.v);var a=t.node(i),s=t.node(r),o=a,c=!1;a.lim>s.lim&&(o=s,c=!0);var l=$t.Z(e.edges(),(function(e){return c===se(t,t.node(e.v),o)&&c!==se(t,t.node(e.w),o)}));return kt(l,(function(t){return Ct(e,t)}))}function ae(t,e,n,r){var a=n.v,s=n.w;t.removeEdge(a,s),t.setEdge(r.v,r.w,{}),ee(t),Jt(t,e),function(t,e){var n=Ft(t.nodes(),(function(t){return!e.node(t).parent})),r=function(t,e){return Xt(t,e,"pre")}(t,n);r=r.slice(1),i.Z(r,(function(n){var i=t.node(n).parent,r=e.edge(n,i),a=!1;r||(r=e.edge(i,n),a=!0),e.node(n).rank=e.node(i).rank+(a?r.minlen:-r.minlen)}))}(t,e)}function se(t,e,n){return n.low<=e.lim&&e.lim<=n.lim}function oe(t){switch(t.graph().ranker){case"network-simplex":default:le(t);break;case"tight-tree":!function(t){wt(t),Tt(t)}(t);break;case"longest-path":ce(t)}}Kt.initLowLimValues=ee,Kt.initCutValues=Jt,Kt.calcCutValue=te,Kt.leaveEdge=ie,Kt.enterEdge=re,Kt.exchangeEdges=ae;var ce=wt;function le(t){Kt(t)}var he=n(34148),ue=n(92344);function de(t){var e=ot(t,"root",{},"_root"),n=function(t){var e={};function n(r,a){var s=t.children(r);s&&s.length&&i.Z(s,(function(t){n(t,a+1)})),e[r]=a}return i.Z(t.children(),(function(t){n(t,1)})),e}(t),r=Q(he.Z(n))-1,a=2*r+1;t.graph().nestingRoot=e,i.Z(t.edges(),(function(e){t.edge(e).minlen*=a}));var s=function(t){return ue.Z(t.edges(),(function(e,n){return e+t.edge(n).weight}),0)}(t)+1;i.Z(t.children(),(function(i){pe(t,e,a,s,r,n,i)})),t.graph().nodeRankFactor=a}function pe(t,e,n,r,a,s,o){var c=t.children(o);if(c.length){var l=ut(t,"_bt"),h=ut(t,"_bb"),u=t.node(o);t.setParent(l,o),u.borderTop=l,t.setParent(h,o),u.borderBottom=h,i.Z(c,(function(i){pe(t,e,n,r,a,s,i);var c=t.node(i),u=c.borderTop?c.borderTop:i,d=c.borderBottom?c.borderBottom:i,p=c.borderTop?r:2*r,f=u!==d?1:a-s[o]+1;t.setEdge(l,u,{weight:p,minlen:f,nestingEdge:!0}),t.setEdge(d,h,{weight:p,minlen:f,nestingEdge:!0})})),t.parent(o)||t.setEdge(e,l,{weight:0,minlen:a+s[o]})}else o!==e&&t.setEdge(e,o,{weight:0,minlen:n})}var fe=n(48451);const ge=function(t){return(0,fe.Z)(t,5)};function ye(t,e,n){var s=function(t){var e;for(;t.hasNode(e=r.Z("_root")););return e}(t),o=new h.k({compound:!0}).setGraph({root:s}).setDefaultNodeLabel((function(e){return t.node(e)}));return i.Z(t.nodes(),(function(r){var c=t.node(r),l=t.parent(r);(c.rank===e||c.minRank<=e&&e<=c.maxRank)&&(o.setNode(r),o.setParent(r,l||s),i.Z(t[n](r),(function(e){var n=e.v===r?e.w:e.v,i=o.edge(n,r),a=nt.Z(i)?0:i.weight;o.setEdge(n,r,{weight:t.edge(e).weight+a})})),a.Z(c,"minRank")&&o.setNode(r,{borderLeft:c.borderLeft[e],borderRight:c.borderRight[e]}))})),o}var me=n(72954);const be=function(t,e,n){for(var i=-1,r=t.length,a=e.length,s={};++i<r;){var o=i<a?e[i]:void 0;n(s,t[i],o)}return s};const _e=function(t,e){return be(t||[],e||[],me.Z)};var xe=n(10626),ve=n(74073),ke=n(13317),we=n(21018);const Ce=function(t,e){var n=t.length;for(t.sort(e);n--;)t[n]=t[n].value;return t};var Te=n(21162);const Ee=function(t,e){if(t!==e){var n=void 0!==t,i=null===t,r=t==t,a=(0,H.Z)(t),s=void 0!==e,o=null===e,c=e==e,l=(0,H.Z)(e);if(!o&&!l&&!a&&t>e||a&&s&&c&&!o&&!l||i&&s&&c||!n&&c||!r)return 1;if(!i&&!a&&!l&&t<e||l&&n&&r&&!i&&!a||o&&n&&r||!s&&r||!c)return-1}return 0};const Se=function(t,e,n){for(var i=-1,r=t.criteria,a=e.criteria,s=r.length,o=n.length;++i<s;){var c=Ee(r[i],a[i]);if(c)return i>=o?c:c*("desc"==n[i]?-1:1)}return t.index-e.index};const Ae=function(t,e,n){e=e.length?(0,ve.Z)(e,(function(t){return(0,L.Z)(t)?function(e){return(0,ke.Z)(e,1===t.length?t[0]:t)}:t})):[X.Z];var i=-1;e=(0,ve.Z)(e,(0,Te.Z)(tt.Z));var r=(0,we.Z)(t,(function(t,n,r){return{criteria:(0,ve.Z)(e,(function(e){return e(t)})),index:++i,value:t}}));return Ce(r,(function(t,e){return Se(t,e,n)}))};const Le=(0,Y.Z)((function(t,e){if(null==t)return[];var n=e.length;return n>1&&(0,z.Z)(t,e[0],e[1])?e=[]:n>2&&(0,z.Z)(e[0],e[1],e[2])&&(e=[e[0]]),Ae(t,(0,xe.Z)(e,1),[])}));function Be(t,e){for(var n=0,i=1;i<e.length;++i)n+=Ne(t,e[i-1],e[i]);return n}function Ne(t,e,n){for(var r=_e(n,c.Z(n,(function(t,e){return e}))),a=o.Z(c.Z(e,(function(e){return Le(c.Z(t.outEdges(e),(function(e){return{pos:r[e.w],weight:t.edge(e).weight}})),"pos")}))),s=1;s<n.length;)s<<=1;var l=2*s-1;s-=1;var h=c.Z(new Array(l),(function(){return 0})),u=0;return i.Z(a.forEach((function(t){var e=t.pos+s;h[e]+=t.weight;for(var n=0;e>0;)e%2&&(n+=h[e+1]),h[e=e-1>>1]+=t.weight;u+=t.weight*n}))),u}function De(t,e){var n={};return i.Z(t,(function(t,e){var i=n[t.v]={indegree:0,in:[],out:[],vs:[t.v],i:e};nt.Z(t.barycenter)||(i.barycenter=t.barycenter,i.weight=t.weight)})),i.Z(e.edges(),(function(t){var e=n[t.v],i=n[t.w];nt.Z(e)||nt.Z(i)||(i.indegree++,e.out.push(n[t.w]))})),function(t){var e=[];function n(t){return function(e){e.merged||(nt.Z(e.barycenter)||nt.Z(t.barycenter)||e.barycenter>=t.barycenter)&&function(t,e){var n=0,i=0;t.weight&&(n+=t.barycenter*t.weight,i+=t.weight);e.weight&&(n+=e.barycenter*e.weight,i+=e.weight);t.vs=e.vs.concat(t.vs),t.barycenter=n/i,t.weight=i,t.i=Math.min(e.i,t.i),e.merged=!0}(t,e)}}function r(e){return function(n){n.in.push(e),0==--n.indegree&&t.push(n)}}for(;t.length;){var a=t.pop();e.push(a),i.Z(a.in.reverse(),n(a)),i.Z(a.out,r(a))}return c.Z($t.Z(e,(function(t){return!t.merged})),(function(t){return W.Z(t,["vs","i","barycenter","weight"])}))}($t.Z(n,(function(t){return!t.indegree})))}function Oe(t,e){var n,r=function(t,e){var n={lhs:[],rhs:[]};return i.Z(t,(function(t){e(t)?n.lhs.push(t):n.rhs.push(t)})),n}(t,(function(t){return a.Z(t,"barycenter")})),s=r.lhs,c=Le(r.rhs,(function(t){return-t.i})),l=[],h=0,u=0,d=0;s.sort((n=!!e,function(t,e){return t.barycenter<e.barycenter?-1:t.barycenter>e.barycenter?1:n?e.i-t.i:t.i-e.i})),d=Me(l,c,d),i.Z(s,(function(t){d+=t.vs.length,l.push(t.vs),h+=t.barycenter*t.weight,u+=t.weight,d=Me(l,c,d)}));var p={vs:o.Z(l)};return u&&(p.barycenter=h/u,p.weight=u),p}function Me(t,e,n){for(var i;e.length&&(i=K(e)).i<=n;)e.pop(),t.push(i.vs),n++;return n}function Ie(t,e,n,r){var s=t.children(e),l=t.node(e),h=l?l.borderLeft:void 0,u=l?l.borderRight:void 0,d={};h&&(s=$t.Z(s,(function(t){return t!==h&&t!==u})));var p=function(t,e){return c.Z(e,(function(e){var n=t.inEdges(e);if(n.length){var i=ue.Z(n,(function(e,n){var i=t.edge(n),r=t.node(n.v);return{sum:e.sum+i.weight*r.order,weight:e.weight+i.weight}}),{sum:0,weight:0});return{v:e,barycenter:i.sum/i.weight,weight:i.weight}}return{v:e}}))}(t,s);i.Z(p,(function(e){if(t.children(e.v).length){var i=Ie(t,e.v,n,r);d[e.v]=i,a.Z(i,"barycenter")&&(s=e,o=i,nt.Z(s.barycenter)?(s.barycenter=o.barycenter,s.weight=o.weight):(s.barycenter=(s.barycenter*s.weight+o.barycenter*o.weight)/(s.weight+o.weight),s.weight+=o.weight))}var s,o}));var f=De(p,n);!function(t,e){i.Z(t,(function(t){t.vs=o.Z(t.vs.map((function(t){return e[t]?e[t].vs:t})))}))}(f,d);var g=Oe(f,r);if(h&&(g.vs=o.Z([h,g.vs,u]),t.predecessors(h).length)){var y=t.node(t.predecessors(h)[0]),m=t.node(t.predecessors(u)[0]);a.Z(g,"barycenter")||(g.barycenter=0,g.weight=0),g.barycenter=(g.barycenter*g.weight+y.order+m.order)/(g.weight+2),g.weight+=2}return g}function Fe(t){var e=dt(t),n=$e(t,l.Z(1,e+1),"inEdges"),r=$e(t,l.Z(e-1,-1,-1),"outEdges"),s=function(t){var e={},n=$t.Z(t.nodes(),(function(e){return!t.children(e).length})),r=Q(c.Z(n,(function(e){return t.node(e).rank}))),s=c.Z(l.Z(r+1),(function(){return[]})),o=Le(n,(function(e){return t.node(e).rank}));return i.Z(o,(function n(r){if(!a.Z(e,r)){e[r]=!0;var o=t.node(r);s[o.rank].push(r),i.Z(t.successors(r),n)}})),s}(t);Ze(t,s);for(var o,h=Number.POSITIVE_INFINITY,u=0,d=0;d<4;++u,++d){Re(u%2?n:r,u%4>=2);var p=Be(t,s=ht(t));p<h&&(d=0,o=ge(s),h=p)}Ze(t,o)}function $e(t,e,n){return c.Z(e,(function(e){return ye(t,e,n)}))}function Re(t,e){var n=new h.k;i.Z(t,(function(t){var r=t.graph().root,a=Ie(t,r,n,e);i.Z(a.vs,(function(e,n){t.node(e).order=n})),function(t,e,n){var r,a={};i.Z(n,(function(n){for(var i,s,o=t.parent(n);o;){if((i=t.parent(o))?(s=a[i],a[i]=o):(s=r,r=o),s&&s!==o)return void e.setEdge(s,o);o=i}}))}(t,n,a.vs)}))}function Ze(t,e){i.Z(e,(function(e){i.Z(e,(function(e,n){t.node(e).order=n}))}))}function Pe(t){var e=function(t){var e={},n=0;function r(a){var s=n;i.Z(t.children(a),r),e[a]={low:s,lim:n++}}return i.Z(t.children(),r),e}(t);i.Z(t.graph().dummyChains,(function(n){for(var i=t.node(n),r=i.edgeObj,a=function(t,e,n,i){var r,a,s=[],o=[],c=Math.min(e[n].low,e[i].low),l=Math.max(e[n].lim,e[i].lim);r=n;do{r=t.parent(r),s.push(r)}while(r&&(e[r].low>c||l>e[r].lim));a=r,r=i;for(;(r=t.parent(r))!==a;)o.push(r);return{path:s.concat(o.reverse()),lca:a}}(t,e,r.v,r.w),s=a.path,o=a.lca,c=0,l=s[c],h=!0;n!==r.w;){if(i=t.node(n),h){for(;(l=s[c])!==o&&t.node(l).maxRank<i.rank;)c++;l===o&&(h=!1)}if(!h){for(;c<s.length-1&&t.node(l=s[c+1]).minRank<=i.rank;)c++;l=s[c]}t.setParent(n,l),n=t.successors(n)[0]}}))}var je=n(68882);const Ye=function(t,e){return null==t?t:(0,w.Z)(t,(0,je.Z)(e),R.Z)};function ze(t,e){var n={};return ue.Z(e,(function(e,r){var a=0,s=0,o=e.length,c=K(r);return i.Z(r,(function(e,l){var h=function(t,e){if(t.node(e).dummy)return Ft(t.predecessors(e),(function(e){return t.node(e).dummy}))}(t,e),u=h?t.node(h).order:o;(h||e===c)&&(i.Z(r.slice(s,l+1),(function(e){i.Z(t.predecessors(e),(function(i){var r=t.node(i),s=r.order;!(s<a||u<s)||r.dummy&&t.node(e).dummy||Ue(n,i,e)}))})),s=l+1,a=u)})),r})),n}function Ue(t,e,n){if(e>n){var i=e;e=n,n=i}var r=t[e];r||(t[e]=r={}),r[n]=!0}function We(t,e,n){if(e>n){var i=e;e=n,n=i}return a.Z(t[e],n)}function qe(t,e,n,r,s){var o={},c=function(t,e,n,r){var s=new h.k,o=t.graph(),c=function(t,e,n){return function(i,r,s){var o,c=i.node(r),l=i.node(s),h=0;if(h+=c.width/2,a.Z(c,"labelpos"))switch(c.labelpos.toLowerCase()){case"l":o=-c.width/2;break;case"r":o=c.width/2}if(o&&(h+=n?o:-o),o=0,h+=(c.dummy?e:t)/2,h+=(l.dummy?e:t)/2,h+=l.width/2,a.Z(l,"labelpos"))switch(l.labelpos.toLowerCase()){case"l":o=l.width/2;break;case"r":o=-l.width/2}return o&&(h+=n?o:-o),o=0,h}}(o.nodesep,o.edgesep,r);return i.Z(e,(function(e){var r;i.Z(e,(function(e){var i=n[e];if(s.setNode(i),r){var a=n[r],o=s.edge(a,i);s.setEdge(a,i,Math.max(c(t,e,r),o||0))}r=e}))})),s}(t,e,n,s),l=s?"borderLeft":"borderRight";function u(t,e){for(var n=c.nodes(),i=n.pop(),r={};i;)r[i]?t(i):(r[i]=!0,n.push(i),n=n.concat(e(i))),i=n.pop()}return u((function(t){o[t]=c.inEdges(t).reduce((function(t,e){return Math.max(t,o[e.v]+c.edge(e))}),0)}),c.predecessors.bind(c)),u((function(e){var n=c.outEdges(e).reduce((function(t,e){return Math.min(t,o[e.w]-c.edge(e))}),Number.POSITIVE_INFINITY),i=t.node(e);n!==Number.POSITIVE_INFINITY&&i.borderType!==l&&(o[e]=Math.max(o[e],n))}),c.successors.bind(c)),i.Z(r,(function(t){o[t]=o[n[t]]})),o}function He(t){var e,n=ht(t),r=U(ze(t,n),function(t,e){var n={};function r(e,r,a,s,o){var c;i.Z(l.Z(r,a),(function(r){c=e[r],t.node(c).dummy&&i.Z(t.predecessors(c),(function(e){var i=t.node(e);i.dummy&&(i.order<s||i.order>o)&&Ue(n,e,c)}))}))}return ue.Z(e,(function(e,n){var a,s=-1,o=0;return i.Z(n,(function(i,c){if("border"===t.node(i).dummy){var l=t.predecessors(i);l.length&&(a=t.node(l[0]).order,r(n,o,c,s,a),o=c,s=a)}r(n,o,n.length,a,e.length)})),n})),n}(t,n)),a={};i.Z(["u","d"],(function(s){e="u"===s?n:he.Z(n).reverse(),i.Z(["l","r"],(function(n){"r"===n&&(e=c.Z(e,(function(t){return he.Z(t).reverse()})));var o=("u"===s?t.predecessors:t.successors).bind(t),l=function(t,e,n,r){var a={},s={},o={};return i.Z(e,(function(t){i.Z(t,(function(t,e){a[t]=t,s[t]=t,o[t]=e}))})),i.Z(e,(function(t){var e=-1;i.Z(t,(function(t){var i=r(t);if(i.length){i=Le(i,(function(t){return o[t]}));for(var c=(i.length-1)/2,l=Math.floor(c),h=Math.ceil(c);l<=h;++l){var u=i[l];s[t]===t&&e<o[u]&&!We(n,t,u)&&(s[u]=t,s[t]=a[t]=a[u],e=o[u])}}}))})),{root:a,align:s}}(0,e,r,o),h=qe(t,e,l.root,l.align,"r"===n);"r"===n&&(h=et(h,(function(t){return-t}))),a[s+n]=h}))}));var s=function(t,e){return kt(he.Z(e),(function(e){var n=Number.NEGATIVE_INFINITY,i=Number.POSITIVE_INFINITY;return Ye(e,(function(e,r){var a=function(t,e){return t.node(e).width}(t,r)/2;n=Math.max(e+a,n),i=Math.min(e-a,i)})),n-i}))}(t,a);return function(t,e){var n=he.Z(e),r=rt(n),a=Q(n);i.Z(["u","d"],(function(n){i.Z(["l","r"],(function(i){var s,o=n+i,c=t[o];if(c!==e){var l=he.Z(c);(s="l"===i?r-rt(l):a-Q(l))&&(t[o]=et(c,(function(t){return t+s})))}}))}))}(a,s),function(t,e){return et(t.ul,(function(n,i){if(e)return t[e.toLowerCase()][i];var r=Le(c.Z(t,i));return(r[1]+r[2])/2}))}(a,t.graph().align)}function Ve(t){(function(t){var e=ht(t),n=t.graph().ranksep,r=0;i.Z(e,(function(e){var a=Q(c.Z(e,(function(e){return t.node(e).height})));i.Z(e,(function(e){t.node(e).y=r+a/2})),r+=a+n}))})(t=ct(t)),i.Z(He(t),(function(e,n){t.node(n).x=e}))}function Ge(t,e){var n=e&&e.debugTiming?pt:ft;n("layout",(function(){var e=n(" buildLayoutGraph",(function(){return function(t){var e=new h.k({multigraph:!0,compound:!0}),n=sn(t.graph());return e.setGraph(U({},Qe,an(n,Xe),W.Z(n,Ke))),i.Z(t.nodes(),(function(n){var i=sn(t.node(n));e.setNode(n,q.Z(an(i,Je),tn)),e.setParent(n,t.parent(n))})),i.Z(t.edges(),(function(n){var i=sn(t.edge(n));e.setEdge(n,U({},nn,an(i,en),W.Z(i,rn)))})),e}(t)}));n(" runLayout",(function(){!function(t,e){e(" makeSpaceForEdgeLabels",(function(){!function(t){var e=t.graph();e.ranksep/=2,i.Z(t.edges(),(function(n){var i=t.edge(n);i.minlen*=2,"c"!==i.labelpos.toLowerCase()&&("TB"===e.rankdir||"BT"===e.rankdir?i.width+=i.labeloffset:i.height+=i.labeloffset)}))}(t)})),e(" removeSelfEdges",(function(){!function(t){i.Z(t.edges(),(function(e){if(e.v===e.w){var n=t.node(e.v);n.selfEdges||(n.selfEdges=[]),n.selfEdges.push({e:e,label:t.edge(e)}),t.removeEdge(e)}}))}(t)})),e(" acyclic",(function(){b(t)})),e(" nestingGraph.run",(function(){de(t)})),e(" rank",(function(){oe(ct(t))})),e(" injectEdgeLabelProxies",(function(){!function(t){i.Z(t.edges(),(function(e){var n=t.edge(e);if(n.width&&n.height){var i=t.node(e.v),r={rank:(t.node(e.w).rank-i.rank)/2+i.rank,e:e};ot(t,"edge-proxy",r,"_ep")}}))}(t)})),e(" removeEmptyRanks",(function(){!function(t){var e=rt(c.Z(t.nodes(),(function(e){return t.node(e).rank}))),n=[];i.Z(t.nodes(),(function(i){var r=t.node(i).rank-e;n[r]||(n[r]=[]),n[r].push(i)}));var r=0,a=t.graph().nodeRankFactor;i.Z(n,(function(e,n){nt.Z(e)&&n%a!=0?--r:r&&i.Z(e,(function(e){t.node(e).rank+=r}))}))}(t)})),e(" nestingGraph.cleanup",(function(){!function(t){var e=t.graph();t.removeNode(e.nestingRoot),delete e.nestingRoot,i.Z(t.edges(),(function(e){t.edge(e).nestingEdge&&t.removeEdge(e)}))}(t)})),e(" normalizeRanks",(function(){!function(t){var e=rt(c.Z(t.nodes(),(function(e){return t.node(e).rank})));i.Z(t.nodes(),(function(n){var i=t.node(n);a.Z(i,"rank")&&(i.rank-=e)}))}(t)})),e(" assignRankMinMax",(function(){!function(t){var e=0;i.Z(t.nodes(),(function(n){var i=t.node(n);i.borderTop&&(i.minRank=t.node(i.borderTop).rank,i.maxRank=t.node(i.borderBottom).rank,e=Q(e,i.maxRank))})),t.graph().maxRank=e}(t)})),e(" removeEdgeLabelProxies",(function(){!function(t){i.Z(t.nodes(),(function(e){var n=t.node(e);"edge-proxy"===n.dummy&&(t.edge(n.e).labelRank=n.rank,t.removeNode(e))}))}(t)})),e(" normalize.run",(function(){vt(t)})),e(" parentDummyChains",(function(){Pe(t)})),e(" addBorderSegments",(function(){!function(t){i.Z(t.children(),(function e(n){var r=t.children(n),s=t.node(n);if(r.length&&i.Z(r,e),a.Z(s,"minRank")){s.borderLeft=[],s.borderRight=[];for(var o=s.minRank,c=s.maxRank+1;o<c;++o)gt(t,"borderLeft","_bl",n,s,o),gt(t,"borderRight","_br",n,s,o)}}))}(t)})),e(" order",(function(){Fe(t)})),e(" insertSelfEdges",(function(){!function(t){var e=ht(t);i.Z(e,(function(e){var n=0;i.Z(e,(function(e,r){var a=t.node(e);a.order=r+n,i.Z(a.selfEdges,(function(e){ot(t,"selfedge",{width:e.label.width,height:e.label.height,rank:a.rank,order:r+ ++n,e:e.e,label:e.label},"_se")})),delete a.selfEdges}))}))}(t)})),e(" adjustCoordinateSystem",(function(){!function(t){var e=t.graph().rankdir.toLowerCase();"lr"!==e&&"rl"!==e||mt(t)}(t)})),e(" position",(function(){Ve(t)})),e(" positionSelfEdges",(function(){!function(t){i.Z(t.nodes(),(function(e){var n=t.node(e);if("selfedge"===n.dummy){var i=t.node(n.e.v),r=i.x+i.width/2,a=i.y,s=n.x-r,o=i.height/2;t.setEdge(n.e,n.label),t.removeNode(e),n.label.points=[{x:r+2*s/3,y:a-o},{x:r+5*s/6,y:a-o},{x:r+s,y:a},{x:r+5*s/6,y:a+o},{x:r+2*s/3,y:a+o}],n.label.x=n.x,n.label.y=n.y}}))}(t)})),e(" removeBorderNodes",(function(){!function(t){i.Z(t.nodes(),(function(e){if(t.children(e).length){var n=t.node(e),i=t.node(n.borderTop),r=t.node(n.borderBottom),a=t.node(K(n.borderLeft)),s=t.node(K(n.borderRight));n.width=Math.abs(s.x-a.x),n.height=Math.abs(r.y-i.y),n.x=a.x+n.width/2,n.y=i.y+n.height/2}})),i.Z(t.nodes(),(function(e){"border"===t.node(e).dummy&&t.removeNode(e)}))}(t)})),e(" normalize.undo",(function(){!function(t){i.Z(t.graph().dummyChains,(function(e){var n,i=t.node(e),r=i.edgeLabel;for(t.setEdge(i.edgeObj,r);i.dummy;)n=t.successors(e)[0],t.removeNode(e),r.points.push({x:i.x,y:i.y}),"edge-label"===i.dummy&&(r.x=i.x,r.y=i.y,r.width=i.width,r.height=i.height),e=n,i=t.node(e)}))}(t)})),e(" fixupEdgeLabelCoords",(function(){!function(t){i.Z(t.edges(),(function(e){var n=t.edge(e);if(a.Z(n,"x"))switch("l"!==n.labelpos&&"r"!==n.labelpos||(n.width-=n.labeloffset),n.labelpos){case"l":n.x-=n.width/2+n.labeloffset;break;case"r":n.x+=n.width/2+n.labeloffset}}))}(t)})),e(" undoCoordinateSystem",(function(){yt(t)})),e(" translateGraph",(function(){!function(t){var e=Number.POSITIVE_INFINITY,n=0,r=Number.POSITIVE_INFINITY,s=0,o=t.graph(),c=o.marginx||0,l=o.marginy||0;function h(t){var i=t.x,a=t.y,o=t.width,c=t.height;e=Math.min(e,i-o/2),n=Math.max(n,i+o/2),r=Math.min(r,a-c/2),s=Math.max(s,a+c/2)}i.Z(t.nodes(),(function(e){h(t.node(e))})),i.Z(t.edges(),(function(e){var n=t.edge(e);a.Z(n,"x")&&h(n)})),e-=c,r-=l,i.Z(t.nodes(),(function(n){var i=t.node(n);i.x-=e,i.y-=r})),i.Z(t.edges(),(function(n){var s=t.edge(n);i.Z(s.points,(function(t){t.x-=e,t.y-=r})),a.Z(s,"x")&&(s.x-=e),a.Z(s,"y")&&(s.y-=r)})),o.width=n-e+c,o.height=s-r+l}(t)})),e(" assignNodeIntersects",(function(){!function(t){i.Z(t.edges(),(function(e){var n,i,r=t.edge(e),a=t.node(e.v),s=t.node(e.w);r.points?(n=r.points[0],i=r.points[r.points.length-1]):(r.points=[],n=s,i=a),r.points.unshift(lt(a,n)),r.points.push(lt(s,i))}))}(t)})),e(" reversePoints",(function(){!function(t){i.Z(t.edges(),(function(e){var n=t.edge(e);n.reversed&&n.points.reverse()}))}(t)})),e(" acyclic.undo",(function(){!function(t){i.Z(t.edges(),(function(e){var n=t.edge(e);if(n.reversed){t.removeEdge(e);var i=n.forwardName;delete n.reversed,delete n.forwardName,t.setEdge(e.w,e.v,n,i)}}))}(t)}))}(e,n)})),n(" updateInputGraph",(function(){!function(t,e){i.Z(t.nodes(),(function(n){var i=t.node(n),r=e.node(n);i&&(i.x=r.x,i.y=r.y,e.children(n).length&&(i.width=r.width,i.height=r.height))})),i.Z(t.edges(),(function(n){var i=t.edge(n),r=e.edge(n);i.points=r.points,a.Z(r,"x")&&(i.x=r.x,i.y=r.y)})),t.graph().width=e.graph().width,t.graph().height=e.graph().height}(t,e)}))}))}var Xe=["nodesep","edgesep","ranksep","marginx","marginy"],Qe={ranksep:50,edgesep:20,nodesep:50,rankdir:"tb"},Ke=["acyclicer","ranker","rankdir","align"],Je=["width","height"],tn={width:0,height:0},en=["minlen","weight","width","height","labeloffset"],nn={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:"r"},rn=["labelpos"];function an(t,e){return et(W.Z(t,e),Number)}function sn(t){var e={};return i.Z(t,(function(t,n){e[n.toLowerCase()]=t})),e}},52544:(t,e,n)=>{"use strict";n.d(e,{k:()=>M});var i=n(17452),r=n(62002),a=n(73234),s=n(17179),o=n(13445),c=n(79697),l=n(70870),h=n(49360),u=n(10626),d=n(69581),p=n(63001),f=n(21692);const g=function(t){return t!=t};const y=function(t,e,n){for(var i=n-1,r=t.length;++i<r;)if(t[i]===e)return i;return-1};const m=function(t,e,n){return e==e?y(t,e,n):(0,f.Z)(t,g,n)};const b=function(t,e){return!!(null==t?0:t.length)&&m(t,e,0)>-1};const _=function(t,e,n){for(var i=-1,r=null==t?0:t.length;++i<r;)if(n(e,t[i]))return!0;return!1};var x=n(59548),v=n(93203);const k=function(){};var w=n(6545),C=v.Z&&1/(0,w.Z)(new v.Z([,-0]))[1]==1/0?function(t){return new v.Z(t)}:k;const T=C;const E=function(t,e,n){var i=-1,r=b,a=t.length,s=!0,o=[],c=o;if(n)s=!1,r=_;else if(a>=200){var l=e?null:T(t);if(l)return(0,w.Z)(l);s=!1,r=x.Z,c=new p.Z}else c=e?[]:o;t:for(;++i<a;){var h=t[i],u=e?e(h):h;if(h=n||0!==h?h:0,s&&u==u){for(var d=c.length;d--;)if(c[d]===u)continue t;e&&c.push(u),o.push(h)}else r(c,u,n)||(c!==o&&c.push(u),o.push(h))}return o};var S=n(836);const A=(0,d.Z)((function(t){return E((0,u.Z)(t,1,S.Z,!0))}));var L=n(34148),B=n(92344),N="\0",D="\0",O="\x01";class M{constructor(t={}){this._isDirected=!i.Z(t,"directed")||t.directed,this._isMultigraph=!!i.Z(t,"multigraph")&&t.multigraph,this._isCompound=!!i.Z(t,"compound")&&t.compound,this._label=void 0,this._defaultNodeLabelFn=r.Z(void 0),this._defaultEdgeLabelFn=r.Z(void 0),this._nodes={},this._isCompound&&(this._parent={},this._children={},this._children[D]={}),this._in={},this._preds={},this._out={},this._sucs={},this._edgeObjs={},this._edgeLabels={}}isDirected(){return this._isDirected}isMultigraph(){return this._isMultigraph}isCompound(){return this._isCompound}setGraph(t){return this._label=t,this}graph(){return this._label}setDefaultNodeLabel(t){return a.Z(t)||(t=r.Z(t)),this._defaultNodeLabelFn=t,this}nodeCount(){return this._nodeCount}nodes(){return s.Z(this._nodes)}sources(){var t=this;return o.Z(this.nodes(),(function(e){return c.Z(t._in[e])}))}sinks(){var t=this;return o.Z(this.nodes(),(function(e){return c.Z(t._out[e])}))}setNodes(t,e){var n=arguments,i=this;return l.Z(t,(function(t){n.length>1?i.setNode(t,e):i.setNode(t)})),this}setNode(t,e){return i.Z(this._nodes,t)?(arguments.length>1&&(this._nodes[t]=e),this):(this._nodes[t]=arguments.length>1?e:this._defaultNodeLabelFn(t),this._isCompound&&(this._parent[t]=D,this._children[t]={},this._children[D][t]=!0),this._in[t]={},this._preds[t]={},this._out[t]={},this._sucs[t]={},++this._nodeCount,this)}node(t){return this._nodes[t]}hasNode(t){return i.Z(this._nodes,t)}removeNode(t){var e=this;if(i.Z(this._nodes,t)){var n=function(t){e.removeEdge(e._edgeObjs[t])};delete this._nodes[t],this._isCompound&&(this._removeFromParentsChildList(t),delete this._parent[t],l.Z(this.children(t),(function(t){e.setParent(t)})),delete this._children[t]),l.Z(s.Z(this._in[t]),n),delete this._in[t],delete this._preds[t],l.Z(s.Z(this._out[t]),n),delete this._out[t],delete this._sucs[t],--this._nodeCount}return this}setParent(t,e){if(!this._isCompound)throw new Error("Cannot set parent in a non-compound graph");if(h.Z(e))e=D;else{for(var n=e+="";!h.Z(n);n=this.parent(n))if(n===t)throw new Error("Setting "+e+" as parent of "+t+" would create a cycle");this.setNode(e)}return this.setNode(t),this._removeFromParentsChildList(t),this._parent[t]=e,this._children[e][t]=!0,this}_removeFromParentsChildList(t){delete this._children[this._parent[t]][t]}parent(t){if(this._isCompound){var e=this._parent[t];if(e!==D)return e}}children(t){if(h.Z(t)&&(t=D),this._isCompound){var e=this._children[t];if(e)return s.Z(e)}else{if(t===D)return this.nodes();if(this.hasNode(t))return[]}}predecessors(t){var e=this._preds[t];if(e)return s.Z(e)}successors(t){var e=this._sucs[t];if(e)return s.Z(e)}neighbors(t){var e=this.predecessors(t);if(e)return A(e,this.successors(t))}isLeaf(t){return 0===(this.isDirected()?this.successors(t):this.neighbors(t)).length}filterNodes(t){var e=new this.constructor({directed:this._isDirected,multigraph:this._isMultigraph,compound:this._isCompound});e.setGraph(this.graph());var n=this;l.Z(this._nodes,(function(n,i){t(i)&&e.setNode(i,n)})),l.Z(this._edgeObjs,(function(t){e.hasNode(t.v)&&e.hasNode(t.w)&&e.setEdge(t,n.edge(t))}));var i={};function r(t){var a=n.parent(t);return void 0===a||e.hasNode(a)?(i[t]=a,a):a in i?i[a]:r(a)}return this._isCompound&&l.Z(e.nodes(),(function(t){e.setParent(t,r(t))})),e}setDefaultEdgeLabel(t){return a.Z(t)||(t=r.Z(t)),this._defaultEdgeLabelFn=t,this}edgeCount(){return this._edgeCount}edges(){return L.Z(this._edgeObjs)}setPath(t,e){var n=this,i=arguments;return B.Z(t,(function(t,r){return i.length>1?n.setEdge(t,r,e):n.setEdge(t,r),r})),this}setEdge(){var t,e,n,r,a=!1,s=arguments[0];"object"==typeof s&&null!==s&&"v"in s?(t=s.v,e=s.w,n=s.name,2===arguments.length&&(r=arguments[1],a=!0)):(t=s,e=arguments[1],n=arguments[3],arguments.length>2&&(r=arguments[2],a=!0)),t=""+t,e=""+e,h.Z(n)||(n=""+n);var o=$(this._isDirected,t,e,n);if(i.Z(this._edgeLabels,o))return a&&(this._edgeLabels[o]=r),this;if(!h.Z(n)&&!this._isMultigraph)throw new Error("Cannot set a named edge when isMultigraph = false");this.setNode(t),this.setNode(e),this._edgeLabels[o]=a?r:this._defaultEdgeLabelFn(t,e,n);var c=function(t,e,n,i){var r=""+e,a=""+n;if(!t&&r>a){var s=r;r=a,a=s}var o={v:r,w:a};i&&(o.name=i);return o}(this._isDirected,t,e,n);return t=c.v,e=c.w,Object.freeze(c),this._edgeObjs[o]=c,I(this._preds[e],t),I(this._sucs[t],e),this._in[e][o]=c,this._out[t][o]=c,this._edgeCount++,this}edge(t,e,n){var i=1===arguments.length?R(this._isDirected,arguments[0]):$(this._isDirected,t,e,n);return this._edgeLabels[i]}hasEdge(t,e,n){var r=1===arguments.length?R(this._isDirected,arguments[0]):$(this._isDirected,t,e,n);return i.Z(this._edgeLabels,r)}removeEdge(t,e,n){var i=1===arguments.length?R(this._isDirected,arguments[0]):$(this._isDirected,t,e,n),r=this._edgeObjs[i];return r&&(t=r.v,e=r.w,delete this._edgeLabels[i],delete this._edgeObjs[i],F(this._preds[e],t),F(this._sucs[t],e),delete this._in[e][i],delete this._out[t][i],this._edgeCount--),this}inEdges(t,e){var n=this._in[t];if(n){var i=L.Z(n);return e?o.Z(i,(function(t){return t.v===e})):i}}outEdges(t,e){var n=this._out[t];if(n){var i=L.Z(n);return e?o.Z(i,(function(t){return t.w===e})):i}}nodeEdges(t,e){var n=this.inEdges(t,e);if(n)return n.concat(this.outEdges(t,e))}}function I(t,e){t[e]?t[e]++:t[e]=1}function F(t,e){--t[e]||delete t[e]}function $(t,e,n,i){var r=""+e,a=""+n;if(!t&&r>a){var s=r;r=a,a=s}return r+O+a+O+(h.Z(i)?N:i)}function R(t,e){return $(t,e.v,e.w,e.name)}M.prototype._nodeCount=0,M.prototype._edgeCount=0},45625:(t,e,n)=>{"use strict";n.d(e,{k:()=>i.k});var i=n(52544)},39354:(t,e,n)=>{"use strict";n.d(e,{c:()=>o});var i=n(49360),r=n(48451);const a=function(t){return(0,r.Z)(t,4)};var s=n(43836);n(52544);function o(t){var e={options:{directed:t.isDirected(),multigraph:t.isMultigraph(),compound:t.isCompound()},nodes:c(t),edges:l(t)};return i.Z(t.graph())||(e.value=a(t.graph())),e}function c(t){return s.Z(t.nodes(),(function(e){var n=t.node(e),r=t.parent(e),a={v:e};return i.Z(n)||(a.value=n),i.Z(r)||(a.parent=r),a}))}function l(t){return s.Z(t.edges(),(function(e){var n=t.edge(e),r={v:e.v,w:e.w};return i.Z(e.name)||(r.name=e.name),i.Z(n)||(r.value=n),r}))}},91518:(t,e,n)=>{"use strict";n.d(e,{sY:()=>T});var i=n(59373),r=n(17452),a=n(3688),s=n(70870),o=n(70277),c=n(96225),l={normal:function(t,e,n,i){var r=t.append("marker").attr("id",e).attr("viewBox","0 0 10 10").attr("refX",9).attr("refY",5).attr("markerUnits","strokeWidth").attr("markerWidth",8).attr("markerHeight",6).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z").style("stroke-width",1).style("stroke-dasharray","1,0");c.bg(r,n[i+"Style"]),n[i+"Class"]&&r.attr("class",n[i+"Class"])},vee:function(t,e,n,i){var r=t.append("marker").attr("id",e).attr("viewBox","0 0 10 10").attr("refX",9).attr("refY",5).attr("markerUnits","strokeWidth").attr("markerWidth",8).attr("markerHeight",6).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 L 4 5 z").style("stroke-width",1).style("stroke-dasharray","1,0");c.bg(r,n[i+"Style"]),n[i+"Class"]&&r.attr("class",n[i+"Class"])},undirected:function(t,e,n,i){var r=t.append("marker").attr("id",e).attr("viewBox","0 0 10 10").attr("refX",9).attr("refY",5).attr("markerUnits","strokeWidth").attr("markerWidth",8).attr("markerHeight",6).attr("orient","auto").append("path").attr("d","M 0 5 L 10 5").style("stroke-width",1).style("stroke-dasharray","1,0");c.bg(r,n[i+"Style"]),n[i+"Class"]&&r.attr("class",n[i+"Class"])}};var h=n(43349);function u(t,e,n){var i=e.label,r=t.append("g");"svg"===e.labelType?function(t,e){var n=t;n.node().appendChild(e.label),c.bg(n,e.labelStyle)}(r,e):"string"!=typeof i||"html"===e.labelType?(0,h.a)(r,e):function(t,e){for(var n=t.append("text"),i=function(t){for(var e,n="",i=!1,r=0;r<t.length;++r)e=t[r],i?(n+="n"===e?"\n":e,i=!1):"\\"===e?i=!0:n+=e;return n}(e.label).split("\n"),r=0;r<i.length;r++)n.append("tspan").attr("xml:space","preserve").attr("dy","1em").attr("x","1").text(i[r]);c.bg(n,e.labelStyle)}(r,e);var a,s=r.node().getBBox();switch(n){case"top":a=-e.height/2;break;case"bottom":a=e.height/2-s.height;break;default:a=-s.height/2}return r.attr("transform","translate("+-s.width/2+","+a+")"),r}var d=function(t,e){var n=e.nodes().filter((function(t){return c.bF(e,t)})),r=t.selectAll("g.cluster").data(n,(function(t){return t}));c.WR(r.exit(),e).style("opacity",0).remove();var a=r.enter().append("g").attr("class","cluster").attr("id",(function(t){return e.node(t).id})).style("opacity",0).each((function(t){var n=e.node(t),r=i.Ys(this);i.Ys(this).append("rect"),u(r.append("g").attr("class","label"),n,n.clusterLabelPos)}));return r=r.merge(a),(r=c.WR(r,e).style("opacity",1)).selectAll("rect").each((function(t){var n=e.node(t),r=i.Ys(this);c.bg(r,n.style)})),r};let p=function(t,e){var n,a=t.selectAll("g.edgeLabel").data(e.edges(),(function(t){return c.O1(t)})).classed("update",!0);return a.exit().remove(),a.enter().append("g").classed("edgeLabel",!0).style("opacity",0),(a=t.selectAll("g.edgeLabel")).each((function(t){var n=i.Ys(this);n.select(".label").remove();var a=e.edge(t),s=u(n,e.edge(t),0).classed("label",!0),o=s.node().getBBox();a.labelId&&s.attr("id",a.labelId),r.Z(a,"width")||(a.width=o.width),r.Z(a,"height")||(a.height=o.height)})),n=a.exit?a.exit():a.selectAll(null),c.WR(n,e).style("opacity",0).remove(),a};var f=n(66749),g=n(74379);function y(t,e){return t.intersect(e)}var m=function(t,e,n){var r=t.selectAll("g.edgePath").data(e.edges(),(function(t){return c.O1(t)})).classed("update",!0),a=function(t,e){var n=t.enter().append("g").attr("class","edgePath").style("opacity",0);return n.append("path").attr("class","path").attr("d",(function(t){var n=e.edge(t),i=e.node(t.v).elem;return b(n,g.Z(n.points.length).map((function(){return e=(t=i).getBBox(),{x:(n=t.ownerSVGElement.getScreenCTM().inverse().multiply(t.getScreenCTM()).translate(e.width/2,e.height/2)).e,y:n.f};var t,e,n})))})),n.append("defs"),n}(r,e);!function(t,e){var n=t.exit();c.WR(n,e).style("opacity",0).remove()}(r,e);var s=void 0!==r.merge?r.merge(a):r;return c.WR(s,e).style("opacity",1),s.each((function(t){var n=i.Ys(this),r=e.edge(t);r.elem=this,r.id&&n.attr("id",r.id),c.$p(n,r.class,(n.classed("update")?"update ":"")+"edgePath")})),s.selectAll("path.path").each((function(t){var n=e.edge(t);n.arrowheadId=f.Z("arrowhead");var r=i.Ys(this).attr("marker-end",(function(){return"url("+(t=location.href,e=n.arrowheadId,t.split("#")[0]+"#"+e+")");var t,e})).style("fill","none");c.WR(r,e).attr("d",(function(t){return function(t,e){var n=t.edge(e),i=t.node(e.v),r=t.node(e.w),a=n.points.slice(1,n.points.length-1);return a.unshift(y(i,a[0])),a.push(y(r,a[a.length-1])),b(n,a)}(e,t)})),c.bg(r,n.style)})),s.selectAll("defs *").remove(),s.selectAll("defs").each((function(t){var r=e.edge(t);(0,n[r.arrowhead])(i.Ys(this),r.arrowheadId,r,"arrowhead")})),s};function b(t,e){var n=(i.jvg||i.YPS.line)().x((function(t){return t.x})).y((function(t){return t.y}));return(n.curve||n.interpolate)(t.curve),n(e)}var _=n(61666),x=function(t,e,n){var a,s=e.nodes().filter((function(t){return!c.bF(e,t)})),o=t.selectAll("g.node").data(s,(function(t){return t})).classed("update",!0);return o.exit().remove(),o.enter().append("g").attr("class","node").style("opacity",0),(o=t.selectAll("g.node")).each((function(t){var a=e.node(t),s=i.Ys(this);c.$p(s,a.class,(s.classed("update")?"update ":"")+"node"),s.select("g.label").remove();var o=s.append("g").attr("class","label"),l=u(o,a),h=n[a.shape],d=_.Z(l.node().getBBox(),"width","height");a.elem=this,a.id&&s.attr("id",a.id),a.labelId&&o.attr("id",a.labelId),r.Z(a,"width")&&(d.width=a.width),r.Z(a,"height")&&(d.height=a.height),d.width+=a.paddingLeft+a.paddingRight,d.height+=a.paddingTop+a.paddingBottom,o.attr("transform","translate("+(a.paddingLeft-a.paddingRight)/2+","+(a.paddingTop-a.paddingBottom)/2+")");var p=i.Ys(this);p.select(".label-container").remove();var f=h(p,d,a).classed("label-container",!0);c.bg(f,a.style);var g=f.node().getBBox();a.width=g.width,a.height=g.height})),a=o.exit?o.exit():o.selectAll(null),c.WR(a,e).style("opacity",0).remove(),o};function v(t,e,n,i){var r=t.x,a=t.y,s=r-i.x,o=a-i.y,c=Math.sqrt(e*e*o*o+n*n*s*s),l=Math.abs(e*n*s/c);i.x<r&&(l=-l);var h=Math.abs(e*n*o/c);return i.y<a&&(h=-h),{x:r+l,y:a+h}}var k=n(23352),w=n(22930),C={rect:function(t,e,n){var i=t.insert("rect",":first-child").attr("rx",n.rx).attr("ry",n.ry).attr("x",-e.width/2).attr("y",-e.height/2).attr("width",e.width).attr("height",e.height);return n.intersect=function(t){return(0,w.q)(n,t)},i},ellipse:function(t,e,n){var i=e.width/2,r=e.height/2,a=t.insert("ellipse",":first-child").attr("x",-e.width/2).attr("y",-e.height/2).attr("rx",i).attr("ry",r);return n.intersect=function(t){return v(n,i,r,t)},a},circle:function(t,e,n){var i=Math.max(e.width,e.height)/2,r=t.insert("circle",":first-child").attr("x",-e.width/2).attr("y",-e.height/2).attr("r",i);return n.intersect=function(t){return function(t,e,n){return v(t,e,e,n)}(n,i,t)},r},diamond:function(t,e,n){var i=e.width*Math.SQRT2/2,r=e.height*Math.SQRT2/2,a=[{x:0,y:-r},{x:-i,y:0},{x:0,y:r},{x:i,y:0}],s=t.insert("polygon",":first-child").attr("points",a.map((function(t){return t.x+","+t.y})).join(" "));return n.intersect=function(t){return(0,k.A)(n,a,t)},s}};function T(){var t=function(t,e){!function(t){t.nodes().forEach((function(e){var n=t.node(e);r.Z(n,"label")||t.children(e).length||(n.label=e),r.Z(n,"paddingX")&&a.Z(n,{paddingLeft:n.paddingX,paddingRight:n.paddingX}),r.Z(n,"paddingY")&&a.Z(n,{paddingTop:n.paddingY,paddingBottom:n.paddingY}),r.Z(n,"padding")&&a.Z(n,{paddingLeft:n.padding,paddingRight:n.padding,paddingTop:n.padding,paddingBottom:n.padding}),a.Z(n,E),s.Z(["paddingLeft","paddingRight","paddingTop","paddingBottom"],(function(t){n[t]=Number(n[t])})),r.Z(n,"width")&&(n._prevWidth=n.width),r.Z(n,"height")&&(n._prevHeight=n.height)})),t.edges().forEach((function(e){var n=t.edge(e);r.Z(n,"label")||(n.label=""),a.Z(n,S)}))}(e);var n=A(t,"output"),h=A(n,"clusters"),u=A(n,"edgePaths"),f=p(A(n,"edgeLabels"),e),g=x(A(n,"nodes"),e,C);(0,o.bK)(e),function(t,e){function n(t){var n=e.node(t);return"translate("+n.x+","+n.y+")"}t.filter((function(){return!i.Ys(this).classed("update")})).attr("transform",n),c.WR(t,e).style("opacity",1).attr("transform",n)}(g,e),function(t,e){function n(t){var n=e.edge(t);return r.Z(n,"x")?"translate("+n.x+","+n.y+")":""}t.filter((function(){return!i.Ys(this).classed("update")})).attr("transform",n),c.WR(t,e).style("opacity",1).attr("transform",n)}(f,e),m(u,e,l),function(t,e){var n=t.filter((function(){return!i.Ys(this).classed("update")}));function r(t){var n=e.node(t);return"translate("+n.x+","+n.y+")"}n.attr("transform",r),c.WR(t,e).style("opacity",1).attr("transform",r),c.WR(n.selectAll("rect"),e).attr("width",(function(t){return e.node(t).width})).attr("height",(function(t){return e.node(t).height})).attr("x",(function(t){return-e.node(t).width/2})).attr("y",(function(t){return-e.node(t).height/2}))}(d(h,e),e),function(t){s.Z(t.nodes(),(function(e){var n=t.node(e);r.Z(n,"_prevWidth")?n.width=n._prevWidth:delete n.width,r.Z(n,"_prevHeight")?n.height=n._prevHeight:delete n.height,delete n._prevWidth,delete n._prevHeight}))}(e)};return t.createNodes=function(e){return arguments.length?(function(t){x=t}(e),t):x},t.createClusters=function(e){return arguments.length?(function(t){d=t}(e),t):d},t.createEdgeLabels=function(e){return arguments.length?(function(t){p=t}(e),t):p},t.createEdgePaths=function(e){return arguments.length?(function(t){m=t}(e),t):m},t.shapes=function(e){return arguments.length?(function(t){C=t}(e),t):C},t.arrows=function(e){return arguments.length?(function(t){l=t}(e),t):l},t}var E={paddingLeft:10,paddingRight:10,paddingTop:10,paddingBottom:10,rx:0,ry:0,shape:"rect"},S={arrowhead:"normal",curve:i.c_6};function A(t,e){var n=t.select("g."+e);return n.empty()&&(n=t.append("g").attr("class",e)),n}n(45625)},21883:(t,e,n)=>{"use strict";n.d(e,{Z:()=>s});var i=n(61691),r=n(82142);const a=class{constructor(){this.type=r.w.ALL}get(){return this.type}set(t){if(this.type&&this.type!==t)throw new Error("Cannot change both RGB and HSL channels at the same time");this.type=t}reset(){this.type=r.w.ALL}is(t){return this.type===t}};const s=new class{constructor(t,e){this.color=e,this.changed=!1,this.data=t,this.type=new a}set(t,e){return this.color=e,this.changed=!1,this.data=t,this.type.type=r.w.ALL,this}_ensureHSL(){const t=this.data,{h:e,s:n,l:r}=t;void 0===e&&(t.h=i.Z.channel.rgb2hsl(t,"h")),void 0===n&&(t.s=i.Z.channel.rgb2hsl(t,"s")),void 0===r&&(t.l=i.Z.channel.rgb2hsl(t,"l"))}_ensureRGB(){const t=this.data,{r:e,g:n,b:r}=t;void 0===e&&(t.r=i.Z.channel.hsl2rgb(t,"r")),void 0===n&&(t.g=i.Z.channel.hsl2rgb(t,"g")),void 0===r&&(t.b=i.Z.channel.hsl2rgb(t,"b"))}get r(){const t=this.data,e=t.r;return this.type.is(r.w.HSL)||void 0===e?(this._ensureHSL(),i.Z.channel.hsl2rgb(t,"r")):e}get g(){const t=this.data,e=t.g;return this.type.is(r.w.HSL)||void 0===e?(this._ensureHSL(),i.Z.channel.hsl2rgb(t,"g")):e}get b(){const t=this.data,e=t.b;return this.type.is(r.w.HSL)||void 0===e?(this._ensureHSL(),i.Z.channel.hsl2rgb(t,"b")):e}get h(){const t=this.data,e=t.h;return this.type.is(r.w.RGB)||void 0===e?(this._ensureRGB(),i.Z.channel.rgb2hsl(t,"h")):e}get s(){const t=this.data,e=t.s;return this.type.is(r.w.RGB)||void 0===e?(this._ensureRGB(),i.Z.channel.rgb2hsl(t,"s")):e}get l(){const t=this.data,e=t.l;return this.type.is(r.w.RGB)||void 0===e?(this._ensureRGB(),i.Z.channel.rgb2hsl(t,"l")):e}get a(){return this.data.a}set r(t){this.type.set(r.w.RGB),this.changed=!0,this.data.r=t}set g(t){this.type.set(r.w.RGB),this.changed=!0,this.data.g=t}set b(t){this.type.set(r.w.RGB),this.changed=!0,this.data.b=t}set h(t){this.type.set(r.w.HSL),this.changed=!0,this.data.h=t}set s(t){this.type.set(r.w.HSL),this.changed=!0,this.data.s=t}set l(t){this.type.set(r.w.HSL),this.changed=!0,this.data.l=t}set a(t){this.changed=!0,this.data.a=t}}({r:0,g:0,b:0,a:0},"transparent")},71610:(t,e,n)=>{"use strict";n.d(e,{Z:()=>g});var i=n(21883),r=n(82142);const a={re:/^#((?:[a-f0-9]{2}){2,4}|[a-f0-9]{3})$/i,parse:t=>{if(35!==t.charCodeAt(0))return;const e=t.match(a.re);if(!e)return;const n=e[1],r=parseInt(n,16),s=n.length,o=s%4==0,c=s>4,l=c?1:17,h=c?8:4,u=o?0:-1,d=c?255:15;return i.Z.set({r:(r>>h*(u+3)&d)*l,g:(r>>h*(u+2)&d)*l,b:(r>>h*(u+1)&d)*l,a:o?(r&d)*l/255:1},t)},stringify:t=>{const{r:e,g:n,b:i,a:a}=t;return a<1?`#${r.Q[Math.round(e)]}${r.Q[Math.round(n)]}${r.Q[Math.round(i)]}${r.Q[Math.round(255*a)]}`:`#${r.Q[Math.round(e)]}${r.Q[Math.round(n)]}${r.Q[Math.round(i)]}`}},s=a;var o=n(61691);const c={re:/^hsla?\(\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?(?:deg|grad|rad|turn)?)\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?%)\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?%)(?:\s*?(?:,|\/)\s*?\+?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?(%)?))?\s*?\)$/i,hueRe:/^(.+?)(deg|grad|rad|turn)$/i,_hue2deg:t=>{const e=t.match(c.hueRe);if(e){const[,t,n]=e;switch(n){case"grad":return o.Z.channel.clamp.h(.9*parseFloat(t));case"rad":return o.Z.channel.clamp.h(180*parseFloat(t)/Math.PI);case"turn":return o.Z.channel.clamp.h(360*parseFloat(t))}}return o.Z.channel.clamp.h(parseFloat(t))},parse:t=>{const e=t.charCodeAt(0);if(104!==e&&72!==e)return;const n=t.match(c.re);if(!n)return;const[,r,a,s,l,h]=n;return i.Z.set({h:c._hue2deg(r),s:o.Z.channel.clamp.s(parseFloat(a)),l:o.Z.channel.clamp.l(parseFloat(s)),a:l?o.Z.channel.clamp.a(h?parseFloat(l)/100:parseFloat(l)):1},t)},stringify:t=>{const{h:e,s:n,l:i,a:r}=t;return r<1?`hsla(${o.Z.lang.round(e)}, ${o.Z.lang.round(n)}%, ${o.Z.lang.round(i)}%, ${r})`:`hsl(${o.Z.lang.round(e)}, ${o.Z.lang.round(n)}%, ${o.Z.lang.round(i)}%)`}},l=c,h={colors:{aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyanaqua:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",transparent:"#00000000",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},parse:t=>{t=t.toLowerCase();const e=h.colors[t];if(e)return s.parse(e)},stringify:t=>{const e=s.stringify(t);for(const n in h.colors)if(h.colors[n]===e)return n}},u=h,d={re:/^rgba?\(\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))(?:\s*?(?:,|\/)\s*?\+?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?)))?\s*?\)$/i,parse:t=>{const e=t.charCodeAt(0);if(114!==e&&82!==e)return;const n=t.match(d.re);if(!n)return;const[,r,a,s,c,l,h,u,p]=n;return i.Z.set({r:o.Z.channel.clamp.r(a?2.55*parseFloat(r):parseFloat(r)),g:o.Z.channel.clamp.g(c?2.55*parseFloat(s):parseFloat(s)),b:o.Z.channel.clamp.b(h?2.55*parseFloat(l):parseFloat(l)),a:u?o.Z.channel.clamp.a(p?parseFloat(u)/100:parseFloat(u)):1},t)},stringify:t=>{const{r:e,g:n,b:i,a:r}=t;return r<1?`rgba(${o.Z.lang.round(e)}, ${o.Z.lang.round(n)}, ${o.Z.lang.round(i)}, ${o.Z.lang.round(r)})`:`rgb(${o.Z.lang.round(e)}, ${o.Z.lang.round(n)}, ${o.Z.lang.round(i)})`}},p=d,f={format:{keyword:h,hex:s,rgb:d,rgba:d,hsl:c,hsla:c},parse:t=>{if("string"!=typeof t)return t;const e=s.parse(t)||p.parse(t)||l.parse(t)||u.parse(t);if(e)return e;throw new Error(`Unsupported color format: "${t}"`)},stringify:t=>!t.changed&&t.color?t.color:t.type.is(r.w.HSL)||void 0===t.data.r?l.stringify(t):t.a<1||!Number.isInteger(t.r)||!Number.isInteger(t.g)||!Number.isInteger(t.b)?p.stringify(t):s.stringify(t)},g=f},82142:(t,e,n)=>{"use strict";n.d(e,{Q:()=>r,w:()=>a});var i=n(61691);const r={};for(let s=0;s<=255;s++)r[s]=i.Z.unit.dec2hex(s);const a={ALL:0,RGB:1,HSL:2}},26174:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var i=n(61691),r=n(71610);const a=(t,e,n)=>{const a=r.Z.parse(t),s=a[e],o=i.Z.channel.clamp[e](s+n);return s!==o&&(a[e]=o),r.Z.stringify(a)}},7201:(t,e,n)=>{"use strict";n.d(e,{Z:()=>r});var i=n(26174);const r=(t,e)=>(0,i.Z)(t,"l",-e)},12281:(t,e,n)=>{"use strict";n.d(e,{Z:()=>r});var i=n(26174);const r=(t,e)=>(0,i.Z)(t,"l",e)},61691:(t,e,n)=>{"use strict";n.d(e,{Z:()=>r});const i={min:{r:0,g:0,b:0,s:0,l:0,a:0},max:{r:255,g:255,b:255,h:360,s:100,l:100,a:1},clamp:{r:t=>t>=255?255:t<0?0:t,g:t=>t>=255?255:t<0?0:t,b:t=>t>=255?255:t<0?0:t,h:t=>t%360,s:t=>t>=100?100:t<0?0:t,l:t=>t>=100?100:t<0?0:t,a:t=>t>=1?1:t<0?0:t},toLinear:t=>{const e=t/255;return t>.03928?Math.pow((e+.055)/1.055,2.4):e/12.92},hue2rgb:(t,e,n)=>(n<0&&(n+=1),n>1&&(n-=1),n<1/6?t+6*(e-t)*n:n<.5?e:n<2/3?t+(e-t)*(2/3-n)*6:t),hsl2rgb:({h:t,s:e,l:n},r)=>{if(!e)return 2.55*n;t/=360,e/=100;const a=(n/=100)<.5?n*(1+e):n+e-n*e,s=2*n-a;switch(r){case"r":return 255*i.hue2rgb(s,a,t+1/3);case"g":return 255*i.hue2rgb(s,a,t);case"b":return 255*i.hue2rgb(s,a,t-1/3)}},rgb2hsl:({r:t,g:e,b:n},i)=>{t/=255,e/=255,n/=255;const r=Math.max(t,e,n),a=Math.min(t,e,n),s=(r+a)/2;if("l"===i)return 100*s;if(r===a)return 0;const o=r-a;if("s"===i)return 100*(s>.5?o/(2-r-a):o/(r+a));switch(r){case t:return 60*((e-n)/o+(e<n?6:0));case e:return 60*((n-t)/o+2);case n:return 60*((t-e)/o+4);default:return-1}}},r={channel:i,lang:{clamp:(t,e,n)=>e>n?Math.min(e,Math.max(n,t)):Math.min(n,Math.max(e,t)),round:t=>Math.round(1e10*t)/1e10},unit:{dec2hex:t=>{const e=Math.round(t).toString(16);return e.length>1?e:`0${e}`}}}},67308:(t,e,n)=>{"use strict";n.d(e,{Z:()=>d});const i=function(){this.__data__=[],this.size=0};var r=n(79651);const a=function(t,e){for(var n=t.length;n--;)if((0,r.Z)(t[n][0],e))return n;return-1};var s=Array.prototype.splice;const o=function(t){var e=this.__data__,n=a(e,t);return!(n<0)&&(n==e.length-1?e.pop():s.call(e,n,1),--this.size,!0)};const c=function(t){var e=this.__data__,n=a(e,t);return n<0?void 0:e[n][1]};const l=function(t){return a(this.__data__,t)>-1};const h=function(t,e){var n=this.__data__,i=a(n,t);return i<0?(++this.size,n.push([t,e])):n[i][1]=e,this};function u(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var i=t[e];this.set(i[0],i[1])}}u.prototype.clear=i,u.prototype.delete=o,u.prototype.get=c,u.prototype.has=l,u.prototype.set=h;const d=u},86183:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var i=n(62508),r=n(66092);const a=(0,i.Z)(r.Z,"Map")},37834:(t,e,n)=>{"use strict";n.d(e,{Z:()=>w});const i=(0,n(62508).Z)(Object,"create");const r=function(){this.__data__=i?i(null):{},this.size=0};const a=function(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e};var s=Object.prototype.hasOwnProperty;const o=function(t){var e=this.__data__;if(i){var n=e[t];return"__lodash_hash_undefined__"===n?void 0:n}return s.call(e,t)?e[t]:void 0};var c=Object.prototype.hasOwnProperty;const l=function(t){var e=this.__data__;return i?void 0!==e[t]:c.call(e,t)};const h=function(t,e){var n=this.__data__;return this.size+=this.has(t)?0:1,n[t]=i&&void 0===e?"__lodash_hash_undefined__":e,this};function u(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var i=t[e];this.set(i[0],i[1])}}u.prototype.clear=r,u.prototype.delete=a,u.prototype.get=o,u.prototype.has=l,u.prototype.set=h;const d=u;var p=n(67308),f=n(86183);const g=function(){this.size=0,this.__data__={hash:new d,map:new(f.Z||p.Z),string:new d}};const y=function(t){var e=typeof t;return"string"==e||"number"==e||"symbol"==e||"boolean"==e?"__proto__"!==t:null===t};const m=function(t,e){var n=t.__data__;return y(e)?n["string"==typeof e?"string":"hash"]:n.map};const b=function(t){var e=m(this,t).delete(t);return this.size-=e?1:0,e};const _=function(t){return m(this,t).get(t)};const x=function(t){return m(this,t).has(t)};const v=function(t,e){var n=m(this,t),i=n.size;return n.set(t,e),this.size+=n.size==i?0:1,this};function k(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var i=t[e];this.set(i[0],i[1])}}k.prototype.clear=g,k.prototype.delete=b,k.prototype.get=_,k.prototype.has=x,k.prototype.set=v;const w=k},93203:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var i=n(62508),r=n(66092);const a=(0,i.Z)(r.Z,"Set")},63001:(t,e,n)=>{"use strict";n.d(e,{Z:()=>o});var i=n(37834);const r=function(t){return this.__data__.set(t,"__lodash_hash_undefined__"),this};const a=function(t){return this.__data__.has(t)};function s(t){var e=-1,n=null==t?0:t.length;for(this.__data__=new i.Z;++e<n;)this.add(t[e])}s.prototype.add=s.prototype.push=r,s.prototype.has=a;const o=s},31667:(t,e,n)=>{"use strict";n.d(e,{Z:()=>d});var i=n(67308);const r=function(){this.__data__=new i.Z,this.size=0};const a=function(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n};const s=function(t){return this.__data__.get(t)};const o=function(t){return this.__data__.has(t)};var c=n(86183),l=n(37834);const h=function(t,e){var n=this.__data__;if(n instanceof i.Z){var r=n.__data__;if(!c.Z||r.length<199)return r.push([t,e]),this.size=++n.size,this;n=this.__data__=new l.Z(r)}return n.set(t,e),this.size=n.size,this};function u(t){var e=this.__data__=new i.Z(t);this.size=e.size}u.prototype.clear=r,u.prototype.delete=a,u.prototype.get=s,u.prototype.has=o,u.prototype.set=h;const d=u},17685:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=n(66092).Z.Symbol},84073:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=n(66092).Z.Uint8Array},76579:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(t,e){for(var n=-1,i=null==t?0:t.length;++n<i&&!1!==e(t[n],n,t););return t}},68774:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(t,e){for(var n=-1,i=null==t?0:t.length,r=0,a=[];++n<i;){var s=t[n];e(s,n,t)&&(a[r++]=s)}return a}},87668:(t,e,n)=>{"use strict";n.d(e,{Z:()=>h});const i=function(t,e){for(var n=-1,i=Array(t);++n<t;)i[n]=e(n);return i};var r=n(29169),a=n(27771),s=n(77008),o=n(56009),c=n(18843),l=Object.prototype.hasOwnProperty;const h=function(t,e){var n=(0,a.Z)(t),h=!n&&(0,r.Z)(t),u=!n&&!h&&(0,s.Z)(t),d=!n&&!h&&!u&&(0,c.Z)(t),p=n||h||u||d,f=p?i(t.length,String):[],g=f.length;for(var y in t)!e&&!l.call(t,y)||p&&("length"==y||u&&("offset"==y||"parent"==y)||d&&("buffer"==y||"byteLength"==y||"byteOffset"==y)||(0,o.Z)(y,g))||f.push(y);return f}},74073:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(t,e){for(var n=-1,i=null==t?0:t.length,r=Array(i);++n<i;)r[n]=e(t[n],n,t);return r}},58694:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(t,e){for(var n=-1,i=e.length,r=t.length;++n<i;)t[r+n]=e[n];return t}},72954:(t,e,n)=>{"use strict";n.d(e,{Z:()=>s});var i=n(74752),r=n(79651),a=Object.prototype.hasOwnProperty;const s=function(t,e,n){var s=t[e];a.call(t,e)&&(0,r.Z)(s,n)&&(void 0!==n||e in t)||(0,i.Z)(t,e,n)}},74752:(t,e,n)=>{"use strict";n.d(e,{Z:()=>r});var i=n(77904);const r=function(t,e,n){"__proto__"==e&&i.Z?(0,i.Z)(t,e,{configurable:!0,enumerable:!0,value:n,writable:!0}):t[e]=n}},48451:(t,e,n)=>{"use strict";n.d(e,{Z:()=>J});var i=n(31667),r=n(76579),a=n(72954),s=n(31899),o=n(17179);const c=function(t,e){return t&&(0,s.Z)(e,(0,o.Z)(e),t)};var l=n(32957);const h=function(t,e){return t&&(0,s.Z)(e,(0,l.Z)(e),t)};var u=n(91050),d=n(87215),p=n(95695);const f=function(t,e){return(0,s.Z)(t,(0,p.Z)(t),e)};var g=n(58694),y=n(12513),m=n(60532);const b=Object.getOwnPropertySymbols?function(t){for(var e=[];t;)(0,g.Z)(e,(0,p.Z)(t)),t=(0,y.Z)(t);return e}:m.Z;const _=function(t,e){return(0,s.Z)(t,b(t),e)};var x=n(1808),v=n(63327);const k=function(t){return(0,v.Z)(t,l.Z,b)};var w=n(83970),C=Object.prototype.hasOwnProperty;const T=function(t){var e=t.length,n=new t.constructor(e);return e&&"string"==typeof t[0]&&C.call(t,"index")&&(n.index=t.index,n.input=t.input),n};var E=n(41884);const S=function(t,e){var n=e?(0,E.Z)(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.byteLength)};var A=/\w*$/;const L=function(t){var e=new t.constructor(t.source,A.exec(t));return e.lastIndex=t.lastIndex,e};var B=n(17685),N=B.Z?B.Z.prototype:void 0,D=N?N.valueOf:void 0;const O=function(t){return D?Object(D.call(t)):{}};var M=n(12701);const I=function(t,e,n){var i=t.constructor;switch(e){case"[object ArrayBuffer]":return(0,E.Z)(t);case"[object Boolean]":case"[object Date]":return new i(+t);case"[object DataView]":return S(t,n);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return(0,M.Z)(t,n);case"[object Map]":case"[object Set]":return new i;case"[object Number]":case"[object String]":return new i(t);case"[object RegExp]":return L(t);case"[object Symbol]":return O(t)}};var F=n(73658),$=n(27771),R=n(77008),Z=n(18533);const P=function(t){return(0,Z.Z)(t)&&"[object Map]"==(0,w.Z)(t)};var j=n(21162),Y=n(98351),z=Y.Z&&Y.Z.isMap;const U=z?(0,j.Z)(z):P;var W=n(77226);const q=function(t){return(0,Z.Z)(t)&&"[object Set]"==(0,w.Z)(t)};var H=Y.Z&&Y.Z.isSet;const V=H?(0,j.Z)(H):q;var G="[object Arguments]",X="[object Function]",Q="[object Object]",K={};K[G]=K["[object Array]"]=K["[object ArrayBuffer]"]=K["[object DataView]"]=K["[object Boolean]"]=K["[object Date]"]=K["[object Float32Array]"]=K["[object Float64Array]"]=K["[object Int8Array]"]=K["[object Int16Array]"]=K["[object Int32Array]"]=K["[object Map]"]=K["[object Number]"]=K[Q]=K["[object RegExp]"]=K["[object Set]"]=K["[object String]"]=K["[object Symbol]"]=K["[object Uint8Array]"]=K["[object Uint8ClampedArray]"]=K["[object Uint16Array]"]=K["[object Uint32Array]"]=!0,K["[object Error]"]=K[X]=K["[object WeakMap]"]=!1;const J=function t(e,n,s,p,g,y){var m,b=1&n,v=2&n,C=4&n;if(s&&(m=g?s(e,p,g,y):s(e)),void 0!==m)return m;if(!(0,W.Z)(e))return e;var E=(0,$.Z)(e);if(E){if(m=T(e),!b)return(0,d.Z)(e,m)}else{var S=(0,w.Z)(e),A=S==X||"[object GeneratorFunction]"==S;if((0,R.Z)(e))return(0,u.Z)(e,b);if(S==Q||S==G||A&&!g){if(m=v||A?{}:(0,F.Z)(e),!b)return v?_(e,h(m,e)):f(e,c(m,e))}else{if(!K[S])return g?e:{};m=I(e,S,b)}}y||(y=new i.Z);var L=y.get(e);if(L)return L;y.set(e,m),V(e)?e.forEach((function(i){m.add(t(i,n,s,i,e,y))})):U(e)&&e.forEach((function(i,r){m.set(r,t(i,n,s,r,e,y))}));var B=C?v?k:x.Z:v?l.Z:o.Z,N=E?void 0:B(e);return(0,r.Z)(N||e,(function(i,r){N&&(i=e[r=i]),(0,a.Z)(m,r,t(i,n,s,r,e,y))})),m}},49811:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var i=n(2693),r=n(50585);const a=function(t,e){return function(n,i){if(null==n)return n;if(!(0,r.Z)(n))return t(n,i);for(var a=n.length,s=e?a:-1,o=Object(n);(e?s--:++s<a)&&!1!==i(o[s],s,o););return n}}(i.Z)},21692:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(t,e,n,i){for(var r=t.length,a=n+(i?1:-1);i?a--:++a<r;)if(e(t[a],a,t))return a;return-1}},10626:(t,e,n)=>{"use strict";n.d(e,{Z:()=>l});var i=n(58694),r=n(17685),a=n(29169),s=n(27771),o=r.Z?r.Z.isConcatSpreadable:void 0;const c=function(t){return(0,s.Z)(t)||(0,a.Z)(t)||!!(o&&t&&t[o])};const l=function t(e,n,r,a,s){var o=-1,l=e.length;for(r||(r=c),s||(s=[]);++o<l;){var h=e[o];n>0&&r(h)?n>1?t(h,n-1,r,a,s):(0,i.Z)(s,h):a||(s[s.length]=h)}return s}},61395:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(t){return function(e,n,i){for(var r=-1,a=Object(e),s=i(e),o=s.length;o--;){var c=s[t?o:++r];if(!1===n(a[c],c,a))break}return e}}()},2693:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var i=n(61395),r=n(17179);const a=function(t,e){return t&&(0,i.Z)(t,e,r.Z)}},13317:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var i=n(22823),r=n(62281);const a=function(t,e){for(var n=0,a=(e=(0,i.Z)(e,t)).length;null!=t&&n<a;)t=t[(0,r.Z)(e[n++])];return n&&n==a?t:void 0}},63327:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var i=n(58694),r=n(27771);const a=function(t,e,n){var a=e(t);return(0,r.Z)(t)?a:(0,i.Z)(a,n(t))}},93589:(t,e,n)=>{"use strict";n.d(e,{Z:()=>d});var i=n(17685),r=Object.prototype,a=r.hasOwnProperty,s=r.toString,o=i.Z?i.Z.toStringTag:void 0;const c=function(t){var e=a.call(t,o),n=t[o];try{t[o]=void 0;var i=!0}catch(c){}var r=s.call(t);return i&&(e?t[o]=n:delete t[o]),r};var l=Object.prototype.toString;const h=function(t){return l.call(t)};var u=i.Z?i.Z.toStringTag:void 0;const d=function(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":u&&u in Object(t)?c(t):h(t)}},74765:(t,e,n)=>{"use strict";n.d(e,{Z:()=>H});var i=n(31667),r=n(63001);const a=function(t,e){for(var n=-1,i=null==t?0:t.length;++n<i;)if(e(t[n],n,t))return!0;return!1};var s=n(59548);const o=function(t,e,n,i,o,c){var l=1&n,h=t.length,u=e.length;if(h!=u&&!(l&&u>h))return!1;var d=c.get(t),p=c.get(e);if(d&&p)return d==e&&p==t;var f=-1,g=!0,y=2&n?new r.Z:void 0;for(c.set(t,e),c.set(e,t);++f<h;){var m=t[f],b=e[f];if(i)var _=l?i(b,m,f,e,t,c):i(m,b,f,t,e,c);if(void 0!==_){if(_)continue;g=!1;break}if(y){if(!a(e,(function(t,e){if(!(0,s.Z)(y,e)&&(m===t||o(m,t,n,i,c)))return y.push(e)}))){g=!1;break}}else if(m!==b&&!o(m,b,n,i,c)){g=!1;break}}return c.delete(t),c.delete(e),g};var c=n(17685),l=n(84073),h=n(79651);const u=function(t){var e=-1,n=Array(t.size);return t.forEach((function(t,i){n[++e]=[i,t]})),n};var d=n(6545),p=c.Z?c.Z.prototype:void 0,f=p?p.valueOf:void 0;const g=function(t,e,n,i,r,a,s){switch(n){case"[object DataView]":if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset)return!1;t=t.buffer,e=e.buffer;case"[object ArrayBuffer]":return!(t.byteLength!=e.byteLength||!a(new l.Z(t),new l.Z(e)));case"[object Boolean]":case"[object Date]":case"[object Number]":return(0,h.Z)(+t,+e);case"[object Error]":return t.name==e.name&&t.message==e.message;case"[object RegExp]":case"[object String]":return t==e+"";case"[object Map]":var c=u;case"[object Set]":var p=1&i;if(c||(c=d.Z),t.size!=e.size&&!p)return!1;var g=s.get(t);if(g)return g==e;i|=2,s.set(t,e);var y=o(c(t),c(e),i,r,a,s);return s.delete(t),y;case"[object Symbol]":if(f)return f.call(t)==f.call(e)}return!1};var y=n(1808),m=Object.prototype.hasOwnProperty;const b=function(t,e,n,i,r,a){var s=1&n,o=(0,y.Z)(t),c=o.length;if(c!=(0,y.Z)(e).length&&!s)return!1;for(var l=c;l--;){var h=o[l];if(!(s?h in e:m.call(e,h)))return!1}var u=a.get(t),d=a.get(e);if(u&&d)return u==e&&d==t;var p=!0;a.set(t,e),a.set(e,t);for(var f=s;++l<c;){var g=t[h=o[l]],b=e[h];if(i)var _=s?i(b,g,h,e,t,a):i(g,b,h,t,e,a);if(!(void 0===_?g===b||r(g,b,n,i,a):_)){p=!1;break}f||(f="constructor"==h)}if(p&&!f){var x=t.constructor,v=e.constructor;x==v||!("constructor"in t)||!("constructor"in e)||"function"==typeof x&&x instanceof x&&"function"==typeof v&&v instanceof v||(p=!1)}return a.delete(t),a.delete(e),p};var _=n(83970),x=n(27771),v=n(77008),k=n(18843),w="[object Arguments]",C="[object Array]",T="[object Object]",E=Object.prototype.hasOwnProperty;const S=function(t,e,n,r,a,s){var c=(0,x.Z)(t),l=(0,x.Z)(e),h=c?C:(0,_.Z)(t),u=l?C:(0,_.Z)(e),d=(h=h==w?T:h)==T,p=(u=u==w?T:u)==T,f=h==u;if(f&&(0,v.Z)(t)){if(!(0,v.Z)(e))return!1;c=!0,d=!1}if(f&&!d)return s||(s=new i.Z),c||(0,k.Z)(t)?o(t,e,n,r,a,s):g(t,e,h,n,r,a,s);if(!(1&n)){var y=d&&E.call(t,"__wrapped__"),m=p&&E.call(e,"__wrapped__");if(y||m){var S=y?t.value():t,A=m?e.value():e;return s||(s=new i.Z),a(S,A,n,r,s)}}return!!f&&(s||(s=new i.Z),b(t,e,n,r,a,s))};var A=n(18533);const L=function t(e,n,i,r,a){return e===n||(null==e||null==n||!(0,A.Z)(e)&&!(0,A.Z)(n)?e!=e&&n!=n:S(e,n,i,r,t,a))};const B=function(t,e,n,r){var a=n.length,s=a,o=!r;if(null==t)return!s;for(t=Object(t);a--;){var c=n[a];if(o&&c[2]?c[1]!==t[c[0]]:!(c[0]in t))return!1}for(;++a<s;){var l=(c=n[a])[0],h=t[l],u=c[1];if(o&&c[2]){if(void 0===h&&!(l in t))return!1}else{var d=new i.Z;if(r)var p=r(h,u,l,t,e,d);if(!(void 0===p?L(u,h,3,r,d):p))return!1}}return!0};var N=n(77226);const D=function(t){return t==t&&!(0,N.Z)(t)};var O=n(17179);const M=function(t){for(var e=(0,O.Z)(t),n=e.length;n--;){var i=e[n],r=t[i];e[n]=[i,r,D(r)]}return e};const I=function(t,e){return function(n){return null!=n&&(n[t]===e&&(void 0!==e||t in Object(n)))}};const F=function(t){var e=M(t);return 1==e.length&&e[0][2]?I(e[0][0],e[0][1]):function(n){return n===t||B(n,t,e)}};var $=n(13317);const R=function(t,e,n){var i=null==t?void 0:(0,$.Z)(t,e);return void 0===i?n:i};var Z=n(75487),P=n(99365),j=n(62281);const Y=function(t,e){return(0,P.Z)(t)&&D(e)?I((0,j.Z)(t),e):function(n){var i=R(n,t);return void 0===i&&i===e?(0,Z.Z)(n,t):L(e,i,3)}};var z=n(69203),U=n(54193);const W=function(t){return function(e){return(0,$.Z)(e,t)}};const q=function(t){return(0,P.Z)(t)?(0,U.Z)((0,j.Z)(t)):W(t)};const H=function(t){return"function"==typeof t?t:null==t?z.Z:"object"==typeof t?(0,x.Z)(t)?Y(t[0],t[1]):F(t):q(t)}},39473:(t,e,n)=>{"use strict";n.d(e,{Z:()=>s});var i=n(72764);const r=(0,n(1851).Z)(Object.keys,Object);var a=Object.prototype.hasOwnProperty;const s=function(t){if(!(0,i.Z)(t))return r(t);var e=[];for(var n in Object(t))a.call(t,n)&&"constructor"!=n&&e.push(n);return e}},21018:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var i=n(49811),r=n(50585);const a=function(t,e){var n=-1,a=(0,r.Z)(t)?Array(t.length):[];return(0,i.Z)(t,(function(t,i,r){a[++n]=e(t,i,r)})),a}},54193:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(t){return function(e){return null==e?void 0:e[t]}}},69581:(t,e,n)=>{"use strict";n.d(e,{Z:()=>s});var i=n(69203),r=n(81211),a=n(27227);const s=function(t,e){return(0,a.Z)((0,r.Z)(t,e,i.Z),t+"")}},21162:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(t){return function(e){return t(e)}}},59548:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(t,e){return t.has(e)}},68882:(t,e,n)=>{"use strict";n.d(e,{Z:()=>r});var i=n(69203);const r=function(t){return"function"==typeof t?t:i.Z}},22823:(t,e,n)=>{"use strict";n.d(e,{Z:()=>h});var i=n(27771),r=n(99365),a=n(42454);var s=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,o=/\\(\\)?/g;const c=function(t){var e=(0,a.Z)(t,(function(t){return 500===n.size&&n.clear(),t})),n=e.cache;return e}((function(t){var e=[];return 46===t.charCodeAt(0)&&e.push(""),t.replace(s,(function(t,n,i,r){e.push(i?r.replace(o,"$1"):n||t)})),e}));var l=n(50751);const h=function(t,e){return(0,i.Z)(t)?t:(0,r.Z)(t,e)?[t]:c((0,l.Z)(t))}},41884:(t,e,n)=>{"use strict";n.d(e,{Z:()=>r});var i=n(84073);const r=function(t){var e=new t.constructor(t.byteLength);return new i.Z(e).set(new i.Z(t)),e}},91050:(t,e,n)=>{"use strict";n.d(e,{Z:()=>c});var i=n(66092),r="object"==typeof exports&&exports&&!exports.nodeType&&exports,a=r&&"object"==typeof module&&module&&!module.nodeType&&module,s=a&&a.exports===r?i.Z.Buffer:void 0,o=s?s.allocUnsafe:void 0;const c=function(t,e){if(e)return t.slice();var n=t.length,i=o?o(n):new t.constructor(n);return t.copy(i),i}},12701:(t,e,n)=>{"use strict";n.d(e,{Z:()=>r});var i=n(41884);const r=function(t,e){var n=e?(0,i.Z)(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.length)}},87215:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(t,e){var n=-1,i=t.length;for(e||(e=Array(i));++n<i;)e[n]=t[n];return e}},31899:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var i=n(72954),r=n(74752);const a=function(t,e,n,a){var s=!n;n||(n={});for(var o=-1,c=e.length;++o<c;){var l=e[o],h=a?a(n[l],t[l],l,n,t):void 0;void 0===h&&(h=t[l]),s?(0,r.Z)(n,l,h):(0,i.Z)(n,l,h)}return n}},77904:(t,e,n)=>{"use strict";n.d(e,{Z:()=>r});var i=n(62508);const r=function(){try{var t=(0,i.Z)(Object,"defineProperty");return t({},"",{}),t}catch(e){}}()},13413:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i="object"==typeof global&&global&&global.Object===Object&&global},1808:(t,e,n)=>{"use strict";n.d(e,{Z:()=>s});var i=n(63327),r=n(95695),a=n(17179);const s=function(t){return(0,i.Z)(t,a.Z,r.Z)}},62508:(t,e,n)=>{"use strict";n.d(e,{Z:()=>b});var i=n(73234);const r=n(66092).Z["__core-js_shared__"];var a,s=(a=/[^.]+$/.exec(r&&r.keys&&r.keys.IE_PROTO||""))?"Symbol(src)_1."+a:"";const o=function(t){return!!s&&s in t};var c=n(77226),l=n(90019),h=/^\[object .+?Constructor\]$/,u=Function.prototype,d=Object.prototype,p=u.toString,f=d.hasOwnProperty,g=RegExp("^"+p.call(f).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");const y=function(t){return!(!(0,c.Z)(t)||o(t))&&((0,i.Z)(t)?g:h).test((0,l.Z)(t))};const m=function(t,e){return null==t?void 0:t[e]};const b=function(t,e){var n=m(t,e);return y(n)?n:void 0}},12513:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=(0,n(1851).Z)(Object.getPrototypeOf,Object)},95695:(t,e,n)=>{"use strict";n.d(e,{Z:()=>o});var i=n(68774),r=n(60532),a=Object.prototype.propertyIsEnumerable,s=Object.getOwnPropertySymbols;const o=s?function(t){return null==t?[]:(t=Object(t),(0,i.Z)(s(t),(function(e){return a.call(t,e)})))}:r.Z},83970:(t,e,n)=>{"use strict";n.d(e,{Z:()=>w});var i=n(62508),r=n(66092);const a=(0,i.Z)(r.Z,"DataView");var s=n(86183);const o=(0,i.Z)(r.Z,"Promise");var c=n(93203);const l=(0,i.Z)(r.Z,"WeakMap");var h=n(93589),u=n(90019),d="[object Map]",p="[object Promise]",f="[object Set]",g="[object WeakMap]",y="[object DataView]",m=(0,u.Z)(a),b=(0,u.Z)(s.Z),_=(0,u.Z)(o),x=(0,u.Z)(c.Z),v=(0,u.Z)(l),k=h.Z;(a&&k(new a(new ArrayBuffer(1)))!=y||s.Z&&k(new s.Z)!=d||o&&k(o.resolve())!=p||c.Z&&k(new c.Z)!=f||l&&k(new l)!=g)&&(k=function(t){var e=(0,h.Z)(t),n="[object Object]"==e?t.constructor:void 0,i=n?(0,u.Z)(n):"";if(i)switch(i){case m:return y;case b:return d;case _:return p;case x:return f;case v:return g}return e});const w=k},16174:(t,e,n)=>{"use strict";n.d(e,{Z:()=>l});var i=n(22823),r=n(29169),a=n(27771),s=n(56009),o=n(1656),c=n(62281);const l=function(t,e,n){for(var l=-1,h=(e=(0,i.Z)(e,t)).length,u=!1;++l<h;){var d=(0,c.Z)(e[l]);if(!(u=null!=t&&n(t,d)))break;t=t[d]}return u||++l!=h?u:!!(h=null==t?0:t.length)&&(0,o.Z)(h)&&(0,s.Z)(d,h)&&((0,a.Z)(t)||(0,r.Z)(t))}},73658:(t,e,n)=>{"use strict";n.d(e,{Z:()=>c});var i=n(77226),r=Object.create;const a=function(){function t(){}return function(e){if(!(0,i.Z)(e))return{};if(r)return r(e);t.prototype=e;var n=new t;return t.prototype=void 0,n}}();var s=n(12513),o=n(72764);const c=function(t){return"function"!=typeof t.constructor||(0,o.Z)(t)?{}:a((0,s.Z)(t))}},56009:(t,e,n)=>{"use strict";n.d(e,{Z:()=>r});var i=/^(?:0|[1-9]\d*)$/;const r=function(t,e){var n=typeof t;return!!(e=null==e?9007199254740991:e)&&("number"==n||"symbol"!=n&&i.test(t))&&t>-1&&t%1==0&&t<e}},50439:(t,e,n)=>{"use strict";n.d(e,{Z:()=>o});var i=n(79651),r=n(50585),a=n(56009),s=n(77226);const o=function(t,e,n){if(!(0,s.Z)(n))return!1;var o=typeof e;return!!("number"==o?(0,r.Z)(n)&&(0,a.Z)(e,n.length):"string"==o&&e in n)&&(0,i.Z)(n[e],t)}},99365:(t,e,n)=>{"use strict";n.d(e,{Z:()=>o});var i=n(27771),r=n(72714),a=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,s=/^\w*$/;const o=function(t,e){if((0,i.Z)(t))return!1;var n=typeof t;return!("number"!=n&&"symbol"!=n&&"boolean"!=n&&null!=t&&!(0,r.Z)(t))||(s.test(t)||!a.test(t)||null!=e&&t in Object(e))}},72764:(t,e,n)=>{"use strict";n.d(e,{Z:()=>r});var i=Object.prototype;const r=function(t){var e=t&&t.constructor;return t===("function"==typeof e&&e.prototype||i)}},98351:(t,e,n)=>{"use strict";n.d(e,{Z:()=>o});var i=n(13413),r="object"==typeof exports&&exports&&!exports.nodeType&&exports,a=r&&"object"==typeof module&&module&&!module.nodeType&&module,s=a&&a.exports===r&&i.Z.process;const o=function(){try{var t=a&&a.require&&a.require("util").types;return t||s&&s.binding&&s.binding("util")}catch(e){}}()},1851:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(t,e){return function(n){return t(e(n))}}},81211:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});const i=function(t,e,n){switch(n.length){case 0:return t.call(e);case 1:return t.call(e,n[0]);case 2:return t.call(e,n[0],n[1]);case 3:return t.call(e,n[0],n[1],n[2])}return t.apply(e,n)};var r=Math.max;const a=function(t,e,n){return e=r(void 0===e?t.length-1:e,0),function(){for(var a=arguments,s=-1,o=r(a.length-e,0),c=Array(o);++s<o;)c[s]=a[e+s];s=-1;for(var l=Array(e+1);++s<e;)l[s]=a[s];return l[e]=n(c),i(t,this,l)}}},66092:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var i=n(13413),r="object"==typeof self&&self&&self.Object===Object&&self;const a=i.Z||r||Function("return this")()},6545:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(t){var e=-1,n=Array(t.size);return t.forEach((function(t){n[++e]=t})),n}},27227:(t,e,n)=>{"use strict";n.d(e,{Z:()=>c});var i=n(62002),r=n(77904),a=n(69203);const s=r.Z?function(t,e){return(0,r.Z)(t,"toString",{configurable:!0,enumerable:!1,value:(0,i.Z)(e),writable:!0})}:a.Z;var o=Date.now;const c=function(t){var e=0,n=0;return function(){var i=o(),r=16-(i-n);if(n=i,r>0){if(++e>=800)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}(s)},62281:(t,e,n)=>{"use strict";n.d(e,{Z:()=>r});var i=n(72714);const r=function(t){if("string"==typeof t||(0,i.Z)(t))return t;var e=t+"";return"0"==e&&1/t==-Infinity?"-0":e}},90019:(t,e,n)=>{"use strict";n.d(e,{Z:()=>r});var i=Function.prototype.toString;const r=function(t){if(null!=t){try{return i.call(t)}catch(e){}try{return t+""}catch(e){}}return""}},62002:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(t){return function(){return t}}},3688:(t,e,n)=>{"use strict";n.d(e,{Z:()=>l});var i=n(69581),r=n(79651),a=n(50439),s=n(32957),o=Object.prototype,c=o.hasOwnProperty;const l=(0,i.Z)((function(t,e){t=Object(t);var n=-1,i=e.length,l=i>2?e[2]:void 0;for(l&&(0,a.Z)(e[0],e[1],l)&&(i=1);++n<i;)for(var h=e[n],u=(0,s.Z)(h),d=-1,p=u.length;++d<p;){var f=u[d],g=t[f];(void 0===g||(0,r.Z)(g,o[f])&&!c.call(t,f))&&(t[f]=h[f])}return t}))},79651:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(t,e){return t===e||t!=t&&e!=e}},13445:(t,e,n)=>{"use strict";n.d(e,{Z:()=>c});var i=n(68774),r=n(49811);const a=function(t,e){var n=[];return(0,r.Z)(t,(function(t,i,r){e(t,i,r)&&n.push(t)})),n};var s=n(74765),o=n(27771);const c=function(t,e){return((0,o.Z)(t)?i.Z:a)(t,(0,s.Z)(e,3))}},27961:(t,e,n)=>{"use strict";n.d(e,{Z:()=>r});var i=n(10626);const r=function(t){return(null==t?0:t.length)?(0,i.Z)(t,1):[]}},70870:(t,e,n)=>{"use strict";n.d(e,{Z:()=>o});var i=n(76579),r=n(49811),a=n(68882),s=n(27771);const o=function(t,e){return((0,s.Z)(t)?i.Z:r.Z)(t,(0,a.Z)(e))}},17452:(t,e,n)=>{"use strict";n.d(e,{Z:()=>s});var i=Object.prototype.hasOwnProperty;const r=function(t,e){return null!=t&&i.call(t,e)};var a=n(16174);const s=function(t,e){return null!=t&&(0,a.Z)(t,e,r)}},75487:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});const i=function(t,e){return null!=t&&e in Object(t)};var r=n(16174);const a=function(t,e){return null!=t&&(0,r.Z)(t,e,i)}},69203:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(t){return t}},29169:(t,e,n)=>{"use strict";n.d(e,{Z:()=>l});var i=n(93589),r=n(18533);const a=function(t){return(0,r.Z)(t)&&"[object Arguments]"==(0,i.Z)(t)};var s=Object.prototype,o=s.hasOwnProperty,c=s.propertyIsEnumerable;const l=a(function(){return arguments}())?a:function(t){return(0,r.Z)(t)&&o.call(t,"callee")&&!c.call(t,"callee")}},27771:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=Array.isArray},50585:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var i=n(73234),r=n(1656);const a=function(t){return null!=t&&(0,r.Z)(t.length)&&!(0,i.Z)(t)}},836:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var i=n(50585),r=n(18533);const a=function(t){return(0,r.Z)(t)&&(0,i.Z)(t)}},77008:(t,e,n)=>{"use strict";n.d(e,{Z:()=>c});var i=n(66092);const r=function(){return!1};var a="object"==typeof exports&&exports&&!exports.nodeType&&exports,s=a&&"object"==typeof module&&module&&!module.nodeType&&module,o=s&&s.exports===a?i.Z.Buffer:void 0;const c=(o?o.isBuffer:void 0)||r},79697:(t,e,n)=>{"use strict";n.d(e,{Z:()=>d});var i=n(39473),r=n(83970),a=n(29169),s=n(27771),o=n(50585),c=n(77008),l=n(72764),h=n(18843),u=Object.prototype.hasOwnProperty;const d=function(t){if(null==t)return!0;if((0,o.Z)(t)&&((0,s.Z)(t)||"string"==typeof t||"function"==typeof t.splice||(0,c.Z)(t)||(0,h.Z)(t)||(0,a.Z)(t)))return!t.length;var e=(0,r.Z)(t);if("[object Map]"==e||"[object Set]"==e)return!t.size;if((0,l.Z)(t))return!(0,i.Z)(t).length;for(var n in t)if(u.call(t,n))return!1;return!0}},73234:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var i=n(93589),r=n(77226);const a=function(t){if(!(0,r.Z)(t))return!1;var e=(0,i.Z)(t);return"[object Function]"==e||"[object GeneratorFunction]"==e||"[object AsyncFunction]"==e||"[object Proxy]"==e}},1656:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=9007199254740991}},77226:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}},18533:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(t){return null!=t&&"object"==typeof t}},37514:(t,e,n)=>{"use strict";n.d(e,{Z:()=>u});var i=n(93589),r=n(12513),a=n(18533),s=Function.prototype,o=Object.prototype,c=s.toString,l=o.hasOwnProperty,h=c.call(Object);const u=function(t){if(!(0,a.Z)(t)||"[object Object]"!=(0,i.Z)(t))return!1;var e=(0,r.Z)(t);if(null===e)return!0;var n=l.call(e,"constructor")&&e.constructor;return"function"==typeof n&&n instanceof n&&c.call(n)==h}},72714:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var i=n(93589),r=n(18533);const a=function(t){return"symbol"==typeof t||(0,r.Z)(t)&&"[object Symbol]"==(0,i.Z)(t)}},18843:(t,e,n)=>{"use strict";n.d(e,{Z:()=>u});var i=n(93589),r=n(1656),a=n(18533),s={};s["[object Float32Array]"]=s["[object Float64Array]"]=s["[object Int8Array]"]=s["[object Int16Array]"]=s["[object Int32Array]"]=s["[object Uint8Array]"]=s["[object Uint8ClampedArray]"]=s["[object Uint16Array]"]=s["[object Uint32Array]"]=!0,s["[object Arguments]"]=s["[object Array]"]=s["[object ArrayBuffer]"]=s["[object Boolean]"]=s["[object DataView]"]=s["[object Date]"]=s["[object Error]"]=s["[object Function]"]=s["[object Map]"]=s["[object Number]"]=s["[object Object]"]=s["[object RegExp]"]=s["[object Set]"]=s["[object String]"]=s["[object WeakMap]"]=!1;const o=function(t){return(0,a.Z)(t)&&(0,r.Z)(t.length)&&!!s[(0,i.Z)(t)]};var c=n(21162),l=n(98351),h=l.Z&&l.Z.isTypedArray;const u=h?(0,c.Z)(h):o},49360:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(t){return void 0===t}},17179:(t,e,n)=>{"use strict";n.d(e,{Z:()=>s});var i=n(87668),r=n(39473),a=n(50585);const s=function(t){return(0,a.Z)(t)?(0,i.Z)(t):(0,r.Z)(t)}},32957:(t,e,n)=>{"use strict";n.d(e,{Z:()=>h});var i=n(87668),r=n(77226),a=n(72764);const s=function(t){var e=[];if(null!=t)for(var n in Object(t))e.push(n);return e};var o=Object.prototype.hasOwnProperty;const c=function(t){if(!(0,r.Z)(t))return s(t);var e=(0,a.Z)(t),n=[];for(var i in t)("constructor"!=i||!e&&o.call(t,i))&&n.push(i);return n};var l=n(50585);const h=function(t){return(0,l.Z)(t)?(0,i.Z)(t,!0):c(t)}},43836:(t,e,n)=>{"use strict";n.d(e,{Z:()=>o});var i=n(74073),r=n(74765),a=n(21018),s=n(27771);const o=function(t,e){return((0,s.Z)(t)?i.Z:a.Z)(t,(0,r.Z)(e,3))}},42454:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var i=n(37834);function r(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)throw new TypeError("Expected a function");var n=function(){var i=arguments,r=e?e.apply(this,i):i[0],a=n.cache;if(a.has(r))return a.get(r);var s=t.apply(this,i);return n.cache=a.set(r,s)||a,s};return n.cache=new(r.Cache||i.Z),n}r.Cache=i.Z;const a=r},61666:(t,e,n)=>{"use strict";n.d(e,{Z:()=>y});var i=n(13317),r=n(72954),a=n(22823),s=n(56009),o=n(77226),c=n(62281);const l=function(t,e,n,i){if(!(0,o.Z)(t))return t;for(var l=-1,h=(e=(0,a.Z)(e,t)).length,u=h-1,d=t;null!=d&&++l<h;){var p=(0,c.Z)(e[l]),f=n;if("__proto__"===p||"constructor"===p||"prototype"===p)return t;if(l!=u){var g=d[p];void 0===(f=i?i(g,p,d):void 0)&&(f=(0,o.Z)(g)?g:(0,s.Z)(e[l+1])?[]:{})}(0,r.Z)(d,p,f),d=d[p]}return t};const h=function(t,e,n){for(var r=-1,s=e.length,o={};++r<s;){var c=e[r],h=(0,i.Z)(t,c);n(h,c)&&l(o,(0,a.Z)(c,t),h)}return o};var u=n(75487);const d=function(t,e){return h(t,e,(function(e,n){return(0,u.Z)(t,n)}))};var p=n(27961),f=n(81211),g=n(27227);const y=function(t){return(0,g.Z)((0,f.Z)(t,void 0,p.Z),t+"")}((function(t,e){return null==t?{}:d(t,e)}))},74379:(t,e,n)=>{"use strict";n.d(e,{Z:()=>c});var i=Math.ceil,r=Math.max;const a=function(t,e,n,a){for(var s=-1,o=r(i((e-t)/(n||1)),0),c=Array(o);o--;)c[a?o:++s]=t,t+=n;return c};var s=n(50439),o=n(94099);const c=function(t){return function(e,n,i){return i&&"number"!=typeof i&&(0,s.Z)(e,n,i)&&(n=i=void 0),e=(0,o.Z)(e),void 0===n?(n=e,e=0):n=(0,o.Z)(n),i=void 0===i?e<n?1:-1:(0,o.Z)(i),a(e,n,i,t)}}()},92344:(t,e,n)=>{"use strict";n.d(e,{Z:()=>c});const i=function(t,e,n,i){var r=-1,a=null==t?0:t.length;for(i&&a&&(n=t[++r]);++r<a;)n=e(n,t[r],r,t);return n};var r=n(49811),a=n(74765);const s=function(t,e,n,i,r){return r(t,(function(t,r,a){n=i?(i=!1,t):e(n,t,r,a)})),n};var o=n(27771);const c=function(t,e,n){var c=(0,o.Z)(t)?i:s,l=arguments.length<3;return c(t,(0,a.Z)(e,4),n,l,r.Z)}},60532:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(){return[]}},94099:(t,e,n)=>{"use strict";n.d(e,{Z:()=>g});var i=/\s/;const r=function(t){for(var e=t.length;e--&&i.test(t.charAt(e)););return e};var a=/^\s+/;const s=function(t){return t?t.slice(0,r(t)+1).replace(a,""):t};var o=n(77226),c=n(72714),l=/^[-+]0x[0-9a-f]+$/i,h=/^0b[01]+$/i,u=/^0o[0-7]+$/i,d=parseInt;const p=function(t){if("number"==typeof t)return t;if((0,c.Z)(t))return NaN;if((0,o.Z)(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=(0,o.Z)(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=s(t);var n=h.test(t);return n||u.test(t)?d(t.slice(2),n?2:8):l.test(t)?NaN:+t};var f=1/0;const g=function(t){return t?(t=p(t))===f||t===-1/0?17976931348623157e292*(t<0?-1:1):t==t?t:0:0===t?t:0}},50751:(t,e,n)=>{"use strict";n.d(e,{Z:()=>h});var i=n(17685),r=n(74073),a=n(27771),s=n(72714),o=i.Z?i.Z.prototype:void 0,c=o?o.toString:void 0;const l=function t(e){if("string"==typeof e)return e;if((0,a.Z)(e))return(0,r.Z)(e,t)+"";if((0,s.Z)(e))return c?c.call(e):"";var n=e+"";return"0"==n&&1/e==-Infinity?"-0":n};const h=function(t){return null==t?"":l(t)}},66749:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var i=n(50751),r=0;const a=function(t){var e=++r;return(0,i.Z)(t)+e}},34148:(t,e,n)=>{"use strict";n.d(e,{Z:()=>s});var i=n(74073);const r=function(t,e){return(0,i.Z)(e,(function(e){return t[e]}))};var a=n(17179);const s=function(t){return null==t?[]:r(t,(0,a.Z)(t))}}}]); \ No newline at end of file diff --git a/assets/js/8954.a36c6917.js.LICENSE.txt b/assets/js/8954.a36c6917.js.LICENSE.txt new file mode 100644 index 0000000000..f253ee25a6 --- /dev/null +++ b/assets/js/8954.a36c6917.js.LICENSE.txt @@ -0,0 +1,9 @@ +/*! + * Wait for document loaded before starting the execution + */ + +/*! @license DOMPurify 2.4.3 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/2.4.3/LICENSE */ + +/*! Check if previously processed */ + +/*! js-yaml 4.1.0 https://github.com/nodeca/js-yaml @license MIT */ diff --git a/assets/js/89ad43f4.2d8e789d.js b/assets/js/89ad43f4.2d8e789d.js new file mode 100644 index 0000000000..2ca2ed84d9 --- /dev/null +++ b/assets/js/89ad43f4.2d8e789d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5516],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>g});var n=r(67294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){i(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function s(e,t){if(null==e)return{};var r,n,i=function(e,t){if(null==e)return{};var r,n,i={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var c=n.createContext({}),l=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},p=function(e){var t=l(e.components);return n.createElement(c.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,a=e.originalType,c=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=l(r),f=i,g=d["".concat(c,".").concat(f)]||d[f]||u[f]||a;return r?n.createElement(g,o(o({ref:t},p),{},{components:r})):n.createElement(g,o({ref:t},p))}));function g(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=r.length,o=new Array(a);o[0]=f;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[d]="string"==typeof e?e:i,o[1]=s;for(var l=2;l<a;l++)o[l]=r[l];return n.createElement.apply(null,o)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},96946:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var n=r(87462),i=(r(67294),r(3905));const a={sidebar_label:"Services",sidebar_position:100},o="Services",s={unversionedId:"iaas/guides/deploy-guide/services/index",id:"iaas/guides/deploy-guide/services/index",title:"Services",description:"Getting started",source:"@site/docs/02-iaas/guides/deploy-guide/services/index.md",sourceDirName:"02-iaas/guides/deploy-guide/services",slug:"/iaas/guides/deploy-guide/services/",permalink:"/docs/iaas/guides/deploy-guide/services/",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/deploy-guide/services/index.md",tags:[],version:"current",sidebarPosition:100,frontMatter:{sidebar_label:"Services",sidebar_position:100},sidebar:"docs",previous:{title:"Bootstrap",permalink:"/docs/iaas/guides/deploy-guide/bootstrap"},next:{title:"Infrastructure",permalink:"/docs/iaas/guides/deploy-guide/services/infrastructure"}},c={},l=[{value:"Getting started",id:"getting-started",level:2}],p={toc:l},d="wrapper";function u(e){let{components:t,...r}=e;return(0,i.kt)(d,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"services"},"Services"),(0,i.kt)("h2",{id:"getting-started"},"Getting started"),(0,i.kt)("p",null,"When setting up a new environment, the services are deployed in a specific order."),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("a",{parentName:"li",href:"./infrastructure"},"Infrastructure")),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("a",{parentName:"li",href:"./network"},"Network")),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("a",{parentName:"li",href:"./logging-monitoring"},"Logging & Monitoring")),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("a",{parentName:"li",href:"./ceph"},"Ceph")),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("a",{parentName:"li",href:"./openstack"},"OpenStack"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8a671cf8.8561a958.js b/assets/js/8a671cf8.8561a958.js new file mode 100644 index 0000000000..0cb6922be4 --- /dev/null +++ b/assets/js/8a671cf8.8561a958.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4337],{3905:(e,t,n)=>{n.d(t,{Zo:()=>m,kt:()=>h});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},i=Object.keys(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),c=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},m=function(e){var t=c(e.components);return a.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},p=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,s=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),u=c(n),p=r,h=u["".concat(s,".").concat(p)]||u[p]||d[p]||i;return n?a.createElement(h,o(o({ref:t},m),{},{components:n})):a.createElement(h,o({ref:t},m))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=p;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:r,o[1]=l;for(var c=2;c<i;c++)o[c]=n[c];return a.createElement.apply(null,o)}return a.createElement.apply(null,n)}p.displayName="MDXCreateElement"},25666:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var a=n(87462),r=(n(67294),n(3905));const i={},o="Cluster Management on the capi management node",l={unversionedId:"container/components/k8s-cluster-api-provider/doc/usage/cluster-mgmt-capi-mgmt-node",id:"container/components/k8s-cluster-api-provider/doc/usage/cluster-mgmt-capi-mgmt-node",title:"Cluster Management on the capi management node",description:"You can use make ssh to log in to the capi management server. There you can issueclusterctl and kubectl (aliased",source:"@site/docs/03-container/components/k8s-cluster-api-provider/doc/usage/cluster-mgmt-capi-mgmt-node.md",sourceDirName:"03-container/components/k8s-cluster-api-provider/doc/usage",slug:"/container/components/k8s-cluster-api-provider/doc/usage/cluster-mgmt-capi-mgmt-node",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/usage/cluster-mgmt-capi-mgmt-node",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/03-container/components/k8s-cluster-api-provider/doc/usage/cluster-mgmt-capi-mgmt-node.md",tags:[],version:"current",frontMatter:{},sidebar:"docs",previous:{title:"Managing many clusters",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/usage/managing-many-clusters"},next:{title:"Multi-AZ and multi-cloud environments",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/usage/multi-az-and-multi-cloud-environments"}},s={},c=[],m={toc:c},u="wrapper";function d(e){let{components:t,...n}=e;return(0,r.kt)(u,(0,a.Z)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"cluster-management-on-the-capi-management-node"},"Cluster Management on the capi management node"),(0,r.kt)("p",null,"You can use ",(0,r.kt)("inlineCode",{parentName:"p"},"make ssh")," to log in to the capi management server. There you can issue",(0,r.kt)("inlineCode",{parentName:"p"},"clusterctl")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"kubectl")," (aliased\nto ",(0,r.kt)("inlineCode",{parentName:"p"},"k"),") commands. The context ",(0,r.kt)("inlineCode",{parentName:"p"},"kind-kind"),"\nis used for the CAPI management while the context ",(0,r.kt)("inlineCode",{parentName:"p"},"testcluster-admin@testcluster")," can\nbe used to control the workload cluster ",(0,r.kt)("inlineCode",{parentName:"p"},"testcluster"),". You can of course create many\nof them. There are management scripts on the management server:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"In the user's (ubuntu) home directory, create a subdirectory with the CLUSTERNAME\nto hold your cluster's configuration data. Copy over the ",(0,r.kt)("inlineCode",{parentName:"li"},"clusterctl.yaml")," file\nfrom ",(0,r.kt)("inlineCode",{parentName:"li"},"~/cluster-defaults/")," and edit it to meet your needs. Note that you can also\ncopy over ",(0,r.kt)("inlineCode",{parentName:"li"},"cloud.conf")," and ",(0,r.kt)("inlineCode",{parentName:"li"},"cluster-template.yaml")," and adjust them, but you don't\nneed to. (If you don't create the subdirectory, the ",(0,r.kt)("inlineCode",{parentName:"li"},"create_cluster.sh")," script\nwill do so for you and use all defaults settings.)"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"create_cluster.sh CLUSTERNAME"),": Use this command to create a cluster with\nthe settings from ",(0,r.kt)("inlineCode",{parentName:"li"},"~/$CLUSTERNAME/clusterctl.yaml"),". More precisely, it uses the template\n",(0,r.kt)("inlineCode",{parentName:"li"},"$CLUSTERNAME/cluster-template.yaml")," and fills in the settings from\n",(0,r.kt)("inlineCode",{parentName:"li"},"$CLUSTERNAME/clusterctl.yaml")," to render a config file ",(0,r.kt)("inlineCode",{parentName:"li"},"$CLUSTERNAME/$CLUSTERNAME-config.yaml"),"\nwhich will then be submitted to the capi server (",(0,r.kt)("inlineCode",{parentName:"li"},"kind-kind")," context) for creating\nthe control plane nodes and worker nodes. The script will also apply openstack integration,\ncinder CSI, calico or cilium CNI, and optionally also metrics server, nginx ingress controller,\nflux, cert-manager. (These can be controlled by ",(0,r.kt)("inlineCode",{parentName:"li"},"DEPLOY_XXX")," variables, see below.\nDefaults can be preconfigured from the environment.tfvars file during management server\ncreation.)\nNote that ",(0,r.kt)("inlineCode",{parentName:"li"},"CLUSTERNAME")," defaults to ",(0,r.kt)("inlineCode",{parentName:"li"},"testcluster")," and must not contain\nwhitespace.\nThe script also makes sure that appropriate CAPI images are available (it grabs them\nfrom ",(0,r.kt)("a",{parentName:"li",href:"https://swift.services.a.regiocloud.tech/swift/v1/AUTH_b182637428444b9aa302bb8d5a5a418c/openstack-k8s-capi-images"},"OSISM"),"\nas needed and registers them with OpenStack, following the SCS image metadata\nstandard).\nThe script returns once the control plane is fully working (the worker\nnodes might still be under construction). The kubectl file to talk to this\ncluster (as admin) can be found in ",(0,r.kt)("inlineCode",{parentName:"li"},"~/$CLUSTERNAME/$CLUSTERNAME.yaml"),". Expect the cluster\ncreation to take ~8mins. (CLUSTERNAME defaults to testcluster.) You can pass\n",(0,r.kt)("inlineCode",{parentName:"li"},"--context=${CLUSTERNAME}-admin@$CLUSTERNAME")," to ",(0,r.kt)("inlineCode",{parentName:"li"},"kubectl")," (with the\ndefault ",(0,r.kt)("inlineCode",{parentName:"li"},"~/.kubernetes/config")," config file) or ",(0,r.kt)("inlineCode",{parentName:"li"},"export KUBECONFIG=$CLUSTERNAME.yaml"),"\\\nto talk to the workload cluster."),(0,r.kt)("li",{parentName:"ul"},"The subdirectory ",(0,r.kt)("inlineCode",{parentName:"li"},"~/$CLUSTERNAME/deployed-manifests.d/")," will contain the\ndeployed manifests for reference (and in case of nginx-ingress also to facilitate\na full cleanup)."),(0,r.kt)("li",{parentName:"ul"},"The ",(0,r.kt)("inlineCode",{parentName:"li"},"clusterctl.yaml")," file can be edited the ",(0,r.kt)("inlineCode",{parentName:"li"},"create_cluster.sh")," script\nbe called again to submit the changes. (If you have not done any changes,\nre-running the script again is harmless.) Note that the ",(0,r.kt)("inlineCode",{parentName:"li"},"create_cluster.sh"),"\ndoes not currently remove any of the previously deployed services/deployments\nfrom the workload clusters -- this will be added later on with the appropriate\ncare and warnings. Also note that not all changes are allowed. You can easily\nchange the number of nodes or add k8s services to a cluster. For changing\nmachine flavors, machine images, kubernetes versions ... you will need to\nalso increase the ",(0,r.kt)("inlineCode",{parentName:"li"},"CONTROL_PLANE_MACHINE_GEN")," or the ",(0,r.kt)("inlineCode",{parentName:"li"},"WORKER_MACHINE_GEN"),"\ncounter to add a different suffix to these read-only resources. This will\ncause Cluster-API to orchestrate a rolling upgrade for you on rollout.\n(This is solved more elegantly in the helm chart style cluster management, see below.)"),(0,r.kt)("li",{parentName:"ul"},"The directory ",(0,r.kt)("inlineCode",{parentName:"li"},"~/k8s-cluster-api-provider/")," contains a checked out git tree\nfrom the SCS project. It can be updated (",(0,r.kt)("inlineCode",{parentName:"li"},"git pull"),") to receive the latest\nfixes and improvements. This way, most incremental updates do not need the\nrecreation of the management server (and thus also not the recreation of your\nmanaged workload clusters), but can be applied with calling ",(0,r.kt)("inlineCode",{parentName:"li"},"create_cluster.sh"),"\nagain to the workload clusters."),(0,r.kt)("li",{parentName:"ul"},"The installation of the openstack integration, cinder CSI, metrics server and\nnginx ingress controller is done via the ",(0,r.kt)("inlineCode",{parentName:"li"},"bin/apply_*.sh")," scripts that are called\nfrom ",(0,r.kt)("inlineCode",{parentName:"li"},"create_cluster.sh"),". You can manually call them as well -- they take\nthe cluster name as argument. (It's better to just call ",(0,r.kt)("inlineCode",{parentName:"li"},"create_cluster.sh"),"\nagain, though.) The applied yaml files are collected in\n",(0,r.kt)("inlineCode",{parentName:"li"},"~/$CLUSTERNAME/deployed-manifests.d/"),". You can ",(0,r.kt)("inlineCode",{parentName:"li"},"kubectl delete -f")," them\nto remove the functionality again."),(0,r.kt)("li",{parentName:"ul"},"You can, of course, also delete the cluster and create a new one if that\nlevel of disruption is fine for you. (See below in Advanced cluster templating\nwith helm to get an idea how we want to make this more convenient in the future.)"),(0,r.kt)("li",{parentName:"ul"},"Use ",(0,r.kt)("inlineCode",{parentName:"li"},"kubectl get clusters -A")," in the ",(0,r.kt)("inlineCode",{parentName:"li"},"kind-kind")," context to see what clusters\nexist. Use ",(0,r.kt)("inlineCode",{parentName:"li"},"kubectl get all -A")," in the ",(0,r.kt)("inlineCode",{parentName:"li"},"testcluster-admin@testcluster")," context\nto get an overview over the state of your workload cluster. You can access the logs\nfrom the capo controller in case you have trouble with cluster creation."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"delete_cluster.sh [CLUSTERNAME]"),": Tell the capi management server to remove\nthe cluster $CLUSTERNAME. It will also remove persistent volume claims belonging\nto the cluster. The script will return once the removal is done."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"cleanup.sh"),": Remove all running clusters."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"add_cluster-network.sh CLUSTERNAME")," adds the management server to the node network\nof the cluster ",(0,r.kt)("inlineCode",{parentName:"li"},"CLUSTERNAME"),", assuming that it runs on the same cloud (a region).\n",(0,r.kt)("inlineCode",{parentName:"li"},"remove_cluster-network.sh")," undoes this again. This is useful for debugging\npurposes.")),(0,r.kt)("p",null,"For your convenience, ",(0,r.kt)("inlineCode",{parentName:"p"},"k9s")," is installed on the management server as well\nas ",(0,r.kt)("inlineCode",{parentName:"p"},"calicoctl"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"cilium"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"hubble"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"cmctl"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"helm")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"sonobuoy"),".\nThese binaries can all be found in ",(0,r.kt)("inlineCode",{parentName:"p"},"/usr/local/bin")," while the helper scripts\nhave been deployed to ",(0,r.kt)("inlineCode",{parentName:"p"},"~/bin/"),"."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8aa3e7cc.d48d075e.js b/assets/js/8aa3e7cc.d48d075e.js new file mode 100644 index 0000000000..405b5ad07a --- /dev/null +++ b/assets/js/8aa3e7cc.d48d075e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3750],{86994:t=>{t.exports=JSON.parse('{"title":"Contribute","slug":"/category/contribute","permalink":"/community/category/contribute","navigation":{"previous":{"title":"Tips and Tricks","permalink":"/community/github/tips-and-tricks"},"next":{"title":"Adding Docs Guide","permalink":"/community/contribute/adding-docs-guide"}}}')}}]); \ No newline at end of file diff --git a/assets/js/8ba37aa2.72eb127d.js b/assets/js/8ba37aa2.72eb127d.js new file mode 100644 index 0000000000..b8779a736b --- /dev/null +++ b/assets/js/8ba37aa2.72eb127d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8994],{3905:(e,t,r)=>{r.d(t,{Zo:()=>l,kt:()=>h});var n=r(67294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var s=n.createContext({}),p=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):c(c({},t),e)),r},l=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,s=e.parentName,l=i(e,["components","mdxType","originalType","parentName"]),d=p(r),m=o,h=d["".concat(s,".").concat(m)]||d[m]||u[m]||a;return r?n.createElement(h,c(c({ref:t},l),{},{components:r})):n.createElement(h,c({ref:t},l))}));function h(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,c=new Array(a);c[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:o,c[1]=i;for(var p=2;p<a;p++)c[p]=r[p];return n.createElement.apply(null,c)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},78301:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>c,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>p});var n=r(87462),o=(r(67294),r(3905));const a={},c="Roadmap",i={unversionedId:"container/components/k8s-cluster-api-provider/doc/roadmap",id:"container/components/k8s-cluster-api-provider/doc/roadmap",title:"Roadmap",description:"Advanced cluster templating with helm (Technical Preview)",source:"@site/docs/03-container/components/k8s-cluster-api-provider/doc/roadmap.md",sourceDirName:"03-container/components/k8s-cluster-api-provider/doc",slug:"/container/components/k8s-cluster-api-provider/doc/roadmap",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/roadmap",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/03-container/components/k8s-cluster-api-provider/doc/roadmap.md",tags:[],version:"current",frontMatter:{},sidebar:"docs",previous:{title:"SCS k8s-cluster-api-provider upgrade guide",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/Upgrade-Guide"},next:{title:"Usage",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/usage/"}},s={},p=[{value:"Advanced cluster templating with helm (Technical Preview)",id:"advanced-cluster-templating-with-helm-technical-preview",level:2}],l={toc:p},d="wrapper";function u(e){let{components:t,...r}=e;return(0,o.kt)(d,(0,n.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"roadmap"},"Roadmap"),(0,o.kt)("h2",{id:"advanced-cluster-templating-with-helm-technical-preview"},"Advanced cluster templating with helm (Technical Preview)"),(0,o.kt)("p",null,"On the management server, we have not only helm installed, but also the repository ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/stackhpc/capi-helm-charts"},"https://github.com/stackhpc/capi-helm-charts")," checked out. Amongst other things, it automates the creation of new machine templates when needed and doing rolling updates on your k8s cluster with clusterctl. This allows for an easy adaptation of your cluster to\ndifferent requirements, new k8s versions etc."),(0,o.kt)("p",null,"Please note that this is currently evolving quickly and we have not completely assessed and tested the capabilities. We intend to do this after R2 and eventually recommend this as the standard way of managing clusters in production. At this point, it's included as a technical preview."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8fc094a7.5adfaa2c.js b/assets/js/8fc094a7.5adfaa2c.js new file mode 100644 index 0000000000..c798f2826d --- /dev/null +++ b/assets/js/8fc094a7.5adfaa2c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3286],{3905:(e,r,t)=>{t.d(r,{Zo:()=>u,kt:()=>m});var n=t(67294);function a(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function o(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function i(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?o(Object(t),!0).forEach((function(r){a(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):o(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}function s(e,r){if(null==e)return{};var t,n,a=function(e,r){if(null==e)return{};var t,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)t=o[n],r.indexOf(t)>=0||(a[t]=e[t]);return a}(e,r);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)t=o[n],r.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var c=n.createContext({}),p=function(e){var r=n.useContext(c),t=r;return e&&(t="function"==typeof e?e(r):i(i({},r),e)),t},u=function(e){var r=p(e.components);return n.createElement(c.Provider,{value:r},e.children)},d="mdxType",l={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},g=n.forwardRef((function(e,r){var t=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),d=p(t),g=a,m=d["".concat(c,".").concat(g)]||d[g]||l[g]||o;return t?n.createElement(m,i(i({ref:r},u),{},{components:t})):n.createElement(m,i({ref:r},u))}));function m(e,r){var t=arguments,a=r&&r.mdxType;if("string"==typeof e||a){var o=t.length,i=new Array(o);i[0]=g;var s={};for(var c in r)hasOwnProperty.call(r,c)&&(s[c]=r[c]);s.originalType=e,s[d]="string"==typeof e?e:a,i[1]=s;for(var p=2;p<o;p++)i[p]=t[p];return n.createElement.apply(null,i)}return n.createElement.apply(null,t)}g.displayName="MDXCreateElement"},9591:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>c,contentTitle:()=>i,default:()=>l,frontMatter:()=>o,metadata:()=>s,toc:()=>p});var n=t(87462),a=(t(67294),t(3905));const o={sidebar_label:"Manager",sidebar_position:10},i="Manager",s={unversionedId:"iaas/guides/operations-guide/manager/index",id:"iaas/guides/operations-guide/manager/index",title:"Manager",description:"OSISM orchestrator",source:"@site/docs/02-iaas/guides/operations-guide/manager/index.md",sourceDirName:"02-iaas/guides/operations-guide/manager",slug:"/iaas/guides/operations-guide/manager/",permalink:"/docs/iaas/guides/operations-guide/manager/",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/operations-guide/manager/index.md",tags:[],version:"current",sidebarPosition:10,frontMatter:{sidebar_label:"Manager",sidebar_position:10},sidebar:"docs",previous:{title:"Operations Guide",permalink:"/docs/iaas/guides/operations-guide/"},next:{title:"Apply",permalink:"/docs/iaas/guides/operations-guide/manager/apply"}},c={},p=[],u={toc:p},d="wrapper";function l(e){let{components:r,...o}=e;return(0,a.kt)(d,(0,n.Z)({},u,o,{components:r,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"manager"},"Manager"),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"OSISM orchestrator",src:t(95676).Z,width:"1303",height:"591"})))}l.isMDXComponent=!0},95676:(e,r,t)=>{t.d(r,{Z:()=>n});const n=t.p+"assets/images/python-osism.drawio-19e90813de60b4afa58bc7ee4a3aeae8.png"}}]); \ No newline at end of file diff --git a/assets/js/904.c767a1e2.js b/assets/js/904.c767a1e2.js new file mode 100644 index 0000000000..7eab2522aa --- /dev/null +++ b/assets/js/904.c767a1e2.js @@ -0,0 +1 @@ +(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[904],{3905:(e,t,n)=>{"use strict";n.d(t,{Zo:()=>u,kt:()=>p});var r=n(67294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?s(Object(n),!0).forEach((function(t){i(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):s(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function a(e,t){if(null==e)return{};var n,r,i=function(e,t){if(null==e)return{};var n,r,i={},s=Object.keys(e);for(r=0;r<s.length;r++)n=s[r],t.indexOf(n)>=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(r=0;r<s.length;r++)n=s[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},d="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},f=r.forwardRef((function(e,t){var n=e.components,i=e.mdxType,s=e.originalType,l=e.parentName,u=a(e,["components","mdxType","originalType","parentName"]),d=c(n),f=i,p=d["".concat(l,".").concat(f)]||d[f]||h[f]||s;return n?r.createElement(p,o(o({ref:t},u),{},{components:n})):r.createElement(p,o({ref:t},u))}));function p(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var s=n.length,o=new Array(s);o[0]=f;var a={};for(var l in t)hasOwnProperty.call(t,l)&&(a[l]=t[l]);a.originalType=e,a[d]="string"==typeof e?e:i,o[1]=a;for(var c=2;c<s;c++)o[c]=n[c];return r.createElement.apply(null,o)}return r.createElement.apply(null,n)}f.displayName="MDXCreateElement"},18350:e=>{var t,n,r,i;(t=e.exports).foldLength=75,t.newLineChar="\r\n",t.helpers={updateTimezones:function(e){var n,r,i,s,o,a;if(!e||"vcalendar"!==e.name)return e;for(n=e.getAllSubcomponents(),r=[],i={},o=0;o<n.length;o++)"vtimezone"===n[o].name?i[a=n[o].getFirstProperty("tzid").getFirstValue()]=n[o]:r=r.concat(n[o].getAllProperties());for(s={},o=0;o<r.length;o++)(a=r[o].getParameter("tzid"))&&(s[a]=!0);for(o in i)i.hasOwnProperty(o)&&!s[o]&&e.removeSubcomponent(i[o]);for(o in s)s.hasOwnProperty(o)&&!i[o]&&t.TimezoneService.has(o)&&e.addSubcomponent(t.TimezoneService.get(o).component);return e},isStrictlyNaN:function(e){return"number"==typeof e&&isNaN(e)},strictParseInt:function(e){var n=parseInt(e,10);if(t.helpers.isStrictlyNaN(n))throw new Error('Could not extract integer from "'+e+'"');return n},formatClassType:function(e,t){if(void 0!==e)return e instanceof t?e:new t(e)},unescapedIndexOf:function(e,t,n){for(;-1!==(n=e.indexOf(t,n));){if(!(n>0&&"\\"===e[n-1]))return n;n+=1}return-1},binsearchInsert:function(e,t,n){if(!e.length)return 0;for(var r,i,s=0,o=e.length-1;s<=o;)if((i=n(t,e[r=s+Math.floor((o-s)/2)]))<0)o=r-1;else{if(!(i>0))break;s=r+1}return i<0?r:i>0?r+1:r},dumpn:function(){t.debug&&("undefined"!=typeof console&&"log"in console?t.helpers.dumpn=function(e){console.log(e)}:t.helpers.dumpn=function(e){dump(e+"\n")},t.helpers.dumpn(arguments[0]))},clone:function(e,n){if(e&&"object"==typeof e){if(e instanceof Date)return new Date(e.getTime());if("clone"in e)return e.clone();if(Array.isArray(e)){for(var r=[],i=0;i<e.length;i++)r.push(n?t.helpers.clone(e[i],!0):e[i]);return r}var s={};for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&(s[o]=n?t.helpers.clone(e[o],!0):e[o]);return s}return e},foldline:function(e){for(var n="",r=e||"",i=0,s=0;r.length;){var o=r.codePointAt(i);o<128?++s:s+=o<2048?2:o<65536?3:4,s<t.foldLength+1?i+=o>65535?2:1:(n+=t.newLineChar+" "+r.substring(0,i),r=r.substring(i),i=s=0)}return n.substr(t.newLineChar.length+1)},pad2:function(e){switch("string"!=typeof e&&("number"==typeof e&&(e=parseInt(e)),e=String(e)),e.length){case 0:return"00";case 1:return"0"+e;default:return e}},trunc:function(e){return e<0?Math.ceil(e):Math.floor(e)},inherits:function(e,n,r){function i(){}i.prototype=e.prototype,n.prototype=new i,r&&t.helpers.extend(r,n.prototype)},extend:function(e,t){for(var n in e){var r=Object.getOwnPropertyDescriptor(e,n);r&&!Object.getOwnPropertyDescriptor(t,n)&&Object.defineProperty(t,n,r)}return t}},t.design=function(){"use strict";var e=/\\\\|\\,|\\[Nn]/g,n=/\\|,|\n/g;function r(e,t){return{matches:/.*/,fromICAL:function(t,n){return function(e,t,n){if(-1===e.indexOf("\\"))return e;n&&(t=new RegExp(t.source+"|\\\\"+n));return e.replace(t,p)}(t,e,n)},toICAL:function(e,n){var r=t;return n&&(r=new RegExp(r.source+"|"+n)),e.replace(r,(function(e){switch(e){case"\\":return"\\\\";case";":return"\\;";case",":return"\\,";case"\n":return"\\n";default:return e}}))}}}var i={defaultType:"text"},s={defaultType:"text",multiValue:","},o={defaultType:"text",structuredValue:";"},a={defaultType:"integer"},l={defaultType:"date-time",allowedTypes:["date-time","date"]},c={defaultType:"date-time"},u={defaultType:"uri"},d={defaultType:"utc-offset"},h={defaultType:"recur"},f={defaultType:"date-and-or-time",allowedTypes:["date-time","date","text"]};function p(e){switch(e){case"\\\\":return"\\";case"\\;":return";";case"\\,":return",";case"\\n":case"\\N":return"\n";default:return e}}var g={categories:s,url:u,version:i,uid:i},m={boolean:{values:["TRUE","FALSE"],fromICAL:function(e){return"TRUE"===e},toICAL:function(e){return e?"TRUE":"FALSE"}},float:{matches:/^[+-]?\d+\.\d+$/,fromICAL:function(e){var n=parseFloat(e);return t.helpers.isStrictlyNaN(n)?0:n},toICAL:function(e){return String(e)}},integer:{fromICAL:function(e){var n=parseInt(e);return t.helpers.isStrictlyNaN(n)?0:n},toICAL:function(e){return String(e)}},"utc-offset":{toICAL:function(e){return e.length<7?e.substr(0,3)+e.substr(4,2):e.substr(0,3)+e.substr(4,2)+e.substr(7,2)},fromICAL:function(e){return e.length<6?e.substr(0,3)+":"+e.substr(3,2):e.substr(0,3)+":"+e.substr(3,2)+":"+e.substr(5,2)},decorate:function(e){return t.UtcOffset.fromString(e)},undecorate:function(e){return e.toString()}}},v=t.helpers.extend(m,{text:r(/\\\\|\\;|\\,|\\[Nn]/g,/\\|;|,|\n/g),uri:{},binary:{decorate:function(e){return t.Binary.fromString(e)},undecorate:function(e){return e.toString()}},"cal-address":{},date:{decorate:function(e,n){return T.strict?t.Time.fromDateString(e,n):t.Time.fromString(e,n)},undecorate:function(e){return e.toString()},fromICAL:function(e){return!T.strict&&e.length>=15?v["date-time"].fromICAL(e):e.substr(0,4)+"-"+e.substr(4,2)+"-"+e.substr(6,2)},toICAL:function(e){var t=e.length;return 10==t?e.substr(0,4)+e.substr(5,2)+e.substr(8,2):t>=19?v["date-time"].toICAL(e):e}},"date-time":{fromICAL:function(e){if(T.strict||8!=e.length){var t=e.substr(0,4)+"-"+e.substr(4,2)+"-"+e.substr(6,2)+"T"+e.substr(9,2)+":"+e.substr(11,2)+":"+e.substr(13,2);return e[15]&&"Z"===e[15]&&(t+="Z"),t}return v.date.fromICAL(e)},toICAL:function(e){var t=e.length;if(10!=t||T.strict){if(t>=19){var n=e.substr(0,4)+e.substr(5,2)+e.substr(8,5)+e.substr(14,2)+e.substr(17,2);return e[19]&&"Z"===e[19]&&(n+="Z"),n}return e}return v.date.toICAL(e)},decorate:function(e,n){return T.strict?t.Time.fromDateTimeString(e,n):t.Time.fromString(e,n)},undecorate:function(e){return e.toString()}},duration:{decorate:function(e){return t.Duration.fromString(e)},undecorate:function(e){return e.toString()}},period:{fromICAL:function(e){var n=e.split("/");return n[0]=v["date-time"].fromICAL(n[0]),t.Duration.isValueString(n[1])||(n[1]=v["date-time"].fromICAL(n[1])),n},toICAL:function(e){return T.strict||10!=e[0].length?e[0]=v["date-time"].toICAL(e[0]):e[0]=v.date.toICAL(e[0]),t.Duration.isValueString(e[1])||(T.strict||10!=e[1].length?e[1]=v["date-time"].toICAL(e[1]):e[1]=v.date.toICAL(e[1])),e.join("/")},decorate:function(e,n){return t.Period.fromJSON(e,n,!T.strict)},undecorate:function(e){return e.toJSON()}},recur:{fromICAL:function(e){return t.Recur._stringToData(e,!0)},toICAL:function(e){var n="";for(var r in e)if(Object.prototype.hasOwnProperty.call(e,r)){var i=e[r];"until"==r?i=i.length>10?v["date-time"].toICAL(i):v.date.toICAL(i):"wkst"==r?"number"==typeof i&&(i=t.Recur.numericDayToIcalDay(i)):Array.isArray(i)&&(i=i.join(",")),n+=r.toUpperCase()+"="+i+";"}return n.substr(0,n.length-1)},decorate:function(e){return t.Recur.fromData(e)},undecorate:function(e){return e.toJSON()}},time:{fromICAL:function(e){if(e.length<6)return e;var t=e.substr(0,2)+":"+e.substr(2,2)+":"+e.substr(4,2);return"Z"===e[6]&&(t+="Z"),t},toICAL:function(e){if(e.length<8)return e;var t=e.substr(0,2)+e.substr(3,2)+e.substr(6,2);return"Z"===e[8]&&(t+="Z"),t}}}),y=t.helpers.extend(g,{action:i,attach:{defaultType:"uri"},attendee:{defaultType:"cal-address"},calscale:i,class:i,comment:i,completed:c,contact:i,created:c,description:i,dtend:l,dtstamp:c,dtstart:l,due:l,duration:{defaultType:"duration"},exdate:{defaultType:"date-time",allowedTypes:["date-time","date"],multiValue:","},exrule:h,freebusy:{defaultType:"period",multiValue:","},geo:{defaultType:"float",structuredValue:";"},"last-modified":c,location:i,method:i,organizer:{defaultType:"cal-address"},"percent-complete":a,priority:a,prodid:i,"related-to":i,repeat:a,rdate:{defaultType:"date-time",allowedTypes:["date-time","date","period"],multiValue:",",detectType:function(e){return-1!==e.indexOf("/")?"period":-1===e.indexOf("T")?"date":"date-time"}},"recurrence-id":l,resources:s,"request-status":o,rrule:h,sequence:a,status:i,summary:i,transp:i,trigger:{defaultType:"duration",allowedTypes:["duration","date-time"]},tzoffsetfrom:d,tzoffsetto:d,tzurl:u,tzid:i,tzname:i}),b=t.helpers.extend(m,{text:r(e,n),uri:r(e,n),date:{decorate:function(e){return t.VCardTime.fromDateAndOrTimeString(e,"date")},undecorate:function(e){return e.toString()},fromICAL:function(e){return 8==e.length?v.date.fromICAL(e):"-"==e[0]&&6==e.length?e.substr(0,4)+"-"+e.substr(4):e},toICAL:function(e){return 10==e.length?v.date.toICAL(e):"-"==e[0]&&7==e.length?e.substr(0,4)+e.substr(5):e}},time:{decorate:function(e){return t.VCardTime.fromDateAndOrTimeString("T"+e,"time")},undecorate:function(e){return e.toString()},fromICAL:function(e){var t=b.time._splitZone(e,!0),n=t[0],r=t[1];return 6==r.length?r=r.substr(0,2)+":"+r.substr(2,2)+":"+r.substr(4,2):4==r.length&&"-"!=r[0]?r=r.substr(0,2)+":"+r.substr(2,2):5==r.length&&(r=r.substr(0,3)+":"+r.substr(3,2)),5!=n.length||"-"!=n[0]&&"+"!=n[0]||(n=n.substr(0,3)+":"+n.substr(3)),r+n},toICAL:function(e){var t=b.time._splitZone(e),n=t[0],r=t[1];return 8==r.length?r=r.substr(0,2)+r.substr(3,2)+r.substr(6,2):5==r.length&&"-"!=r[0]?r=r.substr(0,2)+r.substr(3,2):6==r.length&&(r=r.substr(0,3)+r.substr(4,2)),6!=n.length||"-"!=n[0]&&"+"!=n[0]||(n=n.substr(0,3)+n.substr(4)),r+n},_splitZone:function(e,t){var n,r,i=e.length-1,s=e.length-(t?5:6),o=e[s];return"Z"==e[i]?(n=e[i],r=e.substr(0,i)):e.length>6&&("-"==o||"+"==o)?(n=e.substr(s),r=e.substr(0,s)):(n="",r=e),[n,r]}},"date-time":{decorate:function(e){return t.VCardTime.fromDateAndOrTimeString(e,"date-time")},undecorate:function(e){return e.toString()},fromICAL:function(e){return b["date-and-or-time"].fromICAL(e)},toICAL:function(e){return b["date-and-or-time"].toICAL(e)}},"date-and-or-time":{decorate:function(e){return t.VCardTime.fromDateAndOrTimeString(e,"date-and-or-time")},undecorate:function(e){return e.toString()},fromICAL:function(e){var t=e.split("T");return(t[0]?b.date.fromICAL(t[0]):"")+(t[1]?"T"+b.time.fromICAL(t[1]):"")},toICAL:function(e){var t=e.split("T");return b.date.toICAL(t[0])+(t[1]?"T"+b.time.toICAL(t[1]):"")}},timestamp:v["date-time"],"language-tag":{matches:/^[a-zA-Z0-9-]+$/}}),D=t.helpers.extend(g,{adr:{defaultType:"text",structuredValue:";",multiValue:","},anniversary:f,bday:f,caladruri:u,caluri:u,clientpidmap:o,email:i,fburl:u,fn:i,gender:o,geo:u,impp:u,key:u,kind:i,lang:{defaultType:"language-tag"},logo:u,member:u,n:{defaultType:"text",structuredValue:";",multiValue:","},nickname:s,note:i,org:{defaultType:"text",structuredValue:";"},photo:u,related:u,rev:{defaultType:"timestamp"},role:i,sound:u,source:u,tel:{defaultType:"uri",allowedTypes:["uri","text"]},title:i,tz:{defaultType:"text",allowedTypes:["text","utc-offset","uri"]},xml:i}),A=t.helpers.extend(m,{binary:v.binary,date:b.date,"date-time":b["date-time"],"phone-number":{},uri:v.uri,text:v.text,time:v.time,vcard:v.text,"utc-offset":{toICAL:function(e){return e.substr(0,7)},fromICAL:function(e){return e.substr(0,7)},decorate:function(e){return t.UtcOffset.fromString(e)},undecorate:function(e){return e.toString()}}}),E=t.helpers.extend(g,{fn:i,n:{defaultType:"text",structuredValue:";",multiValue:","},nickname:s,photo:{defaultType:"binary",allowedTypes:["binary","uri"]},bday:{defaultType:"date-time",allowedTypes:["date-time","date"],detectType:function(e){return-1===e.indexOf("T")?"date":"date-time"}},adr:{defaultType:"text",structuredValue:";",multiValue:","},label:i,tel:{defaultType:"phone-number"},email:i,mailer:i,tz:{defaultType:"utc-offset",allowedTypes:["utc-offset","text"]},geo:{defaultType:"float",structuredValue:";"},title:i,role:i,logo:{defaultType:"binary",allowedTypes:["binary","uri"]},agent:{defaultType:"vcard",allowedTypes:["vcard","text","uri"]},org:o,note:s,prodid:i,rev:{defaultType:"date-time",allowedTypes:["date-time","date"],detectType:function(e){return-1===e.indexOf("T")?"date":"date-time"}},"sort-string":i,sound:{defaultType:"binary",allowedTypes:["binary","uri"]},class:i,key:{defaultType:"binary",allowedTypes:["binary","text"]}}),_={value:v,param:{cutype:{values:["INDIVIDUAL","GROUP","RESOURCE","ROOM","UNKNOWN"],allowXName:!0,allowIanaToken:!0},"delegated-from":{valueType:"cal-address",multiValue:",",multiValueSeparateDQuote:!0},"delegated-to":{valueType:"cal-address",multiValue:",",multiValueSeparateDQuote:!0},encoding:{values:["8BIT","BASE64"]},fbtype:{values:["FREE","BUSY","BUSY-UNAVAILABLE","BUSY-TENTATIVE"],allowXName:!0,allowIanaToken:!0},member:{valueType:"cal-address",multiValue:",",multiValueSeparateDQuote:!0},partstat:{values:["NEEDS-ACTION","ACCEPTED","DECLINED","TENTATIVE","DELEGATED","COMPLETED","IN-PROCESS"],allowXName:!0,allowIanaToken:!0},range:{values:["THISANDFUTURE"]},related:{values:["START","END"]},reltype:{values:["PARENT","CHILD","SIBLING"],allowXName:!0,allowIanaToken:!0},role:{values:["REQ-PARTICIPANT","CHAIR","OPT-PARTICIPANT","NON-PARTICIPANT"],allowXName:!0,allowIanaToken:!0},rsvp:{values:["TRUE","FALSE"]},"sent-by":{valueType:"cal-address"},tzid:{matches:/^\//},value:{values:["binary","boolean","cal-address","date","date-time","duration","float","integer","period","recur","text","time","uri","utc-offset"],allowXName:!0,allowIanaToken:!0}},property:y},S={value:b,param:{type:{valueType:"text",multiValue:","},value:{values:["text","uri","date","time","date-time","date-and-or-time","timestamp","boolean","integer","float","utc-offset","language-tag"],allowXName:!0,allowIanaToken:!0}},property:D},w={value:A,param:{type:{valueType:"text",multiValue:","},value:{values:["text","uri","date","date-time","phone-number","time","boolean","integer","float","utc-offset","vcard","binary"],allowXName:!0,allowIanaToken:!0}},property:E},T={strict:!0,defaultSet:_,defaultType:"unknown",components:{vcard:S,vcard3:w,vevent:_,vtodo:_,vjournal:_,valarm:_,vtimezone:_,daylight:_,standard:_},icalendar:_,vcard:S,vcard3:w,getDesignSet:function(e){return e&&e in T.components?T.components[e]:T.defaultSet}};return T}(),t.stringify=function(){"use strict";var e="\r\n",n="unknown",r=t.design,i=t.helpers;function s(t){"string"==typeof t[0]&&(t=[t]);for(var n=0,r=t.length,i="";n<r;n++)i+=s.component(t[n])+e;return i}s.component=function(t,n){var i=t[0].toUpperCase(),o="BEGIN:"+i+e,a=t[1],l=0,c=a.length,u=t[0];for("vcard"===u&&t[1].length>0&&("version"!==t[1][0][0]||"4.0"!==t[1][0][3])&&(u="vcard3"),n=n||r.getDesignSet(u);l<c;l++)o+=s.property(a[l],n)+e;for(var d=t[2]||[],h=0,f=d.length;h<f;h++)o+=s.component(d[h],n)+e;return o+="END:"+i},s.property=function(e,i,o){var a,l=e[0].toUpperCase(),c=e[0],u=e[1],d=l;for(a in u){var h=u[a];if(u.hasOwnProperty(a))(g=a in i.param&&i.param[a].multiValue)&&Array.isArray(h)?(i.param[a].multiValueSeparateDQuote&&(g='"'+g+'"'),h=h.map(s._rfc6868Unescape),h=s.multiValue(h,g,"unknown",null,i)):h=s._rfc6868Unescape(h),d+=";"+a.toUpperCase(),d+="="+s.propertyValue(h)}if(3===e.length)return d+":";var f,p=e[2];i||(i=r.defaultSet);var g=!1,m=!1,v=!1;return c in i.property?("multiValue"in(f=i.property[c])&&(g=f.multiValue),"structuredValue"in f&&Array.isArray(e[3])&&(m=f.structuredValue),"defaultType"in f?p===f.defaultType&&(v=!0):p===n&&(v=!0)):p===n&&(v=!0),v||(d+=";VALUE="+p.toUpperCase()),d+=":",d+=g&&m?s.multiValue(e[3],m,p,g,i,m):g?s.multiValue(e.slice(3),g,p,null,i,!1):m?s.multiValue(e[3],m,p,null,i,m):s.value(e[3],p,i,!1),o?d:t.helpers.foldline(d)},s.propertyValue=function(e){return-1===i.unescapedIndexOf(e,",")&&-1===i.unescapedIndexOf(e,":")&&-1===i.unescapedIndexOf(e,";")?e:'"'+e+'"'},s.multiValue=function(e,t,n,r,i,o){for(var a="",l=e.length,c=0;c<l;c++)r&&Array.isArray(e[c])?a+=s.multiValue(e[c],r,n,null,i,o):a+=s.value(e[c],n,i,o),c!==l-1&&(a+=t);return a},s.value=function(e,t,n,r){return t in n.value&&"toICAL"in n.value[t]?n.value[t].toICAL(e,r):e},s._rfc6868Unescape=function(e){return e.replace(/[\n^"]/g,(function(e){return o[e]}))};var o={'"':"^'","\n":"^n","^":"^^"};return s}(),t.parse=function(){"use strict";var e=/[^ \t]/,n=t.design,r=t.helpers;function i(e){this.message=e,this.name="ParserError";try{throw new Error}catch(n){if(n.stack){var t=n.stack.split("\n");t.shift(),this.stack=t.join("\n")}}}function s(e){var t={},n=t.component=[];if(t.stack=[n],s._eachLine(e,(function(e,n){s._handleContentLine(n,t)})),t.stack.length>1)throw new i("invalid ical body. component began but did not end");return t=null,1==n.length?n[0]:n}i.prototype=Error.prototype,s.property=function(e,t){var r={component:[[],[]],designSet:t||n.defaultSet};return s._handleContentLine(e,r),r.component[1][0]},s.component=function(e){return s(e)},s.ParserError=i,s._handleContentLine=function(e,t){var r,o,a,l,c,u,d=e.indexOf(":"),h=e.indexOf(";"),f={};if(-1!==h&&-1!==d&&h>d&&(h=-1),-1!==h){if(a=e.substring(0,h).toLowerCase(),-1==(c=s._parseParameters(e.substring(h),0,t.designSet))[2])throw new i("Invalid parameters in '"+e+"'");if(f=c[0],r=c[1].length+c[2]+h,-1===(o=e.substring(r).indexOf(":")))throw new i("Missing parameter value in '"+e+"'");l=e.substring(r+o+1)}else{if(-1===d)throw new i('invalid line (no token ";" or ":") "'+e+'"');if(a=e.substring(0,d).toLowerCase(),l=e.substring(d+1),"begin"===a){var p=[l.toLowerCase(),[],[]];return 1===t.stack.length?t.component.push(p):t.component[2].push(p),t.stack.push(t.component),t.component=p,void(t.designSet||(t.designSet=n.getDesignSet(t.component[0])))}if("end"===a)return void(t.component=t.stack.pop())}var g,m,v=!1,y=!1;a in t.designSet.property&&("multiValue"in(g=t.designSet.property[a])&&(v=g.multiValue),"structuredValue"in g&&(y=g.structuredValue),l&&"detectType"in g&&(u=g.detectType(l))),u||(u="value"in f?f.value.toLowerCase():g?g.defaultType:"unknown"),delete f.value,v&&y?m=[a,f,u,l=s._parseMultiValue(l,y,u,[],v,t.designSet,y)]:v?(m=[a,f,u],s._parseMultiValue(l,v,u,m,null,t.designSet,!1)):m=y?[a,f,u,l=s._parseMultiValue(l,y,u,[],null,t.designSet,y)]:[a,f,u,l=s._parseValue(l,u,t.designSet,!1)],"vcard"!==t.component[0]||0!==t.component[1].length||"version"===a&&"4.0"===l||(t.designSet=n.getDesignSet("vcard3")),t.component[1].push(m)},s._parseValue=function(e,t,n,r){return t in n.value&&"fromICAL"in n.value[t]?n.value[t].fromICAL(e,r):e},s._parseParameters=function(e,t,n){for(var o,a,l,c,u,d,h=t,f=0,p={},g=-1;!1!==f&&-1!==(f=r.unescapedIndexOf(e,"=",f+1));){if(0==(o=e.substr(h+1,f-h-1)).length)throw new i("Empty parameter name in '"+e+"'");if(d=!1,u=!1,c=(a=o.toLowerCase())in n.param&&n.param[a].valueType?n.param[a].valueType:"text",a in n.param&&(u=n.param[a].multiValue,n.param[a].multiValueSeparateDQuote&&(d=s._rfc6868Escape('"'+u+'"'))),'"'===e[f+1]){if(g=f+2,f=r.unescapedIndexOf(e,'"',g),u&&-1!=f)for(var m=!0;m;)e[f+1]==u&&'"'==e[f+2]?f=r.unescapedIndexOf(e,'"',f+3):m=!1;if(-1===f)throw new i('invalid line (no matching double quote) "'+e+'"');l=e.substr(g,f-g),-1===(h=r.unescapedIndexOf(e,";",f))&&(f=!1)}else{g=f+1;var v=r.unescapedIndexOf(e,";",g),y=r.unescapedIndexOf(e,":",g);-1!==y&&v>y?(v=y,f=!1):-1===v?(v=-1===y?e.length:y,f=!1):(h=v,f=v),l=e.substr(g,v-g)}if(l=s._rfc6868Escape(l),u){var b=d||u;l=s._parseMultiValue(l,b,c,[],null,n)}else l=s._parseValue(l,c,n);u&&a in p?Array.isArray(p[a])?p[a].push(l):p[a]=[p[a],l]:p[a]=l}return[p,l,g]},s._rfc6868Escape=function(e){return e.replace(/\^['n^]/g,(function(e){return o[e]}))};var o={"^'":'"',"^n":"\n","^^":"^"};return s._parseMultiValue=function(e,t,n,i,o,a,l){var c,u=0,d=0;if(0===t.length)return e;for(;-1!==(u=r.unescapedIndexOf(e,t,d));)c=e.substr(d,u-d),c=o?s._parseMultiValue(c,o,n,[],null,a,l):s._parseValue(c,n,a,l),i.push(c),d=u+t.length;return c=e.substr(d),c=o?s._parseMultiValue(c,o,n,[],null,a,l):s._parseValue(c,n,a,l),i.push(c),1==i.length?i[0]:i},s._eachLine=function(t,n){var r,i,s,o=t.length,a=t.search(e),l=a;do{s=(l=t.indexOf("\n",a)+1)>1&&"\r"===t[l-2]?2:1,0===l&&(l=o,s=0)," "===(i=t[a])||"\t"===i?r+=t.substr(a+1,l-a-(s+1)):(r&&n(null,r),r=t.substr(a,l-a-s)),a=l}while(l!==o);(r=r.trim()).length&&n(null,r)},s}(),t.Component=function(){"use strict";function e(e,t){"string"==typeof e&&(e=[e,[],[]]),this.jCal=e,this.parent=t||null}return e.prototype={_hydratedPropertyCount:0,_hydratedComponentCount:0,get name(){return this.jCal[0]},get _designSet(){return this.parent&&this.parent._designSet||t.design.getDesignSet(this.name)},_hydrateComponent:function(t){if(this._components||(this._components=[],this._hydratedComponentCount=0),this._components[t])return this._components[t];var n=new e(this.jCal[2][t],this);return this._hydratedComponentCount++,this._components[t]=n},_hydrateProperty:function(e){if(this._properties||(this._properties=[],this._hydratedPropertyCount=0),this._properties[e])return this._properties[e];var n=new t.Property(this.jCal[1][e],this);return this._hydratedPropertyCount++,this._properties[e]=n},getFirstSubcomponent:function(e){if(e)for(var t=0,n=this.jCal[2],r=n.length;t<r;t++){if(n[t][0]===e)return this._hydrateComponent(t)}else if(this.jCal[2].length)return this._hydrateComponent(0);return null},getAllSubcomponents:function(e){var t=this.jCal[2].length,n=0;if(e){for(var r=this.jCal[2],i=[];n<t;n++)e===r[n][0]&&i.push(this._hydrateComponent(n));return i}if(!this._components||this._hydratedComponentCount!==t)for(;n<t;n++)this._hydrateComponent(n);return this._components||[]},hasProperty:function(e){for(var t=this.jCal[1],n=t.length,r=0;r<n;r++)if(t[r][0]===e)return!0;return!1},getFirstProperty:function(e){if(e)for(var t=0,n=this.jCal[1],r=n.length;t<r;t++){if(n[t][0]===e)return this._hydrateProperty(t)}else if(this.jCal[1].length)return this._hydrateProperty(0);return null},getFirstPropertyValue:function(e){var t=this.getFirstProperty(e);return t?t.getFirstValue():null},getAllProperties:function(e){var t=this.jCal[1].length,n=0;if(e){for(var r=this.jCal[1],i=[];n<t;n++)e===r[n][0]&&i.push(this._hydrateProperty(n));return i}if(!this._properties||this._hydratedPropertyCount!==t)for(;n<t;n++)this._hydrateProperty(n);return this._properties||[]},_removeObjectByIndex:function(e,t,n){if((t=t||[])[n]){var r=t[n];"parent"in r&&(r.parent=null)}t.splice(n,1),this.jCal[e].splice(n,1)},_removeObject:function(e,t,n){var r=0,i=this.jCal[e],s=i.length,o=this[t];if("string"==typeof n){for(;r<s;r++)if(i[r][0]===n)return this._removeObjectByIndex(e,o,r),!0}else if(o)for(;r<s;r++)if(o[r]&&o[r]===n)return this._removeObjectByIndex(e,o,r),!0;return!1},_removeAllObjects:function(e,t,n){for(var r=this[t],i=this.jCal[e],s=i.length-1;s>=0;s--)n&&i[s][0]!==n||this._removeObjectByIndex(e,r,s)},addSubcomponent:function(e){this._components||(this._components=[],this._hydratedComponentCount=0),e.parent&&e.parent.removeSubcomponent(e);var t=this.jCal[2].push(e.jCal);return this._components[t-1]=e,this._hydratedComponentCount++,e.parent=this,e},removeSubcomponent:function(e){var t=this._removeObject(2,"_components",e);return t&&this._hydratedComponentCount--,t},removeAllSubcomponents:function(e){var t=this._removeAllObjects(2,"_components",e);return this._hydratedComponentCount=0,t},addProperty:function(e){if(!(e instanceof t.Property))throw new TypeError("must instance of ICAL.Property");this._properties||(this._properties=[],this._hydratedPropertyCount=0),e.parent&&e.parent.removeProperty(e);var n=this.jCal[1].push(e.jCal);return this._properties[n-1]=e,this._hydratedPropertyCount++,e.parent=this,e},addPropertyWithValue:function(e,n){var r=new t.Property(e);return r.setValue(n),this.addProperty(r),r},updatePropertyWithValue:function(e,t){var n=this.getFirstProperty(e);return n?n.setValue(t):n=this.addPropertyWithValue(e,t),n},removeProperty:function(e){var t=this._removeObject(1,"_properties",e);return t&&this._hydratedPropertyCount--,t},removeAllProperties:function(e){var t=this._removeAllObjects(1,"_properties",e);return this._hydratedPropertyCount=0,t},toJSON:function(){return this.jCal},toString:function(){return t.stringify.component(this.jCal,this._designSet)}},e.fromString=function(n){return new e(t.parse.component(n))},e}(),t.Property=function(){"use strict";var e=t.design;function n(t,n){this._parent=n||null,"string"==typeof t?(this.jCal=[t,{},e.defaultType],this.jCal[2]=this.getDefaultType()):this.jCal=t,this._updateType()}return n.prototype={get type(){return this.jCal[2]},get name(){return this.jCal[0]},get parent(){return this._parent},set parent(t){var n=!this._parent||t&&t._designSet!=this._parent._designSet;return this._parent=t,this.type==e.defaultType&&n&&(this.jCal[2]=this.getDefaultType(),this._updateType()),t},get _designSet(){return this.parent?this.parent._designSet:e.defaultSet},_updateType:function(){var e=this._designSet;if(this.type in e.value){e.value[this.type];"decorate"in e.value[this.type]?this.isDecorated=!0:this.isDecorated=!1,this.name in e.property&&(this.isMultiValue="multiValue"in e.property[this.name],this.isStructuredValue="structuredValue"in e.property[this.name])}},_hydrateValue:function(e){return this._values&&this._values[e]?this._values[e]:this.jCal.length<=3+e?null:this.isDecorated?(this._values||(this._values=[]),this._values[e]=this._decorate(this.jCal[3+e])):this.jCal[3+e]},_decorate:function(e){return this._designSet.value[this.type].decorate(e,this)},_undecorate:function(e){return this._designSet.value[this.type].undecorate(e,this)},_setDecoratedValue:function(e,t){this._values||(this._values=[]),"object"==typeof e&&"icaltype"in e?(this.jCal[3+t]=this._undecorate(e),this._values[t]=e):(this.jCal[3+t]=e,this._values[t]=this._decorate(e))},getParameter:function(e){return e in this.jCal[1]?this.jCal[1][e]:void 0},getFirstParameter:function(e){var t=this.getParameter(e);return Array.isArray(t)?t[0]:t},setParameter:function(e,t){var n=e.toLowerCase();"string"==typeof t&&n in this._designSet.param&&"multiValue"in this._designSet.param[n]&&(t=[t]),this.jCal[1][e]=t},removeParameter:function(e){delete this.jCal[1][e]},getDefaultType:function(){var t=this.jCal[0],n=this._designSet;if(t in n.property){var r=n.property[t];if("defaultType"in r)return r.defaultType}return e.defaultType},resetType:function(e){this.removeAllValues(),this.jCal[2]=e,this._updateType()},getFirstValue:function(){return this._hydrateValue(0)},getValues:function(){var e=this.jCal.length-3;if(e<1)return[];for(var t=0,n=[];t<e;t++)n[t]=this._hydrateValue(t);return n},removeAllValues:function(){this._values&&(this._values.length=0),this.jCal.length=3},setValues:function(e){if(!this.isMultiValue)throw new Error(this.name+": does not not support mulitValue.\noverride isMultiValue");var t=e.length,n=0;if(this.removeAllValues(),t>0&&"object"==typeof e[0]&&"icaltype"in e[0]&&this.resetType(e[0].icaltype),this.isDecorated)for(;n<t;n++)this._setDecoratedValue(e[n],n);else for(;n<t;n++)this.jCal[3+n]=e[n]},setValue:function(e){this.removeAllValues(),"object"==typeof e&&"icaltype"in e&&this.resetType(e.icaltype),this.isDecorated?this._setDecoratedValue(e,0):this.jCal[3]=e},toJSON:function(){return this.jCal},toICALString:function(){return t.stringify.property(this.jCal,this._designSet,!0)}},n.fromString=function(e,r){return new n(t.parse.property(e,r))},n}(),t.UtcOffset=function(){function e(e){this.fromData(e)}return e.prototype={hours:0,minutes:0,factor:1,icaltype:"utc-offset",clone:function(){return t.UtcOffset.fromSeconds(this.toSeconds())},fromData:function(e){if(e)for(var t in e)e.hasOwnProperty(t)&&(this[t]=e[t]);this._normalize()},fromSeconds:function(e){var n=Math.abs(e);return this.factor=e<0?-1:1,this.hours=t.helpers.trunc(n/3600),n-=3600*this.hours,this.minutes=t.helpers.trunc(n/60),this},toSeconds:function(){return this.factor*(60*this.minutes+3600*this.hours)},compare:function(e){var t=this.toSeconds(),n=e.toSeconds();return(t>n)-(n>t)},_normalize:function(){for(var e=this.toSeconds(),t=this.factor;e<-43200;)e+=97200;for(;e>50400;)e-=97200;this.fromSeconds(e),0==e&&(this.factor=t)},toICALString:function(){return t.design.icalendar.value["utc-offset"].toICAL(this.toString())},toString:function(){return(1==this.factor?"+":"-")+t.helpers.pad2(this.hours)+":"+t.helpers.pad2(this.minutes)}},e.fromString=function(e){var n={};return n.factor="+"===e[0]?1:-1,n.hours=t.helpers.strictParseInt(e.substr(1,2)),n.minutes=t.helpers.strictParseInt(e.substr(4,2)),new t.UtcOffset(n)},e.fromSeconds=function(t){var n=new e;return n.fromSeconds(t),n},e}(),t.Binary=function(){function e(e){this.value=e}return e.prototype={icaltype:"binary",decodeValue:function(){return this._b64_decode(this.value)},setEncodedValue:function(e){this.value=this._b64_encode(e)},_b64_encode:function(e){var t,n,r,i,s,o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",a=0,l=0,c="",u=[];if(!e)return e;do{t=(s=e.charCodeAt(a++)<<16|e.charCodeAt(a++)<<8|e.charCodeAt(a++))>>18&63,n=s>>12&63,r=s>>6&63,i=63&s,u[l++]=o.charAt(t)+o.charAt(n)+o.charAt(r)+o.charAt(i)}while(a<e.length);c=u.join("");var d=e.length%3;return(d?c.slice(0,d-3):c)+"===".slice(d||3)},_b64_decode:function(e){var t,n,r,i,s,o,a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",l=0,c=0,u=[];if(!e)return e;e+="";do{t=(o=a.indexOf(e.charAt(l++))<<18|a.indexOf(e.charAt(l++))<<12|(i=a.indexOf(e.charAt(l++)))<<6|(s=a.indexOf(e.charAt(l++))))>>16&255,n=o>>8&255,r=255&o,u[c++]=64==i?String.fromCharCode(t):64==s?String.fromCharCode(t,n):String.fromCharCode(t,n,r)}while(l<e.length);return u.join("")},toString:function(){return this.value}},e.fromString=function(t){return new e(t)},e}(),t.Period=function(e){if(this.wrappedJSObject=this,e&&"start"in e){if(e.start&&!(e.start instanceof t.Time))throw new TypeError(".start must be an instance of ICAL.Time");this.start=e.start}if(e&&e.end&&e.duration)throw new Error("cannot accept both end and duration");if(e&&"end"in e){if(e.end&&!(e.end instanceof t.Time))throw new TypeError(".end must be an instance of ICAL.Time");this.end=e.end}if(e&&"duration"in e){if(e.duration&&!(e.duration instanceof t.Duration))throw new TypeError(".duration must be an instance of ICAL.Duration");this.duration=e.duration}},t.Period.prototype={start:null,end:null,duration:null,icalclass:"icalperiod",icaltype:"period",clone:function(){return t.Period.fromData({start:this.start?this.start.clone():null,end:this.end?this.end.clone():null,duration:this.duration?this.duration.clone():null})},getDuration:function(){return this.duration?this.duration:this.end.subtractDate(this.start)},getEnd:function(){if(this.end)return this.end;var e=this.start.clone();return e.addDuration(this.duration),e},toString:function(){return this.start+"/"+(this.end||this.duration)},toJSON:function(){return[this.start.toString(),(this.end||this.duration).toString()]},toICALString:function(){return this.start.toICALString()+"/"+(this.end||this.duration).toICALString()}},t.Period.fromString=function(e,n){var r=e.split("/");if(2!==r.length)throw new Error('Invalid string value: "'+e+'" must contain a "/" char.');var i={start:t.Time.fromDateTimeString(r[0],n)},s=r[1];return t.Duration.isValueString(s)?i.duration=t.Duration.fromString(s):i.end=t.Time.fromDateTimeString(s,n),new t.Period(i)},t.Period.fromData=function(e){return new t.Period(e)},t.Period.fromJSON=function(e,n,r){function i(e,n){return r?t.Time.fromString(e,n):t.Time.fromDateTimeString(e,n)}return t.Duration.isValueString(e[1])?t.Period.fromData({start:i(e[0],n),duration:t.Duration.fromString(e[1])}):t.Period.fromData({start:i(e[0],n),end:i(e[1],n)})},function(){var e=/([PDWHMTS]{1,1})/;function n(e,n,r){var i;switch(e){case"P":r.isNegative=!(!n||"-"!==n);break;case"D":i="days";break;case"W":i="weeks";break;case"H":i="hours";break;case"M":i="minutes";break;case"S":i="seconds";break;default:return 0}if(i){if(!n&&0!==n)throw new Error('invalid duration value: Missing number before "'+e+'"');var s=parseInt(n,10);if(t.helpers.isStrictlyNaN(s))throw new Error('invalid duration value: Invalid number "'+n+'" before "'+e+'"');r[i]=s}return 1}t.Duration=function(e){this.wrappedJSObject=this,this.fromData(e)},t.Duration.prototype={weeks:0,days:0,hours:0,minutes:0,seconds:0,isNegative:!1,icalclass:"icalduration",icaltype:"duration",clone:function(){return t.Duration.fromData(this)},toSeconds:function(){var e=this.seconds+60*this.minutes+3600*this.hours+86400*this.days+604800*this.weeks;return this.isNegative?-e:e},fromSeconds:function(e){var n=Math.abs(e);return this.isNegative=e<0,this.days=t.helpers.trunc(n/86400),this.days%7==0?(this.weeks=this.days/7,this.days=0):this.weeks=0,n-=86400*(this.days+7*this.weeks),this.hours=t.helpers.trunc(n/3600),n-=3600*this.hours,this.minutes=t.helpers.trunc(n/60),n-=60*this.minutes,this.seconds=n,this},fromData:function(e){var t=["weeks","days","hours","minutes","seconds","isNegative"];for(var n in t)if(t.hasOwnProperty(n)){var r=t[n];this[r]=e&&r in e?e[r]:0}},reset:function(){this.isNegative=!1,this.weeks=0,this.days=0,this.hours=0,this.minutes=0,this.seconds=0},compare:function(e){var t=this.toSeconds(),n=e.toSeconds();return(t>n)-(t<n)},normalize:function(){this.fromSeconds(this.toSeconds())},toString:function(){if(0==this.toSeconds())return"PT0S";var e="";return this.isNegative&&(e+="-"),e+="P",this.weeks&&(e+=this.weeks+"W"),this.days&&(e+=this.days+"D"),(this.hours||this.minutes||this.seconds)&&(e+="T",this.hours&&(e+=this.hours+"H"),this.minutes&&(e+=this.minutes+"M"),this.seconds&&(e+=this.seconds+"S")),e},toICALString:function(){return this.toString()}},t.Duration.fromSeconds=function(e){return(new t.Duration).fromSeconds(e)},t.Duration.isValueString=function(e){return"P"===e[0]||"P"===e[1]},t.Duration.fromString=function(r){for(var i=0,s=Object.create(null),o=0;-1!==(i=r.search(e));){var a=r[i],l=r.substr(0,i);r=r.substr(i+1),o+=n(a,l,s)}if(o<2)throw new Error('invalid duration value: Not enough duration components in "'+r+'"');return new t.Duration(s)},t.Duration.fromData=function(e){return new t.Duration(e)}}(),n=["tzid","location","tznames","latitude","longitude"],t.Timezone=function(e){this.wrappedJSObject=this,this.fromData(e)},t.Timezone.prototype={tzid:"",location:"",tznames:"",latitude:0,longitude:0,component:null,expandedUntilYear:0,icalclass:"icaltimezone",fromData:function(e){if(this.expandedUntilYear=0,this.changes=[],e instanceof t.Component)this.component=e;else{if(e&&"component"in e)if("string"==typeof e.component){var r=t.parse(e.component);this.component=new t.Component(r)}else e.component instanceof t.Component?this.component=e.component:this.component=null;for(var i in n)if(n.hasOwnProperty(i)){var s=n[i];e&&s in e&&(this[s]=e[s])}}return this.component instanceof t.Component&&!this.tzid&&(this.tzid=this.component.getFirstPropertyValue("tzid")),this},utcOffset:function(e){if(this==t.Timezone.utcTimezone||this==t.Timezone.localTimezone)return 0;if(this._ensureCoverage(e.year),!this.changes.length)return 0;for(var n={year:e.year,month:e.month,day:e.day,hour:e.hour,minute:e.minute,second:e.second},r=this._findNearbyChange(n),i=-1,s=1;;){var o=t.helpers.clone(this.changes[r],!0);if(o.utcOffset<o.prevUtcOffset?t.Timezone.adjust_change(o,0,0,0,o.utcOffset):t.Timezone.adjust_change(o,0,0,0,o.prevUtcOffset),t.Timezone._compare_change_fn(n,o)>=0?i=r:s=-1,-1==s&&-1!=i)break;if((r+=s)<0)return 0;if(r>=this.changes.length)break}var a=this.changes[i];if(a.utcOffset-a.prevUtcOffset<0&&i>0){var l=t.helpers.clone(a,!0);if(t.Timezone.adjust_change(l,0,0,0,l.prevUtcOffset),t.Timezone._compare_change_fn(n,l)<0){var c=this.changes[i-1];0!=a.is_daylight&&0==c.is_daylight&&(a=c)}}return a.utcOffset},_findNearbyChange:function(e){var n=t.helpers.binsearchInsert(this.changes,e,t.Timezone._compare_change_fn);return n>=this.changes.length?this.changes.length-1:n},_ensureCoverage:function(e){if(-1==t.Timezone._minimumExpansionYear){var n=t.Time.now();t.Timezone._minimumExpansionYear=n.year}var r=e;if(r<t.Timezone._minimumExpansionYear&&(r=t.Timezone._minimumExpansionYear),(r+=t.Timezone.EXTRA_COVERAGE)>t.Timezone.MAX_YEAR&&(r=t.Timezone.MAX_YEAR),!this.changes.length||this.expandedUntilYear<e){for(var i=this.component.getAllSubcomponents(),s=i.length,o=0;o<s;o++)this._expandComponent(i[o],r,this.changes);this.changes.sort(t.Timezone._compare_change_fn),this.expandedUntilYear=r}},_expandComponent:function(e,n,r){if(!e.hasProperty("dtstart")||!e.hasProperty("tzoffsetto")||!e.hasProperty("tzoffsetfrom"))return null;var i,s=e.getFirstProperty("dtstart").getFirstValue();function o(e){return e.factor*(3600*e.hours+60*e.minutes)}function a(){var t={};return t.is_daylight="daylight"==e.name,t.utcOffset=o(e.getFirstProperty("tzoffsetto").getFirstValue()),t.prevUtcOffset=o(e.getFirstProperty("tzoffsetfrom").getFirstValue()),t}if(e.hasProperty("rrule")||e.hasProperty("rdate")){var l=e.getAllProperties("rdate");for(var c in l)if(l.hasOwnProperty(c)){var u=l[c].getFirstValue();(i=a()).year=u.year,i.month=u.month,i.day=u.day,u.isDate?(i.hour=s.hour,i.minute=s.minute,i.second=s.second,s.zone!=t.Timezone.utcTimezone&&t.Timezone.adjust_change(i,0,0,0,-i.prevUtcOffset)):(i.hour=u.hour,i.minute=u.minute,i.second=u.second,u.zone!=t.Timezone.utcTimezone&&t.Timezone.adjust_change(i,0,0,0,-i.prevUtcOffset)),r.push(i)}var d=e.getFirstProperty("rrule");if(d){d=d.getFirstValue(),i=a(),d.until&&d.until.zone==t.Timezone.utcTimezone&&(d.until.adjust(0,0,0,i.prevUtcOffset),d.until.zone=t.Timezone.localTimezone);for(var h,f=d.iterator(s);(h=f.next())&&(i=a(),!(h.year>n)&&h);)i.year=h.year,i.month=h.month,i.day=h.day,i.hour=h.hour,i.minute=h.minute,i.second=h.second,i.isDate=h.isDate,t.Timezone.adjust_change(i,0,0,0,-i.prevUtcOffset),r.push(i)}}else(i=a()).year=s.year,i.month=s.month,i.day=s.day,i.hour=s.hour,i.minute=s.minute,i.second=s.second,t.Timezone.adjust_change(i,0,0,0,-i.prevUtcOffset),r.push(i);return r},toString:function(){return this.tznames?this.tznames:this.tzid}},t.Timezone._compare_change_fn=function(e,t){return e.year<t.year?-1:e.year>t.year?1:e.month<t.month?-1:e.month>t.month?1:e.day<t.day?-1:e.day>t.day?1:e.hour<t.hour?-1:e.hour>t.hour?1:e.minute<t.minute?-1:e.minute>t.minute?1:e.second<t.second?-1:e.second>t.second?1:0},t.Timezone.convert_time=function(e,n,r){if(e.isDate||n.tzid==r.tzid||n==t.Timezone.localTimezone||r==t.Timezone.localTimezone)return e.zone=r,e;var i=n.utcOffset(e);return e.adjust(0,0,0,-i),i=r.utcOffset(e),e.adjust(0,0,0,i),null},t.Timezone.fromData=function(e){return(new t.Timezone).fromData(e)},t.Timezone.utcTimezone=t.Timezone.fromData({tzid:"UTC"}),t.Timezone.localTimezone=t.Timezone.fromData({tzid:"floating"}),t.Timezone.adjust_change=function(e,n,r,i,s){return t.Time.prototype.adjust.call(e,n,r,i,s,e)},t.Timezone._minimumExpansionYear=-1,t.Timezone.MAX_YEAR=2035,t.Timezone.EXTRA_COVERAGE=5,t.TimezoneService=((i={get count(){return Object.keys(r).length},reset:function(){r=Object.create(null);var e=t.Timezone.utcTimezone;r.Z=e,r.UTC=e,r.GMT=e},has:function(e){return!!r[e]},get:function(e){return r[e]},register:function(e,n){if(e instanceof t.Component&&"vtimezone"===e.name&&(e=(n=new t.Timezone(e)).tzid),!(n instanceof t.Timezone))throw new TypeError("timezone must be ICAL.Timezone or ICAL.Component");r[e]=n},remove:function(e){return delete r[e]}}).reset(),i),t.Time=function(e,t){this.wrappedJSObject=this;var n=this._time=Object.create(null);n.year=0,n.month=1,n.day=1,n.hour=0,n.minute=0,n.second=0,n.isDate=!1,this.fromData(e,t)},t.Time._dowCache={},t.Time._wnCache={},t.Time.prototype={icalclass:"icaltime",_cachedUnixTime:null,get icaltype(){return this.isDate?"date":"date-time"},zone:null,_pendingNormalization:!1,clone:function(){return new t.Time(this._time,this.zone)},reset:function(){this.fromData(t.Time.epochTime),this.zone=t.Timezone.utcTimezone},resetTo:function(e,t,n,r,i,s,o){this.fromData({year:e,month:t,day:n,hour:r,minute:i,second:s,zone:o})},fromJSDate:function(e,n){return e?n?(this.zone=t.Timezone.utcTimezone,this.year=e.getUTCFullYear(),this.month=e.getUTCMonth()+1,this.day=e.getUTCDate(),this.hour=e.getUTCHours(),this.minute=e.getUTCMinutes(),this.second=e.getUTCSeconds()):(this.zone=t.Timezone.localTimezone,this.year=e.getFullYear(),this.month=e.getMonth()+1,this.day=e.getDate(),this.hour=e.getHours(),this.minute=e.getMinutes(),this.second=e.getSeconds()):this.reset(),this._cachedUnixTime=null,this},fromData:function(e,n){if(e)for(var r in e)if(Object.prototype.hasOwnProperty.call(e,r)){if("icaltype"===r)continue;this[r]=e[r]}if(n&&(this.zone=n),e&&!("isDate"in e)?this.isDate=!("hour"in e):e&&"isDate"in e&&(this.isDate=e.isDate),e&&"timezone"in e){var i=t.TimezoneService.get(e.timezone);this.zone=i||t.Timezone.localTimezone}return e&&"zone"in e&&(this.zone=e.zone),this.zone||(this.zone=t.Timezone.localTimezone),this._cachedUnixTime=null,this},dayOfWeek:function(e){var n=e||t.Time.SUNDAY,r=(this.year<<12)+(this.month<<8)+(this.day<<3)+n;if(r in t.Time._dowCache)return t.Time._dowCache[r];var i=this.day,s=this.month+(this.month<3?12:0),o=this.year-(this.month<3?1:0),a=i+o+t.helpers.trunc(26*(s+1)/10)+t.helpers.trunc(o/4);return a=((a+=6*t.helpers.trunc(o/100)+t.helpers.trunc(o/400))+7-n)%7+1,t.Time._dowCache[r]=a,a},dayOfYear:function(){var e=t.Time.isLeapYear(this.year)?1:0;return t.Time.daysInYearPassedMonth[e][this.month-1]+this.day},startOfWeek:function(e){var n=e||t.Time.SUNDAY,r=this.clone();return r.day-=(this.dayOfWeek()+7-n)%7,r.isDate=!0,r.hour=0,r.minute=0,r.second=0,r},endOfWeek:function(e){var n=e||t.Time.SUNDAY,r=this.clone();return r.day+=(7-this.dayOfWeek()+n-t.Time.SUNDAY)%7,r.isDate=!0,r.hour=0,r.minute=0,r.second=0,r},startOfMonth:function(){var e=this.clone();return e.day=1,e.isDate=!0,e.hour=0,e.minute=0,e.second=0,e},endOfMonth:function(){var e=this.clone();return e.day=t.Time.daysInMonth(e.month,e.year),e.isDate=!0,e.hour=0,e.minute=0,e.second=0,e},startOfYear:function(){var e=this.clone();return e.day=1,e.month=1,e.isDate=!0,e.hour=0,e.minute=0,e.second=0,e},endOfYear:function(){var e=this.clone();return e.day=31,e.month=12,e.isDate=!0,e.hour=0,e.minute=0,e.second=0,e},startDoyWeek:function(e){var n=e||t.Time.SUNDAY,r=this.dayOfWeek()-n;return r<0&&(r+=7),this.dayOfYear()-r},getDominicalLetter:function(){return t.Time.getDominicalLetter(this.year)},nthWeekDay:function(e,n){var r,i=t.Time.daysInMonth(this.month,this.year),s=n,o=0,a=this.clone();if(s>=0){a.day=1,0!=s&&s--,o=a.day;var l=e-a.dayOfWeek();l<0&&(l+=7),o+=l,o-=e,r=e}else a.day=i,s++,(r=a.dayOfWeek()-e)<0&&(r+=7),r=i-r;return o+(r+=7*s)},isNthWeekDay:function(e,t){var n=this.dayOfWeek();return 0===t&&n===e||this.nthWeekDay(e,t)===this.day},weekNumber:function(e){var n,r=(this.year<<12)+(this.month<<8)+(this.day<<3)+e;if(r in t.Time._wnCache)return t.Time._wnCache[r];var i=this.clone();i.isDate=!0;var s=this.year;12==i.month&&i.day>25?(n=t.Time.weekOneStarts(s+1,e),i.compare(n)<0?n=t.Time.weekOneStarts(s,e):s++):(n=t.Time.weekOneStarts(s,e),i.compare(n)<0&&(n=t.Time.weekOneStarts(--s,e)));var o=i.subtractDate(n).toSeconds()/86400,a=t.helpers.trunc(o/7)+1;return t.Time._wnCache[r]=a,a},addDuration:function(e){var t=e.isNegative?-1:1,n=this.second,r=this.minute,i=this.hour,s=this.day;n+=t*e.seconds,r+=t*e.minutes,i+=t*e.hours,s+=t*e.days,s+=7*t*e.weeks,this.second=n,this.minute=r,this.hour=i,this.day=s,this._cachedUnixTime=null},subtractDate:function(e){var n=this.toUnixTime()+this.utcOffset(),r=e.toUnixTime()+e.utcOffset();return t.Duration.fromSeconds(n-r)},subtractDateTz:function(e){var n=this.toUnixTime(),r=e.toUnixTime();return t.Duration.fromSeconds(n-r)},compare:function(e){var t=this.toUnixTime(),n=e.toUnixTime();return t>n?1:n>t?-1:0},compareDateOnlyTz:function(e,n){function r(e){return t.Time._cmp_attr(i,s,e)}var i=this.convertToZone(n),s=e.convertToZone(n),o=0;return 0!=(o=r("year"))||0!=(o=r("month"))||(o=r("day")),o},convertToZone:function(e){var n=this.clone(),r=this.zone.tzid==e.tzid;return this.isDate||r||t.Timezone.convert_time(n,this.zone,e),n.zone=e,n},utcOffset:function(){return this.zone==t.Timezone.localTimezone||this.zone==t.Timezone.utcTimezone?0:this.zone.utcOffset(this)},toICALString:function(){var e=this.toString();return e.length>10?t.design.icalendar.value["date-time"].toICAL(e):t.design.icalendar.value.date.toICAL(e)},toString:function(){var e=this.year+"-"+t.helpers.pad2(this.month)+"-"+t.helpers.pad2(this.day);return this.isDate||(e+="T"+t.helpers.pad2(this.hour)+":"+t.helpers.pad2(this.minute)+":"+t.helpers.pad2(this.second),this.zone===t.Timezone.utcTimezone&&(e+="Z")),e},toJSDate:function(){return this.zone==t.Timezone.localTimezone?this.isDate?new Date(this.year,this.month-1,this.day):new Date(this.year,this.month-1,this.day,this.hour,this.minute,this.second,0):new Date(1e3*this.toUnixTime())},_normalize:function(){return this._time.isDate,this._time.isDate&&(this._time.hour=0,this._time.minute=0,this._time.second=0),this.adjust(0,0,0,0),this},adjust:function(e,n,r,i,s){var o,a,l,c,u,d,h,f=0,p=0,g=s||this._time;if(g.isDate||(l=g.second+i,g.second=l%60,o=t.helpers.trunc(l/60),g.second<0&&(g.second+=60,o--),c=g.minute+r+o,g.minute=c%60,a=t.helpers.trunc(c/60),g.minute<0&&(g.minute+=60,a--),u=g.hour+n+a,g.hour=u%24,f=t.helpers.trunc(u/24),g.hour<0&&(g.hour+=24,f--)),g.month>12?p=t.helpers.trunc((g.month-1)/12):g.month<1&&(p=t.helpers.trunc(g.month/12)-1),g.year+=p,g.month-=12*p,(d=g.day+e+f)>0)for(;!(d<=(h=t.Time.daysInMonth(g.month,g.year)));)g.month++,g.month>12&&(g.year++,g.month=1),d-=h;else for(;d<=0;)1==g.month?(g.year--,g.month=12):g.month--,d+=t.Time.daysInMonth(g.month,g.year);return g.day=d,this._cachedUnixTime=null,this},fromUnixTime:function(e){this.zone=t.Timezone.utcTimezone;var n=t.Time.epochTime.clone();n.adjust(0,0,0,e),this.year=n.year,this.month=n.month,this.day=n.day,this.hour=n.hour,this.minute=n.minute,this.second=Math.floor(n.second),this._cachedUnixTime=null},toUnixTime:function(){if(null!==this._cachedUnixTime)return this._cachedUnixTime;var e=this.utcOffset(),t=Date.UTC(this.year,this.month-1,this.day,this.hour,this.minute,this.second-e);return this._cachedUnixTime=t/1e3,this._cachedUnixTime},toJSON:function(){for(var e,t=["year","month","day","hour","minute","second","isDate"],n=Object.create(null),r=0,i=t.length;r<i;r++)n[e=t[r]]=this[e];return this.zone&&(n.timezone=this.zone.tzid),n}},function(){function e(e){Object.defineProperty(t.Time.prototype,e,{get:function(){return this._pendingNormalization&&(this._normalize(),this._pendingNormalization=!1),this._time[e]},set:function(t){return"isDate"===e&&t&&!this._time.isDate&&this.adjust(0,0,0,0),this._cachedUnixTime=null,this._pendingNormalization=!0,this._time[e]=t,t}})}"defineProperty"in Object&&(e("year"),e("month"),e("day"),e("hour"),e("minute"),e("second"),e("isDate"))}(),t.Time.daysInMonth=function(e,n){var r=30;return e<1||e>12||(r=[0,31,28,31,30,31,30,31,31,30,31,30,31][e],2==e&&(r+=t.Time.isLeapYear(n))),r},t.Time.isLeapYear=function(e){return e<=1752?e%4==0:e%4==0&&e%100!=0||e%400==0},t.Time.fromDayOfYear=function(e,n){var r=n,i=e,s=new t.Time;s.auto_normalize=!1;var o=t.Time.isLeapYear(r)?1:0;if(i<1)return r--,o=t.Time.isLeapYear(r)?1:0,i+=t.Time.daysInYearPassedMonth[o][12],t.Time.fromDayOfYear(i,r);if(i>t.Time.daysInYearPassedMonth[o][12])return o=t.Time.isLeapYear(r)?1:0,i-=t.Time.daysInYearPassedMonth[o][12],r++,t.Time.fromDayOfYear(i,r);s.year=r,s.isDate=!0;for(var a=11;a>=0;a--)if(i>t.Time.daysInYearPassedMonth[o][a]){s.month=a+1,s.day=i-t.Time.daysInYearPassedMonth[o][a];break}return s.auto_normalize=!0,s},t.Time.fromStringv2=function(e){return new t.Time({year:parseInt(e.substr(0,4),10),month:parseInt(e.substr(5,2),10),day:parseInt(e.substr(8,2),10),isDate:!0})},t.Time.fromDateString=function(e){return new t.Time({year:t.helpers.strictParseInt(e.substr(0,4)),month:t.helpers.strictParseInt(e.substr(5,2)),day:t.helpers.strictParseInt(e.substr(8,2)),isDate:!0})},t.Time.fromDateTimeString=function(e,n){if(e.length<19)throw new Error('invalid date-time value: "'+e+'"');var r;return e[19]&&"Z"===e[19]?r="Z":n&&(r=n.getParameter("tzid")),new t.Time({year:t.helpers.strictParseInt(e.substr(0,4)),month:t.helpers.strictParseInt(e.substr(5,2)),day:t.helpers.strictParseInt(e.substr(8,2)),hour:t.helpers.strictParseInt(e.substr(11,2)),minute:t.helpers.strictParseInt(e.substr(14,2)),second:t.helpers.strictParseInt(e.substr(17,2)),timezone:r})},t.Time.fromString=function(e,n){return e.length>10?t.Time.fromDateTimeString(e,n):t.Time.fromDateString(e)},t.Time.fromJSDate=function(e,n){return(new t.Time).fromJSDate(e,n)},t.Time.fromData=function(e,n){return(new t.Time).fromData(e,n)},t.Time.now=function(){return t.Time.fromJSDate(new Date,!1)},t.Time.weekOneStarts=function(e,n){var r=t.Time.fromData({year:e,month:1,day:1,isDate:!0}),i=r.dayOfWeek(),s=n||t.Time.DEFAULT_WEEK_START;return i>t.Time.THURSDAY&&(r.day+=7),s>t.Time.THURSDAY&&(r.day-=7),r.day-=i-s,r},t.Time.getDominicalLetter=function(e){var n="GFEDCBA",r=(e+(e/4|0)+(e/400|0)-(e/100|0)-1)%7;return t.Time.isLeapYear(e)?n[(r+6)%7]+n[r]:n[r]},t.Time.epochTime=t.Time.fromData({year:1970,month:1,day:1,hour:0,minute:0,second:0,isDate:!1,timezone:"Z"}),t.Time._cmp_attr=function(e,t,n){return e[n]>t[n]?1:e[n]<t[n]?-1:0},t.Time.daysInYearPassedMonth=[[0,31,59,90,120,151,181,212,243,273,304,334,365],[0,31,60,91,121,152,182,213,244,274,305,335,366]],t.Time.SUNDAY=1,t.Time.MONDAY=2,t.Time.TUESDAY=3,t.Time.WEDNESDAY=4,t.Time.THURSDAY=5,t.Time.FRIDAY=6,t.Time.SATURDAY=7,t.Time.DEFAULT_WEEK_START=t.Time.MONDAY,t.VCardTime=function(e,t,n){this.wrappedJSObject=this;var r=this._time=Object.create(null);r.year=null,r.month=null,r.day=null,r.hour=null,r.minute=null,r.second=null,this.icaltype=n||"date-and-or-time",this.fromData(e,t)},t.helpers.inherits(t.Time,t.VCardTime,{icalclass:"vcardtime",icaltype:"date-and-or-time",zone:null,clone:function(){return new t.VCardTime(this._time,this.zone,this.icaltype)},_normalize:function(){return this},utcOffset:function(){return this.zone instanceof t.UtcOffset?this.zone.toSeconds():t.Time.prototype.utcOffset.apply(this,arguments)},toICALString:function(){return t.design.vcard.value[this.icaltype].toICAL(this.toString())},toString:function(){var e,n=t.helpers.pad2,r=this.year,i=this.month,s=this.day,o=this.hour,a=this.minute,l=this.second,c=null!==i,u=null!==s,d=null!==o,h=null!==a,f=null!==l,p=(null!==r?n(r)+(c||u?"-":""):c||u?"--":"")+(c?n(i):"")+(u?"-"+n(s):""),g=(d?n(o):"-")+(d&&h?":":"")+(h?n(a):"")+(d||h?"":"-")+(h&&f?":":"")+(f?n(l):"");switch(e=this.zone===t.Timezone.utcTimezone?"Z":this.zone instanceof t.UtcOffset?this.zone.toString():this.zone===t.Timezone.localTimezone?"":this.zone instanceof t.Timezone?t.UtcOffset.fromSeconds(this.zone.utcOffset(this)).toString():"",this.icaltype){case"time":return g+e;case"date-and-or-time":case"date-time":return p+("--"==g?"":"T"+g+e);case"date":return p}return null}}),t.VCardTime.fromDateAndOrTimeString=function(e,n){function r(e,n,r){return e?t.helpers.strictParseInt(e.substr(n,r)):null}var i=e.split("T"),s=i[0],o=i[1],a=o?t.design.vcard.value.time._splitZone(o):[],l=a[0],c=a[1],u=(t.helpers.strictParseInt,s?s.length:0),d=c?c.length:0,h=s&&"-"==s[0]&&"-"==s[1],f=c&&"-"==c[0],p={year:h?null:r(s,0,4),month:!h||4!=u&&7!=u?7==u||10==u?r(s,5,2):null:r(s,2,2),day:5==u?r(s,3,2):7==u&&h?r(s,5,2):10==u?r(s,8,2):null,hour:f?null:r(c,0,2),minute:f&&3==d?r(c,1,2):d>4?r(c,f?1:3,2):null,second:4==d?r(c,2,2):6==d?r(c,4,2):8==d?r(c,6,2):null};return l="Z"==l?t.Timezone.utcTimezone:l&&":"==l[3]?t.UtcOffset.fromString(l):null,new t.VCardTime(p,l,n)},function(){var e={SU:t.Time.SUNDAY,MO:t.Time.MONDAY,TU:t.Time.TUESDAY,WE:t.Time.WEDNESDAY,TH:t.Time.THURSDAY,FR:t.Time.FRIDAY,SA:t.Time.SATURDAY},n={};for(var r in e)e.hasOwnProperty(r)&&(n[e[r]]=r);function i(e,n,r,i){var s=i;if("+"===i[0]&&(s=i.substr(1)),s=t.helpers.strictParseInt(s),void 0!==n&&i<n)throw new Error(e+': invalid value "'+i+'" must be > '+n);if(void 0!==r&&i>r)throw new Error(e+': invalid value "'+i+'" must be < '+n);return s}t.Recur=function(e){this.wrappedJSObject=this,this.parts={},e&&"object"==typeof e&&this.fromData(e)},t.Recur.prototype={parts:null,interval:1,wkst:t.Time.MONDAY,until:null,count:null,freq:null,icalclass:"icalrecur",icaltype:"recur",iterator:function(e){return new t.RecurIterator({rule:this,dtstart:e})},clone:function(){return new t.Recur(this.toJSON())},isFinite:function(){return!(!this.count&&!this.until)},isByCount:function(){return!(!this.count||this.until)},addComponent:function(e,t){var n=e.toUpperCase();n in this.parts?this.parts[n].push(t):this.parts[n]=[t]},setComponent:function(e,t){this.parts[e.toUpperCase()]=t.slice()},getComponent:function(e){var t=e.toUpperCase();return t in this.parts?this.parts[t].slice():[]},getNextOccurrence:function(e,t){var n,r=this.iterator(e);do{n=r.next()}while(n&&n.compare(t)<=0);return n&&t.zone&&(n.zone=t.zone),n},fromData:function(e){for(var n in e){var r=n.toUpperCase();r in c?Array.isArray(e[n])?this.parts[r]=e[n]:this.parts[r]=[e[n]]:this[n]=e[n]}this.interval&&"number"!=typeof this.interval&&l.INTERVAL(this.interval,this),this.wkst&&"number"!=typeof this.wkst&&(this.wkst=t.Recur.icalDayToNumericDay(this.wkst)),!this.until||this.until instanceof t.Time||(this.until=t.Time.fromString(this.until))},toJSON:function(){var e=Object.create(null);for(var n in e.freq=this.freq,this.count&&(e.count=this.count),this.interval>1&&(e.interval=this.interval),this.parts)if(this.parts.hasOwnProperty(n)){var r=this.parts[n];Array.isArray(r)&&1==r.length?e[n.toLowerCase()]=r[0]:e[n.toLowerCase()]=t.helpers.clone(this.parts[n])}return this.until&&(e.until=this.until.toString()),"wkst"in this&&this.wkst!==t.Time.DEFAULT_WEEK_START&&(e.wkst=t.Recur.numericDayToIcalDay(this.wkst)),e},toString:function(){var e="FREQ="+this.freq;for(var n in this.count&&(e+=";COUNT="+this.count),this.interval>1&&(e+=";INTERVAL="+this.interval),this.parts)this.parts.hasOwnProperty(n)&&(e+=";"+n+"="+this.parts[n]);return this.until&&(e+=";UNTIL="+this.until.toICALString()),"wkst"in this&&this.wkst!==t.Time.DEFAULT_WEEK_START&&(e+=";WKST="+t.Recur.numericDayToIcalDay(this.wkst)),e}},t.Recur.icalDayToNumericDay=function(n,r){var i=r||t.Time.SUNDAY;return(e[n]-i+7)%7+1},t.Recur.numericDayToIcalDay=function(e,r){var i=e+(r||t.Time.SUNDAY)-t.Time.SUNDAY;return i>7&&(i-=7),n[i]};var s=/^(SU|MO|TU|WE|TH|FR|SA)$/,o=/^([+-])?(5[0-3]|[1-4][0-9]|[1-9])?(SU|MO|TU|WE|TH|FR|SA)$/,a=["SECONDLY","MINUTELY","HOURLY","DAILY","WEEKLY","MONTHLY","YEARLY"],l={FREQ:function(e,t,n){if(-1===a.indexOf(e))throw new Error('invalid frequency "'+e+'" expected: "'+a.join(", ")+'"');t.freq=e},COUNT:function(e,n,r){n.count=t.helpers.strictParseInt(e)},INTERVAL:function(e,n,r){n.interval=t.helpers.strictParseInt(e),n.interval<1&&(n.interval=1)},UNTIL:function(e,n,r){e.length>10?n.until=t.design.icalendar.value["date-time"].fromICAL(e):n.until=t.design.icalendar.value.date.fromICAL(e),r||(n.until=t.Time.fromString(n.until))},WKST:function(e,n,r){if(!s.test(e))throw new Error('invalid WKST value "'+e+'"');n.wkst=t.Recur.icalDayToNumericDay(e)}},c={BYSECOND:i.bind(this,"BYSECOND",0,60),BYMINUTE:i.bind(this,"BYMINUTE",0,59),BYHOUR:i.bind(this,"BYHOUR",0,23),BYDAY:function(e){if(o.test(e))return e;throw new Error('invalid BYDAY value "'+e+'"')},BYMONTHDAY:i.bind(this,"BYMONTHDAY",-31,31),BYYEARDAY:i.bind(this,"BYYEARDAY",-366,366),BYWEEKNO:i.bind(this,"BYWEEKNO",-53,53),BYMONTH:i.bind(this,"BYMONTH",1,12),BYSETPOS:i.bind(this,"BYSETPOS",-366,366)};t.Recur.fromString=function(e){var n=t.Recur._stringToData(e,!1);return new t.Recur(n)},t.Recur.fromData=function(e){return new t.Recur(e)},t.Recur._stringToData=function(e,t){for(var n=Object.create(null),r=e.split(";"),i=r.length,s=0;s<i;s++){var o=r[s].split("="),a=o[0].toUpperCase(),u=o[0].toLowerCase(),d=t?u:a,h=o[1];if(a in c){for(var f=h.split(","),p=0,g=f.length;p<g;p++)f[p]=c[a](f[p]);n[d]=1==f.length?f[0]:f}else a in l?l[a](h,n,t):n[u]=h}return n}}(),t.RecurIterator=function(){function e(e){this.fromData(e)}return e.prototype={completed:!1,rule:null,dtstart:null,last:null,occurrence_number:0,by_indices:null,initialized:!1,by_data:null,days:null,days_index:0,fromData:function(e){if(this.rule=t.helpers.formatClassType(e.rule,t.Recur),!this.rule)throw new Error("iterator requires a (ICAL.Recur) rule");if(this.dtstart=t.helpers.formatClassType(e.dtstart,t.Time),!this.dtstart)throw new Error("iterator requires a (ICAL.Time) dtstart");e.by_data?this.by_data=e.by_data:this.by_data=t.helpers.clone(this.rule.parts,!0),e.occurrence_number&&(this.occurrence_number=e.occurrence_number),this.days=e.days||[],e.last&&(this.last=t.helpers.formatClassType(e.last,t.Time)),this.by_indices=e.by_indices,this.by_indices||(this.by_indices={BYSECOND:0,BYMINUTE:0,BYHOUR:0,BYDAY:0,BYMONTH:0,BYWEEKNO:0,BYMONTHDAY:0}),this.initialized=e.initialized||!1,this.initialized||this.init()},init:function(){this.initialized=!0,this.last=this.dtstart.clone();var e=this.by_data;if("BYDAY"in e&&this.sort_byday_rules(e.BYDAY),"BYYEARDAY"in e&&("BYMONTH"in e||"BYWEEKNO"in e||"BYMONTHDAY"in e||"BYDAY"in e))throw new Error("Invalid BYYEARDAY rule");if("BYWEEKNO"in e&&"BYMONTHDAY"in e)throw new Error("BYWEEKNO does not fit to BYMONTHDAY");if("MONTHLY"==this.rule.freq&&("BYYEARDAY"in e||"BYWEEKNO"in e))throw new Error("For MONTHLY recurrences neither BYYEARDAY nor BYWEEKNO may appear");if("WEEKLY"==this.rule.freq&&("BYYEARDAY"in e||"BYMONTHDAY"in e))throw new Error("For WEEKLY recurrences neither BYMONTHDAY nor BYYEARDAY may appear");if("YEARLY"!=this.rule.freq&&"BYYEARDAY"in e)throw new Error("BYYEARDAY may only appear in YEARLY rules");if(this.last.second=this.setup_defaults("BYSECOND","SECONDLY",this.dtstart.second),this.last.minute=this.setup_defaults("BYMINUTE","MINUTELY",this.dtstart.minute),this.last.hour=this.setup_defaults("BYHOUR","HOURLY",this.dtstart.hour),this.last.day=this.setup_defaults("BYMONTHDAY","DAILY",this.dtstart.day),this.last.month=this.setup_defaults("BYMONTH","MONTHLY",this.dtstart.month),"WEEKLY"==this.rule.freq)if("BYDAY"in e){var n=(c=this.ruleDayOfWeek(e.BYDAY[0],this.rule.wkst))[0],r=(u=c[1])-this.last.dayOfWeek(this.rule.wkst);(this.last.dayOfWeek(this.rule.wkst)<u&&r>=0||r<0)&&(this.last.day+=r)}else{var i=t.Recur.numericDayToIcalDay(this.dtstart.dayOfWeek());e.BYDAY=[i]}if("YEARLY"==this.rule.freq){for(;this.expand_year_days(this.last.year),!(this.days.length>0);)this.increment_year(this.rule.interval);this._nextByYearDay()}if("MONTHLY"==this.rule.freq&&this.has_by_data("BYDAY")){var s=null,o=this.last.clone(),a=t.Time.daysInMonth(this.last.month,this.last.year);for(var l in this.by_data.BYDAY)if(this.by_data.BYDAY.hasOwnProperty(l)){this.last=o.clone();n=(c=this.ruleDayOfWeek(this.by_data.BYDAY[l]))[0];var c,u=c[1],d=this.last.nthWeekDay(u,n);if(n>=6||n<=-6)throw new Error("Malformed values in BYDAY part");if(d>a||d<=0){if(s&&s.month==o.month)continue;for(;d>a||d<=0;)this.increment_month(),a=t.Time.daysInMonth(this.last.month,this.last.year),d=this.last.nthWeekDay(u,n)}this.last.day=d,(!s||this.last.compare(s)<0)&&(s=this.last.clone())}if(this.last=s.clone(),this.has_by_data("BYMONTHDAY")&&this._byDayAndMonthDay(!0),this.last.day>a||0==this.last.day)throw new Error("Malformed values in BYDAY part")}else if(this.has_by_data("BYMONTHDAY")&&this.last.day<0){a=t.Time.daysInMonth(this.last.month,this.last.year);this.last.day=a+this.last.day+1}},next:function(){var e,t=this.last?this.last.clone():null;if(this.rule.count&&this.occurrence_number>=this.rule.count||this.rule.until&&this.last.compare(this.rule.until)>0)return this.completed=!0,null;if(0==this.occurrence_number&&this.last.compare(this.dtstart)>=0)return this.occurrence_number++,this.last;do{switch(e=1,this.rule.freq){case"SECONDLY":this.next_second();break;case"MINUTELY":this.next_minute();break;case"HOURLY":this.next_hour();break;case"DAILY":this.next_day();break;case"WEEKLY":this.next_week();break;case"MONTHLY":e=this.next_month();break;case"YEARLY":this.next_year();break;default:return null}}while(!this.check_contracting_rules()||this.last.compare(this.dtstart)<0||!e);if(0==this.last.compare(t))throw new Error("Same occurrence found twice, protecting you from death by recursion");return this.rule.until&&this.last.compare(this.rule.until)>0?(this.completed=!0,null):(this.occurrence_number++,this.last)},next_second:function(){return this.next_generic("BYSECOND","SECONDLY","second","minute")},increment_second:function(e){return this.increment_generic(e,"second",60,"minute")},next_minute:function(){return this.next_generic("BYMINUTE","MINUTELY","minute","hour","next_second")},increment_minute:function(e){return this.increment_generic(e,"minute",60,"hour")},next_hour:function(){return this.next_generic("BYHOUR","HOURLY","hour","monthday","next_minute")},increment_hour:function(e){this.increment_generic(e,"hour",24,"monthday")},next_day:function(){this.by_data;var e="DAILY"==this.rule.freq;return 0==this.next_hour()||(e?this.increment_monthday(this.rule.interval):this.increment_monthday(1)),0},next_week:function(){var e=0;if(0==this.next_weekday_by_week())return e;if(this.has_by_data("BYWEEKNO")){++this.by_indices.BYWEEKNO;this.by_indices.BYWEEKNO==this.by_data.BYWEEKNO.length&&(this.by_indices.BYWEEKNO=0,e=1),this.last.month=1,this.last.day=1;var t=this.by_data.BYWEEKNO[this.by_indices.BYWEEKNO];this.last.day+=7*t,e&&this.increment_year(1)}else this.increment_monthday(7*this.rule.interval);return e},normalizeByMonthDayRules:function(e,n,r){for(var i,s=t.Time.daysInMonth(n,e),o=[],a=0,l=r.length;a<l;a++)if(i=r[a],!(Math.abs(i)>s)){if(i<0)i=s+(i+1);else if(0===i)continue;-1===o.indexOf(i)&&o.push(i)}return o.sort((function(e,t){return e-t}))},_byDayAndMonthDay:function(e){var n,r,i,s,o=this.by_data.BYDAY,a=0,l=o.length,c=0,u=this,d=this.last.day;function h(){for(s=t.Time.daysInMonth(u.last.month,u.last.year),n=u.normalizeByMonthDayRules(u.last.year,u.last.month,u.by_data.BYMONTHDAY),i=n.length;n[a]<=d&&(!e||n[a]!=d)&&a<i-1;)a++}function f(){d=0,u.increment_month(),a=0,h()}h(),e&&(d-=1);for(var p=48;!c&&p;)if(p--,(r=d+1)>s)f();else{var g=n[a++];if(g>=r){d=g;for(var m=0;m<l;m++){var v=this.ruleDayOfWeek(o[m]),y=v[0],b=v[1];if(this.last.day=d,this.last.isNthWeekDay(b,y)){c=1;break}}c||a!==i||f()}else f()}if(p<=0)throw new Error("Malformed values in BYDAY combined with BYMONTHDAY parts");return c},next_month:function(){this.rule.freq;var e=1;if(0==this.next_hour())return e;if(this.has_by_data("BYDAY")&&this.has_by_data("BYMONTHDAY"))e=this._byDayAndMonthDay();else if(this.has_by_data("BYDAY")){var n=t.Time.daysInMonth(this.last.month,this.last.year),r=0,i=0;if(this.has_by_data("BYSETPOS")){for(var s=this.last.day,o=1;o<=n;o++)this.last.day=o,this.is_day_in_byday(this.last)&&(i++,o<=s&&r++);this.last.day=s}e=0;for(o=this.last.day+1;o<=n;o++)if(this.last.day=o,this.is_day_in_byday(this.last)&&(!this.has_by_data("BYSETPOS")||this.check_set_position(++r)||this.check_set_position(r-i-1))){e=1;break}o>n&&(this.last.day=1,this.increment_month(),this.is_day_in_byday(this.last)?this.has_by_data("BYSETPOS")&&!this.check_set_position(1)||(e=1):e=0)}else if(this.has_by_data("BYMONTHDAY")){this.by_indices.BYMONTHDAY++,this.by_indices.BYMONTHDAY>=this.by_data.BYMONTHDAY.length&&(this.by_indices.BYMONTHDAY=0,this.increment_month());n=t.Time.daysInMonth(this.last.month,this.last.year);(o=this.by_data.BYMONTHDAY[this.by_indices.BYMONTHDAY])<0&&(o=n+o+1),o>n?(this.last.day=1,e=this.is_day_in_byday(this.last)):this.last.day=o}else{this.increment_month();n=t.Time.daysInMonth(this.last.month,this.last.year);this.by_data.BYMONTHDAY[0]>n?e=0:this.last.day=this.by_data.BYMONTHDAY[0]}return e},next_weekday_by_week:function(){var e=0;if(0==this.next_hour())return e;if(!this.has_by_data("BYDAY"))return 1;for(;;){var n=new t.Time;this.by_indices.BYDAY++,this.by_indices.BYDAY==Object.keys(this.by_data.BYDAY).length&&(this.by_indices.BYDAY=0,e=1);var r=this.by_data.BYDAY[this.by_indices.BYDAY],i=this.ruleDayOfWeek(r)[1];(i-=this.rule.wkst)<0&&(i+=7),n.year=this.last.year,n.month=this.last.month,n.day=this.last.day;var s=n.startDoyWeek(this.rule.wkst);if(!(i+s<1)||e){var o=t.Time.fromDayOfYear(s+i,this.last.year);return this.last.year=o.year,this.last.month=o.month,this.last.day=o.day,e}}},next_year:function(){if(0==this.next_hour())return 0;if(++this.days_index==this.days.length){this.days_index=0;do{this.increment_year(this.rule.interval),this.expand_year_days(this.last.year)}while(0==this.days.length)}return this._nextByYearDay(),1},_nextByYearDay:function(){var e=this.days[this.days_index],n=this.last.year;e<1&&(e+=1,n+=1);var r=t.Time.fromDayOfYear(e,n);this.last.day=r.day,this.last.month=r.month},ruleDayOfWeek:function(e,n){var r=e.match(/([+-]?[0-9])?(MO|TU|WE|TH|FR|SA|SU)/);return r?[parseInt(r[1]||0,10),e=t.Recur.icalDayToNumericDay(r[2],n)]:[0,0]},next_generic:function(e,t,n,r,i){var s=e in this.by_data,o=this.rule.freq==t,a=0;if(i&&0==this[i]())return a;if(s){this.by_indices[e]++;this.by_indices[e];var l=this.by_data[e];this.by_indices[e]==l.length&&(this.by_indices[e]=0,a=1),this.last[n]=l[this.by_indices[e]]}else o&&this["increment_"+n](this.rule.interval);return s&&a&&o&&this["increment_"+r](1),a},increment_monthday:function(e){for(var n=0;n<e;n++){var r=t.Time.daysInMonth(this.last.month,this.last.year);this.last.day++,this.last.day>r&&(this.last.day-=r,this.increment_month())}},increment_month:function(){if(this.last.day=1,this.has_by_data("BYMONTH"))this.by_indices.BYMONTH++,this.by_indices.BYMONTH==this.by_data.BYMONTH.length&&(this.by_indices.BYMONTH=0,this.increment_year(1)),this.last.month=this.by_data.BYMONTH[this.by_indices.BYMONTH];else{"MONTHLY"==this.rule.freq?this.last.month+=this.rule.interval:this.last.month++,this.last.month--;var e=t.helpers.trunc(this.last.month/12);this.last.month%=12,this.last.month++,0!=e&&this.increment_year(e)}},increment_year:function(e){this.last.year+=e},increment_generic:function(e,n,r,i){this.last[n]+=e;var s=t.helpers.trunc(this.last[n]/r);this.last[n]%=r,0!=s&&this["increment_"+i](s)},has_by_data:function(e){return e in this.rule.parts},expand_year_days:function(e){var n=new t.Time;this.days=[];var r={},i=["BYDAY","BYWEEKNO","BYMONTHDAY","BYMONTH","BYYEARDAY"];for(var s in i)if(i.hasOwnProperty(s)){var o=i[s];o in this.rule.parts&&(r[o]=this.rule.parts[o])}if("BYMONTH"in r&&"BYWEEKNO"in r){var a=1,l={};n.year=e,n.isDate=!0;for(var c=0;c<this.by_data.BYMONTH.length;c++){var u=this.by_data.BYMONTH[c];n.month=u,n.day=1;var d=n.weekNumber(this.rule.wkst);n.day=t.Time.daysInMonth(u,e);var h=n.weekNumber(this.rule.wkst);for(c=d;c<h;c++)l[c]=1}for(var f=0;f<this.by_data.BYWEEKNO.length&&a;f++){(j=this.by_data.BYWEEKNO[f])<52?a&=l[f]:a=0}a?delete r.BYMONTH:delete r.BYWEEKNO}var p=Object.keys(r).length;if(0==p){var g=this.dtstart.clone();g.year=this.last.year,this.days.push(g.dayOfYear())}else if(1==p&&"BYMONTH"in r){for(var m in this.by_data.BYMONTH)if(this.by_data.BYMONTH.hasOwnProperty(m)){var v=this.dtstart.clone();v.year=e,v.month=this.by_data.BYMONTH[m],v.isDate=!0,this.days.push(v.dayOfYear())}}else if(1==p&&"BYMONTHDAY"in r){for(var y in this.by_data.BYMONTHDAY)if(this.by_data.BYMONTHDAY.hasOwnProperty(y)){var b=this.dtstart.clone();if((E=this.by_data.BYMONTHDAY[y])<0)E=E+(A=t.Time.daysInMonth(b.month,e))+1;b.day=E,b.year=e,b.isDate=!0,this.days.push(b.dayOfYear())}}else if(2==p&&"BYMONTHDAY"in r&&"BYMONTH"in r){for(var m in this.by_data.BYMONTH)if(this.by_data.BYMONTH.hasOwnProperty(m)){var D=this.by_data.BYMONTH[m],A=t.Time.daysInMonth(D,e);for(var y in this.by_data.BYMONTHDAY){var E;if(this.by_data.BYMONTHDAY.hasOwnProperty(y))(E=this.by_data.BYMONTHDAY[y])<0&&(E=E+A+1),n.day=E,n.month=D,n.year=e,n.isDate=!0,this.days.push(n.dayOfYear())}}}else if(1==p&&"BYWEEKNO"in r);else if(2==p&&"BYWEEKNO"in r&&"BYMONTHDAY"in r);else if(1==p&&"BYDAY"in r)this.days=this.days.concat(this.expand_by_day(e));else if(2==p&&"BYDAY"in r&&"BYMONTH"in r){for(var m in this.by_data.BYMONTH)if(this.by_data.BYMONTH.hasOwnProperty(m)){u=this.by_data.BYMONTH[m],A=t.Time.daysInMonth(u,e);n.year=e,n.month=this.by_data.BYMONTH[m],n.day=1,n.isDate=!0;var _=n.dayOfWeek(),S=n.dayOfYear()-1;n.day=A;var w=n.dayOfWeek();if(this.has_by_data("BYSETPOS")){for(var T=[],C=1;C<=A;C++)n.day=C,this.is_day_in_byday(n)&&T.push(C);for(var x=0;x<T.length;x++)(this.check_set_position(x+1)||this.check_set_position(x-T.length))&&this.days.push(S+T[x])}else for(var R in this.by_data.BYDAY)if(this.by_data.BYDAY.hasOwnProperty(R)){var O,k=this.by_data.BYDAY[R],M=this.ruleDayOfWeek(k),I=M[0],z=M[1],N=(z+7-_)%7+1,P=A-(w+7-z)%7;if(0==I)for(C=N;C<=A;C+=7)this.days.push(S+C);else I>0?(O=N+7*(I-1))<=A&&this.days.push(S+O):(O=P+7*(I+1))>0&&this.days.push(S+O)}}this.days.sort((function(e,t){return e-t}))}else if(2==p&&"BYDAY"in r&&"BYMONTHDAY"in r){var Y=this.expand_by_day(e);for(var B in Y)if(Y.hasOwnProperty(B)){C=Y[B];var H=t.Time.fromDayOfYear(C,e);this.by_data.BYMONTHDAY.indexOf(H.day)>=0&&this.days.push(C)}}else if(3==p&&"BYDAY"in r&&"BYMONTHDAY"in r&&"BYMONTH"in r){Y=this.expand_by_day(e);for(var B in Y)if(Y.hasOwnProperty(B)){C=Y[B],H=t.Time.fromDayOfYear(C,e);this.by_data.BYMONTH.indexOf(H.month)>=0&&this.by_data.BYMONTHDAY.indexOf(H.day)>=0&&this.days.push(C)}}else if(2==p&&"BYDAY"in r&&"BYWEEKNO"in r){Y=this.expand_by_day(e);for(var B in Y)if(Y.hasOwnProperty(B)){C=Y[B];var j=(H=t.Time.fromDayOfYear(C,e)).weekNumber(this.rule.wkst);this.by_data.BYWEEKNO.indexOf(j)&&this.days.push(C)}}else 3==p&&"BYDAY"in r&&"BYWEEKNO"in r&&"BYMONTHDAY"in r||(this.days=1==p&&"BYYEARDAY"in r?this.days.concat(this.by_data.BYYEARDAY):[]);return 0},expand_by_day:function(e){var t=[],n=this.last.clone();n.year=e,n.month=1,n.day=1,n.isDate=!0;var r=n.dayOfWeek();n.month=12,n.day=31,n.isDate=!0;var i=n.dayOfWeek(),s=n.dayOfYear();for(var o in this.by_data.BYDAY)if(this.by_data.BYDAY.hasOwnProperty(o)){var a=this.by_data.BYDAY[o],l=this.ruleDayOfWeek(a),c=l[0],u=l[1];if(0==c)for(var d=(u+7-r)%7+1;d<=s;d+=7)t.push(d);else if(c>0){var h;h=u>=r?u-r+1:u-r+8,t.push(h+7*(c-1))}else{var f;c=-c,f=u<=i?s-i+u:s-i+u-7,t.push(f-7*(c-1))}}return t},is_day_in_byday:function(e){for(var t in this.by_data.BYDAY)if(this.by_data.BYDAY.hasOwnProperty(t)){var n=this.by_data.BYDAY[t],r=this.ruleDayOfWeek(n),i=r[0],s=r[1],o=e.dayOfWeek();if(0==i&&s==o||e.nthWeekDay(s,i)==e.day)return 1}return 0},check_set_position:function(e){return!!this.has_by_data("BYSETPOS")&&-1!==this.by_data.BYSETPOS.indexOf(e)},sort_byday_rules:function(e){for(var t=0;t<e.length;t++)for(var n=0;n<t;n++){if(this.ruleDayOfWeek(e[n],this.rule.wkst)[1]>this.ruleDayOfWeek(e[t],this.rule.wkst)[1]){var r=e[t];e[t]=e[n],e[n]=r}}},check_contract_restriction:function(t,n){var r=e._indexMap[t],i=e._expandMap[this.rule.freq][r],s=!1;if(t in this.by_data&&i==e.CONTRACT){var o=this.by_data[t];for(var a in o)if(o.hasOwnProperty(a)&&o[a]==n){s=!0;break}}else s=!0;return s},check_contracting_rules:function(){var e=this.last.dayOfWeek(),n=this.last.weekNumber(this.rule.wkst),r=this.last.dayOfYear();return this.check_contract_restriction("BYSECOND",this.last.second)&&this.check_contract_restriction("BYMINUTE",this.last.minute)&&this.check_contract_restriction("BYHOUR",this.last.hour)&&this.check_contract_restriction("BYDAY",t.Recur.numericDayToIcalDay(e))&&this.check_contract_restriction("BYWEEKNO",n)&&this.check_contract_restriction("BYMONTHDAY",this.last.day)&&this.check_contract_restriction("BYMONTH",this.last.month)&&this.check_contract_restriction("BYYEARDAY",r)},setup_defaults:function(t,n,r){var i=e._indexMap[t];return e._expandMap[this.rule.freq][i]!=e.CONTRACT&&(t in this.by_data||(this.by_data[t]=[r]),this.rule.freq!=n)?this.by_data[t][0]:r},toJSON:function(){var e=Object.create(null);return e.initialized=this.initialized,e.rule=this.rule.toJSON(),e.dtstart=this.dtstart.toJSON(),e.by_data=this.by_data,e.days=this.days,e.last=this.last.toJSON(),e.by_indices=this.by_indices,e.occurrence_number=this.occurrence_number,e}},e._indexMap={BYSECOND:0,BYMINUTE:1,BYHOUR:2,BYDAY:3,BYMONTHDAY:4,BYYEARDAY:5,BYWEEKNO:6,BYMONTH:7,BYSETPOS:8},e._expandMap={SECONDLY:[1,1,1,1,1,1,1,1],MINUTELY:[2,1,1,1,1,1,1,1],HOURLY:[2,2,1,1,1,1,1,1],DAILY:[2,2,2,1,1,1,1,1],WEEKLY:[2,2,2,2,3,3,1,1],MONTHLY:[2,2,2,2,2,3,3,1],YEARLY:[2,2,2,2,2,2,2,2]},e.UNKNOWN=0,e.CONTRACT=1,e.EXPAND=2,e.ILLEGAL=3,e}(),t.RecurExpansion=function(){function e(e){return t.helpers.formatClassType(e,t.Time)}function n(e,t){return e.compare(t)}function r(e){this.ruleDates=[],this.exDates=[],this.fromData(e)}return r.prototype={complete:!1,ruleIterators:null,ruleDates:null,exDates:null,ruleDateInc:0,exDateInc:0,exDate:null,ruleDate:null,dtstart:null,last:null,fromData:function(n){var r=t.helpers.formatClassType(n.dtstart,t.Time);if(!r)throw new Error(".dtstart (ICAL.Time) must be given");if(this.dtstart=r,n.component)this._init(n.component);else{if(this.last=e(n.last)||r.clone(),!n.ruleIterators)throw new Error(".ruleIterators or .component must be given");this.ruleIterators=n.ruleIterators.map((function(e){return t.helpers.formatClassType(e,t.RecurIterator)})),this.ruleDateInc=n.ruleDateInc,this.exDateInc=n.exDateInc,n.ruleDates&&(this.ruleDates=n.ruleDates.map(e),this.ruleDate=this.ruleDates[this.ruleDateInc]),n.exDates&&(this.exDates=n.exDates.map(e),this.exDate=this.exDates[this.exDateInc]),void 0!==n.complete&&(this.complete=n.complete)}},next:function(){for(var e,t,n,r=0;;){if(r++>500)throw new Error("max tries have occured, rule may be impossible to forfill.");if(t=this.ruleDate,e=this._nextRecurrenceIter(this.last),!t&&!e){this.complete=!0;break}if((!t||e&&t.compare(e.last)>0)&&(t=e.last.clone(),e.next()),this.ruleDate===t&&this._nextRuleDay(),this.last=t,!this.exDate||((n=this.exDate.compare(this.last))<0&&this._nextExDay(),0!==n))return this.last;this._nextExDay()}},toJSON:function(){function e(e){return e.toJSON()}var t=Object.create(null);return t.ruleIterators=this.ruleIterators.map(e),this.ruleDates&&(t.ruleDates=this.ruleDates.map(e)),this.exDates&&(t.exDates=this.exDates.map(e)),t.ruleDateInc=this.ruleDateInc,t.exDateInc=this.exDateInc,t.last=this.last.toJSON(),t.dtstart=this.dtstart.toJSON(),t.complete=this.complete,t},_extractDates:function(e,r){function i(e){s=t.helpers.binsearchInsert(o,e,n),o.splice(s,0,e)}for(var s,o=[],a=e.getAllProperties(r),l=a.length,c=0;c<l;c++)a[c].getValues().forEach(i);return o},_init:function(e){if(this.ruleIterators=[],this.last=this.dtstart.clone(),!((r=e).hasProperty("rdate")||r.hasProperty("rrule")||r.hasProperty("recurrence-id")))return this.ruleDate=this.last.clone(),void(this.complete=!0);var r;if(e.hasProperty("rdate")&&(this.ruleDates=this._extractDates(e,"rdate"),this.ruleDates[0]&&this.ruleDates[0].compare(this.dtstart)<0?(this.ruleDateInc=0,this.last=this.ruleDates[0].clone()):this.ruleDateInc=t.helpers.binsearchInsert(this.ruleDates,this.last,n),this.ruleDate=this.ruleDates[this.ruleDateInc]),e.hasProperty("rrule"))for(var i,s=e.getAllProperties("rrule"),o=0,a=s.length;o<a;o++)i=s[o].getFirstValue().iterator(this.dtstart),this.ruleIterators.push(i),i.next();e.hasProperty("exdate")&&(this.exDates=this._extractDates(e,"exdate"),this.exDateInc=t.helpers.binsearchInsert(this.exDates,this.last,n),this.exDate=this.exDates[this.exDateInc])},_nextExDay:function(){this.exDate=this.exDates[++this.exDateInc]},_nextRuleDay:function(){this.ruleDate=this.ruleDates[++this.ruleDateInc]},_nextRecurrenceIter:function(){var e=this.ruleIterators;if(0===e.length)return null;for(var t,n,r,i=e.length,s=0;s<i;s++)n=(t=e[s]).last,t.completed?(i--,0!==s&&s--,e.splice(s,1)):(!r||r.last.compare(n)>0)&&(r=t);return r}},r}(),t.Event=function(){function e(e,n){e instanceof t.Component||(n=e,e=null),this.component=e||new t.Component("vevent"),this._rangeExceptionCache=Object.create(null),this.exceptions=Object.create(null),this.rangeExceptions=[],n&&n.strictExceptions&&(this.strictExceptions=n.strictExceptions),n&&n.exceptions?n.exceptions.forEach(this.relateException,this):this.component.parent&&!this.isRecurrenceException()&&this.component.parent.getAllSubcomponents("vevent").forEach((function(e){e.hasProperty("recurrence-id")&&this.relateException(e)}),this)}function n(e,t){return e[0]>t[0]?1:t[0]>e[0]?-1:0}return e.prototype={THISANDFUTURE:"THISANDFUTURE",exceptions:null,strictExceptions:!1,relateException:function(e){if(this.isRecurrenceException())throw new Error("cannot relate exception to exceptions");if(e instanceof t.Component&&(e=new t.Event(e)),this.strictExceptions&&e.uid!==this.uid)throw new Error("attempted to relate unrelated exception");var r=e.recurrenceId.toString();if(this.exceptions[r]=e,e.modifiesFuture()){var i=[e.recurrenceId.toUnixTime(),r],s=t.helpers.binsearchInsert(this.rangeExceptions,i,n);this.rangeExceptions.splice(s,0,i)}},modifiesFuture:function(){return!!this.component.hasProperty("recurrence-id")&&this.component.getFirstProperty("recurrence-id").getParameter("range")===this.THISANDFUTURE},findRangeException:function(e){if(!this.rangeExceptions.length)return null;var r=e.toUnixTime(),i=t.helpers.binsearchInsert(this.rangeExceptions,[r],n);if((i-=1)<0)return null;var s=this.rangeExceptions[i];return r<s[0]?null:s[1]},getOccurrenceDetails:function(e){var n,r=e.toString(),i=e.convertToZone(t.Timezone.utcTimezone).toString(),s={recurrenceId:e};if(r in this.exceptions)n=s.item=this.exceptions[r],s.startDate=n.startDate,s.endDate=n.endDate,s.item=n;else if(i in this.exceptions)n=this.exceptions[i],s.startDate=n.startDate,s.endDate=n.endDate,s.item=n;else{var o,a=this.findRangeException(e);if(a){var l=this.exceptions[a];s.item=l;var c=this._rangeExceptionCache[a];if(!c){var u=l.recurrenceId.clone(),d=l.startDate.clone();u.zone=d.zone,c=d.subtractDate(u),this._rangeExceptionCache[a]=c}var h=e.clone();h.zone=l.startDate.zone,h.addDuration(c),(o=h.clone()).addDuration(l.duration),s.startDate=h,s.endDate=o}else(o=e.clone()).addDuration(this.duration),s.endDate=o,s.startDate=e,s.item=this}return s},iterator:function(e){return new t.RecurExpansion({component:this.component,dtstart:e||this.startDate})},isRecurring:function(){var e=this.component;return e.hasProperty("rrule")||e.hasProperty("rdate")},isRecurrenceException:function(){return this.component.hasProperty("recurrence-id")},getRecurrenceTypes:function(){for(var e=this.component.getAllProperties("rrule"),t=0,n=e.length,r=Object.create(null);t<n;t++){r[e[t].getFirstValue().freq]=!0}return r},get uid(){return this._firstProp("uid")},set uid(e){this._setProp("uid",e)},get startDate(){return this._firstProp("dtstart")},set startDate(e){this._setTime("dtstart",e)},get endDate(){var e=this._firstProp("dtend");if(!e){var t=this._firstProp("duration");e=this.startDate.clone(),t?e.addDuration(t):e.isDate&&(e.day+=1)}return e},set endDate(e){this.component.hasProperty("duration")&&this.component.removeProperty("duration"),this._setTime("dtend",e)},get duration(){var e=this._firstProp("duration");return e||this.endDate.subtractDateTz(this.startDate)},set duration(e){this.component.hasProperty("dtend")&&this.component.removeProperty("dtend"),this._setProp("duration",e)},get location(){return this._firstProp("location")},set location(e){return this._setProp("location",e)},get attendees(){return this.component.getAllProperties("attendee")},get summary(){return this._firstProp("summary")},set summary(e){this._setProp("summary",e)},get description(){return this._firstProp("description")},set description(e){this._setProp("description",e)},get color(){return this._firstProp("color")},set color(e){this._setProp("color",e)},get organizer(){return this._firstProp("organizer")},set organizer(e){this._setProp("organizer",e)},get sequence(){return this._firstProp("sequence")},set sequence(e){this._setProp("sequence",e)},get recurrenceId(){return this._firstProp("recurrence-id")},set recurrenceId(e){this._setTime("recurrence-id",e)},_setTime:function(e,n){var r=this.component.getFirstProperty(e);r||(r=new t.Property(e),this.component.addProperty(r)),n.zone===t.Timezone.localTimezone||n.zone===t.Timezone.utcTimezone?r.removeParameter("tzid"):r.setParameter("tzid",n.zone.tzid),r.setValue(n)},_setProp:function(e,t){this.component.updatePropertyWithValue(e,t)},_firstProp:function(e){return this.component.getFirstPropertyValue(e)},toString:function(){return this.component.toString()}},e}(),t.ComponentParser=function(){function e(e){var t;for(t in void 0===e&&(e={}),e)e.hasOwnProperty(t)&&(this[t]=e[t])}return e.prototype={parseEvent:!0,parseTimezone:!0,oncomplete:function(){},onerror:function(e){},ontimezone:function(e){},onevent:function(e){},process:function(e){"string"==typeof e&&(e=t.parse(e)),e instanceof t.Component||(e=new t.Component(e));for(var n,r=e.getAllSubcomponents(),i=0,s=r.length;i<s;i++)switch((n=r[i]).name){case"vtimezone":if(this.parseTimezone){var o=n.getFirstPropertyValue("tzid");o&&this.ontimezone(new t.Timezone({tzid:o,component:n}))}break;case"vevent":this.parseEvent&&this.onevent(new t.Event(n));break;default:continue}this.oncomplete()}},e}()},11720:(e,t,n)=>{"use strict";n.d(t,{jz:()=>z});var r,i,s,o=n(6400),a=[],l=[],c=o.YM.__b,u=o.YM.__r,d=o.YM.diffed,h=o.YM.__c,f=o.YM.unmount;function p(){for(var e;e=a.shift();)if(e.__P&&e.__H)try{e.__H.__h.forEach(v),e.__H.__h.forEach(y),e.__H.__h=[]}catch(r){e.__H.__h=[],o.YM.__e(r,e.__v)}}o.YM.__b=function(e){r=null,c&&c(e)},o.YM.__r=function(e){u&&u(e),0;var t=(r=e.__c).__H;t&&(i===r?(t.__h=[],r.__h=[],t.__.forEach((function(e){e.__N&&(e.__=e.__N),e.__V=l,e.__N=e.i=void 0}))):(t.__h.forEach(v),t.__h.forEach(y),t.__h=[])),i=r},o.YM.diffed=function(e){d&&d(e);var t=e.__c;t&&t.__H&&(t.__H.__h.length&&(1!==a.push(t)&&s===o.YM.requestAnimationFrame||((s=o.YM.requestAnimationFrame)||m)(p)),t.__H.__.forEach((function(e){e.i&&(e.__H=e.i),e.__V!==l&&(e.__=e.__V),e.i=void 0,e.__V=l}))),i=r=null},o.YM.__c=function(e,t){t.some((function(e){try{e.__h.forEach(v),e.__h=e.__h.filter((function(e){return!e.__||y(e)}))}catch(i){t.some((function(e){e.__h&&(e.__h=[])})),t=[],o.YM.__e(i,e.__v)}})),h&&h(e,t)},o.YM.unmount=function(e){f&&f(e);var t,n=e.__c;n&&n.__H&&(n.__H.__.forEach((function(e){try{v(e)}catch(e){t=e}})),n.__H=void 0,t&&o.YM.__e(t,n.__v))};var g="function"==typeof requestAnimationFrame;function m(e){var t,n=function(){clearTimeout(r),g&&cancelAnimationFrame(t),setTimeout(e)},r=setTimeout(n,100);g&&(t=requestAnimationFrame(n))}function v(e){var t=r,n=e.__c;"function"==typeof n&&(e.__c=void 0,n()),r=t}function y(e){var t=r;e.__c=e.__(),r=t}function b(e,t){for(var n in t)e[n]=t[n];return e}function D(e,t){for(var n in e)if("__source"!==n&&!(n in t))return!0;for(var r in t)if("__source"!==r&&e[r]!==t[r])return!0;return!1}function A(e){this.props=e}(A.prototype=new o.wA).isPureReactComponent=!0,A.prototype.shouldComponentUpdate=function(e,t){return D(this.props,e)||D(this.state,t)};var E=o.YM.__b;o.YM.__b=function(e){e.type&&e.type.__f&&e.ref&&(e.props.ref=e.ref,e.ref=null),E&&E(e)};"undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.forward_ref");var _=function(e,t){return null==e?null:(0,o.bR)((0,o.bR)(e).map(t))},S=(o.bR,o.YM.__e);o.YM.__e=function(e,t,n,r){if(e.then)for(var i,s=t;s=s.__;)if((i=s.__c)&&i.__c)return null==t.__e&&(t.__e=n.__e,t.__k=n.__k),i.__c(e,t);S(e,t,n,r)};var w=o.YM.unmount;function T(e,t,n){return e&&(e.__c&&e.__c.__H&&(e.__c.__H.__.forEach((function(e){"function"==typeof e.__c&&e.__c()})),e.__c.__H=null),null!=(e=b({},e)).__c&&(e.__c.__P===n&&(e.__c.__P=t),e.__c=null),e.__k=e.__k&&e.__k.map((function(e){return T(e,t,n)}))),e}function C(e,t,n){return e&&(e.__v=null,e.__k=e.__k&&e.__k.map((function(e){return C(e,t,n)})),e.__c&&e.__c.__P===t&&(e.__e&&n.insertBefore(e.__e,e.__d),e.__c.__e=!0,e.__c.__P=n)),e}function x(){this.__u=0,this.t=null,this.__b=null}function R(e){var t=e.__.__c;return t&&t.__a&&t.__a(e)}function O(){this.u=null,this.o=null}o.YM.unmount=function(e){var t=e.__c;t&&t.__R&&t.__R(),t&&!0===e.__h&&(e.type=null),w&&w(e)},(x.prototype=new o.wA).__c=function(e,t){var n=t.__c,r=this;null==r.t&&(r.t=[]),r.t.push(n);var i=R(r.__v),s=!1,o=function(){s||(s=!0,n.__R=null,i?i(a):a())};n.__R=o;var a=function(){if(! --r.__u){if(r.state.__a){var e=r.state.__a;r.__v.__k[0]=C(e,e.__c.__P,e.__c.__O)}var t;for(r.setState({__a:r.__b=null});t=r.t.pop();)t.forceUpdate()}},l=!0===t.__h;r.__u++||l||r.setState({__a:r.__b=r.__v.__k[0]}),e.then(o,o)},x.prototype.componentWillUnmount=function(){this.t=[]},x.prototype.render=function(e,t){if(this.__b){if(this.__v.__k){var n=document.createElement("div"),r=this.__v.__k[0].__c;this.__v.__k[0]=T(this.__b,n,r.__O=r.__P)}this.__b=null}var i=t.__a&&(0,o.az)(o.HY,null,e.fallback);return i&&(i.__h=null),[(0,o.az)(o.HY,null,t.__a?null:e.children),i]};var k=function(e,t,n){if(++n[1]===n[0]&&e.o.delete(t),e.props.revealOrder&&("t"!==e.props.revealOrder[0]||!e.o.size))for(n=e.u;n;){for(;n.length>3;)n.pop()();if(n[1]<n[0])break;e.u=n=n[2]}};function M(e){return this.getChildContext=function(){return e.context},e.children}function I(e){var t=this,n=e.i;t.componentWillUnmount=function(){(0,o.sY)(null,t.l),t.l=null,t.i=null},t.i&&t.i!==n&&t.componentWillUnmount(),e.__v?(t.l||(t.i=n,t.l={nodeType:1,parentNode:n,childNodes:[],appendChild:function(e){this.childNodes.push(e),t.i.appendChild(e)},insertBefore:function(e,n){this.childNodes.push(e),t.i.appendChild(e)},removeChild:function(e){this.childNodes.splice(this.childNodes.indexOf(e)>>>1,1),t.i.removeChild(e)}}),(0,o.sY)((0,o.az)(M,{context:t.context},e.__v),t.l)):t.l&&t.componentWillUnmount()}function z(e,t){var n=(0,o.az)(I,{__v:e,i:t});return n.containerInfo=t,n}(O.prototype=new o.wA).__a=function(e){var t=this,n=R(t.__v),r=t.o.get(e);return r[0]++,function(i){var s=function(){t.props.revealOrder?(r.push(i),k(t,e,r)):i()};n?n(s):s()}},O.prototype.render=function(e){this.u=null,this.o=new Map;var t=(0,o.bR)(e.children);e.revealOrder&&"b"===e.revealOrder[0]&&t.reverse();for(var n=t.length;n--;)this.o.set(t[n],this.u=[1,0,this.u]);return e.children},O.prototype.componentDidUpdate=O.prototype.componentDidMount=function(){var e=this;this.o.forEach((function(t,n){k(e,n,t)}))};var N="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,P=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,Y="undefined"!=typeof document,B=function(e){return("undefined"!=typeof Symbol&&"symbol"==typeof Symbol()?/fil|che|rad/i:/fil|che|ra/i).test(e)};o.wA.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach((function(e){Object.defineProperty(o.wA.prototype,e,{configurable:!0,get:function(){return this["UNSAFE_"+e]},set:function(t){Object.defineProperty(this,e,{configurable:!0,writable:!0,value:t})}})}));var H=o.YM.event;function j(){}function U(){return this.cancelBubble}function L(){return this.defaultPrevented}o.YM.event=function(e){return H&&(e=H(e)),e.persist=j,e.isPropagationStopped=U,e.isDefaultPrevented=L,e.nativeEvent=e};var V={configurable:!0,get:function(){return this.class}},W=o.YM.vnode;o.YM.vnode=function(e){var t=e.type,n=e.props,r=n;if("string"==typeof t){var i=-1===t.indexOf("-");for(var s in r={},n){var a=n[s];Y&&"children"===s&&"noscript"===t||"value"===s&&"defaultValue"in n&&null==a||("defaultValue"===s&&"value"in n&&null==n.value?s="value":"download"===s&&!0===a?a="":/ondoubleclick/i.test(s)?s="ondblclick":/^onchange(textarea|input)/i.test(s+t)&&!B(n.type)?s="oninput":/^onfocus$/i.test(s)?s="onfocusin":/^onblur$/i.test(s)?s="onfocusout":/^on(Ani|Tra|Tou|BeforeInp|Compo)/.test(s)?s=s.toLowerCase():i&&P.test(s)?s=s.replace(/[A-Z0-9]/g,"-$&").toLowerCase():null===a&&(a=void 0),/^oninput$/i.test(s)&&(s=s.toLowerCase(),r[s]&&(s="oninputCapture")),r[s]=a)}"select"==t&&r.multiple&&Array.isArray(r.value)&&(r.value=(0,o.bR)(n.children).forEach((function(e){e.props.selected=-1!=r.value.indexOf(e.props.value)}))),"select"==t&&null!=r.defaultValue&&(r.value=(0,o.bR)(n.children).forEach((function(e){e.props.selected=r.multiple?-1!=r.defaultValue.indexOf(e.props.value):r.defaultValue==e.props.value}))),e.props=r,n.class!=n.className&&(V.enumerable="className"in n,null!=n.className&&(r.class=n.className),Object.defineProperty(r,"className",V))}e.$$typeof=N,W&&W(e)};var F=o.YM.__r;o.YM.__r=function(e){F&&F(e),e.__c};o.HY;o.az,o.kr,o.Vf,o.HY,o.wA},6400:(e,t,n)=>{"use strict";n.d(t,{HY:()=>b,Tm:()=>V,Vf:()=>y,YM:()=>i,ZB:()=>L,az:()=>m,bR:()=>M,kr:()=>W,sY:()=>U,wA:()=>S});var r,i,s,o,a,l,c,u,d={},h=[],f=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function p(e,t){for(var n in t)e[n]=t[n];return e}function g(e){var t=e.parentNode;t&&t.removeChild(e)}function m(e,t,n){var i,s,o,a={};for(o in t)"key"==o?i=t[o]:"ref"==o?s=t[o]:a[o]=t[o];if(arguments.length>2&&(a.children=arguments.length>3?r.call(arguments,2):n),"function"==typeof e&&null!=e.defaultProps)for(o in e.defaultProps)void 0===a[o]&&(a[o]=e.defaultProps[o]);return v(e,a,i,s,null)}function v(e,t,n,r,o){var a={type:e,props:t,key:n,ref:r,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==o?++s:o};return null==o&&null!=i.vnode&&i.vnode(a),a}function y(){return{current:null}}function b(e){return e.children}function D(e,t,n){"-"===t[0]?e.setProperty(t,null==n?"":n):e[t]=null==n?"":"number"!=typeof n||f.test(t)?n:n+"px"}function A(e,t,n,r,i){var s;e:if("style"===t)if("string"==typeof n)e.style.cssText=n;else{if("string"==typeof r&&(e.style.cssText=r=""),r)for(t in r)n&&t in n||D(e.style,t,"");if(n)for(t in n)r&&n[t]===r[t]||D(e.style,t,n[t])}else if("o"===t[0]&&"n"===t[1])s=t!==(t=t.replace(/Capture$/,"")),t=t.toLowerCase()in e?t.toLowerCase().slice(2):t.slice(2),e.l||(e.l={}),e.l[t+s]=n,n?r||e.addEventListener(t,s?_:E,s):e.removeEventListener(t,s?_:E,s);else if("dangerouslySetInnerHTML"!==t){if(i)t=t.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if("width"!==t&&"height"!==t&&"href"!==t&&"list"!==t&&"form"!==t&&"tabIndex"!==t&&"download"!==t&&t in e)try{e[t]=null==n?"":n;break e}catch(e){}"function"==typeof n||(null==n||!1===n&&-1==t.indexOf("-")?e.removeAttribute(t):e.setAttribute(t,n))}}function E(e){o=!0;try{return this.l[e.type+!1](i.event?i.event(e):e)}finally{o=!1}}function _(e){o=!0;try{return this.l[e.type+!0](i.event?i.event(e):e)}finally{o=!1}}function S(e,t){this.props=e,this.context=t}function w(e,t){if(null==t)return e.__?w(e.__,e.__.__k.indexOf(e)+1):null;for(var n;t<e.__k.length;t++)if(null!=(n=e.__k[t])&&null!=n.__e)return n.__e;return"function"==typeof e.type?w(e):null}function T(e){var t,n;if(null!=(e=e.__)&&null!=e.__c){for(e.__e=e.__c.base=null,t=0;t<e.__k.length;t++)if(null!=(n=e.__k[t])&&null!=n.__e){e.__e=e.__c.base=n.__e;break}return T(e)}}function C(e){o?setTimeout(e):c(e)}function x(e){(!e.__d&&(e.__d=!0)&&a.push(e)&&!R.__r++||l!==i.debounceRendering)&&((l=i.debounceRendering)||C)(R)}function R(){var e,t,n,r,i,s,o,l;for(a.sort((function(e,t){return e.__v.__b-t.__v.__b}));e=a.shift();)e.__d&&(t=a.length,r=void 0,i=void 0,o=(s=(n=e).__v).__e,(l=n.__P)&&(r=[],(i=p({},s)).__v=s.__v+1,N(l,s,i,n.__n,void 0!==l.ownerSVGElement,null!=s.__h?[o]:null,r,null==o?w(s):o,s.__h),P(r,s),s.__e!=o&&T(s)),a.length>t&&a.sort((function(e,t){return e.__v.__b-t.__v.__b})));R.__r=0}function O(e,t,n,r,i,s,o,a,l,c){var u,f,p,g,m,y,D,A=r&&r.__k||h,E=A.length;for(n.__k=[],u=0;u<t.length;u++)if(null!=(g=n.__k[u]=null==(g=t[u])||"boolean"==typeof g?null:"string"==typeof g||"number"==typeof g||"bigint"==typeof g?v(null,g,null,null,g):Array.isArray(g)?v(b,{children:g},null,null,null):g.__b>0?v(g.type,g.props,g.key,g.ref?g.ref:null,g.__v):g)){if(g.__=n,g.__b=n.__b+1,null===(p=A[u])||p&&g.key==p.key&&g.type===p.type)A[u]=void 0;else for(f=0;f<E;f++){if((p=A[f])&&g.key==p.key&&g.type===p.type){A[f]=void 0;break}p=null}N(e,g,p=p||d,i,s,o,a,l,c),m=g.__e,(f=g.ref)&&p.ref!=f&&(D||(D=[]),p.ref&&D.push(p.ref,null,g),D.push(f,g.__c||m,g)),null!=m?(null==y&&(y=m),"function"==typeof g.type&&g.__k===p.__k?g.__d=l=k(g,l,e):l=I(e,g,p,A,m,l),"function"==typeof n.type&&(n.__d=l)):l&&p.__e==l&&l.parentNode!=e&&(l=w(p))}for(n.__e=y,u=E;u--;)null!=A[u]&&("function"==typeof n.type&&null!=A[u].__e&&A[u].__e==n.__d&&(n.__d=z(r).nextSibling),H(A[u],A[u]));if(D)for(u=0;u<D.length;u++)B(D[u],D[++u],D[++u])}function k(e,t,n){for(var r,i=e.__k,s=0;i&&s<i.length;s++)(r=i[s])&&(r.__=e,t="function"==typeof r.type?k(r,t,n):I(n,r,r,i,r.__e,t));return t}function M(e,t){return t=t||[],null==e||"boolean"==typeof e||(Array.isArray(e)?e.some((function(e){M(e,t)})):t.push(e)),t}function I(e,t,n,r,i,s){var o,a,l;if(void 0!==t.__d)o=t.__d,t.__d=void 0;else if(null==n||i!=s||null==i.parentNode)e:if(null==s||s.parentNode!==e)e.appendChild(i),o=null;else{for(a=s,l=0;(a=a.nextSibling)&&l<r.length;l+=1)if(a==i)break e;e.insertBefore(i,s),o=s}return void 0!==o?o:i.nextSibling}function z(e){var t,n,r;if(null==e.type||"string"==typeof e.type)return e.__e;if(e.__k)for(t=e.__k.length-1;t>=0;t--)if((n=e.__k[t])&&(r=z(n)))return r;return null}function N(e,t,n,r,s,o,a,l,c){var u,d,h,f,g,m,v,y,D,A,E,_,w,T,C,x=t.type;if(void 0!==t.constructor)return null;null!=n.__h&&(c=n.__h,l=t.__e=n.__e,t.__h=null,o=[l]),(u=i.__b)&&u(t);try{e:if("function"==typeof x){if(y=t.props,D=(u=x.contextType)&&r[u.__c],A=u?D?D.props.value:u.__:r,n.__c?v=(d=t.__c=n.__c).__=d.__E:("prototype"in x&&x.prototype.render?t.__c=d=new x(y,A):(t.__c=d=new S(y,A),d.constructor=x,d.render=j),D&&D.sub(d),d.props=y,d.state||(d.state={}),d.context=A,d.__n=r,h=d.__d=!0,d.__h=[],d._sb=[]),null==d.__s&&(d.__s=d.state),null!=x.getDerivedStateFromProps&&(d.__s==d.state&&(d.__s=p({},d.__s)),p(d.__s,x.getDerivedStateFromProps(y,d.__s))),f=d.props,g=d.state,d.__v=t,h)null==x.getDerivedStateFromProps&&null!=d.componentWillMount&&d.componentWillMount(),null!=d.componentDidMount&&d.__h.push(d.componentDidMount);else{if(null==x.getDerivedStateFromProps&&y!==f&&null!=d.componentWillReceiveProps&&d.componentWillReceiveProps(y,A),!d.__e&&null!=d.shouldComponentUpdate&&!1===d.shouldComponentUpdate(y,d.__s,A)||t.__v===n.__v){for(t.__v!==n.__v&&(d.props=y,d.state=d.__s,d.__d=!1),t.__e=n.__e,t.__k=n.__k,t.__k.forEach((function(e){e&&(e.__=t)})),E=0;E<d._sb.length;E++)d.__h.push(d._sb[E]);d._sb=[],d.__h.length&&a.push(d);break e}null!=d.componentWillUpdate&&d.componentWillUpdate(y,d.__s,A),null!=d.componentDidUpdate&&d.__h.push((function(){d.componentDidUpdate(f,g,m)}))}if(d.context=A,d.props=y,d.__P=e,_=i.__r,w=0,"prototype"in x&&x.prototype.render){for(d.state=d.__s,d.__d=!1,_&&_(t),u=d.render(d.props,d.state,d.context),T=0;T<d._sb.length;T++)d.__h.push(d._sb[T]);d._sb=[]}else do{d.__d=!1,_&&_(t),u=d.render(d.props,d.state,d.context),d.state=d.__s}while(d.__d&&++w<25);d.state=d.__s,null!=d.getChildContext&&(r=p(p({},r),d.getChildContext())),h||null==d.getSnapshotBeforeUpdate||(m=d.getSnapshotBeforeUpdate(f,g)),C=null!=u&&u.type===b&&null==u.key?u.props.children:u,O(e,Array.isArray(C)?C:[C],t,n,r,s,o,a,l,c),d.base=t.__e,t.__h=null,d.__h.length&&a.push(d),v&&(d.__E=d.__=null),d.__e=!1}else null==o&&t.__v===n.__v?(t.__k=n.__k,t.__e=n.__e):t.__e=Y(n.__e,t,n,r,s,o,a,c);(u=i.diffed)&&u(t)}catch(e){t.__v=null,(c||null!=o)&&(t.__e=l,t.__h=!!c,o[o.indexOf(l)]=null),i.__e(e,t,n)}}function P(e,t){i.__c&&i.__c(t,e),e.some((function(t){try{e=t.__h,t.__h=[],e.some((function(e){e.call(t)}))}catch(e){i.__e(e,t.__v)}}))}function Y(e,t,n,i,s,o,a,l){var c,u,h,f=n.props,p=t.props,m=t.type,v=0;if("svg"===m&&(s=!0),null!=o)for(;v<o.length;v++)if((c=o[v])&&"setAttribute"in c==!!m&&(m?c.localName===m:3===c.nodeType)){e=c,o[v]=null;break}if(null==e){if(null===m)return document.createTextNode(p);e=s?document.createElementNS("http://www.w3.org/2000/svg",m):document.createElement(m,p.is&&p),o=null,l=!1}if(null===m)f===p||l&&e.data===p||(e.data=p);else{if(o=o&&r.call(e.childNodes),u=(f=n.props||d).dangerouslySetInnerHTML,h=p.dangerouslySetInnerHTML,!l){if(null!=o)for(f={},v=0;v<e.attributes.length;v++)f[e.attributes[v].name]=e.attributes[v].value;(h||u)&&(h&&(u&&h.__html==u.__html||h.__html===e.innerHTML)||(e.innerHTML=h&&h.__html||""))}if(function(e,t,n,r,i){var s;for(s in n)"children"===s||"key"===s||s in t||A(e,s,null,n[s],r);for(s in t)i&&"function"!=typeof t[s]||"children"===s||"key"===s||"value"===s||"checked"===s||n[s]===t[s]||A(e,s,t[s],n[s],r)}(e,p,f,s,l),h)t.__k=[];else if(v=t.props.children,O(e,Array.isArray(v)?v:[v],t,n,i,s&&"foreignObject"!==m,o,a,o?o[0]:n.__k&&w(n,0),l),null!=o)for(v=o.length;v--;)null!=o[v]&&g(o[v]);l||("value"in p&&void 0!==(v=p.value)&&(v!==e.value||"progress"===m&&!v||"option"===m&&v!==f.value)&&A(e,"value",v,f.value,!1),"checked"in p&&void 0!==(v=p.checked)&&v!==e.checked&&A(e,"checked",v,f.checked,!1))}return e}function B(e,t,n){try{"function"==typeof e?e(t):e.current=t}catch(e){i.__e(e,n)}}function H(e,t,n){var r,s;if(i.unmount&&i.unmount(e),(r=e.ref)&&(r.current&&r.current!==e.__e||B(r,null,t)),null!=(r=e.__c)){if(r.componentWillUnmount)try{r.componentWillUnmount()}catch(e){i.__e(e,t)}r.base=r.__P=null,e.__c=void 0}if(r=e.__k)for(s=0;s<r.length;s++)r[s]&&H(r[s],t,n||"function"!=typeof e.type);n||null==e.__e||g(e.__e),e.__=e.__e=e.__d=void 0}function j(e,t,n){return this.constructor(e,n)}function U(e,t,n){var s,o,a;i.__&&i.__(e,t),o=(s="function"==typeof n)?null:n&&n.__k||t.__k,a=[],N(t,e=(!s&&n||t).__k=m(b,null,[e]),o||d,d,void 0!==t.ownerSVGElement,!s&&n?[n]:o?null:t.firstChild?r.call(t.childNodes):null,a,!s&&n?n:o?o.__e:t.firstChild,s),P(a,e)}function L(e,t){U(e,t,L)}function V(e,t,n){var i,s,o,a=p({},e.props);for(o in t)"key"==o?i=t[o]:"ref"==o?s=t[o]:a[o]=t[o];return arguments.length>2&&(a.children=arguments.length>3?r.call(arguments,2):n),v(e.type,a,i||e.key,s||e.ref,null)}function W(e,t){var n={__c:t="__cC"+u++,__:e,Consumer:function(e,t){return e.children(t)},Provider:function(e){var n,r;return this.getChildContext||(n=[],(r={})[t]=this,this.getChildContext=function(){return r},this.shouldComponentUpdate=function(e){this.props.value!==e.value&&n.some((function(e){e.__e=!0,x(e)}))},this.sub=function(e){n.push(e);var t=e.componentWillUnmount;e.componentWillUnmount=function(){n.splice(n.indexOf(e),1),t&&t.call(e)}}),e.children}};return n.Provider.__=n.Consumer.contextType=n}r=h.slice,i={__e:function(e,t,n,r){for(var i,s,o;t=t.__;)if((i=t.__c)&&!i.__)try{if((s=i.constructor)&&null!=s.getDerivedStateFromError&&(i.setState(s.getDerivedStateFromError(e)),o=i.__d),null!=i.componentDidCatch&&(i.componentDidCatch(e,r||{}),o=i.__d),o)return i.__E=i}catch(t){e=t}throw e}},s=0,o=!1,S.prototype.setState=function(e,t){var n;n=null!=this.__s&&this.__s!==this.state?this.__s:this.__s=p({},this.state),"function"==typeof e&&(e=e(p({},n),this.props)),e&&p(n,e),null!=e&&this.__v&&(t&&this._sb.push(t),x(this))},S.prototype.forceUpdate=function(e){this.__v&&(this.__e=!0,e&&this.__h.push(e),x(this))},S.prototype.render=b,a=[],c="function"==typeof Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,R.__r=0,u=0},38636:(e,t,n)=>{"use strict";n.d(t,{f:()=>ae,rx:()=>d});var r=n(17920),i=n(6400);n(11720);const s=[],o={code:"en",week:{dow:0,doy:4},direction:"ltr",buttonText:{prev:"prev",next:"next",prevYear:"prev year",nextYear:"next year",year:"year",today:"today",month:"month",week:"week",day:"day",list:"list"},weekText:"W",weekTextLong:"Week",closeHint:"Close",timeHint:"Time",eventHint:"Event",allDayText:"all-day",moreLinkText:"more",noEventsText:"No events to display"},a=Object.assign(Object.assign({},o),{buttonHints:{prev:"Previous $0",next:"Next $0",today:(e,t)=>"day"===t?"Today":`This ${e}`},viewHint:"$0 view",navLinkHint:"Go to $0",moreLinkHint:e=>`Show ${e} more event${1===e?"":"s"}`});function l(e){let t=e.length>0?e[0].code:"en",n=s.concat(e),r={en:a};for(let i of n)r[i.code]=i;return{map:r,defaultCode:t}}function c(e,t){return"object"!=typeof e||Array.isArray(e)?function(e,t){let n=[].concat(e||[]),r=function(e,t){for(let n=0;n<e.length;n+=1){let r=e[n].toLocaleLowerCase().split("-");for(let e=r.length;e>0;e-=1){let n=r.slice(0,e).join("-");if(t[n])return t[n]}}return null}(n,t)||a;return u(e,n,r)}(e,t):u(e.code,[e.code],e)}function u(e,t,n){let i=(0,r.m)([o,n],["buttonText"]);delete i.code;let{week:s}=i;return delete i.week,{codeArg:e,codes:t,week:s,simpleNumberFormat:new Intl.NumberFormat(e),options:i}}function d(e){return{id:(0,r.g)(),name:e.name,premiumReleaseDate:e.premiumReleaseDate?new Date(e.premiumReleaseDate):void 0,deps:e.deps||[],reducers:e.reducers||[],isLoadingFuncs:e.isLoadingFuncs||[],contextInit:[].concat(e.contextInit||[]),eventRefiners:e.eventRefiners||{},eventDefMemberAdders:e.eventDefMemberAdders||[],eventSourceRefiners:e.eventSourceRefiners||{},isDraggableTransformers:e.isDraggableTransformers||[],eventDragMutationMassagers:e.eventDragMutationMassagers||[],eventDefMutationAppliers:e.eventDefMutationAppliers||[],dateSelectionTransformers:e.dateSelectionTransformers||[],datePointTransforms:e.datePointTransforms||[],dateSpanTransforms:e.dateSpanTransforms||[],views:e.views||{},viewPropsTransformers:e.viewPropsTransformers||[],isPropsValid:e.isPropsValid||null,externalDefTransforms:e.externalDefTransforms||[],viewContainerAppends:e.viewContainerAppends||[],eventDropTransformers:e.eventDropTransformers||[],componentInteractions:e.componentInteractions||[],calendarInteractions:e.calendarInteractions||[],themeClasses:e.themeClasses||{},eventSourceDefs:e.eventSourceDefs||[],cmdFormatter:e.cmdFormatter,recurringTypes:e.recurringTypes||[],namedTimeZonedImpl:e.namedTimeZonedImpl,initialView:e.initialView||"",elementDraggingImpl:e.elementDraggingImpl,optionChangeHandlers:e.optionChangeHandlers||{},scrollGridImpl:e.scrollGridImpl||null,listenerRefiners:e.listenerRefiners||{},optionRefiners:e.optionRefiners||{},propSetHandlers:e.propSetHandlers||{}}}function h(){let e,t=[],n=[];return(i,s)=>(e&&(0,r.i)(i,t)&&(0,r.i)(s,n)||(e=function(e,t){let n={},r={premiumReleaseDate:void 0,reducers:[],isLoadingFuncs:[],contextInit:[],eventRefiners:{},eventDefMemberAdders:[],eventSourceRefiners:{},isDraggableTransformers:[],eventDragMutationMassagers:[],eventDefMutationAppliers:[],dateSelectionTransformers:[],datePointTransforms:[],dateSpanTransforms:[],views:{},viewPropsTransformers:[],isPropsValid:null,externalDefTransforms:[],viewContainerAppends:[],eventDropTransformers:[],componentInteractions:[],calendarInteractions:[],themeClasses:{},eventSourceDefs:[],cmdFormatter:null,recurringTypes:[],namedTimeZonedImpl:null,initialView:"",elementDraggingImpl:null,optionChangeHandlers:{},scrollGridImpl:null,listenerRefiners:{},optionRefiners:{},propSetHandlers:{}};function i(e){for(let o of e){const e=o.name,a=n[e];void 0===a?(n[e]=o.id,i(o.deps),s=o,r={premiumReleaseDate:f((t=r).premiumReleaseDate,s.premiumReleaseDate),reducers:t.reducers.concat(s.reducers),isLoadingFuncs:t.isLoadingFuncs.concat(s.isLoadingFuncs),contextInit:t.contextInit.concat(s.contextInit),eventRefiners:Object.assign(Object.assign({},t.eventRefiners),s.eventRefiners),eventDefMemberAdders:t.eventDefMemberAdders.concat(s.eventDefMemberAdders),eventSourceRefiners:Object.assign(Object.assign({},t.eventSourceRefiners),s.eventSourceRefiners),isDraggableTransformers:t.isDraggableTransformers.concat(s.isDraggableTransformers),eventDragMutationMassagers:t.eventDragMutationMassagers.concat(s.eventDragMutationMassagers),eventDefMutationAppliers:t.eventDefMutationAppliers.concat(s.eventDefMutationAppliers),dateSelectionTransformers:t.dateSelectionTransformers.concat(s.dateSelectionTransformers),datePointTransforms:t.datePointTransforms.concat(s.datePointTransforms),dateSpanTransforms:t.dateSpanTransforms.concat(s.dateSpanTransforms),views:Object.assign(Object.assign({},t.views),s.views),viewPropsTransformers:t.viewPropsTransformers.concat(s.viewPropsTransformers),isPropsValid:s.isPropsValid||t.isPropsValid,externalDefTransforms:t.externalDefTransforms.concat(s.externalDefTransforms),viewContainerAppends:t.viewContainerAppends.concat(s.viewContainerAppends),eventDropTransformers:t.eventDropTransformers.concat(s.eventDropTransformers),calendarInteractions:t.calendarInteractions.concat(s.calendarInteractions),componentInteractions:t.componentInteractions.concat(s.componentInteractions),themeClasses:Object.assign(Object.assign({},t.themeClasses),s.themeClasses),eventSourceDefs:t.eventSourceDefs.concat(s.eventSourceDefs),cmdFormatter:s.cmdFormatter||t.cmdFormatter,recurringTypes:t.recurringTypes.concat(s.recurringTypes),namedTimeZonedImpl:s.namedTimeZonedImpl||t.namedTimeZonedImpl,initialView:t.initialView||s.initialView,elementDraggingImpl:t.elementDraggingImpl||s.elementDraggingImpl,optionChangeHandlers:Object.assign(Object.assign({},t.optionChangeHandlers),s.optionChangeHandlers),scrollGridImpl:s.scrollGridImpl||t.scrollGridImpl,listenerRefiners:Object.assign(Object.assign({},t.listenerRefiners),s.listenerRefiners),optionRefiners:Object.assign(Object.assign({},t.optionRefiners),s.optionRefiners),propSetHandlers:Object.assign(Object.assign({},t.propSetHandlers),s.propSetHandlers)}):a!==o.id&&console.warn(`Duplicate plugin '${e}'`)}var t,s}return e&&i(e),i(t),r}(i,s)),t=i,n=s,e)}function f(e,t){return void 0===e?t:void 0===t?e:new Date(Math.max(e.valueOf(),t.valueOf()))}class p extends r.T{}function g(e,t,n,r){if(t[e])return t[e];let i=function(e,t,n,r){let i=n[e],s=r[e],o=e=>i&&null!==i[e]?i[e]:s&&null!==s[e]?s[e]:null,a=o("component"),l=o("superType"),c=null;if(l){if(l===e)throw new Error("Can't have a custom view type that references itself");c=g(l,t,n,r)}!a&&c&&(a=c.component);if(!a)return null;return{type:e,component:a,defaults:Object.assign(Object.assign({},c?c.defaults:{}),i?i.rawOptions:{}),overrides:Object.assign(Object.assign({},c?c.overrides:{}),s?s.rawOptions:{})}}(e,t,n,r);return i&&(t[e]=i),i}function m(e){return(0,r.a)(e,v)}function v(e){let t="function"==typeof e?{component:e}:e,{component:n}=t;return t.content?n=y(t):!n||n.prototype instanceof r.B||(n=y(Object.assign(Object.assign({},t),{content:n}))),{superType:t.type,component:n,rawOptions:t}}function y(e){return t=>(0,i.az)(r.V.Consumer,null,(n=>(0,i.az)(r.C,{elTag:"div",elClasses:(0,r.b)(n.viewSpec),renderProps:Object.assign(Object.assign({},t),{nextDayThreshold:n.options.nextDayThreshold}),generatorName:void 0,customGenerator:e.content,classNameGenerator:e.classNames,didMount:e.didMount,willUnmount:e.willUnmount})))}function b(e,t,n,i){let s=m(e),o=m(t.views),a=function(e,t){let n,r={};for(n in e)g(n,r,e,t);for(n in t)g(n,r,e,t);return r}(s,o);return(0,r.a)(a,(e=>function(e,t,n,i,s){let o=e.overrides.duration||e.defaults.duration||i.duration||n.duration,a=null,l="",c="",u={};if(o&&(a=function(e){let t=JSON.stringify(e),n=D[t];void 0===n&&(n=(0,r.d)(e),D[t]=n);return n}(o),a)){let e=(0,r.c)(a);l=e.unit,1===e.value&&(c=l,u=t[l]?t[l].rawOptions:{})}let d=t=>{let n=t.buttonText||{},r=e.defaults.buttonTextKey;return null!=r&&null!=n[r]?n[r]:null!=n[e.type]?n[e.type]:null!=n[c]?n[c]:null},h=t=>{let n=t.buttonHints||{},r=e.defaults.buttonTextKey;return null!=r&&null!=n[r]?n[r]:null!=n[e.type]?n[e.type]:null!=n[c]?n[c]:null};return{type:e.type,component:e.component,duration:a,durationUnit:l,singleUnit:c,optionDefaults:e.defaults,optionOverrides:Object.assign(Object.assign({},u),e.overrides),buttonTextOverride:d(i)||d(n)||e.overrides.buttonText,buttonTextDefault:d(s)||e.defaults.buttonText||d(r.e)||e.type,buttonTitleOverride:h(i)||h(n)||e.overrides.buttonHint,buttonTitleDefault:h(s)||e.defaults.buttonHint||h(r.e)}}(e,o,t,n,i)))}p.prototype.classes={root:"fc-theme-standard",tableCellShaded:"fc-cell-shaded",buttonGroup:"fc-button-group",button:"fc-button fc-button-primary",buttonActive:"fc-button-active"},p.prototype.baseIconClass="fc-icon",p.prototype.iconClasses={close:"fc-icon-x",prev:"fc-icon-chevron-left",next:"fc-icon-chevron-right",prevYear:"fc-icon-chevrons-left",nextYear:"fc-icon-chevrons-right"},p.prototype.rtlIconClasses={prev:"fc-icon-chevron-right",next:"fc-icon-chevron-left",prevYear:"fc-icon-chevrons-right",nextYear:"fc-icon-chevrons-left"},p.prototype.iconOverrideOption="buttonIcons",p.prototype.iconOverrideCustomButtonOption="icon",p.prototype.iconOverridePrefix="fc-icon-";let D={};function A(e,t,n){let i=t?t.activeRange:null;return S({},function(e,t){let n=(0,r.j)(t),i=[].concat(e.eventSources||[]),s=[];e.initialEvents&&i.unshift(e.initialEvents);e.events&&i.unshift(e.events);for(let o of i){let e=(0,r.p)(o,t,n);e&&s.push(e)}return s}(e,n),i,n)}function E(e,t,n,i){let s=n?n.activeRange:null;switch(t.type){case"ADD_EVENT_SOURCES":return S(e,t.sources,s,i);case"REMOVE_EVENT_SOURCE":return o=e,a=t.sourceId,(0,r.h)(o,(e=>e.sourceId!==a));case"PREV":case"NEXT":case"CHANGE_DATE":case"CHANGE_VIEW_TYPE":return n?w(e,s,i):e;case"FETCH_EVENT_SOURCES":return T(e,t.sourceIds?(0,r.f)(t.sourceIds):x(e,i),s,t.isRefetch||!1,i);case"RECEIVE_EVENTS":case"RECEIVE_EVENT_ERROR":return function(e,t,n,r){let i=e[t];if(i&&n===i.latestFetchId)return Object.assign(Object.assign({},e),{[t]:Object.assign(Object.assign({},i),{isFetching:!1,fetchRange:r})});return e}(e,t.sourceId,t.fetchId,t.fetchRange);case"REMOVE_ALL_EVENT_SOURCES":return{};default:return e}var o,a}function _(e){for(let t in e)if(e[t].isFetching)return!0;return!1}function S(e,t,n,r){let i={};for(let s of t)i[s.sourceId]=s;return n&&(i=w(i,n,r)),Object.assign(Object.assign({},e),i)}function w(e,t,n){return T(e,(0,r.h)(e,(e=>function(e,t,n){if(!R(e,n))return!e.latestFetchId;return!n.options.lazyFetching||!e.fetchRange||e.isFetching||t.start<e.fetchRange.start||t.end>e.fetchRange.end}(e,t,n))),t,!1,n)}function T(e,t,n,r,i){let s={};for(let o in e){let a=e[o];t[o]?s[o]=C(a,n,r,i):s[o]=a}return s}function C(e,t,n,i){let{options:s,calendarApi:o}=i,a=i.pluginHooks.eventSourceDefs[e.sourceDefId],l=(0,r.g)();return a.fetch({eventSource:e,range:t,isRefetch:n,context:i},(n=>{let{rawEvents:r}=n;s.eventSourceSuccess&&(r=s.eventSourceSuccess.call(o,r,n.response)||r),e.success&&(r=e.success.call(o,r,n.response)||r),i.dispatch({type:"RECEIVE_EVENTS",sourceId:e.sourceId,fetchId:l,fetchRange:t,rawEvents:r})}),(n=>{let r=!1;s.eventSourceFailure&&(s.eventSourceFailure.call(o,n),r=!0),e.failure&&(e.failure(n),r=!0),r||console.warn(n.message,n),i.dispatch({type:"RECEIVE_EVENT_ERROR",sourceId:e.sourceId,fetchId:l,fetchRange:t,error:n})})),Object.assign(Object.assign({},e),{isFetching:!0,latestFetchId:l})}function x(e,t){return(0,r.h)(e,(e=>R(e,t)))}function R(e,t){return!t.pluginHooks.eventSourceDefs[e.sourceDefId].ignoreRange}function O(e,t){switch(t.type){case"UNSELECT_DATES":return null;case"SELECT_DATES":return t.selection;default:return e}}function k(e,t){switch(t.type){case"UNSELECT_EVENT":return"";case"SELECT_EVENT":return t.eventInstanceId;default:return e}}function M(e,t){let n;switch(t.type){case"UNSET_EVENT_DRAG":return null;case"SET_EVENT_DRAG":return n=t.state,{affectedEvents:n.affectedEvents,mutatedEvents:n.mutatedEvents,isEvent:n.isEvent};default:return e}}function I(e,t){let n;switch(t.type){case"UNSET_EVENT_RESIZE":return null;case"SET_EVENT_RESIZE":return n=t.state,{affectedEvents:n.affectedEvents,mutatedEvents:n.mutatedEvents,isEvent:n.isEvent};default:return e}}function z(e,t,n,r,i){return{header:e.headerToolbar?N(e.headerToolbar,e,t,n,r,i):null,footer:e.footerToolbar?N(e.footerToolbar,e,t,n,r,i):null}}function N(e,t,n,r,i,s){let o={},a=[],l=!1;for(let c in e){let u=P(e[c],t,n,r,i,s);o[c]=u.widgets,a.push(...u.viewsWithButtons),l=l||u.hasTitle}return{sectionWidgets:o,viewsWithButtons:a,hasTitle:l}}function P(e,t,n,i,s,o){let a="rtl"===t.direction,l=t.customButtons||{},c=n.buttonText||{},u=t.buttonText||{},d=n.buttonHints||{},h=t.buttonHints||{},f=e?e.split(" "):[],p=[],g=!1;return{widgets:f.map((e=>e.split(",").map((e=>{if("title"===e)return g=!0,{buttonName:e};let n,f,m,v,y,b;if(n=l[e])m=e=>{n.click&&n.click.call(e.target,e,e.target)},(v=i.getCustomButtonIconClass(n))||(v=i.getIconClass(e,a))||(y=n.text),b=n.hint||n.text;else if(f=s[e]){p.push(e),m=()=>{o.changeView(e)},(y=f.buttonTextOverride)||(v=i.getIconClass(e,a))||(y=f.buttonTextDefault);let n=f.buttonTextOverride||f.buttonTextDefault;b=(0,r.k)(f.buttonTitleOverride||f.buttonTitleDefault||t.viewHint,[n,e],n)}else if(o[e])if(m=()=>{o[e]()},(y=c[e])||(v=i.getIconClass(e,a))||(y=u[e]),"prevYear"===e||"nextYear"===e){let t="prevYear"===e?"prev":"next";b=(0,r.k)(d[t]||h[t],[u.year||"year","year"],u[e])}else b=t=>(0,r.k)(d[e]||h[e],[u[t]||t,t],u[e]);return{buttonName:e,buttonClick:m,buttonIcon:v,buttonText:y,buttonHint:b}})))),viewsWithButtons:p,hasTitle:g}}class Y{constructor(e,t,n){this.type=e,this.getCurrentData=t,this.dateEnv=n}get calendar(){return this.getCurrentData().calendarApi}get title(){return this.getCurrentData().viewTitle}get activeStart(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.start)}get activeEnd(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.end)}get currentStart(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.start)}get currentEnd(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.end)}getOption(e){return this.getCurrentData().options[e]}}function B(e,t){let n=(0,r.v)(t.getCurrentData().eventSources);if(1===n.length&&1===e.length&&Array.isArray(n[0]._raw)&&Array.isArray(e[0]))return void t.dispatch({type:"RESET_RAW_EVENTS",sourceId:n[0].sourceId,rawEvents:e[0]});let i=[];for(let r of e){let e=!1;for(let t=0;t<n.length;t+=1)if(n[t]._raw===r){n.splice(t,1),e=!0;break}e||i.push(r)}for(let r of n)t.dispatch({type:"REMOVE_EVENT_SOURCE",sourceId:r.sourceId});for(let r of i)t.calendarApi.addEventSource(r)}const H=[d({name:"array-event-source",eventSourceDefs:[{ignoreRange:!0,parseMeta:e=>Array.isArray(e.events)?e.events:null,fetch(e,t){t({rawEvents:e.eventSource.meta})}}]}),d({name:"func-event-source",eventSourceDefs:[{parseMeta:e=>"function"==typeof e.events?e.events:null,fetch(e,t,n){const{dateEnv:i}=e.context,s=e.eventSource.meta;(0,r.u)(s.bind(null,(0,r.l)(e.range,i)),(e=>t({rawEvents:e})),n)}}]}),d({name:"json-event-source",eventSourceRefiners:{method:String,extraParams:r.n,startParam:String,endParam:String,timeZoneParam:String},eventSourceDefs:[{parseMeta:e=>!e.url||"json"!==e.format&&e.format?null:{url:e.url,format:"json",method:(e.method||"GET").toUpperCase(),extraParams:e.extraParams,startParam:e.startParam,endParam:e.endParam,timeZoneParam:e.timeZoneParam},fetch(e,t,n){const{meta:i}=e.eventSource,s=function(e,t,n){let r,i,s,o,{dateEnv:a,options:l}=n,c={};r=e.startParam,null==r&&(r=l.startParam);i=e.endParam,null==i&&(i=l.endParam);s=e.timeZoneParam,null==s&&(s=l.timeZoneParam);o="function"==typeof e.extraParams?e.extraParams():e.extraParams||{};Object.assign(c,o),c[r]=a.formatIso(t.start),c[i]=a.formatIso(t.end),"local"!==a.timeZone&&(c[s]=a.timeZone);return c}(i,e.range,e.context);(0,r.r)(i.method,i.url,s).then((([e,n])=>{t({rawEvents:e,response:n})}),n)}}]}),d({name:"simple-recurring-event",recurringTypes:[{parse(e,t){if(e.daysOfWeek||e.startTime||e.endTime||e.startRecur||e.endRecur){let n,i={daysOfWeek:e.daysOfWeek||null,startTime:e.startTime||null,endTime:e.endTime||null,startRecur:e.startRecur?t.createMarker(e.startRecur):null,endRecur:e.endRecur?t.createMarker(e.endRecur):null};return e.duration&&(n=e.duration),!n&&e.startTime&&e.endTime&&(n=(0,r.s)(e.endTime,e.startTime)),{allDayGuess:Boolean(!e.startTime&&!e.endTime),duration:n,typeData:i}}return null},expand(e,t,n){let i=(0,r.o)(t,{start:e.startRecur,end:e.endRecur});return i?function(e,t,n,i){let s=e?(0,r.f)(e):null,o=(0,r.q)(n.start),a=n.end,l=[];for(;o<a;){let e;s&&!s[o.getUTCDay()]||(e=t?i.add(o,t):o,l.push(e)),o=(0,r.t)(o,1)}return l}(e.daysOfWeek,e.startTime,i,n):[]}}],eventRefiners:{daysOfWeek:r.n,startTime:r.d,endTime:r.d,duration:r.d,startRecur:r.n,endRecur:r.n}}),d({name:"change-handler",optionChangeHandlers:{events(e,t){B([e],t)},eventSources:B}}),d({name:"misc",isLoadingFuncs:[e=>_(e.eventSources)],propSetHandlers:{dateProfile:function(e,t){t.emitter.trigger("datesSet",Object.assign(Object.assign({},(0,r.l)(e.activeRange,t.dateEnv)),{view:t.viewApi}))},eventStore:function(e,t){let{emitter:n}=t;n.hasHandlers("eventsSet")&&n.trigger("eventsSet",(0,r.w)(e,t))}}})];class j{constructor(e,t){this.runTaskOption=e,this.drainedOption=t,this.queue=[],this.delayedRunner=new r.D(this.drain.bind(this))}request(e,t){this.queue.push(e),this.delayedRunner.request(t)}pause(e){this.delayedRunner.pause(e)}resume(e,t){this.delayedRunner.resume(e,t)}drain(){let{queue:e}=this;for(;e.length;){let t,n=[];for(;t=e.shift();)this.runTask(t),n.push(t);this.drained(n)}}runTask(e){this.runTaskOption&&this.runTaskOption(e)}drained(e){this.drainedOption&&this.drainedOption(e)}}function U(e,t,n){let i;return i=/^(year|month)$/.test(e.currentRangeUnit)?e.currentRange:e.activeRange,n.formatRange(i.start,i.end,(0,r.x)(t.titleFormat||function(e){let{currentRangeUnit:t}=e;if("year"===t)return{year:"numeric"};if("month"===t)return{year:"numeric",month:"long"};let n=(0,r.y)(e.currentRange.start,e.currentRange.end);if(null!==n&&n>1)return{year:"numeric",month:"short",day:"numeric"};return{year:"numeric",month:"long",day:"numeric"}}(e)),{isEndExclusive:e.isRangeAllDay,defaultSeparator:t.titleRangeSeparator})}class L{constructor(e){this.computeCurrentViewData=(0,r.z)(this._computeCurrentViewData),this.organizeRawLocales=(0,r.z)(l),this.buildLocale=(0,r.z)(c),this.buildPluginHooks=h(),this.buildDateEnv=(0,r.z)(V),this.buildTheme=(0,r.z)(W),this.parseToolbars=(0,r.z)(z),this.buildViewSpecs=(0,r.z)(b),this.buildDateProfileGenerator=(0,r.A)(F),this.buildViewApi=(0,r.z)(G),this.buildViewUiProps=(0,r.A)(Z),this.buildEventUiBySource=(0,r.z)(q,r.E),this.buildEventUiBases=(0,r.z)(Q),this.parseContextBusinessHours=(0,r.A)(J),this.buildTitle=(0,r.z)(U),this.emitter=new r.F,this.actionRunner=new j(this._handleAction.bind(this),this.updateData.bind(this)),this.currentCalendarOptionsInput={},this.currentCalendarOptionsRefined={},this.currentViewOptionsInput={},this.currentViewOptionsRefined={},this.currentCalendarOptionsRefiners={},this.optionsForRefining=[],this.optionsForHandling=[],this.getCurrentData=()=>this.data,this.dispatch=e=>{this.actionRunner.request(e)},this.props=e,this.actionRunner.pause();let t={},n=this.computeOptionsData(e.optionOverrides,t,e.calendarApi),i=n.calendarOptions.initialView||n.pluginHooks.initialView,s=this.computeCurrentViewData(i,n,e.optionOverrides,t);e.calendarApi.currentDataManager=this,this.emitter.setThisContext(e.calendarApi),this.emitter.setOptions(s.options);let o=(0,r.G)(n.calendarOptions,n.dateEnv),a=s.dateProfileGenerator.build(o);(0,r.H)(a.activeRange,o)||(o=a.currentRange.start);let u={dateEnv:n.dateEnv,options:n.calendarOptions,pluginHooks:n.pluginHooks,calendarApi:e.calendarApi,dispatch:this.dispatch,emitter:this.emitter,getCurrentData:this.getCurrentData};for(let r of n.pluginHooks.contextInit)r(u);let d=A(n.calendarOptions,a,u),f={dynamicOptionOverrides:t,currentViewType:i,currentDate:o,dateProfile:a,businessHours:this.parseContextBusinessHours(u),eventSources:d,eventUiBases:{},eventStore:(0,r.I)(),renderableEventStore:(0,r.I)(),dateSelection:null,eventSelection:"",eventDrag:null,eventResize:null,selectionConfig:this.buildViewUiProps(u).selectionConfig},p=Object.assign(Object.assign({},u),f);for(let r of n.pluginHooks.reducers)Object.assign(f,r(null,null,p));X(f,u)&&this.emitter.trigger("loading",!0),this.state=f,this.updateData(),this.actionRunner.resume()}resetOptions(e,t){let{props:n}=this;void 0===t?n.optionOverrides=e:(n.optionOverrides=Object.assign(Object.assign({},n.optionOverrides||{}),e),this.optionsForRefining.push(...t)),(void 0===t||t.length)&&this.actionRunner.request({type:"NOTHING"})}_handleAction(e){let{props:t,state:n,emitter:i}=this,s=function(e,t){return"SET_OPTION"===t.type?Object.assign(Object.assign({},e),{[t.optionName]:t.rawOptionValue}):e}(n.dynamicOptionOverrides,e),o=this.computeOptionsData(t.optionOverrides,s,t.calendarApi),a=function(e,t){"CHANGE_VIEW_TYPE"===t.type&&(e=t.viewType);return e}(n.currentViewType,e),l=this.computeCurrentViewData(a,o,t.optionOverrides,s);t.calendarApi.currentDataManager=this,i.setThisContext(t.calendarApi),i.setOptions(l.options);let c={dateEnv:o.dateEnv,options:o.calendarOptions,pluginHooks:o.pluginHooks,calendarApi:t.calendarApi,dispatch:this.dispatch,emitter:i,getCurrentData:this.getCurrentData},{currentDate:u,dateProfile:d}=n;this.data&&this.data.dateProfileGenerator!==l.dateProfileGenerator&&(d=l.dateProfileGenerator.build(u)),u=(0,r.J)(u,e),d=function(e,t,n,r){let i;switch(t.type){case"CHANGE_VIEW_TYPE":return r.build(t.dateMarker||n);case"CHANGE_DATE":return r.build(t.dateMarker);case"PREV":if(i=r.buildPrev(e,n),i.isValid)return i;break;case"NEXT":if(i=r.buildNext(e,n),i.isValid)return i}return e}(d,e,u,l.dateProfileGenerator),"PREV"!==e.type&&"NEXT"!==e.type&&(0,r.H)(d.currentRange,u)||(u=d.currentRange.start);let h=E(n.eventSources,e,d,c),f=(0,r.K)(n.eventStore,e,h,d,c),p=_(h)&&!l.options.progressiveEventRendering&&n.renderableEventStore||f,{eventUiSingleBase:g,selectionConfig:m}=this.buildViewUiProps(c),v=this.buildEventUiBySource(h),y={dynamicOptionOverrides:s,currentViewType:a,currentDate:u,dateProfile:d,eventSources:h,eventStore:f,renderableEventStore:p,selectionConfig:m,eventUiBases:this.buildEventUiBases(p.defs,g,v),businessHours:this.parseContextBusinessHours(c),dateSelection:O(n.dateSelection,e),eventSelection:k(n.eventSelection,e),eventDrag:M(n.eventDrag,e),eventResize:I(n.eventResize,e)},b=Object.assign(Object.assign({},c),y);for(let r of o.pluginHooks.reducers)Object.assign(y,r(n,e,b));let D=X(n,c),A=X(y,c);!D&&A?i.trigger("loading",!0):D&&!A&&i.trigger("loading",!1),this.state=y,t.onAction&&t.onAction(e)}updateData(){let{props:e,state:t}=this,n=this.data,i=this.computeOptionsData(e.optionOverrides,t.dynamicOptionOverrides,e.calendarApi),s=this.computeCurrentViewData(t.currentViewType,i,e.optionOverrides,t.dynamicOptionOverrides),o=this.data=Object.assign(Object.assign(Object.assign({viewTitle:this.buildTitle(t.dateProfile,s.options,i.dateEnv),calendarApi:e.calendarApi,dispatch:this.dispatch,emitter:this.emitter,getCurrentData:this.getCurrentData},i),s),t),a=i.pluginHooks.optionChangeHandlers,l=n&&n.calendarOptions,c=i.calendarOptions;if(l&&l!==c){l.timeZone!==c.timeZone&&(t.eventSources=o.eventSources=function(e,t,n){let r=t?t.activeRange:null;return T(e,x(e,n),r,!0,n)}(o.eventSources,t.dateProfile,o),t.eventStore=o.eventStore=(0,r.L)(o.eventStore,n.dateEnv,o.dateEnv),t.renderableEventStore=o.renderableEventStore=(0,r.L)(o.renderableEventStore,n.dateEnv,o.dateEnv));for(let e in a)-1===this.optionsForHandling.indexOf(e)&&l[e]===c[e]||a[e](c[e],o)}this.optionsForHandling=[],e.onData&&e.onData(o)}computeOptionsData(e,t,n){if(!this.optionsForRefining.length&&e===this.stableOptionOverrides&&t===this.stableDynamicOptionOverrides)return this.stableCalendarOptionsData;let{refinedOptions:r,pluginHooks:i,localeDefaults:s,availableLocaleData:o,extra:a}=this.processRawCalendarOptions(e,t);K(a);let l=this.buildDateEnv(r.timeZone,r.locale,r.weekNumberCalculation,r.firstDay,r.weekText,i,o,r.defaultRangeSeparator),c=this.buildViewSpecs(i.views,this.stableOptionOverrides,this.stableDynamicOptionOverrides,s),u=this.buildTheme(r,i),d=this.parseToolbars(r,this.stableOptionOverrides,u,c,n);return this.stableCalendarOptionsData={calendarOptions:r,pluginHooks:i,dateEnv:l,viewSpecs:c,theme:u,toolbarConfig:d,localeDefaults:s,availableRawLocales:o.map}}processRawCalendarOptions(e,t){let{locales:n,locale:i}=(0,r.M)([r.e,e,t]),s=this.organizeRawLocales(n),o=s.map,a=this.buildLocale(i||s.defaultCode,o).options,l=this.buildPluginHooks(e.plugins||[],H),c=this.currentCalendarOptionsRefiners=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},r.N),r.O),r.P),l.listenerRefiners),l.optionRefiners),u={},d=(0,r.M)([r.e,a,e,t]),h={},f=this.currentCalendarOptionsInput,p=this.currentCalendarOptionsRefined,g=!1;for(let m in d)-1===this.optionsForRefining.indexOf(m)&&(d[m]===f[m]||r.Q[m]&&m in f&&r.Q[m](f[m],d[m]))?h[m]=p[m]:c[m]?(h[m]=c[m](d[m]),g=!0):u[m]=f[m];return g&&(this.currentCalendarOptionsInput=d,this.currentCalendarOptionsRefined=h,this.stableOptionOverrides=e,this.stableDynamicOptionOverrides=t),this.optionsForHandling.push(...this.optionsForRefining),this.optionsForRefining=[],{rawOptions:this.currentCalendarOptionsInput,refinedOptions:this.currentCalendarOptionsRefined,pluginHooks:l,availableLocaleData:s,localeDefaults:a,extra:u}}_computeCurrentViewData(e,t,n,r){let i=t.viewSpecs[e];if(!i)throw new Error(`viewType "${e}" is not available. Please make sure you've loaded all neccessary plugins`);let{refinedOptions:s,extra:o}=this.processRawViewOptions(i,t.pluginHooks,t.localeDefaults,n,r);return K(o),{viewSpec:i,options:s,dateProfileGenerator:this.buildDateProfileGenerator({dateProfileGeneratorClass:i.optionDefaults.dateProfileGeneratorClass,duration:i.duration,durationUnit:i.durationUnit,usesMinMaxTime:i.optionDefaults.usesMinMaxTime,dateEnv:t.dateEnv,calendarApi:this.props.calendarApi,slotMinTime:s.slotMinTime,slotMaxTime:s.slotMaxTime,showNonCurrentDates:s.showNonCurrentDates,dayCount:s.dayCount,dateAlignment:s.dateAlignment,dateIncrement:s.dateIncrement,hiddenDays:s.hiddenDays,weekends:s.weekends,nowInput:s.now,validRangeInput:s.validRange,visibleRangeInput:s.visibleRange,fixedWeekCount:s.fixedWeekCount}),viewApi:this.buildViewApi(e,this.getCurrentData,t.dateEnv)}}processRawViewOptions(e,t,n,i,s){let o=(0,r.M)([r.e,e.optionDefaults,n,i,e.optionOverrides,s]),a=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},r.N),r.O),r.P),r.R),t.listenerRefiners),t.optionRefiners),l={},c=this.currentViewOptionsInput,u=this.currentViewOptionsRefined,d=!1,h={};for(let f in o)o[f]===c[f]||r.Q[f]&&r.Q[f](o[f],c[f])?l[f]=u[f]:(o[f]===this.currentCalendarOptionsInput[f]||r.Q[f]&&r.Q[f](o[f],this.currentCalendarOptionsInput[f])?f in this.currentCalendarOptionsRefined&&(l[f]=this.currentCalendarOptionsRefined[f]):a[f]?l[f]=a[f](o[f]):h[f]=o[f],d=!0);return d&&(this.currentViewOptionsInput=o,this.currentViewOptionsRefined=l),{rawOptions:this.currentViewOptionsInput,refinedOptions:this.currentViewOptionsRefined,extra:h}}}function V(e,t,n,i,s,o,a,l){let u=c(t||a.defaultCode,a.map);return new r.S({calendarSystem:"gregory",timeZone:e,namedTimeZoneImpl:o.namedTimeZonedImpl,locale:u,weekNumberCalculation:n,firstDay:i,weekText:s,cmdFormatter:o.cmdFormatter,defaultSeparator:l})}function W(e,t){return new(t.themeClasses[e.themeSystem]||p)(e)}function F(e){return new(e.dateProfileGeneratorClass||r.U)(e)}function G(e,t,n){return new Y(e,t,n)}function q(e){return(0,r.a)(e,(e=>e.ui))}function Q(e,t,n){let r={"":t};for(let i in e){let t=e[i];t.sourceId&&n[t.sourceId]&&(r[i]=n[t.sourceId])}return r}function Z(e){let{options:t}=e;return{eventUiSingleBase:(0,r.W)({display:t.eventDisplay,editable:t.editable,startEditable:t.eventStartEditable,durationEditable:t.eventDurationEditable,constraint:t.eventConstraint,overlap:"boolean"==typeof t.eventOverlap?t.eventOverlap:void 0,allow:t.eventAllow,backgroundColor:t.eventBackgroundColor,borderColor:t.eventBorderColor,textColor:t.eventTextColor,color:t.eventColor},e),selectionConfig:(0,r.W)({constraint:t.selectConstraint,overlap:"boolean"==typeof t.selectOverlap?t.selectOverlap:void 0,allow:t.selectAllow},e)}}function X(e,t){for(let n of t.pluginHooks.isLoadingFuncs)if(n(e))return!0;return!1}function J(e){return(0,r.X)(e.options.businessHours,e)}function K(e,t){for(let n in e)console.warn(`Unknown option '${n}'`+(t?` for view '${t}'`:""))}class $ extends r.B{render(){let e=this.props.widgetGroups.map((e=>this.renderWidgetGroup(e)));return(0,i.az)("div",{className:"fc-toolbar-chunk"},...e)}renderWidgetGroup(e){let{props:t}=this,{theme:n}=this.context,r=[],s=!0;for(let o of e){let{buttonName:e,buttonClick:a,buttonText:l,buttonIcon:c,buttonHint:u}=o;if("title"===e)s=!1,r.push((0,i.az)("h2",{className:"fc-toolbar-title",id:t.titleId},t.title));else{let s=e===t.activeButton,o=!t.isTodayEnabled&&"today"===e||!t.isPrevEnabled&&"prev"===e||!t.isNextEnabled&&"next"===e,d=[`fc-${e}-button`,n.getClass("button")];s&&d.push(n.getClass("buttonActive")),r.push((0,i.az)("button",{type:"button",title:"function"==typeof u?u(t.navUnit):u,disabled:o,"aria-pressed":s,className:d.join(" "),onClick:a},l||(c?(0,i.az)("span",{className:c}):"")))}}if(r.length>1){let e=s&&n.getClass("buttonGroup")||"";return(0,i.az)("div",{className:e},...r)}return r[0]}}class ee extends r.B{render(){let e,t,{model:n,extraClassName:r}=this.props,s=!1,o=n.sectionWidgets,a=o.center;o.left?(s=!0,e=o.left):e=o.start,o.right?(s=!0,t=o.right):t=o.end;let l=[r||"","fc-toolbar",s?"fc-toolbar-ltr":""];return(0,i.az)("div",{className:l.join(" ")},this.renderSection("start",e||[]),this.renderSection("center",a||[]),this.renderSection("end",t||[]))}renderSection(e,t){let{props:n}=this;return(0,i.az)($,{key:e,widgetGroups:t,title:n.title,navUnit:n.navUnit,activeButton:n.activeButton,isTodayEnabled:n.isTodayEnabled,isPrevEnabled:n.isPrevEnabled,isNextEnabled:n.isNextEnabled,titleId:n.titleId})}}class te extends r.B{constructor(){super(...arguments),this.state={availableWidth:null},this.handleEl=e=>{this.el=e,(0,r.Y)(this.props.elRef,e),this.updateAvailableWidth()},this.handleResize=()=>{this.updateAvailableWidth()}}render(){let{props:e,state:t}=this,{aspectRatio:n}=e,r=["fc-view-harness",n||e.liquid||e.height?"fc-view-harness-active":"fc-view-harness-passive"],s="",o="";return n?null!==t.availableWidth?s=t.availableWidth/n:o=1/n*100+"%":s=e.height||"",(0,i.az)("div",{"aria-labelledby":e.labeledById,ref:this.handleEl,className:r.join(" "),style:{height:s,paddingBottom:o}},e.children)}componentDidMount(){this.context.addResizeHandler(this.handleResize)}componentWillUnmount(){this.context.removeResizeHandler(this.handleResize)}updateAvailableWidth(){this.el&&this.props.aspectRatio&&this.setState({availableWidth:this.el.offsetWidth})}}class ne extends r.Z{constructor(e){super(e),this.handleSegClick=(e,t)=>{let{component:n}=this,{context:i}=n,s=(0,r._)(t);if(s&&n.isValidSegDownEl(e.target)){let o=(0,r.$)(e.target,".fc-event-forced-url"),a=o?o.querySelector("a[href]").href:"";i.emitter.trigger("eventClick",{el:t,event:new r.a0(n.context,s.eventRange.def,s.eventRange.instance),jsEvent:e,view:i.viewApi}),a&&!e.defaultPrevented&&(window.location.href=a)}},this.destroy=(0,r.a1)(e.el,"click",".fc-event",this.handleSegClick)}}class re extends r.Z{constructor(e){super(e),this.handleEventElRemove=e=>{e===this.currentSegEl&&this.handleSegLeave(null,this.currentSegEl)},this.handleSegEnter=(e,t)=>{(0,r._)(t)&&(this.currentSegEl=t,this.triggerEvent("eventMouseEnter",e,t))},this.handleSegLeave=(e,t)=>{this.currentSegEl&&(this.currentSegEl=null,this.triggerEvent("eventMouseLeave",e,t))},this.removeHoverListeners=(0,r.a2)(e.el,".fc-event",this.handleSegEnter,this.handleSegLeave)}destroy(){this.removeHoverListeners()}triggerEvent(e,t,n){let{component:i}=this,{context:s}=i,o=(0,r._)(n);t&&!i.isValidSegDownEl(t.target)||s.emitter.trigger(e,{el:n,event:new r.a0(s,o.eventRange.def,o.eventRange.instance),jsEvent:t,view:s.viewApi})}}class ie extends r.a3{constructor(){super(...arguments),this.buildViewContext=(0,r.z)(r.a4),this.buildViewPropTransformers=(0,r.z)(oe),this.buildToolbarProps=(0,r.z)(se),this.headerRef=(0,i.Vf)(),this.footerRef=(0,i.Vf)(),this.interactionsStore={},this.state={viewLabelId:(0,r.a5)()},this.registerInteractiveComponent=(e,t)=>{let n=(0,r.a6)(e,t),i=[ne,re].concat(this.props.pluginHooks.componentInteractions).map((e=>new e(n)));this.interactionsStore[e.uid]=i,r.a7[e.uid]=n},this.unregisterInteractiveComponent=e=>{let t=this.interactionsStore[e.uid];if(t){for(let e of t)e.destroy();delete this.interactionsStore[e.uid]}delete r.a7[e.uid]},this.resizeRunner=new r.D((()=>{this.props.emitter.trigger("_resize",!0),this.props.emitter.trigger("windowResize",{view:this.props.viewApi})})),this.handleWindowResize=e=>{let{options:t}=this.props;t.handleWindowResize&&e.target===window&&this.resizeRunner.request(t.windowResizeDelay)}}render(){let e,{props:t}=this,{toolbarConfig:n,options:s}=t,o=this.buildToolbarProps(t.viewSpec,t.dateProfile,t.dateProfileGenerator,t.currentDate,(0,r.a8)(t.options.now,t.dateEnv),t.viewTitle),a=!1,l="";t.isHeightAuto||t.forPrint?l="":null!=s.height?a=!0:null!=s.contentHeight?l=s.contentHeight:e=Math.max(s.aspectRatio,.5);let c=this.buildViewContext(t.viewSpec,t.viewApi,t.options,t.dateProfileGenerator,t.dateEnv,t.theme,t.pluginHooks,t.dispatch,t.getCurrentData,t.emitter,t.calendarApi,this.registerInteractiveComponent,this.unregisterInteractiveComponent),u=n.header&&n.header.hasTitle?this.state.viewLabelId:"";return(0,i.az)(r.V.Provider,{value:c},n.header&&(0,i.az)(ee,Object.assign({ref:this.headerRef,extraClassName:"fc-header-toolbar",model:n.header,titleId:u},o)),(0,i.az)(te,{liquid:a,height:l,aspectRatio:e,labeledById:u},this.renderView(t),this.buildAppendContent()),n.footer&&(0,i.az)(ee,Object.assign({ref:this.footerRef,extraClassName:"fc-footer-toolbar",model:n.footer,titleId:""},o)))}componentDidMount(){let{props:e}=this;this.calendarInteractions=e.pluginHooks.calendarInteractions.map((t=>new t(e))),window.addEventListener("resize",this.handleWindowResize);let{propSetHandlers:t}=e.pluginHooks;for(let n in t)t[n](e[n],e)}componentDidUpdate(e){let{props:t}=this,{propSetHandlers:n}=t.pluginHooks;for(let r in n)t[r]!==e[r]&&n[r](t[r],t)}componentWillUnmount(){window.removeEventListener("resize",this.handleWindowResize),this.resizeRunner.clear();for(let e of this.calendarInteractions)e.destroy();this.props.emitter.trigger("_unmount")}buildAppendContent(){let{props:e}=this,t=e.pluginHooks.viewContainerAppends.map((t=>t(e)));return(0,i.az)(i.HY,{},...t)}renderView(e){let{pluginHooks:t}=e,{viewSpec:n}=e,r={dateProfile:e.dateProfile,businessHours:e.businessHours,eventStore:e.renderableEventStore,eventUiBases:e.eventUiBases,dateSelection:e.dateSelection,eventSelection:e.eventSelection,eventDrag:e.eventDrag,eventResize:e.eventResize,isHeightAuto:e.isHeightAuto,forPrint:e.forPrint},s=this.buildViewPropTransformers(t.viewPropsTransformers);for(let i of s)Object.assign(r,i.transform(r,e));let o=n.component;return(0,i.az)(o,Object.assign({},r))}}function se(e,t,n,i,s,o){let a=n.build(s,void 0,!1),l=n.buildPrev(t,i,!1),c=n.buildNext(t,i,!1);return{title:o,activeButton:e.type,navUnit:e.singleUnit,isTodayEnabled:a.isValid&&!(0,r.H)(t.currentRange,s),isPrevEnabled:l.isValid,isNextEnabled:c.isValid}}function oe(e){return e.map((e=>new e))}class ae extends r.a9{constructor(e,t={}){super(),this.isRendering=!1,this.isRendered=!1,this.currentClassNames=[],this.customContentRenderId=0,this.handleAction=e=>{switch(e.type){case"SET_EVENT_DRAG":case"SET_EVENT_RESIZE":this.renderRunner.tryDrain()}},this.handleData=e=>{this.currentData=e,this.renderRunner.request(e.calendarOptions.rerenderDelay)},this.handleRenderRequest=()=>{if(this.isRendering){this.isRendered=!0;let{currentData:e}=this;(0,r.aa)((()=>{(0,i.sY)((0,i.az)(r.ab,{options:e.calendarOptions,theme:e.theme,emitter:e.emitter},((t,n,s,o)=>(this.setClassNames(t),this.setHeight(n),(0,i.az)(r.ac.Provider,{value:this.customContentRenderId},(0,i.az)(ie,Object.assign({isHeightAuto:s,forPrint:o},e)))))),this.el)}))}else this.isRendered&&(this.isRendered=!1,(0,i.sY)(null,this.el),this.setClassNames([]),this.setHeight(""))},(0,r.ad)(e),this.el=e,this.renderRunner=new r.D(this.handleRenderRequest),new L({optionOverrides:t,calendarApi:this,onAction:this.handleAction,onData:this.handleData})}render(){let e=this.isRendering;e?this.customContentRenderId+=1:this.isRendering=!0,this.renderRunner.request(),e&&this.updateSize()}destroy(){this.isRendering&&(this.isRendering=!1,this.renderRunner.request())}updateSize(){(0,r.aa)((()=>{super.updateSize()}))}batchRendering(e){this.renderRunner.pause("batchRendering"),e(),this.renderRunner.resume("batchRendering")}pauseRendering(){this.renderRunner.pause("pauseRendering")}resumeRendering(){this.renderRunner.resume("pauseRendering",!0)}resetOptions(e,t){this.currentDataManager.resetOptions(e,t)}setClassNames(e){if(!(0,r.i)(e,this.currentClassNames)){let{classList:t}=this.el;for(let e of this.currentClassNames)t.remove(e);for(let n of e)t.add(n);this.currentClassNames=e}}setHeight(e){(0,r.ae)(this.el,"height",e)}}},17920:(e,t,n)=>{"use strict";n.d(t,{$:()=>f,A:()=>Ie,B:()=>_n,C:()=>Ir,D:()=>ai,E:()=>se,F:()=>cn,G:()=>Cn,H:()=>qt,I:()=>dt,J:()=>Tn,K:()=>Gr,L:()=>Zr,M:()=>nt,N:()=>Qe,O:()=>Xe,P:()=>Je,Q:()=>Ke,R:()=>tt,S:()=>dr,T:()=>gn,U:()=>Rn,V:()=>Dn,W:()=>vt,X:()=>xt,Y:()=>Sn,Z:()=>br,_:()=>Vn,a:()=>ne,a0:()=>Yn,a1:()=>E,a2:()=>_,a3:()=>En,a4:()=>An,a5:()=>D,a6:()=>Dr,a7:()=>Er,a8:()=>xn,a9:()=>qi,aA:()=>kt,aE:()=>It,aF:()=>Mt,aG:()=>zt,aH:()=>Nt,aI:()=>Pt,aO:()=>h,aP:()=>m,aR:()=>y,aV:()=>ut,aY:()=>jt,aa:()=>mn,ab:()=>wr,ac:()=>Mr,ad:()=>l,ae:()=>v,ar:()=>M,as:()=>I,at:()=>z,au:()=>N,av:()=>H,aw:()=>k,ax:()=>O,b:()=>Vi,b$:()=>Di,b0:()=>Kt,b2:()=>w,b3:()=>sn,b5:()=>an,b6:()=>on,b9:()=>Gt,bA:()=>hr,bB:()=>pr,bC:()=>fr,bD:()=>yr,bE:()=>gr,bF:()=>mr,bG:()=>Ar,bH:()=>_r,bI:()=>Sr,bK:()=>jr,bO:()=>Lr,bP:()=>Un,bQ:()=>Jn,bR:()=>Gn,bS:()=>Kn,bT:()=>er,bU:()=>tr,bV:()=>Vr,bW:()=>Wr,bX:()=>In,bZ:()=>Jr,b_:()=>Kr,ba:()=>un,bb:()=>hn,bc:()=>fn,bd:()=>pn,be:()=>wn,bf:()=>ir,bg:()=>pe,bh:()=>he,bi:()=>ge,bl:()=>me,bo:()=>Q,bp:()=>G,bs:()=>X,bt:()=>J,bu:()=>Oe,bv:()=>xe,bw:()=>Ce,bx:()=>Re,c:()=>K,ca:()=>vi,cb:()=>bi,cc:()=>yi,cf:()=>ui,ch:()=>Br,cj:()=>Ei,ck:()=>Si,cl:()=>Ti,cm:()=>Ci,cn:()=>Ai,co:()=>ki,cp:()=>Ri,cq:()=>Mi,cr:()=>Pi,cs:()=>Hi,ct:()=>Li,cu:()=>On,cw:()=>a,cy:()=>Zi,d:()=>W,e:()=>Ze,f:()=>re,g:()=>R,h:()=>te,i:()=>ue,j:()=>Gi,k:()=>B,l:()=>sr,m:()=>ee,n:()=>it,o:()=>Wt,p:()=>Fi,q:()=>ye,r:()=>oi,s:()=>q,t:()=>fe,u:()=>ln,v:()=>ie,w:()=>Hn,x:()=>qe,y:()=>ve,z:()=>Me});var r=n(6400),i=n(11720);const s=[],o=new Map;function a(e){s.push(e),o.forEach((t=>{u(t,e)}))}function l(e){e.isConnected&&c(e.getRootNode())}function c(e){let t=o.get(e);if(!t||!t.isConnected){if(t=e.querySelector("style[data-fullcalendar]"),!t){t=document.createElement("style"),t.setAttribute("data-fullcalendar","");const n=function(){void 0===d&&(d=function(){const e=document.querySelector('meta[name="csp-nonce"]');if(e&&e.hasAttribute("content"))return e.getAttribute("content");const t=document.querySelector("script[nonce]");if(t)return t.nonce||"";return""}());return d}();n&&(t.nonce=n);const r=e===document?document.head:e,i=e===document?r.querySelector("script,link[rel=stylesheet],link[as=style],style"):r.firstChild;r.insertBefore(t,i)}o.set(e,t),function(e){for(const t of s)u(e,t)}(t)}}function u(e,t){const{sheet:n}=e,r=n.cssRules.length;t.split("}").forEach(((e,t)=>{(e=e.trim())&&n.insertRule(e+"}",r+t)}))}let d;"undefined"!=typeof document&&c(document);function h(e){e.parentNode&&e.parentNode.removeChild(e)}function f(e,t){if(e.closest)return e.closest(t);if(!document.documentElement.contains(e))return null;do{if(p(e,t))return e;e=e.parentElement||e.parentNode}while(null!==e&&1===e.nodeType);return null}function p(e,t){return(e.matches||e.matchesSelector||e.msMatchesSelector).call(e,t)}a(':root{--fc-small-font-size:.85em;--fc-page-bg-color:#fff;--fc-neutral-bg-color:hsla(0,0%,82%,.3);--fc-neutral-text-color:grey;--fc-border-color:#ddd;--fc-button-text-color:#fff;--fc-button-bg-color:#2c3e50;--fc-button-border-color:#2c3e50;--fc-button-hover-bg-color:#1e2b37;--fc-button-hover-border-color:#1a252f;--fc-button-active-bg-color:#1a252f;--fc-button-active-border-color:#151e27;--fc-event-bg-color:#3788d8;--fc-event-border-color:#3788d8;--fc-event-text-color:#fff;--fc-event-selected-overlay-color:rgba(0,0,0,.25);--fc-more-link-bg-color:#d0d0d0;--fc-more-link-text-color:inherit;--fc-event-resizer-thickness:8px;--fc-event-resizer-dot-total-width:8px;--fc-event-resizer-dot-border-width:1px;--fc-non-business-color:hsla(0,0%,84%,.3);--fc-bg-event-color:#8fdf82;--fc-bg-event-opacity:0.3;--fc-highlight-color:rgba(188,232,241,.3);--fc-today-bg-color:rgba(255,220,40,.15);--fc-now-indicator-color:red}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc{display:flex;flex-direction:column;font-size:1em}.fc,.fc *,.fc :after,.fc :before{box-sizing:border-box}.fc table{border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc td,.fc th{padding:0;vertical-align:top}.fc a[data-navlink]{cursor:pointer}.fc a[data-navlink]:hover{text-decoration:underline}.fc-direction-ltr{direction:ltr;text-align:left}.fc-direction-rtl{direction:rtl;text-align:right}.fc-theme-standard td,.fc-theme-standard th{border:1px solid var(--fc-border-color)}.fc-liquid-hack td,.fc-liquid-hack th{position:relative}@font-face{font-family:fcicons;font-style:normal;font-weight:400;src:url("data:application/x-font-ttf;charset=utf-8;base64,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") format("truetype")}.fc-icon{speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;font-family:fcicons!important;font-style:normal;font-variant:normal;font-weight:400;height:1em;line-height:1;text-align:center;text-transform:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:1em}.fc-icon-chevron-left:before{content:"\\e900"}.fc-icon-chevron-right:before{content:"\\e901"}.fc-icon-chevrons-left:before{content:"\\e902"}.fc-icon-chevrons-right:before{content:"\\e903"}.fc-icon-minus-square:before{content:"\\e904"}.fc-icon-plus-square:before{content:"\\e905"}.fc-icon-x:before{content:"\\e906"}.fc .fc-button{border-radius:0;font-family:inherit;font-size:inherit;line-height:inherit;margin:0;overflow:visible;text-transform:none}.fc .fc-button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.fc .fc-button{-webkit-appearance:button}.fc .fc-button:not(:disabled){cursor:pointer}.fc .fc-button{background-color:transparent;border:1px solid transparent;border-radius:.25em;display:inline-block;font-size:1em;font-weight:400;line-height:1.5;padding:.4em .65em;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle}.fc .fc-button:hover{text-decoration:none}.fc .fc-button:focus{box-shadow:0 0 0 .2rem rgba(44,62,80,.25);outline:0}.fc .fc-button:disabled{opacity:.65}.fc .fc-button-primary{background-color:var(--fc-button-bg-color);border-color:var(--fc-button-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:hover{background-color:var(--fc-button-hover-bg-color);border-color:var(--fc-button-hover-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:disabled{background-color:var(--fc-button-bg-color);border-color:var(--fc-button-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button-primary:not(:disabled).fc-button-active,.fc .fc-button-primary:not(:disabled):active{background-color:var(--fc-button-active-bg-color);border-color:var(--fc-button-active-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:not(:disabled).fc-button-active:focus,.fc .fc-button-primary:not(:disabled):active:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button .fc-icon{font-size:1.5em;vertical-align:middle}.fc .fc-button-group{display:inline-flex;position:relative;vertical-align:middle}.fc .fc-button-group>.fc-button{flex:1 1 auto;position:relative}.fc .fc-button-group>.fc-button.fc-button-active,.fc .fc-button-group>.fc-button:active,.fc .fc-button-group>.fc-button:focus,.fc .fc-button-group>.fc-button:hover{z-index:1}.fc-direction-ltr .fc-button-group>.fc-button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0;margin-left:-1px}.fc-direction-ltr .fc-button-group>.fc-button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.fc-direction-rtl .fc-button-group>.fc-button:not(:first-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.fc-direction-rtl .fc-button-group>.fc-button:not(:last-child){border-bottom-left-radius:0;border-top-left-radius:0}.fc .fc-toolbar{align-items:center;display:flex;justify-content:space-between}.fc .fc-toolbar.fc-header-toolbar{margin-bottom:1.5em}.fc .fc-toolbar.fc-footer-toolbar{margin-top:1.5em}.fc .fc-toolbar-title{font-size:1.75em;margin:0}.fc-direction-ltr .fc-toolbar>*>:not(:first-child){margin-left:.75em}.fc-direction-rtl .fc-toolbar>*>:not(:first-child){margin-right:.75em}.fc-direction-rtl .fc-toolbar-ltr{flex-direction:row-reverse}.fc .fc-scroller{-webkit-overflow-scrolling:touch;position:relative}.fc .fc-scroller-liquid{height:100%}.fc .fc-scroller-liquid-absolute{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-scroller-harness{direction:ltr;overflow:hidden;position:relative}.fc .fc-scroller-harness-liquid{height:100%}.fc-direction-rtl .fc-scroller-harness>.fc-scroller{direction:rtl}.fc-theme-standard .fc-scrollgrid{border:1px solid var(--fc-border-color)}.fc .fc-scrollgrid,.fc .fc-scrollgrid table{table-layout:fixed;width:100%}.fc .fc-scrollgrid table{border-left-style:hidden;border-right-style:hidden;border-top-style:hidden}.fc .fc-scrollgrid{border-bottom-width:0;border-collapse:separate;border-right-width:0}.fc .fc-scrollgrid-liquid{height:100%}.fc .fc-scrollgrid-section,.fc .fc-scrollgrid-section table,.fc .fc-scrollgrid-section>td{height:1px}.fc .fc-scrollgrid-section-liquid>td{height:100%}.fc .fc-scrollgrid-section>*{border-left-width:0;border-top-width:0}.fc .fc-scrollgrid-section-footer>*,.fc .fc-scrollgrid-section-header>*{border-bottom-width:0}.fc .fc-scrollgrid-section-body table,.fc .fc-scrollgrid-section-footer table{border-bottom-style:hidden}.fc .fc-scrollgrid-section-sticky>*{background:var(--fc-page-bg-color);position:sticky;z-index:3}.fc .fc-scrollgrid-section-header.fc-scrollgrid-section-sticky>*{top:0}.fc .fc-scrollgrid-section-footer.fc-scrollgrid-section-sticky>*{bottom:0}.fc .fc-scrollgrid-sticky-shim{height:1px;margin-bottom:-1px}.fc-sticky{position:sticky}.fc .fc-view-harness{flex-grow:1;position:relative}.fc .fc-view-harness-active>.fc-view{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-col-header-cell-cushion{display:inline-block;padding:2px 4px}.fc .fc-bg-event,.fc .fc-highlight,.fc .fc-non-business{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-non-business{background:var(--fc-non-business-color)}.fc .fc-bg-event{background:var(--fc-bg-event-color);opacity:var(--fc-bg-event-opacity)}.fc .fc-bg-event .fc-event-title{font-size:var(--fc-small-font-size);font-style:italic;margin:.5em}.fc .fc-highlight{background:var(--fc-highlight-color)}.fc .fc-cell-shaded,.fc .fc-day-disabled{background:var(--fc-neutral-bg-color)}a.fc-event,a.fc-event:hover{text-decoration:none}.fc-event.fc-event-draggable,.fc-event[href]{cursor:pointer}.fc-event .fc-event-main{position:relative;z-index:2}.fc-event-dragging:not(.fc-event-selected){opacity:.75}.fc-event-dragging.fc-event-selected{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-event .fc-event-resizer{display:none;position:absolute;z-index:4}.fc-event-selected .fc-event-resizer,.fc-event:hover .fc-event-resizer{display:block}.fc-event-selected .fc-event-resizer{background:var(--fc-page-bg-color);border-color:inherit;border-radius:calc(var(--fc-event-resizer-dot-total-width)/2);border-style:solid;border-width:var(--fc-event-resizer-dot-border-width);height:var(--fc-event-resizer-dot-total-width);width:var(--fc-event-resizer-dot-total-width)}.fc-event-selected .fc-event-resizer:before{bottom:-20px;content:"";left:-20px;position:absolute;right:-20px;top:-20px}.fc-event-selected,.fc-event:focus{box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event-selected:before,.fc-event:focus:before{bottom:0;content:"";left:0;position:absolute;right:0;top:0;z-index:3}.fc-event-selected:after,.fc-event:focus:after{background:var(--fc-event-selected-overlay-color);bottom:-1px;content:"";left:-1px;position:absolute;right:-1px;top:-1px;z-index:1}.fc-h-event{background-color:var(--fc-event-bg-color);border:1px solid var(--fc-event-border-color);display:block}.fc-h-event .fc-event-main{color:var(--fc-event-text-color)}.fc-h-event .fc-event-main-frame{display:flex}.fc-h-event .fc-event-time{max-width:100%;overflow:hidden}.fc-h-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-width:0}.fc-h-event .fc-event-title{display:inline-block;left:0;max-width:100%;overflow:hidden;right:0;vertical-align:top}.fc-h-event.fc-event-selected:before{bottom:-10px;top:-10px}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-start),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-end){border-bottom-left-radius:0;border-left-width:0;border-top-left-radius:0}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-end),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-start){border-bottom-right-radius:0;border-right-width:0;border-top-right-radius:0}.fc-h-event:not(.fc-event-selected) .fc-event-resizer{bottom:0;top:0;width:var(--fc-event-resizer-thickness)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end{cursor:w-resize;left:calc(var(--fc-event-resizer-thickness)*-.5)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start{cursor:e-resize;right:calc(var(--fc-event-resizer-thickness)*-.5)}.fc-h-event.fc-event-selected .fc-event-resizer{margin-top:calc(var(--fc-event-resizer-dot-total-width)*-.5);top:50%}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-start,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-end{left:calc(var(--fc-event-resizer-dot-total-width)*-.5)}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-end,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-start{right:calc(var(--fc-event-resizer-dot-total-width)*-.5)}.fc .fc-popover{box-shadow:0 2px 6px rgba(0,0,0,.15);position:absolute;z-index:9999}.fc .fc-popover-header{align-items:center;display:flex;flex-direction:row;justify-content:space-between;padding:3px 4px}.fc .fc-popover-title{margin:0 2px}.fc .fc-popover-close{cursor:pointer;font-size:1.1em;opacity:.65}.fc-theme-standard .fc-popover{background:var(--fc-page-bg-color);border:1px solid var(--fc-border-color)}.fc-theme-standard .fc-popover-header{background:var(--fc-neutral-bg-color)}');const g=/(top|left|right|bottom|width|height)$/i;function m(e,t){for(let n in t)v(e,n,t[n])}function v(e,t,n){null==n?e.style[t]="":"number"==typeof n&&g.test(t)?e.style[t]=`${n}px`:e.style[t]=n}function y(e){var t,n;return null!==(n=null===(t=e.composedPath)||void 0===t?void 0:t.call(e)[0])&&void 0!==n?n:e.target}let b=0;function D(){return b+=1,"fc-dom-"+b}function A(e){e.preventDefault()}function E(e,t,n,r){let i=function(e,t){return n=>{let r=f(n.target,e);r&&t.call(r,n,r)}}(n,r);return e.addEventListener(t,i),()=>{e.removeEventListener(t,i)}}function _(e,t,n,r){let i;return E(e,"mouseover",t,((e,t)=>{if(t!==i){i=t,n(e,t);let s=e=>{i=null,r(e,t),t.removeEventListener("mouseleave",s)};t.addEventListener("mouseleave",s)}}))}const S=["webkitTransitionEnd","otransitionend","oTransitionEnd","msTransitionEnd","transitionend"];function w(e,t){let n=r=>{t(r),S.forEach((t=>{e.removeEventListener(t,n)}))};S.forEach((t=>{e.addEventListener(t,n)}))}function T(e){return Object.assign({onClick:e},C(e))}function C(e){return{tabIndex:0,onKeyDown(t){"Enter"!==t.key&&" "!==t.key||(e(t),t.preventDefault())}}}let x=0;function R(){return x+=1,String(x)}function O(){document.body.classList.add("fc-not-allowed")}function k(){document.body.classList.remove("fc-not-allowed")}function M(e){e.style.userSelect="none",e.addEventListener("selectstart",A)}function I(e){e.style.userSelect="",e.removeEventListener("selectstart",A)}function z(e){e.addEventListener("contextmenu",A)}function N(e){e.removeEventListener("contextmenu",A)}function P(e,t,n){return n.func?n.func(e,t):function(e,t){if(!e&&!t)return 0;if(null==t)return-1;if(null==e)return 1;if("string"==typeof e||"string"==typeof t)return String(e).localeCompare(String(t));return e-t}(e[n.field],t[n.field])*(n.order||1)}function Y(e,t){let n=String(e);return"000".substr(0,t-n.length)+n}function B(e,t,n){return"function"==typeof e?e(...t):"string"==typeof e?t.reduce(((e,t,n)=>e.replace("$"+n,t||"")),e):n}function H(e,t){return e-t}function j(e){return e%1==0}function U(e){let t=e.querySelector(".fc-scrollgrid-shrink-frame"),n=e.querySelector(".fc-scrollgrid-shrink-cushion");if(!t)throw new Error("needs fc-scrollgrid-shrink-frame className");if(!n)throw new Error("needs fc-scrollgrid-shrink-cushion className");return e.getBoundingClientRect().width-t.getBoundingClientRect().width+n.getBoundingClientRect().width}const L=["years","months","days","milliseconds"],V=/^(-?)(?:(\d+)\.)?(\d+):(\d\d)(?::(\d\d)(?:\.(\d\d\d))?)?/;function W(e,t){return"string"==typeof e?function(e){let t=V.exec(e);if(t){let e=t[1]?-1:1;return{years:0,months:0,days:e*(t[2]?parseInt(t[2],10):0),milliseconds:e*(60*(t[3]?parseInt(t[3],10):0)*60*1e3+60*(t[4]?parseInt(t[4],10):0)*1e3+1e3*(t[5]?parseInt(t[5],10):0)+(t[6]?parseInt(t[6],10):0))}}return null}(e):"object"==typeof e&&e?F(e):"number"==typeof e?F({[t||"milliseconds"]:e}):null}function F(e){let t={years:e.years||e.year||0,months:e.months||e.month||0,days:e.days||e.day||0,milliseconds:60*(e.hours||e.hour||0)*60*1e3+60*(e.minutes||e.minute||0)*1e3+1e3*(e.seconds||e.second||0)+(e.milliseconds||e.millisecond||e.ms||0)},n=e.weeks||e.week;return n&&(t.days+=7*n,t.specifiedWeeks=!0),t}function G(e,t){return{years:e.years+t.years,months:e.months+t.months,days:e.days+t.days,milliseconds:e.milliseconds+t.milliseconds}}function q(e,t){return{years:e.years-t.years,months:e.months-t.months,days:e.days-t.days,milliseconds:e.milliseconds-t.milliseconds}}function Q(e,t){return{years:e.years*t,months:e.months*t,days:e.days*t,milliseconds:e.milliseconds*t}}function Z(e){return X(e)/864e5}function X(e){return 31536e6*e.years+2592e6*e.months+864e5*e.days+e.milliseconds}function J(e,t){let n=null;for(let r=0;r<L.length;r+=1){let i=L[r];if(t[i]){let r=e[i]/t[i];if(!j(r)||null!==n&&n!==r)return null;n=r}else if(e[i])return null}return n}function K(e){let t=e.milliseconds;if(t){if(t%1e3!=0)return{unit:"millisecond",value:t};if(t%6e4!=0)return{unit:"second",value:t/1e3};if(t%36e5!=0)return{unit:"minute",value:t/6e4};if(t)return{unit:"hour",value:t/36e5}}return e.days?e.specifiedWeeks&&e.days%7==0?{unit:"week",value:e.days/7}:{unit:"day",value:e.days}:e.months?{unit:"month",value:e.months}:e.years?{unit:"year",value:e.years}:{unit:"millisecond",value:0}}const{hasOwnProperty:$}=Object.prototype;function ee(e,t){let n={};if(t)for(let r in t)if(t[r]===$e){let t=[];for(let i=e.length-1;i>=0;i-=1){let s=e[i][r];if("object"==typeof s&&s)t.unshift(s);else if(void 0!==s){n[r]=s;break}}t.length&&(n[r]=ee(t))}for(let r=e.length-1;r>=0;r-=1){let t=e[r];for(let e in t)e in n||(n[e]=t[e])}return n}function te(e,t){let n={};for(let r in e)t(e[r],r)&&(n[r]=e[r]);return n}function ne(e,t){let n={};for(let r in e)n[r]=t(e[r],r);return n}function re(e){let t={};for(let n of e)t[n]=!0;return t}function ie(e){let t=[];for(let n in e)t.push(e[n]);return t}function se(e,t){if(e===t)return!0;for(let n in e)if($.call(e,n)&&!(n in t))return!1;for(let n in t)if($.call(t,n)&&e[n]!==t[n])return!1;return!0}const oe=/^on[A-Z]/;function ae(e,t){let n=[];for(let r in e)$.call(e,r)&&(r in t||n.push(r));for(let r in t)$.call(t,r)&&e[r]!==t[r]&&n.push(r);return n}function le(e,t,n={}){if(e===t)return!0;for(let r in t)if(!(r in e)||!ce(e[r],t[r],n[r]))return!1;for(let r in e)if(!(r in t))return!1;return!0}function ce(e,t,n){return e===t||!0===n||!!n&&n(e,t)}function ue(e,t,n){if(e===t)return!0;let r,i=e.length;if(i!==t.length)return!1;for(r=0;r<i;r+=1)if(!(n?n(e[r],t[r]):e[r]===t[r]))return!1;return!0}const de=["sun","mon","tue","wed","thu","fri","sat"];function he(e,t){let n=_e(e);return n[2]+=7*t,Se(n)}function fe(e,t){let n=_e(e);return n[2]+=t,Se(n)}function pe(e,t){let n=_e(e);return n[6]+=t,Se(n)}function ge(e,t){return me(e,t)/7}function me(e,t){return(t.valueOf()-e.valueOf())/864e5}function ve(e,t){return Te(e)===Te(t)?Math.round(me(e,t)):null}function ye(e){return Se([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()])}function be(e,t,n,r){let i=Se([t,0,1+De(t,n,r)]),s=ye(e),o=Math.round(me(i,s));return Math.floor(o/7)+1}function De(e,t,n){let r=7+t-n;return-((7+Se([e,0,r]).getUTCDay()-t)%7)+r-1}function Ae(e){return[e.getFullYear(),e.getMonth(),e.getDate(),e.getHours(),e.getMinutes(),e.getSeconds(),e.getMilliseconds()]}function Ee(e){return new Date(e[0],e[1]||0,null==e[2]?1:e[2],e[3]||0,e[4]||0,e[5]||0)}function _e(e){return[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds(),e.getUTCMilliseconds()]}function Se(e){return 1===e.length&&(e=e.concat([0])),new Date(Date.UTC(...e))}function we(e){return!isNaN(e.valueOf())}function Te(e){return 1e3*e.getUTCHours()*60*60+1e3*e.getUTCMinutes()*60+1e3*e.getUTCSeconds()+e.getUTCMilliseconds()}function Ce(e,t,n=!1){let r=e.toISOString();return r=r.replace(".000",""),n&&(r=r.replace("T00:00:00Z","")),r.length>10&&(null==t?r=r.replace("Z",""):0!==t&&(r=r.replace("Z",ke(t,!0)))),r}function xe(e){return e.toISOString().replace(/T.*$/,"")}function Re(e){return e.toISOString().match(/^\d{4}-\d{2}/)[0]}function Oe(e){return Y(e.getUTCHours(),2)+":"+Y(e.getUTCMinutes(),2)+":"+Y(e.getUTCSeconds(),2)}function ke(e,t=!1){let n=e<0?"-":"+",r=Math.abs(e),i=Math.floor(r/60),s=Math.round(r%60);return t?`${n+Y(i,2)}:${Y(s,2)}`:`GMT${n}${i}${s?`:${Y(s,2)}`:""}`}function Me(e,t,n){let r,i;return function(...s){if(r){if(!ue(r,s)){n&&n(i);let r=e.apply(this,s);t&&t(r,i)||(i=r)}}else i=e.apply(this,s);return r=s,i}}function Ie(e,t,n){let r,i;return s=>{if(r){if(!se(r,s)){n&&n(i);let r=e.call(this,s);t&&t(r,i)||(i=r)}}else i=e.call(this,s);return r=s,i}}const ze={week:3,separator:0,omitZeroMinute:0,meridiem:0,omitCommas:0},Ne={timeZoneName:7,era:6,year:5,month:4,day:2,weekday:2,hour:1,minute:1,second:1},Pe=/\s*([ap])\.?m\.?/i,Ye=/,/g,Be=/\s+/g,He=/\u200e/g,je=/UTC|GMT/;class Ue{constructor(e){let t={},n={},r=0;for(let i in e)i in ze?(n[i]=e[i],r=Math.max(ze[i],r)):(t[i]=e[i],i in Ne&&(r=Math.max(Ne[i],r)));this.standardDateProps=t,this.extendedSettings=n,this.severity=r,this.buildFormattingFunc=Me(Le)}format(e,t){return this.buildFormattingFunc(this.standardDateProps,this.extendedSettings,t)(e)}formatRange(e,t,n,r){let{standardDateProps:i,extendedSettings:s}=this,o=function(e,t,n){if(n.getMarkerYear(e)!==n.getMarkerYear(t))return 5;if(n.getMarkerMonth(e)!==n.getMarkerMonth(t))return 4;if(n.getMarkerDay(e)!==n.getMarkerDay(t))return 2;if(Te(e)!==Te(t))return 1;return 0}(e.marker,t.marker,n.calendarSystem);if(!o)return this.format(e,n);let a=o;!(a>1)||"numeric"!==i.year&&"2-digit"!==i.year||"numeric"!==i.month&&"2-digit"!==i.month||"numeric"!==i.day&&"2-digit"!==i.day||(a=1);let l=this.format(e,n),c=this.format(t,n);if(l===c)return l;let u=Le(function(e,t){let n={};for(let r in e)(!(r in Ne)||Ne[r]<=t)&&(n[r]=e[r]);return n}(i,a),s,n),d=u(e),h=u(t),f=function(e,t,n,r){let i=0;for(;i<e.length;){let s=e.indexOf(t,i);if(-1===s)break;let o=e.substr(0,s);i=s+t.length;let a=e.substr(i),l=0;for(;l<n.length;){let e=n.indexOf(r,l);if(-1===e)break;let t=n.substr(0,e);l=e+r.length;let i=n.substr(l);if(o===t&&a===i)return{before:o,after:a}}}return null}(l,d,c,h),p=s.separator||r||n.defaultSeparator||"";return f?f.before+d+p+h+f.after:l+p+c}getLargestUnit(){switch(this.severity){case 7:case 6:case 5:return"year";case 4:return"month";case 3:return"week";case 2:return"day";default:return"time"}}}function Le(e,t,n){let r=Object.keys(e).length;return 1===r&&"short"===e.timeZoneName?e=>ke(e.timeZoneOffset):0===r&&t.week?e=>function(e,t,n,r,i){let s=[];"long"===i?s.push(n):"short"!==i&&"narrow"!==i||s.push(t);"long"!==i&&"short"!==i||s.push(" ");s.push(r.simpleNumberFormat.format(e)),"rtl"===r.options.direction&&s.reverse();return s.join("")}(n.computeWeekNumber(e.marker),n.weekText,n.weekTextLong,n.locale,t.week):function(e,t,n){e=Object.assign({},e),t=Object.assign({},t),function(e,t){e.timeZoneName&&(e.hour||(e.hour="2-digit"),e.minute||(e.minute="2-digit"));"long"===e.timeZoneName&&(e.timeZoneName="short");t.omitZeroMinute&&(e.second||e.millisecond)&&delete t.omitZeroMinute}(e,t),e.timeZone="UTC";let r,i=new Intl.DateTimeFormat(n.locale.codes,e);if(t.omitZeroMinute){let t=Object.assign({},e);delete t.minute,r=new Intl.DateTimeFormat(n.locale.codes,t)}return s=>{let o,{marker:a}=s;return o=r&&!a.getUTCMinutes()?r:i,function(e,t,n,r,i){e=e.replace(He,""),"short"===n.timeZoneName&&(e=function(e,t){let n=!1;e=e.replace(je,(()=>(n=!0,t))),n||(e+=` ${t}`);return e}(e,"UTC"===i.timeZone||null==t.timeZoneOffset?"UTC":ke(t.timeZoneOffset)));r.omitCommas&&(e=e.replace(Ye,"").trim());r.omitZeroMinute&&(e=e.replace(":00",""));!1===r.meridiem?e=e.replace(Pe,"").trim():"narrow"===r.meridiem?e=e.replace(Pe,((e,t)=>t.toLocaleLowerCase())):"short"===r.meridiem?e=e.replace(Pe,((e,t)=>`${t.toLocaleLowerCase()}m`)):"lowercase"===r.meridiem&&(e=e.replace(Pe,(e=>e.toLocaleLowerCase())));return e=e.replace(Be," "),e=e.trim(),e}(o.format(a),s,e,t,n)}}(e,t,n)}function Ve(e,t){let n=t.markerToArray(e.marker);return{marker:e.marker,timeZoneOffset:e.timeZoneOffset,array:n,year:n[0],month:n[1],day:n[2],hour:n[3],minute:n[4],second:n[5],millisecond:n[6]}}function We(e,t,n,r){let i=Ve(e,n.calendarSystem);return{date:i,start:i,end:t?Ve(t,n.calendarSystem):null,timeZone:n.timeZone,localeCodes:n.locale.codes,defaultSeparator:r||n.defaultSeparator}}class Fe{constructor(e){this.cmdStr=e}format(e,t,n){return t.cmdFormatter(this.cmdStr,We(e,null,t,n))}formatRange(e,t,n,r){return n.cmdFormatter(this.cmdStr,We(e,t,n,r))}}class Ge{constructor(e){this.func=e}format(e,t,n){return this.func(We(e,null,t,n))}formatRange(e,t,n,r){return this.func(We(e,t,n,r))}}function qe(e){return"object"==typeof e&&e?new Ue(e):"string"==typeof e?new Fe(e):"function"==typeof e?new Ge(e):null}const Qe={navLinkDayClick:it,navLinkWeekClick:it,duration:W,bootstrapFontAwesome:it,buttonIcons:it,customButtons:it,defaultAllDayEventDuration:W,defaultTimedEventDuration:W,nextDayThreshold:W,scrollTime:W,scrollTimeReset:Boolean,slotMinTime:W,slotMaxTime:W,dayPopoverFormat:qe,slotDuration:W,snapDuration:W,headerToolbar:it,footerToolbar:it,defaultRangeSeparator:String,titleRangeSeparator:String,forceEventDuration:Boolean,dayHeaders:Boolean,dayHeaderFormat:qe,dayHeaderClassNames:it,dayHeaderContent:it,dayHeaderDidMount:it,dayHeaderWillUnmount:it,dayCellClassNames:it,dayCellContent:it,dayCellDidMount:it,dayCellWillUnmount:it,initialView:String,aspectRatio:Number,weekends:Boolean,weekNumberCalculation:it,weekNumbers:Boolean,weekNumberClassNames:it,weekNumberContent:it,weekNumberDidMount:it,weekNumberWillUnmount:it,editable:Boolean,viewClassNames:it,viewDidMount:it,viewWillUnmount:it,nowIndicator:Boolean,nowIndicatorClassNames:it,nowIndicatorContent:it,nowIndicatorDidMount:it,nowIndicatorWillUnmount:it,showNonCurrentDates:Boolean,lazyFetching:Boolean,startParam:String,endParam:String,timeZoneParam:String,timeZone:String,locales:it,locale:it,themeSystem:String,dragRevertDuration:Number,dragScroll:Boolean,allDayMaintainDuration:Boolean,unselectAuto:Boolean,dropAccept:it,eventOrder:function(e){let t,n,r=[],i=[];for("string"==typeof e?i=e.split(/\s*,\s*/):"function"==typeof e?i=[e]:Array.isArray(e)&&(i=e),t=0;t<i.length;t+=1)n=i[t],"string"==typeof n?r.push("-"===n.charAt(0)?{field:n.substring(1),order:-1}:{field:n,order:1}):"function"==typeof n&&r.push({func:n});return r},eventOrderStrict:Boolean,handleWindowResize:Boolean,windowResizeDelay:Number,longPressDelay:Number,eventDragMinDistance:Number,expandRows:Boolean,height:it,contentHeight:it,direction:String,weekNumberFormat:qe,eventResizableFromStart:Boolean,displayEventTime:Boolean,displayEventEnd:Boolean,weekText:String,weekTextLong:String,progressiveEventRendering:Boolean,businessHours:it,initialDate:it,now:it,eventDataTransform:it,stickyHeaderDates:it,stickyFooterScrollbar:it,viewHeight:it,defaultAllDay:Boolean,eventSourceFailure:it,eventSourceSuccess:it,eventDisplay:String,eventStartEditable:Boolean,eventDurationEditable:Boolean,eventOverlap:it,eventConstraint:it,eventAllow:it,eventBackgroundColor:String,eventBorderColor:String,eventTextColor:String,eventColor:String,eventClassNames:it,eventContent:it,eventDidMount:it,eventWillUnmount:it,selectConstraint:it,selectOverlap:it,selectAllow:it,droppable:Boolean,unselectCancel:String,slotLabelFormat:it,slotLaneClassNames:it,slotLaneContent:it,slotLaneDidMount:it,slotLaneWillUnmount:it,slotLabelClassNames:it,slotLabelContent:it,slotLabelDidMount:it,slotLabelWillUnmount:it,dayMaxEvents:it,dayMaxEventRows:it,dayMinWidth:Number,slotLabelInterval:W,allDayText:String,allDayClassNames:it,allDayContent:it,allDayDidMount:it,allDayWillUnmount:it,slotMinWidth:Number,navLinks:Boolean,eventTimeFormat:qe,rerenderDelay:Number,moreLinkText:it,moreLinkHint:it,selectMinDistance:Number,selectable:Boolean,selectLongPressDelay:Number,eventLongPressDelay:Number,selectMirror:Boolean,eventMaxStack:Number,eventMinHeight:Number,eventMinWidth:Number,eventShortHeight:Number,slotEventOverlap:Boolean,plugins:it,firstDay:Number,dayCount:Number,dateAlignment:String,dateIncrement:W,hiddenDays:it,fixedWeekCount:Boolean,validRange:it,visibleRange:it,titleFormat:it,eventInteractive:Boolean,noEventsText:String,viewHint:it,navLinkHint:it,closeHint:String,timeHint:String,eventHint:String,moreLinkClick:it,moreLinkClassNames:it,moreLinkContent:it,moreLinkDidMount:it,moreLinkWillUnmount:it,monthStartFormat:qe,handleCustomRendering:it,customRenderingMetaMap:it,customRenderingReplacesEl:Boolean},Ze={eventDisplay:"auto",defaultRangeSeparator:" - ",titleRangeSeparator:" \u2013 ",defaultTimedEventDuration:"01:00:00",defaultAllDayEventDuration:{day:1},forceEventDuration:!1,nextDayThreshold:"00:00:00",dayHeaders:!0,initialView:"",aspectRatio:1.35,headerToolbar:{start:"title",center:"",end:"today prev,next"},weekends:!0,weekNumbers:!1,weekNumberCalculation:"local",editable:!1,nowIndicator:!1,scrollTime:"06:00:00",scrollTimeReset:!0,slotMinTime:"00:00:00",slotMaxTime:"24:00:00",showNonCurrentDates:!0,lazyFetching:!0,startParam:"start",endParam:"end",timeZoneParam:"timeZone",timeZone:"local",locales:[],locale:"",themeSystem:"standard",dragRevertDuration:500,dragScroll:!0,allDayMaintainDuration:!1,unselectAuto:!0,dropAccept:"*",eventOrder:"start,-duration,allDay,title",dayPopoverFormat:{month:"long",day:"numeric",year:"numeric"},handleWindowResize:!0,windowResizeDelay:100,longPressDelay:1e3,eventDragMinDistance:5,expandRows:!1,navLinks:!1,selectable:!1,eventMinHeight:15,eventMinWidth:30,eventShortHeight:30,monthStartFormat:{month:"long",day:"numeric"}},Xe={datesSet:it,eventsSet:it,eventAdd:it,eventChange:it,eventRemove:it,windowResize:it,eventClick:it,eventMouseEnter:it,eventMouseLeave:it,select:it,unselect:it,loading:it,_unmount:it,_beforeprint:it,_afterprint:it,_noEventDrop:it,_noEventResize:it,_resize:it,_scrollRequest:it},Je={buttonText:it,buttonHints:it,views:it,plugins:it,initialEvents:it,events:it,eventSources:it},Ke={headerToolbar:$e,footerToolbar:$e,buttonText:$e,buttonHints:$e,buttonIcons:$e,dateIncrement:$e,plugins:et,events:et,eventSources:et,resources:et};function $e(e,t){return"object"==typeof e&&"object"==typeof t&&e&&t?se(e,t):e===t}function et(e,t){return Array.isArray(e)&&Array.isArray(t)?ue(e,t):e===t}const tt={type:String,component:it,buttonText:String,buttonTextKey:String,dateProfileGeneratorClass:it,usesMinMaxTime:Boolean,classNames:it,content:it,didMount:it,willUnmount:it};function nt(e){return ee(e,Ke)}function rt(e,t){let n={},r={};for(let i in t)i in e&&(n[i]=t[i](e[i]));for(let i in e)i in t||(r[i]=e[i]);return{refined:n,extra:r}}function it(e){return e}function st(e,t,n,r){return{instanceId:R(),defId:e,range:t,forcedStartTzo:null==n?null:n,forcedEndTzo:null==r?null:r}}function ot(e,t,n){let{dateEnv:r,pluginHooks:i,options:s}=n,{defs:o,instances:a}=e;a=te(a,(e=>!o[e.defId].recurringDef));for(let l in o){let e=o[l];if(e.recurringDef){let{duration:n}=e.recurringDef;n||(n=e.allDay?s.defaultAllDayEventDuration:s.defaultTimedEventDuration);let o=at(e,n,t,r,i.recurringTypes);for(let e of o){let t=st(l,{start:e,end:r.add(e,n)});a[t.instanceId]=t}}}return{defs:o,instances:a}}function at(e,t,n,r,i){let s=i[e.recurringDef.typeId].expand(e.recurringDef.typeData,{start:r.subtract(n.start,t),end:n.end},r);return e.allDay&&(s=s.map(ye)),s}function lt(e,t,n,r,i,s){let o={defs:{},instances:{}},a=wt(n);for(let l of e){let e=_t(l,t,n,r,a,i,s);e&&ct(e,o)}return o}function ct(e,t={defs:{},instances:{}}){return t.defs[e.def.defId]=e.def,e.instance&&(t.instances[e.instance.instanceId]=e.instance),t}function ut(e,t){let n=e.instances[t];if(n){let t=e.defs[n.defId],r=ft(e,(e=>{return n=t,r=e,Boolean(n.groupId&&n.groupId===r.groupId);var n,r}));return r.defs[t.defId]=t,r.instances[n.instanceId]=n,r}return{defs:{},instances:{}}}function dt(){return{defs:{},instances:{}}}function ht(e,t){return{defs:Object.assign(Object.assign({},e.defs),t.defs),instances:Object.assign(Object.assign({},e.instances),t.instances)}}function ft(e,t){let n=te(e.defs,t),r=te(e.instances,(e=>n[e.defId]));return{defs:n,instances:r}}function pt(e){return Array.isArray(e)?e:"string"==typeof e?e.split(/\s+/):[]}const gt={display:String,editable:Boolean,startEditable:Boolean,durationEditable:Boolean,constraint:it,overlap:it,allow:it,className:pt,classNames:pt,color:String,backgroundColor:String,borderColor:String,textColor:String},mt={display:null,startEditable:null,durationEditable:null,constraints:[],overlap:null,allows:[],backgroundColor:"",borderColor:"",textColor:"",classNames:[]};function vt(e,t){let n=function(e,t){return Array.isArray(e)?lt(e,null,t,!0):"object"==typeof e&&e?lt([e],null,t,!0):null!=e?String(e):null}(e.constraint,t);return{display:e.display||null,startEditable:null!=e.startEditable?e.startEditable:e.editable,durationEditable:null!=e.durationEditable?e.durationEditable:e.editable,constraints:null!=n?[n]:[],overlap:null!=e.overlap?e.overlap:null,allows:null!=e.allow?[e.allow]:[],backgroundColor:e.backgroundColor||e.color||"",borderColor:e.borderColor||e.color||"",textColor:e.textColor||"",classNames:(e.className||[]).concat(e.classNames||[])}}function yt(e){return e.reduce(bt,mt)}function bt(e,t){return{display:null!=t.display?t.display:e.display,startEditable:null!=t.startEditable?t.startEditable:e.startEditable,durationEditable:null!=t.durationEditable?t.durationEditable:e.durationEditable,constraints:e.constraints.concat(t.constraints),overlap:"boolean"==typeof t.overlap?t.overlap:e.overlap,allows:e.allows.concat(t.allows),backgroundColor:t.backgroundColor||e.backgroundColor,borderColor:t.borderColor||e.borderColor,textColor:t.textColor||e.textColor,classNames:e.classNames.concat(t.classNames)}}const Dt={id:String,groupId:String,title:String,url:String,interactive:Boolean},At={start:it,end:it,date:it,allDay:Boolean},Et=Object.assign(Object.assign(Object.assign({},Dt),At),{extendedProps:it});function _t(e,t,n,r,i=wt(n),s,o){let{refined:a,extra:l}=St(e,n,i),c=function(e,t){let n=null;e&&(n=e.defaultAllDay);null==n&&(n=t.options.defaultAllDay);return n}(t,n),u=function(e,t,n,r){for(let i=0;i<r.length;i+=1){let s=r[i].parse(e,n);if(s){let{allDay:n}=e;return null==n&&(n=t,null==n&&(n=s.allDayGuess,null==n&&(n=!1))),{allDay:n,duration:s.duration,typeData:s.typeData,typeId:i}}}return null}(a,c,n.dateEnv,n.pluginHooks.recurringTypes);if(u){let e=Tt(a,l,t?t.sourceId:"",u.allDay,Boolean(u.duration),n,s);return e.recurringDef={typeId:u.typeId,typeData:u.typeData,duration:u.duration},{def:e,instance:null}}let d=function(e,t,n,r){let i,s,{allDay:o}=e,a=null,l=!1,c=null,u=null!=e.start?e.start:e.date;if(i=n.dateEnv.createMarkerMeta(u),i)a=i.marker;else if(!r)return null;null!=e.end&&(s=n.dateEnv.createMarkerMeta(e.end));null==o&&(o=null!=t?t:(!i||i.isTimeUnspecified)&&(!s||s.isTimeUnspecified));o&&a&&(a=ye(a));s&&(c=s.marker,o&&(c=ye(c)),a&&c<=a&&(c=null));c?l=!0:r||(l=n.options.forceEventDuration||!1,c=n.dateEnv.add(a,o?n.options.defaultAllDayEventDuration:n.options.defaultTimedEventDuration));return{allDay:o,hasEnd:l,range:{start:a,end:c},forcedStartTzo:i?i.forcedTzo:null,forcedEndTzo:s?s.forcedTzo:null}}(a,c,n,r);if(d){let e=Tt(a,l,t?t.sourceId:"",d.allDay,d.hasEnd,n,s),r=st(e.defId,d.range,d.forcedStartTzo,d.forcedEndTzo);return o&&e.publicId&&o[e.publicId]&&(r.instanceId=o[e.publicId]),{def:e,instance:r}}return null}function St(e,t,n=wt(t)){return rt(e,n)}function wt(e){return Object.assign(Object.assign(Object.assign({},gt),Et),e.pluginHooks.eventRefiners)}function Tt(e,t,n,r,i,s,o){let a={title:e.title||"",groupId:e.groupId||"",publicId:e.id||"",url:e.url||"",recurringDef:null,defId:(o&&e.id?o[e.id]:"")||R(),sourceId:n,allDay:r,hasEnd:i,interactive:e.interactive,ui:vt(e,s),extendedProps:Object.assign(Object.assign({},e.extendedProps||{}),t)};for(let l of s.pluginHooks.eventDefMemberAdders)Object.assign(a,l(e));return Object.freeze(a.ui.classNames),Object.freeze(a.extendedProps),a}const Ct={startTime:"09:00",endTime:"17:00",daysOfWeek:[1,2,3,4,5],display:"inverse-background",classNames:"fc-non-business",groupId:"_businessHours"};function xt(e,t){return lt(function(e){let t;t=!0===e?[{}]:Array.isArray(e)?e.filter((e=>e.daysOfWeek)):"object"==typeof e&&e?[e]:[];return t=t.map((e=>Object.assign(Object.assign({},Ct),e))),t}(e),null,t)}function Rt(e){let t=Math.floor(me(e.start,e.end))||1,n=ye(e.start);return{start:n,end:fe(n,t)}}function Ot(e,t=W(0)){let n=null,r=null;if(e.end){r=ye(e.end);let n=e.end.valueOf()-r.valueOf();n&&n>=X(t)&&(r=fe(r,1))}return e.start&&(n=ye(e.start),r&&r<=n&&(r=fe(n,1))),{start:n,end:r}}function kt(e,t,n,r){return"year"===r?W(n.diffWholeYears(e,t),"year"):"month"===r?W(n.diffWholeMonths(e,t),"month"):function(e,t){let n=ye(e),r=ye(t);return{years:0,months:0,days:Math.round(me(n,r)),milliseconds:t.valueOf()-r.valueOf()-(e.valueOf()-n.valueOf())}}(e,t)}function Mt(e,t){return e.left>=t.left&&e.left<t.right&&e.top>=t.top&&e.top<t.bottom}function It(e,t){let n={left:Math.max(e.left,t.left),right:Math.min(e.right,t.right),top:Math.max(e.top,t.top),bottom:Math.min(e.bottom,t.bottom)};return n.left<n.right&&n.top<n.bottom&&n}function zt(e,t){return{left:Math.min(Math.max(e.left,t.left),t.right),top:Math.min(Math.max(e.top,t.top),t.bottom)}}function Nt(e){return{left:(e.left+e.right)/2,top:(e.top+e.bottom)/2}}function Pt(e,t){return{left:e.left-t.left,top:e.top-t.top}}let Yt;function Bt(){return null==Yt&&(Yt=function(){if("undefined"==typeof document)return!0;let e=document.createElement("div");e.style.position="absolute",e.style.top="0px",e.style.left="0px",e.innerHTML="<table><tr><td><div></div></td></tr></table>",e.querySelector("table").style.height="100px",e.querySelector("div").style.height="100%",document.body.appendChild(e);let t=e.querySelector("div").offsetHeight>0;return document.body.removeChild(e),t}()),Yt}const Ht={defs:{},instances:{}};class jt{constructor(){this.getKeysForEventDefs=Me(this._getKeysForEventDefs),this.splitDateSelection=Me(this._splitDateSpan),this.splitEventStore=Me(this._splitEventStore),this.splitIndividualUi=Me(this._splitIndividualUi),this.splitEventDrag=Me(this._splitInteraction),this.splitEventResize=Me(this._splitInteraction),this.eventUiBuilders={}}splitProps(e){let t=this.getKeyInfo(e),n=this.getKeysForEventDefs(e.eventStore),r=this.splitDateSelection(e.dateSelection),i=this.splitIndividualUi(e.eventUiBases,n),s=this.splitEventStore(e.eventStore,n),o=this.splitEventDrag(e.eventDrag),a=this.splitEventResize(e.eventResize),l={};this.eventUiBuilders=ne(t,((e,t)=>this.eventUiBuilders[t]||Me(Ut)));for(let c in t){let n=t[c],u=s[c]||Ht,d=this.eventUiBuilders[c];l[c]={businessHours:n.businessHours||e.businessHours,dateSelection:r[c]||null,eventStore:u,eventUiBases:d(e.eventUiBases[""],n.ui,i[c]),eventSelection:u.instances[e.eventSelection]?e.eventSelection:"",eventDrag:o[c]||null,eventResize:a[c]||null}}return l}_splitDateSpan(e){let t={};if(e){let n=this.getKeysForDateSpan(e);for(let r of n)t[r]=e}return t}_getKeysForEventDefs(e){return ne(e.defs,(e=>this.getKeysForEventDef(e)))}_splitEventStore(e,t){let{defs:n,instances:r}=e,i={};for(let s in n)for(let e of t[s])i[e]||(i[e]={defs:{},instances:{}}),i[e].defs[s]=n[s];for(let s in r){let e=r[s];for(let n of t[e.defId])i[n]&&(i[n].instances[s]=e)}return i}_splitIndividualUi(e,t){let n={};for(let r in e)if(r)for(let i of t[r])n[i]||(n[i]={}),n[i][r]=e[r];return n}_splitInteraction(e){let t={};if(e){let n=this._splitEventStore(e.affectedEvents,this._getKeysForEventDefs(e.affectedEvents)),r=this._getKeysForEventDefs(e.mutatedEvents),i=this._splitEventStore(e.mutatedEvents,r),s=r=>{t[r]||(t[r]={affectedEvents:n[r]||Ht,mutatedEvents:i[r]||Ht,isEvent:e.isEvent})};for(let e in n)s(e);for(let e in i)s(e)}return t}}function Ut(e,t,n){let r=[];e&&r.push(e),t&&r.push(t);let i={"":yt(r)};return n&&Object.assign(i,n),i}function Lt(e,t){let n,r,i=[],{start:s}=t;for(e.sort(Vt),n=0;n<e.length;n+=1)r=e[n],r.start>s&&i.push({start:s,end:r.start}),r.end>s&&(s=r.end);return s<t.end&&i.push({start:s,end:t.end}),i}function Vt(e,t){return e.start.valueOf()-t.start.valueOf()}function Wt(e,t){let{start:n,end:r}=e,i=null;return null!==t.start&&(n=null===n?t.start:new Date(Math.max(n.valueOf(),t.start.valueOf()))),null!=t.end&&(r=null===r?t.end:new Date(Math.min(r.valueOf(),t.end.valueOf()))),(null===n||null===r||n<r)&&(i={start:n,end:r}),i}function Ft(e,t){return(null===e.end||null===t.start||e.end>t.start)&&(null===e.start||null===t.end||e.start<t.end)}function Gt(e,t){return(null===e.start||null!==t.start&&t.start>=e.start)&&(null===e.end||null!==t.end&&t.end<=e.end)}function qt(e,t){return(null===e.start||t>=e.start)&&(null===e.end||t<e.end)}function Qt(e,t,n,r){return{dow:e.getUTCDay(),isDisabled:Boolean(r&&!qt(r.activeRange,e)),isOther:Boolean(r&&!qt(r.currentRange,e)),isToday:Boolean(t&&qt(t,e)),isPast:Boolean(n?e<n:!!t&&e<t.start),isFuture:Boolean(n?e>n:!!t&&e>=t.end)}}function Zt(e,t){let n=["fc-day",`fc-day-${de[e.dow]}`];return e.isDisabled?n.push("fc-day-disabled"):(e.isToday&&(n.push("fc-day-today"),n.push(t.getClass("today"))),e.isPast&&n.push("fc-day-past"),e.isFuture&&n.push("fc-day-future"),e.isOther&&n.push("fc-day-other")),n}const Xt=qe({year:"numeric",month:"long",day:"numeric"}),Jt=qe({week:"long"});function Kt(e,t,n="day",r=!0){const{dateEnv:i,options:s,calendarApi:o}=e;let a=i.format(t,"week"===n?Jt:Xt);if(s.navLinks){let e=i.toDate(t);const l=e=>{let r="day"===n?s.navLinkDayClick:"week"===n?s.navLinkWeekClick:null;"function"==typeof r?r.call(o,i.toDate(t),e):("string"==typeof r&&(n=r),o.zoomTo(t,n))};return Object.assign({title:B(s.navLinkHint,[a,e],a),"data-navlink":""},r?T(l):{onClick:l})}return{"aria-label":a}}let $t,en=null;function tn(){return null===en&&(en=function(){let e=document.createElement("div");m(e,{position:"absolute",top:-1e3,left:0,border:0,padding:0,overflow:"scroll",direction:"rtl"}),e.innerHTML="<div></div>",document.body.appendChild(e);let t=e.firstChild.getBoundingClientRect().left>e.getBoundingClientRect().left;return h(e),t}()),en}function nn(){return $t||($t=function(){let e=document.createElement("div");e.style.overflow="scroll",e.style.position="absolute",e.style.top="-9999px",e.style.left="-9999px",document.body.appendChild(e);let t=rn(e);return document.body.removeChild(e),t}()),$t}function rn(e){return{x:e.offsetHeight-e.clientHeight,y:e.offsetWidth-e.clientWidth}}function sn(e,t=!1,n){let r=n?e.getBoundingClientRect():on(e),i=function(e,t=!1){let n=window.getComputedStyle(e),r=parseInt(n.borderLeftWidth,10)||0,i=parseInt(n.borderRightWidth,10)||0,s=parseInt(n.borderTopWidth,10)||0,o=parseInt(n.borderBottomWidth,10)||0,a=rn(e),l=a.y-r-i,c={borderLeft:r,borderRight:i,borderTop:s,borderBottom:o,scrollbarBottom:a.x-s-o,scrollbarLeft:0,scrollbarRight:0};return tn()&&"rtl"===n.direction?c.scrollbarLeft=l:c.scrollbarRight=l,t&&(c.paddingLeft=parseInt(n.paddingLeft,10)||0,c.paddingRight=parseInt(n.paddingRight,10)||0,c.paddingTop=parseInt(n.paddingTop,10)||0,c.paddingBottom=parseInt(n.paddingBottom,10)||0),c}(e,t),s={left:r.left+i.borderLeft+i.scrollbarLeft,right:r.right-i.borderRight-i.scrollbarRight,top:r.top+i.borderTop,bottom:r.bottom-i.borderBottom-i.scrollbarBottom};return t&&(s.left+=i.paddingLeft,s.right-=i.paddingRight,s.top+=i.paddingTop,s.bottom-=i.paddingBottom),s}function on(e){let t=e.getBoundingClientRect();return{left:t.left+window.pageXOffset,top:t.top+window.pageYOffset,right:t.right+window.pageXOffset,bottom:t.bottom+window.pageYOffset}}function an(e){let t=[];for(;e instanceof HTMLElement;){let n=window.getComputedStyle(e);if("fixed"===n.position)break;/(auto|scroll)/.test(n.overflow+n.overflowY+n.overflowX)&&t.push(e),e=e.parentNode}return t}function ln(e,t,n){let r=!1,i=function(e){r||(r=!0,t(e))},s=function(e){r||(r=!0,n(e))},o=e(i,s);o&&"function"==typeof o.then&&o.then(i,s)}class cn{constructor(){this.handlers={},this.thisContext=null}setThisContext(e){this.thisContext=e}setOptions(e){this.options=e}on(e,t){!function(e,t,n){(e[t]||(e[t]=[])).push(n)}(this.handlers,e,t)}off(e,t){!function(e,t,n){n?e[t]&&(e[t]=e[t].filter((e=>e!==n))):delete e[t]}(this.handlers,e,t)}trigger(e,...t){let n=this.handlers[e]||[],r=this.options&&this.options[e],i=[].concat(r||[],n);for(let s of i)s.apply(this.thisContext,t)}hasHandlers(e){return Boolean(this.handlers[e]&&this.handlers[e].length||this.options&&this.options[e])}}class un{constructor(e,t,n,r){this.els=t;let i=this.originClientRect=e.getBoundingClientRect();n&&this.buildElHorizontals(i.left),r&&this.buildElVerticals(i.top)}buildElHorizontals(e){let t=[],n=[];for(let r of this.els){let i=r.getBoundingClientRect();t.push(i.left-e),n.push(i.right-e)}this.lefts=t,this.rights=n}buildElVerticals(e){let t=[],n=[];for(let r of this.els){let i=r.getBoundingClientRect();t.push(i.top-e),n.push(i.bottom-e)}this.tops=t,this.bottoms=n}leftToIndex(e){let t,{lefts:n,rights:r}=this,i=n.length;for(t=0;t<i;t+=1)if(e>=n[t]&&e<r[t])return t}topToIndex(e){let t,{tops:n,bottoms:r}=this,i=n.length;for(t=0;t<i;t+=1)if(e>=n[t]&&e<r[t])return t}getWidth(e){return this.rights[e]-this.lefts[e]}getHeight(e){return this.bottoms[e]-this.tops[e]}similarTo(e){return dn(this.tops||[],e.tops||[])&&dn(this.bottoms||[],e.bottoms||[])&&dn(this.lefts||[],e.lefts||[])&&dn(this.rights||[],e.rights||[])}}function dn(e,t){const n=e.length;if(n!==t.length)return!1;for(let r=0;r<n;r++)if(Math.round(e[r])!==Math.round(t[r]))return!1;return!0}class hn{getMaxScrollTop(){return this.getScrollHeight()-this.getClientHeight()}getMaxScrollLeft(){return this.getScrollWidth()-this.getClientWidth()}canScrollVertically(){return this.getMaxScrollTop()>0}canScrollHorizontally(){return this.getMaxScrollLeft()>0}canScrollUp(){return this.getScrollTop()>0}canScrollDown(){return this.getScrollTop()<this.getMaxScrollTop()}canScrollLeft(){return this.getScrollLeft()>0}canScrollRight(){return this.getScrollLeft()<this.getMaxScrollLeft()}}class fn extends hn{constructor(e){super(),this.el=e}getScrollTop(){return this.el.scrollTop}getScrollLeft(){return this.el.scrollLeft}setScrollTop(e){this.el.scrollTop=e}setScrollLeft(e){this.el.scrollLeft=e}getScrollWidth(){return this.el.scrollWidth}getScrollHeight(){return this.el.scrollHeight}getClientHeight(){return this.el.clientHeight}getClientWidth(){return this.el.clientWidth}}class pn extends hn{getScrollTop(){return window.pageYOffset}getScrollLeft(){return window.pageXOffset}setScrollTop(e){window.scroll(window.pageXOffset,e)}setScrollLeft(e){window.scroll(e,window.pageYOffset)}getScrollWidth(){return document.documentElement.scrollWidth}getScrollHeight(){return document.documentElement.scrollHeight}getClientHeight(){return document.documentElement.clientHeight}getClientWidth(){return document.documentElement.clientWidth}}class gn{constructor(e){this.iconOverrideOption&&this.setIconOverride(e[this.iconOverrideOption])}setIconOverride(e){let t,n;if("object"==typeof e&&e){for(n in t=Object.assign({},this.iconClasses),e)t[n]=this.applyIconOverridePrefix(e[n]);this.iconClasses=t}else!1===e&&(this.iconClasses={})}applyIconOverridePrefix(e){let t=this.iconOverridePrefix;return t&&0!==e.indexOf(t)&&(e=t+e),e}getClass(e){return this.classes[e]||""}getIconClass(e,t){let n;return n=t&&this.rtlIconClasses&&this.rtlIconClasses[e]||this.iconClasses[e],n?`${this.baseIconClass} ${n}`:""}getCustomButtonIconClass(e){let t;return this.iconOverrideCustomButtonOption&&(t=e[this.iconOverrideCustomButtonOption],t)?`${this.baseIconClass} ${this.applyIconOverridePrefix(t)}`:""}}function mn(e){e();let t=r.YM.debounceRendering,n=[];for(r.YM.debounceRendering=function(e){n.push(e)},r.sY(r.az(vn,{}),document.createElement("div"));n.length;)n.shift()();r.YM.debounceRendering=t}gn.prototype.classes={},gn.prototype.iconClasses={},gn.prototype.baseIconClass="",gn.prototype.iconOverridePrefix="";class vn extends r.wA{render(){return r.az("div",{})}componentDidMount(){this.setState({})}}function yn(e){let t=r.kr(e),n=t.Provider;return t.Provider=function(){let e=!this.getChildContext,t=n.apply(this,arguments);if(e){let e=[];this.shouldComponentUpdate=t=>{this.props.value!==t.value&&e.forEach((e=>{e.context=t.value,e.forceUpdate()}))},this.sub=t=>{e.push(t);let n=t.componentWillUnmount;t.componentWillUnmount=()=>{e.splice(e.indexOf(t),1),n&&n.call(t)}}}return t},t}class bn{constructor(e,t,n,r){this.execFunc=e,this.emitter=t,this.scrollTime=n,this.scrollTimeReset=r,this.handleScrollRequest=e=>{this.queuedRequest=Object.assign({},this.queuedRequest||{},e),this.drain()},t.on("_scrollRequest",this.handleScrollRequest),this.fireInitialScroll()}detach(){this.emitter.off("_scrollRequest",this.handleScrollRequest)}update(e){e&&this.scrollTimeReset?this.fireInitialScroll():this.drain()}fireInitialScroll(){this.handleScrollRequest({time:this.scrollTime})}drain(){this.queuedRequest&&this.execFunc(this.queuedRequest)&&(this.queuedRequest=null)}}const Dn=yn({});function An(e,t,n,r,i,s,o,a,l,c,u,d,h){return{dateEnv:i,options:n,pluginHooks:o,emitter:c,dispatch:a,getCurrentData:l,calendarApi:u,viewSpec:e,viewApi:t,dateProfileGenerator:r,theme:s,isRtl:"rtl"===n.direction,addResizeHandler(e){c.on("_resize",e)},removeResizeHandler(e){c.off("_resize",e)},createScrollResponder:e=>new bn(e,c,W(n.scrollTime),n.scrollTimeReset),registerInteractiveComponent:d,unregisterInteractiveComponent:h}}class En extends r.wA{shouldComponentUpdate(e,t){return this.debug&&console.log(ae(e,this.props),ae(t,this.state)),!le(this.props,e,this.propEquality)||!le(this.state,t,this.stateEquality)}safeSetState(e){le(this.state,Object.assign(Object.assign({},this.state),e),this.stateEquality)||this.setState(e)}}En.addPropsEquality=function(e){let t=Object.create(this.prototype.propEquality);Object.assign(t,e),this.prototype.propEquality=t},En.addStateEquality=function(e){let t=Object.create(this.prototype.stateEquality);Object.assign(t,e),this.prototype.stateEquality=t},En.contextType=Dn,En.prototype.propEquality={},En.prototype.stateEquality={};class _n extends En{}function Sn(e,t){"function"==typeof e?e(t):e&&(e.current=t)}_n.contextType=Dn;class wn extends _n{constructor(){super(...arguments),this.uid=R()}prepareHits(){}queryHit(e,t,n,r){return null}isValidSegDownEl(e){return!this.props.eventDrag&&!this.props.eventResize&&!f(e,".fc-event-mirror")}isValidDateDownEl(e){return!(f(e,".fc-event:not(.fc-bg-event)")||f(e,".fc-more-link")||f(e,"a[data-navlink]")||f(e,".fc-popover"))}}function Tn(e,t){return"CHANGE_DATE"===t.type?t.dateMarker:e}function Cn(e,t){let n=e.initialDate;return null!=n?t.createMarker(n):xn(e.now,t)}function xn(e,t){return"function"==typeof e&&(e=e()),null==e?t.createNowMarker():t.createMarker(e)}class Rn{constructor(e){this.props=e,this.nowDate=xn(e.nowInput,e.dateEnv),this.initHiddenDays()}buildPrev(e,t,n){let{dateEnv:r}=this.props,i=r.subtract(r.startOf(t,e.currentRangeUnit),e.dateIncrement);return this.build(i,-1,n)}buildNext(e,t,n){let{dateEnv:r}=this.props,i=r.add(r.startOf(t,e.currentRangeUnit),e.dateIncrement);return this.build(i,1,n)}build(e,t,n=!0){let r,i,s,o,a,l,{props:c}=this;var u,d;return r=this.buildValidRange(),r=this.trimHiddenDays(r),n&&(u=e,e=null!=(d=r).start&&u<d.start?d.start:null!=d.end&&u>=d.end?new Date(d.end.valueOf()-1):u),i=this.buildCurrentRangeInfo(e,t),s=/^(year|month|week|day)$/.test(i.unit),o=this.buildRenderRange(this.trimHiddenDays(i.range),i.unit,s),o=this.trimHiddenDays(o),a=o,c.showNonCurrentDates||(a=Wt(a,i.range)),a=this.adjustActiveRange(a),a=Wt(a,r),l=Ft(i.range,r),qt(o,e)||(e=o.start),{currentDate:e,validRange:r,currentRange:i.range,currentRangeUnit:i.unit,isRangeAllDay:s,activeRange:a,renderRange:o,slotMinTime:c.slotMinTime,slotMaxTime:c.slotMaxTime,isValid:l,dateIncrement:this.buildDateIncrement(i.duration)}}buildValidRange(){let e=this.props.validRangeInput,t="function"==typeof e?e.call(this.props.calendarApi,this.nowDate):e;return this.refineRange(t)||{start:null,end:null}}buildCurrentRangeInfo(e,t){let n,{props:r}=this,i=null,s=null,o=null;return r.duration?(i=r.duration,s=r.durationUnit,o=this.buildRangeFromDuration(e,t,i,s)):(n=this.props.dayCount)?(s="day",o=this.buildRangeFromDayCount(e,t,n)):(o=this.buildCustomVisibleRange(e))?s=r.dateEnv.greatestWholeUnit(o.start,o.end).unit:(i=this.getFallbackDuration(),s=K(i).unit,o=this.buildRangeFromDuration(e,t,i,s)),{duration:i,unit:s,range:o}}getFallbackDuration(){return W({day:1})}adjustActiveRange(e){let{dateEnv:t,usesMinMaxTime:n,slotMinTime:r,slotMaxTime:i}=this.props,{start:s,end:o}=e;return n&&(Z(r)<0&&(s=ye(s),s=t.add(s,r)),Z(i)>1&&(o=ye(o),o=fe(o,-1),o=t.add(o,i))),{start:s,end:o}}buildRangeFromDuration(e,t,n,r){let i,s,o,{dateEnv:a,dateAlignment:l}=this.props;if(!l){let{dateIncrement:e}=this.props;l=e&&X(e)<X(n)?K(e).unit:r}function c(){i=a.startOf(e,l),s=a.add(i,n),o={start:i,end:s}}return Z(n)<=1&&this.isHiddenDay(i)&&(i=this.skipHiddenDays(i,t),i=ye(i)),c(),this.trimHiddenDays(o)||(e=this.skipHiddenDays(e,t),c()),o}buildRangeFromDayCount(e,t,n){let r,{dateEnv:i,dateAlignment:s}=this.props,o=0,a=e;s&&(a=i.startOf(a,s)),a=ye(a),a=this.skipHiddenDays(a,t),r=a;do{r=fe(r,1),this.isHiddenDay(r)||(o+=1)}while(o<n);return{start:a,end:r}}buildCustomVisibleRange(e){let{props:t}=this,n=t.visibleRangeInput,r="function"==typeof n?n.call(t.calendarApi,t.dateEnv.toDate(e)):n,i=this.refineRange(r);return!i||null!=i.start&&null!=i.end?i:null}buildRenderRange(e,t,n){return e}buildDateIncrement(e){let t,{dateIncrement:n}=this.props;return n||((t=this.props.dateAlignment)?W(1,t):e||W({days:1}))}refineRange(e){if(e){let t=function(e,t){let n=null,r=null;return e.start&&(n=t.createMarker(e.start)),e.end&&(r=t.createMarker(e.end)),n||r?n&&r&&r<n?null:{start:n,end:r}:null}(e,this.props.dateEnv);return t&&(t=Ot(t)),t}return null}initHiddenDays(){let e,t=this.props.hiddenDays||[],n=[],r=0;for(!1===this.props.weekends&&t.push(0,6),e=0;e<7;e+=1)(n[e]=-1!==t.indexOf(e))||(r+=1);if(!r)throw new Error("invalid hiddenDays");this.isHiddenDayHash=n}trimHiddenDays(e){let{start:t,end:n}=e;return t&&(t=this.skipHiddenDays(t)),n&&(n=this.skipHiddenDays(n,-1,!0)),null==t||null==n||t<n?{start:t,end:n}:null}isHiddenDay(e){return e instanceof Date&&(e=e.getUTCDay()),this.isHiddenDayHash[e]}skipHiddenDays(e,t=1,n=!1){for(;this.isHiddenDayHash[(e.getUTCDay()+(n?t:0)+7)%7];)e=fe(e,t);return e}}function On(e,t,n){n.emitter.trigger("select",Object.assign(Object.assign({},kn(e,n)),{jsEvent:t?t.origEvent:null,view:n.viewApi||n.calendarApi.view}))}function kn(e,t){let n={};for(let s of t.pluginHooks.dateSpanTransforms)Object.assign(n,s(e,t));var r,i;return Object.assign(n,(r=e,i=t.dateEnv,Object.assign(Object.assign({},or(r.range,i,r.allDay)),{allDay:r.allDay}))),n}function Mn(e,t,n){let{dateEnv:r,options:i}=n,s=t;return e?(s=ye(s),s=r.add(s,i.defaultAllDayEventDuration)):s=r.add(s,i.defaultTimedEventDuration),s}function In(e,t,n,r){let i=Wn(e.defs,t),s={defs:{},instances:{}};for(let o in e.defs){let t=e.defs[o];s.defs[o]=zn(t,i[o],n,r)}for(let o in e.instances){let t=e.instances[o],a=s.defs[t.defId];s.instances[o]=Nn(t,a,i[t.defId],n,r)}return s}function zn(e,t,n,r){let i=n.standardProps||{};null==i.hasEnd&&t.durationEditable&&(n.startDelta||n.endDelta)&&(i.hasEnd=!0);let s=Object.assign(Object.assign(Object.assign({},e),i),{ui:Object.assign(Object.assign({},e.ui),i.ui)});n.extendedProps&&(s.extendedProps=Object.assign(Object.assign({},s.extendedProps),n.extendedProps));for(let o of r.pluginHooks.eventDefMutationAppliers)o(s,n,r);return!s.hasEnd&&r.options.forceEventDuration&&(s.hasEnd=!0),s}function Nn(e,t,n,r,i){let{dateEnv:s}=i,o=r.standardProps&&!0===r.standardProps.allDay,a=r.standardProps&&!1===r.standardProps.hasEnd,l=Object.assign({},e);return o&&(l.range=Rt(l.range)),r.datesDelta&&n.startEditable&&(l.range={start:s.add(l.range.start,r.datesDelta),end:s.add(l.range.end,r.datesDelta)}),r.startDelta&&n.durationEditable&&(l.range={start:s.add(l.range.start,r.startDelta),end:l.range.end}),r.endDelta&&n.durationEditable&&(l.range={start:l.range.start,end:s.add(l.range.end,r.endDelta)}),a&&(l.range={start:l.range.start,end:Mn(t.allDay,l.range.start,i)}),t.allDay&&(l.range={start:ye(l.range.start),end:ye(l.range.end)}),l.range.end<l.range.start&&(l.range.end=Mn(t.allDay,l.range.start,i)),l}class Pn{constructor(e,t){this.context=e,this.internalEventSource=t}remove(){this.context.dispatch({type:"REMOVE_EVENT_SOURCE",sourceId:this.internalEventSource.sourceId})}refetch(){this.context.dispatch({type:"FETCH_EVENT_SOURCES",sourceIds:[this.internalEventSource.sourceId],isRefetch:!0})}get id(){return this.internalEventSource.publicId}get url(){return this.internalEventSource.meta.url}get format(){return this.internalEventSource.meta.format}}class Yn{constructor(e,t,n){this._context=e,this._def=t,this._instance=n||null}setProp(e,t){if(e in At)console.warn("Could not set date-related prop 'name'. Use one of the date-related methods instead.");else if("id"===e)t=Dt[e](t),this.mutate({standardProps:{publicId:t}});else if(e in Dt)t=Dt[e](t),this.mutate({standardProps:{[e]:t}});else if(e in gt){let n=gt[e](t);n="color"===e?{backgroundColor:t,borderColor:t}:"editable"===e?{startEditable:t,durationEditable:t}:{[e]:t},this.mutate({standardProps:{ui:n}})}else console.warn(`Could not set prop '${e}'. Use setExtendedProp instead.`)}setExtendedProp(e,t){this.mutate({extendedProps:{[e]:t}})}setStart(e,t={}){let{dateEnv:n}=this._context,r=n.createMarker(e);if(r&&this._instance){let e=kt(this._instance.range.start,r,n,t.granularity);t.maintainDuration?this.mutate({datesDelta:e}):this.mutate({startDelta:e})}}setEnd(e,t={}){let n,{dateEnv:r}=this._context;if((null==e||(n=r.createMarker(e),n))&&this._instance)if(n){let e=kt(this._instance.range.end,n,r,t.granularity);this.mutate({endDelta:e})}else this.mutate({standardProps:{hasEnd:!1}})}setDates(e,t,n={}){let r,{dateEnv:i}=this._context,s={allDay:n.allDay},o=i.createMarker(e);var a,l;if(o&&((null==t||(r=i.createMarker(t),r))&&this._instance)){let e=this._instance.range;!0===n.allDay&&(e=Rt(e));let t=kt(e.start,o,i,n.granularity);if(r){let o=kt(e.end,r,i,n.granularity);l=o,(a=t).years===l.years&&a.months===l.months&&a.days===l.days&&a.milliseconds===l.milliseconds?this.mutate({datesDelta:t,standardProps:s}):this.mutate({startDelta:t,endDelta:o,standardProps:s})}else s.hasEnd=!1,this.mutate({datesDelta:t,standardProps:s})}}moveStart(e){let t=W(e);t&&this.mutate({startDelta:t})}moveEnd(e){let t=W(e);t&&this.mutate({endDelta:t})}moveDates(e){let t=W(e);t&&this.mutate({datesDelta:t})}setAllDay(e,t={}){let n={allDay:e},{maintainDuration:r}=t;null==r&&(r=this._context.options.allDayMaintainDuration),this._def.allDay!==e&&(n.hasEnd=r),this.mutate({standardProps:n})}formatRange(e){let{dateEnv:t}=this._context,n=this._instance,r=qe(e);return this._def.hasEnd?t.formatRange(n.range.start,n.range.end,r,{forcedStartTzo:n.forcedStartTzo,forcedEndTzo:n.forcedEndTzo}):t.format(n.range.start,r,{forcedTzo:n.forcedStartTzo})}mutate(e){let t=this._instance;if(t){let n=this._def,r=this._context,{eventStore:i}=r.getCurrentData(),s=ut(i,t.instanceId);s=In(s,{"":{display:"",startEditable:!0,durationEditable:!0,constraints:[],overlap:null,allows:[],backgroundColor:"",borderColor:"",textColor:"",classNames:[]}},e,r);let o=new Yn(r,n,t);this._def=s.defs[n.defId],this._instance=s.instances[t.instanceId],r.dispatch({type:"MERGE_EVENTS",eventStore:s}),r.emitter.trigger("eventChange",{oldEvent:o,event:this,relatedEvents:Hn(s,r,t),revert(){r.dispatch({type:"RESET_EVENTS",eventStore:i})}})}}remove(){let e=this._context,t=Bn(this);e.dispatch({type:"REMOVE_EVENTS",eventStore:t}),e.emitter.trigger("eventRemove",{event:this,relatedEvents:[],revert(){e.dispatch({type:"MERGE_EVENTS",eventStore:t})}})}get source(){let{sourceId:e}=this._def;return e?new Pn(this._context,this._context.getCurrentData().eventSources[e]):null}get start(){return this._instance?this._context.dateEnv.toDate(this._instance.range.start):null}get end(){return this._instance&&this._def.hasEnd?this._context.dateEnv.toDate(this._instance.range.end):null}get startStr(){let e=this._instance;return e?this._context.dateEnv.formatIso(e.range.start,{omitTime:this._def.allDay,forcedTzo:e.forcedStartTzo}):""}get endStr(){let e=this._instance;return e&&this._def.hasEnd?this._context.dateEnv.formatIso(e.range.end,{omitTime:this._def.allDay,forcedTzo:e.forcedEndTzo}):""}get id(){return this._def.publicId}get groupId(){return this._def.groupId}get allDay(){return this._def.allDay}get title(){return this._def.title}get url(){return this._def.url}get display(){return this._def.ui.display||"auto"}get startEditable(){return this._def.ui.startEditable}get durationEditable(){return this._def.ui.durationEditable}get constraint(){return this._def.ui.constraints[0]||null}get overlap(){return this._def.ui.overlap}get allow(){return this._def.ui.allows[0]||null}get backgroundColor(){return this._def.ui.backgroundColor}get borderColor(){return this._def.ui.borderColor}get textColor(){return this._def.ui.textColor}get classNames(){return this._def.ui.classNames}get extendedProps(){return this._def.extendedProps}toPlainObject(e={}){let t=this._def,{ui:n}=t,{startStr:r,endStr:i}=this,s={allDay:t.allDay};return t.title&&(s.title=t.title),r&&(s.start=r),i&&(s.end=i),t.publicId&&(s.id=t.publicId),t.groupId&&(s.groupId=t.groupId),t.url&&(s.url=t.url),n.display&&"auto"!==n.display&&(s.display=n.display),e.collapseColor&&n.backgroundColor&&n.backgroundColor===n.borderColor?s.color=n.backgroundColor:(n.backgroundColor&&(s.backgroundColor=n.backgroundColor),n.borderColor&&(s.borderColor=n.borderColor)),n.textColor&&(s.textColor=n.textColor),n.classNames.length&&(s.classNames=n.classNames),Object.keys(t.extendedProps).length&&(e.collapseExtendedProps?Object.assign(s,t.extendedProps):s.extendedProps=t.extendedProps),s}toJSON(){return this.toPlainObject()}}function Bn(e){let t=e._def,n=e._instance;return{defs:{[t.defId]:t},instances:n?{[n.instanceId]:n}:{}}}function Hn(e,t,n){let{defs:r,instances:i}=e,s=[],o=n?n.instanceId:"";for(let a in i){let e=i[a],n=r[e.defId];e.instanceId!==o&&s.push(new Yn(t,n,e))}return s}function jn(e,t,n,r){let i={},s={},o={},a=[],l=[],c=Wn(e.defs,t);for(let u in e.defs){let t=e.defs[u];"inverse-background"===c[t.defId].display&&(t.groupId?(i[t.groupId]=[],o[t.groupId]||(o[t.groupId]=t)):s[u]=[])}for(let u in e.instances){let t=e.instances[u],o=e.defs[t.defId],d=c[o.defId],h=t.range,f=!o.allDay&&r?Ot(h,r):h,p=Wt(f,n);p&&("inverse-background"===d.display?o.groupId?i[o.groupId].push(p):s[t.defId].push(p):"none"!==d.display&&("background"===d.display?a:l).push({def:o,ui:d,instance:t,range:p,isStart:f.start&&f.start.valueOf()===p.start.valueOf(),isEnd:f.end&&f.end.valueOf()===p.end.valueOf()}))}for(let u in i){let e=Lt(i[u],n);for(let t of e){let e=o[u],n=c[e.defId];a.push({def:e,ui:n,instance:null,range:t,isStart:!1,isEnd:!1})}}for(let u in s){let t=Lt(s[u],n);for(let n of t)a.push({def:e.defs[u],ui:c[u],instance:null,range:n,isStart:!1,isEnd:!1})}return{bg:a,fg:l}}function Un(e){return"background"===e.ui.display||"inverse-background"===e.ui.display}function Ln(e,t){e.fcSeg=t}function Vn(e){return e.fcSeg||e.parentNode.fcSeg||null}function Wn(e,t){return ne(e,(e=>Fn(e,t)))}function Fn(e,t){let n=[];return t[""]&&n.push(t[""]),t[e.defId]&&n.push(t[e.defId]),n.push(e.ui),yt(n)}function Gn(e,t){let n=e.map(qn);return n.sort(((e,n)=>function(e,t,n){let r,i;for(r=0;r<n.length;r+=1)if(i=P(e,t,n[r]),i)return i;return 0}(e,n,t))),n.map((e=>e._seg))}function qn(e){let{eventRange:t}=e,n=t.def,r=t.instance?t.instance.range:t.range,i=r.start?r.start.valueOf():0,s=r.end?r.end.valueOf():0;return Object.assign(Object.assign(Object.assign({},n.extendedProps),n),{id:n.publicId,start:i,end:s,duration:s-i,allDay:Number(n.allDay),_seg:e})}function Qn(e,t){let{pluginHooks:n}=t,r=n.isDraggableTransformers,{def:i,ui:s}=e.eventRange,o=s.startEditable;for(let a of r)o=a(o,i,s,t);return o}function Zn(e,t){return e.isStart&&e.eventRange.ui.durationEditable&&t.options.eventResizableFromStart}function Xn(e,t){return e.isEnd&&e.eventRange.ui.durationEditable}function Jn(e,t,n,r,i,s,o){let{dateEnv:a,options:l}=n,{displayEventTime:c,displayEventEnd:u}=l,d=e.eventRange.def,h=e.eventRange.instance;null==c&&(c=!1!==r),null==u&&(u=!1!==i);let f=h.range.start,p=h.range.end,g=s||e.start||e.eventRange.range.start,m=o||e.end||e.eventRange.range.end,v=ye(f).valueOf()===ye(g).valueOf(),y=ye(pe(p,-1)).valueOf()===ye(pe(m,-1)).valueOf();return c&&!d.allDay&&(v||y)?(g=v?f:g,m=y?p:m,u&&d.hasEnd?a.formatRange(g,m,t,{forcedStartTzo:s?null:h.forcedStartTzo,forcedEndTzo:o?null:h.forcedEndTzo}):a.format(g,t,{forcedTzo:s?null:h.forcedStartTzo})):""}function Kn(e,t,n){let r=e.eventRange.range;return{isPast:r.end<(n||t.start),isFuture:r.start>=(n||t.end),isToday:t&&qt(t,r.start)}}function $n(e){let t=["fc-event"];return e.isMirror&&t.push("fc-event-mirror"),e.isDraggable&&t.push("fc-event-draggable"),(e.isStartResizable||e.isEndResizable)&&t.push("fc-event-resizable"),e.isDragging&&t.push("fc-event-dragging"),e.isResizing&&t.push("fc-event-resizing"),e.isSelected&&t.push("fc-event-selected"),e.isStart&&t.push("fc-event-start"),e.isEnd&&t.push("fc-event-end"),e.isPast&&t.push("fc-event-past"),e.isToday&&t.push("fc-event-today"),e.isFuture&&t.push("fc-event-future"),t}function er(e){return e.instance?e.instance.instanceId:`${e.def.defId}:${e.range.start.toISOString()}`}function tr(e,t){let{def:n,instance:r}=e.eventRange,{url:i}=n;if(i)return{href:i};let{emitter:s,options:o}=t,{eventInteractive:a}=o;return null==a&&(a=n.interactive,null==a&&(a=Boolean(s.hasHandlers("eventClick")))),a?C((e=>{s.trigger("eventClick",{el:e.target,event:new Yn(t,n,r),jsEvent:e,view:t.viewApi})})):{}}const nr={start:it,end:it,allDay:Boolean};function rr(e,t,n){let r=function(e,t){let{refined:n,extra:r}=rt(e,nr),i=n.start?t.createMarkerMeta(n.start):null,s=n.end?t.createMarkerMeta(n.end):null,{allDay:o}=n;null==o&&(o=i&&i.isTimeUnspecified&&(!s||s.isTimeUnspecified));return Object.assign({range:{start:i?i.marker:null,end:s?s.marker:null},allDay:o},r)}(e,t),{range:i}=r;if(!i.start)return null;if(!i.end){if(null==n)return null;i.end=t.add(i.start,n)}return r}function ir(e,t){return n=e.range,r=t.range,(null===n.start?null:n.start.valueOf())===(null===r.start?null:r.start.valueOf())&&(null===n.end?null:n.end.valueOf())===(null===r.end?null:r.end.valueOf())&&e.allDay===t.allDay&&function(e,t){for(let n in t)if("range"!==n&&"allDay"!==n&&e[n]!==t[n])return!1;for(let n in e)if(!(n in t))return!1;return!0}(e,t);var n,r}function sr(e,t,n){return Object.assign(Object.assign({},or(e,t,n)),{timeZone:t.timeZone})}function or(e,t,n){return{start:t.toDate(e.start),end:t.toDate(e.end),startStr:t.formatIso(e.start,{omitTime:n}),endStr:t.formatIso(e.end,{omitTime:n})}}let ar={};var lr,cr;lr="gregory",cr=class{getMarkerYear(e){return e.getUTCFullYear()}getMarkerMonth(e){return e.getUTCMonth()}getMarkerDay(e){return e.getUTCDate()}arrayToMarker(e){return Se(e)}markerToArray(e){return _e(e)}},ar[lr]=cr;const ur=/^\s*(\d{4})(-?(\d{2})(-?(\d{2})([T ](\d{2}):?(\d{2})(:?(\d{2})(\.(\d+))?)?(Z|(([-+])(\d{2})(:?(\d{2}))?))?)?)?)?$/;class dr{constructor(e){let t=this.timeZone=e.timeZone,n="local"!==t&&"UTC"!==t;e.namedTimeZoneImpl&&n&&(this.namedTimeZoneImpl=new e.namedTimeZoneImpl(t)),this.canComputeOffset=Boolean(!n||this.namedTimeZoneImpl),this.calendarSystem=function(e){return new ar[e]}(e.calendarSystem),this.locale=e.locale,this.weekDow=e.locale.week.dow,this.weekDoy=e.locale.week.doy,"ISO"===e.weekNumberCalculation&&(this.weekDow=1,this.weekDoy=4),"number"==typeof e.firstDay&&(this.weekDow=e.firstDay),"function"==typeof e.weekNumberCalculation&&(this.weekNumberFunc=e.weekNumberCalculation),this.weekText=null!=e.weekText?e.weekText:e.locale.options.weekText,this.weekTextLong=(null!=e.weekTextLong?e.weekTextLong:e.locale.options.weekTextLong)||this.weekText,this.cmdFormatter=e.cmdFormatter,this.defaultSeparator=e.defaultSeparator}createMarker(e){let t=this.createMarkerMeta(e);return null===t?null:t.marker}createNowMarker(){return this.canComputeOffset?this.timestampToMarker((new Date).valueOf()):Se(Ae(new Date))}createMarkerMeta(e){if("string"==typeof e)return this.parse(e);let t=null;return"number"==typeof e?t=this.timestampToMarker(e):e instanceof Date?(e=e.valueOf(),isNaN(e)||(t=this.timestampToMarker(e))):Array.isArray(e)&&(t=Se(e)),null!==t&&we(t)?{marker:t,isTimeUnspecified:!1,forcedTzo:null}:null}parse(e){let t=function(e){let t=ur.exec(e);if(t){let e=new Date(Date.UTC(Number(t[1]),t[3]?Number(t[3])-1:0,Number(t[5]||1),Number(t[7]||0),Number(t[8]||0),Number(t[10]||0),t[12]?1e3*Number(`0.${t[12]}`):0));if(we(e)){let n=null;return t[13]&&(n=("-"===t[15]?-1:1)*(60*Number(t[16]||0)+Number(t[18]||0))),{marker:e,isTimeUnspecified:!t[6],timeZoneOffset:n}}}return null}(e);if(null===t)return null;let{marker:n}=t,r=null;return null!==t.timeZoneOffset&&(this.canComputeOffset?n=this.timestampToMarker(n.valueOf()-60*t.timeZoneOffset*1e3):r=t.timeZoneOffset),{marker:n,isTimeUnspecified:t.isTimeUnspecified,forcedTzo:r}}getYear(e){return this.calendarSystem.getMarkerYear(e)}getMonth(e){return this.calendarSystem.getMarkerMonth(e)}getDay(e){return this.calendarSystem.getMarkerDay(e)}add(e,t){let n=this.calendarSystem.markerToArray(e);return n[0]+=t.years,n[1]+=t.months,n[2]+=t.days,n[6]+=t.milliseconds,this.calendarSystem.arrayToMarker(n)}subtract(e,t){let n=this.calendarSystem.markerToArray(e);return n[0]-=t.years,n[1]-=t.months,n[2]-=t.days,n[6]-=t.milliseconds,this.calendarSystem.arrayToMarker(n)}addYears(e,t){let n=this.calendarSystem.markerToArray(e);return n[0]+=t,this.calendarSystem.arrayToMarker(n)}addMonths(e,t){let n=this.calendarSystem.markerToArray(e);return n[1]+=t,this.calendarSystem.arrayToMarker(n)}diffWholeYears(e,t){let{calendarSystem:n}=this;return Te(e)===Te(t)&&n.getMarkerDay(e)===n.getMarkerDay(t)&&n.getMarkerMonth(e)===n.getMarkerMonth(t)?n.getMarkerYear(t)-n.getMarkerYear(e):null}diffWholeMonths(e,t){let{calendarSystem:n}=this;return Te(e)===Te(t)&&n.getMarkerDay(e)===n.getMarkerDay(t)?n.getMarkerMonth(t)-n.getMarkerMonth(e)+12*(n.getMarkerYear(t)-n.getMarkerYear(e)):null}greatestWholeUnit(e,t){let n=this.diffWholeYears(e,t);return null!==n?{unit:"year",value:n}:(n=this.diffWholeMonths(e,t),null!==n?{unit:"month",value:n}:(n=function(e,t){let n=ve(e,t);return null!==n&&n%7==0?n/7:null}(e,t),null!==n?{unit:"week",value:n}:(n=ve(e,t),null!==n?{unit:"day",value:n}:(n=function(e,t){return(t.valueOf()-e.valueOf())/36e5}(e,t),j(n)?{unit:"hour",value:n}:(n=function(e,t){return(t.valueOf()-e.valueOf())/6e4}(e,t),j(n)?{unit:"minute",value:n}:(n=function(e,t){return(t.valueOf()-e.valueOf())/1e3}(e,t),j(n)?{unit:"second",value:n}:{unit:"millisecond",value:t.valueOf()-e.valueOf()}))))))}countDurationsBetween(e,t,n){let r;return n.years&&(r=this.diffWholeYears(e,t),null!==r)?r/(Z(n)/365):n.months&&(r=this.diffWholeMonths(e,t),null!==r)?r/function(e){return Z(e)/30}(n):n.days&&(r=ve(e,t),null!==r)?r/Z(n):(t.valueOf()-e.valueOf())/X(n)}startOf(e,t){return"year"===t?this.startOfYear(e):"month"===t?this.startOfMonth(e):"week"===t?this.startOfWeek(e):"day"===t?ye(e):"hour"===t?function(e){return Se([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours()])}(e):"minute"===t?function(e){return Se([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes()])}(e):"second"===t?function(e){return Se([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds()])}(e):null}startOfYear(e){return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(e)])}startOfMonth(e){return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(e),this.calendarSystem.getMarkerMonth(e)])}startOfWeek(e){return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(e),this.calendarSystem.getMarkerMonth(e),e.getUTCDate()-(e.getUTCDay()-this.weekDow+7)%7])}computeWeekNumber(e){return this.weekNumberFunc?this.weekNumberFunc(this.toDate(e)):function(e,t,n){let r=e.getUTCFullYear(),i=be(e,r,t,n);if(i<1)return be(e,r-1,t,n);let s=be(e,r+1,t,n);return s>=1?Math.min(i,s):i}(e,this.weekDow,this.weekDoy)}format(e,t,n={}){return t.format({marker:e,timeZoneOffset:null!=n.forcedTzo?n.forcedTzo:this.offsetForMarker(e)},this)}formatRange(e,t,n,r={}){return r.isEndExclusive&&(t=pe(t,-1)),n.formatRange({marker:e,timeZoneOffset:null!=r.forcedStartTzo?r.forcedStartTzo:this.offsetForMarker(e)},{marker:t,timeZoneOffset:null!=r.forcedEndTzo?r.forcedEndTzo:this.offsetForMarker(t)},this,r.defaultSeparator)}formatIso(e,t={}){let n=null;return t.omitTimeZoneOffset||(n=null!=t.forcedTzo?t.forcedTzo:this.offsetForMarker(e)),Ce(e,n,t.omitTime)}timestampToMarker(e){return"local"===this.timeZone?Se(Ae(new Date(e))):"UTC"!==this.timeZone&&this.namedTimeZoneImpl?Se(this.namedTimeZoneImpl.timestampToArray(e)):new Date(e)}offsetForMarker(e){return"local"===this.timeZone?-Ee(_e(e)).getTimezoneOffset():"UTC"===this.timeZone?0:this.namedTimeZoneImpl?this.namedTimeZoneImpl.offsetForArray(_e(e)):null}toDate(e,t){return"local"===this.timeZone?Ee(_e(e)):"UTC"===this.timeZone?new Date(e.valueOf()):this.namedTimeZoneImpl?new Date(e.valueOf()-1e3*this.namedTimeZoneImpl.offsetForArray(_e(e))*60):new Date(e.valueOf()-(t||0))}}class hr{constructor(){this.strictOrder=!1,this.allowReslicing=!1,this.maxCoord=-1,this.maxStackCnt=-1,this.levelCoords=[],this.entriesByLevel=[],this.stackCnts={}}addSegs(e){let t=[];for(let n of e)this.insertEntry(n,t);return t}insertEntry(e,t){let n=this.findInsertion(e);return this.isInsertionValid(n,e)?(this.insertEntryAt(e,n),1):this.handleInvalidInsertion(n,e,t)}isInsertionValid(e,t){return(-1===this.maxCoord||e.levelCoord+t.thickness<=this.maxCoord)&&(-1===this.maxStackCnt||e.stackCnt<this.maxStackCnt)}handleInvalidInsertion(e,t,n){return this.allowReslicing&&e.touchingEntry?this.splitEntry(t,e.touchingEntry,n):(n.push(t),0)}splitEntry(e,t,n){let r=0,i=[],s=e.span,o=t.span;return s.start<o.start&&(r+=this.insertEntry({index:e.index,thickness:e.thickness,span:{start:s.start,end:o.start}},i)),s.end>o.end&&(r+=this.insertEntry({index:e.index,thickness:e.thickness,span:{start:o.end,end:s.end}},i)),r?(n.push({index:e.index,thickness:e.thickness,span:mr(o,s)},...i),r):(n.push(e),0)}insertEntryAt(e,t){let{entriesByLevel:n,levelCoords:r}=this;-1===t.lateral?(vr(r,t.level,t.levelCoord),vr(n,t.level,[e])):vr(n[t.level],t.lateral,e),this.stackCnts[pr(e)]=t.stackCnt}findInsertion(e){let{levelCoords:t,entriesByLevel:n,strictOrder:r,stackCnts:i}=this,s=t.length,o=0,a=-1,l=-1,c=null,u=0;for(let f=0;f<s;f+=1){let s=t[f];if(!r&&s>=o+e.thickness)break;let d,h=n[f],p=yr(h,e.span.start,fr),g=p[0]+p[1];for(;(d=h[g])&&d.span.start<e.span.end;){let e=s+d.thickness;e>o&&(o=e,c=d,a=f,l=g),e===o&&(u=Math.max(u,i[pr(d)]+1)),g+=1}}let d=0;if(c)for(d=a+1;d<s&&t[d]<o;)d+=1;let h=-1;return d<s&&t[d]===o&&(h=yr(n[d],e.span.end,fr)[0]),{touchingLevel:a,touchingLateral:l,touchingEntry:c,stackCnt:u,levelCoord:o,level:d,lateral:h}}toRects(){let{entriesByLevel:e,levelCoords:t}=this,n=e.length,r=[];for(let i=0;i<n;i+=1){let n=e[i],s=t[i];for(let e of n)r.push(Object.assign(Object.assign({},e),{levelCoord:s}))}return r}}function fr(e){return e.span.end}function pr(e){return e.index+":"+e.span.start}function gr(e){let t=[];for(let i of e){let e=[],s={span:i.span,entries:[i]};for(let i of t)mr(i.span,s.span)?s={entries:i.entries.concat(s.entries),span:(n=i.span,r=s.span,{start:Math.min(n.start,r.start),end:Math.max(n.end,r.end)})}:e.push(i);e.push(s),t=e}var n,r;return t}function mr(e,t){let n=Math.max(e.start,t.start),r=Math.min(e.end,t.end);return n<r?{start:n,end:r}:null}function vr(e,t,n){e.splice(t,0,n)}function yr(e,t,n){let r=0,i=e.length;if(!i||t<n(e[r]))return[0,0];if(t>n(e[i-1]))return[i,0];for(;r<i;){let s=Math.floor(r+(i-r)/2),o=n(e[s]);if(t<o)i=s;else{if(!(t>o))return[s,1];r=s+1}}return[r,0]}class br{constructor(e){this.component=e.component,this.isHitComboAllowed=e.isHitComboAllowed||null}destroy(){}}function Dr(e,t){return{component:e,el:t.el,useEventCenter:null==t.useEventCenter||t.useEventCenter,isHitComboAllowed:t.isHitComboAllowed||null}}function Ar(e){return{[e.component.uid]:e}}const Er={};class _r{constructor(e,t){this.emitter=new cn}destroy(){}setMirrorIsVisible(e){}setMirrorNeedsRevert(e){}setAutoScrollEnabled(e){}}const Sr={};Boolean;class wr extends _n{constructor(){super(...arguments),this.state={forPrint:!1},this.handleBeforePrint=()=>{this.setState({forPrint:!0})},this.handleAfterPrint=()=>{this.setState({forPrint:!1})}}render(){let{props:e}=this,{options:t}=e,{forPrint:n}=this.state,r=n||"auto"===t.height||"auto"===t.contentHeight,i=r||null==t.height?"":t.height,s=["fc",n?"fc-media-print":"fc-media-screen",`fc-direction-${t.direction}`,e.theme.getClass("root")];return Bt()||s.push("fc-liquid-hack"),e.children(s,i,r,n)}componentDidMount(){let{emitter:e}=this.props;e.on("_beforeprint",this.handleBeforePrint),e.on("_afterprint",this.handleAfterPrint)}componentWillUnmount(){let{emitter:e}=this.props;e.off("_beforeprint",this.handleBeforePrint),e.off("_afterprint",this.handleAfterPrint)}}const Tr="fc-col-header-cell";function Cr(e){return e.text}class xr extends _n{constructor(){super(...arguments),this.id=R(),this.queuedDomNodes=[],this.currentDomNodes=[],this.handleEl=e=>{this.props.elRef&&Sn(this.props.elRef,e)}}render(){const{props:e,context:t}=this,{options:n}=t,{customGenerator:i,defaultGenerator:s,renderProps:o}=e,a=Or(e);let l,c,u=!1,d=[];if(null!=i){const e="function"==typeof i?i(o,r.az):i;if(!0===e)u=!0;else{const t=e&&"object"==typeof e;t&&"html"in e?a.dangerouslySetInnerHTML={__html:e.html}:t&&"domNodes"in e?d=Array.prototype.slice.call(e.domNodes):t||"function"==typeof e?c=e:l=e}}else u=!Rr(e.generatorName,n);return u&&s&&(l=s(o)),this.queuedDomNodes=d,this.currentGeneratorMeta=c,(0,r.az)(e.elTag,a,l)}componentDidMount(){this.applyQueueudDomNodes(),this.triggerCustomRendering(!0)}componentDidUpdate(){this.applyQueueudDomNodes(),this.triggerCustomRendering(!0)}componentWillUnmount(){this.triggerCustomRendering(!1)}triggerCustomRendering(e){var t;const{props:n,context:r}=this,{handleCustomRendering:i,customRenderingMetaMap:s}=r.options;if(i){const r=null!==(t=this.currentGeneratorMeta)&&void 0!==t?t:null==s?void 0:s[n.generatorName];r&&i(Object.assign(Object.assign({id:this.id,isActive:e,containerEl:this.base,reportNewContainerEl:this.handleEl,generatorMeta:r},n),{elClasses:(n.elClasses||[]).filter(kr)}))}}applyQueueudDomNodes(){const{queuedDomNodes:e,currentDomNodes:t}=this,n=this.base;if(!ue(e,t)){t.forEach(h);for(let t of e)n.appendChild(t);this.currentDomNodes=e}}}function Rr(e,t){var n;return Boolean(t.handleCustomRendering&&e&&(null===(n=t.customRenderingMetaMap)||void 0===n?void 0:n[e]))}function Or(e,t){const n=Object.assign(Object.assign({},e.elAttrs),{ref:e.elRef});return(e.elClasses||t)&&(n.className=(e.elClasses||[]).concat(t||[]).concat(n.className||[]).filter(Boolean).join(" ")),e.elStyle&&(n.style=e.elStyle),n}function kr(e){return Boolean(e)}xr.addPropsEquality({elClasses:ue,elStyle:se,elAttrs:function(e,t){const n=ae(e,t);for(let r of n)if(!oe.test(r))return!1;return!0},renderProps:se});const Mr=yn(0);class Ir extends r.wA{constructor(){super(...arguments),this.InnerContent=zr.bind(void 0,this),this.handleRootEl=e=>{this.rootEl=e,this.props.elRef&&Sn(this.props.elRef,e)}}render(){const{props:e}=this,t=function(e,t){const n="function"==typeof e?e(t):e||[];return"string"==typeof n?[n]:n}(e.classNameGenerator,e.renderProps);if(e.children){const n=Or(e,t),i=e.children(this.InnerContent,e.renderProps,n);return e.elTag?(0,r.az)(e.elTag,n,i):i}return(0,r.az)(xr,Object.assign(Object.assign({},e),{elRef:this.handleRootEl,elTag:e.elTag||"div",elClasses:(e.elClasses||[]).concat(t),renderId:this.context}))}componentDidMount(){var e,t;null===(t=(e=this.props).didMount)||void 0===t||t.call(e,Object.assign(Object.assign({},this.props.renderProps),{el:this.rootEl||this.base}))}componentWillUnmount(){var e,t;null===(t=(e=this.props).willUnmount)||void 0===t||t.call(e,Object.assign(Object.assign({},this.props.renderProps),{el:this.rootEl||this.base}))}}function zr(e,t){const n=e.props;return(0,r.az)(xr,Object.assign({renderProps:n.renderProps,generatorName:n.generatorName,customGenerator:n.customGenerator,defaultGenerator:n.defaultGenerator,renderId:e.context},t))}Ir.contextType=Mr;class Nr extends _n{render(){let{dateEnv:e,options:t,theme:n,viewApi:i}=this.context,{props:s}=this,{date:o,dateProfile:a}=s,l=Qt(o,s.todayRange,null,a),c=[Tr].concat(Zt(l,n)),u=e.format(o,s.dayHeaderFormat),d=!l.isDisabled&&s.colCnt>1?Kt(this.context,o):{},h=Object.assign(Object.assign(Object.assign({date:e.toDate(o),view:i},s.extraRenderProps),{text:u}),l);return(0,r.az)(Ir,{elTag:"th",elClasses:c,elAttrs:Object.assign({role:"columnheader",colSpan:s.colSpan,"data-date":l.isDisabled?void 0:xe(o)},s.extraDataAttrs),renderProps:h,generatorName:"dayHeaderContent",customGenerator:t.dayHeaderContent,defaultGenerator:Cr,classNameGenerator:t.dayHeaderClassNames,didMount:t.dayHeaderDidMount,willUnmount:t.dayHeaderWillUnmount},(e=>(0,r.az)("div",{className:"fc-scrollgrid-sync-inner"},!l.isDisabled&&(0,r.az)(e,{elTag:"a",elAttrs:d,elClasses:["fc-col-header-cell-cushion",s.isSticky&&"fc-sticky"]}))))}}const Pr=qe({weekday:"long"});class Yr extends _n{render(){let{props:e}=this,{dateEnv:t,theme:n,viewApi:i,options:s}=this.context,o=fe(new Date(2592e5),e.dow),a={dow:e.dow,isDisabled:!1,isFuture:!1,isPast:!1,isToday:!1,isOther:!1},l=t.format(o,e.dayHeaderFormat),c=Object.assign(Object.assign(Object.assign(Object.assign({date:o},a),{view:i}),e.extraRenderProps),{text:l});return(0,r.az)(Ir,{elTag:"th",elClasses:[Tr,...Zt(a,n),...e.extraClassNames||[]],elAttrs:Object.assign({role:"columnheader",colSpan:e.colSpan},e.extraDataAttrs),renderProps:c,generatorName:"dayHeaderContent",customGenerator:s.dayHeaderContent,defaultGenerator:Cr,classNameGenerator:s.dayHeaderClassNames,didMount:s.dayHeaderDidMount,willUnmount:s.dayHeaderWillUnmount},(n=>(0,r.az)("div",{className:"fc-scrollgrid-sync-inner"},(0,r.az)(n,{elTag:"a",elClasses:["fc-col-header-cell-cushion",e.isSticky&&"fc-sticky"],elAttrs:{"aria-label":t.format(o,Pr)}}))))}}class Br extends r.wA{constructor(e,t){super(e,t),this.initialNowDate=xn(t.options.now,t.dateEnv),this.initialNowQueriedMs=(new Date).valueOf(),this.state=this.computeTiming().currentState}render(){let{props:e,state:t}=this;return e.children(t.nowDate,t.todayRange)}componentDidMount(){this.setTimeout()}componentDidUpdate(e){e.unit!==this.props.unit&&(this.clearTimeout(),this.setTimeout())}componentWillUnmount(){this.clearTimeout()}computeTiming(){let{props:e,context:t}=this,n=pe(this.initialNowDate,(new Date).valueOf()-this.initialNowQueriedMs),r=t.dateEnv.startOf(n,e.unit),i=t.dateEnv.add(r,W(1,e.unit)),s=i.valueOf()-n.valueOf();return s=Math.min(864e5,s),{currentState:{nowDate:r,todayRange:Hr(r)},nextState:{nowDate:i,todayRange:Hr(i)},waitMs:s}}setTimeout(){let{nextState:e,waitMs:t}=this.computeTiming();this.timeoutId=setTimeout((()=>{this.setState(e,(()=>{this.setTimeout()}))}),t)}clearTimeout(){this.timeoutId&&clearTimeout(this.timeoutId)}}function Hr(e){let t=ye(e);return{start:t,end:fe(t,1)}}Br.contextType=Dn;class jr extends _n{constructor(){super(...arguments),this.createDayHeaderFormatter=Me(Ur)}render(){let{context:e}=this,{dates:t,dateProfile:n,datesRepDistinctDays:i,renderIntro:s}=this.props,o=this.createDayHeaderFormatter(e.options.dayHeaderFormat,i,t.length);return(0,r.az)(Br,{unit:"day"},((e,a)=>(0,r.az)("tr",{role:"row"},s&&s("day"),t.map((e=>i?(0,r.az)(Nr,{key:e.toISOString(),date:e,dateProfile:n,todayRange:a,colCnt:t.length,dayHeaderFormat:o}):(0,r.az)(Yr,{key:e.getUTCDay(),dow:e.getUTCDay(),dayHeaderFormat:o}))))))}}function Ur(e,t,n){return e||function(e,t){return qe(!e||t>10?{weekday:"short"}:t>1?{weekday:"short",month:"numeric",day:"numeric",omitCommas:!0}:{weekday:"long"})}(t,n)}class Lr{constructor(e,t){let n=e.start,{end:r}=e,i=[],s=[],o=-1;for(;n<r;)t.isHiddenDay(n)?i.push(o+.5):(o+=1,i.push(o),s.push(n)),n=fe(n,1);this.dates=s,this.indices=i,this.cnt=s.length}sliceRange(e){let t=this.getDateDayIndex(e.start),n=this.getDateDayIndex(fe(e.end,-1)),r=Math.max(0,t),i=Math.min(this.cnt-1,n);return r=Math.ceil(r),i=Math.floor(i),r<=i?{firstIndex:r,lastIndex:i,isStart:t===r,isEnd:n===i}:null}getDateDayIndex(e){let{indices:t}=this,n=Math.floor(me(this.dates[0],e));return n<0?t[0]-1:n>=t.length?t[t.length-1]+1:t[n]}}class Vr{constructor(e,t){let n,r,i,{dates:s}=e;if(t){for(r=s[0].getUTCDay(),n=1;n<s.length&&s[n].getUTCDay()!==r;n+=1);i=Math.ceil(s.length/n)}else i=1,n=s.length;this.rowCnt=i,this.colCnt=n,this.daySeries=e,this.cells=this.buildCells(),this.headerDates=this.buildHeaderDates()}buildCells(){let e=[];for(let t=0;t<this.rowCnt;t+=1){let n=[];for(let e=0;e<this.colCnt;e+=1)n.push(this.buildCell(t,e));e.push(n)}return e}buildCell(e,t){let n=this.daySeries.dates[e*this.colCnt+t];return{key:n.toISOString(),date:n}}buildHeaderDates(){let e=[];for(let t=0;t<this.colCnt;t+=1)e.push(this.cells[0][t].date);return e}sliceRange(e){let{colCnt:t}=this,n=this.daySeries.sliceRange(e),r=[];if(n){let{firstIndex:e,lastIndex:i}=n,s=e;for(;s<=i;){let o=Math.floor(s/t),a=Math.min((o+1)*t,i+1);r.push({row:o,firstCol:s%t,lastCol:(a-1)%t,isStart:n.isStart&&s===e,isEnd:n.isEnd&&a-1===i}),s=a}}return r}}class Wr{constructor(){this.sliceBusinessHours=Me(this._sliceBusinessHours),this.sliceDateSelection=Me(this._sliceDateSpan),this.sliceEventStore=Me(this._sliceEventStore),this.sliceEventDrag=Me(this._sliceInteraction),this.sliceEventResize=Me(this._sliceInteraction),this.forceDayIfListItem=!1}sliceProps(e,t,n,r,...i){let{eventUiBases:s}=e,o=this.sliceEventStore(e.eventStore,s,t,n,...i);return{dateSelectionSegs:this.sliceDateSelection(e.dateSelection,t,n,s,r,...i),businessHourSegs:this.sliceBusinessHours(e.businessHours,t,n,r,...i),fgEventSegs:o.fg,bgEventSegs:o.bg,eventDrag:this.sliceEventDrag(e.eventDrag,s,t,n,...i),eventResize:this.sliceEventResize(e.eventResize,s,t,n,...i),eventSelection:e.eventSelection}}sliceNowDate(e,t,n,r,...i){return this._sliceDateSpan({range:{start:e,end:pe(e,1)},allDay:!1},t,n,{},r,...i)}_sliceBusinessHours(e,t,n,r,...i){return e?this._sliceEventStore(ot(e,Fr(t,Boolean(n)),r),{},t,n,...i).bg:[]}_sliceEventStore(e,t,n,r,...i){if(e){let s=jn(e,t,Fr(n,Boolean(r)),r);return{bg:this.sliceEventRanges(s.bg,i),fg:this.sliceEventRanges(s.fg,i)}}return{bg:[],fg:[]}}_sliceInteraction(e,t,n,r,...i){if(!e)return null;let s=jn(e.mutatedEvents,t,Fr(n,Boolean(r)),r);return{segs:this.sliceEventRanges(s.fg,i),affectedInstances:e.affectedEvents.instances,isEvent:e.isEvent}}_sliceDateSpan(e,t,n,r,i,...s){if(!e)return[];let o=Fr(t,Boolean(n)),a=Wt(e.range,o);if(a){let t=function(e,t,n){let r=St({editable:!1},n),i=Tt(r.refined,r.extra,"",e.allDay,!0,n);return{def:i,ui:Fn(i,t),instance:st(i.defId,e.range),range:e.range,isStart:!0,isEnd:!0}}(e=Object.assign(Object.assign({},e),{range:a}),r,i),n=this.sliceRange(e.range,...s);for(let e of n)e.eventRange=t;return n}return[]}sliceEventRanges(e,t){let n=[];for(let r of e)n.push(...this.sliceEventRange(r,t));return n}sliceEventRange(e,t){let n=e.range;this.forceDayIfListItem&&"list-item"===e.ui.display&&(n={start:n.start,end:fe(n.start,1)});let r=this.sliceRange(n,...t);for(let i of r)i.eventRange=e,i.isStart=e.isStart&&i.isStart,i.isEnd=e.isEnd&&i.isEnd;return r}}function Fr(e,t){let n=e.activeRange;return t?n:{start:pe(n.start,e.slotMinTime.milliseconds),end:pe(n.end,e.slotMaxTime.milliseconds-864e5)}}function Gr(e,t,n,r,i){switch(t.type){case"RECEIVE_EVENTS":return function(e,t,n,r,i,s){if(t&&n===t.latestFetchId){let n=lt(qr(i,t,s),t,s);return r&&(n=ot(n,r,s)),ht(Xr(e,t.sourceId),n)}return e}(e,n[t.sourceId],t.fetchId,t.fetchRange,t.rawEvents,i);case"RESET_RAW_EVENTS":return function(e,t,n,r,i){const{defIdMap:s,instanceIdMap:o}=function(e){const{defs:t,instances:n}=e,r={},i={};for(let s in t){const e=t[s],{publicId:n}=e;n&&(r[n]=s)}for(let s in n){const e=t[n[s].defId],{publicId:r}=e;r&&(i[r]=s)}return{defIdMap:r,instanceIdMap:i}}(e);let a=lt(qr(n,t,i),t,i,!1,s,o);return ot(a,r,i)}(e,n[t.sourceId],t.rawEvents,r.activeRange,i);case"ADD_EVENTS":return function(e,t,n,r){n&&(t=ot(t,n,r));return ht(e,t)}(e,t.eventStore,r?r.activeRange:null,i);case"RESET_EVENTS":return t.eventStore;case"MERGE_EVENTS":return ht(e,t.eventStore);case"PREV":case"NEXT":case"CHANGE_DATE":case"CHANGE_VIEW_TYPE":return r?ot(e,r.activeRange,i):e;case"REMOVE_EVENTS":return function(e,t){let{defs:n,instances:r}=e,i={},s={};for(let o in n)t.defs[o]||(i[o]=n[o]);for(let o in r)!t.instances[o]&&i[r[o].defId]&&(s[o]=r[o]);return{defs:i,instances:s}}(e,t.eventStore);case"REMOVE_EVENT_SOURCE":return Xr(e,t.sourceId);case"REMOVE_ALL_EVENT_SOURCES":return ft(e,(e=>!e.sourceId));case"REMOVE_ALL_EVENTS":return{defs:{},instances:{}};default:return e}}function qr(e,t,n){let r=n.options.eventDataTransform,i=t?t.eventDataTransform:null;return i&&(e=Qr(e,i)),r&&(e=Qr(e,r)),e}function Qr(e,t){let n;if(t){n=[];for(let r of e){let e=t(r);e?n.push(e):null==e&&n.push(r)}}else n=e;return n}function Zr(e,t,n){let{defs:r}=e,i=ne(e.instances,(e=>r[e.defId].allDay?e:Object.assign(Object.assign({},e),{range:{start:n.createMarker(t.toDate(e.range.start,e.forcedStartTzo)),end:n.createMarker(t.toDate(e.range.end,e.forcedEndTzo))},forcedStartTzo:n.canComputeOffset?null:e.forcedStartTzo,forcedEndTzo:n.canComputeOffset?null:e.forcedEndTzo})));return{defs:r,instances:i}}function Xr(e,t){return ft(e,(e=>e.sourceId!==t))}function Jr(e,t,n){let{instances:r}=e.mutatedEvents;for(let i in r)if(!Gt(t.validRange,r[i].range))return!1;return $r({eventDrag:e},n)}function Kr(e,t,n){return!!Gt(t.validRange,e.range)&&$r({dateSelection:e},n)}function $r(e,t){let n=t.getCurrentData(),r=Object.assign({businessHours:n.businessHours,dateSelection:"",eventStore:n.eventStore,eventUiBases:n.eventUiBases,eventSelection:"",eventDrag:null,eventResize:null},e);return(t.pluginHooks.isPropsValid||ei)(r,t)}function ei(e,t,n={},r){return!(e.eventDrag&&!function(e,t,n,r){let i=t.getCurrentData(),s=e.eventDrag,o=s.mutatedEvents,a=o.defs,l=o.instances,c=Wn(a,s.isEvent?e.eventUiBases:{"":i.selectionConfig});r&&(c=ne(c,r));let u=(p=e.eventStore,g=s.affectedEvents.instances,{defs:p.defs,instances:te(p.instances,(e=>!g[e.instanceId]))}),d=u.defs,h=u.instances,f=Wn(d,e.eventUiBases);var p,g;for(let m in l){let r=l[m],o=r.range,p=c[r.defId],g=a[r.defId];if(!ti(p.constraints,o,u,e.businessHours,t))return!1;let{eventOverlap:v}=t.options,y="function"==typeof v?v:null;for(let e in h){let n=h[e];if(Ft(o,n.range)){if(!1===f[n.defId].overlap&&s.isEvent)return!1;if(!1===p.overlap)return!1;if(y&&!y(new Yn(t,d[n.defId],n),new Yn(t,g,r)))return!1}}let b=i.eventStore;for(let e of p.allows){let i,s=Object.assign(Object.assign({},n),{range:r.range,allDay:g.allDay}),o=b.defs[g.defId],a=b.instances[m];if(i=o?new Yn(t,o,a):new Yn(t,g),!e(kn(s,t),i))return!1}}return!0}(e,t,n,r))&&!(e.dateSelection&&!function(e,t,n,r){let i=e.eventStore,s=i.defs,o=i.instances,a=e.dateSelection,l=a.range,{selectionConfig:c}=t.getCurrentData();r&&(c=r(c));if(!ti(c.constraints,l,i,e.businessHours,t))return!1;let{selectOverlap:u}=t.options,d="function"==typeof u?u:null;for(let h in o){let e=o[h];if(Ft(l,e.range)){if(!1===c.overlap)return!1;if(d&&!d(new Yn(t,s[e.defId],e),null))return!1}}for(let h of c.allows){if(!h(kn(Object.assign(Object.assign({},n),a),t),null))return!1}return!0}(e,t,n,r))}function ti(e,t,n,r,i){for(let s of e)if(!ii(ni(s,t,n,r,i),t))return!1;return!0}function ni(e,t,n,r,i){return"businessHours"===e?ri(ot(r,t,i)):"string"==typeof e?ri(ft(n,(t=>t.groupId===e))):"object"==typeof e&&e?ri(ot(e,t,i)):[]}function ri(e){let{instances:t}=e,n=[];for(let r in t)n.push(t[r].range);return n}function ii(e,t){for(let n of e)if(Gt(n,t))return!0;return!1}class si extends Error{constructor(e,t){super(e),this.response=t}}function oi(e,t,n){const r={method:e=e.toUpperCase()};return"GET"===e?t+=(-1===t.indexOf("?")?"?":"&")+new URLSearchParams(n):(r.body=new URLSearchParams(n),r.headers={"Content-Type":"application/x-www-form-urlencoded"}),fetch(t,r).then((e=>{if(e.ok)return e.json().then((t=>[t,e]),(()=>{throw new si("Failure parsing JSON",e)}));throw new si("Request failed",e)}))}class ai{constructor(e){this.drainedOption=e,this.isRunning=!1,this.isDirty=!1,this.pauseDepths={},this.timeoutId=0}request(e){this.isDirty=!0,this.isPaused()||(this.clearTimeout(),null==e?this.tryDrain():this.timeoutId=setTimeout(this.tryDrain.bind(this),e))}pause(e=""){let{pauseDepths:t}=this;t[e]=(t[e]||0)+1,this.clearTimeout()}resume(e="",t){let{pauseDepths:n}=this;if(e in n){if(t)delete n[e];else{n[e]-=1,n[e]<=0&&delete n[e]}this.tryDrain()}}isPaused(){return Object.keys(this.pauseDepths).length}tryDrain(){if(!this.isRunning&&!this.isPaused()){for(this.isRunning=!0;this.isDirty;)this.isDirty=!1,this.drained();this.isRunning=!1}}clear(){this.clearTimeout(),this.isDirty=!1,this.pauseDepths={}}clearTimeout(){this.timeoutId&&(clearTimeout(this.timeoutId),this.timeoutId=0)}drained(){this.drainedOption&&this.drainedOption()}}const li=/^(visible|hidden)$/;class ci extends _n{constructor(){super(...arguments),this.handleEl=e=>{this.el=e,Sn(this.props.elRef,e)}}render(){let{props:e}=this,{liquid:t,liquidIsAbsolute:n}=e,i=t&&n,s=["fc-scroller"];return t&&(n?s.push("fc-scroller-liquid-absolute"):s.push("fc-scroller-liquid")),(0,r.az)("div",{ref:this.handleEl,className:s.join(" "),style:{overflowX:e.overflowX,overflowY:e.overflowY,left:i&&-(e.overcomeLeft||0)||"",right:i&&-(e.overcomeRight||0)||"",bottom:i&&-(e.overcomeBottom||0)||"",marginLeft:!i&&-(e.overcomeLeft||0)||"",marginRight:!i&&-(e.overcomeRight||0)||"",marginBottom:!i&&-(e.overcomeBottom||0)||"",maxHeight:e.maxHeight||""}},e.children)}needsXScrolling(){if(li.test(this.props.overflowX))return!1;let{el:e}=this,t=this.el.getBoundingClientRect().width-this.getYScrollbarWidth(),{children:n}=e;for(let r=0;r<n.length;r+=1){if(n[r].getBoundingClientRect().width>t)return!0}return!1}needsYScrolling(){if(li.test(this.props.overflowY))return!1;let{el:e}=this,t=this.el.getBoundingClientRect().height-this.getXScrollbarWidth(),{children:n}=e;for(let r=0;r<n.length;r+=1){if(n[r].getBoundingClientRect().height>t)return!0}return!1}getXScrollbarWidth(){return li.test(this.props.overflowX)?0:this.el.offsetHeight-this.el.clientHeight}getYScrollbarWidth(){return li.test(this.props.overflowY)?0:this.el.offsetWidth-this.el.clientWidth}}class ui{constructor(e){this.masterCallback=e,this.currentMap={},this.depths={},this.callbackMap={},this.handleValue=(e,t)=>{let{depths:n,currentMap:r}=this,i=!1,s=!1;null!==e?(i=t in r,r[t]=e,n[t]=(n[t]||0)+1,s=!0):(n[t]-=1,n[t]||(delete r[t],delete this.callbackMap[t],i=!0)),this.masterCallback&&(i&&this.masterCallback(null,String(t)),s&&this.masterCallback(e,String(t)))}}createRef(e){let t=this.callbackMap[e];return t||(t=this.callbackMap[e]=t=>{this.handleValue(t,String(e))}),t}collect(e,t,n){return function(e,t=0,n,r=1){let i=[];null==n&&(n=Object.keys(e).length);for(let s=t;s<n;s+=r){let t=e[s];void 0!==t&&i.push(t)}return i}(this.currentMap,e,t,n)}getAll(){return ie(this.currentMap)}}function di(e){let t=function(e,t){let n=e instanceof HTMLElement?[e]:e,r=[];for(let i=0;i<n.length;i+=1){let e=n[i].querySelectorAll(t);for(let t=0;t<e.length;t+=1)r.push(e[t])}return r}(e,".fc-scrollgrid-shrink"),n=0;for(let r of t)n=Math.max(n,U(r));return Math.ceil(n)}function hi(e,t){return e.liquid&&t.liquid}function fi(e,t){return ue(e,t,se)}function pi(e,t){let n=[];for(let i of e){let e=i.span||1;for(let s=0;s<e;s+=1)n.push((0,r.az)("col",{style:{width:"shrink"===i.width?gi(t):i.width||"",minWidth:i.minWidth||""}}))}return(0,r.az)("colgroup",{},...n)}function gi(e){return null==e?4:e}function mi(e,t){let n=["fc-scrollgrid-section",`fc-scrollgrid-section-${e.type}`,e.className];return t&&e.liquid&&null==e.maxHeight&&n.push("fc-scrollgrid-section-liquid"),e.isSticky&&n.push("fc-scrollgrid-section-sticky"),n}function vi(e){return(0,r.az)("div",{className:"fc-scrollgrid-sticky-shim",style:{width:e.clientWidth,minWidth:e.tableMinWidth}})}function yi(e){let{stickyHeaderDates:t}=e;return null!=t&&"auto"!==t||(t="auto"===e.height||"auto"===e.viewHeight),t}function bi(e){let{stickyFooterScrollbar:t}=e;return null!=t&&"auto"!==t||(t="auto"===e.height||"auto"===e.viewHeight),t}class Di extends _n{constructor(){super(...arguments),this.processCols=Me((e=>e),fi),this.renderMicroColGroup=Me(pi),this.scrollerRefs=new ui,this.scrollerElRefs=new ui(this._handleScrollerEl.bind(this)),this.state={shrinkWidth:null,forceYScrollbars:!1,scrollerClientWidths:{},scrollerClientHeights:{}},this.handleSizing=()=>{this.safeSetState(Object.assign({shrinkWidth:this.computeShrinkWidth()},this.computeScrollerDims()))}}render(){let{props:e,state:t,context:n}=this,i=e.sections||[],s=this.processCols(e.cols),o=this.renderMicroColGroup(s,t.shrinkWidth),a=function(e,t){let n=["fc-scrollgrid",t.theme.getClass("table")];return e&&n.push("fc-scrollgrid-liquid"),n}(e.liquid,n);e.collapsibleWidth&&a.push("fc-scrollgrid-collapsible");let l,c=i.length,u=0,d=[],h=[],f=[];for(;u<c&&"header"===(l=i[u]).type;)d.push(this.renderSection(l,o,!0)),u+=1;for(;u<c&&"body"===(l=i[u]).type;)h.push(this.renderSection(l,o,!1)),u+=1;for(;u<c&&"footer"===(l=i[u]).type;)f.push(this.renderSection(l,o,!0)),u+=1;let p=!Bt();const g={role:"rowgroup"};return(0,r.az)("table",{role:"grid",className:a.join(" "),style:{height:e.height}},Boolean(!p&&d.length)&&(0,r.az)("thead",g,...d),Boolean(!p&&h.length)&&(0,r.az)("tbody",g,...h),Boolean(!p&&f.length)&&(0,r.az)("tfoot",g,...f),p&&(0,r.az)("tbody",g,...d,...h,...f))}renderSection(e,t,n){return"outerContent"in e?(0,r.az)(r.HY,{key:e.key},e.outerContent):(0,r.az)("tr",{key:e.key,role:"presentation",className:mi(e,this.props.liquid).join(" ")},this.renderChunkTd(e,t,e.chunk,n))}renderChunkTd(e,t,n,i){if("outerContent"in n)return n.outerContent;let{props:s}=this,{forceYScrollbars:o,scrollerClientWidths:a,scrollerClientHeights:l}=this.state,c=function(e,t){return null!=t.maxHeight||hi(e,t)}(s,e),u=hi(s,e),d=s.liquid?o?"scroll":c?"auto":"hidden":"visible",h=e.key,f=function(e,t,n,i){let{expandRows:s}=n;return"function"==typeof t.content?t.content(n):(0,r.az)("table",{role:"presentation",className:[t.tableClassName,e.syncRowHeights?"fc-scrollgrid-sync-table":""].join(" "),style:{minWidth:n.tableMinWidth,width:n.clientWidth,height:s?n.clientHeight:""}},n.tableColGroupNode,(0,r.az)(i?"thead":"tbody",{role:"presentation"},"function"==typeof t.rowContent?t.rowContent(n):t.rowContent))}(e,n,{tableColGroupNode:t,tableMinWidth:"",clientWidth:s.collapsibleWidth||void 0===a[h]?null:a[h],clientHeight:void 0!==l[h]?l[h]:null,expandRows:e.expandRows,syncRowHeights:!1,rowSyncHeights:[],reportRowHeightChange:()=>{}},i);return(0,r.az)(i?"th":"td",{ref:n.elRef,role:"presentation"},(0,r.az)("div",{className:"fc-scroller-harness"+(u?" fc-scroller-harness-liquid":"")},(0,r.az)(ci,{ref:this.scrollerRefs.createRef(h),elRef:this.scrollerElRefs.createRef(h),overflowY:d,overflowX:s.liquid?"hidden":"visible",maxHeight:e.maxHeight,liquid:u,liquidIsAbsolute:!0},f)))}_handleScrollerEl(e,t){let n=function(e,t){for(let n of e)if(n.key===t)return n;return null}(this.props.sections,t);n&&Sn(n.chunk.scrollerElRef,e)}componentDidMount(){this.handleSizing(),this.context.addResizeHandler(this.handleSizing)}componentDidUpdate(){this.handleSizing()}componentWillUnmount(){this.context.removeResizeHandler(this.handleSizing)}computeShrinkWidth(){return function(e){for(let t of e)if("shrink"===t.width)return!0;return!1}(this.props.cols)?di(this.scrollerElRefs.getAll()):0}computeScrollerDims(){let e=nn(),{scrollerRefs:t,scrollerElRefs:n}=this,r=!1,i={},s={};for(let o in t.currentMap){let e=t.currentMap[o];if(e&&e.needsYScrolling()){r=!0;break}}for(let o of this.props.sections){let t=o.key,a=n.currentMap[t];if(a){let n=a.parentNode;i[t]=Math.floor(n.getBoundingClientRect().width-(r?e.y:0)),s[t]=Math.floor(n.getBoundingClientRect().height)}}return{forceYScrollbars:r,scrollerClientWidths:i,scrollerClientHeights:s}}}Di.addStateEquality({scrollerClientWidths:se,scrollerClientHeights:se});class Ai extends _n{constructor(){super(...arguments),this.handleEl=e=>{this.el=e,e&&Ln(e,this.props.seg)}}render(){const{props:e,context:t}=this,{options:n}=t,{seg:i}=e,{eventRange:s}=i,{ui:o}=s,a={event:new Yn(t,s.def,s.instance),view:t.viewApi,timeText:e.timeText,textColor:o.textColor,backgroundColor:o.backgroundColor,borderColor:o.borderColor,isDraggable:!e.disableDragging&&Qn(i,t),isStartResizable:!e.disableResizing&&Zn(i,t),isEndResizable:!e.disableResizing&&Xn(i),isMirror:Boolean(e.isDragging||e.isResizing||e.isDateSelecting),isStart:Boolean(i.isStart),isEnd:Boolean(i.isEnd),isPast:Boolean(e.isPast),isFuture:Boolean(e.isFuture),isToday:Boolean(e.isToday),isSelected:Boolean(e.isSelected),isDragging:Boolean(e.isDragging),isResizing:Boolean(e.isResizing)};return(0,r.az)(Ir,Object.assign({},e,{elRef:this.handleEl,elClasses:[...$n(a),...i.eventRange.ui.classNames,...e.elClasses||[]],renderProps:a,generatorName:"eventContent",customGenerator:n.eventContent,defaultGenerator:e.defaultGenerator,classNameGenerator:n.eventClassNames,didMount:n.eventDidMount,willUnmount:n.eventWillUnmount}))}componentDidUpdate(e){this.el&&this.props.seg!==e.seg&&Ln(this.el,this.props.seg)}}class Ei extends _n{render(){let{props:e,context:t}=this,{options:n}=t,{seg:i}=e,{ui:s}=i.eventRange,o=Jn(i,n.eventTimeFormat||e.defaultTimeFormat,t,e.defaultDisplayEventTime,e.defaultDisplayEventEnd);return(0,r.az)(Ai,Object.assign({},e,{elTag:"a",elStyle:{borderColor:s.borderColor,backgroundColor:s.backgroundColor},elAttrs:tr(i,t),defaultGenerator:_i,timeText:o}),((e,t)=>(0,r.az)(r.HY,null,(0,r.az)(e,{elTag:"div",elClasses:["fc-event-main"],elStyle:{color:t.textColor}}),Boolean(t.isStartResizable)&&(0,r.az)("div",{className:"fc-event-resizer fc-event-resizer-start"}),Boolean(t.isEndResizable)&&(0,r.az)("div",{className:"fc-event-resizer fc-event-resizer-end"}))))}}function _i(e){return(0,r.az)("div",{className:"fc-event-main-frame"},e.timeText&&(0,r.az)("div",{className:"fc-event-time"},e.timeText),(0,r.az)("div",{className:"fc-event-title-container"},(0,r.az)("div",{className:"fc-event-title fc-sticky"},e.event.title||(0,r.az)(r.HY,null,"\xa0"))))}const Si=e=>(0,r.az)(Dn.Consumer,null,(t=>{let{options:n}=t,i={isAxis:e.isAxis,date:t.dateEnv.toDate(e.date),view:t.viewApi};return(0,r.az)(Ir,Object.assign({},e,{elTag:e.elTag||"div",renderProps:i,generatorName:"nowIndicatorContent",customGenerator:n.nowIndicatorContent,classNameGenerator:n.nowIndicatorClassNames,didMount:n.nowIndicatorDidMount,willUnmount:n.nowIndicatorWillUnmount}))})),wi=qe({day:"numeric"});class Ti extends _n{constructor(){super(...arguments),this.refineRenderProps=Ie(xi)}render(){let{props:e,context:t}=this,{options:n}=t,i=this.refineRenderProps({date:e.date,dateProfile:e.dateProfile,todayRange:e.todayRange,isMonthStart:e.isMonthStart||!1,showDayNumber:e.showDayNumber,extraRenderProps:e.extraRenderProps,viewApi:t.viewApi,dateEnv:t.dateEnv,monthStartFormat:n.monthStartFormat});return(0,r.az)(Ir,Object.assign({},e,{elClasses:[...Zt(i,t.theme),...e.elClasses||[]],elAttrs:Object.assign(Object.assign({},e.elAttrs),i.isDisabled?{}:{"data-date":xe(e.date)}),renderProps:i,generatorName:"dayCellContent",customGenerator:n.dayCellContent,defaultGenerator:e.defaultGenerator,classNameGenerator:i.isDisabled?void 0:n.dayCellClassNames,didMount:n.dayCellDidMount,willUnmount:n.dayCellWillUnmount}))}}function Ci(e){return Boolean(e.dayCellContent||Rr("dayCellContent",e))}function xi(e){let{date:t,dateEnv:n,dateProfile:r,isMonthStart:i}=e,s=Qt(t,e.todayRange,null,r),o=e.showDayNumber?n.format(t,i?e.monthStartFormat:wi):"";return Object.assign(Object.assign(Object.assign({date:n.toDate(t),view:e.viewApi},s),{isMonthStart:i,dayNumberText:o}),e.extraRenderProps)}class Ri extends _n{render(){let{props:e}=this,{seg:t}=e;return(0,r.az)(Ai,{elTag:"div",elClasses:["fc-bg-event"],elStyle:{backgroundColor:t.eventRange.ui.backgroundColor},defaultGenerator:Oi,seg:t,timeText:"",isDragging:!1,isResizing:!1,isDateSelecting:!1,isSelected:!1,isPast:e.isPast,isFuture:e.isFuture,isToday:e.isToday,disableDragging:!0,disableResizing:!0})}}function Oi(e){let{title:t}=e.event;return t&&(0,r.az)("div",{className:"fc-event-title"},e.event.title)}function ki(e){return(0,r.az)("div",{className:`fc-${e}`})}const Mi=e=>(0,r.az)(Dn.Consumer,null,(t=>{let{dateEnv:n,options:i}=t,{date:s}=e,o=i.weekNumberFormat||e.defaultFormat,a={num:n.computeWeekNumber(s),text:n.format(s,o),date:s};return(0,r.az)(Ir,Object.assign({},e,{renderProps:a,generatorName:"weekNumberContent",customGenerator:i.weekNumberContent,defaultGenerator:Ii,classNameGenerator:i.weekNumberClassNames,didMount:i.weekNumberDidMount,willUnmount:i.weekNumberWillUnmount}))}));function Ii(e){return e.text}class zi extends _n{constructor(){super(...arguments),this.state={titleId:D()},this.handleRootEl=e=>{this.rootEl=e,this.props.elRef&&Sn(this.props.elRef,e)},this.handleDocumentMouseDown=e=>{const t=y(e);this.rootEl.contains(t)||this.handleCloseClick()},this.handleDocumentKeyDown=e=>{"Escape"===e.key&&this.handleCloseClick()},this.handleCloseClick=()=>{let{onClose:e}=this.props;e&&e()}}render(){let{theme:e,options:t}=this.context,{props:n,state:s}=this,o=["fc-popover",e.getClass("popover")].concat(n.extraClassNames||[]);return(0,i.jz)((0,r.az)("div",Object.assign({},n.extraAttrs,{id:n.id,className:o.join(" "),"aria-labelledby":s.titleId,ref:this.handleRootEl}),(0,r.az)("div",{className:"fc-popover-header "+e.getClass("popoverHeader")},(0,r.az)("span",{className:"fc-popover-title",id:s.titleId},n.title),(0,r.az)("span",{className:"fc-popover-close "+e.getIconClass("close"),title:t.closeHint,onClick:this.handleCloseClick})),(0,r.az)("div",{className:"fc-popover-body "+e.getClass("popoverContent")},n.children)),n.parentEl)}componentDidMount(){document.addEventListener("mousedown",this.handleDocumentMouseDown),document.addEventListener("keydown",this.handleDocumentKeyDown),this.updateSize()}componentWillUnmount(){document.removeEventListener("mousedown",this.handleDocumentMouseDown),document.removeEventListener("keydown",this.handleDocumentKeyDown)}updateSize(){let{isRtl:e}=this.context,{alignmentEl:t,alignGridTop:n}=this.props,{rootEl:r}=this,i=function(e){let t=an(e),n=e.getBoundingClientRect();for(let r of t){let e=It(n,r.getBoundingClientRect());if(!e)return null;n=e}return n}(t);if(i){let s=r.getBoundingClientRect(),o=n?f(t,".fc-scrollgrid").getBoundingClientRect().top:i.top,a=e?i.right-s.width:i.left;o=Math.max(o,10),a=Math.min(a,document.documentElement.clientWidth-10-s.width),a=Math.max(a,10);let l=r.offsetParent.getBoundingClientRect();m(r,{top:o-l.top,left:a-l.left})}}}class Ni extends wn{constructor(){super(...arguments),this.handleRootEl=e=>{this.rootEl=e,e?this.context.registerInteractiveComponent(this,{el:e,useEventCenter:!1}):this.context.unregisterInteractiveComponent(this)}}render(){let{options:e,dateEnv:t}=this.context,{props:n}=this,{startDate:i,todayRange:s,dateProfile:o}=n,a=t.format(i,e.dayPopoverFormat);return(0,r.az)(Ti,{elRef:this.handleRootEl,date:i,dateProfile:o,todayRange:s},((t,i,s)=>(0,r.az)(zi,{elRef:s.ref,id:n.id,title:a,extraClassNames:["fc-more-popover"].concat(s.className||[]),extraAttrs:s,parentEl:n.parentEl,alignmentEl:n.alignmentEl,alignGridTop:n.alignGridTop,onClose:n.onClose},Ci(e)&&(0,r.az)(t,{elTag:"div",elClasses:["fc-more-popover-misc"]}),n.children)))}queryHit(e,t,n,r){let{rootEl:i,props:s}=this;return e>=0&&e<n&&t>=0&&t<r?{dateProfile:s.dateProfile,dateSpan:Object.assign({allDay:!s.forceTimed,range:{start:s.startDate,end:s.endDate}},s.extraDateSpan),dayEl:i,rect:{left:0,top:0,right:n,bottom:r},layer:1}:null}}class Pi extends _n{constructor(){super(...arguments),this.state={isPopoverOpen:!1,popoverId:D()},this.handleLinkEl=e=>{this.linkEl=e,this.props.elRef&&Sn(this.props.elRef,e)},this.handleClick=e=>{let{props:t,context:n}=this,{moreLinkClick:r}=n.options,i=Bi(t).start;function s(e){let{def:t,instance:r,range:i}=e.eventRange;return{event:new Yn(n,t,r),start:n.dateEnv.toDate(i.start),end:n.dateEnv.toDate(i.end),isStart:e.isStart,isEnd:e.isEnd}}"function"==typeof r&&(r=r({date:i,allDay:Boolean(t.allDayDate),allSegs:t.allSegs.map(s),hiddenSegs:t.hiddenSegs.map(s),jsEvent:e,view:n.viewApi})),r&&"popover"!==r?"string"==typeof r&&n.calendarApi.zoomTo(i,r):this.setState({isPopoverOpen:!0})},this.handlePopoverClose=()=>{this.setState({isPopoverOpen:!1})}}render(){let{props:e,state:t}=this;return(0,r.az)(Dn.Consumer,null,(n=>{let{viewApi:i,options:s,calendarApi:o}=n,{moreLinkText:a}=s,{moreCnt:l}=e,c=Bi(e),u="function"==typeof a?a.call(o,l):`+${l} ${a}`,d=B(s.moreLinkHint,[l],u),h={num:l,shortText:`+${l}`,text:u,view:i};return(0,r.az)(r.HY,null,Boolean(e.moreCnt)&&(0,r.az)(Ir,{elTag:e.elTag||"a",elRef:this.handleLinkEl,elClasses:[...e.elClasses||[],"fc-more-link"],elStyle:e.elStyle,elAttrs:Object.assign(Object.assign(Object.assign({},e.elAttrs),T(this.handleClick)),{title:d,"aria-expanded":t.isPopoverOpen,"aria-controls":t.isPopoverOpen?t.popoverId:""}),renderProps:h,generatorName:"moreLinkContent",customGenerator:s.moreLinkContent,defaultGenerator:e.defaultGenerator||Yi,classNameGenerator:s.moreLinkClassNames,didMount:s.moreLinkDidMount,willUnmount:s.moreLinkWillUnmount},e.children),t.isPopoverOpen&&(0,r.az)(Ni,{id:t.popoverId,startDate:c.start,endDate:c.end,dateProfile:e.dateProfile,todayRange:e.todayRange,extraDateSpan:e.extraDateSpan,parentEl:this.parentEl,alignmentEl:e.alignmentElRef?e.alignmentElRef.current:this.linkEl,alignGridTop:e.alignGridTop,forceTimed:e.forceTimed,onClose:this.handlePopoverClose},e.popoverContent()))}))}componentDidMount(){this.updateParentEl()}componentDidUpdate(){this.updateParentEl()}updateParentEl(){this.linkEl&&(this.parentEl=f(this.linkEl,".fc-view-harness"))}}function Yi(e){return e.text}function Bi(e){if(e.allDayDate)return{start:e.allDayDate,end:fe(e.allDayDate,1)};let{hiddenSegs:t}=e;return{start:Hi(t),end:(n=t,n.reduce(Ui).eventRange.range.end)};var n}function Hi(e){return e.reduce(ji).eventRange.range.start}function ji(e,t){return e.eventRange.range.start<t.eventRange.range.start?e:t}function Ui(e,t){return e.eventRange.range.end>t.eventRange.range.end?e:t}class Li extends _n{render(){let{props:e,context:t}=this,{options:n}=t,i={view:t.viewApi};return(0,r.az)(Ir,Object.assign({},e,{elTag:e.elTag||"div",elClasses:[...Vi(e.viewSpec),...e.elClasses||[]],renderProps:i,classNameGenerator:n.viewClassNames,generatorName:void 0,didMount:n.viewDidMount,willUnmount:n.viewWillUnmount}),(()=>e.children))}}function Vi(e){return[`fc-${e.type}-view`,"fc-view"]}const Wi={id:String,defaultAllDay:Boolean,url:String,format:String,events:it,eventDataTransform:it,success:it,failure:it};function Fi(e,t,n=Gi(t)){let r;if("string"==typeof e?r={url:e}:"function"==typeof e||Array.isArray(e)?r={events:e}:"object"==typeof e&&e&&(r=e),r){let{refined:i,extra:s}=rt(r,n),o=function(e,t){let n=t.pluginHooks.eventSourceDefs;for(let r=n.length-1;r>=0;r-=1){let t=n[r].parseMeta(e);if(t)return{sourceDefId:r,meta:t}}return null}(i,t);if(o)return{_raw:e,isFetching:!1,latestFetchId:"",fetchRange:null,defaultAllDay:i.defaultAllDay,eventDataTransform:i.eventDataTransform,success:i.success,failure:i.failure,publicId:i.id||"",sourceId:R(),sourceDefId:o.sourceDefId,meta:o.meta,ui:vt(i,t),extendedProps:s}}return null}function Gi(e){return Object.assign(Object.assign(Object.assign({},gt),Wi),e.pluginHooks.eventSourceRefiners)}class qi{getCurrentData(){return this.currentDataManager.getCurrentData()}dispatch(e){this.currentDataManager.dispatch(e)}get view(){return this.getCurrentData().viewApi}batchRendering(e){e()}updateSize(){this.trigger("_resize",!0)}setOption(e,t){this.dispatch({type:"SET_OPTION",optionName:e,rawOptionValue:t})}getOption(e){return this.currentDataManager.currentCalendarOptionsInput[e]}getAvailableLocaleCodes(){return Object.keys(this.getCurrentData().availableRawLocales)}on(e,t){let{currentDataManager:n}=this;n.currentCalendarOptionsRefiners[e]?n.emitter.on(e,t):console.warn(`Unknown listener name '${e}'`)}off(e,t){this.currentDataManager.emitter.off(e,t)}trigger(e,...t){this.currentDataManager.emitter.trigger(e,...t)}changeView(e,t){this.batchRendering((()=>{if(this.unselect(),t)if(t.start&&t.end)this.dispatch({type:"CHANGE_VIEW_TYPE",viewType:e}),this.dispatch({type:"SET_OPTION",optionName:"visibleRange",rawOptionValue:t});else{let{dateEnv:n}=this.getCurrentData();this.dispatch({type:"CHANGE_VIEW_TYPE",viewType:e,dateMarker:n.createMarker(t)})}else this.dispatch({type:"CHANGE_VIEW_TYPE",viewType:e})}))}zoomTo(e,t){let n;t=t||"day",n=this.getCurrentData().viewSpecs[t]||this.getUnitViewSpec(t),this.unselect(),n?this.dispatch({type:"CHANGE_VIEW_TYPE",viewType:n.type,dateMarker:e}):this.dispatch({type:"CHANGE_DATE",dateMarker:e})}getUnitViewSpec(e){let t,n,{viewSpecs:r,toolbarConfig:i}=this.getCurrentData(),s=[].concat(i.header?i.header.viewsWithButtons:[],i.footer?i.footer.viewsWithButtons:[]);for(let o in r)s.push(o);for(t=0;t<s.length;t+=1)if(n=r[s[t]],n&&n.singleUnit===e)return n;return null}prev(){this.unselect(),this.dispatch({type:"PREV"})}next(){this.unselect(),this.dispatch({type:"NEXT"})}prevYear(){let e=this.getCurrentData();this.unselect(),this.dispatch({type:"CHANGE_DATE",dateMarker:e.dateEnv.addYears(e.currentDate,-1)})}nextYear(){let e=this.getCurrentData();this.unselect(),this.dispatch({type:"CHANGE_DATE",dateMarker:e.dateEnv.addYears(e.currentDate,1)})}today(){let e=this.getCurrentData();this.unselect(),this.dispatch({type:"CHANGE_DATE",dateMarker:xn(e.calendarOptions.now,e.dateEnv)})}gotoDate(e){let t=this.getCurrentData();this.unselect(),this.dispatch({type:"CHANGE_DATE",dateMarker:t.dateEnv.createMarker(e)})}incrementDate(e){let t=this.getCurrentData(),n=W(e);n&&(this.unselect(),this.dispatch({type:"CHANGE_DATE",dateMarker:t.dateEnv.add(t.currentDate,n)}))}getDate(){let e=this.getCurrentData();return e.dateEnv.toDate(e.currentDate)}formatDate(e,t){let{dateEnv:n}=this.getCurrentData();return n.format(n.createMarker(e),qe(t))}formatRange(e,t,n){let{dateEnv:r}=this.getCurrentData();return r.formatRange(r.createMarker(e),r.createMarker(t),qe(n),n)}formatIso(e,t){let{dateEnv:n}=this.getCurrentData();return n.formatIso(n.createMarker(e),{omitTime:t})}select(e,t){let n;n=null==t?null!=e.start?e:{start:e,end:null}:{start:e,end:t};let r=this.getCurrentData(),i=rr(n,r.dateEnv,W({days:1}));i&&(this.dispatch({type:"SELECT_DATES",selection:i}),On(i,null,r))}unselect(e){let t=this.getCurrentData();t.dateSelection&&(this.dispatch({type:"UNSELECT_DATES"}),function(e,t){t.emitter.trigger("unselect",{jsEvent:e?e.origEvent:null,view:t.viewApi||t.calendarApi.view})}(e,t))}addEvent(e,t){if(e instanceof Yn){let t=e._def,n=e._instance;return this.getCurrentData().eventStore.defs[t.defId]||(this.dispatch({type:"ADD_EVENTS",eventStore:ct({def:t,instance:n})}),this.triggerEventAdd(e)),e}let n,r=this.getCurrentData();if(t instanceof Pn)n=t.internalEventSource;else if("boolean"==typeof t)t&&([n]=ie(r.eventSources));else if(null!=t){let e=this.getEventSourceById(t);if(!e)return console.warn(`Could not find an event source with ID "${t}"`),null;n=e.internalEventSource}let i=_t(e,n,r,!1);if(i){let e=new Yn(r,i.def,i.def.recurringDef?null:i.instance);return this.dispatch({type:"ADD_EVENTS",eventStore:ct(i)}),this.triggerEventAdd(e),e}return null}triggerEventAdd(e){let{emitter:t}=this.getCurrentData();t.trigger("eventAdd",{event:e,relatedEvents:[],revert:()=>{this.dispatch({type:"REMOVE_EVENTS",eventStore:Bn(e)})}})}getEventById(e){let t=this.getCurrentData(),{defs:n,instances:r}=t.eventStore;e=String(e);for(let i in n){let s=n[i];if(s.publicId===e){if(s.recurringDef)return new Yn(t,s,null);for(let e in r){let n=r[e];if(n.defId===s.defId)return new Yn(t,s,n)}}}return null}getEvents(){let e=this.getCurrentData();return Hn(e.eventStore,e)}removeAllEvents(){this.dispatch({type:"REMOVE_ALL_EVENTS"})}getEventSources(){let e=this.getCurrentData(),t=e.eventSources,n=[];for(let r in t)n.push(new Pn(e,t[r]));return n}getEventSourceById(e){let t=this.getCurrentData(),n=t.eventSources;e=String(e);for(let r in n)if(n[r].publicId===e)return new Pn(t,n[r]);return null}addEventSource(e){let t=this.getCurrentData();if(e instanceof Pn)return t.eventSources[e.internalEventSource.sourceId]||this.dispatch({type:"ADD_EVENT_SOURCES",sources:[e.internalEventSource]}),e;let n=Fi(e,t);return n?(this.dispatch({type:"ADD_EVENT_SOURCES",sources:[n]}),new Pn(t,n)):null}removeAllEventSources(){this.dispatch({type:"REMOVE_ALL_EVENT_SOURCES"})}refetchEvents(){this.dispatch({type:"FETCH_EVENT_SOURCES",isRefetch:!0})}scrollToTime(e){let t=W(e);t&&this.trigger("_scrollRequest",{time:t})}}class Qi{constructor(){this.handlers=[]}set(e){this.currentValue=e;for(let t of this.handlers)t(e)}subscribe(e){this.handlers.push(e),void 0!==this.currentValue&&e(this.currentValue)}}class Zi extends Qi{constructor(){super(...arguments),this.map=new Map}handle(e){const{map:t}=this;let n=!1;e.isActive?(t.set(e.id,e),n=!0):t.has(e.id)&&(t.delete(e.id),n=!0),n&&this.set(t)}}},16993:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s});var r=n(38636),i=n(25180),s=(0,r.rx)({name:"@fullcalendar/daygrid",initialView:"dayGridMonth",views:{dayGrid:{component:i.Nt,dateProfileGeneratorClass:i.XK},dayGridDay:{type:"dayGrid",duration:{days:1}},dayGridWeek:{type:"dayGrid",duration:{weeks:1}},dayGridMonth:{type:"dayGrid",duration:{months:1},fixedWeekCount:!0},dayGridYear:{type:"dayGrid",duration:{years:1}}}})},25180:(e,t,n)=>{"use strict";n.d(t,{Nt:()=>R,XK:()=>C,iz:()=>T});var r=n(17920),i=n(6400);function s(e,t){let n=[];for(let r=0;r<t;r+=1)n[r]=[];for(let r of e)n[r.row].push(r);return n}function o(e,t){let n=[];for(let r=0;r<t;r+=1)n[r]=[];for(let r of e)n[r.firstCol].push(r);return n}function a(e,t){let n=[];if(e){for(let r=0;r<t;r+=1)n[r]={affectedInstances:e.affectedInstances,isEvent:e.isEvent,segs:[]};for(let t of e.segs)n[t.row].segs.push(t)}else for(let r=0;r<t;r+=1)n[r]=null;return n}(0,r.cw)(':root{--fc-daygrid-event-dot-width:8px}.fc-daygrid-day-events:after,.fc-daygrid-day-events:before,.fc-daygrid-day-frame:after,.fc-daygrid-day-frame:before,.fc-daygrid-event-harness:after,.fc-daygrid-event-harness:before{clear:both;content:"";display:table}.fc .fc-daygrid-body{position:relative;z-index:1}.fc .fc-daygrid-day.fc-day-today{background-color:var(--fc-today-bg-color)}.fc .fc-daygrid-day-frame{min-height:100%;position:relative}.fc .fc-daygrid-day-top{display:flex;flex-direction:row-reverse}.fc .fc-day-other .fc-daygrid-day-top{opacity:.3}.fc .fc-daygrid-day-number{padding:4px;position:relative;z-index:4}.fc .fc-daygrid-month-start{font-size:1.1em;font-weight:700}.fc .fc-daygrid-day-events{margin-top:1px}.fc .fc-daygrid-body-balanced .fc-daygrid-day-events{left:0;position:absolute;right:0}.fc .fc-daygrid-body-unbalanced .fc-daygrid-day-events{min-height:2em;position:relative}.fc .fc-daygrid-body-natural .fc-daygrid-day-events{margin-bottom:1em}.fc .fc-daygrid-event-harness{position:relative}.fc .fc-daygrid-event-harness-abs{left:0;position:absolute;right:0;top:0}.fc .fc-daygrid-bg-harness{bottom:0;position:absolute;top:0}.fc .fc-daygrid-day-bg .fc-non-business{z-index:1}.fc .fc-daygrid-day-bg .fc-bg-event{z-index:2}.fc .fc-daygrid-day-bg .fc-highlight{z-index:3}.fc .fc-daygrid-event{margin-top:1px;z-index:6}.fc .fc-daygrid-event.fc-event-mirror{z-index:7}.fc .fc-daygrid-day-bottom{font-size:.85em;margin:0 2px}.fc .fc-daygrid-day-bottom:after,.fc .fc-daygrid-day-bottom:before{clear:both;content:"";display:table}.fc .fc-daygrid-more-link{border-radius:3px;cursor:pointer;line-height:1;margin-top:1px;max-width:100%;overflow:hidden;padding:2px;position:relative;white-space:nowrap;z-index:4}.fc .fc-daygrid-more-link:hover{background-color:rgba(0,0,0,.1)}.fc .fc-daygrid-week-number{background-color:var(--fc-neutral-bg-color);color:var(--fc-neutral-text-color);min-width:1.5em;padding:2px;position:absolute;text-align:center;top:0;z-index:5}.fc .fc-more-popover .fc-popover-body{min-width:220px;padding:10px}.fc-direction-ltr .fc-daygrid-event.fc-event-start,.fc-direction-rtl .fc-daygrid-event.fc-event-end{margin-left:2px}.fc-direction-ltr .fc-daygrid-event.fc-event-end,.fc-direction-rtl .fc-daygrid-event.fc-event-start{margin-right:2px}.fc-direction-ltr .fc-daygrid-more-link{float:left}.fc-direction-ltr .fc-daygrid-week-number{border-radius:0 0 3px 0;left:0}.fc-direction-rtl .fc-daygrid-more-link{float:right}.fc-direction-rtl .fc-daygrid-week-number{border-radius:0 0 0 3px;right:0}.fc-liquid-hack .fc-daygrid-day-frame{position:static}.fc-daygrid-event{border-radius:3px;font-size:var(--fc-small-font-size);position:relative;white-space:nowrap}.fc-daygrid-block-event .fc-event-time{font-weight:700}.fc-daygrid-block-event .fc-event-time,.fc-daygrid-block-event .fc-event-title{padding:1px}.fc-daygrid-dot-event{align-items:center;display:flex;padding:2px 0}.fc-daygrid-dot-event .fc-event-title{flex-grow:1;flex-shrink:1;font-weight:700;min-width:0;overflow:hidden}.fc-daygrid-dot-event.fc-event-mirror,.fc-daygrid-dot-event:hover{background:rgba(0,0,0,.1)}.fc-daygrid-dot-event.fc-event-selected:before{bottom:-10px;top:-10px}.fc-daygrid-event-dot{border:calc(var(--fc-daygrid-event-dot-width)/2) solid var(--fc-event-border-color);border-radius:calc(var(--fc-daygrid-event-dot-width)/2);box-sizing:content-box;height:0;margin:0 4px;width:0}.fc-direction-ltr .fc-daygrid-event .fc-event-time{margin-right:3px}.fc-direction-rtl .fc-daygrid-event .fc-event-time{margin-left:3px}');const l=(0,r.x)({hour:"numeric",minute:"2-digit",omitZeroMinute:!0,meridiem:"narrow"});function c(e){let{display:t}=e.eventRange.ui;return"list-item"===t||"auto"===t&&!e.eventRange.def.allDay&&e.firstCol===e.lastCol&&e.isStart&&e.isEnd}class u extends r.B{render(){let{props:e}=this;return(0,i.az)(r.cj,Object.assign({},e,{elClasses:["fc-daygrid-event","fc-daygrid-block-event","fc-h-event"],defaultTimeFormat:l,defaultDisplayEventEnd:e.defaultDisplayEventEnd,disableResizing:!e.seg.eventRange.def.allDay}))}}class d extends r.B{render(){let{props:e,context:t}=this,{options:n}=t,{seg:s}=e,o=n.eventTimeFormat||l,a=(0,r.bQ)(s,o,t,!0,e.defaultDisplayEventEnd);return(0,i.az)(r.cn,Object.assign({},e,{elTag:"a",elClasses:["fc-daygrid-event","fc-daygrid-dot-event"],elAttrs:(0,r.bU)(e.seg,t),defaultGenerator:h,timeText:a,isResizing:!1,isDateSelecting:!1}))}}function h(e){return(0,i.az)(i.HY,null,(0,i.az)("div",{className:"fc-daygrid-event-dot",style:{borderColor:e.borderColor||e.backgroundColor}}),e.timeText&&(0,i.az)("div",{className:"fc-event-time"},e.timeText),(0,i.az)("div",{className:"fc-event-title"},e.event.title||(0,i.az)(i.HY,null,"\xa0")))}class f extends r.B{constructor(){super(...arguments),this.compileSegs=(0,r.z)(p)}render(){let{props:e}=this,{allSegs:t,invisibleSegs:n}=this.compileSegs(e.singlePlacements);return(0,i.az)(r.cr,{elClasses:["fc-daygrid-more-link"],dateProfile:e.dateProfile,todayRange:e.todayRange,allDayDate:e.allDayDate,moreCnt:e.moreCnt,allSegs:t,hiddenSegs:n,alignmentElRef:e.alignmentElRef,alignGridTop:e.alignGridTop,extraDateSpan:e.extraDateSpan,popoverContent:()=>{let n=(e.eventDrag?e.eventDrag.affectedInstances:null)||(e.eventResize?e.eventResize.affectedInstances:null)||{};return(0,i.az)(i.HY,null,t.map((t=>{let s=t.eventRange.instance.instanceId;return(0,i.az)("div",{className:"fc-daygrid-event-harness",key:s,style:{visibility:n[s]?"hidden":""}},c(t)?(0,i.az)(d,Object.assign({seg:t,isDragging:!1,isSelected:s===e.eventSelection,defaultDisplayEventEnd:!1},(0,r.bS)(t,e.todayRange))):(0,i.az)(u,Object.assign({seg:t,isDragging:!1,isResizing:!1,isDateSelecting:!1,isSelected:s===e.eventSelection,defaultDisplayEventEnd:!1},(0,r.bS)(t,e.todayRange))))})))}})}}function p(e){let t=[],n=[];for(let r of e)t.push(r.seg),r.isVisible||n.push(r.seg);return{allSegs:t,invisibleSegs:n}}const g=(0,r.x)({week:"narrow"});class m extends r.be{constructor(){super(...arguments),this.rootElRef=(0,i.Vf)(),this.state={dayNumberId:(0,r.a5)()},this.handleRootEl=e=>{(0,r.Y)(this.rootElRef,e),(0,r.Y)(this.props.elRef,e)}}render(){let{context:e,props:t,state:n,rootElRef:s}=this,{options:o,dateEnv:a}=e,{date:l,dateProfile:c}=t;const u=t.showDayNumber&&function(e,t,n){const{start:i,end:s}=t,o=(0,r.bg)(s,-1),a=n.getYear(i),l=n.getMonth(i),c=n.getYear(o),u=n.getMonth(o);return!(a===c&&l===u)&&Boolean(e.valueOf()===i.valueOf()||1===n.getDay(e)&&e.valueOf()<s.valueOf())}(l,c.currentRange,a);return(0,i.az)(r.cl,{elTag:"td",elRef:this.handleRootEl,elClasses:["fc-daygrid-day",...t.extraClassNames||[]],elAttrs:Object.assign(Object.assign(Object.assign({},t.extraDataAttrs),t.showDayNumber?{"aria-labelledby":n.dayNumberId}:{}),{role:"gridcell"}),defaultGenerator:v,date:l,dateProfile:c,todayRange:t.todayRange,showDayNumber:t.showDayNumber,isMonthStart:u,extraRenderProps:t.extraRenderProps},((a,c)=>(0,i.az)("div",{ref:t.innerElRef,className:"fc-daygrid-day-frame fc-scrollgrid-sync-inner",style:{minHeight:t.minHeight}},t.showWeekNumber&&(0,i.az)(r.cq,{elTag:"a",elClasses:["fc-daygrid-week-number"],elAttrs:(0,r.b0)(e,l,"week"),date:l,defaultFormat:g}),!c.isDisabled&&(t.showDayNumber||(0,r.cm)(o)||t.forceDayTop)?(0,i.az)("div",{className:"fc-daygrid-day-top"},(0,i.az)(a,{elTag:"a",elClasses:["fc-daygrid-day-number",u&&"fc-daygrid-month-start"],elAttrs:Object.assign(Object.assign({},(0,r.b0)(e,l)),{id:n.dayNumberId})})):t.showDayNumber?(0,i.az)("div",{className:"fc-daygrid-day-top",style:{visibility:"hidden"}},(0,i.az)("a",{className:"fc-daygrid-day-number"},"\xa0")):void 0,(0,i.az)("div",{className:"fc-daygrid-day-events",ref:t.fgContentElRef},t.fgContent,(0,i.az)("div",{className:"fc-daygrid-day-bottom",style:{marginTop:t.moreMarginTop}},(0,i.az)(f,{allDayDate:l,singlePlacements:t.singlePlacements,moreCnt:t.moreCnt,alignmentElRef:s,alignGridTop:!t.showDayNumber,extraDateSpan:t.extraDateSpan,dateProfile:t.dateProfile,eventSelection:t.eventSelection,eventDrag:t.eventDrag,eventResize:t.eventResize,todayRange:t.todayRange}))),(0,i.az)("div",{className:"fc-daygrid-day-bg"},t.bgContent))))}}function v(e){return e.dayNumberText||(0,i.az)(i.HY,null,"\xa0")}function y(e,t,n,r,i,s,o){let a=new D;a.allowReslicing=!0,a.strictOrder=r,!0===t||!0===n?(a.maxCoord=s,a.hiddenConsumes=!0):"number"==typeof t?a.maxStackCnt=t:"number"==typeof n&&(a.maxStackCnt=n,a.hiddenConsumes=!0);let l=[],c=[];for(let v=0;v<e.length;v+=1){let t=e[v],{instanceId:n}=t.eventRange.instance,r=i[n];null!=r?l.push({index:v,thickness:r,span:{start:t.firstCol,end:t.lastCol+1}}):c.push(t)}let u=a.addSegs(l),d=a.toRects(),{singleColPlacements:h,multiColPlacements:f,leftoverMargins:p}=function(e,t,n){let r=function(e,t){let n=[];for(let r=0;r<t;r+=1)n.push([]);for(let r of e)for(let e=r.span.start;e<r.span.end;e+=1)n[e].push(r);return n}(e,n.length),i=[],s=[],o=[];for(let a=0;a<n.length;a+=1){let e=r[a],l=[],c=0,u=0;for(let r of e){let e=t[r.index];l.push({seg:b(e,a,a+1,n),isVisible:!0,isAbsolute:!1,absoluteTop:r.levelCoord,marginTop:r.levelCoord-c}),c=r.levelCoord+r.thickness}let d=[];c=0,u=0;for(let r of e){let e=t[r.index],i=r.span.end-r.span.start>1,s=r.span.start===a;u+=r.levelCoord-c,c=r.levelCoord+r.thickness,i?(u+=r.thickness,s&&d.push({seg:b(e,r.span.start,r.span.end,n),isVisible:!0,isAbsolute:!0,absoluteTop:r.levelCoord,marginTop:0})):s&&(d.push({seg:b(e,r.span.start,r.span.end,n),isVisible:!0,isAbsolute:!1,absoluteTop:r.levelCoord,marginTop:u}),u=0)}i.push(l),s.push(d),o.push(u)}return{singleColPlacements:i,multiColPlacements:s,leftoverMargins:o}}(d,e,o),g=[],m=[];for(let v of c){f[v.firstCol].push({seg:v,isVisible:!1,isAbsolute:!0,absoluteTop:0,marginTop:0});for(let e=v.firstCol;e<=v.lastCol;e+=1)h[e].push({seg:b(v,e,e+1,o),isVisible:!1,isAbsolute:!1,absoluteTop:0,marginTop:0})}for(let v=0;v<o.length;v+=1)g.push(0);for(let v of u){let t=e[v.index],n=v.span;f[n.start].push({seg:b(t,n.start,n.end,o),isVisible:!1,isAbsolute:!0,absoluteTop:0,marginTop:0});for(let e=n.start;e<n.end;e+=1)g[e]+=1,h[e].push({seg:b(t,e,e+1,o),isVisible:!1,isAbsolute:!1,absoluteTop:0,marginTop:0})}for(let v=0;v<o.length;v+=1)m.push(p[v]);return{singleColPlacements:h,multiColPlacements:f,moreCnts:g,moreMarginTops:m}}function b(e,t,n,i){if(e.firstCol===t&&e.lastCol===n-1)return e;let s=e.eventRange,o=s.range,a=(0,r.o)(o,{start:i[t].date,end:(0,r.t)(i[n-1].date,1)});return Object.assign(Object.assign({},e),{firstCol:t,lastCol:n-1,eventRange:{def:s.def,ui:Object.assign(Object.assign({},s.ui),{durationEditable:!1}),instance:s.instance,range:a},isStart:e.isStart&&a.start.valueOf()===o.start.valueOf(),isEnd:e.isEnd&&a.end.valueOf()===o.end.valueOf()})}class D extends r.bA{constructor(){super(...arguments),this.hiddenConsumes=!1,this.forceHidden={}}addSegs(e){const t=super.addSegs(e),{entriesByLevel:n}=this,i=e=>!this.forceHidden[(0,r.bB)(e)];for(let r=0;r<n.length;r+=1)n[r]=n[r].filter(i);return t}handleInvalidInsertion(e,t,n){const{entriesByLevel:i,forceHidden:s}=this,{touchingEntry:o,touchingLevel:a,touchingLateral:l}=e;if(this.hiddenConsumes&&o){const e=(0,r.bB)(o);if(!s[e])if(this.allowReslicing){const e=Object.assign(Object.assign({},o),{span:(0,r.bF)(o.span,t.span)});s[(0,r.bB)(e)]=!0,i[a][l]=e,this.splitEntry(o,t,n)}else s[e]=!0,n.push(o)}return super.handleInvalidInsertion(e,t,n)}}class A extends r.be{constructor(){super(...arguments),this.cellElRefs=new r.cf,this.frameElRefs=new r.cf,this.fgElRefs=new r.cf,this.segHarnessRefs=new r.cf,this.rootElRef=(0,i.Vf)(),this.state={framePositions:null,maxContentHeight:null,eventInstanceHeights:{}},this.handleResize=e=>{e&&this.updateSizing(!0)}}render(){let{props:e,state:t,context:n}=this,{options:s}=n,a=e.cells.length,l=o(e.businessHourSegs,a),c=o(e.bgEventSegs,a),u=o(this.getHighlightSegs(),a),d=o(this.getMirrorSegs(),a),{singleColPlacements:h,multiColPlacements:f,moreCnts:p,moreMarginTops:g}=y((0,r.bR)(e.fgEventSegs,s.eventOrder),e.dayMaxEvents,e.dayMaxEventRows,s.eventOrderStrict,t.eventInstanceHeights,t.maxContentHeight,e.cells),v=e.eventDrag&&e.eventDrag.affectedInstances||e.eventResize&&e.eventResize.affectedInstances||{};return(0,i.az)("tr",{ref:this.rootElRef,role:"row"},e.renderIntro&&e.renderIntro(),e.cells.map(((t,n)=>{let r=this.renderFgSegs(n,e.forPrint?h[n]:f[n],e.todayRange,v),s=this.renderFgSegs(n,function(e,t){if(!e.length)return[];let n=function(e){let t={};for(let n of e)for(let e of n)t[e.seg.eventRange.instance.instanceId]=e.absoluteTop;return t}(t);return e.map((e=>({seg:e,isVisible:!0,isAbsolute:!0,absoluteTop:n[e.eventRange.instance.instanceId],marginTop:0})))}(d[n],f),e.todayRange,{},Boolean(e.eventDrag),Boolean(e.eventResize),!1);return(0,i.az)(m,{key:t.key,elRef:this.cellElRefs.createRef(t.key),innerElRef:this.frameElRefs.createRef(t.key),dateProfile:e.dateProfile,date:t.date,showDayNumber:e.showDayNumbers,showWeekNumber:e.showWeekNumbers&&0===n,forceDayTop:e.showWeekNumbers,todayRange:e.todayRange,eventSelection:e.eventSelection,eventDrag:e.eventDrag,eventResize:e.eventResize,extraRenderProps:t.extraRenderProps,extraDataAttrs:t.extraDataAttrs,extraClassNames:t.extraClassNames,extraDateSpan:t.extraDateSpan,moreCnt:p[n],moreMarginTop:g[n],singlePlacements:h[n],fgContentElRef:this.fgElRefs.createRef(t.key),fgContent:(0,i.az)(i.HY,null,(0,i.az)(i.HY,null,r),(0,i.az)(i.HY,null,s)),bgContent:(0,i.az)(i.HY,null,this.renderFillSegs(u[n],"highlight"),this.renderFillSegs(l[n],"non-business"),this.renderFillSegs(c[n],"bg-event")),minHeight:e.cellMinHeight})})))}componentDidMount(){this.updateSizing(!0),this.context.addResizeHandler(this.handleResize)}componentDidUpdate(e,t){let n=this.props;this.updateSizing(!(0,r.E)(e,n))}componentWillUnmount(){this.context.removeResizeHandler(this.handleResize)}getHighlightSegs(){let{props:e}=this;return e.eventDrag&&e.eventDrag.segs.length?e.eventDrag.segs:e.eventResize&&e.eventResize.segs.length?e.eventResize.segs:e.dateSelectionSegs}getMirrorSegs(){let{props:e}=this;return e.eventResize&&e.eventResize.segs.length?e.eventResize.segs:[]}renderFgSegs(e,t,n,s,o,a,l){let{context:h}=this,{eventSelection:f}=this.props,{framePositions:p}=this.state,g=1===this.props.cells.length,m=o||a||l,v=[];if(p)for(let y of t){let{seg:t}=y,{instanceId:b}=t.eventRange.instance,D=b+":"+e,A=y.isVisible&&!s[b],E=y.isAbsolute,_="",S="";E&&(h.isRtl?(S=0,_=p.lefts[t.lastCol]-p.lefts[t.firstCol]):(_=0,S=p.rights[t.firstCol]-p.rights[t.lastCol])),v.push((0,i.az)("div",{className:"fc-daygrid-event-harness"+(E?" fc-daygrid-event-harness-abs":""),key:D,ref:m?null:this.segHarnessRefs.createRef(D),style:{visibility:A?"":"hidden",marginTop:E?"":y.marginTop,top:E?y.absoluteTop:"",left:_,right:S}},c(t)?(0,i.az)(d,Object.assign({seg:t,isDragging:o,isSelected:b===f,defaultDisplayEventEnd:g},(0,r.bS)(t,n))):(0,i.az)(u,Object.assign({seg:t,isDragging:o,isResizing:a,isDateSelecting:l,isSelected:b===f,defaultDisplayEventEnd:g},(0,r.bS)(t,n)))))}return v}renderFillSegs(e,t){let{isRtl:n}=this.context,{todayRange:s}=this.props,{framePositions:o}=this.state,a=[];if(o)for(let l of e){let e=n?{right:0,left:o.lefts[l.lastCol]-o.lefts[l.firstCol]}:{left:0,right:o.rights[l.firstCol]-o.rights[l.lastCol]};a.push((0,i.az)("div",{key:(0,r.bT)(l.eventRange),className:"fc-daygrid-bg-harness",style:e},"bg-event"===t?(0,i.az)(r.cp,Object.assign({seg:l},(0,r.bS)(l,s))):(0,r.co)(t)))}return(0,i.az)(i.HY,{},...a)}updateSizing(e){let{props:t,state:n,frameElRefs:i}=this;if(!t.forPrint&&null!==t.clientWidth){if(e){let e=t.cells.map((e=>i.currentMap[e.key]));if(e.length){let t=this.rootElRef.current,i=new r.ba(t,e,!0,!1);n.framePositions&&n.framePositions.similarTo(i)||this.setState({framePositions:new r.ba(t,e,!0,!1)})}}const s=this.state.eventInstanceHeights,o=this.queryEventInstanceHeights(),a=!0===t.dayMaxEvents||!0===t.dayMaxEventRows;this.safeSetState({eventInstanceHeights:Object.assign(Object.assign({},s),o),maxContentHeight:a?this.computeMaxContentHeight():null})}}queryEventInstanceHeights(){let e=this.segHarnessRefs.currentMap,t={};for(let n in e){let r=Math.round(e[n].getBoundingClientRect().height),i=n.split(":")[0];t[i]=Math.max(t[i]||0,r)}return t}computeMaxContentHeight(){let e=this.props.cells[0].key,t=this.cellElRefs.currentMap[e],n=this.fgElRefs.currentMap[e];return t.getBoundingClientRect().bottom-n.getBoundingClientRect().top}getCellEls(){let e=this.cellElRefs.currentMap;return this.props.cells.map((t=>e[t.key]))}}A.addStateEquality({eventInstanceHeights:r.E});class E extends r.be{constructor(){super(...arguments),this.splitBusinessHourSegs=(0,r.z)(s),this.splitBgEventSegs=(0,r.z)(s),this.splitFgEventSegs=(0,r.z)(s),this.splitDateSelectionSegs=(0,r.z)(s),this.splitEventDrag=(0,r.z)(a),this.splitEventResize=(0,r.z)(a),this.rowRefs=new r.cf}render(){let{props:e,context:t}=this,n=e.cells.length,s=this.splitBusinessHourSegs(e.businessHourSegs,n),o=this.splitBgEventSegs(e.bgEventSegs,n),a=this.splitFgEventSegs(e.fgEventSegs,n),l=this.splitDateSelectionSegs(e.dateSelectionSegs,n),c=this.splitEventDrag(e.eventDrag,n),u=this.splitEventResize(e.eventResize,n),d=n>=7&&e.clientWidth?e.clientWidth/t.options.aspectRatio/6:null;return(0,i.az)(r.ch,{unit:"day"},((t,r)=>(0,i.az)(i.HY,null,e.cells.map(((t,h)=>(0,i.az)(A,{ref:this.rowRefs.createRef(h),key:t.length?t[0].date.toISOString():h,showDayNumbers:n>1,showWeekNumbers:e.showWeekNumbers,todayRange:r,dateProfile:e.dateProfile,cells:t,renderIntro:e.renderRowIntro,businessHourSegs:s[h],eventSelection:e.eventSelection,bgEventSegs:o[h].filter(_),fgEventSegs:a[h],dateSelectionSegs:l[h],eventDrag:c[h],eventResize:u[h],dayMaxEvents:e.dayMaxEvents,dayMaxEventRows:e.dayMaxEventRows,clientWidth:e.clientWidth,clientHeight:e.clientHeight,cellMinHeight:d,forPrint:e.forPrint}))))))}componentDidMount(){const e=this.rowRefs.currentMap[0].getCellEls()[0];this.rootEl=e?e.closest(".fc-daygrid-body"):null,this.rootEl&&this.context.registerInteractiveComponent(this,{el:this.rootEl,isHitComboAllowed:this.props.isHitComboAllowed})}componentWillUnmount(){this.rootEl&&(this.context.unregisterInteractiveComponent(this),this.rootEl=null)}prepareHits(){this.rowPositions=new r.ba(this.rootEl,this.rowRefs.collect().map((e=>e.getCellEls()[0])),!1,!0),this.colPositions=new r.ba(this.rootEl,this.rowRefs.currentMap[0].getCellEls(),!0,!1)}queryHit(e,t){let{colPositions:n,rowPositions:r}=this,i=n.leftToIndex(e),s=r.topToIndex(t);if(null!=s&&null!=i){let e=this.props.cells[s][i];return{dateProfile:this.props.dateProfile,dateSpan:Object.assign({range:this.getCellRange(s,i),allDay:!0},e.extraDateSpan),dayEl:this.getCellEl(s,i),rect:{left:n.lefts[i],right:n.rights[i],top:r.tops[s],bottom:r.bottoms[s]},layer:0}}return null}getCellEl(e,t){return this.rowRefs.currentMap[e].getCellEls()[t]}getCellRange(e,t){let n=this.props.cells[e][t].date;return{start:n,end:(0,r.t)(n,1)}}}function _(e){return e.eventRange.def.allDay}class S extends r.be{constructor(){super(...arguments),this.elRef=(0,i.Vf)(),this.needsScrollReset=!1}render(){let{props:e}=this,{dayMaxEventRows:t,dayMaxEvents:n,expandRows:r}=e,s=!0===n||!0===t;s&&!r&&(s=!1,t=null,n=null);let o=["fc-daygrid-body",s?"fc-daygrid-body-balanced":"fc-daygrid-body-unbalanced",r?"":"fc-daygrid-body-natural"];return(0,i.az)("div",{ref:this.elRef,className:o.join(" "),style:{width:e.clientWidth,minWidth:e.tableMinWidth}},(0,i.az)("table",{role:"presentation",className:"fc-scrollgrid-sync-table",style:{width:e.clientWidth,minWidth:e.tableMinWidth,height:r?e.clientHeight:""}},e.colGroupNode,(0,i.az)("tbody",{role:"presentation"},(0,i.az)(E,{dateProfile:e.dateProfile,cells:e.cells,renderRowIntro:e.renderRowIntro,showWeekNumbers:e.showWeekNumbers,clientWidth:e.clientWidth,clientHeight:e.clientHeight,businessHourSegs:e.businessHourSegs,bgEventSegs:e.bgEventSegs,fgEventSegs:e.fgEventSegs,dateSelectionSegs:e.dateSelectionSegs,eventSelection:e.eventSelection,eventDrag:e.eventDrag,eventResize:e.eventResize,dayMaxEvents:n,dayMaxEventRows:t,forPrint:e.forPrint,isHitComboAllowed:e.isHitComboAllowed}))))}componentDidMount(){this.requestScrollReset()}componentDidUpdate(e){e.dateProfile!==this.props.dateProfile?this.requestScrollReset():this.flushScrollReset()}requestScrollReset(){this.needsScrollReset=!0,this.flushScrollReset()}flushScrollReset(){if(this.needsScrollReset&&this.props.clientWidth){const e=function(e,t){let n;t.currentRangeUnit.match(/year|month/)&&(n=e.querySelector(`[data-date="${(0,r.bx)(t.currentDate)}-01"]`));n||(n=e.querySelector(`[data-date="${(0,r.bv)(t.currentDate)}"]`));return n}(this.elRef.current,this.props.dateProfile);if(e){const t=e.closest(".fc-daygrid-body"),n=t.closest(".fc-scroller"),r=e.getBoundingClientRect().top-t.getBoundingClientRect().top;n.scrollTop=r?r+1:0}this.needsScrollReset=!1}}}class w extends r.bW{constructor(){super(...arguments),this.forceDayIfListItem=!0}sliceRange(e,t){return t.sliceRange(e)}}class T extends r.be{constructor(){super(...arguments),this.slicer=new w,this.tableRef=(0,i.Vf)()}render(){let{props:e,context:t}=this;return(0,i.az)(S,Object.assign({ref:this.tableRef},this.slicer.sliceProps(e,e.dateProfile,e.nextDayThreshold,t,e.dayTableModel),{dateProfile:e.dateProfile,cells:e.dayTableModel.cells,colGroupNode:e.colGroupNode,tableMinWidth:e.tableMinWidth,renderRowIntro:e.renderRowIntro,dayMaxEvents:e.dayMaxEvents,dayMaxEventRows:e.dayMaxEventRows,showWeekNumbers:e.showWeekNumbers,expandRows:e.expandRows,headerAlignElRef:e.headerAlignElRef,clientWidth:e.clientWidth,clientHeight:e.clientHeight,forPrint:e.forPrint}))}}class C extends r.U{buildRenderRange(e,t,n){let i=super.buildRenderRange(e,t,n),{props:s}=this;return function(e){let t,{dateEnv:n,currentRange:i}=e,{start:s,end:o}=i;e.snapToWeek&&(s=n.startOfWeek(s),t=n.startOfWeek(o),t.valueOf()!==o.valueOf()&&(o=(0,r.bh)(t,1)));if(e.fixedWeekCount){let e=n.startOfWeek(n.startOfMonth((0,r.t)(i.end,-1))),t=Math.ceil((0,r.bi)(e,o));o=(0,r.bh)(o,6-t)}return{start:s,end:o}}({currentRange:i,snapToWeek:/^(year|month)$/.test(t),fixedWeekCount:s.fixedWeekCount,dateEnv:s.dateEnv})}}class x extends r.be{constructor(){super(...arguments),this.headerElRef=(0,i.Vf)()}renderSimpleLayout(e,t){let{props:n,context:s}=this,o=[],a=(0,r.cc)(s.options);return e&&o.push({type:"header",key:"header",isSticky:a,chunk:{elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}}),o.push({type:"body",key:"body",liquid:!0,chunk:{content:t}}),(0,i.az)(r.ct,{elClasses:["fc-daygrid"],viewSpec:s.viewSpec},(0,i.az)(r.b$,{liquid:!n.isHeightAuto&&!n.forPrint,collapsibleWidth:n.forPrint,cols:[],sections:o}))}renderHScrollLayout(e,t,n,s){let o=this.context.pluginHooks.scrollGridImpl;if(!o)throw new Error("No ScrollGrid implementation");let{props:a,context:l}=this,c=!a.forPrint&&(0,r.cc)(l.options),u=!a.forPrint&&(0,r.cb)(l.options),d=[];return e&&d.push({type:"header",key:"header",isSticky:c,chunks:[{key:"main",elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}]}),d.push({type:"body",key:"body",liquid:!0,chunks:[{key:"main",content:t}]}),u&&d.push({type:"footer",key:"footer",isSticky:!0,chunks:[{key:"main",content:r.ca}]}),(0,i.az)(r.ct,{elClasses:["fc-daygrid"],viewSpec:l.viewSpec},(0,i.az)(o,{liquid:!a.isHeightAuto&&!a.forPrint,forPrint:a.forPrint,collapsibleWidth:a.forPrint,colGroups:[{cols:[{span:n,minWidth:s}]}],sections:d}))}}class R extends x{constructor(){super(...arguments),this.buildDayTableModel=(0,r.z)(O),this.headerRef=(0,i.Vf)(),this.tableRef=(0,i.Vf)()}render(){let{options:e,dateProfileGenerator:t}=this.context,{props:n}=this,s=this.buildDayTableModel(n.dateProfile,t),o=e.dayHeaders&&(0,i.az)(r.bK,{ref:this.headerRef,dateProfile:n.dateProfile,dates:s.headerDates,datesRepDistinctDays:1===s.rowCnt}),a=t=>(0,i.az)(T,{ref:this.tableRef,dateProfile:n.dateProfile,dayTableModel:s,businessHours:n.businessHours,dateSelection:n.dateSelection,eventStore:n.eventStore,eventUiBases:n.eventUiBases,eventSelection:n.eventSelection,eventDrag:n.eventDrag,eventResize:n.eventResize,nextDayThreshold:e.nextDayThreshold,colGroupNode:t.tableColGroupNode,tableMinWidth:t.tableMinWidth,dayMaxEvents:e.dayMaxEvents,dayMaxEventRows:e.dayMaxEventRows,showWeekNumbers:e.weekNumbers,expandRows:!n.isHeightAuto,headerAlignElRef:this.headerElRef,clientWidth:t.clientWidth,clientHeight:t.clientHeight,forPrint:n.forPrint});return e.dayMinWidth?this.renderHScrollLayout(o,a,s.colCnt,e.dayMinWidth):this.renderSimpleLayout(o,a)}}function O(e,t){let n=new r.bO(e.renderRange,t);return new r.bV(n,/year|month|week/.test(e.currentRangeUnit))}},58176:(e,t,n)=>{"use strict";n.d(t,{Z:()=>h});var r=n(38636),i=n(17920),s=n(18350);class o{constructor(e){this.maxIterations=null!=e.maxIterations?e.maxIterations:1e3,this.skipInvalidDates=null!=e.skipInvalidDates&&e.skipInvalidDates,this.jCalData=s.parse(e.ics),this.component=new s.Component(this.jCalData),this.events=this.component.getAllSubcomponents("vevent").map((e=>new s.Event(e))),this.skipInvalidDates&&(this.events=this.events.filter((e=>{try{return e.startDate.toJSDate(),e.endDate.toJSDate(),!0}catch(t){return!1}})))}between(e,t){function n(n,r){return(!e||r>=e.getTime())&&(!t||n<=t.getTime())}function r(e){const t=e.startDate.toJSDate().getTime();let n=e.endDate.toJSDate().getTime();return e.endDate.isDate&&n>t&&(n-=1),{startTime:t,endTime:n}}const i=[];this.events.forEach((e=>{e.isRecurrenceException()&&i.push(e)}));const s={events:[],occurrences:[]};return this.events.filter((e=>!e.isRecurrenceException())).forEach((e=>{const o=[];if(e.component.getAllProperties("exdate").forEach((e=>{const t=e.getFirstValue();o.push(t.toJSDate().getTime())})),e.isRecurring()){const a=e.iterator();let l,c=0;do{if(c+=1,l=a.next(),l){const a=e.getOccurrenceDetails(l),{startTime:c,endTime:u}=r(a),d=-1!==o.indexOf(c),h=i.find((t=>t.uid===e.uid&&t.recurrenceId.toJSDate().getTime()===a.startDate.toJSDate().getTime()));if(t&&c>t.getTime())break;n(c,u)&&(h?s.events.push(h):d||s.occurrences.push(a))}}while(l&&(!this.maxIterations||c<this.maxIterations));return}const{startTime:a,endTime:l}=r(e);n(a,l)&&s.events.push(e)})),s}before(e){return this.between(void 0,e)}after(e){return this.between(e)}all(){return this.between()}}const a={parseMeta:e=>e.url&&"ics"===e.format?{url:e.url,format:"ics"}:null,fetch(e,t,n){let r=e.eventSource.meta,{internalState:i}=r;i&&!e.isRefetch||(i=r.internalState={response:null,iCalExpanderPromise:fetch(r.url,{method:"GET"}).then((e=>e.text().then((t=>(i.response=e,new o({ics:t,skipInvalidDates:!0}))))))}),i.iCalExpanderPromise.then((n=>{t({rawEvents:l(n,e.range),response:i.response})}),n)}};function l(e,t){let n=(0,i.t)(t.start,-1),r=(0,i.t)(t.end,1),s=e.between(n,r),o=[];for(let i of s.events)o.push(Object.assign(Object.assign({},c(i)),{start:i.startDate.toString(),end:d(i)&&i.endDate?i.endDate.toString():null}));for(let i of s.occurrences){let e=i.item;o.push(Object.assign(Object.assign({},c(e)),{start:i.startDate.toString(),end:d(e)&&i.endDate?i.endDate.toString():null}))}return o}function c(e){return{title:e.summary,url:u(e),extendedProps:{location:e.location,organizer:e.organizer,description:e.description}}}function u(e){let t=e.component.getFirstProperty("url");return t?t.getFirstValue():""}function d(e){return Boolean(e.component.getFirstProperty("dtend"))||Boolean(e.component.getFirstProperty("duration"))}var h=(0,r.rx)({name:"@fullcalendar/icalendar",eventSourceDefs:[a]})},39897:(e,t,n)=>{"use strict";n.d(t,{ZP:()=>x});var r=n(38636),i=n(17920);i.bI.touchMouseIgnoreWait=500;let s=0,o=0,a=!1;class l{constructor(e){this.subjectEl=null,this.selector="",this.handleSelector="",this.shouldIgnoreMove=!1,this.shouldWatchScroll=!0,this.isDragging=!1,this.isTouchDragging=!1,this.wasTouchScroll=!1,this.handleMouseDown=e=>{if(!this.shouldIgnoreMouse()&&function(e){return 0===e.button&&!e.ctrlKey}(e)&&this.tryStart(e)){let t=this.createEventFromMouse(e,!0);this.emitter.trigger("pointerdown",t),this.initScrollWatch(t),this.shouldIgnoreMove||document.addEventListener("mousemove",this.handleMouseMove),document.addEventListener("mouseup",this.handleMouseUp)}},this.handleMouseMove=e=>{let t=this.createEventFromMouse(e);this.recordCoords(t),this.emitter.trigger("pointermove",t)},this.handleMouseUp=e=>{document.removeEventListener("mousemove",this.handleMouseMove),document.removeEventListener("mouseup",this.handleMouseUp),this.emitter.trigger("pointerup",this.createEventFromMouse(e)),this.cleanup()},this.handleTouchStart=e=>{if(this.tryStart(e)){this.isTouchDragging=!0;let t=this.createEventFromTouch(e,!0);this.emitter.trigger("pointerdown",t),this.initScrollWatch(t);let n=e.target;this.shouldIgnoreMove||n.addEventListener("touchmove",this.handleTouchMove),n.addEventListener("touchend",this.handleTouchEnd),n.addEventListener("touchcancel",this.handleTouchEnd),window.addEventListener("scroll",this.handleTouchScroll,!0)}},this.handleTouchMove=e=>{let t=this.createEventFromTouch(e);this.recordCoords(t),this.emitter.trigger("pointermove",t)},this.handleTouchEnd=e=>{if(this.isDragging){let t=e.target;t.removeEventListener("touchmove",this.handleTouchMove),t.removeEventListener("touchend",this.handleTouchEnd),t.removeEventListener("touchcancel",this.handleTouchEnd),window.removeEventListener("scroll",this.handleTouchScroll,!0),this.emitter.trigger("pointerup",this.createEventFromTouch(e)),this.cleanup(),this.isTouchDragging=!1,s+=1,setTimeout((()=>{s-=1}),i.bI.touchMouseIgnoreWait)}},this.handleTouchScroll=()=>{this.wasTouchScroll=!0},this.handleScroll=e=>{if(!this.shouldIgnoreMove){let t=window.pageXOffset-this.prevScrollX+this.prevPageX,n=window.pageYOffset-this.prevScrollY+this.prevPageY;this.emitter.trigger("pointermove",{origEvent:e,isTouch:this.isTouchDragging,subjectEl:this.subjectEl,pageX:t,pageY:n,deltaX:t-this.origPageX,deltaY:n-this.origPageY})}},this.containerEl=e,this.emitter=new i.F,e.addEventListener("mousedown",this.handleMouseDown),e.addEventListener("touchstart",this.handleTouchStart,{passive:!0}),o+=1,1===o&&window.addEventListener("touchmove",c,{passive:!1})}destroy(){this.containerEl.removeEventListener("mousedown",this.handleMouseDown),this.containerEl.removeEventListener("touchstart",this.handleTouchStart,{passive:!0}),o-=1,o||window.removeEventListener("touchmove",c,{passive:!1})}tryStart(e){let t=this.querySubjectEl(e),n=e.target;return!(!t||this.handleSelector&&!(0,i.$)(n,this.handleSelector))&&(this.subjectEl=t,this.isDragging=!0,this.wasTouchScroll=!1,!0)}cleanup(){a=!1,this.isDragging=!1,this.subjectEl=null,this.destroyScrollWatch()}querySubjectEl(e){return this.selector?(0,i.$)(e.target,this.selector):this.containerEl}shouldIgnoreMouse(){return s||this.isTouchDragging}cancelTouchScroll(){this.isDragging&&(a=!0)}initScrollWatch(e){this.shouldWatchScroll&&(this.recordCoords(e),window.addEventListener("scroll",this.handleScroll,!0))}recordCoords(e){this.shouldWatchScroll&&(this.prevPageX=e.pageX,this.prevPageY=e.pageY,this.prevScrollX=window.pageXOffset,this.prevScrollY=window.pageYOffset)}destroyScrollWatch(){this.shouldWatchScroll&&window.removeEventListener("scroll",this.handleScroll,!0)}createEventFromMouse(e,t){let n=0,r=0;return t?(this.origPageX=e.pageX,this.origPageY=e.pageY):(n=e.pageX-this.origPageX,r=e.pageY-this.origPageY),{origEvent:e,isTouch:!1,subjectEl:this.subjectEl,pageX:e.pageX,pageY:e.pageY,deltaX:n,deltaY:r}}createEventFromTouch(e,t){let n,r,i=e.touches,s=0,o=0;return i&&i.length?(n=i[0].pageX,r=i[0].pageY):(n=e.pageX,r=e.pageY),t?(this.origPageX=n,this.origPageY=r):(s=n-this.origPageX,o=r-this.origPageY),{origEvent:e,isTouch:!0,subjectEl:this.subjectEl,pageX:n,pageY:r,deltaX:s,deltaY:o}}}function c(e){a&&e.preventDefault()}class u{constructor(){this.isVisible=!1,this.sourceEl=null,this.mirrorEl=null,this.sourceElRect=null,this.parentNode=document.body,this.zIndex=9999,this.revertDuration=0}start(e,t,n){this.sourceEl=e,this.sourceElRect=this.sourceEl.getBoundingClientRect(),this.origScreenX=t-window.pageXOffset,this.origScreenY=n-window.pageYOffset,this.deltaX=0,this.deltaY=0,this.updateElPosition()}handleMove(e,t){this.deltaX=e-window.pageXOffset-this.origScreenX,this.deltaY=t-window.pageYOffset-this.origScreenY,this.updateElPosition()}setIsVisible(e){e?this.isVisible||(this.mirrorEl&&(this.mirrorEl.style.display=""),this.isVisible=e,this.updateElPosition()):this.isVisible&&(this.mirrorEl&&(this.mirrorEl.style.display="none"),this.isVisible=e)}stop(e,t){let n=()=>{this.cleanup(),t()};e&&this.mirrorEl&&this.isVisible&&this.revertDuration&&(this.deltaX||this.deltaY)?this.doRevertAnimation(n,this.revertDuration):setTimeout(n,0)}doRevertAnimation(e,t){let n=this.mirrorEl,r=this.sourceEl.getBoundingClientRect();n.style.transition="top "+t+"ms,left "+t+"ms",(0,i.aP)(n,{left:r.left,top:r.top}),(0,i.b2)(n,(()=>{n.style.transition="",e()}))}cleanup(){this.mirrorEl&&((0,i.aO)(this.mirrorEl),this.mirrorEl=null),this.sourceEl=null}updateElPosition(){this.sourceEl&&this.isVisible&&(0,i.aP)(this.getMirrorEl(),{left:this.sourceElRect.left+this.deltaX,top:this.sourceElRect.top+this.deltaY})}getMirrorEl(){let e=this.sourceElRect,t=this.mirrorEl;return t||(t=this.mirrorEl=this.sourceEl.cloneNode(!0),t.style.userSelect="none",t.classList.add("fc-event-dragging"),(0,i.aP)(t,{position:"fixed",zIndex:this.zIndex,visibility:"",boxSizing:"border-box",width:e.right-e.left,height:e.bottom-e.top,right:"auto",bottom:"auto",margin:0}),this.parentNode.appendChild(t)),t}}class d extends i.bb{constructor(e,t){super(),this.handleScroll=()=>{this.scrollTop=this.scrollController.getScrollTop(),this.scrollLeft=this.scrollController.getScrollLeft(),this.handleScrollChange()},this.scrollController=e,this.doesListening=t,this.scrollTop=this.origScrollTop=e.getScrollTop(),this.scrollLeft=this.origScrollLeft=e.getScrollLeft(),this.scrollWidth=e.getScrollWidth(),this.scrollHeight=e.getScrollHeight(),this.clientWidth=e.getClientWidth(),this.clientHeight=e.getClientHeight(),this.clientRect=this.computeClientRect(),this.doesListening&&this.getEventTarget().addEventListener("scroll",this.handleScroll)}destroy(){this.doesListening&&this.getEventTarget().removeEventListener("scroll",this.handleScroll)}getScrollTop(){return this.scrollTop}getScrollLeft(){return this.scrollLeft}setScrollTop(e){this.scrollController.setScrollTop(e),this.doesListening||(this.scrollTop=Math.max(Math.min(e,this.getMaxScrollTop()),0),this.handleScrollChange())}setScrollLeft(e){this.scrollController.setScrollLeft(e),this.doesListening||(this.scrollLeft=Math.max(Math.min(e,this.getMaxScrollLeft()),0),this.handleScrollChange())}getClientWidth(){return this.clientWidth}getClientHeight(){return this.clientHeight}getScrollWidth(){return this.scrollWidth}getScrollHeight(){return this.scrollHeight}handleScrollChange(){}}class h extends d{constructor(e,t){super(new i.bc(e),t)}getEventTarget(){return this.scrollController.el}computeClientRect(){return(0,i.b3)(this.scrollController.el)}}class f extends d{constructor(e){super(new i.bd,e)}getEventTarget(){return window}computeClientRect(){return{left:this.scrollLeft,right:this.scrollLeft+this.clientWidth,top:this.scrollTop,bottom:this.scrollTop+this.clientHeight}}handleScrollChange(){this.clientRect=this.computeClientRect()}}const p="function"==typeof performance?performance.now:Date.now;class g{constructor(){this.isEnabled=!0,this.scrollQuery=[window,".fc-scroller"],this.edgeThreshold=50,this.maxVelocity=300,this.pointerScreenX=null,this.pointerScreenY=null,this.isAnimating=!1,this.scrollCaches=null,this.everMovedUp=!1,this.everMovedDown=!1,this.everMovedLeft=!1,this.everMovedRight=!1,this.animate=()=>{if(this.isAnimating){let e=this.computeBestEdge(this.pointerScreenX+window.pageXOffset,this.pointerScreenY+window.pageYOffset);if(e){let t=p();this.handleSide(e,(t-this.msSinceRequest)/1e3),this.requestAnimation(t)}else this.isAnimating=!1}}}start(e,t,n){this.isEnabled&&(this.scrollCaches=this.buildCaches(n),this.pointerScreenX=null,this.pointerScreenY=null,this.everMovedUp=!1,this.everMovedDown=!1,this.everMovedLeft=!1,this.everMovedRight=!1,this.handleMove(e,t))}handleMove(e,t){if(this.isEnabled){let n=e-window.pageXOffset,r=t-window.pageYOffset,i=null===this.pointerScreenY?0:r-this.pointerScreenY,s=null===this.pointerScreenX?0:n-this.pointerScreenX;i<0?this.everMovedUp=!0:i>0&&(this.everMovedDown=!0),s<0?this.everMovedLeft=!0:s>0&&(this.everMovedRight=!0),this.pointerScreenX=n,this.pointerScreenY=r,this.isAnimating||(this.isAnimating=!0,this.requestAnimation(p()))}}stop(){if(this.isEnabled){this.isAnimating=!1;for(let e of this.scrollCaches)e.destroy();this.scrollCaches=null}}requestAnimation(e){this.msSinceRequest=e,requestAnimationFrame(this.animate)}handleSide(e,t){let{scrollCache:n}=e,{edgeThreshold:r}=this,i=r-e.distance,s=i*i/(r*r)*this.maxVelocity*t,o=1;switch(e.name){case"left":o=-1;case"right":n.setScrollLeft(n.getScrollLeft()+s*o);break;case"top":o=-1;case"bottom":n.setScrollTop(n.getScrollTop()+s*o)}}computeBestEdge(e,t){let{edgeThreshold:n}=this,r=null,i=this.scrollCaches||[];for(let s of i){let i=s.clientRect,o=e-i.left,a=i.right-e,l=t-i.top,c=i.bottom-t;o>=0&&a>=0&&l>=0&&c>=0&&(l<=n&&this.everMovedUp&&s.canScrollUp()&&(!r||r.distance>l)&&(r={scrollCache:s,name:"top",distance:l}),c<=n&&this.everMovedDown&&s.canScrollDown()&&(!r||r.distance>c)&&(r={scrollCache:s,name:"bottom",distance:c}),o<=n&&this.everMovedLeft&&s.canScrollLeft()&&(!r||r.distance>o)&&(r={scrollCache:s,name:"left",distance:o}),a<=n&&this.everMovedRight&&s.canScrollRight()&&(!r||r.distance>a)&&(r={scrollCache:s,name:"right",distance:a}))}return r}buildCaches(e){return this.queryScrollEls(e).map((e=>e===window?new f(!1):new h(e,!1)))}queryScrollEls(e){let t=[];for(let n of this.scrollQuery)"object"==typeof n?t.push(n):t.push(...Array.prototype.slice.call(e.getRootNode().querySelectorAll(n)));return t}}class m extends i.bH{constructor(e,t){super(e),this.containerEl=e,this.delay=null,this.minDistance=0,this.touchScrollAllowed=!0,this.mirrorNeedsRevert=!1,this.isInteracting=!1,this.isDragging=!1,this.isDelayEnded=!1,this.isDistanceSurpassed=!1,this.delayTimeoutId=null,this.onPointerDown=e=>{this.isDragging||(this.isInteracting=!0,this.isDelayEnded=!1,this.isDistanceSurpassed=!1,(0,i.ar)(document.body),(0,i.at)(document.body),e.isTouch||e.origEvent.preventDefault(),this.emitter.trigger("pointerdown",e),this.isInteracting&&!this.pointer.shouldIgnoreMove&&(this.mirror.setIsVisible(!1),this.mirror.start(e.subjectEl,e.pageX,e.pageY),this.startDelay(e),this.minDistance||this.handleDistanceSurpassed(e)))},this.onPointerMove=e=>{if(this.isInteracting){if(this.emitter.trigger("pointermove",e),!this.isDistanceSurpassed){let t,n=this.minDistance,{deltaX:r,deltaY:i}=e;t=r*r+i*i,t>=n*n&&this.handleDistanceSurpassed(e)}this.isDragging&&("scroll"!==e.origEvent.type&&(this.mirror.handleMove(e.pageX,e.pageY),this.autoScroller.handleMove(e.pageX,e.pageY)),this.emitter.trigger("dragmove",e))}},this.onPointerUp=e=>{this.isInteracting&&(this.isInteracting=!1,(0,i.as)(document.body),(0,i.au)(document.body),this.emitter.trigger("pointerup",e),this.isDragging&&(this.autoScroller.stop(),this.tryStopDrag(e)),this.delayTimeoutId&&(clearTimeout(this.delayTimeoutId),this.delayTimeoutId=null))};let n=this.pointer=new l(e);n.emitter.on("pointerdown",this.onPointerDown),n.emitter.on("pointermove",this.onPointerMove),n.emitter.on("pointerup",this.onPointerUp),t&&(n.selector=t),this.mirror=new u,this.autoScroller=new g}destroy(){this.pointer.destroy(),this.onPointerUp({})}startDelay(e){"number"==typeof this.delay?this.delayTimeoutId=setTimeout((()=>{this.delayTimeoutId=null,this.handleDelayEnd(e)}),this.delay):this.handleDelayEnd(e)}handleDelayEnd(e){this.isDelayEnded=!0,this.tryStartDrag(e)}handleDistanceSurpassed(e){this.isDistanceSurpassed=!0,this.tryStartDrag(e)}tryStartDrag(e){this.isDelayEnded&&this.isDistanceSurpassed&&(this.pointer.wasTouchScroll&&!this.touchScrollAllowed||(this.isDragging=!0,this.mirrorNeedsRevert=!1,this.autoScroller.start(e.pageX,e.pageY,this.containerEl),this.emitter.trigger("dragstart",e),!1===this.touchScrollAllowed&&this.pointer.cancelTouchScroll()))}tryStopDrag(e){this.mirror.stop(this.mirrorNeedsRevert,this.stopDrag.bind(this,e))}stopDrag(e){this.isDragging=!1,this.emitter.trigger("dragend",e)}setIgnoreMove(e){this.pointer.shouldIgnoreMove=e}setMirrorIsVisible(e){this.mirror.setIsVisible(e)}setMirrorNeedsRevert(e){this.mirrorNeedsRevert=e}setAutoScrollEnabled(e){this.autoScroller.isEnabled=e}}class v{constructor(e){this.origRect=(0,i.b6)(e),this.scrollCaches=(0,i.b5)(e).map((e=>new h(e,!0)))}destroy(){for(let e of this.scrollCaches)e.destroy()}computeLeft(){let e=this.origRect.left;for(let t of this.scrollCaches)e+=t.origScrollLeft-t.getScrollLeft();return e}computeTop(){let e=this.origRect.top;for(let t of this.scrollCaches)e+=t.origScrollTop-t.getScrollTop();return e}isWithinClipping(e,t){let n={left:e,top:t};for(let r of this.scrollCaches)if(!y(r.getEventTarget())&&!(0,i.aF)(n,r.clientRect))return!1;return!0}}function y(e){let t=e.tagName;return"HTML"===t||"BODY"===t}class b{constructor(e,t){this.useSubjectCenter=!1,this.requireInitial=!0,this.initialHit=null,this.movingHit=null,this.finalHit=null,this.handlePointerDown=e=>{let{dragging:t}=this;this.initialHit=null,this.movingHit=null,this.finalHit=null,this.prepareHits(),this.processFirstCoord(e),this.initialHit||!this.requireInitial?(t.setIgnoreMove(!1),this.emitter.trigger("pointerdown",e)):t.setIgnoreMove(!0)},this.handleDragStart=e=>{this.emitter.trigger("dragstart",e),this.handleMove(e,!0)},this.handleDragMove=e=>{this.emitter.trigger("dragmove",e),this.handleMove(e)},this.handlePointerUp=e=>{this.releaseHits(),this.emitter.trigger("pointerup",e)},this.handleDragEnd=e=>{this.movingHit&&this.emitter.trigger("hitupdate",null,!0,e),this.finalHit=this.movingHit,this.movingHit=null,this.emitter.trigger("dragend",e)},this.droppableStore=t,e.emitter.on("pointerdown",this.handlePointerDown),e.emitter.on("dragstart",this.handleDragStart),e.emitter.on("dragmove",this.handleDragMove),e.emitter.on("pointerup",this.handlePointerUp),e.emitter.on("dragend",this.handleDragEnd),this.dragging=e,this.emitter=new i.F}processFirstCoord(e){let t,n={left:e.pageX,top:e.pageY},r=n,s=e.subjectEl;s instanceof HTMLElement&&(t=(0,i.b6)(s),r=(0,i.aG)(r,t));let o=this.initialHit=this.queryHitForOffset(r.left,r.top);if(o){if(this.useSubjectCenter&&t){let e=(0,i.aE)(t,o.rect);e&&(r=(0,i.aH)(e))}this.coordAdjust=(0,i.aI)(r,n)}else this.coordAdjust={left:0,top:0}}handleMove(e,t){let n=this.queryHitForOffset(e.pageX+this.coordAdjust.left,e.pageY+this.coordAdjust.top);!t&&D(this.movingHit,n)||(this.movingHit=n,this.emitter.trigger("hitupdate",n,!1,e))}prepareHits(){this.offsetTrackers=(0,i.a)(this.droppableStore,(e=>(e.component.prepareHits(),new v(e.el))))}releaseHits(){let{offsetTrackers:e}=this;for(let t in e)e[t].destroy();this.offsetTrackers={}}queryHitForOffset(e,t){let{droppableStore:n,offsetTrackers:r}=this,s=null;for(let o in n){let a=n[o].component,l=r[o];if(l&&l.isWithinClipping(e,t)){let n=l.computeLeft(),r=l.computeTop(),c=e-n,u=t-r,{origRect:d}=l,h=d.right-d.left,f=d.bottom-d.top;if(c>=0&&c<h&&u>=0&&u<f){let e=a.queryHit(c,u,h,f);e&&(0,i.b9)(e.dateProfile.activeRange,e.dateSpan.range)&&(!s||e.layer>s.layer)&&(e.componentId=o,e.context=a.context,e.rect.left+=n,e.rect.right+=n,e.rect.top+=r,e.rect.bottom+=r,s=e)}}}return s}}function D(e,t){return!e&&!t||Boolean(e)===Boolean(t)&&(0,i.bf)(e.dateSpan,t.dateSpan)}function A(e,t){let n={};for(let s of t.pluginHooks.datePointTransforms)Object.assign(n,s(e,t));var r,i;return Object.assign(n,(r=e,{date:(i=t.dateEnv).toDate(r.range.start),dateStr:i.formatIso(r.range.start,{omitTime:r.allDay}),allDay:r.allDay})),n}class E extends i.Z{constructor(e){super(e),this.handlePointerDown=e=>{let{dragging:t}=this,n=e.origEvent.target;t.setIgnoreMove(!this.component.isValidDateDownEl(n))},this.handleDragEnd=e=>{let{component:t}=this,{pointer:n}=this.dragging;if(!n.wasTouchScroll){let{initialHit:n,finalHit:r}=this.hitDragging;if(n&&r&&D(n,r)){let{context:r}=t,i=Object.assign(Object.assign({},A(n.dateSpan,r)),{dayEl:n.dayEl,jsEvent:e.origEvent,view:r.viewApi||r.calendarApi.view});r.emitter.trigger("dateClick",i)}}},this.dragging=new m(e.el),this.dragging.autoScroller.isEnabled=!1;let t=this.hitDragging=new b(this.dragging,(0,i.bG)(e));t.emitter.on("pointerdown",this.handlePointerDown),t.emitter.on("dragend",this.handleDragEnd)}destroy(){this.dragging.destroy()}}class _ extends i.Z{constructor(e){super(e),this.dragSelection=null,this.handlePointerDown=e=>{let{component:t,dragging:n}=this,{options:r}=t.context,i=r.selectable&&t.isValidDateDownEl(e.origEvent.target);n.setIgnoreMove(!i),n.delay=e.isTouch?function(e){let{options:t}=e.context,n=t.selectLongPressDelay;null==n&&(n=t.longPressDelay);return n}(t):null},this.handleDragStart=e=>{this.component.context.calendarApi.unselect(e)},this.handleHitUpdate=(e,t)=>{let{context:n}=this.component,r=null,s=!1;if(e){let t=this.hitDragging.initialHit;e.componentId===t.componentId&&this.isHitComboAllowed&&!this.isHitComboAllowed(t,e)||(r=function(e,t,n){let r=e.dateSpan,s=t.dateSpan,o=[r.range.start,r.range.end,s.range.start,s.range.end];o.sort(i.av);let a={};for(let i of n){let n=i(e,t);if(!1===n)return null;n&&Object.assign(a,n)}return a.range={start:o[0],end:o[3]},a.allDay=r.allDay,a}(t,e,n.pluginHooks.dateSelectionTransformers)),r&&(0,i.b_)(r,e.dateProfile,n)||(s=!0,r=null)}r?n.dispatch({type:"SELECT_DATES",selection:r}):t||n.dispatch({type:"UNSELECT_DATES"}),s?(0,i.ax)():(0,i.aw)(),t||(this.dragSelection=r)},this.handlePointerUp=e=>{this.dragSelection&&((0,i.cu)(this.dragSelection,e,this.component.context),this.dragSelection=null)};let{component:t}=e,{options:n}=t.context,r=this.dragging=new m(e.el);r.touchScrollAllowed=!1,r.minDistance=n.selectMinDistance||0,r.autoScroller.isEnabled=n.dragScroll;let s=this.hitDragging=new b(this.dragging,(0,i.bG)(e));s.emitter.on("pointerdown",this.handlePointerDown),s.emitter.on("dragstart",this.handleDragStart),s.emitter.on("hitupdate",this.handleHitUpdate),s.emitter.on("pointerup",this.handlePointerUp)}destroy(){this.dragging.destroy()}}class S extends i.Z{constructor(e){super(e),this.subjectEl=null,this.subjectSeg=null,this.isDragging=!1,this.eventRange=null,this.relevantEvents=null,this.receivingContext=null,this.validMutation=null,this.mutatedRelevantEvents=null,this.handlePointerDown=e=>{let t=e.origEvent.target,{component:n,dragging:r}=this,{mirror:s}=r,{options:o}=n.context,a=n.context;this.subjectEl=e.subjectEl;let l=this.subjectSeg=(0,i._)(e.subjectEl),c=(this.eventRange=l.eventRange).instance.instanceId;this.relevantEvents=(0,i.aV)(a.getCurrentData().eventStore,c),r.minDistance=e.isTouch?0:o.eventDragMinDistance,r.delay=e.isTouch&&c!==n.props.eventSelection?function(e){let{options:t}=e.context,n=t.eventLongPressDelay;null==n&&(n=t.longPressDelay);return n}(n):null,o.fixedMirrorParent?s.parentNode=o.fixedMirrorParent:s.parentNode=(0,i.$)(t,".fc"),s.revertDuration=o.dragRevertDuration;let u=n.isValidSegDownEl(t)&&!(0,i.$)(t,".fc-event-resizer");r.setIgnoreMove(!u),this.isDragging=u&&e.subjectEl.classList.contains("fc-event-draggable")},this.handleDragStart=e=>{let t=this.component.context,n=this.eventRange,r=n.instance.instanceId;e.isTouch?r!==this.component.props.eventSelection&&t.dispatch({type:"SELECT_EVENT",eventInstanceId:r}):t.dispatch({type:"UNSELECT_EVENT"}),this.isDragging&&(t.calendarApi.unselect(e),t.emitter.trigger("eventDragStart",{el:this.subjectEl,event:new i.a0(t,n.def,n.instance),jsEvent:e.origEvent,view:t.viewApi}))},this.handleHitUpdate=(e,t)=>{if(!this.isDragging)return;let n=this.relevantEvents,r=this.hitDragging.initialHit,s=this.component.context,o=null,a=null,l=null,c=!1,u={affectedEvents:n,mutatedEvents:(0,i.I)(),isEvent:!0};if(e){o=e.context;let t=o.options;s===o||t.editable&&t.droppable?(a=function(e,t,n){let r=e.dateSpan,s=t.dateSpan,o=r.range.start,a=s.range.start,l={};r.allDay!==s.allDay&&(l.allDay=s.allDay,l.hasEnd=t.context.options.allDayMaintainDuration,s.allDay&&(o=(0,i.q)(o)));let c=(0,i.aA)(o,a,e.context.dateEnv,e.componentId===t.componentId?e.largeUnit:null);c.milliseconds&&(l.allDay=!1);let u={datesDelta:c,standardProps:l};for(let i of n)i(u,e,t);return u}(r,e,o.getCurrentData().pluginHooks.eventDragMutationMassagers),a&&(l=(0,i.bX)(n,o.getCurrentData().eventUiBases,a,o),u.mutatedEvents=l,(0,i.bZ)(u,e.dateProfile,o)||(c=!0,a=null,l=null,u.mutatedEvents=(0,i.I)()))):o=null}this.displayDrag(o,u),c?(0,i.ax)():(0,i.aw)(),t||(s===o&&D(r,e)&&(a=null),this.dragging.setMirrorNeedsRevert(!a),this.dragging.setMirrorIsVisible(!e||!this.subjectEl.getRootNode().querySelector(".fc-event-mirror")),this.receivingContext=o,this.validMutation=a,this.mutatedRelevantEvents=l)},this.handlePointerUp=()=>{this.isDragging||this.cleanup()},this.handleDragEnd=e=>{if(this.isDragging){let t=this.component.context,n=t.viewApi,{receivingContext:r,validMutation:s}=this,o=this.eventRange.def,a=this.eventRange.instance,l=new i.a0(t,o,a),c=this.relevantEvents,u=this.mutatedRelevantEvents,{finalHit:d}=this.hitDragging;if(this.clearDrag(),t.emitter.trigger("eventDragStop",{el:this.subjectEl,event:l,jsEvent:e.origEvent,view:n}),s){if(r===t){let r=new i.a0(t,u.defs[o.defId],a?u.instances[a.instanceId]:null);t.dispatch({type:"MERGE_EVENTS",eventStore:u});let d={oldEvent:l,event:r,relatedEvents:(0,i.w)(u,t,a),revert(){t.dispatch({type:"MERGE_EVENTS",eventStore:c})}},h={};for(let e of t.getCurrentData().pluginHooks.eventDropTransformers)Object.assign(h,e(s,t));t.emitter.trigger("eventDrop",Object.assign(Object.assign(Object.assign({},d),h),{el:e.subjectEl,delta:s.datesDelta,jsEvent:e.origEvent,view:n})),t.emitter.trigger("eventChange",d)}else if(r){let s={event:l,relatedEvents:(0,i.w)(c,t,a),revert(){t.dispatch({type:"MERGE_EVENTS",eventStore:c})}};t.emitter.trigger("eventLeave",Object.assign(Object.assign({},s),{draggedEl:e.subjectEl,view:n})),t.dispatch({type:"REMOVE_EVENTS",eventStore:c}),t.emitter.trigger("eventRemove",s);let h=u.defs[o.defId],f=u.instances[a.instanceId],p=new i.a0(r,h,f);r.dispatch({type:"MERGE_EVENTS",eventStore:u});let g={event:p,relatedEvents:(0,i.w)(u,r,f),revert(){r.dispatch({type:"REMOVE_EVENTS",eventStore:u})}};r.emitter.trigger("eventAdd",g),e.isTouch&&r.dispatch({type:"SELECT_EVENT",eventInstanceId:a.instanceId}),r.emitter.trigger("drop",Object.assign(Object.assign({},A(d.dateSpan,r)),{draggedEl:e.subjectEl,jsEvent:e.origEvent,view:d.context.viewApi})),r.emitter.trigger("eventReceive",Object.assign(Object.assign({},g),{draggedEl:e.subjectEl,view:d.context.viewApi}))}}else t.emitter.trigger("_noEventDrop")}this.cleanup()};let{component:t}=this,{options:n}=t.context,r=this.dragging=new m(e.el);r.pointer.selector=S.SELECTOR,r.touchScrollAllowed=!1,r.autoScroller.isEnabled=n.dragScroll;let s=this.hitDragging=new b(this.dragging,i.a7);s.useSubjectCenter=e.useEventCenter,s.emitter.on("pointerdown",this.handlePointerDown),s.emitter.on("dragstart",this.handleDragStart),s.emitter.on("hitupdate",this.handleHitUpdate),s.emitter.on("pointerup",this.handlePointerUp),s.emitter.on("dragend",this.handleDragEnd)}destroy(){this.dragging.destroy()}displayDrag(e,t){let n=this.component.context,r=this.receivingContext;r&&r!==e&&(r===n?r.dispatch({type:"SET_EVENT_DRAG",state:{affectedEvents:t.affectedEvents,mutatedEvents:(0,i.I)(),isEvent:!0}}):r.dispatch({type:"UNSET_EVENT_DRAG"})),e&&e.dispatch({type:"SET_EVENT_DRAG",state:t})}clearDrag(){let e=this.component.context,{receivingContext:t}=this;t&&t.dispatch({type:"UNSET_EVENT_DRAG"}),e!==t&&e.dispatch({type:"UNSET_EVENT_DRAG"})}cleanup(){this.subjectSeg=null,this.isDragging=!1,this.eventRange=null,this.relevantEvents=null,this.receivingContext=null,this.validMutation=null,this.mutatedRelevantEvents=null}}S.SELECTOR=".fc-event-draggable, .fc-event-resizable";class w extends i.Z{constructor(e){super(e),this.draggingSegEl=null,this.draggingSeg=null,this.eventRange=null,this.relevantEvents=null,this.validMutation=null,this.mutatedRelevantEvents=null,this.handlePointerDown=e=>{let{component:t}=this,n=this.querySegEl(e),r=(0,i._)(n),s=this.eventRange=r.eventRange;this.dragging.minDistance=t.context.options.eventDragMinDistance,this.dragging.setIgnoreMove(!this.component.isValidSegDownEl(e.origEvent.target)||e.isTouch&&this.component.props.eventSelection!==s.instance.instanceId)},this.handleDragStart=e=>{let{context:t}=this.component,n=this.eventRange;this.relevantEvents=(0,i.aV)(t.getCurrentData().eventStore,this.eventRange.instance.instanceId);let r=this.querySegEl(e);this.draggingSegEl=r,this.draggingSeg=(0,i._)(r),t.calendarApi.unselect(),t.emitter.trigger("eventResizeStart",{el:r,event:new i.a0(t,n.def,n.instance),jsEvent:e.origEvent,view:t.viewApi})},this.handleHitUpdate=(e,t,n)=>{let{context:r}=this.component,s=this.relevantEvents,o=this.hitDragging.initialHit,a=this.eventRange.instance,l=null,c=null,u=!1,d={affectedEvents:s,mutatedEvents:(0,i.I)(),isEvent:!0};if(e){e.componentId===o.componentId&&this.isHitComboAllowed&&!this.isHitComboAllowed(o,e)||(l=function(e,t,n,r){let s=e.context.dateEnv,o=e.dateSpan.range.start,a=t.dateSpan.range.start,l=(0,i.aA)(o,a,s,e.largeUnit);if(n){if(s.add(r.start,l)<r.end)return{startDelta:l}}else if(s.add(r.end,l)>r.start)return{endDelta:l};return null}(o,e,n.subjectEl.classList.contains("fc-event-resizer-start"),a.range))}l&&(c=(0,i.bX)(s,r.getCurrentData().eventUiBases,l,r),d.mutatedEvents=c,(0,i.bZ)(d,e.dateProfile,r)||(u=!0,l=null,c=null,d.mutatedEvents=null)),c?r.dispatch({type:"SET_EVENT_RESIZE",state:d}):r.dispatch({type:"UNSET_EVENT_RESIZE"}),u?(0,i.ax)():(0,i.aw)(),t||(l&&D(o,e)&&(l=null),this.validMutation=l,this.mutatedRelevantEvents=c)},this.handleDragEnd=e=>{let{context:t}=this.component,n=this.eventRange.def,r=this.eventRange.instance,s=new i.a0(t,n,r),o=this.relevantEvents,a=this.mutatedRelevantEvents;if(t.emitter.trigger("eventResizeStop",{el:this.draggingSegEl,event:s,jsEvent:e.origEvent,view:t.viewApi}),this.validMutation){let l=new i.a0(t,a.defs[n.defId],r?a.instances[r.instanceId]:null);t.dispatch({type:"MERGE_EVENTS",eventStore:a});let c={oldEvent:s,event:l,relatedEvents:(0,i.w)(a,t,r),revert(){t.dispatch({type:"MERGE_EVENTS",eventStore:o})}};t.emitter.trigger("eventResize",Object.assign(Object.assign({},c),{el:this.draggingSegEl,startDelta:this.validMutation.startDelta||(0,i.d)(0),endDelta:this.validMutation.endDelta||(0,i.d)(0),jsEvent:e.origEvent,view:t.viewApi})),t.emitter.trigger("eventChange",c)}else t.emitter.trigger("_noEventResize");this.draggingSeg=null,this.relevantEvents=null,this.validMutation=null};let{component:t}=e,n=this.dragging=new m(e.el);n.pointer.selector=".fc-event-resizer",n.touchScrollAllowed=!1,n.autoScroller.isEnabled=t.context.options.dragScroll;let r=this.hitDragging=new b(this.dragging,(0,i.bG)(e));r.emitter.on("pointerdown",this.handlePointerDown),r.emitter.on("dragstart",this.handleDragStart),r.emitter.on("hitupdate",this.handleHitUpdate),r.emitter.on("dragend",this.handleDragEnd)}destroy(){this.dragging.destroy()}querySegEl(e){return(0,i.$)(e.subjectEl,".fc-event")}}const T={fixedMirrorParent:i.n},C={dateClick:i.n,eventDragStart:i.n,eventDragStop:i.n,eventDrop:i.n,eventResizeStart:i.n,eventResizeStop:i.n,eventResize:i.n,drop:i.n,eventReceive:i.n,eventLeave:i.n};i.bI.dataAttrPrefix="";var x=(0,r.rx)({name:"@fullcalendar/interaction",componentInteractions:[E,_,S,w],calendarInteractions:[class{constructor(e){this.context=e,this.isRecentPointerDateSelect=!1,this.matchesCancel=!1,this.matchesEvent=!1,this.onSelect=e=>{e.jsEvent&&(this.isRecentPointerDateSelect=!0)},this.onDocumentPointerDown=e=>{let t=this.context.options.unselectCancel,n=(0,i.aR)(e.origEvent);this.matchesCancel=!!(0,i.$)(n,t),this.matchesEvent=!!(0,i.$)(n,S.SELECTOR)},this.onDocumentPointerUp=e=>{let{context:t}=this,{documentPointer:n}=this,r=t.getCurrentData();if(!n.wasTouchScroll){if(r.dateSelection&&!this.isRecentPointerDateSelect){let n=t.options.unselectAuto;!n||n&&this.matchesCancel||t.calendarApi.unselect(e)}r.eventSelection&&!this.matchesEvent&&t.dispatch({type:"UNSELECT_EVENT"})}this.isRecentPointerDateSelect=!1};let t=this.documentPointer=new l(document);t.shouldIgnoreMove=!0,t.shouldWatchScroll=!1,t.emitter.on("pointerdown",this.onDocumentPointerDown),t.emitter.on("pointerup",this.onDocumentPointerUp),e.emitter.on("select",this.onSelect)}destroy(){this.context.emitter.off("select",this.onSelect),this.documentPointer.destroy()}}],elementDraggingImpl:m,optionRefiners:T,listenerRefiners:C})},43907:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(67294),i=n(73935),s=n(38636),o=n(17920);class a extends r.Component{constructor(){super(...arguments),this.elRef=(0,r.createRef)(),this.isUpdating=!1,this.isUnmounting=!1,this.state={customRenderingMap:new Map},this.requestResize=()=>{this.isUnmounting||(this.cancelResize(),this.resizeId=requestAnimationFrame((()=>{this.doResize()})))}}render(){const e=[];for(const t of this.state.customRenderingMap.values())e.push(r.createElement(l,{key:t.id,customRendering:t}));return r.createElement("div",{ref:this.elRef},e)}componentDidMount(){const e=new o.cy;let t;this.handleCustomRendering=e.handle.bind(e),this.calendar=new s.f(this.elRef.current,Object.assign(Object.assign({},this.props),{handleCustomRendering:this.handleCustomRendering})),this.calendar.render(),e.subscribe((e=>{const n=Date.now(),r=!t;(r||this.isUpdating||this.isUnmounting||n-t<100?c:i.flushSync)((()=>{this.setState({customRenderingMap:e},(()=>{t=n,r?this.doResize():this.requestResize()}))}))}))}componentDidUpdate(){this.isUpdating=!0,this.calendar.resetOptions(Object.assign(Object.assign({},this.props),{handleCustomRendering:this.handleCustomRendering})),this.isUpdating=!1}componentWillUnmount(){this.isUnmounting=!0,this.cancelResize(),this.calendar.destroy()}doResize(){this.calendar.updateSize()}cancelResize(){void 0!==this.resizeId&&(cancelAnimationFrame(this.resizeId),this.resizeId=void 0)}getApi(){return this.calendar}}a.act=c;class l extends r.PureComponent{render(){const{customRendering:e}=this.props,{generatorMeta:t}=e,n="function"==typeof t?t(e.renderProps):t;return(0,i.createPortal)(n,e.containerEl)}}function c(e){e()}},24745:(e,t,n)=>{"use strict";n.d(t,{Z:()=>V});var r=n(38636),i=n(17920),s=n(6400),o=n(25180);(0,i.cw)('.fc-v-event{background-color:var(--fc-event-bg-color);border:1px solid var(--fc-event-border-color);display:block}.fc-v-event .fc-event-main{color:var(--fc-event-text-color);height:100%}.fc-v-event .fc-event-main-frame{display:flex;flex-direction:column;height:100%}.fc-v-event .fc-event-time{flex-grow:0;flex-shrink:0;max-height:100%;overflow:hidden}.fc-v-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-height:0}.fc-v-event .fc-event-title{bottom:0;max-height:100%;overflow:hidden;top:0}.fc-v-event:not(.fc-event-start){border-top-left-radius:0;border-top-right-radius:0;border-top-width:0}.fc-v-event:not(.fc-event-end){border-bottom-left-radius:0;border-bottom-right-radius:0;border-bottom-width:0}.fc-v-event.fc-event-selected:before{left:-10px;right:-10px}.fc-v-event .fc-event-resizer-start{cursor:n-resize}.fc-v-event .fc-event-resizer-end{cursor:s-resize}.fc-v-event:not(.fc-event-selected) .fc-event-resizer{height:var(--fc-event-resizer-thickness);left:0;right:0}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-start{top:calc(var(--fc-event-resizer-thickness)/-2)}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-end{bottom:calc(var(--fc-event-resizer-thickness)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer{left:50%;margin-left:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer-start{top:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer-end{bottom:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc .fc-timegrid .fc-daygrid-body{z-index:2}.fc .fc-timegrid-divider{padding:0 0 2px}.fc .fc-timegrid-body{min-height:100%;position:relative;z-index:1}.fc .fc-timegrid-axis-chunk{position:relative}.fc .fc-timegrid-axis-chunk>table,.fc .fc-timegrid-slots{position:relative;z-index:1}.fc .fc-timegrid-slot{border-bottom:0;height:1.5em}.fc .fc-timegrid-slot:empty:before{content:"\\00a0"}.fc .fc-timegrid-slot-minor{border-top-style:dotted}.fc .fc-timegrid-slot-label-cushion{display:inline-block;white-space:nowrap}.fc .fc-timegrid-slot-label{vertical-align:middle}.fc .fc-timegrid-axis-cushion,.fc .fc-timegrid-slot-label-cushion{padding:0 4px}.fc .fc-timegrid-axis-frame-liquid{height:100%}.fc .fc-timegrid-axis-frame{align-items:center;display:flex;justify-content:flex-end;overflow:hidden}.fc .fc-timegrid-axis-cushion{flex-shrink:0;max-width:60px}.fc-direction-ltr .fc-timegrid-slot-label-frame{text-align:right}.fc-direction-rtl .fc-timegrid-slot-label-frame{text-align:left}.fc-liquid-hack .fc-timegrid-axis-frame-liquid{bottom:0;height:auto;left:0;position:absolute;right:0;top:0}.fc .fc-timegrid-col.fc-day-today{background-color:var(--fc-today-bg-color)}.fc .fc-timegrid-col-frame{min-height:100%;position:relative}.fc-media-screen.fc-liquid-hack .fc-timegrid-col-frame{bottom:0;height:auto;left:0;position:absolute;right:0;top:0}.fc-media-screen .fc-timegrid-cols{bottom:0;left:0;position:absolute;right:0;top:0}.fc-media-screen .fc-timegrid-cols>table{height:100%}.fc-media-screen .fc-timegrid-col-bg,.fc-media-screen .fc-timegrid-col-events,.fc-media-screen .fc-timegrid-now-indicator-container{left:0;position:absolute;right:0;top:0}.fc .fc-timegrid-col-bg{z-index:2}.fc .fc-timegrid-col-bg .fc-non-business{z-index:1}.fc .fc-timegrid-col-bg .fc-bg-event{z-index:2}.fc .fc-timegrid-col-bg .fc-highlight{z-index:3}.fc .fc-timegrid-bg-harness{left:0;position:absolute;right:0}.fc .fc-timegrid-col-events{z-index:3}.fc .fc-timegrid-now-indicator-container{bottom:0;overflow:hidden}.fc-direction-ltr .fc-timegrid-col-events{margin:0 2.5% 0 2px}.fc-direction-rtl .fc-timegrid-col-events{margin:0 2px 0 2.5%}.fc-timegrid-event-harness{position:absolute}.fc-timegrid-event-harness>.fc-timegrid-event{bottom:0;left:0;position:absolute;right:0;top:0}.fc-timegrid-event-harness-inset .fc-timegrid-event,.fc-timegrid-event.fc-event-mirror,.fc-timegrid-more-link{box-shadow:0 0 0 1px var(--fc-page-bg-color)}.fc-timegrid-event,.fc-timegrid-more-link{border-radius:3px;font-size:var(--fc-small-font-size)}.fc-timegrid-event{margin-bottom:1px}.fc-timegrid-event .fc-event-main{padding:1px 1px 0}.fc-timegrid-event .fc-event-time{font-size:var(--fc-small-font-size);margin-bottom:1px;white-space:nowrap}.fc-timegrid-event-short .fc-event-main-frame{flex-direction:row;overflow:hidden}.fc-timegrid-event-short .fc-event-time:after{content:"\\00a0-\\00a0"}.fc-timegrid-event-short .fc-event-title{font-size:var(--fc-small-font-size)}.fc-timegrid-more-link{background:var(--fc-more-link-bg-color);color:var(--fc-more-link-text-color);cursor:pointer;margin-bottom:1px;position:absolute;z-index:9999}.fc-timegrid-more-link-inner{padding:3px 2px;top:0}.fc-direction-ltr .fc-timegrid-more-link{right:0}.fc-direction-rtl .fc-timegrid-more-link{left:0}.fc .fc-timegrid-now-indicator-line{border-color:var(--fc-now-indicator-color);border-style:solid;border-width:1px 0 0;left:0;position:absolute;right:0;z-index:4}.fc .fc-timegrid-now-indicator-arrow{border-color:var(--fc-now-indicator-color);border-style:solid;margin-top:-5px;position:absolute;z-index:4}.fc-direction-ltr .fc-timegrid-now-indicator-arrow{border-bottom-color:transparent;border-top-color:transparent;border-width:5px 0 5px 6px;left:0}.fc-direction-rtl .fc-timegrid-now-indicator-arrow{border-bottom-color:transparent;border-top-color:transparent;border-width:5px 6px 5px 0;right:0}');class a extends i.aY{getKeyInfo(){return{allDay:{},timed:{}}}getKeysForDateSpan(e){return e.allDay?["allDay"]:["timed"]}getKeysForEventDef(e){return e.allDay?(0,i.bP)(e)?["timed","allDay"]:["allDay"]:["timed"]}}const l=(0,i.x)({hour:"numeric",minute:"2-digit",omitZeroMinute:!0,meridiem:"short"});function c(e){let t=["fc-timegrid-slot","fc-timegrid-slot-label",e.isLabeled?"fc-scrollgrid-shrink":"fc-timegrid-slot-minor"];return(0,s.az)(i.V.Consumer,null,(n=>{if(!e.isLabeled)return(0,s.az)("td",{className:t.join(" "),"data-time":e.isoTimeStr});let{dateEnv:r,options:o,viewApi:a}=n,c=null==o.slotLabelFormat?l:Array.isArray(o.slotLabelFormat)?(0,i.x)(o.slotLabelFormat[0]):(0,i.x)(o.slotLabelFormat),d={level:0,time:e.time,date:r.toDate(e.date),view:a,text:r.format(e.date,c)};return(0,s.az)(i.C,{elTag:"td",elClasses:t,elAttrs:{"data-time":e.isoTimeStr},renderProps:d,generatorName:"slotLabelContent",customGenerator:o.slotLabelContent,defaultGenerator:u,classNameGenerator:o.slotLabelClassNames,didMount:o.slotLabelDidMount,willUnmount:o.slotLabelWillUnmount},(e=>(0,s.az)("div",{className:"fc-timegrid-slot-label-frame fc-scrollgrid-shrink-frame"},(0,s.az)(e,{elTag:"div",elClasses:["fc-timegrid-slot-label-cushion","fc-scrollgrid-shrink-cushion"]}))))}))}function u(e){return e.text}class d extends i.B{render(){return this.props.slatMetas.map((e=>(0,s.az)("tr",{key:e.key},(0,s.az)(c,Object.assign({},e)))))}}const h=(0,i.x)({week:"short"});class f extends i.be{constructor(){super(...arguments),this.allDaySplitter=new a,this.headerElRef=(0,s.Vf)(),this.rootElRef=(0,s.Vf)(),this.scrollerElRef=(0,s.Vf)(),this.state={slatCoords:null},this.handleScrollTopRequest=e=>{let t=this.scrollerElRef.current;t&&(t.scrollTop=e)},this.renderHeadAxis=(e,t="")=>{let{options:n}=this.context,{dateProfile:r}=this.props,o=r.renderRange,a=1===(0,i.bl)(o.start,o.end)?(0,i.b0)(this.context,o.start,"week"):{};return n.weekNumbers&&"day"===e?(0,s.az)(i.cq,{elTag:"th",elClasses:["fc-timegrid-axis","fc-scrollgrid-shrink"],elAttrs:{"aria-hidden":!0},date:o.start,defaultFormat:h},(e=>(0,s.az)("div",{className:["fc-timegrid-axis-frame","fc-scrollgrid-shrink-frame","fc-timegrid-axis-frame-liquid"].join(" "),style:{height:t}},(0,s.az)(e,{elTag:"a",elClasses:["fc-timegrid-axis-cushion","fc-scrollgrid-shrink-cushion","fc-scrollgrid-sync-inner"],elAttrs:a})))):(0,s.az)("th",{"aria-hidden":!0,className:"fc-timegrid-axis"},(0,s.az)("div",{className:"fc-timegrid-axis-frame",style:{height:t}}))},this.renderTableRowAxis=e=>{let{options:t,viewApi:n}=this.context,r={text:t.allDayText,view:n};return(0,s.az)(i.C,{elTag:"td",elClasses:["fc-timegrid-axis","fc-scrollgrid-shrink"],elAttrs:{"aria-hidden":!0},renderProps:r,generatorName:"allDayContent",customGenerator:t.allDayContent,defaultGenerator:p,classNameGenerator:t.allDayClassNames,didMount:t.allDayDidMount,willUnmount:t.allDayWillUnmount},(t=>(0,s.az)("div",{className:["fc-timegrid-axis-frame","fc-scrollgrid-shrink-frame",null==e?" fc-timegrid-axis-frame-liquid":""].join(" "),style:{height:e}},(0,s.az)(t,{elTag:"span",elClasses:["fc-timegrid-axis-cushion","fc-scrollgrid-shrink-cushion","fc-scrollgrid-sync-inner"]}))))},this.handleSlatCoords=e=>{this.setState({slatCoords:e})}}renderSimpleLayout(e,t,n){let{context:r,props:o}=this,a=[],l=(0,i.cc)(r.options);return e&&a.push({type:"header",key:"header",isSticky:l,chunk:{elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}}),t&&(a.push({type:"body",key:"all-day",chunk:{content:t}}),a.push({type:"body",key:"all-day-divider",outerContent:(0,s.az)("tr",{role:"presentation",className:"fc-scrollgrid-section"},(0,s.az)("td",{className:"fc-timegrid-divider "+r.theme.getClass("tableCellShaded")}))})),a.push({type:"body",key:"body",liquid:!0,expandRows:Boolean(r.options.expandRows),chunk:{scrollerElRef:this.scrollerElRef,content:n}}),(0,s.az)(i.ct,{elRef:this.rootElRef,elClasses:["fc-timegrid"],viewSpec:r.viewSpec},(0,s.az)(i.b$,{liquid:!o.isHeightAuto&&!o.forPrint,collapsibleWidth:o.forPrint,cols:[{width:"shrink"}],sections:a}))}renderHScrollLayout(e,t,n,r,o,a,l){let c=this.context.pluginHooks.scrollGridImpl;if(!c)throw new Error("No ScrollGrid implementation");let{context:u,props:h}=this,f=!h.forPrint&&(0,i.cc)(u.options),p=!h.forPrint&&(0,i.cb)(u.options),g=[];e&&g.push({type:"header",key:"header",isSticky:f,syncRowHeights:!0,chunks:[{key:"axis",rowContent:e=>(0,s.az)("tr",{role:"presentation"},this.renderHeadAxis("day",e.rowSyncHeights[0]))},{key:"cols",elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}]}),t&&(g.push({type:"body",key:"all-day",syncRowHeights:!0,chunks:[{key:"axis",rowContent:e=>(0,s.az)("tr",{role:"presentation"},this.renderTableRowAxis(e.rowSyncHeights[0]))},{key:"cols",content:t}]}),g.push({key:"all-day-divider",type:"body",outerContent:(0,s.az)("tr",{role:"presentation",className:"fc-scrollgrid-section"},(0,s.az)("td",{colSpan:2,className:"fc-timegrid-divider "+u.theme.getClass("tableCellShaded")}))}));let m=u.options.nowIndicator;return g.push({type:"body",key:"body",liquid:!0,expandRows:Boolean(u.options.expandRows),chunks:[{key:"axis",content:e=>(0,s.az)("div",{className:"fc-timegrid-axis-chunk"},(0,s.az)("table",{"aria-hidden":!0,style:{height:e.expandRows?e.clientHeight:""}},e.tableColGroupNode,(0,s.az)("tbody",null,(0,s.az)(d,{slatMetas:a}))),(0,s.az)("div",{className:"fc-timegrid-now-indicator-container"},(0,s.az)(i.ch,{unit:m?"minute":"day"},(e=>{let t=m&&l&&l.safeComputeTop(e);return"number"==typeof t?(0,s.az)(i.ck,{elClasses:["fc-timegrid-now-indicator-arrow"],elStyle:{top:t},isAxis:!0,date:e}):null}))))},{key:"cols",scrollerElRef:this.scrollerElRef,content:n}]}),p&&g.push({key:"footer",type:"footer",isSticky:!0,chunks:[{key:"axis",content:i.ca},{key:"cols",content:i.ca}]}),(0,s.az)(i.ct,{elRef:this.rootElRef,elClasses:["fc-timegrid"],viewSpec:u.viewSpec},(0,s.az)(c,{liquid:!h.isHeightAuto&&!h.forPrint,forPrint:h.forPrint,collapsibleWidth:!1,colGroups:[{width:"shrink",cols:[{width:"shrink"}]},{cols:[{span:r,minWidth:o}]}],sections:g}))}getAllDayMaxEventProps(){let{dayMaxEvents:e,dayMaxEventRows:t}=this.context.options;return!0!==e&&!0!==t||(e=void 0,t=5),{dayMaxEvents:e,dayMaxEventRows:t}}}function p(e){return e.text}class g{constructor(e,t,n){this.positions=e,this.dateProfile=t,this.slotDuration=n}safeComputeTop(e){let{dateProfile:t}=this;if((0,i.H)(t.currentRange,e)){let n=(0,i.q)(e),r=e.valueOf()-n.valueOf();if(r>=(0,i.bs)(t.slotMinTime)&&r<(0,i.bs)(t.slotMaxTime))return this.computeTimeTop((0,i.d)(r))}return null}computeDateTop(e,t){return t||(t=(0,i.q)(e)),this.computeTimeTop((0,i.d)(e.valueOf()-t.valueOf()))}computeTimeTop(e){let t,n,{positions:r,dateProfile:s}=this,o=r.els.length,a=(e.milliseconds-(0,i.bs)(s.slotMinTime))/(0,i.bs)(this.slotDuration);return a=Math.max(0,a),a=Math.min(o,a),t=Math.floor(a),t=Math.min(t,o-1),n=a-t,r.tops[t]+r.getHeight(t)*n}}class m extends i.B{render(){let{props:e,context:t}=this,{options:n}=t,{slatElRefs:r}=e;return(0,s.az)("tbody",null,e.slatMetas.map(((o,a)=>{let l={time:o.time,date:t.dateEnv.toDate(o.date),view:t.viewApi};return(0,s.az)("tr",{key:o.key,ref:r.createRef(o.key)},e.axis&&(0,s.az)(c,Object.assign({},o)),(0,s.az)(i.C,{elTag:"td",elClasses:["fc-timegrid-slot","fc-timegrid-slot-lane",!o.isLabeled&&"fc-timegrid-slot-minor"],elAttrs:{"data-time":o.isoTimeStr},renderProps:l,generatorName:"slotLaneContent",customGenerator:n.slotLaneContent,classNameGenerator:n.slotLaneClassNames,didMount:n.slotLaneDidMount,willUnmount:n.slotLaneWillUnmount}))})))}}class v extends i.B{constructor(){super(...arguments),this.rootElRef=(0,s.Vf)(),this.slatElRefs=new i.cf}render(){let{props:e,context:t}=this;return(0,s.az)("div",{ref:this.rootElRef,className:"fc-timegrid-slots"},(0,s.az)("table",{"aria-hidden":!0,className:t.theme.getClass("table"),style:{minWidth:e.tableMinWidth,width:e.clientWidth,height:e.minHeight}},e.tableColGroupNode,(0,s.az)(m,{slatElRefs:this.slatElRefs,axis:e.axis,slatMetas:e.slatMetas})))}componentDidMount(){this.updateSizing()}componentDidUpdate(){this.updateSizing()}componentWillUnmount(){this.props.onCoords&&this.props.onCoords(null)}updateSizing(){let{context:e,props:t}=this;if(t.onCoords&&null!==t.clientWidth){this.rootElRef.current.offsetHeight&&t.onCoords(new g(new i.ba(this.rootElRef.current,(n=this.slatElRefs.currentMap,t.slatMetas.map((e=>n[e.key]))),!1,!0),this.props.dateProfile,e.options.slotDuration))}var n}}function y(e,t){let n,r=[];for(n=0;n<t;n+=1)r.push([]);if(e)for(n=0;n<e.length;n+=1)r[e[n].col].push(e[n]);return r}function b(e,t){let n=[];if(e){for(let r=0;r<t;r+=1)n[r]={affectedInstances:e.affectedInstances,isEvent:e.isEvent,segs:[]};for(let t of e.segs)n[t.col].segs.push(t)}else for(let r=0;r<t;r+=1)n[r]=null;return n}class D extends i.B{render(){let{props:e}=this;return(0,s.az)(i.cr,{elClasses:["fc-timegrid-more-link"],elStyle:{top:e.top,bottom:e.bottom},allDayDate:null,moreCnt:e.hiddenSegs.length,allSegs:e.hiddenSegs,hiddenSegs:e.hiddenSegs,extraDateSpan:e.extraDateSpan,dateProfile:e.dateProfile,todayRange:e.todayRange,popoverContent:()=>k(e.hiddenSegs,e),defaultGenerator:A,forceTimed:!0},(e=>(0,s.az)(e,{elTag:"div",elClasses:["fc-timegrid-more-link-inner","fc-sticky"]})))}}function A(e){return e.shortText}function E(e,t,n){let r=new i.bA;null!=t&&(r.strictOrder=t),null!=n&&(r.maxStackCnt=n);let s=r.addSegs(e),o=(0,i.bE)(s),a=function(e){const{entriesByLevel:t}=e,n=T(((e,t)=>e+":"+t),((r,s)=>{let o=function(e,t,n){let{levelCoords:r,entriesByLevel:s}=e,o=s[t][n],a=r[t]+o.thickness,l=r.length,c=t;for(;c<l&&r[c]<a;c+=1);for(;c<l;c+=1){let e,t=s[c],n=(0,i.bD)(t,o.span.start,i.bC),r=n[0]+n[1],a=r;for(;(e=t[a])&&e.span.start<o.span.end;)a+=1;if(r<a)return{level:c,lateralStart:r,lateralEnd:a}}return null}(e,r,s),a=_(o,n),l=t[r][s];return[Object.assign(Object.assign({},l),{nextLevelNodes:a[0]}),l.thickness+a[1]]}));return _(t.length?{level:0,lateralStart:0,lateralEnd:t[0].length}:null,n)[0]}(r);return a=function(e,t){const n=T(((e,t,n)=>(0,i.bB)(e)),((e,r,i)=>{let s,{nextLevelNodes:o,thickness:a}=e,l=a+i,c=a/l,u=[];if(o.length)for(let t of o)if(void 0===s){let e=n(t,r,l);s=e[0],u.push(e[1])}else{let e=n(t,s,0);u.push(e[1])}else s=t;let d=(s-r)*c;return[s-d,Object.assign(Object.assign({},e),{thickness:d,nextLevelNodes:u})]}));return e.map((e=>n(e,0,0)[1]))}(a,1),{segRects:function(e){let t=[];const n=T(((e,t,n)=>(0,i.bB)(e)),((e,n,i)=>{let s=Object.assign(Object.assign({},e),{levelCoord:n,stackDepth:i,stackForward:0});return t.push(s),s.stackForward=r(e.nextLevelNodes,n+e.thickness,i+1)+1}));function r(e,t,r){let i=0;for(let s of e)i=Math.max(n(s,t,r),i);return i}return r(e,0,0),t}(a),hiddenGroups:o}}function _(e,t){if(!e)return[[],0];let{level:n,lateralStart:r,lateralEnd:i}=e,s=r,o=[];for(;s<i;)o.push(t(n,s)),s+=1;return o.sort(S),[o.map(w),o[0][1]]}function S(e,t){return t[1]-e[1]}function w(e){return e[0]}function T(e,t){const n={};return(...r)=>{let i=e(...r);return i in n?n[i]:n[i]=t(...r)}}function C(e,t,n=null,r=0){let i=[];if(n)for(let s=0;s<e.length;s+=1){let o=e[s],a=n.computeDateTop(o.start,t),l=Math.max(a+(r||0),n.computeDateTop(o.end,t));i.push({start:Math.round(a),end:Math.round(l)})}return i}const x=(0,i.x)({hour:"numeric",minute:"2-digit",meridiem:!1});class R extends i.B{render(){return(0,s.az)(i.cj,Object.assign({},this.props,{elClasses:["fc-timegrid-event","fc-v-event",this.props.isShort&&"fc-timegrid-event-short"],defaultTimeFormat:x}))}}class O extends i.B{constructor(){super(...arguments),this.sortEventSegs=(0,i.z)(i.bR)}render(){let{props:e,context:t}=this,{options:n}=t,r=n.selectMirror,o=e.eventDrag&&e.eventDrag.segs||e.eventResize&&e.eventResize.segs||r&&e.dateSelectionSegs||[],a=e.eventDrag&&e.eventDrag.affectedInstances||e.eventResize&&e.eventResize.affectedInstances||{},l=this.sortEventSegs(e.fgEventSegs,n.eventOrder);return(0,s.az)(i.cl,{elTag:"td",elRef:e.elRef,elClasses:["fc-timegrid-col",...e.extraClassNames||[]],elAttrs:Object.assign({role:"gridcell"},e.extraDataAttrs),date:e.date,dateProfile:e.dateProfile,todayRange:e.todayRange,extraRenderProps:e.extraRenderProps},(t=>(0,s.az)("div",{className:"fc-timegrid-col-frame"},(0,s.az)("div",{className:"fc-timegrid-col-bg"},this.renderFillSegs(e.businessHourSegs,"non-business"),this.renderFillSegs(e.bgEventSegs,"bg-event"),this.renderFillSegs(e.dateSelectionSegs,"highlight")),(0,s.az)("div",{className:"fc-timegrid-col-events"},this.renderFgSegs(l,a,!1,!1,!1)),(0,s.az)("div",{className:"fc-timegrid-col-events"},this.renderFgSegs(o,{},Boolean(e.eventDrag),Boolean(e.eventResize),Boolean(r),"mirror")),(0,s.az)("div",{className:"fc-timegrid-now-indicator-container"},this.renderNowIndicator(e.nowIndicatorSegs)),(0,i.cm)(n)&&(0,s.az)(t,{elTag:"div",elClasses:["fc-timegrid-col-misc"]}))))}renderFgSegs(e,t,n,r,i,s){let{props:o}=this;return o.forPrint?k(e,o):this.renderPositionedFgSegs(e,t,n,r,i,s)}renderPositionedFgSegs(e,t,n,r,o,a){let{eventMaxStack:l,eventShortHeight:c,eventOrderStrict:u,eventMinHeight:d}=this.context.options,{date:h,slatCoords:f,eventSelection:p,todayRange:g,nowDate:m}=this.props,v=n||r||o,y=C(e,h,f,d),{segPlacements:b,hiddenGroups:D}=function(e,t,n,r){let i=[],s=[];for(let c=0;c<e.length;c+=1){let n=t[c];n?i.push({index:c,thickness:1,span:n}):s.push(e[c])}let{segRects:o,hiddenGroups:a}=E(i,n,r),l=[];for(let c of o)l.push({seg:e[c.index],rect:c});for(let c of s)l.push({seg:c,rect:null});return{segPlacements:l,hiddenGroups:a}}(e,y,u,l);return(0,s.az)(s.HY,null,this.renderHiddenGroups(D,e),b.map((e=>{let{seg:l,rect:u}=e,d=l.eventRange.instance.instanceId,h=v||Boolean(!t[d]&&u),f=M(u&&u.span),y=!v&&u?this.computeSegHStyle(u):{left:0,right:0},b=Boolean(u)&&u.stackForward>0,D=Boolean(u)&&u.span.end-u.span.start<c;return(0,s.az)("div",{className:"fc-timegrid-event-harness"+(b?" fc-timegrid-event-harness-inset":""),key:a||d,style:Object.assign(Object.assign({visibility:h?"":"hidden"},f),y)},(0,s.az)(R,Object.assign({seg:l,isDragging:n,isResizing:r,isDateSelecting:o,isSelected:d===p,isShort:D},(0,i.bS)(l,g,m))))})))}renderHiddenGroups(e,t){let{extraDateSpan:n,dateProfile:r,todayRange:o,nowDate:a,eventSelection:l,eventDrag:c,eventResize:u}=this.props;return(0,s.az)(s.HY,null,e.map((e=>{let d=M(e.span),h=(f=e.entries,p=t,f.map((e=>p[e.index])));var f,p;return(0,s.az)(D,{key:(0,i.bw)((0,i.cs)(h)),hiddenSegs:h,top:d.top,bottom:d.bottom,extraDateSpan:n,dateProfile:r,todayRange:o,nowDate:a,eventSelection:l,eventDrag:c,eventResize:u})})))}renderFillSegs(e,t){let{props:n,context:r}=this,o=C(e,n.date,n.slatCoords,r.options.eventMinHeight).map(((r,o)=>{let a=e[o];return(0,s.az)("div",{key:(0,i.bT)(a.eventRange),className:"fc-timegrid-bg-harness",style:M(r)},"bg-event"===t?(0,s.az)(i.cp,Object.assign({seg:a},(0,i.bS)(a,n.todayRange,n.nowDate))):(0,i.co)(t))}));return(0,s.az)(s.HY,null,o)}renderNowIndicator(e){let{slatCoords:t,date:n}=this.props;return t?e.map(((e,r)=>(0,s.az)(i.ck,{key:r,elClasses:["fc-timegrid-now-indicator-line"],elStyle:{top:t.computeDateTop(e.start,n)},isAxis:!1,date:n}))):null}computeSegHStyle(e){let t,n,{isRtl:r,options:i}=this.context,s=i.slotEventOverlap,o=e.levelCoord,a=e.levelCoord+e.thickness;s&&(a=Math.min(1,o+2*(a-o))),r?(t=1-a,n=o):(t=o,n=1-a);let l={zIndex:e.stackDepth+1,left:100*t+"%",right:100*n+"%"};return s&&!e.stackForward&&(l[r?"marginLeft":"marginRight"]=20),l}}function k(e,{todayRange:t,nowDate:n,eventSelection:r,eventDrag:o,eventResize:a}){let l=(o?o.affectedInstances:null)||(a?a.affectedInstances:null)||{};return(0,s.az)(s.HY,null,e.map((e=>{let o=e.eventRange.instance.instanceId;return(0,s.az)("div",{key:o,style:{visibility:l[o]?"hidden":""}},(0,s.az)(R,Object.assign({seg:e,isDragging:!1,isResizing:!1,isDateSelecting:!1,isSelected:o===r,isShort:!1},(0,i.bS)(e,t,n))))})))}function M(e){return e?{top:e.start,bottom:-e.end}:{top:"",bottom:""}}class I extends i.B{constructor(){super(...arguments),this.splitFgEventSegs=(0,i.z)(y),this.splitBgEventSegs=(0,i.z)(y),this.splitBusinessHourSegs=(0,i.z)(y),this.splitNowIndicatorSegs=(0,i.z)(y),this.splitDateSelectionSegs=(0,i.z)(y),this.splitEventDrag=(0,i.z)(b),this.splitEventResize=(0,i.z)(b),this.rootElRef=(0,s.Vf)(),this.cellElRefs=new i.cf}render(){let{props:e,context:t}=this,n=t.options.nowIndicator&&e.slatCoords&&e.slatCoords.safeComputeTop(e.nowDate),r=e.cells.length,o=this.splitFgEventSegs(e.fgEventSegs,r),a=this.splitBgEventSegs(e.bgEventSegs,r),l=this.splitBusinessHourSegs(e.businessHourSegs,r),c=this.splitNowIndicatorSegs(e.nowIndicatorSegs,r),u=this.splitDateSelectionSegs(e.dateSelectionSegs,r),d=this.splitEventDrag(e.eventDrag,r),h=this.splitEventResize(e.eventResize,r);return(0,s.az)("div",{className:"fc-timegrid-cols",ref:this.rootElRef},(0,s.az)("table",{role:"presentation",style:{minWidth:e.tableMinWidth,width:e.clientWidth}},e.tableColGroupNode,(0,s.az)("tbody",{role:"presentation"},(0,s.az)("tr",{role:"row"},e.axis&&(0,s.az)("td",{"aria-hidden":!0,className:"fc-timegrid-col fc-timegrid-axis"},(0,s.az)("div",{className:"fc-timegrid-col-frame"},(0,s.az)("div",{className:"fc-timegrid-now-indicator-container"},"number"==typeof n&&(0,s.az)(i.ck,{elClasses:["fc-timegrid-now-indicator-arrow"],elStyle:{top:n},isAxis:!0,date:e.nowDate})))),e.cells.map(((t,n)=>(0,s.az)(O,{key:t.key,elRef:this.cellElRefs.createRef(t.key),dateProfile:e.dateProfile,date:t.date,nowDate:e.nowDate,todayRange:e.todayRange,extraRenderProps:t.extraRenderProps,extraDataAttrs:t.extraDataAttrs,extraClassNames:t.extraClassNames,extraDateSpan:t.extraDateSpan,fgEventSegs:o[n],bgEventSegs:a[n],businessHourSegs:l[n],nowIndicatorSegs:c[n],dateSelectionSegs:u[n],eventDrag:d[n],eventResize:h[n],slatCoords:e.slatCoords,eventSelection:e.eventSelection,forPrint:e.forPrint})))))))}componentDidMount(){this.updateCoords()}componentDidUpdate(){this.updateCoords()}updateCoords(){let{props:e}=this;var t;e.onColCoords&&null!==e.clientWidth&&e.onColCoords(new i.ba(this.rootElRef.current,(t=this.cellElRefs.currentMap,e.cells.map((e=>t[e.key]))),!0,!1))}}class z extends i.be{constructor(){super(...arguments),this.processSlotOptions=(0,i.z)(N),this.state={slatCoords:null},this.handleRootEl=e=>{e?this.context.registerInteractiveComponent(this,{el:e,isHitComboAllowed:this.props.isHitComboAllowed}):this.context.unregisterInteractiveComponent(this)},this.handleScrollRequest=e=>{let{onScrollTopRequest:t}=this.props,{slatCoords:n}=this.state;if(t&&n){if(e.time){let r=n.computeTimeTop(e.time);r=Math.ceil(r),r&&(r+=1),t(r)}return!0}return!1},this.handleColCoords=e=>{this.colCoords=e},this.handleSlatCoords=e=>{this.setState({slatCoords:e}),this.props.onSlatCoords&&this.props.onSlatCoords(e)}}render(){let{props:e,state:t}=this;return(0,s.az)("div",{className:"fc-timegrid-body",ref:this.handleRootEl,style:{width:e.clientWidth,minWidth:e.tableMinWidth}},(0,s.az)(v,{axis:e.axis,dateProfile:e.dateProfile,slatMetas:e.slatMetas,clientWidth:e.clientWidth,minHeight:e.expandRows?e.clientHeight:"",tableMinWidth:e.tableMinWidth,tableColGroupNode:e.axis?e.tableColGroupNode:null,onCoords:this.handleSlatCoords}),(0,s.az)(I,{cells:e.cells,axis:e.axis,dateProfile:e.dateProfile,businessHourSegs:e.businessHourSegs,bgEventSegs:e.bgEventSegs,fgEventSegs:e.fgEventSegs,dateSelectionSegs:e.dateSelectionSegs,eventSelection:e.eventSelection,eventDrag:e.eventDrag,eventResize:e.eventResize,todayRange:e.todayRange,nowDate:e.nowDate,nowIndicatorSegs:e.nowIndicatorSegs,clientWidth:e.clientWidth,tableMinWidth:e.tableMinWidth,tableColGroupNode:e.tableColGroupNode,slatCoords:t.slatCoords,onColCoords:this.handleColCoords,forPrint:e.forPrint}))}componentDidMount(){this.scrollResponder=this.context.createScrollResponder(this.handleScrollRequest)}componentDidUpdate(e){this.scrollResponder.update(e.dateProfile!==this.props.dateProfile)}componentWillUnmount(){this.scrollResponder.detach()}queryHit(e,t){let{dateEnv:n,options:r}=this.context,{colCoords:s}=this,{dateProfile:o}=this.props,{slatCoords:a}=this.state,{snapDuration:l,snapsPerSlot:c}=this.processSlotOptions(this.props.slotDuration,r.snapDuration),u=s.leftToIndex(e),d=a.positions.topToIndex(t);if(null!=u&&null!=d){let e=this.props.cells[u],r=a.positions.tops[d],h=a.positions.getHeight(d),f=(t-r)/h,p=d*c+Math.floor(f*c),g=this.props.cells[u].date,m=(0,i.bp)(o.slotMinTime,(0,i.bo)(l,p)),v=n.add(g,m),y=n.add(v,l);return{dateProfile:o,dateSpan:Object.assign({range:{start:v,end:y},allDay:!1},e.extraDateSpan),dayEl:s.els[u],rect:{left:s.lefts[u],right:s.rights[u],top:r,bottom:r+h},layer:0}}return null}}function N(e,t){let n=t||e,r=(0,i.bt)(e,n);return null===r&&(n=e,r=1),{snapDuration:n,snapsPerSlot:r}}class P extends i.bW{sliceRange(e,t){let n=[];for(let r=0;r<t.length;r+=1){let s=(0,i.o)(e,t[r]);s&&n.push({start:s.start,end:s.end,isStart:s.start.valueOf()===e.start.valueOf(),isEnd:s.end.valueOf()===e.end.valueOf(),col:r})}return n}}class Y extends i.be{constructor(){super(...arguments),this.buildDayRanges=(0,i.z)(B),this.slicer=new P,this.timeColsRef=(0,s.Vf)()}render(){let{props:e,context:t}=this,{dateProfile:n,dayTableModel:r}=e,{nowIndicator:o,nextDayThreshold:a}=t.options,l=this.buildDayRanges(r,n,t.dateEnv);return(0,s.az)(i.ch,{unit:o?"minute":"day"},((i,c)=>(0,s.az)(z,Object.assign({ref:this.timeColsRef},this.slicer.sliceProps(e,n,null,t,l),{forPrint:e.forPrint,axis:e.axis,dateProfile:n,slatMetas:e.slatMetas,slotDuration:e.slotDuration,cells:r.cells[0],tableColGroupNode:e.tableColGroupNode,tableMinWidth:e.tableMinWidth,clientWidth:e.clientWidth,clientHeight:e.clientHeight,expandRows:e.expandRows,nowDate:i,nowIndicatorSegs:o&&this.slicer.sliceNowDate(i,n,a,t,l),todayRange:c,onScrollTopRequest:e.onScrollTopRequest,onSlatCoords:e.onSlatCoords}))))}}function B(e,t,n){let r=[];for(let i of e.headerDates)r.push({start:n.add(i,t.slotMinTime),end:n.add(i,t.slotMaxTime)});return r}const H=[{hours:1},{minutes:30},{minutes:15},{seconds:30},{seconds:15}];function j(e,t,n,r,s){let o=new Date(0),a=e,l=(0,i.d)(0),c=n||function(e){let t,n,r;for(t=H.length-1;t>=0;t-=1)if(n=(0,i.d)(H[t]),r=(0,i.bt)(n,e),null!==r&&r>1)return n;return e}(r),u=[];for(;(0,i.bs)(a)<(0,i.bs)(t);){let e=s.add(o,a),t=null!==(0,i.bt)(l,c);u.push({date:e,time:a,key:e.toISOString(),isoTimeStr:(0,i.bu)(e),isLabeled:t}),a=(0,i.bp)(a,r),l=(0,i.bp)(l,r)}return u}function U(e,t){let n=new i.bO(e.renderRange,t);return new i.bV(n,!1)}const L={allDaySlot:Boolean};var V=(0,r.rx)({name:"@fullcalendar/timegrid",initialView:"timeGridWeek",optionRefiners:L,views:{timeGrid:{component:class extends f{constructor(){super(...arguments),this.buildTimeColsModel=(0,i.z)(U),this.buildSlatMetas=(0,i.z)(j)}render(){let{options:e,dateEnv:t,dateProfileGenerator:n}=this.context,{props:r}=this,{dateProfile:a}=r,l=this.buildTimeColsModel(a,n),c=this.allDaySplitter.splitProps(r),u=this.buildSlatMetas(a.slotMinTime,a.slotMaxTime,e.slotLabelInterval,e.slotDuration,t),{dayMinWidth:d}=e,h=!d,f=d,p=e.dayHeaders&&(0,s.az)(i.bK,{dates:l.headerDates,dateProfile:a,datesRepDistinctDays:!0,renderIntro:h?this.renderHeadAxis:null}),g=!1!==e.allDaySlot&&(t=>(0,s.az)(o.iz,Object.assign({},c.allDay,{dateProfile:a,dayTableModel:l,nextDayThreshold:e.nextDayThreshold,tableMinWidth:t.tableMinWidth,colGroupNode:t.tableColGroupNode,renderRowIntro:h?this.renderTableRowAxis:null,showWeekNumbers:!1,expandRows:!1,headerAlignElRef:this.headerElRef,clientWidth:t.clientWidth,clientHeight:t.clientHeight,forPrint:r.forPrint},this.getAllDayMaxEventProps()))),m=t=>(0,s.az)(Y,Object.assign({},c.timed,{dayTableModel:l,dateProfile:a,axis:h,slotDuration:e.slotDuration,slatMetas:u,forPrint:r.forPrint,tableColGroupNode:t.tableColGroupNode,tableMinWidth:t.tableMinWidth,clientWidth:t.clientWidth,clientHeight:t.clientHeight,onSlatCoords:this.handleSlatCoords,expandRows:t.expandRows,onScrollTopRequest:this.handleScrollTopRequest}));return f?this.renderHScrollLayout(p,g,m,l.colCnt,d,u,this.state.slatCoords):this.renderSimpleLayout(p,g,m)}},usesMinMaxTime:!0,allDaySlot:!0,slotDuration:"00:30:00",slotEventOverlap:!0},timeGridDay:{type:"timeGrid",duration:{days:1}},timeGridWeek:{type:"timeGrid",duration:{weeks:1}}}})}}]); \ No newline at end of file diff --git a/assets/js/9278f3d6.bdbbd293.js b/assets/js/9278f3d6.bdbbd293.js new file mode 100644 index 0000000000..643a484f58 --- /dev/null +++ b/assets/js/9278f3d6.bdbbd293.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3478],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>p});var i=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function r(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,i,o=function(e,t){if(null==e)return{};var n,i,o={},a=Object.keys(e);for(i=0;i<a.length;i++)n=a[i],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i<a.length;i++)n=a[i],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=i.createContext({}),d=function(e){var t=i.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},u=function(e){var t=d(e.components);return i.createElement(l.Provider,{value:t},e.children)},c="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},f=i.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),c=d(n),f=o,p=c["".concat(l,".").concat(f)]||c[f]||h[f]||a;return n?i.createElement(p,r(r({ref:t},u),{},{components:n})):i.createElement(p,r({ref:t},u))}));function p(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,r=new Array(a);r[0]=f;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[c]="string"==typeof e?e:o,r[1]=s;for(var d=2;d<a;d++)r[d]=n[d];return i.createElement.apply(null,r)}return i.createElement.apply(null,n)}f.displayName="MDXCreateElement"},96861:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>a,metadata:()=>s,toc:()=>d});var i=n(87462),o=(n(67294),n(3905));const a={title:"Kubernetes Nodes Anti Affinity",type:"Decision Record",status:"Draft",track:"KaaS"},r=void 0,s={unversionedId:"scs-0213-v1-k8s-nodes-anti-affinity",id:"scs-0213-v1-k8s-nodes-anti-affinity",title:"Kubernetes Nodes Anti Affinity",description:"Introduction",source:"@site/standards/scs-0213-v1-k8s-nodes-anti-affinity.md",sourceDirName:".",slug:"/scs-0213-v1-k8s-nodes-anti-affinity",permalink:"/standards/scs-0213-v1-k8s-nodes-anti-affinity",draft:!1,tags:[],version:"current",frontMatter:{title:"Kubernetes Nodes Anti Affinity",type:"Decision Record",status:"Draft",track:"KaaS"},sidebar:"standards",previous:{title:"SCS-0213",permalink:"/standards/standards/scs-0213"},next:{title:"SCS-0301",permalink:"/standards/standards/scs-0301"}},l={},d=[{value:"Introduction",id:"introduction",level:2},{value:"Glossary",id:"glossary",level:3},{value:"Motivation",id:"motivation",level:2},{value:"Design considerations",id:"design-considerations",level:2},{value:"Decision",id:"decision",level:2},{value:"Documents",id:"documents",level:2}],u={toc:d},c="wrapper";function h(e){let{components:t,...n}=e;return(0,o.kt)(c,(0,i.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"introduction"},"Introduction"),(0,o.kt)("p",null,"A Kubernetes instance is provided as a cluster, which consists of a set of worker machines,\nso called nodes. A cluster is composed of a control plane and at least one worker node.\nThe control plane manages the worker nodes and therefore the pods in the cluster by making\ndecisions about scheduling, event detection and global decisions. Inside the control plane,\nmultiple components exist, which can be duplicated and distributed over multiple machines\ninside the cluster. Typically, no user containers are run on these machines in order to\nseparate the control plane from the live system."),(0,o.kt)("h3",{id:"glossary"},"Glossary"),(0,o.kt)("p",null,"The following special terms are used throughout this decision record document:"),(0,o.kt)("table",null,(0,o.kt)("thead",{parentName:"table"},(0,o.kt)("tr",{parentName:"thead"},(0,o.kt)("th",{parentName:"tr",align:null},"Term"),(0,o.kt)("th",{parentName:"tr",align:null},"Meaning"))),(0,o.kt)("tbody",{parentName:"table"},(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Worker"),(0,o.kt)("td",{parentName:"tr",align:null},"Virtual or bare-metal machine, which hosts workloads of customers")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Control Plane"),(0,o.kt)("td",{parentName:"tr",align:null},"Virtual or bare-metal machine, which hosts the container orchestration layer that exposes the API and interfaces to define, deploy, and manage the lifecycle of containers.")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"Machine"),(0,o.kt)("td",{parentName:"tr",align:null},"Virtual or bare-metal entity with computational capabilities")))),(0,o.kt)("h2",{id:"motivation"},"Motivation"),(0,o.kt)("p",null,"In a productive environment, the control plane usually runs across multiple machines and\na cluster usually contains multiple worker nodes in order to provide fault-tolerance and\nhigh availability."),(0,o.kt)("p",null,"In order to ensure availability and scaling of workloads, even if some nodes in the cluster\ncould fail, they should be distributed over multiple nodes on different machines.\nThis can be steered with the Affinity or Anti Affinity features, which are separated by\nKubernetes into two features:"),(0,o.kt)("p",null,"Node Affinity\nThe Node Affinity feature allows to match pods according to logical matches of\nkey-value-pairs referring to labels of nodes.\nThese can be defined with different weights or preferences in order to allow fine-grained\nselection of nodes. The feature works similar to the Kubernetes nodeSelector.\nIt is defined in the PodSpec using the nodeAffinity field in the affinity section."),(0,o.kt)("p",null,"Pod Affinity\nPod Affinity or Pod Anti Affinity allows the constraint of pod scheduling based on the\nlabels of pods already running on a node.\nThis means the constraint will match other pods on a node according to their labels key-value-pairs\nand then either schedule the pod to the same (Affinity) or another (Anti Affinity) node.\nThis feature is also defined in the PodSpec using the podAffinity and podAntiAffinity\nfields in the affinity section. ","[3]"),(0,o.kt)("p",null,'Both features allow the usage of "required" or "preferred" keywords, which create\n"hard" or "soft" affinities. By using a hard affinity, a pod would need to be scheduled\naccording to the rules set. If this possibility is not given, the pod can\'t be scheduled.\nA soft affinity would allow scheduling even if the requirements are not fulfilled, but\nthey would be preferred if possible.'),(0,o.kt)("p",null,"These features allow efficient resource usage (e.g. by scheduling workloads to evenly\ndistribute across nodes) and provide fault-tolerance and therefore high availability.\nBut they also require more work during the setup of a service architecture, since nodes\nand pods need to be labelled and described consistently."),(0,o.kt)("p",null,"In the case of SCS, affinity of the workloads themselves is not relevant, since this\nfeature is mostly used by the customers of the providers.\nInstead, the expected standard should enable the Kubernetes cluster to handle Anti Affinity\nrules with a real physical separation as well as distributing the control plane over\nmultiple machines in order to provide fault-tolerance during system outages.\nIf the control plane survives an outage, a Kubernetes cluster can recover later on."),(0,o.kt)("h2",{id:"design-considerations"},"Design considerations"),(0,o.kt)("p",null,"SCS plans to require a Hard Anti Affinity and/or Redundancy for the control plane and\na Soft Anti Affinity for workers. This means, that Anti Affinity would be required for\nthe control planes and their pods and only optional (but encouraged) for workers."),(0,o.kt)("p",null,"In order to achieve the goals for these components, meaning availability and fault tolerance\nfor the control plane, an outage resistant cluster, and the availability\npromise given with Anti Affinity for pods on the worker nodes, a separation of nodes\non the hardware level would need to be achieved."),(0,o.kt)("p",null,'For the control plane, a reference to the "Kubernetes High Availability" ',"[1]",'\ncan be useful, since it provides two ways to set up a highly available cluster.\nBoth approaches are very similar. The "Stacked Control Plane" ',"[2]",' requires less infrastructure,\nbut also runs the risk of failed coupling, where if one node fails, the redundancy could be\ncompromised due to the loss of a complete control plane instance.\nThe "External ETCD" solves this problem, but also requires double the infrastructure, due\nto the externally incorporated etcd clusters.'),(0,o.kt)("p",null,'This also shows, that the wording "anti affinity" as used with Kubernetes pods is probably\nslightly misleading in the context of a Kubernetes control plane. It may consist of multiple\npods with individual tasks, but distributing them over different nodes through Anti Affinity\nwould probably still cascade the whole control plane into a complete failure, if one of\nthe used nodes goes down. It could be possible to replicate specific important pods and\nassign them to different nodes, but at this point, a redundant setup like presented in ',"[1]"," could be used.\nSo Anti Affinity in this context probably means more like distribution over multiple\nphysical machines, which needs to be planned beforehand on the machine/server level."),(0,o.kt)("p",null,'Therefore would it be preferred for the control plane to use a redundant setup, which\nis separated over different physical machines, meaning at least half of the control plane\nnodes runs on a different physical machine as the rest. The currently used ClusterAPI\nenables this by establishing the concept of "failure domains". These are used to control\nthe placement of k8s nodes and distribute them over multiple physical machines.\nFor example, a High Availability K8s cluster with three control plane nodes could be\ndistributed over three different availability zones (and therefore 3 different\nphysical machines) in order to survive the failure of one availability zone. ',"[5]"),(0,o.kt)("p",null,"For worker nodes, the whole idea of Anti Affinity is more of a preferable situation.\nThe nodes themselves should at best be distributed over different machines, but this\nis not a requirement, especially since smaller providers wouldn't have the capacity to\nprovide enough machines for these distributed Kubernetes clusters. Since customers that\nuse the Affinity or Topology spread constraint ","[4]"," features would be especially interested\nin the worker nodes that host their workloads, it should be ensured that a good labeling\nsystem is provided for the nodes in order to see if two nodes are hosted on the same machine."),(0,o.kt)("h2",{id:"decision"},"Decision"),(0,o.kt)("p",null,"The future standard should define a few important things in order to provide a solid base\nfor the usage and advantages of workloads with Anti Affinity rules."),(0,o.kt)("p",null,"Control planes SHOULD be made redundant in order to provide fault-tolerance and security\nagainst fatal errors on this layer, in the case of node failures. How this redundancy\nis achieved SHOULD be left to the providers, but since failure must be avoided, it is\nREQUIRED to at least duplicate control plane components. Half of every component SHOULD\nbe located on a different node on a different physical machine than the other half\nof them. This should provide at least the minimum requirements for a fault-tolerant control plane.\nFor the standard, there is also a possibility to define multiple stages of distributed infrastructure\nand only make sensible ones a requirement and the rest optional, e.g."),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"non-distributed clusters"),(0,o.kt)("li",{parentName:"ul"},"High-Availability clusters that are",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"distributed over multiple machines/availability zones"),(0,o.kt)("li",{parentName:"ul"},"distributed over multiple clouds"),(0,o.kt)("li",{parentName:"ul"},"distributed over multiple physical locations/datacenters")))),(0,o.kt)("p",null,"The worker nodes are RECOMMENDED to be distributed over different machines. In order to\nprovide clear information to the users, the nodes should be labeled to reflect the\nmapping to the underlying clusters. The labels can be obfuscated in order to not reveal\nthe underlying structures to customers and users. It should be noted, that it is NOT REQUIRED\nto have this anti affinity for the worker nodes due to the requirements of infrastructure\nand complexity associated with this."),(0,o.kt)("h2",{id:"documents"},"Documents"),(0,o.kt)("p",null,"Kubernetes High Availability Documentation ",(0,o.kt)("a",{parentName:"p",href:"https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/high-availability/"},"1"),"\nKubernetes High Availability - Stacked ETCD ",(0,o.kt)("a",{parentName:"p",href:"https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/ha-topology/#stacked-etcd-topology"},"2"),"\nAffinity and Anti-Affinity ",(0,o.kt)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity"},"3"),"\nTopology Spread Constraints ",(0,o.kt)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/scheduling-eviction/topology-spread-constraints/"},"4"),"\nSCS Multi AZ and Multi Cloud Environments ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/k8s-cluster-api-provider/blob/main/doc/usage/multi-az-and-multi-cloud-environments.md"},"5")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/929c4e1b.79dd42bc.js b/assets/js/929c4e1b.79dd42bc.js new file mode 100644 index 0000000000..02faef34b8 --- /dev/null +++ b/assets/js/929c4e1b.79dd42bc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5988],{3905:(e,t,r)=>{r.d(t,{Zo:()=>l,kt:()=>m});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function s(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),d=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},l=function(e){var t=d(e.components);return n.createElement(c.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),u=d(r),f=a,m=u["".concat(c,".").concat(f)]||u[f]||p[f]||o;return r?n.createElement(m,i(i({ref:t},l),{},{components:r})):n.createElement(m,i({ref:t},l))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=f;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[u]="string"==typeof e?e:a,i[1]=s;for(var d=2;d<o;d++)i[d]=r[d];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},71964:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>o,metadata:()=>s,toc:()=>d});var n=r(87462),a=(r(67294),r(3905));const o={},i="Introduction",s={unversionedId:"index",id:"index",title:"Introduction",description:"The Sovereign Cloud Stack (SCS) is a community-driven project that curates a set of standards\u2014including both existing standards, such as the OpenInfra interoperability guides or the CNCF Kubernetes conformance, and newly created ones\u2014to enable and ensure compatibility, openness, and sovereignty of cloud services across a wide range of providers, particularly small and medium businesses.",source:"@site/standards/index.md",sourceDirName:".",slug:"/",permalink:"/standards/",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"standards",next:{title:"Certification",permalink:"/standards/certification/overview"}},c={},d=[],l={toc:d},u="wrapper";function p(e){let{components:t,...o}=e;return(0,a.kt)(u,(0,n.Z)({},l,o,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"introduction"},"Introduction"),(0,a.kt)("p",null,"The Sovereign Cloud Stack (SCS) is a community-driven project that curates a set of standards\u2014including both existing standards, such as the OpenInfra interoperability guides or the CNCF Kubernetes conformance, and newly created ones\u2014to enable and ensure compatibility, openness, and sovereignty of cloud services across a wide range of providers, particularly small and medium businesses."),(0,a.kt)("p",null,"In addition, SCS provides a certification framework that enables these providers to verify and advertise their compliance with these standards. This framework consists of six kinds of certificates of varying scope, where each scope corresponds to a subset of the set of standards mentioned above."),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"Alt text",src:r(54773).Z,width:"835",height:"711"})),(0,a.kt)("p",null,"Learn more about these scopes as well as the currently certified clouds under ",(0,a.kt)("a",{parentName:"p",href:"/standards/certification/overview"},"Certification"),". More details on individual standards can be found under ",(0,a.kt)("a",{parentName:"p",href:"/standards/standards/overview"},"Standards"),"."))}p.isMDXComponent=!0},54773:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/image-01d5564077ed43bda1d921e522df7dd7.png"}}]); \ No newline at end of file diff --git a/assets/js/931040e8.21c93343.js b/assets/js/931040e8.21c93343.js new file mode 100644 index 0000000000..2490b366ab --- /dev/null +++ b/assets/js/931040e8.21c93343.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8888],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>k});var o=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?r(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):r(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,o,a=function(e,t){if(null==e)return{};var n,o,a={},r=Object.keys(e);for(o=0;o<r.length;o++)n=r[o],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o<r.length;o++)n=r[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=o.createContext({}),p=function(e){var t=o.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=p(e.components);return o.createElement(s.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},m=o.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),c=p(n),m=a,k=c["".concat(s,".").concat(m)]||c[m]||d[m]||r;return n?o.createElement(k,i(i({ref:t},u),{},{components:n})):o.createElement(k,i({ref:t},u))}));function k(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,i=new Array(r);i[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[c]="string"==typeof e?e:a,i[1]=l;for(var p=2;p<r;p++)i[p]=n[p];return o.createElement.apply(null,i)}return o.createElement.apply(null,n)}m.displayName="MDXCreateElement"},12051:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>r,metadata:()=>l,toc:()=>p});var o=n(87462),a=(n(67294),n(3905));const r={},i="Styleguide",l={unversionedId:"contribute/styleguide",id:"contribute/styleguide",title:"Styleguide",description:"Admonitions",source:"@site/community/contribute/styleguide.md",sourceDirName:"contribute",slug:"/contribute/styleguide",permalink:"/community/contribute/styleguide",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"community",previous:{title:"Installation",permalink:"/community/contribute/local-docusaurus-development-guide"},next:{title:"License considerations for SCS",permalink:"/community/license-considerations"}},s={},p=[{value:"Admonitions",id:"admonitions",level:2},{value:"Blockquotes",id:"blockquotes",level:2},{value:"Codeblocks",id:"codeblocks",level:2}],u={toc:p},c="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(c,(0,o.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"styleguide"},"Styleguide"),(0,a.kt)("h2",{id:"admonitions"},"Admonitions"),(0,a.kt)("p",null,"We adopt the default Admonition colors for Note, Tip, Info, Caution, Danger by docusaurus:"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://docusaurus.io/docs/2.0.1/markdown-features/admonitions"},"Docusaurus Admonitons")),(0,a.kt)("admonition",{type:"note"},(0,a.kt)("p",{parentName:"admonition"},"Some ",(0,a.kt)("strong",{parentName:"p"},"content")," with ",(0,a.kt)("em",{parentName:"p"},"Markdown")," ",(0,a.kt)("inlineCode",{parentName:"p"},"syntax"),".")),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"Some ",(0,a.kt)("strong",{parentName:"p"},"content")," with ",(0,a.kt)("em",{parentName:"p"},"Markdown")," ",(0,a.kt)("inlineCode",{parentName:"p"},"syntax"),".")),(0,a.kt)("admonition",{type:"info"},(0,a.kt)("p",{parentName:"admonition"},"Some ",(0,a.kt)("strong",{parentName:"p"},"content")," with ",(0,a.kt)("em",{parentName:"p"},"Markdown")," ",(0,a.kt)("inlineCode",{parentName:"p"},"syntax"),".")),(0,a.kt)("admonition",{type:"caution"},(0,a.kt)("p",{parentName:"admonition"},"Some ",(0,a.kt)("strong",{parentName:"p"},"content")," with ",(0,a.kt)("em",{parentName:"p"},"Markdown")," ",(0,a.kt)("inlineCode",{parentName:"p"},"syntax"),".")),(0,a.kt)("admonition",{type:"danger"},(0,a.kt)("p",{parentName:"admonition"},"Some ",(0,a.kt)("strong",{parentName:"p"},"content")," with ",(0,a.kt)("em",{parentName:"p"},"Markdown")," ",(0,a.kt)("inlineCode",{parentName:"p"},"syntax"),".")),(0,a.kt)("h2",{id:"blockquotes"},"Blockquotes"),(0,a.kt)("p",null,"Blockquotes should be handled with standard markdown ",(0,a.kt)("inlineCode",{parentName:"p"},">")),(0,a.kt)("p",null,"Example Blockquote:"),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"The raw data format is really the only sensible format option to use with RBD. asdasdasdasd asd asd a\nTechnically, you could use other QEMU-supported formats\n(such as qcow2 or vmdk), but doing so would add additional overhead, and would\nalso render the volume unsafe for virtual machine live\nmigration when caching (see below) is enabled.")),(0,a.kt)("h2",{id:"codeblocks"},"Codeblocks"),(0,a.kt)("p",null,"We support markdown language features for Codeblocks.\nIt is mandatory to define the language to be quoted, when using codeblocks.\nSyntax Highlighting is also supported by ",(0,a.kt)("a",{parentName:"p",href:"https://docusaurus.io/docs/2.0.1/markdown-features/code-blocks#supported-languages"},"Docusaurus via Prism"),".\nWe are using the GitHub language themeing as default."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-python",metastring:'title="Python example"',title:'"Python','example"':!0},"def code_block():\n # Everything in this function is part of the same code block\n print (1)\n print (2)\n\nfor i in range(4):\n # Everyting in this loop is part of the same code block\n print (i)\n")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-javascript",metastring:'title="Javascript example"',title:'"Javascript','example"':!0},'const code_block = () => {\n console.log("inside code_block");\n};\n')),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml",metastring:'title="YAML example"',title:'"YAML','example"':!0},'---\ndoe: "a deer, a female deer"\nray: "a drop of golden sun"\npi: 3.14159\nxmas: true\nfrench-hens: 3\ncalling-birds:\n - huey\n - dewey\n - louie\n - fred\n')),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ruby",metastring:'title="Ruby example"',title:'"Ruby','example"':!0},"require 'redcarpet'\nmarkdown = Redcarpet.new(\"Hello World!\")\nputs markdown.to_html\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.62081e2d.js b/assets/js/935f2afb.62081e2d.js new file mode 100644 index 0000000000..a8d8f4453b --- /dev/null +++ b/assets/js/935f2afb.62081e2d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"docs":[{"type":"link","label":"Introduction","href":"/docs/","docId":"index"},{"type":"category","label":"IaaS Layer","items":[{"type":"category","label":"Guides","items":[{"type":"category","label":"Deploy Guide","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Seed","href":"/docs/iaas/guides/deploy-guide/seed","docId":"iaas/guides/deploy-guide/seed"},{"type":"link","label":"Manager","href":"/docs/iaas/guides/deploy-guide/manager","docId":"iaas/guides/deploy-guide/manager"},{"type":"link","label":"Provisioning","href":"/docs/iaas/guides/deploy-guide/provisioning","docId":"iaas/guides/deploy-guide/provisioning"},{"type":"link","label":"Bootstrap","href":"/docs/iaas/guides/deploy-guide/bootstrap","docId":"iaas/guides/deploy-guide/bootstrap"},{"type":"category","label":"Services","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Infrastructure","href":"/docs/iaas/guides/deploy-guide/services/infrastructure","docId":"iaas/guides/deploy-guide/services/infrastructure"},{"type":"link","label":"Network","href":"/docs/iaas/guides/deploy-guide/services/network","docId":"iaas/guides/deploy-guide/services/network"},{"type":"link","label":"Logging & Monitoring","href":"/docs/iaas/guides/deploy-guide/services/logging-monitoring","docId":"iaas/guides/deploy-guide/services/logging-monitoring"},{"type":"link","label":"Ceph","href":"/docs/iaas/guides/deploy-guide/services/ceph","docId":"iaas/guides/deploy-guide/services/ceph"},{"type":"link","label":"OpenStack","href":"/docs/iaas/guides/deploy-guide/services/openstack","docId":"iaas/guides/deploy-guide/services/openstack"}],"href":"/docs/iaas/guides/deploy-guide/services/"},{"type":"category","label":"Examples","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Cloud in a Box","href":"/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box","docId":"iaas/guides/deploy-guide/examples/cloud-in-a-box"},{"type":"link","label":"Testbed","href":"/docs/iaas/guides/deploy-guide/examples/testbed","docId":"iaas/guides/deploy-guide/examples/testbed"}],"href":"/docs/iaas/guides/deploy-guide/examples/"}],"href":"/docs/iaas/guides/deploy-guide/"},{"type":"category","label":"Upgrade Guide","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Manager","href":"/docs/iaas/guides/upgrade-guide/manager","docId":"iaas/guides/upgrade-guide/manager"},{"type":"link","label":"Network","href":"/docs/iaas/guides/upgrade-guide/network","docId":"iaas/guides/upgrade-guide/network"},{"type":"link","label":"Ceph","href":"/docs/iaas/guides/upgrade-guide/ceph","docId":"iaas/guides/upgrade-guide/ceph"},{"type":"link","label":"Docker","href":"/docs/iaas/guides/upgrade-guide/docker","docId":"iaas/guides/upgrade-guide/docker"},{"type":"link","label":"Infrastructure","href":"/docs/iaas/guides/upgrade-guide/infrastructure","docId":"iaas/guides/upgrade-guide/infrastructure"},{"type":"link","label":"Logging & Monitoring","href":"/docs/iaas/guides/upgrade-guide/logging-monitoring","docId":"iaas/guides/upgrade-guide/logging-monitoring"},{"type":"link","label":"OpenStack","href":"/docs/iaas/guides/upgrade-guide/openstack","docId":"iaas/guides/upgrade-guide/openstack"}],"href":"/docs/iaas/guides/upgrade-guide/"},{"type":"category","label":"Configuration Guide","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Configuration repository","href":"/docs/iaas/guides/configuration-guide/configuration-repository","docId":"iaas/guides/configuration-guide/configuration-repository"},{"type":"link","label":"Inventory","href":"/docs/iaas/guides/configuration-guide/inventory","docId":"iaas/guides/configuration-guide/inventory"},{"type":"link","label":"Manager","href":"/docs/iaas/guides/configuration-guide/manager","docId":"iaas/guides/configuration-guide/manager"},{"type":"category","label":"Commons","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Network","href":"/docs/iaas/guides/configuration-guide/commons/network","docId":"iaas/guides/configuration-guide/commons/network"},{"type":"link","label":"Packages","href":"/docs/iaas/guides/configuration-guide/commons/packages","docId":"iaas/guides/configuration-guide/commons/packages"},{"type":"link","label":"Services","href":"/docs/iaas/guides/configuration-guide/commons/services","docId":"iaas/guides/configuration-guide/commons/services"},{"type":"link","label":"SSH Config","href":"/docs/iaas/guides/configuration-guide/commons/sshconfig","docId":"iaas/guides/configuration-guide/commons/sshconfig"},{"type":"link","label":"Sysctl","href":"/docs/iaas/guides/configuration-guide/commons/sysctl","docId":"iaas/guides/configuration-guide/commons/sysctl"},{"type":"link","label":"Timezone","href":"/docs/iaas/guides/configuration-guide/commons/timezone","docId":"iaas/guides/configuration-guide/commons/timezone"}],"href":"/docs/iaas/guides/configuration-guide/commons/"},{"type":"link","label":"Services","href":"/docs/iaas/guides/configuration-guide/services/","docId":"iaas/guides/configuration-guide/services/index"},{"type":"link","label":"Ceph","href":"/docs/iaas/guides/configuration-guide/ceph","docId":"iaas/guides/configuration-guide/ceph"},{"type":"category","label":"OpenStack","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Horizon","href":"/docs/iaas/guides/configuration-guide/openstack/horizon","docId":"iaas/guides/configuration-guide/openstack/horizon"},{"type":"link","label":"Keystone","href":"/docs/iaas/guides/configuration-guide/openstack/keystone","docId":"iaas/guides/configuration-guide/openstack/keystone"}],"href":"/docs/iaas/guides/configuration-guide/openstack/"},{"type":"link","label":"Proxy","href":"/docs/iaas/guides/configuration-guide/proxy","docId":"iaas/guides/configuration-guide/proxy"},{"type":"link","label":"Self-signed certificates","href":"/docs/iaas/guides/configuration-guide/self-signed-certificates","docId":"iaas/guides/configuration-guide/self-signed-certificates"}],"href":"/docs/iaas/guides/configuration-guide/"},{"type":"category","label":"Operations Guide","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Manager","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Apply","href":"/docs/iaas/guides/operations-guide/manager/apply","docId":"iaas/guides/operations-guide/manager/apply"},{"type":"link","label":"Logging","href":"/docs/iaas/guides/operations-guide/manager/log","docId":"iaas/guides/operations-guide/manager/log"},{"type":"link","label":"Console","href":"/docs/iaas/guides/operations-guide/manager/console","docId":"iaas/guides/operations-guide/manager/console"},{"type":"link","label":"Task","href":"/docs/iaas/guides/operations-guide/manager/task","docId":"iaas/guides/operations-guide/manager/task"}],"href":"/docs/iaas/guides/operations-guide/manager/"},{"type":"link","label":"Ceph","href":"/docs/iaas/guides/operations-guide/ceph","docId":"iaas/guides/operations-guide/ceph"},{"type":"category","label":"OpenStack","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Cinder","href":"/docs/iaas/guides/operations-guide/openstack/cinder","docId":"iaas/guides/operations-guide/openstack/cinder"},{"type":"link","label":"Octavia","href":"/docs/iaas/guides/operations-guide/openstack/octavia","docId":"iaas/guides/operations-guide/openstack/octavia"},{"type":"category","label":"Day-2 Operations","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Image Manager","href":"/docs/iaas/guides/operations-guide/openstack/day2-operations/image-manager","docId":"iaas/guides/operations-guide/openstack/day2-operations/image-manager"},{"type":"link","label":"Flavor Manager","href":"/docs/iaas/guides/operations-guide/openstack/day2-operations/flavor-manager","docId":"iaas/guides/operations-guide/openstack/day2-operations/flavor-manager"},{"type":"link","label":"Resource Manager","href":"/docs/iaas/guides/operations-guide/openstack/day2-operations/resource-manager","docId":"iaas/guides/operations-guide/openstack/day2-operations/resource-manager"},{"type":"link","label":"Project Manager","href":"/docs/iaas/guides/operations-guide/openstack/day2-operations/project-manager","docId":"iaas/guides/operations-guide/openstack/day2-operations/project-manager"},{"type":"link","label":"Sandbox Manager","href":"/docs/iaas/guides/operations-guide/openstack/day2-operations/sandbox-manager","docId":"iaas/guides/operations-guide/openstack/day2-operations/sandbox-manager"}],"href":"/docs/iaas/guides/operations-guide/openstack/day2-operations/"}],"href":"/docs/iaas/guides/operations-guide/openstack/"}],"href":"/docs/iaas/guides/operations-guide/"},{"type":"category","label":"Troubleshooting Guide","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Manager","href":"/docs/iaas/guides/troubleshooting-guide/manager","docId":"iaas/guides/troubleshooting-guide/manager"},{"type":"link","label":"OpenStack","href":"/docs/iaas/guides/troubleshooting-guide/openstack","docId":"iaas/guides/troubleshooting-guide/openstack"}],"href":"/docs/iaas/guides/troubleshooting-guide/"},{"type":"link","label":"Guides","href":"/docs/iaas/guides/","docId":"iaas/guides/index"},{"type":"category","label":"Other Guides","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Contributor Guide","href":"/docs/iaas/guides/other-guides/contributor-guide","docId":"iaas/guides/other-guides/contributor-guide"},{"type":"category","label":"Developer Guide","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Releases","href":"/docs/iaas/guides/other-guides/developer-guide/releases","docId":"iaas/guides/other-guides/developer-guide/releases"},{"type":"link","label":"Scripts","href":"/docs/iaas/guides/other-guides/developer-guide/scripts","docId":"iaas/guides/other-guides/developer-guide/scripts"},{"type":"link","label":"Zuul Ci","href":"/docs/iaas/guides/other-guides/developer-guide/zuul-ci","docId":"iaas/guides/other-guides/developer-guide/zuul-ci"}],"href":"/docs/iaas/guides/other-guides/developer-guide/"},{"type":"link","label":"Style Guide","href":"/docs/iaas/guides/other-guides/style-guide","docId":"iaas/guides/other-guides/style-guide"},{"type":"link","label":"Zuul CI","href":"/docs/iaas/guides/other-guides/zuul","docId":"iaas/guides/other-guides/zuul"}],"href":"/docs/iaas/guides/other-guides/"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Components","items":[{"type":"link","label":"Image Manager","href":"/docs/iaas/components/image-manager","docId":"iaas/components/image-manager"},{"type":"link","label":"Flavor Manager","href":"/docs/iaas/components/flavor-manager","docId":"iaas/components/flavor-manager"}],"collapsed":true,"collapsible":true,"href":"/docs/category/components"}],"collapsed":true,"collapsible":true,"href":"/docs/category/iaas-layer"},{"type":"category","label":"Container Layer","items":[{"type":"category","label":"Components","items":[{"type":"category","label":"K8s Cluster API Provider","items":[{"type":"link","label":"Overview","href":"/docs/container/components/k8s-cluster-api-provider/doc/overview","docId":"container/components/k8s-cluster-api-provider/doc/overview"},{"type":"link","label":"Requirements","href":"/docs/container/components/k8s-cluster-api-provider/doc/requirements","docId":"container/components/k8s-cluster-api-provider/doc/requirements"},{"type":"link","label":"Quickstart","href":"/docs/container/components/k8s-cluster-api-provider/doc/quickstart","docId":"container/components/k8s-cluster-api-provider/doc/quickstart"},{"type":"link","label":"Makefile reference","href":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","docId":"container/components/k8s-cluster-api-provider/doc/make-reference"},{"type":"link","label":"Application Credentials","href":"/docs/container/components/k8s-cluster-api-provider/doc/application-credentials","docId":"container/components/k8s-cluster-api-provider/doc/application-credentials"},{"type":"link","label":"Configuration","href":"/docs/container/components/k8s-cluster-api-provider/doc/configuration","docId":"container/components/k8s-cluster-api-provider/doc/configuration"},{"type":"link","label":"Maintenance and Troubleshooting Guide for SCS k8s-cluster-api-provider","href":"/docs/container/components/k8s-cluster-api-provider/doc/Maintenance_and_Troubleshooting","docId":"container/components/k8s-cluster-api-provider/doc/Maintenance_and_Troubleshooting"},{"type":"link","label":"Ingress with externalTrafficPolicy: local","href":"/docs/container/components/k8s-cluster-api-provider/doc/LoadBalancer-ExtTrafficLocal","docId":"container/components/k8s-cluster-api-provider/doc/LoadBalancer-ExtTrafficLocal"},{"type":"link","label":"SCS k8s-cluster-api-provider upgrade guide","href":"/docs/container/components/k8s-cluster-api-provider/doc/Upgrade-Guide","docId":"container/components/k8s-cluster-api-provider/doc/Upgrade-Guide"},{"type":"link","label":"Roadmap","href":"/docs/container/components/k8s-cluster-api-provider/doc/roadmap","docId":"container/components/k8s-cluster-api-provider/doc/roadmap"},{"type":"category","label":"Usage","items":[{"type":"link","label":"Usage","href":"/docs/container/components/k8s-cluster-api-provider/doc/usage/","docId":"container/components/k8s-cluster-api-provider/doc/usage/usage"},{"type":"link","label":"Create a new cluster","href":"/docs/container/components/k8s-cluster-api-provider/doc/usage/create-new-cluster","docId":"container/components/k8s-cluster-api-provider/doc/usage/create-new-cluster"},{"type":"link","label":"Managing many clusters","href":"/docs/container/components/k8s-cluster-api-provider/doc/usage/managing-many-clusters","docId":"container/components/k8s-cluster-api-provider/doc/usage/managing-many-clusters"},{"type":"link","label":"Cluster Management on the capi management node","href":"/docs/container/components/k8s-cluster-api-provider/doc/usage/cluster-mgmt-capi-mgmt-node","docId":"container/components/k8s-cluster-api-provider/doc/usage/cluster-mgmt-capi-mgmt-node"},{"type":"link","label":"Multi-AZ and multi-cloud environments","href":"/docs/container/components/k8s-cluster-api-provider/doc/usage/multi-az-and-multi-cloud-environments","docId":"container/components/k8s-cluster-api-provider/doc/usage/multi-az-and-multi-cloud-environments"},{"type":"link","label":"Testing","href":"/docs/container/components/k8s-cluster-api-provider/doc/usage/testing","docId":"container/components/k8s-cluster-api-provider/doc/usage/testing"}],"collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true,"href":"/docs/category/k8s-cluster-api-provider"}],"collapsed":true,"collapsible":true,"href":"/docs/category/components-1"}],"collapsed":true,"collapsible":true,"href":"/docs/container/"},{"type":"category","label":"Operating SCS","items":[{"type":"category","label":"Components","items":[{"type":"category","label":"Status Page API","items":[{"type":"link","label":"Overview","href":"/docs/operating-scs/components/status-page/docs/overview","docId":"operating-scs/components/status-page/docs/overview"},{"type":"link","label":"Component Overview","href":"/docs/operating-scs/components/status-page/docs/component_overview","docId":"operating-scs/components/status-page/docs/component_overview"},{"type":"link","label":"Components","href":"/docs/operating-scs/components/status-page/docs/components","docId":"operating-scs/components/status-page/docs/components"},{"type":"link","label":"\\"Levels of consensus\\"","href":"/docs/operating-scs/components/status-page/docs/levels_of_consensus","docId":"operating-scs/components/status-page/docs/levels_of_consensus"}],"collapsed":true,"collapsible":true,"href":"/docs/category/status-page-api"}],"collapsed":true,"collapsible":true,"href":"/docs/category/components-2"},{"type":"category","label":"Metering","items":[{"type":"link","label":"Metering Configuration","href":"/docs/operating-scs/metering/meter_configuration","docId":"operating-scs/metering/meter_configuration"}],"collapsed":true,"collapsible":true,"href":"/docs/category/metering"}],"collapsed":true,"collapsible":true,"href":"/docs/category/operating-scs"},{"type":"category","label":"Identity and Access Management (IAM)","items":[{"type":"link","label":"Proposal for documentation for Keycloak to Keycloak Federation (WebSSO)","href":"/docs/iam/intra-SCS-federation-setup-description-for-osism-doc-operations","docId":"iam/intra-SCS-federation-setup-description-for-osism-doc-operations"}],"collapsed":true,"collapsible":true,"href":"/docs/category/identity-and-access-management-iam"},{"type":"category","label":"Releases","items":[{"type":"link","label":"Release Notes for SCS Release 0","href":"/docs/releases/Release0","docId":"releases/Release0"},{"type":"link","label":"Release Notes for SCS Release 1","href":"/docs/releases/Release1","docId":"releases/Release1"},{"type":"link","label":"Release Notes for SCS Release 2","href":"/docs/releases/Release2","docId":"releases/Release2"},{"type":"link","label":"Release Notes for SCS Release 3","href":"/docs/releases/Release3","docId":"releases/Release3"},{"type":"link","label":"Release Notes for SCS Release 4","href":"/docs/releases/Release4","docId":"releases/Release4"},{"type":"link","label":"Release Notes for SCS Release 5","href":"/docs/releases/Release5","docId":"releases/Release5"}],"collapsed":true,"collapsible":true,"href":"/docs/category/releases"},{"type":"link","label":"FAQ","href":"/docs/faq/","docId":"faq/index"},{"type":"link","label":"Glossary","href":"/docs/glossary","docId":"glossary"}]},"docs":{"container/components/k8s-cluster-api-provider/doc/application-credentials":{"id":"container/components/k8s-cluster-api-provider/doc/application-credentials","title":"Application Credentials","description":"The terraform creates an application credential that it passes into the created VM. This one is then used to authenticate the cluster API provider against the OpenStack API to allow it to create resources needed for the k8s cluster.","sidebar":"docs"},"container/components/k8s-cluster-api-provider/doc/configuration":{"id":"container/components/k8s-cluster-api-provider/doc/configuration","title":"Configuration","description":"Supported k8s versions","sidebar":"docs"},"container/components/k8s-cluster-api-provider/doc/continuous-integration":{"id":"container/components/k8s-cluster-api-provider/doc/continuous-integration","title":"Continuous integration","description":"Project k8s-cluster-api-provider uses SCS Zuul CI platform to"},"container/components/k8s-cluster-api-provider/doc/LoadBalancer-ExtTrafficLocal":{"id":"container/components/k8s-cluster-api-provider/doc/LoadBalancer-ExtTrafficLocal","title":"Ingress with externalTrafficPolicy: local","description":"Setting up the nginx ingress controller from the upstream deployment templates","sidebar":"docs"},"container/components/k8s-cluster-api-provider/doc/Maintenance_and_Troubleshooting":{"id":"container/components/k8s-cluster-api-provider/doc/Maintenance_and_Troubleshooting","title":"Maintenance and Troubleshooting Guide for SCS k8s-cluster-api-provider","description":"Client Certificates in Kubernetes expire after one year.","sidebar":"docs"},"container/components/k8s-cluster-api-provider/doc/make-reference":{"id":"container/components/k8s-cluster-api-provider/doc/make-reference","title":"Makefile reference","description":"This is a reference to the Makefile targets.","sidebar":"docs"},"container/components/k8s-cluster-api-provider/doc/overview":{"id":"container/components/k8s-cluster-api-provider/doc/overview","title":"Overview","description":"Creating and scaling k8s clusters on demand is providing a lot of flexibility to DevOps teams that develop, test, deploy and operate services and applications.","sidebar":"docs"},"container/components/k8s-cluster-api-provider/doc/quickstart":{"id":"container/components/k8s-cluster-api-provider/doc/quickstart","title":"Quickstart","description":"This guide shows you how to get working Kubernetes clusters on a SCS cloud","sidebar":"docs"},"container/components/k8s-cluster-api-provider/doc/requirements":{"id":"container/components/k8s-cluster-api-provider/doc/requirements","title":"Requirements","description":"Cluster API requires an existing Kubernetes cluster to operate. In our setup, we","sidebar":"docs"},"container/components/k8s-cluster-api-provider/doc/roadmap":{"id":"container/components/k8s-cluster-api-provider/doc/roadmap","title":"Roadmap","description":"Advanced cluster templating with helm (Technical Preview)","sidebar":"docs"},"container/components/k8s-cluster-api-provider/doc/Upgrade-Guide":{"id":"container/components/k8s-cluster-api-provider/doc/Upgrade-Guide","title":"SCS k8s-cluster-api-provider upgrade guide","description":"SCS k8s-cluster-api-provider upgrade guide","sidebar":"docs"},"container/components/k8s-cluster-api-provider/doc/usage/cluster-mgmt-capi-mgmt-node":{"id":"container/components/k8s-cluster-api-provider/doc/usage/cluster-mgmt-capi-mgmt-node","title":"Cluster Management on the capi management node","description":"You can use make ssh to log in to the capi management server. There you can issueclusterctl and kubectl (aliased","sidebar":"docs"},"container/components/k8s-cluster-api-provider/doc/usage/containter-registry-configuration":{"id":"container/components/k8s-cluster-api-provider/doc/usage/containter-registry-configuration","title":"Container registry configuration","description":"Containerd as container runtime"},"container/components/k8s-cluster-api-provider/doc/usage/create-new-cluster":{"id":"container/components/k8s-cluster-api-provider/doc/usage/create-new-cluster","title":"Create a new cluster","description":"On the management server (login with make ssh), create a directory (below the home of","sidebar":"docs"},"container/components/k8s-cluster-api-provider/doc/usage/custom-ca":{"id":"container/components/k8s-cluster-api-provider/doc/usage/custom-ca","title":"Custom CA","description":"OpenStack provides public-facing API endpoints which protection by SSL/TLS certificates"},"container/components/k8s-cluster-api-provider/doc/usage/gateway-api":{"id":"container/components/k8s-cluster-api-provider/doc/usage/gateway-api","title":"Gateway-API","description":"Starting with R5, this k8s-solution offers experimental kubernetes gateway API support. You need to set deploygatewayapi to true in your environments configuration. Also you need to use cilium as your CNI (default since R5)."},"container/components/k8s-cluster-api-provider/doc/usage/harbor":{"id":"container/components/k8s-cluster-api-provider/doc/usage/harbor","title":"Harbor","description":"Project k8s-harbor is used for the SCS Harbor"},"container/components/k8s-cluster-api-provider/doc/usage/managing-many-clusters":{"id":"container/components/k8s-cluster-api-provider/doc/usage/managing-many-clusters","title":"Managing many clusters","description":"While the scripts all use a default testcluster, they have","sidebar":"docs"},"container/components/k8s-cluster-api-provider/doc/usage/migrate-to-cluster-class":{"id":"container/components/k8s-cluster-api-provider/doc/usage/migrate-to-cluster-class","title":"Migration to ClusterClass","description":"From #600, this repository uses CAPI"},"container/components/k8s-cluster-api-provider/doc/usage/multi-az-and-multi-cloud-environments":{"id":"container/components/k8s-cluster-api-provider/doc/usage/multi-az-and-multi-cloud-environments","title":"Multi-AZ and multi-cloud environments","description":"The provided cluster-template.yaml assumes that all control nodes on one hand and all worker nodes on the other are","sidebar":"docs"},"container/components/k8s-cluster-api-provider/doc/usage/testing":{"id":"container/components/k8s-cluster-api-provider/doc/usage/testing","title":"Testing","description":"To test the created k8s cluster, there are several tools available.","sidebar":"docs"},"container/components/k8s-cluster-api-provider/doc/usage/usage":{"id":"container/components/k8s-cluster-api-provider/doc/usage/usage","title":"Usage","description":"The subsequent management of the cluster can best be done from the management server VM, as it has all the tools","sidebar":"docs"},"container/deployment-examples/a/hardware":{"id":"container/deployment-examples/a/hardware","title":"Hardware Requirements","description":"TODO"},"container/deployment-examples/a/index":{"id":"container/deployment-examples/a/index","title":"Overview","description":"TODO"},"container/deployment-examples/a/software":{"id":"container/deployment-examples/a/software","title":"Software Requirements","description":"TODO"},"container/guides/guide1":{"id":"container/guides/guide1","title":"Guide 1","description":"TODO"},"container/index":{"id":"container/index","title":"Container Layer Introduction","description":"The container layer within the Sovereign Cloud Stack (SCS) offers a robust solution for managing container workloads on a Kubernetes infrastructure. It facilitates the on-demand creation and scaling of Kubernetes clusters, catering to various needs across development, testing, deployment, and operation of services and applications. While the container layer is versatile for a range of use cases, the most common ones include:","sidebar":"docs"},"container/overview/architecture":{"id":"container/overview/architecture","title":"Architecture","description":"TODO"},"container/overview/knowledge":{"id":"container/overview/knowledge","title":"Knowledge","description":"TODO"},"faq/index":{"id":"faq/index","title":"Frequently Asked Questions","description":"What does SCS stand for?","sidebar":"docs"},"getting-started/containerization":{"id":"getting-started/containerization","title":"Containerization","description":"TODO"},"getting-started/overview":{"id":"getting-started/overview","title":"Overview","description":"TODO"},"getting-started/virtualization":{"id":"getting-started/virtualization","title":"Virtualization","description":"TODO"},"glossary":{"id":"glossary","title":"Glossary","description":"This file serves as the central glossary within SCS. It is intended to clearly","sidebar":"docs"},"iaas/components/flavor-manager":{"id":"iaas/components/flavor-manager","title":"Flavor Manager","description":"Overview","sidebar":"docs"},"iaas/components/image-manager":{"id":"iaas/components/image-manager","title":"Image Manager","description":"The OpenStack Image Manager is a tool for managing all images on an OpenStack environment","sidebar":"docs"},"iaas/components/index":{"id":"iaas/components/index","title":"Day-2 Operations","description":""},"iaas/components/project-manager":{"id":"iaas/components/project-manager","title":"Project Manager","description":""},"iaas/components/resource-manager":{"id":"iaas/components/resource-manager","title":"Resource Manager","description":"Octavia"},"iaas/components/sandbox-manager":{"id":"iaas/components/sandbox-manager","title":"Sandbox Manager","description":""},"iaas/guides/configuration-guide/ceph":{"id":"iaas/guides/configuration-guide/ceph","title":"Ceph","description":"Unique Identifier","sidebar":"docs"},"iaas/guides/configuration-guide/commons/index":{"id":"iaas/guides/configuration-guide/commons/index","title":"Commons","description":"This section contains the documentation of the Ansible collection osism.commons.","sidebar":"docs"},"iaas/guides/configuration-guide/commons/network":{"id":"iaas/guides/configuration-guide/commons/network","title":"Network","description":"The osism.commons.network role is used for the netwok configuration.","sidebar":"docs"},"iaas/guides/configuration-guide/commons/packages":{"id":"iaas/guides/configuration-guide/commons/packages","title":"Packages","description":"With the osism.commons.packages role, it is possible to add packages on a node","sidebar":"docs"},"iaas/guides/configuration-guide/commons/services":{"id":"iaas/guides/configuration-guide/commons/services","title":"Services","description":"With the osism.commons.services role, it is possible to manage services on a node","sidebar":"docs"},"iaas/guides/configuration-guide/commons/sshconfig":{"id":"iaas/guides/configuration-guide/commons/sshconfig","title":"SSH Config","description":"With the osism.commons.sshconfig role, it is possible to manage a SSH config","sidebar":"docs"},"iaas/guides/configuration-guide/commons/sysctl":{"id":"iaas/guides/configuration-guide/commons/sysctl","title":"Sysctl","description":"With the osism.commons.sysctl role, it is possible to manage the attributes of the kernel","sidebar":"docs"},"iaas/guides/configuration-guide/commons/timezone":{"id":"iaas/guides/configuration-guide/commons/timezone","title":"Timezone","description":"With the osism.commons.timezone role, it is possible to manage the used timezone on a node.","sidebar":"docs"},"iaas/guides/configuration-guide/configuration-repository":{"id":"iaas/guides/configuration-guide/configuration-repository","title":"Configuration Repository","description":"The configuration required for OSISM is stored in a single Git monorepo, the configuration repository.","sidebar":"docs"},"iaas/guides/configuration-guide/index":{"id":"iaas/guides/configuration-guide/index","title":"Configuration Guide","description":"","sidebar":"docs"},"iaas/guides/configuration-guide/inventory":{"id":"iaas/guides/configuration-guide/inventory","title":"Inventory","description":"The inventory used for the environment is located in the inventory directory.","sidebar":"docs"},"iaas/guides/configuration-guide/manager":{"id":"iaas/guides/configuration-guide/manager","title":"Manager","description":"Stable release","sidebar":"docs"},"iaas/guides/configuration-guide/openstack/horizon":{"id":"iaas/guides/configuration-guide/openstack/horizon","title":"Horizon","description":"Problems uploading machine images larger than 1 GiB","sidebar":"docs"},"iaas/guides/configuration-guide/openstack/index":{"id":"iaas/guides/configuration-guide/openstack/index","title":"OpenStack","description":"Network interfaces","sidebar":"docs"},"iaas/guides/configuration-guide/openstack/keystone":{"id":"iaas/guides/configuration-guide/openstack/keystone","title":"Keystone","description":"Domain manager role","sidebar":"docs"},"iaas/guides/configuration-guide/proxy":{"id":"iaas/guides/configuration-guide/proxy","title":"Proxy","description":"","sidebar":"docs"},"iaas/guides/configuration-guide/self-signed-certificates":{"id":"iaas/guides/configuration-guide/self-signed-certificates","title":"Self-signed certificates","description":"OpenStack","sidebar":"docs"},"iaas/guides/configuration-guide/services/index":{"id":"iaas/guides/configuration-guide/services/index","title":"Services","description":"This section contains the documentation of the Ansible collection osism.services.","sidebar":"docs"},"iaas/guides/deploy-guide/bootstrap":{"id":"iaas/guides/deploy-guide/bootstrap","title":"Bootstrap","description":"Before the nodes can be bootstrapped, they must all have already been provisioned.","sidebar":"docs"},"iaas/guides/deploy-guide/examples/cloud-in-a-box":{"id":"iaas/guides/deploy-guide/examples/cloud-in-a-box","title":"Cloud in a Box - CiaB","description":"\ud83d\udca1 Cloud in a Box (CiaB) is a minimalistic installation of the latest stable OSISM release with only services which are needed to","sidebar":"docs"},"iaas/guides/deploy-guide/examples/index":{"id":"iaas/guides/deploy-guide/examples/index","title":"Examples","description":"","sidebar":"docs"},"iaas/guides/deploy-guide/examples/testbed":{"id":"iaas/guides/deploy-guide/examples/testbed","title":"Testbed","description":"\ud83d\udca1 With the OSISM Testbed, it is possible to run a full Sovereign Cloud Stack","sidebar":"docs"},"iaas/guides/deploy-guide/index":{"id":"iaas/guides/deploy-guide/index","title":"Deploy Guide","description":"\ud83d\udca1 The Deploy Guide describe how to provision, bootstrap and deploy nodes and services.","sidebar":"docs"},"iaas/guides/deploy-guide/manager":{"id":"iaas/guides/deploy-guide/manager","title":"Manager","description":"Change into the configuration/environments/manager directory of the configuration repository.","sidebar":"docs"},"iaas/guides/deploy-guide/provisioning":{"id":"iaas/guides/deploy-guide/provisioning","title":"Provisioning of management and control plane nodes","description":"For the initial deployment of the management plane and the control plane of OSISM,","sidebar":"docs"},"iaas/guides/deploy-guide/seed":{"id":"iaas/guides/deploy-guide/seed","title":"Seed","description":"The seed node is used once for the initial bootstrap of the manager node. It is sufficient","sidebar":"docs"},"iaas/guides/deploy-guide/services/ceph":{"id":"iaas/guides/deploy-guide/services/ceph","title":"Ceph","description":"1. Deploy base services.","sidebar":"docs"},"iaas/guides/deploy-guide/services/index":{"id":"iaas/guides/deploy-guide/services/index","title":"Services","description":"Getting started","sidebar":"docs"},"iaas/guides/deploy-guide/services/infrastructure":{"id":"iaas/guides/deploy-guide/services/infrastructure","title":"Infrastructure","description":"Common issues with deploying infrastructure services required by OpenStack","sidebar":"docs"},"iaas/guides/deploy-guide/services/logging-monitoring":{"id":"iaas/guides/deploy-guide/services/logging-monitoring","title":"Logging & Monitoring","description":"Common issues with deploying logging & monitoring services provided by Kolla","sidebar":"docs"},"iaas/guides/deploy-guide/services/network":{"id":"iaas/guides/deploy-guide/services/network","title":"Network","description":"Open vSwitch","sidebar":"docs"},"iaas/guides/deploy-guide/services/openstack":{"id":"iaas/guides/deploy-guide/services/openstack","title":"OpenStack","description":"Common issues with deploying OpenStack services are documented in the","sidebar":"docs"},"iaas/guides/index":{"id":"iaas/guides/index","title":"Guides","description":"","sidebar":"docs"},"iaas/guides/operations-guide/ceph":{"id":"iaas/guides/operations-guide/ceph","title":"Ceph operations cheatsheet","description":"Where to find docs","sidebar":"docs"},"iaas/guides/operations-guide/index":{"id":"iaas/guides/operations-guide/index","title":"Operations Guide","description":"Node states","sidebar":"docs"},"iaas/guides/operations-guide/manager/apply":{"id":"iaas/guides/operations-guide/manager/apply","title":"Apply","description":"List all available plays","sidebar":"docs"},"iaas/guides/operations-guide/manager/console":{"id":"iaas/guides/operations-guide/manager/console","title":"Console","description":"A console command is available in the OSISM CLI. This allows specific parts of the","sidebar":"docs"},"iaas/guides/operations-guide/manager/index":{"id":"iaas/guides/operations-guide/manager/index","title":"Manager","description":"OSISM orchestrator","sidebar":"docs"},"iaas/guides/operations-guide/manager/log":{"id":"iaas/guides/operations-guide/manager/log","title":"Logging","description":"Ansible","sidebar":"docs"},"iaas/guides/operations-guide/manager/task":{"id":"iaas/guides/operations-guide/manager/task","title":"Task","description":"List","sidebar":"docs"},"iaas/guides/operations-guide/openstack/cinder":{"id":"iaas/guides/operations-guide/openstack/cinder","title":"Cinder","description":"Remove service","sidebar":"docs"},"iaas/guides/operations-guide/openstack/day2-operations/flavor-manager":{"id":"iaas/guides/operations-guide/openstack/day2-operations/flavor-manager","title":"Flavor Manager","description":"Overview","sidebar":"docs"},"iaas/guides/operations-guide/openstack/day2-operations/image-manager":{"id":"iaas/guides/operations-guide/openstack/day2-operations/image-manager","title":"Image Manager","description":"The OpenStack Image Manager is a tool for managing all images on an OpenStack environment","sidebar":"docs"},"iaas/guides/operations-guide/openstack/day2-operations/index":{"id":"iaas/guides/operations-guide/openstack/day2-operations/index","title":"Day-2 Operations","description":"","sidebar":"docs"},"iaas/guides/operations-guide/openstack/day2-operations/project-manager":{"id":"iaas/guides/operations-guide/openstack/day2-operations/project-manager","title":"Project Manager","description":"","sidebar":"docs"},"iaas/guides/operations-guide/openstack/day2-operations/resource-manager":{"id":"iaas/guides/operations-guide/openstack/day2-operations/resource-manager","title":"Resource Manager","description":"Octavia","sidebar":"docs"},"iaas/guides/operations-guide/openstack/day2-operations/sandbox-manager":{"id":"iaas/guides/operations-guide/openstack/day2-operations/sandbox-manager","title":"Sandbox Manager","description":"","sidebar":"docs"},"iaas/guides/operations-guide/openstack/index":{"id":"iaas/guides/operations-guide/openstack/index","title":"OpenStack","description":"","sidebar":"docs"},"iaas/guides/operations-guide/openstack/octavia":{"id":"iaas/guides/operations-guide/openstack/octavia","title":"Octavia","description":"Cleanup of amphora missing from the DB","sidebar":"docs"},"iaas/guides/other-guides/contributor-guide":{"id":"iaas/guides/other-guides/contributor-guide","title":"Contributor Guide","description":"We welcome any issues, change requests or general feedback. Do not hestiate to open an issue.","sidebar":"docs"},"iaas/guides/other-guides/developer-guide/index":{"id":"iaas/guides/other-guides/developer-guide/index","title":"Developer Guide","description":"How to add a new service","sidebar":"docs"},"iaas/guides/other-guides/developer-guide/releases":{"id":"iaas/guides/other-guides/developer-guide/releases","title":"Releases","description":"How we handle releases","sidebar":"docs"},"iaas/guides/other-guides/developer-guide/scripts":{"id":"iaas/guides/other-guides/developer-guide/scripts","title":"Scripts","description":"Scripts are included in container images to simplify development work and to enable","sidebar":"docs"},"iaas/guides/other-guides/developer-guide/zuul-ci":{"id":"iaas/guides/other-guides/developer-guide/zuul-ci","title":"Zuul CI","description":"We use Zuul CI for our CI. Our Zuul CI instance is available","sidebar":"docs"},"iaas/guides/other-guides/index":{"id":"iaas/guides/other-guides/index","title":"Other Guides","description":"","sidebar":"docs"},"iaas/guides/other-guides/style-guide":{"id":"iaas/guides/other-guides/style-guide","title":"Style Guide","description":"Ansible","sidebar":"docs"},"iaas/guides/other-guides/zuul":{"id":"iaas/guides/other-guides/zuul","title":"Zuul CI","description":"We use Zuul CI as a CI service for OSISM. The service is not required for","sidebar":"docs"},"iaas/guides/troubleshooting-guide/index":{"id":"iaas/guides/troubleshooting-guide/index","title":"Troubleshooting Guide","description":"\ud83d\udca1 The Troubleshooting Guide describe how to solve issues.","sidebar":"docs"},"iaas/guides/troubleshooting-guide/manager":{"id":"iaas/guides/troubleshooting-guide/manager","title":"Manager","description":"Reset","sidebar":"docs"},"iaas/guides/troubleshooting-guide/openstack":{"id":"iaas/guides/troubleshooting-guide/openstack","title":"OpenStack","description":"Database creation fails","sidebar":"docs"},"iaas/guides/upgrade-guide/ceph":{"id":"iaas/guides/upgrade-guide/ceph","title":"Ceph","description":"","sidebar":"docs"},"iaas/guides/upgrade-guide/docker":{"id":"iaas/guides/upgrade-guide/docker","title":"Docker","description":"The Docker version used is defined via the parameter docker_version in the file","sidebar":"docs"},"iaas/guides/upgrade-guide/index":{"id":"iaas/guides/upgrade-guide/index","title":"Upgrade Guide","description":"In the examples, the pull of images (if supported by a role) is always run first. While","sidebar":"docs"},"iaas/guides/upgrade-guide/infrastructure":{"id":"iaas/guides/upgrade-guide/infrastructure","title":"Infrastructure","description":"Kubernetes","sidebar":"docs"},"iaas/guides/upgrade-guide/logging-monitoring":{"id":"iaas/guides/upgrade-guide/logging-monitoring","title":"Logging & Monitoring","description":"OpenSearch","sidebar":"docs"},"iaas/guides/upgrade-guide/manager":{"id":"iaas/guides/upgrade-guide/manager","title":"Manager","description":"Always read the release notes first to learn what has changed and what","sidebar":"docs"},"iaas/guides/upgrade-guide/network":{"id":"iaas/guides/upgrade-guide/network","title":"Network","description":"Open vSwitch","sidebar":"docs"},"iaas/guides/upgrade-guide/openstack":{"id":"iaas/guides/upgrade-guide/openstack","title":"OpenStack","description":"Keystone","sidebar":"docs"},"iaas/overview/architecture":{"id":"iaas/overview/architecture","title":"Architecture","description":"TODO"},"iaas/overview/compute":{"id":"iaas/overview/compute","title":"Compute","description":"TODO"},"iaas/overview/knowledge":{"id":"iaas/overview/knowledge","title":"Knowledge","description":"TODO"},"iaas/overview/network":{"id":"iaas/overview/network","title":"Network","description":"TODO"},"iaas/overview/storage":{"id":"iaas/overview/storage","title":"Storage","description":"TODO"},"iam/intra-SCS-federation-setup-description-for-osism-doc-operations":{"id":"iam/intra-SCS-federation-setup-description-for-osism-doc-operations","title":"Proposal for documentation for Keycloak to Keycloak Federation (WebSSO)","description":"The followig section is a reasonably detailed hands on description of how","sidebar":"docs"},"index":{"id":"index","title":"Introduction","description":"Creative Commons Attribution-ShareAlike 4.0 International","sidebar":"docs"},"operating-scs/audits/index":{"id":"operating-scs/audits/index","title":"Overview","description":"TODO"},"operating-scs/components/status-page/docs/component_overview":{"id":"operating-scs/components/status-page/docs/component_overview","title":"Component Overview","description":"This represents a part of the decision process related to the overall structure the API wants to represent.","sidebar":"docs"},"operating-scs/components/status-page/docs/components":{"id":"operating-scs/components/status-page/docs/components","title":"Components","description":"Illustrating multiple interchangable logical \\"layers\\" of possible Status Page application stacks:","sidebar":"docs"},"operating-scs/components/status-page/docs/levels_of_consensus":{"id":"operating-scs/components/status-page/docs/levels_of_consensus","title":"\\"Levels of consensus\\"","description":"When implementing any system to be used by a group of potential users, there will be varying use cases and opinions about API\'s, programming languages, persistence models, authentication, authorization, deployment options and so on.","sidebar":"docs"},"operating-scs/components/status-page/docs/overview":{"id":"operating-scs/components/status-page/docs/overview","title":"Overview","description":"Service providers often times want to communicate the status of their systems transparently to their users.","sidebar":"docs"},"operating-scs/guides/guide-1":{"id":"operating-scs/guides/guide-1","title":"Guide 1","description":"TODO"},"operating-scs/incident-management/index":{"id":"operating-scs/incident-management/index","title":"Overview","description":"TODO"},"operating-scs/lifecycle-management/index":{"id":"operating-scs/lifecycle-management/index","title":"Overview","description":"TODO"},"operating-scs/logging/index":{"id":"operating-scs/logging/index","title":"Overview","description":"TODO"},"operating-scs/metering/meter_configuration":{"id":"operating-scs/metering/meter_configuration","title":"Metering Configuration","description":"The Metrics and events we want to use in the metering process can be defined in two ways. The first one is to allow ceilometer to poll distinct metrics and events.","sidebar":"docs"},"operating-scs/monitoring/index":{"id":"operating-scs/monitoring/index","title":"Overview","description":"TODO"},"operating-scs/overview":{"id":"operating-scs/overview","title":"Overview","description":"TODO"},"releases/Release0":{"id":"releases/Release0","title":"Release Notes for SCS Release 0","description":"(Release Date: 2021-07-15)","sidebar":"docs"},"releases/Release1":{"id":"releases/Release1","title":"Release Notes for SCS Release 1","description":"(Release Date: 2021-09-29)","sidebar":"docs"},"releases/Release2":{"id":"releases/Release2","title":"Release Notes for SCS Release 2","description":"(Release Date: 2022-03-23)","sidebar":"docs"},"releases/Release3":{"id":"releases/Release3","title":"Release Notes for SCS Release 3","description":"(Release Date: 2022-09-21)","sidebar":"docs"},"releases/Release4":{"id":"releases/Release4","title":"Release Notes for SCS Release 4","description":"(Release Date: 2023-03-22)","sidebar":"docs"},"releases/Release5":{"id":"releases/Release5","title":"Release Notes for SCS Release 5","description":"(Release Date: 2023-09-20)","sidebar":"docs"},"releases/ReleaseX":{"id":"releases/ReleaseX","title":"Release Notes for SCS Release X","description":"This document is work in progress for the upcoming Release X."},"standards/index":{"id":"standards/index","title":"Standards","description":"TODO"}}}')}}]); \ No newline at end of file diff --git a/assets/js/9487.e7898b96.js b/assets/js/9487.e7898b96.js new file mode 100644 index 0000000000..d864e7d731 --- /dev/null +++ b/assets/js/9487.e7898b96.js @@ -0,0 +1 @@ +(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9487],{17295:(n,t,e)=>{n.exports=function(){function n(t,e,i){function r(a,u){if(!e[a]){if(!t[a]){if(c)return c(a,!0);var o=new Error("Cannot find module '"+a+"'");throw o.code="MODULE_NOT_FOUND",o}var s=e[a]={exports:{}};t[a][0].call(s.exports,(function(n){return r(t[a][1][n]||n)}),s,s.exports,n,t,e,i)}return e[a].exports}for(var c=void 0,a=0;a<i.length;a++)r(i[a]);return r}return n}()({1:[function(n,t,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var i=function(){function n(n,t){for(var e=0;e<t.length;e++){var i=t[e];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(n,i.key,i)}}return function(t,e,i){return e&&n(t.prototype,e),i&&n(t,i),t}}();function r(n,t){if(!(n instanceof t))throw new TypeError("Cannot call a class as a function")}var c=function(){function n(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},i=e.defaultLayoutOptions,c=void 0===i?{}:i,u=e.algorithms,o=void 0===u?["layered","stress","mrtree","radial","force","disco","sporeOverlap","sporeCompaction","rectpacking"]:u,s=e.workerFactory,h=e.workerUrl;if(r(this,n),this.defaultLayoutOptions=c,this.initialized=!1,void 0===h&&void 0===s)throw new Error("Cannot construct an ELK without both 'workerUrl' and 'workerFactory'.");var f=s;void 0!==h&&void 0===s&&(f=function(n){return new Worker(n)});var l=f(h);if("function"!=typeof l.postMessage)throw new TypeError("Created worker does not provide the required 'postMessage' function.");this.worker=new a(l),this.worker.postMessage({cmd:"register",algorithms:o}).then((function(n){return t.initialized=!0})).catch(console.err)}return i(n,[{key:"layout",value:function(n){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},e=t.layoutOptions,i=void 0===e?this.defaultLayoutOptions:e,r=t.logging,c=void 0!==r&&r,a=t.measureExecutionTime,u=void 0!==a&&a;return n?this.worker.postMessage({cmd:"layout",graph:n,layoutOptions:i,options:{logging:c,measureExecutionTime:u}}):Promise.reject(new Error("Missing mandatory parameter 'graph'."))}},{key:"knownLayoutAlgorithms",value:function(){return this.worker.postMessage({cmd:"algorithms"})}},{key:"knownLayoutOptions",value:function(){return this.worker.postMessage({cmd:"options"})}},{key:"knownLayoutCategories",value:function(){return this.worker.postMessage({cmd:"categories"})}},{key:"terminateWorker",value:function(){this.worker.terminate()}}]),n}();e.default=c;var a=function(){function n(t){var e=this;if(r(this,n),void 0===t)throw new Error("Missing mandatory parameter 'worker'.");this.resolvers={},this.worker=t,this.worker.onmessage=function(n){setTimeout((function(){e.receive(e,n)}),0)}}return i(n,[{key:"postMessage",value:function(n){var t=this.id||0;this.id=t+1,n.id=t;var e=this;return new Promise((function(i,r){e.resolvers[t]=function(n,t){n?(e.convertGwtStyleError(n),r(n)):i(t)},e.worker.postMessage(n)}))}},{key:"receive",value:function(n,t){var e=t.data,i=n.resolvers[e.id];i&&(delete n.resolvers[e.id],e.error?i(e.error):i(null,e.data))}},{key:"terminate",value:function(){this.worker.terminate&&this.worker.terminate()}},{key:"convertGwtStyleError",value:function(n){if(n){var t=n.__java$exception;t&&(t.cause&&t.cause.backingJsObject&&(n.cause=t.cause.backingJsObject,this.convertGwtStyleError(n.cause)),delete n.__java$exception)}}}]),n}()},{}],2:[function(n,t,i){(function(n){(function(){"use strict";var e;function r(){}function c(){}function a(){}function u(){}function o(){}function s(){}function h(){}function f(){}function l(){}function b(){}function w(){}function d(){}function g(){}function p(){}function v(){}function m(){}function y(){}function k(){}function j(){}function E(){}function T(){}function M(){}function S(){}function P(){}function C(){}function I(){}function O(){}function A(){}function $(){}function L(){}function N(){}function x(){}function D(){}function R(){}function K(){}function _(){}function F(){}function B(){}function H(){}function q(){}function G(){}function z(){}function U(){}function X(){}function W(){}function V(){}function Q(){}function Y(){}function J(){}function Z(){}function nn(){}function tn(){}function en(){}function rn(){}function cn(){}function an(){}function un(){}function on(){}function sn(){}function hn(){}function fn(){}function ln(){}function bn(){}function wn(){}function dn(){}function gn(){}function pn(){}function vn(){}function mn(){}function yn(){}function kn(){}function jn(){}function En(){}function Tn(){}function Mn(){}function Sn(){}function Pn(){}function Cn(){}function In(){}function On(){}function An(){}function $n(){}function Ln(){}function Nn(){}function xn(){}function Dn(){}function Rn(){}function Kn(){}function _n(){}function Fn(){}function Bn(){}function Hn(){}function qn(){}function Gn(){}function zn(){}function Un(){}function Xn(){}function Wn(){}function Vn(){}function Qn(){}function Yn(){}function Jn(){}function Zn(){}function nt(){}function tt(){}function et(){}function it(){}function rt(){}function ct(){}function at(){}function ut(){}function ot(){}function st(){}function ht(){}function ft(){}function lt(){}function bt(){}function wt(){}function dt(){}function gt(){}function pt(){}function vt(){}function mt(){}function yt(){}function kt(){}function jt(){}function Et(){}function Tt(){}function Mt(){}function St(){}function Pt(){}function Ct(){}function It(){}function Ot(){}function At(){}function $t(){}function Lt(){}function Nt(){}function xt(){}function Dt(){}function Rt(){}function Kt(){}function _t(){}function Ft(){}function Bt(){}function Ht(){}function qt(){}function Gt(){}function zt(){}function Ut(){}function Xt(){}function Wt(){}function Vt(){}function Qt(){}function Yt(){}function Jt(){}function Zt(){}function ne(){}function te(){}function ee(){}function ie(){}function re(){}function ce(){}function ae(){}function ue(){}function oe(){}function se(){}function he(){}function fe(){}function le(){}function be(){}function we(){}function de(){}function ge(){}function pe(){}function ve(){}function me(){}function ye(){}function ke(){}function je(){}function Ee(){}function Te(){}function Me(){}function Se(){}function Pe(){}function Ce(){}function Ie(){}function Oe(){}function Ae(){}function $e(){}function Le(){}function Ne(){}function xe(){}function De(){}function Re(){}function Ke(){}function _e(){}function Fe(){}function Be(){}function He(){}function qe(){}function Ge(){}function ze(){}function Ue(){}function Xe(){}function We(){}function Ve(){}function Qe(){}function Ye(){}function Je(){}function Ze(){}function ni(){}function ti(){}function ei(){}function ii(){}function ri(){}function ci(){}function ai(){}function ui(){}function oi(){}function si(){}function hi(){}function fi(){}function li(){}function bi(){}function wi(){}function di(){}function gi(){}function pi(){}function vi(){}function mi(){}function yi(){}function ki(){}function ji(){}function Ei(){}function Ti(){}function Mi(){}function Si(){}function Pi(){}function Ci(){}function Ii(){}function Oi(){}function Ai(){}function $i(){}function Li(){}function Ni(){}function xi(){}function Di(){}function Ri(){}function Ki(){}function _i(){}function Fi(){}function Bi(){}function Hi(){}function qi(){}function Gi(){}function zi(){}function Ui(){}function Xi(){}function Wi(){}function Vi(){}function Qi(){}function Yi(){}function Ji(){}function Zi(){}function nr(){}function tr(){}function er(){}function ir(){}function rr(){}function cr(){}function ar(){}function ur(){}function or(){}function sr(){}function hr(){}function fr(){}function lr(){}function br(){}function wr(){}function dr(){}function gr(){}function pr(){}function vr(){}function mr(){}function yr(){}function kr(){}function jr(){}function Er(){}function Tr(){}function Mr(){}function Sr(){}function Pr(){}function Cr(){}function Ir(){}function Or(){}function Ar(){}function $r(){}function Lr(){}function Nr(){}function xr(){}function Dr(){}function Rr(){}function Kr(){}function _r(){}function Fr(){}function Br(){}function Hr(){}function qr(){}function Gr(){}function zr(){}function Ur(){}function Xr(){}function Wr(){}function Vr(){}function Qr(){}function Yr(){}function Jr(){}function Zr(){}function nc(){}function tc(){}function ec(){}function ic(){}function rc(){}function cc(){}function ac(){}function uc(){}function oc(){}function sc(){}function hc(){}function fc(){}function lc(){}function bc(){}function wc(){}function dc(){}function gc(){}function pc(){}function vc(){}function mc(){}function yc(){}function kc(){}function jc(){}function Ec(){}function Tc(){}function Mc(){}function Sc(){}function Pc(){}function Cc(){}function Ic(){}function Oc(){}function Ac(){}function $c(){}function Lc(){}function Nc(){}function xc(){}function Dc(){}function Rc(){}function Kc(){}function _c(){}function Fc(){}function Bc(){}function Hc(){}function qc(){}function Gc(){}function zc(){}function Uc(){}function Xc(){}function Wc(){}function Vc(){}function Qc(){}function Yc(){}function Jc(){}function Zc(){}function na(){}function ta(){}function ea(){}function ia(){}function ra(){}function ca(){}function aa(){}function ua(){}function oa(){}function sa(){}function ha(){}function fa(){}function la(){}function ba(){}function wa(){}function da(){}function ga(){}function pa(){}function va(){}function ma(){}function ya(){}function ka(){}function ja(){}function Ea(){}function Ta(){}function Ma(){}function Sa(){}function Pa(){}function Ca(){}function Ia(){}function Oa(){}function Aa(){}function $a(){}function La(){}function Na(){}function xa(){}function Da(){}function Ra(){}function Ka(){}function _a(){}function Fa(){}function Ba(){}function Ha(){}function qa(){}function Ga(){}function za(){}function Ua(){}function Xa(){}function Wa(){}function Va(){}function Qa(){}function Ya(){}function Ja(){}function Za(){}function nu(){}function tu(){}function eu(){}function iu(){}function ru(){}function cu(){}function au(){}function uu(){}function ou(){}function su(){}function hu(){}function fu(){}function lu(){}function bu(){}function wu(){}function du(){}function gu(){}function pu(){}function vu(){}function mu(){}function yu(){}function ku(){}function ju(){}function Eu(){}function Tu(){}function Mu(){}function Su(){}function Pu(){}function Cu(){}function Iu(){}function Ou(){}function Au(){}function $u(){}function Lu(){}function Nu(){}function xu(){}function Du(){}function Ru(){}function Ku(){}function _u(){}function Fu(){}function Bu(){}function Hu(){}function qu(){}function Gu(){}function zu(){}function Uu(){}function Xu(){}function Wu(){}function Vu(){}function Qu(){}function Yu(){}function Ju(){}function Zu(){}function no(){}function to(){}function eo(){}function io(){}function ro(){}function co(){}function ao(){}function uo(){}function oo(){}function so(){}function ho(){}function fo(){}function lo(){}function bo(){}function wo(){}function go(){}function po(){}function vo(){}function mo(){}function yo(){}function ko(){}function jo(){}function Eo(){}function To(){}function Mo(){}function So(){}function Po(){}function Co(){}function Io(){}function Oo(){}function Ao(){}function $o(){}function Lo(){}function No(){}function xo(){}function Do(){}function Ro(){}function Ko(){}function _o(){}function Fo(){}function Bo(){}function Ho(){}function qo(){}function Go(){}function zo(){}function Uo(){}function Xo(){}function Wo(){}function Vo(){}function Qo(){}function Yo(){}function Jo(){}function Zo(){}function ns(){}function ts(){}function es(){}function is(){}function rs(){}function cs(){}function as(){}function us(){}function os(){}function ss(){}function hs(){}function fs(){}function ls(){}function bs(){}function ws(){}function ds(){}function gs(){}function ps(){}function vs(){}function ms(){}function ys(){}function ks(){}function js(){}function Es(){}function Ts(){}function Ms(){}function Ss(){}function Ps(){}function Cs(){}function Is(){}function Os(){}function As(){}function $s(){}function Ls(){}function Ns(){}function xs(){}function Ds(){}function Rs(){}function Ks(){}function _s(){}function Fs(){}function Bs(){}function Hs(){}function qs(){}function Gs(){}function zs(){}function Us(){}function Xs(){}function Ws(){}function Vs(){}function Qs(){}function Ys(){}function Js(){}function Zs(){}function nh(){}function th(){}function eh(){}function ih(){}function rh(){}function ch(){}function ah(){}function uh(){}function oh(){}function sh(){}function hh(){}function fh(){}function lh(){}function bh(){}function wh(){}function dh(){}function gh(){}function ph(){}function vh(){}function mh(){}function yh(){}function kh(){}function jh(){}function Eh(){}function Th(){}function Mh(){}function Sh(){}function Ph(){}function Ch(){}function Ih(){}function Oh(){}function Ah(){}function $h(){}function Lh(){}function Nh(){}function xh(){}function Dh(){}function Rh(){}function Kh(){}function _h(n){}function Fh(n){}function Bh(){iy()}function Hh(){Gsn()}function qh(){Epn()}function Gh(){_kn()}function zh(){jSn()}function Uh(){fRn()}function Xh(){Kyn()}function Wh(){rkn()}function Vh(){EM()}function Qh(){mM()}function Yh(){q_()}function Jh(){TM()}function Zh(){Irn()}function nf(){SM()}function tf(){I6()}function ef(){Pin()}function rf(){Q8()}function cf(){_Z()}function af(){zsn()}function uf(){_Mn()}function of(){Cin()}function sf(){U2()}function hf(){fWn()}function ff(){Gyn()}function lf(){FZ()}function bf(){HXn()}function wf(){RZ()}function df(){Iin()}function gf(){Yun()}function pf(){GZ()}function vf(){C9()}function mf(){PM()}function yf(){KAn()}function kf(){Uyn()}function jf(){Fcn()}function Ef(){MMn()}function Tf(){bRn()}function Mf(){Bvn()}function Sf(){CAn()}function Pf(){Ran()}function Cf(){HZ()}function If(){s_n()}function Of(){$An()}function Af(){W$n()}function $f(){x9()}function Lf(){SMn()}function Nf(){sWn()}function xf(){Xsn()}function Df(){vdn()}function Rf(){qBn()}function Kf(){u_()}function _f(){wcn()}function Ff(){fFn()}function Bf(n){kW(n)}function Hf(n){this.a=n}function qf(n){this.a=n}function Gf(n){this.a=n}function zf(n){this.a=n}function Uf(n){this.a=n}function Xf(n){this.a=n}function Wf(n){this.a=n}function Vf(n){this.a=n}function Qf(n){this.a=n}function Yf(n){this.a=n}function Jf(n){this.a=n}function Zf(n){this.a=n}function nl(n){this.a=n}function tl(n){this.a=n}function el(n){this.a=n}function il(n){this.a=n}function rl(n){this.a=n}function cl(n){this.a=n}function al(n){this.a=n}function ul(n){this.a=n}function ol(n){this.a=n}function sl(n){this.b=n}function hl(n){this.c=n}function fl(n){this.a=n}function ll(n){this.a=n}function bl(n){this.a=n}function wl(n){this.a=n}function dl(n){this.a=n}function gl(n){this.a=n}function pl(n){this.a=n}function vl(n){this.a=n}function ml(n){this.a=n}function yl(n){this.a=n}function kl(n){this.a=n}function jl(n){this.a=n}function El(n){this.a=n}function Tl(n){this.a=n}function Ml(n){this.a=n}function Sl(n){this.a=n}function Pl(n){this.a=n}function Cl(){this.a=[]}function Il(n,t){n.a=t}function Ol(n,t){n.a=t}function Al(n,t){n.b=t}function $l(n,t){n.b=t}function Ll(n,t){n.b=t}function Nl(n,t){n.j=t}function xl(n,t){n.g=t}function Dl(n,t){n.i=t}function Rl(n,t){n.c=t}function Kl(n,t){n.d=t}function _l(n,t){n.d=t}function Fl(n,t){n.c=t}function Bl(n,t){n.k=t}function Hl(n,t){n.c=t}function ql(n,t){n.c=t}function Gl(n,t){n.a=t}function zl(n,t){n.a=t}function Ul(n,t){n.f=t}function Xl(n,t){n.a=t}function Wl(n,t){n.b=t}function Vl(n,t){n.d=t}function Ql(n,t){n.i=t}function Yl(n,t){n.o=t}function Jl(n,t){n.r=t}function Zl(n,t){n.a=t}function nb(n,t){n.b=t}function tb(n,t){n.e=t}function eb(n,t){n.f=t}function ib(n,t){n.g=t}function rb(n,t){n.e=t}function cb(n,t){n.f=t}function ab(n,t){n.f=t}function ub(n,t){n.n=t}function ob(n,t){n.a=t}function sb(n,t){n.a=t}function hb(n,t){n.c=t}function fb(n,t){n.c=t}function lb(n,t){n.d=t}function bb(n,t){n.e=t}function wb(n,t){n.g=t}function db(n,t){n.a=t}function gb(n,t){n.c=t}function pb(n,t){n.d=t}function vb(n,t){n.e=t}function mb(n,t){n.f=t}function yb(n,t){n.j=t}function kb(n,t){n.a=t}function jb(n,t){n.b=t}function Eb(n,t){n.a=t}function Tb(n){n.b=n.a}function Mb(n){n.c=n.d.d}function Sb(n){this.d=n}function Pb(n){this.a=n}function Cb(n){this.a=n}function Ib(n){this.a=n}function Ob(n){this.a=n}function Ab(n){this.a=n}function $b(n){this.a=n}function Lb(n){this.a=n}function Nb(n){this.a=n}function xb(n){this.a=n}function Db(n){this.a=n}function Rb(n){this.a=n}function Kb(n){this.a=n}function _b(n){this.a=n}function Fb(n){this.a=n}function Bb(n){this.b=n}function Hb(n){this.b=n}function qb(n){this.b=n}function Gb(n){this.a=n}function zb(n){this.a=n}function Ub(n){this.a=n}function Xb(n){this.c=n}function Wb(n){this.c=n}function Vb(n){this.c=n}function Qb(n){this.a=n}function Yb(n){this.a=n}function Jb(n){this.a=n}function Zb(n){this.a=n}function nw(n){this.a=n}function tw(n){this.a=n}function ew(n){this.a=n}function iw(n){this.a=n}function rw(n){this.a=n}function cw(n){this.a=n}function aw(n){this.a=n}function uw(n){this.a=n}function ow(n){this.a=n}function sw(n){this.a=n}function hw(n){this.a=n}function fw(n){this.a=n}function lw(n){this.a=n}function bw(n){this.a=n}function ww(n){this.a=n}function dw(n){this.a=n}function gw(n){this.a=n}function pw(n){this.a=n}function vw(n){this.a=n}function mw(n){this.a=n}function yw(n){this.a=n}function kw(n){this.a=n}function jw(n){this.a=n}function Ew(n){this.a=n}function Tw(n){this.a=n}function Mw(n){this.a=n}function Sw(n){this.a=n}function Pw(n){this.a=n}function Cw(n){this.a=n}function Iw(n){this.a=n}function Ow(n){this.a=n}function Aw(n){this.a=n}function $w(n){this.a=n}function Lw(n){this.a=n}function Nw(n){this.a=n}function xw(n){this.a=n}function Dw(n){this.a=n}function Rw(n){this.a=n}function Kw(n){this.a=n}function _w(n){this.a=n}function Fw(n){this.a=n}function Bw(n){this.e=n}function Hw(n){this.a=n}function qw(n){this.a=n}function Gw(n){this.a=n}function zw(n){this.a=n}function Uw(n){this.a=n}function Xw(n){this.a=n}function Ww(n){this.a=n}function Vw(n){this.a=n}function Qw(n){this.a=n}function Yw(n){this.a=n}function Jw(n){this.a=n}function Zw(n){this.a=n}function nd(n){this.a=n}function td(n){this.a=n}function ed(n){this.a=n}function id(n){this.a=n}function rd(n){this.a=n}function cd(n){this.a=n}function ad(n){this.a=n}function ud(n){this.a=n}function od(n){this.a=n}function sd(n){this.a=n}function hd(n){this.a=n}function fd(n){this.a=n}function ld(n){this.a=n}function bd(n){this.a=n}function wd(n){this.a=n}function dd(n){this.a=n}function gd(n){this.a=n}function pd(n){this.a=n}function vd(n){this.a=n}function md(n){this.a=n}function yd(n){this.a=n}function kd(n){this.a=n}function jd(n){this.a=n}function Ed(n){this.a=n}function Td(n){this.a=n}function Md(n){this.a=n}function Sd(n){this.a=n}function Pd(n){this.a=n}function Cd(n){this.a=n}function Id(n){this.a=n}function Od(n){this.a=n}function Ad(n){this.a=n}function $d(n){this.a=n}function Ld(n){this.a=n}function Nd(n){this.a=n}function xd(n){this.a=n}function Dd(n){this.a=n}function Rd(n){this.a=n}function Kd(n){this.a=n}function _d(n){this.a=n}function Fd(n){this.a=n}function Bd(n){this.c=n}function Hd(n){this.b=n}function qd(n){this.a=n}function Gd(n){this.a=n}function zd(n){this.a=n}function Ud(n){this.a=n}function Xd(n){this.a=n}function Wd(n){this.a=n}function Vd(n){this.a=n}function Qd(n){this.a=n}function Yd(n){this.a=n}function Jd(n){this.a=n}function Zd(n){this.a=n}function ng(n){this.a=n}function tg(n){this.a=n}function eg(n){this.a=n}function ig(n){this.a=n}function rg(n){this.a=n}function cg(n){this.a=n}function ag(n){this.a=n}function ug(n){this.a=n}function og(n){this.a=n}function sg(n){this.a=n}function hg(n){this.a=n}function fg(n){this.a=n}function lg(n){this.a=n}function bg(n){this.a=n}function wg(n){this.a=n}function dg(n){this.a=n}function gg(n){this.a=n}function pg(n){this.a=n}function vg(n){this.a=n}function mg(n){this.a=n}function yg(n){this.a=n}function kg(n){this.a=n}function jg(n){this.a=n}function Eg(n){this.a=n}function Tg(n){this.a=n}function Mg(n){this.a=n}function Sg(n){this.a=n}function Pg(n){this.a=n}function Cg(n){this.a=n}function Ig(n){this.a=n}function Og(n){this.a=n}function Ag(n){this.a=n}function $g(n){this.a=n}function Lg(n){this.a=n}function Ng(n){this.a=n}function xg(n){this.a=n}function Dg(n){this.a=n}function Rg(n){this.a=n}function Kg(n){this.a=n}function _g(n){this.a=n}function Fg(n){this.a=n}function Bg(n){this.a=n}function Hg(n){this.a=n}function qg(n){this.a=n}function Gg(n){this.a=n}function zg(n){this.a=n}function Ug(n){this.a=n}function Xg(n){this.a=n}function Wg(n){this.a=n}function Vg(n){this.a=n}function Qg(n){this.a=n}function Yg(n){this.a=n}function Jg(n){this.a=n}function Zg(n){this.a=n}function np(n){this.a=n}function tp(n){this.a=n}function ep(n){this.a=n}function ip(n){this.a=n}function rp(n){this.a=n}function cp(n){this.a=n}function ap(n){this.a=n}function up(n){this.b=n}function op(n){this.f=n}function sp(n){this.a=n}function hp(n){this.a=n}function fp(n){this.a=n}function lp(n){this.a=n}function bp(n){this.a=n}function wp(n){this.a=n}function dp(n){this.a=n}function gp(n){this.a=n}function pp(n){this.a=n}function vp(n){this.a=n}function mp(n){this.a=n}function yp(n){this.b=n}function kp(n){this.c=n}function jp(n){this.e=n}function Ep(n){this.a=n}function Tp(n){this.a=n}function Mp(n){this.a=n}function Sp(n){this.a=n}function Pp(n){this.a=n}function Cp(n){this.d=n}function Ip(n){this.a=n}function Op(n){this.a=n}function Ap(n){this.e=n}function $p(){this.a=0}function Lp(){DA(this)}function Np(){xA(this)}function xp(){$U(this)}function Dp(){wV(this)}function Rp(){_h(this)}function Kp(){this.c=L$t}function _p(n,t){t.Wb(n)}function Fp(n,t){n.b+=t}function Bp(n){n.b=new ok}function Hp(n){return n.e}function qp(n){return n.a}function Gp(n){return n.a}function zp(n){return n.a}function Up(n){return n.a}function Xp(n){return n.a}function Wp(){return null}function Vp(){return null}function Qp(){aE(),dXn()}function Yp(n){n.b.tf(n.e)}function Jp(n,t){n.b=t-n.b}function Zp(n,t){n.a=t-n.a}function nv(n,t){t.ad(n.a)}function tv(n,t){qCn(t,n)}function ev(n,t,e){n.Od(e,t)}function iv(n,t){n.e=t,t.b=n}function rv(n){s_(),this.a=n}function cv(n){s_(),this.a=n}function av(n){s_(),this.a=n}function uv(n){WX(),this.a=n}function ov(n){PY(),ett.be(n)}function sv(){gN.call(this)}function hv(){gN.call(this)}function fv(){sv.call(this)}function lv(){sv.call(this)}function bv(){sv.call(this)}function wv(){sv.call(this)}function dv(){sv.call(this)}function gv(){sv.call(this)}function pv(){sv.call(this)}function vv(){sv.call(this)}function mv(){sv.call(this)}function yv(){sv.call(this)}function kv(){sv.call(this)}function jv(){this.a=this}function Ev(){this.Bb|=256}function Tv(){this.b=new PO}function Mv(){Mv=O,new xp}function Sv(){fv.call(this)}function Pv(n,t){n.length=t}function Cv(n,t){WB(n.a,t)}function Iv(n,t){USn(n.c,t)}function Ov(n,t){TU(n.b,t)}function Av(n,t){Ivn(n.a,t)}function $v(n,t){Oln(n.a,t)}function Lv(n,t){ban(n.e,t)}function Nv(n){AOn(n.c,n.b)}function xv(n,t){n.kc().Nb(t)}function Dv(n){this.a=gbn(n)}function Rv(){this.a=new xp}function Kv(){this.a=new xp}function _v(){this.a=new Np}function Fv(){this.a=new Np}function Bv(){this.a=new Np}function Hv(){this.a=new kn}function qv(){this.a=new k6}function Gv(){this.a=new bt}function zv(){this.a=new WT}function Uv(){this.a=new D0}function Xv(){this.a=new cZ}function Wv(){this.a=new AR}function Vv(){this.a=new Np}function Qv(){this.a=new Np}function Yv(){this.a=new Np}function Jv(){this.a=new Np}function Zv(){this.d=new Np}function nm(){this.a=new Rv}function tm(){this.a=new xp}function em(){this.b=new xp}function im(){this.b=new Np}function rm(){this.e=new Np}function cm(){this.d=new Np}function am(){this.a=new uf}function um(){Np.call(this)}function om(){_v.call(this)}function sm(){NR.call(this)}function hm(){Qv.call(this)}function fm(){lm.call(this)}function lm(){Rp.call(this)}function bm(){Rp.call(this)}function wm(){bm.call(this)}function dm(){dY.call(this)}function gm(){dY.call(this)}function pm(){Wm.call(this)}function vm(){Wm.call(this)}function mm(){Wm.call(this)}function ym(){Vm.call(this)}function km(){YT.call(this)}function jm(){eo.call(this)}function Em(){eo.call(this)}function Tm(){ny.call(this)}function Mm(){ny.call(this)}function Sm(){xp.call(this)}function Pm(){xp.call(this)}function Cm(){xp.call(this)}function Im(){Rv.call(this)}function Om(){jin.call(this)}function Am(){Ev.call(this)}function $m(){OL.call(this)}function Lm(){OL.call(this)}function Nm(){xp.call(this)}function xm(){xp.call(this)}function Dm(){xp.call(this)}function Rm(){yo.call(this)}function Km(){yo.call(this)}function _m(){Rm.call(this)}function Fm(){Dh.call(this)}function Bm(n){dtn.call(this,n)}function Hm(n){dtn.call(this,n)}function qm(n){Qf.call(this,n)}function Gm(n){MT.call(this,n)}function zm(n){Gm.call(this,n)}function Um(n){MT.call(this,n)}function Xm(){this.a=new YT}function Wm(){this.a=new Rv}function Vm(){this.a=new xp}function Qm(){this.a=new Np}function Ym(){this.j=new Np}function Jm(){this.a=new Xa}function Zm(){this.a=new LE}function ny(){this.a=new mo}function ty(){ty=O,_nt=new xk}function ey(){ey=O,Knt=new Nk}function iy(){iy=O,Ont=new c}function ry(){ry=O,znt=new cN}function cy(n){Gm.call(this,n)}function ay(n){Gm.call(this,n)}function uy(n){d4.call(this,n)}function oy(n){d4.call(this,n)}function sy(n){VK.call(this,n)}function hy(n){ySn.call(this,n)}function fy(n){CT.call(this,n)}function ly(n){OT.call(this,n)}function by(n){OT.call(this,n)}function wy(n){OT.call(this,n)}function dy(n){fz.call(this,n)}function gy(n){dy.call(this,n)}function py(){Pl.call(this,{})}function vy(n){CL(),this.a=n}function my(n){n.b=null,n.c=0}function yy(n,t){n.e=t,Cxn(n,t)}function ky(n,t){n.a=t,aCn(n)}function jy(n,t,e){n.a[t.g]=e}function Ey(n,t,e){wjn(e,n,t)}function Ty(n,t){ZR(t.i,n.n)}function My(n,t){ssn(n).td(t)}function Sy(n,t){return n*n/t}function Py(n,t){return n.g-t.g}function Cy(n){return new Sl(n)}function Iy(n){return new GX(n)}function Oy(n){dy.call(this,n)}function Ay(n){dy.call(this,n)}function $y(n){dy.call(this,n)}function Ly(n){fz.call(this,n)}function Ny(n){_cn(),this.a=n}function xy(n){a_(),this.a=n}function Dy(n){FG(),this.f=n}function Ry(n){FG(),this.f=n}function Ky(n){dy.call(this,n)}function _y(n){dy.call(this,n)}function Fy(n){dy.call(this,n)}function By(n){dy.call(this,n)}function Hy(n){dy.call(this,n)}function qy(n){return kW(n),n}function Gy(n){return kW(n),n}function zy(n){return kW(n),n}function Uy(n){return kW(n),n}function Xy(n){return kW(n),n}function Wy(n){return n.b==n.c}function Vy(n){return!!n&&n.b}function Qy(n){return!!n&&n.k}function Yy(n){return!!n&&n.j}function Jy(n){kW(n),this.a=n}function Zy(n){return Zon(n),n}function nk(n){vU(n,n.length)}function tk(n){dy.call(this,n)}function ek(n){dy.call(this,n)}function ik(n){dy.call(this,n)}function rk(n){dy.call(this,n)}function ck(n){dy.call(this,n)}function ak(n){dy.call(this,n)}function uk(n){ZN.call(this,n,0)}function ok(){o1.call(this,12,3)}function sk(){sk=O,ttt=new j}function hk(){hk=O,Ynt=new r}function fk(){fk=O,rtt=new g}function lk(){lk=O,htt=new v}function bk(){throw Hp(new pv)}function wk(){throw Hp(new pv)}function dk(){throw Hp(new pv)}function gk(){throw Hp(new pv)}function pk(){throw Hp(new pv)}function vk(){throw Hp(new pv)}function mk(){this.a=SD(yX(FWn))}function yk(n){s_(),this.a=yX(n)}function kk(n,t){n.Td(t),t.Sd(n)}function jk(n,t){n.a.ec().Mc(t)}function Ek(n,t,e){n.c.lf(t,e)}function Tk(n){Ay.call(this,n)}function Mk(n){_y.call(this,n)}function Sk(){Ab.call(this,"")}function Pk(){Ab.call(this,"")}function Ck(){Ab.call(this,"")}function Ik(){Ab.call(this,"")}function Ok(n){Ay.call(this,n)}function Ak(n){Hb.call(this,n)}function $k(n){bN.call(this,n)}function Lk(n){Ak.call(this,n)}function Nk(){tl.call(this,null)}function xk(){tl.call(this,null)}function Dk(){Dk=O,PY()}function Rk(){Rk=O,ket=mEn()}function Kk(n){return n.a?n.b:0}function _k(n){return n.a?n.b:0}function Fk(n,t){return n.a-t.a}function Bk(n,t){return n.a-t.a}function Hk(n,t){return n.a-t.a}function qk(n,t){return m7(n,t)}function Gk(n,t){return gZ(n,t)}function zk(n,t){return t in n.a}function Uk(n,t){return n.f=t,n}function Xk(n,t){return n.b=t,n}function Wk(n,t){return n.c=t,n}function Vk(n,t){return n.g=t,n}function Qk(n,t){return n.a=t,n}function Yk(n,t){return n.f=t,n}function Jk(n,t){return n.k=t,n}function Zk(n,t){return n.a=t,n}function nj(n,t){return n.e=t,n}function tj(n,t){return n.e=t,n}function ej(n,t){return n.f=t,n}function ij(n,t){n.b=!0,n.d=t}function rj(n,t){n.b=new wA(t)}function cj(n,t,e){t.td(n.a[e])}function aj(n,t,e){t.we(n.a[e])}function uj(n,t){return n.b-t.b}function oj(n,t){return n.g-t.g}function sj(n,t){return n.s-t.s}function hj(n,t){return n?0:t-1}function fj(n,t){return n?0:t-1}function lj(n,t){return n?t-1:0}function bj(n,t){return t.Yf(n)}function wj(n,t){return n.b=t,n}function dj(n,t){return n.a=t,n}function gj(n,t){return n.c=t,n}function pj(n,t){return n.d=t,n}function vj(n,t){return n.e=t,n}function mj(n,t){return n.f=t,n}function yj(n,t){return n.a=t,n}function kj(n,t){return n.b=t,n}function jj(n,t){return n.c=t,n}function Ej(n,t){return n.c=t,n}function Tj(n,t){return n.b=t,n}function Mj(n,t){return n.d=t,n}function Sj(n,t){return n.e=t,n}function Pj(n,t){return n.f=t,n}function Cj(n,t){return n.g=t,n}function Ij(n,t){return n.a=t,n}function Oj(n,t){return n.i=t,n}function Aj(n,t){return n.j=t,n}function $j(n,t){return n.k=t,n}function Lj(n,t){return n.j=t,n}function Nj(n,t){_Mn(),CZ(t,n)}function xj(n,t,e){GG(n.a,t,e)}function Dj(n){BV.call(this,n)}function Rj(n){BV.call(this,n)}function Kj(n){n_.call(this,n)}function _j(n){qbn.call(this,n)}function Fj(n){gtn.call(this,n)}function Bj(n){pQ.call(this,n)}function Hj(n){pQ.call(this,n)}function qj(){O$.call(this,"")}function Gj(){this.a=0,this.b=0}function zj(){this.b=0,this.a=0}function Uj(n,t){n.b=0,Nen(n,t)}function Xj(n,t){n.c=t,n.b=!0}function Wj(n,t){return n.c._b(t)}function Vj(n){return n.e&&n.e()}function Qj(n){return n?n.d:null}function Yj(n,t){return gfn(n.b,t)}function Jj(n){return n?n.g:null}function Zj(n){return n?n.i:null}function nE(n){return ED(n),n.o}function tE(){tE=O,dOt=Xkn()}function eE(){eE=O,gOt=oTn()}function iE(){iE=O,n$t=Vkn()}function rE(){rE=O,dLt=Wkn()}function cE(){cE=O,gLt=iCn()}function aE(){aE=O,lAt=cin()}function uE(){throw Hp(new pv)}function oE(){throw Hp(new pv)}function sE(){throw Hp(new pv)}function hE(){throw Hp(new pv)}function fE(){throw Hp(new pv)}function lE(){throw Hp(new pv)}function bE(n){this.a=new XT(n)}function wE(n){lUn(),DXn(this,n)}function dE(n){this.a=new Wz(n)}function gE(n,t){for(;n.ye(t););}function pE(n,t){for(;n.sd(t););}function vE(n,t){return n.a+=t,n}function mE(n,t){return n.a+=t,n}function yE(n,t){return n.a+=t,n}function kE(n,t){return n.a+=t,n}function jE(n){return EW(n),n.a}function EE(n){return n.b!=n.d.c}function TE(n){return n.l|n.m<<22}function ME(n,t){return n.d[t.p]}function SE(n,t){return Sxn(n,t)}function PE(n,t,e){n.splice(t,e)}function CE(n){n.c?NDn(n):xDn(n)}function IE(n){this.a=0,this.b=n}function OE(){this.a=new CNn(ijt)}function AE(){this.b=new CNn(qyt)}function $E(){this.b=new CNn(WEt)}function LE(){this.b=new CNn(WEt)}function NE(){throw Hp(new pv)}function xE(){throw Hp(new pv)}function DE(){throw Hp(new pv)}function RE(){throw Hp(new pv)}function KE(){throw Hp(new pv)}function _E(){throw Hp(new pv)}function FE(){throw Hp(new pv)}function BE(){throw Hp(new pv)}function HE(){throw Hp(new pv)}function qE(){throw Hp(new pv)}function GE(){throw Hp(new yv)}function zE(){throw Hp(new yv)}function UE(n){this.a=new XE(n)}function XE(n){Gin(this,n,OEn())}function WE(n){return!n||pW(n)}function VE(n){return-1!=WLt[n]}function QE(){0!=ctt&&(ctt=0),utt=-1}function YE(){null==PWn&&(PWn=[])}function JE(n,t){tAn(QQ(n.a),t)}function ZE(n,t){tAn(QQ(n.a),t)}function nT(n,t){HL.call(this,n,t)}function tT(n,t){nT.call(this,n,t)}function eT(n,t){this.b=n,this.c=t}function iT(n,t){this.b=n,this.a=t}function rT(n,t){this.a=n,this.b=t}function cT(n,t){this.a=n,this.b=t}function aT(n,t){this.a=n,this.b=t}function uT(n,t){this.a=n,this.b=t}function oT(n,t){this.a=n,this.b=t}function sT(n,t){this.a=n,this.b=t}function hT(n,t){this.a=n,this.b=t}function fT(n,t){this.a=n,this.b=t}function lT(n,t){this.b=n,this.a=t}function bT(n,t){this.b=n,this.a=t}function wT(n,t){this.b=n,this.a=t}function dT(n,t){this.b=n,this.a=t}function gT(n,t){this.f=n,this.g=t}function pT(n,t){this.e=n,this.d=t}function vT(n,t){this.g=n,this.i=t}function mT(n,t){this.a=n,this.b=t}function yT(n,t){this.a=n,this.f=t}function kT(n,t){this.b=n,this.c=t}function jT(n,t){this.a=n,this.b=t}function ET(n,t){this.a=n,this.b=t}function TT(n,t){this.a=n,this.b=t}function MT(n){aN(n.dc()),this.c=n}function ST(n){this.b=BB(yX(n),83)}function PT(n){this.a=BB(yX(n),83)}function CT(n){this.a=BB(yX(n),15)}function IT(n){this.a=BB(yX(n),15)}function OT(n){this.b=BB(yX(n),47)}function AT(){this.q=new e.Date}function $T(){$T=O,Btt=new A}function LT(){LT=O,bet=new P}function NT(n){return n.f.c+n.g.c}function xT(n,t){return n.b.Hc(t)}function DT(n,t){return n.b.Ic(t)}function RT(n,t){return n.b.Qc(t)}function KT(n,t){return n.b.Hc(t)}function _T(n,t){return n.c.uc(t)}function FT(n,t){return n.a._b(t)}function BT(n,t){return Nfn(n.c,t)}function HT(n,t){return hU(n.b,t)}function qT(n,t){return n>t&&t<OVn}function GT(n,t){return n.Gc(t),n}function zT(n,t){return Frn(n,t),n}function UT(n){return XX(),n?stt:ott}function XT(n){non.call(this,n,0)}function WT(){Wz.call(this,null)}function VT(){B8.call(this,null)}function QT(n){this.c=n,Ann(this)}function YT(){P$(this),yQ(this)}function JT(n,t){EW(n),n.a.Nb(t)}function ZT(n,t){return n.Gc(t),n}function nM(n,t){return n.a.f=t,n}function tM(n,t){return n.a.d=t,n}function eM(n,t){return n.a.g=t,n}function iM(n,t){return n.a.j=t,n}function rM(n,t){return n.a.a=t,n}function cM(n,t){return n.a.d=t,n}function aM(n,t){return n.a.e=t,n}function uM(n,t){return n.a.g=t,n}function oM(n,t){return n.a.f=t,n}function sM(n){return n.b=!1,n}function hM(){hM=O,Pet=new CO}function fM(){fM=O,Cet=new IO}function lM(){lM=O,Het=new U}function bM(){bM=O,vut=new Kt}function wM(){wM=O,rct=new Ix}function dM(){dM=O,tit=new hn}function gM(){gM=O,kut=new _t}function pM(){pM=O,sit=new dn}function vM(){vM=O,Gat=new yt}function mM(){mM=O,Fut=new Gj}function yM(){yM=O,zat=new Pt}function kM(){kM=O,Vat=new DG}function jM(){jM=O,hut=new Mt}function EM(){EM=O,But=new be}function TM(){TM=O,nst=new Ye}function MM(){MM=O,wst=new Lr}function SM(){SM=O,Qst=new rc}function PM(){PM=O,Wkt=new B2}function CM(){CM=O,XEt=new LM}function IM(){IM=O,QEt=new vD}function OM(){OM=O,GTt=new XW}function AM(){AM=O,Wpt=new Wu}function $M(){Sin(),this.c=new ok}function LM(){gT.call(this,H1n,0)}function NM(n,t){Jgn(n.c.b,t.c,t)}function xM(n,t){Jgn(n.c.c,t.b,t)}function DM(n,t,e){mZ(n.d,t.f,e)}function RM(n,t,e,i){Jpn(n,i,t,e)}function KM(n,t,e,i){uNn(i,n,t,e)}function _M(n,t,e,i){oUn(i,n,t,e)}function FM(n,t){return n.a=t.g,n}function BM(n,t){return ekn(n.a,t)}function HM(n){return n.b?n.b:n.a}function qM(n){return(n.c+n.a)/2}function GM(){GM=O,lOt=new to}function zM(){zM=O,COt=new ho}function UM(){UM=O,RAt=new Pm}function XM(){XM=O,UAt=new Cm}function WM(){WM=O,zAt=new Nm}function VM(){VM=O,ZAt=new Dm}function QM(){QM=O,N$t=new z$}function YM(){YM=O,x$t=new U$}function JM(){JM=O,rLt=new Ns}function ZM(){ZM=O,aLt=new xs}function nS(){nS=O,mAt=new xp}function tS(){tS=O,V$t=new Np}function eS(){eS=O,MNt=new Kh}function iS(n){e.clearTimeout(n)}function rS(n){this.a=BB(yX(n),224)}function cS(n){return BB(n,42).cd()}function aS(n){return n.b<n.d.gc()}function uS(n,t){return CG(n.a,t)}function oS(n,t){return Vhn(n,t)>0}function sS(n,t){return Vhn(n,t)<0}function hS(n,t){return n.a.get(t)}function fS(n,t){return t.split(n)}function lS(n,t){return hU(n.e,t)}function bS(n){return kW(n),!1}function wS(n){w1.call(this,n,21)}function dS(n,t){_J.call(this,n,t)}function gS(n,t){gT.call(this,n,t)}function pS(n,t){gT.call(this,n,t)}function vS(n){VX(),VK.call(this,n)}function mS(n,t){jG(n,n.length,t)}function yS(n,t){QU(n,n.length,t)}function kS(n,t,e){t.ud(n.a.Ge(e))}function jS(n,t,e){t.we(n.a.Fe(e))}function ES(n,t,e){t.td(n.a.Kb(e))}function TS(n,t,e){n.Mb(e)&&t.td(e)}function MS(n,t,e){n.splice(t,0,e)}function SS(n,t){return SN(n.e,t)}function PS(n,t){this.d=n,this.e=t}function CS(n,t){this.b=n,this.a=t}function IS(n,t){this.b=n,this.a=t}function OS(n,t){this.b=n,this.a=t}function AS(n,t){this.a=n,this.b=t}function $S(n,t){this.a=n,this.b=t}function LS(n,t){this.a=n,this.b=t}function NS(n,t){this.a=n,this.b=t}function xS(n,t){this.a=n,this.b=t}function DS(n,t){this.b=n,this.a=t}function RS(n,t){this.b=n,this.a=t}function KS(n,t){gT.call(this,n,t)}function _S(n,t){gT.call(this,n,t)}function FS(n,t){gT.call(this,n,t)}function BS(n,t){gT.call(this,n,t)}function HS(n,t){gT.call(this,n,t)}function qS(n,t){gT.call(this,n,t)}function GS(n,t){gT.call(this,n,t)}function zS(n,t){gT.call(this,n,t)}function US(n,t){gT.call(this,n,t)}function XS(n,t){gT.call(this,n,t)}function WS(n,t){gT.call(this,n,t)}function VS(n,t){gT.call(this,n,t)}function QS(n,t){gT.call(this,n,t)}function YS(n,t){gT.call(this,n,t)}function JS(n,t){gT.call(this,n,t)}function ZS(n,t){gT.call(this,n,t)}function nP(n,t){gT.call(this,n,t)}function tP(n,t){gT.call(this,n,t)}function eP(n,t){this.a=n,this.b=t}function iP(n,t){this.a=n,this.b=t}function rP(n,t){this.a=n,this.b=t}function cP(n,t){this.a=n,this.b=t}function aP(n,t){this.a=n,this.b=t}function uP(n,t){this.a=n,this.b=t}function oP(n,t){this.a=n,this.b=t}function sP(n,t){this.a=n,this.b=t}function hP(n,t){this.a=n,this.b=t}function fP(n,t){this.b=n,this.a=t}function lP(n,t){this.b=n,this.a=t}function bP(n,t){this.b=n,this.a=t}function wP(n,t){this.b=n,this.a=t}function dP(n,t){this.c=n,this.d=t}function gP(n,t){this.e=n,this.d=t}function pP(n,t){this.a=n,this.b=t}function vP(n,t){this.b=t,this.c=n}function mP(n,t){gT.call(this,n,t)}function yP(n,t){gT.call(this,n,t)}function kP(n,t){gT.call(this,n,t)}function jP(n,t){gT.call(this,n,t)}function EP(n,t){gT.call(this,n,t)}function TP(n,t){gT.call(this,n,t)}function MP(n,t){gT.call(this,n,t)}function SP(n,t){gT.call(this,n,t)}function PP(n,t){gT.call(this,n,t)}function CP(n,t){gT.call(this,n,t)}function IP(n,t){gT.call(this,n,t)}function OP(n,t){gT.call(this,n,t)}function AP(n,t){gT.call(this,n,t)}function $P(n,t){gT.call(this,n,t)}function LP(n,t){gT.call(this,n,t)}function NP(n,t){gT.call(this,n,t)}function xP(n,t){gT.call(this,n,t)}function DP(n,t){gT.call(this,n,t)}function RP(n,t){gT.call(this,n,t)}function KP(n,t){gT.call(this,n,t)}function _P(n,t){gT.call(this,n,t)}function FP(n,t){gT.call(this,n,t)}function BP(n,t){gT.call(this,n,t)}function HP(n,t){gT.call(this,n,t)}function qP(n,t){gT.call(this,n,t)}function GP(n,t){gT.call(this,n,t)}function zP(n,t){gT.call(this,n,t)}function UP(n,t){gT.call(this,n,t)}function XP(n,t){gT.call(this,n,t)}function WP(n,t){gT.call(this,n,t)}function VP(n,t){gT.call(this,n,t)}function QP(n,t){gT.call(this,n,t)}function YP(n,t){gT.call(this,n,t)}function JP(n,t){gT.call(this,n,t)}function ZP(n,t){this.b=n,this.a=t}function nC(n,t){this.a=n,this.b=t}function tC(n,t){this.a=n,this.b=t}function eC(n,t){this.a=n,this.b=t}function iC(n,t){this.a=n,this.b=t}function rC(n,t){gT.call(this,n,t)}function cC(n,t){gT.call(this,n,t)}function aC(n,t){this.b=n,this.d=t}function uC(n,t){gT.call(this,n,t)}function oC(n,t){gT.call(this,n,t)}function sC(n,t){this.a=n,this.b=t}function hC(n,t){this.a=n,this.b=t}function fC(n,t){gT.call(this,n,t)}function lC(n,t){gT.call(this,n,t)}function bC(n,t){gT.call(this,n,t)}function wC(n,t){gT.call(this,n,t)}function dC(n,t){gT.call(this,n,t)}function gC(n,t){gT.call(this,n,t)}function pC(n,t){gT.call(this,n,t)}function vC(n,t){gT.call(this,n,t)}function mC(n,t){gT.call(this,n,t)}function yC(n,t){gT.call(this,n,t)}function kC(n,t){gT.call(this,n,t)}function jC(n,t){gT.call(this,n,t)}function EC(n,t){gT.call(this,n,t)}function TC(n,t){gT.call(this,n,t)}function MC(n,t){gT.call(this,n,t)}function SC(n,t){gT.call(this,n,t)}function PC(n,t){return SN(n.c,t)}function CC(n,t){return SN(t.b,n)}function IC(n,t){return-n.b.Je(t)}function OC(n,t){return SN(n.g,t)}function AC(n,t){gT.call(this,n,t)}function $C(n,t){gT.call(this,n,t)}function LC(n,t){this.a=n,this.b=t}function NC(n,t){this.a=n,this.b=t}function xC(n,t){this.a=n,this.b=t}function DC(n,t){gT.call(this,n,t)}function RC(n,t){gT.call(this,n,t)}function KC(n,t){gT.call(this,n,t)}function _C(n,t){gT.call(this,n,t)}function FC(n,t){gT.call(this,n,t)}function BC(n,t){gT.call(this,n,t)}function HC(n,t){gT.call(this,n,t)}function qC(n,t){gT.call(this,n,t)}function GC(n,t){gT.call(this,n,t)}function zC(n,t){gT.call(this,n,t)}function UC(n,t){gT.call(this,n,t)}function XC(n,t){gT.call(this,n,t)}function WC(n,t){gT.call(this,n,t)}function VC(n,t){gT.call(this,n,t)}function QC(n,t){gT.call(this,n,t)}function YC(n,t){gT.call(this,n,t)}function JC(n,t){this.a=n,this.b=t}function ZC(n,t){this.a=n,this.b=t}function nI(n,t){this.a=n,this.b=t}function tI(n,t){this.a=n,this.b=t}function eI(n,t){this.a=n,this.b=t}function iI(n,t){this.a=n,this.b=t}function rI(n,t){this.a=n,this.b=t}function cI(n,t){gT.call(this,n,t)}function aI(n,t){this.a=n,this.b=t}function uI(n,t){this.a=n,this.b=t}function oI(n,t){this.a=n,this.b=t}function sI(n,t){this.a=n,this.b=t}function hI(n,t){this.a=n,this.b=t}function fI(n,t){this.a=n,this.b=t}function lI(n,t){this.b=n,this.a=t}function bI(n,t){this.b=n,this.a=t}function wI(n,t){this.b=n,this.a=t}function dI(n,t){this.b=n,this.a=t}function gI(n,t){this.a=n,this.b=t}function pI(n,t){this.a=n,this.b=t}function vI(n,t){JLn(n.a,BB(t,56))}function mI(n,t){v7(n.a,BB(t,11))}function yI(n,t){return hH(),t!=n}function kI(){return Rk(),new ket}function jI(){qZ(),this.b=new Rv}function EI(){dxn(),this.a=new Rv}function TI(){KZ(),KG.call(this)}function MI(n,t){gT.call(this,n,t)}function SI(n,t){this.a=n,this.b=t}function PI(n,t){this.a=n,this.b=t}function CI(n,t){this.a=n,this.b=t}function II(n,t){this.a=n,this.b=t}function OI(n,t){this.a=n,this.b=t}function AI(n,t){this.a=n,this.b=t}function $I(n,t){this.d=n,this.b=t}function LI(n,t){this.d=n,this.e=t}function NI(n,t){this.f=n,this.c=t}function xI(n,t){this.b=n,this.c=t}function DI(n,t){this.i=n,this.g=t}function RI(n,t){this.e=n,this.a=t}function KI(n,t){this.a=n,this.b=t}function _I(n,t){n.i=null,arn(n,t)}function FI(n,t){n&&VW(hAt,n,t)}function BI(n,t){return rdn(n.a,t)}function HI(n){return adn(n.c,n.b)}function qI(n){return n?n.dd():null}function GI(n){return null==n?null:n}function zI(n){return typeof n===$Wn}function UI(n){return typeof n===LWn}function XI(n){return typeof n===NWn}function WI(n,t){return n.Hd().Xb(t)}function VI(n,t){return Qcn(n.Kc(),t)}function QI(n,t){return 0==Vhn(n,t)}function YI(n,t){return Vhn(n,t)>=0}function JI(n,t){return 0!=Vhn(n,t)}function ZI(n){return""+(kW(n),n)}function nO(n,t){return n.substr(t)}function tO(n){return zbn(n),n.d.gc()}function eO(n){return zOn(n,n.c),n}function iO(n){return JH(null==n),n}function rO(n,t){return n.a+=""+t,n}function cO(n,t){return n.a+=""+t,n}function aO(n,t){return n.a+=""+t,n}function uO(n,t){return n.a+=""+t,n}function oO(n,t){return n.a+=""+t,n}function sO(n,t){return n.a+=""+t,n}function hO(n,t){r5(n,t,n.a,n.a.a)}function fO(n,t){r5(n,t,n.c.b,n.c)}function lO(n,t,e){Kjn(t,RPn(n,e))}function bO(n,t,e){Kjn(t,RPn(n,e))}function wO(n,t){Tnn(new AL(n),t)}function dO(n,t){n.q.setTime(j2(t))}function gO(n,t){zz.call(this,n,t)}function pO(n,t){zz.call(this,n,t)}function vO(n,t){zz.call(this,n,t)}function mO(n){$U(this),Tcn(this,n)}function yO(n){return l1(n,0),null}function kO(n){return n.a=0,n.b=0,n}function jO(n,t){return n.a=t.g+1,n}function EO(n,t){return 2==n.j[t.p]}function TO(n){return sX(BB(n,79))}function MO(){MO=O,Art=lhn(tpn())}function SO(){SO=O,Zot=lhn(ENn())}function PO(){this.b=new XT(etn(12))}function CO(){this.b=0,this.a=!1}function IO(){this.b=0,this.a=!1}function OO(n){this.a=n,Bh.call(this)}function AO(n){this.a=n,Bh.call(this)}function $O(n,t){iR.call(this,n,t)}function LO(n,t){tK.call(this,n,t)}function NO(n,t){DI.call(this,n,t)}function xO(n,t){Aan.call(this,n,t)}function DO(n,t){QN.call(this,n,t)}function RO(n,t){nS(),VW(mAt,n,t)}function KO(n,t){return fx(n.a,0,t)}function _O(n,t){return n.a.a.a.cc(t)}function FO(n,t){return GI(n)===GI(t)}function BO(n,t){return Pln(n.a,t.a)}function HO(n,t){return E$(n.a,t.a)}function qO(n,t){return FU(n.a,t.a)}function GO(n,t){return n.indexOf(t)}function zO(n,t){return n==t?0:n?1:-1}function UO(n){return n<10?"0"+n:""+n}function XO(n){return yX(n),new OO(n)}function WO(n){return M$(n.l,n.m,n.h)}function VO(n){return CJ((kW(n),n))}function QO(n){return CJ((kW(n),n))}function YO(n,t){return E$(n.g,t.g)}function JO(n){return typeof n===LWn}function ZO(n){return n==Zat||n==eut}function nA(n){return n==Zat||n==nut}function tA(n){return E7(n.b.b,n,0)}function eA(n){this.a=kI(),this.b=n}function iA(n){this.a=kI(),this.b=n}function rA(n,t){return WB(n.a,t),t}function cA(n,t){return WB(n.c,t),n}function aA(n,t){return Jcn(n.a,t),n}function uA(n,t){return G_(),t.a+=n}function oA(n,t){return G_(),t.a+=n}function sA(n,t){return G_(),t.c+=n}function hA(n,t){z9(n,0,n.length,t)}function fA(){ew.call(this,new v4)}function lA(){uG.call(this,0,0,0,0)}function bA(){UV.call(this,0,0,0,0)}function wA(n){this.a=n.a,this.b=n.b}function dA(n){return n==_Pt||n==FPt}function gA(n){return n==HPt||n==KPt}function pA(n){return n==fvt||n==hvt}function vA(n){return n!=QCt&&n!=YCt}function mA(n){return n.Lg()&&n.Mg()}function yA(n){return mV(BB(n,118))}function kA(n){return Jcn(new B2,n)}function jA(n,t){return new Aan(t,n)}function EA(n,t){return new Aan(t,n)}function TA(n,t,e){jen(n,t),Een(n,e)}function MA(n,t,e){Sen(n,t),Men(n,e)}function SA(n,t,e){Pen(n,t),Cen(n,e)}function PA(n,t,e){Ten(n,t),Oen(n,e)}function CA(n,t,e){Ien(n,t),Aen(n,e)}function IA(n,t){Dsn(n,t),xen(n,n.D)}function OA(n){NI.call(this,n,!0)}function AA(n,t,e){ND.call(this,n,t,e)}function $A(n){ODn(),san.call(this,n)}function LA(){gS.call(this,"Head",1)}function NA(){gS.call(this,"Tail",3)}function xA(n){n.c=x8(Ant,HWn,1,0,5,1)}function DA(n){n.a=x8(Ant,HWn,1,8,5,1)}function RA(n){Otn(n.xf(),new Sw(n))}function KA(n){return null!=n?nsn(n):0}function _A(n,t){return Ctn(t,WJ(n))}function FA(n,t){return Ctn(t,WJ(n))}function BA(n,t){return n[n.length]=t}function HA(n,t){return n[n.length]=t}function qA(n){return FB(n.b.Kc(),n.a)}function GA(n,t){return Uin(PX(n.d),t)}function zA(n,t){return Uin(PX(n.g),t)}function UA(n,t){return Uin(PX(n.j),t)}function XA(n,t){iR.call(this,n.b,t)}function WA(n){uG.call(this,n,n,n,n)}function VA(n){return n.b&&VBn(n),n.a}function QA(n){return n.b&&VBn(n),n.c}function YA(n,t){Qet||(n.b=t)}function JA(n,t,e){return $X(n,t,e),e}function ZA(n,t,e){$X(n.c[t.g],t.g,e)}function n$(n,t,e){BB(n.c,69).Xh(t,e)}function t$(n,t,e){SA(e,e.i+n,e.j+t)}function e$(n,t){f9(a4(n.a),e1(t))}function i$(n,t){f9(H7(n.a),i1(t))}function r$(n){wWn(),Ap.call(this,n)}function c$(n){return null==n?0:nsn(n)}function a$(){a$=O,syt=new Hbn(oCt)}function u$(){u$=O,new o$,new Np}function o$(){new xp,new xp,new xp}function s$(){s$=O,Mv(),itt=new xp}function h$(){h$=O,e.Math.log(2)}function f$(){f$=O,zM(),R$t=COt}function l$(){throw Hp(new tk(Tnt))}function b$(){throw Hp(new tk(Tnt))}function w$(){throw Hp(new tk(Mnt))}function d$(){throw Hp(new tk(Mnt))}function g$(n){this.a=n,QB.call(this,n)}function p$(n){this.a=n,ST.call(this,n)}function v$(n){this.a=n,ST.call(this,n)}function m$(n,t){yG(n.c,n.c.length,t)}function y$(n){return n.a<n.c.c.length}function k$(n){return n.a<n.c.a.length}function j$(n,t){return n.a?n.b:t.De()}function E$(n,t){return n<t?-1:n>t?1:0}function T$(n,t){return Vhn(n,t)>0?n:t}function M$(n,t,e){return{l:n,m:t,h:e}}function S$(n,t){null!=n.a&&mI(t,n.a)}function P$(n){n.a=new $,n.c=new $}function C$(n){this.b=n,this.a=new Np}function I$(n){this.b=new et,this.a=n}function O$(n){LR.call(this),this.a=n}function A$(){gS.call(this,"Range",2)}function $$(){tjn(),this.a=new CNn(Uat)}function L$(n,t){yX(t),EV(n).Jc(new b)}function N$(n,t){return BZ(),t.n.b+=n}function x$(n,t,e){return VW(n.g,e,t)}function D$(n,t,e){return VW(n.k,e,t)}function R$(n,t){return VW(n.a,t.a,t)}function K$(n,t,e){return Idn(t,e,n.c)}function _$(n){return new xC(n.c,n.d)}function F$(n){return new xC(n.c,n.d)}function B$(n){return new xC(n.a,n.b)}function H$(n,t){return tzn(n.a,t,null)}function q$(n){SZ(n,null),MZ(n,null)}function G$(n){WZ(n,null),VZ(n,null)}function z$(){QN.call(this,null,null)}function U$(){YN.call(this,null,null)}function X$(n){this.a=n,xp.call(this)}function W$(n){this.b=(SQ(),new Xb(n))}function V$(n){n.j=x8(Ftt,sVn,310,0,0,1)}function Q$(n,t,e){n.c.Vc(t,BB(e,133))}function Y$(n,t,e){n.c.ji(t,BB(e,133))}function J$(n,t){sqn(n),n.Gc(BB(t,15))}function Z$(n,t){return Bqn(n.c,n.b,t)}function nL(n,t){return new pN(n.Kc(),t)}function tL(n,t){return-1!=Fun(n.Kc(),t)}function eL(n,t){return null!=n.a.Bc(t)}function iL(n){return n.Ob()?n.Pb():null}function rL(n){return Bdn(n,0,n.length)}function cL(n,t){return null!=n&&Qpn(n,t)}function aL(n,t){n.q.setHours(t),lBn(n,t)}function uL(n,t){n.c&&(RH(t),kJ(t))}function oL(n,t,e){BB(n.Kb(e),164).Nb(t)}function sL(n,t,e){return HGn(n,t,e),e}function hL(n,t,e){n.a=1502^t,n.b=e^aYn}function fL(n,t,e){return n.a[t.g][e.g]}function lL(n,t){return n.a[t.c.p][t.p]}function bL(n,t){return n.e[t.c.p][t.p]}function wL(n,t){return n.c[t.c.p][t.p]}function dL(n,t){return n.j[t.p]=pLn(t)}function gL(n,t){return f6(n.f,t.tg())}function pL(n,t){return f6(n.b,t.tg())}function vL(n,t){return n.a<XK(t)?-1:1}function mL(n,t,e){return e?0!=t:t!=n-1}function yL(n,t,e){return n.a=t,n.b=e,n}function kL(n,t){return n.a*=t,n.b*=t,n}function jL(n,t,e){return $X(n.g,t,e),e}function EL(n,t,e,i){$X(n.a[t.g],e.g,i)}function TL(n,t){_x(t,n.a.a.a,n.a.a.b)}function ML(n){n.a=BB(yan(n.b.a,4),126)}function SL(n){n.a=BB(yan(n.b.a,4),126)}function PL(n){OY(n,i8n),HLn(n,IUn(n))}function CL(){CL=O,Set=new vy(null)}function IL(){(IL=O)(),$et=new z}function OL(){this.Bb|=256,this.Bb|=512}function AL(n){this.i=n,this.f=this.i.j}function $L(n,t,e){yH.call(this,n,t,e)}function LL(n,t,e){$L.call(this,n,t,e)}function NL(n,t,e){$L.call(this,n,t,e)}function xL(n,t,e){LL.call(this,n,t,e)}function DL(n,t,e){yH.call(this,n,t,e)}function RL(n,t,e){yH.call(this,n,t,e)}function KL(n,t,e){MH.call(this,n,t,e)}function _L(n,t,e){MH.call(this,n,t,e)}function FL(n,t,e){KL.call(this,n,t,e)}function BL(n,t,e){DL.call(this,n,t,e)}function HL(n,t){this.a=n,ST.call(this,t)}function qL(n,t){this.a=n,uk.call(this,t)}function GL(n,t){this.a=n,uk.call(this,t)}function zL(n,t){this.a=n,uk.call(this,t)}function UL(n){this.a=n,hl.call(this,n.d)}function XL(n){this.c=n,this.a=this.c.a}function WL(n,t){this.a=t,uk.call(this,n)}function VL(n,t){this.a=t,d4.call(this,n)}function QL(n,t){this.a=n,d4.call(this,t)}function YL(n,t){return wz(bz(n.c)).Xb(t)}function JL(n,t){return ebn(n,new Ck,t).a}function ZL(n,t){return yX(t),new nN(n,t)}function nN(n,t){this.a=t,OT.call(this,n)}function tN(n){this.b=n,this.a=this.b.a.e}function eN(n){n.b.Qb(),--n.d.f.d,$G(n.d)}function iN(n){tl.call(this,BB(yX(n),35))}function rN(n){tl.call(this,BB(yX(n),35))}function cN(){gT.call(this,"INSTANCE",0)}function aN(n){if(!n)throw Hp(new wv)}function uN(n){if(!n)throw Hp(new dv)}function oN(n){if(!n)throw Hp(new yv)}function sN(){sN=O,JM(),cLt=new Ff}function hN(){hN=O,ptt=!1,vtt=!0}function fN(n){Ab.call(this,(kW(n),n))}function lN(n){Ab.call(this,(kW(n),n))}function bN(n){Hb.call(this,n),this.a=n}function wN(n){qb.call(this,n),this.a=n}function dN(n){Ak.call(this,n),this.a=n}function gN(){V$(this),jQ(this),this._d()}function pN(n,t){this.a=t,OT.call(this,n)}function vN(n,t){return new KPn(n.a,n.b,t)}function mN(n,t){return n.lastIndexOf(t)}function yN(n,t,e){return n.indexOf(t,e)}function kN(n){return null==n?zWn:Bbn(n)}function jN(n){return null==n?null:n.name}function EN(n){return null!=n.a?n.a:null}function TN(n){return EE(n.a)?u1(n):null}function MN(n,t){return null!=$J(n.a,t)}function SN(n,t){return!!t&&n.b[t.g]==t}function PN(n){return n.$H||(n.$H=++cit)}function CN(n){return n.l+n.m*IQn+n.h*OQn}function IN(n,t){return WB(t.a,n.a),n.a}function ON(n,t){return WB(t.b,n.a),n.a}function AN(n,t){return WB(t.a,n.a),n.a}function $N(n){return Px(null!=n.a),n.a}function LN(n){ew.call(this,new q8(n))}function NN(n,t){Sgn.call(this,n,t,null)}function xN(n){this.a=n,Bb.call(this,n)}function DN(){DN=O,Lrt=new iR(dJn,0)}function RN(n,t){return++n.b,WB(n.a,t)}function KN(n,t){return++n.b,y7(n.a,t)}function _N(n,t){return Pln(n.n.a,t.n.a)}function FN(n,t){return Pln(n.c.d,t.c.d)}function BN(n,t){return Pln(n.c.c,t.c.c)}function HN(n,t){return BB(h6(n.b,t),15)}function qN(n,t){return n.n.b=(kW(t),t)}function GN(n,t){return n.n.b=(kW(t),t)}function zN(n){return y$(n.a)||y$(n.b)}function UN(n,t,e){return p3(n,t,e,n.b)}function XN(n,t,e){return p3(n,t,e,n.c)}function WN(n,t,e){BB(D7(n,t),21).Fc(e)}function VN(n,t,e){Oln(n.a,e),Ivn(n.a,t)}function QN(n,t){QM(),this.a=n,this.b=t}function YN(n,t){YM(),this.b=n,this.c=t}function JN(n,t){FG(),this.f=t,this.d=n}function ZN(n,t){w6(t,n),this.d=n,this.c=t}function nx(n){var t;t=n.a,n.a=n.b,n.b=t}function tx(n){return G_(),!!n&&!n.dc()}function ex(n){return new h4(3,n)}function ix(n,t){return new bK(n,n.gc(),t)}function rx(n){return ry(),Cnn((DZ(),Xnt),n)}function cx(n){this.d=n,AL.call(this,n)}function ax(n){this.c=n,AL.call(this,n)}function ux(n){this.c=n,cx.call(this,n)}function ox(){MM(),this.b=new yd(this)}function sx(n){return lin(n,AVn),new J6(n)}function hx(n){return PY(),parseInt(n)||-1}function fx(n,t,e){return n.substr(t,e-t)}function lx(n,t,e){return yN(n,YTn(t),e)}function bx(n){return VU(n.c,n.c.length)}function wx(n){return null!=n.f?n.f:""+n.g}function dx(n){return null!=n.f?n.f:""+n.g}function gx(n){return Px(0!=n.b),n.a.a.c}function px(n){return Px(0!=n.b),n.c.b.c}function vx(n){cL(n,150)&&BB(n,150).Gh()}function mx(n){return n.b=BB(mQ(n.a),42)}function yx(n){hM(),this.b=n,this.a=!0}function kx(n){fM(),this.b=n,this.a=!0}function jx(n){n.d=new Cx(n),n.e=new xp}function Ex(n){if(!n)throw Hp(new vv)}function Tx(n){if(!n)throw Hp(new wv)}function Mx(n){if(!n)throw Hp(new dv)}function Sx(n){if(!n)throw Hp(new lv)}function Px(n){if(!n)throw Hp(new yv)}function Cx(n){nH.call(this,n,null,null)}function Ix(){gT.call(this,"POLYOMINO",0)}function Ox(n,t,e,i){sz.call(this,n,t,e,i)}function Ax(n,t){return _Mn(),JIn(n,t.e,t)}function $x(n,t,e){return AM(),e.qg(n,t)}function Lx(n,t){return!!n.q&&hU(n.q,t)}function Nx(n,t){return n>0?t*t/n:t*t*100}function xx(n,t){return n>0?t/(n*n):100*t}function Dx(n,t,e){return WB(t,own(n,e))}function Rx(n,t,e){x9(),n.Xe(t)&&e.td(n)}function Kx(n,t,e){n.Zc(t).Rb(e)}function _x(n,t,e){return n.a+=t,n.b+=e,n}function Fx(n,t,e){return n.a*=t,n.b*=e,n}function Bx(n,t,e){return n.a-=t,n.b-=e,n}function Hx(n,t){return n.a=t.a,n.b=t.b,n}function qx(n){return n.a=-n.a,n.b=-n.b,n}function Gx(n){this.c=n,this.a=1,this.b=1}function zx(n){this.c=n,Pen(n,0),Cen(n,0)}function Ux(n){YT.call(this),nin(this,n)}function Xx(n){RXn(),Bp(this),this.mf(n)}function Wx(n,t){QM(),QN.call(this,n,t)}function Vx(n,t){YM(),YN.call(this,n,t)}function Qx(n,t){YM(),YN.call(this,n,t)}function Yx(n,t){YM(),Vx.call(this,n,t)}function Jx(n,t,e){y9.call(this,n,t,e,2)}function Zx(n,t){f$(),cG.call(this,n,t)}function nD(n,t){f$(),Zx.call(this,n,t)}function tD(n,t){f$(),Zx.call(this,n,t)}function eD(n,t){f$(),tD.call(this,n,t)}function iD(n,t){f$(),cG.call(this,n,t)}function rD(n,t){f$(),iD.call(this,n,t)}function cD(n,t){f$(),cG.call(this,n,t)}function aD(n,t){return n.c.Fc(BB(t,133))}function uD(n,t,e){return NHn(F7(n,t),e)}function oD(n,t,e){return t.Qk(n.e,n.c,e)}function sD(n,t,e){return t.Rk(n.e,n.c,e)}function hD(n,t){return tfn(n.e,BB(t,49))}function fD(n,t,e){sln(H7(n.a),t,i1(e))}function lD(n,t,e){sln(a4(n.a),t,e1(e))}function bD(n,t){t.$modCount=n.$modCount}function wD(){wD=O,Vkt=new up("root")}function dD(){dD=O,pAt=new Tm,new Mm}function gD(){this.a=new pJ,this.b=new pJ}function pD(){jin.call(this),this.Bb|=BQn}function vD(){gT.call(this,"GROW_TREE",0)}function mD(n){return null==n?null:wUn(n)}function yD(n){return null==n?null:LSn(n)}function kD(n){return null==n?null:Bbn(n)}function jD(n){return null==n?null:Bbn(n)}function ED(n){null==n.o&&g$n(n)}function TD(n){return JH(null==n||zI(n)),n}function MD(n){return JH(null==n||UI(n)),n}function SD(n){return JH(null==n||XI(n)),n}function PD(n){this.q=new e.Date(j2(n))}function CD(n,t){this.c=n,pT.call(this,n,t)}function ID(n,t){this.a=n,CD.call(this,n,t)}function OD(n,t){this.d=n,Mb(this),this.b=t}function AD(n,t){B8.call(this,n),this.a=t}function $D(n,t){B8.call(this,n),this.a=t}function LD(n){qwn.call(this,0,0),this.f=n}function ND(n,t,e){W6.call(this,n,t,e,null)}function xD(n,t,e){W6.call(this,n,t,e,null)}function DD(n,t,e){return n.ue(t,e)<=0?e:t}function RD(n,t,e){return n.ue(t,e)<=0?t:e}function KD(n,t){return BB(lnn(n.b,t),149)}function _D(n,t){return BB(lnn(n.c,t),229)}function FD(n){return BB(xq(n.a,n.b),287)}function BD(n){return new xC(n.c,n.d+n.a)}function HD(n){return BZ(),pA(BB(n,197))}function qD(){qD=O,$rt=nbn((mdn(),_It))}function GD(n,t){t.a?Fxn(n,t):MN(n.a,t.b)}function zD(n,t){Qet||WB(n.a,t)}function UD(n,t){return mM(),wan(t.d.i,n)}function XD(n,t){return Irn(),new cKn(t,n)}function WD(n,t){return OY(t,uJn),n.f=t,n}function VD(n,t,e){return e=T_n(n,t,3,e)}function QD(n,t,e){return e=T_n(n,t,6,e)}function YD(n,t,e){return e=T_n(n,t,9,e)}function JD(n,t,e){++n.j,n.Ki(),L8(n,t,e)}function ZD(n,t,e){++n.j,n.Hi(t,n.oi(t,e))}function nR(n,t,e){n.Zc(t).Rb(e)}function tR(n,t,e){return ZBn(n.c,n.b,t,e)}function eR(n,t){return(t&DWn)%n.d.length}function iR(n,t){up.call(this,n),this.a=t}function rR(n,t){kp.call(this,n),this.a=t}function cR(n,t){kp.call(this,n),this.a=t}function aR(n,t){this.c=n,gtn.call(this,t)}function uR(n,t){this.a=n,yp.call(this,t)}function oR(n,t){this.a=n,yp.call(this,t)}function sR(n){this.a=(lin(n,AVn),new J6(n))}function hR(n){this.a=(lin(n,AVn),new J6(n))}function fR(n){return!n.a&&(n.a=new w),n.a}function lR(n){return n>8?0:n+1}function bR(n,t){return hN(),n==t?0:n?1:-1}function wR(n,t,e){return mG(n,BB(t,22),e)}function dR(n,t,e){return n.apply(t,e)}function gR(n,t,e){return n.a+=Bdn(t,0,e),n}function pR(n,t){var e;return e=n.e,n.e=t,e}function vR(n,t){n[iYn].call(n,t)}function mR(n,t){n[iYn].call(n,t)}function yR(n,t){n.a.Vc(n.b,t),++n.b,n.c=-1}function kR(n){$U(n.e),n.d.b=n.d,n.d.a=n.d}function jR(n){n.b?jR(n.b):n.f.c.zc(n.e,n.d)}function ER(n,t,e){dM(),Il(n,t.Ce(n.a,e))}function TR(n,t){return Qj(Mdn(n.a,t,!0))}function MR(n,t){return Qj(Sdn(n.a,t,!0))}function SR(n,t){return qk(new Array(t),n)}function PR(n){return String.fromCharCode(n)}function CR(n){return null==n?null:n.message}function IR(){this.a=new Np,this.b=new Np}function OR(){this.a=new bt,this.b=new Tv}function AR(){this.b=new Gj,this.c=new Np}function $R(){this.d=new Gj,this.e=new Gj}function LR(){this.n=new Gj,this.o=new Gj}function NR(){this.n=new bm,this.i=new bA}function xR(){this.a=new nf,this.b=new uc}function DR(){this.a=new Np,this.d=new Np}function RR(){this.b=new Rv,this.a=new Rv}function KR(){this.b=new xp,this.a=new xp}function _R(){this.b=new AE,this.a=new da}function FR(){NR.call(this),this.a=new Gj}function BR(n){Oan.call(this,n,(Z9(),Net))}function HR(n,t,e,i){uG.call(this,n,t,e,i)}function qR(n,t,e){null!=e&&Lin(t,Amn(n,e))}function GR(n,t,e){null!=e&&Nin(t,Amn(n,e))}function zR(n,t,e){return e=T_n(n,t,11,e)}function UR(n,t){return n.a+=t.a,n.b+=t.b,n}function XR(n,t){return n.a-=t.a,n.b-=t.b,n}function WR(n,t){return n.n.a=(kW(t),t+10)}function VR(n,t){return n.n.a=(kW(t),t+10)}function QR(n,t){return t==n||Sjn(CLn(t),n)}function YR(n,t){return null==VW(n.a,t,"")}function JR(n,t){return mM(),!wan(t.d.i,n)}function ZR(n,t){dA(n.f)?c$n(n,t):ITn(n,t)}function nK(n,t){return t.Hh(n.a)}function tK(n,t){Ay.call(this,e9n+n+o8n+t)}function eK(n,t,e,i){eU.call(this,n,t,e,i)}function iK(n,t,e,i){eU.call(this,n,t,e,i)}function rK(n,t,e,i){iK.call(this,n,t,e,i)}function cK(n,t,e,i){iU.call(this,n,t,e,i)}function aK(n,t,e,i){iU.call(this,n,t,e,i)}function uK(n,t,e,i){iU.call(this,n,t,e,i)}function oK(n,t,e,i){aK.call(this,n,t,e,i)}function sK(n,t,e,i){aK.call(this,n,t,e,i)}function hK(n,t,e,i){uK.call(this,n,t,e,i)}function fK(n,t,e,i){sK.call(this,n,t,e,i)}function lK(n,t,e,i){Zz.call(this,n,t,e,i)}function bK(n,t,e){this.a=n,ZN.call(this,t,e)}function wK(n,t,e){this.c=t,this.b=e,this.a=n}function dK(n,t,e){return n.d=BB(t.Kb(e),164)}function gK(n,t){return n.Aj().Nh().Kh(n,t)}function pK(n,t){return n.Aj().Nh().Ih(n,t)}function vK(n,t){return kW(n),GI(n)===GI(t)}function mK(n,t){return kW(n),GI(n)===GI(t)}function yK(n,t){return Qj(Mdn(n.a,t,!1))}function kK(n,t){return Qj(Sdn(n.a,t,!1))}function jK(n,t){return n.b.sd(new $S(n,t))}function EK(n,t){return n.b.sd(new LS(n,t))}function TK(n,t){return n.b.sd(new NS(n,t))}function MK(n,t,e){return n.lastIndexOf(t,e)}function SK(n,t,e){return Pln(n[t.b],n[e.b])}function PK(n,t){return hon(t,(HXn(),Rdt),n)}function CK(n,t){return E$(t.a.d.p,n.a.d.p)}function IK(n,t){return E$(n.a.d.p,t.a.d.p)}function OK(n,t){return Pln(n.c-n.s,t.c-t.s)}function AK(n){return n.c?E7(n.c.a,n,0):-1}function $K(n){return n<100?null:new Fj(n)}function LK(n){return n==UCt||n==WCt||n==XCt}function NK(n,t){return cL(t,15)&&QDn(n.c,t)}function xK(n,t){Qet||t&&(n.d=t)}function DK(n,t){return!!lsn(n,t)}function RK(n,t){this.c=n,GU.call(this,n,t)}function KK(n){this.c=n,vO.call(this,bVn,0)}function _K(n,t){JB.call(this,n,n.length,t)}function FK(n,t,e){return BB(n.c,69).lk(t,e)}function BK(n,t,e){return BB(n.c,69).mk(t,e)}function HK(n,t,e){return oD(n,BB(t,332),e)}function qK(n,t,e){return sD(n,BB(t,332),e)}function GK(n,t,e){return IEn(n,BB(t,332),e)}function zK(n,t,e){return QTn(n,BB(t,332),e)}function UK(n,t){return null==t?null:lfn(n.b,t)}function XK(n){return UI(n)?(kW(n),n):n.ke()}function WK(n){return!isNaN(n)&&!isFinite(n)}function VK(n){s_(),this.a=(SQ(),new Ak(n))}function QK(n){hH(),this.d=n,this.a=new Lp}function YK(n,t,e){this.a=n,this.b=t,this.c=e}function JK(n,t,e){this.a=n,this.b=t,this.c=e}function ZK(n,t,e){this.d=n,this.b=e,this.a=t}function n_(n){P$(this),yQ(this),Frn(this,n)}function t_(n){xA(this),tH(this.c,0,n.Pc())}function e_(n){fW(n.a),z8(n.c,n.b),n.b=null}function i_(n){this.a=n,$T(),fan(Date.now())}function r_(){r_=O,iit=new r,rit=new r}function c_(){c_=O,Tet=new L,Met=new N}function a_(){a_=O,wAt=x8(Ant,HWn,1,0,5,1)}function u_(){u_=O,M$t=x8(Ant,HWn,1,0,5,1)}function o_(){o_=O,S$t=x8(Ant,HWn,1,0,5,1)}function s_(){s_=O,new rv((SQ(),SQ(),set))}function h_(n){return Z9(),Cnn((n7(),_et),n)}function f_(n){return qsn(),Cnn((e8(),Zet),n)}function l_(n){return hpn(),Cnn((I4(),pit),n)}function b_(n){return Rnn(),Cnn((O4(),kit),n)}function w_(n){return tRn(),Cnn((xan(),Fit),n)}function d_(n){return Dtn(),Cnn((Z6(),Wit),n)}function g_(n){return J9(),Cnn((n8(),trt),n)}function p_(n){return G7(),Cnn((t8(),urt),n)}function v_(n){return dWn(),Cnn((MO(),Art),n)}function m_(n){return Dan(),Cnn((e7(),_rt),n)}function y_(n){return Hpn(),Cnn((i7(),zrt),n)}function k_(n){return qpn(),Cnn((r7(),ict),n)}function j_(n){return wM(),Cnn((Q2(),act),n)}function E_(n){return Knn(),Cnn((A4(),_ct),n)}function T_(n){return q7(),Cnn((i8(),Lat),n)}function M_(n){return yMn(),Cnn((Xnn(),qat),n)}function S_(n){return Aun(),Cnn((t7(),rut),n)}function P_(n){return Bfn(),Cnn((r8(),gut),n)}function C_(n,t){if(!n)throw Hp(new _y(t))}function I_(n){return uSn(),Cnn((hen(),Aut),n)}function O_(n){uG.call(this,n.d,n.c,n.a,n.b)}function A_(n){uG.call(this,n.d,n.c,n.a,n.b)}function $_(n,t,e){this.b=n,this.c=t,this.a=e}function L_(n,t,e){this.b=n,this.a=t,this.c=e}function N_(n,t,e){this.a=n,this.b=t,this.c=e}function x_(n,t,e){this.a=n,this.b=t,this.c=e}function D_(n,t,e){this.a=n,this.b=t,this.c=e}function R_(n,t,e){this.a=n,this.b=t,this.c=e}function K_(n,t,e){this.b=n,this.a=t,this.c=e}function __(n,t,e){this.e=t,this.b=n,this.d=e}function F_(n,t,e){return dM(),n.a.Od(t,e),t}function B_(n){var t;return(t=new jn).e=n,t}function H_(n){var t;return(t=new Zv).b=n,t}function q_(){q_=O,Uut=new Ne,Xut=new xe}function G_(){G_=O,dst=new vr,gst=new mr}function z_(n){return Iun(),Cnn((a7(),ost),n)}function U_(n){return Oun(),Cnn((o7(),Est),n)}function X_(n){return kDn(),Cnn((Gcn(),Vst),n)}function W_(n){return $Pn(),Cnn((ben(),rht),n)}function V_(n){return V8(),Cnn((R4(),oht),n)}function Q_(n){return Oin(),Cnn((c8(),bht),n)}function Y_(n){return LEn(),Cnn((Hnn(),Ost),n)}function J_(n){return Crn(),Cnn((o8(),_st),n)}function Z_(n){return uin(),Cnn((a8(),vht),n)}function nF(n){return Vvn(),Cnn((Fnn(),Mht),n)}function tF(n){return _nn(),Cnn((L4(),Iht),n)}function eF(n){return Jun(),Cnn((u8(),Nht),n)}function iF(n){return gSn(),Cnn((pen(),Hht),n)}function rF(n){return g7(),Cnn((N4(),Uht),n)}function cF(n){return Bjn(),Cnn((den(),nft),n)}function aF(n){return JMn(),Cnn((wen(),oft),n)}function uF(n){return bDn(),Cnn((Vun(),yft),n)}function oF(n){return Kan(),Cnn((h8(),Mft),n)}function sF(n){return z7(),Cnn((s8(),Oft),n)}function hF(n){return z2(),Cnn((K4(),Nft),n)}function fF(n){return Tbn(),Cnn((qnn(),zlt),n)}function lF(n){return TTn(),Cnn((gen(),rvt),n)}function bF(n){return Mhn(),Cnn((f8(),svt),n)}function wF(n){return bvn(),Cnn((s7(),dvt),n)}function dF(n){return ain(),Cnn((w8(),Uvt),n)}function gF(n){return sNn(),Cnn((qcn(),$vt),n)}function pF(n){return mon(),Cnn((b8(),Rvt),n)}function vF(n){return U7(),Cnn((D4(),Bvt),n)}function mF(n){return Hcn(),Cnn((l8(),Yvt),n)}function yF(n){return Nvn(),Cnn((Bnn(),jvt),n)}function kF(n){return A6(),Cnn((x4(),tmt),n)}function jF(n){return Usn(),Cnn((g8(),amt),n)}function EF(n){return dcn(),Cnn((p8(),fmt),n)}function TF(n){return $un(),Cnn((d8(),gmt),n)}function MF(n){return oin(),Cnn((v8(),Nmt),n)}function SF(n){return Q4(),Cnn((F4(),Gmt),n)}function PF(n){return gJ(),Cnn((B4(),iyt),n)}function CF(n){return oZ(),Cnn((H4(),uyt),n)}function IF(n){return O6(),Cnn((_4(),Pyt),n)}function OF(n){return dJ(),Cnn((q4(),Dyt),n)}function AF(n){return zyn(),Cnn((c7(),Hyt),n)}function $F(n){return DPn(),Cnn((ven(),Jyt),n)}function LF(n){return sZ(),Cnn((U4(),Fkt),n)}function NF(n){return Prn(),Cnn((z4(),Zkt),n)}function xF(n){return B0(),Cnn((G4(),Gkt),n)}function DF(n){return Cbn(),Cnn((m8(),rjt),n)}function RF(n){return D9(),Cnn((X4(),ojt),n)}function KF(n){return Hsn(),Cnn((y8(),bjt),n)}function _F(n){return Omn(),Cnn((u7(),zjt),n)}function FF(n){return Bcn(),Cnn((j8(),Qjt),n)}function BF(n){return Sbn(),Cnn((k8(),eEt),n)}function HF(n){return YLn(),Cnn((Unn(),BEt),n)}function qF(n){return Pbn(),Cnn((E8(),UEt),n)}function GF(n){return CM(),Cnn((W2(),VEt),n)}function zF(n){return IM(),Cnn((X2(),JEt),n)}function UF(n){return $6(),Cnn((V4(),eTt),n)}function XF(n){return $Sn(),Cnn((Gnn(),sTt),n)}function WF(n){return OM(),Cnn((V2(),UTt),n)}function VF(n){return Lun(),Cnn((W4(),QTt),n)}function QF(n){return rpn(),Cnn((znn(),bMt),n)}function YF(n){return PPn(),Cnn((zcn(),EMt),n)}function JF(n){return wvn(),Cnn((len(),xMt),n)}function ZF(n){return wEn(),Cnn((fen(),tSt),n)}function nB(n){return lWn(),Cnn((SO(),Zot),n)}function tB(n){return Srn(),Cnn(($4(),zut),n)}function eB(n){return Ffn(),Cnn((Wnn(),GPt),n)}function iB(n){return Rtn(),Cnn((M8(),VPt),n)}function rB(n){return Mbn(),Cnn((l7(),tCt),n)}function cB(n){return nMn(),Cnn((yen(),sCt),n)}function aB(n){return ufn(),Cnn((T8(),kCt),n)}function uB(n){return Xyn(),Cnn((f7(),PCt),n)}function oB(n){return n$n(),Cnn((Nan(),KCt),n)}function sB(n){return cpn(),Cnn((Vnn(),zCt),n)}function hB(n){return QEn(),Cnn((Htn(),ZCt),n)}function fB(n){return lIn(),Cnn((men(),uIt),n)}function lB(n){return mdn(),Cnn((w7(),BIt),n)}function bB(n){return n_n(),Cnn((Qun(),JIt),n)}function wB(n){return kUn(),Cnn((Qnn(),OIt),n)}function dB(n){return Fwn(),Cnn((b7(),rOt),n)}function gB(n){return Bsn(),Cnn((h7(),fOt),n)}function pB(n){return hAn(),Cnn((Ucn(),cAt),n)}function vB(n,t){return kW(n),n+(kW(t),t)}function mB(n,t){return $T(),f9(QQ(n.a),t)}function yB(n,t){return $T(),f9(QQ(n.a),t)}function kB(n,t){this.c=n,this.a=t,this.b=t-n}function jB(n,t,e){this.a=n,this.b=t,this.c=e}function EB(n,t,e){this.a=n,this.b=t,this.c=e}function TB(n,t,e){this.a=n,this.b=t,this.c=e}function MB(n,t,e){this.a=n,this.b=t,this.c=e}function SB(n,t,e){this.a=n,this.b=t,this.c=e}function PB(n,t,e){this.e=n,this.a=t,this.c=e}function CB(n,t,e){f$(),mJ.call(this,n,t,e)}function IB(n,t,e){f$(),rW.call(this,n,t,e)}function OB(n,t,e){f$(),rW.call(this,n,t,e)}function AB(n,t,e){f$(),rW.call(this,n,t,e)}function $B(n,t,e){f$(),IB.call(this,n,t,e)}function LB(n,t,e){f$(),IB.call(this,n,t,e)}function NB(n,t,e){f$(),LB.call(this,n,t,e)}function xB(n,t,e){f$(),OB.call(this,n,t,e)}function DB(n,t,e){f$(),AB.call(this,n,t,e)}function RB(n,t){return yX(n),yX(t),new hT(n,t)}function KB(n,t){return yX(n),yX(t),new _H(n,t)}function _B(n,t){return yX(n),yX(t),new FH(n,t)}function FB(n,t){return yX(n),yX(t),new lT(n,t)}function BB(n,t){return JH(null==n||Qpn(n,t)),n}function HB(n){var t;return fnn(t=new Np,n),t}function qB(n){var t;return fnn(t=new Rv,n),t}function GB(n){var t;return qrn(t=new zv,n),t}function zB(n){var t;return qrn(t=new YT,n),t}function UB(n){return!n.e&&(n.e=new Np),n.e}function XB(n){return!n.c&&(n.c=new Bo),n.c}function WB(n,t){return n.c[n.c.length]=t,!0}function VB(n,t){this.c=n,this.b=t,this.a=!1}function QB(n){this.d=n,Mb(this),this.b=rz(n.d)}function YB(){this.a=";,;",this.b="",this.c=""}function JB(n,t,e){Uz.call(this,t,e),this.a=n}function ZB(n,t,e){this.b=n,gO.call(this,t,e)}function nH(n,t,e){this.c=n,PS.call(this,t,e)}function tH(n,t,e){_Cn(e,0,n,t,e.length,!1)}function eH(n,t,e,i,r){n.b=t,n.c=e,n.d=i,n.a=r}function iH(n,t){t&&(n.b=t,n.a=(EW(t),t.a))}function rH(n,t,e,i,r){n.d=t,n.c=e,n.a=i,n.b=r}function cH(n){var t,e;t=n.b,e=n.c,n.b=e,n.c=t}function aH(n){var t,e;e=n.d,t=n.a,n.d=t,n.a=e}function uH(n){return uan(xU(JO(n)?Pan(n):n))}function oH(n,t){return E$(oq(n.d),oq(t.d))}function sH(n,t){return t==(kUn(),CIt)?n.c:n.d}function hH(){hH=O,kUn(),Rmt=CIt,Kmt=oIt}function fH(){this.b=Gy(MD(mpn((fRn(),aat))))}function lH(n){return dM(),x8(Ant,HWn,1,n,5,1)}function bH(n){return new xC(n.c+n.b,n.d+n.a)}function wH(n,t){return SM(),E$(n.d.p,t.d.p)}function dH(n){return Px(0!=n.b),Atn(n,n.a.a)}function gH(n){return Px(0!=n.b),Atn(n,n.c.b)}function pH(n,t){if(!n)throw Hp(new $y(t))}function vH(n,t){if(!n)throw Hp(new _y(t))}function mH(n,t,e){dP.call(this,n,t),this.b=e}function yH(n,t,e){LI.call(this,n,t),this.c=e}function kH(n,t,e){btn.call(this,t,e),this.d=n}function jH(n){o_(),yo.call(this),this.th(n)}function EH(n,t,e){this.a=n,NO.call(this,t,e)}function TH(n,t,e){this.a=n,NO.call(this,t,e)}function MH(n,t,e){LI.call(this,n,t),this.c=e}function SH(){R5(),oW.call(this,(WM(),zAt))}function PH(n){return null!=n&&!Xbn(n,LAt,NAt)}function CH(n,t){return(Wfn(n)<<4|Wfn(t))&QVn}function IH(n,t){return nV(),zvn(n,t),new GW(n,t)}function OH(n,t){var e;n.n&&(e=t,WB(n.f,e))}function AH(n,t,e){rtn(n,t,new GX(e))}function $H(n,t){var e;return e=n.c,Kin(n,t),e}function LH(n,t){return n.g=t<0?-1:t,n}function NH(n,t){return ztn(n),n.a*=t,n.b*=t,n}function xH(n,t,e,i,r){n.c=t,n.d=e,n.b=i,n.a=r}function DH(n,t){return r5(n,t,n.c.b,n.c),!0}function RH(n){n.a.b=n.b,n.b.a=n.a,n.a=n.b=null}function KH(n){this.b=n,this.a=lz(this.b.a).Ed()}function _H(n,t){this.b=n,this.a=t,Bh.call(this)}function FH(n,t){this.a=n,this.b=t,Bh.call(this)}function BH(n,t){Uz.call(this,t,1040),this.a=n}function HH(n){return 0==n||isNaN(n)?n:n<0?-1:1}function qH(n){return MQ(),PMn(n)==JJ(OMn(n))}function GH(n){return MQ(),OMn(n)==JJ(PMn(n))}function zH(n,t){return Yjn(n,new dP(t.a,t.b))}function UH(n){return!b5(n)&&n.c.i.c==n.d.i.c}function XH(n){var t;return t=n.n,n.a.b+t.d+t.a}function WH(n){var t;return t=n.n,n.e.b+t.d+t.a}function VH(n){var t;return t=n.n,n.e.a+t.b+t.c}function QH(n){return wWn(),new oG(0,n)}function YH(n){return n.a?n.a:eQ(n)}function JH(n){if(!n)throw Hp(new Ky(null))}function ZH(){ZH=O,SQ(),uLt=new Gb(P7n)}function nq(){nq=O,new svn((ty(),_nt),(ey(),Knt))}function tq(){tq=O,Itt=x8(Att,sVn,19,256,0,1)}function eq(n,t,e,i){awn.call(this,n,t,e,i,0,0)}function iq(n,t,e){return VW(n.b,BB(e.b,17),t)}function rq(n,t,e){return VW(n.b,BB(e.b,17),t)}function cq(n,t){return WB(n,new xC(t.a,t.b))}function aq(n,t){return n.c<t.c?-1:n.c==t.c?0:1}function uq(n){return n.e.c.length+n.g.c.length}function oq(n){return n.e.c.length-n.g.c.length}function sq(n){return n.b.c.length-n.e.c.length}function hq(n){return BZ(),(kUn(),bIt).Hc(n.j)}function fq(n){o_(),jH.call(this,n),this.a=-1}function lq(n,t){xI.call(this,n,t),this.a=this}function bq(n,t){var e;return(e=mX(n,t)).i=2,e}function wq(n,t){return++n.j,n.Ti(t)}function dq(n,t,e){return n.a=-1,WN(n,t.g,e),n}function gq(n,t,e){Kzn(n.a,n.b,n.c,BB(t,202),e)}function pq(n,t){Bin(n,null==t?null:(kW(t),t))}function vq(n,t){Rin(n,null==t?null:(kW(t),t))}function mq(n,t){Rin(n,null==t?null:(kW(t),t))}function yq(n,t,e){return new wK(dW(n).Ie(),e,t)}function kq(n,t,e,i,r,c){return Vjn(n,t,e,i,r,0,c)}function jq(){jq=O,jtt=x8(Ttt,sVn,217,256,0,1)}function Eq(){Eq=O,$tt=x8(Rtt,sVn,162,256,0,1)}function Tq(){Tq=O,Ktt=x8(_tt,sVn,184,256,0,1)}function Mq(){Mq=O,Mtt=x8(Stt,sVn,172,128,0,1)}function Sq(){eH(this,!1,!1,!1,!1)}function Pq(n){WX(),this.a=(SQ(),new Gb(yX(n)))}function Cq(n){for(yX(n);n.Ob();)n.Pb(),n.Qb()}function Iq(n){n.a.cd(),BB(n.a.dd(),14).gc(),wk()}function Oq(n){this.c=n,this.b=this.c.d.vc().Kc()}function Aq(n){this.c=n,this.a=new QT(this.c.a)}function $q(n){this.a=new XT(n.gc()),Frn(this,n)}function Lq(n){ew.call(this,new v4),Frn(this,n)}function Nq(n,t){return n.a+=Bdn(t,0,t.length),n}function xq(n,t){return l1(t,n.c.length),n.c[t]}function Dq(n,t){return l1(t,n.a.length),n.a[t]}function Rq(n,t){dM(),B8.call(this,n),this.a=t}function Kq(n,t){return jgn(rbn(jgn(n.a).a,t.a))}function _q(n,t){return kW(n),Ncn(n,(kW(t),t))}function Fq(n,t){return kW(t),Ncn(t,(kW(n),n))}function Bq(n,t){return $X(t,0,Hq(t[0],jgn(1)))}function Hq(n,t){return Kq(BB(n,162),BB(t,162))}function qq(n){return n.c-BB(xq(n.a,n.b),287).b}function Gq(n){return n.q?n.q:(SQ(),SQ(),het)}function zq(n){return n.e.Hd().gc()*n.c.Hd().gc()}function Uq(n,t,e){return E$(t.d[n.g],e.d[n.g])}function Xq(n,t,e){return E$(n.d[t.p],n.d[e.p])}function Wq(n,t,e){return E$(n.d[t.p],n.d[e.p])}function Vq(n,t,e){return E$(n.d[t.p],n.d[e.p])}function Qq(n,t,e){return E$(n.d[t.p],n.d[e.p])}function Yq(n,t,i){return e.Math.min(i/n,1/t)}function Jq(n,t){return n?0:e.Math.max(0,t-1)}function Zq(n,t){var e;for(e=0;e<t;++e)n[e]=-1}function nG(n){var t;return(t=uEn(n))?nG(t):n}function tG(n,t){return null==n.a&&wRn(n),n.a[t]}function eG(n){return n.c?n.c.f:n.e.b}function iG(n){return n.c?n.c.g:n.e.a}function rG(n){gtn.call(this,n.gc()),pX(this,n)}function cG(n,t){f$(),jp.call(this,t),this.a=n}function aG(n,t,e){this.a=n,$L.call(this,t,e,2)}function uG(n,t,e,i){_h(this),rH(this,n,t,e,i)}function oG(n,t){wWn(),Ap.call(this,n),this.a=t}function sG(n){this.b=new YT,this.a=n,this.c=-1}function hG(){this.d=new xC(0,0),this.e=new Rv}function fG(n){ZN.call(this,0,0),this.a=n,this.b=0}function lG(n){this.a=n,this.c=new xp,ron(this)}function bG(n){if(n.e.c!=n.b)throw Hp(new vv)}function wG(n){if(n.c.e!=n.a)throw Hp(new vv)}function dG(n){return JO(n)?0|n:TE(n)}function gG(n,t){return wWn(),new UU(n,t)}function pG(n,t){return null==n?null==t:mK(n,t)}function vG(n,t){return null==n?null==t:mgn(n,t)}function mG(n,t,e){return orn(n.a,t),EU(n,t.g,e)}function yG(n,t,e){ihn(0,t,n.length),z9(n,0,t,e)}function kG(n,t,e){LZ(t,n.c.length),MS(n.c,t,e)}function jG(n,t,e){var i;for(i=0;i<t;++i)n[i]=e}function EG(n,t){var e;return $on(e=nbn(n),t),e}function TG(n,t){return!n&&(n=[]),n[n.length]=t,n}function MG(n,t){return!(void 0===n.a.get(t))}function SG(n,t){return Xin(new nn,new uw(n),t)}function PG(n){return null==n?Set:new vy(kW(n))}function CG(n,t){return cL(t,22)&&SN(n,BB(t,22))}function IG(n,t){return cL(t,22)&&$tn(n,BB(t,22))}function OG(n){return H$n(n,26)*rYn+H$n(n,27)*cYn}function AG(n){return Array.isArray(n)&&n.im===I}function $G(n){n.b?$G(n.b):n.d.dc()&&n.f.c.Bc(n.e)}function LG(n,t){UR(n.c,t),n.b.c+=t.a,n.b.d+=t.b}function NG(n,t){LG(n,XR(new xC(t.a,t.b),n.c))}function xG(n,t){this.b=new YT,this.a=n,this.c=t}function DG(){this.b=new Ot,this.c=new lY(this)}function RG(){this.d=new mn,this.e=new fY(this)}function KG(){KZ(),this.f=new YT,this.e=new YT}function _G(){BZ(),this.k=new xp,this.d=new Rv}function FG(){FG=O,bOt=new XA((sWn(),aPt),0)}function BG(){BG=O,qnt=new fG(x8(Ant,HWn,1,0,5,1))}function HG(n,t,e){VAn(e,n,1),WB(t,new cP(e,n))}function qG(n,t,e){Fkn(e,n,1),WB(t,new bP(e,n))}function GG(n,t,e){return TU(n,new xS(t.a,e.a))}function zG(n,t,e){return-E$(n.f[t.p],n.f[e.p])}function UG(n,t,e){var i;n&&((i=n.i).c=t,i.b=e)}function XG(n,t,e){var i;n&&((i=n.i).d=t,i.a=e)}function WG(n,t,e){return n.a=-1,WN(n,t.g+1,e),n}function VG(n,t,e){return e=T_n(n,BB(t,49),7,e)}function QG(n,t,e){return e=T_n(n,BB(t,49),3,e)}function YG(n,t,e){this.a=n,LL.call(this,t,e,22)}function JG(n,t,e){this.a=n,LL.call(this,t,e,14)}function ZG(n,t,e,i){f$(),N0.call(this,n,t,e,i)}function nz(n,t,e,i){f$(),N0.call(this,n,t,e,i)}function tz(n,t){0!=(t.Bb&h6n)&&!n.a.o&&(n.a.o=t)}function ez(n){return null!=n&&DU(n)&&!(n.im===I)}function iz(n){return!Array.isArray(n)&&n.im===I}function rz(n){return cL(n,15)?BB(n,15).Yc():n.Kc()}function cz(n){return n.Qc(x8(Ant,HWn,1,n.gc(),5,1))}function az(n,t){return lgn(F7(n,t))?t.Qh():null}function uz(n){n?Fmn(n,($T(),Btt),""):$T()}function oz(n){this.a=(BG(),qnt),this.d=BB(yX(n),47)}function sz(n,t,e,i){this.a=n,W6.call(this,n,t,e,i)}function hz(n){eS(),this.a=0,this.b=n-1,this.c=1}function fz(n){V$(this),this.g=n,jQ(this),this._d()}function lz(n){return n.c?n.c:n.c=n.Id()}function bz(n){return n.d?n.d:n.d=n.Jd()}function wz(n){return n.c||(n.c=n.Dd())}function dz(n){return n.f||(n.f=n.Dc())}function gz(n){return n.i||(n.i=n.bc())}function pz(n){return wWn(),new vJ(10,n,0)}function vz(n){return JO(n)?""+n:GDn(n)}function mz(n){if(n.e.j!=n.d)throw Hp(new vv)}function yz(n,t){return uan(lSn(JO(n)?Pan(n):n,t))}function kz(n,t){return uan(jAn(JO(n)?Pan(n):n,t))}function jz(n,t){return uan(JSn(JO(n)?Pan(n):n,t))}function Ez(n,t){return bR((kW(n),n),(kW(t),t))}function Tz(n,t){return Pln((kW(n),n),(kW(t),t))}function Mz(n,t){return yX(t),n.a.Ad(t)&&!n.b.Ad(t)}function Sz(n,t){return M$(n.l&t.l,n.m&t.m,n.h&t.h)}function Pz(n,t){return M$(n.l|t.l,n.m|t.m,n.h|t.h)}function Cz(n,t){return M$(n.l^t.l,n.m^t.m,n.h^t.h)}function Iz(n,t){return $fn(n,(kW(t),new rw(t)))}function Oz(n,t){return $fn(n,(kW(t),new cw(t)))}function Az(n){return gcn(),0!=BB(n,11).e.c.length}function $z(n){return gcn(),0!=BB(n,11).g.c.length}function Lz(n,t){return Irn(),Pln(t.a.o.a,n.a.o.a)}function Nz(n,t,e){return TUn(n,BB(t,11),BB(e,11))}function xz(n){return n.e?D6(n.e):null}function Dz(n){n.d||(n.d=n.b.Kc(),n.c=n.b.gc())}function Rz(n,t,e){n.a.Mb(e)&&(n.b=!0,t.td(e))}function Kz(n,t){if(n<0||n>=t)throw Hp(new Sv)}function _z(n,t,e){return $X(t,0,Hq(t[0],e[0])),t}function Fz(n,t,e){t.Ye(e,Gy(MD(RX(n.b,e)))*n.a)}function Bz(n,t,e){return jDn(),Dcn(n,t)&&Dcn(n,e)}function Hz(n){return lIn(),!n.Hc(eIt)&&!n.Hc(rIt)}function qz(n){return new xC(n.c+n.b/2,n.d+n.a/2)}function Gz(n,t){return t.kh()?tfn(n.b,BB(t,49)):t}function zz(n,t){this.e=n,this.d=0!=(64&t)?t|hVn:t}function Uz(n,t){this.c=0,this.d=n,this.b=64|t|hVn}function Xz(n){this.b=new J6(11),this.a=(PQ(),n)}function Wz(n){this.b=null,this.a=(PQ(),n||wet)}function Vz(n){this.a=rvn(n.a),this.b=new t_(n.b)}function Qz(n){this.b=n,cx.call(this,n),ML(this)}function Yz(n){this.b=n,ux.call(this,n),SL(this)}function Jz(n,t,e){this.a=n,eK.call(this,t,e,5,6)}function Zz(n,t,e,i){this.b=n,$L.call(this,t,e,i)}function nU(n,t,e,i,r){k9.call(this,n,t,e,i,r,-1)}function tU(n,t,e,i,r){j9.call(this,n,t,e,i,r,-1)}function eU(n,t,e,i){$L.call(this,n,t,e),this.b=i}function iU(n,t,e,i){yH.call(this,n,t,e),this.b=i}function rU(n){NI.call(this,n,!1),this.a=!1}function cU(n,t){this.b=n,hl.call(this,n.b),this.a=t}function aU(n,t){WX(),jT.call(this,n,sfn(new Jy(t)))}function uU(n,t){return wWn(),new cW(n,t,0)}function oU(n,t){return wWn(),new cW(6,n,t)}function sU(n,t){return mK(n.substr(0,t.length),t)}function hU(n,t){return XI(t)?eY(n,t):!!AY(n.f,t)}function fU(n,t){for(kW(t);n.Ob();)t.td(n.Pb())}function lU(n,t,e){ODn(),this.e=n,this.d=t,this.a=e}function bU(n,t,e,i){var r;(r=n.i).i=t,r.a=e,r.b=i}function wU(n){var t;for(t=n;t.f;)t=t.f;return t}function dU(n){var t;return Px(null!=(t=Eon(n))),t}function gU(n){var t;return Px(null!=(t=mln(n))),t}function pU(n,t){var e;return w6(t,e=n.a.gc()),e-t}function vU(n,t){var e;for(e=0;e<t;++e)n[e]=!1}function mU(n,t,e,i){var r;for(r=t;r<e;++r)n[r]=i}function yU(n,t,e,i){ihn(t,e,n.length),mU(n,t,e,i)}function kU(n,t,e){Kz(e,n.a.c.length),c5(n.a,e,t)}function jU(n,t,e){this.c=n,this.a=t,SQ(),this.b=e}function EU(n,t,e){var i;return i=n.b[t],n.b[t]=e,i}function TU(n,t){return null==n.a.zc(t,n)}function MU(n){if(!n)throw Hp(new yv);return n.d}function SU(n,t){if(null==n)throw Hp(new Hy(t))}function PU(n,t){return!!t&&Frn(n,t)}function CU(n,t,e){return ehn(n,t.g,e),orn(n.c,t),n}function IU(n){return Mzn(n,(Ffn(),_Pt)),n.d=!0,n}function OU(n){return!n.j&&yb(n,FKn(n.g,n.b)),n.j}function AU(n){Mx(-1!=n.b),s6(n.c,n.a=n.b),n.b=-1}function $U(n){n.f=new eA(n),n.g=new iA(n),oY(n)}function LU(n){return new Rq(null,qU(n,n.length))}function NU(n){return new oz(new WL(n.a.length,n.a))}function xU(n){return M$(~n.l&SQn,~n.m&SQn,~n.h&PQn)}function DU(n){return typeof n===AWn||typeof n===xWn}function RU(n){return n==RQn?x7n:n==KQn?"-INF":""+n}function KU(n){return n==RQn?x7n:n==KQn?"-INF":""+n}function _U(n,t){return n>0?e.Math.log(n/t):-100}function FU(n,t){return Vhn(n,t)<0?-1:Vhn(n,t)>0?1:0}function BU(n,t,e){return SHn(n,BB(t,46),BB(e,167))}function HU(n,t){return BB(wz(lz(n.a)).Xb(t),42).cd()}function qU(n,t){return ptn(t,n.length),new BH(n,t)}function GU(n,t){this.d=n,AL.call(this,n),this.e=t}function zU(n){this.d=(kW(n),n),this.a=0,this.c=bVn}function UU(n,t){Ap.call(this,1),this.a=n,this.b=t}function XU(n,t){return n.c?XU(n.c,t):WB(n.b,t),n}function WU(n,t,e){var i;return i=dnn(n,t),r4(n,t,e),i}function VU(n,t){return m7(n.slice(0,t),n)}function QU(n,t,e){var i;for(i=0;i<t;++i)$X(n,i,e)}function YU(n,t,e,i,r){for(;t<e;)i[r++]=fV(n,t++)}function JU(n,t){return Pln(n.c.c+n.c.b,t.c.c+t.c.b)}function ZU(n,t){return null==Mon(n.a,t,(hN(),ptt))}function nX(n,t){r5(n.d,t,n.b.b,n.b),++n.a,n.c=null}function tX(n,t){J$(n,cL(t,153)?t:BB(t,1937).gl())}function eX(n,t){JT($V(n.Oc(),new Yr),new Id(t))}function iX(n,t,e,i,r){NEn(n,BB(h6(t.k,e),15),e,i,r)}function rX(n){n.s=NaN,n.c=NaN,ZOn(n,n.e),ZOn(n,n.j)}function cX(n){n.a=null,n.e=null,$U(n.b),n.d=0,++n.c}function aX(n){return e.Math.abs(n.d.e-n.e.e)-n.a}function uX(n,t,e){return BB(n.c._c(t,BB(e,133)),42)}function oX(){return ry(),Pun(Gk(Wnt,1),$Vn,538,0,[znt])}function sX(n){return MQ(),JJ(PMn(n))==JJ(OMn(n))}function hX(n){$R.call(this),this.a=n,WB(n.a,this)}function fX(n,t){this.d=Sln(n),this.c=t,this.a=.5*t}function lX(){v4.call(this),this.a=!0,this.b=!0}function bX(n){return(null==n.i&&qFn(n),n.i).length}function wX(n){return cL(n,99)&&0!=(BB(n,18).Bb&h6n)}function dX(n,t){++n.j,sTn(n,n.i,t),zIn(n,BB(t,332))}function gX(n,t){return t=n.nk(null,t),$Tn(n,null,t)}function pX(n,t){return n.hi()&&(t=nZ(n,t)),n.Wh(t)}function vX(n,t,e){var i;return Qen(e,i=mX(n,t)),i}function mX(n,t){var e;return(e=new pon).j=n,e.d=t,e}function yX(n){if(null==n)throw Hp(new gv);return n}function kX(n){return n.j||(n.j=new wl(n))}function jX(n){return n.f||(n.f=new UL(n))}function EX(n){return n.k||(n.k=new Yf(n))}function TX(n){return n.k||(n.k=new Yf(n))}function MX(n){return n.g||(n.g=new Qf(n))}function SX(n){return n.i||(n.i=new nl(n))}function PX(n){return n.d||(n.d=new il(n))}function CX(n){return yX(n),cL(n,475)?BB(n,475):Bbn(n)}function IX(n){return cL(n,607)?n:new bJ(n)}function OX(n,t){return w2(t,n.c.b.c.gc()),new sT(n,t)}function AX(n,t,e){return wWn(),new T0(n,t,e)}function $X(n,t,e){return Sx(null==e||Q_n(n,e)),n[t]=e}function LX(n,t){var e;return w2(t,e=n.a.gc()),e-1-t}function NX(n,t){return n.a+=String.fromCharCode(t),n}function xX(n,t){return n.a+=String.fromCharCode(t),n}function DX(n,t){for(kW(t);n.c<n.d;)n.ze(t,n.c++)}function RX(n,t){return XI(t)?SJ(n,t):qI(AY(n.f,t))}function KX(n,t){return MQ(),n==PMn(t)?OMn(t):PMn(t)}function _X(n,t){nW(n,new GX(null!=t.f?t.f:""+t.g))}function FX(n,t){nW(n,new GX(null!=t.f?t.f:""+t.g))}function BX(n){this.b=new Np,this.a=new Np,this.c=n}function HX(n){this.c=new Gj,this.a=new Np,this.b=n}function qX(n){$R.call(this),this.a=new Gj,this.c=n}function GX(n){if(null==n)throw Hp(new gv);this.a=n}function zX(n){Mv(),this.b=new Np,this.a=n,vGn(this,n)}function UX(n){this.c=n,this.a=new YT,this.b=new YT}function XX(){XX=O,ott=new Ml(!1),stt=new Ml(!0)}function WX(){WX=O,s_(),Fnt=new SY((SQ(),SQ(),set))}function VX(){VX=O,s_(),Vnt=new vS((SQ(),SQ(),fet))}function QX(){QX=O,t$t=GIn(),gWn(),i$t&&Rkn()}function YX(n,t){return Irn(),BB(oV(n,t.d),15).Fc(t)}function JX(n,t,e,i){return 0==e||(e-i)/e<n.e||t>=n.g}function ZX(n,t,e){return NRn(n,yrn(n,t,e))}function nW(n,t){var e;dnn(n,e=n.a.length),r4(n,e,t)}function tW(n,t){console[n].call(console,t)}function eW(n,t){var e;++n.j,e=n.Vi(),n.Ii(n.oi(e,t))}function iW(n,t,e){BB(t.b,65),Otn(t.a,new EB(n,e,t))}function rW(n,t,e){jp.call(this,t),this.a=n,this.b=e}function cW(n,t,e){Ap.call(this,n),this.a=t,this.b=e}function aW(n,t,e){this.a=n,kp.call(this,t),this.b=e}function uW(n,t,e){this.a=n,H2.call(this,8,t,null,e)}function oW(n){this.a=(kW(_9n),_9n),this.b=n,new Nm}function sW(n){this.c=n,this.b=this.c.a,this.a=this.c.e}function hW(n){this.c=n,this.b=n.a.d.a,bD(n.a.e,this)}function fW(n){Mx(-1!=n.c),n.d.$c(n.c),n.b=n.c,n.c=-1}function lW(n){return e.Math.sqrt(n.a*n.a+n.b*n.b)}function bW(n,t){return Kz(t,n.a.c.length),xq(n.a,t)}function wW(n,t){return GI(n)===GI(t)||null!=n&&Nfn(n,t)}function dW(n){return 0>=n?new VT:Win(n-1)}function gW(n){return!!SNt&&eY(SNt,n)}function pW(n){return n?n.dc():!n.Kc().Ob()}function vW(n){return!n.a&&n.c?n.c.b:n.a}function mW(n){return!n.a&&(n.a=new $L(LOt,n,4)),n.a}function yW(n){return!n.d&&(n.d=new $L(VAt,n,1)),n.d}function kW(n){if(null==n)throw Hp(new gv);return n}function jW(n){n.c?n.c.He():(n.d=!0,QNn(n))}function EW(n){n.c?EW(n.c):(Qln(n),n.d=!0)}function TW(n){TV(n.a),n.b=x8(Ant,HWn,1,n.b.length,5,1)}function MW(n,t){return E$(t.j.c.length,n.j.c.length)}function SW(n,t){n.c<0||n.b.b<n.c?fO(n.b,t):n.a._e(t)}function PW(n,t){var e;(e=n.Yg(t))>=0?n.Bh(e):cIn(n,t)}function CW(n){return n.c.i.c==n.d.i.c}function IW(n){if(4!=n.p)throw Hp(new dv);return n.e}function OW(n){if(3!=n.p)throw Hp(new dv);return n.e}function AW(n){if(6!=n.p)throw Hp(new dv);return n.f}function $W(n){if(6!=n.p)throw Hp(new dv);return n.k}function LW(n){if(3!=n.p)throw Hp(new dv);return n.j}function NW(n){if(4!=n.p)throw Hp(new dv);return n.j}function xW(n){return!n.b&&(n.b=new Tp(new xm)),n.b}function DW(n){return-2==n.c&&gb(n,uMn(n.g,n.b)),n.c}function RW(n,t){var e;return(e=mX("",n)).n=t,e.i=1,e}function KW(n,t){LG(BB(t.b,65),n),Otn(t.a,new Aw(n))}function _W(n,t){f9((!n.a&&(n.a=new oR(n,n)),n.a),t)}function FW(n,t){this.b=n,GU.call(this,n,t),ML(this)}function BW(n,t){this.b=n,RK.call(this,n,t),SL(this)}function HW(n,t,e,i){vT.call(this,n,t),this.d=e,this.a=i}function qW(n,t,e,i){vT.call(this,n,e),this.a=t,this.f=i}function GW(n,t){W$.call(this,Vin(yX(n),yX(t))),this.a=t}function zW(){dMn.call(this,S7n,(rE(),dLt)),Wqn(this)}function UW(){dMn.call(this,V9n,(iE(),n$t)),OHn(this)}function XW(){gT.call(this,"DELAUNAY_TRIANGULATION",0)}function WW(n){return String.fromCharCode.apply(null,n)}function VW(n,t,e){return XI(t)?mZ(n,t,e):jCn(n.f,t,e)}function QW(n){return SQ(),n?n.ve():(PQ(),PQ(),get)}function YW(n,t,e){return Nun(),e.pg(n,BB(t.cd(),146))}function JW(n,t){return nq(),new svn(new rN(n),new iN(t))}function ZW(n){return lin(n,NVn),ttn(rbn(rbn(5,n),n/10|0))}function nV(){nV=O,Bnt=new hy(Pun(Gk(Hnt,1),kVn,42,0,[]))}function tV(n){return!n.d&&(n.d=new Hb(n.c.Cc())),n.d}function eV(n){return!n.a&&(n.a=new Lk(n.c.vc())),n.a}function iV(n){return!n.b&&(n.b=new Ak(n.c.ec())),n.b}function rV(n,t){for(;t-- >0;)n=n<<1|(n<0?1:0);return n}function cV(n,t){return GI(n)===GI(t)||null!=n&&Nfn(n,t)}function aV(n,t){return hN(),BB(t.b,19).a<n}function uV(n,t){return hN(),BB(t.a,19).a<n}function oV(n,t){return CG(n.a,t)?n.b[BB(t,22).g]:null}function sV(n,t,e,i){n.a=fx(n.a,0,t)+""+i+nO(n.a,e)}function hV(n,t){n.u.Hc((lIn(),eIt))&&PIn(n,t),z6(n,t)}function fV(n,t){return b1(t,n.length),n.charCodeAt(t)}function lV(){dy.call(this,"There is no more element.")}function bV(n){this.d=n,this.a=this.d.b,this.b=this.d.c}function wV(n){n.b=!1,n.c=!1,n.d=!1,n.a=!1}function dV(n,t,e,i){return Rcn(n,t,e,!1),Zfn(n,i),n}function gV(n){return n.j.c=x8(Ant,HWn,1,0,5,1),n.a=-1,n}function pV(n){return!n.c&&(n.c=new hK(KOt,n,5,8)),n.c}function vV(n){return!n.b&&(n.b=new hK(KOt,n,4,7)),n.b}function mV(n){return!n.n&&(n.n=new eU(zOt,n,1,7)),n.n}function yV(n){return!n.c&&(n.c=new eU(XOt,n,9,9)),n.c}function kV(n){return n.e==C7n&&vb(n,Tgn(n.g,n.b)),n.e}function jV(n){return n.f==C7n&&mb(n,pkn(n.g,n.b)),n.f}function EV(n){var t;return!(t=n.b)&&(n.b=t=new Jf(n)),t}function TV(n){var t;for(t=n.Kc();t.Ob();)t.Pb(),t.Qb()}function MV(n){if(zbn(n.d),n.d.d!=n.c)throw Hp(new vv)}function SV(n,t){this.b=n,this.c=t,this.a=new QT(this.b)}function PV(n,t,e){this.a=XVn,this.d=n,this.b=t,this.c=e}function CV(n,t){this.d=(kW(n),n),this.a=16449,this.c=t}function IV(n,t){Jln(n,Gy(Ren(t,"x")),Gy(Ren(t,"y")))}function OV(n,t){Jln(n,Gy(Ren(t,"x")),Gy(Ren(t,"y")))}function AV(n,t){return Qln(n),new Rq(n,new Q9(t,n.a))}function $V(n,t){return Qln(n),new Rq(n,new M6(t,n.a))}function LV(n,t){return Qln(n),new AD(n,new E6(t,n.a))}function NV(n,t){return Qln(n),new $D(n,new T6(t,n.a))}function xV(n,t){return new pY(BB(yX(n),62),BB(yX(t),62))}function DV(n,t){return jM(),Pln((kW(n),n),(kW(t),t))}function RV(){return wM(),Pun(Gk(Pct,1),$Vn,481,0,[rct])}function KV(){return CM(),Pun(Gk(YEt,1),$Vn,482,0,[XEt])}function _V(){return IM(),Pun(Gk(tTt,1),$Vn,551,0,[QEt])}function FV(){return OM(),Pun(Gk(VTt,1),$Vn,530,0,[GTt])}function BV(n){this.a=new Np,this.e=x8(ANt,sVn,48,n,0,2)}function HV(n,t,e,i){this.a=n,this.e=t,this.d=e,this.c=i}function qV(n,t,e,i){this.a=n,this.c=t,this.b=e,this.d=i}function GV(n,t,e,i){this.c=n,this.b=t,this.a=e,this.d=i}function zV(n,t,e,i){this.c=n,this.b=t,this.d=e,this.a=i}function UV(n,t,e,i){this.c=n,this.d=t,this.b=e,this.a=i}function XV(n,t,e,i){this.a=n,this.d=t,this.c=e,this.b=i}function WV(n,t,e,i){gT.call(this,n,t),this.a=e,this.b=i}function VV(n,t,e,i){this.a=n,this.c=t,this.d=e,this.b=i}function QV(n,t,e){EHn(n.a,e),nun(e),AAn(n.b,e),rqn(t,e)}function YV(n,t,e){var i;return i=$Un(n),t.Kh(e,i)}function JV(n,t){var e,i;return(e=n/t)>(i=CJ(e))&&++i,i}function ZV(n){var t;return cen(t=new Kp,n),t}function nQ(n){var t;return DMn(t=new Kp,n),t}function tQ(n,t){return Kcn(t,RX(n.f,t)),null}function eQ(n){return Yin(n)||null}function iQ(n){return!n.b&&(n.b=new eU(_Ot,n,12,3)),n.b}function rQ(n){return null!=n&&xT(jAt,n.toLowerCase())}function cQ(n,t){return Pln(iG(n)*eG(n),iG(t)*eG(t))}function aQ(n,t){return Pln(iG(n)*eG(n),iG(t)*eG(t))}function uQ(n,t){return Pln(n.d.c+n.d.b/2,t.d.c+t.d.b/2)}function oQ(n,t){return Pln(n.g.c+n.g.b/2,t.g.c+t.g.b/2)}function sQ(n,t,e){e.a?Cen(n,t.b-n.f/2):Pen(n,t.a-n.g/2)}function hQ(n,t,e,i){this.a=n,this.b=t,this.c=e,this.d=i}function fQ(n,t,e,i){this.a=n,this.b=t,this.c=e,this.d=i}function lQ(n,t,e,i){this.e=n,this.a=t,this.c=e,this.d=i}function bQ(n,t,e,i){this.a=n,this.c=t,this.d=e,this.b=i}function wQ(n,t,e,i){f$(),e6.call(this,t,e,i),this.a=n}function dQ(n,t,e,i){f$(),e6.call(this,t,e,i),this.a=n}function gQ(n,t){this.a=n,OD.call(this,n,BB(n.d,15).Zc(t))}function pQ(n){this.f=n,this.c=this.f.e,n.f>0&&ujn(this)}function vQ(n,t,e,i){this.b=n,this.c=i,vO.call(this,t,e)}function mQ(n){return Px(n.b<n.d.gc()),n.d.Xb(n.c=n.b++)}function yQ(n){n.a.a=n.c,n.c.b=n.a,n.a.b=n.c.a=null,n.b=0}function kQ(n,t){return n.b=t.b,n.c=t.c,n.d=t.d,n.a=t.a,n}function jQ(n){return n.n&&(n.e!==FVn&&n._d(),n.j=null),n}function EQ(n){return JH(null==n||DU(n)&&!(n.im===I)),n}function TQ(n){this.b=new Np,gun(this.b,this.b),this.a=n}function MQ(){MQ=O,Sct=new Np,Mct=new xp,Tct=new Np}function SQ(){SQ=O,set=new S,het=new C,fet=new M}function PQ(){PQ=O,wet=new R,det=new R,get=new K}function CQ(){CQ=O,hit=new gn,lit=new RG,fit=new pn}function IQ(){256==ait&&(iit=rit,rit=new r,ait=0),++ait}function OQ(n){return n.f||(n.f=new pT(n,n.c))}function AQ(n){return QIn(n)&&qy(TD(ZAn(n,(HXn(),dgt))))}function $Q(n,t){return JIn(n,BB(mMn(t,(HXn(),Wgt)),19),t)}function LQ(n,t){return Tfn(n.j,t.s,t.c)+Tfn(t.e,n.s,n.c)}function NQ(n,t){n.e&&!n.e.a&&(Fp(n.e,t),NQ(n.e,t))}function xQ(n,t){n.d&&!n.d.a&&(Fp(n.d,t),xQ(n.d,t))}function DQ(n,t){return-Pln(iG(n)*eG(n),iG(t)*eG(t))}function RQ(n){return BB(n.cd(),146).tg()+":"+Bbn(n.dd())}function KQ(n){var t;G_(),(t=BB(n.g,10)).n.a=n.d.c+t.d.b}function _Q(n,t,e){return MM(),xbn(BB(RX(n.e,t),522),e)}function FQ(n,t){return tsn(n),tsn(t),Py(BB(n,22),BB(t,22))}function BQ(n,t,e){n.i=0,n.e=0,t!=e&&Xon(n,t,e)}function HQ(n,t,e){n.i=0,n.e=0,t!=e&&Won(n,t,e)}function qQ(n,t,e){rtn(n,t,new Sl(XK(e)))}function GQ(n,t,e,i,r,c){j9.call(this,n,t,e,i,r,c?-2:-1)}function zQ(n,t,e,i){LI.call(this,t,e),this.b=n,this.a=i}function UQ(n,t){new YT,this.a=new km,this.b=n,this.c=t}function XQ(n,t){return BB(mMn(n,(hWn(),clt)),15).Fc(t),t}function WQ(n,t){if(null==n)throw Hp(new Hy(t));return n}function VQ(n){return!n.q&&(n.q=new eU(QAt,n,11,10)),n.q}function QQ(n){return!n.s&&(n.s=new eU(FAt,n,21,17)),n.s}function YQ(n){return!n.a&&(n.a=new eU(UOt,n,10,11)),n.a}function JQ(n){return cL(n,14)?new $q(BB(n,14)):qB(n.Kc())}function ZQ(n){return new qL(n,n.e.Hd().gc()*n.c.Hd().gc())}function nY(n){return new GL(n,n.e.Hd().gc()*n.c.Hd().gc())}function tY(n){return n&&n.hashCode?n.hashCode():PN(n)}function eY(n,t){return null==t?!!AY(n.f,null):MG(n.g,t)}function iY(n){return yX(n),emn(new oz(ZL(n.a.Kc(),new h)))}function rY(n){return SQ(),cL(n,54)?new $k(n):new bN(n)}function cY(n,t,e){return!!n.f&&n.f.Ne(t,e)}function aY(n,t){return n.a=fx(n.a,0,t)+""+nO(n.a,t+1),n}function uY(n,t){var e;return(e=eL(n.a,t))&&(t.d=null),e}function oY(n){var t,e;t=0|(e=n).$modCount,e.$modCount=t+1}function sY(n){this.b=n,this.c=n,n.e=null,n.c=null,this.a=1}function hY(n){this.b=n,this.a=new dE(BB(yX(new tt),62))}function fY(n){this.c=n,this.b=new dE(BB(yX(new vn),62))}function lY(n){this.c=n,this.b=new dE(BB(yX(new It),62))}function bY(){this.a=new Qv,this.b=new hm,this.d=new Dt}function wY(){this.a=new km,this.b=(lin(3,AVn),new J6(3))}function dY(){this.b=new Rv,this.d=new YT,this.e=new om}function gY(n){this.c=n.c,this.d=n.d,this.b=n.b,this.a=n.a}function pY(n,t){zm.call(this,new Wz(n)),this.a=n,this.b=t}function vY(){iSn(this,new Rf),this.wb=(QX(),t$t),iE()}function mY(n){OTn(n,"No crossing minimization",1),HSn(n)}function yY(n){Dk(),e.setTimeout((function(){throw n}),0)}function kY(n){return n.u||(P5(n),n.u=new uR(n,n)),n.u}function jY(n){return BB(yan(n,16),26)||n.zh()}function EY(n,t){return cL(t,146)&&mK(n.b,BB(t,146).tg())}function TY(n,t){return n.a?t.Wg().Kc():BB(t.Wg(),69).Zh()}function MY(n){return n.k==(uSn(),Cut)&&Lx(n,(hWn(),zft))}function SY(n){this.a=(SQ(),cL(n,54)?new $k(n):new bN(n))}function PY(){var n,t;PY=O,t=!Ddn(),n=new d,ett=t?new E:n}function CY(n,t){var e;return e=nE(n.gm),null==t?e:e+": "+t}function IY(n,t){var e;return j4(e=n.b.Qc(t),n.b.gc()),e}function OY(n,t){if(null==n)throw Hp(new Hy(t));return n}function AY(n,t){return hhn(n,t,pZ(n,null==t?0:n.b.se(t)))}function $Y(n,t,e){return e>=0&&mK(n.substr(e,t.length),t)}function LY(n,t,e,i,r,c,a){return new b4(n.e,t,e,i,r,c,a)}function NY(n,t,e,i,r,c){this.a=n,kin.call(this,t,e,i,r,c)}function xY(n,t,e,i,r,c){this.a=n,kin.call(this,t,e,i,r,c)}function DY(n,t){this.g=n,this.d=Pun(Gk(Out,1),a1n,10,0,[t])}function RY(n,t){this.e=n,this.a=Ant,this.b=ARn(t),this.c=t}function KY(n,t){NR.call(this),xtn(this),this.a=n,this.c=t}function _Y(n,t,e,i){$X(n.c[t.g],e.g,i),$X(n.c[e.g],t.g,i)}function FY(n,t,e,i){$X(n.c[t.g],t.g,e),$X(n.b[t.g],t.g,i)}function BY(){return A6(),Pun(Gk(cmt,1),$Vn,376,0,[Zvt,Jvt])}function HY(){return g7(),Pun(Gk(Zht,1),$Vn,479,0,[Ght,qht])}function qY(){return _nn(),Pun(Gk(Lht,1),$Vn,419,0,[Sht,Pht])}function GY(){return V8(),Pun(Gk(lht,1),$Vn,422,0,[cht,aht])}function zY(){return z2(),Pun(Gk(Glt,1),$Vn,420,0,[Aft,$ft])}function UY(){return U7(),Pun(Gk(zvt,1),$Vn,421,0,[Kvt,_vt])}function XY(){return Q4(),Pun(Gk(Vmt,1),$Vn,523,0,[Hmt,Bmt])}function WY(){return O6(),Pun(Gk(xyt,1),$Vn,520,0,[Myt,Tyt])}function VY(){return gJ(),Pun(Gk(ayt,1),$Vn,516,0,[tyt,nyt])}function QY(){return oZ(),Pun(Gk(Syt,1),$Vn,515,0,[ryt,cyt])}function YY(){return dJ(),Pun(Gk(Byt,1),$Vn,455,0,[Lyt,Nyt])}function JY(){return B0(),Pun(Gk(Jkt,1),$Vn,425,0,[Hkt,Bkt])}function ZY(){return sZ(),Pun(Gk(qkt,1),$Vn,480,0,[Rkt,Kkt])}function nJ(){return Prn(),Pun(Gk(ijt,1),$Vn,495,0,[Qkt,Ykt])}function tJ(){return D9(),Pun(Gk(ljt,1),$Vn,426,0,[cjt,ajt])}function eJ(){return Lun(),Pun(Gk(YTt,1),$Vn,429,0,[WTt,XTt])}function iJ(){return $6(),Pun(Gk(oTt,1),$Vn,430,0,[nTt,ZEt])}function rJ(){return hpn(),Pun(Gk(yit,1),$Vn,428,0,[dit,wit])}function cJ(){return Rnn(),Pun(Gk(Kit,1),$Vn,427,0,[vit,mit])}function aJ(){return Knn(),Pun(Gk($at,1),$Vn,424,0,[Dct,Rct])}function uJ(){return Srn(),Pun(Gk(Wut,1),$Vn,511,0,[qut,Hut])}function oJ(n,t,e,i){return e>=0?n.jh(t,e,i):n.Sg(null,e,i)}function sJ(n){return 0==n.b.b?n.a.$e():dH(n.b)}function hJ(n){if(5!=n.p)throw Hp(new dv);return dG(n.f)}function fJ(n){if(5!=n.p)throw Hp(new dv);return dG(n.k)}function lJ(n){return GI(n.a)===GI((wcn(),I$t))&&Rqn(n),n.a}function bJ(n){this.a=BB(yX(n),271),this.b=(SQ(),new dN(n))}function wJ(n,t){Zl(this,new xC(n.a,n.b)),nb(this,zB(t))}function dJ(){dJ=O,Lyt=new oC(cJn,0),Nyt=new oC(aJn,1)}function gJ(){gJ=O,tyt=new cC(aJn,0),nyt=new cC(cJn,1)}function pJ(){ay.call(this,new XT(etn(12))),aN(!0),this.a=2}function vJ(n,t,e){wWn(),Ap.call(this,n),this.b=t,this.a=e}function mJ(n,t,e){f$(),jp.call(this,t),this.a=n,this.b=e}function yJ(n){NR.call(this),xtn(this),this.a=n,this.c=!0}function kJ(n){var t;t=n.c.d.b,n.b=t,n.a=n.c.d,t.a=n.c.d.b=n}function jJ(n){pin(n.a),RA(n.a),twn(new Pw(n.a))}function EJ(n,t){oRn(n,!0),Otn(n.e.wf(),new $_(n,!0,t))}function TJ(n,t){return c4(t),Yen(n,x8(ANt,hQn,25,t,15,1),t)}function MJ(n,t){return MQ(),n==JJ(PMn(t))||n==JJ(OMn(t))}function SJ(n,t){return null==t?qI(AY(n.f,null)):hS(n.g,t)}function PJ(n){return 0==n.b?null:(Px(0!=n.b),Atn(n,n.a.a))}function CJ(n){return 0|Math.max(Math.min(n,DWn),-2147483648)}function IJ(n,t){var e=Znt[n.charCodeAt(0)];return null==e?n:e}function OJ(n,t){return WQ(n,"set1"),WQ(t,"set2"),new ET(n,t)}function AJ(n,t){return UR(qx(nen(n.f,t)),n.f.d)}function $J(n,t){var e;return YGn(n,t,e=new q),e.d}function LJ(n,t,e,i){var r;r=new FR,t.a[e.g]=r,mG(n.b,i,r)}function NJ(n,t,e){var i;(i=n.Yg(t))>=0?n.sh(i,e):TLn(n,t,e)}function xJ(n,t,e){hZ(),n&&VW(fAt,n,t),n&&VW(hAt,n,e)}function DJ(n,t,e){this.i=new Np,this.b=n,this.g=t,this.a=e}function RJ(n,t,e){this.c=new Np,this.e=n,this.f=t,this.b=e}function KJ(n,t,e){this.a=new Np,this.e=n,this.f=t,this.c=e}function _J(n,t){V$(this),this.f=t,this.g=n,jQ(this),this._d()}function FJ(n,t){var e;e=n.q.getHours(),n.q.setDate(t),lBn(n,e)}function BJ(n,t){var e;for(yX(t),e=n.a;e;e=e.c)t.Od(e.g,e.i)}function HJ(n){var t;return $on(t=new bE(etn(n.length)),n),t}function qJ(n){function t(){}return t.prototype=n||{},new t}function GJ(n,t){return!!wun(n,t)&&(ein(n),!0)}function zJ(n,t){if(null==t)throw Hp(new gv);return ugn(n,t)}function UJ(n){if(n.qe())return null;var t=n.n;return SWn[t]}function XJ(n){return n.Db>>16!=3?null:BB(n.Cb,33)}function WJ(n){return n.Db>>16!=9?null:BB(n.Cb,33)}function VJ(n){return n.Db>>16!=6?null:BB(n.Cb,79)}function QJ(n){return n.Db>>16!=7?null:BB(n.Cb,235)}function YJ(n){return n.Db>>16!=7?null:BB(n.Cb,160)}function JJ(n){return n.Db>>16!=11?null:BB(n.Cb,33)}function ZJ(n,t){var e;return(e=n.Yg(t))>=0?n.lh(e):qIn(n,t)}function nZ(n,t){var e;return oMn(e=new Lq(t),n),new t_(e)}function tZ(n){var t;return t=n.d,t=n.si(n.f),f9(n,t),t.Ob()}function eZ(n,t){return n.b+=t.b,n.c+=t.c,n.d+=t.d,n.a+=t.a,n}function iZ(n,t){return e.Math.abs(n)<e.Math.abs(t)?n:t}function rZ(n){return!n.a&&(n.a=new eU(UOt,n,10,11)),n.a.i>0}function cZ(){this.a=new fA,this.e=new Rv,this.g=0,this.i=0}function aZ(n){this.a=n,this.b=x8(_mt,sVn,1944,n.e.length,0,2)}function uZ(n,t,e){var i;i=Non(n,t,e),n.b=new mrn(i.c.length)}function oZ(){oZ=O,ryt=new rC(pJn,0),cyt=new rC("UP",1)}function sZ(){sZ=O,Rkt=new bC(U3n,0),Kkt=new bC("FAN",1)}function hZ(){hZ=O,fAt=new xp,hAt=new xp,FI(yet,new wo)}function fZ(n){if(0!=n.p)throw Hp(new dv);return JI(n.f,0)}function lZ(n){if(0!=n.p)throw Hp(new dv);return JI(n.k,0)}function bZ(n){return n.Db>>16!=3?null:BB(n.Cb,147)}function wZ(n){return n.Db>>16!=6?null:BB(n.Cb,235)}function dZ(n){return n.Db>>16!=17?null:BB(n.Cb,26)}function gZ(n,t){var e=n.a=n.a||[];return e[t]||(e[t]=n.le(t))}function pZ(n,t){var e;return null==(e=n.a.get(t))?new Array:e}function vZ(n,t){var e;e=n.q.getHours(),n.q.setMonth(t),lBn(n,e)}function mZ(n,t,e){return null==t?jCn(n.f,null,e):ubn(n.g,t,e)}function yZ(n,t,e,i,r,c){return new N7(n.e,t,n.aj(),e,i,r,c)}function kZ(n,t,e){return n.a=fx(n.a,0,t)+""+e+nO(n.a,t),n}function jZ(n,t,e){return WB(n.a,(nV(),zvn(t,e),new vT(t,e))),n}function EZ(n){return oN(n.c),n.e=n.a=n.c,n.c=n.c.c,++n.d,n.a.f}function TZ(n){return oN(n.e),n.c=n.a=n.e,n.e=n.e.e,--n.d,n.a.f}function MZ(n,t){n.d&&y7(n.d.e,n),n.d=t,n.d&&WB(n.d.e,n)}function SZ(n,t){n.c&&y7(n.c.g,n),n.c=t,n.c&&WB(n.c.g,n)}function PZ(n,t){n.c&&y7(n.c.a,n),n.c=t,n.c&&WB(n.c.a,n)}function CZ(n,t){n.i&&y7(n.i.j,n),n.i=t,n.i&&WB(n.i.j,n)}function IZ(n,t,e){this.a=t,this.c=n,this.b=(yX(e),new t_(e))}function OZ(n,t,e){this.a=t,this.c=n,this.b=(yX(e),new t_(e))}function AZ(n,t){this.a=n,this.c=B$(this.a),this.b=new gY(t)}function $Z(n){return Qln(n),AV(n,new vw(new Rv))}function LZ(n,t){if(n<0||n>t)throw Hp(new Ay(jYn+n+EYn+t))}function NZ(n,t){return IG(n.a,t)?EU(n,BB(t,22).g,null):null}function xZ(n){return Shn(),hN(),0!=BB(n.a,81).d.e}function DZ(){DZ=O,Xnt=lhn((ry(),Pun(Gk(Wnt,1),$Vn,538,0,[znt])))}function RZ(){RZ=O,pmt=WG(new B2,(yMn(),Bat),(lWn(),qot))}function KZ(){KZ=O,vmt=WG(new B2,(yMn(),Bat),(lWn(),qot))}function _Z(){_Z=O,ymt=WG(new B2,(yMn(),Bat),(lWn(),qot))}function FZ(){FZ=O,zmt=dq(new B2,(yMn(),Bat),(lWn(),dot))}function BZ(){BZ=O,Qmt=dq(new B2,(yMn(),Bat),(lWn(),dot))}function HZ(){HZ=O,Zmt=dq(new B2,(yMn(),Bat),(lWn(),dot))}function qZ(){qZ=O,oyt=dq(new B2,(yMn(),Bat),(lWn(),dot))}function GZ(){GZ=O,zkt=WG(new B2,(zyn(),Fyt),(DPn(),zyt))}function zZ(n,t,e,i){this.c=n,this.d=i,WZ(this,t),VZ(this,e)}function UZ(n){this.c=new YT,this.b=n.b,this.d=n.c,this.a=n.a}function XZ(n){this.a=e.Math.cos(n),this.b=e.Math.sin(n)}function WZ(n,t){n.a&&y7(n.a.k,n),n.a=t,n.a&&WB(n.a.k,n)}function VZ(n,t){n.b&&y7(n.b.f,n),n.b=t,n.b&&WB(n.b.f,n)}function QZ(n,t){iW(n,n.b,n.c),BB(n.b.b,65),t&&BB(t.b,65).b}function YZ(n,t){zln(n,t),cL(n.Cb,88)&&ACn(P5(BB(n.Cb,88)),2)}function JZ(n,t){cL(n.Cb,88)&&ACn(P5(BB(n.Cb,88)),4),Nrn(n,t)}function ZZ(n,t){cL(n.Cb,179)&&(BB(n.Cb,179).tb=null),Nrn(n,t)}function n1(n,t){return ZM(),hnn(t)?new lq(t,n):new xI(t,n)}function t1(n,t){null!=t.c&&nW(n,new GX(t.c))}function e1(n){var t;return iE(),cen(t=new Kp,n),t}function i1(n){var t;return iE(),cen(t=new Kp,n),t}function r1(n,t){var e;return e=new HX(n),t.c[t.c.length]=e,e}function c1(n,t){var e;return(e=BB(lfn(OQ(n.a),t),14))?e.gc():0}function a1(n){return Qln(n),PQ(),PQ(),ytn(n,det)}function u1(n){for(var t;;)if(t=n.Pb(),!n.Ob())return t}function o1(n,t){Um.call(this,new XT(etn(n))),lin(t,oVn),this.a=t}function s1(n,t,e){Hfn(t,e,n.gc()),this.c=n,this.a=t,this.b=e-t}function h1(n,t,e){var i;Hfn(t,e,n.c.length),i=e-t,PE(n.c,t,i)}function f1(n,t){hL(n,dG(e0(kz(t,24),sYn)),dG(e0(t,sYn)))}function l1(n,t){if(n<0||n>=t)throw Hp(new Ay(jYn+n+EYn+t))}function b1(n,t){if(n<0||n>=t)throw Hp(new Ok(jYn+n+EYn+t))}function w1(n,t){this.b=(kW(n),n),this.a=0==(t&_Qn)?64|t|hVn:t}function d1(n){DA(this),Pv(this.a,kon(e.Math.max(8,n))<<1)}function g1(n){return Aon(Pun(Gk(PMt,1),sVn,8,0,[n.i.n,n.n,n.a]))}function p1(){return qsn(),Pun(Gk(nit,1),$Vn,132,0,[zet,Uet,Xet])}function v1(){return Dtn(),Pun(Gk(Vit,1),$Vn,232,0,[Git,zit,Uit])}function m1(){return J9(),Pun(Gk(ert,1),$Vn,461,0,[Yit,Qit,Jit])}function y1(){return G7(),Pun(Gk(Ort,1),$Vn,462,0,[crt,rrt,irt])}function k1(){return Bfn(),Pun(Gk(mut,1),$Vn,423,0,[wut,but,lut])}function j1(){return q7(),Pun(Gk(Hat,1),$Vn,379,0,[Oat,Iat,Aat])}function E1(){return Mhn(),Pun(Gk(wvt,1),$Vn,378,0,[cvt,avt,uvt])}function T1(){return Oin(),Pun(Gk(pht,1),$Vn,314,0,[hht,sht,fht])}function M1(){return uin(),Pun(Gk(Tht,1),$Vn,337,0,[wht,ght,dht])}function S1(){return Jun(),Pun(Gk(Bht,1),$Vn,450,0,[Aht,Oht,$ht])}function P1(){return Crn(),Pun(Gk(Wst,1),$Vn,361,0,[Rst,Dst,xst])}function C1(){return z7(),Pun(Gk(Lft,1),$Vn,303,0,[Pft,Cft,Sft])}function I1(){return Kan(),Pun(Gk(Ift,1),$Vn,292,0,[jft,Eft,kft])}function O1(){return ain(),Pun(Gk(Qvt,1),$Vn,452,0,[Gvt,Hvt,qvt])}function A1(){return mon(),Pun(Gk(Fvt,1),$Vn,339,0,[Nvt,Lvt,xvt])}function $1(){return Hcn(),Pun(Gk(nmt,1),$Vn,375,0,[Xvt,Wvt,Vvt])}function L1(){return $un(),Pun(Gk(Smt,1),$Vn,377,0,[bmt,wmt,lmt])}function N1(){return Usn(),Pun(Gk(hmt,1),$Vn,336,0,[emt,imt,rmt])}function x1(){return dcn(),Pun(Gk(dmt,1),$Vn,338,0,[smt,umt,omt])}function D1(){return oin(),Pun(Gk(xmt,1),$Vn,454,0,[Omt,Amt,$mt])}function R1(){return Cbn(),Pun(Gk(ujt,1),$Vn,442,0,[ejt,njt,tjt])}function K1(){return Hsn(),Pun(Gk(Gjt,1),$Vn,380,0,[sjt,hjt,fjt])}function _1(){return Sbn(),Pun(Gk(NEt,1),$Vn,381,0,[Zjt,nEt,Jjt])}function F1(){return Bcn(),Pun(Gk(Yjt,1),$Vn,293,0,[Xjt,Wjt,Ujt])}function B1(){return Pbn(),Pun(Gk(WEt,1),$Vn,437,0,[HEt,qEt,GEt])}function H1(){return ufn(),Pun(Gk(SCt,1),$Vn,334,0,[vCt,pCt,mCt])}function q1(){return Rtn(),Pun(Gk(nCt,1),$Vn,272,0,[zPt,UPt,XPt])}function G1(n,t){return k$n(n,t,cL(t,99)&&0!=(BB(t,18).Bb&BQn))}function z1(n,t,e){var i;return(i=cHn(n,t,!1)).b<=t&&i.a<=e}function U1(n,t,e){var i;(i=new ca).b=t,i.a=e,++t.b,WB(n.d,i)}function X1(n,t){var e;return Tx(!!(e=(kW(n),n).g)),kW(t),e(t)}function W1(n,t){var e,i;return i=pU(n,t),e=n.a.Zc(i),new kT(n,e)}function V1(n){return n.Db>>16!=6?null:BB(cAn(n),235)}function Q1(n){if(2!=n.p)throw Hp(new dv);return dG(n.f)&QVn}function Y1(n){if(2!=n.p)throw Hp(new dv);return dG(n.k)&QVn}function J1(n){return n.a==(R5(),eLt)&&db(n,eLn(n.g,n.b)),n.a}function Z1(n){return n.d==(R5(),eLt)&&pb(n,NKn(n.g,n.b)),n.d}function n0(n){return Px(n.a<n.c.c.length),n.b=n.a++,n.c.c[n.b]}function t0(n,t){n.b=n.b|t.b,n.c=n.c|t.c,n.d=n.d|t.d,n.a=n.a|t.a}function e0(n,t){return uan(Sz(JO(n)?Pan(n):n,JO(t)?Pan(t):t))}function i0(n,t){return uan(Pz(JO(n)?Pan(n):n,JO(t)?Pan(t):t))}function r0(n,t){return uan(Cz(JO(n)?Pan(n):n,JO(t)?Pan(t):t))}function c0(n){return rbn(yz(fan(H$n(n,32)),32),fan(H$n(n,32)))}function a0(n){return yX(n),cL(n,14)?new t_(BB(n,14)):HB(n.Kc())}function u0(n,t){return Dnn(),n.c==t.c?Pln(t.d,n.d):Pln(n.c,t.c)}function o0(n,t){return Dnn(),n.c==t.c?Pln(n.d,t.d):Pln(n.c,t.c)}function s0(n,t){return Dnn(),n.c==t.c?Pln(n.d,t.d):Pln(t.c,n.c)}function h0(n,t){return Dnn(),n.c==t.c?Pln(t.d,n.d):Pln(t.c,n.c)}function f0(n,t){var e;e=Gy(MD(n.a.We((sWn(),OPt)))),VUn(n,t,e)}function l0(n,t){var e;e=BB(RX(n.g,t),57),Otn(t.d,new oP(n,e))}function b0(n,t){var e,i;return(e=oyn(n))<(i=oyn(t))?-1:e>i?1:0}function w0(n,t){var e;return e=S7(t),BB(RX(n.c,e),19).a}function d0(n,t){var e;for(e=n+"";e.length<t;)e="0"+e;return e}function g0(n){return null==n.c||0==n.c.length?"n_"+n.g:"n_"+n.c}function p0(n){return null==n.c||0==n.c.length?"n_"+n.b:"n_"+n.c}function v0(n,t){return n&&n.equals?n.equals(t):GI(n)===GI(t)}function m0(n,t){return 0==t?!!n.o&&0!=n.o.f:vpn(n,t)}function y0(n,t,e){var i;n.n&&t&&e&&(i=new Zu,WB(n.e,i))}function k0(n,t,e){var i;i=n.d[t.p],n.d[t.p]=n.d[e.p],n.d[e.p]=i}function j0(n,t,e){this.d=n,this.j=t,this.e=e,this.o=-1,this.p=3}function E0(n,t,e){this.d=n,this.k=t,this.f=e,this.o=-1,this.p=5}function T0(n,t,e){Ap.call(this,25),this.b=n,this.a=t,this.c=e}function M0(n){wWn(),Ap.call(this,n),this.c=!1,this.a=!1}function S0(n,t,e,i,r,c){Hen.call(this,n,t,e,i,r),c&&(this.o=-2)}function P0(n,t,e,i,r,c){qen.call(this,n,t,e,i,r),c&&(this.o=-2)}function C0(n,t,e,i,r,c){J5.call(this,n,t,e,i,r),c&&(this.o=-2)}function I0(n,t,e,i,r,c){Uen.call(this,n,t,e,i,r),c&&(this.o=-2)}function O0(n,t,e,i,r,c){Z5.call(this,n,t,e,i,r),c&&(this.o=-2)}function A0(n,t,e,i,r,c){Gen.call(this,n,t,e,i,r),c&&(this.o=-2)}function $0(n,t,e,i,r,c){zen.call(this,n,t,e,i,r),c&&(this.o=-2)}function L0(n,t,e,i,r,c){n6.call(this,n,t,e,i,r),c&&(this.o=-2)}function N0(n,t,e,i){jp.call(this,e),this.b=n,this.c=t,this.d=i}function x0(n,t){this.a=new Np,this.d=new Np,this.f=n,this.c=t}function D0(){this.c=new $$,this.a=new bY,this.b=new em,bM()}function R0(){Nun(),this.b=new xp,this.a=new xp,this.c=new Np}function K0(n,t){this.g=n,this.d=(R5(),eLt),this.a=eLt,this.b=t}function _0(n,t){this.f=n,this.a=(R5(),tLt),this.c=tLt,this.b=t}function F0(n,t){!n.c&&(n.c=new Ecn(n,0)),MHn(n.c,(Uqn(),LLt),t)}function B0(){B0=O,Hkt=new wC("DFS",0),Bkt=new wC("BFS",1)}function H0(n,t,e){var i;return!!(i=BB(n.Zb().xc(t),14))&&i.Hc(e)}function q0(n,t,e){var i;return!!(i=BB(n.Zb().xc(t),14))&&i.Mc(e)}function G0(n,t,e,i){return n.a+=""+fx(null==t?zWn:Bbn(t),e,i),n}function z0(n,t,e,i,r,c){return Rcn(n,t,e,c),Jfn(n,i),tln(n,r),n}function U0(n){return Px(n.b.b!=n.d.a),n.c=n.b=n.b.b,--n.a,n.c.c}function X0(n){for(;n.d>0&&0==n.a[--n.d];);0==n.a[n.d++]&&(n.e=0)}function W0(n){return n.a?0==n.e.length?n.a.a:n.a.a+""+n.e:n.c}function V0(n){return!(!n.a||0==H7(n.a.a).i||n.b&&Kvn(n.b))}function Q0(n){return!(!n.u||0==a4(n.u.a).i||n.n&&Rvn(n.n))}function Y0(n){return yq(n.e.Hd().gc()*n.c.Hd().gc(),16,new zf(n))}function J0(n,t){return FU(fan(n.q.getTime()),fan(t.q.getTime()))}function Z0(n){return BB(Qgn(n,x8(yut,c1n,17,n.c.length,0,1)),474)}function n2(n){return BB(Qgn(n,x8(Out,a1n,10,n.c.length,0,1)),193)}function t2(n){return BZ(),!(b5(n)||!b5(n)&&n.c.i.c==n.d.i.c)}function e2(n,t,e){yX(n),xyn(new IZ(new t_(n),t,e))}function i2(n,t,e){yX(n),Dyn(new OZ(new t_(n),t,e))}function r2(n,t){var e;return e=1-t,n.a[e]=wrn(n.a[e],e),wrn(n,t)}function c2(n,t){var e;n.e=new Jm,m$(e=wDn(t),n.c),IDn(n,e,0)}function a2(n,t,e,i){var r;(r=new vu).a=t,r.b=e,r.c=i,DH(n.a,r)}function u2(n,t,e,i){var r;(r=new vu).a=t,r.b=e,r.c=i,DH(n.b,r)}function o2(n){var t,e;return e=t_n(t=new lX,n),yzn(t),e}function s2(){var n,t;return n=new Kp,WB(V$t,t=n),t}function h2(n){return n.j.c=x8(Ant,HWn,1,0,5,1),TV(n.c),gV(n.a),n}function f2(n){return MM(),cL(n.g,10)?BB(n.g,10):null}function l2(n){return!EV(n).dc()&&(L$(n,new m),!0)}function b2(n){if(!("stack"in n))try{throw n}catch(t){}return n}function w2(n,t){if(n<0||n>=t)throw Hp(new Ay(LCn(n,t)));return n}function d2(n,t,e){if(n<0||t<n||t>e)throw Hp(new Ay(oPn(n,t,e)))}function g2(n,t){if(TU(n.a,t),t.d)throw Hp(new dy(IYn));t.d=n}function p2(n,t){if(t.$modCount!=n.$modCount)throw Hp(new vv)}function v2(n,t){return!!cL(t,42)&&Mmn(n.a,BB(t,42))}function m2(n,t){return!!cL(t,42)&&Mmn(n.a,BB(t,42))}function y2(n,t){return!!cL(t,42)&&Mmn(n.a,BB(t,42))}function k2(n,t){return n.a<=n.b&&(t.ud(n.a++),!0)}function j2(n){var t;return JO(n)?-0==(t=n)?0:t:pnn(n)}function E2(n){var t;return EW(n),t=new F,gE(n.a,new gw(t)),t}function T2(n){var t;return EW(n),t=new _,gE(n.a,new dw(t)),t}function M2(n,t){this.a=n,Sb.call(this,n),LZ(t,n.gc()),this.b=t}function S2(n){this.e=n,this.b=this.e.a.entries(),this.a=new Array}function P2(n){return yq(n.e.Hd().gc()*n.c.Hd().gc(),273,new Gf(n))}function C2(n){return new J6((lin(n,NVn),ttn(rbn(rbn(5,n),n/10|0))))}function I2(n){return BB(Qgn(n,x8(Gut,u1n,11,n.c.length,0,1)),1943)}function O2(n,t,e){return e.f.c.length>0?BU(n.a,t,e):BU(n.b,t,e)}function A2(n,t,e){n.d&&y7(n.d.e,n),n.d=t,n.d&&kG(n.d.e,e,n)}function $2(n,t){vXn(t,n),aH(n.d),aH(BB(mMn(n,(HXn(),Agt)),207))}function L2(n,t){pXn(t,n),cH(n.d),cH(BB(mMn(n,(HXn(),Agt)),207))}function N2(n,t){var e,i;return i=null,(e=zJ(n,t))&&(i=e.fe()),i}function x2(n,t){var e,i;return i=null,(e=dnn(n,t))&&(i=e.ie()),i}function D2(n,t){var e,i;return i=null,(e=zJ(n,t))&&(i=e.ie()),i}function R2(n,t){var e,i;return i=null,(e=zJ(n,t))&&(i=yPn(e)),i}function K2(n,t,e){var i;return i=Qdn(e),wKn(n.g,i,t),wKn(n.i,t,e),t}function _2(n,t,e){var i;i=Ldn();try{return dR(n,t,e)}finally{y3(i)}}function F2(n){var t;t=n.Wg(),this.a=cL(t,69)?BB(t,69).Zh():t.Kc()}function B2(){Ym.call(this),this.j.c=x8(Ant,HWn,1,0,5,1),this.a=-1}function H2(n,t,e,i){this.d=n,this.n=t,this.g=e,this.o=i,this.p=-1}function q2(n,t,e,i){this.e=i,this.d=null,this.c=n,this.a=t,this.b=e}function G2(n,t,e){this.d=new Fd(this),this.e=n,this.i=t,this.f=e}function z2(){z2=O,Aft=new DP(eJn,0),$ft=new DP("TOP_LEFT",1)}function U2(){U2=O,Tmt=JW(iln(1),iln(4)),Emt=JW(iln(1),iln(2))}function X2(){X2=O,JEt=lhn((IM(),Pun(Gk(tTt,1),$Vn,551,0,[QEt])))}function W2(){W2=O,VEt=lhn((CM(),Pun(Gk(YEt,1),$Vn,482,0,[XEt])))}function V2(){V2=O,UTt=lhn((OM(),Pun(Gk(VTt,1),$Vn,530,0,[GTt])))}function Q2(){Q2=O,act=lhn((wM(),Pun(Gk(Pct,1),$Vn,481,0,[rct])))}function Y2(){return Dan(),Pun(Gk(Grt,1),$Vn,406,0,[Rrt,Nrt,xrt,Drt])}function J2(){return Z9(),Pun(Gk(Fet,1),$Vn,297,0,[Net,xet,Det,Ret])}function Z2(){return qpn(),Pun(Gk(cct,1),$Vn,394,0,[Zrt,Jrt,nct,tct])}function n3(){return Hpn(),Pun(Gk(Urt,1),$Vn,323,0,[Brt,Frt,Hrt,qrt])}function t3(){return Aun(),Pun(Gk(dut,1),$Vn,405,0,[Zat,eut,nut,tut])}function e3(){return Iun(),Pun(Gk(pst,1),$Vn,360,0,[ast,rst,cst,ist])}function i3(n,t,e,i){return cL(e,54)?new Ox(n,t,e,i):new sz(n,t,e,i)}function r3(){return Oun(),Pun(Gk(Ist,1),$Vn,411,0,[vst,mst,yst,kst])}function c3(n){return n.j==(kUn(),SIt)&&SN(UOn(n),oIt)}function a3(n,t){var e;SZ(e=t.a,t.c.d),MZ(e,t.d.d),Ztn(e.a,n.n)}function u3(n,t){return BB($N(Iz(BB(h6(n.k,t),15).Oc(),Qst)),113)}function o3(n,t){return BB($N(Oz(BB(h6(n.k,t),15).Oc(),Qst)),113)}function s3(n){return new w1(tcn(BB(n.a.dd(),14).gc(),n.a.cd()),16)}function h3(n){return cL(n,14)?BB(n,14).dc():!n.Kc().Ob()}function f3(n){return MM(),cL(n.g,145)?BB(n.g,145):null}function l3(n){if(n.e.g!=n.b)throw Hp(new vv);return!!n.c&&n.d>0}function b3(n){return Px(n.b!=n.d.c),n.c=n.b,n.b=n.b.a,++n.a,n.c.c}function w3(n,t){kW(t),$X(n.a,n.c,t),n.c=n.c+1&n.a.length-1,wyn(n)}function d3(n,t){kW(t),n.b=n.b-1&n.a.length-1,$X(n.a,n.b,t),wyn(n)}function g3(n,t){var e;for(e=n.j.c.length;e<t;e++)WB(n.j,n.rg())}function p3(n,t,e,i){var r;return r=i[t.g][e.g],Gy(MD(mMn(n.a,r)))}function v3(n,t,e,i,r){this.i=n,this.a=t,this.e=e,this.j=i,this.f=r}function m3(n,t,e,i,r){this.a=n,this.e=t,this.f=e,this.b=i,this.g=r}function y3(n){n&&Inn((sk(),ttt)),--ctt,n&&-1!=utt&&(iS(utt),utt=-1)}function k3(){return bvn(),Pun(Gk(kvt,1),$Vn,197,0,[lvt,bvt,fvt,hvt])}function j3(){return zyn(),Pun(Gk(qyt,1),$Vn,393,0,[Ryt,Kyt,_yt,Fyt])}function E3(){return Omn(),Pun(Gk(Vjt,1),$Vn,340,0,[qjt,Bjt,Hjt,Fjt])}function T3(){return mdn(),Pun(Gk(YIt,1),$Vn,374,0,[KIt,_It,RIt,DIt])}function M3(){return Xyn(),Pun(Gk(RCt,1),$Vn,285,0,[MCt,jCt,ECt,TCt])}function S3(){return Mbn(),Pun(Gk(oCt,1),$Vn,218,0,[ZPt,YPt,QPt,JPt])}function P3(){return Fwn(),Pun(Gk(cOt,1),$Vn,311,0,[eOt,ZIt,tOt,nOt])}function C3(){return Bsn(),Pun(Gk(wOt,1),$Vn,396,0,[uOt,oOt,aOt,sOt])}function I3(n){return hZ(),hU(fAt,n)?BB(RX(fAt,n),331).ug():null}function O3(n,t,e){return t<0?qIn(n,e):BB(e,66).Nj().Sj(n,n.yh(),t)}function A3(n,t,e){var i;return i=Qdn(e),wKn(n.d,i,t),VW(n.e,t,e),t}function $3(n,t,e){var i;return i=Qdn(e),wKn(n.j,i,t),VW(n.k,t,e),t}function L3(n){var t;return tE(),t=new io,n&&HLn(t,n),t}function N3(n){var t;return t=n.ri(n.i),n.i>0&&aHn(n.g,0,t,0,n.i),t}function x3(n,t){var e;return nS(),!(e=BB(RX(mAt,n),55))||e.wj(t)}function D3(n){if(1!=n.p)throw Hp(new dv);return dG(n.f)<<24>>24}function R3(n){if(1!=n.p)throw Hp(new dv);return dG(n.k)<<24>>24}function K3(n){if(7!=n.p)throw Hp(new dv);return dG(n.k)<<16>>16}function _3(n){if(7!=n.p)throw Hp(new dv);return dG(n.f)<<16>>16}function F3(n){var t;for(t=0;n.Ob();)n.Pb(),t=rbn(t,1);return ttn(t)}function B3(n,t){var e;return e=new Ik,n.xd(e),e.a+="..",t.yd(e),e.a}function H3(n,t,e){var i;i=BB(RX(n.g,e),57),WB(n.a.c,new rI(t,i))}function q3(n,t,e){return Tz(MD(qI(AY(n.f,t))),MD(qI(AY(n.f,e))))}function G3(n,t,e){return UFn(n,t,e,cL(t,99)&&0!=(BB(t,18).Bb&BQn))}function z3(n,t,e){return pBn(n,t,e,cL(t,99)&&0!=(BB(t,18).Bb&BQn))}function U3(n,t,e){return x$n(n,t,e,cL(t,99)&&0!=(BB(t,18).Bb&BQn))}function X3(n,t){return n==(uSn(),Cut)&&t==Cut?4:n==Cut||t==Cut?8:32}function W3(n,t){return GI(t)===GI(n)?"(this Map)":null==t?zWn:Bbn(t)}function V3(n,t){return BB(null==t?qI(AY(n.f,null)):hS(n.g,t),281)}function Q3(n,t,e){var i;return i=Qdn(e),VW(n.b,i,t),VW(n.c,t,e),t}function Y3(n,t){var e;for(e=t;e;)_x(n,e.i,e.j),e=JJ(e);return n}function J3(n,t){var e;return e=rY(HB(new C7(n,t))),Cq(new C7(n,t)),e}function Z3(n,t){var e;return ZM(),TSn(e=BB(n,66).Mj(),t),e.Ok(t)}function n4(n,t,e,i,r){WB(t,mCn(r,X$n(r,e,i))),UMn(n,r,t)}function t4(n,t,e){n.i=0,n.e=0,t!=e&&(Won(n,t,e),Xon(n,t,e))}function e4(n,t){var e;e=n.q.getHours(),n.q.setFullYear(t+sQn),lBn(n,e)}function i4(n,t,e){if(e){var i=e.ee();n.a[t]=i(e)}else delete n.a[t]}function r4(n,t,e){if(e){var i=e.ee();e=i(e)}else e=void 0;n.a[t]=e}function c4(n){if(n<0)throw Hp(new By("Negative array size: "+n))}function a4(n){return n.n||(P5(n),n.n=new YG(n,VAt,n),kY(n)),n.n}function u4(n){return Px(n.a<n.c.a.length),n.b=n.a,Ann(n),n.c.b[n.b]}function o4(n){n.b!=n.c&&(n.a=x8(Ant,HWn,1,8,5,1),n.b=0,n.c=0)}function s4(n){this.b=new xp,this.c=new xp,this.d=new xp,this.a=n}function h4(n,t){wWn(),Ap.call(this,n),this.a=t,this.c=-1,this.b=-1}function f4(n,t,e,i){j0.call(this,1,e,i),Fh(this),this.c=n,this.b=t}function l4(n,t,e,i){E0.call(this,1,e,i),Fh(this),this.c=n,this.b=t}function b4(n,t,e,i,r,c,a){kin.call(this,t,i,r,c,a),this.c=n,this.a=e}function w4(n,t,e){this.e=n,this.a=Ant,this.b=ARn(t),this.c=t,this.d=e}function d4(n){this.e=n,this.c=this.e.a,this.b=this.e.g,this.d=this.e.i}function g4(n){this.c=n,this.a=BB(Ikn(n),148),this.b=this.a.Aj().Nh()}function p4(n){this.d=n,this.b=this.d.a.entries(),this.a=this.b.next()}function v4(){xp.call(this),jx(this),this.d.b=this.d,this.d.a=this.d}function m4(n,t){$R.call(this),this.a=n,this.b=t,WB(this.a.b,this)}function y4(n,t){return iO(null!=t?SJ(n,t):qI(AY(n.f,t)))}function k4(n,t){return iO(null!=t?SJ(n,t):qI(AY(n.f,t)))}function j4(n,t){var e;for(e=0;e<t;++e)$X(n,e,new Ub(BB(n[e],42)))}function E4(n,t){var e;for(e=n.d-1;e>=0&&n.a[e]===t[e];e--);return e<0}function T4(n,t){var e;return zsn(),0!=(e=n.j.g-t.j.g)?e:0}function M4(n,t){return kW(t),null!=n.a?PG(t.Kb(n.a)):Set}function S4(n){var t;return n?new Lq(n):(qrn(t=new fA,n),t)}function P4(n,t){return t.b.Kb(T7(n,t.c.Ee(),new yw(t)))}function C4(n){yTn(),hL(this,dG(e0(kz(n,24),sYn)),dG(e0(n,sYn)))}function I4(){I4=O,pit=lhn((hpn(),Pun(Gk(yit,1),$Vn,428,0,[dit,wit])))}function O4(){O4=O,kit=lhn((Rnn(),Pun(Gk(Kit,1),$Vn,427,0,[vit,mit])))}function A4(){A4=O,_ct=lhn((Knn(),Pun(Gk($at,1),$Vn,424,0,[Dct,Rct])))}function $4(){$4=O,zut=lhn((Srn(),Pun(Gk(Wut,1),$Vn,511,0,[qut,Hut])))}function L4(){L4=O,Iht=lhn((_nn(),Pun(Gk(Lht,1),$Vn,419,0,[Sht,Pht])))}function N4(){N4=O,Uht=lhn((g7(),Pun(Gk(Zht,1),$Vn,479,0,[Ght,qht])))}function x4(){x4=O,tmt=lhn((A6(),Pun(Gk(cmt,1),$Vn,376,0,[Zvt,Jvt])))}function D4(){D4=O,Bvt=lhn((U7(),Pun(Gk(zvt,1),$Vn,421,0,[Kvt,_vt])))}function R4(){R4=O,oht=lhn((V8(),Pun(Gk(lht,1),$Vn,422,0,[cht,aht])))}function K4(){K4=O,Nft=lhn((z2(),Pun(Gk(Glt,1),$Vn,420,0,[Aft,$ft])))}function _4(){_4=O,Pyt=lhn((O6(),Pun(Gk(xyt,1),$Vn,520,0,[Myt,Tyt])))}function F4(){F4=O,Gmt=lhn((Q4(),Pun(Gk(Vmt,1),$Vn,523,0,[Hmt,Bmt])))}function B4(){B4=O,iyt=lhn((gJ(),Pun(Gk(ayt,1),$Vn,516,0,[tyt,nyt])))}function H4(){H4=O,uyt=lhn((oZ(),Pun(Gk(Syt,1),$Vn,515,0,[ryt,cyt])))}function q4(){q4=O,Dyt=lhn((dJ(),Pun(Gk(Byt,1),$Vn,455,0,[Lyt,Nyt])))}function G4(){G4=O,Gkt=lhn((B0(),Pun(Gk(Jkt,1),$Vn,425,0,[Hkt,Bkt])))}function z4(){z4=O,Zkt=lhn((Prn(),Pun(Gk(ijt,1),$Vn,495,0,[Qkt,Ykt])))}function U4(){U4=O,Fkt=lhn((sZ(),Pun(Gk(qkt,1),$Vn,480,0,[Rkt,Kkt])))}function X4(){X4=O,ojt=lhn((D9(),Pun(Gk(ljt,1),$Vn,426,0,[cjt,ajt])))}function W4(){W4=O,QTt=lhn((Lun(),Pun(Gk(YTt,1),$Vn,429,0,[WTt,XTt])))}function V4(){V4=O,eTt=lhn(($6(),Pun(Gk(oTt,1),$Vn,430,0,[nTt,ZEt])))}function Q4(){Q4=O,Hmt=new JP("UPPER",0),Bmt=new JP("LOWER",1)}function Y4(n,t){var e;qQ(e=new py,"x",t.a),qQ(e,"y",t.b),nW(n,e)}function J4(n,t){var e;qQ(e=new py,"x",t.a),qQ(e,"y",t.b),nW(n,e)}function Z4(n,t){var e,i;i=!1;do{i|=e=bon(n,t)}while(e);return i}function n5(n,t){var e,i;for(e=t,i=0;e>0;)i+=n.a[e],e-=e&-e;return i}function t5(n,t){var e;for(e=t;e;)_x(n,-e.i,-e.j),e=JJ(e);return n}function e5(n,t){var e,i;for(kW(t),i=n.Kc();i.Ob();)e=i.Pb(),t.td(e)}function i5(n,t){var e;return new vT(e=t.cd(),n.e.pc(e,BB(t.dd(),14)))}function r5(n,t,e,i){var r;(r=new $).c=t,r.b=e,r.a=i,i.b=e.a=r,++n.b}function c5(n,t,e){var i;return l1(t,n.c.length),i=n.c[t],n.c[t]=e,i}function a5(n,t,e){return BB(null==t?jCn(n.f,null,e):ubn(n.g,t,e),281)}function u5(n){return n.c&&n.d?p0(n.c)+"->"+p0(n.d):"e_"+PN(n)}function o5(n,t){return(Qln(n),jE(new Rq(n,new Q9(t,n.a)))).sd(tit)}function s5(){return yMn(),Pun(Gk(Uat,1),$Vn,356,0,[Rat,Kat,_at,Fat,Bat])}function h5(){return kUn(),Pun(Gk(FIt,1),YZn,61,0,[PIt,sIt,oIt,SIt,CIt])}function f5(n){return Dk(),function(){return _2(n,this,arguments)}}function l5(){return Date.now?Date.now():(new Date).getTime()}function b5(n){return!(!n.c||!n.d||!n.c.i||n.c.i!=n.d.i)}function w5(n){if(!n.c.Sb())throw Hp(new yv);return n.a=!0,n.c.Ub()}function d5(n){n.i=0,yS(n.b,null),yS(n.c,null),n.a=null,n.e=null,++n.g}function g5(n){dS.call(this,null==n?zWn:Bbn(n),cL(n,78)?BB(n,78):null)}function p5(n){eWn(),Bp(this),this.a=new YT,dsn(this,n),DH(this.a,n)}function v5(){xA(this),this.b=new xC(RQn,RQn),this.a=new xC(KQn,KQn)}function m5(n,t){this.c=0,this.b=t,pO.call(this,n,17493),this.a=this.c}function y5(n){k5(),Qet||(this.c=n,this.e=!0,this.a=new Np)}function k5(){k5=O,Qet=!0,Wet=!1,Vet=!1,Jet=!1,Yet=!1}function j5(n,t){return!!cL(t,149)&&mK(n.c,BB(t,149).c)}function E5(n,t){var e;return e=0,n&&(e+=n.f.a/2),t&&(e+=t.f.a/2),e}function T5(n,t){return BB(lnn(n.d,t),23)||BB(lnn(n.e,t),23)}function M5(n){this.b=n,AL.call(this,n),this.a=BB(yan(this.b.a,4),126)}function S5(n){this.b=n,ax.call(this,n),this.a=BB(yan(this.b.a,4),126)}function P5(n){return n.t||(n.t=new dp(n),sln(new xy(n),0,n.t)),n.t}function C5(){return Ffn(),Pun(Gk(WPt,1),$Vn,103,0,[BPt,FPt,_Pt,KPt,HPt])}function I5(){return cpn(),Pun(Gk(JCt,1),$Vn,249,0,[BCt,qCt,_Ct,FCt,HCt])}function O5(){return rpn(),Pun(Gk(jMt,1),$Vn,175,0,[hMt,sMt,uMt,fMt,oMt])}function A5(){return $Sn(),Pun(Gk(zTt,1),$Vn,316,0,[iTt,rTt,uTt,cTt,aTt])}function $5(){return Nvn(),Pun(Gk(Avt,1),$Vn,315,0,[yvt,pvt,vvt,gvt,mvt])}function L5(){return Vvn(),Pun(Gk(Cht,1),$Vn,335,0,[yht,mht,jht,Eht,kht])}function N5(){return YLn(),Pun(Gk(zEt,1),$Vn,355,0,[DEt,xEt,KEt,REt,_Et])}function x5(){return LEn(),Pun(Gk(Kst,1),$Vn,363,0,[Mst,Pst,Cst,Sst,Tst])}function D5(){return Tbn(),Pun(Gk(ivt,1),$Vn,163,0,[qlt,_lt,Flt,Blt,Hlt])}function R5(){var n,t;R5=O,iE(),t=new Ev,tLt=t,n=new Om,eLt=n}function K5(n){var t;return n.c||cL(t=n.r,88)&&(n.c=BB(t,26)),n.c}function _5(n){return n.e=3,n.d=n.Yb(),2!=n.e&&(n.e=0,!0)}function F5(n){return M$(n&SQn,n>>22&SQn,n<0?PQn:0)}function B5(n){var t,e,i;for(e=0,i=(t=n).length;e<i;++e)jW(t[e])}function H5(n,t){var e,i;(e=BB(bfn(n.c,t),14))&&(i=e.gc(),e.$b(),n.d-=i)}function q5(n,t){var e;return!!(e=lsn(n,t.cd()))&&cV(e.e,t.dd())}function G5(n,t){return 0==t||0==n.e?n:t>0?Edn(n,t):Ixn(n,-t)}function z5(n,t){return 0==t||0==n.e?n:t>0?Ixn(n,t):Edn(n,-t)}function U5(n){if(dAn(n))return n.c=n.a,n.a.Pb();throw Hp(new yv)}function X5(n){var t,e;return t=n.c.i,e=n.d.i,t.k==(uSn(),Mut)&&e.k==Mut}function W5(n){var t;return qan(t=new wY,n),hon(t,(HXn(),vgt),null),t}function V5(n,t,e){var i;return(i=n.Yg(t))>=0?n._g(i,e,!0):cOn(n,t,e)}function Q5(n,t,e,i){var r;for(r=0;r<Zit;r++)XG(n.a[t.g][r],e,i[t.g])}function Y5(n,t,e,i){var r;for(r=0;r<nrt;r++)UG(n.a[r][t.g],e,i[t.g])}function J5(n,t,e,i,r){j0.call(this,t,i,r),Fh(this),this.c=n,this.a=e}function Z5(n,t,e,i,r){E0.call(this,t,i,r),Fh(this),this.c=n,this.a=e}function n6(n,t,e,i,r){i6.call(this,t,i,r),Fh(this),this.c=n,this.a=e}function t6(n,t,e,i,r){i6.call(this,t,i,r),Fh(this),this.c=n,this.b=e}function e6(n,t,e){jp.call(this,e),this.b=n,this.c=t,this.d=(Bwn(),z$t)}function i6(n,t,e){this.d=n,this.k=t?1:0,this.f=e?1:0,this.o=-1,this.p=0}function r6(n,t,e){var i;Tcn(i=new X$(n.a),n.a.a),jCn(i.f,t,e),n.a.a=i}function c6(n,t){n.qi(n.i+1),jL(n,n.i,n.oi(n.i,t)),n.bi(n.i++,t),n.ci()}function a6(n){var t,e;++n.j,t=n.g,e=n.i,n.g=null,n.i=0,n.di(e,t),n.ci()}function u6(n){var t;return yX(n),$on(t=new J6(ZW(n.length)),n),t}function o6(n){var t;return yX(n),JPn(t=n?new t_(n):HB(n.Kc())),sfn(t)}function s6(n,t){var e;return l1(t,n.c.length),e=n.c[t],PE(n.c,t,1),e}function h6(n,t){var e;return!(e=BB(n.c.xc(t),14))&&(e=n.ic(t)),n.pc(t,e)}function f6(n,t){var e,i;return kW(n),e=n,kW(t),e==(i=t)?0:e<i?-1:1}function l6(n){var t;return t=n.e+n.f,isNaN(t)&&WK(n.d)?n.d:t}function b6(n,t){return n.a?oO(n.a,n.b):n.a=new lN(n.d),aO(n.a,t),n}function w6(n,t){if(n<0||n>t)throw Hp(new Ay(dCn(n,t,"index")));return n}function d6(n,t,e,i){var r;return vTn(r=x8(ANt,hQn,25,t,15,1),n,t,e,i),r}function g6(n,t){var e;e=n.q.getHours()+(t/60|0),n.q.setMinutes(t),lBn(n,e)}function p6(n,t){return e.Math.min(W8(t.a,n.d.d.c),W8(t.b,n.d.d.c))}function v6(n,t){return XI(t)?null==t?gAn(n.f,null):Gan(n.g,t):gAn(n.f,t)}function m6(n){this.c=n,this.a=new Wb(this.c.a),this.b=new Wb(this.c.b)}function y6(){this.e=new Np,this.c=new Np,this.d=new Np,this.b=new Np}function k6(){this.g=new Bv,this.b=new Bv,this.a=new Np,this.k=new Np}function j6(n,t,e){this.a=n,this.c=t,this.d=e,WB(t.e,this),WB(e.b,this)}function E6(n,t){gO.call(this,t.rd(),-6&t.qd()),kW(n),this.a=n,this.b=t}function T6(n,t){pO.call(this,t.rd(),-6&t.qd()),kW(n),this.a=n,this.b=t}function M6(n,t){vO.call(this,t.rd(),-6&t.qd()),kW(n),this.a=n,this.b=t}function S6(n,t,e){this.a=n,this.b=t,this.c=e,WB(n.t,this),WB(t.i,this)}function P6(){this.b=new YT,this.a=new YT,this.b=new YT,this.a=new YT}function C6(){C6=O,TMt=new up("org.eclipse.elk.labels.labelManager")}function I6(){I6=O,est=new iR("separateLayerConnections",(Iun(),ast))}function O6(){O6=O,Myt=new uC("REGULAR",0),Tyt=new uC("CRITICAL",1)}function A6(){A6=O,Zvt=new XP("STACKED",0),Jvt=new XP("SEQUENCED",1)}function $6(){$6=O,nTt=new TC("FIXED",0),ZEt=new TC("CENTER_NODE",1)}function L6(n,t){var e;return e=xGn(n,t),n.b=new mrn(e.c.length),yqn(n,e)}function N6(n,t,e){return++n.e,--n.f,BB(n.d[t].$c(e),133).dd()}function x6(n){var t;return n.a||cL(t=n.r,148)&&(n.a=BB(t,148)),n.a}function D6(n){return n.a?n.e?D6(n.e):null:n}function R6(n,t){return n.p<t.p?1:n.p>t.p?-1:0}function K6(n,t){return kW(t),n.c<n.d&&(n.ze(t,n.c++),!0)}function _6(n,t){return!!hU(n.a,t)&&(v6(n.a,t),!0)}function F6(n){var t;return t=n.cd(),RB(BB(n.dd(),14).Nc(),new Vf(t))}function B6(n){var t;return t=BB(VU(n.b,n.b.length),9),new YK(n.a,t,n.c)}function H6(n){return Qln(n),new AD(n,new ZB(n,n.a.e,4|n.a.d))}function q6(n){var t;for(EW(n),t=0;n.a.sd(new fn);)t=rbn(t,1);return t}function G6(n,t,e){var i,r;for(i=0,r=0;r<t.length;r++)i+=n.$f(t[r],i,e)}function z6(n,t){var e;n.C&&((e=BB(oV(n.b,t),124).n).d=n.C.d,e.a=n.C.a)}function U6(n,t,e){return w2(t,n.e.Hd().gc()),w2(e,n.c.Hd().gc()),n.a[t][e]}function X6(n,t){ODn(),this.e=n,this.d=1,this.a=Pun(Gk(ANt,1),hQn,25,15,[t])}function W6(n,t,e,i){this.f=n,this.e=t,this.d=e,this.b=i,this.c=i?i.d:null}function V6(n){var t,e,i,r;r=n.d,t=n.a,e=n.b,i=n.c,n.d=e,n.a=i,n.b=r,n.c=t}function Q6(n,t,e,i){mFn(n,t,e,pBn(n,t,i,cL(t,99)&&0!=(BB(t,18).Bb&BQn)))}function Y6(n,t){OTn(t,"Label management",1),iO(mMn(n,(C6(),TMt))),HSn(t)}function J6(n){xA(this),vH(n>=0,"Initial capacity must not be negative")}function Z6(){Z6=O,Wit=lhn((Dtn(),Pun(Gk(Vit,1),$Vn,232,0,[Git,zit,Uit])))}function n8(){n8=O,trt=lhn((J9(),Pun(Gk(ert,1),$Vn,461,0,[Yit,Qit,Jit])))}function t8(){t8=O,urt=lhn((G7(),Pun(Gk(Ort,1),$Vn,462,0,[crt,rrt,irt])))}function e8(){e8=O,Zet=lhn((qsn(),Pun(Gk(nit,1),$Vn,132,0,[zet,Uet,Xet])))}function i8(){i8=O,Lat=lhn((q7(),Pun(Gk(Hat,1),$Vn,379,0,[Oat,Iat,Aat])))}function r8(){r8=O,gut=lhn((Bfn(),Pun(Gk(mut,1),$Vn,423,0,[wut,but,lut])))}function c8(){c8=O,bht=lhn((Oin(),Pun(Gk(pht,1),$Vn,314,0,[hht,sht,fht])))}function a8(){a8=O,vht=lhn((uin(),Pun(Gk(Tht,1),$Vn,337,0,[wht,ght,dht])))}function u8(){u8=O,Nht=lhn((Jun(),Pun(Gk(Bht,1),$Vn,450,0,[Aht,Oht,$ht])))}function o8(){o8=O,_st=lhn((Crn(),Pun(Gk(Wst,1),$Vn,361,0,[Rst,Dst,xst])))}function s8(){s8=O,Oft=lhn((z7(),Pun(Gk(Lft,1),$Vn,303,0,[Pft,Cft,Sft])))}function h8(){h8=O,Mft=lhn((Kan(),Pun(Gk(Ift,1),$Vn,292,0,[jft,Eft,kft])))}function f8(){f8=O,svt=lhn((Mhn(),Pun(Gk(wvt,1),$Vn,378,0,[cvt,avt,uvt])))}function l8(){l8=O,Yvt=lhn((Hcn(),Pun(Gk(nmt,1),$Vn,375,0,[Xvt,Wvt,Vvt])))}function b8(){b8=O,Rvt=lhn((mon(),Pun(Gk(Fvt,1),$Vn,339,0,[Nvt,Lvt,xvt])))}function w8(){w8=O,Uvt=lhn((ain(),Pun(Gk(Qvt,1),$Vn,452,0,[Gvt,Hvt,qvt])))}function d8(){d8=O,gmt=lhn(($un(),Pun(Gk(Smt,1),$Vn,377,0,[bmt,wmt,lmt])))}function g8(){g8=O,amt=lhn((Usn(),Pun(Gk(hmt,1),$Vn,336,0,[emt,imt,rmt])))}function p8(){p8=O,fmt=lhn((dcn(),Pun(Gk(dmt,1),$Vn,338,0,[smt,umt,omt])))}function v8(){v8=O,Nmt=lhn((oin(),Pun(Gk(xmt,1),$Vn,454,0,[Omt,Amt,$mt])))}function m8(){m8=O,rjt=lhn((Cbn(),Pun(Gk(ujt,1),$Vn,442,0,[ejt,njt,tjt])))}function y8(){y8=O,bjt=lhn((Hsn(),Pun(Gk(Gjt,1),$Vn,380,0,[sjt,hjt,fjt])))}function k8(){k8=O,eEt=lhn((Sbn(),Pun(Gk(NEt,1),$Vn,381,0,[Zjt,nEt,Jjt])))}function j8(){j8=O,Qjt=lhn((Bcn(),Pun(Gk(Yjt,1),$Vn,293,0,[Xjt,Wjt,Ujt])))}function E8(){E8=O,UEt=lhn((Pbn(),Pun(Gk(WEt,1),$Vn,437,0,[HEt,qEt,GEt])))}function T8(){T8=O,kCt=lhn((ufn(),Pun(Gk(SCt,1),$Vn,334,0,[vCt,pCt,mCt])))}function M8(){M8=O,VPt=lhn((Rtn(),Pun(Gk(nCt,1),$Vn,272,0,[zPt,UPt,XPt])))}function S8(){return QEn(),Pun(Gk(aIt,1),$Vn,98,0,[YCt,QCt,VCt,UCt,WCt,XCt])}function P8(n,t){return!n.o&&(n.o=new y9((CXn(),MOt),rAt,n,0)),rdn(n.o,t)}function C8(n){return!n.g&&(n.g=new oo),!n.g.d&&(n.g.d=new lp(n)),n.g.d}function I8(n){return!n.g&&(n.g=new oo),!n.g.a&&(n.g.a=new bp(n)),n.g.a}function O8(n){return!n.g&&(n.g=new oo),!n.g.b&&(n.g.b=new fp(n)),n.g.b}function A8(n){return!n.g&&(n.g=new oo),!n.g.c&&(n.g.c=new wp(n)),n.g.c}function $8(n,t,e){var i,r;for(r=new Aan(t,n),i=0;i<e;++i)cvn(r);return r}function L8(n,t,e){var i,r;if(null!=e)for(i=0;i<t;++i)r=e[i],n.fi(i,r)}function N8(n,t,e,i){var r;return AFn(r=x8(ANt,hQn,25,t+1,15,1),n,t,e,i),r}function x8(n,t,e,i,r,c){var a;return a=Bmn(r,i),10!=r&&Pun(Gk(n,c),t,e,r,a),a}function D8(n,t,e,i){return e&&(i=e.gh(t,Awn(e.Tg(),n.c.Lj()),null,i)),i}function R8(n,t,e,i){return e&&(i=e.ih(t,Awn(e.Tg(),n.c.Lj()),null,i)),i}function K8(n,t,e){BB(n.b,65),BB(n.b,65),BB(n.b,65),Otn(n.a,new N_(e,t,n))}function _8(n,t,e){if(n<0||t>e||t<n)throw Hp(new Ok(mYn+n+kYn+t+hYn+e))}function F8(n){if(!n)throw Hp(new Fy("Unable to add element to queue"))}function B8(n){n?(this.c=n,this.b=null):(this.c=null,this.b=new Np)}function H8(n,t){PS.call(this,n,t),this.a=x8(Ket,kVn,436,2,0,1),this.b=!0}function q8(n){non.call(this,n,0),jx(this),this.d.b=this.d,this.d.a=this.d}function G8(n){var t;return 0==(t=n.b).b?null:BB(Dpn(t,0),188).b}function z8(n,t){var e;return(e=new q).c=!0,e.d=t.dd(),YGn(n,t.cd(),e)}function U8(n,t){var e;e=n.q.getHours()+(t/3600|0),n.q.setSeconds(t),lBn(n,e)}function X8(n,t,e){var i;(i=n.b[e.c.p][e.p]).b+=t.b,i.c+=t.c,i.a+=t.a,++i.a}function W8(n,t){var i,r;return i=n.a-t.a,r=n.b-t.b,e.Math.sqrt(i*i+r*r)}function V8(){V8=O,cht=new EP("QUADRATIC",0),aht=new EP("SCANLINE",1)}function Q8(){Q8=O,mmt=WG(dq(new B2,(yMn(),Rat),(lWn(),kot)),Bat,qot)}function Y8(){return wEn(),Pun(Gk(qPt,1),$Vn,291,0,[ZMt,JMt,YMt,VMt,WMt,QMt])}function J8(){return wvn(),Pun(Gk(nSt,1),$Vn,248,0,[CMt,AMt,$Mt,LMt,IMt,OMt])}function Z8(){return $Pn(),Pun(Gk(uht,1),$Vn,227,0,[Zst,tht,Jst,nht,eht,Yst])}function n9(){return JMn(),Pun(Gk(mft,1),$Vn,275,0,[cft,eft,aft,rft,ift,tft])}function t9(){return Bjn(),Pun(Gk(uft,1),$Vn,274,0,[Qht,Vht,Jht,Wht,Yht,Xht])}function e9(){return TTn(),Pun(Gk(ovt,1),$Vn,313,0,[tvt,Zpt,Ypt,Jpt,evt,nvt])}function i9(){return gSn(),Pun(Gk(zht,1),$Vn,276,0,[Dht,xht,Kht,Rht,Fht,_ht])}function r9(){return DPn(),Pun(Gk(_kt,1),$Vn,327,0,[Qyt,Uyt,Wyt,Xyt,Vyt,zyt])}function c9(){return lIn(),Pun(Gk(IIt,1),$Vn,273,0,[rIt,eIt,iIt,tIt,nIt,cIt])}function a9(){return nMn(),Pun(Gk(yCt,1),$Vn,312,0,[aCt,rCt,uCt,eCt,cCt,iCt])}function u9(){return uSn(),Pun(Gk($ut,1),$Vn,267,0,[Cut,Put,Mut,Iut,Sut,Tut])}function o9(n){Mx(!!n.c),p2(n.e,n),n.c.Qb(),n.c=null,n.b=dun(n),bD(n.e,n)}function s9(n){return p2(n.c.a.e,n),Px(n.b!=n.c.a.d),n.a=n.b,n.b=n.b.a,n.a}function h9(n){var t;return n.a||-1==n.b||(t=n.c.Tg(),n.a=itn(t,n.b)),n.a}function f9(n,t){return!(n.hi()&&n.Hc(t)||(n.Yh(t),0))}function l9(n,t){return OY(t,"Horizontal alignment cannot be null"),n.b=t,n}function b9(n,t,e){var i;return wWn(),i=ZUn(n,t),e&&i&&gW(n)&&(i=null),i}function w9(n,t,e){var i;for(i=n.Kc();i.Ob();)ZRn(BB(i.Pb(),37),t,e)}function d9(n,t){var e;for(e=t.Kc();e.Ob();)$Kn(n,BB(e.Pb(),37),0,0)}function g9(n,t,i){var r;n.d[t.g]=i,(r=n.g.c)[t.g]=e.Math.max(r[t.g],i+1)}function p9(n,t){var e,i,r;return r=n.r,i=n.d,(e=cHn(n,t,!0)).b!=r||e.a!=i}function v9(n,t){return lS(n.e,t)||Jgn(n.e,t,new ipn(t)),BB(lnn(n.e,t),113)}function m9(n,t,e,i){return kW(n),kW(t),kW(e),kW(i),new jU(n,t,new G)}function y9(n,t,e,i){this.rj(),this.a=t,this.b=n,this.c=new Zz(this,t,e,i)}function k9(n,t,e,i,r,c){H2.call(this,t,i,r,c),Fh(this),this.c=n,this.b=e}function j9(n,t,e,i,r,c){H2.call(this,t,i,r,c),Fh(this),this.c=n,this.a=e}function E9(n,t,e){var i,r;r=null,(i=zJ(n,e))&&(r=yPn(i)),Xgn(t,e,r)}function T9(n,t,e){var i,r;r=null,(i=zJ(n,e))&&(r=yPn(i)),Xgn(t,e,r)}function M9(n,t,e){var i;return(i=$$n(n.b,t))?NHn(F7(n,i),e):null}function S9(n,t){var e;return(e=n.Yg(t))>=0?n._g(e,!0,!0):cOn(n,t,!0)}function P9(n,t){return Pln(Gy(MD(mMn(n,(hWn(),Tlt)))),Gy(MD(mMn(t,Tlt))))}function C9(){C9=O,Ukt=ogn(ogn(FM(new B2,(zyn(),Kyt)),(DPn(),Qyt)),Uyt)}function I9(n,t,e){var i;return i=Non(n,t,e),n.b=new mrn(i.c.length),sDn(n,i)}function O9(n){if(n.b<=0)throw Hp(new yv);return--n.b,n.a-=n.c.c,iln(n.a)}function A9(n){var t;if(!n.a)throw Hp(new lV);return t=n.a,n.a=JJ(n.a),t}function $9(n){for(;!n.a;)if(!TK(n.c,new pw(n)))return!1;return!0}function L9(n){return yX(n),cL(n,198)?BB(n,198):new ol(n)}function N9(n){x9(),BB(n.We((sWn(),fPt)),174).Fc((lIn(),iIt)),n.Ye(hPt,null)}function x9(){x9=O,tMt=new bu,iMt=new wu,eMt=vsn((sWn(),hPt),tMt,qSt,iMt)}function D9(){D9=O,cjt=new pC("LEAF_NUMBER",0),ajt=new pC("NODE_SIZE",1)}function R9(n,t,e){n.a=t,n.c=e,n.b.a.$b(),yQ(n.d),n.e.a.c=x8(Ant,HWn,1,0,5,1)}function K9(n){n.a=x8(ANt,hQn,25,n.b+1,15,1),n.c=x8(ANt,hQn,25,n.b,15,1),n.d=0}function _9(n,t){n.a.ue(t.d,n.b)>0&&(WB(n.c,new mH(t.c,t.d,n.d)),n.b=t.d)}function F9(n,t){if(null==n.g||t>=n.i)throw Hp(new LO(t,n.i));return n.g[t]}function B9(n,t,e){if(xsn(n,e),null!=e&&!n.wj(e))throw Hp(new lv);return e}function H9(n){var t;if(n.Ek())for(t=n.i-1;t>=0;--t)Wtn(n,t);return N3(n)}function q9(n){var t,e;if(!n.b)return null;for(e=n.b;t=e.a[0];)e=t;return e}function G9(n,t){var e;return c4(t),(e=m7(n.slice(0,t),n)).length=t,e}function z9(n,t,e,i){PQ(),i=i||wet,gCn(n.slice(t,e),n,t,e,-t,i)}function U9(n,t,e,i,r){return t<0?cOn(n,e,i):BB(e,66).Nj().Pj(n,n.yh(),t,i,r)}function X9(n){return cL(n,172)?""+BB(n,172).a:null==n?null:Bbn(n)}function W9(n){return cL(n,172)?""+BB(n,172).a:null==n?null:Bbn(n)}function V9(n,t){if(t.a)throw Hp(new dy(IYn));TU(n.a,t),t.a=n,!n.j&&(n.j=t)}function Q9(n,t){vO.call(this,t.rd(),-16449&t.qd()),kW(n),this.a=n,this.c=t}function Y9(n,t){var e,i;return i=t/n.c.Hd().gc()|0,e=t%n.c.Hd().gc(),U6(n,i,e)}function J9(){J9=O,Yit=new GS(cJn,0),Qit=new GS(eJn,1),Jit=new GS(aJn,2)}function Z9(){Z9=O,Net=new gS("All",0),xet=new LA,Det=new A$,Ret=new NA}function n7(){n7=O,_et=lhn((Z9(),Pun(Gk(Fet,1),$Vn,297,0,[Net,xet,Det,Ret])))}function t7(){t7=O,rut=lhn((Aun(),Pun(Gk(dut,1),$Vn,405,0,[Zat,eut,nut,tut])))}function e7(){e7=O,_rt=lhn((Dan(),Pun(Gk(Grt,1),$Vn,406,0,[Rrt,Nrt,xrt,Drt])))}function i7(){i7=O,zrt=lhn((Hpn(),Pun(Gk(Urt,1),$Vn,323,0,[Brt,Frt,Hrt,qrt])))}function r7(){r7=O,ict=lhn((qpn(),Pun(Gk(cct,1),$Vn,394,0,[Zrt,Jrt,nct,tct])))}function c7(){c7=O,Hyt=lhn((zyn(),Pun(Gk(qyt,1),$Vn,393,0,[Ryt,Kyt,_yt,Fyt])))}function a7(){a7=O,ost=lhn((Iun(),Pun(Gk(pst,1),$Vn,360,0,[ast,rst,cst,ist])))}function u7(){u7=O,zjt=lhn((Omn(),Pun(Gk(Vjt,1),$Vn,340,0,[qjt,Bjt,Hjt,Fjt])))}function o7(){o7=O,Est=lhn((Oun(),Pun(Gk(Ist,1),$Vn,411,0,[vst,mst,yst,kst])))}function s7(){s7=O,dvt=lhn((bvn(),Pun(Gk(kvt,1),$Vn,197,0,[lvt,bvt,fvt,hvt])))}function h7(){h7=O,fOt=lhn((Bsn(),Pun(Gk(wOt,1),$Vn,396,0,[uOt,oOt,aOt,sOt])))}function f7(){f7=O,PCt=lhn((Xyn(),Pun(Gk(RCt,1),$Vn,285,0,[MCt,jCt,ECt,TCt])))}function l7(){l7=O,tCt=lhn((Mbn(),Pun(Gk(oCt,1),$Vn,218,0,[ZPt,YPt,QPt,JPt])))}function b7(){b7=O,rOt=lhn((Fwn(),Pun(Gk(cOt,1),$Vn,311,0,[eOt,ZIt,tOt,nOt])))}function w7(){w7=O,BIt=lhn((mdn(),Pun(Gk(YIt,1),$Vn,374,0,[KIt,_It,RIt,DIt])))}function d7(){d7=O,qBn(),HLt=RQn,BLt=KQn,GLt=new Nb(RQn),qLt=new Nb(KQn)}function g7(){g7=O,Ght=new OP(QZn,0),qht=new OP("IMPROVE_STRAIGHTNESS",1)}function p7(n,t){return hH(),WB(n,new rI(t,iln(t.e.c.length+t.g.c.length)))}function v7(n,t){return hH(),WB(n,new rI(t,iln(t.e.c.length+t.g.c.length)))}function m7(n,t){return 10!=vnn(t)&&Pun(tsn(t),t.hm,t.__elementTypeId$,vnn(t),n),n}function y7(n,t){var e;return-1!=(e=E7(n,t,0))&&(s6(n,e),!0)}function k7(n,t){var e;return(e=BB(v6(n.e,t),387))?(RH(e),e.e):null}function j7(n){var t;return JO(n)&&(t=0-n,!isNaN(t))?t:uan(aon(n))}function E7(n,t,e){for(;e<n.c.length;++e)if(cV(t,n.c[e]))return e;return-1}function T7(n,t,e){var i;return EW(n),(i=new sn).a=t,n.a.Nb(new IS(i,e)),i.a}function M7(n){var t;return EW(n),t=x8(xNt,qQn,25,0,15,1),gE(n.a,new ww(t)),t}function S7(n){var t;return t=BB(xq(n.j,0),11),BB(mMn(t,(hWn(),dlt)),11)}function P7(n){var t;if(!Zin(n))throw Hp(new yv);return n.e=1,t=n.d,n.d=null,t}function C7(n,t){var e;this.f=n,this.b=t,e=BB(RX(n.b,t),283),this.c=e?e.b:null}function I7(){G_(),this.b=new xp,this.f=new xp,this.g=new xp,this.e=new xp}function O7(n,t){this.a=x8(Out,a1n,10,n.a.c.length,0,1),Qgn(n.a,this.a),this.b=t}function A7(n){var t;for(t=n.p+1;t<n.c.a.c.length;++t)--BB(xq(n.c.a,t),10).p}function $7(n){var t;null!=(t=n.Ai())&&-1!=n.d&&BB(t,92).Ng(n),n.i&&n.i.Fi()}function L7(n){V$(this),this.g=n?CY(n,n.$d()):null,this.f=n,jQ(this),this._d()}function N7(n,t,e,i,r,c,a){kin.call(this,t,i,r,c,a),Fh(this),this.c=n,this.b=e}function x7(n,t,e,i,r){return kW(n),kW(t),kW(e),kW(i),kW(r),new jU(n,t,i)}function D7(n,t){if(t<0)throw Hp(new Ay(n5n+t));return g3(n,t+1),xq(n.j,t)}function R7(n,t,e,i){if(!n)throw Hp(new _y($Rn(t,Pun(Gk(Ant,1),HWn,1,5,[e,i]))))}function K7(n,t){return cV(t,xq(n.f,0))||cV(t,xq(n.f,1))||cV(t,xq(n.f,2))}function _7(n,t){LK(BB(BB(n.f,33).We((sWn(),uPt)),98))&&Qbn(yV(BB(n.f,33)),t)}function F7(n,t){var e,i;return!(i=(e=BB(t,675)).Oh())&&e.Rh(i=new RI(n,t)),i}function B7(n,t){var e,i;return!(i=(e=BB(t,677)).pk())&&e.tk(i=new K0(n,t)),i}function H7(n){return n.b||(n.b=new JG(n,VAt,n),!n.a&&(n.a=new oR(n,n))),n.b}function q7(){q7=O,Oat=new WS("XY",0),Iat=new WS("X",1),Aat=new WS("Y",2)}function G7(){G7=O,crt=new zS("TOP",0),rrt=new zS(eJn,1),irt=new zS(oJn,2)}function z7(){z7=O,Pft=new xP(QZn,0),Cft=new xP("TOP",1),Sft=new xP(oJn,2)}function U7(){U7=O,Kvt=new GP("INPUT_ORDER",0),_vt=new GP("PORT_DEGREE",1)}function X7(){X7=O,btt=M$(SQn,SQn,524287),wtt=M$(0,0,CQn),dtt=F5(1),F5(2),gtt=F5(0)}function W7(n,t,e){n.a.c=x8(Ant,HWn,1,0,5,1),Xqn(n,t,e),0==n.a.c.length||f_n(n,t)}function V7(n){var t,e;return YU(n,0,e=n.length,t=x8(ONt,WVn,25,e,15,1),0),t}function Q7(n){var t;return n.dh()||(t=bX(n.Tg())-n.Ah(),n.ph().bk(t)),n.Pg()}function Y7(n){var t;return null==(t=een(yan(n,32)))&&(fgn(n),t=een(yan(n,32))),t}function J7(n,t){var e;return(e=Awn(n.d,t))>=0?Zpn(n,e,!0,!0):cOn(n,t,!0)}function Z7(n,t){var e,i;return MM(),e=f3(n),i=f3(t),!!e&&!!i&&!Kpn(e.k,i.k)}function nnn(n,t){Pen(n,null==t||WK((kW(t),t))||isNaN((kW(t),t))?0:(kW(t),t))}function tnn(n,t){Cen(n,null==t||WK((kW(t),t))||isNaN((kW(t),t))?0:(kW(t),t))}function enn(n,t){Sen(n,null==t||WK((kW(t),t))||isNaN((kW(t),t))?0:(kW(t),t))}function inn(n,t){Men(n,null==t||WK((kW(t),t))||isNaN((kW(t),t))?0:(kW(t),t))}function rnn(n){(this.q?this.q:(SQ(),SQ(),het)).Ac(n.q?n.q:(SQ(),SQ(),het))}function cnn(n,t){return cL(t,99)&&0!=(BB(t,18).Bb&BQn)?new xO(t,n):new Aan(t,n)}function ann(n,t){return cL(t,99)&&0!=(BB(t,18).Bb&BQn)?new xO(t,n):new Aan(t,n)}function unn(n,t){Vrt=new it,ect=t,BB((Wrt=n).b,65),K8(Wrt,Vrt,null),uqn(Wrt)}function onn(n,t,e){var i;return i=n.g[t],jL(n,t,n.oi(t,e)),n.gi(t,e,i),n.ci(),i}function snn(n,t){var e;return(e=n.Xc(t))>=0&&(n.$c(e),!0)}function hnn(n){var t;return n.d!=n.r&&(t=Ikn(n),n.e=!!t&&t.Cj()==E9n,n.d=t),n.e}function fnn(n,t){var e;for(yX(n),yX(t),e=!1;t.Ob();)e|=n.Fc(t.Pb());return e}function lnn(n,t){var e;return(e=BB(RX(n.e,t),387))?(uL(n,e),e.e):null}function bnn(n){var t,e;return t=n/60|0,0==(e=n%60)?""+t:t+":"+e}function wnn(n,t){return Qln(n),new Rq(n,new KK(new M6(t,n.a)))}function dnn(n,t){var e=n.a[t],i=(Zun(),ftt)[typeof e];return i?i(e):khn(typeof e)}function gnn(n){switch(n.g){case 0:return DWn;case 1:return-1;default:return 0}}function pnn(n){return Kkn(n,(X7(),gtt))<0?-CN(aon(n)):n.l+n.m*IQn+n.h*OQn}function vnn(n){return null==n.__elementTypeCategory$?10:n.__elementTypeCategory$}function mnn(n){var t;return null!=(t=0==n.b.c.length?null:xq(n.b,0))&&hrn(n,0),t}function ynn(n,t){for(;t[0]<n.length&&GO(" \t\r\n",YTn(fV(n,t[0])))>=0;)++t[0]}function knn(n,t){this.e=t,this.a=Van(n),this.a<54?this.f=j2(n):this.c=npn(n)}function jnn(n,t,e,i){wWn(),Ap.call(this,26),this.c=n,this.a=t,this.d=e,this.b=i}function Enn(n,t,e){var i,r;for(i=10,r=0;r<e-1;r++)t<i&&(n.a+="0"),i*=10;n.a+=t}function Tnn(n,t){var e;for(e=0;n.e!=n.i.gc();)gq(t,kpn(n),iln(e)),e!=DWn&&++e}function Mnn(n,t){var e;for(++n.d,++n.c[t],e=t+1;e<n.a.length;)++n.a[e],e+=e&-e}function Snn(n,t){var e,i,r;r=t.c.i,i=(e=BB(RX(n.f,r),57)).d.c-e.e.c,Yrn(t.a,i,0)}function Pnn(n){var t,e;return t=n+128,!(e=(jq(),jtt)[t])&&(e=jtt[t]=new $b(n)),e}function Cnn(n,t){var e;return kW(t),xnn(!!(e=n[":"+t]),Pun(Gk(Ant,1),HWn,1,5,[t])),e}function Inn(n){var t,e;if(n.b){e=null;do{t=n.b,n.b=null,e=sPn(t,e)}while(n.b);n.b=e}}function Onn(n){var t,e;if(n.a){e=null;do{t=n.a,n.a=null,e=sPn(t,e)}while(n.a);n.a=e}}function Ann(n){var t;for(++n.a,t=n.c.a.length;n.a<t;++n.a)if(n.c.b[n.a])return}function $nn(n,t){var e,i;for(e=(i=t.c)+1;e<=t.f;e++)n.a[e]>n.a[i]&&(i=e);return i}function Lnn(n,t){var e;return 0==(e=Ibn(n.e.c,t.e.c))?Pln(n.e.d,t.e.d):e}function Nnn(n,t){return 0==t.e||0==n.e?eet:($On(),ANn(n,t))}function xnn(n,t){if(!n)throw Hp(new _y(YNn("Enum constant undefined: %s",t)))}function Dnn(){Dnn=O,uut=new St,out=new Tt,cut=new At,aut=new $t,sut=new Lt}function Rnn(){Rnn=O,vit=new BS("BY_SIZE",0),mit=new BS("BY_SIZE_AND_SHAPE",1)}function Knn(){Knn=O,Dct=new XS("EADES",0),Rct=new XS("FRUCHTERMAN_REINGOLD",1)}function _nn(){_nn=O,Sht=new PP("READING_DIRECTION",0),Pht=new PP("ROTATION",1)}function Fnn(){Fnn=O,Mht=lhn((Vvn(),Pun(Gk(Cht,1),$Vn,335,0,[yht,mht,jht,Eht,kht])))}function Bnn(){Bnn=O,jvt=lhn((Nvn(),Pun(Gk(Avt,1),$Vn,315,0,[yvt,pvt,vvt,gvt,mvt])))}function Hnn(){Hnn=O,Ost=lhn((LEn(),Pun(Gk(Kst,1),$Vn,363,0,[Mst,Pst,Cst,Sst,Tst])))}function qnn(){qnn=O,zlt=lhn((Tbn(),Pun(Gk(ivt,1),$Vn,163,0,[qlt,_lt,Flt,Blt,Hlt])))}function Gnn(){Gnn=O,sTt=lhn(($Sn(),Pun(Gk(zTt,1),$Vn,316,0,[iTt,rTt,uTt,cTt,aTt])))}function znn(){znn=O,bMt=lhn((rpn(),Pun(Gk(jMt,1),$Vn,175,0,[hMt,sMt,uMt,fMt,oMt])))}function Unn(){Unn=O,BEt=lhn((YLn(),Pun(Gk(zEt,1),$Vn,355,0,[DEt,xEt,KEt,REt,_Et])))}function Xnn(){Xnn=O,qat=lhn((yMn(),Pun(Gk(Uat,1),$Vn,356,0,[Rat,Kat,_at,Fat,Bat])))}function Wnn(){Wnn=O,GPt=lhn((Ffn(),Pun(Gk(WPt,1),$Vn,103,0,[BPt,FPt,_Pt,KPt,HPt])))}function Vnn(){Vnn=O,zCt=lhn((cpn(),Pun(Gk(JCt,1),$Vn,249,0,[BCt,qCt,_Ct,FCt,HCt])))}function Qnn(){Qnn=O,OIt=lhn((kUn(),Pun(Gk(FIt,1),YZn,61,0,[PIt,sIt,oIt,SIt,CIt])))}function Ynn(n,t){var e;return(e=BB(RX(n.a,t),134))||(e=new Zn,VW(n.a,t,e)),e}function Jnn(n){var t;return!!(t=BB(mMn(n,(hWn(),Rft)),305))&&t.a==n}function Znn(n){var t;return!!(t=BB(mMn(n,(hWn(),Rft)),305))&&t.i==n}function ntn(n,t){return kW(t),Dz(n),!!n.d.Ob()&&(t.td(n.d.Pb()),!0)}function ttn(n){return Vhn(n,DWn)>0?DWn:Vhn(n,_Vn)<0?_Vn:dG(n)}function etn(n){return n<3?(lin(n,IVn),n+1):n<OVn?CJ(n/.75+1):DWn}function itn(n,t){var e;return null==n.i&&qFn(n),e=n.i,t>=0&&t<e.length?e[t]:null}function rtn(n,t,e){var i;if(null==t)throw Hp(new gv);return i=zJ(n,t),i4(n,t,e),i}function ctn(n){return n.a>=-.01&&n.a<=fJn&&(n.a=0),n.b>=-.01&&n.b<=fJn&&(n.b=0),n}function atn(n,t){return t==(c_(),c_(),Met)?n.toLocaleLowerCase():n.toLowerCase()}function utn(n){return(0!=(2&n.i)?"interface ":0!=(1&n.i)?"":"class ")+(ED(n),n.o)}function otn(n){var t;t=new $m,f9((!n.q&&(n.q=new eU(QAt,n,11,10)),n.q),t)}function stn(n,t){var e;return e=t>0?t-1:t,$j(Lj(Fen(LH(new Xm,e),n.n),n.j),n.k)}function htn(n,t,e,i){n.j=-1,qOn(n,EPn(n,t,e),(ZM(),BB(t,66).Mj().Ok(i)))}function ftn(n){this.g=n,this.f=new Np,this.a=e.Math.min(this.g.c.c,this.g.d.c)}function ltn(n){this.b=new Np,this.a=new Np,this.c=new Np,this.d=new Np,this.e=n}function btn(n,t){this.a=new xp,this.e=new xp,this.b=(Mhn(),uvt),this.c=n,this.b=t}function wtn(n,t,e){NR.call(this),xtn(this),this.a=n,this.c=e,this.b=t.d,this.f=t.e}function dtn(n){this.d=n,this.c=n.c.vc().Kc(),this.b=null,this.a=null,this.e=(ry(),znt)}function gtn(n){if(n<0)throw Hp(new _y("Illegal Capacity: "+n));this.g=this.ri(n)}function ptn(n,t){if(0>n||n>t)throw Hp(new Tk("fromIndex: 0, toIndex: "+n+hYn+t))}function vtn(n){var t;if(n.a==n.b.a)throw Hp(new yv);return t=n.a,n.c=t,n.a=n.a.e,t}function mtn(n){var t;Mx(!!n.c),t=n.c.a,Atn(n.d,n.c),n.b==n.c?n.b=t:--n.a,n.c=null}function ytn(n,t){var e;return Qln(n),e=new vQ(n,n.a.rd(),4|n.a.qd(),t),new Rq(n,e)}function ktn(n,t){var e,i;return(e=BB(lfn(n.d,t),14))?(i=t,n.e.pc(i,e)):null}function jtn(n,t){var e;for(e=n.Kc();e.Ob();)hon(BB(e.Pb(),70),(hWn(),ult),t)}function Etn(n){var t;return(t=Gy(MD(mMn(n,(HXn(),agt)))))<0&&hon(n,agt,t=0),t}function Ttn(n,t,i){var r;Fkn(i,r=e.Math.max(0,n.b/2-.5),1),WB(t,new iP(i,r))}function Mtn(n,t,e){return CJ(HH(n.a.e[BB(t.a,10).p]-n.a.e[BB(e.a,10).p]))}function Stn(n,t,e,i,r,c){var a;SZ(a=W5(i),r),MZ(a,c),JIn(n.a,i,new L_(a,t,e.f))}function Ptn(n,t){var e;if(!(e=NNn(n.Tg(),t)))throw Hp(new _y(r6n+t+u6n));return e}function Ctn(n,t){var e;for(e=n;JJ(e);)if((e=JJ(e))==t)return!0;return!1}function Itn(n,t){var e,i,r;for(i=t.a.cd(),e=BB(t.a.dd(),14).gc(),r=0;r<e;r++)n.td(i)}function Otn(n,t){var e,i,r,c;for(kW(t),r=0,c=(i=n.c).length;r<c;++r)e=i[r],t.td(e)}function Atn(n,t){var e;return e=t.c,t.a.b=t.b,t.b.a=t.a,t.a=t.b=null,t.c=null,--n.b,e}function $tn(n,t){return!(!t||n.b[t.g]!=t||($X(n.b,t.g,null),--n.c,0))}function Ltn(n,t){return!!Zrn(n,t,dG(cbn(SVn,rV(dG(cbn(null==t?0:nsn(t),PVn)),15))))}function Ntn(n,t){LK(BB(mMn(BB(n.e,10),(HXn(),ept)),98))&&(SQ(),m$(BB(n.e,10).j,t))}function xtn(n){n.b=(J9(),Qit),n.f=(G7(),rrt),n.d=(lin(2,AVn),new J6(2)),n.e=new Gj}function Dtn(){Dtn=O,Git=new qS("BEGIN",0),zit=new qS(eJn,1),Uit=new qS("END",2)}function Rtn(){Rtn=O,zPt=new _C(eJn,0),UPt=new _C("HEAD",1),XPt=new _C("TAIL",2)}function Ktn(){return hAn(),Pun(Gk(aAt,1),$Vn,237,0,[iAt,nAt,tAt,ZOt,eAt,YOt,QOt,JOt])}function _tn(){return PPn(),Pun(Gk(SMt,1),$Vn,277,0,[kMt,wMt,vMt,yMt,dMt,gMt,pMt,mMt])}function Ftn(){return kDn(),Pun(Gk(iht,1),$Vn,270,0,[Bst,Gst,Fst,Xst,qst,Hst,Ust,zst])}function Btn(){return sNn(),Pun(Gk(Dvt,1),$Vn,260,0,[Ivt,Tvt,Pvt,Mvt,Svt,Evt,Cvt,Ovt])}function Htn(){Htn=O,ZCt=lhn((QEn(),Pun(Gk(aIt,1),$Vn,98,0,[YCt,QCt,VCt,UCt,WCt,XCt])))}function qtn(){qtn=O,nrt=(Dtn(),Pun(Gk(Vit,1),$Vn,232,0,[Git,zit,Uit])).length,Zit=nrt}function Gtn(n){this.b=(yX(n),new t_(n)),this.a=new Np,this.d=new Np,this.e=new Gj}function ztn(n){var t;return(t=e.Math.sqrt(n.a*n.a+n.b*n.b))>0&&(n.a/=t,n.b/=t),n}function Utn(n){var t;return n.w?n.w:((t=V1(n))&&!t.kh()&&(n.w=t),t)}function Xtn(n){var t;return null==n?null:VTn(t=BB(n,190),t.length)}function Wtn(n,t){if(null==n.g||t>=n.i)throw Hp(new LO(t,n.i));return n.li(t,n.g[t])}function Vtn(n){var t,e;for(t=n.a.d.j,e=n.c.d.j;t!=e;)orn(n.b,t),t=Mln(t);orn(n.b,t)}function Qtn(n){var t;for(t=0;t<n.c.length;t++)(l1(t,n.c.length),BB(n.c[t],11)).p=t}function Ytn(n,t,e){var i,r,c;for(r=t[e],i=0;i<r.length;i++)c=r[i],n.e[c.c.p][c.p]=i}function Jtn(n,t){var e,i,r,c;for(r=0,c=(i=n.d).length;r<c;++r)e=i[r],lL(n.g,e).a=t}function Ztn(n,t){var e;for(e=spn(n,0);e.b!=e.d.c;)UR(BB(b3(e),8),t);return n}function nen(n,t){return XR(B$(BB(RX(n.g,t),8)),_$(BB(RX(n.f,t),460).b))}function ten(n){var t;return p2(n.e,n),Px(n.b),n.c=n.a,t=BB(n.a.Pb(),42),n.b=dun(n),t}function een(n){var t;return JH(null==n||Array.isArray(n)&&!((t=vnn(n))>=14&&t<=16)),n}function ien(n,t,e){var i=function(){return n.apply(i,arguments)};return t.apply(i,e),i}function ren(n,t,e){var i,r;i=t;do{r=Gy(n.p[i.p])+e,n.p[i.p]=r,i=n.a[i.p]}while(i!=t)}function cen(n,t){var e,i;i=n.a,e=Qfn(n,t,null),i!=t&&!n.e&&(e=azn(n,t,e)),e&&e.Fi()}function aen(n,t){return h$(),rin(KVn),e.Math.abs(n-t)<=KVn||n==t||isNaN(n)&&isNaN(t)}function uen(n,t){return h$(),rin(KVn),e.Math.abs(n-t)<=KVn||n==t||isNaN(n)&&isNaN(t)}function oen(n,t){return _Mn(),E$(n.b.c.length-n.e.c.length,t.b.c.length-t.e.c.length)}function sen(n,t){return Zj(Jrn(n,t,dG(cbn(SVn,rV(dG(cbn(null==t?0:nsn(t),PVn)),15)))))}function hen(){hen=O,Aut=lhn((uSn(),Pun(Gk($ut,1),$Vn,267,0,[Cut,Put,Mut,Iut,Sut,Tut])))}function fen(){fen=O,tSt=lhn((wEn(),Pun(Gk(qPt,1),$Vn,291,0,[ZMt,JMt,YMt,VMt,WMt,QMt])))}function len(){len=O,xMt=lhn((wvn(),Pun(Gk(nSt,1),$Vn,248,0,[CMt,AMt,$Mt,LMt,IMt,OMt])))}function ben(){ben=O,rht=lhn(($Pn(),Pun(Gk(uht,1),$Vn,227,0,[Zst,tht,Jst,nht,eht,Yst])))}function wen(){wen=O,oft=lhn((JMn(),Pun(Gk(mft,1),$Vn,275,0,[cft,eft,aft,rft,ift,tft])))}function den(){den=O,nft=lhn((Bjn(),Pun(Gk(uft,1),$Vn,274,0,[Qht,Vht,Jht,Wht,Yht,Xht])))}function gen(){gen=O,rvt=lhn((TTn(),Pun(Gk(ovt,1),$Vn,313,0,[tvt,Zpt,Ypt,Jpt,evt,nvt])))}function pen(){pen=O,Hht=lhn((gSn(),Pun(Gk(zht,1),$Vn,276,0,[Dht,xht,Kht,Rht,Fht,_ht])))}function ven(){ven=O,Jyt=lhn((DPn(),Pun(Gk(_kt,1),$Vn,327,0,[Qyt,Uyt,Wyt,Xyt,Vyt,zyt])))}function men(){men=O,uIt=lhn((lIn(),Pun(Gk(IIt,1),$Vn,273,0,[rIt,eIt,iIt,tIt,nIt,cIt])))}function yen(){yen=O,sCt=lhn((nMn(),Pun(Gk(yCt,1),$Vn,312,0,[aCt,rCt,uCt,eCt,cCt,iCt])))}function ken(){return n$n(),Pun(Gk(GCt,1),$Vn,93,0,[ICt,CCt,ACt,DCt,xCt,NCt,$Ct,LCt,OCt])}function jen(n,t){var e;e=n.a,n.a=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new f4(n,0,e,n.a))}function Een(n,t){var e;e=n.b,n.b=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new f4(n,1,e,n.b))}function Ten(n,t){var e;e=n.b,n.b=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new f4(n,3,e,n.b))}function Men(n,t){var e;e=n.f,n.f=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new f4(n,3,e,n.f))}function Sen(n,t){var e;e=n.g,n.g=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new f4(n,4,e,n.g))}function Pen(n,t){var e;e=n.i,n.i=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new f4(n,5,e,n.i))}function Cen(n,t){var e;e=n.j,n.j=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new f4(n,6,e,n.j))}function Ien(n,t){var e;e=n.j,n.j=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new f4(n,1,e,n.j))}function Oen(n,t){var e;e=n.c,n.c=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new f4(n,4,e,n.c))}function Aen(n,t){var e;e=n.k,n.k=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new f4(n,2,e,n.k))}function $en(n,t){var e;e=n.d,n.d=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new l4(n,2,e,n.d))}function Len(n,t){var e;e=n.s,n.s=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new l4(n,4,e,n.s))}function Nen(n,t){var e;e=n.t,n.t=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new l4(n,5,e,n.t))}function xen(n,t){var e;e=n.F,n.F=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,5,e,t))}function Den(n,t){var e;return(e=BB(RX((nS(),mAt),n),55))?e.xj(t):x8(Ant,HWn,1,t,5,1)}function Ren(n,t){var e;return t in n.a&&(e=zJ(n,t).he())?e.a:null}function Ken(n,t){var e,i;return tE(),i=new uo,!!t&&INn(i,t),xin(e=i,n),e}function _en(n,t,e){if(xsn(n,e),!n.Bk()&&null!=e&&!n.wj(e))throw Hp(new lv);return e}function Fen(n,t){return n.n=t,n.n?(n.f=new Np,n.e=new Np):(n.f=null,n.e=null),n}function Ben(n,t,e,i,r,c){var a;return Qen(e,a=mX(n,t)),a.i=r?8:0,a.f=i,a.e=r,a.g=c,a}function Hen(n,t,e,i,r){this.d=t,this.k=i,this.f=r,this.o=-1,this.p=1,this.c=n,this.a=e}function qen(n,t,e,i,r){this.d=t,this.k=i,this.f=r,this.o=-1,this.p=2,this.c=n,this.a=e}function Gen(n,t,e,i,r){this.d=t,this.k=i,this.f=r,this.o=-1,this.p=6,this.c=n,this.a=e}function zen(n,t,e,i,r){this.d=t,this.k=i,this.f=r,this.o=-1,this.p=7,this.c=n,this.a=e}function Uen(n,t,e,i,r){this.d=t,this.j=i,this.e=r,this.o=-1,this.p=4,this.c=n,this.a=e}function Xen(n,t){var e,i,r,c;for(r=0,c=(i=t).length;r<c;++r)e=i[r],V9(n.a,e);return n}function Wen(n){var t,e,i;for(e=0,i=(t=n).length;e<i;++e)yX(t[e]);return new AO(n)}function Ven(n){var t=/function(?:\s+([\w$]+))?\s*\(/.exec(n);return t&&t[1]||zVn}function Qen(n,t){if(n){t.n=n;var e=UJ(t);e?e.gm=t:SWn[n]=[t]}}function Yen(n,t,i){var r;return r=n.length,_Cn(n,0,t,0,e.Math.min(i,r),!0),t}function Jen(n,t,e){var i,r;for(r=t.Kc();r.Ob();)i=BB(r.Pb(),79),TU(n,BB(e.Kb(i),33))}function Zen(){YE();for(var n=PWn,t=0;t<arguments.length;t++)n.push(arguments[t])}function nin(n,t){var e,i,r;for(i=0,r=(e=t).length;i<r;++i)r5(n,e[i],n.c.b,n.c)}function tin(n,t){n.b=e.Math.max(n.b,t.d),n.e+=t.r+(0==n.a.c.length?0:n.c),WB(n.a,t)}function ein(n){Mx(n.c>=0),rgn(n.d,n.c)<0&&(n.a=n.a-1&n.d.a.length-1,n.b=n.d.c),n.c=-1}function iin(n){return n.a<54?n.f<0?-1:n.f>0?1:0:(!n.c&&(n.c=yhn(n.f)),n.c).e}function rin(n){if(!(n>=0))throw Hp(new _y("tolerance ("+n+") must be >= 0"));return n}function cin(){return cMt||ksn(cMt=new ORn,Pun(Gk(_it,1),HWn,130,0,[new Nf])),cMt}function ain(){ain=O,Gvt=new zP(hJn,0),Hvt=new zP("INPUT",1),qvt=new zP("OUTPUT",2)}function uin(){uin=O,wht=new MP("ARD",0),ght=new MP("MSD",1),dht=new MP("MANUAL",2)}function oin(){oin=O,Omt=new YP("BARYCENTER",0),Amt=new YP(E1n,1),$mt=new YP(T1n,2)}function sin(n,t){var e;if(e=n.gc(),t<0||t>e)throw Hp(new tK(t,e));return new RK(n,t)}function hin(n,t){var e;return cL(t,42)?n.c.Mc(t):(e=rdn(n,t),Wdn(n,t),e)}function fin(n,t,e){return Ihn(n,t),Nrn(n,e),Len(n,0),Nen(n,1),nln(n,!0),Yfn(n,!0),n}function lin(n,t){if(n<0)throw Hp(new _y(t+" cannot be negative but was: "+n));return n}function bin(n,t){var e,i;for(e=0,i=n.gc();e<i;++e)if(cV(t,n.Xb(e)))return e;return-1}function win(n){var t;for(t=n.c.Cc().Kc();t.Ob();)BB(t.Pb(),14).$b();n.c.$b(),n.d=0}function din(n){var t,e,i,r;for(i=0,r=(e=n.a).length;i<r;++i)QU(t=e[i],t.length,null)}function gin(n){var t,e;if(0==n)return 32;for(e=0,t=1;0==(t&n);t<<=1)++e;return e}function pin(n){var t;for(t=new Wb(eyn(n));t.a<t.c.c.length;)BB(n0(t),680).Gf()}function vin(n){vM(),this.g=new xp,this.f=new xp,this.b=new xp,this.c=new pJ,this.i=n}function min(){this.f=new Gj,this.d=new wm,this.c=new Gj,this.a=new Np,this.b=new Np}function yin(n,t,e,i){this.rj(),this.a=t,this.b=n,this.c=null,this.c=new lK(this,t,e,i)}function kin(n,t,e,i,r){this.d=n,this.n=t,this.g=e,this.o=i,this.p=-1,r||(this.o=-2-i-1)}function jin(){OL.call(this),this.n=-1,this.g=null,this.i=null,this.j=null,this.Bb|=k6n}function Ein(){return n_n(),Pun(Gk(iOt,1),$Vn,259,0,[GIt,UIt,qIt,XIt,WIt,QIt,VIt,zIt,HIt])}function Tin(){return tRn(),Pun(Gk(Bit,1),$Vn,250,0,[Rit,$it,Lit,Ait,xit,Dit,Nit,Oit,Iit])}function Min(){Min=O,Ott=Pun(Gk(ANt,1),hQn,25,15,[0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15])}function Sin(){Sin=O,kmt=dq(dq(dq(new B2,(yMn(),Rat),(lWn(),cot)),Kat,Oot),_at,Iot)}function Pin(){Pin=O,jmt=dq(dq(dq(new B2,(yMn(),Rat),(lWn(),cot)),Kat,Oot),_at,Iot)}function Cin(){Cin=O,Mmt=dq(dq(dq(new B2,(yMn(),Rat),(lWn(),cot)),Kat,Oot),_at,Iot)}function Iin(){Iin=O,Cmt=WG(dq(dq(new B2,(yMn(),_at),(lWn(),Lot)),Fat,Eot),Bat,$ot)}function Oin(){Oin=O,hht=new TP("LAYER_SWEEP",0),sht=new TP(B1n,1),fht=new TP(QZn,2)}function Ain(n,t){var e,i;return e=n.c,(i=t.e[n.p])>0?BB(xq(e.a,i-1),10):null}function $in(n,t){var e;e=n.k,n.k=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,2,e,n.k))}function Lin(n,t){var e;e=n.f,n.f=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,8,e,n.f))}function Nin(n,t){var e;e=n.i,n.i=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,7,e,n.i))}function xin(n,t){var e;e=n.a,n.a=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,8,e,n.a))}function Din(n,t){var e;e=n.b,n.b=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,0,e,n.b))}function Rin(n,t){var e;e=n.b,n.b=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,0,e,n.b))}function Kin(n,t){var e;e=n.c,n.c=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,1,e,n.c))}function _in(n,t){var e;e=n.c,n.c=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,1,e,n.c))}function Fin(n,t){var e;e=n.c,n.c=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,4,e,n.c))}function Bin(n,t){var e;e=n.d,n.d=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,1,e,n.d))}function Hin(n,t){var e;e=n.D,n.D=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,2,e,n.D))}function qin(n,t){n.r>0&&n.c<n.r&&(n.c+=t,n.i&&n.i.d>0&&0!=n.g&&qin(n.i,t/n.r*n.i.d))}function Gin(n,t,e){var i;n.b=t,n.a=e,i=512==(512&n.a)?new Fm:new Dh,n.c=MDn(i,n.b,n.a)}function zin(n,t){return $xn(n.e,t)?(ZM(),hnn(t)?new lq(t,n):new xI(t,n)):new KI(t,n)}function Uin(n,t){return Jj(Zrn(n.a,t,dG(cbn(SVn,rV(dG(cbn(null==t?0:nsn(t),PVn)),15)))))}function Xin(n,t,e){return x7(n,new fw(t),new un,new lw(e),Pun(Gk(nit,1),$Vn,132,0,[]))}function Win(n){return 0>n?new VT:new $D(null,new m5(n+1,n))}function Vin(n,t){var e;return SQ(),e=new XT(1),XI(n)?mZ(e,n,t):jCn(e.f,n,t),new Xb(e)}function Qin(n,t){var e,i;return(e=n.o+n.p)<(i=t.o+t.p)?-1:e==i?0:1}function Yin(n){var t;return cL(t=mMn(n,(hWn(),dlt)),160)?mwn(BB(t,160)):null}function Jin(n){var t;return(n=e.Math.max(n,2))>(t=kon(n))?(t<<=1)>0?t:OVn:t}function Zin(n){switch(uN(3!=n.e),n.e){case 2:return!1;case 0:return!0}return _5(n)}function nrn(n,t){var e;return!!cL(t,8)&&(e=BB(t,8),n.a==e.a&&n.b==e.b)}function trn(n,t,e){var i,r;return r=t>>5,i=31&t,e0(jz(n.n[e][r],dG(yz(i,1))),3)}function ern(n,t){var e,i;for(i=t.vc().Kc();i.Ob();)vjn(n,(e=BB(i.Pb(),42)).cd(),e.dd())}function irn(n,t){var e;e=new it,BB(t.b,65),BB(t.b,65),BB(t.b,65),Otn(t.a,new TB(n,e,t))}function rrn(n,t){var e;e=n.b,n.b=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,21,e,n.b))}function crn(n,t){var e;e=n.d,n.d=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,11,e,n.d))}function arn(n,t){var e;e=n.j,n.j=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,13,e,n.j))}function urn(n,t,e){var i,r,c;for(c=n.a.length-1,r=n.b,i=0;i<e;r=r+1&c,++i)$X(t,i,n.a[r])}function orn(n,t){var e;return kW(t),e=t.g,!n.b[e]&&($X(n.b,e,t),++n.c,!0)}function srn(n,t){var e;return!((e=null==t?-1:E7(n.b,t,0))<0||(hrn(n,e),0))}function hrn(n,t){var e;e=s6(n.b,n.b.c.length-1),t<n.b.c.length&&(c5(n.b,t,e),KCn(n,t))}function frn(n,t){0==(k5(),Qet?null:t.c).length&&zD(t,new X),mZ(n.a,Qet?null:t.c,t)}function lrn(n,t){OTn(t,"Hierarchical port constraint processing",1),bpn(n),YXn(n),HSn(t)}function brn(n,t){var e,i;for(i=t.Kc();i.Ob();)e=BB(i.Pb(),266),n.b=!0,TU(n.e,e),e.b=n}function wrn(n,t){var e,i;return e=1-t,i=n.a[e],n.a[e]=i.a[t],i.a[t]=n,n.b=!0,i.b=!1,i}function drn(n,t){var e,i;return e=BB(mMn(n,(HXn(),spt)),8),i=BB(mMn(t,spt),8),Pln(e.b,i.b)}function grn(n){RG.call(this),this.b=Gy(MD(mMn(n,(HXn(),ypt)))),this.a=BB(mMn(n,Zdt),218)}function prn(n,t,e){G2.call(this,n,t,e),this.a=new xp,this.b=new xp,this.d=new Wd(this)}function vrn(n){this.e=n,this.d=new bE(etn(gz(this.e).gc())),this.c=this.e.a,this.b=this.e.c}function mrn(n){this.b=n,this.a=x8(ANt,hQn,25,n+1,15,1),this.c=x8(ANt,hQn,25,n,15,1),this.d=0}function yrn(n,t,e){var i;return jxn(n,t,i=new Np,e,!0,!0),n.b=new mrn(i.c.length),i}function krn(n,t){var e;return(e=BB(RX(n.c,t),458))||((e=new cm).c=t,VW(n.c,e.c,e)),e}function jrn(n,t){var e=n.a,i=0;for(var r in e)e.hasOwnProperty(r)&&(t[i++]=r);return t}function Ern(n){return null==n.b?(YM(),YM(),x$t):n.Lk()?n.Kk():n.Jk()}function Trn(n){var t,e;for(e=new AL(n);e.e!=e.i.gc();)Pen(t=BB(kpn(e),33),0),Cen(t,0)}function Mrn(){Mrn=O,sat=new up(OZn),hat=new up(AZn),oat=new up($Zn),uat=new up(LZn)}function Srn(){Srn=O,qut=new ZS("TO_INTERNAL_LTR",0),Hut=new ZS("TO_INPUT_DIRECTION",1)}function Prn(){Prn=O,Qkt=new dC("P1_NODE_PLACEMENT",0),Ykt=new dC("P2_EDGE_ROUTING",1)}function Crn(){Crn=O,Rst=new kP("START",0),Dst=new kP("MIDDLE",1),xst=new kP("END",2)}function Irn(){Irn=O,tst=new iR("edgelabelcenterednessanalysis.includelabel",(hN(),ptt))}function Orn(n,t){JT(AV(new Rq(null,new w1(new Cb(n.b),1)),new JC(n,t)),new nI(n,t))}function Arn(){this.c=new IE(0),this.b=new IE(B3n),this.d=new IE(F3n),this.a=new IE(JJn)}function $rn(n){var t,e;for(e=n.c.a.ec().Kc();e.Ob();)Ul(t=BB(e.Pb(),214),new HMn(t.e))}function Lrn(n){var t,e;for(e=n.c.a.ec().Kc();e.Ob();)zl(t=BB(e.Pb(),214),new Vz(t.f))}function Nrn(n,t){var e;e=n.zb,n.zb=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,1,e,n.zb))}function xrn(n,t){var e;e=n.xb,n.xb=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,3,e,n.xb))}function Drn(n,t){var e;e=n.yb,n.yb=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,2,e,n.yb))}function Rrn(n,t){var e;(e=new Om).n=t,f9((!n.s&&(n.s=new eU(FAt,n,21,17)),n.s),e)}function Krn(n,t){var e;(e=new pD).n=t,f9((!n.s&&(n.s=new eU(FAt,n,21,17)),n.s),e)}function _rn(n,t){var e,i;for(z9(e=n.Pc(),0,e.length,t),i=0;i<e.length;i++)n._c(i,e[i])}function Frn(n,t){var e,i,r;for(kW(t),e=!1,r=t.Kc();r.Ob();)i=r.Pb(),e|=n.Fc(i);return e}function Brn(n){var t,e,i;for(t=0,i=n.Kc();i.Ob();)t=~~(t+=null!=(e=i.Pb())?nsn(e):0);return t}function Hrn(n){var t;return 0==n?"UTC":(n<0?(n=-n,t="UTC+"):t="UTC-",t+bnn(n))}function qrn(n,t){var e;return cL(t,14)?(e=BB(t,14),n.Gc(e)):fnn(n,BB(yX(t),20).Kc())}function Grn(n,t,e){btn.call(this,t,e),this.d=x8(Out,a1n,10,n.a.c.length,0,1),Qgn(n.a,this.d)}function zrn(n){n.a=null,n.e=null,n.b.c=x8(Ant,HWn,1,0,5,1),n.f.c=x8(Ant,HWn,1,0,5,1),n.c=null}function Urn(n,t){t?null==n.B&&(n.B=n.D,n.D=null):null!=n.B&&(n.D=n.B,n.B=null)}function Xrn(n,t){return Gy(MD($N($fn($V(new Rq(null,new w1(n.c.b,16)),new xd(n)),t))))}function Wrn(n,t){return Gy(MD($N($fn($V(new Rq(null,new w1(n.c.b,16)),new Nd(n)),t))))}function Vrn(n,t){OTn(t,k1n,1),JT(wnn(new Rq(null,new w1(n.b,16)),new Zt),new ne),HSn(t)}function Qrn(n,t){var e,i;return e=BB(ZAn(n,(Uyn(),Ljt)),19),i=BB(ZAn(t,Ljt),19),E$(e.a,i.a)}function Yrn(n,t,e){var i,r;for(r=spn(n,0);r.b!=r.d.c;)(i=BB(b3(r),8)).a+=t,i.b+=e;return n}function Jrn(n,t,e){var i;for(i=n.b[e&n.f];i;i=i.b)if(e==i.a&&wW(t,i.g))return i;return null}function Zrn(n,t,e){var i;for(i=n.c[e&n.f];i;i=i.d)if(e==i.f&&wW(t,i.i))return i;return null}function ncn(n,t,e){var i,r,c;for(i=0,r=0;r<e;r++)c=t[r],n[r]=c<<1|i,i=c>>>31;0!=i&&(n[e]=i)}function tcn(n,t){var e,i;for(SQ(),i=new Np,e=0;e<n;++e)i.c[i.c.length]=t;return new $k(i)}function ecn(n){var t;return QI((t=T2(n)).a,0)?(hM(),hM(),Pet):(hM(),new yx(t.b))}function icn(n){var t;return QI((t=T2(n)).a,0)?(hM(),hM(),Pet):(hM(),new yx(t.c))}function rcn(n){var t;return QI((t=E2(n)).a,0)?(fM(),fM(),Cet):(fM(),new kx(t.b))}function ccn(n){return n.b.c.i.k==(uSn(),Mut)?BB(mMn(n.b.c.i,(hWn(),dlt)),11):n.b.c}function acn(n){return n.b.d.i.k==(uSn(),Mut)?BB(mMn(n.b.d.i,(hWn(),dlt)),11):n.b.d}function ucn(n,t,e,i,r,c,a,u,o,s,h,f,l){return bCn(n,t,e,i,r,c,a,u,o,s,h,f,l),Gln(n,!1),n}function ocn(n,t,e,i,r,c,a){gT.call(this,n,t),this.d=e,this.e=i,this.c=r,this.b=c,this.a=u6(a)}function scn(n,t){typeof window===AWn&&typeof window.$gwt===AWn&&(window.$gwt[n]=t)}function hcn(n,t){return Aun(),n==Zat&&t==eut||n==eut&&t==Zat||n==tut&&t==nut||n==nut&&t==tut}function fcn(n,t){return Aun(),n==Zat&&t==nut||n==Zat&&t==tut||n==eut&&t==tut||n==eut&&t==nut}function lcn(n,t){return h$(),rin(fJn),e.Math.abs(0-t)<=fJn||0==t||isNaN(0)&&isNaN(t)?0:n/t}function bcn(){return bDn(),Pun(Gk(Tft,1),$Vn,256,0,[hft,lft,bft,wft,dft,gft,vft,sft,fft,pft])}function wcn(){wcn=O,P$t=new Im,I$t=Pun(Gk(FAt,1),N9n,170,0,[]),C$t=Pun(Gk(QAt,1),x9n,59,0,[])}function dcn(){dcn=O,smt=new VP("NO",0),umt=new VP("GREEDY",1),omt=new VP("LOOK_BACK",2)}function gcn(){gcn=O,Dut=new Ht,Nut=new Bt,xut=new qt,Lut=new Gt,Rut=new zt,Kut=new Ut}function pcn(n){var t,e;for(e=0,t=new Wb(n.b);t.a<t.c.c.length;)BB(n0(t),29).p=e,++e}function vcn(n,t){var e;return $In(new xC((e=_Tn(n)).c,e.d),new xC(e.b,e.a),n.rf(),t,n.Hf())}function mcn(n,t){var e;return n.b?null:(e=stn(n,n.g),DH(n.a,e),e.i=n,n.d=t,e)}function ycn(n,t,e){OTn(e,"DFS Treeifying phase",1),jdn(n,t),cxn(n,t),n.a=null,n.b=null,HSn(e)}function kcn(n,t,e){this.g=n,this.d=t,this.e=e,this.a=new Np,UCn(this),SQ(),m$(this.a,null)}function jcn(n){this.i=n.gc(),this.i>0&&(this.g=this.ri(this.i+(this.i/8|0)+1),n.Qc(this.g))}function Ecn(n,t){MH.call(this,W$t,n,t),this.b=this,this.a=axn(n.Tg(),itn(this.e.Tg(),this.c))}function Tcn(n,t){var e,i;for(kW(t),i=t.vc().Kc();i.Ob();)e=BB(i.Pb(),42),n.zc(e.cd(),e.dd())}function Mcn(n,t,e){var i;for(i=e.Kc();i.Ob();)if(!G3(n,t,i.Pb()))return!1;return!0}function Scn(n,t,e,i,r){var c;return e&&(c=Awn(t.Tg(),n.c),r=e.gh(t,-1-(-1==c?i:c),null,r)),r}function Pcn(n,t,e,i,r){var c;return e&&(c=Awn(t.Tg(),n.c),r=e.ih(t,-1-(-1==c?i:c),null,r)),r}function Ccn(n){var t;if(-2==n.b){if(0==n.e)t=-1;else for(t=0;0==n.a[t];t++);n.b=t}return n.b}function Icn(n){switch(n.g){case 2:return kUn(),CIt;case 4:return kUn(),oIt;default:return n}}function Ocn(n){switch(n.g){case 1:return kUn(),SIt;case 3:return kUn(),sIt;default:return n}}function Acn(n){var t,e,i;return n.j==(kUn(),sIt)&&(e=SN(t=UOn(n),oIt),(i=SN(t,CIt))||i&&e)}function $cn(n){var t;return new YK(t=BB(n.e&&n.e(),9),BB(VU(t,t.length),9),t.length)}function Lcn(n,t){OTn(t,k1n,1),twn(sM(new Pw((gM(),new HV(n,!1,!1,new Ft))))),HSn(t)}function Ncn(n,t){return hN(),XI(n)?f6(n,SD(t)):UI(n)?Tz(n,MD(t)):zI(n)?Ez(n,TD(t)):n.wd(t)}function xcn(n,t){t.q=n,n.d=e.Math.max(n.d,t.r),n.b+=t.d+(0==n.a.c.length?0:n.c),WB(n.a,t)}function Dcn(n,t){var e,i,r,c;return r=n.c,e=n.c+n.b,c=n.d,i=n.d+n.a,t.a>r&&t.a<e&&t.b>c&&t.b<i}function Rcn(n,t,e,i){cL(n.Cb,179)&&(BB(n.Cb,179).tb=null),Nrn(n,e),t&&_In(n,t),i&&n.xk(!0)}function Kcn(n,t){var e;qQ(e=BB(t,183),"x",n.i),qQ(e,"y",n.j),qQ(e,C6n,n.g),qQ(e,P6n,n.f)}function _cn(){_cn=O,Imt=ogn(jO(dq(dq(new B2,(yMn(),_at),(lWn(),Lot)),Fat,Eot),Bat),$ot)}function Fcn(){Fcn=O,Dmt=ogn(jO(dq(dq(new B2,(yMn(),_at),(lWn(),Lot)),Fat,Eot),Bat),$ot)}function Bcn(){Bcn=O,Xjt=new yC(QZn,0),Wjt=new yC("POLAR_COORDINATE",1),Ujt=new yC("ID",2)}function Hcn(){Hcn=O,Xvt=new UP("EQUALLY",0),Wvt=new UP(mJn,1),Vvt=new UP("NORTH_SOUTH",2)}function qcn(){qcn=O,$vt=lhn((sNn(),Pun(Gk(Dvt,1),$Vn,260,0,[Ivt,Tvt,Pvt,Mvt,Svt,Evt,Cvt,Ovt])))}function Gcn(){Gcn=O,Vst=lhn((kDn(),Pun(Gk(iht,1),$Vn,270,0,[Bst,Gst,Fst,Xst,qst,Hst,Ust,zst])))}function zcn(){zcn=O,EMt=lhn((PPn(),Pun(Gk(SMt,1),$Vn,277,0,[kMt,wMt,vMt,yMt,dMt,gMt,pMt,mMt])))}function Ucn(){Ucn=O,cAt=lhn((hAn(),Pun(Gk(aAt,1),$Vn,237,0,[iAt,nAt,tAt,ZOt,eAt,YOt,QOt,JOt])))}function Xcn(){Xcn=O,Qrt=new iR("debugSVG",(hN(),!1)),Yrt=new iR("overlapsExisted",!0)}function Wcn(n,t){return x7(new ow(n),new sw(t),new hw(t),new tn,Pun(Gk(nit,1),$Vn,132,0,[]))}function Vcn(){var n;return qet||(qet=new Kv,YA(n=new y5(""),(lM(),Het)),frn(qet,n)),qet}function Qcn(n,t){for(yX(t);n.Ob();)if(!Qan(BB(n.Pb(),10)))return!1;return!0}function Ycn(n,t){var e;return!!(e=XRn(cin(),n))&&(Ypn(t,(sWn(),mPt),e),!0)}function Jcn(n,t){var e;for(e=0;e<t.j.c.length;e++)BB(D7(n,e),21).Gc(BB(D7(t,e),14));return n}function Zcn(n,t){var e,i;for(i=new Wb(t.b);i.a<i.c.c.length;)e=BB(n0(i),29),n.a[e.p]=QMn(e)}function nan(n,t){var e,i;for(kW(t),i=n.vc().Kc();i.Ob();)e=BB(i.Pb(),42),t.Od(e.cd(),e.dd())}function tan(n,t){cL(t,83)?(BB(n.c,76).Xj(),ern(n,BB(t,83))):BB(n.c,76).Wb(t)}function ean(n){return cL(n,152)?o6(BB(n,152)):cL(n,131)?BB(n,131).a:cL(n,54)?new fy(n):new CT(n)}function ian(n,t){return t<n.b.gc()?BB(n.b.Xb(t),10):t==n.b.gc()?n.a:BB(xq(n.e,t-n.b.gc()-1),10)}function ran(n,t){n.a=rbn(n.a,1),n.c=e.Math.min(n.c,t),n.b=e.Math.max(n.b,t),n.d=rbn(n.d,t)}function can(n,t){OTn(t,"Edge and layer constraint edge reversal",1),Fzn(LRn(n)),HSn(t)}function aan(n){var t;null==n.d?(++n.e,n.f=0,rfn(null)):(++n.e,t=n.d,n.d=null,n.f=0,rfn(t))}function uan(n){var t;return 0==(t=n.h)?n.l+n.m*IQn:t==PQn?n.l+n.m*IQn-OQn:n}function oan(n){return qD(),n.A.Hc((mdn(),DIt))&&!n.B.Hc((n_n(),UIt))?ndn(n):null}function san(n){if(kW(n),0==n.length)throw Hp(new Mk("Zero length BigInteger"));iKn(this,n)}function han(n){if(!n)throw Hp(new Fy("no calls to next() since the last call to remove()"))}function fan(n){return $Qn<n&&n<OQn?n<0?e.Math.ceil(n):e.Math.floor(n):uan(gNn(n))}function lan(n,t){var e,i,r;for(e=n.c.Ee(),r=t.Kc();r.Ob();)i=r.Pb(),n.a.Od(e,i);return n.b.Kb(e)}function ban(n,t){var e,i,r;if(null!=(e=n.Jg())&&n.Mg())for(i=0,r=e.length;i<r;++i)e[i].ui(t)}function wan(n,t){var e,i;for(i=vW(e=n).e;i;){if((e=i)==t)return!0;i=vW(e).e}return!1}function dan(n,t,e){var i,r;return(i=n.a.f[t.p])<(r=n.a.f[e.p])?-1:i==r?0:1}function gan(n,t,e){var i,r;return r=BB(UK(n.d,t),19),i=BB(UK(n.b,e),19),r&&i?U6(n,r.a,i.a):null}function pan(n,t){var e,i;for(i=new AL(n);i.e!=i.i.gc();)SA(e=BB(kpn(i),33),e.i+t.b,e.j+t.d)}function van(n,t){var e,i;for(i=new Wb(t);i.a<i.c.c.length;)e=BB(n0(i),70),WB(n.d,e),KMn(n,e)}function man(n,t){var e,i;i=new Np,e=t;do{i.c[i.c.length]=e,e=BB(RX(n.k,e),17)}while(e);return i}function yan(n,t){var e;return 0!=(n.Db&t)?-1==(e=Rmn(n,t))?n.Eb:een(n.Eb)[e]:null}function kan(n,t){var e;return(e=new _f).G=t,!n.rb&&(n.rb=new Jz(n,HAt,n)),f9(n.rb,e),e}function jan(n,t){var e;return(e=new Ev).G=t,!n.rb&&(n.rb=new Jz(n,HAt,n)),f9(n.rb,e),e}function Ean(n,t){switch(t){case 1:return!!n.n&&0!=n.n.i;case 2:return null!=n.k}return m0(n,t)}function Tan(n){switch(n.a.g){case 1:return new EI;case 3:return new hyn;default:return new If}}function Man(n){var t;if(n.g>1||n.Ob())return++n.a,n.g=0,t=n.i,n.Ob(),t;throw Hp(new yv)}function San(n){var t;return a$(),uS(syt,n)||((t=new ua).a=n,wR(syt,n,t)),BB(oV(syt,n),635)}function Pan(n){var t,e,i;return e=0,(i=n)<0&&(i+=OQn,e=PQn),t=CJ(i/IQn),M$(CJ(i-t*IQn),t,e)}function Can(n){var t,e,i;for(i=0,e=new QT(n.a);e.a<e.c.a.length;)t=u4(e),n.b.Hc(t)&&++i;return i}function Ian(n){var t,e,i;for(t=1,i=n.Kc();i.Ob();)t=~~(t=31*t+(null==(e=i.Pb())?0:nsn(e)));return t}function Oan(n,t){var e;this.c=n,gmn(n,e=new Np,t,n.b,null,!1,null,!1),this.a=new M2(e,0)}function Aan(n,t){this.b=n,this.e=t,this.d=t.j,this.f=(ZM(),BB(n,66).Oj()),this.k=axn(t.e.Tg(),n)}function $an(n,t,e){this.b=(kW(n),n),this.d=(kW(t),t),this.e=(kW(e),e),this.c=this.d+""+this.e}function Lan(){this.a=BB(mpn((fRn(),qct)),19).a,this.c=Gy(MD(mpn(cat))),this.b=Gy(MD(mpn(tat)))}function Nan(){Nan=O,KCt=lhn((n$n(),Pun(Gk(GCt,1),$Vn,93,0,[ICt,CCt,ACt,DCt,xCt,NCt,$Ct,LCt,OCt])))}function xan(){xan=O,Fit=lhn((tRn(),Pun(Gk(Bit,1),$Vn,250,0,[Rit,$it,Lit,Ait,xit,Dit,Nit,Oit,Iit])))}function Dan(){Dan=O,Rrt=new US("UP",0),Nrt=new US(pJn,1),xrt=new US(cJn,2),Drt=new US(aJn,3)}function Ran(){Ran=O,sZ(),ykt=new $O(X3n,kkt=Rkt),B0(),vkt=new $O(W3n,mkt=Hkt)}function Kan(){Kan=O,jft=new NP("ONE_SIDED",0),Eft=new NP("TWO_SIDED",1),kft=new NP("OFF",2)}function _an(n){n.r=new Rv,n.w=new Rv,n.t=new Np,n.i=new Np,n.d=new Rv,n.a=new bA,n.c=new xp}function Fan(n){this.n=new Np,this.e=new YT,this.j=new YT,this.k=new Np,this.f=new Np,this.p=n}function Ban(n,t){n.c&&(JKn(n,t,!0),JT(new Rq(null,new w1(t,16)),new qd(n))),JKn(n,t,!1)}function Han(n,t,e){return n==(oin(),$mt)?new Pc:0!=H$n(t,1)?new Rj(e.length):new Dj(e.length)}function qan(n,t){var e;return t?((e=t.Ve()).dc()||(n.q?Tcn(n.q,e):n.q=new mO(e)),n):n}function Gan(n,t){var e;return void 0===(e=n.a.get(t))?++n.d:(mR(n.a,t),--n.c,oY(n.b)),e}function zan(n,t){var e;return 0==(e=t.p-n.p)?Pln(n.f.a*n.f.b,t.f.a*t.f.b):e}function Uan(n,t){var e,i;return(e=n.f.c.length)<(i=t.f.c.length)?-1:e==i?0:1}function Xan(n){return 0!=n.b.c.length&&BB(xq(n.b,0),70).a?BB(xq(n.b,0),70).a:eQ(n)}function Wan(n){var t;if(n){if((t=n).dc())throw Hp(new yv);return t.Xb(t.gc()-1)}return u1(n.Kc())}function Van(n){var t;return Vhn(n,0)<0&&(n=uH(n)),64-(0!=(t=dG(kz(n,32)))?ZIn(t):ZIn(dG(n))+32)}function Qan(n){var t;return t=BB(mMn(n,(hWn(),Qft)),61),n.k==(uSn(),Mut)&&(t==(kUn(),CIt)||t==oIt)}function Yan(n,t,e){var i,r;(r=BB(mMn(n,(HXn(),vgt)),74))&&(Wsn(i=new km,0,r),Ztn(i,e),Frn(t,i))}function Jan(n,t,e){var i,r,c,a;i=(a=vW(n)).d,r=a.c,c=n.n,t&&(c.a=c.a-i.b-r.a),e&&(c.b=c.b-i.d-r.b)}function Zan(n,t){var e,i;return(e=n.j)!=(i=t.j)?e.g-i.g:n.p==t.p?0:e==(kUn(),sIt)?n.p-t.p:t.p-n.p}function nun(n){var t,e;for(PUn(n),e=new Wb(n.d);e.a<e.c.c.length;)(t=BB(n0(e),101)).i&&XSn(t)}function tun(n,t,e,i,r){$X(n.c[t.g],e.g,i),$X(n.c[e.g],t.g,i),$X(n.b[t.g],e.g,r),$X(n.b[e.g],t.g,r)}function eun(n,t,e,i){BB(e.b,65),BB(e.b,65),BB(i.b,65),BB(i.b,65),BB(i.b,65),Otn(i.a,new EB(n,t,i))}function iun(n,t){n.d==(Ffn(),_Pt)||n.d==HPt?BB(t.a,57).c.Fc(BB(t.b,57)):BB(t.b,57).c.Fc(BB(t.a,57))}function run(n,t,e,i){return 1==e?(!n.n&&(n.n=new eU(zOt,n,1,7)),_pn(n.n,t,i)):eSn(n,t,e,i)}function cun(n,t){var e;return Nrn(e=new Ho,t),f9((!n.A&&(n.A=new NL(O$t,n,7)),n.A),e),e}function aun(n,t,e){var i,r;return r=N2(t,A6n),pjn((i=new aI(n,e)).a,i.b,r),r}function uun(n){var t;return(!n.a||0==(1&n.Bb)&&n.a.kh())&&cL(t=Ikn(n),148)&&(n.a=BB(t,148)),n.a}function oun(n,t){var e,i;for(kW(t),i=t.Kc();i.Ob();)if(e=i.Pb(),!n.Hc(e))return!1;return!0}function sun(n,t){var e,i,r;return e=n.l+t.l,i=n.m+t.m+(e>>22),r=n.h+t.h+(i>>22),M$(e&SQn,i&SQn,r&PQn)}function hun(n,t){var e,i,r;return e=n.l-t.l,i=n.m-t.m+(e>>22),r=n.h-t.h+(i>>22),M$(e&SQn,i&SQn,r&PQn)}function fun(n){var t;return n<128?(!(t=(Mq(),Mtt)[n])&&(t=Mtt[n]=new Lb(n)),t):new Lb(n)}function lun(n){var t;return cL(n,78)?n:((t=n&&n.__java$exception)||ov(t=new jhn(n)),t)}function bun(n){if(cL(n,186))return BB(n,118);if(n)return null;throw Hp(new Hy(e8n))}function wun(n,t){if(null==t)return!1;for(;n.a!=n.b;)if(Nfn(t,_hn(n)))return!0;return!1}function dun(n){return!!n.a.Ob()||n.a==n.d&&(n.a=new S2(n.e.f),n.a.Ob())}function gun(n,t){var e;return 0!=(e=t.Pc()).length&&(tH(n.c,n.c.length,e),!0)}function pun(n,t,e){var i,r;for(r=t.vc().Kc();r.Ob();)i=BB(r.Pb(),42),n.yc(i.cd(),i.dd(),e);return n}function vun(n,t){var e;for(e=new Wb(n.b);e.a<e.c.c.length;)hon(BB(n0(e),70),(hWn(),ult),t)}function mun(n,t,e){var i,r;for(r=new Wb(n.b);r.a<r.c.c.length;)SA(i=BB(n0(r),33),i.i+t,i.j+e)}function yun(n,t){if(!n)throw Hp(new _y($Rn("value already present: %s",Pun(Gk(Ant,1),HWn,1,5,[t]))))}function kun(n,t){return!(!n||!t||n==t)&&_dn(n.d.c,t.d.c+t.d.b)&&_dn(t.d.c,n.d.c+n.d.b)}function jun(){return k5(),Qet?new y5(null):FOn(Vcn(),"com.google.common.base.Strings")}function Eun(n,t){var e;return e=sx(t.a.gc()),JT(ytn(new Rq(null,new w1(t,1)),n.i),new NC(n,e)),e}function Tun(n){var t;return Nrn(t=new Ho,"T"),f9((!n.d&&(n.d=new NL(O$t,n,11)),n.d),t),t}function Mun(n){var t,e,i,r;for(t=1,e=0,r=n.gc();e<r;++e)t=31*t+(null==(i=n.ki(e))?0:nsn(i));return t}function Sun(n,t,e,i){var r;return w2(t,n.e.Hd().gc()),w2(e,n.c.Hd().gc()),r=n.a[t][e],$X(n.a[t],e,i),r}function Pun(n,t,e,i,r){return r.gm=n,r.hm=t,r.im=I,r.__elementTypeId$=e,r.__elementTypeCategory$=i,r}function Cun(n,t,i,r,c){return jDn(),e.Math.min(zGn(n,t,i,r,c),zGn(i,r,n,t,qx(new xC(c.a,c.b))))}function Iun(){Iun=O,ast=new tP(QZn,0),rst=new tP(C1n,1),cst=new tP(I1n,2),ist=new tP("BOTH",3)}function Oun(){Oun=O,vst=new mP(eJn,0),mst=new mP(cJn,1),yst=new mP(aJn,2),kst=new mP("TOP",3)}function Aun(){Aun=O,Zat=new QS("Q1",0),eut=new QS("Q4",1),nut=new QS("Q2",2),tut=new QS("Q3",3)}function $un(){$un=O,bmt=new QP("OFF",0),wmt=new QP("SINGLE_EDGE",1),lmt=new QP("MULTI_EDGE",2)}function Lun(){Lun=O,WTt=new SC("MINIMUM_SPANNING_TREE",0),XTt=new SC("MAXIMUM_SPANNING_TREE",1)}function Nun(){Nun=O,new up("org.eclipse.elk.addLayoutConfig"),ZTt=new ou,JTt=new au,new uu}function xun(n){var t,e;for(t=new YT,e=spn(n.d,0);e.b!=e.d.c;)DH(t,BB(b3(e),188).c);return t}function Dun(n){var t,e;for(e=new Np,t=n.Kc();t.Ob();)gun(e,wDn(BB(t.Pb(),33)));return e}function Run(n){var t;tBn(n,!0),t=VVn,Lx(n,(HXn(),fpt))&&(t+=BB(mMn(n,fpt),19).a),hon(n,fpt,iln(t))}function Kun(n,t,e){var i;$U(n.a),Otn(e.i,new jg(n)),kgn(n,i=new C$(BB(RX(n.a,t.b),65)),t),e.f=i}function _un(n,t){var e,i;return e=n.c,(i=t.e[n.p])<e.a.c.length-1?BB(xq(e.a,i+1),10):null}function Fun(n,t){var e,i;for(WQ(t,"predicate"),i=0;n.Ob();i++)if(e=n.Pb(),t.Lb(e))return i;return-1}function Bun(n,t){var e,i;if(i=0,n<64&&n<=t)for(t=t<64?t:63,e=n;e<=t;e++)i=i0(i,yz(1,e));return i}function Hun(n){var t,e,i;for(SQ(),i=0,e=n.Kc();e.Ob();)i+=null!=(t=e.Pb())?nsn(t):0,i|=0;return i}function qun(n){var t;return tE(),t=new co,n&&f9((!n.a&&(n.a=new eU(FOt,n,6,6)),n.a),t),t}function Gun(n){var t;return(t=new p).a=n,t.b=yon(n),t.c=x8(Qtt,sVn,2,2,6,1),t.c[0]=Hrn(n),t.c[1]=Hrn(n),t}function zun(n,t){if(0===t)return!n.o&&(n.o=new y9((CXn(),MOt),rAt,n,0)),void n.o.c.$b();mPn(n,t)}function Uun(n,t,e){switch(e.g){case 2:n.b=t;break;case 1:n.c=t;break;case 4:n.d=t;break;case 3:n.a=t}}function Xun(n){switch(n.g){case 1:return ECt;case 2:return jCt;case 3:return TCt;default:return MCt}}function Wun(n){switch(BB(mMn(n,(HXn(),kgt)),163).g){case 2:case 4:return!0;default:return!1}}function Vun(){Vun=O,yft=lhn((bDn(),Pun(Gk(Tft,1),$Vn,256,0,[hft,lft,bft,wft,dft,gft,vft,sft,fft,pft])))}function Qun(){Qun=O,JIt=lhn((n_n(),Pun(Gk(iOt,1),$Vn,259,0,[GIt,UIt,qIt,XIt,WIt,QIt,VIt,zIt,HIt])))}function Yun(){Yun=O,Xkt=dq(ogn(ogn(FM(dq(new B2,(zyn(),Kyt),(DPn(),Qyt)),_yt),Xyt),Wyt),Fyt,Vyt)}function Jun(){Jun=O,Aht=new CP(QZn,0),Oht=new CP("INCOMING_ONLY",1),$ht=new CP("OUTGOING_ONLY",2)}function Zun(){Zun=O,ftt={boolean:UT,number:Cy,string:Iy,object:TCn,function:TCn,undefined:Wp}}function non(n,t){vH(n>=0,"Negative initial capacity"),vH(t>=0,"Non-positive load factor"),$U(this)}function ton(n,t,e){return!(n>=128)&&JI(n<64?e0(yz(1,n),e):e0(yz(1,n-64),t),0)}function eon(n,t){return!(!n||!t||n==t)&&Ibn(n.b.c,t.b.c+t.b.b)<0&&Ibn(t.b.c,n.b.c+n.b.b)<0}function ion(n){var t,e,i;return e=n.n,i=n.o,t=n.d,new UV(e.a-t.b,e.b-t.d,i.a+(t.b+t.c),i.b+(t.d+t.a))}function ron(n){var t,e,i,r;for(i=0,r=(e=n.a).length;i<r;++i)Son(n,t=e[i],(kUn(),SIt)),Son(n,t,sIt)}function con(n){var t,e;for(null==n.j&&(n.j=(PY(),Ijn(ett.ce(n)))),t=0,e=n.j.length;t<e;++t);}function aon(n){var t,e;return M$(t=1+~n.l&SQn,e=~n.m+(0==t?1:0)&SQn,~n.h+(0==t&&0==e?1:0)&PQn)}function uon(n,t){return TFn(BB(BB(RX(n.g,t.a),46).a,65),BB(BB(RX(n.g,t.b),46).a,65))}function oon(n,t,e){var i;if(t>(i=n.gc()))throw Hp(new tK(t,i));return n.hi()&&(e=nZ(n,e)),n.Vh(t,e)}function son(n,t,e){return null==e?(!n.q&&(n.q=new xp),v6(n.q,t)):(!n.q&&(n.q=new xp),VW(n.q,t,e)),n}function hon(n,t,e){return null==e?(!n.q&&(n.q=new xp),v6(n.q,t)):(!n.q&&(n.q=new xp),VW(n.q,t,e)),n}function fon(n){var t,e;return qan(e=new y6,n),hon(e,(Mrn(),sat),n),eBn(n,e,t=new xp),Szn(n,e,t),e}function lon(n){var t,e,i;for(jDn(),e=x8(PMt,sVn,8,2,0,1),i=0,t=0;t<2;t++)i+=.5,e[t]=lmn(i,n);return e}function bon(n,t){var e,i,r;for(e=!1,i=n.a[t].length,r=0;r<i-1;r++)e|=Pdn(n,t,r,r+1);return e}function won(n,t,e,i,r){var c,a;for(a=e;a<=r;a++)for(c=t;c<=i;c++)vmn(n,c,a)||FRn(n,c,a,!0,!1)}function don(n,t){this.b=n,NO.call(this,(BB(Wtn(QQ((QX(),t$t).o),10),18),t.i),t.g),this.a=(wcn(),I$t)}function gon(n,t){this.c=n,this.d=t,this.b=this.d/this.c.c.Hd().gc()|0,this.a=this.d%this.c.c.Hd().gc()}function pon(){this.o=null,this.k=null,this.j=null,this.d=null,this.b=null,this.n=null,this.a=null}function von(n,t,i){this.q=new e.Date,this.q.setFullYear(n+sQn,t,i),this.q.setHours(0,0,0,0),lBn(this,0)}function mon(){mon=O,Nvt=new qP(QZn,0),Lvt=new qP("NODES_AND_EDGES",1),xvt=new qP("PREFER_EDGES",2)}function yon(n){var t;return 0==n?"Etc/GMT":(n<0?(n=-n,t="Etc/GMT-"):t="Etc/GMT+",t+bnn(n))}function kon(n){var t;if(n<0)return _Vn;if(0==n)return 0;for(t=OVn;0==(t&n);t>>=1);return t}function jon(n){var t,e;return 32==(e=ZIn(n.h))?32==(t=ZIn(n.m))?ZIn(n.l)+32:t+20-10:e-12}function Eon(n){var t;return null==(t=n.a[n.b])?null:($X(n.a,n.b,null),n.b=n.b+1&n.a.length-1,t)}function Ton(n){var t,e;return t=n.t-n.k[n.o.p]*n.d+n.j[n.o.p]>n.f,e=n.u+n.e[n.o.p]*n.d>n.f*n.s*n.d,t||e}function Mon(n,t,e){var i,r;return i=new H8(t,e),r=new q,n.b=Wxn(n,n.b,i,r),r.b||++n.c,n.b.b=!1,r.d}function Son(n,t,e){var i,r,c;for(c=0,r=Lfn(t,e).Kc();r.Ob();)i=BB(r.Pb(),11),VW(n.c,i,iln(c++))}function Pon(n){var t,e;for(e=new Wb(n.a.b);e.a<e.c.c.length;)(t=BB(n0(e),81)).g.c=-t.g.c-t.g.b;kNn(n)}function Con(n){var t,e;for(e=new Wb(n.a.b);e.a<e.c.c.length;)(t=BB(n0(e),57)).d.c=-t.d.c-t.d.b;yNn(n)}function Ion(n){var t;return(!n.c||0==(1&n.Bb)&&0!=(64&n.c.Db))&&cL(t=Ikn(n),88)&&(n.c=BB(t,26)),n.c}function Oon(n){var t,e,i;t=1+~n.l&SQn,e=~n.m+(0==t?1:0)&SQn,i=~n.h+(0==t&&0==e?1:0)&PQn,n.l=t,n.m=e,n.h=i}function Aon(n){var t,e,i,r,c;for(t=new Gj,r=0,c=(i=n).length;r<c;++r)e=i[r],t.a+=e.a,t.b+=e.b;return t}function $on(n,t){var e,i,r,c,a;for(SQ(),a=!1,r=0,c=(i=t).length;r<c;++r)e=i[r],a|=n.Fc(e);return a}function Lon(n){var t,e;for(jDn(),e=-17976931348623157e292,t=0;t<n.length;t++)n[t]>e&&(e=n[t]);return e}function Non(n,t,e){var i;return jxn(n,t,i=new Np,(kUn(),oIt),!0,!1),jxn(n,e,i,CIt,!1,!1),i}function xon(n,t,e){var i,r;return r=N2(t,"labels"),XAn((i=new gI(n,e)).a,i.b,r),r}function Don(n,t,e,i){var r;return(r=m$n(n,t,e,i))||!(r=aln(n,e,i))||Fqn(n,t,r)?r:null}function Ron(n,t,e,i){var r;return(r=y$n(n,t,e,i))||!(r=uln(n,e,i))||Fqn(n,t,r)?r:null}function Kon(n,t){var e;for(e=0;e<n.a.a.length;e++)if(!BB(Dq(n.a,e),169).Lb(t))return!1;return!0}function _on(n,t,e){if(yX(t),e.Ob())for(sO(t,CX(e.Pb()));e.Ob();)sO(t,n.a),sO(t,CX(e.Pb()));return t}function Fon(n){var t,e,i;for(SQ(),i=1,e=n.Kc();e.Ob();)i=31*i+(null!=(t=e.Pb())?nsn(t):0),i|=0;return i}function Bon(n,t,e,i,r){var c;return c=jAn(n,t),e&&Oon(c),r&&(n=Smn(n,t),ltt=i?aon(n):M$(n.l,n.m,n.h)),c}function Hon(n,t){var e;try{t.Vd()}catch(i){if(!cL(i=lun(i),78))throw Hp(i);e=i,n.c[n.c.length]=e}}function qon(n,t,e){var i,r;return cL(t,144)&&e?(i=BB(t,144),r=e,n.a[i.b][r.b]+n.a[r.b][i.b]):0}function Gon(n,t){switch(t){case 7:return!!n.e&&0!=n.e.i;case 8:return!!n.d&&0!=n.d.i}return fwn(n,t)}function zon(n,t){switch(t.g){case 0:cL(n.b,631)||(n.b=new Lan);break;case 1:cL(n.b,632)||(n.b=new fH)}}function Uon(n,t){for(;null!=n.g||n.c?null==n.g||0!=n.i&&BB(n.g[n.i-1],47).Ob():tZ(n);)vI(t,aLn(n))}function Xon(n,t,e){n.g=APn(n,t,(kUn(),oIt),n.b),n.d=APn(n,e,oIt,n.b),0!=n.g.c&&0!=n.d.c&&zMn(n)}function Won(n,t,e){n.g=APn(n,t,(kUn(),CIt),n.j),n.d=APn(n,e,CIt,n.j),0!=n.g.c&&0!=n.d.c&&zMn(n)}function Von(n,t,e){return!jE(AV(new Rq(null,new w1(n.c,16)),new aw(new ZC(t,e)))).sd((dM(),tit))}function Qon(n){var t;return EW(n),t=new sn,n.a.sd(t)?(CL(),new vy(kW(t.a))):(CL(),CL(),Set)}function Yon(n){var t;return!(n.b<=0)&&((t=GO("MLydhHmsSDkK",YTn(fV(n.c,0))))>1||t>=0&&n.b<3)}function Jon(n){var t,e;for(t=new km,e=spn(n,0);e.b!=e.d.c;)Kx(t,0,new wA(BB(b3(e),8)));return t}function Zon(n){var t;for(t=new Wb(n.a.b);t.a<t.c.c.length;)BB(n0(t),81).f.$b();ky(n.b,n),BNn(n)}function nsn(n){return XI(n)?vvn(n):UI(n)?VO(n):zI(n)?(kW(n),n?1231:1237):iz(n)?n.Hb():AG(n)?PN(n):tY(n)}function tsn(n){return XI(n)?Qtt:UI(n)?Ptt:zI(n)?ktt:iz(n)||AG(n)?n.gm:n.gm||Array.isArray(n)&&Gk(ntt,1)||ntt}function esn(n){if(0===n.g)return new cu;throw Hp(new _y(N4n+(null!=n.f?n.f:""+n.g)))}function isn(n){if(0===n.g)return new iu;throw Hp(new _y(N4n+(null!=n.f?n.f:""+n.g)))}function rsn(n,t,e){if(0===t)return!n.o&&(n.o=new y9((CXn(),MOt),rAt,n,0)),void tan(n.o,e);yCn(n,t,e)}function csn(n,t,e){this.g=n,this.e=new Gj,this.f=new Gj,this.d=new YT,this.b=new YT,this.a=t,this.c=e}function asn(n,t,e,i){this.b=new Np,this.n=new Np,this.i=i,this.j=e,this.s=n,this.t=t,this.r=0,this.d=0}function usn(n){this.e=n,this.d=new p4(this.e.g),this.a=this.d,this.b=dun(this),this.$modCount=n.$modCount}function osn(n){for(;!n.d||!n.d.Ob();){if(!n.b||Wy(n.b))return null;n.d=BB(dU(n.b),47)}return n.d}function ssn(n){return WB(n.c,(Nun(),ZTt)),uen(n.a,Gy(MD(mpn((Rwn(),Vpt)))))?new qu:new Cg(n)}function hsn(n){switch(n.g){case 1:return F3n;default:case 2:return 0;case 3:return JJn;case 4:return B3n}}function fsn(){var n;return wWn(),PNt||(n=ex(ZUn("M",!0)),n=gG(ZUn("M",!1),n),PNt=n)}function lsn(n,t){var e,i,r;for(r=n.b;r;){if(0==(e=n.a.ue(t,r.d)))return r;i=e<0?0:1,r=r.a[i]}return null}function bsn(n,t,e){var i,r;hN(),i=!!TO(e),(r=BB(t.xc(i),15))||(r=new Np,t.zc(i,r)),r.Fc(e)}function wsn(n,t){var e,i;return(e=BB(ZAn(n,(W$n(),dEt)),19).a)==(i=BB(ZAn(t,dEt),19).a)||e<i?-1:e>i?1:0}function dsn(n,t){return!!bNn(n,t)&&(JIn(n.b,BB(mMn(t,(hWn(),Xft)),21),t),DH(n.a,t),!0)}function gsn(n){var t,e;(t=BB(mMn(n,(hWn(),Elt)),10))&&(y7((e=t.c).a,t),0==e.a.c.length&&y7(vW(t).b,e))}function psn(n){return Qet?x8(Get,dYn,572,0,0,1):BB(Qgn(n.a,x8(Get,dYn,572,n.a.c.length,0,1)),842)}function vsn(n,t,e,i){return nV(),new hy(Pun(Gk(Hnt,1),kVn,42,0,[(zvn(n,t),new vT(n,t)),(zvn(e,i),new vT(e,i))]))}function msn(n,t,e){var i;return fin(i=new $m,t,e),f9((!n.q&&(n.q=new eU(QAt,n,11,10)),n.q),i),i}function ysn(n){var t,e,i,r;for(e=(r=fS(AOt,n)).length,i=x8(Qtt,sVn,2,e,6,1),t=0;t<e;++t)i[t]=r[t];return i}function ksn(n,t){var e,i,r,c,a;for(r=0,c=(i=t).length;r<c;++r)e=i[r],a=new UX(n),e.Qe(a),NBn(a);$U(n.f)}function jsn(n,t){var e;return t===n||!!cL(t,224)&&(e=BB(t,224),Nfn(n.Zb(),e.Zb()))}function Esn(n,t){var e;2*t+1>=n.b.c.length||(Esn(n,2*t+1),(e=2*t+2)<n.b.c.length&&Esn(n,e),KCn(n,t))}function Tsn(n,t,e){var i,r;this.g=n,this.c=t,this.a=this,this.d=this,r=Jin(e),i=x8(Qnt,CVn,330,r,0,1),this.b=i}function Msn(n,t,e){var i;for(i=e-1;i>=0&&n[i]===t[i];i--);return i<0?0:sS(e0(n[i],UQn),e0(t[i],UQn))?-1:1}function Ssn(n,t){var e,i;for(i=spn(n,0);i.b!=i.d.c;)(e=BB(b3(i),214)).e.length>0&&(t.td(e),e.i&&pln(e))}function Psn(n,t){var e,i;return i=BB(yan(n.a,4),126),e=x8(dAt,i9n,415,t,0,1),null!=i&&aHn(i,0,e,0,i.length),e}function Csn(n,t){var e;return e=new rRn(0!=(256&n.f),n.i,n.a,n.d,0!=(16&n.f),n.j,n.g,t),null!=n.e||(e.c=n),e}function Isn(n,t){var e;for(e=n.Zb().Cc().Kc();e.Ob();)if(BB(e.Pb(),14).Hc(t))return!0;return!1}function Osn(n,t,e,i,r){var c,a;for(a=e;a<=r;a++)for(c=t;c<=i;c++)if(vmn(n,c,a))return!0;return!1}function Asn(n,t,e){var i,r,c,a;for(kW(e),a=!1,c=n.Zc(t),r=e.Kc();r.Ob();)i=r.Pb(),c.Rb(i),a=!0;return a}function $sn(n,t){var e;return n===t||!!cL(t,83)&&(e=BB(t,83),zSn(lz(n),e.vc()))}function Lsn(n,t,e){var i,r;for(r=e.Kc();r.Ob();)if(i=BB(r.Pb(),42),n.re(t,i.dd()))return!0;return!1}function Nsn(n,t,e){return n.d[t.p][e.p]||(ivn(n,t,e),n.d[t.p][e.p]=!0,n.d[e.p][t.p]=!0),n.a[t.p][e.p]}function xsn(n,t){if(!n.ai()&&null==t)throw Hp(new _y("The 'no null' constraint is violated"));return t}function Dsn(n,t){null==n.D&&null!=n.B&&(n.D=n.B,n.B=null),Hin(n,null==t?null:(kW(t),t)),n.C&&n.yk(null)}function Rsn(n,t){return!(!n||n==t||!Lx(t,(hWn(),rlt)))&&BB(mMn(t,(hWn(),rlt)),10)!=n}function Ksn(n){switch(n.i){case 2:return!0;case 1:return!1;case-1:++n.c;default:return n.pl()}}function _sn(n){switch(n.i){case-2:return!0;case-1:return!1;case 1:--n.c;default:return n.ql()}}function Fsn(n){_J.call(this,"The given string does not match the expected format for individual spacings.",n)}function Bsn(){Bsn=O,uOt=new cI("ELK",0),oOt=new cI("JSON",1),aOt=new cI("DOT",2),sOt=new cI("SVG",3)}function Hsn(){Hsn=O,sjt=new vC(QZn,0),hjt=new vC("RADIAL_COMPACTION",1),fjt=new vC("WEDGE_COMPACTION",2)}function qsn(){qsn=O,zet=new pS("CONCURRENT",0),Uet=new pS("IDENTITY_FINISH",1),Xet=new pS("UNORDERED",2)}function Gsn(){Gsn=O,wM(),oct=new $O(BJn,sct=rct),uct=new up(HJn),hct=new up(qJn),fct=new up(GJn)}function zsn(){zsn=O,lst=new ji,bst=new Ei,fst=new Ti,hst=new Mi,kW(new Si),sst=new D}function Usn(){Usn=O,emt=new WP("CONSERVATIVE",0),imt=new WP("CONSERVATIVE_SOFT",1),rmt=new WP("SLOPPY",2)}function Xsn(){Xsn=O,dCt=new WA(15),wCt=new XA((sWn(),XSt),dCt),gCt=gPt,hCt=aSt,fCt=KSt,bCt=BSt,lCt=FSt}function Wsn(n,t,e){var i,r;for(i=new YT,r=spn(e,0);r.b!=r.d.c;)DH(i,new wA(BB(b3(r),8)));Asn(n,t,i)}function Vsn(n){var t,e,i;for(t=0,i=x8(PMt,sVn,8,n.b,0,1),e=spn(n,0);e.b!=e.d.c;)i[t++]=BB(b3(e),8);return i}function Qsn(n){var t;return!n.a&&(n.a=new eU(WAt,n,9,5)),0!=(t=n.a).i?HM(BB(Wtn(t,0),678)):null}function Ysn(n,t){var e;return e=rbn(n,t),sS(r0(n,t),0)|YI(r0(n,e),0)?e:rbn(bVn,r0(jz(e,63),1))}function Jsn(n,t){var e;e=null!=mpn((Rwn(),Vpt))&&null!=t.wg()?Gy(MD(t.wg()))/Gy(MD(mpn(Vpt))):1,VW(n.b,t,e)}function Zsn(n,t){var e,i;return(e=BB(n.d.Bc(t),14))?((i=n.e.hc()).Gc(e),n.e.d-=e.gc(),e.$b(),i):null}function nhn(n,t){var e,i;if(0!=(i=n.c[t]))for(n.c[t]=0,n.d-=i,e=t+1;e<n.a.length;)n.a[e]-=i,e+=e&-e}function thn(n){var t;if((t=n.a.c.length)>0)return Kz(t-1,n.a.c.length),s6(n.a,t-1);throw Hp(new mv)}function ehn(n,t,e){if(t<0)throw Hp(new Ay(n5n+t));t<n.j.c.length?c5(n.j,t,e):(g3(n,t),WB(n.j,e))}function ihn(n,t,e){if(n>t)throw Hp(new _y(mYn+n+yYn+t));if(n<0||t>e)throw Hp(new Tk(mYn+n+kYn+t+hYn+e))}function rhn(n){if(!n.a||0==(8&n.a.i))throw Hp(new Fy("Enumeration class expected for layout option "+n.f))}function chn(n){var t;++n.j,0==n.i?n.g=null:n.i<n.g.length&&(t=n.g,n.g=n.ri(n.i),aHn(t,0,n.g,0,n.i))}function ahn(n,t){var e,i;for(e=n.a.length-1,n.c=n.c-1&e;t!=n.c;)i=t+1&e,$X(n.a,t,n.a[i]),t=i;$X(n.a,n.c,null)}function uhn(n,t){var e,i;for(e=n.a.length-1;t!=n.b;)i=t-1&e,$X(n.a,t,n.a[i]),t=i;$X(n.a,n.b,null),n.b=n.b+1&e}function ohn(n,t,e){var i;return LZ(t,n.c.length),0!=(i=e.Pc()).length&&(tH(n.c,t,i),!0)}function shn(n){var t,e;if(null==n)return null;for(t=0,e=n.length;t<e;t++)if(!PH(n[t]))return n[t];return null}function hhn(n,t,e){var i,r,c,a;for(c=0,a=(r=e).length;c<a;++c)if(i=r[c],n.b.re(t,i.cd()))return i;return null}function fhn(n){var t,e,i,r,c;for(c=1,i=0,r=(e=n).length;i<r;++i)c=31*c+(null!=(t=e[i])?nsn(t):0),c|=0;return c}function lhn(n){var t,e,i,r,c;for(t={},r=0,c=(i=n).length;r<c;++r)t[":"+(null!=(e=i[r]).f?e.f:""+e.g)]=e;return t}function bhn(n){var t;for(yX(n),C_(!0,"numberToAdvance must be nonnegative"),t=0;t<0&&dAn(n);t++)U5(n);return t}function whn(n){var t,e,i;for(i=0,e=new oz(ZL(n.a.Kc(),new h));dAn(e);)(t=BB(U5(e),17)).c.i==t.d.i||++i;return i}function dhn(n,t){var e,i,r;for(e=n,r=0;;){if(e==t)return r;if(!(i=e.e))throw Hp(new wv);e=vW(i),++r}}function ghn(n,t){var e,i,r;for(r=t-n.f,i=new Wb(n.d);i.a<i.c.c.length;)kdn(e=BB(n0(i),443),e.e,e.f+r);n.f=t}function phn(n,t,i){return e.Math.abs(t-n)<_3n||e.Math.abs(i-n)<_3n||(t-n>_3n?n-i>_3n:i-n>_3n)}function vhn(n,t){return n?t&&!n.j||cL(n,124)&&0==BB(n,124).a.b?0:n.Re():0}function mhn(n,t){return n?t&&!n.k||cL(n,124)&&0==BB(n,124).a.a?0:n.Se():0}function yhn(n){return ODn(),n<0?-1!=n?new Rpn(-1,-n):Ytt:n<=10?Ztt[CJ(n)]:new Rpn(1,n)}function khn(n){throw Zun(),Hp(new gy("Unexpected typeof result '"+n+"'; please report this bug to the GWT team"))}function jhn(n){hk(),V$(this),jQ(this),this.e=n,Cxn(this,n),this.g=null==n?zWn:Bbn(n),this.a="",this.b=n,this.a=""}function Ehn(){this.a=new nu,this.f=new dg(this),this.b=new gg(this),this.i=new pg(this),this.e=new vg(this)}function Thn(){cy.call(this,new q8(etn(16))),lin(2,oVn),this.b=2,this.a=new HW(null,null,0,null),iv(this.a,this.a)}function Mhn(){Mhn=O,cvt=new KP("DUMMY_NODE_OVER",0),avt=new KP("DUMMY_NODE_UNDER",1),uvt=new KP("EQUAL",2)}function Shn(){Shn=O,Xat=HJ(Pun(Gk(WPt,1),$Vn,103,0,[(Ffn(),_Pt),FPt])),Wat=HJ(Pun(Gk(WPt,1),$Vn,103,0,[HPt,KPt]))}function Phn(n){return(kUn(),yIt).Hc(n.j)?Gy(MD(mMn(n,(hWn(),Llt)))):Aon(Pun(Gk(PMt,1),sVn,8,0,[n.i.n,n.n,n.a])).b}function Chn(n){var t,e;for(t=n.b.a.a.ec().Kc();t.Ob();)e=new Q$n(BB(t.Pb(),561),n.e,n.f),WB(n.g,e)}function Ihn(n,t){var e,i;e=n.nk(t,null),i=null,t&&(iE(),cen(i=new Kp,n.r)),(e=HTn(n,i,e))&&e.Fi()}function Ohn(n,t){var e,i;for(i=0!=H$n(n.d,1),e=!0;e;)e=!1,e=t.c.Tf(t.e,i),e|=DNn(n,t,i,!1),i=!i;$rn(n)}function Ahn(n,t){var e,i,r;return i=!1,e=t.q.d,t.d<n.b&&(r=dNn(t.q,n.b),t.q.d>r&&(aEn(t.q,r),i=e!=t.q.d)),i}function $hn(n,t){var i,r,c,a,u;return a=t.i,u=t.j,r=a-(i=n.f).i,c=u-i.j,e.Math.sqrt(r*r+c*c)}function Lhn(n,t){var e;return(e=Ydn(n))||(!$Ot&&($Ot=new Oo),RHn(),f9((e=new Cp(YPn(t))).Vk(),n)),e}function Nhn(n,t){var e,i;return(e=BB(n.c.Bc(t),14))?((i=n.hc()).Gc(e),n.d-=e.gc(),e.$b(),n.mc(i)):n.jc()}function xhn(n,t){var e;for(e=0;e<t.length;e++)if(n==(b1(e,t.length),t.charCodeAt(e)))return!0;return!1}function Dhn(n,t){var e;for(e=0;e<t.length;e++)if(n==(b1(e,t.length),t.charCodeAt(e)))return!0;return!1}function Rhn(n){var t,e;if(null==n)return!1;for(t=0,e=n.length;t<e;t++)if(!PH(n[t]))return!1;return!0}function Khn(n){var t;if(0!=n.c)return n.c;for(t=0;t<n.a.length;t++)n.c=33*n.c+(-1&n.a[t]);return n.c=n.c*n.e,n.c}function _hn(n){var t;return Px(n.a!=n.b),t=n.d.a[n.a],Ex(n.b==n.d.c&&null!=t),n.c=n.a,n.a=n.a+1&n.d.a.length-1,t}function Fhn(n){var t;if(!(n.c.c<0?n.a>=n.c.b:n.a<=n.c.b))throw Hp(new yv);return t=n.a,n.a+=n.c.c,++n.b,iln(t)}function Bhn(n){var t;return t=new ftn(n),i2(n.a,sut,new Jy(Pun(Gk(Jat,1),HWn,369,0,[t]))),t.d&&WB(t.f,t.d),t.f}function Hhn(n){var t;return qan(t=new O$(n.a),n),hon(t,(hWn(),dlt),n),t.o.a=n.g,t.o.b=n.f,t.n.a=n.i,t.n.b=n.j,t}function qhn(n,t,e,i){var r,c;for(c=n.Kc();c.Ob();)(r=BB(c.Pb(),70)).n.a=t.a+(i.a-r.o.a)/2,r.n.b=t.b,t.b+=r.o.b+e}function Ghn(n,t,e){var i;for(i=t.a.a.ec().Kc();i.Ob();)if(cY(n,BB(i.Pb(),57),e))return!0;return!1}function zhn(n){var t,e;for(e=new Wb(n.r);e.a<e.c.c.length;)if(t=BB(n0(e),10),n.n[t.p]<=0)return t;return null}function Uhn(n){var t,e;for(e=new Rv,t=new Wb(n);t.a<t.c.c.length;)Frn(e,dDn(BB(n0(t),33)));return e}function Xhn(n){var t;return t=kA(Cmt),BB(mMn(n,(hWn(),Zft)),21).Hc((bDn(),dft))&&dq(t,(yMn(),_at),(lWn(),Bot)),t}function Whn(n,t,e){var i;i=new MOn(n,t),JIn(n.r,t.Hf(),i),e&&!Hz(n.u)&&(i.c=new yJ(n.d),Otn(t.wf(),new Cw(i)))}function Vhn(n,t){var e;return JO(n)&&JO(t)&&(e=n-t,!isNaN(e))?e:Kkn(JO(n)?Pan(n):n,JO(t)?Pan(t):t)}function Qhn(n,t){return t<n.length&&(b1(t,n.length),63!=n.charCodeAt(t))&&(b1(t,n.length),35!=n.charCodeAt(t))}function Yhn(n,t,e,i){var r,c;n.a=t,c=i?0:1,n.f=(r=new ZSn(n.c,n.a,e,c),new uRn(e,n.a,r,n.e,n.b,n.c==(oin(),Amt)))}function Jhn(n,t,e){var i,r;return r=n.a,n.a=t,0!=(4&n.Db)&&0==(1&n.Db)&&(i=new nU(n,1,1,r,t),e?e.Ei(i):e=i),e}function Zhn(n,t,e){var i,r;return r=n.b,n.b=t,0!=(4&n.Db)&&0==(1&n.Db)&&(i=new nU(n,1,3,r,t),e?e.Ei(i):e=i),e}function nfn(n,t,e){var i,r;return r=n.f,n.f=t,0!=(4&n.Db)&&0==(1&n.Db)&&(i=new nU(n,1,0,r,t),e?e.Ei(i):e=i),e}function tfn(n,t){var e,i,r,c;return(c=kCn((i=t,(r=n?Ydn(n):null)&&r.Xk(),i)))==t&&(e=Ydn(n))&&e.Xk(),c}function efn(n,t){var e,i,r;for(r=1,e=n,i=t>=0?t:-t;i>0;)i%2==0?(e*=e,i=i/2|0):(r*=e,i-=1);return t<0?1/r:r}function ifn(n,t){var e,i,r;for(r=1,e=n,i=t>=0?t:-t;i>0;)i%2==0?(e*=e,i=i/2|0):(r*=e,i-=1);return t<0?1/r:r}function rfn(n){var t,e,i,r;if(null!=n)for(e=0;e<n.length;++e)if(t=n[e])for(BB(t.g,367),r=t.i,i=0;i<r;++i);}function cfn(n){var t,i,r;for(r=0,i=new Wb(n.a);i.a<i.c.c.length;)t=BB(n0(i),187),r=e.Math.max(r,t.g);return r}function afn(n){var t,e,i;for(i=new Wb(n.b);i.a<i.c.c.length;)(t=(e=BB(n0(i),214)).c.Rf()?e.f:e.a)&&wqn(t,e.j)}function ufn(){ufn=O,vCt=new HC("INHERIT",0),pCt=new HC("INCLUDE_CHILDREN",1),mCt=new HC("SEPARATE_CHILDREN",2)}function ofn(n,t){switch(t){case 1:return!n.n&&(n.n=new eU(zOt,n,1,7)),void sqn(n.n);case 2:return void $in(n,null)}zun(n,t)}function sfn(n){switch(n.gc()){case 0:return Fnt;case 1:return new Pq(yX(n.Xb(0)));default:return new SY(n)}}function hfn(n){switch(s_(),n.gc()){case 0:return VX(),Vnt;case 1:return new yk(n.Kc().Pb());default:return new vS(n)}}function ffn(n){switch(s_(),n.c){case 0:return VX(),Vnt;case 1:return new yk(JCn(new QT(n)));default:return new sy(n)}}function lfn(n,t){yX(n);try{return n.xc(t)}catch(e){if(cL(e=lun(e),205)||cL(e,173))return null;throw Hp(e)}}function bfn(n,t){yX(n);try{return n.Bc(t)}catch(e){if(cL(e=lun(e),205)||cL(e,173))return null;throw Hp(e)}}function wfn(n,t){yX(n);try{return n.Hc(t)}catch(e){if(cL(e=lun(e),205)||cL(e,173))return!1;throw Hp(e)}}function dfn(n,t){yX(n);try{return n.Mc(t)}catch(e){if(cL(e=lun(e),205)||cL(e,173))return!1;throw Hp(e)}}function gfn(n,t){yX(n);try{return n._b(t)}catch(e){if(cL(e=lun(e),205)||cL(e,173))return!1;throw Hp(e)}}function pfn(n,t){n.a.c.length>0&&dsn(BB(xq(n.a,n.a.c.length-1),570),t)||WB(n.a,new p5(t))}function vfn(n){var t,e;G_(),t=n.d.c-n.e.c,Otn((e=BB(n.g,145)).b,new jd(t)),Otn(e.c,new Ed(t)),e5(e.i,new Td(t))}function mfn(n){var t;return(t=new Ck).a+="VerticalSegment ",uO(t,n.e),t.a+=" ",oO(t,JL(new mk,new Wb(n.k))),t.a}function yfn(n){var t;return(t=BB(lnn(n.c.c,""),229))||(t=new UZ(jj(kj(new pu,""),"Other")),Jgn(n.c.c,"",t)),t}function kfn(n){var t;return 0!=(64&n.Db)?P$n(n):((t=new fN(P$n(n))).a+=" (name: ",cO(t,n.zb),t.a+=")",t.a)}function jfn(n,t,e){var i,r;return r=n.sb,n.sb=t,0!=(4&n.Db)&&0==(1&n.Db)&&(i=new nU(n,1,4,r,t),e?e.Ei(i):e=i),e}function Efn(n,t){var e,i;for(e=0,i=abn(n,t).Kc();i.Ob();)e+=null!=mMn(BB(i.Pb(),11),(hWn(),Elt))?1:0;return e}function Tfn(n,t,e){var i,r,c;for(i=0,c=spn(n,0);c.b!=c.d.c&&!((r=Gy(MD(b3(c))))>e);)r>=t&&++i;return i}function Mfn(n,t,e){var i;return i=new N7(n.e,3,13,null,t.c||(gWn(),l$t),uvn(n,t),!1),e?e.Ei(i):e=i,e}function Sfn(n,t,e){var i;return i=new N7(n.e,4,13,t.c||(gWn(),l$t),null,uvn(n,t),!1),e?e.Ei(i):e=i,e}function Pfn(n,t,e){var i,r;return r=n.r,n.r=t,0!=(4&n.Db)&&0==(1&n.Db)&&(i=new nU(n,1,8,r,n.r),e?e.Ei(i):e=i),e}function Cfn(n,t){var e,i;return!(i=(e=BB(t,676)).vk())&&e.wk(i=cL(t,88)?new $I(n,BB(t,26)):new _0(n,BB(t,148))),i}function Ifn(n,t,e){var i;n.qi(n.i+1),i=n.oi(t,e),t!=n.i&&aHn(n.g,t,n.g,t+1,n.i-t),$X(n.g,t,i),++n.i,n.bi(t,e),n.ci()}function Ofn(n,t){var e;return t.a&&(e=t.a.a.length,n.a?oO(n.a,n.b):n.a=new lN(n.d),G0(n.a,t.a,t.d.length,e)),n}function Afn(n,t){var e,i,r;if(t.vi(n.a),null!=(r=BB(yan(n.a,8),1936)))for(e=0,i=r.length;e<i;++e)null.jm()}function $fn(n,t){var e;return e=new sn,n.a.sd(e)?(CL(),new vy(kW(T7(n,e.a,t)))):(EW(n),CL(),CL(),Set)}function Lfn(n,t){switch(t.g){case 2:case 1:return abn(n,t);case 3:case 4:return ean(abn(n,t))}return SQ(),SQ(),set}function Nfn(n,t){return XI(n)?mK(n,t):UI(n)?vK(n,t):zI(n)?(kW(n),GI(n)===GI(t)):iz(n)?n.Fb(t):AG(n)?FO(n,t):v0(n,t)}function xfn(n){return n?0!=(1&n.i)?n==$Nt?ktt:n==ANt?Att:n==DNt?Ctt:n==xNt?Ptt:n==LNt?Rtt:n==RNt?_tt:n==NNt?Ttt:Stt:n:null}function Dfn(n,t,e,i,r){0!=t&&0!=i&&(1==t?r[i]=dvn(r,e,i,n[0]):1==i?r[t]=dvn(r,n,t,e[0]):YOn(n,e,r,t,i))}function Rfn(n,t){var e;0!=n.c.length&&(hA(e=BB(Qgn(n,x8(Out,a1n,10,n.c.length,0,1)),193),new Oe),eOn(e,t))}function Kfn(n,t){var e;0!=n.c.length&&(hA(e=BB(Qgn(n,x8(Out,a1n,10,n.c.length,0,1)),193),new Ae),eOn(e,t))}function _fn(n,t,e,i){switch(t){case 1:return!n.n&&(n.n=new eU(zOt,n,1,7)),n.n;case 2:return n.k}return Eyn(n,t,e,i)}function Ffn(){Ffn=O,BPt=new KC(hJn,0),FPt=new KC(aJn,1),_Pt=new KC(cJn,2),KPt=new KC(pJn,3),HPt=new KC("UP",4)}function Bfn(){Bfn=O,wut=new YS(QZn,0),but=new YS("INSIDE_PORT_SIDE_GROUPS",1),lut=new YS("FORCE_MODEL_ORDER",2)}function Hfn(n,t,e){if(n<0||t>e)throw Hp(new Ay(mYn+n+kYn+t+", size: "+e));if(n>t)throw Hp(new _y(mYn+n+yYn+t))}function qfn(n,t,e){if(t<0)cIn(n,e);else{if(!e.Ij())throw Hp(new _y(r6n+e.ne()+c6n));BB(e,66).Nj().Vj(n,n.yh(),t)}}function Gfn(n,t,e,i,r,c,a,u){var o;for(o=e;c<a;)o>=i||t<e&&u.ue(n[t],n[o])<=0?$X(r,c++,n[t++]):$X(r,c++,n[o++])}function zfn(n,t,e,i,r,c){this.e=new Np,this.f=(ain(),Gvt),WB(this.e,n),this.d=t,this.a=e,this.b=i,this.f=r,this.c=c}function Ufn(n,t){var e,i;for(i=new AL(n);i.e!=i.i.gc();)if(e=BB(kpn(i),26),GI(t)===GI(e))return!0;return!1}function Xfn(n){var t,e,i,r;for(dWn(),i=0,r=(e=tpn()).length;i<r;++i)if(-1!=E7((t=e[i]).a,n,0))return t;return Irt}function Wfn(n){return n>=65&&n<=70?n-65+10:n>=97&&n<=102?n-97+10:n>=48&&n<=57?n-48:0}function Vfn(n){var t;return 0!=(64&n.Db)?P$n(n):((t=new fN(P$n(n))).a+=" (source: ",cO(t,n.d),t.a+=")",t.a)}function Qfn(n,t,e){var i,r;return r=n.a,n.a=t,0!=(4&n.Db)&&0==(1&n.Db)&&(i=new nU(n,1,5,r,n.a),e?KEn(e,i):e=i),e}function Yfn(n,t){var e;e=0!=(256&n.Bb),t?n.Bb|=256:n.Bb&=-257,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new t6(n,1,2,e,t))}function Jfn(n,t){var e;e=0!=(256&n.Bb),t?n.Bb|=256:n.Bb&=-257,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new t6(n,1,8,e,t))}function Zfn(n,t){var e;e=0!=(256&n.Bb),t?n.Bb|=256:n.Bb&=-257,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new t6(n,1,8,e,t))}function nln(n,t){var e;e=0!=(512&n.Bb),t?n.Bb|=512:n.Bb&=-513,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new t6(n,1,3,e,t))}function tln(n,t){var e;e=0!=(512&n.Bb),t?n.Bb|=512:n.Bb&=-513,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new t6(n,1,9,e,t))}function eln(n,t){var e;return-1==n.b&&n.a&&(e=n.a.Gj(),n.b=e?n.c.Xg(n.a.aj(),e):Awn(n.c.Tg(),n.a)),n.c.Og(n.b,t)}function iln(n){var t,e;return n>-129&&n<128?(t=n+128,!(e=(tq(),Itt)[t])&&(e=Itt[t]=new xb(n)),e):new xb(n)}function rln(n){var t,e;return n>-129&&n<128?(t=n+128,!(e=(Tq(),Ktt)[t])&&(e=Ktt[t]=new Rb(n)),e):new Rb(n)}function cln(n){var t;return n.k==(uSn(),Mut)&&((t=BB(mMn(n,(hWn(),Qft)),61))==(kUn(),sIt)||t==SIt)}function aln(n,t,e){var i,r;return(r=$$n(n.b,t))&&(i=BB(NHn(F7(n,r),""),26))?m$n(n,i,t,e):null}function uln(n,t,e){var i,r;return(r=$$n(n.b,t))&&(i=BB(NHn(F7(n,r),""),26))?y$n(n,i,t,e):null}function oln(n,t){var e,i;for(i=new AL(n);i.e!=i.i.gc();)if(e=BB(kpn(i),138),GI(t)===GI(e))return!0;return!1}function sln(n,t,e){var i;if(t>(i=n.gc()))throw Hp(new tK(t,i));if(n.hi()&&n.Hc(e))throw Hp(new _y(a8n));n.Xh(t,e)}function hln(n,t){var e;if(null==(e=sen(n.i,t)))throw Hp(new ek("Node did not exist in input."));return Kcn(t,e),null}function fln(n,t){var e;if(cL(e=NNn(n,t),322))return BB(e,34);throw Hp(new _y(r6n+t+"' is not a valid attribute"))}function lln(n,t,e){var i,r;for(r=cL(t,99)&&0!=(BB(t,18).Bb&BQn)?new xO(t,n):new Aan(t,n),i=0;i<e;++i)cvn(r);return r}function bln(n){var t,e,i;for(i=0,e=n.length,t=0;t<e;t++)32==n[t]||13==n[t]||10==n[t]||9==n[t]||(n[i++]=n[t]);return i}function wln(n){var t,e,i;for(t=new Np,i=new Wb(n.b);i.a<i.c.c.length;)e=BB(n0(i),594),gun(t,BB(e.jf(),14));return t}function dln(n){var t,e;for(e=BB(mMn(n,(qqn(),lkt)),15).Kc();e.Ob();)DH((t=BB(e.Pb(),188)).b.d,t),DH(t.c.b,t)}function gln(n){switch(BB(mMn(n,(hWn(),ilt)),303).g){case 1:hon(n,ilt,(z7(),Sft));break;case 2:hon(n,ilt,(z7(),Cft))}}function pln(n){var t;n.g&&(xxn((t=n.c.Rf()?n.f:n.a).a,n.o,!0),xxn(t.a,n.o,!1),hon(n.o,(HXn(),ept),(QEn(),UCt)))}function vln(n){var t;if(!n.a)throw Hp(new Fy("Cannot offset an unassigned cut."));t=n.c-n.b,n.b+=t,xQ(n,t),NQ(n,t)}function mln(n){var t;return null==(t=n.a[n.c-1&n.a.length-1])?null:(n.c=n.c-1&n.a.length-1,$X(n.a,n.c,null),t)}function yln(n){var t,e;for(e=n.p.a.ec().Kc();e.Ob();)if((t=BB(e.Pb(),213)).f&&n.b[t.c]<-1e-10)return t;return null}function kln(n,t){switch(n.b.g){case 0:case 1:return t;case 2:case 3:return new UV(t.d,0,t.a,t.b);default:return null}}function jln(n){switch(n.g){case 2:return FPt;case 1:return _Pt;case 4:return KPt;case 3:return HPt;default:return BPt}}function Eln(n){switch(n.g){case 1:return CIt;case 2:return sIt;case 3:return oIt;case 4:return SIt;default:return PIt}}function Tln(n){switch(n.g){case 1:return SIt;case 2:return CIt;case 3:return sIt;case 4:return oIt;default:return PIt}}function Mln(n){switch(n.g){case 1:return oIt;case 2:return SIt;case 3:return CIt;case 4:return sIt;default:return PIt}}function Sln(n){switch(n){case 0:return new mm;case 1:return new pm;case 2:return new vm;default:throw Hp(new wv)}}function Pln(n,t){return n<t?-1:n>t?1:n==t?0==n?Pln(1/n,1/t):0:isNaN(n)?isNaN(t)?0:1:-1}function Cln(n,t){OTn(t,"Sort end labels",1),JT(AV(wnn(new Rq(null,new w1(n.b,16)),new we),new de),new ge),HSn(t)}function Iln(n,t,e){var i,r;return n.ej()?(r=n.fj(),i=YIn(n,t,e),n.$i(n.Zi(7,iln(e),i,t,r)),i):YIn(n,t,e)}function Oln(n,t){var e,i,r;null==n.d?(++n.e,--n.f):(r=t.cd(),N6(n,i=((e=t.Sh())&DWn)%n.d.length,A$n(n,i,e,r)))}function Aln(n,t){var e;e=0!=(n.Bb&k6n),t?n.Bb|=k6n:n.Bb&=-1025,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new t6(n,1,10,e,t))}function $ln(n,t){var e;e=0!=(n.Bb&_Qn),t?n.Bb|=_Qn:n.Bb&=-4097,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new t6(n,1,12,e,t))}function Lln(n,t){var e;e=0!=(n.Bb&T9n),t?n.Bb|=T9n:n.Bb&=-8193,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new t6(n,1,15,e,t))}function Nln(n,t){var e;e=0!=(n.Bb&M9n),t?n.Bb|=M9n:n.Bb&=-2049,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new t6(n,1,11,e,t))}function xln(n,t){var e;return 0!=(e=Pln(n.b.c,t.b.c))||0!=(e=Pln(n.a.a,t.a.a))?e:Pln(n.a.b,t.a.b)}function Dln(n,t){var e;if(null==(e=RX(n.k,t)))throw Hp(new ek("Port did not exist in input."));return Kcn(t,e),null}function Rln(n){var t,e;for(e=G$n(Utn(n)).Kc();e.Ob();)if(N_n(n,t=SD(e.Pb())))return y4((UM(),RAt),t);return null}function Kln(n,t){var e,i,r,c,a;for(a=axn(n.e.Tg(),t),c=0,e=BB(n.g,119),r=0;r<n.i;++r)i=e[r],a.rl(i.ak())&&++c;return c}function _ln(n,t,e){var i,r;return i=BB(t.We(n.a),35),r=BB(e.We(n.a),35),null!=i&&null!=r?Ncn(i,r):null!=i?-1:null!=r?1:0}function Fln(n,t,e){var i;if(n.c)lMn(n.c,t,e);else for(i=new Wb(n.b);i.a<i.c.c.length;)Fln(BB(n0(i),157),t,e)}function Bln(n,t){var e,i;for(i=new Wb(t);i.a<i.c.c.length;)e=BB(n0(i),46),y7(n.b.b,e.b),uY(BB(e.a,189),BB(e.b,81))}function Hln(n){var t,e;for(e=xX(new Ck,91),t=!0;n.Ob();)t||(e.a+=FWn),t=!1,uO(e,n.Pb());return(e.a+="]",e).a}function qln(n,t){var e;e=0!=(n.Bb&hVn),t?n.Bb|=hVn:n.Bb&=-16385,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new t6(n,1,16,e,t))}function Gln(n,t){var e;e=0!=(n.Bb&h6n),t?n.Bb|=h6n:n.Bb&=-32769,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new t6(n,1,18,e,t))}function zln(n,t){var e;e=0!=(n.Bb&h6n),t?n.Bb|=h6n:n.Bb&=-32769,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new t6(n,1,18,e,t))}function Uln(n,t){var e;e=0!=(n.Bb&BQn),t?n.Bb|=BQn:n.Bb&=-65537,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new t6(n,1,20,e,t))}function Xln(n){var t;return t=x8(ONt,WVn,25,2,15,1),n-=BQn,t[0]=(n>>10)+HQn&QVn,t[1]=56320+(1023&n)&QVn,Bdn(t,0,t.length)}function Wln(n){var t;return(t=BB(mMn(n,(HXn(),Udt)),103))==(Ffn(),BPt)?Gy(MD(mMn(n,Edt)))>=1?FPt:KPt:t}function Vln(n){switch(BB(mMn(n,(HXn(),Zdt)),218).g){case 1:return new ic;case 3:return new oc;default:return new ec}}function Qln(n){if(n.c)Qln(n.c);else if(n.d)throw Hp(new Fy("Stream already terminated, can't be modified or used"))}function Yln(n){var t;return 0!=(64&n.Db)?P$n(n):((t=new fN(P$n(n))).a+=" (identifier: ",cO(t,n.k),t.a+=")",t.a)}function Jln(n,t,e){var i;return tE(),jen(i=new ro,t),Een(i,e),n&&f9((!n.a&&(n.a=new $L(xOt,n,5)),n.a),i),i}function Zln(n,t,e,i){var r,c;return kW(i),kW(e),null==(c=null==(r=n.xc(t))?e:ZT(BB(r,15),BB(e,14)))?n.Bc(t):n.zc(t,c),c}function nbn(n){var t,e,i,r;return orn(e=new YK(t=BB(Vj((r=(i=n.gm).f)==Unt?i:r),9),BB(SR(t,t.length),9),0),n),e}function tbn(n,t,e){var i,r;for(r=n.a.ec().Kc();r.Ob();)if(i=BB(r.Pb(),10),oun(e,BB(xq(t,i.p),14)))return i;return null}function ebn(n,t,e){try{_on(n,t,e)}catch(i){throw cL(i=lun(i),597)?Hp(new g5(i)):Hp(i)}return t}function ibn(n,t){var e;return JO(n)&&JO(t)&&$Qn<(e=n-t)&&e<OQn?e:uan(hun(JO(n)?Pan(n):n,JO(t)?Pan(t):t))}function rbn(n,t){var e;return JO(n)&&JO(t)&&$Qn<(e=n+t)&&e<OQn?e:uan(sun(JO(n)?Pan(n):n,JO(t)?Pan(t):t))}function cbn(n,t){var e;return JO(n)&&JO(t)&&$Qn<(e=n*t)&&e<OQn?e:uan(fqn(JO(n)?Pan(n):n,JO(t)?Pan(t):t))}function abn(n,t){var e;return n.i||eIn(n),(e=BB(oV(n.g,t),46))?new s1(n.j,BB(e.a,19).a,BB(e.b,19).a):(SQ(),SQ(),set)}function ubn(n,t,e){var i;return i=n.a.get(t),n.a.set(t,void 0===e?null:e),void 0===i?(++n.c,oY(n.b)):++n.d,i}function obn(n,t,i){n.n=kq(LNt,[sVn,FQn],[364,25],14,[i,CJ(e.Math.ceil(t/32))],2),n.o=t,n.p=i,n.j=t-1>>1,n.k=i-1>>1}function sbn(){var n,t,i;yTn(),i=Let+++Date.now(),n=CJ(e.Math.floor(i*uYn))&sYn,t=CJ(i-n*oYn),this.a=1502^n,this.b=t^aYn}function hbn(n){var t,e;for(t=new Np,e=new Wb(n.j);e.a<e.c.c.length;)WB(t,BB(n0(e),11).b);return yX(t),new OO(t)}function fbn(n){var t,e;for(t=new Np,e=new Wb(n.j);e.a<e.c.c.length;)WB(t,BB(n0(e),11).e);return yX(t),new OO(t)}function lbn(n){var t,e;for(t=new Np,e=new Wb(n.j);e.a<e.c.c.length;)WB(t,BB(n0(e),11).g);return yX(t),new OO(t)}function bbn(n){var t,e;for(e=t$n(Utn(dZ(n))).Kc();e.Ob();)if(N_n(n,t=SD(e.Pb())))return k4((XM(),UAt),t);return null}function wbn(n){var t,e;for(t=0,e=n.length;t<e;t++)if(null==n[t])throw Hp(new Hy("at index "+t));return new Jy(n)}function dbn(n,t){var e;if(cL(e=NNn(n.Tg(),t),99))return BB(e,18);throw Hp(new _y(r6n+t+"' is not a valid reference"))}function gbn(n){var t;return(t=bSn(n))>34028234663852886e22?RQn:t<-34028234663852886e22?KQn:t}function pbn(n){return n=((n=((n-=n>>1&1431655765)>>2&858993459)+(858993459&n))>>4)+n&252645135,n+=n>>8,63&(n+=n>>16)}function vbn(n){var t,e,i;for(t=new hR(n.Hd().gc()),i=0,e=L9(n.Hd().Kc());e.Ob();)jZ(t,e.Pb(),iln(i++));return NSn(t.a)}function mbn(n,t){var e,i,r;for(r=new xp,i=t.vc().Kc();i.Ob();)VW(r,(e=BB(i.Pb(),42)).cd(),lan(n,BB(e.dd(),15)));return r}function ybn(n,t){0==n.n.c.length&&WB(n.n,new RJ(n.s,n.t,n.i)),WB(n.b,t),smn(BB(xq(n.n,n.n.c.length-1),211),t),BFn(n,t)}function kbn(n){return n.c==n.b.b&&n.i==n.g.b||(n.a.c=x8(Ant,HWn,1,0,5,1),gun(n.a,n.b),gun(n.a,n.g),n.c=n.b.b,n.i=n.g.b),n.a}function jbn(n,t){var e,i;for(i=0,e=BB(t.Kb(n),20).Kc();e.Ob();)qy(TD(mMn(BB(e.Pb(),17),(hWn(),Clt))))||++i;return i}function Ebn(n,t){var i,r;r=Gy(MD(edn(f2(t),(HXn(),ypt)))),Fkn(t,i=e.Math.max(0,r/2-.5),1),WB(n,new lP(t,i))}function Tbn(){Tbn=O,qlt=new BP(QZn,0),_lt=new BP("FIRST",1),Flt=new BP(C1n,2),Blt=new BP("LAST",3),Hlt=new BP(I1n,4)}function Mbn(){Mbn=O,ZPt=new FC(hJn,0),YPt=new FC("POLYLINE",1),QPt=new FC("ORTHOGONAL",2),JPt=new FC("SPLINES",3)}function Sbn(){Sbn=O,Zjt=new kC("ASPECT_RATIO_DRIVEN",0),nEt=new kC("MAX_SCALE_DRIVEN",1),Jjt=new kC("AREA_DRIVEN",2)}function Pbn(){Pbn=O,HEt=new EC("P1_STRUCTURE",0),qEt=new EC("P2_PROCESSING_ORDER",1),GEt=new EC("P3_EXECUTION",2)}function Cbn(){Cbn=O,ejt=new gC("OVERLAP_REMOVAL",0),njt=new gC("COMPACTION",1),tjt=new gC("GRAPH_SIZE_CALCULATION",2)}function Ibn(n,t){return h$(),rin(KVn),e.Math.abs(n-t)<=KVn||n==t||isNaN(n)&&isNaN(t)?0:n<t?-1:n>t?1:zO(isNaN(n),isNaN(t))}function Obn(n,t){var e,i;for(e=spn(n,0);e.b!=e.d.c;){if((i=zy(MD(b3(e))))==t)return;if(i>t){U0(e);break}}nX(e,t)}function Abn(n,t){var e,i,r,c,a;if(e=t.f,Jgn(n.c.d,e,t),null!=t.g)for(c=0,a=(r=t.g).length;c<a;++c)i=r[c],Jgn(n.c.e,i,t)}function $bn(n,t,e,i){var r,c,a;for(r=t+1;r<e;++r)for(c=r;c>t&&i.ue(n[c-1],n[c])>0;--c)a=n[c],$X(n,c,n[c-1]),$X(n,c-1,a)}function Lbn(n,t,e,i){if(t<0)TLn(n,e,i);else{if(!e.Ij())throw Hp(new _y(r6n+e.ne()+c6n));BB(e,66).Nj().Tj(n,n.yh(),t,i)}}function Nbn(n,t){if(t==n.d)return n.e;if(t==n.e)return n.d;throw Hp(new _y("Node "+t+" not part of edge "+n))}function xbn(n,t){switch(t.g){case 2:return n.b;case 1:return n.c;case 4:return n.d;case 3:return n.a;default:return!1}}function Dbn(n,t){switch(t.g){case 2:return n.b;case 1:return n.c;case 4:return n.d;case 3:return n.a;default:return!1}}function Rbn(n,t,e,i){switch(t){case 3:return n.f;case 4:return n.g;case 5:return n.i;case 6:return n.j}return _fn(n,t,e,i)}function Kbn(n){return n.k==(uSn(),Cut)&&o5(new Rq(null,new zU(new oz(ZL(lbn(n).a.Kc(),new h)))),new qr)}function _bn(n){return null==n.e?n:(!n.c&&(n.c=new rRn(0!=(256&n.f),n.i,n.a,n.d,0!=(16&n.f),n.j,n.g,null)),n.c)}function Fbn(n,t){return n.h==CQn&&0==n.m&&0==n.l?(t&&(ltt=M$(0,0,0)),WO((X7(),dtt))):(t&&(ltt=M$(n.l,n.m,n.h)),M$(0,0,0))}function Bbn(n){return Array.isArray(n)&&n.im===I?nE(tsn(n))+"@"+(nsn(n)>>>0).toString(16):n.toString()}function Hbn(n){var t;this.a=new YK(t=BB(n.e&&n.e(),9),BB(SR(t,t.length),9),0),this.b=x8(Ant,HWn,1,this.a.a.length,5,1)}function qbn(n){var t,e,i;for(this.a=new fA,i=new Wb(n);i.a<i.c.c.length;)e=BB(n0(i),14),brn(t=new hG,e),TU(this.a,t)}function Gbn(n){var t,e;for(qD(),t=n.o.b,e=BB(BB(h6(n.r,(kUn(),SIt)),21),84).Kc();e.Ob();)BB(e.Pb(),111).e.b+=t}function zbn(n){var t;if(n.b){if(zbn(n.b),n.b.d!=n.c)throw Hp(new vv)}else n.d.dc()&&(t=BB(n.f.c.xc(n.e),14))&&(n.d=t)}function Ubn(n){var t;return null==n||(t=n.length)>0&&(b1(t-1,n.length),58==n.charCodeAt(t-1))&&!Xbn(n,LAt,NAt)}function Xbn(n,t,e){var i,r;for(i=0,r=n.length;i<r;i++)if(ton((b1(i,n.length),n.charCodeAt(i)),t,e))return!0;return!1}function Wbn(n,t){var e,i;for(i=n.e.a.ec().Kc();i.Ob();)if(tSn(t,(e=BB(i.Pb(),266)).d)||ICn(t,e.d))return!0;return!1}function Vbn(n,t){var e,i,r;for(r=(i=HRn(n,t))[i.length-1]/2,e=0;e<i.length;e++)if(i[e]>=r)return t.c+e;return t.c+t.b.gc()}function Qbn(n,t){var e,i,r,c;for(dD(),r=t,z9(i=H9(n),0,i.length,r),e=0;e<i.length;e++)e!=(c=gkn(n,i[e],e))&&Iln(n,e,c)}function Ybn(n,t){var e,i,r,c,a,u;for(i=0,e=0,a=0,u=(c=t).length;a<u;++a)(r=c[a])>0&&(i+=r,++e);return e>1&&(i+=n.d*(e-1)),i}function Jbn(n){var t,e,i;for((i=new Sk).a+="[",t=0,e=n.gc();t<e;)cO(i,kN(n.ki(t))),++t<e&&(i.a+=FWn);return i.a+="]",i.a}function Zbn(n){var t,e,i;return i=ATn(n),!WE(n.c)&&(rtn(i,"knownLayouters",e=new Cl),t=new rp(e),e5(n.c,t)),i}function nwn(n,t){var e,i;for(kW(t),e=!1,i=new Wb(n);i.a<i.c.c.length;)ywn(t,n0(i),!1)&&(AU(i),e=!0);return e}function twn(n){var t,e;for(e=Gy(MD(n.a.We((sWn(),OPt)))),t=new Wb(n.a.xf());t.a<t.c.c.length;)VUn(n,BB(n0(t),680),e)}function ewn(n,t){var e,i;for(i=new Wb(t);i.a<i.c.c.length;)e=BB(n0(i),46),WB(n.b.b,BB(e.b,81)),g2(BB(e.a,189),BB(e.b,81))}function iwn(n,t,e){var i,r;for(i=(r=n.a.b).c.length;i<e;i++)kG(r,0,new HX(n.a));PZ(t,BB(xq(r,r.c.length-e),29)),n.b[t.p]=e}function rwn(n,t,e){var i;!(i=e)&&(i=LH(new Xm,0)),OTn(i,qZn,2),mvn(n.b,t,mcn(i,1)),Kqn(n,t,mcn(i,1)),qUn(t,mcn(i,1)),HSn(i)}function cwn(n,t,e,i,r){BZ(),UNn(aM(cM(rM(uM(new Hv,0),r.d.e-n),t),r.d)),UNn(aM(cM(rM(uM(new Hv,0),e-r.a.e),r.a),i))}function awn(n,t,e,i,r,c){this.a=n,this.c=t,this.b=e,this.f=i,this.d=r,this.e=c,this.c>0&&this.b>0&&Yq(this.c,this.b,this.a)}function uwn(n){Rwn(),this.c=u6(Pun(Gk(rMt,1),HWn,831,0,[Wpt])),this.b=new xp,this.a=n,VW(this.b,Vpt,1),Otn(Qpt,new Pg(this))}function own(n,t){var e;return n.d?hU(n.b,t)?BB(RX(n.b,t),51):(e=t.Kf(),VW(n.b,t,e),e):t.Kf()}function swn(n,t){var e;return GI(n)===GI(t)||!!cL(t,91)&&(e=BB(t,91),n.e==e.e&&n.d==e.d&&E4(n,e.a))}function hwn(n){switch(kUn(),n.g){case 4:return sIt;case 1:return oIt;case 3:return SIt;case 2:return CIt;default:return PIt}}function fwn(n,t){switch(t){case 3:return 0!=n.f;case 4:return 0!=n.g;case 5:return 0!=n.i;case 6:return 0!=n.j}return Ean(n,t)}function lwn(n){switch(n.g){case 0:return new Ga;case 1:return new za;default:throw Hp(new _y(c4n+(null!=n.f?n.f:""+n.g)))}}function bwn(n){switch(n.g){case 0:return new qa;case 1:return new Ua;default:throw Hp(new _y(M1n+(null!=n.f?n.f:""+n.g)))}}function wwn(n){switch(n.g){case 0:return new Vm;case 1:return new ym;default:throw Hp(new _y(N4n+(null!=n.f?n.f:""+n.g)))}}function dwn(n){switch(n.g){case 1:return new Ra;case 2:return new gD;default:throw Hp(new _y(c4n+(null!=n.f?n.f:""+n.g)))}}function gwn(n){var t,e;if(n.b)return n.b;for(e=Qet?null:n.d;e;){if(t=Qet?null:e.b)return t;e=Qet?null:e.d}return lM(),Het}function pwn(n){var t,e;return 0==n.e?0:(t=n.d<<5,e=n.a[n.d-1],n.e<0&&Ccn(n)==n.d-1&&(--e,e|=0),t-=ZIn(e))}function vwn(n){var t,e,i;return n<tet.length?tet[n]:(t=31&n,(i=x8(ANt,hQn,25,1+(e=n>>5),15,1))[e]=1<<t,new lU(1,e+1,i))}function mwn(n){var t,e,i;return(e=n.zg())?cL(t=n.Ug(),160)&&null!=(i=mwn(BB(t,160)))?i+"."+e:e:null}function ywn(n,t,e){var i,r;for(r=n.Kc();r.Ob();)if(i=r.Pb(),GI(t)===GI(i)||null!=t&&Nfn(t,i))return e&&r.Qb(),!0;return!1}function kwn(n,t,e){var i,r;if(++n.j,e.dc())return!1;for(r=e.Kc();r.Ob();)i=r.Pb(),n.Hi(t,n.oi(t,i)),++t;return!0}function jwn(n,t,e,i){var r,c;if((c=e-t)<3)for(;c<3;)n*=10,++c;else{for(r=1;c>3;)r*=10,--c;n=(n+(r>>1))/r|0}return i.i=n,!0}function Ewn(n){return Shn(),hN(),!!(Dbn(BB(n.a,81).j,BB(n.b,103))||0!=BB(n.a,81).d.e&&Dbn(BB(n.a,81).j,BB(n.b,103)))}function Twn(n){x9(),BB(n.We((sWn(),qSt)),174).Hc((n_n(),VIt))&&(BB(n.We(fPt),174).Fc((lIn(),cIt)),BB(n.We(qSt),174).Mc(VIt))}function Mwn(n,t){var e;if(t){for(e=0;e<n.i;++e)if(BB(n.g[e],366).Di(t))return!1;return f9(n,t)}return!1}function Swn(n){var t,e,i;for(t=new Cl,i=new qb(n.b.Kc());i.b.Ob();)e=VSn(BB(i.b.Pb(),686)),WU(t,t.a.length,e);return t.a}function Pwn(n){var t;return!n.c&&(n.c=new Nn),m$(n.d,new Dn),YKn(n),t=lDn(n),JT(new Rq(null,new w1(n.d,16)),new Iw(n)),t}function Cwn(n){var t;return 0!=(64&n.Db)?kfn(n):((t=new fN(kfn(n))).a+=" (instanceClassName: ",cO(t,n.D),t.a+=")",t.a)}function Iwn(n,t){var e,i;t&&(e=Ren(t,"x"),Ten(new Zg(n).a,(kW(e),e)),i=Ren(t,"y"),Oen(new np(n).a,(kW(i),i)))}function Own(n,t){var e,i;t&&(e=Ren(t,"x"),Ien(new Vg(n).a,(kW(e),e)),i=Ren(t,"y"),Aen(new Yg(n).a,(kW(i),i)))}function Awn(n,t){var e,i,r;if(null==n.i&&qFn(n),e=n.i,-1!=(i=t.aj()))for(r=e.length;i<r;++i)if(e[i]==t)return i;return-1}function $wn(n){var t,e,i,r;for(e=BB(n.g,674),i=n.i-1;i>=0;--i)for(t=e[i],r=0;r<i;++r)if(vFn(n,t,e[r])){Lyn(n,i);break}}function Lwn(n){var t=n.e;function e(n){return n&&0!=n.length?"\t"+n.join("\n\t"):""}return t&&(t.stack||e(n[UVn]))}function Nwn(n){var t;switch(WX(),(t=n.Pc()).length){case 0:return Fnt;case 1:return new Pq(yX(t[0]));default:return new SY(wbn(t))}}function xwn(n,t){switch(t.g){case 1:return KB(n.j,(gcn(),Nut));case 2:return KB(n.j,(gcn(),Dut));default:return SQ(),SQ(),set}}function Dwn(n,t){switch(t){case 3:return void Men(n,0);case 4:return void Sen(n,0);case 5:return void Pen(n,0);case 6:return void Cen(n,0)}ofn(n,t)}function Rwn(){Rwn=O,AM(),HXn(),Vpt=Opt,Qpt=u6(Pun(Gk(lMt,1),k3n,146,0,[mpt,ypt,jpt,Ept,Spt,Ppt,Cpt,Ipt,$pt,Npt,kpt,Tpt,Apt]))}function Kwn(n){var t,e;t=n.d==($Pn(),Jst),e=$En(n),hon(n.a,(HXn(),kdt),t&&!e||!t&&e?(wvn(),$Mt):(wvn(),AMt))}function _wn(n,t){var e;return(e=BB(P4(n,m9(new H,new B,new rn,Pun(Gk(nit,1),$Vn,132,0,[(qsn(),Uet)]))),15)).Qc(lH(e.gc()))}function Fwn(){Fwn=O,eOt=new YC("SIMPLE",0),ZIt=new YC("GROUP_DEC",1),tOt=new YC("GROUP_MIXED",2),nOt=new YC("GROUP_INC",3)}function Bwn(){Bwn=O,z$t=new $o,K$t=new Lo,_$t=new No,F$t=new xo,B$t=new Do,H$t=new Ro,q$t=new Ko,G$t=new _o,U$t=new Fo}function Hwn(n,t,e){qtn(),sm.call(this),this.a=kq(Xit,[sVn,rJn],[595,212],0,[nrt,Zit],2),this.c=new bA,this.g=n,this.f=t,this.d=e}function qwn(n,t){this.n=kq(LNt,[sVn,FQn],[364,25],14,[t,CJ(e.Math.ceil(n/32))],2),this.o=n,this.p=t,this.j=n-1>>1,this.k=t-1>>1}function Gwn(n,t){OTn(t,"End label post-processing",1),JT(AV(wnn(new Rq(null,new w1(n.b,16)),new ae),new ue),new oe),HSn(t)}function zwn(n,t,e){var i;return i=Gy(n.p[t.i.p])+Gy(n.d[t.i.p])+t.n.b+t.a.b,Gy(n.p[e.i.p])+Gy(n.d[e.i.p])+e.n.b+e.a.b-i}function Uwn(n,t,e){var i,r;for(i=e0(e,UQn),r=0;0!=Vhn(i,0)&&r<t;r++)i=rbn(i,e0(n[r],UQn)),n[r]=dG(i),i=kz(i,32);return dG(i)}function Xwn(n){var t,e,i,r;for(r=0,e=0,i=n.length;e<i;e++)b1(e,n.length),(t=n.charCodeAt(e))<64&&(r=i0(r,yz(1,t)));return r}function Wwn(n){var t;return null==n?null:new $A((t=FBn(n,!0)).length>0&&(b1(0,t.length),43==t.charCodeAt(0))?t.substr(1):t)}function Vwn(n){var t;return null==n?null:new $A((t=FBn(n,!0)).length>0&&(b1(0,t.length),43==t.charCodeAt(0))?t.substr(1):t)}function Qwn(n,t){return n.i>0&&(t.length<n.i&&(t=Den(tsn(t).c,n.i)),aHn(n.g,0,t,0,n.i)),t.length>n.i&&$X(t,n.i,null),t}function Ywn(n,t,e){var i,r,c;return n.ej()?(i=n.i,c=n.fj(),Ifn(n,i,t),r=n.Zi(3,null,t,i,c),e?e.Ei(r):e=r):Ifn(n,n.i,t),e}function Jwn(n,t,e){var i,r;return i=new N7(n.e,4,10,cL(r=t.c,88)?BB(r,26):(gWn(),d$t),null,uvn(n,t),!1),e?e.Ei(i):e=i,e}function Zwn(n,t,e){var i,r;return i=new N7(n.e,3,10,null,cL(r=t.c,88)?BB(r,26):(gWn(),d$t),uvn(n,t),!1),e?e.Ei(i):e=i,e}function ndn(n){var t;return qD(),t=new wA(BB(n.e.We((sWn(),BSt)),8)),n.B.Hc((n_n(),GIt))&&(t.a<=0&&(t.a=20),t.b<=0&&(t.b=20)),t}function tdn(n){return bvn(),(n.q?n.q:(SQ(),SQ(),het))._b((HXn(),Rgt))?BB(mMn(n,Rgt),197):BB(mMn(vW(n),Kgt),197)}function edn(n,t){var e,i;return i=null,Lx(n,(HXn(),Mpt))&&(e=BB(mMn(n,Mpt),94)).Xe(t)&&(i=e.We(t)),null==i&&(i=mMn(vW(n),t)),i}function idn(n,t){var e,i,r;return!!cL(t,42)&&(i=(e=BB(t,42)).cd(),wW(r=lfn(n.Rc(),i),e.dd())&&(null!=r||n.Rc()._b(i)))}function rdn(n,t){var e;return n.f>0&&(n.qj(),-1!=A$n(n,((e=null==t?0:nsn(t))&DWn)%n.d.length,e,t))}function cdn(n,t){var e,i;return n.f>0&&(n.qj(),e=aOn(n,((i=null==t?0:nsn(t))&DWn)%n.d.length,i,t))?e.dd():null}function adn(n,t){var e,i,r,c;for(c=axn(n.e.Tg(),t),e=BB(n.g,119),r=0;r<n.i;++r)if(i=e[r],c.rl(i.ak()))return!1;return!0}function udn(n){if(null==n.b){for(;n.a.Ob();)if(n.b=n.a.Pb(),!BB(n.b,49).Zg())return!0;return n.b=null,!1}return!0}function odn(n,t){n.mj();try{n.d.Vc(n.e++,t),n.f=n.d.j,n.g=-1}catch(e){throw cL(e=lun(e),73)?Hp(new vv):Hp(e)}}function sdn(n,t){var e,i;return s$(),i=null,t==(e=fR((fk(),fk(),rtt)))&&(i=BB(SJ(itt,n),615)),i||(i=new zX(n),t==e&&mZ(itt,n,i)),i}function hdn(n,t){var i,r;n.a=rbn(n.a,1),n.c=e.Math.min(n.c,t),n.b=e.Math.max(n.b,t),n.d+=t,i=t-n.f,r=n.e+i,n.f=r-n.e-i,n.e=r}function fdn(n,t){var e;n.c=t,n.a=pwn(t),n.a<54&&(n.f=(e=t.d>1?i0(yz(t.a[1],32),e0(t.a[0],UQn)):e0(t.a[0],UQn),j2(cbn(t.e,e))))}function ldn(n,t){var e;return JO(n)&&JO(t)&&$Qn<(e=n%t)&&e<OQn?e:uan((Aqn(JO(n)?Pan(n):n,JO(t)?Pan(t):t,!0),ltt))}function bdn(n,t){var e;Dzn(t),(e=BB(mMn(n,(HXn(),Jdt)),276))&&hon(n,Jdt,Ayn(e)),nx(n.c),nx(n.f),V6(n.d),V6(BB(mMn(n,Agt),207))}function wdn(n){this.e=x8(ANt,hQn,25,n.length,15,1),this.c=x8($Nt,ZYn,25,n.length,16,1),this.b=x8($Nt,ZYn,25,n.length,16,1),this.f=0}function ddn(n){var t,e;for(n.j=x8(xNt,qQn,25,n.p.c.length,15,1),e=new Wb(n.p);e.a<e.c.c.length;)t=BB(n0(e),10),n.j[t.p]=t.o.b/n.i}function gdn(n){var t;0!=n.c&&(1==(t=BB(xq(n.a,n.b),287)).b?(++n.b,n.b<n.a.c.length&&Tb(BB(xq(n.a,n.b),287))):--t.b,--n.c)}function pdn(n){var t;t=n.a;do{(t=BB(U5(new oz(ZL(lbn(t).a.Kc(),new h))),17).d.i).k==(uSn(),Put)&&WB(n.e,t)}while(t.k==(uSn(),Put))}function vdn(){vdn=O,LIt=new WA(15),$It=new XA((sWn(),XSt),LIt),xIt=new XA(LPt,15),NIt=new XA(vPt,iln(0)),AIt=new XA(cSt,dZn)}function mdn(){mdn=O,KIt=new VC("PORTS",0),_It=new VC("PORT_LABELS",1),RIt=new VC("NODE_LABELS",2),DIt=new VC("MINIMUM_SIZE",3)}function ydn(n,t){var e,i;for(i=t.length,e=0;e<i;e+=2)Yxn(n,(b1(e,t.length),t.charCodeAt(e)),(b1(e+1,t.length),t.charCodeAt(e+1)))}function kdn(n,t,e){var i,r,c,a;for(c=t-n.e,a=e-n.f,r=new Wb(n.a);r.a<r.c.c.length;)Tvn(i=BB(n0(r),187),i.s+c,i.t+a);n.e=t,n.f=e}function jdn(n,t){var e,i,r;for(r=t.b.b,n.a=new YT,n.b=x8(ANt,hQn,25,r,15,1),e=0,i=spn(t.b,0);i.b!=i.d.c;)BB(b3(i),86).g=e++}function Edn(n,t){var e,i,r,c;return e=t>>5,t&=31,r=n.d+e+(0==t?0:1),xTn(i=x8(ANt,hQn,25,r,15,1),n.a,e,t),X0(c=new lU(n.e,r,i)),c}function Tdn(n,t,e){var i,r;i=BB(SJ(iNt,t),117),r=BB(SJ(rNt,t),117),e?(mZ(iNt,n,i),mZ(rNt,n,r)):(mZ(rNt,n,i),mZ(iNt,n,r))}function Mdn(n,t,e){var i,r,c;for(r=null,c=n.b;c;){if(i=n.a.ue(t,c.d),e&&0==i)return c;i>=0?c=c.a[1]:(r=c,c=c.a[0])}return r}function Sdn(n,t,e){var i,r,c;for(r=null,c=n.b;c;){if(i=n.a.ue(t,c.d),e&&0==i)return c;i<=0?c=c.a[0]:(r=c,c=c.a[1])}return r}function Pdn(n,t,e,i){var r,c,a;return r=!1,LGn(n.f,e,i)&&(xgn(n.f,n.a[t][e],n.a[t][i]),a=(c=n.a[t])[i],c[i]=c[e],c[e]=a,r=!0),r}function Cdn(n,t,e,i,r){var c,a,u;for(a=r;t.b!=t.c;)c=BB(dU(t),10),u=BB(abn(c,i).Xb(0),11),n.d[u.p]=a++,e.c[e.c.length]=u;return a}function Idn(n,t,i){var r,c,a,u,o;return u=n.k,o=t.k,c=MD(edn(n,r=i[u.g][o.g])),a=MD(edn(t,r)),e.Math.max((kW(c),c),(kW(a),a))}function Odn(n,t,e){var i,r,c,a;for(i=e/n.c.length,r=0,a=new Wb(n);a.a<a.c.c.length;)ghn(c=BB(n0(a),200),c.f+i*r),ajn(c,t,i),++r}function Adn(n,t,e){var i,r,c;for(r=BB(RX(n.b,e),177),i=0,c=new Wb(t.j);c.a<c.c.c.length;)r[BB(n0(c),113).d.p]&&++i;return i}function $dn(n){var t,e;return null!=(t=BB(yan(n.a,4),126))?(aHn(t,0,e=x8(dAt,i9n,415,t.length,0,1),0,t.length),e):wAt}function Ldn(){var n;return 0!=ctt&&(n=l5())-att>2e3&&(att=n,utt=e.setTimeout(QE,10)),0==ctt++&&(Onn((sk(),ttt)),!0)}function Ndn(n,t){var e;for(e=new oz(ZL(lbn(n).a.Kc(),new h));dAn(e);)if(BB(U5(e),17).d.i.c==t)return!1;return!0}function xdn(n,t){var e;if(cL(t,245)){e=BB(t,245);try{return 0==n.vd(e)}catch(i){if(!cL(i=lun(i),205))throw Hp(i)}}return!1}function Ddn(){return Error.stackTraceLimit>0?(e.Error.stackTraceLimit=Error.stackTraceLimit=64,!0):"stack"in new Error}function Rdn(n,t){return h$(),h$(),rin(KVn),(e.Math.abs(n-t)<=KVn||n==t||isNaN(n)&&isNaN(t)?0:n<t?-1:n>t?1:zO(isNaN(n),isNaN(t)))>0}function Kdn(n,t){return h$(),h$(),rin(KVn),(e.Math.abs(n-t)<=KVn||n==t||isNaN(n)&&isNaN(t)?0:n<t?-1:n>t?1:zO(isNaN(n),isNaN(t)))<0}function _dn(n,t){return h$(),h$(),rin(KVn),(e.Math.abs(n-t)<=KVn||n==t||isNaN(n)&&isNaN(t)?0:n<t?-1:n>t?1:zO(isNaN(n),isNaN(t)))<=0}function Fdn(n,t){for(var e=0;!t[e]||""==t[e];)e++;for(var i=t[e++];e<t.length;e++)t[e]&&""!=t[e]&&(i+=n+t[e]);return i}function Bdn(n,t,i){var r,c,a,u;for(_8(t,a=t+i,n.length),u="",c=t;c<a;)r=e.Math.min(c+1e4,a),u+=WW(n.slice(c,r)),c=r;return u}function Hdn(n){var t,e,i,r;if(null==n)return null;for(r=new Np,e=0,i=(t=ysn(n)).length;e<i;++e)WB(r,FBn(t[e],!0));return r}function qdn(n){var t,e,i,r;if(null==n)return null;for(r=new Np,e=0,i=(t=ysn(n)).length;e<i;++e)WB(r,FBn(t[e],!0));return r}function Gdn(n){var t,e,i,r;if(null==n)return null;for(r=new Np,e=0,i=(t=ysn(n)).length;e<i;++e)WB(r,FBn(t[e],!0));return r}function zdn(n,t){var e,i,r;if(n.c)Sen(n.c,t);else for(e=t-iG(n),r=new Wb(n.d);r.a<r.c.c.length;)zdn(i=BB(n0(r),157),iG(i)+e)}function Udn(n,t){var e,i,r;if(n.c)Men(n.c,t);else for(e=t-eG(n),r=new Wb(n.a);r.a<r.c.c.length;)Udn(i=BB(n0(r),157),eG(i)+e)}function Xdn(n,t){var e,i,r;for(i=new J6(t.gc()),e=t.Kc();e.Ob();)(r=t_n(n,BB(e.Pb(),56)))&&(i.c[i.c.length]=r);return i}function Wdn(n,t){var e,i;return n.qj(),(e=aOn(n,((i=null==t?0:nsn(t))&DWn)%n.d.length,i,t))?(hin(n,e),e.dd()):null}function Vdn(n){var t,e;for(e=uPn(n),t=null;2==n.c;)QXn(n),t||(wWn(),wWn(),tqn(t=new r$(2),e),e=t),e.$l(uPn(n));return e}function Qdn(n){if(!(q6n in n.a))throw Hp(new ek("Every element must have an id."));return kIn(zJ(n,q6n))}function Ydn(n){var t,e,i;if(!(i=n.Zg()))for(t=0,e=n.eh();e;e=e.eh()){if(++t>GQn)return e.fh();if((i=e.Zg())||e==n)break}return i}function Jdn(n){return hZ(),cL(n,156)?BB(RX(hAt,yet),288).vg(n):hU(hAt,tsn(n))?BB(RX(hAt,tsn(n)),288).vg(n):null}function Zdn(n){if(mgn(a5n,n))return hN(),vtt;if(mgn(u5n,n))return hN(),ptt;throw Hp(new _y("Expecting true or false"))}function ngn(n,t){if(t.c==n)return t.d;if(t.d==n)return t.c;throw Hp(new _y("Input edge is not connected to the input port."))}function tgn(n,t){return n.e>t.e?1:n.e<t.e?-1:n.d>t.d?n.e:n.d<t.d?-t.e:n.e*Msn(n.a,t.a,n.d)}function egn(n){return n>=48&&n<48+e.Math.min(10,10)?n-48:n>=97&&n<97?n-97+10:n>=65&&n<65?n-65+10:-1}function ign(n,t){var e;return GI(t)===GI(n)||!!cL(t,21)&&(e=BB(t,21)).gc()==n.gc()&&n.Ic(e)}function rgn(n,t){var e,i,r;return i=n.a.length-1,e=t-n.b&i,r=n.c-t&i,Ex(e<(n.c-n.b&i)),e>=r?(ahn(n,t),-1):(uhn(n,t),1)}function cgn(n,t){var e,i;for(b1(t,n.length),e=n.charCodeAt(t),i=t+1;i<n.length&&(b1(i,n.length),n.charCodeAt(i)==e);)++i;return i-t}function agn(n){switch(n.g){case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:return!0;default:return!1}}function ugn(n,t){var e,i=n.a;t=String(t),i.hasOwnProperty(t)&&(e=i[t]);var r=(Zun(),ftt)[typeof e];return r?r(e):khn(typeof e)}function ogn(n,t){if(n.a<0)throw Hp(new Fy("Did not call before(...) or after(...) before calling add(...)."));return WN(n,n.a,t),n}function sgn(n,t,e,i){var r;0!=t.c.length&&(r=MLn(e,i),JT(ytn(new Rq(null,new w1(uIn(t),1)),new ja),new XV(n,e,r,i)))}function hgn(n,t,e){var i;0!=(n.Db&t)?null==e?WOn(n,t):-1==(i=Rmn(n,t))?n.Eb=e:$X(een(n.Eb),i,e):null!=e&&mxn(n,t,e)}function fgn(n){var t;return 0==(32&n.Db)&&0!=(t=bX(BB(yan(n,16),26)||n.zh())-bX(n.zh()))&&hgn(n,32,x8(Ant,HWn,1,t,5,1)),n}function lgn(n){var t;return n.b||Xj(n,!(t=nK(n.e,n.a))||!mK(u5n,cdn((!t.b&&(t.b=new Jx((gWn(),k$t),X$t,t)),t.b),"qualified"))),n.c}function bgn(n,t,e){var i,r;return((r=(i=BB(Wtn(H7(n.a),t),87)).c||(gWn(),l$t)).kh()?tfn(n.b,BB(r,49)):r)==e?lFn(i):cen(i,e),r}function wgn(n,t){(t||null==console.groupCollapsed?null!=console.group?console.group:console.log:console.groupCollapsed).call(console,n)}function dgn(n,t,e,i){BB(e.b,65),BB(e.b,65),BB(i.b,65),BB(i.b,65).c.b,K8(i,t,n)}function ggn(n){var t,e;for(t=new Wb(n.g);t.a<t.c.c.length;)BB(n0(t),562);zzn(e=new yxn(n.g,Gy(n.a),n.c)),n.g=e.b,n.d=e.a}function pgn(n,t,i){t.b=e.Math.max(t.b,-i.a),t.c=e.Math.max(t.c,i.a-n.a),t.d=e.Math.max(t.d,-i.b),t.a=e.Math.max(t.a,i.b-n.b)}function vgn(n,t){return n.e<t.e?-1:n.e>t.e?1:n.f<t.f?-1:n.f>t.f?1:nsn(n)-nsn(t)}function mgn(n,t){return kW(n),null!=t&&(!!mK(n,t)||n.length==t.length&&mK(n.toLowerCase(),t.toLowerCase()))}function ygn(n,t){var e,i,r,c;for(i=0,r=t.gc();i<r;++i)cL(e=t.il(i),99)&&0!=(BB(e,18).Bb&h6n)&&null!=(c=t.jl(i))&&t_n(n,BB(c,56))}function kgn(n,t,e){var i,r,c;for(c=new Wb(e.a);c.a<c.c.c.length;)r=BB(n0(c),221),i=new C$(BB(RX(n.a,r.b),65)),WB(t.a,i),kgn(n,i,r)}function jgn(n){var t,e;return Vhn(n,-129)>0&&Vhn(n,128)<0?(t=dG(n)+128,!(e=(Eq(),$tt)[t])&&(e=$tt[t]=new Db(n)),e):new Db(n)}function Egn(n,t){var e,i;return(e=t.Hh(n.a))&&null!=(i=SD(cdn((!e.b&&(e.b=new Jx((gWn(),k$t),X$t,e)),e.b),t8n)))?i:t.ne()}function Tgn(n,t){var e,i;return(e=t.Hh(n.a))&&null!=(i=SD(cdn((!e.b&&(e.b=new Jx((gWn(),k$t),X$t,e)),e.b),t8n)))?i:t.ne()}function Mgn(n,t){var e,i;for(qZ(),i=new oz(ZL(hbn(n).a.Kc(),new h));dAn(i);)if((e=BB(U5(i),17)).d.i==t||e.c.i==t)return e;return null}function Sgn(n,t,e){this.c=n,this.f=new Np,this.e=new Gj,this.j=new Sq,this.n=new Sq,this.b=t,this.g=new UV(t.c,t.d,t.b,t.a),this.a=e}function Pgn(n){var t,e,i,r;for(this.a=new fA,this.d=new Rv,this.e=0,i=0,r=(e=n).length;i<r;++i)t=e[i],!this.f&&(this.f=t),g2(this,t)}function Cgn(n){ODn(),0==n.length?(this.e=0,this.d=1,this.a=Pun(Gk(ANt,1),hQn,25,15,[0])):(this.e=1,this.d=n.length,this.a=n,X0(this))}function Ign(n,t,e){sm.call(this),this.a=x8(Xit,rJn,212,(Dtn(),Pun(Gk(Vit,1),$Vn,232,0,[Git,zit,Uit])).length,0,1),this.b=n,this.d=t,this.c=e}function Ogn(n){this.d=new Np,this.e=new v4,this.c=x8(ANt,hQn,25,(kUn(),Pun(Gk(FIt,1),YZn,61,0,[PIt,sIt,oIt,SIt,CIt])).length,15,1),this.b=n}function Agn(n){var t,e,i,r;for(hon(r=BB(mMn(n,(hWn(),dlt)),11),Llt,n.i.n.b),e=0,i=(t=Z0(n.e)).length;e<i;++e)MZ(t[e],r)}function $gn(n){var t,e,i,r;for(hon(t=BB(mMn(n,(hWn(),dlt)),11),Llt,n.i.n.b),i=0,r=(e=Z0(n.g)).length;i<r;++i)SZ(e[i],t)}function Lgn(n){var t,e;return!!Lx(n.d.i,(HXn(),Wgt))&&(t=BB(mMn(n.c.i,Wgt),19),e=BB(mMn(n.d.i,Wgt),19),E$(t.a,e.a)>0)}function Ngn(n){var t;GI(ZAn(n,(sWn(),ESt)))===GI((ufn(),vCt))&&(JJ(n)?(t=BB(ZAn(JJ(n),ESt),334),Ypn(n,ESt,t)):Ypn(n,ESt,mCt))}function xgn(n,t,e){var i,r;fMn(n.e,t,e,(kUn(),CIt)),fMn(n.i,t,e,oIt),n.a&&(r=BB(mMn(t,(hWn(),dlt)),11),i=BB(mMn(e,dlt),11),k0(n.g,r,i))}function Dgn(n,t,e){var i,r,c;i=t.c.p,c=t.p,n.b[i][c]=new DY(n,t),e&&(n.a[i][c]=new Bd(t),(r=BB(mMn(t,(hWn(),rlt)),10))&&JIn(n.d,r,t))}function Rgn(n,t){var e,i,r;if(WB(Sct,n),t.Fc(n),e=BB(RX(Mct,n),21))for(r=e.Kc();r.Ob();)i=BB(r.Pb(),33),-1!=E7(Sct,i,0)||Rgn(i,t)}function Kgn(n,t,e){var i;(Wet?(gwn(n),1):Vet||Jet?(lM(),1):Yet&&(lM(),0))&&((i=new i_(t)).b=e,aSn(n,i))}function _gn(n,t){var e;e=!n.A.Hc((mdn(),_It))||n.q==(QEn(),XCt),n.u.Hc((lIn(),eIt))?e?NUn(n,t):aUn(n,t):n.u.Hc(rIt)&&(e?Azn(n,t):JUn(n,t))}function Fgn(n,t){var e,i;++n.j,null!=t&&oOn(t,e=cL(i=n.a.Cb,97)?BB(i,97).Jg():null)?hgn(n.a,4,e):hgn(n.a,4,BB(t,126))}function Bgn(n,t,i){return new UV(e.Math.min(n.a,t.a)-i/2,e.Math.min(n.b,t.b)-i/2,e.Math.abs(n.a-t.a)+i,e.Math.abs(n.b-t.b)+i)}function Hgn(n,t){var e,i;return 0!=(e=E$(n.a.c.p,t.a.c.p))?e:0!=(i=E$(n.a.d.i.p,t.a.d.i.p))?i:E$(t.a.d.p,n.a.d.p)}function qgn(n,t,e){var i,r,c,a;return(c=t.j)!=(a=e.j)?c.g-a.g:(i=n.f[t.p],r=n.f[e.p],0==i&&0==r?0:0==i?-1:0==r?1:Pln(i,r))}function Ggn(n,t,e){var i;if(!e[t.d])for(e[t.d]=!0,i=new Wb(kbn(t));i.a<i.c.c.length;)Ggn(n,Nbn(BB(n0(i),213),t),e)}function zgn(n,t,e){var i;switch(i=e[n.g][t],n.g){case 1:case 3:return new xC(0,i);case 2:case 4:return new xC(i,0);default:return null}}function Ugn(n,t,e){var i;i=BB(sJ(t.f),209);try{i.Ze(n,e),SW(t.f,i)}catch(r){throw cL(r=lun(r),102),Hp(r)}}function Xgn(n,t,e){var i,r,c,a;return i=null,(c=pGn(cin(),t))&&(r=null,null!=(a=Zqn(c,e))&&(r=n.Ye(c,a)),i=r),i}function Wgn(n,t,e,i){var r;return r=new N7(n.e,1,13,t.c||(gWn(),l$t),e.c||(gWn(),l$t),uvn(n,t),!1),i?i.Ei(r):i=r,i}function Vgn(n,t,e,i){var r;if(t>=(r=n.length))return r;for(t=t>0?t:0;t<r&&!ton((b1(t,n.length),n.charCodeAt(t)),e,i);t++);return t}function Qgn(n,t){var e,i;for(i=n.c.length,t.length<i&&(t=qk(new Array(i),t)),e=0;e<i;++e)$X(t,e,n.c[e]);return t.length>i&&$X(t,i,null),t}function Ygn(n,t){var e,i;for(i=n.a.length,t.length<i&&(t=qk(new Array(i),t)),e=0;e<i;++e)$X(t,e,n.a[e]);return t.length>i&&$X(t,i,null),t}function Jgn(n,t,e){var i,r,c;return(r=BB(RX(n.e,t),387))?(c=pR(r,e),uL(n,r),c):(i=new nH(n,t,e),VW(n.e,t,i),kJ(i),null)}function Zgn(n){var t;if(null==n)return null;if(null==(t=L$n(FBn(n,!0))))throw Hp(new ik("Invalid hexBinary value: '"+n+"'"));return t}function npn(n){return ODn(),Vhn(n,0)<0?0!=Vhn(n,-1)?new vEn(-1,j7(n)):Ytt:Vhn(n,10)<=0?Ztt[dG(n)]:new vEn(1,n)}function tpn(){return dWn(),Pun(Gk(Krt,1),$Vn,159,0,[Prt,Srt,Crt,vrt,prt,mrt,jrt,krt,yrt,Mrt,Trt,Ert,drt,wrt,grt,lrt,frt,brt,srt,ort,hrt,Irt])}function epn(n){var t;this.d=new Np,this.j=new Gj,this.g=new Gj,t=n.g.b,this.f=BB(mMn(vW(t),(HXn(),Udt)),103),this.e=Gy(MD(gpn(t,Spt)))}function ipn(n){this.b=new Np,this.e=new Np,this.d=n,this.a=!jE(AV(new Rq(null,new zU(new m6(n.b))),new aw(new Gr))).sd((dM(),tit))}function rpn(){rpn=O,hMt=new AC("PARENTS",0),sMt=new AC("NODES",1),uMt=new AC("EDGES",2),fMt=new AC("PORTS",3),oMt=new AC("LABELS",4)}function cpn(){cpn=O,BCt=new zC("DISTRIBUTED",0),qCt=new zC("JUSTIFIED",1),_Ct=new zC("BEGIN",2),FCt=new zC(eJn,3),HCt=new zC("END",4)}function apn(n){switch(n.yi(null)){case 10:return 0;case 15:return 1;case 14:return 2;case 11:return 3;case 21:return 4}return-1}function upn(n){switch(n.g){case 1:return Ffn(),HPt;case 4:return Ffn(),_Pt;case 2:return Ffn(),FPt;case 3:return Ffn(),KPt}return Ffn(),BPt}function opn(n,t,e){var i;switch((i=e.q.getFullYear()-sQn+sQn)<0&&(i=-i),t){case 1:n.a+=i;break;case 2:Enn(n,i%100,2);break;default:Enn(n,i,t)}}function spn(n,t){var e,i;if(LZ(t,n.b),t>=n.b>>1)for(i=n.c,e=n.b;e>t;--e)i=i.b;else for(i=n.a.a,e=0;e<t;++e)i=i.a;return new ZK(n,t,i)}function hpn(){hpn=O,dit=new FS("NUM_OF_EXTERNAL_SIDES_THAN_NUM_OF_EXTENSIONS_LAST",0),wit=new FS("CORNER_CASES_THAN_SINGLE_SIDE_LAST",1)}function fpn(n){var t,e,i;for(m$(e=uCn(n),But),(i=n.d).c=x8(Ant,HWn,1,0,5,1),t=new Wb(e);t.a<t.c.c.length;)gun(i,BB(n0(t),456).b)}function lpn(n){var t,e;for(!n.o&&(n.o=new y9((CXn(),MOt),rAt,n,0)),t=(e=n.o).c.Kc();t.e!=t.i.gc();)BB(t.nj(),42).dd();return A8(e)}function bpn(n){var t;LK(BB(mMn(n,(HXn(),ept)),98))&&(fOn((l1(0,(t=n.b).c.length),BB(t.c[0],29))),fOn(BB(xq(t,t.c.length-1),29)))}function wpn(n,t){var i,r,c,a;for(i=0,c=new Wb(t.a);c.a<c.c.c.length;)a=(r=BB(n0(c),10)).o.a+r.d.c+r.d.b+n.j,i=e.Math.max(i,a);return i}function dpn(n){var t,e,i,r;for(r=0,e=0,i=n.length;e<i;e++)b1(e,n.length),(t=n.charCodeAt(e))>=64&&t<128&&(r=i0(r,yz(1,t-64)));return r}function gpn(n,t){var e,i;return i=null,Lx(n,(sWn(),CPt))&&(e=BB(mMn(n,CPt),94)).Xe(t)&&(i=e.We(t)),null==i&&vW(n)&&(i=mMn(vW(n),t)),i}function ppn(n,t){var e,i,r;(i=(r=t.d.i).k)!=(uSn(),Cut)&&i!=Tut&&dAn(e=new oz(ZL(lbn(r).a.Kc(),new h)))&&VW(n.k,t,BB(U5(e),17))}function vpn(n,t){var e,i,r;return i=itn(n.Tg(),t),(e=t-n.Ah())<0?(r=n.Yg(i))>=0?n.lh(r):qIn(n,i):e<0?qIn(n,i):BB(i,66).Nj().Sj(n,n.yh(),e)}function mpn(n){var t;if(cL(n.a,4)){if(null==(t=Jdn(n.a)))throw Hp(new Fy(o5n+n.b+"'. "+r5n+(ED(bAt),bAt.k)+c5n));return t}return n.a}function ypn(n){var t;if(null==n)return null;if(null==(t=UUn(FBn(n,!0))))throw Hp(new ik("Invalid base64Binary value: '"+n+"'"));return t}function kpn(n){var t;try{return t=n.i.Xb(n.e),n.mj(),n.g=n.e++,t}catch(e){throw cL(e=lun(e),73)?(n.mj(),Hp(new yv)):Hp(e)}}function jpn(n){var t;try{return t=n.c.ki(n.e),n.mj(),n.g=n.e++,t}catch(e){throw cL(e=lun(e),73)?(n.mj(),Hp(new yv)):Hp(e)}}function Epn(){Epn=O,sWn(),Ect=TPt,pct=ySt,lct=cSt,vct=XSt,_kn(),kct=Mit,yct=Eit,jct=Pit,mct=jit,Gsn(),wct=oct,bct=uct,dct=hct,gct=fct}function Tpn(n){switch(jM(),this.c=new Np,this.d=n,n.g){case 0:case 2:this.a=QW(hut),this.b=RQn;break;case 3:case 1:this.a=hut,this.b=KQn}}function Mpn(n,t,e){var i;if(n.c)Pen(n.c,n.c.i+t),Cen(n.c,n.c.j+e);else for(i=new Wb(n.b);i.a<i.c.c.length;)Mpn(BB(n0(i),157),t,e)}function Spn(n,t){var e,i;if(n.j.length!=t.j.length)return!1;for(e=0,i=n.j.length;e<i;e++)if(!mK(n.j[e],t.j[e]))return!1;return!0}function Ppn(n,t,e){var i;t.a.length>0&&(WB(n.b,new VB(t.a,e)),0<(i=t.a.length)?t.a=t.a.substr(0,0):0>i&&(t.a+=rL(x8(ONt,WVn,25,-i,15,1))))}function Cpn(n,t){var e,i,r;for(e=n.o,r=BB(BB(h6(n.r,t),21),84).Kc();r.Ob();)(i=BB(r.Pb(),111)).e.a=dyn(i,e.a),i.e.b=e.b*Gy(MD(i.b.We(Lrt)))}function Ipn(n,t){var e,i,r,c;return r=n.k,e=Gy(MD(mMn(n,(hWn(),Tlt)))),c=t.k,i=Gy(MD(mMn(t,Tlt))),c!=(uSn(),Mut)?-1:r!=Mut?1:e==i?0:e<i?-1:1}function Opn(n,t){var e,i;return e=BB(BB(RX(n.g,t.a),46).a,65),i=BB(BB(RX(n.g,t.b),46).a,65),W8(t.a,t.b)-W8(t.a,_$(e.b))-W8(t.b,_$(i.b))}function Apn(n,t){var e;return e=BB(mMn(n,(HXn(),vgt)),74),tL(t,vut)?e?yQ(e):(e=new km,hon(n,vgt,e)):e&&hon(n,vgt,null),e}function $pn(n){var t;return(t=new Ck).a+="n",n.k!=(uSn(),Cut)&&oO(oO((t.a+="(",t),dx(n.k).toLowerCase()),")"),oO((t.a+="_",t),gyn(n)),t.a}function Lpn(n,t){OTn(t,"Self-Loop post-processing",1),JT(AV(AV(wnn(new Rq(null,new w1(n.b,16)),new xi),new Di),new Ri),new Ki),HSn(t)}function Npn(n,t,e,i){var r;return e>=0?n.hh(t,e,i):(n.eh()&&(i=(r=n.Vg())>=0?n.Qg(i):n.eh().ih(n,-1-r,null,i)),n.Sg(t,e,i))}function xpn(n,t){switch(t){case 7:return!n.e&&(n.e=new hK(_Ot,n,7,4)),void sqn(n.e);case 8:return!n.d&&(n.d=new hK(_Ot,n,8,5)),void sqn(n.d)}Dwn(n,t)}function Dpn(n,t){var e;e=n.Zc(t);try{return e.Pb()}catch(i){throw cL(i=lun(i),109)?Hp(new Ay("Can't get element "+t)):Hp(i)}}function Rpn(n,t){this.e=n,t<XQn?(this.d=1,this.a=Pun(Gk(ANt,1),hQn,25,15,[0|t])):(this.d=2,this.a=Pun(Gk(ANt,1),hQn,25,15,[t%XQn|0,t/XQn|0]))}function Kpn(n,t){var e,i,r,c;for(SQ(),e=n,c=t,cL(n,21)&&!cL(t,21)&&(e=t,c=n),r=e.Kc();r.Ob();)if(i=r.Pb(),c.Hc(i))return!1;return!0}function _pn(n,t,e){var i,r,c,a;return-1!=(i=n.Xc(t))&&(n.ej()?(c=n.fj(),a=Lyn(n,i),r=n.Zi(4,a,null,i,c),e?e.Ei(r):e=r):Lyn(n,i)),e}function Fpn(n,t,e){var i,r,c,a;return-1!=(i=n.Xc(t))&&(n.ej()?(c=n.fj(),a=wq(n,i),r=n.Zi(4,a,null,i,c),e?e.Ei(r):e=r):wq(n,i)),e}function Bpn(n,t){var e;switch(e=BB(oV(n.b,t),124).n,t.g){case 1:n.t>=0&&(e.d=n.t);break;case 3:n.t>=0&&(e.a=n.t)}n.C&&(e.b=n.C.b,e.c=n.C.c)}function Hpn(){Hpn=O,Brt=new _S(mJn,0),Frt=new _S(yJn,1),Hrt=new _S(kJn,2),qrt=new _S(jJn,3),Brt.a=!1,Frt.a=!0,Hrt.a=!1,qrt.a=!0}function qpn(){qpn=O,Zrt=new KS(mJn,0),Jrt=new KS(yJn,1),nct=new KS(kJn,2),tct=new KS(jJn,3),Zrt.a=!1,Jrt.a=!0,nct.a=!1,tct.a=!0}function Gpn(n){var t;t=n.a;do{(t=BB(U5(new oz(ZL(fbn(t).a.Kc(),new h))),17).c.i).k==(uSn(),Put)&&n.b.Fc(t)}while(t.k==(uSn(),Put));n.b=ean(n.b)}function zpn(n){var t,e,i;for(i=n.c.a,n.p=(yX(i),new t_(i)),e=new Wb(i);e.a<e.c.c.length;)(t=BB(n0(e),10)).p=hCn(t).a;SQ(),m$(n.p,new Oc)}function Upn(n){var t,e,i;if(e=0,0==(i=wDn(n)).c.length)return 1;for(t=new Wb(i);t.a<t.c.c.length;)e+=Upn(BB(n0(t),33));return e}function Xpn(n,t){var e,i,r;for(r=0,i=BB(BB(h6(n.r,t),21),84).Kc();i.Ob();)r+=(e=BB(i.Pb(),111)).d.b+e.b.rf().a+e.d.c,i.Ob()&&(r+=n.w);return r}function Wpn(n,t){var e,i,r;for(r=0,i=BB(BB(h6(n.r,t),21),84).Kc();i.Ob();)r+=(e=BB(i.Pb(),111)).d.d+e.b.rf().b+e.d.a,i.Ob()&&(r+=n.w);return r}function Vpn(n,t,e,i){if(t.a<i.a)return!0;if(t.a==i.a){if(t.b<i.b)return!0;if(t.b==i.b&&n.b>e.b)return!0}return!1}function Qpn(n,t){return XI(n)?!!OWn[t]:n.hm?!!n.hm[t]:UI(n)?!!IWn[t]:!!zI(n)&&!!CWn[t]}function Ypn(n,t,e){return null==e?(!n.o&&(n.o=new y9((CXn(),MOt),rAt,n,0)),Wdn(n.o,t)):(!n.o&&(n.o=new y9((CXn(),MOt),rAt,n,0)),vjn(n.o,t,e)),n}function Jpn(n,t,e,i){var r;(r=Xfn(t.Xe((sWn(),DSt))?BB(t.We(DSt),21):n.j))!=(dWn(),Irt)&&(e&&!agn(r)||USn(N$n(n,r,i),t))}function Zpn(n,t,e,i){var r,c,a;return c=itn(n.Tg(),t),(r=t-n.Ah())<0?(a=n.Yg(c))>=0?n._g(a,e,!0):cOn(n,c,e):BB(c,66).Nj().Pj(n,n.yh(),r,e,i)}function nvn(n,t,e,i){var r,c;e.mh(t)&&(ZM(),hnn(t)?ygn(n,BB(e.ah(t),153)):(r=(c=t)?BB(i,49).xh(c):null)&&_p(e.ah(t),r))}function tvn(n){switch(n.g){case 1:return Dan(),Rrt;case 3:return Dan(),Nrt;case 2:return Dan(),Drt;case 4:return Dan(),xrt;default:return null}}function evn(n){switch(typeof n){case NWn:return vvn(n);case LWn:return CJ(n);case $Wn:return hN(),n?1231:1237;default:return null==n?0:PN(n)}}function ivn(n,t,e){if(n.e)switch(n.b){case 1:BQ(n.c,t,e);break;case 0:HQ(n.c,t,e)}else t4(n.c,t,e);n.a[t.p][e.p]=n.c.i,n.a[e.p][t.p]=n.c.e}function rvn(n){var t,e;if(null==n)return null;for(e=x8(Out,sVn,193,n.length,0,2),t=0;t<e.length;t++)e[t]=BB(G9(n[t],n[t].length),193);return e}function cvn(n){var t;if(Ksn(n))return mz(n),n.Lk()&&(t=FIn(n.e,n.b,n.c,n.a,n.j),n.j=t),n.g=n.a,++n.a,++n.c,n.i=0,n.j;throw Hp(new yv)}function avn(n,t){var e,i,r,c;return(c=n.o)<(e=n.p)?c*=c:e*=e,i=c+e,(c=t.o)<(e=t.p)?c*=c:e*=e,i<(r=c+e)?-1:i==r?0:1}function uvn(n,t){var e,i;if((i=Wyn(n,t))>=0)return i;if(n.Fk())for(e=0;e<n.i;++e)if(GI(n.Gk(BB(n.g[e],56)))===GI(t))return e;return-1}function ovn(n,t,e){var i,r;if(t>=(r=n.gc()))throw Hp(new tK(t,r));if(n.hi()&&(i=n.Xc(e))>=0&&i!=t)throw Hp(new _y(a8n));return n.mi(t,e)}function svn(n,t){if(this.a=BB(yX(n),245),this.b=BB(yX(t),245),n.vd(t)>0||n==(ey(),Knt)||t==(ty(),_nt))throw Hp(new _y("Invalid range: "+B3(n,t)))}function hvn(n){var t,e;for(this.b=new Np,this.c=n,this.a=!1,e=new Wb(n.a);e.a<e.c.c.length;)t=BB(n0(e),10),this.a=this.a|t.k==(uSn(),Cut)}function fvn(n,t){var e,i,r;for(e=AN(new qv,n),r=new Wb(t);r.a<r.c.c.length;)i=BB(n0(r),121),UNn(aM(cM(uM(rM(new Hv,0),0),e),i));return e}function lvn(n,t,e){var i,r,c;for(r=new oz(ZL((t?fbn(n):lbn(n)).a.Kc(),new h));dAn(r);)i=BB(U5(r),17),(c=t?i.c.i:i.d.i).k==(uSn(),Sut)&&PZ(c,e)}function bvn(){bvn=O,lvt=new _P(QZn,0),bvt=new _P("PORT_POSITION",1),fvt=new _P("NODE_SIZE_WHERE_SPACE_PERMITS",2),hvt=new _P("NODE_SIZE",3)}function wvn(){wvn=O,CMt=new DC("AUTOMATIC",0),AMt=new DC(cJn,1),$Mt=new DC(aJn,2),LMt=new DC("TOP",3),IMt=new DC(oJn,4),OMt=new DC(eJn,5)}function dvn(n,t,e,i){var r,c;for($On(),r=0,c=0;c<e;c++)r=rbn(cbn(e0(t[c],UQn),e0(i,UQn)),e0(dG(r),UQn)),n[c]=dG(r),r=jz(r,32);return dG(r)}function gvn(n,t,i){var r,c;for(c=0,r=0;r<Zit;r++)c=e.Math.max(c,vhn(n.a[t.g][r],i));return t==(Dtn(),zit)&&n.b&&(c=e.Math.max(c,n.b.b)),c}function pvn(n,t){var e,i;if(Tx(t>0),(t&-t)==t)return CJ(t*H$n(n,31)*4.656612873077393e-10);do{i=(e=H$n(n,31))%t}while(e-i+(t-1)<0);return CJ(i)}function vvn(n){var t,e,i;return r_(),null!=(i=rit[e=":"+n])?CJ((kW(i),i)):(t=null==(i=iit[e])?JNn(n):CJ((kW(i),i)),IQ(),rit[e]=t,t)}function mvn(n,t,e){OTn(e,"Compound graph preprocessor",1),n.a=new pJ,Nzn(n,t,null),GHn(n,t),tNn(n),hon(t,(hWn(),Hft),n.a),n.a=null,$U(n.b),HSn(e)}function yvn(n,t,e){switch(e.g){case 1:n.a=t.a/2,n.b=0;break;case 2:n.a=t.a,n.b=t.b/2;break;case 3:n.a=t.a/2,n.b=t.b;break;case 4:n.a=0,n.b=t.b/2}}function kvn(n){var t,e,i;for(i=BB(h6(n.a,(LEn(),Pst)),15).Kc();i.Ob();)iX(n,e=BB(i.Pb(),101),(t=Hyn(e))[0],(Crn(),xst),0),iX(n,e,t[1],Rst,1)}function jvn(n){var t,e,i;for(i=BB(h6(n.a,(LEn(),Cst)),15).Kc();i.Ob();)iX(n,e=BB(i.Pb(),101),(t=Hyn(e))[0],(Crn(),xst),0),iX(n,e,t[1],Rst,1)}function Evn(n){switch(n.g){case 0:return null;case 1:return new Arn;case 2:return new Jm;default:throw Hp(new _y(c4n+(null!=n.f?n.f:""+n.g)))}}function Tvn(n,t,e){var i,r;for(mun(n,t-n.s,e-n.t),r=new Wb(n.n);r.a<r.c.c.length;)rb(i=BB(n0(r),211),i.e+t-n.s),cb(i,i.f+e-n.t);n.s=t,n.t=e}function Mvn(n){var t,e,i,r;for(e=0,i=new Wb(n.a);i.a<i.c.c.length;)BB(n0(i),121).d=e++;return r=null,(t=wSn(n)).c.length>1&&(r=fvn(n,t)),r}function Svn(n){var t;return n.f&&n.f.kh()&&(t=BB(n.f,49),n.f=BB(tfn(n,t),82),n.f!=t&&0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,9,8,t,n.f))),n.f}function Pvn(n){var t;return n.i&&n.i.kh()&&(t=BB(n.i,49),n.i=BB(tfn(n,t),82),n.i!=t&&0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,9,7,t,n.i))),n.i}function Cvn(n){var t;return n.b&&0!=(64&n.b.Db)&&(t=n.b,n.b=BB(tfn(n,t),18),n.b!=t&&0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,9,21,t,n.b))),n.b}function Ivn(n,t){var e,i,r;null==n.d?(++n.e,++n.f):(i=t.Sh(),fNn(n,n.f+1),r=(i&DWn)%n.d.length,!(e=n.d[r])&&(e=n.d[r]=n.uj()),e.Fc(t),++n.f)}function Ovn(n,t,e){var i;return!t.Kj()&&(-2!=t.Zj()?null==(i=t.zj())?null==e:Nfn(i,e):t.Hj()==n.e.Tg()&&null==e)}function Avn(){var n;lin(16,IVn),n=Jin(16),this.b=x8(Gnt,CVn,317,n,0,1),this.c=x8(Gnt,CVn,317,n,0,1),this.a=null,this.e=null,this.i=0,this.f=n-1,this.g=0}function $vn(n){LR.call(this),this.k=(uSn(),Cut),this.j=(lin(6,AVn),new J6(6)),this.b=(lin(2,AVn),new J6(2)),this.d=new fm,this.f=new wm,this.a=n}function Lvn(n){var t,e;n.c.length<=1||(dPn(n,BB((t=EDn(n,(kUn(),SIt))).a,19).a,BB(t.b,19).a),dPn(n,BB((e=EDn(n,CIt)).a,19).a,BB(e.b,19).a))}function Nvn(){Nvn=O,yvt=new FP("SIMPLE",0),pvt=new FP(B1n,1),vvt=new FP("LINEAR_SEGMENTS",2),gvt=new FP("BRANDES_KOEPF",3),mvt=new FP(j3n,4)}function xvn(n,t,e){LK(BB(mMn(t,(HXn(),ept)),98))||(W7(n,t,DSn(t,e)),W7(n,t,DSn(t,(kUn(),SIt))),W7(n,t,DSn(t,sIt)),SQ(),m$(t.j,new _d(n)))}function Dvn(n,t,e,i){var r;for(r=BB(h6(i?n.a:n.b,t),21).Kc();r.Ob();)if(_Dn(n,e,BB(r.Pb(),33)))return!0;return!1}function Rvn(n){var t,e;for(e=new AL(n);e.e!=e.i.gc();)if((t=BB(kpn(e),87)).e||0!=(!t.d&&(t.d=new $L(VAt,t,1)),t.d).i)return!0;return!1}function Kvn(n){var t,e;for(e=new AL(n);e.e!=e.i.gc();)if((t=BB(kpn(e),87)).e||0!=(!t.d&&(t.d=new $L(VAt,t,1)),t.d).i)return!0;return!1}function _vn(n){var t,e;for(t=0,e=new Wb(n.c.a);e.a<e.c.c.length;)t+=F3(new oz(ZL(lbn(BB(n0(e),10)).a.Kc(),new h)));return t/n.c.a.c.length}function Fvn(n){var t,e;for(n.c||zqn(n),e=new km,n0(t=new Wb(n.a));t.a<t.c.c.length;)DH(e,BB(n0(t),407).a);return Px(0!=e.b),Atn(e,e.c.b),e}function Bvn(){Bvn=O,bRn(),qTt=RTt,BTt=new WA(8),new XA((sWn(),XSt),BTt),new XA(LPt,8),HTt=xTt,_Tt=MTt,FTt=STt,KTt=new XA(lSt,(hN(),!1))}function Hvn(n,t,e,i){switch(t){case 7:return!n.e&&(n.e=new hK(_Ot,n,7,4)),n.e;case 8:return!n.d&&(n.d=new hK(_Ot,n,8,5)),n.d}return Rbn(n,t,e,i)}function qvn(n){var t;return n.a&&n.a.kh()&&(t=BB(n.a,49),n.a=BB(tfn(n,t),138),n.a!=t&&0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,9,5,t,n.a))),n.a}function Gvn(n){return n<48||n>102?-1:n<=57?n-48:n<65?-1:n<=70?n-65+10:n<97?-1:n-97+10}function zvn(n,t){if(null==n)throw Hp(new Hy("null key in entry: null="+t));if(null==t)throw Hp(new Hy("null value in entry: "+n+"=null"))}function Uvn(n,t){for(var e,i;n.Ob();){if(!t.Ob())return!1;if(e=n.Pb(),i=t.Pb(),!(GI(e)===GI(i)||null!=e&&Nfn(e,i)))return!1}return!t.Ob()}function Xvn(n,t){var i;return i=Pun(Gk(xNt,1),qQn,25,15,[vhn(n.a[0],t),vhn(n.a[1],t),vhn(n.a[2],t)]),n.d&&(i[0]=e.Math.max(i[0],i[2]),i[2]=i[0]),i}function Wvn(n,t){var i;return i=Pun(Gk(xNt,1),qQn,25,15,[mhn(n.a[0],t),mhn(n.a[1],t),mhn(n.a[2],t)]),n.d&&(i[0]=e.Math.max(i[0],i[2]),i[2]=i[0]),i}function Vvn(){Vvn=O,yht=new SP("GREEDY",0),mht=new SP(H1n,1),jht=new SP(B1n,2),Eht=new SP("MODEL_ORDER",3),kht=new SP("GREEDY_MODEL_ORDER",4)}function Qvn(n,t){var e,i,r;for(n.b[t.g]=1,i=spn(t.d,0);i.b!=i.d.c;)r=(e=BB(b3(i),188)).c,1==n.b[r.g]?DH(n.a,e):2==n.b[r.g]?n.b[r.g]=1:Qvn(n,r)}function Yvn(n,t){var e,i,r;for(r=new J6(t.gc()),i=t.Kc();i.Ob();)(e=BB(i.Pb(),286)).c==e.f?hPn(n,e,e.c):rPn(n,e)||(r.c[r.c.length]=e);return r}function Jvn(n,t,e){var i,r,c,a;for(a=n.r+t,n.r+=t,n.d+=e,i=e/n.n.c.length,r=0,c=new Wb(n.n);c.a<c.c.c.length;)w$n(BB(n0(c),211),a,i,r),++r}function Zvn(n){var t,e;for(my(n.b.a),n.a=x8(bit,HWn,57,n.c.c.a.b.c.length,0,1),t=0,e=new Wb(n.c.c.a.b);e.a<e.c.c.length;)BB(n0(e),57).f=t++}function nmn(n){var t,e;for(my(n.b.a),n.a=x8(Qat,HWn,81,n.c.a.a.b.c.length,0,1),t=0,e=new Wb(n.c.a.a.b);e.a<e.c.c.length;)BB(n0(e),81).i=t++}function tmn(n,t,e){OTn(e,"Shrinking tree compaction",1),qy(TD(mMn(t,(Xcn(),Qrt))))?(irn(n,t.f),unn(t.f,t.c)):unn(t.f,t.c),HSn(e)}function emn(n){var t;if(t=bhn(n),!dAn(n))throw Hp(new Ay("position (0) must be less than the number of elements that remained ("+t+")"));return U5(n)}function imn(n,t,e){try{return vmn(n,t+n.j,e+n.k)}catch(i){throw cL(i=lun(i),73)?Hp(new Ay(i.g+CJn+t+FWn+e+").")):Hp(i)}}function rmn(n,t,e){try{return mmn(n,t+n.j,e+n.k)}catch(i){throw cL(i=lun(i),73)?Hp(new Ay(i.g+CJn+t+FWn+e+").")):Hp(i)}}function cmn(n,t,e){try{return ymn(n,t+n.j,e+n.k)}catch(i){throw cL(i=lun(i),73)?Hp(new Ay(i.g+CJn+t+FWn+e+").")):Hp(i)}}function amn(n){switch(n.g){case 1:return kUn(),CIt;case 4:return kUn(),sIt;case 3:return kUn(),oIt;case 2:return kUn(),SIt;default:return kUn(),PIt}}function umn(n,t,e){t.k==(uSn(),Cut)&&e.k==Put&&(n.d=Efn(t,(kUn(),SIt)),n.b=Efn(t,sIt)),e.k==Cut&&t.k==Put&&(n.d=Efn(e,(kUn(),sIt)),n.b=Efn(e,SIt))}function omn(n,t){var e,i;for(i=abn(n,t).Kc();i.Ob();)if(null!=mMn(e=BB(i.Pb(),11),(hWn(),Elt))||zN(new m6(e.b)))return!0;return!1}function smn(n,t){return Pen(t,n.e+n.d+(0==n.c.c.length?0:n.b)),Cen(t,n.f),n.a=e.Math.max(n.a,t.f),n.d+=t.g+(0==n.c.c.length?0:n.b),WB(n.c,t),!0}function hmn(n,t,e){var i,r,c,a;for(a=0,i=e/n.a.c.length,c=new Wb(n.a);c.a<c.c.c.length;)Tvn(r=BB(n0(c),187),r.s,r.t+a*i),Jvn(r,n.d-r.r+t,i),++a}function fmn(n){var t,e,i;for(e=new Wb(n.b);e.a<e.c.c.length;)for(t=0,i=new Wb(BB(n0(e),29).a);i.a<i.c.c.length;)BB(n0(i),10).p=t++}function lmn(n,t){var e,i,r,c,a,u;for(r=t.length-1,a=0,u=0,i=0;i<=r;i++)c=t[i],e=pSn(r,i)*efn(1-n,r-i)*efn(n,i),a+=c.a*e,u+=c.b*e;return new xC(a,u)}function bmn(n,t){var e,i,r,c,a;for(e=t.gc(),n.qi(n.i+e),c=t.Kc(),a=n.i,n.i+=e,i=a;i<n.i;++i)r=c.Pb(),jL(n,i,n.oi(i,r)),n.bi(i,r),n.ci();return 0!=e}function wmn(n,t,e){var i,r,c;return n.ej()?(i=n.Vi(),c=n.fj(),++n.j,n.Hi(i,n.oi(i,t)),r=n.Zi(3,null,t,i,c),e?e.Ei(r):e=r):ZD(n,n.Vi(),t),e}function dmn(n,t,e){var i,r,c;return(0!=(64&(c=cL(r=(i=BB(Wtn(a4(n.a),t),87)).c,88)?BB(r,26):(gWn(),d$t)).Db)?tfn(n.b,c):c)==e?lFn(i):cen(i,e),c}function gmn(n,t,e,i,r,c,a,u){var o,s;i&&((o=i.a[0])&&gmn(n,t,e,o,r,c,a,u),Iyn(n,e,i.d,r,c,a,u)&&t.Fc(i),(s=i.a[1])&&gmn(n,t,e,s,r,c,a,u))}function pmn(n,t){var e;return n.a||(e=x8(xNt,qQn,25,0,15,1),gE(n.b.a,new bw(e)),e.sort(ien(T.prototype.te,T,[])),n.a=new _K(e,n.d)),K6(n.a,t)}function vmn(n,t,e){try{return QI(trn(n,t,e),1)}catch(i){throw cL(i=lun(i),320)?Hp(new Ay(MJn+n.o+"*"+n.p+SJn+t+FWn+e+PJn)):Hp(i)}}function mmn(n,t,e){try{return QI(trn(n,t,e),0)}catch(i){throw cL(i=lun(i),320)?Hp(new Ay(MJn+n.o+"*"+n.p+SJn+t+FWn+e+PJn)):Hp(i)}}function ymn(n,t,e){try{return QI(trn(n,t,e),2)}catch(i){throw cL(i=lun(i),320)?Hp(new Ay(MJn+n.o+"*"+n.p+SJn+t+FWn+e+PJn)):Hp(i)}}function kmn(n,t){if(-1==n.g)throw Hp(new dv);n.mj();try{n.d._c(n.g,t),n.f=n.d.j}catch(e){throw cL(e=lun(e),73)?Hp(new vv):Hp(e)}}function jmn(n,t,e){OTn(e,"Linear segments node placement",1),n.b=BB(mMn(t,(hWn(),Alt)),304),VXn(n,t),vHn(n,t),QHn(n,t),hXn(n),n.a=null,n.b=null,HSn(e)}function Emn(n,t){var e,i,r,c;for(c=n.gc(),t.length<c&&(t=qk(new Array(c),t)),r=t,i=n.Kc(),e=0;e<c;++e)$X(r,e,i.Pb());return t.length>c&&$X(t,c,null),t}function Tmn(n,t){var e,i;if(i=n.gc(),null==t){for(e=0;e<i;e++)if(null==n.Xb(e))return e}else for(e=0;e<i;e++)if(Nfn(t,n.Xb(e)))return e;return-1}function Mmn(n,t){var e,i,r;return e=t.cd(),r=t.dd(),i=n.xc(e),!(!(GI(r)===GI(i)||null!=r&&Nfn(r,i))||null==i&&!n._b(e))}function Smn(n,t){var e,i,r;return t<=22?(e=n.l&(1<<t)-1,i=r=0):t<=44?(e=n.l,i=n.m&(1<<t-22)-1,r=0):(e=n.l,i=n.m,r=n.h&(1<<t-44)-1),M$(e,i,r)}function Pmn(n,t){switch(t.g){case 1:return n.f.n.d+n.t;case 3:return n.f.n.a+n.t;case 2:return n.f.n.c+n.s;case 4:return n.f.n.b+n.s;default:return 0}}function Cmn(n,t){var e,i;switch(i=t.c,e=t.a,n.b.g){case 0:e.d=n.e-i.a-i.d;break;case 1:e.d+=n.e;break;case 2:e.c=n.e-i.a-i.d;break;case 3:e.c=n.e+i.d}}function Imn(n,t,e,i){var r,c;this.a=t,this.c=i,$l(this,new xC(-(r=n.a).c,-r.d)),UR(this.b,e),c=i/2,t.a?Bx(this.b,0,c):Bx(this.b,c,0),WB(n.c,this)}function Omn(){Omn=O,qjt=new mC(QZn,0),Bjt=new mC(q1n,1),Hjt=new mC("EDGE_LENGTH_BY_POSITION",2),Fjt=new mC("CROSSING_MINIMIZATION_BY_POSITION",3)}function Amn(n,t){var e,i;if(e=BB(sen(n.g,t),33))return e;if(i=BB(sen(n.j,t),118))return i;throw Hp(new ek("Referenced shape does not exist: "+t))}function $mn(n,t){if(n.c==t)return n.d;if(n.d==t)return n.c;throw Hp(new _y("Node 'one' must be either source or target of edge 'edge'."))}function Lmn(n,t){if(n.c.i==t)return n.d.i;if(n.d.i==t)return n.c.i;throw Hp(new _y("Node "+t+" is neither source nor target of edge "+n))}function Nmn(n,t){var e;switch(t.g){case 2:case 4:e=n.a,n.c.d.n.b<e.d.n.b&&(e=n.c),bU(n,t,(Oun(),kst),e);break;case 1:case 3:bU(n,t,(Oun(),vst),null)}}function xmn(n,t,e,i,r,c){var a,u,o,s,h;for(a=ijn(t,e,c),u=e==(kUn(),sIt)||e==CIt?-1:1,s=n[e.g],h=0;h<s.length;h++)(o=s[h])>0&&(o+=r),s[h]=a,a+=u*(o+i)}function Dmn(n){var t,e,i;for(i=n.f,n.n=x8(xNt,qQn,25,i,15,1),n.d=x8(xNt,qQn,25,i,15,1),t=0;t<i;t++)e=BB(xq(n.c.b,t),29),n.n[t]=wpn(n,e),n.d[t]=VLn(n,e)}function Rmn(n,t){var e,i,r;for(r=0,i=2;i<t;i<<=1)0!=(n.Db&i)&&++r;if(0==r){for(e=t<<=1;e<=128;e<<=1)if(0!=(n.Db&e))return 0;return-1}return r}function Kmn(n,t){var e,i,r,c,a;for(a=axn(n.e.Tg(),t),c=null,e=BB(n.g,119),r=0;r<n.i;++r)i=e[r],a.rl(i.ak())&&(!c&&(c=new go),f9(c,i));c&&aXn(n,c)}function _mn(n){var t,e;if(!n)return null;if(n.dc())return"";for(e=new Sk,t=n.Kc();t.Ob();)cO(e,SD(t.Pb())),e.a+=" ";return KO(e,e.a.length-1)}function Fmn(n,t,e){var i,r,c,a;for(con(n),null==n.k&&(n.k=x8(Jnt,sVn,78,0,0,1)),r=0,c=(i=n.k).length;r<c;++r)Fmn(i[r],t,"\t"+e);(a=n.f)&&Fmn(a,t,e)}function Bmn(n,t){var e,i=new Array(t);switch(n){case 14:case 15:e=0;break;case 16:e=!1;break;default:return i}for(var r=0;r<t;++r)i[r]=e;return i}function Hmn(n){var t;for(t=new Wb(n.a.b);t.a<t.c.c.length;)BB(n0(t),57).c.$b();Otn(dA(n.d)?n.a.c:n.a.d,new Mw(n)),n.c.Me(n),_xn(n)}function qmn(n){var t,e,i;for(e=new Wb(n.e.c);e.a<e.c.c.length;){for(i=new Wb((t=BB(n0(e),282)).b);i.a<i.c.c.length;)_Bn(BB(n0(i),447));BCn(t)}}function Gmn(n){var t,i,r,c,a;for(r=0,a=0,c=0,i=new Wb(n.a);i.a<i.c.c.length;)t=BB(n0(i),187),a=e.Math.max(a,t.r),r+=t.d+(c>0?n.c:0),++c;n.b=r,n.d=a}function zmn(n,t){var i,r,c,a,u;for(r=0,c=0,i=0,u=new Wb(t);u.a<u.c.c.length;)a=BB(n0(u),200),r=e.Math.max(r,a.e),c+=a.b+(i>0?n.g:0),++i;n.c=c,n.d=r}function Umn(n,t){var i;return i=Pun(Gk(xNt,1),qQn,25,15,[gvn(n,(Dtn(),Git),t),gvn(n,zit,t),gvn(n,Uit,t)]),n.f&&(i[0]=e.Math.max(i[0],i[2]),i[2]=i[0]),i}function Xmn(n,t,e){try{FRn(n,t+n.j,e+n.k,!1,!0)}catch(i){throw cL(i=lun(i),73)?Hp(new Ay(i.g+CJn+t+FWn+e+").")):Hp(i)}}function Wmn(n,t,e){try{FRn(n,t+n.j,e+n.k,!0,!1)}catch(i){throw cL(i=lun(i),73)?Hp(new Ay(i.g+CJn+t+FWn+e+").")):Hp(i)}}function Vmn(n){var t;Lx(n,(HXn(),$gt))&&((t=BB(mMn(n,$gt),21)).Hc((n$n(),ICt))?(t.Mc(ICt),t.Fc(ACt)):t.Hc(ACt)&&(t.Mc(ACt),t.Fc(ICt)))}function Qmn(n){var t;Lx(n,(HXn(),$gt))&&((t=BB(mMn(n,$gt),21)).Hc((n$n(),DCt))?(t.Mc(DCt),t.Fc(NCt)):t.Hc(NCt)&&(t.Mc(NCt),t.Fc(DCt)))}function Ymn(n,t,e){OTn(e,"Self-Loop ordering",1),JT($V(AV(AV(wnn(new Rq(null,new w1(t.b,16)),new Ii),new Oi),new Ai),new $i),new bd(n)),HSn(e)}function Jmn(n,t,e,i){var r,c;for(r=t;r<n.c.length;r++){if(l1(r,n.c.length),c=BB(n.c[r],11),!e.Mb(c))return r;i.c[i.c.length]=c}return n.c.length}function Zmn(n,t,e,i){var r,c,a;return null==n.a&&dSn(n,t),a=t.b.j.c.length,c=e.d.p,(r=i.d.p-1)<0&&(r=a-1),c<=r?n.a[r]-n.a[c]:n.a[a-1]-n.a[c]+n.a[r]}function nyn(n){var t,e;if(!n.b)for(n.b=C2(BB(n.f,33).Ag().i),e=new AL(BB(n.f,33).Ag());e.e!=e.i.gc();)t=BB(kpn(e),137),WB(n.b,new Ry(t));return n.b}function tyn(n){var t,e;if(!n.e)for(n.e=C2(yV(BB(n.f,33)).i),e=new AL(yV(BB(n.f,33)));e.e!=e.i.gc();)t=BB(kpn(e),118),WB(n.e,new op(t));return n.e}function eyn(n){var t,e;if(!n.a)for(n.a=C2(YQ(BB(n.f,33)).i),e=new AL(YQ(BB(n.f,33)));e.e!=e.i.gc();)t=BB(kpn(e),33),WB(n.a,new JN(n,t));return n.a}function iyn(n){var t;if(!n.C&&(null!=n.D||null!=n.B))if(t=bzn(n))n.yk(t);else try{n.yk(null)}catch(e){if(!cL(e=lun(e),60))throw Hp(e)}return n.C}function ryn(n){switch(n.q.g){case 5:kjn(n,(kUn(),sIt)),kjn(n,SIt);break;case 4:cGn(n,(kUn(),sIt)),cGn(n,SIt);break;default:FPn(n,(kUn(),sIt)),FPn(n,SIt)}}function cyn(n){switch(n.q.g){case 5:jjn(n,(kUn(),oIt)),jjn(n,CIt);break;case 4:aGn(n,(kUn(),oIt)),aGn(n,CIt);break;default:BPn(n,(kUn(),oIt)),BPn(n,CIt)}}function ayn(n,t){var i,r,c;for(c=new Gj,r=n.Kc();r.Ob();)ZRn(i=BB(r.Pb(),37),c.a,0),c.a+=i.f.a+t,c.b=e.Math.max(c.b,i.f.b);return c.b>0&&(c.b+=t),c}function uyn(n,t){var i,r,c;for(c=new Gj,r=n.Kc();r.Ob();)ZRn(i=BB(r.Pb(),37),0,c.b),c.b+=i.f.b+t,c.a=e.Math.max(c.a,i.f.a);return c.a>0&&(c.a+=t),c}function oyn(n){var t,i,r;for(r=DWn,i=new Wb(n.a);i.a<i.c.c.length;)Lx(t=BB(n0(i),10),(hWn(),wlt))&&(r=e.Math.min(r,BB(mMn(t,wlt),19).a));return r}function syn(n,t){var e,i;if(0==t.length)return 0;for(e=ZX(n.a,t[0],(kUn(),CIt)),e+=ZX(n.a,t[t.length-1],oIt),i=0;i<t.length;i++)e+=qMn(n,i,t);return e}function hyn(){gxn(),this.c=new Np,this.i=new Np,this.e=new fA,this.f=new fA,this.g=new fA,this.j=new Np,this.a=new Np,this.b=new xp,this.k=new xp}function fyn(n,t){var e;return n.Db>>16==6?n.Cb.ih(n,5,GOt,t):(e=Cvn(BB(itn(BB(yan(n,16),26)||n.zh(),n.Db>>16),18)),n.Cb.ih(n,e.n,e.f,t))}function lyn(n){PY();var t=n.e;if(t&&t.stack){var e=t.stack,i=t+"\n";return e.substring(0,i.length)==i&&(e=e.substring(i.length)),e.split("\n")}return[]}function byn(n){var t;return Min(),(t=Ott)[n>>>28]|t[n>>24&15]<<4|t[n>>20&15]<<8|t[n>>16&15]<<12|t[n>>12&15]<<16|t[n>>8&15]<<20|t[n>>4&15]<<24|t[15&n]<<28}function wyn(n){var t,i,r;n.b==n.c&&(r=n.a.length,i=kon(e.Math.max(8,r))<<1,0!=n.b?(urn(n,t=SR(n.a,i),r),n.a=t,n.b=0):Pv(n.a,i),n.c=r)}function dyn(n,t){var e;return(e=n.b).Xe((sWn(),aPt))?e.Hf()==(kUn(),CIt)?-e.rf().a-Gy(MD(e.We(aPt))):t+Gy(MD(e.We(aPt))):e.Hf()==(kUn(),CIt)?-e.rf().a:t}function gyn(n){var t;return 0!=n.b.c.length&&BB(xq(n.b,0),70).a?BB(xq(n.b,0),70).a:null!=(t=eQ(n))?t:""+(n.c?E7(n.c.a,n,0):-1)}function pyn(n){var t;return 0!=n.f.c.length&&BB(xq(n.f,0),70).a?BB(xq(n.f,0),70).a:null!=(t=eQ(n))?t:""+(n.i?E7(n.i.j,n,0):-1)}function vyn(n,t){var e,i;if(t<0||t>=n.gc())return null;for(e=t;e<n.gc();++e)if(i=BB(n.Xb(e),128),e==n.gc()-1||!i.o)return new rI(iln(e),i);return null}function myn(n,t,e){var i,r,c,a;for(c=n.c,i=e?n:t,r=(e?t:n).p+1;r<i.p;++r)if((a=BB(xq(c.a,r),10)).k!=(uSn(),Tut)&&!Lkn(a))return!1;return!0}function yyn(n){var t,i,r,c,a;for(a=0,c=KQn,r=0,i=new Wb(n.a);i.a<i.c.c.length;)a+=(t=BB(n0(i),187)).r+(r>0?n.c:0),c=e.Math.max(c,t.d),++r;n.e=a,n.b=c}function kyn(n){var t,e;if(!n.b)for(n.b=C2(BB(n.f,118).Ag().i),e=new AL(BB(n.f,118).Ag());e.e!=e.i.gc();)t=BB(kpn(e),137),WB(n.b,new Ry(t));return n.b}function jyn(n,t){var e,i,r;if(t.dc())return dD(),dD(),pAt;for(e=new aR(n,t.gc()),r=new AL(n);r.e!=r.i.gc();)i=kpn(r),t.Hc(i)&&f9(e,i);return e}function Eyn(n,t,e,i){return 0==t?i?(!n.o&&(n.o=new y9((CXn(),MOt),rAt,n,0)),n.o):(!n.o&&(n.o=new y9((CXn(),MOt),rAt,n,0)),A8(n.o)):Zpn(n,t,e,i)}function Tyn(n){var t,e;if(n.rb)for(t=0,e=n.rb.i;t<e;++t)vx(Wtn(n.rb,t));if(n.vb)for(t=0,e=n.vb.i;t<e;++t)vx(Wtn(n.vb,t));az((IPn(),Z$t),n),n.Bb|=1}function Myn(n,t,e,i,r,c,a,u,o,s,h,f,l,b){return bCn(n,t,i,null,r,c,a,u,o,s,l,!0,b),zln(n,h),cL(n.Cb,88)&&ACn(P5(BB(n.Cb,88)),2),e&&rrn(n,e),Uln(n,f),n}function Syn(n){var t;if(null==n)return null;t=0;try{t=l_n(n,_Vn,DWn)&QVn}catch(e){if(!cL(e=lun(e),127))throw Hp(e);t=V7(n)[0]}return fun(t)}function Pyn(n){var t;if(null==n)return null;t=0;try{t=l_n(n,_Vn,DWn)&QVn}catch(e){if(!cL(e=lun(e),127))throw Hp(e);t=V7(n)[0]}return fun(t)}function Cyn(n,t){var e,i,r;return!((r=n.h-t.h)<0||(e=n.l-t.l,(r+=(i=n.m-t.m+(e>>22))>>22)<0||(n.l=e&SQn,n.m=i&SQn,n.h=r&PQn,0)))}function Iyn(n,t,e,i,r,c,a){var u,o;return!(t.Ae()&&(o=n.a.ue(e,i),o<0||!r&&0==o)||t.Be()&&(u=n.a.ue(e,c),u>0||!a&&0==u))}function Oyn(n,t){if(zsn(),0!=n.j.g-t.j.g)return 0;switch(n.j.g){case 2:return jbn(t,bst)-jbn(n,bst);case 4:return jbn(n,lst)-jbn(t,lst)}return 0}function Ayn(n){switch(n.g){case 0:return xht;case 1:return Dht;case 2:return Rht;case 3:return Kht;case 4:return _ht;case 5:return Fht;default:return null}}function $yn(n,t,e){var i,r;return Ihn(r=new Lm,t),Nrn(r,e),f9((!n.c&&(n.c=new eU(YAt,n,12,10)),n.c),r),Len(i=r,0),Nen(i,1),nln(i,!0),Yfn(i,!0),i}function Lyn(n,t){var e,i;if(t>=n.i)throw Hp(new LO(t,n.i));return++n.j,e=n.g[t],(i=n.i-t-1)>0&&aHn(n.g,t+1,n.g,t,i),$X(n.g,--n.i,null),n.fi(t,e),n.ci(),e}function Nyn(n,t){var e;return n.Db>>16==17?n.Cb.ih(n,21,qAt,t):(e=Cvn(BB(itn(BB(yan(n,16),26)||n.zh(),n.Db>>16),18)),n.Cb.ih(n,e.n,e.f,t))}function xyn(n){var t,e,i;for(SQ(),m$(n.c,n.a),i=new Wb(n.c);i.a<i.c.c.length;)for(e=n0(i),t=new Wb(n.b);t.a<t.c.c.length;)BB(n0(t),679).Ke(e)}function Dyn(n){var t,e,i;for(SQ(),m$(n.c,n.a),i=new Wb(n.c);i.a<i.c.c.length;)for(e=n0(i),t=new Wb(n.b);t.a<t.c.c.length;)BB(n0(t),369).Ke(e)}function Ryn(n){var t,e,i,r,c;for(r=DWn,c=null,i=new Wb(n.d);i.a<i.c.c.length;)(e=BB(n0(i),213)).d.j^e.e.j&&(t=e.e.e-e.d.e-e.a)<r&&(r=t,c=e);return c}function Kyn(){Kyn=O,dat=new $O(NZn,(hN(),!1)),fat=new $O(xZn,100),q7(),lat=new $O(DZn,bat=Oat),wat=new $O(RZn,lZn),gat=new $O(KZn,iln(DWn))}function _yn(n,t,e){var i,r,c,a,u,o;for(o=0,r=0,c=(i=n.a[t]).length;r<c;++r)for(u=Lfn(i[r],e).Kc();u.Ob();)a=BB(u.Pb(),11),VW(n.f,a,iln(o++))}function Fyn(n,t,e){var i,r;if(e)for(r=((i=new hz(e.a.length)).b-i.a)*i.c<0?(eS(),MNt):new XL(i);r.Ob();)JIn(n,t,kIn(dnn(e,BB(r.Pb(),19).a)))}function Byn(n,t,e){var i,r;if(e)for(r=((i=new hz(e.a.length)).b-i.a)*i.c<0?(eS(),MNt):new XL(i);r.Ob();)JIn(n,t,kIn(dnn(e,BB(r.Pb(),19).a)))}function Hyn(n){var t;return _Mn(),z9(t=BB(Emn(gz(n.k),x8(FIt,YZn,61,2,0,1)),122),0,t.length,null),t[0]==(kUn(),sIt)&&t[1]==CIt&&($X(t,0,CIt),$X(t,1,sIt)),t}function qyn(n,t,e){var i,r,c;return c=sDn(n,r=XNn(n,t,e)),K9(n.b),k0(n,t,e),SQ(),m$(r,new Vd(n)),i=sDn(n,r),K9(n.b),k0(n,e,t),new rI(iln(c),iln(i))}function Gyn(){Gyn=O,Umt=dq(new B2,(yMn(),Bat),(lWn(),dot)),Xmt=new iR("linearSegments.inputPrio",iln(0)),Wmt=new iR("linearSegments.outputPrio",iln(0))}function zyn(){zyn=O,Ryt=new fC("P1_TREEIFICATION",0),Kyt=new fC("P2_NODE_ORDERING",1),_yt=new fC("P3_NODE_PLACEMENT",2),Fyt=new fC("P4_EDGE_ROUTING",3)}function Uyn(){Uyn=O,sWn(),xjt=gPt,Kjt=LPt,Cjt=KSt,Ijt=BSt,Ojt=qSt,Pjt=DSt,Ajt=USt,Njt=fPt,KAn(),Mjt=wjt,Sjt=djt,$jt=pjt,Ljt=mjt,Djt=yjt,Rjt=kjt,_jt=Ejt}function Xyn(){Xyn=O,MCt=new qC("UNKNOWN",0),jCt=new qC("ABOVE",1),ECt=new qC("BELOW",2),TCt=new qC("INLINE",3),new iR("org.eclipse.elk.labelSide",MCt)}function Wyn(n,t){var e;if(n.ni()&&null!=t){for(e=0;e<n.i;++e)if(Nfn(t,n.g[e]))return e}else for(e=0;e<n.i;++e)if(GI(n.g[e])===GI(t))return e;return-1}function Vyn(n,t,e){var i,r;return t.c==(ain(),qvt)&&e.c==Hvt?-1:t.c==Hvt&&e.c==qvt?1:(i=dhn(t.a,n.a),r=dhn(e.a,n.a),t.c==qvt?r-i:i-r)}function Qyn(n,t,e){if(e&&(t<0||t>e.a.c.length))throw Hp(new _y("index must be >= 0 and <= layer node count"));n.c&&y7(n.c.a,n),n.c=e,e&&kG(e.a,t,n)}function Yyn(n,t){var e,i,r;for(i=new oz(ZL(hbn(n).a.Kc(),new h));dAn(i);)return e=BB(U5(i),17),new qf(yX((r=BB(t.Kb(e),10)).n.b+r.o.b/2));return iy(),iy(),Ont}function Jyn(n,t){this.c=new xp,this.a=n,this.b=t,this.d=BB(mMn(n,(hWn(),Alt)),304),GI(mMn(n,(HXn(),Lgt)))===GI((g7(),qht))?this.e=new gm:this.e=new dm}function Zyn(n,t){var i,r,c;for(c=0,r=new Wb(n);r.a<r.c.c.length;)i=BB(n0(r),33),c+=e.Math.pow(i.g*i.f-t,2);return e.Math.sqrt(c/(n.c.length-1))}function nkn(n,t){var e,i;return i=null,n.Xe((sWn(),CPt))&&(e=BB(n.We(CPt),94)).Xe(t)&&(i=e.We(t)),null==i&&n.yf()&&(i=n.yf().We(t)),null==i&&(i=mpn(t)),i}function tkn(n,t){var e,i;e=n.Zc(t);try{return i=e.Pb(),e.Qb(),i}catch(r){throw cL(r=lun(r),109)?Hp(new Ay("Can't remove element "+t)):Hp(r)}}function ekn(n,t){var e,i,r;if(0==(e=DBn(n,t,r=new von((i=new AT).q.getFullYear()-sQn,i.q.getMonth(),i.q.getDate())))||e<t.length)throw Hp(new _y(t));return r}function ikn(n,t){var e,i,r;for(kW(t),Tx(t!=n),r=n.b.c.length,i=t.Kc();i.Ob();)e=i.Pb(),WB(n.b,kW(e));return r!=n.b.c.length&&(Esn(n,0),!0)}function rkn(){rkn=O,sWn(),kat=CSt,new XA(dSt,(hN(),!0)),Tat=KSt,Mat=BSt,Sat=qSt,Eat=DSt,Pat=USt,Cat=fPt,Kyn(),yat=dat,vat=lat,mat=wat,jat=gat,pat=fat}function ckn(n,t){if(t==n.c)return n.d;if(t==n.d)return n.c;throw Hp(new _y("'port' must be either the source port or target port of the edge."))}function akn(n,t,e){var i,r;switch(r=n.o,i=n.d,t.g){case 1:return-i.d-e;case 3:return r.b+i.a+e;case 2:return r.a+i.c+e;case 4:return-i.b-e;default:return 0}}function ukn(n,t,e,i){var r,c,a;for(PZ(t,BB(i.Xb(0),29)),a=i.bd(1,i.gc()),c=BB(e.Kb(t),20).Kc();c.Ob();)ukn(n,(r=BB(c.Pb(),17)).c.i==t?r.d.i:r.c.i,e,a)}function okn(n){var t;return t=new xp,Lx(n,(hWn(),Dlt))?BB(mMn(n,Dlt),83):(JT(AV(new Rq(null,new w1(n.j,16)),new tr),new gd(t)),hon(n,Dlt,t),t)}function skn(n,t){var e;return n.Db>>16==6?n.Cb.ih(n,6,_Ot,t):(e=Cvn(BB(itn(BB(yan(n,16),26)||(CXn(),yOt),n.Db>>16),18)),n.Cb.ih(n,e.n,e.f,t))}function hkn(n,t){var e;return n.Db>>16==7?n.Cb.ih(n,1,DOt,t):(e=Cvn(BB(itn(BB(yan(n,16),26)||(CXn(),jOt),n.Db>>16),18)),n.Cb.ih(n,e.n,e.f,t))}function fkn(n,t){var e;return n.Db>>16==9?n.Cb.ih(n,9,UOt,t):(e=Cvn(BB(itn(BB(yan(n,16),26)||(CXn(),TOt),n.Db>>16),18)),n.Cb.ih(n,e.n,e.f,t))}function lkn(n,t){var e;return n.Db>>16==5?n.Cb.ih(n,9,XAt,t):(e=Cvn(BB(itn(BB(yan(n,16),26)||(gWn(),s$t),n.Db>>16),18)),n.Cb.ih(n,e.n,e.f,t))}function bkn(n,t){var e;return n.Db>>16==3?n.Cb.ih(n,0,BOt,t):(e=Cvn(BB(itn(BB(yan(n,16),26)||(gWn(),e$t),n.Db>>16),18)),n.Cb.ih(n,e.n,e.f,t))}function wkn(n,t){var e;return n.Db>>16==7?n.Cb.ih(n,6,GOt,t):(e=Cvn(BB(itn(BB(yan(n,16),26)||(gWn(),v$t),n.Db>>16),18)),n.Cb.ih(n,e.n,e.f,t))}function dkn(){this.a=new lo,this.g=new Avn,this.j=new Avn,this.b=new xp,this.d=new Avn,this.i=new Avn,this.k=new xp,this.c=new xp,this.e=new xp,this.f=new xp}function gkn(n,t,e){var i,r,c;for(e<0&&(e=0),c=n.i,r=e;r<c;r++)if(i=Wtn(n,r),null==t){if(null==i)return r}else if(GI(t)===GI(i)||Nfn(t,i))return r;return-1}function pkn(n,t){var e,i;return(e=t.Hh(n.a))?(i=SD(cdn((!e.b&&(e.b=new Jx((gWn(),k$t),X$t,e)),e.b),j7n)),mK(E7n,i)?az(n,Utn(t.Hj())):i):null}function vkn(n,t){var e,i;if(t){if(t==n)return!0;for(e=0,i=BB(t,49).eh();i&&i!=t;i=i.eh()){if(++e>GQn)return vkn(n,i);if(i==n)return!0}}return!1}function mkn(n){switch(DN(),n.q.g){case 5:vIn(n,(kUn(),sIt)),vIn(n,SIt);break;case 4:z$n(n,(kUn(),sIt)),z$n(n,SIt);break;default:vUn(n,(kUn(),sIt)),vUn(n,SIt)}}function ykn(n){switch(DN(),n.q.g){case 5:SOn(n,(kUn(),oIt)),SOn(n,CIt);break;case 4:Cpn(n,(kUn(),oIt)),Cpn(n,CIt);break;default:mUn(n,(kUn(),oIt)),mUn(n,CIt)}}function kkn(n){var t,e;(t=BB(mMn(n,(fRn(),nat)),19))?(e=t.a,hon(n,(Mrn(),hat),0==e?new sbn:new C4(e))):hon(n,(Mrn(),hat),new C4(1))}function jkn(n,t){var e;switch(e=n.i,t.g){case 1:return-(n.n.b+n.o.b);case 2:return n.n.a-e.o.a;case 3:return n.n.b-e.o.b;case 4:return-(n.n.a+n.o.a)}return 0}function Ekn(n,t){switch(n.g){case 0:return t==(Tbn(),Flt)?rst:cst;case 1:return t==(Tbn(),Flt)?rst:ist;case 2:return t==(Tbn(),Flt)?ist:cst;default:return ist}}function Tkn(n,t){var i,r,c;for(y7(n.a,t),n.e-=t.r+(0==n.a.c.length?0:n.c),c=n4n,r=new Wb(n.a);r.a<r.c.c.length;)i=BB(n0(r),187),c=e.Math.max(c,i.d);n.b=c}function Mkn(n,t){var e;return n.Db>>16==3?n.Cb.ih(n,12,UOt,t):(e=Cvn(BB(itn(BB(yan(n,16),26)||(CXn(),mOt),n.Db>>16),18)),n.Cb.ih(n,e.n,e.f,t))}function Skn(n,t){var e;return n.Db>>16==11?n.Cb.ih(n,10,UOt,t):(e=Cvn(BB(itn(BB(yan(n,16),26)||(CXn(),EOt),n.Db>>16),18)),n.Cb.ih(n,e.n,e.f,t))}function Pkn(n,t){var e;return n.Db>>16==10?n.Cb.ih(n,11,qAt,t):(e=Cvn(BB(itn(BB(yan(n,16),26)||(gWn(),g$t),n.Db>>16),18)),n.Cb.ih(n,e.n,e.f,t))}function Ckn(n,t){var e;return n.Db>>16==10?n.Cb.ih(n,12,QAt,t):(e=Cvn(BB(itn(BB(yan(n,16),26)||(gWn(),m$t),n.Db>>16),18)),n.Cb.ih(n,e.n,e.f,t))}function Ikn(n){var t;return 0==(1&n.Bb)&&n.r&&n.r.kh()&&(t=BB(n.r,49),n.r=BB(tfn(n,t),138),n.r!=t&&0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,9,8,t,n.r))),n.r}function Okn(n,t,i){var r;return r=Pun(Gk(xNt,1),qQn,25,15,[iMn(n,(Dtn(),Git),t,i),iMn(n,zit,t,i),iMn(n,Uit,t,i)]),n.f&&(r[0]=e.Math.max(r[0],r[2]),r[2]=r[0]),r}function Akn(n,t){var e,i,r;if(0!=(r=Yvn(n,t)).c.length)for(m$(r,new ti),e=r.c.length,i=0;i<e;i++)hPn(n,(l1(i,r.c.length),BB(r.c[i],286)),TDn(n,r,i))}function $kn(n){var t,e,i;for(i=BB(h6(n.a,(LEn(),Tst)),15).Kc();i.Ob();)for(t=gz((e=BB(i.Pb(),101)).k).Kc();t.Ob();)iX(n,e,BB(t.Pb(),61),(Crn(),Dst),1)}function Lkn(n){var t,e;if(n.k==(uSn(),Put))for(e=new oz(ZL(hbn(n).a.Kc(),new h));dAn(e);)if(!b5(t=BB(U5(e),17))&&n.c==Ajn(t,n).c)return!0;return!1}function Nkn(n){var t,e;if(n.k==(uSn(),Put))for(e=new oz(ZL(hbn(n).a.Kc(),new h));dAn(e);)if(!b5(t=BB(U5(e),17))&&t.c.i.c==t.d.i.c)return!0;return!1}function xkn(n,t){var e,i;for(OTn(t,"Dull edge routing",1),i=spn(n.b,0);i.b!=i.d.c;)for(e=spn(BB(b3(i),86).d,0);e.b!=e.d.c;)yQ(BB(b3(e),188).a)}function Dkn(n,t){var e,i,r;if(t)for(r=((e=new hz(t.a.length)).b-e.a)*e.c<0?(eS(),MNt):new XL(e);r.Ob();)(i=x2(t,BB(r.Pb(),19).a))&&O$n(n,i)}function Rkn(){var n;for(tS(),nWn((QX(),t$t)),_Xn(t$t),Tyn(t$t),gWn(),L$t=l$t,n=new Wb(V$t);n.a<n.c.c.length;)azn(BB(n0(n),241),l$t,null);return!0}function Kkn(n,t){var e,i,r,c,a,u;return(a=n.h>>19)!=(u=t.h>>19)?u-a:(i=n.h)!=(c=t.h)?i-c:(e=n.m)!=(r=t.m)?e-r:n.l-t.l}function _kn(){_kn=O,tRn(),Pit=new $O(UYn,Cit=xit),Rnn(),Mit=new $O(XYn,Sit=mit),hpn(),Eit=new $O(WYn,Tit=dit),jit=new $O(VYn,(hN(),!0))}function Fkn(n,t,e){var i,r;i=t*e,cL(n.g,145)?(r=f3(n)).f.d?r.f.a||(n.d.a+=i+fJn):(n.d.d-=i+fJn,n.d.a+=i+fJn):cL(n.g,10)&&(n.d.d-=i,n.d.a+=2*i)}function Bkn(n,t,i){var r,c,a,u,o;for(c=n[i.g],o=new Wb(t.d);o.a<o.c.c.length;)(a=(u=BB(n0(o),101)).i)&&a.i==i&&(c[r=u.d[i.g]]=e.Math.max(c[r],a.j.b))}function Hkn(n,t){var i,r,c,a,u;for(r=0,c=0,i=0,u=new Wb(t.d);u.a<u.c.c.length;)Gmn(a=BB(n0(u),443)),r=e.Math.max(r,a.b),c+=a.d+(i>0?n.g:0),++i;t.b=r,t.e=c}function qkn(n){var t,e,i;if(i=n.b,qT(n.i,i.length)){for(e=2*i.length,n.b=x8(Gnt,CVn,317,e,0,1),n.c=x8(Gnt,CVn,317,e,0,1),n.f=e-1,n.i=0,t=n.a;t;t=t.c)YCn(n,t,t);++n.g}}function Gkn(n,t,e,i){var r,c,a,u;for(r=0;r<t.o;r++)for(c=r-t.j+e,a=0;a<t.p;a++)u=a-t.k+i,vmn(t,r,a)?cmn(n,c,u)||Xmn(n,c,u):ymn(t,r,a)&&(imn(n,c,u)||Wmn(n,c,u))}function zkn(n,t,e){var i;(i=t.c.i).k==(uSn(),Put)?(hon(n,(hWn(),hlt),BB(mMn(i,hlt),11)),hon(n,flt,BB(mMn(i,flt),11))):(hon(n,(hWn(),hlt),t.c),hon(n,flt,e.d))}function Ukn(n,t,i){var r,c,a,u,o,s;return jDn(),u=t/2,a=i/2,o=1,s=1,(r=e.Math.abs(n.a))>u&&(o=u/r),(c=e.Math.abs(n.b))>a&&(s=a/c),kL(n,e.Math.min(o,s)),n}function Xkn(){var n,t;qBn();try{if(t=BB(Xjn((WM(),zAt),y6n),2014))return t}catch(e){if(!cL(e=lun(e),102))throw Hp(e);n=e,uz((u$(),n))}return new ao}function Wkn(){var n,t;d7();try{if(t=BB(Xjn((WM(),zAt),S7n),2024))return t}catch(e){if(!cL(e=lun(e),102))throw Hp(e);n=e,uz((u$(),n))}return new Ds}function Vkn(){var n,t;qBn();try{if(t=BB(Xjn((WM(),zAt),V9n),1941))return t}catch(e){if(!cL(e=lun(e),102))throw Hp(e);n=e,uz((u$(),n))}return new qo}function Qkn(n,t,e){var i,r;return r=n.e,n.e=t,0!=(4&n.Db)&&0==(1&n.Db)&&(i=new nU(n,1,4,r,t),e?e.Ei(i):e=i),r!=t&&(e=azn(n,t?kLn(n,t):n.a,e)),e}function Ykn(){AT.call(this),this.e=-1,this.a=!1,this.p=_Vn,this.k=-1,this.c=-1,this.b=-1,this.g=!1,this.f=-1,this.j=-1,this.n=-1,this.i=-1,this.d=-1,this.o=_Vn}function Jkn(n,t){var e,i,r;if(i=n.b.d.d,n.a||(i+=n.b.d.a),r=t.b.d.d,t.a||(r+=t.b.d.a),0==(e=Pln(i,r))){if(!n.a&&t.a)return-1;if(!t.a&&n.a)return 1}return e}function Zkn(n,t){var e,i,r;if(i=n.b.b.d,n.a||(i+=n.b.b.a),r=t.b.b.d,t.a||(r+=t.b.b.a),0==(e=Pln(i,r))){if(!n.a&&t.a)return-1;if(!t.a&&n.a)return 1}return e}function njn(n,t){var e,i,r;if(i=n.b.g.d,n.a||(i+=n.b.g.a),r=t.b.g.d,t.a||(r+=t.b.g.a),0==(e=Pln(i,r))){if(!n.a&&t.a)return-1;if(!t.a&&n.a)return 1}return e}function tjn(){tjn=O,Nat=WG(dq(dq(dq(new B2,(yMn(),Fat),(lWn(),yot)),Fat,Tot),Bat,Aot),Bat,oot),Dat=dq(dq(new B2,Fat,Jut),Fat,sot),xat=WG(new B2,Bat,fot)}function ejn(n){var t,e,i,r,c;for(t=BB(mMn(n,(hWn(),zft)),83),c=n.n,i=t.Cc().Kc();i.Ob();)(r=(e=BB(i.Pb(),306)).i).c+=c.a,r.d+=c.b,e.c?NDn(e):xDn(e);hon(n,zft,null)}function ijn(n,t,e){var i,r;switch(i=(r=n.b).d,t.g){case 1:return-i.d-e;case 2:return r.o.a+i.c+e;case 3:return r.o.b+i.a+e;case 4:return-i.b-e;default:return-1}}function rjn(n){var t,e,i,r,c;if(i=0,r=ZJn,n.b)for(t=0;t<360;t++)e=.017453292519943295*t,UKn(n,n.d,0,0,Z3n,e),(c=n.b.ig(n.d))<r&&(i=e,r=c);UKn(n,n.d,0,0,Z3n,i)}function cjn(n,t){var e,i,r,c;for(c=new xp,t.e=null,t.f=null,i=new Wb(t.i);i.a<i.c.c.length;)e=BB(n0(i),65),r=BB(RX(n.g,e.a),46),e.a=qz(e.b),VW(c,e.a,r);n.g=c}function ajn(n,t,e){var i,r,c,a,u;for(r=(t-n.e)/n.d.c.length,c=0,u=new Wb(n.d);u.a<u.c.c.length;)a=BB(n0(u),443),i=n.b-a.b+e,kdn(a,a.e+c*r,a.f),hmn(a,r,i),++c}function ujn(n){var t;if(n.f.qj(),-1!=n.b){if(++n.b,t=n.f.d[n.a],n.b<t.i)return;++n.a}for(;n.a<n.f.d.length;++n.a)if((t=n.f.d[n.a])&&0!=t.i)return void(n.b=0);n.b=-1}function ojn(n,t){var e,i,r;for(e=$Cn(n,0==(r=t.c.length)?"":(l1(0,t.c.length),SD(t.c[0]))),i=1;i<r&&e;++i)e=BB(e,49).oh((l1(i,t.c.length),SD(t.c[i])));return e}function sjn(n,t){var e,i;for(i=new Wb(t);i.a<i.c.c.length;)e=BB(n0(i),10),n.c[e.c.p][e.p].a=OG(n.i),n.c[e.c.p][e.p].d=Gy(n.c[e.c.p][e.p].a),n.c[e.c.p][e.p].b=1}function hjn(n,t){var i,r,c;for(c=0,r=new Wb(n);r.a<r.c.c.length;)i=BB(n0(r),157),c+=e.Math.pow(iG(i)*eG(i)-t,2);return e.Math.sqrt(c/(n.c.length-1))}function fjn(n,t,e,i){var r,c,a;return a=NRn(n,c=qRn(n,t,e,i)),fMn(n,t,e,i),K9(n.b),SQ(),m$(c,new Qd(n)),r=NRn(n,c),fMn(n,e,t,i),K9(n.b),new rI(iln(a),iln(r))}function ljn(n,t,e){var i;for(OTn(e,"Interactive node placement",1),n.a=BB(mMn(t,(hWn(),Alt)),304),i=new Wb(t.b);i.a<i.c.c.length;)nDn(n,BB(n0(i),29));HSn(e)}function bjn(n,t){OTn(t,"General Compactor",1),t.n&&n&&y0(t,o2(n),(Bsn(),uOt)),dwn(BB(ZAn(n,(Uyn(),Sjt)),380)).hg(n),t.n&&n&&y0(t,o2(n),(Bsn(),uOt))}function wjn(n,t,e){var i,r;for(CA(n,n.j+t,n.k+e),r=new AL((!n.a&&(n.a=new $L(xOt,n,5)),n.a));r.e!=r.i.gc();)TA(i=BB(kpn(r),469),i.a+t,i.b+e);PA(n,n.b+t,n.c+e)}function djn(n,t,e,i){switch(e){case 7:return!n.e&&(n.e=new hK(_Ot,n,7,4)),Ywn(n.e,t,i);case 8:return!n.d&&(n.d=new hK(_Ot,n,8,5)),Ywn(n.d,t,i)}return FTn(n,t,e,i)}function gjn(n,t,e,i){switch(e){case 7:return!n.e&&(n.e=new hK(_Ot,n,7,4)),_pn(n.e,t,i);case 8:return!n.d&&(n.d=new hK(_Ot,n,8,5)),_pn(n.d,t,i)}return run(n,t,e,i)}function pjn(n,t,e){var i,r,c;if(e)for(c=((i=new hz(e.a.length)).b-i.a)*i.c<0?(eS(),MNt):new XL(i);c.Ob();)(r=x2(e,BB(c.Pb(),19).a))&&bIn(n,r,t)}function vjn(n,t,e){var i,r,c;return n.qj(),c=null==t?0:nsn(t),n.f>0&&(r=aOn(n,(c&DWn)%n.d.length,c,t))?r.ed(e):(i=n.tj(c,t,e),n.c.Fc(i),null)}function mjn(n,t){var e,i,r,c;switch(Cfn(n,t)._k()){case 3:case 2:for(r=0,c=(e=YBn(t)).i;r<c;++r)if(5==DW(B7(n,i=BB(Wtn(e,r),34))))return i}return null}function yjn(n){var t,e,i,r,c;if(qT(n.f,n.b.length))for(i=x8(Qnt,CVn,330,2*n.b.length,0,1),n.b=i,r=i.length-1,e=n.a;e!=n;e=e.Rd())t=(c=BB(e,330)).d&r,c.a=i[t],i[t]=c}function kjn(n,t){var i,r,c,a;for(a=0,c=BB(BB(h6(n.r,t),21),84).Kc();c.Ob();)r=BB(c.Pb(),111),a=e.Math.max(a,r.e.a+r.b.rf().a);(i=BB(oV(n.b,t),124)).n.b=0,i.a.a=a}function jjn(n,t){var i,r,c,a;for(i=0,a=BB(BB(h6(n.r,t),21),84).Kc();a.Ob();)c=BB(a.Pb(),111),i=e.Math.max(i,c.e.b+c.b.rf().b);(r=BB(oV(n.b,t),124)).n.d=0,r.a.b=i}function Ejn(n){var t,e;return e=BB(mMn(n,(hWn(),Zft)),21),t=kA(vyt),e.Hc((bDn(),gft))&&Jcn(t,kyt),e.Hc(vft)&&Jcn(t,Eyt),e.Hc(sft)&&Jcn(t,myt),e.Hc(fft)&&Jcn(t,yyt),t}function Tjn(n,t){var e;OTn(t,"Delaunay triangulation",1),e=new Np,Otn(n.i,new yg(e)),qy(TD(mMn(n,(Xcn(),Qrt)))),n.e?Frn(n.e,$Xn(e)):n.e=$Xn(e),HSn(t)}function Mjn(n){if(n<0)throw Hp(new _y("The input must be positive"));return n<MMt.length?j2(MMt[n]):e.Math.sqrt(Z3n*n)*(ifn(n,n)/efn(2.718281828459045,n))}function Sjn(n,t){var e;if(n.ni()&&null!=t){for(e=0;e<n.i;++e)if(Nfn(t,n.g[e]))return!0}else for(e=0;e<n.i;++e)if(GI(n.g[e])===GI(t))return!0;return!1}function Pjn(n,t){if(null==t){for(;n.a.Ob();)if(null==BB(n.a.Pb(),42).dd())return!0}else for(;n.a.Ob();)if(Nfn(t,BB(n.a.Pb(),42).dd()))return!0;return!1}function Cjn(n,t){var e;return t===n||!!cL(t,664)&&(e=BB(t,1947),ign(n.g||(n.g=new Zf(n)),e.g||(e.g=new Zf(e))))}function Ijn(n){var t,i,r;for(t="Sz",i="ez",r=e.Math.min(n.length,5)-1;r>=0;r--)if(mK(n[r].d,t)||mK(n[r].d,i)){n.length>=r+1&&n.splice(0,r+1);break}return n}function Ojn(n,t){var i;return JO(n)&&JO(t)&&$Qn<(i=n/t)&&i<OQn?i<0?e.Math.ceil(i):e.Math.floor(i):uan(Aqn(JO(n)?Pan(n):n,JO(t)?Pan(t):t,!1))}function Ajn(n,t){if(t==n.c.i)return n.d.i;if(t==n.d.i)return n.c.i;throw Hp(new _y("'node' must either be the source node or target node of the edge."))}function $jn(n){var t,e,i,r;if(r=BB(mMn(n,(hWn(),Fft)),37)){for(i=new Gj,t=vW(n.c.i);t!=r;)t=vW(e=t.e),_x(UR(UR(i,e.n),t.c),t.d.b,t.d.d);return i}return Fut}function Ljn(n){var t;JT(wnn(new Rq(null,new w1((t=BB(mMn(n,(hWn(),Olt)),403)).d,16)),new _i),new wd(n)),JT(AV(new Rq(null,new w1(t.d,16)),new Fi),new dd(n))}function Njn(n,t){var e,i;for(e=new oz(ZL((t?lbn(n):fbn(n)).a.Kc(),new h));dAn(e);)if((i=Ajn(BB(U5(e),17),n)).k==(uSn(),Put)&&i.c!=n.c)return i;return null}function xjn(n){var t,i,r;for(i=new Wb(n.p);i.a<i.c.c.length;)(t=BB(n0(i),10)).k==(uSn(),Cut)&&(r=t.o.b,n.i=e.Math.min(n.i,r),n.g=e.Math.max(n.g,r))}function Djn(n,t,e){var i,r,c;for(c=new Wb(t);c.a<c.c.c.length;)i=BB(n0(c),10),n.c[i.c.p][i.p].e=!1;for(r=new Wb(t);r.a<r.c.c.length;)xzn(n,i=BB(n0(r),10),e)}function Rjn(n,t,i){var r,c;(r=Tfn(t.j,i.s,i.c)+Tfn(i.e,t.s,t.c))==(c=Tfn(i.j,t.s,t.c)+Tfn(t.e,i.s,i.c))?r>0&&(n.b+=2,n.a+=r):(n.b+=1,n.a+=e.Math.min(r,c))}function Kjn(n,t){var e;if(e=!1,XI(t)&&(e=!0,nW(n,new GX(SD(t)))),e||cL(t,236)&&(e=!0,nW(n,new Sl(XK(BB(t,236))))),!e)throw Hp(new Ly(H6n))}function _jn(n,t,e,i){var r,c,a;return r=new N7(n.e,1,10,cL(a=t.c,88)?BB(a,26):(gWn(),d$t),cL(c=e.c,88)?BB(c,26):(gWn(),d$t),uvn(n,t),!1),i?i.Ei(r):i=r,i}function Fjn(n){var t,e;switch(BB(mMn(vW(n),(HXn(),pgt)),420).g){case 0:return t=n.n,e=n.o,new xC(t.a+e.a/2,t.b+e.b/2);case 1:return new wA(n.n);default:return null}}function Bjn(){Bjn=O,Qht=new AP(QZn,0),Vht=new AP("LEFTUP",1),Jht=new AP("RIGHTUP",2),Wht=new AP("LEFTDOWN",3),Yht=new AP("RIGHTDOWN",4),Xht=new AP("BALANCED",5)}function Hjn(n,t,e){var i,r,c;if(0==(i=Pln(n.a[t.p],n.a[e.p]))){if(r=BB(mMn(t,(hWn(),clt)),15),c=BB(mMn(e,clt),15),r.Hc(e))return-1;if(c.Hc(t))return 1}return i}function qjn(n){switch(n.g){case 1:return new _a;case 2:return new Fa;case 3:return new Ka;case 0:return null;default:throw Hp(new _y(c4n+(null!=n.f?n.f:""+n.g)))}}function Gjn(n,t,e){switch(t){case 1:return!n.n&&(n.n=new eU(zOt,n,1,7)),sqn(n.n),!n.n&&(n.n=new eU(zOt,n,1,7)),void pX(n.n,BB(e,14));case 2:return void $in(n,SD(e))}rsn(n,t,e)}function zjn(n,t,e){switch(t){case 3:return void Men(n,Gy(MD(e)));case 4:return void Sen(n,Gy(MD(e)));case 5:return void Pen(n,Gy(MD(e)));case 6:return void Cen(n,Gy(MD(e)))}Gjn(n,t,e)}function Ujn(n,t,e){var i,r;(i=HTn(r=new Lm,t,null))&&i.Fi(),Nrn(r,e),f9((!n.c&&(n.c=new eU(YAt,n,12,10)),n.c),r),Len(r,0),Nen(r,1),nln(r,!0),Yfn(r,!0)}function Xjn(n,t){var e,i;return cL(e=hS(n.g,t),235)?((i=BB(e,235)).Qh(),i.Nh()):cL(e,498)?i=BB(e,1938).b:null}function Wjn(n,t,e,i){var r,c;return yX(t),yX(e),R7(!!(c=BB(UK(n.d,t),19)),"Row %s not in %s",t,n.e),R7(!!(r=BB(UK(n.b,e),19)),"Column %s not in %s",e,n.c),Sun(n,c.a,r.a,i)}function Vjn(n,t,e,i,r,c,a){var u,o,s,h,f;if(f=Bmn(u=(s=c==a-1)?i:0,h=r[c]),10!=i&&Pun(Gk(n,a-c),t[c],e[c],u,f),!s)for(++c,o=0;o<h;++o)f[o]=Vjn(n,t,e,i,r,c,a);return f}function Qjn(n){if(-1==n.g)throw Hp(new dv);n.mj();try{n.i.$c(n.g),n.f=n.i.j,n.g<n.e&&--n.e,n.g=-1}catch(t){throw cL(t=lun(t),73)?Hp(new vv):Hp(t)}}function Yjn(n,t){return n.b.a=e.Math.min(n.b.a,t.c),n.b.b=e.Math.min(n.b.b,t.d),n.a.a=e.Math.max(n.a.a,t.c),n.a.b=e.Math.max(n.a.b,t.d),n.c[n.c.length]=t,!0}function Jjn(n){var t,e,i;for(i=-1,e=0,t=new Wb(n);t.a<t.c.c.length;){if(BB(n0(t),243).c==(ain(),Hvt)){i=0==e?0:e-1;break}e==n.c.length-1&&(i=e),e+=1}return i}function Zjn(n){var t,i,r,c;for(c=0,t=0,r=new Wb(n.c);r.a<r.c.c.length;)Pen(i=BB(n0(r),33),n.e+c),Cen(i,n.f),c+=i.g+n.b,t=e.Math.max(t,i.f+n.b);n.d=c-n.b,n.a=t-n.b}function nEn(n){var t,e,i;for(e=new Wb(n.a.b);e.a<e.c.c.length;)i=(t=BB(n0(e),57)).d.c,t.d.c=t.d.d,t.d.d=i,i=t.d.b,t.d.b=t.d.a,t.d.a=i,i=t.b.a,t.b.a=t.b.b,t.b.b=i;yNn(n)}function tEn(n){var t,e,i;for(e=new Wb(n.a.b);e.a<e.c.c.length;)i=(t=BB(n0(e),81)).g.c,t.g.c=t.g.d,t.g.d=i,i=t.g.b,t.g.b=t.g.a,t.g.a=i,i=t.e.a,t.e.a=t.e.b,t.e.b=i;kNn(n)}function eEn(n){var t,e,i,r,c;for(c=gz(n.k),kUn(),i=0,r=(e=Pun(Gk(FIt,1),YZn,61,0,[PIt,sIt,oIt,SIt,CIt])).length;i<r;++i)if((t=e[i])!=PIt&&!c.Hc(t))return t;return null}function iEn(n,t){var e,i;return(i=BB(EN(Qon(AV(new Rq(null,new w1(t.j,16)),new bc))),11))&&(e=BB(xq(i.e,0),17))?BB(mMn(e,(hWn(),wlt)),19).a:gnn(n.b)}function rEn(n,t){var e,i,r;for(r=new Wb(t.a);r.a<r.c.c.length;)for(i=BB(n0(r),10),nk(n.d),e=new oz(ZL(lbn(i).a.Kc(),new h));dAn(e);)XOn(n,i,BB(U5(e),17).d.i)}function cEn(n,t){var e,i;for(y7(n.b,t),i=new Wb(n.n);i.a<i.c.c.length;)if(-1!=E7((e=BB(n0(i),211)).c,t,0)){y7(e.c,t),Zjn(e),0==e.c.c.length&&y7(n.n,e);break}fHn(n)}function aEn(n,t){var i,r,c,a,u;for(u=n.f,c=0,a=0,r=new Wb(n.a);r.a<r.c.c.length;)Tvn(i=BB(n0(r),187),n.e,u),p9(i,t),a=e.Math.max(a,i.r),c=u+=i.d+n.c;n.d=a,n.b=c}function uEn(n){var t,e;return h3(e=wLn(n))?null:(yX(e),t=BB(emn(new oz(ZL(e.a.Kc(),new h))),79),PTn(BB(Wtn((!t.b&&(t.b=new hK(KOt,t,4,7)),t.b),0),82)))}function oEn(n){return n.o||(n.Lj()?n.o=new aW(n,n,null):n.rk()?n.o=new rR(n,null):1==DW(B7((IPn(),Z$t),n))?n.o=new g4(n):n.o=new cR(n,null)),n.o}function sEn(n,t,e,i){var r,c,a,u,o;e.mh(t)&&(r=(a=t)?BB(i,49).xh(a):null)&&(o=e.ah(t),(u=t.t)>1||-1==u?(c=BB(o,15),r.Wb(Xdn(n,c))):r.Wb(t_n(n,BB(o,56))))}function hEn(n,t,e,i){YE();var r=PWn;function c(){for(var n=0;n<r.length;n++)r[n]()}if(n)try{HNt(c)()}catch(a){n(t,a)}else HNt(c)()}function fEn(n){var t,e,i,r,c;for(i=new usn(new Pb(n.b).a);i.b;)t=BB((e=ten(i)).cd(),10),c=BB(BB(e.dd(),46).a,10),r=BB(BB(e.dd(),46).b,8),UR(kO(t.n),UR(B$(c.n),r))}function lEn(n){switch(BB(mMn(n.b,(HXn(),egt)),375).g){case 1:JT($V(wnn(new Rq(null,new w1(n.d,16)),new _r),new Fr),new Br);break;case 2:vRn(n);break;case 0:CCn(n)}}function bEn(n,t,e){OTn(e,"Straight Line Edge Routing",1),e.n&&t&&y0(e,o2(t),(Bsn(),uOt)),mHn(n,BB(ZAn(t,(wD(),Vkt)),33)),e.n&&t&&y0(e,o2(t),(Bsn(),uOt))}function wEn(){wEn=O,ZMt=new RC("V_TOP",0),JMt=new RC("V_CENTER",1),YMt=new RC("V_BOTTOM",2),VMt=new RC("H_LEFT",3),WMt=new RC("H_CENTER",4),QMt=new RC("H_RIGHT",5)}function dEn(n){var t;return 0!=(64&n.Db)?Cwn(n):((t=new fN(Cwn(n))).a+=" (abstract: ",yE(t,0!=(256&n.Bb)),t.a+=", interface: ",yE(t,0!=(512&n.Bb)),t.a+=")",t.a)}function gEn(n,t,e,i){var r,c,a;return mA(n.e)&&(a=LY(n,1,r=t.ak(),t.dd(),c=e.dd(),r.$j()?pBn(n,r,c,cL(r,99)&&0!=(BB(r,18).Bb&BQn)):-1,!0),i?i.Ei(a):i=a),i}function pEn(n){var t;null==n.c&&(t=GI(n.b)===GI(Ynt)?null:n.b,n.d=null==t?zWn:ez(t)?jN(EQ(t)):XI(t)?qVn:nE(tsn(t)),n.a=n.a+": "+(ez(t)?CR(EQ(t)):t+""),n.c="("+n.d+") "+n.a)}function vEn(n,t){this.e=n,QI(e0(t,-4294967296),0)?(this.d=1,this.a=Pun(Gk(ANt,1),hQn,25,15,[dG(t)])):(this.d=2,this.a=Pun(Gk(ANt,1),hQn,25,15,[dG(t),dG(kz(t,32))]))}function mEn(){function n(){try{return(new Map).entries().next().done}catch(n){return!1}}return typeof Map===xWn&&Map.prototype.entries&&n()?Map:bUn()}function yEn(n,t){var e,i,r;for(r=new M2(n.e,0),e=0;r.b<r.d.gc();){if((i=Gy((Px(r.b<r.d.gc()),MD(r.d.Xb(r.c=r.b++))))-t)>D3n)return e;i>-1e-6&&++e}return e}function kEn(n,t){var e;t!=n.b?(e=null,n.b&&(e=oJ(n.b,n,-4,e)),t&&(e=Npn(t,n,-4,e)),(e=Zhn(n,t,e))&&e.Fi()):0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,3,t,t))}function jEn(n,t){var e;t!=n.f?(e=null,n.f&&(e=oJ(n.f,n,-1,e)),t&&(e=Npn(t,n,-1,e)),(e=nfn(n,t,e))&&e.Fi()):0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,0,t,t))}function EEn(n){var t,e,i;if(null==n)return null;if((e=BB(n,15)).dc())return"";for(i=new Sk,t=e.Kc();t.Ob();)cO(i,(Uqn(),SD(t.Pb()))),i.a+=" ";return KO(i,i.a.length-1)}function TEn(n){var t,e,i;if(null==n)return null;if((e=BB(n,15)).dc())return"";for(i=new Sk,t=e.Kc();t.Ob();)cO(i,(Uqn(),SD(t.Pb()))),i.a+=" ";return KO(i,i.a.length-1)}function MEn(n,t,e){var i,r;return i=n.c[t.c.p][t.p],r=n.c[e.c.p][e.p],null!=i.a&&null!=r.a?Tz(i.a,r.a):null!=i.a?-1:null!=r.a?1:0}function SEn(n,t){var e,i,r;if(t)for(r=((e=new hz(t.a.length)).b-e.a)*e.c<0?(eS(),MNt):new XL(e);r.Ob();)i=x2(t,BB(r.Pb(),19).a),OV(new Bg(n).a,i)}function PEn(n,t){var e,i,r;if(t)for(r=((e=new hz(t.a.length)).b-e.a)*e.c<0?(eS(),MNt):new XL(e);r.Ob();)i=x2(t,BB(r.Pb(),19).a),IV(new $g(n).a,i)}function CEn(n){if(null!=n&&n.length>0&&33==fV(n,n.length-1))try{return null==YPn(fx(n,0,n.length-1)).e}catch(t){if(!cL(t=lun(t),32))throw Hp(t)}return!1}function IEn(n,t,e){var i,r,c;return i=t.ak(),c=t.dd(),r=i.$j()?LY(n,3,i,null,c,pBn(n,i,c,cL(i,99)&&0!=(BB(i,18).Bb&BQn)),!0):LY(n,1,i,i.zj(),c,-1,!0),e?e.Ei(r):e=r,e}function OEn(){var n,t,e;for(t=0,n=0;n<1;n++){if(0==(e=QOn((b1(n,1),"X".charCodeAt(n)))))throw Hp(new ak("Unknown Option: "+"X".substr(n)));t|=e}return t}function AEn(n,t,e){var i,r;switch(i=Wln(vW(t)),CZ(r=new CSn,t),e.g){case 1:qCn(r,Tln(hwn(i)));break;case 2:qCn(r,hwn(i))}return hon(r,(HXn(),tpt),MD(mMn(n,tpt))),r}function $En(n){var t,e;return t=BB(U5(new oz(ZL(fbn(n.a).a.Kc(),new h))),17),e=BB(U5(new oz(ZL(lbn(n.a).a.Kc(),new h))),17),qy(TD(mMn(t,(hWn(),Clt))))||qy(TD(mMn(e,Clt)))}function LEn(){LEn=O,Mst=new yP("ONE_SIDE",0),Pst=new yP("TWO_SIDES_CORNER",1),Cst=new yP("TWO_SIDES_OPPOSING",2),Sst=new yP("THREE_SIDES",3),Tst=new yP("FOUR_SIDES",4)}function NEn(n,t,e,i,r){var c,a;c=BB(P4(AV(t.Oc(),new Zr),m9(new H,new B,new rn,Pun(Gk(nit,1),$Vn,132,0,[(qsn(),Uet)]))),15),a=BB(gan(n.b,e,i),15),0==r?a.Wc(0,c):a.Gc(c)}function xEn(n,t){var e,i,r;for(i=new Wb(t.a);i.a<i.c.c.length;)for(e=new oz(ZL(fbn(BB(n0(i),10)).a.Kc(),new h));dAn(e);)r=BB(U5(e),17).c.i.p,n.n[r]=n.n[r]-1}function DEn(n,t){var e,i,r,c;for(r=new Wb(t.d);r.a<r.c.c.length;)for(i=BB(n0(r),101),c=BB(RX(n.c,i),112).o,e=new QT(i.b);e.a<e.c.a.length;)g9(i,BB(u4(e),61),c)}function REn(n){var t;for(t=new Wb(n.e.b);t.a<t.c.c.length;)hzn(n,BB(n0(t),29));JT(AV(wnn(wnn(new Rq(null,new w1(n.e.b,16)),new Xc),new Zc),new na),new hg(n))}function KEn(n,t){return!!t&&!n.Di(t)&&(n.i?n.i.Ei(t):cL(t,143)?(n.i=BB(t,143),!0):(n.i=new po,n.i.Ei(t)))}function _En(n){if(n=FBn(n,!0),mK(a5n,n)||mK("1",n))return hN(),vtt;if(mK(u5n,n)||mK("0",n))return hN(),ptt;throw Hp(new ik("Invalid boolean value: '"+n+"'"))}function FEn(n,t,e){var i,r,c;for(r=n.vc().Kc();r.Ob();)if(c=(i=BB(r.Pb(),42)).cd(),GI(t)===GI(c)||null!=t&&Nfn(t,c))return e&&(i=new PS(i.cd(),i.dd()),r.Qb()),i;return null}function BEn(n){var t,e,i;qD(),n.B.Hc((n_n(),qIt))&&(i=n.f.i,t=new gY(n.a.c),(e=new bm).b=t.c-i.c,e.d=t.d-i.d,e.c=i.c+i.b-(t.c+t.b),e.a=i.d+i.a-(t.d+t.a),n.e.Ff(e))}function HEn(n,t,i,r){var c,a,u;for(u=e.Math.min(i,WFn(BB(n.b,65),t,i,r)),a=new Wb(n.a);a.a<a.c.c.length;)(c=BB(n0(a),221))!=t&&(u=e.Math.min(u,HEn(c,t,u,r)));return u}function qEn(n){var t,e,i;for(i=x8(Out,sVn,193,n.b.c.length,0,2),e=new M2(n.b,0);e.b<e.d.gc();)Px(e.b<e.d.gc()),t=BB(e.d.Xb(e.c=e.b++),29),i[e.b-1]=n2(t.a);return i}function GEn(n,t,e,i,r){var c,a,u,o;for(a=nj(Zk(H_(tvn(e)),i),akn(n,e,r)),o=DSn(n,e).Kc();o.Ob();)t[(u=BB(o.Pb(),11)).p]&&(c=t[u.p].i,WB(a.d,new xG(c,kln(a,c))));Pwn(a)}function zEn(n,t){this.f=new xp,this.b=new xp,this.j=new xp,this.a=n,this.c=t,this.c>0&&_yn(this,this.c-1,(kUn(),oIt)),this.c<this.a.length-1&&_yn(this,this.c+1,(kUn(),CIt))}function UEn(n){n.length>0&&n[0].length>0&&(this.c=qy(TD(mMn(vW(n[0][0]),(hWn(),alt))))),this.a=x8(Pmt,sVn,2018,n.length,0,2),this.b=x8(Lmt,sVn,2019,n.length,0,2),this.d=new Thn}function XEn(n){return 0!=n.c.length&&((l1(0,n.c.length),BB(n.c[0],17)).c.i.k==(uSn(),Put)||o5($V(new Rq(null,new w1(n,16)),new Kc),new _c))}function WEn(n,t,e){return OTn(e,"Tree layout",1),h2(n.b),CU(n.b,(zyn(),Ryt),Ryt),CU(n.b,Kyt,Kyt),CU(n.b,_yt,_yt),CU(n.b,Fyt,Fyt),n.a=$qn(n.b,t),lxn(n,t,mcn(e,1)),HSn(e),t}function VEn(n,t){var i,r,c,a,u,o;for(u=wDn(t),c=t.f,o=t.g,a=e.Math.sqrt(c*c+o*o),r=0,i=new Wb(u);i.a<i.c.c.length;)r+=VEn(n,BB(n0(i),33));return e.Math.max(r,a)}function QEn(){QEn=O,YCt=new UC(hJn,0),QCt=new UC("FREE",1),VCt=new UC("FIXED_SIDE",2),UCt=new UC("FIXED_ORDER",3),WCt=new UC("FIXED_RATIO",4),XCt=new UC("FIXED_POS",5)}function YEn(n,t){var e,i,r;if(e=t.Hh(n.a))for(r=SD(cdn((!e.b&&(e.b=new Jx((gWn(),k$t),X$t,e)),e.b),T7n)),i=1;i<(IPn(),nLt).length;++i)if(mK(nLt[i],r))return i;return 0}function JEn(n){var t,e,i,r;if(null==n)return zWn;for(r=new $an(FWn,"[","]"),e=0,i=(t=n).length;e<i;++e)b6(r,""+t[e]);return r.a?0==r.e.length?r.a.a:r.a.a+""+r.e:r.c}function ZEn(n){var t,e,i,r;if(null==n)return zWn;for(r=new $an(FWn,"[","]"),e=0,i=(t=n).length;e<i;++e)b6(r,""+t[e]);return r.a?0==r.e.length?r.a.a:r.a.a+""+r.e:r.c}function nTn(n){var t,e,i;for(i=new $an(FWn,"{","}"),e=n.vc().Kc();e.Ob();)b6(i,W3(n,(t=BB(e.Pb(),42)).cd())+"="+W3(n,t.dd()));return i.a?0==i.e.length?i.a.a:i.a.a+""+i.e:i.c}function tTn(n){for(var t,e,i,r;!Wy(n.o);)e=BB(dU(n.o),46),i=BB(e.a,121),r=Nbn(t=BB(e.b,213),i),t.e==i?(RN(r.g,t),i.e=r.e+t.a):(RN(r.b,t),i.e=r.e-t.a),WB(n.e.a,i)}function eTn(n,t){var e,i,r;for(e=null,r=BB(t.Kb(n),20).Kc();r.Ob();)if(i=BB(r.Pb(),17),e){if((i.c.i==n?i.d.i:i.c.i)!=e)return!1}else e=i.c.i==n?i.d.i:i.c.i;return!0}function iTn(n,t){var e,i,r;for(i=new Wb(QLn(n,!1,t));i.a<i.c.c.length;)0==(e=BB(n0(i),129)).d?(WZ(e,null),VZ(e,null)):(r=e.a,WZ(e,e.b),VZ(e,r))}function rTn(n){var t,e;return Jcn(t=new B2,Cyt),(e=BB(mMn(n,(hWn(),Zft)),21)).Hc((bDn(),vft))&&Jcn(t,$yt),e.Hc(sft)&&Jcn(t,Iyt),e.Hc(gft)&&Jcn(t,Ayt),e.Hc(fft)&&Jcn(t,Oyt),t}function cTn(n){var t,e,i,r;for(Sqn(n),e=new oz(ZL(hbn(n).a.Kc(),new h));dAn(e);)r=(i=(t=BB(U5(e),17)).c.i==n)?t.d:t.c,i?MZ(t,null):SZ(t,null),hon(t,(hWn(),mlt),r),uAn(n,r.i)}function aTn(n,t,e,i){var r,c;switch(r=e[(c=t.i).g][n.d[c.g]],c.g){case 1:r-=i+t.j.b,t.g.b=r;break;case 3:r+=i,t.g.b=r;break;case 4:r-=i+t.j.a,t.g.a=r;break;case 2:r+=i,t.g.a=r}}function uTn(n){var t,e;for(e=new AL((!n.a&&(n.a=new eU(UOt,n,10,11)),n.a));e.e!=e.i.gc();)if(!dAn(new oz(ZL(wLn(t=BB(kpn(e),33)).a.Kc(),new h))))return t;return null}function oTn(){var n;return WOt?BB($$n((WM(),zAt),y6n),2016):(n=BB(cL(SJ((WM(),zAt),y6n),555)?SJ(zAt,y6n):new sAn,555),WOt=!0,_Gn(n),jWn(n),Tyn(n),mZ(zAt,y6n,n),n)}function sTn(n,t,e){var i,r;if(0==n.j)return e;if(r=BB(_en(n,t,e),72),!(i=e.ak()).Ij()||!n.a.rl(i))throw Hp(new dy("Invalid entry feature '"+i.Hj().zb+"."+i.ne()+"'"));return r}function hTn(n,t){var e,i,r,c,a,u,o;for(u=0,o=(a=n.a).length;u<o;++u)for(r=0,c=(i=a[u]).length;r<c;++r)if(e=i[r],GI(t)===GI(e)||null!=t&&Nfn(t,e))return!0;return!1}function fTn(n){var t,e,i;return Vhn(n,0)>=0?(e=Ojn(n,AQn),i=ldn(n,AQn)):(e=Ojn(t=jz(n,1),5e8),i=rbn(yz(i=ldn(t,5e8),1),e0(n,1))),i0(yz(i,32),e0(e,UQn))}function lTn(n,t,e){var i;switch(Px(0!=t.b),i=BB(Atn(t,t.a.a),8),e.g){case 0:i.b=0;break;case 2:i.b=n.f;break;case 3:i.a=0;break;default:i.a=n.g}return nX(spn(t,0),i),t}function bTn(n,t,e,i){var r,c,a,u,o;switch(o=n.b,u=zgn(a=(c=t.d).j,o.d[a.g],e),r=UR(B$(c.n),c.a),c.j.g){case 1:case 3:u.a+=r.a;break;case 2:case 4:u.b+=r.b}r5(i,u,i.c.b,i.c)}function wTn(n,t,e){var i,r,c,a;for(a=E7(n.e,t,0),(c=new rm).b=e,i=new M2(n.e,a);i.b<i.d.gc();)Px(i.b<i.d.gc()),(r=BB(i.d.Xb(i.c=i.b++),10)).p=e,WB(c.e,r),fW(i);return c}function dTn(n,t,e,i){var r,c,a,u,o;for(r=null,c=0,u=new Wb(t);u.a<u.c.c.length;)o=(a=BB(n0(u),33)).i+a.g,n<a.j+a.f+i&&(r?e.i-o<e.i-c&&(r=a):r=a,c=r.i+r.g);return r?c+i:0}function gTn(n,t,e,i){var r,c,a,u,o;for(c=null,r=0,u=new Wb(t);u.a<u.c.c.length;)o=(a=BB(n0(u),33)).j+a.f,n<a.i+a.g+i&&(c?e.j-o<e.j-r&&(c=a):c=a,r=c.j+c.f);return c?r+i:0}function pTn(n){var t,e,i;for(t=!1,i=n.b.c.length,e=0;e<i;e++)Yon(BB(xq(n.b,e),434))?!t&&e+1<i&&Yon(BB(xq(n.b,e+1),434))&&(t=!0,BB(xq(n.b,e),434).a=!0):t=!1}function vTn(n,t,e,i,r){var c,a;for(c=0,a=0;a<r;a++)c=rbn(c,ibn(e0(t[a],UQn),e0(i[a],UQn))),n[a]=dG(c),c=kz(c,32);for(;a<e;a++)c=rbn(c,e0(t[a],UQn)),n[a]=dG(c),c=kz(c,32)}function mTn(n,t){var e,i;for($On(),ODn(),i=Jtt,e=n;t>1;t>>=1)0!=(1&t)&&(i=Nnn(i,e)),e=1==e.d?Nnn(e,e):new Cgn(I_n(e.a,e.d,x8(ANt,hQn,25,e.d<<1,15,1)));return i=Nnn(i,e)}function yTn(){var n,t,e,i;for(yTn=O,Oet=x8(xNt,qQn,25,25,15,1),Aet=x8(xNt,qQn,25,33,15,1),i=152587890625e-16,t=32;t>=0;t--)Aet[t]=i,i*=.5;for(e=1,n=24;n>=0;n--)Oet[n]=e,e*=.5}function kTn(n){var t,e;if(qy(TD(ZAn(n,(HXn(),wgt)))))for(e=new oz(ZL(dLn(n).a.Kc(),new h));dAn(e);)if(QIn(t=BB(U5(e),79))&&qy(TD(ZAn(t,dgt))))return!0;return!1}function jTn(n,t){var e,i,r;TU(n.f,t)&&(t.b=n,i=t.c,-1!=E7(n.j,i,0)||WB(n.j,i),r=t.d,-1!=E7(n.j,r,0)||WB(n.j,r),0!=(e=t.a.b).c.length&&(!n.i&&(n.i=new epn(n)),van(n.i,e)))}function ETn(n){var t,e,i,r;return(e=(t=n.c.d).j)==(r=(i=n.d.d).j)?t.p<i.p?0:1:Mln(e)==r?0:Eln(e)==r?1:SN(n.b.b,Mln(e))?0:1}function TTn(){TTn=O,tvt=new RP(j3n,0),Zpt=new RP("LONGEST_PATH",1),Ypt=new RP("COFFMAN_GRAHAM",2),Jpt=new RP(B1n,3),evt=new RP("STRETCH_WIDTH",4),nvt=new RP("MIN_WIDTH",5)}function MTn(n){var t;this.d=new xp,this.c=n.c,this.e=n.d,this.b=n.b,this.f=new sG(n.e),this.a=n.a,n.f?this.g=n.f:this.g=new YK(t=BB(Vj(aAt),9),BB(SR(t,t.length),9),0)}function STn(n,t){var e,i,r,c;!(r=D2(i=n,"layoutOptions"))&&(r=D2(i,M6n)),r&&(e=null,(c=r)&&(e=new TT(c,jrn(c,x8(Qtt,sVn,2,0,6,1)))),e&&e5(e,new wI(c,t)))}function PTn(n){if(cL(n,239))return BB(n,33);if(cL(n,186))return WJ(BB(n,118));throw Hp(n?new tk("Only support nodes and ports."):new Hy(e8n))}function CTn(n,t,e,i){return t>=0&&mK(n.substr(t,3),"GMT")||t>=0&&mK(n.substr(t,3),"UTC")?(e[0]=t+3,y_n(n,e,i)):y_n(n,e,i)}function ITn(n,t){var e,i,r,c,a;for(c=n.g.a,a=n.g.b,i=new Wb(n.d);i.a<i.c.c.length;)(r=(e=BB(n0(i),70)).n).a=c,n.i==(kUn(),sIt)?r.b=a+n.j.b-e.o.b:r.b=a,UR(r,t),c+=e.o.a+n.e}function OTn(n,t,e){if(n.b)throw Hp(new Fy("The task is already done."));return null==n.p&&(n.p=t,n.r=e,n.k&&(n.o=($T(),cbn(fan(Date.now()),VVn))),!0)}function ATn(n){var t;return t=new py,null!=n.tg()&&AH(t,q6n,n.tg()),null!=n.ne()&&AH(t,t8n,n.ne()),null!=n.sg()&&AH(t,"description",n.sg()),t}function $Tn(n,t,e){var i,r,c;return c=n.q,n.q=t,0!=(4&n.Db)&&0==(1&n.Db)&&(r=new nU(n,1,9,c,t),e?e.Ei(r):e=r),t?(i=t.c)!=n.r&&(e=n.nk(i,e)):n.r&&(e=n.nk(null,e)),e}function LTn(n,t,e){var i,r;for(e=Npn(t,n.e,-1-n.c,e),r=new Mp(new usn(new Pb(xW(n.a).a).a));r.a.b;)e=azn(i=BB(ten(r.a).cd(),87),kLn(i,n.a),e);return e}function NTn(n,t,e){var i,r;for(e=oJ(t,n.e,-1-n.c,e),r=new Mp(new usn(new Pb(xW(n.a).a).a));r.a.b;)e=azn(i=BB(ten(r.a).cd(),87),kLn(i,n.a),e);return e}function xTn(n,t,e,i){var r,c,a;if(0==i)aHn(t,0,n,e,n.length-e);else for(a=32-i,n[n.length-1]=0,c=n.length-1;c>e;c--)n[c]|=t[c-e-1]>>>a,n[c-1]=t[c-e-1]<<i;for(r=0;r<e;r++)n[r]=0}function DTn(n){var t,i,r,c,a;for(t=0,i=0,a=n.Kc();a.Ob();)r=BB(a.Pb(),111),t=e.Math.max(t,r.d.b),i=e.Math.max(i,r.d.c);for(c=n.Kc();c.Ob();)(r=BB(c.Pb(),111)).d.b=t,r.d.c=i}function RTn(n){var t,i,r,c,a;for(i=0,t=0,a=n.Kc();a.Ob();)r=BB(a.Pb(),111),i=e.Math.max(i,r.d.d),t=e.Math.max(t,r.d.a);for(c=n.Kc();c.Ob();)(r=BB(c.Pb(),111)).d.d=i,r.d.a=t}function KTn(n,t){var e,i,r,c;for(c=new Np,r=0,i=t.Kc();i.Ob();){for(e=iln(BB(i.Pb(),19).a+r);e.a<n.f&&!tG(n,e.a);)e=iln(e.a+1),++r;if(e.a>=n.f)break;c.c[c.c.length]=e}return c}function _Tn(n){var t,e,i,r;for(t=null,r=new Wb(n.wf());r.a<r.c.c.length;)e=new UV((i=BB(n0(r),181)).qf().a,i.qf().b,i.rf().a,i.rf().b),t?CPn(t,e):t=e;return!t&&(t=new bA),t}function FTn(n,t,e,i){return 1==e?(!n.n&&(n.n=new eU(zOt,n,1,7)),Ywn(n.n,t,i)):BB(itn(BB(yan(n,16),26)||n.zh(),e),66).Nj().Qj(n,fgn(n),e-bX(n.zh()),t,i)}function BTn(n,t,e){var i,r,c,a,u;for(i=e.gc(),n.qi(n.i+i),(u=n.i-t)>0&&aHn(n.g,t,n.g,t+i,u),a=e.Kc(),n.i+=i,r=0;r<i;++r)c=a.Pb(),jL(n,t,n.oi(t,c)),n.bi(t,c),n.ci(),++t;return 0!=i}function HTn(n,t,e){var i;return t!=n.q?(n.q&&(e=oJ(n.q,n,-10,e)),t&&(e=Npn(t,n,-10,e)),e=$Tn(n,t,e)):0!=(4&n.Db)&&0==(1&n.Db)&&(i=new nU(n,1,9,t,t),e?e.Ei(i):e=i),e}function qTn(n,t,e,i){return C_(0==(e&hVn),"flatMap does not support SUBSIZED characteristic"),C_(0==(4&e),"flatMap does not support SORTED characteristic"),yX(n),yX(t),new q2(n,e,i,t)}function GTn(n,t){SU(t,"Cannot suppress a null exception."),vH(t!=n,"Exception can not suppress itself."),n.i||(null==n.k?n.k=Pun(Gk(Jnt,1),sVn,78,0,[t]):n.k[n.k.length]=t)}function zTn(n,t,e,i){var r,c,a,u,o,s;for(a=e.length,c=0,r=-1,s=atn(n.substr(t),(c_(),Tet)),u=0;u<a;++u)(o=e[u].length)>c&&sU(s,atn(e[u],Tet))&&(r=u,c=o);return r>=0&&(i[0]=t+c),r}function UTn(n,t){var e;if(0!=(e=YO(n.b.Hf(),t.b.Hf())))return e;switch(n.b.Hf().g){case 1:case 2:return E$(n.b.sf(),t.b.sf());case 3:case 4:return E$(t.b.sf(),n.b.sf())}return 0}function XTn(n){var t,e,i;for(i=n.e.c.length,n.a=kq(ANt,[sVn,hQn],[48,25],15,[i,i],2),e=new Wb(n.c);e.a<e.c.c.length;)t=BB(n0(e),282),n.a[t.c.b][t.d.b]+=BB(mMn(t,(fRn(),Zct)),19).a}function WTn(n,t,e){OTn(e,"Grow Tree",1),n.b=t.f,qy(TD(mMn(t,(Xcn(),Qrt))))?(n.c=new it,QZ(n,null)):n.c=new it,n.a=!1,FNn(n,t.f),hon(t,Yrt,(hN(),!!n.a)),HSn(e)}function VTn(n,t){var e,i,r,c,a;if(null==n)return null;for(a=x8(ONt,WVn,25,2*t,15,1),i=0,r=0;i<t;++i)e=n[i]>>4&15,c=15&n[i],a[r++]=OOt[e],a[r++]=OOt[c];return Bdn(a,0,a.length)}function QTn(n,t,e){var i,r,c;return i=t.ak(),c=t.dd(),r=i.$j()?LY(n,4,i,c,null,pBn(n,i,c,cL(i,99)&&0!=(BB(i,18).Bb&BQn)),!0):LY(n,i.Kj()?2:1,i,c,i.zj(),-1,!0),e?e.Ei(r):e=r,e}function YTn(n){var t,e;return n>=BQn?(t=HQn+(n-BQn>>10&1023)&QVn,e=56320+(n-BQn&1023)&QVn,String.fromCharCode(t)+""+String.fromCharCode(e)):String.fromCharCode(n&QVn)}function JTn(n,t){var e,i,r,c;return qD(),(r=BB(BB(h6(n.r,t),21),84)).gc()>=2&&(i=BB(r.Kc().Pb(),111),e=n.u.Hc((lIn(),tIt)),c=n.u.Hc(cIt),!i.a&&!e&&(2==r.gc()||c))}function ZTn(n,t,e,i,r){var c,a,u;for(c=eDn(n,t,e,i,r),u=!1;!c;)E$n(n,r,!0),u=!0,c=eDn(n,t,e,i,r);u&&E$n(n,r,!1),0!=(a=Dun(r)).c.length&&(n.d&&n.d.lg(a),ZTn(n,r,e,i,a))}function nMn(){nMn=O,aCt=new BC(QZn,0),rCt=new BC("DIRECTED",1),uCt=new BC("UNDIRECTED",2),eCt=new BC("ASSOCIATION",3),cCt=new BC("GENERALIZATION",4),iCt=new BC("DEPENDENCY",5)}function tMn(n,t){var e;if(!WJ(n))throw Hp(new Fy(F5n));switch(e=WJ(n),t.g){case 1:return-(n.j+n.f);case 2:return n.i-e.g;case 3:return n.j-e.f;case 4:return-(n.i+n.g)}return 0}function eMn(n,t){var e,i;for(kW(t),i=n.b.c.length,WB(n.b,t);i>0;){if(e=i,i=(i-1)/2|0,n.a.ue(xq(n.b,i),t)<=0)return c5(n.b,e,t),!0;c5(n.b,e,xq(n.b,i))}return c5(n.b,i,t),!0}function iMn(n,t,i,r){var c,a;if(c=0,i)c=mhn(n.a[i.g][t.g],r);else for(a=0;a<nrt;a++)c=e.Math.max(c,mhn(n.a[a][t.g],r));return t==(Dtn(),zit)&&n.b&&(c=e.Math.max(c,n.b.a)),c}function rMn(n,t){var e,i,r,c,a;return i=n.i,r=t.i,!(!i||!r)&&i.i==r.i&&i.i!=(kUn(),oIt)&&i.i!=(kUn(),CIt)&&(e=(c=i.g.a)+i.j.a,c<=(a=r.g.a)+r.j.a&&e>=a)}function cMn(n,t,e,i){var r;if(r=!1,XI(i)&&(r=!0,AH(t,e,SD(i))),r||zI(i)&&(r=!0,cMn(n,t,e,i)),r||cL(i,236)&&(r=!0,qQ(t,e,BB(i,236))),!r)throw Hp(new Ly(H6n))}function aMn(n,t){var e,i,r;if((e=t.Hh(n.a))&&null!=(r=cdn((!e.b&&(e.b=new Jx((gWn(),k$t),X$t,e)),e.b),F9n)))for(i=1;i<(IPn(),Y$t).length;++i)if(mK(Y$t[i],r))return i;return 0}function uMn(n,t){var e,i,r;if((e=t.Hh(n.a))&&null!=(r=cdn((!e.b&&(e.b=new Jx((gWn(),k$t),X$t,e)),e.b),F9n)))for(i=1;i<(IPn(),J$t).length;++i)if(mK(J$t[i],r))return i;return 0}function oMn(n,t){var e,i,r,c;if(kW(t),(c=n.a.gc())<t.gc())for(e=n.a.ec().Kc();e.Ob();)i=e.Pb(),t.Hc(i)&&e.Qb();else for(r=t.Kc();r.Ob();)i=r.Pb(),n.a.Bc(i);return c!=n.a.gc()}function sMn(n){var t,e;switch(e=B$(Aon(Pun(Gk(PMt,1),sVn,8,0,[n.i.n,n.n,n.a]))),t=n.i.d,n.j.g){case 1:e.b-=t.d;break;case 2:e.a+=t.c;break;case 3:e.b+=t.a;break;case 4:e.a-=t.b}return e}function hMn(n){var t;for(Irn(),t=BB(U5(new oz(ZL(fbn(n).a.Kc(),new h))),17).c.i;t.k==(uSn(),Put);)hon(t,(hWn(),olt),(hN(),!0)),t=BB(U5(new oz(ZL(fbn(t).a.Kc(),new h))),17).c.i}function fMn(n,t,e,i){var r,c,a;for(a=Lfn(t,i).Kc();a.Ob();)r=BB(a.Pb(),11),n.d[r.p]=n.d[r.p]+n.c[e.p];for(c=Lfn(e,i).Kc();c.Ob();)r=BB(c.Pb(),11),n.d[r.p]=n.d[r.p]-n.c[t.p]}function lMn(n,t,e){var i,r;for(r=new AL((!n.a&&(n.a=new eU(UOt,n,10,11)),n.a));r.e!=r.i.gc();)SA(i=BB(kpn(r),33),i.i+t,i.j+e);e5((!n.b&&(n.b=new eU(_Ot,n,12,3)),n.b),new tI(t,e))}function bMn(n,t,e,i){var r,c;for(r=null==(c=t).d||n.a.ue(e.d,c.d)>0?1:0;c.a[r]!=e;)c=c.a[r],r=n.a.ue(e.d,c.d)>0?1:0;c.a[r]=i,i.b=e.b,i.a[0]=e.a[0],i.a[1]=e.a[1],e.a[0]=null,e.a[1]=null}function wMn(n){return lIn(),!(Can(OJ(EG(eIt,Pun(Gk(IIt,1),$Vn,273,0,[rIt])),n))>1||Can(OJ(EG(tIt,Pun(Gk(IIt,1),$Vn,273,0,[nIt,cIt])),n))>1)}function dMn(n,t){cL(SJ((WM(),zAt),n),498)?mZ(zAt,n,new OI(this,t)):mZ(zAt,n,this),iSn(this,t),t==(iE(),n$t)?(this.wb=BB(this,1939),BB(t,1941)):this.wb=(QX(),t$t)}function gMn(n){var t,e;if(null==n)return null;for(t=null,e=0;e<IOt.length;++e)try{return BM(IOt[e],n)}catch(i){if(!cL(i=lun(i),32))throw Hp(i);t=i}throw Hp(new L7(t))}function pMn(){pMn=O,pet=Pun(Gk(Qtt,1),sVn,2,6,["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]),vet=Pun(Gk(Qtt,1),sVn,2,6,["Jan","Feb","Mar","Apr",tQn,"Jun","Jul","Aug","Sep","Oct","Nov","Dec"])}function vMn(n){var t,e,i;(t=mK(typeof t,gYn)?null:new ln)&&(lM(),tW(e=(i=900)>=VVn?"error":i>=900?"warn":i>=800?"info":"log",n.a),n.b&&xNn(t,e,n.b,"Exception: ",!0))}function mMn(n,t){var e,i;return!n.q&&(n.q=new xp),null!=(i=RX(n.q,t))?i:(cL(e=t.wg(),4)&&(null==e?(!n.q&&(n.q=new xp),v6(n.q,t)):(!n.q&&(n.q=new xp),VW(n.q,t,e))),e)}function yMn(){yMn=O,Rat=new VS("P1_CYCLE_BREAKING",0),Kat=new VS("P2_LAYERING",1),_at=new VS("P3_NODE_ORDERING",2),Fat=new VS("P4_NODE_PLACEMENT",3),Bat=new VS("P5_EDGE_ROUTING",4)}function kMn(n,t){var e,i,r,c;for(i=(1==t?Wat:Xat).a.ec().Kc();i.Ob();)for(e=BB(i.Pb(),103),c=BB(h6(n.f.c,e),21).Kc();c.Ob();)r=BB(c.Pb(),46),y7(n.b.b,r.b),y7(n.b.a,BB(r.b,81).d)}function jMn(n,t){var e;if(Dnn(),n.c==t.c){if(n.b==t.b||hcn(n.b,t.b)){if(e=ZO(n.b)?1:-1,n.a&&!t.a)return e;if(!n.a&&t.a)return-e}return E$(n.b.g,t.b.g)}return Pln(n.c,t.c)}function EMn(n,t){var e;OTn(t,"Hierarchical port position processing",1),(e=n.b).c.length>0&&i_n((l1(0,e.c.length),BB(e.c[0],29)),n),e.c.length>1&&i_n(BB(xq(e,e.c.length-1),29),n),HSn(t)}function TMn(n,t){var e,i;if(NMn(n,t))return!0;for(i=new Wb(t);i.a<i.c.c.length;){if(_Dn(n,e=BB(n0(i),33),uEn(e)))return!0;if($hn(n,e)-n.g<=n.a)return!0}return!1}function MMn(){MMn=O,bRn(),kTt=RTt,vTt=LTt,pTt=ATt,dTt=PTt,gTt=ITt,wTt=new WA(8),bTt=new XA((sWn(),XSt),wTt),mTt=new XA(LPt,8),yTt=xTt,hTt=jTt,fTt=TTt,lTt=new XA(lSt,(hN(),!1))}function SMn(){SMn=O,zMt=new WA(15),GMt=new XA((sWn(),XSt),zMt),XMt=new XA(LPt,15),UMt=new XA(pPt,iln(0)),_Mt=jSt,BMt=KSt,qMt=qSt,DMt=new XA(cSt,f5n),FMt=CSt,HMt=BSt,RMt=uSt,KMt=hSt}function PMn(n){if(1!=(!n.b&&(n.b=new hK(KOt,n,4,7)),n.b).i||1!=(!n.c&&(n.c=new hK(KOt,n,5,8)),n.c).i)throw Hp(new _y(r8n));return PTn(BB(Wtn((!n.b&&(n.b=new hK(KOt,n,4,7)),n.b),0),82))}function CMn(n){if(1!=(!n.b&&(n.b=new hK(KOt,n,4,7)),n.b).i||1!=(!n.c&&(n.c=new hK(KOt,n,5,8)),n.c).i)throw Hp(new _y(r8n));return bun(BB(Wtn((!n.b&&(n.b=new hK(KOt,n,4,7)),n.b),0),82))}function IMn(n){if(1!=(!n.b&&(n.b=new hK(KOt,n,4,7)),n.b).i||1!=(!n.c&&(n.c=new hK(KOt,n,5,8)),n.c).i)throw Hp(new _y(r8n));return bun(BB(Wtn((!n.c&&(n.c=new hK(KOt,n,5,8)),n.c),0),82))}function OMn(n){if(1!=(!n.b&&(n.b=new hK(KOt,n,4,7)),n.b).i||1!=(!n.c&&(n.c=new hK(KOt,n,5,8)),n.c).i)throw Hp(new _y(r8n));return PTn(BB(Wtn((!n.c&&(n.c=new hK(KOt,n,5,8)),n.c),0),82))}function AMn(n,t,e){var i,r,c;if(++n.j,t>=(r=n.Vi())||t<0)throw Hp(new Ay(u8n+t+o8n+r));if(e>=r||e<0)throw Hp(new Ay(s8n+e+o8n+r));return t!=e?(c=n.Ti(e),n.Hi(t,c),i=c):i=n.Oi(e),i}function $Mn(n){var t,e,i;if(i=n,n)for(t=0,e=n.Ug();e;e=e.Ug()){if(++t>GQn)return $Mn(e);if(i=e,e==n)throw Hp(new Fy("There is a cycle in the containment hierarchy of "+n))}return i}function LMn(n){var t,e,i;for(i=new $an(FWn,"[","]"),e=n.Kc();e.Ob();)b6(i,GI(t=e.Pb())===GI(n)?"(this Collection)":null==t?zWn:Bbn(t));return i.a?0==i.e.length?i.a.a:i.a.a+""+i.e:i.c}function NMn(n,t){var e,i;if(i=!1,t.gc()<2)return!1;for(e=0;e<t.gc();e++)e<t.gc()-1?i|=_Dn(n,BB(t.Xb(e),33),BB(t.Xb(e+1),33)):i|=_Dn(n,BB(t.Xb(e),33),BB(t.Xb(0),33));return i}function xMn(n,t){var e;t!=n.a?(e=null,n.a&&(e=BB(n.a,49).ih(n,4,GOt,e)),t&&(e=BB(t,49).gh(n,4,GOt,e)),(e=Jhn(n,t,e))&&e.Fi()):0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,1,t,t))}function DMn(n,t){var e;t!=n.e?(n.e&&_6(xW(n.e),n),t&&(!t.b&&(t.b=new Tp(new xm)),YR(t.b,n)),(e=Qkn(n,t,null))&&e.Fi()):0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,4,t,t))}function RMn(n){var t,e,i;for(e=n.length,i=0;i<e&&(b1(i,n.length),n.charCodeAt(i)<=32);)++i;for(t=e;t>i&&(b1(t-1,n.length),n.charCodeAt(t-1)<=32);)--t;return i>0||t<e?n.substr(i,t-i):n}function KMn(n,t){var i;i=t.o,dA(n.f)?(n.j.a=e.Math.max(n.j.a,i.a),n.j.b+=i.b,n.d.c.length>1&&(n.j.b+=n.e)):(n.j.a+=i.a,n.j.b=e.Math.max(n.j.b,i.b),n.d.c.length>1&&(n.j.a+=n.e))}function _Mn(){_Mn=O,$st=Pun(Gk(FIt,1),YZn,61,0,[(kUn(),sIt),oIt,SIt]),Ast=Pun(Gk(FIt,1),YZn,61,0,[oIt,SIt,CIt]),Lst=Pun(Gk(FIt,1),YZn,61,0,[SIt,CIt,sIt]),Nst=Pun(Gk(FIt,1),YZn,61,0,[CIt,sIt,oIt])}function FMn(n,t,e,i){var r,c,a,u,o;if(c=n.c.d,a=n.d.d,c.j!=a.j)for(o=n.b,r=c.j,u=null;r!=a.j;)u=0==t?Mln(r):Eln(r),DH(i,UR(zgn(r,o.d[r.g],e),zgn(u,o.d[u.g],e))),r=u}function BMn(n,t,e,i){var r,c,a,u,o;return u=BB((a=qyn(n.a,t,e)).a,19).a,c=BB(a.b,19).a,i&&(o=BB(mMn(t,(hWn(),Elt)),10),r=BB(mMn(e,Elt),10),o&&r&&(t4(n.b,o,r),u+=n.b.i,c+=n.b.e)),u>c}function HMn(n){var t,e,i,r,c,a,u,o;for(this.a=rvn(n),this.b=new Np,i=0,r=(e=n).length;i<r;++i)for(t=e[i],c=new Np,WB(this.b,c),u=0,o=(a=t).length;u<o;++u)WB(c,new t_(a[u].j))}function qMn(n,t,e){var i,r,c;return c=0,i=e[t],t<e.length-1&&(r=e[t+1],n.b[t]?(c=bWn(n.d,i,r),c+=ZX(n.a,i,(kUn(),oIt)),c+=ZX(n.a,r,CIt)):c=I9(n.a,i,r)),n.c[t]&&(c+=L6(n.a,i)),c}function GMn(n,t,e,i,r){var c,a,u,o;for(o=null,u=new Wb(i);u.a<u.c.c.length;)if((a=BB(n0(u),441))!=e&&-1!=E7(a.e,r,0)){o=a;break}SZ(c=W5(r),e.b),MZ(c,o.b),JIn(n.a,r,new L_(c,t,e.f))}function zMn(n){for(;0!=n.g.c&&0!=n.d.c;)FD(n.g).c>FD(n.d).c?(n.i+=n.g.c,gdn(n.d)):FD(n.d).c>FD(n.g).c?(n.e+=n.d.c,gdn(n.g)):(n.i+=qq(n.g),n.e+=qq(n.d),gdn(n.g),gdn(n.d))}function UMn(n,t,e){var i,r,c,a;for(c=t.q,a=t.r,new zZ((O6(),Tyt),t,c,1),new zZ(Tyt,c,a,1),r=new Wb(e);r.a<r.c.c.length;)(i=BB(n0(r),112))!=c&&i!=t&&i!=a&&(gHn(n.a,i,t),gHn(n.a,i,a))}function XMn(n,t,i,r){n.a.d=e.Math.min(t,i),n.a.a=e.Math.max(t,r)-n.a.d,t<i?(n.b=.5*(t+i),n.g=K3n*n.b+.9*t,n.f=K3n*n.b+.9*i):(n.b=.5*(t+r),n.g=K3n*n.b+.9*r,n.f=K3n*n.b+.9*t)}function WMn(){function n(){return(new Date).getTime()}SWn={},!Array.isArray&&(Array.isArray=function(n){return"[object Array]"===Object.prototype.toString.call(n)}),!Date.now&&(Date.now=n)}function VMn(n,t){var e,i;i=BB(mMn(t,(HXn(),ept)),98),hon(t,(hWn(),ylt),i),(e=t.e)&&(JT(new Rq(null,new w1(e.a,16)),new Rw(n)),JT(wnn(new Rq(null,new w1(e.b,16)),new mt),new Kw(n)))}function QMn(n){var t,i,r,c;if(gA(BB(mMn(n.b,(HXn(),Udt)),103)))return 0;for(t=0,r=new Wb(n.a);r.a<r.c.c.length;)(i=BB(n0(r),10)).k==(uSn(),Cut)&&(c=i.o.a,t=e.Math.max(t,c));return t}function YMn(n){switch(BB(mMn(n,(HXn(),kgt)),163).g){case 1:hon(n,kgt,(Tbn(),Blt));break;case 2:hon(n,kgt,(Tbn(),Hlt));break;case 3:hon(n,kgt,(Tbn(),_lt));break;case 4:hon(n,kgt,(Tbn(),Flt))}}function JMn(){JMn=O,cft=new $P(QZn,0),eft=new $P(cJn,1),aft=new $P(aJn,2),rft=new $P("LEFT_RIGHT_CONSTRAINT_LOCKING",3),ift=new $P("LEFT_RIGHT_CONNECTION_LOCKING",4),tft=new $P(q1n,5)}function ZMn(n,t,i){var r,c,a,u,o,s,h;o=i.a/2,a=i.b/2,s=1,h=1,(r=e.Math.abs(t.a-n.a))>o&&(s=o/r),(c=e.Math.abs(t.b-n.b))>a&&(h=a/c),u=e.Math.min(s,h),n.a+=u*(t.a-n.a),n.b+=u*(t.b-n.b)}function nSn(n,t,e,i,r){var c,a;for(a=!1,c=BB(xq(e.b,0),33);hBn(n,t,c,i,r)&&(a=!0,cEn(e,c),0!=e.b.c.length);)c=BB(xq(e.b,0),33);return 0==e.b.c.length&&Tkn(e.j,e),a&&Gmn(t.q),a}function tSn(n,t){var e,i,r,c;if(jDn(),t.b<2)return!1;for(i=e=BB(b3(c=spn(t,0)),8);c.b!=c.d.c;){if(cNn(n,i,r=BB(b3(c),8)))return!0;i=r}return!!cNn(n,i,e)}function eSn(n,t,e,i){return 0==e?(!n.o&&(n.o=new y9((CXn(),MOt),rAt,n,0)),BK(n.o,t,i)):BB(itn(BB(yan(n,16),26)||n.zh(),e),66).Nj().Rj(n,fgn(n),e-bX(n.zh()),t,i)}function iSn(n,t){var e;t!=n.sb?(e=null,n.sb&&(e=BB(n.sb,49).ih(n,1,HOt,e)),t&&(e=BB(t,49).gh(n,1,HOt,e)),(e=jfn(n,t,e))&&e.Fi()):0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,4,t,t))}function rSn(n,t){var e,i;if(!t)throw Hp(new ek("All edge sections need an end point."));e=Ren(t,"x"),Ten(new Kg(n).a,(kW(e),e)),i=Ren(t,"y"),Oen(new _g(n).a,(kW(i),i))}function cSn(n,t){var e,i;if(!t)throw Hp(new ek("All edge sections need a start point."));e=Ren(t,"x"),Ien(new xg(n).a,(kW(e),e)),i=Ren(t,"y"),Aen(new Dg(n).a,(kW(i),i))}function aSn(n,t){var e,i,r,c,a;for(i=0,c=psn(n).length;i<c;++i)vMn(t);for(a=!Qet&&n.e?Qet?null:n.d:null;a;){for(e=0,r=psn(a).length;e<r;++e)vMn(t);a=!Qet&&a.e?Qet?null:a.d:null}}function uSn(){uSn=O,Cut=new JS("NORMAL",0),Put=new JS("LONG_EDGE",1),Mut=new JS("EXTERNAL_PORT",2),Iut=new JS("NORTH_SOUTH_PORT",3),Sut=new JS("LABEL",4),Tut=new JS("BREAKING_POINT",5)}function oSn(n){var t,e,i,r;if(t=!1,Lx(n,(hWn(),zft)))for(e=BB(mMn(n,zft),83),r=new Wb(n.j);r.a<r.c.c.length;)J$n(i=BB(n0(r),11))&&(t||(iIn(vW(n)),t=!0),fpn(BB(e.xc(i),306)))}function sSn(n,t,e){var i;OTn(e,"Self-Loop routing",1),i=Vln(t),iO(mMn(t,(C6(),TMt))),JT($V(AV(AV(wnn(new Rq(null,new w1(t.b,16)),new zi),new Ui),new Xi),new Wi),new eP(n,i)),HSn(e)}function hSn(n){var t,e,i;return i=ATn(n),null!=n.e&&AH(i,n8n,n.e),!!n.k&&AH(i,"type",dx(n.k)),!WE(n.j)&&(e=new Cl,rtn(i,N6n,e),t=new cp(e),e5(n.j,t)),i}function fSn(n){var t,e,i,r;for(r=xX((lin(n.gc(),"size"),new Ik),123),i=!0,e=lz(n).Kc();e.Ob();)t=BB(e.Pb(),42),i||(r.a+=FWn),i=!1,uO(xX(uO(r,t.cd()),61),t.dd());return(r.a+="}",r).a}function lSn(n,t){var e,i,r;return(t&=63)<22?(e=n.l<<t,i=n.m<<t|n.l>>22-t,r=n.h<<t|n.m>>22-t):t<44?(e=0,i=n.l<<t-22,r=n.m<<t-22|n.l>>44-t):(e=0,i=0,r=n.l<<t-44),M$(e&SQn,i&SQn,r&PQn)}function bSn(n){if(null==ytt&&(ytt=new RegExp("^\\s*[+-]?(NaN|Infinity|((\\d+\\.?\\d*)|(\\.\\d+))([eE][+-]?\\d+)?[dDfF]?)\\s*$")),!ytt.test(n))throw Hp(new Mk(DQn+n+'"'));return parseFloat(n)}function wSn(n){var t,e,i,r;for(t=new Np,vU(e=x8($Nt,ZYn,25,n.a.c.length,16,1),e.length),r=new Wb(n.a);r.a<r.c.c.length;)e[(i=BB(n0(r),121)).d]||(t.c[t.c.length]=i,Ggn(n,i,e));return t}function dSn(n,t){var e,i,r,c;for(c=t.b.j,n.a=x8(ANt,hQn,25,c.c.length,15,1),r=0,i=0;i<c.c.length;i++)l1(i,c.c.length),0==(e=BB(c.c[i],11)).e.c.length&&0==e.g.c.length?r+=1:r+=3,n.a[i]=r}function gSn(){gSn=O,Dht=new IP("ALWAYS_UP",0),xht=new IP("ALWAYS_DOWN",1),Kht=new IP("DIRECTION_UP",2),Rht=new IP("DIRECTION_DOWN",3),Fht=new IP("SMART_UP",4),_ht=new IP("SMART_DOWN",5)}function pSn(n,t){if(n<0||t<0)throw Hp(new _y("k and n must be positive"));if(t>n)throw Hp(new _y("k must be smaller than n"));return 0==t||t==n?1:0==n?0:Mjn(n)/(Mjn(t)*Mjn(n-t))}function vSn(n,t){var e,i,r,c;for(e=new OA(n);null!=e.g||e.c?null==e.g||0!=e.i&&BB(e.g[e.i-1],47).Ob():tZ(e);)if(cL(c=BB(aLn(e),56),160))for(i=BB(c,160),r=0;r<t.length;r++)t[r].og(i)}function mSn(n){var t;return 0!=(64&n.Db)?Yln(n):((t=new fN(Yln(n))).a+=" (height: ",vE(t,n.f),t.a+=", width: ",vE(t,n.g),t.a+=", x: ",vE(t,n.i),t.a+=", y: ",vE(t,n.j),t.a+=")",t.a)}function ySn(n){var t,e,i,r,c,a;for(t=new v4,r=0,c=(i=n).length;r<c;++r)if(null!=Jgn(t,a=yX((e=i[r]).cd()),yX(e.dd())))throw Hp(new _y("duplicate key: "+a));this.b=(SQ(),new Xb(t))}function kSn(n){var t,e,i,r,c;if(null==n)return zWn;for(c=new $an(FWn,"[","]"),i=0,r=(e=n).length;i<r;++i)t=e[i],b6(c,String.fromCharCode(t));return c.a?0==c.e.length?c.a.a:c.a.a+""+c.e:c.c}function jSn(){jSn=O,Knn(),Ict=new $O(oZn,Oct=Rct),iln(1),Cct=new $O(sZn,iln(300)),iln(0),Lct=new $O(hZn,iln(0)),new $p,Nct=new $O(fZn,lZn),new $p,Act=new $O(bZn,5),xct=Rct,$ct=Dct}function ESn(n,t){var e,i,r,c;for(i=(1==t?Wat:Xat).a.ec().Kc();i.Ob();)for(e=BB(i.Pb(),103),c=BB(h6(n.f.c,e),21).Kc();c.Ob();)r=BB(c.Pb(),46),WB(n.b.b,BB(r.b,81)),WB(n.b.a,BB(r.b,81).d)}function TSn(n,t){var e;if(null!=t&&!n.c.Yj().wj(t))throw e=cL(t,56)?BB(t,56).Tg().zb:nE(tsn(t)),Hp(new Ky(r6n+n.c.ne()+"'s type '"+n.c.Yj().ne()+"' does not permit a value of type '"+e+"'"))}function MSn(n,t,e){var i,r;for(r=new M2(n.b,0);r.b<r.d.gc();)Px(r.b<r.d.gc()),GI(mMn(i=BB(r.d.Xb(r.c=r.b++),70),(hWn(),vlt)))===GI(t)&&(OPn(i.n,vW(n.c.i),e),fW(r),WB(t.b,i))}function SSn(n,t){if(t.a)switch(BB(mMn(t.b,(hWn(),ylt)),98).g){case 0:case 1:lEn(t);case 2:JT(new Rq(null,new w1(t.d,16)),new Li),oAn(n.a,t)}else JT(new Rq(null,new w1(t.d,16)),new Li)}function PSn(n){var t,i;return i=e.Math.sqrt((null==n.k&&(n.k=Wrn(n,new Ec)),Gy(n.k)/(n.b*(null==n.g&&(n.g=Xrn(n,new jc)),Gy(n.g))))),t=dG(fan(e.Math.round(i))),t=e.Math.min(t,n.f)}function CSn(){gcn(),LR.call(this),this.j=(kUn(),PIt),this.a=new Gj,new fm,this.f=(lin(2,AVn),new J6(2)),this.e=(lin(4,AVn),new J6(4)),this.g=(lin(4,AVn),new J6(4)),this.b=new hP(this.e,this.g)}function ISn(n,t){var e;return!qy(TD(mMn(t,(hWn(),Clt))))&&(e=t.c.i,(n!=(Tbn(),_lt)||e.k!=(uSn(),Sut))&&BB(mMn(e,(HXn(),kgt)),163)!=Flt)}function OSn(n,t){var e;return!qy(TD(mMn(t,(hWn(),Clt))))&&(e=t.d.i,(n!=(Tbn(),Blt)||e.k!=(uSn(),Sut))&&BB(mMn(e,(HXn(),kgt)),163)!=Hlt)}function ASn(n,t){var e,i,r,c,a,u,o;for(a=n.d,o=n.o,u=new UV(-a.b,-a.d,a.b+o.a+a.c,a.d+o.b+a.a),r=0,c=(i=t).length;r<c;++r)(e=i[r])&&CPn(u,e.i);a.b=-u.c,a.d=-u.d,a.c=u.b-a.b-o.a,a.a=u.a-a.d-o.b}function $Sn(){$Sn=O,iTt=new MC("CENTER_DISTANCE",0),rTt=new MC("CIRCLE_UNDERLAP",1),uTt=new MC("RECTANGLE_UNDERLAP",2),cTt=new MC("INVERTED_OVERLAP",3),aTt=new MC("MINIMUM_ROOT_DISTANCE",4)}function LSn(n){var t,e,i,r;if(KDn(),null==n)return null;for(i=n.length,t=x8(ONt,WVn,25,2*i,15,1),e=0;e<i;e++)(r=n[e])<0&&(r+=256),t[2*e]=YLt[r>>4],t[2*e+1]=YLt[15&r];return Bdn(t,0,t.length)}function NSn(n){var t;switch(nV(),n.c.length){case 0:return Bnt;case 1:return IH((t=BB(JCn(new Wb(n)),42)).cd(),t.dd());default:return new hy(BB(Qgn(n,x8(Hnt,kVn,42,n.c.length,0,1)),165))}}function xSn(n){var t,e,i,r,c;for(t=new Lp,e=new Lp,d3(t,n),d3(e,n);e.b!=e.c;)for(c=new Wb(BB(dU(e),37).a);c.a<c.c.c.length;)(r=BB(n0(c),10)).e&&(d3(t,i=r.e),d3(e,i));return t}function DSn(n,t){switch(t.g){case 1:return KB(n.j,(gcn(),xut));case 2:return KB(n.j,(gcn(),Lut));case 3:return KB(n.j,(gcn(),Rut));case 4:return KB(n.j,(gcn(),Kut));default:return SQ(),SQ(),set}}function RSn(n,t){var e,i,r;e=sH(t,n.e),i=BB(RX(n.g.f,e),19).a,r=n.a.c.length-1,0!=n.a.c.length&&BB(xq(n.a,r),287).c==i?(++BB(xq(n.a,r),287).a,++BB(xq(n.a,r),287).b):WB(n.a,new Gx(i))}function KSn(n,t,e){var i,r;return 0!=(i=SRn(n,t,e))?i:Lx(t,(hWn(),wlt))&&Lx(e,wlt)?((r=E$(BB(mMn(t,wlt),19).a,BB(mMn(e,wlt),19).a))<0?uKn(n,t,e):r>0&&uKn(n,e,t),r):IOn(n,t,e)}function _Sn(n,t,e){var i,r,c,a;if(0!=t.b){for(i=new YT,a=spn(t,0);a.b!=a.d.c;)Frn(i,xun(c=BB(b3(a),86))),(r=c.e).a=BB(mMn(c,(qqn(),gkt)),19).a,r.b=BB(mMn(c,pkt),19).a;_Sn(n,i,mcn(e,i.b/n.a|0))}}function FSn(n,t){var e,i,r,c,a;if(n.e<=t)return n.g;if(z1(n,n.g,t))return n.g;for(c=n.r,i=n.g,a=n.r,r=(c-i)/2+i;i+1<c;)(e=cHn(n,r,!1)).b<=r&&e.a<=t?(a=r,c=r):i=r,r=(c-i)/2+i;return a}function BSn(n,t,e){OTn(e,"Recursive Graph Layout",hDn(n,t,!0)),vSn(t,Pun(Gk(nMt,1),HWn,527,0,[new $f])),P8(t,(sWn(),mPt))||vSn(t,Pun(Gk(nMt,1),HWn,527,0,[new gu])),lXn(n,t,null,e),HSn(e)}function HSn(n){var t;if(null==n.p)throw Hp(new Fy("The task has not begun yet."));n.b||(n.k&&($T(),t=cbn(fan(Date.now()),VVn),n.q=1e-9*j2(ibn(t,n.o))),n.c<n.r&&qin(n,n.r-n.c),n.b=!0)}function qSn(n){var t,e,i;for(DH(i=new km,new xC(n.j,n.k)),e=new AL((!n.a&&(n.a=new $L(xOt,n,5)),n.a));e.e!=e.i.gc();)DH(i,new xC((t=BB(kpn(e),469)).a,t.b));return DH(i,new xC(n.b,n.c)),i}function GSn(n,t,e,i,r){var c,a,u,o;if(r)for(o=((c=new hz(r.a.length)).b-c.a)*c.c<0?(eS(),MNt):new XL(c);o.Ob();)u=x2(r,BB(o.Pb(),19).a),D_n((a=new hQ(n,t,e,i)).a,a.b,a.c,a.d,u)}function zSn(n,t){var e;if(GI(n)===GI(t))return!0;if(cL(t,21)){e=BB(t,21);try{return n.gc()==e.gc()&&n.Ic(e)}catch(i){if(cL(i=lun(i),173)||cL(i,205))return!1;throw Hp(i)}}return!1}function USn(n,t){var i;WB(n.d,t),i=t.rf(),n.c?(n.e.a=e.Math.max(n.e.a,i.a),n.e.b+=i.b,n.d.c.length>1&&(n.e.b+=n.a)):(n.e.a+=i.a,n.e.b=e.Math.max(n.e.b,i.b),n.d.c.length>1&&(n.e.a+=n.a))}function XSn(n){var t,e,i,r;switch(t=(r=n.i).b,i=r.j,e=r.g,r.a.g){case 0:e.a=(n.g.b.o.a-i.a)/2;break;case 1:e.a=t.d.n.a+t.d.a.a;break;case 2:e.a=t.d.n.a+t.d.a.a-i.a;break;case 3:e.b=t.d.n.b+t.d.a.b}}function WSn(n,t,e,i,r){if(i<t||r<e)throw Hp(new _y("The highx must be bigger then lowx and the highy must be bigger then lowy"));return n.a<t?n.a=t:n.a>i&&(n.a=i),n.b<e?n.b=e:n.b>r&&(n.b=r),n}function VSn(n){if(cL(n,149))return MNn(BB(n,149));if(cL(n,229))return Zbn(BB(n,229));if(cL(n,23))return hSn(BB(n,23));throw Hp(new _y(z6n+LMn(new Jy(Pun(Gk(Ant,1),HWn,1,5,[n])))))}function QSn(n,t,e,i,r){var c,a,u;for(c=!0,a=0;a<i;a++)c&=0==e[a];if(0==r)aHn(e,i,n,0,t),a=t;else{for(u=32-r,c&=e[a]<<u==0,a=0;a<t-1;a++)n[a]=e[a+i]>>>r|e[a+i+1]<<u;n[a]=e[a+i]>>>r,++a}return c}function YSn(n,t,e,i){var r,c;if(t.k==(uSn(),Put))for(c=new oz(ZL(fbn(t).a.Kc(),new h));dAn(c);)if((r=BB(U5(c),17)).c.i.k==Put&&n.c.a[r.c.i.c.p]==i&&n.c.a[t.c.p]==e)return!0;return!1}function JSn(n,t){var e,i,r,c;return t&=63,e=n.h&PQn,t<22?(c=e>>>t,r=n.m>>t|e<<22-t,i=n.l>>t|n.m<<22-t):t<44?(c=0,r=e>>>t-22,i=n.m>>t-22|n.h<<44-t):(c=0,r=0,i=e>>>t-44),M$(i&SQn,r&SQn,c&PQn)}function ZSn(n,t,e,i){var r;this.b=i,this.e=n==(oin(),Amt),r=t[e],this.d=kq($Nt,[sVn,ZYn],[177,25],16,[r.length,r.length],2),this.a=kq(ANt,[sVn,hQn],[48,25],15,[r.length,r.length],2),this.c=new zEn(t,e)}function nPn(n){var t,e,i;for(n.k=new o1((kUn(),Pun(Gk(FIt,1),YZn,61,0,[PIt,sIt,oIt,SIt,CIt])).length,n.j.c.length),i=new Wb(n.j);i.a<i.c.c.length;)t=(e=BB(n0(i),113)).d.j,JIn(n.k,t,e);n.e=iNn(gz(n.k))}function tPn(n,t){var e,i,r;TU(n.d,t),e=new ka,VW(n.c,t,e),e.f=Phn(t.c),e.a=Phn(t.d),e.d=(gxn(),(r=t.c.i.k)==(uSn(),Cut)||r==Tut),e.e=(i=t.d.i.k)==Cut||i==Tut,e.b=t.c.j==(kUn(),CIt),e.c=t.d.j==oIt}function ePn(n){var t,e,i,r,c;for(c=DWn,r=DWn,i=new Wb(kbn(n));i.a<i.c.c.length;)t=(e=BB(n0(i),213)).e.e-e.d.e,e.e==n&&t<r?r=t:t<c&&(c=t);return r==DWn&&(r=-1),c==DWn&&(c=-1),new rI(iln(r),iln(c))}function iPn(n,t){var i,r,c;return c=ZJn,qpn(),r=Zrt,c=e.Math.abs(n.b),(i=e.Math.abs(t.f-n.b))<c&&(c=i,r=nct),(i=e.Math.abs(n.a))<c&&(c=i,r=tct),(i=e.Math.abs(t.g-n.a))<c&&(c=i,r=Jrt),r}function rPn(n,t){var e,i,r;for(e=t.a.o.a,r=new Sb(new s1(vW(t.a).b,t.c,t.f+1));r.b<r.d.gc();)if(Px(r.b<r.d.gc()),(i=BB(r.d.Xb(r.c=r.b++),29)).c.a>=e)return hPn(n,t,i.p),!0;return!1}function cPn(n){var t;return 0!=(64&n.Db)?mSn(n):(t=new lN(Z5n),!n.a||oO(oO((t.a+=' "',t),n.a),'"'),oO(kE(oO(kE(oO(kE(oO(kE((t.a+=" (",t),n.i),","),n.j)," | "),n.g),","),n.f),")"),t.a)}function aPn(n,t,e){var i,r,c,a,u;for(u=axn(n.e.Tg(),t),r=BB(n.g,119),i=0,a=0;a<n.i;++a)if(c=r[a],u.rl(c.ak())){if(i==e)return fDn(n,a),ZM(),BB(t,66).Oj()?c:c.dd();++i}throw Hp(new Ay(e9n+e+o8n+i))}function uPn(n){var t,e,i;if(2==(t=n.c)||7==t||1==t)return wWn(),wWn(),sNt;for(i=OXn(n),e=null;2!=(t=n.c)&&7!=t&&1!=t;)e||(wWn(),wWn(),tqn(e=new r$(1),i),i=e),tqn(e,OXn(n));return i}function oPn(n,t,e){return n<0||n>e?dCn(n,e,"start index"):t<0||t>e?dCn(t,e,"end index"):$Rn("end index (%s) must not be less than start index (%s)",Pun(Gk(Ant,1),HWn,1,5,[iln(t),iln(n)]))}function sPn(n,t){var e,i,r,c;for(i=0,r=n.length;i<r;i++){c=n[i];try{c[1]?c[0].jm()&&(t=TG(t,c)):c[0].jm()}catch(a){if(!cL(a=lun(a),78))throw Hp(a);e=a,Dk(),yY(cL(e,477)?BB(e,477).ae():e)}}return t}function hPn(n,t,i){var r,c;for(i!=t.c+t.b.gc()&&wHn(t.a,ian(t,i-t.c)),c=t.a.c.p,n.a[c]=e.Math.max(n.a[c],t.a.o.a),r=BB(mMn(t.a,(hWn(),Plt)),15).Kc();r.Ob();)hon(BB(r.Pb(),70),tst,(hN(),!0))}function fPn(n,t){var i,r,c;c=qNn(t),hon(t,(hWn(),llt),c),c&&(r=DWn,AY(n.f,c)&&(r=BB(qI(AY(n.f,c)),19).a),qy(TD(mMn(i=BB(xq(t.g,0),17),Clt)))||VW(n,c,iln(e.Math.min(BB(mMn(i,wlt),19).a,r))))}function lPn(n,t,e){var i,r,c,a;for(t.p=-1,a=xwn(t,(ain(),qvt)).Kc();a.Ob();)for(r=new Wb(BB(a.Pb(),11).g);r.a<r.c.c.length;)t!=(c=(i=BB(n0(r),17)).d.i)&&(c.p<0?e.Fc(i):c.p>0&&lPn(n,c,e));t.p=0}function bPn(n){var t;this.c=new YT,this.f=n.e,this.e=n.d,this.i=n.g,this.d=n.c,this.b=n.b,this.k=n.j,this.a=n.a,n.i?this.j=n.i:this.j=new YK(t=BB(Vj(jMt),9),BB(SR(t,t.length),9),0),this.g=n.f}function wPn(n){var t,e,i,r;for(t=xX(oO(new lN("Predicates."),"and"),40),e=!0,r=new Sb(n);r.b<r.d.gc();)Px(r.b<r.d.gc()),i=r.d.Xb(r.c=r.b++),e||(t.a+=","),t.a+=""+i,e=!1;return(t.a+=")",t).a}function dPn(n,t,e){var i,r,c;if(!(e<=t+2))for(r=(e-t)/2|0,i=0;i<r;++i)l1(t+i,n.c.length),c=BB(n.c[t+i],11),c5(n,t+i,(l1(e-i-1,n.c.length),BB(n.c[e-i-1],11))),l1(e-i-1,n.c.length),n.c[e-i-1]=c}function gPn(n,t,e){var i,r,c,a,u,o,s;u=(c=n.d.p).e,o=c.r,n.g=new QK(o),i=(a=n.d.o.c.p)>0?u[a-1]:x8(Out,a1n,10,0,0,1),r=u[a],s=a<u.length-1?u[a+1]:x8(Out,a1n,10,0,0,1),t==e-1?uZ(n.g,r,s):uZ(n.g,i,r)}function pPn(n){var t;this.j=new Np,this.f=new Rv,this.b=new YK(t=BB(Vj(FIt),9),BB(SR(t,t.length),9),0),this.d=x8(ANt,hQn,25,(kUn(),Pun(Gk(FIt,1),YZn,61,0,[PIt,sIt,oIt,SIt,CIt])).length,15,1),this.g=n}function vPn(n,t){var e,i,r;if(0!=t.c.length){for(e=TMn(n,t),r=!1;!e;)E$n(n,t,!0),r=!0,e=TMn(n,t);r&&E$n(n,t,!1),i=Dun(t),n.b&&n.b.lg(i),n.a=$hn(n,(l1(0,t.c.length),BB(t.c[0],33))),vPn(n,i)}}function mPn(n,t){var e,i,r;if(i=itn(n.Tg(),t),(e=t-n.Ah())<0){if(!i)throw Hp(new _y(o6n+t+s6n));if(!i.Ij())throw Hp(new _y(r6n+i.ne()+c6n));(r=n.Yg(i))>=0?n.Bh(r):cIn(n,i)}else qfn(n,e,i)}function yPn(n){var t,e;if(e=null,t=!1,cL(n,204)&&(t=!0,e=BB(n,204).a),t||cL(n,258)&&(t=!0,e=""+BB(n,258).a),t||cL(n,483)&&(t=!0,e=""+BB(n,483).a),!t)throw Hp(new Ly(H6n));return e}function kPn(n,t){var e,i;if(n.f){for(;t.Ob();)if(cL(i=(e=BB(t.Pb(),72)).ak(),99)&&0!=(BB(i,18).Bb&h6n)&&(!n.e||i.Gj()!=NOt||0!=i.aj())&&null!=e.dd())return t.Ub(),!0;return!1}return t.Ob()}function jPn(n,t){var e,i;if(n.f){for(;t.Sb();)if(cL(i=(e=BB(t.Ub(),72)).ak(),99)&&0!=(BB(i,18).Bb&h6n)&&(!n.e||i.Gj()!=NOt||0!=i.aj())&&null!=e.dd())return t.Pb(),!0;return!1}return t.Sb()}function EPn(n,t,e){var i,r,c,a,u,o;for(o=axn(n.e.Tg(),t),i=0,u=n.i,r=BB(n.g,119),a=0;a<n.i;++a)if(c=r[a],o.rl(c.ak())){if(e==i)return a;++i,u=a+1}if(e==i)return u;throw Hp(new Ay(e9n+e+o8n+i))}function TPn(n,t){var i,r,c;if(0==n.f.c.length)return null;for(c=new bA,i=new Wb(n.f);i.a<i.c.c.length;)r=BB(n0(i),70).o,c.b=e.Math.max(c.b,r.a),c.a+=r.b;return c.a+=(n.f.c.length-1)*t,c}function MPn(n,t,e){var i,r,c;for(r=new oz(ZL(hbn(e).a.Kc(),new h));dAn(r);)b5(i=BB(U5(r),17))||!b5(i)&&i.c.i.c==i.d.i.c||(c=zLn(n,i,e,new um)).c.length>1&&(t.c[t.c.length]=c)}function SPn(n){var t,e,i;for(Frn(e=new YT,n.o),i=new om;0!=e.b;)WUn(n,t=BB(0==e.b?null:(Px(0!=e.b),Atn(e,e.a.a)),508),!0)&&WB(i.a,t);for(;0!=i.a.c.length;)WUn(n,t=BB(thn(i),508),!1)}function PPn(){PPn=O,kMt=new $C(hJn,0),wMt=new $C("BOOLEAN",1),vMt=new $C("INT",2),yMt=new $C("STRING",3),dMt=new $C("DOUBLE",4),gMt=new $C("ENUM",5),pMt=new $C("ENUMSET",6),mMt=new $C("OBJECT",7)}function CPn(n,t){var i,r,c,a,u;r=e.Math.min(n.c,t.c),a=e.Math.min(n.d,t.d),(c=e.Math.max(n.c+n.b,t.c+t.b))<r&&(i=r,r=c,c=i),(u=e.Math.max(n.d+n.a,t.d+t.a))<a&&(i=a,a=u,u=i),xH(n,r,a,c-r,u-a)}function IPn(){IPn=O,J$t=Pun(Gk(Qtt,1),sVn,2,6,[w7n,d7n,g7n,p7n,v7n,m7n,n8n]),Y$t=Pun(Gk(Qtt,1),sVn,2,6,[w7n,"empty",d7n,K9n,"elementOnly"]),nLt=Pun(Gk(Qtt,1),sVn,2,6,[w7n,"preserve","replace",y7n]),Z$t=new SH}function OPn(n,t,e){var i,r,c;if(t!=e){i=t;do{UR(n,i.c),(r=i.e)&&(_x(n,(c=i.d).b,c.d),UR(n,r.n),i=vW(r))}while(r);i=e;do{XR(n,i.c),(r=i.e)&&(Bx(n,(c=i.d).b,c.d),XR(n,r.n),i=vW(r))}while(r)}}function APn(n,t,e,i){var r,c,a,u,o;if(i.f.c+i.g.c==0)for(u=0,o=(a=n.a[n.c]).length;u<o;++u)VW(i,c=a[u],new kcn(n,c,e));return(r=BB(qI(AY(i.f,t)),663)).b=0,r.c=r.f,0==r.c||Tb(BB(xq(r.a,r.b),287)),r}function $Pn(){$Pn=O,Zst=new jP("MEDIAN_LAYER",0),tht=new jP("TAIL_LAYER",1),Jst=new jP("HEAD_LAYER",2),nht=new jP("SPACE_EFFICIENT_LAYER",3),eht=new jP("WIDEST_LAYER",4),Yst=new jP("CENTER_LAYER",5)}function LPn(n){switch(n.g){case 0:case 1:case 2:return kUn(),sIt;case 3:case 4:case 5:return kUn(),SIt;case 6:case 7:case 8:return kUn(),CIt;case 9:case 10:case 11:return kUn(),oIt;default:return kUn(),PIt}}function NPn(n,t){var e;return 0!=n.c.length&&(e=tdn((l1(0,n.c.length),BB(n.c[0],17)).c.i),BZ(),e==(bvn(),fvt)||e==hvt||o5($V(new Rq(null,new w1(n,16)),new Fc),new ig(t)))}function xPn(n,t,e){var i,r,c;if(!n.b[t.g]){for(n.b[t.g]=!0,!(i=e)&&(i=new P6),DH(i.b,t),c=n.a[t.g].Kc();c.Ob();)(r=BB(c.Pb(),188)).b!=t&&xPn(n,r.b,i),r.c!=t&&xPn(n,r.c,i),DH(i.a,r);return i}return null}function DPn(){DPn=O,Qyt=new lC("ROOT_PROC",0),Uyt=new lC("FAN_PROC",1),Wyt=new lC("NEIGHBORS_PROC",2),Xyt=new lC("LEVEL_HEIGHT",3),Vyt=new lC("NODE_POSITION_PROC",4),zyt=new lC("DETREEIFYING_PROC",5)}function RPn(n,t){if(cL(t,239))return zA(n,BB(t,33));if(cL(t,186))return UA(n,BB(t,118));if(cL(t,439))return GA(n,BB(t,202));throw Hp(new _y(z6n+LMn(new Jy(Pun(Gk(Ant,1),HWn,1,5,[t])))))}function KPn(n,t,e){var i,r;if(this.f=n,w6(e,r=(i=BB(RX(n.b,t),283))?i.a:0),e>=(r/2|0))for(this.e=i?i.c:null,this.d=r;e++<r;)TZ(this);else for(this.c=i?i.b:null;e-- >0;)EZ(this);this.b=t,this.a=null}function _Pn(n,t){var e,i;t.a?zNn(n,t):(!!(e=BB(kK(n.b,t.b),57))&&e==n.a[t.b.f]&&!!e.a&&e.a!=t.b.a&&e.c.Fc(t.b),!!(i=BB(yK(n.b,t.b),57))&&n.a[i.f]==t.b&&!!i.a&&i.a!=t.b.a&&t.b.c.Fc(i),MN(n.b,t.b))}function FPn(n,t){var e,i;if(e=BB(oV(n.b,t),124),BB(BB(h6(n.r,t),21),84).dc())return e.n.b=0,void(e.n.c=0);e.n.b=n.C.b,e.n.c=n.C.c,n.A.Hc((mdn(),_It))&&yRn(n,t),i=Xpn(n,t),PDn(n,t)==(cpn(),BCt)&&(i+=2*n.w),e.a.a=i}function BPn(n,t){var e,i;if(e=BB(oV(n.b,t),124),BB(BB(h6(n.r,t),21),84).dc())return e.n.d=0,void(e.n.a=0);e.n.d=n.C.d,e.n.a=n.C.a,n.A.Hc((mdn(),_It))&&kRn(n,t),i=Wpn(n,t),PDn(n,t)==(cpn(),BCt)&&(i+=2*n.w),e.a.b=i}function HPn(n,t){var e,i,r,c;for(c=new Np,i=new Wb(t);i.a<i.c.c.length;)WB(c,new RS(e=BB(n0(i),65),!0)),WB(c,new RS(e,!1));my((r=new hY(n)).a.a),e2(c,n.b,new Jy(Pun(Gk(oit,1),HWn,679,0,[r])))}function qPn(n,t,e,i){var r,c,a,u,o,s,h,f,l,b,w;return u=n.a,f=n.b,o=t.a,l=t.b,s=e.a,b=e.b,new xC(((c=u*l-f*o)*(s-(h=i.a))-(a=s*(w=i.b)-b*h)*(u-o))/(r=(u-o)*(b-w)-(f-l)*(s-h)),(c*(b-w)-a*(f-l))/r)}function GPn(n,t){var e,i,r;if(!n.d[t.p]){for(n.d[t.p]=!0,n.a[t.p]=!0,i=new oz(ZL(lbn(t).a.Kc(),new h));dAn(i);)b5(e=BB(U5(i),17))||(r=e.d.i,n.a[r.p]?WB(n.b,e):GPn(n,r));n.a[t.p]=!1}}function zPn(n,t,e){var i;switch(i=0,BB(mMn(t,(HXn(),kgt)),163).g){case 2:i=2*-e+n.a,++n.a;break;case 1:i=-e;break;case 3:i=e;break;case 4:i=2*e+n.b,++n.b}return Lx(t,(hWn(),wlt))&&(i+=BB(mMn(t,wlt),19).a),i}function UPn(n,t,e){var i,r,c;for(e.zc(t,n),WB(n.n,t),c=n.p.eg(t),t.j==n.p.fg()?Obn(n.e,c):Obn(n.j,c),rX(n),r=NU(Wen(Pun(Gk(xnt,1),HWn,20,0,[new Hw(t),new Gw(t)])));dAn(r);)i=BB(U5(r),11),e._b(i)||UPn(n,i,e)}function XPn(n){var t,e;return BB(ZAn(n,(sWn(),KSt)),21).Hc((mdn(),DIt))?(e=BB(ZAn(n,qSt),21),t=new wA(BB(ZAn(n,BSt),8)),e.Hc((n_n(),GIt))&&(t.a<=0&&(t.a=20),t.b<=0&&(t.b=20)),t):new Gj}function WPn(n){var t,e,i;if(!n.b){for(i=new Co,e=new ax(RBn(n));e.e!=e.i.gc();)0!=((t=BB(jpn(e),18)).Bb&h6n)&&f9(i,t);chn(i),n.b=new NO((BB(Wtn(QQ((QX(),t$t).o),8),18),i.i),i.g),P5(n).b&=-9}return n.b}function VPn(n,t){var e,i,r,c,a,u;a=BB(Emn(gz(t.k),x8(FIt,YZn,61,2,0,1)),122),Zmn(n,u=t.g,e=o3(t,a[0]),i=u3(t,a[1]))<=Zmn(n,u,r=o3(t,a[1]),c=u3(t,a[0]))?(t.a=e,t.c=i):(t.a=r,t.c=c)}function QPn(n,t,e){var i,r,c;for(OTn(e,"Processor set neighbors",1),n.a=0==t.b.b?1:t.b.b,r=null,i=spn(t.b,0);!r&&i.b!=i.d.c;)qy(TD(mMn(c=BB(b3(i),86),(qqn(),dkt))))&&(r=c);r&&LDn(n,new bg(r),e),HSn(e)}function YPn(n){var t,e,i,r;return RHn(),t=-1==(i=GO(n,YTn(35)))?n:n.substr(0,i),e=-1==i?null:n.substr(i+1),(r=V3(EAt,t))?null!=e&&(r=Csn(r,(kW(e),e))):(r=WXn(t),a5(EAt,t,r),null!=e&&(r=Csn(r,e))),r}function JPn(n){var t,e,i,r,c,a,u;if(SQ(),cL(n,54))for(c=0,r=n.gc()-1;c<r;++c,--r)t=n.Xb(c),n._c(c,n.Xb(r)),n._c(r,t);else for(e=n.Yc(),a=n.Zc(n.gc());e.Tb()<a.Vb();)i=e.Pb(),u=a.Ub(),e.Wb(u),a.Wb(i)}function ZPn(n,t){var e,i,r;OTn(t,"End label pre-processing",1),e=Gy(MD(mMn(n,(HXn(),jpt)))),i=Gy(MD(mMn(n,Spt))),r=gA(BB(mMn(n,Udt),103)),JT(wnn(new Rq(null,new w1(n.b,16)),new he),new D_(e,i,r)),HSn(t)}function nCn(n,t){var e,i,r,c,a,u;for(u=0,d3(c=new Lp,t);c.b!=c.c;)for(u+=syn((a=BB(dU(c),214)).d,a.e),r=new Wb(a.b);r.a<r.c.c.length;)i=BB(n0(r),37),(e=BB(xq(n.b,i.p),214)).s||(u+=nCn(n,e));return u}function tCn(n,t,i){var r,c;_an(this),t==(dJ(),Lyt)?TU(this.r,n.c):TU(this.w,n.c),TU(i==Lyt?this.r:this.w,n.d),tPn(this,n),XMn(this,r=Phn(n.c),c=Phn(n.d),c),this.o=(gxn(),e.Math.abs(r-c)<.2)}function eCn(n,t,e){var i,r,c,a,u;if(null!=(a=BB(yan(n.a,8),1936)))for(r=0,c=a.length;r<c;++r)null.jm();i=e,0==(1&n.a.Db)&&(u=new uW(n,e,t),i.ui(u)),cL(i,672)?BB(i,672).wi(n.a):i.ti()==n.a&&i.vi(null)}function iCn(){var n;return ZLt?BB($$n((WM(),zAt),S7n),1945):(sUn(),n=BB(cL(SJ((WM(),zAt),S7n),586)?SJ(zAt,S7n):new zW,586),ZLt=!0,gXn(n),pWn(n),VW((VM(),ZAt),n,new Ks),Tyn(n),mZ(zAt,S7n,n),n)}function rCn(n,t,e,i){var r;return(r=zTn(n,e,Pun(Gk(Qtt,1),sVn,2,6,[bQn,wQn,dQn,gQn,pQn,vQn,mQn]),t))<0&&(r=zTn(n,e,Pun(Gk(Qtt,1),sVn,2,6,["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]),t)),!(r<0||(i.d=r,0))}function cCn(n,t,e,i){var r;return(r=zTn(n,e,Pun(Gk(Qtt,1),sVn,2,6,[bQn,wQn,dQn,gQn,pQn,vQn,mQn]),t))<0&&(r=zTn(n,e,Pun(Gk(Qtt,1),sVn,2,6,["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]),t)),!(r<0||(i.d=r,0))}function aCn(n){var t,e,i;for(_$n(n),i=new Np,e=new Wb(n.a.a.b);e.a<e.c.c.length;)WB(i,new fP(t=BB(n0(e),81),!0)),WB(i,new fP(t,!1));nmn(n.c),i2(i,n.b,new Jy(Pun(Gk(Jat,1),HWn,369,0,[n.c]))),vAn(n)}function uCn(n){var t,e,i,r;for(e=new xp,r=new Wb(n.d);r.a<r.c.c.length;)i=BB(n0(r),181),t=BB(i.We((hWn(),Uft)),17),AY(e.f,t)||VW(e,t,new TQ(t)),WB(BB(qI(AY(e.f,t)),456).b,i);return new t_(new Ob(e))}function oCn(n,t){var e,i,r,c,a;for(i=new d1(n.j.c.length),e=null,c=new Wb(n.j);c.a<c.c.c.length;)(r=BB(n0(c),11)).j!=e&&(i.b==i.c||F$n(i,e,t),o4(i),e=r.j),(a=mAn(r))&&w3(i,a);i.b==i.c||F$n(i,e,t)}function sCn(n,t){var e,i;for(i=new M2(n.b,0);i.b<i.d.gc();)Px(i.b<i.d.gc()),e=BB(i.d.Xb(i.c=i.b++),70),BB(mMn(e,(HXn(),Ydt)),272)==(Rtn(),UPt)&&(fW(i),WB(t.b,e),Lx(e,(hWn(),Uft))||hon(e,Uft,n))}function hCn(n){var t,i,r;for(t=F3(new oz(ZL(lbn(n).a.Kc(),new h))),i=new oz(ZL(fbn(n).a.Kc(),new h));dAn(i);)r=F3(new oz(ZL(lbn(BB(U5(i),17).c.i).a.Kc(),new h))),t=e.Math.max(t,r);return iln(t)}function fCn(n,t,e){var i,r,c,a;for(OTn(e,"Processor arrange node",1),r=null,c=new YT,i=spn(t.b,0);!r&&i.b!=i.d.c;)qy(TD(mMn(a=BB(b3(i),86),(qqn(),dkt))))&&(r=a);r5(c,r,c.c.b,c.c),Yzn(n,c,mcn(e,1)),HSn(e)}function lCn(n,t,e){var i,r,c;i=BB(ZAn(n,(sWn(),hSt)),21),r=0,c=0,t.a>e.a&&(i.Hc((wEn(),WMt))?r=(t.a-e.a)/2:i.Hc(QMt)&&(r=t.a-e.a)),t.b>e.b&&(i.Hc((wEn(),JMt))?c=(t.b-e.b)/2:i.Hc(YMt)&&(c=t.b-e.b)),lMn(n,r,c)}function bCn(n,t,e,i,r,c,a,u,o,s,h,f,l){cL(n.Cb,88)&&ACn(P5(BB(n.Cb,88)),4),Nrn(n,e),n.f=a,$ln(n,u),Nln(n,o),Aln(n,s),Lln(n,h),nln(n,f),qln(n,l),Yfn(n,!0),Len(n,r),n.ok(c),Ihn(n,t),null!=i&&(n.i=null,arn(n,i))}function wCn(n){var t,e;if(n.f){for(;n.n>0;){if(cL(e=(t=BB(n.k.Xb(n.n-1),72)).ak(),99)&&0!=(BB(e,18).Bb&h6n)&&(!n.e||e.Gj()!=NOt||0!=e.aj())&&null!=t.dd())return!0;--n.n}return!1}return n.n>0}function dCn(n,t,e){if(n<0)return $Rn(BWn,Pun(Gk(Ant,1),HWn,1,5,[e,iln(n)]));if(t<0)throw Hp(new _y(qWn+t));return $Rn("%s (%s) must not be greater than size (%s)",Pun(Gk(Ant,1),HWn,1,5,[e,iln(n),iln(t)]))}function gCn(n,t,e,i,r,c){var a,u,o;if(i-e<7)$bn(t,e,i,c);else if(gCn(t,n,u=e+r,o=u+((a=i+r)-u>>1),-r,c),gCn(t,n,o,a,-r,c),c.ue(n[o-1],n[o])<=0)for(;e<i;)$X(t,e++,n[u++]);else Gfn(n,u,o,a,t,e,i,c)}function pCn(n,t){var e,i,r;for(r=new Np,i=new Wb(n.c.a.b);i.a<i.c.c.length;)e=BB(n0(i),57),t.Lb(e)&&(WB(r,new OS(e,!0)),WB(r,new OS(e,!1)));Zvn(n.e),e2(r,n.d,new Jy(Pun(Gk(oit,1),HWn,679,0,[n.e])))}function vCn(n,t){var e,i,r,c,a,u,o;for(o=t.d,r=t.b.j,u=new Wb(o);u.a<u.c.c.length;)for(a=BB(n0(u),101),c=x8($Nt,ZYn,25,r.c.length,16,1),VW(n.b,a,c),e=a.a.d.p-1,i=a.c.d.p;e!=i;)c[e=(e+1)%r.c.length]=!0}function mCn(n,t){for(n.r=new Fan(n.p),Jl(n.r,n),Frn(n.r.j,n.j),yQ(n.j),DH(n.j,t),DH(n.r.e,t),rX(n),rX(n.r);0!=n.f.c.length;)G$(BB(xq(n.f,0),129));for(;0!=n.k.c.length;)G$(BB(xq(n.k,0),129));return n.r}function yCn(n,t,e){var i,r,c;if(r=itn(n.Tg(),t),(i=t-n.Ah())<0){if(!r)throw Hp(new _y(o6n+t+s6n));if(!r.Ij())throw Hp(new _y(r6n+r.ne()+c6n));(c=n.Yg(r))>=0?n.sh(c,e):TLn(n,r,e)}else Lbn(n,i,r,e)}function kCn(n){var t,e,i,r;if(e=BB(n,49).qh())try{if(i=null,(t=$$n((WM(),zAt),M_n(_bn(e))))&&(r=t.rh())&&(i=r.Wk(Xy(e.e))),i&&i!=n)return kCn(i)}catch(c){if(!cL(c=lun(c),60))throw Hp(c)}return n}function jCn(n,t,e){var i,r,c,a;if(a=null==t?0:n.b.se(t),0==(r=null==(i=n.a.get(a))?new Array:i).length)n.a.set(a,r);else if(c=hhn(n,t,r))return c.ed(e);return $X(r,r.length,new PS(t,e)),++n.c,oY(n.b),null}function ECn(n,t){var e;return h2(n.a),CU(n.a,(Prn(),Qkt),Qkt),CU(n.a,Ykt,Ykt),dq(e=new B2,Ykt,(Cbn(),ejt)),GI(ZAn(t,(Uyn(),Sjt)))!==GI((Hsn(),sjt))&&dq(e,Ykt,njt),dq(e,Ykt,tjt),aA(n.a,e),$qn(n.a,t)}function TCn(n){if(!n)return lk(),htt;var t=n.valueOf?n.valueOf():n;if(t!==n){var i=ftt[typeof t];return i?i(t):khn(typeof t)}return n instanceof Array||n instanceof e.Array?new Tl(n):new Pl(n)}function MCn(n,t,i){var r,c,a;switch(a=n.o,(c=(r=BB(oV(n.p,i),244)).i).b=SIn(r),c.a=MIn(r),c.b=e.Math.max(c.b,a.a),c.b>a.a&&!t&&(c.b=a.a),c.c=-(c.b-a.a)/2,i.g){case 1:c.d=-c.a;break;case 3:c.d=a.b}_Fn(r),GFn(r)}function SCn(n,t,i){var r,c,a;switch(a=n.o,(c=(r=BB(oV(n.p,i),244)).i).b=SIn(r),c.a=MIn(r),c.a=e.Math.max(c.a,a.b),c.a>a.b&&!t&&(c.a=a.b),c.d=-(c.a-a.b)/2,i.g){case 4:c.c=-c.b;break;case 2:c.c=a.a}_Fn(r),GFn(r)}function PCn(n,t){var e,i,r,c,a;if(!t.dc())if(r=BB(t.Xb(0),128),1!=t.gc())for(e=1;e<t.gc();)!r.j&&r.o||(c=vyn(t,e))&&(i=BB(c.a,19).a,kxn(n,r,a=BB(c.b,128),e,i,t),e=i+1,r=a);else kxn(n,r,r,1,0,t)}function CCn(n){var t,e,i,r;for(m$(r=new t_(n.d),new zr),kDn(),t=Pun(Gk(iht,1),$Vn,270,0,[Bst,Gst,Fst,Xst,qst,Hst,Ust,zst]),e=0,i=new Wb(r);i.a<i.c.c.length;)COn(BB(n0(i),101),t[e%t.length]),++e}function ICn(n,t){var e,i,r,c;if(jDn(),t.b<2)return!1;for(i=e=BB(b3(c=spn(t,0)),8);c.b!=c.d.c;){if(r=BB(b3(c),8),!Dcn(n,i)||!Dcn(n,r))return!1;i=r}return!(!Dcn(n,i)||!Dcn(n,e))}function OCn(n,t){var e,i,r,c,a;return e=Ren(a=n,"x"),nnn(new qg(t).a,e),i=Ren(a,"y"),tnn(new Gg(t).a,i),r=Ren(a,C6n),enn(new zg(t).a,r),c=Ren(a,P6n),inn(new Ug(t).a,c),c}function ACn(n,t){dRn(n,t),0!=(1&n.b)&&(n.a.a=null),0!=(2&n.b)&&(n.a.f=null),0!=(4&n.b)&&(n.a.g=null,n.a.i=null),0!=(16&n.b)&&(n.a.d=null,n.a.e=null),0!=(8&n.b)&&(n.a.b=null),0!=(32&n.b)&&(n.a.j=null,n.a.c=null)}function $Cn(n,t){var e,i;if(i=0,t.length>0)try{i=l_n(t,_Vn,DWn)}catch(r){throw cL(r=lun(r),127)?Hp(new L7(r)):Hp(r)}return!n.a&&(n.a=new Sp(n)),i<(e=n.a).i&&i>=0?BB(Wtn(e,i),56):null}function LCn(n,t){if(n<0)return $Rn(BWn,Pun(Gk(Ant,1),HWn,1,5,["index",iln(n)]));if(t<0)throw Hp(new _y(qWn+t));return $Rn("%s (%s) must be less than size (%s)",Pun(Gk(Ant,1),HWn,1,5,["index",iln(n),iln(t)]))}function NCn(n){var t,e,i,r,c;if(null==n)return zWn;for(c=new $an(FWn,"[","]"),i=0,r=(e=n).length;i<r;++i)t=e[i],c.a?oO(c.a,c.b):c.a=new lN(c.d),aO(c.a,""+t);return c.a?0==c.e.length?c.a.a:c.a.a+""+c.e:c.c}function xCn(n){var t,e,i,r,c;if(null==n)return zWn;for(c=new $an(FWn,"[","]"),i=0,r=(e=n).length;i<r;++i)t=e[i],c.a?oO(c.a,c.b):c.a=new lN(c.d),aO(c.a,""+t);return c.a?0==c.e.length?c.a.a:c.a.a+""+c.e:c.c}function DCn(n){var t,e,i,r,c;if(null==n)return zWn;for(c=new $an(FWn,"[","]"),i=0,r=(e=n).length;i<r;++i)t=e[i],c.a?oO(c.a,c.b):c.a=new lN(c.d),aO(c.a,""+t);return c.a?0==c.e.length?c.a.a:c.a.a+""+c.e:c.c}function RCn(n){var t,e,i,r,c;if(null==n)return zWn;for(c=new $an(FWn,"[","]"),i=0,r=(e=n).length;i<r;++i)t=e[i],c.a?oO(c.a,c.b):c.a=new lN(c.d),aO(c.a,""+t);return c.a?0==c.e.length?c.a.a:c.a.a+""+c.e:c.c}function KCn(n,t){var e,i,r,c,a,u;for(e=n.b.c.length,r=xq(n.b,t);2*t+1<e&&(u=c=2*t+1,(a=c+1)<e&&n.a.ue(xq(n.b,a),xq(n.b,c))<0&&(u=a),i=u,!(n.a.ue(r,xq(n.b,i))<0));)c5(n.b,t,xq(n.b,i)),t=i;c5(n.b,t,r)}function _Cn(n,t,i,r,c,a){var u,o,s,h,f;for(GI(n)===GI(i)&&(n=n.slice(t,t+c),t=0),s=i,o=t,h=t+c;o<h;)c=(u=e.Math.min(o+1e4,h))-o,(f=n.slice(o,u)).splice(0,0,r,a?c:0),Array.prototype.splice.apply(s,f),o=u,r+=c}function FCn(n,t,e){var i,r;return i=e.d,r=e.e,n.g[i.d]<=n.i[t.d]&&n.i[t.d]<=n.i[i.d]&&n.g[r.d]<=n.i[t.d]&&n.i[t.d]<=n.i[r.d]?!(n.i[i.d]<n.i[r.d]):n.i[i.d]<n.i[r.d]}function BCn(n){var t,e,i,r,c,a,u;if((i=n.a.c.length)>0)for(a=n.c.d,r=kL(XR(new xC((u=n.d.d).a,u.b),a),1/(i+1)),c=new xC(a.a,a.b),e=new Wb(n.a);e.a<e.c.c.length;)(t=BB(n0(e),559)).d.a=c.a,t.d.b=c.b,UR(c,r)}function HCn(n,t,i){var r,c,a,u,o,s;for(s=RQn,a=new Wb(GLn(n.b));a.a<a.c.c.length;)for(c=BB(n0(a),168),o=new Wb(GLn(t.b));o.a<o.c.c.length;)u=BB(n0(o),168),r=Cun(c.a,c.b,u.a,u.b,i),s=e.Math.min(s,r);return s}function qCn(n,t){if(!t)throw Hp(new gv);if(n.j=t,!n.d)switch(n.j.g){case 1:n.a.a=n.o.a/2,n.a.b=0;break;case 2:n.a.a=n.o.a,n.a.b=n.o.b/2;break;case 3:n.a.a=n.o.a/2,n.a.b=n.o.b;break;case 4:n.a.a=0,n.a.b=n.o.b/2}}function GCn(n,t){var i,r;return cL(t.g,10)&&BB(t.g,10).k==(uSn(),Mut)?RQn:f3(t)?e.Math.max(0,n.b/2-.5):(i=f2(t))?(r=Gy(MD(edn(i,(HXn(),Opt)))),e.Math.max(0,r/2-.5)):RQn}function zCn(n,t){var i,r;return cL(t.g,10)&&BB(t.g,10).k==(uSn(),Mut)?RQn:f3(t)?e.Math.max(0,n.b/2-.5):(i=f2(t))?(r=Gy(MD(edn(i,(HXn(),Opt)))),e.Math.max(0,r/2-.5)):RQn}function UCn(n){var t,e,i,r;for(r=Lfn(n.d,n.e).Kc();r.Ob();)for(i=BB(r.Pb(),11),e=new Wb(n.e==(kUn(),CIt)?i.e:i.g);e.a<e.c.c.length;)b5(t=BB(n0(e),17))||t.c.i.c==t.d.i.c||(RSn(n,t),++n.f,++n.c)}function XCn(n,t){var e,i;if(t.dc())return SQ(),SQ(),set;for(WB(i=new Np,iln(_Vn)),e=1;e<n.f;++e)null==n.a&&wRn(n),n.a[e]&&WB(i,iln(e));return 1==i.c.length?(SQ(),SQ(),set):(WB(i,iln(DWn)),dBn(t,i))}function WCn(n,t){var e,i,r,c,a,u;e=ckn(t,u=t.c.i.k!=(uSn(),Cut)?t.d:t.c).i,r=BB(RX(n.k,u),121),i=n.i[e.p].a,AK(u.i)<(e.c?E7(e.c.a,e,0):-1)?(c=r,a=i):(c=i,a=r),UNn(aM(cM(uM(rM(new Hv,0),4),c),a))}function VCn(n,t,e){var i,r,c;if(e)for(r=((i=new hz(e.a.length)).b-i.a)*i.c<0?(eS(),MNt):new XL(i);r.Ob();)(c=Amn(n,kIn(dnn(e,BB(r.Pb(),19).a))))&&(!t.b&&(t.b=new hK(KOt,t,4,7)),f9(t.b,c))}function QCn(n,t,e){var i,r,c;if(e)for(r=((i=new hz(e.a.length)).b-i.a)*i.c<0?(eS(),MNt):new XL(i);r.Ob();)(c=Amn(n,kIn(dnn(e,BB(r.Pb(),19).a))))&&(!t.c&&(t.c=new hK(KOt,t,5,8)),f9(t.c,c))}function YCn(n,t,e){var i,r;i=t.a&n.f,t.b=n.b[i],n.b[i]=t,r=t.f&n.f,t.d=n.c[r],n.c[r]=t,e?(t.e=e.e,t.e?t.e.c=t:n.a=t,t.c=e.c,t.c?t.c.e=t:n.e=t):(t.e=n.e,t.c=null,n.e?n.e.c=t:n.a=t,n.e=t),++n.i,++n.g}function JCn(n){var t,e,i;if(t=n.Pb(),!n.Ob())return t;for(i=uO(oO(new Ck,"expected one element but was: <"),t),e=0;e<4&&n.Ob();e++)uO((i.a+=FWn,i),n.Pb());throw n.Ob()&&(i.a+=", ..."),i.a+=">",Hp(new _y(i.a))}function ZCn(n,t){var e;t.d?t.d.b=t.b:n.a=t.b,t.b?t.b.d=t.d:n.e=t.d,t.e||t.c?(--(e=BB(RX(n.b,t.a),283)).a,t.e?t.e.c=t.c:e.b=t.c,t.c?t.c.e=t.e:e.c=t.e):((e=BB(v6(n.b,t.a),283)).a=0,++n.c),--n.d}function nIn(n){var t,e;return e=-n.a,t=Pun(Gk(ONt,1),WVn,25,15,[43,48,48,48,48]),e<0&&(t[0]=45,e=-e),t[1]=t[1]+((e/60|0)/10|0)&QVn,t[2]=t[2]+(e/60|0)%10&QVn,t[3]=t[3]+(e%60/10|0)&QVn,t[4]=t[4]+e%10&QVn,Bdn(t,0,t.length)}function tIn(n,t,e){var i,r;for(i=t.d,r=e.d;i.a-r.a==0&&i.b-r.b==0;)i.a+=H$n(n,26)*rYn+H$n(n,27)*cYn-.5,i.b+=H$n(n,26)*rYn+H$n(n,27)*cYn-.5,r.a+=H$n(n,26)*rYn+H$n(n,27)*cYn-.5,r.b+=H$n(n,26)*rYn+H$n(n,27)*cYn-.5}function eIn(n){var t,e,i,r;for(n.g=new Hbn(BB(yX(FIt),290)),i=0,kUn(),e=sIt,t=0;t<n.j.c.length;t++)(r=BB(xq(n.j,t),11)).j!=e&&(i!=t&&mG(n.g,e,new rI(iln(i),iln(t))),e=r.j,i=t);mG(n.g,e,new rI(iln(i),iln(t)))}function iIn(n){var t,e,i,r,c;for(e=0,t=new Wb(n.b);t.a<t.c.c.length;)for(r=new Wb(BB(n0(t),29).a);r.a<r.c.c.length;)for((i=BB(n0(r),10)).p=e++,c=new Wb(i.j);c.a<c.c.c.length;)BB(n0(c),11).p=e++}function rIn(n,t,e,i,r){var c,a,u,o;if(t)for(a=t.Kc();a.Ob();)for(o=cRn(BB(a.Pb(),10),(ain(),qvt),e).Kc();o.Ob();)u=BB(o.Pb(),11),(c=BB(qI(AY(r.f,u)),112))||(c=new Fan(n.d),i.c[i.c.length]=c,UPn(c,u,r))}function cIn(n,t){var e,i,r;if(!(r=Fqn((IPn(),Z$t),n.Tg(),t)))throw Hp(new _y(r6n+t.ne()+c6n));ZM(),BB(r,66).Oj()||(r=Z1(B7(Z$t,r))),i=BB((e=n.Yg(r))>=0?n._g(e,!0,!0):cOn(n,r,!0),153),BB(i,215).ol(t)}function aIn(n){var t,i;return n>-0x800000000000&&n<0x800000000000?0==n?0:((t=n<0)&&(n=-n),i=CJ(e.Math.floor(e.Math.log(n)/.6931471805599453)),(!t||n!=e.Math.pow(2,i))&&++i,i):Van(fan(n))}function uIn(n){var t,e,i,r,c,a,u;for(c=new fA,e=new Wb(n);e.a<e.c.c.length;)a=(t=BB(n0(e),129)).a,u=t.b,c.a._b(a)||c.a._b(u)||(r=a,i=u,a.e.b+a.j.b>2&&u.e.b+u.j.b<=2&&(r=u,i=a),c.a.zc(r,c),r.q=i);return c}function oIn(n,t){var e,i,r;return qan(i=new $vn(n),t),hon(i,(hWn(),Vft),t),hon(i,(HXn(),ept),(QEn(),XCt)),hon(i,kdt,(wvn(),OMt)),Bl(i,(uSn(),Mut)),CZ(e=new CSn,i),qCn(e,(kUn(),CIt)),CZ(r=new CSn,i),qCn(r,oIt),i}function sIn(n){switch(n.g){case 0:return new Ny((oin(),Omt));case 1:return new df;case 2:return new jf;default:throw Hp(new _y("No implementation is available for the crossing minimizer "+(null!=n.f?n.f:""+n.g)))}}function hIn(n,t){var e,i,r,c;for(n.c[t.p]=!0,WB(n.a,t),c=new Wb(t.j);c.a<c.c.c.length;)for(e=new m6((r=BB(n0(c),11)).b);y$(e.a)||y$(e.b);)i=ngn(r,BB(y$(e.a)?n0(e.a):n0(e.b),17)).i,n.c[i.p]||hIn(n,i)}function fIn(n){var t,i,r,c,a,u,o;for(u=0,i=new AL((!n.a&&(n.a=new eU(UOt,n,10,11)),n.a));i.e!=i.i.gc();)o=(t=BB(kpn(i),33)).g,c=t.f,r=e.Math.sqrt(o*o+c*c),u=e.Math.max(r,u),a=fIn(t),u=e.Math.max(a,u);return u}function lIn(){lIn=O,rIt=new XC("OUTSIDE",0),eIt=new XC("INSIDE",1),iIt=new XC("NEXT_TO_PORT_IF_POSSIBLE",2),tIt=new XC("ALWAYS_SAME_SIDE",3),nIt=new XC("ALWAYS_OTHER_SAME_SIDE",4),cIt=new XC("SPACE_EFFICIENT",5)}function bIn(n,t,e){var i,r,c,a;return $in(i=K2(n,(tE(),r=new jm,!!e&&nNn(r,e),r),t),R2(t,q6n)),STn(t,i),o$n(t,i),OCn(t,i),c=N2(t,"ports"),PLn((a=new pI(n,i)).a,a.b,c),xon(n,t,i),aun(n,t,i),i}function wIn(n){var t,e;return e=-n.a,t=Pun(Gk(ONt,1),WVn,25,15,[43,48,48,58,48,48]),e<0&&(t[0]=45,e=-e),t[1]=t[1]+((e/60|0)/10|0)&QVn,t[2]=t[2]+(e/60|0)%10&QVn,t[4]=t[4]+(e%60/10|0)&QVn,t[5]=t[5]+e%10&QVn,Bdn(t,0,t.length)}function dIn(n){var t;return t=Pun(Gk(ONt,1),WVn,25,15,[71,77,84,45,48,48,58,48,48]),n<=0&&(t[3]=43,n=-n),t[4]=t[4]+((n/60|0)/10|0)&QVn,t[5]=t[5]+(n/60|0)%10&QVn,t[7]=t[7]+(n%60/10|0)&QVn,t[8]=t[8]+n%10&QVn,Bdn(t,0,t.length)}function gIn(n){var t,e,i,r,c;if(null==n)return zWn;for(c=new $an(FWn,"[","]"),i=0,r=(e=n).length;i<r;++i)t=e[i],c.a?oO(c.a,c.b):c.a=new lN(c.d),aO(c.a,""+vz(t));return c.a?0==c.e.length?c.a.a:c.a.a+""+c.e:c.c}function pIn(n,t){var i,r,c;for(c=DWn,r=new Wb(kbn(t));r.a<r.c.c.length;)(i=BB(n0(r),213)).f&&!n.c[i.c]&&(n.c[i.c]=!0,c=e.Math.min(c,pIn(n,Nbn(i,t))));return n.i[t.d]=n.j,n.g[t.d]=e.Math.min(c,n.j++),n.g[t.d]}function vIn(n,t){var e,i,r;for(r=BB(BB(h6(n.r,t),21),84).Kc();r.Ob();)(i=BB(r.Pb(),111)).e.b=(e=i.b).Xe((sWn(),aPt))?e.Hf()==(kUn(),sIt)?-e.rf().b-Gy(MD(e.We(aPt))):Gy(MD(e.We(aPt))):e.Hf()==(kUn(),sIt)?-e.rf().b:0}function mIn(n){var t,e,i,r,c,a,u;for(e=QA(n.e),c=kL(Bx(B$(VA(n.e)),n.d*n.a,n.c*n.b),-.5),t=e.a-c.a,r=e.b-c.b,u=0;u<n.c;u++){for(i=t,a=0;a<n.d;a++)Wbn(n.e,new UV(i,r,n.a,n.b))&&FRn(n,a,u,!1,!0),i+=n.a;r+=n.b}}function yIn(n){var t,e,i;if(qy(TD(ZAn(n,(sWn(),SSt))))){for(i=new Np,e=new oz(ZL(dLn(n).a.Kc(),new h));dAn(e);)QIn(t=BB(U5(e),79))&&qy(TD(ZAn(t,PSt)))&&(i.c[i.c.length]=t);return i}return SQ(),SQ(),set}function kIn(n){var t;if(t=!1,cL(n,204))return t=!0,BB(n,204).a;if(!t&&cL(n,258)&&BB(n,258).a%1==0)return t=!0,iln(QO(BB(n,258).a));throw Hp(new ek("Id must be a string or an integer: '"+n+"'."))}function jIn(n,t){var e,i,r,c,a,u;for(c=null,r=new rU((!n.a&&(n.a=new Sp(n)),n.a));bOn(r);)if(YBn(a=(e=BB(aLn(r),56)).Tg()),null!=(i=(u=a.o)&&e.mh(u)?pK(uun(u),e.ah(u)):null)&&mK(i,t)){c=e;break}return c}function EIn(n,t,e){var i,r,c,a,u;if(lin(e,"occurrences"),0==e)return(u=BB(lfn(OQ(n.a),t),14))?u.gc():0;if(!(a=BB(lfn(OQ(n.a),t),14)))return 0;if(e>=(c=a.gc()))a.$b();else for(r=a.Kc(),i=0;i<e;i++)r.Pb(),r.Qb();return c}function TIn(n,t,e){var i,r,c;return lin(e,"oldCount"),lin(0,"newCount"),((i=BB(lfn(OQ(n.a),t),14))?i.gc():0)==e&&(lin(0,"count"),(c=-((r=BB(lfn(OQ(n.a),t),14))?r.gc():0))>0?wk():c<0&&EIn(n,t,-c),!0)}function MIn(n){var t,e,i,r,c,a;if(a=0,0==n.b){for(t=0,r=0,c=(i=Xvn(n,!0)).length;r<c;++r)(e=i[r])>0&&(a+=e,++t);t>1&&(a+=n.c*(t-1))}else a=Kk(ecn(LV(AV(LU(n.a),new Mn),new Sn)));return a>0?a+n.n.d+n.n.a:0}function SIn(n){var t,e,i,r,c,a;if(a=0,0==n.b)a=Kk(ecn(LV(AV(LU(n.a),new En),new Tn)));else{for(t=0,r=0,c=(i=Wvn(n,!0)).length;r<c;++r)(e=i[r])>0&&(a+=e,++t);t>1&&(a+=n.c*(t-1))}return a>0?a+n.n.b+n.n.c:0}function PIn(n,t){var i,r,c,a;for(i=(a=BB(oV(n.b,t),124)).a,c=BB(BB(h6(n.r,t),21),84).Kc();c.Ob();)(r=BB(c.Pb(),111)).c&&(i.a=e.Math.max(i.a,VH(r.c)));if(i.a>0)switch(t.g){case 2:a.n.c=n.s;break;case 4:a.n.b=n.s}}function CIn(n,t){var e,i,r;return 0==(e=BB(mMn(t,(fRn(),Zct)),19).a-BB(mMn(n,Zct),19).a)?(i=XR(B$(BB(mMn(n,(Mrn(),uat)),8)),BB(mMn(n,oat),8)),r=XR(B$(BB(mMn(t,uat),8)),BB(mMn(t,oat),8)),Pln(i.a*i.b,r.a*r.b)):e}function IIn(n,t){var e,i,r;return 0==(e=BB(mMn(t,(CAn(),$kt)),19).a-BB(mMn(n,$kt),19).a)?(i=XR(B$(BB(mMn(n,(qqn(),Zyt)),8)),BB(mMn(n,nkt),8)),r=XR(B$(BB(mMn(t,Zyt),8)),BB(mMn(t,nkt),8)),Pln(i.a*i.b,r.a*r.b)):e}function OIn(n){var t,e;return(e=new Ck).a+="e_",null!=(t=Xan(n))&&(e.a+=""+t),n.c&&n.d&&(oO((e.a+=" ",e),pyn(n.c)),oO(uO((e.a+="[",e),n.c.i),"]"),oO((e.a+=e1n,e),pyn(n.d)),oO(uO((e.a+="[",e),n.d.i),"]")),e.a}function AIn(n){switch(n.g){case 0:return new pf;case 1:return new vf;case 2:return new gf;case 3:return new mf;default:throw Hp(new _y("No implementation is available for the layout phase "+(null!=n.f?n.f:""+n.g)))}}function $In(n,t,i,r,c){var a;switch(a=0,c.g){case 1:a=e.Math.max(0,t.b+n.b-(i.b+r));break;case 3:a=e.Math.max(0,-n.b-r);break;case 2:a=e.Math.max(0,-n.a-r);break;case 4:a=e.Math.max(0,t.a+n.a-(i.a+r))}return a}function LIn(n,t,e){var i,r,c;if(e)for(c=((i=new hz(e.a.length)).b-i.a)*i.c<0?(eS(),MNt):new XL(i);c.Ob();)r=x2(e,BB(c.Pb(),19).a),L6n in r.a||N6n in r.a?sKn(n,r,t):EXn(n,r,t),PL(BB(RX(n.b,Qdn(r)),79))}function NIn(n){var t,e;switch(n.b){case-1:return!0;case 0:return(e=n.t)>1||-1==e||(t=Ikn(n))&&(ZM(),t.Cj()==E9n)?(n.b=-1,!0):(n.b=1,!1);default:return!1}}function xIn(n,t){var e,i,r,c,a;for(!t.s&&(t.s=new eU(FAt,t,21,17)),c=null,r=0,a=(i=t.s).i;r<a;++r)switch(DW(B7(n,e=BB(Wtn(i,r),170)))){case 2:case 3:!c&&(c=new Np),c.c[c.c.length]=e}return c||(SQ(),SQ(),set)}function DIn(n,t){var e,i,r,c;if(QXn(n),0!=n.c||123!=n.a)throw Hp(new ak(kWn((u$(),P8n))));if(c=112==t,i=n.d,(e=lx(n.i,125,i))<0)throw Hp(new ak(kWn((u$(),C8n))));return r=fx(n.i,i,e),n.d=e+1,b9(r,c,512==(512&n.e))}function RIn(n){var t;if((t=BB(mMn(n,(HXn(),qdt)),314))==(Oin(),hht))throw Hp(new ck("The hierarchy aware processor "+t+" in child node "+n+" is only allowed if the root node specifies the same hierarchical processor."))}function KIn(n,t){var e,i,r,c;for(G_(),e=null,r=t.Kc();r.Ob();)(i=BB(r.Pb(),128)).o||(WB((c=new PBn(F$(i.a),bH(i.a),null,BB(i.d.a.ec().Kc().Pb(),17))).c,i.a),n.c[n.c.length]=c,e&&WB(e.d,c),e=c)}function _In(n,t){var e,i,r;if(t)if(0!=(4&t.i))for(i="[]",e=t.c;;e=e.c){if(0==(4&e.i)){Hin(n,r=Uy((ED(e),e.o+i))),xen(n,r);break}i+="[]"}else Hin(n,r=Uy((ED(t),t.o))),xen(n,r);else Hin(n,null),xen(n,null);n.yk(t)}function FIn(n,t,e,i,r){var c,a,u,o;return GI(o=hD(n,BB(r,56)))!==GI(r)?(u=BB(n.g[e],72),jL(n,e,sTn(n,e,c=Z3(t,o))),mA(n.e)&&(KEn(a=LY(n,9,c.ak(),r,o,i,!1),new N7(n.e,9,n.c,u,c,i,!1)),$7(a)),o):r}function BIn(n,t,e){var i,r,c,a,u,o;for(i=BB(h6(n.c,t),15),r=BB(h6(n.c,e),15),c=i.Zc(i.gc()),a=r.Zc(r.gc());c.Sb()&&a.Sb();)if((u=BB(c.Ub(),19))!=(o=BB(a.Ub(),19)))return E$(u.a,o.a);return c.Ob()||a.Ob()?c.Ob()?1:-1:0}function HIn(n,t){var e,i;try{return X1(n.a,t)}catch(r){if(cL(r=lun(r),32)){try{if(i=l_n(t,_Vn,DWn),e=Vj(n.a),i>=0&&i<e.length)return e[i]}catch(c){if(!cL(c=lun(c),127))throw Hp(c)}return null}throw Hp(r)}}function qIn(n,t){var e,i,r;if(r=Fqn((IPn(),Z$t),n.Tg(),t))return ZM(),BB(r,66).Oj()||(r=Z1(B7(Z$t,r))),i=BB((e=n.Yg(r))>=0?n._g(e,!0,!0):cOn(n,r,!0),153),BB(i,215).ll(t);throw Hp(new _y(r6n+t.ne()+u6n))}function GIn(){var n;return tS(),Q$t?BB($$n((WM(),zAt),V9n),1939):(RO(Hnt,new Cs),nzn(),n=BB(cL(SJ((WM(),zAt),V9n),547)?SJ(zAt,V9n):new UW,547),Q$t=!0,oWn(n),TWn(n),VW((VM(),ZAt),n,new Go),mZ(zAt,V9n,n),n)}function zIn(n,t){var e,i,r,c;n.j=-1,mA(n.e)?(e=n.i,c=0!=n.i,c6(n,t),i=new N7(n.e,3,n.c,null,t,e,c),r=t.Qk(n.e,n.c,null),(r=IEn(n,t,r))?(r.Ei(i),r.Fi()):ban(n.e,i)):(c6(n,t),(r=t.Qk(n.e,n.c,null))&&r.Fi())}function UIn(n,t){var e,i,r;if(r=0,(i=t[0])>=n.length)return-1;for(b1(i,n.length),e=n.charCodeAt(i);e>=48&&e<=57&&(r=10*r+(e-48),!(++i>=n.length));)b1(i,n.length),e=n.charCodeAt(i);return i>t[0]?t[0]=i:r=-1,r}function XIn(n){var t,i,r,c,a;return i=c=BB(n.a,19).a,r=a=BB(n.b,19).a,t=e.Math.max(e.Math.abs(c),e.Math.abs(a)),c<=0&&c==a?(i=0,r=a-1):c==-t&&a!=t?(i=a,r=c,a>=0&&++i):(i=-a,r=c),new rI(iln(i),iln(r))}function WIn(n,t,e,i){var r,c,a,u,o,s;for(r=0;r<t.o;r++)for(c=r-t.j+e,a=0;a<t.p;a++)if(o=c,s=u=a-t.k+i,o+=n.j,s+=n.k,o>=0&&s>=0&&o<n.o&&s<n.p&&(!mmn(t,r,a)&&imn(n,c,u)||vmn(t,r,a)&&!rmn(n,c,u)))return!0;return!1}function VIn(n,t,e){var i,r,c,a;c=n.c,a=n.d,r=(Aon(Pun(Gk(PMt,1),sVn,8,0,[c.i.n,c.n,c.a])).b+Aon(Pun(Gk(PMt,1),sVn,8,0,[a.i.n,a.n,a.a])).b)/2,i=null,i=c.j==(kUn(),oIt)?new xC(t+c.i.c.c.a+e,r):new xC(t-e,r),Kx(n.a,0,i)}function QIn(n){var t,e,i;for(t=null,e=NU(Wen(Pun(Gk(xnt,1),HWn,20,0,[(!n.b&&(n.b=new hK(KOt,n,4,7)),n.b),(!n.c&&(n.c=new hK(KOt,n,5,8)),n.c)])));dAn(e);)if(i=PTn(BB(U5(e),82)),t){if(t!=i)return!1}else t=i;return!0}function YIn(n,t,e){var i;if(++n.j,t>=n.i)throw Hp(new Ay(u8n+t+o8n+n.i));if(e>=n.i)throw Hp(new Ay(s8n+e+o8n+n.i));return i=n.g[e],t!=e&&(t<e?aHn(n.g,t,n.g,t+1,e-t):aHn(n.g,e+1,n.g,e,t-e),$X(n.g,t,i),n.ei(t,i,e),n.ci()),i}function JIn(n,t,e){var i;if(i=BB(n.c.xc(t),14))return!!i.Fc(e)&&(++n.d,!0);if((i=n.ic(t)).Fc(e))return++n.d,n.c.zc(t,i),!0;throw Hp(new g5("New Collection violated the Collection spec"))}function ZIn(n){var t,e,i;return n<0?0:0==n?32:(e=16-(t=(i=-(n>>16))>>16&16),e+=t=(i=(n>>=t)-256)>>16&8,e+=t=(i=(n<<=t)-_Qn)>>16&4,(e+=t=(i=(n<<=t)-hVn)>>16&2)+2-(t=(i=(n<<=t)>>14)&~(i>>1)))}function nOn(n){var t,e,i,r;for(MQ(),Sct=new Np,Mct=new xp,Tct=new Np,!n.a&&(n.a=new eU(UOt,n,10,11)),xUn(t=n.a),r=new AL(t);r.e!=r.i.gc();)i=BB(kpn(r),33),-1==E7(Sct,i,0)&&(e=new Np,WB(Tct,e),Rgn(i,e));return Tct}function tOn(n,t,e){var i,r,c,a;n.a=e.b.d,cL(t,352)?(e5(c=qSn(r=cDn(BB(t,79),!1,!1)),i=new Nw(n)),VFn(c,r),null!=t.We((sWn(),OSt))&&e5(BB(t.We(OSt),74),i)):((a=BB(t,470)).Hg(a.Dg()+n.a.a),a.Ig(a.Eg()+n.a.b))}function eOn(n,t){var i,r,c,a,u,o,s,h;for(h=Gy(MD(mMn(t,(HXn(),Npt)))),s=n[0].n.a+n[0].o.a+n[0].d.c+h,o=1;o<n.length;o++)r=n[o].n,c=n[o].o,i=n[o].d,(a=r.a-i.b-s)<0&&(r.a-=a),(u=t.f).a=e.Math.max(u.a,r.a+c.a),s=r.a+c.a+i.c+h}function iOn(n,t){var e,i,r,c,a,u;return i=BB(BB(RX(n.g,t.a),46).a,65),r=BB(BB(RX(n.g,t.b),46).a,65),(e=nqn(c=i.b,a=r.b))>=0?e:(u=lW(XR(new xC(a.c+a.b/2,a.d+a.a/2),new xC(c.c+c.b/2,c.d+c.a/2))),-(Y_n(c,a)-1)*u)}function rOn(n,t,e){var i;JT(new Rq(null,(!e.a&&(e.a=new eU(FOt,e,6,6)),new w1(e.a,16))),new eI(n,t)),JT(new Rq(null,(!e.n&&(e.n=new eU(zOt,e,1,7)),new w1(e.n,16))),new iI(n,t)),(i=BB(ZAn(e,(sWn(),OSt)),74))&&Yrn(i,n,t)}function cOn(n,t,e){var i,r,c;if(c=Fqn((IPn(),Z$t),n.Tg(),t))return ZM(),BB(c,66).Oj()||(c=Z1(B7(Z$t,c))),r=BB((i=n.Yg(c))>=0?n._g(i,!0,!0):cOn(n,c,!0),153),BB(r,215).hl(t,e);throw Hp(new _y(r6n+t.ne()+u6n))}function aOn(n,t,e,i){var r,c,a,u,o;if(r=n.d[t])if(c=r.g,o=r.i,null!=i){for(u=0;u<o;++u)if((a=BB(c[u],133)).Sh()==e&&Nfn(i,a.cd()))return a}else for(u=0;u<o;++u)if(GI((a=BB(c[u],133)).cd())===GI(i))return a;return null}function uOn(n,t){var e;if(t<0)throw Hp(new Oy("Negative exponent"));if(0==t)return Jtt;if(1==t||swn(n,Jtt)||swn(n,eet))return n;if(!fAn(n,0)){for(e=1;!fAn(n,e);)++e;return Nnn(vwn(e*t),uOn(z5(n,e),t))}return mTn(n,t)}function oOn(n,t){var e,i,r;if(GI(n)===GI(t))return!0;if(null==n||null==t)return!1;if(n.length!=t.length)return!1;for(e=0;e<n.length;++e)if(i=n[e],r=t[e],!(GI(i)===GI(r)||null!=i&&Nfn(i,r)))return!1;return!0}function sOn(n){var t,e,i;for(kM(),this.b=Vat,this.c=(Ffn(),BPt),this.f=(yM(),zat),this.a=n,tj(this,new Ct),kNn(this),i=new Wb(n.b);i.a<i.c.c.length;)(e=BB(n0(i),81)).d||(t=new Pgn(Pun(Gk(Qat,1),HWn,81,0,[e])),WB(n.a,t))}function hOn(n,t,e){var i,r,c,a,u,o;if(!n||0==n.c.length)return null;for(c=new KY(t,!e),r=new Wb(n);r.a<r.c.c.length;)i=BB(n0(r),70),USn(c,(gM(),new Bw(i)));return(a=c.i).a=(o=c.n,c.e.b+o.d+o.a),a.b=(u=c.n,c.e.a+u.b+u.c),c}function fOn(n){var t,e,i,r,c,a,u;for(hA(u=n2(n.a),new Pe),e=null,c=0,a=(r=u).length;c<a&&(i=r[c]).k==(uSn(),Mut);++c)(t=BB(mMn(i,(hWn(),Qft)),61))!=(kUn(),CIt)&&t!=oIt||(e&&BB(mMn(e,clt),15).Fc(i),e=i)}function lOn(n,t,e){var i,r,c,a,u,o;l1(t,n.c.length),u=BB(n.c[t],329),s6(n,t),u.b/2>=e&&(i=t,c=(o=(u.c+u.a)/2)-e,u.c<=o-e&&kG(n,i++,new kB(u.c,c)),(a=o+e)<=u.a&&(r=new kB(a,u.a),LZ(i,n.c.length),MS(n.c,i,r)))}function bOn(n){var t;if(n.c||null!=n.g){if(null==n.g)return!0;if(0==n.i)return!1;t=BB(n.g[n.i-1],47)}else n.d=n.si(n.f),f9(n,n.d),t=n.d;return t==n.b&&null.km>=null.jm()?(aLn(n),bOn(n)):t.Ob()}function wOn(n,t,e){var i,r,c,a;if(!(a=e)&&(a=LH(new Xm,0)),OTn(a,qZn,1),$Gn(n.c,t),1==(c=RGn(n.a,t)).gc())VHn(BB(c.Xb(0),37),a);else for(r=1/c.gc(),i=c.Kc();i.Ob();)VHn(BB(i.Pb(),37),mcn(a,r));Ek(n.a,c,t),FDn(t),HSn(a)}function dOn(n){if(this.a=n,n.c.i.k==(uSn(),Mut))this.c=n.c,this.d=BB(mMn(n.c.i,(hWn(),Qft)),61);else{if(n.d.i.k!=Mut)throw Hp(new _y("Edge "+n+" is not an external edge."));this.c=n.d,this.d=BB(mMn(n.d.i,(hWn(),Qft)),61)}}function gOn(n,t){var e,i,r;r=n.b,n.b=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,3,r,n.b)),t?t!=n&&(Nrn(n,t.zb),$en(n,t.d),Fin(n,null==(e=null==(i=t.c)?t.zb:i)||mK(e,t.zb)?null:e)):(Nrn(n,null),$en(n,0),Fin(n,null))}function pOn(n){var t,e;if(n.f){for(;n.n<n.o;){if(cL(e=(t=BB(n.j?n.j.pi(n.n):n.k.Xb(n.n),72)).ak(),99)&&0!=(BB(e,18).Bb&h6n)&&(!n.e||e.Gj()!=NOt||0!=e.aj())&&null!=t.dd())return!0;++n.n}return!1}return n.n<n.o}function vOn(n,t){var e;this.e=(WX(),yX(n),WX(),Nwn(n)),this.c=(yX(t),Nwn(t)),aN(this.e.Hd().dc()==this.c.Hd().dc()),this.d=vbn(this.e),this.b=vbn(this.c),e=kq(Ant,[sVn,HWn],[5,1],5,[this.e.Hd().gc(),this.c.Hd().gc()],2),this.a=e,din(this)}function mOn(n){var t=(!Znt&&(Znt=QUn()),Znt);return'"'+n.replace(/[\x00-\x1f\xad\u0600-\u0603\u06dd\u070f\u17b4\u17b5\u200b-\u200f\u2028-\u202e\u2060-\u2064\u206a-\u206f\ufeff\ufff9-\ufffb"\\]/g,(function(n){return IJ(n,t)}))+'"'}function yOn(n){var t,e;for(CQ(),this.b=hit,this.c=lit,this.g=(pM(),sit),this.d=(Ffn(),BPt),this.a=n,yNn(this),e=new Wb(n.b);e.a<e.c.c.length;)!(t=BB(n0(e),57)).a&&IN(Xen(new Xv,Pun(Gk(bit,1),HWn,57,0,[t])),n),t.e=new gY(t.d)}function kOn(n){var t,e,i,r,c;for(r=n.e.c.length,i=x8(Rnt,nZn,15,r,0,1),c=new Wb(n.e);c.a<c.c.c.length;)i[BB(n0(c),144).b]=new YT;for(e=new Wb(n.c);e.a<e.c.c.length;)i[(t=BB(n0(e),282)).c.b].Fc(t),i[t.d.b].Fc(t);return i}function jOn(n){var t,e,i,r,c,a;for(a=sx(n.c.length),r=new Wb(n);r.a<r.c.c.length;){for(i=BB(n0(r),10),c=new Rv,e=new oz(ZL(lbn(i).a.Kc(),new h));dAn(e);)(t=BB(U5(e),17)).c.i==t.d.i||TU(c,t.d.i);a.c[a.c.length]=c}return a}function EOn(n,t){var e,i,r,c,a;if(t>=(a=null==(e=BB(yan(n.a,4),126))?0:e.length))throw Hp(new tK(t,a));return r=e[t],1==a?i=null:(aHn(e,0,i=x8(dAt,i9n,415,a-1,0,1),0,t),(c=a-t-1)>0&&aHn(e,t+1,i,t,c)),Fgn(n,i),eCn(n,t,r),r}function TOn(){TOn=O,lLt=BB(Wtn(QQ((cE(),gLt).qb),6),34),sLt=BB(Wtn(QQ(gLt.qb),3),34),hLt=BB(Wtn(QQ(gLt.qb),4),34),fLt=BB(Wtn(QQ(gLt.qb),5),18),oEn(lLt),oEn(sLt),oEn(hLt),oEn(fLt),bLt=new Jy(Pun(Gk(FAt,1),N9n,170,0,[lLt,sLt]))}function MOn(n,t){var e;this.d=new lm,this.b=t,this.e=new wA(t.qf()),e=n.u.Hc((lIn(),iIt)),n.u.Hc(eIt)?n.D?this.a=e&&!t.If():this.a=!0:n.u.Hc(rIt)?this.a=!!e&&!(t.zf().Kc().Ob()||t.Bf().Kc().Ob()):this.a=!1}function SOn(n,t){var e,i,r,c;for(e=n.o.a,c=BB(BB(h6(n.r,t),21),84).Kc();c.Ob();)(r=BB(c.Pb(),111)).e.a=(i=r.b).Xe((sWn(),aPt))?i.Hf()==(kUn(),CIt)?-i.rf().a-Gy(MD(i.We(aPt))):e+Gy(MD(i.We(aPt))):i.Hf()==(kUn(),CIt)?-i.rf().a:e}function POn(n,t){var e,i,r;e=BB(mMn(n,(HXn(),Udt)),103),r=BB(ZAn(t,upt),61),(i=BB(mMn(n,ept),98))!=(QEn(),QCt)&&i!=YCt?r==(kUn(),PIt)&&(r=OFn(t,e))==PIt&&(r=hwn(e)):r=XHn(t)>0?hwn(e):Tln(hwn(e)),Ypn(t,upt,r)}function COn(n,t){var e,i,r,c,a;for(a=n.j,t.a!=t.b&&m$(a,new Ur),r=a.c.length/2|0,i=0;i<r;i++)l1(i,a.c.length),(c=BB(a.c[i],113)).c&&qCn(c.d,t.a);for(e=r;e<a.c.length;e++)l1(e,a.c.length),(c=BB(a.c[e],113)).c&&qCn(c.d,t.b)}function IOn(n,t,e){var i,r,c;return i=n.c[t.c.p][t.p],r=n.c[e.c.p][e.p],null!=i.a&&null!=r.a?((c=Tz(i.a,r.a))<0?uKn(n,t,e):c>0&&uKn(n,e,t),c):null!=i.a?(uKn(n,t,e),-1):null!=r.a?(uKn(n,e,t),1):0}function OOn(n,t){var e,i,r,c;n.ej()?(e=n.Vi(),c=n.fj(),++n.j,n.Hi(e,n.oi(e,t)),i=n.Zi(3,null,t,e,c),n.bj()&&(r=n.cj(t,null))?(r.Ei(i),r.Fi()):n.$i(i)):(eW(n,t),n.bj()&&(r=n.cj(t,null))&&r.Fi())}function AOn(n,t){var e,i,r,c,a;for(a=axn(n.e.Tg(),t),r=new go,e=BB(n.g,119),c=n.i;--c>=0;)i=e[c],a.rl(i.ak())&&f9(r,i);!aXn(n,r)&&mA(n.e)&&Lv(n,t.$j()?LY(n,6,t,(SQ(),set),null,-1,!1):LY(n,t.Kj()?2:1,t,null,null,-1,!1))}function $On(){var n,t;for($On=O,aet=x8(oet,sVn,91,32,0,1),uet=x8(oet,sVn,91,32,0,1),n=1,t=0;t<=18;t++)aet[t]=npn(n),uet[t]=npn(yz(n,t)),n=cbn(n,5);for(;t<uet.length;t++)aet[t]=Nnn(aet[t-1],aet[1]),uet[t]=Nnn(uet[t-1],(ODn(),net))}function LOn(n,t){var e,i,r,c;return n.a==(JMn(),cft)||(r=t.a.c,e=t.a.c+t.a.b,!(t.j&&(c=(i=t.A).c.c.a-i.o.a/2,r-(i.n.a+i.o.a)>c)||t.q&&(c=(i=t.C).c.c.a-i.o.a/2,i.n.a-e>c)))}function NOn(n,t){OTn(t,"Partition preprocessing",1),JT(BB(P4(AV(wnn(AV(new Rq(null,new w1(n.a,16)),new vi),new mi),new yi),m9(new H,new B,new rn,Pun(Gk(nit,1),$Vn,132,0,[(qsn(),Uet)]))),15).Oc(),new ki),HSn(t)}function xOn(n){var t,e,i,r,c,a;for(qZ(),e=new v4,i=new Wb(n.e.b);i.a<i.c.c.length;)for(c=new Wb(BB(n0(i),29).a);c.a<c.c.c.length;)r=BB(n0(c),10),(t=BB(lnn(e,a=n.g[r.p]),15))||Jgn(e,a,t=new Np),t.Fc(r);return e}function DOn(n,t){var e,i,r,c,a;for(r=t.b.b,n.a=x8(Rnt,nZn,15,r,0,1),n.b=x8($Nt,ZYn,25,r,16,1),a=spn(t.b,0);a.b!=a.d.c;)c=BB(b3(a),86),n.a[c.g]=new YT;for(i=spn(t.a,0);i.b!=i.d.c;)e=BB(b3(i),188),n.a[e.b.g].Fc(e),n.a[e.c.g].Fc(e)}function ROn(n){var t;return 0!=(64&n.Db)?P$n(n):((t=new fN(P$n(n))).a+=" (startX: ",vE(t,n.j),t.a+=", startY: ",vE(t,n.k),t.a+=", endX: ",vE(t,n.b),t.a+=", endY: ",vE(t,n.c),t.a+=", identifier: ",cO(t,n.d),t.a+=")",t.a)}function KOn(n){var t;return 0!=(64&n.Db)?kfn(n):((t=new fN(kfn(n))).a+=" (ordered: ",yE(t,0!=(256&n.Bb)),t.a+=", unique: ",yE(t,0!=(512&n.Bb)),t.a+=", lowerBound: ",mE(t,n.s),t.a+=", upperBound: ",mE(t,n.t),t.a+=")",t.a)}function _On(n,t,e,i,r,c,a,u){var o;return cL(n.Cb,88)&&ACn(P5(BB(n.Cb,88)),4),Nrn(n,e),n.f=i,$ln(n,r),Nln(n,c),Aln(n,a),Lln(n,!1),nln(n,!0),qln(n,u),Yfn(n,!0),Len(n,0),n.b=0,Nen(n,1),(o=HTn(n,t,null))&&o.Fi(),Gln(n,!1),n}function FOn(n,t){var i,r;return BB(SJ(n.a,t),512)||(i=new y5(t),k5(),xK(i,FOn(n,fx(r=Qet?null:i.c,0,e.Math.max(0,mN(r,YTn(46)))))),0==(Qet?null:i.c).length&&zD(i,new X),mZ(n.a,Qet?null:i.c,i),i)}function BOn(n,t){var e;n.b=t,n.g=new Np,e=JOn(n.b),n.e=e,n.f=e,n.c=qy(TD(mMn(n.b,(_kn(),jit)))),n.a=MD(mMn(n.b,(sWn(),cSt))),null==n.a&&(n.a=1),Gy(n.a)>1?n.e*=Gy(n.a):n.f/=Gy(n.a),Chn(n),ggn(n),TRn(n),hon(n.b,(Epn(),gct),n.g)}function HOn(n,t,e){var i,r,c,a,u;for(i=0,u=e,t||(i=e*(n.c.length-1),u*=-1),c=new Wb(n);c.a<c.c.c.length;){for(hon(r=BB(n0(c),10),(HXn(),kdt),(wvn(),OMt)),r.o.a=i,a=DSn(r,(kUn(),oIt)).Kc();a.Ob();)BB(a.Pb(),11).n.a=i;i+=u}}function qOn(n,t,e){var i,r,c;n.ej()?(c=n.fj(),Ifn(n,t,e),i=n.Zi(3,null,e,t,c),n.bj()?(r=n.cj(e,null),n.ij()&&(r=n.jj(e,r)),r?(r.Ei(i),r.Fi()):n.$i(i)):n.$i(i)):(Ifn(n,t,e),n.bj()&&(r=n.cj(e,null))&&r.Fi())}function GOn(n,t,e){var i,r,c,a,u,o;return(u=n.Gk(e))!=e?(a=n.g[t],o=u,jL(n,t,n.oi(t,o)),c=a,n.gi(t,o,c),n.rk()&&(i=e,r=n.dj(i,null),!BB(u,49).eh()&&(r=n.cj(o,r)),r&&r.Fi()),mA(n.e)&&Lv(n,n.Zi(9,e,u,t,!1)),u):e}function zOn(n,t){var e,i,r;for(e=new Wb(n.a.a);e.a<e.c.c.length;)BB(n0(e),189).g=!0;for(r=new Wb(n.a.b);r.a<r.c.c.length;)(i=BB(n0(r),81)).k=qy(TD(n.e.Kb(new rI(i,t)))),i.d.g=i.d.g&qy(TD(n.e.Kb(new rI(i,t))));return n}function UOn(n){var t,e,i,r,c;if(e=new YK(t=BB(Vj(FIt),9),BB(SR(t,t.length),9),0),c=BB(mMn(n,(hWn(),Elt)),10))for(r=new Wb(c.j);r.a<r.c.c.length;)GI(mMn(i=BB(n0(r),11),dlt))===GI(n)&&zN(new m6(i.b))&&orn(e,i.j);return e}function XOn(n,t,e){var i,r,c,a;if(!n.d[e.p]){for(i=new oz(ZL(lbn(e).a.Kc(),new h));dAn(i);){for(c=new oz(ZL(fbn(a=BB(U5(i),17).d.i).a.Kc(),new h));dAn(c);)(r=BB(U5(c),17)).c.i==t&&(n.a[r.p]=!0);XOn(n,t,a)}n.d[e.p]=!0}}function WOn(n,t){var e,i,r,c,a,u,o;if(1==(i=pbn(254&n.Db)))n.Eb=null;else if(c=een(n.Eb),2==i)r=Rmn(n,t),n.Eb=c[0==r?1:0];else{for(a=x8(Ant,HWn,1,i-1,5,1),e=2,u=0,o=0;e<=128;e<<=1)e==t?++u:0!=(n.Db&e)&&(a[o++]=c[u++]);n.Eb=a}n.Db&=~t}function VOn(n,t){var e,i,r,c,a;for(!t.s&&(t.s=new eU(FAt,t,21,17)),c=null,r=0,a=(i=t.s).i;r<a;++r)switch(DW(B7(n,e=BB(Wtn(i,r),170)))){case 4:case 5:case 6:!c&&(c=new Np),c.c[c.c.length]=e}return c||(SQ(),SQ(),set)}function QOn(n){var t;switch(t=0,n){case 105:t=2;break;case 109:t=8;break;case 115:t=4;break;case 120:t=16;break;case 117:t=32;break;case 119:t=64;break;case 70:t=256;break;case 72:t=128;break;case 88:t=512;break;case 44:t=k6n}return t}function YOn(n,t,e,i,r){var c,a,u,o;if(GI(n)!==GI(t)||i!=r)for(u=0;u<i;u++){for(a=0,c=n[u],o=0;o<r;o++)a=rbn(rbn(cbn(e0(c,UQn),e0(t[o],UQn)),e0(e[u+o],UQn)),e0(dG(a),UQn)),e[u+o]=dG(a),a=jz(a,32);e[u+r]=dG(a)}else I_n(n,i,e)}function JOn(n){var t,i,r,c,a,u,o,s,h,f,l;for(f=0,h=0,o=(c=n.a).a.gc(),r=c.a.ec().Kc();r.Ob();)(i=BB(r.Pb(),561)).b&&VBn(i),f+=(l=(t=i.a).a)+(u=t.b),h+=l*u;return s=e.Math.sqrt(400*o*h-4*h+f*f)+f,0==(a=2*(100*o-1))?s:s/a}function ZOn(n,t){0!=t.b&&(isNaN(n.s)?n.s=Gy((Px(0!=t.b),MD(t.a.a.c))):n.s=e.Math.min(n.s,Gy((Px(0!=t.b),MD(t.a.a.c)))),isNaN(n.c)?n.c=Gy((Px(0!=t.b),MD(t.c.b.c))):n.c=e.Math.max(n.c,Gy((Px(0!=t.b),MD(t.c.b.c)))))}function nAn(n){var t,e,i;for(t=null,e=NU(Wen(Pun(Gk(xnt,1),HWn,20,0,[(!n.b&&(n.b=new hK(KOt,n,4,7)),n.b),(!n.c&&(n.c=new hK(KOt,n,5,8)),n.c)])));dAn(e);)if(i=PTn(BB(U5(e),82)),t){if(t!=JJ(i))return!0}else t=JJ(i);return!1}function tAn(n,t){var e,i,r,c;n.ej()?(e=n.i,c=n.fj(),c6(n,t),i=n.Zi(3,null,t,e,c),n.bj()?(r=n.cj(t,null),n.ij()&&(r=n.jj(t,r)),r?(r.Ei(i),r.Fi()):n.$i(i)):n.$i(i)):(c6(n,t),n.bj()&&(r=n.cj(t,null))&&r.Fi())}function eAn(n,t,e){var i,r,c;n.ej()?(c=n.fj(),++n.j,n.Hi(t,n.oi(t,e)),i=n.Zi(3,null,e,t,c),n.bj()&&(r=n.cj(e,null))?(r.Ei(i),r.Fi()):n.$i(i)):(++n.j,n.Hi(t,n.oi(t,e)),n.bj()&&(r=n.cj(e,null))&&r.Fi())}function iAn(n){var t,e,i,r;for(r=n.length,t=null,i=0;i<r;i++)b1(i,n.length),GO(".*+?{[()|\\^$",YTn(e=n.charCodeAt(i)))>=0?(t||(t=new Pk,i>0&&cO(t,n.substr(0,i))),t.a+="\\",NX(t,e&QVn)):t&&NX(t,e&QVn);return t?t.a:n}function rAn(n){var t;if(!n.a)throw Hp(new Fy("IDataType class expected for layout option "+n.f));if(null==(t=I3(n.a)))throw Hp(new Fy("Couldn't create new instance of property '"+n.f+"'. "+r5n+(ED(bAt),bAt.k)+c5n));return BB(t,414)}function cAn(n){var t,e,i,r,c;return(c=n.eh())&&c.kh()&&(r=tfn(n,c))!=c?(e=n.Vg(),i=(t=n.Vg())>=0?n.Qg(null):n.eh().ih(n,-1-t,null,null),n.Rg(BB(r,49),e),i&&i.Fi(),n.Lg()&&n.Mg()&&e>-1&&ban(n,new nU(n,9,e,c,r)),r):c}function aAn(n){var t,e,i,r,c,a,u;for(c=0,r=n.f.e,e=0;e<r.c.length;++e)for(l1(e,r.c.length),a=BB(r.c[e],144),i=e+1;i<r.c.length;++i)l1(i,r.c.length),u=BB(r.c[i],144),t=W8(a.d,u.d)-n.a[a.b][u.b],c+=n.i[a.b][u.b]*t*t;return c}function uAn(n,t){var e;if(!Lx(t,(HXn(),kgt))&&(e=Ekn(BB(mMn(t,est),360),BB(mMn(n,kgt),163)),hon(t,est,e),!dAn(new oz(ZL(hbn(t).a.Kc(),new h)))))switch(e.g){case 1:hon(t,kgt,(Tbn(),_lt));break;case 2:hon(t,kgt,(Tbn(),Blt))}}function oAn(n,t){var e;mRn(n),n.a=(e=new ok,JT(new Rq(null,new w1(t.d,16)),new Od(e)),e),Mxn(n,BB(mMn(t.b,(HXn(),igt)),376)),kvn(n),OAn(n),$kn(n),jvn(n),jqn(n,t),JT(wnn(new Rq(null,Y0(SX(n.b).a)),new Wr),new Vr),t.a=!1,n.a=null}function sAn(){dMn.call(this,y6n,(tE(),dOt)),this.p=null,this.a=null,this.f=null,this.n=null,this.g=null,this.c=null,this.i=null,this.j=null,this.d=null,this.b=null,this.e=null,this.k=null,this.o=null,this.s=null,this.q=!1,this.r=!1}function hAn(){hAn=O,iAt=new MI(G1n,0),nAt=new MI("INSIDE_SELF_LOOPS",1),tAt=new MI("MULTI_EDGES",2),ZOt=new MI("EDGE_LABELS",3),eAt=new MI("PORTS",4),YOt=new MI("COMPOUND",5),QOt=new MI("CLUSTERS",6),JOt=new MI("DISCONNECTED",7)}function fAn(n,t){var e,i,r;if(0==t)return 0!=(1&n.a[0]);if(t<0)throw Hp(new Oy("Negative bit address"));if((r=t>>5)>=n.d)return n.e<0;if(e=n.a[r],t=1<<(31&t),n.e<0){if(r<(i=Ccn(n)))return!1;e=i==r?-e:~e}return 0!=(e&t)}function lAn(n,t,e,i){var r;BB(e.b,65),BB(e.b,65),BB(i.b,65),BB(i.b,65),NH(r=XR(B$(BB(e.b,65).c),BB(i.b,65).c),HCn(BB(e.b,65),BB(i.b,65),r)),BB(i.b,65),BB(i.b,65),BB(i.b,65).c.a,r.a,BB(i.b,65).c.b,r.b,BB(i.b,65),Otn(i.a,new TB(n,t,i))}function bAn(n,t){var e,i,r,c,a,u,o;if(c=t.e)for(e=cAn(c),i=BB(n.g,674),a=0;a<n.i;++a)if(qvn(o=i[a])==e&&(!o.d&&(o.d=new $L(VAt,o,1)),r=o.d,(u=BB(e.ah(gKn(c,c.Cb,c.Db>>16)),15).Xc(c))<r.i))return bAn(n,BB(Wtn(r,u),87));return t}function wAn(n,t,e){var i,r=SWn,c=r[n],a=c instanceof Array?c[0]:null;c&&!a?MWn=c:(!(i=t&&t.prototype)&&(i=SWn[t]),(MWn=qJ(i)).hm=e,!t&&(MWn.im=I),r[n]=MWn);for(var u=3;u<arguments.length;++u)arguments[u].prototype=MWn;a&&(MWn.gm=a)}function dAn(n){for(var t;!BB(yX(n.a),47).Ob();){if(n.d=osn(n),!n.d)return!1;if(n.a=BB(n.d.Pb(),47),cL(n.a,39)){if(t=BB(n.a,39),n.a=t.a,!n.b&&(n.b=new Lp),d3(n.b,n.d),t.b)for(;!Wy(t.b);)d3(n.b,BB(gU(t.b),47));n.d=t.d}}return!0}function gAn(n,t){var e,i,r,c,a;for(c=null==t?0:n.b.se(t),i=null==(e=n.a.get(c))?new Array:e,a=0;a<i.length;a++)if(r=i[a],n.b.re(t,r.cd()))return 1==i.length?(i.length=0,vR(n.a,c)):i.splice(a,1),--n.c,oY(n.b),r.dd();return null}function pAn(n,t){var e,i,r,c;for(r=1,t.j=!0,c=null,i=new Wb(kbn(t));i.a<i.c.c.length;)e=BB(n0(i),213),n.c[e.c]||(n.c[e.c]=!0,c=Nbn(e,t),e.f?r+=pAn(n,c):c.j||e.a!=e.e.e-e.d.e||(e.f=!0,TU(n.p,e),r+=pAn(n,c)));return r}function vAn(n){var t,i,r;for(i=new Wb(n.a.a.b);i.a<i.c.c.length;)t=BB(n0(i),81),kW(0),(r=0)>0&&((!dA(n.a.c)||!t.n.d)&&(!gA(n.a.c)||!t.n.b)&&(t.g.d+=e.Math.max(0,r/2-.5)),(!dA(n.a.c)||!t.n.a)&&(!gA(n.a.c)||!t.n.c)&&(t.g.a-=r-1))}function mAn(n){var t,i,r,c,a;if(a=K_n(n,c=new Np),t=BB(mMn(n,(hWn(),Elt)),10))for(r=new Wb(t.j);r.a<r.c.c.length;)GI(mMn(i=BB(n0(r),11),dlt))===GI(n)&&(a=e.Math.max(a,K_n(i,c)));return 0==c.c.length||hon(n,blt,a),-1!=a?c:null}function yAn(n,t,e){var i,r,c,a,u,o;r=(i=(c=BB(xq(t.e,0),17).c).i).k,u=(a=(o=BB(xq(e.g,0),17).d).i).k,r==(uSn(),Put)?hon(n,(hWn(),hlt),BB(mMn(i,hlt),11)):hon(n,(hWn(),hlt),c),hon(n,(hWn(),flt),u==Put?BB(mMn(a,flt),11):o)}function kAn(n,t){var e,i,r,c;for(e=(c=dG(cbn(SVn,rV(dG(cbn(null==t?0:nsn(t),PVn)),15))))&n.b.length-1,r=null,i=n.b[e];i;r=i,i=i.a)if(i.d==c&&wW(i.i,t))return r?r.a=i.a:n.b[e]=i.a,kk(i.c,i.f),iv(i.b,i.e),--n.f,++n.e,!0;return!1}function jAn(n,t){var e,i,r,c,a;return t&=63,(i=0!=((e=n.h)&CQn))&&(e|=-1048576),t<22?(a=e>>t,c=n.m>>t|e<<22-t,r=n.l>>t|n.m<<22-t):t<44?(a=i?PQn:0,c=e>>t-22,r=n.m>>t-22|e<<44-t):(a=i?PQn:0,c=i?SQn:0,r=e>>t-44),M$(r&SQn,c&SQn,a&PQn)}function EAn(n){var t,i,r,c,a,u;for(this.c=new Np,this.d=n,r=RQn,c=RQn,t=KQn,i=KQn,u=spn(n,0);u.b!=u.d.c;)a=BB(b3(u),8),r=e.Math.min(r,a.a),c=e.Math.min(c,a.b),t=e.Math.max(t,a.a),i=e.Math.max(i,a.b);this.a=new UV(r,c,t-r,i-c)}function TAn(n,t){var e,i,r,c;for(i=new Wb(n.b);i.a<i.c.c.length;)for(c=new Wb(BB(n0(i),29).a);c.a<c.c.c.length;)for((r=BB(n0(c),10)).k==(uSn(),Sut)&&hFn(r,t),e=new oz(ZL(lbn(r).a.Kc(),new h));dAn(e);)vun(BB(U5(e),17),t)}function MAn(n){var t,e,i;this.c=n,i=BB(mMn(n,(HXn(),Udt)),103),t=Gy(MD(mMn(n,Edt))),e=Gy(MD(mMn(n,Kpt))),i==(Ffn(),_Pt)||i==FPt||i==BPt?this.b=t*e:this.b=1/(t*e),this.j=Gy(MD(mMn(n,Apt))),this.e=Gy(MD(mMn(n,Opt))),this.f=n.b.c.length}function SAn(n){var t,e;for(n.e=x8(ANt,hQn,25,n.p.c.length,15,1),n.k=x8(ANt,hQn,25,n.p.c.length,15,1),e=new Wb(n.p);e.a<e.c.c.length;)t=BB(n0(e),10),n.e[t.p]=F3(new oz(ZL(fbn(t).a.Kc(),new h))),n.k[t.p]=F3(new oz(ZL(lbn(t).a.Kc(),new h)))}function PAn(n){var t,e,i,r,c;for(i=0,n.q=new Np,t=new Rv,c=new Wb(n.p);c.a<c.c.c.length;){for((r=BB(n0(c),10)).p=i,e=new oz(ZL(lbn(r).a.Kc(),new h));dAn(e);)TU(t,BB(U5(e),17).d.i);t.a.Bc(r),WB(n.q,new $q(t)),t.a.$b(),++i}}function CAn(){CAn=O,Okt=new WA(20),Ikt=new XA((sWn(),XSt),Okt),xkt=new XA(LPt,20),jkt=new XA(cSt,dZn),$kt=new XA(pPt,iln(1)),Nkt=new XA(kPt,(hN(),!0)),Ekt=lSt,Mkt=KSt,Skt=BSt,Pkt=qSt,Tkt=DSt,Ckt=USt,Akt=fPt,Ran(),Dkt=ykt,Lkt=vkt}function IAn(n,t){var e,i,r,c,a,u,o,s,h;if(n.a.f>0&&cL(t,42)&&(n.a.qj(),c=null==(o=(s=BB(t,42)).cd())?0:nsn(o),a=eR(n.a,c),e=n.a.d[a]))for(i=BB(e.g,367),h=e.i,u=0;u<h;++u)if((r=i[u]).Sh()==c&&r.Fb(s))return IAn(n,s),!0;return!1}function OAn(n){var t,e,i,r;for(r=BB(h6(n.a,(LEn(),Sst)),15).Kc();r.Ob();)iX(n,i=BB(r.Pb(),101),(e=(t=gz(i.k)).Hc((kUn(),sIt))?t.Hc(oIt)?t.Hc(SIt)?t.Hc(CIt)?null:$st:Nst:Lst:Ast)[0],(Crn(),xst),0),iX(n,i,e[1],Dst,1),iX(n,i,e[2],Rst,1)}function AAn(n,t){var e,i;Jxn(n,t,e=mKn(t)),iTn(n.a,BB(mMn(vW(t.b),(hWn(),Slt)),230)),b_n(n),DEn(n,t),i=x8(ANt,hQn,25,t.b.j.c.length,15,1),szn(n,t,(kUn(),sIt),i,e),szn(n,t,oIt,i,e),szn(n,t,SIt,i,e),szn(n,t,CIt,i,e),n.a=null,n.c=null,n.b=null}function $An(){$An=O,Sbn(),oEt=new $O(E4n,sEt=nEt),aEt=new $O(T4n,(hN(),!0)),iln(-1),iEt=new $O(M4n,iln(-1)),iln(-1),rEt=new $O(S4n,iln(-1)),uEt=new $O(P4n,!1),hEt=new $O(C4n,!0),cEt=new $O(I4n,!1),fEt=new $O(O4n,-1)}function LAn(n,t,e){switch(t){case 7:return!n.e&&(n.e=new hK(_Ot,n,7,4)),sqn(n.e),!n.e&&(n.e=new hK(_Ot,n,7,4)),void pX(n.e,BB(e,14));case 8:return!n.d&&(n.d=new hK(_Ot,n,8,5)),sqn(n.d),!n.d&&(n.d=new hK(_Ot,n,8,5)),void pX(n.d,BB(e,14))}zjn(n,t,e)}function NAn(n,t){var e,i,r,c,a;if(GI(t)===GI(n))return!0;if(!cL(t,15))return!1;if(a=BB(t,15),n.gc()!=a.gc())return!1;for(c=a.Kc(),i=n.Kc();i.Ob();)if(e=i.Pb(),r=c.Pb(),!(GI(e)===GI(r)||null!=e&&Nfn(e,r)))return!1;return!0}function xAn(n,t){var e,i,r,c;for((c=BB(P4(wnn(wnn(new Rq(null,new w1(t.b,16)),new Re),new Ke),m9(new H,new B,new rn,Pun(Gk(nit,1),$Vn,132,0,[(qsn(),Uet)]))),15)).Jc(new _e),e=0,r=c.Kc();r.Ob();)-1==(i=BB(r.Pb(),11)).p&&FAn(n,i,e++)}function DAn(n){switch(n.g){case 0:return new Cf;case 1:return new lf;case 2:return new ff;case 3:return new jI;case 4:return new _G;default:throw Hp(new _y("No implementation is available for the node placer "+(null!=n.f?n.f:""+n.g)))}}function RAn(n){switch(n.g){case 0:return new KG;case 1:return new wf;case 2:return new rf;case 3:return new cf;case 4:return new TI;default:throw Hp(new _y("No implementation is available for the cycle breaker "+(null!=n.f?n.f:""+n.g)))}}function KAn(){KAn=O,mjt=new $O(u4n,iln(0)),yjt=new $O(o4n,0),Hsn(),djt=new $O(s4n,gjt=sjt),iln(0),wjt=new $O(h4n,iln(1)),Bcn(),kjt=new $O(f4n,jjt=Xjt),D9(),Ejt=new $O(l4n,Tjt=ajt),Omn(),pjt=new $O(b4n,vjt=qjt)}function _An(n,t,e){var i;i=null,t&&(i=t.d),Yjn(n,new dP(t.n.a-i.b+e.a,t.n.b-i.d+e.b)),Yjn(n,new dP(t.n.a-i.b+e.a,t.n.b+t.o.b+i.a+e.b)),Yjn(n,new dP(t.n.a+t.o.a+i.c+e.a,t.n.b-i.d+e.b)),Yjn(n,new dP(t.n.a+t.o.a+i.c+e.a,t.n.b+t.o.b+i.a+e.b))}function FAn(n,t,e){var i,r,c;for(t.p=e,c=NU(Wen(Pun(Gk(xnt,1),HWn,20,0,[new Hw(t),new Gw(t)])));dAn(c);)-1==(i=BB(U5(c),11)).p&&FAn(n,i,e);if(t.i.k==(uSn(),Put))for(r=new Wb(t.i.j);r.a<r.c.c.length;)(i=BB(n0(r),11))!=t&&-1==i.p&&FAn(n,i,e)}function BAn(n){var t,i,r,c,a;if(c=BB(P4($Z(a1(n)),m9(new H,new B,new rn,Pun(Gk(nit,1),$Vn,132,0,[(qsn(),Uet)]))),15),r=ZJn,c.gc()>=2)for(t=MD((i=c.Kc()).Pb());i.Ob();)a=t,t=MD(i.Pb()),r=e.Math.min(r,(kW(t),t-(kW(a),a)));return r}function HAn(n,t){var e,i,r,c,a;r5(i=new YT,t,i.c.b,i.c);do{for(Px(0!=i.b),e=BB(Atn(i,i.a.a),86),n.b[e.g]=1,c=spn(e.d,0);c.b!=c.d.c;)a=(r=BB(b3(c),188)).c,1==n.b[a.g]?DH(n.a,r):2==n.b[a.g]?n.b[a.g]=1:r5(i,a,i.c.b,i.c)}while(0!=i.b)}function qAn(n,t){var e,i,r;if(GI(t)===GI(yX(n)))return!0;if(!cL(t,15))return!1;if(i=BB(t,15),(r=n.gc())!=i.gc())return!1;if(cL(i,54)){for(e=0;e<r;e++)if(!wW(n.Xb(e),i.Xb(e)))return!1;return!0}return Uvn(n.Kc(),i.Kc())}function GAn(n,t){var e;if(0!=n.c.length){if(2==n.c.length)hFn((l1(0,n.c.length),BB(n.c[0],10)),(Xyn(),jCt)),hFn((l1(1,n.c.length),BB(n.c[1],10)),ECt);else for(e=new Wb(n);e.a<e.c.c.length;)hFn(BB(n0(e),10),t);n.c=x8(Ant,HWn,1,0,5,1)}}function zAn(n){var t,e;if(2!=n.c.length)throw Hp(new Fy("Order only allowed for two paths."));l1(0,n.c.length),t=BB(n.c[0],17),l1(1,n.c.length),e=BB(n.c[1],17),t.d.i!=e.c.i&&(n.c=x8(Ant,HWn,1,0,5,1),n.c[n.c.length]=e,n.c[n.c.length]=t)}function UAn(n,t){var e,i,r,c,a;for(i=new v4,c=S4(new Jy(n.g)).a.ec().Kc();c.Ob();){if(!(r=BB(c.Pb(),10))){OH(t,"There are no classes in a balanced layout.");break}(e=BB(lnn(i,a=n.j[r.p]),15))||Jgn(i,a,e=new Np),e.Fc(r)}return i}function XAn(n,t,e){var i,r,c,a;if(e)for(r=((i=new hz(e.a.length)).b-i.a)*i.c<0?(eS(),MNt):new XL(i);r.Ob();)(c=x2(e,BB(r.Pb(),19).a))&&(a=Ken(R2(c,O6n),t),VW(n.f,a,c),q6n in c.a&&$in(a,R2(c,q6n)),STn(c,a),OCn(c,a))}function WAn(n,t){var e,i,r;for(OTn(t,"Port side processing",1),r=new Wb(n.a);r.a<r.c.c.length;)cBn(BB(n0(r),10));for(e=new Wb(n.b);e.a<e.c.c.length;)for(i=new Wb(BB(n0(e),29).a);i.a<i.c.c.length;)cBn(BB(n0(i),10));HSn(t)}function VAn(n,t,e){var i,r,c,a,u;if(!(r=n.f)&&(r=BB(n.a.a.ec().Kc().Pb(),57)),Fkn(r,t,e),1!=n.a.a.gc())for(i=t*e,a=n.a.a.ec().Kc();a.Ob();)(c=BB(a.Pb(),57))!=r&&((u=f3(c)).f.d?(c.d.d+=i+fJn,c.d.a-=i+fJn):u.f.a&&(c.d.a-=i+fJn))}function QAn(n,t,i,r,c){var a,u,o,s,h,f,l,b,w;return u=i-n,o=r-t,s=(a=e.Math.atan2(u,o))+JJn,h=a-JJn,f=c*e.Math.sin(s)+n,b=c*e.Math.cos(s)+t,l=c*e.Math.sin(h)+n,w=c*e.Math.cos(h)+t,u6(Pun(Gk(PMt,1),sVn,8,0,[new xC(f,b),new xC(l,w)]))}function YAn(n,t,i,r){var c,a,u,o,s,h,f,l;c=i,a=f=t;do{a=n.a[a.p],l=n.g[a.p],o=Gy(n.p[l.p])+Gy(n.d[a.p])-a.d.d,(s=Ain(a,r))&&(h=n.g[s.p],u=Gy(n.p[h.p])+Gy(n.d[s.p])+s.o.b+s.d.a,c=e.Math.min(c,o-(u+K$(n.k,a,s))))}while(f!=a);return c}function JAn(n,t,i,r){var c,a,u,o,s,h,f,l;c=i,a=f=t;do{a=n.a[a.p],l=n.g[a.p],u=Gy(n.p[l.p])+Gy(n.d[a.p])+a.o.b+a.d.a,(s=_un(a,r))&&(h=n.g[s.p],o=Gy(n.p[h.p])+Gy(n.d[s.p])-s.d.d,c=e.Math.min(c,o-(u+K$(n.k,a,s))))}while(f!=a);return c}function ZAn(n,t){var e,i;return!n.o&&(n.o=new y9((CXn(),MOt),rAt,n,0)),null!=(i=cdn(n.o,t))?i:(cL(e=t.wg(),4)&&(null==e?(!n.o&&(n.o=new y9((CXn(),MOt),rAt,n,0)),Wdn(n.o,t)):(!n.o&&(n.o=new y9((CXn(),MOt),rAt,n,0)),vjn(n.o,t,e))),e)}function n$n(){n$n=O,ICt=new GC("H_LEFT",0),CCt=new GC("H_CENTER",1),ACt=new GC("H_RIGHT",2),DCt=new GC("V_TOP",3),xCt=new GC("V_CENTER",4),NCt=new GC("V_BOTTOM",5),$Ct=new GC("INSIDE",6),LCt=new GC("OUTSIDE",7),OCt=new GC("H_PRIORITY",8)}function t$n(n){var t,e,i,r,c,a,u;if((t=n.Hh(V9n))&&null!=(u=SD(cdn((!t.b&&(t.b=new Jx((gWn(),k$t),X$t,t)),t.b),"settingDelegates")))){for(e=new Np,c=0,a=(r=kKn(u,"\\w+")).length;c<a;++c)i=r[c],e.c[e.c.length]=i;return e}return SQ(),SQ(),set}function e$n(n,t){var e,i,r,c,a,u,o;if(!t.f)throw Hp(new _y("The input edge is not a tree edge."));for(c=null,r=DWn,i=new Wb(n.d);i.a<i.c.c.length;)u=(e=BB(n0(i),213)).d,o=e.e,FCn(n,u,t)&&!FCn(n,o,t)&&(a=o.e-u.e-e.a)<r&&(r=a,c=e);return c}function i$n(n){var t,e,i,r,c,a;if(!(n.f.e.c.length<=1)){t=0,r=aAn(n),e=RQn;do{for(t>0&&(r=e),a=new Wb(n.f.e);a.a<a.c.c.length;)qy(TD(mMn(c=BB(n0(a),144),(rkn(),yat))))||(i=Z_n(n,c),UR(kO(c.d),i));e=aAn(n)}while(!JX(n,t++,r,e))}}function r$n(n,t){var e,i,r;for(OTn(t,"Layer constraint preprocessing",1),e=new Np,r=new M2(n.a,0);r.b<r.d.gc();)Px(r.b<r.d.gc()),Wun(i=BB(r.d.Xb(r.c=r.b++),10))&&(cTn(i),e.c[e.c.length]=i,fW(r));0==e.c.length||hon(n,(hWn(),nlt),e),HSn(t)}function c$n(n,t){var e,i,r,c,a;for(c=n.g.a,a=n.g.b,i=new Wb(n.d);i.a<i.c.c.length;)r=(e=BB(n0(i),70)).n,n.a==(Oun(),mst)||n.i==(kUn(),oIt)?r.a=c:n.a==yst||n.i==(kUn(),CIt)?r.a=c+n.j.a-e.o.a:r.a=c+(n.j.a-e.o.a)/2,r.b=a,UR(r,t),a+=e.o.b+n.e}function a$n(n,t,e){var i,r,c,a;for(OTn(e,"Processor set coordinates",1),n.a=0==t.b.b?1:t.b.b,c=null,i=spn(t.b,0);!c&&i.b!=i.d.c;)qy(TD(mMn(a=BB(b3(i),86),(qqn(),dkt))))&&(c=a,(r=a.e).a=BB(mMn(a,gkt),19).a,r.b=0);_Sn(n,xun(c),mcn(e,1)),HSn(e)}function u$n(n,t,e){var i,r,c;for(OTn(e,"Processor determine the height for each level",1),n.a=0==t.b.b?1:t.b.b,r=null,i=spn(t.b,0);!r&&i.b!=i.d.c;)qy(TD(mMn(c=BB(b3(i),86),(qqn(),dkt))))&&(r=c);r&&Zxn(n,u6(Pun(Gk(Yyt,1),tZn,86,0,[r])),e),HSn(e)}function o$n(n,t){var e,i,r,c,a;(c=D2(n,"individualSpacings"))&&(!P8(t,(sWn(),CPt))&&(e=new Yu,Ypn(t,CPt,e)),r=BB(ZAn(t,CPt),373),i=null,(a=c)&&(i=new TT(a,jrn(a,x8(Qtt,sVn,2,0,6,1)))),i&&e5(i,new dI(a,r)))}function s$n(n,t){var e,i,r,c,a,u;return c=null,(J6n in(a=n).a||Z6n in a.a||D6n in a.a)&&(u=qun(t),i=D2(a,J6n),Own(new Hg(u).a,i),r=D2(a,Z6n),Iwn(new Jg(u).a,r),e=N2(a,D6n),PEn(new tp(u).a,e),c=e),c}function h$n(n,t){var e,i,r;if(t===n)return!0;if(cL(t,543)){if(r=BB(t,835),n.a.d!=r.a.d||EV(n).gc()!=EV(r).gc())return!1;for(i=EV(r).Kc();i.Ob();)if(c1(n,(e=BB(i.Pb(),416)).a.cd())!=BB(e.a.dd(),14).gc())return!1;return!0}return!1}function f$n(n){var t,e,i,r;return t=i=BB(n.a,19).a,e=r=BB(n.b,19).a,0==i&&0==r?e-=1:-1==i&&r<=0?(t=0,e-=2):i<=0&&r>0?(t-=1,e-=1):i>=0&&r<0?(t+=1,e+=1):i>0&&r>=0?(t-=1,e+=1):(t+=1,e-=1),new rI(iln(t),iln(e))}function l$n(n,t){return n.c<t.c?-1:n.c>t.c?1:n.b<t.b?-1:n.b>t.b?1:n.a!=t.a?nsn(n.a)-nsn(t.a):n.d==(Q4(),Hmt)&&t.d==Bmt?-1:n.d==Bmt&&t.d==Hmt?1:0}function b$n(n,t){var e,i,r,c,a;return a=(c=t.a).c.i==t.b?c.d:c.c,i=c.c.i==t.b?c.c:c.d,(r=zwn(n.a,a,i))>0&&r<ZJn?(e=YAn(n.a,i.i,r,n.c),ren(n.a,i.i,-e),e>0):r<0&&-r<ZJn&&(e=JAn(n.a,i.i,-r,n.c),ren(n.a,i.i,e),e>0)}function w$n(n,t,e,i){var r,c,a,u,o,s;for(r=(t-n.d)/n.c.c.length,c=0,n.a+=e,n.d=t,s=new Wb(n.c);s.a<s.c.c.length;)u=(o=BB(n0(s),33)).g,a=o.f,Pen(o,o.i+c*r),Cen(o,o.j+i*e),Sen(o,o.g+r),Men(o,n.a),++c,lCn(o,new xC(o.g,o.f),new xC(u,a))}function d$n(n){var t,e,i,r,c,a,u;if(null==n)return null;for(u=n.length,a=x8(NNt,v6n,25,r=(u+1)/2|0,15,1),u%2!=0&&(a[--r]=ZDn((b1(u-1,n.length),n.charCodeAt(u-1)))),e=0,i=0;e<r;++e)t=ZDn(fV(n,i++)),c=ZDn(fV(n,i++)),a[e]=(t<<4|c)<<24>>24;return a}function g$n(n){if(n.pe()){var t=n.c;return t.qe()?n.o="["+t.n:t.pe()?n.o="["+t.ne():n.o="[L"+t.ne()+";",n.b=t.me()+"[]",void(n.k=t.oe()+"[]")}var e=n.j,i=n.d;i=i.split("/"),n.o=Fdn(".",[e,Fdn("$",i)]),n.b=Fdn(".",[e,Fdn(".",i)]),n.k=i[i.length-1]}function p$n(n,t){var e,i,r,c,a;for(a=null,c=new Wb(n.e.a);c.a<c.c.c.length;)if((r=BB(n0(c),121)).b.a.c.length==r.g.a.c.length){for(i=r.e,a=ePn(r),e=r.e-BB(a.a,19).a+1;e<r.e+BB(a.b,19).a;e++)t[e]<t[i]&&(i=e);t[i]<t[r.e]&&(--t[r.e],++t[i],r.e=i)}}function v$n(n){var t,i,r,c,a,u,o;for(r=RQn,i=KQn,t=new Wb(n.e.b);t.a<t.c.c.length;)for(a=new Wb(BB(n0(t),29).a);a.a<a.c.c.length;)c=BB(n0(a),10),u=(o=Gy(n.p[c.p]))+Gy(n.b[n.g[c.p].p]),r=e.Math.min(r,o),i=e.Math.max(i,u);return i-r}function m$n(n,t,e,i){var r,c,a,u,o,s;for(o=null,u=0,s=(r=jKn(n,t)).gc();u<s;++u)if(mK(i,kV(B7(n,c=BB(r.Xb(u),170)))))if(a=jV(B7(n,c)),null==e){if(null==a)return c;!o&&(o=c)}else{if(mK(e,a))return c;null==a&&!o&&(o=c)}return null}function y$n(n,t,e,i){var r,c,a,u,o,s;for(o=null,u=0,s=(r=EKn(n,t)).gc();u<s;++u)if(mK(i,kV(B7(n,c=BB(r.Xb(u),170)))))if(a=jV(B7(n,c)),null==e){if(null==a)return c;!o&&(o=c)}else{if(mK(e,a))return c;null==a&&!o&&(o=c)}return null}function k$n(n,t,e){var i,r,c,a,u,o;if(a=new go,u=axn(n.e.Tg(),t),i=BB(n.g,119),ZM(),BB(t,66).Oj())for(c=0;c<n.i;++c)r=i[c],u.rl(r.ak())&&f9(a,r);else for(c=0;c<n.i;++c)r=i[c],u.rl(r.ak())&&(o=r.dd(),f9(a,e?FIn(n,t,c,a.i,o):o));return N3(a)}function j$n(n,t){var e,i,r,c;for(e=new Hbn(uht),$Pn(),r=0,c=(i=Pun(Gk(uht,1),$Vn,227,0,[Zst,tht,Jst,nht,eht,Yst])).length;r<c;++r)wR(e,i[r],new Np);return JT($V(AV(wnn(new Rq(null,new w1(n.b,16)),new Ze),new ni),new hd(t)),new fd(e)),e}function E$n(n,t,i){var r,c,a,u,o,s,h,f;for(a=t.Kc();a.Ob();)s=(c=BB(a.Pb(),33)).i+c.g/2,f=c.j+c.f/2,o=s-((u=n.f).i+u.g/2),h=f-(u.j+u.f/2),r=e.Math.sqrt(o*o+h*h),o*=n.e/r,h*=n.e/r,i?(s-=o,f-=h):(s+=o,f+=h),Pen(c,s-c.g/2),Cen(c,f-c.f/2)}function T$n(n){var t,e,i;if(!n.c&&null!=n.b){for(t=n.b.length-4;t>=0;t-=2)for(e=0;e<=t;e+=2)(n.b[e]>n.b[e+2]||n.b[e]===n.b[e+2]&&n.b[e+1]>n.b[e+3])&&(i=n.b[e+2],n.b[e+2]=n.b[e],n.b[e]=i,i=n.b[e+3],n.b[e+3]=n.b[e+1],n.b[e+1]=i);n.c=!0}}function M$n(n,t){var e,i,r,c,a,u;for(c=(1==t?Wat:Xat).a.ec().Kc();c.Ob();)for(r=BB(c.Pb(),103),u=BB(h6(n.f.c,r),21).Kc();u.Ob();)switch(a=BB(u.Pb(),46),i=BB(a.b,81),e=BB(a.a,189).c,r.g){case 2:case 1:i.g.d+=e;break;case 4:case 3:i.g.c+=e}}function S$n(n,t){var e,i,r,c,a,u,o,s,h;for(s=-1,h=0,u=0,o=(a=n).length;u<o;++u){for(c=a[u],e=new kH(-1==s?n[0]:n[s],t,(Mhn(),uvt)),i=0;i<c.length;i++)for(r=i+1;r<c.length;r++)Lx(c[i],(hWn(),wlt))&&Lx(c[r],wlt)&&fXn(e,c[i],c[r])>0&&++h;++s}return h}function P$n(n){var t;return(t=new lN(nE(n.gm))).a+="@",oO(t,(nsn(n)>>>0).toString(16)),n.kh()?(t.a+=" (eProxyURI: ",uO(t,n.qh()),n.$g()&&(t.a+=" eClass: ",uO(t,n.$g())),t.a+=")"):n.$g()&&(t.a+=" (eClass: ",uO(t,n.$g()),t.a+=")"),t.a}function C$n(n){var t,e,i;if(n.e)throw Hp(new Fy((ED(git),AYn+git.k+$Yn)));for(n.d==(Ffn(),BPt)&&Tzn(n,_Pt),e=new Wb(n.a.a);e.a<e.c.c.length;)(t=BB(n0(e),307)).g=t.i;for(i=new Wb(n.a.b);i.a<i.c.c.length;)BB(n0(i),57).i=KQn;return n.b.Le(n),n}function I$n(n,t){var e,i,r,c,a;if(t<2*n.b)throw Hp(new _y("The knot vector must have at least two time the dimension elements."));for(n.f=1,r=0;r<n.b;r++)WB(n.e,0);for(e=a=t+1-2*n.b,c=1;c<a;c++)WB(n.e,c/e);if(n.d)for(i=0;i<n.b;i++)WB(n.e,1)}function O$n(n,t){var e,i,r,c,a;if(c=t,!(a=BB(Uin(PX(n.i),c),33)))throw Hp(new ek("Unable to find elk node for json object '"+R2(c,q6n)+"' Panic!"));i=N2(c,"edges"),LIn((e=new uI(n,a)).a,e.b,i),r=N2(c,A6n),Dkn(new Ng(n).a,r)}function A$n(n,t,e,i){var r,c,a,u,o;if(null!=i){if(r=n.d[t])for(c=r.g,o=r.i,u=0;u<o;++u)if((a=BB(c[u],133)).Sh()==e&&Nfn(i,a.cd()))return u}else if(r=n.d[t])for(c=r.g,o=r.i,u=0;u<o;++u)if(GI((a=BB(c[u],133)).cd())===GI(i))return u;return-1}function $$n(n,t){var e,i;return cL(e=null==t?qI(AY(n.f,null)):hS(n.g,t),235)?((i=BB(e,235)).Qh(),i):cL(e,498)?((i=BB(e,1938).a)&&(null==i.yb||(null==t?jCn(n.f,null,i):ubn(n.g,t,i))),i):null}function L$n(n){var t,e,i,r,c,a,u;if(KDn(),null==n)return null;if((r=n.length)%2!=0)return null;for(t=V7(n),e=x8(NNt,v6n,25,c=r/2|0,15,1),i=0;i<c;i++){if(-1==(a=QLt[t[2*i]]))return null;if(-1==(u=QLt[t[2*i+1]]))return null;e[i]=(a<<4|u)<<24>>24}return e}function N$n(n,t,e){var i,r,c;if(!(r=BB(oV(n.i,t),306)))if(r=new wtn(n.d,t,e),mG(n.i,t,r),agn(t))EL(n.a,t.c,t.b,r);else switch(c=LPn(t),i=BB(oV(n.p,c),244),c.g){case 1:case 3:r.j=!0,jy(i,t.b,r);break;case 4:case 2:r.k=!0,jy(i,t.c,r)}return r}function x$n(n,t,e,i){var r,c,a,u,o,s;if(u=new go,o=axn(n.e.Tg(),t),r=BB(n.g,119),ZM(),BB(t,66).Oj())for(a=0;a<n.i;++a)c=r[a],o.rl(c.ak())&&f9(u,c);else for(a=0;a<n.i;++a)c=r[a],o.rl(c.ak())&&(s=c.dd(),f9(u,i?FIn(n,t,a,u.i,s):s));return Qwn(u,e)}function D$n(n,t){var i,r,c,a,u,o;if((r=n.b[t.p])>=0)return r;for(c=1,a=new Wb(t.j);a.a<a.c.c.length;)for(i=new Wb(BB(n0(a),11).g);i.a<i.c.c.length;)t!=(o=BB(n0(i),17).d.i)&&(u=D$n(n,o),c=e.Math.max(c,u+1));return iwn(n,t,c),c}function R$n(n,t,e){var i,r,c;for(i=1;i<n.c.length;i++){for(l1(i,n.c.length),c=BB(n.c[i],10),r=i;r>0&&t.ue((l1(r-1,n.c.length),BB(n.c[r-1],10)),c)>0;)c5(n,r,(l1(r-1,n.c.length),BB(n.c[r-1],10))),--r;l1(r,n.c.length),n.c[r]=c}e.a=new xp,e.b=new xp}function K$n(n,t,e){var i,r,c,a,u,o,s;for(s=new YK(i=BB(t.e&&t.e(),9),BB(SR(i,i.length),9),0),a=0,u=(c=kKn(e,"[\\[\\]\\s,]+")).length;a<u;++a)if(0!=RMn(r=c[a]).length){if(null==(o=HIn(n,r)))return null;orn(s,BB(o,22))}return s}function _$n(n){var t,i,r;for(i=new Wb(n.a.a.b);i.a<i.c.c.length;)t=BB(n0(i),81),kW(0),(r=0)>0&&((!dA(n.a.c)||!t.n.d)&&(!gA(n.a.c)||!t.n.b)&&(t.g.d-=e.Math.max(0,r/2-.5)),(!dA(n.a.c)||!t.n.a)&&(!gA(n.a.c)||!t.n.c)&&(t.g.a+=e.Math.max(0,r-1)))}function F$n(n,t,e){var i;if(2==(n.c-n.b&n.a.length-1))t==(kUn(),sIt)||t==oIt?(jtn(BB(Eon(n),15),(Xyn(),jCt)),jtn(BB(Eon(n),15),ECt)):(jtn(BB(Eon(n),15),(Xyn(),ECt)),jtn(BB(Eon(n),15),jCt));else for(i=new bV(n);i.a!=i.b;)jtn(BB(_hn(i),15),e)}function B$n(n,t){var e,i,r,c,a,u;for(a=new M2(i=HB(new sp(n)),i.c.length),u=new M2(r=HB(new sp(t)),r.c.length),c=null;a.b>0&&u.b>0&&(Px(a.b>0),e=BB(a.a.Xb(a.c=--a.b),33),Px(u.b>0),e==BB(u.a.Xb(u.c=--u.b),33));)c=e;return c}function H$n(n,t){var i,r,c,a;return c=n.a*aYn+1502*n.b,a=n.b*aYn+11,c+=i=e.Math.floor(a*uYn),a-=i*oYn,c%=oYn,n.a=c,n.b=a,t<=24?e.Math.floor(n.a*Oet[t]):((r=n.a*(1<<t-24)+e.Math.floor(n.b*Aet[t]))>=2147483648&&(r-=XQn),r)}function q$n(n,t,e){var i,r,c,a;w0(n,t)>w0(n,e)?(i=abn(e,(kUn(),oIt)),n.d=i.dc()?0:uq(BB(i.Xb(0),11)),a=abn(t,CIt),n.b=a.dc()?0:uq(BB(a.Xb(0),11))):(r=abn(e,(kUn(),CIt)),n.d=r.dc()?0:uq(BB(r.Xb(0),11)),c=abn(t,oIt),n.b=c.dc()?0:uq(BB(c.Xb(0),11)))}function G$n(n){var t,e,i,r,c,a,u;if(n&&(t=n.Hh(V9n))&&null!=(a=SD(cdn((!t.b&&(t.b=new Jx((gWn(),k$t),X$t,t)),t.b),"conversionDelegates")))){for(u=new Np,r=0,c=(i=kKn(a,"\\w+")).length;r<c;++r)e=i[r],u.c[u.c.length]=e;return u}return SQ(),SQ(),set}function z$n(n,t){var e,i,r,c;for(e=n.o.a,c=BB(BB(h6(n.r,t),21),84).Kc();c.Ob();)(r=BB(c.Pb(),111)).e.a=e*Gy(MD(r.b.We(Lrt))),r.e.b=(i=r.b).Xe((sWn(),aPt))?i.Hf()==(kUn(),sIt)?-i.rf().b-Gy(MD(i.We(aPt))):Gy(MD(i.We(aPt))):i.Hf()==(kUn(),sIt)?-i.rf().b:0}function U$n(n){var t,e,i,r,c,a,u,o;t=!0,r=null,c=null;n:for(o=new Wb(n.a);o.a<o.c.c.length;)for(i=new oz(ZL(fbn(u=BB(n0(o),10)).a.Kc(),new h));dAn(i);){if(e=BB(U5(i),17),r&&r!=u){t=!1;break n}if(r=u,a=e.c.i,c&&c!=a){t=!1;break n}c=a}return t}function X$n(n,t,e){var i,r,c,a,u,o;for(c=-1,u=-1,a=0;a<t.c.length&&(l1(a,t.c.length),!((r=BB(t.c[a],329)).c>n.c));a++)r.a>=n.s&&(c<0&&(c=a),u=a);return o=(n.s+n.c)/2,c>=0&&(o=qM((l1(i=YRn(n,t,c,u),t.c.length),BB(t.c[i],329))),lOn(t,i,e)),o}function W$n(){W$n=O,lEt=new XA((sWn(),cSt),1.3),gEt=jSt,IEt=new WA(15),CEt=new XA(XSt,IEt),$Et=new XA(LPt,15),bEt=hSt,jEt=KSt,EEt=BSt,TEt=qSt,kEt=DSt,MEt=USt,OEt=fPt,$An(),PEt=oEt,yEt=aEt,SEt=uEt,AEt=hEt,pEt=cEt,vEt=CSt,mEt=ISt,dEt=rEt,wEt=iEt,LEt=fEt}function V$n(n,t,e){var i,r,c,a,u;for(Bin(r=new jo,(kW(t),t)),!r.b&&(r.b=new Jx((gWn(),k$t),X$t,r)),u=r.b,a=1;a<e.length;a+=2)vjn(u,e[a-1],e[a]);for(!n.Ab&&(n.Ab=new eU(KAt,n,0,3)),i=n.Ab,c=0;c<0;++c)i=mW(BB(Wtn(i,i.i-1),590));f9(i,r)}function Q$n(n,t,e){var i,r,c;for(LD.call(this,new Np),this.a=t,this.b=e,this.e=n,n.b&&VBn(n),i=n.a,this.d=JV(i.a,this.a),this.c=JV(i.b,this.b),obn(this,this.d,this.c),mIn(this),c=this.e.e.a.ec().Kc();c.Ob();)(r=BB(c.Pb(),266)).c.c.length>0&&xqn(this,r)}function Y$n(n,t,e,i,r,c){var a,u,o;if(!r[t.b]){for(r[t.b]=!0,!(a=i)&&(a=new y6),WB(a.e,t),o=c[t.b].Kc();o.Ob();)(u=BB(o.Pb(),282)).d!=e&&u.c!=e&&(u.c!=t&&Y$n(n,u.c,t,a,r,c),u.d!=t&&Y$n(n,u.d,t,a,r,c),WB(a.c,u),gun(a.d,u.b));return a}return null}function J$n(n){var t,e,i;for(t=0,e=new Wb(n.e);e.a<e.c.c.length;)o5(new Rq(null,new w1(BB(n0(e),17).b,16)),new pe)&&++t;for(i=new Wb(n.g);i.a<i.c.c.length;)o5(new Rq(null,new w1(BB(n0(i),17).b,16)),new ve)&&++t;return t>=2}function Z$n(n,t){var e,i,r,c;for(OTn(t,"Self-Loop pre-processing",1),i=new Wb(n.a);i.a<i.c.c.length;)Kbn(e=BB(n0(i),10))&&(c=new Ogn(e),hon(e,(hWn(),Olt),c),k_n(c),JT($V(wnn(new Rq(null,new w1((r=c).d,16)),new Hi),new qi),new Gi),ixn(r));HSn(t)}function nLn(n,t,e,i,r){var c,a,u,o,s;for(c=n.c.d.j,a=BB(Dpn(e,0),8),s=1;s<e.b;s++)o=BB(Dpn(e,s),8),r5(i,a,i.c.b,i.c),u=kL(UR(new wA(a),o),.5),UR(u,kL(new XZ(hsn(c)),r)),r5(i,u,i.c.b,i.c),a=o,c=0==t?Mln(c):Eln(c);DH(i,(Px(0!=e.b),BB(e.c.b.c,8)))}function tLn(n){return n$n(),!(Can(OJ(EG($Ct,Pun(Gk(GCt,1),$Vn,93,0,[LCt])),n))>1||Can(OJ(EG(ICt,Pun(Gk(GCt,1),$Vn,93,0,[CCt,ACt])),n))>1||Can(OJ(EG(DCt,Pun(Gk(GCt,1),$Vn,93,0,[xCt,NCt])),n))>1)}function eLn(n,t){var e,i,r;return(e=t.Hh(n.a))&&null!=(r=SD(cdn((!e.b&&(e.b=new Jx((gWn(),k$t),X$t,e)),e.b),"affiliation")))?-1==(i=mN(r,YTn(35)))?uln(n,az(n,Utn(t.Hj())),r):0==i?uln(n,null,r.substr(1)):uln(n,r.substr(0,i),r.substr(i+1)):null}function iLn(n){var t,e;try{return null==n?zWn:Bbn(n)}catch(i){if(cL(i=lun(i),102))return t=i,e=nE(tsn(n))+"@"+($T(),(evn(n)>>>0).toString(16)),Kgn(jun(),(lM(),"Exception during lenientFormat for "+e),t),"<"+e+" threw "+nE(t.gm)+">";throw Hp(i)}}function rLn(n){switch(n.g){case 0:return new of;case 1:return new ef;case 2:return new $M;case 3:return new Ic;case 4:return new RR;case 5:return new sf;default:throw Hp(new _y("No implementation is available for the layerer "+(null!=n.f?n.f:""+n.g)))}}function cLn(n,t,e){var i,r,c;for(c=new Wb(n.t);c.a<c.c.c.length;)(i=BB(n0(c),268)).b.s<0&&i.c>0&&(i.b.n-=i.c,i.b.n<=0&&i.b.u>0&&DH(t,i.b));for(r=new Wb(n.i);r.a<r.c.c.length;)(i=BB(n0(r),268)).a.s<0&&i.c>0&&(i.a.u-=i.c,i.a.u<=0&&i.a.n>0&&DH(e,i.a))}function aLn(n){var t,e,i;if(null==n.g&&(n.d=n.si(n.f),f9(n,n.d),n.c))return n.f;if(i=(t=BB(n.g[n.i-1],47)).Pb(),n.e=t,(e=n.si(i)).Ob())n.d=e,f9(n,e);else for(n.d=null;!t.Ob()&&($X(n.g,--n.i,null),0!=n.i);)t=BB(n.g[n.i-1],47);return i}function uLn(n,t){var e,i,r,c,a,u;if(r=(i=t).ak(),$xn(n.e,r)){if(r.hi()&&G3(n,r,i.dd()))return!1}else for(u=axn(n.e.Tg(),r),e=BB(n.g,119),c=0;c<n.i;++c)if(a=e[c],u.rl(a.ak()))return!Nfn(a,i)&&(BB(ovn(n,c,t),72),!0);return f9(n,t)}function oLn(n,t,i,r){var c,a,u;for(Bl(c=new $vn(n),(uSn(),Sut)),hon(c,(hWn(),dlt),t),hon(c,Plt,r),hon(c,(HXn(),ept),(QEn(),XCt)),hon(c,hlt,t.c),hon(c,flt,t.d),zxn(t,c),u=e.Math.floor(i/2),a=new Wb(c.j);a.a<a.c.c.length;)BB(n0(a),11).n.b=u;return c}function sLn(n,t){var e,i,r,c,a,u,o,s,h;for(o=sx(n.c-n.b&n.a.length-1),s=null,h=null,c=new bV(n);c.a!=c.b;)r=BB(_hn(c),10),e=(u=BB(mMn(r,(hWn(),hlt)),11))?u.i:null,i=(a=BB(mMn(r,flt),11))?a.i:null,s==e&&h==i||(GAn(o,t),s=e,h=i),o.c[o.c.length]=r;GAn(o,t)}function hLn(n){var t,i,r,c,a,u;for(t=0,i=new Wb(n.a);i.a<i.c.c.length;)for(c=new oz(ZL(lbn(BB(n0(i),10)).a.Kc(),new h));dAn(c);)n==(r=BB(U5(c),17)).d.i.c&&r.c.j==(kUn(),CIt)&&(a=g1(r.c).b,u=g1(r.d).b,t=e.Math.max(t,e.Math.abs(u-a)));return t}function fLn(n,t,e){var i,r;OTn(e,"Remove overlaps",1),e.n&&t&&y0(e,o2(t),(Bsn(),uOt)),i=BB(ZAn(t,(wD(),Vkt)),33),n.f=i,n.a=Evn(BB(ZAn(t,(Uyn(),Rjt)),293)),ib(n,(kW(r=MD(ZAn(t,(sWn(),LPt)))),r)),Xzn(n,t,wDn(i),e),e.n&&t&&y0(e,o2(t),(Bsn(),uOt))}function lLn(n,t,i){switch(i.g){case 1:return new xC(t.a,e.Math.min(n.d.b,t.b));case 2:return new xC(e.Math.max(n.c.a,t.a),t.b);case 3:return new xC(t.a,e.Math.max(n.c.b,t.b));case 4:return new xC(e.Math.min(t.a,n.d.a),t.b)}return new xC(t.a,t.b)}function bLn(n,t,e,i){var r,c,a,u,o,s,h,f,l;for(f=i?(kUn(),CIt):(kUn(),oIt),r=!1,s=0,h=(o=t[e]).length;s<h;++s)LK(BB(mMn(u=o[s],(HXn(),ept)),98))||(a=u.e,(l=!abn(u,f).dc()&&!!a)&&(c=qEn(a),n.b=new zEn(c,i?0:c.length-1)),r|=c_n(n,u,f,l));return r}function wLn(n){var t,e,i;for(WB(t=sx(1+(!n.c&&(n.c=new eU(XOt,n,9,9)),n.c).i),(!n.d&&(n.d=new hK(_Ot,n,8,5)),n.d)),i=new AL((!n.c&&(n.c=new eU(XOt,n,9,9)),n.c));i.e!=i.i.gc();)WB(t,(!(e=BB(kpn(i),118)).d&&(e.d=new hK(_Ot,e,8,5)),e.d));return yX(t),new OO(t)}function dLn(n){var t,e,i;for(WB(t=sx(1+(!n.c&&(n.c=new eU(XOt,n,9,9)),n.c).i),(!n.e&&(n.e=new hK(_Ot,n,7,4)),n.e)),i=new AL((!n.c&&(n.c=new eU(XOt,n,9,9)),n.c));i.e!=i.i.gc();)WB(t,(!(e=BB(kpn(i),118)).e&&(e.e=new hK(_Ot,e,7,4)),e.e));return yX(t),new OO(t)}function gLn(n){var t,e,i,r;if(null==n)return null;if(i=FBn(n,!0),r=x7n.length,mK(i.substr(i.length-r,r),x7n))if(4==(e=i.length)){if(b1(0,i.length),43==(t=i.charCodeAt(0)))return HLt;if(45==t)return BLt}else if(3==e)return HLt;return bSn(i)}function pLn(n){var t,e,i,r;for(t=0,e=0,r=new Wb(n.j);r.a<r.c.c.length;)if(t=dG(rbn(t,q6(AV(new Rq(null,new w1((i=BB(n0(r),11)).e,16)),new Yc)))),e=dG(rbn(e,q6(AV(new Rq(null,new w1(i.g,16)),new Jc)))),t>1||e>1)return 2;return t+e==1?2:0}function vLn(n,t,e){var i,r,c,a;for(OTn(e,"ELK Force",1),qy(TD(ZAn(t,(fRn(),Wct))))||jJ(new Tw((GM(),new Dy(t)))),kkn(a=fon(t)),zon(n,BB(mMn(a,Gct),424)),r=(c=HFn(n.a,a)).Kc();r.Ob();)i=BB(r.Pb(),231),PKn(n.b,i,mcn(e,1/c.gc()));SUn(a=GUn(c)),HSn(e)}function mLn(n,t){var e,i,r;if(OTn(t,"Breaking Point Processor",1),Ozn(n),qy(TD(mMn(n,(HXn(),Gpt))))){for(i=new Wb(n.b);i.a<i.c.c.length;)for(e=0,r=new Wb(BB(n0(i),29).a);r.a<r.c.c.length;)BB(n0(r),10).p=e++;oHn(n),Hxn(n,!0),Hxn(n,!1)}HSn(t)}function yLn(n,t,e){var i,r,c,a,u;for(a=n.c,c=(e.q?e.q:(SQ(),SQ(),het)).vc().Kc();c.Ob();)r=BB(c.Pb(),42),!jE(AV(new Rq(null,new w1(a,16)),new aw(new LC(t,r)))).sd((dM(),tit))&&(cL(u=r.dd(),4)&&null!=(i=Jdn(u))&&(u=i),t.Ye(BB(r.cd(),146),u))}function kLn(n,t){var e,i,r,c;if(t){for(c=!(r=cL(n.Cb,88)||cL(n.Cb,99))&&cL(n.Cb,322),e=new AL((!t.a&&(t.a=new aG(t,VAt,t)),t.a));e.e!=e.i.gc();)if(i=lFn(BB(kpn(e),87)),r?cL(i,88):c?cL(i,148):i)return i;return r?(gWn(),d$t):(gWn(),l$t)}return null}function jLn(n,t){var e,i,r,c,a;for(OTn(t,"Constraints Postprocessor",1),c=0,r=new Wb(n.b);r.a<r.c.c.length;){for(a=0,i=new Wb(BB(n0(r),29).a);i.a<i.c.c.length;)(e=BB(n0(i),10)).k==(uSn(),Cut)&&(hon(e,(HXn(),jgt),iln(c)),hon(e,Bdt,iln(a)),++a);++c}HSn(t)}function ELn(n,t,e,i){var r,c,a,u,o,s;for(XR(u=new xC(e,i),BB(mMn(t,(qqn(),nkt)),8)),s=spn(t.b,0);s.b!=s.d.c;)UR((o=BB(b3(s),86)).e,u),DH(n.b,o);for(a=spn(t.a,0);a.b!=a.d.c;){for(r=spn((c=BB(b3(a),188)).a,0);r.b!=r.d.c;)UR(BB(b3(r),8),u);DH(n.a,c)}}function TLn(n,t,e){var i,r,c;if(!(c=Fqn((IPn(),Z$t),n.Tg(),t)))throw Hp(new _y(r6n+t.ne()+c6n));if(ZM(),!BB(c,66).Oj()&&!(c=Z1(B7(Z$t,c))))throw Hp(new _y(r6n+t.ne()+c6n));r=BB((i=n.Yg(c))>=0?n._g(i,!0,!0):cOn(n,c,!0),153),BB(r,215).ml(t,e)}function MLn(n,t){var e,i,r,c,a;for(e=new Np,r=wnn(new Rq(null,new w1(n,16)),new Ea),c=wnn(new Rq(null,new w1(n,16)),new Ta),a=M7(H6(LV(SNn(Pun(Gk(eit,1),HWn,833,0,[r,c])),new Ma))),i=1;i<a.length;i++)a[i]-a[i-1]>=2*t&&WB(e,new kB(a[i-1]+t,a[i]-t));return e}function SLn(n,t,e){OTn(e,"Eades radial",1),e.n&&t&&y0(e,o2(t),(Bsn(),uOt)),n.d=BB(ZAn(t,(wD(),Vkt)),33),n.c=Gy(MD(ZAn(t,(Uyn(),Djt)))),n.e=Evn(BB(ZAn(t,Rjt),293)),n.a=lwn(BB(ZAn(t,_jt),426)),n.b=qjn(BB(ZAn(t,$jt),340)),rjn(n),e.n&&t&&y0(e,o2(t),(Bsn(),uOt))}function PLn(n,t,e){var i,r,c,a,u;if(e)for(c=((i=new hz(e.a.length)).b-i.a)*i.c<0?(eS(),MNt):new XL(i);c.Ob();)(r=x2(e,BB(c.Pb(),19).a))&&($in(a=$3(n,(tE(),u=new Em,!!t&&BLn(u,t),u),r),R2(r,q6n)),STn(r,a),OCn(r,a),xon(n,r,a))}function CLn(n){var t,e,i,r;if(!n.j){if(r=new Io,null==(t=P$t).a.zc(n,t)){for(i=new AL(kY(n));i.e!=i.i.gc();)pX(r,CLn(e=BB(kpn(i),26))),f9(r,e);t.a.Bc(n)}chn(r),n.j=new NO((BB(Wtn(QQ((QX(),t$t).o),11),18),r.i),r.g),P5(n).b&=-33}return n.j}function ILn(n){var t,e,i,r;if(null==n)return null;if(i=FBn(n,!0),r=x7n.length,mK(i.substr(i.length-r,r),x7n))if(4==(e=i.length)){if(b1(0,i.length),43==(t=i.charCodeAt(0)))return GLt;if(45==t)return qLt}else if(3==e)return GLt;return new Dv(i)}function OLn(n){var t,e,i;return 0!=((e=n.l)&e-1)||0!=((i=n.m)&i-1)||0!=((t=n.h)&t-1)||0==t&&0==i&&0==e?-1:0==t&&0==i&&0!=e?gin(e):0==t&&0!=i&&0==e?gin(i)+22:0!=t&&0==i&&0==e?gin(t)+44:-1}function ALn(n,t){var e,i,r,c;for(OTn(t,"Edge joining",1),e=qy(TD(mMn(n,(HXn(),Dpt)))),i=new Wb(n.b);i.a<i.c.c.length;)for(c=new M2(BB(n0(i),29).a,0);c.b<c.d.gc();)Px(c.b<c.d.gc()),(r=BB(c.d.Xb(c.c=c.b++),10)).k==(uSn(),Put)&&(rGn(r,e),fW(c));HSn(t)}function $Ln(n,t,e){var i;if(h2(n.b),CU(n.b,(Pbn(),HEt),(OM(),GTt)),CU(n.b,qEt,t.g),CU(n.b,GEt,t.a),n.a=$qn(n.b,t),OTn(e,"Compaction by shrinking a tree",n.a.c.length),t.i.c.length>1)for(i=new Wb(n.a);i.a<i.c.c.length;)BB(n0(i),51).pf(t,mcn(e,1));HSn(e)}function LLn(n,t){var e,i,r,c,a;for(r=t.a&n.f,c=null,i=n.b[r];;i=i.b){if(i==t){c?c.b=t.b:n.b[r]=t.b;break}c=i}for(a=t.f&n.f,c=null,e=n.c[a];;e=e.d){if(e==t){c?c.d=t.d:n.c[a]=t.d;break}c=e}t.e?t.e.c=t.c:n.a=t.c,t.c?t.c.e=t.e:n.e=t.e,--n.i,++n.g}function NLn(n){var t,i,r,c,a,u,o,s,h,f;for(i=n.o,t=n.p,u=DWn,c=_Vn,o=DWn,a=_Vn,h=0;h<i;++h)for(f=0;f<t;++f)vmn(n,h,f)&&(u=e.Math.min(u,h),c=e.Math.max(c,h),o=e.Math.min(o,f),a=e.Math.max(a,f));return s=c-u+1,r=a-o+1,new VV(iln(u),iln(o),iln(s),iln(r))}function xLn(n,t){var e,i,r,c;for(Px((c=new M2(n,0)).b<c.d.gc()),e=BB(c.d.Xb(c.c=c.b++),140);c.b<c.d.gc();)Px(c.b<c.d.gc()),r=new mH((i=BB(c.d.Xb(c.c=c.b++),140)).c,e.d,t),Px(c.b>0),c.a.Xb(c.c=--c.b),yR(c,r),Px(c.b<c.d.gc()),c.d.Xb(c.c=c.b++),r.a=!1,e=i}function DLn(n){var t,e,i,r,c;for(i=BB(mMn(n,(hWn(),Kft)),11),c=new Wb(n.j);c.a<c.c.c.length;){for(e=new Wb((r=BB(n0(c),11)).g);e.a<e.c.c.length;)return MZ(BB(n0(e),17),i),r;for(t=new Wb(r.e);t.a<t.c.c.length;)return SZ(BB(n0(t),17),i),r}return null}function RLn(n,t,i){var r,c;Vhn(r=fan(i.q.getTime()),0)<0?(c=VVn-dG(ldn(j7(r),VVn)))==VVn&&(c=0):c=dG(ldn(r,VVn)),1==t?xX(n,48+(c=e.Math.min((c+50)/100|0,9))&QVn):2==t?Enn(n,c=e.Math.min((c+5)/10|0,99),2):(Enn(n,c,3),t>3&&Enn(n,0,t-3))}function KLn(n){var t,e,i,r;return GI(mMn(n,(HXn(),sgt)))===GI((ufn(),pCt))?!n.e&&GI(mMn(n,Rdt))!==GI((Kan(),kft)):(i=BB(mMn(n,Kdt),292),r=qy(TD(mMn(n,Hdt)))||GI(mMn(n,qdt))===GI((Oin(),sht)),t=BB(mMn(n,Ddt),19).a,e=n.a.c.length,!r&&i!=(Kan(),kft)&&(0==t||t>e))}function _Ln(n){var t,e;for(e=0;e<n.c.length&&!(sq((l1(e,n.c.length),BB(n.c[e],113)))>0);e++);if(e>0&&e<n.c.length-1)return e;for(t=0;t<n.c.length&&!(sq((l1(t,n.c.length),BB(n.c[t],113)))>0);t++);return t>0&&e<n.c.length-1?t:n.c.length/2|0}function FLn(n,t){var e,i;if(t!=n.Cb||n.Db>>16!=6&&t){if(vkn(n,t))throw Hp(new _y(w6n+ROn(n)));i=null,n.Cb&&(i=(e=n.Db>>16)>=0?skn(n,i):n.Cb.ih(n,-1-e,null,i)),t&&(i=Npn(t,n,6,i)),(i=QD(n,t,i))&&i.Fi()}else 0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,6,t,t))}function BLn(n,t){var e,i;if(t!=n.Cb||n.Db>>16!=9&&t){if(vkn(n,t))throw Hp(new _y(w6n+URn(n)));i=null,n.Cb&&(i=(e=n.Db>>16)>=0?fkn(n,i):n.Cb.ih(n,-1-e,null,i)),t&&(i=Npn(t,n,9,i)),(i=YD(n,t,i))&&i.Fi()}else 0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,9,t,t))}function HLn(n,t){var e,i;if(t!=n.Cb||n.Db>>16!=3&&t){if(vkn(n,t))throw Hp(new _y(w6n+lHn(n)));i=null,n.Cb&&(i=(e=n.Db>>16)>=0?Mkn(n,i):n.Cb.ih(n,-1-e,null,i)),t&&(i=Npn(t,n,12,i)),(i=VD(n,t,i))&&i.Fi()}else 0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,3,t,t))}function qLn(n){var t,e,i,r,c;if(i=Ikn(n),null==(c=n.j)&&i)return n.$j()?null:i.zj();if(cL(i,148)){if((e=i.Aj())&&(r=e.Nh())!=n.i){if((t=BB(i,148)).Ej())try{n.g=r.Kh(t,c)}catch(a){if(!cL(a=lun(a),78))throw Hp(a);n.g=null}n.i=r}return n.g}return null}function GLn(n){var t;return WB(t=new Np,new xS(new xC(n.c,n.d),new xC(n.c+n.b,n.d))),WB(t,new xS(new xC(n.c,n.d),new xC(n.c,n.d+n.a))),WB(t,new xS(new xC(n.c+n.b,n.d+n.a),new xC(n.c+n.b,n.d))),WB(t,new xS(new xC(n.c+n.b,n.d+n.a),new xC(n.c,n.d+n.a))),t}function zLn(n,t,e,i){var r,c,a;if(a=Ajn(t,e),i.c[i.c.length]=t,-1==n.j[a.p]||2==n.j[a.p]||n.a[t.p])return i;for(n.j[a.p]=-1,c=new oz(ZL(hbn(a).a.Kc(),new h));dAn(c);)if(!b5(r=BB(U5(c),17))&&(b5(r)||r.c.i.c!=r.d.i.c)&&r!=t)return zLn(n,r,a,i);return i}function ULn(n,t,e){var i,r;for(r=t.a.ec().Kc();r.Ob();)i=BB(r.Pb(),79),!BB(RX(n.b,i),266)&&(JJ(PMn(i))==JJ(OMn(i))?tDn(n,i,e):PMn(i)==JJ(OMn(i))?null==RX(n.c,i)&&null!=RX(n.b,OMn(i))&&rzn(n,i,e,!1):null==RX(n.d,i)&&null!=RX(n.b,PMn(i))&&rzn(n,i,e,!0))}function XLn(n,t){var e,i,r,c,a,u,o;for(r=n.Kc();r.Ob();)for(i=BB(r.Pb(),10),CZ(u=new CSn,i),qCn(u,(kUn(),oIt)),hon(u,(hWn(),jlt),(hN(),!0)),a=t.Kc();a.Ob();)c=BB(a.Pb(),10),CZ(o=new CSn,c),qCn(o,CIt),hon(o,jlt,!0),hon(e=new wY,jlt,!0),SZ(e,u),MZ(e,o)}function WLn(n,t,e,i){var r,c,a,u;r=Adn(n,t,e),c=Adn(n,e,t),a=BB(RX(n.c,t),112),u=BB(RX(n.c,e),112),r<c?new zZ((O6(),Myt),a,u,c-r):c<r?new zZ((O6(),Myt),u,a,r-c):(0!=r||t.i&&e.i&&i[t.i.c][e.i.c])&&(new zZ((O6(),Myt),a,u,0),new zZ(Myt,u,a,0))}function VLn(n,t){var e,i,r,c,a,u;for(r=0,a=new Wb(t.a);a.a<a.c.c.length;)for(r+=(c=BB(n0(a),10)).o.b+c.d.a+c.d.d+n.e,i=new oz(ZL(fbn(c).a.Kc(),new h));dAn(i);)(e=BB(U5(i),17)).c.i.k==(uSn(),Iut)&&(r+=(u=BB(mMn(e.c.i,(hWn(),dlt)),10)).o.b+u.d.a+u.d.d);return r}function QLn(n,t,e){var i,r,c,a,u,o,s;for(c=new Np,OBn(n,s=new YT,a=new YT,t),Ezn(n,s,a,t,e),o=new Wb(n);o.a<o.c.c.length;)for(r=new Wb((u=BB(n0(o),112)).k);r.a<r.c.c.length;)i=BB(n0(r),129),(!t||i.c==(O6(),Tyt))&&u.g>i.b.g&&(c.c[c.c.length]=i);return c}function YLn(){YLn=O,DEt=new jC("CANDIDATE_POSITION_LAST_PLACED_RIGHT",0),xEt=new jC("CANDIDATE_POSITION_LAST_PLACED_BELOW",1),KEt=new jC("CANDIDATE_POSITION_WHOLE_DRAWING_RIGHT",2),REt=new jC("CANDIDATE_POSITION_WHOLE_DRAWING_BELOW",3),_Et=new jC("WHOLE_DRAWING",4)}function JLn(n,t){if(cL(t,239))return hln(n,BB(t,33));if(cL(t,186))return Dln(n,BB(t,118));if(cL(t,354))return tQ(n,BB(t,137));if(cL(t,352))return JFn(n,BB(t,79));if(t)return null;throw Hp(new _y(z6n+LMn(new Jy(Pun(Gk(Ant,1),HWn,1,5,[t])))))}function ZLn(n){var t,e,i,r,c,a,u;for(c=new YT,r=new Wb(n.d.a);r.a<r.c.c.length;)0==(i=BB(n0(r),121)).b.a.c.length&&r5(c,i,c.c.b,c.c);if(c.b>1)for(t=AN((e=new qv,++n.b,e),n.d),u=spn(c,0);u.b!=u.d.c;)a=BB(b3(u),121),UNn(aM(cM(uM(rM(new Hv,1),0),t),a))}function nNn(n,t){var e,i;if(t!=n.Cb||n.Db>>16!=11&&t){if(vkn(n,t))throw Hp(new _y(w6n+zRn(n)));i=null,n.Cb&&(i=(e=n.Db>>16)>=0?Skn(n,i):n.Cb.ih(n,-1-e,null,i)),t&&(i=Npn(t,n,10,i)),(i=zR(n,t,i))&&i.Fi()}else 0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,11,t,t))}function tNn(n){var t,e,i,r;for(i=new usn(new Pb(n.b).a);i.b;)r=BB((e=ten(i)).cd(),11),hon(t=BB(e.dd(),10),(hWn(),dlt),r),hon(r,Elt,t),hon(r,elt,(hN(),!0)),qCn(r,BB(mMn(t,Qft),61)),mMn(t,Qft),hon(r.i,(HXn(),ept),(QEn(),VCt)),BB(mMn(vW(r.i),Zft),21).Fc((bDn(),dft))}function eNn(n,t,e){var i,r,c;if(i=0,r=0,n.c)for(c=new Wb(n.d.i.j);c.a<c.c.c.length;)i+=BB(n0(c),11).e.c.length;else i=1;if(n.d)for(c=new Wb(n.c.i.j);c.a<c.c.c.length;)r+=BB(n0(c),11).g.c.length;else r=1;return(e+t)/2+.4*CJ(HH(r-i))*(e-t)}function iNn(n){var t,e;if(LEn(),n.Hc((kUn(),PIt)))throw Hp(new _y("Port sides must not contain UNDEFINED"));switch(n.gc()){case 1:return Mst;case 2:return t=n.Hc(oIt)&&n.Hc(CIt),e=n.Hc(sIt)&&n.Hc(SIt),t||e?Cst:Pst;case 3:return Sst;case 4:return Tst;default:return null}}function rNn(n,t,e){var i,r,c,a;for(OTn(e,"Breaking Point Removing",1),n.a=BB(mMn(t,(HXn(),Zdt)),218),r=new Wb(t.b);r.a<r.c.c.length;)for(a=new Wb(a0(BB(n0(r),29).a));a.a<a.c.c.length;)Jnn(c=BB(n0(a),10))&&!(i=BB(mMn(c,(hWn(),Rft)),305)).d&&zUn(n,i);HSn(e)}function cNn(n,t,e){return jDn(),(!Dcn(n,t)||!Dcn(n,e))&&(mzn(new xC(n.c,n.d),new xC(n.c+n.b,n.d),t,e)||mzn(new xC(n.c+n.b,n.d),new xC(n.c+n.b,n.d+n.a),t,e)||mzn(new xC(n.c+n.b,n.d+n.a),new xC(n.c,n.d+n.a),t,e)||mzn(new xC(n.c,n.d+n.a),new xC(n.c,n.d),t,e))}function aNn(n,t){var e,i,r,c;if(!n.dc())for(e=0,i=n.gc();e<i;++e)if(null==(c=SD(n.Xb(e)))?null==t:mK(c.substr(0,3),"!##")?null!=t&&(r=t.length,!mK(c.substr(c.length-r,r),t)||c.length!=t.length+3)&&!mK(S7n,t):mK(c,P7n)&&!mK(S7n,t)||mK(c,t))return!0;return!1}function uNn(n,t,e,i){var r,c,a,u,o,s;for(a=n.j.c.length,o=x8(art,rJn,306,a,0,1),u=0;u<a;u++)(c=BB(xq(n.j,u),11)).p=u,o[u]=hOn(mAn(c),e,i);for(VNn(n,o,e,t,i),s=new xp,r=0;r<o.length;r++)o[r]&&VW(s,BB(xq(n.j,r),11),o[r]);s.f.c+s.g.c!=0&&(hon(n,(hWn(),zft),s),ASn(n,o))}function oNn(n,t,e){var i,r;for(i=new Wb(n.a.b);i.a<i.c.c.length;)if((r=f2(BB(n0(i),57)))&&r.k==(uSn(),Mut))switch(BB(mMn(r,(hWn(),Qft)),61).g){case 4:r.n.a=t.a;break;case 2:r.n.a=e.a-(r.o.a+r.d.c);break;case 1:r.n.b=t.b;break;case 3:r.n.b=e.b-(r.o.b+r.d.a)}}function sNn(){sNn=O,Ivt=new HP(QZn,0),Tvt=new HP("NIKOLOV",1),Pvt=new HP("NIKOLOV_PIXEL",2),Mvt=new HP("NIKOLOV_IMPROVED",3),Svt=new HP("NIKOLOV_IMPROVED_PIXEL",4),Evt=new HP("DUMMYNODE_PERCENTAGE",5),Cvt=new HP("NODECOUNT_PERCENTAGE",6),Ovt=new HP("NO_BOUNDARY",7)}function hNn(n,t,e){var i,r,c;if(!(r=BB(ZAn(t,(SMn(),UMt)),19))&&(r=iln(0)),!(c=BB(ZAn(e,UMt),19))&&(c=iln(0)),r.a>c.a)return-1;if(r.a<c.a)return 1;if(n.a){if(0!=(i=Pln(t.j,e.j)))return i;if(0!=(i=Pln(t.i,e.i)))return i}return Pln(t.g*t.f,e.g*e.f)}function fNn(n,t){var e,i,r,c,a,u,o,s,h,f;if(++n.e,t>(o=null==n.d?0:n.d.length)){for(h=n.d,n.d=x8(oAt,c9n,63,2*o+4,0,1),c=0;c<o;++c)if(s=h[c])for(i=s.g,f=s.i,u=0;u<f;++u)a=eR(n,(r=BB(i[u],133)).Sh()),!(e=n.d[a])&&(e=n.d[a]=n.uj()),e.Fc(r);return!0}return!1}function lNn(n,t,e){var i,r,c,a,u,o;if(c=(r=e).ak(),$xn(n.e,c)){if(c.hi())for(i=BB(n.g,119),a=0;a<n.i;++a)if(Nfn(u=i[a],r)&&a!=t)throw Hp(new _y(a8n))}else for(o=axn(n.e.Tg(),c),i=BB(n.g,119),a=0;a<n.i;++a)if(u=i[a],o.rl(u.ak()))throw Hp(new _y(I7n));sln(n,t,e)}function bNn(n,t){var e,i,r,c,a,u;for(e=BB(mMn(t,(hWn(),Xft)),21),a=BB(h6((RXn(),fut),e),21),u=BB(h6(put,e),21),c=a.Kc();c.Ob();)if(i=BB(c.Pb(),21),!BB(h6(n.b,i),15).dc())return!1;for(r=u.Kc();r.Ob();)if(i=BB(r.Pb(),21),!BB(h6(n.b,i),15).dc())return!1;return!0}function wNn(n,t){var e,i,r;for(OTn(t,"Partition postprocessing",1),e=new Wb(n.b);e.a<e.c.c.length;)for(i=new Wb(BB(n0(e),29).a);i.a<i.c.c.length;)for(r=new Wb(BB(n0(i),10).j);r.a<r.c.c.length;)qy(TD(mMn(BB(n0(r),11),(hWn(),jlt))))&&AU(r);HSn(t)}function dNn(n,t){var e,i,r,c,a,u,o;if(1==n.a.c.length)return FSn(BB(xq(n.a,0),187),t);for(r=cfn(n),a=0,u=n.d,i=r,o=n.d,c=(u-i)/2+i;i+1<u;){for(a=0,e=new Wb(n.a);e.a<e.c.c.length;)a+=cHn(BB(n0(e),187),c,!1).a;a<t?(o=c,u=c):i=c,c=(u-i)/2+i}return o}function gNn(n){var t,e,i,r;return isNaN(n)?(X7(),gtt):n<-0x8000000000000000?(X7(),wtt):n>=0x8000000000000000?(X7(),btt):(i=!1,n<0&&(i=!0,n=-n),e=0,n>=OQn&&(n-=(e=CJ(n/OQn))*OQn),t=0,n>=IQn&&(n-=(t=CJ(n/IQn))*IQn),r=M$(CJ(n),t,e),i&&Oon(r),r)}function pNn(n,t){var e,i,r,c;for(e=!t||!n.u.Hc((lIn(),eIt)),c=0,r=new Wb(n.e.Cf());r.a<r.c.c.length;){if((i=BB(n0(r),838)).Hf()==(kUn(),PIt))throw Hp(new _y("Label and node size calculator can only be used with ports that have port sides assigned."));i.vf(c++),Whn(n,i,e)}}function vNn(n,t){var e,i,r,c;return(i=t.Hh(n.a))&&(!i.b&&(i.b=new Jx((gWn(),k$t),X$t,i)),null!=(e=SD(cdn(i.b,J9n)))&&cL(c=-1==(r=e.lastIndexOf("#"))?uD(n,t.Aj(),e):0==r?M9(n,null,e.substr(1)):M9(n,e.substr(0,r),e.substr(r+1)),148))?BB(c,148):null}function mNn(n,t){var e,i,r,c;return(e=t.Hh(n.a))&&(!e.b&&(e.b=new Jx((gWn(),k$t),X$t,e)),null!=(r=SD(cdn(e.b,k7n)))&&cL(c=-1==(i=r.lastIndexOf("#"))?uD(n,t.Aj(),r):0==i?M9(n,null,r.substr(1)):M9(n,r.substr(0,i),r.substr(i+1)),148))?BB(c,148):null}function yNn(n){var t,e,i,r,c;for(e=new Wb(n.a.a);e.a<e.c.c.length;){for((t=BB(n0(e),307)).j=null,c=t.a.a.ec().Kc();c.Ob();)kO((i=BB(c.Pb(),57)).b),(!t.j||i.d.c<t.j.d.c)&&(t.j=i);for(r=t.a.a.ec().Kc();r.Ob();)(i=BB(r.Pb(),57)).b.a=i.d.c-t.j.d.c,i.b.b=i.d.d-t.j.d.d}return n}function kNn(n){var t,e,i,r,c;for(e=new Wb(n.a.a);e.a<e.c.c.length;){for((t=BB(n0(e),189)).f=null,c=t.a.a.ec().Kc();c.Ob();)kO((i=BB(c.Pb(),81)).e),(!t.f||i.g.c<t.f.g.c)&&(t.f=i);for(r=t.a.a.ec().Kc();r.Ob();)(i=BB(r.Pb(),81)).e.a=i.g.c-t.f.g.c,i.e.b=i.g.d-t.f.g.d}return n}function jNn(n){var t,i,r;return i=BB(n.a,19).a,r=BB(n.b,19).a,i<(t=e.Math.max(e.Math.abs(i),e.Math.abs(r)))&&r==-t?new rI(iln(i+1),iln(r)):i==t&&r<t?new rI(iln(i),iln(r+1)):i>=-t&&r==t?new rI(iln(i-1),iln(r)):new rI(iln(i),iln(r-1))}function ENn(){return lWn(),Pun(Gk(ust,1),$Vn,77,0,[rot,tot,cot,kot,Fot,Mot,Uot,Oot,Kot,got,Not,Iot,_ot,lot,Wot,Vut,Lot,Hot,jot,Bot,Qot,Dot,Qut,Rot,Yot,Got,Vot,Eot,sot,Tot,yot,Xot,Zut,uot,Pot,Jut,Cot,vot,bot,Aot,dot,eot,not,mot,wot,$ot,zot,Yut,xot,pot,Sot,hot,oot,qot,aot,fot,iot])}function TNn(n,t,e){n.d=0,n.b=0,t.k==(uSn(),Iut)&&e.k==Iut&&BB(mMn(t,(hWn(),dlt)),10)==BB(mMn(e,dlt),10)&&(S7(t).j==(kUn(),sIt)?q$n(n,t,e):q$n(n,e,t)),t.k==Iut&&e.k==Put?S7(t).j==(kUn(),sIt)?n.d=1:n.b=1:e.k==Iut&&t.k==Put&&(S7(e).j==(kUn(),sIt)?n.b=1:n.d=1),umn(n,t,e)}function MNn(n){var t,e,i,r,c;return c=ATn(n),null!=n.a&&AH(c,"category",n.a),!WE(new Cb(n.d))&&(rtn(c,"knownOptions",i=new Cl),t=new ep(i),e5(new Cb(n.d),t)),!WE(n.g)&&(rtn(c,"supportedFeatures",r=new Cl),e=new ip(r),e5(n.g,e)),c}function SNn(n){var t,e,i,r,c,a,u,o;for(t=336,e=0,r=new sR(n.length),u=0,o=(a=n).length;u<o;++u)Qln(c=a[u]),EW(c),i=c.a,WB(r.a,yX(i)),t&=i.qd(),e=Ysn(e,i.rd());return BB(BB(XU(new Rq(null,qTn(new w1((WX(),Nwn(r.a)),16),new k,t,e)),new El(n)),670),833)}function PNn(n,t){var e;n.d&&(t.c!=n.e.c||fcn(n.e.b,t.b))&&(WB(n.f,n.d),n.a=n.d.c+n.d.b,n.d=null,n.e=null),nA(t.b)?n.c=t:n.b=t,(t.b==(Aun(),Zat)&&!t.a||t.b==nut&&t.a||t.b==tut&&t.a||t.b==eut&&!t.a)&&n.c&&n.b&&(e=new UV(n.a,n.c.d,t.c-n.a,n.b.d-n.c.d),n.d=e,n.e=t)}function CNn(n){var t;if(Ym.call(this),this.i=new lu,this.g=n,this.f=BB(n.e&&n.e(),9).length,0==this.f)throw Hp(new _y("There must be at least one phase in the phase enumeration."));this.c=new YK(t=BB(Vj(this.g),9),BB(SR(t,t.length),9),0),this.a=new B2,this.b=new xp}function INn(n,t){var e,i;if(t!=n.Cb||n.Db>>16!=7&&t){if(vkn(n,t))throw Hp(new _y(w6n+cPn(n)));i=null,n.Cb&&(i=(e=n.Db>>16)>=0?hkn(n,i):n.Cb.ih(n,-1-e,null,i)),t&&(i=BB(t,49).gh(n,1,DOt,i)),(i=VG(n,t,i))&&i.Fi()}else 0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,7,t,t))}function ONn(n,t){var e,i;if(t!=n.Cb||n.Db>>16!=3&&t){if(vkn(n,t))throw Hp(new _y(w6n+Vfn(n)));i=null,n.Cb&&(i=(e=n.Db>>16)>=0?bkn(n,i):n.Cb.ih(n,-1-e,null,i)),t&&(i=BB(t,49).gh(n,0,BOt,i)),(i=QG(n,t,i))&&i.Fi()}else 0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,3,t,t))}function ANn(n,t){var e,i,r,c,a,u,o,s,h;return $On(),t.d>n.d&&(u=n,n=t,t=u),t.d<63?Xxn(n,t):(s=z5(n,a=(-2&n.d)<<4),h=z5(t,a),i=uBn(n,G5(s,a)),r=uBn(t,G5(h,a)),o=ANn(s,h),e=ANn(i,r),c=G5(c=$Hn($Hn(c=ANn(uBn(s,i),uBn(r,h)),o),e),a),$Hn($Hn(o=G5(o,a<<1),c),e))}function $Nn(n,t,e){var i,r,c,a,u;for(a=Lfn(n,e),u=x8(Out,a1n,10,t.length,0,1),i=0,c=a.Kc();c.Ob();)qy(TD(mMn(r=BB(c.Pb(),11),(hWn(),elt))))&&(u[i++]=BB(mMn(r,Elt),10));if(i<t.length)throw Hp(new Fy("Expected "+t.length+" hierarchical ports, but found only "+i+"."));return u}function LNn(n,t){var e,i,r,c,a,u;if(!n.tb){for(!n.rb&&(n.rb=new Jz(n,HAt,n)),u=new XT((c=n.rb).i),r=new AL(c);r.e!=r.i.gc();)i=BB(kpn(r),138),(e=BB(null==(a=i.ne())?jCn(u.f,null,i):ubn(u.g,a,i),138))&&(null==a?jCn(u.f,null,e):ubn(u.g,a,e));n.tb=u}return BB(SJ(n.tb,t),138)}function NNn(n,t){var e,i,r,c,a;if((null==n.i&&qFn(n),n.i).length,!n.p){for(a=new XT(1+(3*n.g.i/2|0)),r=new ax(n.g);r.e!=r.i.gc();)i=BB(jpn(r),170),(e=BB(null==(c=i.ne())?jCn(a.f,null,i):ubn(a.g,c,i),170))&&(null==c?jCn(a.f,null,e):ubn(a.g,c,e));n.p=a}return BB(SJ(n.p,t),170)}function xNn(n,t,e,i,r){var c,a,u,o;for(wgn(i+CY(e,e.$d()),r),tW(t,Lwn(e)),(c=e.f)&&xNn(n,t,c,"Caused by: ",!1),null==e.k&&(e.k=x8(Jnt,sVn,78,0,0,1)),u=0,o=(a=e.k).length;u<o;++u)xNn(n,t,a[u],"Suppressed: ",!1);null!=console.groupEnd&&console.groupEnd.call(console)}function DNn(n,t,e,i){var r,c,a,u;for(a=(u=t.e).length,c=t.q._f(u,e?0:a-1,e),c|=gRn(n,u[e?0:a-1],e,i),r=e?1:a-2;e?r<a:r>=0;r+=e?1:-1)c|=t.c.Sf(u,r,e,i&&!qy(TD(mMn(t.j,(hWn(),Jft))))&&!qy(TD(mMn(t.j,(hWn(),Ilt))))),c|=t.q._f(u,r,e),c|=gRn(n,u[r],e,i);return TU(n.c,t),c}function RNn(n,t,e){var i,r,c,a,u,o,s,h;for(s=0,h=(o=I2(n.j)).length;s<h;++s){if(u=o[s],e==(ain(),Hvt)||e==Gvt)for(c=0,a=(r=Z0(u.g)).length;c<a;++c)OSn(t,i=r[c])&&tBn(i,!0);if(e==qvt||e==Gvt)for(c=0,a=(r=Z0(u.e)).length;c<a;++c)ISn(t,i=r[c])&&tBn(i,!0)}}function KNn(n){var t,e;switch(t=null,e=null,eEn(n).g){case 1:kUn(),t=oIt,e=CIt;break;case 2:kUn(),t=SIt,e=sIt;break;case 3:kUn(),t=CIt,e=oIt;break;case 4:kUn(),t=sIt,e=SIt}Gl(n,BB($N(Oz(BB(h6(n.k,t),15).Oc(),Qst)),113)),ql(n,BB($N(Iz(BB(h6(n.k,e),15).Oc(),Qst)),113))}function _Nn(n){var t,e,i,r,c,a;if((r=BB(xq(n.j,0),11)).e.c.length+r.g.c.length==0)n.n.a=0;else{for(a=0,i=NU(Wen(Pun(Gk(xnt,1),HWn,20,0,[new Hw(r),new Gw(r)])));dAn(i);)a+=(e=BB(U5(i),11)).i.n.a+e.n.a+e.a.a;c=(t=BB(mMn(n,(HXn(),npt)),8))?t.a:0,n.n.a=a/(r.e.c.length+r.g.c.length)-c}}function FNn(n,t){var e,i,r;for(i=new Wb(t.a);i.a<i.c.c.length;)e=BB(n0(i),221),LG(BB(e.b,65),XR(B$(BB(t.b,65).c),BB(t.b,65).a)),(r=Y_n(BB(t.b,65).b,BB(e.b,65).b))>1&&(n.a=!0),NG(BB(e.b,65),UR(B$(BB(t.b,65).c),kL(XR(B$(BB(e.b,65).a),BB(t.b,65).a),r))),QZ(n,t),FNn(n,e)}function BNn(n){var t,e,i,r,c,a;for(r=new Wb(n.a.a);r.a<r.c.c.length;)(e=BB(n0(r),189)).e=0,e.d.a.$b();for(i=new Wb(n.a.a);i.a<i.c.c.length;)for(t=(e=BB(n0(i),189)).a.a.ec().Kc();t.Ob();)for(a=BB(t.Pb(),81).f.Kc();a.Ob();)(c=BB(a.Pb(),81)).d!=e&&(TU(e.d,c),++c.d.e)}function HNn(n){var t,e,i,r,c,a,u,o;for(e=0,t=o=n.j.c.length,r=2*o,u=new Wb(n.j);u.a<u.c.c.length;)switch((a=BB(n0(u),11)).j.g){case 2:case 4:a.p=-1;break;case 1:case 3:i=a.e.c.length,c=a.g.c.length,a.p=i>0&&c>0?t++:i>0?e++:c>0?r++:e++}SQ(),m$(n.j,new bi)}function qNn(n){var t,e;e=null,t=BB(xq(n.g,0),17);do{if(Lx(e=t.d.i,(hWn(),flt)))return BB(mMn(e,flt),11).i;if(e.k!=(uSn(),Cut)&&dAn(new oz(ZL(lbn(e).a.Kc(),new h))))t=BB(U5(new oz(ZL(lbn(e).a.Kc(),new h))),17);else if(e.k!=Cut)return null}while(e&&e.k!=(uSn(),Cut));return e}function GNn(n,t){var e,i,r,c,a,u,o,s,h;for(u=t.j,a=t.g,o=BB(xq(u,u.c.length-1),113),l1(0,u.c.length),s=Zmn(n,a,o,h=BB(u.c[0],113)),c=1;c<u.c.length;c++)l1(c-1,u.c.length),e=BB(u.c[c-1],113),l1(c,u.c.length),(i=Zmn(n,a,e,r=BB(u.c[c],113)))>s&&(o=e,h=r,s=i);t.a=h,t.c=o}function zNn(n,t){var e;if(!ZU(n.b,t.b))throw Hp(new Fy("Invalid hitboxes for scanline constraint calculation."));(kun(t.b,BB(MR(n.b,t.b),57))||kun(t.b,BB(TR(n.b,t.b),57)))&&($T(),t.b),n.a[t.b.f]=BB(kK(n.b,t.b),57),(e=BB(yK(n.b,t.b),57))&&(n.a[e.f]=t.b)}function UNn(n){if(!n.a.d||!n.a.e)throw Hp(new Fy((ED(Hit),Hit.k+" must have a source and target "+(ED(qit),qit.k+" specified."))));if(n.a.d==n.a.e)throw Hp(new Fy("Network simplex does not support self-loops: "+n.a+" "+n.a.d+" "+n.a.e));return RN(n.a.d.g,n.a),RN(n.a.e.b,n.a),n.a}function XNn(n,t,e){var i,r,c,a,u,o,s;for(s=new dE(new Jd(n)),u=0,o=(a=Pun(Gk(Gut,1),u1n,11,0,[t,e])).length;u<o;++u)for(c=a[u],Mon(s.a,c,(hN(),ptt)),r=new m6(c.b);y$(r.a)||y$(r.b);)(i=BB(y$(r.a)?n0(r.a):n0(r.b),17)).c==i.d||ZU(s,c==i.c?i.d:i.c);return yX(s),new t_(s)}function WNn(n,t,e){var i,r,c,a,u,o;if(i=0,0!=t.b&&0!=e.b){c=spn(t,0),a=spn(e,0),u=Gy(MD(b3(c))),o=Gy(MD(b3(a))),r=!0;do{if(u>o-n.b&&u<o+n.b)return-1;u>o-n.a&&u<o+n.a&&++i,u<=o&&c.b!=c.d.c?u=Gy(MD(b3(c))):o<=u&&a.b!=a.d.c?o=Gy(MD(b3(a))):r=!1}while(r)}return i}function VNn(n,t,e,i,r){var c,a,u,o;for(o=new YK(c=BB(Vj(FIt),9),BB(SR(c,c.length),9),0),u=new Wb(n.j);u.a<u.c.c.length;)t[(a=BB(n0(u),11)).p]&&(BUn(a,t[a.p],i),orn(o,a.j));r?(GEn(n,t,(kUn(),oIt),2*e,i),GEn(n,t,CIt,2*e,i)):(GEn(n,t,(kUn(),sIt),2*e,i),GEn(n,t,SIt,2*e,i))}function QNn(n){var t,e,i,r,c;if(c=new Np,Otn(n.b,new kw(c)),n.b.c=x8(Ant,HWn,1,0,5,1),0!=c.c.length){for(l1(0,c.c.length),t=BB(c.c[0],78),e=1,i=c.c.length;e<i;++e)l1(e,c.c.length),(r=BB(c.c[e],78))!=t&>n(t,r);if(cL(t,60))throw Hp(BB(t,60));if(cL(t,289))throw Hp(BB(t,289))}}function YNn(n,t){var e,i,r,c;for(n=null==n?zWn:(kW(n),n),e=new Ik,c=0,i=0;i<t.length&&-1!=(r=n.indexOf("%s",c));)oO(e,n.substr(c,r-c)),uO(e,t[i++]),c=r+2;if(oO(e,n.substr(c)),i<t.length){for(e.a+=" [",uO(e,t[i++]);i<t.length;)e.a+=FWn,uO(e,t[i++]);e.a+="]"}return e.a}function JNn(n){var t,e,i,r;for(t=0,r=(i=n.length)-4,e=0;e<r;)b1(e+3,n.length),t=n.charCodeAt(e+3)+(b1(e+2,n.length),31*(n.charCodeAt(e+2)+(b1(e+1,n.length),31*(n.charCodeAt(e+1)+(b1(e,n.length),31*(n.charCodeAt(e)+31*t)))))),t|=0,e+=4;for(;e<i;)t=31*t+fV(n,e++);return t|=0}function ZNn(n){var t;for(t=new oz(ZL(lbn(n).a.Kc(),new h));dAn(t);)if(BB(U5(t),17).d.i.k!=(uSn(),Sut))throw Hp(new rk(P1n+gyn(n)+"' has its layer constraint set to LAST, but has at least one outgoing edge that does not go to a LAST_SEPARATE node. That must not happen."))}function nxn(n,t,i,r){var c,a,u,o,s,f,l;for(o=0,s=new Wb(n.a);s.a<s.c.c.length;){for(u=0,a=new oz(ZL(fbn(BB(n0(s),10)).a.Kc(),new h));dAn(a);)f=g1((c=BB(U5(a),17)).c).b,l=g1(c.d).b,u=e.Math.max(u,e.Math.abs(l-f));o=e.Math.max(o,u)}return r*e.Math.min(1,t/i)*o}function txn(n){var t;return t=new Pk,0!=(256&n)&&(t.a+="F"),0!=(128&n)&&(t.a+="H"),0!=(512&n)&&(t.a+="X"),0!=(2&n)&&(t.a+="i"),0!=(8&n)&&(t.a+="m"),0!=(4&n)&&(t.a+="s"),0!=(32&n)&&(t.a+="u"),0!=(64&n)&&(t.a+="w"),0!=(16&n)&&(t.a+="x"),0!=(n&k6n)&&(t.a+=","),Uy(t.a)}function exn(n,t){var e,i,r;for(OTn(t,"Resize child graph to fit parent.",1),i=new Wb(n.b);i.a<i.c.c.length;)e=BB(n0(i),29),gun(n.a,e.a),e.a.c=x8(Ant,HWn,1,0,5,1);for(r=new Wb(n.a);r.a<r.c.c.length;)PZ(BB(n0(r),10),null);n.b.c=x8(Ant,HWn,1,0,5,1),Bxn(n),n.e&&S_n(n.e,n),HSn(t)}function ixn(n){var t,e,i,r,c,a,u;if(r=(i=n.b).e,c=LK(BB(mMn(i,(HXn(),ept)),98)),e=!!r&&BB(mMn(r,(hWn(),Zft)),21).Hc((bDn(),lft)),!c&&!e)for(u=new Kb(new Ob(n.e).a.vc().Kc());u.a.Ob();)t=BB(u.a.Pb(),42),(a=BB(t.dd(),113)).a&&(CZ(a.d,null),a.c=!0,n.a=!0)}function rxn(n){var t,e,i,r,c,a,u,o,s,h,f,l;for(f=-1,l=0,s=0,h=(o=n).length;s<h;++s){for(a=0,u=(c=o[s]).length;a<u;++a)for(r=c[a],t=new pP(-1==f?n[0]:n[f],okn(r)),e=0;e<r.j.c.length;e++)for(i=e+1;i<r.j.c.length;i++)Nz(t,BB(xq(r.j,e),11),BB(xq(r.j,i),11))>0&&++l;++f}return l}function cxn(n,t){var e,i,r,c,a;for(a=BB(mMn(t,(CAn(),Lkt)),425),c=spn(t.b,0);c.b!=c.d.c;)if(r=BB(b3(c),86),0==n.b[r.g]){switch(a.g){case 0:Qvn(n,r);break;case 1:HAn(n,r)}n.b[r.g]=2}for(i=spn(n.a,0);i.b!=i.d.c;)ywn((e=BB(b3(i),188)).b.d,e,!0),ywn(e.c.b,e,!0);hon(t,(qqn(),lkt),n.a)}function axn(n,t){var e,i,r,c;return ZM(),t?t==(Uqn(),KLt)||(t==yLt||t==vLt||t==mLt)&&n!=pLt?new cUn(n,t):((e=(i=BB(t,677)).pk())||(kV(B7((IPn(),Z$t),t)),e=i.pk()),!e.i&&(e.i=new xp),!(r=BB(qI(AY((c=e.i).f,n)),1942))&&VW(c,n,r=new cUn(n,t)),r):aLt}function uxn(n,t){var e,i,r,c,a,u,o,s;for(u=BB(mMn(n,(hWn(),dlt)),11),o=Aon(Pun(Gk(PMt,1),sVn,8,0,[u.i.n,u.n,u.a])).a,s=n.i.n.b,r=0,c=(i=Z0(n.e)).length;r<c;++r)MZ(e=i[r],u),fO(e.a,new xC(o,s)),t&&((a=BB(mMn(e,(HXn(),vgt)),74))||(a=new km,hon(e,vgt,a)),DH(a,new xC(o,s)))}function oxn(n,t){var e,i,r,c,a,u,o,s;for(i=BB(mMn(n,(hWn(),dlt)),11),o=Aon(Pun(Gk(PMt,1),sVn,8,0,[i.i.n,i.n,i.a])).a,s=n.i.n.b,a=0,u=(c=Z0(n.g)).length;a<u;++a)SZ(r=c[a],i),hO(r.a,new xC(o,s)),t&&((e=BB(mMn(r,(HXn(),vgt)),74))||(e=new km,hon(r,vgt,e)),DH(e,new xC(o,s)))}function sxn(n,t){var e,i,r,c,a;for(n.b=new Np,n.d=BB(mMn(t,(hWn(),Slt)),230),n.e=c0(n.d),c=new YT,r=u6(Pun(Gk(jut,1),JZn,37,0,[t])),a=0;a<r.c.length;)l1(a,r.c.length),(i=BB(r.c[a],37)).p=a++,gun(r,(e=new CGn(i,n.a,n.b)).b),WB(n.b,e),e.s&&nX(spn(c,0),e);return n.c=new Rv,c}function hxn(n,t){var e,i,r,c,a,u;for(a=BB(BB(h6(n.r,t),21),84).Kc();a.Ob();)(e=(c=BB(a.Pb(),111)).c?VH(c.c):0)>0?c.a?e>(u=c.b.rf().a)&&(r=(e-u)/2,c.d.b=r,c.d.c=r):c.d.c=n.s+e:Hz(n.u)&&((i=_Tn(c.b)).c<0&&(c.d.b=-i.c),i.c+i.b>c.b.rf().a&&(c.d.c=i.c+i.b-c.b.rf().a))}function fxn(n,t){var e,i;for(OTn(t,"Semi-Interactive Crossing Minimization Processor",1),e=!1,i=new Wb(n.b);i.a<i.c.c.length;)e|=null!=$fn(ytn(AV(AV(new Rq(null,new w1(BB(n0(i),29).a,16)),new Qi),new Yi),new Ji),new Zi).a;e&&hon(n,(hWn(),alt),(hN(),!0)),HSn(t)}function lxn(n,t,e){var i,r,c;if(!(r=e)&&(r=new Xm),OTn(r,"Layout",n.a.c.length),qy(TD(mMn(t,(CAn(),Ekt)))))for($T(),i=0;i<n.a.c.length;i++)i++,nE(tsn(BB(xq(n.a,i),51)));for(c=new Wb(n.a);c.a<c.c.c.length;)BB(n0(c),51).pf(t,mcn(r,1));HSn(r)}function bxn(n){var t,i;if(t=BB(n.a,19).a,i=BB(n.b,19).a,t>=0){if(t==i)return new rI(iln(-t-1),iln(-t-1));if(t==-i)return new rI(iln(-t),iln(i+1))}return e.Math.abs(t)>e.Math.abs(i)?new rI(iln(-t),iln(t<0?i:i+1)):new rI(iln(t+1),iln(i))}function wxn(n){var t,e;e=BB(mMn(n,(HXn(),kgt)),163),t=BB(mMn(n,(hWn(),ilt)),303),e==(Tbn(),Flt)?(hon(n,kgt,qlt),hon(n,ilt,(z7(),Cft))):e==Hlt?(hon(n,kgt,qlt),hon(n,ilt,(z7(),Sft))):t==(z7(),Cft)?(hon(n,kgt,Flt),hon(n,ilt,Pft)):t==Sft&&(hon(n,kgt,Hlt),hon(n,ilt,Pft))}function dxn(){dxn=O,jyt=new oa,vyt=dq(new B2,(yMn(),_at),(lWn(),jot)),kyt=WG(dq(new B2,_at,Dot),Bat,xot),Eyt=ogn(ogn(FM(WG(dq(new B2,Rat,Uot),Bat,zot),Fat),Got),Xot),myt=WG(dq(dq(dq(new B2,Kat,Mot),Fat,Pot),Fat,Cot),Bat,Sot),yyt=WG(dq(dq(new B2,Fat,Cot),Fat,uot),Bat,aot)}function gxn(){gxn=O,Cyt=dq(WG(new B2,(yMn(),Bat),(lWn(),hot)),_at,jot),$yt=ogn(ogn(FM(WG(dq(new B2,Rat,Uot),Bat,zot),Fat),Got),Xot),Iyt=WG(dq(dq(dq(new B2,Kat,Mot),Fat,Pot),Fat,Cot),Bat,Sot),Ayt=dq(dq(new B2,_at,Dot),Bat,xot),Oyt=WG(dq(dq(new B2,Fat,Cot),Fat,uot),Bat,aot)}function pxn(n,t,e,i,r){var c,a;(b5(t)||t.c.i.c!=t.d.i.c)&&nrn(Aon(Pun(Gk(PMt,1),sVn,8,0,[r.i.n,r.n,r.a])),e)||b5(t)||(t.c==r?Kx(t.a,0,new wA(e)):DH(t.a,new wA(e)),i&&!FT(n.a,e)&&((a=BB(mMn(t,(HXn(),vgt)),74))||(a=new km,hon(t,vgt,a)),r5(a,c=new wA(e),a.c.b,a.c),TU(n.a,c)))}function vxn(n){var t;for(t=new oz(ZL(fbn(n).a.Kc(),new h));dAn(t);)if(BB(U5(t),17).c.i.k!=(uSn(),Sut))throw Hp(new rk(P1n+gyn(n)+"' has its layer constraint set to FIRST, but has at least one incoming edge that does not come from a FIRST_SEPARATE node. That must not happen."))}function mxn(n,t,e){var i,r,c,a,u,o;if(0==(r=pbn(254&n.Db)))n.Eb=e;else{if(1==r)a=x8(Ant,HWn,1,2,5,1),0==Rmn(n,t)?(a[0]=e,a[1]=n.Eb):(a[0]=n.Eb,a[1]=e);else for(a=x8(Ant,HWn,1,r+1,5,1),c=een(n.Eb),i=2,u=0,o=0;i<=128;i<<=1)i==t?a[o++]=e:0!=(n.Db&i)&&(a[o++]=c[u++]);n.Eb=a}n.Db|=t}function yxn(n,t,i){var r,c,a,u;for(this.b=new Np,c=0,r=0,u=new Wb(n);u.a<u.c.c.length;)a=BB(n0(u),167),i&&KBn(a),WB(this.b,a),c+=a.o,r+=a.p;this.b.c.length>0&&(c+=(a=BB(xq(this.b,0),167)).o,r+=a.p),c*=2,r*=2,t>1?c=CJ(e.Math.ceil(c*t)):r=CJ(e.Math.ceil(r/t)),this.a=new qwn(c,r)}function kxn(n,t,i,r,c,a){var u,o,s,h,f,l,b,w,d,g;for(h=r,t.j&&t.o?(d=(b=BB(RX(n.f,t.A),57)).d.c+b.d.b,--h):d=t.a.c+t.a.b,f=c,i.q&&i.o?(s=(b=BB(RX(n.f,i.C),57)).d.c,++f):s=i.a.c,w=d+(o=(s-d)/e.Math.max(2,f-h)),l=h;l<f;++l)g=(u=BB(a.Xb(l),128)).a.b,u.a.c=w-g/2,w+=o}function jxn(n,t,e,i,r,c){var a,u,o,s,h,f;for(s=e.c.length,c&&(n.c=x8(ANt,hQn,25,t.length,15,1)),a=r?0:t.length-1;r?a<t.length:a>=0;a+=r?1:-1){for(u=t[a],o=i==(kUn(),oIt)?r?abn(u,i):ean(abn(u,i)):r?ean(abn(u,i)):abn(u,i),c&&(n.c[u.p]=o.gc()),f=o.Kc();f.Ob();)h=BB(f.Pb(),11),n.d[h.p]=s++;gun(e,o)}}function Exn(n,t,e){var i,r,c,a,u,o,s,h;for(c=Gy(MD(n.b.Kc().Pb())),s=Gy(MD(Wan(t.b))),i=kL(B$(n.a),s-e),r=kL(B$(t.a),e-c),kL(h=UR(i,r),1/(s-c)),this.a=h,this.b=new Np,u=!0,(a=n.b.Kc()).Pb();a.Ob();)o=Gy(MD(a.Pb())),u&&o-e>D3n&&(this.b.Fc(e),u=!1),this.b.Fc(o);u&&this.b.Fc(e)}function Txn(n){var t,e,i,r;if(hKn(n,n.n),n.d.c.length>0){for(nk(n.c);pAn(n,BB(n0(new Wb(n.e.a)),121))<n.e.a.c.length;){for(r=(t=Ryn(n)).e.e-t.d.e-t.a,t.e.j&&(r=-r),i=new Wb(n.e.a);i.a<i.c.c.length;)(e=BB(n0(i),121)).j&&(e.e+=r);nk(n.c)}nk(n.c),pIn(n,BB(n0(new Wb(n.e.a)),121)),gGn(n)}}function Mxn(n,t){var e,i,r,c,a;for(r=BB(h6(n.a,(LEn(),Mst)),15).Kc();r.Ob();)switch(i=BB(r.Pb(),101),e=BB(xq(i.j,0),113).d.j,m$(c=new t_(i.j),new Jr),t.g){case 1:NEn(n,c,e,(Crn(),Dst),1);break;case 0:NEn(n,new s1(c,0,a=_Ln(c)),e,(Crn(),Dst),0),NEn(n,new s1(c,a,c.c.length),e,Dst,1)}}function Sxn(n,t){var e,i;if(Nun(),e=T5(cin(),t.tg())){if(i=e.j,cL(n,239))return rZ(BB(n,33))?SN(i,(rpn(),sMt))||SN(i,hMt):SN(i,(rpn(),sMt));if(cL(n,352))return SN(i,(rpn(),uMt));if(cL(n,186))return SN(i,(rpn(),fMt));if(cL(n,354))return SN(i,(rpn(),oMt))}return!0}function Pxn(n,t,e){var i,r,c,a,u,o;if(c=(r=e).ak(),$xn(n.e,c)){if(c.hi())for(i=BB(n.g,119),a=0;a<n.i;++a)if(Nfn(u=i[a],r)&&a!=t)throw Hp(new _y(a8n))}else for(o=axn(n.e.Tg(),c),i=BB(n.g,119),a=0;a<n.i;++a)if(u=i[a],o.rl(u.ak())&&a!=t)throw Hp(new _y(I7n));return BB(ovn(n,t,e),72)}function Cxn(n,t){if(t instanceof Object)try{if(t.__java$exception=n,-1!=navigator.userAgent.toLowerCase().indexOf("msie")&&$doc.documentMode<9)return;var e=n;Object.defineProperties(t,{cause:{get:function(){var n=e.Zd();return n&&n.Xd()}},suppressed:{get:function(){return e.Yd()}}})}catch(i){}}function Ixn(n,t){var e,i,r,c,a;if(i=t>>5,t&=31,i>=n.d)return n.e<0?(ODn(),Ytt):(ODn(),eet);if(c=n.d-i,QSn(r=x8(ANt,hQn,25,c+1,15,1),c,n.a,i,t),n.e<0){for(e=0;e<i&&0==n.a[e];e++);if(e<i||t>0&&n.a[e]<<32-t!=0){for(e=0;e<c&&-1==r[e];e++)r[e]=0;e==c&&++c,++r[e]}}return X0(a=new lU(n.e,c,r)),a}function Oxn(n){var t,e,i,r;return e=new $w(r=WJ(n)),i=new Lw(r),gun(t=new Np,(!n.d&&(n.d=new hK(_Ot,n,8,5)),n.d)),gun(t,(!n.e&&(n.e=new hK(_Ot,n,7,4)),n.e)),BB(P4($V(AV(new Rq(null,new w1(t,16)),e),i),x7(new Q,new Y,new cn,new an,Pun(Gk(nit,1),$Vn,132,0,[(qsn(),Xet),Uet]))),21)}function Axn(n,t,e,i){var r,c,a,u,o;if(ZM(),u=BB(t,66).Oj(),$xn(n.e,t)){if(t.hi()&&UFn(n,t,i,cL(t,99)&&0!=(BB(t,18).Bb&BQn)))throw Hp(new _y(a8n))}else for(o=axn(n.e.Tg(),t),r=BB(n.g,119),a=0;a<n.i;++a)if(c=r[a],o.rl(c.ak()))throw Hp(new _y(I7n));sln(n,EPn(n,t,e),u?BB(i,72):Z3(t,i))}function $xn(n,t){var e,i,r;return ZM(),!!t.$j()||-2==t.Zj()&&(t==(TOn(),lLt)||t==sLt||t==hLt||t==fLt||!(Awn(r=n.Tg(),t)>=0)&&(!(e=Fqn((IPn(),Z$t),r,t))||((i=e.Zj())>1||-1==i)&&3!=DW(B7(Z$t,e))))}function Lxn(n,t,e,i){var r,c,a,u,o;return u=PTn(BB(Wtn((!t.b&&(t.b=new hK(KOt,t,4,7)),t.b),0),82)),o=PTn(BB(Wtn((!t.c&&(t.c=new hK(KOt,t,5,8)),t.c),0),82)),JJ(u)==JJ(o)||Ctn(o,u)?null:(a=XJ(t))==e?i:(c=BB(RX(n.a,a),10))&&(r=c.e)?r:null}function Nxn(n,t){var e;switch(OTn(t,"Label side selection ("+(e=BB(mMn(n,(HXn(),Jdt)),276))+")",1),e.g){case 0:TAn(n,(Xyn(),jCt));break;case 1:TAn(n,(Xyn(),ECt));break;case 2:sBn(n,(Xyn(),jCt));break;case 3:sBn(n,(Xyn(),ECt));break;case 4:uDn(n,(Xyn(),jCt));break;case 5:uDn(n,(Xyn(),ECt))}HSn(t)}function xxn(n,t,e){var i,r,c,a,u;if((c=n[lj(e,n.length)])[0].k==(uSn(),Mut))for(r=fj(e,c.length),u=t.j,i=0;i<u.c.length;i++)l1(i,u.c.length),a=BB(u.c[i],11),(e?a.j==(kUn(),oIt):a.j==(kUn(),CIt))&&qy(TD(mMn(a,(hWn(),elt))))&&(c5(u,i,BB(mMn(c[r],(hWn(),dlt)),11)),r+=e?1:-1)}function Dxn(n,t){var e,i,r,c,a;a=new Np,e=t;do{(c=BB(RX(n.b,e),128)).B=e.c,c.D=e.d,a.c[a.c.length]=c,e=BB(RX(n.k,e),17)}while(e);return l1(0,a.c.length),(i=BB(a.c[0],128)).j=!0,i.A=BB(i.d.a.ec().Kc().Pb(),17).c.i,(r=BB(xq(a,a.c.length-1),128)).q=!0,r.C=BB(r.d.a.ec().Kc().Pb(),17).d.i,a}function Rxn(n){if(null==n.g)switch(n.p){case 0:n.g=fZ(n)?(hN(),vtt):(hN(),ptt);break;case 1:n.g=Pnn(D3(n));break;case 2:n.g=fun(Q1(n));break;case 3:n.g=OW(n);break;case 4:n.g=new Nb(IW(n));break;case 6:n.g=jgn(AW(n));break;case 5:n.g=iln(hJ(n));break;case 7:n.g=rln(_3(n))}return n.g}function Kxn(n){if(null==n.n)switch(n.p){case 0:n.n=lZ(n)?(hN(),vtt):(hN(),ptt);break;case 1:n.n=Pnn(R3(n));break;case 2:n.n=fun(Y1(n));break;case 3:n.n=LW(n);break;case 4:n.n=new Nb(NW(n));break;case 6:n.n=jgn($W(n));break;case 5:n.n=iln(fJ(n));break;case 7:n.n=rln(K3(n))}return n.n}function _xn(n){var t,e,i,r,c,a;for(r=new Wb(n.a.a);r.a<r.c.c.length;)(e=BB(n0(r),307)).g=0,e.i=0,e.e.a.$b();for(i=new Wb(n.a.a);i.a<i.c.c.length;)for(t=(e=BB(n0(i),307)).a.a.ec().Kc();t.Ob();)for(a=BB(t.Pb(),57).c.Kc();a.Ob();)(c=BB(a.Pb(),57)).a!=e&&(TU(e.e,c),++c.a.g,++c.a.i)}function Fxn(n,t){var e,i,r;if(!ZU(n.a,t.b))throw Hp(new Fy("Invalid hitboxes for scanline overlap calculation."));for(r=!1,i=new Fb(new BR(new xN(new _b(n.a.a).a).b));aS(i.a.a);)if(e=BB(mx(i.a).cd(),65),eon(t.b,e))xj(n.b.a,t.b,e),r=!0;else if(r)break}function Bxn(n){var t,i,r,c,a;c=BB(mMn(n,(HXn(),Fgt)),21),a=BB(mMn(n,qgt),21),t=new wA(i=new xC(n.f.a+n.d.b+n.d.c,n.f.b+n.d.d+n.d.a)),c.Hc((mdn(),DIt))&&(r=BB(mMn(n,Hgt),8),a.Hc((n_n(),GIt))&&(r.a<=0&&(r.a=20),r.b<=0&&(r.b=20)),t.a=e.Math.max(i.a,r.a),t.b=e.Math.max(i.b,r.b)),XBn(n,i,t)}function Hxn(n,t){var e,i,r,c,a,u,o,s;r=t?new pc:new vc,c=!1;do{for(c=!1,a=(t?ean(n.b):n.b).Kc();a.Ob();)for(s=a0(BB(a.Pb(),29).a),t||new fy(s),o=new Wb(s);o.a<o.c.c.length;)u=BB(n0(o),10),r.Mb(u)&&(i=u,e=BB(mMn(u,(hWn(),Rft)),305),c=eRn(i,t?e.b:e.k,t,!1))}while(c)}function qxn(n,t,e){var i,r,c,a;for(OTn(e,"Longest path layering",1),n.a=t,a=n.a.a,n.b=x8(ANt,hQn,25,a.c.length,15,1),i=0,c=new Wb(a);c.a<c.c.c.length;)BB(n0(c),10).p=i,n.b[i]=-1,++i;for(r=new Wb(a);r.a<r.c.c.length;)D$n(n,BB(n0(r),10));a.c=x8(Ant,HWn,1,0,5,1),n.a=null,n.b=null,HSn(e)}function Gxn(n,t){var e,i,r;t.a?(ZU(n.b,t.b),n.a[t.b.i]=BB(kK(n.b,t.b),81),(e=BB(yK(n.b,t.b),81))&&(n.a[e.i]=t.b)):(!!(i=BB(kK(n.b,t.b),81))&&i==n.a[t.b.i]&&!!i.d&&i.d!=t.b.d&&i.f.Fc(t.b),!!(r=BB(yK(n.b,t.b),81))&&n.a[r.i]==t.b&&!!r.d&&r.d!=t.b.d&&t.b.f.Fc(r),MN(n.b,t.b))}function zxn(n,t){var i,r,c,a,u,o;return a=n.d,(o=Gy(MD(mMn(n,(HXn(),agt)))))<0&&hon(n,agt,o=0),t.o.b=o,u=e.Math.floor(o/2),qCn(r=new CSn,(kUn(),CIt)),CZ(r,t),r.n.b=u,qCn(c=new CSn,oIt),CZ(c,t),c.n.b=u,MZ(n,r),qan(i=new wY,n),hon(i,vgt,null),SZ(i,c),MZ(i,a),jFn(t,n,i),sCn(n,i),i}function Uxn(n){var t,e;return e=BB(mMn(n,(hWn(),Zft)),21),t=new B2,e.Hc((bDn(),bft))&&(Jcn(t,byt),Jcn(t,dyt)),(e.Hc(dft)||qy(TD(mMn(n,(HXn(),ugt)))))&&(Jcn(t,dyt),e.Hc(gft)&&Jcn(t,gyt)),e.Hc(lft)&&Jcn(t,lyt),e.Hc(vft)&&Jcn(t,pyt),e.Hc(wft)&&Jcn(t,wyt),e.Hc(sft)&&Jcn(t,hyt),e.Hc(fft)&&Jcn(t,fyt),t}function Xxn(n,t){var e,i,r,c,a,u,o,s,h;return c=(e=n.d)+(i=t.d),a=n.e!=t.e?-1:1,2==c?(h=dG(o=cbn(e0(n.a[0],UQn),e0(t.a[0],UQn))),0==(s=dG(jz(o,32)))?new X6(a,h):new lU(a,2,Pun(Gk(ANt,1),hQn,25,15,[h,s]))):(Dfn(n.a,e,t.a,i,r=x8(ANt,hQn,25,c,15,1)),X0(u=new lU(a,c,r)),u)}function Wxn(n,t,e,i){var r,c;return t?0==(r=n.a.ue(e.d,t.d))?(i.d=pR(t,e.e),i.b=!0,t):(c=r<0?0:1,t.a[c]=Wxn(n,t.a[c],e,i),Vy(t.a[c])&&(Vy(t.a[1-c])?(t.b=!0,t.a[0].b=!1,t.a[1].b=!1):Vy(t.a[c].a[c])?t=wrn(t,1-c):Vy(t.a[c].a[1-c])&&(t=r2(t,1-c))),t):e}function Vxn(n,t,i){var r,c,a,u;c=n.i,r=n.n,Y5(n,(Dtn(),Git),c.c+r.b,i),Y5(n,Uit,c.c+c.b-r.c-i[2],i),u=c.b-r.b-r.c,i[0]>0&&(i[0]+=n.d,u-=i[0]),i[2]>0&&(i[2]+=n.d,u-=i[2]),a=e.Math.max(0,u),i[1]=e.Math.max(i[1],u),Y5(n,zit,c.c+r.b+i[0]-(i[1]-u)/2,i),t==zit&&(n.c.b=a,n.c.c=c.c+r.b+(a-u)/2)}function Qxn(){this.c=x8(xNt,qQn,25,(kUn(),Pun(Gk(FIt,1),YZn,61,0,[PIt,sIt,oIt,SIt,CIt])).length,15,1),this.b=x8(xNt,qQn,25,Pun(Gk(FIt,1),YZn,61,0,[PIt,sIt,oIt,SIt,CIt]).length,15,1),this.a=x8(xNt,qQn,25,Pun(Gk(FIt,1),YZn,61,0,[PIt,sIt,oIt,SIt,CIt]).length,15,1),mS(this.c,RQn),mS(this.b,KQn),mS(this.a,KQn)}function Yxn(n,t,e){var i,r,c,a;if(t<=e?(r=t,c=e):(r=e,c=t),i=0,null==n.b)n.b=x8(ANt,hQn,25,2,15,1),n.b[0]=r,n.b[1]=c,n.c=!0;else{if(i=n.b.length,n.b[i-1]+1==r)return void(n.b[i-1]=c);a=x8(ANt,hQn,25,i+2,15,1),aHn(n.b,0,a,0,i),n.b=a,n.b[i-1]>=r&&(n.c=!1,n.a=!1),n.b[i++]=r,n.b[i]=c,n.c||T$n(n)}}function Jxn(n,t,e){var i,r,c,a,u,o,s;for(s=t.d,n.a=new J6(s.c.length),n.c=new xp,u=new Wb(s);u.a<u.c.c.length;)a=BB(n0(u),101),c=new Fan(null),WB(n.a,c),VW(n.c,a,c);for(n.b=new xp,vCn(n,t),i=0;i<s.c.length-1;i++)for(o=BB(xq(t.d,i),101),r=i+1;r<s.c.length;r++)WLn(n,o,BB(xq(t.d,r),101),e)}function Zxn(n,t,e){var i,r,c,a,u,o;if(!h3(t)){for(OTn(o=mcn(e,(cL(t,14)?BB(t,14).gc():F3(t.Kc()))/n.a|0),z3n,1),u=new Ia,a=0,c=t.Kc();c.Ob();)i=BB(c.Pb(),86),u=Wen(Pun(Gk(xnt,1),HWn,20,0,[u,new bg(i)])),a<i.f.b&&(a=i.f.b);for(r=t.Kc();r.Ob();)hon(i=BB(r.Pb(),86),(qqn(),ukt),a);HSn(o),Zxn(n,u,e)}}function nDn(n,t){var i,r,c,a,u,o,s;for(i=KQn,uSn(),o=Cut,c=new Wb(t.a);c.a<c.c.c.length;)(a=(r=BB(n0(c),10)).k)!=Cut&&(null==(u=MD(mMn(r,(hWn(),plt))))?(i=e.Math.max(i,0),r.n.b=i+XN(n.a,a,o)):r.n.b=(kW(u),u)),s=XN(n.a,a,o),r.n.b<i+s+r.d.d&&(r.n.b=i+s+r.d.d),i=r.n.b+r.o.b+r.d.a,o=a}function tDn(n,t,e){var i,r,c;for(qan(c=new EAn(XXn(qSn(cDn(t,!1,!1)),Gy(MD(ZAn(t,(Epn(),pct))))+n.a)),t),VW(n.b,t,c),e.c[e.c.length]=c,!t.n&&(t.n=new eU(zOt,t,1,7)),r=new AL(t.n);r.e!=r.i.gc();)i=JRn(n,BB(kpn(r),137),!0,0,0),e.c[e.c.length]=i;return c}function eDn(n,t,e,i,r){var c,a,u;if(n.d&&n.d.lg(r),Dvn(n,e,BB(r.Xb(0),33),!1))return!0;if(Dvn(n,i,BB(r.Xb(r.gc()-1),33),!0))return!0;if(NMn(n,r))return!0;for(u=r.Kc();u.Ob();)for(a=BB(u.Pb(),33),c=t.Kc();c.Ob();)if(_Dn(n,a,BB(c.Pb(),33)))return!0;return!1}function iDn(n,t,e){var i,r,c,a,u,o,s,h,f;f=t.c.length;n:for(c=BB((s=n.Yg(e))>=0?n._g(s,!1,!0):cOn(n,e,!1),58).Kc();c.Ob();){for(r=BB(c.Pb(),56),h=0;h<f;++h)if(l1(h,t.c.length),o=(a=BB(t.c[h],72)).dd(),u=a.ak(),i=r.bh(u,!1),null==o?null!=i:!Nfn(o,i))continue n;return r}return null}function rDn(n,t,e,i){var r,c,a,u;for(r=BB(DSn(t,(kUn(),CIt)).Kc().Pb(),11),c=BB(DSn(t,oIt).Kc().Pb(),11),u=new Wb(n.j);u.a<u.c.c.length;){for(a=BB(n0(u),11);0!=a.e.c.length;)MZ(BB(xq(a.e,0),17),r);for(;0!=a.g.c.length;)SZ(BB(xq(a.g,0),17),c)}e||hon(t,(hWn(),hlt),null),i||hon(t,(hWn(),flt),null)}function cDn(n,t,e){var i,r;if(0==(!n.a&&(n.a=new eU(FOt,n,6,6)),n.a).i)return qun(n);if(i=BB(Wtn((!n.a&&(n.a=new eU(FOt,n,6,6)),n.a),0),202),t&&(sqn((!i.a&&(i.a=new $L(xOt,i,5)),i.a)),Ien(i,0),Aen(i,0),Ten(i,0),Oen(i,0)),e)for(!n.a&&(n.a=new eU(FOt,n,6,6)),r=n.a;r.i>1;)fDn(r,r.i-1);return i}function aDn(n,t){var e,i,r,c,a,u,o;for(OTn(t,"Comment post-processing",1),c=new Wb(n.b);c.a<c.c.c.length;){for(r=BB(n0(c),29),i=new Np,u=new Wb(r.a);u.a<u.c.c.length;)a=BB(n0(u),10),o=BB(mMn(a,(hWn(),Klt)),15),e=BB(mMn(a,Dft),15),(o||e)&&(Wzn(a,o,e),o&&gun(i,o),e&&gun(i,e));gun(r.a,i)}HSn(t)}function uDn(n,t){var e,i,r,c,a,u;for(e=new Lp,r=new Wb(n.b);r.a<r.c.c.length;){for(u=!0,i=0,a=new Wb(BB(n0(r),29).a);a.a<a.c.c.length;)switch((c=BB(n0(a),10)).k.g){case 4:++i;case 1:w3(e,c);break;case 0:oCn(c,t);default:e.b==e.c||p_n(e,i,u,!1,t),u=!1,i=0}e.b==e.c||p_n(e,i,u,!0,t)}}function oDn(n,t){var e,i,r,c,a,u;for(r=new Np,e=0;e<=n.i;e++)(i=new HX(t)).p=n.i-e,r.c[r.c.length]=i;for(u=new Wb(n.o);u.a<u.c.c.length;)PZ(a=BB(n0(u),10),BB(xq(r,n.i-n.f[a.p]),29));for(c=new Wb(r);c.a<c.c.c.length;)0==BB(n0(c),29).a.c.length&&AU(c);t.b.c=x8(Ant,HWn,1,0,5,1),gun(t.b,r)}function sDn(n,t){var e,i,r,c,a,u;for(e=0,u=new Wb(t);u.a<u.c.c.length;){for(a=BB(n0(u),11),nhn(n.b,n.d[a.p]),r=new m6(a.b);y$(r.a)||y$(r.b);)(c=ME(n,a==(i=BB(y$(r.a)?n0(r.a):n0(r.b),17)).c?i.d:i.c))>n.d[a.p]&&(e+=n5(n.b,c),d3(n.a,iln(c)));for(;!Wy(n.a);)Mnn(n.b,BB(dU(n.a),19).a)}return e}function hDn(n,t,e){var i,r,c,a;for(c=(!t.a&&(t.a=new eU(UOt,t,10,11)),t.a).i,r=new AL((!t.a&&(t.a=new eU(UOt,t,10,11)),t.a));r.e!=r.i.gc();)0==(!(i=BB(kpn(r),33)).a&&(i.a=new eU(UOt,i,10,11)),i.a).i||(c+=hDn(n,i,!1));if(e)for(a=JJ(t);a;)c+=(!a.a&&(a.a=new eU(UOt,a,10,11)),a.a).i,a=JJ(a);return c}function fDn(n,t){var e,i,r,c;return n.ej()?(i=null,r=n.fj(),n.ij()&&(i=n.kj(n.pi(t),null)),e=n.Zi(4,c=Lyn(n,t),null,t,r),n.bj()&&null!=c?(i=n.dj(c,i))?(i.Ei(e),i.Fi()):n.$i(e):i?(i.Ei(e),i.Fi()):n.$i(e),c):(c=Lyn(n,t),n.bj()&&null!=c&&(i=n.dj(c,null))&&i.Fi(),c)}function lDn(n){var t,i,r,c,a,u,o,s,h,f;for(h=n.a,t=new Rv,s=0,r=new Wb(n.d);r.a<r.c.c.length;){for(f=0,_rn((i=BB(n0(r),222)).b,new $n),u=spn(i.b,0);u.b!=u.d.c;)a=BB(b3(u),222),t.a._b(a)&&(c=i.c,f<(o=a.c).d+o.a+h&&f+c.a+h>o.d&&(f=o.d+o.a+h));i.c.d=f,t.a.zc(i,t),s=e.Math.max(s,i.c.d+i.c.a)}return s}function bDn(){bDn=O,hft=new LP("COMMENTS",0),lft=new LP("EXTERNAL_PORTS",1),bft=new LP("HYPEREDGES",2),wft=new LP("HYPERNODES",3),dft=new LP("NON_FREE_PORTS",4),gft=new LP("NORTH_SOUTH_PORTS",5),vft=new LP(G1n,6),sft=new LP("CENTER_LABELS",7),fft=new LP("END_LABELS",8),pft=new LP("PARTITIONS",9)}function wDn(n){var t,e,i,r,c;for(r=new Np,t=new $q((!n.a&&(n.a=new eU(UOt,n,10,11)),n.a)),i=new oz(ZL(dLn(n).a.Kc(),new h));dAn(i);)cL(Wtn((!(e=BB(U5(i),79)).b&&(e.b=new hK(KOt,e,4,7)),e.b),0),186)||(c=PTn(BB(Wtn((!e.c&&(e.c=new hK(KOt,e,5,8)),e.c),0),82)),t.a._b(c)||(r.c[r.c.length]=c));return r}function dDn(n){var t,e,i,r,c;for(r=new Rv,t=new $q((!n.a&&(n.a=new eU(UOt,n,10,11)),n.a)),i=new oz(ZL(dLn(n).a.Kc(),new h));dAn(i);)cL(Wtn((!(e=BB(U5(i),79)).b&&(e.b=new hK(KOt,e,4,7)),e.b),0),186)||(c=PTn(BB(Wtn((!e.c&&(e.c=new hK(KOt,e,5,8)),e.c),0),82)),t.a._b(c)||r.a.zc(c,r));return r}function gDn(n,t,e,i,r){return i<0?((i=zTn(n,r,Pun(Gk(Qtt,1),sVn,2,6,[YVn,JVn,ZVn,nQn,tQn,eQn,iQn,rQn,cQn,aQn,uQn,oQn]),t))<0&&(i=zTn(n,r,Pun(Gk(Qtt,1),sVn,2,6,["Jan","Feb","Mar","Apr",tQn,"Jun","Jul","Aug","Sep","Oct","Nov","Dec"]),t)),!(i<0||(e.k=i,0))):i>0&&(e.k=i-1,!0)}function pDn(n,t,e,i,r){return i<0?((i=zTn(n,r,Pun(Gk(Qtt,1),sVn,2,6,[YVn,JVn,ZVn,nQn,tQn,eQn,iQn,rQn,cQn,aQn,uQn,oQn]),t))<0&&(i=zTn(n,r,Pun(Gk(Qtt,1),sVn,2,6,["Jan","Feb","Mar","Apr",tQn,"Jun","Jul","Aug","Sep","Oct","Nov","Dec"]),t)),!(i<0||(e.k=i,0))):i>0&&(e.k=i-1,!0)}function vDn(n,t,e,i,r,c){var a,u,o;if(u=32,i<0){if(t[0]>=n.length)return!1;if(43!=(u=fV(n,t[0]))&&45!=u)return!1;if(++t[0],(i=UIn(n,t))<0)return!1;45==u&&(i=-i)}return 32==u&&t[0]-e==2&&2==r.b&&(a=(o=(new AT).q.getFullYear()-sQn+sQn-80)%100,c.a=i==a,i+=100*(o/100|0)+(i<a?100:0)),c.p=i,!0}function mDn(n,t){var i,r,c;JJ(n)&&(c=BB(mMn(t,(HXn(),Fgt)),174),GI(ZAn(n,ept))===GI((QEn(),YCt))&&Ypn(n,ept,QCt),GM(),r=qzn(new Dy(JJ(n)),new JN(JJ(n)?new Dy(JJ(n)):null,n),!1,!0),orn(c,(mdn(),DIt)),(i=BB(mMn(t,Hgt),8)).a=e.Math.max(r.a,i.a),i.b=e.Math.max(r.b,i.b))}function yDn(n,t,e){var i,r,c,a,u,o;for(a=BB(mMn(n,(hWn(),nlt)),15).Kc();a.Ob();){switch(c=BB(a.Pb(),10),BB(mMn(c,(HXn(),kgt)),163).g){case 2:PZ(c,t);break;case 4:PZ(c,e)}for(r=new oz(ZL(hbn(c).a.Kc(),new h));dAn(r);)(i=BB(U5(r),17)).c&&i.d||(u=!i.d,o=BB(mMn(i,mlt),11),u?MZ(i,o):SZ(i,o))}}function kDn(){kDn=O,Bst=new WV(mJn,0,(kUn(),sIt),sIt),Gst=new WV(kJn,1,SIt,SIt),Fst=new WV(yJn,2,oIt,oIt),Xst=new WV(jJn,3,CIt,CIt),qst=new WV("NORTH_WEST_CORNER",4,CIt,sIt),Hst=new WV("NORTH_EAST_CORNER",5,sIt,oIt),Ust=new WV("SOUTH_WEST_CORNER",6,SIt,CIt),zst=new WV("SOUTH_EAST_CORNER",7,oIt,SIt)}function jDn(){jDn=O,MMt=Pun(Gk(LNt,1),FQn,25,14,[1,1,2,6,24,120,720,5040,40320,362880,3628800,39916800,479001600,6227020800,87178291200,1307674368e3,{l:3506176,m:794077,h:1},{l:884736,m:916411,h:20},{l:3342336,m:3912489,h:363},{l:589824,m:3034138,h:6914},{l:3407872,m:1962506,h:138294}]),e.Math.pow(2,-65)}function EDn(n,t){var e,i,r,c,a;if(0==n.c.length)return new rI(iln(0),iln(0));for(e=(l1(0,n.c.length),BB(n.c[0],11)).j,a=0,c=t.g,i=t.g+1;a<n.c.length-1&&e.g<c;)e=(l1(++a,n.c.length),BB(n.c[a],11)).j;for(r=a;r<n.c.length-1&&e.g<i;)++r,e=(l1(a,n.c.length),BB(n.c[a],11)).j;return new rI(iln(a),iln(r))}function TDn(n,t,i){var r,c,a,u,o,s,h,f,l,b;for(a=t.c.length,l1(i,t.c.length),o=(u=BB(t.c[i],286)).a.o.a,l=u.c,b=0,h=u.c;h<=u.f;h++){if(o<=n.a[h])return h;for(f=n.a[h],s=null,c=i+1;c<a;c++)l1(c,t.c.length),(r=BB(t.c[c],286)).c<=h&&r.f>=h&&(s=r);s&&(f=e.Math.max(f,s.a.o.a)),f>b&&(l=h,b=f)}return l}function MDn(n,t,e){var i,r,c;if(n.e=e,n.d=0,n.b=0,n.f=1,n.i=t,16==(16&n.e)&&(n.i=pKn(n.i)),n.j=n.i.length,QXn(n),c=Vdn(n),n.d!=n.j)throw Hp(new ak(kWn((u$(),w8n))));if(n.g){for(i=0;i<n.g.a.c.length;i++)if(r=BB(bW(n.g,i),584),n.f<=r.a)throw Hp(new ak(kWn((u$(),d8n))));n.g.a.c=x8(Ant,HWn,1,0,5,1)}return c}function SDn(n,t){var e,i,r;if(null==t){for(!n.a&&(n.a=new eU(WAt,n,9,5)),i=new AL(n.a);i.e!=i.i.gc();)if(null==(null==(r=(e=BB(kpn(i),678)).c)?e.zb:r))return e}else for(!n.a&&(n.a=new eU(WAt,n,9,5)),i=new AL(n.a);i.e!=i.i.gc();)if(mK(t,null==(r=(e=BB(kpn(i),678)).c)?e.zb:r))return e;return null}function PDn(n,t){var e;switch(e=null,t.g){case 1:n.e.Xe((sWn(),ePt))&&(e=BB(n.e.We(ePt),249));break;case 3:n.e.Xe((sWn(),iPt))&&(e=BB(n.e.We(iPt),249));break;case 2:n.e.Xe((sWn(),tPt))&&(e=BB(n.e.We(tPt),249));break;case 4:n.e.Xe((sWn(),rPt))&&(e=BB(n.e.We(rPt),249))}return!e&&(e=BB(n.e.We((sWn(),ZSt)),249)),e}function CDn(n,t,e){var i,r,c,a,u,o;for(t.p=1,r=t.c,o=xwn(t,(ain(),qvt)).Kc();o.Ob();)for(i=new Wb(BB(o.Pb(),11).g);i.a<i.c.c.length;)t!=(u=BB(n0(i),17).d.i)&&u.c.p<=r.p&&((c=r.p+1)==e.b.c.length?((a=new HX(e)).p=c,WB(e.b,a),PZ(u,a)):PZ(u,a=BB(xq(e.b,c),29)),CDn(n,u,e))}function IDn(n,t,i){var r,c,a,u,o,s;for(c=i,a=0,o=new Wb(t);o.a<o.c.c.length;)Ypn(u=BB(n0(o),33),(Uyn(),Ljt),iln(c++)),s=wDn(u),r=e.Math.atan2(u.j+u.f/2,u.i+u.g/2),(r+=r<0?Z3n:0)<.7853981633974483||r>p4n?m$(s,n.b):r<=p4n&&r>v4n?m$(s,n.d):r<=v4n&&r>m4n?m$(s,n.c):r<=m4n&&m$(s,n.a),a=IDn(n,s,a);return c}function ODn(){var n;for(ODn=O,Jtt=new X6(1,1),net=new X6(1,10),eet=new X6(0,0),Ytt=new X6(-1,1),Ztt=Pun(Gk(oet,1),sVn,91,0,[eet,Jtt,new X6(1,2),new X6(1,3),new X6(1,4),new X6(1,5),new X6(1,6),new X6(1,7),new X6(1,8),new X6(1,9),net]),tet=x8(oet,sVn,91,32,0,1),n=0;n<tet.length;n++)tet[n]=npn(yz(1,n))}function ADn(n,t,e,i,r,c){var a,u,o,s;for(u=!jE(AV(n.Oc(),new aw(new Je))).sd((dM(),tit)),a=n,c==(Ffn(),HPt)&&(a=cL(a,152)?o6(BB(a,152)):cL(a,131)?BB(a,131).a:cL(a,54)?new fy(a):new CT(a)),s=a.Kc();s.Ob();)(o=BB(s.Pb(),70)).n.a=t.a,o.n.b=u?t.b+(i.b-o.o.b)/2:r?t.b:t.b+i.b-o.o.b,t.a+=o.o.a+e}function $Dn(n,t,e,i){var r,c,a,u,o;for(r=(i.c+i.a)/2,yQ(t.j),DH(t.j,r),yQ(e.e),DH(e.e,r),o=new zj,a=new Wb(n.f);a.a<a.c.c.length;)Rjn(o,t,u=BB(n0(a),129).a),Rjn(o,e,u);for(c=new Wb(n.k);c.a<c.c.c.length;)Rjn(o,t,u=BB(n0(c),129).b),Rjn(o,e,u);return o.b+=2,o.a+=LQ(t,n.q),o.a+=LQ(n.q,e),o}function LDn(n,t,e){var i,r,c,a,u;if(!h3(t)){for(OTn(u=mcn(e,(cL(t,14)?BB(t,14).gc():F3(t.Kc()))/n.a|0),z3n,1),a=new Aa,c=null,r=t.Kc();r.Ob();)i=BB(r.Pb(),86),a=Wen(Pun(Gk(xnt,1),HWn,20,0,[a,new bg(i)])),c&&(hon(c,(qqn(),bkt),i),hon(i,ckt,c),G8(i)==G8(c)&&(hon(c,wkt,i),hon(i,akt,c))),c=i;HSn(u),LDn(n,a,e)}}function NDn(n){var t,e,i,r,c,a,u;for(e=n.i,t=n.n,u=e.d,n.f==(G7(),rrt)?u+=(e.a-n.e.b)/2:n.f==irt&&(u+=e.a-n.e.b),r=new Wb(n.d);r.a<r.c.c.length;){switch(a=(i=BB(n0(r),181)).rf(),(c=new Gj).b=u,u+=a.b+n.a,n.b.g){case 0:c.a=e.c+t.b;break;case 1:c.a=e.c+t.b+(e.b-a.a)/2;break;case 2:c.a=e.c+e.b-t.c-a.a}i.tf(c)}}function xDn(n){var t,e,i,r,c,a,u;for(e=n.i,t=n.n,u=e.c,n.b==(J9(),Qit)?u+=(e.b-n.e.a)/2:n.b==Jit&&(u+=e.b-n.e.a),r=new Wb(n.d);r.a<r.c.c.length;){switch(a=(i=BB(n0(r),181)).rf(),(c=new Gj).a=u,u+=a.a+n.a,n.f.g){case 0:c.b=e.d+t.d;break;case 1:c.b=e.d+t.d+(e.a-a.b)/2;break;case 2:c.b=e.d+e.a-t.a-a.b}i.tf(c)}}function DDn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b;s=e.a.c,a=e.a.c+e.a.b,l=(c=BB(RX(e.c,t),459)).f,b=c.a,u=new xC(s,l),h=new xC(a,b),r=s,e.p||(r+=n.c),o=new xC(r+=e.F+e.v*n.b,l),f=new xC(r,b),nin(t.a,Pun(Gk(PMt,1),sVn,8,0,[u,o])),e.d.a.gc()>1&&(i=new xC(r,e.b),DH(t.a,i)),nin(t.a,Pun(Gk(PMt,1),sVn,8,0,[f,h]))}function RDn(n){NM(n,new MTn(vj(wj(pj(gj(new du,_5n),"ELK Randomizer"),'Distributes the nodes randomly on the plane, leading to very obfuscating layouts. Can be useful to demonstrate the power of "real" layout algorithms.'),new Qu))),u2(n,_5n,QJn,LIt),u2(n,_5n,vZn,15),u2(n,_5n,yZn,iln(0)),u2(n,_5n,VJn,dZn)}function KDn(){var n,t,e,i,r,c;for(KDn=O,QLt=x8(NNt,v6n,25,255,15,1),YLt=x8(ONt,WVn,25,16,15,1),t=0;t<255;t++)QLt[t]=-1;for(e=57;e>=48;e--)QLt[e]=e-48<<24>>24;for(i=70;i>=65;i--)QLt[i]=i-65+10<<24>>24;for(r=102;r>=97;r--)QLt[r]=r-97+10<<24>>24;for(c=0;c<10;c++)YLt[c]=48+c&QVn;for(n=10;n<=15;n++)YLt[n]=65+n-10&QVn}function _Dn(n,t,e){var i,r,c,a,u,o,s,h;return u=t.i-n.g/2,o=e.i-n.g/2,s=t.j-n.g/2,h=e.j-n.g/2,c=t.g+n.g/2,a=e.g+n.g/2,i=t.f+n.g/2,r=e.f+n.g/2,u<o+a&&o<u&&s<h+r&&h<s||o<u+c&&u<o&&h<s+i&&s<h||u<o+a&&o<u&&s<h&&h<s+i||o<u+c&&u<o&&s<h+r&&h<s}function FDn(n){var t,i,r,c,a;c=BB(mMn(n,(HXn(),Fgt)),21),a=BB(mMn(n,qgt),21),t=new wA(i=new xC(n.f.a+n.d.b+n.d.c,n.f.b+n.d.d+n.d.a)),c.Hc((mdn(),DIt))&&(r=BB(mMn(n,Hgt),8),a.Hc((n_n(),GIt))&&(r.a<=0&&(r.a=20),r.b<=0&&(r.b=20)),t.a=e.Math.max(i.a,r.a),t.b=e.Math.max(i.b,r.b)),qy(TD(mMn(n,Bgt)))||UBn(n,i,t)}function BDn(n,t){var e,i,r,c;for(c=abn(t,(kUn(),SIt)).Kc();c.Ob();)i=BB(c.Pb(),11),(e=BB(mMn(i,(hWn(),Elt)),10))&&UNn(aM(cM(uM(rM(new Hv,0),.1),n.i[t.p].d),n.i[e.p].a));for(r=abn(t,sIt).Kc();r.Ob();)i=BB(r.Pb(),11),(e=BB(mMn(i,(hWn(),Elt)),10))&&UNn(aM(cM(uM(rM(new Hv,0),.1),n.i[e.p].d),n.i[t.p].a))}function HDn(n){var t,e,i,r,c;if(!n.c){if(c=new Eo,null==(t=P$t).a.zc(n,t)){for(i=new AL(a4(n));i.e!=i.i.gc();)cL(r=lFn(e=BB(kpn(i),87)),88)&&pX(c,HDn(BB(r,26))),f9(c,e);t.a.Bc(n),t.a.gc()}$wn(c),chn(c),n.c=new NO((BB(Wtn(QQ((QX(),t$t).o),15),18),c.i),c.g),P5(n).b&=-33}return n.c}function qDn(n){var t;if(10!=n.c)throw Hp(new ak(kWn((u$(),g8n))));switch(t=n.a){case 110:t=10;break;case 114:t=13;break;case 116:t=9;break;case 92:case 124:case 46:case 94:case 45:case 63:case 42:case 43:case 123:case 125:case 40:case 41:case 91:case 93:break;default:throw Hp(new ak(kWn((u$(),U8n))))}return t}function GDn(n){var t,e,i,r;if(0==n.l&&0==n.m&&0==n.h)return"0";if(n.h==CQn&&0==n.m&&0==n.l)return"-9223372036854775808";if(n.h>>19!=0)return"-"+GDn(aon(n));for(e=n,i="";0!=e.l||0!=e.m||0!=e.h;){if(e=Aqn(e,F5(AQn),!0),t=""+TE(ltt),0!=e.l||0!=e.m||0!=e.h)for(r=9-t.length;r>0;r--)t="0"+t;i=t+i}return i}function zDn(){if(!Object.create||!Object.getOwnPropertyNames)return!1;var n="__proto__",t=Object.create(null);return void 0===t[n]&&0==Object.getOwnPropertyNames(t).length&&(t[n]=42,42===t[n]&&0!=Object.getOwnPropertyNames(t).length)}function UDn(n){var t,e,i,r,c,a,u;for(t=!1,e=0,r=new Wb(n.d.b);r.a<r.c.c.length;)for((i=BB(n0(r),29)).p=e++,a=new Wb(i.a);a.a<a.c.c.length;)c=BB(n0(a),10),!t&&!h3(hbn(c))&&(t=!0);u=EG((Ffn(),BPt),Pun(Gk(WPt,1),$Vn,103,0,[_Pt,FPt])),t||(orn(u,HPt),orn(u,KPt)),n.a=new ltn(u),$U(n.f),$U(n.b),$U(n.e),$U(n.g)}function XDn(n,t,e){var i,r,c,a,u,o,s,h,f;for(i=e.c,r=e.d,u=g1(t.c),o=g1(t.d),i==t.c?(u=lLn(n,u,r),o=sMn(t.d)):(u=sMn(t.c),o=lLn(n,o,r)),r5(s=new Kj(t.a),u,s.a,s.a.a),r5(s,o,s.c.b,s.c),a=t.c==i,f=new Jv,c=0;c<s.b-1;++c)h=new rI(BB(Dpn(s,c),8),BB(Dpn(s,c+1),8)),a&&0==c||!a&&c==s.b-2?f.b=h:WB(f.a,h);return f}function WDn(n,t){var e,i,r,c;if(0!=(c=n.j.g-t.j.g))return c;if(e=BB(mMn(n,(HXn(),ipt)),19),i=BB(mMn(t,ipt),19),e&&i&&0!=(r=e.a-i.a))return r;switch(n.j.g){case 1:return Pln(n.n.a,t.n.a);case 2:return Pln(n.n.b,t.n.b);case 3:return Pln(t.n.a,n.n.a);case 4:return Pln(t.n.b,n.n.b);default:throw Hp(new Fy(r1n))}}function VDn(n,t,i,r){var c,a,u,o;if(F3((q_(),new oz(ZL(hbn(t).a.Kc(),new h))))>=n.a)return-1;if(!eTn(t,i))return-1;if(h3(BB(r.Kb(t),20)))return 1;for(c=0,u=BB(r.Kb(t),20).Kc();u.Ob();){if(-1==(o=VDn(n,(a=BB(u.Pb(),17)).c.i==t?a.d.i:a.c.i,i,r)))return-1;if((c=e.Math.max(c,o))>n.c-1)return-1}return c+1}function QDn(n,t){var e,i,r,c,a,u;if(GI(t)===GI(n))return!0;if(!cL(t,15))return!1;if(i=BB(t,15),u=n.gc(),i.gc()!=u)return!1;if(a=i.Kc(),n.ni()){for(e=0;e<u;++e)if(r=n.ki(e),c=a.Pb(),null==r?null!=c:!Nfn(r,c))return!1}else for(e=0;e<u;++e)if(r=n.ki(e),c=a.Pb(),GI(r)!==GI(c))return!1;return!0}function YDn(n,t){var e,i,r,c,a,u;if(n.f>0)if(n.qj(),null!=t){for(c=0;c<n.d.length;++c)if(e=n.d[c])for(i=BB(e.g,367),u=e.i,a=0;a<u;++a)if(Nfn(t,(r=i[a]).dd()))return!0}else for(c=0;c<n.d.length;++c)if(e=n.d[c])for(i=BB(e.g,367),u=e.i,a=0;a<u;++a)if(r=i[a],GI(t)===GI(r.dd()))return!0;return!1}function JDn(n,t,e){var i,r,c,a;OTn(e,"Orthogonally routing hierarchical port edges",1),n.a=0,NGn(t,i=UHn(t)),Qqn(n,t,i),fUn(t),r=BB(mMn(t,(HXn(),ept)),98),Czn((l1(0,(c=t.b).c.length),BB(c.c[0],29)),r,t),Czn(BB(xq(c,c.c.length-1),29),r,t),TBn((l1(0,(a=t.b).c.length),BB(a.c[0],29))),TBn(BB(xq(a,a.c.length-1),29)),HSn(e)}function ZDn(n){switch(n){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:return n-48<<24>>24;case 97:case 98:case 99:case 100:case 101:case 102:return n-97+10<<24>>24;case 65:case 66:case 67:case 68:case 69:case 70:return n-65+10<<24>>24;default:throw Hp(new Mk("Invalid hexadecimal"))}}function nRn(n,t,e){var i,r,c,a;for(OTn(e,"Processor order nodes",2),n.a=Gy(MD(mMn(t,(CAn(),xkt)))),r=new YT,a=spn(t.b,0);a.b!=a.d.c;)qy(TD(mMn(c=BB(b3(a),86),(qqn(),dkt))))&&r5(r,c,r.c.b,r.c);Px(0!=r.b),KHn(n,i=BB(r.a.a.c,86)),!e.b&&qin(e,1),BRn(n,i,0-Gy(MD(mMn(i,(qqn(),ukt))))/2,0),!e.b&&qin(e,1),HSn(e)}function tRn(){tRn=O,Rit=new HS("SPIRAL",0),$it=new HS("LINE_BY_LINE",1),Lit=new HS("MANHATTAN",2),Ait=new HS("JITTER",3),xit=new HS("QUADRANTS_LINE_BY_LINE",4),Dit=new HS("QUADRANTS_MANHATTAN",5),Nit=new HS("QUADRANTS_JITTER",6),Oit=new HS("COMBINE_LINE_BY_LINE_MANHATTAN",7),Iit=new HS("COMBINE_JITTER_MANHATTAN",8)}function eRn(n,t,e,i){var r,c,a,u,o,s;for(o=Njn(n,e),s=Njn(t,e),r=!1;o&&s&&(i||myn(o,s,e));)a=Njn(o,e),u=Njn(s,e),A7(t),A7(n),c=o.c,rGn(o,!1),rGn(s,!1),e?(Qyn(t,s.p,c),t.p=s.p,Qyn(n,o.p+1,c),n.p=o.p):(Qyn(n,o.p,c),n.p=o.p,Qyn(t,s.p+1,c),t.p=s.p),PZ(o,null),PZ(s,null),o=a,s=u,r=!0;return r}function iRn(n,t,e,i){var r,c,a,u,o;for(r=!1,c=!1,u=new Wb(i.j);u.a<u.c.c.length;)GI(mMn(a=BB(n0(u),11),(hWn(),dlt)))===GI(e)&&(0==a.g.c.length?0==a.e.c.length||(r=!0):c=!0);return o=0,r&&r^c?o=e.j==(kUn(),sIt)?-n.e[i.c.p][i.p]:t-n.e[i.c.p][i.p]:c&&r^c?o=n.e[i.c.p][i.p]+1:r&&c&&(o=e.j==(kUn(),sIt)?0:t/2),o}function rRn(n,t,e,i,r,c,a,u){var o,s,h;for(o=0,null!=t&&(o^=vvn(t.toLowerCase())),null!=e&&(o^=vvn(e)),null!=i&&(o^=vvn(i)),null!=a&&(o^=vvn(a)),null!=u&&(o^=vvn(u)),s=0,h=c.length;s<h;s++)o^=vvn(c[s]);n?o|=256:o&=-257,r?o|=16:o&=-17,this.f=o,this.i=null==t?null:(kW(t),t),this.a=e,this.d=i,this.j=c,this.g=a,this.e=u}function cRn(n,t,e){var i,r;switch(r=null,t.g){case 1:gcn(),r=Nut;break;case 2:gcn(),r=Dut}switch(i=null,e.g){case 1:gcn(),i=xut;break;case 2:gcn(),i=Lut;break;case 3:gcn(),i=Rut;break;case 4:gcn(),i=Kut}return r&&i?KB(n.j,new Hf(new Jy(Pun(Gk(Lnt,1),HWn,169,0,[BB(yX(r),169),BB(yX(i),169)])))):(SQ(),SQ(),set)}function aRn(n){var t,e,i;switch(t=BB(mMn(n,(HXn(),Hgt)),8),hon(n,Hgt,new xC(t.b,t.a)),BB(mMn(n,kdt),248).g){case 1:hon(n,kdt,(wvn(),LMt));break;case 2:hon(n,kdt,(wvn(),IMt));break;case 3:hon(n,kdt,(wvn(),AMt));break;case 4:hon(n,kdt,(wvn(),$Mt))}(n.q?n.q:(SQ(),SQ(),het))._b(spt)&&(i=(e=BB(mMn(n,spt),8)).a,e.a=e.b,e.b=i)}function uRn(n,t,e,i,r,c){if(this.b=e,this.d=r,n>=t.length)throw Hp(new Ay("Greedy SwitchDecider: Free layer not in graph."));this.c=t[n],this.e=new QK(i),yrn(this.e,this.c,(kUn(),CIt)),this.i=new QK(i),yrn(this.i,this.c,oIt),this.f=new lG(this.c),this.a=!c&&r.i&&!r.s&&this.c[0].k==(uSn(),Mut),this.a&&gPn(this,n,t.length)}function oRn(n,t){var e,i,r,c,a,u;c=!n.B.Hc((n_n(),HIt)),a=n.B.Hc(zIt),n.a=new Hwn(a,c,n.c),n.n&&kQ(n.a.n,n.n),jy(n.g,(Dtn(),zit),n.a),t||((i=new Ign(1,c,n.c)).n.a=n.k,mG(n.p,(kUn(),sIt),i),(r=new Ign(1,c,n.c)).n.d=n.k,mG(n.p,SIt,r),(u=new Ign(0,c,n.c)).n.c=n.k,mG(n.p,CIt,u),(e=new Ign(0,c,n.c)).n.b=n.k,mG(n.p,oIt,e))}function sRn(n){var t,e,i;switch((t=BB(mMn(n.d,(HXn(),Zdt)),218)).g){case 2:e=MXn(n);break;case 3:i=new Np,JT(AV($V(wnn(wnn(new Rq(null,new w1(n.d.b,16)),new Or),new Ar),new $r),new pr),new Cd(i)),e=i;break;default:throw Hp(new Fy("Compaction not supported for "+t+" edges."))}gqn(n,e),e5(new Cb(n.g),new Sd(n))}function hRn(n,t){var e;return e=new Zn,t&&qan(e,BB(RX(n.a,DOt),94)),cL(t,470)&&qan(e,BB(RX(n.a,ROt),94)),cL(t,354)?(qan(e,BB(RX(n.a,zOt),94)),e):(cL(t,82)&&qan(e,BB(RX(n.a,KOt),94)),cL(t,239)?(qan(e,BB(RX(n.a,UOt),94)),e):cL(t,186)?(qan(e,BB(RX(n.a,XOt),94)),e):(cL(t,352)&&qan(e,BB(RX(n.a,_Ot),94)),e))}function fRn(){fRn=O,Zct=new XA((sWn(),pPt),iln(1)),cat=new XA(LPt,80),rat=new XA(SPt,5),Fct=new XA(cSt,dZn),nat=new XA(vPt,iln(1)),iat=new XA(kPt,(hN(),!0)),Qct=new WA(50),Vct=new XA(XSt,Qct),Hct=CSt,Yct=uPt,Bct=new XA(dSt,!1),Wct=USt,Xct=qSt,Uct=KSt,zct=DSt,Jct=fPt,jSn(),Gct=Ict,aat=Nct,qct=Cct,tat=Act,eat=Lct}function lRn(n){var t,e,i,r,c,a,u;for(u=new v5,a=new Wb(n.a);a.a<a.c.c.length;)if((c=BB(n0(a),10)).k!=(uSn(),Mut))for(_An(u,c,new Gj),r=new oz(ZL(lbn(c).a.Kc(),new h));dAn(r);)if((i=BB(U5(r),17)).c.i.k!=Mut&&i.d.i.k!=Mut)for(e=spn(i.a,0);e.b!=e.d.c;)Yjn(u,new dP((t=BB(b3(e),8)).a,t.b));return u}function bRn(){bRn=O,RTt=new up(K4n),OM(),xTt=new $O(q4n,DTt=GTt),Lun(),LTt=new $O(_4n,NTt=WTt),$Sn(),ATt=new $O(F4n,$Tt=rTt),PTt=new $O(B4n,null),$6(),ITt=new $O(H4n,OTt=ZEt),CM(),jTt=new $O(G4n,ETt=XEt),TTt=new $O(z4n,(hN(),!1)),MTt=new $O(U4n,iln(64)),STt=new $O(X4n,!0),CTt=nTt}function wRn(n){var t,e,i,r,c;if(null==n.a)if(n.a=x8($Nt,ZYn,25,n.c.b.c.length,16,1),n.a[0]=!1,Lx(n.c,(HXn(),Upt)))for(e=BB(mMn(n.c,Upt),15).Kc();e.Ob();)(t=BB(e.Pb(),19).a)>0&&t<n.a.length&&(n.a[t]=!1);else for((c=new Wb(n.c.b)).a<c.c.c.length&&n0(c),i=1;c.a<c.c.c.length;)r=BB(n0(c),29),n.a[i++]=U$n(r)}function dRn(n,t){var e,i;switch(i=n.b,t){case 1:n.b|=1,n.b|=4,n.b|=8;break;case 2:n.b|=2,n.b|=4,n.b|=8;break;case 4:n.b|=1,n.b|=2,n.b|=4,n.b|=8;break;case 3:n.b|=16,n.b|=8;break;case 0:n.b|=32,n.b|=16,n.b|=8,n.b|=1,n.b|=2,n.b|=4}if(n.b!=i&&n.c)for(e=new AL(n.c);e.e!=e.i.gc();)ACn(P5(BB(kpn(e),473)),t)}function gRn(n,t,e,i){var r,c,a,u,o,s,h,f,l,b;for(r=!1,u=0,o=(a=t).length;u<o;++u)c=a[u],qy((hN(),!!c.e))&&!BB(xq(n.b,c.e.p),214).s&&(r|=(s=c.e,(f=(h=BB(xq(n.b,s.p),214)).e)[l=fj(e,f.length)][0].k==(uSn(),Mut)?f[l]=$Nn(c,f[l],e?(kUn(),CIt):(kUn(),oIt)):h.c.Tf(f,e),b=DNn(n,h,e,i),xxn(h.e,h.o,e),b));return r}function pRn(n,t){var e,i,r,c,a;for(c=(!t.a&&(t.a=new eU(UOt,t,10,11)),t.a).i,r=new AL((!t.a&&(t.a=new eU(UOt,t,10,11)),t.a));r.e!=r.i.gc();)GI(ZAn(i=BB(kpn(r),33),(sWn(),ESt)))!==GI((ufn(),mCt))&&((a=BB(ZAn(t,mPt),149))==(e=BB(ZAn(i,mPt),149))||a&&j5(a,e))&&0!=(!i.a&&(i.a=new eU(UOt,i,10,11)),i.a).i&&(c+=pRn(n,i));return c}function vRn(n){var t,e,i,r,c,a,u;for(i=0,u=0,a=new Wb(n.d);a.a<a.c.c.length;)c=BB(n0(a),101),r=BB(P4(AV(new Rq(null,new w1(c.j,16)),new Xr),m9(new H,new B,new rn,Pun(Gk(nit,1),$Vn,132,0,[(qsn(),Uet)]))),15),e=null,i<=u?(kUn(),e=sIt,i+=r.gc()):u<i&&(kUn(),e=SIt,u+=r.gc()),t=e,JT($V(r.Oc(),new Hr),new Ad(t))}function mRn(n){var t,e,i,r,c,a,u,o;for(n.b=new vOn(new Jy((kUn(),Pun(Gk(FIt,1),YZn,61,0,[PIt,sIt,oIt,SIt,CIt]))),new Jy((Crn(),Pun(Gk(Wst,1),$Vn,361,0,[Rst,Dst,xst])))),u=0,o=(a=Pun(Gk(FIt,1),YZn,61,0,[PIt,sIt,oIt,SIt,CIt])).length;u<o;++u)for(c=a[u],i=0,r=(e=Pun(Gk(Wst,1),$Vn,361,0,[Rst,Dst,xst])).length;i<r;++i)t=e[i],Wjn(n.b,c,t,new Np)}function yRn(n,t){var e,i,r,c,a,u,o,s,h,f;if(a=BB(BB(h6(n.r,t),21),84),u=n.u.Hc((lIn(),rIt)),e=n.u.Hc(tIt),i=n.u.Hc(nIt),s=n.u.Hc(cIt),f=n.B.Hc((n_n(),QIt)),h=!e&&!i&&(s||2==a.gc()),hxn(n,t),r=null,o=null,u){for(o=r=BB((c=a.Kc()).Pb(),111);c.Ob();)o=BB(c.Pb(),111);r.d.b=0,o.d.c=0,h&&!r.a&&(r.d.c=0)}f&&(DTn(a),u&&(r.d.b=0,o.d.c=0))}function kRn(n,t){var e,i,r,c,a,u,o,s,h,f;if(a=BB(BB(h6(n.r,t),21),84),u=n.u.Hc((lIn(),rIt)),e=n.u.Hc(tIt),i=n.u.Hc(nIt),o=n.u.Hc(cIt),f=n.B.Hc((n_n(),QIt)),s=!e&&!i&&(o||2==a.gc()),V_n(n,t),h=null,r=null,u){for(r=h=BB((c=a.Kc()).Pb(),111);c.Ob();)r=BB(c.Pb(),111);h.d.d=0,r.d.a=0,s&&!h.a&&(h.d.a=0)}f&&(RTn(a),u&&(h.d.d=0,r.d.a=0))}function jRn(n,t,e){var i,r,c,a,u;if(i=t.k,t.p>=0)return!1;if(t.p=e.b,WB(e.e,t),i==(uSn(),Put)||i==Iut)for(r=new Wb(t.j);r.a<r.c.c.length;)for(u=new zw(new Wb(new Gw(BB(n0(r),11)).a.g));y$(u.a);)if(a=(c=BB(n0(u.a),17).d.i).k,t.c!=c.c&&(a==Put||a==Iut)&&jRn(n,c,e))return!0;return!0}function ERn(n){var t;return 0!=(64&n.Db)?KOn(n):((t=new fN(KOn(n))).a+=" (changeable: ",yE(t,0!=(n.Bb&k6n)),t.a+=", volatile: ",yE(t,0!=(n.Bb&M9n)),t.a+=", transient: ",yE(t,0!=(n.Bb&_Qn)),t.a+=", defaultValueLiteral: ",cO(t,n.j),t.a+=", unsettable: ",yE(t,0!=(n.Bb&T9n)),t.a+=", derived: ",yE(t,0!=(n.Bb&hVn)),t.a+=")",t.a)}function TRn(n){var t,e,i,r,c,a,u,o,s,h;for(e=NLn(n.d),c=(r=BB(mMn(n.b,(Epn(),vct)),116)).b+r.c,a=r.d+r.a,o=e.d.a*n.e+c,u=e.b.a*n.f+a,Ll(n.b,new xC(o,u)),h=new Wb(n.g);h.a<h.c.c.length;)t=UR(Fx(new xC((s=BB(n0(h),562)).g-e.a.a,s.i-e.c.a),s.a,s.b),kL(Bx(B$(VA(s.e)),s.d*s.a,s.c*s.b),-.5)),i=QA(s.e),ij(s.e,XR(t,i))}function MRn(n,t,e,i){var r,c,a,u,o;for(o=x8(xNt,sVn,104,(kUn(),Pun(Gk(FIt,1),YZn,61,0,[PIt,sIt,oIt,SIt,CIt])).length,0,2),a=0,u=(c=Pun(Gk(FIt,1),YZn,61,0,[PIt,sIt,oIt,SIt,CIt])).length;a<u;++a)o[(r=c[a]).g]=x8(xNt,qQn,25,n.c[r.g],15,1);return Bkn(o,n,sIt),Bkn(o,n,SIt),xmn(o,n,sIt,t,e,i),xmn(o,n,oIt,t,e,i),xmn(o,n,SIt,t,e,i),xmn(o,n,CIt,t,e,i),o}function SRn(n,t,e){if(hU(n.a,t)){if(FT(BB(RX(n.a,t),53),e))return 1}else VW(n.a,t,new Rv);if(hU(n.a,e)){if(FT(BB(RX(n.a,e),53),t))return-1}else VW(n.a,e,new Rv);if(hU(n.b,t)){if(FT(BB(RX(n.b,t),53),e))return-1}else VW(n.b,t,new Rv);if(hU(n.b,e)){if(FT(BB(RX(n.b,e),53),t))return 1}else VW(n.b,e,new Rv);return 0}function PRn(n,t,e,i){var r,c,a,u,o,s;if(null==e)for(r=BB(n.g,119),u=0;u<n.i;++u)if((a=r[u]).ak()==t)return _pn(n,a,i);return ZM(),c=BB(t,66).Oj()?BB(e,72):Z3(t,e),mA(n.e)?(s=!adn(n,t),i=Ywn(n,c,i),o=t.$j()?LY(n,3,t,null,e,pBn(n,t,e,cL(t,99)&&0!=(BB(t,18).Bb&BQn)),s):LY(n,1,t,t.zj(),e,-1,s),i?i.Ei(o):i=o):i=Ywn(n,c,i),i}function CRn(n){var t,i,r,c,a,u;n.q!=(QEn(),WCt)&&n.q!=XCt&&(c=n.f.n.d+XH(BB(oV(n.b,(kUn(),sIt)),124))+n.c,t=n.f.n.a+XH(BB(oV(n.b,SIt),124))+n.c,r=BB(oV(n.b,oIt),124),u=BB(oV(n.b,CIt),124),a=e.Math.max(0,r.n.d-c),a=e.Math.max(a,u.n.d-c),i=e.Math.max(0,r.n.a-t),i=e.Math.max(i,u.n.a-t),r.n.d=a,u.n.d=a,r.n.a=i,u.n.a=i)}function IRn(n,t){var e,i,r,c,a,u,o;for(OTn(t,"Restoring reversed edges",1),a=new Wb(n.b);a.a<a.c.c.length;)for(u=new Wb(BB(n0(a),29).a);u.a<u.c.c.length;)for(o=new Wb(BB(n0(u),10).j);o.a<o.c.c.length;)for(r=0,c=(i=Z0(BB(n0(o),11).g)).length;r<c;++r)qy(TD(mMn(e=i[r],(hWn(),Clt))))&&tBn(e,!1);HSn(t)}function ORn(){this.b=new v4,this.d=new v4,this.e=new v4,this.c=new v4,this.a=new xp,this.f=new xp,xJ(PMt,new mu,new yu),xJ(NMt,new Au,new $u),xJ(Eut,new Lu,new Nu),xJ(_ut,new Du,new Ru),xJ(hOt,new Ku,new _u),xJ(met,new ku,new ju),xJ(Iet,new Eu,new Tu),xJ(jet,new Mu,new Su),xJ(Eet,new Pu,new Cu),xJ(Bet,new Iu,new Ou)}function ARn(n){var t,e,i,r,c,a;return c=0,(t=Ikn(n)).Bj()&&(c|=4),0!=(n.Bb&T9n)&&(c|=2),cL(n,99)?(r=Cvn(e=BB(n,18)),0!=(e.Bb&h6n)&&(c|=32),r&&(bX(dZ(r)),c|=8,((a=r.t)>1||-1==a)&&(c|=16),0!=(r.Bb&h6n)&&(c|=64)),0!=(e.Bb&BQn)&&(c|=M9n),c|=k6n):cL(t,457)?c|=512:(i=t.Bj())&&0!=(1&i.i)&&(c|=256),0!=(512&n.Bb)&&(c|=128),c}function $Rn(n,t){var e,i,r,c,a;for(n=null==n?zWn:(kW(n),n),r=0;r<t.length;r++)t[r]=iLn(t[r]);for(e=new Ik,a=0,i=0;i<t.length&&-1!=(c=n.indexOf("%s",a));)e.a+=""+fx(null==n?zWn:(kW(n),n),a,c),uO(e,t[i++]),a=c+2;if(G0(e,n,a,n.length),i<t.length){for(e.a+=" [",uO(e,t[i++]);i<t.length;)e.a+=FWn,uO(e,t[i++]);e.a+="]"}return e.a}function LRn(n){var t,e,i,r,c;for(c=new J6(n.a.c.length),r=new Wb(n.a);r.a<r.c.c.length;){switch(i=BB(n0(r),10),t=null,(e=BB(mMn(i,(HXn(),kgt)),163)).g){case 1:case 2:Jun(),t=$ht;break;case 3:case 4:Jun(),t=Oht}t?(hon(i,(hWn(),Gft),(Jun(),$ht)),t==Oht?RNn(i,e,(ain(),Hvt)):t==$ht&&RNn(i,e,(ain(),qvt))):c.c[c.c.length]=i}return c}function NRn(n,t){var e,i,r,c,a,u,o;for(e=0,o=new Wb(t);o.a<o.c.c.length;){for(u=BB(n0(o),11),nhn(n.b,n.d[u.p]),a=0,r=new m6(u.b);y$(r.a)||y$(r.b);)CW(i=BB(y$(r.a)?n0(r.a):n0(r.b),17))?(c=ME(n,u==i.c?i.d:i.c))>n.d[u.p]&&(e+=n5(n.b,c),d3(n.a,iln(c))):++a;for(e+=n.b.d*a;!Wy(n.a);)Mnn(n.b,BB(dU(n.a),19).a)}return e}function xRn(n,t){var e;return n.f==uLt?(e=DW(B7((IPn(),Z$t),t)),n.e?4==e&&t!=(TOn(),lLt)&&t!=(TOn(),sLt)&&t!=(TOn(),hLt)&&t!=(TOn(),fLt):2==e):!(!n.d||!(n.d.Hc(t)||n.d.Hc(Z1(B7((IPn(),Z$t),t)))||n.d.Hc(Fqn((IPn(),Z$t),n.b,t))))||!(!n.f||!aNn((IPn(),n.f),jV(B7(Z$t,t))))&&(e=DW(B7(Z$t,t)),n.e?4==e:2==e)}function DRn(n,t,i,r){var c,a,u,o,s,h,f,l;return s=(u=BB(ZAn(i,(sWn(),gPt)),8)).a,f=u.b+n,(c=e.Math.atan2(f,s))<0&&(c+=Z3n),(c+=t)>Z3n&&(c-=Z3n),h=(o=BB(ZAn(r,gPt),8)).a,l=o.b+n,(a=e.Math.atan2(l,h))<0&&(a+=Z3n),(a+=t)>Z3n&&(a-=Z3n),h$(),rin(1e-10),e.Math.abs(c-a)<=1e-10||c==a||isNaN(c)&&isNaN(a)?0:c<a?-1:c>a?1:zO(isNaN(c),isNaN(a))}function RRn(n){var t,e,i,r,c,a,u;for(u=new xp,i=new Wb(n.a.b);i.a<i.c.c.length;)VW(u,t=BB(n0(i),57),new Np);for(r=new Wb(n.a.b);r.a<r.c.c.length;)for((t=BB(n0(r),57)).i=KQn,a=t.c.Kc();a.Ob();)c=BB(a.Pb(),57),BB(qI(AY(u.f,c)),15).Fc(t);for(e=new Wb(n.a.b);e.a<e.c.c.length;)(t=BB(n0(e),57)).c.$b(),t.c=BB(qI(AY(u.f,t)),15);_xn(n)}function KRn(n){var t,e,i,r,c,a,u;for(u=new xp,i=new Wb(n.a.b);i.a<i.c.c.length;)VW(u,t=BB(n0(i),81),new Np);for(r=new Wb(n.a.b);r.a<r.c.c.length;)for((t=BB(n0(r),81)).o=KQn,a=t.f.Kc();a.Ob();)c=BB(a.Pb(),81),BB(qI(AY(u.f,c)),15).Fc(t);for(e=new Wb(n.a.b);e.a<e.c.c.length;)(t=BB(n0(e),81)).f.$b(),t.f=BB(qI(AY(u.f,t)),15);BNn(n)}function _Rn(n,t,e,i){var r,c;for(Gkn(n,t,e,i),xl(t,n.j-t.j+e),Dl(t,n.k-t.k+i),c=new Wb(t.f);c.a<c.c.c.length;)switch((r=BB(n0(c),324)).a.g){case 0:won(n,t.g+r.b.a,0,t.g+r.c.a,t.i-1);break;case 1:won(n,t.g+t.o,t.i+r.b.a,n.o-1,t.i+r.c.a);break;case 2:won(n,t.g+r.b.a,t.i+t.p,t.g+r.c.a,n.p-1);break;default:won(n,0,t.i+r.b.a,t.g-1,t.i+r.c.a)}}function FRn(n,t,e,i,r){var c,a;try{if(t>=n.o)throw Hp(new Sv);a=t>>5,c=yz(1,dG(yz(31&t,1))),n.n[e][a]=r?i0(n.n[e][a],c):e0(n.n[e][a],uH(c)),c=yz(c,1),n.n[e][a]=i?i0(n.n[e][a],c):e0(n.n[e][a],uH(c))}catch(u){throw cL(u=lun(u),320)?Hp(new Ay(MJn+n.o+"*"+n.p+SJn+t+FWn+e+PJn)):Hp(u)}}function BRn(n,t,i,r){var c,a;t&&(c=Gy(MD(mMn(t,(qqn(),fkt))))+r,a=i+Gy(MD(mMn(t,ukt)))/2,hon(t,gkt,iln(dG(fan(e.Math.round(c))))),hon(t,pkt,iln(dG(fan(e.Math.round(a))))),0==t.d.b||BRn(n,BB(iL(new wg(spn(new bg(t).a.d,0))),86),i+Gy(MD(mMn(t,ukt)))+n.a,r+Gy(MD(mMn(t,okt)))),null!=mMn(t,wkt)&&BRn(n,BB(mMn(t,wkt),86),i,r))}function HRn(n,t){var i,r,c,a,u,o,s,h,f,l,b;for(c=2*Gy(MD(mMn(s=vW(t.a),(HXn(),Tpt)))),f=Gy(MD(mMn(s,Apt))),h=e.Math.max(c,f),a=x8(xNt,qQn,25,t.f-t.c+1,15,1),r=-h,i=0,o=t.b.Kc();o.Ob();)u=BB(o.Pb(),10),r+=n.a[u.c.p]+h,a[i++]=r;for(r+=n.a[t.a.c.p]+h,a[i++]=r,b=new Wb(t.e);b.a<b.c.c.length;)l=BB(n0(b),10),r+=n.a[l.c.p]+h,a[i++]=r;return a}function qRn(n,t,e,i){var r,c,a,u,o,s,h,f;for(f=new dE(new Yd(n)),u=0,o=(a=Pun(Gk(Out,1),a1n,10,0,[t,e])).length;u<o;++u)for(h=Lfn(a[u],i).Kc();h.Ob();)for(c=new m6((s=BB(h.Pb(),11)).b);y$(c.a)||y$(c.b);)b5(r=BB(y$(c.a)?n0(c.a):n0(c.b),17))||(Mon(f.a,s,(hN(),ptt)),CW(r)&&ZU(f,s==r.c?r.d:r.c));return yX(f),new t_(f)}function GRn(n,t){var e,i,r,c;if(0!=(c=BB(ZAn(n,(sWn(),wPt)),61).g-BB(ZAn(t,wPt),61).g))return c;if(e=BB(ZAn(n,sPt),19),i=BB(ZAn(t,sPt),19),e&&i&&0!=(r=e.a-i.a))return r;switch(BB(ZAn(n,wPt),61).g){case 1:return Pln(n.i,t.i);case 2:return Pln(n.j,t.j);case 3:return Pln(t.i,n.i);case 4:return Pln(t.j,n.j);default:throw Hp(new Fy(r1n))}}function zRn(n){var t,e,i;return 0!=(64&n.Db)?mSn(n):(t=new lN(n6n),(e=n.k)?oO(oO((t.a+=' "',t),e),'"'):(!n.n&&(n.n=new eU(zOt,n,1,7)),n.n.i>0&&(!(i=(!n.n&&(n.n=new eU(zOt,n,1,7)),BB(Wtn(n.n,0),137)).a)||oO(oO((t.a+=' "',t),i),'"'))),oO(kE(oO(kE(oO(kE(oO(kE((t.a+=" (",t),n.i),","),n.j)," | "),n.g),","),n.f),")"),t.a)}function URn(n){var t,e,i;return 0!=(64&n.Db)?mSn(n):(t=new lN(t6n),(e=n.k)?oO(oO((t.a+=' "',t),e),'"'):(!n.n&&(n.n=new eU(zOt,n,1,7)),n.n.i>0&&(!(i=(!n.n&&(n.n=new eU(zOt,n,1,7)),BB(Wtn(n.n,0),137)).a)||oO(oO((t.a+=' "',t),i),'"'))),oO(kE(oO(kE(oO(kE(oO(kE((t.a+=" (",t),n.i),","),n.j)," | "),n.g),","),n.f),")"),t.a)}function XRn(n,t){var e,i,r,c,a,u;if(null==t||0==t.length)return null;if(!(r=BB(SJ(n.a,t),149))){for(i=new Kb(new Ob(n.b).a.vc().Kc());i.a.Ob();)if(c=BB(i.a.Pb(),42),a=(e=BB(c.dd(),149)).c,u=t.length,mK(a.substr(a.length-u,u),t)&&(t.length==a.length||46==fV(a,a.length-t.length-1))){if(r)return null;r=e}r&&mZ(n.a,t,r)}return r}function WRn(n,t){var e,i,r;return e=new xn,(i=BB(P4($V(new Rq(null,new w1(n.f,16)),e),x7(new Q,new Y,new cn,new an,Pun(Gk(nit,1),$Vn,132,0,[(qsn(),Xet),Uet]))),21).gc())<(r=BB(P4($V(new Rq(null,new w1(t.f,16)),e),x7(new Q,new Y,new cn,new an,Pun(Gk(nit,1),$Vn,132,0,[Xet,Uet]))),21).gc())?-1:i==r?0:1}function VRn(n){var t,e,i;Lx(n,(HXn(),$gt))&&((i=BB(mMn(n,$gt),21)).dc()||(e=new YK(t=BB(Vj(GCt),9),BB(SR(t,t.length),9),0),i.Hc((n$n(),$Ct))?orn(e,$Ct):orn(e,LCt),i.Hc(OCt)||orn(e,OCt),i.Hc(ICt)?orn(e,DCt):i.Hc(CCt)?orn(e,xCt):i.Hc(ACt)&&orn(e,NCt),i.Hc(DCt)?orn(e,ICt):i.Hc(xCt)?orn(e,CCt):i.Hc(NCt)&&orn(e,ACt),hon(n,$gt,e)))}function QRn(n){var t,e,i,r,c,a,u;for(r=BB(mMn(n,(hWn(),rlt)),10),l1(0,(i=n.j).c.length),e=BB(i.c[0],11),a=new Wb(r.j);a.a<a.c.c.length;)if(GI(c=BB(n0(a),11))===GI(mMn(e,dlt))){c.j==(kUn(),sIt)&&n.p>r.p?(qCn(c,SIt),c.d&&(u=c.o.b,t=c.a.b,c.a.b=u-t)):c.j==SIt&&r.p>n.p&&(qCn(c,sIt),c.d&&(u=c.o.b,t=c.a.b,c.a.b=-(u-t)));break}return r}function YRn(n,t,e,i){var r,c,a,u,o,s,h,f,l,b,w;if(c=e,e<i)for(b=new Fan(n.p),w=new Fan(n.p),Frn(b.e,n.e),b.q=n.q,b.r=w,rX(b),Frn(w.j,n.j),w.r=b,rX(w),f=BB((l=new rI(b,w)).a,112),h=BB(l.b,112),l1(c,t.c.length),a=$Dn(n,f,h,r=BB(t.c[c],329)),s=e+1;s<=i;s++)l1(s,t.c.length),Vpn(u=BB(t.c[s],329),o=$Dn(n,f,h,u),r,a)&&(r=u,a=o);return c}function JRn(n,t,e,i,r){var c,a,u,o,s,h,f;if(!(cL(t,239)||cL(t,354)||cL(t,186)))throw Hp(new _y("Method only works for ElkNode-, ElkLabel and ElkPort-objects."));return a=n.a/2,o=t.i+i-a,h=t.j+r-a,s=o+t.g+n.a,f=h+t.f+n.a,DH(c=new km,new xC(o,h)),DH(c,new xC(o,f)),DH(c,new xC(s,f)),DH(c,new xC(s,h)),qan(u=new EAn(c),t),e&&VW(n.b,t,u),u}function ZRn(n,t,e){var i,r,c,a,u,o,s,h;for(c=new xC(t,e),s=new Wb(n.a);s.a<s.c.c.length;)for(UR((o=BB(n0(s),10)).n,c),h=new Wb(o.j);h.a<h.c.c.length;)for(r=new Wb(BB(n0(h),11).g);r.a<r.c.c.length;)for(Ztn((i=BB(n0(r),17)).a,c),(a=BB(mMn(i,(HXn(),vgt)),74))&&Ztn(a,c),u=new Wb(i.b);u.a<u.c.c.length;)UR(BB(n0(u),70).n,c)}function nKn(n,t,e){var i,r,c,a,u,o,s,h;for(c=new xC(t,e),s=new Wb(n.a);s.a<s.c.c.length;)for(UR((o=BB(n0(s),10)).n,c),h=new Wb(o.j);h.a<h.c.c.length;)for(r=new Wb(BB(n0(h),11).g);r.a<r.c.c.length;)for(Ztn((i=BB(n0(r),17)).a,c),(a=BB(mMn(i,(HXn(),vgt)),74))&&Ztn(a,c),u=new Wb(i.b);u.a<u.c.c.length;)UR(BB(n0(u),70).n,c)}function tKn(n){if(0==(!n.b&&(n.b=new hK(KOt,n,4,7)),n.b).i)throw Hp(new ck("Edges must have a source."));if(0==(!n.c&&(n.c=new hK(KOt,n,5,8)),n.c).i)throw Hp(new ck("Edges must have a target."));if(!n.b&&(n.b=new hK(KOt,n,4,7)),!(n.b.i<=1&&(!n.c&&(n.c=new hK(KOt,n,5,8)),n.c.i<=1)))throw Hp(new ck("Hyperedges are not supported."))}function eKn(n,t){var e,i,r,c,a,u,o,s,h,f;for(f=0,d3(c=new Lp,t);c.b!=c.c;)for(o=BB(dU(c),214),s=0,h=BB(mMn(t.j,(HXn(),Ldt)),339),a=Gy(MD(mMn(t.j,Idt))),u=Gy(MD(mMn(t.j,Odt))),h!=(mon(),Nvt)&&(s+=a*S$n(o.e,h),s+=u*rxn(o.e)),f+=syn(o.d,o.e)+s,r=new Wb(o.b);r.a<r.c.c.length;)i=BB(n0(r),37),(e=BB(xq(n.b,i.p),214)).s||(f+=nCn(n,e));return f}function iKn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g;for(o=b=t.length,b1(0,t.length),45==t.charCodeAt(0)?(f=-1,l=1,--b):(f=1,l=0),r=b/(c=(uHn(),cet)[10])|0,0!=(g=b%c)&&++r,u=x8(ANt,hQn,25,r,15,1),e=ret[8],a=0,w=l+(0==g?c:g),d=l;d<o;w=(d=w)+c)i=l_n(t.substr(d,w-d),_Vn,DWn),$On(),s=dvn(u,u,a,e),s+=Uwn(u,a,i),u[a++]=s;h=a,n.e=f,n.d=h,n.a=u,X0(n)}function rKn(n,t,e,i,r,c,a){if(n.c=i.qf().a,n.d=i.qf().b,r&&(n.c+=r.qf().a,n.d+=r.qf().b),n.b=t.rf().a,n.a=t.rf().b,r)switch(r.Hf().g){case 0:case 2:n.c+=r.rf().a+a+c.a+a;break;case 4:n.c-=a+c.a+a+t.rf().a;break;case 1:n.c+=r.rf().a+a,n.d-=a+c.b+a+t.rf().b;break;case 3:n.c+=r.rf().a+a,n.d+=r.rf().b+a+c.b+a}else e?n.c-=a+t.rf().a:n.c+=i.rf().a+a}function cKn(n,t){var e,i;for(this.b=new Np,this.e=new Np,this.a=n,this.d=t,Gpn(this),pdn(this),this.b.dc()?this.c=n.c.p:this.c=BB(this.b.Xb(0),10).c.p,0==this.e.c.length?this.f=n.c.p:this.f=BB(xq(this.e,this.e.c.length-1),10).c.p,i=BB(mMn(n,(hWn(),Plt)),15).Kc();i.Ob();)if(Lx(e=BB(i.Pb(),70),(HXn(),Vdt))){this.d=BB(mMn(e,Vdt),227);break}}function aKn(n,t,e){var i,r,c,a,u,o,s,h;for(i=BB(RX(n.a,t),53),c=BB(RX(n.a,e),53),r=BB(RX(n.e,t),53),a=BB(RX(n.e,e),53),i.a.zc(e,i),a.a.zc(t,a),h=c.a.ec().Kc();h.Ob();)s=BB(h.Pb(),10),i.a.zc(s,i),TU(BB(RX(n.e,s),53),t),Frn(BB(RX(n.e,s),53),r);for(o=r.a.ec().Kc();o.Ob();)u=BB(o.Pb(),10),a.a.zc(u,a),TU(BB(RX(n.a,u),53),e),Frn(BB(RX(n.a,u),53),c)}function uKn(n,t,e){var i,r,c,a,u,o,s,h;for(i=BB(RX(n.a,t),53),c=BB(RX(n.a,e),53),r=BB(RX(n.b,t),53),a=BB(RX(n.b,e),53),i.a.zc(e,i),a.a.zc(t,a),h=c.a.ec().Kc();h.Ob();)s=BB(h.Pb(),10),i.a.zc(s,i),TU(BB(RX(n.b,s),53),t),Frn(BB(RX(n.b,s),53),r);for(o=r.a.ec().Kc();o.Ob();)u=BB(o.Pb(),10),a.a.zc(u,a),TU(BB(RX(n.a,u),53),e),Frn(BB(RX(n.a,u),53),c)}function oKn(n,t){var e,i,r;switch(OTn(t,"Breaking Point Insertion",1),i=new MAn(n),BB(mMn(n,(HXn(),Bpt)),337).g){case 2:r=new Tc;case 0:r=new wc;break;default:r=new Mc}if(e=r.Vf(n,i),qy(TD(mMn(n,qpt)))&&(e=Dqn(n,e)),!r.Wf()&&Lx(n,Xpt))switch(BB(mMn(n,Xpt),338).g){case 2:e=XCn(i,e);break;case 1:e=KTn(i,e)}e.dc()||tXn(n,e),HSn(t)}function sKn(n,t,e){var i,r,c,a,u,o,s;if(s=t,$in(o=Q3(n,L3(e),s),R2(s,q6n)),a=N2(s,L6n),VCn((i=new oI(n,o)).a,i.b,a),u=N2(s,N6n),QCn((r=new sI(n,o)).a,r.b,u),0==(!o.b&&(o.b=new hK(KOt,o,4,7)),o.b).i||0==(!o.c&&(o.c=new hK(KOt,o,5,8)),o.c).i)throw c=R2(s,q6n),Hp(new ek(X6n+c+W6n));return STn(s,o),sXn(n,s,o),xon(n,s,o)}function hKn(n,t){var i,r,c,a,u,o,s;for(c=x8(ANt,hQn,25,n.e.a.c.length,15,1),u=new Wb(n.e.a);u.a<u.c.c.length;)c[(a=BB(n0(u),121)).d]+=a.b.a.c.length;for(o=zB(t);0!=o.b;)for(r=L9(new Wb((a=BB(0==o.b?null:(Px(0!=o.b),Atn(o,o.a.a)),121)).g.a));r.Ob();)(s=(i=BB(r.Pb(),213)).e).e=e.Math.max(s.e,a.e+i.a),--c[s.d],0==c[s.d]&&r5(o,s,o.c.b,o.c)}function fKn(n){var t,i,r,c,a,u,o,s,h,f,l;for(i=_Vn,c=DWn,o=new Wb(n.e.a);o.a<o.c.c.length;)a=BB(n0(o),121),c=e.Math.min(c,a.e),i=e.Math.max(i,a.e);for(t=x8(ANt,hQn,25,i-c+1,15,1),u=new Wb(n.e.a);u.a<u.c.c.length;)(a=BB(n0(u),121)).e-=c,++t[a.e];if(r=0,null!=n.k)for(f=0,l=(h=n.k).length;f<l&&(s=h[f],t[r++]+=s,t.length!=r);++f);return t}function lKn(n){switch(n.d){case 9:case 8:return!0;case 3:case 5:case 4:case 6:return!1;case 7:return BB(Kxn(n),19).a==n.o;case 1:case 2:if(-2==n.o)return!1;switch(n.p){case 0:case 1:case 2:case 6:case 5:case 7:return QI(n.k,n.f);case 3:case 4:return n.j==n.e;default:return null==n.n?null==n.g:Nfn(n.n,n.g)}default:return!1}}function bKn(n){NM(n,new MTn(vj(wj(pj(gj(new du,K5n),"ELK Fixed"),"Keeps the current layout as it is, without any automatic modification. Optional coordinates can be given for nodes and edge bend points."),new Vu))),u2(n,K5n,QJn,dCt),u2(n,K5n,g3n,mpn(gCt)),u2(n,K5n,g5n,mpn(hCt)),u2(n,K5n,PZn,mpn(fCt)),u2(n,K5n,BZn,mpn(bCt)),u2(n,K5n,Y2n,mpn(lCt))}function wKn(n,t,e){var i,r,c,a;if(i=dG(cbn(SVn,rV(dG(cbn(null==t?0:nsn(t),PVn)),15))),a=dG(cbn(SVn,rV(dG(cbn(null==e?0:nsn(e),PVn)),15))),(c=Jrn(n,t,i))&&a==c.f&&wW(e,c.i))return e;if(Zrn(n,e,a))throw Hp(new _y("value already present: "+e));return r=new qW(t,i,e,a),c?(LLn(n,c),YCn(n,r,c),c.e=null,c.c=null,c.i):(YCn(n,r,null),qkn(n),null)}function dKn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b;s=e.a.c,a=e.a.c+e.a.b,l=(c=BB(RX(e.c,t),459)).f,b=c.a,u=c.b?new xC(a,l):new xC(s,l),h=c.c?new xC(s,b):new xC(a,b),r=s,e.p||(r+=n.c),o=new xC(r+=e.F+e.v*n.b,l),f=new xC(r,b),nin(t.a,Pun(Gk(PMt,1),sVn,8,0,[u,o])),e.d.a.gc()>1&&(i=new xC(r,e.b),DH(t.a,i)),nin(t.a,Pun(Gk(PMt,1),sVn,8,0,[f,h]))}function gKn(n,t,e){var i,r,c,a,u,o;if(t){if(e<=-1){if(cL(i=itn(t.Tg(),-1-e),99))return BB(i,18);for(u=0,o=(a=BB(t.ah(i),153)).gc();u<o;++u)if(GI(a.jl(u))===GI(n)&&cL(r=a.il(u),99)&&0!=((c=BB(r,18)).Bb&h6n))return c;throw Hp(new Fy("The containment feature could not be located"))}return Cvn(BB(itn(n.Tg(),e),18))}return null}function pKn(n){var t,e,i,r,c;for(i=n.length,t=new Pk,c=0;c<i;)if(9!=(e=fV(n,c++))&&10!=e&&12!=e&&13!=e&&32!=e)if(35!=e)92==e&&c<i?35==(b1(c,n.length),r=n.charCodeAt(c))||9==r||10==r||12==r||13==r||32==r?(NX(t,r&QVn),++c):(t.a+="\\",NX(t,r&QVn),++c):NX(t,e&QVn);else for(;c<i&&13!=(e=fV(n,c++))&&10!=e;);return t.a}function vKn(n,t){var e,i,r;for(i=new Wb(t);i.a<i.c.c.length;)if(e=BB(n0(i),33),JIn(n.a,e,e),JIn(n.b,e,e),0!=(r=wDn(e)).c.length)for(n.d&&n.d.lg(r),JIn(n.a,e,(l1(0,r.c.length),BB(r.c[0],33))),JIn(n.b,e,BB(xq(r,r.c.length-1),33));0!=Dun(r).c.length;)r=Dun(r),n.d&&n.d.lg(r),JIn(n.a,e,(l1(0,r.c.length),BB(r.c[0],33))),JIn(n.b,e,BB(xq(r,r.c.length-1),33))}function mKn(n){var t,e,i,r,c,a,u,o,s,h;for(e=0,u=new Wb(n.d);u.a<u.c.c.length;)(a=BB(n0(u),101)).i&&(a.i.c=e++);for(t=kq($Nt,[sVn,ZYn],[177,25],16,[e,e],2),h=n.d,r=0;r<h.c.length;r++)if(l1(r,h.c.length),(o=BB(h.c[r],101)).i)for(c=r+1;c<h.c.length;c++)l1(c,h.c.length),(s=BB(h.c[c],101)).i&&(i=rMn(o,s),t[o.i.c][s.i.c]=i,t[s.i.c][o.i.c]=i);return t}function yKn(n,t,e,i){var r,c,a;return a=new yT(t,e),n.a?i?(++(r=BB(RX(n.b,t),283)).a,a.d=i.d,a.e=i.e,a.b=i,a.c=i,i.e?i.e.c=a:BB(RX(n.b,t),283).b=a,i.d?i.d.b=a:n.a=a,i.d=a,i.e=a):(n.e.b=a,a.d=n.e,n.e=a,(r=BB(RX(n.b,t),283))?(++r.a,(c=r.c).c=a,a.e=c,r.c=a):(VW(n.b,t,r=new sY(a)),++n.c)):(n.a=n.e=a,VW(n.b,t,new sY(a)),++n.c),++n.d,a}function kKn(n,t){var e,i,r,c,a,u,o,s;for(e=new RegExp(t,"g"),o=x8(Qtt,sVn,2,0,6,1),i=0,s=n,c=null;;){if(null==(u=e.exec(s))||""==s){o[i]=s;break}a=u.index,o[i]=s.substr(0,a),s=fx(s,a+u[0].length,s.length),e.lastIndex=0,c==s&&(o[i]=s.substr(0,1),s=s.substr(1)),c=s,++i}if(n.length>0){for(r=o.length;r>0&&""==o[r-1];)--r;r<o.length&&(o.length=r)}return o}function jKn(n,t){var e,i,r,c,a,u,o,s;for(u=null,r=!1,c=0,o=a4((s=kY(t)).a).i;c<o;++c)(e=jKn(n,BB(eGn(s,c,cL(a=BB(Wtn(a4(s.a),c),87).c,88)?BB(a,26):(gWn(),d$t)),26))).dc()||(u?(r||(r=!0,u=new rG(u)),u.Gc(e)):u=e);return(i=xIn(n,t)).dc()?u||(SQ(),SQ(),set):u?(r||(u=new rG(u)),u.Gc(i),u):i}function EKn(n,t){var e,i,r,c,a,u,o,s;for(u=null,i=!1,c=0,o=a4((s=kY(t)).a).i;c<o;++c)(e=EKn(n,BB(eGn(s,c,cL(a=BB(Wtn(a4(s.a),c),87).c,88)?BB(a,26):(gWn(),d$t)),26))).dc()||(u?(i||(i=!0,u=new rG(u)),u.Gc(e)):u=e);return(r=VOn(n,t)).dc()?u||(SQ(),SQ(),set):u?(i||(u=new rG(u)),u.Gc(r),u):r}function TKn(n,t,e){var i,r,c,a,u,o;if(cL(t,72))return _pn(n,t,e);for(u=null,c=null,i=BB(n.g,119),a=0;a<n.i;++a)if(Nfn(t,(r=i[a]).dd())&&cL(c=r.ak(),99)&&0!=(BB(c,18).Bb&h6n)){u=r;break}return u&&(mA(n.e)&&(o=c.$j()?LY(n,4,c,t,null,pBn(n,c,t,cL(c,99)&&0!=(BB(c,18).Bb&BQn)),!0):LY(n,c.Kj()?2:1,c,t,c.zj(),-1,!0),e?e.Ei(o):e=o),e=TKn(n,u,e)),e}function MKn(n){var t,i,r,c;r=n.o,qD(),n.A.dc()||Nfn(n.A,$rt)?c=r.a:(c=SIn(n.f),n.A.Hc((mdn(),RIt))&&!n.B.Hc((n_n(),XIt))&&(c=e.Math.max(c,SIn(BB(oV(n.p,(kUn(),sIt)),244))),c=e.Math.max(c,SIn(BB(oV(n.p,SIt),244)))),(t=oan(n))&&(c=e.Math.max(c,t.a))),qy(TD(n.e.yf().We((sWn(),FSt))))?r.a=e.Math.max(r.a,c):r.a=c,(i=n.f.i).c=0,i.b=c,_Fn(n.f)}function SKn(n,t){var e,i,r,c,a,u,o,s,h;if((e=t.Hh(n.a))&&null!=(o=SD(cdn((!e.b&&(e.b=new Jx((gWn(),k$t),X$t,e)),e.b),"memberTypes")))){for(s=new Np,a=0,u=(c=kKn(o,"\\w")).length;a<u;++a)cL(h=-1==(i=(r=c[a]).lastIndexOf("#"))?uD(n,t.Aj(),r):0==i?M9(n,null,r.substr(1)):M9(n,r.substr(0,i),r.substr(i+1)),148)&&WB(s,BB(h,148));return s}return SQ(),SQ(),set}function PKn(n,t,e){var i,r,c,a,u,o,s,h;for(OTn(e,aZn,1),n.bf(t),c=0;n.df(c);){for(h=new Wb(t.e);h.a<h.c.c.length;)for(o=BB(n0(h),144),u=NU(Wen(Pun(Gk(xnt,1),HWn,20,0,[t.e,t.d,t.b])));dAn(u);)(a=BB(U5(u),357))!=o&&(r=n.af(a,o))&&UR(o.a,r);for(s=new Wb(t.e);s.a<s.c.c.length;)WSn(i=(o=BB(n0(s),144)).a,-n.d,-n.d,n.d,n.d),UR(o.d,i),kO(i);n.cf(),++c}HSn(e)}function CKn(n,t,e){var i,r,c,a;if(a=axn(n.e.Tg(),t),i=BB(n.g,119),ZM(),BB(t,66).Oj()){for(c=0;c<n.i;++c)if(r=i[c],a.rl(r.ak())&&Nfn(r,e))return fDn(n,c),!0}else if(null!=e){for(c=0;c<n.i;++c)if(r=i[c],a.rl(r.ak())&&Nfn(e,r.dd()))return fDn(n,c),!0}else for(c=0;c<n.i;++c)if(r=i[c],a.rl(r.ak())&&null==r.dd())return fDn(n,c),!0;return!1}function IKn(n,t){var e,i,r,c,a;for(null==n.c||n.c.length<t.c.length?n.c=x8($Nt,ZYn,25,t.c.length,16,1):nk(n.c),n.a=new Np,i=0,a=new Wb(t);a.a<a.c.c.length;)(r=BB(n0(a),10)).p=i++;for(e=new YT,c=new Wb(t);c.a<c.c.c.length;)r=BB(n0(c),10),n.c[r.p]||(hIn(n,r),0==e.b||(Px(0!=e.b),BB(e.a.a.c,15)).gc()<n.a.c.length?hO(e,n.a):fO(e,n.a),n.a=new Np);return e}function OKn(n,t,e,i){var r,c,a,u,o,s,h;for(Pen(a=BB(Wtn(t,0),33),0),Cen(a,0),(o=new Np).c[o.c.length]=a,u=a,c=new eq(n.a,a.g,a.f,(YLn(),_Et)),s=1;s<t.i;s++)Pen(h=BB(Wtn(t,s),33),(r=aqn(n,nHn(n,DEt,h,u,c,o,e),nHn(n,xEt,h,u,c,o,e),nHn(n,KEt,h,u,c,o,e),nHn(n,REt,h,u,c,o,e),h,u,i)).d),Cen(h,r.e),ab(r,_Et),c=r,u=h,o.c[o.c.length]=h;return c}function AKn(n){NM(n,new MTn(vj(wj(pj(gj(new du,Q4n),"ELK SPOrE Overlap Removal"),'A node overlap removal algorithm proposed by Nachmanson et al. in "Node overlap removal by growing a tree".'),new eu))),u2(n,Q4n,K4n,mpn(qTt)),u2(n,Q4n,QJn,BTt),u2(n,Q4n,vZn,8),u2(n,Q4n,q4n,mpn(HTt)),u2(n,Q4n,U4n,mpn(_Tt)),u2(n,Q4n,X4n,mpn(FTt)),u2(n,Q4n,X2n,(hN(),!1))}function $Kn(n,t,e,i){var r,c,a,u,o,s,h,f;for(a=_x(t.c,e,i),h=new Wb(t.a);h.a<h.c.c.length;){for(UR((s=BB(n0(h),10)).n,a),f=new Wb(s.j);f.a<f.c.c.length;)for(c=new Wb(BB(n0(f),11).g);c.a<c.c.c.length;)for(Ztn((r=BB(n0(c),17)).a,a),(u=BB(mMn(r,(HXn(),vgt)),74))&&Ztn(u,a),o=new Wb(r.b);o.a<o.c.c.length;)UR(BB(n0(o),70).n,a);WB(n.a,s),s.a=n}}function LKn(n,t){var e,i,r,c;if(OTn(t,"Node and Port Label Placement and Node Sizing",1),RA((gM(),new HV(n,!0,!0,new Ve))),BB(mMn(n,(hWn(),Zft)),21).Hc((bDn(),lft)))for(i=(r=BB(mMn(n,(HXn(),cpt)),21)).Hc((lIn(),iIt)),c=qy(TD(mMn(n,apt))),e=new Wb(n.b);e.a<e.c.c.length;)JT(AV(new Rq(null,new w1(BB(n0(e),29).a,16)),new Qe),new K_(r,i,c));HSn(t)}function NKn(n,t){var e,i,r,c,a,u;if((e=t.Hh(n.a))&&null!=(u=SD(cdn((!e.b&&(e.b=new Jx((gWn(),k$t),X$t,e)),e.b),n8n))))switch(r=mN(u,YTn(35)),i=t.Hj(),-1==r?(a=az(n,Utn(i)),c=u):0==r?(a=null,c=u.substr(1)):(a=u.substr(0,r),c=u.substr(r+1)),DW(B7(n,t))){case 2:case 3:return Don(n,i,a,c);case 0:case 4:case 5:case 6:return Ron(n,i,a,c)}return null}function xKn(n,t,e){var i,r,c,a,u;if(ZM(),a=BB(t,66).Oj(),$xn(n.e,t)){if(t.hi()&&UFn(n,t,e,cL(t,99)&&0!=(BB(t,18).Bb&BQn)))return!1}else for(u=axn(n.e.Tg(),t),i=BB(n.g,119),c=0;c<n.i;++c)if(r=i[c],u.rl(r.ak()))return!(a?Nfn(r,e):null==e?null==r.dd():Nfn(e,r.dd()))&&(BB(ovn(n,c,a?BB(e,72):Z3(t,e)),72),!0);return f9(n,a?BB(e,72):Z3(t,e))}function DKn(n){var t,e,i,r,c;if(n.d)throw Hp(new Fy((ED(Yat),AYn+Yat.k+$Yn)));for(n.c==(Ffn(),BPt)&&Mzn(n,_Pt),t=new Wb(n.a.a);t.a<t.c.c.length;)BB(n0(t),189).e=0;for(r=new Wb(n.a.b);r.a<r.c.c.length;)for((i=BB(n0(r),81)).o=KQn,e=i.f.Kc();e.Ob();)++BB(e.Pb(),81).d.e;for(Gzn(n),c=new Wb(n.a.b);c.a<c.c.c.length;)BB(n0(c),81).k=!0;return n}function RKn(n,t){var e,i,r,c,a,u,o,s;for(u=new pPn(n),r5(e=new YT,t,e.c.b,e.c);0!=e.b;){for((i=BB(0==e.b?null:(Px(0!=e.b),Atn(e,e.a.a)),113)).d.p=1,a=new Wb(i.e);a.a<a.c.c.length;)jTn(u,r=BB(n0(a),409)),0==(s=r.d).d.p&&r5(e,s,e.c.b,e.c);for(c=new Wb(i.b);c.a<c.c.c.length;)jTn(u,r=BB(n0(c),409)),0==(o=r.c).d.p&&r5(e,o,e.c.b,e.c)}return u}function KKn(n){var t,e,i,r,c;if(1!=(i=Gy(MD(ZAn(n,(sWn(),yPt))))))for(MA(n,i*n.g,i*n.f),e=XO(_B((!n.c&&(n.c=new eU(XOt,n,9,9)),n.c),new Bu)),c=NU(Wen(Pun(Gk(xnt,1),HWn,20,0,[(!n.n&&(n.n=new eU(zOt,n,1,7)),n.n),(!n.c&&(n.c=new eU(XOt,n,9,9)),n.c),e])));dAn(c);)(r=BB(U5(c),470)).Gg(i*r.Dg(),i*r.Eg()),r.Fg(i*r.Cg(),i*r.Bg()),(t=BB(r.We(cPt),8))&&(t.a*=i,t.b*=i)}function _Kn(n,t,e,i,r){var c,a,u,o,s,h;for(c=new Wb(n.b);c.a<c.c.c.length;)for(s=0,h=(o=n2(BB(n0(c),29).a)).length;s<h;++s)switch(BB(mMn(u=o[s],(HXn(),kgt)),163).g){case 1:vxn(u),PZ(u,t),lvn(u,!0,i);break;case 3:ZNn(u),PZ(u,e),lvn(u,!1,r)}for(a=new M2(n.b,0);a.b<a.d.gc();)0==(Px(a.b<a.d.gc()),BB(a.d.Xb(a.c=a.b++),29)).a.c.length&&fW(a)}function FKn(n,t){var e,i,r,c,a,u,o;if((e=t.Hh(n.a))&&null!=(o=SD(cdn((!e.b&&(e.b=new Jx((gWn(),k$t),X$t,e)),e.b),M7n)))){for(i=new Np,a=0,u=(c=kKn(o,"\\w")).length;a<u;++a)mK(r=c[a],"##other")?WB(i,"!##"+az(n,Utn(t.Hj()))):mK(r,"##local")?i.c[i.c.length]=null:mK(r,E7n)?WB(i,az(n,Utn(t.Hj()))):i.c[i.c.length]=r;return i}return SQ(),SQ(),set}function BKn(n,t){var e,i,r;return e=new Xn,(i=1==(i=BB(P4($V(new Rq(null,new w1(n.f,16)),e),x7(new Q,new Y,new cn,new an,Pun(Gk(nit,1),$Vn,132,0,[(qsn(),Xet),Uet]))),21).gc())?1:0)<(r=1==(r=BB(P4($V(new Rq(null,new w1(t.f,16)),e),x7(new Q,new Y,new cn,new an,Pun(Gk(nit,1),$Vn,132,0,[Xet,Uet]))),21).gc())?1:0)?-1:i==r?0:1}function HKn(n){var t,e,i,r,c,a,u,o,s,h,f,l;for(r=qy(TD(mMn(u=n.i,(HXn(),wgt)))),h=0,i=0,s=new Wb(n.g);s.a<s.c.c.length;)c=(a=b5(o=BB(n0(s),17)))&&r&&qy(TD(mMn(o,dgt))),l=o.d.i,a&&c?++i:a&&!c?++h:vW(l).e==u?++i:++h;for(e=new Wb(n.e);e.a<e.c.c.length;)c=(a=b5(t=BB(n0(e),17)))&&r&&qy(TD(mMn(t,dgt))),f=t.c.i,a&&c?++h:a&&!c?++i:vW(f).e==u?++h:++i;return h-i}function qKn(n,t,e,i){this.e=n,this.k=BB(mMn(n,(hWn(),Alt)),304),this.g=x8(Out,a1n,10,t,0,1),this.b=x8(Ptt,sVn,333,t,7,1),this.a=x8(Out,a1n,10,t,0,1),this.d=x8(Ptt,sVn,333,t,7,1),this.j=x8(Out,a1n,10,t,0,1),this.i=x8(Ptt,sVn,333,t,7,1),this.p=x8(Ptt,sVn,333,t,7,1),this.n=x8(ktt,sVn,476,t,8,1),yS(this.n,(hN(),!1)),this.f=x8(ktt,sVn,476,t,8,1),yS(this.f,!0),this.o=e,this.c=i}function GKn(n,t){var e,i,r;if(!t.dc())if(BB(t.Xb(0),286).d==($Pn(),nht))Akn(n,t);else for(i=t.Kc();i.Ob();){switch((e=BB(i.Pb(),286)).d.g){case 5:hPn(n,e,Vbn(n,e));break;case 0:hPn(n,e,(r=(e.f-e.c+1-1)/2|0,e.c+r));break;case 4:hPn(n,e,$nn(n,e));break;case 2:Kwn(e),hPn(n,e,$En(e)?e.c:e.f);break;case 1:Kwn(e),hPn(n,e,$En(e)?e.f:e.c)}hMn(e.a)}}function zKn(n,t){var e,i,r,c,a;if(!t.e){for(t.e=!0,i=t.d.a.ec().Kc();i.Ob();)e=BB(i.Pb(),17),t.o&&t.d.a.gc()<=1?(a=new xC((c=t.a.c)+(t.a.c+t.a.b-c)/2,t.b),DH(BB(t.d.a.ec().Kc().Pb(),17).a,a)):(r=BB(RX(t.c,e),459)).b||r.c?dKn(n,e,t):n.d==(Usn(),rmt)&&(r.d||r.e)&&LOn(n,t)&&t.d.a.gc()<=1?dzn(e,t):DDn(n,e,t);t.k&&e5(t.d,new Te)}}function UKn(n,t,i,r,c,a){var u,o,s,h,f,l,b,w,d,g,p,v,m;for(o=(r+c)/2+a,g=i*e.Math.cos(o),p=i*e.Math.sin(o),v=g-t.g/2,m=p-t.f/2,Pen(t,v),Cen(t,m),l=n.a.jg(t),(d=2*e.Math.acos(i/i+n.c))<c-r?(b=d/l,u=(r+c-d)/2):(b=(c-r)/l,u=r),w=wDn(t),n.e&&(n.e.kg(n.d),n.e.lg(w)),h=new Wb(w);h.a<h.c.c.length;)s=BB(n0(h),33),f=n.a.jg(s),UKn(n,s,i+n.c,u,u+b*f,a),u+=b*f}function XKn(n,t,e){var i;switch(i=e.q.getMonth(),t){case 5:oO(n,Pun(Gk(Qtt,1),sVn,2,6,["J","F","M","A","M","J","J","A","S","O","N","D"])[i]);break;case 4:oO(n,Pun(Gk(Qtt,1),sVn,2,6,[YVn,JVn,ZVn,nQn,tQn,eQn,iQn,rQn,cQn,aQn,uQn,oQn])[i]);break;case 3:oO(n,Pun(Gk(Qtt,1),sVn,2,6,["Jan","Feb","Mar","Apr",tQn,"Jun","Jul","Aug","Sep","Oct","Nov","Dec"])[i]);break;default:Enn(n,i+1,t)}}function WKn(n,t){var e,i,r,c;if(OTn(t,"Network simplex",1),n.e.a.c.length<1)HSn(t);else{for(r=new Wb(n.e.a);r.a<r.c.c.length;)BB(n0(r),121).e=0;for((c=n.e.a.c.length>=40)&&EFn(n),BHn(n),Txn(n),e=yln(n),i=0;e&&i<n.f;)e_n(n,e,e$n(n,e)),e=yln(n),++i;c&&tTn(n),n.a?p$n(n,fKn(n)):fKn(n),n.b=null,n.d=null,n.p=null,n.c=null,n.g=null,n.i=null,n.n=null,n.o=null,HSn(t)}}function VKn(n,t,e,i){var r,c,a,u,o,s,h,f;for(XR(u=new xC(e,i),BB(mMn(t,(Mrn(),oat)),8)),f=new Wb(t.e);f.a<f.c.c.length;)UR((h=BB(n0(f),144)).d,u),WB(n.e,h);for(a=new Wb(t.c);a.a<a.c.c.length;){for(r=new Wb((c=BB(n0(a),282)).a);r.a<r.c.c.length;)UR(BB(n0(r),559).d,u);WB(n.c,c)}for(s=new Wb(t.d);s.a<s.c.c.length;)UR((o=BB(n0(s),447)).d,u),WB(n.d,o)}function QKn(n,t){var e,i,r,c,a,u,o,s;for(o=new Wb(t.j);o.a<o.c.c.length;)for(r=new m6((u=BB(n0(o),11)).b);y$(r.a)||y$(r.b);)t!=(c=(e=(i=BB(y$(r.a)?n0(r.a):n0(r.b),17)).c==u?i.d:i.c).i)&&((s=BB(mMn(i,(HXn(),fpt)),19).a)<0&&(s=0),a=c.p,0==n.b[a]&&(i.d==e?(n.a[a]-=s+1,n.a[a]<=0&&n.c[a]>0&&DH(n.f,c)):(n.c[a]-=s+1,n.c[a]<=0&&n.a[a]>0&&DH(n.e,c))))}function YKn(n){var t,e,i,r,c,a,u;for(c=new dE(BB(yX(new Rn),62)),u=KQn,e=new Wb(n.d);e.a<e.c.c.length;){for(u=(t=BB(n0(e),222)).c.c;0!=c.a.c&&(a=BB(MU(q9(c.a)),222)).c.c+a.c.b<u;)$J(c.a,a);for(r=new Fb(new BR(new xN(new _b(c.a).a).b));aS(r.a.a);)DH((i=BB(mx(r.a).cd(),222)).b,t),DH(t.b,i);Mon(c.a,t,(hN(),ptt))}}function JKn(n,t,e){var i,r,c,a,u,o,s,h,f;for(c=new J6(t.c.length),s=new Wb(t);s.a<s.c.c.length;)a=BB(n0(s),10),WB(c,n.b[a.c.p][a.p]);for(mqn(n,c,e),f=null;f=ezn(c);)rBn(n,BB(f.a,233),BB(f.b,233),c);for(t.c=x8(Ant,HWn,1,0,5,1),r=new Wb(c);r.a<r.c.c.length;)for(o=0,h=(u=(i=BB(n0(r),233)).d).length;o<h;++o)a=u[o],t.c[t.c.length]=a,n.a[a.c.p][a.p].a=lL(i.g,i.d[0]).a}function ZKn(n,t){var e,i,r,c;if(0<(cL(n,14)?BB(n,14).gc():F3(n.Kc()))){if(1<(r=t)){for(--r,c=new pa,i=n.Kc();i.Ob();)e=BB(i.Pb(),86),c=Wen(Pun(Gk(xnt,1),HWn,20,0,[c,new bg(e)]));return ZKn(c,r)}if(r<0){for(c=new va,i=n.Kc();i.Ob();)e=BB(i.Pb(),86),c=Wen(Pun(Gk(xnt,1),HWn,20,0,[c,new bg(e)]));if(0<(cL(c,14)?BB(c,14).gc():F3(c.Kc())))return ZKn(c,r)}}return BB(iL(n.Kc()),86)}function n_n(){n_n=O,GIt=new QC("DEFAULT_MINIMUM_SIZE",0),UIt=new QC("MINIMUM_SIZE_ACCOUNTS_FOR_PADDING",1),qIt=new QC("COMPUTE_PADDING",2),XIt=new QC("OUTSIDE_NODE_LABELS_OVERHANG",3),WIt=new QC("PORTS_OVERHANG",4),QIt=new QC("UNIFORM_PORT_SPACING",5),VIt=new QC("SPACE_EFFICIENT_PORT_LABELS",6),zIt=new QC("FORCE_TABULAR_NODE_LABELS",7),HIt=new QC("ASYMMETRICAL",8)}function t_n(n,t){var e,i,r,c,a,u,o,s;if(t){if(e=(c=t.Tg())?Utn(c).Nh().Jh(c):null){for(Jgn(n,t,e),o=0,s=(null==(r=t.Tg()).i&&qFn(r),r.i).length;o<s;++o)null==r.i&&qFn(r),i=r.i,(u=o>=0&&o<i.length?i[o]:null).Ij()&&!u.Jj()&&(cL(u,322)?nvn(n,BB(u,34),t,e):0!=((a=BB(u,18)).Bb&h6n)&&sEn(n,a,t,e));t.kh()&&BB(e,49).vh(BB(t,49).qh())}return e}return null}function e_n(n,t,e){var i,r,c;if(!t.f)throw Hp(new _y("Given leave edge is no tree edge."));if(e.f)throw Hp(new _y("Given enter edge is a tree edge already."));for(t.f=!1,eL(n.p,t),e.f=!0,TU(n.p,e),i=e.e.e-e.d.e-e.a,FCn(n,e.e,t)||(i=-i),c=new Wb(n.e.a);c.a<c.c.c.length;)FCn(n,r=BB(n0(c),121),t)||(r.e+=i);n.j=1,nk(n.c),pIn(n,BB(n0(new Wb(n.e.a)),121)),gGn(n)}function i_n(n,t){var e,i,r,c,a,u;if((u=BB(mMn(t,(HXn(),ept)),98))==(QEn(),WCt)||u==XCt)for(r=new xC(t.f.a+t.d.b+t.d.c,t.f.b+t.d.d+t.d.a).b,a=new Wb(n.a);a.a<a.c.c.length;)(c=BB(n0(a),10)).k==(uSn(),Mut)&&((e=BB(mMn(c,(hWn(),Qft)),61))!=(kUn(),oIt)&&e!=CIt||(i=Gy(MD(mMn(c,Tlt))),u==WCt&&(i*=r),c.n.b=i-BB(mMn(c,npt),8).b,Jan(c,!1,!0)))}function r_n(n,t,e,i){var r,c,a,u,o,s,h,f,l,b;if(Ytn(n,t,e),c=t[e],b=i?(kUn(),CIt):(kUn(),oIt),mL(t.length,e,i)){for(G6(n,r=t[i?e-1:e+1],i?(ain(),qvt):(ain(),Hvt)),h=0,l=(o=c).length;h<l;++h)xvn(n,a=o[h],b);for(G6(n,c,i?(ain(),Hvt):(ain(),qvt)),s=0,f=(u=r).length;s<f;++s)(a=u[s]).e||xvn(n,a,Tln(b))}else for(s=0,f=(u=c).length;s<f;++s)xvn(n,a=u[s],b);return!1}function c_n(n,t,e,i){var r,c,a,u,o;u=abn(t,e),(e==(kUn(),SIt)||e==CIt)&&(u=cL(u,152)?o6(BB(u,152)):cL(u,131)?BB(u,131).a:cL(u,54)?new fy(u):new CT(u)),a=!1;do{for(r=!1,c=0;c<u.gc()-1;c++)BMn(n,BB(u.Xb(c),11),BB(u.Xb(c+1),11),i)&&(a=!0,k0(n.a,BB(u.Xb(c),11),BB(u.Xb(c+1),11)),o=BB(u.Xb(c+1),11),u._c(c+1,BB(u.Xb(c),11)),u._c(c,o),r=!0)}while(r);return a}function a_n(n,t,e){var i,r,c,a,u,o,s,h,f,l,b,w;if(!mA(n.e))return BB(YIn(n,t,e),72);if(t!=e&&(a=(b=(r=BB(n.g,119))[e]).ak(),$xn(n.e,a))){for(w=axn(n.e.Tg(),a),o=-1,u=-1,i=0,s=0,f=t>e?t:e;s<=f;++s)s==e?u=i++:(c=r[s],h=w.rl(c.ak()),s==t&&(o=s!=f||h?i:i-1),h&&++i);return l=BB(Iln(n,t,e),72),u!=o&&Lv(n,new j9(n.e,7,a,iln(u),b.dd(),o)),l}return BB(Iln(n,t,e),72)}function u_n(n,t){var e,i,r,c,a,u;for(OTn(t,"Port order processing",1),u=BB(mMn(n,(HXn(),opt)),421),e=new Wb(n.b);e.a<e.c.c.length;)for(r=new Wb(BB(n0(e),29).a);r.a<r.c.c.length;)i=BB(n0(r),10),c=BB(mMn(i,ept),98),a=i.j,c==(QEn(),UCt)||c==WCt||c==XCt?(SQ(),m$(a,sst)):c!=QCt&&c!=YCt&&(SQ(),m$(a,fst),Lvn(a),u==(U7(),_vt)&&m$(a,hst)),i.i=!0,eIn(i);HSn(t)}function o_n(n){var t,i,r,c,a,u,o,s;for(s=new xp,t=new Fv,u=n.Kc();u.Ob();)c=BB(u.Pb(),10),o=AN(oM(new qv,c),t),jCn(s.f,c,o);for(a=n.Kc();a.Ob();)for(r=new oz(ZL(lbn(c=BB(a.Pb(),10)).a.Kc(),new h));dAn(r);)b5(i=BB(U5(r),17))||UNn(aM(cM(rM(uM(new Hv,e.Math.max(1,BB(mMn(i,(HXn(),lpt)),19).a)),1),BB(RX(s,i.c.i),121)),BB(RX(s,i.d.i),121)));return t}function s_n(){s_n=O,byt=dq(new B2,(yMn(),Fat),(lWn(),vot)),dyt=dq(new B2,_at,jot),gyt=WG(dq(new B2,_at,Dot),Bat,xot),lyt=WG(dq(dq(new B2,_at,lot),Fat,bot),Bat,wot),pyt=ogn(ogn(FM(WG(dq(new B2,Rat,Uot),Bat,zot),Fat),Got),Xot),wyt=WG(new B2,Bat,mot),hyt=WG(dq(dq(dq(new B2,Kat,Mot),Fat,Pot),Fat,Cot),Bat,Sot),fyt=WG(dq(dq(new B2,Fat,Cot),Fat,uot),Bat,aot)}function h_n(n,t,e,i,r,c){var a,u,o,s,h,f;for(a=lSn(t,o=jon(t)-jon(n)),u=M$(0,0,0);o>=0&&(!Cyn(n,a)||(o<22?u.l|=1<<o:o<44?u.m|=1<<o-22:u.h|=1<<o-44,0!=n.l||0!=n.m||0!=n.h));)s=a.m,h=a.h,f=a.l,a.h=h>>>1,a.m=s>>>1|(1&h)<<21,a.l=f>>>1|(1&s)<<21,--o;return e&&Oon(u),c&&(i?(ltt=aon(n),r&&(ltt=hun(ltt,(X7(),dtt)))):ltt=M$(n.l,n.m,n.h)),u}function f_n(n,t){var e,i,r,c,a,u,o,s,h,f;for(s=n.e[t.c.p][t.p]+1,o=t.c.a.c.length+1,u=new Wb(n.a);u.a<u.c.c.length;){for(a=BB(n0(u),11),f=0,c=0,r=NU(Wen(Pun(Gk(xnt,1),HWn,20,0,[new Hw(a),new Gw(a)])));dAn(r);)(i=BB(U5(r),11)).i.c==t.c&&(f+=bL(n,i.i)+1,++c);e=f/c,(h=a.j)==(kUn(),oIt)?n.f[a.p]=e<s?n.c-e:n.b+(o-e):h==CIt&&(n.f[a.p]=e<s?n.b+e:n.c-(o-e))}}function l_n(n,t,e){var i,r,c,a;if(null==n)throw Hp(new Mk(zWn));for(i=(c=n.length)>0&&(b1(0,n.length),45==n.charCodeAt(0)||(b1(0,n.length),43==n.charCodeAt(0)))?1:0;i<c;i++)if(-1==egn((b1(i,n.length),n.charCodeAt(i))))throw Hp(new Mk(DQn+n+'"'));if(r=(a=parseInt(n,10))<t,isNaN(a))throw Hp(new Mk(DQn+n+'"'));if(r||a>e)throw Hp(new Mk(DQn+n+'"'));return a}function b_n(n){var t,i,r,c,a,u;for(a=new YT,c=new Wb(n.a);c.a<c.c.c.length;)Vl(r=BB(n0(c),112),r.f.c.length),Ql(r,r.k.c.length),0==r.i&&(r.o=0,r5(a,r,a.c.b,a.c));for(;0!=a.b;)for(i=(r=BB(0==a.b?null:(Px(0!=a.b),Atn(a,a.a.a)),112)).o+1,t=new Wb(r.f);t.a<t.c.c.length;)Yl(u=BB(n0(t),129).a,e.Math.max(u.o,i)),Ql(u,u.i-1),0==u.i&&r5(a,u,a.c.b,a.c)}function w_n(n){var t,e,i,r,c,a,u,o;for(a=new Wb(n);a.a<a.c.c.length;){for(c=BB(n0(a),79),u=(i=PTn(BB(Wtn((!c.b&&(c.b=new hK(KOt,c,4,7)),c.b),0),82))).i,o=i.j,CA(r=BB(Wtn((!c.a&&(c.a=new eU(FOt,c,6,6)),c.a),0),202),r.j+u,r.k+o),PA(r,r.b+u,r.c+o),e=new AL((!r.a&&(r.a=new $L(xOt,r,5)),r.a));e.e!=e.i.gc();)TA(t=BB(kpn(e),469),t.a+u,t.b+o);Yrn(BB(ZAn(c,(sWn(),OSt)),74),u,o)}}function d_n(n){switch(n){case 100:return mWn(snt,!0);case 68:return mWn(snt,!1);case 119:return mWn(hnt,!0);case 87:return mWn(hnt,!1);case 115:return mWn(fnt,!0);case 83:return mWn(fnt,!1);case 99:return mWn(lnt,!0);case 67:return mWn(lnt,!1);case 105:return mWn(bnt,!0);case 73:return mWn(bnt,!1);default:throw Hp(new dy(ont+n.toString(16)))}}function g_n(n){var t,i,r,c,a;switch(c=BB(xq(n.a,0),10),t=new $vn(n),WB(n.a,t),t.o.a=e.Math.max(1,c.o.a),t.o.b=e.Math.max(1,c.o.b),t.n.a=c.n.a,t.n.b=c.n.b,BB(mMn(c,(hWn(),Qft)),61).g){case 4:t.n.a+=2;break;case 1:t.n.b+=2;break;case 2:t.n.a-=2;break;case 3:t.n.b-=2}return CZ(r=new CSn,t),SZ(i=new wY,a=BB(xq(c.j,0),11)),MZ(i,r),UR(kO(r.n),a.n),UR(kO(r.a),a.a),t}function p_n(n,t,e,i,r){e&&(!i||(n.c-n.b&n.a.length-1)>1)&&1==t&&BB(n.a[n.b],10).k==(uSn(),Sut)?hFn(BB(n.a[n.b],10),(Xyn(),jCt)):i&&(!e||(n.c-n.b&n.a.length-1)>1)&&1==t&&BB(n.a[n.c-1&n.a.length-1],10).k==(uSn(),Sut)?hFn(BB(n.a[n.c-1&n.a.length-1],10),(Xyn(),ECt)):2==(n.c-n.b&n.a.length-1)?(hFn(BB(Eon(n),10),(Xyn(),jCt)),hFn(BB(Eon(n),10),ECt)):sLn(n,r),o4(n)}function v_n(n,t,i){var r,c,a,u,o;for(a=0,c=new AL((!n.a&&(n.a=new eU(UOt,n,10,11)),n.a));c.e!=c.i.gc();)u="",0==(!(r=BB(kpn(c),33)).n&&(r.n=new eU(zOt,r,1,7)),r.n).i||(u=BB(Wtn((!r.n&&(r.n=new eU(zOt,r,1,7)),r.n),0),137).a),qan(o=new csn(a++,t,u),r),hon(o,(qqn(),skt),r),o.e.b=r.j+r.f/2,o.f.a=e.Math.max(r.g,1),o.e.a=r.i+r.g/2,o.f.b=e.Math.max(r.f,1),DH(t.b,o),jCn(i.f,r,o)}function m_n(n){var t,e,i,r,c;i=BB(mMn(n,(hWn(),dlt)),33),c=BB(ZAn(i,(HXn(),Fgt)),174).Hc((mdn(),_It)),n.e||(r=BB(mMn(n,Zft),21),t=new xC(n.f.a+n.d.b+n.d.c,n.f.b+n.d.d+n.d.a),r.Hc((bDn(),lft))?(Ypn(i,ept,(QEn(),XCt)),KUn(i,t.a,t.b,!1,!0)):qy(TD(ZAn(i,Bgt)))||KUn(i,t.a,t.b,!0,!0)),Ypn(i,Fgt,c?nbn(_It):new YK(e=BB(Vj(YIt),9),BB(SR(e,e.length),9),0))}function y_n(n,t,e){var i,r,c,a;if(t[0]>=n.length)return e.o=0,!0;switch(fV(n,t[0])){case 43:r=1;break;case 45:r=-1;break;default:return e.o=0,!0}if(++t[0],c=t[0],0==(a=UIn(n,t))&&t[0]==c)return!1;if(t[0]<n.length&&58==fV(n,t[0])){if(i=60*a,++t[0],c=t[0],0==(a=UIn(n,t))&&t[0]==c)return!1;i+=a}else(i=a)<24&&t[0]-c<=2?i*=60:i=i%100+60*(i/100|0);return i*=r,e.o=-i,!0}function k_n(n){var t,e,i,r,c,a,u;for(r=new Np,i=new oz(ZL(lbn(n.b).a.Kc(),new h));dAn(i);)b5(e=BB(U5(i),17))&&WB(r,new j6(e,v9(n,e.c),v9(n,e.d)));for(u=new Kb(new Ob(n.e).a.vc().Kc());u.a.Ob();)t=BB(u.a.Pb(),42),(c=BB(t.dd(),113)).d.p=0;for(a=new Kb(new Ob(n.e).a.vc().Kc());a.a.Ob();)t=BB(a.a.Pb(),42),0==(c=BB(t.dd(),113)).d.p&&WB(n.d,RKn(n,c))}function j_n(n){var t,e,i,r,c;for(c=WJ(n),r=new AL((!n.e&&(n.e=new hK(_Ot,n,7,4)),n.e));r.e!=r.i.gc();)if(i=BB(kpn(r),79),!Ctn(PTn(BB(Wtn((!i.c&&(i.c=new hK(KOt,i,5,8)),i.c),0),82)),c))return!0;for(e=new AL((!n.d&&(n.d=new hK(_Ot,n,8,5)),n.d));e.e!=e.i.gc();)if(t=BB(kpn(e),79),!Ctn(PTn(BB(Wtn((!t.b&&(t.b=new hK(KOt,t,4,7)),t.b),0),82)),c))return!0;return!1}function E_n(n){var t,i,r,c,a,u,o,s;for(s=new km,o=null,i=BB(b3(t=spn(n,0)),8),c=BB(b3(t),8);t.b!=t.d.c;)o=i,i=c,c=BB(b3(t),8),a=ctn(XR(new xC(o.a,o.b),i)),u=ctn(XR(new xC(c.a,c.b),i)),r=10,r=e.Math.min(r,e.Math.abs(a.a+a.b)/2),r=e.Math.min(r,e.Math.abs(u.a+u.b)/2),a.a=HH(a.a)*r,a.b=HH(a.b)*r,u.a=HH(u.a)*r,u.b=HH(u.b)*r,DH(s,UR(a,i)),DH(s,UR(u,i));return s}function T_n(n,t,e,i){var r,c,a,u,o;return a=n.eh(),r=null,(o=n.Zg())?t&&0==(gKn(n,t,e).Bb&BQn)?(i=_pn(o.Vk(),n,i),n.uh(null),r=t.fh()):o=null:(a&&(o=a.fh()),t&&(r=t.fh())),o!=r&&o&&o.Zk(n),u=n.Vg(),n.Rg(t,e),o!=r&&r&&r.Yk(n),n.Lg()&&n.Mg()&&(a&&u>=0&&u!=e&&(c=new nU(n,1,u,a,null),i?i.Ei(c):i=c),e>=0&&(c=new nU(n,1,e,u==e?a:null,t),i?i.Ei(c):i=c)),i}function M_n(n){var t,e,i;if(null==n.b){if(i=new Sk,null!=n.i&&(cO(i,n.i),i.a+=":"),0!=(256&n.f)){for(0!=(256&n.f)&&null!=n.a&&(rQ(n.i)||(i.a+="//"),cO(i,n.a)),null!=n.d&&(i.a+="/",cO(i,n.d)),0!=(16&n.f)&&(i.a+="/"),t=0,e=n.j.length;t<e;t++)0!=t&&(i.a+="/"),cO(i,n.j[t]);null!=n.g&&(i.a+="?",cO(i,n.g))}else cO(i,n.a);null!=n.e&&(i.a+="#",cO(i,n.e)),n.b=i.a}return n.b}function S_n(n,t){var e,i,r,c,a,u;for(r=new Wb(t.a);r.a<r.c.c.length;)cL(c=mMn(i=BB(n0(r),10),(hWn(),dlt)),11)&&(u=yFn(t,i,(a=BB(c,11)).o.a,a.o.b),a.n.a=u.a,a.n.b=u.b,qCn(a,BB(mMn(i,Qft),61)));e=new xC(t.f.a+t.d.b+t.d.c,t.f.b+t.d.d+t.d.a),BB(mMn(t,(hWn(),Zft)),21).Hc((bDn(),lft))?(hon(n,(HXn(),ept),(QEn(),XCt)),BB(mMn(vW(n),Zft),21).Fc(dft),bGn(n,e,!1)):bGn(n,e,!0)}function P_n(n,t,e){var i,r,c,a,u;OTn(e,"Minimize Crossings "+n.a,1),i=0==t.b.c.length||!jE(AV(new Rq(null,new w1(t.b,16)),new aw(new Ac))).sd((dM(),tit)),u=1==t.b.c.length&&1==BB(xq(t.b,0),29).a.c.length,c=GI(mMn(t,(HXn(),sgt)))===GI((ufn(),pCt)),i||u&&!c||(Ssn(r=sxn(n,t),(a=BB(Dpn(r,0),214)).c.Rf()?a.c.Lf()?new Ud(n):new Xd(n):new zd(n)),afn(n)),HSn(e)}function C_n(n,t,e,i){var r,c,a,u;if(u=dG(cbn(SVn,rV(dG(cbn(null==t?0:nsn(t),PVn)),15))),r=dG(cbn(SVn,rV(dG(cbn(null==e?0:nsn(e),PVn)),15))),a=Zrn(n,t,u),c=Jrn(n,e,r),a&&r==a.a&&wW(e,a.g))return e;if(c&&!i)throw Hp(new _y("key already present: "+e));return a&&LLn(n,a),c&&LLn(n,c),YCn(n,new qW(e,r,t,u),c),c&&(c.e=null,c.c=null),a&&(a.e=null,a.c=null),qkn(n),a?a.g:null}function I_n(n,t,e){var i,r,c,a,u;for(c=0;c<t;c++){for(i=0,u=c+1;u<t;u++)i=rbn(rbn(cbn(e0(n[c],UQn),e0(n[u],UQn)),e0(e[c+u],UQn)),e0(dG(i),UQn)),e[c+u]=dG(i),i=jz(i,32);e[c+t]=dG(i)}for(ncn(e,e,t<<1),i=0,r=0,a=0;r<t;++r,a++)i=rbn(rbn(cbn(e0(n[r],UQn),e0(n[r],UQn)),e0(e[a],UQn)),e0(dG(i),UQn)),e[a]=dG(i),i=rbn(i=jz(i,32),e0(e[++a],UQn)),e[a]=dG(i),i=jz(i,32);return e}function O_n(n,t,i){var r,c,a,u,o,s,h,f;if(!h3(t)){for(s=Gy(MD(edn(i.c,(HXn(),Npt)))),!(h=BB(edn(i.c,Lpt),142))&&(h=new lm),r=i.a,c=null,o=t.Kc();o.Ob();)u=BB(o.Pb(),11),f=0,c?(f=s,f+=c.o.b):f=h.d,a=AN(oM(new qv,u),n.f),VW(n.k,u,a),UNn(aM(cM(rM(uM(new Hv,0),CJ(e.Math.ceil(f))),r),a)),c=u,r=a;UNn(aM(cM(rM(uM(new Hv,0),CJ(e.Math.ceil(h.a+c.o.b))),r),i.d))}}function A_n(n,t,e,i,r,c,a,u){var o,s,h;return h=!1,s=c-e.s,o=e.t-t.f+cHn(e,s,!1).a,!(i.g+u>s)&&(o+u+cHn(i,s,!1).a<=t.b&&(p9(e,c-e.s),e.c=!0,p9(i,c-e.s),Tvn(i,e.s,e.t+e.d+u),i.k=!0,xcn(e.q,i),h=!0,r&&(tin(t,i),i.j=t,n.c.length>a&&(Tkn((l1(a,n.c.length),BB(n.c[a],200)),i),0==(l1(a,n.c.length),BB(n.c[a],200)).a.c.length&&s6(n,a)))),h)}function $_n(n,t){var e,i,r,c,a;if(OTn(t,"Partition midprocessing",1),r=new pJ,JT(AV(new Rq(null,new w1(n.a,16)),new di),new ld(r)),0!=r.d){for(a=BB(P4(a1(new Rq(null,(r.i||(r.i=new HL(r,r.c))).Nc())),m9(new H,new B,new rn,Pun(Gk(nit,1),$Vn,132,0,[(qsn(),Uet)]))),15),e=BB((i=a.Kc()).Pb(),19);i.Ob();)c=BB(i.Pb(),19),XLn(BB(h6(r,e),21),BB(h6(r,c),21)),e=c;HSn(t)}}function L_n(n,t,e){var i,r,c,a,u;if(0==t.p){for(t.p=1,(r=e)||(r=new rI(new Np,new YK(i=BB(Vj(FIt),9),BB(SR(i,i.length),9),0))),BB(r.a,15).Fc(t),t.k==(uSn(),Mut)&&BB(r.b,21).Fc(BB(mMn(t,(hWn(),Qft)),61)),a=new Wb(t.j);a.a<a.c.c.length;)for(c=BB(n0(a),11),u=NU(Wen(Pun(Gk(xnt,1),HWn,20,0,[new Hw(c),new Gw(c)])));dAn(u);)L_n(n,BB(U5(u),11).i,r);return r}return null}function N_n(n,t){var e,i,r,c,a;if(n.Ab)if(n.Ab){if((a=n.Ab.i)>0)if(r=BB(n.Ab.g,1934),null==t){for(c=0;c<a;++c)if(null==(e=r[c]).d)return e}else for(c=0;c<a;++c)if(mK(t,(e=r[c]).d))return e}else if(null==t){for(i=new AL(n.Ab);i.e!=i.i.gc();)if(null==(e=BB(kpn(i),590)).d)return e}else for(i=new AL(n.Ab);i.e!=i.i.gc();)if(mK(t,(e=BB(kpn(i),590)).d))return e;return null}function x_n(n,t){var e,i,r,c,a,u,o;if(null==(o=TD(mMn(t,(CAn(),Nkt))))||(kW(o),o)){for(DOn(n,t),r=new Np,u=spn(t.b,0);u.b!=u.d.c;)(e=xPn(n,BB(b3(u),86),null))&&(qan(e,t),r.c[r.c.length]=e);if(n.a=null,n.b=null,r.c.length>1)for(i=new Wb(r);i.a<i.c.c.length;)for(c=0,a=spn((e=BB(n0(i),135)).b,0);a.b!=a.d.c;)BB(b3(a),86).g=c++;return r}return u6(Pun(Gk(Gyt,1),tZn,135,0,[t]))}function D_n(n,t,e,i,r){var c,a,u,o,s,h,f,l,b,w,d,g,p;crn(b=A3(n,qun(t),r),R2(r,q6n)),d=D2(w=r,U6n),cSn(new Lg(b).a,d),g=D2(w,"endPoint"),rSn(new Rg(b).a,g),p=N2(w,D6n),SEn(new Fg(b).a,p),f=R2(r,K6n),qR((c=new hI(n,b)).a,c.b,f),l=R2(r,R6n),GR((a=new fI(n,b)).a,a.b,l),s=N2(r,F6n),Fyn((u=new lI(e,b)).b,u.a,s),h=N2(r,_6n),Byn((o=new bI(i,b)).b,o.a,h)}function R_n(n,t,e){var i,r,c,a,u;switch(u=null,t.g){case 1:for(r=new Wb(n.j);r.a<r.c.c.length;)if(qy(TD(mMn(i=BB(n0(r),11),(hWn(),tlt)))))return i;hon(u=new CSn,(hWn(),tlt),(hN(),!0));break;case 2:for(a=new Wb(n.j);a.a<a.c.c.length;)if(qy(TD(mMn(c=BB(n0(a),11),(hWn(),klt)))))return c;hon(u=new CSn,(hWn(),klt),(hN(),!0))}return u&&(CZ(u,n),qCn(u,e),yvn(u.n,n.o,e)),u}function K_n(n,t){var i,r,c,a,u,o;for(o=-1,u=new YT,r=new m6(n.b);y$(r.a)||y$(r.b);){for(i=BB(y$(r.a)?n0(r.a):n0(r.b),17),o=e.Math.max(o,Gy(MD(mMn(i,(HXn(),agt))))),i.c==n?JT(AV(new Rq(null,new w1(i.b,16)),new fe),new nd(u)):JT(AV(new Rq(null,new w1(i.b,16)),new le),new td(u)),a=spn(u,0);a.b!=a.d.c;)Lx(c=BB(b3(a),70),(hWn(),Uft))||hon(c,Uft,i);gun(t,u),yQ(u)}return o}function __n(n,t,e,i,r){var c,a,u,o;Bl(c=new $vn(n),(uSn(),Iut)),hon(c,(HXn(),ept),(QEn(),XCt)),hon(c,(hWn(),dlt),t.c.i),hon(a=new CSn,dlt,t.c),qCn(a,r),CZ(a,c),hon(t.c,Elt,c),Bl(u=new $vn(n),Iut),hon(u,ept,XCt),hon(u,dlt,t.d.i),hon(o=new CSn,dlt,t.d),qCn(o,r),CZ(o,u),hon(t.d,Elt,u),SZ(t,a),MZ(t,o),LZ(0,e.c.length),MS(e.c,0,c),i.c[i.c.length]=u,hon(c,Bft,iln(1)),hon(u,Bft,iln(1))}function F_n(n,t,i,r,c){var a,u,o,s,h;o=c?r.b:r.a,FT(n.a,r)||(h=o>i.s&&o<i.c,s=!1,0!=i.e.b&&0!=i.j.b&&(s|=e.Math.abs(o-Gy(MD(gx(i.e))))<lZn&&e.Math.abs(o-Gy(MD(gx(i.j))))<lZn,s|=e.Math.abs(o-Gy(MD(px(i.e))))<lZn&&e.Math.abs(o-Gy(MD(px(i.j))))<lZn),(h||s)&&((u=BB(mMn(t,(HXn(),vgt)),74))||(u=new km,hon(t,vgt,u)),r5(u,a=new wA(r),u.c.b,u.c),TU(n.a,a)))}function B_n(n,t,e,i){var r,c,a,u,o,s,h;if(WIn(n,t,e,i))return!0;for(a=new Wb(t.f);a.a<a.c.c.length;){switch(c=BB(n0(a),324),u=!1,s=(o=n.j-t.j+e)+t.o,r=(h=n.k-t.k+i)+t.p,c.a.g){case 0:u=Osn(n,o+c.b.a,0,o+c.c.a,h-1);break;case 1:u=Osn(n,s,h+c.b.a,n.o-1,h+c.c.a);break;case 2:u=Osn(n,o+c.b.a,r,o+c.c.a,n.p-1);break;default:u=Osn(n,0,h+c.b.a,o-1,h+c.c.a)}if(u)return!0}return!1}function H_n(n,t){var e,i,r,c,a,u,o,s;for(c=new Wb(t.b);c.a<c.c.c.length;)for(o=new Wb(BB(n0(c),29).a);o.a<o.c.c.length;){for(u=BB(n0(o),10),s=new Np,a=0,i=new oz(ZL(fbn(u).a.Kc(),new h));dAn(i);)b5(e=BB(U5(i),17))||!b5(e)&&e.c.i.c==e.d.i.c||((r=BB(mMn(e,(HXn(),bpt)),19).a)>a&&(a=r,s.c=x8(Ant,HWn,1,0,5,1)),r==a&&WB(s,new rI(e.c.i,e)));SQ(),m$(s,n.c),kG(n.b,u.p,s)}}function q_n(n,t){var e,i,r,c,a,u,o,s;for(c=new Wb(t.b);c.a<c.c.c.length;)for(o=new Wb(BB(n0(c),29).a);o.a<o.c.c.length;){for(u=BB(n0(o),10),s=new Np,a=0,i=new oz(ZL(lbn(u).a.Kc(),new h));dAn(i);)b5(e=BB(U5(i),17))||!b5(e)&&e.c.i.c==e.d.i.c||((r=BB(mMn(e,(HXn(),bpt)),19).a)>a&&(a=r,s.c=x8(Ant,HWn,1,0,5,1)),r==a&&WB(s,new rI(e.d.i,e)));SQ(),m$(s,n.c),kG(n.f,u.p,s)}}function G_n(n){NM(n,new MTn(vj(wj(pj(gj(new du,l5n),"ELK Box"),"Algorithm for packing of unconnected boxes, i.e. graphs without edges."),new xu))),u2(n,l5n,QJn,zMt),u2(n,l5n,vZn,15),u2(n,l5n,pZn,iln(0)),u2(n,l5n,A4n,mpn(_Mt)),u2(n,l5n,PZn,mpn(BMt)),u2(n,l5n,SZn,mpn(qMt)),u2(n,l5n,VJn,f5n),u2(n,l5n,jZn,mpn(FMt)),u2(n,l5n,BZn,mpn(HMt)),u2(n,l5n,b5n,mpn(RMt)),u2(n,l5n,u3n,mpn(KMt))}function z_n(n,t){var e,i,r,c,a,u,o,s,h;if(a=(r=n.i).o.a,c=r.o.b,a<=0&&c<=0)return kUn(),PIt;switch(s=n.n.a,h=n.n.b,u=n.o.a,e=n.o.b,t.g){case 2:case 1:if(s<0)return kUn(),CIt;if(s+u>a)return kUn(),oIt;break;case 4:case 3:if(h<0)return kUn(),sIt;if(h+e>c)return kUn(),SIt}return(o=(s+u/2)/a)+(i=(h+e/2)/c)<=1&&o-i<=0?(kUn(),CIt):o+i>=1&&o-i>=0?(kUn(),oIt):i<.5?(kUn(),sIt):(kUn(),SIt)}function U_n(n,t){var e,i,r,c,a,u,o,s,h,f,l,b;for(e=!1,o=Gy(MD(mMn(t,(HXn(),Opt)))),l=KVn*o,r=new Wb(t.b);r.a<r.c.c.length;)for(i=BB(n0(r),29),c=BB(n0(u=new Wb(i.a)),10),s=wU(n.a[c.p]);u.a<u.c.c.length;)a=BB(n0(u),10),s!=(h=wU(n.a[a.p]))&&(f=K$(n.b,c,a),c.n.b+c.o.b+c.d.a+s.a+f>a.n.b-a.d.d+h.a+l&&(b=s.g+h.g,h.a=(h.g*h.a+s.g*s.a)/b,h.g=b,s.f=h,e=!0)),c=a,s=h;return e}function X_n(n,t,e,i,r,c,a){var u,o,s,h,f;for(f=new bA,o=t.Kc();o.Ob();)for(h=new Wb(BB(o.Pb(),839).wf());h.a<h.c.c.length;)GI((s=BB(n0(h),181)).We((sWn(),gSt)))===GI((Rtn(),XPt))&&(rKn(f,s,!1,i,r,c,a),CPn(n,f));for(u=e.Kc();u.Ob();)for(h=new Wb(BB(u.Pb(),839).wf());h.a<h.c.c.length;)GI((s=BB(n0(h),181)).We((sWn(),gSt)))===GI((Rtn(),UPt))&&(rKn(f,s,!0,i,r,c,a),CPn(n,f))}function W_n(n,t,e){var i,r,c,a,u,o,s;for(a=new AL((!n.a&&(n.a=new eU(UOt,n,10,11)),n.a));a.e!=a.i.gc();)for(r=new oz(ZL(dLn(c=BB(kpn(a),33)).a.Kc(),new h));dAn(r);)nAn(i=BB(U5(r),79))||nAn(i)||QIn(i)||(o=BB(qI(AY(e.f,c)),86),s=BB(RX(e,PTn(BB(Wtn((!i.c&&(i.c=new hK(KOt,i,5,8)),i.c),0),82))),86),o&&s&&(hon(u=new UQ(o,s),(qqn(),skt),i),qan(u,i),DH(o.d,u),DH(s.b,u),DH(t.a,u)))}function V_n(n,t){var i,r,c,a,u,o,s;for(o=BB(BB(h6(n.r,t),21),84).Kc();o.Ob();)(r=(u=BB(o.Pb(),111)).c?WH(u.c):0)>0?u.a?r>(s=u.b.rf().b)&&(n.v||1==u.c.d.c.length?(a=(r-s)/2,u.d.d=a,u.d.a=a):(i=(BB(xq(u.c.d,0),181).rf().b-s)/2,u.d.d=e.Math.max(0,i),u.d.a=r-i-s)):u.d.a=n.t+r:Hz(n.u)&&((c=_Tn(u.b)).d<0&&(u.d.d=-c.d),c.d+c.a>u.b.rf().b&&(u.d.a=c.d+c.a-u.b.rf().b))}function Q_n(n,t){var e;switch(vnn(n)){case 6:return XI(t);case 7:return UI(t);case 8:return zI(t);case 3:return Array.isArray(t)&&!((e=vnn(t))>=14&&e<=16);case 11:return null!=t&&typeof t===xWn;case 12:return null!=t&&(typeof t===AWn||typeof t==xWn);case 0:return Qpn(t,n.__elementTypeId$);case 2:return DU(t)&&!(t.im===I);case 1:return DU(t)&&!(t.im===I)||Qpn(t,n.__elementTypeId$);default:return!0}}function Y_n(n,t){var i,r,c,a;return r=e.Math.min(e.Math.abs(n.c-(t.c+t.b)),e.Math.abs(n.c+n.b-t.c)),a=e.Math.min(e.Math.abs(n.d-(t.d+t.a)),e.Math.abs(n.d+n.a-t.d)),(i=e.Math.abs(n.c+n.b/2-(t.c+t.b/2)))>n.b/2+t.b/2||(c=e.Math.abs(n.d+n.a/2-(t.d+t.a/2)))>n.a/2+t.a/2?1:0==i&&0==c?0:0==i?a/c+1:0==c?r/i+1:e.Math.min(r/i,a/c)+1}function J_n(n,t){var i,r,c,a,u,o;return(c=iin(n))==(o=iin(t))?n.e==t.e&&n.a<54&&t.a<54?n.f<t.f?-1:n.f>t.f?1:0:(r=n.e-t.e,(i=(n.d>0?n.d:e.Math.floor((n.a-1)*zQn)+1)-(t.d>0?t.d:e.Math.floor((t.a-1)*zQn)+1))>r+1?c:i<r-1?-c:(!n.c&&(n.c=yhn(n.f)),a=n.c,!t.c&&(t.c=yhn(t.f)),u=t.c,r<0?a=Nnn(a,kBn(-r)):r>0&&(u=Nnn(u,kBn(r))),tgn(a,u))):c<o?-1:1}function Z_n(n,t){var e,i,r,c,a,u,o;for(c=0,u=0,o=0,r=new Wb(n.f.e);r.a<r.c.c.length;)t!=(i=BB(n0(r),144))&&(c+=a=n.i[t.b][i.b],(e=W8(t.d,i.d))>0&&n.d!=(q7(),Aat)&&(u+=a*(i.d.a+n.a[t.b][i.b]*(t.d.a-i.d.a)/e)),e>0&&n.d!=(q7(),Iat)&&(o+=a*(i.d.b+n.a[t.b][i.b]*(t.d.b-i.d.b)/e)));switch(n.d.g){case 1:return new xC(u/c,t.d.b);case 2:return new xC(t.d.a,o/c);default:return new xC(u/c,o/c)}}function nFn(n,t){var e,i,r,c;if(zsn(),c=BB(mMn(n.i,(HXn(),ept)),98),0!=n.j.g-t.j.g||c!=(QEn(),UCt)&&c!=WCt&&c!=XCt)return 0;if(c==(QEn(),UCt)&&(e=BB(mMn(n,ipt),19),i=BB(mMn(t,ipt),19),e&&i&&0!=(r=e.a-i.a)))return r;switch(n.j.g){case 1:return Pln(n.n.a,t.n.a);case 2:return Pln(n.n.b,t.n.b);case 3:return Pln(t.n.a,n.n.a);case 4:return Pln(t.n.b,n.n.b);default:throw Hp(new Fy(r1n))}}function tFn(n){var t,e,i,r,c;for(WB(c=new J6((!n.a&&(n.a=new $L(xOt,n,5)),n.a).i+2),new xC(n.j,n.k)),JT(new Rq(null,(!n.a&&(n.a=new $L(xOt,n,5)),new w1(n.a,16))),new Ig(c)),WB(c,new xC(n.b,n.c)),t=1;t<c.c.length-1;)l1(t-1,c.c.length),e=BB(c.c[t-1],8),l1(t,c.c.length),i=BB(c.c[t],8),l1(t+1,c.c.length),r=BB(c.c[t+1],8),e.a==i.a&&i.a==r.a||e.b==i.b&&i.b==r.b?s6(c,t):++t;return c}function eFn(n,t){var e,i,r,c,a,u,o;for(e=ON(iM(tM(eM(new Wv,t),new gY(t.e)),gst),n.a),0==t.j.c.length||V9(BB(xq(t.j,0),57).a,e),o=new Dp,VW(n.e,e,o),a=new Rv,u=new Rv,c=new Wb(t.k);c.a<c.c.c.length;)TU(a,(r=BB(n0(c),17)).c),TU(u,r.d);(i=a.a.gc()-u.a.gc())<0?(Uun(o,!0,(Ffn(),_Pt)),Uun(o,!1,FPt)):i>0&&(Uun(o,!1,(Ffn(),_Pt)),Uun(o,!0,FPt)),Otn(t.g,new sP(n,e)),VW(n.g,t,e)}function iFn(){var n;for(iFn=O,Ltt=Pun(Gk(ANt,1),hQn,25,15,[-1,-1,30,19,15,13,11,11,10,9,9,8,8,8,8,7,7,7,7,7,7,7,6,6,6,6,6,6,6,6,6,6,6,6,6,6,5]),Ntt=x8(ANt,hQn,25,37,15,1),xtt=Pun(Gk(ANt,1),hQn,25,15,[-1,-1,63,40,32,28,25,23,21,20,19,19,18,18,17,17,16,16,16,15,15,15,15,14,14,14,14,14,14,13,13,13,13,13,13,13,13]),Dtt=x8(LNt,FQn,25,37,14,1),n=2;n<=36;n++)Ntt[n]=CJ(e.Math.pow(n,Ltt[n])),Dtt[n]=Ojn(bVn,Ntt[n])}function rFn(n){var t;if(1!=(!n.a&&(n.a=new eU(FOt,n,6,6)),n.a).i)throw Hp(new _y(B5n+(!n.a&&(n.a=new eU(FOt,n,6,6)),n.a).i));return t=new km,bun(BB(Wtn((!n.b&&(n.b=new hK(KOt,n,4,7)),n.b),0),82))&&Frn(t,zXn(n,bun(BB(Wtn((!n.b&&(n.b=new hK(KOt,n,4,7)),n.b),0),82)),!1)),bun(BB(Wtn((!n.c&&(n.c=new hK(KOt,n,5,8)),n.c),0),82))&&Frn(t,zXn(n,bun(BB(Wtn((!n.c&&(n.c=new hK(KOt,n,5,8)),n.c),0),82)),!0)),t}function cFn(n,t){var e,i,r;for(r=!1,i=new oz(ZL((t.d?n.a.c==(gJ(),tyt)?fbn(t.b):lbn(t.b):n.a.c==(gJ(),nyt)?fbn(t.b):lbn(t.b)).a.Kc(),new h));dAn(i);)if(e=BB(U5(i),17),(qy(n.a.f[n.a.g[t.b.p].p])||b5(e)||e.c.i.c!=e.d.i.c)&&!qy(n.a.n[n.a.g[t.b.p].p])&&!qy(n.a.n[n.a.g[t.b.p].p])&&(r=!0,FT(n.b,n.a.g[Lmn(e,t.b).p])))return t.c=!0,t.a=e,t;return t.c=r,t.a=null,t}function aFn(n,t,e,i,r){var c,a,u,o,s,h,f;for(SQ(),m$(n,new Xu),u=new M2(n,0),f=new Np,c=0;u.b<u.d.gc();)Px(u.b<u.d.gc()),a=BB(u.d.Xb(u.c=u.b++),157),0!=f.c.length&&iG(a)*eG(a)>2*c?(h=new Gtn(f),s=iG(a)/eG(a),o=yXn(h,t,new bm,e,i,r,s),UR(kO(h.e),o),f.c=x8(Ant,HWn,1,0,5,1),c=0,f.c[f.c.length]=h,f.c[f.c.length]=a,c=iG(h)*eG(h)+iG(a)*eG(a)):(f.c[f.c.length]=a,c+=iG(a)*eG(a));return f}function uFn(n,t,e){var i,r,c,a,u,o,s;if(0==(i=e.gc()))return!1;if(n.ej())if(o=n.fj(),kwn(n,t,e),a=1==i?n.Zi(3,null,e.Kc().Pb(),t,o):n.Zi(5,null,e,t,o),n.bj()){for(u=i<100?null:new Fj(i),c=t+i,r=t;r<c;++r)s=n.Oi(r),u=n.cj(s,u);u?(u.Ei(a),u.Fi()):n.$i(a)}else n.$i(a);else if(kwn(n,t,e),n.bj()){for(u=i<100?null:new Fj(i),c=t+i,r=t;r<c;++r)u=n.cj(n.Oi(r),u);u&&u.Fi()}return!0}function oFn(n,t,e){var i,r,c,a;return n.ej()?(r=null,c=n.fj(),i=n.Zi(1,a=n.Ui(t,n.oi(t,e)),e,t,c),n.bj()&&!(n.ni()&&a?Nfn(a,e):GI(a)===GI(e))?(a&&(r=n.dj(a,r)),(r=n.cj(e,r))?(r.Ei(i),r.Fi()):n.$i(i)):r?(r.Ei(i),r.Fi()):n.$i(i),a):(a=n.Ui(t,n.oi(t,e)),n.bj()&&!(n.ni()&&a?Nfn(a,e):GI(a)===GI(e))&&(r=null,a&&(r=n.dj(a,null)),(r=n.cj(e,r))&&r.Fi()),a)}function sFn(n,t){var i,r,c,a,u,o,s,h;if(n.e=t,n.f=BB(mMn(t,(Mrn(),hat)),230),XTn(t),n.d=e.Math.max(16*t.e.c.length+t.c.c.length,256),!qy(TD(mMn(t,(fRn(),Hct)))))for(h=n.e.e.c.length,o=new Wb(t.e);o.a<o.c.c.length;)(s=BB(n0(o),144).d).a=OG(n.f)*h,s.b=OG(n.f)*h;for(i=t.b,a=new Wb(t.c);a.a<a.c.c.length;)if(c=BB(n0(a),282),(r=BB(mMn(c,eat),19).a)>0){for(u=0;u<r;u++)WB(i,new hX(c));BCn(c)}}function hFn(n,t){var i,r,c,a,u;if(n.k==(uSn(),Sut)&&(i=jE(AV(BB(mMn(n,(hWn(),Plt)),15).Oc(),new aw(new ri))).sd((dM(),tit))?t:(Xyn(),TCt),hon(n,ult,i),i!=(Xyn(),ECt)))for(r=BB(mMn(n,dlt),17),u=Gy(MD(mMn(r,(HXn(),agt)))),a=0,i==jCt?a=n.o.b-e.Math.ceil(u/2):i==TCt&&(n.o.b-=Gy(MD(mMn(vW(n),jpt))),a=(n.o.b-e.Math.ceil(u))/2),c=new Wb(n.j);c.a<c.c.c.length;)BB(n0(c),11).n.b=a}function fFn(){fFn=O,JM(),TNt=new Rh,Pun(Gk(A$t,2),sVn,368,0,[Pun(Gk(A$t,1),jnt,592,0,[new UE(z7n)])]),Pun(Gk(A$t,2),sVn,368,0,[Pun(Gk(A$t,1),jnt,592,0,[new UE(U7n)])]),Pun(Gk(A$t,2),sVn,368,0,[Pun(Gk(A$t,1),jnt,592,0,[new UE(X7n)]),Pun(Gk(A$t,1),jnt,592,0,[new UE(U7n)])]),new $A("-1"),Pun(Gk(A$t,2),sVn,368,0,[Pun(Gk(A$t,1),jnt,592,0,[new UE("\\c+")])]),new $A("0"),new $A("0"),new $A("1"),new $A("0"),new $A(int)}function lFn(n){var t,e;return n.c&&n.c.kh()&&(e=BB(n.c,49),n.c=BB(tfn(n,e),138),n.c!=e&&(0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,9,2,e,n.c)),cL(n.Cb,399)?n.Db>>16==-15&&n.Cb.nh()&&$7(new k9(n.Cb,9,13,e,n.c,uvn(H7(BB(n.Cb,59)),n))):cL(n.Cb,88)&&n.Db>>16==-23&&n.Cb.nh()&&(cL(t=n.c,88)||(gWn(),t=d$t),cL(e,88)||(gWn(),e=d$t),$7(new k9(n.Cb,9,10,e,t,uvn(a4(BB(n.Cb,26)),n)))))),n.c}function bFn(n,t){var e,i,r,c,a,u,o,s;for(OTn(t,"Hypernodes processing",1),i=new Wb(n.b);i.a<i.c.c.length;)for(a=new Wb(BB(n0(i),29).a);a.a<a.c.c.length;)if(qy(TD(mMn(c=BB(n0(a),10),(HXn(),bgt))))&&c.j.c.length<=2){for(s=0,o=0,e=0,r=0,u=new Wb(c.j);u.a<u.c.c.length;)switch(BB(n0(u),11).j.g){case 1:++s;break;case 2:++o;break;case 3:++e;break;case 4:++r}0==s&&0==e&&jXn(n,c,r<=o)}HSn(t)}function wFn(n,t){var e,i,r,c,a,u,o,s,h;for(OTn(t,"Layer constraint edge reversal",1),a=new Wb(n.b);a.a<a.c.c.length;){for(c=BB(n0(a),29),h=-1,e=new Np,s=n2(c.a),r=0;r<s.length;r++)i=BB(mMn(s[r],(hWn(),ilt)),303),-1==h?i!=(z7(),Cft)&&(h=r):i==(z7(),Cft)&&(PZ(s[r],null),Qyn(s[r],h++,c)),i==(z7(),Sft)&&WB(e,s[r]);for(o=new Wb(e);o.a<o.c.c.length;)PZ(u=BB(n0(o),10),null),PZ(u,c)}HSn(t)}function dFn(n,t,e){var i,r,c,a,u,o,s,h;for(OTn(e,"Hyperedge merging",1),xAn(n,t),u=new M2(t.b,0);u.b<u.d.gc();)if(Px(u.b<u.d.gc()),0!=(s=BB(u.d.Xb(u.c=u.b++),29).a).c.length)for(i=null,r=null,c=null,a=null,o=0;o<s.c.length;o++)l1(o,s.c.length),(r=(i=BB(s.c[o],10)).k)==(uSn(),Put)&&a==Put&&(h=hHn(i,c)).a&&(rDn(i,c,h.b,h.c),l1(o,s.c.length),PE(s.c,o,1),--o,i=c,r=a),c=i,a=r;HSn(e)}function gFn(n,t){var e,i,r;i=0!=H$n(n.d,1),!qy(TD(mMn(t.j,(hWn(),Jft))))&&!qy(TD(mMn(t.j,Ilt)))||GI(mMn(t.j,(HXn(),Ldt)))===GI((mon(),Nvt))?t.c.Tf(t.e,i):i=qy(TD(mMn(t.j,Jft))),DNn(n,t,i,!0),qy(TD(mMn(t.j,Ilt)))&&hon(t.j,Ilt,(hN(),!1)),qy(TD(mMn(t.j,Jft)))&&(hon(t.j,Jft,(hN(),!1)),hon(t.j,Ilt,!0)),e=eKn(n,t);do{if($rn(n),0==e)return 0;r=e,DNn(n,t,i=!i,!1),e=eKn(n,t)}while(r>e);return r}function pFn(n,t){var e,i,r;i=0!=H$n(n.d,1),!qy(TD(mMn(t.j,(hWn(),Jft))))&&!qy(TD(mMn(t.j,Ilt)))||GI(mMn(t.j,(HXn(),Ldt)))===GI((mon(),Nvt))?t.c.Tf(t.e,i):i=qy(TD(mMn(t.j,Jft))),DNn(n,t,i,!0),qy(TD(mMn(t.j,Ilt)))&&hon(t.j,Ilt,(hN(),!1)),qy(TD(mMn(t.j,Jft)))&&(hon(t.j,Jft,(hN(),!1)),hon(t.j,Ilt,!0)),e=nCn(n,t);do{if($rn(n),0==e)return 0;r=e,DNn(n,t,i=!i,!1),e=nCn(n,t)}while(r>e);return r}function vFn(n,t,e){var i,r,c,a,u,o,s;if(t==e)return!0;if(t=bAn(n,t),e=bAn(n,e),i=qvn(t)){if((o=qvn(e))!=i)return!!o&&(a=i.Dj())==o.Dj()&&null!=a;if(!t.d&&(t.d=new $L(VAt,t,1)),r=(c=t.d).i,!e.d&&(e.d=new $L(VAt,e,1)),r==(s=e.d).i)for(u=0;u<r;++u)if(!vFn(n,BB(Wtn(c,u),87),BB(Wtn(s,u),87)))return!1;return!0}return t.e==e.e}function mFn(n,t,e,i){var r,c,a,u,o,s,h,f;if($xn(n.e,t)){for(f=axn(n.e.Tg(),t),c=BB(n.g,119),h=null,o=-1,u=-1,r=0,s=0;s<n.i;++s)a=c[s],f.rl(a.ak())&&(r==e&&(o=s),r==i&&(u=s,h=a.dd()),++r);if(-1==o)throw Hp(new Ay(u8n+e+o8n+r));if(-1==u)throw Hp(new Ay(s8n+i+o8n+r));return Iln(n,o,u),mA(n.e)&&Lv(n,LY(n,7,t,iln(i),h,e,!0)),h}throw Hp(new _y("The feature must be many-valued to support move"))}function yFn(n,t,e,i){var r,c,a,u,o;switch((o=new wA(t.n)).a+=t.o.a/2,o.b+=t.o.b/2,u=Gy(MD(mMn(t,(HXn(),tpt)))),c=n.f,a=n.d,r=n.c,BB(mMn(t,(hWn(),Qft)),61).g){case 1:o.a+=a.b+r.a-e/2,o.b=-i-u,t.n.b=-(a.d+u+r.b);break;case 2:o.a=c.a+a.b+a.c+u,o.b+=a.d+r.b-i/2,t.n.a=c.a+a.c+u-r.a;break;case 3:o.a+=a.b+r.a-e/2,o.b=c.b+a.d+a.a+u,t.n.b=c.b+a.a+u-r.b;break;case 4:o.a=-e-u,o.b+=a.d+r.b-i/2,t.n.a=-(a.b+u+r.a)}return o}function kFn(n){var t,e,i,r,c,a;return qan(i=new min,n),GI(mMn(i,(HXn(),Udt)))===GI((Ffn(),BPt))&&hon(i,Udt,Wln(i)),null==mMn(i,(C6(),TMt))&&(a=BB($Mn(n),160),hon(i,TMt,iO(a.We(TMt)))),hon(i,(hWn(),dlt),n),hon(i,Zft,new YK(t=BB(Vj(Tft),9),BB(SR(t,t.length),9),0)),r=Pzn((JJ(n)&&(GM(),new Dy(JJ(n))),GM(),new JN(JJ(n)?new Dy(JJ(n)):null,n)),FPt),c=BB(mMn(i,zgt),116),eZ(e=i.d,c),eZ(e,r),i}function jFn(n,t,e){var i,r;i=t.c.i,r=e.d.i,i.k==(uSn(),Put)?(hon(n,(hWn(),hlt),BB(mMn(i,hlt),11)),hon(n,flt,BB(mMn(i,flt),11)),hon(n,slt,TD(mMn(i,slt)))):i.k==Sut?(hon(n,(hWn(),hlt),BB(mMn(i,hlt),11)),hon(n,flt,BB(mMn(i,flt),11)),hon(n,slt,(hN(),!0))):r.k==Sut?(hon(n,(hWn(),hlt),BB(mMn(r,hlt),11)),hon(n,flt,BB(mMn(r,flt),11)),hon(n,slt,(hN(),!0))):(hon(n,(hWn(),hlt),t.c),hon(n,flt,e.d))}function EFn(n){var t,e,i,r,c,a,u;for(n.o=new Lp,i=new YT,a=new Wb(n.e.a);a.a<a.c.c.length;)1==kbn(c=BB(n0(a),121)).c.length&&r5(i,c,i.c.b,i.c);for(;0!=i.b;)0!=kbn(c=BB(0==i.b?null:(Px(0!=i.b),Atn(i,i.a.a)),121)).c.length&&(t=BB(xq(kbn(c),0),213),e=c.g.a.c.length>0,u=Nbn(t,c),KN(e?u.b:u.g,t),1==kbn(u).c.length&&r5(i,u,i.c.b,i.c),r=new rI(c,t),d3(n.o,r),y7(n.e.a,c))}function TFn(n,t){var i,r,c,a;return r=e.Math.abs(qz(n.b).a-qz(t.b).a),a=e.Math.abs(qz(n.b).b-qz(t.b).b),i=1,c=1,r>n.b.b/2+t.b.b/2&&(i=1-e.Math.min(e.Math.abs(n.b.c-(t.b.c+t.b.b)),e.Math.abs(n.b.c+n.b.b-t.b.c))/r),a>n.b.a/2+t.b.a/2&&(c=1-e.Math.min(e.Math.abs(n.b.d-(t.b.d+t.b.a)),e.Math.abs(n.b.d+n.b.a-t.b.d))/a),(1-e.Math.min(i,c))*e.Math.sqrt(r*r+a*a)}function MFn(n){var t,e,i;for(nUn(n,n.e,n.f,(dJ(),Lyt),!0,n.c,n.i),nUn(n,n.e,n.f,Lyt,!1,n.c,n.i),nUn(n,n.e,n.f,Nyt,!0,n.c,n.i),nUn(n,n.e,n.f,Nyt,!1,n.c,n.i),IFn(n,n.c,n.e,n.f,n.i),e=new M2(n.i,0);e.b<e.d.gc();)for(Px(e.b<e.d.gc()),t=BB(e.d.Xb(e.c=e.b++),128),i=new M2(n.i,e.b);i.b<i.d.gc();)Px(i.b<i.d.gc()),Nqn(t,BB(i.d.Xb(i.c=i.b++),128));IXn(n.i,BB(mMn(n.d,(hWn(),Slt)),230)),GGn(n.i)}function SFn(n,t){var e,i;if(null!=t)if(i=iyn(n)){if(0==(1&i.i))return nS(),!(e=BB(RX(mAt,i),55))||e.wj(t);if(i==$Nt)return zI(t);if(i==ANt)return cL(t,19);if(i==DNt)return cL(t,155);if(i==NNt)return cL(t,217);if(i==ONt)return cL(t,172);if(i==xNt)return UI(t);if(i==RNt)return cL(t,184);if(i==LNt)return cL(t,162)}else if(cL(t,56))return n.uk(BB(t,56));return!1}function PFn(){var n,t,e,i,r,c,a,u,o;for(PFn=O,WLt=x8(NNt,v6n,25,255,15,1),VLt=x8(ONt,WVn,25,64,15,1),t=0;t<255;t++)WLt[t]=-1;for(e=90;e>=65;e--)WLt[e]=e-65<<24>>24;for(i=122;i>=97;i--)WLt[i]=i-97+26<<24>>24;for(r=57;r>=48;r--)WLt[r]=r-48+52<<24>>24;for(WLt[43]=62,WLt[47]=63,c=0;c<=25;c++)VLt[c]=65+c&QVn;for(a=26,o=0;a<=51;++a,o++)VLt[a]=97+o&QVn;for(n=52,u=0;n<=61;++n,u++)VLt[n]=48+u&QVn;VLt[62]=43,VLt[63]=47}function CFn(n,t){var i,r,c,a,u,o,s,h,f,l,b;if(n.dc())return new Gj;for(s=0,f=0,r=n.Kc();r.Ob();)c=BB(r.Pb(),37).f,s=e.Math.max(s,c.a),f+=c.a*c.b;for(s=e.Math.max(s,e.Math.sqrt(f)*Gy(MD(mMn(BB(n.Kc().Pb(),37),(HXn(),Edt))))),l=0,b=0,o=0,i=t,u=n.Kc();u.Ob();)l+(h=(a=BB(u.Pb(),37)).f).a>s&&(l=0,b+=o+t,o=0),ZRn(a,l,b),i=e.Math.max(i,l+h.a),o=e.Math.max(o,h.b),l+=h.a+t;return new xC(i+t,b+o+t)}function IFn(n,t,e,i,r){var c,a,u,o,s,h,f;for(a=new Wb(t);a.a<a.c.c.length;){if(o=(c=BB(n0(a),17)).c,e.a._b(o))dJ(),s=Lyt;else{if(!i.a._b(o))throw Hp(new _y("Source port must be in one of the port sets."));dJ(),s=Nyt}if(h=c.d,e.a._b(h))dJ(),f=Lyt;else{if(!i.a._b(h))throw Hp(new _y("Target port must be in one of the port sets."));dJ(),f=Nyt}u=new tCn(c,s,f),VW(n.b,c,u),r.c[r.c.length]=u}}function OFn(n,t){var e,i,r,c,a,u,o;if(!WJ(n))throw Hp(new Fy(F5n));if(c=(i=WJ(n)).g,r=i.f,c<=0&&r<=0)return kUn(),PIt;switch(u=n.i,o=n.j,t.g){case 2:case 1:if(u<0)return kUn(),CIt;if(u+n.g>c)return kUn(),oIt;break;case 4:case 3:if(o<0)return kUn(),sIt;if(o+n.f>r)return kUn(),SIt}return(a=(u+n.g/2)/c)+(e=(o+n.f/2)/r)<=1&&a-e<=0?(kUn(),CIt):a+e>=1&&a-e>=0?(kUn(),oIt):e<.5?(kUn(),sIt):(kUn(),SIt)}function AFn(n,t,e,i,r){var c,a;if(c=rbn(e0(t[0],UQn),e0(i[0],UQn)),n[0]=dG(c),c=kz(c,32),e>=r){for(a=1;a<r;a++)c=rbn(c,rbn(e0(t[a],UQn),e0(i[a],UQn))),n[a]=dG(c),c=kz(c,32);for(;a<e;a++)c=rbn(c,e0(t[a],UQn)),n[a]=dG(c),c=kz(c,32)}else{for(a=1;a<e;a++)c=rbn(c,rbn(e0(t[a],UQn),e0(i[a],UQn))),n[a]=dG(c),c=kz(c,32);for(;a<r;a++)c=rbn(c,e0(i[a],UQn)),n[a]=dG(c),c=kz(c,32)}0!=Vhn(c,0)&&(n[a]=dG(c))}function $Fn(n){var t,e,i,r,c,a;if(wWn(),4!=n.e&&5!=n.e)throw Hp(new _y("Token#complementRanges(): must be RANGE: "+n.e));for(T$n(c=n),qHn(c),i=c.b.length+2,0==c.b[0]&&(i-=2),(e=c.b[c.b.length-1])==unt&&(i-=2),(r=new M0(4)).b=x8(ANt,hQn,25,i,15,1),a=0,c.b[0]>0&&(r.b[a++]=0,r.b[a++]=c.b[0]-1),t=1;t<c.b.length-2;t+=2)r.b[a++]=c.b[t]+1,r.b[a++]=c.b[t+1]-1;return e!=unt&&(r.b[a++]=e+1,r.b[a]=unt),r.a=!0,r}function LFn(n,t,e){var i,r,c,a,u,o,s,h;if(0==(i=e.gc()))return!1;if(n.ej())if(s=n.fj(),BTn(n,t,e),a=1==i?n.Zi(3,null,e.Kc().Pb(),t,s):n.Zi(5,null,e,t,s),n.bj()){for(u=i<100?null:new Fj(i),c=t+i,r=t;r<c;++r)h=n.g[r],u=n.cj(h,u),u=n.jj(h,u);u?(u.Ei(a),u.Fi()):n.$i(a)}else n.$i(a);else if(BTn(n,t,e),n.bj()){for(u=i<100?null:new Fj(i),c=t+i,r=t;r<c;++r)o=n.g[r],u=n.cj(o,u);u&&u.Fi()}return!0}function NFn(n,t,e,i){var r,c,a,u,o;for(a=new Wb(n.k);a.a<a.c.c.length;)r=BB(n0(a),129),i&&r.c!=(O6(),Tyt)||(o=r.b).g<0&&r.d>0&&(Vl(o,o.d-r.d),r.c==(O6(),Tyt)&&Xl(o,o.a-r.d),o.d<=0&&o.i>0&&r5(t,o,t.c.b,t.c));for(c=new Wb(n.f);c.a<c.c.c.length;)r=BB(n0(c),129),i&&r.c!=(O6(),Tyt)||(u=r.a).g<0&&r.d>0&&(Ql(u,u.i-r.d),r.c==(O6(),Tyt)&&Wl(u,u.b-r.d),u.i<=0&&u.d>0&&r5(e,u,e.c.b,e.c))}function xFn(n,t,e){var i,r,c,a,u,o,s,h;for(OTn(e,"Processor compute fanout",1),$U(n.b),$U(n.a),u=null,c=spn(t.b,0);!u&&c.b!=c.d.c;)qy(TD(mMn(s=BB(b3(c),86),(qqn(),dkt))))&&(u=s);for(r5(o=new YT,u,o.c.b,o.c),jUn(n,o),h=spn(t.b,0);h.b!=h.d.c;)a=SD(mMn(s=BB(b3(h),86),(qqn(),rkt))),r=null!=SJ(n.b,a)?BB(SJ(n.b,a),19).a:0,hon(s,ikt,iln(r)),i=1+(null!=SJ(n.a,a)?BB(SJ(n.a,a),19).a:0),hon(s,tkt,iln(i));HSn(e)}function DFn(n,t,e,i,r){var c,a,u,o,s,h,f,l,b;for(f=yEn(n,e),u=0;u<t;u++){for(yR(r,e),l=new Np,Px(i.b<i.d.gc()),b=BB(i.d.Xb(i.c=i.b++),407),s=f+u;s<n.b;s++)a=b,Px(i.b<i.d.gc()),WB(l,new Exn(a,b=BB(i.d.Xb(i.c=i.b++),407),e));for(h=f+u;h<n.b;h++)Px(i.b>0),i.a.Xb(i.c=--i.b),h>f+u&&fW(i);for(c=new Wb(l);c.a<c.c.c.length;)yR(i,BB(n0(c),407));if(u<t-1)for(o=f+u;o<n.b;o++)Px(i.b>0),i.a.Xb(i.c=--i.b)}}function RFn(){var n,t,e,i,r,c;if(wWn(),CNt)return CNt;for(sHn(n=new M0(4),ZUn(pnt,!0)),WGn(n,ZUn("M",!0)),WGn(n,ZUn("C",!0)),c=new M0(4),i=0;i<11;i++)Yxn(c,i,i);return sHn(t=new M0(4),ZUn("M",!0)),Yxn(t,4448,4607),Yxn(t,65438,65439),tqn(r=new r$(2),n),tqn(r,sNt),(e=new r$(2)).$l(gG(c,ZUn("L",!0))),e.$l(t),e=new h4(3,e),e=new UU(r,e),CNt=e}function KFn(n){var t,e;if(!Ycn(t=SD(ZAn(n,(sWn(),eSt))),n)&&!P8(n,mPt)&&(0!=(!n.a&&(n.a=new eU(UOt,n,10,11)),n.a).i||qy(TD(ZAn(n,SSt))))){if(null!=t&&0!=RMn(t).length)throw gzn(n,e=oO(oO(new lN("Layout algorithm '"),t),"' not found for ")),Hp(new rk(e.a));if(!Ycn(w1n,n))throw gzn(n,e=oO(oO(new lN("Unable to load default layout algorithm "),w1n)," for unconfigured node ")),Hp(new rk(e.a))}}function _Fn(n){var t,i,r,c,a,u,o,s,h,f,l,b,w;if(i=n.i,t=n.n,0==n.b)for(w=i.c+t.b,b=i.b-t.b-t.c,s=0,f=(u=n.a).length;s<f;++s)UG(c=u[s],w,b);else r=Wvn(n,!1),UG(n.a[0],i.c+t.b,r[0]),UG(n.a[2],i.c+i.b-t.c-r[2],r[2]),l=i.b-t.b-t.c,r[0]>0&&(l-=r[0]+n.c,r[0]+=n.c),r[2]>0&&(l-=r[2]+n.c),r[1]=e.Math.max(r[1],l),UG(n.a[1],i.c+t.b+r[0]-(r[1]-l)/2,r[1]);for(o=0,h=(a=n.a).length;o<h;++o)cL(c=a[o],326)&&BB(c,326).Te()}function FFn(n){var t,e,i,r,c,a,u,o,s,h,f;for((f=new aa).d=0,a=new Wb(n.b);a.a<a.c.c.length;)c=BB(n0(a),29),f.d+=c.a.c.length;for(i=0,r=0,f.a=x8(ANt,hQn,25,n.b.c.length,15,1),s=0,h=0,f.e=x8(ANt,hQn,25,f.d,15,1),e=new Wb(n.b);e.a<e.c.c.length;)for((t=BB(n0(e),29)).p=i++,f.a[t.p]=r++,h=0,o=new Wb(t.a);o.a<o.c.c.length;)(u=BB(n0(o),10)).p=s++,f.e[u.p]=h++;return f.c=new fg(f),f.b=sx(f.d),H_n(f,n),f.f=sx(f.d),q_n(f,n),f}function BFn(n,t){var i,r,c;for(c=BB(xq(n.n,n.n.c.length-1),211).d,n.p=e.Math.min(n.p,t.g),n.r=e.Math.max(n.r,c),n.g=e.Math.max(n.g,t.g+(1==n.b.c.length?0:n.i)),n.o=e.Math.min(n.o,t.f),n.e+=t.f+(1==n.b.c.length?0:n.i),n.f=e.Math.max(n.f,t.f),r=n.n.c.length>0?(n.n.c.length-1)*n.i:0,i=new Wb(n.n);i.a<i.c.c.length;)r+=BB(n0(i),211).a;n.d=r,n.a=n.e/n.b.c.length-n.i*((n.b.c.length-1)/n.b.c.length),yyn(n.j)}function HFn(n,t){var e,i,r,c,a,u,o,s,h;if(null==(s=TD(mMn(t,(fRn(),iat))))||(kW(s),s)){for(h=x8($Nt,ZYn,25,t.e.c.length,16,1),a=kOn(t),r=new YT,o=new Wb(t.e);o.a<o.c.c.length;)(e=Y$n(n,BB(n0(o),144),null,null,h,a))&&(qan(e,t),r5(r,e,r.c.b,r.c));if(r.b>1)for(i=spn(r,0);i.b!=i.d.c;)for(c=0,u=new Wb((e=BB(b3(i),231)).e);u.a<u.c.c.length;)BB(n0(u),144).b=c++;return r}return u6(Pun(Gk(Kct,1),tZn,231,0,[t]))}function qFn(n){var t,e,i,r,c;if(!n.g){if(c=new To,null==(t=P$t).a.zc(n,t)){for(e=new AL(kY(n));e.e!=e.i.gc();)pX(c,qFn(BB(kpn(e),26)));t.a.Bc(n),t.a.gc()}for(i=c.i,!n.s&&(n.s=new eU(FAt,n,21,17)),r=new AL(n.s);r.e!=r.i.gc();++i)ub(BB(kpn(r),449),i);pX(c,(!n.s&&(n.s=new eU(FAt,n,21,17)),n.s)),chn(c),n.g=new don(n,c),n.i=BB(c.g,247),null==n.i&&(n.i=I$t),n.p=null,P5(n).b&=-5}return n.g}function GFn(n){var t,i,r,c,a,u,o,s,h,f,l,b,w;if(r=n.i,i=n.n,0==n.b)t=Xvn(n,!1),XG(n.a[0],r.d+i.d,t[0]),XG(n.a[2],r.d+r.a-i.a-t[2],t[2]),l=r.a-i.d-i.a,t[0]>0&&(t[0]+=n.c,l-=t[0]),t[2]>0&&(l-=t[2]+n.c),t[1]=e.Math.max(t[1],l),XG(n.a[1],r.d+i.d+t[0]-(t[1]-l)/2,t[1]);else for(w=r.d+i.d,b=r.a-i.d-i.a,s=0,f=(u=n.a).length;s<f;++s)XG(c=u[s],w,b);for(o=0,h=(a=n.a).length;o<h;++o)cL(c=a[o],326)&&BB(c,326).Ue()}function zFn(n){var t,e,i,r,c,a,u,o,s;for(s=x8(ANt,hQn,25,n.b.c.length+1,15,1),o=new Rv,i=0,c=new Wb(n.b);c.a<c.c.c.length;){for(r=BB(n0(c),29),s[i++]=o.a.gc(),u=new Wb(r.a);u.a<u.c.c.length;)for(e=new oz(ZL(lbn(BB(n0(u),10)).a.Kc(),new h));dAn(e);)t=BB(U5(e),17),o.a.zc(t,o);for(a=new Wb(r.a);a.a<a.c.c.length;)for(e=new oz(ZL(fbn(BB(n0(a),10)).a.Kc(),new h));dAn(e);)t=BB(U5(e),17),o.a.Bc(t)}return s}function UFn(n,t,e,i){var r,c,a,u,o;if(o=axn(n.e.Tg(),t),r=BB(n.g,119),ZM(),BB(t,66).Oj()){for(a=0;a<n.i;++a)if(c=r[a],o.rl(c.ak())&&Nfn(c,e))return!0}else if(null!=e){for(u=0;u<n.i;++u)if(c=r[u],o.rl(c.ak())&&Nfn(e,c.dd()))return!0;if(i)for(a=0;a<n.i;++a)if(c=r[a],o.rl(c.ak())&&GI(e)===GI(hD(n,BB(c.dd(),56))))return!0}else for(a=0;a<n.i;++a)if(c=r[a],o.rl(c.ak())&&null==c.dd())return!1;return!1}function XFn(n,t,e,i){var r,c,a,u,o,s;if(s=axn(n.e.Tg(),t),a=BB(n.g,119),$xn(n.e,t)){if(t.hi()&&(c=pBn(n,t,i,cL(t,99)&&0!=(BB(t,18).Bb&BQn)))>=0&&c!=e)throw Hp(new _y(a8n));for(r=0,o=0;o<n.i;++o)if(u=a[o],s.rl(u.ak())){if(r==e)return BB(ovn(n,o,(ZM(),BB(t,66).Oj()?BB(i,72):Z3(t,i))),72);++r}throw Hp(new Ay(e9n+e+o8n+r))}for(o=0;o<n.i;++o)if(u=a[o],s.rl(u.ak()))return ZM(),BB(t,66).Oj()?u:u.dd();return null}function WFn(n,t,i,r){var c,a,u,o;for(o=i,u=new Wb(t.a);u.a<u.c.c.length;){if(a=BB(n0(u),221),c=BB(a.b,65),Ibn(n.b.c,c.b.c+c.b.b)<=0&&Ibn(c.b.c,n.b.c+n.b.b)<=0&&Ibn(n.b.d,c.b.d+c.b.a)<=0&&Ibn(c.b.d,n.b.d+n.b.a)<=0){if(0==Ibn(c.b.c,n.b.c+n.b.b)&&r.a<0||0==Ibn(c.b.c+c.b.b,n.b.c)&&r.a>0||0==Ibn(c.b.d,n.b.d+n.b.a)&&r.b<0||0==Ibn(c.b.d+c.b.a,n.b.d)&&r.b>0){o=0;break}}else o=e.Math.min(o,HCn(n,c,r));o=e.Math.min(o,WFn(n,a,o,r))}return o}function VFn(n,t){var e,i,r,c,a,u;if(n.b<2)throw Hp(new _y("The vector chain must contain at least a source and a target point."));for(Px(0!=n.b),CA(t,(i=BB(n.a.a.c,8)).a,i.b),u=new cx((!t.a&&(t.a=new $L(xOt,t,5)),t.a)),c=spn(n,1);c.a<n.b-1;)a=BB(b3(c),8),u.e!=u.i.gc()?e=BB(kpn(u),469):(tE(),odn(u,e=new ro)),TA(e,a.a,a.b);for(;u.e!=u.i.gc();)kpn(u),Qjn(u);Px(0!=n.b),PA(t,(r=BB(n.c.b.c,8)).a,r.b)}function QFn(n,t){var e,i,r,c,a,u,o,s;for(e=0,i=new Wb((l1(0,n.c.length),BB(n.c[0],101)).g.b.j);i.a<i.c.c.length;)BB(n0(i),11).p=e++;for(t==(kUn(),sIt)?m$(n,new nc):m$(n,new tc),a=0,s=n.c.length-1;a<s;)l1(a,n.c.length),c=BB(n.c[a],101),l1(s,n.c.length),o=BB(n.c[s],101),r=t==sIt?c.c:c.a,u=t==sIt?o.a:o.c,bU(c,t,(Oun(),yst),r),bU(o,t,mst,u),++a,--s;a==s&&bU((l1(a,n.c.length),BB(n.c[a],101)),t,(Oun(),vst),null)}function YFn(n,t,e){var i,r,c,a,u,o,s,h,f,l;return h=n.a.i+n.a.g/2,f=n.a.i+n.a.g/2,a=new xC(t.i+t.g/2,t.j+t.f/2),(o=BB(ZAn(t,(sWn(),gPt)),8)).a=o.a+h,o.b=o.b+f,r=(a.b-o.b)/(a.a-o.a),i=a.b-r*a.a,u=new xC(e.i+e.g/2,e.j+e.f/2),(s=BB(ZAn(e,gPt),8)).a=s.a+h,s.b=s.b+f,c=(u.b-s.b)/(u.a-s.a),l=(i-(u.b-c*u.a))/(c-r),!(o.a<l&&a.a<l||l<o.a&&l<a.a||s.a<l&&u.a<l||l<s.a&&l<u.a)}function JFn(n,t){var e,i,r,c,a,u;if(!(a=BB(RX(n.c,t),183)))throw Hp(new ek("Edge did not exist in input."));return i=Qdn(a),!WE((!t.a&&(t.a=new eU(FOt,t,6,6)),t.a))&&(e=new MB(n,i,u=new Cl),wO((!t.a&&(t.a=new eU(FOt,t,6,6)),t.a),e),rtn(a,x6n,u)),P8(t,(sWn(),OSt))&&!(!(r=BB(ZAn(t,OSt),74))||pW(r))&&(e5(r,new Qg(c=new Cl)),rtn(a,"junctionPoints",c)),AH(a,"container",XJ(t).k),null}function ZFn(n,t,e){var i,r,c,a,u,o;this.a=n,this.b=t,this.c=e,this.e=u6(Pun(Gk(uit,1),HWn,168,0,[new xS(n,t),new xS(t,e),new xS(e,n)])),this.f=u6(Pun(Gk(PMt,1),sVn,8,0,[n,t,e])),this.d=(i=XR(B$(this.b),this.a),r=XR(B$(this.c),this.a),c=XR(B$(this.c),this.b),a=i.a*(this.a.a+this.b.a)+i.b*(this.a.b+this.b.b),u=r.a*(this.a.a+this.c.a)+r.b*(this.a.b+this.c.b),o=2*(i.a*c.b-i.b*c.a),new xC((r.b*a-i.b*u)/o,(i.a*u-r.a*a)/o))}function nBn(n,t,e,i){var r,c,a,u,o,s,h,f,l;if(f=new GX(n.p),rtn(t,t8n,f),e&&!(n.f?rY(n.f):null).a.dc())for(rtn(t,"logs",s=new Cl),u=0,l=new qb((n.f?rY(n.f):null).b.Kc());l.b.Ob();)h=new GX(SD(l.b.Pb())),dnn(s,u),r4(s,u,h),++u;if(i&&rtn(t,"executionTime",new Sl(n.q)),!rY(n.a).a.dc())for(a=new Cl,rtn(t,A6n,a),u=0,c=new qb(rY(n.a).b.Kc());c.b.Ob();)r=BB(c.b.Pb(),1949),o=new py,dnn(a,u),r4(a,u,o),nBn(r,o,e,i),++u}function tBn(n,t){var e,i,r,c,a,u;for(c=n.c,a=n.d,SZ(n,null),MZ(n,null),t&&qy(TD(mMn(a,(hWn(),tlt))))?SZ(n,R_n(a.i,(ain(),qvt),(kUn(),oIt))):SZ(n,a),t&&qy(TD(mMn(c,(hWn(),klt))))?MZ(n,R_n(c.i,(ain(),Hvt),(kUn(),CIt))):MZ(n,c),i=new Wb(n.b);i.a<i.c.c.length;)e=BB(n0(i),70),(r=BB(mMn(e,(HXn(),Ydt)),272))==(Rtn(),XPt)?hon(e,Ydt,UPt):r==UPt&&hon(e,Ydt,XPt);u=qy(TD(mMn(n,(hWn(),Clt)))),hon(n,Clt,(hN(),!u)),n.a=Jon(n.a)}function eBn(n,t,i){var r,c,a,u,o;for(r=0,a=new AL((!n.a&&(n.a=new eU(UOt,n,10,11)),n.a));a.e!=a.i.gc();)u="",0==(!(c=BB(kpn(a),33)).n&&(c.n=new eU(zOt,c,1,7)),c.n).i||(u=BB(Wtn((!c.n&&(c.n=new eU(zOt,c,1,7)),c.n),0),137).a),qan(o=new qX(u),c),hon(o,(Mrn(),sat),c),o.b=r++,o.d.a=c.i+c.g/2,o.d.b=c.j+c.f/2,o.e.a=e.Math.max(c.g,1),o.e.b=e.Math.max(c.f,1),WB(t.e,o),jCn(i.f,c,o),BB(ZAn(c,(fRn(),Yct)),98),QEn()}function iBn(n,t){var i,r,c,a,u,o,s,h,f,l,b;i=AN(new qv,n.f),o=n.i[t.c.i.p],l=n.i[t.d.i.p],u=t.c,f=t.d,a=u.a.b,h=f.a.b,o.b||(a+=u.n.b),l.b||(h+=f.n.b),s=CJ(e.Math.max(0,a-h)),c=CJ(e.Math.max(0,h-a)),b=e.Math.max(1,BB(mMn(t,(HXn(),bpt)),19).a)*X3(t.c.i.k,t.d.i.k),r=new nC(UNn(aM(cM(rM(uM(new Hv,b),c),i),BB(RX(n.k,t.c),121))),UNn(aM(cM(rM(uM(new Hv,b),s),i),BB(RX(n.k,t.d),121)))),n.c[t.p]=r}function rBn(n,t,e,i){var r,c,a,u,o,s;for(a=new uGn(n,t,e),o=new M2(i,0),r=!1;o.b<o.d.gc();)Px(o.b<o.d.gc()),(u=BB(o.d.Xb(o.c=o.b++),233))==t||u==e?fW(o):!r&&Gy(lL(u.g,u.d[0]).a)>Gy(lL(a.g,a.d[0]).a)?(Px(o.b>0),o.a.Xb(o.c=--o.b),yR(o,a),r=!0):u.e&&u.e.gc()>0&&(c=(!u.e&&(u.e=new Np),u.e).Mc(t),s=(!u.e&&(u.e=new Np),u.e).Mc(e),(c||s)&&((!u.e&&(u.e=new Np),u.e).Fc(a),++a.c));r||(i.c[i.c.length]=a)}function cBn(n){var t,e,i;if(vA(BB(mMn(n,(HXn(),ept)),98)))for(e=new Wb(n.j);e.a<e.c.c.length;)(t=BB(n0(e),11)).j==(kUn(),PIt)&&((i=BB(mMn(t,(hWn(),Elt)),10))?qCn(t,BB(mMn(i,Qft),61)):t.e.c.length-t.g.c.length<0?qCn(t,oIt):qCn(t,CIt));else{for(e=new Wb(n.j);e.a<e.c.c.length;)t=BB(n0(e),11),(i=BB(mMn(t,(hWn(),Elt)),10))?qCn(t,BB(mMn(i,Qft),61)):t.e.c.length-t.g.c.length<0?qCn(t,(kUn(),oIt)):qCn(t,(kUn(),CIt));hon(n,ept,(QEn(),VCt))}}function aBn(n){var t,e;switch(n){case 91:case 93:case 45:case 94:case 44:case 92:e="\\"+String.fromCharCode(n&QVn);break;case 12:e="\\f";break;case 10:e="\\n";break;case 13:e="\\r";break;case 9:e="\\t";break;case 27:e="\\e";break;default:e=n<32?"\\x"+fx(t="0"+(n>>>0).toString(16),t.length-2,t.length):n>=BQn?"\\v"+fx(t="0"+(n>>>0).toString(16),t.length-6,t.length):""+String.fromCharCode(n&QVn)}return e}function uBn(n,t){var e,i,r,c,a,u,o,s,h,f;if(a=n.e,0==(o=t.e))return n;if(0==a)return 0==t.e?t:new lU(-t.e,t.d,t.a);if((c=n.d)+(u=t.d)==2)return e=e0(n.a[0],UQn),i=e0(t.a[0],UQn),a<0&&(e=j7(e)),o<0&&(i=j7(i)),npn(ibn(e,i));if(-1==(r=c!=u?c>u?1:-1:Msn(n.a,t.a,c)))f=-o,h=a==o?d6(t.a,u,n.a,c):N8(t.a,u,n.a,c);else if(f=a,a==o){if(0==r)return ODn(),eet;h=d6(n.a,c,t.a,u)}else h=N8(n.a,c,t.a,u);return X0(s=new lU(f,h.length,h)),s}function oBn(n){var t,e,i,r,c,a;for(this.e=new Np,this.a=new Np,e=n.b-1;e<3;e++)Kx(n,0,BB(Dpn(n,0),8));if(n.b<4)throw Hp(new _y("At (least dimension + 1) control points are necessary!"));for(this.b=3,this.d=!0,this.c=!1,I$n(this,n.b+this.b-1),a=new Np,c=new Wb(this.e),t=0;t<this.b-1;t++)WB(a,MD(n0(c)));for(r=spn(n,0);r.b!=r.d.c;)i=BB(b3(r),8),WB(a,MD(n0(c))),WB(this.a,new wJ(i,a)),l1(0,a.c.length),a.c.splice(0,1)}function sBn(n,t){var e,i,r,c,a,u,o;for(r=new Wb(n.b);r.a<r.c.c.length;)for(a=new Wb(BB(n0(r),29).a);a.a<a.c.c.length;)for((c=BB(n0(a),10)).k==(uSn(),Sut)&&(u=BB(U5(new oz(ZL(fbn(c).a.Kc(),new h))),17),o=BB(U5(new oz(ZL(lbn(c).a.Kc(),new h))),17),hFn(c,qy(TD(mMn(u,(hWn(),Clt))))&&qy(TD(mMn(o,Clt)))?Xun(t):t)),i=new oz(ZL(lbn(c).a.Kc(),new h));dAn(i);)vun(e=BB(U5(i),17),qy(TD(mMn(e,(hWn(),Clt))))?Xun(t):t)}function hBn(n,t,e,i,r){var c,a;if(e.f>=t.o&&e.f<=t.f||.5*t.a<=e.f&&1.5*t.a>=e.f){if((c=BB(xq(t.n,t.n.c.length-1),211)).e+c.d+e.g+r<=i&&(BB(xq(t.n,t.n.c.length-1),211).f-n.f+e.f<=n.b||1==n.a.c.length))return ybn(t,e),!0;if(t.s+e.g<=i&&(t.t+t.d+e.f+r<=n.b||1==n.a.c.length))return WB(t.b,e),a=BB(xq(t.n,t.n.c.length-1),211),WB(t.n,new RJ(t.s,a.f+a.a+t.i,t.i)),smn(BB(xq(t.n,t.n.c.length-1),211),e),BFn(t,e),!0}return!1}function fBn(n,t,e){var i,r,c,a;return n.ej()?(r=null,c=n.fj(),i=n.Zi(1,a=onn(n,t,e),e,t,c),n.bj()&&!(n.ni()&&null!=a?Nfn(a,e):GI(a)===GI(e))?(null!=a&&(r=n.dj(a,r)),r=n.cj(e,r),n.ij()&&(r=n.lj(a,e,r)),r?(r.Ei(i),r.Fi()):n.$i(i)):(n.ij()&&(r=n.lj(a,e,r)),r?(r.Ei(i),r.Fi()):n.$i(i)),a):(a=onn(n,t,e),n.bj()&&!(n.ni()&&null!=a?Nfn(a,e):GI(a)===GI(e))&&(r=null,null!=a&&(r=n.dj(a,null)),(r=n.cj(e,r))&&r.Fi()),a)}function lBn(n,t){var i,r,c,a,u,o,s;t%=24,n.q.getHours()!=t&&((i=new e.Date(n.q.getTime())).setDate(i.getDate()+1),(u=n.q.getTimezoneOffset()-i.getTimezoneOffset())>0&&(o=u/60|0,s=u%60,r=n.q.getDate(),n.q.getHours()+o>=24&&++r,c=new e.Date(n.q.getFullYear(),n.q.getMonth(),r,t+o,n.q.getMinutes()+s,n.q.getSeconds(),n.q.getMilliseconds()),n.q.setTime(c.getTime()))),a=n.q.getTime(),n.q.setTime(a+36e5),n.q.getHours()!=t&&n.q.setTime(a)}function bBn(n,t){var e,i,r,c;if(OTn(t,"Path-Like Graph Wrapping",1),0!=n.b.c.length)if(null==(r=new MAn(n)).i&&(r.i=Wrn(r,new kc)),e=Gy(r.i)*r.f/(null==r.i&&(r.i=Wrn(r,new kc)),Gy(r.i)),r.b>e)HSn(t);else{switch(BB(mMn(n,(HXn(),Bpt)),337).g){case 2:c=new Tc;break;case 0:c=new wc;break;default:c=new Mc}if(i=c.Vf(n,r),!c.Wf())switch(BB(mMn(n,Xpt),338).g){case 2:i=XCn(r,i);break;case 1:i=KTn(r,i)}iqn(n,r,i),HSn(t)}else HSn(t)}function wBn(n,t){var e,i,r,c;if(f1(n.d,n.e),n.c.a.$b(),0!=Gy(MD(mMn(t.j,(HXn(),Idt))))||0!=Gy(MD(mMn(t.j,Idt))))for(e=ZJn,GI(mMn(t.j,Ldt))!==GI((mon(),Nvt))&&hon(t.j,(hWn(),Jft),(hN(),!0)),c=BB(mMn(t.j,xpt),19).a,r=0;r<c&&!((i=gFn(n,t))<e&&(e=i,Lrn(n),0==e));r++);else for(e=DWn,GI(mMn(t.j,Ldt))!==GI((mon(),Nvt))&&hon(t.j,(hWn(),Jft),(hN(),!0)),c=BB(mMn(t.j,xpt),19).a,r=0;r<c&&!((i=pFn(n,t))<e&&(e=i,Lrn(n),0==e));r++);}function dBn(n,t){var e,i,r,c,a,u;for(r=new Np,c=0,e=0,a=0;c<t.c.length-1&&e<n.gc();){for(i=BB(n.Xb(e),19).a+a;(l1(c+1,t.c.length),BB(t.c[c+1],19)).a<i;)++c;for(u=0,i-(l1(c,t.c.length),BB(t.c[c],19)).a>(l1(c+1,t.c.length),BB(t.c[c+1],19)).a-i&&++u,WB(r,(l1(c+u,t.c.length),BB(t.c[c+u],19))),a+=(l1(c+u,t.c.length),BB(t.c[c+u],19)).a-i,++e;e<n.gc()&&BB(n.Xb(e),19).a+a<=(l1(c+u,t.c.length),BB(t.c[c+u],19)).a;)++e;c+=1+u}return r}function gBn(n){var t,e,i,r,c;if(!n.d){if(c=new Po,null==(t=P$t).a.zc(n,t)){for(e=new AL(kY(n));e.e!=e.i.gc();)pX(c,gBn(BB(kpn(e),26)));t.a.Bc(n),t.a.gc()}for(r=c.i,!n.q&&(n.q=new eU(QAt,n,11,10)),i=new AL(n.q);i.e!=i.i.gc();++r)BB(kpn(i),399);pX(c,(!n.q&&(n.q=new eU(QAt,n,11,10)),n.q)),chn(c),n.d=new NO((BB(Wtn(QQ((QX(),t$t).o),9),18),c.i),c.g),n.e=BB(c.g,673),null==n.e&&(n.e=C$t),P5(n).b&=-17}return n.d}function pBn(n,t,e,i){var r,c,a,u,o,s;if(s=axn(n.e.Tg(),t),o=0,r=BB(n.g,119),ZM(),BB(t,66).Oj()){for(a=0;a<n.i;++a)if(c=r[a],s.rl(c.ak())){if(Nfn(c,e))return o;++o}}else if(null!=e){for(u=0;u<n.i;++u)if(c=r[u],s.rl(c.ak())){if(Nfn(e,c.dd()))return o;++o}if(i)for(o=0,a=0;a<n.i;++a)if(c=r[a],s.rl(c.ak())){if(GI(e)===GI(hD(n,BB(c.dd(),56))))return o;++o}}else for(a=0;a<n.i;++a)if(c=r[a],s.rl(c.ak())){if(null==c.dd())return o;++o}return-1}function vBn(n,t,e,i,r){var c,a,u,o,s,h,f,l,b;for(SQ(),m$(n,new zu),a=zB(n),b=new Np,l=new Np,u=null,o=0;0!=a.b;)c=BB(0==a.b?null:(Px(0!=a.b),Atn(a,a.a.a)),157),!u||iG(u)*eG(u)/2<iG(c)*eG(c)?(u=c,b.c[b.c.length]=c):(o+=iG(c)*eG(c),l.c[l.c.length]=c,l.c.length>1&&(o>iG(u)*eG(u)/2||0==a.b)&&(f=new Gtn(l),h=iG(u)/eG(u),s=yXn(f,t,new bm,e,i,r,h),UR(kO(f.e),s),u=f,b.c[b.c.length]=f,o=0,l.c=x8(Ant,HWn,1,0,5,1)));return gun(b,l),b}function mBn(n,t,e,i){var r,c,a,u,o,s,h,f,l,b,w,d;if(e.mh(t)&&(h=(b=t)?BB(i,49).xh(b):null))if(d=e.bh(t,n.a),(w=t.t)>1||-1==w)if(f=BB(d,69),l=BB(h,69),f.dc())l.$b();else for(a=!!Cvn(t),c=0,u=n.a?f.Kc():f.Zh();u.Ob();)s=BB(u.Pb(),56),(r=BB(lnn(n,s),56))?(a?-1==(o=l.Xc(r))?l.Xh(c,r):c!=o&&l.ji(c,r):l.Xh(c,r),++c):n.b&&!a&&(l.Xh(c,s),++c);else null==d?h.Wb(null):null==(r=lnn(n,d))?n.b&&!Cvn(t)&&h.Wb(d):h.Wb(r)}function yBn(n,t){var i,r,c,a,u,o,s,f;for(i=new Le,c=new oz(ZL(fbn(t).a.Kc(),new h));dAn(c);)if(!b5(r=BB(U5(c),17))&&eTn(o=r.c.i,Xut)){if(-1==(f=VDn(n,o,Xut,Uut)))continue;i.b=e.Math.max(i.b,f),!i.a&&(i.a=new Np),WB(i.a,o)}for(u=new oz(ZL(lbn(t).a.Kc(),new h));dAn(u);)if(!b5(a=BB(U5(u),17))&&eTn(s=a.d.i,Uut)){if(-1==(f=VDn(n,s,Uut,Xut)))continue;i.d=e.Math.max(i.d,f),!i.c&&(i.c=new Np),WB(i.c,s)}return i}function kBn(n){var t,e,i,r;if($On(),t=CJ(n),n<uet.length)return uet[t];if(n<=50)return uOn((ODn(),net),t);if(n<=VVn)return G5(uOn(aet[1],t),t);if(n>1e6)throw Hp(new Oy("power of ten too big"));if(n<=DWn)return G5(uOn(aet[1],t),t);for(r=i=uOn(aet[1],DWn),e=fan(n-DWn),t=CJ(n%DWn);Vhn(e,DWn)>0;)r=Nnn(r,i),e=ibn(e,DWn);for(r=G5(r=Nnn(r,uOn(aet[1],t)),DWn),e=fan(n-DWn);Vhn(e,DWn)>0;)r=G5(r,DWn),e=ibn(e,DWn);return r=G5(r,t)}function jBn(n,t){var e,i,r,c,a,u,o,s;for(OTn(t,"Hierarchical port dummy size processing",1),u=new Np,s=new Np,e=2*Gy(MD(mMn(n,(HXn(),kpt)))),r=new Wb(n.b);r.a<r.c.c.length;){for(i=BB(n0(r),29),u.c=x8(Ant,HWn,1,0,5,1),s.c=x8(Ant,HWn,1,0,5,1),a=new Wb(i.a);a.a<a.c.c.length;)(c=BB(n0(a),10)).k==(uSn(),Mut)&&((o=BB(mMn(c,(hWn(),Qft)),61))==(kUn(),sIt)?u.c[u.c.length]=c:o==SIt&&(s.c[s.c.length]=c));HOn(u,!0,e),HOn(s,!1,e)}HSn(t)}function EBn(n,t){var e,i,r,c,a;OTn(t,"Layer constraint postprocessing",1),0!=(a=n.b).c.length&&(l1(0,a.c.length),_Kn(n,BB(a.c[0],29),BB(xq(a,a.c.length-1),29),e=new HX(n),r=new HX(n)),0==e.a.c.length||(LZ(0,a.c.length),MS(a.c,0,e)),0==r.a.c.length||(a.c[a.c.length]=r)),Lx(n,(hWn(),nlt))&&(yDn(n,i=new HX(n),c=new HX(n)),0==i.a.c.length||(LZ(0,a.c.length),MS(a.c,0,i)),0==c.a.c.length||(a.c[a.c.length]=c)),HSn(t)}function TBn(n){var t,e,i,r,c,a,u,o;for(a=new Wb(n.a);a.a<a.c.c.length;)if((c=BB(n0(a),10)).k==(uSn(),Mut)&&((r=BB(mMn(c,(hWn(),Qft)),61))==(kUn(),oIt)||r==CIt))for(i=new oz(ZL(hbn(c).a.Kc(),new h));dAn(i);)0!=(t=(e=BB(U5(i),17)).a).b&&((u=e.c).i==c&&(Px(0!=t.b),BB(t.a.a.c,8).b=Aon(Pun(Gk(PMt,1),sVn,8,0,[u.i.n,u.n,u.a])).b),(o=e.d).i==c&&(Px(0!=t.b),BB(t.c.b.c,8).b=Aon(Pun(Gk(PMt,1),sVn,8,0,[o.i.n,o.n,o.a])).b))}function MBn(n,t){var e,i,r,c,a,u,o;for(OTn(t,"Sort By Input Model "+mMn(n,(HXn(),Ldt)),1),r=0,i=new Wb(n.b);i.a<i.c.c.length;){for(e=BB(n0(i),29),o=0==r?0:r-1,u=BB(xq(n.b,o),29),a=new Wb(e.a);a.a<a.c.c.length;)GI(mMn(c=BB(n0(a),10),ept))!==GI((QEn(),UCt))&&GI(mMn(c,ept))!==GI(XCt)&&(SQ(),m$(c.j,new O7(u,okn(c))),OH(t,"Node "+c+" ports: "+c.j));SQ(),m$(e.a,new Grn(u,BB(mMn(n,Ldt),339),BB(mMn(n,Adt),378))),OH(t,"Layer "+r+": "+e),++r}HSn(t)}function SBn(n,t){var e,i,r;if(r=kFn(t),JT(new Rq(null,(!t.c&&(t.c=new eU(XOt,t,9,9)),new w1(t.c,16))),new Uw(r)),uzn(t,i=BB(mMn(r,(hWn(),Zft)),21)),i.Hc((bDn(),lft)))for(e=new AL((!t.c&&(t.c=new eU(XOt,t,9,9)),t.c));e.e!=e.i.gc();)Qzn(n,t,r,BB(kpn(e),118));return 0!=BB(ZAn(t,(HXn(),Fgt)),174).gc()&&mDn(t,r),qy(TD(mMn(r,Xgt)))&&i.Fc(pft),Lx(r,gpt)&&My(new uwn(Gy(MD(mMn(r,gpt)))),r),GI(ZAn(t,sgt))===GI((ufn(),pCt))?cWn(n,t,r):eXn(n,t,r),r}function PBn(n,t,i,r){var c,a,u;if(this.j=new Np,this.k=new Np,this.b=new Np,this.c=new Np,this.e=new bA,this.i=new km,this.f=new Dp,this.d=new Np,this.g=new Np,WB(this.b,n),WB(this.b,t),this.e.c=e.Math.min(n.a,t.a),this.e.d=e.Math.min(n.b,t.b),this.e.b=e.Math.abs(n.a-t.a),this.e.a=e.Math.abs(n.b-t.b),c=BB(mMn(r,(HXn(),vgt)),74))for(u=spn(c,0);u.b!=u.d.c;)aen((a=BB(b3(u),8)).a,n.a)&&DH(this.i,a);i&&WB(this.j,i),WB(this.k,r)}function CBn(n,t,e){var i,r,c,a,u,o,s,h,f,l;for(h=new Xz(new xw(e)),vU(u=x8($Nt,ZYn,25,n.f.e.c.length,16,1),u.length),e[t.b]=0,s=new Wb(n.f.e);s.a<s.c.c.length;)(o=BB(n0(s),144)).b!=t.b&&(e[o.b]=DWn),F8(eMn(h,o));for(;0!=h.b.c.length;)for(u[(f=BB(mnn(h),144)).b]=!0,c=vN(new mT(n.b,f),0);c.c;)u[(l=$mn(r=BB(EZ(c),282),f)).b]||(a=Lx(r,(rkn(),pat))?Gy(MD(mMn(r,pat))):n.c,(i=e[f.b]+a)<e[l.b]&&(e[l.b]=i,srn(h,l),F8(eMn(h,l))))}function IBn(n,t,e){var i,r,c,a,u,o,s,h,f;for(r=!0,a=new Wb(n.b);a.a<a.c.c.length;){for(c=BB(n0(a),29),s=KQn,h=null,o=new Wb(c.a);o.a<o.c.c.length;){if(u=BB(n0(o),10),f=Gy(t.p[u.p])+Gy(t.d[u.p])-u.d.d,i=Gy(t.p[u.p])+Gy(t.d[u.p])+u.o.b+u.d.a,!(f>s&&i>s)){r=!1,e.n&&OH(e,"bk node placement breaks on "+u+" which should have been after "+h);break}h=u,s=Gy(t.p[u.p])+Gy(t.d[u.p])+u.o.b+u.d.a}if(!r)break}return e.n&&OH(e,t+" is feasible: "+r),r}function OBn(n,t,e,i){var r,c,a,u,o,s,h;for(u=-1,h=new Wb(n);h.a<h.c.c.length;)(s=BB(n0(h),112)).g=u--,a=r=dG(E2(NV(AV(new Rq(null,new w1(s.f,16)),new sa),new ha)).d),o=c=dG(E2(NV(AV(new Rq(null,new w1(s.k,16)),new fa),new la)).d),i||(a=dG(E2(NV(new Rq(null,new w1(s.f,16)),new ba)).d),o=dG(E2(NV(new Rq(null,new w1(s.k,16)),new wa)).d)),s.d=a,s.a=r,s.i=o,s.b=c,0==o?r5(e,s,e.c.b,e.c):0==a&&r5(t,s,t.c.b,t.c)}function ABn(n,t,e,i){var r,c,a,u,o,s,h;if(e.d.i!=t.i){for(Bl(r=new $vn(n),(uSn(),Put)),hon(r,(hWn(),dlt),e),hon(r,(HXn(),ept),(QEn(),XCt)),i.c[i.c.length]=r,CZ(a=new CSn,r),qCn(a,(kUn(),CIt)),CZ(u=new CSn,r),qCn(u,oIt),h=e.d,MZ(e,a),qan(c=new wY,e),hon(c,vgt,null),SZ(c,u),MZ(c,h),s=new M2(e.b,0);s.b<s.d.gc();)Px(s.b<s.d.gc()),GI(mMn(o=BB(s.d.Xb(s.c=s.b++),70),Ydt))===GI((Rtn(),UPt))&&(hon(o,Uft,e),fW(s),WB(c.b,o));yAn(r,a,u)}}function $Bn(n,t,e,i){var r,c,a,u,o,s;if(e.c.i!=t.i)for(Bl(r=new $vn(n),(uSn(),Put)),hon(r,(hWn(),dlt),e),hon(r,(HXn(),ept),(QEn(),XCt)),i.c[i.c.length]=r,CZ(a=new CSn,r),qCn(a,(kUn(),CIt)),CZ(u=new CSn,r),qCn(u,oIt),MZ(e,a),qan(c=new wY,e),hon(c,vgt,null),SZ(c,u),MZ(c,t),yAn(r,a,u),s=new M2(e.b,0);s.b<s.d.gc();)Px(s.b<s.d.gc()),o=BB(s.d.Xb(s.c=s.b++),70),BB(mMn(o,Ydt),272)==(Rtn(),UPt)&&(Lx(o,Uft)||hon(o,Uft,e),fW(s),WB(c.b,o))}function LBn(n,t,i,r,c){var a,u,o,s,h,f,l,b,w,d,g,p,v,m;for(l=new Np,p=S4(r),g=t*n.a,w=0,a=new Rv,u=new Rv,o=new Np,v=0,m=0,b=0,d=0,h=0,f=0;0!=p.a.gc();)(s=tbn(p,c,u))&&(p.a.Bc(s),o.c[o.c.length]=s,a.a.zc(s,a),w=n.f[s.p],v+=n.e[s.p]-w*n.b,m+=n.c[s.p]*n.b,f+=w*n.b,d+=n.e[s.p]),(!s||0==p.a.gc()||v>=g&&n.e[s.p]>w*n.b||m>=i*g)&&(l.c[l.c.length]=o,o=new Np,Frn(u,a),a.a.$b(),h-=f,b=e.Math.max(b,h*n.b+d),h+=m,v=m,m=0,f=0,d=0);return new rI(b,l)}function NBn(n){var t,e,i,r,c,a,u,o,s,h,f,l;for(e=new Kb(new Ob(n.c.b).a.vc().Kc());e.a.Ob();)u=BB(e.a.Pb(),42),null==(r=(t=BB(u.dd(),149)).a)&&(r=""),!(i=_D(n.c,r))&&0==r.length&&(i=yfn(n)),i&&!ywn(i.c,t,!1)&&DH(i.c,t);for(a=spn(n.a,0);a.b!=a.d.c;)c=BB(b3(a),478),s=T5(n.c,c.a),l=T5(n.c,c.b),s&&l&&DH(s.c,new rI(l,c.c));for(yQ(n.a),f=spn(n.b,0);f.b!=f.d.c;)h=BB(b3(f),478),t=KD(n.c,h.a),o=T5(n.c,h.b),t&&o&&DM(t,o,h.c);yQ(n.b)}function xBn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b;c=new Pl(n),d5((a=new dkn).g),d5(a.j),$U(a.b),d5(a.d),d5(a.i),$U(a.k),$U(a.c),$U(a.e),b=bIn(a,c,null),O$n(a,c),r=b,t&&(u=eHn(s=new Pl(t)),vSn(r,Pun(Gk(nMt,1),HWn,527,0,[u]))),l=!1,f=!1,e&&(s=new Pl(e),l8n in s.a&&(l=zJ(s,l8n).ge().a),b8n in s.a&&(f=zJ(s,b8n).ge().a)),h=$j(Fen(new Xm,l),f),BSn(new su,r,h),l8n in c.a&&rtn(c,l8n,null),(l||f)&&(nBn(h,o=new py,l,f),rtn(c,l8n,o)),i=new Xg(a),Uon(new OA(r),i)}function DBn(n,t,e){var i,r,c,a,u,o,s,h,f;for(a=new Ykn,s=Pun(Gk(ANt,1),hQn,25,15,[0]),r=-1,c=0,i=0,o=0;o<n.b.c.length;++o){if(!((h=BB(xq(n.b,o),434)).b>0)){if(r=-1,32==fV(h.c,0)){if(f=s[0],ynn(t,s),s[0]>f)continue}else if($Y(t,h.c,s[0])){s[0]+=h.c.length;continue}return 0}if(r<0&&h.a&&(r=o,c=s[0],i=0),r>=0){if(u=h.b,o==r&&0==(u-=i++))return 0;if(!LUn(t,s,h,u,a)){o=r-1,s[0]=c;continue}}else if(r=-1,!LUn(t,s,h,0,a))return 0}return dUn(a,e)?s[0]:0}function RBn(n){var t,e,i,r,c,a;if(!n.f){if(a=new Mo,c=new Mo,null==(t=P$t).a.zc(n,t)){for(r=new AL(kY(n));r.e!=r.i.gc();)pX(a,RBn(BB(kpn(r),26)));t.a.Bc(n),t.a.gc()}for(!n.s&&(n.s=new eU(FAt,n,21,17)),i=new AL(n.s);i.e!=i.i.gc();)cL(e=BB(kpn(i),170),99)&&f9(c,BB(e,18));chn(c),n.r=new TH(n,(BB(Wtn(QQ((QX(),t$t).o),6),18),c.i),c.g),pX(a,n.r),chn(a),n.f=new NO((BB(Wtn(QQ(t$t.o),5),18),a.i),a.g),P5(n).b&=-3}return n.f}function KBn(n){var t,e,i,r,c,a,u,o,s,h,f,l,b,w;for(a=n.o,i=x8(ANt,hQn,25,a,15,1),r=x8(ANt,hQn,25,a,15,1),e=n.p,t=x8(ANt,hQn,25,e,15,1),c=x8(ANt,hQn,25,e,15,1),s=0;s<a;s++){for(f=0;f<e&&!vmn(n,s,f);)++f;i[s]=f}for(h=0;h<a;h++){for(f=e-1;f>=0&&!vmn(n,h,f);)--f;r[h]=f}for(b=0;b<e;b++){for(u=0;u<a&&!vmn(n,u,b);)++u;t[b]=u}for(w=0;w<e;w++){for(u=a-1;u>=0&&!vmn(n,u,w);)--u;c[w]=u}for(o=0;o<a;o++)for(l=0;l<e;l++)o<c[l]&&o>t[l]&&l<r[o]&&l>i[o]&&FRn(n,o,l,!1,!0)}function _Bn(n){var t,e,i,r,c,a,u,o;e=qy(TD(mMn(n,(fRn(),Bct)))),c=n.a.c.d,u=n.a.d.d,e?(a=kL(XR(new xC(u.a,u.b),c),.5),o=kL(B$(n.e),.5),t=XR(UR(new xC(c.a,c.b),a),o),Hx(n.d,t)):(r=Gy(MD(mMn(n.a,rat))),i=n.d,c.a>=u.a?c.b>=u.b?(i.a=u.a+(c.a-u.a)/2+r,i.b=u.b+(c.b-u.b)/2-r-n.e.b):(i.a=u.a+(c.a-u.a)/2+r,i.b=c.b+(u.b-c.b)/2+r):c.b>=u.b?(i.a=c.a+(u.a-c.a)/2+r,i.b=u.b+(c.b-u.b)/2+r):(i.a=c.a+(u.a-c.a)/2+r,i.b=c.b+(u.b-c.b)/2-r-n.e.b))}function FBn(n,t){var e,i,r,c,a,u,o;if(null==n)return null;if(0==(c=n.length))return"";for(o=x8(ONt,WVn,25,c,15,1),_8(0,c,n.length),_8(0,c,o.length),YU(n,0,c,o,0),e=null,u=t,r=0,a=0;r<c;r++)i=o[r],EWn(),i<=32&&0!=(2&JLt[i])?u?(!e&&(e=new fN(n)),aY(e,r-a++)):(u=t,32!=i&&(!e&&(e=new fN(n)),sV(e,r-a,r-a+1,String.fromCharCode(32)))):u=!1;return u?e?(c=e.a.length)>0?fx(e.a,0,c-1):"":n.substr(0,c-1):e?e.a:n}function BBn(n){NM(n,new MTn(vj(wj(pj(gj(new du,UJn),"ELK DisCo"),"Layouter for arranging unconnected subgraphs. The subgraphs themselves are, by default, not laid out."),new at))),u2(n,UJn,XJn,mpn(Ect)),u2(n,UJn,WJn,mpn(pct)),u2(n,UJn,VJn,mpn(lct)),u2(n,UJn,QJn,mpn(vct)),u2(n,UJn,XYn,mpn(kct)),u2(n,UJn,WYn,mpn(yct)),u2(n,UJn,UYn,mpn(jct)),u2(n,UJn,VYn,mpn(mct)),u2(n,UJn,BJn,mpn(wct)),u2(n,UJn,HJn,mpn(bct)),u2(n,UJn,qJn,mpn(dct)),u2(n,UJn,GJn,mpn(gct))}function HBn(n,t,e,i){var r,c,a,u,o,s,h;if(Bl(c=new $vn(n),(uSn(),Iut)),hon(c,(HXn(),ept),(QEn(),XCt)),r=0,t){for(hon(a=new CSn,(hWn(),dlt),t),hon(c,dlt,t.i),qCn(a,(kUn(),CIt)),CZ(a,c),s=0,h=(o=Z0(t.e)).length;s<h;++s)MZ(o[s],a);hon(t,Elt,c),++r}if(e){for(u=new CSn,hon(c,(hWn(),dlt),e.i),hon(u,dlt,e),qCn(u,(kUn(),oIt)),CZ(u,c),s=0,h=(o=Z0(e.g)).length;s<h;++s)SZ(o[s],u);hon(e,Elt,c),++r}return hon(c,(hWn(),Bft),iln(r)),i.c[i.c.length]=c,c}function qBn(){qBn=O,OOt=Pun(Gk(ONt,1),WVn,25,15,[48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70]),AOt=new RegExp("[ \t\n\r\f]+");try{IOt=Pun(Gk(D$t,1),HWn,2015,0,[new vp((s$(),sdn("yyyy-MM-dd'T'HH:mm:ss'.'SSSZ",fR((fk(),fk(),rtt))))),new vp(sdn("yyyy-MM-dd'T'HH:mm:ss'.'SSS",fR(rtt))),new vp(sdn("yyyy-MM-dd'T'HH:mm:ss",fR(rtt))),new vp(sdn("yyyy-MM-dd'T'HH:mm",fR(rtt))),new vp(sdn("yyyy-MM-dd",fR(rtt)))])}catch(n){if(!cL(n=lun(n),78))throw Hp(n)}}function GBn(n){var t,i,r,c;if(r=qXn((!n.c&&(n.c=yhn(n.f)),n.c),0),0==n.e||0==n.a&&-1!=n.f&&n.e<0)return r;if(t=iin(n)<0?1:0,i=n.e,r.length,e.Math.abs(CJ(n.e)),c=new Ik,1==t&&(c.a+="-"),n.e>0)if((i-=r.length-t)>=0){for(c.a+="0.";i>qtt.length;i-=qtt.length)Nq(c,qtt);gR(c,qtt,CJ(i)),oO(c,r.substr(t))}else oO(c,fx(r,t,CJ(i=t-i))),c.a+=".",oO(c,nO(r,CJ(i)));else{for(oO(c,r.substr(t));i<-qtt.length;i+=qtt.length)Nq(c,qtt);gR(c,qtt,CJ(-i))}return c.a}function zBn(n,t,i,r){var c,a,u,o,s,h,f,l,b;return h=(s=XR(new xC(i.a,i.b),n)).a*t.b-s.b*t.a,f=t.a*r.b-t.b*r.a,l=(s.a*r.b-s.b*r.a)/f,b=h/f,0==f?0==h?(a=W8(n,c=UR(new xC(i.a,i.b),kL(new xC(r.a,r.b),.5))),u=W8(UR(new xC(n.a,n.b),t),c),o=.5*e.Math.sqrt(r.a*r.a+r.b*r.b),a<u&&a<=o?new xC(n.a,n.b):u<=o?UR(new xC(n.a,n.b),t):null):null:l>=0&&l<=1&&b>=0&&b<=1?UR(new xC(n.a,n.b),kL(new xC(t.a,t.b),l)):null}function UBn(n,t,e){var i,r,c,a,u;if(i=BB(mMn(n,(HXn(),Ndt)),21),e.a>t.a&&(i.Hc((wEn(),WMt))?n.c.a+=(e.a-t.a)/2:i.Hc(QMt)&&(n.c.a+=e.a-t.a)),e.b>t.b&&(i.Hc((wEn(),JMt))?n.c.b+=(e.b-t.b)/2:i.Hc(YMt)&&(n.c.b+=e.b-t.b)),BB(mMn(n,(hWn(),Zft)),21).Hc((bDn(),lft))&&(e.a>t.a||e.b>t.b))for(u=new Wb(n.a);u.a<u.c.c.length;)(a=BB(n0(u),10)).k==(uSn(),Mut)&&((r=BB(mMn(a,Qft),61))==(kUn(),oIt)?a.n.a+=e.a-t.a:r==SIt&&(a.n.b+=e.b-t.b));c=n.d,n.f.a=e.a-c.b-c.c,n.f.b=e.b-c.d-c.a}function XBn(n,t,e){var i,r,c,a,u;if(i=BB(mMn(n,(HXn(),Ndt)),21),e.a>t.a&&(i.Hc((wEn(),WMt))?n.c.a+=(e.a-t.a)/2:i.Hc(QMt)&&(n.c.a+=e.a-t.a)),e.b>t.b&&(i.Hc((wEn(),JMt))?n.c.b+=(e.b-t.b)/2:i.Hc(YMt)&&(n.c.b+=e.b-t.b)),BB(mMn(n,(hWn(),Zft)),21).Hc((bDn(),lft))&&(e.a>t.a||e.b>t.b))for(a=new Wb(n.a);a.a<a.c.c.length;)(c=BB(n0(a),10)).k==(uSn(),Mut)&&((r=BB(mMn(c,Qft),61))==(kUn(),oIt)?c.n.a+=e.a-t.a:r==SIt&&(c.n.b+=e.b-t.b));u=n.d,n.f.a=e.a-u.b-u.c,n.f.b=e.b-u.d-u.a}function WBn(n){var t,i,r,c,a,u,o,s,h,f;for(s=new Ib(new Cb(xOn(n)).a.vc().Kc());s.a.Ob();){for(r=BB(s.a.Pb(),42),h=0,f=0,h=(o=BB(r.cd(),10)).d.d,f=o.o.b+o.d.a,n.d[o.p]=0,t=o;(c=n.a[t.p])!=o;)i=Mgn(t,c),u=0,u=n.c==(gJ(),nyt)?i.d.n.b+i.d.a.b-i.c.n.b-i.c.a.b:i.c.n.b+i.c.a.b-i.d.n.b-i.d.a.b,a=Gy(n.d[t.p])+u,n.d[c.p]=a,h=e.Math.max(h,c.d.d-a),f=e.Math.max(f,a+c.o.b+c.d.a),t=c;t=o;do{n.d[t.p]=Gy(n.d[t.p])+h,t=n.a[t.p]}while(t!=o);n.b[o.p]=h+f}}function VBn(n){var t,i,r,c,a,u,o,s,h,f,l;for(n.b=!1,f=RQn,o=KQn,l=RQn,s=KQn,i=n.e.a.ec().Kc();i.Ob();)for(r=(t=BB(i.Pb(),266)).a,f=e.Math.min(f,r.c),o=e.Math.max(o,r.c+r.b),l=e.Math.min(l,r.d),s=e.Math.max(s,r.d+r.a),a=new Wb(t.c);a.a<a.c.c.length;)(c=BB(n0(a),395)).a.a?(u=(h=r.d+c.b.b)+c.c,l=e.Math.min(l,h),s=e.Math.max(s,u)):(u=(h=r.c+c.b.a)+c.c,f=e.Math.min(f,h),o=e.Math.max(o,u));n.a=new xC(o-f,s-l),n.c=new xC(f+n.d.a,l+n.d.b)}function QBn(n,t,e){var i,r,c,a,u,o,s,h;for(h=new Np,c=0,tin(s=new x0(0,e),new asn(0,0,s,e)),r=0,o=new AL(n);o.e!=o.i.gc();)u=BB(kpn(o),33),i=BB(xq(s.a,s.a.c.length-1),187),r+u.g+(0==BB(xq(s.a,0),187).b.c.length?0:e)>t&&(r=0,c+=s.b+e,h.c[h.c.length]=s,tin(s=new x0(c,e),i=new asn(0,s.f,s,e)),r=0),0==i.b.c.length||u.f>=i.o&&u.f<=i.f||.5*i.a<=u.f&&1.5*i.a>=u.f?ybn(i,u):(tin(s,a=new asn(i.s+i.r+e,s.f,s,e)),ybn(a,u)),r=u.i+u.g;return h.c[h.c.length]=s,h}function YBn(n){var t,e,i,r,c,a;if(!n.a){if(n.o=null,a=new gp(n),t=new So,null==(e=P$t).a.zc(n,e)){for(c=new AL(kY(n));c.e!=c.i.gc();)pX(a,YBn(BB(kpn(c),26)));e.a.Bc(n),e.a.gc()}for(!n.s&&(n.s=new eU(FAt,n,21,17)),r=new AL(n.s);r.e!=r.i.gc();)cL(i=BB(kpn(r),170),322)&&f9(t,BB(i,34));chn(t),n.k=new EH(n,(BB(Wtn(QQ((QX(),t$t).o),7),18),t.i),t.g),pX(a,n.k),chn(a),n.a=new NO((BB(Wtn(QQ(t$t.o),4),18),a.i),a.g),P5(n).b&=-2}return n.a}function JBn(n,t,e,i,r,c,a){var u,o,s,h,f;return h=!1,u=dNn(e.q,t.f+t.b-e.q.f),!((f=r-(e.q.e+u-a))<i.g)&&(o=c==n.c.length-1&&f>=(l1(c,n.c.length),BB(n.c[c],200)).e,!((s=cHn(i,f,!1).a)>t.b&&!o)&&((o||s<=t.b)&&(o&&s>t.b?(e.d=s,p9(e,FSn(e,s))):(aEn(e.q,u),e.c=!0),p9(i,r-(e.s+e.r)),Tvn(i,e.q.e+e.q.d,t.f),tin(t,i),n.c.length>c&&(Tkn((l1(c,n.c.length),BB(n.c[c],200)),i),0==(l1(c,n.c.length),BB(n.c[c],200)).a.c.length&&s6(n,c)),h=!0),h))}function ZBn(n,t,e,i){var r,c,a,u,o,s,h;if(h=axn(n.e.Tg(),t),r=0,c=BB(n.g,119),o=null,ZM(),BB(t,66).Oj()){for(u=0;u<n.i;++u)if(a=c[u],h.rl(a.ak())){if(Nfn(a,e)){o=a;break}++r}}else if(null!=e){for(u=0;u<n.i;++u)if(a=c[u],h.rl(a.ak())){if(Nfn(e,a.dd())){o=a;break}++r}}else for(u=0;u<n.i;++u)if(a=c[u],h.rl(a.ak())){if(null==a.dd()){o=a;break}++r}return o&&(mA(n.e)&&(s=t.$j()?new b4(n.e,4,t,e,null,r,!0):LY(n,t.Kj()?2:1,t,e,t.zj(),-1,!0),i?i.Ei(s):i=s),i=TKn(n,o,i)),i}function nHn(n,t,i,r,c,a,u){var o,s,h,f,l,b,w,d;switch(w=0,d=0,s=c.c,o=c.b,f=i.f,b=i.g,t.g){case 0:w=r.i+r.g+u,d=n.c?gTn(w,a,r,u):r.j,l=e.Math.max(s,w+b),h=e.Math.max(o,d+f);break;case 1:d=r.j+r.f+u,w=n.c?dTn(d,a,r,u):r.i,l=e.Math.max(s,w+b),h=e.Math.max(o,d+f);break;case 2:w=s+u,d=0,l=s+u+b,h=e.Math.max(o,f);break;case 3:w=0,d=o+u,l=e.Math.max(s,b),h=o+u+f;break;default:throw Hp(new _y("IllegalPlacementOption."))}return new awn(n.a,l,h,t,w,d)}function tHn(n){var t,i,r,c,a,u,o,s,h,f,l,b;if(o=n.d,l=BB(mMn(n,(hWn(),Klt)),15),t=BB(mMn(n,Dft),15),l||t){if(a=Gy(MD(edn(n,(HXn(),ppt)))),u=Gy(MD(edn(n,vpt))),b=0,l){for(h=0,c=l.Kc();c.Ob();)r=BB(c.Pb(),10),h=e.Math.max(h,r.o.b),b+=r.o.a;b+=a*(l.gc()-1),o.d+=h+u}if(i=0,t){for(h=0,c=t.Kc();c.Ob();)r=BB(c.Pb(),10),h=e.Math.max(h,r.o.b),i+=r.o.a;i+=a*(t.gc()-1),o.a+=h+u}(s=e.Math.max(b,i))>n.o.a&&(f=(s-n.o.a)/2,o.b=e.Math.max(o.b,f),o.c=e.Math.max(o.c,f))}}function eHn(n){var t,e,i,r,c,a;for(cA(r=new R0,(Nun(),JTt)),i=new Sb(new Jy(new TT(n,jrn(n,x8(Qtt,sVn,2,0,6,1))).b));i.b<i.d.gc();)Px(i.b<i.d.gc()),e=SD(i.d.Xb(i.c=i.b++)),(c=pGn(lAt,e))&&null!=(a=Zqn(c,(t=zJ(n,e)).je()?t.je().a:t.ge()?""+t.ge().a:t.he()?""+t.he().a:t.Ib()))&&((SN(c.j,(rpn(),sMt))||SN(c.j,hMt))&&son(Ynn(r,UOt),c,a),SN(c.j,uMt)&&son(Ynn(r,_Ot),c,a),SN(c.j,fMt)&&son(Ynn(r,XOt),c,a),SN(c.j,oMt)&&son(Ynn(r,zOt),c,a));return r}function iHn(n,t,e,i){var r,c,a,u,o,s;if(o=axn(n.e.Tg(),t),c=BB(n.g,119),$xn(n.e,t)){for(r=0,u=0;u<n.i;++u)if(a=c[u],o.rl(a.ak())){if(r==e)return ZM(),BB(t,66).Oj()?a:(null!=(s=a.dd())&&i&&cL(t,99)&&0!=(BB(t,18).Bb&BQn)&&(s=FIn(n,t,u,r,s)),s);++r}throw Hp(new Ay(e9n+e+o8n+r))}for(r=0,u=0;u<n.i;++u){if(a=c[u],o.rl(a.ak()))return ZM(),BB(t,66).Oj()?a:(null!=(s=a.dd())&&i&&cL(t,99)&&0!=(BB(t,18).Bb&BQn)&&(s=FIn(n,t,u,r,s)),s);++r}return t.zj()}function rHn(n,t,e){var i,r,c,a,u,o,s,h;if(r=BB(n.g,119),$xn(n.e,t))return ZM(),BB(t,66).Oj()?new lq(t,n):new xI(t,n);for(s=axn(n.e.Tg(),t),i=0,u=0;u<n.i;++u){if(a=(c=r[u]).ak(),s.rl(a)){if(ZM(),BB(t,66).Oj())return c;if(a==(TOn(),lLt)||a==sLt){for(o=new lN(Bbn(c.dd()));++u<n.i;)((a=(c=r[u]).ak())==lLt||a==sLt)&&oO(o,Bbn(c.dd()));return gK(BB(t.Yj(),148),o.a)}return null!=(h=c.dd())&&e&&cL(t,99)&&0!=(BB(t,18).Bb&BQn)&&(h=FIn(n,t,u,i,h)),h}++i}return t.zj()}function cHn(n,t,i){var r,c,a,u,o,s,h,f,l,b;for(a=0,u=n.t,c=0,r=0,s=0,b=0,l=0,i&&(n.n.c=x8(Ant,HWn,1,0,5,1),WB(n.n,new RJ(n.s,n.t,n.i))),o=0,f=new Wb(n.b);f.a<f.c.c.length;)a+(h=BB(n0(f),33)).g+(o>0?n.i:0)>t&&s>0&&(a=0,u+=s+n.i,c=e.Math.max(c,b),r+=s+n.i,s=0,b=0,i&&(++l,WB(n.n,new RJ(n.s,u,n.i))),o=0),b+=h.g+(o>0?n.i:0),s=e.Math.max(s,h.f),i&&smn(BB(xq(n.n,l),211),h),a+=h.g+(o>0?n.i:0),++o;return c=e.Math.max(c,b),r+=s,i&&(n.r=c,n.d=r,yyn(n.j)),new UV(n.s,n.t,c,r)}function aHn(n,t,e,i,r){var c,a,u,o,s,h,f,l,b;if($T(),SU(n,"src"),SU(e,"dest"),l=tsn(n),o=tsn(e),pH(0!=(4&l.i),"srcType is not an array"),pH(0!=(4&o.i),"destType is not an array"),f=l.c,a=o.c,pH(0!=(1&f.i)?f==a:0==(1&a.i),"Array types don't match"),b=n.length,s=e.length,t<0||i<0||r<0||t+r>b||i+r>s)throw Hp(new fv);if(0==(1&f.i)&&l!=o)if(h=een(n),c=een(e),GI(n)===GI(e)&&t<i)for(t+=r,u=i+r;u-- >i;)$X(c,u,h[--t]);else for(u=i+r;i<u;)$X(c,i++,h[t++]);else r>0&&_Cn(n,t,e,i,r,!0)}function uHn(){uHn=O,ret=Pun(Gk(ANt,1),hQn,25,15,[_Vn,1162261467,OVn,1220703125,362797056,1977326743,OVn,387420489,AQn,214358881,429981696,815730721,1475789056,170859375,268435456,410338673,612220032,893871739,128e7,1801088541,113379904,148035889,191102976,244140625,308915776,387420489,481890304,594823321,729e6,887503681,OVn,1291467969,1544804416,1838265625,60466176]),cet=Pun(Gk(ANt,1),hQn,25,15,[-1,-1,31,19,15,13,11,11,10,9,9,8,8,8,8,7,7,7,7,7,7,7,6,6,6,6,6,6,6,6,6,6,6,6,6,6,5])}function oHn(n){var t,e,i,r,c,a,u;for(i=new Wb(n.b);i.a<i.c.c.length;)for(c=new Wb(a0(BB(n0(i),29).a));c.a<c.c.c.length;)if(Znn(r=BB(n0(c),10))&&!(e=BB(mMn(r,(hWn(),Rft)),305)).g&&e.d)for(t=e,u=e.d;u;)eRn(u.i,u.k,!1,!0),A7(t.a),A7(u.i),A7(u.k),A7(u.b),MZ(u.c,t.c.d),MZ(t.c,null),PZ(t.a,null),PZ(u.i,null),PZ(u.k,null),PZ(u.b,null),(a=new v3(t.i,u.a,t.e,u.j,u.f)).k=t.k,a.n=t.n,a.b=t.b,a.c=u.c,a.g=t.g,a.d=u.d,hon(t.i,Rft,a),hon(u.a,Rft,a),u=u.d,t=a}function sHn(n,t){var e,i,r,c,a;if(a=BB(t,136),T$n(n),T$n(a),null!=a.b){if(n.c=!0,null==n.b)return n.b=x8(ANt,hQn,25,a.b.length,15,1),void aHn(a.b,0,n.b,0,a.b.length);for(c=x8(ANt,hQn,25,n.b.length+a.b.length,15,1),e=0,i=0,r=0;e<n.b.length||i<a.b.length;)e>=n.b.length?(c[r++]=a.b[i++],c[r++]=a.b[i++]):i>=a.b.length?(c[r++]=n.b[e++],c[r++]=n.b[e++]):a.b[i]<n.b[e]||a.b[i]===n.b[e]&&a.b[i+1]<n.b[e+1]?(c[r++]=a.b[i++],c[r++]=a.b[i++]):(c[r++]=n.b[e++],c[r++]=n.b[e++]);n.b=c}}function hHn(n,t){var e,i,r,c,a,u,o,s,h,f;return e=qy(TD(mMn(n,(hWn(),slt)))),u=qy(TD(mMn(t,slt))),i=BB(mMn(n,hlt),11),o=BB(mMn(t,hlt),11),r=BB(mMn(n,flt),11),s=BB(mMn(t,flt),11),h=!!i&&i==o,f=!!r&&r==s,e||u?(c=(!qy(TD(mMn(n,slt)))||qy(TD(mMn(n,olt))))&&(!qy(TD(mMn(t,slt)))||qy(TD(mMn(t,olt)))),a=!(qy(TD(mMn(n,slt)))&&qy(TD(mMn(n,olt)))||qy(TD(mMn(t,slt)))&&qy(TD(mMn(t,olt)))),new R_(h&&c||f&&a,h,f)):new R_(BB(n0(new Wb(n.j)),11).p==BB(n0(new Wb(t.j)),11).p,h,f)}function fHn(n){var t,i,r,c,a,u,o,s;for(r=0,i=0,s=new YT,t=0,o=new Wb(n.n);o.a<o.c.c.length;)0==(u=BB(n0(o),211)).c.c.length?r5(s,u,s.c.b,s.c):(r=e.Math.max(r,u.d),i+=u.a+(t>0?n.i:0)),++t;for(nwn(n.n,s),n.d=i,n.r=r,n.g=0,n.f=0,n.e=0,n.o=RQn,n.p=RQn,a=new Wb(n.b);a.a<a.c.c.length;)c=BB(n0(a),33),n.p=e.Math.min(n.p,c.g),n.g=e.Math.max(n.g,c.g),n.f=e.Math.max(n.f,c.f),n.o=e.Math.min(n.o,c.f),n.e+=c.f+n.i;n.a=n.e/n.b.c.length-n.i*((n.b.c.length-1)/n.b.c.length),yyn(n.j)}function lHn(n){var t,e,i,r;return 0!=(64&n.Db)?Yln(n):(t=new lN(V5n),(i=n.k)?oO(oO((t.a+=' "',t),i),'"'):(!n.n&&(n.n=new eU(zOt,n,1,7)),n.n.i>0&&(!(r=(!n.n&&(n.n=new eU(zOt,n,1,7)),BB(Wtn(n.n,0),137)).a)||oO(oO((t.a+=' "',t),r),'"'))),!n.b&&(n.b=new hK(KOt,n,4,7)),e=!(n.b.i<=1&&(!n.c&&(n.c=new hK(KOt,n,5,8)),n.c.i<=1)),t.a+=e?" [":" ",oO(t,JL(new mk,new AL(n.b))),e&&(t.a+="]"),t.a+=e1n,e&&(t.a+="["),oO(t,JL(new mk,new AL(n.c))),e&&(t.a+="]"),t.a)}function bHn(n,t){var e,i,r,c,a,u,o;if(n.a){if(o=null,null!=(u=n.a.ne())?t.a+=""+u:null!=(a=n.a.Dj())&&(-1!=(c=GO(a,YTn(91)))?(o=a.substr(c),t.a+=""+fx(null==a?zWn:(kW(a),a),0,c)):t.a+=""+a),n.d&&0!=n.d.i){for(r=!0,t.a+="<",i=new AL(n.d);i.e!=i.i.gc();)e=BB(kpn(i),87),r?r=!1:t.a+=FWn,bHn(e,t);t.a+=">"}null!=o&&(t.a+=""+o)}else n.e?null!=(u=n.e.zb)&&(t.a+=""+u):(t.a+="?",n.b?(t.a+=" super ",bHn(n.b,t)):n.f&&(t.a+=" extends ",bHn(n.f,t)))}function wHn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M;for(y=n.c,k=t.c,e=E7(y.a,n,0),i=E7(k.a,t,0),v=BB(xwn(n,(ain(),Hvt)).Kc().Pb(),11),T=BB(xwn(n,qvt).Kc().Pb(),11),m=BB(xwn(t,Hvt).Kc().Pb(),11),M=BB(xwn(t,qvt).Kc().Pb(),11),g=Z0(v.e),j=Z0(T.g),p=Z0(m.e),E=Z0(M.g),Qyn(n,i,k),s=0,b=(c=p).length;s<b;++s)MZ(c[s],v);for(h=0,w=(a=E).length;h<w;++h)SZ(a[h],T);for(Qyn(t,e,y),f=0,d=(u=g).length;f<d;++f)MZ(u[f],m);for(o=0,l=(r=j).length;o<l;++o)SZ(r[o],M)}function dHn(n,t,e,i){var r,c,a,u,o,s;if(c=Wln(i),!qy(TD(mMn(i,(HXn(),Igt))))&&!qy(TD(mMn(n,bgt)))||vA(BB(mMn(n,ept),98)))switch(CZ(u=new CSn,n),t?((s=u.n).a=t.a-n.n.a,s.b=t.b-n.n.b,WSn(s,0,0,n.o.a,n.o.b),qCn(u,z_n(u,c))):(r=hwn(c),qCn(u,e==(ain(),qvt)?r:Tln(r))),a=BB(mMn(i,(hWn(),Zft)),21),o=u.j,c.g){case 2:case 1:(o==(kUn(),sIt)||o==SIt)&&a.Fc((bDn(),gft));break;case 4:case 3:(o==(kUn(),oIt)||o==CIt)&&a.Fc((bDn(),gft))}else r=hwn(c),u=R_n(n,e,e==(ain(),qvt)?r:Tln(r));return u}function gHn(n,t,i){var r,c,a,u,o,s,h;return e.Math.abs(t.s-t.c)<lZn||e.Math.abs(i.s-i.c)<lZn?0:(r=WNn(n,t.j,i.e),c=WNn(n,i.j,t.e),a=0,-1==r||-1==c?(-1==r&&(new zZ((O6(),Tyt),i,t,1),++a),-1==c&&(new zZ((O6(),Tyt),t,i,1),++a)):(u=Tfn(t.j,i.s,i.c),u+=Tfn(i.e,t.s,t.c),o=Tfn(i.j,t.s,t.c),(s=r+16*u)<(h=c+16*(o+=Tfn(t.e,i.s,i.c)))?new zZ((O6(),Myt),t,i,h-s):s>h?new zZ((O6(),Myt),i,t,s-h):s>0&&h>0&&(new zZ((O6(),Myt),t,i,0),new zZ(Myt,i,t,0))),a)}function pHn(n,t){var i,r,c,a,u;for(u=new usn(new Pb(n.f.b).a);u.b;){if(c=BB((a=ten(u)).cd(),594),1==t){if(c.gf()!=(Ffn(),HPt)&&c.gf()!=KPt)continue}else if(c.gf()!=(Ffn(),_Pt)&&c.gf()!=FPt)continue;switch(r=BB(BB(a.dd(),46).b,81),i=BB(BB(a.dd(),46).a,189).c,c.gf().g){case 2:r.g.c=n.e.a,r.g.b=e.Math.max(1,r.g.b+i);break;case 1:r.g.c=r.g.c+i,r.g.b=e.Math.max(1,r.g.b-i);break;case 4:r.g.d=n.e.b,r.g.a=e.Math.max(1,r.g.a+i);break;case 3:r.g.d=r.g.d+i,r.g.a=e.Math.max(1,r.g.a-i)}}}function vHn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g;for(o=x8(ANt,hQn,25,t.b.c.length,15,1),h=x8($ut,$Vn,267,t.b.c.length,0,1),s=x8(Out,a1n,10,t.b.c.length,0,1),b=0,w=(l=n.a).length;b<w;++b){for(g=0,u=new Wb((f=l[b]).e);u.a<u.c.c.length;)++o[r=tA((c=BB(n0(u),10)).c)],d=Gy(MD(mMn(t,(HXn(),ypt)))),o[r]>0&&s[r]&&(d=K$(n.b,s[r],c)),g=e.Math.max(g,c.c.c.b+d);for(a=new Wb(f.e);a.a<a.c.c.length;)(c=BB(n0(a),10)).n.b=g+c.d.d,(i=c.c).c.b=g+c.d.d+c.o.b+c.d.a,h[E7(i.b.b,i,0)]=c.k,s[E7(i.b.b,i,0)]=c}}function mHn(n,t){var e,i,r,c,a,u,o,s,f,l,b;for(i=new oz(ZL(dLn(t).a.Kc(),new h));dAn(i);)cL(Wtn((!(e=BB(U5(i),79)).b&&(e.b=new hK(KOt,e,4,7)),e.b),0),186)||(o=PTn(BB(Wtn((!e.c&&(e.c=new hK(KOt,e,5,8)),e.c),0),82)),nAn(e)||(a=t.i+t.g/2,u=t.j+t.f/2,f=o.i+o.g/2,l=o.j+o.f/2,(b=new Gj).a=f-a,b.b=l-u,Ukn(c=new xC(b.a,b.b),t.g,t.f),b.a-=c.a,b.b-=c.b,a=f-b.a,u=l-b.b,Ukn(s=new xC(b.a,b.b),o.g,o.f),b.a-=s.a,b.b-=s.b,f=a+b.a,l=u+b.b,Ien(r=cDn(e,!0,!0),a),Aen(r,u),Ten(r,f),Oen(r,l),mHn(n,o)))}function yHn(n){NM(n,new MTn(vj(wj(pj(gj(new du,R4n),"ELK SPOrE Compaction"),"ShrinkTree is a compaction algorithm that maintains the topology of a layout. The relocation of diagram elements is based on contracting a spanning tree."),new tu))),u2(n,R4n,K4n,mpn(kTt)),u2(n,R4n,_4n,mpn(vTt)),u2(n,R4n,F4n,mpn(pTt)),u2(n,R4n,B4n,mpn(dTt)),u2(n,R4n,H4n,mpn(gTt)),u2(n,R4n,QJn,wTt),u2(n,R4n,vZn,8),u2(n,R4n,q4n,mpn(yTt)),u2(n,R4n,G4n,mpn(hTt)),u2(n,R4n,z4n,mpn(fTt)),u2(n,R4n,X2n,(hN(),!1))}function kHn(n,t){var i,r,c,a,u,o,s,h,f,l;for(OTn(t,"Simple node placement",1),l=BB(mMn(n,(hWn(),Alt)),304),o=0,a=new Wb(n.b);a.a<a.c.c.length;){for((u=(r=BB(n0(a),29)).c).b=0,i=null,h=new Wb(r.a);h.a<h.c.c.length;)s=BB(n0(h),10),i&&(u.b+=Idn(s,i,l.c)),u.b+=s.d.d+s.o.b+s.d.a,i=s;o=e.Math.max(o,u.b)}for(c=new Wb(n.b);c.a<c.c.c.length;)for(f=(o-(u=(r=BB(n0(c),29)).c).b)/2,i=null,h=new Wb(r.a);h.a<h.c.c.length;)s=BB(n0(h),10),i&&(f+=Idn(s,i,l.c)),f+=s.d.d,s.n.b=f,f+=s.o.b+s.d.a,i=s;HSn(t)}function jHn(n,t,e,i){var r,c,a,u,o,s,h,f;if(0==i.gc())return!1;if(ZM(),a=(o=BB(t,66).Oj())?i:new gtn(i.gc()),$xn(n.e,t)){if(t.hi())for(h=i.Kc();h.Ob();)UFn(n,t,s=h.Pb(),cL(t,99)&&0!=(BB(t,18).Bb&BQn))||(c=Z3(t,s),a.Fc(c));else if(!o)for(h=i.Kc();h.Ob();)c=Z3(t,s=h.Pb()),a.Fc(c)}else{for(f=axn(n.e.Tg(),t),r=BB(n.g,119),u=0;u<n.i;++u)if(c=r[u],f.rl(c.ak()))throw Hp(new _y(I7n));if(i.gc()>1)throw Hp(new _y(I7n));o||(c=Z3(t,i.Kc().Pb()),a.Fc(c))}return oon(n,EPn(n,t,e),a)}function EHn(n,t){var e,i,r,c;for(Qtn(t.b.j),JT($V(new Rq(null,new w1(t.d,16)),new cc),new ac),c=new Wb(t.d);c.a<c.c.c.length;){switch((r=BB(n0(c),101)).e.g){case 0:e=BB(xq(r.j,0),113).d.j,Gl(r,BB($N(Oz(BB(h6(r.k,e),15).Oc(),Qst)),113)),ql(r,BB($N(Iz(BB(h6(r.k,e),15).Oc(),Qst)),113));break;case 1:i=Hyn(r),Gl(r,BB($N(Oz(BB(h6(r.k,i[0]),15).Oc(),Qst)),113)),ql(r,BB($N(Iz(BB(h6(r.k,i[1]),15).Oc(),Qst)),113));break;case 2:VPn(n,r);break;case 3:KNn(r);break;case 4:GNn(n,r)}Vtn(r)}n.a=null}function THn(n,t,e){var i,r,c,a,u,o,s,h;return i=n.a.o==(oZ(),cyt)?RQn:KQn,!(u=cFn(n,new aC(t,e))).a&&u.c?(DH(n.d,u),i):u.a?(r=u.a.c,o=u.a.d,e?(s=n.a.c==(gJ(),tyt)?o:r,c=n.a.c==tyt?r:o,a=n.a.g[c.i.p],h=Gy(n.a.p[a.p])+Gy(n.a.d[c.i.p])+c.n.b+c.a.b-Gy(n.a.d[s.i.p])-s.n.b-s.a.b):(s=n.a.c==(gJ(),nyt)?o:r,c=n.a.c==nyt?r:o,h=Gy(n.a.p[n.a.g[c.i.p].p])+Gy(n.a.d[c.i.p])+c.n.b+c.a.b-Gy(n.a.d[s.i.p])-s.n.b-s.a.b),n.a.n[n.a.g[r.i.p].p]=(hN(),!0),n.a.n[n.a.g[o.i.p].p]=!0,h):i}function MHn(n,t,e){var i,r,c,a,u,o,s;if($xn(n.e,t))ZM(),AOn((u=BB(t,66).Oj()?new lq(t,n):new xI(t,n)).c,u.b),Z$(u,BB(e,14));else{for(s=axn(n.e.Tg(),t),i=BB(n.g,119),c=0;c<n.i;++c)if(r=i[c].ak(),s.rl(r)){if(r==(TOn(),lLt)||r==sLt){for(a=c,(o=Ovn(n,t,e))?fDn(n,c):++c;c<n.i;)(r=i[c].ak())==lLt||r==sLt?fDn(n,c):++c;o||BB(ovn(n,a,Z3(t,e)),72)}else Ovn(n,t,e)?fDn(n,c):BB(ovn(n,c,(ZM(),BB(t,66).Oj()?BB(e,72):Z3(t,e))),72);return}Ovn(n,t,e)||f9(n,(ZM(),BB(t,66).Oj()?BB(e,72):Z3(t,e)))}}function SHn(n,t,e){var i,r,c,a,u,o,s,h;return Nfn(e,n.b)||(n.b=e,c=new Jn,a=BB(P4($V(new Rq(null,new w1(e.f,16)),c),x7(new Q,new Y,new cn,new an,Pun(Gk(nit,1),$Vn,132,0,[(qsn(),Xet),Uet]))),21),n.e=!0,n.f=!0,n.c=!0,n.d=!0,r=a.Hc((Hpn(),Brt)),i=a.Hc(Hrt),r&&!i&&(n.f=!1),!r&&i&&(n.d=!1),r=a.Hc(Frt),i=a.Hc(qrt),r&&!i&&(n.c=!1),!r&&i&&(n.e=!1)),h=BB(n.a.Ce(t,e),46),o=BB(h.a,19).a,s=BB(h.b,19).a,u=!1,o<0?n.c||(u=!0):n.e||(u=!0),s<0?n.d||(u=!0):n.f||(u=!0),u?SHn(n,h,e):h}function PHn(n){var t,i,r,c;c=n.o,qD(),n.A.dc()||Nfn(n.A,$rt)?t=c.b:(t=MIn(n.f),n.A.Hc((mdn(),RIt))&&!n.B.Hc((n_n(),XIt))&&(t=e.Math.max(t,MIn(BB(oV(n.p,(kUn(),oIt)),244))),t=e.Math.max(t,MIn(BB(oV(n.p,CIt),244)))),(i=oan(n))&&(t=e.Math.max(t,i.b)),n.A.Hc(KIt)&&(n.q!=(QEn(),WCt)&&n.q!=XCt||(t=e.Math.max(t,XH(BB(oV(n.b,(kUn(),oIt)),124))),t=e.Math.max(t,XH(BB(oV(n.b,CIt),124)))))),qy(TD(n.e.yf().We((sWn(),FSt))))?c.b=e.Math.max(c.b,t):c.b=t,(r=n.f.i).d=0,r.a=t,GFn(n.f)}function CHn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b;for(h=0;h<t.length;h++){for(a=n.Kc();a.Ob();)BB(a.Pb(),225).Of(h,t);for(f=0;f<t[h].length;f++){for(u=n.Kc();u.Ob();)BB(u.Pb(),225).Pf(h,f,t);for(b=t[h][f].j,l=0;l<b.c.length;l++){for(o=n.Kc();o.Ob();)BB(o.Pb(),225).Qf(h,f,l,t);for(l1(l,b.c.length),e=0,r=new m6(BB(b.c[l],11).b);y$(r.a)||y$(r.b);)for(i=BB(y$(r.a)?n0(r.a):n0(r.b),17),s=n.Kc();s.Ob();)BB(s.Pb(),225).Nf(h,f,l,e++,i,t)}}}for(c=n.Kc();c.Ob();)BB(c.Pb(),225).Mf()}function IHn(n,t){var e,i,r,c,a;for(n.b=Gy(MD(mMn(t,(HXn(),kpt)))),n.c=Gy(MD(mMn(t,Tpt))),n.d=BB(mMn(t,rgt),336),n.a=BB(mMn(t,Pdt),275),fmn(t),r=(c=BB(P4(AV(AV(wnn(wnn(new Rq(null,new w1(t.b,16)),new ye),new ke),new je),new Ee),m9(new H,new B,new rn,Pun(Gk(nit,1),$Vn,132,0,[(qsn(),Uet)]))),15)).Kc();r.Ob();)e=BB(r.Pb(),17),BB(mMn(e,(hWn(),Nlt)),15).Jc(new ed(n)),hon(e,Nlt,null);for(i=c.Kc();i.Ob();)e=BB(i.Pb(),17),a=BB(mMn(e,(hWn(),xlt)),17),FXn(n,BB(mMn(e,$lt),15),a),hon(e,$lt,null)}function OHn(n){n.b=null,n.a=null,n.o=null,n.q=null,n.v=null,n.w=null,n.B=null,n.p=null,n.Q=null,n.R=null,n.S=null,n.T=null,n.U=null,n.V=null,n.W=null,n.bb=null,n.eb=null,n.ab=null,n.H=null,n.db=null,n.c=null,n.d=null,n.f=null,n.n=null,n.r=null,n.s=null,n.u=null,n.G=null,n.J=null,n.e=null,n.j=null,n.i=null,n.g=null,n.k=null,n.t=null,n.F=null,n.I=null,n.L=null,n.M=null,n.O=null,n.P=null,n.$=null,n.N=null,n.Z=null,n.cb=null,n.K=null,n.D=null,n.A=null,n.C=null,n._=null,n.fb=null,n.X=null,n.Y=null,n.gb=!1,n.hb=!1}function AHn(n){var t,e,i,r,c;if(n.k!=(uSn(),Cut))return!1;if(n.j.c.length<=1)return!1;if(BB(mMn(n,(HXn(),ept)),98)==(QEn(),XCt))return!1;if(bvn(),(i=(n.q?n.q:(SQ(),SQ(),het))._b(Rgt)?BB(mMn(n,Rgt),197):BB(mMn(vW(n),Kgt),197))==lvt)return!1;if(i!=fvt&&i!=hvt){if(r=Gy(MD(edn(n,Npt))),!(t=BB(mMn(n,Lpt),142))&&(t=new HR(r,r,r,r)),c=abn(n,(kUn(),CIt)),t.d+t.a+(c.gc()-1)*r>n.o.b)return!1;if(e=abn(n,oIt),t.d+t.a+(e.gc()-1)*r>n.o.b)return!1}return!0}function $Hn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w;if(a=n.e,o=t.e,0==a)return t;if(0==o)return n;if((c=n.d)+(u=t.d)==2)return e=e0(n.a[0],UQn),i=e0(t.a[0],UQn),a==o?(w=dG(h=rbn(e,i)),0==(b=dG(jz(h,32)))?new X6(a,w):new lU(a,2,Pun(Gk(ANt,1),hQn,25,15,[w,b]))):npn(a<0?ibn(i,e):ibn(e,i));if(a==o)l=a,f=c>=u?N8(n.a,c,t.a,u):N8(t.a,u,n.a,c);else{if(0==(r=c!=u?c>u?1:-1:Msn(n.a,t.a,c)))return ODn(),eet;1==r?(l=a,f=d6(n.a,c,t.a,u)):(l=o,f=d6(t.a,u,n.a,c))}return X0(s=new lU(l,f.length,f)),s}function LHn(n,t,i,r,c,a,u){var o,s,h,f,l,b,w;return l=qy(TD(mMn(t,(HXn(),Ogt)))),b=null,a==(ain(),Hvt)&&r.c.i==i?b=r.c:a==qvt&&r.d.i==i&&(b=r.d),(h=u)&&l&&!b?(WB(h.e,r),w=e.Math.max(Gy(MD(mMn(h.d,agt))),Gy(MD(mMn(r,agt)))),hon(h.d,agt,w)):(kUn(),f=PIt,b?f=b.j:vA(BB(mMn(i,ept),98))&&(f=a==Hvt?CIt:oIt),s=xHn(n,t,i,a,f,r),o=W5((vW(i),r)),a==Hvt?(SZ(o,BB(xq(s.j,0),11)),MZ(o,c)):(SZ(o,c),MZ(o,BB(xq(s.j,0),11))),h=new zfn(r,o,s,BB(mMn(s,(hWn(),dlt)),11),a,!b)),JIn(n.a,r,new L_(h.d,t,a)),h}function NHn(n,t){var e,i,r,c,a,u,o,s,h,f;if(h=null,n.d&&(h=BB(SJ(n.d,t),138)),!h){if(f=(c=n.a.Mh()).i,!n.d||NT(n.d)!=f){for(o=new xp,n.d&&Tcn(o,n.d),u=s=o.f.c+o.g.c;u<f;++u)i=BB(Wtn(c,u),138),(e=BB(null==(r=Cfn(n.e,i).ne())?jCn(o.f,null,i):ubn(o.g,r,i),138))&&e!=i&&(null==r?jCn(o.f,null,e):ubn(o.g,r,e));if(o.f.c+o.g.c!=f)for(a=0;a<s;++a)i=BB(Wtn(c,a),138),(e=BB(null==(r=Cfn(n.e,i).ne())?jCn(o.f,null,i):ubn(o.g,r,i),138))&&e!=i&&(null==r?jCn(o.f,null,e):ubn(o.g,r,e));n.d=o}h=BB(SJ(n.d,t),138)}return h}function xHn(n,t,e,i,r,c){var a,u,o,s,h,f;return a=null,s=i==(ain(),Hvt)?c.c:c.d,o=Wln(t),s.i==e?(a=BB(RX(n.b,s),10))||(hon(a=bXn(s,BB(mMn(e,(HXn(),ept)),98),r,HKn(s),null,s.n,s.o,o,t),(hWn(),dlt),s),VW(n.b,s,a)):(u=AEn(a=bXn((h=new Zn,f=Gy(MD(mMn(t,(HXn(),ypt))))/2,son(h,tpt,f),h),BB(mMn(e,ept),98),r,i==Hvt?-1:1,null,new Gj,new xC(0,0),o,t),e,i),hon(a,(hWn(),dlt),u),VW(n.b,u,a)),BB(mMn(t,(hWn(),Zft)),21).Fc((bDn(),lft)),vA(BB(mMn(t,(HXn(),ept)),98))?hon(t,ept,(QEn(),VCt)):hon(t,ept,(QEn(),QCt)),a}function DHn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d;OTn(t,"Orthogonal edge routing",1),s=Gy(MD(mMn(n,(HXn(),Apt)))),e=Gy(MD(mMn(n,kpt))),i=Gy(MD(mMn(n,Tpt))),l=new fX(0,e),d=0,a=new M2(n.b,0),u=null,h=null,o=null,f=null;do{f=(h=a.b<a.d.gc()?(Px(a.b<a.d.gc()),BB(a.d.Xb(a.c=a.b++),29)):null)?h.a:null,u&&(Tqn(u,d),d+=u.c.a),w=AGn(l,n,o,f,u?d+i:d),r=!u||VI(o,(dxn(),jyt)),c=!h||VI(f,(dxn(),jyt)),w>0?(b=(w-1)*e,u&&(b+=i),h&&(b+=i),b<s&&!r&&!c&&(b=s),d+=b):!r&&!c&&(d+=s),u=h,o=f}while(h);n.f.a=d,HSn(t)}function RHn(){var n;RHn=O,EAt=new Sm,kAt=x8(Qtt,sVn,2,0,6,1),SAt=i0(Bun(33,58),Bun(1,26)),PAt=i0(Bun(97,122),Bun(65,90)),CAt=Bun(48,57),TAt=i0(SAt,0),MAt=i0(PAt,CAt),IAt=i0(i0(0,Bun(1,6)),Bun(33,38)),OAt=i0(i0(CAt,Bun(65,70)),Bun(97,102)),xAt=i0(TAt,dpn("-_.!~*'()")),DAt=i0(MAt,Xwn("-_.!~*'()")),dpn(u9n),Xwn(u9n),i0(xAt,dpn(";:@&=+$,")),i0(DAt,Xwn(";:@&=+$,")),AAt=dpn(":/?#"),$At=Xwn(":/?#"),LAt=dpn("/?#"),NAt=Xwn("/?#"),(n=new Rv).a.zc("jar",n),n.a.zc("zip",n),n.a.zc("archive",n),SQ(),jAt=new Ak(n)}function KHn(n,t){var e,i,r,c,a;if(hon(t,(qqn(),okt),0),r=BB(mMn(t,akt),86),0==t.d.b)r?(a=Gy(MD(mMn(r,fkt)))+n.a+E5(r,t),hon(t,fkt,a)):hon(t,fkt,0);else{for(e=new wg(spn(new bg(t).a.d,0));EE(e.a);)KHn(n,BB(b3(e.a),188).c);i=BB(iL(new wg(spn(new bg(t).a.d,0))),86),c=(Gy(MD(mMn(BB(TN(new wg(spn(new bg(t).a.d,0))),86),fkt)))+Gy(MD(mMn(i,fkt))))/2,r?(a=Gy(MD(mMn(r,fkt)))+n.a+E5(r,t),hon(t,fkt,a),hon(t,okt,Gy(MD(mMn(t,fkt)))-c),IGn(n,t)):hon(t,fkt,c)}}function _Hn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b;u=0,b=0,o=TJ(n.f,n.f.length),c=n.d,a=n.i,i=n.a,r=n.b;do{for(l=0,s=new Wb(n.p);s.a<s.c.c.length;)f=OGn(n,BB(n0(s),10)),e=!0,(n.q==(sNn(),Tvt)||n.q==Pvt)&&(e=qy(TD(f.b))),BB(f.a,19).a<0&&e?(++l,o=TJ(n.f,n.f.length),n.d=n.d+BB(f.a,19).a,b+=c-n.d,c=n.d+BB(f.a,19).a,a=n.i,i=a0(n.a),r=a0(n.b)):(n.f=TJ(o,o.length),n.d=c,n.a=(yX(i),i?new t_(i):HB(new Wb(i))),n.b=(yX(r),r?new t_(r):HB(new Wb(r))),n.i=a);++u,h=0!=l&&qy(TD(t.Kb(new rI(iln(b),iln(u)))))}while(h)}function FHn(n,t,i,r){var c,a,u,o,s,h,f,l,b,w,d,g,p,v,m;return a=n.f,l=t.f,u=a==(YLn(),xEt)||a==REt,o=a==DEt||a==KEt,b=l==DEt||l==KEt,s=a==DEt||a==xEt,w=l==DEt||l==xEt,!u||l!=xEt&&l!=REt?o&&b?n.f==KEt?n:t:s&&w?(a==DEt?(f=n,h=t):(f=t,h=n),d=i.j+i.f,g=f.e+r.f,p=e.Math.max(d,g)-e.Math.min(i.j,f.e),c=(f.d+r.g-i.i)*p,v=i.i+i.g,m=h.d+r.g,c<=(e.Math.max(v,m)-e.Math.min(i.i,h.d))*(h.e+r.f-i.j)?n.f==DEt?n:t:n.f==xEt?n:t):n:n.f==REt?n:t}function BHn(n){var t,e,i,r,c,a,u,o,s,h;for(s=n.e.a.c.length,c=new Wb(n.e.a);c.a<c.c.c.length;)BB(n0(c),121).j=!1;for(n.i=x8(ANt,hQn,25,s,15,1),n.g=x8(ANt,hQn,25,s,15,1),n.n=new Np,r=0,h=new Np,u=new Wb(n.e.a);u.a<u.c.c.length;)(a=BB(n0(u),121)).d=r++,0==a.b.a.c.length&&WB(n.n,a),gun(h,a.g);for(t=0,i=new Wb(h);i.a<i.c.c.length;)(e=BB(n0(i),213)).c=t++,e.f=!1;o=h.c.length,null==n.b||n.b.length<o?(n.b=x8(xNt,qQn,25,o,15,1),n.c=x8($Nt,ZYn,25,o,16,1)):nk(n.c),n.d=h,n.p=new LN(etn(n.d.c.length)),n.j=1}function HHn(n,t){var e,i,r,c,a,u,o,s,h;if(!(t.e.c.length<=1)){for(n.f=t,n.d=BB(mMn(n.f,(rkn(),vat)),379),n.g=BB(mMn(n.f,jat),19).a,n.e=Gy(MD(mMn(n.f,mat))),n.c=Gy(MD(mMn(n.f,pat))),cX(n.b),r=new Wb(n.f.c);r.a<r.c.c.length;)i=BB(n0(r),282),yKn(n.b,i.c,i,null),yKn(n.b,i.d,i,null);for(u=n.f.e.c.length,n.a=kq(xNt,[sVn,qQn],[104,25],15,[u,u],2),s=new Wb(n.f.e);s.a<s.c.c.length;)CBn(n,o=BB(n0(s),144),n.a[o.b]);for(n.i=kq(xNt,[sVn,qQn],[104,25],15,[u,u],2),c=0;c<u;++c)for(a=0;a<u;++a)h=1/((e=n.a[c][a])*e),n.i[c][a]=h}}function qHn(n){var t,e,i,r;if(!(null==n.b||n.b.length<=2||n.a)){for(t=0,r=0;r<n.b.length;){for(t!=r?(n.b[t]=n.b[r++],n.b[t+1]=n.b[r++]):r+=2,e=n.b[t+1];r<n.b.length&&!(e+1<n.b[r]);)if(e+1==n.b[r])n.b[t+1]=n.b[r+1],e=n.b[t+1],r+=2;else if(e>=n.b[r+1])r+=2;else{if(!(e<n.b[r+1]))throw Hp(new dy("Token#compactRanges(): Internel Error: ["+n.b[t]+","+n.b[t+1]+"] ["+n.b[r]+","+n.b[r+1]+"]"));n.b[t+1]=n.b[r+1],e=n.b[t+1],r+=2}t+=2}t!=n.b.length&&(i=x8(ANt,hQn,25,t,15,1),aHn(n.b,0,i,0,t),n.b=i),n.a=!0}}function GHn(n,t){var e,i,r,c,a,u,o;for(a=gz(n.a).Kc();a.Ob();){if((c=BB(a.Pb(),17)).b.c.length>0)for(i=new t_(BB(h6(n.a,c),21)),SQ(),m$(i,new _w(t)),r=new M2(c.b,0);r.b<r.d.gc();){switch(Px(r.b<r.d.gc()),e=BB(r.d.Xb(r.c=r.b++),70),u=-1,BB(mMn(e,(HXn(),Ydt)),272).g){case 1:u=i.c.length-1;break;case 0:u=Jjn(i);break;case 2:u=0}-1!=u&&(l1(u,i.c.length),WB((o=BB(i.c[u],243)).b.b,e),BB(mMn(vW(o.b.c.i),(hWn(),Zft)),21).Fc((bDn(),fft)),BB(mMn(vW(o.b.c.i),Zft),21).Fc(sft),fW(r),hon(e,vlt,c))}SZ(c,null),MZ(c,null)}}function zHn(n,t){var e,i,r,c;return e=new _n,1==(r=2==(r=(i=BB(P4($V(new Rq(null,new w1(n.f,16)),e),x7(new Q,new Y,new cn,new an,Pun(Gk(nit,1),$Vn,132,0,[(qsn(),Xet),Uet]))),21)).gc())?1:0)&&QI(ldn(BB(P4(AV(i.Lc(),new Fn),Wcn(jgn(0),new en)),162).a,2),0)&&(r=0),1==(c=2==(c=(i=BB(P4($V(new Rq(null,new w1(t.f,16)),e),x7(new Q,new Y,new cn,new an,Pun(Gk(nit,1),$Vn,132,0,[Xet,Uet]))),21)).gc())?1:0)&&QI(ldn(BB(P4(AV(i.Lc(),new Bn),Wcn(jgn(0),new en)),162).a,2),0)&&(c=0),r<c?-1:r==c?0:1}function UHn(n){var t,e,i,r,c,a,u,o,s,h,f;if(o=new Np,!Lx(n,(hWn(),Wft)))return o;for(i=BB(mMn(n,Wft),15).Kc();i.Ob();)dqn(t=BB(i.Pb(),10),n),o.c[o.c.length]=t;for(r=new Wb(n.b);r.a<r.c.c.length;)for(a=new Wb(BB(n0(r),29).a);a.a<a.c.c.length;)(c=BB(n0(a),10)).k==(uSn(),Mut)&&(u=BB(mMn(c,Vft),10))&&(CZ(s=new CSn,c),qCn(s,BB(mMn(c,Qft),61)),h=BB(xq(u.j,0),11),SZ(f=new wY,s),MZ(f,h));for(e=new Wb(o);e.a<e.c.c.length;)PZ(t=BB(n0(e),10),BB(xq(n.b,n.b.c.length-1),29));return o}function XHn(n){var t,e,i,r,c,a,u,o,s,h,f,l;for(c=qy(TD(ZAn(t=WJ(n),(HXn(),wgt)))),h=0,r=0,s=new AL((!n.e&&(n.e=new hK(_Ot,n,7,4)),n.e));s.e!=s.i.gc();)a=(u=QIn(o=BB(kpn(s),79)))&&c&&qy(TD(ZAn(o,dgt))),l=PTn(BB(Wtn((!o.c&&(o.c=new hK(KOt,o,5,8)),o.c),0),82)),u&&a?++r:u&&!a?++h:JJ(l)==t||l==t?++r:++h;for(i=new AL((!n.d&&(n.d=new hK(_Ot,n,8,5)),n.d));i.e!=i.i.gc();)a=(u=QIn(e=BB(kpn(i),79)))&&c&&qy(TD(ZAn(e,dgt))),f=PTn(BB(Wtn((!e.b&&(e.b=new hK(KOt,e,4,7)),e.b),0),82)),u&&a?++h:u&&!a?++r:JJ(f)==t||f==t?++h:++r;return h-r}function WHn(n,t){var e,i,r,c,a,u,o,s,h;if(OTn(t,"Edge splitting",1),n.b.c.length<=2)HSn(t);else{for(Px((c=new M2(n.b,0)).b<c.d.gc()),a=BB(c.d.Xb(c.c=c.b++),29);c.b<c.d.gc();)for(r=a,Px(c.b<c.d.gc()),a=BB(c.d.Xb(c.c=c.b++),29),u=new Wb(r.a);u.a<u.c.c.length;)for(o=new Wb(BB(n0(u),10).j);o.a<o.c.c.length;)for(i=new Wb(BB(n0(o),11).g);i.a<i.c.c.length;)(s=(e=BB(n0(i),17)).d.i.c)!=r&&s!=a&&zxn(e,(Bl(h=new $vn(n),(uSn(),Put)),hon(h,(hWn(),dlt),e),hon(h,(HXn(),ept),(QEn(),XCt)),PZ(h,a),h));HSn(t)}}function VHn(n,t){var e,i,r,c,a,u,o,s,h;if((a=null!=t.p&&!t.b)||OTn(t,aZn,1),c=1/(e=BB(mMn(n,(hWn(),Mlt)),15)).gc(),t.n)for(OH(t,"ELK Layered uses the following "+e.gc()+" modules:"),h=0,s=e.Kc();s.Ob();)OH(t," Slot "+(h<10?"0":"")+h+++": "+nE(tsn(BB(s.Pb(),51))));for(o=e.Kc();o.Ob();)BB(o.Pb(),51).pf(n,mcn(t,c));for(r=new Wb(n.b);r.a<r.c.c.length;)i=BB(n0(r),29),gun(n.a,i.a),i.a.c=x8(Ant,HWn,1,0,5,1);for(u=new Wb(n.a);u.a<u.c.c.length;)PZ(BB(n0(u),10),null);n.b.c=x8(Ant,HWn,1,0,5,1),a||HSn(t)}function QHn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E;r=Gy(MD(mMn(t,(HXn(),Dgt)))),l=4,c=3,j=20/(k=BB(mMn(t,xpt),19).a),b=!1,s=0,u=DWn;do{for(a=1!=s,f=0!=s,E=0,v=0,y=(g=n.a).length;v<y;++v)(w=g[v]).f=null,Bzn(n,w,a,f,r),E+=e.Math.abs(w.a);do{o=U_n(n,t)}while(o);for(p=0,m=(d=n.a).length;p<m;++p)if(0!=(i=wU(w=d[p]).a))for(h=new Wb(w.e);h.a<h.c.c.length;)BB(n0(h),10).n.b+=i;0==s||1==s?--l<=0&&(E<u||-l>k)?(s=2,u=DWn):0==s?(s=1,u=E):(s=0,u=E):(b=E>=u||u-E<j,u=E,b&&--c)}while(!(b&&c<=0))}function YHn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b,w;for(w=new xp,c=n.a.ec().Kc();c.Ob();)VW(w,i=BB(c.Pb(),168),e.Je(i));for(yX(n),m$(a=n?new t_(n):HB(n.a.ec().Kc()),new Ew(w)),u=S4(a),o=new C$(t),jCn((b=new xp).f,t,o);0!=u.a.gc();){for(s=null,h=null,f=null,r=u.a.ec().Kc();r.Ob();)if(i=BB(r.Pb(),168),Gy(MD(qI(AY(w.f,i))))<=RQn){if(hU(b,i.a)&&!hU(b,i.b)){h=i.b,f=i.a,s=i;break}if(hU(b,i.b)&&!hU(b,i.a)){h=i.a,f=i.b,s=i;break}}if(!s)break;l=new C$(h),WB(BB(qI(AY(b.f,f)),221).a,l),jCn(b.f,h,l),u.a.Bc(s)}return o}function JHn(n,t,e){var i,r,c,a,u,o,s,h;for(OTn(e,"Depth-first cycle removal",1),o=(s=t.a).c.length,n.c=new Np,n.d=x8($Nt,ZYn,25,o,16,1),n.a=x8($Nt,ZYn,25,o,16,1),n.b=new Np,c=0,u=new Wb(s);u.a<u.c.c.length;)(a=BB(n0(u),10)).p=c,h3(fbn(a))&&WB(n.c,a),++c;for(h=new Wb(n.c);h.a<h.c.c.length;)GPn(n,BB(n0(h),10));for(r=0;r<o;r++)n.d[r]||(l1(r,s.c.length),GPn(n,BB(s.c[r],10)));for(i=new Wb(n.b);i.a<i.c.c.length;)tBn(BB(n0(i),17),!0),hon(t,(hWn(),qft),(hN(),!0));n.c=null,n.d=null,n.a=null,n.b=null,HSn(e)}function ZHn(n,t){var e,i,r,c,a,u,o;for(n.a.c=x8(Ant,HWn,1,0,5,1),i=spn(t.b,0);i.b!=i.d.c;)0==(e=BB(b3(i),86)).b.b&&(hon(e,(qqn(),dkt),(hN(),!0)),WB(n.a,e));switch(n.a.c.length){case 0:hon(r=new csn(0,t,"DUMMY_ROOT"),(qqn(),dkt),(hN(),!0)),hon(r,ekt,!0),DH(t.b,r);break;case 1:break;default:for(c=new csn(0,t,"SUPER_ROOT"),u=new Wb(n.a);u.a<u.c.c.length;)hon(o=new UQ(c,a=BB(n0(u),86)),(qqn(),ekt),(hN(),!0)),DH(c.a.a,o),DH(c.d,o),DH(a.b,o),hon(a,dkt,!1);hon(c,(qqn(),dkt),(hN(),!0)),hon(c,ekt,!0),DH(t.b,c)}}function nqn(n,t){var i,r,c,a,u,o;return jDn(),a=t.c-(n.c+n.b),c=n.c-(t.c+t.b),u=n.d-(t.d+t.a),i=t.d-(n.d+n.a),r=e.Math.max(c,a),o=e.Math.max(u,i),h$(),rin(A3n),(e.Math.abs(r)<=A3n||0==r||isNaN(r)&&isNaN(0)?0:r<0?-1:r>0?1:zO(isNaN(r),isNaN(0)))>=0^(rin(A3n),(e.Math.abs(o)<=A3n||0==o||isNaN(o)&&isNaN(0)?0:o<0?-1:o>0?1:zO(isNaN(o),isNaN(0)))>=0)?e.Math.max(o,r):(rin(A3n),(e.Math.abs(r)<=A3n||0==r||isNaN(r)&&isNaN(0)?0:r<0?-1:r>0?1:zO(isNaN(r),isNaN(0)))>0?e.Math.sqrt(o*o+r*r):-e.Math.sqrt(o*o+r*r))}function tqn(n,t){var e,i,r,c,a;if(t)if(!n.a&&(n.a=new _v),2!=n.e)if(1!=t.e)0!=(a=n.a.a.c.length)?0!=(c=BB(bW(n.a,a-1),117)).e&&10!=c.e||0!=t.e&&10!=t.e?Cv(n.a,t):(0==t.e||t.bm().length,0==c.e?(e=new Pk,(i=c._l())>=BQn?cO(e,Xln(i)):NX(e,i&QVn),c=new vJ(10,null,0),kU(n.a,c,a-1)):(c.bm().length,cO(e=new Pk,c.bm())),0==t.e?(i=t._l())>=BQn?cO(e,Xln(i)):NX(e,i&QVn):cO(e,t.bm()),BB(c,521).b=e.a):Cv(n.a,t);else for(r=0;r<t.em();r++)tqn(n,t.am(r));else Cv(n.a,t)}function eqn(n){var t,e,i,r,c;return null!=n.g?n.g:n.a<32?(n.g=DUn(fan(n.f),CJ(n.e)),n.g):(r=qXn((!n.c&&(n.c=yhn(n.f)),n.c),0),0==n.e?r:(t=(!n.c&&(n.c=yhn(n.f)),n.c).e<0?2:1,e=r.length,i=-n.e+e-t,(c=new Ck).a+=""+r,n.e>0&&i>=-6?i>=0?kZ(c,e-CJ(n.e),String.fromCharCode(46)):(c.a=fx(c.a,0,t-1)+"0."+nO(c.a,t-1),kZ(c,t+1,Bdn(qtt,0,-CJ(i)-1))):(e-t>=1&&(kZ(c,t,String.fromCharCode(46)),++e),kZ(c,e,String.fromCharCode(69)),i>0&&kZ(c,++e,String.fromCharCode(43)),kZ(c,++e,""+vz(fan(i)))),n.g=c.a,n.g))}function iqn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b;if(!e.dc()){for(a=0,h=0,l=BB((i=e.Kc()).Pb(),19).a;a<t.f;){if(a==l&&(h=0,l=i.Ob()?BB(i.Pb(),19).a:t.f+1),a!=h)for(b=BB(xq(n.b,a),29),f=BB(xq(n.b,h),29),s=new Wb(a0(b.a));s.a<s.c.c.length;)if(Qyn(o=BB(n0(s),10),f.a.c.length,f),0==h)for(c=new Wb(a0(fbn(o)));c.a<c.c.c.length;)tBn(r=BB(n0(c),17),!0),hon(n,(hWn(),qft),(hN(),!0)),iGn(n,r,1);++h,++a}for(u=new M2(n.b,0);u.b<u.d.gc();)Px(u.b<u.d.gc()),0==BB(u.d.Xb(u.c=u.b++),29).a.c.length&&fW(u)}}function rqn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m;for(h=(a=t.b).o,o=a.d,i=Gy(MD(gpn(a,(HXn(),ypt)))),r=Gy(MD(gpn(a,jpt))),s=Gy(MD(gpn(a,$pt))),rH(u=new fm,o.d,o.c,o.a,o.b),l=MRn(t,i,r,s),p=new Wb(t.d);p.a<p.c.c.length;){for(w=(g=BB(n0(p),101)).f.a.ec().Kc();w.Ob();)c=(b=BB(w.Pb(),409)).a,f=ETn(b),v=new km,bTn(b,b.c,l,v),FMn(b,f,l,v),bTn(b,b.d,l,v),e=v,e=n.Uf(b,f,e),yQ(c.a),Frn(c.a,e),JT(new Rq(null,new w1(e,16)),new wP(h,u));(d=g.i)&&(aTn(g,d,l,r),pgn(h,u,m=new wA(d.g)),UR(m,d.j),pgn(h,u,m))}rH(o,u.d,u.c,u.a,u.b)}function cqn(n,t,e){var i,r,c;if((r=BB(mMn(t,(HXn(),Pdt)),275))!=(JMn(),cft)){switch(OTn(e,"Horizontal Compaction",1),n.a=t,Vk(i=new yOn(((c=new I7).d=t,c.c=BB(mMn(c.d,Zdt),218),UDn(c),SGn(c),sRn(c),c.a)),n.b),1===BB(mMn(t,Sdt),422).g?Wk(i,new grn(n.a)):Wk(i,(CQ(),fit)),r.g){case 1:C$n(i);break;case 2:C$n(Tzn(i,(Ffn(),FPt)));break;case 3:C$n(Uk(Tzn(C$n(i),(Ffn(),FPt)),new gr));break;case 4:C$n(Uk(Tzn(C$n(i),(Ffn(),FPt)),new kd(c)));break;case 5:C$n(Xk(i,wst))}Tzn(i,(Ffn(),_Pt)),i.e=!0,Lzn(c),HSn(e)}}function aqn(n,t,e,i,r,c,a,u){var o,s,h,f;switch(o=u6(Pun(Gk(FEt,1),HWn,220,0,[t,e,i,r])),f=null,n.b.g){case 1:f=u6(Pun(Gk(tEt,1),HWn,526,0,[new Ja,new Qa,new Ya]));break;case 0:f=u6(Pun(Gk(tEt,1),HWn,526,0,[new Ya,new Qa,new Ja]));break;case 2:f=u6(Pun(Gk(tEt,1),HWn,526,0,[new Qa,new Ja,new Ya]))}for(h=new Wb(f);h.a<h.c.c.length;)s=BB(n0(h),526),o.c.length>1&&(o=s.mg(o,n.a,u));return 1==o.c.length?BB(xq(o,o.c.length-1),220):2==o.c.length?FHn((l1(0,o.c.length),BB(o.c[0],220)),(l1(1,o.c.length),BB(o.c[1],220)),a,c):null}function uqn(n){var t,i,r,c,a,u;for(Otn(n.a,new nt),i=new Wb(n.a);i.a<i.c.c.length;)t=BB(n0(i),221),r=XR(B$(BB(n.b,65).c),BB(t.b,65).c),ect?(u=BB(n.b,65).b,a=BB(t.b,65).b,e.Math.abs(r.a)>=e.Math.abs(r.b)?(r.b=0,a.d+a.a>u.d&&a.d<u.d+u.a&&NH(r,e.Math.max(u.c-(a.c+a.b),a.c-(u.c+u.b)))):(r.a=0,a.c+a.b>u.c&&a.c<u.c+u.b&&NH(r,e.Math.max(u.d-(a.d+a.a),a.d-(u.d+u.a))))):NH(r,TFn(BB(n.b,65),BB(t.b,65))),c=e.Math.sqrt(r.a*r.a+r.b*r.b),NH(r,c=HEn(Wrt,t,c,r)),LG(BB(t.b,65),r),Otn(t.a,new Aw(r)),BB(Wrt.b,65),K8(Wrt,Vrt,t)}function oqn(n){var t,i,r,c,a,u,o,s,f,l,b,w;for(n.f=new Fv,o=0,r=0,c=new Wb(n.e.b);c.a<c.c.c.length;)for(u=new Wb(BB(n0(c),29).a);u.a<u.c.c.length;){for((a=BB(n0(u),10)).p=o++,i=new oz(ZL(lbn(a).a.Kc(),new h));dAn(i);)BB(U5(i),17).p=r++;for(t=AHn(a),l=new Wb(a.j);l.a<l.c.c.length;)f=BB(n0(l),11),t&&(w=f.a.b)!=e.Math.floor(w)&&(s=w-j2(fan(e.Math.round(w))),f.a.b-=s),(b=f.n.b+f.a.b)!=e.Math.floor(b)&&(s=b-j2(fan(e.Math.round(b))),f.n.b-=s)}n.g=o,n.b=r,n.i=x8(eyt,HWn,401,o,0,1),n.c=x8(Jmt,HWn,649,r,0,1),n.d.a.$b()}function sqn(n){var t,e,i,r,c,a,u,o,s;if(n.ej())if(o=n.fj(),n.i>0){if(t=new DI(n.i,n.g),c=(e=n.i)<100?null:new Fj(e),n.ij())for(i=0;i<n.i;++i)a=n.g[i],c=n.kj(a,c);if(a6(n),r=1==e?n.Zi(4,Wtn(t,0),null,0,o):n.Zi(6,t,null,-1,o),n.bj()){for(i=new ax(t);i.e!=i.i.gc();)c=n.dj(jpn(i),c);c?(c.Ei(r),c.Fi()):n.$i(r)}else c?(c.Ei(r),c.Fi()):n.$i(r)}else a6(n),n.$i(n.Zi(6,(SQ(),set),null,-1,o));else if(n.bj())if(n.i>0){for(u=n.g,s=n.i,a6(n),c=s<100?null:new Fj(s),i=0;i<s;++i)a=u[i],c=n.dj(a,c);c&&c.Fi()}else a6(n);else a6(n)}function hqn(n,t,i){var r,c,a,u,o,s,h,f,l;for(_an(this),i==(dJ(),Lyt)?TU(this.r,n):TU(this.w,n),f=RQn,h=KQn,u=t.a.ec().Kc();u.Ob();)c=BB(u.Pb(),46),o=BB(c.a,455),(s=(r=BB(c.b,17)).c)==n&&(s=r.d),TU(o==Lyt?this.r:this.w,s),l=(kUn(),yIt).Hc(s.j)?Gy(MD(mMn(s,(hWn(),Llt)))):Aon(Pun(Gk(PMt,1),sVn,8,0,[s.i.n,s.n,s.a])).b,f=e.Math.min(f,l),h=e.Math.max(h,l);for(XMn(this,(kUn(),yIt).Hc(n.j)?Gy(MD(mMn(n,(hWn(),Llt)))):Aon(Pun(Gk(PMt,1),sVn,8,0,[n.i.n,n.n,n.a])).b,f,h),a=t.a.ec().Kc();a.Ob();)c=BB(a.Pb(),46),tPn(this,BB(c.b,17));this.o=!1}function fqn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m;return e=8191&n.l,i=n.l>>13|(15&n.m)<<9,r=n.m>>4&8191,c=n.m>>17|(255&n.h)<<5,a=(1048320&n.h)>>8,g=i*(u=8191&t.l),p=r*u,v=c*u,m=a*u,0!=(o=t.l>>13|(15&t.m)<<9)&&(g+=e*o,p+=i*o,v+=r*o,m+=c*o),0!=(s=t.m>>4&8191)&&(p+=e*s,v+=i*s,m+=r*s),0!=(h=t.m>>17|(255&t.h)<<5)&&(v+=e*h,m+=i*h),0!=(f=(1048320&t.h)>>8)&&(m+=e*f),b=((d=e*u)>>22)+(g>>9)+((262143&p)<<4)+((31&v)<<17),w=(p>>18)+(v>>5)+((4095&m)<<8),w+=(b+=(l=(d&SQn)+((511&g)<<13))>>22)>>22,M$(l&=SQn,b&=SQn,w&=PQn)}function lqn(n){var t,i,r,c,a,u,o;if(0!=(o=BB(xq(n.j,0),11)).g.c.length&&0!=o.e.c.length)throw Hp(new Fy("Interactive layout does not support NORTH/SOUTH ports with incoming _and_ outgoing edges."));if(0!=o.g.c.length){for(a=RQn,i=new Wb(o.g);i.a<i.c.c.length;)t=BB(n0(i),17),r=BB(mMn(u=t.d.i,(HXn(),Cgt)),142),a=e.Math.min(a,u.n.a-r.b);return new qf(yX(a))}if(0!=o.e.c.length){for(c=KQn,i=new Wb(o.e);i.a<i.c.c.length;)t=BB(n0(i),17),r=BB(mMn(u=t.c.i,(HXn(),Cgt)),142),c=e.Math.max(c,u.n.a+u.o.a+r.c);return new qf(yX(c))}return iy(),iy(),Ont}function bqn(n,t){var e,i,r,c,a,u;if(n.Fk()){if(n.i>4){if(!n.wj(t))return!1;if(n.rk()){if(u=(e=(i=BB(t,49)).Ug())==n.e&&(n.Dk()?i.Og(i.Vg(),n.zk())==n.Ak():-1-i.Vg()==n.aj()),n.Ek()&&!u&&!e&&i.Zg())for(r=0;r<n.i;++r)if(GI(n.Gk(BB(n.g[r],56)))===GI(t))return!0;return u}if(n.Dk()&&!n.Ck()){if(GI(c=BB(t,56).ah(Cvn(BB(n.ak(),18))))===GI(n.e))return!0;if(null==c||!BB(c,56).kh())return!1}}if(a=Sjn(n,t),n.Ek()&&!a)for(r=0;r<n.i;++r)if(GI(i=n.Gk(BB(n.g[r],56)))===GI(t))return!0;return a}return Sjn(n,t)}function wqn(n,t){var e,i,r,c,a,u,o,s,h,f,l;for(h=new Np,l=new Rv,a=t.b,r=0;r<a.c.length;r++){for(s=(l1(r,a.c.length),BB(a.c[r],29)).a,h.c=x8(Ant,HWn,1,0,5,1),c=0;c<s.c.length;c++)(u=n.a[r][c]).p=c,u.k==(uSn(),Iut)&&(h.c[h.c.length]=u),c5(BB(xq(t.b,r),29).a,c,u),u.j.c=x8(Ant,HWn,1,0,5,1),gun(u.j,BB(BB(xq(n.b,r),15).Xb(c),14)),LK(BB(mMn(u,(HXn(),ept)),98))||hon(u,ept,(QEn(),UCt));for(i=new Wb(h);i.a<i.c.c.length;)f=QRn(e=BB(n0(i),10)),l.a.zc(f,l),l.a.zc(e,l)}for(o=l.a.ec().Kc();o.Ob();)u=BB(o.Pb(),10),SQ(),m$(u.j,(zsn(),sst)),u.i=!0,eIn(u)}function dqn(n,t){var e,i,r,c,a,u,o,s,h,f;if(h=BB(mMn(n,(hWn(),Qft)),61),i=BB(xq(n.j,0),11),h==(kUn(),sIt)?qCn(i,SIt):h==SIt&&qCn(i,sIt),BB(mMn(t,(HXn(),Fgt)),174).Hc((mdn(),_It))){if(o=Gy(MD(mMn(n,Cpt))),s=Gy(MD(mMn(n,Ipt))),a=Gy(MD(mMn(n,Spt))),(u=BB(mMn(t,cpt),21)).Hc((lIn(),eIt)))for(e=s,f=n.o.a/2-i.n.a,c=new Wb(i.f);c.a<c.c.c.length;)(r=BB(n0(c),70)).n.b=e,r.n.a=f-r.o.a/2,e+=r.o.b+a;else if(u.Hc(rIt))for(c=new Wb(i.f);c.a<c.c.c.length;)(r=BB(n0(c),70)).n.a=o+n.o.a-i.n.a;f0(new Pw((gM(),new HV(t,!1,!1,new Ft))),new __(null,n,!1))}}function gqn(n,t){var i,r,c,a,u,o,s;if(0!=t.c.length){for(SQ(),yG(t.c,t.c.length,null),r=BB(n0(c=new Wb(t)),145);c.a<c.c.c.length;)i=BB(n0(c),145),!aen(r.e.c,i.e.c)||Kdn(BD(r.e).b,i.e.d)||Kdn(BD(i.e).b,r.e.d)?(eFn(n,r),r=i):(gun(r.k,i.k),gun(r.b,i.b),gun(r.c,i.c),Frn(r.i,i.i),gun(r.d,i.d),gun(r.j,i.j),a=e.Math.min(r.e.c,i.e.c),u=e.Math.min(r.e.d,i.e.d),o=e.Math.max(r.e.c+r.e.b,i.e.c+i.e.b)-a,s=e.Math.max(r.e.d+r.e.a,i.e.d+i.e.a)-u,xH(r.e,a,u,o,s),t0(r.f,i.f),!r.a&&(r.a=i.a),gun(r.g,i.g),WB(r.g,i));eFn(n,r)}}function pqn(n,t,e,i){var r,c,a,u,o,s;if((u=n.j)==(kUn(),PIt)&&t!=(QEn(),QCt)&&t!=(QEn(),YCt)&&(qCn(n,u=z_n(n,e)),!(n.q?n.q:(SQ(),SQ(),het))._b((HXn(),tpt))&&u!=PIt&&(0!=n.n.a||0!=n.n.b)&&hon(n,tpt,jkn(n,u))),t==(QEn(),WCt)){switch(s=0,u.g){case 1:case 3:(c=n.i.o.a)>0&&(s=n.n.a/c);break;case 2:case 4:(r=n.i.o.b)>0&&(s=n.n.b/r)}hon(n,(hWn(),Tlt),s)}if(o=n.o,a=n.a,i)a.a=i.a,a.b=i.b,n.d=!0;else if(t!=QCt&&t!=YCt&&u!=PIt)switch(u.g){case 1:a.a=o.a/2;break;case 2:a.a=o.a,a.b=o.b/2;break;case 3:a.a=o.a/2,a.b=o.b;break;case 4:a.b=o.b/2}else a.a=o.a/2,a.b=o.b/2}function vqn(n){var t,e,i,r,c,a,u,o,s,h;if(n.ej())if(h=n.Vi(),o=n.fj(),h>0)if(t=new jcn(n.Gi()),c=(e=h)<100?null:new Fj(e),JD(n,e,t.g),r=1==e?n.Zi(4,Wtn(t,0),null,0,o):n.Zi(6,t,null,-1,o),n.bj()){for(i=new AL(t);i.e!=i.i.gc();)c=n.dj(kpn(i),c);c?(c.Ei(r),c.Fi()):n.$i(r)}else c?(c.Ei(r),c.Fi()):n.$i(r);else JD(n,n.Vi(),n.Wi()),n.$i(n.Zi(6,(SQ(),set),null,-1,o));else if(n.bj())if((h=n.Vi())>0){for(u=n.Wi(),s=h,JD(n,h,u),c=s<100?null:new Fj(s),i=0;i<s;++i)a=u[i],c=n.dj(a,c);c&&c.Fi()}else JD(n,n.Vi(),n.Wi());else JD(n,n.Vi(),n.Wi())}function mqn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b;for(u=new Wb(t);u.a<u.c.c.length;)(c=BB(n0(u),233)).e=null,c.c=0;for(o=null,a=new Wb(t);a.a<a.c.c.length;)if(f=(c=BB(n0(a),233)).d[0],!e||f.k==(uSn(),Cut)){for(b=BB(mMn(f,(hWn(),clt)),15).Kc();b.Ob();)l=BB(b.Pb(),10),e&&l.k!=(uSn(),Cut)||((!c.e&&(c.e=new Np),c.e).Fc(n.b[l.c.p][l.p]),++n.b[l.c.p][l.p].c);if(!e&&f.k==(uSn(),Cut)){if(o)for(h=BB(h6(n.d,o),21).Kc();h.Ob();)for(s=BB(h.Pb(),10),r=BB(h6(n.d,f),21).Kc();r.Ob();)i=BB(r.Pb(),10),UB(n.b[s.c.p][s.p]).Fc(n.b[i.c.p][i.p]),++n.b[i.c.p][i.p].c;o=f}}}function yqn(n,t){var e,i,r,c,a,u,o;for(e=0,o=new Np,c=new Wb(t);c.a<c.c.c.length;){switch(r=BB(n0(c),11),nhn(n.b,n.d[r.p]),o.c=x8(Ant,HWn,1,0,5,1),r.i.k.g){case 0:Otn(BB(mMn(r,(hWn(),Elt)),10).j,new Zd(o));break;case 1:S$(Qon(AV(new Rq(null,new w1(r.i.j,16)),new ng(r))),new tg(o));break;case 3:WB(o,new rI(BB(mMn(r,(hWn(),dlt)),11),iln(r.e.c.length+r.g.c.length)))}for(u=new Wb(o);u.a<u.c.c.length;)a=BB(n0(u),46),(i=ME(n,BB(a.a,11)))>n.d[r.p]&&(e+=n5(n.b,i)*BB(a.b,19).a,d3(n.a,iln(i)));for(;!Wy(n.a);)Mnn(n.b,BB(dU(n.a),19).a)}return e}function kqn(n,t,i,r){var c,a,u,o,s,h,f,l,b,w;for((f=new wA(BB(ZAn(n,(SMn(),HMt)),8))).a=e.Math.max(f.a-i.b-i.c,0),f.b=e.Math.max(f.b-i.d-i.a,0),(null==(c=MD(ZAn(n,DMt)))||(kW(c),c<=0))&&(c=1.3),u=new Np,l=new AL((!n.a&&(n.a=new eU(UOt,n,10,11)),n.a));l.e!=l.i.gc();)a=new zx(BB(kpn(l),33)),u.c[u.c.length]=a;switch(BB(ZAn(n,RMt),311).g){case 3:w=aFn(u,t,f.a,f.b,(s=r,kW(c),s));break;case 1:w=vBn(u,t,f.a,f.b,(h=r,kW(c),h));break;default:w=Mqn(u,t,f.a,f.b,(o=r,kW(c),o))}KUn(n,(b=yXn(new Gtn(w),t,i,f.a,f.b,r,(kW(c),c))).a,b.b,!1,!0)}function jqn(n,t){var e,i,r,c;c=new t_((e=t.b).j),r=0,(i=e.j).c=x8(Ant,HWn,1,0,5,1),eX(BB(gan(n.b,(kUn(),sIt),(Crn(),Rst)),15),e),r=Jmn(c,r,new xr,i),eX(BB(gan(n.b,sIt,Dst),15),e),r=Jmn(c,r,new Nr,i),eX(BB(gan(n.b,sIt,xst),15),e),eX(BB(gan(n.b,oIt,Rst),15),e),eX(BB(gan(n.b,oIt,Dst),15),e),r=Jmn(c,r,new Dr,i),eX(BB(gan(n.b,oIt,xst),15),e),eX(BB(gan(n.b,SIt,Rst),15),e),r=Jmn(c,r,new Rr,i),eX(BB(gan(n.b,SIt,Dst),15),e),r=Jmn(c,r,new Kr,i),eX(BB(gan(n.b,SIt,xst),15),e),eX(BB(gan(n.b,CIt,Rst),15),e),r=Jmn(c,r,new Qr,i),eX(BB(gan(n.b,CIt,Dst),15),e),eX(BB(gan(n.b,CIt,xst),15),e)}function Eqn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g;for(OTn(t,"Layer size calculation",1),f=RQn,h=KQn,c=!1,o=new Wb(n.b);o.a<o.c.c.length;)if((s=(u=BB(n0(o),29)).c).a=0,s.b=0,0!=u.a.c.length){for(c=!0,b=new Wb(u.a);b.a<b.c.c.length;)d=(l=BB(n0(b),10)).o,w=l.d,s.a=e.Math.max(s.a,d.a+w.b+w.c);g=(r=BB(xq(u.a,0),10)).n.b-r.d.d,r.k==(uSn(),Mut)&&(g-=BB(mMn(n,(HXn(),Lpt)),142).d),i=(a=BB(xq(u.a,u.a.c.length-1),10)).n.b+a.o.b+a.d.a,a.k==Mut&&(i+=BB(mMn(n,(HXn(),Lpt)),142).a),s.b=i-g,f=e.Math.min(f,g),h=e.Math.max(h,i)}c||(f=0,h=0),n.f.b=h-f,n.c.b-=f,HSn(t)}function Tqn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p;for(c=0,a=0,s=new Wb(n.a);s.a<s.c.c.length;)u=BB(n0(s),10),c=e.Math.max(c,u.d.b),a=e.Math.max(a,u.d.c);for(o=new Wb(n.a);o.a<o.c.c.length;){switch(u=BB(n0(o),10),BB(mMn(u,(HXn(),kdt)),248).g){case 1:w=0;break;case 2:w=1;break;case 5:w=.5;break;default:for(i=0,f=0,b=new Wb(u.j);b.a<b.c.c.length;)0==(l=BB(n0(b),11)).e.c.length||++i,0==l.g.c.length||++f;w=i+f==0?.5:f/(i+f)}g=n.c,h=u.o.a,p=(g.a-h)*w,w>.5?p-=2*a*(w-.5):w<.5&&(p+=2*c*(.5-w)),p<(r=u.d.b)&&(p=r),d=u.d.c,p>g.a-d-h&&(p=g.a-d-h),u.n.a=t+p}}function Mqn(n,t,e,i,r){var c,a,u,o,s,h,f,l,b;for(u=x8(xNt,qQn,25,n.c.length,15,1),ikn(l=new Xz(new Uu),n),s=0,b=new Np;0!=l.b.c.length;)if(a=BB(0==l.b.c.length?null:xq(l.b,0),157),s>1&&iG(a)*eG(a)/2>u[0]){for(c=0;c<b.c.length-1&&iG(a)*eG(a)/2>u[c];)++c;f=new Gtn(new s1(b,0,c+1)),h=iG(a)/eG(a),o=yXn(f,t,new bm,e,i,r,h),UR(kO(f.e),o),F8(eMn(l,f)),ikn(l,new s1(b,c+1,b.c.length)),b.c=x8(Ant,HWn,1,0,5,1),s=0,jG(u,u.length,0)}else null!=(0==l.b.c.length?null:xq(l.b,0))&&hrn(l,0),s>0&&(u[s]=u[s-1]),u[s]+=iG(a)*eG(a),++s,b.c[b.c.length]=a;return b}function Sqn(n){var t,e,i;if((e=BB(mMn(n,(HXn(),kgt)),163))==(Tbn(),Flt)){for(t=new oz(ZL(fbn(n).a.Kc(),new h));dAn(t);)if(!X5(BB(U5(t),17)))throw Hp(new rk(P1n+gyn(n)+"' has its layer constraint set to FIRST_SEPARATE, but has at least one incoming edge. FIRST_SEPARATE nodes must not have incoming edges."))}else if(e==Hlt)for(i=new oz(ZL(lbn(n).a.Kc(),new h));dAn(i);)if(!X5(BB(U5(i),17)))throw Hp(new rk(P1n+gyn(n)+"' has its layer constraint set to LAST_SEPARATE, but has at least one outgoing edge. LAST_SEPARATE nodes must not have outgoing edges."))}function Pqn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b;for(OTn(t,"Label dummy removal",1),i=Gy(MD(mMn(n,(HXn(),jpt)))),r=Gy(MD(mMn(n,Spt))),o=BB(mMn(n,Udt),103),u=new Wb(n.b);u.a<u.c.c.length;)for(h=new M2(BB(n0(u),29).a,0);h.b<h.d.gc();)Px(h.b<h.d.gc()),(s=BB(h.d.Xb(h.c=h.b++),10)).k==(uSn(),Sut)&&(f=BB(mMn(s,(hWn(),dlt)),17),b=Gy(MD(mMn(f,agt))),a=GI(mMn(s,ult))===GI((Xyn(),ECt)),e=new wA(s.n),a&&(e.b+=b+i),c=new xC(s.o.a,s.o.b-b-i),l=BB(mMn(s,Plt),15),o==(Ffn(),HPt)||o==KPt?ADn(l,e,r,c,a,o):qhn(l,e,r,c),gun(f.b,l),rGn(s,GI(mMn(n,Zdt))===GI((Mbn(),YPt))),fW(h));HSn(t)}function Cqn(n,t,e,i){var r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y;for(u=new Np,r=new Wb(t.a);r.a<r.c.c.length;)for(a=new Wb(BB(n0(r),10).j);a.a<a.c.c.length;){for(s=null,m=0,y=(v=Z0((c=BB(n0(a),11)).g)).length;m<y;++m)wan((p=v[m]).d.i,e)||((g=LHn(n,t,e,p,p.c,(ain(),qvt),s))!=s&&(u.c[u.c.length]=g),g.c&&(s=g));for(o=null,w=0,d=(b=Z0(c.e)).length;w<d;++w)wan((l=b[w]).c.i,e)||((g=LHn(n,t,e,l,l.d,(ain(),Hvt),o))!=o&&(u.c[u.c.length]=g),g.c&&(o=g))}for(f=new Wb(u);f.a<f.c.c.length;)h=BB(n0(f),441),-1!=E7(t.a,h.a,0)||WB(t.a,h.a),h.c&&(i.c[i.c.length]=h)}function Iqn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b,w;for(OTn(e,"Interactive cycle breaking",1),h=new Np,l=new Wb(t.a);l.a<l.c.c.length;)for((f=BB(n0(l),10)).p=1,b=Fjn(f).a,s=xwn(f,(ain(),qvt)).Kc();s.Ob();)for(c=new Wb(BB(s.Pb(),11).g);c.a<c.c.c.length;)(w=(i=BB(n0(c),17)).d.i)!=f&&Fjn(w).a<b&&(h.c[h.c.length]=i);for(a=new Wb(h);a.a<a.c.c.length;)tBn(i=BB(n0(a),17),!0);for(h.c=x8(Ant,HWn,1,0,5,1),o=new Wb(t.a);o.a<o.c.c.length;)(u=BB(n0(o),10)).p>0&&lPn(n,u,h);for(r=new Wb(h);r.a<r.c.c.length;)tBn(i=BB(n0(r),17),!0);h.c=x8(Ant,HWn,1,0,5,1),HSn(e)}function Oqn(n,t){var e,i,r,c,a,u,o,s,h;return s="",0==t.length?n.de(XVn,zVn,-1,-1):(mK((h=RMn(t)).substr(0,3),"at ")&&(h=h.substr(3)),-1==(a=(h=h.replace(/\[.*?\]/g,"")).indexOf("("))?-1==(a=h.indexOf("@"))?(s=h,h=""):(s=RMn(h.substr(a+1)),h=RMn(h.substr(0,a))):(e=h.indexOf(")",a),s=h.substr(a+1,e-(a+1)),h=RMn(h.substr(0,a))),-1!=(a=GO(h,YTn(46)))&&(h=h.substr(a+1)),(0==h.length||mK(h,"Anonymous function"))&&(h=zVn),u=mN(s,YTn(58)),r=MK(s,YTn(58),u-1),o=-1,i=-1,c=XVn,-1!=u&&-1!=r&&(c=s.substr(0,r),o=hx(s.substr(r+1,u-(r+1))),i=hx(s.substr(u+1))),n.de(c,h,o,i))}function Aqn(n,t,e){var i,r,c,a,u,o;if(0==t.l&&0==t.m&&0==t.h)throw Hp(new Oy("divide by zero"));if(0==n.l&&0==n.m&&0==n.h)return e&&(ltt=M$(0,0,0)),M$(0,0,0);if(t.h==CQn&&0==t.m&&0==t.l)return Fbn(n,e);if(o=!1,t.h>>19!=0&&(t=aon(t),o=!o),a=OLn(t),c=!1,r=!1,i=!1,n.h==CQn&&0==n.m&&0==n.l){if(r=!0,c=!0,-1!=a)return u=jAn(n,a),o&&Oon(u),e&&(ltt=M$(0,0,0)),u;n=WO((X7(),btt)),i=!0,o=!o}else n.h>>19!=0&&(c=!0,n=aon(n),i=!0,o=!o);return-1!=a?Bon(n,a,o,c,e):Kkn(n,t)<0?(e&&(ltt=c?aon(n):M$(n.l,n.m,n.h)),M$(0,0,0)):h_n(i?n:M$(n.l,n.m,n.h),t,o,c,r,e)}function $qn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w;if(n.e&&n.c.c<n.f)throw Hp(new Fy("Expected "+n.f+" phases to be configured; only found "+n.c.c));for(h=BB(Vj(n.g),9),b=sx(n.f),u=0,s=(c=h).length;u<s;++u)(f=BB(D7(n,(i=c[u]).g),246))?WB(b,BB(own(n,f),123)):b.c[b.c.length]=null;for(w=new B2,JT(AV($V(AV(new Rq(null,new w1(b,16)),new hu),new Eg(t)),new fu),new Tg(w)),Jcn(w,n.a),e=new Np,a=0,o=(r=h).length;a<o;++a)gun(e,Eun(n,JQ(BB(D7(w,(i=r[a]).g),20)))),(l=BB(xq(b,i.g),123))&&(e.c[e.c.length]=l);return gun(e,Eun(n,JQ(BB(D7(w,h[h.length-1].g+1),20)))),e}function Lqn(n,t,i){var r,c,a,u,o,s,h,f,l,b,w;for(OTn(i,"Model order cycle breaking",1),n.a=0,n.b=0,l=new Np,h=t.a.c.length,s=new Wb(t.a);s.a<s.c.c.length;)Lx(o=BB(n0(s),10),(hWn(),wlt))&&(h=e.Math.max(h,BB(mMn(o,wlt),19).a+1));for(w=new Wb(t.a);w.a<w.c.c.length;)for(u=zPn(n,b=BB(n0(w),10),h),f=xwn(b,(ain(),qvt)).Kc();f.Ob();)for(a=new Wb(BB(f.Pb(),11).g);a.a<a.c.c.length;)zPn(n,(r=BB(n0(a),17)).d.i,h)<u&&(l.c[l.c.length]=r);for(c=new Wb(l);c.a<c.c.c.length;)tBn(r=BB(n0(c),17),!0),hon(t,(hWn(),qft),(hN(),!0));l.c=x8(Ant,HWn,1,0,5,1),HSn(i)}function Nqn(n,t){var e,i,r,c,a,u,o;if(!(n.g>t.f||t.g>n.f)){for(e=0,i=0,a=n.w.a.ec().Kc();a.Ob();)r=BB(a.Pb(),11),phn(Aon(Pun(Gk(PMt,1),sVn,8,0,[r.i.n,r.n,r.a])).b,t.g,t.f)&&++e;for(u=n.r.a.ec().Kc();u.Ob();)r=BB(u.Pb(),11),phn(Aon(Pun(Gk(PMt,1),sVn,8,0,[r.i.n,r.n,r.a])).b,t.g,t.f)&&--e;for(o=t.w.a.ec().Kc();o.Ob();)r=BB(o.Pb(),11),phn(Aon(Pun(Gk(PMt,1),sVn,8,0,[r.i.n,r.n,r.a])).b,n.g,n.f)&&++i;for(c=t.r.a.ec().Kc();c.Ob();)r=BB(c.Pb(),11),phn(Aon(Pun(Gk(PMt,1),sVn,8,0,[r.i.n,r.n,r.a])).b,n.g,n.f)&&--i;e<i?new S6(n,t,i-e):i<e?new S6(t,n,e-i):(new S6(t,n,0),new S6(n,t,0))}}function xqn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v;for(s=t.c,r=QA(n.e),f=kL(Bx(B$(VA(n.e)),n.d*n.a,n.c*n.b),-.5),e=r.a-f.a,i=r.b-f.b,e=(a=t.a).c-e,i=a.d-i,o=new Wb(s);o.a<o.c.c.length;){switch(b=e+(l=(u=BB(n0(o),395)).b).a,g=i+l.b,w=CJ(b/n.a),p=CJ(g/n.b),(c=u.a).g){case 0:Hpn(),h=Brt;break;case 1:Hpn(),h=Frt;break;case 2:Hpn(),h=Hrt;break;default:Hpn(),h=qrt}c.a?(v=CJ((g+u.c)/n.b),WB(n.f,new x_(h,iln(p),iln(v))),c==(qpn(),tct)?won(n,0,p,w,v):won(n,w,p,n.d-1,v)):(d=CJ((b+u.c)/n.a),WB(n.f,new x_(h,iln(w),iln(d))),c==(qpn(),Zrt)?won(n,w,0,d,p):won(n,w,p,d,n.c-1))}}function Dqn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y;for(l=new Np,c=new Np,d=null,u=t.Kc();u.Ob();)a=new Hd(BB(u.Pb(),19).a),c.c[c.c.length]=a,d&&(a.d=d,d.e=a),d=a;for(m=zFn(n),h=0;h<c.c.length;++h){for(b=null,g=D6((l1(0,c.c.length),BB(c.c[0],652))),i=null,r=RQn,f=1;f<n.b.c.length;++f)p=g?e.Math.abs(g.b-f):e.Math.abs(f-b.b)+1,(w=b?e.Math.abs(f-b.b):p+1)<p?(s=b,o=w):(s=g,o=p),y=Gy(MD(mMn(n,(HXn(),Hpt)))),(v=m[f]+e.Math.pow(o,y))<r&&(r=v,(i=s).c=f),g&&f==g.b&&(b=g,g=xz(g));i&&(WB(l,iln(i.c)),i.a=!0,vln(i))}return SQ(),yG(l.c,l.c.length,null),l}function Rqn(n){var t,e,i,r,c,a,u,o,s,h;for(t=new To,e=new To,s=mK(K9n,(r=N_n(n.b,_9n))?SD(cdn((!r.b&&(r.b=new Jx((gWn(),k$t),X$t,r)),r.b),F9n)):null),o=0;o<n.i;++o)cL(u=BB(n.g[o],170),99)?0!=((a=BB(u,18)).Bb&h6n)?(0==(a.Bb&hVn)||!s&&null==((c=N_n(a,_9n))?SD(cdn((!c.b&&(c.b=new Jx((gWn(),k$t),X$t,c)),c.b),n8n)):null))&&f9(t,a):(h=Cvn(a))&&0!=(h.Bb&h6n)||(0==(a.Bb&hVn)||!s&&null==((i=N_n(a,_9n))?SD(cdn((!i.b&&(i.b=new Jx((gWn(),k$t),X$t,i)),i.b),n8n)):null))&&f9(e,a):(ZM(),BB(u,66).Oj()&&(u.Jj()||(f9(t,u),f9(e,u))));chn(t),chn(e),n.a=BB(t.g,247),BB(e.g,247)}function Kqn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b;for(o=xSn(t),BB(mMn(t,(HXn(),qdt)),314)!=(Oin(),hht)&&e5(o,new vt),e5(o,new Dw(BB(mMn(t,Rdt),292))),b=0,s=new Np,r=new bV(o);r.a!=r.b;)i=BB(_hn(r),37),$Gn(n.c,i),b+=(f=BB(mMn(i,(hWn(),Mlt)),15)).gc(),WB(s,new rI(i,f.Kc()));for(OTn(e,"Recursive hierarchical layout",b),l=BB(BB(xq(s,s.c.length-1),46).b,47);l.Ob();)for(u=new Wb(s);u.a<u.c.c.length;)for(a=BB(n0(u),46),f=BB(a.b,47),c=BB(a.a,37);f.Ob();){if(cL(h=BB(f.Pb(),51),507)){if(c.e)break;h.pf(c,mcn(e,1));break}h.pf(c,mcn(e,1))}HSn(e)}function _qn(n,t){var e,i,r,c,a,u,o,s;if(b1(u=t.length-1,t.length),93==(a=t.charCodeAt(u))){if((c=GO(t,YTn(91)))>=0)return r=dbn(n,t.substr(1,c-1)),YUn(n,t.substr(c+1,u-(c+1)),r)}else{if(e=-1,null==Ett&&(Ett=new RegExp("\\d")),Ett.test(String.fromCharCode(a))&&(e=MK(t,YTn(46),u-1))>=0){i=BB(V5(n,Ptn(n,t.substr(1,e-1)),!1),58),o=0;try{o=l_n(t.substr(e+1),_Vn,DWn)}catch(h){throw cL(h=lun(h),127)?Hp(new L7(h)):Hp(h)}if(o<i.gc())return cL(s=i.Xb(o),72)&&(s=BB(s,72).dd()),BB(s,56)}if(e<0)return BB(V5(n,Ptn(n,t.substr(1)),!1),56)}return null}function Fqn(n,t,e){var i,r,c,a,u,o,s;if(Awn(t,e)>=0)return e;switch(DW(B7(n,e))){case 2:if(mK("",Cfn(n,e.Hj()).ne())){if(o=m$n(n,t,u=jV(B7(n,e)),kV(B7(n,e))))return o;for(a=0,s=(r=jKn(n,t)).gc();a<s;++a)if(aNn(OU(B7(n,o=BB(r.Xb(a),170))),u))return o}return null;case 4:if(mK("",Cfn(n,e.Hj()).ne())){for(i=e;i;i=J1(B7(n,i)))if(o=y$n(n,t,jV(B7(n,i)),kV(B7(n,i))))return o;if(u=jV(B7(n,e)),mK(S7n,u))return mjn(n,t);for(a=0,s=(c=EKn(n,t)).gc();a<s;++a)if(aNn(OU(B7(n,o=BB(c.Xb(a),170))),u))return o}return null;default:return null}}function Bqn(n,t,e){var i,r,c,a,u,o,s,h;if(0==e.gc())return!1;if(ZM(),c=(u=BB(t,66).Oj())?e:new gtn(e.gc()),$xn(n.e,t)){if(t.hi())for(s=e.Kc();s.Ob();)UFn(n,t,o=s.Pb(),cL(t,99)&&0!=(BB(t,18).Bb&BQn))||(r=Z3(t,o),c.Hc(r)||c.Fc(r));else if(!u)for(s=e.Kc();s.Ob();)r=Z3(t,o=s.Pb()),c.Fc(r)}else{if(e.gc()>1)throw Hp(new _y(I7n));for(h=axn(n.e.Tg(),t),i=BB(n.g,119),a=0;a<n.i;++a)if(r=i[a],h.rl(r.ak())){if(e.Hc(u?r:r.dd()))return!1;for(s=e.Kc();s.Ob();)o=s.Pb(),BB(ovn(n,a,u?BB(o,72):Z3(t,o)),72);return!0}u||(r=Z3(t,e.Kc().Pb()),c.Fc(r))}return pX(n,c)}function Hqn(n,t){var i,r,c,a,u,o,s;for(s=new YT,o=new Kb(new Ob(n.c).a.vc().Kc());o.a.Ob();)c=BB(o.a.Pb(),42),0==(a=BB(c.dd(),458)).b&&r5(s,a,s.c.b,s.c);for(;0!=s.b;)for(null==(a=BB(0==s.b?null:(Px(0!=s.b),Atn(s,s.a.a)),458)).a&&(a.a=0),r=new Wb(a.d);r.a<r.c.c.length;)null==(i=BB(n0(r),654)).b.a?i.b.a=Gy(a.a)+i.a:t.o==(oZ(),ryt)?i.b.a=e.Math.min(Gy(i.b.a),Gy(a.a)+i.a):i.b.a=e.Math.max(Gy(i.b.a),Gy(a.a)+i.a),--i.b.b,0==i.b.b&&DH(s,i.b);for(u=new Kb(new Ob(n.c).a.vc().Kc());u.a.Ob();)c=BB(u.a.Pb(),42),a=BB(c.dd(),458),t.i[a.c.p]=a.a}function qqn(){qqn=O,skt=new up(OZn),new up(AZn),new iR("DEPTH",iln(0)),ikt=new iR("FAN",iln(0)),tkt=new iR(U3n,iln(0)),dkt=new iR("ROOT",(hN(),!1)),ckt=new iR("LEFTNEIGHBOR",null),bkt=new iR("RIGHTNEIGHBOR",null),akt=new iR("LEFTSIBLING",null),wkt=new iR("RIGHTSIBLING",null),ekt=new iR("DUMMY",!1),new iR("LEVEL",iln(0)),lkt=new iR("REMOVABLE_EDGES",new YT),gkt=new iR("XCOOR",iln(0)),pkt=new iR("YCOOR",iln(0)),ukt=new iR("LEVELHEIGHT",0),rkt=new iR("ID",""),hkt=new iR("POSITION",iln(0)),fkt=new iR("PRELIM",0),okt=new iR("MODIFIER",0),nkt=new up($Zn),Zyt=new up(LZn)}function Gqn(n,t,i,r){var c,a,u,o,s,h,f,l,b,w;for(f=i+t.c.c.a,w=new Wb(t.j);w.a<w.c.c.length;){if(b=BB(n0(w),11),c=Aon(Pun(Gk(PMt,1),sVn,8,0,[b.i.n,b.n,b.a])),t.k==(uSn(),Iut)&&(o=BB(mMn(b,(hWn(),dlt)),11),c.a=Aon(Pun(Gk(PMt,1),sVn,8,0,[o.i.n,o.n,o.a])).a,t.n.a=c.a),u=new xC(0,c.b),b.j==(kUn(),oIt))u.a=f;else{if(b.j!=CIt)continue;u.a=i}if(!(e.Math.abs(c.a-u.a)<=r)||Nkn(t))for(a=b.g.c.length+b.e.c.length>1,h=new m6(b.b);y$(h.a)||y$(h.b);)l=(s=BB(y$(h.a)?n0(h.a):n0(h.b),17)).c==b?s.d:s.c,e.Math.abs(Aon(Pun(Gk(PMt,1),sVn,8,0,[l.i.n,l.n,l.a])).b-u.b)>1&&pxn(n,s,u,a,b)}}function zqn(n){var t,i,r,c,a,u;if(c=new M2(n.e,0),r=new M2(n.a,0),n.d)for(i=0;i<n.b;i++)Px(c.b<c.d.gc()),c.d.Xb(c.c=c.b++);else for(i=0;i<n.b-1;i++)Px(c.b<c.d.gc()),c.d.Xb(c.c=c.b++),fW(c);for(t=Gy((Px(c.b<c.d.gc()),MD(c.d.Xb(c.c=c.b++))));n.f-t>D3n;){for(a=t,u=0;e.Math.abs(t-a)<D3n;)++u,t=Gy((Px(c.b<c.d.gc()),MD(c.d.Xb(c.c=c.b++)))),Px(r.b<r.d.gc()),r.d.Xb(r.c=r.b++);u<n.b&&(Px(c.b>0),c.a.Xb(c.c=--c.b),DFn(n,n.b-u,a,r,c),Px(c.b<c.d.gc()),c.d.Xb(c.c=c.b++)),Px(r.b>0),r.a.Xb(r.c=--r.b)}if(!n.d)for(i=0;i<n.b-1;i++)Px(c.b<c.d.gc()),c.d.Xb(c.c=c.b++),fW(c);n.d=!0,n.c=!0}function Uqn(){Uqn=O,pLt=(cE(),gLt).b,yLt=BB(Wtn(QQ(gLt.b),0),34),vLt=BB(Wtn(QQ(gLt.b),1),34),mLt=BB(Wtn(QQ(gLt.b),2),34),OLt=gLt.bb,BB(Wtn(QQ(gLt.bb),0),34),BB(Wtn(QQ(gLt.bb),1),34),$Lt=gLt.fb,LLt=BB(Wtn(QQ(gLt.fb),0),34),BB(Wtn(QQ(gLt.fb),1),34),BB(Wtn(QQ(gLt.fb),2),18),xLt=gLt.qb,KLt=BB(Wtn(QQ(gLt.qb),0),34),BB(Wtn(QQ(gLt.qb),1),18),BB(Wtn(QQ(gLt.qb),2),18),DLt=BB(Wtn(QQ(gLt.qb),3),34),RLt=BB(Wtn(QQ(gLt.qb),4),34),FLt=BB(Wtn(QQ(gLt.qb),6),34),_Lt=BB(Wtn(QQ(gLt.qb),5),18),kLt=gLt.j,jLt=gLt.k,ELt=gLt.q,TLt=gLt.w,MLt=gLt.B,SLt=gLt.A,PLt=gLt.C,CLt=gLt.D,ILt=gLt._,ALt=gLt.cb,NLt=gLt.hb}function Xqn(n,t,i){var r,c,a,u,o,s,h,f,l;n.c=0,n.b=0,r=2*t.c.a.c.length+1;n:for(h=i.Kc();h.Ob();){if(l=0,u=(s=BB(h.Pb(),11)).j==(kUn(),sIt)||s.j==SIt){if(!(f=BB(mMn(s,(hWn(),Elt)),10)))continue;l+=iRn(n,r,s,f)}else{for(o=new Wb(s.g);o.a<o.c.c.length;){if((c=BB(n0(o),17).d).i.c==t.c){WB(n.a,s);continue n}l+=n.g[c.p]}for(a=new Wb(s.e);a.a<a.c.c.length;){if((c=BB(n0(a),17).c).i.c==t.c){WB(n.a,s);continue n}l-=n.g[c.p]}}s.e.c.length+s.g.c.length>0?(n.f[s.p]=l/(s.e.c.length+s.g.c.length),n.c=e.Math.min(n.c,n.f[s.p]),n.b=e.Math.max(n.b,n.f[s.p])):u&&(n.f[s.p]=l)}}function Wqn(n){n.b=null,n.bb=null,n.fb=null,n.qb=null,n.a=null,n.c=null,n.d=null,n.e=null,n.f=null,n.n=null,n.M=null,n.L=null,n.Q=null,n.R=null,n.K=null,n.db=null,n.eb=null,n.g=null,n.i=null,n.j=null,n.k=null,n.gb=null,n.o=null,n.p=null,n.q=null,n.r=null,n.$=null,n.ib=null,n.S=null,n.T=null,n.t=null,n.s=null,n.u=null,n.v=null,n.w=null,n.B=null,n.A=null,n.C=null,n.D=null,n.F=null,n.G=null,n.H=null,n.I=null,n.J=null,n.P=null,n.Z=null,n.U=null,n.V=null,n.W=null,n.X=null,n.Y=null,n._=null,n.ab=null,n.cb=null,n.hb=null,n.nb=null,n.lb=null,n.mb=null,n.ob=null,n.pb=null,n.jb=null,n.kb=null,n.N=!1,n.O=!1}function Vqn(n,t,e){var i,r;for(OTn(e,"Graph transformation ("+n.a+")",1),r=a0(t.a),i=new Wb(t.b);i.a<i.c.c.length;)gun(r,BB(n0(i),29).a);if(BB(mMn(t,(HXn(),Xdt)),419)==(_nn(),Sht))switch(BB(mMn(t,Udt),103).g){case 2:L2(t,r);break;case 3:bdn(t,r);break;case 4:n.a==(Srn(),qut)?(bdn(t,r),$2(t,r)):($2(t,r),bdn(t,r))}else if(n.a==(Srn(),qut))switch(BB(mMn(t,Udt),103).g){case 2:L2(t,r),$2(t,r);break;case 3:bdn(t,r),L2(t,r);break;case 4:L2(t,r),bdn(t,r)}else switch(BB(mMn(t,Udt),103).g){case 2:L2(t,r),$2(t,r);break;case 3:L2(t,r),bdn(t,r);break;case 4:bdn(t,r),L2(t,r)}HSn(e)}function Qqn(n,t,e){var i,r,c,a,u,o,s,f,l,b,w;for(o=new fA,s=new fA,b=new fA,w=new fA,u=Gy(MD(mMn(t,(HXn(),Opt)))),r=Gy(MD(mMn(t,ypt))),a=new Wb(e);a.a<a.c.c.length;)if(c=BB(n0(a),10),(f=BB(mMn(c,(hWn(),Qft)),61))==(kUn(),sIt))for(s.a.zc(c,s),i=new oz(ZL(fbn(c).a.Kc(),new h));dAn(i);)TU(o,BB(U5(i),17).c.i);else if(f==SIt)for(w.a.zc(c,w),i=new oz(ZL(fbn(c).a.Kc(),new h));dAn(i);)TU(b,BB(U5(i),17).c.i);0!=o.a.gc()&&(l=AGn(new fX(2,r),t,o,s,-u-t.c.b))>0&&(n.a=u+(l-1)*r,t.c.b+=n.a,t.f.b+=n.a),0!=b.a.gc()&&(l=AGn(new fX(1,r),t,b,w,t.f.b+u-t.c.b))>0&&(t.f.b+=u+(l-1)*r)}function Yqn(n,t){var e,i,r,c;c=n.F,null==t?(n.F=null,Dsn(n,null)):(n.F=(kW(t),t),-1!=(i=GO(t,YTn(60)))?(r=t.substr(0,i),-1==GO(t,YTn(46))&&!mK(r,$Wn)&&!mK(r,S9n)&&!mK(r,P9n)&&!mK(r,C9n)&&!mK(r,I9n)&&!mK(r,O9n)&&!mK(r,A9n)&&!mK(r,$9n)&&(r=L9n),-1!=(e=mN(t,YTn(62)))&&(r+=""+t.substr(e+1)),Dsn(n,r)):(r=t,-1==GO(t,YTn(46))&&(-1!=(i=GO(t,YTn(91)))&&(r=t.substr(0,i)),mK(r,$Wn)||mK(r,S9n)||mK(r,P9n)||mK(r,C9n)||mK(r,I9n)||mK(r,O9n)||mK(r,A9n)||mK(r,$9n)?r=t:(r=L9n,-1!=i&&(r+=""+t.substr(i)))),Dsn(n,r),r==t&&(n.F=n.D))),0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,5,c,t))}function Jqn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m;if(!((d=t.b.c.length)<3)){for(b=x8(ANt,hQn,25,d,15,1),f=0,h=new Wb(t.b);h.a<h.c.c.length;)s=BB(n0(h),29),b[f++]=s.a.c.length;for(l=new M2(t.b,2),i=1;i<d-1;i++)for(Px(l.b<l.d.gc()),w=new Wb((e=BB(l.d.Xb(l.c=l.b++),29)).a),c=0,u=0,o=0;o<b[i+1];o++)if(m=BB(n0(w),10),o==b[i+1]-1||YSn(n,m,i+1,i)){for(a=b[i]-1,YSn(n,m,i+1,i)&&(a=n.c.e[BB(BB(BB(xq(n.c.b,m.p),15).Xb(0),46).a,10).p]);u<=o;){if(!YSn(n,v=BB(xq(e.a,u),10),i+1,i))for(p=BB(xq(n.c.b,v.p),15).Kc();p.Ob();)g=BB(p.Pb(),46),((r=n.c.e[BB(g.a,10).p])<c||r>a)&&TU(n.b,BB(g.b,17));++u}c=a}}}function Zqn(n,t){var e;if(null==t||mK(t,zWn))return null;if(0==t.length&&n.k!=(PPn(),pMt))return null;switch(n.k.g){case 1:return mgn(t,a5n)?(hN(),vtt):mgn(t,u5n)?(hN(),ptt):null;case 2:try{return iln(l_n(t,_Vn,DWn))}catch(i){if(cL(i=lun(i),127))return null;throw Hp(i)}case 4:try{return bSn(t)}catch(i){if(cL(i=lun(i),127))return null;throw Hp(i)}case 3:return t;case 5:return rhn(n),HIn(n,t);case 6:return rhn(n),K$n(n,n.a,t);case 7:try{return(e=rAn(n)).Jf(t),e}catch(i){if(cL(i=lun(i),32))return null;throw Hp(i)}default:throw Hp(new Fy("Invalid type set for this layout option."))}}function nGn(n){var t,e,i,r,c,a,u;for(Dnn(),u=new Vv,e=new Wb(n);e.a<e.c.c.length;)t=BB(n0(e),140),(!u.b||t.c>=u.b.c)&&(u.b=t),(!u.c||t.c<=u.c.c)&&(u.d=u.c,u.c=t),(!u.e||t.d>=u.e.d)&&(u.e=t),(!u.f||t.d<=u.f.d)&&(u.f=t);return i=new Tpn((Aun(),Zat)),i2(n,out,new Jy(Pun(Gk(Jat,1),HWn,369,0,[i]))),a=new Tpn(eut),i2(n,uut,new Jy(Pun(Gk(Jat,1),HWn,369,0,[a]))),r=new Tpn(nut),i2(n,aut,new Jy(Pun(Gk(Jat,1),HWn,369,0,[r]))),c=new Tpn(tut),i2(n,cut,new Jy(Pun(Gk(Jat,1),HWn,369,0,[c]))),xLn(i.c,Zat),xLn(r.c,nut),xLn(c.c,tut),xLn(a.c,eut),u.a.c=x8(Ant,HWn,1,0,5,1),gun(u.a,i.c),gun(u.a,ean(r.c)),gun(u.a,c.c),gun(u.a,ean(a.c)),u}function tGn(n){var t;switch(n.d){case 1:if(n.hj())return-2!=n.o;break;case 2:if(n.hj())return-2==n.o;break;case 3:case 5:case 4:case 6:case 7:return n.o>-2;default:return!1}switch(t=n.gj(),n.p){case 0:return null!=t&&qy(TD(t))!=JI(n.k,0);case 1:return null!=t&&BB(t,217).a!=dG(n.k)<<24>>24;case 2:return null!=t&&BB(t,172).a!=(dG(n.k)&QVn);case 6:return null!=t&&JI(BB(t,162).a,n.k);case 5:return null!=t&&BB(t,19).a!=dG(n.k);case 7:return null!=t&&BB(t,184).a!=dG(n.k)<<16>>16;case 3:return null!=t&&Gy(MD(t))!=n.j;case 4:return null!=t&&BB(t,155).a!=n.j;default:return null==t?null!=n.n:!Nfn(t,n.n)}}function eGn(n,t,e){var i,r,c,a;return n.Fk()&&n.Ek()&&GI(a=Gz(n,BB(e,56)))!==GI(e)?(n.Oi(t),n.Ui(t,B9(n,t,a)),n.rk()&&(r=BB(e,49),c=n.Dk()?n.Bk()?r.ih(n.b,Cvn(BB(itn(jY(n.b),n.aj()),18)).n,BB(itn(jY(n.b),n.aj()).Yj(),26).Bj(),null):r.ih(n.b,Awn(r.Tg(),Cvn(BB(itn(jY(n.b),n.aj()),18))),null,null):r.ih(n.b,-1-n.aj(),null,null),!BB(a,49).eh()&&(i=BB(a,49),c=n.Dk()?n.Bk()?i.gh(n.b,Cvn(BB(itn(jY(n.b),n.aj()),18)).n,BB(itn(jY(n.b),n.aj()).Yj(),26).Bj(),c):i.gh(n.b,Awn(i.Tg(),Cvn(BB(itn(jY(n.b),n.aj()),18))),null,c):i.gh(n.b,-1-n.aj(),null,c)),c&&c.Fi()),mA(n.b)&&n.$i(n.Zi(9,e,a,t,!1)),a):e}function iGn(n,t,i){var r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k;for(f=Gy(MD(mMn(n,(HXn(),Ept)))),r=Gy(MD(mMn(n,Rpt))),hon(b=new Yu,Ept,f+r),v=(h=t).d,g=h.c.i,m=h.d.i,p=tA(g.c),y=tA(m.c),c=new Np,l=p;l<=y;l++)Bl(o=new $vn(n),(uSn(),Put)),hon(o,(hWn(),dlt),h),hon(o,ept,(QEn(),XCt)),hon(o,Mpt,b),w=BB(xq(n.b,l),29),l==p?Qyn(o,w.a.c.length-i,w):PZ(o,w),(k=Gy(MD(mMn(h,agt))))<0&&hon(h,agt,k=0),o.o.b=k,d=e.Math.floor(k/2),qCn(u=new CSn,(kUn(),CIt)),CZ(u,o),u.n.b=d,qCn(s=new CSn,oIt),CZ(s,o),s.n.b=d,MZ(h,u),qan(a=new wY,h),hon(a,vgt,null),SZ(a,s),MZ(a,v),zkn(o,h,a),c.c[c.c.length]=a,h=a;return c}function rGn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g;for(u=BB(DSn(n,(kUn(),CIt)).Kc().Pb(),11).e,f=BB(DSn(n,oIt).Kc().Pb(),11).g,a=u.c.length,g=g1(BB(xq(n.j,0),11));a-- >0;){for(l1(0,u.c.length),b=BB(u.c[0],17),l1(0,f.c.length),r=E7((i=BB(f.c[0],17)).d.e,i,0),A2(b,i.d,r),SZ(i,null),MZ(i,null),l=b.a,t&&DH(l,new wA(g)),e=spn(i.a,0);e.b!=e.d.c;)DH(l,new wA(BB(b3(e),8)));for(d=b.b,h=new Wb(i.b);h.a<h.c.c.length;)s=BB(n0(h),70),d.c[d.c.length]=s;if(w=BB(mMn(b,(HXn(),vgt)),74),c=BB(mMn(i,vgt),74))for(w||(w=new km,hon(b,vgt,w)),o=spn(c,0);o.b!=o.d.c;)DH(w,new wA(BB(b3(o),8)))}}function cGn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w;if(i=BB(oV(n.b,t),124),(s=BB(BB(h6(n.r,t),21),84)).dc())return i.n.b=0,void(i.n.c=0);for(h=n.u.Hc((lIn(),eIt)),u=0,o=s.Kc(),f=null,l=0,b=0;o.Ob();)c=Gy(MD((r=BB(o.Pb(),111)).b.We((DN(),Lrt)))),a=r.b.rf().a,n.A.Hc((mdn(),_It))&&yRn(n,t),f?(w=b+f.d.c+n.w+r.d.b,u=e.Math.max(u,(h$(),rin(fJn),e.Math.abs(l-c)<=fJn||l==c||isNaN(l)&&isNaN(c)?0:w/(c-l)))):n.C&&n.C.b>0&&(u=e.Math.max(u,lcn(n.C.b+r.d.b,c))),f=r,l=c,b=a;n.C&&n.C.c>0&&(w=b+n.C.c,h&&(w+=f.d.c),u=e.Math.max(u,(h$(),rin(fJn),e.Math.abs(l-1)<=fJn||1==l||isNaN(l)&&isNaN(1)?0:w/(1-l)))),i.n.b=0,i.a.a=u}function aGn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w;if(i=BB(oV(n.b,t),124),(s=BB(BB(h6(n.r,t),21),84)).dc())return i.n.d=0,void(i.n.a=0);for(h=n.u.Hc((lIn(),eIt)),u=0,n.A.Hc((mdn(),_It))&&kRn(n,t),o=s.Kc(),f=null,b=0,l=0;o.Ob();)a=Gy(MD((r=BB(o.Pb(),111)).b.We((DN(),Lrt)))),c=r.b.rf().b,f?(w=l+f.d.a+n.w+r.d.d,u=e.Math.max(u,(h$(),rin(fJn),e.Math.abs(b-a)<=fJn||b==a||isNaN(b)&&isNaN(a)?0:w/(a-b)))):n.C&&n.C.d>0&&(u=e.Math.max(u,lcn(n.C.d+r.d.d,a))),f=r,b=a,l=c;n.C&&n.C.a>0&&(w=l+n.C.a,h&&(w+=f.d.a),u=e.Math.max(u,(h$(),rin(fJn),e.Math.abs(b-1)<=fJn||1==b||isNaN(b)&&isNaN(1)?0:w/(1-b)))),i.n.d=0,i.a.b=u}function uGn(n,t,e){var i,r,c,a,u,o;for(this.g=n,u=t.d.length,o=e.d.length,this.d=x8(Out,a1n,10,u+o,0,1),a=0;a<u;a++)this.d[a]=t.d[a];for(c=0;c<o;c++)this.d[u+c]=e.d[c];if(t.e){if(this.e=zB(t.e),this.e.Mc(e),e.e)for(r=e.e.Kc();r.Ob();)(i=BB(r.Pb(),233))!=t&&(this.e.Hc(i)?--i.c:this.e.Fc(i))}else e.e&&(this.e=zB(e.e),this.e.Mc(t));this.f=t.f+e.f,this.a=t.a+e.a,this.a>0?Jtn(this,this.f/this.a):null!=lL(t.g,t.d[0]).a&&null!=lL(e.g,e.d[0]).a?Jtn(this,(Gy(lL(t.g,t.d[0]).a)+Gy(lL(e.g,e.d[0]).a))/2):null!=lL(t.g,t.d[0]).a?Jtn(this,lL(t.g,t.d[0]).a):null!=lL(e.g,e.d[0]).a&&Jtn(this,lL(e.g,e.d[0]).a)}function oGn(n,t){var e,i,r,c,a,u,o,s,h;for(n.a=new BX($cn(WPt)),i=new Wb(t.a);i.a<i.c.c.length;){for(e=BB(n0(i),841),a=new Pgn(Pun(Gk(Qat,1),HWn,81,0,[])),WB(n.a.a,a),o=new Wb(e.d);o.a<o.c.c.length;)FGn(s=new NN(n,u=BB(n0(o),110)),BB(mMn(e.c,(hWn(),Xft)),21)),hU(n.g,e)||(VW(n.g,e,new xC(u.c,u.d)),VW(n.f,e,s)),WB(n.a.b,s),g2(a,s);for(c=new Wb(e.b);c.a<c.c.c.length;)s=new NN(n,(r=BB(n0(c),594)).kf()),VW(n.b,r,new rI(a,s)),FGn(s,BB(mMn(e.c,(hWn(),Xft)),21)),r.hf()&&(FGn(h=new Sgn(n,r.hf(),1),BB(mMn(e.c,Xft),21)),g2(new Pgn(Pun(Gk(Qat,1),HWn,81,0,[])),h),JIn(n.c,r.gf(),new rI(a,h)))}return n.a}function sGn(n){var t;this.a=n,t=(uSn(),Pun(Gk($ut,1),$Vn,267,0,[Cut,Put,Mut,Iut,Sut,Tut])).length,this.b=kq(lMt,[sVn,k3n],[593,146],0,[t,t],2),this.c=kq(lMt,[sVn,k3n],[593,146],0,[t,t],2),FY(this,Cut,(HXn(),Opt),Apt),tun(this,Cut,Put,Ept,Tpt),_Y(this,Cut,Iut,Ept),_Y(this,Cut,Mut,Ept),tun(this,Cut,Sut,Opt,Apt),FY(this,Put,ypt,kpt),_Y(this,Put,Iut,ypt),_Y(this,Put,Mut,ypt),tun(this,Put,Sut,Ept,Tpt),ZA(this,Iut,ypt),_Y(this,Iut,Mut,ypt),_Y(this,Iut,Sut,Ppt),ZA(this,Mut,Npt),tun(this,Mut,Sut,Ipt,Cpt),FY(this,Sut,ypt,ypt),FY(this,Tut,ypt,kpt),tun(this,Tut,Cut,Ept,Tpt),tun(this,Tut,Sut,Ept,Tpt),tun(this,Tut,Put,Ept,Tpt)}function hGn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b,w,d,g;if(cL(a=e.ak(),99)&&0!=(BB(a,18).Bb&BQn)&&(l=BB(e.dd(),49),(d=tfn(n.e,l))!=l)){if(jL(n,t,sTn(n,t,h=Z3(a,d))),f=null,mA(n.e)&&(i=Fqn((IPn(),Z$t),n.e.Tg(),a))!=itn(n.e.Tg(),n.c)){for(g=axn(n.e.Tg(),a),u=0,c=BB(n.g,119),o=0;o<t;++o)r=c[o],g.rl(r.ak())&&++u;(f=new b4(n.e,9,i,l,d,u,!1)).Ei(new N7(n.e,9,n.c,e,h,t,!1))}return(b=Cvn(w=BB(a,18)))?(f=l.ih(n.e,Awn(l.Tg(),b),null,f),f=BB(d,49).gh(n.e,Awn(d.Tg(),b),null,f)):0!=(w.Bb&h6n)&&(s=-1-Awn(n.e.Tg(),w),f=l.ih(n.e,s,null,null),!BB(d,49).eh()&&(f=BB(d,49).gh(n.e,s,null,f))),f&&f.Fi(),h}return e}function fGn(n){var t,i,r,c,a,u,o,s;for(a=new Wb(n.a.b);a.a<a.c.c.length;)(c=BB(n0(a),81)).b.c=c.g.c,c.b.d=c.g.d;for(s=new xC(RQn,RQn),t=new xC(KQn,KQn),r=new Wb(n.a.b);r.a<r.c.c.length;)i=BB(n0(r),81),s.a=e.Math.min(s.a,i.g.c),s.b=e.Math.min(s.b,i.g.d),t.a=e.Math.max(t.a,i.g.c+i.g.b),t.b=e.Math.max(t.b,i.g.d+i.g.a);for(o=TX(n.c).a.nc();o.Ob();)u=BB(o.Pb(),46),i=BB(u.b,81),s.a=e.Math.min(s.a,i.g.c),s.b=e.Math.min(s.b,i.g.d),t.a=e.Math.max(t.a,i.g.c+i.g.b),t.b=e.Math.max(t.b,i.g.d+i.g.a);n.d=qx(new xC(s.a,s.b)),n.e=XR(new xC(t.a,t.b),s),n.a.a.c=x8(Ant,HWn,1,0,5,1),n.a.b.c=x8(Ant,HWn,1,0,5,1)}function lGn(n){var t,e,i;for(ksn(lAt,Pun(Gk(_it,1),HWn,130,0,[new Nf])),e=new Tl(n),i=0;i<e.a.length;++i)mK(t=dnn(e,i).je().a,"layered")?ksn(lAt,Pun(Gk(_it,1),HWn,130,0,[new hf])):mK(t,"force")?ksn(lAt,Pun(Gk(_it,1),HWn,130,0,[new zh])):mK(t,"stress")?ksn(lAt,Pun(Gk(_it,1),HWn,130,0,[new Xh])):mK(t,"mrtree")?ksn(lAt,Pun(Gk(_it,1),HWn,130,0,[new Pf])):mK(t,"radial")?ksn(lAt,Pun(Gk(_it,1),HWn,130,0,[new yf])):mK(t,"disco")?ksn(lAt,Pun(Gk(_it,1),HWn,130,0,[new Gh,new Hh])):mK(t,"sporeOverlap")||mK(t,"sporeCompaction")?ksn(lAt,Pun(Gk(_it,1),HWn,130,0,[new Tf])):mK(t,"rectpacking")&&ksn(lAt,Pun(Gk(_it,1),HWn,130,0,[new Of]))}function bGn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p;if(l=new wA(n.o),p=t.a/l.a,u=t.b/l.b,d=t.a-l.a,c=t.b-l.b,e)for(r=GI(mMn(n,(HXn(),ept)))===GI((QEn(),XCt)),w=new Wb(n.j);w.a<w.c.c.length;)switch((b=BB(n0(w),11)).j.g){case 1:r||(b.n.a*=p);break;case 2:b.n.a+=d,r||(b.n.b*=u);break;case 3:r||(b.n.a*=p),b.n.b+=c;break;case 4:r||(b.n.b*=u)}for(s=new Wb(n.b);s.a<s.c.c.length;)h=(o=BB(n0(s),70)).n.a+o.o.a/2,f=o.n.b+o.o.b/2,(g=h/l.a)+(a=f/l.b)>=1&&(g-a>0&&f>=0?(o.n.a+=d,o.n.b+=c*a):g-a<0&&h>=0&&(o.n.a+=d*g,o.n.b+=c));n.o.a=t.a,n.o.b=t.b,hon(n,(HXn(),Fgt),(mdn(),new YK(i=BB(Vj(YIt),9),BB(SR(i,i.length),9),0)))}function wGn(n,t,e,i,r,c){if(null!=t&&Xbn(t,AAt,$At))throw Hp(new _y("invalid scheme: "+t));if(!(n||null!=e&&-1==GO(e,YTn(35))&&e.length>0&&(b1(0,e.length),47!=e.charCodeAt(0))))throw Hp(new _y("invalid opaquePart: "+e));if(n&&(null==t||!xT(jAt,t.toLowerCase()))&&null!=e&&Xbn(e,LAt,NAt))throw Hp(new _y(o9n+e));if(n&&null!=t&&xT(jAt,t.toLowerCase())&&!CEn(e))throw Hp(new _y(o9n+e));if(!Ubn(i))throw Hp(new _y("invalid device: "+i));if(!Rhn(r))throw Hp(new _y(null==r?"invalid segments: null":"invalid segment: "+shn(r)));if(null!=c&&-1!=GO(c,YTn(35)))throw Hp(new _y("invalid query: "+c))}function dGn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v;for(OTn(t,"Calculate Graph Size",1),t.n&&n&&y0(t,o2(n),(Bsn(),uOt)),o=ZJn,s=ZJn,a=n4n,u=n4n,l=new AL((!n.a&&(n.a=new eU(UOt,n,10,11)),n.a));l.e!=l.i.gc();)d=(h=BB(kpn(l),33)).i,g=h.j,v=h.g,r=h.f,c=BB(ZAn(h,(sWn(),$St)),142),o=e.Math.min(o,d-c.b),s=e.Math.min(s,g-c.d),a=e.Math.max(a,d+v+c.c),u=e.Math.max(u,g+r+c.a);for(b=new xC(o-(w=BB(ZAn(n,(sWn(),XSt)),116)).b,s-w.d),f=new AL((!n.a&&(n.a=new eU(UOt,n,10,11)),n.a));f.e!=f.i.gc();)Pen(h=BB(kpn(f),33),h.i-b.a),Cen(h,h.j-b.b);p=a-o+(w.b+w.c),i=u-s+(w.d+w.a),Sen(n,p),Men(n,i),t.n&&n&&y0(t,o2(n),(Bsn(),uOt))}function gGn(n){var t,e,i,r,c,a,u,o,s,h;for(i=new Np,a=new Wb(n.e.a);a.a<a.c.c.length;){for(h=0,(r=BB(n0(a),121)).k.c=x8(Ant,HWn,1,0,5,1),e=new Wb(kbn(r));e.a<e.c.c.length;)(t=BB(n0(e),213)).f&&(WB(r.k,t),++h);1==h&&(i.c[i.c.length]=r)}for(c=new Wb(i);c.a<c.c.c.length;)for(r=BB(n0(c),121);1==r.k.c.length;){for(s=BB(n0(new Wb(r.k)),213),n.b[s.c]=s.g,u=s.d,o=s.e,e=new Wb(kbn(r));e.a<e.c.c.length;)Nfn(t=BB(n0(e),213),s)||(t.f?u==t.d||o==t.e?n.b[s.c]-=n.b[t.c]-t.g:n.b[s.c]+=n.b[t.c]-t.g:r==u?t.d==r?n.b[s.c]+=t.g:n.b[s.c]-=t.g:t.d==r?n.b[s.c]-=t.g:n.b[s.c]+=t.g);y7(u.k,s),y7(o.k,s),r=u==r?s.e:s.d}}function pGn(n,t){var e,i,r,c,a,u,o,s,h,f,l;if(null==t||0==t.length)return null;if(!(c=BB(SJ(n.f,t),23))){for(r=new Kb(new Ob(n.d).a.vc().Kc());r.a.Ob();)if(a=BB(r.a.Pb(),42),u=(e=BB(a.dd(),23)).f,l=t.length,mK(u.substr(u.length-l,l),t)&&(t.length==u.length||46==fV(u,u.length-t.length-1))){if(c)return null;c=e}if(!c)for(i=new Kb(new Ob(n.d).a.vc().Kc());i.a.Ob();)if(a=BB(i.a.Pb(),42),null!=(f=(e=BB(a.dd(),23)).g))for(s=0,h=(o=f).length;s<h;++s)if(u=o[s],l=t.length,mK(u.substr(u.length-l,l),t)&&(t.length==u.length||46==fV(u,u.length-t.length-1))){if(c)return null;c=e}c&&mZ(n.f,t,c)}return c}function vGn(n,t){var e,i,r,c,a;for(e=new Ik,a=!1,c=0;c<t.length;c++)if(b1(c,t.length),32!=(i=t.charCodeAt(c)))a?39==i?c+1<t.length&&(b1(c+1,t.length),39==t.charCodeAt(c+1))?(e.a+=String.fromCharCode(i),++c):a=!1:e.a+=String.fromCharCode(i):GO("GyMLdkHmsSEcDahKzZv",YTn(i))>0?(Ppn(n,e,0),e.a+=String.fromCharCode(i),Ppn(n,e,r=cgn(t,c)),c+=r-1):39==i?c+1<t.length&&(b1(c+1,t.length),39==t.charCodeAt(c+1))?(e.a+="'",++c):a=!0:e.a+=String.fromCharCode(i);else for(Ppn(n,e,0),e.a+=" ",Ppn(n,e,0);c+1<t.length&&(b1(c+1,t.length),32==t.charCodeAt(c+1));)++c;Ppn(n,e,0),pTn(n)}function mGn(n,t,i){var r,c,a,u,o,s,h,f,l,b,w,d,g,p;if(OTn(i,"Network simplex layering",1),n.b=t,p=4*BB(mMn(t,(HXn(),xpt)),19).a,(g=n.b.a).c.length<1)HSn(i);else{for(d=null,c=spn(a=IKn(n,g),0);c.b!=c.d.c;){for(r=BB(b3(c),15),o=p*CJ(e.Math.sqrt(r.gc())),WKn(Qk(Jk(Yk(B_(u=o_n(r)),o),d),!0),mcn(i,1)),l=n.b.b,w=new Wb(u.a);w.a<w.c.c.length;){for(b=BB(n0(w),121);l.c.length<=b.e;)kG(l,l.c.length,new HX(n.b));PZ(BB(b.f,10),BB(xq(l,b.e),29))}if(a.b>1)for(d=x8(ANt,hQn,25,n.b.b.c.length,15,1),f=0,h=new Wb(n.b.b);h.a<h.c.c.length;)s=BB(n0(h),29),d[f++]=s.a.c.length}g.c=x8(Ant,HWn,1,0,5,1),n.a=null,n.b=null,n.c=null,HSn(i)}}function yGn(n){var t,i,r,c,a,u,o;for(t=0,a=new Wb(n.b.a);a.a<a.c.c.length;)(r=BB(n0(a),189)).b=0,r.c=0;for(ESn(n,0),ewn(n,n.g),kNn(n.c),Zy(n.c),Ffn(),i=_Pt,DKn(eO(Mzn(DKn(eO(Mzn(DKn(Mzn(n.c,i)),jln(i)))),i))),Mzn(n.c,_Pt),Bln(n,n.g),kMn(n,0),pHn(n,0),M$n(n,1),ESn(n,1),ewn(n,n.d),kNn(n.c),u=new Wb(n.b.a);u.a<u.c.c.length;)r=BB(n0(u),189),t+=e.Math.abs(r.c);for(o=new Wb(n.b.a);o.a<o.c.c.length;)(r=BB(n0(o),189)).b=0,r.c=0;for(i=HPt,DKn(eO(Mzn(DKn(eO(Mzn(DKn(Zy(Mzn(n.c,i))),jln(i)))),i))),Mzn(n.c,_Pt),Bln(n,n.d),kMn(n,1),pHn(n,1),M$n(n,0),Zy(n.c),c=new Wb(n.b.a);c.a<c.c.c.length;)r=BB(n0(c),189),t+=e.Math.abs(r.c);return t}function kGn(n,t){var e,i,r,c,a,u,o,s,h;if(null!=(s=t).b&&null!=n.b){for(T$n(n),qHn(n),T$n(s),qHn(s),e=x8(ANt,hQn,25,n.b.length+s.b.length,15,1),h=0,i=0,a=0;i<n.b.length&&a<s.b.length;)if(r=n.b[i],c=n.b[i+1],u=s.b[a],o=s.b[a+1],c<u)i+=2;else if(c>=u&&r<=o)u<=r&&c<=o?(e[h++]=r,e[h++]=c,i+=2):u<=r?(e[h++]=r,e[h++]=o,n.b[i]=o+1,a+=2):c<=o?(e[h++]=u,e[h++]=c,i+=2):(e[h++]=u,e[h++]=o,n.b[i]=o+1);else{if(!(o<r))throw Hp(new dy("Token#intersectRanges(): Internal Error: ["+n.b[i]+","+n.b[i+1]+"] & ["+s.b[a]+","+s.b[a+1]+"]"));a+=2}for(;i<n.b.length;)e[h++]=n.b[i++],e[h++]=n.b[i++];n.b=x8(ANt,hQn,25,h,15,1),aHn(e,0,n.b,0,h)}}function jGn(n){var t,i,r,c,a,u,o;for(t=new Np,n.g=new Np,n.d=new Np,u=new usn(new Pb(n.f.b).a);u.b;)WB(t,BB(BB((a=ten(u)).dd(),46).b,81)),dA(BB(a.cd(),594).gf())?WB(n.d,BB(a.dd(),46)):WB(n.g,BB(a.dd(),46));for(ewn(n,n.d),ewn(n,n.g),n.c=new sOn(n.b),ej(n.c,(vM(),Gat)),Bln(n,n.d),Bln(n,n.g),gun(t,n.c.a.b),n.e=new xC(RQn,RQn),n.a=new xC(KQn,KQn),r=new Wb(t);r.a<r.c.c.length;)i=BB(n0(r),81),n.e.a=e.Math.min(n.e.a,i.g.c),n.e.b=e.Math.min(n.e.b,i.g.d),n.a.a=e.Math.max(n.a.a,i.g.c+i.g.b),n.a.b=e.Math.max(n.a.b,i.g.d+i.g.a);tj(n.c,new jt),o=0;do{c=yGn(n),++o}while((o<2||c>KVn)&&o<10);tj(n.c,new Et),yGn(n),IU(n.c),fGn(n.f)}function EGn(n,t,e){var i,r,c,a,u,o,s,h,f,l;if(qy(TD(mMn(e,(HXn(),wgt)))))for(r=new Wb(e.j);r.a<r.c.c.length;)for(u=0,o=(a=Z0(BB(n0(r),11).g)).length;u<o;++u)(c=a[u]).d.i==e&&qy(TD(mMn(c,dgt)))&&(h=c.c,(s=BB(RX(n.b,h),10))||(hon(s=bXn(h,(QEn(),QCt),h.j,-1,null,null,h.o,BB(mMn(t,Udt),103),t),(hWn(),dlt),h),VW(n.b,h,s),WB(t.a,s)),l=c.d,(f=BB(RX(n.b,l),10))||(hon(f=bXn(l,(QEn(),QCt),l.j,1,null,null,l.o,BB(mMn(t,Udt),103),t),(hWn(),dlt),l),VW(n.b,l,f),WB(t.a,f)),SZ(i=W5(c),BB(xq(s.j,0),11)),MZ(i,BB(xq(f.j,0),11)),JIn(n.a,c,new L_(i,t,(ain(),qvt))),BB(mMn(t,(hWn(),Zft)),21).Fc((bDn(),lft)))}function TGn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b,w;for(OTn(e,"Label dummy switching",1),i=BB(mMn(t,(HXn(),Vdt)),227),pcn(t),r=j$n(t,i),n.a=x8(xNt,qQn,25,t.b.c.length,15,1),$Pn(),h=0,b=(u=Pun(Gk(uht,1),$Vn,227,0,[Zst,tht,Jst,nht,eht,Yst])).length;h<b;++h)if(((c=u[h])==eht||c==Yst||c==nht)&&!BB(SN(r.a,c)?r.b[c.g]:null,15).dc()){Zcn(n,t);break}for(f=0,w=(o=Pun(Gk(uht,1),$Vn,227,0,[Zst,tht,Jst,nht,eht,Yst])).length;f<w;++f)(c=o[f])==eht||c==Yst||c==nht||GKn(n,BB(SN(r.a,c)?r.b[c.g]:null,15));for(s=0,l=(a=Pun(Gk(uht,1),$Vn,227,0,[Zst,tht,Jst,nht,eht,Yst])).length;s<l;++s)((c=a[s])==eht||c==Yst||c==nht)&&GKn(n,BB(SN(r.a,c)?r.b[c.g]:null,15));n.a=null,HSn(e)}function MGn(n,t){var e,i,r,c,a,u,o,s,h,f,l;switch(n.k.g){case 1:if(i=BB(mMn(n,(hWn(),dlt)),17),(e=BB(mMn(i,glt),74))?qy(TD(mMn(i,Clt)))&&(e=Jon(e)):e=new km,s=BB(mMn(n,hlt),11)){if(t<=(h=Aon(Pun(Gk(PMt,1),sVn,8,0,[s.i.n,s.n,s.a]))).a)return h.b;r5(e,h,e.a,e.a.a)}if(f=BB(mMn(n,flt),11)){if((l=Aon(Pun(Gk(PMt,1),sVn,8,0,[f.i.n,f.n,f.a]))).a<=t)return l.b;r5(e,l,e.c.b,e.c)}if(e.b>=2){for(a=BB(b3(o=spn(e,0)),8),u=BB(b3(o),8);u.a<t&&o.b!=o.d.c;)a=u,u=BB(b3(o),8);return a.b+(t-a.a)/(u.a-a.a)*(u.b-a.b)}break;case 3:switch(r=(c=BB(mMn(BB(xq(n.j,0),11),(hWn(),dlt)),11)).i,c.j.g){case 1:return r.n.b;case 3:return r.n.b+r.o.b}}return Fjn(n).b}function SGn(n){var t,e,i,r,c,a,u,o,s,f;for(c=new Wb(n.d.b);c.a<c.c.c.length;)for(u=new Wb(BB(n0(c),29).a);u.a<u.c.c.length;)!qy(TD(mMn(a=BB(n0(u),10),(HXn(),Tdt))))||h3(hbn(a))?(r=new UV(a.n.a-a.d.b,a.n.b-a.d.d,a.o.a+a.d.b+a.d.c,a.o.b+a.d.d+a.d.a),t=ON(iM(tM(eM(new Wv,a),r),dst),n.a),IN(nM(Xen(new Xv,Pun(Gk(bit,1),HWn,57,0,[t])),t),n.a),o=new Dp,VW(n.e,t,o),(e=F3(new oz(ZL(fbn(a).a.Kc(),new h)))-F3(new oz(ZL(lbn(a).a.Kc(),new h))))<0?Uun(o,!0,(Ffn(),_Pt)):e>0&&Uun(o,!0,(Ffn(),FPt)),a.k==(uSn(),Mut)&&wV(o),VW(n.f,a,t)):((s=(i=BB(iY(hbn(a)),17)).c.i)==a&&(s=i.d.i),f=new rI(s,XR(B$(a.n),s.n)),VW(n.b,a,f))}function PGn(n,t,i){var r,c,a,u,o,s,h,f;switch(OTn(i,"Node promotion heuristic",1),n.g=t,yUn(n),n.q=BB(mMn(t,(HXn(),Sgt)),260),f=BB(mMn(n.g,Mgt),19).a,a=new hi,n.q.g){case 2:case 1:default:_Hn(n,a);break;case 3:for(n.q=(sNn(),Ovt),_Hn(n,a),s=0,o=new Wb(n.a);o.a<o.c.c.length;)u=BB(n0(o),19),s=e.Math.max(s,u.a);s>n.j&&(n.q=Tvt,_Hn(n,a));break;case 4:for(n.q=(sNn(),Ovt),_Hn(n,a),h=0,c=new Wb(n.b);c.a<c.c.c.length;)r=MD(n0(c)),h=e.Math.max(h,(kW(r),r));h>n.k&&(n.q=Pvt,_Hn(n,a));break;case 6:_Hn(n,new od(CJ(e.Math.ceil(n.f.length*f/100))));break;case 5:_Hn(n,new sd(CJ(e.Math.ceil(n.d*f/100))))}oDn(n,t),HSn(i)}function CGn(n,t,e){var i,r,c,a;this.j=n,this.e=qEn(n),this.o=this.j.e,this.i=!!this.o,this.p=this.i?BB(xq(e,vW(this.o).p),214):null,r=BB(mMn(n,(hWn(),Zft)),21),this.g=r.Hc((bDn(),lft)),this.b=new Np,this.d=new wdn(this.e),a=BB(mMn(this.j,Slt),230),this.q=Han(t,a,this.e),this.k=new aZ(this),c=u6(Pun(Gk(jst,1),HWn,225,0,[this,this.d,this.k,this.q])),t!=(oin(),Omt)||qy(TD(mMn(n,(HXn(),xdt))))?t==Omt&&qy(TD(mMn(n,(HXn(),xdt))))?(i=new UEn(this.e),c.c[c.c.length]=i,this.c=new prn(i,a,BB(this.q,402))):this.c=new vP(t,this):(i=new UEn(this.e),c.c[c.c.length]=i,this.c=new G2(i,a,BB(this.q,402))),WB(c,this.c),CHn(c,this.e),this.s=wXn(this.k)}function IGn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v;for(l=(s=BB(iL(new wg(spn(new bg(t).a.d,0))),86))?BB(mMn(s,(qqn(),ckt)),86):null,r=1;s&&l;){for(a=0,v=0,e=s,i=l,c=0;c<r;c++)e=G8(e),i=G8(i),v+=Gy(MD(mMn(e,(qqn(),okt)))),a+=Gy(MD(mMn(i,okt)));if(p=Gy(MD(mMn(l,(qqn(),fkt)))),g=Gy(MD(mMn(s,fkt))),h=E5(s,l),0<(f=p+a+n.a+h-g-v)){for(u=t,o=0;u&&u!=i;)++o,u=BB(mMn(u,akt),86);if(!u)return;for(d=f/o,u=t;u!=i;)w=Gy(MD(mMn(u,fkt)))+f,hon(u,fkt,w),b=Gy(MD(mMn(u,okt)))+f,hon(u,okt,b),f-=d,u=BB(mMn(u,akt),86)}++r,l=(s=0==s.d.b?ZKn(new bg(t),r):BB(iL(new wg(spn(new bg(s).a.d,0))),86))?BB(mMn(s,ckt),86):null}}function OGn(n,t){var e,i,r,c,a,u,o,s,f;for(u=!0,r=0,o=n.f[t.p],s=t.o.b+n.n,e=n.c[t.p][2],c5(n.a,o,iln(BB(xq(n.a,o),19).a-1+e)),c5(n.b,o,Gy(MD(xq(n.b,o)))-s+e*n.e),++o>=n.i?(++n.i,WB(n.a,iln(1)),WB(n.b,s)):(i=n.c[t.p][1],c5(n.a,o,iln(BB(xq(n.a,o),19).a+1-i)),c5(n.b,o,Gy(MD(xq(n.b,o)))+s-i*n.e)),(n.q==(sNn(),Tvt)&&(BB(xq(n.a,o),19).a>n.j||BB(xq(n.a,o-1),19).a>n.j)||n.q==Pvt&&(Gy(MD(xq(n.b,o)))>n.k||Gy(MD(xq(n.b,o-1)))>n.k))&&(u=!1),c=new oz(ZL(fbn(t).a.Kc(),new h));dAn(c);)a=BB(U5(c),17).c.i,n.f[a.p]==o&&(r+=BB((f=OGn(n,a)).a,19).a,u=u&&qy(TD(f.b)));return n.f[t.p]=o,new rI(iln(r+=n.c[t.p][0]),(hN(),!!u))}function AGn(n,t,i,r,c){var a,u,o,s,h,f,l,b,w,d,g,p,v;for(l=new xp,u=new Np,rIn(n,i,n.d.fg(),u,l),rIn(n,r,n.d.gg(),u,l),n.b=.2*(g=BAn(wnn(new Rq(null,new w1(u,16)),new Sa)),p=BAn(wnn(new Rq(null,new w1(u,16)),new Pa)),e.Math.min(g,p)),a=0,o=0;o<u.c.length-1;o++)for(l1(o,u.c.length),s=BB(u.c[o],112),d=o+1;d<u.c.length;d++)a+=gHn(n,s,(l1(d,u.c.length),BB(u.c[d],112)));for(b=BB(mMn(t,(hWn(),Slt)),230),a>=2&&(v=QLn(u,!0,b),!n.e&&(n.e=new lg(n)),sgn(n.e,v,u,n.b)),iTn(u,b),czn(u),w=-1,f=new Wb(u);f.a<f.c.c.length;)h=BB(n0(f),112),e.Math.abs(h.s-h.c)<lZn||(w=e.Math.max(w,h.o),n.d.dg(h,c,n.c));return n.d.a.a.$b(),w+1}function $Gn(n,t){var e,i;Gy(MD(mMn(t,(HXn(),ypt))))<2&&hon(t,ypt,2),BB(mMn(t,Udt),103)==(Ffn(),BPt)&&hon(t,Udt,Wln(t)),0==(e=BB(mMn(t,wpt),19)).a?hon(t,(hWn(),Slt),new sbn):hon(t,(hWn(),Slt),new C4(e.a)),null==TD(mMn(t,xgt))&&hon(t,xgt,(hN(),GI(mMn(t,Zdt))===GI((Mbn(),QPt)))),JT(new Rq(null,new w1(t.a,16)),new Rw(n)),JT(wnn(new Rq(null,new w1(t.b,16)),new mt),new Kw(n)),i=new sGn(t),hon(t,(hWn(),Alt),i),h2(n.a),CU(n.a,(yMn(),Rat),BB(mMn(t,Gdt),246)),CU(n.a,Kat,BB(mMn(t,Pgt),246)),CU(n.a,_at,BB(mMn(t,qdt),246)),CU(n.a,Fat,BB(mMn(t,_gt),246)),CU(n.a,Bat,San(BB(mMn(t,Zdt),218))),aA(n.a,LXn(t)),hon(t,Mlt,$qn(n.a,t))}function LGn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k;return l=n.c[t],b=n.c[e],!((w=BB(mMn(l,(hWn(),clt)),15))&&0!=w.gc()&&w.Hc(b)||(d=l.k!=(uSn(),Put)&&b.k!=Put,v=(g=BB(mMn(l,rlt),10))!=(p=BB(mMn(b,rlt),10)),m=!!g&&g!=l||!!p&&p!=b,y=omn(l,(kUn(),sIt)),k=omn(b,SIt),m|=omn(l,SIt)||omn(b,sIt),d&&(m&&v||y||k))||l.k==(uSn(),Iut)&&b.k==Cut||b.k==(uSn(),Iut)&&l.k==Cut)&&(h=n.c[t],c=n.c[e],r=fjn(n.e,h,c,(kUn(),CIt)),o=fjn(n.i,h,c,oIt),TNn(n.f,h,c),s=Nsn(n.b,h,c)+BB(r.a,19).a+BB(o.a,19).a+n.f.d,u=Nsn(n.b,c,h)+BB(r.b,19).a+BB(o.b,19).a+n.f.b,n.a&&(f=BB(mMn(h,dlt),11),a=BB(mMn(c,dlt),11),s+=BB((i=qyn(n.g,f,a)).a,19).a,u+=BB(i.b,19).a),s>u)}function NGn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g;for(i=BB(mMn(n,(HXn(),ept)),98),u=n.f,a=n.d,o=u.a+a.b+a.c,s=0-a.d-n.c.b,f=u.b+a.d+a.a-n.c.b,h=new Np,l=new Np,c=new Wb(t);c.a<c.c.c.length;){switch(r=BB(n0(c),10),i.g){case 1:case 2:case 3:_Nn(r);break;case 4:w=(b=BB(mMn(r,npt),8))?b.a:0,r.n.a=o*Gy(MD(mMn(r,(hWn(),Tlt))))-w,Jan(r,!0,!1);break;case 5:g=(d=BB(mMn(r,npt),8))?d.a:0,r.n.a=Gy(MD(mMn(r,(hWn(),Tlt))))-g,Jan(r,!0,!1),u.a=e.Math.max(u.a,r.n.a+r.o.a/2)}switch(BB(mMn(r,(hWn(),Qft)),61).g){case 1:r.n.b=s,h.c[h.c.length]=r;break;case 3:r.n.b=f,l.c[l.c.length]=r}}switch(i.g){case 1:case 2:Rfn(h,n),Rfn(l,n);break;case 3:Kfn(h,n),Kfn(l,n)}}function xGn(n,t){var e,i,r,c,a,u,o,s,h,f;for(h=new Np,f=new Lp,c=null,r=0,i=0;i<t.length;++i)switch(Rsn(c,e=t[i])&&(r=Cdn(n,f,h,Kmt,r)),Lx(e,(hWn(),rlt))&&(c=BB(mMn(e,rlt),10)),e.k.g){case 0:for(o=qA(KB(abn(e,(kUn(),sIt)),new xc));Zin(o);)a=BB(P7(o),11),n.d[a.p]=r++,h.c[h.c.length]=a;for(r=Cdn(n,f,h,Kmt,r),s=qA(KB(abn(e,SIt),new xc));Zin(s);)a=BB(P7(s),11),n.d[a.p]=r++,h.c[h.c.length]=a;break;case 3:abn(e,Rmt).dc()||(a=BB(abn(e,Rmt).Xb(0),11),n.d[a.p]=r++,h.c[h.c.length]=a),abn(e,Kmt).dc()||d3(f,e);break;case 1:for(u=abn(e,(kUn(),CIt)).Kc();u.Ob();)a=BB(u.Pb(),11),n.d[a.p]=r++,h.c[h.c.length]=a;abn(e,oIt).Jc(new ZP(f,e))}return Cdn(n,f,h,Kmt,r),h}function DGn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m;for(h=RQn,f=RQn,o=KQn,s=KQn,b=new Wb(t.i);b.a<b.c.c.length;)l=BB(n0(b),65),SA(c=BB(BB(RX(n.g,l.a),46).b,33),l.b.c,l.b.d),h=e.Math.min(h,c.i),f=e.Math.min(f,c.j),o=e.Math.max(o,c.i+c.g),s=e.Math.max(s,c.j+c.f);for(w=BB(ZAn(n.c,(MMn(),bTt)),116),KUn(n.c,o-h+(w.b+w.c),s-f+(w.d+w.a),!0,!0),lMn(n.c,-h+w.b,-f+w.d),r=new AL(iQ(n.c));r.e!=r.i.gc();)u=cDn(i=BB(kpn(r),79),!0,!0),d=PMn(i),p=OMn(i),g=new xC(d.i+d.g/2,d.j+d.f/2),a=new xC(p.i+p.g/2,p.j+p.f/2),Ukn(v=XR(new xC(a.a,a.b),g),d.g,d.f),UR(g,v),Ukn(m=XR(new xC(g.a,g.b),a),p.g,p.f),UR(a,m),CA(u,g.a,g.b),PA(u,a.a,a.b)}function RGn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b;if(n.c=n.d,l=null==(b=TD(mMn(t,(HXn(),dpt))))||(kW(b),b),c=BB(mMn(t,(hWn(),Zft)),21).Hc((bDn(),lft)),e=!((r=BB(mMn(t,ept),98))==(QEn(),UCt)||r==WCt||r==XCt),!l||!e&&c)f=new Jy(Pun(Gk(jut,1),JZn,37,0,[t]));else{for(h=new Wb(t.a);h.a<h.c.c.length;)BB(n0(h),10).p=0;for(f=new Np,s=new Wb(t.a);s.a<s.c.c.length;)if(i=L_n(n,BB(n0(s),10),null)){for(qan(o=new min,t),hon(o,Xft,BB(i.b,21)),kQ(o.d,t.d),hon(o,Hgt,null),u=BB(i.a,15).Kc();u.Ob();)a=BB(u.Pb(),10),WB(o.a,a),a.a=o;f.Fc(o)}c&&(GI(mMn(t,Cdt))===GI((Bfn(),lut))?n.c=n.b:n.c=n.a)}return GI(mMn(t,Cdt))!==GI((Bfn(),wut))&&(SQ(),f.ad(new xt)),f}function KGn(n){NM(n,new MTn(mj(dj(vj(wj(pj(gj(new du,Q3n),"ELK Mr. Tree"),"Tree-based algorithm provided by the Eclipse Layout Kernel. Computes a spanning tree of the input graph and arranges all nodes according to the resulting parent-children hierarchy. I pity the fool who doesn't use Mr. Tree Layout."),new Na),Y3n),nbn((hAn(),JOt))))),u2(n,Q3n,QJn,Okt),u2(n,Q3n,vZn,20),u2(n,Q3n,VJn,dZn),u2(n,Q3n,pZn,iln(1)),u2(n,Q3n,kZn,(hN(),!0)),u2(n,Q3n,X2n,mpn(Ekt)),u2(n,Q3n,PZn,mpn(Mkt)),u2(n,Q3n,BZn,mpn(Skt)),u2(n,Q3n,SZn,mpn(Pkt)),u2(n,Q3n,CZn,mpn(Tkt)),u2(n,Q3n,MZn,mpn(Ckt)),u2(n,Q3n,IZn,mpn(Akt)),u2(n,Q3n,X3n,mpn(Dkt)),u2(n,Q3n,W3n,mpn(Lkt))}function _Gn(n){n.q||(n.q=!0,n.p=kan(n,0),n.a=kan(n,1),Krn(n.a,0),n.f=kan(n,2),Krn(n.f,1),Rrn(n.f,2),n.n=kan(n,3),Rrn(n.n,3),Rrn(n.n,4),Rrn(n.n,5),Rrn(n.n,6),n.g=kan(n,4),Krn(n.g,7),Rrn(n.g,8),n.c=kan(n,5),Krn(n.c,7),Krn(n.c,8),n.i=kan(n,6),Krn(n.i,9),Krn(n.i,10),Krn(n.i,11),Krn(n.i,12),Rrn(n.i,13),n.j=kan(n,7),Krn(n.j,9),n.d=kan(n,8),Krn(n.d,3),Krn(n.d,4),Krn(n.d,5),Krn(n.d,6),Rrn(n.d,7),Rrn(n.d,8),Rrn(n.d,9),Rrn(n.d,10),n.b=kan(n,9),Rrn(n.b,0),Rrn(n.b,1),n.e=kan(n,10),Rrn(n.e,1),Rrn(n.e,2),Rrn(n.e,3),Rrn(n.e,4),Krn(n.e,5),Krn(n.e,6),Krn(n.e,7),Krn(n.e,8),Krn(n.e,9),Krn(n.e,10),Rrn(n.e,11),n.k=kan(n,11),Rrn(n.k,0),Rrn(n.k,1),n.o=jan(n,12),n.s=jan(n,13))}function FGn(n,t){t.dc()&&eH(n.j,!0,!0,!0,!0),Nfn(t,(kUn(),dIt))&&eH(n.j,!0,!0,!0,!1),Nfn(t,hIt)&&eH(n.j,!1,!0,!0,!0),Nfn(t,EIt)&&eH(n.j,!0,!0,!1,!0),Nfn(t,MIt)&&eH(n.j,!0,!1,!0,!0),Nfn(t,gIt)&&eH(n.j,!1,!0,!0,!1),Nfn(t,fIt)&&eH(n.j,!1,!0,!1,!0),Nfn(t,TIt)&&eH(n.j,!0,!1,!1,!0),Nfn(t,jIt)&&eH(n.j,!0,!1,!0,!1),Nfn(t,yIt)&&eH(n.j,!0,!0,!0,!0),Nfn(t,bIt)&&eH(n.j,!0,!0,!0,!0),Nfn(t,yIt)&&eH(n.j,!0,!0,!0,!0),Nfn(t,lIt)&&eH(n.j,!0,!0,!0,!0),Nfn(t,kIt)&&eH(n.j,!0,!0,!0,!0),Nfn(t,mIt)&&eH(n.j,!0,!0,!0,!0),Nfn(t,vIt)&&eH(n.j,!0,!0,!0,!0)}function BGn(n,t,e,i,r){var c,a,u,o,s,h,f,l,b,w,d,g;for(c=new Np,s=new Wb(i);s.a<s.c.c.length;)if(a=null,(u=BB(n0(s),441)).f==(ain(),qvt))for(w=new Wb(u.e);w.a<w.c.c.length;)vW(g=(b=BB(n0(w),17)).d.i)==t?Stn(n,t,u,b,u.b,b.d):!e||wan(g,e)?GMn(n,t,u,i,b):((l=LHn(n,t,e,b,u.b,qvt,a))!=a&&(c.c[c.c.length]=l),l.c&&(a=l));else for(f=new Wb(u.e);f.a<f.c.c.length;)if(vW(d=(h=BB(n0(f),17)).c.i)==t)Stn(n,t,u,h,h.c,u.b);else{if(!e||wan(d,e))continue;(l=LHn(n,t,e,h,u.b,Hvt,a))!=a&&(c.c[c.c.length]=l),l.c&&(a=l)}for(o=new Wb(c);o.a<o.c.c.length;)u=BB(n0(o),441),-1!=E7(t.a,u.a,0)||WB(t.a,u.a),u.c&&(r.c[r.c.length]=u)}function HGn(n,t,e){var i,r,c,a,u,o,s,h;for(o=new Np,u=new Wb(t.a);u.a<u.c.c.length;)for(h=abn(BB(n0(u),10),(kUn(),oIt)).Kc();h.Ob();)for(r=new Wb(BB(h.Pb(),11).g);r.a<r.c.c.length;)!b5(i=BB(n0(r),17))&&i.c.i.c==i.d.i.c||b5(i)||i.d.i.c!=e||(o.c[o.c.length]=i);for(a=ean(e.a).Kc();a.Ob();)for(h=abn(BB(a.Pb(),10),(kUn(),CIt)).Kc();h.Ob();)for(r=new Wb(BB(h.Pb(),11).e);r.a<r.c.c.length;)if((b5(i=BB(n0(r),17))||i.c.i.c!=i.d.i.c)&&!b5(i)&&i.c.i.c==t){for(Px((s=new M2(o,o.c.length)).b>0),c=BB(s.a.Xb(s.c=--s.b),17);c!=i&&s.b>0;)n.a[c.p]=!0,n.a[i.p]=!0,Px(s.b>0),c=BB(s.a.Xb(s.c=--s.b),17);s.b>0&&fW(s)}}function qGn(n,t,e){var i,r,c,a,u,o,s,h,f;if(n.a!=t.Aj())throw Hp(new _y(d6n+t.ne()+g6n));if(i=Cfn((IPn(),Z$t),t).$k())return i.Aj().Nh().Ih(i,e);if(a=Cfn(Z$t,t).al()){if(null==e)return null;if((u=BB(e,15)).dc())return"";for(f=new Sk,c=u.Kc();c.Ob();)r=c.Pb(),cO(f,a.Aj().Nh().Ih(a,r)),f.a+=" ";return KO(f,f.a.length-1)}if(!(h=Cfn(Z$t,t).bl()).dc()){for(s=h.Kc();s.Ob();)if((o=BB(s.Pb(),148)).wj(e))try{if(null!=(f=o.Aj().Nh().Ih(o,e)))return f}catch(l){if(!cL(l=lun(l),102))throw Hp(l)}throw Hp(new _y("Invalid value: '"+e+"' for datatype :"+t.ne()))}return BB(t,834).Fj(),null==e?null:cL(e,172)?""+BB(e,172).a:tsn(e)==mtt?H$(IOt[0],BB(e,199)):Bbn(e)}function GGn(n){var t,i,r,c,a,u,o,s,h;for(s=new YT,u=new YT,c=new Wb(n);c.a<c.c.c.length;)(i=BB(n0(c),128)).v=0,i.n=i.i.c.length,i.u=i.t.c.length,0==i.n&&r5(s,i,s.c.b,s.c),0==i.u&&0==i.r.a.gc()&&r5(u,i,u.c.b,u.c);for(a=-1;0!=s.b;)for(t=new Wb((i=BB(tkn(s,0),128)).t);t.a<t.c.c.length;)(h=BB(n0(t),268).b).v=e.Math.max(h.v,i.v+1),a=e.Math.max(a,h.v),--h.n,0==h.n&&r5(s,h,s.c.b,s.c);if(a>-1){for(r=spn(u,0);r.b!=r.d.c;)(i=BB(b3(r),128)).v=a;for(;0!=u.b;)for(t=new Wb((i=BB(tkn(u,0),128)).i);t.a<t.c.c.length;)0==(o=BB(n0(t),268).a).r.a.gc()&&(o.v=e.Math.min(o.v,i.v-1),--o.u,0==o.u&&r5(u,o,u.c.b,u.c))}}function zGn(n,t,i,r,c){var a,u,o,s;return s=RQn,u=!1,a=!!(o=zBn(n,XR(new xC(t.a,t.b),n),UR(new xC(i.a,i.b),c),XR(new xC(r.a,r.b),i)))&&!(e.Math.abs(o.a-n.a)<=s5n&&e.Math.abs(o.b-n.b)<=s5n||e.Math.abs(o.a-t.a)<=s5n&&e.Math.abs(o.b-t.b)<=s5n),(o=zBn(n,XR(new xC(t.a,t.b),n),i,c))&&((e.Math.abs(o.a-n.a)<=s5n&&e.Math.abs(o.b-n.b)<=s5n)==(e.Math.abs(o.a-t.a)<=s5n&&e.Math.abs(o.b-t.b)<=s5n)||a?s=e.Math.min(s,lW(XR(o,i))):u=!0),(o=zBn(n,XR(new xC(t.a,t.b),n),r,c))&&(u||(e.Math.abs(o.a-n.a)<=s5n&&e.Math.abs(o.b-n.b)<=s5n)==(e.Math.abs(o.a-t.a)<=s5n&&e.Math.abs(o.b-t.b)<=s5n)||a)&&(s=e.Math.min(s,lW(XR(o,r)))),s}function UGn(n){NM(n,new MTn(dj(vj(wj(pj(gj(new du,_Zn),FZn),"Minimizes the stress within a layout using stress majorization. Stress exists if the euclidean distance between a pair of nodes doesn't match their graph theoretic distance, that is, the shortest path between the two nodes. The method allows to specify individual edge lengths."),new gt),gZn))),u2(n,_Zn,jZn,mpn(kat)),u2(n,_Zn,TZn,(hN(),!0)),u2(n,_Zn,PZn,mpn(Tat)),u2(n,_Zn,BZn,mpn(Mat)),u2(n,_Zn,SZn,mpn(Sat)),u2(n,_Zn,CZn,mpn(Eat)),u2(n,_Zn,MZn,mpn(Pat)),u2(n,_Zn,IZn,mpn(Cat)),u2(n,_Zn,NZn,mpn(yat)),u2(n,_Zn,DZn,mpn(vat)),u2(n,_Zn,RZn,mpn(mat)),u2(n,_Zn,KZn,mpn(jat)),u2(n,_Zn,xZn,mpn(pat))}function XGn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g;for(OTn(t,"Interactive crossing minimization",1),a=0,c=new Wb(n.b);c.a<c.c.c.length;)(i=BB(n0(c),29)).p=a++;for(d=new Rj((l=qEn(n)).length),CHn(new Jy(Pun(Gk(jst,1),HWn,225,0,[d])),l),w=0,a=0,r=new Wb(n.b);r.a<r.c.c.length;){for(e=0,f=0,h=new Wb((i=BB(n0(r),29)).a);h.a<h.c.c.length;)for((o=BB(n0(h),10)).n.a>0&&(e+=o.n.a+o.o.a/2,++f),b=new Wb(o.j);b.a<b.c.c.length;)BB(n0(b),11).p=w++;for(f>0&&(e/=f),g=x8(xNt,qQn,25,i.a.c.length,15,1),u=0,s=new Wb(i.a);s.a<s.c.c.length;)(o=BB(n0(s),10)).p=u++,g[o.p]=MGn(o,e),o.k==(uSn(),Put)&&hon(o,(hWn(),plt),g[o.p]);SQ(),m$(i.a,new Gd(g)),r_n(d,l,a,!0),++a}HSn(t)}function WGn(n,t){var e,i,r,c,a,u,o,s,h;if(5!=t.e){if(null!=(s=t).b&&null!=n.b){for(T$n(n),qHn(n),T$n(s),qHn(s),e=x8(ANt,hQn,25,n.b.length+s.b.length,15,1),h=0,i=0,a=0;i<n.b.length&&a<s.b.length;)if(r=n.b[i],c=n.b[i+1],u=s.b[a],o=s.b[a+1],c<u)e[h++]=n.b[i++],e[h++]=n.b[i++];else if(c>=u&&r<=o)u<=r&&c<=o?i+=2:u<=r?(n.b[i]=o+1,a+=2):c<=o?(e[h++]=r,e[h++]=u-1,i+=2):(e[h++]=r,e[h++]=u-1,n.b[i]=o+1,a+=2);else{if(!(o<r))throw Hp(new dy("Token#subtractRanges(): Internal Error: ["+n.b[i]+","+n.b[i+1]+"] - ["+s.b[a]+","+s.b[a+1]+"]"));a+=2}for(;i<n.b.length;)e[h++]=n.b[i++],e[h++]=n.b[i++];n.b=x8(ANt,hQn,25,h,15,1),aHn(e,0,n.b,0,h)}}else kGn(n,t)}function VGn(n){var t,e,i,r,c,a,u;if(!n.A.dc()){if(n.A.Hc((mdn(),KIt))&&(BB(oV(n.b,(kUn(),sIt)),124).k=!0,BB(oV(n.b,SIt),124).k=!0,t=n.q!=(QEn(),WCt)&&n.q!=XCt,Nl(BB(oV(n.b,oIt),124),t),Nl(BB(oV(n.b,CIt),124),t),Nl(n.g,t),n.A.Hc(_It)&&(BB(oV(n.b,sIt),124).j=!0,BB(oV(n.b,SIt),124).j=!0,BB(oV(n.b,oIt),124).k=!0,BB(oV(n.b,CIt),124).k=!0,n.g.k=!0)),n.A.Hc(RIt))for(n.a.j=!0,n.a.k=!0,n.g.j=!0,n.g.k=!0,u=n.B.Hc((n_n(),XIt)),c=0,a=(r=tpn()).length;c<a;++c)i=r[c],(e=BB(oV(n.i,i),306))&&(agn(i)?(e.j=!0,e.k=!0):(e.j=!u,e.k=!u));n.A.Hc(DIt)&&n.B.Hc((n_n(),UIt))&&(n.g.j=!0,n.g.j=!0,n.a.j||(n.a.j=!0,n.a.k=!0,n.a.e=!0))}}function QGn(n){var t,e,i,r,c,a,u,o,s,h,f,l,b,w,d;for(e=new Wb(n.e.b);e.a<e.c.c.length;)for(r=new Wb(BB(n0(e),29).a);r.a<r.c.c.length;)if(i=BB(n0(r),10),o=(f=n.i[i.p]).a.e,u=f.d.e,i.n.b=o,d=u-o-i.o.b,t=AHn(i),bvn(),h=(i.q?i.q:(SQ(),SQ(),het))._b((HXn(),Rgt))?BB(mMn(i,Rgt),197):BB(mMn(vW(i),Kgt),197),t&&(h==fvt||h==hvt)&&(i.o.b+=d),t&&(h==bvt||h==fvt||h==hvt)){for(b=new Wb(i.j);b.a<b.c.c.length;)l=BB(n0(b),11),(kUn(),bIt).Hc(l.j)&&(s=BB(RX(n.k,l),121),l.n.b=s.e-o);for(a=new Wb(i.b);a.a<a.c.c.length;)c=BB(n0(a),70),(w=BB(mMn(i,$gt),21)).Hc((n$n(),NCt))?c.n.b+=d:w.Hc(xCt)&&(c.n.b+=d/2);(h==fvt||h==hvt)&&abn(i,(kUn(),SIt)).Jc(new ag(d))}}function YGn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b;if(!n.b)return!1;for(a=null,l=null,r=1,(o=new H8(null,null)).a[1]=n.b,f=o;f.a[r];)s=r,u=l,l=f,f=f.a[r],r=(i=n.a.ue(t,f.d))<0?0:1,0==i&&(!e.c||cV(f.e,e.d))&&(a=f),f&&f.b||Vy(f.a[r])||(Vy(f.a[1-r])?l=l.a[s]=wrn(f,r):Vy(f.a[1-r])||(b=l.a[1-s])&&(Vy(b.a[1-s])||Vy(b.a[s])?(c=u.a[1]==l?1:0,Vy(b.a[s])?u.a[c]=r2(l,s):Vy(b.a[1-s])&&(u.a[c]=wrn(l,s)),f.b=u.a[c].b=!0,u.a[c].a[0].b=!1,u.a[c].a[1].b=!1):(l.b=!1,b.b=!0,f.b=!0)));return a&&(e.b=!0,e.d=a.e,f!=a&&(bMn(n,o,a,h=new H8(f.d,f.e)),l==a&&(l=h)),l.a[l.a[1]==f?1:0]=f.a[f.a[0]?0:1],--n.c),n.b=o.a[1],n.b&&(n.b.b=!1),e.b}function JGn(n){var t,i,r,c,a,u,o,s,h,f,l,b;for(c=new Wb(n.a.a.b);c.a<c.c.c.length;)for(s=(r=BB(n0(c),57)).c.Kc();s.Ob();)o=BB(s.Pb(),57),r.a!=o.a&&(l=dA(n.a.d)?n.a.g.Oe(r,o):n.a.g.Pe(r,o),a=r.b.a+r.d.b+l-o.b.a,a=e.Math.ceil(a),a=e.Math.max(0,a),Z7(r,o)?(u=AN(new qv,n.d),t=(h=CJ(e.Math.ceil(o.b.a-r.b.a)))-(o.b.a-r.b.a),i=r,(f=f3(r).a)||(f=f3(o).a,t=-t,i=o),f&&(i.b.a-=t,f.n.a-=t),UNn(aM(cM(uM(rM(new Hv,e.Math.max(0,h)),1),u),n.c[r.a.d])),UNn(aM(cM(uM(rM(new Hv,e.Math.max(0,-h)),1),u),n.c[o.a.d]))):(b=1,(cL(r.g,145)&&cL(o.g,10)||cL(o.g,145)&&cL(r.g,10))&&(b=2),UNn(aM(cM(uM(rM(new Hv,CJ(a)),b),n.c[r.a.d]),n.c[o.a.d]))))}function ZGn(n,t,i){var r,c,a,u,o,s,h,f,l,b;if(i)for(r=-1,f=new M2(t,0);f.b<f.d.gc();){if(Px(f.b<f.d.gc()),o=BB(f.d.Xb(f.c=f.b++),10),null==(l=n.c[o.c.p][o.p].a)){for(u=r+1,a=new M2(t,f.b);a.b<a.d.gc();)if(null!=(b=wL(n,(Px(a.b<a.d.gc()),BB(a.d.Xb(a.c=a.b++),10))).a)){kW(b),u=b;break}l=(r+u)/2,n.c[o.c.p][o.p].a=l,n.c[o.c.p][o.p].d=(kW(l),l),n.c[o.c.p][o.p].b=1}kW(l),r=l}else{for(c=0,h=new Wb(t);h.a<h.c.c.length;)o=BB(n0(h),10),null!=n.c[o.c.p][o.p].a&&(c=e.Math.max(c,Gy(n.c[o.c.p][o.p].a)));for(c+=2,s=new Wb(t);s.a<s.c.c.length;)o=BB(n0(s),10),null==n.c[o.c.p][o.p].a&&(l=H$n(n.i,24)*uYn*c-1,n.c[o.c.p][o.p].a=l,n.c[o.c.p][o.p].d=l,n.c[o.c.p][o.p].b=1)}}function nzn(){RO(BAt,new ts),RO(KAt,new ls),RO(qAt,new Es),RO(HAt,new Is),RO(GAt,new Os),RO(XAt,new As),RO(WAt,new $s),RO(HOt,new Ls),RO(BOt,new zo),RO(qOt,new Uo),RO(LOt,new Xo),RO(QAt,new Wo),RO(GOt,new Vo),RO(YAt,new Qo),RO(JAt,new Yo),RO(FAt,new Jo),RO(_At,new Zo),RO(X$t,new ns),RO(VAt,new es),RO(O$t,new is),RO(ktt,new rs),RO(Gk(NNt,1),new cs),RO(Ttt,new as),RO(Stt,new us),RO(mtt,new os),RO(_Nt,new ss),RO(Ptt,new hs),RO(uAt,new fs),RO(yAt,new bs),RO(oLt,new ws),RO($$t,new ds),RO(Ctt,new gs),RO(Att,new ps),RO($nt,new vs),RO(Rtt,new ms),RO(Nnt,new ys),RO(iLt,new ks),RO(FNt,new js),RO(_tt,new Ts),RO(Qtt,new Ms),RO(sAt,new Ss),RO(BNt,new Ps)}function tzn(n,t,e){var i,r,c,a,u,o,s,h,f;for(!e&&(e=Gun(t.q.getTimezoneOffset())),r=6e4*(t.q.getTimezoneOffset()-e.a),o=u=new PD(rbn(fan(t.q.getTime()),r)),u.q.getTimezoneOffset()!=t.q.getTimezoneOffset()&&(r>0?r-=864e5:r+=864e5,o=new PD(rbn(fan(t.q.getTime()),r))),h=new Ik,s=n.a.length,c=0;c<s;)if((i=fV(n.a,c))>=97&&i<=122||i>=65&&i<=90){for(a=c+1;a<s&&fV(n.a,a)==i;++a);aWn(h,i,a-c,u,o,e),c=a}else if(39==i){if(++c<s&&39==fV(n.a,c)){h.a+="'",++c;continue}for(f=!1;!f;){for(a=c;a<s&&39!=fV(n.a,a);)++a;if(a>=s)throw Hp(new _y("Missing trailing '"));a+1<s&&39==fV(n.a,a+1)?++a:f=!0,oO(h,fx(n.a,c,a)),c=a+1}}else h.a+=String.fromCharCode(i),++c;return h.a}function ezn(n){var t,e,i,r,c,a,u,o;for(t=null,i=new Wb(n);i.a<i.c.c.length;)Gy(lL((e=BB(n0(i),233)).g,e.d[0]).a),e.b=null,e.e&&e.e.gc()>0&&0==e.c&&(!t&&(t=new Np),t.c[t.c.length]=e);if(t)for(;0!=t.c.length;){if((e=BB(s6(t,0),233)).b&&e.b.c.length>0)for(!e.b&&(e.b=new Np),c=new Wb(e.b);c.a<c.c.c.length;)if(zy(lL((r=BB(n0(c),233)).g,r.d[0]).a)==zy(lL(e.g,e.d[0]).a)){if(E7(n,r,0)>E7(n,e,0))return new rI(r,e)}else if(Gy(lL(r.g,r.d[0]).a)>Gy(lL(e.g,e.d[0]).a))return new rI(r,e);for(u=(!e.e&&(e.e=new Np),e.e).Kc();u.Ob();)!(a=BB(u.Pb(),233)).b&&(a.b=new Np),LZ(0,(o=a.b).c.length),MS(o.c,0,e),a.c==o.c.length&&(t.c[t.c.length]=a)}return null}function izn(n,t){var e,i,r,c,a,u;if(null==n)return zWn;if(null!=t.a.zc(n,t))return"[...]";for(e=new $an(FWn,"[","]"),c=0,a=(r=n).length;c<a;++c)null!=(i=r[c])&&0!=(4&tsn(i).i)?!Array.isArray(i)||(u=vnn(i))>=14&&u<=16?cL(i,177)?b6(e,RCn(BB(i,177))):cL(i,190)?b6(e,JEn(BB(i,190))):cL(i,195)?b6(e,kSn(BB(i,195))):cL(i,2012)?b6(e,ZEn(BB(i,2012))):cL(i,48)?b6(e,DCn(BB(i,48))):cL(i,364)?b6(e,gIn(BB(i,364))):cL(i,832)?b6(e,xCn(BB(i,832))):cL(i,104)&&b6(e,NCn(BB(i,104))):t.a._b(i)?(e.a?oO(e.a,e.b):e.a=new lN(e.d),aO(e.a,"[...]")):b6(e,izn(een(i),new $q(t))):b6(e,null==i?zWn:Bbn(i));return e.a?0==e.e.length?e.a.a:e.a.a+""+e.e:e.c}function rzn(n,t,i,r){var c,a,u,o,s,h,f,l,b,w,d,g;for(w=qSn(cDn(t,!1,!1)),r&&(w=Jon(w)),g=Gy(MD(ZAn(t,(Epn(),pct)))),Px(0!=w.b),b=BB(w.a.a.c,8),h=BB(Dpn(w,1),8),w.b>2?(gun(s=new Np,new s1(w,1,w.b)),qan(d=new EAn(XXn(s,g+n.a)),t),i.c[i.c.length]=d):d=BB(RX(n.b,r?PMn(t):OMn(t)),266),u=PMn(t),r&&(u=OMn(t)),a=iPn(b,u),o=g+n.a,a.a?(o+=e.Math.abs(b.b-h.b),l=new xC(h.a,(h.b+b.b)/2)):(o+=e.Math.abs(b.a-h.a),l=new xC((h.a+b.a)/2,h.b)),VW(r?n.d:n.c,t,new Imn(d,a,l,o)),VW(n.b,t,d),!t.n&&(t.n=new eU(zOt,t,1,7)),f=new AL(t.n);f.e!=f.i.gc();)c=JRn(n,BB(kpn(f),137),!0,0,0),i.c[i.c.length]=c}function czn(n){var t,i,r,c,a,u,o,s,h;for(s=new Np,u=new Np,a=new Wb(n);a.a<a.c.c.length;)Vl(r=BB(n0(a),112),r.f.c.length),Ql(r,r.k.c.length),0==r.d&&(s.c[s.c.length]=r),0==r.i&&0==r.e.b&&(u.c[u.c.length]=r);for(i=-1;0!=s.c.length;)for(t=new Wb((r=BB(s6(s,0),112)).k);t.a<t.c.c.length;)Yl(h=BB(n0(t),129).b,e.Math.max(h.o,r.o+1)),i=e.Math.max(i,h.o),Vl(h,h.d-1),0==h.d&&(s.c[s.c.length]=h);if(i>-1){for(c=new Wb(u);c.a<c.c.c.length;)(r=BB(n0(c),112)).o=i;for(;0!=u.c.length;)for(t=new Wb((r=BB(s6(u,0),112)).f);t.a<t.c.c.length;)(o=BB(n0(t),129).a).e.b>0||(Yl(o,e.Math.min(o.o,r.o-1)),Ql(o,o.i-1),0==o.i&&(u.c[u.c.length]=o))}}function azn(n,t,e){var i,r,c,a,u;if(u=n.c,!t&&(t=L$t),n.c=t,0!=(4&n.Db)&&0==(1&n.Db)&&(a=new nU(n,1,2,u,n.c),e?e.Ei(a):e=a),u!=t)if(cL(n.Cb,284))n.Db>>16==-10?e=BB(n.Cb,284).nk(t,e):n.Db>>16==-15&&(!t&&(gWn(),t=l$t),!u&&(gWn(),u=l$t),n.Cb.nh()&&(a=new N7(n.Cb,1,13,u,t,uvn(H7(BB(n.Cb,59)),n),!1),e?e.Ei(a):e=a));else if(cL(n.Cb,88))n.Db>>16==-23&&(cL(t,88)||(gWn(),t=d$t),cL(u,88)||(gWn(),u=d$t),n.Cb.nh()&&(a=new N7(n.Cb,1,10,u,t,uvn(a4(BB(n.Cb,26)),n),!1),e?e.Ei(a):e=a));else if(cL(n.Cb,444))for(!(c=BB(n.Cb,836)).b&&(c.b=new Tp(new xm)),r=new Mp(new usn(new Pb(c.b.a).a));r.a.b;)e=azn(i=BB(ten(r.a).cd(),87),kLn(i,c),e);return e}function uzn(n,t){var e,i,r,c,a,u,o,s,h,f,l;for(a=qy(TD(ZAn(n,(HXn(),wgt)))),l=BB(ZAn(n,cpt),21),o=!1,s=!1,f=new AL((!n.c&&(n.c=new eU(XOt,n,9,9)),n.c));!(f.e==f.i.gc()||o&&s);){for(c=BB(kpn(f),118),u=0,r=NU(Wen(Pun(Gk(xnt,1),HWn,20,0,[(!c.d&&(c.d=new hK(_Ot,c,8,5)),c.d),(!c.e&&(c.e=new hK(_Ot,c,7,4)),c.e)])));dAn(r)&&(i=BB(U5(r),79),h=a&&QIn(i)&&qy(TD(ZAn(i,dgt))),e=bqn((!i.b&&(i.b=new hK(KOt,i,4,7)),i.b),c)?n==JJ(PTn(BB(Wtn((!i.c&&(i.c=new hK(KOt,i,5,8)),i.c),0),82))):n==JJ(PTn(BB(Wtn((!i.b&&(i.b=new hK(KOt,i,4,7)),i.b),0),82))),!((h||e)&&++u>1)););(u>0||l.Hc((lIn(),eIt))&&(!c.n&&(c.n=new eU(zOt,c,1,7)),c.n).i>0)&&(o=!0),u>1&&(s=!0)}o&&t.Fc((bDn(),lft)),s&&t.Fc((bDn(),bft))}function ozn(n){var t,i,r,c,a,u,o,s,h,f,l,b;if((b=BB(ZAn(n,(sWn(),KSt)),21)).dc())return null;if(o=0,u=0,b.Hc((mdn(),KIt))){for(f=BB(ZAn(n,uPt),98),r=2,i=2,c=2,a=2,t=JJ(n)?BB(ZAn(JJ(n),bSt),103):BB(ZAn(n,bSt),103),h=new AL((!n.c&&(n.c=new eU(XOt,n,9,9)),n.c));h.e!=h.i.gc();)if(s=BB(kpn(h),118),(l=BB(ZAn(s,wPt),61))==(kUn(),PIt)&&(l=OFn(s,t),Ypn(s,wPt,l)),f==(QEn(),XCt))switch(l.g){case 1:r=e.Math.max(r,s.i+s.g);break;case 2:i=e.Math.max(i,s.j+s.f);break;case 3:c=e.Math.max(c,s.i+s.g);break;case 4:a=e.Math.max(a,s.j+s.f)}else switch(l.g){case 1:r+=s.g+2;break;case 2:i+=s.f+2;break;case 3:c+=s.g+2;break;case 4:a+=s.f+2}o=e.Math.max(r,c),u=e.Math.max(i,a)}return KUn(n,o,u,!0,!0)}function szn(n,t,i,r,c){var a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k;for(m=BB(P4(ytn(AV(new Rq(null,new w1(t.d,16)),new $d(i)),new Ld(i)),m9(new H,new B,new rn,Pun(Gk(nit,1),$Vn,132,0,[(qsn(),Uet)]))),15),l=DWn,f=_Vn,s=new Wb(t.b.j);s.a<s.c.c.length;)(o=BB(n0(s),11)).j==i&&(l=e.Math.min(l,o.p),f=e.Math.max(f,o.p));if(l==DWn)for(u=0;u<m.gc();u++)g9(BB(m.Xb(u),101),i,u);else for(Zq(y=x8(ANt,hQn,25,c.length,15,1),y.length),v=m.Kc();v.Ob();){for(p=BB(v.Pb(),101),a=BB(RX(n.b,p),177),h=0,g=l;g<=f;g++)a[g]&&(h=e.Math.max(h,r[g]));if(p.i){for(w=p.i.c,k=new Rv,b=0;b<c.length;b++)c[w][b]&&TU(k,iln(y[b]));for(;FT(k,iln(h));)++h}for(g9(p,i,h),d=l;d<=f;d++)a[d]&&(r[d]=h+1);p.i&&(y[p.i.c]=h)}}function hzn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d;for(c=null,r=new Wb(t.a);r.a<r.c.c.length;)AHn(i=BB(n0(r),10))?(h=new GV(i,!0,o=AN(oM(new qv,i),n.f),s=AN(oM(new qv,i),n.f)),f=i.o.b,bvn(),b=1e4,(l=(i.q?i.q:(SQ(),SQ(),het))._b((HXn(),Rgt))?BB(mMn(i,Rgt),197):BB(mMn(vW(i),Kgt),197))==hvt&&(b=1),w=UNn(aM(cM(rM(uM(new Hv,b),CJ(e.Math.ceil(f))),o),s)),l==fvt&&TU(n.d,w),O_n(n,ean(abn(i,(kUn(),CIt))),h),O_n(n,abn(i,oIt),h),a=h):(d=AN(oM(new qv,i),n.f),JT(AV(new Rq(null,new w1(i.j,16)),new Bc),new tC(n,d)),a=new GV(i,!1,d,d)),n.i[i.p]=a,c&&(u=c.c.d.a+K$(n.n,c.c,i)+i.d.d,c.b||(u+=c.c.o.b),UNn(aM(cM(uM(rM(new Hv,CJ(e.Math.ceil(u))),0),c.d),a.a))),c=a}function fzn(n,t){var i,r,c,a,u,o,s,f,l,b,w,d,g;for(OTn(t,"Label dummy insertions",1),b=new Np,u=Gy(MD(mMn(n,(HXn(),jpt)))),f=Gy(MD(mMn(n,Spt))),l=BB(mMn(n,Udt),103),w=new Wb(n.a);w.a<w.c.c.length;)for(a=new oz(ZL(lbn(BB(n0(w),10)).a.Kc(),new h));dAn(a);)if((c=BB(U5(a),17)).c.i!=c.d.i&&tL(c.b,nst)){for(i=oLn(n,c,g=Etn(c),d=sx(c.b.c.length)),b.c[b.c.length]=i,r=i.o,o=new M2(c.b,0);o.b<o.d.gc();)Px(o.b<o.d.gc()),GI(mMn(s=BB(o.d.Xb(o.c=o.b++),70),Ydt))===GI((Rtn(),zPt))&&(l==(Ffn(),HPt)||l==KPt?(r.a+=s.o.a+f,r.b=e.Math.max(r.b,s.o.b)):(r.a=e.Math.max(r.a,s.o.a),r.b+=s.o.b+f),d.c[d.c.length]=s,fW(o));l==(Ffn(),HPt)||l==KPt?(r.a-=f,r.b+=u+g):r.b+=u-f+g}gun(n.a,b),HSn(t)}function lzn(n,t,i,r){var c,a,u,o,s,h,f,l,b,w;for(l=XDn(n,t,a=new dOn(t)),w=e.Math.max(Gy(MD(mMn(t,(HXn(),agt)))),1),f=new Wb(l.a);f.a<f.c.c.length;)h=BB(n0(f),46),s=Bgn(BB(h.a,8),BB(h.b,8),w),zH(i,new xC(s.c,s.d)),zH(i,_x(new xC(s.c,s.d),s.b,0)),zH(i,_x(new xC(s.c,s.d),0,s.a)),zH(i,_x(new xC(s.c,s.d),s.b,s.a));switch(b=a.d,o=Bgn(BB(l.b.a,8),BB(l.b.b,8),w),b==(kUn(),CIt)||b==oIt?(r.c[b.g]=e.Math.min(r.c[b.g],o.d),r.b[b.g]=e.Math.max(r.b[b.g],o.d+o.a)):(r.c[b.g]=e.Math.min(r.c[b.g],o.c),r.b[b.g]=e.Math.max(r.b[b.g],o.c+o.b)),c=KQn,u=a.c.i.d,b.g){case 4:c=u.c;break;case 2:c=u.b;break;case 1:c=u.a;break;case 3:c=u.d}return r.a[b.g]=e.Math.max(r.a[b.g],c),a}function bzn(n){var t,e,i,r;if(-1!=(t=GO(e=null!=n.D?n.D:n.B,YTn(91)))){i=e.substr(0,t),r=new Sk;do{r.a+="["}while(-1!=(t=lx(e,91,++t)));mK(i,$Wn)?r.a+="Z":mK(i,S9n)?r.a+="B":mK(i,P9n)?r.a+="C":mK(i,C9n)?r.a+="D":mK(i,I9n)?r.a+="F":mK(i,O9n)?r.a+="I":mK(i,A9n)?r.a+="J":mK(i,$9n)?r.a+="S":(r.a+="L",r.a+=""+i,r.a+=";");try{return null}catch(c){if(!cL(c=lun(c),60))throw Hp(c)}}else if(-1==GO(e,YTn(46))){if(mK(e,$Wn))return $Nt;if(mK(e,S9n))return NNt;if(mK(e,P9n))return ONt;if(mK(e,C9n))return xNt;if(mK(e,I9n))return DNt;if(mK(e,O9n))return ANt;if(mK(e,A9n))return LNt;if(mK(e,$9n))return RNt}return null}function wzn(n,t,e){var i,r,c,a,u,o,s,h;for(qan(s=new $vn(e),t),hon(s,(hWn(),dlt),t),s.o.a=t.g,s.o.b=t.f,s.n.a=t.i,s.n.b=t.j,WB(e.a,s),VW(n.a,t,s),(0!=(!t.a&&(t.a=new eU(UOt,t,10,11)),t.a).i||qy(TD(ZAn(t,(HXn(),wgt)))))&&hon(s,_ft,(hN(),!0)),o=BB(mMn(e,Zft),21),(h=BB(mMn(s,(HXn(),ept)),98))==(QEn(),YCt)?hon(s,ept,QCt):h!=QCt&&o.Fc((bDn(),dft)),i=BB(mMn(e,Udt),103),u=new AL((!t.c&&(t.c=new eU(XOt,t,9,9)),t.c));u.e!=u.i.gc();)qy(TD(ZAn(a=BB(kpn(u),118),Ggt)))||Zzn(n,a,s,o,i,h);for(c=new AL((!t.n&&(t.n=new eU(zOt,t,1,7)),t.n));c.e!=c.i.gc();)!qy(TD(ZAn(r=BB(kpn(c),137),Ggt)))&&r.a&&WB(s.b,Hhn(r));return qy(TD(mMn(s,Tdt)))&&o.Fc((bDn(),hft)),qy(TD(mMn(s,bgt)))&&(o.Fc((bDn(),wft)),o.Fc(bft),hon(s,ept,QCt)),s}function dzn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T;u=BB(RX(t.c,n),459),g=t.a.c,o=t.a.c+t.a.b,a=(E=u.f)<(T=u.a),b=new xC(g,E),p=new xC(o,T),w=new xC(r=(g+o)/2,E),v=new xC(r,T),c=eNn(n,E,T),y=g1(t.B),k=new xC(r,c),j=g1(t.D),e=lon(Pun(Gk(PMt,1),sVn,8,0,[y,k,j])),f=!1,(d=t.B.i)&&d.c&&u.d&&((s=a&&d.p<d.c.a.c.length-1||!a&&d.p>0)?s&&(h=d.p,a?++h:--h,f=!(cNn(i=ion(BB(xq(d.c.a,h),10)),y,e[0])||Bz(i,y,e[0]))):f=!0),l=!1,(m=t.D.i)&&m.c&&u.e&&(a&&m.p>0||!a&&m.p<m.c.a.c.length-1?(h=m.p,a?--h:++h,l=!(cNn(i=ion(BB(xq(m.c.a,h),10)),e[0],j)||Bz(i,e[0],j))):l=!0),f&&l&&DH(n.a,k),f||nin(n.a,Pun(Gk(PMt,1),sVn,8,0,[b,w])),l||nin(n.a,Pun(Gk(PMt,1),sVn,8,0,[v,p]))}function gzn(n,t){var e,i,r,c,a,u,o;if(cL(n.Ug(),160)?(gzn(BB(n.Ug(),160),t),t.a+=" > "):t.a+="Root ",mK((e=n.Tg().zb).substr(0,3),"Elk")?oO(t,e.substr(3)):t.a+=""+e,r=n.zg())oO((t.a+=" ",t),r);else if(cL(n,354)&&(o=BB(n,137).a))oO((t.a+=" ",t),o);else{for(c=new AL(n.Ag());c.e!=c.i.gc();)if(o=BB(kpn(c),137).a)return void oO((t.a+=" ",t),o);if(cL(n,352)&&(!(i=BB(n,79)).b&&(i.b=new hK(KOt,i,4,7)),0!=i.b.i&&(!i.c&&(i.c=new hK(KOt,i,5,8)),0!=i.c.i))){for(t.a+=" (",a=new cx((!i.b&&(i.b=new hK(KOt,i,4,7)),i.b));a.e!=a.i.gc();)a.e>0&&(t.a+=FWn),gzn(BB(kpn(a),160),t);for(t.a+=e1n,u=new cx((!i.c&&(i.c=new hK(KOt,i,5,8)),i.c));u.e!=u.i.gc();)u.e>0&&(t.a+=FWn),gzn(BB(kpn(u),160),t);t.a+=")"}}}function pzn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b;if(c=BB(mMn(n,(hWn(),dlt)),79)){for(i=n.a,UR(r=new wA(e),$jn(n)),wan(n.d.i,n.c.i)?(l=n.c,XR(f=Aon(Pun(Gk(PMt,1),sVn,8,0,[l.n,l.a])),e)):f=g1(n.c),r5(i,f,i.a,i.a.a),b=g1(n.d),null!=mMn(n,Rlt)&&UR(b,BB(mMn(n,Rlt),8)),r5(i,b,i.c.b,i.c),Ztn(i,r),Lin(a=cDn(c,!0,!0),BB(Wtn((!c.b&&(c.b=new hK(KOt,c,4,7)),c.b),0),82)),Nin(a,BB(Wtn((!c.c&&(c.c=new hK(KOt,c,5,8)),c.c),0),82)),VFn(i,a),h=new Wb(n.b);h.a<h.c.c.length;)s=BB(n0(h),70),Sen(u=BB(mMn(s,dlt),137),s.o.a),Men(u,s.o.b),SA(u,s.n.a+r.a,s.n.b+r.b),Ypn(u,(Irn(),tst),TD(mMn(s,tst)));(o=BB(mMn(n,(HXn(),vgt)),74))?(Ztn(o,r),Ypn(c,vgt,o)):Ypn(c,vgt,null),t==(Mbn(),JPt)?Ypn(c,Zdt,JPt):Ypn(c,Zdt,null)}}function vzn(n,t,e,i){var r,c,a,u,o,s,h,f,l,b,w,d,g,p,v;for(b=t.c.length,l=0,f=new Wb(n.b);f.a<f.c.c.length;)if(0!=(p=(h=BB(n0(f),29)).a).c.length){for(s=0,v=null,r=BB(n0(g=new Wb(p)),10),c=null;r;){if((c=BB(xq(t,r.p),257)).c>=0){for(o=null,u=new M2(h.a,s+1);u.b<u.d.gc()&&(Px(u.b<u.d.gc()),a=BB(u.d.Xb(u.c=u.b++),10),!((o=BB(xq(t,a.p),257)).d==c.d&&o.c<c.c));)o=null;o&&(v&&(c5(i,r.p,iln(BB(xq(i,r.p),19).a-1)),BB(xq(e,v.p),15).Mc(c)),c=wTn(c,r,b++),t.c[t.c.length]=c,WB(e,new Np),v?(BB(xq(e,v.p),15).Fc(c),WB(i,iln(1))):WB(i,iln(0)))}w=null,g.a<g.c.c.length&&(w=BB(n0(g),10),d=BB(xq(t,w.p),257),BB(xq(e,r.p),15).Fc(d),c5(i,w.p,iln(BB(xq(i,w.p),19).a+1))),c.d=l,c.c=s++,v=r,r=w}++l}}function mzn(n,t,i,r){var c,a,u,o,s,h,f,l,b,w,d,g,p,v,m;return o=n,h=XR(new xC(t.a,t.b),n),s=i,f=XR(new xC(r.a,r.b),i),l=o.a,g=o.b,w=s.a,v=s.b,b=h.a,p=h.b,c=(d=f.a)*p-b*(m=f.b),h$(),rin(A3n),!(e.Math.abs(0-c)<=A3n||0==c||isNaN(0)&&isNaN(c))&&(a=1/c*((l-w)*p-(g-v)*b),u=1/c*-(-(l-w)*m+(g-v)*d),rin(A3n),(e.Math.abs(0-a)<=A3n||0==a||isNaN(0)&&isNaN(a)?0:0<a?-1:0>a?1:zO(isNaN(0),isNaN(a)))<0&&(rin(A3n),(e.Math.abs(a-1)<=A3n||1==a||isNaN(a)&&isNaN(1)?0:a<1?-1:a>1?1:zO(isNaN(a),isNaN(1)))<0)&&(rin(A3n),(e.Math.abs(0-u)<=A3n||0==u||isNaN(0)&&isNaN(u)?0:0<u?-1:0>u?1:zO(isNaN(0),isNaN(u)))<0)&&(rin(A3n),(e.Math.abs(u-1)<=A3n||1==u||isNaN(u)&&isNaN(1)?0:u<1?-1:u>1?1:zO(isNaN(u),isNaN(1)))<0))}function yzn(n){var t,e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j;for(f=new hW(new iw(n));f.b!=f.c.a.d;)for(u=BB((h=s9(f)).d,56),t=BB(h.e,56),d=0,y=(null==(a=u.Tg()).i&&qFn(a),a.i).length;d<y;++d)if(null==a.i&&qFn(a),c=a.i,(s=d>=0&&d<c.length?c[d]:null).Ij()&&!s.Jj())if(cL(s,99))0==((o=BB(s,18)).Bb&h6n)&&(!(j=Cvn(o))||0==(j.Bb&h6n))&&mBn(n,o,u,t);else if(ZM(),BB(s,66).Oj()&&(e=BB((k=s)?BB(t,49).xh(k):null,153)))for(b=BB(u.ah(s),153),i=e.gc(),g=0,w=b.gc();g<w;++g)if(cL(l=b.il(g),99)){if(null==(r=lnn(n,m=b.jl(g)))&&null!=m){if(v=BB(l,18),!n.b||0!=(v.Bb&h6n)||Cvn(v))continue;r=m}if(!e.dl(l,r))for(p=0;p<i;++p)if(e.il(p)==l&&GI(e.jl(p))===GI(r)){e.ii(e.gc()-1,p),--i;break}}else e.dl(b.il(g),b.jl(g))}function kzn(n,t,i,r,c,a,u){var o,s,h,f,l,b,w,d,g,p,v,m;if(p=QBn(t,i,n.g),c.n&&c.n&&a&&y0(c,o2(a),(Bsn(),uOt)),n.b)for(g=0;g<p.c.length;g++)l1(g,p.c.length),f=BB(p.c[g],200),0!=g&&(l1(g-1,p.c.length),ghn(f,(b=BB(p.c[g-1],200)).f+b.b+n.g)),mXn(g,p,i,n.g),Hkn(n,f),c.n&&a&&y0(c,o2(a),(Bsn(),uOt));else for(d=new Wb(p);d.a<d.c.c.length;)for(h=new Wb((w=BB(n0(d),200)).a);h.a<h.c.c.length;)xcn(v=new KJ((s=BB(n0(h),187)).s,s.t,n.g),s),WB(w.d,v);return zmn(n,p),c.n&&c.n&&a&&y0(c,o2(a),(Bsn(),uOt)),m=e.Math.max(n.d,r.a-(u.b+u.c)),o=(l=e.Math.max(n.c,r.b-(u.d+u.a)))-n.c,n.e&&n.f&&(m/l<n.a?m=l*n.a:o+=m/n.a-l),n.e&&Odn(p,m,o),c.n&&c.n&&a&&y0(c,o2(a),(Bsn(),uOt)),new eq(n.a,m,n.c+o,(YLn(),_Et))}function jzn(n){var t,i,r,c,a,u,o,s,h,f;for(n.j=x8(ANt,hQn,25,n.g,15,1),n.o=new Np,JT(wnn(new Rq(null,new w1(n.e.b,16)),new Wc),new ug(n)),n.a=x8($Nt,ZYn,25,n.b,16,1),$fn(new Rq(null,new w1(n.e.b,16)),new sg(n)),f=new Np,JT(AV(wnn(new Rq(null,new w1(n.e.b,16)),new Qc),new og(n)),new eC(n,f)),o=new Wb(f);o.a<o.c.c.length;)if(!((u=BB(n0(o),508)).c.length<=1))if(2!=u.c.length){if(!XEn(u)&&!NPn(u,new Vc))for(s=new Wb(u),r=null;s.a<s.c.c.length;)t=BB(n0(s),17),i=n.c[t.p],h=!r||s.a>=s.c.c.length?X3((uSn(),Cut),Put):X3((uSn(),Put),Put),h*=2,c=i.a.g,i.a.g=e.Math.max(c,c+(h-c)),a=i.b.g,i.b.g=e.Math.max(a,a+(h-a)),r=t}else zAn(u),AHn((l1(0,u.c.length),BB(u.c[0],17)).d.i)||WB(n.o,u)}function Ezn(n,t,e,i,r){var c,a,u,o,s,h,f,l,b,w,d,g,p,v,m;for(m=GB(n),o=new Np,s=(c=n.c.length)-1,h=c+1;0!=m.a.c;){for(;0!=e.b;)Px(0!=e.b),p=BB(Atn(e,e.a.a),112),$J(m.a,p),p.g=s--,NFn(p,t,e,i);for(;0!=t.b;)Px(0!=t.b),v=BB(Atn(t,t.a.a),112),$J(m.a,v),v.g=h++,NFn(v,t,e,i);for(u=_Vn,d=new Fb(new BR(new xN(new _b(m.a).a).b));aS(d.a.a);){if(w=BB(mx(d.a).cd(),112),!i&&w.b>0&&w.a<=0){o.c=x8(Ant,HWn,1,0,5,1),o.c[o.c.length]=w;break}(b=w.i-w.d)>=u&&(b>u&&(o.c=x8(Ant,HWn,1,0,5,1),u=b),o.c[o.c.length]=w)}0!=o.c.length&&(a=BB(xq(o,pvn(r,o.c.length)),112),$J(m.a,a),a.g=h++,NFn(a,t,e,i),o.c=x8(Ant,HWn,1,0,5,1))}for(g=n.c.length+1,l=new Wb(n);l.a<l.c.c.length;)(f=BB(n0(l),112)).g<c&&(f.g=f.g+g)}function Tzn(n,t){var e;if(n.e)throw Hp(new Fy((ED(git),AYn+git.k+$Yn)));if(!SS(n.a,t))throw Hp(new dy(LYn+t+NYn));if(t==n.d)return n;switch(e=n.d,n.d=t,e.g){case 0:switch(t.g){case 2:Hmn(n);break;case 1:Con(n),Hmn(n);break;case 4:nEn(n),Hmn(n);break;case 3:nEn(n),Con(n),Hmn(n)}break;case 2:switch(t.g){case 1:Con(n),RRn(n);break;case 4:nEn(n),Hmn(n);break;case 3:nEn(n),Con(n),Hmn(n)}break;case 1:switch(t.g){case 2:Con(n),RRn(n);break;case 4:Con(n),nEn(n),Hmn(n);break;case 3:Con(n),nEn(n),Con(n),Hmn(n)}break;case 4:switch(t.g){case 2:nEn(n),Hmn(n);break;case 1:nEn(n),Con(n),Hmn(n);break;case 3:Con(n),RRn(n)}break;case 3:switch(t.g){case 2:Con(n),nEn(n),Hmn(n);break;case 1:Con(n),nEn(n),Con(n),Hmn(n);break;case 4:Con(n),RRn(n)}}return n}function Mzn(n,t){var e;if(n.d)throw Hp(new Fy((ED(Yat),AYn+Yat.k+$Yn)));if(!PC(n.a,t))throw Hp(new dy(LYn+t+NYn));if(t==n.c)return n;switch(e=n.c,n.c=t,e.g){case 0:switch(t.g){case 2:Zon(n);break;case 1:Pon(n),Zon(n);break;case 4:tEn(n),Zon(n);break;case 3:tEn(n),Pon(n),Zon(n)}break;case 2:switch(t.g){case 1:Pon(n),KRn(n);break;case 4:tEn(n),Zon(n);break;case 3:tEn(n),Pon(n),Zon(n)}break;case 1:switch(t.g){case 2:Pon(n),KRn(n);break;case 4:Pon(n),tEn(n),Zon(n);break;case 3:Pon(n),tEn(n),Pon(n),Zon(n)}break;case 4:switch(t.g){case 2:tEn(n),Zon(n);break;case 1:tEn(n),Pon(n),Zon(n);break;case 3:Pon(n),KRn(n)}break;case 3:switch(t.g){case 2:Pon(n),tEn(n),Zon(n);break;case 1:Pon(n),tEn(n),Pon(n),Zon(n);break;case 4:Pon(n),KRn(n)}}return n}function Szn(n,t,i){var r,c,a,u,o,s,f,l;for(s=new AL((!n.a&&(n.a=new eU(UOt,n,10,11)),n.a));s.e!=s.i.gc();)for(c=new oz(ZL(dLn(o=BB(kpn(s),33)).a.Kc(),new h));dAn(c);){if(!(r=BB(U5(c),79)).b&&(r.b=new hK(KOt,r,4,7)),!(r.b.i<=1&&(!r.c&&(r.c=new hK(KOt,r,5,8)),r.c.i<=1)))throw Hp(new ck("Graph must not contain hyperedges."));if(!nAn(r)&&o!=PTn(BB(Wtn((!r.c&&(r.c=new hK(KOt,r,5,8)),r.c),0),82)))for(qan(f=new IR,r),hon(f,(Mrn(),sat),r),Rl(f,BB(qI(AY(i.f,o)),144)),Kl(f,BB(RX(i,PTn(BB(Wtn((!r.c&&(r.c=new hK(KOt,r,5,8)),r.c),0),82))),144)),WB(t.c,f),u=new AL((!r.n&&(r.n=new eU(zOt,r,1,7)),r.n));u.e!=u.i.gc();)qan(l=new m4(f,(a=BB(kpn(u),137)).a),a),hon(l,sat,a),l.e.a=e.Math.max(a.g,1),l.e.b=e.Math.max(a.f,1),_Bn(l),WB(t.d,l)}}function Pzn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m;for(EJ(l=new eUn(n),!(t==(Ffn(),HPt)||t==KPt)),f=l.a,b=new bm,Dtn(),u=0,s=(c=Pun(Gk(Vit,1),$Vn,232,0,[Git,zit,Uit])).length;u<s;++u)i=c[u],(h=fL(f,Git,i))&&(b.d=e.Math.max(b.d,h.Re()));for(a=0,o=(r=Pun(Gk(Vit,1),$Vn,232,0,[Git,zit,Uit])).length;a<o;++a)i=r[a],(h=fL(f,Uit,i))&&(b.a=e.Math.max(b.a,h.Re()));for(p=0,m=(d=Pun(Gk(Vit,1),$Vn,232,0,[Git,zit,Uit])).length;p<m;++p)(h=fL(f,d[p],Git))&&(b.b=e.Math.max(b.b,h.Se()));for(g=0,v=(w=Pun(Gk(Vit,1),$Vn,232,0,[Git,zit,Uit])).length;g<v;++g)(h=fL(f,w[g],Uit))&&(b.c=e.Math.max(b.c,h.Se()));return b.d>0&&(b.d+=f.n.d,b.d+=f.d),b.a>0&&(b.a+=f.n.a,b.a+=f.d),b.b>0&&(b.b+=f.n.b,b.b+=f.d),b.c>0&&(b.c+=f.n.c,b.c+=f.d),b}function Czn(n,t,i){var r,c,a,u,o,s,h,f,l,b,w,d;for(b=i.d,l=i.c,u=(a=new xC(i.f.a+i.d.b+i.d.c,i.f.b+i.d.d+i.d.a)).b,h=new Wb(n.a);h.a<h.c.c.length;)if((o=BB(n0(h),10)).k==(uSn(),Mut)){switch(r=BB(mMn(o,(hWn(),Qft)),61),c=BB(mMn(o,Yft),8),f=o.n,r.g){case 2:f.a=i.f.a+b.c-l.a;break;case 4:f.a=-l.a-b.b}switch(d=0,r.g){case 2:case 4:t==(QEn(),WCt)?(w=Gy(MD(mMn(o,Tlt))),f.b=a.b*w-BB(mMn(o,(HXn(),npt)),8).b,d=f.b+c.b,Jan(o,!1,!0)):t==XCt&&(f.b=Gy(MD(mMn(o,Tlt)))-BB(mMn(o,(HXn(),npt)),8).b,d=f.b+c.b,Jan(o,!1,!0))}u=e.Math.max(u,d)}for(i.f.b+=u-a.b,s=new Wb(n.a);s.a<s.c.c.length;)if((o=BB(n0(s),10)).k==(uSn(),Mut))switch(r=BB(mMn(o,(hWn(),Qft)),61),f=o.n,r.g){case 1:f.b=-l.b-b.d;break;case 3:f.b=i.f.b+b.a-l.b}}function Izn(n){var t,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j;for(r=BB(mMn(n,(qqn(),skt)),33),o=DWn,s=DWn,a=_Vn,u=_Vn,k=spn(n.b,0);k.b!=k.d.c;)w=(m=BB(b3(k),86)).e,d=m.f,o=e.Math.min(o,w.a-d.a/2),s=e.Math.min(s,w.b-d.b/2),a=e.Math.max(a,w.a+d.a/2),u=e.Math.max(u,w.b+d.b/2);for(l=new xC((b=BB(ZAn(r,(CAn(),Ikt)),116)).b-o,b.d-s),y=spn(n.b,0);y.b!=y.d.c;)cL(f=mMn(m=BB(b3(y),86),skt),239)&&SA(c=BB(f,33),(h=UR(m.e,l)).a-c.g/2,h.b-c.f/2);for(v=spn(n.a,0);v.b!=v.d.c;)p=BB(b3(v),188),(i=BB(mMn(p,skt),79))&&(r5(t=p.a,g=new wA(p.b.e),t.a,t.a.a),r5(t,j=new wA(p.c.e),t.c.b,t.c),ZMn(g,BB(Dpn(t,1),8),p.b.f),ZMn(j,BB(Dpn(t,t.b-2),8),p.c.f),VFn(t,cDn(i,!0,!0)));KUn(r,a-o+(b.b+b.c),u-s+(b.d+b.a),!1,!1)}function Ozn(n){var t,e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p;for(yR(o=new M2(s=n.b,0),new HX(n)),g=!1,c=1;o.b<o.d.gc();){for(Px(o.b<o.d.gc()),u=BB(o.d.Xb(o.c=o.b++),29),l1(c,s.c.length),b=BB(s.c[c],29),d=(w=a0(u.a)).c.length,l=new Wb(w);l.a<l.c.c.length;)PZ(h=BB(n0(l),10),b);if(g){for(f=W1(new fy(w),0);f.c.Sb();)for(r=new Wb(a0(fbn(h=BB(w5(f),10))));r.a<r.c.c.length;)tBn(i=BB(n0(r),17),!0),hon(n,(hWn(),qft),(hN(),!0)),e=iGn(n,i,d),t=BB(mMn(h,Rft),305),p=BB(xq(e,e.c.length-1),17),t.k=p.c.i,t.n=p,t.b=i.d.i,t.c=i;g=!1}else 0!=w.c.length&&(l1(0,w.c.length),BB(w.c[0],10).k==(uSn(),Tut)&&(g=!0,c=-1));++c}for(a=new M2(n.b,0);a.b<a.d.gc();)Px(a.b<a.d.gc()),0==BB(a.d.Xb(a.c=a.b++),29).a.c.length&&fW(a)}function Azn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v;if((f=BB(BB(h6(n.r,t),21),84)).gc()<=2||t==(kUn(),oIt)||t==(kUn(),CIt))JUn(n,t);else{for(g=n.u.Hc((lIn(),cIt)),i=t==(kUn(),sIt)?(Dan(),Rrt):(Dan(),Nrt),v=t==sIt?(G7(),irt):(G7(),crt),r=Zk(H_(i),n.s),p=t==sIt?RQn:KQn,h=f.Kc();h.Ob();)!(o=BB(h.Pb(),111)).c||o.c.d.c.length<=0||(d=o.b.rf(),w=o.e,(b=(l=o.c).i).b=(a=l.n,l.e.a+a.b+a.c),b.a=(u=l.n,l.e.b+u.d+u.a),g?(b.c=w.a-(c=l.n,l.e.a+c.b+c.c)-n.s,g=!1):b.c=w.a+d.a+n.s,OY(v,uJn),l.f=v,l9(l,(J9(),Jit)),WB(r.d,new xG(b,kln(r,b))),p=t==sIt?e.Math.min(p,w.b):e.Math.max(p,w.b+o.b.rf().b));for(p+=t==sIt?-n.t:n.t,Pwn((r.e=p,r)),s=f.Kc();s.Ob();)!(o=BB(s.Pb(),111)).c||o.c.d.c.length<=0||((b=o.c.i).c-=o.e.a,b.d-=o.e.b)}}function $zn(n,t,i){var r;if(OTn(i,"StretchWidth layering",1),0!=t.a.c.length){for(n.c=t,n.t=0,n.u=0,n.i=RQn,n.g=KQn,n.d=Gy(MD(mMn(t,(HXn(),ypt)))),zpn(n),PAn(n),SAn(n),xjn(n),ddn(n),n.i=e.Math.max(1,n.i),n.g=e.Math.max(1,n.g),n.d=n.d/n.i,n.f=n.g/n.i,n.s=_vn(n),r=new HX(n.c),WB(n.c.b,r),n.r=a0(n.p),n.n=TJ(n.k,n.k.length);0!=n.r.c.length;)n.o=zhn(n),!n.o||Ton(n)&&0!=n.b.a.gc()?(xEn(n,r),r=new HX(n.c),WB(n.c.b,r),Frn(n.a,n.b),n.b.a.$b(),n.t=n.u,n.u=0):Ton(n)?(n.c.b.c=x8(Ant,HWn,1,0,5,1),r=new HX(n.c),WB(n.c.b,r),n.t=0,n.u=0,n.b.a.$b(),n.a.a.$b(),++n.f,n.r=a0(n.p),n.n=TJ(n.k,n.k.length)):(PZ(n.o,r),y7(n.r,n.o),TU(n.b,n.o),n.t=n.t-n.k[n.o.p]*n.d+n.j[n.o.p],n.u+=n.e[n.o.p]*n.d);t.a.c=x8(Ant,HWn,1,0,5,1),JPn(t.b),HSn(i)}else HSn(i)}function Lzn(n){var t,i,r,c;for(JT(AV(new Rq(null,new w1(n.a.b,16)),new yr),new kr),fEn(n),JT(AV(new Rq(null,new w1(n.a.b,16)),new jr),new Er),n.c==(Mbn(),JPt)&&(JT(AV(wnn(new Rq(null,new w1(new Cb(n.f),1)),new Tr),new Mr),new Md(n)),JT(AV($V(wnn(wnn(new Rq(null,new w1(n.d.b,16)),new Sr),new Pr),new Cr),new Ir),new Pd(n))),c=new xC(RQn,RQn),t=new xC(KQn,KQn),r=new Wb(n.a.b);r.a<r.c.c.length;)i=BB(n0(r),57),c.a=e.Math.min(c.a,i.d.c),c.b=e.Math.min(c.b,i.d.d),t.a=e.Math.max(t.a,i.d.c+i.d.b),t.b=e.Math.max(t.b,i.d.d+i.d.a);UR(kO(n.d.c),qx(new xC(c.a,c.b))),UR(kO(n.d.f),XR(new xC(t.a,t.b),c)),oNn(n,c,t),$U(n.f),$U(n.b),$U(n.g),$U(n.e),n.a.a.c=x8(Ant,HWn,1,0,5,1),n.a.b.c=x8(Ant,HWn,1,0,5,1),n.a=null,n.d=null}function Nzn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v;for(i=new Np,w=new Wb(t.a);w.a<w.c.c.length;)if((l=(b=BB(n0(w),10)).e)&&(gun(i,Nzn(n,l,b)),EGn(n,l,b),BB(mMn(l,(hWn(),Zft)),21).Hc((bDn(),lft))))for(p=BB(mMn(b,(HXn(),ept)),98),f=BB(mMn(b,cpt),174).Hc((lIn(),eIt)),g=new Wb(b.j);g.a<g.c.c.length;)for(d=BB(n0(g),11),(r=BB(RX(n.b,d),10))||(hon(r=bXn(d,p,d.j,-(d.e.c.length-d.g.c.length),null,new Gj,d.o,BB(mMn(l,Udt),103),l),dlt,d),VW(n.b,d,r),WB(l.a,r)),c=BB(xq(r.j,0),11),s=new Wb(d.f);s.a<s.c.c.length;)o=BB(n0(s),70),(a=new qj).o.a=o.o.a,a.o.b=o.o.b,WB(c.f,a),f||(v=d.j,h=0,Hz(BB(mMn(b,cpt),21))&&(h=$In(o.n,o.o,d.o,0,v)),p==(QEn(),QCt)||(kUn(),bIt).Hc(v)?a.o.a=h:a.o.b=h);return BGn(n,t,e,i,u=new Np),e&&Cqn(n,t,e,u),u}function xzn(n,t,e){var i,r,c,a,u,o,s,h;if(!n.c[t.c.p][t.p].e){for(n.c[t.c.p][t.p].e=!0,n.c[t.c.p][t.p].b=0,n.c[t.c.p][t.p].d=0,n.c[t.c.p][t.p].a=null,h=new Wb(t.j);h.a<h.c.c.length;)for(s=BB(n0(h),11),o=(e?new Hw(s):new Gw(s)).Kc();o.Ob();)(a=(u=BB(o.Pb(),11)).i).c==t.c?a!=t&&(xzn(n,a,e),n.c[t.c.p][t.p].b+=n.c[a.c.p][a.p].b,n.c[t.c.p][t.p].d+=n.c[a.c.p][a.p].d):(n.c[t.c.p][t.p].d+=n.g[u.p],++n.c[t.c.p][t.p].b);if(c=BB(mMn(t,(hWn(),xft)),15))for(r=c.Kc();r.Ob();)i=BB(r.Pb(),10),t.c==i.c&&(xzn(n,i,e),n.c[t.c.p][t.p].b+=n.c[i.c.p][i.p].b,n.c[t.c.p][t.p].d+=n.c[i.c.p][i.p].d);n.c[t.c.p][t.p].b>0&&(n.c[t.c.p][t.p].d+=H$n(n.i,24)*uYn*.07000000029802322-.03500000014901161,n.c[t.c.p][t.p].a=n.c[t.c.p][t.p].d/n.c[t.c.p][t.p].b)}}function Dzn(n){var t,e,i,r,c,a,u,o,s,h,f,l,b,w;for(l=new Wb(n);l.a<l.c.c.length;){for(nx((f=BB(n0(l),10)).n),nx(f.o),V6(f.f),VRn(f),aRn(f),w=new Wb(f.j);w.a<w.c.c.length;){for(nx((b=BB(n0(w),11)).n),nx(b.a),nx(b.o),qCn(b,amn(b.j)),(r=BB(mMn(b,(HXn(),ipt)),19))&&hon(b,ipt,iln(-r.a)),i=new Wb(b.g);i.a<i.c.c.length;){for(t=spn((e=BB(n0(i),17)).a,0);t.b!=t.d.c;)nx(BB(b3(t),8));if(a=BB(mMn(e,vgt),74))for(c=spn(a,0);c.b!=c.d.c;)nx(BB(b3(c),8));for(s=new Wb(e.b);s.a<s.c.c.length;)nx((u=BB(n0(s),70)).n),nx(u.o)}for(h=new Wb(b.f);h.a<h.c.c.length;)nx((u=BB(n0(h),70)).n),nx(u.o)}for(f.k==(uSn(),Mut)&&(hon(f,(hWn(),Qft),amn(BB(mMn(f,Qft),61))),wxn(f)),o=new Wb(f.b);o.a<o.c.c.length;)VRn(u=BB(n0(o),70)),nx(u.o),nx(u.n)}}function Rzn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y;for(n.e=t,u=nOn(t),m=new Np,i=new Wb(u);i.a<i.c.c.length;){for(e=BB(n0(i),15),y=new Np,m.c[m.c.length]=y,o=new Rv,l=e.Kc();l.Ob();){for(c=JRn(n,f=BB(l.Pb(),33),!0,0,0),y.c[y.c.length]=c,new xC(b=f.i,w=f.j),!f.n&&(f.n=new eU(zOt,f,1,7)),h=new AL(f.n);h.e!=h.i.gc();)r=JRn(n,BB(kpn(h),137),!1,b,w),y.c[y.c.length]=r;for(!f.c&&(f.c=new eU(XOt,f,9,9)),g=new AL(f.c);g.e!=g.i.gc();)for(a=JRn(n,d=BB(kpn(g),118),!1,b,w),y.c[y.c.length]=a,p=d.i+b,v=d.j+w,!d.n&&(d.n=new eU(zOt,d,1,7)),s=new AL(d.n);s.e!=s.i.gc();)r=JRn(n,BB(kpn(s),137),!1,p,v),y.c[y.c.length]=r;Frn(o,JQ(Wen(Pun(Gk(xnt,1),HWn,20,0,[dLn(f),wLn(f)]))))}ULn(n,o,y)}return n.f=new _j(m),qan(n.f,t),n.f}function Kzn(n,t,e,i,r){var c,a,u,o,s,h,f,l,b,w,d,g;null==(w=RX(n.e,i))&&(s=BB(w=new py,183),o=new GX(t+"_s"+r),rtn(s,q6n,o)),nW(e,b=BB(w,183)),qQ(g=new py,"x",i.j),qQ(g,"y",i.k),rtn(b,U6n,g),qQ(f=new py,"x",i.b),qQ(f,"y",i.c),rtn(b,"endPoint",f),!WE((!i.a&&(i.a=new $L(xOt,i,5)),i.a))&&(c=new Wg(h=new Cl),e5((!i.a&&(i.a=new $L(xOt,i,5)),i.a),c),rtn(b,D6n,h)),!!Svn(i)&&cMn(n.a,b,K6n,RPn(n,Svn(i))),!!Pvn(i)&&cMn(n.a,b,R6n,RPn(n,Pvn(i))),!(0==(!i.e&&(i.e=new hK(FOt,i,10,9)),i.e).i)&&(a=new SI(n,l=new Cl),e5((!i.e&&(i.e=new hK(FOt,i,10,9)),i.e),a),rtn(b,F6n,l)),0!=(!i.g&&(i.g=new hK(FOt,i,9,10)),i.g).i&&(u=new PI(n,d=new Cl),e5((!i.g&&(i.g=new hK(FOt,i,9,10)),i.g),u),rtn(b,_6n,d))}function _zn(n){var t,i,r,c,a,u,o;for(qD(),r=n.f.n,u=EX(n.r).a.nc();u.Ob();){if(c=0,(a=BB(u.Pb(),111)).b.Xe((sWn(),aPt))&&(c=Gy(MD(a.b.We(aPt))))<0)switch(a.b.Hf().g){case 1:r.d=e.Math.max(r.d,-c);break;case 3:r.a=e.Math.max(r.a,-c);break;case 2:r.c=e.Math.max(r.c,-c);break;case 4:r.b=e.Math.max(r.b,-c)}if(Hz(n.u))switch(t=vcn(a.b,c),o=!BB(n.e.We(qSt),174).Hc((n_n(),HIt)),i=!1,a.b.Hf().g){case 1:i=t>r.d,r.d=e.Math.max(r.d,t),o&&i&&(r.d=e.Math.max(r.d,r.a),r.a=r.d+c);break;case 3:i=t>r.a,r.a=e.Math.max(r.a,t),o&&i&&(r.a=e.Math.max(r.a,r.d),r.d=r.a+c);break;case 2:i=t>r.c,r.c=e.Math.max(r.c,t),o&&i&&(r.c=e.Math.max(r.b,r.c),r.b=r.c+c);break;case 4:i=t>r.b,r.b=e.Math.max(r.b,t),o&&i&&(r.b=e.Math.max(r.b,r.c),r.c=r.b+c)}}}function Fzn(n){var t,e,i,r,c,a,u,o,s,h,f;for(s=new Wb(n);s.a<s.c.c.length;){switch(o=BB(n0(s),10),c=null,(a=BB(mMn(o,(HXn(),kgt)),163)).g){case 1:case 2:Jun(),c=$ht;break;case 3:case 4:Jun(),c=Oht}if(c)hon(o,(hWn(),Gft),(Jun(),$ht)),c==Oht?RNn(o,a,(ain(),Hvt)):c==$ht&&RNn(o,a,(ain(),qvt));else if(vA(BB(mMn(o,ept),98))&&0!=o.j.c.length){for(t=!0,f=new Wb(o.j);f.a<f.c.c.length;){if(!((h=BB(n0(f),11)).j==(kUn(),oIt)&&h.e.c.length-h.g.c.length>0||h.j==CIt&&h.e.c.length-h.g.c.length<0)){t=!1;break}for(r=new Wb(h.g);r.a<r.c.c.length;)if(e=BB(n0(r),17),(u=BB(mMn(e.d.i,kgt),163))==(Tbn(),Blt)||u==Hlt){t=!1;break}for(i=new Wb(h.e);i.a<i.c.c.length;)if(e=BB(n0(i),17),(u=BB(mMn(e.c.i,kgt),163))==(Tbn(),_lt)||u==Flt){t=!1;break}}t&&RNn(o,a,(ain(),Gvt))}}}function Bzn(n,t,i,r,c){var a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E;for(E=0,w=0,l=new Wb(t.e);l.a<l.c.c.length;){for(f=BB(n0(l),10),b=0,o=0,s=i?BB(mMn(f,Xmt),19).a:_Vn,v=r?BB(mMn(f,Wmt),19).a:_Vn,h=e.Math.max(s,v),y=new Wb(f.j);y.a<y.c.c.length;){if(m=BB(n0(y),11),k=f.n.b+m.n.b+m.a.b,r)for(u=new Wb(m.g);u.a<u.c.c.length;)d=(g=(a=BB(n0(u),17)).d).i,t!=n.a[d.p]&&(p=e.Math.max(BB(mMn(d,Xmt),19).a,BB(mMn(d,Wmt),19).a),(j=BB(mMn(a,(HXn(),bpt)),19).a)>=h&&j>=p&&(b+=d.n.b+g.n.b+g.a.b-k,++o));if(i)for(u=new Wb(m.e);u.a<u.c.c.length;)d=(g=(a=BB(n0(u),17)).c).i,t!=n.a[d.p]&&(p=e.Math.max(BB(mMn(d,Xmt),19).a,BB(mMn(d,Wmt),19).a),(j=BB(mMn(a,(HXn(),bpt)),19).a)>=h&&j>=p&&(b+=d.n.b+g.n.b+g.a.b-k,++o))}o>0&&(E+=b/o,++w)}w>0?(t.a=c*E/w,t.g=w):(t.a=0,t.g=0)}function Hzn(n,t){var e,i,r,c,a,u,o,s,h,f;for(i=new Wb(n.a.b);i.a<i.c.c.length;)for(u=new Wb(BB(n0(i),29).a);u.a<u.c.c.length;)a=BB(n0(u),10),t.j[a.p]=a,t.i[a.p]=t.o==(oZ(),cyt)?KQn:RQn;for($U(n.c),c=n.a.b,t.c==(gJ(),nyt)&&(c=cL(c,152)?o6(BB(c,152)):cL(c,131)?BB(c,131).a:cL(c,54)?new fy(c):new CT(c)),R9(n.e,t,n.b),yS(t.p,null),r=c.Kc();r.Ob();)for(o=BB(r.Pb(),29).a,t.o==(oZ(),cyt)&&(o=cL(o,152)?o6(BB(o,152)):cL(o,131)?BB(o,131).a:cL(o,54)?new fy(o):new CT(o)),f=o.Kc();f.Ob();)h=BB(f.Pb(),10),t.g[h.p]==h&&oXn(n,h,t);for(Hqn(n,t),e=c.Kc();e.Ob();)for(f=new Wb(BB(e.Pb(),29).a);f.a<f.c.c.length;)h=BB(n0(f),10),t.p[h.p]=t.p[t.g[h.p].p],h==t.g[h.p]&&(s=Gy(t.i[t.j[h.p].p]),(t.o==(oZ(),cyt)&&s>KQn||t.o==ryt&&s<RQn)&&(t.p[h.p]=Gy(t.p[h.p])+s));n.e.cg()}function qzn(n,t,e,i){var r,c,a,u,o;return pNn(u=new eUn(t),i),r=!0,n&&n.Xe((sWn(),bSt))&&(r=(c=BB(n.We((sWn(),bSt)),103))==(Ffn(),BPt)||c==_Pt||c==FPt),oRn(u,!1),Otn(u.e.wf(),new $_(u,!1,r)),LJ(u,u.f,(Dtn(),Git),(kUn(),sIt)),LJ(u,u.f,Uit,SIt),LJ(u,u.g,Git,CIt),LJ(u,u.g,Uit,oIt),Bpn(u,sIt),Bpn(u,SIt),hV(u,oIt),hV(u,CIt),qD(),(a=u.A.Hc((mdn(),DIt))&&u.B.Hc((n_n(),UIt))?ndn(u):null)&&rj(u.a,a),_zn(u),ryn(u),cyn(u),VGn(u),MKn(u),mkn(u),_gn(u,sIt),_gn(u,SIt),CRn(u),PHn(u),e?(Gbn(u),ykn(u),_gn(u,oIt),_gn(u,CIt),o=u.B.Hc((n_n(),XIt)),MCn(u,o,sIt),MCn(u,o,SIt),SCn(u,o,oIt),SCn(u,o,CIt),JT(new Rq(null,new w1(new Ob(u.i),0)),new In),JT(AV(new Rq(null,EX(u.r).a.oc()),new On),new An),BEn(u),u.e.uf(u.o),JT(new Rq(null,EX(u.r).a.oc()),new Ln),u.o):u.o}function Gzn(n){var t,i,r,c,a,u,o,s,h,f,l,b,w,d,g;for(h=RQn,r=new Wb(n.a.b);r.a<r.c.c.length;)t=BB(n0(r),81),h=e.Math.min(h,t.d.f.g.c+t.e.a);for(w=new YT,u=new Wb(n.a.a);u.a<u.c.c.length;)(a=BB(n0(u),189)).i=h,0==a.e&&r5(w,a,w.c.b,w.c);for(;0!=w.b;){for(c=(a=BB(0==w.b?null:(Px(0!=w.b),Atn(w,w.a.a)),189)).f.g.c,b=a.a.a.ec().Kc();b.Ob();)f=BB(b.Pb(),81),g=a.i+f.e.a,f.d.g||f.g.c<g?f.o=g:f.o=f.g.c;for(c-=a.f.o,a.b+=c,n.c==(Ffn(),FPt)||n.c==KPt?a.c+=c:a.c-=c,l=a.a.a.ec().Kc();l.Ob();)for(s=(f=BB(l.Pb(),81)).f.Kc();s.Ob();)o=BB(s.Pb(),81),d=dA(n.c)?n.f.ef(f,o):n.f.ff(f,o),o.d.i=e.Math.max(o.d.i,f.o+f.g.b+d-o.e.a),o.k||(o.d.i=e.Math.max(o.d.i,o.g.c-o.e.a)),--o.d.e,0==o.d.e&&DH(w,o.d)}for(i=new Wb(n.a.b);i.a<i.c.c.length;)(t=BB(n0(i),81)).g.c=t.o}function zzn(n){var t,e,i,r,c,a,u,o;switch(u=n.b,t=n.a,0===BB(mMn(n,(_kn(),Mit)),427).g?m$(u,new nw(new Gn)):m$(u,new nw(new zn)),1===BB(mMn(n,Eit),428).g?(m$(u,new qn),m$(u,new Un),m$(u,new Kn)):(m$(u,new qn),m$(u,new Hn)),BB(mMn(n,Pit),250).g){case 0:o=new Yn;break;case 1:o=new Vn;break;case 2:o=new Qn;break;case 3:o=new Wn;break;case 5:o=new Ow(new Qn);break;case 4:o=new Ow(new Vn);break;case 7:o=new DS(new Ow(new Vn),new Ow(new Qn));break;case 8:o=new DS(new Ow(new Wn),new Ow(new Qn));break;default:o=new Ow(new Wn)}for(a=new Wb(u);a.a<a.c.c.length;){for(c=BB(n0(a),167),r=0,e=new rI(iln(i=0),iln(r));B_n(t,c,i,r);)e=BB(o.Ce(e,c),46),i=BB(e.a,19).a,r=BB(e.b,19).a;_Rn(t,c,i,r)}}function Uzn(n){var t,e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E;for(l=(c=n.f.b).a,h=c.b,w=n.e.g,b=n.e.f,MA(n.e,c.a,c.b),j=l/w,E=h/b,s=new AL(mV(n.e));s.e!=s.i.gc();)Pen(o=BB(kpn(s),137),o.i*j),Cen(o,o.j*E);for(v=new AL(yV(n.e));v.e!=v.i.gc();)y=(p=BB(kpn(v),118)).i,k=p.j,y>0&&Pen(p,y*j),k>0&&Cen(p,k*E);for(nan(n.b,new lt),t=new Np,u=new usn(new Pb(n.c).a);u.b;)i=BB((a=ten(u)).cd(),79),e=BB(a.dd(),395).a,r=cDn(i,!1,!1),VFn(f=lTn(PMn(i),qSn(r),e),r),(m=CMn(i))&&-1==E7(t,m,0)&&(t.c[t.c.length]=m,sQ(m,(Px(0!=f.b),BB(f.a.a.c,8)),e));for(g=new usn(new Pb(n.d).a);g.b;)i=BB((d=ten(g)).cd(),79),e=BB(d.dd(),395).a,r=cDn(i,!1,!1),f=lTn(OMn(i),Jon(qSn(r)),e),VFn(f=Jon(f),r),(m=IMn(i))&&-1==E7(t,m,0)&&(t.c[t.c.length]=m,sQ(m,(Px(0!=f.b),BB(f.c.b.c,8)),e))}function Xzn(n,t,i,r){var c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E;if(0!=i.c.length){for(w=new Np,b=new Wb(i);b.a<b.c.c.length;)WB(w,new xC((l=BB(n0(b),33)).i,l.j));for(r.n&&t&&y0(r,o2(t),(Bsn(),uOt));NMn(n,i);)E$n(n,i,!1);for(r.n&&t&&y0(r,o2(t),(Bsn(),uOt)),u=0,o=0,c=null,0!=i.c.length&&(l1(0,i.c.length),u=(c=BB(i.c[0],33)).i-(l1(0,w.c.length),BB(w.c[0],8)).a,o=c.j-(l1(0,w.c.length),BB(w.c[0],8)).b),a=e.Math.sqrt(u*u+o*o),f=Uhn(i);0!=f.a.gc();){for(h=f.a.ec().Kc();h.Ob();)s=BB(h.Pb(),33),g=(d=n.f).i+d.g/2,p=d.j+d.f/2,v=s.i+s.g/2,y=s.j+s.f/2-p,j=(m=v-g)/(k=e.Math.sqrt(m*m+y*y)),E=y/k,Pen(s,s.i+j*a),Cen(s,s.j+E*a);r.n&&t&&y0(r,o2(t),(Bsn(),uOt)),f=Uhn(new t_(f))}n.a&&n.a.lg(new t_(f)),r.n&&t&&y0(r,o2(t),(Bsn(),uOt)),Xzn(n,t,new t_(f),r)}}function Wzn(n,t,i){var r,c,a,u,o,s,h,f,l,b,w,d,g,p,v;if(g=n.n,p=n.o,b=n.d,l=Gy(MD(edn(n,(HXn(),ppt)))),t){for(f=l*(t.gc()-1),w=0,s=t.Kc();s.Ob();)f+=(u=BB(s.Pb(),10)).o.a,w=e.Math.max(w,u.o.b);for(v=g.a-(f-p.a)/2,a=g.b-b.d+w,c=r=p.a/(t.gc()+1),o=t.Kc();o.Ob();)(u=BB(o.Pb(),10)).n.a=v,u.n.b=a-u.o.b,v+=u.o.a+l,(h=DLn(u)).n.a=u.o.a/2-h.a.a,h.n.b=u.o.b,(d=BB(mMn(u,(hWn(),Kft)),11)).e.c.length+d.g.c.length==1&&(d.n.a=c-d.a.a,d.n.b=0,CZ(d,n)),c+=r}if(i){for(f=l*(i.gc()-1),w=0,s=i.Kc();s.Ob();)f+=(u=BB(s.Pb(),10)).o.a,w=e.Math.max(w,u.o.b);for(v=g.a-(f-p.a)/2,a=g.b+p.b+b.a-w,c=r=p.a/(i.gc()+1),o=i.Kc();o.Ob();)(u=BB(o.Pb(),10)).n.a=v,u.n.b=a,v+=u.o.a+l,(h=DLn(u)).n.a=u.o.a/2-h.a.a,h.n.b=0,(d=BB(mMn(u,(hWn(),Kft)),11)).e.c.length+d.g.c.length==1&&(d.n.a=c-d.a.a,d.n.b=p.b,CZ(d,n)),c+=r}}function Vzn(n,t){var i,r,c,a,u,o;if(BB(mMn(t,(hWn(),Zft)),21).Hc((bDn(),lft))){for(o=new Wb(t.a);o.a<o.c.c.length;)(a=BB(n0(o),10)).k==(uSn(),Cut)&&(c=BB(mMn(a,(HXn(),Cgt)),142),n.c=e.Math.min(n.c,a.n.a-c.b),n.a=e.Math.max(n.a,a.n.a+a.o.a+c.c),n.d=e.Math.min(n.d,a.n.b-c.d),n.b=e.Math.max(n.b,a.n.b+a.o.b+c.a));for(u=new Wb(t.a);u.a<u.c.c.length;)if((a=BB(n0(u),10)).k!=(uSn(),Cut))switch(a.k.g){case 2:if((r=BB(mMn(a,(HXn(),kgt)),163))==(Tbn(),Flt)){a.n.a=n.c-10,Yyn(a,new Ge).Jb(new rd(a));break}if(r==Hlt){a.n.a=n.a+10,Yyn(a,new ze).Jb(new cd(a));break}if((i=BB(mMn(a,ilt),303))==(z7(),Cft)){lqn(a).Jb(new ad(a)),a.n.b=n.d-10;break}if(i==Sft){lqn(a).Jb(new ud(a)),a.n.b=n.b+10;break}break;default:throw Hp(new _y("The node type "+a.k+" is not supported by the "+Jot))}}}function Qzn(n,t,e,i){var r,c,a,u,o,s,h,f,l,b,w,d;for(o=new xC(i.i+i.g/2,i.j+i.f/2),l=XHn(i),b=BB(ZAn(t,(HXn(),ept)),98),d=BB(ZAn(i,upt),61),BI(lpn(i),tpt)||(w=0==i.i&&0==i.j?0:tMn(i,d),Ypn(i,tpt,w)),hon(r=bXn(i,b,d,l,new xC(t.g,t.f),o,new xC(i.g,i.f),BB(mMn(e,Udt),103),e),(hWn(),dlt),i),Hl(c=BB(xq(r.j,0),11),j_n(i)),hon(r,cpt,(lIn(),nbn(rIt))),h=BB(ZAn(t,cpt),174).Hc(eIt),u=new AL((!i.n&&(i.n=new eU(zOt,i,1,7)),i.n));u.e!=u.i.gc();)if(!qy(TD(ZAn(a=BB(kpn(u),137),Ggt)))&&a.a&&(f=Hhn(a),WB(c.f,f),!h))switch(s=0,Hz(BB(ZAn(t,cpt),21))&&(s=$In(new xC(a.i,a.j),new xC(a.g,a.f),new xC(i.g,i.f),0,d)),d.g){case 2:case 4:f.o.a=s;break;case 1:case 3:f.o.b=s}hon(r,Cpt,MD(ZAn(JJ(t),Cpt))),hon(r,Ipt,MD(ZAn(JJ(t),Ipt))),hon(r,Spt,MD(ZAn(JJ(t),Spt))),WB(e.a,r),VW(n.a,i,r)}function Yzn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m;for(OTn(e,"Processor arrange level",1),h=0,SQ(),_rn(t,new ap((qqn(),ikt))),c=t.b,u=spn(t,t.b),s=!0;s&&u.b.b!=u.d.a;)g=BB(U0(u),86),0==BB(mMn(g,ikt),19).a?--c:s=!1;if(a=new n_(new s1(t,0,c)),o=new n_(new s1(t,c,t.b)),0==a.b)for(b=spn(o,0);b.b!=b.d.c;)hon(BB(b3(b),86),hkt,iln(h++));else for(f=a.b,m=spn(a,0);m.b!=m.d.c;){for(hon(v=BB(b3(m),86),hkt,iln(h++)),Yzn(n,i=xun(v),mcn(e,1/f|0)),_rn(i,QW(new ap(hkt))),l=new YT,p=spn(i,0);p.b!=p.d.c;)for(g=BB(b3(p),86),d=spn(v.d,0);d.b!=d.d.c;)(w=BB(b3(d),188)).c==g&&r5(l,w,l.c.b,l.c);for(yQ(v.d),Frn(v.d,l),u=spn(o,o.b),r=v.d.b,s=!0;0<r&&s&&u.b.b!=u.d.a;)g=BB(U0(u),86),0==BB(mMn(g,ikt),19).a?(hon(g,hkt,iln(h++)),--r,mtn(u)):s=!1}HSn(e)}function Jzn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g;for(OTn(t,"Inverted port preprocessing",1),u=new M2(n.b,0),e=null,g=new Np;u.b<u.d.gc();){for(d=e,Px(u.b<u.d.gc()),e=BB(u.d.Xb(u.c=u.b++),29),h=new Wb(g);h.a<h.c.c.length;)PZ(o=BB(n0(h),10),d);for(g.c=x8(Ant,HWn,1,0,5,1),f=new Wb(e.a);f.a<f.c.c.length;)if((o=BB(n0(f),10)).k==(uSn(),Cut)&&vA(BB(mMn(o,(HXn(),ept)),98))){for(w=cRn(o,(ain(),Hvt),(kUn(),oIt)).Kc();w.Ob();)for(l=BB(w.Pb(),11),r=0,c=(i=BB(Qgn(a=l.e,x8(yut,c1n,17,a.c.length,0,1)),474)).length;r<c;++r)$Bn(n,l,i[r],g);for(b=cRn(o,qvt,CIt).Kc();b.Ob();)for(l=BB(b.Pb(),11),r=0,c=(i=BB(Qgn(a=l.g,x8(yut,c1n,17,a.c.length,0,1)),474)).length;r<c;++r)ABn(n,l,i[r],g)}}for(s=new Wb(g);s.a<s.c.c.length;)PZ(o=BB(n0(s),10),e);HSn(t)}function Zzn(n,t,e,i,r,c){var a,u,o,s,h,f;for(qan(s=new CSn,t),qCn(s,BB(ZAn(t,(HXn(),upt)),61)),hon(s,(hWn(),dlt),t),CZ(s,e),(f=s.o).a=t.g,f.b=t.f,(h=s.n).a=t.i,h.b=t.j,VW(n.a,t,s),(a=o5($V(wnn(new Rq(null,(!t.e&&(t.e=new hK(_Ot,t,7,4)),new w1(t.e,16))),new Vt),new Xt),new Ww(t)))||(a=o5($V(wnn(new Rq(null,(!t.d&&(t.d=new hK(_Ot,t,8,5)),new w1(t.d,16))),new Qt),new Wt),new Vw(t))),a||(a=o5(new Rq(null,(!t.e&&(t.e=new hK(_Ot,t,7,4)),new w1(t.e,16))),new Yt)),hon(s,elt,(hN(),!!a)),pqn(s,c,r,BB(ZAn(t,npt),8)),o=new AL((!t.n&&(t.n=new eU(zOt,t,1,7)),t.n));o.e!=o.i.gc();)!qy(TD(ZAn(u=BB(kpn(o),137),Ggt)))&&u.a&&WB(s.f,Hhn(u));switch(r.g){case 2:case 1:(s.j==(kUn(),sIt)||s.j==SIt)&&i.Fc((bDn(),gft));break;case 4:case 3:(s.j==(kUn(),oIt)||s.j==CIt)&&i.Fc((bDn(),gft))}return s}function nUn(n,t,i,r,c,a,u){var o,s,h,f,l,b,w,d,g,p,v,m;for(l=null,r==(dJ(),Lyt)?l=t:r==Nyt&&(l=i),d=l.a.ec().Kc();d.Ob();){for(w=BB(d.Pb(),11),g=Aon(Pun(Gk(PMt,1),sVn,8,0,[w.i.n,w.n,w.a])).b,m=new Rv,o=new Rv,h=new m6(w.b);y$(h.a)||y$(h.b);)if(qy(TD(mMn(s=BB(y$(h.a)?n0(h.a):n0(h.b),17),(hWn(),Clt))))==c&&-1!=E7(a,s,0)){if(p=s.d==w?s.c:s.d,v=Aon(Pun(Gk(PMt,1),sVn,8,0,[p.i.n,p.n,p.a])).b,e.Math.abs(v-g)<.2)continue;v<g?t.a._b(p)?TU(m,new rI(Lyt,s)):TU(m,new rI(Nyt,s)):t.a._b(p)?TU(o,new rI(Lyt,s)):TU(o,new rI(Nyt,s))}if(m.a.gc()>1)for(e5(m,new sC(n,b=new hqn(w,m,r))),u.c[u.c.length]=b,f=m.a.ec().Kc();f.Ob();)y7(a,BB(f.Pb(),46).b);if(o.a.gc()>1)for(e5(o,new hC(n,b=new hqn(w,o,r))),u.c[u.c.length]=b,f=o.a.ec().Kc();f.Ob();)y7(a,BB(f.Pb(),46).b)}}function tUn(n){NM(n,new MTn(dj(vj(wj(pj(gj(new du,w4n),"ELK Radial"),'A radial layout provider which is based on the algorithm of Peter Eades published in "Drawing free trees.", published by International Institute for Advanced Study of Social Information Science, Fujitsu Limited in 1991. The radial layouter takes a tree and places the nodes in radial order around the root. The nodes of the same tree level are placed on the same radius.'),new Ha),w4n))),u2(n,w4n,g3n,mpn(xjt)),u2(n,w4n,vZn,mpn(Kjt)),u2(n,w4n,PZn,mpn(Cjt)),u2(n,w4n,BZn,mpn(Ijt)),u2(n,w4n,SZn,mpn(Ojt)),u2(n,w4n,CZn,mpn(Pjt)),u2(n,w4n,MZn,mpn(Ajt)),u2(n,w4n,IZn,mpn(Njt)),u2(n,w4n,h4n,mpn(Mjt)),u2(n,w4n,s4n,mpn(Sjt)),u2(n,w4n,b4n,mpn($jt)),u2(n,w4n,u4n,mpn(Ljt)),u2(n,w4n,o4n,mpn(Djt)),u2(n,w4n,f4n,mpn(Rjt)),u2(n,w4n,l4n,mpn(_jt))}function eUn(n){var t;if(this.r=xV(new Pn,new Cn),this.b=new Hbn(BB(yX(FIt),290)),this.p=new Hbn(BB(yX(FIt),290)),this.i=new Hbn(BB(yX(Krt),290)),this.e=n,this.o=new wA(n.rf()),this.D=n.Df()||qy(TD(n.We((sWn(),SSt)))),this.A=BB(n.We((sWn(),KSt)),21),this.B=BB(n.We(qSt),21),this.q=BB(n.We(uPt),98),this.u=BB(n.We(fPt),21),!wMn(this.u))throw Hp(new rk("Invalid port label placement: "+this.u));if(this.v=qy(TD(n.We(bPt))),this.j=BB(n.We(DSt),21),!tLn(this.j))throw Hp(new rk("Invalid node label placement: "+this.j));this.n=BB(nkn(n,NSt),116),this.k=Gy(MD(nkn(n,OPt))),this.d=Gy(MD(nkn(n,IPt))),this.w=Gy(MD(nkn(n,RPt))),this.s=Gy(MD(nkn(n,APt))),this.t=Gy(MD(nkn(n,$Pt))),this.C=BB(nkn(n,xPt),142),this.c=2*this.d,t=!this.B.Hc((n_n(),HIt)),this.f=new Ign(0,t,0),this.g=new Ign(1,t,0),jy(this.f,(Dtn(),zit),this.g)}function iUn(n,t,i,r,c){var a,u,o,s,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M,S;for(y=0,g=0,d=0,w=1,m=new AL((!n.a&&(n.a=new eU(UOt,n,10,11)),n.a));m.e!=m.i.gc();)w+=F3(new oz(ZL(dLn(p=BB(kpn(m),33)).a.Kc(),new h))),T=p.g,g=e.Math.max(g,T),b=p.f,d=e.Math.max(d,b),y+=T*b;for(u=y+2*r*r*w*(!n.a&&(n.a=new eU(UOt,n,10,11)),n.a).i,a=e.Math.sqrt(u),s=e.Math.max(a*i,g),o=e.Math.max(a/i,d),v=new AL((!n.a&&(n.a=new eU(UOt,n,10,11)),n.a));v.e!=v.i.gc();)p=BB(kpn(v),33),M=c.b+(H$n(t,26)*rYn+H$n(t,27)*cYn)*(s-p.g),S=c.b+(H$n(t,26)*rYn+H$n(t,27)*cYn)*(o-p.f),Pen(p,M),Cen(p,S);for(E=s+(c.b+c.c),j=o+(c.d+c.a),k=new AL((!n.a&&(n.a=new eU(UOt,n,10,11)),n.a));k.e!=k.i.gc();)for(l=new oz(ZL(dLn(BB(kpn(k),33)).a.Kc(),new h));dAn(l);)nAn(f=BB(U5(l),79))||BXn(f,t,E,j);KUn(n,E+=c.b+c.c,j+=c.d+c.a,!1,!0)}function rUn(n){var t,e,i,r,c,a,u,o,s,h,f;if(null==n)throw Hp(new Mk(zWn));if(s=n,o=!1,(c=n.length)>0&&(b1(0,n.length),45!=(t=n.charCodeAt(0))&&43!=t||(n=n.substr(1),--c,o=45==t)),0==c)throw Hp(new Mk(DQn+s+'"'));for(;n.length>0&&(b1(0,n.length),48==n.charCodeAt(0));)n=n.substr(1),--c;if(c>(iFn(),xtt)[10])throw Hp(new Mk(DQn+s+'"'));for(r=0;r<c;r++)if(-1==egn((b1(r,n.length),n.charCodeAt(r))))throw Hp(new Mk(DQn+s+'"'));for(f=0,a=Ltt[10],h=Ntt[10],u=j7(Dtt[10]),e=!0,(i=c%a)>0&&(f=-parseInt(n.substr(0,i),10),n=n.substr(i),c-=i,e=!1);c>=a;){if(i=parseInt(n.substr(0,a),10),n=n.substr(a),c-=a,e)e=!1;else{if(Vhn(f,u)<0)throw Hp(new Mk(DQn+s+'"'));f=cbn(f,h)}f=ibn(f,i)}if(Vhn(f,0)>0)throw Hp(new Mk(DQn+s+'"'));if(!o&&Vhn(f=j7(f),0)<0)throw Hp(new Mk(DQn+s+'"'));return f}function cUn(n,t){var e,i,r,c,a,u,o;if(ZH(),this.a=new X$(this),this.b=n,this.c=t,this.f=OU(B7((IPn(),Z$t),t)),this.f.dc())if((u=mjn(Z$t,n))==t)for(this.e=!0,this.d=new Np,this.f=new fo,this.f.Fc(S7n),BB(NHn(F7(Z$t,Utn(n)),""),26)==n&&this.f.Fc(az(Z$t,Utn(n))),r=EKn(Z$t,n).Kc();r.Ob();)switch(i=BB(r.Pb(),170),DW(B7(Z$t,i))){case 4:this.d.Fc(i);break;case 5:this.f.Gc(OU(B7(Z$t,i)))}else if(ZM(),BB(t,66).Oj())for(this.e=!0,this.f=null,this.d=new Np,a=0,o=(null==n.i&&qFn(n),n.i).length;a<o;++a)for(null==n.i&&qFn(n),e=n.i,i=a>=0&&a<e.length?e[a]:null,c=Z1(B7(Z$t,i));c;c=Z1(B7(Z$t,c)))c==t&&this.d.Fc(i);else 1==DW(B7(Z$t,t))&&u?(this.f=null,this.d=(TOn(),bLt)):(this.f=null,this.e=!0,this.d=(SQ(),new Gb(t)));else this.e=5==DW(B7(Z$t,t)),this.f.Fb(uLt)&&(this.f=uLt)}function aUn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d;for(i=0,r=Pmn(n,t),b=n.s,w=n.t,h=BB(BB(h6(n.r,t),21),84).Kc();h.Ob();)if((s=BB(h.Pb(),111)).c&&!(s.c.d.c.length<=0)){switch(d=s.b.rf(),o=s.b.Xe((sWn(),aPt))?Gy(MD(s.b.We(aPt))):0,(l=(f=s.c).i).b=(u=f.n,f.e.a+u.b+u.c),l.a=(a=f.n,f.e.b+a.d+a.a),t.g){case 1:l.c=s.a?(d.a-l.b)/2:d.a+b,l.d=d.b+o+r,l9(f,(J9(),Qit)),WD(f,(G7(),crt));break;case 3:l.c=s.a?(d.a-l.b)/2:d.a+b,l.d=-o-r-l.a,l9(f,(J9(),Qit)),WD(f,(G7(),irt));break;case 2:l.c=-o-r-l.b,s.a?(c=n.v?l.a:BB(xq(f.d,0),181).rf().b,l.d=(d.b-c)/2):l.d=d.b+w,l9(f,(J9(),Jit)),WD(f,(G7(),rrt));break;case 4:l.c=d.a+o+r,s.a?(c=n.v?l.a:BB(xq(f.d,0),181).rf().b,l.d=(d.b-c)/2):l.d=d.b+w,l9(f,(J9(),Yit)),WD(f,(G7(),rrt))}(t==(kUn(),sIt)||t==SIt)&&(i=e.Math.max(i,l.a))}i>0&&(BB(oV(n.b,t),124).a.b=i)}function uUn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g;for(OTn(t,"Comment pre-processing",1),e=0,o=new Wb(n.a);o.a<o.c.c.length;)if(qy(TD(mMn(u=BB(n0(o),10),(HXn(),Tdt))))){for(++e,r=0,i=null,s=null,w=new Wb(u.j);w.a<w.c.c.length;)r+=(l=BB(n0(w),11)).e.c.length+l.g.c.length,1==l.e.c.length&&(s=(i=BB(xq(l.e,0),17)).c),1==l.g.c.length&&(s=(i=BB(xq(l.g,0),17)).d);if(1!=r||s.e.c.length+s.g.c.length!=1||qy(TD(mMn(s.i,Tdt)))){for(g=new Np,b=new Wb(u.j);b.a<b.c.c.length;){for(f=new Wb((l=BB(n0(b),11)).g);f.a<f.c.c.length;)0==(h=BB(n0(f),17)).d.g.c.length||(g.c[g.c.length]=h);for(a=new Wb(l.e);a.a<a.c.c.length;)0==(c=BB(n0(a),17)).c.e.c.length||(g.c[g.c.length]=c)}for(d=new Wb(g);d.a<d.c.c.length;)tBn(BB(n0(d),17),!0)}else nXn(u,i,s,s.i),AU(o)}t.n&&OH(t,"Found "+e+" comment boxes"),HSn(t)}function oUn(n,t,e,i){var r,c,a,u,o,s,h,f,l,b,w,d;if(l=Gy(MD(mMn(n,(HXn(),Cpt)))),b=Gy(MD(mMn(n,Ipt))),f=Gy(MD(mMn(n,Spt))),u=n.o,a=(c=BB(xq(n.j,0),11)).n,d=TPn(c,f)){if(t.Hc((lIn(),eIt)))switch(BB(mMn(n,(hWn(),Qft)),61).g){case 1:d.c=(u.a-d.b)/2-a.a,d.d=b;break;case 3:d.c=(u.a-d.b)/2-a.a,d.d=-b-d.a;break;case 2:e&&0==c.e.c.length&&0==c.g.c.length?(h=i?d.a:BB(xq(c.f,0),70).o.b,d.d=(u.b-h)/2-a.b):d.d=u.b+b-a.b,d.c=-l-d.b;break;case 4:e&&0==c.e.c.length&&0==c.g.c.length?(h=i?d.a:BB(xq(c.f,0),70).o.b,d.d=(u.b-h)/2-a.b):d.d=u.b+b-a.b,d.c=l}else if(t.Hc(rIt))switch(BB(mMn(n,(hWn(),Qft)),61).g){case 1:case 3:d.c=a.a+l;break;case 2:case 4:e&&!c.c?(h=i?d.a:BB(xq(c.f,0),70).o.b,d.d=(u.b-h)/2-a.b):d.d=a.b+b}for(r=d.d,s=new Wb(c.f);s.a<s.c.c.length;)(w=(o=BB(n0(s),70)).n).a=d.c,w.b=r,r+=o.o.b+f}}function sUn(){RO(wLt,new Vs),RO(zLt,new ah),RO(ULt,new ph),RO(XLt,new Ch),RO(Qtt,new $h),RO(Gk(NNt,1),new Lh),RO(ktt,new Nh),RO(Ttt,new xh),RO(Qtt,new _s),RO(Qtt,new Fs),RO(Qtt,new Bs),RO(Ptt,new Hs),RO(Qtt,new qs),RO(Rnt,new Gs),RO(Rnt,new zs),RO(Qtt,new Us),RO(Ctt,new Xs),RO(Qtt,new Ws),RO(Qtt,new Qs),RO(Qtt,new Ys),RO(Qtt,new Js),RO(Qtt,new Zs),RO(Gk(NNt,1),new nh),RO(Qtt,new th),RO(Qtt,new eh),RO(Rnt,new ih),RO(Rnt,new rh),RO(Qtt,new ch),RO(Att,new uh),RO(Qtt,new oh),RO(Rtt,new sh),RO(Qtt,new hh),RO(Qtt,new fh),RO(Qtt,new lh),RO(Qtt,new bh),RO(Rnt,new wh),RO(Rnt,new dh),RO(Qtt,new gh),RO(Qtt,new vh),RO(Qtt,new mh),RO(Qtt,new yh),RO(Qtt,new kh),RO(Qtt,new jh),RO(_tt,new Eh),RO(Qtt,new Th),RO(Qtt,new Mh),RO(Qtt,new Sh),RO(_tt,new Ph),RO(Rtt,new Ih),RO(Qtt,new Oh),RO(Att,new Ah)}function hUn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v;if((f=t.length)>0&&(b1(0,t.length),64!=(u=t.charCodeAt(0)))){if(37==u&&(o=!1,0!=(h=t.lastIndexOf("%"))&&(h==f-1||(b1(h+1,t.length),o=46==t.charCodeAt(h+1))))){if(v=mK("%",a=t.substr(1,h-1))?null:$Un(a),i=0,o)try{i=l_n(t.substr(h+2),_Vn,DWn)}catch(m){throw cL(m=lun(m),127)?Hp(new L7(m)):Hp(m)}for(d=Ern(n.Wg());d.Ob();)if(cL(b=Man(d),510)&&(p=(r=BB(b,590)).d,(null==v?null==p:mK(v,p))&&0==i--))return r;return null}if(l=-1==(s=t.lastIndexOf("."))?t:t.substr(0,s),e=0,-1!=s)try{e=l_n(t.substr(s+1),_Vn,DWn)}catch(m){if(!cL(m=lun(m),127))throw Hp(m);l=t}for(l=mK("%",l)?null:$Un(l),w=Ern(n.Wg());w.Ob();)if(cL(b=Man(w),191)&&(g=(c=BB(b,191)).ne(),(null==l?null==g:mK(l,g))&&0==e--))return c;return null}return _qn(n,t)}function fUn(n){var t,e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T;for(m=new Np,f=new Wb(n.b);f.a<f.c.c.length;)for(w=new Wb(BB(n0(f),29).a);w.a<w.c.c.length;)if((l=BB(n0(w),10)).k==(uSn(),Mut)&&Lx(l,(hWn(),Vft))){for(d=null,p=null,g=null,j=new Wb(l.j);j.a<j.c.c.length;)switch((k=BB(n0(j),11)).j.g){case 4:d=k;break;case 2:p=k;break;default:g=k}for(s=new Kj((v=BB(xq(g.g,0),17)).a),UR(o=new wA(g.n),l.n),nX(spn(s,0),o),y=Jon(v.a),UR(h=new wA(g.n),l.n),r5(y,h,y.c.b,y.c),E=BB(mMn(l,Vft),10),T=BB(xq(E.j,0),11),c=0,u=(i=BB(Qgn(d.e,x8(yut,c1n,17,0,0,1)),474)).length;c<u;++c)MZ(t=i[c],T),Wsn(t.a,t.a.b,s);for(r=0,a=(e=Z0(p.g)).length;r<a;++r)SZ(t=e[r],T),Wsn(t.a,0,y);SZ(v,null),MZ(v,null),m.c[m.c.length]=l}for(b=new Wb(m);b.a<b.c.c.length;)PZ(l=BB(n0(b),10),null)}function lUn(){var n,t,e;for(lUn=O,new knn(1,0),new knn(10,0),new knn(0,0),Htt=x8(iet,sVn,240,11,0,1),qtt=x8(ONt,WVn,25,100,15,1),Gtt=Pun(Gk(xNt,1),qQn,25,15,[1,5,25,125,625,3125,15625,78125,390625,1953125,9765625,48828125,244140625,1220703125,6103515625,30517578125,152587890625,762939453125,3814697265625,19073486328125,95367431640625,476837158203125,0x878678326eac9]),ztt=x8(ANt,hQn,25,Gtt.length,15,1),Utt=Pun(Gk(xNt,1),qQn,25,15,[1,10,100,VVn,1e4,GQn,1e6,1e7,1e8,AQn,1e10,1e11,1e12,1e13,1e14,1e15,1e16]),Xtt=x8(ANt,hQn,25,Utt.length,15,1),Wtt=x8(iet,sVn,240,11,0,1),n=0;n<Wtt.length;n++)Htt[n]=new knn(n,0),Wtt[n]=new knn(0,n),qtt[n]=48;for(;n<qtt.length;n++)qtt[n]=48;for(e=0;e<ztt.length;e++)ztt[e]=aIn(Gtt[e]);for(t=0;t<Xtt.length;t++)Xtt[t]=aIn(Utt[t]);$On()}function bUn(){function n(){this.obj=this.createObject()}return n.prototype.createObject=function(n){return Object.create(null)},n.prototype.get=function(n){return this.obj[n]},n.prototype.set=function(n,t){this.obj[n]=t},n.prototype[iYn]=function(n){delete this.obj[n]},n.prototype.keys=function(){return Object.getOwnPropertyNames(this.obj)},n.prototype.entries=function(){var n=this.keys(),t=this,e=0;return{next:function(){if(e>=n.length)return{done:!0};var i=n[e++];return{value:[i,t.get(i)],done:!1}}}},zDn()||(n.prototype.createObject=function(){return{}},n.prototype.get=function(n){return this.obj[":"+n]},n.prototype.set=function(n,t){this.obj[":"+n]=t},n.prototype[iYn]=function(n){delete this.obj[":"+n]},n.prototype.keys=function(){var n=[];for(var t in this.obj)58==t.charCodeAt(0)&&n.push(t.substring(1));return n}),n}function wUn(n){var t,e,i,r,c,a,u,o,s,h,f,l,b,w,d;if(PFn(),null==n)return null;if(0==(f=8*n.length))return"";for(l=f/24|0,c=null,c=x8(ONt,WVn,25,4*(0!=(u=f%24)?l+1:l),15,1),s=0,h=0,t=0,e=0,i=0,a=0,r=0,o=0;o<l;o++)t=n[r++],h=(15&(e=n[r++]))<<24>>24,s=(3&t)<<24>>24,b=0==(-128&t)?t>>2<<24>>24:(t>>2^192)<<24>>24,w=0==(-128&e)?e>>4<<24>>24:(e>>4^240)<<24>>24,d=0==(-128&(i=n[r++]))?i>>6<<24>>24:(i>>6^252)<<24>>24,c[a++]=VLt[b],c[a++]=VLt[w|s<<4],c[a++]=VLt[h<<2|d],c[a++]=VLt[63&i];return 8==u?(s=(3&(t=n[r]))<<24>>24,b=0==(-128&t)?t>>2<<24>>24:(t>>2^192)<<24>>24,c[a++]=VLt[b],c[a++]=VLt[s<<4],c[a++]=61,c[a++]=61):16==u&&(t=n[r],h=(15&(e=n[r+1]))<<24>>24,s=(3&t)<<24>>24,b=0==(-128&t)?t>>2<<24>>24:(t>>2^192)<<24>>24,w=0==(-128&e)?e>>4<<24>>24:(e>>4^240)<<24>>24,c[a++]=VLt[b],c[a++]=VLt[w|s<<4],c[a++]=VLt[h<<2],c[a++]=61),Bdn(c,0,c.length)}function dUn(n,t){var i,r,c,a,u,o;if(0==n.e&&n.p>0&&(n.p=-(n.p-1)),n.p>_Vn&&e4(t,n.p-sQn),u=t.q.getDate(),FJ(t,1),n.k>=0&&vZ(t,n.k),n.c>=0?FJ(t,n.c):n.k>=0?(r=35-new von(t.q.getFullYear()-sQn,t.q.getMonth(),35).q.getDate(),FJ(t,e.Math.min(r,u))):FJ(t,u),n.f<0&&(n.f=t.q.getHours()),n.b>0&&n.f<12&&(n.f+=12),aL(t,24==n.f&&n.g?0:n.f),n.j>=0&&g6(t,n.j),n.n>=0&&U8(t,n.n),n.i>=0&&dO(t,rbn(cbn(Ojn(fan(t.q.getTime()),VVn),VVn),n.i)),n.a&&(e4(c=new AT,c.q.getFullYear()-sQn-80),sS(fan(t.q.getTime()),fan(c.q.getTime()))&&e4(t,c.q.getFullYear()-sQn+100)),n.d>=0)if(-1==n.c)(i=(7+n.d-t.q.getDay())%7)>3&&(i-=7),o=t.q.getMonth(),FJ(t,t.q.getDate()+i),t.q.getMonth()!=o&&FJ(t,t.q.getDate()+(i>0?-7:7));else if(t.q.getDay()!=n.d)return!1;return n.o>_Vn&&(a=t.q.getTimezoneOffset(),dO(t,rbn(fan(t.q.getTime()),60*(n.o-a)*VVn))),!0}function gUn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p;if(cL(r=mMn(t,(hWn(),dlt)),239)){for(b=BB(r,33),w=t.e,f=new wA(t.c),c=t.d,f.a+=c.b,f.b+=c.d,SN(BB(ZAn(b,(HXn(),qgt)),174),(n_n(),qIt))&&(Ol(l=BB(ZAn(b,zgt),116),c.a),_l(l,c.d),Al(l,c.b),Fl(l,c.c)),e=new Np,s=new Wb(t.a);s.a<s.c.c.length;)for(cL(mMn(u=BB(n0(s),10),dlt),239)?CUn(u,f):cL(mMn(u,dlt),186)&&!w&&SA(i=BB(mMn(u,dlt),118),(g=yFn(t,u,i.g,i.f)).a,g.b),d=new Wb(u.j);d.a<d.c.c.length;)JT(AV(new Rq(null,new w1(BB(n0(d),11).g,16)),new Qw(u)),new Yw(e));if(w)for(d=new Wb(w.j);d.a<d.c.c.length;)JT(AV(new Rq(null,new w1(BB(n0(d),11).g,16)),new Jw(w)),new Zw(e));for(p=BB(ZAn(b,Zdt),218),a=new Wb(e);a.a<a.c.c.length;)pzn(BB(n0(a),17),p,f);for(m_n(t),o=new Wb(t.a);o.a<o.c.c.length;)(h=(u=BB(n0(o),10)).e)&&gUn(n,h)}}function pUn(n){NM(n,new MTn(mj(dj(vj(wj(pj(gj(new du,gZn),"ELK Force"),"Force-based algorithm provided by the Eclipse Layout Kernel. Implements methods that follow physical analogies by simulating forces that move the nodes into a balanced distribution. Currently the original Eades model and the Fruchterman - Reingold model are supported."),new dt),gZn),EG((hAn(),tAt),Pun(Gk(aAt,1),$Vn,237,0,[ZOt]))))),u2(n,gZn,pZn,iln(1)),u2(n,gZn,vZn,80),u2(n,gZn,mZn,5),u2(n,gZn,VJn,dZn),u2(n,gZn,yZn,iln(1)),u2(n,gZn,kZn,(hN(),!0)),u2(n,gZn,QJn,Qct),u2(n,gZn,jZn,mpn(Hct)),u2(n,gZn,EZn,mpn(Yct)),u2(n,gZn,TZn,!1),u2(n,gZn,MZn,mpn(Wct)),u2(n,gZn,SZn,mpn(Xct)),u2(n,gZn,PZn,mpn(Uct)),u2(n,gZn,CZn,mpn(zct)),u2(n,gZn,IZn,mpn(Jct)),u2(n,gZn,oZn,mpn(Gct)),u2(n,gZn,fZn,mpn(aat)),u2(n,gZn,sZn,mpn(qct)),u2(n,gZn,bZn,mpn(tat)),u2(n,gZn,hZn,mpn(eat))}function vUn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w;if(!BB(BB(h6(n.r,t),21),84).dc()){if(s=(u=BB(oV(n.b,t),124)).i,o=u.n,f=PDn(n,t),r=s.b-o.b-o.c,c=u.a.a,a=s.c+o.b,w=n.w,f!=(cpn(),BCt)&&f!=qCt||1!=BB(BB(h6(n.r,t),21),84).gc()||(c=f==BCt?c-2*n.w:c,f=FCt),r<c&&!n.B.Hc((n_n(),WIt)))f==BCt?a+=w+=(r-c)/(BB(BB(h6(n.r,t),21),84).gc()+1):w+=(r-c)/(BB(BB(h6(n.r,t),21),84).gc()-1);else switch(r<c&&(c=f==BCt?c-2*n.w:c,f=FCt),f.g){case 3:a+=(r-c)/2;break;case 4:a+=r-c;break;case 0:i=(r-c)/(BB(BB(h6(n.r,t),21),84).gc()+1),a+=w+=e.Math.max(0,i);break;case 1:i=(r-c)/(BB(BB(h6(n.r,t),21),84).gc()-1),w+=e.Math.max(0,i)}for(b=BB(BB(h6(n.r,t),21),84).Kc();b.Ob();)(l=BB(b.Pb(),111)).e.a=a+l.d.b,l.e.b=(h=l.b).Xe((sWn(),aPt))?h.Hf()==(kUn(),sIt)?-h.rf().b-Gy(MD(h.We(aPt))):Gy(MD(h.We(aPt))):h.Hf()==(kUn(),sIt)?-h.rf().b:0,a+=l.d.b+l.b.rf().a+l.d.c+w}}function mUn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d;if(!BB(BB(h6(n.r,t),21),84).dc()){if(s=(u=BB(oV(n.b,t),124)).i,o=u.n,l=PDn(n,t),r=s.a-o.d-o.a,c=u.a.b,a=s.d+o.d,d=n.w,h=n.o.a,l!=(cpn(),BCt)&&l!=qCt||1!=BB(BB(h6(n.r,t),21),84).gc()||(c=l==BCt?c-2*n.w:c,l=FCt),r<c&&!n.B.Hc((n_n(),WIt)))l==BCt?a+=d+=(r-c)/(BB(BB(h6(n.r,t),21),84).gc()+1):d+=(r-c)/(BB(BB(h6(n.r,t),21),84).gc()-1);else switch(r<c&&(c=l==BCt?c-2*n.w:c,l=FCt),l.g){case 3:a+=(r-c)/2;break;case 4:a+=r-c;break;case 0:i=(r-c)/(BB(BB(h6(n.r,t),21),84).gc()+1),a+=d+=e.Math.max(0,i);break;case 1:i=(r-c)/(BB(BB(h6(n.r,t),21),84).gc()-1),d+=e.Math.max(0,i)}for(w=BB(BB(h6(n.r,t),21),84).Kc();w.Ob();)(b=BB(w.Pb(),111)).e.a=(f=b.b).Xe((sWn(),aPt))?f.Hf()==(kUn(),CIt)?-f.rf().a-Gy(MD(f.We(aPt))):h+Gy(MD(f.We(aPt))):f.Hf()==(kUn(),CIt)?-f.rf().a:h,b.e.b=a+b.d.d,a+=b.d.d+b.b.rf().b+b.d.a+d}}function yUn(n){var t,i,r,c,a,u,o,s,f,l,b,w,d,g,p;for(n.n=Gy(MD(mMn(n.g,(HXn(),Opt)))),n.e=Gy(MD(mMn(n.g,Tpt))),n.i=n.g.b.c.length,o=n.i-1,w=0,n.j=0,n.k=0,n.a=u6(x8(Att,sVn,19,n.i,0,1)),n.b=u6(x8(Ptt,sVn,333,n.i,7,1)),u=new Wb(n.g.b);u.a<u.c.c.length;){for((c=BB(n0(u),29)).p=o,b=new Wb(c.a);b.a<b.c.c.length;)(l=BB(n0(b),10)).p=w,++w;--o}for(n.f=x8(ANt,hQn,25,w,15,1),n.c=kq(ANt,[sVn,hQn],[48,25],15,[w,3],2),n.o=new Np,n.p=new Np,t=0,n.d=0,a=new Wb(n.g.b);a.a<a.c.c.length;){for(o=(c=BB(n0(a),29)).p,r=0,p=0,s=c.a.c.length,f=0,b=new Wb(c.a);b.a<b.c.c.length;)w=(l=BB(n0(b),10)).p,n.f[w]=l.c.p,f+=l.o.b+n.n,i=F3(new oz(ZL(fbn(l).a.Kc(),new h))),g=F3(new oz(ZL(lbn(l).a.Kc(),new h))),n.c[w][0]=g-i,n.c[w][1]=i,n.c[w][2]=g,r+=i,p+=g,i>0&&WB(n.p,l),WB(n.o,l);d=s+(t-=r),f+=t*n.e,c5(n.a,o,iln(d)),c5(n.b,o,f),n.j=e.Math.max(n.j,d),n.k=e.Math.max(n.k,f),n.d+=t,t+=p}}function kUn(){var n;kUn=O,PIt=new WC(hJn,0),sIt=new WC(mJn,1),oIt=new WC(yJn,2),SIt=new WC(kJn,3),CIt=new WC(jJn,4),SQ(),wIt=new Ak(new YK(n=BB(Vj(FIt),9),BB(SR(n,n.length),9),0)),dIt=ffn(EG(sIt,Pun(Gk(FIt,1),YZn,61,0,[]))),hIt=ffn(EG(oIt,Pun(Gk(FIt,1),YZn,61,0,[]))),EIt=ffn(EG(SIt,Pun(Gk(FIt,1),YZn,61,0,[]))),MIt=ffn(EG(CIt,Pun(Gk(FIt,1),YZn,61,0,[]))),yIt=ffn(EG(sIt,Pun(Gk(FIt,1),YZn,61,0,[SIt]))),bIt=ffn(EG(oIt,Pun(Gk(FIt,1),YZn,61,0,[CIt]))),jIt=ffn(EG(sIt,Pun(Gk(FIt,1),YZn,61,0,[CIt]))),gIt=ffn(EG(sIt,Pun(Gk(FIt,1),YZn,61,0,[oIt]))),TIt=ffn(EG(SIt,Pun(Gk(FIt,1),YZn,61,0,[CIt]))),fIt=ffn(EG(oIt,Pun(Gk(FIt,1),YZn,61,0,[SIt]))),mIt=ffn(EG(sIt,Pun(Gk(FIt,1),YZn,61,0,[oIt,CIt]))),lIt=ffn(EG(oIt,Pun(Gk(FIt,1),YZn,61,0,[SIt,CIt]))),kIt=ffn(EG(sIt,Pun(Gk(FIt,1),YZn,61,0,[SIt,CIt]))),pIt=ffn(EG(sIt,Pun(Gk(FIt,1),YZn,61,0,[oIt,SIt]))),vIt=ffn(EG(sIt,Pun(Gk(FIt,1),YZn,61,0,[oIt,SIt,CIt])))}function jUn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v;if(0!=t.b){for(l=new YT,a=null,b=null,i=CJ(e.Math.floor(e.Math.log(t.b)*e.Math.LOG10E)+1),u=0,v=spn(t,0);v.b!=v.d.c;)for(g=BB(b3(v),86),GI(b)!==GI(mMn(g,(qqn(),rkt)))&&(b=SD(mMn(g,rkt)),u=0),a=null!=b?b+d0(u++,i):d0(u++,i),hon(g,rkt,a),d=new wg(spn(new bg(g).a.d,0));EE(d.a);)r5(l,w=BB(b3(d.a),188).c,l.c.b,l.c),hon(w,rkt,a);for(f=new xp,c=0;c<a.length-i;c++)for(p=spn(t,0);p.b!=p.d.c;)mZ(f,o=fx(SD(mMn(g=BB(b3(p),86),(qqn(),rkt))),0,c+1),iln(null!=(null==o?qI(AY(f.f,null)):hS(f.g,o))?BB(null==o?qI(AY(f.f,null)):hS(f.g,o),19).a+1:1));for(h=new usn(new Pb(f).a);h.b;)s=ten(h),r=iln(null!=RX(n.a,s.cd())?BB(RX(n.a,s.cd()),19).a:0),mZ(n.a,SD(s.cd()),iln(BB(s.dd(),19).a+r.a)),(!(r=BB(RX(n.b,s.cd()),19))||r.a<BB(s.dd(),19).a)&&mZ(n.b,SD(s.cd()),BB(s.dd(),19));jUn(n,l)}}function EUn(n,t,i){var r,c,a,u,o,s,h,f,l,b,w,d,g,p,v;for(OTn(i,"Interactive node layering",1),r=new Np,w=new Wb(t.a);w.a<w.c.c.length;){for(s=(h=(l=BB(n0(w),10)).n.a)+l.o.a,s=e.Math.max(h+1,s),v=new M2(r,0),c=null;v.b<v.d.gc();){if(Px(v.b<v.d.gc()),(g=BB(v.d.Xb(v.c=v.b++),569)).c>=s){Px(v.b>0),v.a.Xb(v.c=--v.b);break}g.a>h&&(c?(gun(c.b,g.b),c.a=e.Math.max(c.a,g.a),fW(v)):(WB(g.b,l),g.c=e.Math.min(g.c,h),g.a=e.Math.max(g.a,s),c=g))}c||((c=new im).c=h,c.a=s,yR(v,c),WB(c.b,l))}for(o=t.b,f=0,p=new Wb(r);p.a<p.c.c.length;)for(g=BB(n0(p),569),(a=new HX(t)).p=f++,o.c[o.c.length]=a,d=new Wb(g.b);d.a<d.c.c.length;)PZ(l=BB(n0(d),10),a),l.p=0;for(b=new Wb(t.a);b.a<b.c.c.length;)0==(l=BB(n0(b),10)).p&&CDn(n,l,t);for(u=new M2(o,0);u.b<u.d.gc();)0==(Px(u.b<u.d.gc()),BB(u.d.Xb(u.c=u.b++),29)).a.c.length&&fW(u);t.a.c=x8(Ant,HWn,1,0,5,1),HSn(i)}function TUn(n,t,e){var i,r,c,a,u,o,s,h,f,l;if(0!=t.e.c.length&&0!=e.e.c.length){if((i=BB(xq(t.e,0),17).c.i)==(a=BB(xq(e.e,0),17).c.i))return E$(BB(mMn(BB(xq(t.e,0),17),(hWn(),wlt)),19).a,BB(mMn(BB(xq(e.e,0),17),wlt),19).a);for(f=0,l=(h=n.a).length;f<l;++f){if((s=h[f])==i)return 1;if(s==a)return-1}}return 0!=t.g.c.length&&0!=e.g.c.length?(c=BB(mMn(t,(hWn(),llt)),10),o=BB(mMn(e,llt),10),r=0,u=0,Lx(BB(xq(t.g,0),17),wlt)&&(r=BB(mMn(BB(xq(t.g,0),17),wlt),19).a),Lx(BB(xq(e.g,0),17),wlt)&&(u=BB(mMn(BB(xq(t.g,0),17),wlt),19).a),c&&c==o?qy(TD(mMn(BB(xq(t.g,0),17),Clt)))&&!qy(TD(mMn(BB(xq(e.g,0),17),Clt)))?1:!qy(TD(mMn(BB(xq(t.g,0),17),Clt)))&&qy(TD(mMn(BB(xq(e.g,0),17),Clt)))||r<u?-1:r>u?1:0:(n.b&&(n.b._b(c)&&(r=BB(n.b.xc(c),19).a),n.b._b(o)&&(u=BB(n.b.xc(o),19).a)),r<u?-1:r>u?1:0)):0!=t.e.c.length&&0!=e.g.c.length?1:-1}function MUn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k;for(OTn(t,O1n,1),w=new Np,y=new Np,s=new Wb(n.b);s.a<s.c.c.length;)for(g=-1,l=0,b=(f=n2((o=BB(n0(s),29)).a)).length;l<b;++l)if(++g,(h=f[l]).k==(uSn(),Cut)&&vA(BB(mMn(h,(HXn(),ept)),98))){for(LK(BB(mMn(h,(HXn(),ept)),98))||HNn(h),hon(h,(hWn(),rlt),h),w.c=x8(Ant,HWn,1,0,5,1),y.c=x8(Ant,HWn,1,0,5,1),e=new Np,qrn(v=new YT,DSn(h,(kUn(),sIt))),AXn(n,v,w,y,e),u=g,k=h,c=new Wb(w);c.a<c.c.c.length;)Qyn(i=BB(n0(c),10),u,o),++g,hon(i,rlt,h),a=BB(xq(i.j,0),11),d=BB(mMn(a,dlt),11),qy(TD(mMn(d,jdt)))||BB(mMn(i,clt),15).Fc(k);for(yQ(v),p=DSn(h,SIt).Kc();p.Ob();)r5(v,BB(p.Pb(),11),v.a,v.a.a);for(AXn(n,v,y,null,e),m=h,r=new Wb(y);r.a<r.c.c.length;)Qyn(i=BB(n0(r),10),++g,o),hon(i,rlt,h),a=BB(xq(i.j,0),11),d=BB(mMn(a,dlt),11),qy(TD(mMn(d,jdt)))||BB(mMn(m,clt),15).Fc(i);0==e.c.length||hon(h,xft,e)}HSn(t)}function SUn(n){var t,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M,S,P;for(h=BB(mMn(n,(Mrn(),sat)),33),d=DWn,g=DWn,b=_Vn,w=_Vn,v=new Wb(n.e);v.a<v.c.c.length;)E=(p=BB(n0(v),144)).d,T=p.e,d=e.Math.min(d,E.a-T.a/2),g=e.Math.min(g,E.b-T.b/2),b=e.Math.max(b,E.a+T.a/2),w=e.Math.max(w,E.b+T.b/2);for(k=new xC((j=BB(ZAn(h,(fRn(),Vct)),116)).b-d,j.d-g),o=new Wb(n.e);o.a<o.c.c.length;)cL(y=mMn(u=BB(n0(o),144),sat),239)&&SA(f=BB(y,33),(m=UR(u.d,k)).a-f.g/2,m.b-f.f/2);for(r=new Wb(n.c);r.a<r.c.c.length;)i=BB(n0(r),282),s=cDn(BB(mMn(i,sat),79),!0,!0),Ukn(S=XR(B$(i.d.d),i.c.d),i.c.e.a,i.c.e.b),CA(s,(M=UR(S,i.c.d)).a,M.b),Ukn(P=XR(B$(i.c.d),i.d.d),i.d.e.a,i.d.e.b),PA(s,(t=UR(P,i.d.d)).a,t.b);for(a=new Wb(n.d);a.a<a.c.c.length;)c=BB(n0(a),447),SA(BB(mMn(c,sat),137),(l=UR(c.d,k)).a,l.b);KUn(h,b-d+(j.b+j.c),w-g+(j.d+j.a),!1,!0)}function PUn(n){var t,e,i,r,c,a,u,o,s,h,f;for(e=null,u=null,(r=BB(mMn(n.b,(HXn(),igt)),376))==(A6(),Jvt)&&(e=new Np,u=new Np),a=new Wb(n.d);a.a<a.c.c.length;)if((c=BB(n0(a),101)).i)switch(c.e.g){case 0:t=BB(u4(new QT(c.b)),61),r==Jvt&&t==(kUn(),sIt)?e.c[e.c.length]=c:r==Jvt&&t==(kUn(),SIt)?u.c[u.c.length]=c:Nmn(c,t);break;case 1:o=c.a.d.j,s=c.c.d.j,o==(kUn(),sIt)?bU(c,sIt,(Oun(),mst),c.a):s==sIt?bU(c,sIt,(Oun(),yst),c.c):o==SIt?bU(c,SIt,(Oun(),yst),c.a):s==SIt&&bU(c,SIt,(Oun(),mst),c.c);break;case 2:case 3:SN(i=c.b,(kUn(),sIt))?SN(i,SIt)?SN(i,CIt)?SN(i,oIt)||bU(c,sIt,(Oun(),yst),c.c):bU(c,sIt,(Oun(),mst),c.a):bU(c,sIt,(Oun(),vst),null):bU(c,SIt,(Oun(),vst),null);break;case 4:h=c.a.d.j,f=c.a.d.j,h==(kUn(),sIt)||f==sIt?bU(c,SIt,(Oun(),vst),null):bU(c,sIt,(Oun(),vst),null)}e&&(0==e.c.length||QFn(e,(kUn(),sIt)),0==u.c.length||QFn(u,(kUn(),SIt)))}function CUn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w;for(i=BB(mMn(n,(hWn(),dlt)),33),b=BB(mMn(n,(HXn(),Bdt)),19).a,c=BB(mMn(n,jgt),19).a,Ypn(i,Bdt,iln(b)),Ypn(i,jgt,iln(c)),Pen(i,n.n.a+t.a),Cen(i,n.n.b+t.b),(0!=BB(ZAn(i,Fgt),174).gc()||n.e||GI(mMn(vW(n),_gt))===GI((Nvn(),mvt))&&pA((bvn(),(n.q?n.q:(SQ(),SQ(),het))._b(Rgt)?BB(mMn(n,Rgt),197):BB(mMn(vW(n),Kgt),197))))&&(Sen(i,n.o.a),Men(i,n.o.b)),f=new Wb(n.j);f.a<f.c.c.length;)cL(w=mMn(s=BB(n0(f),11),dlt),186)&&(SA(r=BB(w,118),s.n.a,s.n.b),Ypn(r,upt,s.j));for(l=0!=BB(mMn(n,$gt),174).gc(),o=new Wb(n.b);o.a<o.c.c.length;)a=BB(n0(o),70),(l||0!=BB(mMn(a,$gt),174).gc())&&(MA(e=BB(mMn(a,dlt),137),a.o.a,a.o.b),SA(e,a.n.a,a.n.b));if(!Hz(BB(mMn(n,cpt),21)))for(h=new Wb(n.j);h.a<h.c.c.length;)for(u=new Wb((s=BB(n0(h),11)).f);u.a<u.c.c.length;)a=BB(n0(u),70),Sen(e=BB(mMn(a,dlt),137),a.o.a),Men(e,a.o.b),SA(e,a.n.a,a.n.b)}function IUn(n){var t,e,i,r,c;switch(OY(n,i8n),(!n.b&&(n.b=new hK(KOt,n,4,7)),n.b).i+(!n.c&&(n.c=new hK(KOt,n,5,8)),n.c).i){case 0:throw Hp(new _y("The edge must have at least one source or target."));case 1:return 0==(!n.b&&(n.b=new hK(KOt,n,4,7)),n.b).i?JJ(PTn(BB(Wtn((!n.c&&(n.c=new hK(KOt,n,5,8)),n.c),0),82))):JJ(PTn(BB(Wtn((!n.b&&(n.b=new hK(KOt,n,4,7)),n.b),0),82)))}if(1==(!n.b&&(n.b=new hK(KOt,n,4,7)),n.b).i&&1==(!n.c&&(n.c=new hK(KOt,n,5,8)),n.c).i){if(r=PTn(BB(Wtn((!n.b&&(n.b=new hK(KOt,n,4,7)),n.b),0),82)),c=PTn(BB(Wtn((!n.c&&(n.c=new hK(KOt,n,5,8)),n.c),0),82)),JJ(r)==JJ(c))return JJ(r);if(r==JJ(c))return r;if(c==JJ(r))return c}for(t=PTn(BB(U5(i=NU(Wen(Pun(Gk(xnt,1),HWn,20,0,[(!n.b&&(n.b=new hK(KOt,n,4,7)),n.b),(!n.c&&(n.c=new hK(KOt,n,5,8)),n.c)])))),82));dAn(i);)if((e=PTn(BB(U5(i),82)))!=t&&!Ctn(e,t))if(JJ(e)==JJ(t))t=JJ(e);else if(!(t=B$n(t,e)))return null;return t}function OUn(n,t,i){var r,c,a,u,o,s,f,l,b,w,d,g,p,v,m,y,k,j;for(OTn(i,"Polyline edge routing",1),v=Gy(MD(mMn(t,(HXn(),tgt)))),d=Gy(MD(mMn(t,Apt))),c=Gy(MD(mMn(t,kpt))),r=e.Math.min(1,c/d),k=0,s=0,0!=t.b.c.length&&(k=.4*r*(j=hLn(BB(xq(t.b,0),29)))),o=new M2(t.b,0);o.b<o.d.gc();){for(Px(o.b<o.d.gc()),(a=VI(u=BB(o.d.Xb(o.c=o.b++),29),jyt))&&k>0&&(k-=d),Tqn(u,k),l=0,w=new Wb(u.a);w.a<w.c.c.length;){for(f=0,p=new oz(ZL(lbn(b=BB(n0(w),10)).a.Kc(),new h));dAn(p);)m=g1((g=BB(U5(p),17)).c).b,y=g1(g.d).b,u!=g.d.i.c||b5(g)||(VIn(g,k,.4*r*e.Math.abs(m-y)),g.c.j==(kUn(),CIt)&&(m=0,y=0)),f=e.Math.max(f,e.Math.abs(y-m));switch(b.k.g){case 0:case 4:case 1:case 3:case 5:Gqn(n,b,k,v)}l=e.Math.max(l,f)}o.b<o.d.gc()&&(j=hLn((Px(o.b<o.d.gc()),BB(o.d.Xb(o.c=o.b++),29))),l=e.Math.max(l,j),Px(o.b>0),o.a.Xb(o.c=--o.b)),s=.4*r*l,!a&&o.b<o.d.gc()&&(s+=d),k+=u.c.a+s}n.a.a.$b(),t.f.a=k,HSn(i)}function AUn(n){var t,e,i,r,c,a,u,o,s,f,l,b,w,d,g,p,v;for(s=new xp,u=new pJ,i=new Wb(n.a.a.b);i.a<i.c.c.length;)if(o=f2(t=BB(n0(i),57)))jCn(s.f,o,t);else if(v=f3(t))for(r=new Wb(v.k);r.a<r.c.c.length;)JIn(u,BB(n0(r),17),t);for(e=new Wb(n.a.a.b);e.a<e.c.c.length;)if(o=f2(t=BB(n0(e),57)))for(a=new oz(ZL(lbn(o).a.Kc(),new h));dAn(a);)if(!b5(c=BB(U5(a),17))&&(w=c.c,p=c.d,!(kUn(),yIt).Hc(c.c.j)||!yIt.Hc(c.d.j))){if(d=BB(RX(s,c.d.i),57),UNn(aM(cM(uM(rM(new Hv,0),100),n.c[t.a.d]),n.c[d.a.d])),w.j==CIt&&$z((gcn(),w)))for(l=BB(h6(u,c),21).Kc();l.Ob();)if((f=BB(l.Pb(),57)).d.c<t.d.c){if((b=n.c[f.a.d])==(g=n.c[t.a.d]))continue;UNn(aM(cM(uM(rM(new Hv,1),100),b),g))}if(p.j==oIt&&Az((gcn(),p)))for(l=BB(h6(u,c),21).Kc();l.Ob();)if((f=BB(l.Pb(),57)).d.c>t.d.c){if((b=n.c[t.a.d])==(g=n.c[f.a.d]))continue;UNn(aM(cM(uM(rM(new Hv,1),100),b),g))}}}function $Un(n){var t,e,i,r,c,a,u,o;if(RHn(),null==n)return null;if((r=GO(n,YTn(37)))<0)return n;for(o=new lN(n.substr(0,r)),t=x8(NNt,v6n,25,4,15,1),u=0,i=0,a=n.length;r<a;r++)if(b1(r,n.length),37==n.charCodeAt(r)&&n.length>r+2&&ton((b1(r+1,n.length),n.charCodeAt(r+1)),IAt,OAt)&&ton((b1(r+2,n.length),n.charCodeAt(r+2)),IAt,OAt))if(e=CH((b1(r+1,n.length),n.charCodeAt(r+1)),(b1(r+2,n.length),n.charCodeAt(r+2))),r+=2,i>0?128==(192&e)?t[u++]=e<<24>>24:i=0:e>=128&&(192==(224&e)?(t[u++]=e<<24>>24,i=2):224==(240&e)?(t[u++]=e<<24>>24,i=3):240==(248&e)&&(t[u++]=e<<24>>24,i=4)),i>0){if(u==i){switch(u){case 2:xX(o,((31&t[0])<<6|63&t[1])&QVn);break;case 3:xX(o,((15&t[0])<<12|(63&t[1])<<6|63&t[2])&QVn)}u=0,i=0}}else{for(c=0;c<u;++c)xX(o,t[c]&QVn);u=0,o.a+=String.fromCharCode(e)}else{for(c=0;c<u;++c)xX(o,t[c]&QVn);u=0,xX(o,(b1(r,n.length),n.charCodeAt(r)))}return o.a}function LUn(n,t,e,i,r){var c,a,u;if(ynn(n,t),a=t[0],c=fV(e.c,0),u=-1,Yon(e))if(i>0){if(a+i>n.length)return!1;u=UIn(n.substr(0,a+i),t)}else u=UIn(n,t);switch(c){case 71:return u=zTn(n,a,Pun(Gk(Qtt,1),sVn,2,6,[fQn,lQn]),t),r.e=u,!0;case 77:return gDn(n,t,r,u,a);case 76:return pDn(n,t,r,u,a);case 69:return rCn(n,t,a,r);case 99:return cCn(n,t,a,r);case 97:return u=zTn(n,a,Pun(Gk(Qtt,1),sVn,2,6,["AM","PM"]),t),r.b=u,!0;case 121:return vDn(n,t,a,u,e,r);case 100:return!(u<=0||(r.c=u,0));case 83:return!(u<0)&&jwn(u,a,t[0],r);case 104:12==u&&(u=0);case 75:case 72:return!(u<0||(r.f=u,r.g=!1,0));case 107:return!(u<0||(r.f=u,r.g=!0,0));case 109:return!(u<0||(r.j=u,0));case 115:return!(u<0||(r.n=u,0));case 90:if(a<n.length&&(b1(a,n.length),90==n.charCodeAt(a)))return++t[0],r.o=0,!0;case 122:case 118:return CTn(n,a,t,r);default:return!1}}function NUn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E;if(b=BB(BB(h6(n.r,t),21),84),t!=(kUn(),oIt)&&t!=CIt){for(a=t==sIt?(Dan(),Nrt):(Dan(),Rrt),k=t==sIt?(G7(),crt):(G7(),irt),c=(r=(i=BB(oV(n.b,t),124)).i).c+Lon(Pun(Gk(xNt,1),qQn,25,15,[i.n.b,n.C.b,n.k])),v=r.c+r.b-Lon(Pun(Gk(xNt,1),qQn,25,15,[i.n.c,n.C.c,n.k])),u=Zk(H_(a),n.t),m=t==sIt?KQn:RQn,l=b.Kc();l.Ob();)!(h=BB(l.Pb(),111)).c||h.c.d.c.length<=0||(p=h.b.rf(),g=h.e,(d=(w=h.c).i).b=(s=w.n,w.e.a+s.b+s.c),d.a=(o=w.n,w.e.b+o.d+o.a),OY(k,uJn),w.f=k,l9(w,(J9(),Jit)),d.c=g.a-(d.b-p.a)/2,j=e.Math.min(c,g.a),E=e.Math.max(v,g.a+p.a),d.c<j?d.c=j:d.c+d.b>E&&(d.c=E-d.b),WB(u.d,new xG(d,kln(u,d))),m=t==sIt?e.Math.max(m,g.b+h.b.rf().b):e.Math.min(m,g.b));for(m+=t==sIt?n.t:-n.t,(y=Pwn((u.e=m,u)))>0&&(BB(oV(n.b,t),124).a.b=y),f=b.Kc();f.Ob();)!(h=BB(f.Pb(),111)).c||h.c.d.c.length<=0||((d=h.c.i).c-=h.e.a,d.d-=h.e.b)}else aUn(n,t)}function xUn(n){var t,e,i,r,c,a,u,o,s,f;for(t=new xp,a=new AL(n);a.e!=a.i.gc();){for(c=BB(kpn(a),33),e=new Rv,VW(Mct,c,e),f=new ut,i=BB(P4(new Rq(null,new zU(new oz(ZL(wLn(c).a.Kc(),new h)))),SG(f,m9(new H,new B,new rn,Pun(Gk(nit,1),$Vn,132,0,[(qsn(),Uet)])))),83),Jen(e,BB(i.xc((hN(),!0)),14),new ot),r=BB(P4(AV(BB(i.xc(!1),15).Lc(),new st),m9(new H,new B,new rn,Pun(Gk(nit,1),$Vn,132,0,[Uet]))),15).Kc();r.Ob();)(s=CMn(BB(r.Pb(),79)))&&((u=BB(qI(AY(t.f,s)),21))||(u=Oxn(s),jCn(t.f,s,u)),Frn(e,u));for(i=BB(P4(new Rq(null,new zU(new oz(ZL(dLn(c).a.Kc(),new h)))),SG(f,m9(new H,new B,new rn,Pun(Gk(nit,1),$Vn,132,0,[Uet])))),83),Jen(e,BB(i.xc(!0),14),new ht),o=BB(P4(AV(BB(i.xc(!1),15).Lc(),new ft),m9(new H,new B,new rn,Pun(Gk(nit,1),$Vn,132,0,[Uet]))),15).Kc();o.Ob();)(s=IMn(BB(o.Pb(),79)))&&((u=BB(qI(AY(t.f,s)),21))||(u=Oxn(s),jCn(t.f,s,u)),Frn(e,u))}}function DUn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d;if(uHn(),(o=Vhn(n,0)<0)&&(n=j7(n)),0==Vhn(n,0))switch(t){case 0:return"0";case 1:return WQn;case 2:return"0.00";case 3:return"0.000";case 4:return"0.0000";case 5:return"0.00000";case 6:return"0.000000";default:return(b=new Ck).a+=t<0?"0E+":"0E",b.a+=t==_Vn?"2147483648":""+-t,b.a}f=x8(ONt,WVn,25,1+(h=18),15,1),e=h,d=n;do{s=d,d=Ojn(d,10),f[--e]=dG(rbn(48,ibn(s,cbn(d,10))))&QVn}while(0!=Vhn(d,0));if(r=ibn(ibn(ibn(h,e),t),1),0==t)return o&&(f[--e]=45),Bdn(f,e,h-e);if(t>0&&Vhn(r,-6)>=0){if(Vhn(r,0)>=0){for(c=e+dG(r),u=h-1;u>=c;u--)f[u+1]=f[u];return f[++c]=46,o&&(f[--e]=45),Bdn(f,e,h-e+1)}for(a=2;sS(a,rbn(j7(r),1));a++)f[--e]=48;return f[--e]=46,f[--e]=48,o&&(f[--e]=45),Bdn(f,e,h-e)}return w=e+1,i=h,l=new Ik,o&&(l.a+="-"),i-w>=1?(xX(l,f[e]),l.a+=".",l.a+=Bdn(f,e+1,h-e-1)):l.a+=Bdn(f,e,h-e),l.a+="E",Vhn(r,0)>0&&(l.a+="+"),l.a+=""+vz(r),l.a}function RUn(n,t,e){var i,r,c,a,u,o,s,h,f,l;if(n.e.a.$b(),n.f.a.$b(),n.c.c=x8(Ant,HWn,1,0,5,1),n.i.c=x8(Ant,HWn,1,0,5,1),n.g.a.$b(),t)for(a=new Wb(t.a);a.a<a.c.c.length;)for(h=DSn(c=BB(n0(a),10),(kUn(),oIt)).Kc();h.Ob();)for(s=BB(h.Pb(),11),TU(n.e,s),r=new Wb(s.g);r.a<r.c.c.length;)b5(i=BB(n0(r),17))||(WB(n.c,i),ppn(n,i),((u=i.c.i.k)==(uSn(),Cut)||u==Iut||u==Mut||u==Tut)&&WB(n.j,i),(f=(l=i.d).i.c)==e?TU(n.f,l):f==t?TU(n.e,l):y7(n.c,i));if(e)for(a=new Wb(e.a);a.a<a.c.c.length;){for(o=new Wb((c=BB(n0(a),10)).j);o.a<o.c.c.length;)for(r=new Wb(BB(n0(o),11).g);r.a<r.c.c.length;)b5(i=BB(n0(r),17))&&TU(n.g,i);for(h=DSn(c,(kUn(),CIt)).Kc();h.Ob();)for(s=BB(h.Pb(),11),TU(n.f,s),r=new Wb(s.g);r.a<r.c.c.length;)b5(i=BB(n0(r),17))||(WB(n.c,i),ppn(n,i),((u=i.c.i.k)==(uSn(),Cut)||u==Iut||u==Mut||u==Tut)&&WB(n.j,i),(f=(l=i.d).i.c)==e?TU(n.f,l):f==t?TU(n.e,l):y7(n.c,i))}}function KUn(n,t,i,r,c){var a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E;if(p=new xC(n.g,n.f),(g=XPn(n)).a=e.Math.max(g.a,t),g.b=e.Math.max(g.b,i),E=g.a/p.a,f=g.b/p.b,k=g.a-p.a,s=g.b-p.b,r)for(u=JJ(n)?BB(ZAn(JJ(n),(sWn(),bSt)),103):BB(ZAn(n,(sWn(),bSt)),103),o=GI(ZAn(n,(sWn(),uPt)))===GI((QEn(),XCt)),m=new AL((!n.c&&(n.c=new eU(XOt,n,9,9)),n.c));m.e!=m.i.gc();)switch(v=BB(kpn(m),118),(y=BB(ZAn(v,wPt),61))==(kUn(),PIt)&&(y=OFn(v,u),Ypn(v,wPt,y)),y.g){case 1:o||Pen(v,v.i*E);break;case 2:Pen(v,v.i+k),o||Cen(v,v.j*f);break;case 3:o||Pen(v,v.i*E),Cen(v,v.j+s);break;case 4:o||Cen(v,v.j*f)}if(MA(n,g.a,g.b),c)for(b=new AL((!n.n&&(n.n=new eU(zOt,n,1,7)),n.n));b.e!=b.i.gc();)w=(l=BB(kpn(b),137)).i+l.g/2,d=l.j+l.f/2,(j=w/p.a)+(h=d/p.b)>=1&&(j-h>0&&d>=0?(Pen(l,l.i+k),Cen(l,l.j+s*h)):j-h<0&&w>=0&&(Pen(l,l.i+k*j),Cen(l,l.j+s)));return Ypn(n,(sWn(),KSt),(mdn(),new YK(a=BB(Vj(YIt),9),BB(SR(a,a.length),9),0))),new xC(E,f)}function _Un(n){var t,i,r,c,a,u,o,s,h,f,l;if(f=JJ(PTn(BB(Wtn((!n.b&&(n.b=new hK(KOt,n,4,7)),n.b),0),82)))==JJ(PTn(BB(Wtn((!n.c&&(n.c=new hK(KOt,n,5,8)),n.c),0),82))),u=new Gj,(t=BB(ZAn(n,(Xsn(),hCt)),74))&&t.b>=2){if(0==(!n.a&&(n.a=new eU(FOt,n,6,6)),n.a).i)tE(),i=new co,f9((!n.a&&(n.a=new eU(FOt,n,6,6)),n.a),i);else if((!n.a&&(n.a=new eU(FOt,n,6,6)),n.a).i>1)for(l=new cx((!n.a&&(n.a=new eU(FOt,n,6,6)),n.a));l.e!=l.i.gc();)Qjn(l);VFn(t,BB(Wtn((!n.a&&(n.a=new eU(FOt,n,6,6)),n.a),0),202))}if(f)for(r=new AL((!n.a&&(n.a=new eU(FOt,n,6,6)),n.a));r.e!=r.i.gc();)for(s=new AL((!(i=BB(kpn(r),202)).a&&(i.a=new $L(xOt,i,5)),i.a));s.e!=s.i.gc();)o=BB(kpn(s),469),u.a=e.Math.max(u.a,o.a),u.b=e.Math.max(u.b,o.b);for(a=new AL((!n.n&&(n.n=new eU(zOt,n,1,7)),n.n));a.e!=a.i.gc();)c=BB(kpn(a),137),(h=BB(ZAn(c,gCt),8))&&SA(c,h.a,h.b),f&&(u.a=e.Math.max(u.a,c.i+c.g),u.b=e.Math.max(u.b,c.j+c.f));return u}function FUn(n,t,i){var r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E;for(v=t.c.length,c=new qKn(n.a,i,null,null),E=x8(xNt,qQn,25,v,15,1),w=x8(xNt,qQn,25,v,15,1),b=x8(xNt,qQn,25,v,15,1),d=0,o=0;o<v;o++)w[o]=DWn,b[o]=_Vn;for(s=0;s<v;s++)for(l1(s,t.c.length),r=BB(t.c[s],180),E[s]=v$n(r),E[d]>E[s]&&(d=s),f=new Wb(n.a.b);f.a<f.c.c.length;)for(p=new Wb(BB(n0(f),29).a);p.a<p.c.c.length;)g=BB(n0(p),10),k=Gy(r.p[g.p])+Gy(r.d[g.p]),w[s]=e.Math.min(w[s],k),b[s]=e.Math.max(b[s],k+g.o.b);for(j=x8(xNt,qQn,25,v,15,1),h=0;h<v;h++)(l1(h,t.c.length),BB(t.c[h],180)).o==(oZ(),ryt)?j[h]=w[d]-w[h]:j[h]=b[d]-b[h];for(a=x8(xNt,qQn,25,v,15,1),l=new Wb(n.a.b);l.a<l.c.c.length;)for(y=new Wb(BB(n0(l),29).a);y.a<y.c.c.length;){for(m=BB(n0(y),10),u=0;u<v;u++)a[u]=Gy((l1(u,t.c.length),BB(t.c[u],180)).p[m.p])+Gy((l1(u,t.c.length),BB(t.c[u],180)).d[m.p])+j[u];a.sort(ien(T.prototype.te,T,[])),c.p[m.p]=(a[1]+a[2])/2,c.d[m.p]=0}return c}function BUn(n,t,e){var i,r,c,a,u;switch(i=t.i,c=n.i.o,r=n.i.d,u=n.n,a=Aon(Pun(Gk(PMt,1),sVn,8,0,[u,n.a])),n.j.g){case 1:WD(t,(G7(),irt)),i.d=-r.d-e-i.a,BB(BB(xq(t.d,0),181).We((hWn(),ult)),285)==(Xyn(),jCt)?(l9(t,(J9(),Jit)),i.c=a.a-Gy(MD(mMn(n,blt)))-e-i.b):(l9(t,(J9(),Yit)),i.c=a.a+Gy(MD(mMn(n,blt)))+e);break;case 2:l9(t,(J9(),Yit)),i.c=c.a+r.c+e,BB(BB(xq(t.d,0),181).We((hWn(),ult)),285)==(Xyn(),jCt)?(WD(t,(G7(),irt)),i.d=a.b-Gy(MD(mMn(n,blt)))-e-i.a):(WD(t,(G7(),crt)),i.d=a.b+Gy(MD(mMn(n,blt)))+e);break;case 3:WD(t,(G7(),crt)),i.d=c.b+r.a+e,BB(BB(xq(t.d,0),181).We((hWn(),ult)),285)==(Xyn(),jCt)?(l9(t,(J9(),Jit)),i.c=a.a-Gy(MD(mMn(n,blt)))-e-i.b):(l9(t,(J9(),Yit)),i.c=a.a+Gy(MD(mMn(n,blt)))+e);break;case 4:l9(t,(J9(),Jit)),i.c=-r.b-e-i.b,BB(BB(xq(t.d,0),181).We((hWn(),ult)),285)==(Xyn(),jCt)?(WD(t,(G7(),irt)),i.d=a.b-Gy(MD(mMn(n,blt)))-e-i.a):(WD(t,(G7(),crt)),i.d=a.b+Gy(MD(mMn(n,blt)))+e)}}function HUn(n,t,i,r,c,a,u){var o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M,S,P,C,I,O;for(w=0,S=0,s=new Wb(n);s.a<s.c.c.length;)ozn(o=BB(n0(s),33)),w=e.Math.max(w,o.g),S+=o.g*o.f;for(M=Zyn(n,S/n.c.length),S+=n.c.length*M,w=e.Math.max(w,e.Math.sqrt(S*u))+i.b,I=i.b,O=i.d,b=0,f=i.b+i.c,DH(T=new YT,iln(0)),j=new YT,h=new M2(n,0);h.b<h.d.gc();)Px(h.b<h.d.gc()),C=(o=BB(h.d.Xb(h.c=h.b++),33)).g,l=o.f,I+C>w&&(a&&(fO(j,b),fO(T,iln(h.b-1))),I=i.b,O+=b+t,b=0,f=e.Math.max(f,i.b+i.c+C)),Pen(o,I),Cen(o,O),f=e.Math.max(f,I+C+i.c),b=e.Math.max(b,l),I+=C+t;if(f=e.Math.max(f,r),(P=O+b+i.a)<c&&(b+=c-P,P=c),a)for(I=i.b,h=new M2(n,0),fO(T,iln(n.c.length)),p=BB(b3(E=spn(T,0)),19).a,fO(j,b),k=spn(j,0),y=0;h.b<h.d.gc();)h.b==p&&(I=i.b,y=Gy(MD(b3(k))),p=BB(b3(E),19).a),Px(h.b<h.d.gc()),v=(o=BB(h.d.Xb(h.c=h.b++),33)).f,Men(o,y),d=y,h.b==p&&(g=f-I-i.c,m=o.g,Sen(o,g),lCn(o,new xC(g,d),new xC(m,v))),I+=o.g+t;return new xC(f,P)}function qUn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M,S;for(OTn(t,"Compound graph postprocessor",1),i=qy(TD(mMn(n,(HXn(),Dpt)))),o=BB(mMn(n,(hWn(),Hft)),224),f=new Rv,v=o.ec().Kc();v.Ob();){for(p=BB(v.Pb(),17),u=new t_(o.cc(p)),SQ(),m$(u,new _w(n)),j=ccn((l1(0,u.c.length),BB(u.c[0],243))),T=acn(BB(xq(u,u.c.length-1),243)),y=j.i,m=wan(T.i,y)?y.e:vW(y),l=Apn(p,u),yQ(p.a),b=null,a=new Wb(u);a.a<a.c.c.length;)c=BB(n0(a),243),OPn(g=new Gj,c.a,m),w=c.b,Wsn(r=new km,0,w.a),Ztn(r,g),k=new wA(g1(w.c)),E=new wA(g1(w.d)),UR(k,g),UR(E,g),b&&(0==r.b?d=E:(Px(0!=r.b),d=BB(r.a.a.c,8)),M=e.Math.abs(b.a-d.a)>lZn,S=e.Math.abs(b.b-d.b)>lZn,(!i&&M&&S||i&&(M||S))&&DH(p.a,k)),Frn(p.a,r),0==r.b?b=k:(Px(0!=r.b),b=BB(r.c.b.c,8)),Yan(w,l,g),acn(c)==T&&(vW(T.i)!=c.a&&OPn(g=new Gj,vW(T.i),m),hon(p,Rlt,g)),MSn(w,p,m),f.a.zc(w,f);SZ(p,j),MZ(p,T)}for(h=f.a.ec().Kc();h.Ob();)SZ(s=BB(h.Pb(),17),null),MZ(s,null);HSn(t)}function GUn(n){var t,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k;if(1==n.gc())return BB(n.Xb(0),231);if(n.gc()<=0)return new y6;for(c=n.Kc();c.Ob();){for(i=BB(c.Pb(),231),d=0,f=DWn,l=DWn,s=_Vn,h=_Vn,w=new Wb(i.e);w.a<w.c.c.length;)b=BB(n0(w),144),d+=BB(mMn(b,(fRn(),Zct)),19).a,f=e.Math.min(f,b.d.a-b.e.a/2),l=e.Math.min(l,b.d.b-b.e.b/2),s=e.Math.max(s,b.d.a+b.e.a/2),h=e.Math.max(h,b.d.b+b.e.b/2);hon(i,(fRn(),Zct),iln(d)),hon(i,(Mrn(),oat),new xC(f,l)),hon(i,uat,new xC(s,h))}for(SQ(),n.ad(new wt),qan(g=new y6,BB(n.Xb(0),94)),o=0,m=0,a=n.Kc();a.Ob();)i=BB(a.Pb(),231),p=XR(B$(BB(mMn(i,(Mrn(),uat)),8)),BB(mMn(i,oat),8)),o=e.Math.max(o,p.a),m+=p.a*p.b;for(o=e.Math.max(o,e.Math.sqrt(m)*Gy(MD(mMn(g,(fRn(),Fct))))),y=0,k=0,u=0,t=v=Gy(MD(mMn(g,cat))),r=n.Kc();r.Ob();)i=BB(r.Pb(),231),y+(p=XR(B$(BB(mMn(i,(Mrn(),uat)),8)),BB(mMn(i,oat),8))).a>o&&(y=0,k+=u+v,u=0),VKn(g,i,y,k),t=e.Math.max(t,y+p.a),u=e.Math.max(u,p.b),y+=p.a+v;return g}function zUn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w;switch(h=new km,n.a.g){case 3:l=BB(mMn(t.e,(hWn(),Nlt)),15),b=BB(mMn(t.j,Nlt),15),w=BB(mMn(t.f,Nlt),15),e=BB(mMn(t.e,$lt),15),i=BB(mMn(t.j,$lt),15),r=BB(mMn(t.f,$lt),15),gun(a=new Np,l),b.Jc(new yc),gun(a,cL(b,152)?o6(BB(b,152)):cL(b,131)?BB(b,131).a:cL(b,54)?new fy(b):new CT(b)),gun(a,w),gun(c=new Np,e),gun(c,cL(i,152)?o6(BB(i,152)):cL(i,131)?BB(i,131).a:cL(i,54)?new fy(i):new CT(i)),gun(c,r),hon(t.f,Nlt,a),hon(t.f,$lt,c),hon(t.f,xlt,t.f),hon(t.e,Nlt,null),hon(t.e,$lt,null),hon(t.j,Nlt,null),hon(t.j,$lt,null);break;case 1:Frn(h,t.e.a),DH(h,t.i.n),Frn(h,ean(t.j.a)),DH(h,t.a.n),Frn(h,t.f.a);break;default:Frn(h,t.e.a),Frn(h,ean(t.j.a)),Frn(h,t.f.a)}yQ(t.f.a),Frn(t.f.a,h),SZ(t.f,t.e.c),u=BB(mMn(t.e,(HXn(),vgt)),74),s=BB(mMn(t.j,vgt),74),o=BB(mMn(t.f,vgt),74),(u||s||o)&&(PU(f=new km,o),PU(f,s),PU(f,u),hon(t.f,vgt,f)),SZ(t.j,null),MZ(t.j,null),SZ(t.e,null),MZ(t.e,null),PZ(t.a,null),PZ(t.i,null),t.g&&zUn(n,t.g)}function UUn(n){var t,e,i,r,c,a,u,o,s,h,f,l,b,w,d,g;if(PFn(),null==n)return null;if((w=bln(c=V7(n)))%4!=0)return null;if(0==(d=w/4|0))return x8(NNt,v6n,25,0,15,1);for(f=null,t=0,e=0,i=0,r=0,a=0,u=0,o=0,s=0,b=0,l=0,h=0,f=x8(NNt,v6n,25,3*d,15,1);b<d-1;b++){if(!(VE(a=c[h++])&&VE(u=c[h++])&&VE(o=c[h++])&&VE(s=c[h++])))return null;t=WLt[a],e=WLt[u],i=WLt[o],r=WLt[s],f[l++]=(t<<2|e>>4)<<24>>24,f[l++]=((15&e)<<4|i>>2&15)<<24>>24,f[l++]=(i<<6|r)<<24>>24}return VE(a=c[h++])&&VE(u=c[h++])?(t=WLt[a],e=WLt[u],o=c[h++],s=c[h++],-1==WLt[o]||-1==WLt[s]?61==o&&61==s?0!=(15&e)?null:(aHn(f,0,g=x8(NNt,v6n,25,3*b+1,15,1),0,3*b),g[l]=(t<<2|e>>4)<<24>>24,g):61!=o&&61==s?0!=(3&(i=WLt[o]))?null:(aHn(f,0,g=x8(NNt,v6n,25,3*b+2,15,1),0,3*b),g[l++]=(t<<2|e>>4)<<24>>24,g[l]=((15&e)<<4|i>>2&15)<<24>>24,g):null:(i=WLt[o],r=WLt[s],f[l++]=(t<<2|e>>4)<<24>>24,f[l++]=((15&e)<<4|i>>2&15)<<24>>24,f[l++]=(i<<6|r)<<24>>24,f)):null}function XUn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m;for(OTn(t,O1n,1),l=BB(mMn(n,(HXn(),Zdt)),218),i=new Wb(n.b);i.a<i.c.c.length;)for(a=0,u=(c=n2(BB(n0(i),29).a)).length;a<u;++a)if((r=c[a]).k==(uSn(),Iut)){if(l==(Mbn(),JPt))for(s=new Wb(r.j);s.a<s.c.c.length;)0==(o=BB(n0(s),11)).e.c.length||Agn(o),0==o.g.c.length||$gn(o);else if(cL(mMn(r,(hWn(),dlt)),17))w=BB(mMn(r,dlt),17),d=BB(DSn(r,(kUn(),CIt)).Kc().Pb(),11),g=BB(DSn(r,oIt).Kc().Pb(),11),p=BB(mMn(d,dlt),11),SZ(w,v=BB(mMn(g,dlt),11)),MZ(w,p),(m=new wA(g.i.n)).a=Aon(Pun(Gk(PMt,1),sVn,8,0,[v.i.n,v.n,v.a])).a,DH(w.a,m),(m=new wA(d.i.n)).a=Aon(Pun(Gk(PMt,1),sVn,8,0,[p.i.n,p.n,p.a])).a,DH(w.a,m);else{if(r.j.c.length>=2){for(b=!0,e=BB(n0(h=new Wb(r.j)),11),f=null;h.a<h.c.c.length;)if(f=e,e=BB(n0(h),11),!Nfn(mMn(f,dlt),mMn(e,dlt))){b=!1;break}}else b=!1;for(s=new Wb(r.j);s.a<s.c.c.length;)0==(o=BB(n0(s),11)).e.c.length||uxn(o,b),0==o.g.c.length||oxn(o,b)}PZ(r,null)}HSn(t)}function WUn(n,t,i){var r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M;return y=n.c[(l1(0,t.c.length),BB(t.c[0],17)).p],T=n.c[(l1(1,t.c.length),BB(t.c[1],17)).p],!(y.a.e.e-y.a.a-(y.b.e.e-y.b.a)==0&&T.a.e.e-T.a.a-(T.b.e.e-T.b.a)==0||!cL(v=y.b.e.f,10)||(p=BB(v,10),j=n.i[p.p],E=p.c?E7(p.c.a,p,0):-1,a=RQn,E>0&&(c=BB(xq(p.c.a,E-1),10),u=n.i[c.p],M=e.Math.ceil(K$(n.n,c,p)),a=j.a.e-p.d.d-(u.a.e+c.o.b+c.d.a)-M),h=RQn,E<p.c.a.c.length-1&&(s=BB(xq(p.c.a,E+1),10),f=n.i[s.p],M=e.Math.ceil(K$(n.n,s,p)),h=f.a.e-s.d.d-(j.a.e+p.o.b+p.d.a)-M),!(i&&(h$(),rin(A3n),e.Math.abs(a-h)<=A3n||a==h||isNaN(a)&&isNaN(h)))&&(r=aX(y.a),o=-aX(y.b),l=-aX(T.a),m=aX(T.b),g=y.a.e.e-y.a.a-(y.b.e.e-y.b.a)>0&&T.a.e.e-T.a.a-(T.b.e.e-T.b.a)<0,d=y.a.e.e-y.a.a-(y.b.e.e-y.b.a)<0&&T.a.e.e-T.a.a-(T.b.e.e-T.b.a)>0,w=y.a.e.e+y.b.a<T.b.e.e+T.a.a,b=y.a.e.e+y.b.a>T.b.e.e+T.a.a,k=0,!g&&!d&&(b?a+l>0?k=l:h-r>0&&(k=r):w&&(a+o>0?k=o:h-m>0&&(k=m))),j.a.e+=k,j.b&&(j.d.e+=k),1)))}function VUn(n,t,i){var r,c,a,u,o,s,h,f,l,b;if(r=new UV(t.qf().a,t.qf().b,t.rf().a,t.rf().b),c=new bA,n.c)for(u=new Wb(t.wf());u.a<u.c.c.length;)a=BB(n0(u),181),c.c=a.qf().a+t.qf().a,c.d=a.qf().b+t.qf().b,c.b=a.rf().a,c.a=a.rf().b,CPn(r,c);for(h=new Wb(t.Cf());h.a<h.c.c.length;){if(f=(s=BB(n0(h),838)).qf().a+t.qf().a,l=s.qf().b+t.qf().b,n.e&&(c.c=f,c.d=l,c.b=s.rf().a,c.a=s.rf().b,CPn(r,c)),n.d)for(u=new Wb(s.wf());u.a<u.c.c.length;)a=BB(n0(u),181),c.c=a.qf().a+f,c.d=a.qf().b+l,c.b=a.rf().a,c.a=a.rf().b,CPn(r,c);if(n.b){if(b=new xC(-i,-i),BB(t.We((sWn(),fPt)),174).Hc((lIn(),rIt)))for(u=new Wb(s.wf());u.a<u.c.c.length;)a=BB(n0(u),181),b.a+=a.rf().a+i,b.b+=a.rf().b+i;b.a=e.Math.max(b.a,0),b.b=e.Math.max(b.b,0),X_n(r,s.Bf(),s.zf(),t,s,b,i)}}n.b&&X_n(r,t.Bf(),t.zf(),t,null,null,i),(o=new A_(t.Af())).d=e.Math.max(0,t.qf().b-r.d),o.a=e.Math.max(0,r.d+r.a-(t.qf().b+t.rf().b)),o.b=e.Math.max(0,t.qf().a-r.c),o.c=e.Math.max(0,r.c+r.b-(t.qf().a+t.rf().a)),t.Ef(o)}function QUn(){var n=["\\u0000","\\u0001","\\u0002","\\u0003","\\u0004","\\u0005","\\u0006","\\u0007","\\b","\\t","\\n","\\u000B","\\f","\\r","\\u000E","\\u000F","\\u0010","\\u0011","\\u0012","\\u0013","\\u0014","\\u0015","\\u0016","\\u0017","\\u0018","\\u0019","\\u001A","\\u001B","\\u001C","\\u001D","\\u001E","\\u001F"];return n[34]='\\"',n[92]="\\\\",n[173]="\\u00ad",n[1536]="\\u0600",n[1537]="\\u0601",n[1538]="\\u0602",n[1539]="\\u0603",n[1757]="\\u06dd",n[1807]="\\u070f",n[6068]="\\u17b4",n[6069]="\\u17b5",n[8203]="\\u200b",n[8204]="\\u200c",n[8205]="\\u200d",n[8206]="\\u200e",n[8207]="\\u200f",n[8232]="\\u2028",n[8233]="\\u2029",n[8234]="\\u202a",n[8235]="\\u202b",n[8236]="\\u202c",n[8237]="\\u202d",n[8238]="\\u202e",n[8288]="\\u2060",n[8289]="\\u2061",n[8290]="\\u2062",n[8291]="\\u2063",n[8292]="\\u2064",n[8298]="\\u206a",n[8299]="\\u206b",n[8300]="\\u206c",n[8301]="\\u206d",n[8302]="\\u206e",n[8303]="\\u206f",n[65279]="\\ufeff",n[65529]="\\ufff9",n[65530]="\\ufffa",n[65531]="\\ufffb",n}function YUn(n,t,e){var i,r,c,a,u,o,s,h,f,l;for(o=new Np,f=t.length,a=Ion(e),s=0;s<f;++s){switch(h=yN(t,YTn(61),s),c=(r=uun(i=fln(a,t.substr(s,h-s)))).Aj().Nh(),fV(t,++h)){case 39:u=lx(t,39,++h),WB(o,new CI(i,YV(t.substr(h,u-h),c,r))),s=u+1;break;case 34:u=lx(t,34,++h),WB(o,new CI(i,YV(t.substr(h,u-h),c,r))),s=u+1;break;case 91:WB(o,new CI(i,l=new Np));n:for(;;){switch(fV(t,++h)){case 39:u=lx(t,39,++h),WB(l,YV(t.substr(h,u-h),c,r)),h=u+1;break;case 34:u=lx(t,34,++h),WB(l,YV(t.substr(h,u-h),c,r)),h=u+1;break;case 110:if(++h,t.indexOf("ull",h)!=h)throw Hp(new dy(a6n));l.c[l.c.length]=null,h+=3}if(!(h<f))break;switch(b1(h,t.length),t.charCodeAt(h)){case 44:break;case 93:break n;default:throw Hp(new dy("Expecting , or ]"))}}s=h+1;break;case 110:if(++h,t.indexOf("ull",h)!=h)throw Hp(new dy(a6n));WB(o,new CI(i,null)),s=h+3}if(!(s<f))break;if(b1(s,t.length),44!=t.charCodeAt(s))throw Hp(new dy("Expecting ,"))}return iDn(n,o,e)}function JUn(n,t){var e,i,r,c,a,u,o,s,h,f,l;for(s=BB(BB(h6(n.r,t),21),84),a=JTn(n,t),e=n.u.Hc((lIn(),nIt)),o=s.Kc();o.Ob();)if((u=BB(o.Pb(),111)).c&&!(u.c.d.c.length<=0)){switch(l=u.b.rf(),(f=(h=u.c).i).b=(c=h.n,h.e.a+c.b+c.c),f.a=(r=h.n,h.e.b+r.d+r.a),t.g){case 1:u.a?(f.c=(l.a-f.b)/2,l9(h,(J9(),Qit))):a||e?(f.c=-f.b-n.s,l9(h,(J9(),Jit))):(f.c=l.a+n.s,l9(h,(J9(),Yit))),f.d=-f.a-n.t,WD(h,(G7(),irt));break;case 3:u.a?(f.c=(l.a-f.b)/2,l9(h,(J9(),Qit))):a||e?(f.c=-f.b-n.s,l9(h,(J9(),Jit))):(f.c=l.a+n.s,l9(h,(J9(),Yit))),f.d=l.b+n.t,WD(h,(G7(),crt));break;case 2:u.a?(i=n.v?f.a:BB(xq(h.d,0),181).rf().b,f.d=(l.b-i)/2,WD(h,(G7(),rrt))):a||e?(f.d=-f.a-n.t,WD(h,(G7(),irt))):(f.d=l.b+n.t,WD(h,(G7(),crt))),f.c=l.a+n.s,l9(h,(J9(),Yit));break;case 4:u.a?(i=n.v?f.a:BB(xq(h.d,0),181).rf().b,f.d=(l.b-i)/2,WD(h,(G7(),rrt))):a||e?(f.d=-f.a-n.t,WD(h,(G7(),irt))):(f.d=l.b+n.t,WD(h,(G7(),crt))),f.c=-f.b-n.s,l9(h,(J9(),Jit))}a=!1}}function ZUn(n,t){var e,i,r,c,a,u,o,s,h,f,l;if(wWn(),0==NT(iNt)){for(f=x8(INt,sVn,117,cNt.length,0,1),a=0;a<f.length;a++)f[a]=new M0(4);for(i=new Pk,c=0;c<eNt.length;c++){if(h=new M0(4),c<84?(b1(u=2*c,vnt.length),l=vnt.charCodeAt(u),b1(u+1,vnt.length),Yxn(h,l,vnt.charCodeAt(u+1))):Yxn(h,aNt[u=2*(c-84)],aNt[u+1]),mK(o=eNt[c],"Specials")&&Yxn(h,65520,65533),mK(o,gnt)&&(Yxn(h,983040,1048573),Yxn(h,1048576,1114109)),mZ(iNt,o,h),mZ(rNt,o,$Fn(h)),0<(s=i.a.length)?i.a=i.a.substr(0,0):0>s&&(i.a+=rL(x8(ONt,WVn,25,-s,15,1))),i.a+="Is",GO(o,YTn(32))>=0)for(r=0;r<o.length;r++)b1(r,o.length),32!=o.charCodeAt(r)&&NX(i,(b1(r,o.length),o.charCodeAt(r)));else i.a+=""+o;Tdn(i.a,o,!0)}Tdn(pnt,"Cn",!1),Tdn(mnt,"Cn",!0),Yxn(e=new M0(4),0,unt),mZ(iNt,"ALL",e),mZ(rNt,"ALL",$Fn(e)),!SNt&&(SNt=new xp),mZ(SNt,pnt,pnt),!SNt&&(SNt=new xp),mZ(SNt,mnt,mnt),!SNt&&(SNt=new xp),mZ(SNt,"ALL","ALL")}return BB(SJ(t?iNt:rNt,n),136)}function nXn(n,t,e,i){var r,c,a,u,o,s,h,f,l,b,w,d,g,p;if(l=!1,f=!1,vA(BB(mMn(i,(HXn(),ept)),98))){a=!1,u=!1;n:for(w=new Wb(i.j);w.a<w.c.c.length;)for(b=BB(n0(w),11),d=NU(Wen(Pun(Gk(xnt,1),HWn,20,0,[new Hw(b),new Gw(b)])));dAn(d);)if(!qy(TD(mMn(BB(U5(d),11).i,Tdt)))){if(b.j==(kUn(),sIt)){a=!0;break n}if(b.j==SIt){u=!0;break n}}l=u&&!a,f=a&&!u}if(l||f||0==i.b.c.length)p=!f;else{for(h=0,s=new Wb(i.b);s.a<s.c.c.length;)h+=(o=BB(n0(s),70)).n.b+o.o.b/2;p=(h/=i.b.c.length)>=i.o.b/2}p?(g=BB(mMn(i,(hWn(),Klt)),15))?l?c=g:(r=BB(mMn(i,Dft),15))?c=g.gc()<=r.gc()?g:r:(c=new Np,hon(i,Dft,c)):(c=new Np,hon(i,Klt,c)):(r=BB(mMn(i,(hWn(),Dft)),15))?f?c=r:(g=BB(mMn(i,Klt),15))?c=r.gc()<=g.gc()?r:g:(c=new Np,hon(i,Klt,c)):(c=new Np,hon(i,Dft,c)),c.Fc(n),hon(n,(hWn(),Kft),e),t.d==e?(MZ(t,null),e.e.c.length+e.g.c.length==0&&CZ(e,null),gsn(e)):(SZ(t,null),e.e.c.length+e.g.c.length==0&&CZ(e,null)),yQ(t.a)}function tXn(n,t){var e,i,r,c,a,u,o,s,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M,S,P,C,I;for(v=new M2(n.b,0),d=0,s=BB((f=t.Kc()).Pb(),19).a,k=0,e=new Rv,E=new fA;v.b<v.d.gc();){for(Px(v.b<v.d.gc()),y=new Wb(BB(v.d.Xb(v.c=v.b++),29).a);y.a<y.c.c.length;){for(w=new oz(ZL(lbn(m=BB(n0(y),10)).a.Kc(),new h));dAn(w);)l=BB(U5(w),17),E.a.zc(l,E);for(b=new oz(ZL(fbn(m).a.Kc(),new h));dAn(b);)l=BB(U5(b),17),E.a.Bc(l)}if(d+1==s){for(yR(v,r=new HX(n)),yR(v,c=new HX(n)),M=E.a.ec().Kc();M.Ob();)T=BB(M.Pb(),17),e.a._b(T)||(++k,e.a.zc(T,e)),hon(a=new $vn(n),(HXn(),ept),(QEn(),VCt)),PZ(a,r),Bl(a,(uSn(),Tut)),CZ(g=new CSn,a),qCn(g,(kUn(),CIt)),CZ(S=new CSn,a),qCn(S,oIt),hon(i=new $vn(n),ept,VCt),PZ(i,c),Bl(i,Tut),CZ(p=new CSn,i),qCn(p,CIt),CZ(P=new CSn,i),qCn(P,oIt),SZ(j=new wY,T.c),MZ(j,g),SZ(I=new wY,S),MZ(I,p),SZ(T,P),u=new v3(a,i,j,I,T),hon(a,(hWn(),Rft),u),hon(i,Rft,u),(C=j.c.i).k==Tut&&((o=BB(mMn(C,Rft),305)).d=u,u.g=o);if(!f.Ob())break;s=BB(f.Pb(),19).a}++d}return iln(k)}function eXn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b,w,d;for(f=0,r=new AL((!t.a&&(t.a=new eU(UOt,t,10,11)),t.a));r.e!=r.i.gc();)qy(TD(ZAn(i=BB(kpn(r),33),(HXn(),Ggt))))||(GI(ZAn(t,Ldt))===GI((mon(),Nvt))&&GI(ZAn(t,Gdt))!==GI((Vvn(),Eht))&&GI(ZAn(t,Gdt))!==GI((Vvn(),kht))&&!qy(TD(ZAn(t,xdt)))&&GI(ZAn(t,Cdt))===GI((Bfn(),wut))||qy(TD(ZAn(i,$dt)))||(Ypn(i,(hWn(),wlt),iln(f)),++f),wzn(n,i,e));for(f=0,s=new AL((!t.b&&(t.b=new eU(_Ot,t,12,3)),t.b));s.e!=s.i.gc();)u=BB(kpn(s),79),(GI(ZAn(t,(HXn(),Ldt)))!==GI((mon(),Nvt))||GI(ZAn(t,Gdt))===GI((Vvn(),Eht))||GI(ZAn(t,Gdt))===GI((Vvn(),kht))||qy(TD(ZAn(t,xdt)))||GI(ZAn(t,Cdt))!==GI((Bfn(),wut)))&&(Ypn(u,(hWn(),wlt),iln(f)),++f),w=PMn(u),d=OMn(u),h=qy(TD(ZAn(w,wgt))),b=!qy(TD(ZAn(u,Ggt))),l=h&&QIn(u)&&qy(TD(ZAn(u,dgt))),c=JJ(w)==t&&JJ(w)==JJ(d),a=(JJ(w)==t&&d==t)^(JJ(d)==t&&w==t),b&&!l&&(a||c)&&uWn(n,u,t,e);if(JJ(t))for(o=new AL(iQ(JJ(t)));o.e!=o.i.gc();)(w=PMn(u=BB(kpn(o),79)))==t&&QIn(u)&&(l=qy(TD(ZAn(w,(HXn(),wgt))))&&qy(TD(ZAn(u,dgt))))&&uWn(n,u,t,e)}function iXn(n,t,i){var r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M,S,P,C,I,O,A;for(OTn(i,"MinWidth layering",1),w=t.b,T=t.a,A=BB(mMn(t,(HXn(),Egt)),19).a,o=BB(mMn(t,Tgt),19).a,n.b=Gy(MD(mMn(t,ypt))),n.d=RQn,k=new Wb(T);k.a<k.c.c.length;)(m=BB(n0(k),10)).k==(uSn(),Cut)&&(P=m.o.b,n.d=e.Math.min(n.d,P));for(n.d=e.Math.max(1,n.d),M=T.c.length,n.c=x8(ANt,hQn,25,M,15,1),n.f=x8(ANt,hQn,25,M,15,1),n.e=x8(xNt,qQn,25,M,15,1),h=0,n.a=0,j=new Wb(T);j.a<j.c.c.length;)(m=BB(n0(j),10)).p=h++,n.c[m.p]=whn(fbn(m)),n.f[m.p]=whn(lbn(m)),n.e[m.p]=m.o.b/n.d,n.a+=n.e[m.p];for(n.b/=n.d,n.a/=M,E=jOn(T),m$(T,QW(new Kd(n))),g=RQn,d=DWn,u=null,O=A,I=A,a=o,c=o,A<0&&(O=BB(Tmt.a.zd(),19).a,I=BB(Tmt.b.zd(),19).a),o<0&&(a=BB(Emt.a.zd(),19).a,c=BB(Emt.b.zd(),19).a),C=O;C<=I;C++)for(r=a;r<=c;r++)v=Gy(MD((S=LBn(n,C,r,T,E)).a)),p=(b=BB(S.b,15)).gc(),(v<g||v==g&&p<d)&&(g=v,d=p,u=b);for(l=u.Kc();l.Ob();){for(f=BB(l.Pb(),15),s=new HX(t),y=f.Kc();y.Ob();)PZ(m=BB(y.Pb(),10),s);w.c[w.c.length]=s}JPn(w),T.c=x8(Ant,HWn,1,0,5,1),HSn(i)}function rXn(n,t){var i,r,c,a,u,o,s,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M;for(n.b=t,n.a=BB(mMn(t,(HXn(),hgt)),19).a,n.c=BB(mMn(t,lgt),19).a,0==n.c&&(n.c=DWn),g=new M2(t.b,0);g.b<g.d.gc();){for(Px(g.b<g.d.gc()),d=BB(g.d.Xb(g.c=g.b++),29),o=new Np,l=-1,y=-1,m=new Wb(d.a);m.a<m.c.c.length;)v=BB(n0(m),10),F3((q_(),new oz(ZL(hbn(v).a.Kc(),new h))))>=n.a&&(r=yBn(n,v),l=e.Math.max(l,r.b),y=e.Math.max(y,r.d),WB(o,new rI(v,r)));for(E=new Np,f=0;f<l;++f)kG(E,0,(Px(g.b>0),g.a.Xb(g.c=--g.b),yR(g,T=new HX(n.b)),Px(g.b<g.d.gc()),g.d.Xb(g.c=g.b++),T));for(u=new Wb(o);u.a<u.c.c.length;)if(c=BB(n0(u),46),w=BB(c.b,571).a)for(b=new Wb(w);b.a<b.c.c.length;)ukn(n,BB(n0(b),10),Uut,E);for(i=new Np,s=0;s<y;++s)WB(i,(yR(g,M=new HX(n.b)),M));for(a=new Wb(o);a.a<a.c.c.length;)if(c=BB(n0(a),46),j=BB(c.b,571).c)for(k=new Wb(j);k.a<k.c.c.length;)ukn(n,BB(n0(k),10),Xut,i)}for(p=new M2(t.b,0);p.b<p.d.gc();)Px(p.b<p.d.gc()),0==BB(p.d.Xb(p.c=p.b++),29).a.c.length&&fW(p)}function cXn(n,t,i){var r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M,S,P,C;if(OTn(i,"Spline edge routing",1),0==t.b.c.length)return t.f.a=0,void HSn(i);v=Gy(MD(mMn(t,(HXn(),Apt)))),o=Gy(MD(mMn(t,Tpt))),u=Gy(MD(mMn(t,kpt))),T=BB(mMn(t,rgt),336)==(Usn(),rmt),E=Gy(MD(mMn(t,cgt))),n.d=t,n.j.c=x8(Ant,HWn,1,0,5,1),n.a.c=x8(Ant,HWn,1,0,5,1),$U(n.k),f=VI((s=BB(xq(t.b,0),29)).a,(dxn(),jyt)),l=VI((d=BB(xq(t.b,t.b.c.length-1),29)).a,jyt),g=new Wb(t.b),p=null,C=0;do{for(RUn(n,p,m=g.a<g.c.c.length?BB(n0(g),29):null),MFn(n),P=0,y=C,b=!p||f&&p==s,w=!m||l&&m==d,(M=_k(rcn(NV(AV(new Rq(null,new w1(n.i,16)),new ya),new ma))))>0?(h=0,p&&(h+=o),h+=(M-1)*u,m&&(h+=o),T&&m&&(h=e.Math.max(h,nxn(m,u,v,E))),h<v&&!b&&!w&&(P=(v-h)/2,h=v),y+=h):!b&&!w&&(y+=v),m&&Tqn(m,y),j=new Wb(n.i);j.a<j.c.c.length;)(k=BB(n0(j),128)).a.c=C,k.a.b=y-C,k.F=P,k.p=!p;gun(n.a,n.i),C=y,m&&(C+=m.c.a),p=m,b=w}while(m);for(c=new Wb(n.j);c.a<c.c.c.length;)a=man(n,r=BB(n0(c),17)),hon(r,(hWn(),$lt),a),S=Dxn(n,r),hon(r,Nlt,S);t.f.a=C,n.d=null,HSn(i)}function aXn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m;if(d=0!=n.i,v=!1,g=null,mA(n.e)){if((h=t.gc())>0){for(l=h<100?null:new Fj(h),w=(s=new jcn(t)).g,g=x8(ANt,hQn,25,h,15,1),i=0,m=new gtn(h),r=0;r<n.i;++r){b=u=n.g[r];n:for(p=0;p<2;++p){for(o=h;--o>=0;)if(null!=b?Nfn(b,w[o]):GI(b)===GI(w[o])){g.length<=i&&aHn(g,0,g=x8(ANt,hQn,25,2*g.length,15,1),0,i),g[i++]=r,f9(m,w[o]);break n}if(GI(b)===GI(u))break}}if(s=m,w=m.g,h=i,i>g.length&&aHn(g,0,g=x8(ANt,hQn,25,i,15,1),0,i),i>0){for(v=!0,c=0;c<i;++c)l=zK(n,BB(b=w[c],72),l);for(a=i;--a>=0;)Lyn(n,g[a]);if(i!=h){for(r=h;--r>=i;)Lyn(s,r);aHn(g,0,g=x8(ANt,hQn,25,i,15,1),0,i)}t=s}}}else for(t=jyn(n,t),r=n.i;--r>=0;)t.Hc(n.g[r])&&(Lyn(n,r),v=!0);if(v){if(null!=g){for(f=1==(e=t.gc())?yZ(n,4,t.Kc().Pb(),null,g[0],d):yZ(n,6,t,g,g[0],d),l=e<100?null:new Fj(e),r=t.Kc();r.Ob();)l=qK(n,BB(b=r.Pb(),72),l);l?(l.Ei(f),l.Fi()):ban(n.e,f)}else{for(l=$K(t.gc()),r=t.Kc();r.Ob();)l=qK(n,BB(b=r.Pb(),72),l);l&&l.Fi()}return!0}return!1}function uXn(n,t){var e,i,r,c,a,u,o,s,f,l,b,w,d,g,p,v,m;for((e=new hvn(t)).a||g_n(t),s=lRn(t),o=new pJ,g=new Qxn,d=new Wb(t.a);d.a<d.c.c.length;)for(r=new oz(ZL(lbn(BB(n0(d),10)).a.Kc(),new h));dAn(r);)(i=BB(U5(r),17)).c.i.k!=(uSn(),Mut)&&i.d.i.k!=Mut||JIn(o,upn((f=lzn(n,i,s,g)).d),f.a);for(a=new Np,m=BB(mMn(e.c,(hWn(),Xft)),21).Kc();m.Ob();){switch(v=BB(m.Pb(),61),w=g.c[v.g],b=g.b[v.g],u=g.a[v.g],c=null,p=null,v.g){case 4:c=new UV(n.d.a,w,s.b.a-n.d.a,b-w),p=new UV(n.d.a,w,u,b-w),zH(s,new xC(c.c+c.b,c.d)),zH(s,new xC(c.c+c.b,c.d+c.a));break;case 2:c=new UV(s.a.a,w,n.c.a-s.a.a,b-w),p=new UV(n.c.a-u,w,u,b-w),zH(s,new xC(c.c,c.d)),zH(s,new xC(c.c,c.d+c.a));break;case 1:c=new UV(w,n.d.b,b-w,s.b.b-n.d.b),p=new UV(w,n.d.b,b-w,u),zH(s,new xC(c.c,c.d+c.a)),zH(s,new xC(c.c+c.b,c.d+c.a));break;case 3:c=new UV(w,s.a.b,b-w,n.c.b-s.a.b),p=new UV(w,n.c.b-u,b-w,u),zH(s,new xC(c.c,c.d)),zH(s,new xC(c.c+c.b,c.d))}c&&((l=new nm).d=v,l.b=c,l.c=p,l.a=JQ(BB(h6(o,upn(v)),21)),a.c[a.c.length]=l)}return gun(e.b,a),e.d=Bhn(nGn(s)),e}function oXn(n,t,i){var r,c,a,u,o,s,h,f,l,b,w,d;if(null==i.p[t.p]){o=!0,i.p[t.p]=0,u=t,d=i.o==(oZ(),ryt)?KQn:RQn;do{c=n.b.e[u.p],a=u.c.a.c.length,i.o==ryt&&c>0||i.o==cyt&&c<a-1?(s=null,h=null,s=i.o==cyt?BB(xq(u.c.a,c+1),10):BB(xq(u.c.a,c-1),10),oXn(n,h=i.g[s.p],i),d=n.e.bg(d,t,u),i.j[t.p]==t&&(i.j[t.p]=i.j[h.p]),i.j[t.p]==i.j[h.p]?(w=K$(n.d,u,s),i.o==cyt?(r=Gy(i.p[t.p]),l=Gy(i.p[h.p])+Gy(i.d[s.p])-s.d.d-w-u.d.a-u.o.b-Gy(i.d[u.p]),o?(o=!1,i.p[t.p]=e.Math.min(l,d)):i.p[t.p]=e.Math.min(r,e.Math.min(l,d))):(r=Gy(i.p[t.p]),l=Gy(i.p[h.p])+Gy(i.d[s.p])+s.o.b+s.d.a+w+u.d.d-Gy(i.d[u.p]),o?(o=!1,i.p[t.p]=e.Math.max(l,d)):i.p[t.p]=e.Math.max(r,e.Math.max(l,d)))):(w=Gy(MD(mMn(n.a,(HXn(),Opt)))),b=krn(n,i.j[t.p]),f=krn(n,i.j[h.p]),i.o==cyt?U1(b,f,Gy(i.p[t.p])+Gy(i.d[u.p])+u.o.b+u.d.a+w-(Gy(i.p[h.p])+Gy(i.d[s.p])-s.d.d)):U1(b,f,Gy(i.p[t.p])+Gy(i.d[u.p])-u.d.d-Gy(i.p[h.p])-Gy(i.d[s.p])-s.o.b-s.d.a-w))):d=n.e.bg(d,t,u),u=i.a[u.p]}while(u!=t);Ov(n.e,t)}}function sXn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v;for(f=t,h=new pJ,l=new pJ,c=N2(f,x6n),GSn((i=new fQ(n,e,h,l)).a,i.b,i.c,i.d,c),d=(h.i||(h.i=new HL(h,h.c))).Kc();d.Ob();)for(w=BB(d.Pb(),202),u=BB(h6(h,w),21).Kc();u.Ob();){if(a=u.Pb(),!(b=BB(sen(n.d,a),202)))throw r=R2(f,q6n),Hp(new ek(V6n+a+Q6n+r+W6n));!w.e&&(w.e=new hK(FOt,w,10,9)),f9(w.e,b)}for(p=(l.i||(l.i=new HL(l,l.c))).Kc();p.Ob();)for(g=BB(p.Pb(),202),s=BB(h6(l,g),21).Kc();s.Ob();){if(o=s.Pb(),!(b=BB(sen(n.d,o),202)))throw r=R2(f,q6n),Hp(new ek(V6n+o+Q6n+r+W6n));!g.g&&(g.g=new hK(FOt,g,9,10)),f9(g.g,b)}!e.b&&(e.b=new hK(KOt,e,4,7)),0!=e.b.i&&(!e.c&&(e.c=new hK(KOt,e,5,8)),0!=e.c.i)&&(!e.b&&(e.b=new hK(KOt,e,4,7)),e.b.i<=1&&(!e.c&&(e.c=new hK(KOt,e,5,8)),e.c.i<=1))&&1==(!e.a&&(e.a=new eU(FOt,e,6,6)),e.a).i&&(Svn(v=BB(Wtn((!e.a&&(e.a=new eU(FOt,e,6,6)),e.a),0),202))||Pvn(v)||(Lin(v,BB(Wtn((!e.b&&(e.b=new hK(KOt,e,4,7)),e.b),0),82)),Nin(v,BB(Wtn((!e.c&&(e.c=new hK(KOt,e,5,8)),e.c),0),82))))}function hXn(n){var t,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M,S;for(y=0,k=(m=n.a).length;y<k;++y){for(v=m[y],s=DWn,h=DWn,w=new Wb(v.e);w.a<w.c.c.length;)(a=(l=BB(n0(w),10)).c?E7(l.c.a,l,0):-1)>0?(f=BB(xq(l.c.a,a-1),10),T=K$(n.b,l,f),g=l.n.b-l.d.d-(f.n.b+f.o.b+f.d.a+T)):g=l.n.b-l.d.d,s=e.Math.min(g,s),a<l.c.a.c.length-1?(f=BB(xq(l.c.a,a+1),10),T=K$(n.b,l,f),p=f.n.b-f.d.d-(l.n.b+l.o.b+l.d.a+T)):p=2*l.n.b,h=e.Math.min(p,h);for(o=DWn,c=!1,S=new Wb((r=BB(xq(v.e,0),10)).j);S.a<S.c.c.length;)for(M=BB(n0(S),11),d=r.n.b+M.n.b+M.a.b,i=new Wb(M.e);i.a<i.c.c.length;)t=(j=BB(n0(i),17).c).i.n.b+j.n.b+j.a.b-d,e.Math.abs(t)<e.Math.abs(o)&&e.Math.abs(t)<(t<0?s:h)&&(o=t,c=!0);for(E=new Wb((u=BB(xq(v.e,v.e.c.length-1),10)).j);E.a<E.c.c.length;)for(j=BB(n0(E),11),d=u.n.b+j.n.b+j.a.b,i=new Wb(j.g);i.a<i.c.c.length;)t=(M=BB(n0(i),17).d).i.n.b+M.n.b+M.a.b-d,e.Math.abs(t)<e.Math.abs(o)&&e.Math.abs(t)<(t<0?s:h)&&(o=t,c=!0);if(c&&0!=o)for(b=new Wb(v.e);b.a<b.c.c.length;)(l=BB(n0(b),10)).n.b+=o}}function fXn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b,w,d,g;if(hU(n.a,t)){if(FT(BB(RX(n.a,t),53),e))return 1}else VW(n.a,t,new Rv);if(hU(n.a,e)){if(FT(BB(RX(n.a,e),53),t))return-1}else VW(n.a,e,new Rv);if(hU(n.e,t)){if(FT(BB(RX(n.e,t),53),e))return-1}else VW(n.e,t,new Rv);if(hU(n.e,e)){if(FT(BB(RX(n.a,e),53),t))return 1}else VW(n.e,e,new Rv);if(n.c==(mon(),xvt)||!Lx(t,(hWn(),wlt))||!Lx(e,(hWn(),wlt))){if(o=BB(EN(M4(Qon(AV(new Rq(null,new w1(t.j,16)),new sc)),new hc)),11),h=BB(EN(M4(Qon(AV(new Rq(null,new w1(e.j,16)),new fc)),new lc)),11),o&&h){if(u=o.i,s=h.i,u&&u==s){for(l=new Wb(u.j);l.a<l.c.c.length;){if((f=BB(n0(l),11))==o)return aKn(n,e,t),-1;if(f==h)return aKn(n,t,e),1}return E$(iEn(n,t),iEn(n,e))}for(d=0,g=(w=n.d).length;d<g;++d){if((b=w[d])==u)return aKn(n,e,t),-1;if(b==s)return aKn(n,t,e),1}}if(!Lx(t,(hWn(),wlt))||!Lx(e,wlt))return(r=iEn(n,t))>(a=iEn(n,e))?aKn(n,t,e):aKn(n,e,t),r<a?-1:r>a?1:0}return(i=BB(mMn(t,(hWn(),wlt)),19).a)>(c=BB(mMn(e,wlt),19).a)?aKn(n,t,e):aKn(n,e,t),i<c?-1:i>c?1:0}function lXn(n,t,e,i){var r,c,a,u,o,s,h,f,l,b,w,d;if(qy(TD(ZAn(t,(sWn(),zSt)))))return SQ(),SQ(),set;if(o=0!=(!t.a&&(t.a=new eU(UOt,t,10,11)),t.a).i,s=!(h=yIn(t)).dc(),o||s){if(!(r=BB(ZAn(t,mPt),149)))throw Hp(new rk("Resolved algorithm is not set; apply a LayoutAlgorithmResolver before computing layout."));if(d=OC(r,(hAn(),nAt)),Ngn(t),!o&&s&&!d)return SQ(),SQ(),set;if(u=new Np,GI(ZAn(t,ESt))===GI((ufn(),pCt))&&(OC(r,YOt)||OC(r,QOt)))for(l=pRn(n,t),Frn(b=new YT,(!t.a&&(t.a=new eU(UOt,t,10,11)),t.a));0!=b.b;)Ngn(f=BB(0==b.b?null:(Px(0!=b.b),Atn(b,b.a.a)),33)),GI(ZAn(f,ESt))===GI(mCt)||P8(f,eSt)&&!j5(r,ZAn(f,mPt))?(gun(u,lXn(n,f,e,i)),Ypn(f,ESt,mCt),KKn(f)):Frn(b,(!f.a&&(f.a=new eU(UOt,f,10,11)),f.a));else for(l=(!t.a&&(t.a=new eU(UOt,t,10,11)),t.a).i,a=new AL((!t.a&&(t.a=new eU(UOt,t,10,11)),t.a));a.e!=a.i.gc();)gun(u,lXn(n,c=BB(kpn(a),33),e,i)),KKn(c);for(w=new Wb(u);w.a<w.c.c.length;)Ypn(BB(n0(w),79),zSt,(hN(),!0));return Ugn(t,r,mcn(i,l)),w_n(u),s&&d?h:(SQ(),SQ(),set)}return SQ(),SQ(),set}function bXn(n,t,e,i,r,c,a,u,o){var s,h,f,l,b,w,d;switch(b=e,Bl(h=new $vn(o),(uSn(),Mut)),hon(h,(hWn(),Yft),a),hon(h,(HXn(),ept),(QEn(),XCt)),d=Gy(MD(n.We(tpt))),hon(h,tpt,d),CZ(f=new CSn,h),t!=QCt&&t!=YCt||(b=i>=0?hwn(u):Tln(hwn(u)),n.Ye(upt,b)),s=new Gj,l=!1,n.Xe(npt)?(Hx(s,BB(n.We(npt),8)),l=!0):yL(s,a.a/2,a.b/2),b.g){case 4:hon(h,kgt,(Tbn(),Flt)),hon(h,Gft,(Jun(),$ht)),h.o.b=a.b,d<0&&(h.o.a=-d),qCn(f,(kUn(),oIt)),l||(s.a=a.a),s.a-=a.a;break;case 2:hon(h,kgt,(Tbn(),Hlt)),hon(h,Gft,(Jun(),Oht)),h.o.b=a.b,d<0&&(h.o.a=-d),qCn(f,(kUn(),CIt)),l||(s.a=0);break;case 1:hon(h,ilt,(z7(),Cft)),h.o.a=a.a,d<0&&(h.o.b=-d),qCn(f,(kUn(),SIt)),l||(s.b=a.b),s.b-=a.b;break;case 3:hon(h,ilt,(z7(),Sft)),h.o.a=a.a,d<0&&(h.o.b=-d),qCn(f,(kUn(),sIt)),l||(s.b=0)}if(Hx(f.n,s),hon(h,npt,s),t==UCt||t==WCt||t==XCt){if(w=0,t==UCt&&n.Xe(ipt))switch(b.g){case 1:case 2:w=BB(n.We(ipt),19).a;break;case 3:case 4:w=-BB(n.We(ipt),19).a}else switch(b.g){case 4:case 2:w=c.b,t==WCt&&(w/=r.b);break;case 1:case 3:w=c.a,t==WCt&&(w/=r.a)}hon(h,Tlt,w)}return hon(h,Qft,b),h}function wXn(n){var t,e,i,r,c,a,u,o,s,f,l,b,w,d,g,p,v,m,y,k,j,E;if((e=Gy(MD(mMn(n.a.j,(HXn(),_dt)))))<-1||!n.a.i||LK(BB(mMn(n.a.o,ept),98))||abn(n.a.o,(kUn(),oIt)).gc()<2&&abn(n.a.o,CIt).gc()<2)return!0;if(n.a.c.Rf())return!1;for(y=0,m=0,v=new Np,o=0,s=(u=n.a.e).length;o<s;++o){for(b=0,d=(l=u[o]).length;b<d;++b)if((f=l[b]).k!=(uSn(),Iut)){for(i=n.b[f.c.p][f.p],f.k==Mut?(i.b=1,BB(mMn(f,(hWn(),dlt)),11).j==(kUn(),oIt)&&(m+=i.a)):(E=abn(f,(kUn(),CIt))).dc()||!tL(E,new Nc)?i.c=1:((r=abn(f,oIt)).dc()||!tL(r,new Lc))&&(y+=i.a),a=new oz(ZL(lbn(f).a.Kc(),new h));dAn(a);)c=BB(U5(a),17),y+=i.c,m+=i.b,X8(n,i,c.d.i);for(j=new oz(new WL((g=Wen(Pun(Gk(xnt,1),HWn,20,0,[abn(f,(kUn(),sIt)),abn(f,SIt)]))).a.length,g.a));dAn(j);)k=BB(U5(j),11),(p=BB(mMn(k,(hWn(),Elt)),10))&&(y+=i.c,m+=i.b,X8(n,i,p))}else v.c[v.c.length]=f;for(w=new Wb(v);w.a<w.c.c.length;)for(f=BB(n0(w),10),i=n.b[f.c.p][f.p],a=new oz(ZL(lbn(f).a.Kc(),new h));dAn(a);)c=BB(U5(a),17),y+=i.c,m+=i.b,X8(n,i,c.d.i);v.c=x8(Ant,HWn,1,0,5,1)}return(0==(t=y+m)?RQn:(y-m)/t)>=e}function dXn(){function n(n){var t=this;this.dispatch=function(t){var e=t.data;switch(e.cmd){case"algorithms":var i=Swn((SQ(),new Hb(new Ob(lAt.b))));n.postMessage({id:e.id,data:i});break;case"categories":var r=Swn((SQ(),new Hb(new Ob(lAt.c))));n.postMessage({id:e.id,data:r});break;case"options":var c=Swn((SQ(),new Hb(new Ob(lAt.d))));n.postMessage({id:e.id,data:c});break;case"register":lGn(e.algorithms),n.postMessage({id:e.id});break;case"layout":xBn(e.graph,e.layoutOptions||{},e.options||{}),n.postMessage({id:e.id,data:e.graph})}},this.saveDispatch=function(e){try{t.dispatch(e)}catch(i){n.postMessage({id:e.data.id,error:i})}}}function e(t){var e=this;this.dispatcher=new n({postMessage:function(n){e.onmessage({data:n})}}),this.postMessage=function(n){setTimeout((function(){e.dispatcher.saveDispatch({data:n})}),0)}}if(aE(),typeof document===gYn&&typeof self!==gYn){var r=new n(self);self.onmessage=r.saveDispatch}else typeof t!==gYn&&t.exports&&(Object.defineProperty(i,"__esModule",{value:!0}),t.exports={default:e,Worker:e})}function gXn(n){n.N||(n.N=!0,n.b=kan(n,0),Rrn(n.b,0),Rrn(n.b,1),Rrn(n.b,2),n.bb=kan(n,1),Rrn(n.bb,0),Rrn(n.bb,1),n.fb=kan(n,2),Rrn(n.fb,3),Rrn(n.fb,4),Krn(n.fb,5),n.qb=kan(n,3),Rrn(n.qb,0),Krn(n.qb,1),Krn(n.qb,2),Rrn(n.qb,3),Rrn(n.qb,4),Krn(n.qb,5),Rrn(n.qb,6),n.a=jan(n,4),n.c=jan(n,5),n.d=jan(n,6),n.e=jan(n,7),n.f=jan(n,8),n.g=jan(n,9),n.i=jan(n,10),n.j=jan(n,11),n.k=jan(n,12),n.n=jan(n,13),n.o=jan(n,14),n.p=jan(n,15),n.q=jan(n,16),n.s=jan(n,17),n.r=jan(n,18),n.t=jan(n,19),n.u=jan(n,20),n.v=jan(n,21),n.w=jan(n,22),n.B=jan(n,23),n.A=jan(n,24),n.C=jan(n,25),n.D=jan(n,26),n.F=jan(n,27),n.G=jan(n,28),n.H=jan(n,29),n.J=jan(n,30),n.I=jan(n,31),n.K=jan(n,32),n.M=jan(n,33),n.L=jan(n,34),n.P=jan(n,35),n.Q=jan(n,36),n.R=jan(n,37),n.S=jan(n,38),n.T=jan(n,39),n.U=jan(n,40),n.V=jan(n,41),n.X=jan(n,42),n.W=jan(n,43),n.Y=jan(n,44),n.Z=jan(n,45),n.$=jan(n,46),n._=jan(n,47),n.ab=jan(n,48),n.cb=jan(n,49),n.db=jan(n,50),n.eb=jan(n,51),n.gb=jan(n,52),n.hb=jan(n,53),n.ib=jan(n,54),n.jb=jan(n,55),n.kb=jan(n,56),n.lb=jan(n,57),n.mb=jan(n,58),n.nb=jan(n,59),n.ob=jan(n,60),n.pb=jan(n,61))}function pXn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k;if(m=0,0==t.f.a)for(p=new Wb(n);p.a<p.c.c.length;)d=BB(n0(p),10),m=e.Math.max(m,d.n.a+d.o.a+d.d.c);else m=t.f.a-t.c.a;for(m-=t.c.a,g=new Wb(n);g.a<g.c.c.length;){switch(Zp((d=BB(n0(g),10)).n,m-d.o.a),cH(d.f),Vmn(d),(d.q?d.q:(SQ(),SQ(),het))._b((HXn(),spt))&&Zp(BB(mMn(d,spt),8),m-d.o.a),BB(mMn(d,kdt),248).g){case 1:hon(d,kdt,(wvn(),$Mt));break;case 2:hon(d,kdt,(wvn(),AMt))}for(v=d.o,k=new Wb(d.j);k.a<k.c.c.length;){for(Zp((y=BB(n0(k),11)).n,v.a-y.o.a),Zp(y.a,y.o.a),qCn(y,Icn(y.j)),(u=BB(mMn(y,ipt),19))&&hon(y,ipt,iln(-u.a)),a=new Wb(y.g);a.a<a.c.c.length;){for(r=spn((c=BB(n0(a),17)).a,0);r.b!=r.d.c;)(i=BB(b3(r),8)).a=m-i.a;if(h=BB(mMn(c,vgt),74))for(s=spn(h,0);s.b!=s.d.c;)(o=BB(b3(s),8)).a=m-o.a;for(b=new Wb(c.b);b.a<b.c.c.length;)Zp((f=BB(n0(b),70)).n,m-f.o.a)}for(w=new Wb(y.f);w.a<w.c.c.length;)Zp((f=BB(n0(w),70)).n,y.o.a-f.o.a)}for(d.k==(uSn(),Mut)&&(hon(d,(hWn(),Qft),Icn(BB(mMn(d,Qft),61))),YMn(d)),l=new Wb(d.b);l.a<l.c.c.length;)Vmn(f=BB(n0(l),70)),Zp(f.n,v.a-f.o.a)}}function vXn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k;if(m=0,0==t.f.b)for(p=new Wb(n);p.a<p.c.c.length;)d=BB(n0(p),10),m=e.Math.max(m,d.n.b+d.o.b+d.d.a);else m=t.f.b-t.c.b;for(m-=t.c.b,g=new Wb(n);g.a<g.c.c.length;){switch(Jp((d=BB(n0(g),10)).n,m-d.o.b),aH(d.f),Qmn(d),(d.q?d.q:(SQ(),SQ(),het))._b((HXn(),spt))&&Jp(BB(mMn(d,spt),8),m-d.o.b),BB(mMn(d,kdt),248).g){case 3:hon(d,kdt,(wvn(),IMt));break;case 4:hon(d,kdt,(wvn(),LMt))}for(v=d.o,k=new Wb(d.j);k.a<k.c.c.length;){for(Jp((y=BB(n0(k),11)).n,v.b-y.o.b),Jp(y.a,y.o.b),qCn(y,Ocn(y.j)),(u=BB(mMn(y,ipt),19))&&hon(y,ipt,iln(-u.a)),a=new Wb(y.g);a.a<a.c.c.length;){for(r=spn((c=BB(n0(a),17)).a,0);r.b!=r.d.c;)(i=BB(b3(r),8)).b=m-i.b;if(h=BB(mMn(c,vgt),74))for(s=spn(h,0);s.b!=s.d.c;)(o=BB(b3(s),8)).b=m-o.b;for(b=new Wb(c.b);b.a<b.c.c.length;)Jp((f=BB(n0(b),70)).n,m-f.o.b)}for(w=new Wb(y.f);w.a<w.c.c.length;)Jp((f=BB(n0(w),70)).n,y.o.b-f.o.b)}for(d.k==(uSn(),Mut)&&(hon(d,(hWn(),Qft),Ocn(BB(mMn(d,Qft),61))),gln(d)),l=new Wb(d.b);l.a<l.c.c.length;)Qmn(f=BB(n0(l),70)),Jp(f.n,v.b-f.o.b)}}function mXn(n,t,e,i){var r,c,a,u,o,s,h,f,l,b;for(f=!1,s=n+1,l1(n,t.c.length),a=(h=BB(t.c[n],200)).a,u=null,c=0;c<h.a.c.length;c++)if(l1(c,a.c.length),!(r=BB(a.c[c],187)).c)if(0!=r.b.c.length){if(r.k||(u&&Gmn(u),Tvn(r,(u=new KJ(u?u.e+u.d+i:0,h.f,i)).e+u.d,h.f),WB(h.d,u),xcn(u,r),r.k=!0),o=null,b=null,c<h.a.c.length-1?b=BB(xq(h.a,c+1),187):s<t.c.length&&0!=(l1(s,t.c.length),BB(t.c[s],200)).a.c.length&&(b=BB(xq((l1(s,t.c.length),BB(t.c[s],200)).a,0),187)),l=!1,(o=b)&&(l=!Nfn(o.j,h)),o){if(0==o.b.c.length){Tkn(h,o);break}if(p9(r,e-r.s),Gmn(r.q),f|=nSn(h,r,o,e,i),0==o.b.c.length)for(Tkn((l1(s,t.c.length),BB(t.c[s],200)),o),o=null;t.c.length>s&&0==(l1(s,t.c.length),BB(t.c[s],200)).a.c.length;)y7(t,(l1(s,t.c.length),t.c[s]));if(!o){--c;continue}if(A_n(t,h,r,o,l,e,s,i)){f=!0;continue}if(l){if(JBn(t,h,r,o,e,s,i)){f=!0;continue}if(Ahn(h,r)){r.c=!0,f=!0;continue}}else if(Ahn(h,r)){r.c=!0,f=!0;continue}if(f)continue}Ahn(h,r)?(r.c=!0,f=!0,o&&(o.k=!1)):Gmn(r.q)}else $T(),Tkn(h,r),--c,f=!0;return f}function yXn(n,t,i,r,c,a,u){var o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M,S,P,C,I,O,A;for(g=0,P=0,h=new Wb(n.b);h.a<h.c.c.length;)(s=BB(n0(h),157)).c&&ozn(s.c),g=e.Math.max(g,iG(s)),P+=iG(s)*eG(s);for(p=P/n.b.c.length,S=hjn(n.b,p),P+=n.b.c.length*S,g=e.Math.max(g,e.Math.sqrt(P*u))+i.b,O=i.b,A=i.d,w=0,l=i.b+i.c,DH(M=new YT,iln(0)),E=new YT,f=new M2(n.b,0),d=null,o=new Np;f.b<f.d.gc();)Px(f.b<f.d.gc()),I=iG(s=BB(f.d.Xb(f.c=f.b++),157)),b=eG(s),O+I>g&&(a&&(fO(E,w),fO(M,iln(f.b-1)),WB(n.d,d),o.c=x8(Ant,HWn,1,0,5,1)),O=i.b,A+=w+t,w=0,l=e.Math.max(l,i.b+i.c+I)),o.c[o.c.length]=s,Mpn(s,O,A),l=e.Math.max(l,O+I+i.c),w=e.Math.max(w,b),O+=I+t,d=s;if(gun(n.a,o),WB(n.d,BB(xq(o,o.c.length-1),157)),l=e.Math.max(l,r),(C=A+w+i.a)<c&&(w+=c-C,C=c),a)for(O=i.b,f=new M2(n.b,0),fO(M,iln(n.b.c.length)),m=BB(b3(T=spn(M,0)),19).a,fO(E,w),j=spn(E,0),k=0;f.b<f.d.gc();)f.b==m&&(O=i.b,k=Gy(MD(b3(j))),m=BB(b3(T),19).a),Px(f.b<f.d.gc()),Udn(s=BB(f.d.Xb(f.c=f.b++),157),k),f.b==m&&(v=l-O-i.c,y=iG(s),zdn(s,v),Fln(s,(v-y)/2,0)),O+=iG(s)+t;return new xC(l,C)}function kXn(n){var t,e,i,r;switch(r=null,n.c){case 6:return n.Vl();case 13:return n.Wl();case 23:return n.Nl();case 22:return n.Sl();case 18:return n.Pl();case 8:QXn(n),wWn(),r=oNt;break;case 9:return n.vl(!0);case 19:return n.wl();case 10:switch(n.a){case 100:case 68:case 119:case 87:case 115:case 83:return r=n.ul(n.a),QXn(n),r;case 101:case 102:case 110:case 114:case 116:case 117:case 118:case 120:(t=n.tl())<BQn?(wWn(),wWn(),r=new oG(0,t)):r=pz(Xln(t));break;case 99:return n.Fl();case 67:return n.Al();case 105:return n.Il();case 73:return n.Bl();case 103:return n.Gl();case 88:return n.Cl();case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:return n.xl();case 80:case 112:if(!(r=DIn(n,n.a)))throw Hp(new ak(kWn((u$(),O8n))));break;default:r=QH(n.a)}QXn(n);break;case 0:if(93==n.a||123==n.a||125==n.a)throw Hp(new ak(kWn((u$(),I8n))));r=QH(n.a),e=n.a,QXn(n),(64512&e)==HQn&&0==n.c&&56320==(64512&n.a)&&((i=x8(ONt,WVn,25,2,15,1))[0]=e&QVn,i[1]=n.a&QVn,r=oU(pz(Bdn(i,0,i.length)),0),QXn(n));break;default:throw Hp(new ak(kWn((u$(),I8n))))}return r}function jXn(n,t,i){var r,c,a,u,o,s,h,f,l,b,w,d,g;if(r=new Np,c=DWn,a=DWn,u=DWn,i)for(c=n.f.a,d=new Wb(t.j);d.a<d.c.c.length;)for(s=new Wb(BB(n0(d),11).g);s.a<s.c.c.length;)0!=(o=BB(n0(s),17)).a.b&&((f=BB(gx(o.a),8)).a<c&&(a=c-f.a,u=DWn,r.c=x8(Ant,HWn,1,0,5,1),c=f.a),f.a<=c&&(r.c[r.c.length]=o,o.a.b>1&&(u=e.Math.min(u,e.Math.abs(BB(Dpn(o.a,1),8).b-f.b)))));else for(d=new Wb(t.j);d.a<d.c.c.length;)for(s=new Wb(BB(n0(d),11).e);s.a<s.c.c.length;)0!=(o=BB(n0(s),17)).a.b&&((b=BB(px(o.a),8)).a>c&&(a=b.a-c,u=DWn,r.c=x8(Ant,HWn,1,0,5,1),c=b.a),b.a>=c&&(r.c[r.c.length]=o,o.a.b>1&&(u=e.Math.min(u,e.Math.abs(BB(Dpn(o.a,o.a.b-2),8).b-b.b)))));if(0!=r.c.length&&a>t.o.a/2&&u>t.o.b/2){for(CZ(w=new CSn,t),qCn(w,(kUn(),sIt)),w.n.a=t.o.a/2,CZ(g=new CSn,t),qCn(g,SIt),g.n.a=t.o.a/2,g.n.b=t.o.b,s=new Wb(r);s.a<s.c.c.length;)o=BB(n0(s),17),i?(h=BB(dH(o.a),8),(0==o.a.b?g1(o.d):BB(gx(o.a),8)).b>=h.b?SZ(o,g):SZ(o,w)):(h=BB(gH(o.a),8),(0==o.a.b?g1(o.c):BB(px(o.a),8)).b>=h.b?MZ(o,g):MZ(o,w)),(l=BB(mMn(o,(HXn(),vgt)),74))&&ywn(l,h,!0);t.n.a=c-t.o.a/2}}function EXn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b;if(s=t,$in(o=Q3(n,L3(e),s),R2(s,q6n)),h=BB(sen(n.g,kIn(zJ(s,T6n))),33),i=null,(a=zJ(s,"sourcePort"))&&(i=kIn(a)),f=BB(sen(n.j,i),118),!h)throw Hp(new ek("An edge must have a source node (edge id: '"+Qdn(s)+W6n));if(f&&!wW(WJ(f),h))throw Hp(new ek("The source port of an edge must be a port of the edge's source node (edge id: '"+R2(s,q6n)+W6n));if(!o.b&&(o.b=new hK(KOt,o,4,7)),f9(o.b,f||h),l=BB(sen(n.g,kIn(zJ(s,Y6n))),33),r=null,(u=zJ(s,"targetPort"))&&(r=kIn(u)),b=BB(sen(n.j,r),118),!l)throw Hp(new ek("An edge must have a target node (edge id: '"+Qdn(s)+W6n));if(b&&!wW(WJ(b),l))throw Hp(new ek("The target port of an edge must be a port of the edge's target node (edge id: '"+R2(s,q6n)+W6n));if(!o.c&&(o.c=new hK(KOt,o,5,8)),f9(o.c,b||l),0==(!o.b&&(o.b=new hK(KOt,o,4,7)),o.b).i||0==(!o.c&&(o.c=new hK(KOt,o,5,8)),o.c).i)throw c=R2(s,q6n),Hp(new ek(X6n+c+W6n));return STn(s,o),s$n(s,o),xon(n,s,o)}function TXn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M,S;return f=CFn(HN(n,(kUn(),wIt)),t),w=ayn(HN(n,dIt),t),y=ayn(HN(n,EIt),t),T=uyn(HN(n,MIt),t),l=uyn(HN(n,hIt),t),v=ayn(HN(n,jIt),t),d=ayn(HN(n,gIt),t),j=ayn(HN(n,TIt),t),k=ayn(HN(n,fIt),t),M=uyn(HN(n,bIt),t),p=ayn(HN(n,yIt),t),m=ayn(HN(n,mIt),t),E=ayn(HN(n,lIt),t),S=uyn(HN(n,kIt),t),b=uyn(HN(n,pIt),t),g=ayn(HN(n,vIt),t),e=Lon(Pun(Gk(xNt,1),qQn,25,15,[v.a,T.a,j.a,S.a])),i=Lon(Pun(Gk(xNt,1),qQn,25,15,[w.a,f.a,y.a,g.a])),r=p.a,c=Lon(Pun(Gk(xNt,1),qQn,25,15,[d.a,l.a,k.a,b.a])),s=Lon(Pun(Gk(xNt,1),qQn,25,15,[v.b,w.b,d.b,m.b])),o=Lon(Pun(Gk(xNt,1),qQn,25,15,[T.b,f.b,l.b,g.b])),h=M.b,u=Lon(Pun(Gk(xNt,1),qQn,25,15,[j.b,y.b,k.b,E.b])),w9(HN(n,wIt),e+r,s+h),w9(HN(n,vIt),e+r,s+h),w9(HN(n,dIt),e+r,0),w9(HN(n,EIt),e+r,s+h+o),w9(HN(n,MIt),0,s+h),w9(HN(n,hIt),e+r+i,s+h),w9(HN(n,gIt),e+r+i,0),w9(HN(n,TIt),0,s+h+o),w9(HN(n,fIt),e+r+i,s+h+o),w9(HN(n,bIt),0,s),w9(HN(n,yIt),e,0),w9(HN(n,lIt),0,s+h+o),w9(HN(n,pIt),e+r+i,0),(a=new Gj).a=Lon(Pun(Gk(xNt,1),qQn,25,15,[e+i+r+c,M.a,m.a,E.a])),a.b=Lon(Pun(Gk(xNt,1),qQn,25,15,[s+o+h+u,p.b,S.b,b.b])),a}function MXn(n){var t,e,i,r,c,a,u,o,s,f,l,b,w,d,g;for(d=new Np,l=new Wb(n.d.b);l.a<l.c.c.length;)for(w=new Wb(BB(n0(l),29).a);w.a<w.c.c.length;){for(b=BB(n0(w),10),r=BB(RX(n.f,b),57),o=new oz(ZL(lbn(b).a.Kc(),new h));dAn(o);)if(s=!0,f=null,(i=spn((a=BB(U5(o),17)).a,0)).b!=i.d.c){for(t=BB(b3(i),8),e=null,a.c.j==(kUn(),sIt)&&((g=new PBn(t,new xC(t.a,r.d.d),r,a)).f.a=!0,g.a=a.c,d.c[d.c.length]=g),a.c.j==SIt&&((g=new PBn(t,new xC(t.a,r.d.d+r.d.a),r,a)).f.d=!0,g.a=a.c,d.c[d.c.length]=g);i.b!=i.d.c;)e=BB(b3(i),8),aen(t.b,e.b)||(f=new PBn(t,e,null,a),d.c[d.c.length]=f,s&&(s=!1,e.b<r.d.d?f.f.a=!0:e.b>r.d.d+r.d.a?f.f.d=!0:(f.f.d=!0,f.f.a=!0))),i.b!=i.d.c&&(t=e);f&&(c=BB(RX(n.f,a.d.i),57),t.b<c.d.d?f.f.a=!0:t.b>c.d.d+c.d.a?f.f.d=!0:(f.f.d=!0,f.f.a=!0))}for(u=new oz(ZL(fbn(b).a.Kc(),new h));dAn(u);)0!=(a=BB(U5(u),17)).a.b&&(t=BB(px(a.a),8),a.d.j==(kUn(),sIt)&&((g=new PBn(t,new xC(t.a,r.d.d),r,a)).f.a=!0,g.a=a.d,d.c[d.c.length]=g),a.d.j==SIt&&((g=new PBn(t,new xC(t.a,r.d.d+r.d.a),r,a)).f.d=!0,g.a=a.d,d.c[d.c.length]=g))}return d}function SXn(n,t,e){var i,r,c,a,u,o,s;if(OTn(e,"Network simplex node placement",1),n.e=t,n.n=BB(mMn(t,(hWn(),Alt)),304),oqn(n),REn(n),JT(wnn(new Rq(null,new w1(n.e.b,16)),new Hc),new cg(n)),JT(AV(wnn(AV(wnn(new Rq(null,new w1(n.e.b,16)),new ta),new ea),new ia),new ra),new rg(n)),qy(TD(mMn(n.e,(HXn(),xgt))))&&(OTn(c=mcn(e,1),"Straight Edges Pre-Processing",1),jzn(n),HSn(c)),Mvn(n.f),r=BB(mMn(t,xpt),19).a*n.f.a.c.length,WKn(Qk(Yk(B_(n.f),r),!1),mcn(e,1)),0!=n.d.a.gc()){for(OTn(c=mcn(e,1),"Flexible Where Space Processing",1),a=BB($N(Oz($V(new Rq(null,new w1(n.f.a,16)),new qc),new Dc)),19).a,u=BB($N(Iz($V(new Rq(null,new w1(n.f.a,16)),new Gc),new Rc)),19).a-a,o=AN(new qv,n.f),s=AN(new qv,n.f),UNn(aM(cM(rM(uM(new Hv,2e4),u),o),s)),JT(AV(AV(LU(n.i),new zc),new Uc),new zV(a,o,u,s)),i=n.d.a.ec().Kc();i.Ob();)BB(i.Pb(),213).g=1;WKn(Qk(Yk(B_(n.f),r),!1),mcn(c,1)),HSn(c)}qy(TD(mMn(t,xgt)))&&(OTn(c=mcn(e,1),"Straight Edges Post-Processing",1),SPn(n),HSn(c)),QGn(n),n.e=null,n.f=null,n.i=null,n.c=null,$U(n.k),n.j=null,n.a=null,n.o=null,n.d.a.$b(),HSn(e)}function PXn(n,t,i){var r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k;for(u=new Wb(n.a.b);u.a<u.c.c.length;)for(m=new Wb(BB(n0(u),29).a);m.a<m.c.c.length;)v=BB(n0(m),10),t.g[v.p]=v,t.a[v.p]=v,t.d[v.p]=0;for(o=n.a.b,t.c==(gJ(),nyt)&&(o=cL(o,152)?o6(BB(o,152)):cL(o,131)?BB(o,131).a:cL(o,54)?new fy(o):new CT(o)),a=o.Kc();a.Ob();)for(b=-1,l=BB(a.Pb(),29).a,t.o==(oZ(),cyt)&&(b=DWn,l=cL(l,152)?o6(BB(l,152)):cL(l,131)?BB(l,131).a:cL(l,54)?new fy(l):new CT(l)),k=l.Kc();k.Ob();)if(y=BB(k.Pb(),10),f=null,(f=t.c==nyt?BB(xq(n.b.f,y.p),15):BB(xq(n.b.b,y.p),15)).gc()>0)if(r=f.gc(),s=CJ(e.Math.floor((r+1)/2))-1,c=CJ(e.Math.ceil((r+1)/2))-1,t.o==cyt)for(h=c;h>=s;h--)t.a[y.p]==y&&(d=BB(f.Xb(h),46),w=BB(d.a,10),!FT(i,d.b)&&b>n.b.e[w.p]&&(t.a[w.p]=y,t.g[y.p]=t.g[w.p],t.a[y.p]=t.g[y.p],t.f[t.g[y.p].p]=(hN(),!!(qy(t.f[t.g[y.p].p])&y.k==(uSn(),Put))),b=n.b.e[w.p]));else for(h=s;h<=c;h++)t.a[y.p]==y&&(p=BB(f.Xb(h),46),g=BB(p.a,10),!FT(i,p.b)&&b<n.b.e[g.p]&&(t.a[g.p]=y,t.g[y.p]=t.g[g.p],t.a[y.p]=t.g[y.p],t.f[t.g[y.p].p]=(hN(),!!(qy(t.f[t.g[y.p].p])&y.k==(uSn(),Put))),b=n.b.e[g.p]))}function CXn(){CXn=O,eE(),POt=gOt.a,BB(Wtn(QQ(gOt.a),0),18),kOt=gOt.f,BB(Wtn(QQ(gOt.f),0),18),BB(Wtn(QQ(gOt.f),1),34),SOt=gOt.n,BB(Wtn(QQ(gOt.n),0),34),BB(Wtn(QQ(gOt.n),1),34),BB(Wtn(QQ(gOt.n),2),34),BB(Wtn(QQ(gOt.n),3),34),jOt=gOt.g,BB(Wtn(QQ(gOt.g),0),18),BB(Wtn(QQ(gOt.g),1),34),vOt=gOt.c,BB(Wtn(QQ(gOt.c),0),18),BB(Wtn(QQ(gOt.c),1),18),EOt=gOt.i,BB(Wtn(QQ(gOt.i),0),18),BB(Wtn(QQ(gOt.i),1),18),BB(Wtn(QQ(gOt.i),2),18),BB(Wtn(QQ(gOt.i),3),18),BB(Wtn(QQ(gOt.i),4),34),TOt=gOt.j,BB(Wtn(QQ(gOt.j),0),18),mOt=gOt.d,BB(Wtn(QQ(gOt.d),0),18),BB(Wtn(QQ(gOt.d),1),18),BB(Wtn(QQ(gOt.d),2),18),BB(Wtn(QQ(gOt.d),3),18),BB(Wtn(QQ(gOt.d),4),34),BB(Wtn(QQ(gOt.d),5),34),BB(Wtn(QQ(gOt.d),6),34),BB(Wtn(QQ(gOt.d),7),34),pOt=gOt.b,BB(Wtn(QQ(gOt.b),0),34),BB(Wtn(QQ(gOt.b),1),34),yOt=gOt.e,BB(Wtn(QQ(gOt.e),0),34),BB(Wtn(QQ(gOt.e),1),34),BB(Wtn(QQ(gOt.e),2),34),BB(Wtn(QQ(gOt.e),3),34),BB(Wtn(QQ(gOt.e),4),18),BB(Wtn(QQ(gOt.e),5),18),BB(Wtn(QQ(gOt.e),6),18),BB(Wtn(QQ(gOt.e),7),18),BB(Wtn(QQ(gOt.e),8),18),BB(Wtn(QQ(gOt.e),9),18),BB(Wtn(QQ(gOt.e),10),34),MOt=gOt.k,BB(Wtn(QQ(gOt.k),0),34),BB(Wtn(QQ(gOt.k),1),34)}function IXn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M,S,P;for(M=new YT,j=new YT,g=-1,o=new Wb(n);o.a<o.c.c.length;){for((a=BB(n0(o),128)).s=g--,h=0,m=0,c=new Wb(a.t);c.a<c.c.c.length;)m+=(i=BB(n0(c),268)).c;for(r=new Wb(a.i);r.a<r.c.c.length;)h+=(i=BB(n0(r),268)).c;a.n=h,a.u=m,0==m?r5(j,a,j.c.b,j.c):0==h&&r5(M,a,M.c.b,M.c)}for(P=S4(n),d=(f=n.c.length)+1,p=f-1,b=new Np;0!=P.a.gc();){for(;0!=j.b;)Px(0!=j.b),k=BB(Atn(j,j.a.a),128),P.a.Bc(k),k.s=p--,cLn(k,M,j);for(;0!=M.b;)Px(0!=M.b),E=BB(Atn(M,M.a.a),128),P.a.Bc(E),E.s=d++,cLn(E,M,j);for(w=_Vn,s=P.a.ec().Kc();s.Ob();)(v=(a=BB(s.Pb(),128)).u-a.n)>=w&&(v>w&&(b.c=x8(Ant,HWn,1,0,5,1),w=v),b.c[b.c.length]=a);0!=b.c.length&&(l=BB(xq(b,pvn(t,b.c.length)),128),P.a.Bc(l),l.s=d++,cLn(l,M,j),b.c=x8(Ant,HWn,1,0,5,1))}for(y=n.c.length+1,u=new Wb(n);u.a<u.c.c.length;)(a=BB(n0(u),128)).s<f&&(a.s+=y);for(T=new Wb(n);T.a<T.c.c.length;)for(e=new M2((E=BB(n0(T),128)).t,0);e.b<e.d.gc();)Px(e.b<e.d.gc()),S=(i=BB(e.d.Xb(e.c=e.b++),268)).b,E.s>S.s&&(fW(e),y7(S.i,i),i.c>0&&(i.a=S,WB(S.t,i),i.b=E,WB(E.i,i)))}function OXn(n){var t,e,i,r,c;switch(t=n.c){case 11:return n.Ml();case 12:return n.Ol();case 14:return n.Ql();case 15:return n.Tl();case 16:return n.Rl();case 17:return n.Ul();case 21:return QXn(n),wWn(),wWn(),sNt;case 10:switch(n.a){case 65:return n.yl();case 90:return n.Dl();case 122:return n.Kl();case 98:return n.El();case 66:return n.zl();case 60:return n.Jl();case 62:return n.Hl()}}switch(c=kXn(n),t=n.c){case 3:return n.Zl(c);case 4:return n.Xl(c);case 5:return n.Yl(c);case 0:if(123==n.a&&n.d<n.j){if(r=n.d,i=0,e=-1,!((t=fV(n.i,r++))>=48&&t<=57))throw Hp(new ak(kWn((u$(),X8n))));for(i=t-48;r<n.j&&(t=fV(n.i,r++))>=48&&t<=57;)if((i=10*i+t-48)<0)throw Hp(new ak(kWn((u$(),Y8n))));if(e=i,44==t){if(r>=n.j)throw Hp(new ak(kWn((u$(),V8n))));if((t=fV(n.i,r++))>=48&&t<=57){for(e=t-48;r<n.j&&(t=fV(n.i,r++))>=48&&t<=57;)if((e=10*e+t-48)<0)throw Hp(new ak(kWn((u$(),Y8n))));if(i>e)throw Hp(new ak(kWn((u$(),Q8n))))}else e=-1}if(125!=t)throw Hp(new ak(kWn((u$(),W8n))));n.sl(r)?(wWn(),wWn(),c=new h4(9,c),n.d=r+1):(wWn(),wWn(),c=new h4(3,c),n.d=r),c.dm(i),c.cm(e),QXn(n)}}return c}function AXn(n,t,e,i,r){var c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M;for(w=new J6(t.b),v=new J6(t.b),l=new J6(t.b),j=new J6(t.b),d=new J6(t.b),k=spn(t,0);k.b!=k.d.c;)for(u=new Wb((m=BB(b3(k),11)).g);u.a<u.c.c.length;)if((c=BB(n0(u),17)).c.i==c.d.i){if(m.j==c.d.j){j.c[j.c.length]=c;continue}if(m.j==(kUn(),sIt)&&c.d.j==SIt){d.c[d.c.length]=c;continue}}for(o=new Wb(d);o.a<o.c.c.length;)__n(n,c=BB(n0(o),17),e,i,(kUn(),oIt));for(a=new Wb(j);a.a<a.c.c.length;)c=BB(n0(a),17),Bl(E=new $vn(n),(uSn(),Iut)),hon(E,(HXn(),ept),(QEn(),XCt)),hon(E,(hWn(),dlt),c),hon(T=new CSn,dlt,c.d),qCn(T,(kUn(),CIt)),CZ(T,E),hon(M=new CSn,dlt,c.c),qCn(M,oIt),CZ(M,E),hon(c.c,Elt,E),hon(c.d,Elt,E),SZ(c,null),MZ(c,null),e.c[e.c.length]=E,hon(E,Bft,iln(2));for(y=spn(t,0);y.b!=y.d.c;)s=(m=BB(b3(y),11)).e.c.length>0,g=m.g.c.length>0,s&&g?l.c[l.c.length]=m:s?w.c[w.c.length]=m:g&&(v.c[v.c.length]=m);for(b=new Wb(w);b.a<b.c.c.length;)WB(r,HBn(n,BB(n0(b),11),null,e));for(p=new Wb(v);p.a<p.c.c.length;)WB(r,HBn(n,null,BB(n0(p),11),e));for(f=new Wb(l);f.a<f.c.c.length;)WB(r,HBn(n,h=BB(n0(f),11),h,e))}function $Xn(n){var t,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E;for(d=new xC(RQn,RQn),t=new xC(KQn,KQn),k=new Wb(n);k.a<k.c.c.length;)y=BB(n0(k),8),d.a=e.Math.min(d.a,y.a),d.b=e.Math.min(d.b,y.b),t.a=e.Math.max(t.a,y.a),t.b=e.Math.max(t.b,y.b);for(s=new xC(t.a-d.a,t.b-d.b),h=new ZFn(new xC(d.a-50,d.b-s.a-50),new xC(d.a-50,t.b+s.a+50),new xC(t.a+s.b/2+50,d.b+s.b/2)),m=new Rv,c=new Np,i=new Np,m.a.zc(h,m),E=new Wb(n);E.a<E.c.c.length;){for(j=BB(n0(E),8),c.c=x8(Ant,HWn,1,0,5,1),v=m.a.ec().Kc();v.Ob();)W8((g=BB(v.Pb(),308)).d,g.a),Ibn(W8(g.d,j),W8(g.d,g.a))<0&&(c.c[c.c.length]=g);for(i.c=x8(Ant,HWn,1,0,5,1),p=new Wb(c);p.a<p.c.c.length;)for(b=new Wb((g=BB(n0(p),308)).e);b.a<b.c.c.length;){for(f=BB(n0(b),168),a=!0,o=new Wb(c);o.a<o.c.c.length;)(u=BB(n0(o),308))!=g&&(cV(f,xq(u.e,0))||cV(f,xq(u.e,1))||cV(f,xq(u.e,2)))&&(a=!1);a&&(i.c[i.c.length]=f)}for(oMn(m,c),e5(m,new bn),l=new Wb(i);l.a<l.c.c.length;)TU(m,new ZFn(j,(f=BB(n0(l),168)).a,f.b))}for(e5(m,new jw(w=new Rv)),r=w.a.ec().Kc();r.Ob();)(K7(h,(f=BB(r.Pb(),168)).a)||K7(h,f.b))&&r.Qb();return e5(w,new wn),w}function LXn(n){var t,e,i;switch(e=BB(mMn(n,(hWn(),Zft)),21),t=kA(Nat),BB(mMn(n,(HXn(),sgt)),334)==(ufn(),pCt)&&Jcn(t,xat),qy(TD(mMn(n,ugt)))?dq(t,(yMn(),Rat),(lWn(),Hot)):dq(t,(yMn(),_at),(lWn(),Hot)),null!=mMn(n,(C6(),TMt))&&Jcn(t,Dat),(qy(TD(mMn(n,ggt)))||qy(TD(mMn(n,ogt))))&&WG(t,(yMn(),Bat),(lWn(),eot)),BB(mMn(n,Udt),103).g){case 2:case 3:case 4:WG(dq(t,(yMn(),Rat),(lWn(),rot)),Bat,iot)}switch(e.Hc((bDn(),hft))&&WG(dq(dq(t,(yMn(),Rat),(lWn(),tot)),Fat,Zut),Bat,not),GI(mMn(n,Sgt))!==GI((sNn(),Ivt))&&dq(t,(yMn(),_at),(lWn(),Not)),e.Hc(pft)&&(dq(t,(yMn(),Rat),(lWn(),Fot)),dq(t,Kat,Kot),dq(t,_at,_ot)),GI(mMn(n,Pdt))!==GI((JMn(),cft))&&GI(mMn(n,Zdt))!==GI((Mbn(),YPt))&&WG(t,(yMn(),Bat),(lWn(),pot)),qy(TD(mMn(n,fgt)))&&dq(t,(yMn(),_at),(lWn(),got)),qy(TD(mMn(n,Hdt)))&&dq(t,(yMn(),_at),(lWn(),Wot)),KLn(n)&&(i=(GI(mMn(n,sgt))===GI(pCt)?BB(mMn(n,Rdt),292):BB(mMn(n,Kdt),292))==(Kan(),jft)?(lWn(),Rot):(lWn(),Yot),dq(t,(yMn(),Fat),i)),BB(mMn(n,zpt),377).g){case 1:dq(t,(yMn(),Fat),(lWn(),Vot));break;case 2:WG(dq(dq(t,(yMn(),_at),(lWn(),Vut)),Fat,Qut),Bat,Yut)}return GI(mMn(n,Ldt))!==GI((mon(),Nvt))&&dq(t,(yMn(),_at),(lWn(),Qot)),t}function NXn(n){NM(n,new MTn(vj(wj(pj(gj(new du,$4n),"ELK Rectangle Packing"),"Algorithm for packing of unconnected boxes, i.e. graphs without edges. The given order of the boxes is always preserved and the main reading direction of the boxes is left to right. The algorithm is divided into two phases. One phase approximates the width in which the rectangles can be placed. The next phase places the rectangles in rows using the previously calculated width as bounding width and bundles rectangles with a similar height in blocks. A compaction step reduces the size of the drawing. Finally, the rectangles are expanded to fill their bounding box and eliminate empty unused spaces."),new Za))),u2(n,$4n,VJn,1.3),u2(n,$4n,A4n,mpn(gEt)),u2(n,$4n,QJn,IEt),u2(n,$4n,vZn,15),u2(n,$4n,u3n,mpn(bEt)),u2(n,$4n,PZn,mpn(jEt)),u2(n,$4n,BZn,mpn(EEt)),u2(n,$4n,SZn,mpn(TEt)),u2(n,$4n,CZn,mpn(kEt)),u2(n,$4n,MZn,mpn(MEt)),u2(n,$4n,IZn,mpn(OEt)),u2(n,$4n,E4n,mpn(PEt)),u2(n,$4n,T4n,mpn(yEt)),u2(n,$4n,P4n,mpn(SEt)),u2(n,$4n,C4n,mpn(AEt)),u2(n,$4n,I4n,mpn(pEt)),u2(n,$4n,jZn,mpn(vEt)),u2(n,$4n,m3n,mpn(mEt)),u2(n,$4n,S4n,mpn(dEt)),u2(n,$4n,M4n,mpn(wEt)),u2(n,$4n,O4n,mpn(LEt))}function xXn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b,w,d;if(null==e)return null;if(n.a!=t.Aj())throw Hp(new _y(d6n+t.ne()+g6n));if(cL(t,457)){if(!(d=SDn(BB(t,671),e)))throw Hp(new _y(p6n+e+"' is not a valid enumerator of '"+t.ne()+"'"));return d}switch(Cfn((IPn(),Z$t),t).cl()){case 2:e=FBn(e,!1);break;case 3:e=FBn(e,!0)}if(i=Cfn(Z$t,t).$k())return i.Aj().Nh().Kh(i,e);if(f=Cfn(Z$t,t).al()){for(d=new Np,s=0,h=(o=ysn(e)).length;s<h;++s)u=o[s],WB(d,f.Aj().Nh().Kh(f,u));return d}if(!(w=Cfn(Z$t,t).bl()).dc()){for(b=w.Kc();b.Ob();){l=BB(b.Pb(),148);try{if(null!=(d=l.Aj().Nh().Kh(l,e)))return d}catch(g){if(!cL(g=lun(g),60))throw Hp(g)}}throw Hp(new _y(p6n+e+"' does not match any member types of the union datatype '"+t.ne()+"'"))}if(BB(t,834).Fj(),!(r=xfn(t.Bj())))return null;if(r==Stt){c=0;try{c=l_n(e,_Vn,DWn)&QVn}catch(g){if(!cL(g=lun(g),127))throw Hp(g);c=V7(e)[0]}return fun(c)}if(r==mtt){for(a=0;a<IOt.length;++a)try{return BM(IOt[a],e)}catch(g){if(!cL(g=lun(g),32))throw Hp(g)}throw Hp(new _y(p6n+e+"' is not a date formatted string of the form yyyy-MM-dd'T'HH:mm:ss'.'SSSZ or a valid subset thereof"))}throw Hp(new _y(p6n+e+"' is invalid. "))}function DXn(n,t){var e,i,r,c,a,u,o,s;if(e=0,a=0,c=t.length,u=null,s=new Ik,a<c&&(b1(a,t.length),43==t.charCodeAt(a))&&(++e,++a<c&&(b1(a,t.length),43==t.charCodeAt(a)||(b1(a,t.length),45==t.charCodeAt(a)))))throw Hp(new Mk(DQn+t+'"'));for(;a<c&&(b1(a,t.length),46!=t.charCodeAt(a))&&(b1(a,t.length),101!=t.charCodeAt(a))&&(b1(a,t.length),69!=t.charCodeAt(a));)++a;if(s.a+=""+fx(null==t?zWn:(kW(t),t),e,a),a<c&&(b1(a,t.length),46==t.charCodeAt(a))){for(e=++a;a<c&&(b1(a,t.length),101!=t.charCodeAt(a))&&(b1(a,t.length),69!=t.charCodeAt(a));)++a;n.e=a-e,s.a+=""+fx(null==t?zWn:(kW(t),t),e,a)}else n.e=0;if(a<c&&(b1(a,t.length),101==t.charCodeAt(a)||(b1(a,t.length),69==t.charCodeAt(a)))&&(e=++a,a<c&&(b1(a,t.length),43==t.charCodeAt(a))&&++a<c&&(b1(a,t.length),45!=t.charCodeAt(a))&&++e,u=t.substr(e,c-e),n.e=n.e-l_n(u,_Vn,DWn),n.e!=CJ(n.e)))throw Hp(new Mk("Scale out of range."));if((o=s.a).length<16){if(n.f=(null==Vtt&&(Vtt=new RegExp("^[+-]?\\d*$","i")),Vtt.test(o)?parseInt(o,10):NaN),isNaN(n.f))throw Hp(new Mk(DQn+t+'"'));n.a=aIn(n.f)}else fdn(n,new $A(o));for(n.d=s.a.length,r=0;r<s.a.length&&(45==(i=fV(s.a,r))||48==i);++r)--n.d;0==n.d&&(n.d=1)}function RXn(){RXn=O,JIn(fut=new pJ,(kUn(),wIt),vIt),JIn(fut,MIt,vIt),JIn(fut,MIt,kIt),JIn(fut,hIt,pIt),JIn(fut,hIt,vIt),JIn(fut,dIt,vIt),JIn(fut,dIt,mIt),JIn(fut,EIt,lIt),JIn(fut,EIt,vIt),JIn(fut,yIt,bIt),JIn(fut,yIt,vIt),JIn(fut,yIt,mIt),JIn(fut,yIt,lIt),JIn(fut,bIt,yIt),JIn(fut,bIt,kIt),JIn(fut,bIt,pIt),JIn(fut,bIt,vIt),JIn(fut,jIt,jIt),JIn(fut,jIt,mIt),JIn(fut,jIt,kIt),JIn(fut,gIt,gIt),JIn(fut,gIt,mIt),JIn(fut,gIt,pIt),JIn(fut,TIt,TIt),JIn(fut,TIt,lIt),JIn(fut,TIt,kIt),JIn(fut,fIt,fIt),JIn(fut,fIt,lIt),JIn(fut,fIt,pIt),JIn(fut,mIt,dIt),JIn(fut,mIt,yIt),JIn(fut,mIt,jIt),JIn(fut,mIt,gIt),JIn(fut,mIt,vIt),JIn(fut,mIt,mIt),JIn(fut,mIt,kIt),JIn(fut,mIt,pIt),JIn(fut,lIt,EIt),JIn(fut,lIt,yIt),JIn(fut,lIt,TIt),JIn(fut,lIt,fIt),JIn(fut,lIt,lIt),JIn(fut,lIt,kIt),JIn(fut,lIt,pIt),JIn(fut,lIt,vIt),JIn(fut,kIt,MIt),JIn(fut,kIt,bIt),JIn(fut,kIt,jIt),JIn(fut,kIt,TIt),JIn(fut,kIt,mIt),JIn(fut,kIt,lIt),JIn(fut,kIt,kIt),JIn(fut,kIt,vIt),JIn(fut,pIt,hIt),JIn(fut,pIt,bIt),JIn(fut,pIt,gIt),JIn(fut,pIt,fIt),JIn(fut,pIt,mIt),JIn(fut,pIt,lIt),JIn(fut,pIt,pIt),JIn(fut,pIt,vIt),JIn(fut,vIt,wIt),JIn(fut,vIt,MIt),JIn(fut,vIt,hIt),JIn(fut,vIt,dIt),JIn(fut,vIt,EIt),JIn(fut,vIt,yIt),JIn(fut,vIt,bIt),JIn(fut,vIt,mIt),JIn(fut,vIt,lIt),JIn(fut,vIt,kIt),JIn(fut,vIt,pIt),JIn(fut,vIt,vIt)}function KXn(n,t,i){var r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T;for(n.d=new xC(RQn,RQn),n.c=new xC(KQn,KQn),l=t.Kc();l.Ob();)for(m=new Wb(BB(l.Pb(),37).a);m.a<m.c.c.length;)v=BB(n0(m),10),n.d.a=e.Math.min(n.d.a,v.n.a-v.d.b),n.d.b=e.Math.min(n.d.b,v.n.b-v.d.d),n.c.a=e.Math.max(n.c.a,v.n.a+v.o.a+v.d.c),n.c.b=e.Math.max(n.c.b,v.n.b+v.o.b+v.d.a);for(o=new Yv,f=t.Kc();f.Ob();)r=uXn(n,BB(f.Pb(),37)),WB(o.a,r),r.a=r.a|!BB(mMn(r.c,(hWn(),Xft)),21).dc();for(n.b=(Shn(),(T=new kt).f=new vin(i),T.b=oGn(T.f,o),T),jGn((w=n.b,new Xm,w)),n.e=new Gj,n.a=n.b.f.e,u=new Wb(o.a);u.a<u.c.c.length;)for(c=BB(n0(u),841),y=AJ(n.b,c),nKn(c.c,y.a,y.b),g=new Wb(c.c.a);g.a<g.c.c.length;)(d=BB(n0(g),10)).k==(uSn(),Mut)&&(p=lLn(n,d.n,BB(mMn(d,(hWn(),Qft)),61)),UR(kO(d.n),p));for(a=new Wb(o.a);a.a<a.c.c.length;)for(h=new Wb(wln(c=BB(n0(a),841)));h.a<h.c.c.length;)for(Kx(E=new Kj((s=BB(n0(h),17)).a),0,g1(s.c)),DH(E,g1(s.d)),b=null,j=spn(E,0);j.b!=j.d.c;)k=BB(b3(j),8),b?(uen(b.a,k.a)?(n.e.a=e.Math.min(n.e.a,b.a),n.a.a=e.Math.max(n.a.a,b.a)):uen(b.b,k.b)&&(n.e.b=e.Math.min(n.e.b,b.b),n.a.b=e.Math.max(n.a.b,b.b)),b=k):b=k;qx(n.e),UR(n.a,n.e)}function _Xn(n){V$n(n.b,V9n,Pun(Gk(Qtt,1),sVn,2,6,[Y9n,"ConsistentTransient"])),V$n(n.a,V9n,Pun(Gk(Qtt,1),sVn,2,6,[Y9n,"WellFormedSourceURI"])),V$n(n.o,V9n,Pun(Gk(Qtt,1),sVn,2,6,[Y9n,"InterfaceIsAbstract AtMostOneID UniqueFeatureNames UniqueOperationSignatures NoCircularSuperTypes WellFormedMapEntryClass ConsistentSuperTypes DisjointFeatureAndOperationSignatures"])),V$n(n.p,V9n,Pun(Gk(Qtt,1),sVn,2,6,[Y9n,"WellFormedInstanceTypeName UniqueTypeParameterNames"])),V$n(n.v,V9n,Pun(Gk(Qtt,1),sVn,2,6,[Y9n,"UniqueEnumeratorNames UniqueEnumeratorLiterals"])),V$n(n.R,V9n,Pun(Gk(Qtt,1),sVn,2,6,[Y9n,"WellFormedName"])),V$n(n.T,V9n,Pun(Gk(Qtt,1),sVn,2,6,[Y9n,"UniqueParameterNames UniqueTypeParameterNames NoRepeatingVoid"])),V$n(n.U,V9n,Pun(Gk(Qtt,1),sVn,2,6,[Y9n,"WellFormedNsURI WellFormedNsPrefix UniqueSubpackageNames UniqueClassifierNames UniqueNsURIs"])),V$n(n.W,V9n,Pun(Gk(Qtt,1),sVn,2,6,[Y9n,"ConsistentOpposite SingleContainer ConsistentKeys ConsistentUnique ConsistentContainer"])),V$n(n.bb,V9n,Pun(Gk(Qtt,1),sVn,2,6,[Y9n,"ValidDefaultValueLiteral"])),V$n(n.eb,V9n,Pun(Gk(Qtt,1),sVn,2,6,[Y9n,"ValidLowerBound ValidUpperBound ConsistentBounds ValidType"])),V$n(n.H,V9n,Pun(Gk(Qtt,1),sVn,2,6,[Y9n,"ConsistentType ConsistentBounds ConsistentArguments"]))}function FXn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k;if(!t.dc()){if(r=new km,f=(a=e||BB(t.Xb(0),17)).c,gxn(),(s=f.i.k)!=(uSn(),Cut)&&s!=Iut&&s!=Mut&&s!=Tut)throw Hp(new _y("The target node of the edge must be a normal node or a northSouthPort."));for(fO(r,Aon(Pun(Gk(PMt,1),sVn,8,0,[f.i.n,f.n,f.a]))),(kUn(),yIt).Hc(f.j)&&(b=Gy(MD(mMn(f,(hWn(),Llt)))),r5(r,new xC(Aon(Pun(Gk(PMt,1),sVn,8,0,[f.i.n,f.n,f.a])).a,b),r.c.b,r.c)),o=null,i=!1,u=t.Kc();u.Ob();)0!=(c=BB(u.Pb(),17).a).b&&(i?(r5(r,kL(UR(o,(Px(0!=c.b),BB(c.a.a.c,8))),.5),r.c.b,r.c),i=!1):i=!0,o=B$((Px(0!=c.b),BB(c.c.b.c,8))),Frn(r,c),yQ(c));l=a.d,yIt.Hc(l.j)&&(b=Gy(MD(mMn(l,(hWn(),Llt)))),r5(r,new xC(Aon(Pun(Gk(PMt,1),sVn,8,0,[l.i.n,l.n,l.a])).a,b),r.c.b,r.c)),fO(r,Aon(Pun(Gk(PMt,1),sVn,8,0,[l.i.n,l.n,l.a]))),n.d==(Usn(),emt)&&(Px(0!=r.b),w=BB(r.a.a.c,8),d=BB(Dpn(r,1),8),(g=new XZ(hsn(f.j))).a*=5,g.b*=5,p=XR(new xC(d.a,d.b),w),UR(v=new xC(iZ(g.a,p.a),iZ(g.b,p.b)),w),nX(spn(r,1),v),Px(0!=r.b),m=BB(r.c.b.c,8),y=BB(Dpn(r,r.b-2),8),(g=new XZ(hsn(l.j))).a*=5,g.b*=5,p=XR(new xC(y.a,y.b),m),UR(k=new xC(iZ(g.a,p.a),iZ(g.b,p.b)),m),Kx(r,r.b-1,k)),h=new oBn(r),Frn(a.a,Fvn(h))}}function BXn(n,t,i,r){var c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M,S,P,C,I,O,A,$,L,N,x;if(y=(v=BB(Wtn((!n.b&&(n.b=new hK(KOt,n,4,7)),n.b),0),82)).Dg(),k=v.Eg(),m=v.Cg()/2,w=v.Bg()/2,cL(v,186)&&(y+=WJ(p=BB(v,118)).i,y+=WJ(p).i),y+=m,k+=w,C=(S=BB(Wtn((!n.b&&(n.b=new hK(KOt,n,4,7)),n.b),0),82)).Dg(),I=S.Eg(),P=S.Cg()/2,j=S.Bg()/2,cL(S,186)&&(C+=WJ(M=BB(S,118)).i,C+=WJ(M).i),C+=P,I+=j,0==(!n.a&&(n.a=new eU(FOt,n,6,6)),n.a).i)tE(),o=new co,f9((!n.a&&(n.a=new eU(FOt,n,6,6)),n.a),o);else if((!n.a&&(n.a=new eU(FOt,n,6,6)),n.a).i>1)for(b=new cx((!n.a&&(n.a=new eU(FOt,n,6,6)),n.a));b.e!=b.i.gc();)Qjn(b);for(d=C,C>y+m?d=y+m:C<y-m&&(d=y-m),g=I,I>k+w?g=k+w:I<k-w&&(g=k-w),d>y-m&&d<y+m&&g>k-w&&g<k+w&&(d=y+m),Ien(u=BB(Wtn((!n.a&&(n.a=new eU(FOt,n,6,6)),n.a),0),202),d),Aen(u,g),E=y,y>C+P?E=C+P:y<C-P&&(E=C-P),T=k,k>I+j?T=I+j:k<I-j&&(T=I-j),E>C-P&&E<C+P&&T>I-j&&T<I+j&&(T=I+j),Ten(u,E),Oen(u,T),sqn((!u.a&&(u.a=new $L(xOt,u,5)),u.a)),a=pvn(t,5),v==S&&++a,A=E-d,N=T-g,h=.20000000298023224*e.Math.sqrt(A*A+N*N),$=A/(a+1),x=N/(a+1),O=d,L=g,s=0;s<a;s++)L+=x,(f=(O+=$)+H$n(t,24)*uYn*h-h/2)<0?f=1:f>i&&(f=i-1),(l=L+H$n(t,24)*uYn*h-h/2)<0?l=1:l>r&&(l=r-1),tE(),jen(c=new ro,f),Een(c,l),f9((!u.a&&(u.a=new $L(xOt,u,5)),u.a),c)}function HXn(){HXn=O,sWn(),ppt=jPt,vpt=EPt,mpt=TPt,ypt=MPt,jpt=SPt,Ept=PPt,Spt=IPt,Cpt=APt,Ipt=$Pt,Ppt=OPt,Opt=LPt,$pt=NPt,Npt=RPt,Mpt=CPt,fWn(),gpt=_wt,kpt=Fwt,Tpt=Bwt,Apt=Hwt,hpt=new XA(pPt,iln(0)),fpt=Dwt,lpt=Rwt,bpt=Kwt,zpt=ldt,Rpt=zwt,Kpt=Wwt,Bpt=edt,_pt=Ywt,Fpt=Zwt,Xpt=pdt,Upt=wdt,qpt=odt,Hpt=adt,Gpt=hdt,Rgt=Pwt,Kgt=Cwt,rgt=Kbt,cgt=Bbt,Ugt=new WA(12),zgt=new XA(XSt,Ugt),Mbn(),Zdt=new XA(vSt,ngt=QPt),tpt=new XA(aPt,0),wpt=new XA(vPt,iln(1)),Edt=new XA(cSt,dZn),Ggt=zSt,ept=uPt,upt=wPt,zdt=lSt,kdt=iSt,sgt=ESt,dpt=new XA(kPt,(hN(),!0)),wgt=SSt,dgt=PSt,Fgt=KSt,qgt=qSt,Bgt=FSt,Ffn(),Udt=new XA(bSt,Wdt=BPt),$gt=DSt,Agt=NSt,cpt=fPt,rpt=hPt,apt=bPt,cpn(),new XA(ZSt,Vgt=qCt),Ygt=ePt,Jgt=iPt,Zgt=rPt,Qgt=tPt,Dpt=Gwt,Pgt=lwt,Sgt=hwt,xpt=qwt,kgt=ewt,Gdt=Tbt,qdt=jbt,xdt=ubt,Ddt=obt,Kdt=bbt,Rdt=sbt,Hdt=ybt,Igt=wwt,Ogt=dwt,pgt=Vbt,_gt=$wt,Ngt=mwt,ugt=Gbt,Dgt=Mwt,egt=Nbt,igt=Dbt,Ndt=hSt,Lgt=gwt,Pdt=Qlt,Sdt=Wlt,Mdt=Xlt,fgt=Xbt,hgt=Ubt,lgt=Wbt,Hgt=BSt,vgt=OSt,agt=ySt,Ydt=gSt,Qdt=dSt,_dt=gbt,ipt=sPt,Tdt=sSt,bgt=MSt,npt=cPt,Xgt=VSt,Wgt=YSt,Egt=cwt,Tgt=uwt,spt=gPt,jdt=Ult,Mgt=swt,Jdt=Obt,Vdt=Cbt,Cgt=$St,mgt=Zbt,xgt=jwt,Lpt=xPt,Xdt=Sbt,opt=Nwt,tgt=$bt,ygt=twt,Fdt=vbt,ggt=ISt,jgt=rwt,Bdt=mbt,Ldt=cbt,Adt=ebt,Idt=nbt,Odt=tbt,$dt=rbt,Cdt=Jlt,ogt=zbt}function qXn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M,S,P,C;if(uHn(),T=n.e,w=n.d,r=n.a,0==T)switch(t){case 0:return"0";case 1:return WQn;case 2:return"0.00";case 3:return"0.000";case 4:return"0.0000";case 5:return"0.00000";case 6:return"0.000000";default:return(j=new Ck).a+=t<0?"0E+":"0E",j.a+=-t,j.a}if(y=x8(ONt,WVn,25,1+(m=10*w+1+7),15,1),e=m,1==w)if((u=r[0])<0){C=e0(u,UQn);do{d=C,C=Ojn(C,10),y[--e]=48+dG(ibn(d,cbn(C,10)))&QVn}while(0!=Vhn(C,0))}else{C=u;do{d=C,C=C/10|0,y[--e]=d-10*C+48&QVn}while(0!=C)}else{aHn(r,0,S=x8(ANt,hQn,25,w,15,1),0,P=w);n:for(;;){for(E=0,s=P-1;s>=0;s--)p=fTn(rbn(yz(E,32),e0(S[s],UQn))),S[s]=dG(p),E=dG(kz(p,32));v=dG(E),g=e;do{y[--e]=48+v%10&QVn}while(0!=(v=v/10|0)&&0!=e);for(i=9-g+e,o=0;o<i&&e>0;o++)y[--e]=48;for(f=P-1;0==S[f];f--)if(0==f)break n;P=f+1}for(;48==y[e];)++e}if(b=T<0,a=m-e-t-1,0==t)return b&&(y[--e]=45),Bdn(y,e,m-e);if(t>0&&a>=-6){if(a>=0){for(h=e+a,l=m-1;l>=h;l--)y[l+1]=y[l];return y[++h]=46,b&&(y[--e]=45),Bdn(y,e,m-e+1)}for(f=2;f<1-a;f++)y[--e]=48;return y[--e]=46,y[--e]=48,b&&(y[--e]=45),Bdn(y,e,m-e)}return M=e+1,c=m,k=new Ik,b&&(k.a+="-"),c-M>=1?(xX(k,y[e]),k.a+=".",k.a+=Bdn(y,e+1,m-e-1)):k.a+=Bdn(y,e,m-e),k.a+="E",a>0&&(k.a+="+"),k.a+=""+a,k.a}function GXn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k;switch(n.c=t,n.g=new xp,GM(),twn(new Pw(new Dy(n.c))),v=SD(ZAn(n.c,(MMn(),dTt))),u=BB(ZAn(n.c,pTt),316),y=BB(ZAn(n.c,vTt),429),c=BB(ZAn(n.c,hTt),482),m=BB(ZAn(n.c,gTt),430),n.j=Gy(MD(ZAn(n.c,mTt))),a=n.a,u.g){case 0:a=n.a;break;case 1:a=n.b;break;case 2:a=n.i;break;case 3:a=n.e;break;case 4:a=n.f;break;default:throw Hp(new _y(N4n+(null!=u.f?u.f:""+u.g)))}if(n.d=new DJ(a,y,c),hon(n.d,(Xcn(),Qrt),TD(ZAn(n.c,lTt))),n.d.c=qy(TD(ZAn(n.c,fTt))),0==YQ(n.c).i)return n.d;for(h=new AL(YQ(n.c));h.e!=h.i.gc();){for(l=(s=BB(kpn(h),33)).g/2,f=s.f/2,k=new xC(s.i+l,s.j+f);hU(n.g,k);)_x(k,(e.Math.random()-.5)*lZn,(e.Math.random()-.5)*lZn);w=BB(ZAn(s,(sWn(),$St)),142),d=new AZ(k,new UV(k.a-l-n.j/2-w.b,k.b-f-n.j/2-w.d,s.g+n.j+(w.b+w.c),s.f+n.j+(w.d+w.a))),WB(n.d.i,d),VW(n.g,k,new rI(d,s))}switch(m.g){case 0:if(null==v)n.d.d=BB(xq(n.d.i,0),65);else for(p=new Wb(n.d.i);p.a<p.c.c.length;)d=BB(n0(p),65),null!=(b=BB(BB(RX(n.g,d.a),46).b,33).zg())&&mK(b,v)&&(n.d.d=d);break;case 1:for((i=new xC(n.c.g,n.c.f)).a*=.5,i.b*=.5,_x(i,n.c.i,n.c.j),r=RQn,g=new Wb(n.d.i);g.a<g.c.c.length;)(o=W8((d=BB(n0(g),65)).a,i))<r&&(r=o,n.d.d=d);break;default:throw Hp(new _y(N4n+(null!=m.f?m.f:""+m.g)))}return n.d}function zXn(n,t,i){var r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E;for(j=BB(Wtn((!n.a&&(n.a=new eU(FOt,n,6,6)),n.a),0),202),f=new km,k=new xp,E=tFn(j),jCn(k.f,j,E),b=new xp,r=new YT,d=NU(Wen(Pun(Gk(xnt,1),HWn,20,0,[(!t.d&&(t.d=new hK(_Ot,t,8,5)),t.d),(!t.e&&(t.e=new hK(_Ot,t,7,4)),t.e)])));dAn(d);){if(w=BB(U5(d),79),1!=(!n.a&&(n.a=new eU(FOt,n,6,6)),n.a).i)throw Hp(new _y(B5n+(!n.a&&(n.a=new eU(FOt,n,6,6)),n.a).i));w!=n&&(r5(r,p=BB(Wtn((!w.a&&(w.a=new eU(FOt,w,6,6)),w.a),0),202),r.c.b,r.c),(g=BB(qI(AY(k.f,p)),12))||(g=tFn(p),jCn(k.f,p,g)),l=i?XR(new wA(BB(xq(E,E.c.length-1),8)),BB(xq(g,g.c.length-1),8)):XR(new wA((l1(0,E.c.length),BB(E.c[0],8))),(l1(0,g.c.length),BB(g.c[0],8))),jCn(b.f,p,l))}if(0!=r.b)for(v=BB(xq(E,i?E.c.length-1:0),8),h=1;h<E.c.length;h++){for(m=BB(xq(E,i?E.c.length-1-h:h),8),c=spn(r,0);c.b!=c.d.c;)p=BB(b3(c),202),(g=BB(qI(AY(k.f,p)),12)).c.length<=h?mtn(c):(y=UR(new wA(BB(xq(g,i?g.c.length-1-h:h),8)),BB(qI(AY(b.f,p)),8)),m.a==y.a&&m.b==y.b||(a=m.a-v.a,o=m.b-v.b,(u=y.a-v.a)*o==(s=y.b-v.b)*a&&(0==a||isNaN(a)?a:a<0?-1:1)==(0==u||isNaN(u)?u:u<0?-1:1)&&(0==o||isNaN(o)?o:o<0?-1:1)==(0==s||isNaN(s)?s:s<0?-1:1)?(e.Math.abs(a)<e.Math.abs(u)||e.Math.abs(o)<e.Math.abs(s))&&r5(f,m,f.c.b,f.c):h>1&&r5(f,v,f.c.b,f.c),mtn(c)));v=m}return f}function UXn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M,S,P,C,I,O,A;for(OTn(e,"Greedy cycle removal",1),A=(m=t.a).c.length,n.a=x8(ANt,hQn,25,A,15,1),n.c=x8(ANt,hQn,25,A,15,1),n.b=x8(ANt,hQn,25,A,15,1),s=0,p=new Wb(m);p.a<p.c.c.length;){for((d=BB(n0(p),10)).p=s,T=new Wb(d.j);T.a<T.c.c.length;){for(u=new Wb((k=BB(n0(T),11)).e);u.a<u.c.c.length;)(i=BB(n0(u),17)).c.i!=d&&(S=BB(mMn(i,(HXn(),fpt)),19).a,n.a[s]+=S>0?S+1:1);for(a=new Wb(k.g);a.a<a.c.c.length;)(i=BB(n0(a),17)).d.i!=d&&(S=BB(mMn(i,(HXn(),fpt)),19).a,n.c[s]+=S>0?S+1:1)}0==n.c[s]?DH(n.e,d):0==n.a[s]&&DH(n.f,d),++s}for(w=-1,b=1,f=new Np,n.d=BB(mMn(t,(hWn(),Slt)),230);A>0;){for(;0!=n.e.b;)C=BB(dH(n.e),10),n.b[C.p]=w--,QKn(n,C),--A;for(;0!=n.f.b;)I=BB(dH(n.f),10),n.b[I.p]=b++,QKn(n,I),--A;if(A>0){for(l=_Vn,v=new Wb(m);v.a<v.c.c.length;)d=BB(n0(v),10),0==n.b[d.p]&&(y=n.c[d.p]-n.a[d.p])>=l&&(y>l&&(f.c=x8(Ant,HWn,1,0,5,1),l=y),f.c[f.c.length]=d);h=n.Zf(f),n.b[h.p]=b++,QKn(n,h),--A}}for(P=m.c.length+1,s=0;s<m.c.length;s++)n.b[s]<0&&(n.b[s]+=P);for(g=new Wb(m);g.a<g.c.c.length;)for(E=0,M=(j=I2((d=BB(n0(g),10)).j)).length;E<M;++E)for(c=0,o=(r=Z0((k=j[E]).g)).length;c<o;++c)O=(i=r[c]).d.i.p,n.b[d.p]>n.b[O]&&(tBn(i,!0),hon(t,qft,(hN(),!0)));n.a=null,n.c=null,n.b=null,yQ(n.f),yQ(n.e),HSn(e)}function XXn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p;for(i=new Np,u=new Np,g=t/2,b=n.gc(),r=BB(n.Xb(0),8),p=BB(n.Xb(1),8),WB(i,(l1(0,(w=QAn(r.a,r.b,p.a,p.b,g)).c.length),BB(w.c[0],8))),WB(u,(l1(1,w.c.length),BB(w.c[1],8))),s=2;s<b;s++)d=r,r=p,p=BB(n.Xb(s),8),WB(i,(l1(1,(w=QAn(r.a,r.b,d.a,d.b,g)).c.length),BB(w.c[1],8))),WB(u,(l1(0,w.c.length),BB(w.c[0],8))),WB(i,(l1(0,(w=QAn(r.a,r.b,p.a,p.b,g)).c.length),BB(w.c[0],8))),WB(u,(l1(1,w.c.length),BB(w.c[1],8)));for(WB(i,(l1(1,(w=QAn(p.a,p.b,r.a,r.b,g)).c.length),BB(w.c[1],8))),WB(u,(l1(0,w.c.length),BB(w.c[0],8))),e=new km,a=new Np,DH(e,(l1(0,i.c.length),BB(i.c[0],8))),h=1;h<i.c.length-2;h+=2)l1(h,i.c.length),c=BB(i.c[h],8),l=qPn((l1(h-1,i.c.length),BB(i.c[h-1],8)),c,(l1(h+1,i.c.length),BB(i.c[h+1],8)),(l1(h+2,i.c.length),BB(i.c[h+2],8))),isFinite(l.a)&&isFinite(l.b)?r5(e,l,e.c.b,e.c):r5(e,c,e.c.b,e.c);for(DH(e,BB(xq(i,i.c.length-1),8)),WB(a,(l1(0,u.c.length),BB(u.c[0],8))),f=1;f<u.c.length-2;f+=2)l1(f,u.c.length),c=BB(u.c[f],8),l=qPn((l1(f-1,u.c.length),BB(u.c[f-1],8)),c,(l1(f+1,u.c.length),BB(u.c[f+1],8)),(l1(f+2,u.c.length),BB(u.c[f+2],8))),isFinite(l.a)&&isFinite(l.b)?a.c[a.c.length]=l:a.c[a.c.length]=c;for(WB(a,BB(xq(u,u.c.length-1),8)),o=a.c.length-1;o>=0;o--)DH(e,(l1(o,a.c.length),BB(a.c[o],8)));return e}function WXn(n){var t,e,i,r,c,a,u,o,s,h,f,l,b;if(a=!0,f=null,i=null,r=null,t=!1,b=kAt,s=null,c=null,(o=Vgn(n,u=0,AAt,$At))<n.length&&(b1(o,n.length),58==n.charCodeAt(o))&&(f=n.substr(u,o-u),u=o+1),e=null!=f&&xT(jAt,f.toLowerCase())){if(-1==(o=n.lastIndexOf("!/")))throw Hp(new _y("no archive separator"));a=!0,i=fx(n,u,++o),u=o}else u>=0&&mK(n.substr(u,2),"//")?(o=Vgn(n,u+=2,LAt,NAt),i=n.substr(u,o-u),u=o):null==f||u!=n.length&&(b1(u,n.length),47==n.charCodeAt(u))||(a=!1,-1==(o=yN(n,YTn(35),u))&&(o=n.length),i=n.substr(u,o-u),u=o);if(!e&&u<n.length&&(b1(u,n.length),47==n.charCodeAt(u))&&(o=Vgn(n,u+1,LAt,NAt),(h=n.substr(u+1,o-(u+1))).length>0&&58==fV(h,h.length-1)&&(r=h,u=o)),u<n.length&&(b1(u,n.length),47==n.charCodeAt(u))&&(++u,t=!0),u<n.length&&(b1(u,n.length),63!=n.charCodeAt(u))&&(b1(u,n.length),35!=n.charCodeAt(u))){for(l=new Np;u<n.length&&(b1(u,n.length),63!=n.charCodeAt(u))&&(b1(u,n.length),35!=n.charCodeAt(u));)o=Vgn(n,u,LAt,NAt),WB(l,n.substr(u,o-u)),(u=o)<n.length&&(b1(u,n.length),47==n.charCodeAt(u))&&(Qhn(n,++u)||(l.c[l.c.length]=""));Qgn(l,b=x8(Qtt,sVn,2,l.c.length,6,1))}return u<n.length&&(b1(u,n.length),63==n.charCodeAt(u))&&(-1==(o=lx(n,35,++u))&&(o=n.length),s=n.substr(u,o-u),u=o),u<n.length&&(c=nO(n,++u)),wGn(a,f,i,r,b,s),new rRn(a,f,i,r,t,b,s,c)}function VXn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M,S,P,C,I,O,A,$;for(O=new Np,w=new Wb(t.b);w.a<w.c.c.length;)for(k=new Wb(BB(n0(w),29).a);k.a<k.c.c.length;){for((y=BB(n0(k),10)).p=-1,l=_Vn,T=_Vn,S=new Wb(y.j);S.a<S.c.c.length;){for(c=new Wb((M=BB(n0(S),11)).e);c.a<c.c.c.length;)i=BB(n0(c),17),P=BB(mMn(i,(HXn(),bpt)),19).a,l=e.Math.max(l,P);for(r=new Wb(M.g);r.a<r.c.c.length;)i=BB(n0(r),17),P=BB(mMn(i,(HXn(),bpt)),19).a,T=e.Math.max(T,P)}hon(y,Xmt,iln(l)),hon(y,Wmt,iln(T))}for(p=0,b=new Wb(t.b);b.a<b.c.c.length;)for(k=new Wb(BB(n0(b),29).a);k.a<k.c.c.length;)(y=BB(n0(k),10)).p<0&&((I=new rm).b=p++,jRn(n,y,I),O.c[O.c.length]=I);for(E=sx(O.c.length),f=sx(O.c.length),u=0;u<O.c.length;u++)WB(E,new Np),WB(f,iln(0));for(vzn(t,O,E,f),A=BB(Qgn(O,x8(Ymt,O3n,257,O.c.length,0,1)),840),j=BB(Qgn(E,x8(Rnt,nZn,15,E.c.length,0,1)),192),h=x8(ANt,hQn,25,f.c.length,15,1),o=0;o<h.length;o++)h[o]=(l1(o,f.c.length),BB(f.c[o],19)).a;for(v=0,m=new Np,s=0;s<A.length;s++)0==h[s]&&WB(m,A[s]);for(g=x8(ANt,hQn,25,A.length,15,1);0!=m.c.length;)for(g[(I=BB(s6(m,0),257)).b]=v++;!j[I.b].dc();)--h[($=BB(j[I.b].$c(0),257)).b],0==h[$.b]&&(m.c[m.c.length]=$);for(n.a=x8(Ymt,O3n,257,A.length,0,1),a=0;a<A.length;a++)for(d=A[a],C=g[a],n.a[C]=d,d.b=C,k=new Wb(d.e);k.a<k.c.c.length;)(y=BB(n0(k),10)).p=C;return n.a}function QXn(n){var t,e,i;if(n.d>=n.j)return n.a=-1,void(n.c=1);if(t=fV(n.i,n.d++),n.a=t,1!=n.b){switch(t){case 124:i=2;break;case 42:i=3;break;case 43:i=4;break;case 63:i=5;break;case 41:i=7;break;case 46:i=8;break;case 91:i=9;break;case 94:i=11;break;case 36:i=12;break;case 40:if(i=6,n.d>=n.j)break;if(63!=fV(n.i,n.d))break;if(++n.d>=n.j)throw Hp(new ak(kWn((u$(),p8n))));switch(t=fV(n.i,n.d++)){case 58:i=13;break;case 61:i=14;break;case 33:i=15;break;case 91:i=19;break;case 62:i=18;break;case 60:if(n.d>=n.j)throw Hp(new ak(kWn((u$(),p8n))));if(61==(t=fV(n.i,n.d++)))i=16;else{if(33!=t)throw Hp(new ak(kWn((u$(),v8n))));i=17}break;case 35:for(;n.d<n.j&&41!=(t=fV(n.i,n.d++)););if(41!=t)throw Hp(new ak(kWn((u$(),m8n))));i=21;break;default:if(45==t||97<=t&&t<=122||65<=t&&t<=90){--n.d,i=22;break}if(40==t){i=23;break}throw Hp(new ak(kWn((u$(),p8n))))}break;case 92:if(i=10,n.d>=n.j)throw Hp(new ak(kWn((u$(),g8n))));n.a=fV(n.i,n.d++);break;default:i=0}n.c=i}else{switch(t){case 92:if(i=10,n.d>=n.j)throw Hp(new ak(kWn((u$(),g8n))));n.a=fV(n.i,n.d++);break;case 45:512==(512&n.e)&&n.d<n.j&&91==fV(n.i,n.d)?(++n.d,i=24):i=0;break;case 91:if(512!=(512&n.e)&&n.d<n.j&&58==fV(n.i,n.d)){++n.d,i=20;break}default:(64512&t)==HQn&&n.d<n.j&&56320==(64512&(e=fV(n.i,n.d)))&&(n.a=BQn+(t-HQn<<10)+e-56320,++n.d),i=0}n.c=i}}function YXn(n){var t,e,i,r,c,a,u,o,s,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M,S,P;if((j=BB(mMn(n,(HXn(),ept)),98))!=(QEn(),QCt)&&j!=YCt){for(s=new J6((lin((b=(w=n.b).c.length)+2,NVn),ttn(rbn(rbn(5,b+2),(b+2)/10|0)))),d=new J6((lin(b+2,NVn),ttn(rbn(rbn(5,b+2),(b+2)/10|0)))),WB(s,new xp),WB(s,new xp),WB(d,new Np),WB(d,new Np),k=new Np,t=0;t<b;t++)for(l1(t,w.c.length),e=BB(w.c[t],29),l1(t,s.c.length),E=BB(s.c[t],83),g=new xp,s.c[s.c.length]=g,l1(t,d.c.length),M=BB(d.c[t],15),v=new Np,d.c[d.c.length]=v,r=new Wb(e.a);r.a<r.c.c.length;)if(cln(i=BB(n0(r),10)))k.c[k.c.length]=i;else{for(o=new oz(ZL(fbn(i).a.Kc(),new h));dAn(o);)cln(S=(a=BB(U5(o),17)).c.i)&&((T=BB(E.xc(mMn(S,(hWn(),dlt))),10))||(T=oIn(n,S),E.zc(mMn(S,dlt),T),M.Fc(T)),SZ(a,BB(xq(T.j,1),11)));for(u=new oz(ZL(lbn(i).a.Kc(),new h));dAn(u);)cln(P=(a=BB(U5(u),17)).d.i)&&((p=BB(RX(g,mMn(P,(hWn(),dlt))),10))||(p=oIn(n,P),VW(g,mMn(P,dlt),p),v.c[v.c.length]=p),MZ(a,BB(xq(p.j,0),11)))}for(f=0;f<d.c.length;f++)if(l1(f,d.c.length),!(m=BB(d.c[f],15)).dc())for(l=null,0==f?(l=new HX(n),LZ(0,w.c.length),MS(w.c,0,l)):f==s.c.length-1?(l=new HX(n),w.c[w.c.length]=l):(l1(f-1,w.c.length),l=BB(w.c[f-1],29)),c=m.Kc();c.Ob();)PZ(BB(c.Pb(),10),l);for(y=new Wb(k);y.a<y.c.c.length;)PZ(BB(n0(y),10),null);hon(n,(hWn(),Wft),k)}}function JXn(n,t,e){var i,r,c,a,u,o,s,f,l,b,w,d,g,p,v,m,y,k,j;if(OTn(e,"Coffman-Graham Layering",1),0!=t.a.c.length){for(j=BB(mMn(t,(HXn(),mgt)),19).a,o=0,a=0,b=new Wb(t.a);b.a<b.c.c.length;)for((l=BB(n0(b),10)).p=o++,c=new oz(ZL(lbn(l).a.Kc(),new h));dAn(c);)(r=BB(U5(c),17)).p=a++;for(n.d=x8($Nt,ZYn,25,o,16,1),n.a=x8($Nt,ZYn,25,a,16,1),n.b=x8(ANt,hQn,25,o,15,1),n.e=x8(ANt,hQn,25,o,15,1),n.f=x8(ANt,hQn,25,o,15,1),win(n.c),rEn(n,t),d=new Xz(new Dd(n)),k=new Wb(t.a);k.a<k.c.c.length;){for(c=new oz(ZL(fbn(m=BB(n0(k),10)).a.Kc(),new h));dAn(c);)r=BB(U5(c),17),n.a[r.p]||++n.b[m.p];0==n.b[m.p]&&F8(eMn(d,m))}for(u=0;0!=d.b.c.length;)for(m=BB(mnn(d),10),n.f[m.p]=u++,c=new oz(ZL(lbn(m).a.Kc(),new h));dAn(c);)r=BB(U5(c),17),n.a[r.p]||(p=r.d.i,--n.b[p.p],JIn(n.c,p,iln(n.f[m.p])),0==n.b[p.p]&&F8(eMn(d,p)));for(w=new Xz(new Rd(n)),y=new Wb(t.a);y.a<y.c.c.length;){for(c=new oz(ZL(lbn(m=BB(n0(y),10)).a.Kc(),new h));dAn(c);)r=BB(U5(c),17),n.a[r.p]||++n.e[m.p];0==n.e[m.p]&&F8(eMn(w,m))}for(i=r1(t,f=new Np);0!=w.b.c.length;)for(v=BB(mnn(w),10),(i.a.c.length>=j||!Ndn(v,i))&&(i=r1(t,f)),PZ(v,i),c=new oz(ZL(fbn(v).a.Kc(),new h));dAn(c);)r=BB(U5(c),17),n.a[r.p]||(g=r.c.i,--n.e[g.p],0==n.e[g.p]&&F8(eMn(w,g)));for(s=f.c.length-1;s>=0;--s)WB(t.b,(l1(s,f.c.length),BB(f.c[s],29)));t.a.c=x8(Ant,HWn,1,0,5,1),HSn(e)}else HSn(e)}function ZXn(n){var t,e,i,r,c,a,u,o;for(n.b=1,QXn(n),t=null,0==n.c&&94==n.a?(QXn(n),wWn(),wWn(),Yxn(t=new M0(4),0,unt),a=new M0(4)):(wWn(),wWn(),a=new M0(4)),r=!0;1!=(o=n.c);){if(0==o&&93==n.a&&!r){t&&(WGn(t,a),a=t);break}if(e=n.a,i=!1,10==o)switch(e){case 100:case 68:case 119:case 87:case 115:case 83:sHn(a,d_n(e)),i=!0;break;case 105:case 73:case 99:case 67:sHn(a,d_n(e)),(e=-1)<0&&(i=!0);break;case 112:case 80:if(!(u=DIn(n,e)))throw Hp(new ak(kWn((u$(),O8n))));sHn(a,u),i=!0;break;default:e=qDn(n)}else if(24==o&&!r){if(t&&(WGn(t,a),a=t),WGn(a,ZXn(n)),0!=n.c||93!=n.a)throw Hp(new ak(kWn((u$(),N8n))));break}if(QXn(n),!i){if(0==o){if(91==e)throw Hp(new ak(kWn((u$(),x8n))));if(93==e)throw Hp(new ak(kWn((u$(),D8n))));if(45==e&&!r&&93!=n.a)throw Hp(new ak(kWn((u$(),R8n))))}if(0!=n.c||45!=n.a||45==e&&r)Yxn(a,e,e);else{if(QXn(n),1==(o=n.c))throw Hp(new ak(kWn((u$(),$8n))));if(0==o&&93==n.a)Yxn(a,e,e),Yxn(a,45,45);else{if(0==o&&93==n.a||24==o)throw Hp(new ak(kWn((u$(),R8n))));if(c=n.a,0==o){if(91==c)throw Hp(new ak(kWn((u$(),x8n))));if(93==c)throw Hp(new ak(kWn((u$(),D8n))));if(45==c)throw Hp(new ak(kWn((u$(),R8n))))}else 10==o&&(c=qDn(n));if(QXn(n),e>c)throw Hp(new ak(kWn((u$(),F8n))));Yxn(a,e,c)}}}r=!1}if(1==n.c)throw Hp(new ak(kWn((u$(),$8n))));return T$n(a),qHn(a),n.b=0,QXn(n),a}function nWn(n){V$n(n.c,_9n,Pun(Gk(Qtt,1),sVn,2,6,[J9n,"http://www.w3.org/2001/XMLSchema#decimal"])),V$n(n.d,_9n,Pun(Gk(Qtt,1),sVn,2,6,[J9n,"http://www.w3.org/2001/XMLSchema#integer"])),V$n(n.e,_9n,Pun(Gk(Qtt,1),sVn,2,6,[J9n,"http://www.w3.org/2001/XMLSchema#boolean"])),V$n(n.f,_9n,Pun(Gk(Qtt,1),sVn,2,6,[J9n,"EBoolean",t8n,"EBoolean:Object"])),V$n(n.i,_9n,Pun(Gk(Qtt,1),sVn,2,6,[J9n,"http://www.w3.org/2001/XMLSchema#byte"])),V$n(n.g,_9n,Pun(Gk(Qtt,1),sVn,2,6,[J9n,"http://www.w3.org/2001/XMLSchema#hexBinary"])),V$n(n.j,_9n,Pun(Gk(Qtt,1),sVn,2,6,[J9n,"EByte",t8n,"EByte:Object"])),V$n(n.n,_9n,Pun(Gk(Qtt,1),sVn,2,6,[J9n,"EChar",t8n,"EChar:Object"])),V$n(n.t,_9n,Pun(Gk(Qtt,1),sVn,2,6,[J9n,"http://www.w3.org/2001/XMLSchema#double"])),V$n(n.u,_9n,Pun(Gk(Qtt,1),sVn,2,6,[J9n,"EDouble",t8n,"EDouble:Object"])),V$n(n.F,_9n,Pun(Gk(Qtt,1),sVn,2,6,[J9n,"http://www.w3.org/2001/XMLSchema#float"])),V$n(n.G,_9n,Pun(Gk(Qtt,1),sVn,2,6,[J9n,"EFloat",t8n,"EFloat:Object"])),V$n(n.I,_9n,Pun(Gk(Qtt,1),sVn,2,6,[J9n,"http://www.w3.org/2001/XMLSchema#int"])),V$n(n.J,_9n,Pun(Gk(Qtt,1),sVn,2,6,[J9n,"EInt",t8n,"EInt:Object"])),V$n(n.N,_9n,Pun(Gk(Qtt,1),sVn,2,6,[J9n,"http://www.w3.org/2001/XMLSchema#long"])),V$n(n.O,_9n,Pun(Gk(Qtt,1),sVn,2,6,[J9n,"ELong",t8n,"ELong:Object"])),V$n(n.Z,_9n,Pun(Gk(Qtt,1),sVn,2,6,[J9n,"http://www.w3.org/2001/XMLSchema#short"])),V$n(n.$,_9n,Pun(Gk(Qtt,1),sVn,2,6,[J9n,"EShort",t8n,"EShort:Object"])),V$n(n._,_9n,Pun(Gk(Qtt,1),sVn,2,6,[J9n,"http://www.w3.org/2001/XMLSchema#string"]))}function tWn(n){var t,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M,S,P,C;if(1==n.c.length)return l1(0,n.c.length),BB(n.c[0],135);if(n.c.length<=0)return new P6;for(s=new Wb(n);s.a<s.c.c.length;){for(u=BB(n0(s),135),m=0,d=DWn,g=DWn,b=_Vn,w=_Vn,v=spn(u.b,0);v.b!=v.d.c;)p=BB(b3(v),86),m+=BB(mMn(p,(CAn(),$kt)),19).a,d=e.Math.min(d,p.e.a),g=e.Math.min(g,p.e.b),b=e.Math.max(b,p.e.a+p.f.a),w=e.Math.max(w,p.e.b+p.f.b);hon(u,(CAn(),$kt),iln(m)),hon(u,(qqn(),nkt),new xC(d,g)),hon(u,Zyt,new xC(b,w))}for(SQ(),m$(n,new ga),qan(k=new P6,(l1(0,n.c.length),BB(n.c[0],94))),l=0,S=0,h=new Wb(n);h.a<h.c.c.length;)u=BB(n0(h),135),j=XR(B$(BB(mMn(u,(qqn(),Zyt)),8)),BB(mMn(u,nkt),8)),l=e.Math.max(l,j.a),S+=j.a*j.b;for(l=e.Math.max(l,e.Math.sqrt(S)*Gy(MD(mMn(k,(CAn(),jkt))))),P=0,C=0,f=0,t=E=Gy(MD(mMn(k,xkt))),o=new Wb(n);o.a<o.c.c.length;)u=BB(n0(o),135),P+(j=XR(B$(BB(mMn(u,(qqn(),Zyt)),8)),BB(mMn(u,nkt),8))).a>l&&(P=0,C+=f+E,f=0),ELn(k,u,P,C),t=e.Math.max(t,P+j.a),f=e.Math.max(f,j.b),P+=j.a+E;for(y=new xp,i=new xp,M=new Wb(n);M.a<M.c.c.length;)for(r=qy(TD(mMn(T=BB(n0(M),135),(sWn(),lSt)))),a=(T.q?T.q:het).vc().Kc();a.Ob();)hU(y,(c=BB(a.Pb(),42)).cd())?GI(BB(c.cd(),146).wg())!==GI(c.dd())&&(r&&hU(i,c.cd())?($T(),BB(c.cd(),146).tg()):(VW(y,BB(c.cd(),146),c.dd()),hon(k,BB(c.cd(),146),c.dd()),r&&VW(i,BB(c.cd(),146),c.dd()))):(VW(y,BB(c.cd(),146),c.dd()),hon(k,BB(c.cd(),146),c.dd()));return k}function eWn(){eWn=O,RXn(),JIn(put=new pJ,(kUn(),dIt),wIt),JIn(put,MIt,wIt),JIn(put,gIt,wIt),JIn(put,jIt,wIt),JIn(put,kIt,wIt),JIn(put,mIt,wIt),JIn(put,jIt,dIt),JIn(put,wIt,hIt),JIn(put,dIt,hIt),JIn(put,MIt,hIt),JIn(put,gIt,hIt),JIn(put,yIt,hIt),JIn(put,jIt,hIt),JIn(put,kIt,hIt),JIn(put,mIt,hIt),JIn(put,bIt,hIt),JIn(put,wIt,EIt),JIn(put,dIt,EIt),JIn(put,hIt,EIt),JIn(put,MIt,EIt),JIn(put,gIt,EIt),JIn(put,yIt,EIt),JIn(put,jIt,EIt),JIn(put,bIt,EIt),JIn(put,TIt,EIt),JIn(put,kIt,EIt),JIn(put,pIt,EIt),JIn(put,mIt,EIt),JIn(put,dIt,MIt),JIn(put,gIt,MIt),JIn(put,jIt,MIt),JIn(put,mIt,MIt),JIn(put,dIt,gIt),JIn(put,MIt,gIt),JIn(put,jIt,gIt),JIn(put,gIt,gIt),JIn(put,kIt,gIt),JIn(put,wIt,fIt),JIn(put,dIt,fIt),JIn(put,hIt,fIt),JIn(put,EIt,fIt),JIn(put,MIt,fIt),JIn(put,gIt,fIt),JIn(put,yIt,fIt),JIn(put,jIt,fIt),JIn(put,TIt,fIt),JIn(put,bIt,fIt),JIn(put,mIt,fIt),JIn(put,kIt,fIt),JIn(put,vIt,fIt),JIn(put,wIt,TIt),JIn(put,dIt,TIt),JIn(put,hIt,TIt),JIn(put,MIt,TIt),JIn(put,gIt,TIt),JIn(put,yIt,TIt),JIn(put,jIt,TIt),JIn(put,bIt,TIt),JIn(put,mIt,TIt),JIn(put,pIt,TIt),JIn(put,vIt,TIt),JIn(put,dIt,bIt),JIn(put,MIt,bIt),JIn(put,gIt,bIt),JIn(put,jIt,bIt),JIn(put,TIt,bIt),JIn(put,mIt,bIt),JIn(put,kIt,bIt),JIn(put,wIt,lIt),JIn(put,dIt,lIt),JIn(put,hIt,lIt),JIn(put,MIt,lIt),JIn(put,gIt,lIt),JIn(put,yIt,lIt),JIn(put,jIt,lIt),JIn(put,bIt,lIt),JIn(put,mIt,lIt),JIn(put,dIt,kIt),JIn(put,hIt,kIt),JIn(put,EIt,kIt),JIn(put,gIt,kIt),JIn(put,wIt,pIt),JIn(put,dIt,pIt),JIn(put,EIt,pIt),JIn(put,MIt,pIt),JIn(put,gIt,pIt),JIn(put,yIt,pIt),JIn(put,jIt,pIt),JIn(put,jIt,vIt),JIn(put,gIt,vIt),JIn(put,bIt,wIt),JIn(put,bIt,MIt),JIn(put,bIt,hIt),JIn(put,yIt,wIt),JIn(put,yIt,dIt),JIn(put,yIt,EIt)}function iWn(n,t){switch(n.e){case 0:case 2:case 4:case 6:case 42:case 44:case 46:case 48:case 8:case 10:case 12:case 14:case 16:case 18:case 20:case 22:case 24:case 26:case 28:case 30:case 32:case 34:case 36:case 38:return new zQ(n.b,n.a,t,n.c);case 1:return new LL(n.a,t,Awn(t.Tg(),n.c));case 43:return new xL(n.a,t,Awn(t.Tg(),n.c));case 3:return new $L(n.a,t,Awn(t.Tg(),n.c));case 45:return new NL(n.a,t,Awn(t.Tg(),n.c));case 41:return new y9(BB(Ikn(n.c),26),n.a,t,Awn(t.Tg(),n.c));case 50:return new yin(BB(Ikn(n.c),26),n.a,t,Awn(t.Tg(),n.c));case 5:return new iK(n.a,t,Awn(t.Tg(),n.c),n.d.n);case 47:return new rK(n.a,t,Awn(t.Tg(),n.c),n.d.n);case 7:return new eU(n.a,t,Awn(t.Tg(),n.c),n.d.n);case 49:return new eK(n.a,t,Awn(t.Tg(),n.c),n.d.n);case 9:return new FL(n.a,t,Awn(t.Tg(),n.c));case 11:return new _L(n.a,t,Awn(t.Tg(),n.c));case 13:return new KL(n.a,t,Awn(t.Tg(),n.c));case 15:return new MH(n.a,t,Awn(t.Tg(),n.c));case 17:return new BL(n.a,t,Awn(t.Tg(),n.c));case 19:return new RL(n.a,t,Awn(t.Tg(),n.c));case 21:return new DL(n.a,t,Awn(t.Tg(),n.c));case 23:return new yH(n.a,t,Awn(t.Tg(),n.c));case 25:return new fK(n.a,t,Awn(t.Tg(),n.c),n.d.n);case 27:return new hK(n.a,t,Awn(t.Tg(),n.c),n.d.n);case 29:return new oK(n.a,t,Awn(t.Tg(),n.c),n.d.n);case 31:return new cK(n.a,t,Awn(t.Tg(),n.c),n.d.n);case 33:return new sK(n.a,t,Awn(t.Tg(),n.c),n.d.n);case 35:return new uK(n.a,t,Awn(t.Tg(),n.c),n.d.n);case 37:return new aK(n.a,t,Awn(t.Tg(),n.c),n.d.n);case 39:return new iU(n.a,t,Awn(t.Tg(),n.c),n.d.n);case 40:return new Ecn(t,Awn(t.Tg(),n.c));default:throw Hp(new dy("Unknown feature style: "+n.e))}}function rWn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k;switch(OTn(e,"Brandes & Koepf node placement",1),n.a=t,n.c=FFn(t),i=BB(mMn(t,(HXn(),Ngt)),274),b=qy(TD(mMn(t,xgt))),n.d=i==(Bjn(),Qht)&&!b||i==Xht,Jqn(n,t),y=null,k=null,g=null,p=null,lin(4,AVn),d=new J6(4),BB(mMn(t,Ngt),274).g){case 3:g=new qKn(t,n.c.d,(oZ(),ryt),(gJ(),nyt)),d.c[d.c.length]=g;break;case 1:p=new qKn(t,n.c.d,(oZ(),cyt),(gJ(),nyt)),d.c[d.c.length]=p;break;case 4:y=new qKn(t,n.c.d,(oZ(),ryt),(gJ(),tyt)),d.c[d.c.length]=y;break;case 2:k=new qKn(t,n.c.d,(oZ(),cyt),(gJ(),tyt)),d.c[d.c.length]=k;break;default:g=new qKn(t,n.c.d,(oZ(),ryt),(gJ(),nyt)),p=new qKn(t,n.c.d,cyt,nyt),y=new qKn(t,n.c.d,ryt,tyt),k=new qKn(t,n.c.d,cyt,tyt),d.c[d.c.length]=y,d.c[d.c.length]=k,d.c[d.c.length]=g,d.c[d.c.length]=p}for(r=new iC(t,n.c),u=new Wb(d);u.a<u.c.c.length;)PXn(r,c=BB(n0(u),180),n.b),WBn(c);for(l=new Jyn(t,n.c),o=new Wb(d);o.a<o.c.c.length;)Hzn(l,c=BB(n0(o),180));if(e.n)for(s=new Wb(d);s.a<s.c.c.length;)OH(e,(c=BB(n0(s),180))+" size is "+v$n(c));if(f=null,n.d&&IBn(t,h=FUn(n,d,n.c.d),e)&&(f=h),!f)for(s=new Wb(d);s.a<s.c.c.length;)IBn(t,c=BB(n0(s),180),e)&&(!f||v$n(f)>v$n(c))&&(f=c);for(!f&&(l1(0,d.c.length),f=BB(d.c[0],180)),w=new Wb(t.b);w.a<w.c.c.length;)for(m=new Wb(BB(n0(w),29).a);m.a<m.c.c.length;)(v=BB(n0(m),10)).n.b=Gy(f.p[v.p])+Gy(f.d[v.p]);for(e.n&&(OH(e,"Chosen node placement: "+f),OH(e,"Blocks: "+xOn(f)),OH(e,"Classes: "+UAn(f,e)),OH(e,"Marked edges: "+n.b)),a=new Wb(d);a.a<a.c.c.length;)(c=BB(n0(a),180)).g=null,c.b=null,c.a=null,c.d=null,c.j=null,c.i=null,c.p=null;zrn(n.c),n.b.a.$b(),HSn(e)}function cWn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T;for(a=new YT,v=BB(mMn(e,(HXn(),Udt)),103),w=0,Frn(a,(!t.a&&(t.a=new eU(UOt,t,10,11)),t.a));0!=a.b;)s=BB(0==a.b?null:(Px(0!=a.b),Atn(a,a.a.a)),33),(GI(ZAn(t,Ldt))!==GI((mon(),Nvt))||GI(ZAn(t,Gdt))===GI((Vvn(),Eht))||GI(ZAn(t,Gdt))===GI((Vvn(),kht))||qy(TD(ZAn(t,xdt)))||GI(ZAn(t,Cdt))!==GI((Bfn(),wut)))&&!qy(TD(ZAn(s,$dt)))&&Ypn(s,(hWn(),wlt),iln(w++)),!qy(TD(ZAn(s,Ggt)))&&(f=0!=(!s.a&&(s.a=new eU(UOt,s,10,11)),s.a).i,b=kTn(s),l=GI(ZAn(s,sgt))===GI((ufn(),pCt)),g=null,(T=!P8(s,(sWn(),eSt))||mK(SD(ZAn(s,eSt)),w1n))&&l&&(f||b)&&(hon(g=kFn(s),Udt,v),Lx(g,gpt)&&My(new uwn(Gy(MD(mMn(g,gpt)))),g),0!=BB(ZAn(s,Fgt),174).gc()&&(h=g,JT(new Rq(null,(!s.c&&(s.c=new eU(XOt,s,9,9)),new w1(s.c,16))),new Xw(h)),mDn(s,g))),m=e,(y=BB(RX(n.a,JJ(s)),10))&&(m=y.e),d=wzn(n,s,m),g&&(d.e=g,g.e=d,Frn(a,(!s.a&&(s.a=new eU(UOt,s,10,11)),s.a))));for(w=0,r5(a,t,a.c.b,a.c);0!=a.b;){for(o=new AL((!(c=BB(0==a.b?null:(Px(0!=a.b),Atn(a,a.a.a)),33)).b&&(c.b=new eU(_Ot,c,12,3)),c.b));o.e!=o.i.gc();)tKn(u=BB(kpn(o),79)),(GI(ZAn(t,Ldt))!==GI((mon(),Nvt))||GI(ZAn(t,Gdt))===GI((Vvn(),Eht))||GI(ZAn(t,Gdt))===GI((Vvn(),kht))||qy(TD(ZAn(t,xdt)))||GI(ZAn(t,Cdt))!==GI((Bfn(),wut)))&&Ypn(u,(hWn(),wlt),iln(w++)),j=PTn(BB(Wtn((!u.b&&(u.b=new hK(KOt,u,4,7)),u.b),0),82)),E=PTn(BB(Wtn((!u.c&&(u.c=new hK(KOt,u,5,8)),u.c),0),82)),qy(TD(ZAn(u,Ggt)))||qy(TD(ZAn(j,Ggt)))||qy(TD(ZAn(E,Ggt)))||(p=c,QIn(u)&&qy(TD(ZAn(j,wgt)))&&qy(TD(ZAn(u,dgt)))||Ctn(E,j)?p=j:Ctn(j,E)&&(p=E),m=e,(y=BB(RX(n.a,p),10))&&(m=y.e),hon(uWn(n,u,p,m),(hWn(),Fft),Lxn(n,u,t,e)));if(l=GI(ZAn(c,sgt))===GI((ufn(),pCt)))for(r=new AL((!c.a&&(c.a=new eU(UOt,c,10,11)),c.a));r.e!=r.i.gc();)T=!P8(i=BB(kpn(r),33),(sWn(),eSt))||mK(SD(ZAn(i,eSt)),w1n),k=GI(ZAn(i,sgt))===GI(pCt),T&&k&&r5(a,i,a.c.b,a.c)}}function aWn(n,t,e,i,r,c){var a,u,o,s,h,f,l;switch(t){case 71:a=i.q.getFullYear()-sQn>=-1900?1:0,oO(n,e>=4?Pun(Gk(Qtt,1),sVn,2,6,[fQn,lQn])[a]:Pun(Gk(Qtt,1),sVn,2,6,["BC","AD"])[a]);break;case 121:opn(n,e,i);break;case 77:XKn(n,e,i);break;case 107:Enn(n,0==(u=r.q.getHours())?24:u,e);break;case 83:RLn(n,e,r);break;case 69:o=i.q.getDay(),oO(n,5==e?Pun(Gk(Qtt,1),sVn,2,6,["S","M","T","W","T","F","S"])[o]:4==e?Pun(Gk(Qtt,1),sVn,2,6,[bQn,wQn,dQn,gQn,pQn,vQn,mQn])[o]:Pun(Gk(Qtt,1),sVn,2,6,["Sun","Mon","Tue","Wed","Thu","Fri","Sat"])[o]);break;case 97:r.q.getHours()>=12&&r.q.getHours()<24?oO(n,Pun(Gk(Qtt,1),sVn,2,6,["AM","PM"])[1]):oO(n,Pun(Gk(Qtt,1),sVn,2,6,["AM","PM"])[0]);break;case 104:Enn(n,0==(s=r.q.getHours()%12)?12:s,e);break;case 75:Enn(n,r.q.getHours()%12,e);break;case 72:Enn(n,r.q.getHours(),e);break;case 99:h=i.q.getDay(),5==e?oO(n,Pun(Gk(Qtt,1),sVn,2,6,["S","M","T","W","T","F","S"])[h]):4==e?oO(n,Pun(Gk(Qtt,1),sVn,2,6,[bQn,wQn,dQn,gQn,pQn,vQn,mQn])[h]):3==e?oO(n,Pun(Gk(Qtt,1),sVn,2,6,["Sun","Mon","Tue","Wed","Thu","Fri","Sat"])[h]):Enn(n,h,1);break;case 76:f=i.q.getMonth(),5==e?oO(n,Pun(Gk(Qtt,1),sVn,2,6,["J","F","M","A","M","J","J","A","S","O","N","D"])[f]):4==e?oO(n,Pun(Gk(Qtt,1),sVn,2,6,[YVn,JVn,ZVn,nQn,tQn,eQn,iQn,rQn,cQn,aQn,uQn,oQn])[f]):3==e?oO(n,Pun(Gk(Qtt,1),sVn,2,6,["Jan","Feb","Mar","Apr",tQn,"Jun","Jul","Aug","Sep","Oct","Nov","Dec"])[f]):Enn(n,f+1,e);break;case 81:l=i.q.getMonth()/3|0,oO(n,e<4?Pun(Gk(Qtt,1),sVn,2,6,["Q1","Q2","Q3","Q4"])[l]:Pun(Gk(Qtt,1),sVn,2,6,["1st quarter","2nd quarter","3rd quarter","4th quarter"])[l]);break;case 100:Enn(n,i.q.getDate(),e);break;case 109:Enn(n,r.q.getMinutes(),e);break;case 115:Enn(n,r.q.getSeconds(),e);break;case 122:oO(n,e<4?c.c[0]:c.c[1]);break;case 118:oO(n,c.b);break;case 90:oO(n,e<3?nIn(c):3==e?wIn(c):dIn(c.a));break;default:return!1}return!0}function uWn(n,t,e,i){var r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M,S,P,C;if(tKn(t),o=BB(Wtn((!t.b&&(t.b=new hK(KOt,t,4,7)),t.b),0),82),h=BB(Wtn((!t.c&&(t.c=new hK(KOt,t,5,8)),t.c),0),82),u=PTn(o),s=PTn(h),a=0==(!t.a&&(t.a=new eU(FOt,t,6,6)),t.a).i?null:BB(Wtn((!t.a&&(t.a=new eU(FOt,t,6,6)),t.a),0),202),j=BB(RX(n.a,u),10),S=BB(RX(n.a,s),10),E=null,P=null,cL(o,186)&&(cL(k=BB(RX(n.a,o),299),11)?E=BB(k,11):cL(k,10)&&(j=BB(k,10),E=BB(xq(j.j,0),11))),cL(h,186)&&(cL(M=BB(RX(n.a,h),299),11)?P=BB(M,11):cL(M,10)&&(S=BB(M,10),P=BB(xq(S.j,0),11))),!j||!S)throw Hp(new ck("The source or the target of edge "+t+" could not be found. This usually happens when an edge connects a node laid out by ELK Layered to a node in another level of hierarchy laid out by either another instance of ELK Layered or another layout algorithm alltogether. The former can be solved by setting the hierarchyHandling option to INCLUDE_CHILDREN."));for(qan(d=new wY,t),hon(d,(hWn(),dlt),t),hon(d,(HXn(),vgt),null),b=BB(mMn(i,Zft),21),j==S&&b.Fc((bDn(),vft)),E||(ain(),y=qvt,T=null,a&&vA(BB(mMn(j,ept),98))&&(Y3(T=new xC(a.j,a.k),XJ(t)),t5(T,e),Ctn(s,u)&&(y=Hvt,UR(T,j.n))),E=dHn(j,T,y,i)),P||(ain(),y=Hvt,C=null,a&&vA(BB(mMn(S,ept),98))&&(Y3(C=new xC(a.b,a.c),XJ(t)),t5(C,e)),P=dHn(S,C,y,vW(S))),SZ(d,E),MZ(d,P),(E.e.c.length>1||E.g.c.length>1||P.e.c.length>1||P.g.c.length>1)&&b.Fc((bDn(),bft)),l=new AL((!t.n&&(t.n=new eU(zOt,t,1,7)),t.n));l.e!=l.i.gc();)if(!qy(TD(ZAn(f=BB(kpn(l),137),Ggt)))&&f.a)switch(g=Hhn(f),WB(d.b,g),BB(mMn(g,Ydt),272).g){case 1:case 2:b.Fc((bDn(),fft));break;case 0:b.Fc((bDn(),sft)),hon(g,Ydt,(Rtn(),zPt))}if(c=BB(mMn(i,qdt),314),p=BB(mMn(i,_gt),315),r=c==(Oin(),sht)||p==(Nvn(),pvt),a&&0!=(!a.a&&(a.a=new $L(xOt,a,5)),a.a).i&&r){for(v=qSn(a),w=new km,m=spn(v,0);m.b!=m.d.c;)DH(w,new wA(BB(b3(m),8)));hon(d,glt,w)}return d}function oWn(n){n.gb||(n.gb=!0,n.b=kan(n,0),Rrn(n.b,18),Krn(n.b,19),n.a=kan(n,1),Rrn(n.a,1),Krn(n.a,2),Krn(n.a,3),Krn(n.a,4),Krn(n.a,5),n.o=kan(n,2),Rrn(n.o,8),Rrn(n.o,9),Krn(n.o,10),Krn(n.o,11),Krn(n.o,12),Krn(n.o,13),Krn(n.o,14),Krn(n.o,15),Krn(n.o,16),Krn(n.o,17),Krn(n.o,18),Krn(n.o,19),Krn(n.o,20),Krn(n.o,21),Krn(n.o,22),Krn(n.o,23),otn(n.o),otn(n.o),otn(n.o),otn(n.o),otn(n.o),otn(n.o),otn(n.o),otn(n.o),otn(n.o),otn(n.o),n.p=kan(n,3),Rrn(n.p,2),Rrn(n.p,3),Rrn(n.p,4),Rrn(n.p,5),Krn(n.p,6),Krn(n.p,7),otn(n.p),otn(n.p),n.q=kan(n,4),Rrn(n.q,8),n.v=kan(n,5),Krn(n.v,9),otn(n.v),otn(n.v),otn(n.v),n.w=kan(n,6),Rrn(n.w,2),Rrn(n.w,3),Rrn(n.w,4),Krn(n.w,5),n.B=kan(n,7),Krn(n.B,1),otn(n.B),otn(n.B),otn(n.B),n.Q=kan(n,8),Krn(n.Q,0),otn(n.Q),n.R=kan(n,9),Rrn(n.R,1),n.S=kan(n,10),otn(n.S),otn(n.S),otn(n.S),otn(n.S),otn(n.S),otn(n.S),otn(n.S),otn(n.S),otn(n.S),otn(n.S),otn(n.S),otn(n.S),otn(n.S),otn(n.S),otn(n.S),n.T=kan(n,11),Krn(n.T,10),Krn(n.T,11),Krn(n.T,12),Krn(n.T,13),Krn(n.T,14),otn(n.T),otn(n.T),n.U=kan(n,12),Rrn(n.U,2),Rrn(n.U,3),Krn(n.U,4),Krn(n.U,5),Krn(n.U,6),Krn(n.U,7),otn(n.U),n.V=kan(n,13),Krn(n.V,10),n.W=kan(n,14),Rrn(n.W,18),Rrn(n.W,19),Rrn(n.W,20),Krn(n.W,21),Krn(n.W,22),Krn(n.W,23),n.bb=kan(n,15),Rrn(n.bb,10),Rrn(n.bb,11),Rrn(n.bb,12),Rrn(n.bb,13),Rrn(n.bb,14),Rrn(n.bb,15),Rrn(n.bb,16),Krn(n.bb,17),otn(n.bb),otn(n.bb),n.eb=kan(n,16),Rrn(n.eb,2),Rrn(n.eb,3),Rrn(n.eb,4),Rrn(n.eb,5),Rrn(n.eb,6),Rrn(n.eb,7),Krn(n.eb,8),Krn(n.eb,9),n.ab=kan(n,17),Rrn(n.ab,0),Rrn(n.ab,1),n.H=kan(n,18),Krn(n.H,0),Krn(n.H,1),Krn(n.H,2),Krn(n.H,3),Krn(n.H,4),Krn(n.H,5),otn(n.H),n.db=kan(n,19),Krn(n.db,2),n.c=jan(n,20),n.d=jan(n,21),n.e=jan(n,22),n.f=jan(n,23),n.i=jan(n,24),n.g=jan(n,25),n.j=jan(n,26),n.k=jan(n,27),n.n=jan(n,28),n.r=jan(n,29),n.s=jan(n,30),n.t=jan(n,31),n.u=jan(n,32),n.fb=jan(n,33),n.A=jan(n,34),n.C=jan(n,35),n.D=jan(n,36),n.F=jan(n,37),n.G=jan(n,38),n.I=jan(n,39),n.J=jan(n,40),n.L=jan(n,41),n.M=jan(n,42),n.N=jan(n,43),n.O=jan(n,44),n.P=jan(n,45),n.X=jan(n,46),n.Y=jan(n,47),n.Z=jan(n,48),n.$=jan(n,49),n._=jan(n,50),n.cb=jan(n,51),n.K=jan(n,52))}function sWn(){var n,t;sWn=O,eSt=new up(w5n),mPt=new up(d5n),wvn(),iSt=new $O(W2n,rSt=CMt),new $p,cSt=new $O(VJn,null),aSt=new up(g5n),wEn(),fSt=EG(ZMt,Pun(Gk(qPt,1),$Vn,291,0,[VMt])),hSt=new $O(u3n,fSt),lSt=new $O(X2n,(hN(),!1)),Ffn(),bSt=new $O(J2n,wSt=BPt),Mbn(),vSt=new $O(y2n,mSt=ZPt),jSt=new $O(A4n,!1),ufn(),ESt=new $O(d2n,TSt=vCt),WSt=new WA(12),XSt=new $O(QJn,WSt),CSt=new $O(jZn,!1),ISt=new $O(m3n,!1),USt=new $O(MZn,!1),QEn(),uPt=new $O(EZn,oPt=YCt),gPt=new up(g3n),pPt=new up(pZn),vPt=new up(yZn),kPt=new up(kZn),ASt=new km,OSt=new $O(o3n,ASt),sSt=new $O(f3n,!1),MSt=new $O(l3n,!1),new up(p5n),LSt=new lm,$St=new $O(p3n,LSt),zSt=new $O(z2n,!1),new $p,yPt=new $O(v5n,1),new $O(m5n,!0),iln(0),new $O(y5n,iln(100)),new $O(k5n,!1),iln(0),new $O(j5n,iln(4e3)),iln(0),new $O(E5n,iln(400)),new $O(T5n,!1),new $O(M5n,!1),new $O(S5n,!0),new $O(P5n,!1),Fwn(),uSt=new $O(b5n,oSt=eOt),jPt=new $O(L2n,10),EPt=new $O(N2n,10),TPt=new $O(XJn,20),MPt=new $O(x2n,10),SPt=new $O(mZn,2),PPt=new $O(D2n,10),IPt=new $O(R2n,0),OPt=new $O(F2n,5),APt=new $O(K2n,1),$Pt=new $O(_2n,1),LPt=new $O(vZn,20),NPt=new $O(B2n,10),RPt=new $O(H2n,10),CPt=new up(q2n),DPt=new lA,xPt=new $O(v3n,DPt),YSt=new up(d3n),VSt=new $O(w3n,QSt=!1),xSt=new WA(5),NSt=new $O(Z2n,xSt),n$n(),t=BB(Vj(GCt),9),RSt=new YK(t,BB(SR(t,t.length),9),0),DSt=new $O(CZn,RSt),cpn(),ZSt=new $O(e3n,nPt=BCt),ePt=new up(i3n),iPt=new up(r3n),rPt=new up(c3n),tPt=new up(a3n),n=BB(Vj(YIt),9),_St=new YK(n,BB(SR(n,n.length),9),0),KSt=new $O(PZn,_St),GSt=nbn((n_n(),GIt)),qSt=new $O(SZn,GSt),HSt=new xC(0,0),BSt=new $O(BZn,HSt),FSt=new $O(Y2n,!1),Rtn(),gSt=new $O(s3n,pSt=zPt),dSt=new $O(TZn,!1),new up(C5n),iln(1),new $O(I5n,null),cPt=new up(b3n),sPt=new up(h3n),kUn(),wPt=new $O(U2n,dPt=PIt),aPt=new up(G2n),lIn(),lPt=nbn(rIt),fPt=new $O(IZn,lPt),hPt=new $O(n3n,!1),bPt=new $O(t3n,!0),SSt=new $O(V2n,!1),PSt=new $O(Q2n,!1),ySt=new $O(WJn,1),nMn(),new $O(O5n,kSt=aCt),JSt=!0}function hWn(){var n,t;hWn=O,dlt=new up(OZn),Fft=new up("coordinateOrigin"),Mlt=new up("processors"),_ft=new iR("compoundNode",(hN(),!1)),elt=new iR("insideConnections",!1),glt=new up("originalBendpoints"),plt=new up("originalDummyNodePosition"),vlt=new up("originalLabelEdge"),Plt=new up("representedLabels"),zft=new up("endLabels"),Uft=new up("endLabel.origin"),ult=new iR("labelSide",(Xyn(),MCt)),blt=new iR("maxEdgeThickness",0),Clt=new iR("reversed",!1),Slt=new up(AZn),hlt=new iR("longEdgeSource",null),flt=new iR("longEdgeTarget",null),slt=new iR("longEdgeHasLabelDummies",!1),olt=new iR("longEdgeBeforeLabelDummy",!1),Gft=new iR("edgeConstraint",(Jun(),Aht)),rlt=new up("inLayerLayoutUnit"),ilt=new iR("inLayerConstraint",(z7(),Pft)),clt=new iR("inLayerSuccessorConstraint",new Np),alt=new iR("inLayerSuccessorConstraintBetweenNonDummies",!1),Elt=new up("portDummy"),Bft=new iR("crossingHint",iln(0)),Zft=new iR("graphProperties",new YK(t=BB(Vj(Tft),9),BB(SR(t,t.length),9),0)),Qft=new iR("externalPortSide",(kUn(),PIt)),Yft=new iR("externalPortSize",new Gj),Wft=new up("externalPortReplacedDummies"),Vft=new up("externalPortReplacedDummy"),Xft=new iR("externalPortConnections",new YK(n=BB(Vj(FIt),9),BB(SR(n,n.length),9),0)),Tlt=new iR(dJn,0),xft=new up("barycenterAssociates"),Klt=new up("TopSideComments"),Dft=new up("BottomSideComments"),Kft=new up("CommentConnectionPort"),tlt=new iR("inputCollect",!1),klt=new iR("outputCollect",!1),qft=new iR("cyclic",!1),Hft=new up("crossHierarchyMap"),Rlt=new up("targetOffset"),new iR("splineLabelSize",new Gj),Alt=new up("spacings"),jlt=new iR("partitionConstraint",!1),Rft=new up("breakingPoint.info"),xlt=new up("splines.survivingEdge"),Nlt=new up("splines.route.start"),$lt=new up("splines.edgeChain"),ylt=new up("originalPortConstraints"),Olt=new up("selfLoopHolder"),Llt=new up("splines.nsPortY"),wlt=new up("modelOrder"),llt=new up("longEdgeTargetNode"),Jft=new iR(z1n,!1),Ilt=new iR(z1n,!1),nlt=new up("layerConstraints.hiddenNodes"),mlt=new up("layerConstraints.opposidePort"),Dlt=new up("targetNode.modelOrder")}function fWn(){fWn=O,_nn(),Sbt=new $O(U1n,Pbt=Sht),Gbt=new $O(X1n,(hN(),!1)),z2(),Vbt=new $O(W1n,Qbt=Aft),wwt=new $O(V1n,!1),dwt=new $O(Q1n,!0),Ult=new $O(Y1n,!1),U7(),Nwt=new $O(J1n,xwt=Kvt),iln(1),qwt=new $O(Z1n,iln(7)),Gwt=new $O(n0n,!1),zbt=new $O(t0n,!1),Vvn(),Tbt=new $O(e0n,Mbt=yht),TTn(),lwt=new $O(i0n,bwt=tvt),Tbn(),ewt=new $O(r0n,iwt=qlt),iln(-1),twt=new $O(c0n,iln(-1)),iln(-1),rwt=new $O(a0n,iln(-1)),iln(-1),cwt=new $O(u0n,iln(4)),iln(-1),uwt=new $O(o0n,iln(2)),sNn(),hwt=new $O(s0n,fwt=Ivt),iln(0),swt=new $O(h0n,iln(0)),Zbt=new $O(f0n,iln(DWn)),Oin(),jbt=new $O(l0n,Ebt=hht),ubt=new $O(b0n,!1),gbt=new $O(w0n,.1),ybt=new $O(d0n,!1),iln(-1),vbt=new $O(g0n,iln(-1)),iln(-1),mbt=new $O(p0n,iln(-1)),iln(0),obt=new $O(v0n,iln(40)),Kan(),bbt=new $O(m0n,wbt=Eft),sbt=new $O(y0n,hbt=kft),Nvn(),$wt=new $O(k0n,Lwt=gvt),jwt=new up(j0n),g7(),gwt=new $O(E0n,pwt=qht),Bjn(),mwt=new $O(T0n,ywt=Qht),new $p,Mwt=new $O(M0n,.3),Pwt=new up(S0n),bvn(),Cwt=new $O(P0n,Iwt=lvt),Hcn(),Nbt=new $O(C0n,xbt=Wvt),A6(),Dbt=new $O(I0n,Rbt=Zvt),Usn(),Kbt=new $O(O0n,_bt=rmt),Bbt=new $O(A0n,.2),$bt=new $O($0n,2),_wt=new $O(L0n,null),Bwt=new $O(N0n,10),Fwt=new $O(x0n,10),Hwt=new $O(D0n,20),iln(0),Dwt=new $O(R0n,iln(0)),iln(0),Rwt=new $O(K0n,iln(0)),iln(0),Kwt=new $O(_0n,iln(0)),Xlt=new $O(F0n,!1),JMn(),Qlt=new $O(B0n,Ylt=cft),V8(),Wlt=new $O(H0n,Vlt=aht),Xbt=new $O(q0n,!1),iln(0),Ubt=new $O(G0n,iln(16)),iln(0),Wbt=new $O(z0n,iln(5)),$un(),ldt=new $O(U0n,bdt=bmt),zwt=new $O(X0n,10),Wwt=new $O(W0n,1),uin(),edt=new $O(V0n,idt=ght),Ywt=new up(Q0n),ndt=iln(1),iln(0),Zwt=new $O(Y0n,ndt),dcn(),pdt=new $O(J0n,vdt=umt),wdt=new up(Z0n),odt=new $O(n2n,!0),adt=new $O(t2n,2),hdt=new $O(e2n,!0),gSn(),Obt=new $O(i2n,Abt=_ht),$Pn(),Cbt=new $O(r2n,Ibt=Zst),mon(),cbt=new $O(c2n,abt=Nvt),rbt=new $O(a2n,!1),Bfn(),Jlt=new $O(u2n,Zlt=wut),Mhn(),ebt=new $O(o2n,ibt=cvt),nbt=new $O(s2n,0),tbt=new $O(h2n,0),Jbt=jht,Ybt=sht,awt=nvt,owt=nvt,nwt=Ypt,ufn(),pbt=pCt,kbt=hht,dbt=hht,fbt=hht,lbt=pCt,Ewt=mvt,Twt=gvt,vwt=gvt,kwt=gvt,Swt=vvt,Awt=mvt,Owt=mvt,Mbn(),Fbt=JPt,Hbt=JPt,qbt=rmt,Lbt=YPt,Uwt=wmt,Xwt=lmt,Vwt=wmt,Qwt=lmt,rdt=wmt,cdt=lmt,Jwt=dht,tdt=ght,mdt=wmt,ydt=lmt,ddt=wmt,gdt=lmt,sdt=lmt,udt=lmt,fdt=lmt}function lWn(){lWn=O,rot=new nP("DIRECTION_PREPROCESSOR",0),tot=new nP("COMMENT_PREPROCESSOR",1),cot=new nP("EDGE_AND_LAYER_CONSTRAINT_EDGE_REVERSER",2),kot=new nP("INTERACTIVE_EXTERNAL_PORT_POSITIONER",3),Fot=new nP("PARTITION_PREPROCESSOR",4),Mot=new nP("LABEL_DUMMY_INSERTER",5),Uot=new nP("SELF_LOOP_PREPROCESSOR",6),Oot=new nP("LAYER_CONSTRAINT_PREPROCESSOR",7),Kot=new nP("PARTITION_MIDPROCESSOR",8),got=new nP("HIGH_DEGREE_NODE_LAYER_PROCESSOR",9),Not=new nP("NODE_PROMOTION",10),Iot=new nP("LAYER_CONSTRAINT_POSTPROCESSOR",11),_ot=new nP("PARTITION_POSTPROCESSOR",12),lot=new nP("HIERARCHICAL_PORT_CONSTRAINT_PROCESSOR",13),Wot=new nP("SEMI_INTERACTIVE_CROSSMIN_PROCESSOR",14),Vut=new nP("BREAKING_POINT_INSERTER",15),Lot=new nP("LONG_EDGE_SPLITTER",16),Hot=new nP("PORT_SIDE_PROCESSOR",17),jot=new nP("INVERTED_PORT_PROCESSOR",18),Bot=new nP("PORT_LIST_SORTER",19),Qot=new nP("SORT_BY_INPUT_ORDER_OF_MODEL",20),Dot=new nP("NORTH_SOUTH_PORT_PREPROCESSOR",21),Qut=new nP("BREAKING_POINT_PROCESSOR",22),Rot=new nP(E1n,23),Yot=new nP(T1n,24),Got=new nP("SELF_LOOP_PORT_RESTORER",25),Vot=new nP("SINGLE_EDGE_GRAPH_WRAPPER",26),Eot=new nP("IN_LAYER_CONSTRAINT_PROCESSOR",27),sot=new nP("END_NODE_PORT_LABEL_MANAGEMENT_PROCESSOR",28),Tot=new nP("LABEL_AND_NODE_SIZE_PROCESSOR",29),yot=new nP("INNERMOST_NODE_MARGIN_CALCULATOR",30),Xot=new nP("SELF_LOOP_ROUTER",31),Zut=new nP("COMMENT_NODE_MARGIN_CALCULATOR",32),uot=new nP("END_LABEL_PREPROCESSOR",33),Pot=new nP("LABEL_DUMMY_SWITCHER",34),Jut=new nP("CENTER_LABEL_MANAGEMENT_PROCESSOR",35),Cot=new nP("LABEL_SIDE_SELECTOR",36),vot=new nP("HYPEREDGE_DUMMY_MERGER",37),bot=new nP("HIERARCHICAL_PORT_DUMMY_SIZE_PROCESSOR",38),Aot=new nP("LAYER_SIZE_AND_GRAPH_HEIGHT_CALCULATOR",39),dot=new nP("HIERARCHICAL_PORT_POSITION_PROCESSOR",40),eot=new nP("CONSTRAINTS_POSTPROCESSOR",41),not=new nP("COMMENT_POSTPROCESSOR",42),mot=new nP("HYPERNODE_PROCESSOR",43),wot=new nP("HIERARCHICAL_PORT_ORTHOGONAL_EDGE_ROUTER",44),$ot=new nP("LONG_EDGE_JOINER",45),zot=new nP("SELF_LOOP_POSTPROCESSOR",46),Yut=new nP("BREAKING_POINT_REMOVER",47),xot=new nP("NORTH_SOUTH_PORT_POSTPROCESSOR",48),pot=new nP("HORIZONTAL_COMPACTOR",49),Sot=new nP("LABEL_DUMMY_REMOVER",50),hot=new nP("FINAL_SPLINE_BENDPOINTS_CALCULATOR",51),oot=new nP("END_LABEL_SORTER",52),qot=new nP("REVERSED_EDGE_RESTORER",53),aot=new nP("END_LABEL_POSTPROCESSOR",54),fot=new nP("HIERARCHICAL_NODE_RESIZER",55),iot=new nP("DIRECTION_POSTPROCESSOR",56)}function bWn(n,t,i){var r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M,S,P,C,I,O,A,$,L,N,x,D,R,K,_,F,B,H,q,G,z,U,X,W,V,Q,Y,J,Z,nn,tn,en,rn,cn,an,un,on;for(J=0,L=0,D=(O=t).length;L<D;++L)for(G=new Wb((C=O[L]).j);G.a<G.c.c.length;){for(U=0,o=new Wb((q=BB(n0(G),11)).g);o.a<o.c.c.length;)u=BB(n0(o),17),C.c!=u.d.i.c&&++U;U>0&&(n.a[q.p]=J++)}for(rn=0,N=0,R=(A=i).length;N<R;++N){for(K=0,G=new Wb((C=A[N]).j);G.a<G.c.c.length&&(q=BB(n0(G),11)).j==(kUn(),sIt);)for(o=new Wb(q.e);o.a<o.c.c.length;)if(u=BB(n0(o),17),C.c!=u.c.i.c){++K;break}for(F=0,X=new M2(C.j,C.j.c.length);X.b>0;){for(Px(X.b>0),U=0,o=new Wb((q=BB(X.a.Xb(X.c=--X.b),11)).e);o.a<o.c.c.length;)u=BB(n0(o),17),C.c!=u.c.i.c&&++U;U>0&&(q.j==(kUn(),sIt)?(n.a[q.p]=rn,++rn):(n.a[q.p]=rn+K+F,++F))}rn+=F}for(z=new xp,d=new fA,$=0,x=(I=t).length;$<x;++$)for(tn=new Wb((C=I[$]).j);tn.a<tn.c.c.length;)for(o=new Wb((nn=BB(n0(tn),11)).g);o.a<o.c.c.length;)if(an=(u=BB(n0(o),17)).d,C.c!=an.i.c)if(Z=BB(qI(AY(z.f,nn)),467),cn=BB(qI(AY(z.f,an)),467),Z||cn)if(Z)if(cn)if(Z==cn)WB(Z.a,u);else{for(WB(Z.a,u),H=new Wb(cn.d);H.a<H.c.c.length;)B=BB(n0(H),11),jCn(z.f,B,Z);gun(Z.a,cn.a),gun(Z.d,cn.d),d.a.Bc(cn)}else WB(Z.a,u),WB(Z.d,an),jCn(z.f,an,Z);else WB(cn.a,u),WB(cn.d,nn),jCn(z.f,nn,cn);else w=new DR,d.a.zc(w,d),WB(w.a,u),WB(w.d,nn),jCn(z.f,nn,w),WB(w.d,an),jCn(z.f,an,w);for(g=BB(Emn(d,x8(Fmt,{3:1,4:1,5:1,1946:1},467,d.a.gc(),0,1)),1946),P=t[0].c,Y=i[0].c,l=0,b=(f=g).length;l<b;++l)for((h=f[l]).e=J,h.f=rn,G=new Wb(h.d);G.a<G.c.c.length;)q=BB(n0(G),11),W=n.a[q.p],q.i.c==P?(W<h.e&&(h.e=W),W>h.b&&(h.b=W)):q.i.c==Y&&(W<h.f&&(h.f=W),W>h.c&&(h.c=W));for(z9(g,0,g.length,null),en=x8(ANt,hQn,25,g.length,15,1),r=x8(ANt,hQn,25,rn+1,15,1),v=0;v<g.length;v++)en[v]=g[v].f,r[en[v]]=1;for(a=0,m=0;m<r.length;m++)1==r[m]?r[m]=a:--a;for(V=0,y=0;y<en.length;y++)en[y]+=r[en[y]],V=e.Math.max(V,en[y]+1);for(s=1;s<V;)s*=2;for(on=2*s-1,s-=1,un=x8(ANt,hQn,25,on,15,1),c=0,M=0;M<en.length;M++)for(++un[T=en[M]+s];T>0;)T%2>0&&(c+=un[T+1]),++un[T=(T-1)/2|0];for(S=x8(qmt,HWn,362,2*g.length,0,1),k=0;k<g.length;k++)S[2*k]=new qV(g[k],g[k].e,g[k].b,(Q4(),Hmt)),S[2*k+1]=new qV(g[k],g[k].b,g[k].e,Bmt);for(z9(S,0,S.length,null),_=0,j=0;j<S.length;j++)switch(S[j].d.g){case 0:++_;break;case 1:c+=--_}for(Q=x8(qmt,HWn,362,2*g.length,0,1),E=0;E<g.length;E++)Q[2*E]=new qV(g[E],g[E].f,g[E].c,(Q4(),Hmt)),Q[2*E+1]=new qV(g[E],g[E].c,g[E].f,Bmt);for(z9(Q,0,Q.length,null),_=0,p=0;p<Q.length;p++)switch(Q[p].d.g){case 0:++_;break;case 1:c+=--_}return c}function wWn(){wWn=O,sNt=new Ap(7),hNt=new oG(8,94),new oG(8,64),fNt=new oG(8,36),pNt=new oG(8,65),vNt=new oG(8,122),mNt=new oG(8,90),jNt=new oG(8,98),dNt=new oG(8,66),yNt=new oG(8,60),ENt=new oG(8,62),oNt=new Ap(11),Yxn(uNt=new M0(4),48,57),Yxn(kNt=new M0(4),48,57),Yxn(kNt,65,90),Yxn(kNt,95,95),Yxn(kNt,97,122),Yxn(gNt=new M0(4),9,9),Yxn(gNt,10,10),Yxn(gNt,12,12),Yxn(gNt,13,13),Yxn(gNt,32,32),lNt=$Fn(uNt),wNt=$Fn(kNt),bNt=$Fn(gNt),iNt=new xp,rNt=new xp,cNt=Pun(Gk(Qtt,1),sVn,2,6,["Cn","Lu","Ll","Lt","Lm","Lo","Mn","Me","Mc","Nd","Nl","No","Zs","Zl","Zp","Cc","Cf",null,"Co","Cs","Pd","Ps","Pe","Pc","Po","Sm","Sc","Sk","So","Pi","Pf","L","M","N","Z","C","P","S"]),eNt=Pun(Gk(Qtt,1),sVn,2,6,["Basic Latin","Latin-1 Supplement","Latin Extended-A","Latin Extended-B","IPA Extensions","Spacing Modifier Letters","Combining Diacritical Marks","Greek","Cyrillic","Armenian","Hebrew","Arabic","Syriac","Thaana","Devanagari","Bengali","Gurmukhi","Gujarati","Oriya","Tamil","Telugu","Kannada","Malayalam","Sinhala","Thai","Lao","Tibetan","Myanmar","Georgian","Hangul Jamo","Ethiopic","Cherokee","Unified Canadian Aboriginal Syllabics","Ogham","Runic","Khmer","Mongolian","Latin Extended Additional","Greek Extended","General Punctuation","Superscripts and Subscripts","Currency Symbols","Combining Marks for Symbols","Letterlike Symbols","Number Forms","Arrows","Mathematical Operators","Miscellaneous Technical","Control Pictures","Optical Character Recognition","Enclosed Alphanumerics","Box Drawing","Block Elements","Geometric Shapes","Miscellaneous Symbols","Dingbats","Braille Patterns","CJK Radicals Supplement","Kangxi Radicals","Ideographic Description Characters","CJK Symbols and Punctuation","Hiragana","Katakana","Bopomofo","Hangul Compatibility Jamo","Kanbun","Bopomofo Extended","Enclosed CJK Letters and Months","CJK Compatibility","CJK Unified Ideographs Extension A","CJK Unified Ideographs","Yi Syllables","Yi Radicals","Hangul Syllables",gnt,"CJK Compatibility Ideographs","Alphabetic Presentation Forms","Arabic Presentation Forms-A","Combining Half Marks","CJK Compatibility Forms","Small Form Variants","Arabic Presentation Forms-B","Specials","Halfwidth and Fullwidth Forms","Old Italic","Gothic","Deseret","Byzantine Musical Symbols","Musical Symbols","Mathematical Alphanumeric Symbols","CJK Unified Ideographs Extension B","CJK Compatibility Ideographs Supplement","Tags"]),aNt=Pun(Gk(ANt,1),hQn,25,15,[66304,66351,66352,66383,66560,66639,118784,119039,119040,119295,119808,120831,131072,173782,194560,195103,917504,917631])}function dWn(){dWn=O,Prt=new ocn("OUT_T_L",0,(J9(),Yit),(G7(),irt),(Dtn(),Git),Git,Pun(Gk(Dnt,1),HWn,21,0,[EG((n$n(),LCt),Pun(Gk(GCt,1),$Vn,93,0,[DCt,ICt]))])),Srt=new ocn("OUT_T_C",1,Qit,irt,Git,zit,Pun(Gk(Dnt,1),HWn,21,0,[EG(LCt,Pun(Gk(GCt,1),$Vn,93,0,[DCt,CCt])),EG(LCt,Pun(Gk(GCt,1),$Vn,93,0,[DCt,CCt,OCt]))])),Crt=new ocn("OUT_T_R",2,Jit,irt,Git,Uit,Pun(Gk(Dnt,1),HWn,21,0,[EG(LCt,Pun(Gk(GCt,1),$Vn,93,0,[DCt,ACt]))])),vrt=new ocn("OUT_B_L",3,Yit,crt,Uit,Git,Pun(Gk(Dnt,1),HWn,21,0,[EG(LCt,Pun(Gk(GCt,1),$Vn,93,0,[NCt,ICt]))])),prt=new ocn("OUT_B_C",4,Qit,crt,Uit,zit,Pun(Gk(Dnt,1),HWn,21,0,[EG(LCt,Pun(Gk(GCt,1),$Vn,93,0,[NCt,CCt])),EG(LCt,Pun(Gk(GCt,1),$Vn,93,0,[NCt,CCt,OCt]))])),mrt=new ocn("OUT_B_R",5,Jit,crt,Uit,Uit,Pun(Gk(Dnt,1),HWn,21,0,[EG(LCt,Pun(Gk(GCt,1),$Vn,93,0,[NCt,ACt]))])),jrt=new ocn("OUT_L_T",6,Jit,crt,Git,Git,Pun(Gk(Dnt,1),HWn,21,0,[EG(LCt,Pun(Gk(GCt,1),$Vn,93,0,[ICt,DCt,OCt]))])),krt=new ocn("OUT_L_C",7,Jit,rrt,zit,Git,Pun(Gk(Dnt,1),HWn,21,0,[EG(LCt,Pun(Gk(GCt,1),$Vn,93,0,[ICt,xCt])),EG(LCt,Pun(Gk(GCt,1),$Vn,93,0,[ICt,xCt,OCt]))])),yrt=new ocn("OUT_L_B",8,Jit,irt,Uit,Git,Pun(Gk(Dnt,1),HWn,21,0,[EG(LCt,Pun(Gk(GCt,1),$Vn,93,0,[ICt,NCt,OCt]))])),Mrt=new ocn("OUT_R_T",9,Yit,crt,Git,Uit,Pun(Gk(Dnt,1),HWn,21,0,[EG(LCt,Pun(Gk(GCt,1),$Vn,93,0,[ACt,DCt,OCt]))])),Trt=new ocn("OUT_R_C",10,Yit,rrt,zit,Uit,Pun(Gk(Dnt,1),HWn,21,0,[EG(LCt,Pun(Gk(GCt,1),$Vn,93,0,[ACt,xCt])),EG(LCt,Pun(Gk(GCt,1),$Vn,93,0,[ACt,xCt,OCt]))])),Ert=new ocn("OUT_R_B",11,Yit,irt,Uit,Uit,Pun(Gk(Dnt,1),HWn,21,0,[EG(LCt,Pun(Gk(GCt,1),$Vn,93,0,[ACt,NCt,OCt]))])),drt=new ocn("IN_T_L",12,Yit,crt,Git,Git,Pun(Gk(Dnt,1),HWn,21,0,[EG($Ct,Pun(Gk(GCt,1),$Vn,93,0,[DCt,ICt])),EG($Ct,Pun(Gk(GCt,1),$Vn,93,0,[DCt,ICt,OCt]))])),wrt=new ocn("IN_T_C",13,Qit,crt,Git,zit,Pun(Gk(Dnt,1),HWn,21,0,[EG($Ct,Pun(Gk(GCt,1),$Vn,93,0,[DCt,CCt])),EG($Ct,Pun(Gk(GCt,1),$Vn,93,0,[DCt,CCt,OCt]))])),grt=new ocn("IN_T_R",14,Jit,crt,Git,Uit,Pun(Gk(Dnt,1),HWn,21,0,[EG($Ct,Pun(Gk(GCt,1),$Vn,93,0,[DCt,ACt])),EG($Ct,Pun(Gk(GCt,1),$Vn,93,0,[DCt,ACt,OCt]))])),lrt=new ocn("IN_C_L",15,Yit,rrt,zit,Git,Pun(Gk(Dnt,1),HWn,21,0,[EG($Ct,Pun(Gk(GCt,1),$Vn,93,0,[xCt,ICt])),EG($Ct,Pun(Gk(GCt,1),$Vn,93,0,[xCt,ICt,OCt]))])),frt=new ocn("IN_C_C",16,Qit,rrt,zit,zit,Pun(Gk(Dnt,1),HWn,21,0,[EG($Ct,Pun(Gk(GCt,1),$Vn,93,0,[xCt,CCt])),EG($Ct,Pun(Gk(GCt,1),$Vn,93,0,[xCt,CCt,OCt]))])),brt=new ocn("IN_C_R",17,Jit,rrt,zit,Uit,Pun(Gk(Dnt,1),HWn,21,0,[EG($Ct,Pun(Gk(GCt,1),$Vn,93,0,[xCt,ACt])),EG($Ct,Pun(Gk(GCt,1),$Vn,93,0,[xCt,ACt,OCt]))])),srt=new ocn("IN_B_L",18,Yit,irt,Uit,Git,Pun(Gk(Dnt,1),HWn,21,0,[EG($Ct,Pun(Gk(GCt,1),$Vn,93,0,[NCt,ICt])),EG($Ct,Pun(Gk(GCt,1),$Vn,93,0,[NCt,ICt,OCt]))])),ort=new ocn("IN_B_C",19,Qit,irt,Uit,zit,Pun(Gk(Dnt,1),HWn,21,0,[EG($Ct,Pun(Gk(GCt,1),$Vn,93,0,[NCt,CCt])),EG($Ct,Pun(Gk(GCt,1),$Vn,93,0,[NCt,CCt,OCt]))])),hrt=new ocn("IN_B_R",20,Jit,irt,Uit,Uit,Pun(Gk(Dnt,1),HWn,21,0,[EG($Ct,Pun(Gk(GCt,1),$Vn,93,0,[NCt,ACt])),EG($Ct,Pun(Gk(GCt,1),$Vn,93,0,[NCt,ACt,OCt]))])),Irt=new ocn(hJn,21,null,null,null,null,Pun(Gk(Dnt,1),HWn,21,0,[]))}function gWn(){gWn=O,i$t=(QX(),t$t).b,BB(Wtn(QQ(t$t.b),0),34),BB(Wtn(QQ(t$t.b),1),18),e$t=t$t.a,BB(Wtn(QQ(t$t.a),0),34),BB(Wtn(QQ(t$t.a),1),18),BB(Wtn(QQ(t$t.a),2),18),BB(Wtn(QQ(t$t.a),3),18),BB(Wtn(QQ(t$t.a),4),18),r$t=t$t.o,BB(Wtn(QQ(t$t.o),0),34),BB(Wtn(QQ(t$t.o),1),34),a$t=BB(Wtn(QQ(t$t.o),2),18),BB(Wtn(QQ(t$t.o),3),18),BB(Wtn(QQ(t$t.o),4),18),BB(Wtn(QQ(t$t.o),5),18),BB(Wtn(QQ(t$t.o),6),18),BB(Wtn(QQ(t$t.o),7),18),BB(Wtn(QQ(t$t.o),8),18),BB(Wtn(QQ(t$t.o),9),18),BB(Wtn(QQ(t$t.o),10),18),BB(Wtn(QQ(t$t.o),11),18),BB(Wtn(QQ(t$t.o),12),18),BB(Wtn(QQ(t$t.o),13),18),BB(Wtn(QQ(t$t.o),14),18),BB(Wtn(QQ(t$t.o),15),18),BB(Wtn(VQ(t$t.o),0),59),BB(Wtn(VQ(t$t.o),1),59),BB(Wtn(VQ(t$t.o),2),59),BB(Wtn(VQ(t$t.o),3),59),BB(Wtn(VQ(t$t.o),4),59),BB(Wtn(VQ(t$t.o),5),59),BB(Wtn(VQ(t$t.o),6),59),BB(Wtn(VQ(t$t.o),7),59),BB(Wtn(VQ(t$t.o),8),59),BB(Wtn(VQ(t$t.o),9),59),c$t=t$t.p,BB(Wtn(QQ(t$t.p),0),34),BB(Wtn(QQ(t$t.p),1),34),BB(Wtn(QQ(t$t.p),2),34),BB(Wtn(QQ(t$t.p),3),34),BB(Wtn(QQ(t$t.p),4),18),BB(Wtn(QQ(t$t.p),5),18),BB(Wtn(VQ(t$t.p),0),59),BB(Wtn(VQ(t$t.p),1),59),u$t=t$t.q,BB(Wtn(QQ(t$t.q),0),34),o$t=t$t.v,BB(Wtn(QQ(t$t.v),0),18),BB(Wtn(VQ(t$t.v),0),59),BB(Wtn(VQ(t$t.v),1),59),BB(Wtn(VQ(t$t.v),2),59),s$t=t$t.w,BB(Wtn(QQ(t$t.w),0),34),BB(Wtn(QQ(t$t.w),1),34),BB(Wtn(QQ(t$t.w),2),34),BB(Wtn(QQ(t$t.w),3),18),h$t=t$t.B,BB(Wtn(QQ(t$t.B),0),18),BB(Wtn(VQ(t$t.B),0),59),BB(Wtn(VQ(t$t.B),1),59),BB(Wtn(VQ(t$t.B),2),59),b$t=t$t.Q,BB(Wtn(QQ(t$t.Q),0),18),BB(Wtn(VQ(t$t.Q),0),59),w$t=t$t.R,BB(Wtn(QQ(t$t.R),0),34),d$t=t$t.S,BB(Wtn(VQ(t$t.S),0),59),BB(Wtn(VQ(t$t.S),1),59),BB(Wtn(VQ(t$t.S),2),59),BB(Wtn(VQ(t$t.S),3),59),BB(Wtn(VQ(t$t.S),4),59),BB(Wtn(VQ(t$t.S),5),59),BB(Wtn(VQ(t$t.S),6),59),BB(Wtn(VQ(t$t.S),7),59),BB(Wtn(VQ(t$t.S),8),59),BB(Wtn(VQ(t$t.S),9),59),BB(Wtn(VQ(t$t.S),10),59),BB(Wtn(VQ(t$t.S),11),59),BB(Wtn(VQ(t$t.S),12),59),BB(Wtn(VQ(t$t.S),13),59),BB(Wtn(VQ(t$t.S),14),59),g$t=t$t.T,BB(Wtn(QQ(t$t.T),0),18),BB(Wtn(QQ(t$t.T),2),18),p$t=BB(Wtn(QQ(t$t.T),3),18),BB(Wtn(QQ(t$t.T),4),18),BB(Wtn(VQ(t$t.T),0),59),BB(Wtn(VQ(t$t.T),1),59),BB(Wtn(QQ(t$t.T),1),18),v$t=t$t.U,BB(Wtn(QQ(t$t.U),0),34),BB(Wtn(QQ(t$t.U),1),34),BB(Wtn(QQ(t$t.U),2),18),BB(Wtn(QQ(t$t.U),3),18),BB(Wtn(QQ(t$t.U),4),18),BB(Wtn(QQ(t$t.U),5),18),BB(Wtn(VQ(t$t.U),0),59),m$t=t$t.V,BB(Wtn(QQ(t$t.V),0),18),y$t=t$t.W,BB(Wtn(QQ(t$t.W),0),34),BB(Wtn(QQ(t$t.W),1),34),BB(Wtn(QQ(t$t.W),2),34),BB(Wtn(QQ(t$t.W),3),18),BB(Wtn(QQ(t$t.W),4),18),BB(Wtn(QQ(t$t.W),5),18),j$t=t$t.bb,BB(Wtn(QQ(t$t.bb),0),34),BB(Wtn(QQ(t$t.bb),1),34),BB(Wtn(QQ(t$t.bb),2),34),BB(Wtn(QQ(t$t.bb),3),34),BB(Wtn(QQ(t$t.bb),4),34),BB(Wtn(QQ(t$t.bb),5),34),BB(Wtn(QQ(t$t.bb),6),34),BB(Wtn(QQ(t$t.bb),7),18),BB(Wtn(VQ(t$t.bb),0),59),BB(Wtn(VQ(t$t.bb),1),59),E$t=t$t.eb,BB(Wtn(QQ(t$t.eb),0),34),BB(Wtn(QQ(t$t.eb),1),34),BB(Wtn(QQ(t$t.eb),2),34),BB(Wtn(QQ(t$t.eb),3),34),BB(Wtn(QQ(t$t.eb),4),34),BB(Wtn(QQ(t$t.eb),5),34),BB(Wtn(QQ(t$t.eb),6),18),BB(Wtn(QQ(t$t.eb),7),18),k$t=t$t.ab,BB(Wtn(QQ(t$t.ab),0),34),BB(Wtn(QQ(t$t.ab),1),34),f$t=t$t.H,BB(Wtn(QQ(t$t.H),0),18),BB(Wtn(QQ(t$t.H),1),18),BB(Wtn(QQ(t$t.H),2),18),BB(Wtn(QQ(t$t.H),3),18),BB(Wtn(QQ(t$t.H),4),18),BB(Wtn(QQ(t$t.H),5),18),BB(Wtn(VQ(t$t.H),0),59),T$t=t$t.db,BB(Wtn(QQ(t$t.db),0),18),l$t=t$t.M}function pWn(n){var t;n.O||(n.O=!0,Nrn(n,"type"),xrn(n,"ecore.xml.type"),Drn(n,S7n),t=BB($$n((WM(),zAt),S7n),1945),f9(kY(n.fb),n.b),z0(n.b,wLt,"AnyType",!1,!1,!0),ucn(BB(Wtn(QQ(n.b),0),34),n.wb.D,K9n,null,0,-1,wLt,!1,!1,!0,!1,!1,!1),ucn(BB(Wtn(QQ(n.b),1),34),n.wb.D,"any",null,0,-1,wLt,!0,!0,!0,!1,!1,!0),ucn(BB(Wtn(QQ(n.b),2),34),n.wb.D,"anyAttribute",null,0,-1,wLt,!1,!1,!0,!1,!1,!1),z0(n.bb,zLt,A7n,!1,!1,!0),ucn(BB(Wtn(QQ(n.bb),0),34),n.gb,"data",null,0,1,zLt,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.bb),1),34),n.gb,Y6n,null,1,1,zLt,!1,!1,!0,!1,!0,!1),z0(n.fb,ULt,$7n,!1,!1,!0),ucn(BB(Wtn(QQ(n.fb),0),34),t.gb,"rawValue",null,0,1,ULt,!0,!0,!0,!1,!0,!0),ucn(BB(Wtn(QQ(n.fb),1),34),t.a,E6n,null,0,1,ULt,!0,!0,!0,!1,!0,!0),Myn(BB(Wtn(QQ(n.fb),2),18),n.wb.q,null,"instanceType",1,1,ULt,!1,!1,!0,!1,!1,!1,!1),z0(n.qb,XLt,L7n,!1,!1,!0),ucn(BB(Wtn(QQ(n.qb),0),34),n.wb.D,K9n,null,0,-1,null,!1,!1,!0,!1,!1,!1),Myn(BB(Wtn(QQ(n.qb),1),18),n.wb.ab,null,"xMLNSPrefixMap",0,-1,null,!0,!1,!0,!0,!1,!1,!1),Myn(BB(Wtn(QQ(n.qb),2),18),n.wb.ab,null,"xSISchemaLocation",0,-1,null,!0,!1,!0,!0,!1,!1,!1),ucn(BB(Wtn(QQ(n.qb),3),34),n.gb,"cDATA",null,0,-2,null,!0,!0,!0,!1,!1,!0),ucn(BB(Wtn(QQ(n.qb),4),34),n.gb,"comment",null,0,-2,null,!0,!0,!0,!1,!1,!0),Myn(BB(Wtn(QQ(n.qb),5),18),n.bb,null,cnt,0,-2,null,!0,!0,!0,!0,!1,!1,!0),ucn(BB(Wtn(QQ(n.qb),6),34),n.gb,O6n,null,0,-2,null,!0,!0,!0,!1,!1,!0),dV(n.a,Ant,"AnySimpleType",!0),dV(n.c,Qtt,"AnyURI",!0),dV(n.d,Gk(NNt,1),"Base64Binary",!0),dV(n.e,$Nt,"Boolean",!0),dV(n.f,ktt,"BooleanObject",!0),dV(n.g,NNt,"Byte",!0),dV(n.i,Ttt,"ByteObject",!0),dV(n.j,Qtt,"Date",!0),dV(n.k,Qtt,"DateTime",!0),dV(n.n,iet,"Decimal",!0),dV(n.o,xNt,"Double",!0),dV(n.p,Ptt,"DoubleObject",!0),dV(n.q,Qtt,"Duration",!0),dV(n.s,Rnt,"ENTITIES",!0),dV(n.r,Rnt,"ENTITIESBase",!0),dV(n.t,Qtt,_7n,!0),dV(n.u,DNt,"Float",!0),dV(n.v,Ctt,"FloatObject",!0),dV(n.w,Qtt,"GDay",!0),dV(n.B,Qtt,"GMonth",!0),dV(n.A,Qtt,"GMonthDay",!0),dV(n.C,Qtt,"GYear",!0),dV(n.D,Qtt,"GYearMonth",!0),dV(n.F,Gk(NNt,1),"HexBinary",!0),dV(n.G,Qtt,"ID",!0),dV(n.H,Qtt,"IDREF",!0),dV(n.J,Rnt,"IDREFS",!0),dV(n.I,Rnt,"IDREFSBase",!0),dV(n.K,ANt,"Int",!0),dV(n.M,oet,"Integer",!0),dV(n.L,Att,"IntObject",!0),dV(n.P,Qtt,"Language",!0),dV(n.Q,LNt,"Long",!0),dV(n.R,Rtt,"LongObject",!0),dV(n.S,Qtt,"Name",!0),dV(n.T,Qtt,F7n,!0),dV(n.U,oet,"NegativeInteger",!0),dV(n.V,Qtt,Q7n,!0),dV(n.X,Rnt,"NMTOKENS",!0),dV(n.W,Rnt,"NMTOKENSBase",!0),dV(n.Y,oet,"NonNegativeInteger",!0),dV(n.Z,oet,"NonPositiveInteger",!0),dV(n.$,Qtt,"NormalizedString",!0),dV(n._,Qtt,"NOTATION",!0),dV(n.ab,Qtt,"PositiveInteger",!0),dV(n.cb,Qtt,"QName",!0),dV(n.db,RNt,"Short",!0),dV(n.eb,_tt,"ShortObject",!0),dV(n.gb,Qtt,qVn,!0),dV(n.hb,Qtt,"Time",!0),dV(n.ib,Qtt,"Token",!0),dV(n.jb,RNt,"UnsignedByte",!0),dV(n.kb,_tt,"UnsignedByteObject",!0),dV(n.lb,LNt,"UnsignedInt",!0),dV(n.mb,Rtt,"UnsignedIntObject",!0),dV(n.nb,oet,"UnsignedLong",!0),dV(n.ob,ANt,"UnsignedShort",!0),dV(n.pb,Att,"UnsignedShortObject",!0),Lhn(n,S7n),yWn(n))}function vWn(n){NM(n,new MTn(mj(dj(vj(wj(pj(gj(new du,w1n),"ELK Layered"),"Layer-based algorithm provided by the Eclipse Layout Kernel. Arranges as many edges as possible into one direction by placing nodes into subsequent layers. This implementation supports different routing styles (straight, orthogonal, splines); if orthogonal routing is selected, arbitrary port constraints are respected, thus enabling the layout of block diagrams such as actor-oriented models or circuit schematics. Furthermore, full layout of compound graphs with cross-hierarchy edges is supported when the respective option is activated on the top level."),new Cc),w1n),EG((hAn(),iAt),Pun(Gk(aAt,1),$Vn,237,0,[nAt,tAt,ZOt,eAt,YOt,QOt]))))),u2(n,w1n,L2n,mpn(ppt)),u2(n,w1n,N2n,mpn(vpt)),u2(n,w1n,XJn,mpn(mpt)),u2(n,w1n,x2n,mpn(ypt)),u2(n,w1n,mZn,mpn(jpt)),u2(n,w1n,D2n,mpn(Ept)),u2(n,w1n,R2n,mpn(Spt)),u2(n,w1n,K2n,mpn(Cpt)),u2(n,w1n,_2n,mpn(Ipt)),u2(n,w1n,F2n,mpn(Ppt)),u2(n,w1n,vZn,mpn(Opt)),u2(n,w1n,B2n,mpn($pt)),u2(n,w1n,H2n,mpn(Npt)),u2(n,w1n,q2n,mpn(Mpt)),u2(n,w1n,L0n,mpn(gpt)),u2(n,w1n,x0n,mpn(kpt)),u2(n,w1n,N0n,mpn(Tpt)),u2(n,w1n,D0n,mpn(Apt)),u2(n,w1n,pZn,iln(0)),u2(n,w1n,R0n,mpn(fpt)),u2(n,w1n,K0n,mpn(lpt)),u2(n,w1n,_0n,mpn(bpt)),u2(n,w1n,U0n,mpn(zpt)),u2(n,w1n,X0n,mpn(Rpt)),u2(n,w1n,W0n,mpn(Kpt)),u2(n,w1n,V0n,mpn(Bpt)),u2(n,w1n,Q0n,mpn(_pt)),u2(n,w1n,Y0n,mpn(Fpt)),u2(n,w1n,J0n,mpn(Xpt)),u2(n,w1n,Z0n,mpn(Upt)),u2(n,w1n,n2n,mpn(qpt)),u2(n,w1n,t2n,mpn(Hpt)),u2(n,w1n,e2n,mpn(Gpt)),u2(n,w1n,S0n,mpn(Rgt)),u2(n,w1n,P0n,mpn(Kgt)),u2(n,w1n,O0n,mpn(rgt)),u2(n,w1n,A0n,mpn(cgt)),u2(n,w1n,QJn,Ugt),u2(n,w1n,y2n,ngt),u2(n,w1n,G2n,0),u2(n,w1n,yZn,iln(1)),u2(n,w1n,VJn,dZn),u2(n,w1n,z2n,mpn(Ggt)),u2(n,w1n,EZn,mpn(ept)),u2(n,w1n,U2n,mpn(upt)),u2(n,w1n,X2n,mpn(zdt)),u2(n,w1n,W2n,mpn(kdt)),u2(n,w1n,d2n,mpn(sgt)),u2(n,w1n,kZn,(hN(),!0)),u2(n,w1n,V2n,mpn(wgt)),u2(n,w1n,Q2n,mpn(dgt)),u2(n,w1n,PZn,mpn(Fgt)),u2(n,w1n,SZn,mpn(qgt)),u2(n,w1n,Y2n,mpn(Bgt)),u2(n,w1n,J2n,Wdt),u2(n,w1n,CZn,mpn($gt)),u2(n,w1n,Z2n,mpn(Agt)),u2(n,w1n,IZn,mpn(cpt)),u2(n,w1n,n3n,mpn(rpt)),u2(n,w1n,t3n,mpn(apt)),u2(n,w1n,e3n,Vgt),u2(n,w1n,i3n,mpn(Ygt)),u2(n,w1n,r3n,mpn(Jgt)),u2(n,w1n,c3n,mpn(Zgt)),u2(n,w1n,a3n,mpn(Qgt)),u2(n,w1n,n0n,mpn(Dpt)),u2(n,w1n,i0n,mpn(Pgt)),u2(n,w1n,s0n,mpn(Sgt)),u2(n,w1n,Z1n,mpn(xpt)),u2(n,w1n,r0n,mpn(kgt)),u2(n,w1n,e0n,mpn(Gdt)),u2(n,w1n,l0n,mpn(qdt)),u2(n,w1n,b0n,mpn(xdt)),u2(n,w1n,v0n,mpn(Ddt)),u2(n,w1n,m0n,mpn(Kdt)),u2(n,w1n,y0n,mpn(Rdt)),u2(n,w1n,d0n,mpn(Hdt)),u2(n,w1n,V1n,mpn(Igt)),u2(n,w1n,Q1n,mpn(Ogt)),u2(n,w1n,W1n,mpn(pgt)),u2(n,w1n,k0n,mpn(_gt)),u2(n,w1n,T0n,mpn(Ngt)),u2(n,w1n,X1n,mpn(ugt)),u2(n,w1n,M0n,mpn(Dgt)),u2(n,w1n,C0n,mpn(egt)),u2(n,w1n,I0n,mpn(igt)),u2(n,w1n,u3n,mpn(Ndt)),u2(n,w1n,E0n,mpn(Lgt)),u2(n,w1n,B0n,mpn(Pdt)),u2(n,w1n,H0n,mpn(Sdt)),u2(n,w1n,F0n,mpn(Mdt)),u2(n,w1n,q0n,mpn(fgt)),u2(n,w1n,G0n,mpn(hgt)),u2(n,w1n,z0n,mpn(lgt)),u2(n,w1n,BZn,mpn(Hgt)),u2(n,w1n,o3n,mpn(vgt)),u2(n,w1n,WJn,mpn(agt)),u2(n,w1n,s3n,mpn(Ydt)),u2(n,w1n,TZn,mpn(Qdt)),u2(n,w1n,w0n,mpn(_dt)),u2(n,w1n,h3n,mpn(ipt)),u2(n,w1n,f3n,mpn(Tdt)),u2(n,w1n,l3n,mpn(bgt)),u2(n,w1n,b3n,mpn(npt)),u2(n,w1n,w3n,mpn(Xgt)),u2(n,w1n,d3n,mpn(Wgt)),u2(n,w1n,u0n,mpn(Egt)),u2(n,w1n,o0n,mpn(Tgt)),u2(n,w1n,g3n,mpn(spt)),u2(n,w1n,Y1n,mpn(jdt)),u2(n,w1n,h0n,mpn(Mgt)),u2(n,w1n,i2n,mpn(Jdt)),u2(n,w1n,r2n,mpn(Vdt)),u2(n,w1n,p3n,mpn(Cgt)),u2(n,w1n,f0n,mpn(mgt)),u2(n,w1n,j0n,mpn(xgt)),u2(n,w1n,v3n,mpn(Lpt)),u2(n,w1n,U1n,mpn(Xdt)),u2(n,w1n,J1n,mpn(opt)),u2(n,w1n,$0n,mpn(tgt)),u2(n,w1n,c0n,mpn(ygt)),u2(n,w1n,g0n,mpn(Fdt)),u2(n,w1n,m3n,mpn(ggt)),u2(n,w1n,a0n,mpn(jgt)),u2(n,w1n,p0n,mpn(Bdt)),u2(n,w1n,c2n,mpn(Ldt)),u2(n,w1n,o2n,mpn(Adt)),u2(n,w1n,s2n,mpn(Idt)),u2(n,w1n,h2n,mpn(Odt)),u2(n,w1n,a2n,mpn($dt)),u2(n,w1n,u2n,mpn(Cdt)),u2(n,w1n,t0n,mpn(ogt))}function mWn(n,t){var e;return nNt||(nNt=new xp,tNt=new xp,wWn(),wWn(),ydn(e=new M0(4),"\t\n\r\r "),mZ(nNt,fnt,e),mZ(tNt,fnt,$Fn(e)),ydn(e=new M0(4),wnt),mZ(nNt,snt,e),mZ(tNt,snt,$Fn(e)),ydn(e=new M0(4),wnt),mZ(nNt,snt,e),mZ(tNt,snt,$Fn(e)),ydn(e=new M0(4),dnt),sHn(e,BB(SJ(nNt,snt),117)),mZ(nNt,hnt,e),mZ(tNt,hnt,$Fn(e)),ydn(e=new M0(4),"-.0:AZ__az\xb7\xb7\xc0\xd6\xd8\xf6\xf8\u0131\u0134\u013e\u0141\u0148\u014a\u017e\u0180\u01c3\u01cd\u01f0\u01f4\u01f5\u01fa\u0217\u0250\u02a8\u02bb\u02c1\u02d0\u02d1\u0300\u0345\u0360\u0361\u0386\u038a\u038c\u038c\u038e\u03a1\u03a3\u03ce\u03d0\u03d6\u03da\u03da\u03dc\u03dc\u03de\u03de\u03e0\u03e0\u03e2\u03f3\u0401\u040c\u040e\u044f\u0451\u045c\u045e\u0481\u0483\u0486\u0490\u04c4\u04c7\u04c8\u04cb\u04cc\u04d0\u04eb\u04ee\u04f5\u04f8\u04f9\u0531\u0556\u0559\u0559\u0561\u0586\u0591\u05a1\u05a3\u05b9\u05bb\u05bd\u05bf\u05bf\u05c1\u05c2\u05c4\u05c4\u05d0\u05ea\u05f0\u05f2\u0621\u063a\u0640\u0652\u0660\u0669\u0670\u06b7\u06ba\u06be\u06c0\u06ce\u06d0\u06d3\u06d5\u06e8\u06ea\u06ed\u06f0\u06f9\u0901\u0903\u0905\u0939\u093c\u094d\u0951\u0954\u0958\u0963\u0966\u096f\u0981\u0983\u0985\u098c\u098f\u0990\u0993\u09a8\u09aa\u09b0\u09b2\u09b2\u09b6\u09b9\u09bc\u09bc\u09be\u09c4\u09c7\u09c8\u09cb\u09cd\u09d7\u09d7\u09dc\u09dd\u09df\u09e3\u09e6\u09f1\u0a02\u0a02\u0a05\u0a0a\u0a0f\u0a10\u0a13\u0a28\u0a2a\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3c\u0a3c\u0a3e\u0a42\u0a47\u0a48\u0a4b\u0a4d\u0a59\u0a5c\u0a5e\u0a5e\u0a66\u0a74\u0a81\u0a83\u0a85\u0a8b\u0a8d\u0a8d\u0a8f\u0a91\u0a93\u0aa8\u0aaa\u0ab0\u0ab2\u0ab3\u0ab5\u0ab9\u0abc\u0ac5\u0ac7\u0ac9\u0acb\u0acd\u0ae0\u0ae0\u0ae6\u0aef\u0b01\u0b03\u0b05\u0b0c\u0b0f\u0b10\u0b13\u0b28\u0b2a\u0b30\u0b32\u0b33\u0b36\u0b39\u0b3c\u0b43\u0b47\u0b48\u0b4b\u0b4d\u0b56\u0b57\u0b5c\u0b5d\u0b5f\u0b61\u0b66\u0b6f\u0b82\u0b83\u0b85\u0b8a\u0b8e\u0b90\u0b92\u0b95\u0b99\u0b9a\u0b9c\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8\u0baa\u0bae\u0bb5\u0bb7\u0bb9\u0bbe\u0bc2\u0bc6\u0bc8\u0bca\u0bcd\u0bd7\u0bd7\u0be7\u0bef\u0c01\u0c03\u0c05\u0c0c\u0c0e\u0c10\u0c12\u0c28\u0c2a\u0c33\u0c35\u0c39\u0c3e\u0c44\u0c46\u0c48\u0c4a\u0c4d\u0c55\u0c56\u0c60\u0c61\u0c66\u0c6f\u0c82\u0c83\u0c85\u0c8c\u0c8e\u0c90\u0c92\u0ca8\u0caa\u0cb3\u0cb5\u0cb9\u0cbe\u0cc4\u0cc6\u0cc8\u0cca\u0ccd\u0cd5\u0cd6\u0cde\u0cde\u0ce0\u0ce1\u0ce6\u0cef\u0d02\u0d03\u0d05\u0d0c\u0d0e\u0d10\u0d12\u0d28\u0d2a\u0d39\u0d3e\u0d43\u0d46\u0d48\u0d4a\u0d4d\u0d57\u0d57\u0d60\u0d61\u0d66\u0d6f\u0e01\u0e2e\u0e30\u0e3a\u0e40\u0e4e\u0e50\u0e59\u0e81\u0e82\u0e84\u0e84\u0e87\u0e88\u0e8a\u0e8a\u0e8d\u0e8d\u0e94\u0e97\u0e99\u0e9f\u0ea1\u0ea3\u0ea5\u0ea5\u0ea7\u0ea7\u0eaa\u0eab\u0ead\u0eae\u0eb0\u0eb9\u0ebb\u0ebd\u0ec0\u0ec4\u0ec6\u0ec6\u0ec8\u0ecd\u0ed0\u0ed9\u0f18\u0f19\u0f20\u0f29\u0f35\u0f35\u0f37\u0f37\u0f39\u0f39\u0f3e\u0f47\u0f49\u0f69\u0f71\u0f84\u0f86\u0f8b\u0f90\u0f95\u0f97\u0f97\u0f99\u0fad\u0fb1\u0fb7\u0fb9\u0fb9\u10a0\u10c5\u10d0\u10f6\u1100\u1100\u1102\u1103\u1105\u1107\u1109\u1109\u110b\u110c\u110e\u1112\u113c\u113c\u113e\u113e\u1140\u1140\u114c\u114c\u114e\u114e\u1150\u1150\u1154\u1155\u1159\u1159\u115f\u1161\u1163\u1163\u1165\u1165\u1167\u1167\u1169\u1169\u116d\u116e\u1172\u1173\u1175\u1175\u119e\u119e\u11a8\u11a8\u11ab\u11ab\u11ae\u11af\u11b7\u11b8\u11ba\u11ba\u11bc\u11c2\u11eb\u11eb\u11f0\u11f0\u11f9\u11f9\u1e00\u1e9b\u1ea0\u1ef9\u1f00\u1f15\u1f18\u1f1d\u1f20\u1f45\u1f48\u1f4d\u1f50\u1f57\u1f59\u1f59\u1f5b\u1f5b\u1f5d\u1f5d\u1f5f\u1f7d\u1f80\u1fb4\u1fb6\u1fbc\u1fbe\u1fbe\u1fc2\u1fc4\u1fc6\u1fcc\u1fd0\u1fd3\u1fd6\u1fdb\u1fe0\u1fec\u1ff2\u1ff4\u1ff6\u1ffc\u20d0\u20dc\u20e1\u20e1\u2126\u2126\u212a\u212b\u212e\u212e\u2180\u2182\u3005\u3005\u3007\u3007\u3021\u302f\u3031\u3035\u3041\u3094\u3099\u309a\u309d\u309e\u30a1\u30fa\u30fc\u30fe\u3105\u312c\u4e00\u9fa5\uac00\ud7a3"),mZ(nNt,lnt,e),mZ(tNt,lnt,$Fn(e)),ydn(e=new M0(4),dnt),Yxn(e,95,95),Yxn(e,58,58),mZ(nNt,bnt,e),mZ(tNt,bnt,$Fn(e))),BB(SJ(t?nNt:tNt,n),136)}function yWn(n){V$n(n.a,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"anySimpleType"])),V$n(n.b,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"anyType",F9n,K9n])),V$n(BB(Wtn(QQ(n.b),0),34),_9n,Pun(Gk(Qtt,1),sVn,2,6,[F9n,m7n,t8n,":mixed"])),V$n(BB(Wtn(QQ(n.b),1),34),_9n,Pun(Gk(Qtt,1),sVn,2,6,[F9n,m7n,M7n,P7n,t8n,":1",D7n,"lax"])),V$n(BB(Wtn(QQ(n.b),2),34),_9n,Pun(Gk(Qtt,1),sVn,2,6,[F9n,p7n,M7n,P7n,t8n,":2",D7n,"lax"])),V$n(n.c,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"anyURI",T7n,y7n])),V$n(n.d,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"base64Binary",T7n,y7n])),V$n(n.e,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,$Wn,T7n,y7n])),V$n(n.f,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"boolean:Object",J9n,$Wn])),V$n(n.g,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,S9n])),V$n(n.i,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"byte:Object",J9n,S9n])),V$n(n.j,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"date",T7n,y7n])),V$n(n.k,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"dateTime",T7n,y7n])),V$n(n.n,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"decimal",T7n,y7n])),V$n(n.o,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,C9n,T7n,y7n])),V$n(n.p,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"double:Object",J9n,C9n])),V$n(n.q,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"duration",T7n,y7n])),V$n(n.s,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"ENTITIES",J9n,R7n,K7n,"1"])),V$n(n.r,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,R7n,k7n,_7n])),V$n(n.t,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,_7n,J9n,F7n])),V$n(n.u,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,I9n,T7n,y7n])),V$n(n.v,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"float:Object",J9n,I9n])),V$n(n.w,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"gDay",T7n,y7n])),V$n(n.B,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"gMonth",T7n,y7n])),V$n(n.A,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"gMonthDay",T7n,y7n])),V$n(n.C,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"gYear",T7n,y7n])),V$n(n.D,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"gYearMonth",T7n,y7n])),V$n(n.F,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"hexBinary",T7n,y7n])),V$n(n.G,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"ID",J9n,F7n])),V$n(n.H,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"IDREF",J9n,F7n])),V$n(n.J,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"IDREFS",J9n,B7n,K7n,"1"])),V$n(n.I,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,B7n,k7n,"IDREF"])),V$n(n.K,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,O9n])),V$n(n.M,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,H7n])),V$n(n.L,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"int:Object",J9n,O9n])),V$n(n.P,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"language",J9n,q7n,G7n,z7n])),V$n(n.Q,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,A9n])),V$n(n.R,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"long:Object",J9n,A9n])),V$n(n.S,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"Name",J9n,q7n,G7n,U7n])),V$n(n.T,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,F7n,J9n,"Name",G7n,X7n])),V$n(n.U,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"negativeInteger",J9n,W7n,V7n,"-1"])),V$n(n.V,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,Q7n,J9n,q7n,G7n,"\\c+"])),V$n(n.X,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"NMTOKENS",J9n,Y7n,K7n,"1"])),V$n(n.W,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,Y7n,k7n,Q7n])),V$n(n.Y,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,J7n,J9n,H7n,Z7n,"0"])),V$n(n.Z,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,W7n,J9n,H7n,V7n,"0"])),V$n(n.$,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,nnt,J9n,NWn,T7n,"replace"])),V$n(n._,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"NOTATION",T7n,y7n])),V$n(n.ab,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"positiveInteger",J9n,J7n,Z7n,"1"])),V$n(n.bb,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"processingInstruction_._type",F9n,"empty"])),V$n(BB(Wtn(QQ(n.bb),0),34),_9n,Pun(Gk(Qtt,1),sVn,2,6,[F9n,g7n,t8n,"data"])),V$n(BB(Wtn(QQ(n.bb),1),34),_9n,Pun(Gk(Qtt,1),sVn,2,6,[F9n,g7n,t8n,Y6n])),V$n(n.cb,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"QName",T7n,y7n])),V$n(n.db,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,$9n])),V$n(n.eb,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"short:Object",J9n,$9n])),V$n(n.fb,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"simpleAnyType",F9n,d7n])),V$n(BB(Wtn(QQ(n.fb),0),34),_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,":3",F9n,d7n])),V$n(BB(Wtn(QQ(n.fb),1),34),_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,":4",F9n,d7n])),V$n(BB(Wtn(QQ(n.fb),2),18),_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,":5",F9n,d7n])),V$n(n.gb,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,NWn,T7n,"preserve"])),V$n(n.hb,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"time",T7n,y7n])),V$n(n.ib,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,q7n,J9n,nnt,T7n,y7n])),V$n(n.jb,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,tnt,V7n,"255",Z7n,"0"])),V$n(n.kb,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"unsignedByte:Object",J9n,tnt])),V$n(n.lb,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,ent,V7n,"4294967295",Z7n,"0"])),V$n(n.mb,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"unsignedInt:Object",J9n,ent])),V$n(n.nb,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"unsignedLong",J9n,J7n,V7n,int,Z7n,"0"])),V$n(n.ob,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,rnt,V7n,"65535",Z7n,"0"])),V$n(n.pb,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"unsignedShort:Object",J9n,rnt])),V$n(n.qb,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"",F9n,K9n])),V$n(BB(Wtn(QQ(n.qb),0),34),_9n,Pun(Gk(Qtt,1),sVn,2,6,[F9n,m7n,t8n,":mixed"])),V$n(BB(Wtn(QQ(n.qb),1),18),_9n,Pun(Gk(Qtt,1),sVn,2,6,[F9n,g7n,t8n,"xmlns:prefix"])),V$n(BB(Wtn(QQ(n.qb),2),18),_9n,Pun(Gk(Qtt,1),sVn,2,6,[F9n,g7n,t8n,"xsi:schemaLocation"])),V$n(BB(Wtn(QQ(n.qb),3),34),_9n,Pun(Gk(Qtt,1),sVn,2,6,[F9n,v7n,t8n,"cDATA",j7n,E7n])),V$n(BB(Wtn(QQ(n.qb),4),34),_9n,Pun(Gk(Qtt,1),sVn,2,6,[F9n,v7n,t8n,"comment",j7n,E7n])),V$n(BB(Wtn(QQ(n.qb),5),18),_9n,Pun(Gk(Qtt,1),sVn,2,6,[F9n,v7n,t8n,cnt,j7n,E7n])),V$n(BB(Wtn(QQ(n.qb),6),34),_9n,Pun(Gk(Qtt,1),sVn,2,6,[F9n,v7n,t8n,O6n,j7n,E7n]))}function kWn(n){return mK("_UI_EMFDiagnostic_marker",n)?"EMF Problem":mK("_UI_CircularContainment_diagnostic",n)?"An object may not circularly contain itself":mK(w8n,n)?"Wrong character.":mK(d8n,n)?"Invalid reference number.":mK(g8n,n)?"A character is required after \\.":mK(p8n,n)?"'?' is not expected. '(?:' or '(?=' or '(?!' or '(?<' or '(?#' or '(?>'?":mK(v8n,n)?"'(?<' or '(?<!' is expected.":mK(m8n,n)?"A comment is not terminated.":mK(y8n,n)?"')' is expected.":mK(k8n,n)?"Unexpected end of the pattern in a modifier group.":mK(j8n,n)?"':' is expected.":mK(E8n,n)?"Unexpected end of the pattern in a conditional group.":mK(T8n,n)?"A back reference or an anchor or a lookahead or a look-behind is expected in a conditional pattern.":mK(M8n,n)?"There are more than three choices in a conditional group.":mK(S8n,n)?"A character in U+0040-U+005f must follow \\c.":mK(P8n,n)?"A '{' is required before a character category.":mK(C8n,n)?"A property name is not closed by '}'.":mK(I8n,n)?"Unexpected meta character.":mK(O8n,n)?"Unknown property.":mK(A8n,n)?"A POSIX character class must be closed by ':]'.":mK($8n,n)?"Unexpected end of the pattern in a character class.":mK(L8n,n)?"Unknown name for a POSIX character class.":mK("parser.cc.4",n)?"'-' is invalid here.":mK(N8n,n)?"']' is expected.":mK(x8n,n)?"'[' is invalid in a character class. Write '\\['.":mK(D8n,n)?"']' is invalid in a character class. Write '\\]'.":mK(R8n,n)?"'-' is an invalid character range. Write '\\-'.":mK(K8n,n)?"'[' is expected.":mK(_8n,n)?"')' or '-[' or '+[' or '&[' is expected.":mK(F8n,n)?"The range end code point is less than the start code point.":mK(B8n,n)?"Invalid Unicode hex notation.":mK(H8n,n)?"Overflow in a hex notation.":mK(q8n,n)?"'\\x{' must be closed by '}'.":mK(G8n,n)?"Invalid Unicode code point.":mK(z8n,n)?"An anchor must not be here.":mK(U8n,n)?"This expression is not supported in the current option setting.":mK(X8n,n)?"Invalid quantifier. A digit is expected.":mK(W8n,n)?"Invalid quantifier. Invalid quantity or a '}' is missing.":mK(V8n,n)?"Invalid quantifier. A digit or '}' is expected.":mK(Q8n,n)?"Invalid quantifier. A min quantity must be <= a max quantity.":mK(Y8n,n)?"Invalid quantifier. A quantity value overflow.":mK("_UI_PackageRegistry_extensionpoint",n)?"Ecore Package Registry for Generated Packages":mK("_UI_DynamicPackageRegistry_extensionpoint",n)?"Ecore Package Registry for Dynamic Packages":mK("_UI_FactoryRegistry_extensionpoint",n)?"Ecore Factory Override Registry":mK("_UI_URIExtensionParserRegistry_extensionpoint",n)?"URI Extension Parser Registry":mK("_UI_URIProtocolParserRegistry_extensionpoint",n)?"URI Protocol Parser Registry":mK("_UI_URIContentParserRegistry_extensionpoint",n)?"URI Content Parser Registry":mK("_UI_ContentHandlerRegistry_extensionpoint",n)?"Content Handler Registry":mK("_UI_URIMappingRegistry_extensionpoint",n)?"URI Converter Mapping Registry":mK("_UI_PackageRegistryImplementation_extensionpoint",n)?"Ecore Package Registry Implementation":mK("_UI_ValidationDelegateRegistry_extensionpoint",n)?"Validation Delegate Registry":mK("_UI_SettingDelegateRegistry_extensionpoint",n)?"Feature Setting Delegate Factory Registry":mK("_UI_InvocationDelegateRegistry_extensionpoint",n)?"Operation Invocation Delegate Factory Registry":mK("_UI_EClassInterfaceNotAbstract_diagnostic",n)?"A class that is an interface must also be abstract":mK("_UI_EClassNoCircularSuperTypes_diagnostic",n)?"A class may not be a super type of itself":mK("_UI_EClassNotWellFormedMapEntryNoInstanceClassName_diagnostic",n)?"A class that inherits from a map entry class must have instance class name 'java.util.Map$Entry'":mK("_UI_EReferenceOppositeOfOppositeInconsistent_diagnostic",n)?"The opposite of the opposite may not be a reference different from this one":mK("_UI_EReferenceOppositeNotFeatureOfType_diagnostic",n)?"The opposite must be a feature of the reference's type":mK("_UI_EReferenceTransientOppositeNotTransient_diagnostic",n)?"The opposite of a transient reference must be transient if it is proxy resolving":mK("_UI_EReferenceOppositeBothContainment_diagnostic",n)?"The opposite of a containment reference must not be a containment reference":mK("_UI_EReferenceConsistentUnique_diagnostic",n)?"A containment or bidirectional reference must be unique if its upper bound is different from 1":mK("_UI_ETypedElementNoType_diagnostic",n)?"The typed element must have a type":mK("_UI_EAttributeNoDataType_diagnostic",n)?"The generic attribute type must not refer to a class":mK("_UI_EReferenceNoClass_diagnostic",n)?"The generic reference type must not refer to a data type":mK("_UI_EGenericTypeNoTypeParameterAndClassifier_diagnostic",n)?"A generic type can't refer to both a type parameter and a classifier":mK("_UI_EGenericTypeNoClass_diagnostic",n)?"A generic super type must refer to a class":mK("_UI_EGenericTypeNoTypeParameterOrClassifier_diagnostic",n)?"A generic type in this context must refer to a classifier or a type parameter":mK("_UI_EGenericTypeBoundsOnlyForTypeArgument_diagnostic",n)?"A generic type may have bounds only when used as a type argument":mK("_UI_EGenericTypeNoUpperAndLowerBound_diagnostic",n)?"A generic type must not have both a lower and an upper bound":mK("_UI_EGenericTypeNoTypeParameterOrClassifierAndBound_diagnostic",n)?"A generic type with bounds must not also refer to a type parameter or classifier":mK("_UI_EGenericTypeNoArguments_diagnostic",n)?"A generic type may have arguments only if it refers to a classifier":mK("_UI_EGenericTypeOutOfScopeTypeParameter_diagnostic",n)?"A generic type may only refer to a type parameter that is in scope":n}function jWn(n){var t,e,i,r,c,a,u;n.r||(n.r=!0,Nrn(n,"graph"),xrn(n,"graph"),Drn(n,y6n),cun(n.o,"T"),f9(kY(n.a),n.p),f9(kY(n.f),n.a),f9(kY(n.n),n.f),f9(kY(n.g),n.n),f9(kY(n.c),n.n),f9(kY(n.i),n.c),f9(kY(n.j),n.c),f9(kY(n.d),n.f),f9(kY(n.e),n.a),z0(n.p,Xrt,OJn,!0,!0,!1),u=Tun(a=msn(n.p,n.p,"setProperty")),t=ZV(n.o),e=new Kp,f9((!t.d&&(t.d=new $L(VAt,t,1)),t.d),e),kEn(e,i=nQ(u)),Ujn(a,t,j6n),Ujn(a,t=nQ(u),E6n),u=Tun(a=msn(n.p,null,"getProperty")),t=ZV(n.o),e=nQ(u),f9((!t.d&&(t.d=new $L(VAt,t,1)),t.d),e),Ujn(a,t,j6n),(c=HTn(a,t=nQ(u),null))&&c.Fi(),a=msn(n.p,n.wb.e,"hasProperty"),t=ZV(n.o),e=new Kp,f9((!t.d&&(t.d=new $L(VAt,t,1)),t.d),e),Ujn(a,t,j6n),$yn(a=msn(n.p,n.p,"copyProperties"),n.p,T6n),a=msn(n.p,null,"getAllProperties"),t=ZV(n.wb.P),e=ZV(n.o),f9((!t.d&&(t.d=new $L(VAt,t,1)),t.d),e),i=new Kp,f9((!e.d&&(e.d=new $L(VAt,e,1)),e.d),i),e=ZV(n.wb.M),f9((!t.d&&(t.d=new $L(VAt,t,1)),t.d),e),(r=HTn(a,t,null))&&r.Fi(),z0(n.a,NOt,z5n,!0,!1,!0),Myn(BB(Wtn(QQ(n.a),0),18),n.k,null,M6n,0,-1,NOt,!1,!1,!0,!0,!1,!1,!1),z0(n.f,DOt,X5n,!0,!1,!0),Myn(BB(Wtn(QQ(n.f),0),18),n.g,BB(Wtn(QQ(n.g),0),18),"labels",0,-1,DOt,!1,!1,!0,!0,!1,!1,!1),ucn(BB(Wtn(QQ(n.f),1),34),n.wb._,S6n,null,0,1,DOt,!1,!1,!0,!1,!0,!1),z0(n.n,ROt,"ElkShape",!0,!1,!0),ucn(BB(Wtn(QQ(n.n),0),34),n.wb.t,P6n,WQn,1,1,ROt,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.n),1),34),n.wb.t,C6n,WQn,1,1,ROt,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.n),2),34),n.wb.t,"x",WQn,1,1,ROt,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.n),3),34),n.wb.t,"y",WQn,1,1,ROt,!1,!1,!0,!1,!0,!1),$yn(a=msn(n.n,null,"setDimensions"),n.wb.t,C6n),$yn(a,n.wb.t,P6n),$yn(a=msn(n.n,null,"setLocation"),n.wb.t,"x"),$yn(a,n.wb.t,"y"),z0(n.g,zOt,Z5n,!1,!1,!0),Myn(BB(Wtn(QQ(n.g),0),18),n.f,BB(Wtn(QQ(n.f),0),18),I6n,0,1,zOt,!1,!1,!0,!1,!1,!1,!1),ucn(BB(Wtn(QQ(n.g),1),34),n.wb._,O6n,"",0,1,zOt,!1,!1,!0,!1,!0,!1),z0(n.c,KOt,W5n,!0,!1,!0),Myn(BB(Wtn(QQ(n.c),0),18),n.d,BB(Wtn(QQ(n.d),1),18),"outgoingEdges",0,-1,KOt,!1,!1,!0,!1,!0,!1,!1),Myn(BB(Wtn(QQ(n.c),1),18),n.d,BB(Wtn(QQ(n.d),2),18),"incomingEdges",0,-1,KOt,!1,!1,!0,!1,!0,!1,!1),z0(n.i,UOt,n6n,!1,!1,!0),Myn(BB(Wtn(QQ(n.i),0),18),n.j,BB(Wtn(QQ(n.j),0),18),"ports",0,-1,UOt,!1,!1,!0,!0,!1,!1,!1),Myn(BB(Wtn(QQ(n.i),1),18),n.i,BB(Wtn(QQ(n.i),2),18),A6n,0,-1,UOt,!1,!1,!0,!0,!1,!1,!1),Myn(BB(Wtn(QQ(n.i),2),18),n.i,BB(Wtn(QQ(n.i),1),18),I6n,0,1,UOt,!1,!1,!0,!1,!1,!1,!1),Myn(BB(Wtn(QQ(n.i),3),18),n.d,BB(Wtn(QQ(n.d),0),18),"containedEdges",0,-1,UOt,!1,!1,!0,!0,!1,!1,!1),ucn(BB(Wtn(QQ(n.i),4),34),n.wb.e,$6n,null,0,1,UOt,!0,!0,!1,!1,!0,!0),z0(n.j,XOt,t6n,!1,!1,!0),Myn(BB(Wtn(QQ(n.j),0),18),n.i,BB(Wtn(QQ(n.i),0),18),I6n,0,1,XOt,!1,!1,!0,!1,!1,!1,!1),z0(n.d,_Ot,V5n,!1,!1,!0),Myn(BB(Wtn(QQ(n.d),0),18),n.i,BB(Wtn(QQ(n.i),3),18),"containingNode",0,1,_Ot,!1,!1,!0,!1,!1,!1,!1),Myn(BB(Wtn(QQ(n.d),1),18),n.c,BB(Wtn(QQ(n.c),0),18),L6n,0,-1,_Ot,!1,!1,!0,!1,!0,!1,!1),Myn(BB(Wtn(QQ(n.d),2),18),n.c,BB(Wtn(QQ(n.c),1),18),N6n,0,-1,_Ot,!1,!1,!0,!1,!0,!1,!1),Myn(BB(Wtn(QQ(n.d),3),18),n.e,BB(Wtn(QQ(n.e),5),18),x6n,0,-1,_Ot,!1,!1,!0,!0,!1,!1,!1),ucn(BB(Wtn(QQ(n.d),4),34),n.wb.e,"hyperedge",null,0,1,_Ot,!0,!0,!1,!1,!0,!0),ucn(BB(Wtn(QQ(n.d),5),34),n.wb.e,$6n,null,0,1,_Ot,!0,!0,!1,!1,!0,!0),ucn(BB(Wtn(QQ(n.d),6),34),n.wb.e,"selfloop",null,0,1,_Ot,!0,!0,!1,!1,!0,!0),ucn(BB(Wtn(QQ(n.d),7),34),n.wb.e,"connected",null,0,1,_Ot,!0,!0,!1,!1,!0,!0),z0(n.b,xOt,U5n,!1,!1,!0),ucn(BB(Wtn(QQ(n.b),0),34),n.wb.t,"x",WQn,1,1,xOt,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.b),1),34),n.wb.t,"y",WQn,1,1,xOt,!1,!1,!0,!1,!0,!1),$yn(a=msn(n.b,null,"set"),n.wb.t,"x"),$yn(a,n.wb.t,"y"),z0(n.e,FOt,Q5n,!1,!1,!0),ucn(BB(Wtn(QQ(n.e),0),34),n.wb.t,"startX",null,0,1,FOt,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.e),1),34),n.wb.t,"startY",null,0,1,FOt,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.e),2),34),n.wb.t,"endX",null,0,1,FOt,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.e),3),34),n.wb.t,"endY",null,0,1,FOt,!1,!1,!0,!1,!0,!1),Myn(BB(Wtn(QQ(n.e),4),18),n.b,null,D6n,0,-1,FOt,!1,!1,!0,!0,!1,!1,!1),Myn(BB(Wtn(QQ(n.e),5),18),n.d,BB(Wtn(QQ(n.d),3),18),I6n,0,1,FOt,!1,!1,!0,!1,!1,!1,!1),Myn(BB(Wtn(QQ(n.e),6),18),n.c,null,R6n,0,1,FOt,!1,!1,!0,!1,!0,!1,!1),Myn(BB(Wtn(QQ(n.e),7),18),n.c,null,K6n,0,1,FOt,!1,!1,!0,!1,!0,!1,!1),Myn(BB(Wtn(QQ(n.e),8),18),n.e,BB(Wtn(QQ(n.e),9),18),_6n,0,-1,FOt,!1,!1,!0,!1,!0,!1,!1),Myn(BB(Wtn(QQ(n.e),9),18),n.e,BB(Wtn(QQ(n.e),8),18),F6n,0,-1,FOt,!1,!1,!0,!1,!0,!1,!1),ucn(BB(Wtn(QQ(n.e),10),34),n.wb._,S6n,null,0,1,FOt,!1,!1,!0,!1,!0,!1),$yn(a=msn(n.e,null,"setStartLocation"),n.wb.t,"x"),$yn(a,n.wb.t,"y"),$yn(a=msn(n.e,null,"setEndLocation"),n.wb.t,"x"),$yn(a,n.wb.t,"y"),z0(n.k,Hnt,"ElkPropertyToValueMapEntry",!1,!1,!1),t=ZV(n.o),e=new Kp,f9((!t.d&&(t.d=new $L(VAt,t,1)),t.d),e),_On(BB(Wtn(QQ(n.k),0),34),t,"key",Hnt,!1,!1,!0,!1),ucn(BB(Wtn(QQ(n.k),1),34),n.s,E6n,null,0,1,Hnt,!1,!1,!0,!1,!0,!1),dV(n.o,lMt,"IProperty",!0),dV(n.s,Ant,"PropertyValue",!0),Lhn(n,y6n))}function EWn(){EWn=O,(JLt=x8(NNt,v6n,25,BQn,15,1))[9]=35,JLt[10]=19,JLt[13]=19,JLt[32]=51,JLt[33]=49,JLt[34]=33,yU(JLt,35,38,49),JLt[38]=1,yU(JLt,39,45,49),yU(JLt,45,47,-71),JLt[47]=49,yU(JLt,48,58,-71),JLt[58]=61,JLt[59]=49,JLt[60]=1,JLt[61]=49,JLt[62]=33,yU(JLt,63,65,49),yU(JLt,65,91,-3),yU(JLt,91,93,33),JLt[93]=1,JLt[94]=33,JLt[95]=-3,JLt[96]=33,yU(JLt,97,123,-3),yU(JLt,123,183,33),JLt[183]=-87,yU(JLt,184,192,33),yU(JLt,192,215,-19),JLt[215]=33,yU(JLt,216,247,-19),JLt[247]=33,yU(JLt,248,306,-19),yU(JLt,306,308,33),yU(JLt,308,319,-19),yU(JLt,319,321,33),yU(JLt,321,329,-19),JLt[329]=33,yU(JLt,330,383,-19),JLt[383]=33,yU(JLt,384,452,-19),yU(JLt,452,461,33),yU(JLt,461,497,-19),yU(JLt,497,500,33),yU(JLt,500,502,-19),yU(JLt,502,506,33),yU(JLt,506,536,-19),yU(JLt,536,592,33),yU(JLt,592,681,-19),yU(JLt,681,699,33),yU(JLt,699,706,-19),yU(JLt,706,720,33),yU(JLt,720,722,-87),yU(JLt,722,768,33),yU(JLt,768,838,-87),yU(JLt,838,864,33),yU(JLt,864,866,-87),yU(JLt,866,902,33),JLt[902]=-19,JLt[903]=-87,yU(JLt,904,907,-19),JLt[907]=33,JLt[908]=-19,JLt[909]=33,yU(JLt,910,930,-19),JLt[930]=33,yU(JLt,931,975,-19),JLt[975]=33,yU(JLt,976,983,-19),yU(JLt,983,986,33),JLt[986]=-19,JLt[987]=33,JLt[988]=-19,JLt[989]=33,JLt[990]=-19,JLt[991]=33,JLt[992]=-19,JLt[993]=33,yU(JLt,994,1012,-19),yU(JLt,1012,1025,33),yU(JLt,1025,1037,-19),JLt[1037]=33,yU(JLt,1038,1104,-19),JLt[1104]=33,yU(JLt,1105,1117,-19),JLt[1117]=33,yU(JLt,1118,1154,-19),JLt[1154]=33,yU(JLt,1155,1159,-87),yU(JLt,1159,1168,33),yU(JLt,1168,1221,-19),yU(JLt,1221,1223,33),yU(JLt,1223,1225,-19),yU(JLt,1225,1227,33),yU(JLt,1227,1229,-19),yU(JLt,1229,1232,33),yU(JLt,1232,1260,-19),yU(JLt,1260,1262,33),yU(JLt,1262,1270,-19),yU(JLt,1270,1272,33),yU(JLt,1272,1274,-19),yU(JLt,1274,1329,33),yU(JLt,1329,1367,-19),yU(JLt,1367,1369,33),JLt[1369]=-19,yU(JLt,1370,1377,33),yU(JLt,1377,1415,-19),yU(JLt,1415,1425,33),yU(JLt,1425,1442,-87),JLt[1442]=33,yU(JLt,1443,1466,-87),JLt[1466]=33,yU(JLt,1467,1470,-87),JLt[1470]=33,JLt[1471]=-87,JLt[1472]=33,yU(JLt,1473,1475,-87),JLt[1475]=33,JLt[1476]=-87,yU(JLt,1477,1488,33),yU(JLt,1488,1515,-19),yU(JLt,1515,1520,33),yU(JLt,1520,1523,-19),yU(JLt,1523,1569,33),yU(JLt,1569,1595,-19),yU(JLt,1595,1600,33),JLt[1600]=-87,yU(JLt,1601,1611,-19),yU(JLt,1611,1619,-87),yU(JLt,1619,1632,33),yU(JLt,1632,1642,-87),yU(JLt,1642,1648,33),JLt[1648]=-87,yU(JLt,1649,1720,-19),yU(JLt,1720,1722,33),yU(JLt,1722,1727,-19),JLt[1727]=33,yU(JLt,1728,1743,-19),JLt[1743]=33,yU(JLt,1744,1748,-19),JLt[1748]=33,JLt[1749]=-19,yU(JLt,1750,1765,-87),yU(JLt,1765,1767,-19),yU(JLt,1767,1769,-87),JLt[1769]=33,yU(JLt,1770,1774,-87),yU(JLt,1774,1776,33),yU(JLt,1776,1786,-87),yU(JLt,1786,2305,33),yU(JLt,2305,2308,-87),JLt[2308]=33,yU(JLt,2309,2362,-19),yU(JLt,2362,2364,33),JLt[2364]=-87,JLt[2365]=-19,yU(JLt,2366,2382,-87),yU(JLt,2382,2385,33),yU(JLt,2385,2389,-87),yU(JLt,2389,2392,33),yU(JLt,2392,2402,-19),yU(JLt,2402,2404,-87),yU(JLt,2404,2406,33),yU(JLt,2406,2416,-87),yU(JLt,2416,2433,33),yU(JLt,2433,2436,-87),JLt[2436]=33,yU(JLt,2437,2445,-19),yU(JLt,2445,2447,33),yU(JLt,2447,2449,-19),yU(JLt,2449,2451,33),yU(JLt,2451,2473,-19),JLt[2473]=33,yU(JLt,2474,2481,-19),JLt[2481]=33,JLt[2482]=-19,yU(JLt,2483,2486,33),yU(JLt,2486,2490,-19),yU(JLt,2490,2492,33),JLt[2492]=-87,JLt[2493]=33,yU(JLt,2494,2501,-87),yU(JLt,2501,2503,33),yU(JLt,2503,2505,-87),yU(JLt,2505,2507,33),yU(JLt,2507,2510,-87),yU(JLt,2510,2519,33),JLt[2519]=-87,yU(JLt,2520,2524,33),yU(JLt,2524,2526,-19),JLt[2526]=33,yU(JLt,2527,2530,-19),yU(JLt,2530,2532,-87),yU(JLt,2532,2534,33),yU(JLt,2534,2544,-87),yU(JLt,2544,2546,-19),yU(JLt,2546,2562,33),JLt[2562]=-87,yU(JLt,2563,2565,33),yU(JLt,2565,2571,-19),yU(JLt,2571,2575,33),yU(JLt,2575,2577,-19),yU(JLt,2577,2579,33),yU(JLt,2579,2601,-19),JLt[2601]=33,yU(JLt,2602,2609,-19),JLt[2609]=33,yU(JLt,2610,2612,-19),JLt[2612]=33,yU(JLt,2613,2615,-19),JLt[2615]=33,yU(JLt,2616,2618,-19),yU(JLt,2618,2620,33),JLt[2620]=-87,JLt[2621]=33,yU(JLt,2622,2627,-87),yU(JLt,2627,2631,33),yU(JLt,2631,2633,-87),yU(JLt,2633,2635,33),yU(JLt,2635,2638,-87),yU(JLt,2638,2649,33),yU(JLt,2649,2653,-19),JLt[2653]=33,JLt[2654]=-19,yU(JLt,2655,2662,33),yU(JLt,2662,2674,-87),yU(JLt,2674,2677,-19),yU(JLt,2677,2689,33),yU(JLt,2689,2692,-87),JLt[2692]=33,yU(JLt,2693,2700,-19),JLt[2700]=33,JLt[2701]=-19,JLt[2702]=33,yU(JLt,2703,2706,-19),JLt[2706]=33,yU(JLt,2707,2729,-19),JLt[2729]=33,yU(JLt,2730,2737,-19),JLt[2737]=33,yU(JLt,2738,2740,-19),JLt[2740]=33,yU(JLt,2741,2746,-19),yU(JLt,2746,2748,33),JLt[2748]=-87,JLt[2749]=-19,yU(JLt,2750,2758,-87),JLt[2758]=33,yU(JLt,2759,2762,-87),JLt[2762]=33,yU(JLt,2763,2766,-87),yU(JLt,2766,2784,33),JLt[2784]=-19,yU(JLt,2785,2790,33),yU(JLt,2790,2800,-87),yU(JLt,2800,2817,33),yU(JLt,2817,2820,-87),JLt[2820]=33,yU(JLt,2821,2829,-19),yU(JLt,2829,2831,33),yU(JLt,2831,2833,-19),yU(JLt,2833,2835,33),yU(JLt,2835,2857,-19),JLt[2857]=33,yU(JLt,2858,2865,-19),JLt[2865]=33,yU(JLt,2866,2868,-19),yU(JLt,2868,2870,33),yU(JLt,2870,2874,-19),yU(JLt,2874,2876,33),JLt[2876]=-87,JLt[2877]=-19,yU(JLt,2878,2884,-87),yU(JLt,2884,2887,33),yU(JLt,2887,2889,-87),yU(JLt,2889,2891,33),yU(JLt,2891,2894,-87),yU(JLt,2894,2902,33),yU(JLt,2902,2904,-87),yU(JLt,2904,2908,33),yU(JLt,2908,2910,-19),JLt[2910]=33,yU(JLt,2911,2914,-19),yU(JLt,2914,2918,33),yU(JLt,2918,2928,-87),yU(JLt,2928,2946,33),yU(JLt,2946,2948,-87),JLt[2948]=33,yU(JLt,2949,2955,-19),yU(JLt,2955,2958,33),yU(JLt,2958,2961,-19),JLt[2961]=33,yU(JLt,2962,2966,-19),yU(JLt,2966,2969,33),yU(JLt,2969,2971,-19),JLt[2971]=33,JLt[2972]=-19,JLt[2973]=33,yU(JLt,2974,2976,-19),yU(JLt,2976,2979,33),yU(JLt,2979,2981,-19),yU(JLt,2981,2984,33),yU(JLt,2984,2987,-19),yU(JLt,2987,2990,33),yU(JLt,2990,2998,-19),JLt[2998]=33,yU(JLt,2999,3002,-19),yU(JLt,3002,3006,33),yU(JLt,3006,3011,-87),yU(JLt,3011,3014,33),yU(JLt,3014,3017,-87),JLt[3017]=33,yU(JLt,3018,3022,-87),yU(JLt,3022,3031,33),JLt[3031]=-87,yU(JLt,3032,3047,33),yU(JLt,3047,3056,-87),yU(JLt,3056,3073,33),yU(JLt,3073,3076,-87),JLt[3076]=33,yU(JLt,3077,3085,-19),JLt[3085]=33,yU(JLt,3086,3089,-19),JLt[3089]=33,yU(JLt,3090,3113,-19),JLt[3113]=33,yU(JLt,3114,3124,-19),JLt[3124]=33,yU(JLt,3125,3130,-19),yU(JLt,3130,3134,33),yU(JLt,3134,3141,-87),JLt[3141]=33,yU(JLt,3142,3145,-87),JLt[3145]=33,yU(JLt,3146,3150,-87),yU(JLt,3150,3157,33),yU(JLt,3157,3159,-87),yU(JLt,3159,3168,33),yU(JLt,3168,3170,-19),yU(JLt,3170,3174,33),yU(JLt,3174,3184,-87),yU(JLt,3184,3202,33),yU(JLt,3202,3204,-87),JLt[3204]=33,yU(JLt,3205,3213,-19),JLt[3213]=33,yU(JLt,3214,3217,-19),JLt[3217]=33,yU(JLt,3218,3241,-19),JLt[3241]=33,yU(JLt,3242,3252,-19),JLt[3252]=33,yU(JLt,3253,3258,-19),yU(JLt,3258,3262,33),yU(JLt,3262,3269,-87),JLt[3269]=33,yU(JLt,3270,3273,-87),JLt[3273]=33,yU(JLt,3274,3278,-87),yU(JLt,3278,3285,33),yU(JLt,3285,3287,-87),yU(JLt,3287,3294,33),JLt[3294]=-19,JLt[3295]=33,yU(JLt,3296,3298,-19),yU(JLt,3298,3302,33),yU(JLt,3302,3312,-87),yU(JLt,3312,3330,33),yU(JLt,3330,3332,-87),JLt[3332]=33,yU(JLt,3333,3341,-19),JLt[3341]=33,yU(JLt,3342,3345,-19),JLt[3345]=33,yU(JLt,3346,3369,-19),JLt[3369]=33,yU(JLt,3370,3386,-19),yU(JLt,3386,3390,33),yU(JLt,3390,3396,-87),yU(JLt,3396,3398,33),yU(JLt,3398,3401,-87),JLt[3401]=33,yU(JLt,3402,3406,-87),yU(JLt,3406,3415,33),JLt[3415]=-87,yU(JLt,3416,3424,33),yU(JLt,3424,3426,-19),yU(JLt,3426,3430,33),yU(JLt,3430,3440,-87),yU(JLt,3440,3585,33),yU(JLt,3585,3631,-19),JLt[3631]=33,JLt[3632]=-19,JLt[3633]=-87,yU(JLt,3634,3636,-19),yU(JLt,3636,3643,-87),yU(JLt,3643,3648,33),yU(JLt,3648,3654,-19),yU(JLt,3654,3663,-87),JLt[3663]=33,yU(JLt,3664,3674,-87),yU(JLt,3674,3713,33),yU(JLt,3713,3715,-19),JLt[3715]=33,JLt[3716]=-19,yU(JLt,3717,3719,33),yU(JLt,3719,3721,-19),JLt[3721]=33,JLt[3722]=-19,yU(JLt,3723,3725,33),JLt[3725]=-19,yU(JLt,3726,3732,33),yU(JLt,3732,3736,-19),JLt[3736]=33,yU(JLt,3737,3744,-19),JLt[3744]=33,yU(JLt,3745,3748,-19),JLt[3748]=33,JLt[3749]=-19,JLt[3750]=33,JLt[3751]=-19,yU(JLt,3752,3754,33),yU(JLt,3754,3756,-19),JLt[3756]=33,yU(JLt,3757,3759,-19),JLt[3759]=33,JLt[3760]=-19,JLt[3761]=-87,yU(JLt,3762,3764,-19),yU(JLt,3764,3770,-87),JLt[3770]=33,yU(JLt,3771,3773,-87),JLt[3773]=-19,yU(JLt,3774,3776,33),yU(JLt,3776,3781,-19),JLt[3781]=33,JLt[3782]=-87,JLt[3783]=33,yU(JLt,3784,3790,-87),yU(JLt,3790,3792,33),yU(JLt,3792,3802,-87),yU(JLt,3802,3864,33),yU(JLt,3864,3866,-87),yU(JLt,3866,3872,33),yU(JLt,3872,3882,-87),yU(JLt,3882,3893,33),JLt[3893]=-87,JLt[3894]=33,JLt[3895]=-87,JLt[3896]=33,JLt[3897]=-87,yU(JLt,3898,3902,33),yU(JLt,3902,3904,-87),yU(JLt,3904,3912,-19),JLt[3912]=33,yU(JLt,3913,3946,-19),yU(JLt,3946,3953,33),yU(JLt,3953,3973,-87),JLt[3973]=33,yU(JLt,3974,3980,-87),yU(JLt,3980,3984,33),yU(JLt,3984,3990,-87),JLt[3990]=33,JLt[3991]=-87,JLt[3992]=33,yU(JLt,3993,4014,-87),yU(JLt,4014,4017,33),yU(JLt,4017,4024,-87),JLt[4024]=33,JLt[4025]=-87,yU(JLt,4026,4256,33),yU(JLt,4256,4294,-19),yU(JLt,4294,4304,33),yU(JLt,4304,4343,-19),yU(JLt,4343,4352,33),JLt[4352]=-19,JLt[4353]=33,yU(JLt,4354,4356,-19),JLt[4356]=33,yU(JLt,4357,4360,-19),JLt[4360]=33,JLt[4361]=-19,JLt[4362]=33,yU(JLt,4363,4365,-19),JLt[4365]=33,yU(JLt,4366,4371,-19),yU(JLt,4371,4412,33),JLt[4412]=-19,JLt[4413]=33,JLt[4414]=-19,JLt[4415]=33,JLt[4416]=-19,yU(JLt,4417,4428,33),JLt[4428]=-19,JLt[4429]=33,JLt[4430]=-19,JLt[4431]=33,JLt[4432]=-19,yU(JLt,4433,4436,33),yU(JLt,4436,4438,-19),yU(JLt,4438,4441,33),JLt[4441]=-19,yU(JLt,4442,4447,33),yU(JLt,4447,4450,-19),JLt[4450]=33,JLt[4451]=-19,JLt[4452]=33,JLt[4453]=-19,JLt[4454]=33,JLt[4455]=-19,JLt[4456]=33,JLt[4457]=-19,yU(JLt,4458,4461,33),yU(JLt,4461,4463,-19),yU(JLt,4463,4466,33),yU(JLt,4466,4468,-19),JLt[4468]=33,JLt[4469]=-19,yU(JLt,4470,4510,33),JLt[4510]=-19,yU(JLt,4511,4520,33),JLt[4520]=-19,yU(JLt,4521,4523,33),JLt[4523]=-19,yU(JLt,4524,4526,33),yU(JLt,4526,4528,-19),yU(JLt,4528,4535,33),yU(JLt,4535,4537,-19),JLt[4537]=33,JLt[4538]=-19,JLt[4539]=33,yU(JLt,4540,4547,-19),yU(JLt,4547,4587,33),JLt[4587]=-19,yU(JLt,4588,4592,33),JLt[4592]=-19,yU(JLt,4593,4601,33),JLt[4601]=-19,yU(JLt,4602,7680,33),yU(JLt,7680,7836,-19),yU(JLt,7836,7840,33),yU(JLt,7840,7930,-19),yU(JLt,7930,7936,33),yU(JLt,7936,7958,-19),yU(JLt,7958,7960,33),yU(JLt,7960,7966,-19),yU(JLt,7966,7968,33),yU(JLt,7968,8006,-19),yU(JLt,8006,8008,33),yU(JLt,8008,8014,-19),yU(JLt,8014,8016,33),yU(JLt,8016,8024,-19),JLt[8024]=33,JLt[8025]=-19,JLt[8026]=33,JLt[8027]=-19,JLt[8028]=33,JLt[8029]=-19,JLt[8030]=33,yU(JLt,8031,8062,-19),yU(JLt,8062,8064,33),yU(JLt,8064,8117,-19),JLt[8117]=33,yU(JLt,8118,8125,-19),JLt[8125]=33,JLt[8126]=-19,yU(JLt,8127,8130,33),yU(JLt,8130,8133,-19),JLt[8133]=33,yU(JLt,8134,8141,-19),yU(JLt,8141,8144,33),yU(JLt,8144,8148,-19),yU(JLt,8148,8150,33),yU(JLt,8150,8156,-19),yU(JLt,8156,8160,33),yU(JLt,8160,8173,-19),yU(JLt,8173,8178,33),yU(JLt,8178,8181,-19),JLt[8181]=33,yU(JLt,8182,8189,-19),yU(JLt,8189,8400,33),yU(JLt,8400,8413,-87),yU(JLt,8413,8417,33),JLt[8417]=-87,yU(JLt,8418,8486,33),JLt[8486]=-19,yU(JLt,8487,8490,33),yU(JLt,8490,8492,-19),yU(JLt,8492,8494,33),JLt[8494]=-19,yU(JLt,8495,8576,33),yU(JLt,8576,8579,-19),yU(JLt,8579,12293,33),JLt[12293]=-87,JLt[12294]=33,JLt[12295]=-19,yU(JLt,12296,12321,33),yU(JLt,12321,12330,-19),yU(JLt,12330,12336,-87),JLt[12336]=33,yU(JLt,12337,12342,-87),yU(JLt,12342,12353,33),yU(JLt,12353,12437,-19),yU(JLt,12437,12441,33),yU(JLt,12441,12443,-87),yU(JLt,12443,12445,33),yU(JLt,12445,12447,-87),yU(JLt,12447,12449,33),yU(JLt,12449,12539,-19),JLt[12539]=33,yU(JLt,12540,12543,-87),yU(JLt,12543,12549,33),yU(JLt,12549,12589,-19),yU(JLt,12589,19968,33),yU(JLt,19968,40870,-19),yU(JLt,40870,44032,33),yU(JLt,44032,55204,-19),yU(JLt,55204,HQn,33),yU(JLt,57344,65534,33)}function TWn(n){var t,e,i,r,c,a,u;n.hb||(n.hb=!0,Nrn(n,"ecore"),xrn(n,"ecore"),Drn(n,V9n),cun(n.fb,"E"),cun(n.L,"T"),cun(n.P,"K"),cun(n.P,"V"),cun(n.cb,"E"),f9(kY(n.b),n.bb),f9(kY(n.a),n.Q),f9(kY(n.o),n.p),f9(kY(n.p),n.R),f9(kY(n.q),n.p),f9(kY(n.v),n.q),f9(kY(n.w),n.R),f9(kY(n.B),n.Q),f9(kY(n.R),n.Q),f9(kY(n.T),n.eb),f9(kY(n.U),n.R),f9(kY(n.V),n.eb),f9(kY(n.W),n.bb),f9(kY(n.bb),n.eb),f9(kY(n.eb),n.R),f9(kY(n.db),n.R),z0(n.b,BAt,l9n,!1,!1,!0),ucn(BB(Wtn(QQ(n.b),0),34),n.e,"iD",null,0,1,BAt,!1,!1,!0,!1,!0,!1),Myn(BB(Wtn(QQ(n.b),1),18),n.q,null,"eAttributeType",1,1,BAt,!0,!0,!1,!1,!0,!1,!0),z0(n.a,KAt,s9n,!1,!1,!0),ucn(BB(Wtn(QQ(n.a),0),34),n._,T6n,null,0,1,KAt,!1,!1,!0,!1,!0,!1),Myn(BB(Wtn(QQ(n.a),1),18),n.ab,null,"details",0,-1,KAt,!1,!1,!0,!0,!1,!1,!1),Myn(BB(Wtn(QQ(n.a),2),18),n.Q,BB(Wtn(QQ(n.Q),0),18),"eModelElement",0,1,KAt,!0,!1,!0,!1,!1,!1,!1),Myn(BB(Wtn(QQ(n.a),3),18),n.S,null,"contents",0,-1,KAt,!1,!1,!0,!0,!1,!1,!1),Myn(BB(Wtn(QQ(n.a),4),18),n.S,null,"references",0,-1,KAt,!1,!1,!0,!1,!0,!1,!1),z0(n.o,qAt,"EClass",!1,!1,!0),ucn(BB(Wtn(QQ(n.o),0),34),n.e,"abstract",null,0,1,qAt,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.o),1),34),n.e,"interface",null,0,1,qAt,!1,!1,!0,!1,!0,!1),Myn(BB(Wtn(QQ(n.o),2),18),n.o,null,"eSuperTypes",0,-1,qAt,!1,!1,!0,!1,!0,!0,!1),Myn(BB(Wtn(QQ(n.o),3),18),n.T,BB(Wtn(QQ(n.T),0),18),"eOperations",0,-1,qAt,!1,!1,!0,!0,!1,!1,!1),Myn(BB(Wtn(QQ(n.o),4),18),n.b,null,"eAllAttributes",0,-1,qAt,!0,!0,!1,!1,!0,!1,!0),Myn(BB(Wtn(QQ(n.o),5),18),n.W,null,"eAllReferences",0,-1,qAt,!0,!0,!1,!1,!0,!1,!0),Myn(BB(Wtn(QQ(n.o),6),18),n.W,null,"eReferences",0,-1,qAt,!0,!0,!1,!1,!0,!1,!0),Myn(BB(Wtn(QQ(n.o),7),18),n.b,null,"eAttributes",0,-1,qAt,!0,!0,!1,!1,!0,!1,!0),Myn(BB(Wtn(QQ(n.o),8),18),n.W,null,"eAllContainments",0,-1,qAt,!0,!0,!1,!1,!0,!1,!0),Myn(BB(Wtn(QQ(n.o),9),18),n.T,null,"eAllOperations",0,-1,qAt,!0,!0,!1,!1,!0,!1,!0),Myn(BB(Wtn(QQ(n.o),10),18),n.bb,null,"eAllStructuralFeatures",0,-1,qAt,!0,!0,!1,!1,!0,!1,!0),Myn(BB(Wtn(QQ(n.o),11),18),n.o,null,"eAllSuperTypes",0,-1,qAt,!0,!0,!1,!1,!0,!1,!0),Myn(BB(Wtn(QQ(n.o),12),18),n.b,null,"eIDAttribute",0,1,qAt,!0,!0,!1,!1,!1,!1,!0),Myn(BB(Wtn(QQ(n.o),13),18),n.bb,BB(Wtn(QQ(n.bb),7),18),"eStructuralFeatures",0,-1,qAt,!1,!1,!0,!0,!1,!1,!1),Myn(BB(Wtn(QQ(n.o),14),18),n.H,null,"eGenericSuperTypes",0,-1,qAt,!1,!1,!0,!0,!1,!0,!1),Myn(BB(Wtn(QQ(n.o),15),18),n.H,null,"eAllGenericSuperTypes",0,-1,qAt,!0,!0,!1,!1,!0,!1,!0),$yn(u=fin(BB(Wtn(VQ(n.o),0),59),n.e,"isSuperTypeOf"),n.o,"someClass"),fin(BB(Wtn(VQ(n.o),1),59),n.I,"getFeatureCount"),$yn(u=fin(BB(Wtn(VQ(n.o),2),59),n.bb,Z9n),n.I,"featureID"),$yn(u=fin(BB(Wtn(VQ(n.o),3),59),n.I,n7n),n.bb,t7n),$yn(u=fin(BB(Wtn(VQ(n.o),4),59),n.bb,Z9n),n._,"featureName"),fin(BB(Wtn(VQ(n.o),5),59),n.I,"getOperationCount"),$yn(u=fin(BB(Wtn(VQ(n.o),6),59),n.T,"getEOperation"),n.I,"operationID"),$yn(u=fin(BB(Wtn(VQ(n.o),7),59),n.I,e7n),n.T,i7n),$yn(u=fin(BB(Wtn(VQ(n.o),8),59),n.T,"getOverride"),n.T,i7n),$yn(u=fin(BB(Wtn(VQ(n.o),9),59),n.H,"getFeatureType"),n.bb,t7n),z0(n.p,HAt,b9n,!0,!1,!0),ucn(BB(Wtn(QQ(n.p),0),34),n._,"instanceClassName",null,0,1,HAt,!1,!0,!0,!0,!0,!1),t=ZV(n.L),e=s2(),f9((!t.d&&(t.d=new $L(VAt,t,1)),t.d),e),_On(BB(Wtn(QQ(n.p),1),34),t,"instanceClass",HAt,!0,!0,!1,!0),ucn(BB(Wtn(QQ(n.p),2),34),n.M,r7n,null,0,1,HAt,!0,!0,!1,!1,!0,!0),ucn(BB(Wtn(QQ(n.p),3),34),n._,"instanceTypeName",null,0,1,HAt,!1,!0,!0,!0,!0,!1),Myn(BB(Wtn(QQ(n.p),4),18),n.U,BB(Wtn(QQ(n.U),3),18),"ePackage",0,1,HAt,!0,!1,!1,!1,!0,!1,!1),Myn(BB(Wtn(QQ(n.p),5),18),n.db,null,c7n,0,-1,HAt,!1,!1,!0,!0,!0,!1,!1),$yn(u=fin(BB(Wtn(VQ(n.p),0),59),n.e,a7n),n.M,AWn),fin(BB(Wtn(VQ(n.p),1),59),n.I,"getClassifierID"),z0(n.q,GAt,"EDataType",!1,!1,!0),ucn(BB(Wtn(QQ(n.q),0),34),n.e,"serializable",a5n,0,1,GAt,!1,!1,!0,!1,!0,!1),z0(n.v,XAt,"EEnum",!1,!1,!0),Myn(BB(Wtn(QQ(n.v),0),18),n.w,BB(Wtn(QQ(n.w),3),18),"eLiterals",0,-1,XAt,!1,!1,!0,!0,!1,!1,!1),$yn(u=fin(BB(Wtn(VQ(n.v),0),59),n.w,u7n),n._,t8n),$yn(u=fin(BB(Wtn(VQ(n.v),1),59),n.w,u7n),n.I,E6n),$yn(u=fin(BB(Wtn(VQ(n.v),2),59),n.w,"getEEnumLiteralByLiteral"),n._,"literal"),z0(n.w,WAt,w9n,!1,!1,!0),ucn(BB(Wtn(QQ(n.w),0),34),n.I,E6n,null,0,1,WAt,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.w),1),34),n.A,"instance",null,0,1,WAt,!0,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.w),2),34),n._,"literal",null,0,1,WAt,!1,!1,!0,!1,!0,!1),Myn(BB(Wtn(QQ(n.w),3),18),n.v,BB(Wtn(QQ(n.v),0),18),"eEnum",0,1,WAt,!0,!1,!1,!1,!1,!1,!1),z0(n.B,HOt,"EFactory",!1,!1,!0),Myn(BB(Wtn(QQ(n.B),0),18),n.U,BB(Wtn(QQ(n.U),2),18),"ePackage",1,1,HOt,!0,!1,!0,!1,!1,!1,!1),$yn(u=fin(BB(Wtn(VQ(n.B),0),59),n.S,"create"),n.o,"eClass"),$yn(u=fin(BB(Wtn(VQ(n.B),1),59),n.M,"createFromString"),n.q,"eDataType"),$yn(u,n._,"literalValue"),$yn(u=fin(BB(Wtn(VQ(n.B),2),59),n._,"convertToString"),n.q,"eDataType"),$yn(u,n.M,"instanceValue"),z0(n.Q,BOt,Y5n,!0,!1,!0),Myn(BB(Wtn(QQ(n.Q),0),18),n.a,BB(Wtn(QQ(n.a),2),18),"eAnnotations",0,-1,BOt,!1,!1,!0,!0,!1,!1,!1),$yn(u=fin(BB(Wtn(VQ(n.Q),0),59),n.a,"getEAnnotation"),n._,T6n),z0(n.R,qOt,J5n,!0,!1,!0),ucn(BB(Wtn(QQ(n.R),0),34),n._,t8n,null,0,1,qOt,!1,!1,!0,!1,!0,!1),z0(n.S,LOt,"EObject",!1,!1,!0),fin(BB(Wtn(VQ(n.S),0),59),n.o,"eClass"),fin(BB(Wtn(VQ(n.S),1),59),n.e,"eIsProxy"),fin(BB(Wtn(VQ(n.S),2),59),n.X,"eResource"),fin(BB(Wtn(VQ(n.S),3),59),n.S,"eContainer"),fin(BB(Wtn(VQ(n.S),4),59),n.bb,"eContainingFeature"),fin(BB(Wtn(VQ(n.S),5),59),n.W,"eContainmentFeature"),u=fin(BB(Wtn(VQ(n.S),6),59),null,"eContents"),t=ZV(n.fb),e=ZV(n.S),f9((!t.d&&(t.d=new $L(VAt,t,1)),t.d),e),(r=HTn(u,t,null))&&r.Fi(),u=fin(BB(Wtn(VQ(n.S),7),59),null,"eAllContents"),t=ZV(n.cb),e=ZV(n.S),f9((!t.d&&(t.d=new $L(VAt,t,1)),t.d),e),(c=HTn(u,t,null))&&c.Fi(),u=fin(BB(Wtn(VQ(n.S),8),59),null,"eCrossReferences"),t=ZV(n.fb),e=ZV(n.S),f9((!t.d&&(t.d=new $L(VAt,t,1)),t.d),e),(a=HTn(u,t,null))&&a.Fi(),$yn(u=fin(BB(Wtn(VQ(n.S),9),59),n.M,"eGet"),n.bb,t7n),$yn(u=fin(BB(Wtn(VQ(n.S),10),59),n.M,"eGet"),n.bb,t7n),$yn(u,n.e,"resolve"),$yn(u=fin(BB(Wtn(VQ(n.S),11),59),null,"eSet"),n.bb,t7n),$yn(u,n.M,"newValue"),$yn(u=fin(BB(Wtn(VQ(n.S),12),59),n.e,"eIsSet"),n.bb,t7n),$yn(u=fin(BB(Wtn(VQ(n.S),13),59),null,"eUnset"),n.bb,t7n),$yn(u=fin(BB(Wtn(VQ(n.S),14),59),n.M,"eInvoke"),n.T,i7n),t=ZV(n.fb),e=s2(),f9((!t.d&&(t.d=new $L(VAt,t,1)),t.d),e),Ujn(u,t,"arguments"),_W(u,n.K),z0(n.T,QAt,g9n,!1,!1,!0),Myn(BB(Wtn(QQ(n.T),0),18),n.o,BB(Wtn(QQ(n.o),3),18),o7n,0,1,QAt,!0,!1,!1,!1,!1,!1,!1),Myn(BB(Wtn(QQ(n.T),1),18),n.db,null,c7n,0,-1,QAt,!1,!1,!0,!0,!0,!1,!1),Myn(BB(Wtn(QQ(n.T),2),18),n.V,BB(Wtn(QQ(n.V),0),18),"eParameters",0,-1,QAt,!1,!1,!0,!0,!1,!1,!1),Myn(BB(Wtn(QQ(n.T),3),18),n.p,null,"eExceptions",0,-1,QAt,!1,!1,!0,!1,!0,!0,!1),Myn(BB(Wtn(QQ(n.T),4),18),n.H,null,"eGenericExceptions",0,-1,QAt,!1,!1,!0,!0,!1,!0,!1),fin(BB(Wtn(VQ(n.T),0),59),n.I,e7n),$yn(u=fin(BB(Wtn(VQ(n.T),1),59),n.e,"isOverrideOf"),n.T,"someOperation"),z0(n.U,GOt,"EPackage",!1,!1,!0),ucn(BB(Wtn(QQ(n.U),0),34),n._,"nsURI",null,0,1,GOt,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.U),1),34),n._,"nsPrefix",null,0,1,GOt,!1,!1,!0,!1,!0,!1),Myn(BB(Wtn(QQ(n.U),2),18),n.B,BB(Wtn(QQ(n.B),0),18),"eFactoryInstance",1,1,GOt,!0,!1,!0,!1,!1,!1,!1),Myn(BB(Wtn(QQ(n.U),3),18),n.p,BB(Wtn(QQ(n.p),4),18),"eClassifiers",0,-1,GOt,!1,!1,!0,!0,!0,!1,!1),Myn(BB(Wtn(QQ(n.U),4),18),n.U,BB(Wtn(QQ(n.U),5),18),"eSubpackages",0,-1,GOt,!1,!1,!0,!0,!0,!1,!1),Myn(BB(Wtn(QQ(n.U),5),18),n.U,BB(Wtn(QQ(n.U),4),18),"eSuperPackage",0,1,GOt,!0,!1,!1,!1,!0,!1,!1),$yn(u=fin(BB(Wtn(VQ(n.U),0),59),n.p,"getEClassifier"),n._,t8n),z0(n.V,YAt,p9n,!1,!1,!0),Myn(BB(Wtn(QQ(n.V),0),18),n.T,BB(Wtn(QQ(n.T),2),18),"eOperation",0,1,YAt,!0,!1,!1,!1,!1,!1,!1),z0(n.W,JAt,v9n,!1,!1,!0),ucn(BB(Wtn(QQ(n.W),0),34),n.e,"containment",null,0,1,JAt,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.W),1),34),n.e,"container",null,0,1,JAt,!0,!0,!1,!1,!0,!0),ucn(BB(Wtn(QQ(n.W),2),34),n.e,"resolveProxies",a5n,0,1,JAt,!1,!1,!0,!1,!0,!1),Myn(BB(Wtn(QQ(n.W),3),18),n.W,null,"eOpposite",0,1,JAt,!1,!1,!0,!1,!0,!1,!1),Myn(BB(Wtn(QQ(n.W),4),18),n.o,null,"eReferenceType",1,1,JAt,!0,!0,!1,!1,!0,!1,!0),Myn(BB(Wtn(QQ(n.W),5),18),n.b,null,"eKeys",0,-1,JAt,!1,!1,!0,!1,!0,!1,!1),z0(n.bb,FAt,f9n,!0,!1,!0),ucn(BB(Wtn(QQ(n.bb),0),34),n.e,"changeable",a5n,0,1,FAt,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.bb),1),34),n.e,"volatile",null,0,1,FAt,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.bb),2),34),n.e,"transient",null,0,1,FAt,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.bb),3),34),n._,"defaultValueLiteral",null,0,1,FAt,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.bb),4),34),n.M,r7n,null,0,1,FAt,!0,!0,!1,!1,!0,!0),ucn(BB(Wtn(QQ(n.bb),5),34),n.e,"unsettable",null,0,1,FAt,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.bb),6),34),n.e,"derived",null,0,1,FAt,!1,!1,!0,!1,!0,!1),Myn(BB(Wtn(QQ(n.bb),7),18),n.o,BB(Wtn(QQ(n.o),13),18),o7n,0,1,FAt,!0,!1,!1,!1,!1,!1,!1),fin(BB(Wtn(VQ(n.bb),0),59),n.I,n7n),u=fin(BB(Wtn(VQ(n.bb),1),59),null,"getContainerClass"),t=ZV(n.L),e=s2(),f9((!t.d&&(t.d=new $L(VAt,t,1)),t.d),e),(i=HTn(u,t,null))&&i.Fi(),z0(n.eb,_At,h9n,!0,!1,!0),ucn(BB(Wtn(QQ(n.eb),0),34),n.e,"ordered",a5n,0,1,_At,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.eb),1),34),n.e,"unique",a5n,0,1,_At,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.eb),2),34),n.I,"lowerBound",null,0,1,_At,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.eb),3),34),n.I,"upperBound","1",0,1,_At,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.eb),4),34),n.e,"many",null,0,1,_At,!0,!0,!1,!1,!0,!0),ucn(BB(Wtn(QQ(n.eb),5),34),n.e,"required",null,0,1,_At,!0,!0,!1,!1,!0,!0),Myn(BB(Wtn(QQ(n.eb),6),18),n.p,null,"eType",0,1,_At,!1,!0,!0,!1,!0,!0,!1),Myn(BB(Wtn(QQ(n.eb),7),18),n.H,null,"eGenericType",0,1,_At,!1,!0,!0,!0,!1,!0,!1),z0(n.ab,Hnt,"EStringToStringMapEntry",!1,!1,!1),ucn(BB(Wtn(QQ(n.ab),0),34),n._,"key",null,0,1,Hnt,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.ab),1),34),n._,E6n,null,0,1,Hnt,!1,!1,!0,!1,!0,!1),z0(n.H,VAt,d9n,!1,!1,!0),Myn(BB(Wtn(QQ(n.H),0),18),n.H,null,"eUpperBound",0,1,VAt,!1,!1,!0,!0,!1,!1,!1),Myn(BB(Wtn(QQ(n.H),1),18),n.H,null,"eTypeArguments",0,-1,VAt,!1,!1,!0,!0,!1,!1,!1),Myn(BB(Wtn(QQ(n.H),2),18),n.p,null,"eRawType",1,1,VAt,!0,!1,!1,!1,!0,!1,!0),Myn(BB(Wtn(QQ(n.H),3),18),n.H,null,"eLowerBound",0,1,VAt,!1,!1,!0,!0,!1,!1,!1),Myn(BB(Wtn(QQ(n.H),4),18),n.db,null,"eTypeParameter",0,1,VAt,!1,!1,!0,!1,!1,!1,!1),Myn(BB(Wtn(QQ(n.H),5),18),n.p,null,"eClassifier",0,1,VAt,!1,!1,!0,!1,!0,!1,!1),$yn(u=fin(BB(Wtn(VQ(n.H),0),59),n.e,a7n),n.M,AWn),z0(n.db,O$t,m9n,!1,!1,!0),Myn(BB(Wtn(QQ(n.db),0),18),n.H,null,"eBounds",0,-1,O$t,!1,!1,!0,!0,!1,!1,!1),dV(n.c,iet,"EBigDecimal",!0),dV(n.d,oet,"EBigInteger",!0),dV(n.e,$Nt,"EBoolean",!0),dV(n.f,ktt,"EBooleanObject",!0),dV(n.i,NNt,"EByte",!0),dV(n.g,Gk(NNt,1),"EByteArray",!0),dV(n.j,Ttt,"EByteObject",!0),dV(n.k,ONt,"EChar",!0),dV(n.n,Stt,"ECharacterObject",!0),dV(n.r,mtt,"EDate",!0),dV(n.s,_Nt,"EDiagnosticChain",!1),dV(n.t,xNt,"EDouble",!0),dV(n.u,Ptt,"EDoubleObject",!0),dV(n.fb,uAt,"EEList",!1),dV(n.A,yAt,"EEnumerator",!1),dV(n.C,oLt,"EFeatureMap",!1),dV(n.D,$$t,"EFeatureMapEntry",!1),dV(n.F,DNt,"EFloat",!0),dV(n.G,Ctt,"EFloatObject",!0),dV(n.I,ANt,"EInt",!0),dV(n.J,Att,"EIntegerObject",!0),dV(n.L,$nt,"EJavaClass",!0),dV(n.M,Ant,"EJavaObject",!0),dV(n.N,LNt,"ELong",!0),dV(n.O,Rtt,"ELongObject",!0),dV(n.P,Nnt,"EMap",!1),dV(n.X,iLt,"EResource",!1),dV(n.Y,FNt,"EResourceSet",!1),dV(n.Z,RNt,"EShort",!0),dV(n.$,_tt,"EShortObject",!0),dV(n._,Qtt,"EString",!0),dV(n.cb,sAt,"ETreeIterator",!1),dV(n.K,BNt,"EInvocationTargetException",!1),Lhn(n,V9n))}"undefined"!=typeof window?e=window:void 0!==n?e=n:"undefined"!=typeof self&&(e=self);var MWn,SWn,PWn,CWn,IWn,OWn,AWn="object",$Wn="boolean",LWn="number",NWn="string",xWn="function",DWn=2147483647,RWn="java.lang",KWn={3:1},_Wn="com.google.common.base",FWn=", ",BWn="%s (%s) must not be negative",HWn={3:1,4:1,5:1},qWn="negative size: ",GWn="Optional.of(",zWn="null",UWn={198:1,47:1},XWn="com.google.common.collect",WWn={198:1,47:1,125:1},VWn={224:1,3:1},QWn={47:1},YWn="java.util",JWn={83:1},ZWn={20:1,28:1,14:1},nVn=1965,tVn={20:1,28:1,14:1,21:1},eVn={83:1,171:1,161:1},iVn={20:1,28:1,14:1,21:1,84:1},rVn={20:1,28:1,14:1,271:1,21:1,84:1},cVn={47:1,125:1},aVn={345:1,42:1},uVn="AbstractMapEntry",oVn="expectedValuesPerKey",sVn={3:1,6:1,4:1,5:1},hVn=16384,fVn={164:1},lVn={38:1},bVn={l:4194303,m:4194303,h:524287},wVn={196:1},dVn={245:1,3:1,35:1},gVn="range unbounded on this side",pVn={20:1},vVn={20:1,14:1},mVn={3:1,20:1,28:1,14:1},yVn={152:1,3:1,20:1,28:1,14:1,15:1,54:1},kVn={3:1,4:1,5:1,165:1},jVn={3:1,83:1},EVn={20:1,14:1,21:1},TVn={3:1,20:1,28:1,14:1,21:1},MVn={20:1,14:1,21:1,84:1},SVn=461845907,PVn=-862048943,CVn={3:1,6:1,4:1,5:1,165:1},IVn="expectedSize",OVn=1073741824,AVn="initialArraySize",$Vn={3:1,6:1,4:1,9:1,5:1},LVn={20:1,28:1,52:1,14:1,15:1},NVn="arraySize",xVn={20:1,28:1,52:1,14:1,15:1,54:1},DVn={45:1},RVn={365:1},KVn=1e-4,_Vn=-2147483648,FVn="__noinit__",BVn={3:1,102:1,60:1,78:1},HVn="com.google.gwt.core.client.impl",qVn="String",GVn="com.google.gwt.core.client",zVn="anonymous",UVn="fnStack",XVn="Unknown",WVn={195:1,3:1,4:1},VVn=1e3,QVn=65535,YVn="January",JVn="February",ZVn="March",nQn="April",tQn="May",eQn="June",iQn="July",rQn="August",cQn="September",aQn="October",uQn="November",oQn="December",sQn=1900,hQn={48:1,3:1,4:1},fQn="Before Christ",lQn="Anno Domini",bQn="Sunday",wQn="Monday",dQn="Tuesday",gQn="Wednesday",pQn="Thursday",vQn="Friday",mQn="Saturday",yQn="com.google.gwt.i18n.shared",kQn="DateTimeFormat",jQn="com.google.gwt.i18n.client",EQn="DefaultDateTimeFormatInfo",TQn={3:1,4:1,35:1,199:1},MQn="com.google.gwt.json.client",SQn=4194303,PQn=1048575,CQn=524288,IQn=4194304,OQn=17592186044416,AQn=1e9,$Qn=-17592186044416,LQn="java.io",NQn={3:1,102:1,73:1,60:1,78:1},xQn={3:1,289:1,78:1},DQn='For input string: "',RQn=1/0,KQn=-1/0,_Qn=4096,FQn={3:1,4:1,364:1},BQn=65536,HQn=55296,qQn={104:1,3:1,4:1},GQn=1e5,zQn=.3010299956639812,UQn=4294967295,XQn=4294967296,WQn="0.0",VQn={42:1},QQn={3:1,4:1,20:1,28:1,52:1,12:1,14:1,15:1,54:1},YQn={3:1,20:1,28:1,52:1,14:1,15:1,54:1},JQn={20:1,14:1,15:1},ZQn={3:1,62:1},nYn={182:1},tYn={3:1,4:1,83:1},eYn={3:1,4:1,20:1,28:1,14:1,53:1,21:1},iYn="delete",rYn=1.4901161193847656e-8,cYn=11102230246251565e-32,aYn=15525485,uYn=5.960464477539063e-8,oYn=16777216,sYn=16777215,hYn=", length: ",fYn={3:1,4:1,20:1,28:1,52:1,14:1,15:1,54:1},lYn={3:1,35:1,22:1,297:1},bYn="java.util.function",wYn="java.util.logging",dYn={3:1,4:1,5:1,842:1},gYn="undefined",pYn="java.util.stream",vYn={525:1,670:1},mYn="fromIndex: ",yYn=" > toIndex: ",kYn=", toIndex: ",jYn="Index: ",EYn=", Size: ",TYn="org.eclipse.elk.alg.common",MYn={62:1},SYn="org.eclipse.elk.alg.common.compaction",PYn="Scanline/EventHandler",CYn="org.eclipse.elk.alg.common.compaction.oned",IYn="CNode belongs to another CGroup.",OYn="ISpacingsHandler/1",AYn="The ",$Yn=" instance has been finished already.",LYn="The direction ",NYn=" is not supported by the CGraph instance.",xYn="OneDimensionalCompactor",DYn="OneDimensionalCompactor/lambda$0$Type",RYn="Quadruplet",KYn="ScanlineConstraintCalculator",_Yn="ScanlineConstraintCalculator/ConstraintsScanlineHandler",FYn="ScanlineConstraintCalculator/ConstraintsScanlineHandler/lambda$0$Type",BYn="ScanlineConstraintCalculator/Timestamp",HYn="ScanlineConstraintCalculator/lambda$0$Type",qYn={169:1,45:1},GYn="org.eclipse.elk.alg.common.compaction.options",zYn="org.eclipse.elk.core.data",UYn="org.eclipse.elk.polyomino.traversalStrategy",XYn="org.eclipse.elk.polyomino.lowLevelSort",WYn="org.eclipse.elk.polyomino.highLevelSort",VYn="org.eclipse.elk.polyomino.fill",QYn={130:1},YYn="polyomino",JYn="org.eclipse.elk.alg.common.networksimplex",ZYn={177:1,3:1,4:1},nJn="org.eclipse.elk.alg.common.nodespacing",tJn="org.eclipse.elk.alg.common.nodespacing.cellsystem",eJn="CENTER",iJn={212:1,326:1},rJn={3:1,4:1,5:1,595:1},cJn="LEFT",aJn="RIGHT",uJn="Vertical alignment cannot be null",oJn="BOTTOM",sJn="org.eclipse.elk.alg.common.nodespacing.internal",hJn="UNDEFINED",fJn=.01,lJn="org.eclipse.elk.alg.common.nodespacing.internal.algorithm",bJn="LabelPlacer/lambda$0$Type",wJn="LabelPlacer/lambda$1$Type",dJn="portRatioOrPosition",gJn="org.eclipse.elk.alg.common.overlaps",pJn="DOWN",vJn="org.eclipse.elk.alg.common.polyomino",mJn="NORTH",yJn="EAST",kJn="SOUTH",jJn="WEST",EJn="org.eclipse.elk.alg.common.polyomino.structures",TJn="Direction",MJn="Grid is only of size ",SJn=". Requested point (",PJn=") is out of bounds.",CJn=" Given center based coordinates were (",IJn="org.eclipse.elk.graph.properties",OJn="IPropertyHolder",AJn={3:1,94:1,134:1},$Jn="org.eclipse.elk.alg.common.spore",LJn="org.eclipse.elk.alg.common.utils",NJn={209:1},xJn="org.eclipse.elk.core",DJn="Connected Components Compaction",RJn="org.eclipse.elk.alg.disco",KJn="org.eclipse.elk.alg.disco.graph",_Jn="org.eclipse.elk.alg.disco.options",FJn="CompactionStrategy",BJn="org.eclipse.elk.disco.componentCompaction.strategy",HJn="org.eclipse.elk.disco.componentCompaction.componentLayoutAlgorithm",qJn="org.eclipse.elk.disco.debug.discoGraph",GJn="org.eclipse.elk.disco.debug.discoPolys",zJn="componentCompaction",UJn="org.eclipse.elk.disco",XJn="org.eclipse.elk.spacing.componentComponent",WJn="org.eclipse.elk.edge.thickness",VJn="org.eclipse.elk.aspectRatio",QJn="org.eclipse.elk.padding",YJn="org.eclipse.elk.alg.disco.transform",JJn=1.5707963267948966,ZJn=17976931348623157e292,nZn={3:1,4:1,5:1,192:1},tZn={3:1,6:1,4:1,5:1,106:1,120:1},eZn="org.eclipse.elk.alg.force",iZn="ComponentsProcessor",rZn="ComponentsProcessor/1",cZn="org.eclipse.elk.alg.force.graph",aZn="Component Layout",uZn="org.eclipse.elk.alg.force.model",oZn="org.eclipse.elk.force.model",sZn="org.eclipse.elk.force.iterations",hZn="org.eclipse.elk.force.repulsivePower",fZn="org.eclipse.elk.force.temperature",lZn=.001,bZn="org.eclipse.elk.force.repulsion",wZn="org.eclipse.elk.alg.force.options",dZn=1.600000023841858,gZn="org.eclipse.elk.force",pZn="org.eclipse.elk.priority",vZn="org.eclipse.elk.spacing.nodeNode",mZn="org.eclipse.elk.spacing.edgeLabel",yZn="org.eclipse.elk.randomSeed",kZn="org.eclipse.elk.separateConnectedComponents",jZn="org.eclipse.elk.interactive",EZn="org.eclipse.elk.portConstraints",TZn="org.eclipse.elk.edgeLabels.inline",MZn="org.eclipse.elk.omitNodeMicroLayout",SZn="org.eclipse.elk.nodeSize.options",PZn="org.eclipse.elk.nodeSize.constraints",CZn="org.eclipse.elk.nodeLabels.placement",IZn="org.eclipse.elk.portLabels.placement",OZn="origin",AZn="random",$Zn="boundingBox.upLeft",LZn="boundingBox.lowRight",NZn="org.eclipse.elk.stress.fixed",xZn="org.eclipse.elk.stress.desiredEdgeLength",DZn="org.eclipse.elk.stress.dimension",RZn="org.eclipse.elk.stress.epsilon",KZn="org.eclipse.elk.stress.iterationLimit",_Zn="org.eclipse.elk.stress",FZn="ELK Stress",BZn="org.eclipse.elk.nodeSize.minimum",HZn="org.eclipse.elk.alg.force.stress",qZn="Layered layout",GZn="org.eclipse.elk.alg.layered",zZn="org.eclipse.elk.alg.layered.compaction.components",UZn="org.eclipse.elk.alg.layered.compaction.oned",XZn="org.eclipse.elk.alg.layered.compaction.oned.algs",WZn="org.eclipse.elk.alg.layered.compaction.recthull",VZn="org.eclipse.elk.alg.layered.components",QZn="NONE",YZn={3:1,6:1,4:1,9:1,5:1,122:1},JZn={3:1,6:1,4:1,5:1,141:1,106:1,120:1},ZZn="org.eclipse.elk.alg.layered.compound",n1n={51:1},t1n="org.eclipse.elk.alg.layered.graph",e1n=" -> ",i1n="Not supported by LGraph",r1n="Port side is undefined",c1n={3:1,6:1,4:1,5:1,474:1,141:1,106:1,120:1},a1n={3:1,6:1,4:1,5:1,141:1,193:1,203:1,106:1,120:1},u1n={3:1,6:1,4:1,5:1,141:1,1943:1,203:1,106:1,120:1},o1n="([{\"' \t\r\n",s1n=")]}\"' \t\r\n",h1n="The given string contains parts that cannot be parsed as numbers.",f1n="org.eclipse.elk.core.math",l1n={3:1,4:1,142:1,207:1,414:1},b1n={3:1,4:1,116:1,207:1,414:1},w1n="org.eclipse.elk.layered",d1n="org.eclipse.elk.alg.layered.graph.transform",g1n="ElkGraphImporter",p1n="ElkGraphImporter/lambda$0$Type",v1n="ElkGraphImporter/lambda$1$Type",m1n="ElkGraphImporter/lambda$2$Type",y1n="ElkGraphImporter/lambda$4$Type",k1n="Node margin calculation",j1n="org.eclipse.elk.alg.layered.intermediate",E1n="ONE_SIDED_GREEDY_SWITCH",T1n="TWO_SIDED_GREEDY_SWITCH",M1n="No implementation is available for the layout processor ",S1n="IntermediateProcessorStrategy",P1n="Node '",C1n="FIRST_SEPARATE",I1n="LAST_SEPARATE",O1n="Odd port side processing",A1n="org.eclipse.elk.alg.layered.intermediate.compaction",$1n="org.eclipse.elk.alg.layered.intermediate.greedyswitch",L1n="org.eclipse.elk.alg.layered.p3order.counting",N1n={225:1},x1n="org.eclipse.elk.alg.layered.intermediate.loops",D1n="org.eclipse.elk.alg.layered.intermediate.loops.ordering",R1n="org.eclipse.elk.alg.layered.intermediate.loops.routing",K1n="org.eclipse.elk.alg.layered.intermediate.preserveorder",_1n="org.eclipse.elk.alg.layered.intermediate.wrapping",F1n="org.eclipse.elk.alg.layered.options",B1n="INTERACTIVE",H1n="DEPTH_FIRST",q1n="EDGE_LENGTH",G1n="SELF_LOOPS",z1n="firstTryWithInitialOrder",U1n="org.eclipse.elk.layered.directionCongruency",X1n="org.eclipse.elk.layered.feedbackEdges",W1n="org.eclipse.elk.layered.interactiveReferencePoint",V1n="org.eclipse.elk.layered.mergeEdges",Q1n="org.eclipse.elk.layered.mergeHierarchyEdges",Y1n="org.eclipse.elk.layered.allowNonFlowPortsToSwitchSides",J1n="org.eclipse.elk.layered.portSortingStrategy",Z1n="org.eclipse.elk.layered.thoroughness",n0n="org.eclipse.elk.layered.unnecessaryBendpoints",t0n="org.eclipse.elk.layered.generatePositionAndLayerIds",e0n="org.eclipse.elk.layered.cycleBreaking.strategy",i0n="org.eclipse.elk.layered.layering.strategy",r0n="org.eclipse.elk.layered.layering.layerConstraint",c0n="org.eclipse.elk.layered.layering.layerChoiceConstraint",a0n="org.eclipse.elk.layered.layering.layerId",u0n="org.eclipse.elk.layered.layering.minWidth.upperBoundOnWidth",o0n="org.eclipse.elk.layered.layering.minWidth.upperLayerEstimationScalingFactor",s0n="org.eclipse.elk.layered.layering.nodePromotion.strategy",h0n="org.eclipse.elk.layered.layering.nodePromotion.maxIterations",f0n="org.eclipse.elk.layered.layering.coffmanGraham.layerBound",l0n="org.eclipse.elk.layered.crossingMinimization.strategy",b0n="org.eclipse.elk.layered.crossingMinimization.forceNodeModelOrder",w0n="org.eclipse.elk.layered.crossingMinimization.hierarchicalSweepiness",d0n="org.eclipse.elk.layered.crossingMinimization.semiInteractive",g0n="org.eclipse.elk.layered.crossingMinimization.positionChoiceConstraint",p0n="org.eclipse.elk.layered.crossingMinimization.positionId",v0n="org.eclipse.elk.layered.crossingMinimization.greedySwitch.activationThreshold",m0n="org.eclipse.elk.layered.crossingMinimization.greedySwitch.type",y0n="org.eclipse.elk.layered.crossingMinimization.greedySwitchHierarchical.type",k0n="org.eclipse.elk.layered.nodePlacement.strategy",j0n="org.eclipse.elk.layered.nodePlacement.favorStraightEdges",E0n="org.eclipse.elk.layered.nodePlacement.bk.edgeStraightening",T0n="org.eclipse.elk.layered.nodePlacement.bk.fixedAlignment",M0n="org.eclipse.elk.layered.nodePlacement.linearSegments.deflectionDampening",S0n="org.eclipse.elk.layered.nodePlacement.networkSimplex.nodeFlexibility",P0n="org.eclipse.elk.layered.nodePlacement.networkSimplex.nodeFlexibility.default",C0n="org.eclipse.elk.layered.edgeRouting.selfLoopDistribution",I0n="org.eclipse.elk.layered.edgeRouting.selfLoopOrdering",O0n="org.eclipse.elk.layered.edgeRouting.splines.mode",A0n="org.eclipse.elk.layered.edgeRouting.splines.sloppy.layerSpacingFactor",$0n="org.eclipse.elk.layered.edgeRouting.polyline.slopedEdgeZoneWidth",L0n="org.eclipse.elk.layered.spacing.baseValue",N0n="org.eclipse.elk.layered.spacing.edgeNodeBetweenLayers",x0n="org.eclipse.elk.layered.spacing.edgeEdgeBetweenLayers",D0n="org.eclipse.elk.layered.spacing.nodeNodeBetweenLayers",R0n="org.eclipse.elk.layered.priority.direction",K0n="org.eclipse.elk.layered.priority.shortness",_0n="org.eclipse.elk.layered.priority.straightness",F0n="org.eclipse.elk.layered.compaction.connectedComponents",B0n="org.eclipse.elk.layered.compaction.postCompaction.strategy",H0n="org.eclipse.elk.layered.compaction.postCompaction.constraints",q0n="org.eclipse.elk.layered.highDegreeNodes.treatment",G0n="org.eclipse.elk.layered.highDegreeNodes.threshold",z0n="org.eclipse.elk.layered.highDegreeNodes.treeHeight",U0n="org.eclipse.elk.layered.wrapping.strategy",X0n="org.eclipse.elk.layered.wrapping.additionalEdgeSpacing",W0n="org.eclipse.elk.layered.wrapping.correctionFactor",V0n="org.eclipse.elk.layered.wrapping.cutting.strategy",Q0n="org.eclipse.elk.layered.wrapping.cutting.cuts",Y0n="org.eclipse.elk.layered.wrapping.cutting.msd.freedom",J0n="org.eclipse.elk.layered.wrapping.validify.strategy",Z0n="org.eclipse.elk.layered.wrapping.validify.forbiddenIndices",n2n="org.eclipse.elk.layered.wrapping.multiEdge.improveCuts",t2n="org.eclipse.elk.layered.wrapping.multiEdge.distancePenalty",e2n="org.eclipse.elk.layered.wrapping.multiEdge.improveWrappedEdges",i2n="org.eclipse.elk.layered.edgeLabels.sideSelection",r2n="org.eclipse.elk.layered.edgeLabels.centerLabelPlacementStrategy",c2n="org.eclipse.elk.layered.considerModelOrder.strategy",a2n="org.eclipse.elk.layered.considerModelOrder.noModelOrder",u2n="org.eclipse.elk.layered.considerModelOrder.components",o2n="org.eclipse.elk.layered.considerModelOrder.longEdgeStrategy",s2n="org.eclipse.elk.layered.considerModelOrder.crossingCounterNodeInfluence",h2n="org.eclipse.elk.layered.considerModelOrder.crossingCounterPortInfluence",f2n="layering",l2n="layering.minWidth",b2n="layering.nodePromotion",w2n="crossingMinimization",d2n="org.eclipse.elk.hierarchyHandling",g2n="crossingMinimization.greedySwitch",p2n="nodePlacement",v2n="nodePlacement.bk",m2n="edgeRouting",y2n="org.eclipse.elk.edgeRouting",k2n="spacing",j2n="priority",E2n="compaction",T2n="compaction.postCompaction",M2n="Specifies whether and how post-process compaction is applied.",S2n="highDegreeNodes",P2n="wrapping",C2n="wrapping.cutting",I2n="wrapping.validify",O2n="wrapping.multiEdge",A2n="edgeLabels",$2n="considerModelOrder",L2n="org.eclipse.elk.spacing.commentComment",N2n="org.eclipse.elk.spacing.commentNode",x2n="org.eclipse.elk.spacing.edgeEdge",D2n="org.eclipse.elk.spacing.edgeNode",R2n="org.eclipse.elk.spacing.labelLabel",K2n="org.eclipse.elk.spacing.labelPortHorizontal",_2n="org.eclipse.elk.spacing.labelPortVertical",F2n="org.eclipse.elk.spacing.labelNode",B2n="org.eclipse.elk.spacing.nodeSelfLoop",H2n="org.eclipse.elk.spacing.portPort",q2n="org.eclipse.elk.spacing.individual",G2n="org.eclipse.elk.port.borderOffset",z2n="org.eclipse.elk.noLayout",U2n="org.eclipse.elk.port.side",X2n="org.eclipse.elk.debugMode",W2n="org.eclipse.elk.alignment",V2n="org.eclipse.elk.insideSelfLoops.activate",Q2n="org.eclipse.elk.insideSelfLoops.yo",Y2n="org.eclipse.elk.nodeSize.fixedGraphSize",J2n="org.eclipse.elk.direction",Z2n="org.eclipse.elk.nodeLabels.padding",n3n="org.eclipse.elk.portLabels.nextToPortIfPossible",t3n="org.eclipse.elk.portLabels.treatAsGroup",e3n="org.eclipse.elk.portAlignment.default",i3n="org.eclipse.elk.portAlignment.north",r3n="org.eclipse.elk.portAlignment.south",c3n="org.eclipse.elk.portAlignment.west",a3n="org.eclipse.elk.portAlignment.east",u3n="org.eclipse.elk.contentAlignment",o3n="org.eclipse.elk.junctionPoints",s3n="org.eclipse.elk.edgeLabels.placement",h3n="org.eclipse.elk.port.index",f3n="org.eclipse.elk.commentBox",l3n="org.eclipse.elk.hypernode",b3n="org.eclipse.elk.port.anchor",w3n="org.eclipse.elk.partitioning.activate",d3n="org.eclipse.elk.partitioning.partition",g3n="org.eclipse.elk.position",p3n="org.eclipse.elk.margins",v3n="org.eclipse.elk.spacing.portsSurrounding",m3n="org.eclipse.elk.interactiveLayout",y3n="org.eclipse.elk.core.util",k3n={3:1,4:1,5:1,593:1},j3n="NETWORK_SIMPLEX",E3n={123:1,51:1},T3n="org.eclipse.elk.alg.layered.p1cycles",M3n="org.eclipse.elk.alg.layered.p2layers",S3n={402:1,225:1},P3n={832:1,3:1,4:1},C3n="org.eclipse.elk.alg.layered.p3order",I3n="org.eclipse.elk.alg.layered.p4nodes",O3n={3:1,4:1,5:1,840:1},A3n=1e-5,$3n="org.eclipse.elk.alg.layered.p4nodes.bk",L3n="org.eclipse.elk.alg.layered.p5edges",N3n="org.eclipse.elk.alg.layered.p5edges.orthogonal",x3n="org.eclipse.elk.alg.layered.p5edges.orthogonal.direction",D3n=1e-6,R3n="org.eclipse.elk.alg.layered.p5edges.splines",K3n=.09999999999999998,_3n=1e-8,F3n=4.71238898038469,B3n=3.141592653589793,H3n="org.eclipse.elk.alg.mrtree",q3n="org.eclipse.elk.alg.mrtree.graph",G3n="org.eclipse.elk.alg.mrtree.intermediate",z3n="Set neighbors in level",U3n="DESCENDANTS",X3n="org.eclipse.elk.mrtree.weighting",W3n="org.eclipse.elk.mrtree.searchOrder",V3n="org.eclipse.elk.alg.mrtree.options",Q3n="org.eclipse.elk.mrtree",Y3n="org.eclipse.elk.tree",J3n="org.eclipse.elk.alg.radial",Z3n=6.283185307179586,n4n=5e-324,t4n="org.eclipse.elk.alg.radial.intermediate",e4n="org.eclipse.elk.alg.radial.intermediate.compaction",i4n={3:1,4:1,5:1,106:1},r4n="org.eclipse.elk.alg.radial.intermediate.optimization",c4n="No implementation is available for the layout option ",a4n="org.eclipse.elk.alg.radial.options",u4n="org.eclipse.elk.radial.orderId",o4n="org.eclipse.elk.radial.radius",s4n="org.eclipse.elk.radial.compactor",h4n="org.eclipse.elk.radial.compactionStepSize",f4n="org.eclipse.elk.radial.sorter",l4n="org.eclipse.elk.radial.wedgeCriteria",b4n="org.eclipse.elk.radial.optimizationCriteria",w4n="org.eclipse.elk.radial",d4n="org.eclipse.elk.alg.radial.p1position.wedge",g4n="org.eclipse.elk.alg.radial.sorting",p4n=5.497787143782138,v4n=3.9269908169872414,m4n=2.356194490192345,y4n="org.eclipse.elk.alg.rectpacking",k4n="org.eclipse.elk.alg.rectpacking.firstiteration",j4n="org.eclipse.elk.alg.rectpacking.options",E4n="org.eclipse.elk.rectpacking.optimizationGoal",T4n="org.eclipse.elk.rectpacking.lastPlaceShift",M4n="org.eclipse.elk.rectpacking.currentPosition",S4n="org.eclipse.elk.rectpacking.desiredPosition",P4n="org.eclipse.elk.rectpacking.onlyFirstIteration",C4n="org.eclipse.elk.rectpacking.rowCompaction",I4n="org.eclipse.elk.rectpacking.expandToAspectRatio",O4n="org.eclipse.elk.rectpacking.targetWidth",A4n="org.eclipse.elk.expandNodes",$4n="org.eclipse.elk.rectpacking",L4n="org.eclipse.elk.alg.rectpacking.util",N4n="No implementation available for ",x4n="org.eclipse.elk.alg.spore",D4n="org.eclipse.elk.alg.spore.options",R4n="org.eclipse.elk.sporeCompaction",K4n="org.eclipse.elk.underlyingLayoutAlgorithm",_4n="org.eclipse.elk.processingOrder.treeConstruction",F4n="org.eclipse.elk.processingOrder.spanningTreeCostFunction",B4n="org.eclipse.elk.processingOrder.preferredRoot",H4n="org.eclipse.elk.processingOrder.rootSelection",q4n="org.eclipse.elk.structure.structureExtractionStrategy",G4n="org.eclipse.elk.compaction.compactionStrategy",z4n="org.eclipse.elk.compaction.orthogonal",U4n="org.eclipse.elk.overlapRemoval.maxIterations",X4n="org.eclipse.elk.overlapRemoval.runScanline",W4n="processingOrder",V4n="overlapRemoval",Q4n="org.eclipse.elk.sporeOverlap",Y4n="org.eclipse.elk.alg.spore.p1structure",J4n="org.eclipse.elk.alg.spore.p2processingorder",Z4n="org.eclipse.elk.alg.spore.p3execution",n5n="Invalid index: ",t5n="org.eclipse.elk.core.alg",e5n={331:1},i5n={288:1},r5n="Make sure its type is registered with the ",c5n=" utility class.",a5n="true",u5n="false",o5n="Couldn't clone property '",s5n=.05,h5n="org.eclipse.elk.core.options",f5n=1.2999999523162842,l5n="org.eclipse.elk.box",b5n="org.eclipse.elk.box.packingMode",w5n="org.eclipse.elk.algorithm",d5n="org.eclipse.elk.resolvedAlgorithm",g5n="org.eclipse.elk.bendPoints",p5n="org.eclipse.elk.labelManager",v5n="org.eclipse.elk.scaleFactor",m5n="org.eclipse.elk.animate",y5n="org.eclipse.elk.animTimeFactor",k5n="org.eclipse.elk.layoutAncestors",j5n="org.eclipse.elk.maxAnimTime",E5n="org.eclipse.elk.minAnimTime",T5n="org.eclipse.elk.progressBar",M5n="org.eclipse.elk.validateGraph",S5n="org.eclipse.elk.validateOptions",P5n="org.eclipse.elk.zoomToFit",C5n="org.eclipse.elk.font.name",I5n="org.eclipse.elk.font.size",O5n="org.eclipse.elk.edge.type",A5n="partitioning",$5n="nodeLabels",L5n="portAlignment",N5n="nodeSize",x5n="port",D5n="portLabels",R5n="insideSelfLoops",K5n="org.eclipse.elk.fixed",_5n="org.eclipse.elk.random",F5n="port must have a parent node to calculate the port side",B5n="The edge needs to have exactly one edge section. Found: ",H5n="org.eclipse.elk.core.util.adapters",q5n="org.eclipse.emf.ecore",G5n="org.eclipse.elk.graph",z5n="EMapPropertyHolder",U5n="ElkBendPoint",X5n="ElkGraphElement",W5n="ElkConnectableShape",V5n="ElkEdge",Q5n="ElkEdgeSection",Y5n="EModelElement",J5n="ENamedElement",Z5n="ElkLabel",n6n="ElkNode",t6n="ElkPort",e6n={92:1,90:1},i6n="org.eclipse.emf.common.notify.impl",r6n="The feature '",c6n="' is not a valid changeable feature",a6n="Expecting null",u6n="' is not a valid feature",o6n="The feature ID",s6n=" is not a valid feature ID",h6n=32768,f6n={105:1,92:1,90:1,56:1,49:1,97:1},l6n="org.eclipse.emf.ecore.impl",b6n="org.eclipse.elk.graph.impl",w6n="Recursive containment not allowed for ",d6n="The datatype '",g6n="' is not a valid classifier",p6n="The value '",v6n={190:1,3:1,4:1},m6n="The class '",y6n="http://www.eclipse.org/elk/ElkGraph",k6n=1024,j6n="property",E6n="value",T6n="source",M6n="properties",S6n="identifier",P6n="height",C6n="width",I6n="parent",O6n="text",A6n="children",$6n="hierarchical",L6n="sources",N6n="targets",x6n="sections",D6n="bendPoints",R6n="outgoingShape",K6n="incomingShape",_6n="outgoingSections",F6n="incomingSections",B6n="org.eclipse.emf.common.util",H6n="Severe implementation error in the Json to ElkGraph importer.",q6n="id",G6n="org.eclipse.elk.graph.json",z6n="Unhandled parameter types: ",U6n="startPoint",X6n="An edge must have at least one source and one target (edge id: '",W6n="').",V6n="Referenced edge section does not exist: ",Q6n=" (edge id: '",Y6n="target",J6n="sourcePoint",Z6n="targetPoint",n8n="group",t8n="name",e8n="connectableShape cannot be null",i8n="edge cannot be null",r8n="Passed edge is not 'simple'.",c8n="org.eclipse.elk.graph.util",a8n="The 'no duplicates' constraint is violated",u8n="targetIndex=",o8n=", size=",s8n="sourceIndex=",h8n={3:1,4:1,20:1,28:1,52:1,14:1,15:1,54:1,67:1,63:1,58:1},f8n={3:1,4:1,20:1,28:1,52:1,14:1,47:1,15:1,54:1,67:1,63:1,58:1,588:1},l8n="logging",b8n="measureExecutionTime",w8n="parser.parse.1",d8n="parser.parse.2",g8n="parser.next.1",p8n="parser.next.2",v8n="parser.next.3",m8n="parser.next.4",y8n="parser.factor.1",k8n="parser.factor.2",j8n="parser.factor.3",E8n="parser.factor.4",T8n="parser.factor.5",M8n="parser.factor.6",S8n="parser.atom.1",P8n="parser.atom.2",C8n="parser.atom.3",I8n="parser.atom.4",O8n="parser.atom.5",A8n="parser.cc.1",$8n="parser.cc.2",L8n="parser.cc.3",N8n="parser.cc.5",x8n="parser.cc.6",D8n="parser.cc.7",R8n="parser.cc.8",K8n="parser.ope.1",_8n="parser.ope.2",F8n="parser.ope.3",B8n="parser.descape.1",H8n="parser.descape.2",q8n="parser.descape.3",G8n="parser.descape.4",z8n="parser.descape.5",U8n="parser.process.1",X8n="parser.quantifier.1",W8n="parser.quantifier.2",V8n="parser.quantifier.3",Q8n="parser.quantifier.4",Y8n="parser.quantifier.5",J8n="org.eclipse.emf.common.notify",Z8n={415:1,672:1},n9n={3:1,4:1,20:1,28:1,52:1,14:1,15:1,67:1,58:1},t9n={366:1,143:1},e9n="index=",i9n={3:1,4:1,5:1,126:1},r9n={3:1,4:1,20:1,28:1,52:1,14:1,15:1,54:1,67:1,58:1},c9n={3:1,6:1,4:1,5:1,192:1},a9n={3:1,4:1,5:1,165:1,367:1},u9n=";/?:@&=+$,",o9n="invalid authority: ",s9n="EAnnotation",h9n="ETypedElement",f9n="EStructuralFeature",l9n="EAttribute",b9n="EClassifier",w9n="EEnumLiteral",d9n="EGenericType",g9n="EOperation",p9n="EParameter",v9n="EReference",m9n="ETypeParameter",y9n="org.eclipse.emf.ecore.util",k9n={76:1},j9n={3:1,20:1,14:1,15:1,58:1,589:1,76:1,69:1,95:1},E9n="org.eclipse.emf.ecore.util.FeatureMap$Entry",T9n=8192,M9n=2048,S9n="byte",P9n="char",C9n="double",I9n="float",O9n="int",A9n="long",$9n="short",L9n="java.lang.Object",N9n={3:1,4:1,5:1,247:1},x9n={3:1,4:1,5:1,673:1},D9n={3:1,4:1,20:1,28:1,52:1,14:1,15:1,54:1,67:1,63:1,58:1,69:1},R9n={3:1,4:1,20:1,28:1,52:1,14:1,15:1,54:1,67:1,63:1,58:1,76:1,69:1,95:1},K9n="mixed",_9n="http:///org/eclipse/emf/ecore/util/ExtendedMetaData",F9n="kind",B9n={3:1,4:1,5:1,674:1},H9n={3:1,4:1,20:1,28:1,52:1,14:1,15:1,67:1,58:1,76:1,69:1,95:1},q9n={20:1,28:1,52:1,14:1,15:1,58:1,69:1},G9n={47:1,125:1,279:1},z9n={72:1,332:1},U9n="The value of type '",X9n="' must be of type '",W9n=1316,V9n="http://www.eclipse.org/emf/2002/Ecore",Q9n=-32768,Y9n="constraints",J9n="baseType",Z9n="getEStructuralFeature",n7n="getFeatureID",t7n="feature",e7n="getOperationID",i7n="operation",r7n="defaultValue",c7n="eTypeParameters",a7n="isInstance",u7n="getEEnumLiteral",o7n="eContainingClass",s7n={55:1},h7n={3:1,4:1,5:1,119:1},f7n="org.eclipse.emf.ecore.resource",l7n={92:1,90:1,591:1,1935:1},b7n="org.eclipse.emf.ecore.resource.impl",w7n="unspecified",d7n="simple",g7n="attribute",p7n="attributeWildcard",v7n="element",m7n="elementWildcard",y7n="collapse",k7n="itemType",j7n="namespace",E7n="##targetNamespace",T7n="whiteSpace",M7n="wildcards",S7n="http://www.eclipse.org/emf/2003/XMLType",P7n="##any",C7n="uninitialized",I7n="The multiplicity constraint is violated",O7n="org.eclipse.emf.ecore.xml.type",A7n="ProcessingInstruction",$7n="SimpleAnyType",L7n="XMLTypeDocumentRoot",N7n="org.eclipse.emf.ecore.xml.type.impl",x7n="INF",D7n="processing",R7n="ENTITIES_._base",K7n="minLength",_7n="ENTITY",F7n="NCName",B7n="IDREFS_._base",H7n="integer",q7n="token",G7n="pattern",z7n="[a-zA-Z]{1,8}(-[a-zA-Z0-9]{1,8})*",U7n="\\i\\c*",X7n="[\\i-[:]][\\c-[:]]*",W7n="nonPositiveInteger",V7n="maxInclusive",Q7n="NMTOKEN",Y7n="NMTOKENS_._base",J7n="nonNegativeInteger",Z7n="minInclusive",nnt="normalizedString",tnt="unsignedByte",ent="unsignedInt",int="18446744073709551615",rnt="unsignedShort",cnt="processingInstruction",ant="org.eclipse.emf.ecore.xml.type.internal",unt=1114111,ont="Internal Error: shorthands: \\u",snt="xml:isDigit",hnt="xml:isWord",fnt="xml:isSpace",lnt="xml:isNameChar",bnt="xml:isInitialNameChar",wnt="09\u0660\u0669\u06f0\u06f9\u0966\u096f\u09e6\u09ef\u0a66\u0a6f\u0ae6\u0aef\u0b66\u0b6f\u0be7\u0bef\u0c66\u0c6f\u0ce6\u0cef\u0d66\u0d6f\u0e50\u0e59\u0ed0\u0ed9\u0f20\u0f29",dnt="AZaz\xc0\xd6\xd8\xf6\xf8\u0131\u0134\u013e\u0141\u0148\u014a\u017e\u0180\u01c3\u01cd\u01f0\u01f4\u01f5\u01fa\u0217\u0250\u02a8\u02bb\u02c1\u0386\u0386\u0388\u038a\u038c\u038c\u038e\u03a1\u03a3\u03ce\u03d0\u03d6\u03da\u03da\u03dc\u03dc\u03de\u03de\u03e0\u03e0\u03e2\u03f3\u0401\u040c\u040e\u044f\u0451\u045c\u045e\u0481\u0490\u04c4\u04c7\u04c8\u04cb\u04cc\u04d0\u04eb\u04ee\u04f5\u04f8\u04f9\u0531\u0556\u0559\u0559\u0561\u0586\u05d0\u05ea\u05f0\u05f2\u0621\u063a\u0641\u064a\u0671\u06b7\u06ba\u06be\u06c0\u06ce\u06d0\u06d3\u06d5\u06d5\u06e5\u06e6\u0905\u0939\u093d\u093d\u0958\u0961\u0985\u098c\u098f\u0990\u0993\u09a8\u09aa\u09b0\u09b2\u09b2\u09b6\u09b9\u09dc\u09dd\u09df\u09e1\u09f0\u09f1\u0a05\u0a0a\u0a0f\u0a10\u0a13\u0a28\u0a2a\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59\u0a5c\u0a5e\u0a5e\u0a72\u0a74\u0a85\u0a8b\u0a8d\u0a8d\u0a8f\u0a91\u0a93\u0aa8\u0aaa\u0ab0\u0ab2\u0ab3\u0ab5\u0ab9\u0abd\u0abd\u0ae0\u0ae0\u0b05\u0b0c\u0b0f\u0b10\u0b13\u0b28\u0b2a\u0b30\u0b32\u0b33\u0b36\u0b39\u0b3d\u0b3d\u0b5c\u0b5d\u0b5f\u0b61\u0b85\u0b8a\u0b8e\u0b90\u0b92\u0b95\u0b99\u0b9a\u0b9c\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8\u0baa\u0bae\u0bb5\u0bb7\u0bb9\u0c05\u0c0c\u0c0e\u0c10\u0c12\u0c28\u0c2a\u0c33\u0c35\u0c39\u0c60\u0c61\u0c85\u0c8c\u0c8e\u0c90\u0c92\u0ca8\u0caa\u0cb3\u0cb5\u0cb9\u0cde\u0cde\u0ce0\u0ce1\u0d05\u0d0c\u0d0e\u0d10\u0d12\u0d28\u0d2a\u0d39\u0d60\u0d61\u0e01\u0e2e\u0e30\u0e30\u0e32\u0e33\u0e40\u0e45\u0e81\u0e82\u0e84\u0e84\u0e87\u0e88\u0e8a\u0e8a\u0e8d\u0e8d\u0e94\u0e97\u0e99\u0e9f\u0ea1\u0ea3\u0ea5\u0ea5\u0ea7\u0ea7\u0eaa\u0eab\u0ead\u0eae\u0eb0\u0eb0\u0eb2\u0eb3\u0ebd\u0ebd\u0ec0\u0ec4\u0f40\u0f47\u0f49\u0f69\u10a0\u10c5\u10d0\u10f6\u1100\u1100\u1102\u1103\u1105\u1107\u1109\u1109\u110b\u110c\u110e\u1112\u113c\u113c\u113e\u113e\u1140\u1140\u114c\u114c\u114e\u114e\u1150\u1150\u1154\u1155\u1159\u1159\u115f\u1161\u1163\u1163\u1165\u1165\u1167\u1167\u1169\u1169\u116d\u116e\u1172\u1173\u1175\u1175\u119e\u119e\u11a8\u11a8\u11ab\u11ab\u11ae\u11af\u11b7\u11b8\u11ba\u11ba\u11bc\u11c2\u11eb\u11eb\u11f0\u11f0\u11f9\u11f9\u1e00\u1e9b\u1ea0\u1ef9\u1f00\u1f15\u1f18\u1f1d\u1f20\u1f45\u1f48\u1f4d\u1f50\u1f57\u1f59\u1f59\u1f5b\u1f5b\u1f5d\u1f5d\u1f5f\u1f7d\u1f80\u1fb4\u1fb6\u1fbc\u1fbe\u1fbe\u1fc2\u1fc4\u1fc6\u1fcc\u1fd0\u1fd3\u1fd6\u1fdb\u1fe0\u1fec\u1ff2\u1ff4\u1ff6\u1ffc\u2126\u2126\u212a\u212b\u212e\u212e\u2180\u2182\u3007\u3007\u3021\u3029\u3041\u3094\u30a1\u30fa\u3105\u312c\u4e00\u9fa5\uac00\ud7a3",gnt="Private Use",pnt="ASSIGNED",vnt="\0\x7f\x80\xff\u0100\u017f\u0180\u024f\u0250\u02af\u02b0\u02ff\u0300\u036f\u0370\u03ff\u0400\u04ff\u0530\u058f\u0590\u05ff\u0600\u06ff\u0700\u074f\u0780\u07bf\u0900\u097f\u0980\u09ff\u0a00\u0a7f\u0a80\u0aff\u0b00\u0b7f\u0b80\u0bff\u0c00\u0c7f\u0c80\u0cff\u0d00\u0d7f\u0d80\u0dff\u0e00\u0e7f\u0e80\u0eff\u0f00\u0fff\u1000\u109f\u10a0\u10ff\u1100\u11ff\u1200\u137f\u13a0\u13ff\u1400\u167f\u1680\u169f\u16a0\u16ff\u1780\u17ff\u1800\u18af\u1e00\u1eff\u1f00\u1fff\u2000\u206f\u2070\u209f\u20a0\u20cf\u20d0\u20ff\u2100\u214f\u2150\u218f\u2190\u21ff\u2200\u22ff\u2300\u23ff\u2400\u243f\u2440\u245f\u2460\u24ff\u2500\u257f\u2580\u259f\u25a0\u25ff\u2600\u26ff\u2700\u27bf\u2800\u28ff\u2e80\u2eff\u2f00\u2fdf\u2ff0\u2fff\u3000\u303f\u3040\u309f\u30a0\u30ff\u3100\u312f\u3130\u318f\u3190\u319f\u31a0\u31bf\u3200\u32ff\u3300\u33ff\u3400\u4db5\u4e00\u9fff\ua000\ua48f\ua490\ua4cf\uac00\ud7a3\ue000\uf8ff\uf900\ufaff\ufb00\ufb4f\ufb50\ufdff\ufe20\ufe2f\ufe30\ufe4f\ufe50\ufe6f\ufe70\ufefe\ufeff\ufeff\uff00\uffef",mnt="UNASSIGNED",ynt={3:1,117:1},knt="org.eclipse.emf.ecore.xml.type.util",jnt={3:1,4:1,5:1,368:1},Ent="org.eclipse.xtext.xbase.lib",Tnt="Cannot add elements to a Range",Mnt="Cannot set elements in a Range",Snt="Cannot remove elements from a Range",Pnt="locale",Cnt="default",Int="user.agent";e.goog=e.goog||{},e.goog.global=e.goog.global||e,WMn(),wAn(1,null,{},r),MWn.Fb=function(n){return FO(this,n)},MWn.Gb=function(){return this.gm},MWn.Hb=function(){return PN(this)},MWn.Ib=function(){return nE(tsn(this))+"@"+(nsn(this)>>>0).toString(16)},MWn.equals=function(n){return this.Fb(n)},MWn.hashCode=function(){return this.Hb()},MWn.toString=function(){return this.Ib()},wAn(290,1,{290:1,2026:1},pon),MWn.le=function(n){var t;return(t=new pon).i=4,t.c=n>1?gZ(this,n-1):this,t},MWn.me=function(){return ED(this),this.b},MWn.ne=function(){return nE(this)},MWn.oe=function(){return ED(this),this.k},MWn.pe=function(){return 0!=(4&this.i)},MWn.qe=function(){return 0!=(1&this.i)},MWn.Ib=function(){return utn(this)},MWn.i=0;var Ont,Ant=vX(RWn,"Object",1),$nt=vX(RWn,"Class",290);wAn(1998,1,KWn),vX(_Wn,"Optional",1998),wAn(1170,1998,KWn,c),MWn.Fb=function(n){return n===this},MWn.Hb=function(){return 2040732332},MWn.Ib=function(){return"Optional.absent()"},MWn.Jb=function(n){return yX(n),iy(),Ont},vX(_Wn,"Absent",1170),wAn(628,1,{},mk),vX(_Wn,"Joiner",628);var Lnt=bq(_Wn,"Predicate");wAn(582,1,{169:1,582:1,3:1,45:1},Hf),MWn.Mb=function(n){return Kon(this,n)},MWn.Lb=function(n){return Kon(this,n)},MWn.Fb=function(n){var t;return!!cL(n,582)&&(t=BB(n,582),NAn(this.a,t.a))},MWn.Hb=function(){return Fon(this.a)+306654252},MWn.Ib=function(){return wPn(this.a)},vX(_Wn,"Predicates/AndPredicate",582),wAn(408,1998,{408:1,3:1},qf),MWn.Fb=function(n){var t;return!!cL(n,408)&&(t=BB(n,408),Nfn(this.a,t.a))},MWn.Hb=function(){return 1502476572+nsn(this.a)},MWn.Ib=function(){return GWn+this.a+")"},MWn.Jb=function(n){return new qf(WQ(n.Kb(this.a),"the Function passed to Optional.transform() must not return null."))},vX(_Wn,"Present",408),wAn(198,1,UWn),MWn.Nb=function(n){fU(this,n)},MWn.Qb=function(){bk()},vX(XWn,"UnmodifiableIterator",198),wAn(1978,198,WWn),MWn.Qb=function(){bk()},MWn.Rb=function(n){throw Hp(new pv)},MWn.Wb=function(n){throw Hp(new pv)},vX(XWn,"UnmodifiableListIterator",1978),wAn(386,1978,WWn),MWn.Ob=function(){return this.c<this.d},MWn.Sb=function(){return this.c>0},MWn.Pb=function(){if(this.c>=this.d)throw Hp(new yv);return this.Xb(this.c++)},MWn.Tb=function(){return this.c},MWn.Ub=function(){if(this.c<=0)throw Hp(new yv);return this.Xb(--this.c)},MWn.Vb=function(){return this.c-1},MWn.c=0,MWn.d=0,vX(XWn,"AbstractIndexedListIterator",386),wAn(699,198,UWn),MWn.Ob=function(){return Zin(this)},MWn.Pb=function(){return P7(this)},MWn.e=1,vX(XWn,"AbstractIterator",699),wAn(1986,1,{224:1}),MWn.Zb=function(){return this.f||(this.f=this.ac())},MWn.Fb=function(n){return jsn(this,n)},MWn.Hb=function(){return nsn(this.Zb())},MWn.dc=function(){return 0==this.gc()},MWn.ec=function(){return gz(this)},MWn.Ib=function(){return Bbn(this.Zb())},vX(XWn,"AbstractMultimap",1986),wAn(726,1986,VWn),MWn.$b=function(){win(this)},MWn._b=function(n){return Wj(this,n)},MWn.ac=function(){return new pT(this,this.c)},MWn.ic=function(n){return this.hc()},MWn.bc=function(){return new HL(this,this.c)},MWn.jc=function(){return this.mc(this.hc())},MWn.kc=function(){return new Hm(this)},MWn.lc=function(){return qTn(this.c.vc().Nc(),new u,64,this.d)},MWn.cc=function(n){return h6(this,n)},MWn.fc=function(n){return Nhn(this,n)},MWn.gc=function(){return this.d},MWn.mc=function(n){return SQ(),new Hb(n)},MWn.nc=function(){return new Bm(this)},MWn.oc=function(){return qTn(this.c.Cc().Nc(),new a,64,this.d)},MWn.pc=function(n,t){return new W6(this,n,t,null)},MWn.d=0,vX(XWn,"AbstractMapBasedMultimap",726),wAn(1631,726,VWn),MWn.hc=function(){return new J6(this.a)},MWn.jc=function(){return SQ(),SQ(),set},MWn.cc=function(n){return BB(h6(this,n),15)},MWn.fc=function(n){return BB(Nhn(this,n),15)},MWn.Zb=function(){return OQ(this)},MWn.Fb=function(n){return jsn(this,n)},MWn.qc=function(n){return BB(h6(this,n),15)},MWn.rc=function(n){return BB(Nhn(this,n),15)},MWn.mc=function(n){return rY(BB(n,15))},MWn.pc=function(n,t){return i3(this,n,BB(t,15),null)},vX(XWn,"AbstractListMultimap",1631),wAn(732,1,QWn),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return this.c.Ob()||this.e.Ob()},MWn.Pb=function(){var n;return this.e.Ob()||(n=BB(this.c.Pb(),42),this.b=n.cd(),this.a=BB(n.dd(),14),this.e=this.a.Kc()),this.sc(this.b,this.e.Pb())},MWn.Qb=function(){this.e.Qb(),this.a.dc()&&this.c.Qb(),--this.d.d},vX(XWn,"AbstractMapBasedMultimap/Itr",732),wAn(1099,732,QWn,Bm),MWn.sc=function(n,t){return t},vX(XWn,"AbstractMapBasedMultimap/1",1099),wAn(1100,1,{},a),MWn.Kb=function(n){return BB(n,14).Nc()},vX(XWn,"AbstractMapBasedMultimap/1methodref$spliterator$Type",1100),wAn(1101,732,QWn,Hm),MWn.sc=function(n,t){return new vT(n,t)},vX(XWn,"AbstractMapBasedMultimap/2",1101);var Nnt=bq(YWn,"Map");wAn(1967,1,JWn),MWn.wc=function(n){nan(this,n)},MWn.yc=function(n,t,e){return Zln(this,n,t,e)},MWn.$b=function(){this.vc().$b()},MWn.tc=function(n){return Mmn(this,n)},MWn._b=function(n){return!!FEn(this,n,!1)},MWn.uc=function(n){var t,e;for(t=this.vc().Kc();t.Ob();)if(e=BB(t.Pb(),42).dd(),GI(n)===GI(e)||null!=n&&Nfn(n,e))return!0;return!1},MWn.Fb=function(n){var t,e,i;if(n===this)return!0;if(!cL(n,83))return!1;if(i=BB(n,83),this.gc()!=i.gc())return!1;for(e=i.vc().Kc();e.Ob();)if(t=BB(e.Pb(),42),!this.tc(t))return!1;return!0},MWn.xc=function(n){return qI(FEn(this,n,!1))},MWn.Hb=function(){return Hun(this.vc())},MWn.dc=function(){return 0==this.gc()},MWn.ec=function(){return new Cb(this)},MWn.zc=function(n,t){throw Hp(new tk("Put not supported on this map"))},MWn.Ac=function(n){Tcn(this,n)},MWn.Bc=function(n){return qI(FEn(this,n,!0))},MWn.gc=function(){return this.vc().gc()},MWn.Ib=function(){return nTn(this)},MWn.Cc=function(){return new Ob(this)},vX(YWn,"AbstractMap",1967),wAn(1987,1967,JWn),MWn.bc=function(){return new ST(this)},MWn.vc=function(){return dz(this)},MWn.ec=function(){return this.g||(this.g=this.bc())},MWn.Cc=function(){return this.i||(this.i=new PT(this))},vX(XWn,"Maps/ViewCachingAbstractMap",1987),wAn(389,1987,JWn,pT),MWn.xc=function(n){return ktn(this,n)},MWn.Bc=function(n){return Zsn(this,n)},MWn.$b=function(){this.d==this.e.c?this.e.$b():Cq(new Oq(this))},MWn._b=function(n){return gfn(this.d,n)},MWn.Ec=function(){return new Xf(this)},MWn.Dc=function(){return this.Ec()},MWn.Fb=function(n){return this===n||Nfn(this.d,n)},MWn.Hb=function(){return nsn(this.d)},MWn.ec=function(){return this.e.ec()},MWn.gc=function(){return this.d.gc()},MWn.Ib=function(){return Bbn(this.d)},vX(XWn,"AbstractMapBasedMultimap/AsMap",389);var xnt=bq(RWn,"Iterable");wAn(28,1,ZWn),MWn.Jc=function(n){e5(this,n)},MWn.Lc=function(){return this.Oc()},MWn.Nc=function(){return new w1(this,0)},MWn.Oc=function(){return new Rq(null,this.Nc())},MWn.Fc=function(n){throw Hp(new tk("Add not supported on this collection"))},MWn.Gc=function(n){return Frn(this,n)},MWn.$b=function(){TV(this)},MWn.Hc=function(n){return ywn(this,n,!1)},MWn.Ic=function(n){return oun(this,n)},MWn.dc=function(){return 0==this.gc()},MWn.Mc=function(n){return ywn(this,n,!0)},MWn.Pc=function(){return cz(this)},MWn.Qc=function(n){return Emn(this,n)},MWn.Ib=function(){return LMn(this)},vX(YWn,"AbstractCollection",28);var Dnt=bq(YWn,"Set");wAn(nVn,28,tVn),MWn.Nc=function(){return new w1(this,1)},MWn.Fb=function(n){return ign(this,n)},MWn.Hb=function(){return Hun(this)},vX(YWn,"AbstractSet",nVn),wAn(1970,nVn,tVn),vX(XWn,"Sets/ImprovedAbstractSet",1970),wAn(1971,1970,tVn),MWn.$b=function(){this.Rc().$b()},MWn.Hc=function(n){return idn(this,n)},MWn.dc=function(){return this.Rc().dc()},MWn.Mc=function(n){var t;return!!this.Hc(n)&&(t=BB(n,42),this.Rc().ec().Mc(t.cd()))},MWn.gc=function(){return this.Rc().gc()},vX(XWn,"Maps/EntrySet",1971),wAn(1097,1971,tVn,Xf),MWn.Hc=function(n){return wfn(this.a.d.vc(),n)},MWn.Kc=function(){return new Oq(this.a)},MWn.Rc=function(){return this.a},MWn.Mc=function(n){var t;return!!wfn(this.a.d.vc(),n)&&(t=BB(n,42),H5(this.a.e,t.cd()),!0)},MWn.Nc=function(){return RB(this.a.d.vc().Nc(),new Wf(this.a))},vX(XWn,"AbstractMapBasedMultimap/AsMap/AsMapEntries",1097),wAn(1098,1,{},Wf),MWn.Kb=function(n){return i5(this.a,BB(n,42))},vX(XWn,"AbstractMapBasedMultimap/AsMap/AsMapEntries/0methodref$wrapEntry$Type",1098),wAn(730,1,QWn,Oq),MWn.Nb=function(n){fU(this,n)},MWn.Pb=function(){var n;return n=BB(this.b.Pb(),42),this.a=BB(n.dd(),14),i5(this.c,n)},MWn.Ob=function(){return this.b.Ob()},MWn.Qb=function(){han(!!this.a),this.b.Qb(),this.c.e.d-=this.a.gc(),this.a.$b(),this.a=null},vX(XWn,"AbstractMapBasedMultimap/AsMap/AsMapIterator",730),wAn(532,1970,tVn,ST),MWn.$b=function(){this.b.$b()},MWn.Hc=function(n){return this.b._b(n)},MWn.Jc=function(n){yX(n),this.b.wc(new vl(n))},MWn.dc=function(){return this.b.dc()},MWn.Kc=function(){return new ly(this.b.vc().Kc())},MWn.Mc=function(n){return!!this.b._b(n)&&(this.b.Bc(n),!0)},MWn.gc=function(){return this.b.gc()},vX(XWn,"Maps/KeySet",532),wAn(318,532,tVn,HL),MWn.$b=function(){Cq(new eT(this,this.b.vc().Kc()))},MWn.Ic=function(n){return this.b.ec().Ic(n)},MWn.Fb=function(n){return this===n||Nfn(this.b.ec(),n)},MWn.Hb=function(){return nsn(this.b.ec())},MWn.Kc=function(){return new eT(this,this.b.vc().Kc())},MWn.Mc=function(n){var t,e;return e=0,(t=BB(this.b.Bc(n),14))&&(e=t.gc(),t.$b(),this.a.d-=e),e>0},MWn.Nc=function(){return this.b.ec().Nc()},vX(XWn,"AbstractMapBasedMultimap/KeySet",318),wAn(731,1,QWn,eT),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return this.c.Ob()},MWn.Pb=function(){return this.a=BB(this.c.Pb(),42),this.a.cd()},MWn.Qb=function(){var n;han(!!this.a),n=BB(this.a.dd(),14),this.c.Qb(),this.b.a.d-=n.gc(),n.$b(),this.a=null},vX(XWn,"AbstractMapBasedMultimap/KeySet/1",731),wAn(491,389,{83:1,161:1},CD),MWn.bc=function(){return this.Sc()},MWn.ec=function(){return this.Tc()},MWn.Sc=function(){return new nT(this.c,this.Uc())},MWn.Tc=function(){return this.b||(this.b=this.Sc())},MWn.Uc=function(){return BB(this.d,161)},vX(XWn,"AbstractMapBasedMultimap/SortedAsMap",491),wAn(542,491,eVn,ID),MWn.bc=function(){return new tT(this.a,BB(BB(this.d,161),171))},MWn.Sc=function(){return new tT(this.a,BB(BB(this.d,161),171))},MWn.ec=function(){return BB(this.b||(this.b=new tT(this.a,BB(BB(this.d,161),171))),271)},MWn.Tc=function(){return BB(this.b||(this.b=new tT(this.a,BB(BB(this.d,161),171))),271)},MWn.Uc=function(){return BB(BB(this.d,161),171)},vX(XWn,"AbstractMapBasedMultimap/NavigableAsMap",542),wAn(490,318,iVn,nT),MWn.Nc=function(){return this.b.ec().Nc()},vX(XWn,"AbstractMapBasedMultimap/SortedKeySet",490),wAn(388,490,rVn,tT),vX(XWn,"AbstractMapBasedMultimap/NavigableKeySet",388),wAn(541,28,ZWn,W6),MWn.Fc=function(n){var t,e;return zbn(this),e=this.d.dc(),(t=this.d.Fc(n))&&(++this.f.d,e&&jR(this)),t},MWn.Gc=function(n){var t,e,i;return!n.dc()&&(zbn(this),i=this.d.gc(),(t=this.d.Gc(n))&&(e=this.d.gc(),this.f.d+=e-i,0==i&&jR(this)),t)},MWn.$b=function(){var n;zbn(this),0!=(n=this.d.gc())&&(this.d.$b(),this.f.d-=n,$G(this))},MWn.Hc=function(n){return zbn(this),this.d.Hc(n)},MWn.Ic=function(n){return zbn(this),this.d.Ic(n)},MWn.Fb=function(n){return n===this||(zbn(this),Nfn(this.d,n))},MWn.Hb=function(){return zbn(this),nsn(this.d)},MWn.Kc=function(){return zbn(this),new QB(this)},MWn.Mc=function(n){var t;return zbn(this),(t=this.d.Mc(n))&&(--this.f.d,$G(this)),t},MWn.gc=function(){return tO(this)},MWn.Nc=function(){return zbn(this),this.d.Nc()},MWn.Ib=function(){return zbn(this),Bbn(this.d)},vX(XWn,"AbstractMapBasedMultimap/WrappedCollection",541);var Rnt=bq(YWn,"List");wAn(728,541,{20:1,28:1,14:1,15:1},sz),MWn.ad=function(n){_rn(this,n)},MWn.Nc=function(){return zbn(this),this.d.Nc()},MWn.Vc=function(n,t){var e;zbn(this),e=this.d.dc(),BB(this.d,15).Vc(n,t),++this.a.d,e&&jR(this)},MWn.Wc=function(n,t){var e,i,r;return!t.dc()&&(zbn(this),r=this.d.gc(),(e=BB(this.d,15).Wc(n,t))&&(i=this.d.gc(),this.a.d+=i-r,0==r&&jR(this)),e)},MWn.Xb=function(n){return zbn(this),BB(this.d,15).Xb(n)},MWn.Xc=function(n){return zbn(this),BB(this.d,15).Xc(n)},MWn.Yc=function(){return zbn(this),new g$(this)},MWn.Zc=function(n){return zbn(this),new gQ(this,n)},MWn.$c=function(n){var t;return zbn(this),t=BB(this.d,15).$c(n),--this.a.d,$G(this),t},MWn._c=function(n,t){return zbn(this),BB(this.d,15)._c(n,t)},MWn.bd=function(n,t){return zbn(this),i3(this.a,this.e,BB(this.d,15).bd(n,t),this.b?this.b:this)},vX(XWn,"AbstractMapBasedMultimap/WrappedList",728),wAn(1096,728,{20:1,28:1,14:1,15:1,54:1},Ox),vX(XWn,"AbstractMapBasedMultimap/RandomAccessWrappedList",1096),wAn(620,1,QWn,QB),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return MV(this),this.b.Ob()},MWn.Pb=function(){return MV(this),this.b.Pb()},MWn.Qb=function(){eN(this)},vX(XWn,"AbstractMapBasedMultimap/WrappedCollection/WrappedIterator",620),wAn(729,620,cVn,g$,gQ),MWn.Qb=function(){eN(this)},MWn.Rb=function(n){var t;t=0==tO(this.a),(MV(this),BB(this.b,125)).Rb(n),++this.a.a.d,t&&jR(this.a)},MWn.Sb=function(){return(MV(this),BB(this.b,125)).Sb()},MWn.Tb=function(){return(MV(this),BB(this.b,125)).Tb()},MWn.Ub=function(){return(MV(this),BB(this.b,125)).Ub()},MWn.Vb=function(){return(MV(this),BB(this.b,125)).Vb()},MWn.Wb=function(n){(MV(this),BB(this.b,125)).Wb(n)},vX(XWn,"AbstractMapBasedMultimap/WrappedList/WrappedListIterator",729),wAn(727,541,iVn,ND),MWn.Nc=function(){return zbn(this),this.d.Nc()},vX(XWn,"AbstractMapBasedMultimap/WrappedSortedSet",727),wAn(1095,727,rVn,AA),vX(XWn,"AbstractMapBasedMultimap/WrappedNavigableSet",1095),wAn(1094,541,tVn,xD),MWn.Nc=function(){return zbn(this),this.d.Nc()},vX(XWn,"AbstractMapBasedMultimap/WrappedSet",1094),wAn(1103,1,{},u),MWn.Kb=function(n){return F6(BB(n,42))},vX(XWn,"AbstractMapBasedMultimap/lambda$1$Type",1103),wAn(1102,1,{},Vf),MWn.Kb=function(n){return new vT(this.a,n)},vX(XWn,"AbstractMapBasedMultimap/lambda$2$Type",1102);var Knt,_nt,Fnt,Bnt,Hnt=bq(YWn,"Map/Entry");wAn(345,1,aVn),MWn.Fb=function(n){var t;return!!cL(n,42)&&(t=BB(n,42),wW(this.cd(),t.cd())&&wW(this.dd(),t.dd()))},MWn.Hb=function(){var n,t;return n=this.cd(),t=this.dd(),(null==n?0:nsn(n))^(null==t?0:nsn(t))},MWn.ed=function(n){throw Hp(new pv)},MWn.Ib=function(){return this.cd()+"="+this.dd()},vX(XWn,uVn,345),wAn(1988,28,ZWn),MWn.$b=function(){this.fd().$b()},MWn.Hc=function(n){var t;return!!cL(n,42)&&(t=BB(n,42),H0(this.fd(),t.cd(),t.dd()))},MWn.Mc=function(n){var t;return!!cL(n,42)&&(t=BB(n,42),q0(this.fd(),t.cd(),t.dd()))},MWn.gc=function(){return this.fd().d},vX(XWn,"Multimaps/Entries",1988),wAn(733,1988,ZWn,Qf),MWn.Kc=function(){return this.a.kc()},MWn.fd=function(){return this.a},MWn.Nc=function(){return this.a.lc()},vX(XWn,"AbstractMultimap/Entries",733),wAn(734,733,tVn,qm),MWn.Nc=function(){return this.a.lc()},MWn.Fb=function(n){return zSn(this,n)},MWn.Hb=function(){return Brn(this)},vX(XWn,"AbstractMultimap/EntrySet",734),wAn(735,28,ZWn,Yf),MWn.$b=function(){this.a.$b()},MWn.Hc=function(n){return Isn(this.a,n)},MWn.Kc=function(){return this.a.nc()},MWn.gc=function(){return this.a.d},MWn.Nc=function(){return this.a.oc()},vX(XWn,"AbstractMultimap/Values",735),wAn(1989,28,{835:1,20:1,28:1,14:1}),MWn.Jc=function(n){yX(n),EV(this).Jc(new pl(n))},MWn.Nc=function(){var n;return qTn(n=EV(this).Nc(),new y,64|1296&n.qd(),this.a.d)},MWn.Fc=function(n){return wk(),!0},MWn.Gc=function(n){return yX(this),yX(n),cL(n,543)?l2(BB(n,835)):!n.dc()&&fnn(this,n.Kc())},MWn.Hc=function(n){var t;return((t=BB(lfn(OQ(this.a),n),14))?t.gc():0)>0},MWn.Fb=function(n){return h$n(this,n)},MWn.Hb=function(){return nsn(EV(this))},MWn.dc=function(){return EV(this).dc()},MWn.Mc=function(n){return EIn(this,n,1)>0},MWn.Ib=function(){return Bbn(EV(this))},vX(XWn,"AbstractMultiset",1989),wAn(1991,1970,tVn),MWn.$b=function(){win(this.a.a)},MWn.Hc=function(n){var t;return!(!cL(n,492)||(t=BB(n,416),BB(t.a.dd(),14).gc()<=0||c1(this.a,t.a.cd())!=BB(t.a.dd(),14).gc()))},MWn.Mc=function(n){var t,e,i;return!(!cL(n,492)||(t=(e=BB(n,416)).a.cd(),0==(i=BB(e.a.dd(),14).gc())))&&TIn(this.a,t,i)},vX(XWn,"Multisets/EntrySet",1991),wAn(1109,1991,tVn,Jf),MWn.Kc=function(){return new wy(dz(OQ(this.a.a)).Kc())},MWn.gc=function(){return OQ(this.a.a).gc()},vX(XWn,"AbstractMultiset/EntrySet",1109),wAn(619,726,VWn),MWn.hc=function(){return this.gd()},MWn.jc=function(){return this.hd()},MWn.cc=function(n){return this.jd(n)},MWn.fc=function(n){return this.kd(n)},MWn.Zb=function(){return this.f||(this.f=this.ac())},MWn.hd=function(){return SQ(),SQ(),fet},MWn.Fb=function(n){return jsn(this,n)},MWn.jd=function(n){return BB(h6(this,n),21)},MWn.kd=function(n){return BB(Nhn(this,n),21)},MWn.mc=function(n){return SQ(),new Ak(BB(n,21))},MWn.pc=function(n,t){return new xD(this,n,BB(t,21))},vX(XWn,"AbstractSetMultimap",619),wAn(1657,619,VWn),MWn.hc=function(){return new dE(this.b)},MWn.gd=function(){return new dE(this.b)},MWn.jc=function(){return IX(new dE(this.b))},MWn.hd=function(){return IX(new dE(this.b))},MWn.cc=function(n){return BB(BB(h6(this,n),21),84)},MWn.jd=function(n){return BB(BB(h6(this,n),21),84)},MWn.fc=function(n){return BB(BB(Nhn(this,n),21),84)},MWn.kd=function(n){return BB(BB(Nhn(this,n),21),84)},MWn.mc=function(n){return cL(n,271)?IX(BB(n,271)):(SQ(),new dN(BB(n,84)))},MWn.Zb=function(){return this.f||(this.f=cL(this.c,171)?new ID(this,BB(this.c,171)):cL(this.c,161)?new CD(this,BB(this.c,161)):new pT(this,this.c))},MWn.pc=function(n,t){return cL(t,271)?new AA(this,n,BB(t,271)):new ND(this,n,BB(t,84))},vX(XWn,"AbstractSortedSetMultimap",1657),wAn(1658,1657,VWn),MWn.Zb=function(){return BB(BB(this.f||(this.f=cL(this.c,171)?new ID(this,BB(this.c,171)):cL(this.c,161)?new CD(this,BB(this.c,161)):new pT(this,this.c)),161),171)},MWn.ec=function(){return BB(BB(this.i||(this.i=cL(this.c,171)?new tT(this,BB(this.c,171)):cL(this.c,161)?new nT(this,BB(this.c,161)):new HL(this,this.c)),84),271)},MWn.bc=function(){return cL(this.c,171)?new tT(this,BB(this.c,171)):cL(this.c,161)?new nT(this,BB(this.c,161)):new HL(this,this.c)},vX(XWn,"AbstractSortedKeySortedSetMultimap",1658),wAn(2010,1,{1947:1}),MWn.Fb=function(n){return Cjn(this,n)},MWn.Hb=function(){return Hun(this.g||(this.g=new Zf(this)))},MWn.Ib=function(){return nTn(this.f||(this.f=new UL(this)))},vX(XWn,"AbstractTable",2010),wAn(665,nVn,tVn,Zf),MWn.$b=function(){dk()},MWn.Hc=function(n){var t,e;return!!cL(n,468)&&(t=BB(n,682),!!(e=BB(lfn(jX(this.a),WI(t.c.e,t.b)),83))&&wfn(e.vc(),new vT(WI(t.c.c,t.a),U6(t.c,t.b,t.a))))},MWn.Kc=function(){return ZQ(this.a)},MWn.Mc=function(n){var t,e;return!!cL(n,468)&&(t=BB(n,682),!!(e=BB(lfn(jX(this.a),WI(t.c.e,t.b)),83))&&dfn(e.vc(),new vT(WI(t.c.c,t.a),U6(t.c,t.b,t.a))))},MWn.gc=function(){return zq(this.a)},MWn.Nc=function(){return P2(this.a)},vX(XWn,"AbstractTable/CellSet",665),wAn(1928,28,ZWn,nl),MWn.$b=function(){dk()},MWn.Hc=function(n){return hTn(this.a,n)},MWn.Kc=function(){return nY(this.a)},MWn.gc=function(){return zq(this.a)},MWn.Nc=function(){return Y0(this.a)},vX(XWn,"AbstractTable/Values",1928),wAn(1632,1631,VWn),vX(XWn,"ArrayListMultimapGwtSerializationDependencies",1632),wAn(513,1632,VWn,ok,o1),MWn.hc=function(){return new J6(this.a)},MWn.a=0,vX(XWn,"ArrayListMultimap",513),wAn(664,2010,{664:1,1947:1,3:1},vOn),vX(XWn,"ArrayTable",664),wAn(1924,386,WWn,qL),MWn.Xb=function(n){return new gon(this.a,n)},vX(XWn,"ArrayTable/1",1924),wAn(1925,1,{},Gf),MWn.ld=function(n){return new gon(this.a,n)},vX(XWn,"ArrayTable/1methodref$getCell$Type",1925),wAn(2011,1,{682:1}),MWn.Fb=function(n){var t;return n===this||!!cL(n,468)&&(t=BB(n,682),wW(WI(this.c.e,this.b),WI(t.c.e,t.b))&&wW(WI(this.c.c,this.a),WI(t.c.c,t.a))&&wW(U6(this.c,this.b,this.a),U6(t.c,t.b,t.a)))},MWn.Hb=function(){return fhn(Pun(Gk(Ant,1),HWn,1,5,[WI(this.c.e,this.b),WI(this.c.c,this.a),U6(this.c,this.b,this.a)]))},MWn.Ib=function(){return"("+WI(this.c.e,this.b)+","+WI(this.c.c,this.a)+")="+U6(this.c,this.b,this.a)},vX(XWn,"Tables/AbstractCell",2011),wAn(468,2011,{468:1,682:1},gon),MWn.a=0,MWn.b=0,MWn.d=0,vX(XWn,"ArrayTable/2",468),wAn(1927,1,{},zf),MWn.ld=function(n){return Y9(this.a,n)},vX(XWn,"ArrayTable/2methodref$getValue$Type",1927),wAn(1926,386,WWn,GL),MWn.Xb=function(n){return Y9(this.a,n)},vX(XWn,"ArrayTable/3",1926),wAn(1979,1967,JWn),MWn.$b=function(){Cq(this.kc())},MWn.vc=function(){return new ml(this)},MWn.lc=function(){return new CV(this.kc(),this.gc())},vX(XWn,"Maps/IteratorBasedAbstractMap",1979),wAn(828,1979,JWn),MWn.$b=function(){throw Hp(new pv)},MWn._b=function(n){return Yj(this.c,n)},MWn.kc=function(){return new zL(this,this.c.b.c.gc())},MWn.lc=function(){return yq(this.c.b.c.gc(),16,new Uf(this))},MWn.xc=function(n){var t;return(t=BB(UK(this.c,n),19))?this.nd(t.a):null},MWn.dc=function(){return this.c.b.c.dc()},MWn.ec=function(){return bz(this.c)},MWn.zc=function(n,t){var e;if(!(e=BB(UK(this.c,n),19)))throw Hp(new _y(this.md()+" "+n+" not in "+bz(this.c)));return this.od(e.a,t)},MWn.Bc=function(n){throw Hp(new pv)},MWn.gc=function(){return this.c.b.c.gc()},vX(XWn,"ArrayTable/ArrayMap",828),wAn(1923,1,{},Uf),MWn.ld=function(n){return OX(this.a,n)},vX(XWn,"ArrayTable/ArrayMap/0methodref$getEntry$Type",1923),wAn(1921,345,aVn,sT),MWn.cd=function(){return YL(this.a,this.b)},MWn.dd=function(){return this.a.nd(this.b)},MWn.ed=function(n){return this.a.od(this.b,n)},MWn.b=0,vX(XWn,"ArrayTable/ArrayMap/1",1921),wAn(1922,386,WWn,zL),MWn.Xb=function(n){return OX(this.a,n)},vX(XWn,"ArrayTable/ArrayMap/2",1922),wAn(1920,828,JWn,cU),MWn.md=function(){return"Column"},MWn.nd=function(n){return U6(this.b,this.a,n)},MWn.od=function(n,t){return Sun(this.b,this.a,n,t)},MWn.a=0,vX(XWn,"ArrayTable/Row",1920),wAn(829,828,JWn,UL),MWn.nd=function(n){return new cU(this.a,n)},MWn.zc=function(n,t){return BB(t,83),gk()},MWn.od=function(n,t){return BB(t,83),pk()},MWn.md=function(){return"Row"},vX(XWn,"ArrayTable/RowMap",829),wAn(1120,1,fVn,hT),MWn.qd=function(){return-262&this.a.qd()},MWn.rd=function(){return this.a.rd()},MWn.Nb=function(n){this.a.Nb(new cT(n,this.b))},MWn.sd=function(n){return this.a.sd(new rT(n,this.b))},vX(XWn,"CollectSpliterators/1",1120),wAn(1121,1,lVn,rT),MWn.td=function(n){this.a.td(this.b.Kb(n))},vX(XWn,"CollectSpliterators/1/lambda$0$Type",1121),wAn(1122,1,lVn,cT),MWn.td=function(n){this.a.td(this.b.Kb(n))},vX(XWn,"CollectSpliterators/1/lambda$1$Type",1122),wAn(1123,1,fVn,q2),MWn.qd=function(){return this.a},MWn.rd=function(){return this.d&&(this.b=T$(this.b,this.d.rd())),T$(this.b,0)},MWn.Nb=function(n){this.d&&(this.d.Nb(n),this.d=null),this.c.Nb(new iT(this.e,n)),this.b=0},MWn.sd=function(n){for(;;){if(this.d&&this.d.sd(n))return JI(this.b,bVn)&&(this.b=ibn(this.b,1)),!0;if(this.d=null,!this.c.sd(new aT(this,this.e)))return!1}},MWn.a=0,MWn.b=0,vX(XWn,"CollectSpliterators/1FlatMapSpliterator",1123),wAn(1124,1,lVn,aT),MWn.td=function(n){dK(this.a,this.b,n)},vX(XWn,"CollectSpliterators/1FlatMapSpliterator/lambda$0$Type",1124),wAn(1125,1,lVn,iT),MWn.td=function(n){oL(this.b,this.a,n)},vX(XWn,"CollectSpliterators/1FlatMapSpliterator/lambda$1$Type",1125),wAn(1117,1,fVn,wK),MWn.qd=function(){return 16464|this.b},MWn.rd=function(){return this.a.rd()},MWn.Nb=function(n){this.a.xe(new oT(n,this.c))},MWn.sd=function(n){return this.a.ye(new uT(n,this.c))},MWn.b=0,vX(XWn,"CollectSpliterators/1WithCharacteristics",1117),wAn(1118,1,wVn,uT),MWn.ud=function(n){this.a.td(this.b.ld(n))},vX(XWn,"CollectSpliterators/1WithCharacteristics/lambda$0$Type",1118),wAn(1119,1,wVn,oT),MWn.ud=function(n){this.a.td(this.b.ld(n))},vX(XWn,"CollectSpliterators/1WithCharacteristics/lambda$1$Type",1119),wAn(245,1,dVn),MWn.wd=function(n){return this.vd(BB(n,245))},MWn.vd=function(n){var t;return n==(ty(),_nt)?1:n==(ey(),Knt)?-1:(nq(),0!=(t=Ncn(this.a,n.a))?t:cL(this,519)==cL(n,519)?0:cL(this,519)?1:-1)},MWn.zd=function(){return this.a},MWn.Fb=function(n){return xdn(this,n)},vX(XWn,"Cut",245),wAn(1761,245,dVn,Nk),MWn.vd=function(n){return n==this?0:1},MWn.xd=function(n){throw Hp(new hv)},MWn.yd=function(n){n.a+="+\u221e)"},MWn.zd=function(){throw Hp(new Fy(gVn))},MWn.Hb=function(){return $T(),evn(this)},MWn.Ad=function(n){return!1},MWn.Ib=function(){return"+\u221e"},vX(XWn,"Cut/AboveAll",1761),wAn(519,245,{245:1,519:1,3:1,35:1},iN),MWn.xd=function(n){uO((n.a+="(",n),this.a)},MWn.yd=function(n){xX(uO(n,this.a),93)},MWn.Hb=function(){return~nsn(this.a)},MWn.Ad=function(n){return nq(),Ncn(this.a,n)<0},MWn.Ib=function(){return"/"+this.a+"\\"},vX(XWn,"Cut/AboveValue",519),wAn(1760,245,dVn,xk),MWn.vd=function(n){return n==this?0:-1},MWn.xd=function(n){n.a+="(-\u221e"},MWn.yd=function(n){throw Hp(new hv)},MWn.zd=function(){throw Hp(new Fy(gVn))},MWn.Hb=function(){return $T(),evn(this)},MWn.Ad=function(n){return!0},MWn.Ib=function(){return"-\u221e"},vX(XWn,"Cut/BelowAll",1760),wAn(1762,245,dVn,rN),MWn.xd=function(n){uO((n.a+="[",n),this.a)},MWn.yd=function(n){xX(uO(n,this.a),41)},MWn.Hb=function(){return nsn(this.a)},MWn.Ad=function(n){return nq(),Ncn(this.a,n)<=0},MWn.Ib=function(){return"\\"+this.a+"/"},vX(XWn,"Cut/BelowValue",1762),wAn(537,1,pVn),MWn.Jc=function(n){e5(this,n)},MWn.Ib=function(){return Hln(BB(WQ(this,"use Optional.orNull() instead of Optional.or(null)"),20).Kc())},vX(XWn,"FluentIterable",537),wAn(433,537,pVn,OO),MWn.Kc=function(){return new oz(ZL(this.a.Kc(),new h))},vX(XWn,"FluentIterable/2",433),wAn(1046,537,pVn,AO),MWn.Kc=function(){return NU(this)},vX(XWn,"FluentIterable/3",1046),wAn(708,386,WWn,WL),MWn.Xb=function(n){return this.a[n].Kc()},vX(XWn,"FluentIterable/3/1",708),wAn(1972,1,{}),MWn.Ib=function(){return Bbn(this.Bd().b)},vX(XWn,"ForwardingObject",1972),wAn(1973,1972,vVn),MWn.Bd=function(){return this.Cd()},MWn.Jc=function(n){e5(this,n)},MWn.Lc=function(){return this.Oc()},MWn.Nc=function(){return new w1(this,0)},MWn.Oc=function(){return new Rq(null,this.Nc())},MWn.Fc=function(n){return this.Cd(),oE()},MWn.Gc=function(n){return this.Cd(),sE()},MWn.$b=function(){this.Cd(),hE()},MWn.Hc=function(n){return this.Cd().Hc(n)},MWn.Ic=function(n){return this.Cd().Ic(n)},MWn.dc=function(){return this.Cd().b.dc()},MWn.Kc=function(){return this.Cd().Kc()},MWn.Mc=function(n){return this.Cd(),fE()},MWn.gc=function(){return this.Cd().b.gc()},MWn.Pc=function(){return this.Cd().Pc()},MWn.Qc=function(n){return this.Cd().Qc(n)},vX(XWn,"ForwardingCollection",1973),wAn(1980,28,mVn),MWn.Kc=function(){return this.Ed()},MWn.Fc=function(n){throw Hp(new pv)},MWn.Gc=function(n){throw Hp(new pv)},MWn.$b=function(){throw Hp(new pv)},MWn.Hc=function(n){return null!=n&&ywn(this,n,!1)},MWn.Dd=function(){switch(this.gc()){case 0:return WX(),WX(),Fnt;case 1:return WX(),new Pq(yX(this.Ed().Pb()));default:return new aU(this,this.Pc())}},MWn.Mc=function(n){throw Hp(new pv)},vX(XWn,"ImmutableCollection",1980),wAn(712,1980,mVn,rv),MWn.Kc=function(){return L9(this.a.Kc())},MWn.Hc=function(n){return null!=n&&this.a.Hc(n)},MWn.Ic=function(n){return this.a.Ic(n)},MWn.dc=function(){return this.a.dc()},MWn.Ed=function(){return L9(this.a.Kc())},MWn.gc=function(){return this.a.gc()},MWn.Pc=function(){return this.a.Pc()},MWn.Qc=function(n){return this.a.Qc(n)},MWn.Ib=function(){return Bbn(this.a)},vX(XWn,"ForwardingImmutableCollection",712),wAn(152,1980,yVn),MWn.Kc=function(){return this.Ed()},MWn.Yc=function(){return this.Fd(0)},MWn.Zc=function(n){return this.Fd(n)},MWn.ad=function(n){_rn(this,n)},MWn.Nc=function(){return new w1(this,16)},MWn.bd=function(n,t){return this.Gd(n,t)},MWn.Vc=function(n,t){throw Hp(new pv)},MWn.Wc=function(n,t){throw Hp(new pv)},MWn.Fb=function(n){return qAn(this,n)},MWn.Hb=function(){return Ian(this)},MWn.Xc=function(n){return null==n?-1:Tmn(this,n)},MWn.Ed=function(){return this.Fd(0)},MWn.Fd=function(n){return ix(this,n)},MWn.$c=function(n){throw Hp(new pv)},MWn._c=function(n,t){throw Hp(new pv)},MWn.Gd=function(n,t){return sfn(new s1(new IT(this),n,t))},vX(XWn,"ImmutableList",152),wAn(2006,152,yVn),MWn.Kc=function(){return L9(this.Hd().Kc())},MWn.bd=function(n,t){return sfn(this.Hd().bd(n,t))},MWn.Hc=function(n){return null!=n&&this.Hd().Hc(n)},MWn.Ic=function(n){return this.Hd().Ic(n)},MWn.Fb=function(n){return Nfn(this.Hd(),n)},MWn.Xb=function(n){return WI(this,n)},MWn.Hb=function(){return nsn(this.Hd())},MWn.Xc=function(n){return this.Hd().Xc(n)},MWn.dc=function(){return this.Hd().dc()},MWn.Ed=function(){return L9(this.Hd().Kc())},MWn.gc=function(){return this.Hd().gc()},MWn.Gd=function(n,t){return sfn(this.Hd().bd(n,t))},MWn.Pc=function(){return this.Hd().Qc(x8(Ant,HWn,1,this.Hd().gc(),5,1))},MWn.Qc=function(n){return this.Hd().Qc(n)},MWn.Ib=function(){return Bbn(this.Hd())},vX(XWn,"ForwardingImmutableList",2006),wAn(714,1,jVn),MWn.vc=function(){return lz(this)},MWn.wc=function(n){nan(this,n)},MWn.ec=function(){return bz(this)},MWn.yc=function(n,t,e){return Zln(this,n,t,e)},MWn.Cc=function(){return this.Ld()},MWn.$b=function(){throw Hp(new pv)},MWn._b=function(n){return null!=this.xc(n)},MWn.uc=function(n){return this.Ld().Hc(n)},MWn.Jd=function(){return new cv(this)},MWn.Kd=function(){return new av(this)},MWn.Fb=function(n){return $sn(this,n)},MWn.Hb=function(){return lz(this).Hb()},MWn.dc=function(){return 0==this.gc()},MWn.zc=function(n,t){return vk()},MWn.Bc=function(n){throw Hp(new pv)},MWn.Ib=function(){return fSn(this)},MWn.Ld=function(){return this.e?this.e:this.e=this.Kd()},MWn.c=null,MWn.d=null,MWn.e=null,vX(XWn,"ImmutableMap",714),wAn(715,714,jVn),MWn._b=function(n){return Yj(this,n)},MWn.uc=function(n){return _T(this.b,n)},MWn.Id=function(){return hfn(new el(this))},MWn.Jd=function(){return hfn(iV(this.b))},MWn.Kd=function(){return s_(),new rv(tV(this.b))},MWn.Fb=function(n){return BT(this.b,n)},MWn.xc=function(n){return UK(this,n)},MWn.Hb=function(){return nsn(this.b.c)},MWn.dc=function(){return this.b.c.dc()},MWn.gc=function(){return this.b.c.gc()},MWn.Ib=function(){return Bbn(this.b.c)},vX(XWn,"ForwardingImmutableMap",715),wAn(1974,1973,EVn),MWn.Bd=function(){return this.Md()},MWn.Cd=function(){return this.Md()},MWn.Nc=function(){return new w1(this,1)},MWn.Fb=function(n){return n===this||this.Md().Fb(n)},MWn.Hb=function(){return this.Md().Hb()},vX(XWn,"ForwardingSet",1974),wAn(1069,1974,EVn,el),MWn.Bd=function(){return eV(this.a.b)},MWn.Cd=function(){return eV(this.a.b)},MWn.Hc=function(n){if(cL(n,42)&&null==BB(n,42).cd())return!1;try{return KT(eV(this.a.b),n)}catch(t){if(cL(t=lun(t),205))return!1;throw Hp(t)}},MWn.Md=function(){return eV(this.a.b)},MWn.Qc=function(n){var t;return t=IY(eV(this.a.b),n),eV(this.a.b).b.gc()<t.length&&$X(t,eV(this.a.b).b.gc(),null),t},vX(XWn,"ForwardingImmutableMap/1",1069),wAn(1981,1980,TVn),MWn.Kc=function(){return this.Ed()},MWn.Nc=function(){return new w1(this,1)},MWn.Fb=function(n){return zSn(this,n)},MWn.Hb=function(){return Brn(this)},vX(XWn,"ImmutableSet",1981),wAn(703,1981,TVn),MWn.Kc=function(){return L9(new qb(this.a.b.Kc()))},MWn.Hc=function(n){return null!=n&&xT(this.a,n)},MWn.Ic=function(n){return DT(this.a,n)},MWn.Hb=function(){return nsn(this.a.b)},MWn.dc=function(){return this.a.b.dc()},MWn.Ed=function(){return L9(new qb(this.a.b.Kc()))},MWn.gc=function(){return this.a.b.gc()},MWn.Pc=function(){return this.a.b.Pc()},MWn.Qc=function(n){return RT(this.a,n)},MWn.Ib=function(){return Bbn(this.a.b)},vX(XWn,"ForwardingImmutableSet",703),wAn(1975,1974,MVn),MWn.Bd=function(){return this.b},MWn.Cd=function(){return this.b},MWn.Md=function(){return this.b},MWn.Nc=function(){return new wS(this)},vX(XWn,"ForwardingSortedSet",1975),wAn(533,1979,jVn,Avn),MWn.Ac=function(n){Tcn(this,n)},MWn.Cc=function(){return new p$(this.d||(this.d=new il(this)))},MWn.$b=function(){d5(this)},MWn._b=function(n){return!!Jrn(this,n,dG(cbn(SVn,rV(dG(cbn(null==n?0:nsn(n),PVn)),15))))},MWn.uc=function(n){return Ltn(this,n)},MWn.kc=function(){return new VL(this,this)},MWn.wc=function(n){BJ(this,n)},MWn.xc=function(n){return sen(this,n)},MWn.ec=function(){return new v$(this)},MWn.zc=function(n,t){return wKn(this,n,t)},MWn.Bc=function(n){var t;return(t=Jrn(this,n,dG(cbn(SVn,rV(dG(cbn(null==n?0:nsn(n),PVn)),15)))))?(LLn(this,t),t.e=null,t.c=null,t.i):null},MWn.gc=function(){return this.i},MWn.pd=function(){return new p$(this.d||(this.d=new il(this)))},MWn.f=0,MWn.g=0,MWn.i=0,vX(XWn,"HashBiMap",533),wAn(534,1,QWn),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return l3(this)},MWn.Pb=function(){var n;if(!l3(this))throw Hp(new yv);return n=this.c,this.c=n.c,this.f=n,--this.d,this.Nd(n)},MWn.Qb=function(){if(this.e.g!=this.b)throw Hp(new vv);han(!!this.f),LLn(this.e,this.f),this.b=this.e.g,this.f=null},MWn.b=0,MWn.d=0,MWn.f=null,vX(XWn,"HashBiMap/Itr",534),wAn(1011,534,QWn,VL),MWn.Nd=function(n){return new bT(this,n)},vX(XWn,"HashBiMap/1",1011),wAn(1012,345,aVn,bT),MWn.cd=function(){return this.a.g},MWn.dd=function(){return this.a.i},MWn.ed=function(n){var t,e,i;return e=this.a.i,(i=dG(cbn(SVn,rV(dG(cbn(null==n?0:nsn(n),PVn)),15))))==this.a.f&&(GI(n)===GI(e)||null!=n&&Nfn(n,e))?n:(yun(!Zrn(this.b.a,n,i),n),LLn(this.b.a,this.a),t=new qW(this.a.g,this.a.a,n,i),YCn(this.b.a,t,this.a),this.a.e=null,this.a.c=null,this.b.b=this.b.a.g,this.b.f==this.a&&(this.b.f=t),this.a=t,e)},vX(XWn,"HashBiMap/1/MapEntry",1012),wAn(238,345,{345:1,238:1,3:1,42:1},vT),MWn.cd=function(){return this.g},MWn.dd=function(){return this.i},MWn.ed=function(n){throw Hp(new pv)},vX(XWn,"ImmutableEntry",238),wAn(317,238,{345:1,317:1,238:1,3:1,42:1},qW),MWn.a=0,MWn.f=0;var qnt,Gnt=vX(XWn,"HashBiMap/BiEntry",317);wAn(610,1979,jVn,il),MWn.Ac=function(n){Tcn(this,n)},MWn.Cc=function(){return new v$(this.a)},MWn.$b=function(){d5(this.a)},MWn._b=function(n){return Ltn(this.a,n)},MWn.kc=function(){return new QL(this,this.a)},MWn.wc=function(n){yX(n),BJ(this.a,new rl(n))},MWn.xc=function(n){return Uin(this,n)},MWn.ec=function(){return new p$(this)},MWn.zc=function(n,t){return C_n(this.a,n,t,!1)},MWn.Bc=function(n){var t;return(t=Zrn(this.a,n,dG(cbn(SVn,rV(dG(cbn(null==n?0:nsn(n),PVn)),15)))))?(LLn(this.a,t),t.e=null,t.c=null,t.g):null},MWn.gc=function(){return this.a.i},MWn.pd=function(){return new v$(this.a)},vX(XWn,"HashBiMap/Inverse",610),wAn(1008,534,QWn,QL),MWn.Nd=function(n){return new wT(this,n)},vX(XWn,"HashBiMap/Inverse/1",1008),wAn(1009,345,aVn,wT),MWn.cd=function(){return this.a.i},MWn.dd=function(){return this.a.g},MWn.ed=function(n){var t,e,i;return i=this.a.g,(t=dG(cbn(SVn,rV(dG(cbn(null==n?0:nsn(n),PVn)),15))))==this.a.a&&(GI(n)===GI(i)||null!=n&&Nfn(n,i))?n:(yun(!Jrn(this.b.a.a,n,t),n),LLn(this.b.a.a,this.a),e=new qW(n,t,this.a.i,this.a.f),this.a=e,YCn(this.b.a.a,e,null),this.b.b=this.b.a.a.g,i)},vX(XWn,"HashBiMap/Inverse/1/InverseEntry",1009),wAn(611,532,tVn,p$),MWn.Kc=function(){return new uy(this.a.a)},MWn.Mc=function(n){var t;return!!(t=Zrn(this.a.a,n,dG(cbn(SVn,rV(dG(cbn(null==n?0:nsn(n),PVn)),15)))))&&(LLn(this.a.a,t),!0)},vX(XWn,"HashBiMap/Inverse/InverseKeySet",611),wAn(1007,534,QWn,uy),MWn.Nd=function(n){return n.i},vX(XWn,"HashBiMap/Inverse/InverseKeySet/1",1007),wAn(1010,1,{},rl),MWn.Od=function(n,t){ev(this.a,n,t)},vX(XWn,"HashBiMap/Inverse/lambda$0$Type",1010),wAn(609,532,tVn,v$),MWn.Kc=function(){return new oy(this.a)},MWn.Mc=function(n){var t;return!!(t=Jrn(this.a,n,dG(cbn(SVn,rV(dG(cbn(null==n?0:nsn(n),PVn)),15)))))&&(LLn(this.a,t),t.e=null,t.c=null,!0)},vX(XWn,"HashBiMap/KeySet",609),wAn(1006,534,QWn,oy),MWn.Nd=function(n){return n.g},vX(XWn,"HashBiMap/KeySet/1",1006),wAn(1093,619,VWn),vX(XWn,"HashMultimapGwtSerializationDependencies",1093),wAn(265,1093,VWn,pJ),MWn.hc=function(){return new bE(etn(this.a))},MWn.gd=function(){return new bE(etn(this.a))},MWn.a=2,vX(XWn,"HashMultimap",265),wAn(1999,152,yVn),MWn.Hc=function(n){return this.Pd().Hc(n)},MWn.dc=function(){return this.Pd().dc()},MWn.gc=function(){return this.Pd().gc()},vX(XWn,"ImmutableAsList",1999),wAn(1931,715,jVn),MWn.Ld=function(){return s_(),new yk(this.a)},MWn.Cc=function(){return s_(),new yk(this.a)},MWn.pd=function(){return s_(),new yk(this.a)},vX(XWn,"ImmutableBiMap",1931),wAn(1977,1,{}),vX(XWn,"ImmutableCollection/Builder",1977),wAn(1022,703,TVn,sy),vX(XWn,"ImmutableEnumSet",1022),wAn(969,386,WWn,bK),MWn.Xb=function(n){return this.a.Xb(n)},vX(XWn,"ImmutableList/1",969),wAn(968,1977,{},sR),vX(XWn,"ImmutableList/Builder",968),wAn(614,198,UWn,cl),MWn.Ob=function(){return this.a.Ob()},MWn.Pb=function(){return BB(this.a.Pb(),42).cd()},vX(XWn,"ImmutableMap/1",614),wAn(1041,1,{},o),MWn.Kb=function(n){return BB(n,42).cd()},vX(XWn,"ImmutableMap/2methodref$getKey$Type",1041),wAn(1040,1,{},hR),vX(XWn,"ImmutableMap/Builder",1040),wAn(2e3,1981,TVn),MWn.Kc=function(){return new cl(lz(this.a).Ed())},MWn.Dd=function(){return new uv(this)},MWn.Jc=function(n){var t,e;for(yX(n),e=this.gc(),t=0;t<e;t++)n.td(BB(wz(lz(this.a)).Xb(t),42).cd())},MWn.Ed=function(){var n;return(n=this.c,n||(this.c=new uv(this))).Ed()},MWn.Nc=function(){return yq(this.gc(),1296,new ul(this))},vX(XWn,"IndexedImmutableSet",2e3),wAn(1180,2e3,TVn,cv),MWn.Kc=function(){return new cl(lz(this.a).Ed())},MWn.Hc=function(n){return this.a._b(n)},MWn.Jc=function(n){yX(n),nan(this.a,new al(n))},MWn.Ed=function(){return new cl(lz(this.a).Ed())},MWn.gc=function(){return this.a.gc()},MWn.Nc=function(){return RB(lz(this.a).Nc(),new o)},vX(XWn,"ImmutableMapKeySet",1180),wAn(1181,1,{},al),MWn.Od=function(n,t){s_(),this.a.td(n)},vX(XWn,"ImmutableMapKeySet/lambda$0$Type",1181),wAn(1178,1980,mVn,av),MWn.Kc=function(){return new KH(this)},MWn.Hc=function(n){return null!=n&&Pjn(new KH(this),n)},MWn.Ed=function(){return new KH(this)},MWn.gc=function(){return this.a.gc()},MWn.Nc=function(){return RB(lz(this.a).Nc(),new s)},vX(XWn,"ImmutableMapValues",1178),wAn(1179,1,{},s),MWn.Kb=function(n){return BB(n,42).dd()},vX(XWn,"ImmutableMapValues/0methodref$getValue$Type",1179),wAn(626,198,UWn,KH),MWn.Ob=function(){return this.a.Ob()},MWn.Pb=function(){return BB(this.a.Pb(),42).dd()},vX(XWn,"ImmutableMapValues/1",626),wAn(1182,1,{},ul),MWn.ld=function(n){return HU(this.a,n)},vX(XWn,"IndexedImmutableSet/0methodref$get$Type",1182),wAn(752,1999,yVn,uv),MWn.Pd=function(){return this.a},MWn.Xb=function(n){return HU(this.a,n)},MWn.gc=function(){return this.a.a.gc()},vX(XWn,"IndexedImmutableSet/1",752),wAn(44,1,{},h),MWn.Kb=function(n){return BB(n,20).Kc()},MWn.Fb=function(n){return this===n},vX(XWn,"Iterables/10",44),wAn(1042,537,pVn,_H),MWn.Jc=function(n){yX(n),this.b.Jc(new dT(this.a,n))},MWn.Kc=function(){return qA(this)},vX(XWn,"Iterables/4",1042),wAn(1043,1,lVn,dT),MWn.td=function(n){TS(this.b,this.a,n)},vX(XWn,"Iterables/4/lambda$0$Type",1043),wAn(1044,537,pVn,FH),MWn.Jc=function(n){yX(n),e5(this.a,new fT(n,this.b))},MWn.Kc=function(){return ZL(new AL(this.a),this.b)},vX(XWn,"Iterables/5",1044),wAn(1045,1,lVn,fT),MWn.td=function(n){this.a.td(yA(n))},vX(XWn,"Iterables/5/lambda$0$Type",1045),wAn(1071,198,UWn,ol),MWn.Ob=function(){return this.a.Ob()},MWn.Pb=function(){return this.a.Pb()},vX(XWn,"Iterators/1",1071),wAn(1072,699,UWn,lT),MWn.Yb=function(){for(var n;this.b.Ob();)if(n=this.b.Pb(),this.a.Lb(n))return n;return this.e=2,null},vX(XWn,"Iterators/5",1072),wAn(487,1,QWn),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return this.b.Ob()},MWn.Pb=function(){return this.Qd(this.b.Pb())},MWn.Qb=function(){this.b.Qb()},vX(XWn,"TransformedIterator",487),wAn(1073,487,QWn,nN),MWn.Qd=function(n){return this.a.Kb(n)},vX(XWn,"Iterators/6",1073),wAn(717,198,UWn,sl),MWn.Ob=function(){return!this.a},MWn.Pb=function(){if(this.a)throw Hp(new yv);return this.a=!0,this.b},MWn.a=!1,vX(XWn,"Iterators/9",717),wAn(1070,386,WWn,fG),MWn.Xb=function(n){return this.a[this.b+n]},MWn.b=0,vX(XWn,"Iterators/ArrayItr",1070),wAn(39,1,{39:1,47:1},oz),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return dAn(this)},MWn.Pb=function(){return U5(this)},MWn.Qb=function(){han(!!this.c),this.c.Qb(),this.c=null},vX(XWn,"Iterators/ConcatenatedIterator",39),wAn(22,1,{3:1,35:1,22:1}),MWn.wd=function(n){return Py(this,BB(n,22))},MWn.Fb=function(n){return this===n},MWn.Hb=function(){return PN(this)},MWn.Ib=function(){return dx(this)},MWn.g=0;var znt,Unt=vX(RWn,"Enum",22);wAn(538,22,{538:1,3:1,35:1,22:1,47:1},cN),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return!1},MWn.Pb=function(){throw Hp(new yv)},MWn.Qb=function(){han(!1)};var Xnt,Wnt=Ben(XWn,"Iterators/EmptyModifiableIterator",538,Unt,oX,rx);wAn(1834,619,VWn),vX(XWn,"LinkedHashMultimapGwtSerializationDependencies",1834),wAn(1835,1834,VWn,Thn),MWn.hc=function(){return new LN(etn(this.b))},MWn.$b=function(){win(this),iv(this.a,this.a)},MWn.gd=function(){return new LN(etn(this.b))},MWn.ic=function(n){return new Tsn(this,n,this.b)},MWn.kc=function(){return new tN(this)},MWn.lc=function(){return new w1(BB(this.g||(this.g=new qm(this)),21),17)},MWn.ec=function(){return this.i||(this.i=new HL(this,this.c))},MWn.nc=function(){return new by(new tN(this))},MWn.oc=function(){return RB(new w1(BB(this.g||(this.g=new qm(this)),21),17),new f)},MWn.b=2,vX(XWn,"LinkedHashMultimap",1835),wAn(1838,1,{},f),MWn.Kb=function(n){return BB(n,42).dd()},vX(XWn,"LinkedHashMultimap/0methodref$getValue$Type",1838),wAn(824,1,QWn,tN),MWn.Nb=function(n){fU(this,n)},MWn.Pb=function(){return vtn(this)},MWn.Ob=function(){return this.a!=this.b.a},MWn.Qb=function(){han(!!this.c),q0(this.b,this.c.g,this.c.i),this.c=null},vX(XWn,"LinkedHashMultimap/1",824),wAn(330,238,{345:1,238:1,330:1,2020:1,3:1,42:1},HW),MWn.Rd=function(){return this.f},MWn.Sd=function(n){this.c=n},MWn.Td=function(n){this.f=n},MWn.d=0;var Vnt,Qnt=vX(XWn,"LinkedHashMultimap/ValueEntry",330);wAn(1836,1970,{2020:1,20:1,28:1,14:1,21:1},Tsn),MWn.Fc=function(n){var t,e,i,r,c;for(t=(c=dG(cbn(SVn,rV(dG(cbn(null==n?0:nsn(n),PVn)),15))))&this.b.length-1,e=r=this.b[t];e;e=e.a)if(e.d==c&&wW(e.i,n))return!1;return i=new HW(this.c,n,c,r),kk(this.d,i),i.f=this,this.d=i,iv(this.g.a.b,i),iv(i,this.g.a),this.b[t]=i,++this.f,++this.e,yjn(this),!0},MWn.$b=function(){var n,t;for(yS(this.b,null),this.f=0,n=this.a;n!=this;n=n.Rd())iv((t=BB(n,330)).b,t.e);this.a=this,this.d=this,++this.e},MWn.Hc=function(n){var t,e;for(e=dG(cbn(SVn,rV(dG(cbn(null==n?0:nsn(n),PVn)),15))),t=this.b[e&this.b.length-1];t;t=t.a)if(t.d==e&&wW(t.i,n))return!0;return!1},MWn.Jc=function(n){var t;for(yX(n),t=this.a;t!=this;t=t.Rd())n.td(BB(t,330).i)},MWn.Rd=function(){return this.a},MWn.Kc=function(){return new sW(this)},MWn.Mc=function(n){return kAn(this,n)},MWn.Sd=function(n){this.d=n},MWn.Td=function(n){this.a=n},MWn.gc=function(){return this.f},MWn.e=0,MWn.f=0,vX(XWn,"LinkedHashMultimap/ValueSet",1836),wAn(1837,1,QWn,sW),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return wG(this),this.b!=this.c},MWn.Pb=function(){var n,t;if(wG(this),this.b==this.c)throw Hp(new yv);return t=(n=BB(this.b,330)).i,this.d=n,this.b=n.f,t},MWn.Qb=function(){wG(this),han(!!this.d),kAn(this.c,this.d.i),this.a=this.c.e,this.d=null},MWn.a=0,vX(XWn,"LinkedHashMultimap/ValueSet/1",1837),wAn(766,1986,VWn,PO),MWn.Zb=function(){return this.f||(this.f=new rS(this))},MWn.Fb=function(n){return jsn(this,n)},MWn.cc=function(n){return new mT(this,n)},MWn.fc=function(n){return J3(this,n)},MWn.$b=function(){cX(this)},MWn._b=function(n){return HT(this,n)},MWn.ac=function(){return new rS(this)},MWn.bc=function(){return new yl(this)},MWn.qc=function(n){return new mT(this,n)},MWn.dc=function(){return!this.a},MWn.rc=function(n){return J3(this,n)},MWn.gc=function(){return this.d},MWn.c=0,MWn.d=0,vX(XWn,"LinkedListMultimap",766),wAn(52,28,LVn),MWn.ad=function(n){_rn(this,n)},MWn.Nc=function(){return new w1(this,16)},MWn.Vc=function(n,t){throw Hp(new tk("Add not supported on this list"))},MWn.Fc=function(n){return this.Vc(this.gc(),n),!0},MWn.Wc=function(n,t){var e,i,r;for(kW(t),e=!1,r=t.Kc();r.Ob();)i=r.Pb(),this.Vc(n++,i),e=!0;return e},MWn.$b=function(){this.Ud(0,this.gc())},MWn.Fb=function(n){return NAn(this,n)},MWn.Hb=function(){return Fon(this)},MWn.Xc=function(n){return bin(this,n)},MWn.Kc=function(){return new Sb(this)},MWn.Yc=function(){return this.Zc(0)},MWn.Zc=function(n){return new M2(this,n)},MWn.$c=function(n){throw Hp(new tk("Remove not supported on this list"))},MWn.Ud=function(n,t){var e,i;for(i=this.Zc(n),e=n;e<t;++e)i.Pb(),i.Qb()},MWn._c=function(n,t){throw Hp(new tk("Set not supported on this list"))},MWn.bd=function(n,t){return new s1(this,n,t)},MWn.j=0,vX(YWn,"AbstractList",52),wAn(1964,52,LVn),MWn.Vc=function(n,t){Kx(this,n,t)},MWn.Wc=function(n,t){return Asn(this,n,t)},MWn.Xb=function(n){return Dpn(this,n)},MWn.Kc=function(){return this.Zc(0)},MWn.$c=function(n){return tkn(this,n)},MWn._c=function(n,t){var e,i;e=this.Zc(n);try{return i=e.Pb(),e.Wb(t),i}catch(r){throw cL(r=lun(r),109)?Hp(new Ay("Can't set element "+n)):Hp(r)}},vX(YWn,"AbstractSequentialList",1964),wAn(636,1964,LVn,mT),MWn.Zc=function(n){return vN(this,n)},MWn.gc=function(){var n;return(n=BB(RX(this.a.b,this.b),283))?n.a:0},vX(XWn,"LinkedListMultimap/1",636),wAn(1297,1970,tVn,yl),MWn.Hc=function(n){return HT(this.a,n)},MWn.Kc=function(){return new vrn(this.a)},MWn.Mc=function(n){return!J3(this.a,n).a.dc()},MWn.gc=function(){return NT(this.a.b)},vX(XWn,"LinkedListMultimap/1KeySetImpl",1297),wAn(1296,1,QWn,vrn),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return bG(this),!!this.c},MWn.Pb=function(){bG(this),oN(this.c),this.a=this.c,TU(this.d,this.a.a);do{this.c=this.c.b}while(this.c&&!TU(this.d,this.c.a));return this.a.a},MWn.Qb=function(){bG(this),han(!!this.a),Cq(new C7(this.e,this.a.a)),this.a=null,this.b=this.e.c},MWn.b=0,vX(XWn,"LinkedListMultimap/DistinctKeyIterator",1296),wAn(283,1,{283:1},sY),MWn.a=0,vX(XWn,"LinkedListMultimap/KeyList",283),wAn(1295,345,aVn,yT),MWn.cd=function(){return this.a},MWn.dd=function(){return this.f},MWn.ed=function(n){var t;return t=this.f,this.f=n,t},vX(XWn,"LinkedListMultimap/Node",1295),wAn(560,1,cVn,C7,KPn),MWn.Nb=function(n){fU(this,n)},MWn.Rb=function(n){this.e=yKn(this.f,this.b,n,this.c),++this.d,this.a=null},MWn.Ob=function(){return!!this.c},MWn.Sb=function(){return!!this.e},MWn.Pb=function(){return EZ(this)},MWn.Tb=function(){return this.d},MWn.Ub=function(){return TZ(this)},MWn.Vb=function(){return this.d-1},MWn.Qb=function(){han(!!this.a),this.a!=this.c?(this.e=this.a.e,--this.d):this.c=this.a.c,ZCn(this.f,this.a),this.a=null},MWn.Wb=function(n){uN(!!this.a),this.a.f=n},MWn.d=0,vX(XWn,"LinkedListMultimap/ValueForKeyIterator",560),wAn(1018,52,LVn),MWn.Vc=function(n,t){this.a.Vc(n,t)},MWn.Wc=function(n,t){return this.a.Wc(n,t)},MWn.Hc=function(n){return this.a.Hc(n)},MWn.Xb=function(n){return this.a.Xb(n)},MWn.$c=function(n){return this.a.$c(n)},MWn._c=function(n,t){return this.a._c(n,t)},MWn.gc=function(){return this.a.gc()},vX(XWn,"Lists/AbstractListWrapper",1018),wAn(1019,1018,xVn),vX(XWn,"Lists/RandomAccessListWrapper",1019),wAn(1021,1019,xVn,IT),MWn.Zc=function(n){return this.a.Zc(n)},vX(XWn,"Lists/1",1021),wAn(131,52,{131:1,20:1,28:1,52:1,14:1,15:1},CT),MWn.Vc=function(n,t){this.a.Vc(pU(this,n),t)},MWn.$b=function(){this.a.$b()},MWn.Xb=function(n){return this.a.Xb(LX(this,n))},MWn.Kc=function(){return W1(this,0)},MWn.Zc=function(n){return W1(this,n)},MWn.$c=function(n){return this.a.$c(LX(this,n))},MWn.Ud=function(n,t){(d2(n,t,this.a.gc()),ean(this.a.bd(pU(this,t),pU(this,n)))).$b()},MWn._c=function(n,t){return this.a._c(LX(this,n),t)},MWn.gc=function(){return this.a.gc()},MWn.bd=function(n,t){return d2(n,t,this.a.gc()),ean(this.a.bd(pU(this,t),pU(this,n)))},vX(XWn,"Lists/ReverseList",131),wAn(280,131,{131:1,20:1,28:1,52:1,14:1,15:1,54:1},fy),vX(XWn,"Lists/RandomAccessReverseList",280),wAn(1020,1,cVn,kT),MWn.Nb=function(n){fU(this,n)},MWn.Rb=function(n){this.c.Rb(n),this.c.Ub(),this.a=!1},MWn.Ob=function(){return this.c.Sb()},MWn.Sb=function(){return this.c.Ob()},MWn.Pb=function(){return w5(this)},MWn.Tb=function(){return pU(this.b,this.c.Tb())},MWn.Ub=function(){if(!this.c.Ob())throw Hp(new yv);return this.a=!0,this.c.Pb()},MWn.Vb=function(){return pU(this.b,this.c.Tb())-1},MWn.Qb=function(){han(this.a),this.c.Qb(),this.a=!1},MWn.Wb=function(n){uN(this.a),this.c.Wb(n)},MWn.a=!1,vX(XWn,"Lists/ReverseList/1",1020),wAn(432,487,QWn,ly),MWn.Qd=function(n){return cS(n)},vX(XWn,"Maps/1",432),wAn(698,487,QWn,by),MWn.Qd=function(n){return BB(n,42).dd()},vX(XWn,"Maps/2",698),wAn(962,487,QWn,pN),MWn.Qd=function(n){return new vT(n,_O(this.a,n))},vX(XWn,"Maps/3",962),wAn(959,1971,tVn,ml),MWn.Jc=function(n){xv(this.a,n)},MWn.Kc=function(){return this.a.kc()},MWn.Rc=function(){return this.a},MWn.Nc=function(){return this.a.lc()},vX(XWn,"Maps/IteratorBasedAbstractMap/1",959),wAn(960,1,{},vl),MWn.Od=function(n,t){this.a.td(n)},vX(XWn,"Maps/KeySet/lambda$0$Type",960),wAn(958,28,ZWn,PT),MWn.$b=function(){this.a.$b()},MWn.Hc=function(n){return this.a.uc(n)},MWn.Jc=function(n){yX(n),this.a.wc(new ll(n))},MWn.dc=function(){return this.a.dc()},MWn.Kc=function(){return new by(this.a.vc().Kc())},MWn.Mc=function(n){var t,e;try{return ywn(this,n,!0)}catch(i){if(cL(i=lun(i),41)){for(e=this.a.vc().Kc();e.Ob();)if(wW(n,(t=BB(e.Pb(),42)).dd()))return this.a.Bc(t.cd()),!0;return!1}throw Hp(i)}},MWn.gc=function(){return this.a.gc()},vX(XWn,"Maps/Values",958),wAn(961,1,{},ll),MWn.Od=function(n,t){this.a.td(t)},vX(XWn,"Maps/Values/lambda$0$Type",961),wAn(736,1987,JWn,rS),MWn.xc=function(n){return this.a._b(n)?this.a.cc(n):null},MWn.Bc=function(n){return this.a._b(n)?this.a.fc(n):null},MWn.$b=function(){this.a.$b()},MWn._b=function(n){return this.a._b(n)},MWn.Ec=function(){return new fl(this)},MWn.Dc=function(){return this.Ec()},MWn.dc=function(){return this.a.dc()},MWn.ec=function(){return this.a.ec()},MWn.gc=function(){return this.a.ec().gc()},vX(XWn,"Multimaps/AsMap",736),wAn(1104,1971,tVn,fl),MWn.Kc=function(){return nL(this.a.a.ec(),new bl(this))},MWn.Rc=function(){return this.a},MWn.Mc=function(n){var t;return!!idn(this,n)&&(t=BB(n,42),jk(this.a,t.cd()),!0)},vX(XWn,"Multimaps/AsMap/EntrySet",1104),wAn(1108,1,{},bl),MWn.Kb=function(n){return _O(this,n)},MWn.Fb=function(n){return this===n},vX(XWn,"Multimaps/AsMap/EntrySet/1",1108),wAn(543,1989,{543:1,835:1,20:1,28:1,14:1},wl),MWn.$b=function(){win(this.a)},MWn.Hc=function(n){return Wj(this.a,n)},MWn.Jc=function(n){yX(n),e5(MX(this.a),new gl(n))},MWn.Kc=function(){return new ly(MX(this.a).a.kc())},MWn.gc=function(){return this.a.d},MWn.Nc=function(){return RB(MX(this.a).Nc(),new l)},vX(XWn,"Multimaps/Keys",543),wAn(1106,1,{},l),MWn.Kb=function(n){return BB(n,42).cd()},vX(XWn,"Multimaps/Keys/0methodref$getKey$Type",1106),wAn(1105,487,QWn,wy),MWn.Qd=function(n){return new dl(BB(n,42))},vX(XWn,"Multimaps/Keys/1",1105),wAn(1990,1,{416:1}),MWn.Fb=function(n){var t;return!!cL(n,492)&&(t=BB(n,416),BB(this.a.dd(),14).gc()==BB(t.a.dd(),14).gc()&&wW(this.a.cd(),t.a.cd()))},MWn.Hb=function(){var n;return(null==(n=this.a.cd())?0:nsn(n))^BB(this.a.dd(),14).gc()},MWn.Ib=function(){var n,t;return t=kN(this.a.cd()),1==(n=BB(this.a.dd(),14).gc())?t:t+" x "+n},vX(XWn,"Multisets/AbstractEntry",1990),wAn(492,1990,{492:1,416:1},dl),vX(XWn,"Multimaps/Keys/1/1",492),wAn(1107,1,lVn,gl),MWn.td=function(n){this.a.td(BB(n,42).cd())},vX(XWn,"Multimaps/Keys/lambda$1$Type",1107),wAn(1110,1,lVn,b),MWn.td=function(n){Iq(BB(n,416))},vX(XWn,"Multiset/lambda$0$Type",1110),wAn(737,1,lVn,pl),MWn.td=function(n){Itn(this.a,BB(n,416))},vX(XWn,"Multiset/lambda$1$Type",737),wAn(1111,1,{},m),vX(XWn,"Multisets/0methodref$add$Type",1111),wAn(738,1,{},y),MWn.Kb=function(n){return s3(BB(n,416))},vX(XWn,"Multisets/lambda$3$Type",738),wAn(2008,1,KWn),vX(XWn,"RangeGwtSerializationDependencies",2008),wAn(514,2008,{169:1,514:1,3:1,45:1},svn),MWn.Lb=function(n){return Mz(this,BB(n,35))},MWn.Mb=function(n){return Mz(this,BB(n,35))},MWn.Fb=function(n){var t;return!!cL(n,514)&&(t=BB(n,514),xdn(this.a,t.a)&&xdn(this.b,t.b))},MWn.Hb=function(){return 31*this.a.Hb()+this.b.Hb()},MWn.Ib=function(){return B3(this.a,this.b)},vX(XWn,"Range",514),wAn(778,1999,yVn,aU),MWn.Zc=function(n){return ix(this.b,n)},MWn.Pd=function(){return this.a},MWn.Xb=function(n){return WI(this.b,n)},MWn.Fd=function(n){return ix(this.b,n)},vX(XWn,"RegularImmutableAsList",778),wAn(646,2006,yVn,SY),MWn.Hd=function(){return this.a},vX(XWn,"RegularImmutableList",646),wAn(616,715,jVn,hy),vX(XWn,"RegularImmutableMap",616),wAn(716,703,TVn,vS),vX(XWn,"RegularImmutableSet",716),wAn(1976,nVn,tVn),MWn.Kc=function(){return new SV(this.a,this.b)},MWn.Fc=function(n){throw Hp(new pv)},MWn.Gc=function(n){throw Hp(new pv)},MWn.$b=function(){throw Hp(new pv)},MWn.Mc=function(n){throw Hp(new pv)},vX(XWn,"Sets/SetView",1976),wAn(963,1976,tVn,ET),MWn.Kc=function(){return new SV(this.a,this.b)},MWn.Hc=function(n){return CG(this.a,n)&&this.b.Hc(n)},MWn.Ic=function(n){return oun(this.a,n)&&this.b.Ic(n)},MWn.dc=function(){return Kpn(this.b,this.a)},MWn.Lc=function(){return AV(new Rq(null,new w1(this.a,1)),new jl(this.b))},MWn.gc=function(){return Can(this)},MWn.Oc=function(){return AV(new Rq(null,new w1(this.a,1)),new kl(this.b))},vX(XWn,"Sets/2",963),wAn(700,699,UWn,SV),MWn.Yb=function(){for(var n;k$(this.a);)if(n=u4(this.a),this.c.Hc(n))return n;return this.e=2,null},vX(XWn,"Sets/2/1",700),wAn(964,1,DVn,kl),MWn.Mb=function(n){return this.a.Hc(n)},vX(XWn,"Sets/2/4methodref$contains$Type",964),wAn(965,1,DVn,jl),MWn.Mb=function(n){return this.a.Hc(n)},vX(XWn,"Sets/2/5methodref$contains$Type",965),wAn(607,1975,{607:1,3:1,20:1,14:1,271:1,21:1,84:1},bJ),MWn.Bd=function(){return this.b},MWn.Cd=function(){return this.b},MWn.Md=function(){return this.b},MWn.Jc=function(n){this.a.Jc(n)},MWn.Lc=function(){return this.a.Lc()},MWn.Oc=function(){return this.a.Oc()},vX(XWn,"Sets/UnmodifiableNavigableSet",607),wAn(1932,1931,jVn,GW),MWn.Ld=function(){return s_(),new yk(this.a)},MWn.Cc=function(){return s_(),new yk(this.a)},MWn.pd=function(){return s_(),new yk(this.a)},vX(XWn,"SingletonImmutableBiMap",1932),wAn(647,2006,yVn,Pq),MWn.Hd=function(){return this.a},vX(XWn,"SingletonImmutableList",647),wAn(350,1981,TVn,yk),MWn.Kc=function(){return new sl(this.a)},MWn.Hc=function(n){return Nfn(this.a,n)},MWn.Ed=function(){return new sl(this.a)},MWn.gc=function(){return 1},vX(XWn,"SingletonImmutableSet",350),wAn(1115,1,{},k),MWn.Kb=function(n){return BB(n,164)},vX(XWn,"Streams/lambda$0$Type",1115),wAn(1116,1,RVn,El),MWn.Vd=function(){B5(this.a)},vX(XWn,"Streams/lambda$1$Type",1116),wAn(1659,1658,VWn,pY),MWn.Zb=function(){return BB(BB(this.f||(this.f=cL(this.c,171)?new ID(this,BB(this.c,171)):cL(this.c,161)?new CD(this,BB(this.c,161)):new pT(this,this.c)),161),171)},MWn.hc=function(){return new dE(this.b)},MWn.gd=function(){return new dE(this.b)},MWn.ec=function(){return BB(BB(this.i||(this.i=cL(this.c,171)?new tT(this,BB(this.c,171)):cL(this.c,161)?new nT(this,BB(this.c,161)):new HL(this,this.c)),84),271)},MWn.ac=function(){return cL(this.c,171)?new ID(this,BB(this.c,171)):cL(this.c,161)?new CD(this,BB(this.c,161)):new pT(this,this.c)},MWn.ic=function(n){return null==n&&this.a.ue(n,n),new dE(this.b)},vX(XWn,"TreeMultimap",1659),wAn(78,1,{3:1,78:1}),MWn.Wd=function(n){return new Error(n)},MWn.Xd=function(){return this.e},MWn.Yd=function(){return _wn($V(LU((null==this.k&&(this.k=x8(Jnt,sVn,78,0,0,1)),this.k)),new x),new on)},MWn.Zd=function(){return this.f},MWn.$d=function(){return this.g},MWn._d=function(){yy(this,b2(this.Wd(CY(this,this.g)))),ov(this)},MWn.Ib=function(){return CY(this,this.$d())},MWn.e=FVn,MWn.i=!1,MWn.n=!0;var Ynt,Jnt=vX(RWn,"Throwable",78);wAn(102,78,{3:1,102:1,78:1}),vX(RWn,"Exception",102),wAn(60,102,BVn,sv,dy),vX(RWn,"RuntimeException",60),wAn(598,60,BVn),vX(RWn,"JsException",598),wAn(863,598,BVn),vX(HVn,"JavaScriptExceptionBase",863),wAn(477,863,{477:1,3:1,102:1,60:1,78:1},jhn),MWn.$d=function(){return pEn(this),this.c},MWn.ae=function(){return GI(this.b)===GI(Ynt)?null:this.b},vX(GVn,"JavaScriptException",477);var Znt,ntt=vX(GVn,"JavaScriptObject$",0);wAn(1948,1,{}),vX(GVn,"Scheduler",1948);var ttt,ett,itt,rtt,ctt=0,att=0,utt=-1;wAn(890,1948,{},j),vX(HVn,"SchedulerImpl",890),wAn(1960,1,{}),vX(HVn,"StackTraceCreator/Collector",1960),wAn(864,1960,{},E),MWn.be=function(n){var t={},e=[];n[UVn]=e;for(var i=arguments.callee.caller;i;){var r=(PY(),i.name||(i.name=Ven(i.toString())));e.push(r);var c,a,u=":"+r,o=t[u];if(o)for(c=0,a=o.length;c<a;c++)if(o[c]===i)return;(o||(t[u]=[])).push(i),i=i.caller}},MWn.ce=function(n){var t,e,i,r;for(PY(),e=(i=n&&n[UVn]?n[UVn]:[]).length,r=x8(Ftt,sVn,310,e,0,1),t=0;t<e;t++)r[t]=new PV(i[t],null,-1);return r},vX(HVn,"StackTraceCreator/CollectorLegacy",864),wAn(1961,1960,{}),MWn.be=function(n){},MWn.de=function(n,t,e,i){return new PV(t,n+"@"+i,e<0?-1:e)},MWn.ce=function(n){var t,e,i,r,c,a;if(r=lyn(n),c=x8(Ftt,sVn,310,0,0,1),t=0,0==(i=r.length))return c;for(mK((a=Oqn(this,r[0])).d,zVn)||(c[t++]=a),e=1;e<i;e++)c[t++]=Oqn(this,r[e]);return c},vX(HVn,"StackTraceCreator/CollectorModern",1961),wAn(865,1961,{},d),MWn.de=function(n,t,e,i){return new PV(t,n,-1)},vX(HVn,"StackTraceCreator/CollectorModernNoSourceMap",865),wAn(1050,1,{}),vX(yQn,kQn,1050),wAn(615,1050,{615:1},zX),vX(jQn,kQn,615),wAn(2001,1,{}),vX(yQn,EQn,2001),wAn(2002,2001,{}),vX(jQn,EQn,2002),wAn(1090,1,{},g),vX(jQn,"LocaleInfo",1090),wAn(1918,1,{},p),MWn.a=0,vX(jQn,"TimeZone",1918),wAn(1258,2002,{},w),vX("com.google.gwt.i18n.client.impl.cldr","DateTimeFormatInfoImpl",1258),wAn(434,1,{434:1},VB),MWn.a=!1,MWn.b=0,vX(yQn,"DateTimeFormat/PatternPart",434),wAn(199,1,TQn,AT,von,PD),MWn.wd=function(n){return J0(this,BB(n,199))},MWn.Fb=function(n){return cL(n,199)&&QI(fan(this.q.getTime()),fan(BB(n,199).q.getTime()))},MWn.Hb=function(){var n;return dG(r0(n=fan(this.q.getTime()),jz(n,32)))},MWn.Ib=function(){var n,t,i;return n=((i=-this.q.getTimezoneOffset())>=0?"+":"")+(i/60|0),t=UO(e.Math.abs(i)%60),(pMn(),pet)[this.q.getDay()]+" "+vet[this.q.getMonth()]+" "+UO(this.q.getDate())+" "+UO(this.q.getHours())+":"+UO(this.q.getMinutes())+":"+UO(this.q.getSeconds())+" GMT"+n+t+" "+this.q.getFullYear()};var ott,stt,htt,ftt,ltt,btt,wtt,dtt,gtt,ptt,vtt,mtt=vX(YWn,"Date",199);wAn(1915,199,TQn,Ykn),MWn.a=!1,MWn.b=0,MWn.c=0,MWn.d=0,MWn.e=0,MWn.f=0,MWn.g=!1,MWn.i=0,MWn.j=0,MWn.k=0,MWn.n=0,MWn.o=0,MWn.p=0,vX("com.google.gwt.i18n.shared.impl","DateRecord",1915),wAn(1966,1,{}),MWn.fe=function(){return null},MWn.ge=function(){return null},MWn.he=function(){return null},MWn.ie=function(){return null},MWn.je=function(){return null},vX(MQn,"JSONValue",1966),wAn(216,1966,{216:1},Cl,Tl),MWn.Fb=function(n){return!!cL(n,216)&&v0(this.a,BB(n,216).a)},MWn.ee=function(){return qp},MWn.Hb=function(){return tY(this.a)},MWn.fe=function(){return this},MWn.Ib=function(){var n,t,e;for(e=new lN("["),t=0,n=this.a.length;t<n;t++)t>0&&(e.a+=","),uO(e,dnn(this,t));return e.a+="]",e.a},vX(MQn,"JSONArray",216),wAn(483,1966,{483:1},Ml),MWn.ee=function(){return Gp},MWn.ge=function(){return this},MWn.Ib=function(){return hN(),""+this.a},MWn.a=!1,vX(MQn,"JSONBoolean",483),wAn(985,60,BVn,gy),vX(MQn,"JSONException",985),wAn(1023,1966,{},v),MWn.ee=function(){return Vp},MWn.Ib=function(){return zWn},vX(MQn,"JSONNull",1023),wAn(258,1966,{258:1},Sl),MWn.Fb=function(n){return!!cL(n,258)&&this.a==BB(n,258).a},MWn.ee=function(){return zp},MWn.Hb=function(){return VO(this.a)},MWn.he=function(){return this},MWn.Ib=function(){return this.a+""},MWn.a=0,vX(MQn,"JSONNumber",258),wAn(183,1966,{183:1},py,Pl),MWn.Fb=function(n){return!!cL(n,183)&&v0(this.a,BB(n,183).a)},MWn.ee=function(){return Up},MWn.Hb=function(){return tY(this.a)},MWn.ie=function(){return this},MWn.Ib=function(){var n,t,e,i,r,c;for(c=new lN("{"),n=!0,i=0,r=(e=jrn(this,x8(Qtt,sVn,2,0,6,1))).length;i<r;++i)t=e[i],n?n=!1:c.a+=FWn,oO(c,mOn(t)),c.a+=":",uO(c,zJ(this,t));return c.a+="}",c.a},vX(MQn,"JSONObject",183),wAn(596,nVn,tVn,TT),MWn.Hc=function(n){return XI(n)&&zk(this.a,SD(n))},MWn.Kc=function(){return new Sb(new Jy(this.b))},MWn.gc=function(){return this.b.length},vX(MQn,"JSONObject/1",596),wAn(204,1966,{204:1},GX),MWn.Fb=function(n){return!!cL(n,204)&&mK(this.a,BB(n,204).a)},MWn.ee=function(){return Xp},MWn.Hb=function(){return vvn(this.a)},MWn.je=function(){return this},MWn.Ib=function(){return mOn(this.a)},vX(MQn,"JSONString",204),wAn(1962,1,{525:1}),vX(LQn,"OutputStream",1962),wAn(1963,1962,{525:1}),vX(LQn,"FilterOutputStream",1963),wAn(866,1963,{525:1},A),vX(LQn,"PrintStream",866),wAn(418,1,{475:1}),MWn.Ib=function(){return this.a},vX(RWn,"AbstractStringBuilder",418),wAn(529,60,BVn,Oy),vX(RWn,"ArithmeticException",529),wAn(73,60,NQn,fv,Ay),vX(RWn,"IndexOutOfBoundsException",73),wAn(320,73,{3:1,320:1,102:1,73:1,60:1,78:1},Sv,Tk),vX(RWn,"ArrayIndexOutOfBoundsException",320),wAn(528,60,BVn,lv,$y),vX(RWn,"ArrayStoreException",528),wAn(289,78,xQn,Ly),vX(RWn,"Error",289),wAn(194,289,xQn,hv,g5),vX(RWn,"AssertionError",194),CWn={3:1,476:1,35:1};var ytt,ktt=vX(RWn,"Boolean",476);wAn(236,1,{3:1,236:1}),vX(RWn,"Number",236),wAn(217,236,{3:1,217:1,35:1,236:1},$b),MWn.wd=function(n){return Fk(this,BB(n,217))},MWn.ke=function(){return this.a},MWn.Fb=function(n){return cL(n,217)&&BB(n,217).a==this.a},MWn.Hb=function(){return this.a},MWn.Ib=function(){return""+this.a},MWn.a=0;var jtt,Ett,Ttt=vX(RWn,"Byte",217);wAn(172,1,{3:1,172:1,35:1},Lb),MWn.wd=function(n){return Bk(this,BB(n,172))},MWn.Fb=function(n){return cL(n,172)&&BB(n,172).a==this.a},MWn.Hb=function(){return this.a},MWn.Ib=function(){return String.fromCharCode(this.a)},MWn.a=0;var Mtt,Stt=vX(RWn,"Character",172);wAn(205,60,{3:1,205:1,102:1,60:1,78:1},bv,Ky),vX(RWn,"ClassCastException",205),IWn={3:1,35:1,333:1,236:1};var Ptt=vX(RWn,"Double",333);wAn(155,236,{3:1,35:1,155:1,236:1},Nb,Dv),MWn.wd=function(n){return BO(this,BB(n,155))},MWn.ke=function(){return this.a},MWn.Fb=function(n){return cL(n,155)&&vK(this.a,BB(n,155).a)},MWn.Hb=function(){return CJ(this.a)},MWn.Ib=function(){return""+this.a},MWn.a=0;var Ctt=vX(RWn,"Float",155);wAn(32,60,{3:1,102:1,32:1,60:1,78:1},wv,_y,Fsn),vX(RWn,"IllegalArgumentException",32),wAn(71,60,BVn,dv,Fy),vX(RWn,"IllegalStateException",71),wAn(19,236,{3:1,35:1,19:1,236:1},xb),MWn.wd=function(n){return HO(this,BB(n,19))},MWn.ke=function(){return this.a},MWn.Fb=function(n){return cL(n,19)&&BB(n,19).a==this.a},MWn.Hb=function(){return this.a},MWn.Ib=function(){return""+this.a},MWn.a=0;var Itt,Ott,Att=vX(RWn,"Integer",19);wAn(162,236,{3:1,35:1,162:1,236:1},Db),MWn.wd=function(n){return qO(this,BB(n,162))},MWn.ke=function(){return j2(this.a)},MWn.Fb=function(n){return cL(n,162)&&QI(BB(n,162).a,this.a)},MWn.Hb=function(){return dG(this.a)},MWn.Ib=function(){return""+vz(this.a)},MWn.a=0;var $tt,Ltt,Ntt,xtt,Dtt,Rtt=vX(RWn,"Long",162);wAn(2039,1,{}),wAn(1831,60,BVn,By),vX(RWn,"NegativeArraySizeException",1831),wAn(173,598,{3:1,102:1,173:1,60:1,78:1},gv,Hy),MWn.Wd=function(n){return new TypeError(n)},vX(RWn,"NullPointerException",173),wAn(127,32,{3:1,102:1,32:1,127:1,60:1,78:1},Mk),vX(RWn,"NumberFormatException",127),wAn(184,236,{3:1,35:1,236:1,184:1},Rb),MWn.wd=function(n){return Hk(this,BB(n,184))},MWn.ke=function(){return this.a},MWn.Fb=function(n){return cL(n,184)&&BB(n,184).a==this.a},MWn.Hb=function(){return this.a},MWn.Ib=function(){return""+this.a},MWn.a=0;var Ktt,_tt=vX(RWn,"Short",184);wAn(310,1,{3:1,310:1},PV),MWn.Fb=function(n){var t;return!!cL(n,310)&&(t=BB(n,310),this.c==t.c&&this.d==t.d&&this.a==t.a&&this.b==t.b)},MWn.Hb=function(){return fhn(Pun(Gk(Ant,1),HWn,1,5,[iln(this.c),this.a,this.d,this.b]))},MWn.Ib=function(){return this.a+"."+this.d+"("+(null!=this.b?this.b:"Unknown Source")+(this.c>=0?":"+this.c:"")+")"},MWn.c=0;var Ftt=vX(RWn,"StackTraceElement",310);OWn={3:1,475:1,35:1,2:1};var Btt,Htt,qtt,Gtt,ztt,Utt,Xtt,Wtt,Vtt,Qtt=vX(RWn,qVn,2);wAn(107,418,{475:1},Sk,Pk,fN),vX(RWn,"StringBuffer",107),wAn(100,418,{475:1},Ck,Ik,lN),vX(RWn,"StringBuilder",100),wAn(687,73,NQn,Ok),vX(RWn,"StringIndexOutOfBoundsException",687),wAn(2043,1,{}),wAn(844,1,{},x),MWn.Kb=function(n){return BB(n,78).e},vX(RWn,"Throwable/lambda$0$Type",844),wAn(41,60,{3:1,102:1,60:1,78:1,41:1},pv,tk),vX(RWn,"UnsupportedOperationException",41),wAn(240,236,{3:1,35:1,236:1,240:1},knn,wE),MWn.wd=function(n){return J_n(this,BB(n,240))},MWn.ke=function(){return bSn(eqn(this))},MWn.Fb=function(n){var t;return this===n||!!cL(n,240)&&(t=BB(n,240),this.e==t.e&&0==J_n(this,t))},MWn.Hb=function(){var n;return 0!=this.b?this.b:this.a<54?(n=fan(this.f),this.b=dG(e0(n,-1)),this.b=33*this.b+dG(e0(kz(n,32),-1)),this.b=17*this.b+CJ(this.e),this.b):(this.b=17*Khn(this.c)+CJ(this.e),this.b)},MWn.Ib=function(){return eqn(this)},MWn.a=0,MWn.b=0,MWn.d=0,MWn.e=0,MWn.f=0;var Ytt,Jtt,Ztt,net,tet,eet,iet=vX("java.math","BigDecimal",240);wAn(91,236,{3:1,35:1,236:1,91:1},Rpn,X6,lU,vEn,Cgn,$A),MWn.wd=function(n){return tgn(this,BB(n,91))},MWn.ke=function(){return bSn(qXn(this,0))},MWn.Fb=function(n){return swn(this,n)},MWn.Hb=function(){return Khn(this)},MWn.Ib=function(){return qXn(this,0)},MWn.b=-2,MWn.c=0,MWn.d=0,MWn.e=0;var ret,cet,aet,uet,oet=vX("java.math","BigInteger",91);wAn(488,1967,JWn),MWn.$b=function(){$U(this)},MWn._b=function(n){return hU(this,n)},MWn.uc=function(n){return Lsn(this,n,this.g)||Lsn(this,n,this.f)},MWn.vc=function(){return new Pb(this)},MWn.xc=function(n){return RX(this,n)},MWn.zc=function(n,t){return VW(this,n,t)},MWn.Bc=function(n){return v6(this,n)},MWn.gc=function(){return NT(this)},vX(YWn,"AbstractHashMap",488),wAn(261,nVn,tVn,Pb),MWn.$b=function(){this.a.$b()},MWn.Hc=function(n){return m2(this,n)},MWn.Kc=function(){return new usn(this.a)},MWn.Mc=function(n){var t;return!!m2(this,n)&&(t=BB(n,42).cd(),this.a.Bc(t),!0)},MWn.gc=function(){return this.a.gc()},vX(YWn,"AbstractHashMap/EntrySet",261),wAn(262,1,QWn,usn),MWn.Nb=function(n){fU(this,n)},MWn.Pb=function(){return ten(this)},MWn.Ob=function(){return this.b},MWn.Qb=function(){o9(this)},MWn.b=!1,vX(YWn,"AbstractHashMap/EntrySetIterator",262),wAn(417,1,QWn,Sb),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return aS(this)},MWn.Pb=function(){return mQ(this)},MWn.Qb=function(){fW(this)},MWn.b=0,MWn.c=-1,vX(YWn,"AbstractList/IteratorImpl",417),wAn(96,417,cVn,M2),MWn.Qb=function(){fW(this)},MWn.Rb=function(n){yR(this,n)},MWn.Sb=function(){return this.b>0},MWn.Tb=function(){return this.b},MWn.Ub=function(){return Px(this.b>0),this.a.Xb(this.c=--this.b)},MWn.Vb=function(){return this.b-1},MWn.Wb=function(n){Mx(-1!=this.c),this.a._c(this.c,n)},vX(YWn,"AbstractList/ListIteratorImpl",96),wAn(219,52,LVn,s1),MWn.Vc=function(n,t){LZ(n,this.b),this.c.Vc(this.a+n,t),++this.b},MWn.Xb=function(n){return l1(n,this.b),this.c.Xb(this.a+n)},MWn.$c=function(n){var t;return l1(n,this.b),t=this.c.$c(this.a+n),--this.b,t},MWn._c=function(n,t){return l1(n,this.b),this.c._c(this.a+n,t)},MWn.gc=function(){return this.b},MWn.a=0,MWn.b=0,vX(YWn,"AbstractList/SubList",219),wAn(384,nVn,tVn,Cb),MWn.$b=function(){this.a.$b()},MWn.Hc=function(n){return this.a._b(n)},MWn.Kc=function(){return new Ib(this.a.vc().Kc())},MWn.Mc=function(n){return!!this.a._b(n)&&(this.a.Bc(n),!0)},MWn.gc=function(){return this.a.gc()},vX(YWn,"AbstractMap/1",384),wAn(691,1,QWn,Ib),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return this.a.Ob()},MWn.Pb=function(){return BB(this.a.Pb(),42).cd()},MWn.Qb=function(){this.a.Qb()},vX(YWn,"AbstractMap/1/1",691),wAn(226,28,ZWn,Ob),MWn.$b=function(){this.a.$b()},MWn.Hc=function(n){return this.a.uc(n)},MWn.Kc=function(){return new Kb(this.a.vc().Kc())},MWn.gc=function(){return this.a.gc()},vX(YWn,"AbstractMap/2",226),wAn(294,1,QWn,Kb),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return this.a.Ob()},MWn.Pb=function(){return BB(this.a.Pb(),42).dd()},MWn.Qb=function(){this.a.Qb()},vX(YWn,"AbstractMap/2/1",294),wAn(484,1,{484:1,42:1}),MWn.Fb=function(n){var t;return!!cL(n,42)&&(t=BB(n,42),cV(this.d,t.cd())&&cV(this.e,t.dd()))},MWn.cd=function(){return this.d},MWn.dd=function(){return this.e},MWn.Hb=function(){return KA(this.d)^KA(this.e)},MWn.ed=function(n){return pR(this,n)},MWn.Ib=function(){return this.d+"="+this.e},vX(YWn,"AbstractMap/AbstractEntry",484),wAn(383,484,{484:1,383:1,42:1},PS),vX(YWn,"AbstractMap/SimpleEntry",383),wAn(1984,1,VQn),MWn.Fb=function(n){var t;return!!cL(n,42)&&(t=BB(n,42),cV(this.cd(),t.cd())&&cV(this.dd(),t.dd()))},MWn.Hb=function(){return KA(this.cd())^KA(this.dd())},MWn.Ib=function(){return this.cd()+"="+this.dd()},vX(YWn,uVn,1984),wAn(1992,1967,eVn),MWn.tc=function(n){return q5(this,n)},MWn._b=function(n){return DK(this,n)},MWn.vc=function(){return new Bb(this)},MWn.xc=function(n){return qI(lsn(this,n))},MWn.ec=function(){return new _b(this)},vX(YWn,"AbstractNavigableMap",1992),wAn(739,nVn,tVn,Bb),MWn.Hc=function(n){return cL(n,42)&&q5(this.b,BB(n,42))},MWn.Kc=function(){return new BR(this.b)},MWn.Mc=function(n){var t;return!!cL(n,42)&&(t=BB(n,42),z8(this.b,t))},MWn.gc=function(){return this.b.c},vX(YWn,"AbstractNavigableMap/EntrySet",739),wAn(493,nVn,rVn,_b),MWn.Nc=function(){return new wS(this)},MWn.$b=function(){my(this.a)},MWn.Hc=function(n){return DK(this.a,n)},MWn.Kc=function(){return new Fb(new BR(new xN(this.a).b))},MWn.Mc=function(n){return!!DK(this.a,n)&&($J(this.a,n),!0)},MWn.gc=function(){return this.a.c},vX(YWn,"AbstractNavigableMap/NavigableKeySet",493),wAn(494,1,QWn,Fb),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return aS(this.a.a)},MWn.Pb=function(){return mx(this.a).cd()},MWn.Qb=function(){e_(this.a)},vX(YWn,"AbstractNavigableMap/NavigableKeySet/1",494),wAn(2004,28,ZWn),MWn.Fc=function(n){return F8(eMn(this,n)),!0},MWn.Gc=function(n){return kW(n),vH(n!=this,"Can't add a queue to itself"),Frn(this,n)},MWn.$b=function(){for(;null!=mnn(this););},vX(YWn,"AbstractQueue",2004),wAn(302,28,{4:1,20:1,28:1,14:1},Lp,d1),MWn.Fc=function(n){return w3(this,n),!0},MWn.$b=function(){o4(this)},MWn.Hc=function(n){return wun(new bV(this),n)},MWn.dc=function(){return Wy(this)},MWn.Kc=function(){return new bV(this)},MWn.Mc=function(n){return GJ(new bV(this),n)},MWn.gc=function(){return this.c-this.b&this.a.length-1},MWn.Nc=function(){return new w1(this,272)},MWn.Qc=function(n){var t;return t=this.c-this.b&this.a.length-1,n.length<t&&(n=qk(new Array(t),n)),urn(this,n,t),n.length>t&&$X(n,t,null),n},MWn.b=0,MWn.c=0,vX(YWn,"ArrayDeque",302),wAn(446,1,QWn,bV),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return this.a!=this.b},MWn.Pb=function(){return _hn(this)},MWn.Qb=function(){ein(this)},MWn.a=0,MWn.b=0,MWn.c=-1,vX(YWn,"ArrayDeque/IteratorImpl",446),wAn(12,52,QQn,Np,J6,t_),MWn.Vc=function(n,t){kG(this,n,t)},MWn.Fc=function(n){return WB(this,n)},MWn.Wc=function(n,t){return ohn(this,n,t)},MWn.Gc=function(n){return gun(this,n)},MWn.$b=function(){this.c=x8(Ant,HWn,1,0,5,1)},MWn.Hc=function(n){return-1!=E7(this,n,0)},MWn.Jc=function(n){Otn(this,n)},MWn.Xb=function(n){return xq(this,n)},MWn.Xc=function(n){return E7(this,n,0)},MWn.dc=function(){return 0==this.c.length},MWn.Kc=function(){return new Wb(this)},MWn.$c=function(n){return s6(this,n)},MWn.Mc=function(n){return y7(this,n)},MWn.Ud=function(n,t){h1(this,n,t)},MWn._c=function(n,t){return c5(this,n,t)},MWn.gc=function(){return this.c.length},MWn.ad=function(n){m$(this,n)},MWn.Pc=function(){return bx(this)},MWn.Qc=function(n){return Qgn(this,n)};var set,het,fet,bet,wet,det,get,pet,vet,met=vX(YWn,"ArrayList",12);wAn(7,1,QWn,Wb),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return y$(this)},MWn.Pb=function(){return n0(this)},MWn.Qb=function(){AU(this)},MWn.a=0,MWn.b=-1,vX(YWn,"ArrayList/1",7),wAn(2013,e.Function,{},T),MWn.te=function(n,t){return Pln(n,t)},wAn(154,52,YQn,Jy),MWn.Hc=function(n){return-1!=bin(this,n)},MWn.Jc=function(n){var t,e,i,r;for(kW(n),i=0,r=(e=this.a).length;i<r;++i)t=e[i],n.td(t)},MWn.Xb=function(n){return Dq(this,n)},MWn._c=function(n,t){var e;return l1(n,this.a.length),e=this.a[n],$X(this.a,n,t),e},MWn.gc=function(){return this.a.length},MWn.ad=function(n){yG(this.a,this.a.length,n)},MWn.Pc=function(){return Ygn(this,x8(Ant,HWn,1,this.a.length,5,1))},MWn.Qc=function(n){return Ygn(this,n)},vX(YWn,"Arrays/ArrayList",154),wAn(940,52,YQn,S),MWn.Hc=function(n){return!1},MWn.Xb=function(n){return yO(n)},MWn.Kc=function(){return SQ(),LT(),bet},MWn.Yc=function(){return SQ(),LT(),bet},MWn.gc=function(){return 0},vX(YWn,"Collections/EmptyList",940),wAn(941,1,cVn,P),MWn.Nb=function(n){fU(this,n)},MWn.Rb=function(n){throw Hp(new pv)},MWn.Ob=function(){return!1},MWn.Sb=function(){return!1},MWn.Pb=function(){throw Hp(new yv)},MWn.Tb=function(){return 0},MWn.Ub=function(){throw Hp(new yv)},MWn.Vb=function(){return-1},MWn.Qb=function(){throw Hp(new dv)},MWn.Wb=function(n){throw Hp(new dv)},vX(YWn,"Collections/EmptyListIterator",941),wAn(943,1967,jVn,C),MWn._b=function(n){return!1},MWn.uc=function(n){return!1},MWn.vc=function(){return SQ(),fet},MWn.xc=function(n){return null},MWn.ec=function(){return SQ(),fet},MWn.gc=function(){return 0},MWn.Cc=function(){return SQ(),set},vX(YWn,"Collections/EmptyMap",943),wAn(942,nVn,TVn,M),MWn.Hc=function(n){return!1},MWn.Kc=function(){return SQ(),LT(),bet},MWn.gc=function(){return 0},vX(YWn,"Collections/EmptySet",942),wAn(599,52,{3:1,20:1,28:1,52:1,14:1,15:1},Gb),MWn.Hc=function(n){return cV(this.a,n)},MWn.Xb=function(n){return l1(n,1),this.a},MWn.gc=function(){return 1},vX(YWn,"Collections/SingletonList",599),wAn(372,1,vVn,Hb),MWn.Jc=function(n){e5(this,n)},MWn.Lc=function(){return new Rq(null,this.Nc())},MWn.Nc=function(){return new w1(this,0)},MWn.Oc=function(){return new Rq(null,this.Nc())},MWn.Fc=function(n){return oE()},MWn.Gc=function(n){return sE()},MWn.$b=function(){hE()},MWn.Hc=function(n){return xT(this,n)},MWn.Ic=function(n){return DT(this,n)},MWn.dc=function(){return this.b.dc()},MWn.Kc=function(){return new qb(this.b.Kc())},MWn.Mc=function(n){return fE()},MWn.gc=function(){return this.b.gc()},MWn.Pc=function(){return this.b.Pc()},MWn.Qc=function(n){return RT(this,n)},MWn.Ib=function(){return Bbn(this.b)},vX(YWn,"Collections/UnmodifiableCollection",372),wAn(371,1,QWn,qb),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return this.b.Ob()},MWn.Pb=function(){return this.b.Pb()},MWn.Qb=function(){lE()},vX(YWn,"Collections/UnmodifiableCollectionIterator",371),wAn(531,372,JQn,bN),MWn.Nc=function(){return new w1(this,16)},MWn.Vc=function(n,t){throw Hp(new pv)},MWn.Wc=function(n,t){throw Hp(new pv)},MWn.Fb=function(n){return Nfn(this.a,n)},MWn.Xb=function(n){return this.a.Xb(n)},MWn.Hb=function(){return nsn(this.a)},MWn.Xc=function(n){return this.a.Xc(n)},MWn.dc=function(){return this.a.dc()},MWn.Yc=function(){return new wN(this.a.Zc(0))},MWn.Zc=function(n){return new wN(this.a.Zc(n))},MWn.$c=function(n){throw Hp(new pv)},MWn._c=function(n,t){throw Hp(new pv)},MWn.ad=function(n){throw Hp(new pv)},MWn.bd=function(n,t){return new bN(this.a.bd(n,t))},vX(YWn,"Collections/UnmodifiableList",531),wAn(690,371,cVn,wN),MWn.Qb=function(){lE()},MWn.Rb=function(n){throw Hp(new pv)},MWn.Sb=function(){return this.a.Sb()},MWn.Tb=function(){return this.a.Tb()},MWn.Ub=function(){return this.a.Ub()},MWn.Vb=function(){return this.a.Vb()},MWn.Wb=function(n){throw Hp(new pv)},vX(YWn,"Collections/UnmodifiableListIterator",690),wAn(600,1,JWn,Xb),MWn.wc=function(n){nan(this,n)},MWn.yc=function(n,t,e){return Zln(this,n,t,e)},MWn.$b=function(){throw Hp(new pv)},MWn._b=function(n){return this.c._b(n)},MWn.uc=function(n){return _T(this,n)},MWn.vc=function(){return eV(this)},MWn.Fb=function(n){return BT(this,n)},MWn.xc=function(n){return this.c.xc(n)},MWn.Hb=function(){return nsn(this.c)},MWn.dc=function(){return this.c.dc()},MWn.ec=function(){return iV(this)},MWn.zc=function(n,t){throw Hp(new pv)},MWn.Bc=function(n){throw Hp(new pv)},MWn.gc=function(){return this.c.gc()},MWn.Ib=function(){return Bbn(this.c)},MWn.Cc=function(){return tV(this)},vX(YWn,"Collections/UnmodifiableMap",600),wAn(382,372,EVn,Ak),MWn.Nc=function(){return new w1(this,1)},MWn.Fb=function(n){return Nfn(this.b,n)},MWn.Hb=function(){return nsn(this.b)},vX(YWn,"Collections/UnmodifiableSet",382),wAn(944,382,EVn,Lk),MWn.Hc=function(n){return KT(this,n)},MWn.Ic=function(n){return this.b.Ic(n)},MWn.Kc=function(){return new zb(this.b.Kc())},MWn.Pc=function(){var n;return j4(n=this.b.Pc(),n.length),n},MWn.Qc=function(n){return IY(this,n)},vX(YWn,"Collections/UnmodifiableMap/UnmodifiableEntrySet",944),wAn(945,1,QWn,zb),MWn.Nb=function(n){fU(this,n)},MWn.Pb=function(){return new Ub(BB(this.a.Pb(),42))},MWn.Ob=function(){return this.a.Ob()},MWn.Qb=function(){throw Hp(new pv)},vX(YWn,"Collections/UnmodifiableMap/UnmodifiableEntrySet/1",945),wAn(688,1,VQn,Ub),MWn.Fb=function(n){return this.a.Fb(n)},MWn.cd=function(){return this.a.cd()},MWn.dd=function(){return this.a.dd()},MWn.Hb=function(){return this.a.Hb()},MWn.ed=function(n){throw Hp(new pv)},MWn.Ib=function(){return Bbn(this.a)},vX(YWn,"Collections/UnmodifiableMap/UnmodifiableEntrySet/UnmodifiableEntry",688),wAn(601,531,{20:1,14:1,15:1,54:1},$k),vX(YWn,"Collections/UnmodifiableRandomAccessList",601),wAn(689,382,MVn,dN),MWn.Nc=function(){return new wS(this)},MWn.Fb=function(n){return Nfn(this.a,n)},MWn.Hb=function(){return nsn(this.a)},vX(YWn,"Collections/UnmodifiableSortedSet",689),wAn(847,1,ZQn,D),MWn.ue=function(n,t){var e;return 0!=(e=T4(BB(n,11),BB(t,11)))?e:nFn(BB(n,11),BB(t,11))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(YWn,"Comparator/lambda$0$Type",847),wAn(751,1,ZQn,R),MWn.ue=function(n,t){return _q(BB(n,35),BB(t,35))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return PQ(),get},vX(YWn,"Comparators/NaturalOrderComparator",751),wAn(1177,1,ZQn,K),MWn.ue=function(n,t){return Fq(BB(n,35),BB(t,35))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return PQ(),det},vX(YWn,"Comparators/ReverseNaturalOrderComparator",1177),wAn(64,1,ZQn,nw),MWn.Fb=function(n){return this===n},MWn.ue=function(n,t){return this.a.ue(t,n)},MWn.ve=function(){return this.a},vX(YWn,"Comparators/ReversedComparator",64),wAn(166,60,BVn,vv),vX(YWn,"ConcurrentModificationException",166),wAn(1904,1,nYn,_),MWn.we=function(n){hdn(this,n)},MWn.Ib=function(){return"DoubleSummaryStatistics[count = "+vz(this.a)+", avg = "+(oS(this.a,0)?l6(this)/j2(this.a):0)+", min = "+this.c+", max = "+this.b+", sum = "+l6(this)+"]"},MWn.a=0,MWn.b=KQn,MWn.c=RQn,MWn.d=0,MWn.e=0,MWn.f=0,vX(YWn,"DoubleSummaryStatistics",1904),wAn(1805,60,BVn,mv),vX(YWn,"EmptyStackException",1805),wAn(451,1967,JWn,Hbn),MWn.zc=function(n,t){return wR(this,n,t)},MWn.$b=function(){TW(this)},MWn._b=function(n){return uS(this,n)},MWn.uc=function(n){var t,e;for(e=new QT(this.a);e.a<e.c.a.length;)if(t=u4(e),cV(n,this.b[t.g]))return!0;return!1},MWn.vc=function(){return new tw(this)},MWn.xc=function(n){return oV(this,n)},MWn.Bc=function(n){return NZ(this,n)},MWn.gc=function(){return this.a.c},vX(YWn,"EnumMap",451),wAn(1352,nVn,tVn,tw),MWn.$b=function(){TW(this.a)},MWn.Hc=function(n){return v2(this,n)},MWn.Kc=function(){return new Aq(this.a)},MWn.Mc=function(n){var t;return!!v2(this,n)&&(t=BB(n,42).cd(),NZ(this.a,t),!0)},MWn.gc=function(){return this.a.a.c},vX(YWn,"EnumMap/EntrySet",1352),wAn(1353,1,QWn,Aq),MWn.Nb=function(n){fU(this,n)},MWn.Pb=function(){return this.b=u4(this.a),new CS(this.c,this.b)},MWn.Ob=function(){return k$(this.a)},MWn.Qb=function(){Mx(!!this.b),NZ(this.c,this.b),this.b=null},vX(YWn,"EnumMap/EntrySetIterator",1353),wAn(1354,1984,VQn,CS),MWn.cd=function(){return this.a},MWn.dd=function(){return this.b.b[this.a.g]},MWn.ed=function(n){return EU(this.b,this.a.g,n)},vX(YWn,"EnumMap/MapEntry",1354),wAn(174,nVn,{20:1,28:1,14:1,174:1,21:1});var yet=vX(YWn,"EnumSet",174);wAn(156,174,{20:1,28:1,14:1,174:1,156:1,21:1},YK),MWn.Fc=function(n){return orn(this,BB(n,22))},MWn.Hc=function(n){return CG(this,n)},MWn.Kc=function(){return new QT(this)},MWn.Mc=function(n){return IG(this,n)},MWn.gc=function(){return this.c},MWn.c=0,vX(YWn,"EnumSet/EnumSetImpl",156),wAn(343,1,QWn,QT),MWn.Nb=function(n){fU(this,n)},MWn.Pb=function(){return u4(this)},MWn.Ob=function(){return k$(this)},MWn.Qb=function(){Mx(-1!=this.b),$X(this.c.b,this.b,null),--this.c.c,this.b=-1},MWn.a=-1,MWn.b=-1,vX(YWn,"EnumSet/EnumSetImpl/IteratorImpl",343),wAn(43,488,tYn,xp,XT,mO),MWn.re=function(n,t){return GI(n)===GI(t)||null!=n&&Nfn(n,t)},MWn.se=function(n){return 0|nsn(n)},vX(YWn,"HashMap",43),wAn(53,nVn,eYn,Rv,bE,$q),MWn.Fc=function(n){return TU(this,n)},MWn.$b=function(){this.a.$b()},MWn.Hc=function(n){return FT(this,n)},MWn.dc=function(){return 0==this.a.gc()},MWn.Kc=function(){return this.a.ec().Kc()},MWn.Mc=function(n){return eL(this,n)},MWn.gc=function(){return this.a.gc()};var ket,jet=vX(YWn,"HashSet",53);wAn(1781,1,wVn,F),MWn.ud=function(n){ran(this,n)},MWn.Ib=function(){return"IntSummaryStatistics[count = "+vz(this.a)+", avg = "+(oS(this.a,0)?j2(this.d)/j2(this.a):0)+", min = "+this.c+", max = "+this.b+", sum = "+vz(this.d)+"]"},MWn.a=0,MWn.b=_Vn,MWn.c=DWn,MWn.d=0,vX(YWn,"IntSummaryStatistics",1781),wAn(1049,1,pVn,eA),MWn.Jc=function(n){e5(this,n)},MWn.Kc=function(){return new S2(this)},MWn.c=0,vX(YWn,"InternalHashCodeMap",1049),wAn(711,1,QWn,S2),MWn.Nb=function(n){fU(this,n)},MWn.Pb=function(){return this.d=this.a[this.c++],this.d},MWn.Ob=function(){var n;return this.c<this.a.length||!(n=this.b.next()).done&&(this.a=n.value[1],this.c=0,!0)},MWn.Qb=function(){gAn(this.e,this.d.cd()),0!=this.c&&--this.c},MWn.c=0,MWn.d=null,vX(YWn,"InternalHashCodeMap/1",711),wAn(1047,1,pVn,iA),MWn.Jc=function(n){e5(this,n)},MWn.Kc=function(){return new p4(this)},MWn.c=0,MWn.d=0,vX(YWn,"InternalStringMap",1047),wAn(710,1,QWn,p4),MWn.Nb=function(n){fU(this,n)},MWn.Pb=function(){return this.c=this.a,this.a=this.b.next(),new JK(this.d,this.c,this.d.d)},MWn.Ob=function(){return!this.a.done},MWn.Qb=function(){Gan(this.d,this.c.value[0])},vX(YWn,"InternalStringMap/1",710),wAn(1048,1984,VQn,JK),MWn.cd=function(){return this.b.value[0]},MWn.dd=function(){return this.a.d!=this.c?hS(this.a,this.b.value[0]):this.b.value[1]},MWn.ed=function(n){return ubn(this.a,this.b.value[0],n)},MWn.c=0,vX(YWn,"InternalStringMap/2",1048),wAn(228,43,tYn,v4,q8),MWn.$b=function(){kR(this)},MWn._b=function(n){return lS(this,n)},MWn.uc=function(n){var t;for(t=this.d.a;t!=this.d;){if(cV(t.e,n))return!0;t=t.a}return!1},MWn.vc=function(){return new iw(this)},MWn.xc=function(n){return lnn(this,n)},MWn.zc=function(n,t){return Jgn(this,n,t)},MWn.Bc=function(n){return k7(this,n)},MWn.gc=function(){return NT(this.e)},MWn.c=!1,vX(YWn,"LinkedHashMap",228),wAn(387,383,{484:1,383:1,387:1,42:1},Cx,nH),vX(YWn,"LinkedHashMap/ChainEntry",387),wAn(701,nVn,tVn,iw),MWn.$b=function(){kR(this.a)},MWn.Hc=function(n){return y2(this,n)},MWn.Kc=function(){return new hW(this)},MWn.Mc=function(n){var t;return!!y2(this,n)&&(t=BB(n,42).cd(),k7(this.a,t),!0)},MWn.gc=function(){return NT(this.a.e)},vX(YWn,"LinkedHashMap/EntrySet",701),wAn(702,1,QWn,hW),MWn.Nb=function(n){fU(this,n)},MWn.Pb=function(){return s9(this)},MWn.Ob=function(){return this.b!=this.c.a.d},MWn.Qb=function(){Mx(!!this.a),p2(this.c.a.e,this),RH(this.a),v6(this.c.a.e,this.a.d),bD(this.c.a.e,this),this.a=null},vX(YWn,"LinkedHashMap/EntrySet/EntryIterator",702),wAn(178,53,eYn,fA,LN,Lq);var Eet=vX(YWn,"LinkedHashSet",178);wAn(68,1964,{3:1,4:1,20:1,28:1,52:1,14:1,68:1,15:1},YT,n_),MWn.Fc=function(n){return DH(this,n)},MWn.$b=function(){yQ(this)},MWn.Zc=function(n){return spn(this,n)},MWn.gc=function(){return this.b},MWn.b=0;var Tet,Met,Set,Pet,Cet,Iet=vX(YWn,"LinkedList",68);wAn(970,1,cVn,ZK),MWn.Nb=function(n){fU(this,n)},MWn.Rb=function(n){nX(this,n)},MWn.Ob=function(){return EE(this)},MWn.Sb=function(){return this.b.b!=this.d.a},MWn.Pb=function(){return b3(this)},MWn.Tb=function(){return this.a},MWn.Ub=function(){return U0(this)},MWn.Vb=function(){return this.a-1},MWn.Qb=function(){mtn(this)},MWn.Wb=function(n){Mx(!!this.c),this.c.c=n},MWn.a=0,MWn.c=null,vX(YWn,"LinkedList/ListIteratorImpl",970),wAn(608,1,{},$),vX(YWn,"LinkedList/Node",608),wAn(1959,1,{}),vX(YWn,"Locale",1959),wAn(861,1959,{},L),MWn.Ib=function(){return""},vX(YWn,"Locale/1",861),wAn(862,1959,{},N),MWn.Ib=function(){return"unknown"},vX(YWn,"Locale/4",862),wAn(109,60,{3:1,102:1,60:1,78:1,109:1},yv,lV),vX(YWn,"NoSuchElementException",109),wAn(404,1,{404:1},vy),MWn.Fb=function(n){var t;return n===this||!!cL(n,404)&&(t=BB(n,404),cV(this.a,t.a))},MWn.Hb=function(){return KA(this.a)},MWn.Ib=function(){return null!=this.a?GWn+kN(this.a)+")":"Optional.empty()"},vX(YWn,"Optional",404),wAn(463,1,{463:1},CO,yx),MWn.Fb=function(n){var t;return n===this||!!cL(n,463)&&(t=BB(n,463),this.a==t.a&&0==Pln(this.b,t.b))},MWn.Hb=function(){return this.a?CJ(this.b):0},MWn.Ib=function(){return this.a?"OptionalDouble.of("+this.b+")":"OptionalDouble.empty()"},MWn.a=!1,MWn.b=0,vX(YWn,"OptionalDouble",463),wAn(517,1,{517:1},IO,kx),MWn.Fb=function(n){var t;return n===this||!!cL(n,517)&&(t=BB(n,517),this.a==t.a&&0==E$(this.b,t.b))},MWn.Hb=function(){return this.a?this.b:0},MWn.Ib=function(){return this.a?"OptionalInt.of("+this.b+")":"OptionalInt.empty()"},MWn.a=!1,MWn.b=0,vX(YWn,"OptionalInt",517),wAn(503,2004,ZWn,Xz),MWn.Gc=function(n){return ikn(this,n)},MWn.$b=function(){this.b.c=x8(Ant,HWn,1,0,5,1)},MWn.Hc=function(n){return-1!=(null==n?-1:E7(this.b,n,0))},MWn.Kc=function(){return new Vb(this)},MWn.Mc=function(n){return srn(this,n)},MWn.gc=function(){return this.b.c.length},MWn.Nc=function(){return new w1(this,256)},MWn.Pc=function(){return bx(this.b)},MWn.Qc=function(n){return Qgn(this.b,n)},vX(YWn,"PriorityQueue",503),wAn(1277,1,QWn,Vb),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return this.a<this.c.b.c.length},MWn.Pb=function(){return Px(this.a<this.c.b.c.length),this.b=this.a++,xq(this.c.b,this.b)},MWn.Qb=function(){Mx(-1!=this.b),hrn(this.c,this.a=this.b),this.b=-1},MWn.a=0,MWn.b=-1,vX(YWn,"PriorityQueue/1",1277),wAn(230,1,{230:1},sbn,C4),MWn.a=0,MWn.b=0;var Oet,Aet,$et,Let=0;vX(YWn,"Random",230),wAn(27,1,fVn,w1,zU,CV),MWn.qd=function(){return this.a},MWn.rd=function(){return Dz(this),this.c},MWn.Nb=function(n){Dz(this),this.d.Nb(n)},MWn.sd=function(n){return ntn(this,n)},MWn.a=0,MWn.c=0,vX(YWn,"Spliterators/IteratorSpliterator",27),wAn(485,27,fVn,wS),vX(YWn,"SortedSet/1",485),wAn(602,1,nYn,Qb),MWn.we=function(n){this.a.td(n)},vX(YWn,"Spliterator/OfDouble/0methodref$accept$Type",602),wAn(603,1,nYn,Yb),MWn.we=function(n){this.a.td(n)},vX(YWn,"Spliterator/OfDouble/1methodref$accept$Type",603),wAn(604,1,wVn,Jb),MWn.ud=function(n){this.a.td(iln(n))},vX(YWn,"Spliterator/OfInt/2methodref$accept$Type",604),wAn(605,1,wVn,Zb),MWn.ud=function(n){this.a.td(iln(n))},vX(YWn,"Spliterator/OfInt/3methodref$accept$Type",605),wAn(617,1,fVn),MWn.Nb=function(n){pE(this,n)},MWn.qd=function(){return this.d},MWn.rd=function(){return this.e},MWn.d=0,MWn.e=0,vX(YWn,"Spliterators/BaseSpliterator",617),wAn(721,617,fVn),MWn.xe=function(n){gE(this,n)},MWn.Nb=function(n){cL(n,182)?gE(this,BB(n,182)):gE(this,new Yb(n))},MWn.sd=function(n){return cL(n,182)?this.ye(BB(n,182)):this.ye(new Qb(n))},vX(YWn,"Spliterators/AbstractDoubleSpliterator",721),wAn(720,617,fVn),MWn.xe=function(n){gE(this,n)},MWn.Nb=function(n){cL(n,196)?gE(this,BB(n,196)):gE(this,new Zb(n))},MWn.sd=function(n){return cL(n,196)?this.ye(BB(n,196)):this.ye(new Jb(n))},vX(YWn,"Spliterators/AbstractIntSpliterator",720),wAn(540,617,fVn),vX(YWn,"Spliterators/AbstractSpliterator",540),wAn(692,1,fVn),MWn.Nb=function(n){pE(this,n)},MWn.qd=function(){return this.b},MWn.rd=function(){return this.d-this.c},MWn.b=0,MWn.c=0,MWn.d=0,vX(YWn,"Spliterators/BaseArraySpliterator",692),wAn(947,692,fVn,BH),MWn.ze=function(n,t){cj(this,BB(n,38),t)},MWn.Nb=function(n){DX(this,n)},MWn.sd=function(n){return K6(this,n)},vX(YWn,"Spliterators/ArraySpliterator",947),wAn(693,692,fVn,_K),MWn.ze=function(n,t){aj(this,BB(n,182),t)},MWn.xe=function(n){DX(this,n)},MWn.Nb=function(n){cL(n,182)?DX(this,BB(n,182)):DX(this,new Yb(n))},MWn.ye=function(n){return K6(this,n)},MWn.sd=function(n){return cL(n,182)?K6(this,BB(n,182)):K6(this,new Qb(n))},vX(YWn,"Spliterators/DoubleArraySpliterator",693),wAn(1968,1,fVn),MWn.Nb=function(n){pE(this,n)},MWn.qd=function(){return 16448},MWn.rd=function(){return 0},vX(YWn,"Spliterators/EmptySpliterator",1968),wAn(946,1968,fVn,z),MWn.xe=function(n){Bf(n)},MWn.Nb=function(n){cL(n,196)?Bf(BB(n,196)):Bf(new Zb(n))},MWn.ye=function(n){return bS(n)},MWn.sd=function(n){return cL(n,196)?bS(BB(n,196)):bS(new Jb(n))},vX(YWn,"Spliterators/EmptySpliterator/OfInt",946),wAn(580,52,fYn,_v),MWn.Vc=function(n,t){Kz(n,this.a.c.length+1),kG(this.a,n,t)},MWn.Fc=function(n){return WB(this.a,n)},MWn.Wc=function(n,t){return Kz(n,this.a.c.length+1),ohn(this.a,n,t)},MWn.Gc=function(n){return gun(this.a,n)},MWn.$b=function(){this.a.c=x8(Ant,HWn,1,0,5,1)},MWn.Hc=function(n){return-1!=E7(this.a,n,0)},MWn.Ic=function(n){return oun(this.a,n)},MWn.Jc=function(n){Otn(this.a,n)},MWn.Xb=function(n){return Kz(n,this.a.c.length),xq(this.a,n)},MWn.Xc=function(n){return E7(this.a,n,0)},MWn.dc=function(){return 0==this.a.c.length},MWn.Kc=function(){return new Wb(this.a)},MWn.$c=function(n){return Kz(n,this.a.c.length),s6(this.a,n)},MWn.Ud=function(n,t){h1(this.a,n,t)},MWn._c=function(n,t){return Kz(n,this.a.c.length),c5(this.a,n,t)},MWn.gc=function(){return this.a.c.length},MWn.ad=function(n){m$(this.a,n)},MWn.bd=function(n,t){return new s1(this.a,n,t)},MWn.Pc=function(){return bx(this.a)},MWn.Qc=function(n){return Qgn(this.a,n)},MWn.Ib=function(){return LMn(this.a)},vX(YWn,"Vector",580),wAn(809,580,fYn,om),vX(YWn,"Stack",809),wAn(206,1,{206:1},$an),MWn.Ib=function(){return W0(this)},vX(YWn,"StringJoiner",206),wAn(544,1992,{3:1,83:1,171:1,161:1},WT,Wz),MWn.$b=function(){my(this)},MWn.vc=function(){return new xN(this)},MWn.zc=function(n,t){return Mon(this,n,t)},MWn.Bc=function(n){return $J(this,n)},MWn.gc=function(){return this.c},MWn.c=0,vX(YWn,"TreeMap",544),wAn(390,1,QWn,BR),MWn.Nb=function(n){fU(this,n)},MWn.Pb=function(){return mx(this)},MWn.Ob=function(){return aS(this.a)},MWn.Qb=function(){e_(this)},vX(YWn,"TreeMap/EntryIterator",390),wAn(435,739,tVn,xN),MWn.$b=function(){my(this.a)},vX(YWn,"TreeMap/EntrySet",435),wAn(436,383,{484:1,383:1,42:1,436:1},H8),MWn.b=!1;var Net,xet,Det,Ret,Ket=vX(YWn,"TreeMap/Node",436);wAn(621,1,{},q),MWn.Ib=function(){return"State: mv="+this.c+" value="+this.d+" done="+this.a+" found="+this.b},MWn.a=!1,MWn.b=!1,MWn.c=!1,vX(YWn,"TreeMap/State",621),wAn(297,22,lYn,gS),MWn.Ae=function(){return!1},MWn.Be=function(){return!1};var _et,Fet=Ben(YWn,"TreeMap/SubMapType",297,Unt,J2,h_);wAn(1112,297,lYn,LA),MWn.Be=function(){return!0},Ben(YWn,"TreeMap/SubMapType/1",1112,Fet,null,null),wAn(1113,297,lYn,A$),MWn.Ae=function(){return!0},MWn.Be=function(){return!0},Ben(YWn,"TreeMap/SubMapType/2",1113,Fet,null,null),wAn(1114,297,lYn,NA),MWn.Ae=function(){return!0},Ben(YWn,"TreeMap/SubMapType/3",1114,Fet,null,null),wAn(208,nVn,{3:1,20:1,28:1,14:1,271:1,21:1,84:1,208:1},zv,dE),MWn.Nc=function(){return new wS(this)},MWn.Fc=function(n){return ZU(this,n)},MWn.$b=function(){my(this.a)},MWn.Hc=function(n){return DK(this.a,n)},MWn.Kc=function(){return new Fb(new BR(new xN(new _b(this.a).a).b))},MWn.Mc=function(n){return MN(this,n)},MWn.gc=function(){return this.a.c};var Bet=vX(YWn,"TreeSet",208);wAn(966,1,{},rw),MWn.Ce=function(n,t){return DD(this.a,n,t)},vX(bYn,"BinaryOperator/lambda$0$Type",966),wAn(967,1,{},cw),MWn.Ce=function(n,t){return RD(this.a,n,t)},vX(bYn,"BinaryOperator/lambda$1$Type",967),wAn(846,1,{},G),MWn.Kb=function(n){return n},vX(bYn,"Function/lambda$0$Type",846),wAn(431,1,DVn,aw),MWn.Mb=function(n){return!this.a.Mb(n)},vX(bYn,"Predicate/lambda$2$Type",431),wAn(572,1,{572:1});var Het,qet,Get=vX(wYn,"Handler",572);wAn(2007,1,KWn),MWn.ne=function(){return"DUMMY"},MWn.Ib=function(){return this.ne()},vX(wYn,"Level",2007),wAn(1621,2007,KWn,U),MWn.ne=function(){return"INFO"},vX(wYn,"Level/LevelInfo",1621),wAn(1640,1,{},Kv),vX(wYn,"LogManager",1640),wAn(1780,1,KWn,i_),MWn.b=null,vX(wYn,"LogRecord",1780),wAn(512,1,{512:1},y5),MWn.e=!1;var zet,Uet,Xet,Wet=!1,Vet=!1,Qet=!1,Yet=!1,Jet=!1;vX(wYn,"Logger",512),wAn(819,572,{572:1},X),vX(wYn,"SimpleConsoleLogHandler",819),wAn(132,22,{3:1,35:1,22:1,132:1},pS);var Zet,nit=Ben(pYn,"Collector/Characteristics",132,Unt,p1,f_);wAn(744,1,{},jU),vX(pYn,"CollectorImpl",744),wAn(1060,1,{},W),MWn.Ce=function(n,t){return Ofn(BB(n,206),BB(t,206))},vX(pYn,"Collectors/10methodref$merge$Type",1060),wAn(1061,1,{},V),MWn.Kb=function(n){return W0(BB(n,206))},vX(pYn,"Collectors/11methodref$toString$Type",1061),wAn(1062,1,{},uw),MWn.Kb=function(n){return hN(),!!TO(n)},vX(pYn,"Collectors/12methodref$test$Type",1062),wAn(251,1,{},B),MWn.Od=function(n,t){BB(n,14).Fc(t)},vX(pYn,"Collectors/20methodref$add$Type",251),wAn(253,1,{},H),MWn.Ee=function(){return new Np},vX(pYn,"Collectors/21methodref$ctor$Type",253),wAn(346,1,{},Q),MWn.Ee=function(){return new Rv},vX(pYn,"Collectors/23methodref$ctor$Type",346),wAn(347,1,{},Y),MWn.Od=function(n,t){TU(BB(n,53),t)},vX(pYn,"Collectors/24methodref$add$Type",347),wAn(1055,1,{},J),MWn.Ce=function(n,t){return ZT(BB(n,15),BB(t,14))},vX(pYn,"Collectors/4methodref$addAll$Type",1055),wAn(1059,1,{},Z),MWn.Od=function(n,t){b6(BB(n,206),BB(t,475))},vX(pYn,"Collectors/9methodref$add$Type",1059),wAn(1058,1,{},YB),MWn.Ee=function(){return new $an(this.a,this.b,this.c)},vX(pYn,"Collectors/lambda$15$Type",1058),wAn(1063,1,{},nn),MWn.Ee=function(){var n;return Jgn(n=new v4,(hN(),!1),new Np),Jgn(n,!0,new Np),n},vX(pYn,"Collectors/lambda$22$Type",1063),wAn(1064,1,{},ow),MWn.Ee=function(){return Pun(Gk(Ant,1),HWn,1,5,[this.a])},vX(pYn,"Collectors/lambda$25$Type",1064),wAn(1065,1,{},sw),MWn.Od=function(n,t){Bq(this.a,een(n))},vX(pYn,"Collectors/lambda$26$Type",1065),wAn(1066,1,{},hw),MWn.Ce=function(n,t){return _z(this.a,een(n),een(t))},vX(pYn,"Collectors/lambda$27$Type",1066),wAn(1067,1,{},tn),MWn.Kb=function(n){return een(n)[0]},vX(pYn,"Collectors/lambda$28$Type",1067),wAn(713,1,{},en),MWn.Ce=function(n,t){return Hq(n,t)},vX(pYn,"Collectors/lambda$4$Type",713),wAn(252,1,{},rn),MWn.Ce=function(n,t){return GT(BB(n,14),BB(t,14))},vX(pYn,"Collectors/lambda$42$Type",252),wAn(348,1,{},cn),MWn.Ce=function(n,t){return zT(BB(n,53),BB(t,53))},vX(pYn,"Collectors/lambda$50$Type",348),wAn(349,1,{},an),MWn.Kb=function(n){return BB(n,53)},vX(pYn,"Collectors/lambda$51$Type",349),wAn(1054,1,{},fw),MWn.Od=function(n,t){bsn(this.a,BB(n,83),t)},vX(pYn,"Collectors/lambda$7$Type",1054),wAn(1056,1,{},un),MWn.Ce=function(n,t){return pun(BB(n,83),BB(t,83),new J)},vX(pYn,"Collectors/lambda$8$Type",1056),wAn(1057,1,{},lw),MWn.Kb=function(n){return mbn(this.a,BB(n,83))},vX(pYn,"Collectors/lambda$9$Type",1057),wAn(539,1,{}),MWn.He=function(){jW(this)},MWn.d=!1,vX(pYn,"TerminatableStream",539),wAn(812,539,vYn,AD),MWn.He=function(){jW(this)},vX(pYn,"DoubleStreamImpl",812),wAn(1784,721,fVn,ZB),MWn.ye=function(n){return pmn(this,BB(n,182))},MWn.a=null,vX(pYn,"DoubleStreamImpl/2",1784),wAn(1785,1,nYn,bw),MWn.we=function(n){HA(this.a,n)},vX(pYn,"DoubleStreamImpl/2/lambda$0$Type",1785),wAn(1782,1,nYn,ww),MWn.we=function(n){BA(this.a,n)},vX(pYn,"DoubleStreamImpl/lambda$0$Type",1782),wAn(1783,1,nYn,dw),MWn.we=function(n){hdn(this.a,n)},vX(pYn,"DoubleStreamImpl/lambda$2$Type",1783),wAn(1358,720,fVn,m5),MWn.ye=function(n){return k2(this,BB(n,196))},MWn.a=0,MWn.b=0,MWn.c=0,vX(pYn,"IntStream/5",1358),wAn(787,539,vYn,$D),MWn.He=function(){jW(this)},MWn.Ie=function(){return EW(this),this.a},vX(pYn,"IntStreamImpl",787),wAn(788,539,vYn,VT),MWn.He=function(){jW(this)},MWn.Ie=function(){return EW(this),IL(),$et},vX(pYn,"IntStreamImpl/Empty",788),wAn(1463,1,wVn,gw),MWn.ud=function(n){ran(this.a,n)},vX(pYn,"IntStreamImpl/lambda$4$Type",1463);var tit,eit=bq(pYn,"Stream");wAn(30,539,{525:1,670:1,833:1},Rq),MWn.He=function(){jW(this)},vX(pYn,"StreamImpl",30),wAn(845,1,{},on),MWn.ld=function(n){return lH(n)},vX(pYn,"StreamImpl/0methodref$lambda$2$Type",845),wAn(1084,540,fVn,KK),MWn.sd=function(n){for(;$9(this);){if(this.a.sd(n))return!0;jW(this.b),this.b=null,this.a=null}return!1},vX(pYn,"StreamImpl/1",1084),wAn(1085,1,lVn,pw),MWn.td=function(n){iH(this.a,BB(n,833))},vX(pYn,"StreamImpl/1/lambda$0$Type",1085),wAn(1086,1,DVn,vw),MWn.Mb=function(n){return TU(this.a,n)},vX(pYn,"StreamImpl/1methodref$add$Type",1086),wAn(1087,540,fVn,vQ),MWn.sd=function(n){var t;return this.a||(t=new Np,this.b.a.Nb(new mw(t)),SQ(),m$(t,this.c),this.a=new w1(t,16)),ntn(this.a,n)},MWn.a=null,vX(pYn,"StreamImpl/5",1087),wAn(1088,1,lVn,mw),MWn.td=function(n){WB(this.a,n)},vX(pYn,"StreamImpl/5/2methodref$add$Type",1088),wAn(722,540,fVn,Q9),MWn.sd=function(n){for(this.b=!1;!this.b&&this.c.sd(new AS(this,n)););return this.b},MWn.b=!1,vX(pYn,"StreamImpl/FilterSpliterator",722),wAn(1079,1,lVn,AS),MWn.td=function(n){Rz(this.a,this.b,n)},vX(pYn,"StreamImpl/FilterSpliterator/lambda$0$Type",1079),wAn(1075,721,fVn,E6),MWn.ye=function(n){return jK(this,BB(n,182))},vX(pYn,"StreamImpl/MapToDoubleSpliterator",1075),wAn(1078,1,lVn,$S),MWn.td=function(n){jS(this.a,this.b,n)},vX(pYn,"StreamImpl/MapToDoubleSpliterator/lambda$0$Type",1078),wAn(1074,720,fVn,T6),MWn.ye=function(n){return EK(this,BB(n,196))},vX(pYn,"StreamImpl/MapToIntSpliterator",1074),wAn(1077,1,lVn,LS),MWn.td=function(n){kS(this.a,this.b,n)},vX(pYn,"StreamImpl/MapToIntSpliterator/lambda$0$Type",1077),wAn(719,540,fVn,M6),MWn.sd=function(n){return TK(this,n)},vX(pYn,"StreamImpl/MapToObjSpliterator",719),wAn(1076,1,lVn,NS),MWn.td=function(n){ES(this.a,this.b,n)},vX(pYn,"StreamImpl/MapToObjSpliterator/lambda$0$Type",1076),wAn(618,1,lVn,sn),MWn.td=function(n){Il(this,n)},vX(pYn,"StreamImpl/ValueConsumer",618),wAn(1080,1,lVn,hn),MWn.td=function(n){dM()},vX(pYn,"StreamImpl/lambda$0$Type",1080),wAn(1081,1,lVn,fn),MWn.td=function(n){dM()},vX(pYn,"StreamImpl/lambda$1$Type",1081),wAn(1082,1,{},yw),MWn.Ce=function(n,t){return F_(this.a,n,t)},vX(pYn,"StreamImpl/lambda$4$Type",1082),wAn(1083,1,lVn,IS),MWn.td=function(n){ER(this.b,this.a,n)},vX(pYn,"StreamImpl/lambda$5$Type",1083),wAn(1089,1,lVn,kw),MWn.td=function(n){Hon(this.a,BB(n,365))},vX(pYn,"TerminatableStream/lambda$0$Type",1089),wAn(2041,1,{}),wAn(1914,1,{},ln),vX("javaemul.internal","ConsoleLogger",1914),wAn(2038,1,{});var iit,rit,cit=0,ait=0;wAn(1768,1,lVn,bn),MWn.td=function(n){BB(n,308)},vX(TYn,"BowyerWatsonTriangulation/lambda$0$Type",1768),wAn(1769,1,lVn,jw),MWn.td=function(n){Frn(this.a,BB(n,308).e)},vX(TYn,"BowyerWatsonTriangulation/lambda$1$Type",1769),wAn(1770,1,lVn,wn),MWn.td=function(n){BB(n,168)},vX(TYn,"BowyerWatsonTriangulation/lambda$2$Type",1770),wAn(1765,1,MYn,Ew),MWn.ue=function(n,t){return q3(this.a,BB(n,168),BB(t,168))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(TYn,"NaiveMinST/lambda$0$Type",1765),wAn(499,1,{},Tw),vX(TYn,"NodeMicroLayout",499),wAn(168,1,{168:1},xS),MWn.Fb=function(n){var t;return!!cL(n,168)&&(t=BB(n,168),cV(this.a,t.a)&&cV(this.b,t.b)||cV(this.a,t.b)&&cV(this.b,t.a))},MWn.Hb=function(){return KA(this.a)+KA(this.b)};var uit=vX(TYn,"TEdge",168);wAn(308,1,{308:1},ZFn),MWn.Fb=function(n){var t;return!!cL(n,308)&&K7(this,(t=BB(n,308)).a)&&K7(this,t.b)&&K7(this,t.c)},MWn.Hb=function(){return KA(this.a)+KA(this.b)+KA(this.c)},vX(TYn,"TTriangle",308),wAn(221,1,{221:1},C$),vX(TYn,"Tree",221),wAn(1254,1,{},IZ),vX(SYn,"Scanline",1254);var oit=bq(SYn,PYn);wAn(1692,1,{},ltn),vX(CYn,"CGraph",1692),wAn(307,1,{307:1},cZ),MWn.b=0,MWn.c=0,MWn.d=0,MWn.g=0,MWn.i=0,MWn.k=KQn,vX(CYn,"CGroup",307),wAn(815,1,{},Xv),vX(CYn,"CGroup/CGroupBuilder",815),wAn(57,1,{57:1},AR),MWn.Ib=function(){return this.j?SD(this.j.Kb(this)):(ED(bit),bit.o+"@"+(PN(this)>>>0).toString(16))},MWn.f=0,MWn.i=KQn;var sit,hit,fit,lit,bit=vX(CYn,"CNode",57);wAn(814,1,{},Wv),vX(CYn,"CNode/CNodeBuilder",814),wAn(1525,1,{},dn),MWn.Oe=function(n,t){return 0},MWn.Pe=function(n,t){return 0},vX(CYn,OYn,1525),wAn(1790,1,{},gn),MWn.Le=function(n){var t,i,r,c,a,u,o,s,h,f,l,b,w,d,g;for(h=RQn,r=new Wb(n.a.b);r.a<r.c.c.length;)t=BB(n0(r),57),h=e.Math.min(h,t.a.j.d.c+t.b.a);for(w=new YT,u=new Wb(n.a.a);u.a<u.c.c.length;)(a=BB(n0(u),307)).k=h,0==a.g&&r5(w,a,w.c.b,w.c);for(;0!=w.b;){for(c=(a=BB(0==w.b?null:(Px(0!=w.b),Atn(w,w.a.a)),307)).j.d.c,b=a.a.a.ec().Kc();b.Ob();)f=BB(b.Pb(),57),g=a.k+f.b.a,!Ghn(n,a,n.d)||f.d.c<g?f.i=g:f.i=f.d.c;for(c-=a.j.i,a.b+=c,n.d==(Ffn(),FPt)||n.d==KPt?a.c+=c:a.c-=c,l=a.a.a.ec().Kc();l.Ob();)for(s=(f=BB(l.Pb(),57)).c.Kc();s.Ob();)o=BB(s.Pb(),57),d=dA(n.d)?n.g.Oe(f,o):n.g.Pe(f,o),o.a.k=e.Math.max(o.a.k,f.i+f.d.b+d-o.b.a),cY(n,o,n.d)&&(o.a.k=e.Math.max(o.a.k,o.d.c-o.b.a)),--o.a.g,0==o.a.g&&DH(w,o.a)}for(i=new Wb(n.a.b);i.a<i.c.c.length;)(t=BB(n0(i),57)).d.c=t.i},vX(CYn,"LongestPathCompaction",1790),wAn(1690,1,{},yOn),MWn.e=!1;var wit,dit,git=vX(CYn,xYn,1690);wAn(1691,1,lVn,Mw),MWn.td=function(n){iun(this.a,BB(n,46))},vX(CYn,DYn,1691),wAn(1791,1,{},pn),MWn.Me=function(n){var t,e,i,r,c,a;for(t=new Wb(n.a.b);t.a<t.c.c.length;)BB(n0(t),57).c.$b();for(i=new Wb(n.a.b);i.a<i.c.c.length;)for(e=BB(n0(i),57),c=new Wb(n.a.b);c.a<c.c.c.length;)e!=(r=BB(n0(c),57))&&(e.a&&e.a==r.a||(a=dA(n.d)?n.g.Pe(e,r):n.g.Oe(e,r),(r.d.c>e.d.c||e.d.c==r.d.c&&e.d.b<r.d.b)&&Rdn(r.d.d+r.d.a+a,e.d.d)&&Kdn(r.d.d,e.d.d+e.d.a+a)&&e.c.Fc(r)))},vX(CYn,"QuadraticConstraintCalculation",1791),wAn(522,1,{522:1},Dp),MWn.a=!1,MWn.b=!1,MWn.c=!1,MWn.d=!1,vX(CYn,RYn,522),wAn(803,1,{},RG),MWn.Me=function(n){this.c=n,pCn(this,new yn)},vX(CYn,KYn,803),wAn(1718,1,{679:1},fY),MWn.Ke=function(n){_Pn(this,BB(n,464))},vX(CYn,_Yn,1718),wAn(1719,1,MYn,vn),MWn.ue=function(n,t){return uQ(BB(n,57),BB(t,57))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(CYn,FYn,1719),wAn(464,1,{464:1},OS),MWn.a=!1,vX(CYn,BYn,464),wAn(1720,1,MYn,mn),MWn.ue=function(n,t){return Jkn(BB(n,464),BB(t,464))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(CYn,HYn,1720),wAn(1721,1,qYn,yn),MWn.Lb=function(n){return BB(n,57),!0},MWn.Fb=function(n){return this===n},MWn.Mb=function(n){return BB(n,57),!0},vX(CYn,"ScanlineConstraintCalculator/lambda$1$Type",1721),wAn(428,22,{3:1,35:1,22:1,428:1},FS);var pit,vit,mit,yit=Ben(GYn,"HighLevelSortingCriterion",428,Unt,rJ,l_);wAn(427,22,{3:1,35:1,22:1,427:1},BS);var kit,jit,Eit,Tit,Mit,Sit,Pit,Cit,Iit,Oit,Ait,$it,Lit,Nit,xit,Dit,Rit,Kit=Ben(GYn,"LowLevelSortingCriterion",427,Unt,cJ,b_),_it=bq(zYn,"ILayoutMetaDataProvider");wAn(853,1,QYn,Gh),MWn.Qe=function(n){Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,UYn),YYn),"Polyomino Traversal Strategy"),"Traversal strategy for trying different candidate positions for polyominoes."),Cit),(PPn(),gMt)),Bit),nbn((rpn(),hMt))))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,XYn),YYn),"Polyomino Secondary Sorting Criterion"),"Possible secondary sorting criteria for the processing order of polyominoes. They are used when polyominoes are equal according to the primary sorting criterion HighLevelSortingCriterion."),Sit),gMt),Kit),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,WYn),YYn),"Polyomino Primary Sorting Criterion"),"Possible primary sorting criteria for the processing order of polyominoes."),Tit),gMt),yit),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,VYn),YYn),"Fill Polyominoes"),"Use the Profile Fill algorithm to fill polyominoes to prevent small polyominoes from being placed inside of big polyominoes with large holes. Might increase packing area."),(hN(),!0)),wMt),ktt),nbn(hMt))))},vX(GYn,"PolyominoOptions",853),wAn(250,22,{3:1,35:1,22:1,250:1},HS);var Fit,Bit=Ben(GYn,"TraversalStrategy",250,Unt,Tin,w_);wAn(213,1,{213:1},kn),MWn.Ib=function(){return"NEdge[id="+this.b+" w="+this.g+" d="+this.a+"]"},MWn.a=1,MWn.b=0,MWn.c=0,MWn.f=!1,MWn.g=0;var Hit=vX(JYn,"NEdge",213);wAn(176,1,{},Hv),vX(JYn,"NEdge/NEdgeBuilder",176),wAn(653,1,{},Fv),vX(JYn,"NGraph",653),wAn(121,1,{121:1},k6),MWn.c=-1,MWn.d=0,MWn.e=0,MWn.i=-1,MWn.j=!1;var qit=vX(JYn,"NNode",121);wAn(795,1,JQn,Bv),MWn.Jc=function(n){e5(this,n)},MWn.Lc=function(){return new Rq(null,new w1(this,16))},MWn.ad=function(n){_rn(this,n)},MWn.Nc=function(){return new w1(this,16)},MWn.Oc=function(){return new Rq(null,new w1(this,16))},MWn.Vc=function(n,t){++this.b,kG(this.a,n,t)},MWn.Fc=function(n){return RN(this,n)},MWn.Wc=function(n,t){return++this.b,ohn(this.a,n,t)},MWn.Gc=function(n){return++this.b,gun(this.a,n)},MWn.$b=function(){++this.b,this.a.c=x8(Ant,HWn,1,0,5,1)},MWn.Hc=function(n){return-1!=E7(this.a,n,0)},MWn.Ic=function(n){return oun(this.a,n)},MWn.Xb=function(n){return xq(this.a,n)},MWn.Xc=function(n){return E7(this.a,n,0)},MWn.dc=function(){return 0==this.a.c.length},MWn.Kc=function(){return L9(new Wb(this.a))},MWn.Yc=function(){throw Hp(new pv)},MWn.Zc=function(n){throw Hp(new pv)},MWn.$c=function(n){return++this.b,s6(this.a,n)},MWn.Mc=function(n){return KN(this,n)},MWn._c=function(n,t){return++this.b,c5(this.a,n,t)},MWn.gc=function(){return this.a.c.length},MWn.bd=function(n,t){return new s1(this.a,n,t)},MWn.Pc=function(){return bx(this.a)},MWn.Qc=function(n){return Qgn(this.a,n)},MWn.b=0,vX(JYn,"NNode/ChangeAwareArrayList",795),wAn(269,1,{},qv),vX(JYn,"NNode/NNodeBuilder",269),wAn(1630,1,{},jn),MWn.a=!1,MWn.f=DWn,MWn.j=0,vX(JYn,"NetworkSimplex",1630),wAn(1294,1,lVn,Sw),MWn.td=function(n){qzn(this.a,BB(n,680),!0,!1)},vX(nJn,"NodeLabelAndSizeCalculator/lambda$0$Type",1294),wAn(558,1,{},Pw),MWn.b=!0,MWn.c=!0,MWn.d=!0,MWn.e=!0,vX(nJn,"NodeMarginCalculator",558),wAn(212,1,{212:1}),MWn.j=!1,MWn.k=!1;var Git,zit,Uit,Xit=vX(tJn,"Cell",212);wAn(124,212,{124:1,212:1},FR),MWn.Re=function(){return XH(this)},MWn.Se=function(){var n;return n=this.n,this.a.a+n.b+n.c},vX(tJn,"AtomicCell",124),wAn(232,22,{3:1,35:1,22:1,232:1},qS);var Wit,Vit=Ben(tJn,"ContainerArea",232,Unt,v1,d_);wAn(326,212,iJn),vX(tJn,"ContainerCell",326),wAn(1473,326,iJn,Hwn),MWn.Re=function(){var n;return n=0,this.e?this.b?n=this.b.b:this.a[1][1]&&(n=this.a[1][1].Re()):n=Ybn(this,Umn(this,!0)),n>0?n+this.n.d+this.n.a:0},MWn.Se=function(){var n,t,i,r,c;if(c=0,this.e)this.b?c=this.b.a:this.a[1][1]&&(c=this.a[1][1].Se());else if(this.g)c=Ybn(this,Okn(this,null,!0));else for(Dtn(),i=0,r=(t=Pun(Gk(Vit,1),$Vn,232,0,[Git,zit,Uit])).length;i<r;++i)n=t[i],c=e.Math.max(c,Ybn(this,Okn(this,n,!0)));return c>0?c+this.n.b+this.n.c:0},MWn.Te=function(){var n,t,e,i,r;if(this.g)for(n=Okn(this,null,!1),Dtn(),i=0,r=(e=Pun(Gk(Vit,1),$Vn,232,0,[Git,zit,Uit])).length;i<r;++i)Vxn(this,t=e[i],n);else for(Dtn(),i=0,r=(e=Pun(Gk(Vit,1),$Vn,232,0,[Git,zit,Uit])).length;i<r;++i)Vxn(this,t=e[i],n=Okn(this,t,!1))},MWn.Ue=function(){var n,t,i,r;t=this.i,n=this.n,r=Umn(this,!1),Q5(this,(Dtn(),Git),t.d+n.d,r),Q5(this,Uit,t.d+t.a-n.a-r[2],r),i=t.a-n.d-n.a,r[0]>0&&(r[0]+=this.d,i-=r[0]),r[2]>0&&(r[2]+=this.d,i-=r[2]),this.c.a=e.Math.max(0,i),this.c.d=t.d+n.d+(this.c.a-i)/2,r[1]=e.Math.max(r[1],i),Q5(this,zit,t.d+n.d+r[0]-(r[1]-i)/2,r)},MWn.b=null,MWn.d=0,MWn.e=!1,MWn.f=!1,MWn.g=!1;var Qit,Yit,Jit,Zit=0,nrt=0;vX(tJn,"GridContainerCell",1473),wAn(461,22,{3:1,35:1,22:1,461:1},GS);var trt,ert=Ben(tJn,"HorizontalLabelAlignment",461,Unt,m1,g_);wAn(306,212,{212:1,306:1},yJ,wtn,KY),MWn.Re=function(){return WH(this)},MWn.Se=function(){return VH(this)},MWn.a=0,MWn.c=!1;var irt,rrt,crt,art=vX(tJn,"LabelCell",306);wAn(244,326,{212:1,326:1,244:1},Ign),MWn.Re=function(){return MIn(this)},MWn.Se=function(){return SIn(this)},MWn.Te=function(){_Fn(this)},MWn.Ue=function(){GFn(this)},MWn.b=0,MWn.c=0,MWn.d=!1,vX(tJn,"StripContainerCell",244),wAn(1626,1,DVn,En),MWn.Mb=function(n){return Qy(BB(n,212))},vX(tJn,"StripContainerCell/lambda$0$Type",1626),wAn(1627,1,{},Tn),MWn.Fe=function(n){return BB(n,212).Se()},vX(tJn,"StripContainerCell/lambda$1$Type",1627),wAn(1628,1,DVn,Mn),MWn.Mb=function(n){return Yy(BB(n,212))},vX(tJn,"StripContainerCell/lambda$2$Type",1628),wAn(1629,1,{},Sn),MWn.Fe=function(n){return BB(n,212).Re()},vX(tJn,"StripContainerCell/lambda$3$Type",1629),wAn(462,22,{3:1,35:1,22:1,462:1},zS);var urt,ort,srt,hrt,frt,lrt,brt,wrt,drt,grt,prt,vrt,mrt,yrt,krt,jrt,Ert,Trt,Mrt,Srt,Prt,Crt,Irt,Ort=Ben(tJn,"VerticalLabelAlignment",462,Unt,y1,p_);wAn(789,1,{},eUn),MWn.c=0,MWn.d=0,MWn.k=0,MWn.s=0,MWn.t=0,MWn.v=!1,MWn.w=0,MWn.D=!1,vX(sJn,"NodeContext",789),wAn(1471,1,MYn,Pn),MWn.ue=function(n,t){return YO(BB(n,61),BB(t,61))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(sJn,"NodeContext/0methodref$comparePortSides$Type",1471),wAn(1472,1,MYn,Cn),MWn.ue=function(n,t){return UTn(BB(n,111),BB(t,111))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(sJn,"NodeContext/1methodref$comparePortContexts$Type",1472),wAn(159,22,{3:1,35:1,22:1,159:1},ocn);var Art,$rt,Lrt,Nrt,xrt,Drt,Rrt,Krt=Ben(sJn,"NodeLabelLocation",159,Unt,tpn,v_);wAn(111,1,{111:1},MOn),MWn.a=!1,vX(sJn,"PortContext",111),wAn(1476,1,lVn,In),MWn.td=function(n){CE(BB(n,306))},vX(lJn,bJn,1476),wAn(1477,1,DVn,On),MWn.Mb=function(n){return!!BB(n,111).c},vX(lJn,wJn,1477),wAn(1478,1,lVn,An),MWn.td=function(n){CE(BB(n,111).c)},vX(lJn,"LabelPlacer/lambda$2$Type",1478),wAn(1475,1,lVn,Ln),MWn.td=function(n){qD(),Yp(BB(n,111))},vX(lJn,"NodeLabelAndSizeUtilities/lambda$0$Type",1475),wAn(790,1,lVn,$_),MWn.td=function(n){RM(this.b,this.c,this.a,BB(n,181))},MWn.a=!1,MWn.c=!1,vX(lJn,"NodeLabelCellCreator/lambda$0$Type",790),wAn(1474,1,lVn,Cw),MWn.td=function(n){Iv(this.a,BB(n,181))},vX(lJn,"PortContextCreator/lambda$0$Type",1474),wAn(1829,1,{},Nn),vX(gJn,"GreedyRectangleStripOverlapRemover",1829),wAn(1830,1,MYn,$n),MWn.ue=function(n,t){return FN(BB(n,222),BB(t,222))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(gJn,"GreedyRectangleStripOverlapRemover/0methodref$compareByYCoordinate$Type",1830),wAn(1786,1,{},Zv),MWn.a=5,MWn.e=0,vX(gJn,"RectangleStripOverlapRemover",1786),wAn(1787,1,MYn,Dn),MWn.ue=function(n,t){return BN(BB(n,222),BB(t,222))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(gJn,"RectangleStripOverlapRemover/0methodref$compareLeftRectangleBorders$Type",1787),wAn(1789,1,MYn,Rn),MWn.ue=function(n,t){return JU(BB(n,222),BB(t,222))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(gJn,"RectangleStripOverlapRemover/1methodref$compareRightRectangleBorders$Type",1789),wAn(406,22,{3:1,35:1,22:1,406:1},US);var _rt,Frt,Brt,Hrt,qrt,Grt=Ben(gJn,"RectangleStripOverlapRemover/OverlapRemovalDirection",406,Unt,Y2,m_);wAn(222,1,{222:1},xG),vX(gJn,"RectangleStripOverlapRemover/RectangleNode",222),wAn(1788,1,lVn,Iw),MWn.td=function(n){Cmn(this.a,BB(n,222))},vX(gJn,"RectangleStripOverlapRemover/lambda$1$Type",1788),wAn(1304,1,MYn,Kn),MWn.ue=function(n,t){return zHn(BB(n,167),BB(t,167))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(vJn,"PolyominoCompactor/CornerCasesGreaterThanRestComparator",1304),wAn(1307,1,{},_n),MWn.Kb=function(n){return BB(n,324).a},vX(vJn,"PolyominoCompactor/CornerCasesGreaterThanRestComparator/lambda$0$Type",1307),wAn(1308,1,DVn,Fn),MWn.Mb=function(n){return BB(n,323).a},vX(vJn,"PolyominoCompactor/CornerCasesGreaterThanRestComparator/lambda$1$Type",1308),wAn(1309,1,DVn,Bn),MWn.Mb=function(n){return BB(n,323).a},vX(vJn,"PolyominoCompactor/CornerCasesGreaterThanRestComparator/lambda$2$Type",1309),wAn(1302,1,MYn,Hn),MWn.ue=function(n,t){return WRn(BB(n,167),BB(t,167))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(vJn,"PolyominoCompactor/MinNumOfExtensionDirectionsComparator",1302),wAn(1305,1,{},xn),MWn.Kb=function(n){return BB(n,324).a},vX(vJn,"PolyominoCompactor/MinNumOfExtensionDirectionsComparator/lambda$0$Type",1305),wAn(767,1,MYn,qn),MWn.ue=function(n,t){return Uan(BB(n,167),BB(t,167))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(vJn,"PolyominoCompactor/MinNumOfExtensionsComparator",767),wAn(1300,1,MYn,Gn),MWn.ue=function(n,t){return Qin(BB(n,321),BB(t,321))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(vJn,"PolyominoCompactor/MinPerimeterComparator",1300),wAn(1301,1,MYn,zn),MWn.ue=function(n,t){return avn(BB(n,321),BB(t,321))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(vJn,"PolyominoCompactor/MinPerimeterComparatorWithShape",1301),wAn(1303,1,MYn,Un),MWn.ue=function(n,t){return BKn(BB(n,167),BB(t,167))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(vJn,"PolyominoCompactor/SingleExtensionSideGreaterThanRestComparator",1303),wAn(1306,1,{},Xn),MWn.Kb=function(n){return BB(n,324).a},vX(vJn,"PolyominoCompactor/SingleExtensionSideGreaterThanRestComparator/lambda$0$Type",1306),wAn(777,1,{},DS),MWn.Ce=function(n,t){return O2(this,BB(n,46),BB(t,167))},vX(vJn,"SuccessorCombination",777),wAn(644,1,{},Wn),MWn.Ce=function(n,t){var e;return XIn((e=BB(n,46),BB(t,167),e))},vX(vJn,"SuccessorJitter",644),wAn(643,1,{},Vn),MWn.Ce=function(n,t){var e;return bxn((e=BB(n,46),BB(t,167),e))},vX(vJn,"SuccessorLineByLine",643),wAn(568,1,{},Qn),MWn.Ce=function(n,t){var e;return f$n((e=BB(n,46),BB(t,167),e))},vX(vJn,"SuccessorManhattan",568),wAn(1356,1,{},Yn),MWn.Ce=function(n,t){var e;return jNn((e=BB(n,46),BB(t,167),e))},vX(vJn,"SuccessorMaxNormWindingInMathPosSense",1356),wAn(400,1,{},Ow),MWn.Ce=function(n,t){return BU(this,n,t)},MWn.c=!1,MWn.d=!1,MWn.e=!1,MWn.f=!1,vX(vJn,"SuccessorQuadrantsGeneric",400),wAn(1357,1,{},Jn),MWn.Kb=function(n){return BB(n,324).a},vX(vJn,"SuccessorQuadrantsGeneric/lambda$0$Type",1357),wAn(323,22,{3:1,35:1,22:1,323:1},_S),MWn.a=!1;var zrt,Urt=Ben(EJn,TJn,323,Unt,n3,y_);wAn(1298,1,{}),MWn.Ib=function(){var n,t,e,i,r,c;for(e=" ",n=iln(0),r=0;r<this.o;r++)e+=""+n.a,n=iln(lR(n.a));for(e+="\n",n=iln(0),c=0;c<this.p;c++){for(e+=""+n.a,n=iln(lR(n.a)),i=0;i<this.o;i++)0==Vhn(t=trn(this,i,c),0)?e+="_":0==Vhn(t,1)?e+="X":e+="0";e+="\n"}return fx(e,0,e.length-1)},MWn.o=0,MWn.p=0,vX(EJn,"TwoBitGrid",1298),wAn(321,1298,{321:1},qwn),MWn.j=0,MWn.k=0,vX(EJn,"PlanarGrid",321),wAn(167,321,{321:1,167:1}),MWn.g=0,MWn.i=0,vX(EJn,"Polyomino",167);var Xrt=bq(IJn,OJn);wAn(134,1,AJn,Zn),MWn.Ye=function(n,t){return son(this,n,t)},MWn.Ve=function(){return Gq(this)},MWn.We=function(n){return mMn(this,n)},MWn.Xe=function(n){return Lx(this,n)},vX(IJn,"MapPropertyHolder",134),wAn(1299,134,AJn,yxn),vX(EJn,"Polyominoes",1299);var Wrt,Vrt,Qrt,Yrt,Jrt,Zrt,nct,tct,ect=!1;wAn(1766,1,lVn,nt),MWn.td=function(n){uqn(BB(n,221))},vX($Jn,"DepthFirstCompaction/0methodref$compactTree$Type",1766),wAn(810,1,lVn,Aw),MWn.td=function(n){KW(this.a,BB(n,221))},vX($Jn,"DepthFirstCompaction/lambda$1$Type",810),wAn(1767,1,lVn,N_),MWn.td=function(n){dgn(this.a,this.b,this.c,BB(n,221))},vX($Jn,"DepthFirstCompaction/lambda$2$Type",1767),wAn(65,1,{65:1},AZ),vX($Jn,"Node",65),wAn(1250,1,{},I$),vX($Jn,"ScanlineOverlapCheck",1250),wAn(1251,1,{679:1},hY),MWn.Ke=function(n){GD(this,BB(n,440))},vX($Jn,"ScanlineOverlapCheck/OverlapsScanlineHandler",1251),wAn(1252,1,MYn,tt),MWn.ue=function(n,t){return xln(BB(n,65),BB(t,65))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX($Jn,"ScanlineOverlapCheck/OverlapsScanlineHandler/lambda$0$Type",1252),wAn(440,1,{440:1},RS),MWn.a=!1,vX($Jn,"ScanlineOverlapCheck/Timestamp",440),wAn(1253,1,MYn,et),MWn.ue=function(n,t){return Zkn(BB(n,440),BB(t,440))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX($Jn,"ScanlineOverlapCheck/lambda$0$Type",1253),wAn(550,1,{},it),vX(LJn,"SVGImage",550),wAn(324,1,{324:1},x_),MWn.Ib=function(){return"("+this.a+FWn+this.b+FWn+this.c+")"},vX(LJn,"UniqueTriple",324),wAn(209,1,NJn),vX(xJn,"AbstractLayoutProvider",209),wAn(1132,209,NJn,rt),MWn.Ze=function(n,t){var e,i,r;OTn(t,DJn,1),this.a=Gy(MD(ZAn(n,(Epn(),Ect)))),P8(n,bct)&&(i=SD(ZAn(n,bct)),(e=XRn(cin(),i))&&BB(sJ(e.f),209).Ze(n,mcn(t,1))),r=new s4(this.a),this.b=Rzn(r,n),0===BB(ZAn(n,(Gsn(),oct)),481).g?(BOn(new ct,this.b),Ypn(n,gct,mMn(this.b,gct))):$T(),Uzn(r),Ypn(n,dct,this.b),HSn(t)},MWn.a=0,vX(RJn,"DisCoLayoutProvider",1132),wAn(1244,1,{},ct),MWn.c=!1,MWn.e=0,MWn.f=0,vX(RJn,"DisCoPolyominoCompactor",1244),wAn(561,1,{561:1},hG),MWn.b=!0,vX(KJn,"DCComponent",561),wAn(394,22,{3:1,35:1,22:1,394:1},KS),MWn.a=!1;var ict,rct,cct=Ben(KJn,"DCDirection",394,Unt,Z2,k_);wAn(266,134,{3:1,266:1,94:1,134:1},EAn),vX(KJn,"DCElement",266),wAn(395,1,{395:1},Imn),MWn.c=0,vX(KJn,"DCExtension",395),wAn(755,134,AJn,_j),vX(KJn,"DCGraph",755),wAn(481,22,{3:1,35:1,22:1,481:1},Ix);var act,uct,oct,sct,hct,fct,lct,bct,wct,dct,gct,pct,vct,mct,yct,kct,jct,Ect,Tct,Mct,Sct,Pct=Ben(_Jn,FJn,481,Unt,RV,j_);wAn(854,1,QYn,Hh),MWn.Qe=function(n){Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,BJn),zJn),"Connected Components Compaction Strategy"),"Strategy for packing different connected components in order to save space and enhance readability of a graph."),sct),(PPn(),gMt)),Pct),nbn((rpn(),hMt))))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,HJn),zJn),"Connected Components Layout Algorithm"),"A layout algorithm that is to be applied to each connected component before the components themselves are compacted. If unspecified, the positions of the components' nodes are not altered."),yMt),Qtt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,qJn),"debug"),"DCGraph"),"Access to the DCGraph is intended for the debug view,"),mMt),Ant),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,GJn),"debug"),"List of Polyominoes"),"Access to the polyominoes is intended for the debug view,"),mMt),Ant),nbn(hMt)))),BBn((new qh,n))},vX(_Jn,"DisCoMetaDataProvider",854),wAn(998,1,QYn,qh),MWn.Qe=function(n){BBn(n)},vX(_Jn,"DisCoOptions",998),wAn(999,1,{},at),MWn.$e=function(){return new rt},MWn._e=function(n){},vX(_Jn,"DisCoOptions/DiscoFactory",999),wAn(562,167,{321:1,167:1,562:1},Q$n),MWn.a=0,MWn.b=0,MWn.c=0,MWn.d=0,vX("org.eclipse.elk.alg.disco.structures","DCPolyomino",562),wAn(1268,1,DVn,ut),MWn.Mb=function(n){return TO(n)},vX(YJn,"ElkGraphComponentsProcessor/lambda$0$Type",1268),wAn(1269,1,{},ot),MWn.Kb=function(n){return MQ(),PMn(BB(n,79))},vX(YJn,"ElkGraphComponentsProcessor/lambda$1$Type",1269),wAn(1270,1,DVn,st),MWn.Mb=function(n){return qH(BB(n,79))},vX(YJn,"ElkGraphComponentsProcessor/lambda$2$Type",1270),wAn(1271,1,{},ht),MWn.Kb=function(n){return MQ(),OMn(BB(n,79))},vX(YJn,"ElkGraphComponentsProcessor/lambda$3$Type",1271),wAn(1272,1,DVn,ft),MWn.Mb=function(n){return GH(BB(n,79))},vX(YJn,"ElkGraphComponentsProcessor/lambda$4$Type",1272),wAn(1273,1,DVn,$w),MWn.Mb=function(n){return MJ(this.a,BB(n,79))},vX(YJn,"ElkGraphComponentsProcessor/lambda$5$Type",1273),wAn(1274,1,{},Lw),MWn.Kb=function(n){return KX(this.a,BB(n,79))},vX(YJn,"ElkGraphComponentsProcessor/lambda$6$Type",1274),wAn(1241,1,{},s4),MWn.a=0,vX(YJn,"ElkGraphTransformer",1241),wAn(1242,1,{},lt),MWn.Od=function(n,t){tOn(this,BB(n,160),BB(t,266))},vX(YJn,"ElkGraphTransformer/OffsetApplier",1242),wAn(1243,1,lVn,Nw),MWn.td=function(n){TL(this,BB(n,8))},vX(YJn,"ElkGraphTransformer/OffsetApplier/OffSetToChainApplier",1243),wAn(753,1,{},bt),vX(eZn,iZn,753),wAn(1232,1,MYn,wt),MWn.ue=function(n,t){return CIn(BB(n,231),BB(t,231))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(eZn,rZn,1232),wAn(740,209,NJn,Gv),MWn.Ze=function(n,t){vLn(this,n,t)},vX(eZn,"ForceLayoutProvider",740),wAn(357,134,{3:1,357:1,94:1,134:1}),vX(cZn,"FParticle",357),wAn(559,357,{3:1,559:1,357:1,94:1,134:1},hX),MWn.Ib=function(){var n;return this.a?(n=E7(this.a.a,this,0))>=0?"b"+n+"["+u5(this.a)+"]":"b["+u5(this.a)+"]":"b_"+PN(this)},vX(cZn,"FBendpoint",559),wAn(282,134,{3:1,282:1,94:1,134:1},IR),MWn.Ib=function(){return u5(this)},vX(cZn,"FEdge",282),wAn(231,134,{3:1,231:1,94:1,134:1},y6);var Cct,Ict,Oct,Act,$ct,Lct,Nct,xct,Dct,Rct,Kct=vX(cZn,"FGraph",231);wAn(447,357,{3:1,447:1,357:1,94:1,134:1},m4),MWn.Ib=function(){return null==this.b||0==this.b.length?"l["+u5(this.a)+"]":"l_"+this.b},vX(cZn,"FLabel",447),wAn(144,357,{3:1,144:1,357:1,94:1,134:1},qX),MWn.Ib=function(){return p0(this)},MWn.b=0,vX(cZn,"FNode",144),wAn(2003,1,{}),MWn.bf=function(n){sFn(this,n)},MWn.cf=function(){qmn(this)},MWn.d=0,vX(uZn,"AbstractForceModel",2003),wAn(631,2003,{631:1},Lan),MWn.af=function(n,t){var i,r,c,a;return tIn(this.f,n,t),c=XR(B$(t.d),n.d),a=e.Math.sqrt(c.a*c.a+c.b*c.b),r=e.Math.max(0,a-lW(n.e)/2-lW(t.e)/2),kL(c,((i=qon(this.e,n,t))>0?-_U(r,this.c)*i:xx(r,this.b)*BB(mMn(n,(fRn(),Zct)),19).a)/a),c},MWn.bf=function(n){sFn(this,n),this.a=BB(mMn(n,(fRn(),qct)),19).a,this.c=Gy(MD(mMn(n,cat))),this.b=Gy(MD(mMn(n,tat)))},MWn.df=function(n){return n<this.a},MWn.a=0,MWn.b=0,MWn.c=0,vX(uZn,"EadesModel",631),wAn(632,2003,{632:1},fH),MWn.af=function(n,t){var i,r,c,a,u;return tIn(this.f,n,t),c=XR(B$(t.d),n.d),u=e.Math.sqrt(c.a*c.a+c.b*c.b),a=Nx(r=e.Math.max(0,u-lW(n.e)/2-lW(t.e)/2),this.a)*BB(mMn(n,(fRn(),Zct)),19).a,(i=qon(this.e,n,t))>0&&(a-=Sy(r,this.a)*i),kL(c,a*this.b/u),c},MWn.bf=function(n){var t,i,r,c,a,u,o;for(sFn(this,n),this.b=Gy(MD(mMn(n,(fRn(),aat)))),this.c=this.b/BB(mMn(n,qct),19).a,r=n.e.c.length,a=0,c=0,o=new Wb(n.e);o.a<o.c.c.length;)a+=(u=BB(n0(o),144)).e.a,c+=u.e.b;t=a*c,i=Gy(MD(mMn(n,cat)))*fJn,this.a=e.Math.sqrt(t/(2*r))*i},MWn.cf=function(){qmn(this),this.b-=this.c},MWn.df=function(n){return this.b>0},MWn.a=0,MWn.b=0,MWn.c=0,vX(uZn,"FruchtermanReingoldModel",632),wAn(849,1,QYn,zh),MWn.Qe=function(n){Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,oZn),""),"Force Model"),"Determines the model for force calculation."),Oct),(PPn(),gMt)),$at),nbn((rpn(),hMt))))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,sZn),""),"Iterations"),"The number of iterations on the force model."),iln(300)),vMt),Att),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,hZn),""),"Repulsive Power"),"Determines how many bend points are added to the edge; such bend points are regarded as repelling particles in the force model"),iln(0)),vMt),Att),nbn(uMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,fZn),""),"FR Temperature"),"The temperature is used as a scaling factor for particle displacements."),lZn),dMt),Ptt),nbn(hMt)))),a2(n,fZn,oZn,xct),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,bZn),""),"Eades Repulsion"),"Factor for repulsive forces in Eades' model."),5),dMt),Ptt),nbn(hMt)))),a2(n,bZn,oZn,$ct),pUn((new Uh,n))},vX(wZn,"ForceMetaDataProvider",849),wAn(424,22,{3:1,35:1,22:1,424:1},XS);var _ct,Fct,Bct,Hct,qct,Gct,zct,Uct,Xct,Wct,Vct,Qct,Yct,Jct,Zct,nat,tat,eat,iat,rat,cat,aat,uat,oat,sat,hat,fat,lat,bat,wat,dat,gat,pat,vat,mat,yat,kat,jat,Eat,Tat,Mat,Sat,Pat,Cat,Iat,Oat,Aat,$at=Ben(wZn,"ForceModelStrategy",424,Unt,aJ,E_);wAn(988,1,QYn,Uh),MWn.Qe=function(n){pUn(n)},vX(wZn,"ForceOptions",988),wAn(989,1,{},dt),MWn.$e=function(){return new Gv},MWn._e=function(n){},vX(wZn,"ForceOptions/ForceFactory",989),wAn(850,1,QYn,Xh),MWn.Qe=function(n){Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,NZn),""),"Fixed Position"),"Prevent that the node is moved by the layout algorithm."),(hN(),!1)),(PPn(),wMt)),ktt),nbn((rpn(),sMt))))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,xZn),""),"Desired Edge Length"),"Either specified for parent nodes or for individual edges, where the latter takes higher precedence."),100),dMt),Ptt),EG(hMt,Pun(Gk(jMt,1),$Vn,175,0,[uMt]))))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,DZn),""),"Layout Dimension"),"Dimensions that are permitted to be altered during layout."),bat),gMt),Hat),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,RZn),""),"Stress Epsilon"),"Termination criterion for the iterative process."),lZn),dMt),Ptt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,KZn),""),"Iteration Limit"),"Maximum number of performed iterations. Takes higher precedence than 'epsilon'."),iln(DWn)),vMt),Att),nbn(hMt)))),UGn((new Wh,n))},vX(wZn,"StressMetaDataProvider",850),wAn(992,1,QYn,Wh),MWn.Qe=function(n){UGn(n)},vX(wZn,"StressOptions",992),wAn(993,1,{},gt),MWn.$e=function(){return new OR},MWn._e=function(n){},vX(wZn,"StressOptions/StressFactory",993),wAn(1128,209,NJn,OR),MWn.Ze=function(n,t){var e,i,r,c;for(OTn(t,FZn,1),qy(TD(ZAn(n,(rkn(),kat))))?qy(TD(ZAn(n,Pat)))||jJ(new Tw((GM(),new Dy(n)))):vLn(new Gv,n,mcn(t,1)),i=fon(n),c=(e=HFn(this.a,i)).Kc();c.Ob();)(r=BB(c.Pb(),231)).e.c.length<=1||(HHn(this.b,r),i$n(this.b),Otn(r.d,new pt));SUn(i=GUn(e)),HSn(t)},vX(HZn,"StressLayoutProvider",1128),wAn(1129,1,lVn,pt),MWn.td=function(n){_Bn(BB(n,447))},vX(HZn,"StressLayoutProvider/lambda$0$Type",1129),wAn(990,1,{},Tv),MWn.c=0,MWn.e=0,MWn.g=0,vX(HZn,"StressMajorization",990),wAn(379,22,{3:1,35:1,22:1,379:1},WS);var Lat,Nat,xat,Dat,Rat,Kat,_at,Fat,Bat,Hat=Ben(HZn,"StressMajorization/Dimension",379,Unt,j1,T_);wAn(991,1,MYn,xw),MWn.ue=function(n,t){return SK(this.a,BB(n,144),BB(t,144))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(HZn,"StressMajorization/lambda$0$Type",991),wAn(1229,1,{},D0),vX(GZn,"ElkLayered",1229),wAn(1230,1,lVn,vt),MWn.td=function(n){RIn(BB(n,37))},vX(GZn,"ElkLayered/lambda$0$Type",1230),wAn(1231,1,lVn,Dw),MWn.td=function(n){PK(this.a,BB(n,37))},vX(GZn,"ElkLayered/lambda$1$Type",1231),wAn(1263,1,{},$$),vX(GZn,"GraphConfigurator",1263),wAn(759,1,lVn,Rw),MWn.td=function(n){VMn(this.a,BB(n,10))},vX(GZn,"GraphConfigurator/lambda$0$Type",759),wAn(760,1,{},mt),MWn.Kb=function(n){return tjn(),new Rq(null,new w1(BB(n,29).a,16))},vX(GZn,"GraphConfigurator/lambda$1$Type",760),wAn(761,1,lVn,Kw),MWn.td=function(n){VMn(this.a,BB(n,10))},vX(GZn,"GraphConfigurator/lambda$2$Type",761),wAn(1127,209,NJn,Uv),MWn.Ze=function(n,t){var e;e=SBn(new tm,n),GI(ZAn(n,(HXn(),sgt)))===GI((ufn(),pCt))?rwn(this.a,e,t):wOn(this.a,e,t),gUn(new Qh,e)},vX(GZn,"LayeredLayoutProvider",1127),wAn(356,22,{3:1,35:1,22:1,356:1},VS);var qat,Gat,zat,Uat=Ben(GZn,"LayeredPhases",356,Unt,s5,M_);wAn(1651,1,{},vin),MWn.i=0,vX(zZn,"ComponentsToCGraphTransformer",1651),wAn(1652,1,{},yt),MWn.ef=function(n,t){return e.Math.min(null!=n.a?Gy(n.a):n.c.i,null!=t.a?Gy(t.a):t.c.i)},MWn.ff=function(n,t){return e.Math.min(null!=n.a?Gy(n.a):n.c.i,null!=t.a?Gy(t.a):t.c.i)},vX(zZn,"ComponentsToCGraphTransformer/1",1652),wAn(81,1,{81:1}),MWn.i=0,MWn.k=!0,MWn.o=KQn;var Xat,Wat,Vat,Qat=vX(UZn,"CNode",81);wAn(460,81,{460:1,81:1},NN,Sgn),MWn.Ib=function(){return""},vX(zZn,"ComponentsToCGraphTransformer/CRectNode",460),wAn(1623,1,{},kt),vX(zZn,"OneDimensionalComponentsCompaction",1623),wAn(1624,1,{},jt),MWn.Kb=function(n){return xZ(BB(n,46))},MWn.Fb=function(n){return this===n},vX(zZn,"OneDimensionalComponentsCompaction/lambda$0$Type",1624),wAn(1625,1,{},Et),MWn.Kb=function(n){return Ewn(BB(n,46))},MWn.Fb=function(n){return this===n},vX(zZn,"OneDimensionalComponentsCompaction/lambda$1$Type",1625),wAn(1654,1,{},BX),vX(UZn,"CGraph",1654),wAn(189,1,{189:1},Pgn),MWn.b=0,MWn.c=0,MWn.e=0,MWn.g=!0,MWn.i=KQn,vX(UZn,"CGroup",189),wAn(1653,1,{},Pt),MWn.ef=function(n,t){return e.Math.max(null!=n.a?Gy(n.a):n.c.i,null!=t.a?Gy(t.a):t.c.i)},MWn.ff=function(n,t){return e.Math.max(null!=n.a?Gy(n.a):n.c.i,null!=t.a?Gy(t.a):t.c.i)},vX(UZn,OYn,1653),wAn(1655,1,{},sOn),MWn.d=!1;var Yat=vX(UZn,xYn,1655);wAn(1656,1,{},Ct),MWn.Kb=function(n){return kM(),hN(),0!=BB(BB(n,46).a,81).d.e},MWn.Fb=function(n){return this===n},vX(UZn,DYn,1656),wAn(823,1,{},Sq),MWn.a=!1,MWn.b=!1,MWn.c=!1,MWn.d=!1,vX(UZn,RYn,823),wAn(1825,1,{},DG),vX(XZn,KYn,1825);var Jat=bq(WZn,PYn);wAn(1826,1,{369:1},lY),MWn.Ke=function(n){Gxn(this,BB(n,466))},vX(XZn,_Yn,1826),wAn(1827,1,MYn,It),MWn.ue=function(n,t){return oQ(BB(n,81),BB(t,81))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(XZn,FYn,1827),wAn(466,1,{466:1},fP),MWn.a=!1,vX(XZn,BYn,466),wAn(1828,1,MYn,Ot),MWn.ue=function(n,t){return njn(BB(n,466),BB(t,466))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(XZn,HYn,1828),wAn(140,1,{140:1},dP,mH),MWn.Fb=function(n){var t;return null!=n&&iut==tsn(n)&&(t=BB(n,140),cV(this.c,t.c)&&cV(this.d,t.d))},MWn.Hb=function(){return fhn(Pun(Gk(Ant,1),HWn,1,5,[this.c,this.d]))},MWn.Ib=function(){return"("+this.c+FWn+this.d+(this.a?"cx":"")+this.b+")"},MWn.a=!0,MWn.c=0,MWn.d=0;var Zat,nut,tut,eut,iut=vX(WZn,"Point",140);wAn(405,22,{3:1,35:1,22:1,405:1},QS);var rut,cut,aut,uut,out,sut,hut,fut,lut,but,wut,dut=Ben(WZn,"Point/Quadrant",405,Unt,t3,S_);wAn(1642,1,{},Vv),MWn.b=null,MWn.c=null,MWn.d=null,MWn.e=null,MWn.f=null,vX(WZn,"RectilinearConvexHull",1642),wAn(574,1,{369:1},Tpn),MWn.Ke=function(n){_9(this,BB(n,140))},MWn.b=0,vX(WZn,"RectilinearConvexHull/MaximalElementsEventHandler",574),wAn(1644,1,MYn,Mt),MWn.ue=function(n,t){return DV(MD(n),MD(t))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(WZn,"RectilinearConvexHull/MaximalElementsEventHandler/lambda$0$Type",1644),wAn(1643,1,{369:1},ftn),MWn.Ke=function(n){PNn(this,BB(n,140))},MWn.a=0,MWn.b=null,MWn.c=null,MWn.d=null,MWn.e=null,vX(WZn,"RectilinearConvexHull/RectangleEventHandler",1643),wAn(1645,1,MYn,St),MWn.ue=function(n,t){return u0(BB(n,140),BB(t,140))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(WZn,"RectilinearConvexHull/lambda$0$Type",1645),wAn(1646,1,MYn,Tt),MWn.ue=function(n,t){return o0(BB(n,140),BB(t,140))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(WZn,"RectilinearConvexHull/lambda$1$Type",1646),wAn(1647,1,MYn,At),MWn.ue=function(n,t){return h0(BB(n,140),BB(t,140))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(WZn,"RectilinearConvexHull/lambda$2$Type",1647),wAn(1648,1,MYn,$t),MWn.ue=function(n,t){return s0(BB(n,140),BB(t,140))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(WZn,"RectilinearConvexHull/lambda$3$Type",1648),wAn(1649,1,MYn,Lt),MWn.ue=function(n,t){return jMn(BB(n,140),BB(t,140))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(WZn,"RectilinearConvexHull/lambda$4$Type",1649),wAn(1650,1,{},OZ),vX(WZn,"Scanline",1650),wAn(2005,1,{}),vX(VZn,"AbstractGraphPlacer",2005),wAn(325,1,{325:1},Xx),MWn.mf=function(n){return!!this.nf(n)&&(JIn(this.b,BB(mMn(n,(hWn(),Xft)),21),n),!0)},MWn.nf=function(n){var t,e,i;for(t=BB(mMn(n,(hWn(),Xft)),21),i=BB(h6(fut,t),21).Kc();i.Ob();)if(e=BB(i.Pb(),21),!BB(h6(this.b,e),15).dc())return!1;return!0},vX(VZn,"ComponentGroup",325),wAn(765,2005,{},Qv),MWn.of=function(n){var t;for(t=new Wb(this.a);t.a<t.c.c.length;)if(BB(n0(t),325).mf(n))return;WB(this.a,new Xx(n))},MWn.lf=function(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w;if(this.a.c=x8(Ant,HWn,1,0,5,1),t.a.c=x8(Ant,HWn,1,0,5,1),n.dc())return t.f.a=0,void(t.f.b=0);for(qan(t,a=BB(n.Xb(0),37)),r=n.Kc();r.Ob();)i=BB(r.Pb(),37),this.of(i);for(w=new Gj,c=Gy(MD(mMn(a,(HXn(),mpt)))),s=new Wb(this.a);s.a<s.c.c.length;)h=TXn(u=BB(n0(s),325),c),w9(TX(u.b),w.a,w.b),w.a+=h.a,w.b+=h.b;if(t.f.a=w.a-c,t.f.b=w.b-c,qy(TD(mMn(a,Mdt)))&&GI(mMn(a,Zdt))===GI((Mbn(),QPt))){for(b=n.Kc();b.Ob();)ZRn(f=BB(b.Pb(),37),f.c.a,f.c.b);for(KXn(e=new Nt,n,c),l=n.Kc();l.Ob();)UR(kO((f=BB(l.Pb(),37)).c),e.e);UR(kO(t.f),e.a)}for(o=new Wb(this.a);o.a<o.c.c.length;)d9(t,TX((u=BB(n0(o),325)).b))},vX(VZn,"ComponentGroupGraphPlacer",765),wAn(1293,765,{},hm),MWn.of=function(n){pfn(this,n)},MWn.lf=function(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v;if(this.a.c=x8(Ant,HWn,1,0,5,1),t.a.c=x8(Ant,HWn,1,0,5,1),n.dc())return t.f.a=0,void(t.f.b=0);for(qan(t,a=BB(n.Xb(0),37)),r=n.Kc();r.Ob();)pfn(this,BB(r.Pb(),37));for(v=new Gj,p=new Gj,d=new Gj,w=new Gj,c=Gy(MD(mMn(a,(HXn(),mpt)))),s=new Wb(this.a);s.a<s.c.c.length;){if(u=BB(n0(s),325),dA(BB(mMn(t,(sWn(),bSt)),103))){for(d.a=v.a,g=new ly(MX(kX(u.b).a).a.kc());g.b.Ob();)if(BB(cS(g.b.Pb()),21).Hc((kUn(),sIt))){d.a=p.a;break}}else if(gA(BB(mMn(t,bSt),103)))for(d.b=v.b,g=new ly(MX(kX(u.b).a).a.kc());g.b.Ob();)if(BB(cS(g.b.Pb()),21).Hc((kUn(),CIt))){d.b=p.b;break}if(h=TXn(BB(u,570),c),w9(TX(u.b),d.a,d.b),dA(BB(mMn(t,bSt),103))){for(p.a=d.a+h.a,w.a=e.Math.max(w.a,p.a),g=new ly(MX(kX(u.b).a).a.kc());g.b.Ob();)if(BB(cS(g.b.Pb()),21).Hc((kUn(),SIt))){v.a=d.a+h.a;break}p.b=d.b+h.b,d.b=p.b,w.b=e.Math.max(w.b,d.b)}else if(gA(BB(mMn(t,bSt),103))){for(p.b=d.b+h.b,w.b=e.Math.max(w.b,p.b),g=new ly(MX(kX(u.b).a).a.kc());g.b.Ob();)if(BB(cS(g.b.Pb()),21).Hc((kUn(),oIt))){v.b=d.b+h.b;break}p.a=d.a+h.a,d.a=p.a,w.a=e.Math.max(w.a,d.a)}}if(t.f.a=w.a-c,t.f.b=w.b-c,qy(TD(mMn(a,Mdt)))&&GI(mMn(a,Zdt))===GI((Mbn(),QPt))){for(b=n.Kc();b.Ob();)ZRn(f=BB(b.Pb(),37),f.c.a,f.c.b);for(KXn(i=new Nt,n,c),l=n.Kc();l.Ob();)UR(kO((f=BB(l.Pb(),37)).c),i.e);UR(kO(t.f),i.a)}for(o=new Wb(this.a);o.a<o.c.c.length;)d9(t,TX((u=BB(n0(o),325)).b))},vX(VZn,"ComponentGroupModelOrderGraphPlacer",1293),wAn(423,22,{3:1,35:1,22:1,423:1},YS);var gut,put,vut,mut=Ben(VZn,"ComponentOrderingStrategy",423,Unt,k1,P_);wAn(650,1,{},Nt),vX(VZn,"ComponentsCompactor",650),wAn(1468,12,QQn,v5),MWn.Fc=function(n){return Yjn(this,BB(n,140))},vX(VZn,"ComponentsCompactor/Hullpoints",1468),wAn(1465,1,{841:1},hvn),MWn.a=!1,vX(VZn,"ComponentsCompactor/InternalComponent",1465),wAn(1464,1,pVn,Yv),MWn.Jc=function(n){e5(this,n)},MWn.Kc=function(){return new Wb(this.a)},vX(VZn,"ComponentsCompactor/InternalConnectedComponents",1464),wAn(1467,1,{594:1},dOn),MWn.hf=function(){return null},MWn.jf=function(){return this.a},MWn.gf=function(){return upn(this.d)},MWn.kf=function(){return this.b},vX(VZn,"ComponentsCompactor/InternalExternalExtension",1467),wAn(1466,1,{594:1},nm),MWn.jf=function(){return this.a},MWn.gf=function(){return upn(this.d)},MWn.hf=function(){return this.c},MWn.kf=function(){return this.b},vX(VZn,"ComponentsCompactor/InternalUnionExternalExtension",1466),wAn(1470,1,{},Qxn),vX(VZn,"ComponentsCompactor/OuterSegments",1470),wAn(1469,1,{},Jv),vX(VZn,"ComponentsCompactor/Segments",1469),wAn(1264,1,{},bY),vX(VZn,iZn,1264),wAn(1265,1,MYn,xt),MWn.ue=function(n,t){return b0(BB(n,37),BB(t,37))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(VZn,"ComponentsProcessor/lambda$0$Type",1265),wAn(570,325,{325:1,570:1},p5),MWn.mf=function(n){return dsn(this,n)},MWn.nf=function(n){return bNn(this,n)},vX(VZn,"ModelOrderComponentGroup",570),wAn(1291,2005,{},Dt),MWn.lf=function(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j;if(1!=n.gc()){if(n.dc())return t.a.c=x8(Ant,HWn,1,0,5,1),t.f.a=0,void(t.f.b=0);if(GI(mMn(t,(HXn(),Cdt)))===GI((Bfn(),wut))){for(s=n.Kc();s.Ob();){for(p=0,d=new Wb((u=BB(s.Pb(),37)).a);d.a<d.c.c.length;)w=BB(n0(d),10),p+=BB(mMn(w,hpt),19).a;u.p=p}SQ(),n.ad(new Rt)}for(a=BB(n.Xb(0),37),t.a.c=x8(Ant,HWn,1,0,5,1),qan(t,a),b=0,y=0,h=n.Kc();h.Ob();)v=(u=BB(h.Pb(),37)).f,b=e.Math.max(b,v.a),y+=v.a*v.b;for(b=e.Math.max(b,e.Math.sqrt(y)*Gy(MD(mMn(t,Edt)))),k=0,j=0,l=0,i=c=Gy(MD(mMn(t,mpt))),o=n.Kc();o.Ob();)k+(v=(u=BB(o.Pb(),37)).f).a>b&&(k=0,j+=l+c,l=0),ZRn(u,k+(g=u.c).a,j+g.b),kO(g),i=e.Math.max(i,k+v.a),l=e.Math.max(l,v.b),k+=v.a+c;if(t.f.a=i,t.f.b=j+l,qy(TD(mMn(a,Mdt)))){for(KXn(r=new Nt,n,c),f=n.Kc();f.Ob();)UR(kO(BB(f.Pb(),37).c),r.e);UR(kO(t.f),r.a)}d9(t,n)}else(m=BB(n.Xb(0),37))!=t&&(t.a.c=x8(Ant,HWn,1,0,5,1),$Kn(t,m,0,0),qan(t,m),kQ(t.d,m.d),t.f.a=m.f.a,t.f.b=m.f.b)},vX(VZn,"SimpleRowGraphPlacer",1291),wAn(1292,1,MYn,Rt),MWn.ue=function(n,t){return zan(BB(n,37),BB(t,37))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(VZn,"SimpleRowGraphPlacer/1",1292),wAn(1262,1,qYn,Kt),MWn.Lb=function(n){var t;return!!(t=BB(mMn(BB(n,243).b,(HXn(),vgt)),74))&&0!=t.b},MWn.Fb=function(n){return this===n},MWn.Mb=function(n){var t;return!!(t=BB(mMn(BB(n,243).b,(HXn(),vgt)),74))&&0!=t.b},vX(ZZn,"CompoundGraphPostprocessor/1",1262),wAn(1261,1,n1n,em),MWn.pf=function(n,t){mvn(this,BB(n,37),t)},vX(ZZn,"CompoundGraphPreprocessor",1261),wAn(441,1,{441:1},zfn),MWn.c=!1,vX(ZZn,"CompoundGraphPreprocessor/ExternalPort",441),wAn(243,1,{243:1},L_),MWn.Ib=function(){return dx(this.c)+":"+OIn(this.b)},vX(ZZn,"CrossHierarchyEdge",243),wAn(763,1,MYn,_w),MWn.ue=function(n,t){return Vyn(this,BB(n,243),BB(t,243))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(ZZn,"CrossHierarchyEdgeComparator",763),wAn(299,134,{3:1,299:1,94:1,134:1}),MWn.p=0,vX(t1n,"LGraphElement",299),wAn(17,299,{3:1,17:1,299:1,94:1,134:1},wY),MWn.Ib=function(){return OIn(this)};var yut=vX(t1n,"LEdge",17);wAn(37,299,{3:1,20:1,37:1,299:1,94:1,134:1},min),MWn.Jc=function(n){e5(this,n)},MWn.Kc=function(){return new Wb(this.b)},MWn.Ib=function(){return 0==this.b.c.length?"G-unlayered"+LMn(this.a):0==this.a.c.length?"G-layered"+LMn(this.b):"G[layerless"+LMn(this.a)+", layers"+LMn(this.b)+"]"};var kut,jut=vX(t1n,"LGraph",37);wAn(657,1,{}),MWn.qf=function(){return this.e.n},MWn.We=function(n){return mMn(this.e,n)},MWn.rf=function(){return this.e.o},MWn.sf=function(){return this.e.p},MWn.Xe=function(n){return Lx(this.e,n)},MWn.tf=function(n){this.e.n.a=n.a,this.e.n.b=n.b},MWn.uf=function(n){this.e.o.a=n.a,this.e.o.b=n.b},MWn.vf=function(n){this.e.p=n},vX(t1n,"LGraphAdapters/AbstractLShapeAdapter",657),wAn(577,1,{839:1},Fw),MWn.wf=function(){var n,t;if(!this.b)for(this.b=sx(this.a.b.c.length),t=new Wb(this.a.b);t.a<t.c.c.length;)n=BB(n0(t),70),WB(this.b,new Bw(n));return this.b},MWn.b=null,vX(t1n,"LGraphAdapters/LEdgeAdapter",577),wAn(656,1,{},HV),MWn.xf=function(){var n,t,e,i,r;if(!this.b)for(this.b=new Np,e=new Wb(this.a.b);e.a<e.c.c.length;)for(r=new Wb(BB(n0(e),29).a);r.a<r.c.c.length;)if(i=BB(n0(r),10),this.c.Mb(i)&&(WB(this.b,new __(this,i,this.e)),this.d)){if(Lx(i,(hWn(),Klt)))for(t=BB(mMn(i,Klt),15).Kc();t.Ob();)n=BB(t.Pb(),10),WB(this.b,new __(this,n,!1));if(Lx(i,Dft))for(t=BB(mMn(i,Dft),15).Kc();t.Ob();)n=BB(t.Pb(),10),WB(this.b,new __(this,n,!1))}return this.b},MWn.qf=function(){throw Hp(new tk(i1n))},MWn.We=function(n){return mMn(this.a,n)},MWn.rf=function(){return this.a.f},MWn.sf=function(){return this.a.p},MWn.Xe=function(n){return Lx(this.a,n)},MWn.tf=function(n){throw Hp(new tk(i1n))},MWn.uf=function(n){this.a.f.a=n.a,this.a.f.b=n.b},MWn.vf=function(n){this.a.p=n},MWn.b=null,MWn.d=!1,MWn.e=!1,vX(t1n,"LGraphAdapters/LGraphAdapter",656),wAn(576,657,{181:1},Bw),vX(t1n,"LGraphAdapters/LLabelAdapter",576),wAn(575,657,{680:1},__),MWn.yf=function(){return this.b},MWn.zf=function(){return SQ(),SQ(),set},MWn.wf=function(){var n,t;if(!this.a)for(this.a=sx(BB(this.e,10).b.c.length),t=new Wb(BB(this.e,10).b);t.a<t.c.c.length;)n=BB(n0(t),70),WB(this.a,new Bw(n));return this.a},MWn.Af=function(){var n;return new HR((n=BB(this.e,10).d).d,n.c,n.a,n.b)},MWn.Bf=function(){return SQ(),SQ(),set},MWn.Cf=function(){var n,t;if(!this.c)for(this.c=sx(BB(this.e,10).j.c.length),t=new Wb(BB(this.e,10).j);t.a<t.c.c.length;)n=BB(n0(t),11),WB(this.c,new gP(n,this.d));return this.c},MWn.Df=function(){return qy(TD(mMn(BB(this.e,10),(hWn(),_ft))))},MWn.Ef=function(n){BB(this.e,10).d.b=n.b,BB(this.e,10).d.d=n.d,BB(this.e,10).d.c=n.c,BB(this.e,10).d.a=n.a},MWn.Ff=function(n){BB(this.e,10).f.b=n.b,BB(this.e,10).f.d=n.d,BB(this.e,10).f.c=n.c,BB(this.e,10).f.a=n.a},MWn.Gf=function(){Ntn(this,(gM(),kut))},MWn.a=null,MWn.b=null,MWn.c=null,MWn.d=!1,vX(t1n,"LGraphAdapters/LNodeAdapter",575),wAn(1722,657,{838:1},gP),MWn.zf=function(){var n,t,e,i;if(this.d&&BB(this.e,11).i.k==(uSn(),Iut))return SQ(),SQ(),set;if(!this.a){for(this.a=new Np,e=new Wb(BB(this.e,11).e);e.a<e.c.c.length;)n=BB(n0(e),17),WB(this.a,new Fw(n));if(this.d&&(i=BB(mMn(BB(this.e,11),(hWn(),Elt)),10)))for(t=new oz(ZL(fbn(i).a.Kc(),new h));dAn(t);)n=BB(U5(t),17),WB(this.a,new Fw(n))}return this.a},MWn.wf=function(){var n,t;if(!this.b)for(this.b=sx(BB(this.e,11).f.c.length),t=new Wb(BB(this.e,11).f);t.a<t.c.c.length;)n=BB(n0(t),70),WB(this.b,new Bw(n));return this.b},MWn.Bf=function(){var n,t,e,i;if(this.d&&BB(this.e,11).i.k==(uSn(),Iut))return SQ(),SQ(),set;if(!this.c){for(this.c=new Np,e=new Wb(BB(this.e,11).g);e.a<e.c.c.length;)n=BB(n0(e),17),WB(this.c,new Fw(n));if(this.d&&(i=BB(mMn(BB(this.e,11),(hWn(),Elt)),10)))for(t=new oz(ZL(lbn(i).a.Kc(),new h));dAn(t);)n=BB(U5(t),17),WB(this.c,new Fw(n))}return this.c},MWn.Hf=function(){return BB(this.e,11).j},MWn.If=function(){return qy(TD(mMn(BB(this.e,11),(hWn(),elt))))},MWn.a=null,MWn.b=null,MWn.c=null,MWn.d=!1,vX(t1n,"LGraphAdapters/LPortAdapter",1722),wAn(1723,1,MYn,_t),MWn.ue=function(n,t){return WDn(BB(n,11),BB(t,11))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(t1n,"LGraphAdapters/PortComparator",1723),wAn(804,1,DVn,Ft),MWn.Mb=function(n){return BB(n,10),gM(),!0},vX(t1n,"LGraphAdapters/lambda$0$Type",804),wAn(392,299,{3:1,299:1,392:1,94:1,134:1}),vX(t1n,"LShape",392),wAn(70,392,{3:1,299:1,70:1,392:1,94:1,134:1},qj,O$),MWn.Ib=function(){var n;return null==(n=YH(this))?"label":"l_"+n},vX(t1n,"LLabel",70),wAn(207,1,{3:1,4:1,207:1,414:1}),MWn.Fb=function(n){var t;return!!cL(n,207)&&(t=BB(n,207),this.d==t.d&&this.a==t.a&&this.b==t.b&&this.c==t.c)},MWn.Hb=function(){var n,t;return n=VO(this.b)<<16,n|=VO(this.a)&QVn,t=VO(this.c)<<16,n^(t|=VO(this.d)&QVn)},MWn.Jf=function(n){var t,e,i,r,c,a,u,o,s;for(r=0;r<n.length&&Dhn((b1(r,n.length),n.charCodeAt(r)),o1n);)++r;for(t=n.length;t>0&&Dhn((b1(t-1,n.length),n.charCodeAt(t-1)),s1n);)--t;if(r<t){o=kKn(n.substr(r,t-r),",|;");try{for(a=0,u=(c=o).length;a<u;++a){if(2!=(i=kKn(c[a],"=")).length)throw Hp(new _y("Expecting a list of key-value pairs."));e=RMn(i[0]),s=bSn(RMn(i[1])),mK(e,"top")?this.d=s:mK(e,"left")?this.b=s:mK(e,"bottom")?this.a=s:mK(e,"right")&&(this.c=s)}}catch(h){throw cL(h=lun(h),127)?Hp(new _y(h1n+h)):Hp(h)}}},MWn.Ib=function(){return"[top="+this.d+",left="+this.b+",bottom="+this.a+",right="+this.c+"]"},MWn.a=0,MWn.b=0,MWn.c=0,MWn.d=0,vX(f1n,"Spacing",207),wAn(142,207,l1n,lm,lA,HR,A_);var Eut=vX(f1n,"ElkMargin",142);wAn(651,142,l1n,fm),vX(t1n,"LMargin",651),wAn(10,392,{3:1,299:1,10:1,392:1,94:1,134:1},$vn),MWn.Ib=function(){return $pn(this)},MWn.i=!1;var Tut,Mut,Sut,Put,Cut,Iut,Out=vX(t1n,"LNode",10);wAn(267,22,{3:1,35:1,22:1,267:1},JS);var Aut,$ut=Ben(t1n,"LNode/NodeType",267,Unt,u9,I_);wAn(116,207,b1n,bm,WA,O_);var Lut,Nut,xut,Dut,Rut,Kut,_ut=vX(f1n,"ElkPadding",116);wAn(764,116,b1n,wm),vX(t1n,"LPadding",764),wAn(11,392,{3:1,299:1,11:1,392:1,94:1,134:1},CSn),MWn.Ib=function(){var n,t,e;return oO(((n=new Ck).a+="p_",n),pyn(this)),this.i&&oO(uO((n.a+="[",n),this.i),"]"),1==this.e.c.length&&0==this.g.c.length&&BB(xq(this.e,0),17).c!=this&&(t=BB(xq(this.e,0),17).c,oO((n.a+=" << ",n),pyn(t)),oO(uO((n.a+="[",n),t.i),"]")),0==this.e.c.length&&1==this.g.c.length&&BB(xq(this.g,0),17).d!=this&&(e=BB(xq(this.g,0),17).d,oO((n.a+=" >> ",n),pyn(e)),oO(uO((n.a+="[",n),e.i),"]")),n.a},MWn.c=!0,MWn.d=!1;var Fut,But,Hut,qut,Gut=vX(t1n,"LPort",11);wAn(397,1,pVn,Hw),MWn.Jc=function(n){e5(this,n)},MWn.Kc=function(){return new qw(new Wb(this.a.e))},vX(t1n,"LPort/1",397),wAn(1290,1,QWn,qw),MWn.Nb=function(n){fU(this,n)},MWn.Pb=function(){return BB(n0(this.a),17).c},MWn.Ob=function(){return y$(this.a)},MWn.Qb=function(){AU(this.a)},vX(t1n,"LPort/1/1",1290),wAn(359,1,pVn,Gw),MWn.Jc=function(n){e5(this,n)},MWn.Kc=function(){return new zw(new Wb(this.a.g))},vX(t1n,"LPort/2",359),wAn(762,1,QWn,zw),MWn.Nb=function(n){fU(this,n)},MWn.Pb=function(){return BB(n0(this.a),17).d},MWn.Ob=function(){return y$(this.a)},MWn.Qb=function(){AU(this.a)},vX(t1n,"LPort/2/1",762),wAn(1283,1,pVn,hP),MWn.Jc=function(n){e5(this,n)},MWn.Kc=function(){return new m6(this)},vX(t1n,"LPort/CombineIter",1283),wAn(201,1,QWn,m6),MWn.Nb=function(n){fU(this,n)},MWn.Qb=function(){uE()},MWn.Ob=function(){return zN(this)},MWn.Pb=function(){return y$(this.a)?n0(this.a):n0(this.b)},vX(t1n,"LPort/CombineIter/1",201),wAn(1285,1,qYn,Bt),MWn.Lb=function(n){return Az(n)},MWn.Fb=function(n){return this===n},MWn.Mb=function(n){return gcn(),0!=BB(n,11).e.c.length},vX(t1n,"LPort/lambda$0$Type",1285),wAn(1284,1,qYn,Ht),MWn.Lb=function(n){return $z(n)},MWn.Fb=function(n){return this===n},MWn.Mb=function(n){return gcn(),0!=BB(n,11).g.c.length},vX(t1n,"LPort/lambda$1$Type",1284),wAn(1286,1,qYn,qt),MWn.Lb=function(n){return gcn(),BB(n,11).j==(kUn(),sIt)},MWn.Fb=function(n){return this===n},MWn.Mb=function(n){return gcn(),BB(n,11).j==(kUn(),sIt)},vX(t1n,"LPort/lambda$2$Type",1286),wAn(1287,1,qYn,Gt),MWn.Lb=function(n){return gcn(),BB(n,11).j==(kUn(),oIt)},MWn.Fb=function(n){return this===n},MWn.Mb=function(n){return gcn(),BB(n,11).j==(kUn(),oIt)},vX(t1n,"LPort/lambda$3$Type",1287),wAn(1288,1,qYn,zt),MWn.Lb=function(n){return gcn(),BB(n,11).j==(kUn(),SIt)},MWn.Fb=function(n){return this===n},MWn.Mb=function(n){return gcn(),BB(n,11).j==(kUn(),SIt)},vX(t1n,"LPort/lambda$4$Type",1288),wAn(1289,1,qYn,Ut),MWn.Lb=function(n){return gcn(),BB(n,11).j==(kUn(),CIt)},MWn.Fb=function(n){return this===n},MWn.Mb=function(n){return gcn(),BB(n,11).j==(kUn(),CIt)},vX(t1n,"LPort/lambda$5$Type",1289),wAn(29,299,{3:1,20:1,299:1,29:1,94:1,134:1},HX),MWn.Jc=function(n){e5(this,n)},MWn.Kc=function(){return new Wb(this.a)},MWn.Ib=function(){return"L_"+E7(this.b.b,this,0)+LMn(this.a)},vX(t1n,"Layer",29),wAn(1342,1,{},tm),vX(d1n,g1n,1342),wAn(1346,1,{},Xt),MWn.Kb=function(n){return PTn(BB(n,82))},vX(d1n,"ElkGraphImporter/0methodref$connectableShapeToNode$Type",1346),wAn(1349,1,{},Wt),MWn.Kb=function(n){return PTn(BB(n,82))},vX(d1n,"ElkGraphImporter/1methodref$connectableShapeToNode$Type",1349),wAn(1343,1,lVn,Uw),MWn.td=function(n){POn(this.a,BB(n,118))},vX(d1n,p1n,1343),wAn(1344,1,lVn,Xw),MWn.td=function(n){POn(this.a,BB(n,118))},vX(d1n,v1n,1344),wAn(1345,1,{},Vt),MWn.Kb=function(n){return new Rq(null,new w1(pV(BB(n,79)),16))},vX(d1n,m1n,1345),wAn(1347,1,DVn,Ww),MWn.Mb=function(n){return _A(this.a,BB(n,33))},vX(d1n,y1n,1347),wAn(1348,1,{},Qt),MWn.Kb=function(n){return new Rq(null,new w1(vV(BB(n,79)),16))},vX(d1n,"ElkGraphImporter/lambda$5$Type",1348),wAn(1350,1,DVn,Vw),MWn.Mb=function(n){return FA(this.a,BB(n,33))},vX(d1n,"ElkGraphImporter/lambda$7$Type",1350),wAn(1351,1,DVn,Yt),MWn.Mb=function(n){return AQ(BB(n,79))},vX(d1n,"ElkGraphImporter/lambda$8$Type",1351),wAn(1278,1,{},Qh),vX(d1n,"ElkGraphLayoutTransferrer",1278),wAn(1279,1,DVn,Qw),MWn.Mb=function(n){return JR(this.a,BB(n,17))},vX(d1n,"ElkGraphLayoutTransferrer/lambda$0$Type",1279),wAn(1280,1,lVn,Yw),MWn.td=function(n){mM(),WB(this.a,BB(n,17))},vX(d1n,"ElkGraphLayoutTransferrer/lambda$1$Type",1280),wAn(1281,1,DVn,Jw),MWn.Mb=function(n){return UD(this.a,BB(n,17))},vX(d1n,"ElkGraphLayoutTransferrer/lambda$2$Type",1281),wAn(1282,1,lVn,Zw),MWn.td=function(n){mM(),WB(this.a,BB(n,17))},vX(d1n,"ElkGraphLayoutTransferrer/lambda$3$Type",1282),wAn(1485,1,n1n,Jt),MWn.pf=function(n,t){Vrn(BB(n,37),t)},vX(j1n,"CommentNodeMarginCalculator",1485),wAn(1486,1,{},Zt),MWn.Kb=function(n){return new Rq(null,new w1(BB(n,29).a,16))},vX(j1n,"CommentNodeMarginCalculator/lambda$0$Type",1486),wAn(1487,1,lVn,ne),MWn.td=function(n){tHn(BB(n,10))},vX(j1n,"CommentNodeMarginCalculator/lambda$1$Type",1487),wAn(1488,1,n1n,te),MWn.pf=function(n,t){aDn(BB(n,37),t)},vX(j1n,"CommentPostprocessor",1488),wAn(1489,1,n1n,ee),MWn.pf=function(n,t){uUn(BB(n,37),t)},vX(j1n,"CommentPreprocessor",1489),wAn(1490,1,n1n,ie),MWn.pf=function(n,t){jLn(BB(n,37),t)},vX(j1n,"ConstraintsPostprocessor",1490),wAn(1491,1,n1n,re),MWn.pf=function(n,t){can(BB(n,37),t)},vX(j1n,"EdgeAndLayerConstraintEdgeReverser",1491),wAn(1492,1,n1n,ce),MWn.pf=function(n,t){Gwn(BB(n,37),t)},vX(j1n,"EndLabelPostprocessor",1492),wAn(1493,1,{},ae),MWn.Kb=function(n){return new Rq(null,new w1(BB(n,29).a,16))},vX(j1n,"EndLabelPostprocessor/lambda$0$Type",1493),wAn(1494,1,DVn,ue),MWn.Mb=function(n){return MY(BB(n,10))},vX(j1n,"EndLabelPostprocessor/lambda$1$Type",1494),wAn(1495,1,lVn,oe),MWn.td=function(n){ejn(BB(n,10))},vX(j1n,"EndLabelPostprocessor/lambda$2$Type",1495),wAn(1496,1,n1n,se),MWn.pf=function(n,t){ZPn(BB(n,37),t)},vX(j1n,"EndLabelPreprocessor",1496),wAn(1497,1,{},he),MWn.Kb=function(n){return new Rq(null,new w1(BB(n,29).a,16))},vX(j1n,"EndLabelPreprocessor/lambda$0$Type",1497),wAn(1498,1,lVn,D_),MWn.td=function(n){KM(this.a,this.b,this.c,BB(n,10))},MWn.a=0,MWn.b=0,MWn.c=!1,vX(j1n,"EndLabelPreprocessor/lambda$1$Type",1498),wAn(1499,1,DVn,fe),MWn.Mb=function(n){return GI(mMn(BB(n,70),(HXn(),Ydt)))===GI((Rtn(),XPt))},vX(j1n,"EndLabelPreprocessor/lambda$2$Type",1499),wAn(1500,1,lVn,nd),MWn.td=function(n){DH(this.a,BB(n,70))},vX(j1n,"EndLabelPreprocessor/lambda$3$Type",1500),wAn(1501,1,DVn,le),MWn.Mb=function(n){return GI(mMn(BB(n,70),(HXn(),Ydt)))===GI((Rtn(),UPt))},vX(j1n,"EndLabelPreprocessor/lambda$4$Type",1501),wAn(1502,1,lVn,td),MWn.td=function(n){DH(this.a,BB(n,70))},vX(j1n,"EndLabelPreprocessor/lambda$5$Type",1502),wAn(1551,1,n1n,Vh),MWn.pf=function(n,t){Cln(BB(n,37),t)},vX(j1n,"EndLabelSorter",1551),wAn(1552,1,MYn,be),MWn.ue=function(n,t){return Hgn(BB(n,456),BB(t,456))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(j1n,"EndLabelSorter/1",1552),wAn(456,1,{456:1},TQ),vX(j1n,"EndLabelSorter/LabelGroup",456),wAn(1553,1,{},we),MWn.Kb=function(n){return EM(),new Rq(null,new w1(BB(n,29).a,16))},vX(j1n,"EndLabelSorter/lambda$0$Type",1553),wAn(1554,1,DVn,de),MWn.Mb=function(n){return EM(),BB(n,10).k==(uSn(),Cut)},vX(j1n,"EndLabelSorter/lambda$1$Type",1554),wAn(1555,1,lVn,ge),MWn.td=function(n){oSn(BB(n,10))},vX(j1n,"EndLabelSorter/lambda$2$Type",1555),wAn(1556,1,DVn,pe),MWn.Mb=function(n){return EM(),GI(mMn(BB(n,70),(HXn(),Ydt)))===GI((Rtn(),UPt))},vX(j1n,"EndLabelSorter/lambda$3$Type",1556),wAn(1557,1,DVn,ve),MWn.Mb=function(n){return EM(),GI(mMn(BB(n,70),(HXn(),Ydt)))===GI((Rtn(),XPt))},vX(j1n,"EndLabelSorter/lambda$4$Type",1557),wAn(1503,1,n1n,me),MWn.pf=function(n,t){IHn(this,BB(n,37))},MWn.b=0,MWn.c=0,vX(j1n,"FinalSplineBendpointsCalculator",1503),wAn(1504,1,{},ye),MWn.Kb=function(n){return new Rq(null,new w1(BB(n,29).a,16))},vX(j1n,"FinalSplineBendpointsCalculator/lambda$0$Type",1504),wAn(1505,1,{},ke),MWn.Kb=function(n){return new Rq(null,new zU(new oz(ZL(lbn(BB(n,10)).a.Kc(),new h))))},vX(j1n,"FinalSplineBendpointsCalculator/lambda$1$Type",1505),wAn(1506,1,DVn,je),MWn.Mb=function(n){return!b5(BB(n,17))},vX(j1n,"FinalSplineBendpointsCalculator/lambda$2$Type",1506),wAn(1507,1,DVn,Ee),MWn.Mb=function(n){return Lx(BB(n,17),(hWn(),Nlt))},vX(j1n,"FinalSplineBendpointsCalculator/lambda$3$Type",1507),wAn(1508,1,lVn,ed),MWn.td=function(n){zKn(this.a,BB(n,128))},vX(j1n,"FinalSplineBendpointsCalculator/lambda$4$Type",1508),wAn(1509,1,lVn,Te),MWn.td=function(n){JPn(BB(n,17).a)},vX(j1n,"FinalSplineBendpointsCalculator/lambda$5$Type",1509),wAn(792,1,n1n,id),MWn.pf=function(n,t){Vqn(this,BB(n,37),t)},vX(j1n,"GraphTransformer",792),wAn(511,22,{3:1,35:1,22:1,511:1},ZS);var zut,Uut,Xut,Wut=Ben(j1n,"GraphTransformer/Mode",511,Unt,uJ,tB);wAn(1510,1,n1n,Me),MWn.pf=function(n,t){exn(BB(n,37),t)},vX(j1n,"HierarchicalNodeResizingProcessor",1510),wAn(1511,1,n1n,Se),MWn.pf=function(n,t){lrn(BB(n,37),t)},vX(j1n,"HierarchicalPortConstraintProcessor",1511),wAn(1512,1,MYn,Pe),MWn.ue=function(n,t){return Ipn(BB(n,10),BB(t,10))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(j1n,"HierarchicalPortConstraintProcessor/NodeComparator",1512),wAn(1513,1,n1n,Ce),MWn.pf=function(n,t){jBn(BB(n,37),t)},vX(j1n,"HierarchicalPortDummySizeProcessor",1513),wAn(1514,1,n1n,Ie),MWn.pf=function(n,t){JDn(this,BB(n,37),t)},MWn.a=0,vX(j1n,"HierarchicalPortOrthogonalEdgeRouter",1514),wAn(1515,1,MYn,Oe),MWn.ue=function(n,t){return _N(BB(n,10),BB(t,10))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(j1n,"HierarchicalPortOrthogonalEdgeRouter/1",1515),wAn(1516,1,MYn,Ae),MWn.ue=function(n,t){return P9(BB(n,10),BB(t,10))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(j1n,"HierarchicalPortOrthogonalEdgeRouter/2",1516),wAn(1517,1,n1n,$e),MWn.pf=function(n,t){EMn(BB(n,37),t)},vX(j1n,"HierarchicalPortPositionProcessor",1517),wAn(1518,1,n1n,Yh),MWn.pf=function(n,t){rXn(this,BB(n,37))},MWn.a=0,MWn.c=0,vX(j1n,"HighDegreeNodeLayeringProcessor",1518),wAn(571,1,{571:1},Le),MWn.b=-1,MWn.d=-1,vX(j1n,"HighDegreeNodeLayeringProcessor/HighDegreeNodeInformation",571),wAn(1519,1,{},Ne),MWn.Kb=function(n){return q_(),fbn(BB(n,10))},MWn.Fb=function(n){return this===n},vX(j1n,"HighDegreeNodeLayeringProcessor/lambda$0$Type",1519),wAn(1520,1,{},xe),MWn.Kb=function(n){return q_(),lbn(BB(n,10))},MWn.Fb=function(n){return this===n},vX(j1n,"HighDegreeNodeLayeringProcessor/lambda$1$Type",1520),wAn(1526,1,n1n,De),MWn.pf=function(n,t){dFn(this,BB(n,37),t)},vX(j1n,"HyperedgeDummyMerger",1526),wAn(793,1,{},R_),MWn.a=!1,MWn.b=!1,MWn.c=!1,vX(j1n,"HyperedgeDummyMerger/MergeState",793),wAn(1527,1,{},Re),MWn.Kb=function(n){return new Rq(null,new w1(BB(n,29).a,16))},vX(j1n,"HyperedgeDummyMerger/lambda$0$Type",1527),wAn(1528,1,{},Ke),MWn.Kb=function(n){return new Rq(null,new w1(BB(n,10).j,16))},vX(j1n,"HyperedgeDummyMerger/lambda$1$Type",1528),wAn(1529,1,lVn,_e),MWn.td=function(n){BB(n,11).p=-1},vX(j1n,"HyperedgeDummyMerger/lambda$2$Type",1529),wAn(1530,1,n1n,Fe),MWn.pf=function(n,t){bFn(BB(n,37),t)},vX(j1n,"HypernodesProcessor",1530),wAn(1531,1,n1n,Be),MWn.pf=function(n,t){wFn(BB(n,37),t)},vX(j1n,"InLayerConstraintProcessor",1531),wAn(1532,1,n1n,He),MWn.pf=function(n,t){Lcn(BB(n,37),t)},vX(j1n,"InnermostNodeMarginCalculator",1532),wAn(1533,1,n1n,qe),MWn.pf=function(n,t){Vzn(this,BB(n,37))},MWn.a=KQn,MWn.b=KQn,MWn.c=RQn,MWn.d=RQn;var Vut,Qut,Yut,Jut,Zut,not,tot,eot,iot,rot,cot,aot,uot,oot,sot,hot,fot,lot,bot,wot,dot,got,pot,vot,mot,yot,kot,jot,Eot,Tot,Mot,Sot,Pot,Cot,Iot,Oot,Aot,$ot,Lot,Not,xot,Dot,Rot,Kot,_ot,Fot,Bot,Hot,qot,Got,zot,Uot,Xot,Wot,Vot,Qot,Yot,Jot=vX(j1n,"InteractiveExternalPortPositioner",1533);wAn(1534,1,{},Ge),MWn.Kb=function(n){return BB(n,17).d.i},MWn.Fb=function(n){return this===n},vX(j1n,"InteractiveExternalPortPositioner/lambda$0$Type",1534),wAn(1535,1,{},rd),MWn.Kb=function(n){return qN(this.a,MD(n))},MWn.Fb=function(n){return this===n},vX(j1n,"InteractiveExternalPortPositioner/lambda$1$Type",1535),wAn(1536,1,{},ze),MWn.Kb=function(n){return BB(n,17).c.i},MWn.Fb=function(n){return this===n},vX(j1n,"InteractiveExternalPortPositioner/lambda$2$Type",1536),wAn(1537,1,{},cd),MWn.Kb=function(n){return GN(this.a,MD(n))},MWn.Fb=function(n){return this===n},vX(j1n,"InteractiveExternalPortPositioner/lambda$3$Type",1537),wAn(1538,1,{},ad),MWn.Kb=function(n){return WR(this.a,MD(n))},MWn.Fb=function(n){return this===n},vX(j1n,"InteractiveExternalPortPositioner/lambda$4$Type",1538),wAn(1539,1,{},ud),MWn.Kb=function(n){return VR(this.a,MD(n))},MWn.Fb=function(n){return this===n},vX(j1n,"InteractiveExternalPortPositioner/lambda$5$Type",1539),wAn(77,22,{3:1,35:1,22:1,77:1,234:1},nP),MWn.Kf=function(){switch(this.g){case 15:return new dc;case 22:return new gc;case 47:return new mc;case 28:case 35:return new ei;case 32:return new Jt;case 42:return new te;case 1:return new ee;case 41:return new ie;case 56:return new id((Srn(),qut));case 0:return new id((Srn(),Hut));case 2:return new re;case 54:return new ce;case 33:return new se;case 51:return new me;case 55:return new Me;case 13:return new Se;case 38:return new Ce;case 44:return new Ie;case 40:return new $e;case 9:return new Yh;case 49:return new ox;case 37:return new De;case 43:return new Fe;case 27:return new Be;case 30:return new He;case 3:return new qe;case 18:return new Xe;case 29:return new We;case 5:return new Jh;case 50:return new Ue;case 34:return new Zh;case 36:return new ii;case 52:return new Vh;case 11:return new ci;case 7:return new tf;case 39:return new ai;case 45:return new ui;case 16:return new oi;case 10:return new si;case 48:return new fi;case 21:return new li;case 23:return new Ny((oin(),Amt));case 8:return new wi;case 12:return new gi;case 4:return new pi;case 19:return new af;case 17:return new Pi;case 53:return new Ci;case 6:return new Bi;case 25:return new am;case 46:return new Ni;case 31:return new xR;case 14:return new Vi;case 26:return new Sc;case 20:return new nr;case 24:return new Ny((oin(),$mt));default:throw Hp(new _y(M1n+(null!=this.f?this.f:""+this.g)))}};var Zot,nst,tst,est,ist,rst,cst,ast,ust=Ben(j1n,S1n,77,Unt,ENn,nB);wAn(1540,1,n1n,Xe),MWn.pf=function(n,t){Jzn(BB(n,37),t)},vX(j1n,"InvertedPortProcessor",1540),wAn(1541,1,n1n,We),MWn.pf=function(n,t){LKn(BB(n,37),t)},vX(j1n,"LabelAndNodeSizeProcessor",1541),wAn(1542,1,DVn,Ve),MWn.Mb=function(n){return BB(n,10).k==(uSn(),Cut)},vX(j1n,"LabelAndNodeSizeProcessor/lambda$0$Type",1542),wAn(1543,1,DVn,Qe),MWn.Mb=function(n){return BB(n,10).k==(uSn(),Mut)},vX(j1n,"LabelAndNodeSizeProcessor/lambda$1$Type",1543),wAn(1544,1,lVn,K_),MWn.td=function(n){_M(this.b,this.a,this.c,BB(n,10))},MWn.a=!1,MWn.c=!1,vX(j1n,"LabelAndNodeSizeProcessor/lambda$2$Type",1544),wAn(1545,1,n1n,Jh),MWn.pf=function(n,t){fzn(BB(n,37),t)},vX(j1n,"LabelDummyInserter",1545),wAn(1546,1,qYn,Ye),MWn.Lb=function(n){return GI(mMn(BB(n,70),(HXn(),Ydt)))===GI((Rtn(),zPt))},MWn.Fb=function(n){return this===n},MWn.Mb=function(n){return GI(mMn(BB(n,70),(HXn(),Ydt)))===GI((Rtn(),zPt))},vX(j1n,"LabelDummyInserter/1",1546),wAn(1547,1,n1n,Ue),MWn.pf=function(n,t){Pqn(BB(n,37),t)},vX(j1n,"LabelDummyRemover",1547),wAn(1548,1,DVn,Je),MWn.Mb=function(n){return qy(TD(mMn(BB(n,70),(HXn(),Qdt))))},vX(j1n,"LabelDummyRemover/lambda$0$Type",1548),wAn(1359,1,n1n,Zh),MWn.pf=function(n,t){TGn(this,BB(n,37),t)},MWn.a=null,vX(j1n,"LabelDummySwitcher",1359),wAn(286,1,{286:1},cKn),MWn.c=0,MWn.d=null,MWn.f=0,vX(j1n,"LabelDummySwitcher/LabelDummyInfo",286),wAn(1360,1,{},Ze),MWn.Kb=function(n){return Irn(),new Rq(null,new w1(BB(n,29).a,16))},vX(j1n,"LabelDummySwitcher/lambda$0$Type",1360),wAn(1361,1,DVn,ni),MWn.Mb=function(n){return Irn(),BB(n,10).k==(uSn(),Sut)},vX(j1n,"LabelDummySwitcher/lambda$1$Type",1361),wAn(1362,1,{},hd),MWn.Kb=function(n){return XD(this.a,BB(n,10))},vX(j1n,"LabelDummySwitcher/lambda$2$Type",1362),wAn(1363,1,lVn,fd),MWn.td=function(n){YX(this.a,BB(n,286))},vX(j1n,"LabelDummySwitcher/lambda$3$Type",1363),wAn(1364,1,MYn,ti),MWn.ue=function(n,t){return Lz(BB(n,286),BB(t,286))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(j1n,"LabelDummySwitcher/lambda$4$Type",1364),wAn(791,1,n1n,ei),MWn.pf=function(n,t){Y6(BB(n,37),t)},vX(j1n,"LabelManagementProcessor",791),wAn(1549,1,n1n,ii),MWn.pf=function(n,t){Nxn(BB(n,37),t)},vX(j1n,"LabelSideSelector",1549),wAn(1550,1,DVn,ri),MWn.Mb=function(n){return qy(TD(mMn(BB(n,70),(HXn(),Qdt))))},vX(j1n,"LabelSideSelector/lambda$0$Type",1550),wAn(1558,1,n1n,ci),MWn.pf=function(n,t){EBn(BB(n,37),t)},vX(j1n,"LayerConstraintPostprocessor",1558),wAn(1559,1,n1n,tf),MWn.pf=function(n,t){r$n(BB(n,37),t)},vX(j1n,"LayerConstraintPreprocessor",1559),wAn(360,22,{3:1,35:1,22:1,360:1},tP);var ost,sst,hst,fst,lst,bst,wst,dst,gst,pst=Ben(j1n,"LayerConstraintPreprocessor/HiddenNodeConnections",360,Unt,e3,z_);wAn(1560,1,n1n,ai),MWn.pf=function(n,t){Eqn(BB(n,37),t)},vX(j1n,"LayerSizeAndGraphHeightCalculator",1560),wAn(1561,1,n1n,ui),MWn.pf=function(n,t){ALn(BB(n,37),t)},vX(j1n,"LongEdgeJoiner",1561),wAn(1562,1,n1n,oi),MWn.pf=function(n,t){WHn(BB(n,37),t)},vX(j1n,"LongEdgeSplitter",1562),wAn(1563,1,n1n,si),MWn.pf=function(n,t){PGn(this,BB(n,37),t)},MWn.d=0,MWn.e=0,MWn.i=0,MWn.j=0,MWn.k=0,MWn.n=0,vX(j1n,"NodePromotion",1563),wAn(1564,1,{},hi),MWn.Kb=function(n){return BB(n,46),hN(),!0},MWn.Fb=function(n){return this===n},vX(j1n,"NodePromotion/lambda$0$Type",1564),wAn(1565,1,{},od),MWn.Kb=function(n){return aV(this.a,BB(n,46))},MWn.Fb=function(n){return this===n},MWn.a=0,vX(j1n,"NodePromotion/lambda$1$Type",1565),wAn(1566,1,{},sd),MWn.Kb=function(n){return uV(this.a,BB(n,46))},MWn.Fb=function(n){return this===n},MWn.a=0,vX(j1n,"NodePromotion/lambda$2$Type",1566),wAn(1567,1,n1n,fi),MWn.pf=function(n,t){XUn(BB(n,37),t)},vX(j1n,"NorthSouthPortPostprocessor",1567),wAn(1568,1,n1n,li),MWn.pf=function(n,t){MUn(BB(n,37),t)},vX(j1n,"NorthSouthPortPreprocessor",1568),wAn(1569,1,MYn,bi),MWn.ue=function(n,t){return Zan(BB(n,11),BB(t,11))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(j1n,"NorthSouthPortPreprocessor/lambda$0$Type",1569),wAn(1570,1,n1n,wi),MWn.pf=function(n,t){$_n(BB(n,37),t)},vX(j1n,"PartitionMidprocessor",1570),wAn(1571,1,DVn,di),MWn.Mb=function(n){return Lx(BB(n,10),(HXn(),Wgt))},vX(j1n,"PartitionMidprocessor/lambda$0$Type",1571),wAn(1572,1,lVn,ld),MWn.td=function(n){$Q(this.a,BB(n,10))},vX(j1n,"PartitionMidprocessor/lambda$1$Type",1572),wAn(1573,1,n1n,gi),MWn.pf=function(n,t){wNn(BB(n,37),t)},vX(j1n,"PartitionPostprocessor",1573),wAn(1574,1,n1n,pi),MWn.pf=function(n,t){NOn(BB(n,37),t)},vX(j1n,"PartitionPreprocessor",1574),wAn(1575,1,DVn,vi),MWn.Mb=function(n){return Lx(BB(n,10),(HXn(),Wgt))},vX(j1n,"PartitionPreprocessor/lambda$0$Type",1575),wAn(1576,1,{},mi),MWn.Kb=function(n){return new Rq(null,new zU(new oz(ZL(lbn(BB(n,10)).a.Kc(),new h))))},vX(j1n,"PartitionPreprocessor/lambda$1$Type",1576),wAn(1577,1,DVn,yi),MWn.Mb=function(n){return Lgn(BB(n,17))},vX(j1n,"PartitionPreprocessor/lambda$2$Type",1577),wAn(1578,1,lVn,ki),MWn.td=function(n){Run(BB(n,17))},vX(j1n,"PartitionPreprocessor/lambda$3$Type",1578),wAn(1579,1,n1n,af),MWn.pf=function(n,t){u_n(BB(n,37),t)},vX(j1n,"PortListSorter",1579),wAn(1580,1,{},ji),MWn.Kb=function(n){return zsn(),BB(n,11).e},vX(j1n,"PortListSorter/lambda$0$Type",1580),wAn(1581,1,{},Ei),MWn.Kb=function(n){return zsn(),BB(n,11).g},vX(j1n,"PortListSorter/lambda$1$Type",1581),wAn(1582,1,MYn,Ti),MWn.ue=function(n,t){return T4(BB(n,11),BB(t,11))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(j1n,"PortListSorter/lambda$2$Type",1582),wAn(1583,1,MYn,Mi),MWn.ue=function(n,t){return Oyn(BB(n,11),BB(t,11))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(j1n,"PortListSorter/lambda$3$Type",1583),wAn(1584,1,MYn,Si),MWn.ue=function(n,t){return nFn(BB(n,11),BB(t,11))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(j1n,"PortListSorter/lambda$4$Type",1584),wAn(1585,1,n1n,Pi),MWn.pf=function(n,t){WAn(BB(n,37),t)},vX(j1n,"PortSideProcessor",1585),wAn(1586,1,n1n,Ci),MWn.pf=function(n,t){IRn(BB(n,37),t)},vX(j1n,"ReversedEdgeRestorer",1586),wAn(1591,1,n1n,am),MWn.pf=function(n,t){Ymn(this,BB(n,37),t)},vX(j1n,"SelfLoopPortRestorer",1591),wAn(1592,1,{},Ii),MWn.Kb=function(n){return new Rq(null,new w1(BB(n,29).a,16))},vX(j1n,"SelfLoopPortRestorer/lambda$0$Type",1592),wAn(1593,1,DVn,Oi),MWn.Mb=function(n){return BB(n,10).k==(uSn(),Cut)},vX(j1n,"SelfLoopPortRestorer/lambda$1$Type",1593),wAn(1594,1,DVn,Ai),MWn.Mb=function(n){return Lx(BB(n,10),(hWn(),Olt))},vX(j1n,"SelfLoopPortRestorer/lambda$2$Type",1594),wAn(1595,1,{},$i),MWn.Kb=function(n){return BB(mMn(BB(n,10),(hWn(),Olt)),403)},vX(j1n,"SelfLoopPortRestorer/lambda$3$Type",1595),wAn(1596,1,lVn,bd),MWn.td=function(n){SSn(this.a,BB(n,403))},vX(j1n,"SelfLoopPortRestorer/lambda$4$Type",1596),wAn(794,1,lVn,Li),MWn.td=function(n){nPn(BB(n,101))},vX(j1n,"SelfLoopPortRestorer/lambda$5$Type",794),wAn(1597,1,n1n,Ni),MWn.pf=function(n,t){Lpn(BB(n,37),t)},vX(j1n,"SelfLoopPostProcessor",1597),wAn(1598,1,{},xi),MWn.Kb=function(n){return new Rq(null,new w1(BB(n,29).a,16))},vX(j1n,"SelfLoopPostProcessor/lambda$0$Type",1598),wAn(1599,1,DVn,Di),MWn.Mb=function(n){return BB(n,10).k==(uSn(),Cut)},vX(j1n,"SelfLoopPostProcessor/lambda$1$Type",1599),wAn(1600,1,DVn,Ri),MWn.Mb=function(n){return Lx(BB(n,10),(hWn(),Olt))},vX(j1n,"SelfLoopPostProcessor/lambda$2$Type",1600),wAn(1601,1,lVn,Ki),MWn.td=function(n){Ljn(BB(n,10))},vX(j1n,"SelfLoopPostProcessor/lambda$3$Type",1601),wAn(1602,1,{},_i),MWn.Kb=function(n){return new Rq(null,new w1(BB(n,101).f,1))},vX(j1n,"SelfLoopPostProcessor/lambda$4$Type",1602),wAn(1603,1,lVn,wd),MWn.td=function(n){a3(this.a,BB(n,409))},vX(j1n,"SelfLoopPostProcessor/lambda$5$Type",1603),wAn(1604,1,DVn,Fi),MWn.Mb=function(n){return!!BB(n,101).i},vX(j1n,"SelfLoopPostProcessor/lambda$6$Type",1604),wAn(1605,1,lVn,dd),MWn.td=function(n){Ty(this.a,BB(n,101))},vX(j1n,"SelfLoopPostProcessor/lambda$7$Type",1605),wAn(1587,1,n1n,Bi),MWn.pf=function(n,t){Z$n(BB(n,37),t)},vX(j1n,"SelfLoopPreProcessor",1587),wAn(1588,1,{},Hi),MWn.Kb=function(n){return new Rq(null,new w1(BB(n,101).f,1))},vX(j1n,"SelfLoopPreProcessor/lambda$0$Type",1588),wAn(1589,1,{},qi),MWn.Kb=function(n){return BB(n,409).a},vX(j1n,"SelfLoopPreProcessor/lambda$1$Type",1589),wAn(1590,1,lVn,Gi),MWn.td=function(n){q$(BB(n,17))},vX(j1n,"SelfLoopPreProcessor/lambda$2$Type",1590),wAn(1606,1,n1n,xR),MWn.pf=function(n,t){sSn(this,BB(n,37),t)},vX(j1n,"SelfLoopRouter",1606),wAn(1607,1,{},zi),MWn.Kb=function(n){return new Rq(null,new w1(BB(n,29).a,16))},vX(j1n,"SelfLoopRouter/lambda$0$Type",1607),wAn(1608,1,DVn,Ui),MWn.Mb=function(n){return BB(n,10).k==(uSn(),Cut)},vX(j1n,"SelfLoopRouter/lambda$1$Type",1608),wAn(1609,1,DVn,Xi),MWn.Mb=function(n){return Lx(BB(n,10),(hWn(),Olt))},vX(j1n,"SelfLoopRouter/lambda$2$Type",1609),wAn(1610,1,{},Wi),MWn.Kb=function(n){return BB(mMn(BB(n,10),(hWn(),Olt)),403)},vX(j1n,"SelfLoopRouter/lambda$3$Type",1610),wAn(1611,1,lVn,eP),MWn.td=function(n){QV(this.a,this.b,BB(n,403))},vX(j1n,"SelfLoopRouter/lambda$4$Type",1611),wAn(1612,1,n1n,Vi),MWn.pf=function(n,t){fxn(BB(n,37),t)},vX(j1n,"SemiInteractiveCrossMinProcessor",1612),wAn(1613,1,DVn,Qi),MWn.Mb=function(n){return BB(n,10).k==(uSn(),Cut)},vX(j1n,"SemiInteractiveCrossMinProcessor/lambda$0$Type",1613),wAn(1614,1,DVn,Yi),MWn.Mb=function(n){return Gq(BB(n,10))._b((HXn(),spt))},vX(j1n,"SemiInteractiveCrossMinProcessor/lambda$1$Type",1614),wAn(1615,1,MYn,Ji),MWn.ue=function(n,t){return drn(BB(n,10),BB(t,10))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(j1n,"SemiInteractiveCrossMinProcessor/lambda$2$Type",1615),wAn(1616,1,{},Zi),MWn.Ce=function(n,t){return XQ(BB(n,10),BB(t,10))},vX(j1n,"SemiInteractiveCrossMinProcessor/lambda$3$Type",1616),wAn(1618,1,n1n,nr),MWn.pf=function(n,t){MBn(BB(n,37),t)},vX(j1n,"SortByInputModelProcessor",1618),wAn(1619,1,DVn,tr),MWn.Mb=function(n){return 0!=BB(n,11).g.c.length},vX(j1n,"SortByInputModelProcessor/lambda$0$Type",1619),wAn(1620,1,lVn,gd),MWn.td=function(n){fPn(this.a,BB(n,11))},vX(j1n,"SortByInputModelProcessor/lambda$1$Type",1620),wAn(1693,803,{},grn),MWn.Me=function(n){var t,e,i,r;switch(this.c=n,this.a.g){case 2:t=new Np,JT(AV(new Rq(null,new w1(this.c.a.b,16)),new dr),new uP(this,t)),pCn(this,new rr),Otn(t,new cr),t.c=x8(Ant,HWn,1,0,5,1),JT(AV(new Rq(null,new w1(this.c.a.b,16)),new ar),new vd(t)),pCn(this,new ur),Otn(t,new or),t.c=x8(Ant,HWn,1,0,5,1),e=j$(icn(LV(new Rq(null,new w1(this.c.a.b,16)),new md(this))),new sr),JT(new Rq(null,new w1(this.c.a.a,16)),new rP(e,t)),pCn(this,new fr),Otn(t,new er),t.c=x8(Ant,HWn,1,0,5,1);break;case 3:i=new Np,pCn(this,new ir),r=j$(icn(LV(new Rq(null,new w1(this.c.a.b,16)),new pd(this))),new hr),JT(AV(new Rq(null,new w1(this.c.a.b,16)),new lr),new aP(r,i)),pCn(this,new br),Otn(i,new wr),i.c=x8(Ant,HWn,1,0,5,1);break;default:throw Hp(new kv)}},MWn.b=0,vX(A1n,"EdgeAwareScanlineConstraintCalculation",1693),wAn(1694,1,qYn,ir),MWn.Lb=function(n){return cL(BB(n,57).g,145)},MWn.Fb=function(n){return this===n},MWn.Mb=function(n){return cL(BB(n,57).g,145)},vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$0$Type",1694),wAn(1695,1,{},pd),MWn.Fe=function(n){return GCn(this.a,BB(n,57))},vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$1$Type",1695),wAn(1703,1,RVn,iP),MWn.Vd=function(){Fkn(this.a,this.b,-1)},MWn.b=0,vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$10$Type",1703),wAn(1705,1,qYn,rr),MWn.Lb=function(n){return cL(BB(n,57).g,145)},MWn.Fb=function(n){return this===n},MWn.Mb=function(n){return cL(BB(n,57).g,145)},vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$11$Type",1705),wAn(1706,1,lVn,cr),MWn.td=function(n){BB(n,365).Vd()},vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$12$Type",1706),wAn(1707,1,DVn,ar),MWn.Mb=function(n){return cL(BB(n,57).g,10)},vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$13$Type",1707),wAn(1709,1,lVn,vd),MWn.td=function(n){Ebn(this.a,BB(n,57))},vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$14$Type",1709),wAn(1708,1,RVn,lP),MWn.Vd=function(){Fkn(this.b,this.a,-1)},MWn.a=0,vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$15$Type",1708),wAn(1710,1,qYn,ur),MWn.Lb=function(n){return cL(BB(n,57).g,10)},MWn.Fb=function(n){return this===n},MWn.Mb=function(n){return cL(BB(n,57).g,10)},vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$16$Type",1710),wAn(1711,1,lVn,or),MWn.td=function(n){BB(n,365).Vd()},vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$17$Type",1711),wAn(1712,1,{},md),MWn.Fe=function(n){return zCn(this.a,BB(n,57))},vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$18$Type",1712),wAn(1713,1,{},sr),MWn.De=function(){return 0},vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$19$Type",1713),wAn(1696,1,{},hr),MWn.De=function(){return 0},vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$2$Type",1696),wAn(1715,1,lVn,rP),MWn.td=function(n){HG(this.a,this.b,BB(n,307))},MWn.a=0,vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$20$Type",1715),wAn(1714,1,RVn,cP),MWn.Vd=function(){VAn(this.a,this.b,-1)},MWn.b=0,vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$21$Type",1714),wAn(1716,1,qYn,fr),MWn.Lb=function(n){return BB(n,57),!0},MWn.Fb=function(n){return this===n},MWn.Mb=function(n){return BB(n,57),!0},vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$22$Type",1716),wAn(1717,1,lVn,er),MWn.td=function(n){BB(n,365).Vd()},vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$23$Type",1717),wAn(1697,1,DVn,lr),MWn.Mb=function(n){return cL(BB(n,57).g,10)},vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$3$Type",1697),wAn(1699,1,lVn,aP),MWn.td=function(n){qG(this.a,this.b,BB(n,57))},MWn.a=0,vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$4$Type",1699),wAn(1698,1,RVn,bP),MWn.Vd=function(){Fkn(this.b,this.a,-1)},MWn.a=0,vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$5$Type",1698),wAn(1700,1,qYn,br),MWn.Lb=function(n){return BB(n,57),!0},MWn.Fb=function(n){return this===n},MWn.Mb=function(n){return BB(n,57),!0},vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$6$Type",1700),wAn(1701,1,lVn,wr),MWn.td=function(n){BB(n,365).Vd()},vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$7$Type",1701),wAn(1702,1,DVn,dr),MWn.Mb=function(n){return cL(BB(n,57).g,145)},vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$8$Type",1702),wAn(1704,1,lVn,uP),MWn.td=function(n){Ttn(this.a,this.b,BB(n,57))},vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$9$Type",1704),wAn(1521,1,n1n,ox),MWn.pf=function(n,t){cqn(this,BB(n,37),t)},vX(A1n,"HorizontalGraphCompactor",1521),wAn(1522,1,{},yd),MWn.Oe=function(n,t){var e,i;return Z7(n,t)?0:(e=f2(n),i=f2(t),e&&e.k==(uSn(),Mut)||i&&i.k==(uSn(),Mut)?0:UN(BB(mMn(this.a.a,(hWn(),Alt)),304),e?e.k:(uSn(),Put),i?i.k:(uSn(),Put)))},MWn.Pe=function(n,t){var e,i;return Z7(n,t)?1:(e=f2(n),i=f2(t),XN(BB(mMn(this.a.a,(hWn(),Alt)),304),e?e.k:(uSn(),Put),i?i.k:(uSn(),Put)))},vX(A1n,"HorizontalGraphCompactor/1",1522),wAn(1523,1,{},gr),MWn.Ne=function(n,t){return MM(),0==n.a.i},vX(A1n,"HorizontalGraphCompactor/lambda$0$Type",1523),wAn(1524,1,{},kd),MWn.Ne=function(n,t){return _Q(this.a,n,t)},vX(A1n,"HorizontalGraphCompactor/lambda$1$Type",1524),wAn(1664,1,{},I7),vX(A1n,"LGraphToCGraphTransformer",1664),wAn(1672,1,DVn,pr),MWn.Mb=function(n){return null!=n},vX(A1n,"LGraphToCGraphTransformer/0methodref$nonNull$Type",1672),wAn(1665,1,{},vr),MWn.Kb=function(n){return G_(),Bbn(mMn(BB(BB(n,57).g,10),(hWn(),dlt)))},vX(A1n,"LGraphToCGraphTransformer/lambda$0$Type",1665),wAn(1666,1,{},mr),MWn.Kb=function(n){return G_(),mfn(BB(BB(n,57).g,145))},vX(A1n,"LGraphToCGraphTransformer/lambda$1$Type",1666),wAn(1675,1,DVn,yr),MWn.Mb=function(n){return G_(),cL(BB(n,57).g,10)},vX(A1n,"LGraphToCGraphTransformer/lambda$10$Type",1675),wAn(1676,1,lVn,kr),MWn.td=function(n){KQ(BB(n,57))},vX(A1n,"LGraphToCGraphTransformer/lambda$11$Type",1676),wAn(1677,1,DVn,jr),MWn.Mb=function(n){return G_(),cL(BB(n,57).g,145)},vX(A1n,"LGraphToCGraphTransformer/lambda$12$Type",1677),wAn(1681,1,lVn,Er),MWn.td=function(n){vfn(BB(n,57))},vX(A1n,"LGraphToCGraphTransformer/lambda$13$Type",1681),wAn(1678,1,lVn,jd),MWn.td=function(n){uA(this.a,BB(n,8))},MWn.a=0,vX(A1n,"LGraphToCGraphTransformer/lambda$14$Type",1678),wAn(1679,1,lVn,Ed),MWn.td=function(n){sA(this.a,BB(n,110))},MWn.a=0,vX(A1n,"LGraphToCGraphTransformer/lambda$15$Type",1679),wAn(1680,1,lVn,Td),MWn.td=function(n){oA(this.a,BB(n,8))},MWn.a=0,vX(A1n,"LGraphToCGraphTransformer/lambda$16$Type",1680),wAn(1682,1,{},Tr),MWn.Kb=function(n){return G_(),new Rq(null,new zU(new oz(ZL(lbn(BB(n,10)).a.Kc(),new h))))},vX(A1n,"LGraphToCGraphTransformer/lambda$17$Type",1682),wAn(1683,1,DVn,Mr),MWn.Mb=function(n){return G_(),b5(BB(n,17))},vX(A1n,"LGraphToCGraphTransformer/lambda$18$Type",1683),wAn(1684,1,lVn,Md),MWn.td=function(n){Snn(this.a,BB(n,17))},vX(A1n,"LGraphToCGraphTransformer/lambda$19$Type",1684),wAn(1668,1,lVn,Sd),MWn.td=function(n){l0(this.a,BB(n,145))},vX(A1n,"LGraphToCGraphTransformer/lambda$2$Type",1668),wAn(1685,1,{},Sr),MWn.Kb=function(n){return G_(),new Rq(null,new w1(BB(n,29).a,16))},vX(A1n,"LGraphToCGraphTransformer/lambda$20$Type",1685),wAn(1686,1,{},Pr),MWn.Kb=function(n){return G_(),new Rq(null,new zU(new oz(ZL(lbn(BB(n,10)).a.Kc(),new h))))},vX(A1n,"LGraphToCGraphTransformer/lambda$21$Type",1686),wAn(1687,1,{},Cr),MWn.Kb=function(n){return G_(),BB(mMn(BB(n,17),(hWn(),Nlt)),15)},vX(A1n,"LGraphToCGraphTransformer/lambda$22$Type",1687),wAn(1688,1,DVn,Ir),MWn.Mb=function(n){return tx(BB(n,15))},vX(A1n,"LGraphToCGraphTransformer/lambda$23$Type",1688),wAn(1689,1,lVn,Pd),MWn.td=function(n){PCn(this.a,BB(n,15))},vX(A1n,"LGraphToCGraphTransformer/lambda$24$Type",1689),wAn(1667,1,lVn,oP),MWn.td=function(n){H3(this.a,this.b,BB(n,145))},vX(A1n,"LGraphToCGraphTransformer/lambda$3$Type",1667),wAn(1669,1,{},Or),MWn.Kb=function(n){return G_(),new Rq(null,new w1(BB(n,29).a,16))},vX(A1n,"LGraphToCGraphTransformer/lambda$4$Type",1669),wAn(1670,1,{},Ar),MWn.Kb=function(n){return G_(),new Rq(null,new zU(new oz(ZL(lbn(BB(n,10)).a.Kc(),new h))))},vX(A1n,"LGraphToCGraphTransformer/lambda$5$Type",1670),wAn(1671,1,{},$r),MWn.Kb=function(n){return G_(),BB(mMn(BB(n,17),(hWn(),Nlt)),15)},vX(A1n,"LGraphToCGraphTransformer/lambda$6$Type",1671),wAn(1673,1,lVn,Cd),MWn.td=function(n){KIn(this.a,BB(n,15))},vX(A1n,"LGraphToCGraphTransformer/lambda$8$Type",1673),wAn(1674,1,lVn,sP),MWn.td=function(n){x$(this.a,this.b,BB(n,145))},vX(A1n,"LGraphToCGraphTransformer/lambda$9$Type",1674),wAn(1663,1,{},Lr),MWn.Le=function(n){var t,e,i,r,c;for(this.a=n,this.d=new Fv,this.c=x8(qit,HWn,121,this.a.a.a.c.length,0,1),this.b=0,e=new Wb(this.a.a.a);e.a<e.c.c.length;)(t=BB(n0(e),307)).d=this.b,c=AN(oM(new qv,t),this.d),this.c[this.b]=c,++this.b;for(JGn(this),AUn(this),ZLn(this),WKn(B_(this.d),new Xm),r=new Wb(this.a.a.b);r.a<r.c.c.length;)(i=BB(n0(r),57)).d.c=this.c[i.a.d].e+i.b.a},MWn.b=0,vX(A1n,"NetworkSimplexCompaction",1663),wAn(145,1,{35:1,145:1},PBn),MWn.wd=function(n){return Lnn(this,BB(n,145))},MWn.Ib=function(){return mfn(this)},vX(A1n,"VerticalSegment",145),wAn(827,1,{},zEn),MWn.c=0,MWn.e=0,MWn.i=0,vX($1n,"BetweenLayerEdgeTwoNodeCrossingsCounter",827),wAn(663,1,{663:1},kcn),MWn.Ib=function(){return"AdjacencyList [node="+this.d+", adjacencies= "+this.a+"]"},MWn.b=0,MWn.c=0,MWn.f=0,vX($1n,"BetweenLayerEdgeTwoNodeCrossingsCounter/AdjacencyList",663),wAn(287,1,{35:1,287:1},Gx),MWn.wd=function(n){return aq(this,BB(n,287))},MWn.Ib=function(){return"Adjacency [position="+this.c+", cardinality="+this.a+", currentCardinality="+this.b+"]"},MWn.a=0,MWn.b=0,MWn.c=0,vX($1n,"BetweenLayerEdgeTwoNodeCrossingsCounter/AdjacencyList/Adjacency",287),wAn(1929,1,{},ZSn),MWn.b=0,MWn.e=!1,vX($1n,"CrossingMatrixFiller",1929);var vst,mst,yst,kst,jst=bq(L1n,"IInitializable");wAn(1804,1,N1n,vP),MWn.Nf=function(n,t,e,i,r,c){},MWn.Pf=function(n,t,e){},MWn.Lf=function(){return this.c!=(oin(),Amt)},MWn.Mf=function(){this.e=x8(ANt,hQn,25,this.d,15,1)},MWn.Of=function(n,t){t[n][0].c.p=n},MWn.Qf=function(n,t,e,i){++this.d},MWn.Rf=function(){return!0},MWn.Sf=function(n,t,e,i){return Yhn(this,n,t,e),Z4(this,t)},MWn.Tf=function(n,t){var e;return Yhn(this,n,e=hj(t,n.length),t),bon(this,e)},MWn.d=0,vX($1n,"GreedySwitchHeuristic",1804),wAn(1930,1,{},lG),MWn.b=0,MWn.d=0,vX($1n,"NorthSouthEdgeNeighbouringNodeCrossingsCounter",1930),wAn(1917,1,{},uRn),MWn.a=!1,vX($1n,"SwitchDecider",1917),wAn(101,1,{101:1},pPn),MWn.a=null,MWn.c=null,MWn.i=null,vX(x1n,"SelfHyperLoop",101),wAn(1916,1,{},epn),MWn.c=0,MWn.e=0,vX(x1n,"SelfHyperLoopLabels",1916),wAn(411,22,{3:1,35:1,22:1,411:1},mP);var Est,Tst,Mst,Sst,Pst,Cst,Ist=Ben(x1n,"SelfHyperLoopLabels/Alignment",411,Unt,r3,U_);wAn(409,1,{409:1},j6),vX(x1n,"SelfLoopEdge",409),wAn(403,1,{403:1},Ogn),MWn.a=!1,vX(x1n,"SelfLoopHolder",403),wAn(1724,1,DVn,qr),MWn.Mb=function(n){return b5(BB(n,17))},vX(x1n,"SelfLoopHolder/lambda$0$Type",1724),wAn(113,1,{113:1},ipn),MWn.a=!1,MWn.c=!1,vX(x1n,"SelfLoopPort",113),wAn(1792,1,DVn,Gr),MWn.Mb=function(n){return b5(BB(n,17))},vX(x1n,"SelfLoopPort/lambda$0$Type",1792),wAn(363,22,{3:1,35:1,22:1,363:1},yP);var Ost,Ast,$st,Lst,Nst,xst,Dst,Rst,Kst=Ben(x1n,"SelfLoopType",363,Unt,x5,Y_);wAn(1732,1,{},uf),vX(D1n,"PortRestorer",1732),wAn(361,22,{3:1,35:1,22:1,361:1},kP);var _st,Fst,Bst,Hst,qst,Gst,zst,Ust,Xst,Wst=Ben(D1n,"PortRestorer/PortSideArea",361,Unt,P1,J_);wAn(1733,1,{},Wr),MWn.Kb=function(n){return _Mn(),BB(n,15).Oc()},vX(D1n,"PortRestorer/lambda$0$Type",1733),wAn(1734,1,lVn,Vr),MWn.td=function(n){_Mn(),BB(n,113).c=!1},vX(D1n,"PortRestorer/lambda$1$Type",1734),wAn(1743,1,DVn,Qr),MWn.Mb=function(n){return _Mn(),BB(n,11).j==(kUn(),CIt)},vX(D1n,"PortRestorer/lambda$10$Type",1743),wAn(1744,1,{},Yr),MWn.Kb=function(n){return _Mn(),BB(n,113).d},vX(D1n,"PortRestorer/lambda$11$Type",1744),wAn(1745,1,lVn,Id),MWn.td=function(n){Nj(this.a,BB(n,11))},vX(D1n,"PortRestorer/lambda$12$Type",1745),wAn(1735,1,lVn,Od),MWn.td=function(n){Ax(this.a,BB(n,101))},vX(D1n,"PortRestorer/lambda$2$Type",1735),wAn(1736,1,MYn,Jr),MWn.ue=function(n,t){return oen(BB(n,113),BB(t,113))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(D1n,"PortRestorer/lambda$3$Type",1736),wAn(1737,1,DVn,Zr),MWn.Mb=function(n){return _Mn(),BB(n,113).c},vX(D1n,"PortRestorer/lambda$4$Type",1737),wAn(1738,1,DVn,xr),MWn.Mb=function(n){return Acn(BB(n,11))},vX(D1n,"PortRestorer/lambda$5$Type",1738),wAn(1739,1,DVn,Nr),MWn.Mb=function(n){return _Mn(),BB(n,11).j==(kUn(),sIt)},vX(D1n,"PortRestorer/lambda$6$Type",1739),wAn(1740,1,DVn,Dr),MWn.Mb=function(n){return _Mn(),BB(n,11).j==(kUn(),oIt)},vX(D1n,"PortRestorer/lambda$7$Type",1740),wAn(1741,1,DVn,Rr),MWn.Mb=function(n){return c3(BB(n,11))},vX(D1n,"PortRestorer/lambda$8$Type",1741),wAn(1742,1,DVn,Kr),MWn.Mb=function(n){return _Mn(),BB(n,11).j==(kUn(),SIt)},vX(D1n,"PortRestorer/lambda$9$Type",1742),wAn(270,22,{3:1,35:1,22:1,270:1},WV);var Vst,Qst,Yst,Jst,Zst,nht,tht,eht,iht=Ben(D1n,"PortSideAssigner/Target",270,Unt,Ftn,X_);wAn(1725,1,{},_r),MWn.Kb=function(n){return AV(new Rq(null,new w1(BB(n,101).j,16)),new Xr)},vX(D1n,"PortSideAssigner/lambda$1$Type",1725),wAn(1726,1,{},Fr),MWn.Kb=function(n){return BB(n,113).d},vX(D1n,"PortSideAssigner/lambda$2$Type",1726),wAn(1727,1,lVn,Br),MWn.td=function(n){qCn(BB(n,11),(kUn(),sIt))},vX(D1n,"PortSideAssigner/lambda$3$Type",1727),wAn(1728,1,{},Hr),MWn.Kb=function(n){return BB(n,113).d},vX(D1n,"PortSideAssigner/lambda$4$Type",1728),wAn(1729,1,lVn,Ad),MWn.td=function(n){tv(this.a,BB(n,11))},vX(D1n,"PortSideAssigner/lambda$5$Type",1729),wAn(1730,1,MYn,zr),MWn.ue=function(n,t){return MW(BB(n,101),BB(t,101))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(D1n,"PortSideAssigner/lambda$6$Type",1730),wAn(1731,1,MYn,Ur),MWn.ue=function(n,t){return oH(BB(n,113),BB(t,113))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(D1n,"PortSideAssigner/lambda$7$Type",1731),wAn(805,1,DVn,Xr),MWn.Mb=function(n){return BB(n,113).c},vX(D1n,"PortSideAssigner/lambda$8$Type",805),wAn(2009,1,{}),vX(R1n,"AbstractSelfLoopRouter",2009),wAn(1750,1,MYn,nc),MWn.ue=function(n,t){return IK(BB(n,101),BB(t,101))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(R1n,bJn,1750),wAn(1751,1,MYn,tc),MWn.ue=function(n,t){return CK(BB(n,101),BB(t,101))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(R1n,wJn,1751),wAn(1793,2009,{},ec),MWn.Uf=function(n,t,e){return e},vX(R1n,"OrthogonalSelfLoopRouter",1793),wAn(1795,1,lVn,wP),MWn.td=function(n){pgn(this.b,this.a,BB(n,8))},vX(R1n,"OrthogonalSelfLoopRouter/lambda$0$Type",1795),wAn(1794,1793,{},ic),MWn.Uf=function(n,t,e){var i,r;return Kx(e,0,UR(B$((i=n.c.d).n),i.a)),DH(e,UR(B$((r=n.d.d).n),r.a)),E_n(e)},vX(R1n,"PolylineSelfLoopRouter",1794),wAn(1746,1,{},nf),MWn.a=null,vX(R1n,"RoutingDirector",1746),wAn(1747,1,MYn,rc),MWn.ue=function(n,t){return wH(BB(n,113),BB(t,113))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(R1n,"RoutingDirector/lambda$0$Type",1747),wAn(1748,1,{},cc),MWn.Kb=function(n){return SM(),BB(n,101).j},vX(R1n,"RoutingDirector/lambda$1$Type",1748),wAn(1749,1,lVn,ac),MWn.td=function(n){SM(),BB(n,15).ad(Qst)},vX(R1n,"RoutingDirector/lambda$2$Type",1749),wAn(1752,1,{},uc),vX(R1n,"RoutingSlotAssigner",1752),wAn(1753,1,DVn,$d),MWn.Mb=function(n){return CC(this.a,BB(n,101))},vX(R1n,"RoutingSlotAssigner/lambda$0$Type",1753),wAn(1754,1,MYn,Ld),MWn.ue=function(n,t){return Uq(this.a,BB(n,101),BB(t,101))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(R1n,"RoutingSlotAssigner/lambda$1$Type",1754),wAn(1796,1793,{},oc),MWn.Uf=function(n,t,e){var i,r,c,a;return i=Gy(MD(gpn(n.b.g.b,(HXn(),jpt)))),nLn(n,t,e,a=new Ux(Pun(Gk(PMt,1),sVn,8,0,[(c=n.c.d,UR(new wA(c.n),c.a))])),i),DH(a,UR(new wA((r=n.d.d).n),r.a)),Fvn(new oBn(a))},vX(R1n,"SplineSelfLoopRouter",1796),wAn(578,1,MYn,Grn,kH),MWn.ue=function(n,t){return fXn(this,BB(n,10),BB(t,10))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(K1n,"ModelOrderNodeComparator",578),wAn(1755,1,DVn,sc),MWn.Mb=function(n){return 0!=BB(n,11).e.c.length},vX(K1n,"ModelOrderNodeComparator/lambda$0$Type",1755),wAn(1756,1,{},hc),MWn.Kb=function(n){return BB(xq(BB(n,11).e,0),17).c},vX(K1n,"ModelOrderNodeComparator/lambda$1$Type",1756),wAn(1757,1,DVn,fc),MWn.Mb=function(n){return 0!=BB(n,11).e.c.length},vX(K1n,"ModelOrderNodeComparator/lambda$2$Type",1757),wAn(1758,1,{},lc),MWn.Kb=function(n){return BB(xq(BB(n,11).e,0),17).c},vX(K1n,"ModelOrderNodeComparator/lambda$3$Type",1758),wAn(1759,1,DVn,bc),MWn.Mb=function(n){return 0!=BB(n,11).e.c.length},vX(K1n,"ModelOrderNodeComparator/lambda$4$Type",1759),wAn(806,1,MYn,O7,pP),MWn.ue=function(n,t){return Nz(this,n,t)},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(K1n,"ModelOrderPortComparator",806),wAn(801,1,{},wc),MWn.Vf=function(n,t){var i,r,c,a;for(c=PSn(t),i=new Np,a=t.f/c,r=1;r<c;++r)WB(i,iln(dG(fan(e.Math.round(r*a)))));return i},MWn.Wf=function(){return!1},vX(_1n,"ARDCutIndexHeuristic",801),wAn(1479,1,n1n,dc),MWn.pf=function(n,t){oKn(BB(n,37),t)},vX(_1n,"BreakingPointInserter",1479),wAn(305,1,{305:1},v3),MWn.Ib=function(){var n;return(n=new Ck).a+="BPInfo[",n.a+="\n\tstart=",uO(n,this.i),n.a+="\n\tend=",uO(n,this.a),n.a+="\n\tnodeStartEdge=",uO(n,this.e),n.a+="\n\tstartEndEdge=",uO(n,this.j),n.a+="\n\toriginalEdge=",uO(n,this.f),n.a+="\n\tstartInLayerDummy=",uO(n,this.k),n.a+="\n\tstartInLayerEdge=",uO(n,this.n),n.a+="\n\tendInLayerDummy=",uO(n,this.b),n.a+="\n\tendInLayerEdge=",uO(n,this.c),n.a},vX(_1n,"BreakingPointInserter/BPInfo",305),wAn(652,1,{652:1},Hd),MWn.a=!1,MWn.b=0,MWn.c=0,vX(_1n,"BreakingPointInserter/Cut",652),wAn(1480,1,n1n,gc),MWn.pf=function(n,t){mLn(BB(n,37),t)},vX(_1n,"BreakingPointProcessor",1480),wAn(1481,1,DVn,pc),MWn.Mb=function(n){return Jnn(BB(n,10))},vX(_1n,"BreakingPointProcessor/0methodref$isEnd$Type",1481),wAn(1482,1,DVn,vc),MWn.Mb=function(n){return Znn(BB(n,10))},vX(_1n,"BreakingPointProcessor/1methodref$isStart$Type",1482),wAn(1483,1,n1n,mc),MWn.pf=function(n,t){rNn(this,BB(n,37),t)},vX(_1n,"BreakingPointRemover",1483),wAn(1484,1,lVn,yc),MWn.td=function(n){BB(n,128).k=!0},vX(_1n,"BreakingPointRemover/lambda$0$Type",1484),wAn(797,1,{},MAn),MWn.b=0,MWn.e=0,MWn.f=0,MWn.j=0,vX(_1n,"GraphStats",797),wAn(798,1,{},kc),MWn.Ce=function(n,t){return e.Math.max(Gy(MD(n)),Gy(MD(t)))},vX(_1n,"GraphStats/0methodref$max$Type",798),wAn(799,1,{},jc),MWn.Ce=function(n,t){return e.Math.max(Gy(MD(n)),Gy(MD(t)))},vX(_1n,"GraphStats/2methodref$max$Type",799),wAn(1660,1,{},Ec),MWn.Ce=function(n,t){return vB(MD(n),MD(t))},vX(_1n,"GraphStats/lambda$1$Type",1660),wAn(1661,1,{},Nd),MWn.Kb=function(n){return wpn(this.a,BB(n,29))},vX(_1n,"GraphStats/lambda$2$Type",1661),wAn(1662,1,{},xd),MWn.Kb=function(n){return VLn(this.a,BB(n,29))},vX(_1n,"GraphStats/lambda$6$Type",1662),wAn(800,1,{},Tc),MWn.Vf=function(n,t){return BB(mMn(n,(HXn(),_pt)),15)||(SQ(),SQ(),set)},MWn.Wf=function(){return!1},vX(_1n,"ICutIndexCalculator/ManualCutIndexCalculator",800),wAn(802,1,{},Mc),MWn.Vf=function(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k;for(null==t.n&&Dmn(t),k=t.n,null==t.d&&Dmn(t),s=t.d,(y=x8(xNt,qQn,25,k.length,15,1))[0]=k[0],v=k[0],h=1;h<k.length;h++)y[h]=y[h-1]+k[h],v+=k[h];for(c=PSn(t)-1,u=BB(mMn(n,(HXn(),Fpt)),19).a,r=KQn,i=new Np,b=e.Math.max(0,c-u);b<=e.Math.min(t.f-1,c+u);b++){if(g=v/(b+1),p=0,f=1,a=new Np,m=KQn,l=0,o=0,d=s[0],0==b)m=v,null==t.g&&(t.g=Xrn(t,new jc)),o=Gy(t.g);else{for(;f<t.f;)y[f-1]-p>=g&&(WB(a,iln(f)),m=e.Math.max(m,y[f-1]-l),o+=d,p+=y[f-1]-p,l=y[f-1],d=s[f]),d=e.Math.max(d,s[f]),++f;o+=d}(w=e.Math.min(1/m,1/t.b/o))>r&&(r=w,i=a)}return i},MWn.Wf=function(){return!1},vX(_1n,"MSDCutIndexHeuristic",802),wAn(1617,1,n1n,Sc),MWn.pf=function(n,t){bBn(BB(n,37),t)},vX(_1n,"SingleEdgeGraphWrapper",1617),wAn(227,22,{3:1,35:1,22:1,227:1},jP);var rht,cht,aht,uht=Ben(F1n,"CenterEdgeLabelPlacementStrategy",227,Unt,Z8,W_);wAn(422,22,{3:1,35:1,22:1,422:1},EP);var oht,sht,hht,fht,lht=Ben(F1n,"ConstraintCalculationStrategy",422,Unt,GY,V_);wAn(314,22,{3:1,35:1,22:1,314:1,246:1,234:1},TP),MWn.Kf=function(){return sIn(this)},MWn.Xf=function(){return sIn(this)};var bht,wht,dht,ght,pht=Ben(F1n,"CrossingMinimizationStrategy",314,Unt,T1,Q_);wAn(337,22,{3:1,35:1,22:1,337:1},MP);var vht,mht,yht,kht,jht,Eht,Tht=Ben(F1n,"CuttingStrategy",337,Unt,M1,Z_);wAn(335,22,{3:1,35:1,22:1,335:1,246:1,234:1},SP),MWn.Kf=function(){return RAn(this)},MWn.Xf=function(){return RAn(this)};var Mht,Sht,Pht,Cht=Ben(F1n,"CycleBreakingStrategy",335,Unt,L5,nF);wAn(419,22,{3:1,35:1,22:1,419:1},PP);var Iht,Oht,Aht,$ht,Lht=Ben(F1n,"DirectionCongruency",419,Unt,qY,tF);wAn(450,22,{3:1,35:1,22:1,450:1},CP);var Nht,xht,Dht,Rht,Kht,_ht,Fht,Bht=Ben(F1n,"EdgeConstraint",450,Unt,S1,eF);wAn(276,22,{3:1,35:1,22:1,276:1},IP);var Hht,qht,Ght,zht=Ben(F1n,"EdgeLabelSideSelection",276,Unt,i9,iF);wAn(479,22,{3:1,35:1,22:1,479:1},OP);var Uht,Xht,Wht,Vht,Qht,Yht,Jht,Zht=Ben(F1n,"EdgeStraighteningStrategy",479,Unt,HY,rF);wAn(274,22,{3:1,35:1,22:1,274:1},AP);var nft,tft,eft,ift,rft,cft,aft,uft=Ben(F1n,"FixedAlignment",274,Unt,t9,cF);wAn(275,22,{3:1,35:1,22:1,275:1},$P);var oft,sft,hft,fft,lft,bft,wft,dft,gft,pft,vft,mft=Ben(F1n,"GraphCompactionStrategy",275,Unt,n9,aF);wAn(256,22,{3:1,35:1,22:1,256:1},LP);var yft,kft,jft,Eft,Tft=Ben(F1n,"GraphProperties",256,Unt,bcn,uF);wAn(292,22,{3:1,35:1,22:1,292:1},NP);var Mft,Sft,Pft,Cft,Ift=Ben(F1n,"GreedySwitchType",292,Unt,I1,oF);wAn(303,22,{3:1,35:1,22:1,303:1},xP);var Oft,Aft,$ft,Lft=Ben(F1n,"InLayerConstraint",303,Unt,C1,sF);wAn(420,22,{3:1,35:1,22:1,420:1},DP);var Nft,xft,Dft,Rft,Kft,_ft,Fft,Bft,Hft,qft,Gft,zft,Uft,Xft,Wft,Vft,Qft,Yft,Jft,Zft,nlt,tlt,elt,ilt,rlt,clt,alt,ult,olt,slt,hlt,flt,llt,blt,wlt,dlt,glt,plt,vlt,mlt,ylt,klt,jlt,Elt,Tlt,Mlt,Slt,Plt,Clt,Ilt,Olt,Alt,$lt,Llt,Nlt,xlt,Dlt,Rlt,Klt,_lt,Flt,Blt,Hlt,qlt,Glt=Ben(F1n,"InteractiveReferencePoint",420,Unt,zY,hF);wAn(163,22,{3:1,35:1,22:1,163:1},BP);var zlt,Ult,Xlt,Wlt,Vlt,Qlt,Ylt,Jlt,Zlt,nbt,tbt,ebt,ibt,rbt,cbt,abt,ubt,obt,sbt,hbt,fbt,lbt,bbt,wbt,dbt,gbt,pbt,vbt,mbt,ybt,kbt,jbt,Ebt,Tbt,Mbt,Sbt,Pbt,Cbt,Ibt,Obt,Abt,$bt,Lbt,Nbt,xbt,Dbt,Rbt,Kbt,_bt,Fbt,Bbt,Hbt,qbt,Gbt,zbt,Ubt,Xbt,Wbt,Vbt,Qbt,Ybt,Jbt,Zbt,nwt,twt,ewt,iwt,rwt,cwt,awt,uwt,owt,swt,hwt,fwt,lwt,bwt,wwt,dwt,gwt,pwt,vwt,mwt,ywt,kwt,jwt,Ewt,Twt,Mwt,Swt,Pwt,Cwt,Iwt,Owt,Awt,$wt,Lwt,Nwt,xwt,Dwt,Rwt,Kwt,_wt,Fwt,Bwt,Hwt,qwt,Gwt,zwt,Uwt,Xwt,Wwt,Vwt,Qwt,Ywt,Jwt,Zwt,ndt,tdt,edt,idt,rdt,cdt,adt,udt,odt,sdt,hdt,fdt,ldt,bdt,wdt,ddt,gdt,pdt,vdt,mdt,ydt,kdt,jdt,Edt,Tdt,Mdt,Sdt,Pdt,Cdt,Idt,Odt,Adt,$dt,Ldt,Ndt,xdt,Ddt,Rdt,Kdt,_dt,Fdt,Bdt,Hdt,qdt,Gdt,zdt,Udt,Xdt,Wdt,Vdt,Qdt,Ydt,Jdt,Zdt,ngt,tgt,egt,igt,rgt,cgt,agt,ugt,ogt,sgt,hgt,fgt,lgt,bgt,wgt,dgt,ggt,pgt,vgt,mgt,ygt,kgt,jgt,Egt,Tgt,Mgt,Sgt,Pgt,Cgt,Igt,Ogt,Agt,$gt,Lgt,Ngt,xgt,Dgt,Rgt,Kgt,_gt,Fgt,Bgt,Hgt,qgt,Ggt,zgt,Ugt,Xgt,Wgt,Vgt,Qgt,Ygt,Jgt,Zgt,npt,tpt,ept,ipt,rpt,cpt,apt,upt,opt,spt,hpt,fpt,lpt,bpt,wpt,dpt,gpt,ppt,vpt,mpt,ypt,kpt,jpt,Ept,Tpt,Mpt,Spt,Ppt,Cpt,Ipt,Opt,Apt,$pt,Lpt,Npt,xpt,Dpt,Rpt,Kpt,_pt,Fpt,Bpt,Hpt,qpt,Gpt,zpt,Upt,Xpt,Wpt,Vpt,Qpt,Ypt,Jpt,Zpt,nvt,tvt,evt,ivt=Ben(F1n,"LayerConstraint",163,Unt,D5,fF);wAn(848,1,QYn,hf),MWn.Qe=function(n){Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,U1n),""),"Direction Congruency"),"Specifies how drawings of the same graph with different layout directions compare to each other: either a natural reading direction is preserved or the drawings are rotated versions of each other."),Pbt),(PPn(),gMt)),Lht),nbn((rpn(),hMt))))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,X1n),""),"Feedback Edges"),"Whether feedback edges should be highlighted by routing around the nodes."),(hN(),!1)),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,W1n),""),"Interactive Reference Point"),"Determines which point of a node is considered by interactive layout phases."),Qbt),gMt),Glt),nbn(hMt)))),a2(n,W1n,e0n,Jbt),a2(n,W1n,l0n,Ybt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,V1n),""),"Merge Edges"),"Edges that have no ports are merged so they touch the connected nodes at the same points. When this option is disabled, one port is created for each edge directly connected to a node. When it is enabled, all such incoming edges share an input port, and all outgoing edges share an output port."),!1),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,Q1n),""),"Merge Hierarchy-Crossing Edges"),"If hierarchical layout is active, hierarchy-crossing edges use as few hierarchical ports as possible. They are broken by the algorithm, with hierarchical ports inserted as required. Usually, one such port is created for each edge at each hierarchy crossing point. With this option set to true, we try to create as few hierarchical ports as possible in the process. In particular, all edges that form a hyperedge can share a port."),!0),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Pj(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,Y1n),""),"Allow Non-Flow Ports To Switch Sides"),"Specifies whether non-flow ports may switch sides if their node's port constraints are either FIXED_SIDE or FIXED_ORDER. A non-flow port is a port on a side that is not part of the currently configured layout flow. For instance, given a left-to-right layout direction, north and south ports would be considered non-flow ports. Further note that the underlying criterium whether to switch sides or not solely relies on the minimization of edge crossings. Hence, edge length and other aesthetics criteria are not addressed."),!1),wMt),ktt),nbn(fMt)),Pun(Gk(Qtt,1),sVn,2,6,["org.eclipse.elk.layered.northOrSouthPort"])))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,J1n),""),"Port Sorting Strategy"),"Only relevant for nodes with FIXED_SIDE port constraints. Determines the way a node's ports are distributed on the sides of a node if their order is not prescribed. The option is set on parent nodes."),xwt),gMt),zvt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,Z1n),""),"Thoroughness"),"How much effort should be spent to produce a nice layout."),iln(7)),vMt),Att),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,n0n),""),"Add Unnecessary Bendpoints"),"Adds bend points even if an edge does not change direction. If true, each long edge dummy will contribute a bend point to its edges and hierarchy-crossing edges will always get a bend point where they cross hierarchy boundaries. By default, bend points are only added where an edge changes direction."),!1),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,t0n),""),"Generate Position and Layer IDs"),"If enabled position id and layer id are generated, which are usually only used internally when setting the interactiveLayout option. This option should be specified on the root node."),!1),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,e0n),"cycleBreaking"),"Cycle Breaking Strategy"),"Strategy for cycle breaking. Cycle breaking looks for cycles in the graph and determines which edges to reverse to break the cycles. Reversed edges will end up pointing to the opposite direction of regular edges (that is, reversed edges will point left if edges usually point right)."),Mbt),gMt),Cht),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,i0n),f2n),"Node Layering Strategy"),"Strategy for node layering."),bwt),gMt),ovt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,r0n),f2n),"Layer Constraint"),"Determines a constraint on the placement of the node regarding the layering."),iwt),gMt),ivt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,c0n),f2n),"Layer Choice Constraint"),"Allows to set a constraint regarding the layer placement of a node. Let i be the value of teh constraint. Assumed the drawing has n layers and i < n. If set to i, it expresses that the node should be placed in i-th layer. Should i>=n be true then the node is placed in the last layer of the drawing. Note that this option is not part of any of ELK Layered's default configurations but is only evaluated as part of the `InteractiveLayeredGraphVisitor`, which must be applied manually or used via the `DiagramLayoutEngine."),iln(-1)),vMt),Att),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,a0n),f2n),"Layer ID"),"Layer identifier that was calculated by ELK Layered for a node. This is only generated if interactiveLayot or generatePositionAndLayerIds is set."),iln(-1)),vMt),Att),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,u0n),l2n),"Upper Bound On Width [MinWidth Layerer]"),"Defines a loose upper bound on the width of the MinWidth layerer. If set to '-1' multiple values are tested and the best result is selected."),iln(4)),vMt),Att),nbn(hMt)))),a2(n,u0n,i0n,awt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,o0n),l2n),"Upper Layer Estimation Scaling Factor [MinWidth Layerer]"),"Multiplied with Upper Bound On Width for defining an upper bound on the width of layers which haven't been determined yet, but whose maximum width had been (roughly) estimated by the MinWidth algorithm. Compensates for too high estimations. If set to '-1' multiple values are tested and the best result is selected."),iln(2)),vMt),Att),nbn(hMt)))),a2(n,o0n,i0n,owt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,s0n),b2n),"Node Promotion Strategy"),"Reduces number of dummy nodes after layering phase (if possible)."),fwt),gMt),Dvt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,h0n),b2n),"Max Node Promotion Iterations"),"Limits the number of iterations for node promotion."),iln(0)),vMt),Att),nbn(hMt)))),a2(n,h0n,s0n,null),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,f0n),"layering.coffmanGraham"),"Layer Bound"),"The maximum number of nodes allowed per layer."),iln(DWn)),vMt),Att),nbn(hMt)))),a2(n,f0n,i0n,nwt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,l0n),w2n),"Crossing Minimization Strategy"),"Strategy for crossing minimization."),Ebt),gMt),pht),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,b0n),w2n),"Force Node Model Order"),"The node order given by the model does not change to produce a better layout. E.g. if node A is before node B in the model this is not changed during crossing minimization. This assumes that the node model order is already respected before crossing minimization. This can be achieved by setting considerModelOrder.strategy to NODES_AND_EDGES."),!1),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,w0n),w2n),"Hierarchical Sweepiness"),"How likely it is to use cross-hierarchy (1) vs bottom-up (-1)."),.1),dMt),Ptt),nbn(hMt)))),a2(n,w0n,d2n,pbt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,d0n),w2n),"Semi-Interactive Crossing Minimization"),"Preserves the order of nodes within a layer but still minimizes crossings between edges connecting long edge dummies. Derives the desired order from positions specified by the 'org.eclipse.elk.position' layout option. Requires a crossing minimization strategy that is able to process 'in-layer' constraints."),!1),wMt),ktt),nbn(hMt)))),a2(n,d0n,l0n,kbt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,g0n),w2n),"Position Choice Constraint"),"Allows to set a constraint regarding the position placement of a node in a layer. Assumed the layer in which the node placed includes n other nodes and i < n. If set to i, it expresses that the node should be placed at the i-th position. Should i>=n be true then the node is placed at the last position in the layer. Note that this option is not part of any of ELK Layered's default configurations but is only evaluated as part of the `InteractiveLayeredGraphVisitor`, which must be applied manually or used via the `DiagramLayoutEngine."),iln(-1)),vMt),Att),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,p0n),w2n),"Position ID"),"Position within a layer that was determined by ELK Layered for a node. This is only generated if interactiveLayot or generatePositionAndLayerIds is set."),iln(-1)),vMt),Att),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,v0n),g2n),"Greedy Switch Activation Threshold"),"By default it is decided automatically if the greedy switch is activated or not. The decision is based on whether the size of the input graph (without dummy nodes) is smaller than the value of this option. A '0' enforces the activation."),iln(40)),vMt),Att),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,m0n),g2n),"Greedy Switch Crossing Minimization"),"Greedy Switch strategy for crossing minimization. The greedy switch heuristic is executed after the regular crossing minimization as a post-processor. Note that if 'hierarchyHandling' is set to 'INCLUDE_CHILDREN', the 'greedySwitchHierarchical.type' option must be used."),wbt),gMt),Ift),nbn(hMt)))),a2(n,m0n,l0n,dbt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,y0n),"crossingMinimization.greedySwitchHierarchical"),"Greedy Switch Crossing Minimization (hierarchical)"),"Activates the greedy switch heuristic in case hierarchical layout is used. The differences to the non-hierarchical case (see 'greedySwitch.type') are: 1) greedy switch is inactive by default, 3) only the option value set on the node at which hierarchical layout starts is relevant, and 2) if it's activated by the user, it properly addresses hierarchy-crossing edges."),hbt),gMt),Ift),nbn(hMt)))),a2(n,y0n,l0n,fbt),a2(n,y0n,d2n,lbt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,k0n),p2n),"Node Placement Strategy"),"Strategy for node placement."),Lwt),gMt),Avt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,j0n),p2n),"Favor Straight Edges Over Balancing"),"Favor straight edges over a balanced node placement. The default behavior is determined automatically based on the used 'edgeRouting'. For an orthogonal style it is set to true, for all other styles to false."),wMt),ktt),nbn(hMt)))),a2(n,j0n,k0n,Ewt),a2(n,j0n,k0n,Twt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,E0n),v2n),"BK Edge Straightening"),"Specifies whether the Brandes Koepf node placer tries to increase the number of straight edges at the expense of diagram size. There is a subtle difference to the 'favorStraightEdges' option, which decides whether a balanced placement of the nodes is desired, or not. In bk terms this means combining the four alignments into a single balanced one, or not. This option on the other hand tries to straighten additional edges during the creation of each of the four alignments."),pwt),gMt),Zht),nbn(hMt)))),a2(n,E0n,k0n,vwt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,T0n),v2n),"BK Fixed Alignment"),"Tells the BK node placer to use a certain alignment (out of its four) instead of the one producing the smallest height, or the combination of all four."),ywt),gMt),uft),nbn(hMt)))),a2(n,T0n,k0n,kwt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,M0n),"nodePlacement.linearSegments"),"Linear Segments Deflection Dampening"),"Dampens the movement of nodes to keep the diagram from getting too large."),.3),dMt),Ptt),nbn(hMt)))),a2(n,M0n,k0n,Swt),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,S0n),"nodePlacement.networkSimplex"),"Node Flexibility"),"Aims at shorter and straighter edges. Two configurations are possible: (a) allow ports to move freely on the side they are assigned to (the order is always defined beforehand), (b) additionally allow to enlarge a node wherever it helps. If this option is not configured for a node, the 'nodeFlexibility.default' value is used, which is specified for the node's parent."),gMt),kvt),nbn(sMt)))),a2(n,S0n,k0n,Awt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,P0n),"nodePlacement.networkSimplex.nodeFlexibility"),"Node Flexibility Default"),"Default value of the 'nodeFlexibility' option for the children of a hierarchical node."),Iwt),gMt),kvt),nbn(hMt)))),a2(n,P0n,k0n,Owt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,C0n),m2n),"Self-Loop Distribution"),"Alter the distribution of the loops around the node. It only takes effect for PortConstraints.FREE."),xbt),gMt),nmt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,I0n),m2n),"Self-Loop Ordering"),"Alter the ordering of the loops they can either be stacked or sequenced. It only takes effect for PortConstraints.FREE."),Rbt),gMt),cmt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,O0n),"edgeRouting.splines"),"Spline Routing Mode"),"Specifies the way control points are assembled for each individual edge. CONSERVATIVE ensures that edges are properly routed around the nodes but feels rather orthogonal at times. SLOPPY uses fewer control points to obtain curvier edge routes but may result in edges overlapping nodes."),_bt),gMt),hmt),nbn(hMt)))),a2(n,O0n,y2n,Fbt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,A0n),"edgeRouting.splines.sloppy"),"Sloppy Spline Layer Spacing Factor"),"Spacing factor for routing area between layers when using sloppy spline routing."),.2),dMt),Ptt),nbn(hMt)))),a2(n,A0n,y2n,Hbt),a2(n,A0n,O0n,qbt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,$0n),"edgeRouting.polyline"),"Sloped Edge Zone Width"),"Width of the strip to the left and to the right of each layer where the polyline edge router is allowed to refrain from ensuring that edges are routed horizontally. This prevents awkward bend points for nodes that extent almost to the edge of their layer."),2),dMt),Ptt),nbn(hMt)))),a2(n,$0n,y2n,Lbt),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,L0n),k2n),"Spacing Base Value"),"An optional base value for all other layout options of the 'spacing' group. It can be used to conveniently alter the overall 'spaciousness' of the drawing. Whenever an explicit value is set for the other layout options, this base value will have no effect. The base value is not inherited, i.e. it must be set for each hierarchical node."),dMt),Ptt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,N0n),k2n),"Edge Node Between Layers Spacing"),"The spacing to be preserved between nodes and edges that are routed next to the node's layer. For the spacing between nodes and edges that cross the node's layer 'spacing.edgeNode' is used."),10),dMt),Ptt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,x0n),k2n),"Edge Edge Between Layer Spacing"),"Spacing to be preserved between pairs of edges that are routed between the same pair of layers. Note that 'spacing.edgeEdge' is used for the spacing between pairs of edges crossing the same layer."),10),dMt),Ptt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,D0n),k2n),"Node Node Between Layers Spacing"),"The spacing to be preserved between any pair of nodes of two adjacent layers. Note that 'spacing.nodeNode' is used for the spacing between nodes within the layer itself."),20),dMt),Ptt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,R0n),j2n),"Direction Priority"),"Defines how important it is to have a certain edge point into the direction of the overall layout. This option is evaluated during the cycle breaking phase."),iln(0)),vMt),Att),nbn(uMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,K0n),j2n),"Shortness Priority"),"Defines how important it is to keep an edge as short as possible. This option is evaluated during the layering phase."),iln(0)),vMt),Att),nbn(uMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,_0n),j2n),"Straightness Priority"),"Defines how important it is to keep an edge straight, i.e. aligned with one of the two axes. This option is evaluated during node placement."),iln(0)),vMt),Att),nbn(uMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,F0n),E2n),DJn),"Tries to further compact components (disconnected sub-graphs)."),!1),wMt),ktt),nbn(hMt)))),a2(n,F0n,kZn,!0),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,B0n),T2n),"Post Compaction Strategy"),M2n),Ylt),gMt),mft),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,H0n),T2n),"Post Compaction Constraint Calculation"),M2n),Vlt),gMt),lht),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,q0n),S2n),"High Degree Node Treatment"),"Makes room around high degree nodes to place leafs and trees."),!1),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,G0n),S2n),"High Degree Node Threshold"),"Whether a node is considered to have a high degree."),iln(16)),vMt),Att),nbn(hMt)))),a2(n,G0n,q0n,!0),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,z0n),S2n),"High Degree Node Maximum Tree Height"),"Maximum height of a subtree connected to a high degree node to be moved to separate layers."),iln(5)),vMt),Att),nbn(hMt)))),a2(n,z0n,q0n,!0),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,U0n),P2n),"Graph Wrapping Strategy"),"For certain graphs and certain prescribed drawing areas it may be desirable to split the laid out graph into chunks that are placed side by side. The edges that connect different chunks are 'wrapped' around from the end of one chunk to the start of the other chunk. The points between the chunks are referred to as 'cuts'."),bdt),gMt),Smt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,X0n),P2n),"Additional Wrapped Edges Spacing"),"To visually separate edges that are wrapped from regularly routed edges an additional spacing value can be specified in form of this layout option. The spacing is added to the regular edgeNode spacing."),10),dMt),Ptt),nbn(hMt)))),a2(n,X0n,U0n,Uwt),a2(n,X0n,U0n,Xwt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,W0n),P2n),"Correction Factor for Wrapping"),"At times and for certain types of graphs the executed wrapping may produce results that are consistently biased in the same fashion: either wrapping to often or to rarely. This factor can be used to correct the bias. Internally, it is simply multiplied with the 'aspect ratio' layout option."),1),dMt),Ptt),nbn(hMt)))),a2(n,W0n,U0n,Vwt),a2(n,W0n,U0n,Qwt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,V0n),C2n),"Cutting Strategy"),"The strategy by which the layer indexes are determined at which the layering crumbles into chunks."),idt),gMt),Tht),nbn(hMt)))),a2(n,V0n,U0n,rdt),a2(n,V0n,U0n,cdt),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,Q0n),C2n),"Manually Specified Cuts"),"Allows the user to specify her own cuts for a certain graph."),mMt),Rnt),nbn(hMt)))),a2(n,Q0n,V0n,Jwt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,Y0n),"wrapping.cutting.msd"),"MSD Freedom"),"The MSD cutting strategy starts with an initial guess on the number of chunks the graph should be split into. The freedom specifies how much the strategy may deviate from this guess. E.g. if an initial number of 3 is computed, a freedom of 1 allows 2, 3, and 4 cuts."),ndt),vMt),Att),nbn(hMt)))),a2(n,Y0n,V0n,tdt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,J0n),I2n),"Validification Strategy"),"When wrapping graphs, one can specify indices that are not allowed as split points. The validification strategy makes sure every computed split point is allowed."),vdt),gMt),dmt),nbn(hMt)))),a2(n,J0n,U0n,mdt),a2(n,J0n,U0n,ydt),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,Z0n),I2n),"Valid Indices for Wrapping"),null),mMt),Rnt),nbn(hMt)))),a2(n,Z0n,U0n,ddt),a2(n,Z0n,U0n,gdt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,n2n),O2n),"Improve Cuts"),"For general graphs it is important that not too many edges wrap backwards. Thus a compromise between evenly-distributed cuts and the total number of cut edges is sought."),!0),wMt),ktt),nbn(hMt)))),a2(n,n2n,U0n,sdt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,t2n),O2n),"Distance Penalty When Improving Cuts"),null),2),dMt),Ptt),nbn(hMt)))),a2(n,t2n,U0n,udt),a2(n,t2n,n2n,!0),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,e2n),O2n),"Improve Wrapped Edges"),"The initial wrapping is performed in a very simple way. As a consequence, edges that wrap from one chunk to another may be unnecessarily long. Activating this option tries to shorten such edges."),!0),wMt),ktt),nbn(hMt)))),a2(n,e2n,U0n,fdt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,i2n),A2n),"Edge Label Side Selection"),"Method to decide on edge label sides."),Abt),gMt),zht),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,r2n),A2n),"Edge Center Label Placement Strategy"),"Determines in which layer center labels of long edges should be placed."),Ibt),gMt),uht),EG(hMt,Pun(Gk(jMt,1),$Vn,175,0,[oMt]))))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,c2n),$2n),"Consider Model Order"),"Preserves the order of nodes and edges in the model file if this does not lead to additional edge crossings. Depending on the strategy this is not always possible since the node and edge order might be conflicting."),abt),gMt),Fvt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,a2n),$2n),"No Model Order"),"Set on a node to not set a model order for this node even though it is a real node."),!1),wMt),ktt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,u2n),$2n),"Consider Model Order for Components"),"If set to NONE the usual ordering strategy (by cumulative node priority and size of nodes) is used. INSIDE_PORT_SIDES orders the components with external ports only inside the groups with the same port side. FORCE_MODEL_ORDER enforces the mode order on components. This option might produce bad alignments and sub optimal drawings in terms of used area since the ordering should be respected."),Zlt),gMt),mut),nbn(hMt)))),a2(n,u2n,kZn,null),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,o2n),$2n),"Long Edge Ordering Strategy"),"Indicates whether long edges are sorted under, over, or equal to nodes that have no connection to a previous layer in a left-to-right or right-to-left layout. Under and over changes to right and left in a vertical layout."),ibt),gMt),wvt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,s2n),$2n),"Crossing Counter Node Order Influence"),"Indicates with what percentage (1 for 100%) violations of the node model order are weighted against the crossings e.g. a value of 0.5 means two model order violations are as important as on edge crossing. This allows some edge crossings in favor of preserving the model order. It is advised to set this value to a very small positive value (e.g. 0.001) to have minimal crossing and a optimal node order. Defaults to no influence (0)."),0),dMt),Ptt),nbn(hMt)))),a2(n,s2n,c2n,null),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,h2n),$2n),"Crossing Counter Port Order Influence"),"Indicates with what percentage (1 for 100%) violations of the port model order are weighted against the crossings e.g. a value of 0.5 means two model order violations are as important as on edge crossing. This allows some edge crossings in favor of preserving the model order. It is advised to set this value to a very small positive value (e.g. 0.001) to have minimal crossing and a optimal port order. Defaults to no influence (0)."),0),dMt),Ptt),nbn(hMt)))),a2(n,h2n,c2n,null),vWn((new bf,n))},vX(F1n,"LayeredMetaDataProvider",848),wAn(986,1,QYn,bf),MWn.Qe=function(n){vWn(n)},vX(F1n,"LayeredOptions",986),wAn(987,1,{},Cc),MWn.$e=function(){return new Uv},MWn._e=function(n){},vX(F1n,"LayeredOptions/LayeredFactory",987),wAn(1372,1,{}),MWn.a=0,vX(y3n,"ElkSpacings/AbstractSpacingsBuilder",1372),wAn(779,1372,{},uwn),vX(F1n,"LayeredSpacings/LayeredSpacingsBuilder",779),wAn(313,22,{3:1,35:1,22:1,313:1,246:1,234:1},RP),MWn.Kf=function(){return rLn(this)},MWn.Xf=function(){return rLn(this)};var rvt,cvt,avt,uvt,ovt=Ben(F1n,"LayeringStrategy",313,Unt,e9,lF);wAn(378,22,{3:1,35:1,22:1,378:1},KP);var svt,hvt,fvt,lvt,bvt,wvt=Ben(F1n,"LongEdgeOrderingStrategy",378,Unt,E1,bF);wAn(197,22,{3:1,35:1,22:1,197:1},_P);var dvt,gvt,pvt,vvt,mvt,yvt,kvt=Ben(F1n,"NodeFlexibility",197,Unt,k3,wF);wAn(315,22,{3:1,35:1,22:1,315:1,246:1,234:1},FP),MWn.Kf=function(){return DAn(this)},MWn.Xf=function(){return DAn(this)};var jvt,Evt,Tvt,Mvt,Svt,Pvt,Cvt,Ivt,Ovt,Avt=Ben(F1n,"NodePlacementStrategy",315,Unt,$5,yF);wAn(260,22,{3:1,35:1,22:1,260:1},HP);var $vt,Lvt,Nvt,xvt,Dvt=Ben(F1n,"NodePromotionStrategy",260,Unt,Btn,gF);wAn(339,22,{3:1,35:1,22:1,339:1},qP);var Rvt,Kvt,_vt,Fvt=Ben(F1n,"OrderingStrategy",339,Unt,A1,pF);wAn(421,22,{3:1,35:1,22:1,421:1},GP);var Bvt,Hvt,qvt,Gvt,zvt=Ben(F1n,"PortSortingStrategy",421,Unt,UY,vF);wAn(452,22,{3:1,35:1,22:1,452:1},zP);var Uvt,Xvt,Wvt,Vvt,Qvt=Ben(F1n,"PortType",452,Unt,O1,dF);wAn(375,22,{3:1,35:1,22:1,375:1},UP);var Yvt,Jvt,Zvt,nmt=Ben(F1n,"SelfLoopDistributionStrategy",375,Unt,$1,mF);wAn(376,22,{3:1,35:1,22:1,376:1},XP);var tmt,emt,imt,rmt,cmt=Ben(F1n,"SelfLoopOrderingStrategy",376,Unt,BY,kF);wAn(304,1,{304:1},sGn),vX(F1n,"Spacings",304),wAn(336,22,{3:1,35:1,22:1,336:1},WP);var amt,umt,omt,smt,hmt=Ben(F1n,"SplineRoutingMode",336,Unt,N1,jF);wAn(338,22,{3:1,35:1,22:1,338:1},VP);var fmt,lmt,bmt,wmt,dmt=Ben(F1n,"ValidifyStrategy",338,Unt,x1,EF);wAn(377,22,{3:1,35:1,22:1,377:1},QP);var gmt,pmt,vmt,mmt,ymt,kmt,jmt,Emt,Tmt,Mmt,Smt=Ben(F1n,"WrappingStrategy",377,Unt,L1,TF);wAn(1383,1,E3n,wf),MWn.Yf=function(n){return BB(n,37),pmt},MWn.pf=function(n,t){JHn(this,BB(n,37),t)},vX(T3n,"DepthFirstCycleBreaker",1383),wAn(782,1,E3n,KG),MWn.Yf=function(n){return BB(n,37),vmt},MWn.pf=function(n,t){UXn(this,BB(n,37),t)},MWn.Zf=function(n){return BB(xq(n,pvn(this.d,n.c.length)),10)},vX(T3n,"GreedyCycleBreaker",782),wAn(1386,782,E3n,TI),MWn.Zf=function(n){var t,e,i,r;for(r=null,t=DWn,i=new Wb(n);i.a<i.c.c.length;)Lx(e=BB(n0(i),10),(hWn(),wlt))&&BB(mMn(e,wlt),19).a<t&&(t=BB(mMn(e,wlt),19).a,r=e);return r||BB(xq(n,pvn(this.d,n.c.length)),10)},vX(T3n,"GreedyModelOrderCycleBreaker",1386),wAn(1384,1,E3n,rf),MWn.Yf=function(n){return BB(n,37),mmt},MWn.pf=function(n,t){Iqn(this,BB(n,37),t)},vX(T3n,"InteractiveCycleBreaker",1384),wAn(1385,1,E3n,cf),MWn.Yf=function(n){return BB(n,37),ymt},MWn.pf=function(n,t){Lqn(this,BB(n,37),t)},MWn.a=0,MWn.b=0,vX(T3n,"ModelOrderCycleBreaker",1385),wAn(1389,1,E3n,$M),MWn.Yf=function(n){return BB(n,37),kmt},MWn.pf=function(n,t){JXn(this,BB(n,37),t)},vX(M3n,"CoffmanGrahamLayerer",1389),wAn(1390,1,MYn,Dd),MWn.ue=function(n,t){return BIn(this.a,BB(n,10),BB(t,10))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(M3n,"CoffmanGrahamLayerer/0methodref$compareNodesInTopo$Type",1390),wAn(1391,1,MYn,Rd),MWn.ue=function(n,t){return zG(this.a,BB(n,10),BB(t,10))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(M3n,"CoffmanGrahamLayerer/lambda$1$Type",1391),wAn(1392,1,E3n,Ic),MWn.Yf=function(n){return BB(n,37),dq(dq(dq(new B2,(yMn(),Rat),(lWn(),kot)),Kat,Oot),_at,Iot)},MWn.pf=function(n,t){EUn(this,BB(n,37),t)},vX(M3n,"InteractiveLayerer",1392),wAn(569,1,{569:1},im),MWn.a=0,MWn.c=0,vX(M3n,"InteractiveLayerer/LayerSpan",569),wAn(1388,1,E3n,ef),MWn.Yf=function(n){return BB(n,37),jmt},MWn.pf=function(n,t){qxn(this,BB(n,37),t)},vX(M3n,"LongestPathLayerer",1388),wAn(1395,1,E3n,sf),MWn.Yf=function(n){return BB(n,37),dq(dq(dq(new B2,(yMn(),Rat),(lWn(),cot)),Kat,Oot),_at,Iot)},MWn.pf=function(n,t){iXn(this,BB(n,37),t)},MWn.a=0,MWn.b=0,MWn.d=0,vX(M3n,"MinWidthLayerer",1395),wAn(1396,1,MYn,Kd),MWn.ue=function(n,t){return dan(this,BB(n,10),BB(t,10))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(M3n,"MinWidthLayerer/MinOutgoingEdgesComparator",1396),wAn(1387,1,E3n,of),MWn.Yf=function(n){return BB(n,37),Mmt},MWn.pf=function(n,t){mGn(this,BB(n,37),t)},vX(M3n,"NetworkSimplexLayerer",1387),wAn(1393,1,E3n,RR),MWn.Yf=function(n){return BB(n,37),dq(dq(dq(new B2,(yMn(),Rat),(lWn(),cot)),Kat,Oot),_at,Iot)},MWn.pf=function(n,t){$zn(this,BB(n,37),t)},MWn.d=0,MWn.f=0,MWn.g=0,MWn.i=0,MWn.s=0,MWn.t=0,MWn.u=0,vX(M3n,"StretchWidthLayerer",1393),wAn(1394,1,MYn,Oc),MWn.ue=function(n,t){return R6(BB(n,10),BB(t,10))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(M3n,"StretchWidthLayerer/1",1394),wAn(402,1,S3n),MWn.Nf=function(n,t,e,i,r,c){},MWn._f=function(n,t,e){return r_n(this,n,t,e)},MWn.Mf=function(){this.g=x8(DNt,P3n,25,this.d,15,1),this.f=x8(DNt,P3n,25,this.d,15,1)},MWn.Of=function(n,t){this.e[n]=x8(ANt,hQn,25,t[n].length,15,1)},MWn.Pf=function(n,t,e){e[n][t].p=t,this.e[n][t]=t},MWn.Qf=function(n,t,e,i){BB(xq(i[n][t].j,e),11).p=this.d++},MWn.b=0,MWn.c=0,MWn.d=0,vX(C3n,"AbstractBarycenterPortDistributor",402),wAn(1633,1,MYn,_d),MWn.ue=function(n,t){return qgn(this.a,BB(n,11),BB(t,11))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(C3n,"AbstractBarycenterPortDistributor/lambda$0$Type",1633),wAn(817,1,N1n,G2),MWn.Nf=function(n,t,e,i,r,c){},MWn.Pf=function(n,t,e){},MWn.Qf=function(n,t,e,i){},MWn.Lf=function(){return!1},MWn.Mf=function(){this.c=this.e.a,this.g=this.f.g},MWn.Of=function(n,t){t[n][0].c.p=n},MWn.Rf=function(){return!1},MWn.ag=function(n,t,e,i){e?sjn(this,n):(Djn(this,n,i),ZGn(this,n,t)),n.c.length>1&&(qy(TD(mMn(vW((l1(0,n.c.length),BB(n.c[0],10))),(HXn(),xdt))))?R$n(n,this.d,BB(this,660)):(SQ(),m$(n,this.d)),Ban(this.e,n))},MWn.Sf=function(n,t,e,i){var r,c,a,u,o,s,h;for(t!=Jq(e,n.length)&&(c=n[t-(e?1:-1)],G6(this.f,c,e?(ain(),qvt):(ain(),Hvt))),r=n[t][0],h=!i||r.k==(uSn(),Mut),s=u6(n[t]),this.ag(s,h,!1,e),a=0,o=new Wb(s);o.a<o.c.c.length;)u=BB(n0(o),10),n[t][a++]=u;return!1},MWn.Tf=function(n,t){var e,i,r,c,a;for(c=u6(n[a=Jq(t,n.length)]),this.ag(c,!1,!0,t),e=0,r=new Wb(c);r.a<r.c.c.length;)i=BB(n0(r),10),n[a][e++]=i;return!1},vX(C3n,"BarycenterHeuristic",817),wAn(658,1,{658:1},Bd),MWn.Ib=function(){return"BarycenterState [node="+this.c+", summedWeight="+this.d+", degree="+this.b+", barycenter="+this.a+", visited="+this.e+"]"},MWn.b=0,MWn.d=0,MWn.e=!1;var Pmt=vX(C3n,"BarycenterHeuristic/BarycenterState",658);wAn(1802,1,MYn,Fd),MWn.ue=function(n,t){return MEn(this.a,BB(n,10),BB(t,10))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(C3n,"BarycenterHeuristic/lambda$0$Type",1802),wAn(816,1,N1n,UEn),MWn.Mf=function(){},MWn.Nf=function(n,t,e,i,r,c){},MWn.Qf=function(n,t,e,i){},MWn.Of=function(n,t){this.a[n]=x8(Pmt,{3:1,4:1,5:1,2018:1},658,t[n].length,0,1),this.b[n]=x8(Lmt,{3:1,4:1,5:1,2019:1},233,t[n].length,0,1)},MWn.Pf=function(n,t,e){Dgn(this,e[n][t],!0)},MWn.c=!1,vX(C3n,"ForsterConstraintResolver",816),wAn(233,1,{233:1},DY,uGn),MWn.Ib=function(){var n,t;for((t=new Ck).a+="[",n=0;n<this.d.length;n++)oO(t,$pn(this.d[n])),null!=lL(this.g,this.d[0]).a&&oO(oO((t.a+="<",t),ZI(lL(this.g,this.d[0]).a)),">"),n<this.d.length-1&&(t.a+=FWn);return(t.a+="]",t).a},MWn.a=0,MWn.c=0,MWn.f=0;var Cmt,Imt,Omt,Amt,$mt,Lmt=vX(C3n,"ForsterConstraintResolver/ConstraintGroup",233);wAn(1797,1,lVn,qd),MWn.td=function(n){Dgn(this.a,BB(n,10),!1)},vX(C3n,"ForsterConstraintResolver/lambda$0$Type",1797),wAn(214,1,{214:1,225:1},CGn),MWn.Nf=function(n,t,e,i,r,c){},MWn.Of=function(n,t){},MWn.Mf=function(){this.r=x8(ANt,hQn,25,this.n,15,1)},MWn.Pf=function(n,t,e){var i;(i=e[n][t].e)&&WB(this.b,i)},MWn.Qf=function(n,t,e,i){++this.n},MWn.Ib=function(){return izn(this.e,new Rv)},MWn.g=!1,MWn.i=!1,MWn.n=0,MWn.s=!1,vX(C3n,"GraphInfoHolder",214),wAn(1832,1,N1n,Pc),MWn.Nf=function(n,t,e,i,r,c){},MWn.Of=function(n,t){},MWn.Qf=function(n,t,e,i){},MWn._f=function(n,t,e){return e&&t>0?uZ(this.a,n[t-1],n[t]):!e&&t<n.length-1?uZ(this.a,n[t],n[t+1]):yrn(this.a,n[t],e?(kUn(),CIt):(kUn(),oIt)),bLn(this,n,t,e)},MWn.Mf=function(){this.d=x8(ANt,hQn,25,this.c,15,1),this.a=new QK(this.d)},MWn.Pf=function(n,t,e){var i;i=e[n][t],this.c+=i.j.c.length},MWn.c=0,vX(C3n,"GreedyPortDistributor",1832),wAn(1401,1,E3n,df),MWn.Yf=function(n){return Xhn(BB(n,37))},MWn.pf=function(n,t){XGn(BB(n,37),t)},vX(C3n,"InteractiveCrossingMinimizer",1401),wAn(1402,1,MYn,Gd),MWn.ue=function(n,t){return Hjn(this,BB(n,10),BB(t,10))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(C3n,"InteractiveCrossingMinimizer/1",1402),wAn(507,1,{507:1,123:1,51:1},Ny),MWn.Yf=function(n){var t;return BB(n,37),dq(t=kA(Imt),(yMn(),_at),(lWn(),Bot)),t},MWn.pf=function(n,t){P_n(this,BB(n,37),t)},MWn.e=0,vX(C3n,"LayerSweepCrossingMinimizer",507),wAn(1398,1,lVn,zd),MWn.td=function(n){wBn(this.a,BB(n,214))},vX(C3n,"LayerSweepCrossingMinimizer/0methodref$compareDifferentRandomizedLayouts$Type",1398),wAn(1399,1,lVn,Ud),MWn.td=function(n){Ohn(this.a,BB(n,214))},vX(C3n,"LayerSweepCrossingMinimizer/1methodref$minimizeCrossingsNoCounter$Type",1399),wAn(1400,1,lVn,Xd),MWn.td=function(n){pFn(this.a,BB(n,214))},vX(C3n,"LayerSweepCrossingMinimizer/2methodref$minimizeCrossingsWithCounter$Type",1400),wAn(454,22,{3:1,35:1,22:1,454:1},YP);var Nmt,xmt=Ben(C3n,"LayerSweepCrossingMinimizer/CrossMinType",454,Unt,D1,MF);wAn(1397,1,DVn,Ac),MWn.Mb=function(n){return _cn(),0==BB(n,29).a.c.length},vX(C3n,"LayerSweepCrossingMinimizer/lambda$0$Type",1397),wAn(1799,1,N1n,aZ),MWn.Mf=function(){},MWn.Nf=function(n,t,e,i,r,c){},MWn.Qf=function(n,t,e,i){},MWn.Of=function(n,t){t[n][0].c.p=n,this.b[n]=x8(_mt,{3:1,4:1,5:1,1944:1},659,t[n].length,0,1)},MWn.Pf=function(n,t,e){e[n][t].p=t,$X(this.b[n],t,new $c)},vX(C3n,"LayerSweepTypeDecider",1799),wAn(659,1,{659:1},$c),MWn.Ib=function(){return"NodeInfo [connectedEdges="+this.a+", hierarchicalInfluence="+this.b+", randomInfluence="+this.c+"]"},MWn.a=0,MWn.b=0,MWn.c=0;var Dmt,Rmt,Kmt,_mt=vX(C3n,"LayerSweepTypeDecider/NodeInfo",659);wAn(1800,1,qYn,Lc),MWn.Lb=function(n){return zN(new m6(BB(n,11).b))},MWn.Fb=function(n){return this===n},MWn.Mb=function(n){return zN(new m6(BB(n,11).b))},vX(C3n,"LayerSweepTypeDecider/lambda$0$Type",1800),wAn(1801,1,qYn,Nc),MWn.Lb=function(n){return zN(new m6(BB(n,11).b))},MWn.Fb=function(n){return this===n},MWn.Mb=function(n){return zN(new m6(BB(n,11).b))},vX(C3n,"LayerSweepTypeDecider/lambda$1$Type",1801),wAn(1833,402,S3n,Dj),MWn.$f=function(n,t,e){var i,r,c,a,u,o,s,h,f;switch(s=this.g,e.g){case 1:for(i=0,r=0,o=new Wb(n.j);o.a<o.c.c.length;)0!=(a=BB(n0(o),11)).e.c.length&&(++i,a.j==(kUn(),sIt)&&++r);for(c=t+r,f=t+i,u=xwn(n,(ain(),Hvt)).Kc();u.Ob();)(a=BB(u.Pb(),11)).j==(kUn(),sIt)?(s[a.p]=c,--c):(s[a.p]=f,--f);return i;case 2:for(h=0,u=xwn(n,(ain(),qvt)).Kc();u.Ob();)++h,s[(a=BB(u.Pb(),11)).p]=t+h;return h;default:throw Hp(new wv)}},vX(C3n,"LayerTotalPortDistributor",1833),wAn(660,817,{660:1,225:1},prn),MWn.ag=function(n,t,e,i){e?sjn(this,n):(Djn(this,n,i),ZGn(this,n,t)),n.c.length>1&&(qy(TD(mMn(vW((l1(0,n.c.length),BB(n.c[0],10))),(HXn(),xdt))))?R$n(n,this.d,this):(SQ(),m$(n,this.d)),qy(TD(mMn(vW((l1(0,n.c.length),BB(n.c[0],10))),xdt)))||Ban(this.e,n))},vX(C3n,"ModelOrderBarycenterHeuristic",660),wAn(1803,1,MYn,Wd),MWn.ue=function(n,t){return KSn(this.a,BB(n,10),BB(t,10))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(C3n,"ModelOrderBarycenterHeuristic/lambda$0$Type",1803),wAn(1403,1,E3n,jf),MWn.Yf=function(n){var t;return BB(n,37),dq(t=kA(Dmt),(yMn(),_at),(lWn(),Bot)),t},MWn.pf=function(n,t){mY((BB(n,37),t))},vX(C3n,"NoCrossingMinimizer",1403),wAn(796,402,S3n,Rj),MWn.$f=function(n,t,e){var i,r,c,a,u,o,s,h,f,l,b;switch(f=this.g,e.g){case 1:for(r=0,c=0,h=new Wb(n.j);h.a<h.c.c.length;)0!=(o=BB(n0(h),11)).e.c.length&&(++r,o.j==(kUn(),sIt)&&++c);for(a=t+c*(i=1/(r+1)),b=t+1-i,s=xwn(n,(ain(),Hvt)).Kc();s.Ob();)(o=BB(s.Pb(),11)).j==(kUn(),sIt)?(f[o.p]=a,a-=i):(f[o.p]=b,b-=i);break;case 2:for(u=0,h=new Wb(n.j);h.a<h.c.c.length;)0==(o=BB(n0(h),11)).g.c.length||++u;for(l=t+(i=1/(u+1)),s=xwn(n,(ain(),qvt)).Kc();s.Ob();)f[(o=BB(s.Pb(),11)).p]=l,l+=i;break;default:throw Hp(new _y("Port type is undefined"))}return 1},vX(C3n,"NodeRelativePortDistributor",796),wAn(807,1,{},Vz,HMn),vX(C3n,"SweepCopy",807),wAn(1798,1,N1n,wdn),MWn.Of=function(n,t){},MWn.Mf=function(){var n;n=x8(ANt,hQn,25,this.f,15,1),this.d=new eg(n),this.a=new QK(n)},MWn.Nf=function(n,t,e,i,r,c){var a;a=BB(xq(c[n][t].j,e),11),r.c==a&&r.c.i.c==r.d.i.c&&++this.e[n]},MWn.Pf=function(n,t,e){var i;i=e[n][t],this.c[n]=this.c[n]|i.k==(uSn(),Iut)},MWn.Qf=function(n,t,e,i){var r;(r=BB(xq(i[n][t].j,e),11)).p=this.f++,r.g.c.length+r.e.c.length>1&&(r.j==(kUn(),oIt)?this.b[n]=!0:r.j==CIt&&n>0&&(this.b[n-1]=!0))},MWn.f=0,vX(L1n,"AllCrossingsCounter",1798),wAn(587,1,{},mrn),MWn.b=0,MWn.d=0,vX(L1n,"BinaryIndexedTree",587),wAn(524,1,{},QK),vX(L1n,"CrossingsCounter",524),wAn(1906,1,MYn,Vd),MWn.ue=function(n,t){return Xq(this.a,BB(n,11),BB(t,11))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(L1n,"CrossingsCounter/lambda$0$Type",1906),wAn(1907,1,MYn,Qd),MWn.ue=function(n,t){return Wq(this.a,BB(n,11),BB(t,11))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(L1n,"CrossingsCounter/lambda$1$Type",1907),wAn(1908,1,MYn,Yd),MWn.ue=function(n,t){return Vq(this.a,BB(n,11),BB(t,11))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(L1n,"CrossingsCounter/lambda$2$Type",1908),wAn(1909,1,MYn,Jd),MWn.ue=function(n,t){return Qq(this.a,BB(n,11),BB(t,11))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(L1n,"CrossingsCounter/lambda$3$Type",1909),wAn(1910,1,lVn,Zd),MWn.td=function(n){p7(this.a,BB(n,11))},vX(L1n,"CrossingsCounter/lambda$4$Type",1910),wAn(1911,1,DVn,ng),MWn.Mb=function(n){return yI(this.a,BB(n,11))},vX(L1n,"CrossingsCounter/lambda$5$Type",1911),wAn(1912,1,lVn,tg),MWn.td=function(n){mI(this,n)},vX(L1n,"CrossingsCounter/lambda$6$Type",1912),wAn(1913,1,lVn,ZP),MWn.td=function(n){var t;hH(),d3(this.b,(t=this.a,BB(n,11),t))},vX(L1n,"CrossingsCounter/lambda$7$Type",1913),wAn(826,1,qYn,xc),MWn.Lb=function(n){return hH(),Lx(BB(n,11),(hWn(),Elt))},MWn.Fb=function(n){return this===n},MWn.Mb=function(n){return hH(),Lx(BB(n,11),(hWn(),Elt))},vX(L1n,"CrossingsCounter/lambda$8$Type",826),wAn(1905,1,{},eg),vX(L1n,"HyperedgeCrossingsCounter",1905),wAn(467,1,{35:1,467:1},DR),MWn.wd=function(n){return vgn(this,BB(n,467))},MWn.b=0,MWn.c=0,MWn.e=0,MWn.f=0;var Fmt=vX(L1n,"HyperedgeCrossingsCounter/Hyperedge",467);wAn(362,1,{35:1,362:1},qV),MWn.wd=function(n){return l$n(this,BB(n,362))},MWn.b=0,MWn.c=0;var Bmt,Hmt,qmt=vX(L1n,"HyperedgeCrossingsCounter/HyperedgeCorner",362);wAn(523,22,{3:1,35:1,22:1,523:1},JP);var Gmt,zmt,Umt,Xmt,Wmt,Vmt=Ben(L1n,"HyperedgeCrossingsCounter/HyperedgeCorner/Type",523,Unt,XY,SF);wAn(1405,1,E3n,lf),MWn.Yf=function(n){return BB(mMn(BB(n,37),(hWn(),Zft)),21).Hc((bDn(),lft))?zmt:null},MWn.pf=function(n,t){ljn(this,BB(n,37),t)},vX(I3n,"InteractiveNodePlacer",1405),wAn(1406,1,E3n,ff),MWn.Yf=function(n){return BB(mMn(BB(n,37),(hWn(),Zft)),21).Hc((bDn(),lft))?Umt:null},MWn.pf=function(n,t){jmn(this,BB(n,37),t)},vX(I3n,"LinearSegmentsNodePlacer",1406),wAn(257,1,{35:1,257:1},rm),MWn.wd=function(n){return uj(this,BB(n,257))},MWn.Fb=function(n){var t;return!!cL(n,257)&&(t=BB(n,257),this.b==t.b)},MWn.Hb=function(){return this.b},MWn.Ib=function(){return"ls"+LMn(this.e)},MWn.a=0,MWn.b=0,MWn.c=-1,MWn.d=-1,MWn.g=0;var Qmt,Ymt=vX(I3n,"LinearSegmentsNodePlacer/LinearSegment",257);wAn(1408,1,E3n,_G),MWn.Yf=function(n){return BB(mMn(BB(n,37),(hWn(),Zft)),21).Hc((bDn(),lft))?Qmt:null},MWn.pf=function(n,t){SXn(this,BB(n,37),t)},MWn.b=0,MWn.g=0,vX(I3n,"NetworkSimplexPlacer",1408),wAn(1427,1,MYn,Dc),MWn.ue=function(n,t){return E$(BB(n,19).a,BB(t,19).a)},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(I3n,"NetworkSimplexPlacer/0methodref$compare$Type",1427),wAn(1429,1,MYn,Rc),MWn.ue=function(n,t){return E$(BB(n,19).a,BB(t,19).a)},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(I3n,"NetworkSimplexPlacer/1methodref$compare$Type",1429),wAn(649,1,{649:1},nC);var Jmt=vX(I3n,"NetworkSimplexPlacer/EdgeRep",649);wAn(401,1,{401:1},GV),MWn.b=!1;var Zmt,nyt,tyt,eyt=vX(I3n,"NetworkSimplexPlacer/NodeRep",401);wAn(508,12,{3:1,4:1,20:1,28:1,52:1,12:1,14:1,15:1,54:1,508:1},um),vX(I3n,"NetworkSimplexPlacer/Path",508),wAn(1409,1,{},Kc),MWn.Kb=function(n){return BB(n,17).d.i.k},vX(I3n,"NetworkSimplexPlacer/Path/lambda$0$Type",1409),wAn(1410,1,DVn,_c),MWn.Mb=function(n){return BB(n,267)==(uSn(),Put)},vX(I3n,"NetworkSimplexPlacer/Path/lambda$1$Type",1410),wAn(1411,1,{},Fc),MWn.Kb=function(n){return BB(n,17).d.i},vX(I3n,"NetworkSimplexPlacer/Path/lambda$2$Type",1411),wAn(1412,1,DVn,ig),MWn.Mb=function(n){return HD(tdn(BB(n,10)))},vX(I3n,"NetworkSimplexPlacer/Path/lambda$3$Type",1412),wAn(1413,1,DVn,Bc),MWn.Mb=function(n){return hq(BB(n,11))},vX(I3n,"NetworkSimplexPlacer/lambda$0$Type",1413),wAn(1414,1,lVn,tC),MWn.td=function(n){D$(this.a,this.b,BB(n,11))},vX(I3n,"NetworkSimplexPlacer/lambda$1$Type",1414),wAn(1423,1,lVn,rg),MWn.td=function(n){WCn(this.a,BB(n,17))},vX(I3n,"NetworkSimplexPlacer/lambda$10$Type",1423),wAn(1424,1,{},Hc),MWn.Kb=function(n){return BZ(),new Rq(null,new w1(BB(n,29).a,16))},vX(I3n,"NetworkSimplexPlacer/lambda$11$Type",1424),wAn(1425,1,lVn,cg),MWn.td=function(n){BDn(this.a,BB(n,10))},vX(I3n,"NetworkSimplexPlacer/lambda$12$Type",1425),wAn(1426,1,{},qc),MWn.Kb=function(n){return BZ(),iln(BB(n,121).e)},vX(I3n,"NetworkSimplexPlacer/lambda$13$Type",1426),wAn(1428,1,{},Gc),MWn.Kb=function(n){return BZ(),iln(BB(n,121).e)},vX(I3n,"NetworkSimplexPlacer/lambda$15$Type",1428),wAn(1430,1,DVn,zc),MWn.Mb=function(n){return BZ(),BB(n,401).c.k==(uSn(),Cut)},vX(I3n,"NetworkSimplexPlacer/lambda$17$Type",1430),wAn(1431,1,DVn,Uc),MWn.Mb=function(n){return BZ(),BB(n,401).c.j.c.length>1},vX(I3n,"NetworkSimplexPlacer/lambda$18$Type",1431),wAn(1432,1,lVn,zV),MWn.td=function(n){cwn(this.c,this.b,this.d,this.a,BB(n,401))},MWn.c=0,MWn.d=0,vX(I3n,"NetworkSimplexPlacer/lambda$19$Type",1432),wAn(1415,1,{},Xc),MWn.Kb=function(n){return BZ(),new Rq(null,new w1(BB(n,29).a,16))},vX(I3n,"NetworkSimplexPlacer/lambda$2$Type",1415),wAn(1433,1,lVn,ag),MWn.td=function(n){N$(this.a,BB(n,11))},MWn.a=0,vX(I3n,"NetworkSimplexPlacer/lambda$20$Type",1433),wAn(1434,1,{},Wc),MWn.Kb=function(n){return BZ(),new Rq(null,new w1(BB(n,29).a,16))},vX(I3n,"NetworkSimplexPlacer/lambda$21$Type",1434),wAn(1435,1,lVn,ug),MWn.td=function(n){dL(this.a,BB(n,10))},vX(I3n,"NetworkSimplexPlacer/lambda$22$Type",1435),wAn(1436,1,DVn,Vc),MWn.Mb=function(n){return HD(n)},vX(I3n,"NetworkSimplexPlacer/lambda$23$Type",1436),wAn(1437,1,{},Qc),MWn.Kb=function(n){return BZ(),new Rq(null,new w1(BB(n,29).a,16))},vX(I3n,"NetworkSimplexPlacer/lambda$24$Type",1437),wAn(1438,1,DVn,og),MWn.Mb=function(n){return EO(this.a,BB(n,10))},vX(I3n,"NetworkSimplexPlacer/lambda$25$Type",1438),wAn(1439,1,lVn,eC),MWn.td=function(n){MPn(this.a,this.b,BB(n,10))},vX(I3n,"NetworkSimplexPlacer/lambda$26$Type",1439),wAn(1440,1,DVn,Yc),MWn.Mb=function(n){return BZ(),!b5(BB(n,17))},vX(I3n,"NetworkSimplexPlacer/lambda$27$Type",1440),wAn(1441,1,DVn,Jc),MWn.Mb=function(n){return BZ(),!b5(BB(n,17))},vX(I3n,"NetworkSimplexPlacer/lambda$28$Type",1441),wAn(1442,1,{},sg),MWn.Ce=function(n,t){return sL(this.a,BB(n,29),BB(t,29))},vX(I3n,"NetworkSimplexPlacer/lambda$29$Type",1442),wAn(1416,1,{},Zc),MWn.Kb=function(n){return BZ(),new Rq(null,new zU(new oz(ZL(lbn(BB(n,10)).a.Kc(),new h))))},vX(I3n,"NetworkSimplexPlacer/lambda$3$Type",1416),wAn(1417,1,DVn,na),MWn.Mb=function(n){return BZ(),t2(BB(n,17))},vX(I3n,"NetworkSimplexPlacer/lambda$4$Type",1417),wAn(1418,1,lVn,hg),MWn.td=function(n){iBn(this.a,BB(n,17))},vX(I3n,"NetworkSimplexPlacer/lambda$5$Type",1418),wAn(1419,1,{},ta),MWn.Kb=function(n){return BZ(),new Rq(null,new w1(BB(n,29).a,16))},vX(I3n,"NetworkSimplexPlacer/lambda$6$Type",1419),wAn(1420,1,DVn,ea),MWn.Mb=function(n){return BZ(),BB(n,10).k==(uSn(),Cut)},vX(I3n,"NetworkSimplexPlacer/lambda$7$Type",1420),wAn(1421,1,{},ia),MWn.Kb=function(n){return BZ(),new Rq(null,new zU(new oz(ZL(hbn(BB(n,10)).a.Kc(),new h))))},vX(I3n,"NetworkSimplexPlacer/lambda$8$Type",1421),wAn(1422,1,DVn,ra),MWn.Mb=function(n){return BZ(),UH(BB(n,17))},vX(I3n,"NetworkSimplexPlacer/lambda$9$Type",1422),wAn(1404,1,E3n,Cf),MWn.Yf=function(n){return BB(mMn(BB(n,37),(hWn(),Zft)),21).Hc((bDn(),lft))?Zmt:null},MWn.pf=function(n,t){kHn(BB(n,37),t)},vX(I3n,"SimpleNodePlacer",1404),wAn(180,1,{180:1},qKn),MWn.Ib=function(){var n;return n="",this.c==(gJ(),tyt)?n+=aJn:this.c==nyt&&(n+=cJn),this.o==(oZ(),ryt)?n+=pJn:this.o==cyt?n+="UP":n+="BALANCED",n},vX($3n,"BKAlignedLayout",180),wAn(516,22,{3:1,35:1,22:1,516:1},cC);var iyt,ryt,cyt,ayt=Ben($3n,"BKAlignedLayout/HDirection",516,Unt,VY,PF);wAn(515,22,{3:1,35:1,22:1,515:1},rC);var uyt,oyt,syt,hyt,fyt,lyt,byt,wyt,dyt,gyt,pyt,vyt,myt,yyt,kyt,jyt,Eyt,Tyt,Myt,Syt=Ben($3n,"BKAlignedLayout/VDirection",515,Unt,QY,CF);wAn(1634,1,{},iC),vX($3n,"BKAligner",1634),wAn(1637,1,{},Jyn),vX($3n,"BKCompactor",1637),wAn(654,1,{654:1},ca),MWn.a=0,vX($3n,"BKCompactor/ClassEdge",654),wAn(458,1,{458:1},cm),MWn.a=null,MWn.b=0,vX($3n,"BKCompactor/ClassNode",458),wAn(1407,1,E3n,jI),MWn.Yf=function(n){return BB(mMn(BB(n,37),(hWn(),Zft)),21).Hc((bDn(),lft))?oyt:null},MWn.pf=function(n,t){rWn(this,BB(n,37),t)},MWn.d=!1,vX($3n,"BKNodePlacer",1407),wAn(1635,1,{},aa),MWn.d=0,vX($3n,"NeighborhoodInformation",1635),wAn(1636,1,MYn,fg),MWn.ue=function(n,t){return Mtn(this,BB(n,46),BB(t,46))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX($3n,"NeighborhoodInformation/NeighborComparator",1636),wAn(808,1,{}),vX($3n,"ThresholdStrategy",808),wAn(1763,808,{},dm),MWn.bg=function(n,t,e){return this.a.o==(oZ(),cyt)?RQn:KQn},MWn.cg=function(){},vX($3n,"ThresholdStrategy/NullThresholdStrategy",1763),wAn(579,1,{579:1},aC),MWn.c=!1,MWn.d=!1,vX($3n,"ThresholdStrategy/Postprocessable",579),wAn(1764,808,{},gm),MWn.bg=function(n,t,e){var i,r,c;return r=t==e,i=this.a.a[e.p]==t,r||i?(c=n,this.a.c,gJ(),r&&(c=THn(this,t,!0)),!isNaN(c)&&!isFinite(c)&&i&&(c=THn(this,e,!1)),c):n},MWn.cg=function(){for(var n,t,e;0!=this.d.b;)(t=cFn(this,e=BB(PJ(this.d),579))).a&&(n=t.a,(qy(this.a.f[this.a.g[e.b.p].p])||b5(n)||n.c.i.c!=n.d.i.c)&&(b$n(this,e)||rA(this.e,e)));for(;0!=this.e.a.c.length;)b$n(this,BB(thn(this.e),579))},vX($3n,"ThresholdStrategy/SimpleThresholdStrategy",1764),wAn(635,1,{635:1,246:1,234:1},ua),MWn.Kf=function(){return Tan(this)},MWn.Xf=function(){return Tan(this)},vX(L3n,"EdgeRouterFactory",635),wAn(1458,1,E3n,If),MWn.Yf=function(n){return Uxn(BB(n,37))},MWn.pf=function(n,t){DHn(BB(n,37),t)},vX(L3n,"OrthogonalEdgeRouter",1458),wAn(1451,1,E3n,EI),MWn.Yf=function(n){return Ejn(BB(n,37))},MWn.pf=function(n,t){OUn(this,BB(n,37),t)},vX(L3n,"PolylineEdgeRouter",1451),wAn(1452,1,qYn,oa),MWn.Lb=function(n){return Qan(BB(n,10))},MWn.Fb=function(n){return this===n},MWn.Mb=function(n){return Qan(BB(n,10))},vX(L3n,"PolylineEdgeRouter/1",1452),wAn(1809,1,DVn,sa),MWn.Mb=function(n){return BB(n,129).c==(O6(),Tyt)},vX(N3n,"HyperEdgeCycleDetector/lambda$0$Type",1809),wAn(1810,1,{},ha),MWn.Ge=function(n){return BB(n,129).d},vX(N3n,"HyperEdgeCycleDetector/lambda$1$Type",1810),wAn(1811,1,DVn,fa),MWn.Mb=function(n){return BB(n,129).c==(O6(),Tyt)},vX(N3n,"HyperEdgeCycleDetector/lambda$2$Type",1811),wAn(1812,1,{},la),MWn.Ge=function(n){return BB(n,129).d},vX(N3n,"HyperEdgeCycleDetector/lambda$3$Type",1812),wAn(1813,1,{},ba),MWn.Ge=function(n){return BB(n,129).d},vX(N3n,"HyperEdgeCycleDetector/lambda$4$Type",1813),wAn(1814,1,{},wa),MWn.Ge=function(n){return BB(n,129).d},vX(N3n,"HyperEdgeCycleDetector/lambda$5$Type",1814),wAn(112,1,{35:1,112:1},Fan),MWn.wd=function(n){return oj(this,BB(n,112))},MWn.Fb=function(n){var t;return!!cL(n,112)&&(t=BB(n,112),this.g==t.g)},MWn.Hb=function(){return this.g},MWn.Ib=function(){var n,t,e,i;for(n=new lN("{"),i=new Wb(this.n);i.a<i.c.c.length;)null==(t=gyn((e=BB(n0(i),11)).i))&&(t="n"+AK(e.i)),n.a+=""+t,i.a<i.c.c.length&&(n.a+=",");return n.a+="}",n.a},MWn.a=0,MWn.b=0,MWn.c=NaN,MWn.d=0,MWn.g=0,MWn.i=0,MWn.o=0,MWn.s=NaN,vX(N3n,"HyperEdgeSegment",112),wAn(129,1,{129:1},zZ),MWn.Ib=function(){return this.a+"->"+this.b+" ("+wx(this.c)+")"},MWn.d=0,vX(N3n,"HyperEdgeSegmentDependency",129),wAn(520,22,{3:1,35:1,22:1,520:1},uC);var Pyt,Cyt,Iyt,Oyt,Ayt,$yt,Lyt,Nyt,xyt=Ben(N3n,"HyperEdgeSegmentDependency/DependencyType",520,Unt,WY,IF);wAn(1815,1,{},lg),vX(N3n,"HyperEdgeSegmentSplitter",1815),wAn(1816,1,{},zj),MWn.a=0,MWn.b=0,vX(N3n,"HyperEdgeSegmentSplitter/AreaRating",1816),wAn(329,1,{329:1},kB),MWn.a=0,MWn.b=0,MWn.c=0,vX(N3n,"HyperEdgeSegmentSplitter/FreeArea",329),wAn(1817,1,MYn,ja),MWn.ue=function(n,t){return OK(BB(n,112),BB(t,112))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(N3n,"HyperEdgeSegmentSplitter/lambda$0$Type",1817),wAn(1818,1,lVn,XV),MWn.td=function(n){n4(this.a,this.d,this.c,this.b,BB(n,112))},MWn.b=0,vX(N3n,"HyperEdgeSegmentSplitter/lambda$1$Type",1818),wAn(1819,1,{},Ea),MWn.Kb=function(n){return new Rq(null,new w1(BB(n,112).e,16))},vX(N3n,"HyperEdgeSegmentSplitter/lambda$2$Type",1819),wAn(1820,1,{},Ta),MWn.Kb=function(n){return new Rq(null,new w1(BB(n,112).j,16))},vX(N3n,"HyperEdgeSegmentSplitter/lambda$3$Type",1820),wAn(1821,1,{},Ma),MWn.Fe=function(n){return Gy(MD(n))},vX(N3n,"HyperEdgeSegmentSplitter/lambda$4$Type",1821),wAn(655,1,{},fX),MWn.a=0,MWn.b=0,MWn.c=0,vX(N3n,"OrthogonalRoutingGenerator",655),wAn(1638,1,{},Sa),MWn.Kb=function(n){return new Rq(null,new w1(BB(n,112).e,16))},vX(N3n,"OrthogonalRoutingGenerator/lambda$0$Type",1638),wAn(1639,1,{},Pa),MWn.Kb=function(n){return new Rq(null,new w1(BB(n,112).j,16))},vX(N3n,"OrthogonalRoutingGenerator/lambda$1$Type",1639),wAn(661,1,{}),vX(x3n,"BaseRoutingDirectionStrategy",661),wAn(1807,661,{},pm),MWn.dg=function(n,t,i){var r,c,a,u,o,s,h,f,l,b,w,d,g;if(!n.r||n.q)for(f=t+n.o*i,h=new Wb(n.n);h.a<h.c.c.length;)for(s=BB(n0(h),11),l=Aon(Pun(Gk(PMt,1),sVn,8,0,[s.i.n,s.n,s.a])).a,o=new Wb(s.g);o.a<o.c.c.length;)b5(u=BB(n0(o),17))||(d=u.d,g=Aon(Pun(Gk(PMt,1),sVn,8,0,[d.i.n,d.n,d.a])).a,e.Math.abs(l-g)>lZn&&(c=n,r=new xC(l,a=f),DH(u.a,r),F_n(this,u,c,r,!1),(b=n.r)&&(r=new xC(w=Gy(MD(Dpn(b.e,0))),a),DH(u.a,r),F_n(this,u,c,r,!1),c=b,r=new xC(w,a=t+b.o*i),DH(u.a,r),F_n(this,u,c,r,!1)),r=new xC(g,a),DH(u.a,r),F_n(this,u,c,r,!1)))},MWn.eg=function(n){return n.i.n.a+n.n.a+n.a.a},MWn.fg=function(){return kUn(),SIt},MWn.gg=function(){return kUn(),sIt},vX(x3n,"NorthToSouthRoutingStrategy",1807),wAn(1808,661,{},vm),MWn.dg=function(n,t,i){var r,c,a,u,o,s,h,f,l,b,w,d,g;if(!n.r||n.q)for(f=t-n.o*i,h=new Wb(n.n);h.a<h.c.c.length;)for(s=BB(n0(h),11),l=Aon(Pun(Gk(PMt,1),sVn,8,0,[s.i.n,s.n,s.a])).a,o=new Wb(s.g);o.a<o.c.c.length;)b5(u=BB(n0(o),17))||(d=u.d,g=Aon(Pun(Gk(PMt,1),sVn,8,0,[d.i.n,d.n,d.a])).a,e.Math.abs(l-g)>lZn&&(c=n,r=new xC(l,a=f),DH(u.a,r),F_n(this,u,c,r,!1),(b=n.r)&&(r=new xC(w=Gy(MD(Dpn(b.e,0))),a),DH(u.a,r),F_n(this,u,c,r,!1),c=b,r=new xC(w,a=t-b.o*i),DH(u.a,r),F_n(this,u,c,r,!1)),r=new xC(g,a),DH(u.a,r),F_n(this,u,c,r,!1)))},MWn.eg=function(n){return n.i.n.a+n.n.a+n.a.a},MWn.fg=function(){return kUn(),sIt},MWn.gg=function(){return kUn(),SIt},vX(x3n,"SouthToNorthRoutingStrategy",1808),wAn(1806,661,{},mm),MWn.dg=function(n,t,i){var r,c,a,u,o,s,h,f,l,b,w,d,g;if(!n.r||n.q)for(f=t+n.o*i,h=new Wb(n.n);h.a<h.c.c.length;)for(s=BB(n0(h),11),l=Aon(Pun(Gk(PMt,1),sVn,8,0,[s.i.n,s.n,s.a])).b,o=new Wb(s.g);o.a<o.c.c.length;)b5(u=BB(n0(o),17))||(d=u.d,g=Aon(Pun(Gk(PMt,1),sVn,8,0,[d.i.n,d.n,d.a])).b,e.Math.abs(l-g)>lZn&&(c=n,r=new xC(a=f,l),DH(u.a,r),F_n(this,u,c,r,!0),(b=n.r)&&(r=new xC(a,w=Gy(MD(Dpn(b.e,0)))),DH(u.a,r),F_n(this,u,c,r,!0),c=b,r=new xC(a=t+b.o*i,w),DH(u.a,r),F_n(this,u,c,r,!0)),r=new xC(a,g),DH(u.a,r),F_n(this,u,c,r,!0)))},MWn.eg=function(n){return n.i.n.b+n.n.b+n.a.b},MWn.fg=function(){return kUn(),oIt},MWn.gg=function(){return kUn(),CIt},vX(x3n,"WestToEastRoutingStrategy",1806),wAn(813,1,{},oBn),MWn.Ib=function(){return LMn(this.a)},MWn.b=0,MWn.c=!1,MWn.d=!1,MWn.f=0,vX(R3n,"NubSpline",813),wAn(407,1,{407:1},Exn,wJ),vX(R3n,"NubSpline/PolarCP",407),wAn(1453,1,E3n,hyn),MWn.Yf=function(n){return rTn(BB(n,37))},MWn.pf=function(n,t){cXn(this,BB(n,37),t)},vX(R3n,"SplineEdgeRouter",1453),wAn(268,1,{268:1},S6),MWn.Ib=function(){return this.a+" ->("+this.c+") "+this.b},MWn.c=0,vX(R3n,"SplineEdgeRouter/Dependency",268),wAn(455,22,{3:1,35:1,22:1,455:1},oC);var Dyt,Ryt,Kyt,_yt,Fyt,Byt=Ben(R3n,"SplineEdgeRouter/SideToProcess",455,Unt,YY,OF);wAn(1454,1,DVn,ya),MWn.Mb=function(n){return gxn(),!BB(n,128).o},vX(R3n,"SplineEdgeRouter/lambda$0$Type",1454),wAn(1455,1,{},ma),MWn.Ge=function(n){return gxn(),BB(n,128).v+1},vX(R3n,"SplineEdgeRouter/lambda$1$Type",1455),wAn(1456,1,lVn,sC),MWn.td=function(n){iq(this.a,this.b,BB(n,46))},vX(R3n,"SplineEdgeRouter/lambda$2$Type",1456),wAn(1457,1,lVn,hC),MWn.td=function(n){rq(this.a,this.b,BB(n,46))},vX(R3n,"SplineEdgeRouter/lambda$3$Type",1457),wAn(128,1,{35:1,128:1},tCn,hqn),MWn.wd=function(n){return sj(this,BB(n,128))},MWn.b=0,MWn.e=!1,MWn.f=0,MWn.g=0,MWn.j=!1,MWn.k=!1,MWn.n=0,MWn.o=!1,MWn.p=!1,MWn.q=!1,MWn.s=0,MWn.u=0,MWn.v=0,MWn.F=0,vX(R3n,"SplineSegment",128),wAn(459,1,{459:1},ka),MWn.a=0,MWn.b=!1,MWn.c=!1,MWn.d=!1,MWn.e=!1,MWn.f=0,vX(R3n,"SplineSegment/EdgeInformation",459),wAn(1234,1,{},da),vX(H3n,iZn,1234),wAn(1235,1,MYn,ga),MWn.ue=function(n,t){return IIn(BB(n,135),BB(t,135))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(H3n,rZn,1235),wAn(1233,1,{},AE),vX(H3n,"MrTree",1233),wAn(393,22,{3:1,35:1,22:1,393:1,246:1,234:1},fC),MWn.Kf=function(){return AIn(this)},MWn.Xf=function(){return AIn(this)};var Hyt,qyt=Ben(H3n,"TreeLayoutPhases",393,Unt,j3,AF);wAn(1130,209,NJn,_R),MWn.Ze=function(n,t){var e,i,r,c,a,u;for(qy(TD(ZAn(n,(CAn(),Ckt))))||jJ(new Tw((GM(),new Dy(n)))),qan(a=new P6,n),hon(a,(qqn(),skt),n),v_n(n,a,u=new xp),W_n(n,a,u),c=a,i=new Wb(r=x_n(this.a,c));i.a<i.c.c.length;)e=BB(n0(i),135),WEn(this.b,e,mcn(t,1/r.c.length));Izn(c=tWn(r))},vX(H3n,"TreeLayoutProvider",1130),wAn(1847,1,pVn,pa),MWn.Jc=function(n){e5(this,n)},MWn.Kc=function(){return SQ(),LT(),bet},vX(H3n,"TreeUtil/1",1847),wAn(1848,1,pVn,va),MWn.Jc=function(n){e5(this,n)},MWn.Kc=function(){return SQ(),LT(),bet},vX(H3n,"TreeUtil/2",1848),wAn(502,134,{3:1,502:1,94:1,134:1}),MWn.g=0,vX(q3n,"TGraphElement",502),wAn(188,502,{3:1,188:1,502:1,94:1,134:1},UQ),MWn.Ib=function(){return this.b&&this.c?g0(this.b)+"->"+g0(this.c):"e_"+nsn(this)},vX(q3n,"TEdge",188),wAn(135,134,{3:1,135:1,94:1,134:1},P6),MWn.Ib=function(){var n,t,e,i,r;for(r=null,i=spn(this.b,0);i.b!=i.d.c;)r+=(null==(e=BB(b3(i),86)).c||0==e.c.length?"n_"+e.g:"n_"+e.c)+"\n";for(t=spn(this.a,0);t.b!=t.d.c;)r+=((n=BB(b3(t),188)).b&&n.c?g0(n.b)+"->"+g0(n.c):"e_"+nsn(n))+"\n";return r};var Gyt=vX(q3n,"TGraph",135);wAn(633,502,{3:1,502:1,633:1,94:1,134:1}),vX(q3n,"TShape",633),wAn(86,633,{3:1,502:1,86:1,633:1,94:1,134:1},csn),MWn.Ib=function(){return g0(this)};var zyt,Uyt,Xyt,Wyt,Vyt,Qyt,Yyt=vX(q3n,"TNode",86);wAn(255,1,pVn,bg),MWn.Jc=function(n){e5(this,n)},MWn.Kc=function(){return new wg(spn(this.a.d,0))},vX(q3n,"TNode/2",255),wAn(358,1,QWn,wg),MWn.Nb=function(n){fU(this,n)},MWn.Pb=function(){return BB(b3(this.a),188).c},MWn.Ob=function(){return EE(this.a)},MWn.Qb=function(){mtn(this.a)},vX(q3n,"TNode/2/1",358),wAn(1840,1,n1n,KR),MWn.pf=function(n,t){xFn(this,BB(n,135),t)},vX(G3n,"FanProcessor",1840),wAn(327,22,{3:1,35:1,22:1,327:1,234:1},lC),MWn.Kf=function(){switch(this.g){case 0:return new Qm;case 1:return new KR;case 2:return new Oa;case 3:return new Ca;case 4:return new $a;case 5:return new La;default:throw Hp(new _y(M1n+(null!=this.f?this.f:""+this.g)))}};var Jyt,Zyt,nkt,tkt,ekt,ikt,rkt,ckt,akt,ukt,okt,skt,hkt,fkt,lkt,bkt,wkt,dkt,gkt,pkt,vkt,mkt,ykt,kkt,jkt,Ekt,Tkt,Mkt,Skt,Pkt,Ckt,Ikt,Okt,Akt,$kt,Lkt,Nkt,xkt,Dkt,Rkt,Kkt,_kt=Ben(G3n,S1n,327,Unt,r9,$F);wAn(1843,1,n1n,Ca),MWn.pf=function(n,t){u$n(this,BB(n,135),t)},MWn.a=0,vX(G3n,"LevelHeightProcessor",1843),wAn(1844,1,pVn,Ia),MWn.Jc=function(n){e5(this,n)},MWn.Kc=function(){return SQ(),LT(),bet},vX(G3n,"LevelHeightProcessor/1",1844),wAn(1841,1,n1n,Oa),MWn.pf=function(n,t){QPn(this,BB(n,135),t)},MWn.a=0,vX(G3n,"NeighborsProcessor",1841),wAn(1842,1,pVn,Aa),MWn.Jc=function(n){e5(this,n)},MWn.Kc=function(){return SQ(),LT(),bet},vX(G3n,"NeighborsProcessor/1",1842),wAn(1845,1,n1n,$a),MWn.pf=function(n,t){a$n(this,BB(n,135),t)},MWn.a=0,vX(G3n,"NodePositionProcessor",1845),wAn(1839,1,n1n,Qm),MWn.pf=function(n,t){ZHn(this,BB(n,135))},vX(G3n,"RootProcessor",1839),wAn(1846,1,n1n,La),MWn.pf=function(n,t){dln(BB(n,135))},vX(G3n,"Untreeifyer",1846),wAn(851,1,QYn,Pf),MWn.Qe=function(n){Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,X3n),""),"Weighting of Nodes"),"Which weighting to use when computing a node order."),kkt),(PPn(),gMt)),qkt),nbn((rpn(),hMt))))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,W3n),""),"Search Order"),"Which search order to use when computing a spanning tree."),mkt),gMt),Jkt),nbn(hMt)))),KGn((new Sf,n))},vX(V3n,"MrTreeMetaDataProvider",851),wAn(994,1,QYn,Sf),MWn.Qe=function(n){KGn(n)},vX(V3n,"MrTreeOptions",994),wAn(995,1,{},Na),MWn.$e=function(){return new _R},MWn._e=function(n){},vX(V3n,"MrTreeOptions/MrtreeFactory",995),wAn(480,22,{3:1,35:1,22:1,480:1},bC);var Fkt,Bkt,Hkt,qkt=Ben(V3n,"OrderWeighting",480,Unt,ZY,LF);wAn(425,22,{3:1,35:1,22:1,425:1},wC);var Gkt,zkt,Ukt,Xkt,Wkt,Vkt,Qkt,Ykt,Jkt=Ben(V3n,"TreeifyingOrder",425,Unt,JY,xF);wAn(1459,1,E3n,pf),MWn.Yf=function(n){return BB(n,135),zkt},MWn.pf=function(n,t){ycn(this,BB(n,135),t)},vX("org.eclipse.elk.alg.mrtree.p1treeify","DFSTreeifyer",1459),wAn(1460,1,E3n,vf),MWn.Yf=function(n){return BB(n,135),Ukt},MWn.pf=function(n,t){fCn(this,BB(n,135),t)},vX("org.eclipse.elk.alg.mrtree.p2order","NodeOrderer",1460),wAn(1461,1,E3n,gf),MWn.Yf=function(n){return BB(n,135),Xkt},MWn.pf=function(n,t){nRn(this,BB(n,135),t)},MWn.a=0,vX("org.eclipse.elk.alg.mrtree.p3place","NodePlacer",1461),wAn(1462,1,E3n,mf),MWn.Yf=function(n){return BB(n,135),Wkt},MWn.pf=function(n,t){xkn(BB(n,135),t)},vX("org.eclipse.elk.alg.mrtree.p4route","EdgeRouter",1462),wAn(495,22,{3:1,35:1,22:1,495:1,246:1,234:1},dC),MWn.Kf=function(){return bwn(this)},MWn.Xf=function(){return bwn(this)};var Zkt,njt,tjt,ejt,ijt=Ben(J3n,"RadialLayoutPhases",495,Unt,nJ,NF);wAn(1131,209,NJn,OE),MWn.Ze=function(n,t){var e,i,r;if(OTn(t,"Radial layout",ECn(this,n).c.length),qy(TD(ZAn(n,(Uyn(),Ajt))))||jJ(new Tw((GM(),new Dy(n)))),r=uTn(n),Ypn(n,(wD(),Vkt),r),!r)throw Hp(new _y("The given graph is not a tree!"));for(0==(e=Gy(MD(ZAn(n,Djt))))&&(e=fIn(n)),Ypn(n,Djt,e),i=new Wb(ECn(this,n));i.a<i.c.c.length;)BB(n0(i),51).pf(n,mcn(t,1));HSn(t)},vX(J3n,"RadialLayoutProvider",1131),wAn(549,1,MYn,IE),MWn.ue=function(n,t){return DRn(this.a,this.b,BB(n,33),BB(t,33))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},MWn.a=0,MWn.b=0,vX(J3n,"RadialUtil/lambda$0$Type",549),wAn(1375,1,n1n,Da),MWn.pf=function(n,t){dGn(BB(n,33),t)},vX(t4n,"CalculateGraphSize",1375),wAn(442,22,{3:1,35:1,22:1,442:1,234:1},gC),MWn.Kf=function(){switch(this.g){case 0:return new Ba;case 1:return new xa;case 2:return new Da;default:throw Hp(new _y(M1n+(null!=this.f?this.f:""+this.g)))}};var rjt,cjt,ajt,ujt=Ben(t4n,S1n,442,Unt,R1,DF);wAn(645,1,{}),MWn.e=1,MWn.g=0,vX(e4n,"AbstractRadiusExtensionCompaction",645),wAn(1772,645,{},gD),MWn.hg=function(n){var t,e,i,r,c,a,u,o,s;for(this.c=BB(ZAn(n,(wD(),Vkt)),33),eb(this,this.c),this.d=Evn(BB(ZAn(n,(Uyn(),Rjt)),293)),(o=BB(ZAn(n,Mjt),19))&&tb(this,o.a),ib(this,(kW(u=MD(ZAn(n,(sWn(),LPt)))),u)),s=wDn(this.c),this.d&&this.d.lg(s),vKn(this,s),a=new Jy(Pun(Gk(UOt,1),i4n,33,0,[this.c])),e=0;e<2;e++)for(t=0;t<s.c.length;t++)r=new Jy(Pun(Gk(UOt,1),i4n,33,0,[(l1(t,s.c.length),BB(s.c[t],33))])),c=t<s.c.length-1?(l1(t+1,s.c.length),BB(s.c[t+1],33)):(l1(0,s.c.length),BB(s.c[0],33)),i=0==t?BB(xq(s,s.c.length-1),33):(l1(t-1,s.c.length),BB(s.c[t-1],33)),ZTn(this,(l1(t,s.c.length),BB(s.c[t],33),a),i,c,r)},vX(e4n,"AnnulusWedgeCompaction",1772),wAn(1374,1,n1n,xa),MWn.pf=function(n,t){bjn(BB(n,33),t)},vX(e4n,"GeneralCompactor",1374),wAn(1771,645,{},Ra),MWn.hg=function(n){var t,e,i,r;e=BB(ZAn(n,(wD(),Vkt)),33),this.f=e,this.b=Evn(BB(ZAn(n,(Uyn(),Rjt)),293)),(r=BB(ZAn(n,Mjt),19))&&tb(this,r.a),ib(this,(kW(i=MD(ZAn(n,(sWn(),LPt)))),i)),t=wDn(e),this.b&&this.b.lg(t),vPn(this,t)},MWn.a=0,vX(e4n,"RadialCompaction",1771),wAn(1779,1,{},Ka),MWn.ig=function(n){var t,e,i,r,c,a;for(this.a=n,t=0,i=0,c=new Wb(a=wDn(n));c.a<c.c.c.length;)for(r=BB(n0(c),33),e=++i;e<a.c.length;e++)YFn(this,r,(l1(e,a.c.length),BB(a.c[e],33)))&&(t+=1);return t},vX(r4n,"CrossingMinimizationPosition",1779),wAn(1777,1,{},_a),MWn.ig=function(n){var t,i,r,c,a,u,o,s,f,l,b,w,d;for(r=0,i=new oz(ZL(dLn(n).a.Kc(),new h));dAn(i);)t=BB(U5(i),79),f=(o=PTn(BB(Wtn((!t.c&&(t.c=new hK(KOt,t,5,8)),t.c),0),82))).i+o.g/2,l=o.j+o.f/2,c=n.i+n.g/2,a=n.j+n.f/2,(b=new Gj).a=f-c,b.b=l-a,Ukn(u=new xC(b.a,b.b),n.g,n.f),b.a-=u.a,b.b-=u.b,c=f-b.a,a=l-b.b,Ukn(s=new xC(b.a,b.b),o.g,o.f),b.a-=s.a,b.b-=s.b,w=(f=c+b.a)-c,d=(l=a+b.b)-a,r+=e.Math.sqrt(w*w+d*d);return r},vX(r4n,"EdgeLengthOptimization",1777),wAn(1778,1,{},Fa),MWn.ig=function(n){var t,i,r,c,a,u,o,s,f;for(r=0,i=new oz(ZL(dLn(n).a.Kc(),new h));dAn(i);)t=BB(U5(i),79),u=(a=PTn(BB(Wtn((!t.c&&(t.c=new hK(KOt,t,5,8)),t.c),0),82))).i+a.g/2,o=a.j+a.f/2,c=BB(ZAn(a,(sWn(),gPt)),8),s=u-(n.i+c.a+n.g/2),f=o-(n.j+c.b+n.f),r+=e.Math.sqrt(s*s+f*f);return r},vX(r4n,"EdgeLengthPositionOptimization",1778),wAn(1373,645,n1n,Ba),MWn.pf=function(n,t){fLn(this,BB(n,33),t)},vX("org.eclipse.elk.alg.radial.intermediate.overlaps","RadiusExtensionOverlapRemoval",1373),wAn(426,22,{3:1,35:1,22:1,426:1},pC);var ojt,sjt,hjt,fjt,ljt=Ben(a4n,"AnnulusWedgeCriteria",426,Unt,tJ,RF);wAn(380,22,{3:1,35:1,22:1,380:1},vC);var bjt,wjt,djt,gjt,pjt,vjt,mjt,yjt,kjt,jjt,Ejt,Tjt,Mjt,Sjt,Pjt,Cjt,Ijt,Ojt,Ajt,$jt,Ljt,Njt,xjt,Djt,Rjt,Kjt,_jt,Fjt,Bjt,Hjt,qjt,Gjt=Ben(a4n,FJn,380,Unt,K1,KF);wAn(852,1,QYn,yf),MWn.Qe=function(n){Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,u4n),""),"Order ID"),"The id can be used to define an order for nodes of one radius. This can be used to sort them in the layer accordingly."),iln(0)),(PPn(),vMt)),Att),nbn((rpn(),sMt))))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,o4n),""),"Radius"),"The radius option can be used to set the initial radius for the radial layouter."),0),dMt),Ptt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,s4n),""),"Compaction"),"With the compacter option it can be determined how compaction on the graph is done. It can be chosen between none, the radial compaction or the compaction of wedges separately."),gjt),gMt),Gjt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,h4n),""),"Compaction Step Size"),"Determine the size of steps with which the compaction is done. Step size 1 correlates to a compaction of 1 pixel per Iteration."),iln(1)),vMt),Att),nbn(hMt)))),a2(n,h4n,s4n,null),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,f4n),""),"Sorter"),"Sort the nodes per radius according to the sorting algorithm. The strategies are none, by the given order id, or sorting them by polar coordinates."),jjt),gMt),Yjt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,l4n),""),"Annulus Wedge Criteria"),"Determine how the wedge for the node placement is calculated. It can be chosen between wedge determination by the number of leaves or by the maximum sum of diagonals."),Tjt),gMt),ljt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,b4n),""),"Translation Optimization"),"Find the optimal translation of the nodes of the first radii according to this criteria. For example edge crossings can be minimized."),vjt),gMt),Vjt),nbn(hMt)))),tUn((new kf,n))},vX(a4n,"RadialMetaDataProvider",852),wAn(996,1,QYn,kf),MWn.Qe=function(n){tUn(n)},vX(a4n,"RadialOptions",996),wAn(997,1,{},Ha),MWn.$e=function(){return new OE},MWn._e=function(n){},vX(a4n,"RadialOptions/RadialFactory",997),wAn(340,22,{3:1,35:1,22:1,340:1},mC);var zjt,Ujt,Xjt,Wjt,Vjt=Ben(a4n,"RadialTranslationStrategy",340,Unt,E3,_F);wAn(293,22,{3:1,35:1,22:1,293:1},yC);var Qjt,Yjt=Ben(a4n,"SortingStrategy",293,Unt,F1,FF);wAn(1449,1,E3n,qa),MWn.Yf=function(n){return BB(n,33),null},MWn.pf=function(n,t){SLn(this,BB(n,33),t)},MWn.c=0,vX("org.eclipse.elk.alg.radial.p1position","EadesRadial",1449),wAn(1775,1,{},Ga),MWn.jg=function(n){return Upn(n)},vX(d4n,"AnnulusWedgeByLeafs",1775),wAn(1776,1,{},za),MWn.jg=function(n){return VEn(this,n)},vX(d4n,"AnnulusWedgeByNodeSpace",1776),wAn(1450,1,E3n,Ua),MWn.Yf=function(n){return BB(n,33),null},MWn.pf=function(n,t){bEn(this,BB(n,33),t)},vX("org.eclipse.elk.alg.radial.p2routing","StraightLineEdgeRouter",1450),wAn(811,1,{},Jm),MWn.kg=function(n){},MWn.lg=function(n){nv(this,n)},vX(g4n,"IDSorter",811),wAn(1774,1,MYn,Xa),MWn.ue=function(n,t){return Qrn(BB(n,33),BB(t,33))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(g4n,"IDSorter/lambda$0$Type",1774),wAn(1773,1,{},Arn),MWn.kg=function(n){c2(this,n)},MWn.lg=function(n){n.dc()||(this.e||c2(this,nG(BB(n.Xb(0),33))),nv(this.e,n))},vX(g4n,"PolarCoordinateSorter",1773),wAn(1136,209,NJn,Wa),MWn.Ze=function(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T;if(OTn(t,"Rectangle Packing",1),t.n&&t.n&&n&&y0(t,o2(n),(Bsn(),uOt)),i=Gy(MD(ZAn(n,(W$n(),lEt)))),w=BB(ZAn(n,PEt),381),p=qy(TD(ZAn(n,yEt))),y=qy(TD(ZAn(n,SEt))),f=qy(TD(ZAn(n,gEt))),k=BB(ZAn(n,CEt),116),m=Gy(MD(ZAn(n,$Et))),r=qy(TD(ZAn(n,AEt))),l=qy(TD(ZAn(n,pEt))),g=qy(TD(ZAn(n,vEt))),T=Gy(MD(ZAn(n,LEt))),!n.a&&(n.a=new eU(UOt,n,10,11)),Trn(E=n.a),g){for(b=new Np,o=new AL(E);o.e!=o.i.gc();)P8(a=BB(kpn(o),33),dEt)&&(b.c[b.c.length]=a);for(s=new Wb(b);s.a<s.c.c.length;)snn(E,a=BB(n0(s),33));for(SQ(),m$(b,new Va),h=new Wb(b);h.a<h.c.c.length;)a=BB(n0(h),33),j=BB(ZAn(a,dEt),19).a,sln(E,j=e.Math.min(j,E.i),a);for(d=0,u=new AL(E);u.e!=u.i.gc();)Ypn(a=BB(kpn(u),33),wEt,iln(d)),++d}(v=XPn(n)).a-=k.b+k.c,v.b-=k.d+k.a,v.a,T<0||T<v.a?(c=OKn(new jB(i,w,p),E,m,k),t.n&&t.n&&n&&y0(t,o2(n),(Bsn(),uOt))):c=new eq(i,T,0,(YLn(),_Et)),v.a+=k.b+k.c,v.b+=k.d+k.a,y||(Trn(E),c=kzn(new m3(i,f,l,r,m),E,e.Math.max(v.a,c.c),v,t,n,k)),pan(E,k),KUn(n,c.c+(k.b+k.c),c.b+(k.d+k.a),!1,!0),qy(TD(ZAn(n,MEt)))||jJ(new Tw((GM(),new Dy(n)))),t.n&&t.n&&n&&y0(t,o2(n),(Bsn(),uOt)),HSn(t)},vX(y4n,"RectPackingLayoutProvider",1136),wAn(1137,1,MYn,Va),MWn.ue=function(n,t){return wsn(BB(n,33),BB(t,33))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(y4n,"RectPackingLayoutProvider/lambda$0$Type",1137),wAn(1256,1,{},jB),MWn.a=0,MWn.c=!1,vX(k4n,"AreaApproximation",1256);var Jjt,Zjt,nEt,tEt=bq(k4n,"BestCandidateFilter");wAn(638,1,{526:1},Qa),MWn.mg=function(n,t,i){var r,c,a,u,o,s;for(s=new Np,a=RQn,o=new Wb(n);o.a<o.c.c.length;)u=BB(n0(o),220),a=e.Math.min(a,(u.c+(i.b+i.c))*(u.b+(i.d+i.a)));for(c=new Wb(n);c.a<c.c.c.length;)((r=BB(n0(c),220)).c+(i.b+i.c))*(r.b+(i.d+i.a))==a&&(s.c[s.c.length]=r);return s},vX(k4n,"AreaFilter",638),wAn(639,1,{526:1},Ya),MWn.mg=function(n,t,i){var r,c,a,u,o,s;for(o=new Np,s=RQn,u=new Wb(n);u.a<u.c.c.length;)a=BB(n0(u),220),s=e.Math.min(s,e.Math.abs((a.c+(i.b+i.c))/(a.b+(i.d+i.a))-t));for(c=new Wb(n);c.a<c.c.c.length;)r=BB(n0(c),220),e.Math.abs((r.c+(i.b+i.c))/(r.b+(i.d+i.a))-t)==s&&(o.c[o.c.length]=r);return o},vX(k4n,"AspectRatioFilter",639),wAn(637,1,{526:1},Ja),MWn.mg=function(n,t,i){var r,c,a,u,o,s;for(s=new Np,a=KQn,o=new Wb(n);o.a<o.c.c.length;)u=BB(n0(o),220),a=e.Math.max(a,Yq(u.c+(i.b+i.c),u.b+(i.d+i.a),u.a));for(c=new Wb(n);c.a<c.c.c.length;)Yq((r=BB(n0(c),220)).c+(i.b+i.c),r.b+(i.d+i.a),r.a)==a&&(s.c[s.c.length]=r);return s},vX(k4n,"ScaleMeasureFilter",637),wAn(381,22,{3:1,35:1,22:1,381:1},kC);var eEt,iEt,rEt,cEt,aEt,uEt,oEt,sEt,hEt,fEt,lEt,bEt,wEt,dEt,gEt,pEt,vEt,mEt,yEt,kEt,jEt,EEt,TEt,MEt,SEt,PEt,CEt,IEt,OEt,AEt,$Et,LEt,NEt=Ben(j4n,"OptimizationGoal",381,Unt,_1,BF);wAn(856,1,QYn,Of),MWn.Qe=function(n){Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,E4n),""),"Optimization Goal"),"Optimization goal for approximation of the bounding box given by the first iteration. Determines whether layout is sorted by the maximum scaling, aspect ratio, or area. Depending on the strategy the aspect ratio might be nearly ignored."),sEt),(PPn(),gMt)),NEt),nbn((rpn(),sMt))))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,T4n),""),"Shift Last Placed."),"When placing a rectangle behind or below the last placed rectangle in the first iteration, it is sometimes possible to shift the rectangle further to the left or right, resulting in less whitespace. True (default) enables the shift and false disables it. Disabling the shift produces a greater approximated area by the first iteration and a layout, when using ONLY the first iteration (default not the case), where it is sometimes impossible to implement a size transformation of rectangles that will fill the bounding box and eliminate empty spaces."),(hN(),!0)),wMt),ktt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,M4n),""),"Current position of a node in the order of nodes"),"The rectangles are ordered. Normally according to their definition the the model. This option specifies the current position of a node."),iln(-1)),vMt),Att),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,S4n),""),"Desired index of node"),"The rectangles are ordered. Normally according to their definition the the model. This option allows to specify a desired position that has preference over the original position."),iln(-1)),vMt),Att),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,P4n),""),"Only Area Approximation"),"If enabled only the width approximation step is executed and the nodes are placed accordingly. The nodes are layouted according to the packingStrategy. If set to true not expansion of nodes is taking place."),!1),wMt),ktt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,C4n),""),"Compact Rows"),"Enables compaction. Compacts blocks if they do not use the full height of the row. This option allows to have a smaller drawing. If this option is disabled all nodes are placed next to each other in rows."),!0),wMt),ktt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,I4n),""),"Fit Aspect Ratio"),"Expands nodes if expandNodes is true to fit the aspect ratio instead of only in their bounds. The option is only useful if the used packingStrategy is ASPECT_RATIO_DRIVEN, otherwise this may result in unreasonable ndoe expansion."),!1),wMt),ktt),nbn(sMt)))),a2(n,I4n,A4n,null),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,O4n),""),"Target Width"),"Option to place the rectangles in the given target width instead of approximating the width using the desired aspect ratio. The padding is not included in this. Meaning a drawing will have width of targetwidth + horizontal padding."),-1),dMt),Ptt),nbn(sMt)))),NXn((new Af,n))},vX(j4n,"RectPackingMetaDataProvider",856),wAn(1004,1,QYn,Af),MWn.Qe=function(n){NXn(n)},vX(j4n,"RectPackingOptions",1004),wAn(1005,1,{},Za),MWn.$e=function(){return new Wa},MWn._e=function(n){},vX(j4n,"RectPackingOptions/RectpackingFactory",1005),wAn(1257,1,{},m3),MWn.a=0,MWn.b=!1,MWn.c=0,MWn.d=0,MWn.e=!1,MWn.f=!1,MWn.g=0,vX("org.eclipse.elk.alg.rectpacking.seconditeration","RowFillingAndCompaction",1257),wAn(187,1,{187:1},asn),MWn.a=0,MWn.c=!1,MWn.d=0,MWn.e=0,MWn.f=0,MWn.g=0,MWn.i=0,MWn.k=!1,MWn.o=RQn,MWn.p=RQn,MWn.r=0,MWn.s=0,MWn.t=0,vX(L4n,"Block",187),wAn(211,1,{211:1},RJ),MWn.a=0,MWn.b=0,MWn.d=0,MWn.e=0,MWn.f=0,vX(L4n,"BlockRow",211),wAn(443,1,{443:1},KJ),MWn.b=0,MWn.c=0,MWn.d=0,MWn.e=0,MWn.f=0,vX(L4n,"BlockStack",443),wAn(220,1,{220:1},eq,awn),MWn.a=0,MWn.b=0,MWn.c=0,MWn.d=0,MWn.e=0;var xEt,DEt,REt,KEt,_Et,FEt=vX(L4n,"DrawingData",220);wAn(355,22,{3:1,35:1,22:1,355:1},jC);var BEt,HEt,qEt,GEt,zEt=Ben(L4n,"DrawingDataDescriptor",355,Unt,N5,HF);wAn(200,1,{200:1},x0),MWn.b=0,MWn.c=0,MWn.e=0,MWn.f=0,vX(L4n,"RectRow",200),wAn(756,1,{},Ehn),MWn.j=0,vX(x4n,g1n,756),wAn(1245,1,{},nu),MWn.Je=function(n){return W8(n.a,n.b)},vX(x4n,p1n,1245),wAn(1246,1,{},dg),MWn.Je=function(n){return p6(this.a,n)},vX(x4n,v1n,1246),wAn(1247,1,{},gg),MWn.Je=function(n){return Opn(this.a,n)},vX(x4n,m1n,1247),wAn(1248,1,{},pg),MWn.Je=function(n){return uon(this.a,n)},vX(x4n,"ElkGraphImporter/lambda$3$Type",1248),wAn(1249,1,{},vg),MWn.Je=function(n){return iOn(this.a,n)},vX(x4n,y1n,1249),wAn(1133,209,NJn,$E),MWn.Ze=function(n,t){var e,i,r,c,a,u,o,s,h,f;for(P8(n,(MMn(),kTt))&&(f=SD(ZAn(n,(Bvn(),qTt))),(c=XRn(cin(),f))&&BB(sJ(c.f),209).Ze(n,mcn(t,1))),Ypn(n,gTt,($6(),ZEt)),Ypn(n,pTt,($Sn(),cTt)),Ypn(n,vTt,(Lun(),WTt)),a=BB(ZAn(n,(Bvn(),_Tt)),19).a,OTn(t,"Overlap removal",1),qy(TD(ZAn(n,KTt))),o=new mg(u=new Rv),e=GXn(i=new Ehn,n),s=!0,r=0;r<a&&s;){if(qy(TD(ZAn(n,FTt)))){if(u.a.$b(),HPn(new I$(o),e.i),0==u.a.gc())break;e.e=u}for(h2(this.b),CU(this.b,(Pbn(),HEt),(OM(),GTt)),CU(this.b,qEt,e.g),CU(this.b,GEt,(IM(),QEt)),this.a=$qn(this.b,e),h=new Wb(this.a);h.a<h.c.c.length;)BB(n0(h),51).pf(e,mcn(t,1));cjn(i,e),s=qy(TD(mMn(e,(Xcn(),Yrt)))),++r}DGn(i,e),HSn(t)},vX(x4n,"OverlapRemovalLayoutProvider",1133),wAn(1134,1,{},mg),vX(x4n,"OverlapRemovalLayoutProvider/lambda$0$Type",1134),wAn(437,22,{3:1,35:1,22:1,437:1},EC);var UEt,XEt,WEt=Ben(x4n,"SPOrEPhases",437,Unt,B1,qF);wAn(1255,1,{},LE),vX(x4n,"ShrinkTree",1255),wAn(1135,209,NJn,Zm),MWn.Ze=function(n,t){var e,i,r,c;P8(n,(MMn(),kTt))&&(c=SD(ZAn(n,kTt)),(r=XRn(cin(),c))&&BB(sJ(r.f),209).Ze(n,mcn(t,1))),e=GXn(i=new Ehn,n),$Ln(this.a,e,mcn(t,1)),DGn(i,e)},vX(x4n,"ShrinkTreeLayoutProvider",1135),wAn(300,134,{3:1,300:1,94:1,134:1},DJ),MWn.c=!1,vX("org.eclipse.elk.alg.spore.graph","Graph",300),wAn(482,22,{3:1,35:1,22:1,482:1,246:1,234:1},LM),MWn.Kf=function(){return esn(this)},MWn.Xf=function(){return esn(this)};var VEt,QEt,YEt=Ben(D4n,FJn,482,Unt,KV,GF);wAn(551,22,{3:1,35:1,22:1,551:1,246:1,234:1},vD),MWn.Kf=function(){return new ru},MWn.Xf=function(){return new ru};var JEt,ZEt,nTt,tTt=Ben(D4n,"OverlapRemovalStrategy",551,Unt,_V,zF);wAn(430,22,{3:1,35:1,22:1,430:1},TC);var eTt,iTt,rTt,cTt,aTt,uTt,oTt=Ben(D4n,"RootSelection",430,Unt,iJ,UF);wAn(316,22,{3:1,35:1,22:1,316:1},MC);var sTt,hTt,fTt,lTt,bTt,wTt,dTt,gTt,pTt,vTt,mTt,yTt,kTt,jTt,ETt,TTt,MTt,STt,PTt,CTt,ITt,OTt,ATt,$Tt,LTt,NTt,xTt,DTt,RTt,KTt,_Tt,FTt,BTt,HTt,qTt,GTt,zTt=Ben(D4n,"SpanningTreeCostFunction",316,Unt,A5,XF);wAn(1002,1,QYn,Ef),MWn.Qe=function(n){yHn(n)},vX(D4n,"SporeCompactionOptions",1002),wAn(1003,1,{},tu),MWn.$e=function(){return new Zm},MWn._e=function(n){},vX(D4n,"SporeCompactionOptions/SporeCompactionFactory",1003),wAn(855,1,QYn,Tf),MWn.Qe=function(n){Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,K4n),""),"Underlying Layout Algorithm"),"A layout algorithm that is applied to the graph before it is compacted. If this is null, nothing is applied before compaction."),(PPn(),yMt)),Qtt),nbn((rpn(),hMt))))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,q4n),"structure"),"Structure Extraction Strategy"),"This option defines what kind of triangulation or other partitioning of the plane is applied to the vertices."),DTt),gMt),VTt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,_4n),W4n),"Tree Construction Strategy"),"Whether a minimum spanning tree or a maximum spanning tree should be constructed."),NTt),gMt),YTt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,F4n),W4n),"Cost Function for Spanning Tree"),"The cost function is used in the creation of the spanning tree."),$Tt),gMt),zTt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,B4n),W4n),"Root node for spanning tree construction"),"The identifier of the node that is preferred as the root of the spanning tree. If this is null, the first node is chosen."),null),yMt),Qtt),nbn(hMt)))),a2(n,B4n,H4n,CTt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,H4n),W4n),"Root selection for spanning tree"),"This sets the method used to select a root node for the construction of a spanning tree"),OTt),gMt),oTt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,G4n),E2n),"Compaction Strategy"),"This option defines how the compaction is applied."),ETt),gMt),YEt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,z4n),E2n),"Orthogonal Compaction"),"Restricts the translation of nodes to orthogonal directions in the compaction phase."),(hN(),!1)),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,U4n),V4n),"Upper limit for iterations of overlap removal"),null),iln(64)),vMt),Att),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,X4n),V4n),"Whether to run a supplementary scanline overlap check."),null),!0),wMt),ktt),nbn(hMt)))),AKn((new Mf,n)),yHn((new Ef,n))},vX(D4n,"SporeMetaDataProvider",855),wAn(VVn,1,QYn,Mf),MWn.Qe=function(n){AKn(n)},vX(D4n,"SporeOverlapRemovalOptions",VVn),wAn(1001,1,{},eu),MWn.$e=function(){return new $E},MWn._e=function(n){},vX(D4n,"SporeOverlapRemovalOptions/SporeOverlapFactory",1001),wAn(530,22,{3:1,35:1,22:1,530:1,246:1,234:1},XW),MWn.Kf=function(){return isn(this)},MWn.Xf=function(){return isn(this)};var UTt,XTt,WTt,VTt=Ben(D4n,"StructureExtractionStrategy",530,Unt,FV,WF);wAn(429,22,{3:1,35:1,22:1,429:1,246:1,234:1},SC),MWn.Kf=function(){return wwn(this)},MWn.Xf=function(){return wwn(this)};var QTt,YTt=Ben(D4n,"TreeConstructionStrategy",429,Unt,eJ,VF);wAn(1443,1,E3n,iu),MWn.Yf=function(n){return BB(n,300),new B2},MWn.pf=function(n,t){Tjn(BB(n,300),t)},vX(Y4n,"DelaunayTriangulationPhase",1443),wAn(1444,1,lVn,yg),MWn.td=function(n){WB(this.a,BB(n,65).a)},vX(Y4n,"DelaunayTriangulationPhase/lambda$0$Type",1444),wAn(783,1,E3n,Vm),MWn.Yf=function(n){return BB(n,300),new B2},MWn.pf=function(n,t){this.ng(BB(n,300),t)},MWn.ng=function(n,t){var e;OTn(t,"Minimum spanning tree construction",1),e=n.d?n.d.a:BB(xq(n.i,0),65).a,Kun(this,(qy(TD(mMn(n,(Xcn(),Qrt)))),YHn(n.e,e,n.b)),n),HSn(t)},vX(J4n,"MinSTPhase",783),wAn(1446,783,E3n,ym),MWn.ng=function(n,t){var e,i;OTn(t,"Maximum spanning tree construction",1),e=new kg(n),i=n.d?n.d.c:BB(xq(n.i,0),65).c,Kun(this,(qy(TD(mMn(n,(Xcn(),Qrt)))),YHn(n.e,i,e)),n),HSn(t)},vX(J4n,"MaxSTPhase",1446),wAn(1447,1,{},kg),MWn.Je=function(n){return IC(this.a,n)},vX(J4n,"MaxSTPhase/lambda$0$Type",1447),wAn(1445,1,lVn,jg),MWn.td=function(n){R$(this.a,BB(n,65))},vX(J4n,"MinSTPhase/lambda$0$Type",1445),wAn(785,1,E3n,ru),MWn.Yf=function(n){return BB(n,300),new B2},MWn.pf=function(n,t){WTn(this,BB(n,300),t)},MWn.a=!1,vX(Z4n,"GrowTreePhase",785),wAn(786,1,lVn,EB),MWn.td=function(n){eun(this.a,this.b,this.c,BB(n,221))},vX(Z4n,"GrowTreePhase/lambda$0$Type",786),wAn(1448,1,E3n,cu),MWn.Yf=function(n){return BB(n,300),new B2},MWn.pf=function(n,t){tmn(this,BB(n,300),t)},vX(Z4n,"ShrinkTreeCompactionPhase",1448),wAn(784,1,lVn,TB),MWn.td=function(n){lAn(this.a,this.b,this.c,BB(n,221))},vX(Z4n,"ShrinkTreeCompactionPhase/lambda$0$Type",784);var JTt,ZTt,nMt=bq(y3n,"IGraphElementVisitor");wAn(860,1,{527:1},R0),MWn.og=function(n){var t;qan(t=hRn(this,n),BB(RX(this.b,n),94)),yLn(this,n,t)},vX(xJn,"LayoutConfigurator",860);var tMt,eMt,iMt,rMt=bq(xJn,"LayoutConfigurator/IPropertyHolderOptionFilter");wAn(932,1,{1933:1},au),MWn.pg=function(n,t){return Nun(),!n.Xe(t)},vX(xJn,"LayoutConfigurator/lambda$0$Type",932),wAn(933,1,{1933:1},uu),MWn.pg=function(n,t){return SE(n,t)},vX(xJn,"LayoutConfigurator/lambda$1$Type",933),wAn(931,1,{831:1},ou),MWn.qg=function(n,t){return Nun(),!n.Xe(t)},vX(xJn,"LayoutConfigurator/lambda$2$Type",931),wAn(934,1,DVn,LC),MWn.Mb=function(n){return YW(this.a,this.b,BB(n,1933))},vX(xJn,"LayoutConfigurator/lambda$3$Type",934),wAn(858,1,{},su),vX(xJn,"RecursiveGraphLayoutEngine",858),wAn(296,60,BVn,kv,rk),vX(xJn,"UnsupportedConfigurationException",296),wAn(453,60,BVn,ck),vX(xJn,"UnsupportedGraphException",453),wAn(754,1,{}),vX(y3n,"AbstractRandomListAccessor",754),wAn(500,754,{},CNn),MWn.rg=function(){return null},MWn.d=!0,MWn.e=!0,MWn.f=0,vX(t5n,"AlgorithmAssembler",500),wAn(1236,1,DVn,hu),MWn.Mb=function(n){return!!BB(n,123)},vX(t5n,"AlgorithmAssembler/lambda$0$Type",1236),wAn(1237,1,{},Eg),MWn.Kb=function(n){return bj(this.a,BB(n,123))},vX(t5n,"AlgorithmAssembler/lambda$1$Type",1237),wAn(1238,1,DVn,fu),MWn.Mb=function(n){return!!BB(n,80)},vX(t5n,"AlgorithmAssembler/lambda$2$Type",1238),wAn(1239,1,lVn,Tg),MWn.td=function(n){Jcn(this.a,BB(n,80))},vX(t5n,"AlgorithmAssembler/lambda$3$Type",1239),wAn(1240,1,lVn,NC),MWn.td=function(n){Dx(this.a,this.b,BB(n,234))},vX(t5n,"AlgorithmAssembler/lambda$4$Type",1240),wAn(1355,1,MYn,lu),MWn.ue=function(n,t){return FQ(BB(n,234),BB(t,234))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(t5n,"EnumBasedFactoryComparator",1355),wAn(80,754,{80:1},B2),MWn.rg=function(){return new Rv},MWn.a=0,vX(t5n,"LayoutProcessorConfiguration",80),wAn(1013,1,{527:1},$f),MWn.og=function(n){nan(eMt,new Mg(n))},vX(zYn,"DeprecatedLayoutOptionReplacer",1013),wAn(1014,1,lVn,bu),MWn.td=function(n){N9(BB(n,160))},vX(zYn,"DeprecatedLayoutOptionReplacer/lambda$0$Type",1014),wAn(1015,1,lVn,wu),MWn.td=function(n){Twn(BB(n,160))},vX(zYn,"DeprecatedLayoutOptionReplacer/lambda$1$Type",1015),wAn(1016,1,{},Mg),MWn.Od=function(n,t){Rx(this.a,BB(n,146),BB(t,38))},vX(zYn,"DeprecatedLayoutOptionReplacer/lambda$2$Type",1016),wAn(149,1,{686:1,149:1},MTn),MWn.Fb=function(n){return j5(this,n)},MWn.sg=function(){return this.b},MWn.tg=function(){return this.c},MWn.ne=function(){return this.e},MWn.Hb=function(){return vvn(this.c)},MWn.Ib=function(){return"Layout Algorithm: "+this.c};var cMt,aMt=vX(zYn,"LayoutAlgorithmData",149);wAn(263,1,{},du),vX(zYn,"LayoutAlgorithmData/Builder",263),wAn(1017,1,{527:1},gu),MWn.og=function(n){cL(n,239)&&!qy(TD(n.We((sWn(),zSt))))&&KFn(BB(n,33))},vX(zYn,"LayoutAlgorithmResolver",1017),wAn(229,1,{686:1,229:1},UZ),MWn.Fb=function(n){return!!cL(n,229)&&mK(this.b,BB(n,229).b)},MWn.sg=function(){return this.a},MWn.tg=function(){return this.b},MWn.ne=function(){return this.d},MWn.Hb=function(){return vvn(this.b)},MWn.Ib=function(){return"Layout Type: "+this.b},vX(zYn,"LayoutCategoryData",229),wAn(344,1,{},pu),vX(zYn,"LayoutCategoryData/Builder",344),wAn(867,1,{},ORn),vX(zYn,"LayoutMetaDataService",867),wAn(868,1,{},UX),vX(zYn,"LayoutMetaDataService/Registry",868),wAn(478,1,{478:1},vu),vX(zYn,"LayoutMetaDataService/Registry/Triple",478),wAn(869,1,e5n,mu),MWn.ug=function(){return new Gj},vX(zYn,"LayoutMetaDataService/lambda$0$Type",869),wAn(870,1,i5n,yu),MWn.vg=function(n){return B$(BB(n,8))},vX(zYn,"LayoutMetaDataService/lambda$1$Type",870),wAn(879,1,e5n,ku),MWn.ug=function(){return new Np},vX(zYn,"LayoutMetaDataService/lambda$10$Type",879),wAn(880,1,i5n,ju),MWn.vg=function(n){return new t_(BB(n,12))},vX(zYn,"LayoutMetaDataService/lambda$11$Type",880),wAn(881,1,e5n,Eu),MWn.ug=function(){return new YT},vX(zYn,"LayoutMetaDataService/lambda$12$Type",881),wAn(882,1,i5n,Tu),MWn.vg=function(n){return zB(BB(n,68))},vX(zYn,"LayoutMetaDataService/lambda$13$Type",882),wAn(883,1,e5n,Mu),MWn.ug=function(){return new Rv},vX(zYn,"LayoutMetaDataService/lambda$14$Type",883),wAn(884,1,i5n,Su),MWn.vg=function(n){return JQ(BB(n,53))},vX(zYn,"LayoutMetaDataService/lambda$15$Type",884),wAn(885,1,e5n,Pu),MWn.ug=function(){return new fA},vX(zYn,"LayoutMetaDataService/lambda$16$Type",885),wAn(886,1,i5n,Cu),MWn.vg=function(n){return S4(BB(n,53))},vX(zYn,"LayoutMetaDataService/lambda$17$Type",886),wAn(887,1,e5n,Iu),MWn.ug=function(){return new zv},vX(zYn,"LayoutMetaDataService/lambda$18$Type",887),wAn(888,1,i5n,Ou),MWn.vg=function(n){return GB(BB(n,208))},vX(zYn,"LayoutMetaDataService/lambda$19$Type",888),wAn(871,1,e5n,Au),MWn.ug=function(){return new km},vX(zYn,"LayoutMetaDataService/lambda$2$Type",871),wAn(872,1,i5n,$u),MWn.vg=function(n){return new Kj(BB(n,74))},vX(zYn,"LayoutMetaDataService/lambda$3$Type",872),wAn(873,1,e5n,Lu),MWn.ug=function(){return new lm},vX(zYn,"LayoutMetaDataService/lambda$4$Type",873),wAn(874,1,i5n,Nu),MWn.vg=function(n){return new A_(BB(n,142))},vX(zYn,"LayoutMetaDataService/lambda$5$Type",874),wAn(875,1,e5n,Du),MWn.ug=function(){return new bm},vX(zYn,"LayoutMetaDataService/lambda$6$Type",875),wAn(876,1,i5n,Ru),MWn.vg=function(n){return new O_(BB(n,116))},vX(zYn,"LayoutMetaDataService/lambda$7$Type",876),wAn(877,1,e5n,Ku),MWn.ug=function(){return new Yu},vX(zYn,"LayoutMetaDataService/lambda$8$Type",877),wAn(878,1,i5n,_u),MWn.vg=function(n){return new rnn(BB(n,373))},vX(zYn,"LayoutMetaDataService/lambda$9$Type",878);var uMt,oMt,sMt,hMt,fMt,lMt=bq(IJn,"IProperty");wAn(23,1,{35:1,686:1,23:1,146:1},bPn),MWn.wd=function(n){return gL(this,BB(n,146))},MWn.Fb=function(n){return cL(n,23)?mK(this.f,BB(n,23).f):cL(n,146)&&mK(this.f,BB(n,146).tg())},MWn.wg=function(){var n;if(cL(this.b,4)){if(null==(n=Jdn(this.b)))throw Hp(new Fy(o5n+this.f+"'. Make sure it's type is registered with the "+(ED(bAt),bAt.k)+c5n));return n}return this.b},MWn.sg=function(){return this.d},MWn.tg=function(){return this.f},MWn.ne=function(){return this.i},MWn.Hb=function(){return vvn(this.f)},MWn.Ib=function(){return"Layout Option: "+this.f},vX(zYn,"LayoutOptionData",23),wAn(24,1,{},Fu),vX(zYn,"LayoutOptionData/Builder",24),wAn(175,22,{3:1,35:1,22:1,175:1},AC);var bMt,wMt,dMt,gMt,pMt,vMt,mMt,yMt,kMt,jMt=Ben(zYn,"LayoutOptionData/Target",175,Unt,O5,QF);wAn(277,22,{3:1,35:1,22:1,277:1},$C);var EMt,TMt,MMt,SMt=Ben(zYn,"LayoutOptionData/Type",277,Unt,_tn,YF);wAn(110,1,{110:1},bA,UV,gY),MWn.Fb=function(n){var t;return!(null==n||!cL(n,110))&&(t=BB(n,110),cV(this.c,t.c)&&cV(this.d,t.d)&&cV(this.b,t.b)&&cV(this.a,t.a))},MWn.Hb=function(){return fhn(Pun(Gk(Ant,1),HWn,1,5,[this.c,this.d,this.b,this.a]))},MWn.Ib=function(){return"Rect[x="+this.c+",y="+this.d+",w="+this.b+",h="+this.a+"]"},MWn.a=0,MWn.b=0,MWn.c=0,MWn.d=0,vX(f1n,"ElkRectangle",110),wAn(8,1,{3:1,4:1,8:1,414:1},Gj,XZ,xC,wA),MWn.Fb=function(n){return nrn(this,n)},MWn.Hb=function(){return VO(this.a)+byn(VO(this.b))},MWn.Jf=function(n){var t,e,i;for(e=0;e<n.length&&xhn((b1(e,n.length),n.charCodeAt(e)),o1n);)++e;for(t=n.length;t>0&&xhn((b1(t-1,n.length),n.charCodeAt(t-1)),s1n);)--t;if(e>=t)throw Hp(new _y("The given string does not contain any numbers."));if(2!=(i=kKn(n.substr(e,t-e),",|;|\r|\n")).length)throw Hp(new _y("Exactly two numbers are expected, "+i.length+" were found."));try{this.a=bSn(RMn(i[0])),this.b=bSn(RMn(i[1]))}catch(r){throw cL(r=lun(r),127)?Hp(new _y(h1n+r)):Hp(r)}},MWn.Ib=function(){return"("+this.a+","+this.b+")"},MWn.a=0,MWn.b=0;var PMt=vX(f1n,"KVector",8);wAn(74,68,{3:1,4:1,20:1,28:1,52:1,14:1,68:1,15:1,74:1,414:1},km,Kj,Ux),MWn.Pc=function(){return Vsn(this)},MWn.Jf=function(n){var t,e,i,r,c;e=kKn(n,",|;|\\(|\\)|\\[|\\]|\\{|\\}| |\t|\n"),yQ(this);try{for(t=0,r=0,i=0,c=0;t<e.length;)null!=e[t]&&RMn(e[t]).length>0&&(r%2==0?i=bSn(e[t]):c=bSn(e[t]),r>0&&r%2!=0&&DH(this,new xC(i,c)),++r),++t}catch(a){throw cL(a=lun(a),127)?Hp(new _y("The given string does not match the expected format for vectors."+a)):Hp(a)}},MWn.Ib=function(){var n,t,e;for(n=new lN("("),t=spn(this,0);t.b!=t.d.c;)oO(n,(e=BB(b3(t),8)).a+","+e.b),t.b!=t.d.c&&(n.a+="; ");return(n.a+=")",n).a};var CMt,IMt,OMt,AMt,$Mt,LMt,NMt=vX(f1n,"KVectorChain",74);wAn(248,22,{3:1,35:1,22:1,248:1},DC);var xMt,DMt,RMt,KMt,_Mt,FMt,BMt,HMt,qMt,GMt,zMt,UMt,XMt,WMt,VMt,QMt,YMt,JMt,ZMt,nSt=Ben(h5n,"Alignment",248,Unt,J8,JF);wAn(979,1,QYn,Lf),MWn.Qe=function(n){G_n(n)},vX(h5n,"BoxLayouterOptions",979),wAn(980,1,{},xu),MWn.$e=function(){return new Gu},MWn._e=function(n){},vX(h5n,"BoxLayouterOptions/BoxFactory",980),wAn(291,22,{3:1,35:1,22:1,291:1},RC);var tSt,eSt,iSt,rSt,cSt,aSt,uSt,oSt,sSt,hSt,fSt,lSt,bSt,wSt,dSt,gSt,pSt,vSt,mSt,ySt,kSt,jSt,ESt,TSt,MSt,SSt,PSt,CSt,ISt,OSt,ASt,$St,LSt,NSt,xSt,DSt,RSt,KSt,_St,FSt,BSt,HSt,qSt,GSt,zSt,USt,XSt,WSt,VSt,QSt,YSt,JSt,ZSt,nPt,tPt,ePt,iPt,rPt,cPt,aPt,uPt,oPt,sPt,hPt,fPt,lPt,bPt,wPt,dPt,gPt,pPt,vPt,mPt,yPt,kPt,jPt,EPt,TPt,MPt,SPt,PPt,CPt,IPt,OPt,APt,$Pt,LPt,NPt,xPt,DPt,RPt,KPt,_Pt,FPt,BPt,HPt,qPt=Ben(h5n,"ContentAlignment",291,Unt,Y8,ZF);wAn(684,1,QYn,Nf),MWn.Qe=function(n){Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,w5n),""),"Layout Algorithm"),"Select a specific layout algorithm."),(PPn(),yMt)),Qtt),nbn((rpn(),hMt))))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,d5n),""),"Resolved Layout Algorithm"),"Meta data associated with the selected algorithm."),mMt),aMt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,W2n),""),"Alignment"),"Alignment of the selected node relative to other nodes; the exact meaning depends on the used algorithm."),rSt),gMt),nSt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,VJn),""),"Aspect Ratio"),"The desired aspect ratio of the drawing, that is the quotient of width by height."),dMt),Ptt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,g5n),""),"Bend Points"),"A fixed list of bend points for the edge. This is used by the 'Fixed Layout' algorithm to specify a pre-defined routing for an edge. The vector chain must include the source point, any bend points, and the target point, so it must have at least two points."),mMt),NMt),nbn(uMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,u3n),""),"Content Alignment"),"Specifies how the content of a node are aligned. Each node can individually control the alignment of its contents. I.e. if a node should be aligned top left in its parent node, the parent node should specify that option."),fSt),pMt),qPt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,X2n),""),"Debug Mode"),"Whether additional debug information shall be generated."),(hN(),!1)),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,J2n),""),TJn),"Overall direction of edges: horizontal (right / left) or vertical (down / up)."),wSt),gMt),WPt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,y2n),""),"Edge Routing"),"What kind of edge routing style should be applied for the content of a parent node. Algorithms may also set this option to single edges in order to mark them as splines. The bend point list of edges with this option set to SPLINES must be interpreted as control points for a piecewise cubic spline."),mSt),gMt),oCt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,A4n),""),"Expand Nodes"),"If active, nodes are expanded to fill the area of their parent."),!1),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,d2n),""),"Hierarchy Handling"),"Determines whether separate layout runs are triggered for different compound nodes in a hierarchical graph. Setting a node's hierarchy handling to `INCLUDE_CHILDREN` will lay out that node and all of its descendants in a single layout run, until a descendant is encountered which has its hierarchy handling set to `SEPARATE_CHILDREN`. In general, `SEPARATE_CHILDREN` will ensure that a new layout run is triggered for a node with that setting. Including multiple levels of hierarchy in a single layout run may allow cross-hierarchical edges to be laid out properly. If the root node is set to `INHERIT` (or not set at all), the default behavior is `SEPARATE_CHILDREN`."),TSt),gMt),SCt),EG(hMt,Pun(Gk(jMt,1),$Vn,175,0,[sMt]))))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,QJn),""),"Padding"),"The padding to be left to a parent element's border when placing child elements. This can also serve as an output option of a layout algorithm if node size calculation is setup appropriately."),WSt),mMt),_ut),EG(hMt,Pun(Gk(jMt,1),$Vn,175,0,[sMt]))))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,jZn),""),"Interactive"),"Whether the algorithm should be run in interactive mode for the content of a parent node. What this means exactly depends on how the specific algorithm interprets this option. Usually in the interactive mode algorithms try to modify the current layout as little as possible."),!1),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,m3n),""),"interactive Layout"),"Whether the graph should be changeable interactively and by setting constraints"),!1),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,MZn),""),"Omit Node Micro Layout"),"Node micro layout comprises the computation of node dimensions (if requested), the placement of ports and their labels, and the placement of node labels. The functionality is implemented independent of any specific layout algorithm and shouldn't have any negative impact on the layout algorithm's performance itself. Yet, if any unforeseen behavior occurs, this option allows to deactivate the micro layout."),!1),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,EZn),""),"Port Constraints"),"Defines constraints of the position of the ports of a node."),oPt),gMt),aIt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,g3n),""),"Position"),"The position of a node, port, or label. This is used by the 'Fixed Layout' algorithm to specify a pre-defined position."),mMt),PMt),EG(sMt,Pun(Gk(jMt,1),$Vn,175,0,[fMt,oMt]))))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,pZn),""),"Priority"),"Defines the priority of an object; its meaning depends on the specific layout algorithm and the context where it is used."),vMt),Att),EG(sMt,Pun(Gk(jMt,1),$Vn,175,0,[uMt]))))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,yZn),""),"Randomization Seed"),"Seed used for pseudo-random number generators to control the layout algorithm. If the value is 0, the seed shall be determined pseudo-randomly (e.g. from the system time)."),vMt),Att),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,kZn),""),"Separate Connected Components"),"Whether each connected component should be processed separately."),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,o3n),""),"Junction Points"),"This option is not used as option, but as output of the layout algorithms. It is attached to edges and determines the points where junction symbols should be drawn in order to represent hyperedges with orthogonal routing. Whether such points are computed depends on the chosen layout algorithm and edge routing style. The points are put into the vector chain with no specific order."),ASt),mMt),NMt),nbn(uMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,f3n),""),"Comment Box"),"Whether the node should be regarded as a comment box instead of a regular node. In that case its placement should be similar to how labels are handled. Any edges incident to a comment box specify to which graph elements the comment is related."),!1),wMt),ktt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,l3n),""),"Hypernode"),"Whether the node should be handled as a hypernode."),!1),wMt),ktt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,p5n),""),"Label Manager"),"Label managers can shorten labels upon a layout algorithm's request."),mMt),KNt),EG(hMt,Pun(Gk(jMt,1),$Vn,175,0,[oMt]))))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,p3n),""),"Margins"),"Margins define additional space around the actual bounds of a graph element. For instance, ports or labels being placed on the outside of a node's border might introduce such a margin. The margin is used to guarantee non-overlap of other graph elements with those ports or labels."),LSt),mMt),Eut),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,z2n),""),"No Layout"),"No layout is done for the associated element. This is used to mark parts of a diagram to avoid their inclusion in the layout graph, or to mark parts of the layout graph to prevent layout engines from processing them. If you wish to exclude the contents of a compound node from automatic layout, while the node itself is still considered on its own layer, use the 'Fixed Layout' algorithm for that node."),!1),wMt),ktt),EG(sMt,Pun(Gk(jMt,1),$Vn,175,0,[uMt,fMt,oMt]))))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,v5n),""),"Scale Factor"),"The scaling factor to be applied to the corresponding node in recursive layout. It causes the corresponding node's size to be adjusted, and its ports and labels to be sized and placed accordingly after the layout of that node has been determined (and before the node itself and its siblings are arranged). The scaling is not reverted afterwards, so the resulting layout graph contains the adjusted size and position data. This option is currently not supported if 'Layout Hierarchy' is set."),1),dMt),Ptt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,m5n),""),"Animate"),"Whether the shift from the old layout to the new computed layout shall be animated."),!0),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,y5n),""),"Animation Time Factor"),"Factor for computation of animation time. The higher the value, the longer the animation time. If the value is 0, the resulting time is always equal to the minimum defined by 'Minimal Animation Time'."),iln(100)),vMt),Att),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,k5n),""),"Layout Ancestors"),"Whether the hierarchy levels on the path from the selected element to the root of the diagram shall be included in the layout process."),!1),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,j5n),""),"Maximal Animation Time"),"The maximal time for animations, in milliseconds."),iln(4e3)),vMt),Att),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,E5n),""),"Minimal Animation Time"),"The minimal time for animations, in milliseconds."),iln(400)),vMt),Att),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,T5n),""),"Progress Bar"),"Whether a progress bar shall be displayed during layout computations."),!1),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,M5n),""),"Validate Graph"),"Whether the graph shall be validated before any layout algorithm is applied. If this option is enabled and at least one error is found, the layout process is aborted and a message is shown to the user."),!1),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,S5n),""),"Validate Options"),"Whether layout options shall be validated before any layout algorithm is applied. If this option is enabled and at least one error is found, the layout process is aborted and a message is shown to the user."),!0),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,P5n),""),"Zoom to Fit"),"Whether the zoom level shall be set to view the whole diagram after layout."),!1),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,b5n),"box"),"Box Layout Mode"),"Configures the packing mode used by the {@link BoxLayoutProvider}. If SIMPLE is not required (neither priorities are used nor the interactive mode), GROUP_DEC can improve the packing and decrease the area. GROUP_MIXED and GROUP_INC may, in very specific scenarios, work better."),oSt),gMt),cOt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,L2n),k2n),"Comment Comment Spacing"),"Spacing to be preserved between a comment box and other comment boxes connected to the same node. The space left between comment boxes of different nodes is controlled by the node-node spacing."),10),dMt),Ptt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,N2n),k2n),"Comment Node Spacing"),"Spacing to be preserved between a node and its connected comment boxes. The space left between a node and the comments of another node is controlled by the node-node spacing."),10),dMt),Ptt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,XJn),k2n),"Components Spacing"),"Spacing to be preserved between pairs of connected components. This option is only relevant if 'separateConnectedComponents' is activated."),20),dMt),Ptt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,x2n),k2n),"Edge Spacing"),"Spacing to be preserved between any two edges. Note that while this can somewhat easily be satisfied for the segments of orthogonally drawn edges, it is harder for general polylines or splines."),10),dMt),Ptt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,mZn),k2n),"Edge Label Spacing"),"The minimal distance to be preserved between a label and the edge it is associated with. Note that the placement of a label is influenced by the 'edgelabels.placement' option."),2),dMt),Ptt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,D2n),k2n),"Edge Node Spacing"),"Spacing to be preserved between nodes and edges."),10),dMt),Ptt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,R2n),k2n),"Label Spacing"),"Determines the amount of space to be left between two labels of the same graph element."),0),dMt),Ptt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,F2n),k2n),"Label Node Spacing"),"Spacing to be preserved between labels and the border of node they are associated with. Note that the placement of a label is influenced by the 'nodelabels.placement' option."),5),dMt),Ptt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,K2n),k2n),"Horizontal spacing between Label and Port"),"Horizontal spacing to be preserved between labels and the ports they are associated with. Note that the placement of a label is influenced by the 'portlabels.placement' option."),1),dMt),Ptt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,_2n),k2n),"Vertical spacing between Label and Port"),"Vertical spacing to be preserved between labels and the ports they are associated with. Note that the placement of a label is influenced by the 'portlabels.placement' option."),1),dMt),Ptt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,vZn),k2n),"Node Spacing"),"The minimal distance to be preserved between each two nodes."),20),dMt),Ptt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,B2n),k2n),"Node Self Loop Spacing"),"Spacing to be preserved between a node and its self loops."),10),dMt),Ptt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,H2n),k2n),"Port Spacing"),"Spacing between pairs of ports of the same node."),10),dMt),Ptt),EG(hMt,Pun(Gk(jMt,1),$Vn,175,0,[sMt]))))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,q2n),k2n),"Individual Spacing"),"Allows to specify individual spacing values for graph elements that shall be different from the value specified for the element's parent."),mMt),hOt),EG(sMt,Pun(Gk(jMt,1),$Vn,175,0,[uMt,fMt,oMt]))))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,v3n),k2n),"Additional Port Space"),"Additional space around the sets of ports on each node side. For each side of a node, this option can reserve additional space before and after the ports on each side. For example, a top spacing of 20 makes sure that the first port on the western and eastern side is 20 units away from the northern border."),DPt),mMt),Eut),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,d3n),A5n),"Layout Partition"),"Partition to which the node belongs. This requires Layout Partitioning to be active. Nodes with lower partition IDs will appear to the left of nodes with higher partition IDs (assuming a left-to-right layout direction)."),vMt),Att),EG(hMt,Pun(Gk(jMt,1),$Vn,175,0,[sMt]))))),a2(n,d3n,w3n,JSt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,w3n),A5n),"Layout Partitioning"),"Whether to activate partitioned layout. This will allow to group nodes through the Layout Partition option. a pair of nodes with different partition indices is then placed such that the node with lower index is placed to the left of the other node (with left-to-right layout direction). Depending on the layout algorithm, this may only be guaranteed to work if all nodes have a layout partition configured, or at least if edges that cross partitions are not part of a partition-crossing cycle."),QSt),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,Z2n),$5n),"Node Label Padding"),"Define padding for node labels that are placed inside of a node."),xSt),mMt),_ut),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,CZn),$5n),"Node Label Placement"),"Hints for where node labels are to be placed; if empty, the node label's position is not modified."),RSt),pMt),GCt),EG(sMt,Pun(Gk(jMt,1),$Vn,175,0,[oMt]))))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,e3n),L5n),"Port Alignment"),"Defines the default port distribution for a node. May be overridden for each side individually."),nPt),gMt),JCt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,i3n),L5n),"Port Alignment (North)"),"Defines how ports on the northern side are placed, overriding the node's general port alignment."),gMt),JCt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,r3n),L5n),"Port Alignment (South)"),"Defines how ports on the southern side are placed, overriding the node's general port alignment."),gMt),JCt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,c3n),L5n),"Port Alignment (West)"),"Defines how ports on the western side are placed, overriding the node's general port alignment."),gMt),JCt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,a3n),L5n),"Port Alignment (East)"),"Defines how ports on the eastern side are placed, overriding the node's general port alignment."),gMt),JCt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,PZn),N5n),"Node Size Constraints"),"What should be taken into account when calculating a node's size. Empty size constraints specify that a node's size is already fixed and should not be changed."),_St),pMt),YIt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,SZn),N5n),"Node Size Options"),"Options modifying the behavior of the size constraints set on a node. Each member of the set specifies something that should be taken into account when calculating node sizes. The empty set corresponds to no further modifications."),GSt),pMt),iOt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,BZn),N5n),"Node Size Minimum"),"The minimal size to which a node can be reduced."),HSt),mMt),PMt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,Y2n),N5n),"Fixed Graph Size"),"By default, the fixed layout provider will enlarge a graph until it is large enough to contain its children. If this option is set, it won't do so."),!1),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,s3n),A2n),"Edge Label Placement"),"Gives a hint on where to put edge labels."),pSt),gMt),nCt),nbn(oMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,TZn),A2n),"Inline Edge Labels"),"If true, an edge label is placed directly on its edge. May only apply to center edge labels. This kind of label placement is only advisable if the label's rendering is such that it is not crossed by its edge and thus stays legible."),!1),wMt),ktt),nbn(oMt)))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,C5n),"font"),"Font Name"),"Font name used for a label."),yMt),Qtt),nbn(oMt)))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,I5n),"font"),"Font Size"),"Font size used for a label."),vMt),Att),nbn(oMt)))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,b3n),x5n),"Port Anchor Offset"),"The offset to the port position where connections shall be attached."),mMt),PMt),nbn(fMt)))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,h3n),x5n),"Port Index"),"The index of a port in the fixed order around a node. The order is assumed as clockwise, starting with the leftmost port on the top side. This option must be set if 'Port Constraints' is set to FIXED_ORDER and no specific positions are given for the ports. Additionally, the option 'Port Side' must be defined in this case."),vMt),Att),nbn(fMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,U2n),x5n),"Port Side"),"The side of a node on which a port is situated. This option must be set if 'Port Constraints' is set to FIXED_SIDE or FIXED_ORDER and no specific positions are given for the ports."),dPt),gMt),FIt),nbn(fMt)))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,G2n),x5n),"Port Border Offset"),"The offset of ports on the node border. With a positive offset the port is moved outside of the node, while with a negative offset the port is moved towards the inside. An offset of 0 means that the port is placed directly on the node border, i.e. if the port side is north, the port's south border touches the nodes's north border; if the port side is east, the port's west border touches the nodes's east border; if the port side is south, the port's north border touches the node's south border; if the port side is west, the port's east border touches the node's west border."),dMt),Ptt),nbn(fMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,IZn),D5n),"Port Label Placement"),"Decides on a placement method for port labels; if empty, the node label's position is not modified."),lPt),pMt),IIt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,n3n),D5n),"Port Labels Next to Port"),"Use 'portLabels.placement': NEXT_TO_PORT_OF_POSSIBLE."),!1),wMt),ktt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,t3n),D5n),"Treat Port Labels as Group"),"If this option is true (default), the labels of a port will be treated as a group when it comes to centering them next to their port. If this option is false, only the first label will be centered next to the port, with the others being placed below. This only applies to labels of eastern and western ports and will have no effect if labels are not placed next to their port."),!0),wMt),ktt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,V2n),R5n),"Activate Inside Self Loops"),"Whether this node allows to route self loops inside of it instead of around it. If set to true, this will make the node a compound node if it isn't already, and will require the layout algorithm to support compound nodes with hierarchical ports."),!1),wMt),ktt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,Q2n),R5n),"Inside Self Loop"),"Whether a self loop should be routed inside a node instead of around that node."),!1),wMt),ktt),nbn(uMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,WJn),"edge"),"Edge Thickness"),"The thickness of an edge. This is a hint on the line width used to draw an edge, possibly requiring more space to be reserved for it."),1),dMt),Ptt),nbn(uMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,O5n),"edge"),"Edge Type"),"The type of an edge. This is usually used for UML class diagrams, where associations must be handled differently from generalizations."),kSt),gMt),yCt),nbn(uMt)))),xM(n,new UZ(yj(jj(kj(new pu,w1n),"Layered"),'The layer-based method was introduced by Sugiyama, Tagawa and Toda in 1981. It emphasizes the direction of edges by pointing as many edges as possible into the same direction. The nodes are arranged in layers, which are sometimes called "hierarchies", and then reordered such that the number of edge crossings is minimized. Afterwards, concrete coordinates are computed for the nodes and edge bend points.'))),xM(n,new UZ(yj(jj(kj(new pu,"org.eclipse.elk.orthogonal"),"Orthogonal"),'Orthogonal methods that follow the "topology-shape-metrics" approach by Batini, Nardelli and Tamassia \'86. The first phase determines the topology of the drawing by applying a planarization technique, which results in a planar representation of the graph. The orthogonal shape is computed in the second phase, which aims at minimizing the number of edge bends, and is called orthogonalization. The third phase leads to concrete coordinates for nodes and edge bend points by applying a compaction method, thus defining the metrics.'))),xM(n,new UZ(yj(jj(kj(new pu,gZn),"Force"),"Layout algorithms that follow physical analogies by simulating a system of attractive and repulsive forces. The first successful method of this kind was proposed by Eades in 1984."))),xM(n,new UZ(yj(jj(kj(new pu,"org.eclipse.elk.circle"),"Circle"),"Circular layout algorithms emphasize cycles or biconnected components of a graph by arranging them in circles. This is useful if a drawing is desired where such components are clearly grouped, or where cycles are shown as prominent OPTIONS of the graph."))),xM(n,new UZ(yj(jj(kj(new pu,Y3n),"Tree"),"Specialized layout methods for trees, i.e. acyclic graphs. The regular structure of graphs that have no undirected cycles can be emphasized using an algorithm of this type."))),xM(n,new UZ(yj(jj(kj(new pu,"org.eclipse.elk.planar"),"Planar"),"Algorithms that require a planar or upward planar graph. Most of these algorithms are theoretically interesting, but not practically usable."))),xM(n,new UZ(yj(jj(kj(new pu,w4n),"Radial"),"Radial layout algorithms usually position the nodes of the graph on concentric circles."))),bKn((new xf,n)),G_n((new Lf,n)),RDn((new Df,n))},vX(h5n,"CoreOptions",684),wAn(103,22,{3:1,35:1,22:1,103:1},KC);var GPt,zPt,UPt,XPt,WPt=Ben(h5n,TJn,103,Unt,C5,eB);wAn(272,22,{3:1,35:1,22:1,272:1},_C);var VPt,QPt,YPt,JPt,ZPt,nCt=Ben(h5n,"EdgeLabelPlacement",272,Unt,q1,iB);wAn(218,22,{3:1,35:1,22:1,218:1},FC);var tCt,eCt,iCt,rCt,cCt,aCt,uCt,oCt=Ben(h5n,"EdgeRouting",218,Unt,S3,rB);wAn(312,22,{3:1,35:1,22:1,312:1},BC);var sCt,hCt,fCt,lCt,bCt,wCt,dCt,gCt,pCt,vCt,mCt,yCt=Ben(h5n,"EdgeType",312,Unt,a9,cB);wAn(977,1,QYn,xf),MWn.Qe=function(n){bKn(n)},vX(h5n,"FixedLayouterOptions",977),wAn(978,1,{},Vu),MWn.$e=function(){return new Hu},MWn._e=function(n){},vX(h5n,"FixedLayouterOptions/FixedFactory",978),wAn(334,22,{3:1,35:1,22:1,334:1},HC);var kCt,jCt,ECt,TCt,MCt,SCt=Ben(h5n,"HierarchyHandling",334,Unt,H1,aB);wAn(285,22,{3:1,35:1,22:1,285:1},qC);var PCt,CCt,ICt,OCt,ACt,$Ct,LCt,NCt,xCt,DCt,RCt=Ben(h5n,"LabelSide",285,Unt,M3,uB);wAn(93,22,{3:1,35:1,22:1,93:1},GC);var KCt,_Ct,FCt,BCt,HCt,qCt,GCt=Ben(h5n,"NodeLabelPlacement",93,Unt,ken,oB);wAn(249,22,{3:1,35:1,22:1,249:1},zC);var zCt,UCt,XCt,WCt,VCt,QCt,YCt,JCt=Ben(h5n,"PortAlignment",249,Unt,I5,sB);wAn(98,22,{3:1,35:1,22:1,98:1},UC);var ZCt,nIt,tIt,eIt,iIt,rIt,cIt,aIt=Ben(h5n,"PortConstraints",98,Unt,S8,hB);wAn(273,22,{3:1,35:1,22:1,273:1},XC);var uIt,oIt,sIt,hIt,fIt,lIt,bIt,wIt,dIt,gIt,pIt,vIt,mIt,yIt,kIt,jIt,EIt,TIt,MIt,SIt,PIt,CIt,IIt=Ben(h5n,"PortLabelPlacement",273,Unt,c9,fB);wAn(61,22,{3:1,35:1,22:1,61:1},WC);var OIt,AIt,$It,LIt,NIt,xIt,DIt,RIt,KIt,_It,FIt=Ben(h5n,"PortSide",61,Unt,h5,wB);wAn(981,1,QYn,Df),MWn.Qe=function(n){RDn(n)},vX(h5n,"RandomLayouterOptions",981),wAn(982,1,{},Qu),MWn.$e=function(){return new no},MWn._e=function(n){},vX(h5n,"RandomLayouterOptions/RandomFactory",982),wAn(374,22,{3:1,35:1,22:1,374:1},VC);var BIt,HIt,qIt,GIt,zIt,UIt,XIt,WIt,VIt,QIt,YIt=Ben(h5n,"SizeConstraint",374,Unt,T3,lB);wAn(259,22,{3:1,35:1,22:1,259:1},QC);var JIt,ZIt,nOt,tOt,eOt,iOt=Ben(h5n,"SizeOptions",259,Unt,Ein,bB);wAn(370,1,{1949:1},Xm),MWn.b=!1,MWn.c=0,MWn.d=-1,MWn.e=null,MWn.f=null,MWn.g=-1,MWn.j=!1,MWn.k=!1,MWn.n=!1,MWn.o=0,MWn.q=0,MWn.r=0,vX(y3n,"BasicProgressMonitor",370),wAn(972,209,NJn,Gu),MWn.Ze=function(n,t){var e,i,r,c,a,u,o,s,h;OTn(t,"Box layout",2),r=zy(MD(ZAn(n,(SMn(),XMt)))),c=BB(ZAn(n,GMt),116),e=qy(TD(ZAn(n,_Mt))),i=qy(TD(ZAn(n,FMt))),0===BB(ZAn(n,RMt),311).g?(u=new t_((!n.a&&(n.a=new eU(UOt,n,10,11)),n.a)),SQ(),m$(u,new Sg(i)),a=u,o=XPn(n),(null==(s=MD(ZAn(n,DMt)))||(kW(s),s<=0))&&(s=1.3),KUn(n,(h=HUn(a,r,c,o.a,o.b,e,(kW(s),s))).a,h.b,!1,!0)):kqn(n,r,c,e),HSn(t)},vX(y3n,"BoxLayoutProvider",972),wAn(973,1,MYn,Sg),MWn.ue=function(n,t){return hNn(this,BB(n,33),BB(t,33))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},MWn.a=!1,vX(y3n,"BoxLayoutProvider/1",973),wAn(157,1,{157:1},Gtn,zx),MWn.Ib=function(){return this.c?zRn(this.c):LMn(this.b)},vX(y3n,"BoxLayoutProvider/Group",157),wAn(311,22,{3:1,35:1,22:1,311:1},YC);var rOt,cOt=Ben(y3n,"BoxLayoutProvider/PackingMode",311,Unt,P3,dB);wAn(974,1,MYn,zu),MWn.ue=function(n,t){return DQ(BB(n,157),BB(t,157))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(y3n,"BoxLayoutProvider/lambda$0$Type",974),wAn(975,1,MYn,Uu),MWn.ue=function(n,t){return cQ(BB(n,157),BB(t,157))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(y3n,"BoxLayoutProvider/lambda$1$Type",975),wAn(976,1,MYn,Xu),MWn.ue=function(n,t){return aQ(BB(n,157),BB(t,157))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(y3n,"BoxLayoutProvider/lambda$2$Type",976),wAn(1365,1,{831:1},Wu),MWn.qg=function(n,t){return AM(),!cL(t,160)||SE((Nun(),BB(n,160)),t)},vX(y3n,"ElkSpacings/AbstractSpacingsBuilder/lambda$0$Type",1365),wAn(1366,1,lVn,Pg),MWn.td=function(n){Jsn(this.a,BB(n,146))},vX(y3n,"ElkSpacings/AbstractSpacingsBuilder/lambda$1$Type",1366),wAn(1367,1,lVn,qu),MWn.td=function(n){BB(n,94),AM()},vX(y3n,"ElkSpacings/AbstractSpacingsBuilder/lambda$2$Type",1367),wAn(1371,1,lVn,Cg),MWn.td=function(n){Orn(this.a,BB(n,94))},vX(y3n,"ElkSpacings/AbstractSpacingsBuilder/lambda$3$Type",1371),wAn(1369,1,DVn,JC),MWn.Mb=function(n){return Von(this.a,this.b,BB(n,146))},vX(y3n,"ElkSpacings/AbstractSpacingsBuilder/lambda$4$Type",1369),wAn(1368,1,DVn,ZC),MWn.Mb=function(n){return $x(this.a,this.b,BB(n,831))},vX(y3n,"ElkSpacings/AbstractSpacingsBuilder/lambda$5$Type",1368),wAn(1370,1,lVn,nI),MWn.td=function(n){Fz(this.a,this.b,BB(n,146))},vX(y3n,"ElkSpacings/AbstractSpacingsBuilder/lambda$6$Type",1370),wAn(935,1,{},Bu),MWn.Kb=function(n){return yA(n)},MWn.Fb=function(n){return this===n},vX(y3n,"ElkUtil/lambda$0$Type",935),wAn(936,1,lVn,tI),MWn.td=function(n){rOn(this.a,this.b,BB(n,79))},MWn.a=0,MWn.b=0,vX(y3n,"ElkUtil/lambda$1$Type",936),wAn(937,1,lVn,eI),MWn.td=function(n){Ey(this.a,this.b,BB(n,202))},MWn.a=0,MWn.b=0,vX(y3n,"ElkUtil/lambda$2$Type",937),wAn(938,1,lVn,iI),MWn.td=function(n){t$(this.a,this.b,BB(n,137))},MWn.a=0,MWn.b=0,vX(y3n,"ElkUtil/lambda$3$Type",938),wAn(939,1,lVn,Ig),MWn.td=function(n){cq(this.a,BB(n,469))},vX(y3n,"ElkUtil/lambda$4$Type",939),wAn(342,1,{35:1,342:1},$p),MWn.wd=function(n){return vL(this,BB(n,236))},MWn.Fb=function(n){var t;return!!cL(n,342)&&(t=BB(n,342),this.a==t.a)},MWn.Hb=function(){return CJ(this.a)},MWn.Ib=function(){return this.a+" (exclusive)"},MWn.a=0,vX(y3n,"ExclusiveBounds/ExclusiveLowerBound",342),wAn(1138,209,NJn,Hu),MWn.Ze=function(n,t){var i,r,c,a,u,o,s,f,l,b,w,d,g,p,v,m,y,k,j,E,T;for(OTn(t,"Fixed Layout",1),a=BB(ZAn(n,(sWn(),vSt)),218),b=0,w=0,v=new AL((!n.a&&(n.a=new eU(UOt,n,10,11)),n.a));v.e!=v.i.gc();){for(g=BB(kpn(v),33),(T=BB(ZAn(g,(Xsn(),gCt)),8))&&(SA(g,T.a,T.b),BB(ZAn(g,fCt),174).Hc((mdn(),DIt))&&(d=BB(ZAn(g,bCt),8)).a>0&&d.b>0&&KUn(g,d.a,d.b,!0,!0)),b=e.Math.max(b,g.i+g.g),w=e.Math.max(w,g.j+g.f),f=new AL((!g.n&&(g.n=new eU(zOt,g,1,7)),g.n));f.e!=f.i.gc();)o=BB(kpn(f),137),(T=BB(ZAn(o,gCt),8))&&SA(o,T.a,T.b),b=e.Math.max(b,g.i+o.i+o.g),w=e.Math.max(w,g.j+o.j+o.f);for(k=new AL((!g.c&&(g.c=new eU(XOt,g,9,9)),g.c));k.e!=k.i.gc();)for(y=BB(kpn(k),118),(T=BB(ZAn(y,gCt),8))&&SA(y,T.a,T.b),j=g.i+y.i,E=g.j+y.j,b=e.Math.max(b,j+y.g),w=e.Math.max(w,E+y.f),s=new AL((!y.n&&(y.n=new eU(zOt,y,1,7)),y.n));s.e!=s.i.gc();)o=BB(kpn(s),137),(T=BB(ZAn(o,gCt),8))&&SA(o,T.a,T.b),b=e.Math.max(b,j+o.i+o.g),w=e.Math.max(w,E+o.j+o.f);for(c=new oz(ZL(dLn(g).a.Kc(),new h));dAn(c);)l=_Un(i=BB(U5(c),79)),b=e.Math.max(b,l.a),w=e.Math.max(w,l.b);for(r=new oz(ZL(wLn(g).a.Kc(),new h));dAn(r);)JJ(PMn(i=BB(U5(r),79)))!=n&&(l=_Un(i),b=e.Math.max(b,l.a),w=e.Math.max(w,l.b))}if(a==(Mbn(),QPt))for(p=new AL((!n.a&&(n.a=new eU(UOt,n,10,11)),n.a));p.e!=p.i.gc();)for(r=new oz(ZL(dLn(g=BB(kpn(p),33)).a.Kc(),new h));dAn(r);)0==(u=rFn(i=BB(U5(r),79))).b?Ypn(i,OSt,null):Ypn(i,OSt,u);qy(TD(ZAn(n,(Xsn(),lCt))))||KUn(n,b+(m=BB(ZAn(n,wCt),116)).b+m.c,w+m.d+m.a,!0,!0),HSn(t)},vX(y3n,"FixedLayoutProvider",1138),wAn(373,134,{3:1,414:1,373:1,94:1,134:1},Yu,rnn),MWn.Jf=function(n){var t,e,i,r,c,a,u;if(n)try{for(a=kKn(n,";,;"),r=0,c=(i=a).length;r<c;++r){if(t=kKn(i[r],"\\:"),!(e=pGn(cin(),t[0])))throw Hp(new _y("Invalid option id: "+t[0]));if(null==(u=Zqn(e,t[1])))throw Hp(new _y("Invalid option value: "+t[1]));null==u?(!this.q&&(this.q=new xp),v6(this.q,e)):(!this.q&&(this.q=new xp),VW(this.q,e,u))}}catch(o){throw cL(o=lun(o),102)?Hp(new Fsn(o)):Hp(o)}},MWn.Ib=function(){return SD(P4($V((this.q?this.q:(SQ(),SQ(),het)).vc().Oc(),new Ju),x7(new YB,new Z,new W,new V,Pun(Gk(nit,1),$Vn,132,0,[]))))};var aOt,uOt,oOt,sOt,hOt=vX(y3n,"IndividualSpacings",373);wAn(971,1,{},Ju),MWn.Kb=function(n){return RQ(BB(n,42))},vX(y3n,"IndividualSpacings/lambda$0$Type",971),wAn(709,1,{},sG),MWn.c=0,vX(y3n,"InstancePool",709),wAn(1275,1,{},Zu),vX(y3n,"LoggedGraph",1275),wAn(396,22,{3:1,35:1,22:1,396:1},cI);var fOt,lOt,bOt,wOt=Ben(y3n,"LoggedGraph/Type",396,Unt,C3,gB);wAn(46,1,{20:1,46:1},rI),MWn.Jc=function(n){e5(this,n)},MWn.Fb=function(n){var t,e,i;return!!cL(n,46)&&(e=BB(n,46),t=null==this.a?null==e.a:Nfn(this.a,e.a),i=null==this.b?null==e.b:Nfn(this.b,e.b),t&&i)},MWn.Hb=function(){var n,t,e;return n=-65536&(t=null==this.a?0:nsn(this.a)),t&QVn^(-65536&(e=null==this.b?0:nsn(this.b)))>>16&QVn|n^(e&QVn)<<16},MWn.Kc=function(){return new Og(this)},MWn.Ib=function(){return null==this.a&&null==this.b?"pair(null,null)":null==this.a?"pair(null,"+Bbn(this.b)+")":null==this.b?"pair("+Bbn(this.a)+",null)":"pair("+Bbn(this.a)+","+Bbn(this.b)+")"},vX(y3n,"Pair",46),wAn(983,1,QWn,Og),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return!this.c&&(!this.b&&null!=this.a.a||null!=this.a.b)},MWn.Pb=function(){if(!this.c&&!this.b&&null!=this.a.a)return this.b=!0,this.a.a;if(!this.c&&null!=this.a.b)return this.c=!0,this.a.b;throw Hp(new yv)},MWn.Qb=function(){throw this.c&&null!=this.a.b?this.a.b=null:this.b&&null!=this.a.a&&(this.a.a=null),Hp(new dv)},MWn.b=!1,MWn.c=!1,vX(y3n,"Pair/1",983),wAn(448,1,{448:1},VV),MWn.Fb=function(n){return cV(this.a,BB(n,448).a)&&cV(this.c,BB(n,448).c)&&cV(this.d,BB(n,448).d)&&cV(this.b,BB(n,448).b)},MWn.Hb=function(){return fhn(Pun(Gk(Ant,1),HWn,1,5,[this.a,this.c,this.d,this.b]))},MWn.Ib=function(){return"("+this.a+FWn+this.c+FWn+this.d+FWn+this.b+")"},vX(y3n,"Quadruple",448),wAn(1126,209,NJn,no),MWn.Ze=function(n,t){var e;OTn(t,"Random Layout",1),0!=(!n.a&&(n.a=new eU(UOt,n,10,11)),n.a).i?(iUn(n,(e=BB(ZAn(n,(vdn(),NIt)),19))&&0!=e.a?new C4(e.a):new sbn,zy(MD(ZAn(n,AIt))),zy(MD(ZAn(n,xIt))),BB(ZAn(n,$It),116)),HSn(t)):HSn(t)},vX(y3n,"RandomLayoutProvider",1126),wAn(553,1,{}),MWn.qf=function(){return new xC(this.f.i,this.f.j)},MWn.We=function(n){return EY(n,(sWn(),aPt))?ZAn(this.f,bOt):ZAn(this.f,n)},MWn.rf=function(){return new xC(this.f.g,this.f.f)},MWn.sf=function(){return this.g},MWn.Xe=function(n){return P8(this.f,n)},MWn.tf=function(n){Pen(this.f,n.a),Cen(this.f,n.b)},MWn.uf=function(n){Sen(this.f,n.a),Men(this.f,n.b)},MWn.vf=function(n){this.g=n},MWn.g=0,vX(H5n,"ElkGraphAdapters/AbstractElkGraphElementAdapter",553),wAn(554,1,{839:1},Ag),MWn.wf=function(){var n,t;if(!this.b)for(this.b=C2(mV(this.a).i),t=new AL(mV(this.a));t.e!=t.i.gc();)n=BB(kpn(t),137),WB(this.b,new Ry(n));return this.b},MWn.b=null,vX(H5n,"ElkGraphAdapters/ElkEdgeAdapter",554),wAn(301,553,{},Dy),MWn.xf=function(){return eyn(this)},MWn.a=null,vX(H5n,"ElkGraphAdapters/ElkGraphAdapter",301),wAn(630,553,{181:1},Ry),vX(H5n,"ElkGraphAdapters/ElkLabelAdapter",630),wAn(629,553,{680:1},JN),MWn.wf=function(){return nyn(this)},MWn.Af=function(){var n;return!(n=BB(ZAn(this.f,(sWn(),$St)),142))&&(n=new lm),n},MWn.Cf=function(){return tyn(this)},MWn.Ef=function(n){var t;t=new A_(n),Ypn(this.f,(sWn(),$St),t)},MWn.Ff=function(n){Ypn(this.f,(sWn(),XSt),new O_(n))},MWn.yf=function(){return this.d},MWn.zf=function(){var n,t;if(!this.a)for(this.a=new Np,t=new oz(ZL(wLn(BB(this.f,33)).a.Kc(),new h));dAn(t);)n=BB(U5(t),79),WB(this.a,new Ag(n));return this.a},MWn.Bf=function(){var n,t;if(!this.c)for(this.c=new Np,t=new oz(ZL(dLn(BB(this.f,33)).a.Kc(),new h));dAn(t);)n=BB(U5(t),79),WB(this.c,new Ag(n));return this.c},MWn.Df=function(){return 0!=YQ(BB(this.f,33)).i||qy(TD(BB(this.f,33).We((sWn(),SSt))))},MWn.Gf=function(){_7(this,(GM(),lOt))},MWn.a=null,MWn.b=null,MWn.c=null,MWn.d=null,MWn.e=null,vX(H5n,"ElkGraphAdapters/ElkNodeAdapter",629),wAn(1266,553,{838:1},op),MWn.wf=function(){return kyn(this)},MWn.zf=function(){var n,t;if(!this.a)for(this.a=sx(BB(this.f,118).xg().i),t=new AL(BB(this.f,118).xg());t.e!=t.i.gc();)n=BB(kpn(t),79),WB(this.a,new Ag(n));return this.a},MWn.Bf=function(){var n,t;if(!this.c)for(this.c=sx(BB(this.f,118).yg().i),t=new AL(BB(this.f,118).yg());t.e!=t.i.gc();)n=BB(kpn(t),79),WB(this.c,new Ag(n));return this.c},MWn.Hf=function(){return BB(BB(this.f,118).We((sWn(),wPt)),61)},MWn.If=function(){var n,t,e,i,r,c,a;for(i=WJ(BB(this.f,118)),e=new AL(BB(this.f,118).yg());e.e!=e.i.gc();)for(a=new AL((!(n=BB(kpn(e),79)).c&&(n.c=new hK(KOt,n,5,8)),n.c));a.e!=a.i.gc();){if(Ctn(PTn(c=BB(kpn(a),82)),i))return!0;if(PTn(c)==i&&qy(TD(ZAn(n,(sWn(),PSt)))))return!0}for(t=new AL(BB(this.f,118).xg());t.e!=t.i.gc();)for(r=new AL((!(n=BB(kpn(t),79)).b&&(n.b=new hK(KOt,n,4,7)),n.b));r.e!=r.i.gc();)if(Ctn(PTn(BB(kpn(r),82)),i))return!0;return!1},MWn.a=null,MWn.b=null,MWn.c=null,vX(H5n,"ElkGraphAdapters/ElkPortAdapter",1266),wAn(1267,1,MYn,to),MWn.ue=function(n,t){return GRn(BB(n,118),BB(t,118))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(H5n,"ElkGraphAdapters/PortComparator",1267);var dOt,gOt,pOt,vOt,mOt,yOt,kOt,jOt,EOt,TOt,MOt,SOt,POt,COt,IOt,OOt,AOt,$Ot,LOt=bq(q5n,"EObject"),NOt=bq(G5n,z5n),xOt=bq(G5n,U5n),DOt=bq(G5n,X5n),ROt=bq(G5n,"ElkShape"),KOt=bq(G5n,W5n),_Ot=bq(G5n,V5n),FOt=bq(G5n,Q5n),BOt=bq(q5n,Y5n),HOt=bq(q5n,"EFactory"),qOt=bq(q5n,J5n),GOt=bq(q5n,"EPackage"),zOt=bq(G5n,Z5n),UOt=bq(G5n,n6n),XOt=bq(G5n,t6n);wAn(90,1,e6n),MWn.Jg=function(){return this.Kg(),null},MWn.Kg=function(){return null},MWn.Lg=function(){return this.Kg(),!1},MWn.Mg=function(){return!1},MWn.Ng=function(n){ban(this,n)},vX(i6n,"BasicNotifierImpl",90),wAn(97,90,f6n),MWn.nh=function(){return mA(this)},MWn.Og=function(n,t){return n},MWn.Pg=function(){throw Hp(new pv)},MWn.Qg=function(n){var t;return t=Cvn(BB(itn(this.Tg(),this.Vg()),18)),this.eh().ih(this,t.n,t.f,n)},MWn.Rg=function(n,t){throw Hp(new pv)},MWn.Sg=function(n,t,e){return T_n(this,n,t,e)},MWn.Tg=function(){var n;return this.Pg()&&(n=this.Pg().ck())?n:this.zh()},MWn.Ug=function(){return cAn(this)},MWn.Vg=function(){throw Hp(new pv)},MWn.Wg=function(){var n,t;return!(t=this.ph().dk())&&this.Pg().ik((QM(),t=null==(n=lJ(qFn(this.Tg())))?N$t:new QN(this,n))),t},MWn.Xg=function(n,t){return n},MWn.Yg=function(n){return n.Gj()?n.aj():Awn(this.Tg(),n)},MWn.Zg=function(){var n;return(n=this.Pg())?n.fk():null},MWn.$g=function(){return this.Pg()?this.Pg().ck():null},MWn._g=function(n,t,e){return Zpn(this,n,t,e)},MWn.ah=function(n){return S9(this,n)},MWn.bh=function(n,t){return V5(this,n,t)},MWn.dh=function(){var n;return!!(n=this.Pg())&&n.gk()},MWn.eh=function(){throw Hp(new pv)},MWn.fh=function(){return Ydn(this)},MWn.gh=function(n,t,e,i){return Npn(this,n,t,i)},MWn.hh=function(n,t,e){return BB(itn(this.Tg(),t),66).Nj().Qj(this,this.yh(),t-this.Ah(),n,e)},MWn.ih=function(n,t,e,i){return oJ(this,n,t,i)},MWn.jh=function(n,t,e){return BB(itn(this.Tg(),t),66).Nj().Rj(this,this.yh(),t-this.Ah(),n,e)},MWn.kh=function(){return!!this.Pg()&&!!this.Pg().ek()},MWn.lh=function(n){return vpn(this,n)},MWn.mh=function(n){return ZJ(this,n)},MWn.oh=function(n){return _qn(this,n)},MWn.ph=function(){throw Hp(new pv)},MWn.qh=function(){return this.Pg()?this.Pg().ek():null},MWn.rh=function(){return Ydn(this)},MWn.sh=function(n,t){yCn(this,n,t)},MWn.th=function(n){this.ph().hk(n)},MWn.uh=function(n){this.ph().kk(n)},MWn.vh=function(n){this.ph().jk(n)},MWn.wh=function(n,t){var e,i,r,c;return(c=this.Zg())&&n&&(t=_pn(c.Vk(),this,t),c.Zk(this)),(i=this.eh())&&(0!=(gKn(this,this.eh(),this.Vg()).Bb&BQn)?(r=i.fh())&&(n?!c&&r.Zk(this):r.Yk(this)):(t=(e=this.Vg())>=0?this.Qg(t):this.eh().ih(this,-1-e,null,t),t=this.Sg(null,-1,t))),this.uh(n),t},MWn.xh=function(n){var t,e,i,r,c,a,u;if((c=Awn(e=this.Tg(),n))>=(t=this.Ah()))return BB(n,66).Nj().Uj(this,this.yh(),c-t);if(c<=-1){if(!(a=Fqn((IPn(),Z$t),e,n)))throw Hp(new _y(r6n+n.ne()+u6n));if(ZM(),BB(a,66).Oj()||(a=Z1(B7(Z$t,a))),r=BB((i=this.Yg(a))>=0?this._g(i,!0,!0):cOn(this,a,!0),153),(u=a.Zj())>1||-1==u)return BB(BB(r,215).hl(n,!1),76)}else if(n.$j())return BB((i=this.Yg(n))>=0?this._g(i,!1,!0):cOn(this,n,!1),76);return new II(this,n)},MWn.yh=function(){return Q7(this)},MWn.zh=function(){return(QX(),t$t).S},MWn.Ah=function(){return bX(this.zh())},MWn.Bh=function(n){mPn(this,n)},MWn.Ib=function(){return P$n(this)},vX(l6n,"BasicEObjectImpl",97),wAn(114,97,{105:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1}),MWn.Ch=function(n){return Y7(this)[n]},MWn.Dh=function(n,t){$X(Y7(this),n,t)},MWn.Eh=function(n){$X(Y7(this),n,null)},MWn.Jg=function(){return BB(yan(this,4),126)},MWn.Kg=function(){throw Hp(new pv)},MWn.Lg=function(){return 0!=(4&this.Db)},MWn.Pg=function(){throw Hp(new pv)},MWn.Fh=function(n){hgn(this,2,n)},MWn.Rg=function(n,t){this.Db=t<<16|255&this.Db,this.Fh(n)},MWn.Tg=function(){return jY(this)},MWn.Vg=function(){return this.Db>>16},MWn.Wg=function(){var n;return QM(),null==(n=lJ(qFn(BB(yan(this,16),26)||this.zh())))?N$t:new QN(this,n)},MWn.Mg=function(){return 0==(1&this.Db)},MWn.Zg=function(){return BB(yan(this,128),1935)},MWn.$g=function(){return BB(yan(this,16),26)},MWn.dh=function(){return 0!=(32&this.Db)},MWn.eh=function(){return BB(yan(this,2),49)},MWn.kh=function(){return 0!=(64&this.Db)},MWn.ph=function(){throw Hp(new pv)},MWn.qh=function(){return BB(yan(this,64),281)},MWn.th=function(n){hgn(this,16,n)},MWn.uh=function(n){hgn(this,128,n)},MWn.vh=function(n){hgn(this,64,n)},MWn.yh=function(){return fgn(this)},MWn.Db=0,vX(l6n,"MinimalEObjectImpl",114),wAn(115,114,{105:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1}),MWn.Fh=function(n){this.Cb=n},MWn.eh=function(){return this.Cb},vX(l6n,"MinimalEObjectImpl/Container",115),wAn(1985,115,{105:1,413:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1}),MWn._g=function(n,t,e){return Eyn(this,n,t,e)},MWn.jh=function(n,t,e){return eSn(this,n,t,e)},MWn.lh=function(n){return m0(this,n)},MWn.sh=function(n,t){rsn(this,n,t)},MWn.zh=function(){return CXn(),POt},MWn.Bh=function(n){zun(this,n)},MWn.Ve=function(){return lpn(this)},MWn.We=function(n){return ZAn(this,n)},MWn.Xe=function(n){return P8(this,n)},MWn.Ye=function(n,t){return Ypn(this,n,t)},vX(b6n,"EMapPropertyHolderImpl",1985),wAn(567,115,{105:1,469:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1},ro),MWn._g=function(n,t,e){switch(n){case 0:return this.a;case 1:return this.b}return Zpn(this,n,t,e)},MWn.lh=function(n){switch(n){case 0:return 0!=this.a;case 1:return 0!=this.b}return vpn(this,n)},MWn.sh=function(n,t){switch(n){case 0:return void jen(this,Gy(MD(t)));case 1:return void Een(this,Gy(MD(t)))}yCn(this,n,t)},MWn.zh=function(){return CXn(),pOt},MWn.Bh=function(n){switch(n){case 0:return void jen(this,0);case 1:return void Een(this,0)}mPn(this,n)},MWn.Ib=function(){var n;return 0!=(64&this.Db)?P$n(this):((n=new fN(P$n(this))).a+=" (x: ",vE(n,this.a),n.a+=", y: ",vE(n,this.b),n.a+=")",n.a)},MWn.a=0,MWn.b=0,vX(b6n,"ElkBendPointImpl",567),wAn(723,1985,{105:1,413:1,160:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1}),MWn._g=function(n,t,e){return _fn(this,n,t,e)},MWn.hh=function(n,t,e){return FTn(this,n,t,e)},MWn.jh=function(n,t,e){return run(this,n,t,e)},MWn.lh=function(n){return Ean(this,n)},MWn.sh=function(n,t){Gjn(this,n,t)},MWn.zh=function(){return CXn(),kOt},MWn.Bh=function(n){ofn(this,n)},MWn.zg=function(){return this.k},MWn.Ag=function(){return mV(this)},MWn.Ib=function(){return Yln(this)},MWn.k=null,vX(b6n,"ElkGraphElementImpl",723),wAn(724,723,{105:1,413:1,160:1,470:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1}),MWn._g=function(n,t,e){return Rbn(this,n,t,e)},MWn.lh=function(n){return fwn(this,n)},MWn.sh=function(n,t){zjn(this,n,t)},MWn.zh=function(){return CXn(),SOt},MWn.Bh=function(n){Dwn(this,n)},MWn.Bg=function(){return this.f},MWn.Cg=function(){return this.g},MWn.Dg=function(){return this.i},MWn.Eg=function(){return this.j},MWn.Fg=function(n,t){MA(this,n,t)},MWn.Gg=function(n,t){SA(this,n,t)},MWn.Hg=function(n){Pen(this,n)},MWn.Ig=function(n){Cen(this,n)},MWn.Ib=function(){return mSn(this)},MWn.f=0,MWn.g=0,MWn.i=0,MWn.j=0,vX(b6n,"ElkShapeImpl",724),wAn(725,724,{105:1,413:1,82:1,160:1,470:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1}),MWn._g=function(n,t,e){return Hvn(this,n,t,e)},MWn.hh=function(n,t,e){return djn(this,n,t,e)},MWn.jh=function(n,t,e){return gjn(this,n,t,e)},MWn.lh=function(n){return Gon(this,n)},MWn.sh=function(n,t){LAn(this,n,t)},MWn.zh=function(){return CXn(),vOt},MWn.Bh=function(n){xpn(this,n)},MWn.xg=function(){return!this.d&&(this.d=new hK(_Ot,this,8,5)),this.d},MWn.yg=function(){return!this.e&&(this.e=new hK(_Ot,this,7,4)),this.e},vX(b6n,"ElkConnectableShapeImpl",725),wAn(352,723,{105:1,413:1,79:1,160:1,352:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1},io),MWn.Qg=function(n){return Mkn(this,n)},MWn._g=function(n,t,e){switch(n){case 3:return XJ(this);case 4:return!this.b&&(this.b=new hK(KOt,this,4,7)),this.b;case 5:return!this.c&&(this.c=new hK(KOt,this,5,8)),this.c;case 6:return!this.a&&(this.a=new eU(FOt,this,6,6)),this.a;case 7:return hN(),!this.b&&(this.b=new hK(KOt,this,4,7)),!(this.b.i<=1&&(!this.c&&(this.c=new hK(KOt,this,5,8)),this.c.i<=1));case 8:return hN(),!!nAn(this);case 9:return hN(),!!QIn(this);case 10:return hN(),!this.b&&(this.b=new hK(KOt,this,4,7)),0!=this.b.i&&(!this.c&&(this.c=new hK(KOt,this,5,8)),0!=this.c.i)}return _fn(this,n,t,e)},MWn.hh=function(n,t,e){var i;switch(t){case 3:return this.Cb&&(e=(i=this.Db>>16)>=0?Mkn(this,e):this.Cb.ih(this,-1-i,null,e)),VD(this,BB(n,33),e);case 4:return!this.b&&(this.b=new hK(KOt,this,4,7)),Ywn(this.b,n,e);case 5:return!this.c&&(this.c=new hK(KOt,this,5,8)),Ywn(this.c,n,e);case 6:return!this.a&&(this.a=new eU(FOt,this,6,6)),Ywn(this.a,n,e)}return FTn(this,n,t,e)},MWn.jh=function(n,t,e){switch(t){case 3:return VD(this,null,e);case 4:return!this.b&&(this.b=new hK(KOt,this,4,7)),_pn(this.b,n,e);case 5:return!this.c&&(this.c=new hK(KOt,this,5,8)),_pn(this.c,n,e);case 6:return!this.a&&(this.a=new eU(FOt,this,6,6)),_pn(this.a,n,e)}return run(this,n,t,e)},MWn.lh=function(n){switch(n){case 3:return!!XJ(this);case 4:return!!this.b&&0!=this.b.i;case 5:return!!this.c&&0!=this.c.i;case 6:return!!this.a&&0!=this.a.i;case 7:return!this.b&&(this.b=new hK(KOt,this,4,7)),!(this.b.i<=1&&(!this.c&&(this.c=new hK(KOt,this,5,8)),this.c.i<=1));case 8:return nAn(this);case 9:return QIn(this);case 10:return!this.b&&(this.b=new hK(KOt,this,4,7)),0!=this.b.i&&(!this.c&&(this.c=new hK(KOt,this,5,8)),0!=this.c.i)}return Ean(this,n)},MWn.sh=function(n,t){switch(n){case 3:return void HLn(this,BB(t,33));case 4:return!this.b&&(this.b=new hK(KOt,this,4,7)),sqn(this.b),!this.b&&(this.b=new hK(KOt,this,4,7)),void pX(this.b,BB(t,14));case 5:return!this.c&&(this.c=new hK(KOt,this,5,8)),sqn(this.c),!this.c&&(this.c=new hK(KOt,this,5,8)),void pX(this.c,BB(t,14));case 6:return!this.a&&(this.a=new eU(FOt,this,6,6)),sqn(this.a),!this.a&&(this.a=new eU(FOt,this,6,6)),void pX(this.a,BB(t,14))}Gjn(this,n,t)},MWn.zh=function(){return CXn(),mOt},MWn.Bh=function(n){switch(n){case 3:return void HLn(this,null);case 4:return!this.b&&(this.b=new hK(KOt,this,4,7)),void sqn(this.b);case 5:return!this.c&&(this.c=new hK(KOt,this,5,8)),void sqn(this.c);case 6:return!this.a&&(this.a=new eU(FOt,this,6,6)),void sqn(this.a)}ofn(this,n)},MWn.Ib=function(){return lHn(this)},vX(b6n,"ElkEdgeImpl",352),wAn(439,1985,{105:1,413:1,202:1,439:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1},co),MWn.Qg=function(n){return skn(this,n)},MWn._g=function(n,t,e){switch(n){case 1:return this.j;case 2:return this.k;case 3:return this.b;case 4:return this.c;case 5:return!this.a&&(this.a=new $L(xOt,this,5)),this.a;case 6:return VJ(this);case 7:return t?Pvn(this):this.i;case 8:return t?Svn(this):this.f;case 9:return!this.g&&(this.g=new hK(FOt,this,9,10)),this.g;case 10:return!this.e&&(this.e=new hK(FOt,this,10,9)),this.e;case 11:return this.d}return Eyn(this,n,t,e)},MWn.hh=function(n,t,e){var i;switch(t){case 6:return this.Cb&&(e=(i=this.Db>>16)>=0?skn(this,e):this.Cb.ih(this,-1-i,null,e)),QD(this,BB(n,79),e);case 9:return!this.g&&(this.g=new hK(FOt,this,9,10)),Ywn(this.g,n,e);case 10:return!this.e&&(this.e=new hK(FOt,this,10,9)),Ywn(this.e,n,e)}return BB(itn(BB(yan(this,16),26)||(CXn(),yOt),t),66).Nj().Qj(this,fgn(this),t-bX((CXn(),yOt)),n,e)},MWn.jh=function(n,t,e){switch(t){case 5:return!this.a&&(this.a=new $L(xOt,this,5)),_pn(this.a,n,e);case 6:return QD(this,null,e);case 9:return!this.g&&(this.g=new hK(FOt,this,9,10)),_pn(this.g,n,e);case 10:return!this.e&&(this.e=new hK(FOt,this,10,9)),_pn(this.e,n,e)}return eSn(this,n,t,e)},MWn.lh=function(n){switch(n){case 1:return 0!=this.j;case 2:return 0!=this.k;case 3:return 0!=this.b;case 4:return 0!=this.c;case 5:return!!this.a&&0!=this.a.i;case 6:return!!VJ(this);case 7:return!!this.i;case 8:return!!this.f;case 9:return!!this.g&&0!=this.g.i;case 10:return!!this.e&&0!=this.e.i;case 11:return null!=this.d}return m0(this,n)},MWn.sh=function(n,t){switch(n){case 1:return void Ien(this,Gy(MD(t)));case 2:return void Aen(this,Gy(MD(t)));case 3:return void Ten(this,Gy(MD(t)));case 4:return void Oen(this,Gy(MD(t)));case 5:return!this.a&&(this.a=new $L(xOt,this,5)),sqn(this.a),!this.a&&(this.a=new $L(xOt,this,5)),void pX(this.a,BB(t,14));case 6:return void FLn(this,BB(t,79));case 7:return void Nin(this,BB(t,82));case 8:return void Lin(this,BB(t,82));case 9:return!this.g&&(this.g=new hK(FOt,this,9,10)),sqn(this.g),!this.g&&(this.g=new hK(FOt,this,9,10)),void pX(this.g,BB(t,14));case 10:return!this.e&&(this.e=new hK(FOt,this,10,9)),sqn(this.e),!this.e&&(this.e=new hK(FOt,this,10,9)),void pX(this.e,BB(t,14));case 11:return void crn(this,SD(t))}rsn(this,n,t)},MWn.zh=function(){return CXn(),yOt},MWn.Bh=function(n){switch(n){case 1:return void Ien(this,0);case 2:return void Aen(this,0);case 3:return void Ten(this,0);case 4:return void Oen(this,0);case 5:return!this.a&&(this.a=new $L(xOt,this,5)),void sqn(this.a);case 6:return void FLn(this,null);case 7:return void Nin(this,null);case 8:return void Lin(this,null);case 9:return!this.g&&(this.g=new hK(FOt,this,9,10)),void sqn(this.g);case 10:return!this.e&&(this.e=new hK(FOt,this,10,9)),void sqn(this.e);case 11:return void crn(this,null)}zun(this,n)},MWn.Ib=function(){return ROn(this)},MWn.b=0,MWn.c=0,MWn.d=null,MWn.j=0,MWn.k=0,vX(b6n,"ElkEdgeSectionImpl",439),wAn(150,115,{105:1,92:1,90:1,147:1,56:1,108:1,49:1,97:1,150:1,114:1,115:1}),MWn._g=function(n,t,e){return 0==n?(!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),this.Ab):U9(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n),t,e)},MWn.hh=function(n,t,e){return 0==t?(!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),Ywn(this.Ab,n,e)):BB(itn(BB(yan(this,16),26)||this.zh(),t),66).Nj().Qj(this,fgn(this),t-bX(this.zh()),n,e)},MWn.jh=function(n,t,e){return 0==t?(!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),_pn(this.Ab,n,e)):BB(itn(BB(yan(this,16),26)||this.zh(),t),66).Nj().Rj(this,fgn(this),t-bX(this.zh()),n,e)},MWn.lh=function(n){return 0==n?!!this.Ab&&0!=this.Ab.i:O3(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n))},MWn.oh=function(n){return hUn(this,n)},MWn.sh=function(n,t){if(0===n)return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),sqn(this.Ab),!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void pX(this.Ab,BB(t,14));Lbn(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n),t)},MWn.uh=function(n){hgn(this,128,n)},MWn.zh=function(){return gWn(),b$t},MWn.Bh=function(n){if(0===n)return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void sqn(this.Ab);qfn(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n))},MWn.Gh=function(){this.Bb|=1},MWn.Hh=function(n){return N_n(this,n)},MWn.Bb=0,vX(l6n,"EModelElementImpl",150),wAn(704,150,{105:1,92:1,90:1,471:1,147:1,56:1,108:1,49:1,97:1,150:1,114:1,115:1},Rf),MWn.Ih=function(n,t){return qGn(this,n,t)},MWn.Jh=function(n){var t,e,i,r;if(this.a!=Utn(n)||0!=(256&n.Bb))throw Hp(new _y(m6n+n.zb+g6n));for(e=kY(n);0!=a4(e.a).i;){if(iyn(t=BB(eGn(e,0,cL(r=BB(Wtn(a4(e.a),0),87).c,88)?BB(r,26):(gWn(),d$t)),26)))return BB(i=Utn(t).Nh().Jh(t),49).th(n),i;e=kY(t)}return"java.util.Map$Entry"==(null!=n.D?n.D:n.B)?new fq(n):new jH(n)},MWn.Kh=function(n,t){return xXn(this,n,t)},MWn._g=function(n,t,e){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),this.Ab;case 1:return this.a}return U9(this,n-bX((gWn(),h$t)),itn(BB(yan(this,16),26)||h$t,n),t,e)},MWn.hh=function(n,t,e){switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),Ywn(this.Ab,n,e);case 1:return this.a&&(e=BB(this.a,49).ih(this,4,GOt,e)),Jhn(this,BB(n,235),e)}return BB(itn(BB(yan(this,16),26)||(gWn(),h$t),t),66).Nj().Qj(this,fgn(this),t-bX((gWn(),h$t)),n,e)},MWn.jh=function(n,t,e){switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),_pn(this.Ab,n,e);case 1:return Jhn(this,null,e)}return BB(itn(BB(yan(this,16),26)||(gWn(),h$t),t),66).Nj().Rj(this,fgn(this),t-bX((gWn(),h$t)),n,e)},MWn.lh=function(n){switch(n){case 0:return!!this.Ab&&0!=this.Ab.i;case 1:return!!this.a}return O3(this,n-bX((gWn(),h$t)),itn(BB(yan(this,16),26)||h$t,n))},MWn.sh=function(n,t){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),sqn(this.Ab),!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void pX(this.Ab,BB(t,14));case 1:return void xMn(this,BB(t,235))}Lbn(this,n-bX((gWn(),h$t)),itn(BB(yan(this,16),26)||h$t,n),t)},MWn.zh=function(){return gWn(),h$t},MWn.Bh=function(n){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void sqn(this.Ab);case 1:return void xMn(this,null)}qfn(this,n-bX((gWn(),h$t)),itn(BB(yan(this,16),26)||h$t,n))},vX(l6n,"EFactoryImpl",704),wAn(k6n,704,{105:1,2014:1,92:1,90:1,471:1,147:1,56:1,108:1,49:1,97:1,150:1,114:1,115:1},ao),MWn.Ih=function(n,t){switch(n.yj()){case 12:return BB(t,146).tg();case 13:return Bbn(t);default:throw Hp(new _y(d6n+n.ne()+g6n))}},MWn.Jh=function(n){var t;switch(-1==n.G&&(n.G=(t=Utn(n))?uvn(t.Mh(),n):-1),n.G){case 4:return new uo;case 6:return new jm;case 7:return new Em;case 8:return new io;case 9:return new ro;case 10:return new co;case 11:return new so;default:throw Hp(new _y(m6n+n.zb+g6n))}},MWn.Kh=function(n,t){switch(n.yj()){case 13:case 12:return null;default:throw Hp(new _y(d6n+n.ne()+g6n))}},vX(b6n,"ElkGraphFactoryImpl",k6n),wAn(438,150,{105:1,92:1,90:1,147:1,191:1,56:1,108:1,49:1,97:1,150:1,114:1,115:1}),MWn.Wg=function(){var n;return null==(n=lJ(qFn(BB(yan(this,16),26)||this.zh())))?(QM(),QM(),N$t):new Wx(this,n)},MWn._g=function(n,t,e){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),this.Ab;case 1:return this.ne()}return U9(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n),t,e)},MWn.lh=function(n){switch(n){case 0:return!!this.Ab&&0!=this.Ab.i;case 1:return null!=this.zb}return O3(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n))},MWn.sh=function(n,t){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),sqn(this.Ab),!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void pX(this.Ab,BB(t,14));case 1:return void this.Lh(SD(t))}Lbn(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n),t)},MWn.zh=function(){return gWn(),w$t},MWn.Bh=function(n){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void sqn(this.Ab);case 1:return void this.Lh(null)}qfn(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n))},MWn.ne=function(){return this.zb},MWn.Lh=function(n){Nrn(this,n)},MWn.Ib=function(){return kfn(this)},MWn.zb=null,vX(l6n,"ENamedElementImpl",438),wAn(179,438,{105:1,92:1,90:1,147:1,191:1,56:1,235:1,108:1,49:1,97:1,150:1,179:1,114:1,115:1,675:1},vY),MWn.Qg=function(n){return wkn(this,n)},MWn._g=function(n,t,e){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),this.Ab;case 1:return this.zb;case 2:return this.yb;case 3:return this.xb;case 4:return this.sb;case 5:return!this.rb&&(this.rb=new Jz(this,HAt,this)),this.rb;case 6:return!this.vb&&(this.vb=new eK(GOt,this,6,7)),this.vb;case 7:return t?this.Db>>16==7?BB(this.Cb,235):null:QJ(this)}return U9(this,n-bX((gWn(),v$t)),itn(BB(yan(this,16),26)||v$t,n),t,e)},MWn.hh=function(n,t,e){var i;switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),Ywn(this.Ab,n,e);case 4:return this.sb&&(e=BB(this.sb,49).ih(this,1,HOt,e)),jfn(this,BB(n,471),e);case 5:return!this.rb&&(this.rb=new Jz(this,HAt,this)),Ywn(this.rb,n,e);case 6:return!this.vb&&(this.vb=new eK(GOt,this,6,7)),Ywn(this.vb,n,e);case 7:return this.Cb&&(e=(i=this.Db>>16)>=0?wkn(this,e):this.Cb.ih(this,-1-i,null,e)),T_n(this,n,7,e)}return BB(itn(BB(yan(this,16),26)||(gWn(),v$t),t),66).Nj().Qj(this,fgn(this),t-bX((gWn(),v$t)),n,e)},MWn.jh=function(n,t,e){switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),_pn(this.Ab,n,e);case 4:return jfn(this,null,e);case 5:return!this.rb&&(this.rb=new Jz(this,HAt,this)),_pn(this.rb,n,e);case 6:return!this.vb&&(this.vb=new eK(GOt,this,6,7)),_pn(this.vb,n,e);case 7:return T_n(this,null,7,e)}return BB(itn(BB(yan(this,16),26)||(gWn(),v$t),t),66).Nj().Rj(this,fgn(this),t-bX((gWn(),v$t)),n,e)},MWn.lh=function(n){switch(n){case 0:return!!this.Ab&&0!=this.Ab.i;case 1:return null!=this.zb;case 2:return null!=this.yb;case 3:return null!=this.xb;case 4:return!!this.sb;case 5:return!!this.rb&&0!=this.rb.i;case 6:return!!this.vb&&0!=this.vb.i;case 7:return!!QJ(this)}return O3(this,n-bX((gWn(),v$t)),itn(BB(yan(this,16),26)||v$t,n))},MWn.oh=function(n){return LNn(this,n)||hUn(this,n)},MWn.sh=function(n,t){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),sqn(this.Ab),!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void pX(this.Ab,BB(t,14));case 1:return void Nrn(this,SD(t));case 2:return void Drn(this,SD(t));case 3:return void xrn(this,SD(t));case 4:return void iSn(this,BB(t,471));case 5:return!this.rb&&(this.rb=new Jz(this,HAt,this)),sqn(this.rb),!this.rb&&(this.rb=new Jz(this,HAt,this)),void pX(this.rb,BB(t,14));case 6:return!this.vb&&(this.vb=new eK(GOt,this,6,7)),sqn(this.vb),!this.vb&&(this.vb=new eK(GOt,this,6,7)),void pX(this.vb,BB(t,14))}Lbn(this,n-bX((gWn(),v$t)),itn(BB(yan(this,16),26)||v$t,n),t)},MWn.vh=function(n){var t,e;if(n&&this.rb)for(e=new AL(this.rb);e.e!=e.i.gc();)cL(t=kpn(e),351)&&(BB(t,351).w=null);hgn(this,64,n)},MWn.zh=function(){return gWn(),v$t},MWn.Bh=function(n){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void sqn(this.Ab);case 1:return void Nrn(this,null);case 2:return void Drn(this,null);case 3:return void xrn(this,null);case 4:return void iSn(this,null);case 5:return!this.rb&&(this.rb=new Jz(this,HAt,this)),void sqn(this.rb);case 6:return!this.vb&&(this.vb=new eK(GOt,this,6,7)),void sqn(this.vb)}qfn(this,n-bX((gWn(),v$t)),itn(BB(yan(this,16),26)||v$t,n))},MWn.Gh=function(){Tyn(this)},MWn.Mh=function(){return!this.rb&&(this.rb=new Jz(this,HAt,this)),this.rb},MWn.Nh=function(){return this.sb},MWn.Oh=function(){return this.ub},MWn.Ph=function(){return this.xb},MWn.Qh=function(){return this.yb},MWn.Rh=function(n){this.ub=n},MWn.Ib=function(){var n;return 0!=(64&this.Db)?kfn(this):((n=new fN(kfn(this))).a+=" (nsURI: ",cO(n,this.yb),n.a+=", nsPrefix: ",cO(n,this.xb),n.a+=")",n.a)},MWn.xb=null,MWn.yb=null,vX(l6n,"EPackageImpl",179),wAn(555,179,{105:1,2016:1,555:1,92:1,90:1,147:1,191:1,56:1,235:1,108:1,49:1,97:1,150:1,179:1,114:1,115:1,675:1},sAn),MWn.q=!1,MWn.r=!1;var WOt=!1;vX(b6n,"ElkGraphPackageImpl",555),wAn(354,724,{105:1,413:1,160:1,137:1,470:1,354:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1},uo),MWn.Qg=function(n){return hkn(this,n)},MWn._g=function(n,t,e){switch(n){case 7:return YJ(this);case 8:return this.a}return Rbn(this,n,t,e)},MWn.hh=function(n,t,e){var i;return 7===t?(this.Cb&&(e=(i=this.Db>>16)>=0?hkn(this,e):this.Cb.ih(this,-1-i,null,e)),VG(this,BB(n,160),e)):FTn(this,n,t,e)},MWn.jh=function(n,t,e){return 7==t?VG(this,null,e):run(this,n,t,e)},MWn.lh=function(n){switch(n){case 7:return!!YJ(this);case 8:return!mK("",this.a)}return fwn(this,n)},MWn.sh=function(n,t){switch(n){case 7:return void INn(this,BB(t,160));case 8:return void xin(this,SD(t))}zjn(this,n,t)},MWn.zh=function(){return CXn(),jOt},MWn.Bh=function(n){switch(n){case 7:return void INn(this,null);case 8:return void xin(this,"")}Dwn(this,n)},MWn.Ib=function(){return cPn(this)},MWn.a="",vX(b6n,"ElkLabelImpl",354),wAn(239,725,{105:1,413:1,82:1,160:1,33:1,470:1,239:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1},jm),MWn.Qg=function(n){return Skn(this,n)},MWn._g=function(n,t,e){switch(n){case 9:return!this.c&&(this.c=new eU(XOt,this,9,9)),this.c;case 10:return!this.a&&(this.a=new eU(UOt,this,10,11)),this.a;case 11:return JJ(this);case 12:return!this.b&&(this.b=new eU(_Ot,this,12,3)),this.b;case 13:return hN(),!this.a&&(this.a=new eU(UOt,this,10,11)),this.a.i>0}return Hvn(this,n,t,e)},MWn.hh=function(n,t,e){var i;switch(t){case 9:return!this.c&&(this.c=new eU(XOt,this,9,9)),Ywn(this.c,n,e);case 10:return!this.a&&(this.a=new eU(UOt,this,10,11)),Ywn(this.a,n,e);case 11:return this.Cb&&(e=(i=this.Db>>16)>=0?Skn(this,e):this.Cb.ih(this,-1-i,null,e)),zR(this,BB(n,33),e);case 12:return!this.b&&(this.b=new eU(_Ot,this,12,3)),Ywn(this.b,n,e)}return djn(this,n,t,e)},MWn.jh=function(n,t,e){switch(t){case 9:return!this.c&&(this.c=new eU(XOt,this,9,9)),_pn(this.c,n,e);case 10:return!this.a&&(this.a=new eU(UOt,this,10,11)),_pn(this.a,n,e);case 11:return zR(this,null,e);case 12:return!this.b&&(this.b=new eU(_Ot,this,12,3)),_pn(this.b,n,e)}return gjn(this,n,t,e)},MWn.lh=function(n){switch(n){case 9:return!!this.c&&0!=this.c.i;case 10:return!!this.a&&0!=this.a.i;case 11:return!!JJ(this);case 12:return!!this.b&&0!=this.b.i;case 13:return!this.a&&(this.a=new eU(UOt,this,10,11)),this.a.i>0}return Gon(this,n)},MWn.sh=function(n,t){switch(n){case 9:return!this.c&&(this.c=new eU(XOt,this,9,9)),sqn(this.c),!this.c&&(this.c=new eU(XOt,this,9,9)),void pX(this.c,BB(t,14));case 10:return!this.a&&(this.a=new eU(UOt,this,10,11)),sqn(this.a),!this.a&&(this.a=new eU(UOt,this,10,11)),void pX(this.a,BB(t,14));case 11:return void nNn(this,BB(t,33));case 12:return!this.b&&(this.b=new eU(_Ot,this,12,3)),sqn(this.b),!this.b&&(this.b=new eU(_Ot,this,12,3)),void pX(this.b,BB(t,14))}LAn(this,n,t)},MWn.zh=function(){return CXn(),EOt},MWn.Bh=function(n){switch(n){case 9:return!this.c&&(this.c=new eU(XOt,this,9,9)),void sqn(this.c);case 10:return!this.a&&(this.a=new eU(UOt,this,10,11)),void sqn(this.a);case 11:return void nNn(this,null);case 12:return!this.b&&(this.b=new eU(_Ot,this,12,3)),void sqn(this.b)}xpn(this,n)},MWn.Ib=function(){return zRn(this)},vX(b6n,"ElkNodeImpl",239),wAn(186,725,{105:1,413:1,82:1,160:1,118:1,470:1,186:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1},Em),MWn.Qg=function(n){return fkn(this,n)},MWn._g=function(n,t,e){return 9==n?WJ(this):Hvn(this,n,t,e)},MWn.hh=function(n,t,e){var i;return 9===t?(this.Cb&&(e=(i=this.Db>>16)>=0?fkn(this,e):this.Cb.ih(this,-1-i,null,e)),YD(this,BB(n,33),e)):djn(this,n,t,e)},MWn.jh=function(n,t,e){return 9==t?YD(this,null,e):gjn(this,n,t,e)},MWn.lh=function(n){return 9==n?!!WJ(this):Gon(this,n)},MWn.sh=function(n,t){9!==n?LAn(this,n,t):BLn(this,BB(t,33))},MWn.zh=function(){return CXn(),TOt},MWn.Bh=function(n){9!==n?xpn(this,n):BLn(this,null)},MWn.Ib=function(){return URn(this)},vX(b6n,"ElkPortImpl",186);var VOt=bq(B6n,"BasicEMap/Entry");wAn(1092,115,{105:1,42:1,92:1,90:1,133:1,56:1,108:1,49:1,97:1,114:1,115:1},so),MWn.Fb=function(n){return this===n},MWn.cd=function(){return this.b},MWn.Hb=function(){return PN(this)},MWn.Uh=function(n){Din(this,BB(n,146))},MWn._g=function(n,t,e){switch(n){case 0:return this.b;case 1:return this.c}return Zpn(this,n,t,e)},MWn.lh=function(n){switch(n){case 0:return!!this.b;case 1:return null!=this.c}return vpn(this,n)},MWn.sh=function(n,t){switch(n){case 0:return void Din(this,BB(t,146));case 1:return void _in(this,t)}yCn(this,n,t)},MWn.zh=function(){return CXn(),MOt},MWn.Bh=function(n){switch(n){case 0:return void Din(this,null);case 1:return void _in(this,null)}mPn(this,n)},MWn.Sh=function(){var n;return-1==this.a&&(n=this.b,this.a=n?nsn(n):0),this.a},MWn.dd=function(){return this.c},MWn.Th=function(n){this.a=n},MWn.ed=function(n){var t;return t=this.c,_in(this,n),t},MWn.Ib=function(){var n;return 0!=(64&this.Db)?P$n(this):(oO(oO(oO(n=new Ck,this.b?this.b.tg():zWn),e1n),kN(this.c)),n.a)},MWn.a=-1,MWn.c=null;var QOt,YOt,JOt,ZOt,nAt,tAt,eAt,iAt,rAt=vX(b6n,"ElkPropertyToValueMapEntryImpl",1092);wAn(984,1,{},lo),vX(G6n,"JsonAdapter",984),wAn(210,60,BVn,ek),vX(G6n,"JsonImportException",210),wAn(857,1,{},dkn),vX(G6n,"JsonImporter",857),wAn(891,1,{},aI),vX(G6n,"JsonImporter/lambda$0$Type",891),wAn(892,1,{},uI),vX(G6n,"JsonImporter/lambda$1$Type",892),wAn(900,1,{},$g),vX(G6n,"JsonImporter/lambda$10$Type",900),wAn(902,1,{},oI),vX(G6n,"JsonImporter/lambda$11$Type",902),wAn(903,1,{},sI),vX(G6n,"JsonImporter/lambda$12$Type",903),wAn(909,1,{},fQ),vX(G6n,"JsonImporter/lambda$13$Type",909),wAn(908,1,{},hQ),vX(G6n,"JsonImporter/lambda$14$Type",908),wAn(904,1,{},hI),vX(G6n,"JsonImporter/lambda$15$Type",904),wAn(905,1,{},fI),vX(G6n,"JsonImporter/lambda$16$Type",905),wAn(906,1,{},lI),vX(G6n,"JsonImporter/lambda$17$Type",906),wAn(907,1,{},bI),vX(G6n,"JsonImporter/lambda$18$Type",907),wAn(912,1,{},Lg),vX(G6n,"JsonImporter/lambda$19$Type",912),wAn(893,1,{},Ng),vX(G6n,"JsonImporter/lambda$2$Type",893),wAn(910,1,{},xg),vX(G6n,"JsonImporter/lambda$20$Type",910),wAn(911,1,{},Dg),vX(G6n,"JsonImporter/lambda$21$Type",911),wAn(915,1,{},Rg),vX(G6n,"JsonImporter/lambda$22$Type",915),wAn(913,1,{},Kg),vX(G6n,"JsonImporter/lambda$23$Type",913),wAn(914,1,{},_g),vX(G6n,"JsonImporter/lambda$24$Type",914),wAn(917,1,{},Fg),vX(G6n,"JsonImporter/lambda$25$Type",917),wAn(916,1,{},Bg),vX(G6n,"JsonImporter/lambda$26$Type",916),wAn(918,1,lVn,wI),MWn.td=function(n){E9(this.b,this.a,SD(n))},vX(G6n,"JsonImporter/lambda$27$Type",918),wAn(919,1,lVn,dI),MWn.td=function(n){T9(this.b,this.a,SD(n))},vX(G6n,"JsonImporter/lambda$28$Type",919),wAn(920,1,{},gI),vX(G6n,"JsonImporter/lambda$29$Type",920),wAn(896,1,{},Hg),vX(G6n,"JsonImporter/lambda$3$Type",896),wAn(921,1,{},pI),vX(G6n,"JsonImporter/lambda$30$Type",921),wAn(922,1,{},qg),vX(G6n,"JsonImporter/lambda$31$Type",922),wAn(923,1,{},Gg),vX(G6n,"JsonImporter/lambda$32$Type",923),wAn(924,1,{},zg),vX(G6n,"JsonImporter/lambda$33$Type",924),wAn(925,1,{},Ug),vX(G6n,"JsonImporter/lambda$34$Type",925),wAn(859,1,{},Xg),vX(G6n,"JsonImporter/lambda$35$Type",859),wAn(929,1,{},MB),vX(G6n,"JsonImporter/lambda$36$Type",929),wAn(926,1,lVn,Wg),MWn.td=function(n){Y4(this.a,BB(n,469))},vX(G6n,"JsonImporter/lambda$37$Type",926),wAn(927,1,lVn,SI),MWn.td=function(n){lO(this.a,this.b,BB(n,202))},vX(G6n,"JsonImporter/lambda$38$Type",927),wAn(928,1,lVn,PI),MWn.td=function(n){bO(this.a,this.b,BB(n,202))},vX(G6n,"JsonImporter/lambda$39$Type",928),wAn(894,1,{},Vg),vX(G6n,"JsonImporter/lambda$4$Type",894),wAn(930,1,lVn,Qg),MWn.td=function(n){J4(this.a,BB(n,8))},vX(G6n,"JsonImporter/lambda$40$Type",930),wAn(895,1,{},Yg),vX(G6n,"JsonImporter/lambda$5$Type",895),wAn(899,1,{},Jg),vX(G6n,"JsonImporter/lambda$6$Type",899),wAn(897,1,{},Zg),vX(G6n,"JsonImporter/lambda$7$Type",897),wAn(898,1,{},np),vX(G6n,"JsonImporter/lambda$8$Type",898),wAn(901,1,{},tp),vX(G6n,"JsonImporter/lambda$9$Type",901),wAn(948,1,lVn,ep),MWn.td=function(n){nW(this.a,new GX(SD(n)))},vX(G6n,"JsonMetaDataConverter/lambda$0$Type",948),wAn(949,1,lVn,ip),MWn.td=function(n){_X(this.a,BB(n,237))},vX(G6n,"JsonMetaDataConverter/lambda$1$Type",949),wAn(950,1,lVn,rp),MWn.td=function(n){t1(this.a,BB(n,149))},vX(G6n,"JsonMetaDataConverter/lambda$2$Type",950),wAn(951,1,lVn,cp),MWn.td=function(n){FX(this.a,BB(n,175))},vX(G6n,"JsonMetaDataConverter/lambda$3$Type",951),wAn(237,22,{3:1,35:1,22:1,237:1},MI);var cAt,aAt=Ben(IJn,"GraphFeature",237,Unt,Ktn,pB);wAn(13,1,{35:1,146:1},up,iR,$O,XA),MWn.wd=function(n){return pL(this,BB(n,146))},MWn.Fb=function(n){return EY(this,n)},MWn.wg=function(){return mpn(this)},MWn.tg=function(){return this.b},MWn.Hb=function(){return vvn(this.b)},MWn.Ib=function(){return this.b},vX(IJn,"Property",13),wAn(818,1,MYn,ap),MWn.ue=function(n,t){return _ln(this,BB(n,94),BB(t,94))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(IJn,"PropertyHolderComparator",818),wAn(695,1,QWn,sp),MWn.Nb=function(n){fU(this,n)},MWn.Pb=function(){return A9(this)},MWn.Qb=function(){uE()},MWn.Ob=function(){return!!this.a},vX(c8n,"ElkGraphUtil/AncestorIterator",695);var uAt=bq(B6n,"EList");wAn(67,52,{20:1,28:1,52:1,14:1,15:1,67:1,58:1}),MWn.Vc=function(n,t){sln(this,n,t)},MWn.Fc=function(n){return f9(this,n)},MWn.Wc=function(n,t){return oon(this,n,t)},MWn.Gc=function(n){return pX(this,n)},MWn.Zh=function(){return new ax(this)},MWn.$h=function(){return new ux(this)},MWn._h=function(n){return sin(this,n)},MWn.ai=function(){return!0},MWn.bi=function(n,t){},MWn.ci=function(){},MWn.di=function(n,t){L8(this,n,t)},MWn.ei=function(n,t,e){},MWn.fi=function(n,t){},MWn.gi=function(n,t,e){},MWn.Fb=function(n){return QDn(this,n)},MWn.Hb=function(){return Mun(this)},MWn.hi=function(){return!1},MWn.Kc=function(){return new AL(this)},MWn.Yc=function(){return new cx(this)},MWn.Zc=function(n){var t;if(t=this.gc(),n<0||n>t)throw Hp(new tK(n,t));return new GU(this,n)},MWn.ji=function(n,t){this.ii(n,this.Xc(t))},MWn.Mc=function(n){return snn(this,n)},MWn.li=function(n,t){return t},MWn._c=function(n,t){return ovn(this,n,t)},MWn.Ib=function(){return Jbn(this)},MWn.ni=function(){return!0},MWn.oi=function(n,t){return xsn(this,t)},vX(B6n,"AbstractEList",67),wAn(63,67,h8n,go,gtn,jcn),MWn.Vh=function(n,t){return BTn(this,n,t)},MWn.Wh=function(n){return bmn(this,n)},MWn.Xh=function(n,t){Ifn(this,n,t)},MWn.Yh=function(n){c6(this,n)},MWn.pi=function(n){return F9(this,n)},MWn.$b=function(){a6(this)},MWn.Hc=function(n){return Sjn(this,n)},MWn.Xb=function(n){return Wtn(this,n)},MWn.qi=function(n){var t,e,i;++this.j,n>(e=null==this.g?0:this.g.length)&&(i=this.g,(t=e+(e/2|0)+4)<n&&(t=n),this.g=this.ri(t),null!=i&&aHn(i,0,this.g,0,this.i))},MWn.Xc=function(n){return Wyn(this,n)},MWn.dc=function(){return 0==this.i},MWn.ii=function(n,t){return YIn(this,n,t)},MWn.ri=function(n){return x8(Ant,HWn,1,n,5,1)},MWn.ki=function(n){return this.g[n]},MWn.$c=function(n){return Lyn(this,n)},MWn.mi=function(n,t){return onn(this,n,t)},MWn.gc=function(){return this.i},MWn.Pc=function(){return N3(this)},MWn.Qc=function(n){return Qwn(this,n)},MWn.i=0;var oAt=vX(B6n,"BasicEList",63),sAt=bq(B6n,"TreeIterator");wAn(694,63,f8n),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return null!=this.g||this.c?null==this.g||0!=this.i&&BB(this.g[this.i-1],47).Ob():tZ(this)},MWn.Pb=function(){return aLn(this)},MWn.Qb=function(){if(!this.e)throw Hp(new Fy("There is no valid object to remove."));this.e.Qb()},MWn.c=!1,vX(B6n,"AbstractTreeIterator",694),wAn(685,694,f8n,OA),MWn.si=function(n){var t;return cL(t=BB(n,56).Wg().Kc(),279)&&BB(t,279).Nk(new bo),t},vX(c8n,"ElkGraphUtil/PropertiesSkippingTreeIterator",685),wAn(952,1,{},bo),vX(c8n,"ElkGraphUtil/PropertiesSkippingTreeIterator/1",952);var hAt,fAt,lAt,bAt=vX(c8n,"ElkReflect",null);wAn(889,1,i5n,wo),MWn.vg=function(n){return hZ(),B6(BB(n,174))},vX(c8n,"ElkReflect/lambda$0$Type",889),bq(B6n,"ResourceLocator"),wAn(1051,1,{}),vX(B6n,"DelegatingResourceLocator",1051),wAn(1052,1051,{}),vX("org.eclipse.emf.common","EMFPlugin",1052);var wAt,dAt=bq(J8n,"Adapter"),gAt=bq(J8n,"Notification");wAn(1153,1,Z8n),MWn.ti=function(){return this.d},MWn.ui=function(n){},MWn.vi=function(n){this.d=n},MWn.wi=function(n){this.d==n&&(this.d=null)},MWn.d=null,vX(i6n,"AdapterImpl",1153),wAn(1995,67,n9n),MWn.Vh=function(n,t){return kwn(this,n,t)},MWn.Wh=function(n){var t,e,i;if(++this.j,n.dc())return!1;for(t=this.Vi(),i=n.Kc();i.Ob();)e=i.Pb(),this.Ii(this.oi(t,e)),++t;return!0},MWn.Xh=function(n,t){ZD(this,n,t)},MWn.Yh=function(n){eW(this,n)},MWn.Gi=function(){return this.Ji()},MWn.$b=function(){JD(this,this.Vi(),this.Wi())},MWn.Hc=function(n){return this.Li(n)},MWn.Ic=function(n){return this.Mi(n)},MWn.Hi=function(n,t){this.Si().jm()},MWn.Ii=function(n){this.Si().jm()},MWn.Ji=function(){return this.Si()},MWn.Ki=function(){this.Si().jm()},MWn.Li=function(n){return this.Si().jm()},MWn.Mi=function(n){return this.Si().jm()},MWn.Ni=function(n){return this.Si().jm()},MWn.Oi=function(n){return this.Si().jm()},MWn.Pi=function(){return this.Si().jm()},MWn.Qi=function(n){return this.Si().jm()},MWn.Ri=function(){return this.Si().jm()},MWn.Ti=function(n){return this.Si().jm()},MWn.Ui=function(n,t){return this.Si().jm()},MWn.Vi=function(){return this.Si().jm()},MWn.Wi=function(){return this.Si().jm()},MWn.Xi=function(n){return this.Si().jm()},MWn.Yi=function(){return this.Si().jm()},MWn.Fb=function(n){return this.Ni(n)},MWn.Xb=function(n){return this.li(n,this.Oi(n))},MWn.Hb=function(){return this.Pi()},MWn.Xc=function(n){return this.Qi(n)},MWn.dc=function(){return this.Ri()},MWn.ii=function(n,t){return AMn(this,n,t)},MWn.ki=function(n){return this.Oi(n)},MWn.$c=function(n){return wq(this,n)},MWn.Mc=function(n){var t;return(t=this.Xc(n))>=0&&(this.$c(t),!0)},MWn.mi=function(n,t){return this.Ui(n,this.oi(n,t))},MWn.gc=function(){return this.Vi()},MWn.Pc=function(){return this.Wi()},MWn.Qc=function(n){return this.Xi(n)},MWn.Ib=function(){return this.Yi()},vX(B6n,"DelegatingEList",1995),wAn(1996,1995,n9n),MWn.Vh=function(n,t){return uFn(this,n,t)},MWn.Wh=function(n){return this.Vh(this.Vi(),n)},MWn.Xh=function(n,t){eAn(this,n,t)},MWn.Yh=function(n){OOn(this,n)},MWn.ai=function(){return!this.bj()},MWn.$b=function(){vqn(this)},MWn.Zi=function(n,t,e,i,r){return new NY(this,n,t,e,i,r)},MWn.$i=function(n){ban(this.Ai(),n)},MWn._i=function(){return null},MWn.aj=function(){return-1},MWn.Ai=function(){return null},MWn.bj=function(){return!1},MWn.cj=function(n,t){return t},MWn.dj=function(n,t){return t},MWn.ej=function(){return!1},MWn.fj=function(){return!this.Ri()},MWn.ii=function(n,t){var e,i;return this.ej()?(i=this.fj(),e=AMn(this,n,t),this.$i(this.Zi(7,iln(t),e,n,i)),e):AMn(this,n,t)},MWn.$c=function(n){var t,e,i,r;return this.ej()?(e=null,i=this.fj(),t=this.Zi(4,r=wq(this,n),null,n,i),this.bj()&&r?(e=this.dj(r,e))?(e.Ei(t),e.Fi()):this.$i(t):e?(e.Ei(t),e.Fi()):this.$i(t),r):(r=wq(this,n),this.bj()&&r&&(e=this.dj(r,null))&&e.Fi(),r)},MWn.mi=function(n,t){return oFn(this,n,t)},vX(i6n,"DelegatingNotifyingListImpl",1996),wAn(143,1,t9n),MWn.Ei=function(n){return KEn(this,n)},MWn.Fi=function(){$7(this)},MWn.xi=function(){return this.d},MWn._i=function(){return null},MWn.gj=function(){return null},MWn.yi=function(n){return-1},MWn.zi=function(){return Rxn(this)},MWn.Ai=function(){return null},MWn.Bi=function(){return Kxn(this)},MWn.Ci=function(){return this.o<0?this.o<-2?-2-this.o-1:-1:this.o},MWn.hj=function(){return!1},MWn.Di=function(n){var t,e,i,r,c,a,u,o;switch(this.d){case 1:case 2:switch(n.xi()){case 1:case 2:if(GI(n.Ai())===GI(this.Ai())&&this.yi(null)==n.yi(null))return this.g=n.zi(),1==n.xi()&&(this.d=1),!0}case 4:if(4===n.xi()&&GI(n.Ai())===GI(this.Ai())&&this.yi(null)==n.yi(null))return a=tGn(this),c=this.o<0?this.o<-2?-2-this.o-1:-1:this.o,i=n.Ci(),this.d=6,o=new gtn(2),c<=i?(f9(o,this.n),f9(o,n.Bi()),this.g=Pun(Gk(ANt,1),hQn,25,15,[this.o=c,i+1])):(f9(o,n.Bi()),f9(o,this.n),this.g=Pun(Gk(ANt,1),hQn,25,15,[this.o=i,c])),this.n=o,a||(this.o=-2-this.o-1),!0;break;case 6:if(4===n.xi()&&GI(n.Ai())===GI(this.Ai())&&this.yi(null)==n.yi(null)){for(a=tGn(this),i=n.Ci(),u=BB(this.g,48),e=x8(ANt,hQn,25,u.length+1,15,1),t=0;t<u.length&&(r=u[t])<=i;)e[t++]=r,++i;for(BB(this.n,15).Vc(t,n.Bi()),e[t]=i;++t<e.length;)e[t]=u[t-1];return this.g=e,a||(this.o=-2-e[0]),!0}}return!1},MWn.Ib=function(){var n,t,e;switch((e=new fN(nE(this.gm)+"@"+(nsn(this)>>>0).toString(16))).a+=" (eventType: ",this.d){case 1:e.a+="SET";break;case 2:e.a+="UNSET";break;case 3:e.a+="ADD";break;case 5:e.a+="ADD_MANY";break;case 4:e.a+="REMOVE";break;case 6:e.a+="REMOVE_MANY";break;case 7:e.a+="MOVE";break;case 8:e.a+="REMOVING_ADAPTER";break;case 9:e.a+="RESOLVE";break;default:mE(e,this.d)}if(lKn(this)&&(e.a+=", touch: true"),e.a+=", position: ",mE(e,this.o<0?this.o<-2?-2-this.o-1:-1:this.o),e.a+=", notifier: ",rO(e,this.Ai()),e.a+=", feature: ",rO(e,this._i()),e.a+=", oldValue: ",rO(e,Kxn(this)),e.a+=", newValue: ",6==this.d&&cL(this.g,48)){for(t=BB(this.g,48),e.a+="[",n=0;n<t.length;)e.a+=t[n],++n<t.length&&(e.a+=FWn);e.a+="]"}else rO(e,Rxn(this));return e.a+=", isTouch: ",yE(e,lKn(this)),e.a+=", wasSet: ",yE(e,tGn(this)),e.a+=")",e.a},MWn.d=0,MWn.e=0,MWn.f=0,MWn.j=0,MWn.k=0,MWn.o=0,MWn.p=0,vX(i6n,"NotificationImpl",143),wAn(1167,143,t9n,NY),MWn._i=function(){return this.a._i()},MWn.yi=function(n){return this.a.aj()},MWn.Ai=function(){return this.a.Ai()},vX(i6n,"DelegatingNotifyingListImpl/1",1167),wAn(242,63,h8n,po,Fj),MWn.Fc=function(n){return Mwn(this,BB(n,366))},MWn.Ei=function(n){return Mwn(this,n)},MWn.Fi=function(){var n,t,e;for(n=0;n<this.i;++n)null!=(e=(t=BB(this.g[n],366)).Ai())&&-1!=t.xi()&&BB(e,92).Ng(t)},MWn.ri=function(n){return x8(gAt,HWn,366,n,0,1)},vX(i6n,"NotificationChainImpl",242),wAn(1378,90,e6n),MWn.Kg=function(){return this.e},MWn.Mg=function(){return 0!=(1&this.f)},MWn.f=1,vX(i6n,"NotifierImpl",1378),wAn(1993,63,h8n),MWn.Vh=function(n,t){return LFn(this,n,t)},MWn.Wh=function(n){return this.Vh(this.i,n)},MWn.Xh=function(n,t){qOn(this,n,t)},MWn.Yh=function(n){tAn(this,n)},MWn.ai=function(){return!this.bj()},MWn.$b=function(){sqn(this)},MWn.Zi=function(n,t,e,i,r){return new xY(this,n,t,e,i,r)},MWn.$i=function(n){ban(this.Ai(),n)},MWn._i=function(){return null},MWn.aj=function(){return-1},MWn.Ai=function(){return null},MWn.bj=function(){return!1},MWn.ij=function(){return!1},MWn.cj=function(n,t){return t},MWn.dj=function(n,t){return t},MWn.ej=function(){return!1},MWn.fj=function(){return 0!=this.i},MWn.ii=function(n,t){return Iln(this,n,t)},MWn.$c=function(n){return fDn(this,n)},MWn.mi=function(n,t){return fBn(this,n,t)},MWn.jj=function(n,t){return t},MWn.kj=function(n,t){return t},MWn.lj=function(n,t,e){return e},vX(i6n,"NotifyingListImpl",1993),wAn(1166,143,t9n,xY),MWn._i=function(){return this.a._i()},MWn.yi=function(n){return this.a.aj()},MWn.Ai=function(){return this.a.Ai()},vX(i6n,"NotifyingListImpl/1",1166),wAn(953,63,h8n,aR),MWn.Hc=function(n){return this.i>10?(this.b&&this.c.j==this.a||(this.b=new $q(this),this.a=this.j),FT(this.b,n)):Sjn(this,n)},MWn.ni=function(){return!0},MWn.a=0,vX(B6n,"AbstractEList/1",953),wAn(295,73,NQn,tK),vX(B6n,"AbstractEList/BasicIndexOutOfBoundsException",295),wAn(40,1,QWn,AL),MWn.Nb=function(n){fU(this,n)},MWn.mj=function(){if(this.i.j!=this.f)throw Hp(new vv)},MWn.nj=function(){return kpn(this)},MWn.Ob=function(){return this.e!=this.i.gc()},MWn.Pb=function(){return this.nj()},MWn.Qb=function(){Qjn(this)},MWn.e=0,MWn.f=0,MWn.g=-1,vX(B6n,"AbstractEList/EIterator",40),wAn(278,40,cVn,cx,GU),MWn.Qb=function(){Qjn(this)},MWn.Rb=function(n){odn(this,n)},MWn.oj=function(){var n;try{return n=this.d.Xb(--this.e),this.mj(),this.g=this.e,n}catch(t){throw cL(t=lun(t),73)?(this.mj(),Hp(new yv)):Hp(t)}},MWn.pj=function(n){kmn(this,n)},MWn.Sb=function(){return 0!=this.e},MWn.Tb=function(){return this.e},MWn.Ub=function(){return this.oj()},MWn.Vb=function(){return this.e-1},MWn.Wb=function(n){this.pj(n)},vX(B6n,"AbstractEList/EListIterator",278),wAn(341,40,QWn,ax),MWn.nj=function(){return jpn(this)},MWn.Qb=function(){throw Hp(new pv)},vX(B6n,"AbstractEList/NonResolvingEIterator",341),wAn(385,278,cVn,ux,RK),MWn.Rb=function(n){throw Hp(new pv)},MWn.nj=function(){var n;try{return n=this.c.ki(this.e),this.mj(),this.g=this.e++,n}catch(t){throw cL(t=lun(t),73)?(this.mj(),Hp(new yv)):Hp(t)}},MWn.oj=function(){var n;try{return n=this.c.ki(--this.e),this.mj(),this.g=this.e,n}catch(t){throw cL(t=lun(t),73)?(this.mj(),Hp(new yv)):Hp(t)}},MWn.Qb=function(){throw Hp(new pv)},MWn.Wb=function(n){throw Hp(new pv)},vX(B6n,"AbstractEList/NonResolvingEListIterator",385),wAn(1982,67,r9n),MWn.Vh=function(n,t){var e,i,r,c,a,u,o,s,h;if(0!=(i=t.gc())){for(e=Psn(this,(s=null==(o=BB(yan(this.a,4),126))?0:o.length)+i),(h=s-n)>0&&aHn(o,n,e,n+i,h),u=t.Kc(),c=0;c<i;++c)JA(e,n+c,xsn(this,a=u.Pb()));for(Fgn(this,e),r=0;r<i;++r)a=e[n],this.bi(n,a),++n;return!0}return++this.j,!1},MWn.Wh=function(n){var t,e,i,r,c,a,u,o,s;if(0!=(i=n.gc())){for(t=Psn(this,s=(o=null==(e=BB(yan(this.a,4),126))?0:e.length)+i),u=n.Kc(),c=o;c<s;++c)JA(t,c,xsn(this,a=u.Pb()));for(Fgn(this,t),r=o;r<s;++r)a=t[r],this.bi(r,a);return!0}return++this.j,!1},MWn.Xh=function(n,t){var e,i,r,c;e=Psn(this,(r=null==(i=BB(yan(this.a,4),126))?0:i.length)+1),c=xsn(this,t),n!=r&&aHn(i,n,e,n+1,r-n),$X(e,n,c),Fgn(this,e),this.bi(n,t)},MWn.Yh=function(n){var t,e,i;JA(t=Psn(this,(i=null==(e=BB(yan(this.a,4),126))?0:e.length)+1),i,xsn(this,n)),Fgn(this,t),this.bi(i,n)},MWn.Zh=function(){return new S5(this)},MWn.$h=function(){return new Yz(this)},MWn._h=function(n){var t,e;if(e=null==(t=BB(yan(this.a,4),126))?0:t.length,n<0||n>e)throw Hp(new tK(n,e));return new BW(this,n)},MWn.$b=function(){var n,t;++this.j,t=null==(n=BB(yan(this.a,4),126))?0:n.length,Fgn(this,null),L8(this,t,n)},MWn.Hc=function(n){var t,e,i,r;if(null!=(t=BB(yan(this.a,4),126)))if(null!=n){for(i=0,r=(e=t).length;i<r;++i)if(Nfn(n,e[i]))return!0}else for(i=0,r=(e=t).length;i<r;++i)if(GI(e[i])===GI(n))return!0;return!1},MWn.Xb=function(n){var t,e;if(n>=(e=null==(t=BB(yan(this.a,4),126))?0:t.length))throw Hp(new tK(n,e));return t[n]},MWn.Xc=function(n){var t,e,i;if(null!=(t=BB(yan(this.a,4),126)))if(null!=n){for(e=0,i=t.length;e<i;++e)if(Nfn(n,t[e]))return e}else for(e=0,i=t.length;e<i;++e)if(GI(t[e])===GI(n))return e;return-1},MWn.dc=function(){return null==BB(yan(this.a,4),126)},MWn.Kc=function(){return new M5(this)},MWn.Yc=function(){return new Qz(this)},MWn.Zc=function(n){var t,e;if(e=null==(t=BB(yan(this.a,4),126))?0:t.length,n<0||n>e)throw Hp(new tK(n,e));return new FW(this,n)},MWn.ii=function(n,t){var e,i,r;if(n>=(r=null==(e=$dn(this))?0:e.length))throw Hp(new Ay(u8n+n+o8n+r));if(t>=r)throw Hp(new Ay(s8n+t+o8n+r));return i=e[t],n!=t&&(n<t?aHn(e,n,e,n+1,t-n):aHn(e,t+1,e,t,n-t),$X(e,n,i),Fgn(this,e)),i},MWn.ki=function(n){return BB(yan(this.a,4),126)[n]},MWn.$c=function(n){return EOn(this,n)},MWn.mi=function(n,t){var e,i;return i=(e=$dn(this))[n],JA(e,n,xsn(this,t)),Fgn(this,e),i},MWn.gc=function(){var n;return null==(n=BB(yan(this.a,4),126))?0:n.length},MWn.Pc=function(){var n,t,e;return e=null==(n=BB(yan(this.a,4),126))?0:n.length,t=x8(dAt,i9n,415,e,0,1),e>0&&aHn(n,0,t,0,e),t},MWn.Qc=function(n){var t,e;return(e=null==(t=BB(yan(this.a,4),126))?0:t.length)>0&&(n.length<e&&(n=Den(tsn(n).c,e)),aHn(t,0,n,0,e)),n.length>e&&$X(n,e,null),n},vX(B6n,"ArrayDelegatingEList",1982),wAn(1038,40,QWn,M5),MWn.mj=function(){if(this.b.j!=this.f||GI(BB(yan(this.b.a,4),126))!==GI(this.a))throw Hp(new vv)},MWn.Qb=function(){Qjn(this),this.a=BB(yan(this.b.a,4),126)},vX(B6n,"ArrayDelegatingEList/EIterator",1038),wAn(706,278,cVn,Qz,FW),MWn.mj=function(){if(this.b.j!=this.f||GI(BB(yan(this.b.a,4),126))!==GI(this.a))throw Hp(new vv)},MWn.pj=function(n){kmn(this,n),this.a=BB(yan(this.b.a,4),126)},MWn.Qb=function(){Qjn(this),this.a=BB(yan(this.b.a,4),126)},vX(B6n,"ArrayDelegatingEList/EListIterator",706),wAn(1039,341,QWn,S5),MWn.mj=function(){if(this.b.j!=this.f||GI(BB(yan(this.b.a,4),126))!==GI(this.a))throw Hp(new vv)},vX(B6n,"ArrayDelegatingEList/NonResolvingEIterator",1039),wAn(707,385,cVn,Yz,BW),MWn.mj=function(){if(this.b.j!=this.f||GI(BB(yan(this.b.a,4),126))!==GI(this.a))throw Hp(new vv)},vX(B6n,"ArrayDelegatingEList/NonResolvingEListIterator",707),wAn(606,295,NQn,LO),vX(B6n,"BasicEList/BasicIndexOutOfBoundsException",606),wAn(696,63,h8n,DI),MWn.Vc=function(n,t){throw Hp(new pv)},MWn.Fc=function(n){throw Hp(new pv)},MWn.Wc=function(n,t){throw Hp(new pv)},MWn.Gc=function(n){throw Hp(new pv)},MWn.$b=function(){throw Hp(new pv)},MWn.qi=function(n){throw Hp(new pv)},MWn.Kc=function(){return this.Zh()},MWn.Yc=function(){return this.$h()},MWn.Zc=function(n){return this._h(n)},MWn.ii=function(n,t){throw Hp(new pv)},MWn.ji=function(n,t){throw Hp(new pv)},MWn.$c=function(n){throw Hp(new pv)},MWn.Mc=function(n){throw Hp(new pv)},MWn._c=function(n,t){throw Hp(new pv)},vX(B6n,"BasicEList/UnmodifiableEList",696),wAn(705,1,{3:1,20:1,14:1,15:1,58:1,589:1}),MWn.Vc=function(n,t){Q$(this,n,BB(t,42))},MWn.Fc=function(n){return aD(this,BB(n,42))},MWn.Jc=function(n){e5(this,n)},MWn.Xb=function(n){return BB(Wtn(this.c,n),133)},MWn.ii=function(n,t){return BB(this.c.ii(n,t),42)},MWn.ji=function(n,t){Y$(this,n,BB(t,42))},MWn.Lc=function(){return new Rq(null,new w1(this,16))},MWn.$c=function(n){return BB(this.c.$c(n),42)},MWn._c=function(n,t){return uX(this,n,BB(t,42))},MWn.ad=function(n){_rn(this,n)},MWn.Nc=function(){return new w1(this,16)},MWn.Oc=function(){return new Rq(null,new w1(this,16))},MWn.Wc=function(n,t){return this.c.Wc(n,t)},MWn.Gc=function(n){return this.c.Gc(n)},MWn.$b=function(){this.c.$b()},MWn.Hc=function(n){return this.c.Hc(n)},MWn.Ic=function(n){return oun(this.c,n)},MWn.qj=function(){var n,t;if(null==this.d){for(this.d=x8(oAt,c9n,63,2*this.f+1,0,1),t=this.e,this.f=0,n=this.c.Kc();n.e!=n.i.gc();)Ivn(this,BB(n.nj(),133));this.e=t}},MWn.Fb=function(n){return NK(this,n)},MWn.Hb=function(){return Mun(this.c)},MWn.Xc=function(n){return this.c.Xc(n)},MWn.rj=function(){this.c=new hp(this)},MWn.dc=function(){return 0==this.f},MWn.Kc=function(){return this.c.Kc()},MWn.Yc=function(){return this.c.Yc()},MWn.Zc=function(n){return this.c.Zc(n)},MWn.sj=function(){return A8(this)},MWn.tj=function(n,t,e){return new SB(n,t,e)},MWn.uj=function(){return new vo},MWn.Mc=function(n){return hin(this,n)},MWn.gc=function(){return this.f},MWn.bd=function(n,t){return new s1(this.c,n,t)},MWn.Pc=function(){return this.c.Pc()},MWn.Qc=function(n){return this.c.Qc(n)},MWn.Ib=function(){return Jbn(this.c)},MWn.e=0,MWn.f=0,vX(B6n,"BasicEMap",705),wAn(1033,63,h8n,hp),MWn.bi=function(n,t){Av(this,BB(t,133))},MWn.ei=function(n,t,e){var i;++(i=this,BB(t,133),i).a.e},MWn.fi=function(n,t){$v(this,BB(t,133))},MWn.gi=function(n,t,e){VN(this,BB(t,133),BB(e,133))},MWn.di=function(n,t){aan(this.a)},vX(B6n,"BasicEMap/1",1033),wAn(1034,63,h8n,vo),MWn.ri=function(n){return x8(vAt,a9n,612,n,0,1)},vX(B6n,"BasicEMap/2",1034),wAn(1035,nVn,tVn,fp),MWn.$b=function(){this.a.c.$b()},MWn.Hc=function(n){return rdn(this.a,n)},MWn.Kc=function(){return 0==this.a.f?(dD(),pAt.a):new Bj(this.a)},MWn.Mc=function(n){var t;return t=this.a.f,Wdn(this.a,n),this.a.f!=t},MWn.gc=function(){return this.a.f},vX(B6n,"BasicEMap/3",1035),wAn(1036,28,ZWn,lp),MWn.$b=function(){this.a.c.$b()},MWn.Hc=function(n){return YDn(this.a,n)},MWn.Kc=function(){return 0==this.a.f?(dD(),pAt.a):new Hj(this.a)},MWn.gc=function(){return this.a.f},vX(B6n,"BasicEMap/4",1036),wAn(1037,nVn,tVn,bp),MWn.$b=function(){this.a.c.$b()},MWn.Hc=function(n){var t,e,i,r,c,a,u,o,s;if(this.a.f>0&&cL(n,42)&&(this.a.qj(),r=null==(u=(o=BB(n,42)).cd())?0:nsn(u),c=eR(this.a,r),t=this.a.d[c]))for(e=BB(t.g,367),s=t.i,a=0;a<s;++a)if((i=e[a]).Sh()==r&&i.Fb(o))return!0;return!1},MWn.Kc=function(){return 0==this.a.f?(dD(),pAt.a):new pQ(this.a)},MWn.Mc=function(n){return IAn(this,n)},MWn.gc=function(){return this.a.f},vX(B6n,"BasicEMap/5",1037),wAn(613,1,QWn,pQ),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return-1!=this.b},MWn.Pb=function(){var n;if(this.f.e!=this.c)throw Hp(new vv);if(-1==this.b)throw Hp(new yv);return this.d=this.a,this.e=this.b,ujn(this),n=BB(this.f.d[this.d].g[this.e],133),this.vj(n)},MWn.Qb=function(){if(this.f.e!=this.c)throw Hp(new vv);if(-1==this.e)throw Hp(new dv);this.f.c.Mc(Wtn(this.f.d[this.d],this.e)),this.c=this.f.e,this.e=-1,this.a==this.d&&-1!=this.b&&--this.b},MWn.vj=function(n){return n},MWn.a=0,MWn.b=-1,MWn.c=0,MWn.d=0,MWn.e=0,vX(B6n,"BasicEMap/BasicEMapIterator",613),wAn(1031,613,QWn,Bj),MWn.vj=function(n){return n.cd()},vX(B6n,"BasicEMap/BasicEMapKeyIterator",1031),wAn(1032,613,QWn,Hj),MWn.vj=function(n){return n.dd()},vX(B6n,"BasicEMap/BasicEMapValueIterator",1032),wAn(1030,1,JWn,wp),MWn.wc=function(n){nan(this,n)},MWn.yc=function(n,t,e){return Zln(this,n,t,e)},MWn.$b=function(){this.a.c.$b()},MWn._b=function(n){return BI(this,n)},MWn.uc=function(n){return YDn(this.a,n)},MWn.vc=function(){return I8(this.a)},MWn.Fb=function(n){return NK(this.a,n)},MWn.xc=function(n){return cdn(this.a,n)},MWn.Hb=function(){return Mun(this.a.c)},MWn.dc=function(){return 0==this.a.f},MWn.ec=function(){return O8(this.a)},MWn.zc=function(n,t){return vjn(this.a,n,t)},MWn.Bc=function(n){return Wdn(this.a,n)},MWn.gc=function(){return this.a.f},MWn.Ib=function(){return Jbn(this.a.c)},MWn.Cc=function(){return C8(this.a)},vX(B6n,"BasicEMap/DelegatingMap",1030),wAn(612,1,{42:1,133:1,612:1},SB),MWn.Fb=function(n){var t;return!!cL(n,42)&&(t=BB(n,42),(null!=this.b?Nfn(this.b,t.cd()):GI(this.b)===GI(t.cd()))&&(null!=this.c?Nfn(this.c,t.dd()):GI(this.c)===GI(t.dd())))},MWn.Sh=function(){return this.a},MWn.cd=function(){return this.b},MWn.dd=function(){return this.c},MWn.Hb=function(){return this.a^(null==this.c?0:nsn(this.c))},MWn.Th=function(n){this.a=n},MWn.Uh=function(n){throw Hp(new sv)},MWn.ed=function(n){var t;return t=this.c,this.c=n,t},MWn.Ib=function(){return this.b+"->"+this.c},MWn.a=0;var pAt,vAt=vX(B6n,"BasicEMap/EntryImpl",612);wAn(536,1,{},oo),vX(B6n,"BasicEMap/View",536),wAn(768,1,{}),MWn.Fb=function(n){return NAn((SQ(),set),n)},MWn.Hb=function(){return Fon((SQ(),set))},MWn.Ib=function(){return LMn((SQ(),set))},vX(B6n,"ECollections/BasicEmptyUnmodifiableEList",768),wAn(1312,1,cVn,mo),MWn.Nb=function(n){fU(this,n)},MWn.Rb=function(n){throw Hp(new pv)},MWn.Ob=function(){return!1},MWn.Sb=function(){return!1},MWn.Pb=function(){throw Hp(new yv)},MWn.Tb=function(){return 0},MWn.Ub=function(){throw Hp(new yv)},MWn.Vb=function(){return-1},MWn.Qb=function(){throw Hp(new pv)},MWn.Wb=function(n){throw Hp(new pv)},vX(B6n,"ECollections/BasicEmptyUnmodifiableEList/1",1312),wAn(1310,768,{20:1,14:1,15:1,58:1},Tm),MWn.Vc=function(n,t){NE()},MWn.Fc=function(n){return xE()},MWn.Wc=function(n,t){return DE()},MWn.Gc=function(n){return RE()},MWn.$b=function(){KE()},MWn.Hc=function(n){return!1},MWn.Ic=function(n){return!1},MWn.Jc=function(n){e5(this,n)},MWn.Xb=function(n){return yO((SQ(),n)),null},MWn.Xc=function(n){return-1},MWn.dc=function(){return!0},MWn.Kc=function(){return this.a},MWn.Yc=function(){return this.a},MWn.Zc=function(n){return this.a},MWn.ii=function(n,t){return _E()},MWn.ji=function(n,t){FE()},MWn.Lc=function(){return new Rq(null,new w1(this,16))},MWn.$c=function(n){return BE()},MWn.Mc=function(n){return HE()},MWn._c=function(n,t){return qE()},MWn.gc=function(){return 0},MWn.ad=function(n){_rn(this,n)},MWn.Nc=function(){return new w1(this,16)},MWn.Oc=function(){return new Rq(null,new w1(this,16))},MWn.bd=function(n,t){return SQ(),new s1(set,n,t)},MWn.Pc=function(){return cz((SQ(),set))},MWn.Qc=function(n){return SQ(),Emn(set,n)},vX(B6n,"ECollections/EmptyUnmodifiableEList",1310),wAn(1311,768,{20:1,14:1,15:1,58:1,589:1},Mm),MWn.Vc=function(n,t){NE()},MWn.Fc=function(n){return xE()},MWn.Wc=function(n,t){return DE()},MWn.Gc=function(n){return RE()},MWn.$b=function(){KE()},MWn.Hc=function(n){return!1},MWn.Ic=function(n){return!1},MWn.Jc=function(n){e5(this,n)},MWn.Xb=function(n){return yO((SQ(),n)),null},MWn.Xc=function(n){return-1},MWn.dc=function(){return!0},MWn.Kc=function(){return this.a},MWn.Yc=function(){return this.a},MWn.Zc=function(n){return this.a},MWn.ii=function(n,t){return _E()},MWn.ji=function(n,t){FE()},MWn.Lc=function(){return new Rq(null,new w1(this,16))},MWn.$c=function(n){return BE()},MWn.Mc=function(n){return HE()},MWn._c=function(n,t){return qE()},MWn.gc=function(){return 0},MWn.ad=function(n){_rn(this,n)},MWn.Nc=function(){return new w1(this,16)},MWn.Oc=function(){return new Rq(null,new w1(this,16))},MWn.bd=function(n,t){return SQ(),new s1(set,n,t)},MWn.Pc=function(){return cz((SQ(),set))},MWn.Qc=function(n){return SQ(),Emn(set,n)},MWn.sj=function(){return SQ(),SQ(),het},vX(B6n,"ECollections/EmptyUnmodifiableEMap",1311);var mAt,yAt=bq(B6n,"Enumerator");wAn(281,1,{281:1},rRn),MWn.Fb=function(n){var t;return this===n||!!cL(n,281)&&(t=BB(n,281),this.f==t.f&&vG(this.i,t.i)&&pG(this.a,0!=(256&this.f)?0!=(256&t.f)?t.a:null:0!=(256&t.f)?null:t.a)&&pG(this.d,t.d)&&pG(this.g,t.g)&&pG(this.e,t.e)&&Spn(this,t))},MWn.Hb=function(){return this.f},MWn.Ib=function(){return M_n(this)},MWn.f=0;var kAt,jAt,EAt,TAt=0,MAt=0,SAt=0,PAt=0,CAt=0,IAt=0,OAt=0,AAt=0,$At=0,LAt=0,NAt=0,xAt=0,DAt=0;vX(B6n,"URI",281),wAn(1091,43,tYn,Sm),MWn.zc=function(n,t){return BB(mZ(this,SD(n),BB(t,281)),281)},vX(B6n,"URI/URICache",1091),wAn(497,63,h8n,fo,rG),MWn.hi=function(){return!0},vX(B6n,"UniqueEList",497),wAn(581,60,BVn,L7),vX(B6n,"WrappedException",581);var RAt,KAt=bq(q5n,s9n),_At=bq(q5n,h9n),FAt=bq(q5n,f9n),BAt=bq(q5n,l9n),HAt=bq(q5n,b9n),qAt=bq(q5n,"EClass"),GAt=bq(q5n,"EDataType");wAn(1183,43,tYn,Pm),MWn.xc=function(n){return XI(n)?SJ(this,n):qI(AY(this.f,n))},vX(q5n,"EDataType/Internal/ConversionDelegate/Factory/Registry/Impl",1183);var zAt,UAt,XAt=bq(q5n,"EEnum"),WAt=bq(q5n,w9n),VAt=bq(q5n,d9n),QAt=bq(q5n,g9n),YAt=bq(q5n,p9n),JAt=bq(q5n,v9n);wAn(1029,1,{},ho),MWn.Ib=function(){return"NIL"},vX(q5n,"EStructuralFeature/Internal/DynamicValueHolder/1",1029),wAn(1028,43,tYn,Cm),MWn.xc=function(n){return XI(n)?SJ(this,n):qI(AY(this.f,n))},vX(q5n,"EStructuralFeature/Internal/SettingDelegate/Factory/Registry/Impl",1028);var ZAt,n$t,t$t,e$t,i$t,r$t,c$t,a$t,u$t,o$t,s$t,h$t,f$t,l$t,b$t,w$t,d$t,g$t,p$t,v$t,m$t,y$t,k$t,j$t,E$t,T$t,M$t,S$t,P$t,C$t,I$t,O$t=bq(q5n,m9n),A$t=bq(q5n,"EValidator/PatternMatcher"),$$t=bq(y9n,"FeatureMap/Entry");wAn(535,1,{72:1},CI),MWn.ak=function(){return this.a},MWn.dd=function(){return this.b},vX(l6n,"BasicEObjectImpl/1",535),wAn(1027,1,k9n,II),MWn.Wj=function(n){return V5(this.a,this.b,n)},MWn.fj=function(){return ZJ(this.a,this.b)},MWn.Wb=function(n){NJ(this.a,this.b,n)},MWn.Xj=function(){PW(this.a,this.b)},vX(l6n,"BasicEObjectImpl/4",1027),wAn(1983,1,{108:1}),MWn.bk=function(n){this.e=0==n?M$t:x8(Ant,HWn,1,n,5,1)},MWn.Ch=function(n){return this.e[n]},MWn.Dh=function(n,t){this.e[n]=t},MWn.Eh=function(n){this.e[n]=null},MWn.ck=function(){return this.c},MWn.dk=function(){throw Hp(new pv)},MWn.ek=function(){throw Hp(new pv)},MWn.fk=function(){return this.d},MWn.gk=function(){return null!=this.e},MWn.hk=function(n){this.c=n},MWn.ik=function(n){throw Hp(new pv)},MWn.jk=function(n){throw Hp(new pv)},MWn.kk=function(n){this.d=n},vX(l6n,"BasicEObjectImpl/EPropertiesHolderBaseImpl",1983),wAn(185,1983,{108:1},Kf),MWn.dk=function(){return this.a},MWn.ek=function(){return this.b},MWn.ik=function(n){this.a=n},MWn.jk=function(n){this.b=n},vX(l6n,"BasicEObjectImpl/EPropertiesHolderImpl",185),wAn(506,97,f6n,yo),MWn.Kg=function(){return this.f},MWn.Pg=function(){return this.k},MWn.Rg=function(n,t){this.g=n,this.i=t},MWn.Tg=function(){return 0==(2&this.j)?this.zh():this.ph().ck()},MWn.Vg=function(){return this.i},MWn.Mg=function(){return 0!=(1&this.j)},MWn.eh=function(){return this.g},MWn.kh=function(){return 0!=(4&this.j)},MWn.ph=function(){return!this.k&&(this.k=new Kf),this.k},MWn.th=function(n){this.ph().hk(n),n?this.j|=2:this.j&=-3},MWn.vh=function(n){this.ph().jk(n),n?this.j|=4:this.j&=-5},MWn.zh=function(){return(QX(),t$t).S},MWn.i=0,MWn.j=1,vX(l6n,"EObjectImpl",506),wAn(780,506,{105:1,92:1,90:1,56:1,108:1,49:1,97:1},jH),MWn.Ch=function(n){return this.e[n]},MWn.Dh=function(n,t){this.e[n]=t},MWn.Eh=function(n){this.e[n]=null},MWn.Tg=function(){return this.d},MWn.Yg=function(n){return Awn(this.d,n)},MWn.$g=function(){return this.d},MWn.dh=function(){return null!=this.e},MWn.ph=function(){return!this.k&&(this.k=new ko),this.k},MWn.th=function(n){this.d=n},MWn.yh=function(){var n;return null==this.e&&(n=bX(this.d),this.e=0==n?S$t:x8(Ant,HWn,1,n,5,1)),this},MWn.Ah=function(){return 0},vX(l6n,"DynamicEObjectImpl",780),wAn(1376,780,{105:1,42:1,92:1,90:1,133:1,56:1,108:1,49:1,97:1},fq),MWn.Fb=function(n){return this===n},MWn.Hb=function(){return PN(this)},MWn.th=function(n){this.d=n,this.b=NNn(n,"key"),this.c=NNn(n,E6n)},MWn.Sh=function(){var n;return-1==this.a&&(n=J7(this,this.b),this.a=null==n?0:nsn(n)),this.a},MWn.cd=function(){return J7(this,this.b)},MWn.dd=function(){return J7(this,this.c)},MWn.Th=function(n){this.a=n},MWn.Uh=function(n){NJ(this,this.b,n)},MWn.ed=function(n){var t;return t=J7(this,this.c),NJ(this,this.c,n),t},MWn.a=0,vX(l6n,"DynamicEObjectImpl/BasicEMapEntry",1376),wAn(1377,1,{108:1},ko),MWn.bk=function(n){throw Hp(new pv)},MWn.Ch=function(n){throw Hp(new pv)},MWn.Dh=function(n,t){throw Hp(new pv)},MWn.Eh=function(n){throw Hp(new pv)},MWn.ck=function(){throw Hp(new pv)},MWn.dk=function(){return this.a},MWn.ek=function(){return this.b},MWn.fk=function(){return this.c},MWn.gk=function(){throw Hp(new pv)},MWn.hk=function(n){throw Hp(new pv)},MWn.ik=function(n){this.a=n},MWn.jk=function(n){this.b=n},MWn.kk=function(n){this.c=n},vX(l6n,"DynamicEObjectImpl/DynamicEPropertiesHolderImpl",1377),wAn(510,150,{105:1,92:1,90:1,590:1,147:1,56:1,108:1,49:1,97:1,510:1,150:1,114:1,115:1},jo),MWn.Qg=function(n){return bkn(this,n)},MWn._g=function(n,t,e){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),this.Ab;case 1:return this.d;case 2:return e?(!this.b&&(this.b=new Jx((gWn(),k$t),X$t,this)),this.b):(!this.b&&(this.b=new Jx((gWn(),k$t),X$t,this)),A8(this.b));case 3:return bZ(this);case 4:return!this.a&&(this.a=new $L(LOt,this,4)),this.a;case 5:return!this.c&&(this.c=new RL(LOt,this,5)),this.c}return U9(this,n-bX((gWn(),e$t)),itn(BB(yan(this,16),26)||e$t,n),t,e)},MWn.hh=function(n,t,e){var i;switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),Ywn(this.Ab,n,e);case 3:return this.Cb&&(e=(i=this.Db>>16)>=0?bkn(this,e):this.Cb.ih(this,-1-i,null,e)),QG(this,BB(n,147),e)}return BB(itn(BB(yan(this,16),26)||(gWn(),e$t),t),66).Nj().Qj(this,fgn(this),t-bX((gWn(),e$t)),n,e)},MWn.jh=function(n,t,e){switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),_pn(this.Ab,n,e);case 2:return!this.b&&(this.b=new Jx((gWn(),k$t),X$t,this)),BK(this.b,n,e);case 3:return QG(this,null,e);case 4:return!this.a&&(this.a=new $L(LOt,this,4)),_pn(this.a,n,e)}return BB(itn(BB(yan(this,16),26)||(gWn(),e$t),t),66).Nj().Rj(this,fgn(this),t-bX((gWn(),e$t)),n,e)},MWn.lh=function(n){switch(n){case 0:return!!this.Ab&&0!=this.Ab.i;case 1:return null!=this.d;case 2:return!!this.b&&0!=this.b.f;case 3:return!!bZ(this);case 4:return!!this.a&&0!=this.a.i;case 5:return!!this.c&&0!=this.c.i}return O3(this,n-bX((gWn(),e$t)),itn(BB(yan(this,16),26)||e$t,n))},MWn.sh=function(n,t){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),sqn(this.Ab),!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void pX(this.Ab,BB(t,14));case 1:return void pq(this,SD(t));case 2:return!this.b&&(this.b=new Jx((gWn(),k$t),X$t,this)),void tan(this.b,t);case 3:return void ONn(this,BB(t,147));case 4:return!this.a&&(this.a=new $L(LOt,this,4)),sqn(this.a),!this.a&&(this.a=new $L(LOt,this,4)),void pX(this.a,BB(t,14));case 5:return!this.c&&(this.c=new RL(LOt,this,5)),sqn(this.c),!this.c&&(this.c=new RL(LOt,this,5)),void pX(this.c,BB(t,14))}Lbn(this,n-bX((gWn(),e$t)),itn(BB(yan(this,16),26)||e$t,n),t)},MWn.zh=function(){return gWn(),e$t},MWn.Bh=function(n){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void sqn(this.Ab);case 1:return void Bin(this,null);case 2:return!this.b&&(this.b=new Jx((gWn(),k$t),X$t,this)),void this.b.c.$b();case 3:return void ONn(this,null);case 4:return!this.a&&(this.a=new $L(LOt,this,4)),void sqn(this.a);case 5:return!this.c&&(this.c=new RL(LOt,this,5)),void sqn(this.c)}qfn(this,n-bX((gWn(),e$t)),itn(BB(yan(this,16),26)||e$t,n))},MWn.Ib=function(){return Vfn(this)},MWn.d=null,vX(l6n,"EAnnotationImpl",510),wAn(151,705,j9n,y9),MWn.Xh=function(n,t){n$(this,n,BB(t,42))},MWn.lk=function(n,t){return FK(this,BB(n,42),t)},MWn.pi=function(n){return BB(BB(this.c,69).pi(n),133)},MWn.Zh=function(){return BB(this.c,69).Zh()},MWn.$h=function(){return BB(this.c,69).$h()},MWn._h=function(n){return BB(this.c,69)._h(n)},MWn.mk=function(n,t){return BK(this,n,t)},MWn.Wj=function(n){return BB(this.c,76).Wj(n)},MWn.rj=function(){},MWn.fj=function(){return BB(this.c,76).fj()},MWn.tj=function(n,t,e){var i;return(i=BB(Utn(this.b).Nh().Jh(this.b),133)).Th(n),i.Uh(t),i.ed(e),i},MWn.uj=function(){return new Ip(this)},MWn.Wb=function(n){tan(this,n)},MWn.Xj=function(){BB(this.c,76).Xj()},vX(y9n,"EcoreEMap",151),wAn(158,151,j9n,Jx),MWn.qj=function(){var n,t,e,i,r;if(null==this.d){for(r=x8(oAt,c9n,63,2*this.f+1,0,1),e=this.c.Kc();e.e!=e.i.gc();)!(n=r[i=((t=BB(e.nj(),133)).Sh()&DWn)%r.length])&&(n=r[i]=new Ip(this)),n.Fc(t);this.d=r}},vX(l6n,"EAnnotationImpl/1",158),wAn(284,438,{105:1,92:1,90:1,147:1,191:1,56:1,108:1,472:1,49:1,97:1,150:1,284:1,114:1,115:1}),MWn._g=function(n,t,e){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),this.Ab;case 1:return this.zb;case 2:return hN(),0!=(256&this.Bb);case 3:return hN(),0!=(512&this.Bb);case 4:return iln(this.s);case 5:return iln(this.t);case 6:return hN(),!!this.$j();case 7:return hN(),this.s>=1;case 8:return t?Ikn(this):this.r;case 9:return this.q}return U9(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n),t,e)},MWn.jh=function(n,t,e){switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),_pn(this.Ab,n,e);case 9:return gX(this,e)}return BB(itn(BB(yan(this,16),26)||this.zh(),t),66).Nj().Rj(this,fgn(this),t-bX(this.zh()),n,e)},MWn.lh=function(n){switch(n){case 0:return!!this.Ab&&0!=this.Ab.i;case 1:return null!=this.zb;case 2:return 0==(256&this.Bb);case 3:return 0==(512&this.Bb);case 4:return 0!=this.s;case 5:return 1!=this.t;case 6:return this.$j();case 7:return this.s>=1;case 8:return!!this.r&&!this.q.e&&0==yW(this.q).i;case 9:return!(!this.q||this.r&&!this.q.e&&0==yW(this.q).i)}return O3(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n))},MWn.sh=function(n,t){var e;switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),sqn(this.Ab),!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void pX(this.Ab,BB(t,14));case 1:return void this.Lh(SD(t));case 2:return void Yfn(this,qy(TD(t)));case 3:return void nln(this,qy(TD(t)));case 4:return void Len(this,BB(t,19).a);case 5:return void this.ok(BB(t,19).a);case 8:return void Ihn(this,BB(t,138));case 9:return void((e=HTn(this,BB(t,87),null))&&e.Fi())}Lbn(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n),t)},MWn.zh=function(){return gWn(),E$t},MWn.Bh=function(n){var t;switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void sqn(this.Ab);case 1:return void this.Lh(null);case 2:return void Yfn(this,!0);case 3:return void nln(this,!0);case 4:return void Len(this,0);case 5:return void this.ok(1);case 8:return void Ihn(this,null);case 9:return void((t=HTn(this,null,null))&&t.Fi())}qfn(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n))},MWn.Gh=function(){Ikn(this),this.Bb|=1},MWn.Yj=function(){return Ikn(this)},MWn.Zj=function(){return this.t},MWn.$j=function(){var n;return(n=this.t)>1||-1==n},MWn.hi=function(){return 0!=(512&this.Bb)},MWn.nk=function(n,t){return Pfn(this,n,t)},MWn.ok=function(n){Nen(this,n)},MWn.Ib=function(){return KOn(this)},MWn.s=0,MWn.t=1,vX(l6n,"ETypedElementImpl",284),wAn(449,284,{105:1,92:1,90:1,147:1,191:1,56:1,170:1,66:1,108:1,472:1,49:1,97:1,150:1,449:1,284:1,114:1,115:1,677:1}),MWn.Qg=function(n){return Nyn(this,n)},MWn._g=function(n,t,e){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),this.Ab;case 1:return this.zb;case 2:return hN(),0!=(256&this.Bb);case 3:return hN(),0!=(512&this.Bb);case 4:return iln(this.s);case 5:return iln(this.t);case 6:return hN(),!!this.$j();case 7:return hN(),this.s>=1;case 8:return t?Ikn(this):this.r;case 9:return this.q;case 10:return hN(),0!=(this.Bb&k6n);case 11:return hN(),0!=(this.Bb&M9n);case 12:return hN(),0!=(this.Bb&_Qn);case 13:return this.j;case 14:return qLn(this);case 15:return hN(),0!=(this.Bb&T9n);case 16:return hN(),0!=(this.Bb&hVn);case 17:return dZ(this)}return U9(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n),t,e)},MWn.hh=function(n,t,e){var i;switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),Ywn(this.Ab,n,e);case 17:return this.Cb&&(e=(i=this.Db>>16)>=0?Nyn(this,e):this.Cb.ih(this,-1-i,null,e)),T_n(this,n,17,e)}return BB(itn(BB(yan(this,16),26)||this.zh(),t),66).Nj().Qj(this,fgn(this),t-bX(this.zh()),n,e)},MWn.jh=function(n,t,e){switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),_pn(this.Ab,n,e);case 9:return gX(this,e);case 17:return T_n(this,null,17,e)}return BB(itn(BB(yan(this,16),26)||this.zh(),t),66).Nj().Rj(this,fgn(this),t-bX(this.zh()),n,e)},MWn.lh=function(n){switch(n){case 0:return!!this.Ab&&0!=this.Ab.i;case 1:return null!=this.zb;case 2:return 0==(256&this.Bb);case 3:return 0==(512&this.Bb);case 4:return 0!=this.s;case 5:return 1!=this.t;case 6:return this.$j();case 7:return this.s>=1;case 8:return!!this.r&&!this.q.e&&0==yW(this.q).i;case 9:return!(!this.q||this.r&&!this.q.e&&0==yW(this.q).i);case 10:return 0==(this.Bb&k6n);case 11:return 0!=(this.Bb&M9n);case 12:return 0!=(this.Bb&_Qn);case 13:return null!=this.j;case 14:return null!=qLn(this);case 15:return 0!=(this.Bb&T9n);case 16:return 0!=(this.Bb&hVn);case 17:return!!dZ(this)}return O3(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n))},MWn.sh=function(n,t){var e;switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),sqn(this.Ab),!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void pX(this.Ab,BB(t,14));case 1:return void JZ(this,SD(t));case 2:return void Yfn(this,qy(TD(t)));case 3:return void nln(this,qy(TD(t)));case 4:return void Len(this,BB(t,19).a);case 5:return void this.ok(BB(t,19).a);case 8:return void Ihn(this,BB(t,138));case 9:return void((e=HTn(this,BB(t,87),null))&&e.Fi());case 10:return void Aln(this,qy(TD(t)));case 11:return void Nln(this,qy(TD(t)));case 12:return void $ln(this,qy(TD(t)));case 13:return void _I(this,SD(t));case 15:return void Lln(this,qy(TD(t)));case 16:return void qln(this,qy(TD(t)))}Lbn(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n),t)},MWn.zh=function(){return gWn(),j$t},MWn.Bh=function(n){var t;switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void sqn(this.Ab);case 1:return cL(this.Cb,88)&&ACn(P5(BB(this.Cb,88)),4),void Nrn(this,null);case 2:return void Yfn(this,!0);case 3:return void nln(this,!0);case 4:return void Len(this,0);case 5:return void this.ok(1);case 8:return void Ihn(this,null);case 9:return void((t=HTn(this,null,null))&&t.Fi());case 10:return void Aln(this,!0);case 11:return void Nln(this,!1);case 12:return void $ln(this,!1);case 13:return this.i=null,void arn(this,null);case 15:return void Lln(this,!1);case 16:return void qln(this,!1)}qfn(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n))},MWn.Gh=function(){kV(B7((IPn(),Z$t),this)),Ikn(this),this.Bb|=1},MWn.Gj=function(){return this.f},MWn.zj=function(){return qLn(this)},MWn.Hj=function(){return dZ(this)},MWn.Lj=function(){return null},MWn.pk=function(){return this.k},MWn.aj=function(){return this.n},MWn.Mj=function(){return oEn(this)},MWn.Nj=function(){var n,t,e,i,r,c,a,u,o;return this.p||((null==(e=dZ(this)).i&&qFn(e),e.i).length,(i=this.Lj())&&bX(dZ(i)),n=(a=(r=Ikn(this)).Bj())?0!=(1&a.i)?a==$Nt?ktt:a==ANt?Att:a==DNt?Ctt:a==xNt?Ptt:a==LNt?Rtt:a==RNt?_tt:a==NNt?Ttt:Stt:a:null,t=qLn(this),u=r.zj(),bbn(this),0!=(this.Bb&hVn)&&((c=mjn((IPn(),Z$t),e))&&c!=this||(c=Z1(B7(Z$t,this))))?this.p=new AI(this,c):this.$j()?this.rk()?i?0!=(this.Bb&T9n)?n?this.sk()?this.p=new lQ(47,n,this,i):this.p=new lQ(5,n,this,i):this.sk()?this.p=new w4(46,this,i):this.p=new w4(4,this,i):n?this.sk()?this.p=new lQ(49,n,this,i):this.p=new lQ(7,n,this,i):this.sk()?this.p=new w4(48,this,i):this.p=new w4(6,this,i):0!=(this.Bb&T9n)?n?n==Hnt?this.p=new PB(50,VOt,this):this.sk()?this.p=new PB(43,n,this):this.p=new PB(1,n,this):this.sk()?this.p=new RY(42,this):this.p=new RY(0,this):n?n==Hnt?this.p=new PB(41,VOt,this):this.sk()?this.p=new PB(45,n,this):this.p=new PB(3,n,this):this.sk()?this.p=new RY(44,this):this.p=new RY(2,this):cL(r,148)?n==$$t?this.p=new RY(40,this):0!=(512&this.Bb)?0!=(this.Bb&T9n)?this.p=n?new PB(9,n,this):new RY(8,this):this.p=n?new PB(11,n,this):new RY(10,this):0!=(this.Bb&T9n)?this.p=n?new PB(13,n,this):new RY(12,this):this.p=n?new PB(15,n,this):new RY(14,this):i?(o=i.t)>1||-1==o?this.sk()?0!=(this.Bb&T9n)?this.p=n?new lQ(25,n,this,i):new w4(24,this,i):this.p=n?new lQ(27,n,this,i):new w4(26,this,i):0!=(this.Bb&T9n)?this.p=n?new lQ(29,n,this,i):new w4(28,this,i):this.p=n?new lQ(31,n,this,i):new w4(30,this,i):this.sk()?0!=(this.Bb&T9n)?this.p=n?new lQ(33,n,this,i):new w4(32,this,i):this.p=n?new lQ(35,n,this,i):new w4(34,this,i):0!=(this.Bb&T9n)?this.p=n?new lQ(37,n,this,i):new w4(36,this,i):this.p=n?new lQ(39,n,this,i):new w4(38,this,i):this.sk()?0!=(this.Bb&T9n)?this.p=n?new PB(17,n,this):new RY(16,this):this.p=n?new PB(19,n,this):new RY(18,this):0!=(this.Bb&T9n)?this.p=n?new PB(21,n,this):new RY(20,this):this.p=n?new PB(23,n,this):new RY(22,this):this.qk()?this.sk()?this.p=new CB(BB(r,26),this,i):this.p=new mJ(BB(r,26),this,i):cL(r,148)?n==$$t?this.p=new RY(40,this):0!=(this.Bb&T9n)?this.p=n?new nz(t,u,this,(Bwn(),a==ANt?q$t:a==$Nt?K$t:a==LNt?G$t:a==DNt?H$t:a==xNt?B$t:a==RNt?U$t:a==NNt?_$t:a==ONt?F$t:z$t)):new dQ(BB(r,148),t,u,this):this.p=n?new ZG(t,u,this,(Bwn(),a==ANt?q$t:a==$Nt?K$t:a==LNt?G$t:a==DNt?H$t:a==xNt?B$t:a==RNt?U$t:a==NNt?_$t:a==ONt?F$t:z$t)):new wQ(BB(r,148),t,u,this):this.rk()?i?0!=(this.Bb&T9n)?this.sk()?this.p=new NB(BB(r,26),this,i):this.p=new LB(BB(r,26),this,i):this.sk()?this.p=new $B(BB(r,26),this,i):this.p=new IB(BB(r,26),this,i):0!=(this.Bb&T9n)?this.sk()?this.p=new eD(BB(r,26),this):this.p=new tD(BB(r,26),this):this.sk()?this.p=new nD(BB(r,26),this):this.p=new Zx(BB(r,26),this):this.sk()?i?0!=(this.Bb&T9n)?this.p=new xB(BB(r,26),this,i):this.p=new OB(BB(r,26),this,i):0!=(this.Bb&T9n)?this.p=new rD(BB(r,26),this):this.p=new iD(BB(r,26),this):i?0!=(this.Bb&T9n)?this.p=new DB(BB(r,26),this,i):this.p=new AB(BB(r,26),this,i):0!=(this.Bb&T9n)?this.p=new cD(BB(r,26),this):this.p=new cG(BB(r,26),this)),this.p},MWn.Ij=function(){return 0!=(this.Bb&k6n)},MWn.qk=function(){return!1},MWn.rk=function(){return!1},MWn.Jj=function(){return 0!=(this.Bb&hVn)},MWn.Oj=function(){return hnn(this)},MWn.sk=function(){return!1},MWn.Kj=function(){return 0!=(this.Bb&T9n)},MWn.tk=function(n){this.k=n},MWn.Lh=function(n){JZ(this,n)},MWn.Ib=function(){return ERn(this)},MWn.e=!1,MWn.n=0,vX(l6n,"EStructuralFeatureImpl",449),wAn(322,449,{105:1,92:1,90:1,34:1,147:1,191:1,56:1,170:1,66:1,108:1,472:1,49:1,97:1,322:1,150:1,449:1,284:1,114:1,115:1,677:1},Om),MWn._g=function(n,t,e){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),this.Ab;case 1:return this.zb;case 2:return hN(),0!=(256&this.Bb);case 3:return hN(),0!=(512&this.Bb);case 4:return iln(this.s);case 5:return iln(this.t);case 6:return hN(),!!NIn(this);case 7:return hN(),this.s>=1;case 8:return t?Ikn(this):this.r;case 9:return this.q;case 10:return hN(),0!=(this.Bb&k6n);case 11:return hN(),0!=(this.Bb&M9n);case 12:return hN(),0!=(this.Bb&_Qn);case 13:return this.j;case 14:return qLn(this);case 15:return hN(),0!=(this.Bb&T9n);case 16:return hN(),0!=(this.Bb&hVn);case 17:return dZ(this);case 18:return hN(),0!=(this.Bb&h6n);case 19:return t?uun(this):x6(this)}return U9(this,n-bX((gWn(),i$t)),itn(BB(yan(this,16),26)||i$t,n),t,e)},MWn.lh=function(n){switch(n){case 0:return!!this.Ab&&0!=this.Ab.i;case 1:return null!=this.zb;case 2:return 0==(256&this.Bb);case 3:return 0==(512&this.Bb);case 4:return 0!=this.s;case 5:return 1!=this.t;case 6:return NIn(this);case 7:return this.s>=1;case 8:return!!this.r&&!this.q.e&&0==yW(this.q).i;case 9:return!(!this.q||this.r&&!this.q.e&&0==yW(this.q).i);case 10:return 0==(this.Bb&k6n);case 11:return 0!=(this.Bb&M9n);case 12:return 0!=(this.Bb&_Qn);case 13:return null!=this.j;case 14:return null!=qLn(this);case 15:return 0!=(this.Bb&T9n);case 16:return 0!=(this.Bb&hVn);case 17:return!!dZ(this);case 18:return 0!=(this.Bb&h6n);case 19:return!!x6(this)}return O3(this,n-bX((gWn(),i$t)),itn(BB(yan(this,16),26)||i$t,n))},MWn.sh=function(n,t){var e;switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),sqn(this.Ab),!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void pX(this.Ab,BB(t,14));case 1:return void JZ(this,SD(t));case 2:return void Yfn(this,qy(TD(t)));case 3:return void nln(this,qy(TD(t)));case 4:return void Len(this,BB(t,19).a);case 5:return void Uj(this,BB(t,19).a);case 8:return void Ihn(this,BB(t,138));case 9:return void((e=HTn(this,BB(t,87),null))&&e.Fi());case 10:return void Aln(this,qy(TD(t)));case 11:return void Nln(this,qy(TD(t)));case 12:return void $ln(this,qy(TD(t)));case 13:return void _I(this,SD(t));case 15:return void Lln(this,qy(TD(t)));case 16:return void qln(this,qy(TD(t)));case 18:return void Gln(this,qy(TD(t)))}Lbn(this,n-bX((gWn(),i$t)),itn(BB(yan(this,16),26)||i$t,n),t)},MWn.zh=function(){return gWn(),i$t},MWn.Bh=function(n){var t;switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void sqn(this.Ab);case 1:return cL(this.Cb,88)&&ACn(P5(BB(this.Cb,88)),4),void Nrn(this,null);case 2:return void Yfn(this,!0);case 3:return void nln(this,!0);case 4:return void Len(this,0);case 5:return this.b=0,void Nen(this,1);case 8:return void Ihn(this,null);case 9:return void((t=HTn(this,null,null))&&t.Fi());case 10:return void Aln(this,!0);case 11:return void Nln(this,!1);case 12:return void $ln(this,!1);case 13:return this.i=null,void arn(this,null);case 15:return void Lln(this,!1);case 16:return void qln(this,!1);case 18:return void Gln(this,!1)}qfn(this,n-bX((gWn(),i$t)),itn(BB(yan(this,16),26)||i$t,n))},MWn.Gh=function(){uun(this),kV(B7((IPn(),Z$t),this)),Ikn(this),this.Bb|=1},MWn.$j=function(){return NIn(this)},MWn.nk=function(n,t){return this.b=0,this.a=null,Pfn(this,n,t)},MWn.ok=function(n){Uj(this,n)},MWn.Ib=function(){var n;return 0!=(64&this.Db)?ERn(this):((n=new fN(ERn(this))).a+=" (iD: ",yE(n,0!=(this.Bb&h6n)),n.a+=")",n.a)},MWn.b=0,vX(l6n,"EAttributeImpl",322),wAn(351,438,{105:1,92:1,90:1,138:1,147:1,191:1,56:1,108:1,49:1,97:1,351:1,150:1,114:1,115:1,676:1}),MWn.uk=function(n){return n.Tg()==this},MWn.Qg=function(n){return fyn(this,n)},MWn.Rg=function(n,t){this.w=null,this.Db=t<<16|255&this.Db,this.Cb=n},MWn._g=function(n,t,e){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),this.Ab;case 1:return this.zb;case 2:return null!=this.D?this.D:this.B;case 3:return iyn(this);case 4:return this.zj();case 5:return this.F;case 6:return t?Utn(this):wZ(this);case 7:return!this.A&&(this.A=new NL(O$t,this,7)),this.A}return U9(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n),t,e)},MWn.hh=function(n,t,e){var i;switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),Ywn(this.Ab,n,e);case 6:return this.Cb&&(e=(i=this.Db>>16)>=0?fyn(this,e):this.Cb.ih(this,-1-i,null,e)),T_n(this,n,6,e)}return BB(itn(BB(yan(this,16),26)||this.zh(),t),66).Nj().Qj(this,fgn(this),t-bX(this.zh()),n,e)},MWn.jh=function(n,t,e){switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),_pn(this.Ab,n,e);case 6:return T_n(this,null,6,e);case 7:return!this.A&&(this.A=new NL(O$t,this,7)),_pn(this.A,n,e)}return BB(itn(BB(yan(this,16),26)||this.zh(),t),66).Nj().Rj(this,fgn(this),t-bX(this.zh()),n,e)},MWn.lh=function(n){switch(n){case 0:return!!this.Ab&&0!=this.Ab.i;case 1:return null!=this.zb;case 2:return null!=this.D&&this.D==this.F;case 3:return!!iyn(this);case 4:return null!=this.zj();case 5:return null!=this.F&&this.F!=this.D&&this.F!=this.B;case 6:return!!wZ(this);case 7:return!!this.A&&0!=this.A.i}return O3(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n))},MWn.sh=function(n,t){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),sqn(this.Ab),!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void pX(this.Ab,BB(t,14));case 1:return void ZZ(this,SD(t));case 2:return void IA(this,SD(t));case 5:return void Yqn(this,SD(t));case 7:return!this.A&&(this.A=new NL(O$t,this,7)),sqn(this.A),!this.A&&(this.A=new NL(O$t,this,7)),void pX(this.A,BB(t,14))}Lbn(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n),t)},MWn.zh=function(){return gWn(),c$t},MWn.Bh=function(n){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void sqn(this.Ab);case 1:return cL(this.Cb,179)&&(BB(this.Cb,179).tb=null),void Nrn(this,null);case 2:return Dsn(this,null),void xen(this,this.D);case 5:return void Yqn(this,null);case 7:return!this.A&&(this.A=new NL(O$t,this,7)),void sqn(this.A)}qfn(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n))},MWn.yj=function(){var n;return-1==this.G&&(this.G=(n=Utn(this))?uvn(n.Mh(),this):-1),this.G},MWn.zj=function(){return null},MWn.Aj=function(){return Utn(this)},MWn.vk=function(){return this.v},MWn.Bj=function(){return iyn(this)},MWn.Cj=function(){return null!=this.D?this.D:this.B},MWn.Dj=function(){return this.F},MWn.wj=function(n){return SFn(this,n)},MWn.wk=function(n){this.v=n},MWn.xk=function(n){Urn(this,n)},MWn.yk=function(n){this.C=n},MWn.Lh=function(n){ZZ(this,n)},MWn.Ib=function(){return Cwn(this)},MWn.C=null,MWn.D=null,MWn.G=-1,vX(l6n,"EClassifierImpl",351),wAn(88,351,{105:1,92:1,90:1,26:1,138:1,147:1,191:1,56:1,108:1,49:1,97:1,88:1,351:1,150:1,473:1,114:1,115:1,676:1},_f),MWn.uk=function(n){return QR(this,n.Tg())},MWn._g=function(n,t,e){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),this.Ab;case 1:return this.zb;case 2:return null!=this.D?this.D:this.B;case 3:return iyn(this);case 4:return null;case 5:return this.F;case 6:return t?Utn(this):wZ(this);case 7:return!this.A&&(this.A=new NL(O$t,this,7)),this.A;case 8:return hN(),0!=(256&this.Bb);case 9:return hN(),0!=(512&this.Bb);case 10:return kY(this);case 11:return!this.q&&(this.q=new eU(QAt,this,11,10)),this.q;case 12:return YBn(this);case 13:return RBn(this);case 14:return RBn(this),this.r;case 15:return YBn(this),this.k;case 16:return WPn(this);case 17:return gBn(this);case 18:return qFn(this);case 19:return CLn(this);case 20:return YBn(this),this.o;case 21:return!this.s&&(this.s=new eU(FAt,this,21,17)),this.s;case 22:return a4(this);case 23:return HDn(this)}return U9(this,n-bX((gWn(),r$t)),itn(BB(yan(this,16),26)||r$t,n),t,e)},MWn.hh=function(n,t,e){var i;switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),Ywn(this.Ab,n,e);case 6:return this.Cb&&(e=(i=this.Db>>16)>=0?fyn(this,e):this.Cb.ih(this,-1-i,null,e)),T_n(this,n,6,e);case 11:return!this.q&&(this.q=new eU(QAt,this,11,10)),Ywn(this.q,n,e);case 21:return!this.s&&(this.s=new eU(FAt,this,21,17)),Ywn(this.s,n,e)}return BB(itn(BB(yan(this,16),26)||(gWn(),r$t),t),66).Nj().Qj(this,fgn(this),t-bX((gWn(),r$t)),n,e)},MWn.jh=function(n,t,e){switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),_pn(this.Ab,n,e);case 6:return T_n(this,null,6,e);case 7:return!this.A&&(this.A=new NL(O$t,this,7)),_pn(this.A,n,e);case 11:return!this.q&&(this.q=new eU(QAt,this,11,10)),_pn(this.q,n,e);case 21:return!this.s&&(this.s=new eU(FAt,this,21,17)),_pn(this.s,n,e);case 22:return _pn(a4(this),n,e)}return BB(itn(BB(yan(this,16),26)||(gWn(),r$t),t),66).Nj().Rj(this,fgn(this),t-bX((gWn(),r$t)),n,e)},MWn.lh=function(n){switch(n){case 0:return!!this.Ab&&0!=this.Ab.i;case 1:return null!=this.zb;case 2:return null!=this.D&&this.D==this.F;case 3:return!!iyn(this);case 4:return!1;case 5:return null!=this.F&&this.F!=this.D&&this.F!=this.B;case 6:return!!wZ(this);case 7:return!!this.A&&0!=this.A.i;case 8:return 0!=(256&this.Bb);case 9:return 0!=(512&this.Bb);case 10:return!(!this.u||0==a4(this.u.a).i||this.n&&Rvn(this.n));case 11:return!!this.q&&0!=this.q.i;case 12:return 0!=YBn(this).i;case 13:return 0!=RBn(this).i;case 14:return RBn(this),0!=this.r.i;case 15:return YBn(this),0!=this.k.i;case 16:return 0!=WPn(this).i;case 17:return 0!=gBn(this).i;case 18:return 0!=qFn(this).i;case 19:return 0!=CLn(this).i;case 20:return YBn(this),!!this.o;case 21:return!!this.s&&0!=this.s.i;case 22:return!!this.n&&Rvn(this.n);case 23:return 0!=HDn(this).i}return O3(this,n-bX((gWn(),r$t)),itn(BB(yan(this,16),26)||r$t,n))},MWn.oh=function(n){return(null==this.i||this.q&&0!=this.q.i?null:NNn(this,n))||hUn(this,n)},MWn.sh=function(n,t){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),sqn(this.Ab),!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void pX(this.Ab,BB(t,14));case 1:return void ZZ(this,SD(t));case 2:return void IA(this,SD(t));case 5:return void Yqn(this,SD(t));case 7:return!this.A&&(this.A=new NL(O$t,this,7)),sqn(this.A),!this.A&&(this.A=new NL(O$t,this,7)),void pX(this.A,BB(t,14));case 8:return void Jfn(this,qy(TD(t)));case 9:return void tln(this,qy(TD(t)));case 10:return vqn(kY(this)),void pX(kY(this),BB(t,14));case 11:return!this.q&&(this.q=new eU(QAt,this,11,10)),sqn(this.q),!this.q&&(this.q=new eU(QAt,this,11,10)),void pX(this.q,BB(t,14));case 21:return!this.s&&(this.s=new eU(FAt,this,21,17)),sqn(this.s),!this.s&&(this.s=new eU(FAt,this,21,17)),void pX(this.s,BB(t,14));case 22:return sqn(a4(this)),void pX(a4(this),BB(t,14))}Lbn(this,n-bX((gWn(),r$t)),itn(BB(yan(this,16),26)||r$t,n),t)},MWn.zh=function(){return gWn(),r$t},MWn.Bh=function(n){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void sqn(this.Ab);case 1:return cL(this.Cb,179)&&(BB(this.Cb,179).tb=null),void Nrn(this,null);case 2:return Dsn(this,null),void xen(this,this.D);case 5:return void Yqn(this,null);case 7:return!this.A&&(this.A=new NL(O$t,this,7)),void sqn(this.A);case 8:return void Jfn(this,!1);case 9:return void tln(this,!1);case 10:return void(this.u&&vqn(this.u));case 11:return!this.q&&(this.q=new eU(QAt,this,11,10)),void sqn(this.q);case 21:return!this.s&&(this.s=new eU(FAt,this,21,17)),void sqn(this.s);case 22:return void(this.n&&sqn(this.n))}qfn(this,n-bX((gWn(),r$t)),itn(BB(yan(this,16),26)||r$t,n))},MWn.Gh=function(){var n,t;if(YBn(this),RBn(this),WPn(this),gBn(this),qFn(this),CLn(this),HDn(this),a6(XB(P5(this))),this.s)for(n=0,t=this.s.i;n<t;++n)vx(Wtn(this.s,n));if(this.q)for(n=0,t=this.q.i;n<t;++n)vx(Wtn(this.q,n));Cfn((IPn(),Z$t),this).ne(),this.Bb|=1},MWn.Ib=function(){return dEn(this)},MWn.k=null,MWn.r=null,vX(l6n,"EClassImpl",88),wAn(1994,1993,D9n),MWn.Vh=function(n,t){return LFn(this,n,t)},MWn.Wh=function(n){return LFn(this,this.i,n)},MWn.Xh=function(n,t){qOn(this,n,t)},MWn.Yh=function(n){tAn(this,n)},MWn.lk=function(n,t){return Ywn(this,n,t)},MWn.pi=function(n){return F9(this,n)},MWn.mk=function(n,t){return _pn(this,n,t)},MWn.mi=function(n,t){return fBn(this,n,t)},MWn.Zh=function(){return new ax(this)},MWn.$h=function(){return new ux(this)},MWn._h=function(n){return sin(this,n)},vX(y9n,"NotifyingInternalEListImpl",1994),wAn(622,1994,R9n),MWn.Hc=function(n){return bqn(this,n)},MWn.Zi=function(n,t,e,i,r){return yZ(this,n,t,e,i,r)},MWn.$i=function(n){Lv(this,n)},MWn.Wj=function(n){return this},MWn.ak=function(){return itn(this.e.Tg(),this.aj())},MWn._i=function(){return this.ak()},MWn.aj=function(){return Awn(this.e.Tg(),this.ak())},MWn.zk=function(){return BB(this.ak().Yj(),26).Bj()},MWn.Ak=function(){return Cvn(BB(this.ak(),18)).n},MWn.Ai=function(){return this.e},MWn.Bk=function(){return!0},MWn.Ck=function(){return!1},MWn.Dk=function(){return!1},MWn.Ek=function(){return!1},MWn.Xc=function(n){return uvn(this,n)},MWn.cj=function(n,t){var e;return e=BB(n,49),this.Dk()?this.Bk()?e.gh(this.e,this.Ak(),this.zk(),t):e.gh(this.e,Awn(e.Tg(),Cvn(BB(this.ak(),18))),null,t):e.gh(this.e,-1-this.aj(),null,t)},MWn.dj=function(n,t){var e;return e=BB(n,49),this.Dk()?this.Bk()?e.ih(this.e,this.Ak(),this.zk(),t):e.ih(this.e,Awn(e.Tg(),Cvn(BB(this.ak(),18))),null,t):e.ih(this.e,-1-this.aj(),null,t)},MWn.rk=function(){return!1},MWn.Fk=function(){return!0},MWn.wj=function(n){return x3(this.d,n)},MWn.ej=function(){return mA(this.e)},MWn.fj=function(){return 0!=this.i},MWn.ri=function(n){return Den(this.d,n)},MWn.li=function(n,t){return this.Fk()&&this.Ek()?GOn(this,n,BB(t,56)):t},MWn.Gk=function(n){return n.kh()?tfn(this.e,BB(n,49)):n},MWn.Wb=function(n){J$(this,n)},MWn.Pc=function(){return H9(this)},MWn.Qc=function(n){var t;if(this.Ek())for(t=this.i-1;t>=0;--t)Wtn(this,t);return Qwn(this,n)},MWn.Xj=function(){sqn(this)},MWn.oi=function(n,t){return _en(this,n,t)},vX(y9n,"EcoreEList",622),wAn(496,622,R9n,yH),MWn.ai=function(){return!1},MWn.aj=function(){return this.c},MWn.bj=function(){return!1},MWn.Fk=function(){return!0},MWn.hi=function(){return!0},MWn.li=function(n,t){return t},MWn.ni=function(){return!1},MWn.c=0,vX(y9n,"EObjectEList",496),wAn(85,496,R9n,$L),MWn.bj=function(){return!0},MWn.Dk=function(){return!1},MWn.rk=function(){return!0},vX(y9n,"EObjectContainmentEList",85),wAn(545,85,R9n,LL),MWn.ci=function(){this.b=!0},MWn.fj=function(){return this.b},MWn.Xj=function(){var n;sqn(this),mA(this.e)?(n=this.b,this.b=!1,ban(this.e,new t6(this.e,2,this.c,n,!1))):this.b=!1},MWn.b=!1,vX(y9n,"EObjectContainmentEList/Unsettable",545),wAn(1140,545,R9n,YG),MWn.ii=function(n,t){var e,i;return e=BB(Iln(this,n,t),87),mA(this.e)&&Lv(this,new j9(this.a,7,(gWn(),a$t),iln(t),cL(i=e.c,88)?BB(i,26):d$t,n)),e},MWn.jj=function(n,t){return Zwn(this,BB(n,87),t)},MWn.kj=function(n,t){return Jwn(this,BB(n,87),t)},MWn.lj=function(n,t,e){return _jn(this,BB(n,87),BB(t,87),e)},MWn.Zi=function(n,t,e,i,r){switch(n){case 3:return yZ(this,n,t,e,i,this.i>1);case 5:return yZ(this,n,t,e,i,this.i-BB(e,15).gc()>0);default:return new N7(this.e,n,this.c,t,e,i,!0)}},MWn.ij=function(){return!0},MWn.fj=function(){return Rvn(this)},MWn.Xj=function(){sqn(this)},vX(l6n,"EClassImpl/1",1140),wAn(1154,1153,Z8n),MWn.ui=function(n){var t,e,i,r,c,a,u;if(8!=(e=n.xi())){if(0==(i=apn(n)))switch(e){case 1:case 9:null!=(u=n.Bi())&&(!(t=P5(BB(u,473))).c&&(t.c=new Bo),snn(t.c,n.Ai())),null!=(a=n.zi())&&0==(1&(r=BB(a,473)).Bb)&&(!(t=P5(r)).c&&(t.c=new Bo),f9(t.c,BB(n.Ai(),26)));break;case 3:null!=(a=n.zi())&&0==(1&(r=BB(a,473)).Bb)&&(!(t=P5(r)).c&&(t.c=new Bo),f9(t.c,BB(n.Ai(),26)));break;case 5:if(null!=(a=n.zi()))for(c=BB(a,14).Kc();c.Ob();)0==(1&(r=BB(c.Pb(),473)).Bb)&&(!(t=P5(r)).c&&(t.c=new Bo),f9(t.c,BB(n.Ai(),26)));break;case 4:null!=(u=n.Bi())&&0==(1&(r=BB(u,473)).Bb)&&(!(t=P5(r)).c&&(t.c=new Bo),snn(t.c,n.Ai()));break;case 6:if(null!=(u=n.Bi()))for(c=BB(u,14).Kc();c.Ob();)0==(1&(r=BB(c.Pb(),473)).Bb)&&(!(t=P5(r)).c&&(t.c=new Bo),snn(t.c,n.Ai()))}this.Hk(i)}},MWn.Hk=function(n){dRn(this,n)},MWn.b=63,vX(l6n,"ESuperAdapter",1154),wAn(1155,1154,Z8n,dp),MWn.Hk=function(n){ACn(this,n)},vX(l6n,"EClassImpl/10",1155),wAn(1144,696,R9n),MWn.Vh=function(n,t){return BTn(this,n,t)},MWn.Wh=function(n){return bmn(this,n)},MWn.Xh=function(n,t){Ifn(this,n,t)},MWn.Yh=function(n){c6(this,n)},MWn.pi=function(n){return F9(this,n)},MWn.mi=function(n,t){return onn(this,n,t)},MWn.lk=function(n,t){throw Hp(new pv)},MWn.Zh=function(){return new ax(this)},MWn.$h=function(){return new ux(this)},MWn._h=function(n){return sin(this,n)},MWn.mk=function(n,t){throw Hp(new pv)},MWn.Wj=function(n){return this},MWn.fj=function(){return 0!=this.i},MWn.Wb=function(n){throw Hp(new pv)},MWn.Xj=function(){throw Hp(new pv)},vX(y9n,"EcoreEList/UnmodifiableEList",1144),wAn(319,1144,R9n,NO),MWn.ni=function(){return!1},vX(y9n,"EcoreEList/UnmodifiableEList/FastCompare",319),wAn(1147,319,R9n,don),MWn.Xc=function(n){var t,e;if(cL(n,170)&&-1!=(t=BB(n,170).aj()))for(e=this.i;t<e;++t)if(GI(this.g[t])===GI(n))return t;return-1},vX(l6n,"EClassImpl/1EAllStructuralFeaturesList",1147),wAn(1141,497,h8n,Eo),MWn.ri=function(n){return x8(VAt,B9n,87,n,0,1)},MWn.ni=function(){return!1},vX(l6n,"EClassImpl/1EGenericSuperTypeEList",1141),wAn(623,497,h8n,To),MWn.ri=function(n){return x8(FAt,N9n,170,n,0,1)},MWn.ni=function(){return!1},vX(l6n,"EClassImpl/1EStructuralFeatureUniqueEList",623),wAn(741,497,h8n,Mo),MWn.ri=function(n){return x8(JAt,N9n,18,n,0,1)},MWn.ni=function(){return!1},vX(l6n,"EClassImpl/1ReferenceList",741),wAn(1142,497,h8n,gp),MWn.bi=function(n,t){tz(this,BB(t,34))},MWn.ri=function(n){return x8(BAt,N9n,34,n,0,1)},MWn.ni=function(){return!1},vX(l6n,"EClassImpl/2",1142),wAn(1143,497,h8n,So),MWn.ri=function(n){return x8(BAt,N9n,34,n,0,1)},MWn.ni=function(){return!1},vX(l6n,"EClassImpl/3",1143),wAn(1145,319,R9n,EH),MWn.Fc=function(n){return mB(this,BB(n,34))},MWn.Yh=function(n){JE(this,BB(n,34))},vX(l6n,"EClassImpl/4",1145),wAn(1146,319,R9n,TH),MWn.Fc=function(n){return yB(this,BB(n,18))},MWn.Yh=function(n){ZE(this,BB(n,18))},vX(l6n,"EClassImpl/5",1146),wAn(1148,497,h8n,Po),MWn.ri=function(n){return x8(QAt,x9n,59,n,0,1)},MWn.ni=function(){return!1},vX(l6n,"EClassImpl/6",1148),wAn(1149,497,h8n,Co),MWn.ri=function(n){return x8(JAt,N9n,18,n,0,1)},MWn.ni=function(){return!1},vX(l6n,"EClassImpl/7",1149),wAn(1997,1996,{3:1,4:1,20:1,28:1,52:1,14:1,15:1,67:1,58:1,69:1}),MWn.Vh=function(n,t){return uFn(this,n,t)},MWn.Wh=function(n){return uFn(this,this.Vi(),n)},MWn.Xh=function(n,t){eAn(this,n,t)},MWn.Yh=function(n){OOn(this,n)},MWn.lk=function(n,t){return wmn(this,n,t)},MWn.mk=function(n,t){return Fpn(this,n,t)},MWn.mi=function(n,t){return oFn(this,n,t)},MWn.pi=function(n){return this.Oi(n)},MWn.Zh=function(){return new ax(this)},MWn.Gi=function(){return this.Ji()},MWn.$h=function(){return new ux(this)},MWn._h=function(n){return sin(this,n)},vX(y9n,"DelegatingNotifyingInternalEListImpl",1997),wAn(742,1997,H9n),MWn.ai=function(){var n;return cL(n=itn(jY(this.b),this.aj()).Yj(),148)&&!cL(n,457)&&0==(1&n.Bj().i)},MWn.Hc=function(n){var t,e,i,r,c,a,u;if(this.Fk()){if((u=this.Vi())>4){if(!this.wj(n))return!1;if(this.rk()){if(a=(t=(e=BB(n,49)).Ug())==this.b&&(this.Dk()?e.Og(e.Vg(),BB(itn(jY(this.b),this.aj()).Yj(),26).Bj())==Cvn(BB(itn(jY(this.b),this.aj()),18)).n:-1-e.Vg()==this.aj()),this.Ek()&&!a&&!t&&e.Zg())for(i=0;i<u;++i)if(GI(Gz(this,this.Oi(i)))===GI(n))return!0;return a}if(this.Dk()&&!this.Ck()){if(GI(r=BB(n,56).ah(Cvn(BB(itn(jY(this.b),this.aj()),18))))===GI(this.b))return!0;if(null==r||!BB(r,56).kh())return!1}}if(c=this.Li(n),this.Ek()&&!c)for(i=0;i<u;++i)if(GI(e=Gz(this,this.Oi(i)))===GI(n))return!0;return c}return this.Li(n)},MWn.Zi=function(n,t,e,i,r){return new N7(this.b,n,this.aj(),t,e,i,r)},MWn.$i=function(n){ban(this.b,n)},MWn.Wj=function(n){return this},MWn._i=function(){return itn(jY(this.b),this.aj())},MWn.aj=function(){return Awn(jY(this.b),itn(jY(this.b),this.aj()))},MWn.Ai=function(){return this.b},MWn.Bk=function(){return!!itn(jY(this.b),this.aj()).Yj().Bj()},MWn.bj=function(){var n;return!(!cL(n=itn(jY(this.b),this.aj()),99)||0==(BB(n,18).Bb&h6n)&&!Cvn(BB(n,18)))},MWn.Ck=function(){var n,t,e;return!!cL(n=itn(jY(this.b),this.aj()),99)&&!!(t=Cvn(BB(n,18)))&&((e=t.t)>1||-1==e)},MWn.Dk=function(){var n;return!!cL(n=itn(jY(this.b),this.aj()),99)&&!!Cvn(BB(n,18))},MWn.Ek=function(){var n;return!!cL(n=itn(jY(this.b),this.aj()),99)&&0!=(BB(n,18).Bb&BQn)},MWn.Xc=function(n){var t,e,i;if((e=this.Qi(n))>=0)return e;if(this.Fk())for(t=0,i=this.Vi();t<i;++t)if(GI(Gz(this,this.Oi(t)))===GI(n))return t;return-1},MWn.cj=function(n,t){var e;return e=BB(n,49),this.Dk()?this.Bk()?e.gh(this.b,Cvn(BB(itn(jY(this.b),this.aj()),18)).n,BB(itn(jY(this.b),this.aj()).Yj(),26).Bj(),t):e.gh(this.b,Awn(e.Tg(),Cvn(BB(itn(jY(this.b),this.aj()),18))),null,t):e.gh(this.b,-1-this.aj(),null,t)},MWn.dj=function(n,t){var e;return e=BB(n,49),this.Dk()?this.Bk()?e.ih(this.b,Cvn(BB(itn(jY(this.b),this.aj()),18)).n,BB(itn(jY(this.b),this.aj()).Yj(),26).Bj(),t):e.ih(this.b,Awn(e.Tg(),Cvn(BB(itn(jY(this.b),this.aj()),18))),null,t):e.ih(this.b,-1-this.aj(),null,t)},MWn.rk=function(){var n;return!!cL(n=itn(jY(this.b),this.aj()),99)&&0!=(BB(n,18).Bb&h6n)},MWn.Fk=function(){return cL(itn(jY(this.b),this.aj()).Yj(),88)},MWn.wj=function(n){return itn(jY(this.b),this.aj()).Yj().wj(n)},MWn.ej=function(){return mA(this.b)},MWn.fj=function(){return!this.Ri()},MWn.hi=function(){return itn(jY(this.b),this.aj()).hi()},MWn.li=function(n,t){return eGn(this,n,t)},MWn.Wb=function(n){vqn(this),pX(this,BB(n,15))},MWn.Pc=function(){var n;if(this.Ek())for(n=this.Vi()-1;n>=0;--n)eGn(this,n,this.Oi(n));return this.Wi()},MWn.Qc=function(n){var t;if(this.Ek())for(t=this.Vi()-1;t>=0;--t)eGn(this,t,this.Oi(t));return this.Xi(n)},MWn.Xj=function(){vqn(this)},MWn.oi=function(n,t){return B9(this,n,t)},vX(y9n,"DelegatingEcoreEList",742),wAn(1150,742,H9n,uR),MWn.Hi=function(n,t){lD(this,n,BB(t,26))},MWn.Ii=function(n){e$(this,BB(n,26))},MWn.Oi=function(n){var t;return cL(t=BB(Wtn(a4(this.a),n),87).c,88)?BB(t,26):(gWn(),d$t)},MWn.Ti=function(n){var t;return cL(t=BB(fDn(a4(this.a),n),87).c,88)?BB(t,26):(gWn(),d$t)},MWn.Ui=function(n,t){return dmn(this,n,BB(t,26))},MWn.ai=function(){return!1},MWn.Zi=function(n,t,e,i,r){return null},MWn.Ji=function(){return new pp(this)},MWn.Ki=function(){sqn(a4(this.a))},MWn.Li=function(n){return Ufn(this,n)},MWn.Mi=function(n){var t;for(t=n.Kc();t.Ob();)if(!Ufn(this,t.Pb()))return!1;return!0},MWn.Ni=function(n){var t,e,i;if(cL(n,15)&&(i=BB(n,15)).gc()==a4(this.a).i){for(t=i.Kc(),e=new AL(this);t.Ob();)if(GI(t.Pb())!==GI(kpn(e)))return!1;return!0}return!1},MWn.Pi=function(){var n,t,e,i;for(t=1,n=new AL(a4(this.a));n.e!=n.i.gc();)t=31*t+((e=cL(i=BB(kpn(n),87).c,88)?BB(i,26):(gWn(),d$t))?PN(e):0);return t},MWn.Qi=function(n){var t,e,i,r;for(i=0,e=new AL(a4(this.a));e.e!=e.i.gc();){if(t=BB(kpn(e),87),GI(n)===GI(cL(r=t.c,88)?BB(r,26):(gWn(),d$t)))return i;++i}return-1},MWn.Ri=function(){return 0==a4(this.a).i},MWn.Si=function(){return null},MWn.Vi=function(){return a4(this.a).i},MWn.Wi=function(){var n,t,e,i,r,c;for(c=a4(this.a).i,r=x8(Ant,HWn,1,c,5,1),e=0,t=new AL(a4(this.a));t.e!=t.i.gc();)n=BB(kpn(t),87),r[e++]=cL(i=n.c,88)?BB(i,26):(gWn(),d$t);return r},MWn.Xi=function(n){var t,e,i,r;for(r=a4(this.a).i,n.length<r&&(n=Den(tsn(n).c,r)),n.length>r&&$X(n,r,null),e=0,t=new AL(a4(this.a));t.e!=t.i.gc();)$X(n,e++,cL(i=BB(kpn(t),87).c,88)?BB(i,26):(gWn(),d$t));return n},MWn.Yi=function(){var n,t,e,i,r;for((r=new Sk).a+="[",n=a4(this.a),t=0,i=a4(this.a).i;t<i;)cO(r,kN(cL(e=BB(Wtn(n,t),87).c,88)?BB(e,26):(gWn(),d$t))),++t<i&&(r.a+=FWn);return r.a+="]",r.a},MWn.$i=function(n){},MWn.aj=function(){return 10},MWn.Bk=function(){return!0},MWn.bj=function(){return!1},MWn.Ck=function(){return!1},MWn.Dk=function(){return!1},MWn.Ek=function(){return!0},MWn.rk=function(){return!1},MWn.Fk=function(){return!0},MWn.wj=function(n){return cL(n,88)},MWn.fj=function(){return Q0(this.a)},MWn.hi=function(){return!0},MWn.ni=function(){return!0},vX(l6n,"EClassImpl/8",1150),wAn(1151,1964,LVn,pp),MWn.Zc=function(n){return sin(this.a,n)},MWn.gc=function(){return a4(this.a.a).i},vX(l6n,"EClassImpl/8/1",1151),wAn(1152,497,h8n,Io),MWn.ri=function(n){return x8(HAt,HWn,138,n,0,1)},MWn.ni=function(){return!1},vX(l6n,"EClassImpl/9",1152),wAn(1139,53,eYn,Im),vX(l6n,"EClassImpl/MyHashSet",1139),wAn(566,351,{105:1,92:1,90:1,138:1,148:1,834:1,147:1,191:1,56:1,108:1,49:1,97:1,351:1,150:1,114:1,115:1,676:1},Ev),MWn._g=function(n,t,e){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),this.Ab;case 1:return this.zb;case 2:return null!=this.D?this.D:this.B;case 3:return iyn(this);case 4:return this.zj();case 5:return this.F;case 6:return t?Utn(this):wZ(this);case 7:return!this.A&&(this.A=new NL(O$t,this,7)),this.A;case 8:return hN(),0!=(256&this.Bb)}return U9(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n),t,e)},MWn.lh=function(n){switch(n){case 0:return!!this.Ab&&0!=this.Ab.i;case 1:return null!=this.zb;case 2:return null!=this.D&&this.D==this.F;case 3:return!!iyn(this);case 4:return null!=this.zj();case 5:return null!=this.F&&this.F!=this.D&&this.F!=this.B;case 6:return!!wZ(this);case 7:return!!this.A&&0!=this.A.i;case 8:return 0==(256&this.Bb)}return O3(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n))},MWn.sh=function(n,t){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),sqn(this.Ab),!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void pX(this.Ab,BB(t,14));case 1:return void ZZ(this,SD(t));case 2:return void IA(this,SD(t));case 5:return void Yqn(this,SD(t));case 7:return!this.A&&(this.A=new NL(O$t,this,7)),sqn(this.A),!this.A&&(this.A=new NL(O$t,this,7)),void pX(this.A,BB(t,14));case 8:return void Zfn(this,qy(TD(t)))}Lbn(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n),t)},MWn.zh=function(){return gWn(),u$t},MWn.Bh=function(n){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void sqn(this.Ab);case 1:return cL(this.Cb,179)&&(BB(this.Cb,179).tb=null),void Nrn(this,null);case 2:return Dsn(this,null),void xen(this,this.D);case 5:return void Yqn(this,null);case 7:return!this.A&&(this.A=new NL(O$t,this,7)),void sqn(this.A);case 8:return void Zfn(this,!0)}qfn(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n))},MWn.Gh=function(){Cfn((IPn(),Z$t),this).ne(),this.Bb|=1},MWn.Fj=function(){var n,t;if(!this.c&&!(n=G$n(Utn(this))).dc())for(t=n.Kc();t.Ob();)N_n(this,SD(t.Pb()))&&Rln(this);return this.b},MWn.zj=function(){var n;if(!this.e){n=null;try{n=iyn(this)}catch(t){if(!cL(t=lun(t),102))throw Hp(t)}this.d=null,n&&0!=(1&n.i)&&(this.d=n==$Nt?(hN(),ptt):n==ANt?iln(0):n==DNt?new Nb(0):n==xNt?0:n==LNt?jgn(0):n==RNt?rln(0):n==NNt?Pnn(0):fun(0)),this.e=!0}return this.d},MWn.Ej=function(){return 0!=(256&this.Bb)},MWn.Ik=function(n){n&&(this.D="org.eclipse.emf.common.util.AbstractEnumerator")},MWn.xk=function(n){Urn(this,n),this.Ik(n)},MWn.yk=function(n){this.C=n,this.e=!1},MWn.Ib=function(){var n;return 0!=(64&this.Db)?Cwn(this):((n=new fN(Cwn(this))).a+=" (serializable: ",yE(n,0!=(256&this.Bb)),n.a+=")",n.a)},MWn.c=!1,MWn.d=null,MWn.e=!1,vX(l6n,"EDataTypeImpl",566),wAn(457,566,{105:1,92:1,90:1,138:1,148:1,834:1,671:1,147:1,191:1,56:1,108:1,49:1,97:1,351:1,457:1,150:1,114:1,115:1,676:1},Am),MWn._g=function(n,t,e){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),this.Ab;case 1:return this.zb;case 2:return null!=this.D?this.D:this.B;case 3:return iyn(this);case 4:return Qsn(this);case 5:return this.F;case 6:return t?Utn(this):wZ(this);case 7:return!this.A&&(this.A=new NL(O$t,this,7)),this.A;case 8:return hN(),0!=(256&this.Bb);case 9:return!this.a&&(this.a=new eU(WAt,this,9,5)),this.a}return U9(this,n-bX((gWn(),o$t)),itn(BB(yan(this,16),26)||o$t,n),t,e)},MWn.hh=function(n,t,e){var i;switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),Ywn(this.Ab,n,e);case 6:return this.Cb&&(e=(i=this.Db>>16)>=0?fyn(this,e):this.Cb.ih(this,-1-i,null,e)),T_n(this,n,6,e);case 9:return!this.a&&(this.a=new eU(WAt,this,9,5)),Ywn(this.a,n,e)}return BB(itn(BB(yan(this,16),26)||(gWn(),o$t),t),66).Nj().Qj(this,fgn(this),t-bX((gWn(),o$t)),n,e)},MWn.jh=function(n,t,e){switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),_pn(this.Ab,n,e);case 6:return T_n(this,null,6,e);case 7:return!this.A&&(this.A=new NL(O$t,this,7)),_pn(this.A,n,e);case 9:return!this.a&&(this.a=new eU(WAt,this,9,5)),_pn(this.a,n,e)}return BB(itn(BB(yan(this,16),26)||(gWn(),o$t),t),66).Nj().Rj(this,fgn(this),t-bX((gWn(),o$t)),n,e)},MWn.lh=function(n){switch(n){case 0:return!!this.Ab&&0!=this.Ab.i;case 1:return null!=this.zb;case 2:return null!=this.D&&this.D==this.F;case 3:return!!iyn(this);case 4:return!!Qsn(this);case 5:return null!=this.F&&this.F!=this.D&&this.F!=this.B;case 6:return!!wZ(this);case 7:return!!this.A&&0!=this.A.i;case 8:return 0==(256&this.Bb);case 9:return!!this.a&&0!=this.a.i}return O3(this,n-bX((gWn(),o$t)),itn(BB(yan(this,16),26)||o$t,n))},MWn.sh=function(n,t){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),sqn(this.Ab),!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void pX(this.Ab,BB(t,14));case 1:return void ZZ(this,SD(t));case 2:return void IA(this,SD(t));case 5:return void Yqn(this,SD(t));case 7:return!this.A&&(this.A=new NL(O$t,this,7)),sqn(this.A),!this.A&&(this.A=new NL(O$t,this,7)),void pX(this.A,BB(t,14));case 8:return void Zfn(this,qy(TD(t)));case 9:return!this.a&&(this.a=new eU(WAt,this,9,5)),sqn(this.a),!this.a&&(this.a=new eU(WAt,this,9,5)),void pX(this.a,BB(t,14))}Lbn(this,n-bX((gWn(),o$t)),itn(BB(yan(this,16),26)||o$t,n),t)},MWn.zh=function(){return gWn(),o$t},MWn.Bh=function(n){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void sqn(this.Ab);case 1:return cL(this.Cb,179)&&(BB(this.Cb,179).tb=null),void Nrn(this,null);case 2:return Dsn(this,null),void xen(this,this.D);case 5:return void Yqn(this,null);case 7:return!this.A&&(this.A=new NL(O$t,this,7)),void sqn(this.A);case 8:return void Zfn(this,!0);case 9:return!this.a&&(this.a=new eU(WAt,this,9,5)),void sqn(this.a)}qfn(this,n-bX((gWn(),o$t)),itn(BB(yan(this,16),26)||o$t,n))},MWn.Gh=function(){var n,t;if(this.a)for(n=0,t=this.a.i;n<t;++n)vx(Wtn(this.a,n));Cfn((IPn(),Z$t),this).ne(),this.Bb|=1},MWn.zj=function(){return Qsn(this)},MWn.wj=function(n){return null!=n},MWn.Ik=function(n){},vX(l6n,"EEnumImpl",457),wAn(573,438,{105:1,92:1,90:1,1940:1,678:1,147:1,191:1,56:1,108:1,49:1,97:1,573:1,150:1,114:1,115:1},jv),MWn.ne=function(){return this.zb},MWn.Qg=function(n){return lkn(this,n)},MWn._g=function(n,t,e){var i;switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),this.Ab;case 1:return this.zb;case 2:return iln(this.d);case 3:return this.b?this.b:this.a;case 4:return null==(i=this.c)?this.zb:i;case 5:return this.Db>>16==5?BB(this.Cb,671):null}return U9(this,n-bX((gWn(),s$t)),itn(BB(yan(this,16),26)||s$t,n),t,e)},MWn.hh=function(n,t,e){var i;switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),Ywn(this.Ab,n,e);case 5:return this.Cb&&(e=(i=this.Db>>16)>=0?lkn(this,e):this.Cb.ih(this,-1-i,null,e)),T_n(this,n,5,e)}return BB(itn(BB(yan(this,16),26)||(gWn(),s$t),t),66).Nj().Qj(this,fgn(this),t-bX((gWn(),s$t)),n,e)},MWn.jh=function(n,t,e){switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),_pn(this.Ab,n,e);case 5:return T_n(this,null,5,e)}return BB(itn(BB(yan(this,16),26)||(gWn(),s$t),t),66).Nj().Rj(this,fgn(this),t-bX((gWn(),s$t)),n,e)},MWn.lh=function(n){switch(n){case 0:return!!this.Ab&&0!=this.Ab.i;case 1:return null!=this.zb;case 2:return 0!=this.d;case 3:return!!this.b;case 4:return null!=this.c;case 5:return!(this.Db>>16!=5||!BB(this.Cb,671))}return O3(this,n-bX((gWn(),s$t)),itn(BB(yan(this,16),26)||s$t,n))},MWn.sh=function(n,t){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),sqn(this.Ab),!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void pX(this.Ab,BB(t,14));case 1:return void Nrn(this,SD(t));case 2:return void $en(this,BB(t,19).a);case 3:return void gOn(this,BB(t,1940));case 4:return void Fin(this,SD(t))}Lbn(this,n-bX((gWn(),s$t)),itn(BB(yan(this,16),26)||s$t,n),t)},MWn.zh=function(){return gWn(),s$t},MWn.Bh=function(n){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void sqn(this.Ab);case 1:return void Nrn(this,null);case 2:return void $en(this,0);case 3:return void gOn(this,null);case 4:return void Fin(this,null)}qfn(this,n-bX((gWn(),s$t)),itn(BB(yan(this,16),26)||s$t,n))},MWn.Ib=function(){var n;return null==(n=this.c)?this.zb:n},MWn.b=null,MWn.c=null,MWn.d=0,vX(l6n,"EEnumLiteralImpl",573);var L$t,N$t,x$t,D$t=bq(l6n,"EFactoryImpl/InternalEDateTimeFormat");wAn(489,1,{2015:1},vp),vX(l6n,"EFactoryImpl/1ClientInternalEDateTimeFormat",489),wAn(241,115,{105:1,92:1,90:1,87:1,56:1,108:1,49:1,97:1,241:1,114:1,115:1},Kp),MWn.Sg=function(n,t,e){var i;return e=T_n(this,n,t,e),this.e&&cL(n,170)&&(i=kLn(this,this.e))!=this.c&&(e=azn(this,i,e)),e},MWn._g=function(n,t,e){switch(n){case 0:return this.f;case 1:return!this.d&&(this.d=new $L(VAt,this,1)),this.d;case 2:return t?lFn(this):this.c;case 3:return this.b;case 4:return this.e;case 5:return t?qvn(this):this.a}return U9(this,n-bX((gWn(),f$t)),itn(BB(yan(this,16),26)||f$t,n),t,e)},MWn.jh=function(n,t,e){switch(t){case 0:return nfn(this,null,e);case 1:return!this.d&&(this.d=new $L(VAt,this,1)),_pn(this.d,n,e);case 3:return Zhn(this,null,e)}return BB(itn(BB(yan(this,16),26)||(gWn(),f$t),t),66).Nj().Rj(this,fgn(this),t-bX((gWn(),f$t)),n,e)},MWn.lh=function(n){switch(n){case 0:return!!this.f;case 1:return!!this.d&&0!=this.d.i;case 2:return!!this.c;case 3:return!!this.b;case 4:return!!this.e;case 5:return!!this.a}return O3(this,n-bX((gWn(),f$t)),itn(BB(yan(this,16),26)||f$t,n))},MWn.sh=function(n,t){switch(n){case 0:return void jEn(this,BB(t,87));case 1:return!this.d&&(this.d=new $L(VAt,this,1)),sqn(this.d),!this.d&&(this.d=new $L(VAt,this,1)),void pX(this.d,BB(t,14));case 3:return void kEn(this,BB(t,87));case 4:return void DMn(this,BB(t,836));case 5:return void cen(this,BB(t,138))}Lbn(this,n-bX((gWn(),f$t)),itn(BB(yan(this,16),26)||f$t,n),t)},MWn.zh=function(){return gWn(),f$t},MWn.Bh=function(n){switch(n){case 0:return void jEn(this,null);case 1:return!this.d&&(this.d=new $L(VAt,this,1)),void sqn(this.d);case 3:return void kEn(this,null);case 4:return void DMn(this,null);case 5:return void cen(this,null)}qfn(this,n-bX((gWn(),f$t)),itn(BB(yan(this,16),26)||f$t,n))},MWn.Ib=function(){var n;return(n=new lN(P$n(this))).a+=" (expression: ",bHn(this,n),n.a+=")",n.a},vX(l6n,"EGenericTypeImpl",241),wAn(1969,1964,q9n),MWn.Xh=function(n,t){nR(this,n,t)},MWn.lk=function(n,t){return nR(this,this.gc(),n),t},MWn.pi=function(n){return Dpn(this.Gi(),n)},MWn.Zh=function(){return this.$h()},MWn.Gi=function(){return new Pp(this)},MWn.$h=function(){return this._h(0)},MWn._h=function(n){return this.Gi().Zc(n)},MWn.mk=function(n,t){return ywn(this,n,!0),t},MWn.ii=function(n,t){var e;return e=tkn(this,t),this.Zc(n).Rb(e),e},MWn.ji=function(n,t){ywn(this,t,!0),this.Zc(n).Rb(t)},vX(y9n,"AbstractSequentialInternalEList",1969),wAn(486,1969,q9n,QN),MWn.pi=function(n){return Dpn(this.Gi(),n)},MWn.Zh=function(){return null==this.b?(YM(),YM(),x$t):this.Jk()},MWn.Gi=function(){return new DO(this.a,this.b)},MWn.$h=function(){return null==this.b?(YM(),YM(),x$t):this.Jk()},MWn._h=function(n){var t,e;if(null==this.b){if(n<0||n>1)throw Hp(new Ay(e9n+n+", size=0"));return YM(),YM(),x$t}for(e=this.Jk(),t=0;t<n;++t)Man(e);return e},MWn.dc=function(){var n,t,e,i,r,c;if(null!=this.b)for(e=0;e<this.b.length;++e)if(n=this.b[e],!this.Mk()||this.a.mh(n))if(c=this.a.bh(n,!1),ZM(),BB(n,66).Oj()){for(i=0,r=(t=BB(c,153)).gc();i<r;++i)if(wX(t.il(i))&&null!=t.jl(i))return!1}else if(n.$j()){if(!BB(c,14).dc())return!1}else if(null!=c)return!1;return!0},MWn.Kc=function(){return Ern(this)},MWn.Zc=function(n){var t,e;if(null==this.b){if(0!=n)throw Hp(new Ay(e9n+n+", size=0"));return YM(),YM(),x$t}for(e=this.Lk()?this.Kk():this.Jk(),t=0;t<n;++t)Man(e);return e},MWn.ii=function(n,t){throw Hp(new pv)},MWn.ji=function(n,t){throw Hp(new pv)},MWn.Jk=function(){return new YN(this.a,this.b)},MWn.Kk=function(){return new Vx(this.a,this.b)},MWn.Lk=function(){return!0},MWn.gc=function(){var n,t,e,i,r,c,a;if(r=0,null!=this.b)for(e=0;e<this.b.length;++e)if(n=this.b[e],!this.Mk()||this.a.mh(n))if(a=this.a.bh(n,!1),ZM(),BB(n,66).Oj())for(i=0,c=(t=BB(a,153)).gc();i<c;++i)wX(t.il(i))&&null!=t.jl(i)&&++r;else n.$j()?r+=BB(a,14).gc():null!=a&&++r;return r},MWn.Mk=function(){return!0},vX(y9n,"EContentsEList",486),wAn(1156,486,q9n,Wx),MWn.Jk=function(){return new Qx(this.a,this.b)},MWn.Kk=function(){return new Yx(this.a,this.b)},MWn.Mk=function(){return!1},vX(l6n,"ENamedElementImpl/1",1156),wAn(279,1,G9n,YN),MWn.Nb=function(n){fU(this,n)},MWn.Rb=function(n){throw Hp(new pv)},MWn.Nk=function(n){if(0!=this.g||this.e)throw Hp(new Fy("Iterator already in use or already filtered"));this.e=n},MWn.Ob=function(){var n,t,e,i,r,c;switch(this.g){case 3:case 2:return!0;case 1:return!1;case-3:this.p?this.p.Pb():++this.n;default:if(this.k&&(this.p?kPn(this,this.p):pOn(this)))return r=this.p?this.p.Pb():this.j?this.j.pi(this.n++):this.k.Xb(this.n++),this.f?((n=BB(r,72)).ak(),e=n.dd(),this.i=e):(e=r,this.i=e),this.g=3,!0;for(;this.d<this.c.length;)if(t=this.c[this.d++],(!this.e||t.Gj()!=NOt||0!=t.aj())&&(!this.Mk()||this.b.mh(t)))if(c=this.b.bh(t,this.Lk()),this.f=(ZM(),BB(t,66).Oj()),this.f||t.$j()){if(this.Lk()?(i=BB(c,15),this.k=i):(i=BB(c,69),this.k=this.j=i),cL(this.k,54)?(this.p=null,this.o=this.k.gc(),this.n=0):this.p=this.j?this.j.$h():this.k.Yc(),this.p?kPn(this,this.p):pOn(this))return r=this.p?this.p.Pb():this.j?this.j.pi(this.n++):this.k.Xb(this.n++),this.f?((n=BB(r,72)).ak(),e=n.dd(),this.i=e):(e=r,this.i=e),this.g=3,!0}else if(null!=c)return this.k=null,this.p=null,e=c,this.i=e,this.g=2,!0;return this.k=null,this.p=null,this.f=!1,this.g=1,!1}},MWn.Sb=function(){var n,t,e,i,r,c;switch(this.g){case-3:case-2:return!0;case-1:return!1;case 3:this.p?this.p.Ub():--this.n;default:if(this.k&&(this.p?jPn(this,this.p):wCn(this)))return r=this.p?this.p.Ub():this.j?this.j.pi(--this.n):this.k.Xb(--this.n),this.f?((n=BB(r,72)).ak(),e=n.dd(),this.i=e):(e=r,this.i=e),this.g=-3,!0;for(;this.d>0;)if(t=this.c[--this.d],(!this.e||t.Gj()!=NOt||0!=t.aj())&&(!this.Mk()||this.b.mh(t)))if(c=this.b.bh(t,this.Lk()),this.f=(ZM(),BB(t,66).Oj()),this.f||t.$j()){if(this.Lk()?(i=BB(c,15),this.k=i):(i=BB(c,69),this.k=this.j=i),cL(this.k,54)?(this.o=this.k.gc(),this.n=this.o):this.p=this.j?this.j._h(this.k.gc()):this.k.Zc(this.k.gc()),this.p?jPn(this,this.p):wCn(this))return r=this.p?this.p.Ub():this.j?this.j.pi(--this.n):this.k.Xb(--this.n),this.f?((n=BB(r,72)).ak(),e=n.dd(),this.i=e):(e=r,this.i=e),this.g=-3,!0}else if(null!=c)return this.k=null,this.p=null,e=c,this.i=e,this.g=-2,!0;return this.k=null,this.p=null,this.g=-1,!1}},MWn.Pb=function(){return Man(this)},MWn.Tb=function(){return this.a},MWn.Ub=function(){var n;if(this.g<-1||this.Sb())return--this.a,this.g=0,n=this.i,this.Sb(),n;throw Hp(new yv)},MWn.Vb=function(){return this.a-1},MWn.Qb=function(){throw Hp(new pv)},MWn.Lk=function(){return!1},MWn.Wb=function(n){throw Hp(new pv)},MWn.Mk=function(){return!0},MWn.a=0,MWn.d=0,MWn.f=!1,MWn.g=0,MWn.n=0,MWn.o=0,vX(y9n,"EContentsEList/FeatureIteratorImpl",279),wAn(697,279,G9n,Vx),MWn.Lk=function(){return!0},vX(y9n,"EContentsEList/ResolvingFeatureIteratorImpl",697),wAn(1157,697,G9n,Yx),MWn.Mk=function(){return!1},vX(l6n,"ENamedElementImpl/1/1",1157),wAn(1158,279,G9n,Qx),MWn.Mk=function(){return!1},vX(l6n,"ENamedElementImpl/1/2",1158),wAn(36,143,t9n,f4,l4,nU,k9,N7,t6,Hen,S0,qen,P0,J5,C0,Uen,I0,Z5,O0,Gen,A0,tU,j9,GQ,zen,$0,n6,L0),MWn._i=function(){return h9(this)},MWn.gj=function(){var n;return(n=h9(this))?n.zj():null},MWn.yi=function(n){return-1==this.b&&this.a&&(this.b=this.c.Xg(this.a.aj(),this.a.Gj())),this.c.Og(this.b,n)},MWn.Ai=function(){return this.c},MWn.hj=function(){var n;return!!(n=h9(this))&&n.Kj()},MWn.b=-1,vX(l6n,"ENotificationImpl",36),wAn(399,284,{105:1,92:1,90:1,147:1,191:1,56:1,59:1,108:1,472:1,49:1,97:1,150:1,399:1,284:1,114:1,115:1},$m),MWn.Qg=function(n){return Pkn(this,n)},MWn._g=function(n,t,e){var i;switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),this.Ab;case 1:return this.zb;case 2:return hN(),0!=(256&this.Bb);case 3:return hN(),0!=(512&this.Bb);case 4:return iln(this.s);case 5:return iln(this.t);case 6:return hN(),(i=this.t)>1||-1==i;case 7:return hN(),this.s>=1;case 8:return t?Ikn(this):this.r;case 9:return this.q;case 10:return this.Db>>16==10?BB(this.Cb,26):null;case 11:return!this.d&&(this.d=new NL(O$t,this,11)),this.d;case 12:return!this.c&&(this.c=new eU(YAt,this,12,10)),this.c;case 13:return!this.a&&(this.a=new oR(this,this)),this.a;case 14:return H7(this)}return U9(this,n-bX((gWn(),g$t)),itn(BB(yan(this,16),26)||g$t,n),t,e)},MWn.hh=function(n,t,e){var i;switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),Ywn(this.Ab,n,e);case 10:return this.Cb&&(e=(i=this.Db>>16)>=0?Pkn(this,e):this.Cb.ih(this,-1-i,null,e)),T_n(this,n,10,e);case 12:return!this.c&&(this.c=new eU(YAt,this,12,10)),Ywn(this.c,n,e)}return BB(itn(BB(yan(this,16),26)||(gWn(),g$t),t),66).Nj().Qj(this,fgn(this),t-bX((gWn(),g$t)),n,e)},MWn.jh=function(n,t,e){switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),_pn(this.Ab,n,e);case 9:return gX(this,e);case 10:return T_n(this,null,10,e);case 11:return!this.d&&(this.d=new NL(O$t,this,11)),_pn(this.d,n,e);case 12:return!this.c&&(this.c=new eU(YAt,this,12,10)),_pn(this.c,n,e);case 14:return _pn(H7(this),n,e)}return BB(itn(BB(yan(this,16),26)||(gWn(),g$t),t),66).Nj().Rj(this,fgn(this),t-bX((gWn(),g$t)),n,e)},MWn.lh=function(n){var t;switch(n){case 0:return!!this.Ab&&0!=this.Ab.i;case 1:return null!=this.zb;case 2:return 0==(256&this.Bb);case 3:return 0==(512&this.Bb);case 4:return 0!=this.s;case 5:return 1!=this.t;case 6:return(t=this.t)>1||-1==t;case 7:return this.s>=1;case 8:return!!this.r&&!this.q.e&&0==yW(this.q).i;case 9:return!(!this.q||this.r&&!this.q.e&&0==yW(this.q).i);case 10:return!(this.Db>>16!=10||!BB(this.Cb,26));case 11:return!!this.d&&0!=this.d.i;case 12:return!!this.c&&0!=this.c.i;case 13:return!(!this.a||0==H7(this.a.a).i||this.b&&Kvn(this.b));case 14:return!!this.b&&Kvn(this.b)}return O3(this,n-bX((gWn(),g$t)),itn(BB(yan(this,16),26)||g$t,n))},MWn.sh=function(n,t){var e;switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),sqn(this.Ab),!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void pX(this.Ab,BB(t,14));case 1:return void Nrn(this,SD(t));case 2:return void Yfn(this,qy(TD(t)));case 3:return void nln(this,qy(TD(t)));case 4:return void Len(this,BB(t,19).a);case 5:return void Nen(this,BB(t,19).a);case 8:return void Ihn(this,BB(t,138));case 9:return void((e=HTn(this,BB(t,87),null))&&e.Fi());case 11:return!this.d&&(this.d=new NL(O$t,this,11)),sqn(this.d),!this.d&&(this.d=new NL(O$t,this,11)),void pX(this.d,BB(t,14));case 12:return!this.c&&(this.c=new eU(YAt,this,12,10)),sqn(this.c),!this.c&&(this.c=new eU(YAt,this,12,10)),void pX(this.c,BB(t,14));case 13:return!this.a&&(this.a=new oR(this,this)),vqn(this.a),!this.a&&(this.a=new oR(this,this)),void pX(this.a,BB(t,14));case 14:return sqn(H7(this)),void pX(H7(this),BB(t,14))}Lbn(this,n-bX((gWn(),g$t)),itn(BB(yan(this,16),26)||g$t,n),t)},MWn.zh=function(){return gWn(),g$t},MWn.Bh=function(n){var t;switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void sqn(this.Ab);case 1:return void Nrn(this,null);case 2:return void Yfn(this,!0);case 3:return void nln(this,!0);case 4:return void Len(this,0);case 5:return void Nen(this,1);case 8:return void Ihn(this,null);case 9:return void((t=HTn(this,null,null))&&t.Fi());case 11:return!this.d&&(this.d=new NL(O$t,this,11)),void sqn(this.d);case 12:return!this.c&&(this.c=new eU(YAt,this,12,10)),void sqn(this.c);case 13:return void(this.a&&vqn(this.a));case 14:return void(this.b&&sqn(this.b))}qfn(this,n-bX((gWn(),g$t)),itn(BB(yan(this,16),26)||g$t,n))},MWn.Gh=function(){var n,t;if(this.c)for(n=0,t=this.c.i;n<t;++n)vx(Wtn(this.c,n));Ikn(this),this.Bb|=1},vX(l6n,"EOperationImpl",399),wAn(505,742,H9n,oR),MWn.Hi=function(n,t){fD(this,n,BB(t,138))},MWn.Ii=function(n){i$(this,BB(n,138))},MWn.Oi=function(n){return BB(Wtn(H7(this.a),n),87).c||(gWn(),l$t)},MWn.Ti=function(n){return BB(fDn(H7(this.a),n),87).c||(gWn(),l$t)},MWn.Ui=function(n,t){return bgn(this,n,BB(t,138))},MWn.ai=function(){return!1},MWn.Zi=function(n,t,e,i,r){return null},MWn.Ji=function(){return new mp(this)},MWn.Ki=function(){sqn(H7(this.a))},MWn.Li=function(n){return oln(this,n)},MWn.Mi=function(n){var t;for(t=n.Kc();t.Ob();)if(!oln(this,t.Pb()))return!1;return!0},MWn.Ni=function(n){var t,e,i;if(cL(n,15)&&(i=BB(n,15)).gc()==H7(this.a).i){for(t=i.Kc(),e=new AL(this);t.Ob();)if(GI(t.Pb())!==GI(kpn(e)))return!1;return!0}return!1},MWn.Pi=function(){var n,t,e;for(t=1,n=new AL(H7(this.a));n.e!=n.i.gc();)t=31*t+((e=BB(kpn(n),87).c||(gWn(),l$t))?nsn(e):0);return t},MWn.Qi=function(n){var t,e,i;for(i=0,e=new AL(H7(this.a));e.e!=e.i.gc();){if(t=BB(kpn(e),87),GI(n)===GI(t.c||(gWn(),l$t)))return i;++i}return-1},MWn.Ri=function(){return 0==H7(this.a).i},MWn.Si=function(){return null},MWn.Vi=function(){return H7(this.a).i},MWn.Wi=function(){var n,t,e,i,r;for(r=H7(this.a).i,i=x8(Ant,HWn,1,r,5,1),e=0,t=new AL(H7(this.a));t.e!=t.i.gc();)n=BB(kpn(t),87),i[e++]=n.c||(gWn(),l$t);return i},MWn.Xi=function(n){var t,e,i;for(i=H7(this.a).i,n.length<i&&(n=Den(tsn(n).c,i)),n.length>i&&$X(n,i,null),e=0,t=new AL(H7(this.a));t.e!=t.i.gc();)$X(n,e++,BB(kpn(t),87).c||(gWn(),l$t));return n},MWn.Yi=function(){var n,t,e,i;for((i=new Sk).a+="[",n=H7(this.a),t=0,e=H7(this.a).i;t<e;)cO(i,kN(BB(Wtn(n,t),87).c||(gWn(),l$t))),++t<e&&(i.a+=FWn);return i.a+="]",i.a},MWn.$i=function(n){},MWn.aj=function(){return 13},MWn.Bk=function(){return!0},MWn.bj=function(){return!1},MWn.Ck=function(){return!1},MWn.Dk=function(){return!1},MWn.Ek=function(){return!0},MWn.rk=function(){return!1},MWn.Fk=function(){return!0},MWn.wj=function(n){return cL(n,138)},MWn.fj=function(){return V0(this.a)},MWn.hi=function(){return!0},MWn.ni=function(){return!0},vX(l6n,"EOperationImpl/1",505),wAn(1340,1964,LVn,mp),MWn.Zc=function(n){return sin(this.a,n)},MWn.gc=function(){return H7(this.a.a).i},vX(l6n,"EOperationImpl/1/1",1340),wAn(1341,545,R9n,JG),MWn.ii=function(n,t){var e;return e=BB(Iln(this,n,t),87),mA(this.e)&&Lv(this,new j9(this.a,7,(gWn(),p$t),iln(t),e.c||l$t,n)),e},MWn.jj=function(n,t){return Mfn(this,BB(n,87),t)},MWn.kj=function(n,t){return Sfn(this,BB(n,87),t)},MWn.lj=function(n,t,e){return Wgn(this,BB(n,87),BB(t,87),e)},MWn.Zi=function(n,t,e,i,r){switch(n){case 3:return yZ(this,n,t,e,i,this.i>1);case 5:return yZ(this,n,t,e,i,this.i-BB(e,15).gc()>0);default:return new N7(this.e,n,this.c,t,e,i,!0)}},MWn.ij=function(){return!0},MWn.fj=function(){return Kvn(this)},MWn.Xj=function(){sqn(this)},vX(l6n,"EOperationImpl/2",1341),wAn(498,1,{1938:1,498:1},OI),vX(l6n,"EPackageImpl/1",498),wAn(16,85,R9n,eU),MWn.zk=function(){return this.d},MWn.Ak=function(){return this.b},MWn.Dk=function(){return!0},MWn.b=0,vX(y9n,"EObjectContainmentWithInverseEList",16),wAn(353,16,R9n,eK),MWn.Ek=function(){return!0},MWn.li=function(n,t){return GOn(this,n,BB(t,56))},vX(y9n,"EObjectContainmentWithInverseEList/Resolving",353),wAn(298,353,R9n,Jz),MWn.ci=function(){this.a.tb=null},vX(l6n,"EPackageImpl/2",298),wAn(1228,1,{},Oo),vX(l6n,"EPackageImpl/3",1228),wAn(718,43,tYn,Nm),MWn._b=function(n){return XI(n)?eY(this,n):!!AY(this.f,n)},vX(l6n,"EPackageRegistryImpl",718),wAn(509,284,{105:1,92:1,90:1,147:1,191:1,56:1,2017:1,108:1,472:1,49:1,97:1,150:1,509:1,284:1,114:1,115:1},Lm),MWn.Qg=function(n){return Ckn(this,n)},MWn._g=function(n,t,e){var i;switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),this.Ab;case 1:return this.zb;case 2:return hN(),0!=(256&this.Bb);case 3:return hN(),0!=(512&this.Bb);case 4:return iln(this.s);case 5:return iln(this.t);case 6:return hN(),(i=this.t)>1||-1==i;case 7:return hN(),this.s>=1;case 8:return t?Ikn(this):this.r;case 9:return this.q;case 10:return this.Db>>16==10?BB(this.Cb,59):null}return U9(this,n-bX((gWn(),m$t)),itn(BB(yan(this,16),26)||m$t,n),t,e)},MWn.hh=function(n,t,e){var i;switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),Ywn(this.Ab,n,e);case 10:return this.Cb&&(e=(i=this.Db>>16)>=0?Ckn(this,e):this.Cb.ih(this,-1-i,null,e)),T_n(this,n,10,e)}return BB(itn(BB(yan(this,16),26)||(gWn(),m$t),t),66).Nj().Qj(this,fgn(this),t-bX((gWn(),m$t)),n,e)},MWn.jh=function(n,t,e){switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),_pn(this.Ab,n,e);case 9:return gX(this,e);case 10:return T_n(this,null,10,e)}return BB(itn(BB(yan(this,16),26)||(gWn(),m$t),t),66).Nj().Rj(this,fgn(this),t-bX((gWn(),m$t)),n,e)},MWn.lh=function(n){var t;switch(n){case 0:return!!this.Ab&&0!=this.Ab.i;case 1:return null!=this.zb;case 2:return 0==(256&this.Bb);case 3:return 0==(512&this.Bb);case 4:return 0!=this.s;case 5:return 1!=this.t;case 6:return(t=this.t)>1||-1==t;case 7:return this.s>=1;case 8:return!!this.r&&!this.q.e&&0==yW(this.q).i;case 9:return!(!this.q||this.r&&!this.q.e&&0==yW(this.q).i);case 10:return!(this.Db>>16!=10||!BB(this.Cb,59))}return O3(this,n-bX((gWn(),m$t)),itn(BB(yan(this,16),26)||m$t,n))},MWn.zh=function(){return gWn(),m$t},vX(l6n,"EParameterImpl",509),wAn(99,449,{105:1,92:1,90:1,147:1,191:1,56:1,18:1,170:1,66:1,108:1,472:1,49:1,97:1,150:1,99:1,449:1,284:1,114:1,115:1,677:1},pD),MWn._g=function(n,t,e){var i,r;switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),this.Ab;case 1:return this.zb;case 2:return hN(),0!=(256&this.Bb);case 3:return hN(),0!=(512&this.Bb);case 4:return iln(this.s);case 5:return iln(this.t);case 6:return hN(),(r=this.t)>1||-1==r;case 7:return hN(),this.s>=1;case 8:return t?Ikn(this):this.r;case 9:return this.q;case 10:return hN(),0!=(this.Bb&k6n);case 11:return hN(),0!=(this.Bb&M9n);case 12:return hN(),0!=(this.Bb&_Qn);case 13:return this.j;case 14:return qLn(this);case 15:return hN(),0!=(this.Bb&T9n);case 16:return hN(),0!=(this.Bb&hVn);case 17:return dZ(this);case 18:return hN(),0!=(this.Bb&h6n);case 19:return hN(),!(!(i=Cvn(this))||0==(i.Bb&h6n));case 20:return hN(),0!=(this.Bb&BQn);case 21:return t?Cvn(this):this.b;case 22:return t?Ion(this):K5(this);case 23:return!this.a&&(this.a=new RL(BAt,this,23)),this.a}return U9(this,n-bX((gWn(),y$t)),itn(BB(yan(this,16),26)||y$t,n),t,e)},MWn.lh=function(n){var t,e;switch(n){case 0:return!!this.Ab&&0!=this.Ab.i;case 1:return null!=this.zb;case 2:return 0==(256&this.Bb);case 3:return 0==(512&this.Bb);case 4:return 0!=this.s;case 5:return 1!=this.t;case 6:return(e=this.t)>1||-1==e;case 7:return this.s>=1;case 8:return!!this.r&&!this.q.e&&0==yW(this.q).i;case 9:return!(!this.q||this.r&&!this.q.e&&0==yW(this.q).i);case 10:return 0==(this.Bb&k6n);case 11:return 0!=(this.Bb&M9n);case 12:return 0!=(this.Bb&_Qn);case 13:return null!=this.j;case 14:return null!=qLn(this);case 15:return 0!=(this.Bb&T9n);case 16:return 0!=(this.Bb&hVn);case 17:return!!dZ(this);case 18:return 0!=(this.Bb&h6n);case 19:return!!(t=Cvn(this))&&0!=(t.Bb&h6n);case 20:return 0==(this.Bb&BQn);case 21:return!!this.b;case 22:return!!K5(this);case 23:return!!this.a&&0!=this.a.i}return O3(this,n-bX((gWn(),y$t)),itn(BB(yan(this,16),26)||y$t,n))},MWn.sh=function(n,t){var e;switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),sqn(this.Ab),!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void pX(this.Ab,BB(t,14));case 1:return void JZ(this,SD(t));case 2:return void Yfn(this,qy(TD(t)));case 3:return void nln(this,qy(TD(t)));case 4:return void Len(this,BB(t,19).a);case 5:return void Nen(this,BB(t,19).a);case 8:return void Ihn(this,BB(t,138));case 9:return void((e=HTn(this,BB(t,87),null))&&e.Fi());case 10:return void Aln(this,qy(TD(t)));case 11:return void Nln(this,qy(TD(t)));case 12:return void $ln(this,qy(TD(t)));case 13:return void _I(this,SD(t));case 15:return void Lln(this,qy(TD(t)));case 16:return void qln(this,qy(TD(t)));case 18:return void YZ(this,qy(TD(t)));case 20:return void Uln(this,qy(TD(t)));case 21:return void rrn(this,BB(t,18));case 23:return!this.a&&(this.a=new RL(BAt,this,23)),sqn(this.a),!this.a&&(this.a=new RL(BAt,this,23)),void pX(this.a,BB(t,14))}Lbn(this,n-bX((gWn(),y$t)),itn(BB(yan(this,16),26)||y$t,n),t)},MWn.zh=function(){return gWn(),y$t},MWn.Bh=function(n){var t;switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void sqn(this.Ab);case 1:return cL(this.Cb,88)&&ACn(P5(BB(this.Cb,88)),4),void Nrn(this,null);case 2:return void Yfn(this,!0);case 3:return void nln(this,!0);case 4:return void Len(this,0);case 5:return void Nen(this,1);case 8:return void Ihn(this,null);case 9:return void((t=HTn(this,null,null))&&t.Fi());case 10:return void Aln(this,!0);case 11:return void Nln(this,!1);case 12:return void $ln(this,!1);case 13:return this.i=null,void arn(this,null);case 15:return void Lln(this,!1);case 16:return void qln(this,!1);case 18:return zln(this,!1),void(cL(this.Cb,88)&&ACn(P5(BB(this.Cb,88)),2));case 20:return void Uln(this,!0);case 21:return void rrn(this,null);case 23:return!this.a&&(this.a=new RL(BAt,this,23)),void sqn(this.a)}qfn(this,n-bX((gWn(),y$t)),itn(BB(yan(this,16),26)||y$t,n))},MWn.Gh=function(){Ion(this),kV(B7((IPn(),Z$t),this)),Ikn(this),this.Bb|=1},MWn.Lj=function(){return Cvn(this)},MWn.qk=function(){var n;return!!(n=Cvn(this))&&0!=(n.Bb&h6n)},MWn.rk=function(){return 0!=(this.Bb&h6n)},MWn.sk=function(){return 0!=(this.Bb&BQn)},MWn.nk=function(n,t){return this.c=null,Pfn(this,n,t)},MWn.Ib=function(){var n;return 0!=(64&this.Db)?ERn(this):((n=new fN(ERn(this))).a+=" (containment: ",yE(n,0!=(this.Bb&h6n)),n.a+=", resolveProxies: ",yE(n,0!=(this.Bb&BQn)),n.a+=")",n.a)},vX(l6n,"EReferenceImpl",99),wAn(548,115,{105:1,42:1,92:1,90:1,133:1,56:1,108:1,49:1,97:1,548:1,114:1,115:1},Ao),MWn.Fb=function(n){return this===n},MWn.cd=function(){return this.b},MWn.dd=function(){return this.c},MWn.Hb=function(){return PN(this)},MWn.Uh=function(n){vq(this,SD(n))},MWn.ed=function(n){return $H(this,SD(n))},MWn._g=function(n,t,e){switch(n){case 0:return this.b;case 1:return this.c}return U9(this,n-bX((gWn(),k$t)),itn(BB(yan(this,16),26)||k$t,n),t,e)},MWn.lh=function(n){switch(n){case 0:return null!=this.b;case 1:return null!=this.c}return O3(this,n-bX((gWn(),k$t)),itn(BB(yan(this,16),26)||k$t,n))},MWn.sh=function(n,t){switch(n){case 0:return void mq(this,SD(t));case 1:return void Kin(this,SD(t))}Lbn(this,n-bX((gWn(),k$t)),itn(BB(yan(this,16),26)||k$t,n),t)},MWn.zh=function(){return gWn(),k$t},MWn.Bh=function(n){switch(n){case 0:return void Rin(this,null);case 1:return void Kin(this,null)}qfn(this,n-bX((gWn(),k$t)),itn(BB(yan(this,16),26)||k$t,n))},MWn.Sh=function(){var n;return-1==this.a&&(n=this.b,this.a=null==n?0:vvn(n)),this.a},MWn.Th=function(n){this.a=n},MWn.Ib=function(){var n;return 0!=(64&this.Db)?P$n(this):((n=new fN(P$n(this))).a+=" (key: ",cO(n,this.b),n.a+=", value: ",cO(n,this.c),n.a+=")",n.a)},MWn.a=-1,MWn.b=null,MWn.c=null;var R$t,K$t,_$t,F$t,B$t,H$t,q$t,G$t,z$t,U$t,X$t=vX(l6n,"EStringToStringMapEntryImpl",548),W$t=bq(y9n,"FeatureMap/Entry/Internal");wAn(565,1,z9n),MWn.Ok=function(n){return this.Pk(BB(n,49))},MWn.Pk=function(n){return this.Ok(n)},MWn.Fb=function(n){var t,e;return this===n||!!cL(n,72)&&(t=BB(n,72)).ak()==this.c&&(null==(e=this.dd())?null==t.dd():Nfn(e,t.dd()))},MWn.ak=function(){return this.c},MWn.Hb=function(){var n;return n=this.dd(),nsn(this.c)^(null==n?0:nsn(n))},MWn.Ib=function(){var n,t;return t=Utn((n=this.c).Hj()).Ph(),n.ne(),(null!=t&&0!=t.length?t+":"+n.ne():n.ne())+"="+this.dd()},vX(l6n,"EStructuralFeatureImpl/BasicFeatureMapEntry",565),wAn(776,565,z9n,rR),MWn.Pk=function(n){return new rR(this.c,n)},MWn.dd=function(){return this.a},MWn.Qk=function(n,t,e){return Scn(this,n,this.a,t,e)},MWn.Rk=function(n,t,e){return Pcn(this,n,this.a,t,e)},vX(l6n,"EStructuralFeatureImpl/ContainmentUpdatingFeatureMapEntry",776),wAn(1314,1,{},AI),MWn.Pj=function(n,t,e,i,r){return BB(S9(n,this.b),215).nl(this.a).Wj(i)},MWn.Qj=function(n,t,e,i,r){return BB(S9(n,this.b),215).el(this.a,i,r)},MWn.Rj=function(n,t,e,i,r){return BB(S9(n,this.b),215).fl(this.a,i,r)},MWn.Sj=function(n,t,e){return BB(S9(n,this.b),215).nl(this.a).fj()},MWn.Tj=function(n,t,e,i){BB(S9(n,this.b),215).nl(this.a).Wb(i)},MWn.Uj=function(n,t,e){return BB(S9(n,this.b),215).nl(this.a)},MWn.Vj=function(n,t,e){BB(S9(n,this.b),215).nl(this.a).Xj()},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateFeatureMapDelegator",1314),wAn(89,1,{},PB,lQ,RY,w4),MWn.Pj=function(n,t,e,i,r){var c;if(null==(c=t.Ch(e))&&t.Dh(e,c=iWn(this,n)),!r)switch(this.e){case 50:case 41:return BB(c,589).sj();case 40:return BB(c,215).kl()}return c},MWn.Qj=function(n,t,e,i,r){var c;return null==(c=t.Ch(e))&&t.Dh(e,c=iWn(this,n)),BB(c,69).lk(i,r)},MWn.Rj=function(n,t,e,i,r){var c;return null!=(c=t.Ch(e))&&(r=BB(c,69).mk(i,r)),r},MWn.Sj=function(n,t,e){var i;return null!=(i=t.Ch(e))&&BB(i,76).fj()},MWn.Tj=function(n,t,e,i){var r;!(r=BB(t.Ch(e),76))&&t.Dh(e,r=iWn(this,n)),r.Wb(i)},MWn.Uj=function(n,t,e){var i;return null==(i=t.Ch(e))&&t.Dh(e,i=iWn(this,n)),cL(i,76)?BB(i,76):new Ep(BB(t.Ch(e),15))},MWn.Vj=function(n,t,e){var i;!(i=BB(t.Ch(e),76))&&t.Dh(e,i=iWn(this,n)),i.Xj()},MWn.b=0,MWn.e=0,vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateMany",89),wAn(504,1,{}),MWn.Qj=function(n,t,e,i,r){throw Hp(new pv)},MWn.Rj=function(n,t,e,i,r){throw Hp(new pv)},MWn.Uj=function(n,t,e){return new bQ(this,n,t,e)},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingle",504),wAn(1331,1,k9n,bQ),MWn.Wj=function(n){return this.a.Pj(this.c,this.d,this.b,n,!0)},MWn.fj=function(){return this.a.Sj(this.c,this.d,this.b)},MWn.Wb=function(n){this.a.Tj(this.c,this.d,this.b,n)},MWn.Xj=function(){this.a.Vj(this.c,this.d,this.b)},MWn.b=0,vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingle/1",1331),wAn(769,504,{},mJ),MWn.Pj=function(n,t,e,i,r){return gKn(n,n.eh(),n.Vg())==this.b?this.sk()&&i?cAn(n):n.eh():null},MWn.Qj=function(n,t,e,i,r){var c,a;return n.eh()&&(r=(c=n.Vg())>=0?n.Qg(r):n.eh().ih(n,-1-c,null,r)),a=Awn(n.Tg(),this.e),n.Sg(i,a,r)},MWn.Rj=function(n,t,e,i,r){var c;return c=Awn(n.Tg(),this.e),n.Sg(null,c,r)},MWn.Sj=function(n,t,e){var i;return i=Awn(n.Tg(),this.e),!!n.eh()&&n.Vg()==i},MWn.Tj=function(n,t,e,i){var r,c,a,u,o;if(null!=i&&!SFn(this.a,i))throw Hp(new Ky(U9n+(cL(i,56)?dEn(BB(i,56).Tg()):utn(tsn(i)))+X9n+this.a+"'"));if(r=n.eh(),a=Awn(n.Tg(),this.e),GI(i)!==GI(r)||n.Vg()!=a&&null!=i){if(vkn(n,BB(i,56)))throw Hp(new _y(w6n+n.Ib()));o=null,r&&(o=(c=n.Vg())>=0?n.Qg(o):n.eh().ih(n,-1-c,null,o)),(u=BB(i,49))&&(o=u.gh(n,Awn(u.Tg(),this.b),null,o)),(o=n.Sg(u,a,o))&&o.Fi()}else n.Lg()&&n.Mg()&&ban(n,new nU(n,1,a,i,i))},MWn.Vj=function(n,t,e){var i,r,c;n.eh()?(c=(i=n.Vg())>=0?n.Qg(null):n.eh().ih(n,-1-i,null,null),r=Awn(n.Tg(),this.e),(c=n.Sg(null,r,c))&&c.Fi()):n.Lg()&&n.Mg()&&ban(n,new tU(n,1,this.e,null,null))},MWn.sk=function(){return!1},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleContainer",769),wAn(1315,769,{},CB),MWn.sk=function(){return!0},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleContainerResolving",1315),wAn(563,504,{}),MWn.Pj=function(n,t,e,i,r){var c;return null==(c=t.Ch(e))?this.b:GI(c)===GI(R$t)?null:c},MWn.Sj=function(n,t,e){var i;return null!=(i=t.Ch(e))&&(GI(i)===GI(R$t)||!Nfn(i,this.b))},MWn.Tj=function(n,t,e,i){var r,c;n.Lg()&&n.Mg()?(r=null==(c=t.Ch(e))?this.b:GI(c)===GI(R$t)?null:c,null==i?null!=this.c?(t.Dh(e,null),i=this.b):null!=this.b?t.Dh(e,R$t):t.Dh(e,null):(this.Sk(i),t.Dh(e,i)),ban(n,this.d.Tk(n,1,this.e,r,i))):null==i?null!=this.c?t.Dh(e,null):null!=this.b?t.Dh(e,R$t):t.Dh(e,null):(this.Sk(i),t.Dh(e,i))},MWn.Vj=function(n,t,e){var i,r;n.Lg()&&n.Mg()?(i=null==(r=t.Ch(e))?this.b:GI(r)===GI(R$t)?null:r,t.Eh(e),ban(n,this.d.Tk(n,1,this.e,i,this.b))):t.Eh(e)},MWn.Sk=function(n){throw Hp(new bv)},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleData",563),wAn(W9n,1,{},$o),MWn.Tk=function(n,t,e,i,r){return new tU(n,t,e,i,r)},MWn.Uk=function(n,t,e,i,r,c){return new GQ(n,t,e,i,r,c)},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator",W9n),wAn(1332,W9n,{},Lo),MWn.Tk=function(n,t,e,i,r){return new n6(n,t,e,qy(TD(i)),qy(TD(r)))},MWn.Uk=function(n,t,e,i,r,c){return new L0(n,t,e,qy(TD(i)),qy(TD(r)),c)},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/1",1332),wAn(1333,W9n,{},No),MWn.Tk=function(n,t,e,i,r){return new Hen(n,t,e,BB(i,217).a,BB(r,217).a)},MWn.Uk=function(n,t,e,i,r,c){return new S0(n,t,e,BB(i,217).a,BB(r,217).a,c)},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/2",1333),wAn(1334,W9n,{},xo),MWn.Tk=function(n,t,e,i,r){return new qen(n,t,e,BB(i,172).a,BB(r,172).a)},MWn.Uk=function(n,t,e,i,r,c){return new P0(n,t,e,BB(i,172).a,BB(r,172).a,c)},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/3",1334),wAn(1335,W9n,{},Do),MWn.Tk=function(n,t,e,i,r){return new J5(n,t,e,Gy(MD(i)),Gy(MD(r)))},MWn.Uk=function(n,t,e,i,r,c){return new C0(n,t,e,Gy(MD(i)),Gy(MD(r)),c)},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/4",1335),wAn(1336,W9n,{},Ro),MWn.Tk=function(n,t,e,i,r){return new Uen(n,t,e,BB(i,155).a,BB(r,155).a)},MWn.Uk=function(n,t,e,i,r,c){return new I0(n,t,e,BB(i,155).a,BB(r,155).a,c)},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/5",1336),wAn(1337,W9n,{},Ko),MWn.Tk=function(n,t,e,i,r){return new Z5(n,t,e,BB(i,19).a,BB(r,19).a)},MWn.Uk=function(n,t,e,i,r,c){return new O0(n,t,e,BB(i,19).a,BB(r,19).a,c)},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/6",1337),wAn(1338,W9n,{},_o),MWn.Tk=function(n,t,e,i,r){return new Gen(n,t,e,BB(i,162).a,BB(r,162).a)},MWn.Uk=function(n,t,e,i,r,c){return new A0(n,t,e,BB(i,162).a,BB(r,162).a,c)},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/7",1338),wAn(1339,W9n,{},Fo),MWn.Tk=function(n,t,e,i,r){return new zen(n,t,e,BB(i,184).a,BB(r,184).a)},MWn.Uk=function(n,t,e,i,r,c){return new $0(n,t,e,BB(i,184).a,BB(r,184).a,c)},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/8",1339),wAn(1317,563,{},wQ),MWn.Sk=function(n){if(!this.a.wj(n))throw Hp(new Ky(U9n+tsn(n)+X9n+this.a+"'"))},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleDataDynamic",1317),wAn(1318,563,{},ZG),MWn.Sk=function(n){},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleDataStatic",1318),wAn(770,563,{}),MWn.Sj=function(n,t,e){return null!=t.Ch(e)},MWn.Tj=function(n,t,e,i){var r,c;n.Lg()&&n.Mg()?(r=!0,null==(c=t.Ch(e))?(r=!1,c=this.b):GI(c)===GI(R$t)&&(c=null),null==i?null!=this.c?(t.Dh(e,null),i=this.b):t.Dh(e,R$t):(this.Sk(i),t.Dh(e,i)),ban(n,this.d.Uk(n,1,this.e,c,i,!r))):null==i?null!=this.c?t.Dh(e,null):t.Dh(e,R$t):(this.Sk(i),t.Dh(e,i))},MWn.Vj=function(n,t,e){var i,r;n.Lg()&&n.Mg()?(i=!0,null==(r=t.Ch(e))?(i=!1,r=this.b):GI(r)===GI(R$t)&&(r=null),t.Eh(e),ban(n,this.d.Uk(n,2,this.e,r,this.b,i))):t.Eh(e)},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleDataUnsettable",770),wAn(1319,770,{},dQ),MWn.Sk=function(n){if(!this.a.wj(n))throw Hp(new Ky(U9n+tsn(n)+X9n+this.a+"'"))},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleDataUnsettableDynamic",1319),wAn(1320,770,{},nz),MWn.Sk=function(n){},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleDataUnsettableStatic",1320),wAn(398,504,{},cG),MWn.Pj=function(n,t,e,i,r){var c,a,u,o,s;if(s=t.Ch(e),this.Kj()&&GI(s)===GI(R$t))return null;if(this.sk()&&i&&null!=s){if((u=BB(s,49)).kh()&&u!=(o=tfn(n,u))){if(!SFn(this.a,o))throw Hp(new Ky(U9n+tsn(o)+X9n+this.a+"'"));t.Dh(e,s=o),this.rk()&&(c=BB(o,49),a=u.ih(n,this.b?Awn(u.Tg(),this.b):-1-Awn(n.Tg(),this.e),null,null),!c.eh()&&(a=c.gh(n,this.b?Awn(c.Tg(),this.b):-1-Awn(n.Tg(),this.e),null,a)),a&&a.Fi()),n.Lg()&&n.Mg()&&ban(n,new tU(n,9,this.e,u,o))}return s}return s},MWn.Qj=function(n,t,e,i,r){var c,a;return GI(a=t.Ch(e))===GI(R$t)&&(a=null),t.Dh(e,i),this.bj()?GI(a)!==GI(i)&&null!=a&&(r=(c=BB(a,49)).ih(n,Awn(c.Tg(),this.b),null,r)):this.rk()&&null!=a&&(r=BB(a,49).ih(n,-1-Awn(n.Tg(),this.e),null,r)),n.Lg()&&n.Mg()&&(!r&&(r=new Fj(4)),r.Ei(new tU(n,1,this.e,a,i))),r},MWn.Rj=function(n,t,e,i,r){var c;return GI(c=t.Ch(e))===GI(R$t)&&(c=null),t.Eh(e),n.Lg()&&n.Mg()&&(!r&&(r=new Fj(4)),this.Kj()?r.Ei(new tU(n,2,this.e,c,null)):r.Ei(new tU(n,1,this.e,c,null))),r},MWn.Sj=function(n,t,e){return null!=t.Ch(e)},MWn.Tj=function(n,t,e,i){var r,c,a,u,o;if(null!=i&&!SFn(this.a,i))throw Hp(new Ky(U9n+(cL(i,56)?dEn(BB(i,56).Tg()):utn(tsn(i)))+X9n+this.a+"'"));u=null!=(o=t.Ch(e)),this.Kj()&&GI(o)===GI(R$t)&&(o=null),a=null,this.bj()?GI(o)!==GI(i)&&(null!=o&&(a=(r=BB(o,49)).ih(n,Awn(r.Tg(),this.b),null,a)),null!=i&&(a=(r=BB(i,49)).gh(n,Awn(r.Tg(),this.b),null,a))):this.rk()&&GI(o)!==GI(i)&&(null!=o&&(a=BB(o,49).ih(n,-1-Awn(n.Tg(),this.e),null,a)),null!=i&&(a=BB(i,49).gh(n,-1-Awn(n.Tg(),this.e),null,a))),null==i&&this.Kj()?t.Dh(e,R$t):t.Dh(e,i),n.Lg()&&n.Mg()?(c=new GQ(n,1,this.e,o,i,this.Kj()&&!u),a?(a.Ei(c),a.Fi()):ban(n,c)):a&&a.Fi()},MWn.Vj=function(n,t,e){var i,r,c,a,u;a=null!=(u=t.Ch(e)),this.Kj()&&GI(u)===GI(R$t)&&(u=null),c=null,null!=u&&(this.bj()?c=(i=BB(u,49)).ih(n,Awn(i.Tg(),this.b),null,c):this.rk()&&(c=BB(u,49).ih(n,-1-Awn(n.Tg(),this.e),null,c))),t.Eh(e),n.Lg()&&n.Mg()?(r=new GQ(n,this.Kj()?2:1,this.e,u,null,a),c?(c.Ei(r),c.Fi()):ban(n,r)):c&&c.Fi()},MWn.bj=function(){return!1},MWn.rk=function(){return!1},MWn.sk=function(){return!1},MWn.Kj=function(){return!1},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObject",398),wAn(564,398,{},Zx),MWn.rk=function(){return!0},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainment",564),wAn(1323,564,{},nD),MWn.sk=function(){return!0},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentResolving",1323),wAn(772,564,{},tD),MWn.Kj=function(){return!0},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentUnsettable",772),wAn(1325,772,{},eD),MWn.sk=function(){return!0},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentUnsettableResolving",1325),wAn(640,564,{},IB),MWn.bj=function(){return!0},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentWithInverse",640),wAn(1324,640,{},$B),MWn.sk=function(){return!0},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentWithInverseResolving",1324),wAn(773,640,{},LB),MWn.Kj=function(){return!0},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentWithInverseUnsettable",773),wAn(1326,773,{},NB),MWn.sk=function(){return!0},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentWithInverseUnsettableResolving",1326),wAn(641,398,{},iD),MWn.sk=function(){return!0},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectResolving",641),wAn(1327,641,{},rD),MWn.Kj=function(){return!0},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectResolvingUnsettable",1327),wAn(774,641,{},OB),MWn.bj=function(){return!0},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectResolvingWithInverse",774),wAn(1328,774,{},xB),MWn.Kj=function(){return!0},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectResolvingWithInverseUnsettable",1328),wAn(1321,398,{},cD),MWn.Kj=function(){return!0},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectUnsettable",1321),wAn(771,398,{},AB),MWn.bj=function(){return!0},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectWithInverse",771),wAn(1322,771,{},DB),MWn.Kj=function(){return!0},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectWithInverseUnsettable",1322),wAn(775,565,z9n,aW),MWn.Pk=function(n){return new aW(this.a,this.c,n)},MWn.dd=function(){return this.b},MWn.Qk=function(n,t,e){return D8(this,n,this.b,e)},MWn.Rk=function(n,t,e){return R8(this,n,this.b,e)},vX(l6n,"EStructuralFeatureImpl/InverseUpdatingFeatureMapEntry",775),wAn(1329,1,k9n,Ep),MWn.Wj=function(n){return this.a},MWn.fj=function(){return cL(this.a,95)?BB(this.a,95).fj():!this.a.dc()},MWn.Wb=function(n){this.a.$b(),this.a.Gc(BB(n,15))},MWn.Xj=function(){cL(this.a,95)?BB(this.a,95).Xj():this.a.$b()},vX(l6n,"EStructuralFeatureImpl/SettingMany",1329),wAn(1330,565,z9n,g4),MWn.Ok=function(n){return new cR((Uqn(),FLt),this.b.Ih(this.a,n))},MWn.dd=function(){return null},MWn.Qk=function(n,t,e){return e},MWn.Rk=function(n,t,e){return e},vX(l6n,"EStructuralFeatureImpl/SimpleContentFeatureMapEntry",1330),wAn(642,565,z9n,cR),MWn.Ok=function(n){return new cR(this.c,n)},MWn.dd=function(){return this.a},MWn.Qk=function(n,t,e){return e},MWn.Rk=function(n,t,e){return e},vX(l6n,"EStructuralFeatureImpl/SimpleFeatureMapEntry",642),wAn(391,497,h8n,Bo),MWn.ri=function(n){return x8(qAt,HWn,26,n,0,1)},MWn.ni=function(){return!1},vX(l6n,"ESuperAdapter/1",391),wAn(444,438,{105:1,92:1,90:1,147:1,191:1,56:1,108:1,836:1,49:1,97:1,150:1,444:1,114:1,115:1},Ho),MWn._g=function(n,t,e){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),this.Ab;case 1:return this.zb;case 2:return!this.a&&(this.a=new aG(this,VAt,this)),this.a}return U9(this,n-bX((gWn(),T$t)),itn(BB(yan(this,16),26)||T$t,n),t,e)},MWn.jh=function(n,t,e){switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),_pn(this.Ab,n,e);case 2:return!this.a&&(this.a=new aG(this,VAt,this)),_pn(this.a,n,e)}return BB(itn(BB(yan(this,16),26)||(gWn(),T$t),t),66).Nj().Rj(this,fgn(this),t-bX((gWn(),T$t)),n,e)},MWn.lh=function(n){switch(n){case 0:return!!this.Ab&&0!=this.Ab.i;case 1:return null!=this.zb;case 2:return!!this.a&&0!=this.a.i}return O3(this,n-bX((gWn(),T$t)),itn(BB(yan(this,16),26)||T$t,n))},MWn.sh=function(n,t){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),sqn(this.Ab),!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void pX(this.Ab,BB(t,14));case 1:return void Nrn(this,SD(t));case 2:return!this.a&&(this.a=new aG(this,VAt,this)),sqn(this.a),!this.a&&(this.a=new aG(this,VAt,this)),void pX(this.a,BB(t,14))}Lbn(this,n-bX((gWn(),T$t)),itn(BB(yan(this,16),26)||T$t,n),t)},MWn.zh=function(){return gWn(),T$t},MWn.Bh=function(n){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void sqn(this.Ab);case 1:return void Nrn(this,null);case 2:return!this.a&&(this.a=new aG(this,VAt,this)),void sqn(this.a)}qfn(this,n-bX((gWn(),T$t)),itn(BB(yan(this,16),26)||T$t,n))},vX(l6n,"ETypeParameterImpl",444),wAn(445,85,R9n,aG),MWn.cj=function(n,t){return LTn(this,BB(n,87),t)},MWn.dj=function(n,t){return NTn(this,BB(n,87),t)},vX(l6n,"ETypeParameterImpl/1",445),wAn(634,43,tYn,xm),MWn.ec=function(){return new Tp(this)},vX(l6n,"ETypeParameterImpl/2",634),wAn(556,nVn,tVn,Tp),MWn.Fc=function(n){return YR(this,BB(n,87))},MWn.Gc=function(n){var t,e,i;for(i=!1,e=n.Kc();e.Ob();)t=BB(e.Pb(),87),null==VW(this.a,t,"")&&(i=!0);return i},MWn.$b=function(){$U(this.a)},MWn.Hc=function(n){return hU(this.a,n)},MWn.Kc=function(){return new Mp(new usn(new Pb(this.a).a))},MWn.Mc=function(n){return _6(this,n)},MWn.gc=function(){return NT(this.a)},vX(l6n,"ETypeParameterImpl/2/1",556),wAn(557,1,QWn,Mp),MWn.Nb=function(n){fU(this,n)},MWn.Pb=function(){return BB(ten(this.a).cd(),87)},MWn.Ob=function(){return this.a.b},MWn.Qb=function(){o9(this.a)},vX(l6n,"ETypeParameterImpl/2/1/1",557),wAn(1276,43,tYn,Dm),MWn._b=function(n){return XI(n)?eY(this,n):!!AY(this.f,n)},MWn.xc=function(n){var t;return cL(t=XI(n)?SJ(this,n):qI(AY(this.f,n)),837)?(t=BB(t,837)._j(),VW(this,BB(n,235),t),t):null!=t?t:null==n?(JM(),rLt):null},vX(l6n,"EValidatorRegistryImpl",1276),wAn(1313,704,{105:1,92:1,90:1,471:1,147:1,56:1,108:1,1941:1,49:1,97:1,150:1,114:1,115:1},qo),MWn.Ih=function(n,t){switch(n.yj()){case 21:case 22:case 23:case 24:case 26:case 31:case 32:case 37:case 38:case 39:case 40:case 43:case 44:case 48:case 49:case 20:return null==t?null:Bbn(t);case 25:return Xtn(t);case 27:return X9(t);case 28:return W9(t);case 29:return null==t?null:H$(IOt[0],BB(t,199));case 41:return null==t?"":nE(BB(t,290));case 42:return Bbn(t);case 50:return SD(t);default:throw Hp(new _y(d6n+n.ne()+g6n))}},MWn.Jh=function(n){var t;switch(-1==n.G&&(n.G=(t=Utn(n))?uvn(t.Mh(),n):-1),n.G){case 0:return new Om;case 1:return new jo;case 2:return new _f;case 4:return new Ev;case 5:return new Am;case 6:return new jv;case 7:return new Rf;case 10:return new yo;case 11:return new $m;case 12:return new vY;case 13:return new Lm;case 14:return new pD;case 17:return new Ao;case 18:return new Kp;case 19:return new Ho;default:throw Hp(new _y(m6n+n.zb+g6n))}},MWn.Kh=function(n,t){switch(n.yj()){case 20:return null==t?null:new wE(t);case 21:return null==t?null:new $A(t);case 23:case 22:return null==t?null:Zdn(t);case 26:case 24:return null==t?null:Pnn(l_n(t,-128,127)<<24>>24);case 25:return d$n(t);case 27:return Syn(t);case 28:return Pyn(t);case 29:return gMn(t);case 32:case 31:return null==t?null:bSn(t);case 38:case 37:return null==t?null:new Dv(t);case 40:case 39:return null==t?null:iln(l_n(t,_Vn,DWn));case 41:case 42:return null;case 44:case 43:return null==t?null:jgn(rUn(t));case 49:case 48:return null==t?null:rln(l_n(t,Q9n,32767)<<16>>16);case 50:return t;default:throw Hp(new _y(d6n+n.ne()+g6n))}},vX(l6n,"EcoreFactoryImpl",1313),wAn(547,179,{105:1,92:1,90:1,147:1,191:1,56:1,235:1,108:1,1939:1,49:1,97:1,150:1,179:1,547:1,114:1,115:1,675:1},UW),MWn.gb=!1,MWn.hb=!1;var V$t,Q$t=!1;vX(l6n,"EcorePackageImpl",547),wAn(1184,1,{837:1},Go),MWn._j=function(){return sN(),cLt},vX(l6n,"EcorePackageImpl/1",1184),wAn(1193,1,s7n,zo),MWn.wj=function(n){return cL(n,147)},MWn.xj=function(n){return x8(BOt,HWn,147,n,0,1)},vX(l6n,"EcorePackageImpl/10",1193),wAn(1194,1,s7n,Uo),MWn.wj=function(n){return cL(n,191)},MWn.xj=function(n){return x8(qOt,HWn,191,n,0,1)},vX(l6n,"EcorePackageImpl/11",1194),wAn(1195,1,s7n,Xo),MWn.wj=function(n){return cL(n,56)},MWn.xj=function(n){return x8(LOt,HWn,56,n,0,1)},vX(l6n,"EcorePackageImpl/12",1195),wAn(1196,1,s7n,Wo),MWn.wj=function(n){return cL(n,399)},MWn.xj=function(n){return x8(QAt,x9n,59,n,0,1)},vX(l6n,"EcorePackageImpl/13",1196),wAn(1197,1,s7n,Vo),MWn.wj=function(n){return cL(n,235)},MWn.xj=function(n){return x8(GOt,HWn,235,n,0,1)},vX(l6n,"EcorePackageImpl/14",1197),wAn(1198,1,s7n,Qo),MWn.wj=function(n){return cL(n,509)},MWn.xj=function(n){return x8(YAt,HWn,2017,n,0,1)},vX(l6n,"EcorePackageImpl/15",1198),wAn(1199,1,s7n,Yo),MWn.wj=function(n){return cL(n,99)},MWn.xj=function(n){return x8(JAt,N9n,18,n,0,1)},vX(l6n,"EcorePackageImpl/16",1199),wAn(1200,1,s7n,Jo),MWn.wj=function(n){return cL(n,170)},MWn.xj=function(n){return x8(FAt,N9n,170,n,0,1)},vX(l6n,"EcorePackageImpl/17",1200),wAn(1201,1,s7n,Zo),MWn.wj=function(n){return cL(n,472)},MWn.xj=function(n){return x8(_At,HWn,472,n,0,1)},vX(l6n,"EcorePackageImpl/18",1201),wAn(1202,1,s7n,ns),MWn.wj=function(n){return cL(n,548)},MWn.xj=function(n){return x8(X$t,a9n,548,n,0,1)},vX(l6n,"EcorePackageImpl/19",1202),wAn(1185,1,s7n,ts),MWn.wj=function(n){return cL(n,322)},MWn.xj=function(n){return x8(BAt,N9n,34,n,0,1)},vX(l6n,"EcorePackageImpl/2",1185),wAn(1203,1,s7n,es),MWn.wj=function(n){return cL(n,241)},MWn.xj=function(n){return x8(VAt,B9n,87,n,0,1)},vX(l6n,"EcorePackageImpl/20",1203),wAn(1204,1,s7n,is),MWn.wj=function(n){return cL(n,444)},MWn.xj=function(n){return x8(O$t,HWn,836,n,0,1)},vX(l6n,"EcorePackageImpl/21",1204),wAn(1205,1,s7n,rs),MWn.wj=function(n){return zI(n)},MWn.xj=function(n){return x8(ktt,sVn,476,n,8,1)},vX(l6n,"EcorePackageImpl/22",1205),wAn(1206,1,s7n,cs),MWn.wj=function(n){return cL(n,190)},MWn.xj=function(n){return x8(NNt,sVn,190,n,0,2)},vX(l6n,"EcorePackageImpl/23",1206),wAn(1207,1,s7n,as),MWn.wj=function(n){return cL(n,217)},MWn.xj=function(n){return x8(Ttt,sVn,217,n,0,1)},vX(l6n,"EcorePackageImpl/24",1207),wAn(1208,1,s7n,us),MWn.wj=function(n){return cL(n,172)},MWn.xj=function(n){return x8(Stt,sVn,172,n,0,1)},vX(l6n,"EcorePackageImpl/25",1208),wAn(1209,1,s7n,os),MWn.wj=function(n){return cL(n,199)},MWn.xj=function(n){return x8(mtt,sVn,199,n,0,1)},vX(l6n,"EcorePackageImpl/26",1209),wAn(1210,1,s7n,ss),MWn.wj=function(n){return!1},MWn.xj=function(n){return x8(_Nt,HWn,2110,n,0,1)},vX(l6n,"EcorePackageImpl/27",1210),wAn(1211,1,s7n,hs),MWn.wj=function(n){return UI(n)},MWn.xj=function(n){return x8(Ptt,sVn,333,n,7,1)},vX(l6n,"EcorePackageImpl/28",1211),wAn(1212,1,s7n,fs),MWn.wj=function(n){return cL(n,58)},MWn.xj=function(n){return x8(uAt,nZn,58,n,0,1)},vX(l6n,"EcorePackageImpl/29",1212),wAn(1186,1,s7n,ls),MWn.wj=function(n){return cL(n,510)},MWn.xj=function(n){return x8(KAt,{3:1,4:1,5:1,1934:1},590,n,0,1)},vX(l6n,"EcorePackageImpl/3",1186),wAn(1213,1,s7n,bs),MWn.wj=function(n){return cL(n,573)},MWn.xj=function(n){return x8(yAt,HWn,1940,n,0,1)},vX(l6n,"EcorePackageImpl/30",1213),wAn(1214,1,s7n,ws),MWn.wj=function(n){return cL(n,153)},MWn.xj=function(n){return x8(oLt,nZn,153,n,0,1)},vX(l6n,"EcorePackageImpl/31",1214),wAn(1215,1,s7n,ds),MWn.wj=function(n){return cL(n,72)},MWn.xj=function(n){return x8($$t,h7n,72,n,0,1)},vX(l6n,"EcorePackageImpl/32",1215),wAn(1216,1,s7n,gs),MWn.wj=function(n){return cL(n,155)},MWn.xj=function(n){return x8(Ctt,sVn,155,n,0,1)},vX(l6n,"EcorePackageImpl/33",1216),wAn(1217,1,s7n,ps),MWn.wj=function(n){return cL(n,19)},MWn.xj=function(n){return x8(Att,sVn,19,n,0,1)},vX(l6n,"EcorePackageImpl/34",1217),wAn(1218,1,s7n,vs),MWn.wj=function(n){return cL(n,290)},MWn.xj=function(n){return x8($nt,HWn,290,n,0,1)},vX(l6n,"EcorePackageImpl/35",1218),wAn(1219,1,s7n,ms),MWn.wj=function(n){return cL(n,162)},MWn.xj=function(n){return x8(Rtt,sVn,162,n,0,1)},vX(l6n,"EcorePackageImpl/36",1219),wAn(1220,1,s7n,ys),MWn.wj=function(n){return cL(n,83)},MWn.xj=function(n){return x8(Nnt,HWn,83,n,0,1)},vX(l6n,"EcorePackageImpl/37",1220),wAn(1221,1,s7n,ks),MWn.wj=function(n){return cL(n,591)},MWn.xj=function(n){return x8(iLt,HWn,591,n,0,1)},vX(l6n,"EcorePackageImpl/38",1221),wAn(1222,1,s7n,js),MWn.wj=function(n){return!1},MWn.xj=function(n){return x8(FNt,HWn,2111,n,0,1)},vX(l6n,"EcorePackageImpl/39",1222),wAn(1187,1,s7n,Es),MWn.wj=function(n){return cL(n,88)},MWn.xj=function(n){return x8(qAt,HWn,26,n,0,1)},vX(l6n,"EcorePackageImpl/4",1187),wAn(1223,1,s7n,Ts),MWn.wj=function(n){return cL(n,184)},MWn.xj=function(n){return x8(_tt,sVn,184,n,0,1)},vX(l6n,"EcorePackageImpl/40",1223),wAn(1224,1,s7n,Ms),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(l6n,"EcorePackageImpl/41",1224),wAn(1225,1,s7n,Ss),MWn.wj=function(n){return cL(n,588)},MWn.xj=function(n){return x8(sAt,HWn,588,n,0,1)},vX(l6n,"EcorePackageImpl/42",1225),wAn(1226,1,s7n,Ps),MWn.wj=function(n){return!1},MWn.xj=function(n){return x8(BNt,sVn,2112,n,0,1)},vX(l6n,"EcorePackageImpl/43",1226),wAn(1227,1,s7n,Cs),MWn.wj=function(n){return cL(n,42)},MWn.xj=function(n){return x8(Hnt,kVn,42,n,0,1)},vX(l6n,"EcorePackageImpl/44",1227),wAn(1188,1,s7n,Is),MWn.wj=function(n){return cL(n,138)},MWn.xj=function(n){return x8(HAt,HWn,138,n,0,1)},vX(l6n,"EcorePackageImpl/5",1188),wAn(1189,1,s7n,Os),MWn.wj=function(n){return cL(n,148)},MWn.xj=function(n){return x8(GAt,HWn,148,n,0,1)},vX(l6n,"EcorePackageImpl/6",1189),wAn(1190,1,s7n,As),MWn.wj=function(n){return cL(n,457)},MWn.xj=function(n){return x8(XAt,HWn,671,n,0,1)},vX(l6n,"EcorePackageImpl/7",1190),wAn(1191,1,s7n,$s),MWn.wj=function(n){return cL(n,573)},MWn.xj=function(n){return x8(WAt,HWn,678,n,0,1)},vX(l6n,"EcorePackageImpl/8",1191),wAn(1192,1,s7n,Ls),MWn.wj=function(n){return cL(n,471)},MWn.xj=function(n){return x8(HOt,HWn,471,n,0,1)},vX(l6n,"EcorePackageImpl/9",1192),wAn(1025,1982,r9n,xy),MWn.bi=function(n,t){Afn(this,BB(t,415))},MWn.fi=function(n,t){eCn(this,n,BB(t,415))},vX(l6n,"MinimalEObjectImpl/1ArrayDelegatingAdapterList",1025),wAn(1026,143,t9n,uW),MWn.Ai=function(){return this.a.a},vX(l6n,"MinimalEObjectImpl/1ArrayDelegatingAdapterList/1",1026),wAn(1053,1052,{},o$),vX("org.eclipse.emf.ecore.plugin","EcorePlugin",1053);var Y$t,J$t,Z$t,nLt,tLt,eLt,iLt=bq(f7n,"Resource");wAn(781,1378,l7n),MWn.Yk=function(n){},MWn.Zk=function(n){},MWn.Vk=function(){return!this.a&&(this.a=new Sp(this)),this.a},MWn.Wk=function(n){var t,e,i,r,c;if((i=n.length)>0){if(b1(0,n.length),47==n.charCodeAt(0)){for(c=new J6(4),r=1,t=1;t<i;++t)b1(t,n.length),47==n.charCodeAt(t)&&(WB(c,r==t?"":n.substr(r,t-r)),r=t+1);return WB(c,n.substr(r)),ojn(this,c)}b1(i-1,n.length),63==n.charCodeAt(i-1)&&(e=MK(n,YTn(63),i-2))>0&&(n=n.substr(0,e))}return jIn(this,n)},MWn.Xk=function(){return this.c},MWn.Ib=function(){return nE(this.gm)+"@"+(nsn(this)>>>0).toString(16)+" uri='"+this.d+"'"},MWn.b=!1,vX(b7n,"ResourceImpl",781),wAn(1379,781,l7n,Cp),vX(b7n,"BinaryResourceImpl",1379),wAn(1169,694,f8n),MWn.si=function(n){return cL(n,56)?TY(this,BB(n,56)):cL(n,591)?new AL(BB(n,591).Vk()):GI(n)===GI(this.f)?BB(n,14).Kc():(dD(),pAt.a)},MWn.Ob=function(){return bOn(this)},MWn.a=!1,vX(y9n,"EcoreUtil/ContentTreeIterator",1169),wAn(1380,1169,f8n,rU),MWn.si=function(n){return GI(n)===GI(this.f)?BB(n,15).Kc():new F2(BB(n,56))},vX(b7n,"ResourceImpl/5",1380),wAn(648,1994,D9n,Sp),MWn.Hc=function(n){return this.i<=4?Sjn(this,n):cL(n,49)&&BB(n,49).Zg()==this.a},MWn.bi=function(n,t){n==this.i-1&&(this.a.b||(this.a.b=!0))},MWn.di=function(n,t){0==n?this.a.b||(this.a.b=!0):L8(this,n,t)},MWn.fi=function(n,t){},MWn.gi=function(n,t,e){},MWn.aj=function(){return 2},MWn.Ai=function(){return this.a},MWn.bj=function(){return!0},MWn.cj=function(n,t){return t=BB(n,49).wh(this.a,t)},MWn.dj=function(n,t){return BB(n,49).wh(null,t)},MWn.ej=function(){return!1},MWn.hi=function(){return!0},MWn.ri=function(n){return x8(LOt,HWn,56,n,0,1)},MWn.ni=function(){return!1},vX(b7n,"ResourceImpl/ContentsEList",648),wAn(957,1964,LVn,Pp),MWn.Zc=function(n){return this.a._h(n)},MWn.gc=function(){return this.a.gc()},vX(y9n,"AbstractSequentialInternalEList/1",957),wAn(624,1,{},SH),vX(y9n,"BasicExtendedMetaData",624),wAn(1160,1,{},$I),MWn.$k=function(){return null},MWn._k=function(){return-2==this.a&&ob(this,aMn(this.d,this.b)),this.a},MWn.al=function(){return null},MWn.bl=function(){return SQ(),SQ(),set},MWn.ne=function(){return this.c==C7n&&hb(this,Egn(this.d,this.b)),this.c},MWn.cl=function(){return 0},MWn.a=-2,MWn.c=C7n,vX(y9n,"BasicExtendedMetaData/EClassExtendedMetaDataImpl",1160),wAn(1161,1,{},_0),MWn.$k=function(){return this.a==(R5(),tLt)&&sb(this,vNn(this.f,this.b)),this.a},MWn._k=function(){return 0},MWn.al=function(){return this.c==(R5(),tLt)&&fb(this,mNn(this.f,this.b)),this.c},MWn.bl=function(){return!this.d&&lb(this,SKn(this.f,this.b)),this.d},MWn.ne=function(){return this.e==C7n&&bb(this,Egn(this.f,this.b)),this.e},MWn.cl=function(){return-2==this.g&&wb(this,YEn(this.f,this.b)),this.g},MWn.e=C7n,MWn.g=-2,vX(y9n,"BasicExtendedMetaData/EDataTypeExtendedMetaDataImpl",1161),wAn(1159,1,{},RI),MWn.b=!1,MWn.c=!1,vX(y9n,"BasicExtendedMetaData/EPackageExtendedMetaDataImpl",1159),wAn(1162,1,{},K0),MWn.c=-2,MWn.e=C7n,MWn.f=C7n,vX(y9n,"BasicExtendedMetaData/EStructuralFeatureExtendedMetaDataImpl",1162),wAn(585,622,R9n,MH),MWn.aj=function(){return this.c},MWn.Fk=function(){return!1},MWn.li=function(n,t){return t},MWn.c=0,vX(y9n,"EDataTypeEList",585);var rLt,cLt,aLt,uLt,oLt=bq(y9n,"FeatureMap");wAn(75,585,{3:1,4:1,20:1,28:1,52:1,14:1,15:1,54:1,67:1,63:1,58:1,76:1,153:1,215:1,1937:1,69:1,95:1},Ecn),MWn.Vc=function(n,t){lNn(this,n,BB(t,72))},MWn.Fc=function(n){return uLn(this,BB(n,72))},MWn.Yh=function(n){dX(this,BB(n,72))},MWn.cj=function(n,t){return HK(this,BB(n,72),t)},MWn.dj=function(n,t){return qK(this,BB(n,72),t)},MWn.ii=function(n,t){return a_n(this,n,t)},MWn.li=function(n,t){return hGn(this,n,BB(t,72))},MWn._c=function(n,t){return Pxn(this,n,BB(t,72))},MWn.jj=function(n,t){return GK(this,BB(n,72),t)},MWn.kj=function(n,t){return zK(this,BB(n,72),t)},MWn.lj=function(n,t,e){return gEn(this,BB(n,72),BB(t,72),e)},MWn.oi=function(n,t){return sTn(this,n,BB(t,72))},MWn.dl=function(n,t){return xKn(this,n,t)},MWn.Wc=function(n,t){var e,i,r,c,a,u,o,s,h;for(s=new gtn(t.gc()),r=t.Kc();r.Ob();)if(c=(i=BB(r.Pb(),72)).ak(),$xn(this.e,c))(!c.hi()||!G3(this,c,i.dd())&&!Sjn(s,i))&&f9(s,i);else{for(h=axn(this.e.Tg(),c),e=BB(this.g,119),a=!0,u=0;u<this.i;++u)if(o=e[u],h.rl(o.ak())){BB(ovn(this,u,i),72),a=!1;break}a&&f9(s,i)}return oon(this,n,s)},MWn.Gc=function(n){var t,e,i,r,c,a,u,o,s;for(o=new gtn(n.gc()),i=n.Kc();i.Ob();)if(r=(e=BB(i.Pb(),72)).ak(),$xn(this.e,r))(!r.hi()||!G3(this,r,e.dd())&&!Sjn(o,e))&&f9(o,e);else{for(s=axn(this.e.Tg(),r),t=BB(this.g,119),c=!0,a=0;a<this.i;++a)if(u=t[a],s.rl(u.ak())){BB(ovn(this,a,e),72),c=!1;break}c&&f9(o,e)}return pX(this,o)},MWn.Wh=function(n){return this.j=-1,LFn(this,this.i,n)},MWn.el=function(n,t,e){return PRn(this,n,t,e)},MWn.mk=function(n,t){return TKn(this,n,t)},MWn.fl=function(n,t,e){return ZBn(this,n,t,e)},MWn.gl=function(){return this},MWn.hl=function(n,t){return rHn(this,n,t)},MWn.il=function(n){return BB(Wtn(this,n),72).ak()},MWn.jl=function(n){return BB(Wtn(this,n),72).dd()},MWn.kl=function(){return this.b},MWn.bj=function(){return!0},MWn.ij=function(){return!0},MWn.ll=function(n){return!adn(this,n)},MWn.ri=function(n){return x8(W$t,h7n,332,n,0,1)},MWn.Gk=function(n){return hD(this,n)},MWn.Wb=function(n){tX(this,n)},MWn.ml=function(n,t){MHn(this,n,t)},MWn.nl=function(n){return zin(this,n)},MWn.ol=function(n){Kmn(this,n)},vX(y9n,"BasicFeatureMap",75),wAn(1851,1,cVn),MWn.Nb=function(n){fU(this,n)},MWn.Rb=function(n){if(-1==this.g)throw Hp(new dv);mz(this);try{Axn(this.e,this.b,this.a,n),this.d=this.e.j,cvn(this)}catch(t){throw cL(t=lun(t),73)?Hp(new vv):Hp(t)}},MWn.Ob=function(){return Ksn(this)},MWn.Sb=function(){return _sn(this)},MWn.Pb=function(){return cvn(this)},MWn.Tb=function(){return this.a},MWn.Ub=function(){var n;if(_sn(this))return mz(this),this.g=--this.a,this.Lk()&&(n=FIn(this.e,this.b,this.c,this.a,this.j),this.j=n),this.i=0,this.j;throw Hp(new yv)},MWn.Vb=function(){return this.a-1},MWn.Qb=function(){if(-1==this.g)throw Hp(new dv);mz(this);try{aPn(this.e,this.b,this.g),this.d=this.e.j,this.g<this.a&&(--this.a,--this.c),--this.g}catch(n){throw cL(n=lun(n),73)?Hp(new vv):Hp(n)}},MWn.Lk=function(){return!1},MWn.Wb=function(n){if(-1==this.g)throw Hp(new dv);mz(this);try{XFn(this.e,this.b,this.g,n),this.d=this.e.j}catch(t){throw cL(t=lun(t),73)?Hp(new vv):Hp(t)}},MWn.a=0,MWn.c=0,MWn.d=0,MWn.f=!1,MWn.g=0,MWn.i=0,vX(y9n,"FeatureMapUtil/BasicFeatureEIterator",1851),wAn(410,1851,cVn,Aan),MWn.pl=function(){var n,t,e;for(e=this.e.i,n=BB(this.e.g,119);this.c<e;){if(t=n[this.c],this.k.rl(t.ak()))return this.j=this.f?t:t.dd(),this.i=2,!0;++this.c}return this.i=1,this.g=-1,!1},MWn.ql=function(){var n,t;for(n=BB(this.e.g,119);--this.c>=0;)if(t=n[this.c],this.k.rl(t.ak()))return this.j=this.f?t:t.dd(),this.i=-2,!0;return this.i=-1,this.g=-1,!1},vX(y9n,"BasicFeatureMap/FeatureEIterator",410),wAn(662,410,cVn,xO),MWn.Lk=function(){return!0},vX(y9n,"BasicFeatureMap/ResolvingFeatureEIterator",662),wAn(955,486,q9n,z$),MWn.Gi=function(){return this},vX(y9n,"EContentsEList/1",955),wAn(956,486,q9n,DO),MWn.Lk=function(){return!1},vX(y9n,"EContentsEList/2",956),wAn(954,279,G9n,U$),MWn.Nk=function(n){},MWn.Ob=function(){return!1},MWn.Sb=function(){return!1},vX(y9n,"EContentsEList/FeatureIteratorImpl/1",954),wAn(825,585,R9n,KL),MWn.ci=function(){this.a=!0},MWn.fj=function(){return this.a},MWn.Xj=function(){var n;sqn(this),mA(this.e)?(n=this.a,this.a=!1,ban(this.e,new t6(this.e,2,this.c,n,!1))):this.a=!1},MWn.a=!1,vX(y9n,"EDataTypeEList/Unsettable",825),wAn(1849,585,R9n,_L),MWn.hi=function(){return!0},vX(y9n,"EDataTypeUniqueEList",1849),wAn(1850,825,R9n,FL),MWn.hi=function(){return!0},vX(y9n,"EDataTypeUniqueEList/Unsettable",1850),wAn(139,85,R9n,NL),MWn.Ek=function(){return!0},MWn.li=function(n,t){return GOn(this,n,BB(t,56))},vX(y9n,"EObjectContainmentEList/Resolving",139),wAn(1163,545,R9n,xL),MWn.Ek=function(){return!0},MWn.li=function(n,t){return GOn(this,n,BB(t,56))},vX(y9n,"EObjectContainmentEList/Unsettable/Resolving",1163),wAn(748,16,R9n,iK),MWn.ci=function(){this.a=!0},MWn.fj=function(){return this.a},MWn.Xj=function(){var n;sqn(this),mA(this.e)?(n=this.a,this.a=!1,ban(this.e,new t6(this.e,2,this.c,n,!1))):this.a=!1},MWn.a=!1,vX(y9n,"EObjectContainmentWithInverseEList/Unsettable",748),wAn(1173,748,R9n,rK),MWn.Ek=function(){return!0},MWn.li=function(n,t){return GOn(this,n,BB(t,56))},vX(y9n,"EObjectContainmentWithInverseEList/Unsettable/Resolving",1173),wAn(743,496,R9n,DL),MWn.ci=function(){this.a=!0},MWn.fj=function(){return this.a},MWn.Xj=function(){var n;sqn(this),mA(this.e)?(n=this.a,this.a=!1,ban(this.e,new t6(this.e,2,this.c,n,!1))):this.a=!1},MWn.a=!1,vX(y9n,"EObjectEList/Unsettable",743),wAn(328,496,R9n,RL),MWn.Ek=function(){return!0},MWn.li=function(n,t){return GOn(this,n,BB(t,56))},vX(y9n,"EObjectResolvingEList",328),wAn(1641,743,R9n,BL),MWn.Ek=function(){return!0},MWn.li=function(n,t){return GOn(this,n,BB(t,56))},vX(y9n,"EObjectResolvingEList/Unsettable",1641),wAn(1381,1,{},Ns),vX(y9n,"EObjectValidator",1381),wAn(546,496,R9n,iU),MWn.zk=function(){return this.d},MWn.Ak=function(){return this.b},MWn.bj=function(){return!0},MWn.Dk=function(){return!0},MWn.b=0,vX(y9n,"EObjectWithInverseEList",546),wAn(1176,546,R9n,cK),MWn.Ck=function(){return!0},vX(y9n,"EObjectWithInverseEList/ManyInverse",1176),wAn(625,546,R9n,aK),MWn.ci=function(){this.a=!0},MWn.fj=function(){return this.a},MWn.Xj=function(){var n;sqn(this),mA(this.e)?(n=this.a,this.a=!1,ban(this.e,new t6(this.e,2,this.c,n,!1))):this.a=!1},MWn.a=!1,vX(y9n,"EObjectWithInverseEList/Unsettable",625),wAn(1175,625,R9n,oK),MWn.Ck=function(){return!0},vX(y9n,"EObjectWithInverseEList/Unsettable/ManyInverse",1175),wAn(749,546,R9n,uK),MWn.Ek=function(){return!0},MWn.li=function(n,t){return GOn(this,n,BB(t,56))},vX(y9n,"EObjectWithInverseResolvingEList",749),wAn(31,749,R9n,hK),MWn.Ck=function(){return!0},vX(y9n,"EObjectWithInverseResolvingEList/ManyInverse",31),wAn(750,625,R9n,sK),MWn.Ek=function(){return!0},MWn.li=function(n,t){return GOn(this,n,BB(t,56))},vX(y9n,"EObjectWithInverseResolvingEList/Unsettable",750),wAn(1174,750,R9n,fK),MWn.Ck=function(){return!0},vX(y9n,"EObjectWithInverseResolvingEList/Unsettable/ManyInverse",1174),wAn(1164,622,R9n),MWn.ai=function(){return 0==(1792&this.b)},MWn.ci=function(){this.b|=1},MWn.Bk=function(){return 0!=(4&this.b)},MWn.bj=function(){return 0!=(40&this.b)},MWn.Ck=function(){return 0!=(16&this.b)},MWn.Dk=function(){return 0!=(8&this.b)},MWn.Ek=function(){return 0!=(this.b&M9n)},MWn.rk=function(){return 0!=(32&this.b)},MWn.Fk=function(){return 0!=(this.b&k6n)},MWn.wj=function(n){return this.d?x3(this.d,n):this.ak().Yj().wj(n)},MWn.fj=function(){return 0!=(2&this.b)?0!=(1&this.b):0!=this.i},MWn.hi=function(){return 0!=(128&this.b)},MWn.Xj=function(){var n;sqn(this),0!=(2&this.b)&&(mA(this.e)?(n=0!=(1&this.b),this.b&=-2,Lv(this,new t6(this.e,2,Awn(this.e.Tg(),this.ak()),n,!1))):this.b&=-2)},MWn.ni=function(){return 0==(1536&this.b)},MWn.b=0,vX(y9n,"EcoreEList/Generic",1164),wAn(1165,1164,R9n,zQ),MWn.ak=function(){return this.a},vX(y9n,"EcoreEList/Dynamic",1165),wAn(747,63,h8n,Ip),MWn.ri=function(n){return Den(this.a.a,n)},vX(y9n,"EcoreEMap/1",747),wAn(746,85,R9n,Zz),MWn.bi=function(n,t){Ivn(this.b,BB(t,133))},MWn.di=function(n,t){aan(this.b)},MWn.ei=function(n,t,e){var i;++(i=this.b,BB(t,133),i).e},MWn.fi=function(n,t){Oln(this.b,BB(t,133))},MWn.gi=function(n,t,e){Oln(this.b,BB(e,133)),GI(e)===GI(t)&&BB(e,133).Th(c$(BB(t,133).cd())),Ivn(this.b,BB(t,133))},vX(y9n,"EcoreEMap/DelegateEObjectContainmentEList",746),wAn(1171,151,j9n,yin),vX(y9n,"EcoreEMap/Unsettable",1171),wAn(1172,746,R9n,lK),MWn.ci=function(){this.a=!0},MWn.fj=function(){return this.a},MWn.Xj=function(){var n;sqn(this),mA(this.e)?(n=this.a,this.a=!1,ban(this.e,new t6(this.e,2,this.c,n,!1))):this.a=!1},MWn.a=!1,vX(y9n,"EcoreEMap/Unsettable/UnsettableDelegateEObjectContainmentEList",1172),wAn(1168,228,tYn,lX),MWn.a=!1,MWn.b=!1,vX(y9n,"EcoreUtil/Copier",1168),wAn(745,1,QWn,F2),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return udn(this)},MWn.Pb=function(){var n;return udn(this),n=this.b,this.b=null,n},MWn.Qb=function(){this.a.Qb()},vX(y9n,"EcoreUtil/ProperContentIterator",745),wAn(1382,1381,{},Ff),vX(y9n,"EcoreValidator",1382),bq(y9n,"FeatureMapUtil/Validator"),wAn(1260,1,{1942:1},xs),MWn.rl=function(n){return!0},vX(y9n,"FeatureMapUtil/1",1260),wAn(757,1,{1942:1},cUn),MWn.rl=function(n){var t;return this.c==n||(null==(t=TD(RX(this.a,n)))?xRn(this,n)?(r6(this.a,n,(hN(),vtt)),!0):(r6(this.a,n,(hN(),ptt)),!1):t==(hN(),vtt))},MWn.e=!1,vX(y9n,"FeatureMapUtil/BasicValidator",757),wAn(758,43,tYn,X$),vX(y9n,"FeatureMapUtil/BasicValidator/Cache",758),wAn(501,52,{20:1,28:1,52:1,14:1,15:1,58:1,76:1,69:1,95:1},xI),MWn.Vc=function(n,t){Axn(this.c,this.b,n,t)},MWn.Fc=function(n){return xKn(this.c,this.b,n)},MWn.Wc=function(n,t){return jHn(this.c,this.b,n,t)},MWn.Gc=function(n){return Z$(this,n)},MWn.Xh=function(n,t){htn(this.c,this.b,n,t)},MWn.lk=function(n,t){return PRn(this.c,this.b,n,t)},MWn.pi=function(n){return iHn(this.c,this.b,n,!1)},MWn.Zh=function(){return jA(this.c,this.b)},MWn.$h=function(){return EA(this.c,this.b)},MWn._h=function(n){return $8(this.c,this.b,n)},MWn.mk=function(n,t){return tR(this,n,t)},MWn.$b=function(){Nv(this)},MWn.Hc=function(n){return G3(this.c,this.b,n)},MWn.Ic=function(n){return Mcn(this.c,this.b,n)},MWn.Xb=function(n){return iHn(this.c,this.b,n,!0)},MWn.Wj=function(n){return this},MWn.Xc=function(n){return z3(this.c,this.b,n)},MWn.dc=function(){return HI(this)},MWn.fj=function(){return!adn(this.c,this.b)},MWn.Kc=function(){return cnn(this.c,this.b)},MWn.Yc=function(){return ann(this.c,this.b)},MWn.Zc=function(n){return lln(this.c,this.b,n)},MWn.ii=function(n,t){return mFn(this.c,this.b,n,t)},MWn.ji=function(n,t){Q6(this.c,this.b,n,t)},MWn.$c=function(n){return aPn(this.c,this.b,n)},MWn.Mc=function(n){return CKn(this.c,this.b,n)},MWn._c=function(n,t){return XFn(this.c,this.b,n,t)},MWn.Wb=function(n){AOn(this.c,this.b),Z$(this,BB(n,15))},MWn.gc=function(){return Kln(this.c,this.b)},MWn.Pc=function(){return G1(this.c,this.b)},MWn.Qc=function(n){return U3(this.c,this.b,n)},MWn.Ib=function(){var n,t;for((t=new Sk).a+="[",n=jA(this.c,this.b);Ksn(n);)cO(t,kN(cvn(n))),Ksn(n)&&(t.a+=FWn);return t.a+="]",t.a},MWn.Xj=function(){AOn(this.c,this.b)},vX(y9n,"FeatureMapUtil/FeatureEList",501),wAn(627,36,t9n,b4),MWn.yi=function(n){return eln(this,n)},MWn.Di=function(n){var t,e,i,r;switch(this.d){case 1:case 2:if(GI(n.Ai())===GI(this.c)&&eln(this,null)==n.yi(null))return this.g=n.zi(),1==n.xi()&&(this.d=1),!0;break;case 3:if(3===n.xi()&&GI(n.Ai())===GI(this.c)&&eln(this,null)==n.yi(null))return this.d=5,f9(t=new gtn(2),this.g),f9(t,n.zi()),this.g=t,!0;break;case 5:if(3===n.xi()&&GI(n.Ai())===GI(this.c)&&eln(this,null)==n.yi(null))return BB(this.g,14).Fc(n.zi()),!0;break;case 4:switch(n.xi()){case 3:if(GI(n.Ai())===GI(this.c)&&eln(this,null)==n.yi(null))return this.d=1,this.g=n.zi(),!0;break;case 4:if(GI(n.Ai())===GI(this.c)&&eln(this,null)==n.yi(null))return this.d=6,f9(r=new gtn(2),this.n),f9(r,n.Bi()),this.n=r,i=Pun(Gk(ANt,1),hQn,25,15,[this.o,n.Ci()]),this.g=i,!0}break;case 6:if(4===n.xi()&&GI(n.Ai())===GI(this.c)&&eln(this,null)==n.yi(null))return BB(this.n,14).Fc(n.Bi()),aHn(i=BB(this.g,48),0,e=x8(ANt,hQn,25,i.length+1,15,1),0,i.length),e[i.length]=n.Ci(),this.g=e,!0}return!1},vX(y9n,"FeatureMapUtil/FeatureENotificationImpl",627),wAn(552,501,{20:1,28:1,52:1,14:1,15:1,58:1,76:1,153:1,215:1,1937:1,69:1,95:1},lq),MWn.dl=function(n,t){return xKn(this.c,n,t)},MWn.el=function(n,t,e){return PRn(this.c,n,t,e)},MWn.fl=function(n,t,e){return ZBn(this.c,n,t,e)},MWn.gl=function(){return this},MWn.hl=function(n,t){return rHn(this.c,n,t)},MWn.il=function(n){return BB(iHn(this.c,this.b,n,!1),72).ak()},MWn.jl=function(n){return BB(iHn(this.c,this.b,n,!1),72).dd()},MWn.kl=function(){return this.a},MWn.ll=function(n){return!adn(this.c,n)},MWn.ml=function(n,t){MHn(this.c,n,t)},MWn.nl=function(n){return zin(this.c,n)},MWn.ol=function(n){Kmn(this.c,n)},vX(y9n,"FeatureMapUtil/FeatureFeatureMap",552),wAn(1259,1,k9n,KI),MWn.Wj=function(n){return iHn(this.b,this.a,-1,n)},MWn.fj=function(){return!adn(this.b,this.a)},MWn.Wb=function(n){MHn(this.b,this.a,n)},MWn.Xj=function(){AOn(this.b,this.a)},vX(y9n,"FeatureMapUtil/FeatureValue",1259);var sLt,hLt,fLt,lLt,bLt,wLt=bq(O7n,"AnyType");wAn(666,60,BVn,ik),vX(O7n,"InvalidDatatypeValueException",666);var dLt,gLt,pLt,vLt,mLt,yLt,kLt,jLt,ELt,TLt,MLt,SLt,PLt,CLt,ILt,OLt,ALt,$Lt,LLt,NLt,xLt,DLt,RLt,KLt,_Lt,FLt,BLt,HLt,qLt,GLt,zLt=bq(O7n,A7n),ULt=bq(O7n,$7n),XLt=bq(O7n,L7n);wAn(830,506,{105:1,92:1,90:1,56:1,49:1,97:1,843:1},Rm),MWn._g=function(n,t,e){switch(n){case 0:return e?(!this.c&&(this.c=new Ecn(this,0)),this.c):(!this.c&&(this.c=new Ecn(this,0)),this.c.b);case 1:return e?(!this.c&&(this.c=new Ecn(this,0)),BB(n1(this.c,(Uqn(),vLt)),153)):(!this.c&&(this.c=new Ecn(this,0)),BB(BB(n1(this.c,(Uqn(),vLt)),153),215)).kl();case 2:return e?(!this.b&&(this.b=new Ecn(this,2)),this.b):(!this.b&&(this.b=new Ecn(this,2)),this.b.b)}return U9(this,n-bX(this.zh()),itn(0==(2&this.j)?this.zh():(!this.k&&(this.k=new Kf),this.k).ck(),n),t,e)},MWn.jh=function(n,t,e){switch(t){case 0:return!this.c&&(this.c=new Ecn(this,0)),TKn(this.c,n,e);case 1:return(!this.c&&(this.c=new Ecn(this,0)),BB(BB(n1(this.c,(Uqn(),vLt)),153),69)).mk(n,e);case 2:return!this.b&&(this.b=new Ecn(this,2)),TKn(this.b,n,e)}return BB(itn(0==(2&this.j)?this.zh():(!this.k&&(this.k=new Kf),this.k).ck(),t),66).Nj().Rj(this,Q7(this),t-bX(this.zh()),n,e)},MWn.lh=function(n){switch(n){case 0:return!!this.c&&0!=this.c.i;case 1:return!(!this.c&&(this.c=new Ecn(this,0)),BB(n1(this.c,(Uqn(),vLt)),153)).dc();case 2:return!!this.b&&0!=this.b.i}return O3(this,n-bX(this.zh()),itn(0==(2&this.j)?this.zh():(!this.k&&(this.k=new Kf),this.k).ck(),n))},MWn.sh=function(n,t){switch(n){case 0:return!this.c&&(this.c=new Ecn(this,0)),void tX(this.c,t);case 1:return void(!this.c&&(this.c=new Ecn(this,0)),BB(BB(n1(this.c,(Uqn(),vLt)),153),215)).Wb(t);case 2:return!this.b&&(this.b=new Ecn(this,2)),void tX(this.b,t)}Lbn(this,n-bX(this.zh()),itn(0==(2&this.j)?this.zh():(!this.k&&(this.k=new Kf),this.k).ck(),n),t)},MWn.zh=function(){return Uqn(),pLt},MWn.Bh=function(n){switch(n){case 0:return!this.c&&(this.c=new Ecn(this,0)),void sqn(this.c);case 1:return void(!this.c&&(this.c=new Ecn(this,0)),BB(n1(this.c,(Uqn(),vLt)),153)).$b();case 2:return!this.b&&(this.b=new Ecn(this,2)),void sqn(this.b)}qfn(this,n-bX(this.zh()),itn(0==(2&this.j)?this.zh():(!this.k&&(this.k=new Kf),this.k).ck(),n))},MWn.Ib=function(){var n;return 0!=(4&this.j)?P$n(this):((n=new fN(P$n(this))).a+=" (mixed: ",rO(n,this.c),n.a+=", anyAttribute: ",rO(n,this.b),n.a+=")",n.a)},vX(N7n,"AnyTypeImpl",830),wAn(667,506,{105:1,92:1,90:1,56:1,49:1,97:1,2021:1,667:1},Rs),MWn._g=function(n,t,e){switch(n){case 0:return this.a;case 1:return this.b}return U9(this,n-bX((Uqn(),OLt)),itn(0==(2&this.j)?OLt:(!this.k&&(this.k=new Kf),this.k).ck(),n),t,e)},MWn.lh=function(n){switch(n){case 0:return null!=this.a;case 1:return null!=this.b}return O3(this,n-bX((Uqn(),OLt)),itn(0==(2&this.j)?OLt:(!this.k&&(this.k=new Kf),this.k).ck(),n))},MWn.sh=function(n,t){switch(n){case 0:return void kb(this,SD(t));case 1:return void jb(this,SD(t))}Lbn(this,n-bX((Uqn(),OLt)),itn(0==(2&this.j)?OLt:(!this.k&&(this.k=new Kf),this.k).ck(),n),t)},MWn.zh=function(){return Uqn(),OLt},MWn.Bh=function(n){switch(n){case 0:return void(this.a=null);case 1:return void(this.b=null)}qfn(this,n-bX((Uqn(),OLt)),itn(0==(2&this.j)?OLt:(!this.k&&(this.k=new Kf),this.k).ck(),n))},MWn.Ib=function(){var n;return 0!=(4&this.j)?P$n(this):((n=new fN(P$n(this))).a+=" (data: ",cO(n,this.a),n.a+=", target: ",cO(n,this.b),n.a+=")",n.a)},MWn.a=null,MWn.b=null,vX(N7n,"ProcessingInstructionImpl",667),wAn(668,830,{105:1,92:1,90:1,56:1,49:1,97:1,843:1,2022:1,668:1},_m),MWn._g=function(n,t,e){switch(n){case 0:return e?(!this.c&&(this.c=new Ecn(this,0)),this.c):(!this.c&&(this.c=new Ecn(this,0)),this.c.b);case 1:return e?(!this.c&&(this.c=new Ecn(this,0)),BB(n1(this.c,(Uqn(),vLt)),153)):(!this.c&&(this.c=new Ecn(this,0)),BB(BB(n1(this.c,(Uqn(),vLt)),153),215)).kl();case 2:return e?(!this.b&&(this.b=new Ecn(this,2)),this.b):(!this.b&&(this.b=new Ecn(this,2)),this.b.b);case 3:return!this.c&&(this.c=new Ecn(this,0)),SD(rHn(this.c,(Uqn(),LLt),!0));case 4:return gK(this.a,(!this.c&&(this.c=new Ecn(this,0)),SD(rHn(this.c,(Uqn(),LLt),!0))));case 5:return this.a}return U9(this,n-bX((Uqn(),$Lt)),itn(0==(2&this.j)?$Lt:(!this.k&&(this.k=new Kf),this.k).ck(),n),t,e)},MWn.lh=function(n){switch(n){case 0:return!!this.c&&0!=this.c.i;case 1:return!(!this.c&&(this.c=new Ecn(this,0)),BB(n1(this.c,(Uqn(),vLt)),153)).dc();case 2:return!!this.b&&0!=this.b.i;case 3:return!this.c&&(this.c=new Ecn(this,0)),null!=SD(rHn(this.c,(Uqn(),LLt),!0));case 4:return null!=gK(this.a,(!this.c&&(this.c=new Ecn(this,0)),SD(rHn(this.c,(Uqn(),LLt),!0))));case 5:return!!this.a}return O3(this,n-bX((Uqn(),$Lt)),itn(0==(2&this.j)?$Lt:(!this.k&&(this.k=new Kf),this.k).ck(),n))},MWn.sh=function(n,t){switch(n){case 0:return!this.c&&(this.c=new Ecn(this,0)),void tX(this.c,t);case 1:return void(!this.c&&(this.c=new Ecn(this,0)),BB(BB(n1(this.c,(Uqn(),vLt)),153),215)).Wb(t);case 2:return!this.b&&(this.b=new Ecn(this,2)),void tX(this.b,t);case 3:return void F0(this,SD(t));case 4:return void F0(this,pK(this.a,t));case 5:return void Eb(this,BB(t,148))}Lbn(this,n-bX((Uqn(),$Lt)),itn(0==(2&this.j)?$Lt:(!this.k&&(this.k=new Kf),this.k).ck(),n),t)},MWn.zh=function(){return Uqn(),$Lt},MWn.Bh=function(n){switch(n){case 0:return!this.c&&(this.c=new Ecn(this,0)),void sqn(this.c);case 1:return void(!this.c&&(this.c=new Ecn(this,0)),BB(n1(this.c,(Uqn(),vLt)),153)).$b();case 2:return!this.b&&(this.b=new Ecn(this,2)),void sqn(this.b);case 3:return!this.c&&(this.c=new Ecn(this,0)),void MHn(this.c,(Uqn(),LLt),null);case 4:return void F0(this,pK(this.a,null));case 5:return void(this.a=null)}qfn(this,n-bX((Uqn(),$Lt)),itn(0==(2&this.j)?$Lt:(!this.k&&(this.k=new Kf),this.k).ck(),n))},vX(N7n,"SimpleAnyTypeImpl",668),wAn(669,506,{105:1,92:1,90:1,56:1,49:1,97:1,2023:1,669:1},Km),MWn._g=function(n,t,e){switch(n){case 0:return e?(!this.a&&(this.a=new Ecn(this,0)),this.a):(!this.a&&(this.a=new Ecn(this,0)),this.a.b);case 1:return e?(!this.b&&(this.b=new y9((gWn(),k$t),X$t,this,1)),this.b):(!this.b&&(this.b=new y9((gWn(),k$t),X$t,this,1)),A8(this.b));case 2:return e?(!this.c&&(this.c=new y9((gWn(),k$t),X$t,this,2)),this.c):(!this.c&&(this.c=new y9((gWn(),k$t),X$t,this,2)),A8(this.c));case 3:return!this.a&&(this.a=new Ecn(this,0)),n1(this.a,(Uqn(),DLt));case 4:return!this.a&&(this.a=new Ecn(this,0)),n1(this.a,(Uqn(),RLt));case 5:return!this.a&&(this.a=new Ecn(this,0)),n1(this.a,(Uqn(),_Lt));case 6:return!this.a&&(this.a=new Ecn(this,0)),n1(this.a,(Uqn(),FLt))}return U9(this,n-bX((Uqn(),xLt)),itn(0==(2&this.j)?xLt:(!this.k&&(this.k=new Kf),this.k).ck(),n),t,e)},MWn.jh=function(n,t,e){switch(t){case 0:return!this.a&&(this.a=new Ecn(this,0)),TKn(this.a,n,e);case 1:return!this.b&&(this.b=new y9((gWn(),k$t),X$t,this,1)),BK(this.b,n,e);case 2:return!this.c&&(this.c=new y9((gWn(),k$t),X$t,this,2)),BK(this.c,n,e);case 5:return!this.a&&(this.a=new Ecn(this,0)),tR(n1(this.a,(Uqn(),_Lt)),n,e)}return BB(itn(0==(2&this.j)?(Uqn(),xLt):(!this.k&&(this.k=new Kf),this.k).ck(),t),66).Nj().Rj(this,Q7(this),t-bX((Uqn(),xLt)),n,e)},MWn.lh=function(n){switch(n){case 0:return!!this.a&&0!=this.a.i;case 1:return!!this.b&&0!=this.b.f;case 2:return!!this.c&&0!=this.c.f;case 3:return!this.a&&(this.a=new Ecn(this,0)),!HI(n1(this.a,(Uqn(),DLt)));case 4:return!this.a&&(this.a=new Ecn(this,0)),!HI(n1(this.a,(Uqn(),RLt)));case 5:return!this.a&&(this.a=new Ecn(this,0)),!HI(n1(this.a,(Uqn(),_Lt)));case 6:return!this.a&&(this.a=new Ecn(this,0)),!HI(n1(this.a,(Uqn(),FLt)))}return O3(this,n-bX((Uqn(),xLt)),itn(0==(2&this.j)?xLt:(!this.k&&(this.k=new Kf),this.k).ck(),n))},MWn.sh=function(n,t){switch(n){case 0:return!this.a&&(this.a=new Ecn(this,0)),void tX(this.a,t);case 1:return!this.b&&(this.b=new y9((gWn(),k$t),X$t,this,1)),void tan(this.b,t);case 2:return!this.c&&(this.c=new y9((gWn(),k$t),X$t,this,2)),void tan(this.c,t);case 3:return!this.a&&(this.a=new Ecn(this,0)),Nv(n1(this.a,(Uqn(),DLt))),!this.a&&(this.a=new Ecn(this,0)),void Z$(n1(this.a,DLt),BB(t,14));case 4:return!this.a&&(this.a=new Ecn(this,0)),Nv(n1(this.a,(Uqn(),RLt))),!this.a&&(this.a=new Ecn(this,0)),void Z$(n1(this.a,RLt),BB(t,14));case 5:return!this.a&&(this.a=new Ecn(this,0)),Nv(n1(this.a,(Uqn(),_Lt))),!this.a&&(this.a=new Ecn(this,0)),void Z$(n1(this.a,_Lt),BB(t,14));case 6:return!this.a&&(this.a=new Ecn(this,0)),Nv(n1(this.a,(Uqn(),FLt))),!this.a&&(this.a=new Ecn(this,0)),void Z$(n1(this.a,FLt),BB(t,14))}Lbn(this,n-bX((Uqn(),xLt)),itn(0==(2&this.j)?xLt:(!this.k&&(this.k=new Kf),this.k).ck(),n),t)},MWn.zh=function(){return Uqn(),xLt},MWn.Bh=function(n){switch(n){case 0:return!this.a&&(this.a=new Ecn(this,0)),void sqn(this.a);case 1:return!this.b&&(this.b=new y9((gWn(),k$t),X$t,this,1)),void this.b.c.$b();case 2:return!this.c&&(this.c=new y9((gWn(),k$t),X$t,this,2)),void this.c.c.$b();case 3:return!this.a&&(this.a=new Ecn(this,0)),void Nv(n1(this.a,(Uqn(),DLt)));case 4:return!this.a&&(this.a=new Ecn(this,0)),void Nv(n1(this.a,(Uqn(),RLt)));case 5:return!this.a&&(this.a=new Ecn(this,0)),void Nv(n1(this.a,(Uqn(),_Lt)));case 6:return!this.a&&(this.a=new Ecn(this,0)),void Nv(n1(this.a,(Uqn(),FLt)))}qfn(this,n-bX((Uqn(),xLt)),itn(0==(2&this.j)?xLt:(!this.k&&(this.k=new Kf),this.k).ck(),n))},MWn.Ib=function(){var n;return 0!=(4&this.j)?P$n(this):((n=new fN(P$n(this))).a+=" (mixed: ",rO(n,this.a),n.a+=")",n.a)},vX(N7n,"XMLTypeDocumentRootImpl",669),wAn(1919,704,{105:1,92:1,90:1,471:1,147:1,56:1,108:1,49:1,97:1,150:1,114:1,115:1,2024:1},Ds),MWn.Ih=function(n,t){switch(n.yj()){case 7:case 8:case 9:case 10:case 16:case 22:case 23:case 24:case 25:case 26:case 32:case 33:case 34:case 36:case 37:case 44:case 45:case 50:case 51:case 53:case 55:case 56:case 57:case 58:case 60:case 61:case 4:return null==t?null:Bbn(t);case 19:case 28:case 29:case 35:case 38:case 39:case 41:case 46:case 52:case 54:case 5:return SD(t);case 6:return mD(BB(t,190));case 12:case 47:case 49:case 11:return qGn(this,n,t);case 13:return null==t?null:GBn(BB(t,240));case 15:case 14:return null==t?null:RU(Gy(MD(t)));case 17:return EEn((Uqn(),t));case 18:return EEn(t);case 21:case 20:return null==t?null:KU(BB(t,155).a);case 27:return yD(BB(t,190));case 30:return _mn((Uqn(),BB(t,15)));case 31:return _mn(BB(t,15));case 40:return jD((Uqn(),t));case 42:return TEn((Uqn(),t));case 43:return TEn(t);case 59:case 48:return kD((Uqn(),t));default:throw Hp(new _y(d6n+n.ne()+g6n))}},MWn.Jh=function(n){var t;switch(-1==n.G&&(n.G=(t=Utn(n))?uvn(t.Mh(),n):-1),n.G){case 0:return new Rm;case 1:return new Rs;case 2:return new _m;case 3:return new Km;default:throw Hp(new _y(m6n+n.zb+g6n))}},MWn.Kh=function(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p;switch(n.yj()){case 5:case 52:case 4:return t;case 6:return ypn(t);case 8:case 7:return null==t?null:_En(t);case 9:return null==t?null:Pnn(l_n((i=FBn(t,!0)).length>0&&(b1(0,i.length),43==i.charCodeAt(0))?i.substr(1):i,-128,127)<<24>>24);case 10:return null==t?null:Pnn(l_n((r=FBn(t,!0)).length>0&&(b1(0,r.length),43==r.charCodeAt(0))?r.substr(1):r,-128,127)<<24>>24);case 11:return SD(xXn(this,(Uqn(),kLt),t));case 12:return SD(xXn(this,(Uqn(),jLt),t));case 13:return null==t?null:new wE(FBn(t,!0));case 15:case 14:return gLn(t);case 16:return SD(xXn(this,(Uqn(),ELt),t));case 17:return Hdn((Uqn(),t));case 18:return Hdn(t);case 28:case 29:case 35:case 38:case 39:case 41:case 54:case 19:return FBn(t,!0);case 21:case 20:return ILn(t);case 22:return SD(xXn(this,(Uqn(),TLt),t));case 23:return SD(xXn(this,(Uqn(),MLt),t));case 24:return SD(xXn(this,(Uqn(),SLt),t));case 25:return SD(xXn(this,(Uqn(),PLt),t));case 26:return SD(xXn(this,(Uqn(),CLt),t));case 27:return Zgn(t);case 30:return qdn((Uqn(),t));case 31:return qdn(t);case 32:return null==t?null:iln(l_n((h=FBn(t,!0)).length>0&&(b1(0,h.length),43==h.charCodeAt(0))?h.substr(1):h,_Vn,DWn));case 33:return null==t?null:new $A((f=FBn(t,!0)).length>0&&(b1(0,f.length),43==f.charCodeAt(0))?f.substr(1):f);case 34:return null==t?null:iln(l_n((l=FBn(t,!0)).length>0&&(b1(0,l.length),43==l.charCodeAt(0))?l.substr(1):l,_Vn,DWn));case 36:return null==t?null:jgn(rUn((b=FBn(t,!0)).length>0&&(b1(0,b.length),43==b.charCodeAt(0))?b.substr(1):b));case 37:return null==t?null:jgn(rUn((w=FBn(t,!0)).length>0&&(b1(0,w.length),43==w.charCodeAt(0))?w.substr(1):w));case 40:return Vwn((Uqn(),t));case 42:return Gdn((Uqn(),t));case 43:return Gdn(t);case 44:return null==t?null:new $A((d=FBn(t,!0)).length>0&&(b1(0,d.length),43==d.charCodeAt(0))?d.substr(1):d);case 45:return null==t?null:new $A((g=FBn(t,!0)).length>0&&(b1(0,g.length),43==g.charCodeAt(0))?g.substr(1):g);case 46:return FBn(t,!1);case 47:return SD(xXn(this,(Uqn(),ILt),t));case 59:case 48:return Wwn((Uqn(),t));case 49:return SD(xXn(this,(Uqn(),ALt),t));case 50:return null==t?null:rln(l_n((p=FBn(t,!0)).length>0&&(b1(0,p.length),43==p.charCodeAt(0))?p.substr(1):p,Q9n,32767)<<16>>16);case 51:return null==t?null:rln(l_n((c=FBn(t,!0)).length>0&&(b1(0,c.length),43==c.charCodeAt(0))?c.substr(1):c,Q9n,32767)<<16>>16);case 53:return SD(xXn(this,(Uqn(),NLt),t));case 55:return null==t?null:rln(l_n((a=FBn(t,!0)).length>0&&(b1(0,a.length),43==a.charCodeAt(0))?a.substr(1):a,Q9n,32767)<<16>>16);case 56:return null==t?null:rln(l_n((u=FBn(t,!0)).length>0&&(b1(0,u.length),43==u.charCodeAt(0))?u.substr(1):u,Q9n,32767)<<16>>16);case 57:return null==t?null:jgn(rUn((o=FBn(t,!0)).length>0&&(b1(0,o.length),43==o.charCodeAt(0))?o.substr(1):o));case 58:return null==t?null:jgn(rUn((s=FBn(t,!0)).length>0&&(b1(0,s.length),43==s.charCodeAt(0))?s.substr(1):s));case 60:return null==t?null:iln(l_n((e=FBn(t,!0)).length>0&&(b1(0,e.length),43==e.charCodeAt(0))?e.substr(1):e,_Vn,DWn));case 61:return null==t?null:iln(l_n(FBn(t,!0),_Vn,DWn));default:throw Hp(new _y(d6n+n.ne()+g6n))}},vX(N7n,"XMLTypeFactoryImpl",1919),wAn(586,179,{105:1,92:1,90:1,147:1,191:1,56:1,235:1,108:1,49:1,97:1,150:1,179:1,114:1,115:1,675:1,1945:1,586:1},zW),MWn.N=!1,MWn.O=!1;var WLt,VLt,QLt,YLt,JLt,ZLt=!1;vX(N7n,"XMLTypePackageImpl",586),wAn(1852,1,{837:1},Ks),MWn._j=function(){return fFn(),TNt},vX(N7n,"XMLTypePackageImpl/1",1852),wAn(1861,1,s7n,_s),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/10",1861),wAn(1862,1,s7n,Fs),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/11",1862),wAn(1863,1,s7n,Bs),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/12",1863),wAn(1864,1,s7n,Hs),MWn.wj=function(n){return UI(n)},MWn.xj=function(n){return x8(Ptt,sVn,333,n,7,1)},vX(N7n,"XMLTypePackageImpl/13",1864),wAn(1865,1,s7n,qs),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/14",1865),wAn(1866,1,s7n,Gs),MWn.wj=function(n){return cL(n,15)},MWn.xj=function(n){return x8(Rnt,nZn,15,n,0,1)},vX(N7n,"XMLTypePackageImpl/15",1866),wAn(1867,1,s7n,zs),MWn.wj=function(n){return cL(n,15)},MWn.xj=function(n){return x8(Rnt,nZn,15,n,0,1)},vX(N7n,"XMLTypePackageImpl/16",1867),wAn(1868,1,s7n,Us),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/17",1868),wAn(1869,1,s7n,Xs),MWn.wj=function(n){return cL(n,155)},MWn.xj=function(n){return x8(Ctt,sVn,155,n,0,1)},vX(N7n,"XMLTypePackageImpl/18",1869),wAn(1870,1,s7n,Ws),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/19",1870),wAn(1853,1,s7n,Vs),MWn.wj=function(n){return cL(n,843)},MWn.xj=function(n){return x8(wLt,HWn,843,n,0,1)},vX(N7n,"XMLTypePackageImpl/2",1853),wAn(1871,1,s7n,Qs),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/20",1871),wAn(1872,1,s7n,Ys),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/21",1872),wAn(1873,1,s7n,Js),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/22",1873),wAn(1874,1,s7n,Zs),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/23",1874),wAn(1875,1,s7n,nh),MWn.wj=function(n){return cL(n,190)},MWn.xj=function(n){return x8(NNt,sVn,190,n,0,2)},vX(N7n,"XMLTypePackageImpl/24",1875),wAn(1876,1,s7n,th),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/25",1876),wAn(1877,1,s7n,eh),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/26",1877),wAn(1878,1,s7n,ih),MWn.wj=function(n){return cL(n,15)},MWn.xj=function(n){return x8(Rnt,nZn,15,n,0,1)},vX(N7n,"XMLTypePackageImpl/27",1878),wAn(1879,1,s7n,rh),MWn.wj=function(n){return cL(n,15)},MWn.xj=function(n){return x8(Rnt,nZn,15,n,0,1)},vX(N7n,"XMLTypePackageImpl/28",1879),wAn(1880,1,s7n,ch),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/29",1880),wAn(1854,1,s7n,ah),MWn.wj=function(n){return cL(n,667)},MWn.xj=function(n){return x8(zLt,HWn,2021,n,0,1)},vX(N7n,"XMLTypePackageImpl/3",1854),wAn(1881,1,s7n,uh),MWn.wj=function(n){return cL(n,19)},MWn.xj=function(n){return x8(Att,sVn,19,n,0,1)},vX(N7n,"XMLTypePackageImpl/30",1881),wAn(1882,1,s7n,oh),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/31",1882),wAn(1883,1,s7n,sh),MWn.wj=function(n){return cL(n,162)},MWn.xj=function(n){return x8(Rtt,sVn,162,n,0,1)},vX(N7n,"XMLTypePackageImpl/32",1883),wAn(1884,1,s7n,hh),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/33",1884),wAn(1885,1,s7n,fh),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/34",1885),wAn(1886,1,s7n,lh),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/35",1886),wAn(1887,1,s7n,bh),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/36",1887),wAn(1888,1,s7n,wh),MWn.wj=function(n){return cL(n,15)},MWn.xj=function(n){return x8(Rnt,nZn,15,n,0,1)},vX(N7n,"XMLTypePackageImpl/37",1888),wAn(1889,1,s7n,dh),MWn.wj=function(n){return cL(n,15)},MWn.xj=function(n){return x8(Rnt,nZn,15,n,0,1)},vX(N7n,"XMLTypePackageImpl/38",1889),wAn(1890,1,s7n,gh),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/39",1890),wAn(1855,1,s7n,ph),MWn.wj=function(n){return cL(n,668)},MWn.xj=function(n){return x8(ULt,HWn,2022,n,0,1)},vX(N7n,"XMLTypePackageImpl/4",1855),wAn(1891,1,s7n,vh),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/40",1891),wAn(1892,1,s7n,mh),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/41",1892),wAn(1893,1,s7n,yh),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/42",1893),wAn(1894,1,s7n,kh),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/43",1894),wAn(1895,1,s7n,jh),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/44",1895),wAn(1896,1,s7n,Eh),MWn.wj=function(n){return cL(n,184)},MWn.xj=function(n){return x8(_tt,sVn,184,n,0,1)},vX(N7n,"XMLTypePackageImpl/45",1896),wAn(1897,1,s7n,Th),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/46",1897),wAn(1898,1,s7n,Mh),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/47",1898),wAn(1899,1,s7n,Sh),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/48",1899),wAn(sQn,1,s7n,Ph),MWn.wj=function(n){return cL(n,184)},MWn.xj=function(n){return x8(_tt,sVn,184,n,0,1)},vX(N7n,"XMLTypePackageImpl/49",sQn),wAn(1856,1,s7n,Ch),MWn.wj=function(n){return cL(n,669)},MWn.xj=function(n){return x8(XLt,HWn,2023,n,0,1)},vX(N7n,"XMLTypePackageImpl/5",1856),wAn(1901,1,s7n,Ih),MWn.wj=function(n){return cL(n,162)},MWn.xj=function(n){return x8(Rtt,sVn,162,n,0,1)},vX(N7n,"XMLTypePackageImpl/50",1901),wAn(1902,1,s7n,Oh),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/51",1902),wAn(1903,1,s7n,Ah),MWn.wj=function(n){return cL(n,19)},MWn.xj=function(n){return x8(Att,sVn,19,n,0,1)},vX(N7n,"XMLTypePackageImpl/52",1903),wAn(1857,1,s7n,$h),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/6",1857),wAn(1858,1,s7n,Lh),MWn.wj=function(n){return cL(n,190)},MWn.xj=function(n){return x8(NNt,sVn,190,n,0,2)},vX(N7n,"XMLTypePackageImpl/7",1858),wAn(1859,1,s7n,Nh),MWn.wj=function(n){return zI(n)},MWn.xj=function(n){return x8(ktt,sVn,476,n,8,1)},vX(N7n,"XMLTypePackageImpl/8",1859),wAn(1860,1,s7n,xh),MWn.wj=function(n){return cL(n,217)},MWn.xj=function(n){return x8(Ttt,sVn,217,n,0,1)},vX(N7n,"XMLTypePackageImpl/9",1860),wAn(50,60,BVn,ak),vX(ant,"RegEx/ParseException",50),wAn(820,1,{},Dh),MWn.sl=function(n){return n<this.j&&63==fV(this.i,n)},MWn.tl=function(){var n,t,e,i,r;if(10!=this.c)throw Hp(new ak(kWn((u$(),g8n))));switch(n=this.a){case 101:n=27;break;case 102:n=12;break;case 110:n=10;break;case 114:n=13;break;case 116:n=9;break;case 120:if(QXn(this),0!=this.c)throw Hp(new ak(kWn((u$(),B8n))));if(123==this.a){for(r=0,e=0;;){if(QXn(this),0!=this.c)throw Hp(new ak(kWn((u$(),B8n))));if((r=Gvn(this.a))<0)break;if(e>16*e)throw Hp(new ak(kWn((u$(),H8n))));e=16*e+r}if(125!=this.a)throw Hp(new ak(kWn((u$(),q8n))));if(e>unt)throw Hp(new ak(kWn((u$(),G8n))));n=e}else{if(r=0,0!=this.c||(r=Gvn(this.a))<0)throw Hp(new ak(kWn((u$(),B8n))));if(e=r,QXn(this),0!=this.c||(r=Gvn(this.a))<0)throw Hp(new ak(kWn((u$(),B8n))));n=e=16*e+r}break;case 117:if(i=0,QXn(this),0!=this.c||(i=Gvn(this.a))<0)throw Hp(new ak(kWn((u$(),B8n))));if(t=i,QXn(this),0!=this.c||(i=Gvn(this.a))<0)throw Hp(new ak(kWn((u$(),B8n))));if(t=16*t+i,QXn(this),0!=this.c||(i=Gvn(this.a))<0)throw Hp(new ak(kWn((u$(),B8n))));if(t=16*t+i,QXn(this),0!=this.c||(i=Gvn(this.a))<0)throw Hp(new ak(kWn((u$(),B8n))));n=t=16*t+i;break;case 118:if(QXn(this),0!=this.c||(i=Gvn(this.a))<0)throw Hp(new ak(kWn((u$(),B8n))));if(t=i,QXn(this),0!=this.c||(i=Gvn(this.a))<0)throw Hp(new ak(kWn((u$(),B8n))));if(t=16*t+i,QXn(this),0!=this.c||(i=Gvn(this.a))<0)throw Hp(new ak(kWn((u$(),B8n))));if(t=16*t+i,QXn(this),0!=this.c||(i=Gvn(this.a))<0)throw Hp(new ak(kWn((u$(),B8n))));if(t=16*t+i,QXn(this),0!=this.c||(i=Gvn(this.a))<0)throw Hp(new ak(kWn((u$(),B8n))));if(t=16*t+i,QXn(this),0!=this.c||(i=Gvn(this.a))<0)throw Hp(new ak(kWn((u$(),B8n))));if((t=16*t+i)>unt)throw Hp(new ak(kWn((u$(),"parser.descappe.4"))));n=t;break;case 65:case 90:case 122:throw Hp(new ak(kWn((u$(),z8n))))}return n},MWn.ul=function(n){var t;switch(n){case 100:t=32==(32&this.e)?ZUn("Nd",!0):(wWn(),uNt);break;case 68:t=32==(32&this.e)?ZUn("Nd",!1):(wWn(),lNt);break;case 119:t=32==(32&this.e)?ZUn("IsWord",!0):(wWn(),kNt);break;case 87:t=32==(32&this.e)?ZUn("IsWord",!1):(wWn(),wNt);break;case 115:t=32==(32&this.e)?ZUn("IsSpace",!0):(wWn(),gNt);break;case 83:t=32==(32&this.e)?ZUn("IsSpace",!1):(wWn(),bNt);break;default:throw Hp(new dy(ont+n.toString(16)))}return t},MWn.vl=function(n){var t,e,i,r,c,a,u,o,s,h,f;for(this.b=1,QXn(this),t=null,0==this.c&&94==this.a?(QXn(this),n?(wWn(),wWn(),s=new M0(5)):(wWn(),wWn(),Yxn(t=new M0(4),0,unt),s=new M0(4))):(wWn(),wWn(),s=new M0(4)),r=!0;1!=(f=this.c)&&(0!=f||93!=this.a||r);){if(r=!1,e=this.a,i=!1,10==f)switch(e){case 100:case 68:case 119:case 87:case 115:case 83:sHn(s,this.ul(e)),i=!0;break;case 105:case 73:case 99:case 67:(e=this.Ll(s,e))<0&&(i=!0);break;case 112:case 80:if(!(h=DIn(this,e)))throw Hp(new ak(kWn((u$(),O8n))));sHn(s,h),i=!0;break;default:e=this.tl()}else if(20==f){if((c=lx(this.i,58,this.d))<0)throw Hp(new ak(kWn((u$(),A8n))));if(a=!0,94==fV(this.i,this.d)&&(++this.d,a=!1),!(u=b9(fx(this.i,this.d,c),a,512==(512&this.e))))throw Hp(new ak(kWn((u$(),L8n))));if(sHn(s,u),i=!0,c+1>=this.j||93!=fV(this.i,c+1))throw Hp(new ak(kWn((u$(),A8n))));this.d=c+2}if(QXn(this),!i)if(0!=this.c||45!=this.a)Yxn(s,e,e);else{if(QXn(this),1==(f=this.c))throw Hp(new ak(kWn((u$(),$8n))));0==f&&93==this.a?(Yxn(s,e,e),Yxn(s,45,45)):(o=this.a,10==f&&(o=this.tl()),QXn(this),Yxn(s,e,o))}(this.e&k6n)==k6n&&0==this.c&&44==this.a&&QXn(this)}if(1==this.c)throw Hp(new ak(kWn((u$(),$8n))));return t&&(WGn(t,s),s=t),T$n(s),qHn(s),this.b=0,QXn(this),s},MWn.wl=function(){var n,t,e,i;for(e=this.vl(!1);7!=(i=this.c);){if(n=this.a,(0!=i||45!=n&&38!=n)&&4!=i)throw Hp(new ak(kWn((u$(),_8n))));if(QXn(this),9!=this.c)throw Hp(new ak(kWn((u$(),K8n))));if(t=this.vl(!1),4==i)sHn(e,t);else if(45==n)WGn(e,t);else{if(38!=n)throw Hp(new dy("ASSERT"));kGn(e,t)}}return QXn(this),e},MWn.xl=function(){var n,t;return n=this.a-48,wWn(),wWn(),t=new vJ(12,null,n),!this.g&&(this.g=new _v),Cv(this.g,new Op(n)),QXn(this),t},MWn.yl=function(){return QXn(this),wWn(),pNt},MWn.zl=function(){return QXn(this),wWn(),dNt},MWn.Al=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.Bl=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.Cl=function(){return QXn(this),fsn()},MWn.Dl=function(){return QXn(this),wWn(),mNt},MWn.El=function(){return QXn(this),wWn(),jNt},MWn.Fl=function(){var n;if(this.d>=this.j||64!=(65504&(n=fV(this.i,this.d++))))throw Hp(new ak(kWn((u$(),S8n))));return QXn(this),wWn(),wWn(),new oG(0,n-64)},MWn.Gl=function(){return QXn(this),RFn()},MWn.Hl=function(){return QXn(this),wWn(),ENt},MWn.Il=function(){var n;return wWn(),wWn(),n=new oG(0,105),QXn(this),n},MWn.Jl=function(){return QXn(this),wWn(),yNt},MWn.Kl=function(){return QXn(this),wWn(),vNt},MWn.Ll=function(n,t){return this.tl()},MWn.Ml=function(){return QXn(this),wWn(),hNt},MWn.Nl=function(){var n,t,e,i,r;if(this.d+1>=this.j)throw Hp(new ak(kWn((u$(),E8n))));if(i=-1,t=null,49<=(n=fV(this.i,this.d))&&n<=57){if(i=n-48,!this.g&&(this.g=new _v),Cv(this.g,new Op(i)),++this.d,41!=fV(this.i,this.d))throw Hp(new ak(kWn((u$(),y8n))));++this.d}else switch(63==n&&--this.d,QXn(this),(t=OXn(this)).e){case 20:case 21:case 22:case 23:break;case 8:if(7!=this.c)throw Hp(new ak(kWn((u$(),y8n))));break;default:throw Hp(new ak(kWn((u$(),T8n))))}if(QXn(this),e=null,2==(r=Vdn(this)).e){if(2!=r.em())throw Hp(new ak(kWn((u$(),M8n))));e=r.am(1),r=r.am(0)}if(7!=this.c)throw Hp(new ak(kWn((u$(),y8n))));return QXn(this),wWn(),wWn(),new jnn(i,t,r,e)},MWn.Ol=function(){return QXn(this),wWn(),fNt},MWn.Pl=function(){var n;if(QXn(this),n=uU(24,Vdn(this)),7!=this.c)throw Hp(new ak(kWn((u$(),y8n))));return QXn(this),n},MWn.Ql=function(){var n;if(QXn(this),n=uU(20,Vdn(this)),7!=this.c)throw Hp(new ak(kWn((u$(),y8n))));return QXn(this),n},MWn.Rl=function(){var n;if(QXn(this),n=uU(22,Vdn(this)),7!=this.c)throw Hp(new ak(kWn((u$(),y8n))));return QXn(this),n},MWn.Sl=function(){var n,t,e,i,r;for(n=0,e=0,t=-1;this.d<this.j&&0!=(r=QOn(t=fV(this.i,this.d)));)n|=r,++this.d;if(this.d>=this.j)throw Hp(new ak(kWn((u$(),k8n))));if(45==t){for(++this.d;this.d<this.j&&0!=(r=QOn(t=fV(this.i,this.d)));)e|=r,++this.d;if(this.d>=this.j)throw Hp(new ak(kWn((u$(),k8n))))}if(58==t){if(++this.d,QXn(this),i=AX(Vdn(this),n,e),7!=this.c)throw Hp(new ak(kWn((u$(),y8n))));QXn(this)}else{if(41!=t)throw Hp(new ak(kWn((u$(),j8n))));++this.d,QXn(this),i=AX(Vdn(this),n,e)}return i},MWn.Tl=function(){var n;if(QXn(this),n=uU(21,Vdn(this)),7!=this.c)throw Hp(new ak(kWn((u$(),y8n))));return QXn(this),n},MWn.Ul=function(){var n;if(QXn(this),n=uU(23,Vdn(this)),7!=this.c)throw Hp(new ak(kWn((u$(),y8n))));return QXn(this),n},MWn.Vl=function(){var n,t;if(QXn(this),n=this.f++,t=oU(Vdn(this),n),7!=this.c)throw Hp(new ak(kWn((u$(),y8n))));return QXn(this),t},MWn.Wl=function(){var n;if(QXn(this),n=oU(Vdn(this),0),7!=this.c)throw Hp(new ak(kWn((u$(),y8n))));return QXn(this),n},MWn.Xl=function(n){return QXn(this),5==this.c?(QXn(this),gG(n,(wWn(),wWn(),new h4(9,n)))):gG(n,(wWn(),wWn(),new h4(3,n)))},MWn.Yl=function(n){var t;return QXn(this),wWn(),wWn(),t=new r$(2),5==this.c?(QXn(this),tqn(t,sNt),tqn(t,n)):(tqn(t,n),tqn(t,sNt)),t},MWn.Zl=function(n){return QXn(this),5==this.c?(QXn(this),wWn(),wWn(),new h4(9,n)):(wWn(),wWn(),new h4(3,n))},MWn.a=0,MWn.b=0,MWn.c=0,MWn.d=0,MWn.e=0,MWn.f=1,MWn.g=null,MWn.j=0,vX(ant,"RegEx/RegexParser",820),wAn(1824,820,{},Fm),MWn.sl=function(n){return!1},MWn.tl=function(){return qDn(this)},MWn.ul=function(n){return d_n(n)},MWn.vl=function(n){return ZXn(this)},MWn.wl=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.xl=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.yl=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.zl=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.Al=function(){return QXn(this),d_n(67)},MWn.Bl=function(){return QXn(this),d_n(73)},MWn.Cl=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.Dl=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.El=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.Fl=function(){return QXn(this),d_n(99)},MWn.Gl=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.Hl=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.Il=function(){return QXn(this),d_n(105)},MWn.Jl=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.Kl=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.Ll=function(n,t){return sHn(n,d_n(t)),-1},MWn.Ml=function(){return QXn(this),wWn(),wWn(),new oG(0,94)},MWn.Nl=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.Ol=function(){return QXn(this),wWn(),wWn(),new oG(0,36)},MWn.Pl=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.Ql=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.Rl=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.Sl=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.Tl=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.Ul=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.Vl=function(){var n;if(QXn(this),n=oU(Vdn(this),0),7!=this.c)throw Hp(new ak(kWn((u$(),y8n))));return QXn(this),n},MWn.Wl=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.Xl=function(n){return QXn(this),gG(n,(wWn(),wWn(),new h4(3,n)))},MWn.Yl=function(n){var t;return QXn(this),wWn(),wWn(),tqn(t=new r$(2),n),tqn(t,sNt),t},MWn.Zl=function(n){return QXn(this),wWn(),wWn(),new h4(3,n)};var nNt=null,tNt=null;vX(ant,"RegEx/ParserForXMLSchema",1824),wAn(117,1,ynt,Ap),MWn.$l=function(n){throw Hp(new dy("Not supported."))},MWn._l=function(){return-1},MWn.am=function(n){return null},MWn.bm=function(){return null},MWn.cm=function(n){},MWn.dm=function(n){},MWn.em=function(){return 0},MWn.Ib=function(){return this.fm(0)},MWn.fm=function(n){return 11==this.e?".":""},MWn.e=0;var eNt,iNt,rNt,cNt,aNt,uNt,oNt,sNt,hNt,fNt,lNt,bNt,wNt,dNt,gNt,pNt,vNt,mNt,yNt,kNt,jNt,ENt,TNt,MNt,SNt=null,PNt=null,CNt=null,INt=vX(ant,"RegEx/Token",117);wAn(136,117,{3:1,136:1,117:1},M0),MWn.fm=function(n){var t,e,i;if(4==this.e)if(this==oNt)e=".";else if(this==uNt)e="\\d";else if(this==kNt)e="\\w";else if(this==gNt)e="\\s";else{for((i=new Sk).a+="[",t=0;t<this.b.length;t+=2)0!=(n&k6n)&&t>0&&(i.a+=","),this.b[t]===this.b[t+1]?cO(i,aBn(this.b[t])):(cO(i,aBn(this.b[t])),i.a+="-",cO(i,aBn(this.b[t+1])));i.a+="]",e=i.a}else if(this==lNt)e="\\D";else if(this==wNt)e="\\W";else if(this==bNt)e="\\S";else{for((i=new Sk).a+="[^",t=0;t<this.b.length;t+=2)0!=(n&k6n)&&t>0&&(i.a+=","),this.b[t]===this.b[t+1]?cO(i,aBn(this.b[t])):(cO(i,aBn(this.b[t])),i.a+="-",cO(i,aBn(this.b[t+1])));i.a+="]",e=i.a}return e},MWn.a=!1,MWn.c=!1,vX(ant,"RegEx/RangeToken",136),wAn(584,1,{584:1},Op),MWn.a=0,vX(ant,"RegEx/RegexParser/ReferencePosition",584),wAn(583,1,{3:1,583:1},XE),MWn.Fb=function(n){var t;return null!=n&&!!cL(n,583)&&(t=BB(n,583),mK(this.b,t.b)&&this.a==t.a)},MWn.Hb=function(){return vvn(this.b+"/"+txn(this.a))},MWn.Ib=function(){return this.c.fm(this.a)},MWn.a=0,vX(ant,"RegEx/RegularExpression",583),wAn(223,117,ynt,oG),MWn._l=function(){return this.a},MWn.fm=function(n){var t,e;switch(this.e){case 0:switch(this.a){case 124:case 42:case 43:case 63:case 40:case 41:case 46:case 91:case 123:case 92:e="\\"+PR(this.a&QVn);break;case 12:e="\\f";break;case 10:e="\\n";break;case 13:e="\\r";break;case 9:e="\\t";break;case 27:e="\\e";break;default:e=this.a>=BQn?"\\v"+fx(t="0"+(this.a>>>0).toString(16),t.length-6,t.length):""+PR(this.a&QVn)}break;case 8:e=this==hNt||this==fNt?""+PR(this.a&QVn):"\\"+PR(this.a&QVn);break;default:e=null}return e},MWn.a=0,vX(ant,"RegEx/Token/CharToken",223),wAn(309,117,ynt,h4),MWn.am=function(n){return this.a},MWn.cm=function(n){this.b=n},MWn.dm=function(n){this.c=n},MWn.em=function(){return 1},MWn.fm=function(n){var t;if(3==this.e)if(this.c<0&&this.b<0)t=this.a.fm(n)+"*";else if(this.c==this.b)t=this.a.fm(n)+"{"+this.c+"}";else if(this.c>=0&&this.b>=0)t=this.a.fm(n)+"{"+this.c+","+this.b+"}";else{if(!(this.c>=0&&this.b<0))throw Hp(new dy("Token#toString(): CLOSURE "+this.c+FWn+this.b));t=this.a.fm(n)+"{"+this.c+",}"}else if(this.c<0&&this.b<0)t=this.a.fm(n)+"*?";else if(this.c==this.b)t=this.a.fm(n)+"{"+this.c+"}?";else if(this.c>=0&&this.b>=0)t=this.a.fm(n)+"{"+this.c+","+this.b+"}?";else{if(!(this.c>=0&&this.b<0))throw Hp(new dy("Token#toString(): NONGREEDYCLOSURE "+this.c+FWn+this.b));t=this.a.fm(n)+"{"+this.c+",}?"}return t},MWn.b=0,MWn.c=0,vX(ant,"RegEx/Token/ClosureToken",309),wAn(821,117,ynt,UU),MWn.am=function(n){return 0==n?this.a:this.b},MWn.em=function(){return 2},MWn.fm=function(n){return 3==this.b.e&&this.b.am(0)==this.a?this.a.fm(n)+"+":9==this.b.e&&this.b.am(0)==this.a?this.a.fm(n)+"+?":this.a.fm(n)+""+this.b.fm(n)},vX(ant,"RegEx/Token/ConcatToken",821),wAn(1822,117,ynt,jnn),MWn.am=function(n){if(0==n)return this.d;if(1==n)return this.b;throw Hp(new dy("Internal Error: "+n))},MWn.em=function(){return this.b?2:1},MWn.fm=function(n){var t;return t=this.c>0?"(?("+this.c+")":8==this.a.e?"(?("+this.a+")":"(?"+this.a,this.b?t+=this.d+"|"+this.b+")":t+=this.d+")",t},MWn.c=0,vX(ant,"RegEx/Token/ConditionToken",1822),wAn(1823,117,ynt,T0),MWn.am=function(n){return this.b},MWn.em=function(){return 1},MWn.fm=function(n){return"(?"+(0==this.a?"":txn(this.a))+(0==this.c?"":txn(this.c))+":"+this.b.fm(n)+")"},MWn.a=0,MWn.c=0,vX(ant,"RegEx/Token/ModifierToken",1823),wAn(822,117,ynt,cW),MWn.am=function(n){return this.a},MWn.em=function(){return 1},MWn.fm=function(n){var t;switch(t=null,this.e){case 6:t=0==this.b?"(?:"+this.a.fm(n)+")":"("+this.a.fm(n)+")";break;case 20:t="(?="+this.a.fm(n)+")";break;case 21:t="(?!"+this.a.fm(n)+")";break;case 22:t="(?<="+this.a.fm(n)+")";break;case 23:t="(?<!"+this.a.fm(n)+")";break;case 24:t="(?>"+this.a.fm(n)+")"}return t},MWn.b=0,vX(ant,"RegEx/Token/ParenToken",822),wAn(521,117,{3:1,117:1,521:1},vJ),MWn.bm=function(){return this.b},MWn.fm=function(n){return 12==this.e?"\\"+this.a:iAn(this.b)},MWn.a=0,vX(ant,"RegEx/Token/StringToken",521),wAn(465,117,ynt,r$),MWn.$l=function(n){tqn(this,n)},MWn.am=function(n){return BB(bW(this.a,n),117)},MWn.em=function(){return this.a?this.a.a.c.length:0},MWn.fm=function(n){var t,e,i,r,c;if(1==this.e){if(2==this.a.a.c.length)t=BB(bW(this.a,0),117),r=3==(e=BB(bW(this.a,1),117)).e&&e.am(0)==t?t.fm(n)+"+":9==e.e&&e.am(0)==t?t.fm(n)+"+?":t.fm(n)+""+e.fm(n);else{for(c=new Sk,i=0;i<this.a.a.c.length;i++)cO(c,BB(bW(this.a,i),117).fm(n));r=c.a}return r}if(2==this.a.a.c.length&&7==BB(bW(this.a,1),117).e)r=BB(bW(this.a,0),117).fm(n)+"?";else if(2==this.a.a.c.length&&7==BB(bW(this.a,0),117).e)r=BB(bW(this.a,1),117).fm(n)+"??";else{for(cO(c=new Sk,BB(bW(this.a,0),117).fm(n)),i=1;i<this.a.a.c.length;i++)c.a+="|",cO(c,BB(bW(this.a,i),117).fm(n));r=c.a}return r},vX(ant,"RegEx/Token/UnionToken",465),wAn(518,1,{592:1},UE),MWn.Ib=function(){return this.a.b},vX(knt,"XMLTypeUtil/PatternMatcherImpl",518),wAn(1622,1381,{},Rh),vX(knt,"XMLTypeValidator",1622),wAn(264,1,pVn,hz),MWn.Jc=function(n){e5(this,n)},MWn.Kc=function(){return(this.b-this.a)*this.c<0?MNt:new XL(this)},MWn.a=0,MWn.b=0,MWn.c=0,vX(Ent,"ExclusiveRange",264),wAn(1068,1,cVn,Kh),MWn.Rb=function(n){BB(n,19),l$()},MWn.Nb=function(n){fU(this,n)},MWn.Pb=function(){return GE()},MWn.Ub=function(){return zE()},MWn.Wb=function(n){BB(n,19),w$()},MWn.Ob=function(){return!1},MWn.Sb=function(){return!1},MWn.Tb=function(){return-1},MWn.Vb=function(){return-1},MWn.Qb=function(){throw Hp(new tk(Snt))},vX(Ent,"ExclusiveRange/1",1068),wAn(254,1,cVn,XL),MWn.Rb=function(n){BB(n,19),b$()},MWn.Nb=function(n){fU(this,n)},MWn.Pb=function(){return Fhn(this)},MWn.Ub=function(){return O9(this)},MWn.Wb=function(n){BB(n,19),d$()},MWn.Ob=function(){return this.c.c<0?this.a>=this.c.b:this.a<=this.c.b},MWn.Sb=function(){return this.b>0},MWn.Tb=function(){return this.b},MWn.Vb=function(){return this.b-1},MWn.Qb=function(){throw Hp(new tk(Snt))},MWn.a=0,MWn.b=0,vX(Ent,"ExclusiveRange/RangeIterator",254);var ONt=RW(P9n,"C"),ANt=RW(O9n,"I"),$Nt=RW($Wn,"Z"),LNt=RW(A9n,"J"),NNt=RW(S9n,"B"),xNt=RW(C9n,"D"),DNt=RW(I9n,"F"),RNt=RW($9n,"S"),KNt=bq("org.eclipse.elk.core.labels","ILabelManager"),_Nt=bq(B6n,"DiagnosticChain"),FNt=bq(f7n,"ResourceSet"),BNt=vX(B6n,"InvocationTargetException",null),HNt=(Dk(),f5),qNt=qNt=hEn;Zen(Qp),scn("permProps",[[[Pnt,Cnt],[Int,"gecko1_8"]],[[Pnt,Cnt],[Int,"ie10"]],[[Pnt,Cnt],[Int,"ie8"]],[[Pnt,Cnt],[Int,"ie9"]],[[Pnt,Cnt],[Int,"safari"]]]),qNt(null,"elk",null)}).call(this)}).call(this,void 0!==e.g?e.g:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],3:[function(n,t,e){"use strict";function i(n,t){if(!(n instanceof t))throw new TypeError("Cannot call a class as a function")}function r(n,t){if(!n)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?n:t}function c(n,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);n.prototype=Object.create(t&&t.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(n,t):n.__proto__=t)}var a=function(t){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};i(this,e);var c=Object.assign({},t),a=!1;try{n.resolve("web-worker"),a=!0}catch(s){}if(t.workerUrl)if(a){var u=n("web-worker");c.workerFactory=function(n){return new u(n)}}else console.warn("Web worker requested but 'web-worker' package not installed. \nConsider installing the package or pass your own 'workerFactory' to ELK's constructor.\n... Falling back to non-web worker version.");if(!c.workerFactory){var o=n("./elk-worker.min.js").Worker;c.workerFactory=function(n){return new o(n)}}return r(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,c))}return c(e,t),e}(n("./elk-api.js").default);Object.defineProperty(t.exports,"__esModule",{value:!0}),t.exports=a,a.default=a},{"./elk-api.js":1,"./elk-worker.min.js":2,"web-worker":4}],4:[function(n,t,e){t.exports=Worker},{}]},{},[3])(3)},19487:(n,t,e)=>{"use strict";e.d(t,{diagram:()=>k});var i=e(16432),r=e(59373),c=e(43349),a=e(17295),u=e.n(a);e(27484),e(17967),e(27856),e(70277),e(45625),e(39354),e(91518),e(59542),e(10285),e(28734);const o=new(u()),s={},h={};let f={};const l=(n,t,e)=>{const r={TB:{in:{north:"north"},out:{south:"west",west:"east",east:"south"}},LR:{in:{west:"west"},out:{east:"south",south:"north",north:"east"}},RL:{in:{east:"east"},out:{west:"north",north:"south",south:"west"}},BT:{in:{south:"south"},out:{north:"east",east:"west",west:"north"}}};return r.TD=r.TB,i.l.info("abc88",e,t,n),r[e][t][n]},b=(n,t,e)=>{if(i.l.info("getNextPort abc88",{node:n,edgeDirection:t,graphDirection:e}),!s[n])switch(e){case"TB":case"TD":s[n]={inPosition:"north",outPosition:"south"};break;case"BT":s[n]={inPosition:"south",outPosition:"north"};break;case"RL":s[n]={inPosition:"east",outPosition:"west"};break;case"LR":s[n]={inPosition:"west",outPosition:"east"}}const r="in"===t?s[n].inPosition:s[n].outPosition;return"in"===t?s[n].inPosition=l(s[n].inPosition,t,e):s[n].outPosition=l(s[n].outPosition,t,e),r},w=function(n,t,e,c){i.l.info("abc78 edges = ",n);const a=c.insert("g").attr("class","edgeLabels");let u,o,s={},l=t.db.getDirection();if(void 0!==n.defaultStyle){const t=(0,i.a)(n.defaultStyle);u=t.style,o=t.labelStyle}return n.forEach((function(t){var c="L-"+t.start+"-"+t.end;void 0===s[c]?(s[c]=0,i.l.info("abc78 new entry",c,s[c])):(s[c]++,i.l.info("abc78 new entry",c,s[c]));let w=c+"-"+s[c];i.l.info("abc78 new link id to be used is",c,w,s[c]);var d="LS-"+t.start,g="LE-"+t.end;const p={style:"",labelStyle:""};switch(p.minlen=t.length||1,"arrow_open"===t.type?p.arrowhead="none":p.arrowhead="normal",p.arrowTypeStart="arrow_open",p.arrowTypeEnd="arrow_open",t.type){case"double_arrow_cross":p.arrowTypeStart="arrow_cross";case"arrow_cross":p.arrowTypeEnd="arrow_cross";break;case"double_arrow_point":p.arrowTypeStart="arrow_point";case"arrow_point":p.arrowTypeEnd="arrow_point";break;case"double_arrow_circle":p.arrowTypeStart="arrow_circle";case"arrow_circle":p.arrowTypeEnd="arrow_circle"}let v="",m="";switch(t.stroke){case"normal":v="fill:none;",void 0!==u&&(v=u),void 0!==o&&(m=o),p.thickness="normal",p.pattern="solid";break;case"dotted":p.thickness="normal",p.pattern="dotted",p.style="fill:none;stroke-width:2px;stroke-dasharray:3;";break;case"thick":p.thickness="thick",p.pattern="solid",p.style="stroke-width: 3.5px;fill:none;"}if(void 0!==t.style){const n=(0,i.a)(t.style);v=n.style,m=n.labelStyle}p.style=p.style+=v,p.labelStyle=p.labelStyle+=m,void 0!==t.interpolate?p.curve=(0,i.d)(t.interpolate,r.c_6):void 0!==n.defaultInterpolate?p.curve=(0,i.d)(n.defaultInterpolate,r.c_6):p.curve=(0,i.d)(h.curve,r.c_6),void 0===t.text?void 0!==t.style&&(p.arrowheadStyle="fill: #333"):(p.arrowheadStyle="fill: #333",p.labelpos="c"),p.labelType="text",p.label=t.text.replace(i.c.lineBreakRegex,"\n"),void 0===t.style&&(p.style=p.style||"stroke: #333; stroke-width: 1.5px;fill:none;"),p.labelStyle=p.labelStyle.replace("color:","fill:"),p.id=w,p.classes="flowchart-link "+d+" "+g;const y=(0,i.f)(a,p),{source:k,target:j}=((n,t)=>{let e=n.start,i=n.end;const r=f[e],c=f[i];return r&&c?("diamond"===r.type&&(e=`${e}-${b(e,"out",t)}`),"diamond"===c.type&&(i=`${i}-${b(i,"in",t)}`),{source:e,target:i}):{source:e,target:i}})(t,l);i.l.debug("abc78 source and target",k,j),e.edges.push({id:"e"+t.start+t.end,sources:[k],targets:[j],labelEl:y,labels:[{width:p.width,height:p.height,orgWidth:p.width,orgHeight:p.height,text:p.label,layoutOptions:{"edgeLabels.inline":"true","edgeLabels.placement":"CENTER"}}],edgeData:p})})),e},d=function(n,t,e){const i=((n,t,e)=>{const{parentById:i}=e,r=new Set;let c=n;for(;c;){if(r.add(c),c===t)return c;c=i[c]}for(c=t;c;){if(r.has(c))return c;c=i[c]}return"root"})(n,t,e);if(void 0===i||"root"===i)return{x:0,y:0};const r=f[i].offset;return{x:r.posX,y:r.posY}},g=function(n,t,e,i,c){const a=d(t.sources[0],t.targets[0],c),u=t.sections[0].startPoint,o=t.sections[0].endPoint,s=(t.sections[0].bendPoints?t.sections[0].bendPoints:[]).map((n=>[n.x+a.x,n.y+a.y])),h=[[u.x+a.x,u.y+a.y],...s,[o.x+a.x,o.y+a.y]],f=(0,r.jvg)().curve(r.c_6),l=n.insert("path").attr("d",f(h)).attr("class","path").attr("fill","none"),b=n.insert("g").attr("class","edgeLabel"),w=(0,r.Ys)(b.node().appendChild(t.labelEl)),g=w.node().firstChild.getBoundingClientRect();w.attr("width",g.width),w.attr("height",g.height),b.attr("transform",`translate(${t.labels[0].x+a.x}, ${t.labels[0].y+a.y})`),function(n,t,e,i){let r="";switch(i&&(r=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,r=r.replace(/\(/g,"\\("),r=r.replace(/\)/g,"\\)")),t.arrowTypeStart){case"arrow_cross":n.attr("marker-start","url("+r+"#"+e+"-crossStart)");break;case"arrow_point":n.attr("marker-start","url("+r+"#"+e+"-pointStart)");break;case"arrow_barb":n.attr("marker-start","url("+r+"#"+e+"-barbStart)");break;case"arrow_circle":n.attr("marker-start","url("+r+"#"+e+"-circleStart)");break;case"aggregation":n.attr("marker-start","url("+r+"#"+e+"-aggregationStart)");break;case"extension":n.attr("marker-start","url("+r+"#"+e+"-extensionStart)");break;case"composition":n.attr("marker-start","url("+r+"#"+e+"-compositionStart)");break;case"dependency":n.attr("marker-start","url("+r+"#"+e+"-dependencyStart)");break;case"lollipop":n.attr("marker-start","url("+r+"#"+e+"-lollipopStart)")}switch(t.arrowTypeEnd){case"arrow_cross":n.attr("marker-end","url("+r+"#"+e+"-crossEnd)");break;case"arrow_point":n.attr("marker-end","url("+r+"#"+e+"-pointEnd)");break;case"arrow_barb":n.attr("marker-end","url("+r+"#"+e+"-barbEnd)");break;case"arrow_circle":n.attr("marker-end","url("+r+"#"+e+"-circleEnd)");break;case"aggregation":n.attr("marker-end","url("+r+"#"+e+"-aggregationEnd)");break;case"extension":n.attr("marker-end","url("+r+"#"+e+"-extensionEnd)");break;case"composition":n.attr("marker-end","url("+r+"#"+e+"-compositionEnd)");break;case"dependency":n.attr("marker-end","url("+r+"#"+e+"-dependencyEnd)");break;case"lollipop":n.attr("marker-end","url("+r+"#"+e+"-lollipopEnd)")}}(l,e,i.type,i.arrowMarkerAbsolute)},p=(n,t)=>{n.forEach((n=>{n.children||(n.children=[]);const e=t.childrenById[n.id];e&&e.forEach((t=>{n.children.push(f[t])})),p(n.children,t)}))},v=(n,t,e,r,c,a,u)=>{e.forEach((function(e){if(e)if(f[e.id].offset={posX:e.x+n,posY:e.y+t,x:n,y:t,depth:u,width:e.width,height:e.height},"group"===e.type){const r=c.insert("g").attr("class","subgraph");r.insert("rect").attr("class","subgraph subgraph-lvl-"+u%5+" node").attr("x",e.x+n).attr("y",e.y+t).attr("width",e.width).attr("height",e.height);const a=r.insert("g").attr("class","label");a.attr("transform",`translate(${e.labels[0].x+n+e.x}, ${e.labels[0].y+t+e.y})`),a.node().appendChild(e.labelData.labelNode),i.l.info("Id (UGH)= ",e.type,e.labels)}else i.l.info("Id (UGH)= ",e.id),e.el.attr("transform",`translate(${e.x+n+e.width/2}, ${e.y+t+e.height/2})`)})),e.forEach((function(e){e&&"group"===e.type&&v(n+e.x,t+e.y,e.children,r,c,a,u+1)}))},m={getClasses:function(n,t){i.l.info("Extracting classes"),t.db.clear("ver-2");try{return t.parse(n),t.db.getClasses()}catch(e){return{}}},draw:async function(n,t,e,a){var u;a.db.clear(),f={},a.db.setGen("gen-2"),a.parser.parse(n);const s=(0,r.Ys)("body").append("div").attr("style","height:400px").attr("id","cy");let h={id:"root",layoutOptions:{"elk.hierarchyHandling":"INCLUDE_CHILDREN","org.eclipse.elk.padding":"[top=100, left=100, bottom=110, right=110]","elk.layered.spacing.edgeNodeBetweenLayers":"30","elk.direction":"DOWN"},children:[],edges:[]};switch(i.l.info("Drawing flowchart using v3 renderer",o),a.db.getDirection()){case"BT":h.layoutOptions["elk.direction"]="UP";break;case"TB":h.layoutOptions["elk.direction"]="DOWN";break;case"LR":h.layoutOptions["elk.direction"]="RIGHT";break;case"RL":h.layoutOptions["elk.direction"]="LEFT"}const{securityLevel:l,flowchart:b}=(0,i.g)();let d;"sandbox"===l&&(d=(0,r.Ys)("#i"+t));const m="sandbox"===l?(0,r.Ys)(d.nodes()[0].contentDocument.body):(0,r.Ys)("body"),y="sandbox"===l?d.nodes()[0].contentDocument:document,k=m.select(`[id="${t}"]`);(0,i.i)(k,["point","circle","cross"],a.type,a.arrowMarkerAbsolute);const j=a.db.getVertices();let E;const T=a.db.getSubGraphs();i.l.info("Subgraphs - ",T);for(let i=T.length-1;i>=0;i--)E=T[i],a.db.addVertex(E.id,E.title,"group",void 0,E.classes,E.dir);const M=k.insert("g").attr("class","subgraphs"),S=function(n){const t={parentById:{},childrenById:{}},e=n.getSubGraphs();return i.l.info("Subgraphs - ",e),e.forEach((function(n){n.nodes.forEach((function(e){t.parentById[e]=n.id,void 0===t.childrenById[n.id]&&(t.childrenById[n.id]=[]),t.childrenById[n.id].push(e)}))})),e.forEach((function(n){n.id,void 0!==t.parentById[n.id]&&t.parentById[n.id]})),t}(a.db);h=function(n,t,e,r,a,u,o){const s=e.select(`[id="${t}"]`),h=s.insert("g").attr("class","nodes");return Object.keys(n).forEach((function(t){const e=n[t];let o="default";e.classes.length>0&&(o=e.classes.join(" "));const l=(0,i.a)(e.styles);let b,w=void 0!==e.text?e.text:e.id;const d={width:0,height:0};if((0,i.e)((0,i.g)().flowchart.htmlLabels)){const n={label:w.replace(/fa[blrs]?:fa-[\w-]+/g,(n=>`<i class='${n.replace(":"," ")}'></i>`))};b=(0,c.a)(s,n).node();const t=b.getBBox();d.width=t.width,d.height=t.height,d.labelNode=b,b.parentNode.removeChild(b)}else{const n=r.createElementNS("http://www.w3.org/2000/svg","text");n.setAttribute("style",l.labelStyle.replace("color:","fill:"));const t=w.split(i.c.lineBreakRegex);for(const i of t){const t=r.createElementNS("http://www.w3.org/2000/svg","tspan");t.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),t.setAttribute("dy","1em"),t.setAttribute("x","1"),t.textContent=i,n.appendChild(t)}b=n;const e=b.getBBox();d.width=e.width,d.height=e.height,d.labelNode=b}const g=[{id:e.id+"-west",layoutOptions:{"port.side":"WEST"}},{id:e.id+"-east",layoutOptions:{"port.side":"EAST"}},{id:e.id+"-south",layoutOptions:{"port.side":"SOUTH"}},{id:e.id+"-north",layoutOptions:{"port.side":"NORTH"}}];let p=0,v="",m={};switch(e.type){case"round":p=5,v="rect";break;case"square":case"group":default:v="rect";break;case"diamond":v="question",m={portConstraints:"FIXED_SIDE"};break;case"hexagon":v="hexagon";break;case"odd":case"odd_right":v="rect_left_inv_arrow";break;case"lean_right":v="lean_right";break;case"lean_left":v="lean_left";break;case"trapezoid":v="trapezoid";break;case"inv_trapezoid":v="inv_trapezoid";break;case"circle":v="circle";break;case"ellipse":v="ellipse";break;case"stadium":v="stadium";break;case"subroutine":v="subroutine";break;case"cylinder":v="cylinder";break;case"doublecircle":v="doublecircle"}const y={labelStyle:l.labelStyle,shape:v,labelText:w,rx:p,ry:p,class:o,style:l.style,id:e.id,link:e.link,linkTarget:e.linkTarget,tooltip:a.db.getTooltip(e.id)||"",domId:a.db.lookUpDomId(e.id),haveCallback:e.haveCallback,width:"group"===e.type?500:void 0,dir:e.dir,type:e.type,props:e.props,padding:(0,i.g)().flowchart.padding};let k,j;"group"!==y.type&&(j=(0,i.b)(h,y,e.dir),k=j.node().getBBox());const E={id:e.id,ports:"diamond"===e.type?g:[],layoutOptions:m,labelText:w,labelData:d,domId:a.db.lookUpDomId(e.id),width:null==k?void 0:k.width,height:null==k?void 0:k.height,type:e.type,el:j,parent:u.parentById[e.id]};f[y.id]=E})),o}(j,t,m,y,a,S,h);const P=k.insert("g").attr("class","edges edgePath"),C=a.db.getEdges();h=w(C,a,h,k);Object.keys(f).forEach((n=>{const t=f[n];t.parent||h.children.push(t),void 0!==S.childrenById[n]&&(t.labels=[{text:t.labelText,layoutOptions:{"nodeLabels.placement":"[H_CENTER, V_TOP, INSIDE]"},width:t.labelData.width,height:t.labelData.height}],delete t.x,delete t.y,delete t.width,delete t.height)})),p(h.children,S),i.l.info("after layout",JSON.stringify(h,null,2));const I=await o.layout(h);v(0,0,I.children,k,M,a,0),i.l.info("after layout",I),null==(u=I.edges)||u.map((n=>{g(P,n,n.edgeData,a,S)})),(0,i.s)({},k,b.diagramPadding,b.useMaxWidth),s.remove()}},y=n=>`.label {\n font-family: ${n.fontFamily};\n color: ${n.nodeTextColor||n.textColor};\n }\n .cluster-label text {\n fill: ${n.titleColor};\n }\n .cluster-label span {\n color: ${n.titleColor};\n }\n\n .label text,span {\n fill: ${n.nodeTextColor||n.textColor};\n color: ${n.nodeTextColor||n.textColor};\n }\n\n .node rect,\n .node circle,\n .node ellipse,\n .node polygon,\n .node path {\n fill: ${n.mainBkg};\n stroke: ${n.nodeBorder};\n stroke-width: 1px;\n }\n\n .node .label {\n text-align: center;\n }\n .node.clickable {\n cursor: pointer;\n }\n\n .arrowheadPath {\n fill: ${n.arrowheadColor};\n }\n\n .edgePath .path {\n stroke: ${n.lineColor};\n stroke-width: 2.0px;\n }\n\n .flowchart-link {\n stroke: ${n.lineColor};\n fill: none;\n }\n\n .edgeLabel {\n background-color: ${n.edgeLabelBackground};\n rect {\n opacity: 0.5;\n background-color: ${n.edgeLabelBackground};\n fill: ${n.edgeLabelBackground};\n }\n text-align: center;\n }\n\n .cluster rect {\n fill: ${n.clusterBkg};\n stroke: ${n.clusterBorder};\n stroke-width: 1px;\n }\n\n .cluster text {\n fill: ${n.titleColor};\n }\n\n .cluster span {\n color: ${n.titleColor};\n }\n /* .cluster div {\n color: ${n.titleColor};\n } */\n\n div.mermaidTooltip {\n position: absolute;\n text-align: center;\n max-width: 200px;\n padding: 2px;\n font-family: ${n.fontFamily};\n font-size: 12px;\n background: ${n.tertiaryColor};\n border: 1px solid ${n.border2};\n border-radius: 2px;\n pointer-events: none;\n z-index: 100;\n }\n\n .flowchartTitleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${n.textColor};\n }\n .subgraph {\n stroke-width:2;\n rx:3;\n }\n // .subgraph-lvl-1 {\n // fill:#ccc;\n // // stroke:black;\n // }\n ${(n=>{let t="";for(let e=0;e<5;e++)t+=`\n .subgraph-lvl-${e} {\n fill: ${n[`surface${e}`]};\n stroke: ${n[`surfacePeer${e}`]};\n }\n `;return t})(n)}\n`,k={db:i.h,renderer:m,parser:i.p,styles:y}}}]); \ No newline at end of file diff --git a/assets/js/94f31572.2cd0b599.js b/assets/js/94f31572.2cd0b599.js new file mode 100644 index 0000000000..64df119fd2 --- /dev/null +++ b/assets/js/94f31572.2cd0b599.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3722],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>p});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var d=a.createContext({}),l=function(e){var t=a.useContext(d),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=l(e.components);return a.createElement(d.Provider,{value:t},e.children)},u="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,d=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=l(n),m=r,p=u["".concat(d,".").concat(m)]||u[m]||h[m]||o;return n?a.createElement(p,i(i({ref:t},c),{},{components:n})):a.createElement(p,i({ref:t},c))}));function p(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var d in t)hasOwnProperty.call(t,d)&&(s[d]=t[d]);s.originalType=e,s[u]="string"==typeof e?e:r,i[1]=s;for(var l=2;l<o;l++)i[l]=n[l];return a.createElement.apply(null,i)}return a.createElement.apply(null,n)}m.displayName="MDXCreateElement"},43400:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var a=n(87462),r=(n(67294),n(3905));const o={},i="Frequently Asked Questions",s={unversionedId:"faq/index",id:"faq/index",title:"Frequently Asked Questions",description:"What does SCS stand for?",source:"@site/docs/08-faq/index.mdx",sourceDirName:"08-faq",slug:"/faq/",permalink:"/docs/faq/",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/08-faq/index.mdx",tags:[],version:"current",frontMatter:{},sidebar:"docs",previous:{title:"Release Notes for SCS Release 5",permalink:"/docs/releases/Release5"},next:{title:"Glossary",permalink:"/docs/glossary"}},d={},l=[{value:"What does SCS stand for?",id:"what-does-scs-stand-for",level:2},{value:"Who is SCS intended for?",id:"who-is-scs-intended-for",level:2},{value:"Who or what is behind SCS?",id:"who-or-what-is-behind-scs",level:2},{value:"Why is there a need for a standardized cloud environment?",id:"why-is-there-a-need-for-a-standardized-cloud-environment",level:2},{value:"Where can I find the SCS standards?",id:"where-can-i-find-the-scs-standards",level:2},{value:"How is the SCS different from other cloud environments (e.g. AWS, Azure,...)?",id:"how-is-the-scs-different-from-other-cloud-environments-eg-aws-azure",level:2},{value:"My company already has a cloud environment. Can we still use the SCS?",id:"my-company-already-has-a-cloud-environment-can-we-still-use-the-scs",level:2},{value:"What does reference implementation mean?",id:"what-does-reference-implementation-mean",level:2},{value:"Do I need to use the reference implementation to be SCS compliant?",id:"do-i-need-to-use-the-reference-implementation-to-be-scs-compliant",level:2},{value:"Do I have to use all layers of the reference implementation (IaaS, CaaS)?",id:"do-i-have-to-use-all-layers-of-the-reference-implementation-iaas-caas",level:2},{value:"What does IaaS mean?",id:"what-does-iaas-mean",level:2},{value:"How is the IaaS layer structured?",id:"how-is-the-iaas-layer-structured",level:2},{value:"What does CaaS mean? (Container Layer)",id:"what-does-caas-mean-container-layer",level:2},{value:"I want to try out the SCS! Where do I start?",id:"i-want-to-try-out-the-scs-where-do-i-start",level:2},{value:"I want to use an SCS Cloud! How do I get started?",id:"i-want-to-use-an-scs-cloud-how-do-i-get-started",level:2},{value:"I want to use the SCS in my company and build my own cloud! Where do I start?",id:"i-want-to-use-the-scs-in-my-company-and-build-my-own-cloud-where-do-i-start",level:2},{value:"I have a technical problem. Where can I find help?",id:"i-have-a-technical-problem-where-can-i-find-help",level:2}],c={toc:l},u="wrapper";function h(e){let{components:t,...n}=e;return(0,r.kt)(u,(0,a.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"frequently-asked-questions"},"Frequently Asked Questions"),(0,r.kt)("h2",{id:"what-does-scs-stand-for"},"What does SCS stand for?"),(0,r.kt)("p",null,"The Sovereign Cloud Stack (SCS) provides standards for a range of cloud infrastructure types. It strives for interoperable and sovereign cloud offerings which can be deployed and used by a wide range of organizations and individuals."),(0,r.kt)("h2",{id:"who-is-scs-intended-for"},"Who is SCS intended for?"),(0,r.kt)("p",null,"SCS is a Software Stack to power data centers of different scale. It empowers public or private cloud service providers to offer resources to their endusers."),(0,r.kt)("h2",{id:"who-or-what-is-behind-scs"},"Who or what is behind SCS?"),(0,r.kt)("p",null,"SCS is run by the SCS Project Team which is based at the Open Source Business Alliance e.V. and 100% funded by the German Ministry of Economics and Climate Action (BMWK). Public money means public code."),(0,r.kt)("h2",{id:"why-is-there-a-need-for-a-standardized-cloud-environment"},"Why is there a need for a standardized cloud environment?"),(0,r.kt)("p",null,"A standardized environment promotes interoperability, reduces vendor lock-in, and facilitates smoother transitions between providers. It gives individuals, companies and public institutions the freedom of choice."),(0,r.kt)("h2",{id:"where-can-i-find-the-scs-standards"},"Where can I find the SCS standards?"),(0,r.kt)("p",null,"The SCS standards are available on the standards pages within our documentation page. ",(0,r.kt)("a",{parentName:"p",href:"https://docs.scs.community/standards"},"Find them here")),(0,r.kt)("h2",{id:"how-is-the-scs-different-from-other-cloud-environments-eg-aws-azure"},"How is the SCS different from other cloud environments (e.g. AWS, Azure,...)?"),(0,r.kt)("p",null,"Unlike proprietary clouds, SCS emphasizes standardization, ensuring interoperability and reduced dependency on one provider."),(0,r.kt)("h2",{id:"my-company-already-has-a-cloud-environment-can-we-still-use-the-scs"},"My company already has a cloud environment. Can we still use the SCS?"),(0,r.kt)("p",null,"Yes, SCS can complement existing environments, enhancing standardization and interoperability."),(0,r.kt)("h2",{id:"what-does-reference-implementation-mean"},"What does reference implementation mean?"),(0,r.kt)("p",null,"Reference implementation is a concrete example or blueprint of how the SCS standards can be implemented."),(0,r.kt)("h2",{id:"do-i-need-to-use-the-reference-implementation-to-be-scs-compliant"},"Do I need to use the reference implementation to be SCS compliant?"),(0,r.kt)("p",null,"No, while the reference implementation is a guide, compliance requires adhering to SCS standards, not the exact blueprint of the reference implementation. ",(0,r.kt)("a",{parentName:"p",href:"https://docs.scs.community/standards/"},"Check the standards page on how to be SCS-compatible")),(0,r.kt)("h2",{id:"do-i-have-to-use-all-layers-of-the-reference-implementation-iaas-caas"},"Do I have to use all layers of the reference implementation (IaaS, CaaS)?"),(0,r.kt)("p",null,"No, you can choose layers based on your needs and still be SCS compliant."),(0,r.kt)("h2",{id:"what-does-iaas-mean"},"What does IaaS mean?"),(0,r.kt)("p",null,"IaaS stands for Infrastructure as a Service, providing virtualized computing resources over the internet."),(0,r.kt)("h2",{id:"how-is-the-iaas-layer-structured"},"How is the IaaS layer structured?"),(0,r.kt)("p",null,"IaaS typically comprises virtual machines, storage, and network resources, all offered as scalable services. ",(0,r.kt)("a",{parentName:"p",href:"https://doc.scs.community/docs/category/iaas-layer"},"Find the architecture here")),(0,r.kt)("h2",{id:"what-does-caas-mean-container-layer"},"What does CaaS mean? (Container Layer)"),(0,r.kt)("p",null,"CaaS refers to Container as a Service, where providers offer container orchestration platforms."),(0,r.kt)("h2",{id:"i-want-to-try-out-the-scs-where-do-i-start"},"I want to try out the SCS! Where do I start?"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"As a user"),":"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Existing SCS Clouds: Explore and test on any of the cloud providers offering SCS. ",(0,r.kt)("a",{parentName:"li",href:"https://doc.scs.community/standards/certification/overview#compliant-cloud-environments"},"Choose one from here"))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"As a Cloud Service Provider"),":"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Cloud in a Box"),": Start with our pre-packaged solutions. ",(0,r.kt)("a",{parentName:"li",href:"https://doc.scs.community/docs/iaas/deployment-examples/cloud-in-a-box/advanced-guides/cloud-in-a-box"},"Link to Ciab")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Testbed"),": Use the SCS test environment to experiment. ",(0,r.kt)("a",{parentName:"li",href:"https://doc.scs.community/docs/iaas/deployment-examples/cloud-in-a-box/advanced-guides/testbed"},"Link to Testbed/deployment example"))),(0,r.kt)("h2",{id:"i-want-to-use-an-scs-cloud-how-do-i-get-started"},"I want to use an SCS Cloud! How do I get started?"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"As a user"),":"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Browse our ",(0,r.kt)("a",{parentName:"li",href:"https://doc.scs.community/standards/certification/overview#compliant-cloud-environments"},"list of providers")," and choose one that fits your needs.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"As a Cloud Service Provider"),":"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Adopt SCS standards and utilize our ",(0,r.kt)("a",{parentName:"li",href:"https://doc.scs.community/docs/category/components"},"resources and tools")," to integrate them.")),(0,r.kt)("h2",{id:"i-want-to-use-the-scs-in-my-company-and-build-my-own-cloud-where-do-i-start"},"I want to use the SCS in my company and build my own cloud! Where do I start?"),(0,r.kt)("p",null,"Start by understanding SCS standards and then move on to the reference implementation. ",(0,r.kt)("a",{parentName:"p",href:"https://doc.scs.community/standards/"},"Link to guide"),")."),(0,r.kt)("h2",{id:"i-have-a-technical-problem-where-can-i-find-help"},"I have a technical problem. Where can I find help?"),(0,r.kt)("p",null,"Refer to our support section or check our community channels for assistance. ",(0,r.kt)("a",{parentName:"p",href:"https://doc.scs.community/community"},"Link to community"),"."))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/95d93785.1a6fd97a.js b/assets/js/95d93785.1a6fd97a.js new file mode 100644 index 0000000000..5529cd833d --- /dev/null +++ b/assets/js/95d93785.1a6fd97a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1481],{3905:(e,n,t)=>{t.d(n,{Zo:()=>p,kt:()=>v});var r=t(67294);function o(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function a(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?i(Object(t),!0).forEach((function(n){o(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):i(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}function l(e,n){if(null==e)return{};var t,r,o=function(e,n){if(null==e)return{};var t,r,o={},i=Object.keys(e);for(r=0;r<i.length;r++)t=i[r],n.indexOf(t)>=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)t=i[r],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var s=r.createContext({}),c=function(e){var n=r.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):a(a({},n),e)),t},p=function(e){var n=c(e.components);return r.createElement(s.Provider,{value:n},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},d=r.forwardRef((function(e,n){var t=e.components,o=e.mdxType,i=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),m=c(t),d=o,v=m["".concat(s,".").concat(d)]||m[d]||u[d]||i;return t?r.createElement(v,a(a({ref:n},p),{},{components:t})):r.createElement(v,a({ref:n},p))}));function v(e,n){var t=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var i=t.length,a=new Array(i);a[0]=d;var l={};for(var s in n)hasOwnProperty.call(n,s)&&(l[s]=n[s]);l.originalType=e,l[m]="string"==typeof e?e:o,a[1]=l;for(var c=2;c<i;c++)a[c]=t[c];return r.createElement.apply(null,a)}return r.createElement.apply(null,t)}d.displayName="MDXCreateElement"},87477:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>a,default:()=>u,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var r=t(87462),o=(t(67294),t(3905));const i={},a="Requirements",l={unversionedId:"container/components/k8s-cluster-api-provider/doc/requirements",id:"container/components/k8s-cluster-api-provider/doc/requirements",title:"Requirements",description:"Cluster API requires an existing Kubernetes cluster to operate. In our setup, we",source:"@site/docs/03-container/components/k8s-cluster-api-provider/doc/requirements.md",sourceDirName:"03-container/components/k8s-cluster-api-provider/doc",slug:"/container/components/k8s-cluster-api-provider/doc/requirements",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/requirements",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/03-container/components/k8s-cluster-api-provider/doc/requirements.md",tags:[],version:"current",frontMatter:{},sidebar:"docs",previous:{title:"Overview",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/overview"},next:{title:"Quickstart",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/quickstart"}},s={},c=[{value:"Environments",id:"environments",level:2},{value:"Plusserver community environment",id:"plusserver-community-environment",level:3},{value:"Wavestack environment",id:"wavestack-environment",level:3},{value:"Custom environment",id:"custom-environment",level:3}],p={toc:c},m="wrapper";function u(e){let{components:n,...t}=e;return(0,o.kt)(m,(0,r.Z)({},p,t,{components:n,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"requirements"},"Requirements"),(0,o.kt)("p",null,"Cluster API requires an existing Kubernetes cluster to operate. In our setup, we\nutilize ",(0,o.kt)("a",{parentName:"p",href:"https://kind.sigs.k8s.io/"},"kind")," a tool for running Kubernetes clusters using Docker containers, to create\nthe initial management Kubernetes cluster in a single docker container. The OpenStack instance serves as the CAPI\nmanagement server or management cluster, responsible for overseeing the\nmanagement and operation of the created kubernetes clusters."),(0,o.kt)("p",null,"The provisioning of the CAPI management server is done on a deployment host, possibly a tiny jumphost style VM, or some\nLinux/MacOS/WSL laptop."),(0,o.kt)("p",null,"Requirements for the deployment host:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"You need to have installed:",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"Terraform (",(0,o.kt)("a",{parentName:"li",href:"https://learn.hashicorp.com/tutorials/terraform/install-cli"},"https://learn.hashicorp.com/tutorials/terraform/install-cli"),")."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"yq")," (python3-yq or yq snap)"),(0,o.kt)("li",{parentName:"ul"},"GNU make"),(0,o.kt)("li",{parentName:"ul"},"openstack (python3-openstackclient) and plugin for octavia (python3-octaviaclient) Via pip or your distribution.\n",(0,o.kt)("em",{parentName:"li"},"Needed only in case you want to clean the management server or interact with openstack directly.")))),(0,o.kt)("li",{parentName:"ul"},"You must have credentials to access the cloud. Terraform will look for ",(0,o.kt)("inlineCode",{parentName:"li"},"clouds.yaml")," and optionally ",(0,o.kt)("inlineCode",{parentName:"li"},"secure.yaml")," in\nthe current working directory (",(0,o.kt)("inlineCode",{parentName:"li"},"terraform"),"), in ",(0,o.kt)("inlineCode",{parentName:"li"},"~/.config/openstack/")," or ",(0,o.kt)("inlineCode",{parentName:"li"},"/etc/openstack")," (in this order), just like\nthe ",(0,o.kt)("a",{parentName:"li",href:"https://docs.openstack.org/python-openstackclient/latest/configuration/index.html#clouds-yaml"},"openstack client"),"."),(0,o.kt)("li",{parentName:"ul"},"The API endpoints of the OpenStack cloud should have a certificate signed by a trusted CA. (Self-signed or custom CAs\nneed significant manual work -- this will be improved after R4.)"),(0,o.kt)("li",{parentName:"ul"},"An Environment file for the cloud you want to use. See ",(0,o.kt)("a",{parentName:"li",href:"#environments"},"Environments")," below for more details.")),(0,o.kt)("h2",{id:"environments"},"Environments"),(0,o.kt)("p",null,"To use a specific environment, you have to set the ",(0,o.kt)("inlineCode",{parentName:"p"},"ENVIRONMENT")," variable (",(0,o.kt)("inlineCode",{parentName:"p"},"export ENVIRONMENT=<yourcloud>"),") or pass it\nto the ",(0,o.kt)("inlineCode",{parentName:"p"},"make")," command by using ",(0,o.kt)("inlineCode",{parentName:"p"},"make <command> ENVIRONMENT=<yourcloud>"),".\nYou can also do the same by utilizing the ",(0,o.kt)("inlineCode",{parentName:"p"},"OS_CLOUD")," (openstack native) variable.\nThe name of the environment is derived from the name of the file ",(0,o.kt)("inlineCode",{parentName:"p"},"environments/environment-<yourcloud>.tfvars"),"."),(0,o.kt)("p",null,"The name of the environment specified either via ",(0,o.kt)("inlineCode",{parentName:"p"},"ENVIRONMENT")," or ",(0,o.kt)("inlineCode",{parentName:"p"},"OS_CLOUD")," has to be equal the name of the\ncloud (",(0,o.kt)("inlineCode",{parentName:"p"},"cloud_provider"),") as specified in your ",(0,o.kt)("inlineCode",{parentName:"p"},"clouds.yaml"),"."),(0,o.kt)("p",null,"In case you use ",(0,o.kt)("a",{parentName:"p",href:"#plusserver-community-environment"},"plusserver community environment"),"\nor ",(0,o.kt)("a",{parentName:"p",href:"#wavestack-environment"},"wavestack environment")," you can use the default environment file for\nthose directly or base your configuration on it. In case you need custom configuration\nsee ",(0,o.kt)("a",{parentName:"p",href:"#custom-environment"},"Custom environment"),"."),(0,o.kt)("p",null,"More information about the configuration options can be found in the ",(0,o.kt)("a",{parentName:"p",href:"/docs/container/components/k8s-cluster-api-provider/doc/configuration"},"configuration documentation"),"."),(0,o.kt)("h3",{id:"plusserver-community-environment"},"Plusserver community environment"),(0,o.kt)("p",null,"Using it directly:\n",(0,o.kt)("inlineCode",{parentName:"p"},"export ENVIRONMENT=gx-scs")),(0,o.kt)("p",null,"or insert inside of Makefile:\n",(0,o.kt)("inlineCode",{parentName:"p"},"ENVIRONMENT=gx-scs")),(0,o.kt)("p",null,"File: ",(0,o.kt)("inlineCode",{parentName:"p"},"environments/environment-gx-scs.tfvars")),(0,o.kt)("p",null,"The name of the cloud has to be ",(0,o.kt)("inlineCode",{parentName:"p"},"gx-scs")," in the ",(0,o.kt)("inlineCode",{parentName:"p"},"cloud.yaml")," file, otherwise you will need\nto change the ",(0,o.kt)("inlineCode",{parentName:"p"},"cloud_provider")," variable inside of ",(0,o.kt)("inlineCode",{parentName:"p"},"terraform/environments/environment-gx-scs.tfvars")," file."),(0,o.kt)("h3",{id:"wavestack-environment"},"Wavestack environment"),(0,o.kt)("p",null,"Using it directly:\n",(0,o.kt)("inlineCode",{parentName:"p"},"export ENVIRONMENT=gx-wavestack")),(0,o.kt)("p",null,"or insert inside of Makefile:\n",(0,o.kt)("inlineCode",{parentName:"p"},"ENVIRONMENT=gx-wavestack")),(0,o.kt)("p",null,"File: ",(0,o.kt)("inlineCode",{parentName:"p"},"environments/environment-gx-wavestack.tfvars")),(0,o.kt)("p",null,"The name of the cloud has to be ",(0,o.kt)("inlineCode",{parentName:"p"},"gx-wavestack")," in the ",(0,o.kt)("inlineCode",{parentName:"p"},"cloud.yaml")," file, otherwise you will need\nto change the ",(0,o.kt)("inlineCode",{parentName:"p"},"cloud_provider")," variable inside of ",(0,o.kt)("inlineCode",{parentName:"p"},"terraform/environments/environment-gx-scs.tfvars")," file."),(0,o.kt)("h3",{id:"custom-environment"},"Custom environment"),(0,o.kt)("p",null,"You can create your own environment file from the sample file ",(0,o.kt)("inlineCode",{parentName:"p"},"environments/environment-default.tfvars")," and provide the\nnecessary information like machine flavor or machine image. You can comment out all lines where the defaults match your\nneeds."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/95fe5f6c.61193966.js b/assets/js/95fe5f6c.61193966.js new file mode 100644 index 0000000000..af0220e49d --- /dev/null +++ b/assets/js/95fe5f6c.61193966.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8086],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>f});var n=r(67294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var i=n.createContext({}),l=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},u=function(e){var t=l(e.components);return n.createElement(i.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),p=l(r),m=o,f=p["".concat(i,".").concat(m)]||p[m]||d[m]||a;return r?n.createElement(f,s(s({ref:t},u),{},{components:r})):n.createElement(f,s({ref:t},u))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,s=new Array(a);s[0]=m;var c={};for(var i in t)hasOwnProperty.call(t,i)&&(c[i]=t[i]);c.originalType=e,c[p]="string"==typeof e?e:o,s[1]=c;for(var l=2;l<a;l++)s[l]=r[l];return n.createElement.apply(null,s)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},47327:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>s,default:()=>d,frontMatter:()=>a,metadata:()=>c,toc:()=>l});var n=r(87462),o=(r(67294),r(3905));const a={},s="Usage",c={unversionedId:"container/components/k8s-cluster-api-provider/doc/usage/usage",id:"container/components/k8s-cluster-api-provider/doc/usage/usage",title:"Usage",description:"The subsequent management of the cluster can best be done from the management server VM, as it has all the tools",source:"@site/docs/03-container/components/k8s-cluster-api-provider/doc/usage/usage.md",sourceDirName:"03-container/components/k8s-cluster-api-provider/doc/usage",slug:"/container/components/k8s-cluster-api-provider/doc/usage/",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/usage/",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/03-container/components/k8s-cluster-api-provider/doc/usage/usage.md",tags:[],version:"current",frontMatter:{},sidebar:"docs",previous:{title:"Roadmap",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/roadmap"},next:{title:"Create a new cluster",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/usage/create-new-cluster"}},i={},l=[],u={toc:l},p="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(p,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"usage"},"Usage"),(0,o.kt)("p",null,"The subsequent management of the cluster can best be done from the management server VM, as it has all the tools\ndeployed there and config files can be edited and resubmitted to the kubernetes kind cluster for reconciliation. To log\nin to this management server via ssh, you can issue ",(0,o.kt)("inlineCode",{parentName:"p"},"make ssh"),"."),(0,o.kt)("p",null,"You can create and do life cycle management for many more clusters from this management server."),(0,o.kt)("p",null,"The kubeconfig with admin power for the created testcluster is named ",(0,o.kt)("inlineCode",{parentName:"p"},"testcluster/testcluster.yaml")," (\nor ",(0,o.kt)("inlineCode",{parentName:"p"},"$CLUSTER_NAME/$CLUSTER_NAME.yaml")," for all the other clusters) and can be handed out to users that should get full\nadministrative control over the cluster. You can also retrieve them\nusing ",(0,o.kt)("inlineCode",{parentName:"p"},"make get-kubeconfig TESTCLUSTER=${CLUSTER_NAME}")," from the machines where you created the management server from,\nand possibly create an encrypted .zip file for handing these out. (You can omit ",(0,o.kt)("inlineCode",{parentName:"p"},"TESTCLUSTER=...")," for the\ndefault testcluster.)"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/96f8fd49.1849021a.js b/assets/js/96f8fd49.1849021a.js new file mode 100644 index 0000000000..6000a35c2d --- /dev/null +++ b/assets/js/96f8fd49.1849021a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2966],{3905:(e,n,t)=>{t.d(n,{Zo:()=>p,kt:()=>g});var o=t(67294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function r(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);n&&(o=o.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,o)}return t}function s(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?r(Object(t),!0).forEach((function(n){a(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):r(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}function l(e,n){if(null==e)return{};var t,o,a=function(e,n){if(null==e)return{};var t,o,a={},r=Object.keys(e);for(o=0;o<r.length;o++)t=r[o],n.indexOf(t)>=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o<r.length;o++)t=r[o],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var i=o.createContext({}),c=function(e){var n=o.useContext(i),t=n;return e&&(t="function"==typeof e?e(n):s(s({},n),e)),t},p=function(e){var n=c(e.components);return o.createElement(i.Provider,{value:n},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return o.createElement(o.Fragment,{},n)}},u=o.forwardRef((function(e,n){var t=e.components,a=e.mdxType,r=e.originalType,i=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),d=c(t),u=a,g=d["".concat(i,".").concat(u)]||d[u]||m[u]||r;return t?o.createElement(g,s(s({ref:n},p),{},{components:t})):o.createElement(g,s({ref:n},p))}));function g(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var r=t.length,s=new Array(r);s[0]=u;var l={};for(var i in n)hasOwnProperty.call(n,i)&&(l[i]=n[i]);l.originalType=e,l[d]="string"==typeof e?e:a,s[1]=l;for(var c=2;c<r;c++)s[c]=t[c];return o.createElement.apply(null,s)}return o.createElement.apply(null,t)}u.displayName="MDXCreateElement"},35304:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>s,default:()=>m,frontMatter:()=>r,metadata:()=>l,toc:()=>c});var o=t(87462),a=(t(67294),t(3905));const r={sidebar_label:"Logging",sidebar_position:10},s="Logging",l={unversionedId:"iaas/guides/operations-guide/manager/log",id:"iaas/guides/operations-guide/manager/log",title:"Logging",description:"Ansible",source:"@site/docs/02-iaas/guides/operations-guide/manager/log.md",sourceDirName:"02-iaas/guides/operations-guide/manager",slug:"/iaas/guides/operations-guide/manager/log",permalink:"/docs/iaas/guides/operations-guide/manager/log",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/operations-guide/manager/log.md",tags:[],version:"current",sidebarPosition:10,frontMatter:{sidebar_label:"Logging",sidebar_position:10},sidebar:"docs",previous:{title:"Apply",permalink:"/docs/iaas/guides/operations-guide/manager/apply"},next:{title:"Console",permalink:"/docs/iaas/guides/operations-guide/manager/console"}},i={},c=[{value:"Ansible",id:"ansible",level:2},{value:"Files",id:"files",level:3},{value:"ARA - ARA Records Ansible",id:"ara---ara-records-ansible",level:3},{value:"Sample usage",id:"sample-usage",level:4},{value:"Container",id:"container",level:2},{value:"OpenSearch",id:"opensearch",level:2}],p={toc:c},d="wrapper";function m(e){let{components:n,...t}=e;return(0,a.kt)(d,(0,o.Z)({},p,t,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"logging"},"Logging"),(0,a.kt)("h2",{id:"ansible"},"Ansible"),(0,a.kt)("h3",{id:"files"},"Files"),(0,a.kt)("p",null,"Each Ansible service has its own local Ansible log file. These log files are not persistent. The ARA service is\nused for the persistence of Ansible logs. The log files can be used to view currently running Ansible Plays,\nfor example if they are running as a background task."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"$ docker exec -it osism-ansible tail -f /ansible/logs/ansible.log\n$ docker exec -it ceph-ansible tail -f /ansible/logs/ansible.log\n$ docker exec -it kolla-ansible tail -f /ansible/logs/ansible.log\n")),(0,a.kt)("h3",{id:"ara---ara-records-ansible"},"ARA - ARA Records Ansible"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"$ osism log ansible\n(ara) help\n\nDocumented commands (use 'help -v' for verbose/'help <topic>' for details):\n===========================================================================\nalias exit history quit run_script shell\nedit help macro run_pyscript set shortcuts\n\nApplication commands (type help <topic>):\n=========================================\ncomplete host metrics playbook delete record delete result show\nexpire host show playbook list record list task delete\nhelp play delete playbook metrics record show task list\nhost delete play list playbook prune result delete task metrics\nhost list play show playbook show result list task show\n")),(0,a.kt)("h4",{id:"sample-usage"},"Sample usage"),(0,a.kt)("p",null,"As an example, the role common is run. Irrelevant parts of outputs have been removed."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"$ osism apply common\n")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"$ osism log ansible\n")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"(ara) play list\n+----+-----------+-------------------------------------------------------+----------+-------+---------+-----------------------------+-----------------+\n| id | status | name | playbook | tasks | results | started | duration |\n+----+-----------+-------------------------------------------------------+----------+-------+---------+-----------------------------+-----------------+\n| 69 | completed | Apply role common | 49 | 21 | 68 | 2023-09-30T10:14:01.731212Z | 00:00:38.238032 |\n+----+-----------+-------------------------------------------------------+----------+-------+---------+-----------------------------+-----------------+\n")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"(ara) play show 69\n+----------+------------------------------------------+\n| Field | Value |\n+----------+------------------------------------------+\n| id | 69 |\n| report | http://ara-server:8000/playbooks/49.html |\n| status | completed |\n| name | Apply role common |\n| playbook | (49) /ansible/kolla-common.yml |\n| started | 2023-09-30T10:14:01.731212Z |\n| ended | 2023-09-30T10:14:39.969244Z |\n| duration | 00:00:38.238032 |\n| items | {'tasks': 21, 'results': 68} |\n+----------+------------------------------------------+\n")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"(ara) task list\n+-----+-----------+---------+---------------------------------+----------------------------------------------------------------------------+----------+-----------------------------+-----------------+\n| id | status | results | action | name | playbook | started | duration |\n+-----+-----------+---------+---------------------------------+----------------------------------------------------------------------------+----------+-----------------------------+-----------------+\n| 910 | completed | 0 | meta | common : Flush handlers | 49 | 2023-09-30T10:14:37.126872Z | 00:00:02.552006 |\n| 909 | completed | 4 | file | common : Link kolla_logs volume to /var/log/kolla | 49 | 2023-09-30T10:14:35.502754Z | 00:00:01.039468 |\n| 908 | completed | 4 | kolla_docker | common : Creating log volume | 49 | 2023-09-30T10:14:34.134312Z | 00:00:01.076976 |\n| 907 | completed | 4 | kolla_docker | common : Check common containers | 49 | 2023-09-30T10:14:31.411916Z | 00:00:02.146165 |\n| 906 | completed | 4 | template | common : Copy rabbitmq erl_inetrc to kolla toolbox | 49 | 2023-09-30T10:14:29.500998Z | 00:00:01.327607 |\n| 905 | completed | 4 | template | common : Copy rabbitmq-env.conf to kolla toolbox | 49 | 2023-09-30T10:14:27.979869Z | 00:00:01.231630 |\n| 904 | completed | 4 | file | common : Ensuring config directories have correct owner and permission | 49 | 2023-09-30T10:14:26.422535Z | 00:00:01.263370 |\n| 903 | completed | 4 | template | common : Ensure RabbitMQ Erlang cookie exists | 49 | 2023-09-30T10:14:24.880329Z | 00:00:01.255475 |\n| 902 | completed | 4 | template | common : Copying over cron logrotate config file | 49 | 2023-09-30T10:14:23.199518Z | 00:00:01.392765 |\n| 901 | completed | 4 | template | common : Copying over td-agent.conf | 49 | 2023-09-30T10:14:21.085351Z | 00:00:01.826039 |\n| 900 | completed | 1 | find | common : Find custom fluentd output config files | 49 | 2023-09-30T10:14:19.859670Z | 00:00:00.939663 |\n| 899 | completed | 1 | find | common : Find custom fluentd format config files | 49 | 2023-09-30T10:14:18.711171Z | 00:00:00.858586 |\n| 898 | completed | 1 | find | common : Find custom fluentd filter config files | 49 | 2023-09-30T10:14:17.542234Z | 00:00:00.877270 |\n| 897 | completed | 1 | find | common : Find custom fluentd input config files | 49 | 2023-09-30T10:14:15.911699Z | 00:00:01.315217 |\n| 896 | completed | 4 | template | common : Copying over config.json files for services | 49 | 2023-09-30T10:14:13.588195Z | 00:00:02.031647 |\n| 895 | completed | 4 | copy | service-cert-copy : common | Copying over backend internal TLS key | 49 | 2023-09-30T10:14:12.216984Z | 00:00:01.074853 |\n| 894 | completed | 4 | copy | service-cert-copy : common | Copying over backend internal TLS certificate | 49 | 2023-09-30T10:14:10.895833Z | 00:00:01.022530 |\n| 893 | completed | 4 | copy | service-cert-copy : common | Copying over extra CA certificates | 49 | 2023-09-30T10:14:08.551850Z | 00:00:02.040932 |\n| 892 | completed | 4 | include_tasks | common : include_tasks | 49 | 2023-09-30T10:14:07.019883Z | 00:00:00.950605 |\n| 891 | completed | 4 | file | common : Ensuring config directories exist | 49 | 2023-09-30T10:14:04.801633Z | 00:00:01.926842 |\n| 890 | completed | 4 | include_tasks | common : include_tasks | 49 | 2023-09-30T10:14:03.054547Z | 00:00:01.166032 |\n+-----+-----------+---------+---------------------------------+----------------------------------------------------------------------------+----------+-----------------------------+-----------------+\n")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"(ara) task show 910\n+----------+------------------------------------------+\n| Field | Value |\n+----------+------------------------------------------+\n| id | 910 |\n| uuid | 0242ac1f-6510-3867-9eea-00000000004f |\n| report | http://ara-server:8000/playbooks/49.html |\n| name | common : Flush handlers |\n| action | meta |\n| status | completed |\n| path | /ansible/roles/common/tasks/deploy.yml |\n| lineno | 8 |\n| started | 2023-09-30T10:14:37.126872Z |\n| ended | 2023-09-30T10:14:39.678878Z |\n| duration | 00:00:02.552006 |\n| tags | ['common'] |\n| handler | False |\n+----------+------------------------------------------+\n")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"(ara) playbook list\n+----+-----------+-------------------------------+--------+-----------------+---------------------------------------------------+-------+---------+-------+-----------------------------+-----------------+\n| id | status | controller | user | ansible_version | path | tasks | results | hosts | started | duration |\n+----+-----------+-------------------------------+--------+-----------------+---------------------------------------------------+-------+---------+-------+-----------------------------+-----------------+\n| 49 | completed | kolla-ansible.manager_default | dragon | 2.14.10 | /ansible/kolla-common.yml | 21 | 68 | 5 | 2023-09-30T10:14:01.410334Z | 00:00:39.135309 |\n+----+-----------+-------------------------------+--------+-----------------+---------------------------------------------------+-------+---------+-------+-----------------------------+-----------------+\n")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"(ara) playbook metrics\n+---------------------------------------------------+-------+----------------+----------------+-------+---------+-------+-----------+--------+---------+\n| aggregate | count | duration_total | duration_avg | tasks | results | hosts | completed | failed | running |\n+---------------------------------------------------+-------+----------------+----------------+-------+---------+-------+-----------+--------+---------+\n| /ansible/kolla-common.yml | 2 | 0:02:53.934432 | 0:01:26.967216 | 46 | 152 | 10 | 2 | 0 | 0 |\n+---------------------------------------------------+-------+----------------+----------------+-------+---------+-------+-----------+--------+---------+\n")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"(ara) host list\n+-----+-----------------------------------+----------+---------+--------+----+---------+-------------+-----------------------------+\n| id | name | playbook | changed | failed | ok | skipped | unreachable | updated |\n+-----+-----------------------------------+----------+---------+--------+----+---------+-------------+-----------------------------+\n| 164 | testbed-node-2.testbed.osism.xyz | 49 | 0 | 0 | 14 | 2 | 0 | 2023-09-30T10:14:40.543599Z |\n| 161 | testbed-manager.testbed.osism.xyz | 49 | 0 | 0 | 18 | 2 | 0 | 2023-09-30T10:14:40.283581Z |\n| 163 | testbed-node-1.testbed.osism.xyz | 49 | 0 | 0 | 14 | 2 | 0 | 2023-09-30T10:14:40.280601Z |\n| 162 | testbed-node-0.testbed.osism.xyz | 49 | 0 | 0 | 14 | 2 | 0 | 2023-09-30T10:14:40.279181Z |\n| 165 | kolla-ansible.manager_default | 49 | 0 | 0 | 0 | 0 | 0 | 2023-09-30T10:14:16.932135Z |\n+-----+-----------------------------------+----------+---------+--------+----+---------+-------------+-----------------------------+\n")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"(ara) host show 164\n+-------------+------------------------------------------+\n| Field | Value |\n+-------------+------------------------------------------+\n| id | 164 |\n| report | http://ara-server:8000/playbooks/49.html |\n| name | testbed-node-2.testbed.osism.xyz |\n| changed | 0 |\n| failed | 0 |\n| ok | 14 |\n| skipped | 2 |\n| unreachable | 0 |\n| updated | 2023-09-30T10:14:40.543599Z |\n+-------------+------------------------------------------+\n")),(0,a.kt)("h2",{id:"container"},"Container"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"$ osism log container testbed-node-0 horizon\n[...]\n++++ APACHE_LOCK_DIR=/var/lock/apache2\n++++ export APACHE_LOG_DIR=/var/log/apache2\n++++ APACHE_LOG_DIR=/var/log/apache2\n++++ export LANG=C\n++++ LANG=C\n++++ export LANG\n+++ install -d /var/run/apache2/\n+++ rm -rf '/var/run/apache2/*'\n+++ [[ ubuntu =~ centos|rocky ]]\n+ echo 'Running command: '\\''/usr/sbin/apache2 -DFOREGROUND'\\'''\n+ exec /usr/sbin/apache2 -DFOREGROUND\nAH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 192.168.16.10. Set the 'ServerName' directive globally to suppress this message\n")),(0,a.kt)("h2",{id:"opensearch"},"OpenSearch"),(0,a.kt)("p",null,"OpenSearch can be queried with ",(0,a.kt)("a",{parentName:"p",href:"https://opensearch.org/docs/latest/search-plugins/sql/sql/index/"},"SQL"),"."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"$ osism log opensearch\n>>> SELECT * FROM flog-2023.10.31 LIMIT 1;\nOct 31 10:45:36 testbed-node-0 docker[847573]: cluster 2023-10-31T10:45:35.498718+0000 mgr.testbed-node-0 (mgr.5184) 24194 : cluster [DBG] pgmap v24196: 321 pgs: 321 active+clean; 577 KiB data, 270 MiB used, 60 GiB / 60 GiB avail\n\n>>> SELECT * FROM flog-2023.10.31 LIMIT 5;\nOct 31 11:19:57 testbed-node-2 docker[880827]: 2023-10-31T11:19:57.650+0000 7fa7e7c88700 0 [dashboard INFO root] Redirecting to active 'http://192.168.16.10:7000/'\nOct 31 11:19:57 testbed-node-2 docker[880827]: 2023-10-31T11:19:57.650+0000 7fa7e7c88700 0 [dashboard INFO request] [::ffff:192.168.16.11:56210] [OPTIONS] [302] [0.001s] [105.0B] [8a69cc7a-23db-410b-b744-cc5689cb4f4c] /\nOct 31 11:19:58 testbed-node-2 docker[844686]: cluster 2023-10-31T11:19:56.329684+0000 mgr.testbed-node-0 (mgr.5184) 25224 : cluster [DBG] pgmap v25226: 321 pgs: 321 active+clean; 577 KiB data, 270 MiB used, 60 GiB / 60 GiB avail\nOct 31 11:19:58 testbed-node-2 docker[844686]: debug 2023-10-31T11:19:58.566+0000 7fdbc9728700 1 mon.testbed-node-2@2(peon).osd e74 _set_new_cache_sizes cache_size:1020054731 inc_alloc: 348127232 full_alloc: 348127232 kv_alloc: 322961408\nOct 31 11:19:58 testbed-node-2 docker[880827]: 2023-10-31T11:19:58.710+0000 7fa7eb48f700 0 [dashboard INFO root] Redirecting to active 'http://192.168.16.10:7000/'\n\n>>> SELECT * FROM flog-2023.10.31 WHERE Hostname = 'testbed-node-0' LIMIT 5\nPATH_INFO: `/` log_request_info /var/lib/kolla/venv/lib/python3.10/site-packages/keystone/server/flask/request_processing/req_logging.py:29\nREQUEST_METHOD: `GET` log_request_info /var/lib/kolla/venv/lib/python3.10/site-packages/keystone/server/flask/request_processing/req_logging.py:27\nSCRIPT_NAME: `` log_request_info /var/lib/kolla/venv/lib/python3.10/site-packages/keystone/server/flask/request_processing/req_logging.py:28\n192.168.16.10 - - [31/Oct/2023 10:57:33] \"GET / HTTP/1.1\" 300 1761 0.001253\n(1039) accepted ('192.168.16.10', 58732) server /var/lib/kolla/venv/lib/python3.10/site-packages/eventlet/wsgi.py:1004\n\n>>> SELECT * FROM flog-2023.10.31 WHERE Hostname = 'testbed-node-0' AND programname = 'keystone' LIMIT 5\nPATH_INFO: `/` log_request_info /var/lib/kolla/venv/lib/python3.10/site-packages/keystone/server/flask/request_processing/req_logging.py:29\nREQUEST_METHOD: `GET` log_request_info /var/lib/kolla/venv/lib/python3.10/site-packages/keystone/server/flask/request_processing/req_logging.py:27\nSCRIPT_NAME: `` log_request_info /var/lib/kolla/venv/lib/python3.10/site-packages/keystone/server/flask/request_processing/req_logging.py:28\nPATH_INFO: `/` log_request_info /var/lib/kolla/venv/lib/python3.10/site-packages/keystone/server/flask/request_processing/req_logging.py:29\nREQUEST_METHOD: `GET` log_request_info /var/lib/kolla/venv/lib/python3.10/site-packages/keystone/server/flask/request_processing/req_logging.py:27\n")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/97b1504a.b1e7ce48.js b/assets/js/97b1504a.b1e7ce48.js new file mode 100644 index 0000000000..eb8dcc29f8 --- /dev/null +++ b/assets/js/97b1504a.b1e7ce48.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2443],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function o(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},i=Object.keys(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),d=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},c=function(e){var t=d(e.components);return a.createElement(l.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},u=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,l=e.parentName,c=o(e,["components","mdxType","originalType","parentName"]),p=d(n),u=r,f=p["".concat(l,".").concat(u)]||p[u]||m[u]||i;return n?a.createElement(f,s(s({ref:t},c),{},{components:n})):a.createElement(f,s({ref:t},c))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,s=new Array(i);s[0]=u;var o={};for(var l in t)hasOwnProperty.call(t,l)&&(o[l]=t[l]);o.originalType=e,o[p]="string"==typeof e?e:r,s[1]=o;for(var d=2;d<i;d++)s[d]=n[d];return a.createElement.apply(null,s)}return a.createElement.apply(null,n)}u.displayName="MDXCreateElement"},36616:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>m,frontMatter:()=>i,metadata:()=>o,toc:()=>d});var a=n(87462),r=(n(67294),n(3905));const i={},s="SCS-0104: Standard Images",o={unversionedId:"iaas/scs-0104",id:"iaas/scs-0104",title:"SCS-0104: Standard Images",description:"The SCS-0104 standard establishes guidelines for virtual machine images in Sovereign Cloud Stack (SCS) environments, specifying mandatory, recommended, and optional images via a YAML file, ensuring interoperability and streamlined deployments. It mandates that image upload via Glance must be allowed, ensuring flexibility for users. The standard's machine-readable document facilitates automated processing for compliance and integration purposes, promoting consistency and reliability in cloud environments.",source:"@site/standards/iaas/scs-0104.md",sourceDirName:"iaas",slug:"/iaas/scs-0104",permalink:"/standards/iaas/scs-0104",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"standards",previous:{title:"SCS Standard Flavors and Properties",permalink:"/standards/scs-0103-v1-standard-flavors"},next:{title:"SCS Standard Images",permalink:"/standards/scs-0104-v1-standard-images"}},l={},d=[],c={toc:d},p="wrapper";function m(e){let{components:t,...n}=e;return(0,r.kt)(p,(0,a.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"scs-0104-standard-images"},"SCS-0104: Standard Images"),(0,r.kt)("p",null,"The SCS-0104 standard establishes guidelines for virtual machine images in Sovereign Cloud Stack (SCS) environments, specifying mandatory, recommended, and optional images via a YAML file, ensuring interoperability and streamlined deployments. It mandates that image upload via Glance must be allowed, ensuring flexibility for users. The standard's machine-readable document facilitates automated processing for compliance and integration purposes, promoting consistency and reliability in cloud environments."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Version"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"State"),(0,r.kt)("th",{parentName:"tr",align:null},"stabilized"),(0,r.kt)("th",{parentName:"tr",align:null},"obsoleted"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"/standards/scs-0104-v1-standard-images"},"SCS-0104-v1")),(0,r.kt)("td",{parentName:"tr",align:null},"Standard"),(0,r.kt)("td",{parentName:"tr",align:null},"\ud83d\udfe0 Draft"),(0,r.kt)("td",{parentName:"tr",align:null},"-"),(0,r.kt)("td",{parentName:"tr",align:null},"-")))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/98f69cae.ab53b220.js b/assets/js/98f69cae.ab53b220.js new file mode 100644 index 0000000000..ef9a6f51f2 --- /dev/null +++ b/assets/js/98f69cae.ab53b220.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5645],{5414:s=>{s.exports=JSON.parse('{"title":"SCS-0411","slug":"standards/scs-0411","permalink":"/standards/standards/scs-0411","navigation":{"previous":{"title":"Gnocchi as database for metering","permalink":"/standards/scs-0410-v1-gnocchi-as-metering-database"},"next":{"title":"Push-based approach for providing usage data","permalink":"/standards/scs-0411-v1-publishing_method_for_metering_data"}}}')}}]); \ No newline at end of file diff --git a/assets/js/99b53e63.b234e41b.js b/assets/js/99b53e63.b234e41b.js new file mode 100644 index 0000000000..ad106c0ac8 --- /dev/null +++ b/assets/js/99b53e63.b234e41b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9742],{3905:(e,t,n)=>{n.d(t,{Zo:()=>l,kt:()=>d});var o=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function p(e,t){if(null==e)return{};var n,o,r=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var i=o.createContext({}),c=function(e){var t=o.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},l=function(e){var t=c(e.components);return o.createElement(i.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},y=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,l=p(e,["components","mdxType","originalType","parentName"]),u=c(n),y=r,d=u["".concat(i,".").concat(y)]||u[y]||m[y]||a;return n?o.createElement(d,s(s({ref:t},l),{},{components:n})):o.createElement(d,s({ref:t},l))}));function d(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,s=new Array(a);s[0]=y;var p={};for(var i in t)hasOwnProperty.call(t,i)&&(p[i]=t[i]);p.originalType=e,p[u]="string"==typeof e?e:r,s[1]=p;for(var c=2;c<a;c++)s[c]=n[c];return o.createElement.apply(null,s)}return o.createElement.apply(null,n)}y.displayName="MDXCreateElement"},77065:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>s,default:()=>m,frontMatter:()=>a,metadata:()=>p,toc:()=>c});var o=n(87462),r=(n(67294),n(3905));const a={},s="Components",p={unversionedId:"operating-scs/components/status-page/docs/components",id:"operating-scs/components/status-page/docs/components",title:"Components",description:'Illustrating multiple interchangable logical "layers" of possible Status Page application stacks:',source:"@site/docs/04-operating-scs/components/status-page/docs/components.md",sourceDirName:"04-operating-scs/components/status-page/docs",slug:"/operating-scs/components/status-page/docs/components",permalink:"/docs/operating-scs/components/status-page/docs/components",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/04-operating-scs/components/status-page/docs/components.md",tags:[],version:"current",frontMatter:{},sidebar:"docs",previous:{title:"Component Overview",permalink:"/docs/operating-scs/components/status-page/docs/component_overview"},next:{title:'"Levels of consensus"',permalink:"/docs/operating-scs/components/status-page/docs/levels_of_consensus"}},i={},c=[],l={toc:c},u="wrapper";function m(e){let{components:t,...n}=e;return(0,r.kt)(u,(0,o.Z)({},l,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"components"},"Components"),(0,r.kt)("p",null,'Illustrating multiple interchangable logical "layers" of possible Status Page application stacks:'),(0,r.kt)("mermaid",{value:' C4Container\n title SCS Status Page components\n UpdateLayoutConfig("100", "1")\n Boundary(b4, "Application layer") {\n Container(app1, "Flask App", "OAuth2 impl. etc.")\n Container(app2, "Vue App", "OAuth2 impl. etc.")\n Container(app3, "CLI Client", "CLI Client")\n }\n Boundary(b3, "Policy layer") {\n Container(policy1, "istio end-user auth", "")\n Container(policy2, "custom auth proxy", "")\n Container(policy3, "Caddy", "")\n }\n Boundary(b2, "API server layer") {\n Container(api1, "API Server (Go)", "")\n Container(api2, "API Server (Python)", "")\n Container(api3, "API Server (Go)", "")\n }\n Boundary(b1, "Database layer") {\n Container(db1, "postgres", "")\n Container(db2, "mysql", "")\n Container(db3, "github", "Github Projects API")\n }\n Rel(api1, db1, "Uses", "Postgres protocol")\n Rel(api2, db2, "Uses", "MySQL protocol")\n Rel(api3, db3, "Uses", "GraphQL API")\n Rel(policy1, api1, "Relays", "SCS Status Page API")\n Rel(policy2, api2, "Relays", "SCS Status Page API")\n Rel(policy3, api3, "Relays", "SCS Status Page API")\n Rel(app1, policy1, "Requests", "SCS Status Page API + Auth")\n Rel(app2, policy2, "Requests", "SCS Status Page API + Auth")\n Rel(app3, policy3, "Requests", "SCS Status Page API + Auth")'}),(0,r.kt)("p",null,"Note that not everything that is shown here, actually exists or was tested. It is just shown for illustration purposes."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9d1324c7.3b4cab1d.js b/assets/js/9d1324c7.3b4cab1d.js new file mode 100644 index 0000000000..e381c00fe7 --- /dev/null +++ b/assets/js/9d1324c7.3b4cab1d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4855],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>c});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?l(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):l(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function o(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},l=Object.keys(e);for(n=0;n<l.length;n++)a=l[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n<l.length;n++)a=l[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=n.createContext({}),p=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},d=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},k=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),m=p(a),k=r,c=m["".concat(s,".").concat(k)]||m[k]||u[k]||l;return a?n.createElement(c,i(i({ref:t},d),{},{components:a})):n.createElement(c,i({ref:t},d))}));function c(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,i=new Array(l);i[0]=k;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[m]="string"==typeof e?e:r,i[1]=o;for(var p=2;p<l;p++)i[p]=a[p];return n.createElement.apply(null,i)}return n.createElement.apply(null,a)}k.displayName="MDXCreateElement"},67676:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>u,frontMatter:()=>l,metadata:()=>o,toc:()=>p});var n=a(87462),r=(a(67294),a(3905));const l={title:"SCS Flavor Naming Standard",version:"2022-09-08-002",authors:"Matthias Hamm, Kurt Garloff, Tim Beermann",type:"Standard",track:"IaaS",status:"Stable",state:"v1.1 (for R3)",obsoleted_at:new Date("2023-10-31T00:00:00.000Z")},i=void 0,o={unversionedId:"scs-0100-v1-flavor-naming",id:"scs-0100-v1-flavor-naming",title:"SCS Flavor Naming Standard",description:"Introduction",source:"@site/standards/scs-0100-v1-flavor-naming.md",sourceDirName:".",slug:"/scs-0100-v1-flavor-naming",permalink:"/standards/scs-0100-v1-flavor-naming",draft:!1,tags:[],version:"current",frontMatter:{title:"SCS Flavor Naming Standard",version:"2022-09-08-002",authors:"Matthias Hamm, Kurt Garloff, Tim Beermann",type:"Standard",track:"IaaS",status:"Stable",state:"v1.1 (for R3)",obsoleted_at:"2023-10-31T00:00:00.000Z"},sidebar:"standards",previous:{title:"SCS-0100: Flavor Naming",permalink:"/standards/iaas/scs-0100"},next:{title:"SCS Flavor Naming Standard",permalink:"/standards/scs-0100-v2-flavor-naming"}},s={},p=[{value:"Introduction",id:"introduction",level:2},{value:"Motivation",id:"motivation",level:2},{value:"Proposal",id:"proposal",level:2},{value:"Type of information included",id:"type-of-information-included",level:3},{value:"Complete Proposal",id:"complete-proposal",level:3},{value:"Proposal Details",id:"proposal-details",level:2},{value:"REQUIRED CPU Suffixes",id:"required-cpu-suffixes",level:3},{value:"Baseline",id:"baseline",level:4},{value:"Higher oversubscription",id:"higher-oversubscription",level:4},{value:"Insufficient microcode",id:"insufficient-microcode",level:4},{value:"Examples",id:"examples",level:4},{value:"REQUIRED Memory",id:"required-memory",level:3},{value:"Baseline",id:"baseline-1",level:4},{value:"No ECC",id:"no-ecc",level:4},{value:"Enabled Oversubscription",id:"enabled-oversubscription",level:4},{value:"Examples",id:"examples-1",level:4},{value:"OPTIONAL Disk sizes and types",id:"optional-disk-sizes-and-types",level:3},{value:"Baseline",id:"baseline-2",level:4},{value:"Multi-provisioned Disk",id:"multi-provisioned-disk",level:4},{value:"Examples",id:"examples-2",level:4},{value:"OPTIONAL Hypervisor",id:"optional-hypervisor",level:3},{value:"Examples",id:"examples-3",level:4},{value:"OPTIONAL Hardware virtualization / Nested virtualization",id:"optional-hardware-virtualization--nested-virtualization",level:3},{value:"Examples",id:"examples-4",level:4},{value:"OPTIONAL CPU Architecture Details",id:"optional-cpu-architecture-details",level:3},{value:"Generation and Vendor",id:"generation-and-vendor",level:4},{value:"Frequency Suffixes",id:"frequency-suffixes",level:4},{value:"Examples",id:"examples-5",level:4},{value:"OPTIONAL Extra features",id:"optional-extra-features",level:3},{value:"Proposal Examples",id:"proposal-examples",level:2},{value:"Standard SCS flavors",id:"standard-scs-flavors",level:2},{value:"Naming policies",id:"naming-policies",level:2},{value:"Rationale",id:"rationale",level:3},{value:"Validation",id:"validation",level:2},{value:"Beyond SCS: Gaia-X",id:"beyond-scs-gaia-x",level:2}],d={toc:p},m="wrapper";function u(e){let{components:t,...a}=e;return(0,r.kt)(m,(0,n.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"introduction"},"Introduction"),(0,r.kt)("p",null,"This is the standard v1.0 for SCS Release 0.\nNote that we intend to only extend it (so it's always backwards compatible),\nbut try to avoid changing in incompatible ways."),(0,r.kt)("h2",{id:"motivation"},"Motivation"),(0,r.kt)("p",null,"In OpenStack environments there is a need to define different flavors for instances.\nThe flavors are pre-defined by the operator, the customer can not change these.\nOpenStack providers thus typically offer a large selection of flavors."),(0,r.kt)("p",null,"While flavors can be discovered (",(0,r.kt)("inlineCode",{parentName:"p"},"openstack flavor list"),"), it is helpful for users (DevOps teams),\nto have"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"A naming scheme that is used across all SCS flavors, so flavor names have the same meaning everywhere."),(0,r.kt)("li",{parentName:"ul"},"Have a guaranteed set of flavors available on all SCS clouds, so these do not need to be discovered.")),(0,r.kt)("p",null,"While not all details will be encoded in the name, the key features should be obvious:\nNumber of vCPUs, RAM, Root Disk.\nExtra features are important as well: There will be flavors with GPU support, fast disks for databases,\nmemory-heavy applications, and other useful aspects of an instance."),(0,r.kt)("p",null,"It may also be important to make the CPU generation clearly recognisable, as this is always a topic in\ndiscussions with customers."),(0,r.kt)("h2",{id:"proposal"},"Proposal"),(0,r.kt)("h3",{id:"type-of-information-included"},"Type of information included"),(0,r.kt)("p",null,"We believe the following characteristics are important in a flavour description:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"left"},"Type"),(0,r.kt)("th",{parentName:"tr",align:"left"},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Generation"),(0,r.kt)("td",{parentName:"tr",align:"left"},"CPU Generation")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Number of CPU"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Number of vCPUs - suffixed by L,V,T,C (see below)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Amount of RAM"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Amount of memory available for the VM")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Performance Class"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Ability to label high-performance CPUs, disks, network")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"CPU Type"),(0,r.kt)("td",{parentName:"tr",align:"left"},"X86-intel, X86-amd, ARM, RISC-V, Generic")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},'"bms"'),(0,r.kt)("td",{parentName:"tr",align:"left"},"Bare Metal System (no virtualization/hypervisor)")))),(0,r.kt)("h3",{id:"complete-proposal"},"Complete Proposal"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Prefix"),(0,r.kt)("th",{parentName:"tr",align:null},"CPU"),(0,r.kt)("th",{parentName:"tr",align:null},"Suffix"),(0,r.kt)("th",{parentName:"tr",align:null},"RAM","[GiB]"),(0,r.kt)("th",{parentName:"tr",align:null},"optional: Disk","[GB]"),(0,r.kt)("th",{parentName:"tr",align:null},"optional: Disk type"),(0,r.kt)("th",{parentName:"tr",align:null},"optional: extra features"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"SCS-")),(0,r.kt)("td",{parentName:"tr",align:null},"N"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"L/V/T/C[i]")),(0,r.kt)("td",{parentName:"tr",align:null},":N",(0,r.kt)("inlineCode",{parentName:"td"},"[u][o]")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"[:["),"M",(0,r.kt)("inlineCode",{parentName:"td"},"x]"),"N",(0,r.kt)("inlineCode",{parentName:"td"},"]")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"[n/s/l/p]")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"[-"),"hyp",(0,r.kt)("inlineCode",{parentName:"td"},"][-hwv]-["),"arch",(0,r.kt)("inlineCode",{parentName:"td"},"["),"N",(0,r.kt)("inlineCode",{parentName:"td"},"][h][-[G/g]"),"X",(0,r.kt)("inlineCode",{parentName:"td"},"["),"N",(0,r.kt)("inlineCode",{parentName:"td"},"][:"),"M",(0,r.kt)("inlineCode",{parentName:"td"},"[h]]][-ib]"))))),(0,r.kt)("p",null,"(Note that N and M are placeholders for numbers here)."),(0,r.kt)("h2",{id:"proposal-details"},"Proposal Details"),(0,r.kt)("h3",{id:"required-cpu-suffixes"},"[REQUIRED]"," CPU Suffixes"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Suffix"),(0,r.kt)("th",{parentName:"tr",align:null},"Meaning"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"C"),(0,r.kt)("td",{parentName:"tr",align:null},"dedicated Core")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"T"),(0,r.kt)("td",{parentName:"tr",align:null},"dedicated Thread (SMT)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"V"),(0,r.kt)("td",{parentName:"tr",align:null},"vCPU (oversubscribed)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"L"),(0,r.kt)("td",{parentName:"tr",align:null},"vCPU (heavily oversubscribed)")))),(0,r.kt)("h4",{id:"baseline"},"Baseline"),(0,r.kt)("p",null,"Note that vCPU oversubscription for a ",(0,r.kt)("inlineCode",{parentName:"p"},"V")," vCPU should be implemented such, that we\ncan guarantee ",(0,r.kt)("inlineCode",{parentName:"p"},"at least 20% of a core in >99% of the time"),"; this can be achieved by\nlimiting vCPU oversubscription to 5x per core (or 3x per thread when SMT/HT is enabled)\nor by more advanced workload management logic. Otherwise ",(0,r.kt)("inlineCode",{parentName:"p"},"L")," (low performance) must be\nused. The >99% is measured over a month (1% is 7.2h/month)."),(0,r.kt)("p",null,"Note that CPUs must use latest microcode to protect against CPU vulnerabilities (Spectre, Meltdown, L1TF, etc.).\nWe expect that microcode gets updated within less than a month of a new release; for CVSS scores above 8,\nwe expect less than a week.\nThe provider must enable at least all mitigations that are enabled by default in the Linux kernel. CPUs that\nare susceptible to L1TF (intel x86 pre Cascade Lake) must switch off hyperthreading OR (in the future)\nuse core scheduling implementations that are deemed to be secure by the SCS security team, or declare themselves\nas insecure with the ",(0,r.kt)("inlineCode",{parentName:"p"},"i")," suffix (see below)."),(0,r.kt)("h4",{id:"higher-oversubscription"},"Higher oversubscription"),(0,r.kt)("p",null,"Must be indicated with a ",(0,r.kt)("inlineCode",{parentName:"p"},"L")," vCPU type (low performance for > 5x/core or > 3x/thread oversubscription and\nthe lack of workload management that would prevent worst case performance <20% in more than 7.2h per month)."),(0,r.kt)("h4",{id:"insufficient-microcode"},"Insufficient microcode"),(0,r.kt)("p",null,"Not using these mitigations must be indicated by an additional ",(0,r.kt)("inlineCode",{parentName:"p"},"i suffix")," for insecure\n(weak protection against CPU vulns through insufficient microcode, lack of disabled hyperthreading\non L1TF susceptible CPUs w/o effective core scheduling or disabled protections on the host/hypervisor)."),(0,r.kt)("h4",{id:"examples"},"Examples"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"SCS-",(0,r.kt)("strong",{parentName:"li"},"2C"),":4:10n"),(0,r.kt)("li",{parentName:"ul"},"SCS-",(0,r.kt)("strong",{parentName:"li"},"2T"),":4:10n"),(0,r.kt)("li",{parentName:"ul"},"SCS-",(0,r.kt)("strong",{parentName:"li"},"2V"),":4:10n"),(0,r.kt)("li",{parentName:"ul"},"SCS-",(0,r.kt)("strong",{parentName:"li"},"2L"),":4:10n"),(0,r.kt)("li",{parentName:"ul"},"SCS-",(0,r.kt)("strong",{parentName:"li"},"2Li"),":4:10n"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("del",{parentName:"li"},"SCS-",(0,r.kt)("strong",{parentName:"del"},"2"),":","*","*","4:10n")," <- CPU suffix missing"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("del",{parentName:"li"},"SCS-",(0,r.kt)("strong",{parentName:"del"},"2iT"),":4:10n")," <- This order is forbidden")),(0,r.kt)("h3",{id:"required-memory"},"[REQUIRED]"," Memory"),(0,r.kt)("h4",{id:"baseline-1"},"Baseline"),(0,r.kt)("p",null,"We expect cloud providers to use ECC memory.\nMemory oversubscription is not recommended.\nIt is allowed to specify half GiBs (e.g. 3.5), though this is discouraged for larger memory sizes (>= 10GiB)."),(0,r.kt)("h4",{id:"no-ecc"},"No ECC"),(0,r.kt)("p",null,"If no ECC is used, the ",(0,r.kt)("inlineCode",{parentName:"p"},"u suffix")," must indicate this."),(0,r.kt)("h4",{id:"enabled-oversubscription"},"Enabled Oversubscription"),(0,r.kt)("p",null,"You have to expose this with the ",(0,r.kt)("inlineCode",{parentName:"p"},"o sufffix"),"."),(0,r.kt)("h4",{id:"examples-1"},"Examples"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"SCS-2C:",(0,r.kt)("strong",{parentName:"li"},"4"),":10n"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C:",(0,r.kt)("strong",{parentName:"li"},"3.5"),":10n"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C:",(0,r.kt)("strong",{parentName:"li"},"4u"),":10n"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C:",(0,r.kt)("strong",{parentName:"li"},"4o"),":10n"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C:",(0,r.kt)("strong",{parentName:"li"},"4uo"),":10n"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("del",{parentName:"li"},"SCS-2C:",(0,r.kt)("strong",{parentName:"del"},"4ou"),":10n")," <- This order is forbidden")),(0,r.kt)("h3",{id:"optional-disk-sizes-and-types"},"[OPTIONAL]"," Disk sizes and types"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Disk type"),(0,r.kt)("th",{parentName:"tr",align:null},"Meaning"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"n"),(0,r.kt)("td",{parentName:"tr",align:null},"Network shared storage (ceph/cinder)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"h"),(0,r.kt)("td",{parentName:"tr",align:null},"Local disk (HDD: SATA/SAS class)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"s"),(0,r.kt)("td",{parentName:"tr",align:null},"Local SSD disk")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"p"),(0,r.kt)("td",{parentName:"tr",align:null},"Local high-perf NVMe")))),(0,r.kt)("h4",{id:"baseline-2"},"Baseline"),(0,r.kt)("p",null,"Note that disk type might be omitted \u2014 the user then can not take any assumptions\non what storage is provided for the root disk (that the image gets provisioned to)."),(0,r.kt)("p",null,"It does make sense for ",(0,r.kt)("inlineCode",{parentName:"p"},"n")," to be requested explicitly to allow for smooth live migration.\n",(0,r.kt)("inlineCode",{parentName:"p"},"h")," typically provides latency advantages vs ",(0,r.kt)("inlineCode",{parentName:"p"},"n")," (but not necessarily bandwidth and\nalso is more likely to fail), ",(0,r.kt)("inlineCode",{parentName:"p"},"s")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"p")," are for applications that need low\nlatency (high IOPS) and bandwidth disk I/O. ",(0,r.kt)("inlineCode",{parentName:"p"},"n")," storage is expected to survive\nsingle-disk and single-node failure."),(0,r.kt)("p",null,"If the disk size is left out, the cloud is expected to allocate a disk (network or local)\nthat is large enough to fit the root file system (",(0,r.kt)("inlineCode",{parentName:"p"},"min_disk")," in image). This automatic\nallocation is indicated with ",(0,r.kt)("inlineCode",{parentName:"p"},":")," without a disk size.\nIf the ",(0,r.kt)("inlineCode",{parentName:"p"},":")," is left out completely, the user must create a boot volume manually and\ntell the instance to boot from it or use the\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.openstack.org/api-ref/compute/?expanded=create-server-detail#create-server"},"block_device_mapping_v2"),"\nmechanism explicitly to create the boot volume from an image."),(0,r.kt)("h4",{id:"multi-provisioned-disk"},"Multi-provisioned Disk"),(0,r.kt)("p",null,"The disk size can be prefixed with ",(0,r.kt)("inlineCode",{parentName:"p"},"Mx prefix"),", where M is an integer specifying that the disk\nis provisioned M times."),(0,r.kt)("h4",{id:"examples-2"},"Examples"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"SCS-2C:4:",(0,r.kt)("strong",{parentName:"li"},"10n")),(0,r.kt)("li",{parentName:"ul"},"SCS-2C:4:",(0,r.kt)("strong",{parentName:"li"},"10s")),(0,r.kt)("li",{parentName:"ul"},"SCS-2C:4:",(0,r.kt)("strong",{parentName:"li"},"10s"),"-bms-z3"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C:4:",(0,r.kt)("strong",{parentName:"li"},"3x10s")," <- Cloud creates three 10GB SSDs"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C:4:",(0,r.kt)("strong",{parentName:"li"},"3x10s"),"-bms-z3"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C:4:",(0,r.kt)("strong",{parentName:"li"},"10")," <- Cloud decides disk type"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C:4:",(0,r.kt)("strong",{parentName:"li"},"10"),"-bms-z3"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C:4:",(0,r.kt)("strong",{parentName:"li"},"n")," <- Cloud decides disk size (min_disk from image or larger)"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C:4:",(0,r.kt)("strong",{parentName:"li"},"n"),"-bms-3"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C:4: <- Cloud decides disk type and size"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C:4:-bms-z3"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C:4:-bms-z3h-GNa:64-ib"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C:4:-ib"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C:4 <- You need to specify a boot volume yourself (boot from volume, or use block_device_mapping_v2)"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C:4-bms-z3"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C:4:3x <- Cloud decides disk type and size and creates three of them (FIXME: Is this useful?)"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C:4:3xs <- Cloud decides size and creates three local SSD volumes (FIXME: useful?)"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C:4:3x10 <- Cloud decides type and creates three 10GB volumes"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("del",{parentName:"li"},"SCS-2C:4:",(0,r.kt)("strong",{parentName:"del"},"1.5n"))," <- You must not specify disk sizes which are not in full GiBs")),(0,r.kt)("h3",{id:"optional-hypervisor"},"[OPTIONAL]"," Hypervisor"),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"default Hypervisor")," is assumed to be ",(0,r.kt)("inlineCode",{parentName:"p"},"KVM"),". Clouds, that offer different hypervisors\nor Bare Metal Systems should indicate the Hypervisor according to the following table:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"hyp"),(0,r.kt)("th",{parentName:"tr",align:null},"Meaning"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"kvm"),(0,r.kt)("td",{parentName:"tr",align:null},"KVM")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"xen"),(0,r.kt)("td",{parentName:"tr",align:null},"Xen")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"vmw"),(0,r.kt)("td",{parentName:"tr",align:null},"VMware")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"hyv"),(0,r.kt)("td",{parentName:"tr",align:null},"Hyper-V")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"bms"),(0,r.kt)("td",{parentName:"tr",align:null},"Bare Metal System")))),(0,r.kt)("h4",{id:"examples-3"},"Examples"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"SCS-2C:4:10n"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C:4:10n-",(0,r.kt)("strong",{parentName:"li"},"bms")),(0,r.kt)("li",{parentName:"ul"},"SCS-2C:4:10n-",(0,r.kt)("strong",{parentName:"li"},"bms"),"-z3h")),(0,r.kt)("h3",{id:"optional-hardware-virtualization--nested-virtualization"},"[OPTIONAL]"," Hardware virtualization / Nested virtualization"),(0,r.kt)("p",null,"If the instances that are created with this flavor support hardware-accelerated\nvirtualization, this can be reflected with the ",(0,r.kt)("inlineCode",{parentName:"p"},"-hwv")," flag (after the optional\nHypervisor flag). On x86, this means that in the instance, the CPU flag vmx (intel)\nor svm (AMD) is available. This will be the case on Bare Metal flavors on almost\nall non-ancient x86 CPUs or if your virtualization hypervisor is configured to\nsupport nested virtualization.\nFlavors without the ",(0,r.kt)("inlineCode",{parentName:"p"},"-hwv")," flag may or may not support hardware virtualization (as we\nrecommend enabling nesting, but don't require flavor names to reflect all\ncapabilities. Flavors may overdeliver ...)"),(0,r.kt)("h4",{id:"examples-4"},"Examples"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"SCS-2C:4:10 <- may or may not support HW virtualization in VMs"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C:4:10-kvm-",(0,r.kt)("strong",{parentName:"li"},"hwv")),(0,r.kt)("li",{parentName:"ul"},"SCS-2C:4:10-",(0,r.kt)("strong",{parentName:"li"},"hwv")," <- not recommended, but allowed"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("del",{parentName:"li"},"SCS-2C:4:10-",(0,r.kt)("strong",{parentName:"del"},"hwv"),"-xen")," <- illegal, wrong ordering")),(0,r.kt)("h3",{id:"optional-cpu-architecture-details"},"[OPTIONAL]"," CPU Architecture Details"),(0,r.kt)("p",null,"Arch details provide more details on the specific CPU:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Vendor"),(0,r.kt)("li",{parentName:"ul"},"Generation"),(0,r.kt)("li",{parentName:"ul"},"Frequency")),(0,r.kt)("h4",{id:"generation-and-vendor"},"Generation and Vendor"),(0,r.kt)("p",null,"The generations are vendor specific and can be left out.\nNot specifying arch means that we have a generic CPU (",(0,r.kt)("strong",{parentName:"p"},"x86-64"),")."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Generation"),(0,r.kt)("th",{parentName:"tr",align:null},"i (Intel x86-64)"),(0,r.kt)("th",{parentName:"tr",align:null},"z (AMD x86-64)"),(0,r.kt)("th",{parentName:"tr",align:null},"\xa0a (AArch64)"),(0,r.kt)("th",{parentName:"tr",align:null},"r (RISC-V)"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"0"),(0,r.kt)("td",{parentName:"tr",align:null},"pre Skylake"),(0,r.kt)("td",{parentName:"tr",align:null},"pre Zen"),(0,r.kt)("td",{parentName:"tr",align:null},"pre Cortex A76"),(0,r.kt)("td",{parentName:"tr",align:null},"TBD")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1"),(0,r.kt)("td",{parentName:"tr",align:null},"Skylake"),(0,r.kt)("td",{parentName:"tr",align:null},"Zen-1 (Naples)"),(0,r.kt)("td",{parentName:"tr",align:null},"A76/NeoN1 class"),(0,r.kt)("td",{parentName:"tr",align:null},"TBD")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"2"),(0,r.kt)("td",{parentName:"tr",align:null},"Cascade Lake"),(0,r.kt)("td",{parentName:"tr",align:null},"Zen-2 (Rome)"),(0,r.kt)("td",{parentName:"tr",align:null},"A78/x1/NeoV1 class"),(0,r.kt)("td",{parentName:"tr",align:null},"TBD")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"3"),(0,r.kt)("td",{parentName:"tr",align:null},"Ice Lake"),(0,r.kt)("td",{parentName:"tr",align:null},"Zen-3 (Milan)"),(0,r.kt)("td",{parentName:"tr",align:null},"A71x/NeoN2 (ARMv9)"),(0,r.kt)("td",{parentName:"tr",align:null},"TBD")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"4"),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null},"Zen-4 (Genoa)"),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null},"TBD")))),(0,r.kt)("p",null,"It is recommended to leave out the ",(0,r.kt)("inlineCode",{parentName:"p"},"0"),' when specifying the old generation; this will\nhelp the parser tool, which assumes 0 for an unspecified value and does leave it\nout when generating the name for comparison. In other words: 0 has a meaning of\n"rather old or unspecified".'),(0,r.kt)("h4",{id:"frequency-suffixes"},"Frequency Suffixes"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Suffix"),(0,r.kt)("th",{parentName:"tr",align:null},"Meaning"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"h"),(0,r.kt)("td",{parentName:"tr",align:null},">2.75GHz all-core")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"hh"),(0,r.kt)("td",{parentName:"tr",align:null},">3.25GHz all-core")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"hhh"),(0,r.kt)("td",{parentName:"tr",align:null},">3.75GHz all-core")))),(0,r.kt)("h4",{id:"examples-5"},"Examples"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"SCS-2C:4:10n"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C:4:10n-",(0,r.kt)("strong",{parentName:"li"},"z")),(0,r.kt)("li",{parentName:"ul"},"SCS-2C:4:10n-",(0,r.kt)("strong",{parentName:"li"},"z3")),(0,r.kt)("li",{parentName:"ul"},"SCS-2C:4:10n-",(0,r.kt)("strong",{parentName:"li"},"z3h")),(0,r.kt)("li",{parentName:"ul"},"SCS-2C:4:10n-",(0,r.kt)("strong",{parentName:"li"},"z3hh")),(0,r.kt)("li",{parentName:"ul"},"SCS-2C:4:10n-bms-",(0,r.kt)("strong",{parentName:"li"},"z")),(0,r.kt)("li",{parentName:"ul"},"SCS-2C:4:10n-bms-",(0,r.kt)("strong",{parentName:"li"},"z3")),(0,r.kt)("li",{parentName:"ul"},"SCS-2C:4:10n-bms-",(0,r.kt)("strong",{parentName:"li"},"z3")),(0,r.kt)("li",{parentName:"ul"},"SCS-2C:4:10n-bms-",(0,r.kt)("strong",{parentName:"li"},"z3h")),(0,r.kt)("li",{parentName:"ul"},"SCS-2C:4:10n-bms-",(0,r.kt)("strong",{parentName:"li"},"z3hh"))),(0,r.kt)("h3",{id:"optional-extra-features"},"[OPTIONAL]"," Extra features"),(0,r.kt)("p",null,"Note that these are optional \u2014 it is recommended for providers to encode this information\ninto the flavor name, so there is a systematic way of differentiating flavors.\nProviders could leave it out however, leaving it to ",(0,r.kt)("inlineCode",{parentName:"p"},"extra_specs")," to make these flavor\ncapabilities discoverable. Nothing prevents providers from registering the same flavor\nunder a secondary (or tertiary) name."),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"-GX[N][:M[h]]")," indicates a Pass-Through GPU from vendor X of gen N with M compute units / SMs / EUs exposed.\n",(0,r.kt)("inlineCode",{parentName:"p"},"-gX[N][:M[h]]")," indicates a vGPU from vendor X of gen N with M compute units / SMs / EUs assigned."),(0,r.kt)("p",null,"Note that the vendor letter is mandatory, generation and compute units are optional."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"GPU"),(0,r.kt)("th",{parentName:"tr",align:null},"Vendor"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"N"),(0,r.kt)("td",{parentName:"tr",align:null},"nVidia")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"A"),(0,r.kt)("td",{parentName:"tr",align:null},"AMD")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"I"),(0,r.kt)("td",{parentName:"tr",align:null},"Intel")))),(0,r.kt)("p",null,"Generations could be nVidia (f=Fermi, k=Kepler, m=Maxwell, p=Pascal, v=Volta, t=turing, a=Ampere, ...),\nAMD (GCN-x=0.x, RDNA1=1, RDNA2=2), intel (Gen9=0.9, Xe(12.1)=1, ...), ...\n(Note: This may need further work to properly reflect what's out there.)"),(0,r.kt)("p",null,"The optional ",(0,r.kt)("inlineCode",{parentName:"p"},"h")," suffix to the comput unit count indicates high-performance (e.g. high freq or special\nhigh bandwidth gfx memory such as HBM);\n",(0,r.kt)("inlineCode",{parentName:"p"},"h")," can be duplicated for even higher performance."),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"-ib")," indicates Inifinband networking."),(0,r.kt)("p",null,"More extensions will be forthcoming."),(0,r.kt)("p",null,"Extensions need to be specified in the above mentioned order."),(0,r.kt)("h2",{id:"proposal-examples"},"Proposal Examples"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Example"),(0,r.kt)("th",{parentName:"tr",align:null},"Decoding"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-2C:4:10n"),(0,r.kt)("td",{parentName:"tr",align:null},"2 dedicated cores (x86-64), 4GiB RAM, 10GB network disk")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-8Ti:32:50p-i1"),(0,r.kt)("td",{parentName:"tr",align:null},"8 dedicated hyperthreads (insecure), Skylake, 32GiB RAM, 50GB local NVMe")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-1L:1u:5"),(0,r.kt)("td",{parentName:"tr",align:null},"1 vCPU (heavily oversubscribed), 1GiB Ram (no ECC), 5GB disk (unspecific)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-16T:64:200s-GNa:64-ib"),(0,r.kt)("td",{parentName:"tr",align:null},"16 dedicated threads, 64GiB RAM, 200GB local SSD, Inifiniband, 64 Passthrough nVidia Ampere SMs")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-4C:16:2x200p-a1"),(0,r.kt)("td",{parentName:"tr",align:null},"4 dedicated Arm64 cores (A78 class), 16GiB RAM, 2x200GB local NVMe drives")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-1V:0.5"),(0,r.kt)("td",{parentName:"tr",align:null},"1 vCPU, 0.5GiB RAM, no disk (boot from cinder volume)")))),(0,r.kt)("h2",{id:"standard-scs-flavors"},"Standard SCS flavors"),(0,r.kt)("p",null,"These are flavors expected to exist on standard SCS clouds (x86-64)."),(0,r.kt)("p",null,"We expect disk sizes to be 5, 10, 20, 50, 100, 200, 500, 1000GB, 2000GB.\nWe expect a typical CPU:Mem","[GiB]"," ratio of 1:4."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"vCPU:RAM ratio"),(0,r.kt)("th",{parentName:"tr",align:null},"Mandatory Flavors"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1:4"),(0,r.kt)("td",{parentName:"tr",align:null},"SCS-1V:4, SCS-1V:4:10")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"2:8"),(0,r.kt)("td",{parentName:"tr",align:null},"SCS-2V:8, SCS-2V:8:20")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"4:16"),(0,r.kt)("td",{parentName:"tr",align:null},"SCS-4V:16, SCS-4V:16:50")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"8:32"),(0,r.kt)("td",{parentName:"tr",align:null},"SCS-8V:32, SCS-8V:32:100")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1:2"),(0,r.kt)("td",{parentName:"tr",align:null},"SCS-1V:2, SCS-1V:2:5")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"2:4"),(0,r.kt)("td",{parentName:"tr",align:null},"SCS-2V:4, SCS-2V:4:10")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"4:8"),(0,r.kt)("td",{parentName:"tr",align:null},"SCS-4V:8, SCS-4V:8:20")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"8:16"),(0,r.kt)("td",{parentName:"tr",align:null},"SCS-8V:16, SCS-8V:16:50")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"16:32"),(0,r.kt)("td",{parentName:"tr",align:null},"SCS-16V:32, SCS-16V:32:100")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1:8"),(0,r.kt)("td",{parentName:"tr",align:null},"SCS-1V:8, SCS-1V:8:20")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"2:16"),(0,r.kt)("td",{parentName:"tr",align:null},"SCS-2V:16, SCS-2V:16:50")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"4:32"),(0,r.kt)("td",{parentName:"tr",align:null},"SCS-4V:32, SCS-4V:32:100")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1:1"),(0,r.kt)("td",{parentName:"tr",align:null},"SCS-1L:1, SCS-1L:1:5")))),(0,r.kt)("p",null,"Note that all vCPUs are oversubscribed \u2014 the smallest ",(0,r.kt)("inlineCode",{parentName:"p"},"1L:1")," flavor allows\nfor heavy oversubscription (note the ",(0,r.kt)("inlineCode",{parentName:"p"},"L"),"), and thus can be offered very\ncheaply \u2014 imagine jump hosts ...\nDisks types are not specified (and expected to be n or h typically)."),(0,r.kt)("p",null,"The design allows for small clouds (with CPUs with 16 Threads, 64GiB RAM\ncompute hosts) to offer all flavors."),(0,r.kt)("p",null,"Note: Compared to previous drafts, we have heavily reduced the variations\non disk sizes \u2014 this reflects that for the standard networked cinder\ndisks, you can pass block",(0,r.kt)("em",{parentName:"p"},"device_mapping_v2 on server (VM) creation to\nallocate a boot disk of any size you desire. We have scaled the few\nmandatory disk sizes with the amount of RAM. For each flavor there is\nalso one ","_","without")," a pre-attached disk \u2014 these are meant to be used\nto boot from a volume (either created beforehand or allocated on-the-fly\nwith block_device_mapping_v2, e.g.\n",(0,r.kt)("inlineCode",{parentName:"p"},"openstack server create --flavor SCS-1V:2 --block-device-mapping sda=IMGUUID:image:12:true"),"\nto create a bootable 12G cinder volume from image ",(0,r.kt)("inlineCode",{parentName:"p"},"IMGUUID")," that gets tied to the VM\ninstance lifecycle.)"),(0,r.kt)("h2",{id:"naming-policies"},"Naming policies"),(0,r.kt)("p",null,"To be certified as an SCS compliant x86-64 IaaS platform, you must offer all standard SCS flavors\naccording to the previous section. (We may define a mechanism that allows exceptions to be\ngranted in a way that makes this very transparent and visible to clients.)"),(0,r.kt)("p",null,"You are allowed to understate your performance; you may implement a SCS-1Vl:1:5 flavor with\na flavor that actually implements SCS-1T:1:5n (i.e. you dedicate a secured hyperthread instead\nof high oversubscription) or even SCS-1D:1.5:8s (1 dedicated core, 50% more RAM and a 8GiB SSD)."),(0,r.kt)("p",null,"We expect all cloud providers to offer the short, less specific flavor names (such as SCS-8V:32:100).\nLarger providers that offer more details are expected to still also offer the short variants\nfor usability and easier portability, even beyond the mandated flavors."),(0,r.kt)("p",null,"You must be very careful to expose low vCPU guarantees (",(0,r.kt)("inlineCode",{parentName:"p"},"L")," instead ov ",(0,r.kt)("inlineCode",{parentName:"p"},"V"),"), insecure\nhyperthreading/microcode ",(0,r.kt)("inlineCode",{parentName:"p"},"i"),", non-ECC-RAM ",(0,r.kt)("inlineCode",{parentName:"p"},"u"),", memory oversubscription ",(0,r.kt)("inlineCode",{parentName:"p"},"o"),". Note that omitting these qualifiers is\noverstating your security, reliability or performance properties and may be reason for\nclients to feel betrayed or claim damages. It might in extreme cases also cause SCS to withdraw certification\nalong with public statements."),(0,r.kt)("p",null,"You may offer additional SCS- flavors, following the naming scheme outlined here."),(0,r.kt)("p",null,"You may offer additional flavors, not following above scheme."),(0,r.kt)("p",null,"You must not offer flavors with the SCS- prefix which do not follow this naming scheme.\nYou must not extend the SCS naming scheme with your own suffices; you are encouraged however\nto suggest extensions that we can discuss and add to the official scheme."),(0,r.kt)("p",null,"Note that all letters are case-sensitive.\nIn case you wonder: Feature indicators are capitalized, modifiers are lower case.\n(An exception is the uppercase -G for a passthrough GPU vs. lowercase -g for vGPU.)"),(0,r.kt)("h3",{id:"rationale"},"Rationale"),(0,r.kt)("p",null,"Note that we expect most clouds to prefer short flavor names,\nnot indicating CPU details or hypervisor types. See above list\nof standard flavors to get a feeling."),(0,r.kt)("p",null,"However, more successful providers will often need to differentiate their\nofferings in response to customer demand and allow customers to request\nflavors with specific detailed properties. The goal of this proposal is to avoid\nproviders to invent their own names and then refer customers to ",(0,r.kt)("inlineCode",{parentName:"p"},"extra_specs"),"\nor worse a non-machine-readable service description to find out the details."),(0,r.kt)("p",null,"So a cloud provider might well evolve from offering ",(0,r.kt)("inlineCode",{parentName:"p"},"SCS-8T:16:50")," to offering\n",(0,r.kt)("inlineCode",{parentName:"p"},"SCS-8T:16:50n"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"SCS-8T:16:50n-i2")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"SCS-8T:16:50n-a2")," to specify that he\nis using network disks and offer a choice b/w intel Cascade-Lake and AMD Rome.\nWe would expect the cloud provider to still offer the generic flavor\n",(0,r.kt)("inlineCode",{parentName:"p"},"SCS-8C:16:50")," and allow the scheduler (placement service) to pick both more\nspecific types (or just one if e.g. capacity management considerations suggest\nso). We would expect providers in such cases to ensure that the price of a requested\nflavor does not depend on the scheduler decisions."),(0,r.kt)("p",null,"We are looking into the ",(0,r.kt)("a",{parentName:"p",href:"https://docs.openstack.org/image-guide/introduction.html#metadata-definition-metadefs-service"},"metadefs"),"\nmechanism and ",(0,r.kt)("a",{parentName:"p",href:"https://docs.openstack.org/api-guide/compute/extra_specs_and_properties.html"},"extra_specs"),"\nto allow customers to ask for specific flavor properties without the need to\nencode all these flavor details into the flavor name, so the optional pieces\nmay not be needed much. However, there must be a way to request flavor\nproperties without encoding the need into an image \u2014 this indirection is\nconsidered broken by the SCS team."),(0,r.kt)("h2",{id:"validation"},"Validation"),(0,r.kt)("p",null,"There is a script in ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Tests/iaas/flavor-naming/flavor-name-check.py"},"flavor_name_check.py"),"\nwhich can be used to decode, validate and construct flavor names.\nThis script must stay in sync with the specification text."),(0,r.kt)("p",null,"Ensure you have your OpenStack tooling (",(0,r.kt)("inlineCode",{parentName:"p"},"python3-openstackclient"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"OS_CLOUD"),") setup and call\n",(0,r.kt)("inlineCode",{parentName:"p"},"tools/flavor-name-check.py -c $(openstack flavor list -f value -c Name)")," to get a report\non the flavor list compliance of the cloud environment."),(0,r.kt)("h2",{id:"beyond-scs-gaia-x"},"Beyond SCS: Gaia-X"),(0,r.kt)("p",null,'Some providers might offer VM services ("IaaS") without trying to adhere to SCS standards,\nyet still finding the flavor naming standards useful. The Gaia-X Technical Committee\'s\nProvider Working Group (WG) would seem like a logical place for such dicussions then.\nIf so, we could\nreplace the SCS- prefix with a GX- prefix and transfer the naming scheme governance from\nthe SCS project to the Gaia-X Provider WG (where we participate). SCS certification would\nthen reference the Gaia-X flavor naming standard as a requirement.'))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9d187656.4abc6493.js b/assets/js/9d187656.4abc6493.js new file mode 100644 index 0000000000..fb8d7037f4 --- /dev/null +++ b/assets/js/9d187656.4abc6493.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5942],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var a=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?r(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):r(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n,a,o={},r=Object.keys(e);for(a=0;a<r.length;a++)n=r[a],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a<r.length;a++)n=r[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var p=a.createContext({}),l=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},c=function(e){var t=l(e.components);return a.createElement(p.Provider,{value:t},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,p=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),m=l(n),d=o,f=m["".concat(p,".").concat(d)]||m[d]||u[d]||r;return n?a.createElement(f,s(s({ref:t},c),{},{components:n})):a.createElement(f,s({ref:t},c))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,s=new Array(r);s[0]=d;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[m]="string"==typeof e?e:o,s[1]=i;for(var l=2;l<r;l++)s[l]=n[l];return a.createElement.apply(null,s)}return a.createElement.apply(null,n)}d.displayName="MDXCreateElement"},61966:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>s,default:()=>u,frontMatter:()=>r,metadata:()=>i,toc:()=>l});var a=n(87462),o=(n(67294),n(3905));const r={},s="Overview",i={unversionedId:"operating-scs/components/status-page/docs/overview",id:"operating-scs/components/status-page/docs/overview",title:"Overview",description:"Service providers often times want to communicate the status of their systems transparently to their users.",source:"@site/docs/04-operating-scs/components/status-page/docs/overview.md",sourceDirName:"04-operating-scs/components/status-page/docs",slug:"/operating-scs/components/status-page/docs/overview",permalink:"/docs/operating-scs/components/status-page/docs/overview",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/04-operating-scs/components/status-page/docs/overview.md",tags:[],version:"current",frontMatter:{},sidebar:"docs",previous:{title:"Status Page API",permalink:"/docs/category/status-page-api"},next:{title:"Component Overview",permalink:"/docs/operating-scs/components/status-page/docs/component_overview"}},p={},l=[{value:"The SCS status page <strong>API</strong>",id:"the-scs-status-page-api",level:2},{value:"Reference implementation",id:"reference-implementation",level:3},{value:"The SCS status page <strong>frontend</strong>",id:"the-scs-status-page-frontend",level:2},{value:"Reference implementation",id:"reference-implementation-1",level:3}],c={toc:l},m="wrapper";function u(e){let{components:t,...n}=e;return(0,o.kt)(m,(0,a.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"overview"},"Overview"),(0,o.kt)("p",null,'Service providers often times want to communicate the status of their systems transparently to their users.\nA commonly used pattern is to provide a "status page" web application, where the current system health as well as recent incidents are made available.'),(0,o.kt)("p",null,"SCS strives to implement a status page that works well, while being interoperable with other systems."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"How was the decision to implement a new status page application made? What were the requirements? See the ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/1fb174da1ee906f0da6a8bbefbd3d95884df5669/Standards/scs-0400-v1-status-page-create-decision.md"},"decision record"),".")),(0,o.kt)("p",null,'To be easily interoperable with other software, being "API-first" is a priority.\nAs such, the status page should not ',(0,o.kt)("em",{parentName:"p"},"need to")," be a typical monolithic web application (even though it could be), hence making it possible to split functionality into an API server and a frontend component."),(0,o.kt)("h2",{id:"the-scs-status-page-api"},"The SCS status page ",(0,o.kt)("strong",{parentName:"h2"},"API")),(0,o.kt)("p",null,"The SCS status page ",(0,o.kt)("strong",{parentName:"p"},"API")," (as opposed to actual implementations) is supposed to be as un-opinionated as possible regarding deployment, user management, persistence and tech stack, to allow operators/developers (1) to make their own decisions regarding these topics and (2) to quickly implement the API with their own tech stack opinions, if the reference implementation does not fit theirs."),(0,o.kt)("p",null,"In particular, the ",(0,o.kt)("strong",{parentName:"p"},"API")," has no opinion about:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"How authentication/authorization is done (apart from splitting Read-only from Read-write ",(0,o.kt)("sup",{parentName:"li",id:"fnref-1"},(0,o.kt)("a",{parentName:"sup",href:"#fn-1",className:"footnote-ref"},"1")),"; See below)"),(0,o.kt)("li",{parentName:"ul"},"Server implementation, used database, deployment automation, high availability")),(0,o.kt)("p",null,"However, as un-opinionated the API (in its first iteration) strives to be, it is...:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"a REST API (no GRPC/GraphQL/...)"),(0,o.kt)("li",{parentName:"ul"},"defined using an OpenAPI file to make use of OpenAPI tooling"),(0,o.kt)("li",{parentName:"ul"},"split in two parts ",(0,o.kt)("sup",{parentName:"li",id:"fnref-1"},(0,o.kt)("a",{parentName:"sup",href:"#fn-1",className:"footnote-ref"},"1")),":",(0,o.kt)("ol",{parentName:"li"},(0,o.kt)("li",{parentName:"ol"},"Read-only anonymous access"),(0,o.kt)("li",{parentName:"ol"},"Read-write authenticated access")))),(0,o.kt)("h3",{id:"reference-implementation"},"Reference implementation"),(0,o.kt)("p",null,"It is envisioned to have a well-maintained reference implementation of the status page API with some basic tech stack decisions made, to not ",(0,o.kt)("em",{parentName:"p"},"require")," anyone to implement the API themselves:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Programming Language: Go"),(0,o.kt)("li",{parentName:"ul"},"Persistence: Postgres compatible database")),(0,o.kt)("h2",{id:"the-scs-status-page-frontend"},"The SCS status page ",(0,o.kt)("strong",{parentName:"h2"},"frontend")),(0,o.kt)("p",null,"The SCS status page ",(0,o.kt)("strong",{parentName:"p"},"frontend")," is supposed to be an application which uses the status page API to get information. This could be an CLI tool as well as an web application."),(0,o.kt)("h3",{id:"reference-implementation-1"},"Reference implementation"),(0,o.kt)("p",null,"It is envisioned to have a well-maintained reference implementation of an status page frontend with some basic tech stack decisions made:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Platform: Web (HTML/JS/...)"),(0,o.kt)("li",{parentName:"ul"},"Framework: VueJS, Vuetify")),(0,o.kt)("div",{className:"footnotes"},(0,o.kt)("hr",{parentName:"div"}),(0,o.kt)("ol",{parentName:"div"},(0,o.kt)("li",{parentName:"ol",id:"fn-1"},"In the future",(0,o.kt)("a",{parentName:"li",href:"#fnref-1",className:"footnote-backref"},"\u21a9")))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9e10b8d6.a1122053.js b/assets/js/9e10b8d6.a1122053.js new file mode 100644 index 0000000000..934a12a6bb --- /dev/null +++ b/assets/js/9e10b8d6.a1122053.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8645],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>g});var n=r(67294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function a(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var u=n.createContext({}),s=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):c(c({},t),e)),r},p=function(e){var t=s(e.components);return n.createElement(u.Provider,{value:t},e.children)},l="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,u=e.parentName,p=a(e,["components","mdxType","originalType","parentName"]),l=s(r),f=o,g=l["".concat(u,".").concat(f)]||l[f]||d[f]||i;return r?n.createElement(g,c(c({ref:t},p),{},{components:r})):n.createElement(g,c({ref:t},p))}));function g(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,c=new Array(i);c[0]=f;var a={};for(var u in t)hasOwnProperty.call(t,u)&&(a[u]=t[u]);a.originalType=e,a[l]="string"==typeof e?e:o,c[1]=a;for(var s=2;s<i;s++)c[s]=r[s];return n.createElement.apply(null,c)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},46458:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>c,default:()=>d,frontMatter:()=>i,metadata:()=>a,toc:()=>s});var n=r(87462),o=(r(67294),r(3905));const i={},c="Guide 1",a={unversionedId:"operating-scs/guides/guide-1",id:"operating-scs/guides/guide-1",title:"Guide 1",description:"TODO",source:"@site/docs/04-operating-scs/01-guides/guide-1.md",sourceDirName:"04-operating-scs/01-guides",slug:"/operating-scs/guides/guide-1",permalink:"/docs/operating-scs/guides/guide-1",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/04-operating-scs/01-guides/guide-1.md",tags:[],version:"current",frontMatter:{}},u={},s=[],p={toc:s},l="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(l,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"guide-1"},"Guide 1"),(0,o.kt)("p",null,"TODO"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9e4087bc.41d5876d.js b/assets/js/9e4087bc.41d5876d.js new file mode 100644 index 0000000000..fc01c8933d --- /dev/null +++ b/assets/js/9e4087bc.41d5876d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3608],{63169:(e,t,a)=>{a.r(t),a.d(t,{default:()=>o});var r=a(67294),l=a(39960),n=a(95999),c=a(1944),m=a(70179);function s(e){let{year:t,posts:a}=e;return r.createElement(r.Fragment,null,r.createElement("h3",null,t),r.createElement("ul",null,a.map((e=>r.createElement("li",{key:e.metadata.date},r.createElement(l.Z,{to:e.metadata.permalink},e.metadata.formattedDate," - ",e.metadata.title))))))}function i(e){let{years:t}=e;return r.createElement("section",{className:"margin-vert--lg"},r.createElement("div",{className:"container"},r.createElement("div",{className:"row"},t.map(((e,t)=>r.createElement("div",{key:t,className:"col col--4 margin-vert--lg"},r.createElement(s,e)))))))}function o(e){let{archive:t}=e;const a=(0,n.I)({id:"theme.blog.archive.title",message:"Archive",description:"The page & hero title of the blog archive page"}),l=(0,n.I)({id:"theme.blog.archive.description",message:"Archive",description:"The page & hero description of the blog archive page"}),s=function(e){const t=e.reduceRight(((e,t)=>{const a=t.metadata.date.split("-")[0],r=e.get(a)??[];return e.set(a,[t,...r])}),new Map);return Array.from(t,(e=>{let[t,a]=e;return{year:t,posts:a}}))}(t.blogPosts);return r.createElement(r.Fragment,null,r.createElement(c.d,{title:a,description:l}),r.createElement(m.Z,null,r.createElement("header",{className:"hero hero--primary"},r.createElement("div",{className:"container"},r.createElement("h1",{className:"hero__title"},a),r.createElement("p",{className:"hero__subtitle"},l))),r.createElement("main",null,s.length>0&&r.createElement(i,{years:s}))))}}}]); \ No newline at end of file diff --git a/assets/js/9f356e5b.0298bb37.js b/assets/js/9f356e5b.0298bb37.js new file mode 100644 index 0000000000..9b9b4b127f --- /dev/null +++ b/assets/js/9f356e5b.0298bb37.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9279],{3905:(e,r,t)=>{t.d(r,{Zo:()=>p,kt:()=>d});var n=t(67294);function o(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function c(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function a(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?c(Object(t),!0).forEach((function(r){o(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):c(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}function i(e,r){if(null==e)return{};var t,n,o=function(e,r){if(null==e)return{};var t,n,o={},c=Object.keys(e);for(n=0;n<c.length;n++)t=c[n],r.indexOf(t)>=0||(o[t]=e[t]);return o}(e,r);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(n=0;n<c.length;n++)t=c[n],r.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var u=n.createContext({}),l=function(e){var r=n.useContext(u),t=r;return e&&(t="function"==typeof e?e(r):a(a({},r),e)),t},p=function(e){var r=l(e.components);return n.createElement(u.Provider,{value:r},e.children)},s="mdxType",f={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},v=n.forwardRef((function(e,r){var t=e.components,o=e.mdxType,c=e.originalType,u=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),s=l(t),v=o,d=s["".concat(u,".").concat(v)]||s[v]||f[v]||c;return t?n.createElement(d,a(a({ref:r},p),{},{components:t})):n.createElement(d,a({ref:r},p))}));function d(e,r){var t=arguments,o=r&&r.mdxType;if("string"==typeof e||o){var c=t.length,a=new Array(c);a[0]=v;var i={};for(var u in r)hasOwnProperty.call(r,u)&&(i[u]=r[u]);i.originalType=e,i[s]="string"==typeof e?e:o,a[1]=i;for(var l=2;l<c;l++)a[l]=t[l];return n.createElement.apply(null,a)}return n.createElement.apply(null,t)}v.displayName="MDXCreateElement"},37951:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>u,contentTitle:()=>a,default:()=>f,frontMatter:()=>c,metadata:()=>i,toc:()=>l});var n=t(87462),o=(t(67294),t(3905));const c={},a="Architecture",i={unversionedId:"iaas/overview/architecture",id:"iaas/overview/architecture",title:"Architecture",description:"TODO",source:"@site/docs/02-iaas/overview/architecture.md",sourceDirName:"02-iaas/overview",slug:"/iaas/overview/architecture",permalink:"/docs/iaas/overview/architecture",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/overview/architecture.md",tags:[],version:"current",frontMatter:{}},u={},l=[],p={toc:l},s="wrapper";function f(e){let{components:r,...t}=e;return(0,o.kt)(s,(0,n.Z)({},p,t,{components:r,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"architecture"},"Architecture"),(0,o.kt)("p",null,"TODO"))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9fb1f91e.1f39b355.js b/assets/js/9fb1f91e.1f39b355.js new file mode 100644 index 0000000000..b7ff6a38c9 --- /dev/null +++ b/assets/js/9fb1f91e.1f39b355.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2602],{35022:e=>{e.exports=JSON.parse('{"title":"K8s Cluster API Provider","slug":"/category/k8s-cluster-api-provider","permalink":"/docs/category/k8s-cluster-api-provider","navigation":{"previous":{"title":"Components","permalink":"/docs/category/components-1"},"next":{"title":"Overview","permalink":"/docs/container/components/k8s-cluster-api-provider/doc/overview"}}}')}}]); \ No newline at end of file diff --git a/assets/js/a0b1bbd7.f2667178.js b/assets/js/a0b1bbd7.f2667178.js new file mode 100644 index 0000000000..1ad3971f18 --- /dev/null +++ b/assets/js/a0b1bbd7.f2667178.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9398],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function s(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?s(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):s(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function i(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},s=Object.keys(e);for(n=0;n<s.length;n++)a=s[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n<s.length;n++)a=s[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var l=n.createContext({}),p=function(e){var t=n.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=p(e.components);return n.createElement(l.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,s=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=p(a),m=r,h=d["".concat(l,".").concat(m)]||d[m]||c[m]||s;return a?n.createElement(h,o(o({ref:t},u),{},{components:a})):n.createElement(h,o({ref:t},u))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var s=a.length,o=new Array(s);o[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[d]="string"==typeof e?e:r,o[1]=i;for(var p=2;p<s;p++)o[p]=a[p];return n.createElement.apply(null,o)}return n.createElement.apply(null,a)}m.displayName="MDXCreateElement"},53179:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>c,frontMatter:()=>s,metadata:()=>i,toc:()=>p});var n=a(87462),r=(a(67294),a(3905));const s={},o="Release Notes for SCS Release 5",i={unversionedId:"releases/Release5",id:"releases/Release5",title:"Release Notes for SCS Release 5",description:"(Release Date: 2023-09-20)",source:"@site/docs/06-releases/Release5.md",sourceDirName:"06-releases",slug:"/releases/Release5",permalink:"/docs/releases/Release5",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/06-releases/Release5.md",tags:[],version:"current",frontMatter:{},sidebar:"docs",previous:{title:"Release Notes for SCS Release 4",permalink:"/docs/releases/Release4"},next:{title:"Frequently Asked Questions",permalink:"/docs/faq/"}},l={},p=[{value:"Scope",id:"scope",level:2},{value:"Component Versions and User-visible improvements (highlights)",id:"component-versions-and-user-visible-improvements-highlights",level:2},{value:"IaaS",id:"iaas",level:3},{value:"Container Management",id:"container-management",level:3},{value:"Preview: Cluster-Stacks",id:"preview-cluster-stacks",level:3},{value:"Operations and IAM related",id:"operations-and-iam-related",level:3},{value:"SCS Developer focused improvements (Cloud-in-a-Box, testbed and k8s cluster management)",id:"scs-developer-focused-improvements-cloud-in-a-box-testbed-and-k8s-cluster-management",level:3},{value:"Project Infrastructure",id:"project-infrastructure",level:3},{value:"Upgrade/Migration notes",id:"upgrademigration-notes",level:2},{value:"Removals",id:"removals",level:2},{value:"Deprecations",id:"deprecations",level:2},{value:"Deprecations via OSISM",id:"deprecations-via-osism",level:3},{value:"Security Fixes",id:"security-fixes",level:2},{value:"Resolved Issues",id:"resolved-issues",level:2},{value:"Standards Conformance",id:"standards-conformance",level:2},{value:"Release Tagging",id:"release-tagging",level:2},{value:"List of known issues & restrictions in R5",id:"list-of-known-issues--restrictions-in-r5",level:2},{value:"Contributing",id:"contributing",level:2},{value:"Thanks",id:"thanks",level:2}],u={toc:p},d="wrapper";function c(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,n.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"release-notes-for-scs-release-5"},"Release Notes for SCS Release 5"),(0,r.kt)("p",null,"(Release Date: 2023-09-20)"),(0,r.kt)("h2",{id:"scope"},"Scope"),(0,r.kt)("p",null,"Just as our previous release, Release 5 has been developed alongside a set of associated outcomes.\nThese outcomes are comprised of:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"SCS is standardized"),(0,r.kt)("li",{parentName:"ul"},"SCS is understandable"),(0,r.kt)("li",{parentName:"ul"},"SCS is transparent"),(0,r.kt)("li",{parentName:"ul"},"SCS is continuously built and tested"),(0,r.kt)("li",{parentName:"ul"},"SCS is opinionated"),(0,r.kt)("li",{parentName:"ul"},"SCS enables")),(0,r.kt)("h2",{id:"component-versions-and-user-visible-improvements-highlights"},"Component Versions and User-visible improvements (highlights)"),(0,r.kt)("h3",{id:"iaas"},"IaaS"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The IaaS reference implementation is based on ",(0,r.kt)("a",{parentName:"li",href:"https://release.osism.tech/notes/6.0.0.html"},"OSISM 6.0.0"),"."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://releases.openstack.org/antelope/highlights.html"},"OpenStack 2023.1 (Antelope)")),(0,r.kt)("li",{parentName:"ul"},"Default Ceph version is now ",(0,r.kt)("a",{parentName:"li",href:"https://docs.ceph.com/en/reef/releases/quincy/#v17-2-5-quincy"},"Ceph Quincy"),"."),(0,r.kt)("li",{parentName:"ul"},"OVN and OVS have been updated to their latest versions (OVN: 23.06.1, OVS: 3.2.0)."),(0,r.kt)("li",{parentName:"ul"},"IPv6 east-west and north-south support is present and documented upstream."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/osism/cloud-in-a-box"},"Cloud-in-a-Box")," now comes with Swift enabled as well as the option\nfor secondary NIC for external connectivity.")),(0,r.kt)("h3",{id:"container-management"},"Container Management"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The Kubernetes Cluster Management solution is ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/SovereignCloudStack/k8s-cluster-api-provider/blob/main/Release-Notes-R5.md"},"available as version 6.0.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/kubernetes/kubernetes"},"Kubernetes")," v1.24 .. ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/kubernetes/kubernetes/releases/tag/v1.27.6"},"1.27")," are officially supported. ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/kubernetes/kubernetes/releases/tag/v1.28.2"},"v1.28")," also works (technical preview until officially supported by capo) as do older versions (with downgrading nginx-ingress), matching OCCM and CSI versions."),(0,r.kt)("li",{parentName:"ul"},"Cluster-API (capi) v1.5.1, Cluster-API provider for Openstack (capo) v0.7.3 "),(0,r.kt)("li",{parentName:"ul"},"The node images now use Ubuntu 22.04, the management host can use Ubuntu 22.04 or Debian 12."),(0,r.kt)("li",{parentName:"ul"},"Cilium v1.14.1, default now, though Calico (3.26.x) is still supported."),(0,r.kt)("li",{parentName:"ul"},"Cilium also brings the upcoming gateway API (opt-in) as technical preview."),(0,r.kt)("li",{parentName:"ul"},"The Harbor container registry can now be rolled out with each cluster."),(0,r.kt)("li",{parentName:"ul"},"The clusters can use a registry as cache to upstream dockerhub or gcr registries."),(0,r.kt)("li",{parentName:"ul"},"The cluster management now works also on OpenStack clouds with a custom CA."),(0,r.kt)("li",{parentName:"ul"},"Storage snapshots are supported now (fix was also backported to maintained branches)."),(0,r.kt)("li",{parentName:"ul"},"Diskless flavors are supported everywhere (cluster-management, health-monitor)."),(0,r.kt)("li",{parentName:"ul"},"etcd defragmentation and backup."),(0,r.kt)("li",{parentName:"ul"},"Controls for pod and service IP ranges.")),(0,r.kt)("h3",{id:"preview-cluster-stacks"},"Preview: Cluster-Stacks"),(0,r.kt)("p",null,"The old scripts that are used to create, change and delete Kubernetes clusters with\nCluster API will be replaced by a proper Operator in the next release. A description can be found at the\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/cluster-stacks"},"cluster-stacks"),"\nand ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/cluster-stack-operator"},"cluster-stack-operator"),"\nrepositories. The technical preview can be tried with the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/cluster-stacks-demo"},"cluster-stacks-demo"),".\nThis solution will fit more nicely into the CNCF landscape and\nalso allow for easier support of IaaS solutions that do not comply to our SCS\nIaaS standards."),(0,r.kt)("h3",{id:"operations-and-iam-related"},"Operations and IAM related"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"A number of improvements when using identity federation via OIDC has been added, including\naddressing openstack CLI usage with PKCE Device Authz Grant, logout, and the usage of a\nproxy realm in keycloak. Improvements have been contributed to upstream keystone."),(0,r.kt)("li",{parentName:"ul"},"With the ",(0,r.kt)("inlineCode",{parentName:"li"},"openstack-resource-manager")," a new day 2 operations tool has been added.\nFurthermore an osism role for tuned to optimize system profiles is now present."),(0,r.kt)("li",{parentName:"ul"},"The ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/osism/openstack-flavor-manager"},"openstack-flavor-manager")," is now able to create all standard, mandatory SCS flavors for you."),(0,r.kt)("li",{parentName:"ul"},"Scaphandre Prometheus Exporter has been added to export power consumption metrics more easily."),(0,r.kt)("li",{parentName:"ul"},"To optimize system profiles an osism role for tuned is now present."),(0,r.kt)("li",{parentName:"ul"},"Full support for air-gapped installation and operation of environments."),(0,r.kt)("li",{parentName:"ul"},"A migration script and guide for moving from R4 to R5 clusters is available."),(0,r.kt)("li",{parentName:"ul"},"Metering has been improved and a reference billing API implementation is available as technical preview.")),(0,r.kt)("h3",{id:"scs-developer-focused-improvements-cloud-in-a-box-testbed-and-k8s-cluster-management"},"SCS Developer focused improvements (Cloud-in-a-Box, testbed and k8s cluster management)"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Documentation on testbed and Cloud-in-a-Box have been reworked."),(0,r.kt)("li",{parentName:"ul"},"Reflecting CiaB's usage as edge cloud appliance, it now receives more automated testing.")),(0,r.kt)("h3",{id:"project-infrastructure"},"Project Infrastructure"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"zuul.scs.community now complements OSISM's existing zuul infrastructure and is used also\nby the container layer to execute the CNCF e2e tests."),(0,r.kt)("li",{parentName:"ul"},"registry.scs.community has been migrated to a new IaaS location (documented in a blog\narticle) and is kept up-to-date now.")),(0,r.kt)("h2",{id:"upgrademigration-notes"},"Upgrade/Migration notes"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"For the IaaS reference implementation, please refer to the ",(0,r.kt)("a",{parentName:"li",href:"https://release.osism.tech/notes/6.0.0.html#upgrade-notes"},"OSISM 6.0.0 Upgrade Notes"),".")),(0,r.kt)("h2",{id:"removals"},"Removals"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Please check the removals for OSISM in the ",(0,r.kt)("a",{parentName:"p",href:"https://release.osism.tech/notes/6.0.0.html#removals"},"upstream removal notices"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"The services ",(0,r.kt)("inlineCode",{parentName:"p"},"minio.services.osism.tech")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"harbor.services.osism.tech")," are deprecated and will be turned of on October 20th, 2023."))),(0,r.kt)("h2",{id:"deprecations"},"Deprecations"),(0,r.kt)("h3",{id:"deprecations-via-osism"},"Deprecations via OSISM"),(0,r.kt)("p",null,"For these please also refer to the ",(0,r.kt)("a",{parentName:"p",href:"https://release.osism.tech/notes/6.0.0.html#deprecations"},"upstream deprecation notices"),"."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"It is again noted that the old scripts of the form ",(0,r.kt)("inlineCode",{parentName:"p"},"osism-")," will be removed in the future.\nA note has been added to the scripts showing this when they are executed.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"The following services are deprecated and will be removed with R6 (OSISM 6.1.0):"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Patchman"),(0,r.kt)("li",{parentName:"ul"},"Adminer"),(0,r.kt)("li",{parentName:"ul"},"Patchman Client"),(0,r.kt)("li",{parentName:"ul"},"Virtualbmc"),(0,r.kt)("li",{parentName:"ul"},"Bird")))),(0,r.kt)("h2",{id:"security-fixes"},"Security Fixes"),(0,r.kt)("p",null,"Throughout the Release 5 development cycle, the SCS project issued two security advisories for upstream components:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"In April 2023 an advisory in Open vSwitch (OvS) (",(0,r.kt)("a",{parentName:"p",href:"https://cve.report/CVE-2023-1668"},"CVE-2023-1668")," was issued.\nOur ",(0,r.kt)("a",{parentName:"p",href:"https://scs.community/security/2023/04/21/cve-2023-1668/"},"advisory"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"In May 2023 an advisory affecting the OpenStack component Cinder (",(0,r.kt)("a",{parentName:"p",href:"https://cve.report/CVE-2023-2088"},"CVE-2023-2088"),") was issued.\nOur ",(0,r.kt)("a",{parentName:"p",href:"https://scs.community/security/2023/05/10/cve-2023-2088/"},"advisory"),"."))),(0,r.kt)("h2",{id:"resolved-issues"},"Resolved Issues"),(0,r.kt)("p",null,"Numerous minor issue have been resolved. The most important steps on the IaaS side probably being the move to ceph Quincy\nto avoid running out of upstream support. On the container side, the fix of storage snapshots is probably most significant."),(0,r.kt)("p",null,"For details, we again refer to the ",(0,r.kt)("a",{parentName:"p",href:"https://release.osism.tech/notes/6.0.0.html"},"OSISM")," and\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/k8s-cluster-api-provider/blob/main/Release-Notes-R5.md"},"k8s-cluster-api-provider")," release notes."),(0,r.kt)("h2",{id:"standards-conformance"},"Standards Conformance"),(0,r.kt)("p",null,"A new certification set is expected in December. It will ensure we\nrun all automated tests also for all new standards, such as\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Standards/scs-0100-v3-flavor-naming.md"},"v3 flavor naming"),",\nand the (previously included) ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Standards/scs-0103-v1-standard-flavors.md"},"v1 standard flavors")," -- which includes the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Standards/scs-0110-v1-ssd-flavors.md$a"},"new SSD flavors"),", the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Standards/scs-0101-v1-entropy.md"},"v1 entropy standard"),". We have also split image naming and standard image recommendations into ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Standards/scs-0104-v1-standard-images.md"},"v1 standards images"),"."),(0,r.kt)("p",null,"Requirements for ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Standards/scs-0210-v1-k8s-new-version-policy.md"},"k8s version recency"),", ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Standards/scs-0211-v1-kaas-default-storage-class.md"},"default storage class")," as well as requirements to the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Standards/scs-0212-v1-requirements-for-container-registry.md"},"container registry")," have been captured."),(0,r.kt)("p",null,"The IAM area has seen ADRs on the chosen architecture."),(0,r.kt)("p",null,"The (design) decisions on the metering work as well as on the status page project have also been\ncaptured."),(0,r.kt)("p",null,"The standards and the standards compliance of our operators' clouds can be seen in the\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.scs.community/standards"},"standards section of our doc pages")," while the raw content is developed\nand discussed in the respective ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards"},"github standards repository"),"."),(0,r.kt)("p",null,"The SCS reference implementation follows all approved SCS standards."),(0,r.kt)("h2",{id:"release-tagging"},"Release Tagging"),(0,r.kt)("p",null,"Relevant repositories have been tagged with ",(0,r.kt)("inlineCode",{parentName:"p"},"v6.0.0")," tag.\nFor some repositories ",(0,r.kt)("inlineCode",{parentName:"p"},"maintained/v6.x")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"maintained/v6.0.x")," branches have been created."),(0,r.kt)("h2",{id:"list-of-known-issues--restrictions-in-r5"},"List of known issues & restrictions in R5"),(0,r.kt)("p",null,"Nothing that we are aware of at this point."),(0,r.kt)("h2",{id:"contributing"},"Contributing"),(0,r.kt)("p",null,"We appreciate contribution to strategy and implementation, please join\nour community -- or just leave input on the github issues and PRs.\nHave a look at our ",(0,r.kt)("a",{parentName:"p",href:"https://scs.community/contribute/"},"How to contribute page"),"."),(0,r.kt)("h2",{id:"thanks"},"Thanks"),(0,r.kt)("p",null,"Our wonderful community of integrators, operators, contractors and volunteers\nmade R5 possible. The project management team is employed by the OSB Alliance\nand we as well as the contractors are paid thanks to funding from the German\nMinistry for economic affairs and climate action. We build on top of a lot of\nexisting open source code from the CNCF, the OIF and various others and we\ntry to contribute back as much as we can."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a0eeb362.9541cb2a.js b/assets/js/a0eeb362.9541cb2a.js new file mode 100644 index 0000000000..b4fa7be877 --- /dev/null +++ b/assets/js/a0eeb362.9541cb2a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[984],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var a=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?r(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):r(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n,a,o={},r=Object.keys(e);for(a=0;a<r.length;a++)n=r[a],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a<r.length;a++)n=r[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=a.createContext({}),u=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=u(e.components);return a.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),p=u(n),m=o,h=p["".concat(s,".").concat(m)]||p[m]||d[m]||r;return n?a.createElement(h,i(i({ref:t},c),{},{components:n})):a.createElement(h,i({ref:t},c))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:o,i[1]=l;for(var u=2;u<r;u++)i[u]=n[u];return a.createElement.apply(null,i)}return a.createElement.apply(null,n)}m.displayName="MDXCreateElement"},74990:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>r,metadata:()=>l,toc:()=>u});var a=n(87462),o=(n(67294),n(3905));const r={},i="Collaboration",l={unversionedId:"collaboration",id:"collaboration",title:"Collaboration",description:"Collaborating with issues and pull requests",source:"@site/community/collaboration.md",sourceDirName:".",slug:"/collaboration",permalink:"/community/collaboration",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"community",previous:{title:"Calendar",permalink:"/community/calendar"},next:{title:"Matrix",permalink:"/community/communication/matrix"}},s={},u=[{value:"Collaborating with issues and pull requests",id:"collaborating-with-issues-and-pull-requests",level:2},{value:"Meetings",id:"meetings",level:2},{value:"Project updates",id:"project-updates",level:3},{value:"Sprint review/Backlog refinement/Sprint planning meetings",id:"sprint-reviewbacklog-refinementsprint-planning-meetings",level:3},{value:"Special interest groups (SIGs)",id:"special-interest-groups-sigs",level:3},{value:"Videoconference",id:"videoconference",level:2},{value:"Usage",id:"usage",level:3},{value:"Nextcloud",id:"nextcloud",level:2},{value:"Zuul CI/CD pipelines and project gating",id:"zuul-cicd-pipelines-and-project-gating",level:2},{value:"How to make a repo use Zuul",id:"how-to-make-a-repo-use-zuul",level:3},{value:"General information about Zuul",id:"general-information-about-zuul",level:3}],c={toc:u},p="wrapper";function d(e){let{components:t,...n}=e;return(0,o.kt)(p,(0,a.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"collaboration"},"Collaboration"),(0,o.kt)("h2",{id:"collaborating-with-issues-and-pull-requests"},"Collaborating with issues and pull requests"),(0,o.kt)("p",null,"We use the GitHub flow to track and discuss changes in issues, then propose and\nreview changes in pull requests. See the\n",(0,o.kt)("a",{parentName:"p",href:"https://docs.github.com/en/free-pro-team@latest/github/collaborating-with-issues-and-pull-requests"},"GitHub documentation"),"\nfor more details."),(0,o.kt)("h2",{id:"meetings"},"Meetings"),(0,o.kt)("h3",{id:"project-updates"},"Project updates"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Weekly with all teams on Thursday at 1505 CEST (45 mins)")),(0,o.kt)("h3",{id:"sprint-reviewbacklog-refinementsprint-planning-meetings"},"Sprint review/Backlog refinement/Sprint planning meetings"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Weekly with Team IaaS on Wednesdays at 1005 CEST (1 hour)"),(0,o.kt)("li",{parentName:"ul"},"Weekly with Team Container on Mondays at 1005 CEST (1 hour)"),(0,o.kt)("li",{parentName:"ul"},"Weekly with Team OPS & IAM on Thursdays at 1005 CEST (1 hour)")),(0,o.kt)("h3",{id:"special-interest-groups-sigs"},"Special interest groups (SIGs)"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Identity & Access Management (IAM): Bi-Weekly on Friday at 1005 CEST (1 hour)"),(0,o.kt)("li",{parentName:"ul"},"Monitoring & Logging: Weekly on Friday at 1205 CEST (1 hour)")),(0,o.kt)("h2",{id:"videoconference"},"Videoconference"),(0,o.kt)("p",null,"We use a self-hosted ",(0,o.kt)("a",{parentName:"p",href:"https://jitsi.org"},"Jitsi Meet")," instance for video conferencing."),(0,o.kt)("p",null,"The server uses an automated deployment based on the\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/garloff/heat-docker-jitsi-meet"},"heat-docker-jitsi-meet")," project."),(0,o.kt)("p",null,"Configuration is such everyone who knows the room can connect, unless the moderator\nsets a password/PIN. Opening a new room requires authentication. (Contact Kurt if\nyou need a password.)"),(0,o.kt)("h3",{id:"usage"},"Usage"),(0,o.kt)("p",null,"Connect with a desktop browser (Chrome/Chromium or other blink based browser\nrecommended due to superior WebRTC implementation with SimulCast/SVC for VP8/VP9 --\nSafari & Firefox work, but cause higher data traffic). For mobile devices use\nthe Jitsi Meet App."),(0,o.kt)("p",null,"Use the little arrows in the control bar at the bottom to select speaker, microphone\nand camera in case you lack audio/video. Occasionally, you can not hear all but\none participant; in this case reconnecting typically helps."),(0,o.kt)("p",null,"We have an asterisk connected to some conference rooms to provide dial-in capabilities\nfor folks that lack internet connectivity (but have a working phone connection)."),(0,o.kt)("h2",{id:"nextcloud"},"Nextcloud"),(0,o.kt)("p",null,"We have a ",(0,o.kt)("a",{parentName:"p",href:"https://nextcloud.com"},"Nextcloud"),"\n",(0,o.kt)("a",{parentName:"p",href:"https://scs.sovereignit.de"},"instance")," for sharing files, calendar, contacts, ...\nsetup for things that are not public."),(0,o.kt)("p",null,"We are also using it for our taskboards currently, though we are looking at\noptions to do this in the open."),(0,o.kt)("p",null,"If you want to contribute, we'll do an onboarding call and add you to nextcloud.\nThis will also add you to the ",(0,o.kt)("inlineCode",{parentName:"p"},"scs-member@lists.scs.community")," mailing list."),(0,o.kt)("p",null,"We have an announcements mailing list there ",(0,o.kt)("inlineCode",{parentName:"p"},"announce@lists.scs.community")," and you\ncan subscribe via the ",(0,o.kt)("a",{parentName:"p",href:"https://scs.sovereignit.de/mailman3/postorius/lists/"},"mailman3 frontend")),(0,o.kt)("h2",{id:"zuul-cicd-pipelines-and-project-gating"},"Zuul CI/CD pipelines and project gating"),(0,o.kt)("p",null,"Since we are expecting a lot of pipelines beeing created and used GitHub actions won't keep up\nwell. We also expect cross-repository and even cross-project dependencies. Therefore we decided to\nuse Zuul as our main pipeline solution."),(0,o.kt)("h3",{id:"how-to-make-a-repo-use-zuul"},"How to make a repo use Zuul"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Make Zuul aware of your repository in this ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/SovereignCloudStack/zuul_deployment"},"repo")),(0,o.kt)("li",{parentName:"ul"},"Create a file ",(0,o.kt)("em",{parentName:"li"},".zuul.yaml"),(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"An example can be found ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/SovereignCloudStack/zuul-sandbox/blob/main/.zuul.yaml"},"here")),(0,o.kt)("li",{parentName:"ul"},"You can have a job section containing ",(0,o.kt)("em",{parentName:"li"},"self-defined")," jobs which you need to write on your own"),(0,o.kt)("li",{parentName:"ul"},"You have to have a project section containing",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"the default-branch name"),(0,o.kt)("li",{parentName:"ul"},"the merge-mode which should be used to auto-merge"),(0,o.kt)("li",{parentName:"ul"},"the jobs to run in each pipeline (gh_check, gh_gate, gh_post, gh_tag)"),(0,o.kt)("li",{parentName:"ul"},"these pipelines are triggered by events which can be looked up ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/SovereignCloudStack/zuul_config/blob/main/zuul.d/gh_pipelines.yaml"},"here")),(0,o.kt)("li",{parentName:"ul"},"some default jobs can be found ",(0,o.kt)("a",{parentName:"li",href:"https://opendev.org/zuul/zuul-jobs/src/branch/master/playbooks"},"here")))))),(0,o.kt)("li",{parentName:"ul"},"If you have ",(0,o.kt)("em",{parentName:"li"},"self-defined")," jobs, you need to create a folder ",(0,o.kt)("em",{parentName:"li"},".playbooks"),(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"this folder containers ansible playbooks which will be triggered")))),(0,o.kt)("h3",{id:"general-information-about-zuul"},"General information about Zuul"),(0,o.kt)("p",null,"Zuul does not take anything for granted. If you need to have something installed,\nyou should install it via ansible. Our test-machines are basically pimped\ndocker-containers, so we might run into issues some time. But for now, things work pretty good."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a12a2e44.e23f917a.js b/assets/js/a12a2e44.e23f917a.js new file mode 100644 index 0000000000..697bdd7c43 --- /dev/null +++ b/assets/js/a12a2e44.e23f917a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4050],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var i=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function r(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,i,o=function(e,t){if(null==e)return{};var n,i,o={},a=Object.keys(e);for(i=0;i<a.length;i++)n=a[i],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i<a.length;i++)n=a[i],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=i.createContext({}),c=function(e){var t=i.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},u=function(e){var t=c(e.components);return i.createElement(l.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},h=i.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),d=c(n),h=o,m=d["".concat(l,".").concat(h)]||d[h]||p[h]||a;return n?i.createElement(m,r(r({ref:t},u),{},{components:n})):i.createElement(m,r({ref:t},u))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,r=new Array(a);r[0]=h;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[d]="string"==typeof e?e:o,r[1]=s;for(var c=2;c<a;c++)r[c]=n[c];return i.createElement.apply(null,r)}return i.createElement.apply(null,n)}h.displayName="MDXCreateElement"},16273:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>p,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var i=n(87462),o=(n(67294),n(3905));const a={title:"Requirements for testing cluster-stacks",type:"Decision Record",status:"Draft",track:"KaaS"},r=void 0,s={unversionedId:"scs-0213-v1-requirements-for-testing-cluster-stacks",id:"scs-0213-v1-requirements-for-testing-cluster-stacks",title:"Requirements for testing cluster-stacks",description:"Introduction",source:"@site/standards/scs-0213-v1-requirements-for-testing-cluster-stacks.md",sourceDirName:".",slug:"/scs-0213-v1-requirements-for-testing-cluster-stacks",permalink:"/standards/scs-0213-v1-requirements-for-testing-cluster-stacks",draft:!1,tags:[],version:"current",frontMatter:{title:"Requirements for testing cluster-stacks",type:"Decision Record",status:"Draft",track:"KaaS"}},l={},c=[{value:"Introduction",id:"introduction",level:2},{value:"Motivation",id:"motivation",level:2},{value:"Design Considerations",id:"design-considerations",level:2},{value:"Required Features",id:"required-features",level:2},{value:"Pros and Cons of Different Approaches",id:"pros-and-cons-of-different-approaches",level:2},{value:"IaaS Provider (OpenStack, Hetzner, AWS)",id:"iaas-provider-openstack-hetzner-aws",level:3},{value:"Pros",id:"pros",level:4},{value:"Cons",id:"cons",level:4},{value:"Local Environment (Docker, Kubevirt)",id:"local-environment-docker-kubevirt",level:3},{value:"Pros",id:"pros-1",level:4},{value:"Cons",id:"cons-1",level:4},{value:"Beyond Docker: Virtual Machine based Approach",id:"beyond-docker-virtual-machine-based-approach",level:2},{value:"Virtual Machine Based Approach",id:"virtual-machine-based-approach",level:3},{value:"Pros",id:"pros-2",level:4},{value:"Cons",id:"cons-2",level:4},{value:"Proposed Path Forward",id:"proposed-path-forward",level:2},{value:"Conclusion",id:"conclusion",level:2}],u={toc:c},d="wrapper";function p(e){let{components:t,...n}=e;return(0,o.kt)(d,(0,i.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"introduction"},"Introduction"),(0,o.kt)("p",null,"In this proposal, we discuss the necessity and design considerations of a lightweight solution for testing cluster-stacks. The purpose is to address the challenges associated with testing on an Infrastructure as a Service (IaaS) provider and the limitations of using Docker as the primary containerization tool for testing. This proposal will elaborate on why we need to test in a local environment, specifically a laptop, and the benefits and drawbacks associated with it. We aim to make an informed decision for testing cluster stacks to cater to both the organizational and technical perspectives of our stakeholders."),(0,o.kt)("h2",{id:"motivation"},"Motivation"),(0,o.kt)("p",null,"From an organization's point of view, it is crucial to lower the entry barrier for testing. This action will make it possible for anyone, including external contributors, to easily participate in the testing process without needing an account with the IaaS provider. It is also necessary to overcome the hurdles associated with maintaining a balance in the provider account and managing sponsorships to fund the testing."),(0,o.kt)("p",null,"From a technical standpoint, there are multiple reasons to favor a local environment for testing. Among them is the ability to test without internet, finish tests in a shorter timeframe, and incur no cost. The provider independence of Cluster Stacks makes it nonsensical to test with a specific provider due to the varied behaviors of different providers. There are also challenges in monitoring and debugging tests run on IaaS providers and dealing with their downtime and limitations on concurrent testing."),(0,o.kt)("h2",{id:"design-considerations"},"Design Considerations"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("strong",{parentName:"p"},"Lightweight Solution"),"\nThe testing solution should be lightweight and easy to use in a local environment, such as a laptop. This lightweight solution should minimize dependencies and resource usage while maximizing speed and efficiency of the tests. It should be capable of handling the cluster-stack testing requirements without necessitating a bulky or resource-intensive setup.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("strong",{parentName:"p"},"Independence from Specific Providers"),"\nThe solution should be generalized and not bound to any specific provider. This consideration ensures that the solution can be applied to any provider, guaranteeing its versatility and broad applicability.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("strong",{parentName:"p"},"Offline Testing"),"\nThe testing solution should support testing without internet connection, which will enable more robust and flexible testing scenarios. It should be possible to run the tests even in cases of limited or disrupted internet access.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("strong",{parentName:"p"},"Fast Execution Time"),"\nThe tests should execute within a reasonably short amount of time. The solution must be optimized to ensure quick testing cycles, which can help increase productivity and shorten development cycles.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("strong",{parentName:"p"},"No-Cost Solution"),"\nThe solution should not impose any additional costs on the organization or individual testers. This characteristic is crucial to enable widespread adoption of the testing process and to lower the entry barrier for contributors.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("strong",{parentName:"p"},"Easy Monitoring and Debugging"),"\nThe solution should provide easy monitoring and debugging capabilities. It should allow developers to quickly identify, diagnose, and fix issues that arise during testing, without requiring access to any external logs or monitoring tools.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("strong",{parentName:"p"},"Concurrent Testing"),"\nThe solution should support the ability to run concurrent tests without causing any disruption or downtime. This ability can improve the efficiency and speed of the testing process."))),(0,o.kt)("h2",{id:"required-features"},"Required Features"),(0,o.kt)("p",null,"The proposed solution should meet the following feature requirements:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Local Environment: The solution should support a local testing environment that allows developers to test cluster stacks on their local machines, reducing dependencies on external providers."),(0,o.kt)("li",{parentName:"ol"},"Compatibility: The solution should be compatible with various operating systems and platforms, ensuring its usability across diverse environments."),(0,o.kt)("li",{parentName:"ol"},"Performance: The solution should offer high-performance testing capabilities, allowing fast execution of tests."),(0,o.kt)("li",{parentName:"ol"},"Offline Support: The solution should allow testing in offline mode, ensuring tests can be performed even without an internet connection."),(0,o.kt)("li",{parentName:"ol"},"Concurrency: The solution should support running multiple tests concurrently without causing disruptions or conflicts."),(0,o.kt)("li",{parentName:"ol"},"Monitoring & Debugging: The solution should provide easy-to-use tools for monitoring test progress and debugging issues."),(0,o.kt)("li",{parentName:"ol"},"Cost-effectiveness: The solution should not require any financial investment from the testers or the organization, promoting broad accessibility and usage.")),(0,o.kt)("h2",{id:"pros-and-cons-of-different-approaches"},"Pros and Cons of Different Approaches"),(0,o.kt)("p",null,"Two potential approaches for testing cluster stacks are the use of an IaaS provider and the use of a local environment. Here we discuss the pros and cons of these two approaches."),(0,o.kt)("h3",{id:"iaas-provider-openstack-hetzner-aws"},"IaaS Provider (OpenStack, Hetzner, AWS)"),(0,o.kt)("h4",{id:"pros"},"Pros"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Comprehensive testing environment with advanced capabilities."),(0,o.kt)("li",{parentName:"ul"},"Possibility to mimic real-world production environments closely.")),(0,o.kt)("h4",{id:"cons"},"Cons"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Requires signing up and account management, which can be a barrier for some testers."),(0,o.kt)("li",{parentName:"ul"},"Requires maintaining a balance in the provider account, which can pose financial burdens."),(0,o.kt)("li",{parentName:"ul"},"Internet dependency for testing."),(0,o.kt)("li",{parentName:"ul"},"Potential for prolonged testing time due to various dependencies."),(0,o.kt)("li",{parentName:"ul"},"Challenges with monitoring and debugging."),(0,o.kt)("li",{parentName:"ul"},"Potential downtime and difficulty in running concurrent tests.")),(0,o.kt)("h3",{id:"local-environment-docker-kubevirt"},"Local Environment (Docker, Kubevirt)"),(0,o.kt)("h4",{id:"pros-1"},"Pros"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Faster test execution with no downtime."),(0,o.kt)("li",{parentName:"ul"},"Ability to test without internet."),(0,o.kt)("li",{parentName:"ul"},"Independent of any provider knowledge."),(0,o.kt)("li",{parentName:"ul"},"Cost-free testing."),(0,o.kt)("li",{parentName:"ul"},"Easier integration into CI/CD."),(0,o.kt)("li",{parentName:"ul"},"Simplified monitoring and debugging.")),(0,o.kt)("h4",{id:"cons-1"},"Cons"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Limited systemd support and containerd support for kubeadm in Docker."),(0,o.kt)("li",{parentName:"ul"},"Inability to mimic the exact real-world production environments.")),(0,o.kt)("h2",{id:"beyond-docker-virtual-machine-based-approach"},"Beyond Docker: Virtual Machine based Approach"),(0,o.kt)("p",null,"While Docker provides significant benefits for local environment testing, it's important to recognize its limitations. Docker containers, by design, are lightweight and don't contain a full operating system which can lead to challenges when trying to mimic real-world production environments. Also, Docker containers lack some necessary features like systemd which is used in many production environments for initializing and managing services."),(0,o.kt)("p",null,"One major aspect that Docker lacks is the ability to mimic real-world production environments effectively. This is primarily due to its nature as a containerization tool, operating within the host OS, and sharing resources among its containers. This might create disparities in behavior when comparing to deployments on real, isolated systems, which could be problematic in some scenarios."),(0,o.kt)("p",null,"Furthermore, Docker utilizes a Union File System for its images, leading to the creation of layers. This approach can lead to some complexities when dealing with node-images which comprise a significant chunk of our layers. Handling such situations might require workarounds that could add additional complexity and potential points of failure. This creates a blind spot, as real providers won't require these workarounds, which might lead to disparities in results when comparing testing in local and actual production environments."),(0,o.kt)("p",null,"Therefore, to achieve a more accurate representation of real-world environments, we propose a solution that utilizes a virtual machine based approach for local testing. This approach could leverage tools like KubeVirt, Vagrant, or VirtualBox to create and manage virtual machines on the local environment. This strategy would provide a more robust and realistic environment for testing, as it can better emulate the behavior of a full-fledged operating system and thereby more closely mimic a real-world production environment."),(0,o.kt)("h3",{id:"virtual-machine-based-approach"},"Virtual Machine Based Approach"),(0,o.kt)("h4",{id:"pros-2"},"Pros"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Provides a more accurate representation of real-world production environments."),(0,o.kt)("li",{parentName:"ul"},"Allows for full operating system emulation, including features like systemd."),(0,o.kt)("li",{parentName:"ul"},"Can create isolated environments, thereby mimicking actual deployments better than containers.")),(0,o.kt)("h4",{id:"cons-2"},"Cons"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Potentially more resource-intensive than container-based solutions."),(0,o.kt)("li",{parentName:"ul"},"Increased complexity due to the need for managing full virtual machines rather than lightweight containers."),(0,o.kt)("li",{parentName:"ul"},"Initial setup might be more complicated compared to a Docker-based solution.")),(0,o.kt)("h2",{id:"proposed-path-forward"},"Proposed Path Forward"),(0,o.kt)("p",null,"Given the limitations of Docker and the potential advantages of a virtual machine based approach, we propose to investigate further into this strategy. The exact tool or set of tools used can be determined based on a thorough evaluation of the available options."),(0,o.kt)("p",null,"Although there might be some initial complexity and potentially higher resource usage compared to Docker, we believe that the benefits of more accurate testing and better emulation of real-world environments outweigh these potential disadvantages."),(0,o.kt)("p",null,"The proposed solution should meet all the requirements mentioned in the previous sections of the proposal, in addition to providing the benefits of a virtual machine based approach. By doing so, we aim to establish a robust, reliable, and realistic testing environment for cluster stacks that mimics real-world production environments as closely as possible."),(0,o.kt)("h2",{id:"conclusion"},"Conclusion"),(0,o.kt)("p",null,"After thoroughly examining the organizational needs, technical requirements, and potential testing approaches, it is evident that testing cluster stacks in a local environment provides significant advantages over using an Infrastructure as a Service (IaaS) provider. A local environment minimizes financial constraints, reduces testing time, offers offline capabilities, and enables greater tester participation without the need for specialized IaaS knowledge."),(0,o.kt)("p",null,"While Docker stands out for its broad adoption, cost-effectiveness, and impressive containerization benefits, it also presents some limitations that cannot be overlooked. The lack of full operating system emulation and certain system features like systemd pose challenges to mimic real-world production environments accurately."),(0,o.kt)("p",null,"Given Docker's limitations and the need to reproduce realistic testing scenarios, we propose moving beyond Docker to a virtual machine-based approach. Even though this approach may introduce initial complexity and potentially higher resource usage, it promises a more accurate representation of real-world environments, thereby ensuring more reliable and robust test results."),(0,o.kt)("p",null,"Tools such as KubeVirt, Vagrant, or VirtualBox could potentially fulfill our requirements, offering benefits such as full operating system emulation and isolated environments. However, an in-depth evaluation of these and possibly other tools is necessary to determine the best path forward."),(0,o.kt)("p",null,"In conclusion, our goal is to design a robust, reliable, and realistic testing environment for cluster stacks that closely mimics real-world production environments, aligns with our organizational and technical perspectives, and ensures a low entry barrier for all testers. Embracing a virtual machine-based approach for local environment testing represents a promising strategy to achieve this objective, paving the way for more efficient and reliable cluster stack testing."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a12f05ab.fe72d9a5.js b/assets/js/a12f05ab.fe72d9a5.js new file mode 100644 index 0000000000..a2900f39ce --- /dev/null +++ b/assets/js/a12f05ab.fe72d9a5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6412],{3905:(e,n,r)=>{r.d(n,{Zo:()=>l,kt:()=>b});var t=r(67294);function o(e,n,r){return n in e?Object.defineProperty(e,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[n]=r,e}function i(e,n){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);n&&(t=t.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),r.push.apply(r,t)}return r}function d(e){for(var n=1;n<arguments.length;n++){var r=null!=arguments[n]?arguments[n]:{};n%2?i(Object(r),!0).forEach((function(n){o(e,n,r[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))}))}return e}function a(e,n){if(null==e)return{};var r,t,o=function(e,n){if(null==e)return{};var r,t,o={},i=Object.keys(e);for(t=0;t<i.length;t++)r=i[t],n.indexOf(r)>=0||(o[r]=e[r]);return o}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(t=0;t<i.length;t++)r=i[t],n.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=t.createContext({}),s=function(e){var n=t.useContext(c),r=n;return e&&(r="function"==typeof e?e(n):d(d({},n),e)),r},l=function(e){var n=s(e.components);return t.createElement(c.Provider,{value:n},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var n=e.children;return t.createElement(t.Fragment,{},n)}},m=t.forwardRef((function(e,n){var r=e.components,o=e.mdxType,i=e.originalType,c=e.parentName,l=a(e,["components","mdxType","originalType","parentName"]),u=s(r),m=o,b=u["".concat(c,".").concat(m)]||u[m]||p[m]||i;return r?t.createElement(b,d(d({ref:n},l),{},{components:r})):t.createElement(b,d({ref:n},l))}));function b(e,n){var r=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var i=r.length,d=new Array(i);d[0]=m;var a={};for(var c in n)hasOwnProperty.call(n,c)&&(a[c]=n[c]);a.originalType=e,a[u]="string"==typeof e?e:o,d[1]=a;for(var s=2;s<i;s++)d[s]=r[s];return t.createElement.apply(null,d)}return t.createElement.apply(null,r)}m.displayName="MDXCreateElement"},50988:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>c,contentTitle:()=>d,default:()=>p,frontMatter:()=>i,metadata:()=>a,toc:()=>s});var t=r(87462),o=(r(67294),r(3905));const i={sidebar_label:"Cinder",sidebar_position:20},d="Cinder",a={unversionedId:"iaas/guides/operations-guide/openstack/cinder",id:"iaas/guides/operations-guide/openstack/cinder",title:"Cinder",description:"Remove service",source:"@site/docs/02-iaas/guides/operations-guide/openstack/cinder.md",sourceDirName:"02-iaas/guides/operations-guide/openstack",slug:"/iaas/guides/operations-guide/openstack/cinder",permalink:"/docs/iaas/guides/operations-guide/openstack/cinder",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/operations-guide/openstack/cinder.md",tags:[],version:"current",sidebarPosition:20,frontMatter:{sidebar_label:"Cinder",sidebar_position:20},sidebar:"docs",previous:{title:"OpenStack",permalink:"/docs/iaas/guides/operations-guide/openstack/"},next:{title:"Octavia",permalink:"/docs/iaas/guides/operations-guide/openstack/octavia"}},c={},s=[{value:"Remove service",id:"remove-service",level:2}],l={toc:s},u="wrapper";function p(e){let{components:n,...r}=e;return(0,o.kt)(u,(0,t.Z)({},l,r,{components:n,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"cinder"},"Cinder"),(0,o.kt)("h2",{id:"remove-service"},"Remove service"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"$ openstack --os-cloud admin volume service list\n+------------------+-----------------------------------+----------+---------+-------+----------------------------+\n| Binary | Host | Zone | Status | State | Updated At |\n+------------------+-----------------------------------+----------+---------+-------+----------------------------+\n| cinder-scheduler | testbed-node-0 | internal | enabled | up | 2023-10-01T08:53:14.000000 |\n| cinder-scheduler | testbed-node-1 | internal | enabled | up | 2023-10-01T08:53:15.000000 |\n| cinder-scheduler | testbed-node-2 | internal | enabled | up | 2023-10-01T08:53:15.000000 |\n| cinder-volume | testbed-node-0@rbd-1 | nova | enabled | down | 2023-09-30T18:50:05.000000 |\n| cinder-volume | testbed-node-2@rbd-1 | nova | enabled | down | 2023-09-30T18:50:05.000000 |\n| cinder-volume | testbed-node-1@rbd-1 | nova | enabled | down | 2023-09-30T18:50:08.000000 |\n+------------------+-----------------------------------+----------+---------+-------+----------------------------+\n")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"$ docker exec -it cinder_api cinder-manage service remove cinder-volume testbed-node-0@rbd-1\nService cinder-volume on host testbed-node-0@rbd-1 removed.\n$ docker exec -it cinder_api cinder-manage service remove cinder-volume testbed-node-1@rbd-1\nService cinder-volume on host testbed-node-1@rbd-1 removed.\n$ docker exec -it cinder_api cinder-manage service remove cinder-volume testbed-node-2@rbd-1\nService cinder-volume on host testbed-node-2@rbd-1 removed.\n")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"dragon@mgr001:~$ openstack --os-cloud admin volume service list\n+------------------+-----------------------------------+----------+---------+-------+----------------------------+\n| Binary | Host | Zone | Status | State | Updated At |\n+------------------+-----------------------------------+----------+---------+-------+----------------------------+\n| cinder-scheduler | testbed-node-0 | internal | enabled | up | 2023-10-01T08:56:24.000000 |\n| cinder-scheduler | testbed-node-1 | internal | enabled | up | 2023-10-01T08:56:25.000000 |\n| cinder-scheduler | testbed-node-2 | internal | enabled | up | 2023-10-01T08:56:25.000000 |\n+------------------+-----------------------------------+----------+---------+-------+----------------------------+\n")))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a15c4cb6.3f6510d3.js b/assets/js/a15c4cb6.3f6510d3.js new file mode 100644 index 0000000000..c2d09aa3e5 --- /dev/null +++ b/assets/js/a15c4cb6.3f6510d3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8872],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>f});var r=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),u=c(n),m=o,f=u["".concat(l,".").concat(m)]||u[m]||p[m]||a;return n?r.createElement(f,i(i({ref:t},d),{},{components:n})):r.createElement(f,i({ref:t},d))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:o,i[1]=s;for(var c=2;c<a;c++)i[c]=n[c];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},27896:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>p,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var r=n(87462),o=(n(67294),n(3905));const a={title:"Exposition of IaaS metering data as JSON",type:"Standard",status:"Draft",track:"Ops"},i=void 0,s={unversionedId:"scs-0412-v1-metering-json",id:"scs-0412-v1-metering-json",title:"Exposition of IaaS metering data as JSON",description:"Introduction",source:"@site/standards/scs-0412-v1-metering-json.md",sourceDirName:".",slug:"/scs-0412-v1-metering-json",permalink:"/standards/scs-0412-v1-metering-json",draft:!1,tags:[],version:"current",frontMatter:{title:"Exposition of IaaS metering data as JSON",type:"Standard",status:"Draft",track:"Ops"},sidebar:"standards",previous:{title:"SCS-0412: Metering JSON",permalink:"/standards/ops/scs-0412"},next:{title:"Decision Records",permalink:"/standards/decision-records"}},l={},c=[{value:"Introduction",id:"introduction",level:2},{value:"Motivation",id:"motivation",level:2},{value:"Design Considerations",id:"design-considerations",level:2},{value:"Options considered",id:"options-considered",level:3},{value:"Use Ceilometer HTTP hook format",id:"use-ceilometer-http-hook-format",level:4},{value:"Use another format",id:"use-another-format",level:4},{value:"Open questions",id:"open-questions",level:2},{value:"Decision",id:"decision",level:2},{value:"Related Documents",id:"related-documents",level:2},{value:"Conformance Tests",id:"conformance-tests",level:2}],d={toc:c},u="wrapper";function p(e){let{components:t,...n}=e;return(0,o.kt)(u,(0,r.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"introduction"},"Introduction"),(0,o.kt)("p",null,"The Sovereign Cloud Stack project intends to standardise an infrastructure-as-a-service (IaaS) layer.\nIn order to economically sustainably run a cloud,\nit is generally useful to know which user or tenant consumes which amount of resources in which time frame."),(0,o.kt)("p",null,"Similarly to how the SCS provides an interface for connecting monitoring services to detect outages,\nthis standard aims for providing an interface for connecting systems which aggregate customer resource usage."),(0,o.kt)("h2",{id:"motivation"},"Motivation"),(0,o.kt)("p",null,"In general,\nusers of the SCS (i.e. cloud operators) may already have different systems in place\nfor tracking customer relationships\nas well as billing."),(0,o.kt)("p",null,"Those systems are unlikely to have a uniform interface across all possible implementations.\nLikewise, those systems are unlikely to have a way to interface with OpenStack,\nthe reference IaaS layer in SCS."),(0,o.kt)("p",null,"In order to provide SCS operators with a way to integrate the SCS IaaS layer with their billing,\nthis document shall provide a standard format,\nupon which shim conversion layers (to whichever billing system is in place)\ncan be built."),(0,o.kt)("h2",{id:"design-considerations"},"Design Considerations"),(0,o.kt)("p",null,"In order to define a standard,\nthe various options for formats need to be considered.\nHowever, all formats also come with different implementation costs."),(0,o.kt)("p",null,"These aspects are weighed in this section."),(0,o.kt)("h3",{id:"options-considered"},"Options considered"),(0,o.kt)("h4",{id:"use-ceilometer-http-hook-format"},"Use Ceilometer HTTP hook format"),(0,o.kt)("p",null,"The OpenStack Ceilometer project,\nwhich serves as a hub for all things telemetry and metering,\nprovides an HTTP-based hook to extract metering data.\nThis hook receives JSON-formatted data."),(0,o.kt)("p",null,"Using this data has the advantage\nthat we do not need to implement another component to translate the format\nwhich may in turn be a point of failure."),(0,o.kt)("h4",{id:"use-another-format"},"Use another format"),(0,o.kt)("p",null,"In this option,\na format for metering data is researched and reused, or defined and specified by the SCS project."),(0,o.kt)("p",null,"This option was not explored deeply, for the reasons explained in the decision."),(0,o.kt)("h2",{id:"open-questions"},"Open questions"),(0,o.kt)("p",null,"None."),(0,o.kt)("h2",{id:"decision"},"Decision"),(0,o.kt)("p",null,"We chose the Ceilometer HTTP hook format, described below, for the following reasons:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"Ceilometer is a component which needs to be there anyway for successful metering of OpenStack. Re-using the format makes sense.")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"Using any other format requires a translation layer. However, users will likely need their own translation layer ",(0,o.kt)("em",{parentName:"p"},"anyway"),", to integrate the metering with their own infrastructure. Hence, it makes more sense to expose the data from Ceilometer directly."),(0,o.kt)("p",{parentName:"li"},"A notable downside of this approach is that a change in Ceilometers format will inevitably cause issues in all downstream consumers."))),(0,o.kt)("h2",{id:"related-documents"},"Related Documents"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"SCS-0410-v1"),(0,o.kt)("li",{parentName:"ul"},"SCS-0411-v1")),(0,o.kt)("h2",{id:"conformance-tests"},"Conformance Tests"),(0,o.kt)("p",null,"None."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a38b6a75.f555d2a8.js b/assets/js/a38b6a75.f555d2a8.js new file mode 100644 index 0000000000..c16078e976 --- /dev/null +++ b/assets/js/a38b6a75.f555d2a8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1114],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>d});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),c=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return a.createElement(s.Provider,{value:t},e.children)},m="mdxType",k={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},p=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=c(n),p=r,d=m["".concat(s,".").concat(p)]||m[p]||k[p]||o;return n?a.createElement(d,i(i({ref:t},u),{},{components:n})):a.createElement(d,i({ref:t},u))}));function d(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=p;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[m]="string"==typeof e?e:r,i[1]=l;for(var c=2;c<o;c++)i[c]=n[c];return a.createElement.apply(null,i)}return a.createElement.apply(null,n)}p.displayName="MDXCreateElement"},24715:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>k,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var a=n(87462),r=(n(67294),n(3905));const o={},i="Makefile reference",l={unversionedId:"container/components/k8s-cluster-api-provider/doc/make-reference",id:"container/components/k8s-cluster-api-provider/doc/make-reference",title:"Makefile reference",description:"This is a reference to the Makefile targets.",source:"@site/docs/03-container/components/k8s-cluster-api-provider/doc/make-reference.md",sourceDirName:"03-container/components/k8s-cluster-api-provider/doc",slug:"/container/components/k8s-cluster-api-provider/doc/make-reference",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/make-reference",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/03-container/components/k8s-cluster-api-provider/doc/make-reference.md",tags:[],version:"current",frontMatter:{},sidebar:"docs",previous:{title:"Quickstart",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/quickstart"},next:{title:"Application Credentials",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/application-credentials"}},s={},c=[{value:"General commands",id:"general-commands",level:2},{value:"make create",id:"make-create",level:3},{value:"make get-kubeconfig",id:"make-get-kubeconfig",level:3},{value:"make ssh",id:"make-ssh",level:3},{value:"make openstack",id:"make-openstack",level:3},{value:"make k9s",id:"make-k9s",level:3},{value:"make log",id:"make-log",level:3},{value:"make console",id:"make-console",level:3},{value:"Teardown",id:"teardown",level:2},{value:"Make clean",id:"make-clean",level:3},{value:"Make fullclean",id:"make-fullclean",level:3},{value:"Make purge",id:"make-purge",level:3},{value:"Testing commands",id:"testing-commands",level:2},{value:"make check",id:"make-check",level:3},{value:"make check-quick",id:"make-check-quick",level:3},{value:"make check-conformance",id:"make-check-conformance",level:3},{value:"make check-storage",id:"make-check-storage",level:3},{value:"make check-csi",id:"make-check-csi",level:3},{value:"Terraform commands",id:"terraform-commands",level:2},{value:"make init",id:"make-init",level:3},{value:"make attach",id:"make-attach",level:3},{value:"make detach",id:"make-detach",level:3},{value:"make state-push",id:"make-state-push",level:3},{value:"make dry-run",id:"make-dry-run",level:3},{value:"make show",id:"make-show",level:3},{value:"make list",id:"make-list",level:3}],u={toc:c},m="wrapper";function k(e){let{components:t,...n}=e;return(0,r.kt)(m,(0,a.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"makefile-reference"},"Makefile reference"),(0,r.kt)("p",null,"This is a reference to the Makefile targets."),(0,r.kt)("p",null,"Almost all targets require the ",(0,r.kt)("inlineCode",{parentName:"p"},"ENVIRONMENT")," variable to be set to the name of the environment you want to use.\n(See ",(0,r.kt)("a",{parentName:"p",href:"/docs/container/components/k8s-cluster-api-provider/doc/requirements#environments"},"Environments")," in the requirements documentation for more information.)"),(0,r.kt)("h2",{id:"general-commands"},"General commands"),(0,r.kt)("h3",{id:"make-create"},"make create"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"make create")),(0,r.kt)("p",null,"To initiate the management server setup, various components are created. This includes the provisioning of networks,\nsecurity groups, and a virtual machine. An application credential is also generated for authentication purposes. Once\nthe virtual machine is up and running, it is bootstrapped by cloning the specified git repository. Additionally,\nspecific tools are installed to facilitate the process."),(0,r.kt)("p",null,"Next, a local Kubernetes cluster is deployed using ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/kind"},"kind"),". The cluster acts as a foundation for further operations. During\nthe setup, the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api"},"Cluster API"),", as well as the Cluster API Provider (e.g. ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api-provider-openstack"},"CAPO"),"), are installed within the local cluster. This provider serves as the API server for\nKubernetes CAPI, enabling management and interaction with the cloud backends (e.g. OpenStack)."),(0,r.kt)("p",null,"Finally, a test cluster is created utilizing Kubernetes CAPI. This test cluster allows for experimentation, validation,\nand development within the CAPI environment."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Note that ",(0,r.kt)("inlineCode",{parentName:"p"},"make create")," will not create a testcluster if you have set ",(0,r.kt)("inlineCode",{parentName:"p"},"controller_count")," to zero in your\nenvironment file (",(0,r.kt)("inlineCode",{parentName:"p"},"environment-<yourcloud>.tfvars"),").")),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Note that ",(0,r.kt)("inlineCode",{parentName:"p"},"make create")," does not copy local files to the management server, only some files are templated there from the ",(0,r.kt)("inlineCode",{parentName:"p"},"terraform/files/template")," directory. If you want to change any of the scripts\nbeing copied to the management server, you need to commit, push your changes, and run ",(0,r.kt)("inlineCode",{parentName:"p"},"make create")," again.\n",(0,r.kt)("inlineCode",{parentName:"p"},"make create")," will pull the latest changes from the git repository.")),(0,r.kt)("h3",{id:"make-get-kubeconfig"},"make get-kubeconfig"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"make get-kubeconfig")),(0,r.kt)("p",null,"This will get the kubeconfig of the testcluster and store it in the file ",(0,r.kt)("inlineCode",{parentName:"p"},"testcluster.yaml.<yourcloud>"),"."),(0,r.kt)("h3",{id:"make-ssh"},"make ssh"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"make ssh")),(0,r.kt)("p",null,"This will ssh into the management server, using the username that was set in your ",(0,r.kt)("inlineCode",{parentName:"p"},"environment-<yourcloud>.tfvars"),"file. The default in the environment file is ",(0,r.kt)("inlineCode",{parentName:"p"},"ubuntu"),"."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Note: there is also an alias to this ",(0,r.kt)("inlineCode",{parentName:"p"},"make login"))),(0,r.kt)("h3",{id:"make-openstack"},"make openstack"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"make openstack")),(0,r.kt)("p",null,"This will run openstack cli."),(0,r.kt)("h3",{id:"make-k9s"},"make k9s"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"make k9s")),(0,r.kt)("p",null,"This will run k9s on the management server."),(0,r.kt)("h3",{id:"make-log"},"make log"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"make log CONSOLE=capi-mgmtcluster")),(0,r.kt)("p",null,"This will show openstack console log of the management server. You can specify the console log you want to see by\nsetting the ",(0,r.kt)("inlineCode",{parentName:"p"},"CONSOLE")," variable. The default is ",(0,r.kt)("inlineCode",{parentName:"p"},"capi-mgmtcluster"),"."),(0,r.kt)("h3",{id:"make-console"},"make console"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"make console CONSOLE=capi-mgmtcluster")),(0,r.kt)("p",null,"This will open openstack console of the management server in the browser using XDG-open. You can specify the console you\nwant to open by setting the ",(0,r.kt)("inlineCode",{parentName:"p"},"CONSOLE")," variable. The default is ",(0,r.kt)("inlineCode",{parentName:"p"},"capi-mgmtcluster"),"."),(0,r.kt)("h2",{id:"teardown"},"Teardown"),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Note that ",(0,r.kt)("inlineCode",{parentName:"p"},"clean")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"fullclean")," leave the ",(0,r.kt)("inlineCode",{parentName:"p"},"ubuntu-capi-image-$KUBERNETES_VERSION")," image registered,\nso it can be reused.\nYou need to manually unregister it, if you want your next deployment to register a new image with\nthe same kubernetes version number.")),(0,r.kt)("h3",{id:"make-clean"},"Make clean"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"make clean")," does ssh to the capi management server to clean up the created clusters prior\nto terraform cleaning up the resources it has created. This is sometimes insufficient to clean up\nunfortunately, some error in the deployment may result in resources left around."),(0,r.kt)("h3",{id:"make-fullclean"},"Make fullclean"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"make fullclean")," uses a custom script ",(0,r.kt)("inlineCode",{parentName:"p"},"cleanup/cleanup.sh")," (using the openstack CLI) to clean up\neverything while trying to not hit any resources not created by the CAPI or terraform for\nclusters from this management host.\nIt is the recommended way for doing cleanups if ",(0,r.kt)("inlineCode",{parentName:"p"},"make clean")," fails. Watch out for leftover\nfloating IP addresses and persistent volumes, as these can not be easily traced back to the\nCluster API created resources and may thus be left. There is also a ",(0,r.kt)("inlineCode",{parentName:"p"},"make forceclean")," variant\nthat hits unused floating IPs and all persistent volumes -- this is risky as there is no good\nway to tell which PVCs belong to us unless we find them attached to cluster nodes in which\ncase we don't need the force options."),(0,r.kt)("h3",{id:"make-purge"},"Make purge"),(0,r.kt)("p",null,"You can purge the whole project via ",(0,r.kt)("inlineCode",{parentName:"p"},"make purge"),". Be careful with that command as it will purge\n",(0,r.kt)("em",{parentName:"p"},"all resources in the OpenStack project")," even those that have not been created through this\nTerraform script or the Cluster API.\nIt requires the ",(0,r.kt)("a",{parentName:"p",href:"https://opendev.org/x/ospurge"},(0,r.kt)("inlineCode",{parentName:"a"},"ospurge"))," tool.\nInstall it with ",(0,r.kt)("inlineCode",{parentName:"p"},"python3 -m pip install git+https://git.openstack.org/openstack/ospurge"),"."),(0,r.kt)("h2",{id:"testing-commands"},"Testing commands"),(0,r.kt)("h3",{id:"make-check"},"make check"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"make check SONOMODE=...")),(0,r.kt)("p",null,"This will run tests of the configuration on testcluster using ",(0,r.kt)("a",{parentName:"p",href:"https://sonobuoy.io/"},"sonobuoy"),". It will also download the results and\nprint them to the console. Optionally you can also specify a mode by using for example ",(0,r.kt)("inlineCode",{parentName:"p"},'SONOMODE="--mode quick"')),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Note: This runs over 5000 tests and takes a long time to complete (~ 2 hours).")),(0,r.kt)("h3",{id:"make-check-quick"},"make check-quick"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"make check-quick")),(0,r.kt)("p",null,"This will run tests of the configuration on testcluster using sonobuoy with mode quick."),(0,r.kt)("h3",{id:"make-check-conformance"},"make check-conformance"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"make check-conformance")),(0,r.kt)("p",null,"This will run tests of the configuration on testcluster using sonobuoy with mode conformance meaning it will test if the\ncluster is conformant to the CNCF."),(0,r.kt)("h3",{id:"make-check-storage"},"make check-storage"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"make check-storage")),(0,r.kt)("p",null,"This will run tests of the configuration on testcluster using sonobuoy of the storage."),(0,r.kt)("h3",{id:"make-check-csi"},"make check-csi"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"make check-csi")),(0,r.kt)("p",null,"This will run tests of the configuration on testcluster using sonobuoy of the CSI."),(0,r.kt)("h2",{id:"terraform-commands"},"Terraform commands"),(0,r.kt)("h3",{id:"make-init"},"make init"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"make init")),(0,r.kt)("p",null,"This will initialize terraform. It will download the required providers and modules.\nIt will also select or create a new workspace for you. The workspace name is the same as the\n",(0,r.kt)("inlineCode",{parentName:"p"},"ENVIROMENT")," variable."),(0,r.kt)("h3",{id:"make-attach"},"make attach"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"make attach RESOURCE=<resource-id> PARAMS=...")),(0,r.kt)("p",null,"This will attach a resource to the terraform state. This is useful if you have created a resource outside of terraform\nand want to manage it with terraform."),(0,r.kt)("h3",{id:"make-detach"},"make detach"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"make detach RESOURCE=<resource-id> PARAMS=...")),(0,r.kt)("p",null,"This will detach a resource from the terraform state. This is useful if you have changed a resource outside of terraform\nor you no longer want to manage it with terraform."),(0,r.kt)("h3",{id:"make-state-push"},"make state-push"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"make state-push")),(0,r.kt)("p",null,"This will push the terraform state to specified storage if set. This is useful if you don't want to store the state\nlocally."),(0,r.kt)("h3",{id:"make-dry-run"},"make dry-run"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"make dry-run")),(0,r.kt)("p",null,"This will run a dry-run of the terraform apply command. This is useful if you want to see what terraform will do before\nactually doing it."),(0,r.kt)("h3",{id:"make-show"},"make show"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"make show")),(0,r.kt)("p",null,"This will show the terraform state. This is useful if you want to see what terraform is managing."),(0,r.kt)("h3",{id:"make-list"},"make list"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"make list")),(0,r.kt)("p",null,"This will list all the resources managed by terraform. This is useful if you want to see what terraform is managing."))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a3e11933.25ca3db0.js b/assets/js/a3e11933.25ca3db0.js new file mode 100644 index 0000000000..91a104ee8a --- /dev/null +++ b/assets/js/a3e11933.25ca3db0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9327],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>m});var a=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?r(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):r(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n,a,o={},r=Object.keys(e);for(a=0;a<r.length;a++)n=r[a],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a<r.length;a++)n=r[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=a.createContext({}),d=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},c=function(e){var t=d(e.components);return a.createElement(l.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,l=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),p=d(n),h=o,m=p["".concat(l,".").concat(h)]||p[h]||u[h]||r;return n?a.createElement(m,s(s({ref:t},c),{},{components:n})):a.createElement(m,s({ref:t},c))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,s=new Array(r);s[0]=h;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[p]="string"==typeof e?e:o,s[1]=i;for(var d=2;d<r;d++)s[d]=n[d];return a.createElement.apply(null,s)}return a.createElement.apply(null,n)}h.displayName="MDXCreateElement"},83848:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>u,frontMatter:()=>r,metadata:()=>i,toc:()=>d});var a=n(87462),o=(n(67294),n(3905));const r={},s="Release Notes for SCS Release 1",i={unversionedId:"releases/Release1",id:"releases/Release1",title:"Release Notes for SCS Release 1",description:"(Release Date: 2021-09-29)",source:"@site/docs/06-releases/Release1.md",sourceDirName:"06-releases",slug:"/releases/Release1",permalink:"/docs/releases/Release1",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/06-releases/Release1.md",tags:[],version:"current",frontMatter:{},sidebar:"docs",previous:{title:"Release Notes for SCS Release 0",permalink:"/docs/releases/Release0"},next:{title:"Release Notes for SCS Release 2",permalink:"/docs/releases/Release2"}},l={},d=[{value:"Scope",id:"scope",level:2},{value:"CI framework",id:"ci-framework",level:2},{value:"Zuul-CI",id:"zuul-ci",level:3},{value:"Metrics collection and dashboards",id:"metrics-collection-and-dashboards",level:2},{value:"Prometheus exporters and Grafana dashboards",id:"prometheus-exporters-and-grafana-dashboards",level:3},{value:"openstack-health-monitor",id:"openstack-health-monitor",level:3},{value:"Logging",id:"logging",level:2},{value:"Central logging",id:"central-logging",level:3},{value:"Federation",id:"federation",level:2},{value:"OIDC support via keycloak",id:"oidc-support-via-keycloak",level:3},{value:"non-TLS restrictions (testbed)",id:"non-tls-restrictions-testbed",level:3},{value:"Known Issue with OIDC Logout",id:"known-issue-with-oidc-logout",level:3},{value:"Bare Metal Service",id:"bare-metal-service",level:2},{value:"Container Layer",id:"container-layer",level:2},{value:"Overview and Goals for R1",id:"overview-and-goals-for-r1",level:3},{value:"Beyond CAPI",id:"beyond-capi",level:3},{value:"Standardization",id:"standardization",level:2},{value:"SBOM and Links",id:"sbom-and-links",level:2},{value:"Release tagging",id:"release-tagging",level:2},{value:"List of known issues & restrictions in R1",id:"list-of-known-issues--restrictions-in-r1",level:2}],c={toc:d},p="wrapper";function u(e){let{components:t,...n}=e;return(0,o.kt)(p,(0,a.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"release-notes-for-scs-release-1"},"Release Notes for SCS Release 1"),(0,o.kt)("p",null,"(Release Date: 2021-09-29)"),(0,o.kt)("h2",{id:"scope"},"Scope"),(0,o.kt)("p",null,"Main goals for Release 1 (R1) was the strengthening of our CI test coverage and\nintegration, the operational tooling (metrics collection, dashboards, logging),\nlatest versions of upstream software (OpenStack Wallaby, Kubernetes-1.21.5),\nsupport for Bare Metal service, progress on user federation for clouds, and\nprogress on the integration of the container layer with k8s Cluster API (now in\nversion 0.4.x)."),(0,o.kt)("h2",{id:"ci-framework"},"CI framework"),(0,o.kt)("h3",{id:"zuul-ci"},"Zuul-CI"),(0,o.kt)("p",null,"For our internal development workflows we are planning to switch from GitHub\nActions to Zuul-CI (mostly). The infrastructure itself is already available,\nyet most of the repositories in the SovereignCloudStack organisation have not\nswitched over. Reasons for switching include cross-dependencies, scalability\nand costs. Reasons for using Zuul-CI include the close connection to the\nOpenStack project and the enormous flexibility in comparison to other similar\ntools. On top of that you have also gating instead of only CI. A quick example\nfor a Zuul-CI operated repository can be found here:\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/zuul-sandbox"},"https://github.com/SovereignCloudStack/zuul-sandbox"),"."),(0,o.kt)("h2",{id:"metrics-collection-and-dashboards"},"Metrics collection and dashboards"),(0,o.kt)("h3",{id:"prometheus-exporters-and-grafana-dashboards"},"Prometheus exporters and Grafana dashboards"),(0,o.kt)("p",null,"We provide generic configuration examples and blueprints for prometheus rules\nand grafana dashboards. The examples need to be understood and adapted to the\nparticular needs of your environment. You can find the examples at\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/osism/kolla-operations"},"https://github.com/osism/kolla-operations"),"."),(0,o.kt)("p",null,"With R2 we plan to implement a basic set of these alerts and dashboards in the\ntestbed deployment in order to make them even easier consumable for new users.\nFeel free to give feedback on the examples and contribute your own generic\nexamples."),(0,o.kt)("p",null,"We're working on bringing a basic set of prometheus exporters to the\nOpenStack-kolla upstream community."),(0,o.kt)("p",null,"As part of our effort to add more monitoring tooling, we're integrating further\nprometheus exporters such as\n",(0,o.kt)("a",{parentName:"p",href:"https://review.opendev.org/c/openstack/kolla-ansible/+/643568"},"libvirt")," and\n",(0,o.kt)("a",{parentName:"p",href:"https://review.opendev.org/c/openstack/kolla/+/762986"},"ovn"),". Integration is\ntargeted for R2."),(0,o.kt)("p",null,"More detailed information on monitoring topics will be continously provided in\nthe ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Design-Docs/monitoring.md"},"corresponding design document"),"."),(0,o.kt)("h3",{id:"openstack-health-monitor"},"openstack-health-monitor"),(0,o.kt)("p",null,"We have made some progress with openstack-health-monitor since R0, but we have\nnot yet created ready-to-be-used influx data collection and the grafana\ndashboard. While the black box monitoring is perceived as very useful, the\nscript certainly has reached a complexity that is not handled well with bash\nscripting and makes it a difficult to maintain and even to use tool, so the\nusefulness of shipping it with SCS to make it available for Ops teams to\nmonitor has been questioned. Instead an expectation has been expressed that the\nSCS uses this to monitor all SCS partner clouds and provides some transparency\nthis way to the public -- and detailed statistics via e.g. a prometheus\nexporter to the respective cloud provider. This is currently under consideration."),(0,o.kt)("h2",{id:"logging"},"Logging"),(0,o.kt)("h3",{id:"central-logging"},"Central logging"),(0,o.kt)("p",null,"OSISM now enables kolla-ansible centralized logging by default. The default\nrules need to be further refined to suit your needs. We plan to implement a\nmore generic set of rules for R2."),(0,o.kt)("h2",{id:"federation"},"Federation"),(0,o.kt)("h3",{id:"oidc-support-via-keycloak"},"OIDC support via keycloak"),(0,o.kt)("p",null,"Logging in to Horizon by authenticating with OIDC via Keycloak is now possible.\nFor details see the ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/osism/testbed/blob/8430afdd36307acc1bf5ebd930ecbd3dd4b1dd22/docs/source/usage.rst#authentication-with-openid-connect"},"testbed documentation"),"."),(0,o.kt)("h3",{id:"non-tls-restrictions-testbed"},"non-TLS restrictions (testbed)"),(0,o.kt)("p",null,"Only TLS secured deployments get full support.\nWithout TLS, certain browsers won't be able to log in.\nFor deatils see the ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/osism/testbed/blob/8430afdd36307acc1bf5ebd930ecbd3dd4b1dd22/docs/source/usage.rst#ssl-tls-connection-to-keycloak-openid-connect-provider"},"testbed documentation")),(0,o.kt)("h3",{id:"known-issue-with-oidc-logout"},"Known Issue with OIDC Logout"),(0,o.kt)("p",null,"Clicking ",(0,o.kt)("inlineCode",{parentName:"p"},"Sign Out")," on the Horizon dashboard doesn't perform\na proper OIDC logout. This is documented in ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/osism/testbed/blob/8430afdd36307acc1bf5ebd930ecbd3dd4b1dd22/docs/source/usage.rst#openstack-web-dashboard-horizon-logout"},"osism testbed"),",\nwith some Keycloak settings that can be relevant for alleviating the issue,\nbut in Release 1 there is no solution for this yet."),(0,o.kt)("h2",{id:"bare-metal-service"},"Bare Metal Service"),(0,o.kt)("p",null,"The ironic Bare Metal service can be deployed with the SCS (OSISM)\ninstallation. For it to get full test coverage, a virtual BMC\nsolution has been created, so bare metal can be validated in our testbed\nsetup just as nicely as the other components. While most pieces\nare ready, the final integration steps are still work-in-progress\nand will happen after R1."),(0,o.kt)("h2",{id:"container-layer"},"Container Layer"),(0,o.kt)("h3",{id:"overview-and-goals-for-r1"},"Overview and Goals for R1"),(0,o.kt)("p",null,"The container layer on SCS is implemented as a Self-Service,\nleveraging the ",(0,o.kt)("a",{parentName:"p",href:"https://cluster-api.sigs.k8s.io/"},"Kubernetes cluster API"),"\ntechnology. This was provided as a technical preview from the\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/k8s-cluster-api-provider"},"SCS k8s-cluster-api-provider"),"\nrepository for R0 back in July."),(0,o.kt)("p",null,"The focus for R1 was to make it ready for production, so DevOps teams can\nuse this to create and manage their k8s clusters in self-service for\ndevelopment, testing, deployment and production."),(0,o.kt)("p",null,"To achieve this, a lot of work has been invested, updating the\ncluster API to 0.4 along the way, fixing snapshot classes, enabling\noptional metrics and ingress services, using application credentials\nand much improved management scripts. The sonobuoy test automation has\nbeen included and successfully used to validate the created clusters.\nReal-world testing has happened though the Gaia-X Hackathon #1, where\nclusters were provided on the fly for the various work streams."),(0,o.kt)("p",null,"The detailed list of changes for R1 is covered in the\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/k8s-cluster-api-provider/blob/master/Release-Notes-R1.md"},"k8s capi provider Release Notes"),"."),(0,o.kt)("p",null,"Still in technical preview, but very promising are the helm charts\nbased k8s cluster management templates also documented there."),(0,o.kt)("h3",{id:"beyond-capi"},"Beyond CAPI"),(0,o.kt)("p",null,"Some of our partners are using ",(0,o.kt)("a",{parentName:"p",href:"https://gardener.cloud"},"Gardener")," as a layer to manage\nlarge fleets of (optionally cross-cloud) k8s clusters. While there is a bit of\noverlap in functionality, they do happily coexist and our partner is actually\nusing k8s capi to bootstrap clusters on SCS clouds for Gardener management."),(0,o.kt)("h2",{id:"standardization"},"Standardization"),(0,o.kt)("p",null,"As of this writing, the list of SCS defined standards still comprises\ntwo standards:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Design-Docs/flavor-naming.md"},"SCS Flavor naming and standard flavors standard"))),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Design-Docs/Image-Properties-Spec.md"},"SCS Image naming and metadata standard")))),(0,o.kt)("p",null,"As before, we continue to rely on OpenStack and CNCF defined standards\nin addition to this -- the k8s clusters need to pass the conformance\ntests with sonobuoy and the OpenStack environment the OpenStack powered\nguidelines (with refstack)."),(0,o.kt)("p",null,"There is a discussion on a glossary, detailing what we expect from regions,\navailability zones etc. Some major parts of it still need to be agreed\nbefore a useful doc can be published -- this will happen in due time and\nis expected before R2."),(0,o.kt)("h2",{id:"sbom-and-links"},"SBOM and Links"),(0,o.kt)("p",null,"We stand on the shoulders of giants:\nWithout all the great work from many open source communities, we would\nnot get anywhere."),(0,o.kt)("p",null,"We are working on automation to create a complete list for all the software\nthat is used and deployed with SCS, so we have a complete Software Bill\nof Materials (SBoM). The reason this is non-trivial is that we are not\naggregating it all ourselves, but rely on pre-integrated pieces, such\nas Linux distributions, OpenStack, CNCF projects etc. The good news is\nthat these projects are diligent in their work, making sure we don't need\nto be too worried about security risks or legal risks introduced this way.\nNevertheless, the goal of creating a complete graph remains."),(0,o.kt)("p",null,"We have started to put SPDX license identifiers into the SCS produced\ncode, so we make it easier for downstream consumers of our software to\nautomate the license compliance checks when assembling an SBoM."),(0,o.kt)("p",null,"For R1, some of the major projects we build on have had releases that we\nincorporated and whose release notes we want to link here for convenience:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/kubernetes/kubernetes/releases"},"Kubernetes v1.21.x")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/kubernetes-sigs/cluster-api/releases"},"Kubernetes Cluster API v0.4"),"\nand ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/kubernetes-sigs/cluster-api-provider-openstack/releases"},"k8s cluster-api-provider openstack v0.4")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://releases.openstack.org/wallaby/"},"OpenStack Wallaby")," ",(0,o.kt)("a",{parentName:"li",href:"https://releases.openstack.org/wallaby/highlights.html"},"Release Highlights"))),(0,o.kt)("h2",{id:"release-tagging"},"Release tagging"),(0,o.kt)("p",null,"See ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Design-Docs/Release-Numbering-Scheme.md"},"Release Numbering scheme")," -- unchanged from R0.\nWe have added the tag ",(0,o.kt)("inlineCode",{parentName:"p"},"v2.0.0")," to the relevant repositories to designate the ",(0,o.kt)("inlineCode",{parentName:"p"},"SCS_RELEASE_R1"),"."),(0,o.kt)("h2",{id:"list-of-known-issues--restrictions-in-r1"},"List of known issues & restrictions in R1"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("a",{parentName:"p",href:"#Known-Issue-with-OIDC-Logout"},"OIDC Logout doesn't work properly"),".")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"OIDC Login is meant to be used with TLS, on\n",(0,o.kt)("a",{parentName:"p",href:"#non-TLS-restrictions-testbed"},"non-TLS setups it only works with restrictions"),"."))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a4833b52.43cd4468.js b/assets/js/a4833b52.43cd4468.js new file mode 100644 index 0000000000..e45f1569de --- /dev/null +++ b/assets/js/a4833b52.43cd4468.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8503],{3905:(e,t,a)=>{a.d(t,{Zo:()=>m,kt:()=>g});var n=a(67294);function i(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?r(Object(a),!0).forEach((function(t){i(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):r(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function o(e,t){if(null==e)return{};var a,n,i=function(e,t){if(null==e)return{};var a,n,i={},r=Object.keys(e);for(n=0;n<r.length;n++)a=r[n],t.indexOf(a)>=0||(i[a]=e[a]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n<r.length;n++)a=r[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(i[a]=e[a])}return i}var s=n.createContext({}),d=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},m=function(e){var t=d(e.components);return n.createElement(s.Provider,{value:t},e.children)},p="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var a=e.components,i=e.mdxType,r=e.originalType,s=e.parentName,m=o(e,["components","mdxType","originalType","parentName"]),p=d(a),u=i,g=p["".concat(s,".").concat(u)]||p[u]||c[u]||r;return a?n.createElement(g,l(l({ref:t},m),{},{components:a})):n.createElement(g,l({ref:t},m))}));function g(e,t){var a=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var r=a.length,l=new Array(r);l[0]=u;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[p]="string"==typeof e?e:i,l[1]=o;for(var d=2;d<r;d++)l[d]=a[d];return n.createElement.apply(null,l)}return n.createElement.apply(null,a)}u.displayName="MDXCreateElement"},64024:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>c,frontMatter:()=>r,metadata:()=>o,toc:()=>d});var n=a(87462),i=(a(67294),a(3905));const r={title:"SCS Standard Images",type:"Standard",status:"Draft",track:"IaaS"},l=void 0,o={unversionedId:"scs-0104-v1-standard-images",id:"scs-0104-v1-standard-images",title:"SCS Standard Images",description:"Introduction",source:"@site/standards/scs-0104-v1-standard-images.md",sourceDirName:".",slug:"/scs-0104-v1-standard-images",permalink:"/standards/scs-0104-v1-standard-images",draft:!1,tags:[],version:"current",frontMatter:{title:"SCS Standard Images",type:"Standard",status:"Draft",track:"IaaS"},sidebar:"standards",previous:{title:"SCS-0104: Standard Images",permalink:"/standards/iaas/scs-0104"},next:{title:"KaaS Standards",permalink:"/standards/kaas/"}},s={},d=[{value:"Introduction",id:"introduction",level:2},{value:"Motivation",id:"motivation",level:2},{value:"Uploading custom images",id:"uploading-custom-images",level:2},{value:"Standard images YAML",id:"standard-images-yaml",level:2},{value:"Image specification, single image",id:"image-specification-single-image",level:3},{value:"Image specification, class of images",id:"image-specification-class-of-images",level:3},{value:"Full example",id:"full-example",level:2},{value:"Lifecycle considerations",id:"lifecycle-considerations",level:2},{value:"YAML lifecycle",id:"yaml-lifecycle",level:3},{value:"Image lifecycle",id:"image-lifecycle",level:3},{value:"Conformance Tests",id:"conformance-tests",level:2},{value:"Operational tooling",id:"operational-tooling",level:2}],m={toc:d},p="wrapper";function c(e){let{components:t,...a}=e;return(0,i.kt)(p,(0,n.Z)({},m,a,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"introduction"},"Introduction"),(0,i.kt)("p",null,"The ",(0,i.kt)("a",{parentName:"p",href:"https://scs.community"},"Sovereign Cloud Stack (SCS)")," provides standards for a range of cloud infrastructure types.\nIt strives for interoperable and sovereign cloud offerings which can be deployed and used by a wide range of organizations and individuals."),(0,i.kt)("p",null,"To this end, SCS unifies the naming and sourcing of virtual machine images, and for certain images their presence is mandated or recommended."),(0,i.kt)("h2",{id:"motivation"},"Motivation"),(0,i.kt)("p",null,"Following the example of the ",(0,i.kt)("a",{parentName:"p",href:"/standards/scs-0003-v1-sovereign-cloud-standards-yaml"},"SCS standards YAML"),",\nthis standard establishes, by means of a YAML file, a mechanism with the following main objectives:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"to maintain a list of mandatory, recommended, and optional images, which also fixes the source location,"),(0,i.kt)("li",{parentName:"ul"},"to provide a machine-readable document for further processing (e.g. for a compliance tool suite or continuous integration).")),(0,i.kt)("h2",{id:"uploading-custom-images"},"Uploading custom images"),(0,i.kt)("p",null,"Image upload via Glance MUST be allowed. If quotas are imposed at all, the following rule applies:\nIt MUST be possible to upload at least 40 images and at least 200 GiB total."),(0,i.kt)("h2",{id:"standard-images-yaml"},"Standard images YAML"),(0,i.kt)("p",null,"The YAML file MUST contain the key ",(0,i.kt)("inlineCode",{parentName:"p"},"images"),", whose value is a list of objects. Each object has one of two forms, as described below."),(0,i.kt)("h3",{id:"image-specification-single-image"},"Image specification, single image"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Key"),(0,i.kt)("th",{parentName:"tr",align:null},"Type"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Example"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"name")),(0,i.kt)("td",{parentName:"tr",align:null},"String"),(0,i.kt)("td",{parentName:"tr",align:null},"Name of the image"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},'"Debian 12"'))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"status")),(0,i.kt)("td",{parentName:"tr",align:null},"String"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("em",{parentName:"td"},"optional"),": either ",(0,i.kt)("inlineCode",{parentName:"td"},"mandatory")," or ",(0,i.kt)("inlineCode",{parentName:"td"},"recommended")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},'"recommended"'))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"source")),(0,i.kt)("td",{parentName:"tr",align:null},"String"),(0,i.kt)("td",{parentName:"tr",align:null},"Prefix of the source URL"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},'"https://cloud.debian.org/images/cloud/bookworm/"'))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null}),(0,i.kt)("td",{parentName:"tr",align:null},"OR: List of strings"),(0,i.kt)("td",{parentName:"tr",align:null},"multiple possible prefixes"),(0,i.kt)("td",{parentName:"tr",align:null},"(see full example below)")))),(0,i.kt)("p",null,"The meaning of this specification is as follows."),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"If the status is ",(0,i.kt)("inlineCode",{parentName:"li"},"mandatory"),", then the image MUST be present."),(0,i.kt)("li",{parentName:"ol"},"If an image by the name given is present, then its ",(0,i.kt)("inlineCode",{parentName:"li"},"image_source")," property\n(as described in the ",(0,i.kt)("a",{parentName:"li",href:"/standards/scs-0102-v1-image-metadata"},"Image Metadata standard"),")\nMUST start with one of the prefixes given via ",(0,i.kt)("inlineCode",{parentName:"li"},"source"),".")),(0,i.kt)("h3",{id:"image-specification-class-of-images"},"Image specification, class of images"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Key"),(0,i.kt)("th",{parentName:"tr",align:null},"Type"),(0,i.kt)("th",{parentName:"tr",align:null},"Description"),(0,i.kt)("th",{parentName:"tr",align:null},"Example"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"name")),(0,i.kt)("td",{parentName:"tr",align:null},"String"),(0,i.kt)("td",{parentName:"tr",align:null},"Name of the class of images"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},'"ubuntu-2204-kube"'))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"name_scheme")),(0,i.kt)("td",{parentName:"tr",align:null},"String (regex)"),(0,i.kt)("td",{parentName:"tr",align:null},"Regular expression for the image name"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},'"ubuntu-2204-kube-v[0-9].[0-9]+(.[0-9]+)?"'))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"status")),(0,i.kt)("td",{parentName:"tr",align:null},"String"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("em",{parentName:"td"},"optional"),": either ",(0,i.kt)("inlineCode",{parentName:"td"},"mandatory")," or ",(0,i.kt)("inlineCode",{parentName:"td"},"recommended")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},'"recommended"'))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"source")),(0,i.kt)("td",{parentName:"tr",align:null},"String"),(0,i.kt)("td",{parentName:"tr",align:null},"Prefix of the source URL"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},'"https://swift.services.a.regiocloud.tech"'))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null}),(0,i.kt)("td",{parentName:"tr",align:null},"OR: List of strings"),(0,i.kt)("td",{parentName:"tr",align:null},"multiple possible prefixes"),(0,i.kt)("td",{parentName:"tr",align:null},"(see full example below)")))),(0,i.kt)("p",null,"The meaning of this specification is as follows:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"If the status is ",(0,i.kt)("inlineCode",{parentName:"li"},"mandatory"),", then at least one image MUST be present whose name\nmatches the regular expression given via ",(0,i.kt)("inlineCode",{parentName:"li"},"name_scheme"),"."),(0,i.kt)("li",{parentName:"ol"},"For any image whose name matches the regular expression given via ",(0,i.kt)("inlineCode",{parentName:"li"},"name_scheme"),",\nits ",(0,i.kt)("inlineCode",{parentName:"li"},"image_source")," property MUST start with one of the prefixes given via ",(0,i.kt)("inlineCode",{parentName:"li"},"source"),".")),(0,i.kt)("h2",{id:"full-example"},"Full example"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-yaml"},'images:\n- name: "Ubuntu 22.04"\n source:\n - https://cloud-images.ubuntu.com/releases/jammy/\n - https://cloud-images.ubuntu.com/jammy/\n status: mandatory\n- name: "ubuntu-capi-image"\n name_scheme: "ubuntu-capi-image-v[0-9].[0-9]+(.[0-9]+)?"\n source: https://swift.services.a.regiocloud.tech/swift/v1/AUTH_b182637428444b9aa302bb8d5a5a418c/openstack-k8s-capi-images/ubuntu-2204-kube\n status: recommended\n- name: "Ubuntu 20.04"\n source:\n - https://cloud-images.ubuntu.com/releases/focal/\n - https://cloud-images.ubuntu.com/focal/\n- name: "Debian 12"\n source:\n - https://cloud.debian.org/images/cloud/bookworm/\n - https://cdimage.debian.org/cdimage/cloud/bookworm/\n- name: "Debian 11"\n source:\n - https://cloud.debian.org/images/cloud/bullseye/\n - https://cdimage.debian.org/cdimage/cloud/bullseye/\n')),(0,i.kt)("p",null,"This example provides allowable source prefixes for two Debian versions, two Ubuntu\nversions, and for any version of the Kubernetes cloud API provider. Only the latter is\nrecommended, while only Ubuntu 22.04 is mandatory."),(0,i.kt)("h2",{id:"lifecycle-considerations"},"Lifecycle considerations"),(0,i.kt)("h3",{id:"yaml-lifecycle"},"YAML lifecycle"),(0,i.kt)("p",null,"The YAML file is generally located in this repository under ",(0,i.kt)("inlineCode",{parentName:"p"},"/Tests/iaas"),"."),(0,i.kt)("p",null,"Any change that could render existing installations non-conformant (i.e., when new\nspecifications are added, when the name scheme of a specification is changed so as to\nmatch more names than before, when the status of an existing specification changes to\nmandatory, or when some source prefix is removed) requires a new YAML file to be created.\nAs a consequence, any currently valid certificates stay valid; the change can only take\neffect in a new version of the certificate in question, if so desired."),(0,i.kt)("h3",{id:"image-lifecycle"},"Image lifecycle"),(0,i.kt)("p",null,"It is important to note that this standard does not prohibit any images, and neither\ndoes it preclude the operator from providing any and all optional images."),(0,i.kt)("p",null,"It is possible that a specification is mandatory in one version and non-mandatory in the\nnext version. This standard makes no statement as to what is supposed to happen to the\ncorresponding images in a live cloud environment. It is recommended to keep the\nonce-mandatory images in the live environment. As for new environments, it is up to the\noperator whether to provide any or all of these images, as stated above."),(0,i.kt)("h2",{id:"conformance-tests"},"Conformance Tests"),(0,i.kt)("p",null,"The script ",(0,i.kt)("inlineCode",{parentName:"p"},"images-openstack.py")," will read the lists of mandatory and recommended images\nfrom a yaml file provided as command-line argument, connect to an OpenStack installation,\nand check whether the images are present. Missing images will be reported on various\nlogging channels: error for mandatory, info for recommended images. Additionally, images\nwhose ",(0,i.kt)("inlineCode",{parentName:"p"},"image_source")," does not conform with the specifications will be reported on the\nerror channel. The return code will be non-zero if the test could not be performed or\nif any errors have been reported."),(0,i.kt)("h2",{id:"operational-tooling"},"Operational tooling"),(0,i.kt)("p",null,"The ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/osism/openstack-image-manager"},"openstack-image-manager")," is able to\ncreate all standard, mandatory SCS images for you given image definitions from a YAML file."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a51c5cdb.e128bc50.js b/assets/js/a51c5cdb.e128bc50.js new file mode 100644 index 0000000000..8fe7bdec92 --- /dev/null +++ b/assets/js/a51c5cdb.e128bc50.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6002],{3905:(t,e,n)=>{n.d(e,{Zo:()=>m,kt:()=>u});var a=n(67294);function r(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function l(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);e&&(a=a.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,a)}return n}function i(t){for(var e=1;e<arguments.length;e++){var n=null!=arguments[e]?arguments[e]:{};e%2?l(Object(n),!0).forEach((function(e){r(t,e,n[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(n,e))}))}return t}function d(t,e){if(null==t)return{};var n,a,r=function(t,e){if(null==t)return{};var n,a,r={},l=Object.keys(t);for(a=0;a<l.length;a++)n=l[a],e.indexOf(n)>=0||(r[n]=t[n]);return r}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(a=0;a<l.length;a++)n=l[a],e.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(r[n]=t[n])}return r}var o=a.createContext({}),p=function(t){var e=a.useContext(o),n=e;return t&&(n="function"==typeof t?t(e):i(i({},e),t)),n},m=function(t){var e=p(t.components);return a.createElement(o.Provider,{value:e},t.children)},k="mdxType",N={inlineCode:"code",wrapper:function(t){var e=t.children;return a.createElement(a.Fragment,{},e)}},s=a.forwardRef((function(t,e){var n=t.components,r=t.mdxType,l=t.originalType,o=t.parentName,m=d(t,["components","mdxType","originalType","parentName"]),k=p(n),s=r,u=k["".concat(o,".").concat(s)]||k[s]||N[s]||l;return n?a.createElement(u,i(i({ref:e},m),{},{components:n})):a.createElement(u,i({ref:e},m))}));function u(t,e){var n=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var l=n.length,i=new Array(l);i[0]=s;var d={};for(var o in e)hasOwnProperty.call(e,o)&&(d[o]=e[o]);d.originalType=t,d[k]="string"==typeof t?t:r,i[1]=d;for(var p=2;p<l;p++)i[p]=n[p];return a.createElement.apply(null,i)}return a.createElement.apply(null,n)}s.displayName="MDXCreateElement"},26346:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>o,contentTitle:()=>i,default:()=>N,frontMatter:()=>l,metadata:()=>d,toc:()=>p});var a=n(87462),r=(n(67294),n(3905));const l={},i="Configuration",d={unversionedId:"container/components/k8s-cluster-api-provider/doc/configuration",id:"container/components/k8s-cluster-api-provider/doc/configuration",title:"Configuration",description:"Supported k8s versions",source:"@site/docs/03-container/components/k8s-cluster-api-provider/doc/configuration.md",sourceDirName:"03-container/components/k8s-cluster-api-provider/doc",slug:"/container/components/k8s-cluster-api-provider/doc/configuration",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/configuration",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/03-container/components/k8s-cluster-api-provider/doc/configuration.md",tags:[],version:"current",frontMatter:{},sidebar:"docs",previous:{title:"Application Credentials",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/application-credentials"},next:{title:"Maintenance and Troubleshooting Guide for SCS k8s-cluster-api-provider",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/Maintenance_and_Troubleshooting"}},o={},p=[{value:"Supported k8s versions",id:"supported-k8s-versions",level:2},{value:"Overview over the parameters in clusterctl.yaml and environment-XXX.tfvars",id:"overview-over-the-parameters-in-clusterctlyaml-and-environment-xxxtfvars",level:2},{value:"Parameters CAPI management server",id:"parameters-capi-management-server",level:3},{value:"Common parameters management server and clusters",id:"common-parameters-management-server-and-clusters",level:3},{value:"Parameters clusters",id:"parameters-clusters",level:3}],m={toc:p},k="wrapper";function N(t){let{components:e,...n}=t;return(0,r.kt)(k,(0,a.Z)({},m,n,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"configuration"},"Configuration"),(0,r.kt)("h2",{id:"supported-k8s-versions"},"Supported k8s versions"),(0,r.kt)("p",null,"As of R5, our tests cover 1.24.latest ... 1.27.latest.\nAll of them pass the sonobuoy CNCF conformance tests."),(0,r.kt)("h2",{id:"overview-over-the-parameters-in-clusterctlyaml-and-environment-xxxtfvars"},"Overview over the parameters in clusterctl.yaml and environment-XXX.tfvars"),(0,r.kt)("p",null,"The provenance capo means that this setting comes from the templates used by\nthe cluster-api-provider-openstack, while SCS denotes that this setting has\nbeen added by the SCS project."),(0,r.kt)("h3",{id:"parameters-capi-management-server"},"Parameters CAPI management server"),(0,r.kt)("p",null,"Parameters controlling the Cluster-API management server (capi management server) creation:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"environment"),(0,r.kt)("th",{parentName:"tr",align:null},"clusterctl.yaml"),(0,r.kt)("th",{parentName:"tr",align:null},"provenance"),(0,r.kt)("th",{parentName:"tr",align:null},"default"),(0,r.kt)("th",{parentName:"tr",align:null},"meaning"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"prefix")),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"capi")),(0,r.kt)("td",{parentName:"tr",align:null},"Prefix used for OpenStack resources for the capi mgmt node")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"kind_flavor")),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"SCS-2V-4")),(0,r.kt)("td",{parentName:"tr",align:null},"Flavor to be used for the k8s capi mgmt server")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"image")),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Ubuntu 22.04")),(0,r.kt)("td",{parentName:"tr",align:null},"Image for the capi mgmt server. Use ",(0,r.kt)("inlineCode",{parentName:"td"},"Ubuntu 22.04")," or ",(0,r.kt)("inlineCode",{parentName:"td"},"Debian 12"),". Check also the ",(0,r.kt)("inlineCode",{parentName:"td"},"ssh_username")," parameter")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"ssh_username")),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"ubuntu")),(0,r.kt)("td",{parentName:"tr",align:null},"Name of the default user for the ",(0,r.kt)("inlineCode",{parentName:"td"},"image"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"clusterapi_version")),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"1.5.3")," "),(0,r.kt)("td",{parentName:"tr",align:null},"Version of the cluster-API incl. ",(0,r.kt)("inlineCode",{parentName:"td"},"clusterctl"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"capi_openstack_version")),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"0.8.0")," "),(0,r.kt)("td",{parentName:"tr",align:null},"Version of the cluster-api-provider-openstack (needs to fit the CAPI version)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"cilium_binaries")),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"v0.15.7;v0.12.0")),(0,r.kt)("td",{parentName:"tr",align:null},"Versions of the cilium and hubble CLI in the vA.B.C;vX.Y.Z format")))),(0,r.kt)("h3",{id:"common-parameters-management-server-and-clusters"},"Common parameters management server and clusters"),(0,r.kt)("p",null,"Parameters controlling both management server creation and cluster creation:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"environment"),(0,r.kt)("th",{parentName:"tr",align:null},"clusterctl.yaml"),(0,r.kt)("th",{parentName:"tr",align:null},"provenance"),(0,r.kt)("th",{parentName:"tr",align:null},"default"),(0,r.kt)("th",{parentName:"tr",align:null},"meaning"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"cloud_provider")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"OPENSTACK_CLOUD")),(0,r.kt)("td",{parentName:"tr",align:null},"capo"),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"OS_CLOUD")," name in clouds.yaml")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"external"),"/",(0,r.kt)("inlineCode",{parentName:"td"},"external_id")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"OPENSTACK_EXTERNAL_NETWORK_ID")),(0,r.kt)("td",{parentName:"tr",align:null},"capo"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},'""')),(0,r.kt)("td",{parentName:"tr",align:null},'Name/ID of the external (public) OpenStack network, default "" uses the detected external network (for clouds with one external network). Required for clouds with more than one external network')),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"dns_nameservers")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"OPENSTACK_DNS_NAMESERVERS")),(0,r.kt)("td",{parentName:"tr",align:null},"capo"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},'[ "5.1.66.255", "185.150.99.255" ]')),(0,r.kt)("td",{parentName:"tr",align:null},"Array of nameservers for capi mgmt server and for cluster nodes, replace the FF MUC defaults with local servers if available")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"availability_zone")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"OPENSTACK_FAILURE_DOMAIN")),(0,r.kt)("td",{parentName:"tr",align:null},"capo"),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null},"Availability Zone(s) for the mgmt node / workload clusters")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"kind_mtu")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"MTU_VALUE")),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"0")),(0,r.kt)("td",{parentName:"tr",align:null},"MTU for the mgmt server; Calico is set 50 bytes smaller; 0 means autodetection")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"restrict_mgmt_server")),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},'["0.0.0.0/0"]')),(0,r.kt)("td",{parentName:"tr",align:null},"Allows restricting access to the management server by the given list of CIDRs. Empty value (default) means public.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"http_proxy"),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null},'Global setting for HTTP Proxy is set on the management host including all cluster-api components running in the bootstrap-cluster. Specify with protocol: e.g "',(0,r.kt)("a",{parentName:"td",href:"http://10.10.10.10:3128%22"},'http://10.10.10.10:3128"'))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"no_proxy"),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null},"Global setting for HTTP Proxy exception list. If ",(0,r.kt)("inlineCode",{parentName:"td"},"http_proxy")," is not set this setting has no effect. If ",(0,r.kt)("inlineCode",{parentName:"td"},"http_proxy")," is set, the default value for the ",(0,r.kt)("inlineCode",{parentName:"td"},"NO_PROXY")," environment variable on all affected components is set to ",(0,r.kt)("inlineCode",{parentName:"td"},".svc,.svc.cluster,.svc.cluster.local,127.0.0.0/8,169.254.169.254/32,fd00:ec2::254/128,${var.node_cidr},${var.pod_cidr},${var.service_cidr}"),". The content of ",(0,r.kt)("inlineCode",{parentName:"td"},"no_proxy")," is appended to this list. This setting has no effect on apt and snap commands, the way ",(0,r.kt)("inlineCode",{parentName:"td"},"http_proxy")," is set for apt and snap does not allow the configuration of proxy exceptions.")))),(0,r.kt)("h3",{id:"parameters-clusters"},"Parameters clusters"),(0,r.kt)("p",null,"Parameters controlling the cluster creation:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"environment"),(0,r.kt)("th",{parentName:"tr",align:null},"clusterctl.yaml"),(0,r.kt)("th",{parentName:"tr",align:null},"provenance"),(0,r.kt)("th",{parentName:"tr",align:null},"default"),(0,r.kt)("th",{parentName:"tr",align:null},"meaning"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"node_cidr")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"NODE_CIDR")),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"10.8.0.0/20")),(0,r.kt)("td",{parentName:"tr",align:null},"IPv4 address range (CIDR notation) for workload nodes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"pod_cidr")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"POD_CIDR")),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"192.168.0.0/16")),(0,r.kt)("td",{parentName:"tr",align:null},"IPv4 address range (CIDR notation) for pods")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"service_cidr")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"SERVICE_CIDR")),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"10.96.0.0/12")),(0,r.kt)("td",{parentName:"tr",align:null},"IPv4 address range (CIDR notation) for services")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"use_cilium")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"USE_CILIUM")),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"true")),(0,r.kt)("td",{parentName:"tr",align:null},"Use cilium as CNI instead of calico, it can be set to vX.Y.Z and ",(0,r.kt)("inlineCode",{parentName:"td"},"true")," results in ",(0,r.kt)("inlineCode",{parentName:"td"},"v1.14.1"),", also see ",(0,r.kt)("inlineCode",{parentName:"td"},"cilium_binaries"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"calico_version")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"CALICO_VERSION")),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"v3.26.4")," "),(0,r.kt)("td",{parentName:"tr",align:null},"Version of the Calico CNI provider (ignored if ",(0,r.kt)("inlineCode",{parentName:"td"},"use_cilium")," is set)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"kubernetes_version")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"KUBERNETES_VERSION")),(0,r.kt)("td",{parentName:"tr",align:null},"capo"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"v1.27.x")),(0,r.kt)("td",{parentName:"tr",align:null},"Kubernetes version deployed into workload cluster (",(0,r.kt)("inlineCode",{parentName:"td"},".x")," means latest patch release)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"``"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"OPENSTACK_IMAGE_NAME")),(0,r.kt)("td",{parentName:"tr",align:null},"capo"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"ubuntu-capi-image-${KUBERNETES_VERION}")),(0,r.kt)("td",{parentName:"tr",align:null},"Image name for k8s controller and worker nodes. Ubuntu 22.04 image is used for k8s versions >= 1.27.3, 1.26.6, 1.25.11, Ubuntu 20.04 otherwise.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"kube_image_raw")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"OPENSTACK_IMAGE_RAW")),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"true")),(0,r.kt)("td",{parentName:"tr",align:null},"Register images in raw format (instead of qcow2), good for ceph COW")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"image_registration_extra_flags")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"OPENSTACK_IMAGE_REGISTATION_EXTRA_FLAGS")),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},'""')),(0,r.kt)("td",{parentName:"tr",align:null},"Extra flags passed during image registration")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"``"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"OPENSTACK_CONTROL_PLANE_IP")),(0,r.kt)("td",{parentName:"tr",align:null},"capo"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"127.0.0.1")),(0,r.kt)("td",{parentName:"tr",align:null},"Use localhost to talk to capi cluster (don't change this!)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"``"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"OPENSTACK_SSH_KEY_NAME")),(0,r.kt)("td",{parentName:"tr",align:null},"capo"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"${prefix}-keypair")),(0,r.kt)("td",{parentName:"tr",align:null},"SSH key name generated and used to connect to workload cluster nodes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"controller_flavor")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"OPENSTACK_CONTROL_PLANE_MACHINE_FLAVOR")),(0,r.kt)("td",{parentName:"tr",align:null},"capo"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"SCS-2V-4-20s")),(0,r.kt)("td",{parentName:"tr",align:null},"Flavor to be used for control plane nodes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"worker_flavor")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"OPENSTACK_NODE_MACHINE_FLAVOR")),(0,r.kt)("td",{parentName:"tr",align:null},"capo"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"SCS-2V-4-20s")),(0,r.kt)("td",{parentName:"tr",align:null},"Flavor to be used for worker nodes")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"controller_count")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"CONTROL_PLANE_MACHINE_COUNT")),(0,r.kt)("td",{parentName:"tr",align:null},"capo"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"1")),(0,r.kt)("td",{parentName:"tr",align:null},"Number of control plane nodes in testcluster (0 skips testcluster creation)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"``"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"CONTROL_PLANE_MACHINE_GEN")),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"genc01")),(0,r.kt)("td",{parentName:"tr",align:null},"Suffix for control plane node resources, to be changed for rolling upgrades")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"worker_count")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"WORKER_MACHINE_COUNT")),(0,r.kt)("td",{parentName:"tr",align:null},"capo"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"3")),(0,r.kt)("td",{parentName:"tr",align:null},"Number of worker nodes in testcluster")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"``"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"WORKER_MACHINE_GEN")),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"genw01")),(0,r.kt)("td",{parentName:"tr",align:null},"Suffix for worker node resources, to be changed for rolling upgrades")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"``"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"CONTROL_PLANE_ROOT_DISKSIZE")),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"20")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"If")," diskless flavors are used for control plane nodes, this is the allocated root volume disk size (in GB)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"``"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"WORKER_ROOT_DISKSIZE")),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"20")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"If")," diskless flavors are used for worker nodes, this is the allocated root volume disk size (in GB)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"anti_affinity")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"OPENSTACK_ANTI_AFFINITY")),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"true")),(0,r.kt)("td",{parentName:"tr",align:null},"Use anti-affinity server groups to prevent k8s nodes on same host (soft for workers, hard for controllers)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"``"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"OPENSTACK_SRVGRP_CONTROLLER")),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"nonono")),(0,r.kt)("td",{parentName:"tr",align:null},"Autogenerated if ",(0,r.kt)("inlineCode",{parentName:"td"},"anti_affinity")," is ",(0,r.kt)("inlineCode",{parentName:"td"},"true"),", eliminated otherwise")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"``"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"OPENSTACK_SRVGRP_WORKER")),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"nonono")),(0,r.kt)("td",{parentName:"tr",align:null},"Autogenerated if ",(0,r.kt)("inlineCode",{parentName:"td"},"anti_affinity")," is ",(0,r.kt)("inlineCode",{parentName:"td"},"true"),", eliminated otherwise")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"deploy_occm")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"DEPLOY_OCCM")),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"true")),(0,r.kt)("td",{parentName:"tr",align:null},"Deploy the given version of OCCM into the cluster. ",(0,r.kt)("inlineCode",{parentName:"td"},"true")," (default) chooses the latest version matching the k8s version. You can specify ",(0,r.kt)("inlineCode",{parentName:"td"},"master")," to chose the upstream master branch. Don't disable this.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"deploy_cindercsi")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"DEPLOY_CINDERCSI")),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"true")),(0,r.kt)("td",{parentName:"tr",align:null},"Deploy the given (or latest matching for the default true value) of cinder CSI.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"etcd_unsafe_fs")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"ETCD_UNSAFE_FS")),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"false")),(0,r.kt)("td",{parentName:"tr",align:null},"Use ",(0,r.kt)("inlineCode",{parentName:"td"},"barrier=0")," for filesystem on control nodes to avoid storage latency. Use for multi-controller clusters on slow/networked storage, otherwise not recommended.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"testcluster_name")),(0,r.kt)("td",{parentName:"tr",align:null},"(cmd line)"),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"testcluster")),(0,r.kt)("td",{parentName:"tr",align:null},"Allows setting the default cluster name, created at bootstrap (if ",(0,r.kt)("inlineCode",{parentName:"td"},"controller_count")," is larger than 0)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"restrict_kubeapi")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"RESTRICT_KUBEAPI")),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"[ ]")),(0,r.kt)("td",{parentName:"tr",align:null},"Allows restricting access to kubernetes API by list of CIDRs. Empty list (default) means public, ",(0,r.kt)("inlineCode",{parentName:"td"},'[ "none" ]')," means internal access only.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"capo_instance_create_timeout")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"CLUSTER_API_OPENSTACK_INSTANCE_CREATE_TIMEOUT")),(0,r.kt)("td",{parentName:"tr",align:null},"capo"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"5")),(0,r.kt)("td",{parentName:"tr",align:null},"Time to wait for an OpenStack machine to be created (in minutes)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"containerd_registry_files")),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},'{"hosts":["./files/containerd/docker.io"], "certs":[]}')),(0,r.kt)("td",{parentName:"tr",align:null},"Containerd registry hosts config files, see related ",(0,r.kt)("a",{parentName:"td",href:"/docs/container/components/k8s-cluster-api-provider/doc/usage/containter-registry-configuration"},"docs")," for details.")))),(0,r.kt)("p",null,"Optional services deployed to cluster:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"environment"),(0,r.kt)("th",{parentName:"tr",align:null},"clusterctl.yaml"),(0,r.kt)("th",{parentName:"tr",align:null},"provenance"),(0,r.kt)("th",{parentName:"tr",align:null},"default"),(0,r.kt)("th",{parentName:"tr",align:null},"script"),(0,r.kt)("th",{parentName:"tr",align:null},"meaning"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"deploy_metrics")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"DEPLOY_METRICS")),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"true")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"apply_metrics.sh")),(0,r.kt)("td",{parentName:"tr",align:null},"Deploy metrics service to nodes to make ",(0,r.kt)("inlineCode",{parentName:"td"},"kubectl top")," work")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"deploy_nginx_ingress")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"DEPLOY_NGINX_INGRESS")),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"true")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"apply_nginx_ingress.sh")),(0,r.kt)("td",{parentName:"tr",align:null},"Deploy NGINX ingress controller (this spawns an OpenStack Loadbalancer), pass version to explicitly choose the version, ",(0,r.kt)("inlineCode",{parentName:"td"},"true")," results in ",(0,r.kt)("inlineCode",{parentName:"td"},"v1.8.1")," (supported k8s >= 1.24)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"``"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"NGINX_INGRESS_PROXY")),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"true")),(0,r.kt)("td",{parentName:"tr",align:null},"(dito)"),(0,r.kt)("td",{parentName:"tr",align:null},"Configure LB and nginx to get real IP via PROXY protocol; trouble for pod to LB connections has been resolved by setting hostname")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"use_ovn_lb_provider")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"USE_OVN_LB_PROVIDER")),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"false")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"apply_nginx_ingress.sh")),(0,r.kt)("td",{parentName:"tr",align:null},"Clouds using OVN networking can deploy the OVN provider that has low overhead (L3) and makes real client IPs visible without proxy protocol hacks. Set to ",(0,r.kt)("inlineCode",{parentName:"td"},"auto")," to enable; not yet ready for prime time, thus defaults to ",(0,r.kt)("inlineCode",{parentName:"td"},"false"),".")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"deploy_gateway_api")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"DEPLOY_GATEWAY_API")),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"false")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"create_cluster.sh")),(0,r.kt)("td",{parentName:"tr",align:null},'Deploy Gateway APIs CRDs and enable ciliums Gateway API implementation. This only works in conjunction with USE_CILIUM=true. Also this will break at least one CNCF conformance test. This feature is considered a tech-review. Keep in mind that Gateway API itself is under development and not GA. Also note that ciliums implementation of Gateway API is considered "beta".')),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"deploy_cert_manager")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"DEPLOY_CERT_MANAGER")),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"false")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"apply_cert_manager.sh")),(0,r.kt)("td",{parentName:"tr",align:null},"Deploy cert-manager, pass version (e.g. ",(0,r.kt)("inlineCode",{parentName:"td"},"v1.12.4"),") to explicitly choose a version")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"deploy_flux")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"DEPLOY_FLUX")),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"false")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"create_cluster.sh")),(0,r.kt)("td",{parentName:"tr",align:null},"Deploy flux2 into the cluster")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"deploy_harbor")),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"false")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"deploy_harbor.sh")),(0,r.kt)("td",{parentName:"tr",align:null},"Deploy harbor into the cluster. When enabled, it will overwrite the settings above. Harbor forces deployment of ",(0,r.kt)("inlineCode",{parentName:"td"},"flux")," and based on config, it can force deployment of other dependencies (",(0,r.kt)("inlineCode",{parentName:"td"},"cert-manager"),", ",(0,r.kt)("inlineCode",{parentName:"td"},"ingress-nginx")," and ",(0,r.kt)("inlineCode",{parentName:"td"},"Cinder CSI"),")")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"harbor_config")),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null},"SCS"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},'{domain_name:"", issuer_email:"", persistence:false, database_size:"1Gi", redis_size:"1Gi", trivy_size:"5Gi"}')),(0,r.kt)("td",{parentName:"tr",align:null},"(dito)"),(0,r.kt)("td",{parentName:"tr",align:null},"Harbor container registry configuration options, see related ",(0,r.kt)("a",{parentName:"td",href:"/docs/container/components/k8s-cluster-api-provider/doc/usage/harbor"},"docs")," for details.")))))}N.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a51f78bf.66f3f342.js b/assets/js/a51f78bf.66f3f342.js new file mode 100644 index 0000000000..ad6697af0d --- /dev/null +++ b/assets/js/a51f78bf.66f3f342.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2447],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>g});var r=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=r.createContext({}),m=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=m(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=m(n),d=o,g=u["".concat(s,".").concat(d)]||u[d]||p[d]||a;return n?r.createElement(g,i(i({ref:t},c),{},{components:n})):r.createElement(g,i({ref:t},c))}));function g(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:o,i[1]=l;for(var m=2;m<a;m++)i[m]=n[m];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},92883:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>p,frontMatter:()=>a,metadata:()=>l,toc:()=>m});var r=n(87462),o=(n(67294),n(3905));const a={sidebar_label:"Timezone"},i="Timezone",l={unversionedId:"iaas/guides/configuration-guide/commons/timezone",id:"iaas/guides/configuration-guide/commons/timezone",title:"Timezone",description:"With the osism.commons.timezone role, it is possible to manage the used timezone on a node.",source:"@site/docs/02-iaas/guides/configuration-guide/commons/timezone.md",sourceDirName:"02-iaas/guides/configuration-guide/commons",slug:"/iaas/guides/configuration-guide/commons/timezone",permalink:"/docs/iaas/guides/configuration-guide/commons/timezone",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/configuration-guide/commons/timezone.md",tags:[],version:"current",frontMatter:{sidebar_label:"Timezone"},sidebar:"docs",previous:{title:"Sysctl",permalink:"/docs/iaas/guides/configuration-guide/commons/sysctl"},next:{title:"Services",permalink:"/docs/iaas/guides/configuration-guide/services/"}},s={},m=[],c={toc:m},u="wrapper";function p(e){let{components:t,...n}=e;return(0,o.kt)(u,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"timezone"},"Timezone"),(0,o.kt)("p",null,"With the ",(0,o.kt)("inlineCode",{parentName:"p"},"osism.commons.timezone")," role, it is possible to manage the used timezone on a node."),(0,o.kt)("p",null,"This role is just a wrapper for the ",(0,o.kt)("a",{parentName:"p",href:"https://docs.ansible.com/ansible/latest/collections/community/general/timezone_module.html"},"community.general.timezone"),"\nmodule. The role also installs the ",(0,o.kt)("inlineCode",{parentName:"p"},"tzdata")," package."),(0,o.kt)("table",null,(0,o.kt)("thead",{parentName:"table"},(0,o.kt)("tr",{parentName:"thead"},(0,o.kt)("th",{parentName:"tr",align:null},(0,o.kt)("strong",{parentName:"th"},"Parameter")),(0,o.kt)("th",{parentName:"tr",align:null},(0,o.kt)("strong",{parentName:"th"},"Default")),(0,o.kt)("th",{parentName:"tr",align:null},(0,o.kt)("strong",{parentName:"th"},"Description")))),(0,o.kt)("tbody",{parentName:"table"},(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("inlineCode",{parentName:"td"},"timezone_hwclock")),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("inlineCode",{parentName:"td"},"UTC")),(0,o.kt)("td",{parentName:"tr",align:null},"Whether the hardware clock is in UTC or in local timezone.")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("inlineCode",{parentName:"td"},"timezone_name")),(0,o.kt)("td",{parentName:"tr",align:null},(0,o.kt)("inlineCode",{parentName:"td"},"UTC")),(0,o.kt)("td",{parentName:"tr",align:null},"Name of the timezone for the system clock.")))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a58a5045.5a291913.js b/assets/js/a58a5045.5a291913.js new file mode 100644 index 0000000000..a4604fe81c --- /dev/null +++ b/assets/js/a58a5045.5a291913.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4504],{9273:e=>{e.exports=JSON.parse('{"title":"SCS-0401","slug":"standards/scs-0401","permalink":"/standards/standards/scs-0401","navigation":{"previous":{"title":"Status Page create decision","permalink":"/standards/scs-0400-v1-status-page-create-decision"},"next":{"title":"Status page reference implementation decision","permalink":"/standards/scs-0401-v1-status-page-reference-implementation-decision"}}}')}}]); \ No newline at end of file diff --git a/assets/js/a6aa9e1f.31d56e6b.js b/assets/js/a6aa9e1f.31d56e6b.js new file mode 100644 index 0000000000..1665dc1b64 --- /dev/null +++ b/assets/js/a6aa9e1f.31d56e6b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3089],{80046:(e,t,a)=>{a.r(t),a.d(t,{default:()=>u});var n=a(67294),l=a(86010),r=a(52263),i=a(1944),o=a(35281),s=a(39058),c=a(99703),m=a(90197),g=a(79985);function p(e){const{metadata:t}=e,{siteConfig:{title:a}}=(0,r.Z)(),{blogDescription:l,blogTitle:o,permalink:s}=t,c="/"===s?a:o;return n.createElement(n.Fragment,null,n.createElement(i.d,{title:c,description:l}),n.createElement(m.Z,{tag:"blog_posts_list"}))}function d(e){const{metadata:t,items:a,sidebar:l}=e;return n.createElement(s.Z,{sidebar:l},n.createElement(g.Z,{items:a}),n.createElement(c.Z,{metadata:t}))}function u(e){return n.createElement(i.FG,{className:(0,l.Z)(o.k.wrapper.blogPages,o.k.page.blogListPage)},n.createElement(p,e),n.createElement(d,e))}},99703:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(67294),l=a(95999),r=a(32244);function i(e){const{metadata:t}=e,{previousPage:a,nextPage:i}=t;return n.createElement("nav",{className:"pagination-nav","aria-label":(0,l.I)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"})},a&&n.createElement(r.Z,{permalink:a,title:n.createElement(l.Z,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)"},"Newer Entries")}),i&&n.createElement(r.Z,{permalink:i,title:n.createElement(l.Z,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)"},"Older Entries"),isNext:!0}))}},79985:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(67294),l=a(9460),r=a(30390);function i(e){let{items:t,component:a=r.Z}=e;return n.createElement(n.Fragment,null,t.map((e=>{let{content:t}=e;return n.createElement(l.n,{key:t.metadata.permalink,content:t},n.createElement(a,null,n.createElement(t,null)))})))}}}]); \ No newline at end of file diff --git a/assets/js/a7023ddc.37c6ea90.js b/assets/js/a7023ddc.37c6ea90.js new file mode 100644 index 0000000000..ddbb3fb204 --- /dev/null +++ b/assets/js/a7023ddc.37c6ea90.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1713],{53457:o=>{o.exports=JSON.parse('[{"label":"community","permalink":"/blog/tags/community","count":1},{"label":"howto","permalink":"/blog/tags/howto","count":1}]')}}]); \ No newline at end of file diff --git a/assets/js/a708848c.10af8687.js b/assets/js/a708848c.10af8687.js new file mode 100644 index 0000000000..56faad0e51 --- /dev/null +++ b/assets/js/a708848c.10af8687.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4938],{3905:(e,r,t)=>{t.d(r,{Zo:()=>l,kt:()=>d});var n=t(67294);function o(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function a(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function c(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?a(Object(t),!0).forEach((function(r){o(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):a(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}function i(e,r){if(null==e)return{};var t,n,o=function(e,r){if(null==e)return{};var t,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)t=a[n],r.indexOf(t)>=0||(o[t]=e[t]);return o}(e,r);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)t=a[n],r.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var p=n.createContext({}),s=function(e){var r=n.useContext(p),t=r;return e&&(t="function"==typeof e?e(r):c(c({},r),e)),t},l=function(e){var r=s(e.components);return n.createElement(p.Provider,{value:r},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},f=n.forwardRef((function(e,r){var t=e.components,o=e.mdxType,a=e.originalType,p=e.parentName,l=i(e,["components","mdxType","originalType","parentName"]),u=s(t),f=o,d=u["".concat(p,".").concat(f)]||u[f]||m[f]||a;return t?n.createElement(d,c(c({ref:r},l),{},{components:t})):n.createElement(d,c({ref:r},l))}));function d(e,r){var t=arguments,o=r&&r.mdxType;if("string"==typeof e||o){var a=t.length,c=new Array(a);c[0]=f;var i={};for(var p in r)hasOwnProperty.call(r,p)&&(i[p]=r[p]);i.originalType=e,i[u]="string"==typeof e?e:o,c[1]=i;for(var s=2;s<a;s++)c[s]=t[s];return n.createElement.apply(null,c)}return n.createElement.apply(null,t)}f.displayName="MDXCreateElement"},38231:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>p,contentTitle:()=>c,default:()=>m,frontMatter:()=>a,metadata:()=>i,toc:()=>s});var n=t(87462),o=(t(67294),t(3905));const a={sidebar_label:"Project Manager",sidebar_position:53},c="Project Manager",i={unversionedId:"iaas/components/project-manager",id:"iaas/components/project-manager",title:"Project Manager",description:"",source:"@site/docs/02-iaas/components/project-manager.md",sourceDirName:"02-iaas/components",slug:"/iaas/components/project-manager",permalink:"/docs/iaas/components/project-manager",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/components/project-manager.md",tags:[],version:"current",sidebarPosition:53,frontMatter:{sidebar_label:"Project Manager",sidebar_position:53}},p={},s=[],l={toc:s},u="wrapper";function m(e){let{components:r,...t}=e;return(0,o.kt)(u,(0,n.Z)({},l,t,{components:r,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"project-manager"},"Project Manager"))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a70dabb3.8edceb88.js b/assets/js/a70dabb3.8edceb88.js new file mode 100644 index 0000000000..d4115c3824 --- /dev/null +++ b/assets/js/a70dabb3.8edceb88.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3178],{3905:(t,e,r)=>{r.d(e,{Zo:()=>i,kt:()=>f});var n=r(67294);function a(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function l(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function o(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{};e%2?l(Object(r),!0).forEach((function(e){a(t,e,r[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):l(Object(r)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}))}return t}function s(t,e){if(null==t)return{};var r,n,a=function(t,e){if(null==t)return{};var r,n,a={},l=Object.keys(t);for(n=0;n<l.length;n++)r=l[n],e.indexOf(r)>=0||(a[r]=t[r]);return a}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(n=0;n<l.length;n++)r=l[n],e.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(t,r)&&(a[r]=t[r])}return a}var c=n.createContext({}),d=function(t){var e=n.useContext(c),r=e;return t&&(r="function"==typeof t?t(e):o(o({},e),t)),r},i=function(t){var e=d(t.components);return n.createElement(c.Provider,{value:e},t.children)},p="mdxType",u={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},m=n.forwardRef((function(t,e){var r=t.components,a=t.mdxType,l=t.originalType,c=t.parentName,i=s(t,["components","mdxType","originalType","parentName"]),p=d(r),m=a,f=p["".concat(c,".").concat(m)]||p[m]||u[m]||l;return r?n.createElement(f,o(o({ref:e},i),{},{components:r})):n.createElement(f,o({ref:e},i))}));function f(t,e){var r=arguments,a=e&&e.mdxType;if("string"==typeof t||a){var l=r.length,o=new Array(l);o[0]=m;var s={};for(var c in e)hasOwnProperty.call(e,c)&&(s[c]=e[c]);s.originalType=t,s[p]="string"==typeof t?t:a,o[1]=s;for(var d=2;d<l;d++)o[d]=r[d];return n.createElement.apply(null,o)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},23614:(t,e,r)=>{r.r(e),r.d(e,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>l,metadata:()=>s,toc:()=>d});var n=r(87462),a=(r(67294),r(3905));const l={},o="SCS-0002: Org & Docs Standards",s={unversionedId:"global/scs-0002",id:"global/scs-0002",title:"SCS-0002: Org & Docs Standards",description:"SCS-0002 standard outlines the standardized structure and maintenance processes for easily accessible and comprehensible content of the SCS project.",source:"@site/standards/global/scs-0002.md",sourceDirName:"global",slug:"/global/scs-0002",permalink:"/standards/global/scs-0002",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"standards",previous:{title:"Sovereign Cloud Standards",permalink:"/standards/scs-0001-v1-sovereign-cloud-standards"},next:{title:"Standards, Docs and Organisation",permalink:"/standards/scs-0002-v1-standards-docs-org"}},c={},d=[],i={toc:d},p="wrapper";function u(t){let{components:e,...r}=t;return(0,a.kt)(p,(0,n.Z)({},i,r,{components:e,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"scs-0002-org--docs-standards"},"SCS-0002: Org & Docs Standards"),(0,a.kt)("p",null,"SCS-0002 standard outlines the standardized structure and maintenance processes for easily accessible and comprehensible content of the SCS project."),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Version"),(0,a.kt)("th",{parentName:"tr",align:null},"Type"),(0,a.kt)("th",{parentName:"tr",align:null},"State"),(0,a.kt)("th",{parentName:"tr",align:null},"stabilized"),(0,a.kt)("th",{parentName:"tr",align:null},"obsoleted"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("a",{parentName:"td",href:"/standards/scs-0002-v1-standards-docs-org"},"SCS-0002-v1")),(0,a.kt)("td",{parentName:"tr",align:null},"Procedural"),(0,a.kt)("td",{parentName:"tr",align:null},"\ud83d\udfe2 Stable"),(0,a.kt)("td",{parentName:"tr",align:null},"2023-02-06"),(0,a.kt)("td",{parentName:"tr",align:null},"-")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("a",{parentName:"td",href:"/standards/scs-0002-v2-standards-docs-org"},"SCS-0002-v2")),(0,a.kt)("td",{parentName:"tr",align:null},"Procedural"),(0,a.kt)("td",{parentName:"tr",align:null},"\ud83d\udfe2 Stable"),(0,a.kt)("td",{parentName:"tr",align:null},"2023-08-03"),(0,a.kt)("td",{parentName:"tr",align:null},"-")))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a71bcd95.bdd15d3b.js b/assets/js/a71bcd95.bdd15d3b.js new file mode 100644 index 0000000000..89ba31b728 --- /dev/null +++ b/assets/js/a71bcd95.bdd15d3b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3518],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function s(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},i=Object.keys(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var l=n.createContext({}),u=function(e){var t=n.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},p=function(e){var t=u(e.components);return n.createElement(l.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),c=u(a),d=r,h=c["".concat(l,".").concat(d)]||c[d]||m[d]||i;return a?n.createElement(h,o(o({ref:t},p),{},{components:a})):n.createElement(h,o({ref:t},p))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,o=new Array(i);o[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[c]="string"==typeof e?e:r,o[1]=s;for(var u=2;u<i;u++)o[u]=a[u];return n.createElement.apply(null,o)}return n.createElement.apply(null,a)}d.displayName="MDXCreateElement"},33069:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const i={title:"Requirements for container registry",type:"Decision Record",status:"Draft",track:"KaaS"},o=void 0,s={unversionedId:"scs-0212-v1-requirements-for-container-registry",id:"scs-0212-v1-requirements-for-container-registry",title:"Requirements for container registry",description:"Introduction",source:"@site/standards/scs-0212-v1-requirements-for-container-registry.md",sourceDirName:".",slug:"/scs-0212-v1-requirements-for-container-registry",permalink:"/standards/scs-0212-v1-requirements-for-container-registry",draft:!1,tags:[],version:"current",frontMatter:{title:"Requirements for container registry",type:"Decision Record",status:"Draft",track:"KaaS"},sidebar:"standards",previous:{title:"SCS-0212",permalink:"/standards/standards/scs-0212"},next:{title:"SCS-0213",permalink:"/standards/standards/scs-0213"}},l={},u=[{value:"Introduction",id:"introduction",level:2},{value:"Motivation",id:"motivation",level:2},{value:"Design considerations",id:"design-considerations",level:2},{value:"OSS health check",id:"oss-health-check",level:3},{value:"Required and desirable features check",id:"required-and-desirable-features-check",level:3},{value:"Required features",id:"required-features",level:4},{value:"Desirable features",id:"desirable-features",level:4},{value:"Conclusion",id:"conclusion",level:3},{value:"Decision",id:"decision",level:2}],p={toc:u},c="wrapper";function m(e){let{components:t,...a}=e;return(0,r.kt)(c,(0,n.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"introduction"},"Introduction"),(0,r.kt)("p",null,"A container registry is an infrastructure service to enable storing and accessing container\nimages. Images can be pushed to the registry by e.g. Continuous integration pipelines and\nbe pulled from by runtime environments like Kubernetes clusters."),(0,r.kt)("p",null,"Container registries could be publicly accessible e.g. Docker Hub, could be\nself-hosted or hosted by cloud service providers (CSP). These container registries may\napply various access control mechanisms to restrict public access and make them private.\nBoth solutions offer a wide range of features that may or may not attract potential\nusers and CSPs."),(0,r.kt)("h2",{id:"motivation"},"Motivation"),(0,r.kt)("p",null,"This proposal is motivated by use cases in which CSPs would like to offer\nprivate container registries to their customers. The specific use cases should be\ndiscussed, but overall CSP could offer a private container registry as a service or\nCSP could offer a recipe (maintained by SCS) for customers to deploy the private\nregistry themselves utilizing CSP infrastructure. In both cases, the private\ncontainer registry should fulfill a set of needed requirements e.g. for security and\nprivacy."),(0,r.kt)("p",null,"The idea and purpose of this document is to specify what requirements a\nspecific technical container registry implementation (i.e. software solution) needs to\nfulfill in the context of SCS."),(0,r.kt)("p",null,"Another purpose is the selection of an appropriate container registry\nimplementation that meets all defined requirements to make architectural\ndecision on what implementation will be used by the SCS."),(0,r.kt)("h2",{id:"design-considerations"},"Design considerations"),(0,r.kt)("p",null,"There are numerous features to look for when evaluating a container registry solution.\nOur decision process goes through two main stages:"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("a",{parentName:"li",href:"#oss-health-check"},"OSS health check")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("a",{parentName:"li",href:"#required-and-desirable-features-check"},"Required and desirable features check"))),(0,r.kt)("p",null,"The open-source software (OSS) health check is the first filter stage. This stage is\ncrucial in the context of SCS and container registry implementation should pass it to\npromote itself to the second consideration stage. The second stage provides an overview\nover the feature set of open source container registry implementations and map out\nrequirements (and nice-to-haves) against it to have a well-documented decision."),(0,r.kt)("p",null,"Note: Keep in mind that at the time of writing this document, we've made our best effort\nto survey the container registry landscape based on publicly available materials.\nIf you find something outdated (with respect to the time of writing this document) or\noutright erroneous, please submit a PR or raise an issue, and we'll fix it right away."),(0,r.kt)("h3",{id:"oss-health-check"},"OSS health check"),(0,r.kt)("p",null,"This section evaluates the health of the open-source projects that were selected from\nthe currently available solutions. The container registry software must fulfill all OSS\nhealth checks defined by the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Drafts/OSS-Health.md"},"OSS-Health"),"\ndocument. The main health checks are:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Four Opens (code is fully open source, community is open and diverse, development\nprocess is open, design process is open)"),(0,r.kt)("li",{parentName:"ul"},"Maturity"),(0,r.kt)("li",{parentName:"ul"},"Security"),(0,r.kt)("li",{parentName:"ul"},"Activity"),(0,r.kt)("li",{parentName:"ul"},"Lock-in risk assessment")),(0,r.kt)("p",null,"Each selected OSS project is evaluated based on the above checks, and it is classified\ninto one of three categories as follows:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"\u2714\ufe0f The project passed all OSS health checks and will be considered\nfurther as a valid candidate.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"\u2754 The project passed almost all OSS health checks.\nThere is place for improvement, but the missing points are not crucial from the OSS\nhealth check perspective. The project will be considered further as a valid candidate.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"\u274c The project does not pass the OSS health checks. Some OSS health check\nshowstoppers have been found (e.g. open core software, not actively maintained).\nThe project is filtered at this stage and won't be considered further."))),(0,r.kt)("p",null,"Refer to the list of evaluated projects with their classified categories and comments."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"\u2714\ufe0f ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/goharbor/harbor"},"Harbor")),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},'Harbor project meets all "four opens"',(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Source code is open and available under the ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/goharbor/harbor/blob/main/LICENSE"},"Apache 2 license")),(0,r.kt)("li",{parentName:"ul"},"Community is ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/goharbor/harbor#community"},"open"),", structured and\nwell organized via ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/goharbor/community"},"workgroups")," and\nvarious communications channels e.g. Slack, mailing lists, etc.\n(#harbor Slack channel contains 3k+ members)"),(0,r.kt)("li",{parentName:"ul"},"The development process is open via GitHub issues and well described in the\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/goharbor/harbor/blob/main/CONTRIBUTING.md"},"contributing"),"\ndocument"),(0,r.kt)("li",{parentName:"ul"},"The design process is open via GitHub issues. Proposals are ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/goharbor/community/tree/main/proposals"},"public"),".\nThe decision process is well described as well. The project's roadmap is\navailable in the ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/goharbor/harbor/blob/main/ROADMAP.md"},"roadmap")," document"))),(0,r.kt)("li",{parentName:"ul"},"Maturity is on the CNCF ",(0,r.kt)("a",{parentName:"li",href:"https://www.cncf.io/projects/harbor/"},"graduation")," level.\nCNCF graduated projects are considered to be stable, widely adopted and production-ready"),(0,r.kt)("li",{parentName:"ul"},"Security",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"The security disclosure and response policy is well described in the project's\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/goharbor/harbor/blob/main/SECURITY.md"},"security")," document"),(0,r.kt)("li",{parentName:"ul"},"The code is reviewed within a standard PR process"))),(0,r.kt)("li",{parentName:"ul"},"Activity",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"250+ contributors, 4k+ forks, 13k+ GitHub stars"),(0,r.kt)("li",{parentName:"ul"},"The project has been ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/goharbor/harbor/blob/main/ADOPTERS.md"},"adopted"),"\nby many companies that run Harbor in their production environments"),(0,r.kt)("li",{parentName:"ul"},"The project collaborates with other communities and projects\n(see ",(0,r.kt)("a",{parentName:"li",href:"https://goharbor.io/community/"},"Partners of Harbor")," section of the\nproject's website)"),(0,r.kt)("li",{parentName:"ul"},"The project is visible and actively contributes to various conferences, e.g.\n",(0,r.kt)("a",{parentName:"li",href:"https://goharbor.io/blog/harbor-at-fosdem-2022/"},"FOSDEM 22"),",\n",(0,r.kt)("a",{parentName:"li",href:"https://www.youtube.com/watch?v=REgvBPH369M"},"KubeCon Europe"),", etc."))),(0,r.kt)("li",{parentName:"ul"},"Lock-in risk assessment",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"The project's ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/goharbor/community/blob/main/MAINTAINERS.md"},"maintainers"),"\ndocument shows that there are a sufficient number of core\nmaintainers/contributors that differ over various companies, we therefore deem\nthe lock-in risk arising from a single point of failure to be low"))))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"\u2714\ufe0f ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/dragonflyoss/Dragonfly2"},"Dragonfly")),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},'Dragonfly project meets all "four opens"',(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Source code is open and available under the ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/dragonflyoss/Dragonfly2/blob/main/LICENSE"},"Apache 2 license")),(0,r.kt)("li",{parentName:"ul"},"Community is ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/dragonflyoss/Dragonfly2#community"},"open"),"\norganized via multiple channels e.g. Slack, mailing lists, etc.\n(#dragonfly Slack channel contains ~50 members)"),(0,r.kt)("li",{parentName:"ul"},"The development process is open via GitHub issues and well described in the\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/dragonflyoss/Dragonfly2/blob/main/CONTRIBUTING.md"},"contributing")," document"),(0,r.kt)("li",{parentName:"ul"},"The design process is open via GitHub issues. The project's roadmap is available in\nthe project's ",(0,r.kt)("a",{parentName:"li",href:"https://d7y.io/docs/others/roadmap/#2022-roadmap"},"webpage")))),(0,r.kt)("li",{parentName:"ul"},"Maturity is on the CNCF ",(0,r.kt)("a",{parentName:"li",href:"https://www.cncf.io/projects/dragonfly/"},"incubating")," level\nCNCF incubating project is considered stable and used in production by users with\nthe healthy pool of contributors"),(0,r.kt)("li",{parentName:"ul"},"Security",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"The security disclosure is handled via a dedicated email address"),(0,r.kt)("li",{parentName:"ul"},"The code is reviewed within a standard PR process"))),(0,r.kt)("li",{parentName:"ul"},"Activity",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"30+ contributors, 100+ forks, 1k+ GitHub stars"),(0,r.kt)("li",{parentName:"ul"},"The project has been ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/dragonflyoss/Dragonfly2/blob/main/ADOPTERS.md"},"adopted"),"\nby many companies that run Harbor in their production environments"),(0,r.kt)("li",{parentName:"ul"},"The project is visible and actively contributes to various conferences,\ne.g. ",(0,r.kt)("a",{parentName:"li",href:"https://www.youtube.com/watch?v=LcxBgmmeA80"},"KubeCon North America"),",\n",(0,r.kt)("a",{parentName:"li",href:"https://www.youtube.com/watch?v=MGNtPHQYP14"},"KubeCon Europe"),", etc."))),(0,r.kt)("li",{parentName:"ul"},"Lock-in risk assessment",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"The list of the project's ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/dragonflyoss/Dragonfly2/blob/main/MAINTAINERS.md"},"maintainers"),"\nincludes contributors from various companies and the ",(0,r.kt)("a",{parentName:"li",href:"https://dragonfly.devstats.cncf.io/d/7/companies-contributing-in-repository-groups"},"companies contributing dashboard"),"\nshows that ~10 companies are actively contributing to a repository group"))))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"\u2754 ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/quay/quay"},"Project Quay")),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},'Project Quay meets all "four opens"',(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Source code is open and available under the ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/quay/quay/blob/master/LICENSE"},"Apache 2 license")),(0,r.kt)("li",{parentName:"ul"},"Community is ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/quay/quay#community"},"open")," organized via mailing\nlist and IRC"),(0,r.kt)("li",{parentName:"ul"},"Development process is open via ",(0,r.kt)("a",{parentName:"li",href:"https://issues.redhat.com/projects/PROJQUAY/issues"},"JBoss JIRA"),"\nissues and well described in the ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/quay/quay/blob/master/GOVERNANCE.md"},"governance")," document"),(0,r.kt)("li",{parentName:"ul"},"Design process is open via ",(0,r.kt)("a",{parentName:"li",href:"https://issues.redhat.com/projects/PROJQUAY/issues"},"JBoss JIRA"),"\nissues. The project's roadmap is available on the project's ",(0,r.kt)("a",{parentName:"li",href:"https://www.projectquay.io/#contribute"},"webpage")))),(0,r.kt)("li",{parentName:"ul"},"Maturity",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Project Quay is an open-source project that starts ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/quay/quay/commit/0349af754204375d74ac5833713b607398981ff7"},"~9 years ago"),".\nIt powers Red Hat enterprise products Red Hat Quay and Quay.io, which are used in\na productive way by many. Therefore, the project's maturity is at the good level"))),(0,r.kt)("li",{parentName:"ul"},"Security",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"The security disclosure is handled via a dedicated email address"),(0,r.kt)("li",{parentName:"ul"},"The code is reviewed within a standard PR process"))),(0,r.kt)("li",{parentName:"ul"},"Activity",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"50+ contributors, 200+ forks, 2k+ GitHub stars"),(0,r.kt)("li",{parentName:"ul"},"The project has been used by many ",(0,r.kt)("a",{parentName:"li",href:"https://www.projectquay.io"},"companies")," that\nrun Quay in their production environments"))),(0,r.kt)("li",{parentName:"ul"},"Lock-in risk assessment",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"The project's owners/maintainers list is not publicly available and is stored in\nthe ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/quay/quay-docs#how-do-i-set-up"},"downstream repository"),".\nTherefore, it is hard to distinguish the risk of project failure caused by low\ndiversity across the companies. This should be improved"))))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"\u274c ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/sapcc/keppel"},"Keppel")),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"The project seems to be not widely used in a productive way and also the activity\naround is currently not on a good level (5+ contributors). The development\nprocess as well as the design process seem to be open, but not documented yet"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"\u274c ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/sonatype/nexus-public"},"Nexus")),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Nexus is an ",(0,r.kt)("strong",{parentName:"li"},"open core")," software that offers paid ",(0,r.kt)("a",{parentName:"li",href:"https://www.sonatype.com/products/repository-oss-vs-pro-features"},"pro version")," with advanced features"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"\u274c ",(0,r.kt)("a",{parentName:"p",href:"https://jfrog.com/community/open-source/"},"JFrog")),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"JFrog Artifactory is shipped as an ",(0,r.kt)("strong",{parentName:"li"},"open core")," ",(0,r.kt)("a",{parentName:"li",href:"https://jfrog.com/community/open-source/"},"software"),"\nwith limited features. The software is primarily offered as a paid ",(0,r.kt)("a",{parentName:"li",href:"https://jfrog.com/pricing/#devops-onprem"},"pro version")))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"\u274c ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/uber/kraken"},"Kraken")),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"It seems that the project is not actively maintained as is discussed in the related\nproject's ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/uber/kraken/issues/313"},"issue")))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"\u274c ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SUSE/Portus"},"Portus")),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"It seems that the project is not actively maintained as is discussed in the related\nproject's ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/SUSE/Portus/issues/2352"},"issue"))))),(0,r.kt)("h3",{id:"required-and-desirable-features-check"},"Required and desirable features check"),(0,r.kt)("p",null,"This section provides an overview of the feature set of open source container registry\nimplementations (which passed the OSS health stage above) and map out requirements\n(and nice-to-haves) against it. The container registry software must be robust enough,\nto be able to operate under heavy load (e.g. high availability (HA) mode, federation, etc.) and\nthe crucial feature is security.\nWe defined a set of required features that the container registry implementation must\nhave and also a set of desirable (nice to have) features are defined and evaluated here."),(0,r.kt)("h4",{id:"required-features"},"Required features"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Audit Logs",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Ability to record use in auditable logs so that activity can be traced to a single user"))),(0,r.kt)("li",{parentName:"ul"},"Authentication of system identities",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},'Support for authenticating system identities like Kubernetes clusters. Ideally supporting dynamic identity tokens from some IdP; Less ideal: Supporting static "system tokens"'))),(0,r.kt)("li",{parentName:"ul"},"Authentication of users",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Support for multiple authentication systems (IdM integration). User and user account management"))),(0,r.kt)("li",{parentName:"ul"},"Authorization",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Role-based access control to ensure strict access controls"))),(0,r.kt)("li",{parentName:"ul"},"Automation",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Integration with CI/CD tools e.g. via webhooks"))),(0,r.kt)("li",{parentName:"ul"},"Vulnerability scanning",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Reveal security vulnerabilities in container images"))),(0,r.kt)("li",{parentName:"ul"},"Content Trust and Validation",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Verify image authenticity before running - image signing"))),(0,r.kt)("li",{parentName:"ul"},"Multi-tenancy",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Container registry is able to serve multiple tenants (projects, teams, namespaces). It can be implemented also on the storage level, see e.g. ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/sapcc/keppel#overview"},"Keppel")))),(0,r.kt)("li",{parentName:"ul"},"Backup and restore",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"It is important for disaster recovery and data migration scenarios"))),(0,r.kt)("li",{parentName:"ul"},"Monitoring",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Observability is a key feature for operating a service in production so the container registry should expose key metrics"))),(0,r.kt)("li",{parentName:"ul"},"HA mode",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Ensure system uptime even in the event of a failure"))),(0,r.kt)("li",{parentName:"ul"},"Registry replication",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Replication allows users to replicate container images between registries of the same instances and between registries of different instances as well"))),(0,r.kt)("li",{parentName:"ul"},"Proxy cache (pull-through cache)",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Proxy cache allows you to use a container registry to proxy and cache images from a target public or private registry"))),(0,r.kt)("li",{parentName:"ul"},"Quota management",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Control over resource use"))),(0,r.kt)("li",{parentName:"ul"},"Garbage collection",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Removing blobs from the filesystem when they are no longer referenced by a manifest"))),(0,r.kt)("li",{parentName:"ul"},"Retention policy",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Reduce the number of image tags, many of which might not be required after a given time or once a subsequent image tag has superseded them")))),(0,r.kt)("h4",{id:"desirable-features"},"Desirable features"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Additionally supported artifacts",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Additional artifacts that the registry is able to store in addition to OCI artifacts, e.g. Java, Node.js, or Python packages"))),(0,r.kt)("li",{parentName:"ul"},"Integration possibilities",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Ability to cooperate with another software solution in order to improve own feature set (e.g. integration of P2P solution for improving container image distribution (download speed and stability, high scalability ...))"))),(0,r.kt)("li",{parentName:"ul"},"Deployment capabilities",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},'How could be a container registry deployed (only "official" ways are mentioned)'))),(0,r.kt)("li",{parentName:"ul"},'Administration capabilities "as a code"',(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},'Ability to manage container registry via "as a code" solutions, e.g. Ansible role')))),(0,r.kt)("p",null,"Refer to the table of evaluated projects with their features. Note that only container\nregistry implementations that passed the OSS health stage (Harbor, Quay, and Dragonfly)\nare evaluated here."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Features"),(0,r.kt)("th",{parentName:"tr",align:null},"Harbor"),(0,r.kt)("th",{parentName:"tr",align:null},"Quay"),(0,r.kt)("th",{parentName:"tr",align:null},"Dragonfly"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Audit Logs"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2717")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Authentication of system identities"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713 Robot Accounts"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713 Robot Accounts"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2717")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Authentication of users"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713 Local database, LDAP, OIDC, UAA"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713 Local database, LDAP, Keystone, JWT"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713 Local database")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Authorization"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Automation"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713 Webhooks (HTTP, Slack)"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713 Webhooks (HTTP, Slack, E-mail ...), building images"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2717")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Vulnerability scanning"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713 Trivy, Clair"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713 Clair"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2717")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Content Trust and Validation"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713 Cosign"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713 Cosign"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2717")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Multi-tenancy"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713 (not on the storage level)"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713 (not on the storage level)"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713 (not on the storage level)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Backup and restore"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2717")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Monitoring"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713 Prometheus metrics, Tracing"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713 Prometheus metrics, Tracing (only for Clair)"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713 Prometheus metrics, Tracing")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"HA mode"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2717")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Registry replication"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Proxy cache"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713 Feature is in the technology preview stage (non production ready)"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2717")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Quota management"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713 Based on storage consumption"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713 Based on storage consumption"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2717")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Garbage collection"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713 Non-blocking"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713 Non-blocking"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2717")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Retention policy"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713 Multiple tag retention rules"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713 Only tag expiration rules"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2717")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Additional supported artifacts"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2717 (only OCI artifacts)"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2717 (only OCI artifacts)"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713 Maven, YUM")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Integration possibilities"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713 Dragonfly (P2P), Kraken (P2P)"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2717"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713 Harbor, Nydus, eStargz")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Deployment capabilities"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713 Docker-compose, Helm chart, Operator"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713 Docker-compose, Operator"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713 Docker-compose, Helm chart")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Administration capabilities"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713 Terraform, CRDs, Client libraries"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713 Ansible, Client libraries"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2713 Client libraries")))),(0,r.kt)("p",null,"Notes:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Automation: Harbor should support webhooks following CloudEvents spec in the ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/goharbor/harbor/issues/17748"},"next release")),(0,r.kt)("li",{parentName:"ul"},"Content Trust and Validation: Harbor announced the deprecation of ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/goharbor/harbor/discussions/16612"},"Notary"),"\nintegration, hence it is not mentioned in the table"),(0,r.kt)("li",{parentName:"ul"},"Multi-tenancy: Harbor, Quay, as well as Dragonfly, operates on a single storage\nbackend (e.g. S3), i.e. the storage of container images is shared between tenants"),(0,r.kt)("li",{parentName:"ul"},"Additional supported artifacts: Harbor announced the deprecation of ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/goharbor/harbor/discussions/15057"},"Chartmuseum"),"\nintegration, hence it is not mentioned in the table")),(0,r.kt)("h3",{id:"conclusion"},"Conclusion"),(0,r.kt)("p",null,"A wide range of open-source container registry projects (Quay, Harbor, Dragonfly,\nKeppel, Portus, Kraken, etc.) has been carefully evaluated based on the two main\nfactors: the open-source health and range of supported features."),(0,r.kt)("p",null,"The open-source software health is crucial and container registry implementation should\npass it. The OSS health check evaluates several important metrics\nof an open source software like whether the code/community/development/design is\nfully open or whether the project's maturity, security, and activity are on the desired\nlevel. This check also evaluates the lock-in risk due to possible single points of\nfailure or internal project conflicts and several other aspects.\nOverall, three projects passed the OSS health checks:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/goharbor/harbor"},"Harbor")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/quay/quay"},"Project Quay")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/dragonflyoss/Dragonfly2"},"Dragonfly"))),(0,r.kt)("p",null,'The above projects were then evaluated from the "supported features" perspective.\nThe ',(0,r.kt)("a",{parentName:"p",href:"#required-and-desirable-features-check"},"Required and desirable features check"),"\ninvestigated the feature set of open-source container registry implementations and\nmapped SCS requirements (and nice-to-haves) against it. The list of required features\nis quite long and contains features that are primarily focused on security\n(authentication, vulnerability scanning, content trust, and validation, etc.),\nscalability (HA mode, registry replication, p2p integration, etc.) and visibility\n(monitoring), see the full list ",(0,r.kt)("a",{parentName:"p",href:"#required-and-desirable-features-check"},"here"),".\nThese requirements should ensure that the selected container registry implementation\ncould be offered by CSPs as a secure and enterprise-ready solution."),(0,r.kt)("p",null,"The following section compares projects Dragonfly, Quay, and Harbor."),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://github.com/dragonflyoss/Dragonfly2"},"Dragonfly"),' is a healthy open-source project with a growing community\nand CNCF incubating maturity level. It is considered stable, and widely used by many\ncompanies in their production environments. We currently see that it is not as\nfeature-rich as Harbor or Quay, hence it is not considered the best choice here.\nIt seems, that its main aim (currently) is to offer (an efficient, stable, and secure)\ncontainer distribution solution based on p2p technology. This improves download\nefficiency and saves bandwidth across CSPs. It also offers integration possibilities\nthat allow one to use it as a p2p distribution network via a "preheat" API. This\nintegration was implemented in the Harbor project via Dragonfly "preheat" adapter, and\nboth parties may benefit from the integration. Harbor profits from Dragonfly\'s p2p\ndistribution capabilities and on the other hand the Dragonfly project profits from\nHarbor\'s feature-rich container registry "frontend".'),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://github.com/quay/quay"},"Quay")," is an open-source project maintained by Red Hat. Its OSS health is\non a good level, the surrounding community is growing, and we consider it to be quite\nmature as it powers enterprise solutions like Red Hat Quay and Quay.io.\nBesides this, there is still a place for OSS health improvement. It is hard to\ndistinguish the risk of project failure caused by low diversity across the companies\nbecause the project's owners/maintainers list is not publicly available and is stored in\nthe Red Hat private repository.\nIts feature set is impressive and this project fulfills all must-haves defined in\nthis document. Quay gives you security over your repositories with image\nvulnerability scanning (Clair integration), content validation (Cosign integration),\nand access controls. Harbor stands out here as it allows users to use also project Trivy\nfor vulnerability scanning. Project Quay also provides a scalable open-source\nplatform to host container images across any size organization. One drawback in\ncomparison to Harbor is that the proxy cache feature is still marked as a\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.projectquay.io/use_quay.html#quay-as-cache-proxy"},"Technology Preview"),",\nhence this feature may not be completely production-ready yet. On the other hand,\nthe project Quay supports ",(0,r.kt)("a",{parentName:"p",href:"https://docs.projectquay.io/use_quay.html#build-support"},"building Dockerfiles"),"\nusing a set of workers on e.g. Kubernetes. Build triggers, such as GitHub webhooks\ncan be configured to automatically build new versions of repositories when new code is\ncommitted. This feature is not supported by the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/goharbor/harbor/issues/6235"},"Harbor project"),"."),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://github.com/goharbor/harbor"},"Harbor")," is an outstanding open-source, community-led project with fully open and\nwell-documented processes. Its large and thriving community powers the fast-growing\nfeature set and attracts more and more developers and companies to active contributions.\nHarbor's CNCF graduation in 2020 made it one of the best choices for enterprise\ncustomers that want to operate container registries securely and in a large scale.\nIts community size, landscape, and CNCF graduation make a significant difference in\ncomparison to Quay's open-source health capabilities.\nThe list of supported features is also impressive. This project fulfills all must-haves\ndefined in this document and overcome project Quay with a production-ready proxy cache\nfeature and more options that the user may use in case of image vulnerability scanning.\nIn addition, Harbor profits from p2p distribution capabilities via integration of p2p\nsolutions like Kraken and Dragonfly. It is worth mentioning that Harbor, by design,\noperates on a single storage backend (e.g. S3). It means that the storage of container\nimages is shared even when the Harbor instance serves multiple tenants. The same\napproach is used in Quay and Dragonfly projects, but e.g. Keppel uses multi-tenant-aware\nstorage drivers instead so that each customer gets their own separate storage backend.\nCSP that considers offering container registry \"as a service\" solution based on Harbor\nshould be aware of this shared storage backend architecture."),(0,r.kt)("h2",{id:"decision"},"Decision"),(0,r.kt)("p",null,"Based on the research and conclusion above we've decided to use the ",(0,r.kt)("strong",{parentName:"p"},"Harbor")," project\nas a container registry implementation for the SCS ecosystem."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a7434565.30e719e3.js b/assets/js/a7434565.30e719e3.js new file mode 100644 index 0000000000..4260614a98 --- /dev/null +++ b/assets/js/a7434565.30e719e3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7645],{15745:s=>{s.exports=JSON.parse('{"name":"docusaurus-plugin-content-pages","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/a8ea16f4.8d2c7e70.js b/assets/js/a8ea16f4.8d2c7e70.js new file mode 100644 index 0000000000..fec1b85094 --- /dev/null +++ b/assets/js/a8ea16f4.8d2c7e70.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[953],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>h});var n=r(67294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function s(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=n.createContext({}),l=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},p=function(e){var t=l(e.components);return n.createElement(c.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=l(r),m=o,h=u["".concat(c,".").concat(m)]||u[m]||d[m]||a;return r?n.createElement(h,i(i({ref:t},p),{},{components:r})):n.createElement(h,i({ref:t},p))}));function h(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=m;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[u]="string"==typeof e?e:o,i[1]=s;for(var l=2;l<a;l++)i[l]=r[l];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},96379:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var n=r(87462),o=(r(67294),r(3905));const a={},i="Overview",s={unversionedId:"container/components/k8s-cluster-api-provider/doc/overview",id:"container/components/k8s-cluster-api-provider/doc/overview",title:"Overview",description:"Creating and scaling k8s clusters on demand is providing a lot of flexibility to DevOps teams that develop, test, deploy and operate services and applications.",source:"@site/docs/03-container/components/k8s-cluster-api-provider/doc/overview.md",sourceDirName:"03-container/components/k8s-cluster-api-provider/doc",slug:"/container/components/k8s-cluster-api-provider/doc/overview",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/overview",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/03-container/components/k8s-cluster-api-provider/doc/overview.md",tags:[],version:"current",frontMatter:{},sidebar:"docs",previous:{title:"K8s Cluster API Provider",permalink:"/docs/category/k8s-cluster-api-provider"},next:{title:"Requirements",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/requirements"}},c={},l=[],p={toc:l},u="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"overview"},"Overview"),(0,o.kt)("p",null,"Creating and scaling k8s clusters on demand is providing a lot of flexibility to DevOps teams that develop, test, deploy and operate services and applications."),(0,o.kt)("p",null,"We expect the functionality to be mainly consumed in two scenarios:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Self-service: The DevOps team leverages the code provided from this repository to create their own capi management server and use it then to manage a number of k8s clusters for their own needs."),(0,o.kt)("li",{parentName:"ul"},"Managed k8s: The Operator's service team creates the capi management server and uses it to provide managed k8s clusters for their clients.")),(0,o.kt)("p",null,"Note that we have an intermediate model in mind -- a model where a one-click / one-API call interface would allow the management server to be created on behalf of a user and then serve as an API endpoint to that user's k8s CAPI needs. Ideally with some dashboard or GUI that would shield less experienced users from all the YAML."),(0,o.kt)("p",null,"Once we as the SCS Community have the gitops style cluster control working, the self-service model will become more convenient to use."),(0,o.kt)("p",null,"The provided solution covers the following two main topics:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Automation (terraform, Makefile) to bootstrap a cluster-API management server by installing kind on a vanilla Ubuntu image and deploying some tools on this node (",(0,o.kt)("a",{parentName:"p",href:"https://kubernetes.io/docs/reference/kubectl/overview/"},"kubectl"),", ",(0,o.kt)("a",{parentName:"p",href:"https://docs.openstack.org/newton/user-guide/common/cli-install-openstack-command-line-clients.html"},"openstack CLI tools"),", ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/derailed/k9s"},"k9s"),", ",(0,o.kt)("a",{parentName:"p",href:"https://cilium.io/"},"cilium"),", ",(0,o.kt)("a",{parentName:"p",href:"https://www.tigera.io/tigera-products/calico/"},"calico"),", ",(0,o.kt)("a",{parentName:"p",href:"https://helm.sh/"},"helm"),", ",(0,o.kt)("a",{parentName:"p",href:"https://fluxcd.io/"},"flux")," ...) and deploying ",(0,o.kt)("a",{parentName:"p",href:"https://cluster-api.sigs.k8s.io/"},"cluster-API")," (clusterctl) and the ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api-provider-openstack"},"OpenStack cluster-api provider")," along with suitable credentials. The terraform automation is driven by a Makefile for convenience. The tooling also contains all the logic to clean up again. The newly deployed node clones this git repository early in the bootstrap process and uses the thus received files to set up the management cluster and scripts.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"This node can be connected to via ssh and the deployed scripts there can be used to manage workload clusters and then deploy various standardized tools (such as e.g. ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/kubernetes/cloud-provider-openstack"},"OpenStack Cloud Controller Manager"),"(OCCM), ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/kubernetes/cloud-provider-openstack/blob/master/docs/cinder-csi-plugin/using-cinder-csi-plugin.md"},"cinder CSI"),", calico or cilium CNI, ",(0,o.kt)("a",{parentName:"p",href:"https://kubernetes.github.io/ingress-nginx/"},"nginx ingress controller"),", ",(0,o.kt)("a",{parentName:"p",href:"https://cert-manager.io/"},"cert-manager"),", ...) and run tests (e.g. CNCF conformance with ",(0,o.kt)("a",{parentName:"p",href:"https://sonobuoy.io/"},"sonobuoy"),"). The tools and artifacts can be updated via ",(0,o.kt)("inlineCode",{parentName:"p"},"git pull")," at any time and the updated settings rolled out to the workload clusters. Note that the script collection will eventually be superseded by the ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/stackhpc/capi-helm-charts"},"capi-helm-charts"),". The medium-term goal is to actually create a reconciliation loop here that would perform life-cycle-management for clusters according to the cluster configuration stored in an enhanced ",(0,o.kt)("a",{parentName:"p",href:"https://cluster-api.sigs.k8s.io/clusterctl/configuration.html"},"cluster-api style")," clusterctl.yaml from git repositories and thus allow a pure ",(0,o.kt)("a",{parentName:"p",href:"https://www.weave.works/technologies/gitops/"},"gitops")," style cluster management without ever ssh'ing to the management server."))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a8f67d60.710bcfa2.js b/assets/js/a8f67d60.710bcfa2.js new file mode 100644 index 0000000000..a279c9d17d --- /dev/null +++ b/assets/js/a8f67d60.710bcfa2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2517],{3905:(t,e,n)=>{n.d(e,{Zo:()=>d,kt:()=>h});var o=n(67294);function i(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function a(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);e&&(o=o.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,o)}return n}function r(t){for(var e=1;e<arguments.length;e++){var n=null!=arguments[e]?arguments[e]:{};e%2?a(Object(n),!0).forEach((function(e){i(t,e,n[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(n,e))}))}return t}function l(t,e){if(null==t)return{};var n,o,i=function(t,e){if(null==t)return{};var n,o,i={},a=Object.keys(t);for(o=0;o<a.length;o++)n=a[o],e.indexOf(n)>=0||(i[n]=t[n]);return i}(t,e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);for(o=0;o<a.length;o++)n=a[o],e.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(i[n]=t[n])}return i}var c=o.createContext({}),u=function(t){var e=o.useContext(c),n=e;return t&&(n="function"==typeof t?t(e):r(r({},e),t)),n},d=function(t){var e=u(t.components);return o.createElement(c.Provider,{value:e},t.children)},m="mdxType",p={inlineCode:"code",wrapper:function(t){var e=t.children;return o.createElement(o.Fragment,{},e)}},s=o.forwardRef((function(t,e){var n=t.components,i=t.mdxType,a=t.originalType,c=t.parentName,d=l(t,["components","mdxType","originalType","parentName"]),m=u(n),s=i,h=m["".concat(c,".").concat(s)]||m[s]||p[s]||a;return n?o.createElement(h,r(r({ref:e},d),{},{components:n})):o.createElement(h,r({ref:e},d))}));function h(t,e){var n=arguments,i=e&&e.mdxType;if("string"==typeof t||i){var a=n.length,r=new Array(a);r[0]=s;var l={};for(var c in e)hasOwnProperty.call(e,c)&&(l[c]=e[c]);l.originalType=t,l[m]="string"==typeof t?t:i,r[1]=l;for(var u=2;u<a;u++)r[u]=n[u];return o.createElement.apply(null,r)}return o.createElement.apply(null,n)}s.displayName="MDXCreateElement"},18899:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>c,contentTitle:()=>r,default:()=>p,frontMatter:()=>a,metadata:()=>l,toc:()=>u});var o=n(87462),i=(n(67294),n(3905));const a={},r="Adding Docs Guide",l={unversionedId:"contribute/adding-docs-guide",id:"contribute/adding-docs-guide",title:"Adding Docs Guide",description:"In this Guide you will learn how to integrate your documentation to the SCS documentation, which you will find on docs.scs.community.",source:"@site/community/contribute/adding-docs-guide.md",sourceDirName:"contribute",slug:"/contribute/adding-docs-guide",permalink:"/community/contribute/adding-docs-guide",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"community",previous:{title:"Contribute",permalink:"/community/category/contribute"},next:{title:"Documentation Files Structure",permalink:"/community/contribute/doc-files-structure-guide"}},c={},u=[{value:"Step 1 \u2013 Documentation type",id:"step-1--documentation-type",level:2},{value:"1. Technical Documentation",id:"1-technical-documentation",level:2},{value:"Step 1 \u2013 Checklist",id:"step-1--checklist",level:3},{value:"Step 2 \u2013 Adding your repo to the docs.json",id:"step-2--adding-your-repo-to-the-docsjson",level:3},{value:"2. Operational documentation",id:"2-operational-documentation",level:2},{value:"3. Community documentation",id:"3-community-documentation",level:2}],d={toc:u},m="wrapper";function p(t){let{components:e,...n}=t;return(0,i.kt)(m,(0,o.Z)({},d,n,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"adding-docs-guide"},"Adding Docs Guide"),(0,i.kt)("p",null,"In this Guide you will learn how to integrate your documentation to the SCS documentation, which you will find on ",(0,i.kt)("a",{parentName:"p",href:"https://docs.scs.community"},"docs.scs.community"),"."),(0,i.kt)("h2",{id:"step-1--documentation-type"},"Step 1 \u2013 Documentation type"),(0,i.kt)("p",null,"Determine the type of your documentation and click to continue."),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("a",{parentName:"li",href:"#1-technical-documentation"},"Technical documentation")),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("a",{parentName:"li",href:"#2-operational-documentation"},"Operational documentation")),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("a",{parentName:"li",href:"#3-community-documentation"},"Community documentation"))),(0,i.kt)("p",null,"If unsure don't hestitate to ask us at ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/docs/blob/main/community/communication/matrix.md"},"Matrix")),(0,i.kt)("h2",{id:"1-technical-documentation"},"1. Technical Documentation"),(0,i.kt)("h3",{id:"step-1--checklist"},"Step 1 \u2013 Checklist"),(0,i.kt)("p",null,"Your repository containing the documentation has to..."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"be a public repository"),(0,i.kt)("li",{parentName:"ul"},"contain a directory named ",(0,i.kt)("inlineCode",{parentName:"li"},"/doc")," or ",(0,i.kt)("inlineCode",{parentName:"li"},"/docs")," within root, containing the documentation files")),(0,i.kt)("p",null,"The documentation files have to be in markdown format and..."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"comply ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/SovereignCloudStack/docs/blob/main/community/github/dco-and-licenses.md"},"SCS licensing guidelines")),(0,i.kt)("li",{parentName:"ul"},"match our",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/SovereignCloudStack/docs/blob/main/community/contribute/doc-files-structure-guide.md"},"markdown file structure guideline")),(0,i.kt)("li",{parentName:"ul"},"linting Rules"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/SovereignCloudStack/docs/blob/main/community/contribute/styleguide.md"},"styleguide"))))),(0,i.kt)("h3",{id:"step-2--adding-your-repo-to-the-docsjson"},"Step 2 \u2013 Adding your repo to the docs.json"),(0,i.kt)("p",null,"File a Pull Request within the ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/docs-page"},"docs-page")," repository and add your repo to the docs.package.json:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'[\n {\n "repo": "demo-organisation/demo-repository",\n "source": "doc/*.md",\n "target": "docs",\n "label": "demo-repository-label"\n }\n]\n')),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"key"),(0,i.kt)("th",{parentName:"tr",align:null},"description"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"repo"),(0,i.kt)("td",{parentName:"tr",align:null},"reference to github organisation and repository")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"source"),(0,i.kt)("td",{parentName:"tr",align:null},"path to content to copy: Either glob matching individual markdown files OR the path of a single directory")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"target"),(0,i.kt)("td",{parentName:"tr",align:null},"directory where the files should be copied to within the docs-page repo")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"label"),(0,i.kt)("td",{parentName:"tr",align:null},"label for directory. only mandatory if source file is set to copy only ","*",".md files and not the complete directory")))),(0,i.kt)("p",null,"Once it is approved and merged, a postinstall script will be triggered within the build process. This initiates downloading, copy and distilling which results in this static generated ",(0,i.kt)("a",{parentName:"p",href:"https://docs.scs.community"},"documentation")," page \u2013 now with your content."),(0,i.kt)("p",null,"An explanation on how the sync & distill workflow and a guide on how to test it in a local development environment you will find ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/docs/blob/main/community/contribute/docs-workflow-explanation.md"},"here"),"."),(0,i.kt)("h2",{id:"2-operational-documentation"},"2. Operational documentation"),(0,i.kt)("p",null,"Your doc files contain operational knowledge. Which layer in the stack do they belong to?"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"iaas"),(0,i.kt)("li",{parentName:"ol"},"iam"),(0,i.kt)("li",{parentName:"ol"},"kaas"),(0,i.kt)("li",{parentName:"ol"},"operations")),(0,i.kt)("p",null,"File a Pull Request within the ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/docs"},"docs")," repository and add your markdown files to the fitting directory."),(0,i.kt)("h2",{id:"3-community-documentation"},"3. Community documentation"),(0,i.kt)("p",null,"Your doc files contain knowledge regarding our community? Choose the right directory. If unsure don't hestitate to ask us at ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/docs/blob/main/community/communication/matrix.md"},"Matrix"),"."),(0,i.kt)("p",null,"File a Pull Request within the ",(0,i.kt)("inlineCode",{parentName:"p"},"docs")," repository and add your markdown files to the fitting directory."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a94c36cd.83a287d6.js b/assets/js/a94c36cd.83a287d6.js new file mode 100644 index 0000000000..c2eaede310 --- /dev/null +++ b/assets/js/a94c36cd.83a287d6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3271],{3905:(e,r,t)=>{t.d(r,{Zo:()=>p,kt:()=>d});var n=t(67294);function o(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function c(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function i(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?c(Object(t),!0).forEach((function(r){o(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):c(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}function a(e,r){if(null==e)return{};var t,n,o=function(e,r){if(null==e)return{};var t,n,o={},c=Object.keys(e);for(n=0;n<c.length;n++)t=c[n],r.indexOf(t)>=0||(o[t]=e[t]);return o}(e,r);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(n=0;n<c.length;n++)t=c[n],r.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var u=n.createContext({}),l=function(e){var r=n.useContext(u),t=r;return e&&(t="function"==typeof e?e(r):i(i({},r),e)),t},p=function(e){var r=l(e.components);return n.createElement(u.Provider,{value:r},e.children)},s="mdxType",f={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},v=n.forwardRef((function(e,r){var t=e.components,o=e.mdxType,c=e.originalType,u=e.parentName,p=a(e,["components","mdxType","originalType","parentName"]),s=l(t),v=o,d=s["".concat(u,".").concat(v)]||s[v]||f[v]||c;return t?n.createElement(d,i(i({ref:r},p),{},{components:t})):n.createElement(d,i({ref:r},p))}));function d(e,r){var t=arguments,o=r&&r.mdxType;if("string"==typeof e||o){var c=t.length,i=new Array(c);i[0]=v;var a={};for(var u in r)hasOwnProperty.call(r,u)&&(a[u]=r[u]);a.originalType=e,a[s]="string"==typeof e?e:o,i[1]=a;for(var l=2;l<c;l++)i[l]=t[l];return n.createElement.apply(null,i)}return n.createElement.apply(null,t)}v.displayName="MDXCreateElement"},15004:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>u,contentTitle:()=>i,default:()=>f,frontMatter:()=>c,metadata:()=>a,toc:()=>l});var n=t(87462),o=(t(67294),t(3905));const c={},i="Architecture",a={unversionedId:"container/overview/architecture",id:"container/overview/architecture",title:"Architecture",description:"TODO",source:"@site/docs/03-container/overview/architecture.md",sourceDirName:"03-container/overview",slug:"/container/overview/architecture",permalink:"/docs/container/overview/architecture",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/03-container/overview/architecture.md",tags:[],version:"current",frontMatter:{}},u={},l=[],p={toc:l},s="wrapper";function f(e){let{components:r,...t}=e;return(0,o.kt)(s,(0,n.Z)({},p,t,{components:r,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"architecture"},"Architecture"),(0,o.kt)("p",null,"TODO"))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a9f40339.71286c0d.js b/assets/js/a9f40339.71286c0d.js new file mode 100644 index 0000000000..50d1d0bd5f --- /dev/null +++ b/assets/js/a9f40339.71286c0d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[261],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>y});var n=r(67294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function c(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?c(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):c(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},c=Object.keys(e);for(n=0;n<c.length;n++)r=c[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(n=0;n<c.length;n++)r=c[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=n.createContext({}),p=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},s=function(e){var t=p(e.components);return n.createElement(l.Provider,{value:t},e.children)},u="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,c=e.originalType,l=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),u=p(r),m=o,y=u["".concat(l,".").concat(m)]||u[m]||f[m]||c;return r?n.createElement(y,a(a({ref:t},s),{},{components:r})):n.createElement(y,a({ref:t},s))}));function y(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var c=r.length,a=new Array(c);a[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[u]="string"==typeof e?e:o,a[1]=i;for(var p=2;p<c;p++)a[p]=r[p];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},93905:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>f,frontMatter:()=>c,metadata:()=>i,toc:()=>p});var n=r(87462),o=(r(67294),r(3905));const c={},a="Overview",i={unversionedId:"operating-scs/lifecycle-management/index",id:"operating-scs/lifecycle-management/index",title:"Overview",description:"TODO",source:"@site/docs/04-operating-scs/05-lifecycle-management/index.md",sourceDirName:"04-operating-scs/05-lifecycle-management",slug:"/operating-scs/lifecycle-management/",permalink:"/docs/operating-scs/lifecycle-management/",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/04-operating-scs/05-lifecycle-management/index.md",tags:[],version:"current",frontMatter:{}},l={},p=[],s={toc:p},u="wrapper";function f(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"overview"},"Overview"),(0,o.kt)("p",null,"TODO"))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/aa0979a6.0d55683d.js b/assets/js/aa0979a6.0d55683d.js new file mode 100644 index 0000000000..f6cb7910a5 --- /dev/null +++ b/assets/js/aa0979a6.0d55683d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2661],{37649:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>N,contentTitle:()=>f,default:()=>D,frontMatter:()=>E,metadata:()=>x,toc:()=>_});var a=n(87462),i=n(67294),l=n(3905),r=n(43907),o=n(16993),c=n(24745),s=n(39897),d=n(58176);const m="link_wr7g",u="button_gV6k",p=e=>{const{title:t,href:n,handleClick:a}=e;return i.createElement("a",{className:m,href:n},i.createElement("button",{onClick:a,className:u},t))},h="modal__zVM",k="modalContent_zbmJ",b="modalTitle_u975",v="modalDescription_H8cB",g="modalH2_DhYb",y="buttonBox_NbRn",w=e=>{const{calendarEvent:t,onClose:n,show:a}=e;return i.createElement(i.Fragment,null,a&&t&&i.createElement("div",{className:h,onClick:n},i.createElement("div",{className:k},i.createElement("div",{className:b},i.createElement("h2",{className:g},t.title)),i.createElement("div",{className:v},i.createElement("p",null,t.extendedProps.description),i.createElement("p",null,t.extendedProps.location),i.createElement("div",{className:y},i.createElement(p,{handleClick:e=>{e.stopPropagation()},title:"Join Meeting",href:t.extendedProps.location}))))))},C=()=>{const[e,t]=(0,i.useState)(!1),[n,a]=(0,i.useState)();return i.createElement(i.Fragment,null,i.createElement(r.Z,{slotDuration:"00:15:00",slotMinTime:"09:00:00",slotMaxTime:"18:00:00",navLinks:!0,nowIndicator:!0,height:"auto",expandRows:!1,eventClick:n=>(n=>{t(!e),a(n.event)})(n),plugins:[o.Z,c.Z,d.Z,s.ZP],initialView:"timeGridWeek",weekends:!1,events:{url:"https://sovereigncloudstack.github.io/calendar/scs.ics",format:"ics"},headerToolbar:{left:"prev,next today",center:"title",right:"timeGridDay,timeGridWeek,dayGridMonth"}}),i.createElement("div",null,i.createElement(w,{show:e,calendarEvent:n,onClose:()=>t(!1)})))},E={sidebar_position:2,title:"Calendar"},f="Calendar",x={unversionedId:"calendar",id:"calendar",title:"Calendar",description:"We\u2019re an open community",source:"@site/community/calendar.mdx",sourceDirName:".",slug:"/calendar",permalink:"/community/calendar",draft:!1,tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2,title:"Calendar"},sidebar:"community",previous:{title:"Overview",permalink:"/community/"},next:{title:"Collaboration",permalink:"/community/collaboration"}},N={},_=[{value:"We\u2019re an open community",id:"were-an-open-community",level:2}],M={toc:_},T="wrapper";function D(e){let{components:t,...n}=e;return(0,l.kt)(T,(0,a.Z)({},M,n,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"calendar"},"Calendar"),(0,l.kt)("h2",{id:"were-an-open-community"},"We\u2019re an open community"),(0,l.kt)("p",null,"Our meetings are publicly announced and we are happy to welcome both newcomers and established members alike. You can navigate either through the calendar below or subscribe with your favorite client to ",(0,l.kt)("a",{parentName:"p",href:"https://sovereigncloudstack.github.io/calendar/scs.ics"},"https://sovereigncloudstack.github.io/calendar/scs.ics"),". The calendar is collaboratively maintained on GitHub and new entries, such as a lightning talk, are highly appreciated!"),(0,l.kt)(C,{mdxType:"CommunityCalendar"}))}D.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/aaad657b.701f6b3f.js b/assets/js/aaad657b.701f6b3f.js new file mode 100644 index 0000000000..9d5a0c6818 --- /dev/null +++ b/assets/js/aaad657b.701f6b3f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2122],{3905:(e,t,n)=>{n.d(t,{Zo:()=>s,kt:()=>y});var r=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function c(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function a(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=r.createContext({}),u=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},s=function(e){var t=u(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},f=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,s=a(e,["components","mdxType","originalType","parentName"]),p=u(n),f=o,y=p["".concat(l,".").concat(f)]||p[f]||m[f]||i;return n?r.createElement(y,c(c({ref:t},s),{},{components:n})):r.createElement(y,c({ref:t},s))}));function y(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,c=new Array(i);c[0]=f;var a={};for(var l in t)hasOwnProperty.call(t,l)&&(a[l]=t[l]);a.originalType=e,a[p]="string"==typeof e?e:o,c[1]=a;for(var u=2;u<i;u++)c[u]=n[u];return r.createElement.apply(null,c)}return r.createElement.apply(null,n)}f.displayName="MDXCreateElement"},65646:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>c,default:()=>m,frontMatter:()=>i,metadata:()=>a,toc:()=>u});var r=n(87462),o=(n(67294),n(3905));const i={},c=void 0,a={unversionedId:"communication/mailinglists",id:"communication/mailinglists",title:"mailinglists",description:"",source:"@site/community/communication/mailinglists.md",sourceDirName:"communication",slug:"/communication/mailinglists",permalink:"/community/communication/mailinglists",draft:!1,tags:[],version:"current",frontMatter:{}},l={},u=[],s={toc:u},p="wrapper";function m(e){let{components:t,...n}=e;return(0,o.kt)(p,(0,r.Z)({},s,n,{components:t,mdxType:"MDXLayout"}))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/abb47370.83d4a1df.js b/assets/js/abb47370.83d4a1df.js new file mode 100644 index 0000000000..722dd365f3 --- /dev/null +++ b/assets/js/abb47370.83d4a1df.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8752],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>f});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function o(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var d=n.createContext({}),l=function(e){var t=n.useContext(d),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},c=function(e){var t=l(e.components);return n.createElement(d.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,d=e.parentName,c=o(e,["components","mdxType","originalType","parentName"]),u=l(r),m=a,f=u["".concat(d,".").concat(m)]||u[m]||p[m]||i;return r?n.createElement(f,s(s({ref:t},c),{},{components:r})):n.createElement(f,s({ref:t},c))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,s=new Array(i);s[0]=m;var o={};for(var d in t)hasOwnProperty.call(t,d)&&(o[d]=t[d]);o.originalType=e,o[u]="string"==typeof e?e:a,s[1]=o;for(var l=2;l<i;l++)s[l]=r[l];return n.createElement.apply(null,s)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},50263:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>d,contentTitle:()=>s,default:()=>p,frontMatter:()=>i,metadata:()=>o,toc:()=>l});var n=r(87462),a=(r(67294),r(3905));const i={},s="IAM Standards",o={unversionedId:"iam/index",id:"iam/index",title:"IAM Standards",description:"This track revolves around Identity and Access Management (IAM) standards, providing guidelines for ensuring secure and efficient user authentication, authorization, and administration. It addresses issues related to user identity, permissions, roles, and policies, aiming to safeguard and streamline access to cloud resources and services.",source:"@site/standards/iam/index.md",sourceDirName:"iam",slug:"/iam/",permalink:"/standards/iam/",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"standards",previous:{title:"SCS KaaS default storage class",permalink:"/standards/scs-0211-v1-kaas-default-storage-class"},next:{title:"SCS-0300: SSO Identity Federation",permalink:"/standards/iam/scs-0300"}},d={},l=[],c={toc:l},u="wrapper";function p(e){let{components:t,...r}=e;return(0,a.kt)(u,(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"iam-standards"},"IAM Standards"),(0,a.kt)("p",null,"This track revolves around Identity and Access Management (IAM) standards, providing guidelines for ensuring secure and efficient user authentication, authorization, and administration. It addresses issues related to user identity, permissions, roles, and policies, aiming to safeguard and streamline access to cloud resources and services."),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Standard"),(0,a.kt)("th",{parentName:"tr",align:null},"Most Recent Version"),(0,a.kt)("th",{parentName:"tr",align:null},"State"),(0,a.kt)("th",{parentName:"tr",align:null},"Description"),(0,a.kt)("th",{parentName:"tr",align:null},"stabilized"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("a",{parentName:"td",href:"/standards/iam/scs-0300"},"SCS-0300")),(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("a",{parentName:"td",href:"/standards/scs-0300-v1-requirements-for-sso-identity-federation"},"v1")),(0,a.kt)("td",{parentName:"tr",align:null},"\ud83d\udfe2 Stable"),(0,a.kt)("td",{parentName:"tr",align:null},"Requirements for SSO identity federation"),(0,a.kt)("td",{parentName:"tr",align:null},"2023-06-21")))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/abecca15.d865e5c1.js b/assets/js/abecca15.d865e5c1.js new file mode 100644 index 0000000000..4cb51bbc19 --- /dev/null +++ b/assets/js/abecca15.d865e5c1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3778],{3905:(e,r,n)=>{n.d(r,{Zo:()=>c,kt:()=>m});var t=n(67294);function o(e,r,n){return r in e?Object.defineProperty(e,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[r]=n,e}function i(e,r){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);r&&(t=t.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),n.push.apply(n,t)}return n}function a(e){for(var r=1;r<arguments.length;r++){var n=null!=arguments[r]?arguments[r]:{};r%2?i(Object(n),!0).forEach((function(r){o(e,r,n[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(n,r))}))}return e}function s(e,r){if(null==e)return{};var n,t,o=function(e,r){if(null==e)return{};var n,t,o={},i=Object.keys(e);for(t=0;t<i.length;t++)n=i[t],r.indexOf(n)>=0||(o[n]=e[n]);return o}(e,r);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(t=0;t<i.length;t++)n=i[t],r.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=t.createContext({}),p=function(e){var r=t.useContext(l),n=r;return e&&(n="function"==typeof e?e(r):a(a({},r),e)),n},c=function(e){var r=p(e.components);return t.createElement(l.Provider,{value:r},e.children)},g="mdxType",u={inlineCode:"code",wrapper:function(e){var r=e.children;return t.createElement(t.Fragment,{},r)}},d=t.forwardRef((function(e,r){var n=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),g=p(n),d=o,m=g["".concat(l,".").concat(d)]||g[d]||u[d]||i;return n?t.createElement(m,a(a({ref:r},c),{},{components:n})):t.createElement(m,a({ref:r},c))}));function m(e,r){var n=arguments,o=r&&r.mdxType;if("string"==typeof e||o){var i=n.length,a=new Array(i);a[0]=d;var s={};for(var l in r)hasOwnProperty.call(r,l)&&(s[l]=r[l]);s.originalType=e,s[g]="string"==typeof e?e:o,a[1]=s;for(var p=2;p<i;p++)a[p]=n[p];return t.createElement.apply(null,a)}return t.createElement.apply(null,n)}d.displayName="MDXCreateElement"},40406:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var t=n(87462),o=(n(67294),n(3905));const i={sidebar_label:"Logging & Monitoring",sidebar_position:40},a="Logging & Monitoring",s={unversionedId:"iaas/guides/deploy-guide/services/logging-monitoring",id:"iaas/guides/deploy-guide/services/logging-monitoring",title:"Logging & Monitoring",description:"Common issues with deploying logging & monitoring services provided by Kolla",source:"@site/docs/02-iaas/guides/deploy-guide/services/logging-monitoring.md",sourceDirName:"02-iaas/guides/deploy-guide/services",slug:"/iaas/guides/deploy-guide/services/logging-monitoring",permalink:"/docs/iaas/guides/deploy-guide/services/logging-monitoring",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/deploy-guide/services/logging-monitoring.md",tags:[],version:"current",sidebarPosition:40,frontMatter:{sidebar_label:"Logging & Monitoring",sidebar_position:40},sidebar:"docs",previous:{title:"Network",permalink:"/docs/iaas/guides/deploy-guide/services/network"},next:{title:"Ceph",permalink:"/docs/iaas/guides/deploy-guide/services/ceph"}},l={},p=[{value:"OpenSearch",id:"opensearch",level:2},{value:"Prometheus",id:"prometheus",level:2},{value:"Grafana",id:"grafana",level:2}],c={toc:p},g="wrapper";function u(e){let{components:r,...n}=e;return(0,o.kt)(g,(0,t.Z)({},c,n,{components:r,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"logging--monitoring"},"Logging & Monitoring"),(0,o.kt)("p",null,"Common issues with deploying logging & monitoring services provided by Kolla\nare documented in the ",(0,o.kt)("a",{parentName:"p",href:"../../troubleshooting-guide/openstack"},"OpenStack Troubleshooting Guide"),"."),(0,o.kt)("h2",{id:"opensearch"},"OpenSearch"),(0,o.kt)("p",null,"OpenSearch dashboards is also deployed with the ",(0,o.kt)("inlineCode",{parentName:"p"},"opensearch")," role."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"osism apply -a pull opensearch\nosism apply opensearch\n")),(0,o.kt)("h2",{id:"prometheus"},"Prometheus"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"osism apply -a pull prometheus\nosism apply prometheus\n")),(0,o.kt)("h2",{id:"grafana"},"Grafana"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"osism apply -a pull grafana\nosism apply grafana\n")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/abfb0638.be57d877.js b/assets/js/abfb0638.be57d877.js new file mode 100644 index 0000000000..1d151f2c33 --- /dev/null +++ b/assets/js/abfb0638.be57d877.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4726],{3905:(e,a,n)=>{n.d(a,{Zo:()=>c,kt:()=>y});var t=n(67294);function r(e,a,n){return a in e?Object.defineProperty(e,a,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[a]=n,e}function o(e,a){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);a&&(t=t.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),n.push.apply(n,t)}return n}function l(e){for(var a=1;a<arguments.length;a++){var n=null!=arguments[a]?arguments[a]:{};a%2?o(Object(n),!0).forEach((function(a){r(e,a,n[a])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(a){Object.defineProperty(e,a,Object.getOwnPropertyDescriptor(n,a))}))}return e}function i(e,a){if(null==e)return{};var n,t,r=function(e,a){if(null==e)return{};var n,t,r={},o=Object.keys(e);for(t=0;t<o.length;t++)n=o[t],a.indexOf(n)>=0||(r[n]=e[n]);return r}(e,a);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(t=0;t<o.length;t++)n=o[t],a.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=t.createContext({}),p=function(e){var a=t.useContext(s),n=a;return e&&(n="function"==typeof e?e(a):l(l({},a),e)),n},c=function(e){var a=p(e.components);return t.createElement(s.Provider,{value:a},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var a=e.children;return t.createElement(t.Fragment,{},a)}},g=t.forwardRef((function(e,a){var n=e.components,r=e.mdxType,o=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),u=p(n),g=r,y=u["".concat(s,".").concat(g)]||u[g]||d[g]||o;return n?t.createElement(y,l(l({ref:a},c),{},{components:n})):t.createElement(y,l({ref:a},c))}));function y(e,a){var n=arguments,r=a&&a.mdxType;if("string"==typeof e||r){var o=n.length,l=new Array(o);l[0]=g;var i={};for(var s in a)hasOwnProperty.call(a,s)&&(i[s]=a[s]);i.originalType=e,i[u]="string"==typeof e?e:r,l[1]=i;for(var p=2;p<o;p++)l[p]=n[p];return t.createElement.apply(null,l)}return t.createElement.apply(null,n)}g.displayName="MDXCreateElement"},59906:(e,a,n)=>{n.r(a),n.d(a,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var t=n(87462),r=(n(67294),n(3905));const o={sidebar_label:"Apply",sidebar_position:5},l="Apply",i={unversionedId:"iaas/guides/operations-guide/manager/apply",id:"iaas/guides/operations-guide/manager/apply",title:"Apply",description:"List all available plays",source:"@site/docs/02-iaas/guides/operations-guide/manager/apply.md",sourceDirName:"02-iaas/guides/operations-guide/manager",slug:"/iaas/guides/operations-guide/manager/apply",permalink:"/docs/iaas/guides/operations-guide/manager/apply",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/operations-guide/manager/apply.md",tags:[],version:"current",sidebarPosition:5,frontMatter:{sidebar_label:"Apply",sidebar_position:5},sidebar:"docs",previous:{title:"Manager",permalink:"/docs/iaas/guides/operations-guide/manager/"},next:{title:"Logging",permalink:"/docs/iaas/guides/operations-guide/manager/log"}},s={},p=[{value:"List all available plays",id:"list-all-available-plays",level:2}],c={toc:p},u="wrapper";function d(e){let{components:a,...n}=e;return(0,r.kt)(u,(0,t.Z)({},c,n,{components:a,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"apply"},"Apply"),(0,r.kt)("h2",{id:"list-all-available-plays"},"List all available plays"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ osism apply\n2023-09-30 10:09:25 | INFO | No role given for execution. The roles listed in the table can be used.\n+------------------------------------------------------------------+----------------+\n| Role | Environment |\n|------------------------------------------------------------------+----------------|\n| aodh | kolla |\n| barbican | kolla |\n| bifrost | kolla |\n| bifrost-keypair | kolla |\n| ceilometer | kolla |\n| certificates | generic |\n| cinder | kolla |\n| cloudkitty | kolla |\n| collectd | kolla |\n| common | kolla |\n| designate | kolla |\n| elasticsearch | kolla |\n| etcd | kolla |\n| glance | kolla |\n| gnocchi | kolla |\n| grafana | kolla |\n| heat | kolla |\n| horizon | kolla |\n| ironic | kolla |\n| iscsi | kolla |\n...\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ac087500.5526b6b8.js b/assets/js/ac087500.5526b6b8.js new file mode 100644 index 0000000000..114ce88a0b --- /dev/null +++ b/assets/js/ac087500.5526b6b8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9564],{3905:(e,t,r)=>{r.d(t,{Zo:()=>l,kt:()=>b});var o=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function a(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function s(e,t){if(null==e)return{};var r,o,n=function(e,t){if(null==e)return{};var r,o,n={},i=Object.keys(e);for(o=0;o<i.length;o++)r=i[o],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o<i.length;o++)r=i[o],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var u=o.createContext({}),c=function(e){var t=o.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},l=function(e){var t=c(e.components);return o.createElement(u.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},g=o.forwardRef((function(e,t){var r=e.components,n=e.mdxType,i=e.originalType,u=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),d=c(r),g=n,b=d["".concat(u,".").concat(g)]||d[g]||p[g]||i;return r?o.createElement(b,a(a({ref:t},l),{},{components:r})):o.createElement(b,a({ref:t},l))}));function b(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,a=new Array(i);a[0]=g;var s={};for(var u in t)hasOwnProperty.call(t,u)&&(s[u]=t[u]);s.originalType=e,s[d]="string"==typeof e?e:n,a[1]=s;for(var c=2;c<i;c++)a[c]=r[c];return o.createElement.apply(null,a)}return o.createElement.apply(null,r)}g.displayName="MDXCreateElement"},2461:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>a,default:()=>p,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var o=r(87462),n=(r(67294),r(3905));const i={sidebar_label:"Troubleshooting Guide",sidebar_position:40},a="Troubleshooting Guide",s={unversionedId:"iaas/guides/troubleshooting-guide/index",id:"iaas/guides/troubleshooting-guide/index",title:"Troubleshooting Guide",description:"\ud83d\udca1 The Troubleshooting Guide describe how to solve issues.",source:"@site/docs/02-iaas/guides/troubleshooting-guide/index.md",sourceDirName:"02-iaas/guides/troubleshooting-guide",slug:"/iaas/guides/troubleshooting-guide/",permalink:"/docs/iaas/guides/troubleshooting-guide/",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/troubleshooting-guide/index.md",tags:[],version:"current",sidebarPosition:40,frontMatter:{sidebar_label:"Troubleshooting Guide",sidebar_position:40},sidebar:"docs",previous:{title:"Sandbox Manager",permalink:"/docs/iaas/guides/operations-guide/openstack/day2-operations/sandbox-manager"},next:{title:"Manager",permalink:"/docs/iaas/guides/troubleshooting-guide/manager"}},u={},c=[],l={toc:c},d="wrapper";function p(e){let{components:t,...r}=e;return(0,n.kt)(d,(0,o.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"troubleshooting-guide"},"Troubleshooting Guide"),(0,n.kt)("p",null,"\ud83d\udca1 The Troubleshooting Guide describe how to solve issues."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ad39e84b.2dc71df5.js b/assets/js/ad39e84b.2dc71df5.js new file mode 100644 index 0000000000..320443e092 --- /dev/null +++ b/assets/js/ad39e84b.2dc71df5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7105],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>h});var n=a(67294);function i(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?r(Object(a),!0).forEach((function(t){i(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):r(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function o(e,t){if(null==e)return{};var a,n,i=function(e,t){if(null==e)return{};var a,n,i={},r=Object.keys(e);for(n=0;n<r.length;n++)a=r[n],t.indexOf(a)>=0||(i[a]=e[a]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n<r.length;n++)a=r[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(i[a]=e[a])}return i}var d=n.createContext({}),s=function(e){var t=n.useContext(d),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},p=function(e){var t=s(e.components);return n.createElement(d.Provider,{value:t},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var a=e.components,i=e.mdxType,r=e.originalType,d=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),m=s(a),c=i,h=m["".concat(d,".").concat(c)]||m[c]||u[c]||r;return a?n.createElement(h,l(l({ref:t},p),{},{components:a})):n.createElement(h,l({ref:t},p))}));function h(e,t){var a=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var r=a.length,l=new Array(r);l[0]=c;var o={};for(var d in t)hasOwnProperty.call(t,d)&&(o[d]=t[d]);o.originalType=e,o[m]="string"==typeof e?e:i,l[1]=o;for(var s=2;s<r;s++)l[s]=a[s];return n.createElement.apply(null,l)}return n.createElement.apply(null,a)}c.displayName="MDXCreateElement"},16810:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>u,frontMatter:()=>r,metadata:()=>o,toc:()=>s});var n=a(87462),i=(a(67294),a(3905));const r={title:"SCS Image Metadata Standard",type:"Standard",stabilized_at:new Date("2022-10-31T00:00:00.000Z"),status:"Stable",track:"IaaS",replaces:"Image-Metadata-Spec.md"},l=void 0,o={unversionedId:"scs-0102-v1-image-metadata",id:"scs-0102-v1-image-metadata",title:"SCS Image Metadata Standard",description:"Motivation",source:"@site/standards/scs-0102-v1-image-metadata.md",sourceDirName:".",slug:"/scs-0102-v1-image-metadata",permalink:"/standards/scs-0102-v1-image-metadata",draft:!1,tags:[],version:"current",frontMatter:{title:"SCS Image Metadata Standard",type:"Standard",stabilized_at:"2022-10-31T00:00:00.000Z",status:"Stable",track:"IaaS",replaces:"Image-Metadata-Spec.md"},sidebar:"standards",previous:{title:"SCS-0102: Image Metadata",permalink:"/standards/iaas/scs-0102"},next:{title:"SCS-0103: Standard Flavors",permalink:"/standards/iaas/scs-0103"}},d={},s=[{value:"Motivation",id:"motivation",level:2},{value:"Overview",id:"overview",level:2},{value:"Naming",id:"naming",level:2},{value:"Technical requirements and features",id:"technical-requirements-and-features",level:2},{value:"Image handling",id:"image-handling",level:2},{value:"Image updating",id:"image-updating",level:3},{value:"Example",id:"example",level:4},{value:"Image Origin",id:"image-origin",level:3},{value:"Image build info",id:"image-build-info",level:3},{value:"Licensing / Maintenance subscription / Support",id:"licensing--maintenance-subscription--support",level:3},{value:"Conformance Tests",id:"conformance-tests",level:3}],p={toc:s},m="wrapper";function u(e){let{components:t,...a}=e;return(0,i.kt)(m,(0,n.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"motivation"},"Motivation"),(0,i.kt)("p",null,"Many clouds offer standard Operating System images for their users' convenience.\nTo make them really useful, they should contain meta data (properties) to allow\nusers to understand what they can expect using these images."),(0,i.kt)("p",null,"The specification is targeting images that are managed by the service provider,\nprovided for public consumption. The spec or parts of it however might turn out\nto be useful whenever someone manages images for somebody else's consumption."),(0,i.kt)("h2",{id:"overview"},"Overview"),(0,i.kt)("p",null,"We categorize the image properties into a few buckets"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Technical requirements and features"),(0,i.kt)("li",{parentName:"ul"},"Image handling aspects"),(0,i.kt)("li",{parentName:"ul"},"Licensing/Maintenance/Support aspects")),(0,i.kt)("h2",{id:"naming"},"Naming"),(0,i.kt)("p",null,'We suggest plain OS images to be named "Distribution Version",\ne.g. "openSUSE Leap 15.3" or "Ubuntu 20.04" or "CentOS 8", "Windows Server 2012R2".\nWe do not normally recommend to add more detailed patch levels into the name.'),(0,i.kt)("p",null,'Special variants that include specific non-standard features should be named\n"Distribution Version Feature1 Feature2".'),(0,i.kt)("p",null,"There are several policies possible to provide updated images to include the latest\nbug- and security fixes. This is outlined in update policy description below."),(0,i.kt)("h2",{id:"technical-requirements-and-features"},"Technical requirements and features"),(0,i.kt)("p",null,"This is dependent on whether we deal with VM images or container images."),(0,i.kt)("p",null,"For VM images (OpenStack), we recommend to use the properties as described\nin the ",(0,i.kt)("a",{parentName:"p",href:"https://docs.openstack.org/glance/latest//admin/useful-image-properties"},"OpenStack Image documentation"),"."),(0,i.kt)("p",null,"The following properties are considered mandatory:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"architecture"),", ",(0,i.kt)("inlineCode",{parentName:"li"},"hypervisor_type")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"min_disk_size")," (in GiB), ",(0,i.kt)("inlineCode",{parentName:"li"},"min_ram")," (in MiB)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"os_version"),", ",(0,i.kt)("inlineCode",{parentName:"li"},"os_distro")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"hw_rng_model"),", ",(0,i.kt)("inlineCode",{parentName:"li"},"hw_disk_bus")," (",(0,i.kt)("inlineCode",{parentName:"li"},"scsi")," recommended, and then setting ",(0,i.kt)("inlineCode",{parentName:"li"},"hw_scsi_model")," is also recommended)")),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Note"),": Disk sizes tend to be measured in GB = 10^9 and not GiB = 2^30 in the disk industry, but OpenStack uses GiB."),(0,i.kt)("p",null,"The following properties are recommended (if the features are supported):"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"os_secure_boot"),", ",(0,i.kt)("inlineCode",{parentName:"li"},"hw_firmware_type")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"hw_watchdog_action"),", ",(0,i.kt)("inlineCode",{parentName:"li"},"hw_mem_encryption"),", ",(0,i.kt)("inlineCode",{parentName:"li"},"hw_pmu"),", ",(0,i.kt)("inlineCode",{parentName:"li"},"hw_video_ram"),", ",(0,i.kt)("inlineCode",{parentName:"li"},"hw_vif_multiqueue_enabled"))),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"trait:XXX=required")," property can be used to indicate that certain virtual hardware\nfeatures ",(0,i.kt)("inlineCode",{parentName:"p"},"XXX")," are required."),(0,i.kt)("h2",{id:"image-handling"},"Image handling"),(0,i.kt)("h3",{id:"image-updating"},"Image updating"),(0,i.kt)("p",null,"It is recommended that provider managed images are regularly updated.\nThis means that users referencing an image ",(0,i.kt)("em",{parentName:"p"},"by name")," will always get the latest image for the\noperating system indicated by that name (which includes a version number, but not the patch\nlevel)."),(0,i.kt)("p",null,"Technically, the thus updated image is a new image and will thus carry a new UUID.\nIt is recommended that the old image gets renamed (e.g. build date or patch level attached)\nand hidden (",(0,i.kt)("inlineCode",{parentName:"p"},"os_hidden=true"),"), but remains accessible via its (unchanged) UUID for some\ntime."),(0,i.kt)("p",null,"The update handling by the provider is described via the properties ",(0,i.kt)("inlineCode",{parentName:"p"},"replace_frequency"),",\n",(0,i.kt)("inlineCode",{parentName:"p"},"uuid_validity"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"provided_until"),", and ",(0,i.kt)("inlineCode",{parentName:"p"},"hotfix_hours"),"."),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"replace_frequency"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"provided_until"),", and ",(0,i.kt)("inlineCode",{parentName:"p"},"hotfix_hours")," fields reference to the image\nas referenced by its name."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"th"},"replace_frequency")),(0,i.kt)("th",{parentName:"tr",align:null},"meaning"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"yearly")),(0,i.kt)("td",{parentName:"tr",align:null},"the image will get replaced ",(0,i.kt)("em",{parentName:"td"},"at least")," once per year")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"quarterly")),(0,i.kt)("td",{parentName:"tr",align:null},"the image will get replaced ",(0,i.kt)("em",{parentName:"td"},"at least")," once per quarter")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"monthly")),(0,i.kt)("td",{parentName:"tr",align:null},"the image will get replaced ",(0,i.kt)("em",{parentName:"td"},"at least")," once per month")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"weekly")),(0,i.kt)("td",{parentName:"tr",align:null},"the image will get replaced ",(0,i.kt)("em",{parentName:"td"},"at least")," once per week")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"daily")),(0,i.kt)("td",{parentName:"tr",align:null},"the image will get replaced ",(0,i.kt)("em",{parentName:"td"},"at least")," once per day")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"critical_bug")),(0,i.kt)("td",{parentName:"tr",align:null},"the image will get replaced for critical issues only")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"never")),(0,i.kt)("td",{parentName:"tr",align:null},"the image referenced by name will never change (until the date ",(0,i.kt)("inlineCode",{parentName:"td"},"provided_until"),")")))),(0,i.kt)("p",null,"Note the ",(0,i.kt)("em",{parentName:"p"},"at least")," wording: Providers can replace images more often.\nThe frequency is starting from the first release; so an image published on 2021-04-14 with an\nupdate frequency of ",(0,i.kt)("inlineCode",{parentName:"p"},"monthly"),", should be replaced no later than 2021-05-14. Due to weekends\netc., up to 3 days later is not considered a violation of this policy. So a valid sequence\nfrom an image with ",(0,i.kt)("inlineCode",{parentName:"p"},"monthly")," update frequency might be 2021-04-14, 2021-05-14, 2021-06-15,\n2021-07-14, 2021-07-27 (hotfix), 2021-08-13 ..."),(0,i.kt)("p",null,"Promises to update the registered public images typically depend on upstream image providers\n(Linux distributors, OS vendors) keeping their promises to build and provide updated images.\nFailures from upstream are not a reason to claim the cloud provider to be in violation of his\npromises. However, if the provider observes massive upstream failures (which can e.g. cause\nincreased security risks), we advise the provider to inform the users."),(0,i.kt)("p",null,"We recommend updating images at least monthly."),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"hotfix_hours")," field indicates how providers deal with critical security issues\nthat affect the images; it is an optional field that contains a numerical value, indicating\nhow quickly (in hours) a new image is provided ",(0,i.kt)("em",{parentName:"p"},"after the latter of the points in time that\nthe issue becomes public and a tested fix is available as maintenance update from the upstream\ndistribution"),". A value of 0 indicates a best-effort approach without firm SLAs; the field not\nbeing present indicates no commitment. A value of 48 would indicate that the provider\ncommits to a new image within 48hrs. A critical issue is defined as a security vulnerability\nwith a CVSS score of 9.0 or higher that affects a package that is included in the image."),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"provided_until")," field is supposed to contain a date in ",(0,i.kt)("inlineCode",{parentName:"p"},"YYYY-MM-DD")," format that\nindicates until when an image under this name will be provided and (according to the\n",(0,i.kt)("inlineCode",{parentName:"p"},"replace_frequency"),") updated at least. (Providers are free to provide updates for\nlonger or leave the non-updated image visible for longer.)\nIf this field is set to ",(0,i.kt)("inlineCode",{parentName:"p"},"none"),", no promises are made, if it is set to ",(0,i.kt)("inlineCode",{parentName:"p"},"notice"),", updates\nwill be provided until a deprecation notice is published. (The values are the same as\nfor below ",(0,i.kt)("inlineCode",{parentName:"p"},"uuid_validity"),", except that ",(0,i.kt)("inlineCode",{parentName:"p"},"forever")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"last-N")," don't make any sense.)"),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"uuid_validity")," field indicates how long the public image will be referencable\nby it's UUID."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"th"},"uuid_validity")),(0,i.kt)("th",{parentName:"tr",align:null},"meaning"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"none")),(0,i.kt)("td",{parentName:"tr",align:null},"UUID will only be valid as long as the content does not change")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"last-N")),(0,i.kt)("td",{parentName:"tr",align:null},"The last N images for newer replacement will remain accessible via UUID")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"YYYY-MM-DD")),(0,i.kt)("td",{parentName:"tr",align:null},"UUID will be valid until at least the date YYYY-MM-DD")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"notice")),(0,i.kt)("td",{parentName:"tr",align:null},"UUID will remain valid until a deprecation notice will be published")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"forever")),(0,i.kt)("td",{parentName:"tr",align:null},"UUID will remain valid for as long as the cloud operates")))),(0,i.kt)("p",null,"Note that the old images must be hidden from the image catalogue or renamed (or both)\nto avoid failing referencing by name. Note that ",(0,i.kt)("inlineCode",{parentName:"p"},"last-N")," may be limited by the ",(0,i.kt)("inlineCode",{parentName:"p"},"provided_till"),"\ndate."),(0,i.kt)("p",null,"The three properties ",(0,i.kt)("inlineCode",{parentName:"p"},"uuid_validity"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"provided_until")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"replace_frequency")," are mandatory;\nthe field ",(0,i.kt)("inlineCode",{parentName:"p"},"hotfix_hours")," is optional."),(0,i.kt)("p",null,"All dates are in UTC."),(0,i.kt)("h4",{id:"example"},"Example"),(0,i.kt)("p",null,"Providing an image with name ",(0,i.kt)("inlineCode",{parentName:"p"},"OPSYS MAJ.MIN")," with\n",(0,i.kt)("inlineCode",{parentName:"p"},"replace_frequency=monthly"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"provided_until=2022-09-30"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"uuid_validity=2022-12-31"),",\n",(0,i.kt)("inlineCode",{parentName:"p"},"hotfix_hours=0"),"\nmeans that we will have a new image with this name at least once per month (starting from\nthe initial release) until the end of September 2022. Old images will be hidden and/or\nrenamed, but remain accessible via their UUID until at least the end of 2022 (in Universal Time).\nThe provider makes an effort to replace images upon critical security issues out of order."),(0,i.kt)("h3",{id:"image-origin"},"Image Origin"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Mandatory: ",(0,i.kt)("inlineCode",{parentName:"p"},"image_source"),' needs to be a URL to point to a place from which the image can be downloaded.\n(Note: This may be set to the string "private" to indicate that the image can not be freely\ndownloaded.)')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Mandatory: ",(0,i.kt)("inlineCode",{parentName:"p"},"image_description")," needs to be an URL (or text) with release notes and other human readable\ndata about the image.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Recommended ",(0,i.kt)("em",{parentName:"p"},"tag"),": ",(0,i.kt)("inlineCode",{parentName:"p"},"managed_by_VENDOR")))),(0,i.kt)("p",null,"Note that for most images that come straight from an upstream source, ",(0,i.kt)("inlineCode",{parentName:"p"},"image_description")," should point\nto a an upstream web page where these images are described. If download links are available as well\non that page, ",(0,i.kt)("inlineCode",{parentName:"p"},"image_source")," can point to the same page, otherwise a more direct link to the image\nshould be used, e.g. directly linking the ",(0,i.kt)("inlineCode",{parentName:"p"},".qcow2")," or ",(0,i.kt)("inlineCode",{parentName:"p"},".img")," file.\nIf providers have their own image building machinery or do some post-processing on top of\nupstream images, they should point to the place where they document and offer these images."),(0,i.kt)("h3",{id:"image-build-info"},"Image build info"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Mandatory: ",(0,i.kt)("inlineCode",{parentName:"p"},"image_build_date")," needs to be ",(0,i.kt)("inlineCode",{parentName:"p"},"YYYY-MM-DD")," or ",(0,i.kt)("inlineCode",{parentName:"p"},"YYYY-MM-DD hh:mm[:ss]")," (time in UTC,\n24hrs clock).\nAll publicly released and generally recommended patches before this date must be included in the\nimage build. If the cutoff date is earlier, this cutoff date needs to be set instead, even\nif the actual build happens significantly after the cutoff date. If not all patches can be\nincluded for a good reason, then the ",(0,i.kt)("inlineCode",{parentName:"p"},"patchlevel")," field (see below) must be used to describe\nthe patch status.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Mandatory: ",(0,i.kt)("inlineCode",{parentName:"p"},"image_original_user")," is the default login user for the operating system which can connect\nto the image via the injected SSH key or provided password. (This can be set to ",(0,i.kt)("inlineCode",{parentName:"p"},"none")," if no default\nuser name exists for the operating system.)")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Optional: ",(0,i.kt)("inlineCode",{parentName:"p"},"patchlevel")," can be set to an operating specific patch level that describes the\npatch status \u2014 typically we would expect the ",(0,i.kt)("inlineCode",{parentName:"p"},"image_build_date")," to be sufficient.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Recommended: ",(0,i.kt)("inlineCode",{parentName:"p"},"os_hash_algo")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"os_hash_value"),": The sha256 or sha512 hash\nfor the image file. (This references the image file in the format it is stored in, we\nrecommend raw over qcow2 for systems that use ceph.) Note that these values are\ntypically generated automatically upon image registration.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Recommended ",(0,i.kt)("em",{parentName:"p"},"tag"),": ",(0,i.kt)("inlineCode",{parentName:"p"},"os:OPERATINGSYSTEM")))),(0,i.kt)("h3",{id:"licensing--maintenance-subscription--support"},"Licensing / Maintenance subscription / Support"),(0,i.kt)("p",null,"Some images require a license; in many cases the cloud providers include the license cost\nby a per-use (e.g. hourly) fee. However, it is also possible sometimes that customers\nuse their own license agreements with the OS vendor with a bring-your-own-license (BYOL)\nprogram. These properties may be attached to the image. Note that free Linux images\nmight not use any of these properties, except maybe ",(0,i.kt)("inlineCode",{parentName:"p"},"maintained_until"),". Note that\nWindows images would typically require ",(0,i.kt)("inlineCode",{parentName:"p"},"license_included"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"subscription_included"),".\nA boolean property that is not present is considered to be ",(0,i.kt)("inlineCode",{parentName:"p"},"false"),"."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Optional: ",(0,i.kt)("inlineCode",{parentName:"li"},"license_included")," (boolean) indicates whether or not the flavor fee\nincludes the licenses required to use this image. This field is mandatory for\nimages that contain software that requires commercial licenses."),(0,i.kt)("li",{parentName:"ul"},"Optional: ",(0,i.kt)("inlineCode",{parentName:"li"},"license_required")," (boolean) indicates whether or not a customer must bring\nits own license to be license compliant. This can not be true at the same time as the\nprevious setting. This field is mandatory IF customers need to bring their own\nlicense to use the image."),(0,i.kt)("li",{parentName:"ul"},"Optional: ",(0,i.kt)("inlineCode",{parentName:"li"},"subscription_included")," (boolean) indicates that the image contains already\na maintenance subscription which typically gives access to bug fixes, security\nfixes and (minor) function updates. If a subscription is included, the CSP should\nhave prepared the image to also receive the provided maintenance updates from the\nvendor (optionally via a mirror)."),(0,i.kt)("li",{parentName:"ul"},"Optional: ",(0,i.kt)("inlineCode",{parentName:"li"},"subscription_required")," (boolean) indicates that the customer requires\na maintenance subscription from the OS vendor in order to receive fixes\n(which is often also a prerequisite to be eligible for support)."),(0,i.kt)("li",{parentName:"ul"},"Optional: ",(0,i.kt)("inlineCode",{parentName:"li"},"maintained_until: YYYY-MM-DD")," promises maintenance from the OS vendor\nuntil at least this date (in UTC)."),(0,i.kt)("li",{parentName:"ul"},"Optional: ",(0,i.kt)("inlineCode",{parentName:"li"},"l1_support_contact")," contains a URI that provides customer support\ncontact for issues with this image. Note that this field must only be set if the\nservice provider does provide support for this image included in the image/flavor\npricing (but it might be provided by a contracted 3rd party, e.g. the OS vendor).")),(0,i.kt)("h3",{id:"conformance-tests"},"Conformance Tests"),(0,i.kt)("p",null,"The script ",(0,i.kt)("inlineCode",{parentName:"p"},"image-md-check.py")," retrieves the\nimage list from a configured cloud and checks each image for the\ncompleteness and consistency of mandatory properties."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/afaff11a.de4f00b8.js b/assets/js/afaff11a.de4f00b8.js new file mode 100644 index 0000000000..e5b6f4ab6e --- /dev/null +++ b/assets/js/afaff11a.de4f00b8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2878],{96271:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/community","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/b08c16de.3569e2f3.js b/assets/js/b08c16de.3569e2f3.js new file mode 100644 index 0000000000..68c98c1b30 --- /dev/null +++ b/assets/js/b08c16de.3569e2f3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[531],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var i=n(67294);function s(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function l(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){s(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function a(e,t){if(null==e)return{};var n,i,s=function(e,t){if(null==e)return{};var n,i,s={},o=Object.keys(e);for(i=0;i<o.length;i++)n=o[i],t.indexOf(n)>=0||(s[n]=e[n]);return s}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(i=0;i<o.length;i++)n=o[i],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(s[n]=e[n])}return s}var r=i.createContext({}),u=function(e){var t=i.useContext(r),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=u(e.components);return i.createElement(r.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},m=i.forwardRef((function(e,t){var n=e.components,s=e.mdxType,o=e.originalType,r=e.parentName,c=a(e,["components","mdxType","originalType","parentName"]),d=u(n),m=s,h=d["".concat(r,".").concat(m)]||d[m]||p[m]||o;return n?i.createElement(h,l(l({ref:t},c),{},{components:n})):i.createElement(h,l({ref:t},c))}));function h(e,t){var n=arguments,s=t&&t.mdxType;if("string"==typeof e||s){var o=n.length,l=new Array(o);l[0]=m;var a={};for(var r in t)hasOwnProperty.call(t,r)&&(a[r]=t[r]);a.originalType=e,a[d]="string"==typeof e?e:s,l[1]=a;for(var u=2;u<o;u++)l[u]=n[u];return i.createElement.apply(null,l)}return i.createElement.apply(null,n)}m.displayName="MDXCreateElement"},89233:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>r,contentTitle:()=>l,default:()=>p,frontMatter:()=>o,metadata:()=>a,toc:()=>u});var i=n(87462),s=(n(67294),n(3905));const o={},l="Ansible Style Guide",a={unversionedId:"contribute/styleguides/ansible_styleguide",id:"contribute/styleguides/ansible_styleguide",title:"Ansible Style Guide",description:"We use nearly all default rules of ansible lint. A listing of all these rules can be found in the Ansible Lint documentation:",source:"@site/community/contribute/styleguides/ansible_styleguide.md",sourceDirName:"contribute/styleguides",slug:"/contribute/styleguides/ansible_styleguide",permalink:"/community/contribute/styleguides/ansible_styleguide",draft:!1,tags:[],version:"current",frontMatter:{}},r={},u=[{value:"Task naming",id:"task-naming",level:2},{value:"Key Order",id:"key-order",level:2},{value:"Positioning and use of the become directive",id:"positioning-and-use-of-the-become-directive",level:3},{value:"Position of the when condition",id:"position-of-the-when-condition",level:3},{value:"Usage of collections",id:"usage-of-collections",level:2},{value:"Usage of roles from other collections",id:"usage-of-roles-from-other-collections",level:2},{value:"Parameters that offer lists",id:"parameters-that-offer-lists",level:2},{value:"Usage of changed_when",id:"usage-of-changed_when",level:2},{value:"Disable linting rules",id:"disable-linting-rules",level:2}],c={toc:u},d="wrapper";function p(e){let{components:t,...n}=e;return(0,s.kt)(d,(0,i.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,s.kt)("h1",{id:"ansible-style-guide"},"Ansible Style Guide"),(0,s.kt)("p",null,"We use nearly all default rules of ansible lint. A listing of all these rules can be found in the Ansible Lint documentation:\n",(0,s.kt)("a",{parentName:"p",href:"https://ansible.readthedocs.io/projects/lint/rules/"},"https://ansible.readthedocs.io/projects/lint/rules/"),".\nPlease always use the ansible linting to check if the code complies with the default linting rules.\nHowever, since in most cases we always use the latest version of packages and Ansible lint does not provide this, we decided to\ndisable the package_latest rule."),(0,s.kt)("h2",{id:"task-naming"},"Task naming"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"Tasks must always have names. The only exception allowed is for forked playbooks."),(0,s.kt)("li",{parentName:"ul"},"A name never starts with a small letter"),(0,s.kt)("li",{parentName:"ul"},"Names are written in present tense"),(0,s.kt)("li",{parentName:"ul"},"No punctuation is used in names")),(0,s.kt)("h2",{id:"key-order"},"Key Order"),(0,s.kt)("p",null,"To check the key order we use our own rule. This can be found ",(0,s.kt)("a",{parentName:"p",href:"https://github.com/osism/zuul-jobs/tree/main/roles/ansible-lint/files"},"here"),"."),(0,s.kt)("h3",{id:"positioning-and-use-of-the-become-directive"},"Positioning and use of the become directive"),(0,s.kt)("p",null,"The become directive is only set when needed and is always set explicitly for each task that needs it."),(0,s.kt)("p",null,"Blocks, roles or playbooks are never executed in a privileged mode."),(0,s.kt)("p",null,"We always insert the become directive between the name of a task and the task itself. This also applies to related directives\nlike ",(0,s.kt)("em",{parentName:"p"},"become_user")," or ",(0,s.kt)("em",{parentName:"p"},"become_flags"),". This is for better visibility if a task is privileged or not."),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-yaml"},'- name: Copy hddtemp configuration file\n become: true\n ansible.builtin.copy:\n src: "{{ ansible_os_family }}/hddtemp"\n dest: "{{ hddtemp_conf_file }}"\n owner: root\n group: root\n mode: 0644\n notify: Restart hddtemp service\n')),(0,s.kt)("h3",{id:"position-of-the-when-condition"},"Position of the when condition"),(0,s.kt)("p",null,"If you need to use the when condition please add this at the end-section from the task where it is needed. This makes the code\neasier to understand for others. Ansible lint provides the when condition under the task name for blocks. To keep the code clear\nwe decided against it. Please disable this with a noqa if necessary. For example:"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-yaml"},'- name: "Archive existing {{ resolvconf_file }} file"\n become: true\n ansible.posix.synchronize:\n src: "/etc/resolv.conf"\n dest: "/etc/resolv.conf.{{ ansible_date_time.date }}"\n archive: true\n delegate_to: "{{ inventory_hostname }}"\n when: stat_resolvconf_file.stat.islnk is defined and not stat_resolvconf_file.stat.islnk\n')),(0,s.kt)("h2",{id:"usage-of-collections"},"Usage of collections"),(0,s.kt)("p",null,"Collections are always defined as in the following example."),(0,s.kt)("p",null,(0,s.kt)("strong",{parentName:"p"},"netbox.netbox")," is here the collection that is used."),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-yaml"},'- name: Configure netbox manufacturers\n netbox.netbox.netbox_manufacturer:\n netbox_url: "{{ netbox_url }}"\n netbox_token: "{{ netbox_token }}"\n data:\n name: "{{ item.value.name }}"\n slug: "{{ item.value.slug }}"\n description: "{{ item.value.description | default(\'\') }}"\n state: present\n with_dict: "{{ netbox_data_manufacturers }}"\n')),(0,s.kt)("p",null,"Please don\xb4t declare it in this way!:"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-yaml"},'collections:\n - netbox.netbox\n\n tasks:\n - name: Manage Discworld site\n netbox_site:\n netbox_url: "{{ netbox_url }}"\n netbox_token: "{{ netbox_token }}"\n validate_certs: false\n data:\n name: Discworld\n slug: discworld\n state: present\n')),(0,s.kt)("p",null,"If you have to use collections please define them in a requirements.yml."),(0,s.kt)("p",null,"Example yaml:"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-yaml"},"roles:\n - name: geerlingguy.certbot\n version: master\n type: git\n src: git+https://github.com/geerlingguy/ansible-role-certbot.git\n...\n\ncollections:\n - name: ansible.netcommon\n source: https://galaxy.ansible.com\n\n - name: https://github.com/ansible-collections/ansible.posix.git\n type: git\n version: main\n")),(0,s.kt)("h2",{id:"usage-of-roles-from-other-collections"},"Usage of roles from other collections"),(0,s.kt)("p",null,"If you want to reuse roles please do it in the following way:"),(0,s.kt)("p",null,"First you have to declare the role or collection in the requirements.yml like shown in the example before."),(0,s.kt)("p",null,"Than you can use it in playbooks like this"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-yaml"}," roles:\n - role: osism.services.auditd\n")),(0,s.kt)("h2",{id:"parameters-that-offer-lists"},"Parameters that offer lists"),(0,s.kt)("p",null,"Parameters that provide a list are always defined as in the following example."),(0,s.kt)("p",null,(0,s.kt)("strong",{parentName:"p"},"docker_hosts_defaults")," sets the defaults in the role. Overriding is only possible with the ",(0,s.kt)("strong",{parentName:"p"},"ansible-defaults")," repository."),(0,s.kt)("p",null,"In the configuration repository, docker_hosts_extra is then used to add additional items to the list."),(0,s.kt)("p",null,(0,s.kt)("strong",{parentName:"p"},"docker_hosts")," itself is never modified from the outside."),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-yaml"},' docker_hosts_defaults:\n - "unix:///var/run/docker.sock"\n docker_hosts_extra: []\n docker_hosts: "{{ docker_hosts_defaults + docker_hosts_extra }}"\n')),(0,s.kt)("h2",{id:"usage-of-changed_when"},"Usage of changed_when"),(0,s.kt)("p",null,"Please think twice before turning off changed_when. It's a fairly simple yet safety-relevant linting rule and is quite easy to\nimplement."),(0,s.kt)("h2",{id:"disable-linting-rules"},"Disable linting rules"),(0,s.kt)("p",null,"In principle, it is only allowed to disable rules if there is really no other possibility.\nPlease do not disable rules in general but only in individual cases via Noqa. Please use in this case the full rulename and not\nthe numbers, because them are depricated. If it makes sense to ignore a rule, please open up an issue in the\n",(0,s.kt)("a",{parentName:"p",href:"https://github.com/osism/issues"},"https://github.com/osism/issues")," repository with a label discussion."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b12ed0df.5be3e843.js b/assets/js/b12ed0df.5be3e843.js new file mode 100644 index 0000000000..94ad8a5012 --- /dev/null +++ b/assets/js/b12ed0df.5be3e843.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5729],{29670:s=>{s.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"standards"}')}}]); \ No newline at end of file diff --git a/assets/js/b2b675dd.d31b93c7.js b/assets/js/b2b675dd.d31b93c7.js new file mode 100644 index 0000000000..4ad09090cd --- /dev/null +++ b/assets/js/b2b675dd.d31b93c7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[533],{28017:e=>{e.exports=JSON.parse('{"permalink":"/blog","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/b2f554cd.9dc96d6c.js b/assets/js/b2f554cd.9dc96d6c.js new file mode 100644 index 0000000000..eda567749e --- /dev/null +++ b/assets/js/b2f554cd.9dc96d6c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1477],{30010:t=>{t.exports=JSON.parse('{"blogPosts":[{"id":"first-blog-post","metadata":{"permalink":"/blog/first-blog-post","editUrl":"https://github.com/SovereignCloudStack/docs/tree/main/blog/2022-10-28-first-blog-post.md","source":"@site/blog/2022-10-28-first-blog-post.md","title":"First Blog Post","description":"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet","date":"2022-10-28T00:00:00.000Z","formattedDate":"October 28, 2022","tags":[{"label":"community","permalink":"/blog/tags/community"},{"label":"howto","permalink":"/blog/tags/howto"}],"readingTime":0.12,"hasTruncateMarker":false,"authors":[{"name":"Eduard Itrich","title":"Community Manager @ SCS","url":"https://github.com/itrich","imageURL":"https://github.com/itrich.png","key":"itrich"}],"frontMatter":{"slug":"first-blog-post","title":"First Blog Post","authors":"itrich","tags":["community","howto"]}},"content":"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"}]}')}}]); \ No newline at end of file diff --git a/assets/js/b840bdcc.a3f773d3.js b/assets/js/b840bdcc.a3f773d3.js new file mode 100644 index 0000000000..d6a40e0702 --- /dev/null +++ b/assets/js/b840bdcc.a3f773d3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7334],{20744:e=>{e.exports=JSON.parse('{"title":"Metering","slug":"/category/metering","permalink":"/docs/category/metering","navigation":{"previous":{"title":"\\"Levels of consensus\\"","permalink":"/docs/operating-scs/components/status-page/docs/levels_of_consensus"},"next":{"title":"Metering Configuration","permalink":"/docs/operating-scs/metering/meter_configuration"}}}')}}]); \ No newline at end of file diff --git a/assets/js/b8fd74b5.899b29ef.js b/assets/js/b8fd74b5.899b29ef.js new file mode 100644 index 0000000000..3d6a1bcb34 --- /dev/null +++ b/assets/js/b8fd74b5.899b29ef.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8211],{3905:(e,n,r)=>{r.d(n,{Zo:()=>l,kt:()=>b});var t=r(67294);function a(e,n,r){return n in e?Object.defineProperty(e,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[n]=r,e}function o(e,n){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);n&&(t=t.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),r.push.apply(r,t)}return r}function c(e){for(var n=1;n<arguments.length;n++){var r=null!=arguments[n]?arguments[n]:{};n%2?o(Object(r),!0).forEach((function(n){a(e,n,r[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))}))}return e}function i(e,n){if(null==e)return{};var r,t,a=function(e,n){if(null==e)return{};var r,t,a={},o=Object.keys(e);for(t=0;t<o.length;t++)r=o[t],n.indexOf(r)>=0||(a[r]=e[r]);return a}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(t=0;t<o.length;t++)r=o[t],n.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=t.createContext({}),p=function(e){var n=t.useContext(s),r=n;return e&&(r="function"==typeof e?e(n):c(c({},n),e)),r},l=function(e){var n=p(e.components);return t.createElement(s.Provider,{value:n},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return t.createElement(t.Fragment,{},n)}},m=t.forwardRef((function(e,n){var r=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,l=i(e,["components","mdxType","originalType","parentName"]),u=p(r),m=a,b=u["".concat(s,".").concat(m)]||u[m]||d[m]||o;return r?t.createElement(b,c(c({ref:n},l),{},{components:r})):t.createElement(b,c({ref:n},l))}));function b(e,n){var r=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var o=r.length,c=new Array(o);c[0]=m;var i={};for(var s in n)hasOwnProperty.call(n,s)&&(i[s]=n[s]);i.originalType=e,i[u]="string"==typeof e?e:a,c[1]=i;for(var p=2;p<o;p++)c[p]=r[p];return t.createElement.apply(null,c)}return t.createElement.apply(null,r)}m.displayName="MDXCreateElement"},86902:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>s,contentTitle:()=>c,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var t=r(87462),a=(r(67294),r(3905));const o={sidebar_label:"Sandbox Manager",sidebar_position:54},c="Sandbox Manager",i={unversionedId:"iaas/components/sandbox-manager",id:"iaas/components/sandbox-manager",title:"Sandbox Manager",description:"",source:"@site/docs/02-iaas/components/sandbox-manager.md",sourceDirName:"02-iaas/components",slug:"/iaas/components/sandbox-manager",permalink:"/docs/iaas/components/sandbox-manager",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/components/sandbox-manager.md",tags:[],version:"current",sidebarPosition:54,frontMatter:{sidebar_label:"Sandbox Manager",sidebar_position:54}},s={},p=[],l={toc:p},u="wrapper";function d(e){let{components:n,...r}=e;return(0,a.kt)(u,(0,t.Z)({},l,r,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"sandbox-manager"},"Sandbox Manager"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/bd319452.5e3ee300.js b/assets/js/bd319452.5e3ee300.js new file mode 100644 index 0000000000..3d7a2a4ace --- /dev/null +++ b/assets/js/bd319452.5e3ee300.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1849],{3905:(t,e,a)=>{a.d(e,{Zo:()=>d,kt:()=>c});var n=a(67294);function r(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function l(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function i(t){for(var e=1;e<arguments.length;e++){var a=null!=arguments[e]?arguments[e]:{};e%2?l(Object(a),!0).forEach((function(e){r(t,e,a[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(a)):l(Object(a)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(a,e))}))}return t}function o(t,e){if(null==t)return{};var a,n,r=function(t,e){if(null==t)return{};var a,n,r={},l=Object.keys(t);for(n=0;n<l.length;n++)a=l[n],e.indexOf(a)>=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(n=0;n<l.length;n++)a=l[n],e.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var p=n.createContext({}),s=function(t){var e=n.useContext(p),a=e;return t&&(a="function"==typeof t?t(e):i(i({},e),t)),a},d=function(t){var e=s(t.components);return n.createElement(p.Provider,{value:e},t.children)},m="mdxType",u={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},k=n.forwardRef((function(t,e){var a=t.components,r=t.mdxType,l=t.originalType,p=t.parentName,d=o(t,["components","mdxType","originalType","parentName"]),m=s(a),k=r,c=m["".concat(p,".").concat(k)]||m[k]||u[k]||l;return a?n.createElement(c,i(i({ref:e},d),{},{components:a})):n.createElement(c,i({ref:e},d))}));function c(t,e){var a=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var l=a.length,i=new Array(l);i[0]=k;var o={};for(var p in e)hasOwnProperty.call(e,p)&&(o[p]=e[p]);o.originalType=t,o[m]="string"==typeof t?t:r,i[1]=o;for(var s=2;s<l;s++)i[s]=a[s];return n.createElement.apply(null,i)}return n.createElement.apply(null,a)}k.displayName="MDXCreateElement"},17680:(t,e,a)=>{a.r(e),a.d(e,{assets:()=>p,contentTitle:()=>i,default:()=>u,frontMatter:()=>l,metadata:()=>o,toc:()=>s});var n=a(87462),r=(a(67294),a(3905));const l={sidebar_label:"Testbed",sidebar_position:11},i="Testbed",o={unversionedId:"iaas/guides/deploy-guide/examples/testbed",id:"iaas/guides/deploy-guide/examples/testbed",title:"Testbed",description:"\ud83d\udca1 With the OSISM Testbed, it is possible to run a full Sovereign Cloud Stack",source:"@site/docs/02-iaas/guides/deploy-guide/examples/testbed.md",sourceDirName:"02-iaas/guides/deploy-guide/examples",slug:"/iaas/guides/deploy-guide/examples/testbed",permalink:"/docs/iaas/guides/deploy-guide/examples/testbed",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/deploy-guide/examples/testbed.md",tags:[],version:"current",sidebarPosition:11,frontMatter:{sidebar_label:"Testbed",sidebar_position:11},sidebar:"docs",previous:{title:"Cloud in a Box",permalink:"/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box"},next:{title:"Upgrade Guide",permalink:"/docs/iaas/guides/upgrade-guide/"}},p={},s=[{value:"Requirements",id:"requirements",level:2},{value:"Cloud access",id:"cloud-access",level:3},{value:"Cloud resources",id:"cloud-resources",level:3},{value:"Preparations",id:"preparations",level:2},{value:"Software",id:"software",level:3},{value:"Custom CA",id:"custom-ca",level:3},{value:"Getting Started",id:"getting-started",level:2},{value:"Configuration",id:"configuration",level:2},{value:"Variables",id:"variables",level:3},{value:"Overrides",id:"overrides",level:3},{value:"Customisations",id:"customisations",level:3},{value:"Usage",id:"usage",level:2},{value:"VPN access",id:"vpn-access",level:3},{value:"Webinterfaces",id:"webinterfaces",level:3},{value:"Authentication with OIDC",id:"authentication-with-oidc",level:3},{value:"OpenStack web dashboard (Horizon) login via OIDC",id:"openstack-web-dashboard-horizon-login-via-oidc",level:4},{value:"OpenStack web dashboard (Horizon) logout",id:"openstack-web-dashboard-horizon-logout",level:4},{value:"OpenStack CLI operations with OpenID Connect password",id:"openstack-cli-operations-with-openid-connect-password",level:4},{value:"OpenStack CLI token issue with OpenID Connect",id:"openstack-cli-token-issue-with-openid-connect",level:4},{value:"Advanced Usage",id:"advanced-usage",level:2},{value:"Change versions",id:"change-versions",level:3},{value:"Deploy services",id:"deploy-services",level:3},{value:"Upgrade services",id:"upgrade-services",level:3},{value:"Troubleshooting",id:"troubleshooting",level:2},{value:"Unsupported locale setting",id:"unsupported-locale-setting",level:3},{value:"yq: No such file or directory",id:"yq-no-such-file-or-directory",level:3},{value:"Notes",id:"notes",level:2},{value:"Appendix",id:"appendix",level:2},{value:"Supported releases",id:"supported-releases",level:3},{value:"Included services",id:"included-services",level:3},{value:"Infrastructure",id:"infrastructure",level:4},{value:"OpenStack",id:"openstack",level:4},{value:"Makfile reference",id:"makfile-reference",level:3},{value:"CI jobs",id:"ci-jobs",level:3}],d={toc:s},m="wrapper";function u(t){let{components:e,...a}=t;return(0,r.kt)(m,(0,n.Z)({},d,a,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"testbed"},"Testbed"),(0,r.kt)("p",null,"\ud83d\udca1 With the OSISM Testbed, it is possible to run a full Sovereign Cloud Stack\ndeployment on an existing OpenStack environment such as Cleura or REGIO.cloud."),(0,r.kt)("p",null,"OSISM is the reference implementation for the infrastructure as a service layer in the\n",(0,r.kt)("a",{parentName:"p",href:"https://scs.community"},"Sovereign Cloud Stack")," (SCS) project. The OSISM Testbed is therefore\nused in the SCS project to test and work on the Instrastructure as a Service layer."),(0,r.kt)("p",null,"The OSISM Testbed is intended as a playground. Further services and integration will\nbe added over time. More and more best practices and experiences from the productive\ndeployments will be included here in the future. It will become more production-like\nover time. However, at no point does it claim to represent a production setup exactly."),(0,r.kt)("h2",{id:"requirements"},"Requirements"),(0,r.kt)("h3",{id:"cloud-access"},"Cloud access"),(0,r.kt)("p",null,"The prerequisite is to have an account on one of the supported OpenStack cloud providers."),(0,r.kt)("p",null,"It is not part of this guide to describe the registration with the individual cloud\nproviders. Please contact the respective cloud provider for this."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"Product")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"Provider")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"Profile name")))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Cleura"),(0,r.kt)("td",{parentName:"tr",align:null},"Cleura"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"cleura"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Fuga Cloud"),(0,r.kt)("td",{parentName:"tr",align:null},"FUGA"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"fuga"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"HuaweiCloud"),(0,r.kt)("td",{parentName:"tr",align:null},"HuaweiCloud"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"huaweicloud"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"OVH"),(0,r.kt)("td",{parentName:"tr",align:null},"OVH"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"ovh"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"OpenTelekomCloud"),(0,r.kt)("td",{parentName:"tr",align:null},"T-Systems"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"otc"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"pluscloud open"),(0,r.kt)("td",{parentName:"tr",align:null},"plusserver"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"pluscloudopen"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"REGIO.cloud"),(0,r.kt)("td",{parentName:"tr",align:null},"OSISM"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"regiocloud"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Wavestack"),(0,r.kt)("td",{parentName:"tr",align:null},"noris network"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"wavestack"))))),(0,r.kt)("p",null,"For each provider listed in the table, a predefined profile is available in the\n",(0,r.kt)("inlineCode",{parentName:"p"},"terraform/environments")," directory. This profile contains the name of the public\nnetwork, which flavors to use, etc."),(0,r.kt)("p",null,"Here is an example from the profile for REGIO.cloud."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},'flavor_manager = "SCS-4V-8-50"\nflavor_node = "SCS-8V-32-100"\nvolume_type = "ssd"\nimage = "Ubuntu 22.04"\nimage_node = "Ubuntu 22.04"\npublic = "public"\navailability_zone = "nova"\nvolume_availability_zone = "nova"\nnetwork_availability_zone = "nova"\n')),(0,r.kt)("h3",{id:"cloud-resources"},"Cloud resources"),(0,r.kt)("p",null,"The OSISM Testbed requires at least the following project quota when using the default flavors:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"Resource")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"Quantity")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"Note")))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"4"),(0,r.kt)("td",{parentName:"tr",align:null},"Instances"),(0,r.kt)("td",{parentName:"tr",align:null},"28 VCPUs + 104 GByte RAM")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"9"),(0,r.kt)("td",{parentName:"tr",align:null},"Volumes"),(0,r.kt)("td",{parentName:"tr",align:null},"90 GByte volume storage")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1"),(0,r.kt)("td",{parentName:"tr",align:null},"Floating IP"),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1"),(0,r.kt)("td",{parentName:"tr",align:null},"Keypair"),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"3"),(0,r.kt)("td",{parentName:"tr",align:null},"Security group"),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"16"),(0,r.kt)("td",{parentName:"tr",align:null},"Security group rules"),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1"),(0,r.kt)("td",{parentName:"tr",align:null},"Network"),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1"),(0,r.kt)("td",{parentName:"tr",align:null},"Subetwork"),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"6"),(0,r.kt)("td",{parentName:"tr",align:null},"Ports"),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1"),(0,r.kt)("td",{parentName:"tr",align:null},"Router"),(0,r.kt)("td",{parentName:"tr",align:null})))),(0,r.kt)("h2",{id:"preparations"},"Preparations"),(0,r.kt)("h3",{id:"software"},"Software"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"make")," must be installed on the system"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"yq")," must be installed on the system. ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/mikefarah/yq"},"yq")," is a portable\ncommand-line YAML, JSON, XML, CSV, TOML and properties processor."),(0,r.kt)("li",{parentName:"ul"},"Ansible in a current version must be installed and usable on the local workstation. Currently Ansible 8 is supported.\nInformation on installing Ansible can be found in the ",(0,r.kt)("a",{parentName:"li",href:"https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html"},"Ansible\ndocumentation")),(0,r.kt)("li",{parentName:"ul"},"Terraform in a current version must be installed and usable on the local workstation. Currently Terraform 1.5 is supported.\nInformation on installing Terraform can be found in the ",(0,r.kt)("a",{parentName:"li",href:"https://learn.hashicorp.com/tutorials/terraform/install-cli"},"Terraform\ndocumentation"))),(0,r.kt)("h3",{id:"custom-ca"},"Custom CA"),(0,r.kt)("p",null,"The OSISM Testbed installation currently uses hostnames in the domain ",(0,r.kt)("inlineCode",{parentName:"p"},"testbed.osism.xyz"),". This is a real domain\nand we provide the DNS records matching the addresses used in the OSISM Testbed, so that once you connect to your testbed via a direct\nlink or Wireguard, you can access hosts and servers by their hostname (e.g. ",(0,r.kt)("inlineCode",{parentName:"p"},"ssh testbed-manager.testbed.osism.xyz"),")."),(0,r.kt)("p",null,"We also provide a wildcard TLS certificate signed by a custom CA for ",(0,r.kt)("inlineCode",{parentName:"p"},"testbed.osism.xyz")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"*.testbed.osism.xyz"),"."),(0,r.kt)("p",null,"This CA is always used for each testbed. The CA is not regenerated and it is not planned to change this for the next 10 years."),(0,r.kt)("p",null,"In order for these certificates to be recognized locally as valid, the CA\n",(0,r.kt)("a",{parentName:"p",href:"https://raw.githubusercontent.com/osism/testbed/main/environments/kolla/certificates/ca/testbed.crt"},"environments/kolla/certificates/ca/testbed.crt"),"\nmust be imported locally."),(0,r.kt)("h2",{id:"getting-started"},"Getting Started"),(0,r.kt)("p",null,"This section describes step by step how to deploy the OSISM Testbed."),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Clone the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/osism/testbed"},"osism/testbed")," repository.\nThe repository can also be cloned to any other location."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"mkdir -p ~/src/github.com/osism\ngit clone https://github.com/osism/testbed ~/src/github.com/osism/testbed\ncd ~/src/github.com/osism/testbed\n")))),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"The access data for the cloud provider used is then stored in ",(0,r.kt)("inlineCode",{parentName:"p"},"terraform/clouds.yaml"),".\nThe ",(0,r.kt)("inlineCode",{parentName:"p"},"clouds.yaml")," file is provided by the cloud provider used. Please check the documentation\nof the cloud provider you are using or their support for details."),(0,r.kt)("p",{parentName:"li"},"REGIO.cloud is used as an example. The cloud name in ",(0,r.kt)("inlineCode",{parentName:"p"},"clouds.yaml"),"\nand the environment name (value of ",(0,r.kt)("inlineCode",{parentName:"p"},"ENVIRONMENT"),") are ",(0,r.kt)("inlineCode",{parentName:"p"},"regiocloud")," in this case. If another cloud\nis used, replace ",(0,r.kt)("inlineCode",{parentName:"p"},"regioclodu")," with the respective profile name from the table above."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},"clouds:\n regiocloud:\n auth:\n auth_url: https://keystone.services.a.regiocloud.tech/v3\n project_name: PROJECT\n username: USERNAME\n password: PASSWORD\n project_domain_name: DOMAIN\n user_domain_name: DOMAIN\n")),(0,r.kt)("p",{parentName:"li"},"The use of application credentials is preferred. This way it is not necessary to store\ndetails like username or project name or sensitive information like the password in the\n",(0,r.kt)("inlineCode",{parentName:"p"},"clouds.yaml")," file."),(0,r.kt)("p",{parentName:"li"},"The application credentials can be found in Horizon under ",(0,r.kt)("strong",{parentName:"p"},"Identity"),". Use ",(0,r.kt)("inlineCode",{parentName:"p"},"OSISM testbed")," as\nname and click ",(0,r.kt)("inlineCode",{parentName:"p"},"Create Application Credential"),"."),(0,r.kt)("p",{parentName:"li"},"The ",(0,r.kt)("inlineCode",{parentName:"p"},"clouds.yaml")," file of REGIO.cloud can be used as an example for the use of\napplication credentials. With another cloud provider, only the ",(0,r.kt)("inlineCode",{parentName:"p"},"auth_url")," must then be changed\naccordingly."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},'clouds:\n regiocloud:\n auth:\n auth_url: https://keystone.services.a.regiocloud.tech/v3\n application_credential_id: ID\n application_credential_secret: SECRET\n auth_type: "v3applicationcredential"\n'))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Prepare the deployment. The versions of Ansible and Terraform are checked and necessary\ndependencies are cloned."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"make prepare\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Create the infrastructure with Terraform."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"make ENVIRONMENT=regiocloud create\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Deploy the OSISM manager and bootstrap all nodes."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"make ENVIRONMENT=regiocloud manager\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Deploy all services. Depending on the cloud, the installation will take some time. Up\nto two hours is not unusual. In this step, Ceph, OpenStack and all necessary\ninfrastructure services (MariaDB, RabbitMQ, ...) are deployed."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"make ENVIRONMENT=regiocloud deploy\n")),(0,r.kt)("p",{parentName:"li"},"Alternatively, it is also possible to deploy the services step by step directly on the\nmanager. To do this, first log in to the manager with ",(0,r.kt)("inlineCode",{parentName:"p"},"make ENVIRONMENT=regiocloud login"),"\nand then execute the deploy scripts one after the other. It is recommended to do this\nwithin a screen session."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"/opt/configuration/scripts/deploy/001-helper-services.sh\n/opt/configuration/scripts/deploy/100-ceph-services-basic.sh\n/opt/configuration/scripts/deploy/200-infrastructure-services-basic.sh\n/opt/configuration/scripts/deploy/300-openstack-services-basic.sh\n/opt/configuration/scripts/deploy/400-monitoring-services.sh\n")),(0,r.kt)("p",{parentName:"li"},"Deploying the services takes some time and depends on how much bandwidth is available,\nhow the instances are equipped, etc. 90-120 minutes is not unusual when Ceph and OpenStack\nare fully deployed.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"After the deployment, you can log in to the manager via SSH."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"make ENVIRONMENT=regiocloud login\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"If you want you can create a test project with a test user after login. It also\ncreates an instance with a volume attached to a network with a router."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"osism apply --environment openstack test\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"When the OSISM Testbed is no longer needed, it can be deleted."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"make ENVIRONMENT=regiocloud clean\n")))),(0,r.kt)("h2",{id:"configuration"},"Configuration"),(0,r.kt)("p",null,"This section describes how to configure and customise the OSISM Testbed."),(0,r.kt)("h3",{id:"variables"},"Variables"),(0,r.kt)("p",null,"The defaults for the Terraform variables are intended for REGIO.cloud."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"Variable")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"Default")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"Description")))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"availability_zone"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"nova")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ceph_version"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"quincy")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"cloud_provider"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"regiocloud")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"configuration_version"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"main")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"deploy_monitoring"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"false")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"dns_nameservers"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},'["8.8.8.8", "9.9.9.9"]')),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"enable_config_drive"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"true")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"flavor_manager"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"SCS-4V-8-50")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"flavor_node"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"SCS-8V-32-50")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"image"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Ubuntu 22.04")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"manager_version"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"latest")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"network_availability_zone"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"nova")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"number_of_nodes"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"3")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"number_of_volumes"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"3")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"openstack_version"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"2023.1")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"prefix"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"testbed")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"public"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"external")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"refstack"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"false")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"volume_availability_zone"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"nova")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"volume_size_base"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"30")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"volume_size_storage"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"10")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"volume_type"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"__DEFAULT__")),(0,r.kt)("td",{parentName:"tr",align:null})))),(0,r.kt)("h3",{id:"overrides"},"Overrides"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"Name")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"Description")))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"manager_boot_from_image")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"manager_boot_from_volume")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"neutron_availability_zone_hints_network")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"neutron_availability_zone_hints_router")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"neutron_router_enable_snat")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"nodes_boot_from_image")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"nodes_boot_from_volume")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"nodes_use_ephemeral_storage")),(0,r.kt)("td",{parentName:"tr",align:null})))),(0,r.kt)("h3",{id:"customisations"},"Customisations"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"Name")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"Description")))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"access_floatingip")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"access_ipv4")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"access_ipv6")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"default")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"neutron_floatingip")),(0,r.kt)("td",{parentName:"tr",align:null})))),(0,r.kt)("h2",{id:"usage"},"Usage"),(0,r.kt)("h3",{id:"vpn-access"},"VPN access"),(0,r.kt)("p",null,"Copy the ",(0,r.kt)("inlineCode",{parentName:"p"},"/home/dragon/wireguard-client.conf")," file to your workstation. This is necessary\nfor using the web endpoints on your workstation. Rename the wireguard config file to something\nlike ",(0,r.kt)("inlineCode",{parentName:"p"},"testbed.conf"),"."),(0,r.kt)("p",null,"If you want to connect to the OSISM Testbed from multiple clients, change the client IP\naddress in the config file to be different on each client."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"scp dragon@IP_FROM_YOUR_SERVER:/home/dragon/wireguard-client.conf /home/ubuntu/testbed.conf\n")),(0,r.kt)("p",null,"Install wireguard on your workstation, if you have not done this before. For instructions how to do\nit on your workstation, please have a look on the documentation of your used distribution. The\nwireguard documentation you will find ",(0,r.kt)("a",{parentName:"p",href:"https://www.wireguard.com/"},"here"),"."),(0,r.kt)("p",null,"Start the wireguard tunnel."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"wg-quick up /home/ubuntu/testbed.conf\n")),(0,r.kt)("p",null,"If you do not want to use Wireguard you can also work with ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/sshuttle/sshuttle"},"sshuttle"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"make sshuttle ENVIRONMENT=regiocloud\n")),(0,r.kt)("h3",{id:"webinterfaces"},"Webinterfaces"),(0,r.kt)("p",null,"All SSL enabled services within the OSISM Testbed use certs which are signed by the self-signed\n",(0,r.kt)("a",{parentName:"p",href:"https://raw.githubusercontent.com/osism/testbed/main/environments/kolla/certificates/ca/testbed.crt"},"OSISM Testbed CA"),"."),(0,r.kt)("p",null,"If you want to access the services please choose the URL from the following table."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"Name")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"URL")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"Username")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"Password")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"Note")))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ARA"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://ara.testbed.osism.xyz/"},"https://ara.testbed.osism.xyz/")),(0,r.kt)("td",{parentName:"tr",align:null},"ara"),(0,r.kt)("td",{parentName:"tr",align:null},"password"),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Ceph"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://api-int.testbed.osism.xyz:8140"},"https://api-int.testbed.osism.xyz:8140")),(0,r.kt)("td",{parentName:"tr",align:null},"admin"),(0,r.kt)("td",{parentName:"tr",align:null},"password"),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Flower"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://api-int.testbed.osism.xyz:8140"},"https://api-int.testbed.osism.xyz:8140")),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Grafana"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://api-int.testbed.osism.xyz:3000"},"https://api-int.testbed.osism.xyz:3000")),(0,r.kt)("td",{parentName:"tr",align:null},"admin"),(0,r.kt)("td",{parentName:"tr",align:null},"password"),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Homer"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://homer.testbed.osism.xyz"},"https://homer.testbed.osism.xyz")),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Horizon (via Keystone)"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://api.testbed.osism.xyz"},"https://api.testbed.osism.xyz")),(0,r.kt)("td",{parentName:"tr",align:null},"admin"),(0,r.kt)("td",{parentName:"tr",align:null},"password"),(0,r.kt)("td",{parentName:"tr",align:null},"domain: default")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Horizon (via Keystone)"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://api.testbed.osism.xyz"},"https://api.testbed.osism.xyz")),(0,r.kt)("td",{parentName:"tr",align:null},"test"),(0,r.kt)("td",{parentName:"tr",align:null},"test"),(0,r.kt)("td",{parentName:"tr",align:null},"domain: test")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Horizon (via Keycloak)"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://api.testbed.osism.xyz"},"https://api.testbed.osism.xyz")),(0,r.kt)("td",{parentName:"tr",align:null},"alice"),(0,r.kt)("td",{parentName:"tr",align:null},"password"),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Keycloak"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://keycloak.testbed.osism.xyz"},"https://keycloak.testbed.osism.xyz")),(0,r.kt)("td",{parentName:"tr",align:null},"admin"),(0,r.kt)("td",{parentName:"tr",align:null},"password"),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Kibana"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://api.testbed.osism.xyz:5601"},"https://api.testbed.osism.xyz:5601")),(0,r.kt)("td",{parentName:"tr",align:null},"kibana"),(0,r.kt)("td",{parentName:"tr",align:null},"password"),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Netbox"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://netbox.testbed.osism.xyz/"},"https://netbox.testbed.osism.xyz/")),(0,r.kt)("td",{parentName:"tr",align:null},"admin"),(0,r.kt)("td",{parentName:"tr",align:null},"password"),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Netdata"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://testbed-manager.testbed.osism.xyz:19999"},"https://testbed-manager.testbed.osism.xyz:19999")),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Patchman"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://patchman.testbed.osism.xyz/"},"https://patchman.testbed.osism.xyz/")),(0,r.kt)("td",{parentName:"tr",align:null},"patchman"),(0,r.kt)("td",{parentName:"tr",align:null},"password"),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Prometheus"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://api-int.testbed.osism.xyz:9091/"},"https://api-int.testbed.osism.xyz:9091/")),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"phpMyAdmin"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://phpmyadmin.testbed.osism.xyz"},"https://phpmyadmin.testbed.osism.xyz")),(0,r.kt)("td",{parentName:"tr",align:null},"root"),(0,r.kt)("td",{parentName:"tr",align:null},"password"),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"RabbitMQ"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://api-int.testbed.osism.xyz:15672/"},"https://api-int.testbed.osism.xyz:15672/")),(0,r.kt)("td",{parentName:"tr",align:null},"openstack"),(0,r.kt)("td",{parentName:"tr",align:null},"BO6yGAAq9eqA7IKqeBdtAEO7aJuNu4zfbhtnRo8Y"),(0,r.kt)("td",{parentName:"tr",align:null})))),(0,r.kt)("h3",{id:"authentication-with-oidc"},"Authentication with OIDC"),(0,r.kt)("p",null,"Authentication with OpenID Connect (OIDC) is possible via Keycloak, which is automatically configured for the OIDC mechanism."),(0,r.kt)("h4",{id:"openstack-web-dashboard-horizon-login-via-oidc"},"OpenStack web dashboard (Horizon) login via OIDC"),(0,r.kt)("p",null,"For logging in via OIDC, open your browser at OpenStack Dashboard Login Page, select ",(0,r.kt)("strong",{parentName:"p"},"Authenticate via Keycloak"),", after being\nredirected to the Keycloak login page, perform the login with the credentials ",(0,r.kt)("strong",{parentName:"p"},"alice")," and ",(0,r.kt)("strong",{parentName:"p"},"password"),".\nAfter that you will be redirected back to the Horizon dashboard, where you will be logged in with the user ",(0,r.kt)("strong",{parentName:"p"},"alice"),"."),(0,r.kt)("h4",{id:"openstack-web-dashboard-horizon-logout"},"OpenStack web dashboard (Horizon) logout"),(0,r.kt)("p",null,"Keep in mind, that clicking ",(0,r.kt)("strong",{parentName:"p"},"Sign Out")," on the Horizon dashboard currently doesn't revoke your OIDC token, and any consequent\nattempt to ",(0,r.kt)("strong",{parentName:"p"},"Authenticate via Keycloak")," will succeed without providing the credentials."),(0,r.kt)("p",null,"The expiration time of the Single Sign On tokens can be controlled on multiple levels in Keycloak."),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"On realm level under ",(0,r.kt)("em",{parentName:"p"},"Realm Settings")," > ",(0,r.kt)("em",{parentName:"p"},"Tokens"),".\nAssuming the ",(0,r.kt)("em",{parentName:"p"},"keycloak_realm")," ansible variable is the default ",(0,r.kt)("em",{parentName:"p"},"osism"),", and keycloak is listening on\n",(0,r.kt)("a",{parentName:"p",href:"https://keycloak.testbed.osism.xyz"},"keycloak.testbed.osism.xyz"),", then the configuration form is available\n",(0,r.kt)("a",{parentName:"p",href:"https://keycloak.testbed.osism.xyz/auth/admin/master/console/#/realms/osism/token-settings"},"here"),"."),(0,r.kt)("p",{parentName:"li"},"Detailed information is available in the Keycloak Server Administrator Documentation\n",(0,r.kt)("a",{parentName:"p",href:"https://www.keycloak.org/docs/latest/server_admin/#_timeouts"},"Session and Token Timeouts")," section.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"In a realm down on the ",(0,r.kt)("a",{parentName:"p",href:"https://keycloak.testbed.osism.xyz/auth/admin/master/console/#/realms/osism/clients"},"client level"),"\nselect the client (keystone), and under ",(0,r.kt)("em",{parentName:"p"},"Settings")," > ",(0,r.kt)("em",{parentName:"p"},"Advanced Settings"),"."),(0,r.kt)("p",{parentName:"li"},"It is recommended to keep the ",(0,r.kt)("em",{parentName:"p"},"Access Token Lifespan")," on a relatively low value, with the trend of blocking third party\ncookies. For further information see the Keycloak documentation's ",(0,r.kt)("a",{parentName:"p",href:"https://www.keycloak.org/docs/latest/securing_apps/#browsers-with-blocked-third-party-cookies"},"Browsers with Blocked Third-Party Cookies")," section."))),(0,r.kt)("h4",{id:"openstack-cli-operations-with-openid-connect-password"},"OpenStack CLI operations with OpenID Connect password"),(0,r.kt)("p",null,"Using the OpenStack cli is also possible via OIDC, assuming you provisioned the user ",(0,r.kt)("strong",{parentName:"p"},"alice")," with password ",(0,r.kt)("strong",{parentName:"p"},"password"),",\nthen you can perform a simple ",(0,r.kt)("inlineCode",{parentName:"p"},"project list")," operation like this:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"openstack \\\n --os-cacert /etc/ssl/certs/ca-certificates.crt \\\n --os-auth-url https://api.testbed.osism.xyz:5000/v3 \\\n --os-auth-type v3oidcpassword \\\n --os-client-id keystone \\\n --os-client-secret 0056b89c-030f-486b-a6ad-f0fa398fa4ad \\\n --os-username alice \\\n --os-password password \\\n --os-identity-provider keycloak \\\n --os-protocol openid \\\n --os-identity-api-version 3 \\\n --os-discovery-endpoint https://keycloak.testbed.osism.xyz/auth/realms/osism/.well-known/openid-configuration \\\nproject list\n")),(0,r.kt)("h4",{id:"openstack-cli-token-issue-with-openid-connect"},"OpenStack CLI token issue with OpenID Connect"),(0,r.kt)("p",null,"It is also possible to exchange your username/password to a token, for further use with the cli.\nThe ",(0,r.kt)("inlineCode",{parentName:"p"},"token issue")," subcommand returns an SQL table, in which the ",(0,r.kt)("inlineCode",{parentName:"p"},"id")," column's ",(0,r.kt)("inlineCode",{parentName:"p"},"value")," field contains the token:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},'openstack \\\n --os-cacert /etc/ssl/certs/ca-certificates.crt \\\n --os-auth-url https://api.testbed.osism.xyz:5000/v3 \\\n --os-auth-type v3oidcpassword \\\n --os-client-id keystone \\\n --os-client-secret 0056b89c-030f-486b-a6ad-f0fa398fa4ad \\\n --os-username alice \\\n --os-password password \\\n --os-identity-provider keycloak \\\n --os-protocol openid \\\n --os-identity-api-version 3 \\\n --os-discovery-endpoint https://keycloak.testbed.osism.xyz/auth/realms/osism/.well-known/openid-configuration \\\n --os-openid-scope "openid profile email" \\\ntoken issue \\\n -c id\n -f value\n')),(0,r.kt)("p",null,"An example token is like:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"gAAAAABhC98gL8nsQWknro3JWDXWLFCG3CDr3Mi9OIlvVAZMjy2mNgYtlXv_0yAIy-\nnSlLAaLIGhht17-mwf8uclKgRuNVsYLSmgUpB163l89-ch2w2_OFe9zNSQNWf4qfd8\nCl7E7XvvUoFr1N8Gh09vaYLvRvYgCGV05xBUSs76qCHa0qElPUsk56s5ft4ALrSrzD\n4cEQRVb5PXNjywdZk9_gtJziz31A7sD4LPIy82O5N9NryDoDw\n")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"TODO: OpenStack CLI operations with token"),(0,r.kt)("li",{parentName:"ul"},"TODO: OpenStack CLI token revoke")),(0,r.kt)("h2",{id:"advanced-usage"},"Advanced Usage"),(0,r.kt)("h3",{id:"change-versions"},"Change versions"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Go to ",(0,r.kt)("inlineCode",{parentName:"li"},"/opt/configuration")," on ",(0,r.kt)("inlineCode",{parentName:"li"},"testbed-manager")),(0,r.kt)("li",{parentName:"ol"},"Run ",(0,r.kt)("inlineCode",{parentName:"li"},"./scripts/set-openstack-version.sh zed")," to set the OpenStack version to ",(0,r.kt)("inlineCode",{parentName:"li"},"zed")),(0,r.kt)("li",{parentName:"ol"},"Run ",(0,r.kt)("inlineCode",{parentName:"li"},"./scripts/set-ceph-version.sh quincy")," to set the Ceph version to ",(0,r.kt)("inlineCode",{parentName:"li"},"quincy")),(0,r.kt)("li",{parentName:"ol"},"Run ",(0,r.kt)("inlineCode",{parentName:"li"},"osism-update-manager")," to update the manager")),(0,r.kt)("h3",{id:"deploy-services"},"Deploy services"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Script"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"/opt/configuration/scripts/deploy/000-manager-service.sh")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"/opt/configuration/scripts/deploy/001-helper-services.sh")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"/opt/configuration/scripts/deploy/100-ceph-services-basic.sh")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"/opt/configuration/scripts/deploy/200-infrastructure-services-basic.sh")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"/opt/configuration/scripts/deploy/210-infrastructure-services-extended.sh")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"/opt/configuration/scripts/deploy/300-openstack-services-basic.sh")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"/opt/configuration/scripts/deploy/310-openstack-services-extended.sh")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"/opt/configuration/scripts/deploy/320-openstack-services-baremetal.sh")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"/opt/configuration/scripts/deploy/330-openstack-services-additional.sh")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"/opt/configuration/scripts/deploy/400-monitoring-services.sh")),(0,r.kt)("td",{parentName:"tr",align:null})))),(0,r.kt)("h3",{id:"upgrade-services"},"Upgrade services"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Script"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"/opt/configuration/scripts/upgrade/100-ceph-services.sh")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"/opt/configuration/scripts/upgrade/200-infrastructure-services-basic.sh")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"/opt/configuration/scripts/upgrade/300-openstack-services-basic.sh")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"/opt/configuration/scripts/upgrade/310-openstack-services-extended.sh")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"/opt/configuration/scripts/upgrade/320-openstack-services-baremetal.sh")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"/opt/configuration/scripts/upgrade/330-openstack-services-additional.sh")),(0,r.kt)("td",{parentName:"tr",align:null})))),(0,r.kt)("h2",{id:"troubleshooting"},"Troubleshooting"),(0,r.kt)("h3",{id:"unsupported-locale-setting"},"Unsupported locale setting"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"$ make prepare\nansible-playbook -i localhost, ansible/check-local-versions.yml\nERROR: Ansible could not initialize the preferred locale: unsupported locale setting\nmake: *** [prepare] Error 1\n")),(0,r.kt)("p",null,"To solve the problem you have to modify the ",(0,r.kt)("inlineCode",{parentName:"p"},"Makefile"),". Change the 1st line as follows."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"export LC_ALL = en_US.UTF-8\n")),(0,r.kt)("p",null,"To find out the locale used on the system ",(0,r.kt)("inlineCode",{parentName:"p"},"printenv")," can be used."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},'$ printenv | grep -i lang|locale\nLANG="en_US.UTF-8"\nLC_COLLATE="en_US.UTF-8"\nLC_CTYPE="UTF-8"\nLC_MESSAGES="en_US.UTF-8"\nLC_MONETARY="en_US.UTF-8"\nLC_NUMERIC="en_US.UTF-8"\nLC_TIME="en_US.UTF-8"\nLC_ALL=\n')),(0,r.kt)("h3",{id:"yq-no-such-file-or-directory"},"yq: No such file or directory"),(0,r.kt)("p",null,"The following error occurs when yq is not installed."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"make: yq: No such file or directory\n")),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"yq")," must be installed on the system. ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/mikefarah/yq"},"yq")," is a portable\ncommand-line YAML, JSON, XML, CSV, TOML and properties processor."),(0,r.kt)("h2",{id:"notes"},"Notes"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The configuration is intentionally kept quite static. Please create no PRs to make the configuration more flexible/dynamic."),(0,r.kt)("li",{parentName:"ul"},"The OSISM documentation uses hostnames, examples, addresses etc. from OSISM Testbed."),(0,r.kt)("li",{parentName:"ul"},"Even if all components (storage, network, compute, control) are operated on the same nodes, there are separate networks.\nThis is because in larger productive HCI environments, dedicated control nodes and network nodes are usually provided.\nIt is also common to place storage frontend and storage backend on an independent/additional network infrastructure."),(0,r.kt)("li",{parentName:"ul"},"The third volume (",(0,r.kt)("inlineCode",{parentName:"li"},"/dev/sdd"),") is not enabled for Ceph by default. This is to test the scaling of Ceph."),(0,r.kt)("li",{parentName:"ul"},"Ansible errors that have something to do with undefined variables (e.g. ",(0,r.kt)("inlineCode",{parentName:"li"},"AnsibleUndefined"),") are most likely due to cached\nfacts that are no longer valid. The facts can be updated by running ",(0,r.kt)("inlineCode",{parentName:"li"},"osism apply facts"),"."),(0,r.kt)("li",{parentName:"ul"},"The manager is used as pull through cache for Docker images and Ubuntu packages. This reduces the amount of traffic consumed."),(0,r.kt)("li",{parentName:"ul"},"To speed up the Ansible playbooks, ",(0,r.kt)("a",{parentName:"li",href:"https://ara.recordsansible.org"},"ARA")," can be disabled. This\nis done by executing ",(0,r.kt)("inlineCode",{parentName:"li"},"/opt/configuration/scripts/disable-ara.sh"),". Afterwards no more logs are available in the ARA web\ninterface.")),(0,r.kt)("h2",{id:"appendix"},"Appendix"),(0,r.kt)("h3",{id:"supported-releases"},"Supported releases"),(0,r.kt)("p",null,"The following stable Ceph and OpenStack releases are supported."),(0,r.kt)("p",null,"The deployment of Ceph is based on ",(0,r.kt)("a",{parentName:"p",href:"https://docs.ceph.com/ceph-ansible/"},"ceph-ansible"),"."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Ceph Pacific"),(0,r.kt)("li",{parentName:"ul"},"Ceph Quincy (",(0,r.kt)("strong",{parentName:"li"},"default"),")")),(0,r.kt)("p",null,"The deployment of OpenStack is based on ",(0,r.kt)("a",{parentName:"p",href:"https://docs.openstack.org/kolla-ansible/latest/"},"kolla-ansible"),"."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"OpenStack Zed"),(0,r.kt)("li",{parentName:"ul"},"OpenStack 2023.1 (",(0,r.kt)("strong",{parentName:"li"},"default"),")")),(0,r.kt)("h3",{id:"included-services"},"Included services"),(0,r.kt)("p",null,"The following services can currently be used with this testbed without further adjustments."),(0,r.kt)("h4",{id:"infrastructure"},"Infrastructure"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Ceph"),(0,r.kt)("li",{parentName:"ul"},"Fluentd"),(0,r.kt)("li",{parentName:"ul"},"Gnocchi"),(0,r.kt)("li",{parentName:"ul"},"Grafana"),(0,r.kt)("li",{parentName:"ul"},"Haproxy"),(0,r.kt)("li",{parentName:"ul"},"Influxdb"),(0,r.kt)("li",{parentName:"ul"},"Keepalived"),(0,r.kt)("li",{parentName:"ul"},"Keycloak"),(0,r.kt)("li",{parentName:"ul"},"Kubernetes CAPI Management Cluster"),(0,r.kt)("li",{parentName:"ul"},"Mariadb"),(0,r.kt)("li",{parentName:"ul"},"Memcached"),(0,r.kt)("li",{parentName:"ul"},"Netbox"),(0,r.kt)("li",{parentName:"ul"},"Netdata"),(0,r.kt)("li",{parentName:"ul"},"Opensearch"),(0,r.kt)("li",{parentName:"ul"},"Openvswitch"),(0,r.kt)("li",{parentName:"ul"},"Patchman"),(0,r.kt)("li",{parentName:"ul"},"Prometheus exporters"),(0,r.kt)("li",{parentName:"ul"},"Rabbitmq"),(0,r.kt)("li",{parentName:"ul"},"Redis")),(0,r.kt)("h4",{id:"openstack"},"OpenStack"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Barbican"),(0,r.kt)("li",{parentName:"ul"},"Ceilometer"),(0,r.kt)("li",{parentName:"ul"},"Cinder"),(0,r.kt)("li",{parentName:"ul"},"Designate"),(0,r.kt)("li",{parentName:"ul"},"Glance"),(0,r.kt)("li",{parentName:"ul"},"Heat"),(0,r.kt)("li",{parentName:"ul"},"Horizon"),(0,r.kt)("li",{parentName:"ul"},"Ironic"),(0,r.kt)("li",{parentName:"ul"},"Keystone"),(0,r.kt)("li",{parentName:"ul"},"Magnum"),(0,r.kt)("li",{parentName:"ul"},"Manila"),(0,r.kt)("li",{parentName:"ul"},"Neutron"),(0,r.kt)("li",{parentName:"ul"},"Nova (with Libvirt/KVM)"),(0,r.kt)("li",{parentName:"ul"},"Octavia"),(0,r.kt)("li",{parentName:"ul"},"Senlin"),(0,r.kt)("li",{parentName:"ul"},"Skyline")),(0,r.kt)("h3",{id:"makfile-reference"},"Makfile reference"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"Target")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"Description")))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"clean"),(0,r.kt)("td",{parentName:"tr",align:null},"Destroy infrastructure with Terraform.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"create"),(0,r.kt)("td",{parentName:"tr",align:null},"Create required infrastructure with Terraform.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"login"),(0,r.kt)("td",{parentName:"tr",align:null},"Log in on the manager.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"bootstrap"),(0,r.kt)("td",{parentName:"tr",align:null},"Bootstrap everything.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"manager"),(0,r.kt)("td",{parentName:"tr",align:null},"Deploy only the manager service.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"identity"),(0,r.kt)("td",{parentName:"tr",align:null},"Deploy only identity services.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"ceph"),(0,r.kt)("td",{parentName:"tr",align:null},"Deploy only ceph services.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"deploy"),(0,r.kt)("td",{parentName:"tr",align:null},"Deploy everything and then check it.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"prepare"),(0,r.kt)("td",{parentName:"tr",align:null},"Run local preparations.")))),(0,r.kt)("h3",{id:"ci-jobs"},"CI jobs"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://zuul.services.betacloud.xyz/t/osism/builds?project=osism%2Ftestbed&skip=0"},"Results of the daily jobs"))),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"Name")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"Description")))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"testbed-deploy"),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"testbed-deploy-ceph"),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"testbed-deploy-cleura"),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"testbed-deploy-pco"),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"testbed-deploy-stable"),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"testbed-deploy-wavestack"),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"testbed-update-stable"),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"testbed-upgrade"),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"testbed-upgrade-ceph"),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"testbed-upgrade-cleura"),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"testbed-upgrade-pco"),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"testbed-upgrade-stable"),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"testbed-upgrade-wavestack"),(0,r.kt)("td",{parentName:"tr",align:null})))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/bd8a97c5.cbf09d3b.js b/assets/js/bd8a97c5.cbf09d3b.js new file mode 100644 index 0000000000..c41bc1993d --- /dev/null +++ b/assets/js/bd8a97c5.cbf09d3b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2909],{3905:(e,r,t)=>{t.d(r,{Zo:()=>u,kt:()=>g});var n=t(67294);function o(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function i(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function a(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?i(Object(t),!0).forEach((function(r){o(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):i(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}function c(e,r){if(null==e)return{};var t,n,o=function(e,r){if(null==e)return{};var t,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)t=i[n],r.indexOf(t)>=0||(o[t]=e[t]);return o}(e,r);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)t=i[n],r.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var s=n.createContext({}),p=function(e){var r=n.useContext(s),t=r;return e&&(t="function"==typeof e?e(r):a(a({},r),e)),t},u=function(e){var r=p(e.components);return n.createElement(s.Provider,{value:r},e.children)},d="mdxType",l={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},f=n.forwardRef((function(e,r){var t=e.components,o=e.mdxType,i=e.originalType,s=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),d=p(t),f=o,g=d["".concat(s,".").concat(f)]||d[f]||l[f]||i;return t?n.createElement(g,a(a({ref:r},u),{},{components:t})):n.createElement(g,a({ref:r},u))}));function g(e,r){var t=arguments,o=r&&r.mdxType;if("string"==typeof e||o){var i=t.length,a=new Array(i);a[0]=f;var c={};for(var s in r)hasOwnProperty.call(r,s)&&(c[s]=r[s]);c.originalType=e,c[d]="string"==typeof e?e:o,a[1]=c;for(var p=2;p<i;p++)a[p]=t[p];return n.createElement.apply(null,a)}return n.createElement.apply(null,t)}f.displayName="MDXCreateElement"},85245:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>s,contentTitle:()=>a,default:()=>l,frontMatter:()=>i,metadata:()=>c,toc:()=>p});var n=t(87462),o=(t(67294),t(3905));const i={sidebar_label:"Proxy",sidebar_position:99},a="Proxy",c={unversionedId:"iaas/guides/configuration-guide/proxy",id:"iaas/guides/configuration-guide/proxy",title:"Proxy",description:"",source:"@site/docs/02-iaas/guides/configuration-guide/proxy.md",sourceDirName:"02-iaas/guides/configuration-guide",slug:"/iaas/guides/configuration-guide/proxy",permalink:"/docs/iaas/guides/configuration-guide/proxy",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/configuration-guide/proxy.md",tags:[],version:"current",sidebarPosition:99,frontMatter:{sidebar_label:"Proxy",sidebar_position:99},sidebar:"docs",previous:{title:"Keystone",permalink:"/docs/iaas/guides/configuration-guide/openstack/keystone"},next:{title:"Self-signed certificates",permalink:"/docs/iaas/guides/configuration-guide/self-signed-certificates"}},s={},p=[],u={toc:p},d="wrapper";function l(e){let{components:r,...t}=e;return(0,o.kt)(d,(0,n.Z)({},u,t,{components:r,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"proxy"},"Proxy"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},'##########################################################\n# proxy\n\ndocker_configure_proxy: true\ndocker_proxy_http: "http://{{ groups[\'manager\'][0] }}:3128"\ndocker_proxy_https: "{{ docker_proxy_http }}"\n\nproxy_proxies:\n http: "http://{{ groups[\'manager\'][0] }}:3128"\n https: "http://{{ groups[\'manager\'][0] }}:3128"\n')))}l.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/be01f2a0.1174b07a.js b/assets/js/be01f2a0.1174b07a.js new file mode 100644 index 0000000000..37ea80b288 --- /dev/null +++ b/assets/js/be01f2a0.1174b07a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6926],{3905:(e,n,a)=>{a.d(n,{Zo:()=>l,kt:()=>c});var r=a(67294);function i(e,n,a){return n in e?Object.defineProperty(e,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[n]=a,e}function t(e,n){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var n=1;n<arguments.length;n++){var a=null!=arguments[n]?arguments[n]:{};n%2?t(Object(a),!0).forEach((function(n){i(e,n,a[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):t(Object(a)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(a,n))}))}return e}function d(e,n){if(null==e)return{};var a,r,i=function(e,n){if(null==e)return{};var a,r,i={},t=Object.keys(e);for(r=0;r<t.length;r++)a=t[r],n.indexOf(a)>=0||(i[a]=e[a]);return i}(e,n);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);for(r=0;r<t.length;r++)a=t[r],n.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(i[a]=e[a])}return i}var s=r.createContext({}),m=function(e){var n=r.useContext(s),a=n;return e&&(a="function"==typeof e?e(n):o(o({},n),e)),a},l=function(e){var n=m(e.components);return r.createElement(s.Provider,{value:n},e.children)},u="mdxType",_={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},g=r.forwardRef((function(e,n){var a=e.components,i=e.mdxType,t=e.originalType,s=e.parentName,l=d(e,["components","mdxType","originalType","parentName"]),u=m(a),g=i,c=u["".concat(s,".").concat(g)]||u[g]||_[g]||t;return a?r.createElement(c,o(o({ref:n},l),{},{components:a})):r.createElement(c,o({ref:n},l))}));function c(e,n){var a=arguments,i=n&&n.mdxType;if("string"==typeof e||i){var t=a.length,o=new Array(t);o[0]=g;var d={};for(var s in n)hasOwnProperty.call(n,s)&&(d[s]=n[s]);d.originalType=e,d[u]="string"==typeof e?e:i,o[1]=d;for(var m=2;m<t;m++)o[m]=a[m];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}g.displayName="MDXCreateElement"},21801:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>s,contentTitle:()=>o,default:()=>_,frontMatter:()=>t,metadata:()=>d,toc:()=>m});var r=a(87462),i=(a(67294),a(3905));const t={sidebar_label:"Keystone"},o="Keystone",d={unversionedId:"iaas/guides/configuration-guide/openstack/keystone",id:"iaas/guides/configuration-guide/openstack/keystone",title:"Keystone",description:"Domain manager role",source:"@site/docs/02-iaas/guides/configuration-guide/openstack/keystone.md",sourceDirName:"02-iaas/guides/configuration-guide/openstack",slug:"/iaas/guides/configuration-guide/openstack/keystone",permalink:"/docs/iaas/guides/configuration-guide/openstack/keystone",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/configuration-guide/openstack/keystone.md",tags:[],version:"current",frontMatter:{sidebar_label:"Keystone"},sidebar:"docs",previous:{title:"Horizon",permalink:"/docs/iaas/guides/configuration-guide/openstack/horizon"},next:{title:"Proxy",permalink:"/docs/iaas/guides/configuration-guide/proxy"}},s={},m=[{value:"Domain manager role",id:"domain-manager-role",level:2},{value:"OIDC Federation",id:"oidc-federation",level:2}],l={toc:m},u="wrapper";function _(e){let{components:n,...a}=e;return(0,i.kt)(u,(0,r.Z)({},l,a,{components:n,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"keystone"},"Keystone"),(0,i.kt)("h2",{id:"domain-manager-role"},"Domain manager role"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"SCS Standard Track"),(0,i.kt)("th",{parentName:"tr",align:null},"SCS Standard"),(0,i.kt)("th",{parentName:"tr",align:null},"SCS Documentation"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://docs.scs.community/standards/iam/"},"IAM")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://docs.scs.community/standards/iam/scs-0302"},"scs-0302")),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://docs.scs.community/standards/scs-0302-v1-domain-manager-role/"},"Domain Manager configuration for Keystone"))))),(0,i.kt)("p",null,"To configure and use the domain manager role from the SCS project, the\n",(0,i.kt)("inlineCode",{parentName:"p"},"environments/kolla/files/overlays/keystone/policy.yaml")," file is created\nin the configuration repository. The deployment and upgrade of the Keystone\nservice itself is then done as usual."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-yaml",metastring:'title="environments/kolla/files/overlays/keystone/policy.yaml"',title:'"environments/kolla/files/overlays/keystone/policy.yaml"'},'# classify domain managers with a special role\n"is_domain_manager": "role:domain-manager"\n\n# specify a rule that whitelists roles which domain admins are permitted\n# to assign and revoke within their domain\n"is_domain_managed_role": "\'member\':%(target.role.name)s or \'load-balancer_member\':%(target.role.name)s or \'creator\':%(target.role.name)s"\n\n# allow domain admins to retrieve their own domain\n"identity:get_domain": "(rule:is_domain_manager and token.domain.id:%(target.domain.id)s) or rule:admin_required"\n\n# list_domains is needed for GET /v3/domains?name=... requests\n# this is mandatory for things like\n# `create user --domain $DOMAIN_NAME $USER_NAME` to correctly discover\n# domains by name\n"identity:list_domains": "rule:is_domain_manager or rule:admin_required"\n\n# list_roles is needed for GET /v3/roles?name=... requests\n# this is mandatory for things like `role add ... $ROLE_NAME`` to correctly\n# discover roles by name\n"identity:list_roles": "rule:is_domain_manager or rule:admin_required"\n\n# get_role is needed for GET /v3/roles/{role_id} requests\n# this is mandatory for the OpenStack SDK to properly process role assignments\n# which are issued by role id instead of name\n"identity:get_role": "(rule:is_domain_manager and rule:is_domain_managed_role) or rule:admin_required"\n\n# allow domain admins to manage users within their domain\n"identity:list_users": "(rule:is_domain_manager and token.domain.id:%(target.domain_id)s) or rule:admin_required"\n"identity:get_user": "(rule:is_domain_manager and token.domain.id:%(target.user.domain_id)s) or rule:admin_required"\n"identity:create_user": "(rule:is_domain_manager and token.domain.id:%(target.user.domain_id)s) or rule:admin_required"\n"identity:update_user": "(rule:is_domain_manager and token.domain.id:%(target.user.domain_id)s) or rule:admin_required"\n"identity:delete_user": "(rule:is_domain_manager and token.domain.id:%(target.user.domain_id)s) or rule:admin_required"\n\n# allow domain admins to manage projects within their domain\n"identity:list_projects": "(rule:is_domain_manager and token.domain.id:%(target.domain_id)s) or rule:admin_required"\n"identity:get_project": "(rule:is_domain_manager and token.domain.id:%(target.project.domain_id)s) or rule:admin_required"\n"identity:create_project": "(rule:is_domain_manager and token.domain.id:%(target.project.domain_id)s) or rule:admin_required"\n"identity:update_project": "(rule:is_domain_manager and token.domain.id:%(target.project.domain_id)s) or rule:admin_required"\n"identity:delete_project": "(rule:is_domain_manager and token.domain.id:%(target.project.domain_id)s) or rule:admin_required"\n"identity:list_user_projects": "(rule:is_domain_manager and token.domain.id:%(target.user.domain_id)s) or user_id:%(user_id)s or rule:admin_required"\n\n# allow domain managers to manage role assignments within their domain\n# (restricted to specific roles by the \'is_domain_managed_role\' rule)\n#\n# project-level role assignment to user within domain\n"is_domain_user_project_grant": "token.domain.id:%(target.user.domain_id)s and token.domain.id:%(target.project.domain_id)s and rule:is_domain_managed_role"\n# project-level role assignment to group within domain\n"is_domain_group_project_grant": "token.domain.id:%(target.group.domain_id)s and token.domain.id:%(target.project.domain_id)s and rule:is_domain_managed_role"\n# domain-level role assignment to group\n"is_domain_level_group_grant": "token.domain.id:%(target.group.domain_id)s and token.domain.id:%(target.domain.id)s and rule:is_domain_managed_role"\n# domain-level role assignment to user\n"is_domain_level_user_grant": "token.domain.id:%(target.user.domain_id)s and token.domain.id:%(target.domain.id)s and rule:is_domain_managed_role"\n"domain_manager_grant": "rule:is_domain_manager and (rule:is_domain_user_project_grant or rule:is_domain_group_project_grant or rule:is_domain_level_group_grant or rule:is_domain_level_user_grant)"\n"identity:check_grant": "rule:domain_manager_grant or rule:admin_required"\n"identity:list_grants": "rule:domain_manager_grant or rule:admin_required"\n"identity:create_grant": "rule:domain_manager_grant or rule:admin_required"\n"identity:revoke_grant": "rule:domain_manager_grant or rule:admin_required"\n"identity:list_role_assignments": "(rule:is_domain_manager and token.domain.id:%(target.domain_id)s) or rule:admin_required"\n\n# allow domain managers to manage groups within their domain\n"identity:list_groups": "(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s) or rule:admin_required"\n"identity:get_group": "(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s) or rule:admin_required"\n"identity:create_group": "(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s) or rule:admin_required"\n"identity:update_group": "(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s) or rule:admin_required"\n"identity:delete_group": "(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s) or rule:admin_required"\n"identity:list_groups_for_user": "(rule:is_domain_manager and token.domain.id:%(target.user.domain_id)s) or rule:admin_required"\n"identity:list_users_in_group": "(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s) or rule:admin_required"\n"identity:remove_user_from_group": "(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s and token.domain.id:%(target.user.domain_id)s) or rule:admin_required"\n"identity:check_user_in_group": "(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s and token.domain.id:%(target.user.domain_id)s) or rule:admin_required"\n"identity:add_user_to_group": "(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s and token.domain.id:%(target.user.domain_id)s) or rule:admin_required"\n')),(0,i.kt)("p",null,"The role ",(0,i.kt)("inlineCode",{parentName:"p"},"domain-manager")," is created using the OpenStack CLI. Alternatively, the role can\nbe added using Ansible or other tools."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},'$ openstack --os-cloud admin \\\n role create \\\n --or-show \\\n --description "Domain Manager Role" \\\n domain-manager\n+-------------+----------------------------------+\n| Field | Value |\n+-------------+----------------------------------+\n| description | Domain Manager Role |\n| domain_id | None |\n| id | 9b7140bfe628468ab9b86b365f9ac4c2 |\n| name | domain-manager |\n| options | {} |\n+-------------+----------------------------------+\n')),(0,i.kt)("p",null,"A user can then be made a domain manager for a particular domain by assigning this role."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"$ openstack --os-cloud admin \\\n role add \\\n --user test \\\n --domain test \\\n domain-manager\n")),(0,i.kt)("h2",{id:"oidc-federation"},"OIDC Federation"))}_.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/be96733a.27792029.js b/assets/js/be96733a.27792029.js new file mode 100644 index 0000000000..a13123ca71 --- /dev/null +++ b/assets/js/be96733a.27792029.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6271],{3905:(e,a,n)=>{n.d(a,{Zo:()=>d,kt:()=>f});var t=n(67294);function r(e,a,n){return a in e?Object.defineProperty(e,a,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[a]=n,e}function o(e,a){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);a&&(t=t.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),n.push.apply(n,t)}return n}function i(e){for(var a=1;a<arguments.length;a++){var n=null!=arguments[a]?arguments[a]:{};a%2?o(Object(n),!0).forEach((function(a){r(e,a,n[a])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(a){Object.defineProperty(e,a,Object.getOwnPropertyDescriptor(n,a))}))}return e}function s(e,a){if(null==e)return{};var n,t,r=function(e,a){if(null==e)return{};var n,t,r={},o=Object.keys(e);for(t=0;t<o.length;t++)n=o[t],a.indexOf(n)>=0||(r[n]=e[n]);return r}(e,a);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(t=0;t<o.length;t++)n=o[t],a.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=t.createContext({}),p=function(e){var a=t.useContext(l),n=a;return e&&(n="function"==typeof e?e(a):i(i({},a),e)),n},d=function(e){var a=p(e.components);return t.createElement(l.Provider,{value:a},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var a=e.children;return t.createElement(t.Fragment,{},a)}},u=t.forwardRef((function(e,a){var n=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),c=p(n),u=r,f=c["".concat(l,".").concat(u)]||c[u]||m[u]||o;return n?t.createElement(f,i(i({ref:a},d),{},{components:n})):t.createElement(f,i({ref:a},d))}));function f(e,a){var n=arguments,r=a&&a.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=u;var s={};for(var l in a)hasOwnProperty.call(a,l)&&(s[l]=a[l]);s.originalType=e,s[c]="string"==typeof e?e:r,i[1]=s;for(var p=2;p<o;p++)i[p]=n[p];return t.createElement.apply(null,i)}return t.createElement.apply(null,n)}u.displayName="MDXCreateElement"},20700:(e,a,n)=>{n.r(a),n.d(a,{assets:()=>l,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>s,toc:()=>p});var t=n(87462),r=(n(67294),n(3905));const o={sidebar_label:"Flavor Manager",sidebar_position:51},i="Flavor Manager",s={unversionedId:"iaas/guides/operations-guide/openstack/day2-operations/flavor-manager",id:"iaas/guides/operations-guide/openstack/day2-operations/flavor-manager",title:"Flavor Manager",description:"Overview",source:"@site/docs/02-iaas/guides/operations-guide/openstack/day2-operations/flavor-manager.md",sourceDirName:"02-iaas/guides/operations-guide/openstack/day2-operations",slug:"/iaas/guides/operations-guide/openstack/day2-operations/flavor-manager",permalink:"/docs/iaas/guides/operations-guide/openstack/day2-operations/flavor-manager",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/operations-guide/openstack/day2-operations/flavor-manager.md",tags:[],version:"current",sidebarPosition:51,frontMatter:{sidebar_label:"Flavor Manager",sidebar_position:51},sidebar:"docs",previous:{title:"Image Manager",permalink:"/docs/iaas/guides/operations-guide/openstack/day2-operations/image-manager"},next:{title:"Resource Manager",permalink:"/docs/iaas/guides/operations-guide/openstack/day2-operations/resource-manager"}},l={},p=[{value:"Overview",id:"overview",level:2},{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"Definitions",id:"definitions",level:2},{value:"Name parser and generator",id:"name-parser-and-generator",level:2}],d={toc:p},c="wrapper";function m(e){let{components:a,...o}=e;return(0,r.kt)(c,(0,t.Z)({},d,o,{components:a,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"flavor-manager"},"Flavor Manager"),(0,r.kt)("h2",{id:"overview"},"Overview"),(0,r.kt)("p",null,"The OpenStack Flavor Manager manages the creation, modification, and removal of flavors within an OpenStack environment.\nThe OpenStack Flavor Manager operates as a facilitator that orchestrates compute flavors in alignment\nwith the standard ",(0,r.kt)("a",{parentName:"p",href:"https://docs.scs.community/standards/iaas/scs-0100"},"SCS-0100: Flavor Naming"),"\nby utilizing YAML files provided by the SCS project."),(0,r.kt)("h2",{id:"installation"},"Installation"),(0,r.kt)("p",null,"Install the ",(0,r.kt)("inlineCode",{parentName:"p"},"openstack-flavor-manager")," package with pip."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"pip install openstack-flavor-manager\n")),(0,r.kt)("p",null,"Or clone the repository ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/osism/openstack-flavor-manager"},"osism/openstack-flavor-manager"),"\nand use the OpenStack Flavor Manager from source with tox."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"tox -- --help\n")),(0,r.kt)("h2",{id:"usage"},"Usage"),(0,r.kt)("p",null,"There must be a ",(0,r.kt)("inlineCode",{parentName:"p"},"clouds.yml")," and a ",(0,r.kt)("inlineCode",{parentName:"p"},"secure.yml")," file in the directory where the OpenStack Flavor Manager\nwill be executed. The cloud profile to be used can be specified via the optional ",(0,r.kt)("inlineCode",{parentName:"p"},"--cloud")," parameter.\nBy default the cloud profile with the name ",(0,r.kt)("inlineCode",{parentName:"p"},"admin")," is used. It must be possible to create and delete\nflavors with the used cloud credentials."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ openstack-flavor-manager --help\n\n Usage: openstack-flavor-manager [OPTIONS]\n\n\u256d\u2500 Options \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 --name TEXT Name of flavor definitions. [default: scs] \u2502\n\u2502 --debug Enable debug logging. \u2502\n\u2502 --cloud TEXT Cloud name in clouds.yaml. [default: admin] \u2502\n\u2502 --recommended Create recommended flavors. \u2502\n\u2502 --help Show this message and exit. \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n")),(0,r.kt)("p",null,"To create the mandatory flavors by the SCS Flavor Naming Standard, you run:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"$ openstack-flavor-manager\n")),(0,r.kt)("p",null,"To create the recommended flavors by the SCS Flavor Naming Standard, you run:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"$ openstack-flavor-manager --recommended\n")),(0,r.kt)("p",null,"The output should look like this:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"2023-09-20 13:03:14 | INFO | Flavor 'SCS-1V-4' created.\n2023-09-20 13:03:14 | INFO | Flavor 'SCS-2V-8' created.\n2023-09-20 13:03:14 | INFO | Flavor 'SCS-4V-16' created.\n2023-09-20 13:03:14 | INFO | Flavor 'SCS-8V-32' created.\n...\n")),(0,r.kt)("p",null,"All recommended flavors are now be available in your OpenStack environment.\nCheck yourself by running: "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"openstack --os-cloud admin flavor list\n")),(0,r.kt)("h2",{id:"definitions"},"Definitions"),(0,r.kt)("p",null,"There are two flavor definitions available by default. One for\n",(0,r.kt)("a",{parentName:"p",href:"https://raw.githubusercontent.com/SovereignCloudStack/standards/main/Tests/iaas/SCS-Spec.MandatoryFlavors.verbose.yaml"},"SCS"),"\nand one for ",(0,r.kt)("a",{parentName:"p",href:"https://raw.githubusercontent.com/osism/openstack-flavor-manager/main/flavors.yaml"},"OSISM"),".\nEach definition has its own set of mandatory and recommended flavors."),(0,r.kt)("p",null,"To run the OpenStack Flavor Manager with a specific definition, either ",(0,r.kt)("inlineCode",{parentName:"p"},"scs")," or ",(0,r.kt)("inlineCode",{parentName:"p"},"osism"),",\nuse the optional ",(0,r.kt)("inlineCode",{parentName:"p"},"--name")," parameter. By default the ",(0,r.kt)("a",{parentName:"p",href:"https://docs.scs.community/standards/scs-0100-v3-flavor-naming"},"SCS Flavor Naming Standard"),"\ndefinition will be used."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ openstack-flavor-manager --name osism\n")),(0,r.kt)("h2",{id:"name-parser-and-generator"},"Name parser and generator"),(0,r.kt)("p",null,"A generator and parser for flavor names according to the SCS standard is available on\n",(0,r.kt)("a",{parentName:"p",href:"https://flavors.scs.community"},"flavors.scs.community"),"."),(0,r.kt)("p",null,"The flavor name ",(0,r.kt)("inlineCode",{parentName:"p"},"SCS-2V-4-20s")," is inserted in field ",(0,r.kt)("inlineCode",{parentName:"p"},"Flavor name"),":"),(0,r.kt)("img",{src:n(45426).Z,width:"50%"}),(0,r.kt)("p",null,"The flavor ",(0,r.kt)("inlineCode",{parentName:"p"},"SCS-2V-4-20s")," translated is\n",(0,r.kt)("inlineCode",{parentName:"p"},"2 generic x86-64 vCPUs with 4.0 GiB RAM and SSD 20GB root volume"),":"),(0,r.kt)("img",{src:n(72771).Z,width:"50%"}))}m.isMDXComponent=!0},45426:(e,a,n)=>{n.d(a,{Z:()=>t});const t=n.p+"assets/images/flavors-1-bd8d085759b264b3e58020d1390803fd.png"},72771:(e,a,n)=>{n.d(a,{Z:()=>t});const t=n.p+"assets/images/flavors-2-d9a87ab2a63ed62ace4303facc069b8b.png"}}]); \ No newline at end of file diff --git a/assets/js/c0cd111c.82864e7a.js b/assets/js/c0cd111c.82864e7a.js new file mode 100644 index 0000000000..b0437f9aca --- /dev/null +++ b/assets/js/c0cd111c.82864e7a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4234],{3905:(e,r,t)=>{t.d(r,{Zo:()=>p,kt:()=>d});var n=t(67294);function o(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function a(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function i(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?a(Object(t),!0).forEach((function(r){o(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):a(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}function c(e,r){if(null==e)return{};var t,n,o=function(e,r){if(null==e)return{};var t,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)t=a[n],r.indexOf(t)>=0||(o[t]=e[t]);return o}(e,r);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)t=a[n],r.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var s=n.createContext({}),l=function(e){var r=n.useContext(s),t=r;return e&&(t="function"==typeof e?e(r):i(i({},r),e)),t},p=function(e){var r=l(e.components);return n.createElement(s.Provider,{value:r},e.children)},u="mdxType",f={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},v=n.forwardRef((function(e,r){var t=e.components,o=e.mdxType,a=e.originalType,s=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),u=l(t),v=o,d=u["".concat(s,".").concat(v)]||u[v]||f[v]||a;return t?n.createElement(d,i(i({ref:r},p),{},{components:t})):n.createElement(d,i({ref:r},p))}));function d(e,r){var t=arguments,o=r&&r.mdxType;if("string"==typeof e||o){var a=t.length,i=new Array(a);i[0]=v;var c={};for(var s in r)hasOwnProperty.call(r,s)&&(c[s]=r[s]);c.originalType=e,c[u]="string"==typeof e?e:o,i[1]=c;for(var l=2;l<a;l++)i[l]=t[l];return n.createElement.apply(null,i)}return n.createElement.apply(null,t)}v.displayName="MDXCreateElement"},40139:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>s,contentTitle:()=>i,default:()=>f,frontMatter:()=>a,metadata:()=>c,toc:()=>l});var n=t(87462),o=(t(67294),t(3905));const a={},i="Storage",c={unversionedId:"iaas/overview/storage",id:"iaas/overview/storage",title:"Storage",description:"TODO",source:"@site/docs/02-iaas/overview/storage.md",sourceDirName:"02-iaas/overview",slug:"/iaas/overview/storage",permalink:"/docs/iaas/overview/storage",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/overview/storage.md",tags:[],version:"current",frontMatter:{}},s={},l=[],p={toc:l},u="wrapper";function f(e){let{components:r,...t}=e;return(0,o.kt)(u,(0,n.Z)({},p,t,{components:r,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"storage"},"Storage"),(0,o.kt)("p",null,"TODO"))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c2f44c5f.85d26394.js b/assets/js/c2f44c5f.85d26394.js new file mode 100644 index 0000000000..9e831f9d24 --- /dev/null +++ b/assets/js/c2f44c5f.85d26394.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7762],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>f});var r=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},b=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(n),b=o,f=p["".concat(l,".").concat(b)]||p[b]||d[b]||a;return n?r.createElement(f,i(i({ref:t},u),{},{components:n})):r.createElement(f,i({ref:t},u))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=b;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:o,i[1]=s;for(var c=2;c<a;c++)i[c]=n[c];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}b.displayName="MDXCreateElement"},47085:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var r=n(87462),o=(n(67294),n(3905));const a={sidebar_label:"OpenStack",sidebar_position:40},i="OpenStack",s={unversionedId:"iaas/guides/troubleshooting-guide/openstack",id:"iaas/guides/troubleshooting-guide/openstack",title:"OpenStack",description:"Database creation fails",source:"@site/docs/02-iaas/guides/troubleshooting-guide/openstack.md",sourceDirName:"02-iaas/guides/troubleshooting-guide",slug:"/iaas/guides/troubleshooting-guide/openstack",permalink:"/docs/iaas/guides/troubleshooting-guide/openstack",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/troubleshooting-guide/openstack.md",tags:[],version:"current",sidebarPosition:40,frontMatter:{sidebar_label:"OpenStack",sidebar_position:40},sidebar:"docs",previous:{title:"Manager",permalink:"/docs/iaas/guides/troubleshooting-guide/manager"},next:{title:"Guides",permalink:"/docs/iaas/guides/"}},l={},c=[{value:"Database creation fails",id:"database-creation-fails",level:2}],u={toc:c},p="wrapper";function d(e){let{components:t,...n}=e;return(0,o.kt)(p,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"openstack"},"OpenStack"),(0,o.kt)("h2",{id:"database-creation-fails"},"Database creation fails"),(0,o.kt)("p",null,"Problem:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"TASK [keystone : Creating keystone database] ***********************************\nfatal: [testbed-node-0]: FAILED! => changed=false\n action: mysql_db\n msg: 'unable to find /var/lib/ansible/.my.cnf. Exception message: (2003, \"Can''t connect to MySQL server on ''api-int.local'' ([Errno 111] Connection refused)\")'\n")),(0,o.kt)("p",null,"Solution:"),(0,o.kt)("p",null,"Restart the ",(0,o.kt)("inlineCode",{parentName:"p"},"kolla_toolbox")," container. in this case on the node ",(0,o.kt)("inlineCode",{parentName:"p"},"testbed-node-0"),"."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"$ osism console testbed-node-0/\ntestbed-node-0>>> restart kolla_toolbox\nkolla_toolbox\ntestbed-node-0>>>\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c377a04b.fec5be02.js b/assets/js/c377a04b.fec5be02.js new file mode 100644 index 0000000000..4b4b19a181 --- /dev/null +++ b/assets/js/c377a04b.fec5be02.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6971],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>m});var a=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?r(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):r(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n,a,o={},r=Object.keys(e);for(a=0;a<r.length;a++)n=r[a],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a<r.length;a++)n=r[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=a.createContext({}),c=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},d=function(e){var t=c(e.components);return a.createElement(l.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,l=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),u=c(n),h=o,m=u["".concat(l,".").concat(h)]||u[h]||p[h]||r;return n?a.createElement(m,s(s({ref:t},d),{},{components:n})):a.createElement(m,s({ref:t},d))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,s=new Array(r);s[0]=h;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[u]="string"==typeof e?e:o,s[1]=i;for(var c=2;c<r;c++)s[c]=n[c];return a.createElement.apply(null,s)}return a.createElement.apply(null,n)}h.displayName="MDXCreateElement"},21269:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>p,frontMatter:()=>r,metadata:()=>i,toc:()=>c});var a=n(87462),o=(n(67294),n(3905));const r={title:"Introduction",sidebar_position:1},s=void 0,i={unversionedId:"index",id:"index",title:"Introduction",description:"Creative Commons Attribution-ShareAlike 4.0 International",source:"@site/docs/index.md",sourceDirName:".",slug:"/",permalink:"/docs/",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/index.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"Introduction",sidebar_position:1},sidebar:"docs",next:{title:"IaaS Layer",permalink:"/docs/category/iaas-layer"}},l={},c=[{value:"About",id:"about",level:2},{value:"What is SCS? Why should I care?",id:"what-is-scs-why-should-i-care",level:2},{value:"The reference implementation",id:"the-reference-implementation",level:2},{value:"Get it and test it: Testbed",id:"get-it-and-test-it-testbed",level:3},{value:"Existing SCS Clouds",id:"existing-scs-clouds",level:2},{value:"Development of SCS",id:"development-of-scs",level:2},{value:"Releases and Roadmap",id:"releases-and-roadmap",level:2},{value:"Release 0 (2021-07-15)",id:"release-0-2021-07-15",level:3},{value:"Release 1 (2021-09-29)",id:"release-1-2021-09-29",level:3},{value:"Release 2 (2022-03-23)",id:"release-2-2022-03-23",level:3},{value:"Release 3 (2022-09-21)",id:"release-3-2022-09-21",level:3},{value:"Release 4 (2023-03-22)",id:"release-4-2023-03-22",level:3},{value:"Roadmap",id:"roadmap",level:3},{value:"Contribute and Connect",id:"contribute-and-connect",level:2},{value:"Standards, Conformity and Certification",id:"standards-conformity-and-certification",level:2},{value:"Issues and bugs",id:"issues-and-bugs",level:2},{value:"Other resources",id:"other-resources",level:2}],d={toc:c},u="wrapper";function p(e){let{components:t,...n}=e;return(0,o.kt)(u,(0,a.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"http://creativecommons.org/licenses/by-sa/4.0/"},(0,o.kt)("img",{parentName:"a",src:"https://licensebuttons.net/l/by-sa/4.0/88x31.png",alt:"Creative Commons Attribution-ShareAlike 4.0 International"}))),(0,o.kt)("h2",{id:"about"},"About"),(0,o.kt)("p",null,"The Sovereign Cloud Stack combines the best of Cloud Computing in one unified standard.\nSCS is built, backed, and operated by an active open-source community worldwide.\nAs only the sum of different repositories complete the SCS Stack, it is important to have an easy and accessible documentation in one place."),(0,o.kt)("h2",{id:"what-is-scs-why-should-i-care"},"What is SCS? Why should I care?"),(0,o.kt)("p",null,"SCS describes a standard as well as a reference implementation of this standard."),(0,o.kt)("p",null,"Please see our ",(0,o.kt)("a",{parentName:"p",href:"https://scs.community/"},"public web site")," and specifically\nthe ",(0,o.kt)("a",{parentName:"p",href:"https://scs.community/About/"},"About SCS")," page."),(0,o.kt)("h2",{id:"the-reference-implementation"},"The reference implementation"),(0,o.kt)("h3",{id:"get-it-and-test-it-testbed"},"Get it and test it: Testbed"),(0,o.kt)("p",null,"The easiest way to get in touch with SCS is to deploy a SCS cloud virtually."),(0,o.kt)("p",null,"This means that you set up a SCS test installation including all the infrastructure\npieces such as database, message queueing, ceph, monitoring and logging, IAM, the\n",(0,o.kt)("a",{parentName:"p",href:"https://openstack.org/"},"OpenStack")," core services, and (soon) the Container layer\non top of an existing\nIaaS platform. Currently, only OpenStack is supported as IaaS under the SCS cloud\n(so you end up using OpenStack on top of OpenStack \u2014 with nested virtualization\nenabled, this performs decently). There is no fundamental limitation \u2014 just\nnoone has done the porting of the terraform recipes yet to AWS, libvirt,\nVMware, ..."),(0,o.kt)("p",null,"The SCS IaaS reference implementation is based on ",(0,o.kt)("a",{parentName:"p",href:"https://osism.tech/"},"OSISM"),". Read on the\n",(0,o.kt)("a",{parentName:"p",href:"https://docs.osism.de/testbed/"},"OSISM testbed docs")," to learn how to get the\ntestbed running. Please read carefully through the\n",(0,o.kt)("a",{parentName:"p",href:"https://docs.osism.de/testbed/deployment.html"},"deployment")," section of the\nmanual."),(0,o.kt)("p",null,"The ",(0,o.kt)("a",{parentName:"p",href:"https://docs.osism.de/testbed/deployment.html#cloud-access"},"Requirements:Cloud access subsection")," also lists some clouds that we have\nSCS running on and test regularly."),(0,o.kt)("p",null,"You can easily deploy the container layer on top of the testbed (or a production\nSCS cloud of course) checking out the code from\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/k8s-cluster-api-provider/"},"k8s-cluster-api-provider"),"."),(0,o.kt)("h2",{id:"existing-scs-clouds"},"Existing SCS Clouds"),(0,o.kt)("p",null,"A few production clouds are already based on SCS: betacloud and ",(0,o.kt)("a",{parentName:"p",href:"https://www.plusserver.com/en/products/pluscloud-open"},"pluscloud open"),".\nMore will come soon."),(0,o.kt)("p",null,"CityNetwork, Open Telekom Cloud, OVH clouds are also known to support the\ntestbed well. (There are a few caveats with the latter two, but those are\ndocumented and no blockers.) Read above mentioned\n",(0,o.kt)("a",{parentName:"p",href:"https://docs.osism.de/testbed/deployment.html#cloud-access"},"Requirements:Cloud access"),"\nsubsections."),(0,o.kt)("h2",{id:"development-of-scs"},"Development of SCS"),(0,o.kt)("p",null,"The work done in SCS is supposed to be fed back upstream \u2014 into the relevant\nCNCF projects, into OpenStack, into kolla-ansible, into OSISM and others.\nAn OSISM deployment thus will bring you all the SCS greatness in the base\nlayer.\nWhenever possible SCS works directly in the upstream projects. While the SCS\nprojects tracks the efforts across the released in ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/orgs/SovereignCloudStack/projects"},"epics and userstories"),",\nthe work on the code happens upstream - as such these repositories are usually\nnot found in the SCS namespace."),(0,o.kt)("h2",{id:"releases-and-roadmap"},"Releases and Roadmap"),(0,o.kt)("h3",{id:"release-0-2021-07-15"},"Release 0 (2021-07-15)"),(0,o.kt)("p",null,"SCS R0 has been released on 2021-07-15 and bundles the work\naccomplished by the community prior to the full start of the project."),(0,o.kt)("p",null,"See ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/release-notes/blob/34d7ccb8f05b70cbb89f5995f9d10eab2ab8c052/Release0.md"},"Release Notes for R0")," for more information."),(0,o.kt)("h3",{id:"release-1-2021-09-29"},"Release 1 (2021-09-29)"),(0,o.kt)("p",null,"R1 came quickly after R0 and was the first release to ship a production ready k8s stack\n(with k8s cluster API), some identity federation integration and much improved\npreconfiguration for monitoring and logging."),(0,o.kt)("p",null,"See ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/release-notes/blob/34d7ccb8f05b70cbb89f5995f9d10eab2ab8c052/Release1.md"},"Release Notes for R1")," for more information."),(0,o.kt)("h3",{id:"release-2-2022-03-23"},"Release 2 (2022-03-23)"),(0,o.kt)("p",null,"This release delivers vast improvements for bare metal automation\nand the features in the container layers."),(0,o.kt)("p",null,"See ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/release-notes/blob/34d7ccb8f05b70cbb89f5995f9d10eab2ab8c052/Release2.md"},"Release Notes for R2")," for more information."),(0,o.kt)("h3",{id:"release-3-2022-09-21"},"Release 3 (2022-09-21)"),(0,o.kt)("p",null,"Release 3 features user federation, increase in deployment and upgrade\nvelocity by improving automated test coverage as well as bringing disk encryption\nbased on tang from the state of a technical preview to be fully supported."),(0,o.kt)("p",null,"See ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/release-notes/blob/34d7ccb8f05b70cbb89f5995f9d10eab2ab8c052/Release3.md"},"Release Notes for R3")," for more information."),(0,o.kt)("h3",{id:"release-4-2023-03-22"},"Release 4 (2023-03-22)"),(0,o.kt)("p",null,"The implemented open source components have been updated to the latest stable versions.\nAmong others, this includes OpenStack Zed, Kubernetes Cluster API 1.3.x, Cluster API Provider\nfor OpenStack 0.7.x, Kubernetes 1.26.x, and Ubuntu 22.04 LTS."),(0,o.kt)("p",null,"See ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/release-notes/blob/34d7ccb8f05b70cbb89f5995f9d10eab2ab8c052/Release4.md"},"Release Notes for R4")," for more information."),(0,o.kt)("h3",{id:"roadmap"},"Roadmap"),(0,o.kt)("p",null,"We have a 6 month release cadence \u2014 R4 will follow in March 2023.\nUntil then, we will provide bugfixes and security fixes for R3."),(0,o.kt)("p",null,"We do work towards a model where our partners can actually follow our main\ndevelopment branches \u2014 right now, our CI needs a bit more coverage though\nto make this safe."),(0,o.kt)("h2",{id:"contribute-and-connect"},"Contribute and Connect"),(0,o.kt)("p",null,"Please see the ",(0,o.kt)("a",{parentName:"p",href:"https://docs.scs.community/community"},"SCS contributor guide"),"."),(0,o.kt)("h2",{id:"standards-conformity-and-certification"},"Standards, Conformity and Certification"),(0,o.kt)("p",null,"We intend to work on a conformity test suite."),(0,o.kt)("p",null,"Right now, we are basically relying on upstream tests --\n",(0,o.kt)("a",{parentName:"p",href:"https://refstack.openstack.org/"},"RefStack")," (to perform\nthe ",(0,o.kt)("a",{parentName:"p",href:"https://refstack.openstack.org/#/guidelines"},"OpenStack trademark certification"),"\ntests formerly known as DefCore) and the Kubernetes CNCF conformance tests run through\n",(0,o.kt)("a",{parentName:"p",href:"https://sonobuoy.io/"},"sonobuoy"),"."),(0,o.kt)("p",null,"We have specific ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/tree/main/Standards"},"standards")," aligned within the SCS community\n(and have also sought feedback from the broader Gaia-X and OpenStack communities)."),(0,o.kt)("p",null,"Beyond this, we have a ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Drafts/SCS-Spec.md"},"draft document")," that captures our\nview on how SCS compatible environments should look like. This one has not yet\nseen sufficient review to be eligible for standardization. However, we appreciate\nfeedback (raise issues and PRs or start discussions)."),(0,o.kt)("h2",{id:"issues-and-bugs"},"Issues and bugs"),(0,o.kt)("p",null,"Please raise issues on github. If you can identify the affected component,\nraise the issue against the relevant repository in the SovereignCloudStack\nor OSISM space. Otherwise you can use\nthe ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/issues"},"issues repository"),".\nObviously we appreciate PRs even more than issues;\nplease don't forget to sign off your contributions (see\n",(0,o.kt)("a",{parentName:"p",href:"https://docs.scs.community/community"},"contributor guide")," )."),(0,o.kt)("p",null,"When reporting bugs, it is very useful to include some standard information\ntypically needed to analyze:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"What state of software (SCS) were you testing? What version numbers ... ?"),(0,o.kt)("li",{parentName:"ul"},"How does your environment look like (hardware, operating systems, etc.)?"),(0,o.kt)("li",{parentName:"ul"},"What did you do?"),(0,o.kt)("li",{parentName:"ul"},"What did you expect? What happened instead?"),(0,o.kt)("li",{parentName:"ul"},"Have you done this successfully before? What changed?"),(0,o.kt)("li",{parentName:"ul"},"Can this be reproduced? Occasionally? Reliably? How?"),(0,o.kt)("li",{parentName:"ul"},"Any analysis you have done? Experiments and their results? Log files?")),(0,o.kt)("h2",{id:"other-resources"},"Other resources"),(0,o.kt)("p",null,"Please check our main ",(0,o.kt)("a",{parentName:"p",href:"https://scs.community/"},"web page"),".\nIf you are an onboarded SCS community member, find here a link to our\n",(0,o.kt)("a",{parentName:"p",href:"https://scs.sovereignit.de/"},"nextcloud")," (login required)."),(0,o.kt)("p",null,"Our community interacts through our ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/sovereignCloudStack/"},"github organization"),",\non ",(0,o.kt)("a",{parentName:"p",href:"https://scs.sovereignit.de/mailman3/postorius/lists/"},"mailing lists")," as well as\nchats ",(0,o.kt)("a",{parentName:"p",href:"https://matrix.to/#/!TiDqlLmEUaXqTemaLc:matrix.org?via=matrix.org"},"matrix.org:SCS"),"."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c490e74d.32f50109.js b/assets/js/c490e74d.32f50109.js new file mode 100644 index 0000000000..cf15398dc9 --- /dev/null +++ b/assets/js/c490e74d.32f50109.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1265],{34457:s=>{s.exports=JSON.parse('{"title":"SCS-0400","slug":"standards/scs-0400","permalink":"/standards/standards/scs-0400","navigation":{"previous":{"title":"Naming for domains/groups/roles/project when onboarding new customers","permalink":"/standards/scs-0301-v1-naming-conventions"},"next":{"title":"Status Page create decision","permalink":"/standards/scs-0400-v1-status-page-create-decision"}}}')}}]); \ No newline at end of file diff --git a/assets/js/c5533f5e.ff101166.js b/assets/js/c5533f5e.ff101166.js new file mode 100644 index 0000000000..c094fb9f22 --- /dev/null +++ b/assets/js/c5533f5e.ff101166.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[969],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>f});var n=r(67294);function s(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){s(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function o(e,t){if(null==e)return{};var r,n,s=function(e,t){if(null==e)return{};var r,n,s={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(s[r]=e[r]);return s}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(s[r]=e[r])}return s}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,s=e.mdxType,a=e.originalType,l=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),p=c(r),m=s,f=p["".concat(l,".").concat(m)]||p[m]||d[m]||a;return r?n.createElement(f,i(i({ref:t},u),{},{components:r})):n.createElement(f,i({ref:t},u))}));function f(e,t){var r=arguments,s=t&&t.mdxType;if("string"==typeof e||s){var a=r.length,i=new Array(a);i[0]=m;var o={};for(var l in t)hasOwnProperty.call(t,l)&&(o[l]=t[l]);o.originalType=e,o[p]="string"==typeof e?e:s,i[1]=o;for(var c=2;c<a;c++)i[c]=r[c];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},58935:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>o,toc:()=>c});var n=r(87462),s=(r(67294),r(3905));const a={title:"SCS K8S Version Policy for new Kubernetes versions",type:"Standard",status:"Stable",stabilized_at:new Date("2023-02-07T00:00:00.000Z"),track:"KaaS"},i=void 0,o={unversionedId:"scs-0210-v1-k8s-new-version-policy",id:"scs-0210-v1-k8s-new-version-policy",title:"SCS K8S Version Policy for new Kubernetes versions",description:"Introduction",source:"@site/standards/scs-0210-v1-k8s-new-version-policy.md",sourceDirName:".",slug:"/scs-0210-v1-k8s-new-version-policy",permalink:"/standards/scs-0210-v1-k8s-new-version-policy",draft:!1,tags:[],version:"current",frontMatter:{title:"SCS K8S Version Policy for new Kubernetes versions",type:"Standard",status:"Stable",stabilized_at:"2023-02-07T00:00:00.000Z",track:"KaaS"},sidebar:"standards",previous:{title:"SCS-0210: k8s New Version Policy",permalink:"/standards/kaas/scs-0210"},next:{title:"SCS-0211: KaaS Default Storage Class",permalink:"/standards/kaas/scs-0211"}},l={},c=[{value:"Introduction",id:"introduction",level:2},{value:"Motivation",id:"motivation",level:2},{value:"Decision",id:"decision",level:2},{value:"Related Documents",id:"related-documents",level:2},{value:"Conformance Tests",id:"conformance-tests",level:2}],u={toc:c},p="wrapper";function d(e){let{components:t,...r}=e;return(0,s.kt)(p,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,s.kt)("h2",{id:"introduction"},"Introduction"),(0,s.kt)("p",null,"Here we will describe how fast providers need to keep up with the upstream Kubernetes version."),(0,s.kt)("p",null,"To create a informed decision we summarize here the Kubernetes rules regarding versioning at the time of writing (2023-01-16):"),(0,s.kt)("p",null,"Kubernetes usually provides about ",(0,s.kt)("strong",{parentName:"p"},"3 minor")," releases per year.\n",(0,s.kt)("a",{parentName:"p",href:"https://kubernetes.io/releases/release/#the-release-cycle"},"Kubernetes Release Cycle")),(0,s.kt)("p",null,"Patch release cadence is typically monthly. However, the first patches after the first minor release usually arrive 1-2 weeks after the first minor release.\n",(0,s.kt)("a",{parentName:"p",href:"https://kubernetes.io/releases/patch-releases/#cadence"},"Patch Release Cadence")),(0,s.kt)("p",null,"In general the latest 3 minor versions are maintained by the Kubernetes project.\nEvery release will be maintained for about 14 months.\nThe first 12 months are the standard support period.\nThe remaining 2 months are only for:"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"CVEs (under the advisement of the Security Response Committee)"),(0,s.kt)("li",{parentName:"ul"},"dependency issues (including base image updates)"),(0,s.kt)("li",{parentName:"ul"},"critical core component issues")),(0,s.kt)("p",null,(0,s.kt)("a",{parentName:"p",href:"https://kubernetes.io/releases/patch-releases/#support-period"},"Kubernetes Support Period")),(0,s.kt)("h2",{id:"motivation"},"Motivation"),(0,s.kt)("p",null,"Kubernetes is a fast paced project.\nWe want to achieve that providers keep up to date with upstream and do not fall behind Kubernetes releases.\nThis ensures that users are able to upgrade their clusters to address security issues, bug fixes and new features when using SCS compliant clusters in regards of Kubernetes.\nHowever, providers should have reasonable time to implement the new Kubernetes versions and test them."),(0,s.kt)("h2",{id:"decision"},"Decision"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"Must provide latest minor version no later than 4 months after release"),(0,s.kt)("li",{parentName:"ul"},"Must provide latest patch version no later than a week after release"),(0,s.kt)("li",{parentName:"ul"},"Should be faster for critical CVEs (CVSS >= 8)"),(0,s.kt)("li",{parentName:"ul"},"Should be tested")),(0,s.kt)("h2",{id:"related-documents"},"Related Documents"),(0,s.kt)("p",null,"All important documents regarding versioning, releases, etc. for the official Kubernetes project can be found here: ",(0,s.kt)("a",{parentName:"p",href:"https://kubernetes.io/releases/"},"Kubernetes Releases")),(0,s.kt)("h2",{id:"conformance-tests"},"Conformance Tests"),(0,s.kt)("p",null,"The conformance test is written in the 'k8s-version-recency-check.py' script. The script requires the path to a valid\nkubeconfig file, which should describe the k8s cluster under test. This can either be done by creating a config from\nthe also provided 'config.yaml.template' or by calling the test script with its cli arguments."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c75320ff.8107d9f1.js b/assets/js/c75320ff.8107d9f1.js new file mode 100644 index 0000000000..a3f3a6d099 --- /dev/null +++ b/assets/js/c75320ff.8107d9f1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2272],{3905:(e,r,n)=>{n.d(r,{Zo:()=>g,kt:()=>m});var t=n(67294);function a(e,r,n){return r in e?Object.defineProperty(e,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[r]=n,e}function o(e,r){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);r&&(t=t.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),n.push.apply(n,t)}return n}function i(e){for(var r=1;r<arguments.length;r++){var n=null!=arguments[r]?arguments[r]:{};r%2?o(Object(n),!0).forEach((function(r){a(e,r,n[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(n,r))}))}return e}function p(e,r){if(null==e)return{};var n,t,a=function(e,r){if(null==e)return{};var n,t,a={},o=Object.keys(e);for(t=0;t<o.length;t++)n=o[t],r.indexOf(n)>=0||(a[n]=e[n]);return a}(e,r);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(t=0;t<o.length;t++)n=o[t],r.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=t.createContext({}),u=function(e){var r=t.useContext(s),n=r;return e&&(n="function"==typeof e?e(r):i(i({},r),e)),n},g=function(e){var r=u(e.components);return t.createElement(s.Provider,{value:r},e.children)},l="mdxType",c={inlineCode:"code",wrapper:function(e){var r=e.children;return t.createElement(t.Fragment,{},r)}},d=t.forwardRef((function(e,r){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,g=p(e,["components","mdxType","originalType","parentName"]),l=u(n),d=a,m=l["".concat(s,".").concat(d)]||l[d]||c[d]||o;return n?t.createElement(m,i(i({ref:r},g),{},{components:n})):t.createElement(m,i({ref:r},g))}));function m(e,r){var n=arguments,a=r&&r.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=d;var p={};for(var s in r)hasOwnProperty.call(r,s)&&(p[s]=r[s]);p.originalType=e,p[l]="string"==typeof e?e:a,i[1]=p;for(var u=2;u<o;u++)i[u]=n[u];return t.createElement.apply(null,i)}return t.createElement.apply(null,n)}d.displayName="MDXCreateElement"},55345:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>s,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>p,toc:()=>u});var t=n(87462),a=(n(67294),n(3905));const o={sidebar_label:"Logging & Monitoring",sidebar_position:40},i="Logging & Monitoring",p={unversionedId:"iaas/guides/upgrade-guide/logging-monitoring",id:"iaas/guides/upgrade-guide/logging-monitoring",title:"Logging & Monitoring",description:"OpenSearch",source:"@site/docs/02-iaas/guides/upgrade-guide/logging-monitoring.md",sourceDirName:"02-iaas/guides/upgrade-guide",slug:"/iaas/guides/upgrade-guide/logging-monitoring",permalink:"/docs/iaas/guides/upgrade-guide/logging-monitoring",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/upgrade-guide/logging-monitoring.md",tags:[],version:"current",sidebarPosition:40,frontMatter:{sidebar_label:"Logging & Monitoring",sidebar_position:40},sidebar:"docs",previous:{title:"Infrastructure",permalink:"/docs/iaas/guides/upgrade-guide/infrastructure"},next:{title:"OpenStack",permalink:"/docs/iaas/guides/upgrade-guide/openstack"}},s={},u=[{value:"OpenSearch",id:"opensearch",level:2},{value:"Prometheus",id:"prometheus",level:2},{value:"Grafana",id:"grafana",level:2}],g={toc:u},l="wrapper";function c(e){let{components:r,...n}=e;return(0,a.kt)(l,(0,t.Z)({},g,n,{components:r,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"logging--monitoring"},"Logging & Monitoring"),(0,a.kt)("h2",{id:"opensearch"},"OpenSearch"),(0,a.kt)("p",null,"OpenSearch dashboards is also upgraded with the ",(0,a.kt)("inlineCode",{parentName:"p"},"opensearch")," role."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"osism apply -a pull opensearch\nosism apply -a upgrade opensearch\n")),(0,a.kt)("h2",{id:"prometheus"},"Prometheus"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"osism apply -a pull prometheus\nosism apply prometheus\n")),(0,a.kt)("h2",{id:"grafana"},"Grafana"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"osism apply -a pull grafana\nosism apply -a upgrade grafana\n")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ccc49370.fb6007ce.js b/assets/js/ccc49370.fb6007ce.js new file mode 100644 index 0000000000..1a2ddd4c81 --- /dev/null +++ b/assets/js/ccc49370.fb6007ce.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6103],{65203:(e,t,n)=>{n.r(t),n.d(t,{default:()=>h});var a=n(67294),l=n(86010),o=n(1944),r=n(35281),i=n(9460),c=n(39058),s=n(30390),m=n(87462),d=n(95999),u=n(32244);function g(e){const{nextItem:t,prevItem:n}=e;return a.createElement("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,d.I)({id:"theme.blog.post.paginator.navAriaLabel",message:"Blog post page navigation",description:"The ARIA label for the blog posts pagination"})},n&&a.createElement(u.Z,(0,m.Z)({},n,{subLabel:a.createElement(d.Z,{id:"theme.blog.post.paginator.newerPost",description:"The blog post button label to navigate to the newer/previous post"},"Newer Post")})),t&&a.createElement(u.Z,(0,m.Z)({},t,{subLabel:a.createElement(d.Z,{id:"theme.blog.post.paginator.olderPost",description:"The blog post button label to navigate to the older/next post"},"Older Post"),isNext:!0})))}function f(){const{assets:e,metadata:t}=(0,i.C)(),{title:n,description:l,date:r,tags:c,authors:s,frontMatter:m}=t,{keywords:d}=m,u=e.image??m.image;return a.createElement(o.d,{title:n,description:l,keywords:d,image:u},a.createElement("meta",{property:"og:type",content:"article"}),a.createElement("meta",{property:"article:published_time",content:r}),s.some((e=>e.url))&&a.createElement("meta",{property:"article:author",content:s.map((e=>e.url)).filter(Boolean).join(",")}),c.length>0&&a.createElement("meta",{property:"article:tag",content:c.map((e=>e.label)).join(",")}))}var v=n(39407);function p(e){let{sidebar:t,children:n}=e;const{metadata:l,toc:o}=(0,i.C)(),{nextItem:r,prevItem:m,frontMatter:d}=l,{hide_table_of_contents:u,toc_min_heading_level:f,toc_max_heading_level:p}=d;return a.createElement(c.Z,{sidebar:t,toc:!u&&o.length>0?a.createElement(v.Z,{toc:o,minHeadingLevel:f,maxHeadingLevel:p}):void 0},a.createElement(s.Z,null,n),(r||m)&&a.createElement(g,{nextItem:r,prevItem:m}))}function h(e){const t=e.content;return a.createElement(i.n,{content:e.content,isBlogPostPage:!0},a.createElement(o.FG,{className:(0,l.Z)(r.k.wrapper.blogPages,r.k.page.blogPostPage)},a.createElement(f,null),a.createElement(p,{sidebar:e.sidebar},a.createElement(t,null))))}},39407:(e,t,n)=>{n.d(t,{Z:()=>m});var a=n(87462),l=n(67294),o=n(86010),r=n(93743);const i={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"},c="table-of-contents__link toc-highlight",s="table-of-contents__link--active";function m(e){let{className:t,...n}=e;return l.createElement("div",{className:(0,o.Z)(i.tableOfContents,"thin-scrollbar",t)},l.createElement(r.Z,(0,a.Z)({},n,{linkClassName:c,linkActiveClassName:s})))}},93743:(e,t,n)=>{n.d(t,{Z:()=>f});var a=n(87462),l=n(67294),o=n(86668);function r(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const a=n.slice(2,e.level);e.parentIndex=Math.max(...a),n[e.level]=t}));const a=[];return t.forEach((e=>{const{parentIndex:n,...l}=e;n>=0?t[n].children.push(l):a.push(l)})),a}function i(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return t.flatMap((e=>{const t=i({toc:e.children,minHeadingLevel:n,maxHeadingLevel:a});return function(e){return e.level>=n&&e.level<=a}(e)?[{...e,children:t}]:t}))}function c(e){const t=e.getBoundingClientRect();return t.top===t.bottom?c(e.parentNode):t}function s(e,t){let{anchorTopOffset:n}=t;const a=e.find((e=>c(e).top>=n));if(a){return function(e){return e.top>0&&e.bottom<window.innerHeight/2}(c(a))?a:e[e.indexOf(a)-1]??null}return e[e.length-1]??null}function m(){const e=(0,l.useRef)(0),{navbar:{hideOnScroll:t}}=(0,o.L)();return(0,l.useEffect)((()=>{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function d(e){const t=(0,l.useRef)(void 0),n=m();(0,l.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:a,linkActiveClassName:l,minHeadingLevel:o,maxHeadingLevel:r}=e;function i(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(a),i=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const a=[];for(let l=t;l<=n;l+=1)a.push(`h${l}.anchor`);return Array.from(document.querySelectorAll(a.join()))}({minHeadingLevel:o,maxHeadingLevel:r}),c=s(i,{anchorTopOffset:n.current}),m=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,n){n?(t.current&&t.current!==e&&t.current.classList.remove(l),e.classList.add(l),t.current=e):e.classList.remove(l)}(e,e===m)}))}return document.addEventListener("scroll",i),document.addEventListener("resize",i),i(),()=>{document.removeEventListener("scroll",i),document.removeEventListener("resize",i)}}),[e,n])}function u(e){let{toc:t,className:n,linkClassName:a,isChild:o}=e;return t.length?l.createElement("ul",{className:o?void 0:n},t.map((e=>l.createElement("li",{key:e.id},l.createElement("a",{href:`#${e.id}`,className:a??void 0,dangerouslySetInnerHTML:{__html:e.value}}),l.createElement(u,{isChild:!0,toc:e.children,className:n,linkClassName:a}))))):null}const g=l.memo(u);function f(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:c="table-of-contents__link",linkActiveClassName:s,minHeadingLevel:m,maxHeadingLevel:u,...f}=e;const v=(0,o.L)(),p=m??v.tableOfContents.minHeadingLevel,h=u??v.tableOfContents.maxHeadingLevel,b=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return(0,l.useMemo)((()=>i({toc:r(t),minHeadingLevel:n,maxHeadingLevel:a})),[t,n,a])}({toc:t,minHeadingLevel:p,maxHeadingLevel:h});return d((0,l.useMemo)((()=>{if(c&&s)return{linkClassName:c,linkActiveClassName:s,minHeadingLevel:p,maxHeadingLevel:h}}),[c,s,p,h])),l.createElement(g,(0,a.Z)({toc:b,className:n,linkClassName:c},f))}}}]); \ No newline at end of file diff --git a/assets/js/cd0ad4f0.5060300f.js b/assets/js/cd0ad4f0.5060300f.js new file mode 100644 index 0000000000..5cba67547c --- /dev/null +++ b/assets/js/cd0ad4f0.5060300f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4166],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>g});var r=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function c(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=r.createContext({}),l=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},p=function(e){var t=l(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,s=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),u=l(n),d=o,g=u["".concat(s,".").concat(d)]||u[d]||f[d]||i;return n?r.createElement(g,a(a({ref:t},p),{},{components:n})):r.createElement(g,a({ref:t},p))}));function g(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,a=new Array(i);a[0]=d;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c[u]="string"==typeof e?e:o,a[1]=c;for(var l=2;l<i;l++)a[l]=n[l];return r.createElement.apply(null,a)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},67532:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>f,frontMatter:()=>i,metadata:()=>c,toc:()=>l});var r=n(87462),o=(n(67294),n(3905));const i={sidebar:3},a="Containerization",c={unversionedId:"getting-started/containerization",id:"getting-started/containerization",title:"Containerization",description:"TODO",source:"@site/docs/01-getting-started/containerization.md",sourceDirName:"01-getting-started",slug:"/getting-started/containerization",permalink:"/docs/getting-started/containerization",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/01-getting-started/containerization.md",tags:[],version:"current",frontMatter:{sidebar:3}},s={},l=[],p={toc:l},u="wrapper";function f(e){let{components:t,...n}=e;return(0,o.kt)(u,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"containerization"},"Containerization"),(0,o.kt)("p",null,"TODO"))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/cd4fb20e.cf9156e9.js b/assets/js/cd4fb20e.cf9156e9.js new file mode 100644 index 0000000000..dce0391c90 --- /dev/null +++ b/assets/js/cd4fb20e.cf9156e9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4245],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>k});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function o(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},i=Object.keys(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=n.createContext({}),p=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},d=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,s=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),m=p(a),h=r,k=m["".concat(s,".").concat(h)]||m[h]||u[h]||i;return a?n.createElement(k,l(l({ref:t},d),{},{components:a})):n.createElement(k,l({ref:t},d))}));function k(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,l=new Array(i);l[0]=h;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[m]="string"==typeof e?e:r,l[1]=o;for(var p=2;p<i;p++)l[p]=a[p];return n.createElement.apply(null,l)}return n.createElement.apply(null,a)}h.displayName="MDXCreateElement"},78872:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>u,frontMatter:()=>i,metadata:()=>o,toc:()=>p});var n=a(87462),r=(a(67294),a(3905));const i={title:"SCS Flavor Naming Standard",type:"Standard",status:"Draft",track:"IaaS",replaces:"scs-0100-v1-flavor-naming.md"},l=void 0,o={unversionedId:"scs-0100-v2-flavor-naming",id:"scs-0100-v2-flavor-naming",title:"SCS Flavor Naming Standard",description:"Introduction",source:"@site/standards/scs-0100-v2-flavor-naming.md",sourceDirName:".",slug:"/scs-0100-v2-flavor-naming",permalink:"/standards/scs-0100-v2-flavor-naming",draft:!1,tags:[],version:"current",frontMatter:{title:"SCS Flavor Naming Standard",type:"Standard",status:"Draft",track:"IaaS",replaces:"scs-0100-v1-flavor-naming.md"},sidebar:"standards",previous:{title:"SCS Flavor Naming Standard",permalink:"/standards/scs-0100-v1-flavor-naming"},next:{title:"SCS Flavor Naming Standard",permalink:"/standards/scs-0100-v3-flavor-naming"}},s={},p=[{value:"Introduction",id:"introduction",level:2},{value:"Motivation",id:"motivation",level:2},{value:"Design Considerations",id:"design-considerations",level:2},{value:"Type of information included",id:"type-of-information-included",level:3},{value:"Complete Proposal for systematic flavor naming",id:"complete-proposal-for-systematic-flavor-naming",level:2},{value:"Proposal Details",id:"proposal-details",level:2},{value:"REQUIRED CPU Suffixes",id:"required-cpu-suffixes",level:3},{value:"Baseline",id:"baseline",level:4},{value:"Higher oversubscription",id:"higher-oversubscription",level:4},{value:"Insufficient microcode",id:"insufficient-microcode",level:4},{value:"Examples",id:"examples",level:4},{value:"REQUIRED Memory",id:"required-memory",level:3},{value:"Baseline",id:"baseline-1",level:4},{value:"No ECC",id:"no-ecc",level:4},{value:"Enabled Oversubscription",id:"enabled-oversubscription",level:4},{value:"Examples",id:"examples-1",level:4},{value:"OPTIONAL Disk sizes and types",id:"optional-disk-sizes-and-types",level:3},{value:"Baseline",id:"baseline-2",level:4},{value:"Multi-provisioned Disk",id:"multi-provisioned-disk",level:4},{value:"Examples",id:"examples-2",level:4},{value:"Standard SCS flavors",id:"standard-scs-flavors",level:2},{value:"Naming policy compliance",id:"naming-policy-compliance",level:2},{value:"Validation",id:"validation",level:2},{value:"Operational tooling",id:"operational-tooling",level:2},{value:"Extensions",id:"extensions",level:2},{value:"OPTIONAL Hypervisor",id:"optional-hypervisor",level:3},{value:"Examples",id:"examples-3",level:4},{value:"OPTIONAL Hardware virtualization / Nested virtualization",id:"optional-hardware-virtualization--nested-virtualization",level:3},{value:"Examples",id:"examples-4",level:4},{value:"OPTIONAL CPU Architecture Details",id:"optional-cpu-architecture-details",level:3},{value:"Generation and Vendor",id:"generation-and-vendor",level:4},{value:"Frequency Suffixes",id:"frequency-suffixes",level:4},{value:"Examples",id:"examples-5",level:4},{value:"OPTIONAL GPU support",id:"optional-gpu-support",level:3},{value:"OPTIONAL Infiniband",id:"optional-infiniband",level:3},{value:"Naming options advice",id:"naming-options-advice",level:3},{value:"Proposal Examples",id:"proposal-examples",level:2},{value:"Previous standard versions",id:"previous-standard-versions",level:2},{value:"Beyond SCS",id:"beyond-scs",level:2}],d={toc:p},m="wrapper";function u(e){let{components:t,...a}=e;return(0,r.kt)(m,(0,n.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"introduction"},"Introduction"),(0,r.kt)("p",null,"This is the standard v2.1 for SCS Release 4.\nNote that we intend to only extend it (so it's always backwards compatible),\nbut try to avoid changing in incompatible ways.\n(See at the end for the v1 to v2 transition where we have not met that\ngoal, but at least managed to have a 1:1 relationship between v1 and v2 names.)"),(0,r.kt)("h2",{id:"motivation"},"Motivation"),(0,r.kt)("p",null,"In OpenStack environments there is a need to define different flavors for instances.\nThe flavors are pre-defined by the operator, the customer can not change these.\nOpenStack providers thus typically offer a large selection of flavors."),(0,r.kt)("p",null,"While flavors can be discovered (",(0,r.kt)("inlineCode",{parentName:"p"},"openstack flavor list"),"), it is helpful for users (DevOps teams),\nto have"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"A naming scheme that is used across all SCS flavors, so flavor names have the same meaning everywhere."),(0,r.kt)("li",{parentName:"ul"},"Have a guaranteed set of flavors available on all SCS clouds, so these do not need to be discovered.")),(0,r.kt)("p",null,"While not all details will be encoded in the name, the key features should be obvious:\nNumber of vCPUs, RAM, Root Disk.\nExtra features are important as well: There will be flavors with GPU support, fast disks for databases,\nmemory-heavy applications, and other useful aspects of an instance."),(0,r.kt)("p",null,"It may also be important to make the CPU generation clearly recognizable, as this is always a topic in\ndiscussions with customers."),(0,r.kt)("p",null,"Note that not all relevant properties of flavors can be discovered; creating a specification\nto address this is a separate but related effort to the name standardization.\nCommonly used infrastructure-as-code tools do not provide a way to use discoverability\nfeatures to express something like \"I want a flavor with 2 vCPUs, 8GiB of RAM, a local\n20GB SSD disk and Infiniband support but I don't care whether it's AMD or intel\" in a\nreasonable manner. Using flavor names to express this will thus continue to be useful\nand we don't expect the need for standardization of flavor names to go away until\nthe commonly used IaC tools work on a higher abstraction layer than they currently do."),(0,r.kt)("h2",{id:"design-considerations"},"Design Considerations"),(0,r.kt)("h3",{id:"type-of-information-included"},"Type of information included"),(0,r.kt)("p",null,"From discussions of our operators with their customers we learned that\nthe following characteristics are important in a flavor description:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"left"},"Type"),(0,r.kt)("th",{parentName:"tr",align:"left"},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Generation"),(0,r.kt)("td",{parentName:"tr",align:"left"},"CPU Generation")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Number of CPU"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Number of vCPUs - suffixed by L,V,T,C (see below)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Amount of RAM"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Amount of memory available for the VM")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Performance Class"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Ability to label high-performance CPUs, disks, network")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"CPU Type"),(0,r.kt)("td",{parentName:"tr",align:"left"},"X86-intel, X86-amd, ARM, RISC-V, Generic")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},'"bms"'),(0,r.kt)("td",{parentName:"tr",align:"left"},"Bare Metal System (no virtualization/hypervisor)")))),(0,r.kt)("p",null,"This list is likely not comprehensive and will grow over time."),(0,r.kt)("p",null,"Rather than using random names ",(0,r.kt)("inlineCode",{parentName:"p"},"s5a.medium")," and assigning a discrete set of properties\nto them, we wanted to come up with a scheme that allows to systematically derive\nnames from properties and vice versa. The scheme allows for short names (by not\nencoding all details) as well as very detailed longer names."),(0,r.kt)("h2",{id:"complete-proposal-for-systematic-flavor-naming"},"Complete Proposal for systematic flavor naming"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Prefix"),(0,r.kt)("th",{parentName:"tr",align:null},"CPUs & Suffix"),(0,r.kt)("th",{parentName:"tr",align:null},"RAM","[GiB]"),(0,r.kt)("th",{parentName:"tr",align:null},"optional: Disk","[GB]","&type"),(0,r.kt)("th",{parentName:"tr",align:null},"opt: extensions"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"SCS-")),(0,r.kt)("td",{parentName:"tr",align:null},"N",(0,r.kt)("inlineCode",{parentName:"td"},"L/V/T/C"),"[",(0,r.kt)("inlineCode",{parentName:"td"},"i"),"]"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"-"),"N","[",(0,r.kt)("inlineCode",{parentName:"td"},"u"),"]","[",(0,r.kt)("inlineCode",{parentName:"td"},"o"),"]"),(0,r.kt)("td",{parentName:"tr",align:null},"[",(0,r.kt)("inlineCode",{parentName:"td"},"-"),"[","M",(0,r.kt)("inlineCode",{parentName:"td"},"x"),"]","N","[",(0,r.kt)("inlineCode",{parentName:"td"},"n/s/l/p"),"]","]"),(0,r.kt)("td",{parentName:"tr",align:null},"[",(0,r.kt)("inlineCode",{parentName:"td"},"_"),"EXT","]")))),(0,r.kt)("p",null,"Note that ",(0,r.kt)("inlineCode",{parentName:"p"},"N")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"M")," are placeholders for numbers here.\nThe optional fields are denoted in brackets (and have opt: in the header.\nSee below for extensions."),(0,r.kt)("p",null,"Note that all letters are case-sensitive."),(0,r.kt)("p",null,"Typical flavor names look like ",(0,r.kt)("inlineCode",{parentName:"p"},"SCS-4V-16-50")," for a flavor with 4vCPUs (with limited\noversubscription), 16GiB RAM and a 50GB disk (of unspecified type)."),(0,r.kt)("h2",{id:"proposal-details"},"Proposal Details"),(0,r.kt)("h3",{id:"required-cpu-suffixes"},"[REQUIRED]"," CPU Suffixes"),(0,r.kt)("p",null,"Next to the number of vCPUs, these vCPUs need to be characterized ti describe their nature."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Suffix"),(0,r.kt)("th",{parentName:"tr",align:null},"Meaning"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"C"),(0,r.kt)("td",{parentName:"tr",align:null},"dedicated Core")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"T"),(0,r.kt)("td",{parentName:"tr",align:null},"dedicated Thread (SMT)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"V"),(0,r.kt)("td",{parentName:"tr",align:null},"vCPU (oversubscribed)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"L"),(0,r.kt)("td",{parentName:"tr",align:null},"vCPU (heavily oversubscribed)")))),(0,r.kt)("h4",{id:"baseline"},"Baseline"),(0,r.kt)("p",null,"Note that vCPU oversubscription for a ",(0,r.kt)("inlineCode",{parentName:"p"},"V")," vCPU should be implemented such, that we\ncan guarantee ",(0,r.kt)("em",{parentName:"p"},"at least 20% of a core in >99% of the time"),"; this can be achieved by\nlimiting vCPU oversubscription to 5x per core (or 3x per thread when SMT/HT is enabled)\nor by more advanced workload management logic. Otherwise ",(0,r.kt)("inlineCode",{parentName:"p"},"L")," (low performance) instead\nof ",(0,r.kt)("inlineCode",{parentName:"p"},"V")," must be used. The >99% is measured over a month (1% is 7.2h/month)."),(0,r.kt)("p",null,"Note that CPUs should use latest microcode to protect against CPU vulnerabilities (Spectre, Meltdown, L1TF, etc.).\nMicrocode must be updated within less than a month of a new release; for CVSS scores above 8,\nproviders should do it in less than a week.\nThe provider should enable at least all mitigations that are enabled by default in the Linux kernel and the\nKVM hypervisor. CPUs that are susceptible to L1TF (intel x86 pre Cascade Lake) should switch off hyperthreading\nOR (in the future) use core scheduling implementations that are deemed to be secure by the SCS security team."),(0,r.kt)("p",null,"If microcode updates needed for mitigation are lacking for longer than a month, default kernel/hypervisor\nmitigations are disabled or hyperthreading is enabled despite the CPU being susceptible to L1TF, the\nflavors must declare themselves insecure with the ",(0,r.kt)("inlineCode",{parentName:"p"},"i")," suffix (see below)."),(0,r.kt)("h4",{id:"higher-oversubscription"},"Higher oversubscription"),(0,r.kt)("p",null,"Must be indicated with a ",(0,r.kt)("inlineCode",{parentName:"p"},"L")," vCPU type (low performance for > 5x/core or > 3x/thread oversubscription and\nthe lack of workload management that would prevent worst case performance <20% in more than 7.2h per month)."),(0,r.kt)("h4",{id:"insufficient-microcode"},"Insufficient microcode"),(0,r.kt)("p",null,"Not using these mitigations must be indicated by an additional ",(0,r.kt)("inlineCode",{parentName:"p"},"i")," suffix for insecure\n(weak protection against CPU vulns through insufficient microcode, lack of disabled hyperthreading\non L1TF susceptible CPUs w/o effective core scheduling or disabled protections on the host/hypervisor)."),(0,r.kt)("h4",{id:"examples"},"Examples"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"SCS-",(0,r.kt)("strong",{parentName:"li"},"2C"),"-4-10n"),(0,r.kt)("li",{parentName:"ul"},"SCS-",(0,r.kt)("strong",{parentName:"li"},"2T"),"-4-10n"),(0,r.kt)("li",{parentName:"ul"},"SCS-",(0,r.kt)("strong",{parentName:"li"},"2V"),"-4-10n"),(0,r.kt)("li",{parentName:"ul"},"SCS-",(0,r.kt)("strong",{parentName:"li"},"2L"),"-4-10n"),(0,r.kt)("li",{parentName:"ul"},"SCS-",(0,r.kt)("strong",{parentName:"li"},"2Li"),"-4-10n"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("del",{parentName:"li"},"SCS-",(0,r.kt)("strong",{parentName:"del"},"2"),"-","*","*","4-10n")," <- CPU suffix missing"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("del",{parentName:"li"},"SCS-",(0,r.kt)("strong",{parentName:"del"},"2iT"),"-4-10n")," <- This order is forbidden")),(0,r.kt)("h3",{id:"required-memory"},"[REQUIRED]"," Memory"),(0,r.kt)("h4",{id:"baseline-1"},"Baseline"),(0,r.kt)("p",null,"Cloud providers should use ECC memory.\nMemory oversubscription should not be used.\nIt is allowed to specify half GiBs (e.g. 3.5), though this is should not be done for larger memory sizes (>= 10GiB)."),(0,r.kt)("h4",{id:"no-ecc"},"No ECC"),(0,r.kt)("p",null,"If no ECC is used, the ",(0,r.kt)("inlineCode",{parentName:"p"},"u")," suffix must indicate this."),(0,r.kt)("h4",{id:"enabled-oversubscription"},"Enabled Oversubscription"),(0,r.kt)("p",null,"If memory is oversubscribed, you must expose this with the ",(0,r.kt)("inlineCode",{parentName:"p"},"o")," suffix."),(0,r.kt)("h4",{id:"examples-1"},"Examples"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"SCS-2C-",(0,r.kt)("strong",{parentName:"li"},"4"),"-10n"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-",(0,r.kt)("strong",{parentName:"li"},"3.5"),"-10n"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-",(0,r.kt)("strong",{parentName:"li"},"4u"),"-10n"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-",(0,r.kt)("strong",{parentName:"li"},"4o"),"-10n"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-",(0,r.kt)("strong",{parentName:"li"},"4uo"),"-10n"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("del",{parentName:"li"},"SCS-2C-",(0,r.kt)("strong",{parentName:"del"},"4ou"),"-10n")," <- This order is forbidden")),(0,r.kt)("h3",{id:"optional-disk-sizes-and-types"},"[OPTIONAL]"," Disk sizes and types"),(0,r.kt)("p",null,"Disk sizes (in GB) should use sizes 5, 10, 20, 50, 100, 200, 500, 1000."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Disk type"),(0,r.kt)("th",{parentName:"tr",align:null},"Meaning"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"n"),(0,r.kt)("td",{parentName:"tr",align:null},"Network shared storage (ceph/cinder)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"h"),(0,r.kt)("td",{parentName:"tr",align:null},"Local disk (HDD: SATA/SAS class)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"s"),(0,r.kt)("td",{parentName:"tr",align:null},"Local SSD disk")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"p"),(0,r.kt)("td",{parentName:"tr",align:null},"Local high-perf NVMe")))),(0,r.kt)("h4",{id:"baseline-2"},"Baseline"),(0,r.kt)("p",null,"Note that disk type might be omitted \u2014 the user then can not take any assumptions\non what storage is provided for the root disk (that the image gets provisioned to)."),(0,r.kt)("p",null,"It does make sense for ",(0,r.kt)("inlineCode",{parentName:"p"},"n")," to be requested explicitly to allow for smooth live migration.\n",(0,r.kt)("inlineCode",{parentName:"p"},"h")," typically provides latency advantages vs ",(0,r.kt)("inlineCode",{parentName:"p"},"n")," (but not necessarily bandwidth and\nalso is more likely to fail), ",(0,r.kt)("inlineCode",{parentName:"p"},"s")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"p")," are for applications that need low\nlatency (high IOPS) and bandwidth disk I/O. ",(0,r.kt)("inlineCode",{parentName:"p"},"n")," storage is expected to survive\nsingle-disk and single-node failure."),(0,r.kt)("p",null,"If the disk size is left out, the cloud is expected to allocate a disk (network or local)\nthat is large enough to fit the root file system (",(0,r.kt)("inlineCode",{parentName:"p"},"min_disk")," in image). This automatic\nallocation is indicated with ",(0,r.kt)("inlineCode",{parentName:"p"},"-")," without a disk size.\nIf the ",(0,r.kt)("inlineCode",{parentName:"p"},"-")," is left out completely, the user must create a boot volume manually and\ntell the instance to boot from it or use the\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.openstack.org/api-ref/compute/?expanded=create-server-detail#create-server"},(0,r.kt)("inlineCode",{parentName:"a"},"block_device_mapping_v2")),"\nmechanism explicitly to create the boot volume from an image."),(0,r.kt)("h4",{id:"multi-provisioned-disk"},"Multi-provisioned Disk"),(0,r.kt)("p",null,"The disk size can be prefixed with ",(0,r.kt)("inlineCode",{parentName:"p"},"Mx prefix"),", where M is an integer specifying that the disk\nis provisioned M times. Multiple disks provided this way should be independent storage media,\nso users can expect some level of parallelism and independence."),(0,r.kt)("h4",{id:"examples-2"},"Examples"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-",(0,r.kt)("strong",{parentName:"li"},"10n")),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-",(0,r.kt)("strong",{parentName:"li"},"10s")),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-",(0,r.kt)("strong",{parentName:"li"},"10s"),"_","bms_z3"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-",(0,r.kt)("strong",{parentName:"li"},"3x10s")," <- Cloud creates three 10GB SSDs"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-",(0,r.kt)("strong",{parentName:"li"},"3x10s"),"_","bms_z3"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-",(0,r.kt)("strong",{parentName:"li"},"10")," <- Cloud decides disk type"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-",(0,r.kt)("strong",{parentName:"li"},"10"),"_","bms_z3"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-",(0,r.kt)("strong",{parentName:"li"},"n")," <- Cloud decides disk size (min_disk from image or larger)"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-",(0,r.kt)("strong",{parentName:"li"},"n"),"_","bms_3"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4- <- Cloud decides disk type and size"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-","_","bms_z3"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-","_","bms_z3h_GNa-64_ib"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-","_","ib"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4 <- You need to specify a boot volume yourself (boot from volume, or use ",(0,r.kt)("inlineCode",{parentName:"li"},"block_device_mapping_v2"),")"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4_bms_z3"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-3x- <- Cloud decides disk type and size and creates three of them (FIXME: Is this useful?)"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-3xs <- Cloud decides size and creates three local SSD volumes (FIXME: useful?)"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-3x10 <- Cloud decides type and creates three 10GB volumes"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("del",{parentName:"li"},"SCS-2C-4-",(0,r.kt)("strong",{parentName:"del"},"1.5n"))," <- You must not specify disk sizes which are not in full GiBs")),(0,r.kt)("h2",{id:"standard-scs-flavors"},"Standard SCS flavors"),(0,r.kt)("p",null,"These are flavors that must exist on standard SCS clouds (x86-64)."),(0,r.kt)("p",null,"We expect disk sizes to be 5, 10, 20, 50, 100, 200, 500, 1000GB, 2000GB.\nWe expect a typical CPU:Mem","[GiB]"," ratio of 1:4."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"vCPU:RAM ratio"),(0,r.kt)("th",{parentName:"tr",align:null},"Mandatory Flavors"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1:4"),(0,r.kt)("td",{parentName:"tr",align:null},"SCS-1V-4, SCS-1V-4-10")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"2:8"),(0,r.kt)("td",{parentName:"tr",align:null},"SCS-2V-8, SCS-2V-8-20")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"4:16"),(0,r.kt)("td",{parentName:"tr",align:null},"SCS-4V-16, SCS-4V-16-50")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"8:32"),(0,r.kt)("td",{parentName:"tr",align:null},"SCS-8V-32, SCS-8V-32-100")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1:2"),(0,r.kt)("td",{parentName:"tr",align:null},"SCS-1V-2, SCS-1V-2-5")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"2:4"),(0,r.kt)("td",{parentName:"tr",align:null},"SCS-2V-4, SCS-2V-4-10")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"4:8"),(0,r.kt)("td",{parentName:"tr",align:null},"SCS-4V-8, SCS-4V-8-20")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"8:16"),(0,r.kt)("td",{parentName:"tr",align:null},"SCS-8V-16, SCS-8V-16-50")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"16:32"),(0,r.kt)("td",{parentName:"tr",align:null},"SCS-16V-32, SCS-16V-32-100")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1:8"),(0,r.kt)("td",{parentName:"tr",align:null},"SCS-1V-8, SCS-1V-8-20")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"2:16"),(0,r.kt)("td",{parentName:"tr",align:null},"SCS-2V-16, SCS-2V-16-50")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"4:32"),(0,r.kt)("td",{parentName:"tr",align:null},"SCS-4V-32, SCS-4V-32-100")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1:1"),(0,r.kt)("td",{parentName:"tr",align:null},"SCS-1L-1, SCS-1L-1-5")))),(0,r.kt)("p",null,"Note that all vCPUs of SCS standard flavors are oversubscribed \u2014 the smallest ",(0,r.kt)("inlineCode",{parentName:"p"},"1L-1"),"\nflavor allows for heavy oversubscription (note the ",(0,r.kt)("inlineCode",{parentName:"p"},"L"),"), and thus can be offered very\ncheaply \u2014 imagine jump hosts ...\nDisks types are not specified (and expected to be n or h typically)."),(0,r.kt)("p",null,"The design allows for small clouds (with CPUs with 16 Threads, 64GiB RAM\ncompute hosts) to offer all flavors."),(0,r.kt)("p",null,"Note: Compared to previous drafts, we have heavily reduced the variations\non disk sizes \u2014 this reflects that for the standard networked cinder\ndisks, you can pass ",(0,r.kt)("inlineCode",{parentName:"p"},"block_device_mapping_v2")," on server (VM) creation to\nallocate a boot disk of any size you desire. We have scaled the few\nmandatory disk sizes with the amount of RAM. For each flavor there is\nalso one ",(0,r.kt)("em",{parentName:"p"},"without")," a pre-attached disk \u2014 these are meant to be used\nto boot from a volume (either created beforehand or allocated on-the-fly\nwith ",(0,r.kt)("inlineCode",{parentName:"p"},"block_device_mapping_v2"),", e.g.\n",(0,r.kt)("inlineCode",{parentName:"p"},"openstack server create --flavor SCS-1V:2 --block-device-mapping sda=IMGUUID:image:12:true"),"\nto create a bootable 12G cinder volume from image ",(0,r.kt)("inlineCode",{parentName:"p"},"IMGUUID")," that gets tied to the VM\ninstance life cycle.)"),(0,r.kt)("h2",{id:"naming-policy-compliance"},"Naming policy compliance"),(0,r.kt)("p",null,"To be certified as an SCS compliant x86-64 IaaS platform, you must offer all standard SCS flavors\naccording to the previous section. (We may define a mechanism that allows exceptions to be\ngranted in a way that makes this very transparent and visible to clients.)"),(0,r.kt)("p",null,"You are allowed to understate your performance; you may implement a SCS-1V-1-5 flavor with\na flavor that actually implements SCS-1T-1-5n (i.e. you dedicate a dedicated hyperthread instead\nof higher oversubscription) or even SCS-1D-1.5-8s (1 dedicated core, 50% more RAM and a 8GiB SSD)."),(0,r.kt)("p",null,"Flavor names indicating certain capabilities must ",(0,r.kt)("em",{parentName:"p"},"at least")," provide these, otherwise they\nare in violation of the SCS specification and prevent SCS compliance."),(0,r.kt)("p",null,"We expect all cloud providers to offer the short, less specific flavor names (such as SCS-8V-32-100).\nLarger providers that offer more details (using the extension below) are expected to still also\noffer the short variants for usability and easier portability, even beyond the mandated flavors."),(0,r.kt)("p",null,"You must be very careful to expose low vCPU guarantees (",(0,r.kt)("inlineCode",{parentName:"p"},"L")," instead of ",(0,r.kt)("inlineCode",{parentName:"p"},"V"),"), insecure\nhyperthreading/microcode ",(0,r.kt)("inlineCode",{parentName:"p"},"i"),", non-ECC-RAM ",(0,r.kt)("inlineCode",{parentName:"p"},"u"),", memory oversubscription ",(0,r.kt)("inlineCode",{parentName:"p"},"o"),". Note that omitting these qualifiers is\noverstating your security, reliability or performance properties and may be reason for\nclients to feel betrayed or claim damages. This would prevent SCS compliance and certification;\nin extreme cases, the SCS project might be forced to work with public statements."),(0,r.kt)("p",null,"You may offer additional ",(0,r.kt)("inlineCode",{parentName:"p"},"SCS-")," flavors, following the naming scheme and rules outlined here."),(0,r.kt)("p",null,"You may offer additional flavors, not following above scheme and not starting with ",(0,r.kt)("inlineCode",{parentName:"p"},"SCS-")),(0,r.kt)("p",null,"You must not offer flavors with the ",(0,r.kt)("inlineCode",{parentName:"p"},"SCS-")," prefix which do not follow this naming scheme.\nYou must not extend the SCS naming scheme with your own suffices; you are encouraged however\nto suggest extensions that we can discuss and add to the official scheme."),(0,r.kt)("h2",{id:"validation"},"Validation"),(0,r.kt)("p",null,"There is a script in ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Tests/iaas/flavor-naming/flavor-name-check.py"},(0,r.kt)("inlineCode",{parentName:"a"},"flavor_name_check.py")),"\nwhich can be used to decode, validate and construct flavor names.\nThis script must stay in sync with the specification text."),(0,r.kt)("p",null,"Ensure you have your OpenStack tooling (",(0,r.kt)("inlineCode",{parentName:"p"},"python3-openstackclient"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"OS_CLOUD"),") setup and call\n",(0,r.kt)("inlineCode",{parentName:"p"},"tools/flavor-name-check.py -c $(openstack flavor list -f value -c Name)")," to get a report\non the flavor list compliance of the cloud environment."),(0,r.kt)("p",null,"The script ",(0,r.kt)("inlineCode",{parentName:"p"},"flavor-names-openstack.py")," talks to the OpenStack API of the\ncloud specified by the ",(0,r.kt)("inlineCode",{parentName:"p"},"OS_CLOUD")," environment and queries properties and checks\nthe names for standards compliance and completeness w.r.t. the mandatory\nflavor list. It goes beyond the above example in checking that the discoverable\nfeatures of flavors (vCPUs, RAM, Disk) match what the flavor names claim."),(0,r.kt)("h2",{id:"operational-tooling"},"Operational tooling"),(0,r.kt)("p",null,"The ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/osism/openstack-flavor-manager"},"openstack-flavor-manager")," is able to\ncreate all standard, mandatory SCS flavors for you."),(0,r.kt)("h2",{id:"extensions"},"Extensions"),(0,r.kt)("p",null,"Extensions provide a possibility for providers that offer a very differentiated set\nof flavors to indicate hypervisors, support for hardware/nested virtuatlization,\nCPU types and generations, high-frequency models, GPU support and GPU types as\nwell as Inifiniband support. (More extensions may be appended in the future.)"),(0,r.kt)("p",null,"Using the systematic naming approach ensures that two providers that offer flavors\nwith the same specific features will use the same name for them, thus simplifying\nlife for their customers when consuming these flavors."),(0,r.kt)("p",null,"Note that there is no need to indicate all details and extra features this way.\nFlavors may always perform better or have more features than indicated in a name.\nUnderperformance (CPU suffices ",(0,r.kt)("inlineCode",{parentName:"p"},"L")," or ",(0,r.kt)("inlineCode",{parentName:"p"},"i")," or memory suffices ",(0,r.kt)("inlineCode",{parentName:"p"},"o")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"u"),") on the other\nhand MUST be indicated in the name; this happens rarely in practice."),(0,r.kt)("p",null,"For smaller providers, the ability to e.g. differentiate between an AMD Milan and an intel\nIceLake and exposed the slightly different feature set to customers and have slightly\ndifferent price points is often not worth the extra effort. This is because having\nthis extra differentiation causes fragmentation of the machines (host aggregates)\nthat can offer these flavors, thus resulting in a lower utilization (as the capacity\nmanagement will need to have a certain amount of headroom per machine pool to avoid\nrunning out of capacity)."),(0,r.kt)("p",null,"Note that it possible for providers to register both the generic short names and the\nlonger, more detailed names and allow them to use the same set of machines (host aggregates).\nNote that machines (hypervisors) can be part of more than one host aggregate."),(0,r.kt)("p",null,"The extensions have the format:"),(0,r.kt)("p",null,"[",(0,r.kt)("inlineCode",{parentName:"p"},"_"),"hyp","]","[",(0,r.kt)("inlineCode",{parentName:"p"},"_hwv"),"]","[",(0,r.kt)("inlineCode",{parentName:"p"},"_"),"[","arch","[","N","]","[",(0,r.kt)("inlineCode",{parentName:"p"},"h"),"]","[",(0,r.kt)("inlineCode",{parentName:"p"},"_"),"[",(0,r.kt)("inlineCode",{parentName:"p"},"G/g"),"]","X","[","N","]","[",(0,r.kt)("inlineCode",{parentName:"p"},"-"),"M","[",(0,r.kt)("inlineCode",{parentName:"p"},"h"),"]","]","]","[",(0,r.kt)("inlineCode",{parentName:"p"},"_ib"),"]"),(0,r.kt)("p",null,"Remember that letters are case-sensitive.\nIn case you wonder: Feature indicators are capitalized, modifiers are lower case.\n(An exception is the uppercase -G for a pass-through GPU vs. lowercase -g for vGPU.)"),(0,r.kt)("h3",{id:"optional-hypervisor"},"[OPTIONAL]"," Hypervisor"),(0,r.kt)("p",null,"The ",(0,r.kt)("em",{parentName:"p"},"default Hypervisor")," is assumed to be ",(0,r.kt)("inlineCode",{parentName:"p"},"KVM"),". Clouds, that offer different hypervisors\nor Bare Metal Systems should indicate the Hypervisor according to the following table:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"hyp"),(0,r.kt)("th",{parentName:"tr",align:null},"Meaning"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"kvm"),(0,r.kt)("td",{parentName:"tr",align:null},"KVM")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"xen"),(0,r.kt)("td",{parentName:"tr",align:null},"Xen")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"vmw"),(0,r.kt)("td",{parentName:"tr",align:null},"VMware")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"hyv"),(0,r.kt)("td",{parentName:"tr",align:null},"Hyper-V")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"bms"),(0,r.kt)("td",{parentName:"tr",align:null},"Bare Metal System")))),(0,r.kt)("h4",{id:"examples-3"},"Examples"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-10n"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-10n","_",(0,r.kt)("strong",{parentName:"li"},"bms")),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-10n","_",(0,r.kt)("strong",{parentName:"li"},"bms"),"_","z3h")),(0,r.kt)("h3",{id:"optional-hardware-virtualization--nested-virtualization"},"[OPTIONAL]"," Hardware virtualization / Nested virtualization"),(0,r.kt)("p",null,"If the instances that are created with this flavor support hardware-accelerated\nvirtualization, this can be reflected with the ",(0,r.kt)("inlineCode",{parentName:"p"},"_hwv")," flag (after the optional\nHypervisor flag). On x86, this means that in the instance, the CPU flag vmx (intel)\nor svm (AMD) is available. This will be the case on Bare Metal flavors on almost\nall non-ancient x86 CPUs or if your virtualization hypervisor is configured to\nsupport nested virtualization.\nFlavors without the ",(0,r.kt)("inlineCode",{parentName:"p"},"_hwv")," flag may or may not support hardware virtualization (as we\nrecommend enabling nesting, but don't require flavor names to reflect all\ncapabilities. Flavors may over-deliver ...)"),(0,r.kt)("h4",{id:"examples-4"},"Examples"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-10 <- may or may not support HW virtualization in VMs"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-10",(0,r.kt)("em",{parentName:"li"},"kvm"),(0,r.kt)("strong",{parentName:"li"},"hwv")," <- kvm with enabled nested virtualization"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-10","_",(0,r.kt)("strong",{parentName:"li"},"hwv")," <- not recommended, but allowed"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-10","_","bms","_",(0,r.kt)("strong",{parentName:"li"},"hwv")," <- better: bare metal with HW virt support (VMX on intel, SVM on AMD, ...)"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("del",{parentName:"li"},"SCS-2C-4-10","_",(0,r.kt)("strong",{parentName:"del"},"hwv"),"_","xen")," <- illegal, wrong ordering")),(0,r.kt)("h3",{id:"optional-cpu-architecture-details"},"[OPTIONAL]"," CPU Architecture Details"),(0,r.kt)("p",null,"Arch details provide more details on the specific CPU:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Vendor"),(0,r.kt)("li",{parentName:"ul"},"Generation"),(0,r.kt)("li",{parentName:"ul"},"Frequency")),(0,r.kt)("h4",{id:"generation-and-vendor"},"Generation and Vendor"),(0,r.kt)("p",null,"The generations are vendor specific and can be left out.\nNot specifying arch means that we have a generic CPU (",(0,r.kt)("strong",{parentName:"p"},"x86-64"),").\nThe letters ",(0,r.kt)("inlineCode",{parentName:"p"},"i"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"z"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"a")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"r")," specify the vendors Intel,\nAMD (",(0,r.kt)("inlineCode",{parentName:"p"},"z")," like in Zen), ARM v8+, RISC-V."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Generation"),(0,r.kt)("th",{parentName:"tr",align:null},"i (Intel x86-64)"),(0,r.kt)("th",{parentName:"tr",align:null},"z (AMD x86-64)"),(0,r.kt)("th",{parentName:"tr",align:null},"\xa0a (AArch64)"),(0,r.kt)("th",{parentName:"tr",align:null},"r (RISC-V)"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"0"),(0,r.kt)("td",{parentName:"tr",align:null},"pre Skylake"),(0,r.kt)("td",{parentName:"tr",align:null},"pre Zen"),(0,r.kt)("td",{parentName:"tr",align:null},"pre Cortex A76"),(0,r.kt)("td",{parentName:"tr",align:null},"TBD")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1"),(0,r.kt)("td",{parentName:"tr",align:null},"Skylake"),(0,r.kt)("td",{parentName:"tr",align:null},"Zen-1 (Naples)"),(0,r.kt)("td",{parentName:"tr",align:null},"A76/NeoN1 class"),(0,r.kt)("td",{parentName:"tr",align:null},"TBD")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"2"),(0,r.kt)("td",{parentName:"tr",align:null},"Cascade Lake"),(0,r.kt)("td",{parentName:"tr",align:null},"Zen-2 (Rome)"),(0,r.kt)("td",{parentName:"tr",align:null},"A78/x1/NeoV1 class"),(0,r.kt)("td",{parentName:"tr",align:null},"TBD")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"3"),(0,r.kt)("td",{parentName:"tr",align:null},"Ice Lake"),(0,r.kt)("td",{parentName:"tr",align:null},"Zen-3 (Milan)"),(0,r.kt)("td",{parentName:"tr",align:null},"A71x/NeoN2 (ARMv9)"),(0,r.kt)("td",{parentName:"tr",align:null},"TBD")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"4"),(0,r.kt)("td",{parentName:"tr",align:null},"Sapphire Rapids"),(0,r.kt)("td",{parentName:"tr",align:null},"Zen-4 (Genoa)"),(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null},"TBD")))),(0,r.kt)("p",null,"It is recommended to leave out the ",(0,r.kt)("inlineCode",{parentName:"p"},"0"),' when specifying the old generation; this will\nhelp the parser tool, which assumes 0 for an unspecified value and does leave it\nout when generating the name for comparison. In other words: 0 has a meaning of\n"rather old or unspecified".'),(0,r.kt)("h4",{id:"frequency-suffixes"},"Frequency Suffixes"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Suffix"),(0,r.kt)("th",{parentName:"tr",align:null},"Meaning"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"h"),(0,r.kt)("td",{parentName:"tr",align:null},">2.75GHz all-core")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"hh"),(0,r.kt)("td",{parentName:"tr",align:null},">3.25GHz all-core")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"hhh"),(0,r.kt)("td",{parentName:"tr",align:null},">3.75GHz all-core")))),(0,r.kt)("h4",{id:"examples-5"},"Examples"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-10n"),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-10n","_",(0,r.kt)("strong",{parentName:"li"},"z")),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-10n","_",(0,r.kt)("strong",{parentName:"li"},"z3")),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-10n","_",(0,r.kt)("strong",{parentName:"li"},"z3h")),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-10n","_",(0,r.kt)("strong",{parentName:"li"},"z3hh")),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-10n",(0,r.kt)("em",{parentName:"li"},"bms"),(0,r.kt)("strong",{parentName:"li"},"z")),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-10n",(0,r.kt)("em",{parentName:"li"},"bms"),(0,r.kt)("strong",{parentName:"li"},"z3")),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-10n",(0,r.kt)("em",{parentName:"li"},"bms"),(0,r.kt)("strong",{parentName:"li"},"z3")),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-10n",(0,r.kt)("em",{parentName:"li"},"bms"),(0,r.kt)("strong",{parentName:"li"},"z3h")),(0,r.kt)("li",{parentName:"ul"},"SCS-2C-4-10n",(0,r.kt)("em",{parentName:"li"},"bms"),(0,r.kt)("strong",{parentName:"li"},"z3hh")," <- Bare Metal, Intel Ice Lake with > 3.25GHz all core freq")),(0,r.kt)("h3",{id:"optional-gpu-support"},"[OPTIONAL]"," GPU support"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"_G"),"X","[","N","]","[",(0,r.kt)("inlineCode",{parentName:"p"},"-"),"M","[",(0,r.kt)("inlineCode",{parentName:"p"},"h"),"]","]"," indicates a Pass-Through GPU from vendor X of gen N with M compute units / SMs / EUs exposed.\n",(0,r.kt)("inlineCode",{parentName:"p"},"_g"),"X","[","N","]","[",(0,r.kt)("inlineCode",{parentName:"p"},"-"),"M","[",(0,r.kt)("inlineCode",{parentName:"p"},"h"),"]","]"," indicates a vGPU from vendor X of gen N with M compute units / SMs / EUs assigned."),(0,r.kt)("p",null,"Note that the vendor letter X is mandatory, generation and compute units are optional."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"GPU"),(0,r.kt)("th",{parentName:"tr",align:null},"Vendor"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"N"),(0,r.kt)("td",{parentName:"tr",align:null},"nVidia")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"A"),(0,r.kt)("td",{parentName:"tr",align:null},"AMD")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"I"),(0,r.kt)("td",{parentName:"tr",align:null},"Intel")))),(0,r.kt)("p",null,"For nVidia, the generation N can be f=Fermi, k=Kepler, m=Maxwell, p=Pascal, v=Volta, t=turing, a=Ampere, l=Ada Lovelace, ...,\nfor AMD GCN-x=0.x, RDNA1=1, RDNA2=2, RDNA3=3, for intel Gen9=0.9, Xe(12.1)=1, ...\n(Note: This may need further work to properly reflect what's out there.)"),(0,r.kt)("p",null,"The optional ",(0,r.kt)("inlineCode",{parentName:"p"},"h")," suffix to the compute unit count indicates high-performance (e.g. high freq or special\nhigh bandwidth gfx memory such as HBM);\n",(0,r.kt)("inlineCode",{parentName:"p"},"h")," can be duplicated for even higher performance."),(0,r.kt)("h3",{id:"optional-infiniband"},"[OPTIONAL]"," Infiniband"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"_ib")," indicates Infiniband networking."),(0,r.kt)("p",null,"More extensions may be forthcoming and appended in a later revision of this spec."),(0,r.kt)("p",null,"Extensions need to be specified in the above mentioned order."),(0,r.kt)("h3",{id:"naming-options-advice"},"Naming options advice"),(0,r.kt)("p",null,"Note that we expect most clouds to prefer short flavor names,\nnot indicating CPU details or hypervisor types. See above list\nof standard flavors to get a feeling."),(0,r.kt)("p",null,"However, more successful providers will often need to differentiate their\nofferings in response to customer demand and allow customers to request\nflavors with specific detailed properties. The goal of this proposal is to avoid\nproviders to invent their own names and then refer customers to (currently\nincompletely standardized) ",(0,r.kt)("inlineCode",{parentName:"p"},"extra_specs"),"\nor worse a non-machine-readable service descriptions to find out the details."),(0,r.kt)("p",null,"So a cloud provider might well evolve from offering ",(0,r.kt)("inlineCode",{parentName:"p"},"SCS-8T-16-50")," to offering\n",(0,r.kt)("inlineCode",{parentName:"p"},"SCS-8T-16-50n"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"SCS-8T-16-50n_i2")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"SCS-8T-16-50n_a2")," to specify that he\nis using network disks and offer a choice b/w intel Cascade-Lake and AMD Rome.\nWe would expect the cloud provider to still offer the generic flavor\n",(0,r.kt)("inlineCode",{parentName:"p"},"SCS-8T-16-50")," and allow the scheduler (placement service) to pick both more\nspecific types (or just one if e.g. capacity management considerations suggest\nso). Providers should in such cases make sure that the price does not depend\non scheduler decisions."),(0,r.kt)("p",null,"We are looking into the ",(0,r.kt)("a",{parentName:"p",href:"https://docs.openstack.org/image-guide/introduction.html#metadata-definition-metadefs-service"},"metadefs"),"\nmechanism and ",(0,r.kt)("a",{parentName:"p",href:"https://docs.openstack.org/api-guide/compute/extra_specs_and_properties.html"},"extra_specs"),"\nto allow customers to ask for specific flavor properties without the need to\nencode all these flavor details into the flavor name, so the optional pieces\nmay not be needed much. However, there must be a way to request flavor\nproperties without encoding the need into an image \u2014 the indirection via\nan image is considered broken by the SCS team."),(0,r.kt)("h2",{id:"proposal-examples"},"Proposal Examples"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Example"),(0,r.kt)("th",{parentName:"tr",align:null},"Decoding"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-2C-4-10n"),(0,r.kt)("td",{parentName:"tr",align:null},"2 dedicated cores (x86-64), 4GiB RAM, 10GB network disk")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-8Ti-32-50p_i1"),(0,r.kt)("td",{parentName:"tr",align:null},"8 dedicated hyperthreads (insecure), Skylake, 32GiB RAM, 50GB local NVMe")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-1L-1u-5"),(0,r.kt)("td",{parentName:"tr",align:null},"1 vCPU (heavily oversubscribed), 1GiB Ram (no ECC), 5GB disk (unspecific)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-16T-64-200s_GNa-64_ib"),(0,r.kt)("td",{parentName:"tr",align:null},"16 dedicated threads, 64GiB RAM, 200GB local SSD, Infiniband, 64 Passthrough nVidia Ampere SMs")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-4C-16-2x200p_a1"),(0,r.kt)("td",{parentName:"tr",align:null},"4 dedicated Arm64 cores (A76 class), 16GiB RAM, 2x200GB local NVMe drives")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"SCS-1V-0.5"),(0,r.kt)("td",{parentName:"tr",align:null},"1 vCPU, 0.5GiB RAM, no disk (boot from cinder volume)")))),(0,r.kt)("h2",{id:"previous-standard-versions"},"Previous standard versions"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"/standards/scs-0100-v1-flavor-naming"},"Version 1 of the standard"),"\nused a slightly different naming syntax while the logic was exactly the same.\nWhat is a ",(0,r.kt)("inlineCode",{parentName:"p"},"-")," in v2 used to be a ",(0,r.kt)("inlineCode",{parentName:"p"},":"),"; ",(0,r.kt)("inlineCode",{parentName:"p"},"_")," used to be ",(0,r.kt)("inlineCode",{parentName:"p"},"-"),". The reason for\nthe change was certain Kubernetes tools using the flavor names as labels.\nLabels however are subject to stricter naming rules and in particular don't\nallow for a ",(0,r.kt)("inlineCode",{parentName:"p"},":"),". See ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/issues/190"},"PR #190"),"\nfor a discussion."),(0,r.kt)("p",null,"Version 1 flavor names can be translated to v2 using the following transformation:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"NAMEV2=$(echo \"$NAMEV1\" | sed -e 's/\\-/_/g' -e 's/:/-/g' -e 's/^SCS_/SCS-/')\n")),(0,r.kt)("p",null,"and the way back can be done with"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"NAMEV1=$(echo \"$NAMEV2\" | sed -e 's/\\-/:/g' -e 's/_/-/g' -e 's/^SCS:/SCS-/')\n")),(0,r.kt)("p",null,"Considerations for how providers can ensure a smooth transition for their customers\nfrom v1 to v2 are written in a separate document."),(0,r.kt)("p",null,"For the time being, the validation tools still accept the old names with a warning\n(despite the unchanged ",(0,r.kt)("inlineCode",{parentName:"p"},"SCS-")," prefix) unless you pass option ",(0,r.kt)("inlineCode",{parentName:"p"},"-2")," to them. They will\nhowever not count v1 flavors towards fulfilling the needs against the corresponding\nv2 mandatory flavor list unless you pass the option ",(0,r.kt)("inlineCode",{parentName:"p"},"-1"),".\nIn other words: An IaaS infrastructure with the 26\nv1 mandatory flavors will produce 26 warnings (for using old flavors) and 26\nerrors (for missing the 26 mandatory v2 flavors) unless you pass ",(0,r.kt)("inlineCode",{parentName:"p"},"-1")," in which\ncase no errors and no warnings will be produced. Registering the 26 mandatory\nv2 flavor names in addition will result in passing the test with only 26\nwarnings \u2014 unless you specify ",(0,r.kt)("inlineCode",{parentName:"p"},"-2"),". If you do and want to pass you'll need\nto remove the old v1 names or rename them to no longer start with ",(0,r.kt)("inlineCode",{parentName:"p"},"SCS-"),"."),(0,r.kt)("h2",{id:"beyond-scs"},"Beyond SCS"),(0,r.kt)("p",null,"The Gaia-X provider working group which could have created a superseding standard\ndoes no longer exist."),(0,r.kt)("p",null,"However, we have been reaching out to the OpenStack Public Cloud SIG and the ALASCA\nmembers to seek further alignment."),(0,r.kt)("p",null,"Getting upstream OpenStack support for flavor aliases would provide more flexibility\nand ease migrations between providers, also providers that don't offer the SCS-\nflavors."),(0,r.kt)("p",null,"We also would like to see upstream ",(0,r.kt)("inlineCode",{parentName:"p"},"extra_specs")," standardizing the discoverability of some\nproperties exposed via the SCS names and work on IaC tooling (terraform ...)\nto make use of these when selecting a flavor."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ce756c16.116ea445.js b/assets/js/ce756c16.116ea445.js new file mode 100644 index 0000000000..182362e50d --- /dev/null +++ b/assets/js/ce756c16.116ea445.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8681],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>f});var r=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=r.createContext({}),l=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},p=function(e){var t=l(e.components);return r.createElement(c.Provider,{value:t},e.children)},h="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},u=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,c=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),h=l(n),u=o,f=h["".concat(c,".").concat(u)]||h[u]||d[u]||i;return n?r.createElement(f,a(a({ref:t},p),{},{components:n})):r.createElement(f,a({ref:t},p))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,a=new Array(i);a[0]=u;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[h]="string"==typeof e?e:o,a[1]=s;for(var l=2;l<i;l++)a[l]=n[l];return r.createElement.apply(null,a)}return r.createElement.apply(null,n)}u.displayName="MDXCreateElement"},83418:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>l});var r=n(87462),o=(n(67294),n(3905));const i={},a="License considerations for SCS",s={unversionedId:"license-considerations",id:"license-considerations",title:"License considerations for SCS",description:"As Sovereign Cloud Stack (SCS), our mission is to provide Operators",source:"@site/community/license-considerations.md",sourceDirName:".",slug:"/license-considerations",permalink:"/community/license-considerations",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"community",previous:{title:"Styleguide",permalink:"/community/contribute/styleguide"}},c={},l=[{value:"Reciprocity",id:"reciprocity",level:2},{value:"Controversy",id:"controversy",level:2},{value:"Affero",id:"affero",level:2},{value:"Derived works and Strong vs. Weak Copyleft",id:"derived-works-and-strong-vs-weak-copyleft",level:2},{value:"Patents",id:"patents",level:2},{value:"Copyright Assignments and Contributor License Agreements",id:"copyright-assignments-and-contributor-license-agreements",level:2},{value:"License in = License out",id:"license-in--license-out",level:2},{value:"Further reading",id:"further-reading",level:2}],p={toc:l},h="wrapper";function d(e){let{components:t,...n}=e;return(0,o.kt)(h,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"license-considerations-for-scs"},"License considerations for SCS"),(0,o.kt)("p",null,"As Sovereign Cloud Stack (",(0,o.kt)("a",{parentName:"p",href:"https://scs.community/"},"SCS"),"), our mission is to provide Operators\n(be it Cloud Service Providers or just internal IT departments) with a well working software\nstack, that avoids exposing them to legal risks or additional restrictions that limits the\nusefulness. Free software licenses have this intention but differ in how they achieve it and in\nwhat kind of protections they provide. In the first approximation, all ",(0,o.kt)("a",{parentName:"p",href:"https://opensource.org/licenses"},"OSI"),"-approved\nopen source licenses can be considered as valid options. As a matter of fact,\nwe do consider projects under such licenses as valid modules for SCS \u2014 where we\nuse such projects and adjust or extend them, we would provide our contributions\nunder the license terms of the respective project, so we can achieve our goal to feed back code\nupstream to the respective project, contribute to it and avoid fragmentation."),(0,o.kt)("p",null,"Where we do create independent code, we do have additional preferences, though."),(0,o.kt)("p",null,"For our own code, we do prefer the ",(0,o.kt)("a",{parentName:"p",href:"https://www.gnu.org/licenses/agpl-3.0.html"},"Affero General Public License version 3"),"\n(AGPLv3) as license. Likewise, for documentation, we prefer ",(0,o.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/CC-BY-SA"},"CC-BY-SA"),".\nWhere we create standard libraries to interface with our software, we would\nconsider the ",(0,o.kt)("a",{parentName:"p",href:"https://www.gnu.de/documents/lgpl-3.0.en.html"},"LGPLv3")," for these,\nas we don't want interaction with our platform to be seen as requiring licensing\ncode."),(0,o.kt)("h2",{id:"reciprocity"},"Reciprocity"),(0,o.kt)("p",null,"The GPL family of licenses are reciprocal licenses \u2014 sometimes called ",(0,o.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Copyleft"},"copyleft"),"\nlicenses \u2014 the recipient of the licensed code can make all sorts of modifications,\nbut if she uses the code to release software (GPL) or provide a networked service\n(AGPL) to others, then she must grant the same rights to the recipients \u2014 this\nincludes making the modifications available under the same terms as the received software.\nMicrosoft has infamously ",(0,o.kt)("a",{parentName:"p",href:"https://web.archive.org/web/20010615205548/http://suntimes.com/output/tech/cst-fin-micro01.html"},"attacked"),'\ncopyleft licenses (and specifically the GPL) as cancerous "viral" license.'),(0,o.kt)("p",null,"Reciprocity has many advantages:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"Code that has been created as free software will stay free. While GPL code can be\ncombined in a larger software collection with proprietary software, the code itself\nincluding its enhancements etc. (technically: all derived works, see below) will\nremain free.")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},'The obligation to make the changes available avoids fragmentation. As changed and\n"improved" versions need to be made available, it is much easier to review and feed\nthose changes back and create a unified upstream codebase that reflects the needs of\nthe complete user base by including the needed changes. This was observed and\n',(0,o.kt)("a",{parentName:"p",href:"https://lwn.net/Articles/660428/"},"reported")," by Martin Fink (HP's former CTO)."))),(0,o.kt)("p",null,"The hugely successful ",(0,o.kt)("a",{parentName:"p",href:"https://kernel.org/"},"Linux kernel")," project uses the GNU GPL;\nmany of the more traditional key projects in the open source world use copyleft licenses such as\nthe AGPL, GNU GPL, GNU LGPL, MPL or the ",(0,o.kt)("a",{parentName:"p",href:"https://opensource.org/licenses/OSL-3.0"},"OSL"),"."),(0,o.kt)("h2",{id:"controversy"},"Controversy"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"Not fulfilling the license terms of a software license typically leads to the ability for the\nlicense owner to revoke the license \u2014 as it is relatively easy to not fulfill all obligations\nof the GPL out of sheer negligence, the revocation without prior warning seems\ndisproportionate \u2014 this is sometimes called the GPL death penalty. The open source community\nthough has a strong interest in bringing every licensee into compliance by giving violators a\nfair chance to correct their behavior. SCS explicitly supports the ",(0,o.kt)("a",{parentName:"p",href:"https://gplcc.github.io/gplcc/"},"GPL Cooperation Commitment"),"\nand the respective ",(0,o.kt)("a",{parentName:"p",href:"https://www.kernel.org/doc/html/v4.15/process/kernel-enforcement-statement.html"},"document"),"\nfrom the Linux kernel developers and pledges to give violators a warning and a chance to correct action\nby allowing for a cure period. This is a bit of a legacy issue \u2014 it is relevant to (L)GPLv2\ncode only \u2014 v3 of L/A/GPL does already contain language that has cure provisions, so it's\nclear by the licensing terms.")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"Many companies seem to be worried that they will inadvertently violate the GPL by negligence.\nAnd it is true that a company needs a tighter control of the usage of inbound source code\nwhich comes with a reciprocal license than the permissive BSD 3-clause or Apache Software (v2)\nlicenses. This advantage however quickly turns into a disadvantage as soon as the company does\nsignificant outbound open source contributions under a permissive license \u2014 they rarely want\nto give their competitors an opportunity to consume their contributions and then add\nproprietary changes to gain an advantage. In general, companies are well advised to have a\ndetailed understanding of all code that is being used and contributed and their respective\nlicense terms \u2014 for proprietary and open source code and for reciprocal and for permissive\nlicenses. Some companies have successfully installed license review boards or\n",(0,o.kt)("a",{parentName:"p",href:"https://www.linuxfoundation.org/resources/open-source-guides/using-open-source-code/"},"open source review boards"),"\nto create oversight, recommendations and policies to ease the governance."))),(0,o.kt)("p",null,"Despite this, many of the recent open source projects, especially in the cloud world\nhave adopted permissive licenses, such as X11, BSD 3-clause, MIT and especially the popular\n",(0,o.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Apache_License"},"Apache software license")," (ASL2), as it\nappears to allow for faster adoption by companies that may not have mature open source\npolicies in place or that simply have overly careful lawyers which may be influenced\nby the scare tactics some bad companies have built on top of copyleft licenses."),(0,o.kt)("h2",{id:"affero"},"Affero"),(0,o.kt)("p",null,"The reciprocity of the GNU GPL does not apply on the ",(0,o.kt)("em",{parentName:"p"},"creation")," of a derived work. A company\ncan consume GPL'ed code and change it to their own liking without ever making any the\nchanges available if only used in-house. The terms however do apply as soon as the derived\nwork is ",(0,o.kt)("em",{parentName:"p"},"released"),", i.e. the software is passed on to a third party."),(0,o.kt)("p",null,"In modern times, software is often used to provide a ",(0,o.kt)("em",{parentName:"p"},"networked service")," (think SaaS) to third\nparties. Unlike the standard GPL, the Affero GPL (AGPL) does consider the act of making it\navailable in such a way as similar to releasing the software and does require that applied\nchanges to the software are being made available in this case."),(0,o.kt)("p",null,"The AGPL thus closes a shortcoming in the traditional non-Affero GPL for a world that\nincreasingly moves towards networked services."),(0,o.kt)("p",null,"The very successful ",(0,o.kt)("a",{parentName:"p",href:"https://nextcloud.org/"},"Nextcloud")," project uses the AGPLv3."),(0,o.kt)("h2",{id:"derived-works-and-strong-vs-weak-copyleft"},"Derived works and Strong vs. Weak Copyleft"),(0,o.kt)("p",null,"What exactly constitutes derived work needs to be defined \u2014 it's one of the questions where\ncopyright law can get subtle. From a practical view, consuming (non-trivial) source code and\nbinary linking is typically considered creating derived works. Whereas interacting via a network\nAPI or starting another process is typically considered a copyright boundary. To avoid any\nunclarity, the Linux kernel community has explicitly called out using Linux system calls (which\nincludes using the interface definitions) is a copyright boundary and can thus be done by\napplications without any license implications."),(0,o.kt)("p",null,"Considering linked code to be derived works (as is the case in the GPL and AGPL) and thus\nrequiring it under the same (or a compatible) copyleft license is considered a Strong Copyleft\nlicense."),(0,o.kt)("p",null,"Libraries are often providing implementations for standard services and helpers; it may not be\nreasonable to consider applications that want to use a library as derived works from that\nlibrary and requiring the application to thus be licensed under a (compatible) copyleft license.\nFor these libraries, a Weak Copyleft license (such as the ",(0,o.kt)("a",{parentName:"p",href:"https://www.gnu.org/licenses/lgpl-3.0.en.html"},"LGPL"),"\nor the ",(0,o.kt)("a",{parentName:"p",href:"https://www.eclipse.org/legal/epl-2.0/"},"EPL")," can be used. This would still require changes to\nthe library ",(0,o.kt)("em",{parentName:"p"},"itself")," to me made available under the copyleft license but would make binary\nlinking (including the use of interface definitions) a copyright barrier and thus allow for\nnon-copylefted code to be linked against a weakly copylefted library. This license is used by\nmany of the standard and system libraries in the Linux world and is often a good choice for\nlibraries of standardized services."),(0,o.kt)("h2",{id:"patents"},"Patents"),(0,o.kt)("p",null,"Free software licenses are intended to give users broad rights \u2014 the GNU GPL talks about the\n",(0,o.kt)("a",{parentName:"p",href:"https://fsfe.org/freesoftware/"},"four freedoms")," to use software for any purpose, to study and\nadjust the software (this needs source code access), to redistribute the software and to improve\nit and to make these improvements available."),(0,o.kt)("p",null,"Software patents can significantly subvert the intended rights \u2014 the open source community in\ngeneral dislikes software patents for this and many other reasons that are discussed\n",(0,o.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Software_patents_and_free_software"},"elsewhere")," .\nIn some countries, there are rules that prevent pure software from being patented, though ",(0,o.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Software_patents_under_the_European_Patent_Convention"},"not\nall patent offices are fully following these rules"),"."),(0,o.kt)("p",null,"As software patents are existing and a serious danger to the open source goals, there are a few\nattempts to improve the situation. The Apache Software License (a permissive license), requires\ncode contributors to grant a patent license to all downstream recipients of the code\nto use the contributed code by itself or in combination with the project that it was contributed\nto and makes a possible patent holder lose its license rights should he nevertheless try to\nassert a patent against the thus licensed use. The (A)GPLv3 has a similar clause."),(0,o.kt)("p",null,"The ",(0,o.kt)("a",{parentName:"p",href:"https://www.openinventionnetwork.com/"},"Open Invention Network")," (OIN) has a meanwhile\nhuge patent pool that is cross-licensed between all participants and which can freely be used\nin a large list of covered open source software by everyone, except for those that raise patent\nviolation claims against any of the covered open source projects. This basically restricts\nthose patents to be only used defensively in the context of the covered open source projects."),(0,o.kt)("p",null,"Should SCS be in a position to make inventions that should be protected by a software patent,\nit pledges to contribute these to the OIN pool."),(0,o.kt)("h2",{id:"copyright-assignments-and-contributor-license-agreements"},"Copyright Assignments and Contributor License Agreements"),(0,o.kt)("p",null,"Very few Open Source projects require copyright assignment; the GNU projects are the\nonly commonly used ones that the author is aware of. This results in fully centralized\ncopyright ownership. This puts the FSF into a very\nstrong position \u2014 a position to enforce copyright, to change licenses etc. This requires\na lot of trust towards the copyright assigneed."),(0,o.kt)("p",null,"Most open source projects prefer distributed copyright \u2014 the authors (or their\nemployers) retain the copyright to their works. They grant a license for the open\nsource project to use and integrate and redistribute the work \u2014 typically the\nlicense grant is extended to the public. In a sufficiently distributed copyright model,\nit is very hard to change a license, as all copyright holders would need to agree.\nThis can both be considered advantageous and disadvantageous."),(0,o.kt)("p",null,"Many software projects use ",(0,o.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Contributor_License_Agreement"},"Contributor License Agreements"),"\n(CLAs), documenting that contributed code grants certain rights to the project\nowner (a foundation or sometimes a company). This ensures that the project owner\nhas all needed rights to use, protect, redistribute ... the code. If the CLA contains\n",(0,o.kt)("em",{parentName:"p"},"copyright assignment"),", it also allows the project to change the license or to\ncreate derived works under a different license."),(0,o.kt)("p",null,"While this is advantageous for the project owner, it is not necessarily advantageous for the\ncode contributor."),(0,o.kt)("p",null,"Copyright enforcement does not require all copyrights to be held by a legal entity. Any holder\nof significant copyrights can actually enforce it against violators."),(0,o.kt)("p",null,"The Linux kernel and an increasing number of projects do not work with copyright assignments\nnor CLAs, but with ",(0,o.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Developer_Certificate_of_Origin"},"Developer Certificates of Origin"),"\n(DCO \u2014 the signed-off lines of kernel commits). This is deemed sufficient to document the origin and the authorization to\ncontribute code."),(0,o.kt)("p",null,"The SCS project will not change the license. There however might be cases, where potential users\ncan not consume AGPL'ed or LGPL'ed code (due to corporate policies, e.g. based on bad experience,\nimmature license governance practices or lawyers that panic). Our goal would be to ensure that our\nlicensing terms and all other pledges provide the assurance needed that users do not need to be\nafraid of the AGPL. The cure provisions from v3 of the GPL license family actually also help to\navoid unnecessary fear. However, unfortunately, some \"open source\" companies in the past have\nabused copyleft with a scare and sell a proprietary license tactics to make money, which has\nhurt copyleft acceptance significantly. We might thus not be successful and need to somehow\naccept not serving all users or come up with a relicensing scheme that can not corrupt\nourselves. We are following the copyleft-next discussion to work out how we can best achieve\nthis, but have not yet found the silver bullet. This might have an influence how we do DCOs,\nmaybe under a permissive license, or maybe need to use CLAs."),(0,o.kt)("h2",{id:"license-in--license-out"},"License in = License out"),(0,o.kt)("p",null,"It is best practice that open source projects grant their downstream users the same\nlicense rights as they received contributions under. Or worded the opposite direction:\nIt is best practice to require no more rights to be granted from upstream contributors\n(in the CLA or DCO) than the projects grants to downstream consumers of the project.\nSCS follows this best practice."),(0,o.kt)("h2",{id:"further-reading"},"Further reading"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://en.wikipedia.org/wiki/Comparison_of_free_and_open-source_software_licences"},"https://en.wikipedia.org/wiki/Comparison_of_free_and_open-source_software_licences")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://en.wikipedia.org/wiki/Software_patents_and_free_software"},"https://en.wikipedia.org/wiki/Software_patents_and_free_software")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://joinup.ec.europa.eu/collection/eupl/matrix-eupl-compatible-open-source-licences"},"https://joinup.ec.europa.eu/collection/eupl/matrix-eupl-compatible-open-source-licences")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://lwn.net/Articles/592503/"},"https://lwn.net/Articles/592503/")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://sfconservancy.org/blog/2020/jan/06/copyleft-equality/"},"https://sfconservancy.org/blog/2020/jan/06/copyleft-equality/")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://developercertificate.org"},"https://developercertificate.org")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://julien.ponge.org/blog/developer-certificate-of-origin-versus-contributor-license-agreements/"},"https://julien.ponge.org/blog/developer-certificate-of-origin-versus-contributor-license-agreements/"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/cf2bf9cf.f4845141.js b/assets/js/cf2bf9cf.f4845141.js new file mode 100644 index 0000000000..6610df984d --- /dev/null +++ b/assets/js/cf2bf9cf.f4845141.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1085],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>g});var i=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,i)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?r(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):r(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function s(e,t){if(null==e)return{};var a,i,n=function(e,t){if(null==e)return{};var a,i,n={},r=Object.keys(e);for(i=0;i<r.length;i++)a=r[i],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(i=0;i<r.length;i++)a=r[i],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var l=i.createContext({}),m=function(e){var t=i.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},p=function(e){var t=m(e.components);return i.createElement(l.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},c=i.forwardRef((function(e,t){var a=e.components,n=e.mdxType,r=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=m(a),c=n,g=u["".concat(l,".").concat(c)]||u[c]||d[c]||r;return a?i.createElement(g,o(o({ref:t},p),{},{components:a})):i.createElement(g,o({ref:t},p))}));function g(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var r=a.length,o=new Array(r);o[0]=c;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:n,o[1]=s;for(var m=2;m<r;m++)o[m]=a[m];return i.createElement.apply(null,o)}return i.createElement.apply(null,a)}c.displayName="MDXCreateElement"},49395:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>r,metadata:()=>s,toc:()=>m});var i=a(87462),n=(a(67294),a(3905));const r={sidebar_label:"Image Manager",sidebar_position:50},o="Image Manager",s={unversionedId:"iaas/guides/operations-guide/openstack/day2-operations/image-manager",id:"iaas/guides/operations-guide/openstack/day2-operations/image-manager",title:"Image Manager",description:"The OpenStack Image Manager is a tool for managing all images on an OpenStack environment",source:"@site/docs/02-iaas/guides/operations-guide/openstack/day2-operations/image-manager.md",sourceDirName:"02-iaas/guides/operations-guide/openstack/day2-operations",slug:"/iaas/guides/operations-guide/openstack/day2-operations/image-manager",permalink:"/docs/iaas/guides/operations-guide/openstack/day2-operations/image-manager",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/operations-guide/openstack/day2-operations/image-manager.md",tags:[],version:"current",sidebarPosition:50,frontMatter:{sidebar_label:"Image Manager",sidebar_position:50},sidebar:"docs",previous:{title:"Day-2 Operations",permalink:"/docs/iaas/guides/operations-guide/openstack/day2-operations/"},next:{title:"Flavor Manager",permalink:"/docs/iaas/guides/operations-guide/openstack/day2-operations/flavor-manager"}},l={},m=[{value:"Requirements",id:"requirements",level:2},{value:"OpenStack Image Service (Glance)",id:"openstack-image-service-glance",level:3},{value:"Object storage backend",id:"object-storage-backend",level:3},{value:"Getting started",id:"getting-started",level:2},{value:"Image definitions",id:"image-definitions",level:2},{value:"SCS image standard",id:"scs-image-standard",level:3},{value:"Image with regular rebuilds",id:"image-with-regular-rebuilds",level:3},{value:"Image without regular rebuild",id:"image-without-regular-rebuild",level:3},{value:"Other properties",id:"other-properties",level:3},{value:"Image properties",id:"image-properties",level:4},{value:"Image tags",id:"image-tags",level:4},{value:"image status",id:"image-status",level:4},{value:"Image visibility",id:"image-visibility",level:4},{value:"Usage",id:"usage",level:2},{value:"Mirroring images",id:"mirroring-images",level:3},{value:"Updating images",id:"updating-images",level:3}],p={toc:m},u="wrapper";function d(e){let{components:t,...a}=e;return(0,n.kt)(u,(0,i.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"image-manager"},"Image Manager"),(0,n.kt)("p",null,"The OpenStack Image Manager is a tool for managing all images on an OpenStack environment"),(0,n.kt)("h2",{id:"requirements"},"Requirements"),(0,n.kt)("p",null,"This information is only relevant for the operator of an OpenStack environment. You can skip this section if\nyou want to use OpenStack Image Manager as a normal user and you are not an operator of an openStack environment."),(0,n.kt)("h3",{id:"openstack-image-service-glance"},"OpenStack Image Service (Glance)"),(0,n.kt)("p",null,"The OpenStack Image Service (Glance) is required to upload and discover data assets that are used by other\nservices."),(0,n.kt)("p",null,"Since this script stores many images in a single project, the Glance quota must be set accordingly high or to unlimited."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ini"},"[DEFAULT]\nuser_storage_quota = 1TB\n")),(0,n.kt)("p",null,"With most storage backends it makes sense to convert the imported images directly to RAW. So it is required for using Ceph and it's\nfeatures too. Recited from the Ceph documentation ",(0,n.kt)("a",{parentName:"p",href:"https://docs.ceph.com/en/latest/rbd/qemu-rbd/"},"QEMU and block devices")," and\n",(0,n.kt)("a",{parentName:"p",href:"https://docs.ceph.com/en/latest/rbd/rbd-openstack/"},"Block devices and OpenStack"),"."),(0,n.kt)("blockquote",null,(0,n.kt)("p",{parentName:"blockquote"},'"The raw data format is really the only sensible format option to use with RBD. Technically, you could use other QEMU-supported formats\n(such as qcow2 or vmdk), but doing so would add additional overhead, and would also render the volume unsafe for virtual machine live\nmigration when caching (see below) is enabled."'),(0,n.kt)("p",{parentName:"blockquote"},'"Important Ceph doesn\'t support QCOW2 for hosting a virtual machine disk. Thus if you want to boot virtual machines in Ceph (ephemeral\nbackend or boot from volume), the Glance image format must be RAW."')),(0,n.kt)("p",null,"This requires the following parameter for the image import workflow."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ini"},"[taskflow_executor]\nconversion_format = raw\n\n[image_import_opts]\nimage_import_plugins = ['image_decompression', 'image_conversion']\n\n[image_conversion]\noutput_format = raw\n")),(0,n.kt)("blockquote",null,(0,n.kt)("p",{parentName:"blockquote"},"See ",(0,n.kt)("a",{parentName:"p",href:"https://docs.openstack.org/glance/latest/configuration/sample-configuration.html"},"OpenStack Glance documentation"),"\nfor more details.")),(0,n.kt)("h3",{id:"object-storage-backend"},"Object storage backend"),(0,n.kt)("p",null,"If the mirror functionality is used, an object storage backend is required. The use of the mirror functionality\nis optional and is not used by default."),(0,n.kt)("h2",{id:"getting-started"},"Getting started"),(0,n.kt)("p",null,"This ",(0,n.kt)("strong",{parentName:"p"},"Getting started")," will upload a private image to your OpenStack environment with\nthe help of the OpenStack Image Manager."),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"Install the ",(0,n.kt)("inlineCode",{parentName:"p"},"openstack-image-manager")," package with ",(0,n.kt)("inlineCode",{parentName:"p"},"pip"),"."),(0,n.kt)("pre",{parentName:"li"},(0,n.kt)("code",{parentName:"pre",className:"language-sh"},"pip3 install openstack-image-manager\n"))),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"Create a image definition in the file ",(0,n.kt)("inlineCode",{parentName:"p"},"getting-started.yml")," in the local directory ",(0,n.kt)("inlineCode",{parentName:"p"},"images"),"."),(0,n.kt)("pre",{parentName:"li"},(0,n.kt)("code",{parentName:"pre",className:"language-yaml"},"---\nimages:\n - name: MyCirros\n format: qcow2\n login: cirros\n password: gocubsgo\n min_disk: 1\n min_ram: 32\n status: active\n visibility: private\n multi: false\n meta:\n architecture: x86_64\n hw_disk_bus: scsi\n hw_rng_model: virtio\n hw_scsi_model: virtio-scsi\n hw_watchdog_action: reset\n os_distro: cirros\n replace_frequency: never\n uuid_validity: none\n provided_until: none\n tags: []\n versions:\n - version: '0.6.0'\n url: https://github.com/cirros-dev/cirros/releases/download/0.6.0/cirros-0.6.0-x86_64-disk.img\n checksum: \"sha256:94e1e2c94dbbae7d4bdc38e68590a1daf73c9de2d03dd693857b4b0a042548e8\"\n build_date: 2022-09-28\n"))),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"Run the OpenStack Image Manager. It is assumed that a profile with the name ",(0,n.kt)("inlineCode",{parentName:"p"},"openstack")," exists in the\n",(0,n.kt)("a",{parentName:"p",href:"https://docs.openstack.org/python-openstackclient/latest/configuration/index.html#configuration-files"},"clouds.yaml"),"."),(0,n.kt)("pre",{parentName:"li"},(0,n.kt)("code",{parentName:"pre",className:"language-bash"},'openstack-image-manager --cloud openstack --filter ".*Cirr.*" --images images/\n')))),(0,n.kt)("h2",{id:"image-definitions"},"Image definitions"),(0,n.kt)("p",null,"The configuration consists of different parameter settings, such as values for\nminimum RAM or the visibility of the image. Have a look at the examples below\nfor all parameters. After a change to the configuration, validate it with\n",(0,n.kt)("inlineCode",{parentName:"p"},"tox -- --dry-run"),"."),(0,n.kt)("h3",{id:"scs-image-standard"},"SCS image standard"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"The value of ",(0,n.kt)("inlineCode",{parentName:"li"},"login")," is stored as ",(0,n.kt)("inlineCode",{parentName:"li"},"image_original_user")," in the metadata of an image."),(0,n.kt)("li",{parentName:"ul"},"If ",(0,n.kt)("inlineCode",{parentName:"li"},"image_description")," is not set as meta information, ",(0,n.kt)("inlineCode",{parentName:"li"},"image_description")," is set to the name of the image."),(0,n.kt)("li",{parentName:"ul"},"The value of ",(0,n.kt)("inlineCode",{parentName:"li"},"build_date")," of a specific version of an image is stored as ",(0,n.kt)("inlineCode",{parentName:"li"},"image_build_date")," in the metadata of an image."),(0,n.kt)("li",{parentName:"ul"},"The value of ",(0,n.kt)("inlineCode",{parentName:"li"},"url")," of a specific version of an image is stored as ",(0,n.kt)("inlineCode",{parentName:"li"},"image_source")," in the metadata of an image.")),(0,n.kt)("h3",{id:"image-with-regular-rebuilds"},"Image with regular rebuilds"),(0,n.kt)("p",null,"This type of image definition is used for images that are rebuilt at regular\nintervals. For example, this is the case for the daily builds of the Ubuntu\nimages."),(0,n.kt)("p",null,"The attribute ",(0,n.kt)("inlineCode",{parentName:"p"},"multi: true")," is set."),(0,n.kt)("p",null,"With this type of image definition, the version of the distribution (or product,\nwhatever is contained in the image) used is already in the name of the image\ndefinition. The ",(0,n.kt)("inlineCode",{parentName:"p"},"version")," properties from the definition's ",(0,n.kt)("inlineCode",{parentName:"p"},"versions")," list\nare appended only to older iterations of the image as timestamp suffixes\nin parentheses upon each rotation (except for the latest entry)."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-yaml"},"images:\n - name: Ubuntu 16.04\n format: qcow2\n login: ubuntu\n min_disk: 8\n min_ram: 512\n status: active\n visibility: public\n multi: true\n meta:\n architecture: x86_64\n hw_disk_bus: scsi\n hw_scsi_model: virtio-scsi\n hw_watchdog_action: reset\n os_distro: ubuntu\n os_version: '16.04'\n tags: []\n versions:\n - version: '20180928'\n url: https://cloud-images.ubuntu.com/xenial/20180928/xenial-server-cloudimg-amd64-disk1.img\n - version: '20181004'\n url: https://cloud-images.ubuntu.com/xenial/20181004/xenial-server-cloudimg-amd64-disk1.img\n")),(0,n.kt)("p",null,"This configuration creates the following images:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("strong",{parentName:"li"},"Ubuntu 16.04 (20180928)")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("strong",{parentName:"li"},"Ubuntu 16.04"))),(0,n.kt)("p",null,"If a newer build is added, the following rotation takes place:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("strong",{parentName:"li"},"Ubuntu 16.04 (20180928)")," does not change"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("strong",{parentName:"li"},"Ubuntu 16.04")," becomes ",(0,n.kt)("strong",{parentName:"li"},"Ubuntu 16.04 (20181004)")),(0,n.kt)("li",{parentName:"ul"},"the new image becomes ",(0,n.kt)("strong",{parentName:"li"},"Ubuntu 16.04"))),(0,n.kt)("p",null,"By default the last three images will be visible. When a fourth image is added, the visibility of\nthe last image in the list is changed to ",(0,n.kt)("inlineCode",{parentName:"p"},"community")," and the image can be deleted in the future."),(0,n.kt)("h3",{id:"image-without-regular-rebuild"},"Image without regular rebuild"),(0,n.kt)("p",null,"This type of image definition is used for images that are not rebuilt. For example,\nthis is the case for the flatcar images. For each release of Flatcar there is exactly\none image which will not be rebuilt in the future."),(0,n.kt)("p",null,"The attribute ",(0,n.kt)("inlineCode",{parentName:"p"},"multi: false")," is set."),(0,n.kt)("p",null,"With this type of image definition, the version of the distribution (or product,\nwhatever is contained in the image) used is not in the name of the image definition.\nInstead, the ",(0,n.kt)("inlineCode",{parentName:"p"},"version")," properties from the image definition's ",(0,n.kt)("inlineCode",{parentName:"p"},"versions")," list\nare appended as static version suffixes to the images' names."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-yaml"},"images:\n - name: RancherOS\n format: qcow2\n login: rancher\n min_disk: 8\n min_ram: 2048\n status: active\n visibility: public\n multi: false\n meta:\n architecture: x86_64\n hw_disk_bus: scsi\n hw_scsi_model: virtio-scsi\n hw_watchdog_action: reset\n tags: []\n versions:\n - version: '1.3.0'\n url: https://github.com/rancher/os/releases/download/v1.3.0/rancheros-openstack.img\n - version: '1.4.0'\n url: https://github.com/rancher/os/releases/download/v1.4.0/rancheros-openstack.img\n - version: '1.4.1'\n url: https://github.com/rancher/os/releases/download/v1.4.1/rancheros-openstack.img\n")),(0,n.kt)("p",null,"This configuration creates the following images:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("strong",{parentName:"li"},"RancherOS 1.3.0")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("strong",{parentName:"li"},"RancherOS 1.4.0")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("strong",{parentName:"li"},"RancherOS 1.4.1"))),(0,n.kt)("p",null,"If a new version is added, no rotation takes place. The new version is added\nas ",(0,n.kt)("strong",{parentName:"p"},"RancherOS x.y.z"),". Here also the visibility of older images is not changed."),(0,n.kt)("h3",{id:"other-properties"},"Other properties"),(0,n.kt)("h4",{id:"image-properties"},"Image properties"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Removal of properties is not yet possible"),(0,n.kt)("li",{parentName:"ul"},"URL, name and format can not be changed"),(0,n.kt)("li",{parentName:"ul"},"Any keys can be added to ",(0,n.kt)("inlineCode",{parentName:"li"},"meta"),", these will be added to the image"),(0,n.kt)("li",{parentName:"ul"},"Existing keys in ",(0,n.kt)("inlineCode",{parentName:"li"},"meta")," can be changed, the same applies to ",(0,n.kt)("inlineCode",{parentName:"li"},"min_disk"),"\nand ",(0,n.kt)("inlineCode",{parentName:"li"},"min_ram"))),(0,n.kt)("h4",{id:"image-tags"},"Image tags"),(0,n.kt)("h4",{id:"image-status"},"image status"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"deactivation: change ",(0,n.kt)("inlineCode",{parentName:"li"},"status")," to ",(0,n.kt)("inlineCode",{parentName:"li"},"deactivated")),(0,n.kt)("li",{parentName:"ul"},"reactivation: change ",(0,n.kt)("inlineCode",{parentName:"li"},"status")," to ",(0,n.kt)("inlineCode",{parentName:"li"},"active")," ")),(0,n.kt)("h4",{id:"image-visibility"},"Image visibility"),(0,n.kt)("p",null,"A full documentation about the visibility of images can be found in the ",(0,n.kt)("strong",{parentName:"p"},"Image visibility")," section in the\n",(0,n.kt)("a",{parentName:"p",href:"https://docs.openstack.org/api-ref/image/v2/index.html#general-information"},"OpenStack Image Service API Documentation"),"."),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"public: set ",(0,n.kt)("inlineCode",{parentName:"li"},"visibility")," to ",(0,n.kt)("inlineCode",{parentName:"li"},"public")),(0,n.kt)("li",{parentName:"ul"},"community: set ",(0,n.kt)("inlineCode",{parentName:"li"},"visibility")," to ",(0,n.kt)("inlineCode",{parentName:"li"},"community")),(0,n.kt)("li",{parentName:"ul"},"shared: set ",(0,n.kt)("inlineCode",{parentName:"li"},"visibility")," to ",(0,n.kt)("inlineCode",{parentName:"li"},"shared")),(0,n.kt)("li",{parentName:"ul"},"private: set ",(0,n.kt)("inlineCode",{parentName:"li"},"visibility")," to ",(0,n.kt)("inlineCode",{parentName:"li"},"private"))),(0,n.kt)("h2",{id:"usage"},"Usage"),(0,n.kt)("h3",{id:"mirroring-images"},"Mirroring images"),(0,n.kt)("p",null,"Since the upstreams often only keep their images for a short time, we mirror most of the images on REGIO.cloud.\nThis makes us independent of the availability of the images in the individual upstreams."),(0,n.kt)("h3",{id:"updating-images"},"Updating images"),(0,n.kt)("p",null,"Some of the images are automatically updated by a CI job. The latest available build at the time of the CI job execution is mirrored and\nmade available as the current version."),(0,n.kt)("p",null,"Currently, the following images are updated once a week (every Sunday at 0 am):"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Almalinux"),(0,n.kt)("li",{parentName:"ul"},"CentOS"),(0,n.kt)("li",{parentName:"ul"},"Debian"),(0,n.kt)("li",{parentName:"ul"},"Rockylinux"),(0,n.kt)("li",{parentName:"ul"},"Ubuntu")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/cffc493c.ba4544e9.js b/assets/js/cffc493c.ba4544e9.js new file mode 100644 index 0000000000..739efc19c7 --- /dev/null +++ b/assets/js/cffc493c.ba4544e9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4687],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>h});var o=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function c(e,t){if(null==e)return{};var n,o,r=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=o.createContext({}),l=function(e){var t=o.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=l(e.components);return o.createElement(s.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},m=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,s=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),d=l(n),m=r,h=d["".concat(s,".").concat(m)]||d[m]||u[m]||a;return n?o.createElement(h,i(i({ref:t},p),{},{components:n})):o.createElement(h,i({ref:t},p))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=m;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c[d]="string"==typeof e?e:r,i[1]=c;for(var l=2;l<a;l++)i[l]=n[l];return o.createElement.apply(null,i)}return o.createElement.apply(null,n)}m.displayName="MDXCreateElement"},22073:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>u,frontMatter:()=>a,metadata:()=>c,toc:()=>l});var o=n(87462),r=(n(67294),n(3905));const a={},i="Documentation workflow explanation",c={unversionedId:"contribute/docs-workflow-explanation",id:"contribute/docs-workflow-explanation",title:"Documentation workflow explanation",description:"The aim within this documentation is to have a good developer experience and a low entry barrier to start with SCS. For this to achieve we think all docs that define the SCS stack and have been developed by the SCS community should be within this documentation framework.",source:"@site/community/contribute/docs-workflow-explanation.md",sourceDirName:"contribute",slug:"/contribute/docs-workflow-explanation",permalink:"/community/contribute/docs-workflow-explanation",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"community",previous:{title:"Documentation Files Structure",permalink:"/community/contribute/doc-files-structure-guide"},next:{title:"Linting Guide",permalink:"/community/contribute/linting-guide"}},s={},l=[{value:"Information Architecture",id:"information-architecture",level:2}],p={toc:l},d="wrapper";function u(e){let{components:t,...n}=e;return(0,r.kt)(d,(0,o.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"documentation-workflow-explanation"},"Documentation workflow explanation"),(0,r.kt)("p",null,"The aim within this documentation is to have a good developer experience and a low entry barrier to start with SCS. For this to achieve we think all docs that define the SCS stack and have been developed by the SCS community should be within this documentation framework."),(0,r.kt)("h2",{id:"information-architecture"},"Information Architecture"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"All general docs are located within the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/docs"},"SovereignCloudStack/docs")," repository.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Docs that explain, guide or contextualize specific modules such as the openstack-image-manager or the k8s-cluster-api-provider reside within their repository in a seperate docs directory."))),(0,r.kt)("p",null,"Both, the general docs and docs of the external repositories are combined into the one unified documentation collection that is being rendered in a static page on ",(0,r.kt)("a",{parentName:"p",href:"https://docs.scs.community"},"https://docs.scs.community"),". In order to make this work we have developed a workflow that syncs all doc repositories and distills only the relevant markdown files."),(0,r.kt)("p",null,"The script is called ",(0,r.kt)("inlineCode",{parentName:"p"},"getDocs"),". It is a postinstall script and is executed after ",(0,r.kt)("inlineCode",{parentName:"p"},"npm install"),". This has the advantage to have the docs \u2013 coming from the cloud \u2013 in your local docusaurus development environment as well as in the build process."),(0,r.kt)("p",null,"You'll find the script in the root directory of the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/docs-page"},"SovereignCloudStack/docs-page")," repository:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-js",metastring:'title="getDocs.js"',title:'"getDocs.js"'},'const fs = require("fs");\nconst { execSync } = require("child_process");\n\n// Read the contents of the "docs.package.json" file and remove all whitespace\nconst reposJson = fs\n .readFileSync("./docs.package.json", "utf8")\n .replace(/\\s/g, "");\n\n// Parse the JSON and create an array of repositories\nconst repos = JSON.parse(reposJson);\nconst ghUrl = "https://github.com/";\n\n// Clone each repository, remove git folders and README files, and copy the docs to the target directory\nrepos.forEach((repo) => {\n const repoDir = `repo_to_be_edited/${repo.label}`;\n\n // Clone the repository\n const cloneCommand = `git clone ${ghUrl + repo.repo} ${repoDir}`;\n execSync(cloneCommand);\n\n // Remove git folders\n const removeGitCommand = `rm -rf ${repoDir}/.git`;\n execSync(removeGitCommand);\n\n // Remove README files\n const removeReadmeCommand = `find ${repoDir} -name "README.md" | xargs rm -f`;\n execSync(removeReadmeCommand);\n\n // Create the docusaurus subdirectory\n const subDirPath = `${repo.target}/${repo.label}`;\n fs.mkdirSync(subDirPath, { recursive: true });\n\n // Copy docs content from A to B\n const copyDocsCommand = `cp -r ${repoDir}/${repo.source} ${subDirPath}`;\n execSync(copyDocsCommand);\n\n // Remove the cloned repository\n const removeRepoCommand = "rm -rf repo_to_be_edited";\n execSync(removeRepoCommand);\n});\n')))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d078bc1c.9daaac60.js b/assets/js/d078bc1c.9daaac60.js new file mode 100644 index 0000000000..84105d4136 --- /dev/null +++ b/assets/js/d078bc1c.9daaac60.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7170],{19572:e=>{e.exports=JSON.parse('{"pluginId":"dev-docs","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"devDocs":[{"type":"link","label":"Documentation for SCS Developers","href":"/dev-docs/","docId":"index"},{"type":"category","label":"operations","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"iam","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Identity Federation in SCS","href":"/dev-docs/operations/iam/identity-federation-in-scs","docId":"operations/iam/identity-federation-in-scs"},{"type":"link","label":"OpenStack Federation via OpenID-Connect","href":"/dev-docs/operations/iam/openstack-federation-via-oidc","docId":"operations/iam/openstack-federation-via-oidc"}]},{"type":"category","label":"operations","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Zuul users guide","href":"/dev-docs/operations/operations/zuul-ci-cd-quickstart-user-guide","docId":"operations/operations/zuul-ci-cd-quickstart-user-guide"}]}]}]},"docs":{"index":{"id":"index","title":"Documentation for SCS Developers","description":"Welcome to the Dev Docs. This section is primarily for SCS Developers and will contain documentation regarding the Development and Architecture of the Sovereign Cloud Stack and its components. You will find documents, explanations and guides regarding the tooling necessary for the development of SCS.","sidebar":"devDocs"},"operations/iam/identity-federation-in-scs":{"id":"operations/iam/identity-federation-in-scs","title":"Identity Federation in SCS","description":"SovereignCloudStack wants to make it possible for operators to delegate","sidebar":"devDocs"},"operations/iam/openstack-federation-via-oidc":{"id":"operations/iam/openstack-federation-via-oidc","title":"OpenStack Federation via OpenID-Connect","description":"Keystone supports federating authentication and authorization decisions via several mechanisms","sidebar":"devDocs"},"operations/operations/zuul-ci-cd-quickstart-user-guide":{"id":"operations/operations/zuul-ci-cd-quickstart-user-guide","title":"Zuul users guide","description":"Prerequisites","sidebar":"devDocs"}}}')}}]); \ No newline at end of file diff --git a/assets/js/d0ee365b.c08542e5.js b/assets/js/d0ee365b.c08542e5.js new file mode 100644 index 0000000000..af7d8bbc7f --- /dev/null +++ b/assets/js/d0ee365b.c08542e5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4227],{3905:(e,n,t)=>{t.d(n,{Zo:()=>c,kt:()=>k});var a=t(67294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function o(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?i(Object(t),!0).forEach((function(n){r(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):i(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}function l(e,n){if(null==e)return{};var t,a,r=function(e,n){if(null==e)return{};var t,a,r={},i=Object.keys(e);for(a=0;a<i.length;a++)t=i[a],n.indexOf(t)>=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)t=i[a],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var s=a.createContext({}),p=function(e){var n=a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):o(o({},n),e)),t},c=function(e){var n=p(e.components);return a.createElement(s.Provider,{value:n},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},h=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,i=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),d=p(t),h=r,k=d["".concat(s,".").concat(h)]||d[h]||m[h]||i;return t?a.createElement(k,o(o({ref:n},c),{},{components:t})):a.createElement(k,o({ref:n},c))}));function k(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var i=t.length,o=new Array(i);o[0]=h;var l={};for(var s in n)hasOwnProperty.call(n,s)&&(l[s]=n[s]);l.originalType=e,l[d]="string"==typeof e?e:r,o[1]=l;for(var p=2;p<i;p++)o[p]=t[p];return a.createElement.apply(null,o)}return a.createElement.apply(null,t)}h.displayName="MDXCreateElement"},17296:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var a=t(87462),r=(t(67294),t(3905));const i={sidebar_label:"OpenStack",sidebar_position:50},o="OpenStack",l={unversionedId:"iaas/guides/configuration-guide/openstack/index",id:"iaas/guides/configuration-guide/openstack/index",title:"OpenStack",description:"Network interfaces",source:"@site/docs/02-iaas/guides/configuration-guide/openstack/index.md",sourceDirName:"02-iaas/guides/configuration-guide/openstack",slug:"/iaas/guides/configuration-guide/openstack/",permalink:"/docs/iaas/guides/configuration-guide/openstack/",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/configuration-guide/openstack/index.md",tags:[],version:"current",sidebarPosition:50,frontMatter:{sidebar_label:"OpenStack",sidebar_position:50},sidebar:"docs",previous:{title:"Ceph",permalink:"/docs/iaas/guides/configuration-guide/ceph"},next:{title:"Horizon",permalink:"/docs/iaas/guides/configuration-guide/openstack/horizon"}},s={},p=[{value:"Network interfaces",id:"network-interfaces",level:2},{value:"How does the configuration get into services?",id:"how-does-the-configuration-get-into-services",level:2}],c={toc:p},d="wrapper";function m(e){let{components:n,...t}=e;return(0,r.kt)(d,(0,a.Z)({},c,t,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"openstack"},"OpenStack"),(0,r.kt)("h2",{id:"network-interfaces"},"Network interfaces"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"Parameter")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"Default")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"Description")))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"network_interface")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"eth0")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"neutron_external_interface")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"{{ network_interface }}")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"kolla_external_vip_interface")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"{{ network_interface }}")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"api_interface")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"{{ network_interface }}")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"migration_interface")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"{{ api_interface }}")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"tunnel_interface")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"{{ network_interface }}")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"octavia_network_interface")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"{{ 'o-hm0' if octavia_network_type == 'tenant' else api_interface }}")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"dns_interface")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"{{ network_interface }}")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"dpdk_tunnel_interface")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"{{ neutron_external_interface }}")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"ironic_http_interface")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"{{ api_interface }}")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"ironic_tftp_interface")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"{{ api_interface }}")),(0,r.kt)("td",{parentName:"tr",align:null})))),(0,r.kt)("h2",{id:"how-does-the-configuration-get-into-services"},"How does the configuration get into services?"),(0,r.kt)("p",null,"It is explained with example of OpenSearch Service how the configuration for OpenSearch\nis created and gets into the container."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"The task ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/openstack/kolla-ansible/blob/master/ansible/roles/opensearch/tasks/config.yml"},"Copying over opensearch service config file"),"\nmerges the individual sources of the files."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-yaml",metastring:'title="Copying over opensearch service config file task"',title:'"Copying',over:!0,opensearch:!0,service:!0,config:!0,file:!0,'task"':!0},'- name: Copying over opensearch service config file\n merge_yaml:\n sources:\n # highlight-start\n- "{{ role_path }}/templates/opensearch.yml.j2"\n- "{{ node_custom_config }}/opensearch.yml"\n- "{{ node_custom_config }}/opensearch/opensearch.yml"\n- "{{ node_custom_config }}/opensearch/{{ inventory_hostname }}/opensearch.yml"\n # highlight-end\n dest: "{{ node_config_directory }}/opensearch/opensearch.yml"\n mode: "0660"\n become: true\n when:\n - inventory_hostname in groups[\'opensearch\']\n - opensearch_services[\'opensearch\'].enabled | bool\n notify:\n - Restart opensearch container\n'))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"As a basis a template ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/openstack/kolla-ansible/blob/master/ansible/roles/opensearch/templates/opensearch.yml.j2"},"opensearch.yml.j2"),"\nis used which is part of the OpenSearch service role."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-yaml",metastring:'title="opensearch.yml.j2 template"',title:'"opensearch.yml.j2','template"':!0},"{% set num_nodes = groups['opensearch'] | length %}\n{% set recover_after_nodes = (num_nodes * 2 / 3) | round(0, 'floor') | int if num_nodes > 1 else 1 %}\nplugins.security.disabled: \"true\"\n\nnode.name: \"{{ 'api' | kolla_address | put_address_in_context('url') }}\"\nnetwork.host: \"{{ 'api' | kolla_address | put_address_in_context('url') }}\"\n\ncluster.name: \"{{ opensearch_cluster_name }}\"\ncluster.initial_master_nodes: [{% for host in groups['opensearch'] %}\"{{ 'api' | kolla_address(host) }}\"{% if not loop.last %},{% endif %}{% endfor %}]\nnode.master: true\nnode.data: true\ndiscovery.seed_hosts: [{% for host in groups['opensearch'] %}\"{{ 'api' | kolla_address(host) | put_address_in_context('url') }}\"{% if not loop.last %},{% endif %}{% endfor %}]\n\nhttp.port: {{ opensearch_port }}\ngateway.expected_nodes: {{ num_nodes }}\ngateway.recover_after_time: \"5m\"\ngateway.recover_after_nodes: {{ recover_after_nodes }}\npath.data: \"/var/lib/opensearch/data\"\npath.logs: \"/var/log/kolla/opensearch\"\nindices.fielddata.cache.size: 40%\naction.auto_create_index: \"true\"\n"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"For OpenSearch, overlay files can additionally be stored in 3 places in the configuration repository."),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"environments/kolla/files/overlays/opensearch.yml")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"environments/kolla/files/overlays/opensearch/opensearch.yml")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"environments/kolla/files/overlays/opensearch/{{ inventory_hostname }}/opensearch.yml"))),(0,r.kt)("p",{parentName:"li"},"When merging files, the last file found has the most weight. If there is a parameter ",(0,r.kt)("inlineCode",{parentName:"p"},"node.master: true"),"\nin the service role template ",(0,r.kt)("inlineCode",{parentName:"p"},"opensearch.yml.j2")," of the OpenSearch service and you set e.g.\n",(0,r.kt)("inlineCode",{parentName:"p"},"node.master: false")," in ",(0,r.kt)("inlineCode",{parentName:"p"},"environments/kolla/files/overlays/opensearch.yml")," then accordingly in the finished ",(0,r.kt)("inlineCode",{parentName:"p"},"opensearch.yml"),"\n",(0,r.kt)("inlineCode",{parentName:"p"},"node.master: false")," is used.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"After the merge the task ",(0,r.kt)("inlineCode",{parentName:"p"},"Copying over opensearch service config file")," copies the content into the\nconfiguration directory ",(0,r.kt)("inlineCode",{parentName:"p"},"/etc/kolla/opensearch")," of the service."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-yaml",metastring:'title="/etc/kolla/opensearch/opensearch.yml"',title:'"/etc/kolla/opensearch/opensearch.yml"'},"action.auto_create_index: 'true'\ncluster.initial_master_nodes:\n- 192.168.16.10\ncluster.name: kolla_logging\ndiscovery.seed_hosts:\n- 192.168.16.10\ngateway.expected_nodes: 1\ngateway.recover_after_nodes: 1\ngateway.recover_after_time: 5m\nhttp.port: 9200\nindices.fielddata.cache.size: 40%\nnetwork.host: 192.168.16.10\nnode.data: true\nnode.master: true\nnode.name: 192.168.16.10\npath.data: /var/lib/opensearch/data\npath.logs: /var/log/kolla/opensearch\nplugins.security.disabled: 'true'\n"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"The configuration directory ",(0,r.kt)("inlineCode",{parentName:"p"},"/etc/kolla/opensearch")," is mounted in each container of the OpenSearch service\nto ",(0,r.kt)("inlineCode",{parentName:"p"},"/var/lib/kolla/config_files"),"."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-json",metastring:'title="Output of docker inspect opensearch"',title:'"Output',of:!0,docker:!0,inspect:!0,'opensearch"':!0},'"Mounts": [\n {\n "Type": "bind",\n // highlight-start\n "Source": "/etc/kolla/opensearch",\n "Destination": "/var/lib/kolla/config_files",\n // highlight-end\n "Mode": "rw",\n "RW": true,\n "Propagation": "rprivate"\n },\n'))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Entrypoint of a service is always ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/openstack/kolla/blob/master/docker/base/start.sh"},"kolla_start"),".\nThis script calls a script ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/openstack/kolla/blob/master/docker/base/set_configs.py"},"set_configs.py"),".\nThis script takes care of copying files from ",(0,r.kt)("inlineCode",{parentName:"p"},"/var/lib/kolla/config_files")," to the right place inside the container.\nFor this purpose, the container has a\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/openstack/kolla-ansible/blob/master/ansible/roles/opensearch/templates/opensearch.json.j2"},"config.json"),"\nin which the individual actions are configured."),(0,r.kt)("p",{parentName:"li"},"The file ",(0,r.kt)("inlineCode",{parentName:"p"},"/var/lib/kolla/config_files/opensearch.yml")," is copied to ",(0,r.kt)("inlineCode",{parentName:"p"},"/etc/opensearch/opensearch.yml"),"."),(0,r.kt)("p",{parentName:"li"},"The permissions of ",(0,r.kt)("inlineCode",{parentName:"p"},"/var/lib/opensearch")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"/var/log/kolla/opensearch")," are set accordingly."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-json",metastring:'title="/etc/kolla/opensearch/config.json"',title:'"/etc/kolla/opensearch/config.json"'},'{\n "command": "/usr/share/opensearch/bin/opensearch",\n "config_files": [\n {\n // highlight-start\n "source": "/var/lib/kolla/config_files/opensearch.yml",\n "dest": "/etc/opensearch/opensearch.yml",\n "owner": "opensearch",\n "perm": "0600"\n // highlight-end\n }\n ],\n "permissions": [\n {\n // highlight-start\n "path": "/var/lib/opensearch",\n "owner": "opensearch:opensearch",\n "recurse": true\n // highlight-end\n },\n {\n // highlight-start\n "path": "/var/log/kolla/opensearch",\n "owner": "opensearch:opensearch",\n "recurse": true\n // highlight-end\n }\n ]\n}\n'))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"In the ",(0,r.kt)("inlineCode",{parentName:"p"},"config.json")," of the service is also defined the command which will be executed after finishing the preparations.\nIn the case of OpenSearch this is ",(0,r.kt)("inlineCode",{parentName:"p"},"/usr/share/opensearch/bin/opensearch"),"."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-json",metastring:'title="/etc/kolla/opensearch/config.json"',title:'"/etc/kolla/opensearch/config.json"'},'{\n // highlight-start\n "command": "/usr/share/opensearch/bin/opensearch",\n // highlight-end\n "config_files": [\n {\n "source": "/var/lib/kolla/config_files/opensearch.yml",\n "dest": "/etc/opensearch/opensearch.yml",\n "owner": "opensearch",\n "perm": "0600"\n }\n ],\n "permissions": [\n {\n "path": "/var/lib/opensearch",\n "owner": "opensearch:opensearch",\n "recurse": true\n },\n {\n "path": "/var/log/kolla/opensearch",\n "owner": "opensearch:opensearch",\n "recurse": true\n }\n ]\n}\n')))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d1aa920e.0ef065cf.js b/assets/js/d1aa920e.0ef065cf.js new file mode 100644 index 0000000000..104de50119 --- /dev/null +++ b/assets/js/d1aa920e.0ef065cf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6470],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>g});var n=r(67294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function s(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=n.createContext({}),p=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=p(e.components);return n.createElement(c.Provider,{value:t},e.children)},d="mdxType",l={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),d=p(r),f=o,g=d["".concat(c,".").concat(f)]||d[f]||l[f]||a;return r?n.createElement(g,i(i({ref:t},u),{},{components:r})):n.createElement(g,i({ref:t},u))}));function g(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=f;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[d]="string"==typeof e?e:o,i[1]=s;for(var p=2;p<a;p++)i[p]=r[p];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},66625:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>l,frontMatter:()=>a,metadata:()=>s,toc:()=>p});var n=r(87462),o=(r(67294),r(3905));const a={sidebar_label:"OpenStack",sidebar_position:60},i="OpenStack",s={unversionedId:"iaas/guides/operations-guide/openstack/index",id:"iaas/guides/operations-guide/openstack/index",title:"OpenStack",description:"",source:"@site/docs/02-iaas/guides/operations-guide/openstack/index.md",sourceDirName:"02-iaas/guides/operations-guide/openstack",slug:"/iaas/guides/operations-guide/openstack/",permalink:"/docs/iaas/guides/operations-guide/openstack/",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/operations-guide/openstack/index.md",tags:[],version:"current",sidebarPosition:60,frontMatter:{sidebar_label:"OpenStack",sidebar_position:60},sidebar:"docs",previous:{title:"Ceph",permalink:"/docs/iaas/guides/operations-guide/ceph"},next:{title:"Cinder",permalink:"/docs/iaas/guides/operations-guide/openstack/cinder"}},c={},p=[],u={toc:p},d="wrapper";function l(e){let{components:t,...r}=e;return(0,o.kt)(d,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"openstack"},"OpenStack"))}l.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d227faa6.82a9ebe7.js b/assets/js/d227faa6.82a9ebe7.js new file mode 100644 index 0000000000..4ac271f648 --- /dev/null +++ b/assets/js/d227faa6.82a9ebe7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3973],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>b});var n=r(67294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var u=n.createContext({}),c=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},s=function(e){var t=c(e.components);return n.createElement(u.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,u=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),p=c(r),h=o,b=p["".concat(u,".").concat(h)]||p[h]||m[h]||a;return r?n.createElement(b,i(i({ref:t},s),{},{components:r})):n.createElement(b,i({ref:t},s))}));function b(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=h;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[p]="string"==typeof e?e:o,i[1]=l;for(var c=2;c<a;c++)i[c]=r[c];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}h.displayName="MDXCreateElement"},27159:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>m,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var n=r(87462),o=(r(67294),r(3905));const a={},i="Branch Protection Rules",l={unversionedId:"github/branchprotection",id:"github/branchprotection",title:"Branch Protection Rules",description:"To protect our source code from unwanted changes, we enforce the following branch protection rules for all repositories within our GitHub organization:",source:"@site/community/github/branchprotection.md",sourceDirName:"github",slug:"/github/branchprotection",permalink:"/community/github/branchprotection",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"community",previous:{title:"Getting Started with Wavestack",permalink:"/community/cloud-resources/wavestack"},next:{title:"Developer Certificate of Origin + Licenses",permalink:"/community/github/dco-and-licenses"}},u={},c=[],s={toc:c},p="wrapper";function m(e){let{components:t,...r}=e;return(0,o.kt)(p,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"branch-protection-rules"},"Branch Protection Rules"),(0,o.kt)("p",null,"To protect our source code from unwanted changes, we enforce the following branch protection rules for all repositories within our ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack"},"GitHub organization"),":"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Require a pull request before merging into our default branch ",(0,o.kt)("inlineCode",{parentName:"li"},"main"),".",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"Require at least one approval before pull requests can be merged."),(0,o.kt)("li",{parentName:"ul"},"Dismiss stale pull request approvals when new commits are pushed"))),(0,o.kt)("li",{parentName:"ul"},"Require status checks to pass before merging",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"Require branches to be up to date before merging"),(0,o.kt)("li",{parentName:"ul"},"Status checks that are required:",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"/community/github/dco-and-licenses"},"DCO")))))),(0,o.kt)("li",{parentName:"ul"},"Do not allow bypassing the above settings")),(0,o.kt)("p",null,"The branch protection rules are rolled out by our ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/github-manager"},(0,o.kt)("inlineCode",{parentName:"a"},"github-manager"))," to ensure that all repositories use a consistent set of rules. Should you intend to propose changes to the above rules, please open a pull request against ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/github-manager/blob/main/orgs/SovereignCloudStack/data.yaml"},(0,o.kt)("inlineCode",{parentName:"a"},"orgs/SovereignCloudStack/data.yaml")),"."),(0,o.kt)("p",null,"Some repositories however do allow that the above rules are bypassed by the organization's owners, especially repositories that are used for public resources such as the website or the weekly digest."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d5256f0a.ead868d7.js b/assets/js/d5256f0a.ead868d7.js new file mode 100644 index 0000000000..09a56b1658 --- /dev/null +++ b/assets/js/d5256f0a.ead868d7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[570],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>g});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function s(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},i=Object.keys(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),l=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=l(e.components);return r.createElement(p.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,p=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),d=l(a),m=n,g=d["".concat(p,".").concat(m)]||d[m]||c[m]||i;return a?r.createElement(g,o(o({ref:t},u),{},{components:a})):r.createElement(g,o({ref:t},u))}));function g(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=m;var s={};for(var p in t)hasOwnProperty.call(t,p)&&(s[p]=t[p]);s.originalType=e,s[d]="string"==typeof e?e:n,o[1]=s;for(var l=2;l<i;l++)o[l]=a[l];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},54335:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>c,frontMatter:()=>i,metadata:()=>s,toc:()=>l});var r=a(87462),n=(a(67294),a(3905));const i={sidebar_label:"Manager",sidebar_position:10},o="Manager",s={unversionedId:"iaas/guides/upgrade-guide/manager",id:"iaas/guides/upgrade-guide/manager",title:"Manager",description:"Always read the release notes first to learn what has changed and what",source:"@site/docs/02-iaas/guides/upgrade-guide/manager.md",sourceDirName:"02-iaas/guides/upgrade-guide",slug:"/iaas/guides/upgrade-guide/manager",permalink:"/docs/iaas/guides/upgrade-guide/manager",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/upgrade-guide/manager.md",tags:[],version:"current",sidebarPosition:10,frontMatter:{sidebar_label:"Manager",sidebar_position:10},sidebar:"docs",previous:{title:"Upgrade Guide",permalink:"/docs/iaas/guides/upgrade-guide/"},next:{title:"Network",permalink:"/docs/iaas/guides/upgrade-guide/network"}},p={},l=[],u={toc:l},d="wrapper";function c(e){let{components:t,...a}=e;return(0,n.kt)(d,(0,r.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"manager"},"Manager"),(0,n.kt)("p",null,"Always read the release notes first to learn what has changed and what\nadjustments are necessary"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"Update the OSISM release in use in the configuration repository as described in\n",(0,n.kt)("a",{parentName:"p",href:"../configuration-guide/manager#stable-release"},"Configuration Guide > Manager > Stable release"),".")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"Update the configuration repository on the manager."),(0,n.kt)("pre",{parentName:"li"},(0,n.kt)("code",{parentName:"pre"},"osism apply configuration\n"))),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"Update the manager services on the manager."),(0,n.kt)("pre",{parentName:"li"},(0,n.kt)("code",{parentName:"pre"},"osism update manager\n")),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"If Ansible Vault was used to encrypt ",(0,n.kt)("inlineCode",{parentName:"li"},"environments/manager/secrets.yml"),", the parameter\n",(0,n.kt)("inlineCode",{parentName:"li"},"--ask-vault-pass")," is also appended."),(0,n.kt)("li",{parentName:"ul"},"If ",(0,n.kt)("inlineCode",{parentName:"li"},"osism update manager")," does not work yet, use ",(0,n.kt)("inlineCode",{parentName:"li"},"osism-update-manager")," instead.")))),(0,n.kt)("ol",{start:4},(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"Refresh the facts cache."),(0,n.kt)("pre",{parentName:"li"},(0,n.kt)("code",{parentName:"pre"},"osism apply facts\n"))),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"If Traefik is used on the management plane (",(0,n.kt)("inlineCode",{parentName:"p"},"traefik_enable: true")," in ",(0,n.kt)("inlineCode",{parentName:"p"},"environments/infrastructure/configuration.yml"),")\nthen Traefik should also be upgraded directly."),(0,n.kt)("pre",{parentName:"li"},(0,n.kt)("code",{parentName:"pre"},"osism apply traefik\n")))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d59f7d52.7408da31.js b/assets/js/d59f7d52.7408da31.js new file mode 100644 index 0000000000..829012827a --- /dev/null +++ b/assets/js/d59f7d52.7408da31.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7701],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>h});var o=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,o,r=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var c=o.createContext({}),l=function(e){var t=o.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},d=function(e){var t=l(e.components);return o.createElement(c.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},m=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,c=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),p=l(n),m=r,h=p["".concat(c,".").concat(m)]||p[m]||u[m]||a;return n?o.createElement(h,s(s({ref:t},d),{},{components:n})):o.createElement(h,s({ref:t},d))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,s=new Array(a);s[0]=m;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[p]="string"==typeof e?e:r,s[1]=i;for(var l=2;l<a;l++)s[l]=n[l];return o.createElement.apply(null,s)}return o.createElement.apply(null,n)}m.displayName="MDXCreateElement"},20613:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>l});var o=n(87462),r=(n(67294),n(3905));const a={title:"Naming for domains/groups/roles/project when onboarding new customers",type:"Decision Record",status:"Draft",track:"IAM"},s=void 0,i={unversionedId:"scs-0301-v1-naming-conventions",id:"scs-0301-v1-naming-conventions",title:"Naming for domains/groups/roles/project when onboarding new customers",description:"\x3c!---",source:"@site/standards/scs-0301-v1-naming-conventions.md",sourceDirName:".",slug:"/scs-0301-v1-naming-conventions",permalink:"/standards/scs-0301-v1-naming-conventions",draft:!1,tags:[],version:"current",frontMatter:{title:"Naming for domains/groups/roles/project when onboarding new customers",type:"Decision Record",status:"Draft",track:"IAM"},sidebar:"standards",previous:{title:"SCS-0301",permalink:"/standards/standards/scs-0301"},next:{title:"SCS-0400",permalink:"/standards/standards/scs-0400"}},c={},l=[{value:"Introduction",id:"introduction",level:2},{value:"Motivation",id:"motivation",level:2},{value:"Design Considerations",id:"design-considerations",level:2},{value:"Options considered",id:"options-considered",level:3},{value:"PS approach to naming",id:"ps-approach-to-naming",level:4},{value:"<em>Option 2</em>",id:"option-2",level:4},{value:"Open questions",id:"open-questions",level:2},{value:"Decision",id:"decision",level:2},{value:"Related Documents",id:"related-documents",level:2},{value:"Conformance Tests",id:"conformance-tests",level:2}],d={toc:l},p="wrapper";function u(e){let{components:t,...n}=e;return(0,r.kt)(p,(0,o.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"introduction"},"Introduction"),(0,r.kt)("p",null,"When CSPs try to enroll a new customer they encounter themselves in\na situation where they have to choose names for the openstack domain,\nproject and user."),(0,r.kt)("h2",{id:"motivation"},"Motivation"),(0,r.kt)("p",null,"Create a naming convention to use during the provisioning of the users and\ngroups through an openstack domain."),(0,r.kt)("h2",{id:"design-considerations"},"Design Considerations"),(0,r.kt)("p",null,"OPTIONAL"),(0,r.kt)("h3",{id:"options-considered"},"Options considered"),(0,r.kt)("h4",{id:"ps-approach-to-naming"},"PS approach to naming"),(0,r.kt)("p",null,"For naming the customers the suggestion from PS is the following:"),(0,r.kt)("p",null,"A prefix will be use to differenciate domain, project and user in\nthe openstack environment. The project name is also added as a sufix."),(0,r.kt)("p",null,"So the onboaring tool will create the following structure for a new\ncustomer onboarded in the system."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-commandline"},"domain: d<customer_id>\nproject: p<customer_id>-<project_name>\nuser: u<customer_id>-<user_name>\n")),(0,r.kt)("p",null,'For the customer also a domain admin group and a project admin group are\ncreated. Please note that, at the time of writing, PCO is not making any\nuse of OpenStack domains to isolate customers. So, for the scope of this\ndocument, the term "domain admin" is used in a conceptual way rather than\nreferring to the specific OpenStack implementation. For the scope of this\ndocument "domain admins" can do things like creating projects, creating\nusers and granting users access to some projects (within the domain of\ncourse). "Users" can create and view resources within the projects that\nthey have been granted access to by the "domain admin".\nThese groups use the prefix "gd" for domain group and "gp" for group project\nand are build like the following:'),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-commandline"},"domain admin group: gd<customer_id>-member\nproject admin group: gp<customer_id>-<project_name>-member\n")),(0,r.kt)("p",null,"For the creation of a domain a new domain admin group is created."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-commandline"},"openstack domain create d000001\nopenstack group create gd000001-member\n")),(0,r.kt)("p",null,"When a project is created a new admin group for that project is created."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-commandline"},"openstack project create p000001-scs_dev_project\nopenstack group create p000001-scs_dev_project-member\n")),(0,r.kt)("p",null,"After the creation of a project it is necessary to assign roles to the\nnew groups."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-commandline"},"openstack role add --group gd000001-member --project p000001-scs_dev_project $role\nopenstack role add --group gp000001-scs_dev_project-member --project p000001-scs_dev_project $role\n")),(0,r.kt)("p",null,'For the creation of regular non admin users, the accounts will be added\nto the "domain admin" group to give them access to all projects within\nthe domain.'),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-commandline"},"openstack user created u000001-user1\nopenstack group add user gd000001-member u000001-user1\n")),(0,r.kt)("p",null,'In the case of machine accounts, they are only added to the specific\n"project admin" groups.'),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-commandline"},"openstack user created u000001-svc_user_project\nopenstack group add user gp000001-scs_dev_project-member u000001-svc_user_project\n")),(0,r.kt)("p",null,"In case of using federation, there are suggestions to the namings within Keycloak."),(0,r.kt)("p",null,'The realms in Keycloak for each customer would be the same as the customer. e.g. The Keycloak realm for "Customer A"\nwill be called "Customer A".'),(0,r.kt)("p",null,"There should be an OIDC client in each customer realm to allow the federation to the Proxy realm. Currently called OSISM\non the testbed."),(0,r.kt)("p",null,'On the proxy realm, it\'s needed to add this new customer realm as an idenity provider. During the creation of the identity\nprovider for "Customer A", the field "Alias" should be set to ',(0,r.kt)("inlineCode",{parentName:"p"},"<customer-id>"),'. This will make that the users federated from\nrealm "Customer A" to the proxy realm to be prefixed to avoid naming colisions, e.g. ',(0,r.kt)("inlineCode",{parentName:"p"},"d${ALIAS}-${CLAIM.preferred_username}"),"."),(0,r.kt)("p",null,"Also, on the identity federation there should be configured to store the ",(0,r.kt)("inlineCode",{parentName:"p"},"<customer-id>")," from that realm into the users. So it\ncan be send to Keystone mapping to use it as ",(0,r.kt)("inlineCode",{parentName:"p"},"gd<customer-id>-member")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"gp<customer-id>-<project_name>-member"),". There is\nalso the necessity of a mapper to send the ",(0,r.kt)("inlineCode",{parentName:"p"},"openstack-default-project"),"."),(0,r.kt)("p",null,"Add the aditional mappings for roles and groups as necessary to get the attributes from the customer realm into the OIDC\nuserinfo that is put into the OIDC to the proxy realm and from there to Keystone."),(0,r.kt)("h4",{id:"option-2"},(0,r.kt)("em",{parentName:"h4"},"Option 2")),(0,r.kt)("p",null,"Option 2 description"),(0,r.kt)("h2",{id:"open-questions"},"Open questions"),(0,r.kt)("p",null,"RECOMMENDED"),(0,r.kt)("h2",{id:"decision"},"Decision"),(0,r.kt)("p",null,"Decision"),(0,r.kt)("h2",{id:"related-documents"},"Related Documents"),(0,r.kt)("p",null,"Related Documents, OPTIONAL"),(0,r.kt)("h2",{id:"conformance-tests"},"Conformance Tests"),(0,r.kt)("p",null,"Conformance Tests, OPTIONAL"))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d5ac8ed7.92329f52.js b/assets/js/d5ac8ed7.92329f52.js new file mode 100644 index 0000000000..70e5ec3bb5 --- /dev/null +++ b/assets/js/d5ac8ed7.92329f52.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4521],{34886:s=>{s.exports=JSON.parse('{"label":"howto","permalink":"/blog/tags/howto","allTagsPath":"/blog/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/d6a104fd.5042bce1.js b/assets/js/d6a104fd.5042bce1.js new file mode 100644 index 0000000000..3a769d7642 --- /dev/null +++ b/assets/js/d6a104fd.5042bce1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2144],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>g});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=r.createContext({}),l=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=l(e.components);return r.createElement(c.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,c=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=l(n),m=a,g=u["".concat(c,".").concat(m)]||u[m]||d[m]||i;return n?r.createElement(g,o(o({ref:t},p),{},{components:n})):r.createElement(g,o({ref:t},p))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,o=new Array(i);o[0]=m;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[u]="string"==typeof e?e:a,o[1]=s;for(var l=2;l<i;l++)o[l]=n[l];return r.createElement.apply(null,o)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},84995:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>l});var r=n(87462),a=(n(67294),n(3905));const i={},o="Container registry configuration",s={unversionedId:"container/components/k8s-cluster-api-provider/doc/usage/containter-registry-configuration",id:"container/components/k8s-cluster-api-provider/doc/usage/containter-registry-configuration",title:"Container registry configuration",description:"Containerd as container runtime",source:"@site/docs/03-container/components/k8s-cluster-api-provider/doc/usage/containter-registry-configuration.md",sourceDirName:"03-container/components/k8s-cluster-api-provider/doc/usage",slug:"/container/components/k8s-cluster-api-provider/doc/usage/containter-registry-configuration",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/usage/containter-registry-configuration",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/03-container/components/k8s-cluster-api-provider/doc/usage/containter-registry-configuration.md",tags:[],version:"current",frontMatter:{}},c={},l=[{value:"Tutorial: configure an existing cluster to use containerd registry configuration",id:"tutorial-configure-an-existing-cluster-to-use-containerd-registry-configuration",level:2}],p={toc:l},u="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(u,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"container-registry-configuration"},"Container registry configuration"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://github.com/containerd/containerd"},"Containerd")," as container runtime\ninterface (CRI) used in the reference SCS KaaS implementation allows configuring its\nbehavior when it interacts with public or private container registry hosts. Container\nregistry hosts configuration options in containerd are well described in\nrelated ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/containerd/containerd/blob/main/docs/hosts.md"},"docs"),"."),(0,a.kt)("p",null,"This feature could be useful in various uses cases, e.g.:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Configure containerd to use a custom CA certificate when it interacts with a container\nregistry host that uses this CA"),(0,a.kt)("li",{parentName:"ul"},"Configure containerd to use some container registry mirror host instead of the target public or private container\nregistry.\nThis could be useful when the target container registry somehow restricts its clients e.g.\nDockerHub's pull rate limit to 100 pulls per 6 hours per IP address")),(0,a.kt)("p",null,"SCS KaaS reference implementation allows users to pass container registry host config\nfiles to configure containerd. Containerd configuration is applied cluster wide as it\nis CRI used in SCS KaaS clusters. Additional registry host config files for containerd\ncould be passed through the ",(0,a.kt)("inlineCode",{parentName:"p"},"containerd_registry_files")," terraform variable. This variable\nexpects an object with two attributes:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"hosts")," attribute defines additional registry host config files for containerd.\nThe filename should reference the registry host namespace. Files defined in this set\nwill be copied into the ",(0,a.kt)("inlineCode",{parentName:"li"},"/etc/containerd/certs.d")," directory on each workload cluster node"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"certs")," attribute defines additional client and/or CA certificate files needed for\ncontainerd authentication against registries defined by ",(0,a.kt)("inlineCode",{parentName:"li"},"hosts"),". Files defined in this\nset will be copied into the ",(0,a.kt)("inlineCode",{parentName:"li"},"/etc/containerd/certs")," directory on each workload cluster node")),(0,a.kt)("p",null,"The default value of the ",(0,a.kt)("inlineCode",{parentName:"p"},"containerd_registry_files")," variable instructs containerd to use\n",(0,a.kt)("inlineCode",{parentName:"p"},"registry.scs.community")," container registry instance as a public mirror of DockerHub\ncontainer registry, see related\nissue ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/k8s-cluster-api-provider/issues/417"},"#417"),".\nThe host config file used as a default is\ndefined ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/k8s-cluster-api-provider/blob/1b6ef9d4c64c94bc77144a072e0309d484de54be/terraform/files/containerd/docker.io"},"here"),".",(0,a.kt)("br",{parentName:"p"}),"\n","This should prevent issues with pull rate limiting from DockerHub public container registry,\ne.g. ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/k8s-cluster-api-provider/issues/414"},"#414"),"."),(0,a.kt)("p",null,"The above default value could be overridden using any techniques that Terraform allows, e.g.\nvia environment variable:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},'export TF_VAR_containerd_registry_files=\'{"hosts":["<path to the custom container registry host config>"], "certs":["<path to the custom CA or client certificate>"]}\'\n')),(0,a.kt)("p",null,"SCS container registry reference installation ",(0,a.kt)("a",{parentName:"p",href:"https://registry.scs.community"},"https://registry.scs.community"),' contains\nseveral pre-configured "proxy-cache" projects. These projects allow you to use SCS\ncontainer registry reference installation to proxy and cache images from target public\nregistries. This may reduce the load of overused public container registries and/or helps\nto avoid rate limiting by individual public registries.\nCurrently, SCS container registry is set up to "proxy-cache" the following public container registries:'),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"docker.io"),(0,a.kt)("li",{parentName:"ul"},"ghcr.io"),(0,a.kt)("li",{parentName:"ul"},"quay.io"),(0,a.kt)("li",{parentName:"ul"},"registry.gitlab.com"),(0,a.kt)("li",{parentName:"ul"},"registry.k8s.io")),(0,a.kt)("p",null,"Find also a corresponding ",(0,a.kt)("inlineCode",{parentName:"p"},"containerd")," registry host config files\nin ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/k8s-cluster-api-provider/tree/4dce164044a13b35a83690540088db2cd8457a8a/terraform/files/containerd"},"./terraform/files/containerd"),"\ndirectory. If you want to configure ",(0,a.kt)("inlineCode",{parentName:"p"},"containerd")," to use mentioned\npre-configured ",(0,a.kt)("a",{parentName:"p",href:"https://registry.scs.community"},"SCS container registry"),'\n"proxy cache" projects, feel free to do that e.g. as follows (path is relative to the ',(0,a.kt)("inlineCode",{parentName:"p"},"terraform")," directory):"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},'export TF_VAR_containerd_registry_files=\'{"hosts":["./files/containerd/docker.io", "./files/containerd/ghcr.io", "./files/containerd/quay.io", "./files/containerd/registry.gitlab.com", "./files/containerd/registry.k8s.io" ]}\'\n')),(0,a.kt)("p",null,"If you did not find your preferred public container registry in the list of pre-configured\n",(0,a.kt)("a",{parentName:"p",href:"https://registry.scs.community"},"SCS container registry"),' "proxy cache" projects, and you would like to use\nthe ',(0,a.kt)("a",{parentName:"p",href:"https://registry.scs.community"},"SCS container registry"),"\nas a mirror for it, please open an issue in one of the following\nrepositories: ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/k8s-cluster-api-provider"},"scs/k8s-cluster-api-provider"),",\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/k8s-harbor"},"scs/k8s-harbor"),"."),(0,a.kt)("h2",{id:"tutorial-configure-an-existing-cluster-to-use-containerd-registry-configuration"},"Tutorial: configure an existing cluster to use containerd registry configuration"),(0,a.kt)("p",null,"This tutorial is experimental and out of the usual release cycle. We recommend to\nupgrade existing environments (workload clusters) with stable releases which are properly\ntested."),(0,a.kt)("p",null,'This tutorial instructs (advanced) users what needs to be done on the cluster management\ninstance without re-deploying it via Terraform. Patches described in this tutorial\nmodify existing environment with changes that have been developed within "containerd registry"-related PRs:'),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"PR#432"),(0,a.kt)("li",{parentName:"ul"},"PR#447"),(0,a.kt)("li",{parentName:"ul"},"PR#472")),(0,a.kt)("p",null,"Warning: This tutorial causes a rolling update (rolling re-deployment) of the control plane and worker nodes."),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"Log in to the cluster management instance, pull remote changes, and then checkout to relevant commit that\nincludes all mentioned PRs."),(0,a.kt)("pre",{parentName:"li"},(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"cd k8s-cluster-api-provider/\ngit pull\ngit checkout b31a79db26c3956b473f026038e71e9aba7819b8\n"))),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"Backup the config directory of an existing cluster."),(0,a.kt)("pre",{parentName:"li"},(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"cd ..\ncp -R <CLUSTER_NAME> <CLUSTER_NAME>.bkp\n"))),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"Ensure that the directory for containerd registry configs exists and create a default containerd registry\nconfig file that instructs containerd to use registry.scs.community container registry\ninstance as a public mirror of DockerHub.\nOptionally, create another containerd container registry host file in the ",(0,a.kt)("inlineCode",{parentName:"p"},"containerd/hosts")," directory.\nYou can find working examples of those files ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/k8s-cluster-api-provider/tree/main/terraform/files/containerd"},"here"),"."),(0,a.kt)("pre",{parentName:"li"},(0,a.kt)("code",{parentName:"pre",className:"language-bash"},'cd <CLUSTER_NAME>\nmkdir -p containerd/hosts\ncat >containerd/hosts/docker.io <<EOF\nserver = "https://registry-1.docker.io"\n\n[host."https://registry.scs.community/v2/docker.io"]\n capabilities = ["pull"]\n override_path = true\nEOF\n# Optionally, create another containerd container registry host file here.\n'))),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"Injects containerd registry host file(s) (from point 3.) into ",(0,a.kt)("inlineCode",{parentName:"p"},"cluster-template.yaml"),".\nScript ",(0,a.kt)("inlineCode",{parentName:"p"},"configure_containerd.sh")," does the injection."),(0,a.kt)("pre",{parentName:"li"},(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"configure_containerd.sh cluster-template.yaml <CLUSTER_NAME>\n"))),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"Inject containerd configuration in ",(0,a.kt)("inlineCode",{parentName:"p"},"cluster-template.yaml"),". This configuration allows\ncontainerd to discover registry host file(s)."),(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Create ",(0,a.kt)("inlineCode",{parentName:"p"},"containerd_conf_append")," temp file"),(0,a.kt)("pre",{parentName:"li"},(0,a.kt)("code",{parentName:"pre",className:"language-bash"},'cat >containerd_conf_append <<EOF\ncat <<EOT >> /etc/containerd/config.toml\n[plugins."io.containerd.grpc.v1.cri".registry]\n config_path = "/etc/containerd/certs.d"\nEOT\nEOF\n'))),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Inject temp file and ",(0,a.kt)("inlineCode",{parentName:"p"},"systemctl restart containerd.service")," line into the ",(0,a.kt)("inlineCode",{parentName:"p"},"cluster-template.yaml")," (inplace)"),(0,a.kt)("pre",{parentName:"li"},(0,a.kt)("code",{parentName:"pre",className:"language-bash"},'yq \'select(.kind == "KubeadmControlPlane").spec.kubeadmConfigSpec.preKubeadmCommands |= (\n (.[] | select(. == "apt-get install -y ca-certificates socat*") | key + 1) as $pos |\n .[:$pos] +\n [load_str("containerd_conf_append")] +\n .[$pos:])\' -i cluster-template.yaml\n\nyq \'select(.kind == "KubeadmControlPlane").spec.kubeadmConfigSpec.preKubeadmCommands |= (\n (.[] | select(. == "systemctl daemon-reload") | key + 1) as $pos |\n .[:$pos] +\n ["systemctl restart containerd.service"] +\n .[$pos:])\' -i cluster-template.yaml\n\nyq \'select(.kind == "KubeadmConfigTemplate").spec.template.spec.preKubeadmCommands |= (\n (.[] | select(. == "apt-get install -y ca-certificates socat*") | key + 1) as $pos |\n .[:$pos] +\n [load_str("containerd_conf_append")] +\n .[$pos:])\' -i cluster-template.yaml\n\nyq \'select(.kind == "KubeadmConfigTemplate").spec.template.spec.preKubeadmCommands |= (\n (.[] | select(. == "systemctl daemon-reload") | key + 1) as $pos |\n .[:$pos] +\n ["systemctl restart containerd.service"] +\n .[$pos:])\' -i cluster-template.yaml\n'))))),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"The above changes (when point 8. will be applied) of ",(0,a.kt)("inlineCode",{parentName:"p"},"KubeadmControlPlane")," will cause a rolling update of control plane nodes.\nAs the ",(0,a.kt)("inlineCode",{parentName:"p"},"KubeadmConfigTemplate")," has been adjusted we need to increase the generation\ncounter of worker machines to ensure that the worker nodes will be rolling updated as well."),(0,a.kt)("pre",{parentName:"li"},(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"sed -r 's/(^WORKER_MACHINE_GEN: genw)([0-9][0-9])/printf \"\\1%02d\" $((\\2+1))/ge' -i clusterctl.yaml\n"))),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"Workaround: If your environment contains nginx ingress deployed via k8s-cluster-api-provider\n(variable DEPLOY_NGINX_INGRESS=true) disable its update. Nginx-ingress controller has\nbeen updated to version 1.8.0 in PR#440 and later to 1.8.1. This is a breaking change that includes updates\nof immutable fields. If the above is the case skip this update as follows:"),(0,a.kt)("pre",{parentName:"li"},(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"sed 's/DEPLOY_NGINX_INGRESS: true/DEPLOY_NGINX_INGRESS: false/g' -i clusterctl.yaml\n"))),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"Update the existing cluster."),(0,a.kt)("pre",{parentName:"li"},(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"create_cluster.sh test1\n")))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d755aabc.ad59fddc.js b/assets/js/d755aabc.ad59fddc.js new file mode 100644 index 0000000000..4f1c2dec5a --- /dev/null +++ b/assets/js/d755aabc.ad59fddc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2199],{42318:s=>{s.exports=JSON.parse('{"title":"SCS-0213","slug":"standards/scs-0213","permalink":"/standards/standards/scs-0213","navigation":{"previous":{"title":"Requirements for container registry","permalink":"/standards/scs-0212-v1-requirements-for-container-registry"},"next":{"title":"Kubernetes Nodes Anti Affinity","permalink":"/standards/scs-0213-v1-k8s-nodes-anti-affinity"}}}')}}]); \ No newline at end of file diff --git a/assets/js/d770ad8d.52adb3ce.js b/assets/js/d770ad8d.52adb3ce.js new file mode 100644 index 0000000000..31d23c4a11 --- /dev/null +++ b/assets/js/d770ad8d.52adb3ce.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3438],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>g});var a=r(67294);function s(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?n(Object(r),!0).forEach((function(t){s(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):n(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,a,s=function(e,t){if(null==e)return{};var r,a,s={},n=Object.keys(e);for(a=0;a<n.length;a++)r=n[a],t.indexOf(r)>=0||(s[r]=e[r]);return s}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(a=0;a<n.length;a++)r=n[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(s[r]=e[r])}return s}var l=a.createContext({}),c=function(e){var t=a.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},p=function(e){var t=c(e.components);return a.createElement(l.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,s=e.mdxType,n=e.originalType,l=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=c(r),d=s,g=u["".concat(l,".").concat(d)]||u[d]||m[d]||n;return r?a.createElement(g,o(o({ref:t},p),{},{components:r})):a.createElement(g,o({ref:t},p))}));function g(e,t){var r=arguments,s=t&&t.mdxType;if("string"==typeof e||s){var n=r.length,o=new Array(n);o[0]=d;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[u]="string"==typeof e?e:s,o[1]=i;for(var c=2;c<n;c++)o[c]=r[c];return a.createElement.apply(null,o)}return a.createElement.apply(null,r)}d.displayName="MDXCreateElement"},89535:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>m,frontMatter:()=>n,metadata:()=>i,toc:()=>c});var a=r(87462),s=(r(67294),r(3905));const n={},o="Migration to ClusterClass",i={unversionedId:"container/components/k8s-cluster-api-provider/doc/usage/migrate-to-cluster-class",id:"container/components/k8s-cluster-api-provider/doc/usage/migrate-to-cluster-class",title:"Migration to ClusterClass",description:"From #600, this repository uses CAPI",source:"@site/docs/03-container/components/k8s-cluster-api-provider/doc/usage/migrate-to-cluster-class.md",sourceDirName:"03-container/components/k8s-cluster-api-provider/doc/usage",slug:"/container/components/k8s-cluster-api-provider/doc/usage/migrate-to-cluster-class",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/usage/migrate-to-cluster-class",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/03-container/components/k8s-cluster-api-provider/doc/usage/migrate-to-cluster-class.md",tags:[],version:"current",frontMatter:{}},l={},c=[{value:"Migration",id:"migration",level:2},{value:"Prerequisites",id:"prerequisites",level:3},{value:"Steps",id:"steps",level:3}],p={toc:c},u="wrapper";function m(e){let{components:t,...r}=e;return(0,s.kt)(u,(0,a.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,s.kt)("h1",{id:"migration-to-clusterclass"},"Migration to ClusterClass"),(0,s.kt)("p",null,"From ",(0,s.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/k8s-cluster-api-provider/pull/600"},"#600"),", this repository uses CAPI\n",(0,s.kt)("a",{parentName:"p",href:"https://cluster-api.sigs.k8s.io/tasks/experimental-features/cluster-class/"},"ClusterClass")," feature for the creation of\nnew clusters, additionally see k8s ",(0,s.kt)("a",{parentName:"p",href:"https://kubernetes.io/blog/2021/10/08/capi-clusterclass-and-managed-topologies/"},"blog"),".\nThis feature is also used e.g. in the SCS ",(0,s.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/cluster-stacks"},"cluster-stacks")," repository."),(0,s.kt)("blockquote",null,(0,s.kt)("p",{parentName:"blockquote"},"Note: For now, ClusterClass is created per Cluster, which is not optimal and most likely it can be improved.")),(0,s.kt)("p",null,"Therefore, existing clusters must be migrated from 'old' cluster templates to 'new' cluster class based templates.\nBased on ClusterClass ",(0,s.kt)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api/blob/main/docs/proposals/20210526-cluster-class-and-managed-topologies.md#upgrade-strategy"},"proposal"),"\nof update strategy, we shouldn't be able to migrate, but in CAPI PR ",(0,s.kt)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api/pull/6292"},"#6292"),"\nthe validation webhook was relaxed (via special Cluster annotation\n",(0,s.kt)("strong",{parentName:"p"},"unsafe.topology.cluster.x-k8s.io/disable-update-class-name-check"),") and manual migration is now possible."),(0,s.kt)("p",null,"The script ",(0,s.kt)("inlineCode",{parentName:"p"},"migrate-to-cluster-class.sh")," uses that special annotation for migration. In the beginning, it patches\nCAPI and KCP deployments with the ",(0,s.kt)("strong",{parentName:"p"},"ClusterTopology=true")," container argument. Then creates new resources\n(",(0,s.kt)("em",{parentName:"p"},"KubeadmControlPlaneTemplate"),", ",(0,s.kt)("em",{parentName:"p"},"OpenStackClusterTemplate"),", ",(0,s.kt)("em",{parentName:"p"},"ClusterClass"),"). After that, annotates, labels and\npatches existing cluster resources. In the end, it patches the ",(0,s.kt)("strong",{parentName:"p"},"Cluster")," object with ",(0,s.kt)("strong",{parentName:"p"},".spec.topology")," and it's done."),(0,s.kt)("h2",{id:"migration"},"Migration"),(0,s.kt)("h3",{id:"prerequisites"},"Prerequisites"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"CAPI >= v1.5.2 due to ",(0,s.kt)("a",{parentName:"li",href:"https://cluster-api.sigs.k8s.io/tasks/experimental-features/cluster-class/write-clusterclass#clusterclass-with-custom-naming-strategies"},"NamingStrategy")," feature",(0,s.kt)("ul",{parentName:"li"},(0,s.kt)("li",{parentName:"ul"},"upgrade can be performed as stated in upgrade ",(0,s.kt)("a",{parentName:"li",href:"https://github.com/SovereignCloudStack/k8s-cluster-api-provider/blob/main/doc/Upgrade-Guide.md#updating-cluster-api-and-openstack-cluster-api-provider"},"guide"))))),(0,s.kt)("h3",{id:"steps"},"Steps"),(0,s.kt)("ol",null,(0,s.kt)("li",{parentName:"ol"},"Git pull/checkout new changes into the ",(0,s.kt)("inlineCode",{parentName:"li"},"~/k8s-cluster-api-provider")," directory"),(0,s.kt)("li",{parentName:"ol"},"Run ",(0,s.kt)("inlineCode",{parentName:"li"},"migrate-to-cluster-class.sh <CLUSTER_NAME>")," (verify machines were not recreated)"),(0,s.kt)("li",{parentName:"ol"},"Copy new templates for existing and new clusters (consider backup)",(0,s.kt)("pre",{parentName:"li"},(0,s.kt)("code",{parentName:"pre",className:"language-bash"},"cp ~/k8s-cluster-api-provider/terraform/files/template/cluster-template.yaml ~/<CLUSTER_NAME>/cluster-template.yaml\ncp ~/k8s-cluster-api-provider/terraform/files/template/cluster-template.yaml ~/cluster-defaults/cluster-template.yaml\n"))),(0,s.kt)("li",{parentName:"ol"},"Next run of ",(0,s.kt)("inlineCode",{parentName:"li"},"create_cluster.sh <CLUSTER_NAME>")," should be idempotent")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/da1a5473.e602bded.js b/assets/js/da1a5473.e602bded.js new file mode 100644 index 0000000000..306684ef6c --- /dev/null +++ b/assets/js/da1a5473.e602bded.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5598],{3905:(e,t,i)=>{i.d(t,{Zo:()=>p,kt:()=>d});var n=i(67294);function r(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function s(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,n)}return i}function a(e){for(var t=1;t<arguments.length;t++){var i=null!=arguments[t]?arguments[t]:{};t%2?s(Object(i),!0).forEach((function(t){r(e,t,i[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(i)):s(Object(i)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(i,t))}))}return e}function o(e,t){if(null==e)return{};var i,n,r=function(e,t){if(null==e)return{};var i,n,r={},s=Object.keys(e);for(n=0;n<s.length;n++)i=s[n],t.indexOf(i)>=0||(r[i]=e[i]);return r}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n<s.length;n++)i=s[n],t.indexOf(i)>=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(r[i]=e[i])}return r}var l=n.createContext({}),c=function(e){var t=n.useContext(l),i=t;return e&&(i="function"==typeof e?e(t):a(a({},t),e)),i},p=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var i=e.components,r=e.mdxType,s=e.originalType,l=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),m=c(i),h=r,d=m["".concat(l,".").concat(h)]||m[h]||u[h]||s;return i?n.createElement(d,a(a({ref:t},p),{},{components:i})):n.createElement(d,a({ref:t},p))}));function d(e,t){var i=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var s=i.length,a=new Array(s);a[0]=h;var o={};for(var l in t)hasOwnProperty.call(t,l)&&(o[l]=t[l]);o.originalType=e,o[m]="string"==typeof e?e:r,a[1]=o;for(var c=2;c<s;c++)a[c]=i[c];return n.createElement.apply(null,a)}return n.createElement.apply(null,i)}h.displayName="MDXCreateElement"},18817:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>o,toc:()=>c});var n=i(87462),r=(i(67294),i(3905));const s={sidebar_label:"Scripts",sidebar_position:20},a="Scripts",o={unversionedId:"iaas/guides/other-guides/developer-guide/scripts",id:"iaas/guides/other-guides/developer-guide/scripts",title:"Scripts",description:"Scripts are included in container images to simplify development work and to enable",source:"@site/docs/02-iaas/guides/other-guides/developer-guide/scripts.md",sourceDirName:"02-iaas/guides/other-guides/developer-guide",slug:"/iaas/guides/other-guides/developer-guide/scripts",permalink:"/docs/iaas/guides/other-guides/developer-guide/scripts",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/other-guides/developer-guide/scripts.md",tags:[],version:"current",sidebarPosition:20,frontMatter:{sidebar_label:"Scripts",sidebar_position:20},sidebar:"docs",previous:{title:"Releases",permalink:"/docs/iaas/guides/other-guides/developer-guide/releases"},next:{title:"Zuul Ci",permalink:"/docs/iaas/guides/other-guides/developer-guide/zuul-ci"}},l={},c=[{value:"change-osism.sh",id:"change-osismsh",level:2},{value:"Inventory Reconciler",id:"inventory-reconciler",level:2},{value:"osism-ansible",id:"osism-ansible",level:2}],p={toc:c},m="wrapper";function u(e){let{components:t,...i}=e;return(0,r.kt)(m,(0,n.Z)({},p,i,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"scripts"},"Scripts"),(0,r.kt)("p",null,"Scripts are included in container images to simplify development work and to enable\ntesting and hotfixes in running environments. What scripts are available and how to\nuse them is described in this chapter."),(0,r.kt)("h2",{id:"change-osismsh"},"change-osism.sh"),(0,r.kt)("p",null,"With the ",(0,r.kt)("inlineCode",{parentName:"p"},"change-osism.sh")," script it is possible to bring the\n",(0,r.kt)("a",{parentName:"p",href:"https://pypi.org/project/osism/"},"Python package osism")," to a\ndevelopment state from the\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/osism/python-osism"},"osism/python-osism"),"\nrepository."),(0,r.kt)("p",null,"Here, the script is used in the running inventory reconciler\nservice to install the branch ",(0,r.kt)("inlineCode",{parentName:"p"},"main")," of\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/osism/python-osism"},"osism/python-osism"),".\nInstead of ",(0,r.kt)("inlineCode",{parentName:"p"},"main"),", any branch can be used."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"docker exec -u root -it manager-inventory_reconciler-1 /change-osism.sh main\n")),(0,r.kt)("p",null,"It is important to restart the container afterwards."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"docker restart manager-inventory_reconciler-1\n")),(0,r.kt)("p",null,"The script is included in the following container images:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/osism/container-image-ceph-ansible"},"osism/ceph-ansible")," used by the service ",(0,r.kt)("inlineCode",{parentName:"li"},"ceph-ansible")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/osism/container-image-inventory-reconciler"},"osism/inventory-reconciler")," used by the service ",(0,r.kt)("inlineCode",{parentName:"li"},"manager-inventory_reconciler-1")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/osism/container-image-kolla-ansible"},"osism/kolla-ansible")," used by the service ",(0,r.kt)("inlineCode",{parentName:"li"},"kolla-ansible")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/osism/container-image-osism-ansible"},"osism/osism-ansible")," used by the service ",(0,r.kt)("inlineCode",{parentName:"li"},"osism-ansible")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/osism/python-osism"},"osism/python-osism")," osed by the service ",(0,r.kt)("inlineCode",{parentName:"li"},"osismclient"))),(0,r.kt)("h2",{id:"inventory-reconciler"},"Inventory Reconciler"),(0,r.kt)("p",null,"The container image of the inventory eeconciler contains a few more scripts."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"change-generics.sh")," for the ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/osism/cfg-generics"},"osism/cfg-generics")," repository"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"change-defaults.sh")," for the ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/osism/defaults"},"osism/defaults")," repository"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"change-release.sh")," for the ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/osism/release"},"osism/release")," repository")),(0,r.kt)("p",null,"It is important to restart the container afterwards."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"docker restart manager-inventory_reconciler-1\n")),(0,r.kt)("h2",{id:"osism-ansible"},"osism-ansible"),(0,r.kt)("p",null,"The osism-ansible container image contains a few more scripts."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("inlineCode",{parentName:"p"},"change.sh")," for the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/osism/ansible-collection-services"},"osism/ansible-collection-services"),", ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/osism/ansible-collection-commons"},"osism/ansible-collection-commons"),", and ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/osism/ansible-collection-validations"},"osism/ansible-collection-validations")," repositories"),(0,r.kt)("p",{parentName:"li"},"In this example, the ",(0,r.kt)("inlineCode",{parentName:"p"},"main")," branch of ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/osism/ansible-collection-services"},"osism/ansible-collection-services")," is used."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"docker exec -u root -it osism-ansible /change.sh services main\n"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("inlineCode",{parentName:"p"},"change-playbooks.sh")," for the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/osism/ansible-playbooks"},"osism/ansible-playbooks")," repository"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/da20a34d.30617762.js b/assets/js/da20a34d.30617762.js new file mode 100644 index 0000000000..8b38826e6d --- /dev/null +++ b/assets/js/da20a34d.30617762.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6995],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>g});var n=a(67294);function i(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?r(Object(a),!0).forEach((function(t){i(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):r(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,n,i=function(e,t){if(null==e)return{};var a,n,i={},r=Object.keys(e);for(n=0;n<r.length;n++)a=r[n],t.indexOf(a)>=0||(i[a]=e[a]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n<r.length;n++)a=r[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(i[a]=e[a])}return i}var s=n.createContext({}),m=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},p=function(e){var t=m(e.components);return n.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var a=e.components,i=e.mdxType,r=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=m(a),c=i,g=u["".concat(s,".").concat(c)]||u[c]||d[c]||r;return a?n.createElement(g,o(o({ref:t},p),{},{components:a})):n.createElement(g,o({ref:t},p))}));function g(e,t){var a=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var r=a.length,o=new Array(r);o[0]=c;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:i,o[1]=l;for(var m=2;m<r;m++)o[m]=a[m];return n.createElement.apply(null,o)}return n.createElement.apply(null,a)}c.displayName="MDXCreateElement"},20582:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>d,frontMatter:()=>r,metadata:()=>l,toc:()=>m});var n=a(87462),i=(a(67294),a(3905));const r={sidebar_label:"Image Manager",sidebar_position:50},o="Image Manager",l={unversionedId:"iaas/components/image-manager",id:"iaas/components/image-manager",title:"Image Manager",description:"The OpenStack Image Manager is a tool for managing all images on an OpenStack environment",source:"@site/docs/02-iaas/components/image-manager.md",sourceDirName:"02-iaas/components",slug:"/iaas/components/image-manager",permalink:"/docs/iaas/components/image-manager",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/components/image-manager.md",tags:[],version:"current",sidebarPosition:50,frontMatter:{sidebar_label:"Image Manager",sidebar_position:50},sidebar:"docs",previous:{title:"Components",permalink:"/docs/category/components"},next:{title:"Flavor Manager",permalink:"/docs/iaas/components/flavor-manager"}},s={},m=[{value:"Requirements",id:"requirements",level:2},{value:"OpenStack Image Service (Glance)",id:"openstack-image-service-glance",level:3},{value:"Object storage backend",id:"object-storage-backend",level:3},{value:"Getting started",id:"getting-started",level:2},{value:"Image definitions",id:"image-definitions",level:2},{value:"SCS image standard",id:"scs-image-standard",level:3},{value:"Image with regular rebuilds",id:"image-with-regular-rebuilds",level:3},{value:"Image without regular rebuild",id:"image-without-regular-rebuild",level:3},{value:"Other properties",id:"other-properties",level:3},{value:"Image properties",id:"image-properties",level:4},{value:"Image tags",id:"image-tags",level:4},{value:"image status",id:"image-status",level:4},{value:"Image visibility",id:"image-visibility",level:4},{value:"Usage",id:"usage",level:2},{value:"Mirroring images",id:"mirroring-images",level:3},{value:"Updating images",id:"updating-images",level:3}],p={toc:m},u="wrapper";function d(e){let{components:t,...a}=e;return(0,i.kt)(u,(0,n.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"image-manager"},"Image Manager"),(0,i.kt)("p",null,"The OpenStack Image Manager is a tool for managing all images on an OpenStack environment"),(0,i.kt)("h2",{id:"requirements"},"Requirements"),(0,i.kt)("p",null,"This information is only relevant for the operator of an OpenStack environment. You can skip this section if\nyou want to use OpenStack Image Manager as a normal user and you are not an operator of an openStack environment."),(0,i.kt)("h3",{id:"openstack-image-service-glance"},"OpenStack Image Service (Glance)"),(0,i.kt)("p",null,"The OpenStack Image Service (Glance) is required to upload and discover data assets that are used by other\nservices."),(0,i.kt)("p",null,"Since this script stores many images in a single project, the Glance quota must be set accordingly high or to unlimited."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-ini"},"[DEFAULT]\nuser_storage_quota = 1TB\n")),(0,i.kt)("p",null,"With most storage backends it makes sense to convert the imported images directly to RAW. So it is required for using Ceph and it's\nfeatures too. Recited from the Ceph documentation ",(0,i.kt)("a",{parentName:"p",href:"https://docs.ceph.com/en/latest/rbd/qemu-rbd/"},"QEMU and block devices")," and\n",(0,i.kt)("a",{parentName:"p",href:"https://docs.ceph.com/en/latest/rbd/rbd-openstack/"},"Block devices and OpenStack"),"."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},'"The raw data format is really the only sensible format option to use with RBD. Technically, you could use other QEMU-supported formats\n(such as qcow2 or vmdk), but doing so would add additional overhead, and would also render the volume unsafe for virtual machine live\nmigration when caching (see below) is enabled."'),(0,i.kt)("p",{parentName:"blockquote"},'"Important Ceph doesn\'t support QCOW2 for hosting a virtual machine disk. Thus if you want to boot virtual machines in Ceph (ephemeral\nbackend or boot from volume), the Glance image format must be RAW."')),(0,i.kt)("p",null,"This requires the following parameter for the image import workflow."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-ini"},"[taskflow_executor]\nconversion_format = raw\n\n[image_import_opts]\nimage_import_plugins = ['image_decompression', 'image_conversion']\n\n[image_conversion]\noutput_format = raw\n")),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"See ",(0,i.kt)("a",{parentName:"p",href:"https://docs.openstack.org/glance/latest/configuration/sample-configuration.html"},"OpenStack Glance documentation"),"\nfor more details.")),(0,i.kt)("h3",{id:"object-storage-backend"},"Object storage backend"),(0,i.kt)("p",null,"If the mirror functionality is used, an object storage backend is required. The use of the mirror functionality\nis optional and is not used by default."),(0,i.kt)("h2",{id:"getting-started"},"Getting started"),(0,i.kt)("p",null,"This ",(0,i.kt)("strong",{parentName:"p"},"Getting started")," will upload a private image to your OpenStack environment with\nthe help of the OpenStack Image Manager."),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Install the ",(0,i.kt)("inlineCode",{parentName:"p"},"openstack-image-manager")," package with ",(0,i.kt)("inlineCode",{parentName:"p"},"pip"),"."),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"pip3 install openstack-image-manager\n"))),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Create a image definition in the file ",(0,i.kt)("inlineCode",{parentName:"p"},"getting-started.yml")," in the local directory ",(0,i.kt)("inlineCode",{parentName:"p"},"images"),"."),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-yaml"},"---\nimages:\n - name: MyCirros\n format: qcow2\n login: cirros\n password: gocubsgo\n min_disk: 1\n min_ram: 32\n status: active\n visibility: private\n multi: false\n meta:\n architecture: x86_64\n hw_disk_bus: scsi\n hw_rng_model: virtio\n hw_scsi_model: virtio-scsi\n hw_watchdog_action: reset\n os_distro: cirros\n replace_frequency: never\n uuid_validity: none\n provided_until: none\n tags: []\n versions:\n - version: '0.6.0'\n url: https://github.com/cirros-dev/cirros/releases/download/0.6.0/cirros-0.6.0-x86_64-disk.img\n checksum: \"sha256:94e1e2c94dbbae7d4bdc38e68590a1daf73c9de2d03dd693857b4b0a042548e8\"\n build_date: 2022-09-28\n"))),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Run the OpenStack Image Manager. It is assumed that a profile with the name ",(0,i.kt)("inlineCode",{parentName:"p"},"openstack")," exists in the\n",(0,i.kt)("a",{parentName:"p",href:"https://docs.openstack.org/python-openstackclient/latest/configuration/index.html#configuration-files"},"clouds.yaml"),"."),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'openstack-image-manager --cloud openstack --filter ".*Cirr.*" --images images/\n')))),(0,i.kt)("h2",{id:"image-definitions"},"Image definitions"),(0,i.kt)("p",null,"The configuration consists of different parameter settings, such as values for\nminimum RAM or the visibility of the image. Have a look at the examples below\nfor all parameters. After a change to the configuration, validate it with\n",(0,i.kt)("inlineCode",{parentName:"p"},"tox -- --dry-run"),"."),(0,i.kt)("h3",{id:"scs-image-standard"},"SCS image standard"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"The value of ",(0,i.kt)("inlineCode",{parentName:"li"},"login")," is stored as ",(0,i.kt)("inlineCode",{parentName:"li"},"image_original_user")," in the metadata of an image."),(0,i.kt)("li",{parentName:"ul"},"If ",(0,i.kt)("inlineCode",{parentName:"li"},"image_description")," is not set as meta information, ",(0,i.kt)("inlineCode",{parentName:"li"},"image_description")," is set to the name of the image."),(0,i.kt)("li",{parentName:"ul"},"The value of ",(0,i.kt)("inlineCode",{parentName:"li"},"build_date")," of a specific version of an image is stored as ",(0,i.kt)("inlineCode",{parentName:"li"},"image_build_date")," in the metadata of an image."),(0,i.kt)("li",{parentName:"ul"},"The value of ",(0,i.kt)("inlineCode",{parentName:"li"},"url")," of a specific version of an image is stored as ",(0,i.kt)("inlineCode",{parentName:"li"},"image_source")," in the metadata of an image.")),(0,i.kt)("h3",{id:"image-with-regular-rebuilds"},"Image with regular rebuilds"),(0,i.kt)("p",null,"This type of image definition is used for images that are rebuilt at regular\nintervals. For example, this is the case for the daily builds of the Ubuntu\nimages."),(0,i.kt)("p",null,"The attribute ",(0,i.kt)("inlineCode",{parentName:"p"},"multi: true")," is set."),(0,i.kt)("p",null,"With this type of image definition, the version of the distribution (or product,\nwhatever is contained in the image) used is already in the name of the image\ndefinition. The ",(0,i.kt)("inlineCode",{parentName:"p"},"version")," properties from the definition's ",(0,i.kt)("inlineCode",{parentName:"p"},"versions")," list\nare appended only to older iterations of the image as timestamp suffixes\nin parentheses upon each rotation (except for the latest entry)."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-yaml"},"images:\n - name: Ubuntu 16.04\n format: qcow2\n login: ubuntu\n min_disk: 8\n min_ram: 512\n status: active\n visibility: public\n multi: true\n meta:\n architecture: x86_64\n hw_disk_bus: scsi\n hw_scsi_model: virtio-scsi\n hw_watchdog_action: reset\n os_distro: ubuntu\n os_version: '16.04'\n tags: []\n versions:\n - version: '20180928'\n url: https://cloud-images.ubuntu.com/xenial/20180928/xenial-server-cloudimg-amd64-disk1.img\n - version: '20181004'\n url: https://cloud-images.ubuntu.com/xenial/20181004/xenial-server-cloudimg-amd64-disk1.img\n")),(0,i.kt)("p",null,"This configuration creates the following images:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Ubuntu 16.04 (20180928)")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Ubuntu 16.04"))),(0,i.kt)("p",null,"If a newer build is added, the following rotation takes place:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Ubuntu 16.04 (20180928)")," does not change"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Ubuntu 16.04")," becomes ",(0,i.kt)("strong",{parentName:"li"},"Ubuntu 16.04 (20181004)")),(0,i.kt)("li",{parentName:"ul"},"the new image becomes ",(0,i.kt)("strong",{parentName:"li"},"Ubuntu 16.04"))),(0,i.kt)("p",null,"By default the last three images will be visible. When a fourth image is added, the visibility of\nthe last image in the list is changed to ",(0,i.kt)("inlineCode",{parentName:"p"},"community")," and the image can be deleted in the future."),(0,i.kt)("h3",{id:"image-without-regular-rebuild"},"Image without regular rebuild"),(0,i.kt)("p",null,"This type of image definition is used for images that are not rebuilt. For example,\nthis is the case for the flatcar images. For each release of Flatcar there is exactly\none image which will not be rebuilt in the future."),(0,i.kt)("p",null,"The attribute ",(0,i.kt)("inlineCode",{parentName:"p"},"multi: false")," is set."),(0,i.kt)("p",null,"With this type of image definition, the version of the distribution (or product,\nwhatever is contained in the image) used is not in the name of the image definition.\nInstead, the ",(0,i.kt)("inlineCode",{parentName:"p"},"version")," properties from the image definition's ",(0,i.kt)("inlineCode",{parentName:"p"},"versions")," list\nare appended as static version suffixes to the images' names."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-yaml"},"images:\n - name: RancherOS\n format: qcow2\n login: rancher\n min_disk: 8\n min_ram: 2048\n status: active\n visibility: public\n multi: false\n meta:\n architecture: x86_64\n hw_disk_bus: scsi\n hw_scsi_model: virtio-scsi\n hw_watchdog_action: reset\n tags: []\n versions:\n - version: '1.3.0'\n url: https://github.com/rancher/os/releases/download/v1.3.0/rancheros-openstack.img\n - version: '1.4.0'\n url: https://github.com/rancher/os/releases/download/v1.4.0/rancheros-openstack.img\n - version: '1.4.1'\n url: https://github.com/rancher/os/releases/download/v1.4.1/rancheros-openstack.img\n")),(0,i.kt)("p",null,"This configuration creates the following images:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"RancherOS 1.3.0")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"RancherOS 1.4.0")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"RancherOS 1.4.1"))),(0,i.kt)("p",null,"If a new version is added, no rotation takes place. The new version is added\nas ",(0,i.kt)("strong",{parentName:"p"},"RancherOS x.y.z"),". Here also the visibility of older images is not changed."),(0,i.kt)("h3",{id:"other-properties"},"Other properties"),(0,i.kt)("h4",{id:"image-properties"},"Image properties"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Removal of properties is not yet possible"),(0,i.kt)("li",{parentName:"ul"},"URL, name and format can not be changed"),(0,i.kt)("li",{parentName:"ul"},"Any keys can be added to ",(0,i.kt)("inlineCode",{parentName:"li"},"meta"),", these will be added to the image"),(0,i.kt)("li",{parentName:"ul"},"Existing keys in ",(0,i.kt)("inlineCode",{parentName:"li"},"meta")," can be changed, the same applies to ",(0,i.kt)("inlineCode",{parentName:"li"},"min_disk"),"\nand ",(0,i.kt)("inlineCode",{parentName:"li"},"min_ram"))),(0,i.kt)("h4",{id:"image-tags"},"Image tags"),(0,i.kt)("h4",{id:"image-status"},"image status"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"deactivation: change ",(0,i.kt)("inlineCode",{parentName:"li"},"status")," to ",(0,i.kt)("inlineCode",{parentName:"li"},"deactivated")),(0,i.kt)("li",{parentName:"ul"},"reactivation: change ",(0,i.kt)("inlineCode",{parentName:"li"},"status")," to ",(0,i.kt)("inlineCode",{parentName:"li"},"active")," ")),(0,i.kt)("h4",{id:"image-visibility"},"Image visibility"),(0,i.kt)("p",null,"A full documentation about the visibility of images can be found in the ",(0,i.kt)("strong",{parentName:"p"},"Image visibility")," section in the\n",(0,i.kt)("a",{parentName:"p",href:"https://docs.openstack.org/api-ref/image/v2/index.html#general-information"},"OpenStack Image Service API Documentation"),"."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"public: set ",(0,i.kt)("inlineCode",{parentName:"li"},"visibility")," to ",(0,i.kt)("inlineCode",{parentName:"li"},"public")),(0,i.kt)("li",{parentName:"ul"},"community: set ",(0,i.kt)("inlineCode",{parentName:"li"},"visibility")," to ",(0,i.kt)("inlineCode",{parentName:"li"},"community")),(0,i.kt)("li",{parentName:"ul"},"shared: set ",(0,i.kt)("inlineCode",{parentName:"li"},"visibility")," to ",(0,i.kt)("inlineCode",{parentName:"li"},"shared")),(0,i.kt)("li",{parentName:"ul"},"private: set ",(0,i.kt)("inlineCode",{parentName:"li"},"visibility")," to ",(0,i.kt)("inlineCode",{parentName:"li"},"private"))),(0,i.kt)("h2",{id:"usage"},"Usage"),(0,i.kt)("h3",{id:"mirroring-images"},"Mirroring images"),(0,i.kt)("p",null,"Since the upstreams often only keep their images for a short time, we mirror most of the images on REGIO.cloud.\nThis makes us independent of the availability of the images in the individual upstreams."),(0,i.kt)("h3",{id:"updating-images"},"Updating images"),(0,i.kt)("p",null,"Some of the images are automatically updated by a CI job. The latest available build at the time of the CI job execution is mirrored and\nmade available as the current version."),(0,i.kt)("p",null,"Currently, the following images are updated once a week (every Sunday at 0 am):"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Almalinux"),(0,i.kt)("li",{parentName:"ul"},"CentOS"),(0,i.kt)("li",{parentName:"ul"},"Debian"),(0,i.kt)("li",{parentName:"ul"},"Rockylinux"),(0,i.kt)("li",{parentName:"ul"},"Ubuntu")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/dbde4c02.92aaf750.js b/assets/js/dbde4c02.92aaf750.js new file mode 100644 index 0000000000..343e7b5df1 --- /dev/null +++ b/assets/js/dbde4c02.92aaf750.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4466],{3905:(e,r,t)=>{t.d(r,{Zo:()=>s,kt:()=>b});var a=t(67294);function n(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function o(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);r&&(a=a.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,a)}return t}function i(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?o(Object(t),!0).forEach((function(r){n(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):o(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}function l(e,r){if(null==e)return{};var t,a,n=function(e,r){if(null==e)return{};var t,a,n={},o=Object.keys(e);for(a=0;a<o.length;a++)t=o[a],r.indexOf(t)>=0||(n[t]=e[t]);return n}(e,r);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)t=o[a],r.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(n[t]=e[t])}return n}var u=a.createContext({}),p=function(e){var r=a.useContext(u),t=r;return e&&(t="function"==typeof e?e(r):i(i({},r),e)),t},s=function(e){var r=p(e.components);return a.createElement(u.Provider,{value:r},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var r=e.children;return a.createElement(a.Fragment,{},r)}},m=a.forwardRef((function(e,r){var t=e.components,n=e.mdxType,o=e.originalType,u=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),d=p(t),m=n,b=d["".concat(u,".").concat(m)]||d[m]||c[m]||o;return t?a.createElement(b,i(i({ref:r},s),{},{components:t})):a.createElement(b,i({ref:r},s))}));function b(e,r){var t=arguments,n=r&&r.mdxType;if("string"==typeof e||n){var o=t.length,i=new Array(o);i[0]=m;var l={};for(var u in r)hasOwnProperty.call(r,u)&&(l[u]=r[u]);l.originalType=e,l[d]="string"==typeof e?e:n,i[1]=l;for(var p=2;p<o;p++)i[p]=t[p];return a.createElement.apply(null,i)}return a.createElement.apply(null,t)}m.displayName="MDXCreateElement"},30767:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>u,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var a=t(87462),n=(t(67294),t(3905));const o={sidebar_label:"Infrastructure",sidebar_position:30},i="Infrastructure",l={unversionedId:"iaas/guides/upgrade-guide/infrastructure",id:"iaas/guides/upgrade-guide/infrastructure",title:"Infrastructure",description:"Kubernetes",source:"@site/docs/02-iaas/guides/upgrade-guide/infrastructure.md",sourceDirName:"02-iaas/guides/upgrade-guide",slug:"/iaas/guides/upgrade-guide/infrastructure",permalink:"/docs/iaas/guides/upgrade-guide/infrastructure",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/upgrade-guide/infrastructure.md",tags:[],version:"current",sidebarPosition:30,frontMatter:{sidebar_label:"Infrastructure",sidebar_position:30},sidebar:"docs",previous:{title:"Docker",permalink:"/docs/iaas/guides/upgrade-guide/docker"},next:{title:"Logging & Monitoring",permalink:"/docs/iaas/guides/upgrade-guide/logging-monitoring"}},u={},p=[{value:"Kubernetes",id:"kubernetes",level:2},{value:"Cron, Fluentd & Kolla Toolbox",id:"cron-fluentd--kolla-toolbox",level:2},{value:"Loadbalancer",id:"loadbalancer",level:2},{value:"Redis",id:"redis",level:2},{value:"Memcached",id:"memcached",level:2},{value:"RabbitMQ",id:"rabbitmq",level:2},{value:"MariaDB",id:"mariadb",level:2}],s={toc:p},d="wrapper";function c(e){let{components:r,...t}=e;return(0,n.kt)(d,(0,a.Z)({},s,t,{components:r,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"infrastructure"},"Infrastructure"),(0,n.kt)("h2",{id:"kubernetes"},"Kubernetes"),(0,n.kt)("h2",{id:"cron-fluentd--kolla-toolbox"},"Cron, Fluentd & Kolla Toolbox"),(0,n.kt)("p",null,"The common role of Kolla is used to manage the services ",(0,n.kt)("inlineCode",{parentName:"p"},"cron"),", ",(0,n.kt)("inlineCode",{parentName:"p"},"fluentd"),"\nand ",(0,n.kt)("inlineCode",{parentName:"p"},"kolla-toolbox"),"."),(0,n.kt)("p",null,"It is important to do this upgrade before any other upgrades in the Kolla\nenvironment, as parts of the other upgrades depend on the ",(0,n.kt)("inlineCode",{parentName:"p"},"kolla-toolbox"),"\nservice."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre"},"osism apply -a pull common\nosism apply -a upgrade common\n")),(0,n.kt)("h2",{id:"loadbalancer"},"Loadbalancer"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre"},"osism apply -a pull loadbalancer\nosism apply -a upgrade loadbalancer\n")),(0,n.kt)("h2",{id:"redis"},"Redis"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre"},"osism apply -a pull redis\nosism apply -a upgrade redis\n")),(0,n.kt)("h2",{id:"memcached"},"Memcached"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre"},"osism apply -a pull memcached\nosism apply -a upgrade memcached\n")),(0,n.kt)("h2",{id:"rabbitmq"},"RabbitMQ"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre"},"osism apply -a pull rabbitmq\nosism apply -a upgrade rabbitmq\n")),(0,n.kt)("h2",{id:"mariadb"},"MariaDB"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre"},"osism apply -a pull mariadb\nosism apply -a upgrade mariadb\n")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/dcf2f717.cfa622d3.js b/assets/js/dcf2f717.cfa622d3.js new file mode 100644 index 0000000000..6c7cbe0d6a --- /dev/null +++ b/assets/js/dcf2f717.cfa622d3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7214],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>g});var n=r(67294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function a(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var u=n.createContext({}),l=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):c(c({},t),e)),r},p=function(e){var t=l(e.components);return n.createElement(u.Provider,{value:t},e.children)},s="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,u=e.parentName,p=a(e,["components","mdxType","originalType","parentName"]),s=l(r),f=o,g=s["".concat(u,".").concat(f)]||s[f]||d[f]||i;return r?n.createElement(g,c(c({ref:t},p),{},{components:r})):n.createElement(g,c({ref:t},p))}));function g(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,c=new Array(i);c[0]=f;var a={};for(var u in t)hasOwnProperty.call(t,u)&&(a[u]=t[u]);a.originalType=e,a[s]="string"==typeof e?e:o,c[1]=a;for(var l=2;l<i;l++)c[l]=r[l];return n.createElement.apply(null,c)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},94847:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>c,default:()=>d,frontMatter:()=>i,metadata:()=>a,toc:()=>l});var n=r(87462),o=(r(67294),r(3905));const i={},c="Guide 1",a={unversionedId:"container/guides/guide1",id:"container/guides/guide1",title:"Guide 1",description:"TODO",source:"@site/docs/03-container/guides/guide1.md",sourceDirName:"03-container/guides",slug:"/container/guides/guide1",permalink:"/docs/container/guides/guide1",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/03-container/guides/guide1.md",tags:[],version:"current",frontMatter:{}},u={},l=[],p={toc:l},s="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(s,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"guide-1"},"Guide 1"),(0,o.kt)("p",null,"TODO"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ddebfa81.a9802837.js b/assets/js/ddebfa81.a9802837.js new file mode 100644 index 0000000000..3eebca54a4 --- /dev/null +++ b/assets/js/ddebfa81.a9802837.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5038],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>m});var n=r(67294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=n.createContext({}),s=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},p=function(e){var t=s(e.components);return n.createElement(l.Provider,{value:t},e.children)},f="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),f=s(r),u=o,m=f["".concat(l,".").concat(u)]||f[u]||d[u]||i;return r?n.createElement(m,a(a({ref:t},p),{},{components:r})):n.createElement(m,a({ref:t},p))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,a=new Array(i);a[0]=u;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[f]="string"==typeof e?e:o,a[1]=c;for(var s=2;s<i;s++)a[s]=r[s];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}u.displayName="MDXCreateElement"},63660:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>c,toc:()=>s});var n=r(87462),o=(r(67294),r(3905));const i={},a="How to get certified",c={unversionedId:"certification/get-certified",id:"certification/get-certified",title:"How to get certified",description:"1. (optional) Download the compliance check tool and run it on your environment in order to check that all standards for the certification scope are met.",source:"@site/standards/certification/get-certified.md",sourceDirName:"certification",slug:"/certification/get-certified",permalink:"/standards/certification/get-certified",draft:!1,tags:[],version:"current",frontMatter:{}},l={},s=[],p={toc:s},f="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(f,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"how-to-get-certified"},"How to get certified"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"(optional) Download the compliance check tool and run it on your environment in order to check that all standards for the certification scope are met."),(0,o.kt)("li",{parentName:"ol"},"Contact the SCS project team and request to officially certified."),(0,o.kt)("li",{parentName:"ol"},"Prepare yourself to give the SCS project team user access to your cloud environment"),(0,o.kt)("li",{parentName:"ol"},"The SCS project team will run regular tests (the same as the compliance check tool), in order to check whether all standards compiled in the certification scope are met."),(0,o.kt)("li",{parentName:"ol"},'If so, then your environment is listed in the "certified clouds" section on this site.')),(0,o.kt)("p",null,"The above workflow applies at the moment to the certification scope SCS-compatible on IaaS. For more complex standards to be met, which may not be automatically and remotely tested.\nFor cloud environments, which do not provide public access for various reasons, but do want to accomplish a certification an individual process will provided accordingly."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/de0540ff.3766e6e4.js b/assets/js/de0540ff.3766e6e4.js new file mode 100644 index 0000000000..829a555351 --- /dev/null +++ b/assets/js/de0540ff.3766e6e4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2690],{15047:e=>{e.exports=JSON.parse('{"title":"Identity and Access Management (IAM)","slug":"/category/identity-and-access-management-iam","permalink":"/docs/category/identity-and-access-management-iam","navigation":{"previous":{"title":"Metering Configuration","permalink":"/docs/operating-scs/metering/meter_configuration"},"next":{"title":"Proposal for documentation for Keycloak to Keycloak Federation (WebSSO)","permalink":"/docs/iam/intra-SCS-federation-setup-description-for-osism-doc-operations"}}}')}}]); \ No newline at end of file diff --git a/assets/js/df35cf96.7b771da6.js b/assets/js/df35cf96.7b771da6.js new file mode 100644 index 0000000000..da28357936 --- /dev/null +++ b/assets/js/df35cf96.7b771da6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5830],{3905:(e,r,t)=>{t.d(r,{Zo:()=>u,kt:()=>v});var n=t(67294);function i(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function a(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function s(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?a(Object(t),!0).forEach((function(r){i(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):a(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}function o(e,r){if(null==e)return{};var t,n,i=function(e,r){if(null==e)return{};var t,n,i={},a=Object.keys(e);for(n=0;n<a.length;n++)t=a[n],r.indexOf(t)>=0||(i[t]=e[t]);return i}(e,r);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)t=a[n],r.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(i[t]=e[t])}return i}var c=n.createContext({}),d=function(e){var r=n.useContext(c),t=r;return e&&(t="function"==typeof e?e(r):s(s({},r),e)),t},u=function(e){var r=d(e.components);return n.createElement(c.Provider,{value:r},e.children)},l="mdxType",p={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},m=n.forwardRef((function(e,r){var t=e.components,i=e.mdxType,a=e.originalType,c=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),l=d(t),m=i,v=l["".concat(c,".").concat(m)]||l[m]||p[m]||a;return t?n.createElement(v,s(s({ref:r},u),{},{components:t})):n.createElement(v,s({ref:r},u))}));function v(e,r){var t=arguments,i=r&&r.mdxType;if("string"==typeof e||i){var a=t.length,s=new Array(a);s[0]=m;var o={};for(var c in r)hasOwnProperty.call(r,c)&&(o[c]=r[c]);o.originalType=e,o[l]="string"==typeof e?e:i,s[1]=o;for(var d=2;d<a;d++)s[d]=t[d];return n.createElement.apply(null,s)}return n.createElement.apply(null,t)}m.displayName="MDXCreateElement"},78387:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>c,contentTitle:()=>s,default:()=>p,frontMatter:()=>a,metadata:()=>o,toc:()=>d});var n=t(87462),i=(t(67294),t(3905));const a={sidebar_label:"Services"},s="Services",o={unversionedId:"iaas/guides/configuration-guide/commons/services",id:"iaas/guides/configuration-guide/commons/services",title:"Services",description:"With the osism.commons.services role, it is possible to manage services on a node",source:"@site/docs/02-iaas/guides/configuration-guide/commons/services.md",sourceDirName:"02-iaas/guides/configuration-guide/commons",slug:"/iaas/guides/configuration-guide/commons/services",permalink:"/docs/iaas/guides/configuration-guide/commons/services",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/configuration-guide/commons/services.md",tags:[],version:"current",frontMatter:{sidebar_label:"Services"},sidebar:"docs",previous:{title:"Packages",permalink:"/docs/iaas/guides/configuration-guide/commons/packages"},next:{title:"SSH Config",permalink:"/docs/iaas/guides/configuration-guide/commons/sshconfig"}},c={},d=[{value:"Start and enable required services",id:"start-and-enable-required-services",level:2},{value:"Note on services that should be deactivated",id:"note-on-services-that-should-be-deactivated",level:2}],u={toc:d},l="wrapper";function p(e){let{components:r,...t}=e;return(0,i.kt)(l,(0,n.Z)({},u,t,{components:r,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"services"},"Services"),(0,i.kt)("p",null,"With the ",(0,i.kt)("inlineCode",{parentName:"p"},"osism.commons.services")," role, it is possible to manage services on a node\nin a general form. This allows you to either activate any services or indicate that\nspecific services are running and should be deactivated."),(0,i.kt)("h2",{id:"start-and-enable-required-services"},"Start and enable required services"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-yaml"},'services_required_default:\n - cron\nservices_required_extra: []\nservices_required: "{{ services_required_default + services_required_extra }}"\n')),(0,i.kt)("admonition",{type:"note"},(0,i.kt)("p",{parentName:"admonition"},(0,i.kt)("inlineCode",{parentName:"p"},"services_required")," should not be overwritten. Use ",(0,i.kt)("inlineCode",{parentName:"p"},"services_required_extra")," to add extra services.")),(0,i.kt)("h2",{id:"note-on-services-that-should-be-deactivated"},"Note on services that should be deactivated"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-yaml"},'services_warning_default:\n - nscd\nservices_warning_extra: []\nservices_warning: "{{ services_warning_default + services_warning_extra }}"\n')),(0,i.kt)("admonition",{type:"note"},(0,i.kt)("p",{parentName:"admonition"},(0,i.kt)("inlineCode",{parentName:"p"},"services_warning")," should not be overwritten. Use ",(0,i.kt)("inlineCode",{parentName:"p"},"services_warning_extra")," to add extra services.")))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/dfce392e.26c34b2f.js b/assets/js/dfce392e.26c34b2f.js new file mode 100644 index 0000000000..fe4cbd59d5 --- /dev/null +++ b/assets/js/dfce392e.26c34b2f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3414],{3905:(e,t,n)=>{n.d(t,{Zo:()=>l,kt:()=>f});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=r.createContext({}),p=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},l=function(e){var t=p(e.components);return r.createElement(c.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),u=p(n),m=a,f=u["".concat(c,".").concat(m)]||u[m]||d[m]||o;return n?r.createElement(f,i(i({ref:t},l),{},{components:n})):r.createElement(f,i({ref:t},l))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[u]="string"==typeof e?e:a,i[1]=s;for(var p=2;p<o;p++)i[p]=n[p];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},51660:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>p});var r=n(87462),a=(n(67294),n(3905));const o={title:"Status page reference implementation decision",type:"Decision Record",status:"Draft",track:"Ops"},i=void 0,s={unversionedId:"scs-0401-v1-status-page-reference-implementation-decision",id:"scs-0401-v1-status-page-reference-implementation-decision",title:"Status page reference implementation decision",description:"Introduction",source:"@site/standards/scs-0401-v1-status-page-reference-implementation-decision.md",sourceDirName:".",slug:"/scs-0401-v1-status-page-reference-implementation-decision",permalink:"/standards/scs-0401-v1-status-page-reference-implementation-decision",draft:!1,tags:[],version:"current",frontMatter:{title:"Status page reference implementation decision",type:"Decision Record",status:"Draft",track:"Ops"},sidebar:"standards",previous:{title:"SCS-0401",permalink:"/standards/standards/scs-0401"},next:{title:"SCS-0402",permalink:"/standards/standards/scs-0402"}},c={},p=[{value:"Introduction",id:"introduction",level:2},{value:"Motivation",id:"motivation",level:2},{value:"Decision",id:"decision",level:2},{value:"Programming Language",id:"programming-language",level:3},{value:"Database",id:"database",level:3}],l={toc:p},u="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(u,(0,r.Z)({},l,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"introduction"},"Introduction"),(0,a.kt)("p",null,"For the reference implementation of the status page API defined by the ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/status-page-openapi"},"OpenAPI spec")," some decision should be made to which technlogy to be used and why."),(0,a.kt)("p",null,"A reference implementation should be of use to most of the intended group, but is not necsessarily applicable for every use case."),(0,a.kt)("h2",{id:"motivation"},"Motivation"),(0,a.kt)("p",null,"For a reference implementation to be of any use, some common and widely used technologies should be used, so it's useful to most of the intended user group."),(0,a.kt)("h2",{id:"decision"},"Decision"),(0,a.kt)("h3",{id:"programming-language"},"Programming Language"),(0,a.kt)("p",null,"The status page application consists of an api server as well as a frontend. For implementing the ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/status-page-api"},"api server"),", which is generated from the ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/status-page-openapi"},"OpenAPI spec"),", ",(0,a.kt)("a",{parentName:"p",href:"https://go.dev/"},"Go")," was chosen, because of maturity and wide spread usage as industry standard. Go, in particular, is a modern programming language and is commonly used in network and cloud computing environments."),(0,a.kt)("h3",{id:"database"},"Database"),(0,a.kt)("p",null,"As database, ",(0,a.kt)("a",{parentName:"p",href:"https://www.postgresql.org/"},"PostgreSQL")," was chosen, since it is a mature, well-known database. PostgreSQL can be run in various environments from small setups to scaled setups.\nFurthermore PostgreSQL is a very healthy project with an active community and a solid license. It easily passed the ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Drafts/OSS-Health.md"},"SCS OSS health check"),"."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/dfe27b1e.573cbd5b.js b/assets/js/dfe27b1e.573cbd5b.js new file mode 100644 index 0000000000..6267849363 --- /dev/null +++ b/assets/js/dfe27b1e.573cbd5b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[503],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>g});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function c(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),l=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},p=function(e){var t=l(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=l(n),d=a,g=u["".concat(i,".").concat(d)]||u[d]||m[d]||o;return n?r.createElement(g,c(c({ref:t},p),{},{components:n})):r.createElement(g,c({ref:t},p))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,c=new Array(o);c[0]=d;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[u]="string"==typeof e?e:a,c[1]=s;for(var l=2;l<o;l++)c[l]=n[l];return r.createElement.apply(null,c)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},96828:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>c,default:()=>m,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var r=n(87462),a=(n(67294),n(3905));const o={},c="Managing many clusters",s={unversionedId:"container/components/k8s-cluster-api-provider/doc/usage/managing-many-clusters",id:"container/components/k8s-cluster-api-provider/doc/usage/managing-many-clusters",title:"Managing many clusters",description:"While the scripts all use a default testcluster, they have",source:"@site/docs/03-container/components/k8s-cluster-api-provider/doc/usage/managing-many-clusters.md",sourceDirName:"03-container/components/k8s-cluster-api-provider/doc/usage",slug:"/container/components/k8s-cluster-api-provider/doc/usage/managing-many-clusters",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/usage/managing-many-clusters",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/03-container/components/k8s-cluster-api-provider/doc/usage/managing-many-clusters.md",tags:[],version:"current",frontMatter:{},sidebar:"docs",previous:{title:"Create a new cluster",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/usage/create-new-cluster"},next:{title:"Cluster Management on the capi management node",permalink:"/docs/container/components/k8s-cluster-api-provider/doc/usage/cluster-mgmt-capi-mgmt-node"}},i={},l=[],p={toc:l},u="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(u,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"managing-many-clusters"},"Managing many clusters"),(0,a.kt)("p",null,"While the scripts all use a default ",(0,a.kt)("inlineCode",{parentName:"p"},"testcluster"),", they have\nbeen developed and tested to manage many clusters from a single management\nnode. Copy the ",(0,a.kt)("inlineCode",{parentName:"p"},"~/cluster-defaults/clusterctl.yaml")," file to\n",(0,a.kt)("inlineCode",{parentName:"p"},"~/MYCLUSTER/clusterctl.yaml"),"\nand edit the copy to describe the properties of the cluster to be created.\nUse ",(0,a.kt)("inlineCode",{parentName:"p"},"./create_cluster.sh MYCLUSTER")," then to create a workload cluster\nwith the name ",(0,a.kt)("inlineCode",{parentName:"p"},"MYCLUSTER"),". You will find the kubeconfig file in\n",(0,a.kt)("inlineCode",{parentName:"p"},"~/MYCLUSTER/MYCLUSTER.yaml"),", granting its owner admin access to that cluster.\nLikewise, ",(0,a.kt)("inlineCode",{parentName:"p"},"delete_cluster.sh")," and the ",(0,a.kt)("inlineCode",{parentName:"p"},"apply_*.sh")," scripts take a\ncluster name as parameter."),(0,a.kt)("p",null,"This way, dozens of clusters can be controlled from one management server."),(0,a.kt)("p",null,"You can add credentials from different projects into\n",(0,a.kt)("inlineCode",{parentName:"p"},"~/.config/openstack/clouds.yaml")," and reference them in the ",(0,a.kt)("inlineCode",{parentName:"p"},"OPENSTACK_CLOUD"),"\nsetting in ",(0,a.kt)("inlineCode",{parentName:"p"},"clusterctl.yaml"),", this way managing clusters in many different\nprojects and even clouds from one management server."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e24c1f8d.cc8bc8ba.js b/assets/js/e24c1f8d.cc8bc8ba.js new file mode 100644 index 0000000000..05259060ed --- /dev/null +++ b/assets/js/e24c1f8d.cc8bc8ba.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3836],{3905:(t,e,n)=>{n.d(e,{Zo:()=>p,kt:()=>g});var a=n(67294);function r(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function l(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);e&&(a=a.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,a)}return n}function i(t){for(var e=1;e<arguments.length;e++){var n=null!=arguments[e]?arguments[e]:{};e%2?l(Object(n),!0).forEach((function(e){r(t,e,n[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(n,e))}))}return t}function o(t,e){if(null==t)return{};var n,a,r=function(t,e){if(null==t)return{};var n,a,r={},l=Object.keys(t);for(a=0;a<l.length;a++)n=l[a],e.indexOf(n)>=0||(r[n]=t[n]);return r}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(a=0;a<l.length;a++)n=l[a],e.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(r[n]=t[n])}return r}var s=a.createContext({}),m=function(t){var e=a.useContext(s),n=e;return t&&(n="function"==typeof t?t(e):i(i({},e),t)),n},p=function(t){var e=m(t.components);return a.createElement(s.Provider,{value:e},t.children)},u="mdxType",c={inlineCode:"code",wrapper:function(t){var e=t.children;return a.createElement(a.Fragment,{},e)}},d=a.forwardRef((function(t,e){var n=t.components,r=t.mdxType,l=t.originalType,s=t.parentName,p=o(t,["components","mdxType","originalType","parentName"]),u=m(n),d=r,g=u["".concat(s,".").concat(d)]||u[d]||c[d]||l;return n?a.createElement(g,i(i({ref:e},p),{},{components:n})):a.createElement(g,i({ref:e},p))}));function g(t,e){var n=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var l=n.length,i=new Array(l);i[0]=d;var o={};for(var s in e)hasOwnProperty.call(e,s)&&(o[s]=e[s]);o.originalType=t,o[u]="string"==typeof t?t:r,i[1]=o;for(var m=2;m<l;m++)i[m]=n[m];return a.createElement.apply(null,i)}return a.createElement.apply(null,n)}d.displayName="MDXCreateElement"},61981:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>s,contentTitle:()=>i,default:()=>c,frontMatter:()=>l,metadata:()=>o,toc:()=>m});var a=n(87462),r=(n(67294),n(3905));const l={sidebar_label:"Sysctl"},i="Sysctl",o={unversionedId:"iaas/guides/configuration-guide/commons/sysctl",id:"iaas/guides/configuration-guide/commons/sysctl",title:"Sysctl",description:"With the osism.commons.sysctl role, it is possible to manage the attributes of the kernel",source:"@site/docs/02-iaas/guides/configuration-guide/commons/sysctl.md",sourceDirName:"02-iaas/guides/configuration-guide/commons",slug:"/iaas/guides/configuration-guide/commons/sysctl",permalink:"/docs/iaas/guides/configuration-guide/commons/sysctl",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/configuration-guide/commons/sysctl.md",tags:[],version:"current",frontMatter:{sidebar_label:"Sysctl"},sidebar:"docs",previous:{title:"SSH Config",permalink:"/docs/iaas/guides/configuration-guide/commons/sshconfig"},next:{title:"Timezone",permalink:"/docs/iaas/guides/configuration-guide/commons/timezone"}},s={},m=[],p={toc:m},u="wrapper";function c(t){let{components:e,...n}=t;return(0,r.kt)(u,(0,a.Z)({},p,n,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"sysctl"},"Sysctl"),(0,r.kt)("p",null,"With the ",(0,r.kt)("inlineCode",{parentName:"p"},"osism.commons.sysctl")," role, it is possible to manage the attributes of the kernel\nvia ",(0,r.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Sysctl"},"sysctl")," on a node."),(0,r.kt)("p",null,"The following defaults are set via the parameter ",(0,r.kt)("inlineCode",{parentName:"p"},"sysctl_defaults"),"."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"Group")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"Attribute")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"Default")))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"elasticsearch"),(0,r.kt)("td",{parentName:"tr",align:null},"vm.max_map_count"),(0,r.kt)("td",{parentName:"tr",align:null},"262144")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"rabbitmq"),(0,r.kt)("td",{parentName:"tr",align:null},"net.ipv4.tcp_keepalive_time"),(0,r.kt)("td",{parentName:"tr",align:null},"6")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"rabbitmq"),(0,r.kt)("td",{parentName:"tr",align:null},"net.ipv4.tcp_keepalive_intvl"),(0,r.kt)("td",{parentName:"tr",align:null},"3")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"rabbitmq"),(0,r.kt)("td",{parentName:"tr",align:null},"net.ipv4.tcp_keepalive_probes"),(0,r.kt)("td",{parentName:"tr",align:null},"3")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"rabbitmq"),(0,r.kt)("td",{parentName:"tr",align:null},"net.core.wmem_max"),(0,r.kt)("td",{parentName:"tr",align:null},"16777216")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"rabbitmq"),(0,r.kt)("td",{parentName:"tr",align:null},"net.core.rmem_max"),(0,r.kt)("td",{parentName:"tr",align:null},"16777216")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"rabbitmq"),(0,r.kt)("td",{parentName:"tr",align:null},"net.ipv4.tcp_fin_timeout"),(0,r.kt)("td",{parentName:"tr",align:null},"20")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"rabbitmq"),(0,r.kt)("td",{parentName:"tr",align:null},"net.ipv4.tcp_tw_reuse"),(0,r.kt)("td",{parentName:"tr",align:null},"1")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"rabbitmq"),(0,r.kt)("td",{parentName:"tr",align:null},"net.core.somaxconn"),(0,r.kt)("td",{parentName:"tr",align:null},"4096")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"rabbitmq"),(0,r.kt)("td",{parentName:"tr",align:null},"net.ipv4.tcp_syncookies"),(0,r.kt)("td",{parentName:"tr",align:null},"0")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"rabbitmq"),(0,r.kt)("td",{parentName:"tr",align:null},"net.ipv4.tcp_max_syn_backlog"),(0,r.kt)("td",{parentName:"tr",align:null},"8192")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"generic"),(0,r.kt)("td",{parentName:"tr",align:null},"vm.swappiness"),(0,r.kt)("td",{parentName:"tr",align:null},"1")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"compute"),(0,r.kt)("td",{parentName:"tr",align:null},"net.netfilter.nf_conntrack_max"),(0,r.kt)("td",{parentName:"tr",align:null},"1048576")))),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"sysctl_extra")," parameter can be used to set your own parameters or overwrite existing\nparameters in the defaults."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",256:!0,className:"language-yaml",metastring:'title="Set attribute fs.inotify.max_user_instances to 256 for all nodes in group generic"',title:'"Set',attribute:!0,"fs.inotify.max_user_instances":!0,to:!0,for:!0,all:!0,nodes:!0,in:!0,group:!0,'generic"':!0},"sysctl_extra:\n generic:\n - name: fs.inotify.max_user_instances\n value: 256\n")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e44168e5.8403ffa6.js b/assets/js/e44168e5.8403ffa6.js new file mode 100644 index 0000000000..b1304f6cd7 --- /dev/null +++ b/assets/js/e44168e5.8403ffa6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[361],{3905:(t,e,r)=>{r.d(e,{Zo:()=>s,kt:()=>g});var n=r(67294);function o(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function i(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function a(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{};e%2?i(Object(r),!0).forEach((function(e){o(t,e,r[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}))}return t}function c(t,e){if(null==t)return{};var r,n,o=function(t,e){if(null==t)return{};var r,n,o={},i=Object.keys(t);for(n=0;n<i.length;n++)r=i[n],e.indexOf(r)>=0||(o[r]=t[r]);return o}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(n=0;n<i.length;n++)r=i[n],e.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(t,r)&&(o[r]=t[r])}return o}var l=n.createContext({}),u=function(t){var e=n.useContext(l),r=e;return t&&(r="function"==typeof t?t(e):a(a({},e),t)),r},s=function(t){var e=u(t.components);return n.createElement(l.Provider,{value:e},t.children)},p="mdxType",f={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},d=n.forwardRef((function(t,e){var r=t.components,o=t.mdxType,i=t.originalType,l=t.parentName,s=c(t,["components","mdxType","originalType","parentName"]),p=u(r),d=o,g=p["".concat(l,".").concat(d)]||p[d]||f[d]||i;return r?n.createElement(g,a(a({ref:e},s),{},{components:r})):n.createElement(g,a({ref:e},s))}));function g(t,e){var r=arguments,o=e&&e.mdxType;if("string"==typeof t||o){var i=r.length,a=new Array(i);a[0]=d;var c={};for(var l in e)hasOwnProperty.call(e,l)&&(c[l]=e[l]);c.originalType=t,c[p]="string"==typeof t?t:o,a[1]=c;for(var u=2;u<i;u++)a[u]=r[u];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},48444:(t,e,r)=>{r.r(e),r.d(e,{assets:()=>l,contentTitle:()=>a,default:()=>f,frontMatter:()=>i,metadata:()=>c,toc:()=>u});var n=r(87462),o=(r(67294),r(3905));const i={sidebar:2},a="Virtualization",c={unversionedId:"getting-started/virtualization",id:"getting-started/virtualization",title:"Virtualization",description:"TODO",source:"@site/docs/01-getting-started/virtualization.md",sourceDirName:"01-getting-started",slug:"/getting-started/virtualization",permalink:"/docs/getting-started/virtualization",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/01-getting-started/virtualization.md",tags:[],version:"current",frontMatter:{sidebar:2}},l={},u=[],s={toc:u},p="wrapper";function f(t){let{components:e,...r}=t;return(0,o.kt)(p,(0,n.Z)({},s,r,{components:e,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"virtualization"},"Virtualization"),(0,o.kt)("p",null,"TODO"))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e57b2c87.e698bb2d.js b/assets/js/e57b2c87.e698bb2d.js new file mode 100644 index 0000000000..e822cec0c2 --- /dev/null +++ b/assets/js/e57b2c87.e698bb2d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5230],{3905:(e,n,t)=>{t.d(n,{Zo:()=>l,kt:()=>u});var o=t(67294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function a(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);n&&(o=o.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,o)}return t}function p(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?a(Object(t),!0).forEach((function(n){r(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):a(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}function s(e,n){if(null==e)return{};var t,o,r=function(e,n){if(null==e)return{};var t,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)t=a[o],n.indexOf(t)>=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o<a.length;o++)t=a[o],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var i=o.createContext({}),c=function(e){var n=o.useContext(i),t=n;return e&&(t="function"==typeof e?e(n):p(p({},n),e)),t},l=function(e){var n=c(e.components);return o.createElement(i.Provider,{value:n},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return o.createElement(o.Fragment,{},n)}},f=o.forwardRef((function(e,n){var t=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),m=c(t),f=r,u=m["".concat(i,".").concat(f)]||m[f]||d[f]||a;return t?o.createElement(u,p(p({ref:n},l),{},{components:t})):o.createElement(u,p({ref:n},l))}));function u(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var a=t.length,p=new Array(a);p[0]=f;var s={};for(var i in n)hasOwnProperty.call(n,i)&&(s[i]=n[i]);s.originalType=e,s[m]="string"==typeof e?e:r,p[1]=s;for(var c=2;c<a;c++)p[c]=t[c];return o.createElement.apply(null,p)}return o.createElement.apply(null,t)}f.displayName="MDXCreateElement"},84878:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>p,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var o=t(87462),r=(t(67294),t(3905));const a={},p="Component Overview",s={unversionedId:"operating-scs/components/status-page/docs/component_overview",id:"operating-scs/components/status-page/docs/component_overview",title:"Component Overview",description:"This represents a part of the decision process related to the overall structure the API wants to represent.",source:"@site/docs/04-operating-scs/components/status-page/docs/component_overview.md",sourceDirName:"04-operating-scs/components/status-page/docs",slug:"/operating-scs/components/status-page/docs/component_overview",permalink:"/docs/operating-scs/components/status-page/docs/component_overview",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/04-operating-scs/components/status-page/docs/component_overview.md",tags:[],version:"current",frontMatter:{},sidebar:"docs",previous:{title:"Overview",permalink:"/docs/operating-scs/components/status-page/docs/overview"},next:{title:"Components",permalink:"/docs/operating-scs/components/status-page/docs/components"}},i={},c=[],l={toc:c},m="wrapper";function d(e){let{components:n,...t}=e;return(0,r.kt)(m,(0,o.Z)({},l,t,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"component-overview"},"Component Overview"),(0,r.kt)("p",null,"This represents a part of the decision process related to the overall structure the API wants to represent."),(0,r.kt)("mermaid",{value:'C4Component\n title status-page-openapi\n\n Container_Boundary(impacts, "Impacts") {\n Component(impactType, ImpactType, "ID, displayName, description")\n Component(impact, Impact, "type, reference")\n Component(impactComponentList, ImpactComponentList, "[]Impact", "Impacts reference components")\n Component(impactIncidentList, ImpactIncidentList, "<<readonly>>[]Impact", "Impacts reference incidents")\n\n Rel(impact, impactType, "has")\n Rel(impactComponentList, impact, "lists")\n Rel(impactIncidentList, impact, "lists")\n\n UpdateElementStyle(impact, $bgColor="green")\n UpdateElementStyle(impactComponentList, $bgColor="green")\n UpdateElementStyle(impactIncidentList, $bgColor="green")\n\n UpdateRelStyle(impact, impactType, "green", "green", $offsetY="-10")\n UpdateRelStyle(impactComponentList, impact, "green", "green", $offsetY="-15")\n UpdateRelStyle(impactIncidentList, impact, "green", "green")\n }\n\n Container_Boundary(incidents, "Incidents") {\n Component(incidentUpdate, IncidentUpdate, "order, displayName, description, createdAt")\n Component(incident, Incident, "ID, displayName, description, updates, affects, beganAt, endedAt, Phase")\n\n Rel(incident, incidentUpdate, "contains")\n }\n\n Container_Boundary(phases, "Phases") {\n Component(phaseReference, PhaseReference, "Phase, order, generation")\n Component(phase, Phase, "", "it is just a name")\n Component(phaseList, PhaseList, "generation, []Phase")\n\n Rel(phaseList, phase, "lists")\n Rel(phaseReference, phase, "references")\n Rel(phaseReference, phaseList, "references")\n\n UpdateElementStyle(phaseReference, $bgColor="green")\n UpdateElementStyle(phaseList, $bgColor="green")\n\n UpdateRelStyle(phaseList, phase, "green", "green", $offsetY="5")\n UpdateRelStyle(phaseReference, phase, "green", "green", $offsetX="-30", $offsetY="10")\n UpdateRelStyle(phaseReference, phaseList, "green", "green", $offsetY="5")\n\n }\n\n Container_Boundary(components, "Components") {\n Component(component, Component, "ID, displayName, Labels, activelyAffectedBy")\n Component(labels, Labels, "", "Key value pairs")\n\n Rel(component, labels, "contains")\n }\n\n %% global relations %%\n %% deprecated %%\n Rel(incident, impactType, "has")\n BiRel(component, incident, "affects / affected by")\n\n UpdateRelStyle(incident, impactType, "red", "red")\n UpdateRelStyle(component, incident, "red", "red", $offsetX="10")\n\n %% new %%\n Rel(incident, impactComponentList, "affects")\n Rel(component, impactIncidentList, "actively affected by", "only list active/open impacts")\n Rel(incident, phaseReference, "has")\n Rel(impact, component, "references", "from impactComponentList")\n Rel(impact, incident, "references", "from impactIncidentList")\n\n UpdateRelStyle(incident, impactComponentList, "green", "green")\n UpdateRelStyle(component, impactIncidentList, "green", "green", $offsetX="-180", $offsetY="-70")\n UpdateRelStyle(incident, phaseReference, "green", "green", $offsetX="-70", $offsetY="40")\n UpdateRelStyle(impact, component, "green", "green", $offsetX="-140")\n UpdateRelStyle(impact, incident, "green", "green", $offsetX="-100")\n'}),(0,r.kt)("p",null,"Color meaning:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Blue: Existing structure"),(0,r.kt)("li",{parentName:"ul"},"Red: Deprecated / removed"),(0,r.kt)("li",{parentName:"ul"},"Green: New")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e5a53cb8.2a2a4151.js b/assets/js/e5a53cb8.2a2a4151.js new file mode 100644 index 0000000000..ba1f8762b1 --- /dev/null +++ b/assets/js/e5a53cb8.2a2a4151.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5929],{54781:s=>{s.exports=JSON.parse('{"title":"SCS-0111","slug":"standards/scs-0111","permalink":"/standards/standards/scs-0111","navigation":{"previous":{"title":"SSD Flavors","permalink":"/standards/scs-0110-v1-ssd-flavors"},"next":{"title":"Decisions for the Volume Type Standard","permalink":"/standards/scs-0111-v1-volume-type-decisions"}}}')}}]); \ No newline at end of file diff --git a/assets/js/e747ec83.fe9df707.js b/assets/js/e747ec83.fe9df707.js new file mode 100644 index 0000000000..6a03d0355e --- /dev/null +++ b/assets/js/e747ec83.fe9df707.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2291],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>f});var n=a(67294);function o(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?r(Object(a),!0).forEach((function(t){o(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):r(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function s(e,t){if(null==e)return{};var a,n,o=function(e,t){if(null==e)return{};var a,n,o={},r=Object.keys(e);for(n=0;n<r.length;n++)a=r[n],t.indexOf(a)>=0||(o[a]=e[a]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n<r.length;n++)a=r[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(o[a]=e[a])}return o}var l=n.createContext({}),c=function(e){var t=n.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},d=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},u="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},p=n.forwardRef((function(e,t){var a=e.components,o=e.mdxType,r=e.originalType,l=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),u=c(a),p=o,f=u["".concat(l,".").concat(p)]||u[p]||h[p]||r;return a?n.createElement(f,i(i({ref:t},d),{},{components:a})):n.createElement(f,i({ref:t},d))}));function f(e,t){var a=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=a.length,i=new Array(r);i[0]=p;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:o,i[1]=s;for(var c=2;c<r;c++)i[c]=a[c];return n.createElement.apply(null,i)}return n.createElement.apply(null,a)}p.displayName="MDXCreateElement"},45309:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>r,metadata:()=>s,toc:()=>c});var n=a(87462),o=(a(67294),a(3905));const r={},i="Glossary",s={unversionedId:"glossary",id:"glossary",title:"Glossary",description:"This file serves as the central glossary within SCS. It is intended to clearly",source:"@site/docs/glossary.md",sourceDirName:".",slug:"/glossary",permalink:"/docs/glossary",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/glossary.md",tags:[],version:"current",frontMatter:{},sidebar:"docs",previous:{title:"Frequently Asked Questions",permalink:"/docs/faq/"}},l={},c=[{value:"Definition of a Region",id:"definition-of-a-region",level:2},{value:"Definition of a Availability Zone",id:"definition-of-a-availability-zone",level:2},{value:"Definition of Host Aggregates",id:"definition-of-host-aggregates",level:2},{value:"Definition of a Cell",id:"definition-of-a-cell",level:2},{value:"Definition of a Control Plane",id:"definition-of-a-control-plane",level:2},{value:"Definition of Control Node",id:"definition-of-control-node",level:2},{value:"Definition of Compute Node",id:"definition-of-compute-node",level:2},{value:"Definition of Manager Node",id:"definition-of-manager-node",level:2},{value:"Definition of provider network",id:"definition-of-provider-network",level:2},{value:"Definition of API",id:"definition-of-api",level:2},{value:"Horizon",id:"horizon",level:2},{value:"Message Queue",id:"message-queue",level:2},{value:"Keystone",id:"keystone",level:2},{value:"Glance",id:"glance",level:2},{value:"OSISM",id:"osism",level:2},{value:"Ceph",id:"ceph",level:2},{value:"Nova",id:"nova",level:2},{value:"Neutron",id:"neutron",level:2},{value:"Cinder",id:"cinder",level:2},{value:"Swift",id:"swift",level:2},{value:"Ceph OSD",id:"ceph-osd",level:2},{value:"Personas",id:"personas",level:2}],d={toc:c},u="wrapper";function h(e){let{components:t,...a}=e;return(0,o.kt)(u,(0,n.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"glossary"},"Glossary"),(0,o.kt)("p",null,"This file serves as the central glossary within SCS. It is intended to clearly\ndefine terms used within SCS where there may be differing understandings. The\nglossary is not intended to evaluate or standardize specific terms."),(0,o.kt)("h2",{id:"definition-of-a-region"},"Definition of a Region"),(0,o.kt)("p",null,"An OpenStack/SCS region consists of at least one or more Availability Zones that share a Control Plane with their services. As a result, they share one API. Also a Control Plane can share one CEPH cluster over different fire departments or each Availbility Zone can have its own CEPH cluster. Within the region, any Layer 2 networks are available to the user. Availbility Zones which build a region are connected by redundant low-latency (<2ms (guess!!) ) high bandwidth (10s of Gbps) connections."),(0,o.kt)("p",null,"Regions can be federated when the SCS code is ready."),(0,o.kt)("h2",{id:"definition-of-a-availability-zone"},"Definition of a Availability Zone"),(0,o.kt)("p",null,"An Availability Zone is a (physical) group of multiple compute nodes, controlled by the region's control plane that provides the API and interface."),(0,o.kt)("p",null,"An Availability Zone allows OpenStack compute hosts to be divided into logical groups and provides a form of physical isolation and redundancy from other Availability Zones, for example by using a separate power supply or network devices."),(0,o.kt)("p",null,"When users provision resources, they can specify in which Availability Zone their instances should be created. In this way, customers can ensure that their application resources are distributed across different failure domains to achieve high availability in the event of a hardware failure."),(0,o.kt)("h2",{id:"definition-of-host-aggregates"},"Definition of Host Aggregates"),(0,o.kt)("p",null,"Host aggregates are a mechanism for partitioning compute nodes which is not explicitly visible to users in an OpenStack/SCS cloud. Host aggregates are based on arbitrary characteristics such as server type, processor type, GPU, disk speed, etc.\nAdministrators assign flavors to host aggregates by specifying metadata on the host aggregate and customizing the extra specifications of the flavor. It is then up to the Nova scheduler to determine the best match for the user request. Compute nodes can also be in more than one host aggregate."),(0,o.kt)("p",null,"Optionally, one can designate a host aggregate as an Availability Zone, e.g. for simplification reasons of the user selection of an availbility zone.\nAvailability Zones differ from Host Aggregates in that they are shown to the user as a Nova boot option, so Compute VMs can be started on them.\nCompute Nodes, however, can only be in a single Availability Zone. We can configure a default Availability Zone where instances will be scheduled if the user does not specify an Availability Zone."),(0,o.kt)("p",null,"Info: A prerequisite for creating an Availability Zone is a host aggregate."),(0,o.kt)("h2",{id:"definition-of-a-cell"},"Definition of a Cell"),(0,o.kt)("p",null,"The Cells paradigm simplifies the handling of large Openstack deployments."),(0,o.kt)("p",null,"Cells is an OpenStack Nova feature that improves scalability for Nova in OpenStack Platform. Each Cell has a separate database and message queue, which increases performance when scaling. One can provision additional Cells to handle large deployments, and compared to Regions, this allows access to a large number of compute nodes through a single API."),(0,o.kt)("p",null,"Each Cell has its own Cell controllers running the database server and RabbitMQ along with the Nova Conductor services."),(0,o.kt)("p",null,'Nova Conductor services, called "Super Conductor", continue to run on the main controller nodes.'),(0,o.kt)("p",null,"The services in the Cell Controllers can still call placement APIs, but cannot access other API layer services via RPC, nor can they access global API databases on the control nodes."),(0,o.kt)("h2",{id:"definition-of-a-control-plane"},"Definition of a Control Plane"),(0,o.kt)("p",null,"In Openstack/SCS, a Control Plane consists of at least 5 hardware nodes, which together serve several Availability Zones and thus provide a common usable API for a region. The Control Plane also shares the network (Neutron), the Scheduler and the CEPH services."),(0,o.kt)("p",null,"It includes the Controller Nodes (Galera Cluster, RabbitMQ) and the Manager Nodes, Maas,..."),(0,o.kt)("h2",{id:"definition-of-control-node"},"Definition of Control Node"),(0,o.kt)("p",null,"The Control Node runs the Identity Service, Image Service , management processes for compute nodes, management processes for networking, various networking agents, and the Dashboard. It also includes supporting services such as an SQL database, a message queue, and NTP."),(0,o.kt)("p",null,"Optionally, the Controller Node runs parts of the Block Storage, Object Storage, Orchestration and Telemetry services."),(0,o.kt)("p",null,"The Controller Node requires at least two network interfaces."),(0,o.kt)("h2",{id:"definition-of-compute-node"},"Definition of Compute Node"),(0,o.kt)("p",null,"A compute host runs the hypervisor part of compute that runs instances. By default, compute uses the KVM hypervisor. The compute host also runs a networking service agent that connects instances to virtual networks and provides firewall services to the instances through security groups."),(0,o.kt)("p",null,"If you offer hyper-converged infrastructure, a compute host also serves the Ceph. This makes the storage dynamically scalable (horizontally and vertically). For the Ceph services, 1 CPU core and 4 GB of RAM are reserved per OSD to ensure appropriate performance."),(0,o.kt)("h2",{id:"definition-of-manager-node"},"Definition of Manager Node"),(0,o.kt)("p",null,"From here, the OSISM Ansible playbooks are applied to the environment. Furthermore, the following services often run here non-redundantly: Prometheus server,...."),(0,o.kt)("h2",{id:"definition-of-provider-network"},"Definition of provider network"),(0,o.kt)("p",null,'The provider network is the network that is "in front", i.e. at the output points of the openstack/SCS. This is usually a public network, but can also be a private network in individual cases. IPs from the provider network can be assigned to instances within the SCS. The same applies to load balancers, of course.'),(0,o.kt)("h2",{id:"definition-of-api"},"Definition of API"),(0,o.kt)("p",null,"The Rest API provides the core of openstack/SCS and can be addressed for a whole region. It accepts and responds to end-user API calls. The service supports the OpenStack Compute API, the Amazon EC2 API, and a special Admin API for privileged users to perform administrative actions. Policies are enforced and most orchestration actions can be started, such as launching an instance."),(0,o.kt)("h2",{id:"horizon"},"Horizon"),(0,o.kt)("p",null,"Horizon is openstack's preferred GUI for the end user, but also for the administrator for a quick overview. It runs on the controller node. Other GUIs are possible, also GUIs which replace the horizon interface"),(0,o.kt)("h2",{id:"message-queue"},"Message Queue"),(0,o.kt)("p",null,"Most OpenStack services communicate with each other through the message queue. For example, Compute communicates with Block Storage services and Network services via the message queue. RabbitMQ, Qpid, and Zeromq are popular choices for a message queue service. When the message queue fails or becomes inaccessible, the cluster generally comes to a halt and ends up in a read-only state where the information is stuck at the point where the last message was sent. Therefore, this is clustered. RabbitMQ has shown itself to be the most widespread and best supported variant in the OpenStack context, Qpid occurs occasionally, ZeroMQ lacks HA functionality to date"),(0,o.kt)("h2",{id:"keystone"},"Keystone"),(0,o.kt)("p",null,'( The OpenStack Identity module called Keystone is used as an authentication and rights system between the OpenStack components. Keystone divides access to projects in the cloud into so-called "tenants". A tenant is a tenant of the cloud and has at least one assigned user. It is possible to create multiple users per tenant with different rights. Keystone uses a token system for authorization and also supports the connection to other authentication options such as LDAP. (wikipedia) )'),(0,o.kt)("h2",{id:"glance"},"Glance"),(0,o.kt)("p",null,"The OpenStack Image Service, also called Glance, is a service that provides virtual machine images to OpenStack users. These images are used by Nova as a template to compile virtual machine instances. Both local hard disks and object storage solutions such as Swift or Ceph can be used as storage backends."),(0,o.kt)("p",null,"In addition to the images, Glance can also store metadata such as the operating system used or the kernel version. Access to both this metadata and the images themselves is via a REST API. Glance supports a number of formats such as VHD, VMDK and qcow2."),(0,o.kt)("h2",{id:"osism"},"OSISM"),(0,o.kt)("p",null,"The Open Source Infrastructure & Service Manager is a powerful deployment framework for OpenStack and Ceph as well as required services such as a RabbitMQ broker or a MariaDB Galera cluster."),(0,o.kt)("h2",{id:"ceph"},"Ceph"),(0,o.kt)("p",null,"Ceph is an open source distributed storage solution. The core component is RADOS (Reliable Autonomic Distributed Object Store), an object store that can be distributed redundantly over any number of servers. Ceph offers the user three types of storage: An object store compatible with the Swift and S3 API (RADOS Gateway), virtual block devices (RADOS Block Devices) and CephFS, a distributed file system."),(0,o.kt)("h2",{id:"nova"},"Nova"),(0,o.kt)("p",null,"Nova is virtually a synonym for Compute. It is the part of the stack that can manage groups of virtual machines."),(0,o.kt)("p",null,"The virtualized systems can be distributed over any number of so-called compute nodes. Hypervisors supported include KVM, Xen Hyper-V and ESXI. In the community, KVM is considered to be set and best supported (we use KVM), which is controlled via libvirt. ESXI and Hyper-V can be used, sometimes with limited functionality."),(0,o.kt)("h2",{id:"neutron"},"Neutron"),(0,o.kt)("p",null,'The OpenStack Networking module Neutron provides the networking service for OpenStack. Neutron can be used to manage networks, subnets, and IP addresses/floating IPs. A floating IP in OpenStack refers to an official IP that serves as an interface from the internal to the public network. In addition to a load balancer, HA proxy and health monitor, Neutron also supports techniques such as VLAN and VPN. To secure the networks, Neutron uses a firewall that allows versatile port rules, e.g. on a security group basis. For trademark reasons, the OpenStack networking module had to be renamed "Neutron". The previous name was "Quantum."'),(0,o.kt)("p",null,"For the management of the data link layer, Neutron offers the possibility to use various already existing networking software such as Open vSwitch or the bridge functionality of the Linux kernel by means of plugins."),(0,o.kt)("p",null,'In the OpenStack releases since Ussuri, the "OpenVirtualNetwork"(OVN) has established itself, it replaces many of the Neutron components, e.g. L3 and DHCP agent, so that Neutron only has to talk directly to OVN.'),(0,o.kt)("h2",{id:"cinder"},"Cinder"),(0,o.kt)("p",null,"OpenStack Block Storage or Cinder provides virtual block storage in the form of virtualized storage media (hard disks, CDs, etc.). The block storage can be attached to virtual machines. An API interface allows Cinder to connect to Swift so that block storage media can communicate with object storage. Meanwhile, many other storage backends are also fully or partially supported. There is also the option of defining multiple backends and creating a volume type for each backend, so that when a new volume is created, it can be selected on which storage backend the volume is created."),(0,o.kt)("h2",{id:"swift"},"Swift"),(0,o.kt)("p",null,"Swift is the so-called object storage that can be used by Nova. This is responsible for redundant data storage. Swift can also be used as a backend for Cinder or Glance. Objects are stored in so-called containers, which are primarily used to group objects and store metadata and in turn belong to individual accounts. Objects and containers are accessed via a REST API."),(0,o.kt)("h2",{id:"ceph-osd"},"Ceph OSD"),(0,o.kt)("p",null,"A Ceph OSD (Object Storage Daemon) logically represents a storage device in a Ceph cluster, which can logically be a hard disk, which is the ideal case. In other cases it can also be a raid, which however leads to considerable performance limitations due to caching or other raid optimization."),(0,o.kt)("h2",{id:"personas"},"Personas"),(0,o.kt)("table",null,(0,o.kt)("thead",{parentName:"table"},(0,o.kt)("tr",{parentName:"thead"},(0,o.kt)("th",{parentName:"tr",align:null},"Persona"),(0,o.kt)("th",{parentName:"tr",align:null},"Description"))),(0,o.kt)("tbody",{parentName:"table"},(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"SCS Operator"),(0,o.kt)("td",{parentName:"tr",align:null},"The SCS Operator is the one who owns and operates a standardized cloud environment.")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"SCS Operations Team"),(0,o.kt)("td",{parentName:"tr",align:null},"The team at the SCS Operator which actually runs the cloud environment.")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"SCS Consumer"),(0,o.kt)("td",{parentName:"tr",align:null},"The SCS Consumer consumes a standardized SCS environment and operates and orchestrates applications on top of it. The SCS Consumer is typically a customer or user of the SCS Operator.")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"SCS Integrator"),(0,o.kt)("td",{parentName:"tr",align:null},"The SCS Integrator assists in or is building up a standardized cloud environment. The SCS Integrator can be 2nd or 3rd level support for the SCS Operator.")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"SCS Project"),(0,o.kt)("td",{parentName:"tr",align:null},"The SCS Project oversees the overall activities around the Sovereign Cloud Stack.")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"SCS Developer"),(0,o.kt)("td",{parentName:"tr",align:null},"The SCS Developer actively contributes to technical elements of the Sovereign Cloud Stack.")))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/eaf80524.07fe535f.js b/assets/js/eaf80524.07fe535f.js new file mode 100644 index 0000000000..fd7d5b96f6 --- /dev/null +++ b/assets/js/eaf80524.07fe535f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3897],{3905:(t,e,a)=>{a.d(e,{Zo:()=>c,kt:()=>g});var r=a(67294);function n(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function s(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,r)}return a}function o(t){for(var e=1;e<arguments.length;e++){var a=null!=arguments[e]?arguments[e]:{};e%2?s(Object(a),!0).forEach((function(e){n(t,e,a[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(a)):s(Object(a)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(a,e))}))}return t}function i(t,e){if(null==t)return{};var a,r,n=function(t,e){if(null==t)return{};var a,r,n={},s=Object.keys(t);for(r=0;r<s.length;r++)a=s[r],e.indexOf(a)>=0||(n[a]=t[a]);return n}(t,e);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(t);for(r=0;r<s.length;r++)a=s[r],e.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(n[a]=t[a])}return n}var l=r.createContext({}),d=function(t){var e=r.useContext(l),a=e;return t&&(a="function"==typeof t?t(e):o(o({},e),t)),a},c=function(t){var e=d(t.components);return r.createElement(l.Provider,{value:e},t.children)},p="mdxType",u={inlineCode:"code",wrapper:function(t){var e=t.children;return r.createElement(r.Fragment,{},e)}},m=r.forwardRef((function(t,e){var a=t.components,n=t.mdxType,s=t.originalType,l=t.parentName,c=i(t,["components","mdxType","originalType","parentName"]),p=d(a),m=n,g=p["".concat(l,".").concat(m)]||p[m]||u[m]||s;return a?r.createElement(g,o(o({ref:e},c),{},{components:a})):r.createElement(g,o({ref:e},c))}));function g(t,e){var a=arguments,n=e&&e.mdxType;if("string"==typeof t||n){var s=a.length,o=new Array(s);o[0]=m;var i={};for(var l in e)hasOwnProperty.call(e,l)&&(i[l]=e[l]);i.originalType=t,i[p]="string"==typeof t?t:n,o[1]=i;for(var d=2;d<s;d++)o[d]=a[d];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},63472:(t,e,a)=>{a.r(e),a.d(e,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>s,metadata:()=>i,toc:()=>d});var r=a(87462),n=(a(67294),a(3905));const s={},o="Certified Clouds",i={unversionedId:"certification/certified-clouds",id:"certification/certified-clouds",title:"Certified Clouds",description:"This is a list of clouds that we test on a nightly basis against our scs-compatible certification level.",source:"@site/standards/certification/certified-clouds.md",sourceDirName:"certification",slug:"/certification/certified-clouds",permalink:"/standards/certification/certified-clouds",draft:!1,tags:[],version:"current",frontMatter:{}},l={},d=[{value:"SCS standards overview",id:"scs-standards-overview",level:2},{value:"Repo Structure",id:"repo-structure",level:2},{value:"Decisions",id:"decisions",level:3},{value:"Drafts",id:"drafts",level:3},{value:"Standards",id:"standards",level:3},{value:"Tests",id:"tests",level:3}],c={toc:d},p="wrapper";function u(t){let{components:e,...a}=t;return(0,n.kt)(p,(0,r.Z)({},c,a,{components:e,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"certified-clouds"},"Certified Clouds"),(0,n.kt)("p",null,"This is a list of clouds that we test on a nightly basis against our ",(0,n.kt)("inlineCode",{parentName:"p"},"scs-compatible")," certification level."),(0,n.kt)("table",null,(0,n.kt)("thead",{parentName:"table"},(0,n.kt)("tr",{parentName:"thead"},(0,n.kt)("th",{parentName:"tr",align:null},"Name"),(0,n.kt)("th",{parentName:"tr",align:null},"Description"),(0,n.kt)("th",{parentName:"tr",align:null},"Operator"),(0,n.kt)("th",{parentName:"tr",align:"center"},"IaaS Compliance Check"),(0,n.kt)("th",{parentName:"tr",align:"center"},"HealthMon"))),(0,n.kt)("tbody",{parentName:"table"},(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"https://github.com/SovereignCloudStack/docs/blob/main/community/cloud-resources/plusserver-gx-scs.md"},"gx-scs")),(0,n.kt)("td",{parentName:"tr",align:null},"Dev environment provided for SCS & GAIA-X context"),(0,n.kt)("td",{parentName:"tr",align:null},"plusserver GmbH"),(0,n.kt)("td",{parentName:"tr",align:"center"},(0,n.kt)("img",{parentName:"td",src:"https://img.shields.io/github/actions/workflow/status/SovereignCloudStack/standards/check-gx-scs-v1.yml?label=compliant",alt:"GitHub Workflow Status"})),(0,n.kt)("td",{parentName:"tr",align:"center"},(0,n.kt)("a",{parentName:"td",href:"https://health.gx-scs.sovereignit.cloud:3000/"},"HM"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"https://www.plusserver.com/en/products/pluscloud-open"},"pluscloud open - prod1")),(0,n.kt)("td",{parentName:"tr",align:null},"Public cloud for customers"),(0,n.kt)("td",{parentName:"tr",align:null},"plusserver GmbH"),(0,n.kt)("td",{parentName:"tr",align:"center"},(0,n.kt)("img",{parentName:"td",src:"https://img.shields.io/github/actions/workflow/status/SovereignCloudStack/standards/check-pco-prod1-v1.yml?label=compliant",alt:"GitHub Workflow Status"})),(0,n.kt)("td",{parentName:"tr",align:"center"},(0,n.kt)("a",{parentName:"td",href:"https://health.prod1.plusserver.sovereignit.cloud:3000"},"HM"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"https://www.plusserver.com/en/products/pluscloud-open"},"pluscloud open - prod2")),(0,n.kt)("td",{parentName:"tr",align:null},"Public cloud for customers"),(0,n.kt)("td",{parentName:"tr",align:null},"plusserver GmbH"),(0,n.kt)("td",{parentName:"tr",align:"center"},(0,n.kt)("img",{parentName:"td",src:"https://img.shields.io/github/actions/workflow/status/SovereignCloudStack/standards/check-pco-prod2-v1.yml?label=compliant",alt:"GitHub Workflow Status"})),(0,n.kt)("td",{parentName:"tr",align:"center"},(0,n.kt)("a",{parentName:"td",href:"https://health.prod1.plusserver.sovereignit.cloud:3000"},"HM"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"https://www.noris.de/wavestack-cloud/"},"Wavestack")),(0,n.kt)("td",{parentName:"tr",align:null},"Public cloud for customers"),(0,n.kt)("td",{parentName:"tr",align:null},"noris network AG/Wavecon GmbH"),(0,n.kt)("td",{parentName:"tr",align:"center"},(0,n.kt)("img",{parentName:"td",src:"https://img.shields.io/github/actions/workflow/status/SovereignCloudStack/standards/check-wavestack-v3.yml?label=compliant",alt:"GitHub Workflow Status"})),(0,n.kt)("td",{parentName:"tr",align:"center"},(0,n.kt)("a",{parentName:"td",href:"https://health.wavestack1.sovereignit.cloud:3000/"},"HM"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"https://regio.digital"},"REGIO.cloud")),(0,n.kt)("td",{parentName:"tr",align:null},"Public cloud for customers"),(0,n.kt)("td",{parentName:"tr",align:null},"OSISM GmbH"),(0,n.kt)("td",{parentName:"tr",align:"center"},(0,n.kt)("img",{parentName:"td",src:"https://img.shields.io/github/actions/workflow/status/SovereignCloudStack/standards/check-regio-a-v3.yml?label=compliant",alt:"GitHub Workflow Status"})),(0,n.kt)("td",{parentName:"tr",align:"center"},(0,n.kt)("a",{parentName:"td",href:"https://apimon.services.regio.digital/public-dashboards/17cf094a47404398a5b8e35a4a3968d4?orgId=1&refresh=5m"},"Dashboard"))))),(0,n.kt)("h2",{id:"scs-standards-overview"},"SCS standards overview"),(0,n.kt)("p",null,"Standards are organized as certification levels according to ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Standards/scs-0003-v1-sovereign-cloud-standards-yaml.md"},"SCS-0003-v1"),". We currently maintain one certification level ",(0,n.kt)("inlineCode",{parentName:"p"},"scs-compatible")," that is described here: ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Tests/scs-compatible-iaas.yaml"},"Tests/scs-compatible.yaml"),"."),(0,n.kt)("p",null,"More certification levels will follow as the project progresses."),(0,n.kt)("h2",{id:"repo-structure"},"Repo Structure"),(0,n.kt)("p",null,"This repository is organized according to ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Standards/scs-0002-v1-standards-docs-org.md"},"SCS-0002-v1"),"."),(0,n.kt)("h3",{id:"decisions"},"Decisions"),(0,n.kt)("p",null,"Decision Records, see ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Standards/scs-0001-v1-sovereign-cloud-standards.md#types-of-documents"},"Standards/scs-0001-v1-sovereign-cloud-standards.md")),(0,n.kt)("h3",{id:"drafts"},"Drafts"),(0,n.kt)("p",null,"Old Design-Docs folder with existing Architectural Decision Records (ADRs). This directory is currently in the process of being consolidated and cleaned up. See ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Standards/scs-0002-v1-standards-docs-org.md#suggested-cleanup-step-1"},"cleanup step-1")," and ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Standards/scs-0002-v1-standards-docs-org.md#open-questions"},"open questions"),"."),(0,n.kt)("h3",{id:"standards"},"Standards"),(0,n.kt)("p",null,"Official SCS standards, see ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Standards/scs-0001-v1-sovereign-cloud-standards.md"},"Standards/scs-0001-v1-sovereign-cloud-standards.md"),")."),(0,n.kt)("h3",{id:"tests"},"Tests"),(0,n.kt)("p",null,"Testsuite and tools for SCS standards, see ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/standards/blob/main/Tests/README.md"},"Tests/README.md"),"."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/eb99bfed.1ded4987.js b/assets/js/eb99bfed.1ded4987.js new file mode 100644 index 0000000000..26a6823e11 --- /dev/null +++ b/assets/js/eb99bfed.1ded4987.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5961],{3905:(e,t,r)=>{r.d(t,{Zo:()=>l,kt:()=>m});var n=r(67294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function s(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=n.createContext({}),u=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},l=function(e){var t=u(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),p=u(r),g=o,m=p["".concat(c,".").concat(g)]||p[g]||d[g]||a;return r?n.createElement(m,i(i({ref:t},l),{},{components:r})):n.createElement(m,i({ref:t},l))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=g;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[p]="string"==typeof e?e:o,i[1]=s;for(var u=2;u<a;u++)i[u]=r[u];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}g.displayName="MDXCreateElement"},97773:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>u});var n=r(87462),o=(r(67294),r(3905));const a={sidebar_label:"Manager",sidebar_position:10},i="Manager",s={unversionedId:"iaas/guides/troubleshooting-guide/manager",id:"iaas/guides/troubleshooting-guide/manager",title:"Manager",description:"Reset",source:"@site/docs/02-iaas/guides/troubleshooting-guide/manager.md",sourceDirName:"02-iaas/guides/troubleshooting-guide",slug:"/iaas/guides/troubleshooting-guide/manager",permalink:"/docs/iaas/guides/troubleshooting-guide/manager",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/troubleshooting-guide/manager.md",tags:[],version:"current",sidebarPosition:10,frontMatter:{sidebar_label:"Manager",sidebar_position:10},sidebar:"docs",previous:{title:"Troubleshooting Guide",permalink:"/docs/iaas/guides/troubleshooting-guide/"},next:{title:"OpenStack",permalink:"/docs/iaas/guides/troubleshooting-guide/openstack"}},c={},u=[{value:"Reset",id:"reset",level:2}],l={toc:u},p="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(p,(0,n.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"manager"},"Manager"),(0,o.kt)("h2",{id:"reset"},"Reset"),(0,o.kt)("p",null,"Sometimes it is necessary to reset the entire manager service."),(0,o.kt)("admonition",{type:"warning"},(0,o.kt)("p",{parentName:"admonition"},"This is a disruptive action. Data is lost in the course of the process.\nFor example, the database of the ARA service.")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"sudo systemctl stop docker-compose@manager.service\ndocker compose --project-directory /opt/manager down -v\nsudo systemctl start docker-compose@manager.service\n")),(0,o.kt)("p",null,"After starting the manager service, the inventory and the fact cache\nmust be rebuilt."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"osism reconciler sync\nosism apply facts\n")),(0,o.kt)("p",null,"If Ceph is used, the Ceph keys should also be re-provisioned within\nthe manager service."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"osism apply ceph-fetch-keys\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ed24060c.115358fc.js b/assets/js/ed24060c.115358fc.js new file mode 100644 index 0000000000..e84d3ecb15 --- /dev/null +++ b/assets/js/ed24060c.115358fc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8152],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>v});var r=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),d=c(n),m=o,v=d["".concat(s,".").concat(m)]||d[m]||u[m]||i;return n?r.createElement(v,a(a({ref:t},p),{},{components:n})):r.createElement(v,a({ref:t},p))}));function v(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,a=new Array(i);a[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[d]="string"==typeof e?e:o,a[1]=l;for(var c=2;c<i;c++)a[c]=n[c];return r.createElement.apply(null,a)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},35445:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>u,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var r=n(87462),o=(n(67294),n(3905));const i={title:"_Descriptive title_",type:"_Standard | Decision Record_",status:"Draft",track:"_Global | IaaS | Ops | KaaS | IAM_"},a=void 0,l={unversionedId:"scs-XXXX-vN-template",id:"scs-XXXX-vN-template",title:"_Descriptive title_",description:"\x3c!---",source:"@site/standards/scs-XXXX-vN-template.md",sourceDirName:".",slug:"/scs-XXXX-vN-template",permalink:"/standards/scs-XXXX-vN-template",draft:!1,tags:[],version:"current",frontMatter:{title:"_Descriptive title_",type:"_Standard | Decision Record_",status:"Draft",track:"_Global | IaaS | Ops | KaaS | IAM_"}},s={},c=[{value:"Introduction",id:"introduction",level:2},{value:"Motivation",id:"motivation",level:2},{value:"Design Considerations",id:"design-considerations",level:2},{value:"Options considered",id:"options-considered",level:3},{value:"<em>Option 1</em>",id:"option-1",level:4},{value:"<em>Option 2</em>",id:"option-2",level:4},{value:"Open questions",id:"open-questions",level:2},{value:"Decision",id:"decision",level:2},{value:"Related Documents",id:"related-documents",level:2},{value:"Conformance Tests",id:"conformance-tests",level:2}],p={toc:c},d="wrapper";function u(e){let{components:t,...n}=e;return(0,o.kt)(d,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"introduction"},"Introduction"),(0,o.kt)("p",null,"Introduction"),(0,o.kt)("h2",{id:"motivation"},"Motivation"),(0,o.kt)("p",null,"Motivation"),(0,o.kt)("h2",{id:"design-considerations"},"Design Considerations"),(0,o.kt)("p",null,"OPTIONAL"),(0,o.kt)("h3",{id:"options-considered"},"Options considered"),(0,o.kt)("h4",{id:"option-1"},(0,o.kt)("em",{parentName:"h4"},"Option 1")),(0,o.kt)("p",null,"Option 1 description"),(0,o.kt)("h4",{id:"option-2"},(0,o.kt)("em",{parentName:"h4"},"Option 2")),(0,o.kt)("p",null,"Option 2 description"),(0,o.kt)("h2",{id:"open-questions"},"Open questions"),(0,o.kt)("p",null,"RECOMMENDED"),(0,o.kt)("h2",{id:"decision"},"Decision"),(0,o.kt)("p",null,"Decision"),(0,o.kt)("h2",{id:"related-documents"},"Related Documents"),(0,o.kt)("p",null,"Related Documents, OPTIONAL"),(0,o.kt)("h2",{id:"conformance-tests"},"Conformance Tests"),(0,o.kt)("p",null,"Conformance Tests, OPTIONAL"))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/edc931f8.0c3dcc30.js b/assets/js/edc931f8.0c3dcc30.js new file mode 100644 index 0000000000..f721d31430 --- /dev/null +++ b/assets/js/edc931f8.0c3dcc30.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6160],{3905:(e,t,n)=>{n.d(t,{Zo:()=>s,kt:()=>y});var r=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function c(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var u=r.createContext({}),l=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},s=function(e){var t=l(e.components);return r.createElement(u.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,u=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),p=l(n),m=o,y=p["".concat(u,".").concat(m)]||p[m]||d[m]||i;return n?r.createElement(y,a(a({ref:t},s),{},{components:n})):r.createElement(y,a({ref:t},s))}));function y(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,a=new Array(i);a[0]=m;var c={};for(var u in t)hasOwnProperty.call(t,u)&&(c[u]=t[u]);c.originalType=e,c[p]="string"==typeof e?e:o,a[1]=c;for(var l=2;l<i;l++)a[l]=n[l];return r.createElement.apply(null,a)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},59074:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>c,toc:()=>l});var r=n(87462),o=(n(67294),n(3905));const i={sidebar_position:1,title:"Overview"},a=void 0,c={unversionedId:"index",id:"index",title:"Overview",description:"Welcome to our SCS Community",source:"@site/community/index.md",sourceDirName:".",slug:"/",permalink:"/community/",draft:!1,tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1,title:"Overview"},sidebar:"community",next:{title:"Calendar",permalink:"/community/calendar"}},u={},l=[{value:"Welcome to our SCS Community",id:"welcome-to-our-scs-community",level:2},{value:"Contribute to Sovereign Cloud Stack",id:"contribute-to-sovereign-cloud-stack",level:2},{value:"We're chatty",id:"were-chatty",level:2},{value:"We're on GitHub",id:"were-on-github",level:2}],s={toc:l},p="wrapper";function d(e){let{components:t,...n}=e;return(0,o.kt)(p,(0,r.Z)({},s,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"welcome-to-our-scs-community"},"Welcome to our SCS Community"),(0,o.kt)("h2",{id:"contribute-to-sovereign-cloud-stack"},"Contribute to Sovereign Cloud Stack"),(0,o.kt)("p",null,"Sovereign Cloud Stack is an open community of providers and end-users joining forces in defining, implementing and operating a fully open, federated, compatible platform. We actively encourage you to contribute either code, documentation or issues and to participate in the various discussions happening on GitHub or during our various meetings."),(0,o.kt)("h2",{id:"were-chatty"},"We're chatty"),(0,o.kt)("p",null,"We have created an open community space on the Matrix network. Feel free to join the several channels and start interacting with the community. A good starting point is entering the General & Announcements and the Tech channel."),(0,o.kt)("h2",{id:"were-on-github"},"We're on GitHub"),(0,o.kt)("p",null,"We're actively developing, discussing and planning on GitHub. The three technical teams are using a joint project board to plan and monitor the progress during our sprints."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/eea6a18c.1d76c598.js b/assets/js/eea6a18c.1d76c598.js new file mode 100644 index 0000000000..0a35129210 --- /dev/null +++ b/assets/js/eea6a18c.1d76c598.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5053],{3905:(t,e,a)=>{a.d(e,{Zo:()=>u,kt:()=>k});var n=a(67294);function l(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function r(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function i(t){for(var e=1;e<arguments.length;e++){var a=null!=arguments[e]?arguments[e]:{};e%2?r(Object(a),!0).forEach((function(e){l(t,e,a[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(a)):r(Object(a)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(a,e))}))}return t}function p(t,e){if(null==t)return{};var a,n,l=function(t,e){if(null==t)return{};var a,n,l={},r=Object.keys(t);for(n=0;n<r.length;n++)a=r[n],e.indexOf(a)>=0||(l[a]=t[a]);return l}(t,e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);for(n=0;n<r.length;n++)a=r[n],e.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(l[a]=t[a])}return l}var o=n.createContext({}),s=function(t){var e=n.useContext(o),a=e;return t&&(a="function"==typeof t?t(e):i(i({},e),t)),a},u=function(t){var e=s(t.components);return n.createElement(o.Provider,{value:e},t.children)},m="mdxType",d={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},g=n.forwardRef((function(t,e){var a=t.components,l=t.mdxType,r=t.originalType,o=t.parentName,u=p(t,["components","mdxType","originalType","parentName"]),m=s(a),g=l,k=m["".concat(o,".").concat(g)]||m[g]||d[g]||r;return a?n.createElement(k,i(i({ref:e},u),{},{components:a})):n.createElement(k,i({ref:e},u))}));function k(t,e){var a=arguments,l=e&&e.mdxType;if("string"==typeof t||l){var r=a.length,i=new Array(r);i[0]=g;var p={};for(var o in e)hasOwnProperty.call(e,o)&&(p[o]=e[o]);p.originalType=t,p[m]="string"==typeof t?t:l,i[1]=p;for(var s=2;s<r;s++)i[s]=a[s];return n.createElement.apply(null,i)}return n.createElement.apply(null,a)}g.displayName="MDXCreateElement"},63807:(t,e,a)=>{a.r(e),a.d(e,{assets:()=>o,contentTitle:()=>i,default:()=>d,frontMatter:()=>r,metadata:()=>p,toc:()=>s});var n=a(87462),l=(a(67294),a(3905));const r={title:"Status Page create decision",type:"Decision Record",status:"Draft",track:"Ops",enhances:"status-page-comparison.md"},i=void 0,p={unversionedId:"scs-0400-v1-status-page-create-decision",id:"scs-0400-v1-status-page-create-decision",title:"Status Page create decision",description:"Introduction",source:"@site/standards/scs-0400-v1-status-page-create-decision.md",sourceDirName:".",slug:"/scs-0400-v1-status-page-create-decision",permalink:"/standards/scs-0400-v1-status-page-create-decision",draft:!1,tags:[],version:"current",frontMatter:{title:"Status Page create decision",type:"Decision Record",status:"Draft",track:"Ops",enhances:"status-page-comparison.md"},sidebar:"standards",previous:{title:"SCS-0400",permalink:"/standards/standards/scs-0400"},next:{title:"SCS-0401",permalink:"/standards/standards/scs-0401"}},o={},s=[{value:"Introduction",id:"introduction",level:2},{value:"Existing Applications",id:"existing-applications",level:2},{value:"Decision",id:"decision",level:2},{value:"Status Page Requirements",id:"status-page-requirements",level:2},{value:"Comparison matrix",id:"comparison-matrix",level:3}],u={toc:s},m="wrapper";function d(t){let{components:e,...a}=t;return(0,l.kt)(m,(0,n.Z)({},u,a,{components:e,mdxType:"MDXLayout"}),(0,l.kt)("h2",{id:"introduction"},"Introduction"),(0,l.kt)("p",null,'Creating and maintaining IT infrastructure is a complex task.\nAny kind of consumer (e.g. operators, cutsomers) can\nbe supported by presenting the status of all possible parts of the\nserving infrastructure. Whether a service is not reachable or\nthe used hardware is having an outage we want the consumers to be easily informed\nby using a "Status Page" application. The need for a "Status Page"\ncame up early in the SCS project and the requirements a "Status Page" application\nhas to fulfill were defined and written down on 2022-06-02 as a\n',(0,l.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/issues/issues/123"},"MVP-0 epic"),'.\nThe upcoming research on existing solutions came to the conclusion that we want to\ncreate a new "Status Page" application.'),(0,l.kt)("h2",{id:"existing-applications"},"Existing Applications"),(0,l.kt)("p",null,'Since we want to use as much as possible from existing projects and contribute to\nupstream projects to support the community with our efforts, it was a hard\ndecision to create a new "Status Page" application.'),(0,l.kt)("p",null,"Before the decision was made some existing and known applications were tested\nand analyzed if they would fit to our use case. An overview of this\ncomparison can be found ",(0,l.kt)("a",{parentName:"p",href:"#comparison-matrix"},"below in this document"),"\nWhile this is not a complete list of all existing applications it did\ncapture the most promising ones from the ",(0,l.kt)("a",{parentName:"p",href:"https://github.com/ivbeg/awesome-status-pages"},"awesome-status-page list"),"\nin order to have base to decide upon."),(0,l.kt)("p",null,"Work on an existing project only makes sense if the project is healthy OR can be\nbrought into a healthy state. If upstream does not accept patches a fork is needed.\nThe fork however only makes sense if the underlying technology is worth to be maintained.\nThe possible candidates did not fulfill these conditions - in the cases where\ncontribution seemed possible the candidates looked abandoned and long existing CVEs weren't\nworked on."),(0,l.kt)("h2",{id:"decision"},"Decision"),(0,l.kt)("p",null,"Based on the results the decision was made, that the effort is likely to be the same if\nwe pick up an existing project and try to get it in shape for our use case. It was not\n100% clear if this would even be possible or if we still would have to maintain our\nown additional patches."),(0,l.kt)("p",null,"So there will be a reference implementation that will match the requirements we have.\nIn addition there will be an architecture design documentation. So if the reference\nimplementation may not fit to you, it will be possible to create your own application."),(0,l.kt)("h2",{id:"status-page-requirements"},"Status Page Requirements"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("p",{parentName:"li"},"The status page application should be simplistic in software design and should not depend on a large\nvariety of services"),(0,l.kt)("ul",{parentName:"li"},(0,l.kt)("li",{parentName:"ul"},"simplistic, yet existing user management for write access (oauth? OIDC?)",(0,l.kt)("ul",{parentName:"li"},(0,l.kt)("li",{parentName:"ul"},"Simple RBAC (role based access control) is nice to have"))),(0,l.kt)("li",{parentName:"ul"},"support that components are only visible to a subset of users",(0,l.kt)("ul",{parentName:"li"},(0,l.kt)("li",{parentName:"ul"},"implies that there is a role that is read-only"),(0,l.kt)("li",{parentName:"ul"},"On-Prem use case might be handled by having an authenticating reverse proxy in front"))))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("p",{parentName:"li"},"The status page applicaton should allow for simple and easy theming"),(0,l.kt)("ul",{parentName:"li"},(0,l.kt)("li",{parentName:"ul"},"Page = (Possibly simple) Web-UI"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("p",{parentName:"li"},"As a CSP, I want to have a status page that allows to"),(0,l.kt)("ul",{parentName:"li"},(0,l.kt)("li",{parentName:"ul"},"define locations and similar grouping (AZs, ...)"),(0,l.kt)("li",{parentName:"ul"},"define components globally or per location\n",(0,l.kt)("em",{parentName:"li"},"to ease maintenance I want to define per component where it belongs so that I only have\nto define a component once, but have it visible in several locations\n")," status per component should be allowed to be toggleable per location or overall ","*"," a component should allow for several statuses, that are defined by me"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("p",{parentName:"li"},"Status, Status Items should be easy to extract"),(0,l.kt)("ul",{parentName:"li"},(0,l.kt)("li",{parentName:"ul"},"REST(less)-API to interact with\n",(0,l.kt)("em",{parentName:"li"},"API should be versioned\n")," this allows for embedding status information in other applications, such as cloud\ndashboards\n",(0,l.kt)("em",{parentName:"li"},"this also allows for submitting items from other tooling\n")," incoming webhooks (https POST) should be supported (e.g. for air-gapped setups) \u2013\ni.e. submitting a health beacon every x seconds\n",(0,l.kt)("em",{parentName:"li"},"web-UI wanted for posting updates as well\n")," Token based Auth"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("p",{parentName:"li"},"Configuration should be manageable with YAML files (imho this annoys me using Uptime Kuma)")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("p",{parentName:"li"},"As a consumer of the status page, I'd like to subscribe to events on the status page via e-mail"),(0,l.kt)("ul",{parentName:"li"},(0,l.kt)("li",{parentName:"ul"},"for everything"),(0,l.kt)("li",{parentName:"ul"},"for specific components"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("p",{parentName:"li"},"As a consumer of the status page, I'd like to subscribe to an RSS or atom feed")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("p",{parentName:"li"},"Allow for the ability to trigger webhooks upon certain events (to submit info to other systems via\nwebhooks, e.g. chat/messenger)")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("p",{parentName:"li"},"As a CSP Operator, I want to be able to flag a component with a new status quick and easy"),(0,l.kt)("ul",{parentName:"li"},(0,l.kt)("li",{parentName:"ul"},"to minimize the probability of making errors, updating the status of a component should not be\nhard brainwork"),(0,l.kt)("li",{parentName:"ul"},"updates can be both machine generated status changes (triggered e.g. by health monitoring)\nas well as updates from human operators"),(0,l.kt)("li",{parentName:"ul"},"updating a status should allow the CSP Operator to do that in a fashion that either pushes\ninfos to the subscribers or just updates the status on the status page"),(0,l.kt)("li",{parentName:"ul"},"updating the status can either be toggling the status of the component or can be\naccompanied by additional textual information."),(0,l.kt)("li",{parentName:"ul"},"When updating a status with textual information the status page application should make it\neasy for me as the CSP Operator to do in a way that if different people submit infos over time\nthey are presented in a similar way (eg. the status page application should guide so that the\nresulting infos are presented in a identical way. Example: when updating infos of an incident\nover time the timeline should automatically be sorted by the status page application so that it\ndoes not depend on the Operator whether the newest info is on top or at the bottom. This is\ntypical thing that varies if several people update items"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("p",{parentName:"li"},"Allow for templates for certain types of incidents")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("p",{parentName:"li"},"User-specific monitoring (how are MY instances, load-balancers, ... doing?) is OUT OF SCOPE for\nthe status page."),(0,l.kt)("ul",{parentName:"li"},(0,l.kt)("li",{parentName:"ul"},"But having it would be useful and if we have something like this, link it from the status page\n(and a link to horizon might be the default)"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("p",{parentName:"li"},"Sidenote: External hosting is desired to avoid status page going down with infra"))),(0,l.kt)("p",null,"With those requirements in mind the projects that initially were found, were evaluated."),(0,l.kt)("h3",{id:"comparison-matrix"},"Comparison matrix"),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null}),(0,l.kt)("th",{parentName:"tr",align:null},"CachetHQ"),(0,l.kt)("th",{parentName:"tr",align:null},"ClearStatus"),(0,l.kt)("th",{parentName:"tr",align:null},"ciao"),(0,l.kt)("th",{parentName:"tr",align:null},"cState"),(0,l.kt)("th",{parentName:"tr",align:null},"Gatus"),(0,l.kt)("th",{parentName:"tr",align:null},"Issue Status"),(0,l.kt)("th",{parentName:"tr",align:null},"statusfy"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"CSP VIEW"),(0,l.kt)("td",{parentName:"tr",align:null}),(0,l.kt)("td",{parentName:"tr",align:null}),(0,l.kt)("td",{parentName:"tr",align:null}),(0,l.kt)("td",{parentName:"tr",align:null}),(0,l.kt)("td",{parentName:"tr",align:null}),(0,l.kt)("td",{parentName:"tr",align:null}),(0,l.kt)("td",{parentName:"tr",align:null})),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"small dependency tree"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c Composer"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c ruby gems"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2047 helm chart"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c npm/github/zapier"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c npm dependencies very huge")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"easy themable"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"grouping (by location...)"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2047"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"components definition ..."),(0,l.kt)("td",{parentName:"tr",align:null}),(0,l.kt)("td",{parentName:"tr",align:null}),(0,l.kt)("td",{parentName:"tr",align:null}),(0,l.kt)("td",{parentName:"tr",align:null}),(0,l.kt)("td",{parentName:"tr",align:null}),(0,l.kt)("td",{parentName:"tr",align:null}),(0,l.kt)("td",{parentName:"tr",align:null})),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"... local or global"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2047"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"... easy flagging with new status"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2047"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"... push notification on update"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2047"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"... updates with additional information"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2047"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2047"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2047")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"API Support ..."),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c read only"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705 GitHub API"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"... versioned"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2047")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"... web ui for posting updates"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"... token based auth"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705 Auth managed by git provider"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c only basic auth"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c BUT OIDC!"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"manageable configuration"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c config depends on web server and initial install relies on env variables"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c based on hugo CMS"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c config by env variables"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c based on hugo CMS"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c no real config needed")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"templating support"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705 twig"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c Hugo itself uses GO template libraries"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"CUSTOMER VIEW"),(0,l.kt)("td",{parentName:"tr",align:null}),(0,l.kt)("td",{parentName:"tr",align:null}),(0,l.kt)("td",{parentName:"tr",align:null}),(0,l.kt)("td",{parentName:"tr",align:null}),(0,l.kt)("td",{parentName:"tr",align:null}),(0,l.kt)("td",{parentName:"tr",align:null}),(0,l.kt)("td",{parentName:"tr",align:null})),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"subscription support ..."),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c only by git provider"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"... send by eMail"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"watchdog for status page support"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2047"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2047"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2047"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"trigger webhook support"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c needs cachet-monitor"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2047"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2047"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2047"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"additional infos"),(0,l.kt)("td",{parentName:"tr",align:null},"-"),(0,l.kt)("td",{parentName:"tr",align:null},"basically a theme for hugo cms, depends on netlify cms"),(0,l.kt)("td",{parentName:"tr",align:null},"-"),(0,l.kt)("td",{parentName:"tr",align:null},"basically a theme for hugo cms, depends on netlify cms"),(0,l.kt)("td",{parentName:"tr",align:null},"-"),(0,l.kt)("td",{parentName:"tr",align:null},"It's highly optimized for github pages"),(0,l.kt)("td",{parentName:"tr",align:null},"SPA created with netlify")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"hidden components"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"user management"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705 by OIDC"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2047 through github?"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"different output format on notification"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"external hosting"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c looks like you are limited to github"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"project healthy"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c last commit 17 months"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c last commit 3 years"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c last commit 5 months"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705 last commit 2 months"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705 recent activities"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705 recent activities"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c archived and abondend by the owner")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"documentation"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705 API \u274c User Documentation"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2047u"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c not reachable anymore")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"git based"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2705"),(0,l.kt)("td",{parentName:"tr",align:null},"\u2047 a netlify based installation is able to communicate with github")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"project page"),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"https://cachethq.io/"},"https://cachethq.io/")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"https://github.com/weeblrpress/clearstatus"},"https://github.com/weeblrpress/clearstatus")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"https://www.brotandgames.com/ciao/"},"https://www.brotandgames.com/ciao/")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"https://cstate.netlify.app/"},"https://cstate.netlify.app/")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"https://gatus.io/"},"https://gatus.io/")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"https://github.com/tadhglewis/issue-status"},"https://github.com/tadhglewis/issue-status")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"https://marquez.co/statusfy"},"https://marquez.co/statusfy"))))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ef9d238d.47a1d3f2.js b/assets/js/ef9d238d.47a1d3f2.js new file mode 100644 index 0000000000..01b2e5a918 --- /dev/null +++ b/assets/js/ef9d238d.47a1d3f2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2023],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?l(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},l=Object.keys(e);for(r=0;r<l.length;r++)n=l[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r<l.length;r++)n=l[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),u=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},c=function(e){var t=u(e.components);return r.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),p=u(n),m=a,h=p["".concat(s,".").concat(m)]||p[m]||d[m]||l;return n?r.createElement(h,o(o({ref:t},c),{},{components:n})):r.createElement(h,o({ref:t},c))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,o=new Array(l);o[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[p]="string"==typeof e?e:a,o[1]=i;for(var u=2;u<l;u++)o[u]=n[u];return r.createElement.apply(null,o)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},63531:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>j,contentTitle:()=>O,default:()=>P,frontMatter:()=>I,metadata:()=>E,toc:()=>x});var r=n(87462),a=n(67294),l=n(3905),o=n(86010),i=n(12466),s=n(16550),u=n(91980),c=n(67392),p=n(50012);function d(e){return function(e){return a.Children.map(e,(e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:r,default:a}}=e;return{value:t,label:n,attributes:r,default:a}}))}function m(e){const{values:t,children:n}=e;return(0,a.useMemo)((()=>{const e=t??d(n);return function(e){const t=(0,c.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[t,n])}function h(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function v(e){let{queryString:t=!1,groupId:n}=e;const r=(0,s.k6)(),l=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,u._X)(l),(0,a.useCallback)((e=>{if(!l)return;const t=new URLSearchParams(r.location.search);t.set(l,e),r.replace({...r.location,search:t.toString()})}),[l,r])]}function g(e){const{defaultValue:t,queryString:n=!1,groupId:r}=e,l=m(e),[o,i]=(0,a.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(t){if(!h({value:t,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const r=n.find((e=>e.default))??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:l}))),[s,u]=v({queryString:n,groupId:r}),[c,d]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[r,l]=(0,p.Nk)(n);return[r,(0,a.useCallback)((e=>{n&&l.set(e)}),[n,l])]}({groupId:r}),g=(()=>{const e=s??c;return h({value:e,tabValues:l})?e:null})();(0,a.useLayoutEffect)((()=>{g&&i(g)}),[g]);return{selectedValue:o,selectValue:(0,a.useCallback)((e=>{if(!h({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);i(e),u(e),d(e)}),[u,d,l]),tabValues:l}}var b=n(72389);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function y(e){let{className:t,block:n,selectedValue:l,selectValue:s,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:p}=(0,i.o5)(),d=e=>{const t=e.currentTarget,n=c.indexOf(t),r=u[n].value;r!==l&&(p(t),s(r))},m=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":n},t)},u.map((e=>{let{value:t,label:n,attributes:i}=e;return a.createElement("li",(0,r.Z)({role:"tab",tabIndex:l===t?0:-1,"aria-selected":l===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:d},i,{className:(0,o.Z)("tabs__item",f.tabItem,i?.className,{"tabs__item--active":l===t})}),n??t)})))}function k(e){let{lazy:t,children:n,selectedValue:r}=e;const l=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=l.find((e=>e.props.value===r));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return a.createElement("div",{className:"margin-top--md"},l.map(((e,t)=>(0,a.cloneElement)(e,{key:t,hidden:e.props.value!==r}))))}function w(e){const t=g(e);return a.createElement("div",{className:(0,o.Z)("tabs-container",f.tabList)},a.createElement(y,(0,r.Z)({},e,t)),a.createElement(k,(0,r.Z)({},e,t)))}function S(e){const t=(0,b.Z)();return a.createElement(w,(0,r.Z)({key:String(t)},e))}const T={tabItem:"tabItem_Ymn6"};function N(e){let{children:t,hidden:n,className:r}=e;return a.createElement("div",{role:"tabpanel",className:(0,o.Z)(T.tabItem,r),hidden:n},t)}const I={},O="Installation",E={unversionedId:"contribute/local-docusaurus-development-guide",id:"contribute/local-docusaurus-development-guide",title:"Installation",description:"This Guide shows you how to setup docusaurus on your local machine to run this docs-page in your local development enviroment.",source:"@site/community/contribute/local-docusaurus-development-guide.mdx",sourceDirName:"contribute",slug:"/contribute/local-docusaurus-development-guide",permalink:"/community/contribute/local-docusaurus-development-guide",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"community",previous:{title:"Linting Guide",permalink:"/community/contribute/linting-guide"},next:{title:"Styleguide",permalink:"/community/contribute/styleguide"}},j={},x=[{value:"Requirements",id:"requirements",level:2},{value:"Installation Guide",id:"installation-guide",level:2},{value:"Step 1 \u2013 Installing Node.js via nvm",id:"step-1--installing-nodejs-via-nvm",level:3},{value:"Step 2 \u2013\xa0Cloning the repository",id:"step-2-cloning-the-repository",level:3},{value:"Step 3 \u2013 Installing dependencies",id:"step-3--installing-dependencies",level:3},{value:"Step 4 \u2013 Starting the development server",id:"step-4--starting-the-development-server",level:3}],C={toc:x},V="wrapper";function P(e){let{components:t,...n}=e;return(0,l.kt)(V,(0,r.Z)({},C,n,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"installation"},"Installation"),(0,l.kt)("p",null,"This Guide shows you how to setup docusaurus on your local machine to run this docs-page in your local development enviroment."),(0,l.kt)("h2",{id:"requirements"},"Requirements"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"git"),(0,l.kt)("li",{parentName:"ul"},"Node.js v16")),(0,l.kt)("h2",{id:"installation-guide"},"Installation Guide"),(0,l.kt)("h3",{id:"step-1--installing-nodejs-via-nvm"},"Step 1 \u2013 Installing Node.js via nvm"),(0,l.kt)("p",null,"It is recommended to install Node.js via nvm \u2013 a node version manager \u2013 to have the possibility to switch between different node.js versions."),(0,l.kt)(S,{groupId:"operating-systems",mdxType:"Tabs"},(0,l.kt)(N,{value:"mac",label:"macOS",mdxType:"TabItem"},(0,l.kt)("p",null,"You must have macOS desktop access with administrator privileges."),(0,l.kt)("p",null,"Login to the macOS desktop system and ",(0,l.kt)("a",{parentName:"p",href:"https://brew.sh/"},"install Homebrew")," on your system (if not already installed)."),(0,l.kt)("p",null,"Install nvm via homebrew:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"brew install nvm\n"))),(0,l.kt)(N,{value:"linux",label:"Linux",mdxType:"TabItem"},(0,l.kt)("p",null,"See ",(0,l.kt)("a",{parentName:"p",href:"https://github.com/nvm-sh/nvm#installing-and-updating"},"this")," installation guide on GitHub by nvm-sh for installing nvm. ")),(0,l.kt)(N,{value:"win",label:"Windows",mdxType:"TabItem"},(0,l.kt)("p",null,(0,l.kt)("a",{parentName:"p",href:"https://github.com/coreybutler/nvm-windows"},"NVM for Windows"),"\nruns in an Admin shell. You'll need to start powershell or Command Prompt as Administrator to use nvm-windows. Install NVM for Windows with an Installer provided by nvm-sh on their ",(0,l.kt)("a",{parentName:"p",href:"https://github.com/coreybutler/nvm-windows/releases"},"release page"),". "))),(0,l.kt)("p",null,"Once installed you can check the available versions with "),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"nvm list\n")),(0,l.kt)("p",null,"If you have no other projects, where you need a different version, it is recommended to install the latest stable LTS version of node."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-console"},"nvm install lts\n")),(0,l.kt)("p",null,"nvm has now installed the latest node.js version with its package manager npm. Check if the installation has been successfull by checking it:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-console"},"node --version\n")),(0,l.kt)("h3",{id:"step-2-cloning-the-repository"},"Step 2 \u2013\xa0Cloning the repository"),(0,l.kt)("p",null,"Clone the ",(0,l.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/docs-page"},"docs-page")," repository via your favourite method:"),(0,l.kt)(S,{groupId:"cloning-",mdxType:"Tabs"},(0,l.kt)(N,{value:"https",label:"HTTPS",mdxType:"TabItem"},(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-console",metastring:'title="HTTPS"',title:'"HTTPS"'},"git clone https://github.com/SovereignCloudStack/docs-page.git\n"))),(0,l.kt)(N,{value:"ssh",label:"SSH",mdxType:"TabItem"},(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-console",metastring:'title="SSH"',title:'"SSH"'},"git clone git@github.com:SovereignCloudStack/docs-page.git\n")))),(0,l.kt)("h3",{id:"step-3--installing-dependencies"},"Step 3 \u2013 Installing dependencies"),(0,l.kt)("p",null,"Change your working directory within your terminal to the root of the cloned repository ",(0,l.kt)("inlineCode",{parentName:"p"},"/docs-page")," and install all dependencies:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-console"},"npm install\n")),(0,l.kt)("h3",{id:"step-4--starting-the-development-server"},"Step 4 \u2013 Starting the development server"),(0,l.kt)("p",null,"You can now run the local development server from your terminal:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-console"},"npm start\n")),(0,l.kt)("p",null,"Once the server is up and running, your terminal will show you the local URL which you can open with your browser to see the page."))}P.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f0b55dfe.1cf7d917.js b/assets/js/f0b55dfe.1cf7d917.js new file mode 100644 index 0000000000..0f6204de36 --- /dev/null +++ b/assets/js/f0b55dfe.1cf7d917.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9042],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>h});var i=n(67294);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function a(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){l(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,i,l=function(e,t){if(null==e)return{};var n,i,l={},o=Object.keys(e);for(i=0;i<o.length;i++)n=o[i],t.indexOf(n)>=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(i=0;i<o.length;i++)n=o[i],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var r=i.createContext({}),u=function(e){var t=i.useContext(r),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},d=function(e){var t=u(e.components);return i.createElement(r.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},p=i.forwardRef((function(e,t){var n=e.components,l=e.mdxType,o=e.originalType,r=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),c=u(n),p=l,h=c["".concat(r,".").concat(p)]||c[p]||m[p]||o;return n?i.createElement(h,a(a({ref:t},d),{},{components:n})):i.createElement(h,a({ref:t},d))}));function h(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=n.length,a=new Array(o);a[0]=p;var s={};for(var r in t)hasOwnProperty.call(t,r)&&(s[r]=t[r]);s.originalType=e,s[c]="string"==typeof e?e:l,a[1]=s;for(var u=2;u<o;u++)a[u]=n[u];return i.createElement.apply(null,a)}return i.createElement.apply(null,n)}p.displayName="MDXCreateElement"},48779:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>r,contentTitle:()=>a,default:()=>m,frontMatter:()=>o,metadata:()=>s,toc:()=>u});var i=n(87462),l=(n(67294),n(3905));const o={sidebar_label:"Style Guide",sidebar_position:100},a="Style Guide",s={unversionedId:"iaas/guides/other-guides/style-guide",id:"iaas/guides/other-guides/style-guide",title:"Style Guide",description:"Ansible",source:"@site/docs/02-iaas/guides/other-guides/style-guide.md",sourceDirName:"02-iaas/guides/other-guides",slug:"/iaas/guides/other-guides/style-guide",permalink:"/docs/iaas/guides/other-guides/style-guide",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/other-guides/style-guide.md",tags:[],version:"current",sidebarPosition:100,frontMatter:{sidebar_label:"Style Guide",sidebar_position:100},sidebar:"docs",previous:{title:"Zuul Ci",permalink:"/docs/iaas/guides/other-guides/developer-guide/zuul-ci"},next:{title:"Zuul CI",permalink:"/docs/iaas/guides/other-guides/zuul"}},r={},u=[{value:"Ansible",id:"ansible",level:2},{value:"Task names",id:"task-names",level:3},{value:"<code>become</code> directive",id:"become-directive",level:3},{value:"<code>when</code> directive",id:"when-directive",level:3},{value:"Lists as defaults",id:"lists-as-defaults",level:3},{value:"Containerfiles",id:"containerfiles",level:2},{value:"Commit messages",id:"commit-messages",level:2},{value:"Python",id:"python",level:2},{value:"Installation",id:"installation",level:3},{value:"Formatting a Single File",id:"formatting-a-single-file",level:3},{value:"Formatting Multiple Files and/or directories",id:"formatting-multiple-files-andor-directories",level:3},{value:"Formatting an Entire Project",id:"formatting-an-entire-project",level:3},{value:"Check Mode (Dry Run)",id:"check-mode-dry-run",level:3},{value:"Excluding Files or Directories",id:"excluding-files-or-directories",level:3},{value:"Integration with Code Editors",id:"integration-with-code-editors",level:3},{value:"Example of failed python-black Zuul job",id:"example-of-failed-python-black-zuul-job",level:3}],d={toc:u},c="wrapper";function m(e){let{components:t,...n}=e;return(0,l.kt)(c,(0,i.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"style-guide"},"Style Guide"),(0,l.kt)("h2",{id:"ansible"},"Ansible"),(0,l.kt)("p",null,"We implement all the default rules of Ansible Lint. All default rules can be found in the\nAnsible Lint documentation: ",(0,l.kt)("a",{parentName:"p",href:"https://ansible-lint.readthedocs.io/en/latest/default_rules/"},"https://ansible-lint.readthedocs.io/en/latest/default_rules/")),(0,l.kt)("h3",{id:"task-names"},"Task names"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Tasks must always have names. The only exception allowed is for forked playbooks."),(0,l.kt)("li",{parentName:"ul"},"A name never starts with a small letter"),(0,l.kt)("li",{parentName:"ul"},"Names are written in present tense"),(0,l.kt)("li",{parentName:"ul"},"No punctuation is used in names")),(0,l.kt)("h3",{id:"become-directive"},(0,l.kt)("inlineCode",{parentName:"h3"},"become")," directive"),(0,l.kt)("p",null,"The ",(0,l.kt)("inlineCode",{parentName:"p"},"become")," directive is only set when needed and is always set explicitly for each task that needs it."),(0,l.kt)("p",null,"Blocks, roles, or playbooks are never executed in a privileged mode."),(0,l.kt)("p",null,"We always insert the ",(0,l.kt)("inlineCode",{parentName:"p"},"become")," directive between the name of a task and the task itself. This also applies\nto related directives like ",(0,l.kt)("inlineCode",{parentName:"p"},"become_user")," or ",(0,l.kt)("inlineCode",{parentName:"p"},"become_flags"),". This is for better visibility if a task is\nprivileged or not."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-yaml"},'- name: Copy hddtemp configuration file\n become: true\n ansible.builtin.copy:\n src: "{{ ansible_os_family }}/hddtemp"\n dest: "{{ hddtemp_conf_file }}"\n owner: root\n group: root\n mode: 0644\n notify: Restart hddtemp service\n')),(0,l.kt)("h3",{id:"when-directive"},(0,l.kt)("inlineCode",{parentName:"h3"},"when")," directive"),(0,l.kt)("p",null,"If you need to use the ",(0,l.kt)("inlineCode",{parentName:"p"},"when")," directive add this at the end-section from the task where it is needed. This\nmakes the code easier to understand for others."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-yaml"},'- name: "Archive existing {{ resolvconf_file }} file"\n become: true\n ansible.posix.synchronize:\n src: "/etc/resolv.conf"\n dest: "/etc/resolv.conf.{{ ansible_date_time.date }}"\n archive: true\n delegate_to: "{{ inventory_hostname }}"\n when: stat_resolvconf_file.stat.islnk is defined and not stat_resolvconf_file.stat.islnk\n')),(0,l.kt)("h3",{id:"lists-as-defaults"},"Lists as defaults"),(0,l.kt)("p",null,"Defaults that provide a list are always defined as in the following example."),(0,l.kt)("p",null,(0,l.kt)("inlineCode",{parentName:"p"},"docker_hosts_defaults")," sets the defaults in the role. Overriding is only possible with the ",(0,l.kt)("inlineCode",{parentName:"p"},"defaults")," repository."),(0,l.kt)("p",null,"In the configuration repository, ",(0,l.kt)("inlineCode",{parentName:"p"},"docker_hosts_extra")," is then used to add additional items to the list."),(0,l.kt)("p",null,(0,l.kt)("inlineCode",{parentName:"p"},"docker_hosts")," itself is never modified from the outside."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-yaml"},'docker_hosts_defaults:\n - "unix:///var/run/docker.sock"\ndocker_hosts_extra: []\ndocker_hosts: "{{ docker_hosts_defaults + docker_hosts_extra }}"\n')),(0,l.kt)("h2",{id:"containerfiles"},"Containerfiles"),(0,l.kt)("h2",{id:"commit-messages"},"Commit messages"),(0,l.kt)("h2",{id:"python"},"Python"),(0,l.kt)("p",null,(0,l.kt)("a",{parentName:"p",href:"https://github.com/psf/black"},"Black")," is a popular Python code formatter that automatically\nformats your code to adhere to a consistent style. We use it to automatically format the\nsyntax of Python. A job is running in the CI that checks, if Black has been applied. Therefore,\nformat the files with Black accordingly in advance."),(0,l.kt)("h3",{id:"installation"},"Installation"),(0,l.kt)("p",null,(0,l.kt)("inlineCode",{parentName:"p"},"pip install black")),(0,l.kt)("h3",{id:"formatting-a-single-file"},"Formatting a Single File"),(0,l.kt)("p",null,(0,l.kt)("inlineCode",{parentName:"p"},"black myfile.py")),(0,l.kt)("h3",{id:"formatting-multiple-files-andor-directories"},"Formatting Multiple Files and/or directories"),(0,l.kt)("p",null,(0,l.kt)("inlineCode",{parentName:"p"},"black file1.py file2.py dir/")),(0,l.kt)("h3",{id:"formatting-an-entire-project"},"Formatting an Entire Project"),(0,l.kt)("p",null,"This command will format all Python files in the current directory and its subdirectories:"),(0,l.kt)("p",null,(0,l.kt)("inlineCode",{parentName:"p"},"black .")),(0,l.kt)("h3",{id:"check-mode-dry-run"},"Check Mode (Dry Run)"),(0,l.kt)("p",null,"Running Black with the ",(0,l.kt)("inlineCode",{parentName:"p"},"--check")," option performs a dry run and reports files that would be\nchanged without actually modifying them:"),(0,l.kt)("p",null,(0,l.kt)("inlineCode",{parentName:"p"},"black --check myfile.py")),(0,l.kt)("h3",{id:"excluding-files-or-directories"},"Excluding Files or Directories"),(0,l.kt)("p",null,"You can exclude files or directories from formatting using the ",(0,l.kt)("inlineCode",{parentName:"p"},"--exclude")," option:"),(0,l.kt)("p",null,(0,l.kt)("inlineCode",{parentName:"p"},"black --exclude=dir_to_exclude/ .")),(0,l.kt)("h3",{id:"integration-with-code-editors"},"Integration with Code Editors"),(0,l.kt)("p",null,"Many code editors have extensions or plugins that can automatically run Black on your code.\nFor example, if you're using VSCode or PyCharm, you can easily integrate it into your IDE."),(0,l.kt)("h3",{id:"example-of-failed-python-black-zuul-job"},"Example of failed python-black Zuul job"),(0,l.kt)("p",null,"job-output.txt:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},'[\u2026]\n2023-11-16 14:38:14.149756 | TASK [python-black : Install pip module black]\n2023-11-16 14:38:18.717886 | ubuntu-jammy | changed\n2023-11-16 14:38:18.723062 | \n2023-11-16 14:38:18.723137 | TASK [python-black : Format code with Black if there is nothing to exclude]\n2023-11-16 14:38:19.138060 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/adminer.py\n2023-11-16 14:38:19.151965 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/bird.py\n2023-11-16 14:38:19.163608 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/auditd.py\n2023-11-16 14:38:19.187772 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/cephclient/package.py\n2023-11-16 14:38:19.192695 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/cephclient/container.py\n2023-11-16 14:38:19.219694 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/cgit.py\n2023-11-16 14:38:19.230577 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/dnsdist.py\n2023-11-16 14:38:19.275681 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/hddtemp/redhat.py\n2023-11-16 14:38:19.300350 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/homer.py\n2023-11-16 14:38:19.310641 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/lldpd.py\n2023-11-16 14:38:19.318096 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/docker.py\n2023-11-16 14:38:19.329099 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/osquery.py\n2023-11-16 14:38:19.344766 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/rsyslog.py\n2023-11-16 14:38:19.358190 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/smartd.py\n2023-11-16 14:38:19.363578 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/tuned.py\n2023-11-16 14:38:19.389205 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/util/util.py\n2023-11-16 14:38:19.406360 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/plugins/modules/kolla_container_facts.py\n2023-11-16 14:38:19.415046 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/plugins/filter/address.py\n2023-11-16 14:38:19.473508 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/plugins/modules/kolla_toolbox.py\n2023-11-16 14:38:19.908963 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/plugins/modules/kolla_docker.py\n2023-11-16 14:38:19.914395 | ubuntu-jammy |\n2023-11-16 14:38:19.914412 | ubuntu-jammy | Oh no! \xf0\u0178\u2019\xa5 \xf0\u0178\u2019\u201d \xf0\u0178\u2019\xa5\n2023-11-16 14:38:19.914419 | ubuntu-jammy | 20 files would be reformatted, 18 files would be left unchanged.\n2023-11-16 14:38:20.249358 | ubuntu-jammy | ERROR\n2023-11-16 14:38:20.249501 | ubuntu-jammy | {\n2023-11-16 14:38:20.249533 | ubuntu-jammy | "delta": "0:00:01.053565",\n2023-11-16 14:38:20.249553 | ubuntu-jammy | "end": "2023-11-16 14:38:19.932073",\n2023-11-16 14:38:20.249571 | ubuntu-jammy | "msg": "non-zero return code",\n2023-11-16 14:38:20.249587 | ubuntu-jammy | "rc": 1,\n2023-11-16 14:38:20.249603 | ubuntu-jammy | "start": "2023-11-16 14:38:18.878508"\n2023-11-16 14:38:20.249618 | ubuntu-jammy | }\n[\u2026]\n')))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f0e20cb6.93b69c09.js b/assets/js/f0e20cb6.93b69c09.js new file mode 100644 index 0000000000..b8790ba59c --- /dev/null +++ b/assets/js/f0e20cb6.93b69c09.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6815],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>g});var n=r(67294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){i(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function u(e,t){if(null==e)return{};var r,n,i=function(e,t){if(null==e)return{};var r,n,i={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},d=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",l={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,o=e.originalType,c=e.parentName,d=u(e,["components","mdxType","originalType","parentName"]),p=s(r),f=i,g=p["".concat(c,".").concat(f)]||p[f]||l[f]||o;return r?n.createElement(g,a(a({ref:t},d),{},{components:r})):n.createElement(g,a({ref:t},d))}));function g(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=r.length,a=new Array(o);a[0]=f;var u={};for(var c in t)hasOwnProperty.call(t,c)&&(u[c]=t[c]);u.originalType=e,u[p]="string"==typeof e?e:i,a[1]=u;for(var s=2;s<o;s++)a[s]=r[s];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},71523:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>l,frontMatter:()=>o,metadata:()=>u,toc:()=>s});var n=r(87462),i=(r(67294),r(3905));const o={sidebar_label:"Configuration Guide",sidebar_position:30},a="Configuration Guide",u={unversionedId:"iaas/guides/configuration-guide/index",id:"iaas/guides/configuration-guide/index",title:"Configuration Guide",description:"",source:"@site/docs/02-iaas/guides/configuration-guide/index.md",sourceDirName:"02-iaas/guides/configuration-guide",slug:"/iaas/guides/configuration-guide/",permalink:"/docs/iaas/guides/configuration-guide/",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/configuration-guide/index.md",tags:[],version:"current",sidebarPosition:30,frontMatter:{sidebar_label:"Configuration Guide",sidebar_position:30},sidebar:"docs",previous:{title:"OpenStack",permalink:"/docs/iaas/guides/upgrade-guide/openstack"},next:{title:"Configuration repository",permalink:"/docs/iaas/guides/configuration-guide/configuration-repository"}},c={},s=[],d={toc:s},p="wrapper";function l(e){let{components:t,...r}=e;return(0,i.kt)(p,(0,n.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"configuration-guide"},"Configuration Guide"))}l.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f14351c1.a849afd8.js b/assets/js/f14351c1.a849afd8.js new file mode 100644 index 0000000000..a718a13c33 --- /dev/null +++ b/assets/js/f14351c1.a849afd8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3356],{23057:e=>{e.exports=JSON.parse('{"title":"Components","slug":"/category/components","permalink":"/docs/category/components","navigation":{"previous":{"title":"Zuul CI","permalink":"/docs/iaas/guides/other-guides/zuul"},"next":{"title":"Image Manager","permalink":"/docs/iaas/components/image-manager"}}}')}}]); \ No newline at end of file diff --git a/assets/js/f1715aef.4e0027fc.js b/assets/js/f1715aef.4e0027fc.js new file mode 100644 index 0000000000..a5c34cee03 --- /dev/null +++ b/assets/js/f1715aef.4e0027fc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6401],{3905:(t,e,a)=>{a.d(e,{Zo:()=>d,kt:()=>f});var n=a(67294);function r(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function l(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function i(t){for(var e=1;e<arguments.length;e++){var a=null!=arguments[e]?arguments[e]:{};e%2?l(Object(a),!0).forEach((function(e){r(t,e,a[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(a)):l(Object(a)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(a,e))}))}return t}function o(t,e){if(null==t)return{};var a,n,r=function(t,e){if(null==t)return{};var a,n,r={},l=Object.keys(t);for(n=0;n<l.length;n++)a=l[n],e.indexOf(a)>=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(n=0;n<l.length;n++)a=l[n],e.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var s=n.createContext({}),p=function(t){var e=n.useContext(s),a=e;return t&&(a="function"==typeof t?t(e):i(i({},e),t)),a},d=function(t){var e=p(t.components);return n.createElement(s.Provider,{value:e},t.children)},c="mdxType",u={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},m=n.forwardRef((function(t,e){var a=t.components,r=t.mdxType,l=t.originalType,s=t.parentName,d=o(t,["components","mdxType","originalType","parentName"]),c=p(a),m=r,f=c["".concat(s,".").concat(m)]||c[m]||u[m]||l;return a?n.createElement(f,i(i({ref:e},d),{},{components:a})):n.createElement(f,i({ref:e},d))}));function f(t,e){var a=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var l=a.length,i=new Array(l);i[0]=m;var o={};for(var s in e)hasOwnProperty.call(e,s)&&(o[s]=e[s]);o.originalType=t,o[c]="string"==typeof t?t:r,i[1]=o;for(var p=2;p<l;p++)i[p]=a[p];return n.createElement.apply(null,i)}return n.createElement.apply(null,a)}m.displayName="MDXCreateElement"},40235:(t,e,a)=>{a.r(e),a.d(e,{assets:()=>s,contentTitle:()=>i,default:()=>u,frontMatter:()=>l,metadata:()=>o,toc:()=>p});var n=a(87462),r=(a(67294),a(3905));const l={},i="SCS-0100: Flavor Naming",o={unversionedId:"iaas/scs-0100",id:"iaas/scs-0100",title:"SCS-0100: Flavor Naming",description:"The SCS Flavor Naming Standard provides a systematic approach for naming instance flavors in OpenStack environments, ensuring backward compatibility and clarity on key features like the number of vCPUs, RAM, and Root Disk, as well as extra features like GPU support and CPU generation. The standard aims for usability and portability across all SCS flavors.",source:"@site/standards/iaas/scs-0100.md",sourceDirName:"iaas",slug:"/iaas/scs-0100",permalink:"/standards/iaas/scs-0100",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"standards",previous:{title:"IaaS Standards",permalink:"/standards/iaas/"},next:{title:"SCS Flavor Naming Standard",permalink:"/standards/scs-0100-v1-flavor-naming"}},s={},p=[],d={toc:p},c="wrapper";function u(t){let{components:e,...a}=t;return(0,r.kt)(c,(0,n.Z)({},d,a,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"scs-0100-flavor-naming"},"SCS-0100: Flavor Naming"),(0,r.kt)("p",null,"The SCS Flavor Naming Standard provides a systematic approach for naming instance flavors in OpenStack environments, ensuring backward compatibility and clarity on key features like the number of vCPUs, RAM, and Root Disk, as well as extra features like GPU support and CPU generation. The standard aims for usability and portability across all SCS flavors."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Version"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"State"),(0,r.kt)("th",{parentName:"tr",align:null},"stabilized"),(0,r.kt)("th",{parentName:"tr",align:null},"obsoleted"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"/standards/scs-0100-v1-flavor-naming"},"SCS-0100-v1")),(0,r.kt)("td",{parentName:"tr",align:null},"Standard"),(0,r.kt)("td",{parentName:"tr",align:null},"\ud83d\udfe2 Stable"),(0,r.kt)("td",{parentName:"tr",align:null},"2022-09-08"),(0,r.kt)("td",{parentName:"tr",align:null},"2023-10-31")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"/standards/scs-0100-v2-flavor-naming"},"SCS-0100-v2")),(0,r.kt)("td",{parentName:"tr",align:null},"Standard"),(0,r.kt)("td",{parentName:"tr",align:null},"\ud83d\udfe0 Draft"),(0,r.kt)("td",{parentName:"tr",align:null},"-"),(0,r.kt)("td",{parentName:"tr",align:null},"-")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"/standards/scs-0100-v3-flavor-naming"},"SCS-0100-v3")),(0,r.kt)("td",{parentName:"tr",align:null},"Standard"),(0,r.kt)("td",{parentName:"tr",align:null},"\ud83d\udfe2 Stable"),(0,r.kt)("td",{parentName:"tr",align:null},"2023-06-14"),(0,r.kt)("td",{parentName:"tr",align:null},"-")))),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},(0,r.kt)("strong",{parentName:"p"},"Note"),"\nV2 and V3 are both concurrent stable versions")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f2a59390.ffc7a27c.js b/assets/js/f2a59390.ffc7a27c.js new file mode 100644 index 0000000000..4181a2d657 --- /dev/null +++ b/assets/js/f2a59390.ffc7a27c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5829],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>y});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var p=a.createContext({}),s=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=s(e.components);return a.createElement(p.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),d=s(n),m=r,y=d["".concat(p,".").concat(m)]||d[m]||u[m]||o;return n?a.createElement(y,i(i({ref:t},c),{},{components:n})):a.createElement(y,i({ref:t},c))}));function y(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=m;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[d]="string"==typeof e?e:r,i[1]=l;for(var s=2;s<o;s++)i[s]=n[s];return a.createElement.apply(null,i)}return a.createElement.apply(null,n)}m.displayName="MDXCreateElement"},15560:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var a=n(87462),r=(n(67294),n(3905));const o={sidebar_label:"OpenStack",sidebar_position:60},i="OpenStack",l={unversionedId:"iaas/guides/deploy-guide/services/openstack",id:"iaas/guides/deploy-guide/services/openstack",title:"OpenStack",description:"Common issues with deploying OpenStack services are documented in the",source:"@site/docs/02-iaas/guides/deploy-guide/services/openstack.md",sourceDirName:"02-iaas/guides/deploy-guide/services",slug:"/iaas/guides/deploy-guide/services/openstack",permalink:"/docs/iaas/guides/deploy-guide/services/openstack",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/deploy-guide/services/openstack.md",tags:[],version:"current",sidebarPosition:60,frontMatter:{sidebar_label:"OpenStack",sidebar_position:60},sidebar:"docs",previous:{title:"Ceph",permalink:"/docs/iaas/guides/deploy-guide/services/ceph"},next:{title:"Examples",permalink:"/docs/iaas/guides/deploy-guide/examples/"}},p={},s=[{value:"OpenStack client",id:"openstack-client",level:2},{value:"Keystone",id:"keystone",level:2},{value:"Glance",id:"glance",level:2},{value:"Designate",id:"designate",level:2},{value:"Placement",id:"placement",level:2},{value:"Cinder",id:"cinder",level:2},{value:"Neutron",id:"neutron",level:2},{value:"Nova",id:"nova",level:2},{value:"Octavia",id:"octavia",level:2},{value:"Horizon",id:"horizon",level:2}],c={toc:s},d="wrapper";function u(e){let{components:t,...n}=e;return(0,r.kt)(d,(0,a.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"openstack"},"OpenStack"),(0,r.kt)("p",null,"Common issues with deploying OpenStack services are documented in the\n",(0,r.kt)("a",{parentName:"p",href:"../../troubleshooting-guide/openstack"},"OpenStack Troubleshooting Guide"),"."),(0,r.kt)("h2",{id:"openstack-client"},"OpenStack client"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"osism apply openstackclient\n")),(0,r.kt)("h2",{id:"keystone"},"Keystone"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"osism apply -a pull keystone\nosism apply keystone\n")),(0,r.kt)("h2",{id:"glance"},"Glance"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"osism apply -a pull glance\nosism apply glance\n")),(0,r.kt)("h2",{id:"designate"},"Designate"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"osism apply -a pull designate\nosism apply designate\n")),(0,r.kt)("h2",{id:"placement"},"Placement"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"osism apply -a pull placement\nosism apply placement\n")),(0,r.kt)("h2",{id:"cinder"},"Cinder"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"osism apply -a pull cinder\nosism apply cinder\n")),(0,r.kt)("h2",{id:"neutron"},"Neutron"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"osism apply -a pull neutron\nosism apply neutron\n")),(0,r.kt)("h2",{id:"nova"},"Nova"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"osism apply -a pull nova\nosism apply nova\n")),(0,r.kt)("h2",{id:"octavia"},"Octavia"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"osism apply -a pull octavia\nosism apply octavia\n")),(0,r.kt)("h2",{id:"horizon"},"Horizon"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"osism apply -a pull horizon\nosism apply horizon\n")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f385820d.2967b809.js b/assets/js/f385820d.2967b809.js new file mode 100644 index 0000000000..39763bbd39 --- /dev/null +++ b/assets/js/f385820d.2967b809.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8908],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var r=n(67294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){i(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function c(e,t){if(null==e)return{};var n,r,i=function(e,t){if(null==e)return{};var n,r,i={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=r.createContext({}),l=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},u=function(e){var t=l(e.components);return r.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,i=e.mdxType,o=e.originalType,s=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),p=l(n),g=i,m=p["".concat(s,".").concat(g)]||p[g]||d[g]||o;return n?r.createElement(m,a(a({ref:t},u),{},{components:n})):r.createElement(m,a({ref:t},u))}));function m(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=n.length,a=new Array(o);a[0]=g;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c[p]="string"==typeof e?e:i,a[1]=c;for(var l=2;l<o;l++)a[l]=n[l];return r.createElement.apply(null,a)}return r.createElement.apply(null,n)}g.displayName="MDXCreateElement"},19162:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>c,toc:()=>l});var r=n(87462),i=(n(67294),n(3905));const o={sidebar_label:"Horizon"},a="Horizon",c={unversionedId:"iaas/guides/configuration-guide/openstack/horizon",id:"iaas/guides/configuration-guide/openstack/horizon",title:"Horizon",description:"Problems uploading machine images larger than 1 GiB",source:"@site/docs/02-iaas/guides/configuration-guide/openstack/horizon.md",sourceDirName:"02-iaas/guides/configuration-guide/openstack",slug:"/iaas/guides/configuration-guide/openstack/horizon",permalink:"/docs/iaas/guides/configuration-guide/openstack/horizon",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/configuration-guide/openstack/horizon.md",tags:[],version:"current",frontMatter:{sidebar_label:"Horizon"},sidebar:"docs",previous:{title:"OpenStack",permalink:"/docs/iaas/guides/configuration-guide/openstack/"},next:{title:"Keystone",permalink:"/docs/iaas/guides/configuration-guide/openstack/keystone"}},s={},l=[{value:"Problems uploading machine images larger than 1 GiB",id:"problems-uploading-machine-images-larger-than-1-gib",level:2}],u={toc:l},p="wrapper";function d(e){let{components:t,...n}=e;return(0,i.kt)(p,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"horizon"},"Horizon"),(0,i.kt)("h2",{id:"problems-uploading-machine-images-larger-than-1-gib"},"Problems uploading machine images larger than 1 GiB"),(0,i.kt)("p",null,"By default, the ",(0,i.kt)("inlineCode",{parentName:"p"},"LimitRequestBody")," is set to ",(0,i.kt)("inlineCode",{parentName:"p"},"1073741824")," (1 GiB).\nThis is a security feature (",(0,i.kt)("a",{parentName:"p",href:"https://access.redhat.com/security/cve/CVE-2022-29404"},"CVE-2022-29404"),")\nand not a bug. Further details in the\n",(0,i.kt)("a",{parentName:"p",href:"https://access.redhat.com/articles/6975397"},"A new default for the LimitRequestBody directive in httpd configuration"),"\narticle in the RedHat knowledgebase."),(0,i.kt)("p",null,"This limit can be increased via the parameter ",(0,i.kt)("inlineCode",{parentName:"p"},"horizon_httpd_limitrequestbody"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-yaml",metastring:'title="environments/kolla/configuration.yml"',title:'"environments/kolla/configuration.yml"'},"horizon_httpd_limitrequestbody: 2147483648 # 2 GiB\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f40b2df0.678c2584.js b/assets/js/f40b2df0.678c2584.js new file mode 100644 index 0000000000..c7565c6ada --- /dev/null +++ b/assets/js/f40b2df0.678c2584.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7321],{3905:(e,t,a)=>{a.d(t,{Zo:()=>l,kt:()=>f});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function s(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var c=r.createContext({}),p=function(e){var t=r.useContext(c),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},l=function(e){var t=p(e.components);return r.createElement(c.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,c=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),u=p(a),m=n,f=u["".concat(c,".").concat(m)]||u[m]||d[m]||o;return a?r.createElement(f,i(i({ref:t},l),{},{components:a})):r.createElement(f,i({ref:t},l))}));function f(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=m;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[u]="string"==typeof e?e:n,i[1]=s;for(var p=2;p<o;p++)i[p]=a[p];return r.createElement.apply(null,i)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},8307:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const o={sidebar_label:"Octavia",sidebar_position:20},i="Octavia",s={unversionedId:"iaas/guides/operations-guide/openstack/octavia",id:"iaas/guides/operations-guide/openstack/octavia",title:"Octavia",description:"Cleanup of amphora missing from the DB",source:"@site/docs/02-iaas/guides/operations-guide/openstack/octavia.md",sourceDirName:"02-iaas/guides/operations-guide/openstack",slug:"/iaas/guides/operations-guide/openstack/octavia",permalink:"/docs/iaas/guides/operations-guide/openstack/octavia",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/operations-guide/openstack/octavia.md",tags:[],version:"current",sidebarPosition:20,frontMatter:{sidebar_label:"Octavia",sidebar_position:20},sidebar:"docs",previous:{title:"Cinder",permalink:"/docs/iaas/guides/operations-guide/openstack/cinder"},next:{title:"Day-2 Operations",permalink:"/docs/iaas/guides/operations-guide/openstack/day2-operations/"}},c={},p=[{value:"Cleanup of amphora missing from the DB",id:"cleanup-of-amphora-missing-from-the-db",level:2}],l={toc:p},u="wrapper";function d(e){let{components:t,...a}=e;return(0,n.kt)(u,(0,r.Z)({},l,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"octavia"},"Octavia"),(0,n.kt)("h2",{id:"cleanup-of-amphora-missing-from-the-db"},"Cleanup of amphora missing from the DB"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-none",metastring:'title="/var/log/kolla/octavia/octavia-health-manager.log"',title:'"/var/log/kolla/octavia/octavia-health-manager.log"'},"2023-10-25 16:43:52.547 22 WARNING octavia.amphorae.drivers.health.heartbeat_udp [-]\nThe amphora 2a33a889-4f9a-4340-84a5-e58a7a8af17e with IP 10.1.0.79 is missing from the\nDB, so it cannot be automatically deleted (the compute_id is unknown). An operator must\nmanually delete it from the compute service.\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f4cdb2d9.de0eb0fa.js b/assets/js/f4cdb2d9.de0eb0fa.js new file mode 100644 index 0000000000..c70437056a --- /dev/null +++ b/assets/js/f4cdb2d9.de0eb0fa.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3675],{3905:(e,r,t)=>{t.d(r,{Zo:()=>u,kt:()=>v});var n=t(67294);function o(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function c(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function a(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?c(Object(t),!0).forEach((function(r){o(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):c(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}function i(e,r){if(null==e)return{};var t,n,o=function(e,r){if(null==e)return{};var t,n,o={},c=Object.keys(e);for(n=0;n<c.length;n++)t=c[n],r.indexOf(t)>=0||(o[t]=e[t]);return o}(e,r);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(n=0;n<c.length;n++)t=c[n],r.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var l=n.createContext({}),p=function(e){var r=n.useContext(l),t=r;return e&&(t="function"==typeof e?e(r):a(a({},r),e)),t},u=function(e){var r=p(e.components);return n.createElement(l.Provider,{value:r},e.children)},s="mdxType",d={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},f=n.forwardRef((function(e,r){var t=e.components,o=e.mdxType,c=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),s=p(t),f=o,v=s["".concat(l,".").concat(f)]||s[f]||d[f]||c;return t?n.createElement(v,a(a({ref:r},u),{},{components:t})):n.createElement(v,a({ref:r},u))}));function v(e,r){var t=arguments,o=r&&r.mdxType;if("string"==typeof e||o){var c=t.length,a=new Array(c);a[0]=f;var i={};for(var l in r)hasOwnProperty.call(r,l)&&(i[l]=r[l]);i.originalType=e,i[s]="string"==typeof e?e:o,a[1]=i;for(var p=2;p<c;p++)a[p]=t[p];return n.createElement.apply(null,a)}return n.createElement.apply(null,t)}f.displayName="MDXCreateElement"},34907:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>c,metadata:()=>i,toc:()=>p});var n=t(87462),o=(t(67294),t(3905));const c={},a="Knowledge",i={unversionedId:"container/overview/knowledge",id:"container/overview/knowledge",title:"Knowledge",description:"TODO",source:"@site/docs/03-container/overview/knowledge.md",sourceDirName:"03-container/overview",slug:"/container/overview/knowledge",permalink:"/docs/container/overview/knowledge",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/03-container/overview/knowledge.md",tags:[],version:"current",frontMatter:{}},l={},p=[],u={toc:p},s="wrapper";function d(e){let{components:r,...t}=e;return(0,o.kt)(s,(0,n.Z)({},u,t,{components:r,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"knowledge"},"Knowledge"),(0,o.kt)("p",null,"TODO"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f5b4e375.3677f5dc.js b/assets/js/f5b4e375.3677f5dc.js new file mode 100644 index 0000000000..9827e3fd70 --- /dev/null +++ b/assets/js/f5b4e375.3677f5dc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1776],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>f});var n=r(67294);function s(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){s(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,n,s=function(e,t){if(null==e)return{};var r,n,s={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(s[r]=e[r]);return s}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(s[r]=e[r])}return s}var l=n.createContext({}),p=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=p(e.components);return n.createElement(l.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var r=e.components,s=e.mdxType,a=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),c=p(r),h=s,f=c["".concat(l,".").concat(h)]||c[h]||d[h]||a;return r?n.createElement(f,o(o({ref:t},u),{},{components:r})):n.createElement(f,o({ref:t},u))}));function f(e,t){var r=arguments,s=t&&t.mdxType;if("string"==typeof e||s){var a=r.length,o=new Array(a);o[0]=h;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[c]="string"==typeof e?e:s,o[1]=i;for(var p=2;p<a;p++)o[p]=r[p];return n.createElement.apply(null,o)}return n.createElement.apply(null,r)}h.displayName="MDXCreateElement"},51823:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>a,metadata:()=>i,toc:()=>p});var n=r(87462),s=(r(67294),r(3905));const a={title:"SCS K8S Version Policy",type:"Standard",status:"Draft",track:"KaaS"},o=void 0,i={unversionedId:"scs-0210-v2-k8s-version-policy",id:"scs-0210-v2-k8s-version-policy",title:"SCS K8S Version Policy",description:"Introduction",source:"@site/standards/scs-0210-v2-k8s-version-policy.md",sourceDirName:".",slug:"/scs-0210-v2-k8s-version-policy",permalink:"/standards/scs-0210-v2-k8s-version-policy",draft:!1,tags:[],version:"current",frontMatter:{title:"SCS K8S Version Policy",type:"Standard",status:"Draft",track:"KaaS"}},l={},p=[{value:"Introduction",id:"introduction",level:2},{value:"Motivation",id:"motivation",level:2},{value:"Decision",id:"decision",level:2},{value:"Related Documents",id:"related-documents",level:2},{value:"Validation / Conformance",id:"validation--conformance",level:2}],u={toc:p},c="wrapper";function d(e){let{components:t,...r}=e;return(0,s.kt)(c,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,s.kt)("h2",{id:"introduction"},"Introduction"),(0,s.kt)("p",null,"The Kubernetes project maintains multiple release versions including their patched versions.\nIn the project, the three most recent minor releases are actively maintained, with a fourth\nversion being in development. As soon as a new minor version is officially released,\nthe oldest version is dropped out of the support period.\nKubernetes supports its releases for around 14 months. 12 of these are the standard\nsupport period. The remaining 2 months are the end-of-life support period for things like:"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"CVEs (under the advisement of the Security Response Committee)"),(0,s.kt)("li",{parentName:"ul"},"dependency issues (including base image updates)"),(0,s.kt)("li",{parentName:"ul"},"critical core component issues")),(0,s.kt)("p",null,"More information can be found under ","[Kubernetes Support Period]","."),(0,s.kt)("p",null,"The Kubernetes release cycle is set around 4 months, which usually results in about\n",(0,s.kt)("strong",{parentName:"p"},"3 minor")," releases per year ",(0,s.kt)("a",{parentName:"p",href:"https://kubernetes.io/releases/release/#the-release-cycle"},"Kubernetes Release Cycle"),"."),(0,s.kt)("p",null,"Patches to these releases are provided monthly, with the exception of the first patch,\nwhich is usually provided 1-2 weeks after the initial release ",(0,s.kt)("a",{parentName:"p",href:"https://kubernetes.io/releases/patch-releases/#cadence"},"Patch Release Cadence"),"."),(0,s.kt)("h2",{id:"motivation"},"Motivation"),(0,s.kt)("p",null,"Kubernetes is a living, fast-paced project, which follows a pre-defined release cycle.\nThis enables forward planning with regards to releases and patches, but also implies a\nnecessity to upgrade to newer versions quickly, since these often include new features,\nimportant security updates or especially if a previous version falls out of the support\nperiod window."),(0,s.kt)("p",null,"We want to achieve an up-to-date policy, meaning that providers should be mostly in\nsync with the upstream and don't fall behind the official Kubernetes releases.\nThis is achievable, since new versions are released periodical on a well communicated\nschedule, enabling providers and users to set up processes around it.\nBeing up to date ensures that security issues and bugs are addressed and new features\nare made available when using SCS compliant clusters."),(0,s.kt)("p",null,"It is nevertheless important to at least support all Kubernetes versions that are still\ninside the support period, since users could depend on specific versions or may need\nlonger to upgrade their workloads to a newer version."),(0,s.kt)("p",null,"The standard therefore should provide a version recency policy as well as a support\nwindow period."),(0,s.kt)("h2",{id:"decision"},"Decision"),(0,s.kt)("p",null,"In order to keep up-to date with the latest Kubernetes features, bug fixes and security improvements,\nthe provided Kubernetes versions should be kept up to date with the upstream."),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"The latest minor version MUST be provided no later than 4 months after release."),(0,s.kt)("li",{parentName:"ul"},"The latest patch version MUST be provided no later than 1 week after release."),(0,s.kt)("li",{parentName:"ul"},"This time period MUST be even shorter for patches that target critical CVEs (CVSS >= 8).\nIt is RECOMMENDED to provide a new patch version in a 2 day time period after their release."),(0,s.kt)("li",{parentName:"ul"},"New versions MUST be tested before being rolled out on productive infrastructure;\nat least the CNCF E2E tests should be passed beforehand.")),(0,s.kt)("p",null,"At the same time, providers must support Kubernetes versions at least as long as the\nofficial sources as mentioned in the ",(0,s.kt)("a",{parentName:"p",href:"https://kubernetes.io/releases/patch-releases/#support-period"},"Kubernetes Support Period"),"."),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"Kubernetes versions MUST be supported as long as the official sources support them.\nThe current support period can therefore be found in ","[Kubernetes Support Period]","."),(0,s.kt)("li",{parentName:"ul"},"It is RECOMMENDED to not support versions after this period in order to not encourage\nusage of out-of-date versions.")),(0,s.kt)("h2",{id:"related-documents"},"Related Documents"),(0,s.kt)("p",null,"All documents regarding versioning, releases, etc. for the official Kubernetes projects can be found here:\n",(0,s.kt)("a",{parentName:"p",href:"https://kubernetes.io/releases/"},"Kubernetes Releases"),"\n",(0,s.kt)("a",{parentName:"p",href:"https://kubernetes.io/releases/patch-releases/#support-period"},"Kubernetes Support Period"),"\n",(0,s.kt)("a",{parentName:"p",href:"https://kubernetes.io/releases/release/#the-release-cycle"},"Kubernetes Release Cycle"),"\n",(0,s.kt)("a",{parentName:"p",href:"https://kubernetes.io/releases/patch-releases/#cadence"},"Patch Release Cadence")),(0,s.kt)("h2",{id:"validation--conformance"},"Validation / Conformance"),(0,s.kt)("p",null,(0,s.kt)("em",{parentName:"p"},"This section will be updated when the conformance tests are written.")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f68824be.99ea73af.js b/assets/js/f68824be.99ea73af.js new file mode 100644 index 0000000000..af1433a9ed --- /dev/null +++ b/assets/js/f68824be.99ea73af.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2501],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>m});var o=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function r(e,t){if(null==e)return{};var n,o,a=function(e,t){if(null==e)return{};var n,o,a={},i=Object.keys(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=o.createContext({}),c=function(e){var t=o.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},d=function(e){var t=c(e.components);return o.createElement(l.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},h=o.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,d=r(e,["components","mdxType","originalType","parentName"]),u=c(n),h=a,m=u["".concat(l,".").concat(h)]||u[h]||p[h]||i;return n?o.createElement(m,s(s({ref:t},d),{},{components:n})):o.createElement(m,s({ref:t},d))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,s=new Array(i);s[0]=h;var r={};for(var l in t)hasOwnProperty.call(t,l)&&(r[l]=t[l]);r.originalType=e,r[u]="string"==typeof e?e:a,s[1]=r;for(var c=2;c<i;c++)s[c]=n[c];return o.createElement.apply(null,s)}return o.createElement.apply(null,n)}h.displayName="MDXCreateElement"},33040:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>p,frontMatter:()=>i,metadata:()=>r,toc:()=>c});var o=n(87462),a=(n(67294),n(3905));const i={title:"Requirements for SSO identity federation",type:"Decision Record",status:"Stable",stabilized_at:new Date("2023-06-21T00:00:00.000Z"),track:"IAM"},s=void 0,r={unversionedId:"scs-0300-v1-requirements-for-sso-identity-federation",id:"scs-0300-v1-requirements-for-sso-identity-federation",title:"Requirements for SSO identity federation",description:"Introduction",source:"@site/standards/scs-0300-v1-requirements-for-sso-identity-federation.md",sourceDirName:".",slug:"/scs-0300-v1-requirements-for-sso-identity-federation",permalink:"/standards/scs-0300-v1-requirements-for-sso-identity-federation",draft:!1,tags:[],version:"current",frontMatter:{title:"Requirements for SSO identity federation",type:"Decision Record",status:"Stable",stabilized_at:"2023-06-21T00:00:00.000Z",track:"IAM"},sidebar:"standards",previous:{title:"SCS-0300: SSO Identity Federation",permalink:"/standards/iam/scs-0300"},next:{title:"Ops Standards",permalink:"/standards/ops/"}},l={},c=[{value:"Introduction",id:"introduction",level:2},{value:"Motivation for this document",id:"motivation-for-this-document",level:2},{value:"Design Considerations",id:"design-considerations",level:2},{value:"Options considered",id:"options-considered",level:3},{value:"Keycloak",id:"keycloak",level:4},{value:"Zitadel",id:"zitadel",level:4},{value:"Open questions",id:"open-questions",level:2},{value:"Decision",id:"decision",level:2},{value:"Related Documents",id:"related-documents",level:2},{value:"Conformance Tests",id:"conformance-tests",level:2},{value:"Conformance Tests, OPTIONAL",id:"conformance-tests-optional",level:2}],d={toc:c},u="wrapper";function p(e){let{components:t,...n}=e;return(0,a.kt)(u,(0,o.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"introduction"},"Introduction"),(0,a.kt)("p",null,"Our assumption is that there are use cases, where CSPs would like to be able to\nlet customers access their SCS based services by identifying themselves with\ncredentials that are stored and managed external to the CSP's SCS installation."),(0,a.kt)("p",null,"This is based on the observation that prospective customers of an SCS based CSP\nsometimes already come equipped with an IAM solution of their choice, either on\npremises or e.g. as an external 3rd party cloud service. To ease onboarding of\ncustomer employees (or e.g. customer contracted 3rd party admin staff) as SCS\nusers, it would be good to be able to consume these external identities in SCS."),(0,a.kt)("p",null,"For customers this avoids the neccessity to explicitly maintain an additional\ndedicated account in SCS and this also reduces what SCS needs to do with\nrespect to taking care of persisting user account information."),(0,a.kt)("p",null,"To put it in other words, in SCS we would like to be able to delegate\nauthentication to external identity providers and map those users to roles in\nSCS that can be used for authorization decisions when users access SCS services."),(0,a.kt)("p",null,'In addition to user identities there we also see the necessity to support the\nuse of "machine identites" (aka "workload identities" or "service accounts").\nThese will probably be SCS-local accounts and have for example the purpose\nto grant CaaS workload access to storage resources served by the infrastructure\nlayer. Exact architectural details for this are still in active discussion,\nbut it is anticipated that the IdP component should be very useful in\nfacilitating the integration.'),(0,a.kt)("h2",{id:"motivation-for-this-document"},"Motivation for this document"),(0,a.kt)("p",null,"SCS has multiple service layers, like IaaS and CaaS, both of which running their\nown technological stack with specific internal models of accounts and\nauthorization."),(0,a.kt)("p",null,"One thing these services have in common, is that they are able\nto use SSO protocols like OAuth 2.0 or OpenID Connect (OIDC) on top of it to\ndelegate authentication. They are service providers (SAML terminology) and can\nbe relying parties (OIDC terminology) of a protocol compliant identity provider\n(IdP)."),(0,a.kt)("p",null,"So the idea is, to run an SSO IdP as part of SCS to provide a dedicated point\nof entry for identites, which the SCS service layers can use as a common\ninterface to consume external user identities."),(0,a.kt)("p",null,"The purpose of this document is to specify what requirements a specific\ntechnical IdP implementation (i.e. software solution) needs to fulfill\nin the context of SCS."),(0,a.kt)("h2",{id:"design-considerations"},"Design Considerations"),(0,a.kt)("p",null,"As a central service for identity handling, the IdP\nservice needs to be robust and reliable."),(0,a.kt)("p",null,'Customers shall be able to access self service, so that\nthey can make reasonable adjustments e.g. to role mapping.\nAt the time of writing this document it\'s still undecided\nif SCS has the requirement of a dedicated "self service" service\nthat serves as a frontend to provision and re-configure\ncustomer specific data, abstracting e.g. from IdP specific\nuser interface particularities.'),(0,a.kt)("p",null,'Keycloak is currently being deployed as part of the IaaS reference implementation.\nTechnically this IdP component shall be shifted from the management\nplane to be run on the basis of a "minimal" Kubernetes (e.g. K3S),\ne.g. to make use of the "self healing" and scaling features achievable\nwith that.'),(0,a.kt)("p",null,"So one of the considerations is if the solution will work well on a\nK8S environment. The instances will need to share configuration\n(probably via the shared backend database) as well as session state.\nMaybe one is better prepared for horizontal scaling than the other."),(0,a.kt)("h3",{id:"options-considered"},"Options considered"),(0,a.kt)("h4",{id:"keycloak"},"Keycloak"),(0,a.kt)("p",null,"Keycloak is a commonly used IdP solution implemented in Java.\nIt is developed as an open source community project.\nRed Hat uses it as upstream source for their Red Hat SSO product\nand is also listed as sponsor of the project.\nStarting with version 17 the default distribution is based on\nQuarkus instead of WildFly/JBoss."),(0,a.kt)("p",null,"The project maintains several means of community contributions\nas listed on the ",(0,a.kt)("a",{parentName:"p",href:"https://www.keycloak.org/community"},"community section"),"\nof the project website. It uses ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/keycloak/keycloak/issues"},"Github issues"),"\nto track development."),(0,a.kt)("p",null,"It offers a REST API for administration and there's a separately maintained\n3rd party python module as well as ansible support for it. Both of these are\ndownstream of Keycloak itself and may thus not always be feature complete and\nsuffer latency with respect to getting adjusted to upstream changes."),(0,a.kt)("p",null,'It offers support for commonly used SSO protocols and is "reasonably" fast\nin adopting to protocol standard changes and extensions. This has been\nobserved in the case of logout support (backend and frontend variants) in OIDC.'),(0,a.kt)("p",null,'It offers a concept of "Identity Brokering", where Keycloak is not just IdP\nbut also "client" to other IdPs. This allows daisy chaining of identity\nfederation. In this configuration it can work as a point of protocol\ntransition between different supported SSO protocols (SAML, OAuth 2.0, etc.).'),(0,a.kt)("p",null,"Beyond this capability of using other IdPs as identity sources, it also supports\nusing classic LDAP based IAM services as backend (OpenLDAP and Active Directory,\ne.g.)."),(0,a.kt)("p",null,'Keycloak\'s implementation makes some design decisions, that are specific\nto it and have consequences for clients of the service. E.g. Keycloak\nhas a concept of management "Realms", which have their own specific\nset of HTTP API entrypoints, both for administration as well as for IdP\nrequests.'),(0,a.kt)("p",null,'Commonly Keycloak realms can be used to map them 1:1 to user domains,\nbut since Keycloak supports configuring multiple backend IdPs in a\nrealm to be used for "Identity Brokering", there is always the\npossibility to create a kind of "proxy" realm to provide a single\nstandard set of HTTP API endpoints for SSO clients (service providers)\nto avoid the need to frequently extend/reduce client service configuration\nwhenever a new IdP federation needs to be added to Keycloak to onboard\na new customer. This is relevant for services like OpenStack Keystone,\nwhich currently cannot be easily reconfigured for new SSO endpoints\nwithout restarting the service, making the service unavailable for\na short span of time and increasing risk connected with service restarts.'),(0,a.kt)("p",null,'Since version 17, Keycloak claims that it\'s capability for\n"cloud native" deployments on Kubernetes has improved.'),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://www.keycloak.org/docs-api/20.0.1/rest-api/index.html"},"Keycloak is offering a REST API"),"\nfor all aspects of its administration interface."),(0,a.kt)("p",null,"For storage of Keycloak configuration and local user metadata\n(e.g. from which external IdP a user account originally came from)\nKeycloak supports several SQL backends through JDBC. Thus\nit can be hooked up to a Postgres Database or to a\nMariaDB/Galera cluster e.g.."),(0,a.kt)("p",null,"As of April 11, 2023, Keycloak joined the CNCF as an incubating project."),(0,a.kt)("h4",{id:"zitadel"},"Zitadel"),(0,a.kt)("p",null,"Zitadel is a newer implementation of an SSO IdP.\nIt is implemented in Go and under active development and maintained by ZITADEL."),(0,a.kt)("p",null,"The project is open for community ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/zitadel/zitadel/blob/main/CONTRIBUTING.md"},"contributions"),"\nto all parts of the eco system.\nFeature requests and bugs being tracked on ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/orgs/zitadel/projects/2/views/5"},"Github")," for development.\nCommunity questions can be asked in the ",(0,a.kt)("a",{parentName:"p",href:"https://zitadel.com/chat"},"public chat")," or via ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/zitadel/zitadel/discussions"},"Github Discussions"),".\nZITADEL offers support for the commonly used authentication and authorization protocols such as OIDC, OAuth2, SAML2.\nIt is a compliant and certified OpenID Connect provider with support for various Grant Types for both human users and machine users.\nCompared to Keycloak SPIs, ZITADEL offers Actions to customize and integrate (eg, calling external APIs, Webhooks, customizing pre-built workflows, customizing tokens)\nActions are executed at runtime and can be maintained independently of platform.\nIdentity brokering (OIDC, SAML, JWT) can be configured system-wide or for each organization with templates.\nUsers will be created just in time for audit purposes and linked to the external identity provider.\nUsers can have multiple identity providers linked to their profile."),(0,a.kt)("p",null,"It came to attention of the SCS project because it offers a\nfresh take of an organization focussed data model, which has\nthe potential to simplify IdP federation to SCS customer domains\nin the following areas:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"For client services (single set of HTTP API endpoints)."),(0,a.kt)("li",{parentName:"ul"},"For SCS operators for provisioning customer ",(0,a.kt)("a",{parentName:"li",href:"https://zitadel.com/docs/concepts/structure/organizations"},"organizations"),"\nand robust configuraton by using templated client, role and mapping\nconfiguration."),(0,a.kt)("li",{parentName:"ul"},"For SCS customers for a robust user experience for self servicing.")),(0,a.kt)("p",null,"The concept for ",(0,a.kt)("a",{parentName:"p",href:"https://zitadel.com/docs/concepts/structure/organizations"},"Delegated Access Management"),"\nreduces the management overhead compared to isolated realms.\nProjects (Applications + Roles) can be maintained by one organization and delegated to be used by other Organizations.\nManagers that receive granted Projects can assign users permissions to use the project."),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://zitadel.com/docs/apis/introduction"},"Zitadel is offering REST APIs"),"\nfor multiple areas of use and configuration."),(0,a.kt)("p",null,"It recently also added support for the ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/zitadel/oidc/issues/141"},"Device Authorization Grant"),",\nwhich, at time of writing, is a feauture that is relevant\nfor SCS to be able use OpenStack CLI and APIs with federated\nidentities (",(0,a.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/issues/issues/221"},"Device Authorization Grant"),")."),(0,a.kt)("p",null,"Support for consumption of LDAP backends is available since ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/zitadel/zitadel/releases/tag/v2.23.0"},"Zitadel v2.23.0"),"\n(see ",(0,a.kt)("a",{parentName:"p",href:"https://zitadel.com/docs/guides/integrate/identity-providers/ldap"},"this guide"),")."),(0,a.kt)("p",null,"ZITADEL supported backend databases are CockroachDB and PostgreSQL."),(0,a.kt)("p",null,"For ",(0,a.kt)("a",{parentName:"p",href:"https://zitadel.com/docs/self-hosting/manage/production"},"production setups")," it is recommended\nto use Kubernetes (or similar like Knative) and CockroachDB."),(0,a.kt)("p",null,'At time of writing a PoC "spike" is done to assess and verify the hopes\nconnected with Zitadel in the context of the SCS testbed.'),(0,a.kt)("p",null,"Currently Zitadel is lacking the possibility to easily add custom claims.\nIt supports ",(0,a.kt)("inlineCode",{parentName:"p"},"urn:zitadel:iam:user:metadata"),", but that is more suitable\ntowards Kubernetes and cannot be parsed with the OpenStack mapping mechanism.\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/zitadel/zitadel/issues/3997"},"There is work going on")," which\nmay be suitable to resolve this issue.\nAn approach based on Zitadel actions is also currently evaluated.\nOpenStack currently makes use of custom claims to pass ",(0,a.kt)("inlineCode",{parentName:"p"},"openstack-default-project"),"\nfrom the IdP to OpenStack. Combined with federation to external customer managed IdPs\nthis should allow customers to manage settings like these in their own IAM."),(0,a.kt)("h2",{id:"open-questions"},"Open questions"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"How would we implement testbed deployment support for Zitadel?",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"e.g. ",(0,a.kt)("inlineCode",{parentName:"li"},"wsgi-keystone.conf")," would need to look different. One template covering both options?"),(0,a.kt)("li",{parentName:"ul"},"e.g. steps like ",(0,a.kt)("inlineCode",{parentName:"li"},"openstack federation protocol create")," would probably be different."))),(0,a.kt)("li",{parentName:"ul"},"Should we support both as options?",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"What's the benefit?"),(0,a.kt)("li",{parentName:"ul"},"How would we allow SCS operators to choose?"))),(0,a.kt)("li",{parentName:"ul"},"Do we need some kind of SWOT analysis to come to a decision?")),(0,a.kt)("h2",{id:"decision"},"Decision"),(0,a.kt)("p",null,"SCS wants to make use of an IdP as part of the reference implementation.\nTo move forward with topics of configuration and mapping of roles in a\nOAuth2 federation scenario as well as questions of token lifecycles etc. across\nthe federation stack it makes sense to focus on one IdP implementation at a\ngiven time. Both considered options seem to be potentially viable, but ultimately,\na decision should be made, even if there are no strict/strong reasons for\ndismissing either option in particular."),(0,a.kt)("p",null,"The project's current choice is Keycloak for the following reasons:\nKeycloak currently supports the OAuth 2.0 grants that SCS wants to make\nuse of (e.g. Device Authorization Grant). It is the implementation for\nwhich integration is currently documented in OpenStack and implemented\nin kolla-ansible. SCS currently deploys Keycloak and the IAM team has\nmost hands on expecience with it, e.g. when it comes to colletaral questions\nlike how to make TLS and signing certificates available to the IdP that shall\nbe used in federation to external domains."),(0,a.kt)("h2",{id:"related-documents"},"Related Documents"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/SovereignCloudStack/standards/tree/main/Drafts/IAM-federation"},"https://github.com/SovereignCloudStack/standards/tree/main/Drafts/IAM-federation"))),(0,a.kt)("h2",{id:"conformance-tests"},"Conformance Tests"),(0,a.kt)("h2",{id:"conformance-tests-optional"},"Conformance Tests, OPTIONAL"))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f793d2d5.c5d3177c.js b/assets/js/f793d2d5.c5d3177c.js new file mode 100644 index 0000000000..0cbe52453c --- /dev/null +++ b/assets/js/f793d2d5.c5d3177c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9080],{32481:s=>{s.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"community"}')}}]); \ No newline at end of file diff --git a/assets/js/f8869d03.86281479.js b/assets/js/f8869d03.86281479.js new file mode 100644 index 0000000000..cbd8b6af86 --- /dev/null +++ b/assets/js/f8869d03.86281479.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5739],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>f});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function s(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?s(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):s(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},s=Object.keys(e);for(r=0;r<s.length;r++)a=s[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(r=0;r<s.length;r++)a=s[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var i=r.createContext({}),c=function(e){var t=r.useContext(i),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},d=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,s=e.originalType,i=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),p=c(a),m=n,f=p["".concat(i,".").concat(m)]||p[m]||u[m]||s;return a?r.createElement(f,o(o({ref:t},d),{},{components:a})):r.createElement(f,o({ref:t},d))}));function f(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var s=a.length,o=new Array(s);o[0]=m;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l[p]="string"==typeof e?e:n,o[1]=l;for(var c=2;c<s;c++)o[c]=a[c];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},11010:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>u,frontMatter:()=>s,metadata:()=>l,toc:()=>c});var r=a(87462),n=(a(67294),a(3905));const s={},o="KaaS Standards",l={unversionedId:"kaas/index",id:"kaas/index",title:"KaaS Standards",description:"Standards in this track are concerned with Kubernetes as a Service layer, outlining norms and best practices for deploying, managing, and operating Kubernetes clusters. These standards aim to ensure that the orchestration of containers is streamlined, secure, and compatible across various cloud environments and platforms.",source:"@site/standards/kaas/index.md",sourceDirName:"kaas",slug:"/kaas/",permalink:"/standards/kaas/",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"standards",previous:{title:"SCS Standard Images",permalink:"/standards/scs-0104-v1-standard-images"},next:{title:"SCS-0210: k8s New Version Policy",permalink:"/standards/kaas/scs-0210"}},i={},c=[],d={toc:c},p="wrapper";function u(e){let{components:t,...a}=e;return(0,n.kt)(p,(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"kaas-standards"},"KaaS Standards"),(0,n.kt)("p",null,"Standards in this track are concerned with Kubernetes as a Service layer, outlining norms and best practices for deploying, managing, and operating Kubernetes clusters. These standards aim to ensure that the orchestration of containers is streamlined, secure, and compatible across various cloud environments and platforms."),(0,n.kt)("table",null,(0,n.kt)("thead",{parentName:"table"},(0,n.kt)("tr",{parentName:"thead"},(0,n.kt)("th",{parentName:"tr",align:null},"Standard"),(0,n.kt)("th",{parentName:"tr",align:null},"Most Recent Version"),(0,n.kt)("th",{parentName:"tr",align:null},"State"),(0,n.kt)("th",{parentName:"tr",align:null},"Description"),(0,n.kt)("th",{parentName:"tr",align:null},"stabilized"))),(0,n.kt)("tbody",{parentName:"table"},(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/kaas/scs-0210"},"SCS-0210")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/scs-0210-v1-k8s-new-version-policy"},"v1")),(0,n.kt)("td",{parentName:"tr",align:null},"\ud83d\udfe2 Stable"),(0,n.kt)("td",{parentName:"tr",align:null},"New Version Policy"),(0,n.kt)("td",{parentName:"tr",align:null},"2023-02-07")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/kaas/scs-0211"},"SCS-0211")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"/standards/scs-0101-v1-entropy"},"v1")),(0,n.kt)("td",{parentName:"tr",align:null},"\ud83d\udfe2 Stable"),(0,n.kt)("td",{parentName:"tr",align:null},"Default Storage Class"),(0,n.kt)("td",{parentName:"tr",align:null},"2023-02-13")))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f91986bc.9a1b755b.js b/assets/js/f91986bc.9a1b755b.js new file mode 100644 index 0000000000..de205494bf --- /dev/null +++ b/assets/js/f91986bc.9a1b755b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8205],{59676:e=>{e.exports=JSON.parse('{"title":"Operating SCS","slug":"/category/operating-scs","permalink":"/docs/category/operating-scs","navigation":{"previous":{"title":"Testing","permalink":"/docs/container/components/k8s-cluster-api-provider/doc/usage/testing"},"next":{"title":"Components","permalink":"/docs/category/components-2"}}}')}}]); \ No newline at end of file diff --git a/assets/js/f9ec068e.31f29287.js b/assets/js/f9ec068e.31f29287.js new file mode 100644 index 0000000000..e558b9c555 --- /dev/null +++ b/assets/js/f9ec068e.31f29287.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6870],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>f});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,i=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),u=c(n),m=a,f=u["".concat(i,".").concat(m)]||u[m]||p[m]||o;return n?r.createElement(f,l(l({ref:t},d),{},{components:n})):r.createElement(f,l({ref:t},d))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=m;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[u]="string"==typeof e?e:a,l[1]=s;for(var c=2;c<o;c++)l[c]=n[c];return r.createElement.apply(null,l)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},70406:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>p,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var r=n(87462),a=(n(67294),n(3905));const o={},l="SCS-0001: SCS Standards",s={unversionedId:"global/scs-0001",id:"global/scs-0001",title:"SCS-0001: SCS Standards",description:"SCS-0001 outlines the structure, requirements, and lifecycle of standards, procedural documents, and decision records within the Sovereign Cloud Stack (SCS) community, ensuring clarity, organization, and governance in the development and maintenance of interoperable and transparent cloud infrastructure standards.",source:"@site/standards/global/scs-0001.md",sourceDirName:"global",slug:"/global/scs-0001",permalink:"/standards/global/scs-0001",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"standards",previous:{title:"Global Standards",permalink:"/standards/global/"},next:{title:"Sovereign Cloud Standards",permalink:"/standards/scs-0001-v1-sovereign-cloud-standards"}},i={},c=[],d={toc:c},u="wrapper";function p(e){let{components:t,...n}=e;return(0,a.kt)(u,(0,r.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"scs-0001-scs-standards"},"SCS-0001: SCS Standards"),(0,a.kt)("p",null,"SCS-0001 outlines the structure, requirements, and lifecycle of standards, procedural documents, and decision records within the Sovereign Cloud Stack (SCS) community, ensuring clarity, organization, and governance in the development and maintenance of interoperable and transparent cloud infrastructure standards."),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Version"),(0,a.kt)("th",{parentName:"tr",align:null},"Type"),(0,a.kt)("th",{parentName:"tr",align:null},"State"),(0,a.kt)("th",{parentName:"tr",align:null},"stabilized"),(0,a.kt)("th",{parentName:"tr",align:null},"obsoleted"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("a",{parentName:"td",href:"/standards/scs-0001-v1-sovereign-cloud-standards"},"SCS-0001-v1")),(0,a.kt)("td",{parentName:"tr",align:null},"Procedural"),(0,a.kt)("td",{parentName:"tr",align:null},"\ud83d\udfe2 Stable"),(0,a.kt)("td",{parentName:"tr",align:null},"2022-11-28"),(0,a.kt)("td",{parentName:"tr",align:null},"-")))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fa7c4c29.5326d7fa.js b/assets/js/fa7c4c29.5326d7fa.js new file mode 100644 index 0000000000..a46432fd41 --- /dev/null +++ b/assets/js/fa7c4c29.5326d7fa.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1949],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>f});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function p(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var u=n.createContext({}),s=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},c=function(e){var t=s(e.components);return n.createElement(u.Provider,{value:t},e.children)},d="mdxType",l={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,u=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),d=s(r),g=a,f=d["".concat(u,".").concat(g)]||d[g]||l[g]||o;return r?n.createElement(f,i(i({ref:t},c),{},{components:r})):n.createElement(f,i({ref:t},c))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=g;var p={};for(var u in t)hasOwnProperty.call(t,u)&&(p[u]=t[u]);p.originalType=e,p[d]="string"==typeof e?e:a,i[1]=p;for(var s=2;s<o;s++)i[s]=r[s];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}g.displayName="MDXCreateElement"},82171:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>l,frontMatter:()=>o,metadata:()=>p,toc:()=>s});var n=r(87462),a=(r(67294),r(3905));const o={sidebar_label:"Network",sidebar_position:15},i="Network",p={unversionedId:"iaas/guides/upgrade-guide/network",id:"iaas/guides/upgrade-guide/network",title:"Network",description:"Open vSwitch",source:"@site/docs/02-iaas/guides/upgrade-guide/network.md",sourceDirName:"02-iaas/guides/upgrade-guide",slug:"/iaas/guides/upgrade-guide/network",permalink:"/docs/iaas/guides/upgrade-guide/network",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/upgrade-guide/network.md",tags:[],version:"current",sidebarPosition:15,frontMatter:{sidebar_label:"Network",sidebar_position:15},sidebar:"docs",previous:{title:"Manager",permalink:"/docs/iaas/guides/upgrade-guide/manager"},next:{title:"Ceph",permalink:"/docs/iaas/guides/upgrade-guide/ceph"}},u={},s=[{value:"Open vSwitch",id:"open-vswitch",level:2},{value:"OVN (if used)",id:"ovn-if-used",level:2}],c={toc:s},d="wrapper";function l(e){let{components:t,...r}=e;return(0,a.kt)(d,(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"network"},"Network"),(0,a.kt)("h2",{id:"open-vswitch"},"Open vSwitch"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"osism apply -a pull openvswitch\nosism apply -a upgrade openvswitch\n")),(0,a.kt)("h2",{id:"ovn-if-used"},"OVN (if used)"),(0,a.kt)("p",null,"Before the upgrade of OVN, the upgrade of Open vSwitch must already have been done."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"osism apply -a pull ovn\nosism apply -a upgrade ovn\n")))}l.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fd34a958.fe509446.js b/assets/js/fd34a958.fe509446.js new file mode 100644 index 0000000000..efb0b38ecd --- /dev/null +++ b/assets/js/fd34a958.fe509446.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1906],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>m});var a=n(67294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function r(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){i(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,a,i=function(e,t){if(null==e)return{};var n,a,i={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var l=a.createContext({}),d=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},c=function(e){var t=d(e.components);return a.createElement(l.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var n=e.components,i=e.mdxType,o=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=d(n),h=i,m=p["".concat(l,".").concat(h)]||p[h]||u[h]||o;return n?a.createElement(m,r(r({ref:t},c),{},{components:n})):a.createElement(m,r({ref:t},c))}));function m(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=n.length,r=new Array(o);r[0]=h;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:i,r[1]=s;for(var d=2;d<o;d++)r[d]=n[d];return a.createElement.apply(null,r)}return a.createElement.apply(null,n)}h.displayName="MDXCreateElement"},25026:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>u,frontMatter:()=>o,metadata:()=>s,toc:()=>d});var a=n(87462),i=(n(67294),n(3905));const o={title:"Status page OpenAPI decision",type:"Decision Record",status:"Draft",track:"Ops"},r=void 0,s={unversionedId:"scs-0402-v1-status-page-openapi-spec-decision",id:"scs-0402-v1-status-page-openapi-spec-decision",title:"Status page OpenAPI decision",description:"Introduction",source:"@site/standards/scs-0402-v1-status-page-openapi-spec-decision.md",sourceDirName:".",slug:"/scs-0402-v1-status-page-openapi-spec-decision",permalink:"/standards/scs-0402-v1-status-page-openapi-spec-decision",draft:!1,tags:[],version:"current",frontMatter:{title:"Status page OpenAPI decision",type:"Decision Record",status:"Draft",track:"Ops"},sidebar:"standards",previous:{title:"SCS-0402",permalink:"/standards/standards/scs-0402"},next:{title:"SCS-0410",permalink:"/standards/standards/scs-0410"}},l={},d=[{value:"Introduction",id:"introduction",level:2},{value:"Requirements",id:"requirements",level:2},{value:"Motivation",id:"motivation",level:2},{value:"Decision",id:"decision",level:2},{value:"Common definitions",id:"common-definitions",level:3},{value:"Id",id:"id",level:4},{value:"Incremental",id:"incremental",level:4},{value:"Generation and order",id:"generation-and-order",level:4},{value:"API objects",id:"api-objects",level:3},{value:"API object fields",id:"api-object-fields",level:3},{value:"Endpoint naming",id:"endpoint-naming",level:3},{value:"Phase list",id:"phase-list",level:3},{value:"Labels",id:"labels",level:3},{value:"Impact",id:"impact",level:3},{value:"Component impacts",id:"component-impacts",level:3},{value:"Return of <code>POST</code> requests",id:"return-of-post-requests",level:3},{value:"Return of <code>PATCH</code> requestes",id:"return-of-patch-requestes",level:3},{value:"<code>PATCH</code> vs <code>PUT</code> for updating resources",id:"patch-vs-put-for-updating-resources",level:3},{value:"Authentication and authorization",id:"authentication-and-authorization",level:3}],c={toc:d},p="wrapper";function u(e){let{components:t,...n}=e;return(0,i.kt)(p,(0,a.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"introduction"},"Introduction"),(0,i.kt)("p",null,"While defining the ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/SovereignCloudStack/status-page-openapi"},"OpenAPI spec")," some considerations and decisions are made and should be documented."),(0,i.kt)("h2",{id:"requirements"},"Requirements"),(0,i.kt)("p",null,'The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in ',(0,i.kt)("a",{parentName:"p",href:"https://datatracker.ietf.org/doc/html/rfc2119"},"RFC 2119"),"."),(0,i.kt)("p",null,'In addition, "FORBIDDEN" is to be interpreted equivalent to "MUST NOT".'),(0,i.kt)("h2",{id:"motivation"},"Motivation"),(0,i.kt)("p",null,"The spec should be as minimal as possible, while being as understandable as possible, so some choices to the design of API objects, requests and responses are made."),(0,i.kt)("h2",{id:"decision"},"Decision"),(0,i.kt)("h3",{id:"common-definitions"},"Common definitions"),(0,i.kt)("p",null,"Some defined schemas are used as common types. These common definitions help to simplify the actual object definitions by providing meaningful names, and reduce duplication. A change of ID type for example only needs one change in the common definition, and not in any of the object definitions which include an ID."),(0,i.kt)("p",null,"Special mentions:"),(0,i.kt)("h4",{id:"id"},"Id"),(0,i.kt)("p",null,"IDs are used for identification of resources, which can be retrieved by the API."),(0,i.kt)("p",null,"UUIDs are used, to ensure uniqueness. Also, they can be visually recognized as identifier."),(0,i.kt)("h4",{id:"incremental"},"Incremental"),(0,i.kt)("p",null,"An ",(0,i.kt)("inlineCode",{parentName:"p"},"Incremental")," is used in combination with other identifiers to identify a sub resource of any kind. ",(0,i.kt)("inlineCode",{parentName:"p"},"Incremental"),"s themselves are not globally unique, but unique for every sub resource of an unique resource."),(0,i.kt)("h4",{id:"generation-and-order"},"Generation and order"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"Generation")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"Order")," are predefined objects which include a ",(0,i.kt)("inlineCode",{parentName:"p"},"Incremental")," typed field for the common usages of the ",(0,i.kt)("inlineCode",{parentName:"p"},"Incremental")," value."),(0,i.kt)("h3",{id:"api-objects"},"API objects"),(0,i.kt)("p",null,"All objects which are used as payload, either as request or response, are defined by schemas. This centralizes the maintanence of field names and types, for both requests and responses."),(0,i.kt)("h3",{id:"api-object-fields"},"API object fields"),(0,i.kt)("p",null,"Most fields of objects are not required. This allows usage as request and response payloads."),(0,i.kt)("p",null,"Responses of payload objects, which contain an ID or an ",(0,i.kt)("inlineCode",{parentName:"p"},"Incremental")," typed field, MUST fill the ID or ",(0,i.kt)("inlineCode",{parentName:"p"},"Incremental")," field to fully identify the (sub) resource."),(0,i.kt)("p",null,"Requests on a single resource MUST contain the ID in the path parameters. Request on sub resources MUST contain the ID and ",(0,i.kt)("inlineCode",{parentName:"p"},"Incremental")," typed value as path parameters. The payload SHOULD NOT contain the ID or ",(0,i.kt)("inlineCode",{parentName:"p"},"Incremental")," typed field.\nIf it contains these fields as payload, they SHALL NOT change them."),(0,i.kt)("p",null,"Requests to updating operations SHOULD contain the minimum of the changed fields, but MAY contain the full object. ID and ",(0,i.kt)("inlineCode",{parentName:"p"},"Incremental")," typed fields MUST follow the same rules as stated above."),(0,i.kt)("h3",{id:"endpoint-naming"},"Endpoint naming"),(0,i.kt)("p",null,"The endpoints are named in plural form, even when handeling single objects, to keep uniform paths."),(0,i.kt)("h3",{id:"phase-list"},"Phase list"),(0,i.kt)("p",null,"The list of phases that an incident can go through has a crucial order. So it MUST be handled as the given list."),(0,i.kt)("p",null,"Delete or update operations are FORBIDDEN."),(0,i.kt)("p",null,'To "change" a phase list, a new one must be created. The old one must be kept. For this mechanic the lists are structured in generations. All references to phases MUST include their generation to ensure correct references.'),(0,i.kt)("p",null,"To reference a single phase a ",(0,i.kt)("inlineCode",{parentName:"p"},"PhaseReference")," MUST include a generation and an order field. This MAY be used to reference a single generation too."),(0,i.kt)("h3",{id:"labels"},"Labels"),(0,i.kt)("p",null,"Labels are identifying metadata to components. They do not represent a resource or sub resource of any kind. They are designed as non system critical pieces of information, mainly intended for human consumption."),(0,i.kt)("p",null,"Labels are simple key/value pairs attached to components, categorizing them dynamically."),(0,i.kt)("h3",{id:"impact"},"Impact"),(0,i.kt)("p",null,"An impact defines the relation between an incident and a component. A component can be affected by multiple incidents and an incident can affect multiple components. Each of these impacts can have a different type depending on the incident and component, like for example connectivity or performance issues."),(0,i.kt)("p",null,"To reflect this, each component and incident can have a list of impacts, stating the type of impact and a reference to the incident or component, it refers to."),(0,i.kt)("h3",{id:"component-impacts"},"Component impacts"),(0,i.kt)("p",null,"Components list their impacts, which they are affected by, as read only. Only an incident creates an impact on a component. Components MUST only list their currently active impacts."),(0,i.kt)("h3",{id:"return-of-post-requests"},"Return of ",(0,i.kt)("inlineCode",{parentName:"h3"},"POST")," requests"),(0,i.kt)("p",null,"Generally ",(0,i.kt)("inlineCode",{parentName:"p"},"POST")," requests create new resources. These endpoints do not return the new resource, but a unique identifier to the resource e.g. an UUID."),(0,i.kt)("p",null,"In most cases the new resource won't be used directly after creation. Most often list calls are used. If the new resource is used directly, it can be retrieved by the returned identifier."),(0,i.kt)("p",null,"Payloads to POST requests SHALL NOT include ID or ",(0,i.kt)("inlineCode",{parentName:"p"},"Incremental")," typed fields, it lies in the responsibility of the API server to assign IDs and ",(0,i.kt)("inlineCode",{parentName:"p"},"Incremental"),"s to objects."),(0,i.kt)("h3",{id:"return-of-patch-requestes"},"Return of ",(0,i.kt)("inlineCode",{parentName:"h3"},"PATCH")," requestes"),(0,i.kt)("p",null,"Most commonly ",(0,i.kt)("inlineCode",{parentName:"p"},"PATCH")," requests are used to partially or fully change a resource. These requests do not respond with the changed resource, nor an identifier."),(0,i.kt)("p",null,"Both the old state as well as the new state are known on the client at that point in time and if they need to load the actual recent version from the server, the identifier is already known."),(0,i.kt)("h3",{id:"patch-vs-put-for-updating-resources"},(0,i.kt)("inlineCode",{parentName:"h3"},"PATCH")," vs ",(0,i.kt)("inlineCode",{parentName:"h3"},"PUT")," for updating resources"),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"PUT")," requests is most commonly used to update full objects, whereas ",(0,i.kt)("inlineCode",{parentName:"p"},"PATCH")," is used for partial updates."),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"PATCH")," is used as the default method for updating resources because it does not require the full object for an update, but does not discourage the use of the complete object."),(0,i.kt)("h3",{id:"authentication-and-authorization"},"Authentication and authorization"),(0,i.kt)("p",null,"The API spec does not include either authentication (AuthN) nor authorization (AuthZ) of any kind. The API server MUST be secured by an reverse/auth proxy."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fd74033a.43f2e499.js b/assets/js/fd74033a.43f2e499.js new file mode 100644 index 0000000000..8a992ab456 --- /dev/null +++ b/assets/js/fd74033a.43f2e499.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[642],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>k});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},i=Object.keys(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),p=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},d=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},m="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},u=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),m=p(n),u=r,k=m["".concat(s,".").concat(u)]||m[u]||c[u]||i;return n?a.createElement(k,o(o({ref:t},d),{},{components:n})):a.createElement(k,o({ref:t},d))}));function k(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[m]="string"==typeof e?e:r,o[1]=l;for(var p=2;p<i;p++)o[p]=n[p];return a.createElement.apply(null,o)}return a.createElement.apply(null,n)}u.displayName="MDXCreateElement"},67884:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>c,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var a=n(87462),r=(n(67294),n(3905));const i={sidebar_label:"Network"},o="Network",l={unversionedId:"iaas/guides/configuration-guide/commons/network",id:"iaas/guides/configuration-guide/commons/network",title:"Network",description:"The osism.commons.network role is used for the netwok configuration.",source:"@site/docs/02-iaas/guides/configuration-guide/commons/network.md",sourceDirName:"02-iaas/guides/configuration-guide/commons",slug:"/iaas/guides/configuration-guide/commons/network",permalink:"/docs/iaas/guides/configuration-guide/commons/network",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/configuration-guide/commons/network.md",tags:[],version:"current",frontMatter:{sidebar_label:"Network"},sidebar:"docs",previous:{title:"Commons",permalink:"/docs/iaas/guides/configuration-guide/commons/"},next:{title:"Packages",permalink:"/docs/iaas/guides/configuration-guide/commons/packages"}},s={},p=[{value:"Netplan",id:"netplan",level:2},{value:"Example",id:"example",level:3},{value:"Dispatcher scripts",id:"dispatcher-scripts",level:3},{value:"Dummy interfaces",id:"dummy-interfaces",level:3},{value:"<code>/etc/interfaces</code>",id:"etcinterfaces",level:2}],d={toc:p},m="wrapper";function c(e){let{components:t,...n}=e;return(0,r.kt)(m,(0,a.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"network"},"Network"),(0,r.kt)("p",null,"The osism.commons.network role is used for the netwok configuration.\n",(0,r.kt)("a",{parentName:"p",href:"https://netplan.io"},"Netplan")," is used by default. It is also possible to use the\nold ",(0,r.kt)("inlineCode",{parentName:"p"},"/etc/interfaces")," file."),(0,r.kt)("h2",{id:"netplan"},"Netplan"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml",metastring:'title="Since OSISM 6.1.0, the default network type is a netplan and no longer needs to be set explicitly"',title:'"Since',OSISM:!0,"6.1.0,":!0,the:!0,default:!0,network:!0,type:!0,is:!0,a:!0,netplan:!0,and:!0,no:!0,longer:!0,needs:!0,to:!0,be:!0,set:!0,'explicitly"':!0},"network_type: netplan\n")),(0,r.kt)("p",null,"The configuration is written to ",(0,r.kt)("inlineCode",{parentName:"p"},"/etc/netplan/01-osism.yaml")," by default. Can be changed\nvia the ",(0,r.kt)("inlineCode",{parentName:"p"},"network_netplan_path")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"network_netplan_file")," parameters. The file permissions\nare ",(0,r.kt)("inlineCode",{parentName:"p"},"0600")," by default (cane be changed via the ",(0,r.kt)("inlineCode",{parentName:"p"},"network_netplan_permissions")," parameter).\nBy default, all other files in ",(0,r.kt)("inlineCode",{parentName:"p"},"/etc/netplan")," are removed. If you do not want this, you\ncan set ",(0,r.kt)("inlineCode",{parentName:"p"},"network_netplan_remove_unmanaged_files")," to ",(0,r.kt)("inlineCode",{parentName:"p"},"false"),". It is also possible to explicitly\nlist individual files that should not be deleted in ",(0,r.kt)("inlineCode",{parentName:"p"},"network_netplan_managed_files_extra"),"."),(0,r.kt)("p",null,"An existing ",(0,r.kt)("inlineCode",{parentName:"p"},"/etc/intefaces")," file is replaced with a placeholder file. It is not possible\nto use ",(0,r.kt)("inlineCode",{parentName:"p"},"/etc/interfaces")," and Netplan in parallel."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml",metastring:'title="This template is used as the base for the configuration"',title:'"This',template:!0,is:!0,used:!0,as:!0,the:!0,base:!0,for:!0,'configuration"':!0},"# This file describes the network interfaces available on your system\n# For more information, see netplan(5).\n---\nnetwork:\n version: {{ network_version }}\n renderer: {{ network_renderer }}\n\n bonds:\n {{ network_bonds|to_nice_yaml(indent=4)|indent(4) }}\n\n bridges:\n {{ network_bridges|to_nice_yaml(indent=4)|indent(4) }}\n\n ethernets:\n {{ network_ethernets|to_nice_yaml(indent=4)|indent(4) }}\n\n tunnels:\n {{ network_tunnels|to_nice_yaml(indent=4)|indent(4) }}\n\n vlans:\n {{ network_vlans|to_nice_yaml(indent=4)|indent(4) }}\n")),(0,r.kt)("p",null,"The parameters listed in the following table can be used in the template."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"Parameter")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"Default")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"Description")))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"network_version"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"2")),(0,r.kt)("td",{parentName:"tr",align:null},"Defines what version of the configuration format is used. The only value supported at the moment is 2.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"network_renderer"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"networkd")),(0,r.kt)("td",{parentName:"tr",align:null},"Defines what network configuration tool will be used to set up your configuration. Valid values are networkd and NetworkManager.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"network_bonds"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"{}")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://netplan.readthedocs.io/en/stable/netplan-yaml/#properties-for-device-type-bonds"},"https://netplan.readthedocs.io/en/stable/netplan-yaml/#properties-for-device-type-bonds"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"network_bridges"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"{}")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://netplan.readthedocs.io/en/stable/netplan-yaml/#properties-for-device-type-bridges"},"https://netplan.readthedocs.io/en/stable/netplan-yaml/#properties-for-device-type-bridges"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"network_ethernets"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"{}")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://netplan.readthedocs.io/en/stable/netplan-yaml/#properties-for-device-type-ethernets"},"https://netplan.readthedocs.io/en/stable/netplan-yaml/#properties-for-device-type-ethernets"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"network_tunnels"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"{}")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://netplan.readthedocs.io/en/stable/netplan-yaml/#properties-for-device-type-tunnels"},"https://netplan.readthedocs.io/en/stable/netplan-yaml/#properties-for-device-type-tunnels"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"network_vlans"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"{}")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://netplan.readthedocs.io/en/stable/netplan-yaml/#properties-for-device-type-vlans"},"https://netplan.readthedocs.io/en/stable/netplan-yaml/#properties-for-device-type-vlans"))))),(0,r.kt)("p",null,"Changes to the configuration are currently not applied utomatically. This is done on\npurpose to enable a manual check in advance. Changes to the network configuration can\nbe applied either by rebooting or by executing ",(0,r.kt)("inlineCode",{parentName:"p"},"netplan apply"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ osism console --type clush all\nEnter 'quit' to leave this interactive mode\nWorking with nodes: testbed-manager.testbed.osism.xyz,testbed-node-[0-2].testbed.osism.xyz\nclush> sudo netplan apply\n")),(0,r.kt)("h3",{id:"example"},"Example"),(0,r.kt)("p",null,"The Netplan documentation contains a large number of example configurations. The following\nexample shows the use of ",(0,r.kt)("a",{parentName:"p",href:"https://netplan.readthedocs.io/en/stable/examples/#how-to-create-vlans"},"How to create VLANs")," with the osism.commons.network role."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},'network_ethernets:\n mainif:\n match:\n macaddress: "de:ad:be:ef:ca:fe"\n set-name: mainif\n addresses: [ "10.3.0.5/23" ]\n nameservers:\n addresses: [ "8.8.8.8", "8.8.4.4" ]\n search: [ example.com ]\n routes:\n - to: default\n via: 10.3.0.1\n\nnetwork_vlans:\n vlan15:\n id: 15\n link: mainif\n addresses: [ "10.3.99.5/24" ]\n vlan10:\n id: 10\n link: mainif\n addresses: [ "10.3.98.5/24" ]\n nameservers:\n addresses: [ "127.0.0.1" ]\n search: [ domain1.example.com, domain2.example.com ]\n')),(0,r.kt)("h3",{id:"dispatcher-scripts"},"Dispatcher scripts"),(0,r.kt)("h3",{id:"dummy-interfaces"},"Dummy interfaces"),(0,r.kt)("p",null,"Dummy devices are created with the help of\n",(0,r.kt)("a",{parentName:"p",href:"https://www.freedesktop.org/software/systemd/man/latest/systemd.netdev.html"},"systemd.netdev"),"\nand can then be used as a normal netowrk device in the Netplan configuration."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},"network_dummy_interfaces:\n - dummy0\n")),(0,r.kt)("p",null,"The MTU is set to 9000 by default and can be set via ",(0,r.kt)("inlineCode",{parentName:"p"},"network_dummy_interface_mtu"),"."),(0,r.kt)("h2",{id:"etcinterfaces"},(0,r.kt)("inlineCode",{parentName:"h2"},"/etc/interfaces")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml",metastring:'title="If /etc/interfaces is to be used, the network_type must be explicitly set in environments/configuration.yml"',title:'"If',"/etc/interfaces":!0,is:!0,to:!0,be:!0,"used,":!0,the:!0,network_type:!0,must:!0,explicitly:!0,set:!0,in:!0,'environments/configuration.yml"':!0},"network_type: interfaces\n")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fd8cbe72.223d7825.js b/assets/js/fd8cbe72.223d7825.js new file mode 100644 index 0000000000..9bb570b999 --- /dev/null +++ b/assets/js/fd8cbe72.223d7825.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7165],{71594:s=>{s.exports=JSON.parse('{"title":"SCS-0110","slug":"scs-0110","permalink":"/standards/scs-0110","navigation":{"previous":{"title":"Decision Records","permalink":"/standards/decision-records"},"next":{"title":"SSD Flavors","permalink":"/standards/scs-0110-v1-ssd-flavors"}}}')}}]); \ No newline at end of file diff --git a/assets/js/fe5fac7c.8e37e6d4.js b/assets/js/fe5fac7c.8e37e6d4.js new file mode 100644 index 0000000000..7fdf757214 --- /dev/null +++ b/assets/js/fe5fac7c.8e37e6d4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2019],{3905:(e,r,t)=>{t.d(r,{Zo:()=>s,kt:()=>f});var n=t(67294);function a(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function o(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function c(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?o(Object(t),!0).forEach((function(r){a(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):o(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}function i(e,r){if(null==e)return{};var t,n,a=function(e,r){if(null==e)return{};var t,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)t=o[n],r.indexOf(t)>=0||(a[t]=e[t]);return a}(e,r);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)t=o[n],r.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var l=n.createContext({}),p=function(e){var r=n.useContext(l),t=r;return e&&(t="function"==typeof e?e(r):c(c({},r),e)),t},s=function(e){var r=p(e.components);return n.createElement(l.Provider,{value:r},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},d=n.forwardRef((function(e,r){var t=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),u=p(t),d=a,f=u["".concat(l,".").concat(d)]||u[d]||m[d]||o;return t?n.createElement(f,c(c({ref:r},s),{},{components:t})):n.createElement(f,c({ref:r},s))}));function f(e,r){var t=arguments,a=r&&r.mdxType;if("string"==typeof e||a){var o=t.length,c=new Array(o);c[0]=d;var i={};for(var l in r)hasOwnProperty.call(r,l)&&(i[l]=r[l]);i.originalType=e,i[u]="string"==typeof e?e:a,c[1]=i;for(var p=2;p<o;p++)c[p]=t[p];return n.createElement.apply(null,c)}return n.createElement.apply(null,t)}d.displayName="MDXCreateElement"},98318:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>l,contentTitle:()=>c,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var n=t(87462),a=(t(67294),t(3905));const o={},c="Hardware Requirements",i={unversionedId:"container/deployment-examples/a/hardware",id:"container/deployment-examples/a/hardware",title:"Hardware Requirements",description:"TODO",source:"@site/docs/03-container/deployment-examples/a/hardware.md",sourceDirName:"03-container/deployment-examples/a",slug:"/container/deployment-examples/a/hardware",permalink:"/docs/container/deployment-examples/a/hardware",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/03-container/deployment-examples/a/hardware.md",tags:[],version:"current",frontMatter:{}},l={},p=[],s={toc:p},u="wrapper";function m(e){let{components:r,...t}=e;return(0,a.kt)(u,(0,n.Z)({},s,t,{components:r,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"hardware-requirements"},"Hardware Requirements"),(0,a.kt)("p",null,"TODO"))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fff9aecb.216c5323.js b/assets/js/fff9aecb.216c5323.js new file mode 100644 index 0000000000..2708dfc0dc --- /dev/null +++ b/assets/js/fff9aecb.216c5323.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[547],{3905:(e,r,t)=>{t.d(r,{Zo:()=>p,kt:()=>f});var n=t(67294);function i(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function a(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function o(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?a(Object(t),!0).forEach((function(r){i(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):a(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}function s(e,r){if(null==e)return{};var t,n,i=function(e,r){if(null==e)return{};var t,n,i={},a=Object.keys(e);for(n=0;n<a.length;n++)t=a[n],r.indexOf(t)>=0||(i[t]=e[t]);return i}(e,r);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)t=a[n],r.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(i[t]=e[t])}return i}var u=n.createContext({}),d=function(e){var r=n.useContext(u),t=r;return e&&(t="function"==typeof e?e(r):o(o({},r),e)),t},p=function(e){var r=d(e.components);return n.createElement(u.Provider,{value:r},e.children)},c="mdxType",l={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},g=n.forwardRef((function(e,r){var t=e.components,i=e.mdxType,a=e.originalType,u=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),c=d(t),g=i,f=c["".concat(u,".").concat(g)]||c[g]||l[g]||a;return t?n.createElement(f,o(o({ref:r},p),{},{components:t})):n.createElement(f,o({ref:r},p))}));function f(e,r){var t=arguments,i=r&&r.mdxType;if("string"==typeof e||i){var a=t.length,o=new Array(a);o[0]=g;var s={};for(var u in r)hasOwnProperty.call(r,u)&&(s[u]=r[u]);s.originalType=e,s[c]="string"==typeof e?e:i,o[1]=s;for(var d=2;d<a;d++)o[d]=t[d];return n.createElement.apply(null,o)}return n.createElement.apply(null,t)}g.displayName="MDXCreateElement"},88242:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>u,contentTitle:()=>o,default:()=>l,frontMatter:()=>a,metadata:()=>s,toc:()=>d});var n=t(87462),i=(t(67294),t(3905));const a={sidebar_label:"Upgrade Guide",sidebar_position:20},o="Upgrade Guide",s={unversionedId:"iaas/guides/upgrade-guide/index",id:"iaas/guides/upgrade-guide/index",title:"Upgrade Guide",description:"In the examples, the pull of images (if supported by a role) is always run first. While",source:"@site/docs/02-iaas/guides/upgrade-guide/index.md",sourceDirName:"02-iaas/guides/upgrade-guide",slug:"/iaas/guides/upgrade-guide/",permalink:"/docs/iaas/guides/upgrade-guide/",draft:!1,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/docs/02-iaas/guides/upgrade-guide/index.md",tags:[],version:"current",sidebarPosition:20,frontMatter:{sidebar_label:"Upgrade Guide",sidebar_position:20},sidebar:"docs",previous:{title:"Testbed",permalink:"/docs/iaas/guides/deploy-guide/examples/testbed"},next:{title:"Manager",permalink:"/docs/iaas/guides/upgrade-guide/manager"}},u={},d=[],p={toc:d},c="wrapper";function l(e){let{components:r,...t}=e;return(0,i.kt)(c,(0,n.Z)({},p,t,{components:r,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"upgrade-guide"},"Upgrade Guide"),(0,i.kt)("p",null,"In the examples, the pull of images (if supported by a role) is always run first. While\nthis is optional, it is recommended to speed up the execution of the upgrade action in\nthe second step. This significantly reduces the times required for the restart from a\nservice."))}l.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/main.9d213e76.js b/assets/js/main.9d213e76.js new file mode 100644 index 0000000000..6dc3fa366d --- /dev/null +++ b/assets/js/main.9d213e76.js @@ -0,0 +1,2 @@ +/*! For license information please see main.9d213e76.js.LICENSE.txt */ +(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[179],{723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var a=n(67294),r=n(87462),o=n(68356),s=n.n(o),i=n(16887);const c={"0047ab5d":[()=>n.e(5012).then(n.bind(n,7072)),"@site/docs/02-iaas/guides/configuration-guide/services/index.md",7072],"01a85c17":[()=>Promise.all([n.e(532),n.e(4013)]).then(n.bind(n,91223)),"@theme/BlogTagsListPage",91223],"03c8668f":[()=>n.e(8275).then(n.bind(n,1780)),"@site/standards/ops/scs-0412.md",1780],"04fe2bfd":[()=>n.e(2527).then(n.bind(n,60539)),"@site/blog/2022-10-28-first-blog-post.md?truncated=true",60539],"059c4264":[()=>n.e(2491).then(n.t.bind(n,98656,19)),"~docs/default/category-docs-docs-category-status-page-api-7a3.json",98656],"05e7973d":[()=>n.e(3299).then(n.bind(n,42557)),"@site/docs/02-iaas/guides/configuration-guide/commons/sshconfig.md",42557],"061d8128":[()=>n.e(713).then(n.bind(n,40132)),"@site/standards/scs-0100-v3-flavor-naming.md",40132],"0683500c":[()=>n.e(1294).then(n.bind(n,38852)),"@site/docs/03-container/components/k8s-cluster-api-provider/doc/application-credentials.md",38852],"070e71f0":[()=>n.e(6303).then(n.bind(n,95857)),"@site/docs/02-iaas/guides/upgrade-guide/ceph.md",95857],"07d3bac7":[()=>n.e(8581).then(n.bind(n,45244)),"@site/standards/scs-0211-v1-kaas-default-storage-class.md",45244],"082859ca":[()=>n.e(1907).then(n.bind(n,97358)),"@site/docs/02-iaas/guides/operations-guide/openstack/day2-operations/sandbox-manager.md",97358],"0860b861":[()=>n.e(5646).then(n.t.bind(n,72011,19)),"~docs/standards/category-standards-standards-category-scs-0301-581.json",72011],"08bf2ad2":[()=>n.e(2711).then(n.bind(n,26678)),"@site/docs/02-iaas/guides/operations-guide/openstack/day2-operations/index.md",26678],"096c51c8":[()=>n.e(1266).then(n.bind(n,29770)),"@site/community/contribute/linting-guide.md",29770],"09adb968":[()=>n.e(3946).then(n.bind(n,91246)),"@site/docs/04-operating-scs/03-incident-management/index.md",91246],"09ba26e2":[()=>n.e(5880).then(n.bind(n,69099)),"@site/docs/02-iaas/guides/deploy-guide/index.md",69099],"09cf625e":[()=>n.e(1756).then(n.bind(n,36453)),"@site/docs/04-operating-scs/overview.md",36453],"0a757274":[()=>n.e(297).then(n.bind(n,90043)),"@site/docs/02-iaas/overview/knowledge.md",90043],"0bcc5672":[()=>n.e(6892).then(n.bind(n,54932)),"@site/docs/03-container/deployment-examples/a/software.md",54932],"0dfeccb2":[()=>n.e(5923).then(n.bind(n,39923)),"@site/standards/scs-0410-v1-gnocchi-as-metering-database.md",39923],"0ea173ba":[()=>n.e(5258).then(n.bind(n,88941)),"@site/standards/certification/overview.md",88941],"1109f10b":[()=>n.e(7472).then(n.bind(n,28339)),"@site/standards/scs-0110-v1-ssd-flavors.md",28339],"1276f6ab":[()=>n.e(6846).then(n.bind(n,52816)),"@site/standards/scs-0411-v1-publishing_method_for_metering_data.md",52816],"14c1041d":[()=>n.e(4477).then(n.t.bind(n,44182,19)),"~blog/default/blog-tags-howto-248-list.json",44182],"14eb3368":[()=>Promise.all([n.e(532),n.e(9817)]).then(n.bind(n,34228)),"@theme/DocCategoryGeneratedIndexPage",34228],15336817:[()=>n.e(3826).then(n.bind(n,16640)),"@site/docs/03-container/components/k8s-cluster-api-provider/doc/quickstart.md",16640],"15e4a743":[()=>n.e(7477).then(n.bind(n,46377)),"@site/docs/04-operating-scs/02-monitoring/index.md",46377],"16aafd28":[()=>n.e(9477).then(n.t.bind(n,87650,19)),"~docs/standards/category-standards-standards-category-scs-0212-2de.json",87650],"1722e234":[()=>n.e(3197).then(n.bind(n,70983)),"@site/community/cloud-resources/cloud-resources.md",70983],17896441:[()=>Promise.all([n.e(532),n.e(8954),n.e(7918)]).then(n.bind(n,15154)),"@theme/DocItem",15154],"178df98e":[()=>n.e(5889).then(n.bind(n,8205)),"@site/standards/ops/index.md",8205],"183af61f":[()=>n.e(739).then(n.bind(n,6186)),"@site/community/communication/jitsi.md",6186],"184e5ead":[()=>n.e(4165).then(n.bind(n,49932)),"@site/standards/iaas/scs-0102.md",49932],"19afbcc8":[()=>n.e(7039).then(n.bind(n,640)),"@site/docs/01-getting-started/overview.md",640],"1a4e3797":[()=>Promise.all([n.e(532),n.e(7920)]).then(n.bind(n,51473)),"@theme/SearchPage",51473],"1bc22123":[()=>n.e(7190).then(n.bind(n,7652)),"@site/docs/06-releases/ReleaseX.md",7652],"1be78505":[()=>Promise.all([n.e(532),n.e(9514)]).then(n.bind(n,19963)),"@theme/DocPage",19963],"1c091541":[()=>n.e(8271).then(n.t.bind(n,24469,19)),"/home/runner/work/docs/docs/.docusaurus/docusaurus-plugin-content-blog/default/plugin-route-context-module-100.json",24469],"1c894279":[()=>n.e(6336).then(n.bind(n,53801)),"@site/standards/scs-0001-v1-sovereign-cloud-standards.md",53801],"1df93b7f":[()=>Promise.all([n.e(532),n.e(3237)]).then(n.bind(n,83874)),"@site/src/pages/index.tsx",83874],"1f1274a0":[()=>n.e(3454).then(n.bind(n,33219)),"@site/docs/02-iaas/guides/deploy-guide/services/ceph.md",33219],"1f34ee25":[()=>n.e(8049).then(n.bind(n,7743)),"@site/community/cloud-resources/wavestack.md",7743],"2163574d":[()=>n.e(3907).then(n.t.bind(n,83295,19)),"~docs/default/category-docs-docs-category-components-2-d21.json",83295],"23cd166f":[()=>n.e(6490).then(n.bind(n,29095)),"@site/docs/03-container/components/k8s-cluster-api-provider/doc/usage/create-new-cluster.md",29095],"23e62f09":[()=>n.e(8428).then(n.bind(n,20445)),"@site/standards/iam/scs-0300.md",20445],"247783bb":[()=>n.e(9334).then(n.t.bind(n,83769,19)),"/home/runner/work/docs/docs/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",83769],"24fca748":[()=>n.e(788).then(n.bind(n,14395)),"@site/dev-docs/operations/iam/identity-federation-in-scs.md",14395],"26bc5a46":[()=>n.e(9478).then(n.bind(n,10010)),"@site/docs/02-iaas/guides/upgrade-guide/docker.md",10010],"26dd306b":[()=>n.e(6055).then(n.bind(n,75611)),"@site/docs/02-iaas/guides/other-guides/index.md",75611],"27f24dfd":[()=>n.e(3298).then(n.bind(n,18879)),"@site/standards/scs-0214-v1-k8s-node-distribution.md",18879],29331985:[()=>n.e(1653).then(n.t.bind(n,23523,19)),"~docs/default/category-docs-docs-category-iaas-layer-373.json",23523],"29c2cfba":[()=>n.e(8604).then(n.bind(n,15036)),"@site/community/contribute/doc-files-structure-guide.md",15036],"2c42a58f":[()=>n.e(5183).then(n.bind(n,2608)),"@site/community/github/tips-and-tricks.md",2608],"301607a5":[()=>n.e(116).then(n.bind(n,12495)),"@site/community/communication/matrix.md",12495],"306a8c6c":[()=>n.e(7616).then(n.t.bind(n,59479,19)),"~docs/community/version-current-metadata-prop-751.json",59479],"32227eef":[()=>n.e(5938).then(n.bind(n,82911)),"@site/standards/scs-0003-v1-sovereign-cloud-standards-yaml.md",82911],"343a1afc":[()=>n.e(7103).then(n.bind(n,12342)),"@site/docs/04-operating-scs/06-logging/index.md",12342],"35fbae7a":[()=>n.e(2656).then(n.bind(n,17837)),"@site/community/cloud-resources/plusserver-gx-scs.md",17837],"36f749d2":[()=>n.e(5980).then(n.bind(n,29789)),"@site/docs/04-operating-scs/04-audits/index.md",29789],"38b583d2":[()=>n.e(9719).then(n.bind(n,28819)),"@site/docs/03-container/components/k8s-cluster-api-provider/doc/Upgrade-Guide.md",28819],"38c9ef35":[()=>n.e(8505).then(n.bind(n,66456)),"@site/standards/global/index.md",66456],"39eb4dc7":[()=>n.e(2990).then(n.bind(n,1259)),"@site/community/github/dco-and-licenses.md",1259],"3a00f46c":[()=>n.e(6876).then(n.bind(n,6764)),"@site/docs/02-iaas/guides/other-guides/zuul.md",6764],"3bf9fbe6":[()=>n.e(9899).then(n.t.bind(n,18715,19)),"~docs/default/category-docs-docs-category-releases-ec0.json",18715],"3d19221e":[()=>n.e(7856).then(n.bind(n,29518)),"@site/docs/02-iaas/guides/configuration-guide/commons/index.md",29518],"3e493f26":[()=>n.e(1757).then(n.bind(n,91742)),"@site/docs/02-iaas/overview/network.md",91742],"3f3928dc":[()=>n.e(9003).then(n.bind(n,39600)),"@site/standards/iaas/index.md",39600],"3ff13a62":[()=>n.e(5869).then(n.bind(n,92675)),"@site/docs/03-container/index.md",92675],"40d9468c":[()=>n.e(8116).then(n.bind(n,7438)),"@site/docs/02-iaas/guides/other-guides/developer-guide/index.md",7438],"4129286c":[()=>n.e(5156).then(n.t.bind(n,12776,19)),"/home/runner/work/docs/docs/.docusaurus/@easyops-cn/docusaurus-search-local/default/plugin-route-context-module-100.json",12776],"41ab9761":[()=>n.e(5777).then(n.bind(n,21921)),"@site/docs/04-operating-scs/07-metering/meter_configuration.md",21921],"42088e64":[()=>n.e(6861).then(n.bind(n,51409)),"@site/docs/03-container/components/k8s-cluster-api-provider/doc/usage/multi-az-and-multi-cloud-environments.md",51409],"421b5e65":[()=>n.e(5482).then(n.bind(n,30721)),"@site/docs/03-container/components/k8s-cluster-api-provider/doc/LoadBalancer-ExtTrafficLocal.md",30721],"422fff4b":[()=>n.e(8934).then(n.bind(n,79973)),"@site/standards/kaas/scs-0210.md",79973],"431e6cfe":[()=>n.e(2085).then(n.bind(n,7215)),"@site/docs/03-container/components/k8s-cluster-api-provider/doc/continuous-integration.md",7215],"437bedbc":[()=>n.e(7046).then(n.bind(n,73642)),"@site/docs/06-releases/Release4.md",73642],"441ae8e9":[()=>n.e(200).then(n.bind(n,98298)),"@site/docs/03-container/components/k8s-cluster-api-provider/doc/Maintenance_and_Troubleshooting.md",98298],"4468ebd1":[()=>n.e(2936).then(n.bind(n,89148)),"@site/blog/2022-10-28-first-blog-post.md",89148],"45f4377b":[()=>n.e(3959).then(n.bind(n,93486)),"@site/docs/02-iaas/guides/deploy-guide/seed.md",93486],"477ed06d":[()=>n.e(1775).then(n.bind(n,8505)),"@site/standards/iaas/scs-0101.md",8505],"495e0345":[()=>n.e(6309).then(n.t.bind(n,3013,19)),"~docs/standards/category-standards-standards-category-scs-0410-ce8.json",3013],49993131:[()=>n.e(7060).then(n.bind(n,51982)),"@site/docs/02-iaas/guides/other-guides/developer-guide/releases.md",51982],"49bc3785":[()=>n.e(9810).then(n.bind(n,32648)),"@site/community/hackathons/checklist.md",32648],"4b015924":[()=>n.e(4476).then(n.bind(n,96315)),"@site/docs/02-iaas/guides/deploy-guide/services/network.md",96315],"4e6fa974":[()=>n.e(342).then(n.bind(n,51440)),"@site/standards/scs-0302-v1-domain-manager-role.md",51440],"502adbf6":[()=>n.e(5912).then(n.bind(n,32262)),"@site/docs/02-iaas/guides/index.md",32262],50963409:[()=>n.e(4338).then(n.bind(n,32296)),"@site/docs/03-container/components/k8s-cluster-api-provider/doc/usage/testing.md",32296],"5268a994":[()=>n.e(4250).then(n.bind(n,46151)),"@site/dev-docs/index.md",46151],"526992cf":[()=>n.e(2821).then(n.bind(n,45472)),"@site/standards/scs-0103-v1-standard-flavors.md",45472],"52e3f5ca":[()=>n.e(3852).then(n.t.bind(n,52193,19)),"~docs/standards/version-current-metadata-prop-751.json",52193],53596370:[()=>n.e(867).then(n.bind(n,58319)),"@site/docs/04-operating-scs/components/status-page/docs/levels_of_consensus.md",58319],"5565c8ed":[()=>n.e(8106).then(n.bind(n,84241)),"@site/docs/02-iaas/guides/deploy-guide/examples/cloud-in-a-box.md",84241],"564eabfd":[()=>n.e(9468).then(n.bind(n,10181)),"@site/docs/03-container/components/k8s-cluster-api-provider/doc/usage/harbor.md",10181],"5830dd0a":[()=>n.e(8679).then(n.bind(n,68218)),"@site/standards/standards/overview.md",68218],"589280f5":[()=>n.e(1006).then(n.bind(n,21748)),"@site/docs/02-iaas/guides/deploy-guide/services/infrastructure.md",21748],59307471:[()=>n.e(9896).then(n.bind(n,55463)),"@site/standards/kaas/scs-0211.md",55463],"5ad6acbd":[()=>n.e(1156).then(n.t.bind(n,69128,19)),"~docs/standards/category-standards-standards-category-decision-records-b6d.json",69128],"5b235e06":[()=>n.e(972).then(n.bind(n,46666)),"@site/docs/02-iaas/guides/other-guides/contributor-guide.md",46666],"5b402526":[()=>n.e(1548).then(n.bind(n,68456)),"@site/standards/scs-0002-v1-standards-docs-org.md",68456],"5b9bf978":[()=>n.e(2114).then(n.bind(n,40393)),"@site/docs/02-iaas/guides/configuration-guide/self-signed-certificates.md",40393],"5bd7bc3b":[()=>n.e(1770).then(n.bind(n,23700)),"@site/docs/02-iaas/guides/operations-guide/index.md",23700],"5c201b0a":[()=>n.e(1893).then(n.bind(n,77734)),"@site/docs/06-releases/Release3.md",77734],"5d54de92":[()=>n.e(1505).then(n.bind(n,20017)),"@site/docs/02-iaas/guides/operations-guide/ceph.md",20017],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,36809)),"@generated/docusaurus.config",36809],"60fc342f":[()=>n.e(4561).then(n.bind(n,90195)),"@site/docs/02-iaas/guides/configuration-guide/commons/packages.md",90195],"61ce23c3":[()=>n.e(1302).then(n.bind(n,98346)),"@site/dev-docs/operations/operations/zuul-ci-cd-quickstart-user-guide.md",98346],"63c8fde6":[()=>n.e(6264).then(n.bind(n,61104)),"@site/standards/scs-0101-v1-entropy.md",61104],"644d3432":[()=>n.e(7859).then(n.t.bind(n,15018,19)),"/home/runner/work/docs/docs/.docusaurus/docusaurus-plugin-content-docs/dev-docs/plugin-route-context-module-100.json",15018],"653904f7":[()=>n.e(4342).then(n.bind(n,46285)),"@site/docs/03-container/components/k8s-cluster-api-provider/doc/usage/custom-ca.md",46285],"65c90e53":[()=>n.e(6730).then(n.t.bind(n,40975,19)),"~docs/default/category-docs-docs-category-components-1-953.json",40975],"670b12e1":[()=>n.e(7836).then(n.bind(n,53551)),"@site/docs/02-iaas/guides/operations-guide/manager/console.md",53551],"67dad519":[()=>n.e(3976).then(n.bind(n,22517)),"@site/docs/02-iaas/guides/deploy-guide/provisioning.md",22517],"684abe8e":[()=>n.e(9729).then(n.bind(n,75269)),"@site/docs/02-iaas/guides/operations-guide/openstack/day2-operations/resource-manager.md",75269],"685813dc":[()=>n.e(3006).then(n.bind(n,99941)),"@site/docs/02-iaas/components/resource-manager.md",99941],"6875c492":[()=>Promise.all([n.e(532),n.e(8954),n.e(6048),n.e(8610)]).then(n.bind(n,41714)),"@theme/BlogTagsPostsPage",41714],"699c0e5c":[()=>n.e(5101).then(n.bind(n,33475)),"@site/standards/scs-0111-v1-volume-type-decisions.md",33475],"69b09ea9":[()=>n.e(498).then(n.t.bind(n,22332,19)),"~blog/default/blog-tags-community-d90.json",22332],"6a15e24c":[()=>n.e(9658).then(n.bind(n,94574)),"@site/dev-docs/operations/iam/openstack-federation-via-oidc.md",94574],"6ad9ab45":[()=>n.e(8235).then(n.bind(n,93016)),"@site/standards/iaas/scs-0103.md",93016],"6c33bb99":[()=>n.e(4981).then(n.bind(n,36777)),"@site/docs/02-iaas/guides/configuration-guide/ceph.md",36777],"6c4198a1":[()=>n.e(6686).then(n.bind(n,24772)),"@site/docs/02-iaas/guides/deploy-guide/bootstrap.md",24772],"6d32cafb":[()=>n.e(8848).then(n.bind(n,6366)),"@site/docs/02-iaas/guides/upgrade-guide/openstack.md",6366],"6d890b23":[()=>n.e(4573).then(n.bind(n,74389)),"@site/docs/02-iaas/guides/operations-guide/manager/task.md",74389],"6db2ece2":[()=>n.e(6990).then(n.bind(n,83425)),"@site/docs/02-iaas/guides/configuration-guide/inventory.md",83425],"6e35e719":[()=>n.e(2286).then(n.t.bind(n,93968,19)),"~docs/standards/category-standards-standards-category-scs-0402-ffd.json",93968],"6e7e1a19":[()=>n.e(3200).then(n.bind(n,78083)),"@site/docs/02-iaas/guides/other-guides/developer-guide/zuul-ci.md",78083],"6f1c571c":[()=>n.e(87).then(n.bind(n,2285)),"@site/docs/02-iaas/guides/deploy-guide/examples/index.md",2285],"6f4a06ca":[()=>n.e(4081).then(n.bind(n,75650)),"@site/docs/02-iaas/guides/deploy-guide/manager.md",75650],73956345:[()=>n.e(987).then(n.bind(n,51496)),"@site/docs/02-iaas/overview/compute.md",51496],"739c0ae8":[()=>n.e(4819).then(n.bind(n,54887)),"@site/docs/03-container/components/k8s-cluster-api-provider/doc/usage/gateway-api.md",54887],"767805d3":[()=>n.e(9668).then(n.bind(n,72982)),"@site/docs/02-iaas/guides/configuration-guide/configuration-repository.md",72982],"7aa2de41":[()=>n.e(5028).then(n.bind(n,37248)),"@site/docs/02-iaas/guides/operations-guide/openstack/day2-operations/project-manager.md",37248],"7b449e09":[()=>n.e(4665).then(n.bind(n,90991)),"@site/standards/scs-0002-v2-standards-docs-org.md",90991],"7b787d81":[()=>n.e(6860).then(n.bind(n,88009)),"@site/docs/06-releases/Release0.md",88009],"7bd33c3d":[()=>n.e(1498).then(n.bind(n,68012)),"@site/community/cloud-resources/getting-started-openstack.md",68012],"7e793606":[()=>n.e(4898).then(n.bind(n,1605)),"@site/standards/certification/subjects-versions.md",1605],"7e7cf0e4":[()=>n.e(401).then(n.bind(n,62106)),"@site/standards/global/scs-0003.md",62106],"7f1a31c3":[()=>n.e(9818).then(n.bind(n,15024)),"@site/docs/06-releases/Release2.md",15024],"7f34127d":[()=>n.e(9693).then(n.bind(n,49904)),"@site/docs/02-iaas/guides/configuration-guide/manager.md",49904],"814f3328":[()=>n.e(2535).then(n.t.bind(n,45641,19)),"~blog/default/blog-post-list-prop-default.json",45641],83100446:[()=>n.e(4945).then(n.bind(n,56605)),"@site/docs/03-container/deployment-examples/a/index.md",56605],"86ee3414":[()=>n.e(8809).then(n.bind(n,59022)),"@site/docs/02-iaas/components/index.md",59022],"88684b71":[()=>n.e(6152).then(n.bind(n,19505)),"@site/docs/02-iaas/components/flavor-manager.md",19505],"88f37d1b":[()=>n.e(4233).then(n.bind(n,18671)),"@site/docs/05-iam/intra-SCS-federation-setup-description-for-osism-doc-operations.md",18671],"89176cae":[()=>n.e(3282).then(n.bind(n,97431)),"@site/docs/07-standards/index.md",97431],"89ad43f4":[()=>n.e(5516).then(n.bind(n,96946)),"@site/docs/02-iaas/guides/deploy-guide/services/index.md",96946],"8a671cf8":[()=>n.e(4337).then(n.bind(n,25666)),"@site/docs/03-container/components/k8s-cluster-api-provider/doc/usage/cluster-mgmt-capi-mgmt-node.md",25666],"8aa3e7cc":[()=>n.e(3750).then(n.t.bind(n,86994,19)),"~docs/community/category-community-community-category-contribute-848.json",86994],"8ba37aa2":[()=>n.e(8994).then(n.bind(n,78301)),"@site/docs/03-container/components/k8s-cluster-api-provider/doc/roadmap.md",78301],"8fc094a7":[()=>n.e(3286).then(n.bind(n,9591)),"@site/docs/02-iaas/guides/operations-guide/manager/index.md",9591],"9278f3d6":[()=>n.e(3478).then(n.bind(n,96861)),"@site/standards/scs-0213-v1-k8s-nodes-anti-affinity.md",96861],"929c4e1b":[()=>n.e(5988).then(n.bind(n,71964)),"@site/standards/index.md",71964],"931040e8":[()=>n.e(8888).then(n.bind(n,12051)),"@site/community/contribute/styleguide.md",12051],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"94f31572":[()=>n.e(3722).then(n.bind(n,43400)),"@site/docs/08-faq/index.mdx",43400],"95d93785":[()=>n.e(1481).then(n.bind(n,87477)),"@site/docs/03-container/components/k8s-cluster-api-provider/doc/requirements.md",87477],"95fe5f6c":[()=>n.e(8086).then(n.bind(n,47327)),"@site/docs/03-container/components/k8s-cluster-api-provider/doc/usage/usage.md",47327],"96f8fd49":[()=>n.e(2966).then(n.bind(n,35304)),"@site/docs/02-iaas/guides/operations-guide/manager/log.md",35304],"97b1504a":[()=>n.e(2443).then(n.bind(n,36616)),"@site/standards/iaas/scs-0104.md",36616],"98f69cae":[()=>n.e(5645).then(n.t.bind(n,5414,19)),"~docs/standards/category-standards-standards-category-scs-0411-13e.json",5414],"99b53e63":[()=>n.e(9742).then(n.bind(n,77065)),"@site/docs/04-operating-scs/components/status-page/docs/components.md",77065],"9d1324c7":[()=>n.e(4855).then(n.bind(n,67676)),"@site/standards/scs-0100-v1-flavor-naming.md",67676],"9d187656":[()=>n.e(5942).then(n.bind(n,61966)),"@site/docs/04-operating-scs/components/status-page/docs/overview.md",61966],"9e10b8d6":[()=>n.e(8645).then(n.bind(n,46458)),"@site/docs/04-operating-scs/01-guides/guide-1.md",46458],"9e4087bc":[()=>n.e(3608).then(n.bind(n,63169)),"@theme/BlogArchivePage",63169],"9f356e5b":[()=>n.e(9279).then(n.bind(n,37951)),"@site/docs/02-iaas/overview/architecture.md",37951],"9fb1f91e":[()=>n.e(2602).then(n.t.bind(n,35022,19)),"~docs/default/category-docs-docs-category-k-8-s-cluster-api-provider-7d5.json",35022],a0b1bbd7:[()=>n.e(9398).then(n.bind(n,53179)),"@site/docs/06-releases/Release5.md",53179],a0eeb362:[()=>n.e(984).then(n.bind(n,74990)),"@site/community/collaboration.md",74990],a12a2e44:[()=>n.e(4050).then(n.bind(n,16273)),"@site/standards/scs-0213-v1-requirements-for-testing-cluster-stacks.md",16273],a12f05ab:[()=>n.e(6412).then(n.bind(n,50988)),"@site/docs/02-iaas/guides/operations-guide/openstack/cinder.md",50988],a15c4cb6:[()=>n.e(8872).then(n.bind(n,27896)),"@site/standards/scs-0412-v1-metering-json.md",27896],a38b6a75:[()=>n.e(1114).then(n.bind(n,24715)),"@site/docs/03-container/components/k8s-cluster-api-provider/doc/make-reference.md",24715],a3e11933:[()=>n.e(9327).then(n.bind(n,83848)),"@site/docs/06-releases/Release1.md",83848],a4833b52:[()=>n.e(8503).then(n.bind(n,64024)),"@site/standards/scs-0104-v1-standard-images.md",64024],a51c5cdb:[()=>n.e(6002).then(n.bind(n,26346)),"@site/docs/03-container/components/k8s-cluster-api-provider/doc/configuration.md",26346],a51f78bf:[()=>n.e(2447).then(n.bind(n,92883)),"@site/docs/02-iaas/guides/configuration-guide/commons/timezone.md",92883],a58a5045:[()=>n.e(4504).then(n.t.bind(n,9273,19)),"~docs/standards/category-standards-standards-category-scs-0401-7db.json",9273],a6aa9e1f:[()=>Promise.all([n.e(532),n.e(8954),n.e(6048),n.e(3089)]).then(n.bind(n,80046)),"@theme/BlogListPage",80046],a7023ddc:[()=>n.e(1713).then(n.t.bind(n,53457,19)),"~blog/default/blog-tags-tags-4c2.json",53457],a708848c:[()=>n.e(4938).then(n.bind(n,38231)),"@site/docs/02-iaas/components/project-manager.md",38231],a70dabb3:[()=>n.e(3178).then(n.bind(n,23614)),"@site/standards/global/scs-0002.md",23614],a71bcd95:[()=>n.e(3518).then(n.bind(n,33069)),"@site/standards/scs-0212-v1-requirements-for-container-registry.md",33069],a7434565:[()=>n.e(7645).then(n.t.bind(n,15745,19)),"/home/runner/work/docs/docs/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",15745],a8ea16f4:[()=>n.e(953).then(n.bind(n,96379)),"@site/docs/03-container/components/k8s-cluster-api-provider/doc/overview.md",96379],a8f67d60:[()=>n.e(2517).then(n.bind(n,18899)),"@site/community/contribute/adding-docs-guide.md",18899],a94c36cd:[()=>n.e(3271).then(n.bind(n,15004)),"@site/docs/03-container/overview/architecture.md",15004],a9f40339:[()=>n.e(261).then(n.bind(n,93905)),"@site/docs/04-operating-scs/05-lifecycle-management/index.md",93905],aa0979a6:[()=>Promise.all([n.e(532),n.e(904),n.e(2661)]).then(n.bind(n,37649)),"@site/community/calendar.mdx",37649],aaad657b:[()=>n.e(2122).then(n.bind(n,65646)),"@site/community/communication/mailinglists.md",65646],abb47370:[()=>n.e(8752).then(n.bind(n,50263)),"@site/standards/iam/index.md",50263],abecca15:[()=>n.e(3778).then(n.bind(n,40406)),"@site/docs/02-iaas/guides/deploy-guide/services/logging-monitoring.md",40406],abfb0638:[()=>n.e(4726).then(n.bind(n,59906)),"@site/docs/02-iaas/guides/operations-guide/manager/apply.md",59906],ac087500:[()=>n.e(9564).then(n.bind(n,2461)),"@site/docs/02-iaas/guides/troubleshooting-guide/index.md",2461],ad39e84b:[()=>n.e(7105).then(n.bind(n,16810)),"@site/standards/scs-0102-v1-image-metadata.md",16810],afaff11a:[()=>n.e(2878).then(n.t.bind(n,96271,19)),"~blog/default/blog-tags-community-d90-list.json",96271],b08c16de:[()=>n.e(531).then(n.bind(n,89233)),"@site/community/contribute/styleguides/ansible_styleguide.md",89233],b12ed0df:[()=>n.e(5729).then(n.t.bind(n,29670,19)),"/home/runner/work/docs/docs/.docusaurus/docusaurus-plugin-content-docs/standards/plugin-route-context-module-100.json",29670],b2b675dd:[()=>n.e(533).then(n.t.bind(n,28017,19)),"~blog/default/blog-c06.json",28017],b2f554cd:[()=>n.e(1477).then(n.t.bind(n,30010,19)),"~blog/default/blog-archive-80c.json",30010],b840bdcc:[()=>n.e(7334).then(n.t.bind(n,20744,19)),"~docs/default/category-docs-docs-category-metering-737.json",20744],b8fd74b5:[()=>n.e(8211).then(n.bind(n,86902)),"@site/docs/02-iaas/components/sandbox-manager.md",86902],bd319452:[()=>n.e(1849).then(n.bind(n,17680)),"@site/docs/02-iaas/guides/deploy-guide/examples/testbed.md",17680],bd8a97c5:[()=>n.e(2909).then(n.bind(n,85245)),"@site/docs/02-iaas/guides/configuration-guide/proxy.md",85245],be01f2a0:[()=>n.e(6926).then(n.bind(n,21801)),"@site/docs/02-iaas/guides/configuration-guide/openstack/keystone.md",21801],be96733a:[()=>n.e(6271).then(n.bind(n,20700)),"@site/docs/02-iaas/guides/operations-guide/openstack/day2-operations/flavor-manager.md",20700],c0cd111c:[()=>n.e(4234).then(n.bind(n,40139)),"@site/docs/02-iaas/overview/storage.md",40139],c2f44c5f:[()=>n.e(7762).then(n.bind(n,47085)),"@site/docs/02-iaas/guides/troubleshooting-guide/openstack.md",47085],c377a04b:[()=>n.e(6971).then(n.bind(n,21269)),"@site/docs/index.md",21269],c490e74d:[()=>n.e(1265).then(n.t.bind(n,34457,19)),"~docs/standards/category-standards-standards-category-scs-0400-c90.json",34457],c5533f5e:[()=>n.e(969).then(n.bind(n,58935)),"@site/standards/scs-0210-v1-k8s-new-version-policy.md",58935],c75320ff:[()=>n.e(2272).then(n.bind(n,55345)),"@site/docs/02-iaas/guides/upgrade-guide/logging-monitoring.md",55345],ccc49370:[()=>Promise.all([n.e(532),n.e(8954),n.e(6048),n.e(6103)]).then(n.bind(n,65203)),"@theme/BlogPostPage",65203],cd0ad4f0:[()=>n.e(4166).then(n.bind(n,67532)),"@site/docs/01-getting-started/containerization.md",67532],cd4fb20e:[()=>n.e(4245).then(n.bind(n,78872)),"@site/standards/scs-0100-v2-flavor-naming.md",78872],ce756c16:[()=>n.e(8681).then(n.bind(n,83418)),"@site/community/license-considerations.md",83418],cf2bf9cf:[()=>n.e(1085).then(n.bind(n,49395)),"@site/docs/02-iaas/guides/operations-guide/openstack/day2-operations/image-manager.md",49395],cffc493c:[()=>n.e(4687).then(n.bind(n,22073)),"@site/community/contribute/docs-workflow-explanation.md",22073],d078bc1c:[()=>n.e(7170).then(n.t.bind(n,19572,19)),"~docs/dev-docs/version-current-metadata-prop-751.json",19572],d0ee365b:[()=>n.e(4227).then(n.bind(n,17296)),"@site/docs/02-iaas/guides/configuration-guide/openstack/index.md",17296],d1aa920e:[()=>n.e(6470).then(n.bind(n,66625)),"@site/docs/02-iaas/guides/operations-guide/openstack/index.md",66625],d227faa6:[()=>n.e(3973).then(n.bind(n,27159)),"@site/community/github/branchprotection.md",27159],d5256f0a:[()=>n.e(570).then(n.bind(n,54335)),"@site/docs/02-iaas/guides/upgrade-guide/manager.md",54335],d59f7d52:[()=>n.e(7701).then(n.bind(n,20613)),"@site/standards/scs-0301-v1-naming-conventions.md",20613],d5ac8ed7:[()=>n.e(4521).then(n.t.bind(n,34886,19)),"~blog/default/blog-tags-howto-248.json",34886],d6a104fd:[()=>n.e(2144).then(n.bind(n,84995)),"@site/docs/03-container/components/k8s-cluster-api-provider/doc/usage/containter-registry-configuration.md",84995],d755aabc:[()=>n.e(2199).then(n.t.bind(n,42318,19)),"~docs/standards/category-standards-standards-category-scs-0213-b18.json",42318],d770ad8d:[()=>n.e(3438).then(n.bind(n,89535)),"@site/docs/03-container/components/k8s-cluster-api-provider/doc/usage/migrate-to-cluster-class.md",89535],da1a5473:[()=>n.e(5598).then(n.bind(n,18817)),"@site/docs/02-iaas/guides/other-guides/developer-guide/scripts.md",18817],da20a34d:[()=>n.e(6995).then(n.bind(n,20582)),"@site/docs/02-iaas/components/image-manager.md",20582],dbde4c02:[()=>n.e(4466).then(n.bind(n,30767)),"@site/docs/02-iaas/guides/upgrade-guide/infrastructure.md",30767],dcf2f717:[()=>n.e(7214).then(n.bind(n,94847)),"@site/docs/03-container/guides/guide1.md",94847],ddebfa81:[()=>n.e(5038).then(n.bind(n,63660)),"@site/standards/certification/get-certified.md",63660],de0540ff:[()=>n.e(2690).then(n.t.bind(n,15047,19)),"~docs/default/category-docs-docs-category-identity-and-access-management-iam-0c6.json",15047],df35cf96:[()=>n.e(5830).then(n.bind(n,78387)),"@site/docs/02-iaas/guides/configuration-guide/commons/services.md",78387],dfce392e:[()=>n.e(3414).then(n.bind(n,51660)),"@site/standards/scs-0401-v1-status-page-reference-implementation-decision.md",51660],dfe27b1e:[()=>n.e(503).then(n.bind(n,96828)),"@site/docs/03-container/components/k8s-cluster-api-provider/doc/usage/managing-many-clusters.md",96828],e24c1f8d:[()=>n.e(3836).then(n.bind(n,61981)),"@site/docs/02-iaas/guides/configuration-guide/commons/sysctl.md",61981],e44168e5:[()=>n.e(361).then(n.bind(n,48444)),"@site/docs/01-getting-started/virtualization.md",48444],e57b2c87:[()=>n.e(5230).then(n.bind(n,84878)),"@site/docs/04-operating-scs/components/status-page/docs/component_overview.md",84878],e5a53cb8:[()=>n.e(5929).then(n.t.bind(n,54781,19)),"~docs/standards/category-standards-standards-category-scs-0111-61d.json",54781],e747ec83:[()=>n.e(2291).then(n.bind(n,45309)),"@site/docs/glossary.md",45309],eaf80524:[()=>n.e(3897).then(n.bind(n,63472)),"@site/standards/certification/certified-clouds.md",63472],eb99bfed:[()=>n.e(5961).then(n.bind(n,97773)),"@site/docs/02-iaas/guides/troubleshooting-guide/manager.md",97773],ed24060c:[()=>n.e(8152).then(n.bind(n,35445)),"@site/standards/scs-XXXX-vN-template.md",35445],edc931f8:[()=>n.e(6160).then(n.bind(n,59074)),"@site/community/index.md",59074],eea6a18c:[()=>n.e(5053).then(n.bind(n,63807)),"@site/standards/scs-0400-v1-status-page-create-decision.md",63807],ef9d238d:[()=>Promise.all([n.e(532),n.e(2023)]).then(n.bind(n,63531)),"@site/community/contribute/local-docusaurus-development-guide.mdx",63531],f0b55dfe:[()=>n.e(9042).then(n.bind(n,48779)),"@site/docs/02-iaas/guides/other-guides/style-guide.md",48779],f0e20cb6:[()=>n.e(6815).then(n.bind(n,71523)),"@site/docs/02-iaas/guides/configuration-guide/index.md",71523],f14351c1:[()=>n.e(3356).then(n.t.bind(n,23057,19)),"~docs/default/category-docs-docs-category-components-a98.json",23057],f1715aef:[()=>n.e(6401).then(n.bind(n,40235)),"@site/standards/iaas/scs-0100.md",40235],f2a59390:[()=>n.e(5829).then(n.bind(n,15560)),"@site/docs/02-iaas/guides/deploy-guide/services/openstack.md",15560],f385820d:[()=>n.e(8908).then(n.bind(n,19162)),"@site/docs/02-iaas/guides/configuration-guide/openstack/horizon.md",19162],f40b2df0:[()=>n.e(7321).then(n.bind(n,8307)),"@site/docs/02-iaas/guides/operations-guide/openstack/octavia.md",8307],f4cdb2d9:[()=>n.e(3675).then(n.bind(n,34907)),"@site/docs/03-container/overview/knowledge.md",34907],f5b4e375:[()=>n.e(1776).then(n.bind(n,51823)),"@site/standards/scs-0210-v2-k8s-version-policy.md",51823],f68824be:[()=>n.e(2501).then(n.bind(n,33040)),"@site/standards/scs-0300-v1-requirements-for-sso-identity-federation.md",33040],f793d2d5:[()=>n.e(9080).then(n.t.bind(n,32481,19)),"/home/runner/work/docs/docs/.docusaurus/docusaurus-plugin-content-docs/community/plugin-route-context-module-100.json",32481],f8869d03:[()=>n.e(5739).then(n.bind(n,11010)),"@site/standards/kaas/index.md",11010],f91986bc:[()=>n.e(8205).then(n.t.bind(n,59676,19)),"~docs/default/category-docs-docs-category-operating-scs-4c9.json",59676],f9ec068e:[()=>n.e(6870).then(n.bind(n,70406)),"@site/standards/global/scs-0001.md",70406],fa7c4c29:[()=>n.e(1949).then(n.bind(n,82171)),"@site/docs/02-iaas/guides/upgrade-guide/network.md",82171],fd34a958:[()=>n.e(1906).then(n.bind(n,25026)),"@site/standards/scs-0402-v1-status-page-openapi-spec-decision.md",25026],fd74033a:[()=>n.e(642).then(n.bind(n,67884)),"@site/docs/02-iaas/guides/configuration-guide/commons/network.md",67884],fd8cbe72:[()=>n.e(7165).then(n.t.bind(n,71594,19)),"~docs/standards/category-standards-standards-category-scs-0110-d8a.json",71594],fe5fac7c:[()=>n.e(2019).then(n.bind(n,98318)),"@site/docs/03-container/deployment-examples/a/hardware.md",98318],fff9aecb:[()=>n.e(547).then(n.bind(n,88242)),"@site/docs/02-iaas/guides/upgrade-guide/index.md",88242]};function d(e){let{error:t,retry:n,pastDelay:r}=e;return t?a.createElement("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"}},a.createElement("p",null,String(t)),a.createElement("div",null,a.createElement("button",{type:"button",onClick:n},"Retry"))):r?a.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"}},a.createElement("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb"},a.createElement("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2"},a.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},a.createElement("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),a.createElement("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),a.createElement("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),a.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},a.createElement("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),a.createElement("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),a.createElement("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),a.createElement("circle",{cx:"22",cy:"22",r:"8"},a.createElement("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"}))))):null}var l=n(99670),u=n(30226);function p(e,t){if("*"===e)return s()({loading:d,loader:()=>n.e(4972).then(n.bind(n,4972)),modules:["@theme/NotFound"],webpack:()=>[4972],render(e,t){const n=e.default;return a.createElement(u.z,{value:{plugin:{name:"native",id:"default"}}},a.createElement(n,t))}});const o=i[`${e}-${t}`],p={},f=[],m=[],g=(0,l.Z)(o);return Object.entries(g).forEach((e=>{let[t,n]=e;const a=c[n];a&&(p[t]=a[0],f.push(a[1]),m.push(a[2]))})),s().Map({loading:d,loader:p,modules:f,webpack:()=>m,render(t,n){const s=JSON.parse(JSON.stringify(o));Object.entries(t).forEach((t=>{let[n,a]=t;const r=a.default;if(!r)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof r&&"function"!=typeof r||Object.keys(a).filter((e=>"default"!==e)).forEach((e=>{r[e]=a[e]}));let o=s;const i=n.split(".");i.slice(0,-1).forEach((e=>{o=o[e]})),o[i[i.length-1]]=r}));const i=s.__comp;delete s.__comp;const c=s.__context;return delete s.__context,a.createElement(u.z,{value:c},a.createElement(i,(0,r.Z)({},s,n)))}})}const f=[{path:"/blog",component:p("/blog","9f2"),exact:!0},{path:"/blog/archive",component:p("/blog/archive","d5c"),exact:!0},{path:"/blog/first-blog-post",component:p("/blog/first-blog-post","36f"),exact:!0},{path:"/blog/tags",component:p("/blog/tags","e00"),exact:!0},{path:"/blog/tags/community",component:p("/blog/tags/community","928"),exact:!0},{path:"/blog/tags/howto",component:p("/blog/tags/howto","1c2"),exact:!0},{path:"/search",component:p("/search","ae7"),exact:!0},{path:"/community",component:p("/community","3ce"),routes:[{path:"/community/",component:p("/community/","28b"),exact:!0,sidebar:"community"},{path:"/community/calendar",component:p("/community/calendar","f00"),exact:!0,sidebar:"community"},{path:"/community/category/contribute",component:p("/community/category/contribute","1d0"),exact:!0,sidebar:"community"},{path:"/community/cloud-resources/",component:p("/community/cloud-resources/","525"),exact:!0,sidebar:"community"},{path:"/community/cloud-resources/getting-started-openstack",component:p("/community/cloud-resources/getting-started-openstack","8a1"),exact:!0,sidebar:"community"},{path:"/community/cloud-resources/plusserver-gx-scs",component:p("/community/cloud-resources/plusserver-gx-scs","caa"),exact:!0,sidebar:"community"},{path:"/community/cloud-resources/wavestack",component:p("/community/cloud-resources/wavestack","eb6"),exact:!0,sidebar:"community"},{path:"/community/collaboration",component:p("/community/collaboration","457"),exact:!0,sidebar:"community"},{path:"/community/communication/jitsi",component:p("/community/communication/jitsi","d2a"),exact:!0},{path:"/community/communication/mailinglists",component:p("/community/communication/mailinglists","814"),exact:!0},{path:"/community/communication/matrix",component:p("/community/communication/matrix","70e"),exact:!0,sidebar:"community"},{path:"/community/contribute/adding-docs-guide",component:p("/community/contribute/adding-docs-guide","dcc"),exact:!0,sidebar:"community"},{path:"/community/contribute/doc-files-structure-guide",component:p("/community/contribute/doc-files-structure-guide","df7"),exact:!0,sidebar:"community"},{path:"/community/contribute/docs-workflow-explanation",component:p("/community/contribute/docs-workflow-explanation","04b"),exact:!0,sidebar:"community"},{path:"/community/contribute/linting-guide",component:p("/community/contribute/linting-guide","ce6"),exact:!0,sidebar:"community"},{path:"/community/contribute/local-docusaurus-development-guide",component:p("/community/contribute/local-docusaurus-development-guide","458"),exact:!0,sidebar:"community"},{path:"/community/contribute/styleguide",component:p("/community/contribute/styleguide","972"),exact:!0,sidebar:"community"},{path:"/community/contribute/styleguides/ansible_styleguide",component:p("/community/contribute/styleguides/ansible_styleguide","445"),exact:!0},{path:"/community/github/branchprotection",component:p("/community/github/branchprotection","0e8"),exact:!0,sidebar:"community"},{path:"/community/github/dco-and-licenses",component:p("/community/github/dco-and-licenses","8d0"),exact:!0,sidebar:"community"},{path:"/community/github/tips-and-tricks",component:p("/community/github/tips-and-tricks","285"),exact:!0,sidebar:"community"},{path:"/community/hackathons/checklist",component:p("/community/hackathons/checklist","65a"),exact:!0},{path:"/community/license-considerations",component:p("/community/license-considerations","b75"),exact:!0,sidebar:"community"}]},{path:"/dev-docs",component:p("/dev-docs","759"),routes:[{path:"/dev-docs/",component:p("/dev-docs/","c0d"),exact:!0,sidebar:"devDocs"},{path:"/dev-docs/operations/iam/identity-federation-in-scs",component:p("/dev-docs/operations/iam/identity-federation-in-scs","7be"),exact:!0,sidebar:"devDocs"},{path:"/dev-docs/operations/iam/openstack-federation-via-oidc",component:p("/dev-docs/operations/iam/openstack-federation-via-oidc","c91"),exact:!0,sidebar:"devDocs"},{path:"/dev-docs/operations/operations/zuul-ci-cd-quickstart-user-guide",component:p("/dev-docs/operations/operations/zuul-ci-cd-quickstart-user-guide","26d"),exact:!0,sidebar:"devDocs"}]},{path:"/docs",component:p("/docs","2e7"),routes:[{path:"/docs/",component:p("/docs/","e7a"),exact:!0,sidebar:"docs"},{path:"/docs/category/components",component:p("/docs/category/components","f2e"),exact:!0,sidebar:"docs"},{path:"/docs/category/components-1",component:p("/docs/category/components-1","f0f"),exact:!0,sidebar:"docs"},{path:"/docs/category/components-2",component:p("/docs/category/components-2","781"),exact:!0,sidebar:"docs"},{path:"/docs/category/iaas-layer",component:p("/docs/category/iaas-layer","429"),exact:!0,sidebar:"docs"},{path:"/docs/category/identity-and-access-management-iam",component:p("/docs/category/identity-and-access-management-iam","238"),exact:!0,sidebar:"docs"},{path:"/docs/category/k8s-cluster-api-provider",component:p("/docs/category/k8s-cluster-api-provider","de7"),exact:!0,sidebar:"docs"},{path:"/docs/category/metering",component:p("/docs/category/metering","c3e"),exact:!0,sidebar:"docs"},{path:"/docs/category/operating-scs",component:p("/docs/category/operating-scs","b51"),exact:!0,sidebar:"docs"},{path:"/docs/category/releases",component:p("/docs/category/releases","d6f"),exact:!0,sidebar:"docs"},{path:"/docs/category/status-page-api",component:p("/docs/category/status-page-api","18b"),exact:!0,sidebar:"docs"},{path:"/docs/container/",component:p("/docs/container/","a92"),exact:!0,sidebar:"docs"},{path:"/docs/container/components/k8s-cluster-api-provider/doc/application-credentials",component:p("/docs/container/components/k8s-cluster-api-provider/doc/application-credentials","449"),exact:!0,sidebar:"docs"},{path:"/docs/container/components/k8s-cluster-api-provider/doc/configuration",component:p("/docs/container/components/k8s-cluster-api-provider/doc/configuration","14c"),exact:!0,sidebar:"docs"},{path:"/docs/container/components/k8s-cluster-api-provider/doc/continuous-integration",component:p("/docs/container/components/k8s-cluster-api-provider/doc/continuous-integration","caf"),exact:!0},{path:"/docs/container/components/k8s-cluster-api-provider/doc/LoadBalancer-ExtTrafficLocal",component:p("/docs/container/components/k8s-cluster-api-provider/doc/LoadBalancer-ExtTrafficLocal","6d4"),exact:!0,sidebar:"docs"},{path:"/docs/container/components/k8s-cluster-api-provider/doc/Maintenance_and_Troubleshooting",component:p("/docs/container/components/k8s-cluster-api-provider/doc/Maintenance_and_Troubleshooting","aee"),exact:!0,sidebar:"docs"},{path:"/docs/container/components/k8s-cluster-api-provider/doc/make-reference",component:p("/docs/container/components/k8s-cluster-api-provider/doc/make-reference","a20"),exact:!0,sidebar:"docs"},{path:"/docs/container/components/k8s-cluster-api-provider/doc/overview",component:p("/docs/container/components/k8s-cluster-api-provider/doc/overview","3f1"),exact:!0,sidebar:"docs"},{path:"/docs/container/components/k8s-cluster-api-provider/doc/quickstart",component:p("/docs/container/components/k8s-cluster-api-provider/doc/quickstart","315"),exact:!0,sidebar:"docs"},{path:"/docs/container/components/k8s-cluster-api-provider/doc/requirements",component:p("/docs/container/components/k8s-cluster-api-provider/doc/requirements","3b4"),exact:!0,sidebar:"docs"},{path:"/docs/container/components/k8s-cluster-api-provider/doc/roadmap",component:p("/docs/container/components/k8s-cluster-api-provider/doc/roadmap","dde"),exact:!0,sidebar:"docs"},{path:"/docs/container/components/k8s-cluster-api-provider/doc/Upgrade-Guide",component:p("/docs/container/components/k8s-cluster-api-provider/doc/Upgrade-Guide","16c"),exact:!0,sidebar:"docs"},{path:"/docs/container/components/k8s-cluster-api-provider/doc/usage/",component:p("/docs/container/components/k8s-cluster-api-provider/doc/usage/","947"),exact:!0,sidebar:"docs"},{path:"/docs/container/components/k8s-cluster-api-provider/doc/usage/cluster-mgmt-capi-mgmt-node",component:p("/docs/container/components/k8s-cluster-api-provider/doc/usage/cluster-mgmt-capi-mgmt-node","c59"),exact:!0,sidebar:"docs"},{path:"/docs/container/components/k8s-cluster-api-provider/doc/usage/containter-registry-configuration",component:p("/docs/container/components/k8s-cluster-api-provider/doc/usage/containter-registry-configuration","1cc"),exact:!0},{path:"/docs/container/components/k8s-cluster-api-provider/doc/usage/create-new-cluster",component:p("/docs/container/components/k8s-cluster-api-provider/doc/usage/create-new-cluster","ee0"),exact:!0,sidebar:"docs"},{path:"/docs/container/components/k8s-cluster-api-provider/doc/usage/custom-ca",component:p("/docs/container/components/k8s-cluster-api-provider/doc/usage/custom-ca","bad"),exact:!0},{path:"/docs/container/components/k8s-cluster-api-provider/doc/usage/gateway-api",component:p("/docs/container/components/k8s-cluster-api-provider/doc/usage/gateway-api","2a3"),exact:!0},{path:"/docs/container/components/k8s-cluster-api-provider/doc/usage/harbor",component:p("/docs/container/components/k8s-cluster-api-provider/doc/usage/harbor","8c4"),exact:!0},{path:"/docs/container/components/k8s-cluster-api-provider/doc/usage/managing-many-clusters",component:p("/docs/container/components/k8s-cluster-api-provider/doc/usage/managing-many-clusters","4f0"),exact:!0,sidebar:"docs"},{path:"/docs/container/components/k8s-cluster-api-provider/doc/usage/migrate-to-cluster-class",component:p("/docs/container/components/k8s-cluster-api-provider/doc/usage/migrate-to-cluster-class","76a"),exact:!0},{path:"/docs/container/components/k8s-cluster-api-provider/doc/usage/multi-az-and-multi-cloud-environments",component:p("/docs/container/components/k8s-cluster-api-provider/doc/usage/multi-az-and-multi-cloud-environments","335"),exact:!0,sidebar:"docs"},{path:"/docs/container/components/k8s-cluster-api-provider/doc/usage/testing",component:p("/docs/container/components/k8s-cluster-api-provider/doc/usage/testing","196"),exact:!0,sidebar:"docs"},{path:"/docs/container/deployment-examples/a/",component:p("/docs/container/deployment-examples/a/","2d2"),exact:!0},{path:"/docs/container/deployment-examples/a/hardware",component:p("/docs/container/deployment-examples/a/hardware","17e"),exact:!0},{path:"/docs/container/deployment-examples/a/software",component:p("/docs/container/deployment-examples/a/software","3b1"),exact:!0},{path:"/docs/container/guides/guide1",component:p("/docs/container/guides/guide1","5f1"),exact:!0},{path:"/docs/container/overview/architecture",component:p("/docs/container/overview/architecture","a46"),exact:!0},{path:"/docs/container/overview/knowledge",component:p("/docs/container/overview/knowledge","ed6"),exact:!0},{path:"/docs/faq/",component:p("/docs/faq/","7ca"),exact:!0,sidebar:"docs"},{path:"/docs/getting-started/containerization",component:p("/docs/getting-started/containerization","f2a"),exact:!0},{path:"/docs/getting-started/overview",component:p("/docs/getting-started/overview","76a"),exact:!0},{path:"/docs/getting-started/virtualization",component:p("/docs/getting-started/virtualization","23f"),exact:!0},{path:"/docs/glossary",component:p("/docs/glossary","949"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/components/",component:p("/docs/iaas/components/","16c"),exact:!0},{path:"/docs/iaas/components/flavor-manager",component:p("/docs/iaas/components/flavor-manager","826"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/components/image-manager",component:p("/docs/iaas/components/image-manager","84e"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/components/project-manager",component:p("/docs/iaas/components/project-manager","f3d"),exact:!0},{path:"/docs/iaas/components/resource-manager",component:p("/docs/iaas/components/resource-manager","c1c"),exact:!0},{path:"/docs/iaas/components/sandbox-manager",component:p("/docs/iaas/components/sandbox-manager","bb6"),exact:!0},{path:"/docs/iaas/guides/",component:p("/docs/iaas/guides/","77d"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/configuration-guide/",component:p("/docs/iaas/guides/configuration-guide/","ab0"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/configuration-guide/ceph",component:p("/docs/iaas/guides/configuration-guide/ceph","be5"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/configuration-guide/commons/",component:p("/docs/iaas/guides/configuration-guide/commons/","78f"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/configuration-guide/commons/network",component:p("/docs/iaas/guides/configuration-guide/commons/network","514"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/configuration-guide/commons/packages",component:p("/docs/iaas/guides/configuration-guide/commons/packages","546"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/configuration-guide/commons/services",component:p("/docs/iaas/guides/configuration-guide/commons/services","bfc"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/configuration-guide/commons/sshconfig",component:p("/docs/iaas/guides/configuration-guide/commons/sshconfig","3ef"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/configuration-guide/commons/sysctl",component:p("/docs/iaas/guides/configuration-guide/commons/sysctl","4c7"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/configuration-guide/commons/timezone",component:p("/docs/iaas/guides/configuration-guide/commons/timezone","f6e"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/configuration-guide/configuration-repository",component:p("/docs/iaas/guides/configuration-guide/configuration-repository","d89"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/configuration-guide/inventory",component:p("/docs/iaas/guides/configuration-guide/inventory","a1b"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/configuration-guide/manager",component:p("/docs/iaas/guides/configuration-guide/manager","674"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/configuration-guide/openstack/",component:p("/docs/iaas/guides/configuration-guide/openstack/","7df"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/configuration-guide/openstack/horizon",component:p("/docs/iaas/guides/configuration-guide/openstack/horizon","855"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/configuration-guide/openstack/keystone",component:p("/docs/iaas/guides/configuration-guide/openstack/keystone","a4a"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/configuration-guide/proxy",component:p("/docs/iaas/guides/configuration-guide/proxy","215"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/configuration-guide/self-signed-certificates",component:p("/docs/iaas/guides/configuration-guide/self-signed-certificates","ec8"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/configuration-guide/services/",component:p("/docs/iaas/guides/configuration-guide/services/","e17"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/deploy-guide/",component:p("/docs/iaas/guides/deploy-guide/","036"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/deploy-guide/bootstrap",component:p("/docs/iaas/guides/deploy-guide/bootstrap","171"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/deploy-guide/examples/",component:p("/docs/iaas/guides/deploy-guide/examples/","ce8"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box",component:p("/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box","47e"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/deploy-guide/examples/testbed",component:p("/docs/iaas/guides/deploy-guide/examples/testbed","061"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/deploy-guide/manager",component:p("/docs/iaas/guides/deploy-guide/manager","486"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/deploy-guide/provisioning",component:p("/docs/iaas/guides/deploy-guide/provisioning","c75"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/deploy-guide/seed",component:p("/docs/iaas/guides/deploy-guide/seed","fcd"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/deploy-guide/services/",component:p("/docs/iaas/guides/deploy-guide/services/","7ed"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/deploy-guide/services/ceph",component:p("/docs/iaas/guides/deploy-guide/services/ceph","e38"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/deploy-guide/services/infrastructure",component:p("/docs/iaas/guides/deploy-guide/services/infrastructure","b23"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/deploy-guide/services/logging-monitoring",component:p("/docs/iaas/guides/deploy-guide/services/logging-monitoring","878"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/deploy-guide/services/network",component:p("/docs/iaas/guides/deploy-guide/services/network","6ec"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/deploy-guide/services/openstack",component:p("/docs/iaas/guides/deploy-guide/services/openstack","64d"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/operations-guide/",component:p("/docs/iaas/guides/operations-guide/","e79"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/operations-guide/ceph",component:p("/docs/iaas/guides/operations-guide/ceph","f59"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/operations-guide/manager/",component:p("/docs/iaas/guides/operations-guide/manager/","ab9"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/operations-guide/manager/apply",component:p("/docs/iaas/guides/operations-guide/manager/apply","3c2"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/operations-guide/manager/console",component:p("/docs/iaas/guides/operations-guide/manager/console","6ab"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/operations-guide/manager/log",component:p("/docs/iaas/guides/operations-guide/manager/log","75f"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/operations-guide/manager/task",component:p("/docs/iaas/guides/operations-guide/manager/task","25a"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/operations-guide/openstack/",component:p("/docs/iaas/guides/operations-guide/openstack/","993"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/operations-guide/openstack/cinder",component:p("/docs/iaas/guides/operations-guide/openstack/cinder","207"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/operations-guide/openstack/day2-operations/",component:p("/docs/iaas/guides/operations-guide/openstack/day2-operations/","57d"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/operations-guide/openstack/day2-operations/flavor-manager",component:p("/docs/iaas/guides/operations-guide/openstack/day2-operations/flavor-manager","3a0"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/operations-guide/openstack/day2-operations/image-manager",component:p("/docs/iaas/guides/operations-guide/openstack/day2-operations/image-manager","ce1"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/operations-guide/openstack/day2-operations/project-manager",component:p("/docs/iaas/guides/operations-guide/openstack/day2-operations/project-manager","956"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/operations-guide/openstack/day2-operations/resource-manager",component:p("/docs/iaas/guides/operations-guide/openstack/day2-operations/resource-manager","dcb"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/operations-guide/openstack/day2-operations/sandbox-manager",component:p("/docs/iaas/guides/operations-guide/openstack/day2-operations/sandbox-manager","d79"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/operations-guide/openstack/octavia",component:p("/docs/iaas/guides/operations-guide/openstack/octavia","990"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/other-guides/",component:p("/docs/iaas/guides/other-guides/","a47"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/other-guides/contributor-guide",component:p("/docs/iaas/guides/other-guides/contributor-guide","b3b"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/other-guides/developer-guide/",component:p("/docs/iaas/guides/other-guides/developer-guide/","a72"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/other-guides/developer-guide/releases",component:p("/docs/iaas/guides/other-guides/developer-guide/releases","cb8"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/other-guides/developer-guide/scripts",component:p("/docs/iaas/guides/other-guides/developer-guide/scripts","7c2"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/other-guides/developer-guide/zuul-ci",component:p("/docs/iaas/guides/other-guides/developer-guide/zuul-ci","c98"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/other-guides/style-guide",component:p("/docs/iaas/guides/other-guides/style-guide","ef3"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/other-guides/zuul",component:p("/docs/iaas/guides/other-guides/zuul","48d"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/troubleshooting-guide/",component:p("/docs/iaas/guides/troubleshooting-guide/","597"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/troubleshooting-guide/manager",component:p("/docs/iaas/guides/troubleshooting-guide/manager","7cd"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/troubleshooting-guide/openstack",component:p("/docs/iaas/guides/troubleshooting-guide/openstack","c90"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/upgrade-guide/",component:p("/docs/iaas/guides/upgrade-guide/","bf8"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/upgrade-guide/ceph",component:p("/docs/iaas/guides/upgrade-guide/ceph","e67"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/upgrade-guide/docker",component:p("/docs/iaas/guides/upgrade-guide/docker","fff"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/upgrade-guide/infrastructure",component:p("/docs/iaas/guides/upgrade-guide/infrastructure","4d7"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/upgrade-guide/logging-monitoring",component:p("/docs/iaas/guides/upgrade-guide/logging-monitoring","02d"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/upgrade-guide/manager",component:p("/docs/iaas/guides/upgrade-guide/manager","f3c"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/upgrade-guide/network",component:p("/docs/iaas/guides/upgrade-guide/network","1ca"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/guides/upgrade-guide/openstack",component:p("/docs/iaas/guides/upgrade-guide/openstack","f09"),exact:!0,sidebar:"docs"},{path:"/docs/iaas/overview/architecture",component:p("/docs/iaas/overview/architecture","3e8"),exact:!0},{path:"/docs/iaas/overview/compute",component:p("/docs/iaas/overview/compute","5a3"),exact:!0},{path:"/docs/iaas/overview/knowledge",component:p("/docs/iaas/overview/knowledge","df1"),exact:!0},{path:"/docs/iaas/overview/network",component:p("/docs/iaas/overview/network","dd9"),exact:!0},{path:"/docs/iaas/overview/storage",component:p("/docs/iaas/overview/storage","94d"),exact:!0},{path:"/docs/iam/intra-SCS-federation-setup-description-for-osism-doc-operations",component:p("/docs/iam/intra-SCS-federation-setup-description-for-osism-doc-operations","bdd"),exact:!0,sidebar:"docs"},{path:"/docs/operating-scs/audits/",component:p("/docs/operating-scs/audits/","497"),exact:!0},{path:"/docs/operating-scs/components/status-page/docs/component_overview",component:p("/docs/operating-scs/components/status-page/docs/component_overview","8e0"),exact:!0,sidebar:"docs"},{path:"/docs/operating-scs/components/status-page/docs/components",component:p("/docs/operating-scs/components/status-page/docs/components","e16"),exact:!0,sidebar:"docs"},{path:"/docs/operating-scs/components/status-page/docs/levels_of_consensus",component:p("/docs/operating-scs/components/status-page/docs/levels_of_consensus","381"),exact:!0,sidebar:"docs"},{path:"/docs/operating-scs/components/status-page/docs/overview",component:p("/docs/operating-scs/components/status-page/docs/overview","17d"),exact:!0,sidebar:"docs"},{path:"/docs/operating-scs/guides/guide-1",component:p("/docs/operating-scs/guides/guide-1","7e5"),exact:!0},{path:"/docs/operating-scs/incident-management/",component:p("/docs/operating-scs/incident-management/","c12"),exact:!0},{path:"/docs/operating-scs/lifecycle-management/",component:p("/docs/operating-scs/lifecycle-management/","cb7"),exact:!0},{path:"/docs/operating-scs/logging/",component:p("/docs/operating-scs/logging/","d7c"),exact:!0},{path:"/docs/operating-scs/metering/meter_configuration",component:p("/docs/operating-scs/metering/meter_configuration","5aa"),exact:!0,sidebar:"docs"},{path:"/docs/operating-scs/monitoring/",component:p("/docs/operating-scs/monitoring/","66c"),exact:!0},{path:"/docs/operating-scs/overview",component:p("/docs/operating-scs/overview","6df"),exact:!0},{path:"/docs/releases/Release0",component:p("/docs/releases/Release0","487"),exact:!0,sidebar:"docs"},{path:"/docs/releases/Release1",component:p("/docs/releases/Release1","066"),exact:!0,sidebar:"docs"},{path:"/docs/releases/Release2",component:p("/docs/releases/Release2","0aa"),exact:!0,sidebar:"docs"},{path:"/docs/releases/Release3",component:p("/docs/releases/Release3","33d"),exact:!0,sidebar:"docs"},{path:"/docs/releases/Release4",component:p("/docs/releases/Release4","352"),exact:!0,sidebar:"docs"},{path:"/docs/releases/Release5",component:p("/docs/releases/Release5","01d"),exact:!0,sidebar:"docs"},{path:"/docs/releases/ReleaseX",component:p("/docs/releases/ReleaseX","138"),exact:!0},{path:"/docs/standards/",component:p("/docs/standards/","41f"),exact:!0}]},{path:"/standards",component:p("/standards","e22"),routes:[{path:"/standards/",component:p("/standards/","4e4"),exact:!0,sidebar:"standards"},{path:"/standards/certification/certified-clouds",component:p("/standards/certification/certified-clouds","a1c"),exact:!0},{path:"/standards/certification/get-certified",component:p("/standards/certification/get-certified","d64"),exact:!0},{path:"/standards/certification/overview",component:p("/standards/certification/overview","60a"),exact:!0,sidebar:"standards"},{path:"/standards/certification/subjects-versions",component:p("/standards/certification/subjects-versions","494"),exact:!0},{path:"/standards/decision-records",component:p("/standards/decision-records","16a"),exact:!0,sidebar:"standards"},{path:"/standards/global/",component:p("/standards/global/","033"),exact:!0,sidebar:"standards"},{path:"/standards/global/scs-0001",component:p("/standards/global/scs-0001","cf3"),exact:!0,sidebar:"standards"},{path:"/standards/global/scs-0002",component:p("/standards/global/scs-0002","1c7"),exact:!0,sidebar:"standards"},{path:"/standards/global/scs-0003",component:p("/standards/global/scs-0003","e5c"),exact:!0,sidebar:"standards"},{path:"/standards/iaas/",component:p("/standards/iaas/","a82"),exact:!0,sidebar:"standards"},{path:"/standards/iaas/scs-0100",component:p("/standards/iaas/scs-0100","595"),exact:!0,sidebar:"standards"},{path:"/standards/iaas/scs-0101",component:p("/standards/iaas/scs-0101","31e"),exact:!0,sidebar:"standards"},{path:"/standards/iaas/scs-0102",component:p("/standards/iaas/scs-0102","450"),exact:!0,sidebar:"standards"},{path:"/standards/iaas/scs-0103",component:p("/standards/iaas/scs-0103","837"),exact:!0,sidebar:"standards"},{path:"/standards/iaas/scs-0104",component:p("/standards/iaas/scs-0104","d89"),exact:!0,sidebar:"standards"},{path:"/standards/iam/",component:p("/standards/iam/","6c8"),exact:!0,sidebar:"standards"},{path:"/standards/iam/scs-0300",component:p("/standards/iam/scs-0300","e37"),exact:!0,sidebar:"standards"},{path:"/standards/kaas/",component:p("/standards/kaas/","576"),exact:!0,sidebar:"standards"},{path:"/standards/kaas/scs-0210",component:p("/standards/kaas/scs-0210","d68"),exact:!0,sidebar:"standards"},{path:"/standards/kaas/scs-0211",component:p("/standards/kaas/scs-0211","fe7"),exact:!0,sidebar:"standards"},{path:"/standards/ops/",component:p("/standards/ops/","49c"),exact:!0,sidebar:"standards"},{path:"/standards/ops/scs-0412",component:p("/standards/ops/scs-0412","b48"),exact:!0,sidebar:"standards"},{path:"/standards/scs-0001-v1-sovereign-cloud-standards",component:p("/standards/scs-0001-v1-sovereign-cloud-standards","413"),exact:!0,sidebar:"standards"},{path:"/standards/scs-0002-v1-standards-docs-org",component:p("/standards/scs-0002-v1-standards-docs-org","11e"),exact:!0,sidebar:"standards"},{path:"/standards/scs-0002-v2-standards-docs-org",component:p("/standards/scs-0002-v2-standards-docs-org","37a"),exact:!0,sidebar:"standards"},{path:"/standards/scs-0003-v1-sovereign-cloud-standards-yaml",component:p("/standards/scs-0003-v1-sovereign-cloud-standards-yaml","98f"),exact:!0,sidebar:"standards"},{path:"/standards/scs-0100-v1-flavor-naming",component:p("/standards/scs-0100-v1-flavor-naming","c40"),exact:!0,sidebar:"standards"},{path:"/standards/scs-0100-v2-flavor-naming",component:p("/standards/scs-0100-v2-flavor-naming","b94"),exact:!0,sidebar:"standards"},{path:"/standards/scs-0100-v3-flavor-naming",component:p("/standards/scs-0100-v3-flavor-naming","47a"),exact:!0,sidebar:"standards"},{path:"/standards/scs-0101-v1-entropy",component:p("/standards/scs-0101-v1-entropy","7f1"),exact:!0,sidebar:"standards"},{path:"/standards/scs-0102-v1-image-metadata",component:p("/standards/scs-0102-v1-image-metadata","1b7"),exact:!0,sidebar:"standards"},{path:"/standards/scs-0103-v1-standard-flavors",component:p("/standards/scs-0103-v1-standard-flavors","4e4"),exact:!0,sidebar:"standards"},{path:"/standards/scs-0104-v1-standard-images",component:p("/standards/scs-0104-v1-standard-images","0bb"),exact:!0,sidebar:"standards"},{path:"/standards/scs-0110",component:p("/standards/scs-0110","981"),exact:!0,sidebar:"standards"},{path:"/standards/scs-0110-v1-ssd-flavors",component:p("/standards/scs-0110-v1-ssd-flavors","17d"),exact:!0,sidebar:"standards"},{path:"/standards/scs-0111-v1-volume-type-decisions",component:p("/standards/scs-0111-v1-volume-type-decisions","519"),exact:!0,sidebar:"standards"},{path:"/standards/scs-0210-v1-k8s-new-version-policy",component:p("/standards/scs-0210-v1-k8s-new-version-policy","72c"),exact:!0,sidebar:"standards"},{path:"/standards/scs-0210-v2-k8s-version-policy",component:p("/standards/scs-0210-v2-k8s-version-policy","5b6"),exact:!0},{path:"/standards/scs-0211-v1-kaas-default-storage-class",component:p("/standards/scs-0211-v1-kaas-default-storage-class","bf3"),exact:!0,sidebar:"standards"},{path:"/standards/scs-0212-v1-requirements-for-container-registry",component:p("/standards/scs-0212-v1-requirements-for-container-registry","116"),exact:!0,sidebar:"standards"},{path:"/standards/scs-0213-v1-k8s-nodes-anti-affinity",component:p("/standards/scs-0213-v1-k8s-nodes-anti-affinity","403"),exact:!0,sidebar:"standards"},{path:"/standards/scs-0213-v1-requirements-for-testing-cluster-stacks",component:p("/standards/scs-0213-v1-requirements-for-testing-cluster-stacks","f28"),exact:!0},{path:"/standards/scs-0214-v1-k8s-node-distribution",component:p("/standards/scs-0214-v1-k8s-node-distribution","b65"),exact:!0},{path:"/standards/scs-0300-v1-requirements-for-sso-identity-federation",component:p("/standards/scs-0300-v1-requirements-for-sso-identity-federation","ec7"),exact:!0,sidebar:"standards"},{path:"/standards/scs-0301-v1-naming-conventions",component:p("/standards/scs-0301-v1-naming-conventions","c1b"),exact:!0,sidebar:"standards"},{path:"/standards/scs-0302-v1-domain-manager-role",component:p("/standards/scs-0302-v1-domain-manager-role","987"),exact:!0},{path:"/standards/scs-0400-v1-status-page-create-decision",component:p("/standards/scs-0400-v1-status-page-create-decision","5d8"),exact:!0,sidebar:"standards"},{path:"/standards/scs-0401-v1-status-page-reference-implementation-decision",component:p("/standards/scs-0401-v1-status-page-reference-implementation-decision","3b2"),exact:!0,sidebar:"standards"},{path:"/standards/scs-0402-v1-status-page-openapi-spec-decision",component:p("/standards/scs-0402-v1-status-page-openapi-spec-decision","3ef"),exact:!0,sidebar:"standards"},{path:"/standards/scs-0410-v1-gnocchi-as-metering-database",component:p("/standards/scs-0410-v1-gnocchi-as-metering-database","4d3"),exact:!0,sidebar:"standards"},{path:"/standards/scs-0411-v1-publishing_method_for_metering_data",component:p("/standards/scs-0411-v1-publishing_method_for_metering_data","231"),exact:!0,sidebar:"standards"},{path:"/standards/scs-0412-v1-metering-json",component:p("/standards/scs-0412-v1-metering-json","3c8"),exact:!0,sidebar:"standards"},{path:"/standards/scs-XXXX-vN-template",component:p("/standards/scs-XXXX-vN-template","4a0"),exact:!0},{path:"/standards/standards/overview",component:p("/standards/standards/overview","900"),exact:!0,sidebar:"standards"},{path:"/standards/standards/scs-0111",component:p("/standards/standards/scs-0111","2f9"),exact:!0,sidebar:"standards"},{path:"/standards/standards/scs-0212",component:p("/standards/standards/scs-0212","ddd"),exact:!0,sidebar:"standards"},{path:"/standards/standards/scs-0213",component:p("/standards/standards/scs-0213","f5c"),exact:!0,sidebar:"standards"},{path:"/standards/standards/scs-0301",component:p("/standards/standards/scs-0301","6e7"),exact:!0,sidebar:"standards"},{path:"/standards/standards/scs-0400",component:p("/standards/standards/scs-0400","b78"),exact:!0,sidebar:"standards"},{path:"/standards/standards/scs-0401",component:p("/standards/standards/scs-0401","445"),exact:!0,sidebar:"standards"},{path:"/standards/standards/scs-0402",component:p("/standards/standards/scs-0402","a78"),exact:!0,sidebar:"standards"},{path:"/standards/standards/scs-0410",component:p("/standards/standards/scs-0410","6f0"),exact:!0,sidebar:"standards"},{path:"/standards/standards/scs-0411",component:p("/standards/standards/scs-0411","049"),exact:!0,sidebar:"standards"}]},{path:"/",component:p("/","39f"),exact:!0},{path:"*",component:p("*")}]},98934:(e,t,n)=>{"use strict";n.d(t,{_:()=>r,t:()=>o});var a=n(67294);const r=a.createContext(!1);function o(e){let{children:t}=e;const[n,o]=(0,a.useState)(!1);return(0,a.useEffect)((()=>{o(!0)}),[]),a.createElement(r.Provider,{value:n},t)}},97221:(e,t,n)=>{"use strict";var a=n(67294),r=n(73935),o=n(73727),s=n(70405),i=n(10412);const c=[n(32497),n(3310),n(18320),n(52295),n(20006)];var d=n(723),l=n(16550),u=n(18790);function p(e){let{children:t}=e;return a.createElement(a.Fragment,null,t)}var f=n(87462),m=n(35742),g=n(52263),h=n(44996),b=n(86668),v=n(1944),y=n(94711),k=n(19727),w=n(43320),x=n(18780),E=n(90197);function _(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,g.Z)(),n=(0,y.l)();return a.createElement(m.Z,null,Object.entries(t).map((e=>{let[t,{htmlLang:r}]=e;return a.createElement("link",{key:t,rel:"alternate",href:n.createUrl({locale:t,fullyQualified:!0}),hrefLang:r})})),a.createElement("link",{rel:"alternate",href:n.createUrl({locale:e,fullyQualified:!0}),hrefLang:"x-default"}))}function S(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,g.Z)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,g.Z)(),{pathname:a}=(0,l.TH)();return e+(0,x.applyTrailingSlash)((0,h.Z)(a),{trailingSlash:n,baseUrl:t})}(),o=t?`${n}${t}`:r;return a.createElement(m.Z,null,a.createElement("meta",{property:"og:url",content:o}),a.createElement("link",{rel:"canonical",href:o}))}function C(){const{i18n:{currentLocale:e}}=(0,g.Z)(),{metadata:t,image:n}=(0,b.L)();return a.createElement(a.Fragment,null,a.createElement(m.Z,null,a.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),a.createElement("body",{className:k.h})),n&&a.createElement(v.d,{image:n}),a.createElement(S,null),a.createElement(_,null),a.createElement(E.Z,{tag:w.HX,locale:e}),a.createElement(m.Z,null,t.map(((e,t)=>a.createElement("meta",(0,f.Z)({key:t},e))))))}const T=new Map;function L(e){if(T.has(e.pathname))return{...e,pathname:T.get(e.pathname)};if((0,u.f)(d.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return T.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return T.set(e.pathname,t),{...e,pathname:t}}var P=n(98934),R=n(58940);function O(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),a=1;a<t;a++)n[a-1]=arguments[a];const r=c.map((t=>{const a=t.default?.[e]??t[e];return a?.(...n)}));return()=>r.forEach((e=>e?.()))}const N=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,a.useLayoutEffect)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const a=t.pathname===n.pathname,r=t.hash===n.hash,o=t.search===n.search;if(a&&r&&!o)return;const{hash:s}=t;if(s){const e=decodeURIComponent(s.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),O("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function I(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,u.f)(d.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class A extends a.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=i.Z.canUseDOM?O("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=O("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),I(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return a.createElement(N,{previousLocation:this.previousLocation,location:t},a.createElement(l.AW,{location:t,render:()=>e}))}}const D=A,M="__docusaurus-base-url-issue-banner-container",F="__docusaurus-base-url-issue-banner",B="__docusaurus-base-url-issue-banner-suggestion-container",j="__DOCUSAURUS_INSERT_BASEURL_BANNER";function z(e){return`\nwindow['${j}'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['${j}'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('${M}');\n if (!bannerContainer) {\n return;\n }\n var bannerHtml = ${JSON.stringify(function(e){return`\n<div id="${F}" style="border: thick solid red; background-color: rgb(255, 230, 179); margin: 20px; padding: 20px; font-size: 20px;">\n <p style="font-weight: bold; font-size: 30px;">Your Docusaurus site did not load properly.</p>\n <p>A very common reason is a wrong site <a href="https://docusaurus.io/docs/docusaurus.config.js/#baseUrl" style="font-weight: bold;">baseUrl configuration</a>.</p>\n <p>Current configured baseUrl = <span style="font-weight: bold; color: red;">${e}</span> ${"/"===e?" (default value)":""}</p>\n <p>We suggest trying baseUrl = <span id="${B}" style="font-weight: bold; color: green;"></span></p>\n</div>\n`}(e)).replace(/</g,"\\<")};\n bannerContainer.innerHTML = bannerHtml;\n var suggestionContainer = document.getElementById('${B}');\n var actualHomePagePath = window.location.pathname;\n var suggestedBaseUrl = actualHomePagePath.substr(-1) === '/'\n ? actualHomePagePath\n : actualHomePagePath + '/';\n suggestionContainer.innerHTML = suggestedBaseUrl;\n}\n`}function $(){const{siteConfig:{baseUrl:e}}=(0,g.Z)();return(0,a.useLayoutEffect)((()=>{window[j]=!1}),[]),a.createElement(a.Fragment,null,!i.Z.canUseDOM&&a.createElement(m.Z,null,a.createElement("script",null,z(e))),a.createElement("div",{id:M}))}function U(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,g.Z)(),{pathname:n}=(0,l.TH)();return t&&n===e?a.createElement($,null):null}function H(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:r,localeConfigs:o}}=(0,g.Z)(),s=(0,h.Z)(e),{htmlLang:i,direction:c}=o[r];return a.createElement(m.Z,null,a.createElement("html",{lang:i,dir:c}),a.createElement("title",null,t),a.createElement("meta",{property:"og:title",content:t}),a.createElement("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),n&&a.createElement("meta",{name:"robots",content:"noindex, nofollow"}),e&&a.createElement("link",{rel:"icon",href:s}))}var Z=n(44763),Q=n(72389);function V(){const e=(0,Q.Z)();return a.createElement(m.Z,null,a.createElement("html",{"data-has-hydrated":e}))}function q(){const e=(0,u.H)(d.Z),t=(0,l.TH)();return a.createElement(Z.Z,null,a.createElement(R.M,null,a.createElement(P.t,null,a.createElement(p,null,a.createElement(H,null),a.createElement(C,null),a.createElement(U,null),a.createElement(D,{location:L(t)},e)),a.createElement(V,null))))}var G=n(16887);const W=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const a=document.createElement("link");a.setAttribute("rel","prefetch"),a.setAttribute("href",e),a.onload=()=>t(),a.onerror=()=>n();const r=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;r?.appendChild(a)}))}:function(e){return new Promise(((t,n)=>{const a=new XMLHttpRequest;a.open("GET",e,!0),a.withCredentials=!0,a.onload=()=>{200===a.status?t():n()},a.send(null)}))};var X=n(99670);const Y=new Set,K=new Set,J=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ee={prefetch(e){if(!(e=>!J()&&!K.has(e)&&!Y.has(e))(e))return!1;Y.add(e);const t=(0,u.f)(d.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(G).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,X.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?W(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!J()&&!K.has(e))(e)&&(K.add(e),I(e))},te=Object.freeze(ee);if(i.Z.canUseDOM){window.docusaurus=te;const e=r.hydrate;I(window.location.pathname).then((()=>{e(a.createElement(s.B6,null,a.createElement(o.VK,null,a.createElement(q,null))),document.getElementById("__docusaurus"))}))}},58940:(e,t,n)=>{"use strict";n.d(t,{_:()=>l,M:()=>u});var a=n(67294),r=n(36809);const o=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/docs","mainDocId":"index","docs":[{"id":"container/components/k8s-cluster-api-provider/doc/application-credentials","path":"/docs/container/components/k8s-cluster-api-provider/doc/application-credentials","sidebar":"docs"},{"id":"container/components/k8s-cluster-api-provider/doc/configuration","path":"/docs/container/components/k8s-cluster-api-provider/doc/configuration","sidebar":"docs"},{"id":"container/components/k8s-cluster-api-provider/doc/continuous-integration","path":"/docs/container/components/k8s-cluster-api-provider/doc/continuous-integration"},{"id":"container/components/k8s-cluster-api-provider/doc/LoadBalancer-ExtTrafficLocal","path":"/docs/container/components/k8s-cluster-api-provider/doc/LoadBalancer-ExtTrafficLocal","sidebar":"docs"},{"id":"container/components/k8s-cluster-api-provider/doc/Maintenance_and_Troubleshooting","path":"/docs/container/components/k8s-cluster-api-provider/doc/Maintenance_and_Troubleshooting","sidebar":"docs"},{"id":"container/components/k8s-cluster-api-provider/doc/make-reference","path":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","sidebar":"docs"},{"id":"container/components/k8s-cluster-api-provider/doc/overview","path":"/docs/container/components/k8s-cluster-api-provider/doc/overview","sidebar":"docs"},{"id":"container/components/k8s-cluster-api-provider/doc/quickstart","path":"/docs/container/components/k8s-cluster-api-provider/doc/quickstart","sidebar":"docs"},{"id":"container/components/k8s-cluster-api-provider/doc/requirements","path":"/docs/container/components/k8s-cluster-api-provider/doc/requirements","sidebar":"docs"},{"id":"container/components/k8s-cluster-api-provider/doc/roadmap","path":"/docs/container/components/k8s-cluster-api-provider/doc/roadmap","sidebar":"docs"},{"id":"container/components/k8s-cluster-api-provider/doc/Upgrade-Guide","path":"/docs/container/components/k8s-cluster-api-provider/doc/Upgrade-Guide","sidebar":"docs"},{"id":"container/components/k8s-cluster-api-provider/doc/usage/cluster-mgmt-capi-mgmt-node","path":"/docs/container/components/k8s-cluster-api-provider/doc/usage/cluster-mgmt-capi-mgmt-node","sidebar":"docs"},{"id":"container/components/k8s-cluster-api-provider/doc/usage/containter-registry-configuration","path":"/docs/container/components/k8s-cluster-api-provider/doc/usage/containter-registry-configuration"},{"id":"container/components/k8s-cluster-api-provider/doc/usage/create-new-cluster","path":"/docs/container/components/k8s-cluster-api-provider/doc/usage/create-new-cluster","sidebar":"docs"},{"id":"container/components/k8s-cluster-api-provider/doc/usage/custom-ca","path":"/docs/container/components/k8s-cluster-api-provider/doc/usage/custom-ca"},{"id":"container/components/k8s-cluster-api-provider/doc/usage/gateway-api","path":"/docs/container/components/k8s-cluster-api-provider/doc/usage/gateway-api"},{"id":"container/components/k8s-cluster-api-provider/doc/usage/harbor","path":"/docs/container/components/k8s-cluster-api-provider/doc/usage/harbor"},{"id":"container/components/k8s-cluster-api-provider/doc/usage/managing-many-clusters","path":"/docs/container/components/k8s-cluster-api-provider/doc/usage/managing-many-clusters","sidebar":"docs"},{"id":"container/components/k8s-cluster-api-provider/doc/usage/migrate-to-cluster-class","path":"/docs/container/components/k8s-cluster-api-provider/doc/usage/migrate-to-cluster-class"},{"id":"container/components/k8s-cluster-api-provider/doc/usage/multi-az-and-multi-cloud-environments","path":"/docs/container/components/k8s-cluster-api-provider/doc/usage/multi-az-and-multi-cloud-environments","sidebar":"docs"},{"id":"container/components/k8s-cluster-api-provider/doc/usage/testing","path":"/docs/container/components/k8s-cluster-api-provider/doc/usage/testing","sidebar":"docs"},{"id":"container/components/k8s-cluster-api-provider/doc/usage/usage","path":"/docs/container/components/k8s-cluster-api-provider/doc/usage/","sidebar":"docs"},{"id":"container/deployment-examples/a/hardware","path":"/docs/container/deployment-examples/a/hardware"},{"id":"container/deployment-examples/a/index","path":"/docs/container/deployment-examples/a/"},{"id":"container/deployment-examples/a/software","path":"/docs/container/deployment-examples/a/software"},{"id":"container/guides/guide1","path":"/docs/container/guides/guide1"},{"id":"container/index","path":"/docs/container/","sidebar":"docs"},{"id":"container/overview/architecture","path":"/docs/container/overview/architecture"},{"id":"container/overview/knowledge","path":"/docs/container/overview/knowledge"},{"id":"faq/index","path":"/docs/faq/","sidebar":"docs"},{"id":"getting-started/containerization","path":"/docs/getting-started/containerization"},{"id":"getting-started/overview","path":"/docs/getting-started/overview"},{"id":"getting-started/virtualization","path":"/docs/getting-started/virtualization"},{"id":"glossary","path":"/docs/glossary","sidebar":"docs"},{"id":"iaas/components/flavor-manager","path":"/docs/iaas/components/flavor-manager","sidebar":"docs"},{"id":"iaas/components/image-manager","path":"/docs/iaas/components/image-manager","sidebar":"docs"},{"id":"iaas/components/index","path":"/docs/iaas/components/"},{"id":"iaas/components/project-manager","path":"/docs/iaas/components/project-manager"},{"id":"iaas/components/resource-manager","path":"/docs/iaas/components/resource-manager"},{"id":"iaas/components/sandbox-manager","path":"/docs/iaas/components/sandbox-manager"},{"id":"iaas/guides/configuration-guide/ceph","path":"/docs/iaas/guides/configuration-guide/ceph","sidebar":"docs"},{"id":"iaas/guides/configuration-guide/commons/index","path":"/docs/iaas/guides/configuration-guide/commons/","sidebar":"docs"},{"id":"iaas/guides/configuration-guide/commons/network","path":"/docs/iaas/guides/configuration-guide/commons/network","sidebar":"docs"},{"id":"iaas/guides/configuration-guide/commons/packages","path":"/docs/iaas/guides/configuration-guide/commons/packages","sidebar":"docs"},{"id":"iaas/guides/configuration-guide/commons/services","path":"/docs/iaas/guides/configuration-guide/commons/services","sidebar":"docs"},{"id":"iaas/guides/configuration-guide/commons/sshconfig","path":"/docs/iaas/guides/configuration-guide/commons/sshconfig","sidebar":"docs"},{"id":"iaas/guides/configuration-guide/commons/sysctl","path":"/docs/iaas/guides/configuration-guide/commons/sysctl","sidebar":"docs"},{"id":"iaas/guides/configuration-guide/commons/timezone","path":"/docs/iaas/guides/configuration-guide/commons/timezone","sidebar":"docs"},{"id":"iaas/guides/configuration-guide/configuration-repository","path":"/docs/iaas/guides/configuration-guide/configuration-repository","sidebar":"docs"},{"id":"iaas/guides/configuration-guide/index","path":"/docs/iaas/guides/configuration-guide/","sidebar":"docs"},{"id":"iaas/guides/configuration-guide/inventory","path":"/docs/iaas/guides/configuration-guide/inventory","sidebar":"docs"},{"id":"iaas/guides/configuration-guide/manager","path":"/docs/iaas/guides/configuration-guide/manager","sidebar":"docs"},{"id":"iaas/guides/configuration-guide/openstack/horizon","path":"/docs/iaas/guides/configuration-guide/openstack/horizon","sidebar":"docs"},{"id":"iaas/guides/configuration-guide/openstack/index","path":"/docs/iaas/guides/configuration-guide/openstack/","sidebar":"docs"},{"id":"iaas/guides/configuration-guide/openstack/keystone","path":"/docs/iaas/guides/configuration-guide/openstack/keystone","sidebar":"docs"},{"id":"iaas/guides/configuration-guide/proxy","path":"/docs/iaas/guides/configuration-guide/proxy","sidebar":"docs"},{"id":"iaas/guides/configuration-guide/self-signed-certificates","path":"/docs/iaas/guides/configuration-guide/self-signed-certificates","sidebar":"docs"},{"id":"iaas/guides/configuration-guide/services/index","path":"/docs/iaas/guides/configuration-guide/services/","sidebar":"docs"},{"id":"iaas/guides/deploy-guide/bootstrap","path":"/docs/iaas/guides/deploy-guide/bootstrap","sidebar":"docs"},{"id":"iaas/guides/deploy-guide/examples/cloud-in-a-box","path":"/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box","sidebar":"docs"},{"id":"iaas/guides/deploy-guide/examples/index","path":"/docs/iaas/guides/deploy-guide/examples/","sidebar":"docs"},{"id":"iaas/guides/deploy-guide/examples/testbed","path":"/docs/iaas/guides/deploy-guide/examples/testbed","sidebar":"docs"},{"id":"iaas/guides/deploy-guide/index","path":"/docs/iaas/guides/deploy-guide/","sidebar":"docs"},{"id":"iaas/guides/deploy-guide/manager","path":"/docs/iaas/guides/deploy-guide/manager","sidebar":"docs"},{"id":"iaas/guides/deploy-guide/provisioning","path":"/docs/iaas/guides/deploy-guide/provisioning","sidebar":"docs"},{"id":"iaas/guides/deploy-guide/seed","path":"/docs/iaas/guides/deploy-guide/seed","sidebar":"docs"},{"id":"iaas/guides/deploy-guide/services/ceph","path":"/docs/iaas/guides/deploy-guide/services/ceph","sidebar":"docs"},{"id":"iaas/guides/deploy-guide/services/index","path":"/docs/iaas/guides/deploy-guide/services/","sidebar":"docs"},{"id":"iaas/guides/deploy-guide/services/infrastructure","path":"/docs/iaas/guides/deploy-guide/services/infrastructure","sidebar":"docs"},{"id":"iaas/guides/deploy-guide/services/logging-monitoring","path":"/docs/iaas/guides/deploy-guide/services/logging-monitoring","sidebar":"docs"},{"id":"iaas/guides/deploy-guide/services/network","path":"/docs/iaas/guides/deploy-guide/services/network","sidebar":"docs"},{"id":"iaas/guides/deploy-guide/services/openstack","path":"/docs/iaas/guides/deploy-guide/services/openstack","sidebar":"docs"},{"id":"iaas/guides/index","path":"/docs/iaas/guides/","sidebar":"docs"},{"id":"iaas/guides/operations-guide/ceph","path":"/docs/iaas/guides/operations-guide/ceph","sidebar":"docs"},{"id":"iaas/guides/operations-guide/index","path":"/docs/iaas/guides/operations-guide/","sidebar":"docs"},{"id":"iaas/guides/operations-guide/manager/apply","path":"/docs/iaas/guides/operations-guide/manager/apply","sidebar":"docs"},{"id":"iaas/guides/operations-guide/manager/console","path":"/docs/iaas/guides/operations-guide/manager/console","sidebar":"docs"},{"id":"iaas/guides/operations-guide/manager/index","path":"/docs/iaas/guides/operations-guide/manager/","sidebar":"docs"},{"id":"iaas/guides/operations-guide/manager/log","path":"/docs/iaas/guides/operations-guide/manager/log","sidebar":"docs"},{"id":"iaas/guides/operations-guide/manager/task","path":"/docs/iaas/guides/operations-guide/manager/task","sidebar":"docs"},{"id":"iaas/guides/operations-guide/openstack/cinder","path":"/docs/iaas/guides/operations-guide/openstack/cinder","sidebar":"docs"},{"id":"iaas/guides/operations-guide/openstack/day2-operations/flavor-manager","path":"/docs/iaas/guides/operations-guide/openstack/day2-operations/flavor-manager","sidebar":"docs"},{"id":"iaas/guides/operations-guide/openstack/day2-operations/image-manager","path":"/docs/iaas/guides/operations-guide/openstack/day2-operations/image-manager","sidebar":"docs"},{"id":"iaas/guides/operations-guide/openstack/day2-operations/index","path":"/docs/iaas/guides/operations-guide/openstack/day2-operations/","sidebar":"docs"},{"id":"iaas/guides/operations-guide/openstack/day2-operations/project-manager","path":"/docs/iaas/guides/operations-guide/openstack/day2-operations/project-manager","sidebar":"docs"},{"id":"iaas/guides/operations-guide/openstack/day2-operations/resource-manager","path":"/docs/iaas/guides/operations-guide/openstack/day2-operations/resource-manager","sidebar":"docs"},{"id":"iaas/guides/operations-guide/openstack/day2-operations/sandbox-manager","path":"/docs/iaas/guides/operations-guide/openstack/day2-operations/sandbox-manager","sidebar":"docs"},{"id":"iaas/guides/operations-guide/openstack/index","path":"/docs/iaas/guides/operations-guide/openstack/","sidebar":"docs"},{"id":"iaas/guides/operations-guide/openstack/octavia","path":"/docs/iaas/guides/operations-guide/openstack/octavia","sidebar":"docs"},{"id":"iaas/guides/other-guides/contributor-guide","path":"/docs/iaas/guides/other-guides/contributor-guide","sidebar":"docs"},{"id":"iaas/guides/other-guides/developer-guide/index","path":"/docs/iaas/guides/other-guides/developer-guide/","sidebar":"docs"},{"id":"iaas/guides/other-guides/developer-guide/releases","path":"/docs/iaas/guides/other-guides/developer-guide/releases","sidebar":"docs"},{"id":"iaas/guides/other-guides/developer-guide/scripts","path":"/docs/iaas/guides/other-guides/developer-guide/scripts","sidebar":"docs"},{"id":"iaas/guides/other-guides/developer-guide/zuul-ci","path":"/docs/iaas/guides/other-guides/developer-guide/zuul-ci","sidebar":"docs"},{"id":"iaas/guides/other-guides/index","path":"/docs/iaas/guides/other-guides/","sidebar":"docs"},{"id":"iaas/guides/other-guides/style-guide","path":"/docs/iaas/guides/other-guides/style-guide","sidebar":"docs"},{"id":"iaas/guides/other-guides/zuul","path":"/docs/iaas/guides/other-guides/zuul","sidebar":"docs"},{"id":"iaas/guides/troubleshooting-guide/index","path":"/docs/iaas/guides/troubleshooting-guide/","sidebar":"docs"},{"id":"iaas/guides/troubleshooting-guide/manager","path":"/docs/iaas/guides/troubleshooting-guide/manager","sidebar":"docs"},{"id":"iaas/guides/troubleshooting-guide/openstack","path":"/docs/iaas/guides/troubleshooting-guide/openstack","sidebar":"docs"},{"id":"iaas/guides/upgrade-guide/ceph","path":"/docs/iaas/guides/upgrade-guide/ceph","sidebar":"docs"},{"id":"iaas/guides/upgrade-guide/docker","path":"/docs/iaas/guides/upgrade-guide/docker","sidebar":"docs"},{"id":"iaas/guides/upgrade-guide/index","path":"/docs/iaas/guides/upgrade-guide/","sidebar":"docs"},{"id":"iaas/guides/upgrade-guide/infrastructure","path":"/docs/iaas/guides/upgrade-guide/infrastructure","sidebar":"docs"},{"id":"iaas/guides/upgrade-guide/logging-monitoring","path":"/docs/iaas/guides/upgrade-guide/logging-monitoring","sidebar":"docs"},{"id":"iaas/guides/upgrade-guide/manager","path":"/docs/iaas/guides/upgrade-guide/manager","sidebar":"docs"},{"id":"iaas/guides/upgrade-guide/network","path":"/docs/iaas/guides/upgrade-guide/network","sidebar":"docs"},{"id":"iaas/guides/upgrade-guide/openstack","path":"/docs/iaas/guides/upgrade-guide/openstack","sidebar":"docs"},{"id":"iaas/overview/architecture","path":"/docs/iaas/overview/architecture"},{"id":"iaas/overview/compute","path":"/docs/iaas/overview/compute"},{"id":"iaas/overview/knowledge","path":"/docs/iaas/overview/knowledge"},{"id":"iaas/overview/network","path":"/docs/iaas/overview/network"},{"id":"iaas/overview/storage","path":"/docs/iaas/overview/storage"},{"id":"iam/intra-SCS-federation-setup-description-for-osism-doc-operations","path":"/docs/iam/intra-SCS-federation-setup-description-for-osism-doc-operations","sidebar":"docs"},{"id":"index","path":"/docs/","sidebar":"docs"},{"id":"operating-scs/audits/index","path":"/docs/operating-scs/audits/"},{"id":"operating-scs/components/status-page/docs/component_overview","path":"/docs/operating-scs/components/status-page/docs/component_overview","sidebar":"docs"},{"id":"operating-scs/components/status-page/docs/components","path":"/docs/operating-scs/components/status-page/docs/components","sidebar":"docs"},{"id":"operating-scs/components/status-page/docs/levels_of_consensus","path":"/docs/operating-scs/components/status-page/docs/levels_of_consensus","sidebar":"docs"},{"id":"operating-scs/components/status-page/docs/overview","path":"/docs/operating-scs/components/status-page/docs/overview","sidebar":"docs"},{"id":"operating-scs/guides/guide-1","path":"/docs/operating-scs/guides/guide-1"},{"id":"operating-scs/incident-management/index","path":"/docs/operating-scs/incident-management/"},{"id":"operating-scs/lifecycle-management/index","path":"/docs/operating-scs/lifecycle-management/"},{"id":"operating-scs/logging/index","path":"/docs/operating-scs/logging/"},{"id":"operating-scs/metering/meter_configuration","path":"/docs/operating-scs/metering/meter_configuration","sidebar":"docs"},{"id":"operating-scs/monitoring/index","path":"/docs/operating-scs/monitoring/"},{"id":"operating-scs/overview","path":"/docs/operating-scs/overview"},{"id":"releases/Release0","path":"/docs/releases/Release0","sidebar":"docs"},{"id":"releases/Release1","path":"/docs/releases/Release1","sidebar":"docs"},{"id":"releases/Release2","path":"/docs/releases/Release2","sidebar":"docs"},{"id":"releases/Release3","path":"/docs/releases/Release3","sidebar":"docs"},{"id":"releases/Release4","path":"/docs/releases/Release4","sidebar":"docs"},{"id":"releases/Release5","path":"/docs/releases/Release5","sidebar":"docs"},{"id":"releases/ReleaseX","path":"/docs/releases/ReleaseX"},{"id":"standards/index","path":"/docs/standards/"},{"id":"/category/iaas-layer","path":"/docs/category/iaas-layer","sidebar":"docs"},{"id":"/category/components","path":"/docs/category/components","sidebar":"docs"},{"id":"/category/components-1","path":"/docs/category/components-1","sidebar":"docs"},{"id":"/category/k8s-cluster-api-provider","path":"/docs/category/k8s-cluster-api-provider","sidebar":"docs"},{"id":"/category/operating-scs","path":"/docs/category/operating-scs","sidebar":"docs"},{"id":"/category/components-2","path":"/docs/category/components-2","sidebar":"docs"},{"id":"/category/status-page-api","path":"/docs/category/status-page-api","sidebar":"docs"},{"id":"/category/metering","path":"/docs/category/metering","sidebar":"docs"},{"id":"/category/identity-and-access-management-iam","path":"/docs/category/identity-and-access-management-iam","sidebar":"docs"},{"id":"/category/releases","path":"/docs/category/releases","sidebar":"docs"}],"draftIds":[],"sidebars":{"docs":{"link":{"path":"/docs/","label":"index"}}}}],"breadcrumbs":true},"community":{"path":"/community","versions":[{"name":"current","label":"Next","isLast":true,"path":"/community","mainDocId":"index","docs":[{"id":"calendar","path":"/community/calendar","sidebar":"community"},{"id":"cloud-resources/cloud-resources","path":"/community/cloud-resources/","sidebar":"community"},{"id":"cloud-resources/getting-started-openstack","path":"/community/cloud-resources/getting-started-openstack","sidebar":"community"},{"id":"cloud-resources/plusserver-gx-scs","path":"/community/cloud-resources/plusserver-gx-scs","sidebar":"community"},{"id":"cloud-resources/wavestack","path":"/community/cloud-resources/wavestack","sidebar":"community"},{"id":"collaboration","path":"/community/collaboration","sidebar":"community"},{"id":"communication/jitsi","path":"/community/communication/jitsi"},{"id":"communication/mailinglists","path":"/community/communication/mailinglists"},{"id":"communication/matrix","path":"/community/communication/matrix","sidebar":"community"},{"id":"contribute/adding-docs-guide","path":"/community/contribute/adding-docs-guide","sidebar":"community"},{"id":"contribute/doc-files-structure-guide","path":"/community/contribute/doc-files-structure-guide","sidebar":"community"},{"id":"contribute/docs-workflow-explanation","path":"/community/contribute/docs-workflow-explanation","sidebar":"community"},{"id":"contribute/linting-guide","path":"/community/contribute/linting-guide","sidebar":"community"},{"id":"contribute/local-docusaurus-development-guide","path":"/community/contribute/local-docusaurus-development-guide","sidebar":"community"},{"id":"contribute/styleguide","path":"/community/contribute/styleguide","sidebar":"community"},{"id":"contribute/styleguides/ansible_styleguide","path":"/community/contribute/styleguides/ansible_styleguide"},{"id":"github/branchprotection","path":"/community/github/branchprotection","sidebar":"community"},{"id":"github/dco-and-licenses","path":"/community/github/dco-and-licenses","sidebar":"community"},{"id":"github/tips-and-tricks","path":"/community/github/tips-and-tricks","sidebar":"community"},{"id":"hackathons/checklist","path":"/community/hackathons/checklist"},{"id":"index","path":"/community/","sidebar":"community"},{"id":"license-considerations","path":"/community/license-considerations","sidebar":"community"},{"id":"/category/contribute","path":"/community/category/contribute","sidebar":"community"}],"draftIds":[],"sidebars":{"community":{"link":{"path":"/community/","label":"index"}}}}],"breadcrumbs":true},"dev-docs":{"path":"/dev-docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/dev-docs","mainDocId":"index","docs":[{"id":"index","path":"/dev-docs/","sidebar":"devDocs"},{"id":"operations/iam/identity-federation-in-scs","path":"/dev-docs/operations/iam/identity-federation-in-scs","sidebar":"devDocs"},{"id":"operations/iam/openstack-federation-via-oidc","path":"/dev-docs/operations/iam/openstack-federation-via-oidc","sidebar":"devDocs"},{"id":"operations/operations/zuul-ci-cd-quickstart-user-guide","path":"/dev-docs/operations/operations/zuul-ci-cd-quickstart-user-guide","sidebar":"devDocs"}],"draftIds":[],"sidebars":{"devDocs":{"link":{"path":"/dev-docs/","label":"index"}}}}],"breadcrumbs":true},"standards":{"path":"/standards","versions":[{"name":"current","label":"Next","isLast":true,"path":"/standards","mainDocId":"index","docs":[{"id":"certification/certified-clouds","path":"/standards/certification/certified-clouds"},{"id":"certification/get-certified","path":"/standards/certification/get-certified"},{"id":"certification/overview","path":"/standards/certification/overview","sidebar":"standards"},{"id":"certification/subjects-versions","path":"/standards/certification/subjects-versions"},{"id":"global/index","path":"/standards/global/","sidebar":"standards"},{"id":"global/scs-0001","path":"/standards/global/scs-0001","sidebar":"standards"},{"id":"global/scs-0002","path":"/standards/global/scs-0002","sidebar":"standards"},{"id":"global/scs-0003","path":"/standards/global/scs-0003","sidebar":"standards"},{"id":"iaas/index","path":"/standards/iaas/","sidebar":"standards"},{"id":"iaas/scs-0100","path":"/standards/iaas/scs-0100","sidebar":"standards"},{"id":"iaas/scs-0101","path":"/standards/iaas/scs-0101","sidebar":"standards"},{"id":"iaas/scs-0102","path":"/standards/iaas/scs-0102","sidebar":"standards"},{"id":"iaas/scs-0103","path":"/standards/iaas/scs-0103","sidebar":"standards"},{"id":"iaas/scs-0104","path":"/standards/iaas/scs-0104","sidebar":"standards"},{"id":"iam/index","path":"/standards/iam/","sidebar":"standards"},{"id":"iam/scs-0300","path":"/standards/iam/scs-0300","sidebar":"standards"},{"id":"index","path":"/standards/","sidebar":"standards"},{"id":"kaas/index","path":"/standards/kaas/","sidebar":"standards"},{"id":"kaas/scs-0210","path":"/standards/kaas/scs-0210","sidebar":"standards"},{"id":"kaas/scs-0211","path":"/standards/kaas/scs-0211","sidebar":"standards"},{"id":"ops/index","path":"/standards/ops/","sidebar":"standards"},{"id":"ops/scs-0412","path":"/standards/ops/scs-0412","sidebar":"standards"},{"id":"scs-0001-v1-sovereign-cloud-standards","path":"/standards/scs-0001-v1-sovereign-cloud-standards","sidebar":"standards"},{"id":"scs-0002-v1-standards-docs-org","path":"/standards/scs-0002-v1-standards-docs-org","sidebar":"standards"},{"id":"scs-0002-v2-standards-docs-org","path":"/standards/scs-0002-v2-standards-docs-org","sidebar":"standards"},{"id":"scs-0003-v1-sovereign-cloud-standards-yaml","path":"/standards/scs-0003-v1-sovereign-cloud-standards-yaml","sidebar":"standards"},{"id":"scs-0100-v1-flavor-naming","path":"/standards/scs-0100-v1-flavor-naming","sidebar":"standards"},{"id":"scs-0100-v2-flavor-naming","path":"/standards/scs-0100-v2-flavor-naming","sidebar":"standards"},{"id":"scs-0100-v3-flavor-naming","path":"/standards/scs-0100-v3-flavor-naming","sidebar":"standards"},{"id":"scs-0101-v1-entropy","path":"/standards/scs-0101-v1-entropy","sidebar":"standards"},{"id":"scs-0102-v1-image-metadata","path":"/standards/scs-0102-v1-image-metadata","sidebar":"standards"},{"id":"scs-0103-v1-standard-flavors","path":"/standards/scs-0103-v1-standard-flavors","sidebar":"standards"},{"id":"scs-0104-v1-standard-images","path":"/standards/scs-0104-v1-standard-images","sidebar":"standards"},{"id":"scs-0110-v1-ssd-flavors","path":"/standards/scs-0110-v1-ssd-flavors","sidebar":"standards"},{"id":"scs-0111-v1-volume-type-decisions","path":"/standards/scs-0111-v1-volume-type-decisions","sidebar":"standards"},{"id":"scs-0210-v1-k8s-new-version-policy","path":"/standards/scs-0210-v1-k8s-new-version-policy","sidebar":"standards"},{"id":"scs-0210-v2-k8s-version-policy","path":"/standards/scs-0210-v2-k8s-version-policy"},{"id":"scs-0211-v1-kaas-default-storage-class","path":"/standards/scs-0211-v1-kaas-default-storage-class","sidebar":"standards"},{"id":"scs-0212-v1-requirements-for-container-registry","path":"/standards/scs-0212-v1-requirements-for-container-registry","sidebar":"standards"},{"id":"scs-0213-v1-k8s-nodes-anti-affinity","path":"/standards/scs-0213-v1-k8s-nodes-anti-affinity","sidebar":"standards"},{"id":"scs-0213-v1-requirements-for-testing-cluster-stacks","path":"/standards/scs-0213-v1-requirements-for-testing-cluster-stacks"},{"id":"scs-0214-v1-k8s-node-distribution","path":"/standards/scs-0214-v1-k8s-node-distribution"},{"id":"scs-0300-v1-requirements-for-sso-identity-federation","path":"/standards/scs-0300-v1-requirements-for-sso-identity-federation","sidebar":"standards"},{"id":"scs-0301-v1-naming-conventions","path":"/standards/scs-0301-v1-naming-conventions","sidebar":"standards"},{"id":"scs-0302-v1-domain-manager-role","path":"/standards/scs-0302-v1-domain-manager-role"},{"id":"scs-0400-v1-status-page-create-decision","path":"/standards/scs-0400-v1-status-page-create-decision","sidebar":"standards"},{"id":"scs-0401-v1-status-page-reference-implementation-decision","path":"/standards/scs-0401-v1-status-page-reference-implementation-decision","sidebar":"standards"},{"id":"scs-0402-v1-status-page-openapi-spec-decision","path":"/standards/scs-0402-v1-status-page-openapi-spec-decision","sidebar":"standards"},{"id":"scs-0410-v1-gnocchi-as-metering-database","path":"/standards/scs-0410-v1-gnocchi-as-metering-database","sidebar":"standards"},{"id":"scs-0411-v1-publishing_method_for_metering_data","path":"/standards/scs-0411-v1-publishing_method_for_metering_data","sidebar":"standards"},{"id":"scs-0412-v1-metering-json","path":"/standards/scs-0412-v1-metering-json","sidebar":"standards"},{"id":"scs-XXXX-vN-template","path":"/standards/scs-XXXX-vN-template"},{"id":"standards/overview","path":"/standards/standards/overview","sidebar":"standards"},{"id":"decision-records","path":"/standards/decision-records","sidebar":"standards"},{"id":"scs-0110","path":"/standards/scs-0110","sidebar":"standards"},{"id":"standards/scs-0111","path":"/standards/standards/scs-0111","sidebar":"standards"},{"id":"standards/scs-0212","path":"/standards/standards/scs-0212","sidebar":"standards"},{"id":"standards/scs-0213","path":"/standards/standards/scs-0213","sidebar":"standards"},{"id":"standards/scs-0301","path":"/standards/standards/scs-0301","sidebar":"standards"},{"id":"standards/scs-0400","path":"/standards/standards/scs-0400","sidebar":"standards"},{"id":"standards/scs-0401","path":"/standards/standards/scs-0401","sidebar":"standards"},{"id":"standards/scs-0402","path":"/standards/standards/scs-0402","sidebar":"standards"},{"id":"standards/scs-0410","path":"/standards/standards/scs-0410","sidebar":"standards"},{"id":"standards/scs-0411","path":"/standards/standards/scs-0411","sidebar":"standards"}],"draftIds":[],"sidebars":{"standards":{"link":{"path":"/standards/","label":"index"}}}}],"breadcrumbs":true}}}'),s=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var i=n(57529);const c=JSON.parse('{"docusaurusVersion":"2.4.3","siteVersion":"1.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.4.3"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"2.4.3"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.4.3"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.4.3"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.4.3"},"docusaurus-plugin-client-redirects":{"type":"package","name":"@docusaurus/plugin-client-redirects","version":"2.4.3"},"docusaurus-plugin-matomo-analytics":{"type":"project"},"docusaurus-theme-mermaid":{"type":"package","name":"@docusaurus/theme-mermaid","version":"2.4.3"},"@easyops-cn/docusaurus-search-local":{"type":"package","name":"@easyops-cn/docusaurus-search-local","version":"0.33.6"}}}'),d={siteConfig:r.default,siteMetadata:c,globalData:o,i18n:s,codeTranslations:i},l=a.createContext(d);function u(e){let{children:t}=e;return a.createElement(l.Provider,{value:d},t)}},44763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var a=n(67294),r=n(10412),o=n(35742),s=n(18780),i=n(70179);function c(e){let{error:t,tryAgain:n}=e;return a.createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"}},a.createElement("h1",{style:{fontSize:"3rem"}},"This page crashed"),a.createElement("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"}},"Try again"),a.createElement(d,{error:t}))}function d(e){let{error:t}=e;const n=(0,s.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return a.createElement("p",{style:{whiteSpace:"pre-wrap"}},n)}function l(e){let{error:t,tryAgain:n}=e;return a.createElement(p,{fallback:()=>a.createElement(c,{error:t,tryAgain:n})},a.createElement(o.Z,null,a.createElement("title",null,"Page Error")),a.createElement(i.Z,null,a.createElement(c,{error:t,tryAgain:n})))}const u=e=>a.createElement(l,e);class p extends a.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){r.Z.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??u)(e)}return e??null}}},10412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const a="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,r={canUseDOM:a,canUseEventListeners:a&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:a&&"IntersectionObserver"in window,canUseViewport:a&&"screen"in window}},35742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var a=n(67294),r=n(70405);function o(e){return a.createElement(r.ql,e)}},39960:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var a=n(87462),r=n(67294),o=n(73727),s=n(18780),i=n(52263),c=n(13919),d=n(10412);const l=r.createContext({collectLink:()=>{}});var u=n(44996);function p(e,t){let{isNavLink:n,to:p,href:f,activeClassName:m,isActive:g,"data-noBrokenLinkCheck":h,autoAddBaseUrl:b=!0,...v}=e;const{siteConfig:{trailingSlash:y,baseUrl:k}}=(0,i.Z)(),{withBaseUrl:w}=(0,u.C)(),x=(0,r.useContext)(l),E=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>E.current));const _=p||f;const S=(0,c.Z)(_),C=_?.replace("pathname://","");let T=void 0!==C?(L=C,b&&(e=>e.startsWith("/"))(L)?w(L):L):void 0;var L;T&&S&&(T=(0,s.applyTrailingSlash)(T,{trailingSlash:y,baseUrl:k}));const P=(0,r.useRef)(!1),R=n?o.OL:o.rU,O=d.Z.canUseIntersectionObserver,N=(0,r.useRef)(),I=()=>{P.current||null==T||(window.docusaurus.preload(T),P.current=!0)};(0,r.useEffect)((()=>(!O&&S&&null!=T&&window.docusaurus.prefetch(T),()=>{O&&N.current&&N.current.disconnect()})),[N,T,O,S]);const A=T?.startsWith("#")??!1,D=!T||!S||A;return D||h||x.collectLink(T),D?r.createElement("a",(0,a.Z)({ref:E,href:T},_&&!S&&{target:"_blank",rel:"noopener noreferrer"},v)):r.createElement(R,(0,a.Z)({},v,{onMouseEnter:I,onTouchStart:I,innerRef:e=>{E.current=e,O&&e&&S&&(N.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(N.current.unobserve(e),N.current.disconnect(),null!=T&&window.docusaurus.prefetch(T))}))})),N.current.observe(e))},to:T},n&&{isActive:g,activeClassName:m}))}const f=r.forwardRef(p)},95999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c,I:()=>i});var a=n(67294);function r(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,a.isValidElement)(e)))?n.map(((e,t)=>(0,a.isValidElement)(e)?a.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var o=n(57529);function s(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return o[t??n]??n??t}function i(e,t){let{message:n,id:a}=e;return r(s({message:n,id:a}),t)}function c(e){let{children:t,id:n,values:o}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal <Translate> children",t),new Error("The Docusaurus <Translate> component only accept simple string values");const i=s({message:t,id:n});return a.createElement(a.Fragment,null,r(i,o))}},29935:(e,t,n)=>{"use strict";n.d(t,{m:()=>a});const a="default"},13919:(e,t,n)=>{"use strict";function a(e){return/^(?:\w*:|\/\/)/.test(e)}function r(e){return void 0!==e&&!a(e)}n.d(t,{Z:()=>r,b:()=>a})},44996:(e,t,n)=>{"use strict";n.d(t,{C:()=>s,Z:()=>i});var a=n(67294),r=n(52263),o=n(13919);function s(){const{siteConfig:{baseUrl:e,url:t}}=(0,r.Z)(),n=(0,a.useCallback)(((n,a)=>function(e,t,n,a){let{forcePrependBaseUrl:r=!1,absolute:s=!1}=void 0===a?{}:a;if(!n||n.startsWith("#")||(0,o.b)(n))return n;if(r)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const i=n.startsWith(t)?n:t+n.replace(/^\//,"");return s?e+i:i}(t,e,n,a)),[t,e]);return{withBaseUrl:n}}function i(e,t){void 0===t&&(t={});const{withBaseUrl:n}=s();return n(e,t)}},52263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var a=n(67294),r=n(58940);function o(){return(0,a.useContext)(r._)}},72389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var a=n(67294),r=n(98934);function o(){return(0,a.useContext)(r._)}},99670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const a=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function r(e){const t={};return function e(n,r){Object.entries(n).forEach((n=>{let[o,s]=n;const i=r?`${r}.${o}`:o;a(s)?e(s,i):t[i]=s}))}(e),t}},30226:(e,t,n)=>{"use strict";n.d(t,{_:()=>r,z:()=>o});var a=n(67294);const r=a.createContext(null);function o(e){let{children:t,value:n}=e;const o=a.useContext(r),s=(0,a.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const a={...t.data,...n?.data};return{plugin:t.plugin,data:a}}({parent:o,value:n})),[o,n]);return a.createElement(r.Provider,{value:s},t)}},80143:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>g,gA:()=>p,_r:()=>l,Jo:()=>h,zh:()=>u,yW:()=>m,gB:()=>f});var a=n(16550),r=n(52263),o=n(29935);function s(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,r.Z)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const i=e=>e.versions.find((e=>e.isLast));function c(e,t){const n=function(e,t){const n=i(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,a.LX)(t,{path:e.path,exact:!1,strict:!1})))}(e,t),r=n?.docs.find((e=>!!(0,a.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:r,alternateDocVersions:r?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((a=>{a.id===t&&(n[e.name]=a)}))})),n}(r.id):{}}}const d={},l=()=>s("docusaurus-plugin-content-docs")??d,u=e=>function(e,t,n){void 0===t&&(t=o.m),void 0===n&&(n={});const a=s(e),r=a?.[t];if(!r&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return r}("docusaurus-plugin-content-docs",e,{failfast:!0});function p(e){void 0===e&&(e={});const t=l(),{pathname:n}=(0,a.TH)();return function(e,t,n){void 0===n&&(n={});const r=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,a.LX)(t,{path:n.path,exact:!1,strict:!1})})),o=r?{pluginId:r[0],pluginData:r[1]}:void 0;if(!o&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return o}(t,n,e)}function f(e){return u(e).versions}function m(e){const t=u(e);return i(t)}function g(e){const t=u(e),{pathname:n}=(0,a.TH)();return c(t,n)}function h(e){const t=u(e),{pathname:n}=(0,a.TH)();return function(e,t){const n=i(e);return{latestDocSuggestion:c(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},18320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var a=n(74865),r=n.n(a);r().configure({showSpinner:!1});const o={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{r().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){r().done()}}},3310:(e,t,n)=>{"use strict";n.r(t);var a=n(87410),r=n(36809);!function(e){const{themeConfig:{prism:t}}=r.default,{additionalLanguages:a}=t;globalThis.Prism=e,a.forEach((e=>{n(56646)(`./prism-${e}`)})),delete globalThis.Prism}(a.Z)},39471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var a=n(67294);const r={iconExternalLink:"iconExternalLink_nPIU"};function o(e){let{width:t=13.5,height:n=13.5}=e;return a.createElement("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink},a.createElement("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"}))}},70179:(e,t,n)=>{"use strict";n.d(t,{Z:()=>Nt});var a=n(67294),r=n(86010),o=n(44763),s=n(1944),i=n(87462),c=n(16550),d=n(95999),l=n(85936);const u="__docusaurus_skipToContent_fallback";function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){const e=(0,a.useRef)(null),{action:t}=(0,c.k6)(),n=(0,a.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(u);t&&p(t)}),[]);return(0,l.S)((n=>{let{location:a}=n;e.current&&!a.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const m=(0,d.I)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function g(e){const t=e.children??m,{containerRef:n,onClick:r}=f();return a.createElement("div",{ref:n,role:"region","aria-label":m},a.createElement("a",(0,i.Z)({},e,{href:`#${u}`,onClick:r}),t))}var h=n(35281),b=n(19727);const v={skipToContent:"skipToContent_fXgn"};function y(){return a.createElement(g,{className:v.skipToContent})}var k=n(86668),w=n(59689);function x(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:o=1.2,className:s,...c}=e;return a.createElement("svg",(0,i.Z)({viewBox:"0 0 15 15",width:t,height:n},c),a.createElement("g",{stroke:r,strokeWidth:o},a.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const E={closeButton:"closeButton_CVFx"};function _(e){return a.createElement("button",(0,i.Z)({type:"button","aria-label":(0,d.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"})},e,{className:(0,r.Z)("clean-btn close",E.closeButton,e.className)}),a.createElement(x,{width:14,height:14,strokeWidth:3.1}))}const S={content:"content_knG7"};function C(e){const{announcementBar:t}=(0,k.L)(),{content:n}=t;return a.createElement("div",(0,i.Z)({},e,{className:(0,r.Z)(S.content,e.className),dangerouslySetInnerHTML:{__html:n}}))}const T={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function L(){const{announcementBar:e}=(0,k.L)(),{isActive:t,close:n}=(0,w.nT)();if(!t)return null;const{backgroundColor:r,textColor:o,isCloseable:s}=e;return a.createElement("div",{className:T.announcementBar,style:{backgroundColor:r,color:o},role:"banner"},s&&a.createElement("div",{className:T.announcementBarPlaceholder}),a.createElement(C,{className:T.announcementBarContent}),s&&a.createElement(_,{onClick:n,className:T.announcementBarClose}))}var P=n(93163),R=n(12466);var O=n(902),N=n(13102);const I=a.createContext(null);function A(e){let{children:t}=e;const n=function(){const e=(0,P.e)(),t=(0,N.HY)(),[n,r]=(0,a.useState)(!1),o=null!==t.component,s=(0,O.D9)(o);return(0,a.useEffect)((()=>{o&&!s&&r(!0)}),[o,s]),(0,a.useEffect)((()=>{o?e.shown||r(!0):r(!1)}),[e.shown,o]),(0,a.useMemo)((()=>[n,r]),[n])}();return a.createElement(I.Provider,{value:n},t)}function D(e){if(e.component){const t=e.component;return a.createElement(t,e.props)}}function M(){const e=(0,a.useContext)(I);if(!e)throw new O.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,r=(0,a.useCallback)((()=>n(!1)),[n]),o=(0,N.HY)();return(0,a.useMemo)((()=>({shown:t,hide:r,content:D(o)})),[r,o,t])}function F(e){let{header:t,primaryMenu:n,secondaryMenu:o}=e;const{shown:s}=M();return a.createElement("div",{className:"navbar-sidebar"},t,a.createElement("div",{className:(0,r.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":s})},a.createElement("div",{className:"navbar-sidebar__item menu"},n),a.createElement("div",{className:"navbar-sidebar__item menu"},o)))}var B=n(92949),j=n(72389);function z(e){return a.createElement("svg",(0,i.Z)({viewBox:"0 0 24 24",width:24,height:24},e),a.createElement("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"}))}function $(e){return a.createElement("svg",(0,i.Z)({viewBox:"0 0 24 24",width:24,height:24},e),a.createElement("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"}))}const U={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function H(e){let{className:t,buttonClassName:n,value:o,onChange:s}=e;const i=(0,j.Z)(),c=(0,d.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===o?(0,d.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,d.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return a.createElement("div",{className:(0,r.Z)(U.toggle,t)},a.createElement("button",{className:(0,r.Z)("clean-btn",U.toggleButton,!i&&U.toggleButtonDisabled,n),type:"button",onClick:()=>s("dark"===o?"light":"dark"),disabled:!i,title:c,"aria-label":c,"aria-live":"polite"},a.createElement(z,{className:(0,r.Z)(U.toggleIcon,U.lightToggleIcon)}),a.createElement($,{className:(0,r.Z)(U.toggleIcon,U.darkToggleIcon)})))}const Z=a.memo(H),Q={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function V(e){let{className:t}=e;const n=(0,k.L)().navbar.style,r=(0,k.L)().colorMode.disableSwitch,{colorMode:o,setColorMode:s}=(0,B.I)();return r?null:a.createElement(Z,{className:t,buttonClassName:"dark"===n?Q.darkNavbarColorModeToggle:void 0,value:o,onChange:s})}var q=n(21327);function G(){return a.createElement(q.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function W(){const e=(0,P.e)();return a.createElement("button",{type:"button","aria-label":(0,d.I)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle()},a.createElement(x,{color:"var(--ifm-color-emphasis-600)"}))}function X(){return a.createElement("div",{className:"navbar-sidebar__brand"},a.createElement(G,null),a.createElement(V,{className:"margin-right--md"}),a.createElement(W,null))}var Y=n(39960),K=n(44996),J=n(13919);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(39471);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:o,label:s,html:c,isDropdownLink:d,prependBaseUrlToHref:l,...u}=e;const p=(0,K.Z)(r),f=(0,K.Z)(t),m=(0,K.Z)(o,{forcePrependBaseUrl:!0}),g=s&&o&&!(0,J.Z)(o),h=c?{dangerouslySetInnerHTML:{__html:c}}:{children:a.createElement(a.Fragment,null,s,g&&a.createElement(te.Z,d&&{width:12,height:12}))};return o?a.createElement(Y.Z,(0,i.Z)({href:l?m:o},u,h)):a.createElement(Y.Z,(0,i.Z)({to:p,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(f)},u,h))}function ae(e){let{className:t,isDropdownItem:n=!1,...o}=e;const s=a.createElement(ne,(0,i.Z)({className:(0,r.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n},o));return n?a.createElement("li",null,s):s}function re(e){let{className:t,isDropdownItem:n,...o}=e;return a.createElement("li",{className:"menu__list-item"},a.createElement(ne,(0,i.Z)({className:(0,r.Z)("menu__link",t)},o)))}function oe(e){let{mobile:t=!1,position:n,...r}=e;const o=t?re:ae;return a.createElement(o,(0,i.Z)({},r,{activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")}))}var se=n(86043),ie=n(48596),ce=n(52263);function de(e,t){return e.some((e=>function(e,t){return!!(0,ie.Mg)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function le(e){let{items:t,position:n,className:o,onClick:s,...c}=e;const d=(0,a.useRef)(null),[l,u]=(0,a.useState)(!1);return(0,a.useEffect)((()=>{const e=e=>{d.current&&!d.current.contains(e.target)&&u(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[d]),a.createElement("div",{ref:d,className:(0,r.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":l})},a.createElement(ne,(0,i.Z)({"aria-haspopup":"true","aria-expanded":l,role:"button",href:c.to?void 0:"#",className:(0,r.Z)("navbar__link",o)},c,{onClick:c.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),u(!l))}}),c.children??c.label),a.createElement("ul",{className:"dropdown__menu"},t.map(((e,t)=>a.createElement(Qe,(0,i.Z)({isDropdownItem:!0,activeClassName:"dropdown__link--active"},e,{key:t}))))))}function ue(e){let{items:t,className:n,position:o,onClick:s,...d}=e;const l=function(){const{siteConfig:{baseUrl:e}}=(0,ce.Z)(),{pathname:t}=(0,c.TH)();return t.replace(e,"/")}(),u=de(t,l),{collapsed:p,toggleCollapsed:f,setCollapsed:m}=(0,se.u)({initialState:()=>!u});return(0,a.useEffect)((()=>{u&&m(!u)}),[l,u,m]),a.createElement("li",{className:(0,r.Z)("menu__list-item",{"menu__list-item--collapsed":p})},a.createElement(ne,(0,i.Z)({role:"button",className:(0,r.Z)("menu__link menu__link--sublist menu__link--sublist-caret",n)},d,{onClick:e=>{e.preventDefault(),f()}}),d.children??d.label),a.createElement(se.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:p},t.map(((e,t)=>a.createElement(Qe,(0,i.Z)({mobile:!0,isDropdownItem:!0,onClick:s,activeClassName:"menu__link--active"},e,{key:t}))))))}function pe(e){let{mobile:t=!1,...n}=e;const r=t?ue:le;return a.createElement(r,n)}var fe=n(94711);function me(e){let{width:t=20,height:n=20,...r}=e;return a.createElement("svg",(0,i.Z)({viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0},r),a.createElement("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"}))}const ge="iconLanguage_nlXk";var he=n(61029),be=n(10412),ve=n(60373),ye=n(80143),ke=n(90022),we=n(98202),xe=n(73926),Ee=n(91073),_e=n(82539),Se=n(10726);const Ce='<svg width="20" height="20" viewBox="0 0 20 20"><path d="M17 6v12c0 .52-.2 1-1 1H4c-.7 0-1-.33-1-1V2c0-.55.42-1 1-1h8l5 5zM14 8h-3.13c-.51 0-.87-.34-.87-.87V4" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linejoin="round"></path></svg>',Te='<svg width="20" height="20" viewBox="0 0 20 20"><path d="M13 13h4-4V8H7v5h6v4-4H7V8H3h4V3v5h6V3v5h4-4v5zm-6 0v4-4H3h4z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg>',Le='<svg width="20" height="20" viewBox="0 0 20 20"><path d="M17 5H3h14zm0 5H3h14zm0 5H3h14z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linejoin="round"></path></svg>',Pe='<svg width="20" height="20" viewBox="0 0 20 20"><g stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"><path d="M18 3v4c0 2-2 4-4 4H2"></path><path d="M8 17l-6-6 6-6"></path></g></svg>',Re='<svg width="40" height="40" viewBox="0 0 20 20" fill="none" fill-rule="evenodd" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"><path d="M15.5 4.8c2 3 1.7 7-1 9.7h0l4.3 4.3-4.3-4.3a7.8 7.8 0 01-9.8 1m-2.2-2.2A7.8 7.8 0 0113.2 2.4M2 18L18 2"></path></svg>',Oe='<svg viewBox="0 0 24 54"><g stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"><path d="M8 6v42M20 27H8.3"></path></g></svg>',Ne='<svg viewBox="0 0 24 54"><g stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"><path d="M8 6v21M20 27H8.3"></path></g></svg>',Ie={searchBar:"searchBar_RVTs",dropdownMenu:"dropdownMenu_qbY6",searchBarLeft:"searchBarLeft_MXDe",suggestion:"suggestion_fB_2",cursor:"cursor_eG29",hitTree:"hitTree_kk6K",hitIcon:"hitIcon_a7Zy",hitPath:"hitPath_ieM4",noResultsIcon:"noResultsIcon_EBY5",hitFooter:"hitFooter_E9YW",hitWrapper:"hitWrapper_sAK8",hitTitle:"hitTitle_vyVt",hitAction:"hitAction_NqkB",hideAction:"hideAction_vcyE",noResults:"noResults_l6Q3",searchBarContainer:"searchBarContainer_NW3z",searchBarLoadingRing:"searchBarLoadingRing_YnHq",searchClearButton:"searchClearButton_qk4g",searchIndexLoading:"searchIndexLoading_EJ1f",searchHintContainer:"searchHintContainer_Pkmr",searchHint:"searchHint_iIMx",focused:"focused_OWtg",input:"input_FOTf",hint:"hint_URu1",suggestions:"suggestions_X8XU",dataset:"dataset_QiCy",empty:"empty_eITn"};function Ae(e){let{document:t,type:n,page:a,metadata:r,tokens:o,isInterOfTree:s,isLastOfTree:i}=e;const c=0===n,d=1===n,l=[];s?l.push(Oe):i&&l.push(Ne);const u=l.map((e=>`<span class="${Ie.hitTree}">${e}</span>`)),p=`<span class="${Ie.hitIcon}">${c?Ce:d?Te:Le}</span>`,f=[`<span class="${Ie.hitTitle}">${(0,Se.o)(t.t,(0,Ee.m)(r,"t"),o)}</span>`];if(!s&&!i&&he.H6){const e=a?(a.b??[]).concat(a.t).concat(t.s&&t.s!==a.t?t.s:[]):t.b;f.push(`<span class="${Ie.hitPath}">${(0,xe.e)(e??[])}</span>`)}else c||f.push(`<span class="${Ie.hitPath}">${(0,_e.C)(a.t||(t.u.startsWith("/docs/api-reference/")?"API Reference":""),o)}</span>`);const m=`<span class="${Ie.hitAction}">${Pe}</span>`;return[...u,p,`<span class="${Ie.hitWrapper}">`,...f,"</span>",m].join("")}function De(){return`<span class="${Ie.noResults}"><span class="${Ie.noResultsIcon}">${Re}</span><span>${(0,d.I)({id:"theme.SearchBar.noResultsText",message:"No results"})}</span></span>`}var Me=n(80311);async function Fe(){const e=await Promise.all([n.e(8443),n.e(5525)]).then(n.t.bind(n,68443,23)),t=e.default;return t.noConflict?t.noConflict():e.noConflict&&e.noConflict(),t}const Be="_highlight";const je=function(e){let{handleSearchBarToggle:t}=e;const{siteConfig:{baseUrl:n}}=(0,ce.Z)(),o=(0,ye.gA)();let s=n;try{const{preferredVersion:e}=(0,ve.J)(o?.pluginId??he.gQ);e&&!e.isLast&&(s=e.path+"/")}catch(D){if(he.l9&&!(D instanceof O.i6))throw D}const i=(0,c.k6)(),l=(0,c.TH)(),u=(0,a.useRef)(null),p=(0,a.useRef)(new Map),f=(0,a.useRef)(!1),[m,g]=(0,a.useState)(!1),[h,b]=(0,a.useState)(!1),[v,y]=(0,a.useState)(""),k=(0,a.useRef)(null),w=(0,a.useRef)(""),[x,E]=(0,a.useState)("");(0,a.useEffect)((()=>{if(!Array.isArray(he.Kc))return;let e="";if(l.pathname.startsWith(s)){const t=l.pathname.substring(s.length),n=he.Kc.find((e=>t===e||t.startsWith(`${e}/`)));n&&(e=n)}w.current!==e&&(p.current.delete(e),w.current=e),E(e)}),[l.pathname,s]);const _=!!he.hG&&Array.isArray(he.Kc)&&""===x,S=(0,a.useCallback)((async()=>{if(_||p.current.get(x))return;p.current.set(x,"loading"),k.current?.autocomplete.destroy(),g(!0);const[{wrappedIndexes:e,zhDictionary:t},a]=await Promise.all([(0,ke.w)(s,x),Fe()]);if(k.current=a(u.current,{hint:!1,autoselect:!0,openOnFocus:!0,cssClasses:{root:(0,r.Z)(Ie.searchBar,{[Ie.searchBarLeft]:"left"===he.pu}),noPrefix:!0,dropdownMenu:Ie.dropdownMenu,input:Ie.input,hint:Ie.hint,suggestions:Ie.suggestions,suggestion:Ie.suggestion,cursor:Ie.cursor,dataset:Ie.dataset,empty:Ie.empty}},[{source:(0,we.v)(e,t,he.qo),templates:{suggestion:Ae,empty:De,footer:e=>{let{query:t,isEmpty:a}=e;if(a)return;const r=document.createElement("a"),o=new URLSearchParams;if(o.set("q",t),Array.isArray(he.Kc)&&o.set("ctx",x),s!==n){if(!s.startsWith(n))throw new Error(`Version url '${s}' does not start with base url '${n}', this is a bug of \`@easyops-cn/docusaurus-search-local\`, please report it.`);o.set("version",s.substring(n.length))}const c=`${n}search?${o.toString()}`;r.href=c,r.textContent=(0,d.I)({id:"theme.SearchBar.seeAll",message:"See all results"}),r.addEventListener("click",(e=>{e.ctrlKey||e.metaKey||(e.preventDefault(),k.current?.autocomplete.close(),i.push(c))}));const l=document.createElement("div");return l.className=Ie.hitFooter,l.appendChild(r),l}}}]).on("autocomplete:selected",(function(e,t){let{document:{u:n,h:a},tokens:r}=t;u.current?.blur();let o=n;if(he.vc&&r.length>0){const e=new URLSearchParams;for(const t of r)e.append(Be,t);o+=`?${e.toString()}`}a&&(o+=a),i.push(o)})).on("autocomplete:closed",(()=>{u.current?.blur()})),p.current.set(x,"done"),g(!1),f.current){const e=u.current;e.value&&k.current?.autocomplete.open(),e.focus()}}),[_,x,s,n,i]);(0,a.useEffect)((()=>{if(!he.vc)return;const e=be.Z.canUseDOM?new URLSearchParams(l.search).getAll(Be):[];setTimeout((()=>{const t=document.querySelector("article");if(!t)return;const n=new he.vc(t);n.unmark(),0!==e.length&&n.mark(e),y(e.join(" ")),k.current?.autocomplete.setVal(e.join(" "))}))}),[l.search,l.pathname]);const[C,T]=(0,a.useState)(!1),L=(0,a.useCallback)((()=>{f.current=!0,S(),T(!0),t?.(!0)}),[t,S]),P=(0,a.useCallback)((()=>{T(!1),t?.(!1)}),[t]),R=(0,a.useCallback)((()=>{S()}),[S]),N=(0,a.useCallback)((e=>{y(e.target.value),e.target.value&&b(!0)}),[]),I=!!be.Z.canUseDOM&&/mac/i.test(navigator.userAgentData?.platform??navigator.platform);(0,a.useEffect)((()=>{if(!he.AY)return;const e=e=>{!(I?e.metaKey:e.ctrlKey)||"k"!==e.key&&"K"!==e.key||(e.preventDefault(),u.current?.focus(),L())};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}}),[I,L]);const A=(0,a.useCallback)((()=>{const e=new URLSearchParams(l.search);e.delete(Be);const t=e.toString(),n=l.pathname+(""!=t?`?${t}`:"")+l.hash;n!=l.pathname+l.search+l.hash&&i.push(n),y(""),k.current?.autocomplete.setVal("")}),[l.pathname,l.search,l.hash,i]);return a.createElement("div",{className:(0,r.Z)("navbar__search",Ie.searchBarContainer,{[Ie.searchIndexLoading]:m&&h,[Ie.focused]:C}),hidden:_},a.createElement("input",{placeholder:(0,d.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),"aria-label":"Search",className:"navbar__search-input",onMouseEnter:R,onFocus:L,onBlur:P,onChange:N,ref:u,value:v}),a.createElement(Me.Z,{className:Ie.searchBarLoadingRing}),he.AY&&he.t_&&(""!==v?a.createElement("button",{className:Ie.searchClearButton,onClick:A},"\u2715"):be.Z.canUseDOM&&a.createElement("div",{className:Ie.searchHintContainer},a.createElement("kbd",{className:Ie.searchHint},I?"\u2318":"ctrl"),a.createElement("kbd",{className:Ie.searchHint},"K"))))},ze={searchBox:"searchBox_ZlJk"};function $e(e){let{children:t,className:n}=e;return a.createElement("div",{className:(0,r.Z)(n,ze.searchBox)},t)}var Ue=n(53438);const He=e=>e.docs.find((t=>t.id===e.mainDocId));const Ze={default:oe,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,...o}=e;const{i18n:{currentLocale:s,locales:l,localeConfigs:u}}=(0,ce.Z)(),p=(0,fe.l)(),{search:f,hash:m}=(0,c.TH)(),g=[...n,...l.map((e=>{const n=`${`pathname://${p.createUrl({locale:e,fullyQualified:!1})}`}${f}${m}`;return{label:u[e].label,lang:u[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===s?t?"menu__link--active":"dropdown__link--active":""}})),...r],h=t?(0,d.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):u[s].label;return a.createElement(pe,(0,i.Z)({},o,{mobile:t,label:a.createElement(a.Fragment,null,a.createElement(me,{className:ge}),h),items:g}))},search:function(e){let{mobile:t,className:n}=e;return t?null:a.createElement($e,{className:n},a.createElement(je,null))},dropdown:pe,html:function(e){let{value:t,className:n,mobile:o=!1,isDropdownItem:s=!1}=e;const i=s?"li":"div";return a.createElement(i,{className:(0,r.Z)({navbar__item:!o&&!s,"menu__list-item":o},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:s}=(0,ye.Iw)(r),c=(0,Ue.vY)(t,r);return null===c?null:a.createElement(oe,(0,i.Z)({exact:!0},o,{isActive:()=>s?.path===c.path||!!s?.sidebar&&s.sidebar===c.sidebar,label:n??c.id,to:c.path}))},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:s}=(0,ye.Iw)(r),c=(0,Ue.oz)(t,r).link;if(!c)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return a.createElement(oe,(0,i.Z)({exact:!0},o,{isActive:()=>s?.sidebar===t,label:n??c.label,to:c.path}))},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...o}=e;const s=(0,Ue.lO)(r)[0],c=t??s.label,d=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(s).path;return a.createElement(oe,(0,i.Z)({},o,{label:c,to:d}))},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:o,dropdownItemsAfter:s,...l}=e;const{search:u,hash:p}=(0,c.TH)(),f=(0,ye.Iw)(n),m=(0,ye.gB)(n),{savePreferredVersionName:g}=(0,ve.J)(n),h=[...o,...m.map((e=>{const t=f.alternateDocVersions[e.name]??He(e);return{label:e.label,to:`${t.path}${u}${p}`,isActive:()=>e===f.activeVersion,onClick:()=>g(e.name)}})),...s],b=(0,Ue.lO)(n)[0],v=t&&h.length>1?(0,d.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):b.label,y=t&&h.length>1?void 0:He(b).path;return h.length<=1?a.createElement(oe,(0,i.Z)({},l,{mobile:t,label:v,to:y,isActive:r?()=>!1:void 0})):a.createElement(pe,(0,i.Z)({},l,{mobile:t,label:v,to:y,items:h,isActive:r?()=>!1:void 0}))}};function Qe(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=Ze[r];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return a.createElement(o,n)}function Ve(){const e=(0,P.e)(),t=(0,k.L)().navbar.items;return a.createElement("ul",{className:"menu__list"},t.map(((t,n)=>a.createElement(Qe,(0,i.Z)({mobile:!0},t,{onClick:()=>e.toggle(),key:n})))))}function qe(e){return a.createElement("button",(0,i.Z)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),a.createElement(d.Z,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)"},"\u2190 Back to main menu"))}function Ge(){const e=0===(0,k.L)().navbar.items.length,t=M();return a.createElement(a.Fragment,null,!e&&a.createElement(qe,{onClick:()=>t.hide()}),t.content)}function We(){const e=(0,P.e)();var t;return void 0===(t=e.shown)&&(t=!0),(0,a.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?a.createElement(F,{header:a.createElement(X,null),primaryMenu:a.createElement(Ve,null),secondaryMenu:a.createElement(Ge,null)}):null}const Xe={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Ye(e){return a.createElement("div",(0,i.Z)({role:"presentation"},e,{className:(0,r.Z)("navbar-sidebar__backdrop",e.className)}))}function Ke(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,k.L)(),s=(0,P.e)(),{navbarRef:i,isNavbarVisible:c}=function(e){const[t,n]=(0,a.useState)(e),r=(0,a.useRef)(!1),o=(0,a.useRef)(0),s=(0,a.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,R.RF)(((t,a)=>{let{scrollY:s}=t;if(!e)return;if(s<o.current)return void n(!0);if(r.current)return void(r.current=!1);const i=a?.scrollY,c=document.documentElement.scrollHeight-o.current,d=window.innerHeight;i&&s>=i?n(!1):s+d<c&&n(!0)})),(0,l.S)((t=>{if(!e)return;const a=t.location.hash;if(a?document.getElementById(a.substring(1)):void 0)return r.current=!0,void n(!1);n(!0)})),{navbarRef:s,isNavbarVisible:t}}(n);return a.createElement("nav",{ref:i,"aria-label":(0,d.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,r.Z)("navbar","navbar--fixed-top",n&&[Xe.navbarHideable,!c&&Xe.navbarHidden],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":s.shown})},t,a.createElement(Ye,{onClick:s.toggle}),a.createElement(We,null))}var Je=n(18780);const et={errorBoundaryError:"errorBoundaryError_a6uf"};function tt(e){return a.createElement("button",(0,i.Z)({type:"button"},e),a.createElement(d.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error"},"Try again"))}function nt(e){let{error:t}=e;const n=(0,Je.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return a.createElement("p",{className:et.errorBoundaryError},n)}class at extends a.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const rt="right";function ot(e){let{width:t=30,height:n=30,className:r,...o}=e;return a.createElement("svg",(0,i.Z)({className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true"},o),a.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))}function st(){const{toggle:e,shown:t}=(0,P.e)();return a.createElement("button",{onClick:e,"aria-label":(0,d.I)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button"},a.createElement(ot,null))}const it={colorModeToggle:"colorModeToggle_DEke"};function ct(e){let{items:t}=e;return a.createElement(a.Fragment,null,t.map(((e,t)=>a.createElement(at,{key:t,onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t})},a.createElement(Qe,e)))))}function dt(e){let{left:t,right:n}=e;return a.createElement("div",{className:"navbar__inner"},a.createElement("div",{className:"navbar__items"},t),a.createElement("div",{className:"navbar__items navbar__items--right"},n))}function lt(){const e=(0,P.e)(),t=(0,k.L)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??rt)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return a.createElement(dt,{left:a.createElement(a.Fragment,null,!e.disabled&&a.createElement(st,null),a.createElement(G,null),a.createElement(ct,{items:n})),right:a.createElement(a.Fragment,null,a.createElement(ct,{items:r}),a.createElement(V,{className:it.colorModeToggle}),!o&&a.createElement($e,null,a.createElement(je,null)))})}function ut(){return a.createElement(Ke,null,a.createElement(lt,null))}function pt(e){let{item:t}=e;const{to:n,href:r,label:o,prependBaseUrlToHref:s,...c}=t,d=(0,K.Z)(n),l=(0,K.Z)(r,{forcePrependBaseUrl:!0});return a.createElement(Y.Z,(0,i.Z)({className:"footer__link-item"},r?{href:s?l:r}:{to:d},c),o,r&&!(0,J.Z)(r)&&a.createElement(te.Z,null))}function ft(e){let{item:t}=e;return t.html?a.createElement("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):a.createElement("li",{key:t.href??t.to,className:"footer__item"},a.createElement(pt,{item:t}))}function mt(e){let{column:t}=e;return a.createElement("div",{className:"col footer__col"},a.createElement("div",{className:"footer__title"},t.title),a.createElement("ul",{className:"footer__items clean-list"},t.items.map(((e,t)=>a.createElement(ft,{key:t,item:e})))))}function gt(e){let{columns:t}=e;return a.createElement("div",{className:"row footer__links"},t.map(((e,t)=>a.createElement(mt,{key:t,column:e}))))}function ht(){return a.createElement("span",{className:"footer__link-separator"},"\xb7")}function bt(e){let{item:t}=e;return t.html?a.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):a.createElement(pt,{item:t})}function vt(e){let{links:t}=e;return a.createElement("div",{className:"footer__links text--center"},a.createElement("div",{className:"footer__links"},t.map(((e,n)=>a.createElement(a.Fragment,{key:n},a.createElement(bt,{item:e}),t.length!==n+1&&a.createElement(ht,null))))))}function yt(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?a.createElement(gt,{columns:t}):a.createElement(vt,{links:t})}var kt=n(50941);const wt={footerLogoLink:"footerLogoLink_BH7S"};function xt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,K.C)(),o={light:n(t.src),dark:n(t.srcDark??t.src)};return a.createElement(kt.Z,{className:(0,r.Z)("footer__logo",t.className),alt:t.alt,sources:o,width:t.width,height:t.height,style:t.style})}function Et(e){let{logo:t}=e;return t.href?a.createElement(Y.Z,{href:t.href,className:wt.footerLogoLink,target:t.target},a.createElement(xt,{logo:t})):a.createElement(xt,{logo:t})}function _t(e){let{copyright:t}=e;return a.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function St(e){let{style:t,links:n,logo:o,copyright:s}=e;return a.createElement("footer",{className:(0,r.Z)("footer",{"footer--dark":"dark"===t})},a.createElement("div",{className:"container container-fluid"},n,(o||s)&&a.createElement("div",{className:"footer__bottom text--center"},o&&a.createElement("div",{className:"margin-bottom--sm"},o),s)))}function Ct(){const{footer:e}=(0,k.L)();if(!e)return null;const{copyright:t,links:n,logo:r,style:o}=e;return a.createElement(St,{style:o,links:n&&n.length>0&&a.createElement(yt,{links:n}),logo:r&&a.createElement(Et,{logo:r}),copyright:t&&a.createElement(_t,{copyright:t})})}const Tt=a.memo(Ct),Lt=(0,O.Qc)([B.S,w.pl,R.OC,ve.L5,s.VC,function(e){let{children:t}=e;return a.createElement(N.n2,null,a.createElement(P.M,null,a.createElement(A,null,t)))}]);function Pt(e){let{children:t}=e;return a.createElement(Lt,null,t)}function Rt(e){let{error:t,tryAgain:n}=e;return a.createElement("main",{className:"container margin-vert--xl"},a.createElement("div",{className:"row"},a.createElement("div",{className:"col col--6 col--offset-3"},a.createElement("h1",{className:"hero__title"},a.createElement(d.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed"},"This page crashed.")),a.createElement("div",{className:"margin-vert--lg"},a.createElement(tt,{onClick:n,className:"button button--primary shadow--lw"})),a.createElement("hr",null),a.createElement("div",{className:"margin-vert--md"},a.createElement(nt,{error:t})))))}const Ot={mainWrapper:"mainWrapper_z2l0"};function Nt(e){const{children:t,noFooter:n,wrapperClassName:i,title:c,description:d}=e;return(0,b.t)(),a.createElement(Pt,null,a.createElement(s.d,{title:c,description:d}),a.createElement(y,null),a.createElement(L,null),a.createElement(ut,null),a.createElement("div",{id:u,className:(0,r.Z)(h.k.wrapper.main,Ot.mainWrapper,i)},a.createElement(o.Z,{fallback:e=>a.createElement(Rt,e)},t)),!n&&a.createElement(Tt,null))}},21327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var a=n(87462),r=n(67294),o=n(39960),s=n(44996),i=n(52263),c=n(86668),d=n(50941);function l(e){let{logo:t,alt:n,imageClassName:a}=e;const o={light:(0,s.Z)(t.src),dark:(0,s.Z)(t.srcDark||t.src)},i=r.createElement(d.Z,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return a?r.createElement("div",{className:a},i):i}function u(e){const{siteConfig:{title:t}}=(0,i.Z)(),{navbar:{title:n,logo:d}}=(0,c.L)(),{imageClassName:u,titleClassName:p,...f}=e,m=(0,s.Z)(d?.href||"/"),g=n?"":t,h=d?.alt??g;return r.createElement(o.Z,(0,a.Z)({to:m},f,d?.target&&{target:d.target}),d&&r.createElement(l,{logo:d,alt:h,imageClassName:u}),null!=n&&r.createElement("b",{className:p},n))}},90197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var a=n(67294),r=n(35742);function o(e){let{locale:t,version:n,tag:o}=e;const s=t;return a.createElement(r.Z,null,t&&a.createElement("meta",{name:"docusaurus_locale",content:t}),n&&a.createElement("meta",{name:"docusaurus_version",content:n}),o&&a.createElement("meta",{name:"docusaurus_tag",content:o}),s&&a.createElement("meta",{name:"docsearch:language",content:s}),n&&a.createElement("meta",{name:"docsearch:version",content:n}),o&&a.createElement("meta",{name:"docsearch:docusaurus_tag",content:o}))}},50941:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});var a=n(87462),r=n(67294),o=n(86010),s=n(72389),i=n(92949);const c={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};function d(e){const t=(0,s.Z)(),{colorMode:n}=(0,i.I)(),{sources:d,className:l,alt:u,...p}=e,f=t?"dark"===n?["dark"]:["light"]:["light","dark"];return r.createElement(r.Fragment,null,f.map((e=>r.createElement("img",(0,a.Z)({key:e,src:d[e],alt:u,className:(0,o.Z)(c.themedImage,c[`themedImage--${e}`],l)},p)))))}},86043:(e,t,n)=>{"use strict";n.d(t,{u:()=>c,z:()=>h});var a=n(87462),r=n(67294),o=n(10412),s=n(91442);const i="ease-in-out";function c(e){let{initialState:t}=e;const[n,a]=(0,r.useState)(t??!1),o=(0,r.useCallback)((()=>{a((e=>!e))}),[]);return{collapsed:n,setCollapsed:a,toggleCollapsed:o}}const d={display:"none",overflow:"hidden",height:"0px"},l={display:"block",overflow:"visible",height:"auto"};function u(e,t){const n=t?d:l;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function p(e){let{collapsibleRef:t,collapsed:n,animation:a}=e;const o=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=a?.duration??function(e){if((0,s.n)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${a?.easing??i}`,height:`${t}px`}}function c(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return u(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(c(),requestAnimationFrame((()=>{e.style.height=d.height,e.style.overflow=d.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{c()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,a])}function f(e){if(!o.Z.canUseDOM)return e?d:l}function m(e){let{as:t="div",collapsed:n,children:a,animation:o,onCollapseTransitionEnd:s,className:i,disableSSRStyle:c}=e;const d=(0,r.useRef)(null);return p({collapsibleRef:d,collapsed:n,animation:o}),r.createElement(t,{ref:d,style:c?void 0:f(n),onTransitionEnd:e=>{"height"===e.propertyName&&(u(d.current,n),s?.(n))},className:i},a)}function g(e){let{collapsed:t,...n}=e;const[o,s]=(0,r.useState)(!t),[i,c]=(0,r.useState)(t);return(0,r.useLayoutEffect)((()=>{t||s(!0)}),[t]),(0,r.useLayoutEffect)((()=>{o&&c(t)}),[o,t]),o?r.createElement(m,(0,a.Z)({},n,{collapsed:i})):null}function h(e){let{lazy:t,...n}=e;const a=t?g:m;return r.createElement(a,n)}},59689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>m,pl:()=>f});var a=n(67294),r=n(72389),o=n(50012),s=n(902),i=n(86668);const c=(0,o.WA)("docusaurus.announcement.dismiss"),d=(0,o.WA)("docusaurus.announcement.id"),l=()=>"true"===c.get(),u=e=>c.set(String(e)),p=a.createContext(null);function f(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,i.L)(),t=(0,r.Z)(),[n,o]=(0,a.useState)((()=>!!t&&l()));(0,a.useEffect)((()=>{o(l())}),[]);const s=(0,a.useCallback)((()=>{u(!0),o(!0)}),[]);return(0,a.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=d.get();"annoucement-bar"===n&&(n="announcement-bar");const a=t!==n;d.set(t),a&&u(!1),!a&&l()||o(!1)}),[e]),(0,a.useMemo)((()=>({isActive:!!e&&!n,close:s})),[e,n,s])}();return a.createElement(p.Provider,{value:n},t)}function m(){const e=(0,a.useContext)(p);if(!e)throw new s.i6("AnnouncementBarProvider");return e}},92949:(e,t,n)=>{"use strict";n.d(t,{I:()=>h,S:()=>g});var a=n(67294),r=n(10412),o=n(902),s=n(50012),i=n(86668);const c=a.createContext(void 0),d="theme",l=(0,s.WA)(d),u={light:"light",dark:"dark"},p=e=>e===u.dark?u.dark:u.light,f=e=>r.Z.canUseDOM?p(document.documentElement.getAttribute("data-theme")):p(e),m=e=>{l.set(p(e))};function g(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,i.L)(),[r,o]=(0,a.useState)(f(e));(0,a.useEffect)((()=>{t&&l.del()}),[t]);const s=(0,a.useCallback)((function(t,a){void 0===a&&(a={});const{persist:r=!0}=a;t?(o(t),r&&m(t)):(o(n?window.matchMedia("(prefers-color-scheme: dark)").matches?u.dark:u.light:e),l.del())}),[n,e]);(0,a.useEffect)((()=>{document.documentElement.setAttribute("data-theme",p(r))}),[r]),(0,a.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==d)return;const t=l.get();null!==t&&s(p(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,s]);const c=(0,a.useRef)(!1);return(0,a.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),a=()=>{window.matchMedia("print").matches||c.current?c.current=window.matchMedia("print").matches:s(null)};return e.addListener(a),()=>e.removeListener(a)}),[s,t,n]),(0,a.useMemo)((()=>({colorMode:r,setColorMode:s,get isDarkTheme(){return r===u.dark},setLightTheme(){s(u.light)},setDarkTheme(){s(u.dark)}})),[r,s])}();return a.createElement(c.Provider,{value:n},t)}function h(){const e=(0,a.useContext)(c);if(null==e)throw new o.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},60373:(e,t,n)=>{"use strict";n.d(t,{J:()=>v,L5:()=>h});var a=n(67294),r=n(80143),o=n(29935),s=n(86668),i=n(53438),c=n(902),d=n(50012);const l=e=>`docs-preferred-version-${e}`,u={save:(e,t,n)=>{(0,d.WA)(l(e),{persistence:t}).set(n)},read:(e,t)=>(0,d.WA)(l(e),{persistence:t}).get(),clear:(e,t)=>{(0,d.WA)(l(e),{persistence:t}).del()}},p=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const f=a.createContext(null);function m(){const e=(0,r._r)(),t=(0,s.L)().docs.versionPersistence,n=(0,a.useMemo)((()=>Object.keys(e)),[e]),[o,i]=(0,a.useState)((()=>p(n)));(0,a.useEffect)((()=>{i(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:a}=e;function r(e){const t=u.read(e,n);return a[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(u.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,r(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,a.useMemo)((()=>({savePreferredVersion:function(e,n){u.save(e,t,n),i((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function g(e){let{children:t}=e;const n=m();return a.createElement(f.Provider,{value:n},t)}function h(e){let{children:t}=e;return i.cE?a.createElement(g,null,t):a.createElement(a.Fragment,null,t)}function b(){const e=(0,a.useContext)(f);if(!e)throw new c.i6("DocsPreferredVersionContextProvider");return e}function v(e){void 0===e&&(e=o.m);const t=(0,r.zh)(e),[n,s]=b(),{preferredVersionName:i}=n[e];return{preferredVersion:t.versions.find((e=>e.name===i))??null,savePreferredVersionName:(0,a.useCallback)((t=>{s.savePreferredVersion(e,t)}),[s,e])}}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>c,b:()=>i});var a=n(67294),r=n(902);const o=Symbol("EmptyContext"),s=a.createContext(o);function i(e){let{children:t,name:n,items:r}=e;const o=(0,a.useMemo)((()=>n&&r?{name:n,items:r}:null),[n,r]);return a.createElement(s.Provider,{value:o},t)}function c(){const e=(0,a.useContext)(s);if(e===o)throw new r.i6("DocsSidebarProvider");return e}},74477:(e,t,n)=>{"use strict";n.d(t,{E:()=>i,q:()=>s});var a=n(67294),r=n(902);const o=a.createContext(null);function s(e){let{children:t,version:n}=e;return a.createElement(o.Provider,{value:n},t)}function i(){const e=(0,a.useContext)(o);if(null===e)throw new r.i6("DocsVersionProvider");return e}},93163:(e,t,n)=>{"use strict";n.d(t,{M:()=>u,e:()=>p});var a=n(67294),r=n(13102),o=n(87524),s=n(91980),i=n(86668),c=n(902);const d=a.createContext(void 0);function l(){const e=function(){const e=(0,r.HY)(),{items:t}=(0,i.L)().navbar;return 0===t.length&&!e.component}(),t=(0,o.i)(),n=!e&&"mobile"===t,[c,d]=(0,a.useState)(!1);(0,s.Rb)((()=>{if(c)return d(!1),!1}));const l=(0,a.useCallback)((()=>{d((e=>!e))}),[]);return(0,a.useEffect)((()=>{"desktop"===t&&d(!1)}),[t]),(0,a.useMemo)((()=>({disabled:e,shouldRender:n,toggle:l,shown:c})),[e,n,l,c])}function u(e){let{children:t}=e;const n=l();return a.createElement(d.Provider,{value:n},t)}function p(){const e=a.useContext(d);if(void 0===e)throw new c.i6("NavbarMobileSidebarProvider");return e}},13102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>i,Zo:()=>c,n2:()=>s});var a=n(67294),r=n(902);const o=a.createContext(null);function s(e){let{children:t}=e;const n=(0,a.useState)({component:null,props:null});return a.createElement(o.Provider,{value:n},t)}function i(){const e=(0,a.useContext)(o);if(!e)throw new r.i6("NavbarSecondaryMenuContentProvider");return e[0]}function c(e){let{component:t,props:n}=e;const s=(0,a.useContext)(o);if(!s)throw new r.i6("NavbarSecondaryMenuContentProvider");const[,i]=s,c=(0,r.Ql)(n);return(0,a.useEffect)((()=>{i({component:t,props:c})}),[i,t,c]),(0,a.useEffect)((()=>()=>i({component:null,props:null})),[i]),null}},19727:(e,t,n)=>{"use strict";n.d(t,{h:()=>r,t:()=>o});var a=n(67294);const r="navigation-with-keyboard";function o(){(0,a.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(r),"mousedown"===e.type&&document.body.classList.remove(r)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(r),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},87524:(e,t,n)=>{"use strict";n.d(t,{i:()=>d});var a=n(67294),r=n(10412);const o={desktop:"desktop",mobile:"mobile",ssr:"ssr"},s=996;function i(){return r.Z.canUseDOM?window.innerWidth>s?o.desktop:o.mobile:o.ssr}const c=!1;function d(){const[e,t]=(0,a.useState)((()=>c?"ssr":i()));return(0,a.useEffect)((()=>{function e(){t(i())}const n=c?window.setTimeout(e,1e3):void 0;return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e),clearTimeout(n)}}),[]),e}},35281:(e,t,n)=>{"use strict";n.d(t,{k:()=>a});const a={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{}}},91442:(e,t,n)=>{"use strict";function a(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{n:()=>a})},53438:(e,t,n)=>{"use strict";n.d(t,{MN:()=>S,Wl:()=>m,_F:()=>v,cE:()=>p,hI:()=>_,jA:()=>g,lO:()=>w,oz:()=>x,s1:()=>k,vY:()=>E,xz:()=>f});var a=n(67294),r=n(16550),o=n(18790),s=n(80143),i=n(60373),c=n(74477),d=n(1116),l=n(67392),u=n(48596);const p=!!s._r;function f(e){const t=(0,c.E)();if(!e)return;const n=t.docs[e];if(!n)throw new Error(`no version doc found by id=${e}`);return n}function m(e){if(e.href)return e.href;for(const t of e.items){if("link"===t.type)return t.href;if("category"===t.type){const e=m(t);if(e)return e}}}function g(){const{pathname:e}=(0,r.TH)(),t=(0,d.V)();if(!t)throw new Error("Unexpected: cant find current sidebar in context");const n=y({sidebarItems:t.items,pathname:e,onlyCategories:!0}).slice(-1)[0];if(!n)throw new Error(`${e} is not associated with a category. useCurrentSidebarCategory() should only be used on category index pages.`);return n}const h=(e,t)=>void 0!==e&&(0,u.Mg)(e,t),b=(e,t)=>e.some((e=>v(e,t)));function v(e,t){return"link"===e.type?h(e.href,t):"category"===e.type&&(h(e.href,t)||b(e.items,t))}function y(e){let{sidebarItems:t,pathname:n,onlyCategories:a=!1}=e;const r=[];return function e(t){for(const o of t)if("category"===o.type&&((0,u.Mg)(o.href,n)||e(o.items))||"link"===o.type&&(0,u.Mg)(o.href,n)){return a&&"category"!==o.type||r.unshift(o),!0}return!1}(t),r}function k(){const e=(0,d.V)(),{pathname:t}=(0,r.TH)(),n=(0,s.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?y({sidebarItems:e.items,pathname:t}):null}function w(e){const{activeVersion:t}=(0,s.Iw)(e),{preferredVersion:n}=(0,i.J)(e),r=(0,s.yW)(e);return(0,a.useMemo)((()=>(0,l.j)([t,n,r].filter(Boolean))),[t,n,r])}function x(e,t){const n=w(t);return(0,a.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),a=t.find((t=>t[0]===e));if(!a)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return a[1]}),[e,n])}function E(e,t){const n=w(t);return(0,a.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),a=t.find((t=>t.id===e));if(!a){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${(0,l.j)(t.map((e=>e.id))).join("\n- ")}`)}return a}),[e,n])}function _(e){let{route:t,versionMetadata:n}=e;const a=(0,r.TH)(),s=t.routes,i=s.find((e=>(0,r.LX)(a.pathname,e)));if(!i)return null;const c=i.sidebar,d=c?n.docsSidebars[c]:void 0;return{docElement:(0,o.H)(s),sidebarName:c,sidebarItems:d}}function S(e){return e.filter((e=>"category"!==e.type||!!m(e)))}},91980:(e,t,n)=>{"use strict";n.d(t,{Rb:()=>i,_X:()=>c});var a=n(67294),r=n(16550),o=n(61688),s=n(902);function i(e){!function(e){const t=(0,r.k6)(),n=(0,s.zX)(e);(0,a.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}function c(e){return function(e){const t=(0,r.k6)();return(0,o.useSyncExternalStore)(t.listen,(()=>e(t)),(()=>e(t)))}((t=>null===e?null:new URLSearchParams(t.location.search).get(e)))}},67392:(e,t,n)=>{"use strict";function a(e,t){return void 0===t&&(t=(e,t)=>e===t),e.filter(((n,a)=>e.findIndex((e=>t(e,n)))!==a))}function r(e){return Array.from(new Set(e))}n.d(t,{j:()=>r,l:()=>a})},1944:(e,t,n)=>{"use strict";n.d(t,{FG:()=>p,d:()=>l,VC:()=>f});var a=n(67294),r=n(86010),o=n(35742),s=n(30226);function i(){const e=a.useContext(s._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var c=n(44996),d=n(52263);function l(e){let{title:t,description:n,keywords:r,image:s,children:i}=e;const l=function(e){const{siteConfig:t}=(0,d.Z)(),{title:n,titleDelimiter:a}=t;return e?.trim().length?`${e.trim()} ${a} ${n}`:n}(t),{withBaseUrl:u}=(0,c.C)(),p=s?u(s,{absolute:!0}):void 0;return a.createElement(o.Z,null,t&&a.createElement("title",null,l),t&&a.createElement("meta",{property:"og:title",content:l}),n&&a.createElement("meta",{name:"description",content:n}),n&&a.createElement("meta",{property:"og:description",content:n}),r&&a.createElement("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),p&&a.createElement("meta",{property:"og:image",content:p}),p&&a.createElement("meta",{name:"twitter:image",content:p}),i)}const u=a.createContext(void 0);function p(e){let{className:t,children:n}=e;const s=a.useContext(u),i=(0,r.Z)(s,t);return a.createElement(u.Provider,{value:i},a.createElement(o.Z,null,a.createElement("html",{className:i})),n)}function f(e){let{children:t}=e;const n=i(),o=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const s=`plugin-id-${n.plugin.id}`;return a.createElement(p,{className:(0,r.Z)(o,s)},t)}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>s,Qc:()=>d,Ql:()=>c,i6:()=>i,zX:()=>o});var a=n(67294);const r=n(10412).Z.canUseDOM?a.useLayoutEffect:a.useEffect;function o(e){const t=(0,a.useRef)(e);return r((()=>{t.current=e}),[e]),(0,a.useCallback)((function(){return t.current(...arguments)}),[])}function s(e){const t=(0,a.useRef)();return r((()=>{t.current=e})),t.current}class i extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?<name>\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function c(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,a.useMemo)((()=>e),t.flat())}function d(e){return t=>{let{children:n}=t;return a.createElement(a.Fragment,null,e.reduceRight(((e,t)=>a.createElement(t,null,e)),n))}}},48596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>s,Ns:()=>i});var a=n(67294),r=n(723),o=n(52263);function s(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function i(){const{baseUrl:e}=(0,o.Z)().siteConfig;return(0,a.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function a(e){return e.path===t&&!0===e.exact}function r(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(a)||e(t.filter(r).flatMap((e=>e.routes??[])))}(n)}({routes:r.Z,baseUrl:e})),[e])}},12466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>f,OC:()=>c,RF:()=>u,o5:()=>p});var a=n(67294),r=n(10412),o=n(72389),s=n(902);const i=a.createContext(void 0);function c(e){let{children:t}=e;const n=function(){const e=(0,a.useRef)(!0);return(0,a.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return a.createElement(i.Provider,{value:n},t)}function d(){const e=(0,a.useContext)(i);if(null==e)throw new s.i6("ScrollControllerProvider");return e}const l=()=>r.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function u(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=d(),r=(0,a.useRef)(l()),o=(0,s.zX)(e);(0,a.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=l();o(e,r.current),r.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[o,n,...t])}function p(){const e=d(),t=function(){const e=(0,a.useRef)({elem:null,top:0}),t=(0,a.useCallback)((t=>{e.current={elem:t,top:t.getBoundingClientRect().top}}),[]),n=(0,a.useCallback)((()=>{const{current:{elem:t,top:n}}=e;if(!t)return{restored:!1};const a=t.getBoundingClientRect().top-n;return a&&window.scrollBy({left:0,top:a}),e.current={elem:null,top:0},{restored:0!==a}}),[]);return(0,a.useMemo)((()=>({save:t,restore:n})),[n,t])}(),n=(0,a.useRef)(void 0),r=(0,a.useCallback)((a=>{t.save(a),e.disableScrollEvents(),n.current=()=>{const{restored:a}=t.restore();if(n.current=void 0,a){const t=()=>{e.enableScrollEvents(),window.removeEventListener("scroll",t)};window.addEventListener("scroll",t)}else e.enableScrollEvents()}}),[e,t]);return(0,a.useLayoutEffect)((()=>{queueMicrotask((()=>n.current?.()))})),{blockElementScrollPositionUntilNextRender:r}}function f(){const e=(0,a.useRef)(null),t=(0,o.Z)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function a(){const r=document.documentElement.scrollTop;(n&&r>e||!n&&r<e)&&(t=requestAnimationFrame(a),window.scrollTo(0,Math.floor(.85*(r-e))+e))}(),()=>t&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},43320:(e,t,n)=>{"use strict";n.d(t,{HX:()=>a,os:()=>r});n(52263);const a="default";function r(e,t){return`docs-${e}-${t}`}},50012:(e,t,n)=>{"use strict";n.d(t,{Nk:()=>u,WA:()=>l});var a=n(67294),r=n(61688);const o="localStorage";function s(e){let{key:t,oldValue:n,newValue:a,storage:r}=e;if(n===a)return;const o=document.createEvent("StorageEvent");o.initStorageEvent("storage",!1,!1,t,n,a,window.location.href,r),window.dispatchEvent(o)}function i(e){if(void 0===e&&(e=o),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,c||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),c=!0),null}var t}let c=!1;const d={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function l(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(e);const n=i(t?.persistence);return null===n?d:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{const a=n.getItem(e);n.setItem(e,t),s({key:e,oldValue:a,newValue:t,storage:n})}catch(a){console.error(`Docusaurus storage error, can't set ${e}=${t}`,a)}},del:()=>{try{const t=n.getItem(e);n.removeItem(e),s({key:e,oldValue:t,newValue:null,storage:n})}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}},listen:t=>{try{const a=a=>{a.storageArea===n&&a.key===e&&t(a)};return window.addEventListener("storage",a),()=>window.removeEventListener("storage",a)}catch(a){return console.error(`Docusaurus storage error, can't listen for changes of key=${e}`,a),()=>{}}}}}function u(e,t){const n=(0,a.useRef)((()=>null===e?d:l(e,t))).current(),o=(0,a.useCallback)((e=>"undefined"==typeof window?()=>{}:n.listen(e)),[n]);return[(0,r.useSyncExternalStore)(o,(()=>"undefined"==typeof window?null:n.get()),(()=>null)),n]}},94711:(e,t,n)=>{"use strict";n.d(t,{l:()=>s});var a=n(52263),r=n(16550),o=n(18780);function s(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:s,currentLocale:i}}=(0,a.Z)(),{pathname:c}=(0,r.TH)(),d=(0,o.applyTrailingSlash)(c,{trailingSlash:n,baseUrl:e}),l=i===s?e:e.replace(`/${i}/`,"/"),u=d.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:a}=e;return`${a?t:""}${function(e){return e===s?`${l}`:`${l}${e}/`}(n)}${u}`}}}},85936:(e,t,n)=>{"use strict";n.d(t,{S:()=>s});var a=n(67294),r=n(16550),o=n(902);function s(e){const t=(0,r.TH)(),n=(0,o.D9)(t),s=(0,o.zX)(e);(0,a.useEffect)((()=>{n&&t!==n&&s({location:t,previousLocation:n})}),[s,t,n])}},86668:(e,t,n)=>{"use strict";n.d(t,{L:()=>r});var a=n(52263);function r(){return(0,a.Z)().siteConfig.themeConfig}},8802:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:a}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[r]=e.split(/[#?]/),o="/"===r||r===a?r:(s=r,n?function(e){return e.endsWith("/")?e:`${e}/`}(s):function(e){return e.endsWith("/")?e.slice(0,-1):e}(s));var s;return e.replace(r,o)}},54143:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},18780:function(e,t,n){"use strict";var a=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="__blog-post-container";var r=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return a(r).default}});var o=n(54143);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return o.getErrorCausalChain}})},80311:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s});var a=n(67294),r=n(86010);const o={loadingRing:"loadingRing_RJI3","loading-ring":"loading-ring_FB5o"};function s(e){let{className:t}=e;return a.createElement("div",{className:(0,r.Z)(o.loadingRing,t)},a.createElement("div",null),a.createElement("div",null),a.createElement("div",null),a.createElement("div",null))}},90022:(e,t,n)=>{"use strict";n.d(t,{w:()=>i});var a=n(31336),r=n.n(a),o=n(61029);const s=new Map;function i(e,t){const n=`${e}${t}`;let a=s.get(n);return a||(a=async function(e,t){{const n=`${e}${o.J.replace("{dir}",t?`-${t.replace(/\//g,"-")}`:"")}`;if(new URL(n,location.origin).origin!==location.origin)throw new Error("Unexpected version url");const a=await(await fetch(n)).json(),s=a.map(((e,t)=>{let{documents:n,index:a}=e;return{type:t,documents:n,index:r().Index.load(a)}})),i=a.reduce(((e,t)=>{for(const n of t.index.invertedIndex)/\p{Unified_Ideograph}/u.test(n[0][0])&&e.add(n[0]);return e}),new Set);return{wrappedIndexes:s,zhDictionary:Array.from(i)}}return{wrappedIndexes:[],zhDictionary:[]}}(e,t),s.set(n,a)),a}},98202:(e,t,n)=>{"use strict";n.d(t,{v:()=>c});var a=n(31336),r=n.n(a);var o=n(61029);function s(e){return i(e).concat(i(e.filter((e=>{const t=e[e.length-1];return!t.trailing&&t.maybeTyping})),!0))}function i(e,t){return e.map((e=>({tokens:e.map((e=>e.value)),term:e.map((e=>({value:e.value,presence:r().Query.presence.REQUIRED,wildcard:(t?e.trailing||e.maybeTyping:e.trailing)?r().Query.wildcard.TRAILING:r().Query.wildcard.NONE})))})))}function c(e,t,n){return function(a,i){const c=function(e,t){if(1===t.length&&["ja","jp","th"].includes(t[0]))return r()[t[0]].tokenizer(e).map((e=>e.toString()));let n=/[^-\s]+/g;return t.includes("zh")&&(n=/\w+|\p{Unified_Ideograph}+/gu),e.toLowerCase().match(n)||[]}(a,o.dK);if(0===c.length)return void i([]);const d=function(e,t){const n=function(e,t){const n=[];return function e(a,r){if(0===a.length)return void n.push(r);const o=a[0];if(/\p{Unified_Ideograph}/u.test(o)){const n=function(e,t){const n=[];return function e(a,r){let o=0,s=!1;for(const i of t)if(a.substr(0,i.length)===i){const t={missed:r.missed,term:r.term.concat({value:i})};a.length>i.length?e(a.substr(i.length),t):n.push(t),s=!0}else for(let t=i.length-1;t>o;t-=1){const c=i.substr(0,t);if(a.substr(0,t)===c){o=t;const i={missed:r.missed,term:r.term.concat({value:c,trailing:!0})};a.length>t?e(a.substr(t),i):n.push(i),s=!0;break}}s||(a.length>0?e(a.substr(1),{missed:r.missed+1,term:r.term}):r.term.length>0&&n.push(r))}(e,{missed:0,term:[]}),n.sort(((e,t)=>{const n=e.missed>0?1:0,a=t.missed>0?1:0;return n!==a?n-a:e.term.length-t.term.length})).map((e=>e.term))}(o,t);for(const t of n){const n=r.concat(...t);e(a.slice(1),n)}}else{const t=r.concat({value:o});e(a.slice(1),t)}}(e,[]),n}(e,t);if(0===n.length)return[{tokens:e,term:e.map((e=>({value:e,presence:r().Query.presence.REQUIRED,wildcard:r().Query.wildcard.LEADING|r().Query.wildcard.TRAILING})))}];for(const r of n)r[r.length-1].maybeTyping=!0;const a=[];for(const s of o.dK)if("en"===s)o._k||a.unshift(r().stopWordFilter);else{const e=r()[s];e.stopWordFilter&&a.unshift(e.stopWordFilter)}let i;if(a.length>0){const e=e=>a.reduce(((e,t)=>e.filter((e=>t(e.value)))),e);i=[];const t=[];for(const a of n){const n=e(a);i.push(n),n.length<a.length&&n.length>0&&t.push(n)}n.push(...t)}else i=n.slice();const c=[];for(const r of i)if(r.length>2)for(let e=r.length-1;e>=0;e-=1)c.push(r.slice(0,e).concat(r.slice(e+1)));return s(n).concat(s(c))}(c,t),l=[];e:for(const{term:t,tokens:r}of d)for(const{documents:a,index:o,type:s}of e)if(l.push(...o.query((e=>{for(const n of t)e.term(n.value,{wildcard:n.wildcard,presence:n.presence})})).slice(0,n).filter((e=>!l.some((t=>t.document.i.toString()===e.ref)))).slice(0,n-l.length).map((t=>{const n=a.find((e=>e.i.toString()===t.ref));return{document:n,type:s,page:0!==s&&e[0].documents.find((e=>e.i===n.p)),metadata:t.matchData.metadata,tokens:r,score:t.score}}))),l.length>=n)break e;!function(e){e.forEach(((e,t)=>{e.index=t})),e.sort(((t,n)=>{let a=t.type>0&&t.page?e.findIndex((e=>e.document===t.page)):t.index,r=n.type>0&&n.page?e.findIndex((e=>e.document===n.page)):n.index;return-1===a&&(a=t.index),-1===r&&(r=n.index),a===r?0===t.type?-1:0===n.type?1:t.index-n.index:a-r}))}(l),function(e){e.forEach(((t,n)=>{n>0&&t.page&&e.some((e=>e.document===t.page))&&(n<e.length-1&&e[n+1].page===t.page?t.isInterOfTree=!0:t.isLastOfTree=!0)}))}(l),i(l)}}},73926:(e,t,n)=>{"use strict";function a(e){return e.join(" \u203a ")}n.d(t,{e:()=>a})},21690:(e,t,n)=>{"use strict";function a(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}n.d(t,{X:()=>a})},91073:(e,t,n)=>{"use strict";function a(e,t){const n=[];for(const a of Object.values(e))a[t]&&n.push(...a[t].position);return n.sort(((e,t)=>e[0]-t[0]||t[1]-e[1]))}n.d(t,{m:()=>a})},82539:(e,t,n)=>{"use strict";n.d(t,{C:()=>r});var a=n(21690);function r(e,t,n){const o=[];for(const s of t){const n=e.toLowerCase().indexOf(s);if(n>=0){n>0&&o.push(r(e.substr(0,n),t)),o.push(`<mark>${(0,a.X)(e.substr(n,s.length))}</mark>`);const i=n+s.length;i<e.length&&o.push(r(e.substr(i),t));break}}return 0===o.length?n?`<mark>${(0,a.X)(e)}</mark>`:(0,a.X)(e):o.join("")}},10726:(e,t,n)=>{"use strict";n.d(t,{o:()=>c});var a=n(21690),r=n(82539);const o=/\w+|\p{Unified_Ideograph}/u;function s(e){const t=[];let n=0,a=e;for(;a.length>0;){const r=a.match(o);if(!r){t.push(a);break}r.index>0&&t.push(a.substring(0,r.index)),t.push(r[0]),n+=r.index+r[0].length,a=e.substring(n)}return t}var i=n(61029);function c(e,t,n,o){void 0===o&&(o=i.Hk);const{chunkIndex:c,chunks:d}=function(e,t,n){const o=[];let i=0,c=0,d=-1;for(;i<t.length;){const[l,u]=t[i];if(i+=1,!(l<c)){if(l>c){const t=s(e.substring(c,l)).map((e=>({html:(0,a.X)(e),textLength:e.length})));for(const e of t)o.push(e)}-1===d&&(d=o.length),c=l+u,o.push({html:(0,r.C)(e.substring(l,c),n,!0),textLength:u})}}if(c<e.length){const t=s(e.substring(c)).map((e=>({html:(0,a.X)(e),textLength:e.length})));for(const e of t)o.push(e)}return{chunkIndex:d,chunks:o}}(e,t,n),l=d.slice(0,c),u=d[c],p=[u.html],f=d.slice(c+1);let m=u.textLength,g=0,h=0,b=!1,v=!1;for(;m<o;)if((g<=h||0===f.length)&&l.length>0){const e=l.pop();m+e.textLength<=o?(p.unshift(e.html),g+=e.textLength,m+=e.textLength):(b=!0,l.length=0)}else{if(!(f.length>0))break;{const e=f.shift();m+e.textLength<=o?(p.push(e.html),h+=e.textLength,m+=e.textLength):(v=!0,f.length=0)}}return(b||l.length>0)&&p.unshift("\u2026"),(v||f.length>0)&&p.push("\u2026"),p.join("")}},61029:(e,t,n)=>{"use strict";n.d(t,{vc:()=>o,gQ:()=>f,H6:()=>d,hG:()=>h,l9:()=>m,dK:()=>a,_k:()=>r,pu:()=>p,AY:()=>l,t_:()=>u,Kc:()=>g,J:()=>s,Hk:()=>c,qo:()=>i});n(31336);const a=["en"],r=!1,o=null,s="search-index{dir}.json?_=14ba57d6",i=8,c=50,d=!1,l=!0,u=!0,p="right",f=void 0,m=!0,g=null,h=!1},20006:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>a});const a=n(10412).Z.canUseDOM?{onRouteUpdate(e){let{location:t}=e;_paq.push(["setCustomUrl",t.pathname]),_paq.push(["setDocumentTitle",document.title]),_paq.push(["trackPageView"])}}:null},86010:(e,t,n)=>{"use strict";function a(e){var t,n,r="";if("string"==typeof e||"number"==typeof e)r+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;t<e.length;t++)e[t]&&(n=a(e[t]))&&(r&&(r+=" "),r+=n);else for(t in e)e[t]&&(r&&(r+=" "),r+=t);return r}n.d(t,{Z:()=>r});const r=function(){for(var e,t,n=0,r="";n<arguments.length;)(e=arguments[n++])&&(t=a(e))&&(r&&(r+=" "),r+=t);return r}},99318:(e,t,n)=>{"use strict";n.d(t,{lX:()=>k,q_:()=>C,ob:()=>f,PP:()=>L,Ep:()=>p});var a=n(87462);function r(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,a=n+1,r=e.length;a<r;n+=1,a+=1)e[n]=e[a];e.pop()}const s=function(e,t){void 0===t&&(t="");var n,a=e&&e.split("/")||[],s=t&&t.split("/")||[],i=e&&r(e),c=t&&r(t),d=i||c;if(e&&r(e)?s=a:a.length&&(s.pop(),s=s.concat(a)),!s.length)return"/";if(s.length){var l=s[s.length-1];n="."===l||".."===l||""===l}else n=!1;for(var u=0,p=s.length;p>=0;p--){var f=s[p];"."===f?o(s,p):".."===f?(o(s,p),u++):u&&(o(s,p),u--)}if(!d)for(;u--;u)s.unshift("..");!d||""===s[0]||s[0]&&r(s[0])||s.unshift("");var m=s.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};var i=n(38776);function c(e){return"/"===e.charAt(0)?e:"/"+e}function d(e){return"/"===e.charAt(0)?e.substr(1):e}function l(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function u(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function p(e){var t=e.pathname,n=e.search,a=e.hash,r=t||"/";return n&&"?"!==n&&(r+="?"===n.charAt(0)?n:"?"+n),a&&"#"!==a&&(r+="#"===a.charAt(0)?a:"#"+a),r}function f(e,t,n,r){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",a="",r=t.indexOf("#");-1!==r&&(a=t.substr(r),t=t.substr(0,r));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===a?"":a}}(e),o.state=t):(void 0===(o=(0,a.Z)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(i){throw i instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):i}return n&&(o.key=n),r?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=s(o.pathname,r.pathname)):o.pathname=r.pathname:o.pathname||(o.pathname="/"),o}function m(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,a,r){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof a?a(o,r):r(!0):r(!1!==o)}else r(!0)},appendListener:function(e){var n=!0;function a(){n&&e.apply(void 0,arguments)}return t.push(a),function(){n=!1,t=t.filter((function(e){return e!==a}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),a=0;a<e;a++)n[a]=arguments[a];t.forEach((function(e){return e.apply(void 0,n)}))}}}var g=!("undefined"==typeof window||!window.document||!window.document.createElement);function h(e,t){t(window.confirm(e))}var b="popstate",v="hashchange";function y(){try{return window.history.state||{}}catch(e){return{}}}function k(e){void 0===e&&(e={}),g||(0,i.Z)(!1);var t,n=window.history,r=(-1===(t=window.navigator.userAgent).indexOf("Android 2.")&&-1===t.indexOf("Android 4.0")||-1===t.indexOf("Mobile Safari")||-1!==t.indexOf("Chrome")||-1!==t.indexOf("Windows Phone"))&&window.history&&"pushState"in window.history,o=!(-1===window.navigator.userAgent.indexOf("Trident")),s=e,d=s.forceRefresh,k=void 0!==d&&d,w=s.getUserConfirmation,x=void 0===w?h:w,E=s.keyLength,_=void 0===E?6:E,S=e.basename?u(c(e.basename)):"";function C(e){var t=e||{},n=t.key,a=t.state,r=window.location,o=r.pathname+r.search+r.hash;return S&&(o=l(o,S)),f(o,a,n)}function T(){return Math.random().toString(36).substr(2,_)}var L=m();function P(e){(0,a.Z)($,e),$.length=n.length,L.notifyListeners($.location,$.action)}function R(e){(function(e){return void 0===e.state&&-1===navigator.userAgent.indexOf("CriOS")})(e)||I(C(e.state))}function O(){I(C(y()))}var N=!1;function I(e){if(N)N=!1,P();else{L.confirmTransitionTo(e,"POP",x,(function(t){t?P({action:"POP",location:e}):function(e){var t=$.location,n=D.indexOf(t.key);-1===n&&(n=0);var a=D.indexOf(e.key);-1===a&&(a=0);var r=n-a;r&&(N=!0,F(r))}(e)}))}}var A=C(y()),D=[A.key];function M(e){return S+p(e)}function F(e){n.go(e)}var B=0;function j(e){1===(B+=e)&&1===e?(window.addEventListener(b,R),o&&window.addEventListener(v,O)):0===B&&(window.removeEventListener(b,R),o&&window.removeEventListener(v,O))}var z=!1;var $={length:n.length,action:"POP",location:A,createHref:M,push:function(e,t){var a="PUSH",o=f(e,t,T(),$.location);L.confirmTransitionTo(o,a,x,(function(e){if(e){var t=M(o),s=o.key,i=o.state;if(r)if(n.pushState({key:s,state:i},null,t),k)window.location.href=t;else{var c=D.indexOf($.location.key),d=D.slice(0,c+1);d.push(o.key),D=d,P({action:a,location:o})}else window.location.href=t}}))},replace:function(e,t){var a="REPLACE",o=f(e,t,T(),$.location);L.confirmTransitionTo(o,a,x,(function(e){if(e){var t=M(o),s=o.key,i=o.state;if(r)if(n.replaceState({key:s,state:i},null,t),k)window.location.replace(t);else{var c=D.indexOf($.location.key);-1!==c&&(D[c]=o.key),P({action:a,location:o})}else window.location.replace(t)}}))},go:F,goBack:function(){F(-1)},goForward:function(){F(1)},block:function(e){void 0===e&&(e=!1);var t=L.setPrompt(e);return z||(j(1),z=!0),function(){return z&&(z=!1,j(-1)),t()}},listen:function(e){var t=L.appendListener(e);return j(1),function(){j(-1),t()}}};return $}var w="hashchange",x={hashbang:{encodePath:function(e){return"!"===e.charAt(0)?e:"!/"+d(e)},decodePath:function(e){return"!"===e.charAt(0)?e.substr(1):e}},noslash:{encodePath:d,decodePath:c},slash:{encodePath:c,decodePath:c}};function E(e){var t=e.indexOf("#");return-1===t?e:e.slice(0,t)}function _(){var e=window.location.href,t=e.indexOf("#");return-1===t?"":e.substring(t+1)}function S(e){window.location.replace(E(window.location.href)+"#"+e)}function C(e){void 0===e&&(e={}),g||(0,i.Z)(!1);var t=window.history,n=(window.navigator.userAgent.indexOf("Firefox"),e),r=n.getUserConfirmation,o=void 0===r?h:r,s=n.hashType,d=void 0===s?"slash":s,b=e.basename?u(c(e.basename)):"",v=x[d],y=v.encodePath,k=v.decodePath;function C(){var e=k(_());return b&&(e=l(e,b)),f(e)}var T=m();function L(e){(0,a.Z)(z,e),z.length=t.length,T.notifyListeners(z.location,z.action)}var P=!1,R=null;function O(){var e,t,n=_(),a=y(n);if(n!==a)S(a);else{var r=C(),s=z.location;if(!P&&(t=r,(e=s).pathname===t.pathname&&e.search===t.search&&e.hash===t.hash))return;if(R===p(r))return;R=null,function(e){if(P)P=!1,L();else{var t="POP";T.confirmTransitionTo(e,t,o,(function(n){n?L({action:t,location:e}):function(e){var t=z.location,n=D.lastIndexOf(p(t));-1===n&&(n=0);var a=D.lastIndexOf(p(e));-1===a&&(a=0);var r=n-a;r&&(P=!0,M(r))}(e)}))}}(r)}}var N=_(),I=y(N);N!==I&&S(I);var A=C(),D=[p(A)];function M(e){t.go(e)}var F=0;function B(e){1===(F+=e)&&1===e?window.addEventListener(w,O):0===F&&window.removeEventListener(w,O)}var j=!1;var z={length:t.length,action:"POP",location:A,createHref:function(e){var t=document.querySelector("base"),n="";return t&&t.getAttribute("href")&&(n=E(window.location.href)),n+"#"+y(b+p(e))},push:function(e,t){var n="PUSH",a=f(e,void 0,void 0,z.location);T.confirmTransitionTo(a,n,o,(function(e){if(e){var t=p(a),r=y(b+t);if(_()!==r){R=t,function(e){window.location.hash=e}(r);var o=D.lastIndexOf(p(z.location)),s=D.slice(0,o+1);s.push(t),D=s,L({action:n,location:a})}else L()}}))},replace:function(e,t){var n="REPLACE",a=f(e,void 0,void 0,z.location);T.confirmTransitionTo(a,n,o,(function(e){if(e){var t=p(a),r=y(b+t);_()!==r&&(R=t,S(r));var o=D.indexOf(p(z.location));-1!==o&&(D[o]=t),L({action:n,location:a})}}))},go:M,goBack:function(){M(-1)},goForward:function(){M(1)},block:function(e){void 0===e&&(e=!1);var t=T.setPrompt(e);return j||(B(1),j=!0),function(){return j&&(j=!1,B(-1)),t()}},listen:function(e){var t=T.appendListener(e);return B(1),function(){B(-1),t()}}};return z}function T(e,t,n){return Math.min(Math.max(e,t),n)}function L(e){void 0===e&&(e={});var t=e,n=t.getUserConfirmation,r=t.initialEntries,o=void 0===r?["/"]:r,s=t.initialIndex,i=void 0===s?0:s,c=t.keyLength,d=void 0===c?6:c,l=m();function u(e){(0,a.Z)(k,e),k.length=k.entries.length,l.notifyListeners(k.location,k.action)}function g(){return Math.random().toString(36).substr(2,d)}var h=T(i,0,o.length-1),b=o.map((function(e){return f(e,void 0,"string"==typeof e?g():e.key||g())})),v=p;function y(e){var t=T(k.index+e,0,k.entries.length-1),a=k.entries[t];l.confirmTransitionTo(a,"POP",n,(function(e){e?u({action:"POP",location:a,index:t}):u()}))}var k={length:b.length,action:"POP",location:b[h],index:h,entries:b,createHref:v,push:function(e,t){var a="PUSH",r=f(e,t,g(),k.location);l.confirmTransitionTo(r,a,n,(function(e){if(e){var t=k.index+1,n=k.entries.slice(0);n.length>t?n.splice(t,n.length-t,r):n.push(r),u({action:a,location:r,index:t,entries:n})}}))},replace:function(e,t){var a="REPLACE",r=f(e,t,g(),k.location);l.confirmTransitionTo(r,a,n,(function(e){e&&(k.entries[k.index]=r,u({action:a,location:r}))}))},go:y,goBack:function(){y(-1)},goForward:function(){y(1)},canGo:function(e){var t=k.index+e;return t>=0&&t<k.entries.length},block:function(e){return void 0===e&&(e=!1),l.setPrompt(e)},listen:function(e){return l.appendListener(e)}};return k}},8679:(e,t,n)=>{"use strict";var a=n(59864),r={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},s={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},i={};function c(e){return a.isMemo(e)?s:i[e.$$typeof]||r}i[a.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},i[a.Memo]=s;var d=Object.defineProperty,l=Object.getOwnPropertyNames,u=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,a){if("string"!=typeof n){if(m){var r=f(n);r&&r!==m&&e(t,r,a)}var s=l(n);u&&(s=s.concat(u(n)));for(var i=c(t),g=c(n),h=0;h<s.length;++h){var b=s[h];if(!(o[b]||a&&a[b]||g&&g[b]||i&&i[b])){var v=p(n,b);try{d(t,b,v)}catch(y){}}}}return t}},41143:e=>{"use strict";e.exports=function(e,t,n,a,r,o,s,i){if(!e){var c;if(void 0===t)c=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var d=[n,a,r,o,s,i],l=0;(c=new Error(t.replace(/%s/g,(function(){return d[l++]})))).name="Invariant Violation"}throw c.framesToPop=1,c}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},31336:(e,t,n)=>{var a,r;!function(){var o,s,i,c,d,l,u,p,f,m,g,h,b,v,y,k,w,x,E,_,S,C,T,L,P,R,O,N,I,A,D=function(e){var t=new D.Builder;return t.pipeline.add(D.trimmer,D.stopWordFilter,D.stemmer),t.searchPipeline.add(D.stemmer),e.call(t,t),t.build()};D.version="2.3.9",D.utils={},D.utils.warn=(o=this,function(e){o.console&&console.warn&&console.warn(e)}),D.utils.asString=function(e){return null==e?"":e.toString()},D.utils.clone=function(e){if(null==e)return e;for(var t=Object.create(null),n=Object.keys(e),a=0;a<n.length;a++){var r=n[a],o=e[r];if(Array.isArray(o))t[r]=o.slice();else{if("string"!=typeof o&&"number"!=typeof o&&"boolean"!=typeof o)throw new TypeError("clone is not deep and does not support nested objects");t[r]=o}}return t},D.FieldRef=function(e,t,n){this.docRef=e,this.fieldName=t,this._stringValue=n},D.FieldRef.joiner="/",D.FieldRef.fromString=function(e){var t=e.indexOf(D.FieldRef.joiner);if(-1===t)throw"malformed field ref string";var n=e.slice(0,t),a=e.slice(t+1);return new D.FieldRef(a,n,e)},D.FieldRef.prototype.toString=function(){return null==this._stringValue&&(this._stringValue=this.fieldName+D.FieldRef.joiner+this.docRef),this._stringValue},D.Set=function(e){if(this.elements=Object.create(null),e){this.length=e.length;for(var t=0;t<this.length;t++)this.elements[e[t]]=!0}else this.length=0},D.Set.complete={intersect:function(e){return e},union:function(){return this},contains:function(){return!0}},D.Set.empty={intersect:function(){return this},union:function(e){return e},contains:function(){return!1}},D.Set.prototype.contains=function(e){return!!this.elements[e]},D.Set.prototype.intersect=function(e){var t,n,a,r=[];if(e===D.Set.complete)return this;if(e===D.Set.empty)return e;this.length<e.length?(t=this,n=e):(t=e,n=this),a=Object.keys(t.elements);for(var o=0;o<a.length;o++){var s=a[o];s in n.elements&&r.push(s)}return new D.Set(r)},D.Set.prototype.union=function(e){return e===D.Set.complete?D.Set.complete:e===D.Set.empty?this:new D.Set(Object.keys(this.elements).concat(Object.keys(e.elements)))},D.idf=function(e,t){var n=0;for(var a in e)"_index"!=a&&(n+=Object.keys(e[a]).length);var r=(t-n+.5)/(n+.5);return Math.log(1+Math.abs(r))},D.Token=function(e,t){this.str=e||"",this.metadata=t||{}},D.Token.prototype.toString=function(){return this.str},D.Token.prototype.update=function(e){return this.str=e(this.str,this.metadata),this},D.Token.prototype.clone=function(e){return e=e||function(e){return e},new D.Token(e(this.str,this.metadata),this.metadata)},D.tokenizer=function(e,t){if(null==e||null==e)return[];if(Array.isArray(e))return e.map((function(e){return new D.Token(D.utils.asString(e).toLowerCase(),D.utils.clone(t))}));for(var n=e.toString().toLowerCase(),a=n.length,r=[],o=0,s=0;o<=a;o++){var i=o-s;if(n.charAt(o).match(D.tokenizer.separator)||o==a){if(i>0){var c=D.utils.clone(t)||{};c.position=[s,i],c.index=r.length,r.push(new D.Token(n.slice(s,o),c))}s=o+1}}return r},D.tokenizer.separator=/[\s\-]+/,D.Pipeline=function(){this._stack=[]},D.Pipeline.registeredFunctions=Object.create(null),D.Pipeline.registerFunction=function(e,t){t in this.registeredFunctions&&D.utils.warn("Overwriting existing registered function: "+t),e.label=t,D.Pipeline.registeredFunctions[e.label]=e},D.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||D.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},D.Pipeline.load=function(e){var t=new D.Pipeline;return e.forEach((function(e){var n=D.Pipeline.registeredFunctions[e];if(!n)throw new Error("Cannot load unregistered function: "+e);t.add(n)})),t},D.Pipeline.prototype.add=function(){Array.prototype.slice.call(arguments).forEach((function(e){D.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)}),this)},D.Pipeline.prototype.after=function(e,t){D.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");n+=1,this._stack.splice(n,0,t)},D.Pipeline.prototype.before=function(e,t){D.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");this._stack.splice(n,0,t)},D.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},D.Pipeline.prototype.run=function(e){for(var t=this._stack.length,n=0;n<t;n++){for(var a=this._stack[n],r=[],o=0;o<e.length;o++){var s=a(e[o],o,e);if(null!=s&&""!==s)if(Array.isArray(s))for(var i=0;i<s.length;i++)r.push(s[i]);else r.push(s)}e=r}return e},D.Pipeline.prototype.runString=function(e,t){var n=new D.Token(e,t);return this.run([n]).map((function(e){return e.toString()}))},D.Pipeline.prototype.reset=function(){this._stack=[]},D.Pipeline.prototype.toJSON=function(){return this._stack.map((function(e){return D.Pipeline.warnIfFunctionNotRegistered(e),e.label}))},D.Vector=function(e){this._magnitude=0,this.elements=e||[]},D.Vector.prototype.positionForIndex=function(e){if(0==this.elements.length)return 0;for(var t=0,n=this.elements.length/2,a=n-t,r=Math.floor(a/2),o=this.elements[2*r];a>1&&(o<e&&(t=r),o>e&&(n=r),o!=e);)a=n-t,r=t+Math.floor(a/2),o=this.elements[2*r];return o==e||o>e?2*r:o<e?2*(r+1):void 0},D.Vector.prototype.insert=function(e,t){this.upsert(e,t,(function(){throw"duplicate index"}))},D.Vector.prototype.upsert=function(e,t,n){this._magnitude=0;var a=this.positionForIndex(e);this.elements[a]==e?this.elements[a+1]=n(this.elements[a+1],t):this.elements.splice(a,0,e,t)},D.Vector.prototype.magnitude=function(){if(this._magnitude)return this._magnitude;for(var e=0,t=this.elements.length,n=1;n<t;n+=2){var a=this.elements[n];e+=a*a}return this._magnitude=Math.sqrt(e)},D.Vector.prototype.dot=function(e){for(var t=0,n=this.elements,a=e.elements,r=n.length,o=a.length,s=0,i=0,c=0,d=0;c<r&&d<o;)(s=n[c])<(i=a[d])?c+=2:s>i?d+=2:s==i&&(t+=n[c+1]*a[d+1],c+=2,d+=2);return t},D.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},D.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,n=0;t<this.elements.length;t+=2,n++)e[n]=this.elements[t];return e},D.Vector.prototype.toJSON=function(){return this.elements},D.stemmer=(s={ational:"ate",tional:"tion",enci:"ence",anci:"ance",izer:"ize",bli:"ble",alli:"al",entli:"ent",eli:"e",ousli:"ous",ization:"ize",ation:"ate",ator:"ate",alism:"al",iveness:"ive",fulness:"ful",ousness:"ous",aliti:"al",iviti:"ive",biliti:"ble",logi:"log"},i={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},u="^("+(d="[^aeiou][^aeiouy]*")+")?"+(l=(c="[aeiouy]")+"[aeiou]*")+d+"("+l+")?$",p="^("+d+")?"+l+d+l+d,f="^("+d+")?"+c,m=new RegExp("^("+d+")?"+l+d),g=new RegExp(p),h=new RegExp(u),b=new RegExp(f),v=/^(.+?)(ss|i)es$/,y=/^(.+?)([^s])s$/,k=/^(.+?)eed$/,w=/^(.+?)(ed|ing)$/,x=/.$/,E=/(at|bl|iz)$/,_=new RegExp("([^aeiouylsz])\\1$"),S=new RegExp("^"+d+c+"[^aeiouwxy]$"),C=/^(.+?[^aeiou])y$/,T=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,L=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,P=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,R=/^(.+?)(s|t)(ion)$/,O=/^(.+?)e$/,N=/ll$/,I=new RegExp("^"+d+c+"[^aeiouwxy]$"),A=function(e){var t,n,a,r,o,c,d;if(e.length<3)return e;if("y"==(a=e.substr(0,1))&&(e=a.toUpperCase()+e.substr(1)),o=y,(r=v).test(e)?e=e.replace(r,"$1$2"):o.test(e)&&(e=e.replace(o,"$1$2")),o=w,(r=k).test(e)){var l=r.exec(e);(r=m).test(l[1])&&(r=x,e=e.replace(r,""))}else o.test(e)&&(t=(l=o.exec(e))[1],(o=b).test(t)&&(c=_,d=S,(o=E).test(e=t)?e+="e":c.test(e)?(r=x,e=e.replace(r,"")):d.test(e)&&(e+="e")));return(r=C).test(e)&&(e=(t=(l=r.exec(e))[1])+"i"),(r=T).test(e)&&(t=(l=r.exec(e))[1],n=l[2],(r=m).test(t)&&(e=t+s[n])),(r=L).test(e)&&(t=(l=r.exec(e))[1],n=l[2],(r=m).test(t)&&(e=t+i[n])),o=R,(r=P).test(e)?(t=(l=r.exec(e))[1],(r=g).test(t)&&(e=t)):o.test(e)&&(t=(l=o.exec(e))[1]+l[2],(o=g).test(t)&&(e=t)),(r=O).test(e)&&(t=(l=r.exec(e))[1],o=h,c=I,((r=g).test(t)||o.test(t)&&!c.test(t))&&(e=t)),o=g,(r=N).test(e)&&o.test(e)&&(r=x,e=e.replace(r,"")),"y"==a&&(e=a.toLowerCase()+e.substr(1)),e},function(e){return e.update(A)}),D.Pipeline.registerFunction(D.stemmer,"stemmer"),D.generateStopWordFilter=function(e){var t=e.reduce((function(e,t){return e[t]=t,e}),{});return function(e){if(e&&t[e.toString()]!==e.toString())return e}},D.stopWordFilter=D.generateStopWordFilter(["a","able","about","across","after","all","almost","also","am","among","an","and","any","are","as","at","be","because","been","but","by","can","cannot","could","dear","did","do","does","either","else","ever","every","for","from","get","got","had","has","have","he","her","hers","him","his","how","however","i","if","in","into","is","it","its","just","least","let","like","likely","may","me","might","most","must","my","neither","no","nor","not","of","off","often","on","only","or","other","our","own","rather","said","say","says","she","should","since","so","some","than","that","the","their","them","then","there","these","they","this","tis","to","too","twas","us","wants","was","we","were","what","when","where","which","while","who","whom","why","will","with","would","yet","you","your"]),D.Pipeline.registerFunction(D.stopWordFilter,"stopWordFilter"),D.trimmer=function(e){return e.update((function(e){return e.replace(/^\W+/,"").replace(/\W+$/,"")}))},D.Pipeline.registerFunction(D.trimmer,"trimmer"),D.TokenSet=function(){this.final=!1,this.edges={},this.id=D.TokenSet._nextId,D.TokenSet._nextId+=1},D.TokenSet._nextId=1,D.TokenSet.fromArray=function(e){for(var t=new D.TokenSet.Builder,n=0,a=e.length;n<a;n++)t.insert(e[n]);return t.finish(),t.root},D.TokenSet.fromClause=function(e){return"editDistance"in e?D.TokenSet.fromFuzzyString(e.term,e.editDistance):D.TokenSet.fromString(e.term)},D.TokenSet.fromFuzzyString=function(e,t){for(var n=new D.TokenSet,a=[{node:n,editsRemaining:t,str:e}];a.length;){var r=a.pop();if(r.str.length>0){var o,s=r.str.charAt(0);s in r.node.edges?o=r.node.edges[s]:(o=new D.TokenSet,r.node.edges[s]=o),1==r.str.length&&(o.final=!0),a.push({node:o,editsRemaining:r.editsRemaining,str:r.str.slice(1)})}if(0!=r.editsRemaining){if("*"in r.node.edges)var i=r.node.edges["*"];else{i=new D.TokenSet;r.node.edges["*"]=i}if(0==r.str.length&&(i.final=!0),a.push({node:i,editsRemaining:r.editsRemaining-1,str:r.str}),r.str.length>1&&a.push({node:r.node,editsRemaining:r.editsRemaining-1,str:r.str.slice(1)}),1==r.str.length&&(r.node.final=!0),r.str.length>=1){if("*"in r.node.edges)var c=r.node.edges["*"];else{c=new D.TokenSet;r.node.edges["*"]=c}1==r.str.length&&(c.final=!0),a.push({node:c,editsRemaining:r.editsRemaining-1,str:r.str.slice(1)})}if(r.str.length>1){var d,l=r.str.charAt(0),u=r.str.charAt(1);u in r.node.edges?d=r.node.edges[u]:(d=new D.TokenSet,r.node.edges[u]=d),1==r.str.length&&(d.final=!0),a.push({node:d,editsRemaining:r.editsRemaining-1,str:l+r.str.slice(2)})}}}return n},D.TokenSet.fromString=function(e){for(var t=new D.TokenSet,n=t,a=0,r=e.length;a<r;a++){var o=e[a],s=a==r-1;if("*"==o)t.edges[o]=t,t.final=s;else{var i=new D.TokenSet;i.final=s,t.edges[o]=i,t=i}}return n},D.TokenSet.prototype.toArray=function(){for(var e=[],t=[{prefix:"",node:this}];t.length;){var n=t.pop(),a=Object.keys(n.node.edges),r=a.length;n.node.final&&(n.prefix.charAt(0),e.push(n.prefix));for(var o=0;o<r;o++){var s=a[o];t.push({prefix:n.prefix.concat(s),node:n.node.edges[s]})}}return e},D.TokenSet.prototype.toString=function(){if(this._str)return this._str;for(var e=this.final?"1":"0",t=Object.keys(this.edges).sort(),n=t.length,a=0;a<n;a++){var r=t[a];e=e+r+this.edges[r].id}return e},D.TokenSet.prototype.intersect=function(e){for(var t=new D.TokenSet,n=void 0,a=[{qNode:e,output:t,node:this}];a.length;){n=a.pop();for(var r=Object.keys(n.qNode.edges),o=r.length,s=Object.keys(n.node.edges),i=s.length,c=0;c<o;c++)for(var d=r[c],l=0;l<i;l++){var u=s[l];if(u==d||"*"==d){var p=n.node.edges[u],f=n.qNode.edges[d],m=p.final&&f.final,g=void 0;u in n.output.edges?(g=n.output.edges[u]).final=g.final||m:((g=new D.TokenSet).final=m,n.output.edges[u]=g),a.push({qNode:f,output:g,node:p})}}}return t},D.TokenSet.Builder=function(){this.previousWord="",this.root=new D.TokenSet,this.uncheckedNodes=[],this.minimizedNodes={}},D.TokenSet.Builder.prototype.insert=function(e){var t,n=0;if(e<this.previousWord)throw new Error("Out of order word insertion");for(var a=0;a<e.length&&a<this.previousWord.length&&e[a]==this.previousWord[a];a++)n++;this.minimize(n),t=0==this.uncheckedNodes.length?this.root:this.uncheckedNodes[this.uncheckedNodes.length-1].child;for(a=n;a<e.length;a++){var r=new D.TokenSet,o=e[a];t.edges[o]=r,this.uncheckedNodes.push({parent:t,char:o,child:r}),t=r}t.final=!0,this.previousWord=e},D.TokenSet.Builder.prototype.finish=function(){this.minimize(0)},D.TokenSet.Builder.prototype.minimize=function(e){for(var t=this.uncheckedNodes.length-1;t>=e;t--){var n=this.uncheckedNodes[t],a=n.child.toString();a in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[a]:(n.child._str=a,this.minimizedNodes[a]=n.child),this.uncheckedNodes.pop()}},D.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},D.Index.prototype.search=function(e){return this.query((function(t){new D.QueryParser(e,t).parse()}))},D.Index.prototype.query=function(e){for(var t=new D.Query(this.fields),n=Object.create(null),a=Object.create(null),r=Object.create(null),o=Object.create(null),s=Object.create(null),i=0;i<this.fields.length;i++)a[this.fields[i]]=new D.Vector;e.call(t,t);for(i=0;i<t.clauses.length;i++){var c=t.clauses[i],d=null,l=D.Set.empty;d=c.usePipeline?this.pipeline.runString(c.term,{fields:c.fields}):[c.term];for(var u=0;u<d.length;u++){var p=d[u];c.term=p;var f=D.TokenSet.fromClause(c),m=this.tokenSet.intersect(f).toArray();if(0===m.length&&c.presence===D.Query.presence.REQUIRED){for(var g=0;g<c.fields.length;g++){o[O=c.fields[g]]=D.Set.empty}break}for(var h=0;h<m.length;h++){var b=m[h],v=this.invertedIndex[b],y=v._index;for(g=0;g<c.fields.length;g++){var k=v[O=c.fields[g]],w=Object.keys(k),x=b+"/"+O,E=new D.Set(w);if(c.presence==D.Query.presence.REQUIRED&&(l=l.union(E),void 0===o[O]&&(o[O]=D.Set.complete)),c.presence!=D.Query.presence.PROHIBITED){if(a[O].upsert(y,c.boost,(function(e,t){return e+t})),!r[x]){for(var _=0;_<w.length;_++){var S,C=w[_],T=new D.FieldRef(C,O),L=k[C];void 0===(S=n[T])?n[T]=new D.MatchData(b,O,L):S.add(b,O,L)}r[x]=!0}}else void 0===s[O]&&(s[O]=D.Set.empty),s[O]=s[O].union(E)}}}if(c.presence===D.Query.presence.REQUIRED)for(g=0;g<c.fields.length;g++){o[O=c.fields[g]]=o[O].intersect(l)}}var P=D.Set.complete,R=D.Set.empty;for(i=0;i<this.fields.length;i++){var O;o[O=this.fields[i]]&&(P=P.intersect(o[O])),s[O]&&(R=R.union(s[O]))}var N=Object.keys(n),I=[],A=Object.create(null);if(t.isNegated()){N=Object.keys(this.fieldVectors);for(i=0;i<N.length;i++){T=N[i];var M=D.FieldRef.fromString(T);n[T]=new D.MatchData}}for(i=0;i<N.length;i++){var F=(M=D.FieldRef.fromString(N[i])).docRef;if(P.contains(F)&&!R.contains(F)){var B,j=this.fieldVectors[M],z=a[M.fieldName].similarity(j);if(void 0!==(B=A[F]))B.score+=z,B.matchData.combine(n[M]);else{var $={ref:F,score:z,matchData:n[M]};A[F]=$,I.push($)}}}return I.sort((function(e,t){return t.score-e.score}))},D.Index.prototype.toJSON=function(){var e=Object.keys(this.invertedIndex).sort().map((function(e){return[e,this.invertedIndex[e]]}),this),t=Object.keys(this.fieldVectors).map((function(e){return[e,this.fieldVectors[e].toJSON()]}),this);return{version:D.version,fields:this.fields,fieldVectors:t,invertedIndex:e,pipeline:this.pipeline.toJSON()}},D.Index.load=function(e){var t={},n={},a=e.fieldVectors,r=Object.create(null),o=e.invertedIndex,s=new D.TokenSet.Builder,i=D.Pipeline.load(e.pipeline);e.version!=D.version&&D.utils.warn("Version mismatch when loading serialised index. Current version of lunr '"+D.version+"' does not match serialized index '"+e.version+"'");for(var c=0;c<a.length;c++){var d=(u=a[c])[0],l=u[1];n[d]=new D.Vector(l)}for(c=0;c<o.length;c++){var u,p=(u=o[c])[0],f=u[1];s.insert(p),r[p]=f}return s.finish(),t.fields=e.fields,t.fieldVectors=n,t.invertedIndex=r,t.tokenSet=s.root,t.pipeline=i,new D.Index(t)},D.Builder=function(){this._ref="id",this._fields=Object.create(null),this._documents=Object.create(null),this.invertedIndex=Object.create(null),this.fieldTermFrequencies={},this.fieldLengths={},this.tokenizer=D.tokenizer,this.pipeline=new D.Pipeline,this.searchPipeline=new D.Pipeline,this.documentCount=0,this._b=.75,this._k1=1.2,this.termIndex=0,this.metadataWhitelist=[]},D.Builder.prototype.ref=function(e){this._ref=e},D.Builder.prototype.field=function(e,t){if(/\//.test(e))throw new RangeError("Field '"+e+"' contains illegal character '/'");this._fields[e]=t||{}},D.Builder.prototype.b=function(e){this._b=e<0?0:e>1?1:e},D.Builder.prototype.k1=function(e){this._k1=e},D.Builder.prototype.add=function(e,t){var n=e[this._ref],a=Object.keys(this._fields);this._documents[n]=t||{},this.documentCount+=1;for(var r=0;r<a.length;r++){var o=a[r],s=this._fields[o].extractor,i=s?s(e):e[o],c=this.tokenizer(i,{fields:[o]}),d=this.pipeline.run(c),l=new D.FieldRef(n,o),u=Object.create(null);this.fieldTermFrequencies[l]=u,this.fieldLengths[l]=0,this.fieldLengths[l]+=d.length;for(var p=0;p<d.length;p++){var f=d[p];if(null==u[f]&&(u[f]=0),u[f]+=1,null==this.invertedIndex[f]){var m=Object.create(null);m._index=this.termIndex,this.termIndex+=1;for(var g=0;g<a.length;g++)m[a[g]]=Object.create(null);this.invertedIndex[f]=m}null==this.invertedIndex[f][o][n]&&(this.invertedIndex[f][o][n]=Object.create(null));for(var h=0;h<this.metadataWhitelist.length;h++){var b=this.metadataWhitelist[h],v=f.metadata[b];null==this.invertedIndex[f][o][n][b]&&(this.invertedIndex[f][o][n][b]=[]),this.invertedIndex[f][o][n][b].push(v)}}}},D.Builder.prototype.calculateAverageFieldLengths=function(){for(var e=Object.keys(this.fieldLengths),t=e.length,n={},a={},r=0;r<t;r++){var o=D.FieldRef.fromString(e[r]),s=o.fieldName;a[s]||(a[s]=0),a[s]+=1,n[s]||(n[s]=0),n[s]+=this.fieldLengths[o]}var i=Object.keys(this._fields);for(r=0;r<i.length;r++){var c=i[r];n[c]=n[c]/a[c]}this.averageFieldLength=n},D.Builder.prototype.createFieldVectors=function(){for(var e={},t=Object.keys(this.fieldTermFrequencies),n=t.length,a=Object.create(null),r=0;r<n;r++){for(var o=D.FieldRef.fromString(t[r]),s=o.fieldName,i=this.fieldLengths[o],c=new D.Vector,d=this.fieldTermFrequencies[o],l=Object.keys(d),u=l.length,p=this._fields[s].boost||1,f=this._documents[o.docRef].boost||1,m=0;m<u;m++){var g,h,b,v=l[m],y=d[v],k=this.invertedIndex[v]._index;void 0===a[v]?(g=D.idf(this.invertedIndex[v],this.documentCount),a[v]=g):g=a[v],h=g*((this._k1+1)*y)/(this._k1*(1-this._b+this._b*(i/this.averageFieldLength[s]))+y),h*=p,h*=f,b=Math.round(1e3*h)/1e3,c.insert(k,b)}e[o]=c}this.fieldVectors=e},D.Builder.prototype.createTokenSet=function(){this.tokenSet=D.TokenSet.fromArray(Object.keys(this.invertedIndex).sort())},D.Builder.prototype.build=function(){return this.calculateAverageFieldLengths(),this.createFieldVectors(),this.createTokenSet(),new D.Index({invertedIndex:this.invertedIndex,fieldVectors:this.fieldVectors,tokenSet:this.tokenSet,fields:Object.keys(this._fields),pipeline:this.searchPipeline})},D.Builder.prototype.use=function(e){var t=Array.prototype.slice.call(arguments,1);t.unshift(this),e.apply(this,t)},D.MatchData=function(e,t,n){for(var a=Object.create(null),r=Object.keys(n||{}),o=0;o<r.length;o++){var s=r[o];a[s]=n[s].slice()}this.metadata=Object.create(null),void 0!==e&&(this.metadata[e]=Object.create(null),this.metadata[e][t]=a)},D.MatchData.prototype.combine=function(e){for(var t=Object.keys(e.metadata),n=0;n<t.length;n++){var a=t[n],r=Object.keys(e.metadata[a]);null==this.metadata[a]&&(this.metadata[a]=Object.create(null));for(var o=0;o<r.length;o++){var s=r[o],i=Object.keys(e.metadata[a][s]);null==this.metadata[a][s]&&(this.metadata[a][s]=Object.create(null));for(var c=0;c<i.length;c++){var d=i[c];null==this.metadata[a][s][d]?this.metadata[a][s][d]=e.metadata[a][s][d]:this.metadata[a][s][d]=this.metadata[a][s][d].concat(e.metadata[a][s][d])}}}},D.MatchData.prototype.add=function(e,t,n){if(!(e in this.metadata))return this.metadata[e]=Object.create(null),void(this.metadata[e][t]=n);if(t in this.metadata[e])for(var a=Object.keys(n),r=0;r<a.length;r++){var o=a[r];o in this.metadata[e][t]?this.metadata[e][t][o]=this.metadata[e][t][o].concat(n[o]):this.metadata[e][t][o]=n[o]}else this.metadata[e][t]=n},D.Query=function(e){this.clauses=[],this.allFields=e},D.Query.wildcard=new String("*"),D.Query.wildcard.NONE=0,D.Query.wildcard.LEADING=1,D.Query.wildcard.TRAILING=2,D.Query.presence={OPTIONAL:1,REQUIRED:2,PROHIBITED:3},D.Query.prototype.clause=function(e){return"fields"in e||(e.fields=this.allFields),"boost"in e||(e.boost=1),"usePipeline"in e||(e.usePipeline=!0),"wildcard"in e||(e.wildcard=D.Query.wildcard.NONE),e.wildcard&D.Query.wildcard.LEADING&&e.term.charAt(0)!=D.Query.wildcard&&(e.term="*"+e.term),e.wildcard&D.Query.wildcard.TRAILING&&e.term.slice(-1)!=D.Query.wildcard&&(e.term=e.term+"*"),"presence"in e||(e.presence=D.Query.presence.OPTIONAL),this.clauses.push(e),this},D.Query.prototype.isNegated=function(){for(var e=0;e<this.clauses.length;e++)if(this.clauses[e].presence!=D.Query.presence.PROHIBITED)return!1;return!0},D.Query.prototype.term=function(e,t){if(Array.isArray(e))return e.forEach((function(e){this.term(e,D.utils.clone(t))}),this),this;var n=t||{};return n.term=e.toString(),this.clause(n),this},D.QueryParseError=function(e,t,n){this.name="QueryParseError",this.message=e,this.start=t,this.end=n},D.QueryParseError.prototype=new Error,D.QueryLexer=function(e){this.lexemes=[],this.str=e,this.length=e.length,this.pos=0,this.start=0,this.escapeCharPositions=[]},D.QueryLexer.prototype.run=function(){for(var e=D.QueryLexer.lexText;e;)e=e(this)},D.QueryLexer.prototype.sliceString=function(){for(var e=[],t=this.start,n=this.pos,a=0;a<this.escapeCharPositions.length;a++)n=this.escapeCharPositions[a],e.push(this.str.slice(t,n)),t=n+1;return e.push(this.str.slice(t,this.pos)),this.escapeCharPositions.length=0,e.join("")},D.QueryLexer.prototype.emit=function(e){this.lexemes.push({type:e,str:this.sliceString(),start:this.start,end:this.pos}),this.start=this.pos},D.QueryLexer.prototype.escapeCharacter=function(){this.escapeCharPositions.push(this.pos-1),this.pos+=1},D.QueryLexer.prototype.next=function(){if(this.pos>=this.length)return D.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},D.QueryLexer.prototype.width=function(){return this.pos-this.start},D.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},D.QueryLexer.prototype.backup=function(){this.pos-=1},D.QueryLexer.prototype.acceptDigitRun=function(){var e,t;do{t=(e=this.next()).charCodeAt(0)}while(t>47&&t<58);e!=D.QueryLexer.EOS&&this.backup()},D.QueryLexer.prototype.more=function(){return this.pos<this.length},D.QueryLexer.EOS="EOS",D.QueryLexer.FIELD="FIELD",D.QueryLexer.TERM="TERM",D.QueryLexer.EDIT_DISTANCE="EDIT_DISTANCE",D.QueryLexer.BOOST="BOOST",D.QueryLexer.PRESENCE="PRESENCE",D.QueryLexer.lexField=function(e){return e.backup(),e.emit(D.QueryLexer.FIELD),e.ignore(),D.QueryLexer.lexText},D.QueryLexer.lexTerm=function(e){if(e.width()>1&&(e.backup(),e.emit(D.QueryLexer.TERM)),e.ignore(),e.more())return D.QueryLexer.lexText},D.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(D.QueryLexer.EDIT_DISTANCE),D.QueryLexer.lexText},D.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(D.QueryLexer.BOOST),D.QueryLexer.lexText},D.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(D.QueryLexer.TERM)},D.QueryLexer.termSeparator=D.tokenizer.separator,D.QueryLexer.lexText=function(e){for(;;){var t=e.next();if(t==D.QueryLexer.EOS)return D.QueryLexer.lexEOS;if(92!=t.charCodeAt(0)){if(":"==t)return D.QueryLexer.lexField;if("~"==t)return e.backup(),e.width()>0&&e.emit(D.QueryLexer.TERM),D.QueryLexer.lexEditDistance;if("^"==t)return e.backup(),e.width()>0&&e.emit(D.QueryLexer.TERM),D.QueryLexer.lexBoost;if("+"==t&&1===e.width())return e.emit(D.QueryLexer.PRESENCE),D.QueryLexer.lexText;if("-"==t&&1===e.width())return e.emit(D.QueryLexer.PRESENCE),D.QueryLexer.lexText;if(t.match(D.QueryLexer.termSeparator))return D.QueryLexer.lexTerm}else e.escapeCharacter()}},D.QueryParser=function(e,t){this.lexer=new D.QueryLexer(e),this.query=t,this.currentClause={},this.lexemeIdx=0},D.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=D.QueryParser.parseClause;e;)e=e(this);return this.query},D.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},D.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},D.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},D.QueryParser.parseClause=function(e){var t=e.peekLexeme();if(null!=t)switch(t.type){case D.QueryLexer.PRESENCE:return D.QueryParser.parsePresence;case D.QueryLexer.FIELD:return D.QueryParser.parseField;case D.QueryLexer.TERM:return D.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+t.type;throw t.str.length>=1&&(n+=" with value '"+t.str+"'"),new D.QueryParseError(n,t.start,t.end)}},D.QueryParser.parsePresence=function(e){var t=e.consumeLexeme();if(null!=t){switch(t.str){case"-":e.currentClause.presence=D.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=D.Query.presence.REQUIRED;break;default:var n="unrecognised presence operator'"+t.str+"'";throw new D.QueryParseError(n,t.start,t.end)}var a=e.peekLexeme();if(null==a){n="expecting term or field, found nothing";throw new D.QueryParseError(n,t.start,t.end)}switch(a.type){case D.QueryLexer.FIELD:return D.QueryParser.parseField;case D.QueryLexer.TERM:return D.QueryParser.parseTerm;default:n="expecting term or field, found '"+a.type+"'";throw new D.QueryParseError(n,a.start,a.end)}}},D.QueryParser.parseField=function(e){var t=e.consumeLexeme();if(null!=t){if(-1==e.query.allFields.indexOf(t.str)){var n=e.query.allFields.map((function(e){return"'"+e+"'"})).join(", "),a="unrecognised field '"+t.str+"', possible fields: "+n;throw new D.QueryParseError(a,t.start,t.end)}e.currentClause.fields=[t.str];var r=e.peekLexeme();if(null==r){a="expecting term, found nothing";throw new D.QueryParseError(a,t.start,t.end)}if(r.type===D.QueryLexer.TERM)return D.QueryParser.parseTerm;a="expecting term, found '"+r.type+"'";throw new D.QueryParseError(a,r.start,r.end)}},D.QueryParser.parseTerm=function(e){var t=e.consumeLexeme();if(null!=t){e.currentClause.term=t.str.toLowerCase(),-1!=t.str.indexOf("*")&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(null!=n)switch(n.type){case D.QueryLexer.TERM:return e.nextClause(),D.QueryParser.parseTerm;case D.QueryLexer.FIELD:return e.nextClause(),D.QueryParser.parseField;case D.QueryLexer.EDIT_DISTANCE:return D.QueryParser.parseEditDistance;case D.QueryLexer.BOOST:return D.QueryParser.parseBoost;case D.QueryLexer.PRESENCE:return e.nextClause(),D.QueryParser.parsePresence;default:var a="Unexpected lexeme type '"+n.type+"'";throw new D.QueryParseError(a,n.start,n.end)}else e.nextClause()}},D.QueryParser.parseEditDistance=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var a="edit distance must be numeric";throw new D.QueryParseError(a,t.start,t.end)}e.currentClause.editDistance=n;var r=e.peekLexeme();if(null!=r)switch(r.type){case D.QueryLexer.TERM:return e.nextClause(),D.QueryParser.parseTerm;case D.QueryLexer.FIELD:return e.nextClause(),D.QueryParser.parseField;case D.QueryLexer.EDIT_DISTANCE:return D.QueryParser.parseEditDistance;case D.QueryLexer.BOOST:return D.QueryParser.parseBoost;case D.QueryLexer.PRESENCE:return e.nextClause(),D.QueryParser.parsePresence;default:a="Unexpected lexeme type '"+r.type+"'";throw new D.QueryParseError(a,r.start,r.end)}else e.nextClause()}},D.QueryParser.parseBoost=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var a="boost must be numeric";throw new D.QueryParseError(a,t.start,t.end)}e.currentClause.boost=n;var r=e.peekLexeme();if(null!=r)switch(r.type){case D.QueryLexer.TERM:return e.nextClause(),D.QueryParser.parseTerm;case D.QueryLexer.FIELD:return e.nextClause(),D.QueryParser.parseField;case D.QueryLexer.EDIT_DISTANCE:return D.QueryParser.parseEditDistance;case D.QueryLexer.BOOST:return D.QueryParser.parseBoost;case D.QueryLexer.PRESENCE:return e.nextClause(),D.QueryParser.parsePresence;default:a="Unexpected lexeme type '"+r.type+"'";throw new D.QueryParseError(a,r.start,r.end)}else e.nextClause()}},void 0===(r="function"==typeof(a=function(){return D})?a.call(t,n,t,e):a)||(e.exports=r)}()},32497:(e,t,n)=>{"use strict";n.r(t)},52295:(e,t,n)=>{"use strict";n.r(t)},74865:function(e,t,n){var a,r;a=function(){var e,t,n={version:"0.2.0"},a=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'<div class="bar" role="bar"><div class="peg"></div></div><div class="spinner" role="spinner"><div class="spinner-icon"></div></div>'};function r(e,t,n){return e<t?t:e>n?n:e}function o(e){return 100*(-1+e)}function s(e,t,n){var r;return(r="translate3d"===a.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===a.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,r}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(a[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=r(e,a.minimum,1),n.status=1===e?null:e;var o=n.render(!t),d=o.querySelector(a.barSelector),l=a.speed,u=a.easing;return o.offsetWidth,i((function(t){""===a.positionUsing&&(a.positionUsing=n.getPositioningCSS()),c(d,s(e,l,u)),1===e?(c(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){c(o,{transition:"all "+l+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),l)}),l)):setTimeout(t,l)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),a.trickleSpeed)};return a.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*r(Math.random()*t,.1,.95)),t=r(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*a.trickleRate)},e=0,t=0,n.promise=function(a){return a&&"resolved"!==a.state()?(0===t&&n.start(),e++,t++,a.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");l(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=a.template;var r,s=t.querySelector(a.barSelector),i=e?"-100":o(n.status||0),d=document.querySelector(a.parent);return c(s,{transition:"all 0 linear",transform:"translate3d("+i+"%,0,0)"}),a.showSpinner||(r=t.querySelector(a.spinnerSelector))&&f(r),d!=document.body&&l(d,"nprogress-custom-parent"),d.appendChild(t),t},n.remove=function(){u(document.documentElement,"nprogress-busy"),u(document.querySelector(a.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var i=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),c=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function a(t){var n=document.body.style;if(t in n)return t;for(var a,r=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);r--;)if((a=e[r]+o)in n)return a;return t}function r(e){return e=n(e),t[e]||(t[e]=a(e))}function o(e,t,n){t=r(t),e.style[t]=n}return function(e,t){var n,a,r=arguments;if(2==r.length)for(n in t)void 0!==(a=t[n])&&t.hasOwnProperty(n)&&o(e,n,a);else o(e,r[1],r[2])}}();function d(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function l(e,t){var n=p(e),a=n+t;d(n,t)||(e.className=a.substring(1))}function u(e,t){var n,a=p(e);d(e,t)&&(n=a.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(r="function"==typeof a?a.call(t,n,t,e):a)||(e.exports=r)},27418:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,a=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var a={};return"abcdefghijklmnopqrst".split("").forEach((function(e){a[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},a)).join("")}catch(r){return!1}}()?Object.assign:function(e,r){for(var o,s,i=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),c=1;c<arguments.length;c++){for(var d in o=Object(arguments[c]))n.call(o,d)&&(i[d]=o[d]);if(t){s=t(o);for(var l=0;l<s.length;l++)a.call(o,s[l])&&(i[s[l]]=o[s[l]])}}return i}},14779:(e,t,n)=>{var a=n(5826);e.exports=f,e.exports.parse=o,e.exports.compile=function(e,t){return i(o(e,t),t)},e.exports.tokensToFunction=i,e.exports.tokensToRegExp=p;var r=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function o(e,t){for(var n,a=[],o=0,s=0,i="",l=t&&t.delimiter||"/";null!=(n=r.exec(e));){var u=n[0],p=n[1],f=n.index;if(i+=e.slice(s,f),s=f+u.length,p)i+=p[1];else{var m=e[s],g=n[2],h=n[3],b=n[4],v=n[5],y=n[6],k=n[7];i&&(a.push(i),i="");var w=null!=g&&null!=m&&m!==g,x="+"===y||"*"===y,E="?"===y||"*"===y,_=n[2]||l,S=b||v;a.push({name:h||o++,prefix:g||"",delimiter:_,optional:E,repeat:x,partial:w,asterisk:!!k,pattern:S?d(S):k?".*":"[^"+c(_)+"]+?"})}}return s<e.length&&(i+=e.substr(s)),i&&a.push(i),a}function s(e){return encodeURI(e).replace(/[\/?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}))}function i(e,t){for(var n=new Array(e.length),r=0;r<e.length;r++)"object"==typeof e[r]&&(n[r]=new RegExp("^(?:"+e[r].pattern+")$",u(t)));return function(t,r){for(var o="",i=t||{},c=(r||{}).pretty?s:encodeURIComponent,d=0;d<e.length;d++){var l=e[d];if("string"!=typeof l){var u,p=i[l.name];if(null==p){if(l.optional){l.partial&&(o+=l.prefix);continue}throw new TypeError('Expected "'+l.name+'" to be defined')}if(a(p)){if(!l.repeat)throw new TypeError('Expected "'+l.name+'" to not repeat, but received `'+JSON.stringify(p)+"`");if(0===p.length){if(l.optional)continue;throw new TypeError('Expected "'+l.name+'" to not be empty')}for(var f=0;f<p.length;f++){if(u=c(p[f]),!n[d].test(u))throw new TypeError('Expected all "'+l.name+'" to match "'+l.pattern+'", but received `'+JSON.stringify(u)+"`");o+=(0===f?l.prefix:l.delimiter)+u}}else{if(u=l.asterisk?encodeURI(p).replace(/[?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})):c(p),!n[d].test(u))throw new TypeError('Expected "'+l.name+'" to match "'+l.pattern+'", but received "'+u+'"');o+=l.prefix+u}}else o+=l}return o}}function c(e){return e.replace(/([.+*?=^!:${}()[\]|\/\\])/g,"\\$1")}function d(e){return e.replace(/([=!:$\/()])/g,"\\$1")}function l(e,t){return e.keys=t,e}function u(e){return e&&e.sensitive?"":"i"}function p(e,t,n){a(t)||(n=t||n,t=[]);for(var r=(n=n||{}).strict,o=!1!==n.end,s="",i=0;i<e.length;i++){var d=e[i];if("string"==typeof d)s+=c(d);else{var p=c(d.prefix),f="(?:"+d.pattern+")";t.push(d),d.repeat&&(f+="(?:"+p+f+")*"),s+=f=d.optional?d.partial?p+"("+f+")?":"(?:"+p+"("+f+"))?":p+"("+f+")"}}var m=c(n.delimiter||"/"),g=s.slice(-m.length)===m;return r||(s=(g?s.slice(0,-m.length):s)+"(?:"+m+"(?=$))?"),s+=o?"$":r&&g?"":"(?="+m+"|$)",l(new RegExp("^"+s,u(n)),t)}function f(e,t,n){return a(t)||(n=t||n,t=[]),n=n||{},e instanceof RegExp?function(e,t){var n=e.source.match(/\((?!\?)/g);if(n)for(var a=0;a<n.length;a++)t.push({name:a,prefix:null,delimiter:null,optional:!1,repeat:!1,partial:!1,asterisk:!1,pattern:null});return l(e,t)}(e,t):a(e)?function(e,t,n){for(var a=[],r=0;r<e.length;r++)a.push(f(e[r],t,n).source);return l(new RegExp("(?:"+a.join("|")+")",u(n)),t)}(e,t,n):function(e,t,n){return p(o(e,n),t,n)}(e,t,n)}},87410:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var a=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},a={util:{encode:function e(t){return t instanceof r?new r(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/</g,"<").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++t}),e.__id},clone:function e(t,n){var r,o;switch(n=n||{},a.util.type(t)){case"Object":if(o=a.util.objId(t),n[o])return n[o];for(var s in r={},n[o]=r,t)t.hasOwnProperty(s)&&(r[s]=e(t[s],n));return r;case"Array":return o=a.util.objId(t),n[o]?n[o]:(r=[],n[o]=r,t.forEach((function(t,a){r[a]=e(t,n)})),r);default:return t}},getLanguage:function(t){for(;t;){var n=e.exec(t.className);if(n)return n[1].toLowerCase();t=t.parentElement}return"none"},setLanguage:function(t,n){t.className=t.className.replace(RegExp(e,"gi"),""),t.classList.add("language-"+n)},isActive:function(e,t,n){for(var a="no-"+t;e;){var r=e.classList;if(r.contains(t))return!0;if(r.contains(a))return!1;e=e.parentElement}return!!n}},languages:{plain:n,plaintext:n,text:n,txt:n,extend:function(e,t){var n=a.util.clone(a.languages[e]);for(var r in t)n[r]=t[r];return n},insertBefore:function(e,t,n,r){var o=(r=r||a.languages)[e],s={};for(var i in o)if(o.hasOwnProperty(i)){if(i==t)for(var c in n)n.hasOwnProperty(c)&&(s[c]=n[c]);n.hasOwnProperty(i)||(s[i]=o[i])}var d=r[e];return r[e]=s,a.languages.DFS(a.languages,(function(t,n){n===d&&t!=e&&(this[t]=s)})),s},DFS:function e(t,n,r,o){o=o||{};var s=a.util.objId;for(var i in t)if(t.hasOwnProperty(i)){n.call(t,i,t[i],r||i);var c=t[i],d=a.util.type(c);"Object"!==d||o[s(c)]?"Array"!==d||o[s(c)]||(o[s(c)]=!0,e(c,n,i,o)):(o[s(c)]=!0,e(c,n,null,o))}}},plugins:{},highlight:function(e,t,n){var o={code:e,grammar:t,language:n};return a.hooks.run("before-tokenize",o),o.tokens=a.tokenize(o.code,o.grammar),a.hooks.run("after-tokenize",o),r.stringify(a.util.encode(o.tokens),o.language)},tokenize:function(e,t){var n=t.rest;if(n){for(var a in n)t[a]=n[a];delete t.rest}var r=new i;return c(r,r.head,e),s(e,r,t,r.head,0),function(e){var t=[],n=e.head.next;for(;n!==e.tail;)t.push(n.value),n=n.next;return t}(r)},hooks:{all:{},add:function(e,t){var n=a.hooks.all;n[e]=n[e]||[],n[e].push(t)},run:function(e,t){var n=a.hooks.all[e];if(n&&n.length)for(var r,o=0;r=n[o++];)r(t)}},Token:r};function r(e,t,n,a){this.type=e,this.content=t,this.alias=n,this.length=0|(a||"").length}function o(e,t,n,a){e.lastIndex=t;var r=e.exec(n);if(r&&a&&r[1]){var o=r[1].length;r.index+=o,r[0]=r[0].slice(o)}return r}function s(e,t,n,i,l,u){for(var p in n)if(n.hasOwnProperty(p)&&n[p]){var f=n[p];f=Array.isArray(f)?f:[f];for(var m=0;m<f.length;++m){if(u&&u.cause==p+","+m)return;var g=f[m],h=g.inside,b=!!g.lookbehind,v=!!g.greedy,y=g.alias;if(v&&!g.pattern.global){var k=g.pattern.toString().match(/[imsuy]*$/)[0];g.pattern=RegExp(g.pattern.source,k+"g")}for(var w=g.pattern||g,x=i.next,E=l;x!==t.tail&&!(u&&E>=u.reach);E+=x.value.length,x=x.next){var _=x.value;if(t.length>e.length)return;if(!(_ instanceof r)){var S,C=1;if(v){if(!(S=o(w,E,e,b))||S.index>=e.length)break;var T=S.index,L=S.index+S[0].length,P=E;for(P+=x.value.length;T>=P;)P+=(x=x.next).value.length;if(E=P-=x.value.length,x.value instanceof r)continue;for(var R=x;R!==t.tail&&(P<L||"string"==typeof R.value);R=R.next)C++,P+=R.value.length;C--,_=e.slice(E,P),S.index-=E}else if(!(S=o(w,0,_,b)))continue;T=S.index;var O=S[0],N=_.slice(0,T),I=_.slice(T+O.length),A=E+_.length;u&&A>u.reach&&(u.reach=A);var D=x.prev;if(N&&(D=c(t,D,N),E+=N.length),d(t,D,C),x=c(t,D,new r(p,h?a.tokenize(O,h):O,y,O)),I&&c(t,x,I),C>1){var M={cause:p+","+m,reach:A};s(e,t,n,x.prev,E,M),u&&M.reach>u.reach&&(u.reach=M.reach)}}}}}}function i(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function c(e,t,n){var a=t.next,r={value:n,prev:t,next:a};return t.next=r,a.prev=r,e.length++,r}function d(e,t,n){for(var a=t.next,r=0;r<n&&a!==e.tail;r++)a=a.next;t.next=a,a.prev=t,e.length-=r}return r.stringify=function e(t,n){if("string"==typeof t)return t;if(Array.isArray(t)){var r="";return t.forEach((function(t){r+=e(t,n)})),r}var o={type:t.type,content:e(t.content,n),tag:"span",classes:["token",t.type],attributes:{},language:n},s=t.alias;s&&(Array.isArray(s)?Array.prototype.push.apply(o.classes,s):o.classes.push(s)),a.hooks.run("wrap",o);var i="";for(var c in o.attributes)i+=" "+c+'="'+(o.attributes[c]||"").replace(/"/g,""")+'"';return"<"+o.tag+' class="'+o.classes.join(" ")+'"'+i+">"+o.content+"</"+o.tag+">"},a}(),r=a;a.default=a,r.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\s\S])*?-->/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},r.languages.markup.tag.inside["attr-value"].inside.entity=r.languages.markup.entity,r.languages.markup.doctype.inside["internal-subset"].inside=r.languages.markup,r.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(r.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:r.languages[t]},n.cdata=/^<!\[CDATA\[|\]\]>$/i;var a={"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:n}};a["language-"+t]={pattern:/[\s\S]+/,inside:r.languages[t]};var o={};o[e]={pattern:RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:a},r.languages.insertBefore("markup","cdata",o)}}),Object.defineProperty(r.languages.markup.tag,"addAttribute",{value:function(e,t){r.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:r.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),r.languages.html=r.languages.markup,r.languages.mathml=r.languages.markup,r.languages.svg=r.languages.markup,r.languages.xml=r.languages.extend("markup",{}),r.languages.ssml=r.languages.xml,r.languages.atom=r.languages.xml,r.languages.rss=r.languages.xml,function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},a={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:a},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:a},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:a.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:a.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var r=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=a.variable[1].inside,s=0;s<r.length;s++)o[r[s]]=e.languages.bash[r[s]];e.languages.shell=e.languages.bash}(r),r.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},r.languages.c=r.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),r.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),r.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},r.languages.c.string],char:r.languages.c.char,comment:r.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:r.languages.c}}}}),r.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete r.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!<keyword>)\w+(?:\s*\.\s*\w+)*\b/.source.replace(/<keyword>/g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!<keyword>)\w+/.source.replace(/<keyword>/g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/<mod-name>(?:\s*:\s*<mod-name>)?|:\s*<mod-name>/.source.replace(/<mod-name>/g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(r),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(r),function(e){var t,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var a={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},r={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:a,number:r,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:a,number:r})}(r),r.languages.javascript=r.languages.extend("clike",{"class-name":[r.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),r.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,r.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:r.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:r.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:r.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:r.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:r.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),r.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:r.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),r.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),r.languages.markup&&(r.languages.markup.tag.addInlined("script","javascript"),r.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),r.languages.js=r.languages.javascript,function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(r),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,a="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",r=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-]<PLAIN>)(?:[ \t]*(?:(?![#:])<PLAIN>|:<PLAIN>))*/.source.replace(/<PLAIN>/g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),o=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function s(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<<prop>>[ \t]+)?)(?:<<value>>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<<prop>>/g,(function(){return a})).replace(/<<value>>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<<prop>>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<<prop>>/g,(function(){return a}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<<prop>>[ \t]+)?)<<key>>(?=\s*:\s)/.source.replace(/<<prop>>/g,(function(){return a})).replace(/<<key>>/g,(function(){return"(?:"+r+"|"+o+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:s(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:s(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:s(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:s(o),lookbehind:!0,greedy:!0},number:{pattern:s(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(r),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(/<inner>/g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var a=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,r=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return a})),o=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+r+o+"(?:"+r+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+r+o+")(?:"+r+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(a),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+r+")"+o+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+r+"$"),inside:{"table-header":{pattern:RegExp(a),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)<inner>|_(?:(?!_)<inner>)+_)+__\b|\*\*(?:(?!\*)<inner>|\*(?:(?!\*)<inner>)+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)<inner>|__(?:(?!_)<inner>)+__)+_\b|\*(?:(?!\*)<inner>|\*\*(?:(?!\*)<inner>)+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~)<inner>)+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\])<inner>)+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\])<inner>)+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,a=t.length;n<a;n++){var r=t[n];if("code"===r.type){var o=r.content[1],s=r.content[3];if(o&&s&&"code-language"===o.type&&"code-block"===s.type&&"string"==typeof o.content){var i=o.content.replace(/\b#/g,"sharp").replace(/\b\+\+/g,"pp"),c="language-"+(i=(/[a-z][\w-]*/i.exec(i)||[""])[0].toLowerCase());s.alias?"string"==typeof s.alias?s.alias=[s.alias,c]:s.alias.push(c):s.alias=[c]}}else e(r.content)}}(e.tokens)})),e.hooks.add("wrap",(function(t){if("code-block"===t.type){for(var n="",a=0,r=t.classes.length;a<r;a++){var o=t.classes[a],d=/language-(.+)/.exec(o);if(d){n=d[1];break}}var l,u=e.languages[n];if(u)t.content=e.highlight((l=t.content,l.replace(s,"").replace(/&(\w{1,8}|#x?[\da-f]{1,8});/gi,(function(e,t){var n;if("#"===(t=t.toLowerCase())[0])return n="x"===t[1]?parseInt(t.slice(2),16):Number(t.slice(1)),c(n);var a=i[t];return a||e}))),u,n);else if(n&&"none"!==n&&e.plugins.autoloader){var p="md-"+(new Date).valueOf()+"-"+Math.floor(1e16*Math.random());t.attributes.id=p,e.plugins.autoloader.loadLanguages(n,(function(){var t=document.getElementById(p);t&&(t.innerHTML=e.highlight(t.textContent,e.languages[n],n))}))}}}));var s=RegExp(e.languages.markup.tag.pattern.source,"gi"),i={amp:"&",lt:"<",gt:">",quot:'"'},c=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(r),r.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:r.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},r.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n<t.length;){var a=t[n++];if("keyword"===a.type&&"mutation"===a.content){var r=[];if(u(["definition-mutation","punctuation"])&&"("===l(1).content){n+=2;var o=p(/^\($/,/^\)$/);if(-1===o)continue;for(;n<o;n++){var s=l(0);"variable"===s.type&&(f(s,"variable-input"),r.push(s.content))}n=o+1}if(u(["punctuation","property-query"])&&"{"===l(0).content&&(n++,f(l(0),"property-mutation"),r.length>0)){var i=p(/^\{$/,/^\}$/);if(-1===i)continue;for(var c=n;c<i;c++){var d=t[c];"variable"===d.type&&r.indexOf(d.content)>=0&&f(d,"variable-input")}}}}function l(e){return t[n+e]}function u(e,t){t=t||0;for(var n=0;n<e.length;n++){var a=l(n+t);if(!a||a.type!==e[n])return!1}return!0}function p(e,a){for(var r=1,o=n;o<t.length;o++){var s=t[o],i=s.content;if("punctuation"===s.type&&"string"==typeof i)if(e.test(i))r++;else if(a.test(i)&&0===--r)return o}return-1}function f(e,t){var n=e.alias;n?Array.isArray(n)||(e.alias=n=[n]):e.alias=n=[],n.push(t)}})),r.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,a=t.inside.interpolation,r=a.inside["interpolation-punctuation"],o=a.pattern.source;function s(t,a){if(e.languages[t])return{pattern:RegExp("((?:"+a+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function i(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function c(t,n,a){var r={code:t,grammar:n,language:a};return e.hooks.run("before-tokenize",r),r.tokens=e.tokenize(r.code,r.grammar),e.hooks.run("after-tokenize",r),r.tokens}function d(t){var n={};n["interpolation-punctuation"]=r;var o=e.tokenize(t,n);if(3===o.length){var s=[1,1];s.push.apply(s,c(o[1],e.languages.javascript,"javascript")),o.splice.apply(o,s)}return new e.Token("interpolation",o,a.alias,t)}function l(t,n,a){var r=e.tokenize(t,{interpolation:{pattern:RegExp(o),lookbehind:!0}}),s=0,l={},u=c(r.map((function(e){if("string"==typeof e)return e;for(var n,r=e.content;-1!==t.indexOf(n=i(s++,a)););return l[n]=r,n})).join(""),n,a),p=Object.keys(l);return s=0,function e(t){for(var n=0;n<t.length;n++){if(s>=p.length)return;var a=t[n];if("string"==typeof a||"string"==typeof a.content){var r=p[s],o="string"==typeof a?a:a.content,i=o.indexOf(r);if(-1!==i){++s;var c=o.substring(0,i),u=d(l[r]),f=o.substring(i+r.length),m=[];if(c&&m.push(c),m.push(u),f){var g=[f];e(g),m.push.apply(m,g)}"string"==typeof a?(t.splice.apply(t,[n,1].concat(m)),n+=m.length-1):a.content=m}}else{var h=a.content;Array.isArray(h)?e(h):e([h])}}}(u),new e.Token(a,u,"language-"+a,t)}e.languages.javascript["template-string"]=[s("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),s("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),s("svg",/\bsvg/.source),s("markdown",/\b(?:markdown|md)/.source),s("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),s("sql",/\bsql/.source),t].filter(Boolean);var u={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function p(e){return"string"==typeof e?e:Array.isArray(e)?e.map(p).join(""):p(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in u&&function t(n){for(var a=0,r=n.length;a<r;a++){var o=n[a];if("string"!=typeof o){var s=o.content;if(Array.isArray(s))if("template-string"===o.type){var i=s[1];if(3===s.length&&"string"!=typeof i&&"embedded-code"===i.type){var c=p(i),d=i.alias,u=Array.isArray(d)?d[0]:d,f=e.languages[u];if(!f)continue;s[1]=l(c,f,u)}}else t(s);else"string"!=typeof s&&t([s])}}}(t.tokens)}))}(r),function(e){e.languages.typescript=e.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(r),function(e){function t(e,t){return RegExp(e.replace(/<ID>/g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:<ID>(?:\s*,\s*(?:\*\s*as\s+<ID>|\{[^{}]*\}))?|\*\s*as\s+<ID>|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+<ID>)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?<ID>/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],a=0;a<n.length;a++){var r=n[a],o=e.languages.javascript[r];"RegExp"===e.util.type(o)&&(o=e.languages.javascript[r]={pattern:o});var s=o.inside||{};o.inside=s,s["maybe-class-name"]=/^[A-Z][\s\S]*/}}(r),function(e){var t=e.util.clone(e.languages.javascript),n=/(?:\s|\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))\*\/)/.source,a=/(?:\{(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])*\})/.source,r=/(?:\{<S>*\.{3}(?:[^{}]|<BRACES>)*\})/.source;function o(e,t){return e=e.replace(/<S>/g,(function(){return n})).replace(/<BRACES>/g,(function(){return a})).replace(/<SPREAD>/g,(function(){return r})),RegExp(e,t)}r=o(r).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=o(/<\/?(?:[\w.:-]+(?:<S>+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|<BRACES>))?|<SPREAD>))*<S>*\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:o(/<SPREAD>/.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:o(/=<BRACES>/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var s=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(s).join(""):""},i=function(t){for(var n=[],a=0;a<t.length;a++){var r=t[a],o=!1;if("string"!=typeof r&&("tag"===r.type&&r.content[0]&&"tag"===r.content[0].type?"</"===r.content[0].content[0].content?n.length>0&&n[n.length-1].tagName===s(r.content[0].content[1])&&n.pop():"/>"===r.content[r.content.length-1].content||n.push({tagName:s(r.content[0].content[1]),openedBraces:0}):n.length>0&&"punctuation"===r.type&&"{"===r.content?n[n.length-1].openedBraces++:n.length>0&&n[n.length-1].openedBraces>0&&"punctuation"===r.type&&"}"===r.content?n[n.length-1].openedBraces--:o=!0),(o||"string"==typeof r)&&n.length>0&&0===n[n.length-1].openedBraces){var c=s(r);a<t.length-1&&("string"==typeof t[a+1]||"plain-text"===t[a+1].type)&&(c+=s(t[a+1]),t.splice(a+1,1)),a>0&&("string"==typeof t[a-1]||"plain-text"===t[a-1].type)&&(c=s(t[a-1])+c,t.splice(a-1,1),a--),t[a]=new e.Token("plain-text",c,null,c)}r.content&&"string"!=typeof r.content&&i(r.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||i(e.tokens)}))}(r),function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var a=t[n],r=[];/^\w+$/.test(n)||r.push(/\w+/.exec(n)[0]),"diff"===n&&r.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+a+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:r,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(r),r.languages.git={comment:/^#.*/m,deleted:/^[-\u2013].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m},r.languages.go=r.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),r.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete r.languages.go["class-name"],function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,a,r,o){if(n.language===a){var s=n.tokenStack=[];n.code=n.code.replace(r,(function(e){if("function"==typeof o&&!o(e))return e;for(var r,i=s.length;-1!==n.code.indexOf(r=t(a,i));)++i;return s[i]=e,r})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,a){if(n.language===a&&n.tokenStack){n.grammar=e.languages[a];var r=0,o=Object.keys(n.tokenStack);!function s(i){for(var c=0;c<i.length&&!(r>=o.length);c++){var d=i[c];if("string"==typeof d||d.content&&"string"==typeof d.content){var l=o[r],u=n.tokenStack[l],p="string"==typeof d?d:d.content,f=t(a,l),m=p.indexOf(f);if(m>-1){++r;var g=p.substring(0,m),h=new e.Token(a,e.tokenize(u,n.grammar),"language-"+a,u),b=p.substring(m+f.length),v=[];g&&v.push.apply(v,s([g])),v.push(h),b&&v.push.apply(v,s([b])),"string"==typeof d?i.splice.apply(i,[c,1].concat(v)):d.content=v}}else d.content&&s(d.content)}return i}(n.tokens)}}}})}(r),function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"handlebars")})),e.languages.hbs=e.languages.handlebars}(r),r.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},r.languages.webmanifest=r.languages.json,r.languages.less=r.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),r.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}),r.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},r.languages.objectivec=r.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<<?=?|>>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete r.languages.objectivec["class-name"],r.languages.objc=r.languages.objectivec,r.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/},r.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},r.languages.python["string-interpolation"].inside.interpolation.inside.rest=r.languages.python,r.languages.py=r.languages.python,r.languages.reason=r.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),r.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete r.languages.reason.function,function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,n=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:t,operator:n}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:t,operator:n,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(r),r.languages.scss=r.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),r.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),r.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),r.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),r.languages.scss.atrule.inside.rest=r.languages.scss,function(e){var t={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},n={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},a={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:n,punctuation:/[{}()\[\];:,]/};a.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:a}},a.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:a}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:a}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:a}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:a}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:a.interpolation}},rest:a}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:a.interpolation,comment:a.comment,punctuation:/[{},]/}},func:a.func,string:a.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:a.interpolation,punctuation:/[{}()\[\];:.]/}}(r),function(e){var t=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"];var n=e.languages.tsx.tag;n.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+n.pattern.source+")",n.pattern.flags),n.lookbehind=!0}(r),r.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/};const o=r},86862:()=>{!function(e){var t=e.languages.powershell={comment:[{pattern:/(^|[^`])<#[\s\S]*?#>/,lookbehind:!0},{pattern:/(^|[^`])#.*/,lookbehind:!0}],string:[{pattern:/"(?:`[\s\S]|[^`"])*"/,greedy:!0,inside:null},{pattern:/'(?:[^']|'')*'/,greedy:!0}],namespace:/\[[a-z](?:\[(?:\[[^\]]*\]|[^\[\]])*\]|[^\[\]])*\]/i,boolean:/\$(?:false|true)\b/i,variable:/\$\w+\b/,function:[/\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\b/i,/\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\b/i],keyword:/\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\b/i,operator:{pattern:/(^|\W)(?:!|-(?:b?(?:and|x?or)|as|(?:Not)?(?:Contains|In|Like|Match)|eq|ge|gt|is(?:Not)?|Join|le|lt|ne|not|Replace|sh[lr])\b|-[-=]?|\+[+=]?|[*\/%]=?)/i,lookbehind:!0},punctuation:/[|{}[\];(),.]/};t.string[0].inside={function:{pattern:/(^|[^`])\$\((?:\$\([^\r\n()]*\)|(?!\$\()[^\r\n)])*\)/,lookbehind:!0,inside:t},boolean:t.boolean,variable:t.variable}}(Prism)},59385:()=>{!function(e){e.languages.ruby=e.languages.extend("clike",{comment:{pattern:/#.*|^=begin\s[\s\S]*?^=end/m,greedy:!0},"class-name":{pattern:/(\b(?:class|module)\s+|\bcatch\s+\()[\w.\\]+|\b[A-Z_]\w*(?=\s*\.\s*new\b)/,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/,operator:/\.{2,3}|&\.|===|<?=>|[!=]?~|(?:&&|\|\||<<|>>|\*\*|[+\-*/%<>!^&|=])=?|[?:]/,punctuation:/[(){}[\].,;]/}),e.languages.insertBefore("ruby","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}});var t={pattern:/((?:^|[^\\])(?:\\{2})*)#\{(?:[^{}]|\{[^{}]*\})*\}/,lookbehind:!0,inside:{content:{pattern:/^(#\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:e.languages.ruby},delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"}}};delete e.languages.ruby.function;var n="(?:"+[/([^a-zA-Z0-9\s{(\[<=])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/\((?:[^()\\]|\\[\s\S]|\((?:[^()\\]|\\[\s\S])*\))*\)/.source,/\{(?:[^{}\\]|\\[\s\S]|\{(?:[^{}\\]|\\[\s\S])*\})*\}/.source,/\[(?:[^\[\]\\]|\\[\s\S]|\[(?:[^\[\]\\]|\\[\s\S])*\])*\]/.source,/<(?:[^<>\\]|\\[\s\S]|<(?:[^<>\\]|\\[\s\S])*>)*>/.source].join("|")+")",a=/(?:"(?:\\.|[^"\\\r\n])*"|(?:\b[a-zA-Z_]\w*|[^\s\0-\x7F]+)[?!]?|\$.)/.source;e.languages.insertBefore("ruby","keyword",{"regex-literal":[{pattern:RegExp(/%r/.source+n+/[egimnosux]{0,6}/.source),greedy:!0,inside:{interpolation:t,regex:/[\s\S]+/}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:t,regex:/[\s\S]+/}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:[{pattern:RegExp(/(^|[^:]):/.source+a),lookbehind:!0,greedy:!0},{pattern:RegExp(/([\r\n{(,][ \t]*)/.source+a+/(?=:(?!:))/.source),lookbehind:!0,greedy:!0}],"method-definition":{pattern:/(\bdef\s+)\w+(?:\s*\.\s*\w+)?/,lookbehind:!0,inside:{function:/\b\w+$/,keyword:/^self\b/,"class-name":/^\w+/,punctuation:/\./}}}),e.languages.insertBefore("ruby","string",{"string-literal":[{pattern:RegExp(/%[qQiIwWs]?/.source+n),greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}},{pattern:/<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\w*|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?/}},interpolation:t,string:/[\s\S]+/}},{pattern:/<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\w*'|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?'|'$/}},string:/[\s\S]+/}}],"command-literal":[{pattern:RegExp(/%x/.source+n),greedy:!0,inside:{interpolation:t,command:{pattern:/[\s\S]+/,alias:"string"}}},{pattern:/`(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|[^\\`#\r\n])*`/,greedy:!0,inside:{interpolation:t,command:{pattern:/[\s\S]+/,alias:"string"}}}]}),delete e.languages.ruby.string,e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/,constant:/\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/}),e.languages.rb=e.languages.ruby}(Prism)},56646:(e,t,n)=>{var a={"./prism-powershell":86862,"./prism-ruby":59385};function r(e){var t=o(e);return n(t)}function o(e){if(!n.o(a,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return a[e]}r.keys=function(){return Object.keys(a)},r.resolve=o,e.exports=r,r.id=56646},92703:(e,t,n)=>{"use strict";var a=n(50414);function r(){}function o(){}o.resetWarningCache=r,e.exports=function(){function e(e,t,n,r,o,s){if(s!==a){var i=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw i.name="Invariant Violation",i}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:r};return n.PropTypes=n,n}},45697:(e,t,n)=>{e.exports=n(92703)()},50414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},64448:(e,t,n)=>{"use strict";var a=n(67294),r=n(27418),o=n(63840);function s(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}if(!a)throw Error(s(227));var i=new Set,c={};function d(e,t){l(e,t),l(e+"Capture",t)}function l(e,t){for(c[e]=t,e=0;e<t.length;e++)i.add(t[e])}var u=!("undefined"==typeof window||void 0===window.document||void 0===window.document.createElement),p=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,f=Object.prototype.hasOwnProperty,m={},g={};function h(e,t,n,a,r,o,s){this.acceptsBooleans=2===t||3===t||4===t,this.attributeName=a,this.attributeNamespace=r,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=o,this.removeEmptyString=s}var b={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach((function(e){b[e]=new h(e,0,!1,e,null,!1,!1)})),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach((function(e){var t=e[0];b[t]=new h(t,1,!1,e[1],null,!1,!1)})),["contentEditable","draggable","spellCheck","value"].forEach((function(e){b[e]=new h(e,2,!1,e.toLowerCase(),null,!1,!1)})),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach((function(e){b[e]=new h(e,2,!1,e,null,!1,!1)})),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach((function(e){b[e]=new h(e,3,!1,e.toLowerCase(),null,!1,!1)})),["checked","multiple","muted","selected"].forEach((function(e){b[e]=new h(e,3,!0,e,null,!1,!1)})),["capture","download"].forEach((function(e){b[e]=new h(e,4,!1,e,null,!1,!1)})),["cols","rows","size","span"].forEach((function(e){b[e]=new h(e,6,!1,e,null,!1,!1)})),["rowSpan","start"].forEach((function(e){b[e]=new h(e,5,!1,e.toLowerCase(),null,!1,!1)}));var v=/[\-:]([a-z])/g;function y(e){return e[1].toUpperCase()}function k(e,t,n,a){var r=b.hasOwnProperty(t)?b[t]:null;(null!==r?0===r.type:!a&&(2<t.length&&("o"===t[0]||"O"===t[0])&&("n"===t[1]||"N"===t[1])))||(function(e,t,n,a){if(null==t||function(e,t,n,a){if(null!==n&&0===n.type)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return!a&&(null!==n?!n.acceptsBooleans:"data-"!==(e=e.toLowerCase().slice(0,5))&&"aria-"!==e);default:return!1}}(e,t,n,a))return!0;if(a)return!1;if(null!==n)switch(n.type){case 3:return!t;case 4:return!1===t;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}(t,n,r,a)&&(n=null),a||null===r?function(e){return!!f.call(g,e)||!f.call(m,e)&&(p.test(e)?g[e]=!0:(m[e]=!0,!1))}(t)&&(null===n?e.removeAttribute(t):e.setAttribute(t,""+n)):r.mustUseProperty?e[r.propertyName]=null===n?3!==r.type&&"":n:(t=r.attributeName,a=r.attributeNamespace,null===n?e.removeAttribute(t):(n=3===(r=r.type)||4===r&&!0===n?"":""+n,a?e.setAttributeNS(a,t,n):e.setAttribute(t,n))))}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach((function(e){var t=e.replace(v,y);b[t]=new h(t,1,!1,e,null,!1,!1)})),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach((function(e){var t=e.replace(v,y);b[t]=new h(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)})),["xml:base","xml:lang","xml:space"].forEach((function(e){var t=e.replace(v,y);b[t]=new h(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)})),["tabIndex","crossOrigin"].forEach((function(e){b[e]=new h(e,1,!1,e.toLowerCase(),null,!1,!1)})),b.xlinkHref=new h("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach((function(e){b[e]=new h(e,1,!1,e.toLowerCase(),null,!0,!0)}));var w=a.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,x=60103,E=60106,_=60107,S=60108,C=60114,T=60109,L=60110,P=60112,R=60113,O=60120,N=60115,I=60116,A=60121,D=60128,M=60129,F=60130,B=60131;if("function"==typeof Symbol&&Symbol.for){var j=Symbol.for;x=j("react.element"),E=j("react.portal"),_=j("react.fragment"),S=j("react.strict_mode"),C=j("react.profiler"),T=j("react.provider"),L=j("react.context"),P=j("react.forward_ref"),R=j("react.suspense"),O=j("react.suspense_list"),N=j("react.memo"),I=j("react.lazy"),A=j("react.block"),j("react.scope"),D=j("react.opaque.id"),M=j("react.debug_trace_mode"),F=j("react.offscreen"),B=j("react.legacy_hidden")}var z,$="function"==typeof Symbol&&Symbol.iterator;function U(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=$&&e[$]||e["@@iterator"])?e:null}function H(e){if(void 0===z)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);z=t&&t[1]||""}return"\n"+z+e}var Z=!1;function Q(e,t){if(!e||Z)return"";Z=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),"object"==typeof Reflect&&Reflect.construct){try{Reflect.construct(t,[])}catch(c){var a=c}Reflect.construct(e,[],t)}else{try{t.call()}catch(c){a=c}e.call(t.prototype)}else{try{throw Error()}catch(c){a=c}e()}}catch(c){if(c&&a&&"string"==typeof c.stack){for(var r=c.stack.split("\n"),o=a.stack.split("\n"),s=r.length-1,i=o.length-1;1<=s&&0<=i&&r[s]!==o[i];)i--;for(;1<=s&&0<=i;s--,i--)if(r[s]!==o[i]){if(1!==s||1!==i)do{if(s--,0>--i||r[s]!==o[i])return"\n"+r[s].replace(" at new "," at ")}while(1<=s&&0<=i);break}}}finally{Z=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?H(e):""}function V(e){switch(e.tag){case 5:return H(e.type);case 16:return H("Lazy");case 13:return H("Suspense");case 19:return H("SuspenseList");case 0:case 2:case 15:return e=Q(e.type,!1);case 11:return e=Q(e.type.render,!1);case 22:return e=Q(e.type._render,!1);case 1:return e=Q(e.type,!0);default:return""}}function q(e){if(null==e)return null;if("function"==typeof e)return e.displayName||e.name||null;if("string"==typeof e)return e;switch(e){case _:return"Fragment";case E:return"Portal";case C:return"Profiler";case S:return"StrictMode";case R:return"Suspense";case O:return"SuspenseList"}if("object"==typeof e)switch(e.$$typeof){case L:return(e.displayName||"Context")+".Consumer";case T:return(e._context.displayName||"Context")+".Provider";case P:var t=e.render;return t=t.displayName||t.name||"",e.displayName||(""!==t?"ForwardRef("+t+")":"ForwardRef");case N:return q(e.type);case A:return q(e._render);case I:t=e._payload,e=e._init;try{return q(e(t))}catch(n){}}return null}function G(e){switch(typeof e){case"boolean":case"number":case"object":case"string":case"undefined":return e;default:return""}}function W(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function X(e){e._valueTracker||(e._valueTracker=function(e){var t=W(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),a=""+e[t];if(!e.hasOwnProperty(t)&&void 0!==n&&"function"==typeof n.get&&"function"==typeof n.set){var r=n.get,o=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return r.call(this)},set:function(e){a=""+e,o.call(this,e)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return a},setValue:function(e){a=""+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}(e))}function Y(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),a="";return e&&(a=W(e)?e.checked?"true":"false":e.value),(e=a)!==n&&(t.setValue(e),!0)}function K(e){if(void 0===(e=e||("undefined"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}function J(e,t){var n=t.checked;return r({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=n?n:e._wrapperState.initialChecked})}function ee(e,t){var n=null==t.defaultValue?"":t.defaultValue,a=null!=t.checked?t.checked:t.defaultChecked;n=G(null!=t.value?t.value:n),e._wrapperState={initialChecked:a,initialValue:n,controlled:"checkbox"===t.type||"radio"===t.type?null!=t.checked:null!=t.value}}function te(e,t){null!=(t=t.checked)&&k(e,"checked",t,!1)}function ne(e,t){te(e,t);var n=G(t.value),a=t.type;if(null!=n)"number"===a?(0===n&&""===e.value||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if("submit"===a||"reset"===a)return void e.removeAttribute("value");t.hasOwnProperty("value")?re(e,t.type,n):t.hasOwnProperty("defaultValue")&&re(e,t.type,G(t.defaultValue)),null==t.checked&&null!=t.defaultChecked&&(e.defaultChecked=!!t.defaultChecked)}function ae(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var a=t.type;if(!("submit"!==a&&"reset"!==a||void 0!==t.value&&null!==t.value))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}""!==(n=e.name)&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,""!==n&&(e.name=n)}function re(e,t,n){"number"===t&&K(e.ownerDocument)===e||(null==n?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}function oe(e,t){return e=r({children:void 0},t),(t=function(e){var t="";return a.Children.forEach(e,(function(e){null!=e&&(t+=e)})),t}(t.children))&&(e.children=t),e}function se(e,t,n,a){if(e=e.options,t){t={};for(var r=0;r<n.length;r++)t["$"+n[r]]=!0;for(n=0;n<e.length;n++)r=t.hasOwnProperty("$"+e[n].value),e[n].selected!==r&&(e[n].selected=r),r&&a&&(e[n].defaultSelected=!0)}else{for(n=""+G(n),t=null,r=0;r<e.length;r++){if(e[r].value===n)return e[r].selected=!0,void(a&&(e[r].defaultSelected=!0));null!==t||e[r].disabled||(t=e[r])}null!==t&&(t.selected=!0)}}function ie(e,t){if(null!=t.dangerouslySetInnerHTML)throw Error(s(91));return r({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function ce(e,t){var n=t.value;if(null==n){if(n=t.children,t=t.defaultValue,null!=n){if(null!=t)throw Error(s(92));if(Array.isArray(n)){if(!(1>=n.length))throw Error(s(93));n=n[0]}t=n}null==t&&(t=""),n=t}e._wrapperState={initialValue:G(n)}}function de(e,t){var n=G(t.value),a=G(t.defaultValue);null!=n&&((n=""+n)!==e.value&&(e.value=n),null==t.defaultValue&&e.defaultValue!==n&&(e.defaultValue=n)),null!=a&&(e.defaultValue=""+a)}function le(e){var t=e.textContent;t===e._wrapperState.initialValue&&""!==t&&null!==t&&(e.value=t)}var ue={html:"http://www.w3.org/1999/xhtml",mathml:"http://www.w3.org/1998/Math/MathML",svg:"http://www.w3.org/2000/svg"};function pe(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function fe(e,t){return null==e||"http://www.w3.org/1999/xhtml"===e?pe(t):"http://www.w3.org/2000/svg"===e&&"foreignObject"===t?"http://www.w3.org/1999/xhtml":e}var me,ge,he=(ge=function(e,t){if(e.namespaceURI!==ue.svg||"innerHTML"in e)e.innerHTML=t;else{for((me=me||document.createElement("div")).innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=me.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}},"undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(e,t,n,a){MSApp.execUnsafeLocalFunction((function(){return ge(e,t)}))}:ge);function be(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t}var ve={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},ye=["Webkit","ms","Moz","O"];function ke(e,t,n){return null==t||"boolean"==typeof t||""===t?"":n||"number"!=typeof t||0===t||ve.hasOwnProperty(e)&&ve[e]?(""+t).trim():t+"px"}function we(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var a=0===n.indexOf("--"),r=ke(n,t[n],a);"float"===n&&(n="cssFloat"),a?e.setProperty(n,r):e[n]=r}}Object.keys(ve).forEach((function(e){ye.forEach((function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),ve[t]=ve[e]}))}));var xe=r({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function Ee(e,t){if(t){if(xe[e]&&(null!=t.children||null!=t.dangerouslySetInnerHTML))throw Error(s(137,e));if(null!=t.dangerouslySetInnerHTML){if(null!=t.children)throw Error(s(60));if("object"!=typeof t.dangerouslySetInnerHTML||!("__html"in t.dangerouslySetInnerHTML))throw Error(s(61))}if(null!=t.style&&"object"!=typeof t.style)throw Error(s(62))}}function _e(e,t){if(-1===e.indexOf("-"))return"string"==typeof t.is;switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}function Se(e){return(e=e.target||e.srcElement||window).correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}var Ce=null,Te=null,Le=null;function Pe(e){if(e=nr(e)){if("function"!=typeof Ce)throw Error(s(280));var t=e.stateNode;t&&(t=rr(t),Ce(e.stateNode,e.type,t))}}function Re(e){Te?Le?Le.push(e):Le=[e]:Te=e}function Oe(){if(Te){var e=Te,t=Le;if(Le=Te=null,Pe(e),t)for(e=0;e<t.length;e++)Pe(t[e])}}function Ne(e,t){return e(t)}function Ie(e,t,n,a,r){return e(t,n,a,r)}function Ae(){}var De=Ne,Me=!1,Fe=!1;function Be(){null===Te&&null===Le||(Ae(),Oe())}function je(e,t){var n=e.stateNode;if(null===n)return null;var a=rr(n);if(null===a)return null;n=a[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(a=!a.disabled)||(a=!("button"===(e=e.type)||"input"===e||"select"===e||"textarea"===e)),e=!a;break e;default:e=!1}if(e)return null;if(n&&"function"!=typeof n)throw Error(s(231,t,typeof n));return n}var ze=!1;if(u)try{var $e={};Object.defineProperty($e,"passive",{get:function(){ze=!0}}),window.addEventListener("test",$e,$e),window.removeEventListener("test",$e,$e)}catch(ge){ze=!1}function Ue(e,t,n,a,r,o,s,i,c){var d=Array.prototype.slice.call(arguments,3);try{t.apply(n,d)}catch(l){this.onError(l)}}var He=!1,Ze=null,Qe=!1,Ve=null,qe={onError:function(e){He=!0,Ze=e}};function Ge(e,t,n,a,r,o,s,i,c){He=!1,Ze=null,Ue.apply(qe,arguments)}function We(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do{0!=(1026&(t=e).flags)&&(n=t.return),e=t.return}while(e)}return 3===t.tag?n:null}function Xe(e){if(13===e.tag){var t=e.memoizedState;if(null===t&&(null!==(e=e.alternate)&&(t=e.memoizedState)),null!==t)return t.dehydrated}return null}function Ye(e){if(We(e)!==e)throw Error(s(188))}function Ke(e){if(e=function(e){var t=e.alternate;if(!t){if(null===(t=We(e)))throw Error(s(188));return t!==e?null:e}for(var n=e,a=t;;){var r=n.return;if(null===r)break;var o=r.alternate;if(null===o){if(null!==(a=r.return)){n=a;continue}break}if(r.child===o.child){for(o=r.child;o;){if(o===n)return Ye(r),e;if(o===a)return Ye(r),t;o=o.sibling}throw Error(s(188))}if(n.return!==a.return)n=r,a=o;else{for(var i=!1,c=r.child;c;){if(c===n){i=!0,n=r,a=o;break}if(c===a){i=!0,a=r,n=o;break}c=c.sibling}if(!i){for(c=o.child;c;){if(c===n){i=!0,n=o,a=r;break}if(c===a){i=!0,a=o,n=r;break}c=c.sibling}if(!i)throw Error(s(189))}}if(n.alternate!==a)throw Error(s(190))}if(3!==n.tag)throw Error(s(188));return n.stateNode.current===n?e:t}(e),!e)return null;for(var t=e;;){if(5===t.tag||6===t.tag)return t;if(t.child)t.child.return=t,t=t.child;else{if(t===e)break;for(;!t.sibling;){if(!t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}}return null}function Je(e,t){for(var n=e.alternate;null!==t;){if(t===e||t===n)return!0;t=t.return}return!1}var et,tt,nt,at,rt=!1,ot=[],st=null,it=null,ct=null,dt=new Map,lt=new Map,ut=[],pt="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");function ft(e,t,n,a,r){return{blockedOn:e,domEventName:t,eventSystemFlags:16|n,nativeEvent:r,targetContainers:[a]}}function mt(e,t){switch(e){case"focusin":case"focusout":st=null;break;case"dragenter":case"dragleave":it=null;break;case"mouseover":case"mouseout":ct=null;break;case"pointerover":case"pointerout":dt.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":lt.delete(t.pointerId)}}function gt(e,t,n,a,r,o){return null===e||e.nativeEvent!==o?(e=ft(t,n,a,r,o),null!==t&&(null!==(t=nr(t))&&tt(t)),e):(e.eventSystemFlags|=a,t=e.targetContainers,null!==r&&-1===t.indexOf(r)&&t.push(r),e)}function ht(e){var t=tr(e.target);if(null!==t){var n=We(t);if(null!==n)if(13===(t=n.tag)){if(null!==(t=Xe(n)))return e.blockedOn=t,void at(e.lanePriority,(function(){o.unstable_runWithPriority(e.priority,(function(){nt(n)}))}))}else if(3===t&&n.stateNode.hydrate)return void(e.blockedOn=3===n.tag?n.stateNode.containerInfo:null)}e.blockedOn=null}function bt(e){if(null!==e.blockedOn)return!1;for(var t=e.targetContainers;0<t.length;){var n=Kt(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(null!==n)return null!==(t=nr(n))&&tt(t),e.blockedOn=n,!1;t.shift()}return!0}function vt(e,t,n){bt(e)&&n.delete(t)}function yt(){for(rt=!1;0<ot.length;){var e=ot[0];if(null!==e.blockedOn){null!==(e=nr(e.blockedOn))&&et(e);break}for(var t=e.targetContainers;0<t.length;){var n=Kt(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(null!==n){e.blockedOn=n;break}t.shift()}null===e.blockedOn&&ot.shift()}null!==st&&bt(st)&&(st=null),null!==it&&bt(it)&&(it=null),null!==ct&&bt(ct)&&(ct=null),dt.forEach(vt),lt.forEach(vt)}function kt(e,t){e.blockedOn===t&&(e.blockedOn=null,rt||(rt=!0,o.unstable_scheduleCallback(o.unstable_NormalPriority,yt)))}function wt(e){function t(t){return kt(t,e)}if(0<ot.length){kt(ot[0],e);for(var n=1;n<ot.length;n++){var a=ot[n];a.blockedOn===e&&(a.blockedOn=null)}}for(null!==st&&kt(st,e),null!==it&&kt(it,e),null!==ct&&kt(ct,e),dt.forEach(t),lt.forEach(t),n=0;n<ut.length;n++)(a=ut[n]).blockedOn===e&&(a.blockedOn=null);for(;0<ut.length&&null===(n=ut[0]).blockedOn;)ht(n),null===n.blockedOn&&ut.shift()}function xt(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var Et={animationend:xt("Animation","AnimationEnd"),animationiteration:xt("Animation","AnimationIteration"),animationstart:xt("Animation","AnimationStart"),transitionend:xt("Transition","TransitionEnd")},_t={},St={};function Ct(e){if(_t[e])return _t[e];if(!Et[e])return e;var t,n=Et[e];for(t in n)if(n.hasOwnProperty(t)&&t in St)return _t[e]=n[t];return e}u&&(St=document.createElement("div").style,"AnimationEvent"in window||(delete Et.animationend.animation,delete Et.animationiteration.animation,delete Et.animationstart.animation),"TransitionEvent"in window||delete Et.transitionend.transition);var Tt=Ct("animationend"),Lt=Ct("animationiteration"),Pt=Ct("animationstart"),Rt=Ct("transitionend"),Ot=new Map,Nt=new Map,It=["abort","abort",Tt,"animationEnd",Lt,"animationIteration",Pt,"animationStart","canplay","canPlay","canplaythrough","canPlayThrough","durationchange","durationChange","emptied","emptied","encrypted","encrypted","ended","ended","error","error","gotpointercapture","gotPointerCapture","load","load","loadeddata","loadedData","loadedmetadata","loadedMetadata","loadstart","loadStart","lostpointercapture","lostPointerCapture","playing","playing","progress","progress","seeking","seeking","stalled","stalled","suspend","suspend","timeupdate","timeUpdate",Rt,"transitionEnd","waiting","waiting"];function At(e,t){for(var n=0;n<e.length;n+=2){var a=e[n],r=e[n+1];r="on"+(r[0].toUpperCase()+r.slice(1)),Nt.set(a,t),Ot.set(a,r),d(r,[a])}}(0,o.unstable_now)();var Dt=8;function Mt(e){if(0!=(1&e))return Dt=15,1;if(0!=(2&e))return Dt=14,2;if(0!=(4&e))return Dt=13,4;var t=24&e;return 0!==t?(Dt=12,t):0!=(32&e)?(Dt=11,32):0!==(t=192&e)?(Dt=10,t):0!=(256&e)?(Dt=9,256):0!==(t=3584&e)?(Dt=8,t):0!=(4096&e)?(Dt=7,4096):0!==(t=4186112&e)?(Dt=6,t):0!==(t=62914560&e)?(Dt=5,t):67108864&e?(Dt=4,67108864):0!=(134217728&e)?(Dt=3,134217728):0!==(t=805306368&e)?(Dt=2,t):0!=(1073741824&e)?(Dt=1,1073741824):(Dt=8,e)}function Ft(e,t){var n=e.pendingLanes;if(0===n)return Dt=0;var a=0,r=0,o=e.expiredLanes,s=e.suspendedLanes,i=e.pingedLanes;if(0!==o)a=o,r=Dt=15;else if(0!==(o=134217727&n)){var c=o&~s;0!==c?(a=Mt(c),r=Dt):0!==(i&=o)&&(a=Mt(i),r=Dt)}else 0!==(o=n&~s)?(a=Mt(o),r=Dt):0!==i&&(a=Mt(i),r=Dt);if(0===a)return 0;if(a=n&((0>(a=31-Ht(a))?0:1<<a)<<1)-1,0!==t&&t!==a&&0==(t&s)){if(Mt(t),r<=Dt)return t;Dt=r}if(0!==(t=e.entangledLanes))for(e=e.entanglements,t&=a;0<t;)r=1<<(n=31-Ht(t)),a|=e[n],t&=~r;return a}function Bt(e){return 0!==(e=-1073741825&e.pendingLanes)?e:1073741824&e?1073741824:0}function jt(e,t){switch(e){case 15:return 1;case 14:return 2;case 12:return 0===(e=zt(24&~t))?jt(10,t):e;case 10:return 0===(e=zt(192&~t))?jt(8,t):e;case 8:return 0===(e=zt(3584&~t))&&(0===(e=zt(4186112&~t))&&(e=512)),e;case 2:return 0===(t=zt(805306368&~t))&&(t=268435456),t}throw Error(s(358,e))}function zt(e){return e&-e}function $t(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function Ut(e,t,n){e.pendingLanes|=t;var a=t-1;e.suspendedLanes&=a,e.pingedLanes&=a,(e=e.eventTimes)[t=31-Ht(t)]=n}var Ht=Math.clz32?Math.clz32:function(e){return 0===e?32:31-(Zt(e)/Qt|0)|0},Zt=Math.log,Qt=Math.LN2;var Vt=o.unstable_UserBlockingPriority,qt=o.unstable_runWithPriority,Gt=!0;function Wt(e,t,n,a){Me||Ae();var r=Yt,o=Me;Me=!0;try{Ie(r,e,t,n,a)}finally{(Me=o)||Be()}}function Xt(e,t,n,a){qt(Vt,Yt.bind(null,e,t,n,a))}function Yt(e,t,n,a){var r;if(Gt)if((r=0==(4&t))&&0<ot.length&&-1<pt.indexOf(e))e=ft(null,e,t,n,a),ot.push(e);else{var o=Kt(e,t,n,a);if(null===o)r&&mt(e,a);else{if(r){if(-1<pt.indexOf(e))return e=ft(o,e,t,n,a),void ot.push(e);if(function(e,t,n,a,r){switch(t){case"focusin":return st=gt(st,e,t,n,a,r),!0;case"dragenter":return it=gt(it,e,t,n,a,r),!0;case"mouseover":return ct=gt(ct,e,t,n,a,r),!0;case"pointerover":var o=r.pointerId;return dt.set(o,gt(dt.get(o)||null,e,t,n,a,r)),!0;case"gotpointercapture":return o=r.pointerId,lt.set(o,gt(lt.get(o)||null,e,t,n,a,r)),!0}return!1}(o,e,t,n,a))return;mt(e,a)}Aa(e,t,a,null,n)}}}function Kt(e,t,n,a){var r=Se(a);if(null!==(r=tr(r))){var o=We(r);if(null===o)r=null;else{var s=o.tag;if(13===s){if(null!==(r=Xe(o)))return r;r=null}else if(3===s){if(o.stateNode.hydrate)return 3===o.tag?o.stateNode.containerInfo:null;r=null}else o!==r&&(r=null)}}return Aa(e,t,a,r,n),null}var Jt=null,en=null,tn=null;function nn(){if(tn)return tn;var e,t,n=en,a=n.length,r="value"in Jt?Jt.value:Jt.textContent,o=r.length;for(e=0;e<a&&n[e]===r[e];e++);var s=a-e;for(t=1;t<=s&&n[a-t]===r[o-t];t++);return tn=r.slice(e,1<t?1-t:void 0)}function an(e){var t=e.keyCode;return"charCode"in e?0===(e=e.charCode)&&13===t&&(e=13):e=t,10===e&&(e=13),32<=e||13===e?e:0}function rn(){return!0}function on(){return!1}function sn(e){function t(t,n,a,r,o){for(var s in this._reactName=t,this._targetInst=a,this.type=n,this.nativeEvent=r,this.target=o,this.currentTarget=null,e)e.hasOwnProperty(s)&&(t=e[s],this[s]=t?t(r):r[s]);return this.isDefaultPrevented=(null!=r.defaultPrevented?r.defaultPrevented:!1===r.returnValue)?rn:on,this.isPropagationStopped=on,this}return r(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=rn)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=rn)},persist:function(){},isPersistent:rn}),t}var cn,dn,ln,un={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},pn=sn(un),fn=r({},un,{view:0,detail:0}),mn=sn(fn),gn=r({},fn,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:Tn,button:0,buttons:0,relatedTarget:function(e){return void 0===e.relatedTarget?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==ln&&(ln&&"mousemove"===e.type?(cn=e.screenX-ln.screenX,dn=e.screenY-ln.screenY):dn=cn=0,ln=e),cn)},movementY:function(e){return"movementY"in e?e.movementY:dn}}),hn=sn(gn),bn=sn(r({},gn,{dataTransfer:0})),vn=sn(r({},fn,{relatedTarget:0})),yn=sn(r({},un,{animationName:0,elapsedTime:0,pseudoElement:0})),kn=r({},un,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),wn=sn(kn),xn=sn(r({},un,{data:0})),En={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},_n={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},Sn={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function Cn(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=Sn[e])&&!!t[e]}function Tn(){return Cn}var Ln=r({},fn,{key:function(e){if(e.key){var t=En[e.key]||e.key;if("Unidentified"!==t)return t}return"keypress"===e.type?13===(e=an(e))?"Enter":String.fromCharCode(e):"keydown"===e.type||"keyup"===e.type?_n[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:Tn,charCode:function(e){return"keypress"===e.type?an(e):0},keyCode:function(e){return"keydown"===e.type||"keyup"===e.type?e.keyCode:0},which:function(e){return"keypress"===e.type?an(e):"keydown"===e.type||"keyup"===e.type?e.keyCode:0}}),Pn=sn(Ln),Rn=sn(r({},gn,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0})),On=sn(r({},fn,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:Tn})),Nn=sn(r({},un,{propertyName:0,elapsedTime:0,pseudoElement:0})),In=r({},gn,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),An=sn(In),Dn=[9,13,27,32],Mn=u&&"CompositionEvent"in window,Fn=null;u&&"documentMode"in document&&(Fn=document.documentMode);var Bn=u&&"TextEvent"in window&&!Fn,jn=u&&(!Mn||Fn&&8<Fn&&11>=Fn),zn=String.fromCharCode(32),$n=!1;function Un(e,t){switch(e){case"keyup":return-1!==Dn.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Hn(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var Zn=!1;var Qn={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Vn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!Qn[e.type]:"textarea"===t}function qn(e,t,n,a){Re(a),0<(t=Ma(t,"onChange")).length&&(n=new pn("onChange","change",null,n,a),e.push({event:n,listeners:t}))}var Gn=null,Wn=null;function Xn(e){La(e,0)}function Yn(e){if(Y(ar(e)))return e}function Kn(e,t){if("change"===e)return t}var Jn=!1;if(u){var ea;if(u){var ta="oninput"in document;if(!ta){var na=document.createElement("div");na.setAttribute("oninput","return;"),ta="function"==typeof na.oninput}ea=ta}else ea=!1;Jn=ea&&(!document.documentMode||9<document.documentMode)}function aa(){Gn&&(Gn.detachEvent("onpropertychange",ra),Wn=Gn=null)}function ra(e){if("value"===e.propertyName&&Yn(Wn)){var t=[];if(qn(t,Wn,e,Se(e)),e=Xn,Me)e(t);else{Me=!0;try{Ne(e,t)}finally{Me=!1,Be()}}}}function oa(e,t,n){"focusin"===e?(aa(),Wn=n,(Gn=t).attachEvent("onpropertychange",ra)):"focusout"===e&&aa()}function sa(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)return Yn(Wn)}function ia(e,t){if("click"===e)return Yn(t)}function ca(e,t){if("input"===e||"change"===e)return Yn(t)}var da="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},la=Object.prototype.hasOwnProperty;function ua(e,t){if(da(e,t))return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var n=Object.keys(e),a=Object.keys(t);if(n.length!==a.length)return!1;for(a=0;a<n.length;a++)if(!la.call(t,n[a])||!da(e[n[a]],t[n[a]]))return!1;return!0}function pa(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function fa(e,t){var n,a=pa(e);for(e=0;a;){if(3===a.nodeType){if(n=e+a.textContent.length,e<=t&&n>=t)return{node:a,offset:t-e};e=n}e:{for(;a;){if(a.nextSibling){a=a.nextSibling;break e}a=a.parentNode}a=void 0}a=pa(a)}}function ma(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?ma(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function ga(){for(var e=window,t=K();t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(a){n=!1}if(!n)break;t=K((e=t.contentWindow).document)}return t}function ha(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===t||"true"===e.contentEditable)}var ba=u&&"documentMode"in document&&11>=document.documentMode,va=null,ya=null,ka=null,wa=!1;function xa(e,t,n){var a=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;wa||null==va||va!==K(a)||("selectionStart"in(a=va)&&ha(a)?a={start:a.selectionStart,end:a.selectionEnd}:a={anchorNode:(a=(a.ownerDocument&&a.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:a.anchorOffset,focusNode:a.focusNode,focusOffset:a.focusOffset},ka&&ua(ka,a)||(ka=a,0<(a=Ma(ya,"onSelect")).length&&(t=new pn("onSelect","select",null,t,n),e.push({event:t,listeners:a}),t.target=va)))}At("cancel cancel click click close close contextmenu contextMenu copy copy cut cut auxclick auxClick dblclick doubleClick dragend dragEnd dragstart dragStart drop drop focusin focus focusout blur input input invalid invalid keydown keyDown keypress keyPress keyup keyUp mousedown mouseDown mouseup mouseUp paste paste pause pause play play pointercancel pointerCancel pointerdown pointerDown pointerup pointerUp ratechange rateChange reset reset seeked seeked submit submit touchcancel touchCancel touchend touchEnd touchstart touchStart volumechange volumeChange".split(" "),0),At("drag drag dragenter dragEnter dragexit dragExit dragleave dragLeave dragover dragOver mousemove mouseMove mouseout mouseOut mouseover mouseOver pointermove pointerMove pointerout pointerOut pointerover pointerOver scroll scroll toggle toggle touchmove touchMove wheel wheel".split(" "),1),At(It,2);for(var Ea="change selectionchange textInput compositionstart compositionend compositionupdate".split(" "),_a=0;_a<Ea.length;_a++)Nt.set(Ea[_a],0);l("onMouseEnter",["mouseout","mouseover"]),l("onMouseLeave",["mouseout","mouseover"]),l("onPointerEnter",["pointerout","pointerover"]),l("onPointerLeave",["pointerout","pointerover"]),d("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),d("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),d("onBeforeInput",["compositionend","keypress","textInput","paste"]),d("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),d("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),d("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var Sa="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Ca=new Set("cancel close invalid load scroll toggle".split(" ").concat(Sa));function Ta(e,t,n){var a=e.type||"unknown-event";e.currentTarget=n,function(e,t,n,a,r,o,i,c,d){if(Ge.apply(this,arguments),He){if(!He)throw Error(s(198));var l=Ze;He=!1,Ze=null,Qe||(Qe=!0,Ve=l)}}(a,t,void 0,e),e.currentTarget=null}function La(e,t){t=0!=(4&t);for(var n=0;n<e.length;n++){var a=e[n],r=a.event;a=a.listeners;e:{var o=void 0;if(t)for(var s=a.length-1;0<=s;s--){var i=a[s],c=i.instance,d=i.currentTarget;if(i=i.listener,c!==o&&r.isPropagationStopped())break e;Ta(r,i,d),o=c}else for(s=0;s<a.length;s++){if(c=(i=a[s]).instance,d=i.currentTarget,i=i.listener,c!==o&&r.isPropagationStopped())break e;Ta(r,i,d),o=c}}}if(Qe)throw e=Ve,Qe=!1,Ve=null,e}function Pa(e,t){var n=or(t),a=e+"__bubble";n.has(a)||(Ia(t,e,2,!1),n.add(a))}var Ra="_reactListening"+Math.random().toString(36).slice(2);function Oa(e){e[Ra]||(e[Ra]=!0,i.forEach((function(t){Ca.has(t)||Na(t,!1,e,null),Na(t,!0,e,null)})))}function Na(e,t,n,a){var r=4<arguments.length&&void 0!==arguments[4]?arguments[4]:0,o=n;if("selectionchange"===e&&9!==n.nodeType&&(o=n.ownerDocument),null!==a&&!t&&Ca.has(e)){if("scroll"!==e)return;r|=2,o=a}var s=or(o),i=e+"__"+(t?"capture":"bubble");s.has(i)||(t&&(r|=4),Ia(o,e,r,t),s.add(i))}function Ia(e,t,n,a){var r=Nt.get(t);switch(void 0===r?2:r){case 0:r=Wt;break;case 1:r=Xt;break;default:r=Yt}n=r.bind(null,t,n,e),r=void 0,!ze||"touchstart"!==t&&"touchmove"!==t&&"wheel"!==t||(r=!0),a?void 0!==r?e.addEventListener(t,n,{capture:!0,passive:r}):e.addEventListener(t,n,!0):void 0!==r?e.addEventListener(t,n,{passive:r}):e.addEventListener(t,n,!1)}function Aa(e,t,n,a,r){var o=a;if(0==(1&t)&&0==(2&t)&&null!==a)e:for(;;){if(null===a)return;var s=a.tag;if(3===s||4===s){var i=a.stateNode.containerInfo;if(i===r||8===i.nodeType&&i.parentNode===r)break;if(4===s)for(s=a.return;null!==s;){var c=s.tag;if((3===c||4===c)&&((c=s.stateNode.containerInfo)===r||8===c.nodeType&&c.parentNode===r))return;s=s.return}for(;null!==i;){if(null===(s=tr(i)))return;if(5===(c=s.tag)||6===c){a=o=s;continue e}i=i.parentNode}}a=a.return}!function(e,t,n){if(Fe)return e(t,n);Fe=!0;try{return De(e,t,n)}finally{Fe=!1,Be()}}((function(){var a=o,r=Se(n),s=[];e:{var i=Ot.get(e);if(void 0!==i){var c=pn,d=e;switch(e){case"keypress":if(0===an(n))break e;case"keydown":case"keyup":c=Pn;break;case"focusin":d="focus",c=vn;break;case"focusout":d="blur",c=vn;break;case"beforeblur":case"afterblur":c=vn;break;case"click":if(2===n.button)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":c=hn;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":c=bn;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":c=On;break;case Tt:case Lt:case Pt:c=yn;break;case Rt:c=Nn;break;case"scroll":c=mn;break;case"wheel":c=An;break;case"copy":case"cut":case"paste":c=wn;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":c=Rn}var l=0!=(4&t),u=!l&&"scroll"===e,p=l?null!==i?i+"Capture":null:i;l=[];for(var f,m=a;null!==m;){var g=(f=m).stateNode;if(5===f.tag&&null!==g&&(f=g,null!==p&&(null!=(g=je(m,p))&&l.push(Da(m,g,f)))),u)break;m=m.return}0<l.length&&(i=new c(i,d,null,n,r),s.push({event:i,listeners:l}))}}if(0==(7&t)){if(c="mouseout"===e||"pointerout"===e,(!(i="mouseover"===e||"pointerover"===e)||0!=(16&t)||!(d=n.relatedTarget||n.fromElement)||!tr(d)&&!d[Ja])&&(c||i)&&(i=r.window===r?r:(i=r.ownerDocument)?i.defaultView||i.parentWindow:window,c?(c=a,null!==(d=(d=n.relatedTarget||n.toElement)?tr(d):null)&&(d!==(u=We(d))||5!==d.tag&&6!==d.tag)&&(d=null)):(c=null,d=a),c!==d)){if(l=hn,g="onMouseLeave",p="onMouseEnter",m="mouse","pointerout"!==e&&"pointerover"!==e||(l=Rn,g="onPointerLeave",p="onPointerEnter",m="pointer"),u=null==c?i:ar(c),f=null==d?i:ar(d),(i=new l(g,m+"leave",c,n,r)).target=u,i.relatedTarget=f,g=null,tr(r)===a&&((l=new l(p,m+"enter",d,n,r)).target=f,l.relatedTarget=u,g=l),u=g,c&&d)e:{for(p=d,m=0,f=l=c;f;f=Fa(f))m++;for(f=0,g=p;g;g=Fa(g))f++;for(;0<m-f;)l=Fa(l),m--;for(;0<f-m;)p=Fa(p),f--;for(;m--;){if(l===p||null!==p&&l===p.alternate)break e;l=Fa(l),p=Fa(p)}l=null}else l=null;null!==c&&Ba(s,i,c,l,!1),null!==d&&null!==u&&Ba(s,u,d,l,!0)}if("select"===(c=(i=a?ar(a):window).nodeName&&i.nodeName.toLowerCase())||"input"===c&&"file"===i.type)var h=Kn;else if(Vn(i))if(Jn)h=ca;else{h=sa;var b=oa}else(c=i.nodeName)&&"input"===c.toLowerCase()&&("checkbox"===i.type||"radio"===i.type)&&(h=ia);switch(h&&(h=h(e,a))?qn(s,h,n,r):(b&&b(e,i,a),"focusout"===e&&(b=i._wrapperState)&&b.controlled&&"number"===i.type&&re(i,"number",i.value)),b=a?ar(a):window,e){case"focusin":(Vn(b)||"true"===b.contentEditable)&&(va=b,ya=a,ka=null);break;case"focusout":ka=ya=va=null;break;case"mousedown":wa=!0;break;case"contextmenu":case"mouseup":case"dragend":wa=!1,xa(s,n,r);break;case"selectionchange":if(ba)break;case"keydown":case"keyup":xa(s,n,r)}var v;if(Mn)e:{switch(e){case"compositionstart":var y="onCompositionStart";break e;case"compositionend":y="onCompositionEnd";break e;case"compositionupdate":y="onCompositionUpdate";break e}y=void 0}else Zn?Un(e,n)&&(y="onCompositionEnd"):"keydown"===e&&229===n.keyCode&&(y="onCompositionStart");y&&(jn&&"ko"!==n.locale&&(Zn||"onCompositionStart"!==y?"onCompositionEnd"===y&&Zn&&(v=nn()):(en="value"in(Jt=r)?Jt.value:Jt.textContent,Zn=!0)),0<(b=Ma(a,y)).length&&(y=new xn(y,e,null,n,r),s.push({event:y,listeners:b}),v?y.data=v:null!==(v=Hn(n))&&(y.data=v))),(v=Bn?function(e,t){switch(e){case"compositionend":return Hn(t);case"keypress":return 32!==t.which?null:($n=!0,zn);case"textInput":return(e=t.data)===zn&&$n?null:e;default:return null}}(e,n):function(e,t){if(Zn)return"compositionend"===e||!Mn&&Un(e,t)?(e=nn(),tn=en=Jt=null,Zn=!1,e):null;switch(e){case"paste":default:return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return jn&&"ko"!==t.locale?null:t.data}}(e,n))&&(0<(a=Ma(a,"onBeforeInput")).length&&(r=new xn("onBeforeInput","beforeinput",null,n,r),s.push({event:r,listeners:a}),r.data=v))}La(s,t)}))}function Da(e,t,n){return{instance:e,listener:t,currentTarget:n}}function Ma(e,t){for(var n=t+"Capture",a=[];null!==e;){var r=e,o=r.stateNode;5===r.tag&&null!==o&&(r=o,null!=(o=je(e,n))&&a.unshift(Da(e,o,r)),null!=(o=je(e,t))&&a.push(Da(e,o,r))),e=e.return}return a}function Fa(e){if(null===e)return null;do{e=e.return}while(e&&5!==e.tag);return e||null}function Ba(e,t,n,a,r){for(var o=t._reactName,s=[];null!==n&&n!==a;){var i=n,c=i.alternate,d=i.stateNode;if(null!==c&&c===a)break;5===i.tag&&null!==d&&(i=d,r?null!=(c=je(n,o))&&s.unshift(Da(n,c,i)):r||null!=(c=je(n,o))&&s.push(Da(n,c,i))),n=n.return}0!==s.length&&e.push({event:t,listeners:s})}function ja(){}var za=null,$a=null;function Ua(e,t){switch(e){case"button":case"input":case"select":case"textarea":return!!t.autoFocus}return!1}function Ha(e,t){return"textarea"===e||"option"===e||"noscript"===e||"string"==typeof t.children||"number"==typeof t.children||"object"==typeof t.dangerouslySetInnerHTML&&null!==t.dangerouslySetInnerHTML&&null!=t.dangerouslySetInnerHTML.__html}var Za="function"==typeof setTimeout?setTimeout:void 0,Qa="function"==typeof clearTimeout?clearTimeout:void 0;function Va(e){1===e.nodeType?e.textContent="":9===e.nodeType&&(null!=(e=e.body)&&(e.textContent=""))}function qa(e){for(;null!=e;e=e.nextSibling){var t=e.nodeType;if(1===t||3===t)break}return e}function Ga(e){e=e.previousSibling;for(var t=0;e;){if(8===e.nodeType){var n=e.data;if("$"===n||"$!"===n||"$?"===n){if(0===t)return e;t--}else"/$"===n&&t++}e=e.previousSibling}return null}var Wa=0;var Xa=Math.random().toString(36).slice(2),Ya="__reactFiber$"+Xa,Ka="__reactProps$"+Xa,Ja="__reactContainer$"+Xa,er="__reactEvents$"+Xa;function tr(e){var t=e[Ya];if(t)return t;for(var n=e.parentNode;n;){if(t=n[Ja]||n[Ya]){if(n=t.alternate,null!==t.child||null!==n&&null!==n.child)for(e=Ga(e);null!==e;){if(n=e[Ya])return n;e=Ga(e)}return t}n=(e=n).parentNode}return null}function nr(e){return!(e=e[Ya]||e[Ja])||5!==e.tag&&6!==e.tag&&13!==e.tag&&3!==e.tag?null:e}function ar(e){if(5===e.tag||6===e.tag)return e.stateNode;throw Error(s(33))}function rr(e){return e[Ka]||null}function or(e){var t=e[er];return void 0===t&&(t=e[er]=new Set),t}var sr=[],ir=-1;function cr(e){return{current:e}}function dr(e){0>ir||(e.current=sr[ir],sr[ir]=null,ir--)}function lr(e,t){ir++,sr[ir]=e.current,e.current=t}var ur={},pr=cr(ur),fr=cr(!1),mr=ur;function gr(e,t){var n=e.type.contextTypes;if(!n)return ur;var a=e.stateNode;if(a&&a.__reactInternalMemoizedUnmaskedChildContext===t)return a.__reactInternalMemoizedMaskedChildContext;var r,o={};for(r in n)o[r]=t[r];return a&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=o),o}function hr(e){return null!=(e=e.childContextTypes)}function br(){dr(fr),dr(pr)}function vr(e,t,n){if(pr.current!==ur)throw Error(s(168));lr(pr,t),lr(fr,n)}function yr(e,t,n){var a=e.stateNode;if(e=t.childContextTypes,"function"!=typeof a.getChildContext)return n;for(var o in a=a.getChildContext())if(!(o in e))throw Error(s(108,q(t)||"Unknown",o));return r({},n,a)}function kr(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||ur,mr=pr.current,lr(pr,e),lr(fr,fr.current),!0}function wr(e,t,n){var a=e.stateNode;if(!a)throw Error(s(169));n?(e=yr(e,t,mr),a.__reactInternalMemoizedMergedChildContext=e,dr(fr),dr(pr),lr(pr,e)):dr(fr),lr(fr,n)}var xr=null,Er=null,_r=o.unstable_runWithPriority,Sr=o.unstable_scheduleCallback,Cr=o.unstable_cancelCallback,Tr=o.unstable_shouldYield,Lr=o.unstable_requestPaint,Pr=o.unstable_now,Rr=o.unstable_getCurrentPriorityLevel,Or=o.unstable_ImmediatePriority,Nr=o.unstable_UserBlockingPriority,Ir=o.unstable_NormalPriority,Ar=o.unstable_LowPriority,Dr=o.unstable_IdlePriority,Mr={},Fr=void 0!==Lr?Lr:function(){},Br=null,jr=null,zr=!1,$r=Pr(),Ur=1e4>$r?Pr:function(){return Pr()-$r};function Hr(){switch(Rr()){case Or:return 99;case Nr:return 98;case Ir:return 97;case Ar:return 96;case Dr:return 95;default:throw Error(s(332))}}function Zr(e){switch(e){case 99:return Or;case 98:return Nr;case 97:return Ir;case 96:return Ar;case 95:return Dr;default:throw Error(s(332))}}function Qr(e,t){return e=Zr(e),_r(e,t)}function Vr(e,t,n){return e=Zr(e),Sr(e,t,n)}function qr(){if(null!==jr){var e=jr;jr=null,Cr(e)}Gr()}function Gr(){if(!zr&&null!==Br){zr=!0;var e=0;try{var t=Br;Qr(99,(function(){for(;e<t.length;e++){var n=t[e];do{n=n(!0)}while(null!==n)}})),Br=null}catch(n){throw null!==Br&&(Br=Br.slice(e+1)),Sr(Or,qr),n}finally{zr=!1}}}var Wr=w.ReactCurrentBatchConfig;function Xr(e,t){if(e&&e.defaultProps){for(var n in t=r({},t),e=e.defaultProps)void 0===t[n]&&(t[n]=e[n]);return t}return t}var Yr=cr(null),Kr=null,Jr=null,eo=null;function to(){eo=Jr=Kr=null}function no(e){var t=Yr.current;dr(Yr),e.type._context._currentValue=t}function ao(e,t){for(;null!==e;){var n=e.alternate;if((e.childLanes&t)===t){if(null===n||(n.childLanes&t)===t)break;n.childLanes|=t}else e.childLanes|=t,null!==n&&(n.childLanes|=t);e=e.return}}function ro(e,t){Kr=e,eo=Jr=null,null!==(e=e.dependencies)&&null!==e.firstContext&&(0!=(e.lanes&t)&&(Ms=!0),e.firstContext=null)}function oo(e,t){if(eo!==e&&!1!==t&&0!==t)if("number"==typeof t&&1073741823!==t||(eo=e,t=1073741823),t={context:e,observedBits:t,next:null},null===Jr){if(null===Kr)throw Error(s(308));Jr=t,Kr.dependencies={lanes:0,firstContext:t,responders:null}}else Jr=Jr.next=t;return e._currentValue}var so=!1;function io(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null},effects:null}}function co(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function lo(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function uo(e,t){if(null!==(e=e.updateQueue)){var n=(e=e.shared).pending;null===n?t.next=t:(t.next=n.next,n.next=t),e.pending=t}}function po(e,t){var n=e.updateQueue,a=e.alternate;if(null!==a&&n===(a=a.updateQueue)){var r=null,o=null;if(null!==(n=n.firstBaseUpdate)){do{var s={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};null===o?r=o=s:o=o.next=s,n=n.next}while(null!==n);null===o?r=o=t:o=o.next=t}else r=o=t;return n={baseState:a.baseState,firstBaseUpdate:r,lastBaseUpdate:o,shared:a.shared,effects:a.effects},void(e.updateQueue=n)}null===(e=n.lastBaseUpdate)?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function fo(e,t,n,a){var o=e.updateQueue;so=!1;var s=o.firstBaseUpdate,i=o.lastBaseUpdate,c=o.shared.pending;if(null!==c){o.shared.pending=null;var d=c,l=d.next;d.next=null,null===i?s=l:i.next=l,i=d;var u=e.alternate;if(null!==u){var p=(u=u.updateQueue).lastBaseUpdate;p!==i&&(null===p?u.firstBaseUpdate=l:p.next=l,u.lastBaseUpdate=d)}}if(null!==s){for(p=o.baseState,i=0,u=l=d=null;;){c=s.lane;var f=s.eventTime;if((a&c)===c){null!==u&&(u=u.next={eventTime:f,lane:0,tag:s.tag,payload:s.payload,callback:s.callback,next:null});e:{var m=e,g=s;switch(c=t,f=n,g.tag){case 1:if("function"==typeof(m=g.payload)){p=m.call(f,p,c);break e}p=m;break e;case 3:m.flags=-4097&m.flags|64;case 0:if(null==(c="function"==typeof(m=g.payload)?m.call(f,p,c):m))break e;p=r({},p,c);break e;case 2:so=!0}}null!==s.callback&&(e.flags|=32,null===(c=o.effects)?o.effects=[s]:c.push(s))}else f={eventTime:f,lane:c,tag:s.tag,payload:s.payload,callback:s.callback,next:null},null===u?(l=u=f,d=p):u=u.next=f,i|=c;if(null===(s=s.next)){if(null===(c=o.shared.pending))break;s=c.next,c.next=null,o.lastBaseUpdate=c,o.shared.pending=null}}null===u&&(d=p),o.baseState=d,o.firstBaseUpdate=l,o.lastBaseUpdate=u,$i|=i,e.lanes=i,e.memoizedState=p}}function mo(e,t,n){if(e=t.effects,t.effects=null,null!==e)for(t=0;t<e.length;t++){var a=e[t],r=a.callback;if(null!==r){if(a.callback=null,a=n,"function"!=typeof r)throw Error(s(191,r));r.call(a)}}}var go=(new a.Component).refs;function ho(e,t,n,a){n=null==(n=n(a,t=e.memoizedState))?t:r({},t,n),e.memoizedState=n,0===e.lanes&&(e.updateQueue.baseState=n)}var bo={isMounted:function(e){return!!(e=e._reactInternals)&&We(e)===e},enqueueSetState:function(e,t,n){e=e._reactInternals;var a=pc(),r=fc(e),o=lo(a,r);o.payload=t,null!=n&&(o.callback=n),uo(e,o),mc(e,r,a)},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var a=pc(),r=fc(e),o=lo(a,r);o.tag=1,o.payload=t,null!=n&&(o.callback=n),uo(e,o),mc(e,r,a)},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=pc(),a=fc(e),r=lo(n,a);r.tag=2,null!=t&&(r.callback=t),uo(e,r),mc(e,a,n)}};function vo(e,t,n,a,r,o,s){return"function"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(a,o,s):!t.prototype||!t.prototype.isPureReactComponent||(!ua(n,a)||!ua(r,o))}function yo(e,t,n){var a=!1,r=ur,o=t.contextType;return"object"==typeof o&&null!==o?o=oo(o):(r=hr(t)?mr:pr.current,o=(a=null!=(a=t.contextTypes))?gr(e,r):ur),t=new t(n,o),e.memoizedState=null!==t.state&&void 0!==t.state?t.state:null,t.updater=bo,e.stateNode=t,t._reactInternals=e,a&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=r,e.__reactInternalMemoizedMaskedChildContext=o),t}function ko(e,t,n,a){e=t.state,"function"==typeof t.componentWillReceiveProps&&t.componentWillReceiveProps(n,a),"function"==typeof t.UNSAFE_componentWillReceiveProps&&t.UNSAFE_componentWillReceiveProps(n,a),t.state!==e&&bo.enqueueReplaceState(t,t.state,null)}function wo(e,t,n,a){var r=e.stateNode;r.props=n,r.state=e.memoizedState,r.refs=go,io(e);var o=t.contextType;"object"==typeof o&&null!==o?r.context=oo(o):(o=hr(t)?mr:pr.current,r.context=gr(e,o)),fo(e,n,r,a),r.state=e.memoizedState,"function"==typeof(o=t.getDerivedStateFromProps)&&(ho(e,t,o,n),r.state=e.memoizedState),"function"==typeof t.getDerivedStateFromProps||"function"==typeof r.getSnapshotBeforeUpdate||"function"!=typeof r.UNSAFE_componentWillMount&&"function"!=typeof r.componentWillMount||(t=r.state,"function"==typeof r.componentWillMount&&r.componentWillMount(),"function"==typeof r.UNSAFE_componentWillMount&&r.UNSAFE_componentWillMount(),t!==r.state&&bo.enqueueReplaceState(r,r.state,null),fo(e,n,r,a),r.state=e.memoizedState),"function"==typeof r.componentDidMount&&(e.flags|=4)}var xo=Array.isArray;function Eo(e,t,n){if(null!==(e=n.ref)&&"function"!=typeof e&&"object"!=typeof e){if(n._owner){if(n=n._owner){if(1!==n.tag)throw Error(s(309));var a=n.stateNode}if(!a)throw Error(s(147,e));var r=""+e;return null!==t&&null!==t.ref&&"function"==typeof t.ref&&t.ref._stringRef===r?t.ref:(t=function(e){var t=a.refs;t===go&&(t=a.refs={}),null===e?delete t[r]:t[r]=e},t._stringRef=r,t)}if("string"!=typeof e)throw Error(s(284));if(!n._owner)throw Error(s(290,e))}return e}function _o(e,t){if("textarea"!==e.type)throw Error(s(31,"[object Object]"===Object.prototype.toString.call(t)?"object with keys {"+Object.keys(t).join(", ")+"}":t))}function So(e){function t(t,n){if(e){var a=t.lastEffect;null!==a?(a.nextEffect=n,t.lastEffect=n):t.firstEffect=t.lastEffect=n,n.nextEffect=null,n.flags=8}}function n(n,a){if(!e)return null;for(;null!==a;)t(n,a),a=a.sibling;return null}function a(e,t){for(e=new Map;null!==t;)null!==t.key?e.set(t.key,t):e.set(t.index,t),t=t.sibling;return e}function r(e,t){return(e=Vc(e,t)).index=0,e.sibling=null,e}function o(t,n,a){return t.index=a,e?null!==(a=t.alternate)?(a=a.index)<n?(t.flags=2,n):a:(t.flags=2,n):n}function i(t){return e&&null===t.alternate&&(t.flags=2),t}function c(e,t,n,a){return null===t||6!==t.tag?((t=Xc(n,e.mode,a)).return=e,t):((t=r(t,n)).return=e,t)}function d(e,t,n,a){return null!==t&&t.elementType===n.type?((a=r(t,n.props)).ref=Eo(e,t,n),a.return=e,a):((a=qc(n.type,n.key,n.props,null,e.mode,a)).ref=Eo(e,t,n),a.return=e,a)}function l(e,t,n,a){return null===t||4!==t.tag||t.stateNode.containerInfo!==n.containerInfo||t.stateNode.implementation!==n.implementation?((t=Yc(n,e.mode,a)).return=e,t):((t=r(t,n.children||[])).return=e,t)}function u(e,t,n,a,o){return null===t||7!==t.tag?((t=Gc(n,e.mode,a,o)).return=e,t):((t=r(t,n)).return=e,t)}function p(e,t,n){if("string"==typeof t||"number"==typeof t)return(t=Xc(""+t,e.mode,n)).return=e,t;if("object"==typeof t&&null!==t){switch(t.$$typeof){case x:return(n=qc(t.type,t.key,t.props,null,e.mode,n)).ref=Eo(e,null,t),n.return=e,n;case E:return(t=Yc(t,e.mode,n)).return=e,t}if(xo(t)||U(t))return(t=Gc(t,e.mode,n,null)).return=e,t;_o(e,t)}return null}function f(e,t,n,a){var r=null!==t?t.key:null;if("string"==typeof n||"number"==typeof n)return null!==r?null:c(e,t,""+n,a);if("object"==typeof n&&null!==n){switch(n.$$typeof){case x:return n.key===r?n.type===_?u(e,t,n.props.children,a,r):d(e,t,n,a):null;case E:return n.key===r?l(e,t,n,a):null}if(xo(n)||U(n))return null!==r?null:u(e,t,n,a,null);_o(e,n)}return null}function m(e,t,n,a,r){if("string"==typeof a||"number"==typeof a)return c(t,e=e.get(n)||null,""+a,r);if("object"==typeof a&&null!==a){switch(a.$$typeof){case x:return e=e.get(null===a.key?n:a.key)||null,a.type===_?u(t,e,a.props.children,r,a.key):d(t,e,a,r);case E:return l(t,e=e.get(null===a.key?n:a.key)||null,a,r)}if(xo(a)||U(a))return u(t,e=e.get(n)||null,a,r,null);_o(t,a)}return null}function g(r,s,i,c){for(var d=null,l=null,u=s,g=s=0,h=null;null!==u&&g<i.length;g++){u.index>g?(h=u,u=null):h=u.sibling;var b=f(r,u,i[g],c);if(null===b){null===u&&(u=h);break}e&&u&&null===b.alternate&&t(r,u),s=o(b,s,g),null===l?d=b:l.sibling=b,l=b,u=h}if(g===i.length)return n(r,u),d;if(null===u){for(;g<i.length;g++)null!==(u=p(r,i[g],c))&&(s=o(u,s,g),null===l?d=u:l.sibling=u,l=u);return d}for(u=a(r,u);g<i.length;g++)null!==(h=m(u,r,g,i[g],c))&&(e&&null!==h.alternate&&u.delete(null===h.key?g:h.key),s=o(h,s,g),null===l?d=h:l.sibling=h,l=h);return e&&u.forEach((function(e){return t(r,e)})),d}function h(r,i,c,d){var l=U(c);if("function"!=typeof l)throw Error(s(150));if(null==(c=l.call(c)))throw Error(s(151));for(var u=l=null,g=i,h=i=0,b=null,v=c.next();null!==g&&!v.done;h++,v=c.next()){g.index>h?(b=g,g=null):b=g.sibling;var y=f(r,g,v.value,d);if(null===y){null===g&&(g=b);break}e&&g&&null===y.alternate&&t(r,g),i=o(y,i,h),null===u?l=y:u.sibling=y,u=y,g=b}if(v.done)return n(r,g),l;if(null===g){for(;!v.done;h++,v=c.next())null!==(v=p(r,v.value,d))&&(i=o(v,i,h),null===u?l=v:u.sibling=v,u=v);return l}for(g=a(r,g);!v.done;h++,v=c.next())null!==(v=m(g,r,h,v.value,d))&&(e&&null!==v.alternate&&g.delete(null===v.key?h:v.key),i=o(v,i,h),null===u?l=v:u.sibling=v,u=v);return e&&g.forEach((function(e){return t(r,e)})),l}return function(e,a,o,c){var d="object"==typeof o&&null!==o&&o.type===_&&null===o.key;d&&(o=o.props.children);var l="object"==typeof o&&null!==o;if(l)switch(o.$$typeof){case x:e:{for(l=o.key,d=a;null!==d;){if(d.key===l){if(7===d.tag){if(o.type===_){n(e,d.sibling),(a=r(d,o.props.children)).return=e,e=a;break e}}else if(d.elementType===o.type){n(e,d.sibling),(a=r(d,o.props)).ref=Eo(e,d,o),a.return=e,e=a;break e}n(e,d);break}t(e,d),d=d.sibling}o.type===_?((a=Gc(o.props.children,e.mode,c,o.key)).return=e,e=a):((c=qc(o.type,o.key,o.props,null,e.mode,c)).ref=Eo(e,a,o),c.return=e,e=c)}return i(e);case E:e:{for(d=o.key;null!==a;){if(a.key===d){if(4===a.tag&&a.stateNode.containerInfo===o.containerInfo&&a.stateNode.implementation===o.implementation){n(e,a.sibling),(a=r(a,o.children||[])).return=e,e=a;break e}n(e,a);break}t(e,a),a=a.sibling}(a=Yc(o,e.mode,c)).return=e,e=a}return i(e)}if("string"==typeof o||"number"==typeof o)return o=""+o,null!==a&&6===a.tag?(n(e,a.sibling),(a=r(a,o)).return=e,e=a):(n(e,a),(a=Xc(o,e.mode,c)).return=e,e=a),i(e);if(xo(o))return g(e,a,o,c);if(U(o))return h(e,a,o,c);if(l&&_o(e,o),void 0===o&&!d)switch(e.tag){case 1:case 22:case 0:case 11:case 15:throw Error(s(152,q(e.type)||"Component"))}return n(e,a)}}var Co=So(!0),To=So(!1),Lo={},Po=cr(Lo),Ro=cr(Lo),Oo=cr(Lo);function No(e){if(e===Lo)throw Error(s(174));return e}function Io(e,t){switch(lr(Oo,t),lr(Ro,e),lr(Po,Lo),e=t.nodeType){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:fe(null,"");break;default:t=fe(t=(e=8===e?t.parentNode:t).namespaceURI||null,e=e.tagName)}dr(Po),lr(Po,t)}function Ao(){dr(Po),dr(Ro),dr(Oo)}function Do(e){No(Oo.current);var t=No(Po.current),n=fe(t,e.type);t!==n&&(lr(Ro,e),lr(Po,n))}function Mo(e){Ro.current===e&&(dr(Po),dr(Ro))}var Fo=cr(0);function Bo(e){for(var t=e;null!==t;){if(13===t.tag){var n=t.memoizedState;if(null!==n&&(null===(n=n.dehydrated)||"$?"===n.data||"$!"===n.data))return t}else if(19===t.tag&&void 0!==t.memoizedProps.revealOrder){if(0!=(64&t.flags))return t}else if(null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var jo=null,zo=null,$o=!1;function Uo(e,t){var n=Zc(5,null,null,0);n.elementType="DELETED",n.type="DELETED",n.stateNode=t,n.return=e,n.flags=8,null!==e.lastEffect?(e.lastEffect.nextEffect=n,e.lastEffect=n):e.firstEffect=e.lastEffect=n}function Ho(e,t){switch(e.tag){case 5:var n=e.type;return null!==(t=1!==t.nodeType||n.toLowerCase()!==t.nodeName.toLowerCase()?null:t)&&(e.stateNode=t,!0);case 6:return null!==(t=""===e.pendingProps||3!==t.nodeType?null:t)&&(e.stateNode=t,!0);default:return!1}}function Zo(e){if($o){var t=zo;if(t){var n=t;if(!Ho(e,t)){if(!(t=qa(n.nextSibling))||!Ho(e,t))return e.flags=-1025&e.flags|2,$o=!1,void(jo=e);Uo(jo,n)}jo=e,zo=qa(t.firstChild)}else e.flags=-1025&e.flags|2,$o=!1,jo=e}}function Qo(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag&&13!==e.tag;)e=e.return;jo=e}function Vo(e){if(e!==jo)return!1;if(!$o)return Qo(e),$o=!0,!1;var t=e.type;if(5!==e.tag||"head"!==t&&"body"!==t&&!Ha(t,e.memoizedProps))for(t=zo;t;)Uo(e,t),t=qa(t.nextSibling);if(Qo(e),13===e.tag){if(!(e=null!==(e=e.memoizedState)?e.dehydrated:null))throw Error(s(317));e:{for(e=e.nextSibling,t=0;e;){if(8===e.nodeType){var n=e.data;if("/$"===n){if(0===t){zo=qa(e.nextSibling);break e}t--}else"$"!==n&&"$!"!==n&&"$?"!==n||t++}e=e.nextSibling}zo=null}}else zo=jo?qa(e.stateNode.nextSibling):null;return!0}function qo(){zo=jo=null,$o=!1}var Go=[];function Wo(){for(var e=0;e<Go.length;e++)Go[e]._workInProgressVersionPrimary=null;Go.length=0}var Xo=w.ReactCurrentDispatcher,Yo=w.ReactCurrentBatchConfig,Ko=0,Jo=null,es=null,ts=null,ns=!1,as=!1;function rs(){throw Error(s(321))}function os(e,t){if(null===t)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!da(e[n],t[n]))return!1;return!0}function ss(e,t,n,a,r,o){if(Ko=o,Jo=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,Xo.current=null===e||null===e.memoizedState?Ns:Is,e=n(a,r),as){o=0;do{if(as=!1,!(25>o))throw Error(s(301));o+=1,ts=es=null,t.updateQueue=null,Xo.current=As,e=n(a,r)}while(as)}if(Xo.current=Os,t=null!==es&&null!==es.next,Ko=0,ts=es=Jo=null,ns=!1,t)throw Error(s(300));return e}function is(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return null===ts?Jo.memoizedState=ts=e:ts=ts.next=e,ts}function cs(){if(null===es){var e=Jo.alternate;e=null!==e?e.memoizedState:null}else e=es.next;var t=null===ts?Jo.memoizedState:ts.next;if(null!==t)ts=t,es=e;else{if(null===e)throw Error(s(310));e={memoizedState:(es=e).memoizedState,baseState:es.baseState,baseQueue:es.baseQueue,queue:es.queue,next:null},null===ts?Jo.memoizedState=ts=e:ts=ts.next=e}return ts}function ds(e,t){return"function"==typeof t?t(e):t}function ls(e){var t=cs(),n=t.queue;if(null===n)throw Error(s(311));n.lastRenderedReducer=e;var a=es,r=a.baseQueue,o=n.pending;if(null!==o){if(null!==r){var i=r.next;r.next=o.next,o.next=i}a.baseQueue=r=o,n.pending=null}if(null!==r){r=r.next,a=a.baseState;var c=i=o=null,d=r;do{var l=d.lane;if((Ko&l)===l)null!==c&&(c=c.next={lane:0,action:d.action,eagerReducer:d.eagerReducer,eagerState:d.eagerState,next:null}),a=d.eagerReducer===e?d.eagerState:e(a,d.action);else{var u={lane:l,action:d.action,eagerReducer:d.eagerReducer,eagerState:d.eagerState,next:null};null===c?(i=c=u,o=a):c=c.next=u,Jo.lanes|=l,$i|=l}d=d.next}while(null!==d&&d!==r);null===c?o=a:c.next=i,da(a,t.memoizedState)||(Ms=!0),t.memoizedState=a,t.baseState=o,t.baseQueue=c,n.lastRenderedState=a}return[t.memoizedState,n.dispatch]}function us(e){var t=cs(),n=t.queue;if(null===n)throw Error(s(311));n.lastRenderedReducer=e;var a=n.dispatch,r=n.pending,o=t.memoizedState;if(null!==r){n.pending=null;var i=r=r.next;do{o=e(o,i.action),i=i.next}while(i!==r);da(o,t.memoizedState)||(Ms=!0),t.memoizedState=o,null===t.baseQueue&&(t.baseState=o),n.lastRenderedState=o}return[o,a]}function ps(e,t,n){var a=t._getVersion;a=a(t._source);var r=t._workInProgressVersionPrimary;if(null!==r?e=r===a:(e=e.mutableReadLanes,(e=(Ko&e)===e)&&(t._workInProgressVersionPrimary=a,Go.push(t))),e)return n(t._source);throw Go.push(t),Error(s(350))}function fs(e,t,n,a){var r=Ii;if(null===r)throw Error(s(349));var o=t._getVersion,i=o(t._source),c=Xo.current,d=c.useState((function(){return ps(r,t,n)})),l=d[1],u=d[0];d=ts;var p=e.memoizedState,f=p.refs,m=f.getSnapshot,g=p.source;p=p.subscribe;var h=Jo;return e.memoizedState={refs:f,source:t,subscribe:a},c.useEffect((function(){f.getSnapshot=n,f.setSnapshot=l;var e=o(t._source);if(!da(i,e)){e=n(t._source),da(u,e)||(l(e),e=fc(h),r.mutableReadLanes|=e&r.pendingLanes),e=r.mutableReadLanes,r.entangledLanes|=e;for(var a=r.entanglements,s=e;0<s;){var c=31-Ht(s),d=1<<c;a[c]|=e,s&=~d}}}),[n,t,a]),c.useEffect((function(){return a(t._source,(function(){var e=f.getSnapshot,n=f.setSnapshot;try{n(e(t._source));var a=fc(h);r.mutableReadLanes|=a&r.pendingLanes}catch(o){n((function(){throw o}))}}))}),[t,a]),da(m,n)&&da(g,t)&&da(p,a)||((e={pending:null,dispatch:null,lastRenderedReducer:ds,lastRenderedState:u}).dispatch=l=Rs.bind(null,Jo,e),d.queue=e,d.baseQueue=null,u=ps(r,t,n),d.memoizedState=d.baseState=u),u}function ms(e,t,n){return fs(cs(),e,t,n)}function gs(e){var t=is();return"function"==typeof e&&(e=e()),t.memoizedState=t.baseState=e,e=(e=t.queue={pending:null,dispatch:null,lastRenderedReducer:ds,lastRenderedState:e}).dispatch=Rs.bind(null,Jo,e),[t.memoizedState,e]}function hs(e,t,n,a){return e={tag:e,create:t,destroy:n,deps:a,next:null},null===(t=Jo.updateQueue)?(t={lastEffect:null},Jo.updateQueue=t,t.lastEffect=e.next=e):null===(n=t.lastEffect)?t.lastEffect=e.next=e:(a=n.next,n.next=e,e.next=a,t.lastEffect=e),e}function bs(e){return e={current:e},is().memoizedState=e}function vs(){return cs().memoizedState}function ys(e,t,n,a){var r=is();Jo.flags|=e,r.memoizedState=hs(1|t,n,void 0,void 0===a?null:a)}function ks(e,t,n,a){var r=cs();a=void 0===a?null:a;var o=void 0;if(null!==es){var s=es.memoizedState;if(o=s.destroy,null!==a&&os(a,s.deps))return void hs(t,n,o,a)}Jo.flags|=e,r.memoizedState=hs(1|t,n,o,a)}function ws(e,t){return ys(516,4,e,t)}function xs(e,t){return ks(516,4,e,t)}function Es(e,t){return ks(4,2,e,t)}function _s(e,t){return"function"==typeof t?(e=e(),t(e),function(){t(null)}):null!=t?(e=e(),t.current=e,function(){t.current=null}):void 0}function Ss(e,t,n){return n=null!=n?n.concat([e]):null,ks(4,2,_s.bind(null,t,e),n)}function Cs(){}function Ts(e,t){var n=cs();t=void 0===t?null:t;var a=n.memoizedState;return null!==a&&null!==t&&os(t,a[1])?a[0]:(n.memoizedState=[e,t],e)}function Ls(e,t){var n=cs();t=void 0===t?null:t;var a=n.memoizedState;return null!==a&&null!==t&&os(t,a[1])?a[0]:(e=e(),n.memoizedState=[e,t],e)}function Ps(e,t){var n=Hr();Qr(98>n?98:n,(function(){e(!0)})),Qr(97<n?97:n,(function(){var n=Yo.transition;Yo.transition=1;try{e(!1),t()}finally{Yo.transition=n}}))}function Rs(e,t,n){var a=pc(),r=fc(e),o={lane:r,action:n,eagerReducer:null,eagerState:null,next:null},s=t.pending;if(null===s?o.next=o:(o.next=s.next,s.next=o),t.pending=o,s=e.alternate,e===Jo||null!==s&&s===Jo)as=ns=!0;else{if(0===e.lanes&&(null===s||0===s.lanes)&&null!==(s=t.lastRenderedReducer))try{var i=t.lastRenderedState,c=s(i,n);if(o.eagerReducer=s,o.eagerState=c,da(c,i))return}catch(d){}mc(e,r,a)}}var Os={readContext:oo,useCallback:rs,useContext:rs,useEffect:rs,useImperativeHandle:rs,useLayoutEffect:rs,useMemo:rs,useReducer:rs,useRef:rs,useState:rs,useDebugValue:rs,useDeferredValue:rs,useTransition:rs,useMutableSource:rs,useOpaqueIdentifier:rs,unstable_isNewReconciler:!1},Ns={readContext:oo,useCallback:function(e,t){return is().memoizedState=[e,void 0===t?null:t],e},useContext:oo,useEffect:ws,useImperativeHandle:function(e,t,n){return n=null!=n?n.concat([e]):null,ys(4,2,_s.bind(null,t,e),n)},useLayoutEffect:function(e,t){return ys(4,2,e,t)},useMemo:function(e,t){var n=is();return t=void 0===t?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var a=is();return t=void 0!==n?n(t):t,a.memoizedState=a.baseState=t,e=(e=a.queue={pending:null,dispatch:null,lastRenderedReducer:e,lastRenderedState:t}).dispatch=Rs.bind(null,Jo,e),[a.memoizedState,e]},useRef:bs,useState:gs,useDebugValue:Cs,useDeferredValue:function(e){var t=gs(e),n=t[0],a=t[1];return ws((function(){var t=Yo.transition;Yo.transition=1;try{a(e)}finally{Yo.transition=t}}),[e]),n},useTransition:function(){var e=gs(!1),t=e[0];return bs(e=Ps.bind(null,e[1])),[e,t]},useMutableSource:function(e,t,n){var a=is();return a.memoizedState={refs:{getSnapshot:t,setSnapshot:null},source:e,subscribe:n},fs(a,e,t,n)},useOpaqueIdentifier:function(){if($o){var e=!1,t=function(e){return{$$typeof:D,toString:e,valueOf:e}}((function(){throw e||(e=!0,n("r:"+(Wa++).toString(36))),Error(s(355))})),n=gs(t)[1];return 0==(2&Jo.mode)&&(Jo.flags|=516,hs(5,(function(){n("r:"+(Wa++).toString(36))}),void 0,null)),t}return gs(t="r:"+(Wa++).toString(36)),t},unstable_isNewReconciler:!1},Is={readContext:oo,useCallback:Ts,useContext:oo,useEffect:xs,useImperativeHandle:Ss,useLayoutEffect:Es,useMemo:Ls,useReducer:ls,useRef:vs,useState:function(){return ls(ds)},useDebugValue:Cs,useDeferredValue:function(e){var t=ls(ds),n=t[0],a=t[1];return xs((function(){var t=Yo.transition;Yo.transition=1;try{a(e)}finally{Yo.transition=t}}),[e]),n},useTransition:function(){var e=ls(ds)[0];return[vs().current,e]},useMutableSource:ms,useOpaqueIdentifier:function(){return ls(ds)[0]},unstable_isNewReconciler:!1},As={readContext:oo,useCallback:Ts,useContext:oo,useEffect:xs,useImperativeHandle:Ss,useLayoutEffect:Es,useMemo:Ls,useReducer:us,useRef:vs,useState:function(){return us(ds)},useDebugValue:Cs,useDeferredValue:function(e){var t=us(ds),n=t[0],a=t[1];return xs((function(){var t=Yo.transition;Yo.transition=1;try{a(e)}finally{Yo.transition=t}}),[e]),n},useTransition:function(){var e=us(ds)[0];return[vs().current,e]},useMutableSource:ms,useOpaqueIdentifier:function(){return us(ds)[0]},unstable_isNewReconciler:!1},Ds=w.ReactCurrentOwner,Ms=!1;function Fs(e,t,n,a){t.child=null===e?To(t,null,n,a):Co(t,e.child,n,a)}function Bs(e,t,n,a,r){n=n.render;var o=t.ref;return ro(t,r),a=ss(e,t,n,a,o,r),null===e||Ms?(t.flags|=1,Fs(e,t,a,r),t.child):(t.updateQueue=e.updateQueue,t.flags&=-517,e.lanes&=~r,oi(e,t,r))}function js(e,t,n,a,r,o){if(null===e){var s=n.type;return"function"!=typeof s||Qc(s)||void 0!==s.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=qc(n.type,null,a,t,t.mode,o)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=s,zs(e,t,s,a,r,o))}return s=e.child,0==(r&o)&&(r=s.memoizedProps,(n=null!==(n=n.compare)?n:ua)(r,a)&&e.ref===t.ref)?oi(e,t,o):(t.flags|=1,(e=Vc(s,a)).ref=t.ref,e.return=t,t.child=e)}function zs(e,t,n,a,r,o){if(null!==e&&ua(e.memoizedProps,a)&&e.ref===t.ref){if(Ms=!1,0==(o&r))return t.lanes=e.lanes,oi(e,t,o);0!=(16384&e.flags)&&(Ms=!0)}return Hs(e,t,n,a,o)}function $s(e,t,n){var a=t.pendingProps,r=a.children,o=null!==e?e.memoizedState:null;if("hidden"===a.mode||"unstable-defer-without-hiding"===a.mode)if(0==(4&t.mode))t.memoizedState={baseLanes:0},xc(t,n);else{if(0==(1073741824&n))return e=null!==o?o.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e},xc(t,e),null;t.memoizedState={baseLanes:0},xc(t,null!==o?o.baseLanes:n)}else null!==o?(a=o.baseLanes|n,t.memoizedState=null):a=n,xc(t,a);return Fs(e,t,r,n),t.child}function Us(e,t){var n=t.ref;(null===e&&null!==n||null!==e&&e.ref!==n)&&(t.flags|=128)}function Hs(e,t,n,a,r){var o=hr(n)?mr:pr.current;return o=gr(t,o),ro(t,r),n=ss(e,t,n,a,o,r),null===e||Ms?(t.flags|=1,Fs(e,t,n,r),t.child):(t.updateQueue=e.updateQueue,t.flags&=-517,e.lanes&=~r,oi(e,t,r))}function Zs(e,t,n,a,r){if(hr(n)){var o=!0;kr(t)}else o=!1;if(ro(t,r),null===t.stateNode)null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),yo(t,n,a),wo(t,n,a,r),a=!0;else if(null===e){var s=t.stateNode,i=t.memoizedProps;s.props=i;var c=s.context,d=n.contextType;"object"==typeof d&&null!==d?d=oo(d):d=gr(t,d=hr(n)?mr:pr.current);var l=n.getDerivedStateFromProps,u="function"==typeof l||"function"==typeof s.getSnapshotBeforeUpdate;u||"function"!=typeof s.UNSAFE_componentWillReceiveProps&&"function"!=typeof s.componentWillReceiveProps||(i!==a||c!==d)&&ko(t,s,a,d),so=!1;var p=t.memoizedState;s.state=p,fo(t,a,s,r),c=t.memoizedState,i!==a||p!==c||fr.current||so?("function"==typeof l&&(ho(t,n,l,a),c=t.memoizedState),(i=so||vo(t,n,i,a,p,c,d))?(u||"function"!=typeof s.UNSAFE_componentWillMount&&"function"!=typeof s.componentWillMount||("function"==typeof s.componentWillMount&&s.componentWillMount(),"function"==typeof s.UNSAFE_componentWillMount&&s.UNSAFE_componentWillMount()),"function"==typeof s.componentDidMount&&(t.flags|=4)):("function"==typeof s.componentDidMount&&(t.flags|=4),t.memoizedProps=a,t.memoizedState=c),s.props=a,s.state=c,s.context=d,a=i):("function"==typeof s.componentDidMount&&(t.flags|=4),a=!1)}else{s=t.stateNode,co(e,t),i=t.memoizedProps,d=t.type===t.elementType?i:Xr(t.type,i),s.props=d,u=t.pendingProps,p=s.context,"object"==typeof(c=n.contextType)&&null!==c?c=oo(c):c=gr(t,c=hr(n)?mr:pr.current);var f=n.getDerivedStateFromProps;(l="function"==typeof f||"function"==typeof s.getSnapshotBeforeUpdate)||"function"!=typeof s.UNSAFE_componentWillReceiveProps&&"function"!=typeof s.componentWillReceiveProps||(i!==u||p!==c)&&ko(t,s,a,c),so=!1,p=t.memoizedState,s.state=p,fo(t,a,s,r);var m=t.memoizedState;i!==u||p!==m||fr.current||so?("function"==typeof f&&(ho(t,n,f,a),m=t.memoizedState),(d=so||vo(t,n,d,a,p,m,c))?(l||"function"!=typeof s.UNSAFE_componentWillUpdate&&"function"!=typeof s.componentWillUpdate||("function"==typeof s.componentWillUpdate&&s.componentWillUpdate(a,m,c),"function"==typeof s.UNSAFE_componentWillUpdate&&s.UNSAFE_componentWillUpdate(a,m,c)),"function"==typeof s.componentDidUpdate&&(t.flags|=4),"function"==typeof s.getSnapshotBeforeUpdate&&(t.flags|=256)):("function"!=typeof s.componentDidUpdate||i===e.memoizedProps&&p===e.memoizedState||(t.flags|=4),"function"!=typeof s.getSnapshotBeforeUpdate||i===e.memoizedProps&&p===e.memoizedState||(t.flags|=256),t.memoizedProps=a,t.memoizedState=m),s.props=a,s.state=m,s.context=c,a=d):("function"!=typeof s.componentDidUpdate||i===e.memoizedProps&&p===e.memoizedState||(t.flags|=4),"function"!=typeof s.getSnapshotBeforeUpdate||i===e.memoizedProps&&p===e.memoizedState||(t.flags|=256),a=!1)}return Qs(e,t,n,a,o,r)}function Qs(e,t,n,a,r,o){Us(e,t);var s=0!=(64&t.flags);if(!a&&!s)return r&&wr(t,n,!1),oi(e,t,o);a=t.stateNode,Ds.current=t;var i=s&&"function"!=typeof n.getDerivedStateFromError?null:a.render();return t.flags|=1,null!==e&&s?(t.child=Co(t,e.child,null,o),t.child=Co(t,null,i,o)):Fs(e,t,i,o),t.memoizedState=a.state,r&&wr(t,n,!0),t.child}function Vs(e){var t=e.stateNode;t.pendingContext?vr(0,t.pendingContext,t.pendingContext!==t.context):t.context&&vr(0,t.context,!1),Io(e,t.containerInfo)}var qs,Gs,Ws,Xs,Ys={dehydrated:null,retryLane:0};function Ks(e,t,n){var a,r=t.pendingProps,o=Fo.current,s=!1;return(a=0!=(64&t.flags))||(a=(null===e||null!==e.memoizedState)&&0!=(2&o)),a?(s=!0,t.flags&=-65):null!==e&&null===e.memoizedState||void 0===r.fallback||!0===r.unstable_avoidThisFallback||(o|=1),lr(Fo,1&o),null===e?(void 0!==r.fallback&&Zo(t),e=r.children,o=r.fallback,s?(e=Js(t,e,o,n),t.child.memoizedState={baseLanes:n},t.memoizedState=Ys,e):"number"==typeof r.unstable_expectedLoadTime?(e=Js(t,e,o,n),t.child.memoizedState={baseLanes:n},t.memoizedState=Ys,t.lanes=33554432,e):((n=Wc({mode:"visible",children:e},t.mode,n,null)).return=t,t.child=n)):(e.memoizedState,s?(r=ti(e,t,r.children,r.fallback,n),s=t.child,o=e.child.memoizedState,s.memoizedState=null===o?{baseLanes:n}:{baseLanes:o.baseLanes|n},s.childLanes=e.childLanes&~n,t.memoizedState=Ys,r):(n=ei(e,t,r.children,n),t.memoizedState=null,n))}function Js(e,t,n,a){var r=e.mode,o=e.child;return t={mode:"hidden",children:t},0==(2&r)&&null!==o?(o.childLanes=0,o.pendingProps=t):o=Wc(t,r,0,null),n=Gc(n,r,a,null),o.return=e,n.return=e,o.sibling=n,e.child=o,n}function ei(e,t,n,a){var r=e.child;return e=r.sibling,n=Vc(r,{mode:"visible",children:n}),0==(2&t.mode)&&(n.lanes=a),n.return=t,n.sibling=null,null!==e&&(e.nextEffect=null,e.flags=8,t.firstEffect=t.lastEffect=e),t.child=n}function ti(e,t,n,a,r){var o=t.mode,s=e.child;e=s.sibling;var i={mode:"hidden",children:n};return 0==(2&o)&&t.child!==s?((n=t.child).childLanes=0,n.pendingProps=i,null!==(s=n.lastEffect)?(t.firstEffect=n.firstEffect,t.lastEffect=s,s.nextEffect=null):t.firstEffect=t.lastEffect=null):n=Vc(s,i),null!==e?a=Vc(e,a):(a=Gc(a,o,r,null)).flags|=2,a.return=t,n.return=t,n.sibling=a,t.child=n,a}function ni(e,t){e.lanes|=t;var n=e.alternate;null!==n&&(n.lanes|=t),ao(e.return,t)}function ai(e,t,n,a,r,o){var s=e.memoizedState;null===s?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:a,tail:n,tailMode:r,lastEffect:o}:(s.isBackwards=t,s.rendering=null,s.renderingStartTime=0,s.last=a,s.tail=n,s.tailMode=r,s.lastEffect=o)}function ri(e,t,n){var a=t.pendingProps,r=a.revealOrder,o=a.tail;if(Fs(e,t,a.children,n),0!=(2&(a=Fo.current)))a=1&a|2,t.flags|=64;else{if(null!==e&&0!=(64&e.flags))e:for(e=t.child;null!==e;){if(13===e.tag)null!==e.memoizedState&&ni(e,n);else if(19===e.tag)ni(e,n);else if(null!==e.child){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;null===e.sibling;){if(null===e.return||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}a&=1}if(lr(Fo,a),0==(2&t.mode))t.memoizedState=null;else switch(r){case"forwards":for(n=t.child,r=null;null!==n;)null!==(e=n.alternate)&&null===Bo(e)&&(r=n),n=n.sibling;null===(n=r)?(r=t.child,t.child=null):(r=n.sibling,n.sibling=null),ai(t,!1,r,n,o,t.lastEffect);break;case"backwards":for(n=null,r=t.child,t.child=null;null!==r;){if(null!==(e=r.alternate)&&null===Bo(e)){t.child=r;break}e=r.sibling,r.sibling=n,n=r,r=e}ai(t,!0,n,null,o,t.lastEffect);break;case"together":ai(t,!1,null,null,void 0,t.lastEffect);break;default:t.memoizedState=null}return t.child}function oi(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),$i|=t.lanes,0!=(n&t.childLanes)){if(null!==e&&t.child!==e.child)throw Error(s(153));if(null!==t.child){for(n=Vc(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=Vc(e,e.pendingProps)).return=t;n.sibling=null}return t.child}return null}function si(e,t){if(!$o)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;null!==t;)null!==t.alternate&&(n=t),t=t.sibling;null===n?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var a=null;null!==n;)null!==n.alternate&&(a=n),n=n.sibling;null===a?t||null===e.tail?e.tail=null:e.tail.sibling=null:a.sibling=null}}function ii(e,t,n){var a=t.pendingProps;switch(t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return null;case 1:case 17:return hr(t.type)&&br(),null;case 3:return Ao(),dr(fr),dr(pr),Wo(),(a=t.stateNode).pendingContext&&(a.context=a.pendingContext,a.pendingContext=null),null!==e&&null!==e.child||(Vo(t)?t.flags|=4:a.hydrate||(t.flags|=256)),Gs(t),null;case 5:Mo(t);var o=No(Oo.current);if(n=t.type,null!==e&&null!=t.stateNode)Ws(e,t,n,a,o),e.ref!==t.ref&&(t.flags|=128);else{if(!a){if(null===t.stateNode)throw Error(s(166));return null}if(e=No(Po.current),Vo(t)){a=t.stateNode,n=t.type;var i=t.memoizedProps;switch(a[Ya]=t,a[Ka]=i,n){case"dialog":Pa("cancel",a),Pa("close",a);break;case"iframe":case"object":case"embed":Pa("load",a);break;case"video":case"audio":for(e=0;e<Sa.length;e++)Pa(Sa[e],a);break;case"source":Pa("error",a);break;case"img":case"image":case"link":Pa("error",a),Pa("load",a);break;case"details":Pa("toggle",a);break;case"input":ee(a,i),Pa("invalid",a);break;case"select":a._wrapperState={wasMultiple:!!i.multiple},Pa("invalid",a);break;case"textarea":ce(a,i),Pa("invalid",a)}for(var d in Ee(n,i),e=null,i)i.hasOwnProperty(d)&&(o=i[d],"children"===d?"string"==typeof o?a.textContent!==o&&(e=["children",o]):"number"==typeof o&&a.textContent!==""+o&&(e=["children",""+o]):c.hasOwnProperty(d)&&null!=o&&"onScroll"===d&&Pa("scroll",a));switch(n){case"input":X(a),ae(a,i,!0);break;case"textarea":X(a),le(a);break;case"select":case"option":break;default:"function"==typeof i.onClick&&(a.onclick=ja)}a=e,t.updateQueue=a,null!==a&&(t.flags|=4)}else{switch(d=9===o.nodeType?o:o.ownerDocument,e===ue.html&&(e=pe(n)),e===ue.html?"script"===n?((e=d.createElement("div")).innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):"string"==typeof a.is?e=d.createElement(n,{is:a.is}):(e=d.createElement(n),"select"===n&&(d=e,a.multiple?d.multiple=!0:a.size&&(d.size=a.size))):e=d.createElementNS(e,n),e[Ya]=t,e[Ka]=a,qs(e,t,!1,!1),t.stateNode=e,d=_e(n,a),n){case"dialog":Pa("cancel",e),Pa("close",e),o=a;break;case"iframe":case"object":case"embed":Pa("load",e),o=a;break;case"video":case"audio":for(o=0;o<Sa.length;o++)Pa(Sa[o],e);o=a;break;case"source":Pa("error",e),o=a;break;case"img":case"image":case"link":Pa("error",e),Pa("load",e),o=a;break;case"details":Pa("toggle",e),o=a;break;case"input":ee(e,a),o=J(e,a),Pa("invalid",e);break;case"option":o=oe(e,a);break;case"select":e._wrapperState={wasMultiple:!!a.multiple},o=r({},a,{value:void 0}),Pa("invalid",e);break;case"textarea":ce(e,a),o=ie(e,a),Pa("invalid",e);break;default:o=a}Ee(n,o);var l=o;for(i in l)if(l.hasOwnProperty(i)){var u=l[i];"style"===i?we(e,u):"dangerouslySetInnerHTML"===i?null!=(u=u?u.__html:void 0)&&he(e,u):"children"===i?"string"==typeof u?("textarea"!==n||""!==u)&&be(e,u):"number"==typeof u&&be(e,""+u):"suppressContentEditableWarning"!==i&&"suppressHydrationWarning"!==i&&"autoFocus"!==i&&(c.hasOwnProperty(i)?null!=u&&"onScroll"===i&&Pa("scroll",e):null!=u&&k(e,i,u,d))}switch(n){case"input":X(e),ae(e,a,!1);break;case"textarea":X(e),le(e);break;case"option":null!=a.value&&e.setAttribute("value",""+G(a.value));break;case"select":e.multiple=!!a.multiple,null!=(i=a.value)?se(e,!!a.multiple,i,!1):null!=a.defaultValue&&se(e,!!a.multiple,a.defaultValue,!0);break;default:"function"==typeof o.onClick&&(e.onclick=ja)}Ua(n,a)&&(t.flags|=4)}null!==t.ref&&(t.flags|=128)}return null;case 6:if(e&&null!=t.stateNode)Xs(e,t,e.memoizedProps,a);else{if("string"!=typeof a&&null===t.stateNode)throw Error(s(166));n=No(Oo.current),No(Po.current),Vo(t)?(a=t.stateNode,n=t.memoizedProps,a[Ya]=t,a.nodeValue!==n&&(t.flags|=4)):((a=(9===n.nodeType?n:n.ownerDocument).createTextNode(a))[Ya]=t,t.stateNode=a)}return null;case 13:return dr(Fo),a=t.memoizedState,0!=(64&t.flags)?(t.lanes=n,t):(a=null!==a,n=!1,null===e?void 0!==t.memoizedProps.fallback&&Vo(t):n=null!==e.memoizedState,a&&!n&&0!=(2&t.mode)&&(null===e&&!0!==t.memoizedProps.unstable_avoidThisFallback||0!=(1&Fo.current)?0===Bi&&(Bi=3):(0!==Bi&&3!==Bi||(Bi=4),null===Ii||0==(134217727&$i)&&0==(134217727&Ui)||vc(Ii,Di))),(a||n)&&(t.flags|=4),null);case 4:return Ao(),Gs(t),null===e&&Oa(t.stateNode.containerInfo),null;case 10:return no(t),null;case 19:if(dr(Fo),null===(a=t.memoizedState))return null;if(i=0!=(64&t.flags),null===(d=a.rendering))if(i)si(a,!1);else{if(0!==Bi||null!==e&&0!=(64&e.flags))for(e=t.child;null!==e;){if(null!==(d=Bo(e))){for(t.flags|=64,si(a,!1),null!==(i=d.updateQueue)&&(t.updateQueue=i,t.flags|=4),null===a.lastEffect&&(t.firstEffect=null),t.lastEffect=a.lastEffect,a=n,n=t.child;null!==n;)e=a,(i=n).flags&=2,i.nextEffect=null,i.firstEffect=null,i.lastEffect=null,null===(d=i.alternate)?(i.childLanes=0,i.lanes=e,i.child=null,i.memoizedProps=null,i.memoizedState=null,i.updateQueue=null,i.dependencies=null,i.stateNode=null):(i.childLanes=d.childLanes,i.lanes=d.lanes,i.child=d.child,i.memoizedProps=d.memoizedProps,i.memoizedState=d.memoizedState,i.updateQueue=d.updateQueue,i.type=d.type,e=d.dependencies,i.dependencies=null===e?null:{lanes:e.lanes,firstContext:e.firstContext}),n=n.sibling;return lr(Fo,1&Fo.current|2),t.child}e=e.sibling}null!==a.tail&&Ur()>Vi&&(t.flags|=64,i=!0,si(a,!1),t.lanes=33554432)}else{if(!i)if(null!==(e=Bo(d))){if(t.flags|=64,i=!0,null!==(n=e.updateQueue)&&(t.updateQueue=n,t.flags|=4),si(a,!0),null===a.tail&&"hidden"===a.tailMode&&!d.alternate&&!$o)return null!==(t=t.lastEffect=a.lastEffect)&&(t.nextEffect=null),null}else 2*Ur()-a.renderingStartTime>Vi&&1073741824!==n&&(t.flags|=64,i=!0,si(a,!1),t.lanes=33554432);a.isBackwards?(d.sibling=t.child,t.child=d):(null!==(n=a.last)?n.sibling=d:t.child=d,a.last=d)}return null!==a.tail?(n=a.tail,a.rendering=n,a.tail=n.sibling,a.lastEffect=t.lastEffect,a.renderingStartTime=Ur(),n.sibling=null,t=Fo.current,lr(Fo,i?1&t|2:1&t),n):null;case 23:case 24:return Ec(),null!==e&&null!==e.memoizedState!=(null!==t.memoizedState)&&"unstable-defer-without-hiding"!==a.mode&&(t.flags|=4),null}throw Error(s(156,t.tag))}function ci(e){switch(e.tag){case 1:hr(e.type)&&br();var t=e.flags;return 4096&t?(e.flags=-4097&t|64,e):null;case 3:if(Ao(),dr(fr),dr(pr),Wo(),0!=(64&(t=e.flags)))throw Error(s(285));return e.flags=-4097&t|64,e;case 5:return Mo(e),null;case 13:return dr(Fo),4096&(t=e.flags)?(e.flags=-4097&t|64,e):null;case 19:return dr(Fo),null;case 4:return Ao(),null;case 10:return no(e),null;case 23:case 24:return Ec(),null;default:return null}}function di(e,t){try{var n="",a=t;do{n+=V(a),a=a.return}while(a);var r=n}catch(o){r="\nError generating stack: "+o.message+"\n"+o.stack}return{value:e,source:t,stack:r}}function li(e,t){try{console.error(t.value)}catch(n){setTimeout((function(){throw n}))}}qs=function(e,t){for(var n=t.child;null!==n;){if(5===n.tag||6===n.tag)e.appendChild(n.stateNode);else if(4!==n.tag&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===t)break;for(;null===n.sibling;){if(null===n.return||n.return===t)return;n=n.return}n.sibling.return=n.return,n=n.sibling}},Gs=function(){},Ws=function(e,t,n,a){var o=e.memoizedProps;if(o!==a){e=t.stateNode,No(Po.current);var s,i=null;switch(n){case"input":o=J(e,o),a=J(e,a),i=[];break;case"option":o=oe(e,o),a=oe(e,a),i=[];break;case"select":o=r({},o,{value:void 0}),a=r({},a,{value:void 0}),i=[];break;case"textarea":o=ie(e,o),a=ie(e,a),i=[];break;default:"function"!=typeof o.onClick&&"function"==typeof a.onClick&&(e.onclick=ja)}for(u in Ee(n,a),n=null,o)if(!a.hasOwnProperty(u)&&o.hasOwnProperty(u)&&null!=o[u])if("style"===u){var d=o[u];for(s in d)d.hasOwnProperty(s)&&(n||(n={}),n[s]="")}else"dangerouslySetInnerHTML"!==u&&"children"!==u&&"suppressContentEditableWarning"!==u&&"suppressHydrationWarning"!==u&&"autoFocus"!==u&&(c.hasOwnProperty(u)?i||(i=[]):(i=i||[]).push(u,null));for(u in a){var l=a[u];if(d=null!=o?o[u]:void 0,a.hasOwnProperty(u)&&l!==d&&(null!=l||null!=d))if("style"===u)if(d){for(s in d)!d.hasOwnProperty(s)||l&&l.hasOwnProperty(s)||(n||(n={}),n[s]="");for(s in l)l.hasOwnProperty(s)&&d[s]!==l[s]&&(n||(n={}),n[s]=l[s])}else n||(i||(i=[]),i.push(u,n)),n=l;else"dangerouslySetInnerHTML"===u?(l=l?l.__html:void 0,d=d?d.__html:void 0,null!=l&&d!==l&&(i=i||[]).push(u,l)):"children"===u?"string"!=typeof l&&"number"!=typeof l||(i=i||[]).push(u,""+l):"suppressContentEditableWarning"!==u&&"suppressHydrationWarning"!==u&&(c.hasOwnProperty(u)?(null!=l&&"onScroll"===u&&Pa("scroll",e),i||d===l||(i=[])):"object"==typeof l&&null!==l&&l.$$typeof===D?l.toString():(i=i||[]).push(u,l))}n&&(i=i||[]).push("style",n);var u=i;(t.updateQueue=u)&&(t.flags|=4)}},Xs=function(e,t,n,a){n!==a&&(t.flags|=4)};var ui="function"==typeof WeakMap?WeakMap:Map;function pi(e,t,n){(n=lo(-1,n)).tag=3,n.payload={element:null};var a=t.value;return n.callback=function(){Xi||(Xi=!0,Yi=a),li(0,t)},n}function fi(e,t,n){(n=lo(-1,n)).tag=3;var a=e.type.getDerivedStateFromError;if("function"==typeof a){var r=t.value;n.payload=function(){return li(0,t),a(r)}}var o=e.stateNode;return null!==o&&"function"==typeof o.componentDidCatch&&(n.callback=function(){"function"!=typeof a&&(null===Ki?Ki=new Set([this]):Ki.add(this),li(0,t));var e=t.stack;this.componentDidCatch(t.value,{componentStack:null!==e?e:""})}),n}var mi="function"==typeof WeakSet?WeakSet:Set;function gi(e){var t=e.ref;if(null!==t)if("function"==typeof t)try{t(null)}catch(n){zc(e,n)}else t.current=null}function hi(e,t){switch(t.tag){case 0:case 11:case 15:case 22:case 5:case 6:case 4:case 17:return;case 1:if(256&t.flags&&null!==e){var n=e.memoizedProps,a=e.memoizedState;t=(e=t.stateNode).getSnapshotBeforeUpdate(t.elementType===t.type?n:Xr(t.type,n),a),e.__reactInternalSnapshotBeforeUpdate=t}return;case 3:return void(256&t.flags&&Va(t.stateNode.containerInfo))}throw Error(s(163))}function bi(e,t,n){switch(n.tag){case 0:case 11:case 15:case 22:if(null!==(t=null!==(t=n.updateQueue)?t.lastEffect:null)){e=t=t.next;do{if(3==(3&e.tag)){var a=e.create;e.destroy=a()}e=e.next}while(e!==t)}if(null!==(t=null!==(t=n.updateQueue)?t.lastEffect:null)){e=t=t.next;do{var r=e;a=r.next,0!=(4&(r=r.tag))&&0!=(1&r)&&(Fc(n,e),Mc(n,e)),e=a}while(e!==t)}return;case 1:return e=n.stateNode,4&n.flags&&(null===t?e.componentDidMount():(a=n.elementType===n.type?t.memoizedProps:Xr(n.type,t.memoizedProps),e.componentDidUpdate(a,t.memoizedState,e.__reactInternalSnapshotBeforeUpdate))),void(null!==(t=n.updateQueue)&&mo(n,t,e));case 3:if(null!==(t=n.updateQueue)){if(e=null,null!==n.child)switch(n.child.tag){case 5:case 1:e=n.child.stateNode}mo(n,t,e)}return;case 5:return e=n.stateNode,void(null===t&&4&n.flags&&Ua(n.type,n.memoizedProps)&&e.focus());case 6:case 4:case 12:case 19:case 17:case 20:case 21:case 23:case 24:return;case 13:return void(null===n.memoizedState&&(n=n.alternate,null!==n&&(n=n.memoizedState,null!==n&&(n=n.dehydrated,null!==n&&wt(n)))))}throw Error(s(163))}function vi(e,t){for(var n=e;;){if(5===n.tag){var a=n.stateNode;if(t)"function"==typeof(a=a.style).setProperty?a.setProperty("display","none","important"):a.display="none";else{a=n.stateNode;var r=n.memoizedProps.style;r=null!=r&&r.hasOwnProperty("display")?r.display:null,a.style.display=ke("display",r)}}else if(6===n.tag)n.stateNode.nodeValue=t?"":n.memoizedProps;else if((23!==n.tag&&24!==n.tag||null===n.memoizedState||n===e)&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===e)break;for(;null===n.sibling;){if(null===n.return||n.return===e)return;n=n.return}n.sibling.return=n.return,n=n.sibling}}function yi(e,t){if(Er&&"function"==typeof Er.onCommitFiberUnmount)try{Er.onCommitFiberUnmount(xr,t)}catch(o){}switch(t.tag){case 0:case 11:case 14:case 15:case 22:if(null!==(e=t.updateQueue)&&null!==(e=e.lastEffect)){var n=e=e.next;do{var a=n,r=a.destroy;if(a=a.tag,void 0!==r)if(0!=(4&a))Fc(t,n);else{a=t;try{r()}catch(o){zc(a,o)}}n=n.next}while(n!==e)}break;case 1:if(gi(t),"function"==typeof(e=t.stateNode).componentWillUnmount)try{e.props=t.memoizedProps,e.state=t.memoizedState,e.componentWillUnmount()}catch(o){zc(t,o)}break;case 5:gi(t);break;case 4:Si(e,t)}}function ki(e){e.alternate=null,e.child=null,e.dependencies=null,e.firstEffect=null,e.lastEffect=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.return=null,e.updateQueue=null}function wi(e){return 5===e.tag||3===e.tag||4===e.tag}function xi(e){e:{for(var t=e.return;null!==t;){if(wi(t))break e;t=t.return}throw Error(s(160))}var n=t;switch(t=n.stateNode,n.tag){case 5:var a=!1;break;case 3:case 4:t=t.containerInfo,a=!0;break;default:throw Error(s(161))}16&n.flags&&(be(t,""),n.flags&=-17);e:t:for(n=e;;){for(;null===n.sibling;){if(null===n.return||wi(n.return)){n=null;break e}n=n.return}for(n.sibling.return=n.return,n=n.sibling;5!==n.tag&&6!==n.tag&&18!==n.tag;){if(2&n.flags)continue t;if(null===n.child||4===n.tag)continue t;n.child.return=n,n=n.child}if(!(2&n.flags)){n=n.stateNode;break e}}a?Ei(e,n,t):_i(e,n,t)}function Ei(e,t,n){var a=e.tag,r=5===a||6===a;if(r)e=r?e.stateNode:e.stateNode.instance,t?8===n.nodeType?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(8===n.nodeType?(t=n.parentNode).insertBefore(e,n):(t=n).appendChild(e),null!=(n=n._reactRootContainer)||null!==t.onclick||(t.onclick=ja));else if(4!==a&&null!==(e=e.child))for(Ei(e,t,n),e=e.sibling;null!==e;)Ei(e,t,n),e=e.sibling}function _i(e,t,n){var a=e.tag,r=5===a||6===a;if(r)e=r?e.stateNode:e.stateNode.instance,t?n.insertBefore(e,t):n.appendChild(e);else if(4!==a&&null!==(e=e.child))for(_i(e,t,n),e=e.sibling;null!==e;)_i(e,t,n),e=e.sibling}function Si(e,t){for(var n,a,r=t,o=!1;;){if(!o){o=r.return;e:for(;;){if(null===o)throw Error(s(160));switch(n=o.stateNode,o.tag){case 5:a=!1;break e;case 3:case 4:n=n.containerInfo,a=!0;break e}o=o.return}o=!0}if(5===r.tag||6===r.tag){e:for(var i=e,c=r,d=c;;)if(yi(i,d),null!==d.child&&4!==d.tag)d.child.return=d,d=d.child;else{if(d===c)break e;for(;null===d.sibling;){if(null===d.return||d.return===c)break e;d=d.return}d.sibling.return=d.return,d=d.sibling}a?(i=n,c=r.stateNode,8===i.nodeType?i.parentNode.removeChild(c):i.removeChild(c)):n.removeChild(r.stateNode)}else if(4===r.tag){if(null!==r.child){n=r.stateNode.containerInfo,a=!0,r.child.return=r,r=r.child;continue}}else if(yi(e,r),null!==r.child){r.child.return=r,r=r.child;continue}if(r===t)break;for(;null===r.sibling;){if(null===r.return||r.return===t)return;4===(r=r.return).tag&&(o=!1)}r.sibling.return=r.return,r=r.sibling}}function Ci(e,t){switch(t.tag){case 0:case 11:case 14:case 15:case 22:var n=t.updateQueue;if(null!==(n=null!==n?n.lastEffect:null)){var a=n=n.next;do{3==(3&a.tag)&&(e=a.destroy,a.destroy=void 0,void 0!==e&&e()),a=a.next}while(a!==n)}return;case 1:case 12:case 17:return;case 5:if(null!=(n=t.stateNode)){a=t.memoizedProps;var r=null!==e?e.memoizedProps:a;e=t.type;var o=t.updateQueue;if(t.updateQueue=null,null!==o){for(n[Ka]=a,"input"===e&&"radio"===a.type&&null!=a.name&&te(n,a),_e(e,r),t=_e(e,a),r=0;r<o.length;r+=2){var i=o[r],c=o[r+1];"style"===i?we(n,c):"dangerouslySetInnerHTML"===i?he(n,c):"children"===i?be(n,c):k(n,i,c,t)}switch(e){case"input":ne(n,a);break;case"textarea":de(n,a);break;case"select":e=n._wrapperState.wasMultiple,n._wrapperState.wasMultiple=!!a.multiple,null!=(o=a.value)?se(n,!!a.multiple,o,!1):e!==!!a.multiple&&(null!=a.defaultValue?se(n,!!a.multiple,a.defaultValue,!0):se(n,!!a.multiple,a.multiple?[]:"",!1))}}}return;case 6:if(null===t.stateNode)throw Error(s(162));return void(t.stateNode.nodeValue=t.memoizedProps);case 3:return void((n=t.stateNode).hydrate&&(n.hydrate=!1,wt(n.containerInfo)));case 13:return null!==t.memoizedState&&(Qi=Ur(),vi(t.child,!0)),void Ti(t);case 19:return void Ti(t);case 23:case 24:return void vi(t,null!==t.memoizedState)}throw Error(s(163))}function Ti(e){var t=e.updateQueue;if(null!==t){e.updateQueue=null;var n=e.stateNode;null===n&&(n=e.stateNode=new mi),t.forEach((function(t){var a=Uc.bind(null,e,t);n.has(t)||(n.add(t),t.then(a,a))}))}}function Li(e,t){return null!==e&&(null===(e=e.memoizedState)||null!==e.dehydrated)&&(null!==(t=t.memoizedState)&&null===t.dehydrated)}var Pi=Math.ceil,Ri=w.ReactCurrentDispatcher,Oi=w.ReactCurrentOwner,Ni=0,Ii=null,Ai=null,Di=0,Mi=0,Fi=cr(0),Bi=0,ji=null,zi=0,$i=0,Ui=0,Hi=0,Zi=null,Qi=0,Vi=1/0;function qi(){Vi=Ur()+500}var Gi,Wi=null,Xi=!1,Yi=null,Ki=null,Ji=!1,ec=null,tc=90,nc=[],ac=[],rc=null,oc=0,sc=null,ic=-1,cc=0,dc=0,lc=null,uc=!1;function pc(){return 0!=(48&Ni)?Ur():-1!==ic?ic:ic=Ur()}function fc(e){if(0==(2&(e=e.mode)))return 1;if(0==(4&e))return 99===Hr()?1:2;if(0===cc&&(cc=zi),0!==Wr.transition){0!==dc&&(dc=null!==Zi?Zi.pendingLanes:0),e=cc;var t=4186112&~dc;return 0===(t&=-t)&&(0===(t=(e=4186112&~e)&-e)&&(t=8192)),t}return e=Hr(),0!=(4&Ni)&&98===e?e=jt(12,cc):e=jt(e=function(e){switch(e){case 99:return 15;case 98:return 10;case 97:case 96:return 8;case 95:return 2;default:return 0}}(e),cc),e}function mc(e,t,n){if(50<oc)throw oc=0,sc=null,Error(s(185));if(null===(e=gc(e,t)))return null;Ut(e,t,n),e===Ii&&(Ui|=t,4===Bi&&vc(e,Di));var a=Hr();1===t?0!=(8&Ni)&&0==(48&Ni)?yc(e):(hc(e,n),0===Ni&&(qi(),qr())):(0==(4&Ni)||98!==a&&99!==a||(null===rc?rc=new Set([e]):rc.add(e)),hc(e,n)),Zi=e}function gc(e,t){e.lanes|=t;var n=e.alternate;for(null!==n&&(n.lanes|=t),n=e,e=e.return;null!==e;)e.childLanes|=t,null!==(n=e.alternate)&&(n.childLanes|=t),n=e,e=e.return;return 3===n.tag?n.stateNode:null}function hc(e,t){for(var n=e.callbackNode,a=e.suspendedLanes,r=e.pingedLanes,o=e.expirationTimes,i=e.pendingLanes;0<i;){var c=31-Ht(i),d=1<<c,l=o[c];if(-1===l){if(0==(d&a)||0!=(d&r)){l=t,Mt(d);var u=Dt;o[c]=10<=u?l+250:6<=u?l+5e3:-1}}else l<=t&&(e.expiredLanes|=d);i&=~d}if(a=Ft(e,e===Ii?Di:0),t=Dt,0===a)null!==n&&(n!==Mr&&Cr(n),e.callbackNode=null,e.callbackPriority=0);else{if(null!==n){if(e.callbackPriority===t)return;n!==Mr&&Cr(n)}15===t?(n=yc.bind(null,e),null===Br?(Br=[n],jr=Sr(Or,Gr)):Br.push(n),n=Mr):14===t?n=Vr(99,yc.bind(null,e)):(n=function(e){switch(e){case 15:case 14:return 99;case 13:case 12:case 11:case 10:return 98;case 9:case 8:case 7:case 6:case 4:case 5:return 97;case 3:case 2:case 1:return 95;case 0:return 90;default:throw Error(s(358,e))}}(t),n=Vr(n,bc.bind(null,e))),e.callbackPriority=t,e.callbackNode=n}}function bc(e){if(ic=-1,dc=cc=0,0!=(48&Ni))throw Error(s(327));var t=e.callbackNode;if(Dc()&&e.callbackNode!==t)return null;var n=Ft(e,e===Ii?Di:0);if(0===n)return null;var a=n,r=Ni;Ni|=16;var o=Cc();for(Ii===e&&Di===a||(qi(),_c(e,a));;)try{Pc();break}catch(c){Sc(e,c)}if(to(),Ri.current=o,Ni=r,null!==Ai?a=0:(Ii=null,Di=0,a=Bi),0!=(zi&Ui))_c(e,0);else if(0!==a){if(2===a&&(Ni|=64,e.hydrate&&(e.hydrate=!1,Va(e.containerInfo)),0!==(n=Bt(e))&&(a=Tc(e,n))),1===a)throw t=ji,_c(e,0),vc(e,n),hc(e,Ur()),t;switch(e.finishedWork=e.current.alternate,e.finishedLanes=n,a){case 0:case 1:throw Error(s(345));case 2:case 5:Nc(e);break;case 3:if(vc(e,n),(62914560&n)===n&&10<(a=Qi+500-Ur())){if(0!==Ft(e,0))break;if(((r=e.suspendedLanes)&n)!==n){pc(),e.pingedLanes|=e.suspendedLanes&r;break}e.timeoutHandle=Za(Nc.bind(null,e),a);break}Nc(e);break;case 4:if(vc(e,n),(4186112&n)===n)break;for(a=e.eventTimes,r=-1;0<n;){var i=31-Ht(n);o=1<<i,(i=a[i])>r&&(r=i),n&=~o}if(n=r,10<(n=(120>(n=Ur()-n)?120:480>n?480:1080>n?1080:1920>n?1920:3e3>n?3e3:4320>n?4320:1960*Pi(n/1960))-n)){e.timeoutHandle=Za(Nc.bind(null,e),n);break}Nc(e);break;default:throw Error(s(329))}}return hc(e,Ur()),e.callbackNode===t?bc.bind(null,e):null}function vc(e,t){for(t&=~Hi,t&=~Ui,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var n=31-Ht(t),a=1<<n;e[n]=-1,t&=~a}}function yc(e){if(0!=(48&Ni))throw Error(s(327));if(Dc(),e===Ii&&0!=(e.expiredLanes&Di)){var t=Di,n=Tc(e,t);0!=(zi&Ui)&&(n=Tc(e,t=Ft(e,t)))}else n=Tc(e,t=Ft(e,0));if(0!==e.tag&&2===n&&(Ni|=64,e.hydrate&&(e.hydrate=!1,Va(e.containerInfo)),0!==(t=Bt(e))&&(n=Tc(e,t))),1===n)throw n=ji,_c(e,0),vc(e,t),hc(e,Ur()),n;return e.finishedWork=e.current.alternate,e.finishedLanes=t,Nc(e),hc(e,Ur()),null}function kc(e,t){var n=Ni;Ni|=1;try{return e(t)}finally{0===(Ni=n)&&(qi(),qr())}}function wc(e,t){var n=Ni;Ni&=-2,Ni|=8;try{return e(t)}finally{0===(Ni=n)&&(qi(),qr())}}function xc(e,t){lr(Fi,Mi),Mi|=t,zi|=t}function Ec(){Mi=Fi.current,dr(Fi)}function _c(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHandle;if(-1!==n&&(e.timeoutHandle=-1,Qa(n)),null!==Ai)for(n=Ai.return;null!==n;){var a=n;switch(a.tag){case 1:null!=(a=a.type.childContextTypes)&&br();break;case 3:Ao(),dr(fr),dr(pr),Wo();break;case 5:Mo(a);break;case 4:Ao();break;case 13:case 19:dr(Fo);break;case 10:no(a);break;case 23:case 24:Ec()}n=n.return}Ii=e,Ai=Vc(e.current,null),Di=Mi=zi=t,Bi=0,ji=null,Hi=Ui=$i=0}function Sc(e,t){for(;;){var n=Ai;try{if(to(),Xo.current=Os,ns){for(var a=Jo.memoizedState;null!==a;){var r=a.queue;null!==r&&(r.pending=null),a=a.next}ns=!1}if(Ko=0,ts=es=Jo=null,as=!1,Oi.current=null,null===n||null===n.return){Bi=1,ji=t,Ai=null;break}e:{var o=e,s=n.return,i=n,c=t;if(t=Di,i.flags|=2048,i.firstEffect=i.lastEffect=null,null!==c&&"object"==typeof c&&"function"==typeof c.then){var d=c;if(0==(2&i.mode)){var l=i.alternate;l?(i.updateQueue=l.updateQueue,i.memoizedState=l.memoizedState,i.lanes=l.lanes):(i.updateQueue=null,i.memoizedState=null)}var u=0!=(1&Fo.current),p=s;do{var f;if(f=13===p.tag){var m=p.memoizedState;if(null!==m)f=null!==m.dehydrated;else{var g=p.memoizedProps;f=void 0!==g.fallback&&(!0!==g.unstable_avoidThisFallback||!u)}}if(f){var h=p.updateQueue;if(null===h){var b=new Set;b.add(d),p.updateQueue=b}else h.add(d);if(0==(2&p.mode)){if(p.flags|=64,i.flags|=16384,i.flags&=-2981,1===i.tag)if(null===i.alternate)i.tag=17;else{var v=lo(-1,1);v.tag=2,uo(i,v)}i.lanes|=1;break e}c=void 0,i=t;var y=o.pingCache;if(null===y?(y=o.pingCache=new ui,c=new Set,y.set(d,c)):void 0===(c=y.get(d))&&(c=new Set,y.set(d,c)),!c.has(i)){c.add(i);var k=$c.bind(null,o,d,i);d.then(k,k)}p.flags|=4096,p.lanes=t;break e}p=p.return}while(null!==p);c=Error((q(i.type)||"A React component")+" suspended while rendering, but no fallback UI was specified.\n\nAdd a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display.")}5!==Bi&&(Bi=2),c=di(c,i),p=s;do{switch(p.tag){case 3:o=c,p.flags|=4096,t&=-t,p.lanes|=t,po(p,pi(0,o,t));break e;case 1:o=c;var w=p.type,x=p.stateNode;if(0==(64&p.flags)&&("function"==typeof w.getDerivedStateFromError||null!==x&&"function"==typeof x.componentDidCatch&&(null===Ki||!Ki.has(x)))){p.flags|=4096,t&=-t,p.lanes|=t,po(p,fi(p,o,t));break e}}p=p.return}while(null!==p)}Oc(n)}catch(E){t=E,Ai===n&&null!==n&&(Ai=n=n.return);continue}break}}function Cc(){var e=Ri.current;return Ri.current=Os,null===e?Os:e}function Tc(e,t){var n=Ni;Ni|=16;var a=Cc();for(Ii===e&&Di===t||_c(e,t);;)try{Lc();break}catch(r){Sc(e,r)}if(to(),Ni=n,Ri.current=a,null!==Ai)throw Error(s(261));return Ii=null,Di=0,Bi}function Lc(){for(;null!==Ai;)Rc(Ai)}function Pc(){for(;null!==Ai&&!Tr();)Rc(Ai)}function Rc(e){var t=Gi(e.alternate,e,Mi);e.memoizedProps=e.pendingProps,null===t?Oc(e):Ai=t,Oi.current=null}function Oc(e){var t=e;do{var n=t.alternate;if(e=t.return,0==(2048&t.flags)){if(null!==(n=ii(n,t,Mi)))return void(Ai=n);if(24!==(n=t).tag&&23!==n.tag||null===n.memoizedState||0!=(1073741824&Mi)||0==(4&n.mode)){for(var a=0,r=n.child;null!==r;)a|=r.lanes|r.childLanes,r=r.sibling;n.childLanes=a}null!==e&&0==(2048&e.flags)&&(null===e.firstEffect&&(e.firstEffect=t.firstEffect),null!==t.lastEffect&&(null!==e.lastEffect&&(e.lastEffect.nextEffect=t.firstEffect),e.lastEffect=t.lastEffect),1<t.flags&&(null!==e.lastEffect?e.lastEffect.nextEffect=t:e.firstEffect=t,e.lastEffect=t))}else{if(null!==(n=ci(t)))return n.flags&=2047,void(Ai=n);null!==e&&(e.firstEffect=e.lastEffect=null,e.flags|=2048)}if(null!==(t=t.sibling))return void(Ai=t);Ai=t=e}while(null!==t);0===Bi&&(Bi=5)}function Nc(e){var t=Hr();return Qr(99,Ic.bind(null,e,t)),null}function Ic(e,t){do{Dc()}while(null!==ec);if(0!=(48&Ni))throw Error(s(327));var n=e.finishedWork;if(null===n)return null;if(e.finishedWork=null,e.finishedLanes=0,n===e.current)throw Error(s(177));e.callbackNode=null;var a=n.lanes|n.childLanes,r=a,o=e.pendingLanes&~r;e.pendingLanes=r,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=r,e.mutableReadLanes&=r,e.entangledLanes&=r,r=e.entanglements;for(var i=e.eventTimes,c=e.expirationTimes;0<o;){var d=31-Ht(o),l=1<<d;r[d]=0,i[d]=-1,c[d]=-1,o&=~l}if(null!==rc&&0==(24&a)&&rc.has(e)&&rc.delete(e),e===Ii&&(Ai=Ii=null,Di=0),1<n.flags?null!==n.lastEffect?(n.lastEffect.nextEffect=n,a=n.firstEffect):a=n:a=n.firstEffect,null!==a){if(r=Ni,Ni|=32,Oi.current=null,za=Gt,ha(i=ga())){if("selectionStart"in i)c={start:i.selectionStart,end:i.selectionEnd};else e:if(c=(c=i.ownerDocument)&&c.defaultView||window,(l=c.getSelection&&c.getSelection())&&0!==l.rangeCount){c=l.anchorNode,o=l.anchorOffset,d=l.focusNode,l=l.focusOffset;try{c.nodeType,d.nodeType}catch(C){c=null;break e}var u=0,p=-1,f=-1,m=0,g=0,h=i,b=null;t:for(;;){for(var v;h!==c||0!==o&&3!==h.nodeType||(p=u+o),h!==d||0!==l&&3!==h.nodeType||(f=u+l),3===h.nodeType&&(u+=h.nodeValue.length),null!==(v=h.firstChild);)b=h,h=v;for(;;){if(h===i)break t;if(b===c&&++m===o&&(p=u),b===d&&++g===l&&(f=u),null!==(v=h.nextSibling))break;b=(h=b).parentNode}h=v}c=-1===p||-1===f?null:{start:p,end:f}}else c=null;c=c||{start:0,end:0}}else c=null;$a={focusedElem:i,selectionRange:c},Gt=!1,lc=null,uc=!1,Wi=a;do{try{Ac()}catch(C){if(null===Wi)throw Error(s(330));zc(Wi,C),Wi=Wi.nextEffect}}while(null!==Wi);lc=null,Wi=a;do{try{for(i=e;null!==Wi;){var y=Wi.flags;if(16&y&&be(Wi.stateNode,""),128&y){var k=Wi.alternate;if(null!==k){var w=k.ref;null!==w&&("function"==typeof w?w(null):w.current=null)}}switch(1038&y){case 2:xi(Wi),Wi.flags&=-3;break;case 6:xi(Wi),Wi.flags&=-3,Ci(Wi.alternate,Wi);break;case 1024:Wi.flags&=-1025;break;case 1028:Wi.flags&=-1025,Ci(Wi.alternate,Wi);break;case 4:Ci(Wi.alternate,Wi);break;case 8:Si(i,c=Wi);var x=c.alternate;ki(c),null!==x&&ki(x)}Wi=Wi.nextEffect}}catch(C){if(null===Wi)throw Error(s(330));zc(Wi,C),Wi=Wi.nextEffect}}while(null!==Wi);if(w=$a,k=ga(),y=w.focusedElem,i=w.selectionRange,k!==y&&y&&y.ownerDocument&&ma(y.ownerDocument.documentElement,y)){null!==i&&ha(y)&&(k=i.start,void 0===(w=i.end)&&(w=k),"selectionStart"in y?(y.selectionStart=k,y.selectionEnd=Math.min(w,y.value.length)):(w=(k=y.ownerDocument||document)&&k.defaultView||window).getSelection&&(w=w.getSelection(),c=y.textContent.length,x=Math.min(i.start,c),i=void 0===i.end?x:Math.min(i.end,c),!w.extend&&x>i&&(c=i,i=x,x=c),c=fa(y,x),o=fa(y,i),c&&o&&(1!==w.rangeCount||w.anchorNode!==c.node||w.anchorOffset!==c.offset||w.focusNode!==o.node||w.focusOffset!==o.offset)&&((k=k.createRange()).setStart(c.node,c.offset),w.removeAllRanges(),x>i?(w.addRange(k),w.extend(o.node,o.offset)):(k.setEnd(o.node,o.offset),w.addRange(k))))),k=[];for(w=y;w=w.parentNode;)1===w.nodeType&&k.push({element:w,left:w.scrollLeft,top:w.scrollTop});for("function"==typeof y.focus&&y.focus(),y=0;y<k.length;y++)(w=k[y]).element.scrollLeft=w.left,w.element.scrollTop=w.top}Gt=!!za,$a=za=null,e.current=n,Wi=a;do{try{for(y=e;null!==Wi;){var E=Wi.flags;if(36&E&&bi(y,Wi.alternate,Wi),128&E){k=void 0;var _=Wi.ref;if(null!==_){var S=Wi.stateNode;Wi.tag,k=S,"function"==typeof _?_(k):_.current=k}}Wi=Wi.nextEffect}}catch(C){if(null===Wi)throw Error(s(330));zc(Wi,C),Wi=Wi.nextEffect}}while(null!==Wi);Wi=null,Fr(),Ni=r}else e.current=n;if(Ji)Ji=!1,ec=e,tc=t;else for(Wi=a;null!==Wi;)t=Wi.nextEffect,Wi.nextEffect=null,8&Wi.flags&&((E=Wi).sibling=null,E.stateNode=null),Wi=t;if(0===(a=e.pendingLanes)&&(Ki=null),1===a?e===sc?oc++:(oc=0,sc=e):oc=0,n=n.stateNode,Er&&"function"==typeof Er.onCommitFiberRoot)try{Er.onCommitFiberRoot(xr,n,void 0,64==(64&n.current.flags))}catch(C){}if(hc(e,Ur()),Xi)throw Xi=!1,e=Yi,Yi=null,e;return 0!=(8&Ni)||qr(),null}function Ac(){for(;null!==Wi;){var e=Wi.alternate;uc||null===lc||(0!=(8&Wi.flags)?Je(Wi,lc)&&(uc=!0):13===Wi.tag&&Li(e,Wi)&&Je(Wi,lc)&&(uc=!0));var t=Wi.flags;0!=(256&t)&&hi(e,Wi),0==(512&t)||Ji||(Ji=!0,Vr(97,(function(){return Dc(),null}))),Wi=Wi.nextEffect}}function Dc(){if(90!==tc){var e=97<tc?97:tc;return tc=90,Qr(e,Bc)}return!1}function Mc(e,t){nc.push(t,e),Ji||(Ji=!0,Vr(97,(function(){return Dc(),null})))}function Fc(e,t){ac.push(t,e),Ji||(Ji=!0,Vr(97,(function(){return Dc(),null})))}function Bc(){if(null===ec)return!1;var e=ec;if(ec=null,0!=(48&Ni))throw Error(s(331));var t=Ni;Ni|=32;var n=ac;ac=[];for(var a=0;a<n.length;a+=2){var r=n[a],o=n[a+1],i=r.destroy;if(r.destroy=void 0,"function"==typeof i)try{i()}catch(d){if(null===o)throw Error(s(330));zc(o,d)}}for(n=nc,nc=[],a=0;a<n.length;a+=2){r=n[a],o=n[a+1];try{var c=r.create;r.destroy=c()}catch(d){if(null===o)throw Error(s(330));zc(o,d)}}for(c=e.current.firstEffect;null!==c;)e=c.nextEffect,c.nextEffect=null,8&c.flags&&(c.sibling=null,c.stateNode=null),c=e;return Ni=t,qr(),!0}function jc(e,t,n){uo(e,t=pi(0,t=di(n,t),1)),t=pc(),null!==(e=gc(e,1))&&(Ut(e,1,t),hc(e,t))}function zc(e,t){if(3===e.tag)jc(e,e,t);else for(var n=e.return;null!==n;){if(3===n.tag){jc(n,e,t);break}if(1===n.tag){var a=n.stateNode;if("function"==typeof n.type.getDerivedStateFromError||"function"==typeof a.componentDidCatch&&(null===Ki||!Ki.has(a))){var r=fi(n,e=di(t,e),1);if(uo(n,r),r=pc(),null!==(n=gc(n,1)))Ut(n,1,r),hc(n,r);else if("function"==typeof a.componentDidCatch&&(null===Ki||!Ki.has(a)))try{a.componentDidCatch(t,e)}catch(o){}break}}n=n.return}}function $c(e,t,n){var a=e.pingCache;null!==a&&a.delete(t),t=pc(),e.pingedLanes|=e.suspendedLanes&n,Ii===e&&(Di&n)===n&&(4===Bi||3===Bi&&(62914560&Di)===Di&&500>Ur()-Qi?_c(e,0):Hi|=n),hc(e,t)}function Uc(e,t){var n=e.stateNode;null!==n&&n.delete(t),0===(t=0)&&(0==(2&(t=e.mode))?t=1:0==(4&t)?t=99===Hr()?1:2:(0===cc&&(cc=zi),0===(t=zt(62914560&~cc))&&(t=4194304))),n=pc(),null!==(e=gc(e,t))&&(Ut(e,t,n),hc(e,n))}function Hc(e,t,n,a){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=a,this.flags=0,this.lastEffect=this.firstEffect=this.nextEffect=null,this.childLanes=this.lanes=0,this.alternate=null}function Zc(e,t,n,a){return new Hc(e,t,n,a)}function Qc(e){return!(!(e=e.prototype)||!e.isReactComponent)}function Vc(e,t){var n=e.alternate;return null===n?((n=Zc(e.tag,t,e.key,e.mode)).elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.nextEffect=null,n.firstEffect=null,n.lastEffect=null),n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=null===t?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function qc(e,t,n,a,r,o){var i=2;if(a=e,"function"==typeof e)Qc(e)&&(i=1);else if("string"==typeof e)i=5;else e:switch(e){case _:return Gc(n.children,r,o,t);case M:i=8,r|=16;break;case S:i=8,r|=1;break;case C:return(e=Zc(12,n,t,8|r)).elementType=C,e.type=C,e.lanes=o,e;case R:return(e=Zc(13,n,t,r)).type=R,e.elementType=R,e.lanes=o,e;case O:return(e=Zc(19,n,t,r)).elementType=O,e.lanes=o,e;case F:return Wc(n,r,o,t);case B:return(e=Zc(24,n,t,r)).elementType=B,e.lanes=o,e;default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case T:i=10;break e;case L:i=9;break e;case P:i=11;break e;case N:i=14;break e;case I:i=16,a=null;break e;case A:i=22;break e}throw Error(s(130,null==e?e:typeof e,""))}return(t=Zc(i,n,t,r)).elementType=e,t.type=a,t.lanes=o,t}function Gc(e,t,n,a){return(e=Zc(7,e,a,t)).lanes=n,e}function Wc(e,t,n,a){return(e=Zc(23,e,a,t)).elementType=F,e.lanes=n,e}function Xc(e,t,n){return(e=Zc(6,e,null,t)).lanes=n,e}function Yc(e,t,n){return(t=Zc(4,null!==e.children?e.children:[],e.key,t)).lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Kc(e,t,n){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.pendingContext=this.context=null,this.hydrate=n,this.callbackNode=null,this.callbackPriority=0,this.eventTimes=$t(0),this.expirationTimes=$t(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=$t(0),this.mutableSourceEagerHydrationData=null}function Jc(e,t,n,a){var r=t.current,o=pc(),i=fc(r);e:if(n){t:{if(We(n=n._reactInternals)!==n||1!==n.tag)throw Error(s(170));var c=n;do{switch(c.tag){case 3:c=c.stateNode.context;break t;case 1:if(hr(c.type)){c=c.stateNode.__reactInternalMemoizedMergedChildContext;break t}}c=c.return}while(null!==c);throw Error(s(171))}if(1===n.tag){var d=n.type;if(hr(d)){n=yr(n,d,c);break e}}n=c}else n=ur;return null===t.context?t.context=n:t.pendingContext=n,(t=lo(o,i)).payload={element:e},null!==(a=void 0===a?null:a)&&(t.callback=a),uo(r,t),mc(r,i,o),i}function ed(e){return(e=e.current).child?(e.child.tag,e.child.stateNode):null}function td(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var n=e.retryLane;e.retryLane=0!==n&&n<t?n:t}}function nd(e,t){td(e,t),(e=e.alternate)&&td(e,t)}function ad(e,t,n){var a=null!=n&&null!=n.hydrationOptions&&n.hydrationOptions.mutableSources||null;if(n=new Kc(e,t,null!=n&&!0===n.hydrate),t=Zc(3,null,null,2===t?7:1===t?3:0),n.current=t,t.stateNode=n,io(t),e[Ja]=n.current,Oa(8===e.nodeType?e.parentNode:e),a)for(e=0;e<a.length;e++){var r=(t=a[e])._getVersion;r=r(t._source),null==n.mutableSourceEagerHydrationData?n.mutableSourceEagerHydrationData=[t,r]:n.mutableSourceEagerHydrationData.push(t,r)}this._internalRoot=n}function rd(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType&&(8!==e.nodeType||" react-mount-point-unstable "!==e.nodeValue))}function od(e,t,n,a,r){var o=n._reactRootContainer;if(o){var s=o._internalRoot;if("function"==typeof r){var i=r;r=function(){var e=ed(s);i.call(e)}}Jc(t,s,e,r)}else{if(o=n._reactRootContainer=function(e,t){if(t||(t=!(!(t=e?9===e.nodeType?e.documentElement:e.firstChild:null)||1!==t.nodeType||!t.hasAttribute("data-reactroot"))),!t)for(var n;n=e.lastChild;)e.removeChild(n);return new ad(e,0,t?{hydrate:!0}:void 0)}(n,a),s=o._internalRoot,"function"==typeof r){var c=r;r=function(){var e=ed(s);c.call(e)}}wc((function(){Jc(t,s,e,r)}))}return ed(s)}function sd(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!rd(t))throw Error(s(200));return function(e,t,n){var a=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:E,key:null==a?null:""+a,children:e,containerInfo:t,implementation:n}}(e,t,null,n)}Gi=function(e,t,n){var a=t.lanes;if(null!==e)if(e.memoizedProps!==t.pendingProps||fr.current)Ms=!0;else{if(0==(n&a)){switch(Ms=!1,t.tag){case 3:Vs(t),qo();break;case 5:Do(t);break;case 1:hr(t.type)&&kr(t);break;case 4:Io(t,t.stateNode.containerInfo);break;case 10:a=t.memoizedProps.value;var r=t.type._context;lr(Yr,r._currentValue),r._currentValue=a;break;case 13:if(null!==t.memoizedState)return 0!=(n&t.child.childLanes)?Ks(e,t,n):(lr(Fo,1&Fo.current),null!==(t=oi(e,t,n))?t.sibling:null);lr(Fo,1&Fo.current);break;case 19:if(a=0!=(n&t.childLanes),0!=(64&e.flags)){if(a)return ri(e,t,n);t.flags|=64}if(null!==(r=t.memoizedState)&&(r.rendering=null,r.tail=null,r.lastEffect=null),lr(Fo,Fo.current),a)break;return null;case 23:case 24:return t.lanes=0,$s(e,t,n)}return oi(e,t,n)}Ms=0!=(16384&e.flags)}else Ms=!1;switch(t.lanes=0,t.tag){case 2:if(a=t.type,null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),e=t.pendingProps,r=gr(t,pr.current),ro(t,n),r=ss(null,t,a,e,r,n),t.flags|=1,"object"==typeof r&&null!==r&&"function"==typeof r.render&&void 0===r.$$typeof){if(t.tag=1,t.memoizedState=null,t.updateQueue=null,hr(a)){var o=!0;kr(t)}else o=!1;t.memoizedState=null!==r.state&&void 0!==r.state?r.state:null,io(t);var i=a.getDerivedStateFromProps;"function"==typeof i&&ho(t,a,i,e),r.updater=bo,t.stateNode=r,r._reactInternals=t,wo(t,a,e,n),t=Qs(null,t,a,!0,o,n)}else t.tag=0,Fs(null,t,r,n),t=t.child;return t;case 16:r=t.elementType;e:{switch(null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),e=t.pendingProps,r=(o=r._init)(r._payload),t.type=r,o=t.tag=function(e){if("function"==typeof e)return Qc(e)?1:0;if(null!=e){if((e=e.$$typeof)===P)return 11;if(e===N)return 14}return 2}(r),e=Xr(r,e),o){case 0:t=Hs(null,t,r,e,n);break e;case 1:t=Zs(null,t,r,e,n);break e;case 11:t=Bs(null,t,r,e,n);break e;case 14:t=js(null,t,r,Xr(r.type,e),a,n);break e}throw Error(s(306,r,""))}return t;case 0:return a=t.type,r=t.pendingProps,Hs(e,t,a,r=t.elementType===a?r:Xr(a,r),n);case 1:return a=t.type,r=t.pendingProps,Zs(e,t,a,r=t.elementType===a?r:Xr(a,r),n);case 3:if(Vs(t),a=t.updateQueue,null===e||null===a)throw Error(s(282));if(a=t.pendingProps,r=null!==(r=t.memoizedState)?r.element:null,co(e,t),fo(t,a,null,n),(a=t.memoizedState.element)===r)qo(),t=oi(e,t,n);else{if((o=(r=t.stateNode).hydrate)&&(zo=qa(t.stateNode.containerInfo.firstChild),jo=t,o=$o=!0),o){if(null!=(e=r.mutableSourceEagerHydrationData))for(r=0;r<e.length;r+=2)(o=e[r])._workInProgressVersionPrimary=e[r+1],Go.push(o);for(n=To(t,null,a,n),t.child=n;n;)n.flags=-3&n.flags|1024,n=n.sibling}else Fs(e,t,a,n),qo();t=t.child}return t;case 5:return Do(t),null===e&&Zo(t),a=t.type,r=t.pendingProps,o=null!==e?e.memoizedProps:null,i=r.children,Ha(a,r)?i=null:null!==o&&Ha(a,o)&&(t.flags|=16),Us(e,t),Fs(e,t,i,n),t.child;case 6:return null===e&&Zo(t),null;case 13:return Ks(e,t,n);case 4:return Io(t,t.stateNode.containerInfo),a=t.pendingProps,null===e?t.child=Co(t,null,a,n):Fs(e,t,a,n),t.child;case 11:return a=t.type,r=t.pendingProps,Bs(e,t,a,r=t.elementType===a?r:Xr(a,r),n);case 7:return Fs(e,t,t.pendingProps,n),t.child;case 8:case 12:return Fs(e,t,t.pendingProps.children,n),t.child;case 10:e:{a=t.type._context,r=t.pendingProps,i=t.memoizedProps,o=r.value;var c=t.type._context;if(lr(Yr,c._currentValue),c._currentValue=o,null!==i)if(c=i.value,0===(o=da(c,o)?0:0|("function"==typeof a._calculateChangedBits?a._calculateChangedBits(c,o):1073741823))){if(i.children===r.children&&!fr.current){t=oi(e,t,n);break e}}else for(null!==(c=t.child)&&(c.return=t);null!==c;){var d=c.dependencies;if(null!==d){i=c.child;for(var l=d.firstContext;null!==l;){if(l.context===a&&0!=(l.observedBits&o)){1===c.tag&&((l=lo(-1,n&-n)).tag=2,uo(c,l)),c.lanes|=n,null!==(l=c.alternate)&&(l.lanes|=n),ao(c.return,n),d.lanes|=n;break}l=l.next}}else i=10===c.tag&&c.type===t.type?null:c.child;if(null!==i)i.return=c;else for(i=c;null!==i;){if(i===t){i=null;break}if(null!==(c=i.sibling)){c.return=i.return,i=c;break}i=i.return}c=i}Fs(e,t,r.children,n),t=t.child}return t;case 9:return r=t.type,a=(o=t.pendingProps).children,ro(t,n),a=a(r=oo(r,o.unstable_observedBits)),t.flags|=1,Fs(e,t,a,n),t.child;case 14:return o=Xr(r=t.type,t.pendingProps),js(e,t,r,o=Xr(r.type,o),a,n);case 15:return zs(e,t,t.type,t.pendingProps,a,n);case 17:return a=t.type,r=t.pendingProps,r=t.elementType===a?r:Xr(a,r),null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),t.tag=1,hr(a)?(e=!0,kr(t)):e=!1,ro(t,n),yo(t,a,r),wo(t,a,r,n),Qs(null,t,a,!0,e,n);case 19:return ri(e,t,n);case 23:case 24:return $s(e,t,n)}throw Error(s(156,t.tag))},ad.prototype.render=function(e){Jc(e,this._internalRoot,null,null)},ad.prototype.unmount=function(){var e=this._internalRoot,t=e.containerInfo;Jc(null,e,null,(function(){t[Ja]=null}))},et=function(e){13===e.tag&&(mc(e,4,pc()),nd(e,4))},tt=function(e){13===e.tag&&(mc(e,67108864,pc()),nd(e,67108864))},nt=function(e){if(13===e.tag){var t=pc(),n=fc(e);mc(e,n,t),nd(e,n)}},at=function(e,t){return t()},Ce=function(e,t,n){switch(t){case"input":if(ne(e,n),t=n.name,"radio"===n.type&&null!=t){for(n=e;n.parentNode;)n=n.parentNode;for(n=n.querySelectorAll("input[name="+JSON.stringify(""+t)+'][type="radio"]'),t=0;t<n.length;t++){var a=n[t];if(a!==e&&a.form===e.form){var r=rr(a);if(!r)throw Error(s(90));Y(a),ne(a,r)}}}break;case"textarea":de(e,n);break;case"select":null!=(t=n.value)&&se(e,!!n.multiple,t,!1)}},Ne=kc,Ie=function(e,t,n,a,r){var o=Ni;Ni|=4;try{return Qr(98,e.bind(null,t,n,a,r))}finally{0===(Ni=o)&&(qi(),qr())}},Ae=function(){0==(49&Ni)&&(function(){if(null!==rc){var e=rc;rc=null,e.forEach((function(e){e.expiredLanes|=24&e.pendingLanes,hc(e,Ur())}))}qr()}(),Dc())},De=function(e,t){var n=Ni;Ni|=2;try{return e(t)}finally{0===(Ni=n)&&(qi(),qr())}};var id={Events:[nr,ar,rr,Re,Oe,Dc,{current:!1}]},cd={findFiberByHostInstance:tr,bundleType:0,version:"17.0.2",rendererPackageName:"react-dom"},dd={bundleType:cd.bundleType,version:cd.version,rendererPackageName:cd.rendererPackageName,rendererConfig:cd.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:w.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return null===(e=Ke(e))?null:e.stateNode},findFiberByHostInstance:cd.findFiberByHostInstance||function(){return null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null};if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var ld=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!ld.isDisabled&&ld.supportsFiber)try{xr=ld.inject(dd),Er=ld}catch(ge){}}t.createPortal=sd,t.flushSync=function(e,t){var n=Ni;if(0!=(48&n))return e(t);Ni|=1;try{if(e)return Qr(99,e.bind(null,t))}finally{Ni=n,qr()}},t.hydrate=function(e,t,n){if(!rd(t))throw Error(s(200));return od(null,e,t,!0,n)}},73935:(e,t,n)=>{"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}(),e.exports=n(64448)},69590:e=>{var t="undefined"!=typeof Element,n="function"==typeof Map,a="function"==typeof Set,r="function"==typeof ArrayBuffer&&!!ArrayBuffer.isView;function o(e,s){if(e===s)return!0;if(e&&s&&"object"==typeof e&&"object"==typeof s){if(e.constructor!==s.constructor)return!1;var i,c,d,l;if(Array.isArray(e)){if((i=e.length)!=s.length)return!1;for(c=i;0!=c--;)if(!o(e[c],s[c]))return!1;return!0}if(n&&e instanceof Map&&s instanceof Map){if(e.size!==s.size)return!1;for(l=e.entries();!(c=l.next()).done;)if(!s.has(c.value[0]))return!1;for(l=e.entries();!(c=l.next()).done;)if(!o(c.value[1],s.get(c.value[0])))return!1;return!0}if(a&&e instanceof Set&&s instanceof Set){if(e.size!==s.size)return!1;for(l=e.entries();!(c=l.next()).done;)if(!s.has(c.value[0]))return!1;return!0}if(r&&ArrayBuffer.isView(e)&&ArrayBuffer.isView(s)){if((i=e.length)!=s.length)return!1;for(c=i;0!=c--;)if(e[c]!==s[c])return!1;return!0}if(e.constructor===RegExp)return e.source===s.source&&e.flags===s.flags;if(e.valueOf!==Object.prototype.valueOf&&"function"==typeof e.valueOf&&"function"==typeof s.valueOf)return e.valueOf()===s.valueOf();if(e.toString!==Object.prototype.toString&&"function"==typeof e.toString&&"function"==typeof s.toString)return e.toString()===s.toString();if((i=(d=Object.keys(e)).length)!==Object.keys(s).length)return!1;for(c=i;0!=c--;)if(!Object.prototype.hasOwnProperty.call(s,d[c]))return!1;if(t&&e instanceof Element)return!1;for(c=i;0!=c--;)if(("_owner"!==d[c]&&"__v"!==d[c]&&"__o"!==d[c]||!e.$$typeof)&&!o(e[d[c]],s[d[c]]))return!1;return!0}return e!=e&&s!=s}e.exports=function(e,t){try{return o(e,t)}catch(n){if((n.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw n}}},70405:(e,t,n)=>{"use strict";n.d(t,{B6:()=>Q,ql:()=>J});var a=n(67294),r=n(45697),o=n.n(r),s=n(69590),i=n.n(s),c=n(41143),d=n.n(c),l=n(96774),u=n.n(l);function p(){return p=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var a in n)Object.prototype.hasOwnProperty.call(n,a)&&(e[a]=n[a])}return e},p.apply(this,arguments)}function f(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,m(e,t)}function m(e,t){return m=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},m(e,t)}function g(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)t.indexOf(n=o[a])>=0||(r[n]=e[n]);return r}var h={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title",FRAGMENT:"Symbol(react.fragment)"},b={rel:["amphtml","canonical","alternate"]},v={type:["application/ld+json"]},y={charset:"",name:["robots","description"],property:["og:type","og:title","og:url","og:image","og:image:alt","og:description","twitter:url","twitter:title","twitter:description","twitter:image","twitter:image:alt","twitter:card","twitter:site"]},k=Object.keys(h).map((function(e){return h[e]})),w={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},x=Object.keys(w).reduce((function(e,t){return e[w[t]]=t,e}),{}),E=function(e,t){for(var n=e.length-1;n>=0;n-=1){var a=e[n];if(Object.prototype.hasOwnProperty.call(a,t))return a[t]}return null},_=function(e){var t=E(e,h.TITLE),n=E(e,"titleTemplate");if(Array.isArray(t)&&(t=t.join("")),n&&t)return n.replace(/%s/g,(function(){return t}));var a=E(e,"defaultTitle");return t||a||void 0},S=function(e){return E(e,"onChangeClientState")||function(){}},C=function(e,t){return t.filter((function(t){return void 0!==t[e]})).map((function(t){return t[e]})).reduce((function(e,t){return p({},e,t)}),{})},T=function(e,t){return t.filter((function(e){return void 0!==e[h.BASE]})).map((function(e){return e[h.BASE]})).reverse().reduce((function(t,n){if(!t.length)for(var a=Object.keys(n),r=0;r<a.length;r+=1){var o=a[r].toLowerCase();if(-1!==e.indexOf(o)&&n[o])return t.concat(n)}return t}),[])},L=function(e,t,n){var a={};return n.filter((function(t){return!!Array.isArray(t[e])||(void 0!==t[e]&&console&&"function"==typeof console.warn&&console.warn("Helmet: "+e+' should be of type "Array". Instead found type "'+typeof t[e]+'"'),!1)})).map((function(t){return t[e]})).reverse().reduce((function(e,n){var r={};n.filter((function(e){for(var n,o=Object.keys(e),s=0;s<o.length;s+=1){var i=o[s],c=i.toLowerCase();-1===t.indexOf(c)||"rel"===n&&"canonical"===e[n].toLowerCase()||"rel"===c&&"stylesheet"===e[c].toLowerCase()||(n=c),-1===t.indexOf(i)||"innerHTML"!==i&&"cssText"!==i&&"itemprop"!==i||(n=i)}if(!n||!e[n])return!1;var d=e[n].toLowerCase();return a[n]||(a[n]={}),r[n]||(r[n]={}),!a[n][d]&&(r[n][d]=!0,!0)})).reverse().forEach((function(t){return e.push(t)}));for(var o=Object.keys(r),s=0;s<o.length;s+=1){var i=o[s],c=p({},a[i],r[i]);a[i]=c}return e}),[]).reverse()},P=function(e,t){if(Array.isArray(e)&&e.length)for(var n=0;n<e.length;n+=1)if(e[n][t])return!0;return!1},R=function(e){return Array.isArray(e)?e.join(""):e},O=function(e,t){return Array.isArray(e)?e.reduce((function(e,n){return function(e,t){for(var n=Object.keys(e),a=0;a<n.length;a+=1)if(t[n[a]]&&t[n[a]].includes(e[n[a]]))return!0;return!1}(n,t)?e.priority.push(n):e.default.push(n),e}),{priority:[],default:[]}):{default:e}},N=function(e,t){var n;return p({},e,((n={})[t]=void 0,n))},I=[h.NOSCRIPT,h.SCRIPT,h.STYLE],A=function(e,t){return void 0===t&&(t=!0),!1===t?String(e):String(e).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")},D=function(e){return Object.keys(e).reduce((function(t,n){var a=void 0!==e[n]?n+'="'+e[n]+'"':""+n;return t?t+" "+a:a}),"")},M=function(e,t){return void 0===t&&(t={}),Object.keys(e).reduce((function(t,n){return t[w[n]||n]=e[n],t}),t)},F=function(e,t){return t.map((function(t,n){var r,o=((r={key:n})["data-rh"]=!0,r);return Object.keys(t).forEach((function(e){var n=w[e]||e;"innerHTML"===n||"cssText"===n?o.dangerouslySetInnerHTML={__html:t.innerHTML||t.cssText}:o[n]=t[e]})),a.createElement(e,o)}))},B=function(e,t,n){switch(e){case h.TITLE:return{toComponent:function(){return n=t.titleAttributes,(r={key:e=t.title})["data-rh"]=!0,o=M(n,r),[a.createElement(h.TITLE,o,e)];var e,n,r,o},toString:function(){return function(e,t,n,a){var r=D(n),o=R(t);return r?"<"+e+' data-rh="true" '+r+">"+A(o,a)+"</"+e+">":"<"+e+' data-rh="true">'+A(o,a)+"</"+e+">"}(e,t.title,t.titleAttributes,n)}};case"bodyAttributes":case"htmlAttributes":return{toComponent:function(){return M(t)},toString:function(){return D(t)}};default:return{toComponent:function(){return F(e,t)},toString:function(){return function(e,t,n){return t.reduce((function(t,a){var r=Object.keys(a).filter((function(e){return!("innerHTML"===e||"cssText"===e)})).reduce((function(e,t){var r=void 0===a[t]?t:t+'="'+A(a[t],n)+'"';return e?e+" "+r:r}),""),o=a.innerHTML||a.cssText||"",s=-1===I.indexOf(e);return t+"<"+e+' data-rh="true" '+r+(s?"/>":">"+o+"</"+e+">")}),"")}(e,t,n)}}}},j=function(e){var t=e.baseTag,n=e.bodyAttributes,a=e.encode,r=e.htmlAttributes,o=e.noscriptTags,s=e.styleTags,i=e.title,c=void 0===i?"":i,d=e.titleAttributes,l=e.linkTags,u=e.metaTags,p=e.scriptTags,f={toComponent:function(){},toString:function(){return""}};if(e.prioritizeSeoTags){var m=function(e){var t=e.linkTags,n=e.scriptTags,a=e.encode,r=O(e.metaTags,y),o=O(t,b),s=O(n,v);return{priorityMethods:{toComponent:function(){return[].concat(F(h.META,r.priority),F(h.LINK,o.priority),F(h.SCRIPT,s.priority))},toString:function(){return B(h.META,r.priority,a)+" "+B(h.LINK,o.priority,a)+" "+B(h.SCRIPT,s.priority,a)}},metaTags:r.default,linkTags:o.default,scriptTags:s.default}}(e);f=m.priorityMethods,l=m.linkTags,u=m.metaTags,p=m.scriptTags}return{priority:f,base:B(h.BASE,t,a),bodyAttributes:B("bodyAttributes",n,a),htmlAttributes:B("htmlAttributes",r,a),link:B(h.LINK,l,a),meta:B(h.META,u,a),noscript:B(h.NOSCRIPT,o,a),script:B(h.SCRIPT,p,a),style:B(h.STYLE,s,a),title:B(h.TITLE,{title:c,titleAttributes:d},a)}},z=[],$=function(e,t){var n=this;void 0===t&&(t="undefined"!=typeof document),this.instances=[],this.value={setHelmet:function(e){n.context.helmet=e},helmetInstances:{get:function(){return n.canUseDOM?z:n.instances},add:function(e){(n.canUseDOM?z:n.instances).push(e)},remove:function(e){var t=(n.canUseDOM?z:n.instances).indexOf(e);(n.canUseDOM?z:n.instances).splice(t,1)}}},this.context=e,this.canUseDOM=t,t||(e.helmet=j({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}}))},U=a.createContext({}),H=o().shape({setHelmet:o().func,helmetInstances:o().shape({get:o().func,add:o().func,remove:o().func})}),Z="undefined"!=typeof document,Q=function(e){function t(n){var a;return(a=e.call(this,n)||this).helmetData=new $(a.props.context,t.canUseDOM),a}return f(t,e),t.prototype.render=function(){return a.createElement(U.Provider,{value:this.helmetData.value},this.props.children)},t}(a.Component);Q.canUseDOM=Z,Q.propTypes={context:o().shape({helmet:o().shape()}),children:o().node.isRequired},Q.defaultProps={context:{}},Q.displayName="HelmetProvider";var V=function(e,t){var n,a=document.head||document.querySelector(h.HEAD),r=a.querySelectorAll(e+"[data-rh]"),o=[].slice.call(r),s=[];return t&&t.length&&t.forEach((function(t){var a=document.createElement(e);for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&("innerHTML"===r?a.innerHTML=t.innerHTML:"cssText"===r?a.styleSheet?a.styleSheet.cssText=t.cssText:a.appendChild(document.createTextNode(t.cssText)):a.setAttribute(r,void 0===t[r]?"":t[r]));a.setAttribute("data-rh","true"),o.some((function(e,t){return n=t,a.isEqualNode(e)}))?o.splice(n,1):s.push(a)})),o.forEach((function(e){return e.parentNode.removeChild(e)})),s.forEach((function(e){return a.appendChild(e)})),{oldTags:o,newTags:s}},q=function(e,t){var n=document.getElementsByTagName(e)[0];if(n){for(var a=n.getAttribute("data-rh"),r=a?a.split(","):[],o=[].concat(r),s=Object.keys(t),i=0;i<s.length;i+=1){var c=s[i],d=t[c]||"";n.getAttribute(c)!==d&&n.setAttribute(c,d),-1===r.indexOf(c)&&r.push(c);var l=o.indexOf(c);-1!==l&&o.splice(l,1)}for(var u=o.length-1;u>=0;u-=1)n.removeAttribute(o[u]);r.length===o.length?n.removeAttribute("data-rh"):n.getAttribute("data-rh")!==s.join(",")&&n.setAttribute("data-rh",s.join(","))}},G=function(e,t){var n=e.baseTag,a=e.htmlAttributes,r=e.linkTags,o=e.metaTags,s=e.noscriptTags,i=e.onChangeClientState,c=e.scriptTags,d=e.styleTags,l=e.title,u=e.titleAttributes;q(h.BODY,e.bodyAttributes),q(h.HTML,a),function(e,t){void 0!==e&&document.title!==e&&(document.title=R(e)),q(h.TITLE,t)}(l,u);var p={baseTag:V(h.BASE,n),linkTags:V(h.LINK,r),metaTags:V(h.META,o),noscriptTags:V(h.NOSCRIPT,s),scriptTags:V(h.SCRIPT,c),styleTags:V(h.STYLE,d)},f={},m={};Object.keys(p).forEach((function(e){var t=p[e],n=t.newTags,a=t.oldTags;n.length&&(f[e]=n),a.length&&(m[e]=p[e].oldTags)})),t&&t(),i(e,f,m)},W=null,X=function(e){function t(){for(var t,n=arguments.length,a=new Array(n),r=0;r<n;r++)a[r]=arguments[r];return(t=e.call.apply(e,[this].concat(a))||this).rendered=!1,t}f(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!u()(e,this.props)},n.componentDidUpdate=function(){this.emitChange()},n.componentWillUnmount=function(){this.props.context.helmetInstances.remove(this),this.emitChange()},n.emitChange=function(){var e,t,n=this.props.context,a=n.setHelmet,r=null,o=(e=n.helmetInstances.get().map((function(e){var t=p({},e.props);return delete t.context,t})),{baseTag:T(["href"],e),bodyAttributes:C("bodyAttributes",e),defer:E(e,"defer"),encode:E(e,"encodeSpecialCharacters"),htmlAttributes:C("htmlAttributes",e),linkTags:L(h.LINK,["rel","href"],e),metaTags:L(h.META,["name","charset","http-equiv","property","itemprop"],e),noscriptTags:L(h.NOSCRIPT,["innerHTML"],e),onChangeClientState:S(e),scriptTags:L(h.SCRIPT,["src","innerHTML"],e),styleTags:L(h.STYLE,["cssText"],e),title:_(e),titleAttributes:C("titleAttributes",e),prioritizeSeoTags:P(e,"prioritizeSeoTags")});Q.canUseDOM?(t=o,W&&cancelAnimationFrame(W),t.defer?W=requestAnimationFrame((function(){G(t,(function(){W=null}))})):(G(t),W=null)):j&&(r=j(o)),a(r)},n.init=function(){this.rendered||(this.rendered=!0,this.props.context.helmetInstances.add(this),this.emitChange())},n.render=function(){return this.init(),null},t}(a.Component);X.propTypes={context:H.isRequired},X.displayName="HelmetDispatcher";var Y=["children"],K=["children"],J=function(e){function t(){return e.apply(this,arguments)||this}f(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!i()(N(this.props,"helmetData"),N(e,"helmetData"))},n.mapNestedChildrenToProps=function(e,t){if(!t)return null;switch(e.type){case h.SCRIPT:case h.NOSCRIPT:return{innerHTML:t};case h.STYLE:return{cssText:t};default:throw new Error("<"+e.type+" /> elements are self-closing and can not contain children. Refer to our API for more information.")}},n.flattenArrayTypeChildren=function(e){var t,n=e.child,a=e.arrayTypeChildren;return p({},a,((t={})[n.type]=[].concat(a[n.type]||[],[p({},e.newChildProps,this.mapNestedChildrenToProps(n,e.nestedChildren))]),t))},n.mapObjectTypeChildren=function(e){var t,n,a=e.child,r=e.newProps,o=e.newChildProps,s=e.nestedChildren;switch(a.type){case h.TITLE:return p({},r,((t={})[a.type]=s,t.titleAttributes=p({},o),t));case h.BODY:return p({},r,{bodyAttributes:p({},o)});case h.HTML:return p({},r,{htmlAttributes:p({},o)});default:return p({},r,((n={})[a.type]=p({},o),n))}},n.mapArrayTypeChildrenToProps=function(e,t){var n=p({},t);return Object.keys(e).forEach((function(t){var a;n=p({},n,((a={})[t]=e[t],a))})),n},n.warnOnInvalidChildren=function(e,t){return d()(k.some((function(t){return e.type===t})),"function"==typeof e.type?"You may be attempting to nest <Helmet> components within each other, which is not allowed. Refer to our API for more information.":"Only elements types "+k.join(", ")+" are allowed. Helmet does not support rendering <"+e.type+"> elements. Refer to our API for more information."),d()(!t||"string"==typeof t||Array.isArray(t)&&!t.some((function(e){return"string"!=typeof e})),"Helmet expects a string as a child of <"+e.type+">. Did you forget to wrap your children in braces? ( <"+e.type+">{``}</"+e.type+"> ) Refer to our API for more information."),!0},n.mapChildrenToProps=function(e,t){var n=this,r={};return a.Children.forEach(e,(function(e){if(e&&e.props){var a=e.props,o=a.children,s=g(a,Y),i=Object.keys(s).reduce((function(e,t){return e[x[t]||t]=s[t],e}),{}),c=e.type;switch("symbol"==typeof c?c=c.toString():n.warnOnInvalidChildren(e,o),c){case h.FRAGMENT:t=n.mapChildrenToProps(o,t);break;case h.LINK:case h.META:case h.NOSCRIPT:case h.SCRIPT:case h.STYLE:r=n.flattenArrayTypeChildren({child:e,arrayTypeChildren:r,newChildProps:i,nestedChildren:o});break;default:t=n.mapObjectTypeChildren({child:e,newProps:t,newChildProps:i,nestedChildren:o})}}})),this.mapArrayTypeChildrenToProps(r,t)},n.render=function(){var e=this.props,t=e.children,n=g(e,K),r=p({},n),o=n.helmetData;return t&&(r=this.mapChildrenToProps(t,r)),!o||o instanceof $||(o=new $(o.context,o.instances)),o?a.createElement(X,p({},r,{context:o.value,helmetData:void 0})):a.createElement(U.Consumer,null,(function(e){return a.createElement(X,p({},r,{context:e}))}))},t}(a.Component);J.propTypes={base:o().object,bodyAttributes:o().object,children:o().oneOfType([o().arrayOf(o().node),o().node]),defaultTitle:o().string,defer:o().bool,encodeSpecialCharacters:o().bool,htmlAttributes:o().object,link:o().arrayOf(o().object),meta:o().arrayOf(o().object),noscript:o().arrayOf(o().object),onChangeClientState:o().func,script:o().arrayOf(o().object),style:o().arrayOf(o().object),title:o().string,titleAttributes:o().object,titleTemplate:o().string,prioritizeSeoTags:o().bool,helmetData:o().object},J.defaultProps={defer:!0,encodeSpecialCharacters:!0,prioritizeSeoTags:!1},J.displayName="Helmet"},69921:(e,t)=>{"use strict";var n="function"==typeof Symbol&&Symbol.for,a=n?Symbol.for("react.element"):60103,r=n?Symbol.for("react.portal"):60106,o=n?Symbol.for("react.fragment"):60107,s=n?Symbol.for("react.strict_mode"):60108,i=n?Symbol.for("react.profiler"):60114,c=n?Symbol.for("react.provider"):60109,d=n?Symbol.for("react.context"):60110,l=n?Symbol.for("react.async_mode"):60111,u=n?Symbol.for("react.concurrent_mode"):60111,p=n?Symbol.for("react.forward_ref"):60112,f=n?Symbol.for("react.suspense"):60113,m=n?Symbol.for("react.suspense_list"):60120,g=n?Symbol.for("react.memo"):60115,h=n?Symbol.for("react.lazy"):60116,b=n?Symbol.for("react.block"):60121,v=n?Symbol.for("react.fundamental"):60117,y=n?Symbol.for("react.responder"):60118,k=n?Symbol.for("react.scope"):60119;function w(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case a:switch(e=e.type){case l:case u:case o:case i:case s:case f:return e;default:switch(e=e&&e.$$typeof){case d:case p:case h:case g:case c:return e;default:return t}}case r:return t}}}function x(e){return w(e)===u}t.AsyncMode=l,t.ConcurrentMode=u,t.ContextConsumer=d,t.ContextProvider=c,t.Element=a,t.ForwardRef=p,t.Fragment=o,t.Lazy=h,t.Memo=g,t.Portal=r,t.Profiler=i,t.StrictMode=s,t.Suspense=f,t.isAsyncMode=function(e){return x(e)||w(e)===l},t.isConcurrentMode=x,t.isContextConsumer=function(e){return w(e)===d},t.isContextProvider=function(e){return w(e)===c},t.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===a},t.isForwardRef=function(e){return w(e)===p},t.isFragment=function(e){return w(e)===o},t.isLazy=function(e){return w(e)===h},t.isMemo=function(e){return w(e)===g},t.isPortal=function(e){return w(e)===r},t.isProfiler=function(e){return w(e)===i},t.isStrictMode=function(e){return w(e)===s},t.isSuspense=function(e){return w(e)===f},t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===o||e===u||e===i||e===s||e===f||e===m||"object"==typeof e&&null!==e&&(e.$$typeof===h||e.$$typeof===g||e.$$typeof===c||e.$$typeof===d||e.$$typeof===p||e.$$typeof===v||e.$$typeof===y||e.$$typeof===k||e.$$typeof===b)},t.typeOf=w},59864:(e,t,n)=>{"use strict";e.exports=n(69921)},68356:(e,t,n)=>{"use strict";function a(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.__proto__=t}function r(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(){return s=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var a in n)Object.prototype.hasOwnProperty.call(n,a)&&(e[a]=n[a])}return e},s.apply(this,arguments)}var i=n(67294),c=n(45697),d=[],l=[];function u(e){var t=e(),n={loading:!0,loaded:null,error:null};return n.promise=t.then((function(e){return n.loading=!1,n.loaded=e,e})).catch((function(e){throw n.loading=!1,n.error=e,e})),n}function p(e){var t={loading:!1,loaded:{},error:null},n=[];try{Object.keys(e).forEach((function(a){var r=u(e[a]);r.loading?t.loading=!0:(t.loaded[a]=r.loaded,t.error=r.error),n.push(r.promise),r.promise.then((function(e){t.loaded[a]=e})).catch((function(e){t.error=e}))}))}catch(a){t.error=a}return t.promise=Promise.all(n).then((function(e){return t.loading=!1,e})).catch((function(e){throw t.loading=!1,e})),t}function f(e,t){return i.createElement((n=e)&&n.__esModule?n.default:n,t);var n}function m(e,t){var u,p;if(!t.loading)throw new Error("react-loadable requires a `loading` component");var m=s({loader:null,loading:null,delay:200,timeout:null,render:f,webpack:null,modules:null},t),g=null;function h(){return g||(g=e(m.loader)),g.promise}return d.push(h),"function"==typeof m.webpack&&l.push((function(){if((0,m.webpack)().every((function(e){return void 0!==e&&void 0!==n.m[e]})))return h()})),p=u=function(t){function n(n){var a;return o(r(r(a=t.call(this,n)||this)),"retry",(function(){a.setState({error:null,loading:!0,timedOut:!1}),g=e(m.loader),a._loadModule()})),h(),a.state={error:g.error,pastDelay:!1,timedOut:!1,loading:g.loading,loaded:g.loaded},a}a(n,t),n.preload=function(){return h()};var s=n.prototype;return s.UNSAFE_componentWillMount=function(){this._loadModule()},s.componentDidMount=function(){this._mounted=!0},s._loadModule=function(){var e=this;if(this.context.loadable&&Array.isArray(m.modules)&&m.modules.forEach((function(t){e.context.loadable.report(t)})),g.loading){var t=function(t){e._mounted&&e.setState(t)};"number"==typeof m.delay&&(0===m.delay?this.setState({pastDelay:!0}):this._delay=setTimeout((function(){t({pastDelay:!0})}),m.delay)),"number"==typeof m.timeout&&(this._timeout=setTimeout((function(){t({timedOut:!0})}),m.timeout));var n=function(){t({error:g.error,loaded:g.loaded,loading:g.loading}),e._clearTimeouts()};g.promise.then((function(){return n(),null})).catch((function(e){return n(),null}))}},s.componentWillUnmount=function(){this._mounted=!1,this._clearTimeouts()},s._clearTimeouts=function(){clearTimeout(this._delay),clearTimeout(this._timeout)},s.render=function(){return this.state.loading||this.state.error?i.createElement(m.loading,{isLoading:this.state.loading,pastDelay:this.state.pastDelay,timedOut:this.state.timedOut,error:this.state.error,retry:this.retry}):this.state.loaded?m.render(this.state.loaded,this.props):null},n}(i.Component),o(u,"contextTypes",{loadable:c.shape({report:c.func.isRequired})}),p}function g(e){return m(u,e)}g.Map=function(e){if("function"!=typeof e.render)throw new Error("LoadableMap requires a `render(loaded, props)` function");return m(p,e)};var h=function(e){function t(){return e.apply(this,arguments)||this}a(t,e);var n=t.prototype;return n.getChildContext=function(){return{loadable:{report:this.props.report}}},n.render=function(){return i.Children.only(this.props.children)},t}(i.Component);function b(e){for(var t=[];e.length;){var n=e.pop();t.push(n())}return Promise.all(t).then((function(){if(e.length)return b(e)}))}o(h,"propTypes",{report:c.func.isRequired}),o(h,"childContextTypes",{loadable:c.shape({report:c.func.isRequired}).isRequired}),g.Capture=h,g.preloadAll=function(){return new Promise((function(e,t){b(d).then(e,t)}))},g.preloadReady=function(){return new Promise((function(e,t){b(l).then(e,e)}))},e.exports=g},18790:(e,t,n)=>{"use strict";n.d(t,{H:()=>i,f:()=>s});var a=n(16550),r=n(87462),o=n(67294);function s(e,t,n){return void 0===n&&(n=[]),e.some((function(e){var r=e.path?(0,a.LX)(t,e):n.length?n[n.length-1].match:a.F0.computeRootMatch(t);return r&&(n.push({route:e,match:r}),e.routes&&s(e.routes,t,n)),r})),n}function i(e,t,n){return void 0===t&&(t={}),void 0===n&&(n={}),e?o.createElement(a.rs,n,e.map((function(e,n){return o.createElement(a.AW,{key:e.key||n,path:e.path,exact:e.exact,strict:e.strict,render:function(n){return e.render?e.render((0,r.Z)({},n,{},t,{route:e})):o.createElement(e.component,(0,r.Z)({},n,t,{route:e}))}})}))):null}},73727:(e,t,n)=>{"use strict";n.d(t,{OL:()=>y,VK:()=>l,rU:()=>h});var a=n(16550),r=n(75068),o=n(67294),s=n(99318),i=n(87462),c=n(63366),d=n(38776),l=function(e){function t(){for(var t,n=arguments.length,a=new Array(n),r=0;r<n;r++)a[r]=arguments[r];return(t=e.call.apply(e,[this].concat(a))||this).history=(0,s.lX)(t.props),t}return(0,r.Z)(t,e),t.prototype.render=function(){return o.createElement(a.F0,{history:this.history,children:this.props.children})},t}(o.Component);o.Component;var u=function(e,t){return"function"==typeof e?e(t):e},p=function(e,t){return"string"==typeof e?(0,s.ob)(e,null,null,t):e},f=function(e){return e},m=o.forwardRef;void 0===m&&(m=f);var g=m((function(e,t){var n=e.innerRef,a=e.navigate,r=e.onClick,s=(0,c.Z)(e,["innerRef","navigate","onClick"]),d=s.target,l=(0,i.Z)({},s,{onClick:function(e){try{r&&r(e)}catch(t){throw e.preventDefault(),t}e.defaultPrevented||0!==e.button||d&&"_self"!==d||function(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}(e)||(e.preventDefault(),a())}});return l.ref=f!==m&&t||n,o.createElement("a",l)}));var h=m((function(e,t){var n=e.component,r=void 0===n?g:n,l=e.replace,h=e.to,b=e.innerRef,v=(0,c.Z)(e,["component","replace","to","innerRef"]);return o.createElement(a.s6.Consumer,null,(function(e){e||(0,d.Z)(!1);var n=e.history,a=p(u(h,e.location),e.location),c=a?n.createHref(a):"",g=(0,i.Z)({},v,{href:c,navigate:function(){var t=u(h,e.location),a=(0,s.Ep)(e.location)===(0,s.Ep)(p(t));(l||a?n.replace:n.push)(t)}});return f!==m?g.ref=t||b:g.innerRef=b,o.createElement(r,g)}))})),b=function(e){return e},v=o.forwardRef;void 0===v&&(v=b);var y=v((function(e,t){var n=e["aria-current"],r=void 0===n?"page":n,s=e.activeClassName,l=void 0===s?"active":s,f=e.activeStyle,m=e.className,g=e.exact,y=e.isActive,k=e.location,w=e.sensitive,x=e.strict,E=e.style,_=e.to,S=e.innerRef,C=(0,c.Z)(e,["aria-current","activeClassName","activeStyle","className","exact","isActive","location","sensitive","strict","style","to","innerRef"]);return o.createElement(a.s6.Consumer,null,(function(e){e||(0,d.Z)(!1);var n=k||e.location,s=p(u(_,n),n),c=s.pathname,T=c&&c.replace(/([.+*?=^!:${}()[\]|/\\])/g,"\\$1"),L=T?(0,a.LX)(n.pathname,{path:T,exact:g,sensitive:w,strict:x}):null,P=!!(y?y(L,n):L),R="function"==typeof m?m(P):m,O="function"==typeof E?E(P):E;P&&(R=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return t.filter((function(e){return e})).join(" ")}(R,l),O=(0,i.Z)({},O,f));var N=(0,i.Z)({"aria-current":P&&r||null,className:R,style:O,to:s},C);return b!==v?N.ref=t||S:N.innerRef=S,o.createElement(h,N)}))}))},16550:(e,t,n)=>{"use strict";n.d(t,{AW:()=>_,F0:()=>y,LX:()=>E,TH:()=>I,k6:()=>N,rs:()=>R,s6:()=>v});var a=n(75068),r=n(67294),o=n(45697),s=n.n(o),i=n(99318),c=n(38776),d=n(87462),l=n(14779),u=n.n(l),p=(n(59864),n(63366)),f=(n(8679),1073741823),m="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==n.g?n.g:{};var g=r.createContext||function(e,t){var n,o,i="__create-react-context-"+function(){var e="__global_unique_id__";return m[e]=(m[e]||0)+1}()+"__",c=function(e){function n(){for(var t,n,a,r=arguments.length,o=new Array(r),s=0;s<r;s++)o[s]=arguments[s];return(t=e.call.apply(e,[this].concat(o))||this).emitter=(n=t.props.value,a=[],{on:function(e){a.push(e)},off:function(e){a=a.filter((function(t){return t!==e}))},get:function(){return n},set:function(e,t){n=e,a.forEach((function(e){return e(n,t)}))}}),t}(0,a.Z)(n,e);var r=n.prototype;return r.getChildContext=function(){var e;return(e={})[i]=this.emitter,e},r.componentWillReceiveProps=function(e){if(this.props.value!==e.value){var n,a=this.props.value,r=e.value;((o=a)===(s=r)?0!==o||1/o==1/s:o!=o&&s!=s)?n=0:(n="function"==typeof t?t(a,r):f,0!==(n|=0)&&this.emitter.set(e.value,n))}var o,s},r.render=function(){return this.props.children},n}(r.Component);c.childContextTypes=((n={})[i]=s().object.isRequired,n);var d=function(t){function n(){for(var e,n=arguments.length,a=new Array(n),r=0;r<n;r++)a[r]=arguments[r];return(e=t.call.apply(t,[this].concat(a))||this).observedBits=void 0,e.state={value:e.getValue()},e.onUpdate=function(t,n){0!=((0|e.observedBits)&n)&&e.setState({value:e.getValue()})},e}(0,a.Z)(n,t);var r=n.prototype;return r.componentWillReceiveProps=function(e){var t=e.observedBits;this.observedBits=null==t?f:t},r.componentDidMount=function(){this.context[i]&&this.context[i].on(this.onUpdate);var e=this.props.observedBits;this.observedBits=null==e?f:e},r.componentWillUnmount=function(){this.context[i]&&this.context[i].off(this.onUpdate)},r.getValue=function(){return this.context[i]?this.context[i].get():e},r.render=function(){return(e=this.props.children,Array.isArray(e)?e[0]:e)(this.state.value);var e},n}(r.Component);return d.contextTypes=((o={})[i]=s().object,o),{Provider:c,Consumer:d}},h=function(e){var t=g();return t.displayName=e,t},b=h("Router-History"),v=h("Router"),y=function(e){function t(t){var n;return(n=e.call(this,t)||this).state={location:t.history.location},n._isMounted=!1,n._pendingLocation=null,t.staticContext||(n.unlisten=t.history.listen((function(e){n._pendingLocation=e}))),n}(0,a.Z)(t,e),t.computeRootMatch=function(e){return{path:"/",url:"/",params:{},isExact:"/"===e}};var n=t.prototype;return n.componentDidMount=function(){var e=this;this._isMounted=!0,this.unlisten&&this.unlisten(),this.props.staticContext||(this.unlisten=this.props.history.listen((function(t){e._isMounted&&e.setState({location:t})}))),this._pendingLocation&&this.setState({location:this._pendingLocation})},n.componentWillUnmount=function(){this.unlisten&&(this.unlisten(),this._isMounted=!1,this._pendingLocation=null)},n.render=function(){return r.createElement(v.Provider,{value:{history:this.props.history,location:this.state.location,match:t.computeRootMatch(this.state.location.pathname),staticContext:this.props.staticContext}},r.createElement(b.Provider,{children:this.props.children||null,value:this.props.history}))},t}(r.Component);r.Component;r.Component;var k={},w=1e4,x=0;function E(e,t){void 0===t&&(t={}),("string"==typeof t||Array.isArray(t))&&(t={path:t});var n=t,a=n.path,r=n.exact,o=void 0!==r&&r,s=n.strict,i=void 0!==s&&s,c=n.sensitive,d=void 0!==c&&c;return[].concat(a).reduce((function(t,n){if(!n&&""!==n)return null;if(t)return t;var a=function(e,t){var n=""+t.end+t.strict+t.sensitive,a=k[n]||(k[n]={});if(a[e])return a[e];var r=[],o={regexp:u()(e,r,t),keys:r};return x<w&&(a[e]=o,x++),o}(n,{end:o,strict:i,sensitive:d}),r=a.regexp,s=a.keys,c=r.exec(e);if(!c)return null;var l=c[0],p=c.slice(1),f=e===l;return o&&!f?null:{path:n,url:"/"===n&&""===l?"/":l,isExact:f,params:s.reduce((function(e,t,n){return e[t.name]=p[n],e}),{})}}),null)}var _=function(e){function t(){return e.apply(this,arguments)||this}return(0,a.Z)(t,e),t.prototype.render=function(){var e=this;return r.createElement(v.Consumer,null,(function(t){t||(0,c.Z)(!1);var n=e.props.location||t.location,a=e.props.computedMatch?e.props.computedMatch:e.props.path?E(n.pathname,e.props):t.match,o=(0,d.Z)({},t,{location:n,match:a}),s=e.props,i=s.children,l=s.component,u=s.render;return Array.isArray(i)&&function(e){return 0===r.Children.count(e)}(i)&&(i=null),r.createElement(v.Provider,{value:o},o.match?i?"function"==typeof i?i(o):i:l?r.createElement(l,o):u?u(o):null:"function"==typeof i?i(o):null)}))},t}(r.Component);function S(e){return"/"===e.charAt(0)?e:"/"+e}function C(e,t){if(!e)return t;var n=S(e);return 0!==t.pathname.indexOf(n)?t:(0,d.Z)({},t,{pathname:t.pathname.substr(n.length)})}function T(e){return"string"==typeof e?e:(0,i.Ep)(e)}function L(e){return function(){(0,c.Z)(!1)}}function P(){}r.Component;var R=function(e){function t(){return e.apply(this,arguments)||this}return(0,a.Z)(t,e),t.prototype.render=function(){var e=this;return r.createElement(v.Consumer,null,(function(t){t||(0,c.Z)(!1);var n,a,o=e.props.location||t.location;return r.Children.forEach(e.props.children,(function(e){if(null==a&&r.isValidElement(e)){n=e;var s=e.props.path||e.props.from;a=s?E(o.pathname,(0,d.Z)({},e.props,{path:s})):t.match}})),a?r.cloneElement(n,{location:o,computedMatch:a}):null}))},t}(r.Component);var O=r.useContext;function N(){return O(b)}function I(){return O(v).location}},72408:(e,t,n)=>{"use strict";var a=n(27418),r=60103,o=60106;t.Fragment=60107,t.StrictMode=60108,t.Profiler=60114;var s=60109,i=60110,c=60112;t.Suspense=60113;var d=60115,l=60116;if("function"==typeof Symbol&&Symbol.for){var u=Symbol.for;r=u("react.element"),o=u("react.portal"),t.Fragment=u("react.fragment"),t.StrictMode=u("react.strict_mode"),t.Profiler=u("react.profiler"),s=u("react.provider"),i=u("react.context"),c=u("react.forward_ref"),t.Suspense=u("react.suspense"),d=u("react.memo"),l=u("react.lazy")}var p="function"==typeof Symbol&&Symbol.iterator;function f(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var m={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g={};function h(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}function b(){}function v(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}h.prototype.isReactComponent={},h.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error(f(85));this.updater.enqueueSetState(this,e,t,"setState")},h.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},b.prototype=h.prototype;var y=v.prototype=new b;y.constructor=v,a(y,h.prototype),y.isPureReactComponent=!0;var k={current:null},w=Object.prototype.hasOwnProperty,x={key:!0,ref:!0,__self:!0,__source:!0};function E(e,t,n){var a,o={},s=null,i=null;if(null!=t)for(a in void 0!==t.ref&&(i=t.ref),void 0!==t.key&&(s=""+t.key),t)w.call(t,a)&&!x.hasOwnProperty(a)&&(o[a]=t[a]);var c=arguments.length-2;if(1===c)o.children=n;else if(1<c){for(var d=Array(c),l=0;l<c;l++)d[l]=arguments[l+2];o.children=d}if(e&&e.defaultProps)for(a in c=e.defaultProps)void 0===o[a]&&(o[a]=c[a]);return{$$typeof:r,type:e,key:s,ref:i,props:o,_owner:k.current}}function _(e){return"object"==typeof e&&null!==e&&e.$$typeof===r}var S=/\/+/g;function C(e,t){return"object"==typeof e&&null!==e&&null!=e.key?function(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,(function(e){return t[e]}))}(""+e.key):t.toString(36)}function T(e,t,n,a,s){var i=typeof e;"undefined"!==i&&"boolean"!==i||(e=null);var c=!1;if(null===e)c=!0;else switch(i){case"string":case"number":c=!0;break;case"object":switch(e.$$typeof){case r:case o:c=!0}}if(c)return s=s(c=e),e=""===a?"."+C(c,0):a,Array.isArray(s)?(n="",null!=e&&(n=e.replace(S,"$&/")+"/"),T(s,t,n,"",(function(e){return e}))):null!=s&&(_(s)&&(s=function(e,t){return{$$typeof:r,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(s,n+(!s.key||c&&c.key===s.key?"":(""+s.key).replace(S,"$&/")+"/")+e)),t.push(s)),1;if(c=0,a=""===a?".":a+":",Array.isArray(e))for(var d=0;d<e.length;d++){var l=a+C(i=e[d],d);c+=T(i,t,n,l,s)}else if(l=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=p&&e[p]||e["@@iterator"])?e:null}(e),"function"==typeof l)for(e=l.call(e),d=0;!(i=e.next()).done;)c+=T(i=i.value,t,n,l=a+C(i,d++),s);else if("object"===i)throw t=""+e,Error(f(31,"[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t));return c}function L(e,t,n){if(null==e)return e;var a=[],r=0;return T(e,a,"","",(function(e){return t.call(n,e,r++)})),a}function P(e){if(-1===e._status){var t=e._result;t=t(),e._status=0,e._result=t,t.then((function(t){0===e._status&&(t=t.default,e._status=1,e._result=t)}),(function(t){0===e._status&&(e._status=2,e._result=t)}))}if(1===e._status)return e._result;throw e._result}var R={current:null};function O(){var e=R.current;if(null===e)throw Error(f(321));return e}var N={ReactCurrentDispatcher:R,ReactCurrentBatchConfig:{transition:0},ReactCurrentOwner:k,IsSomeRendererActing:{current:!1},assign:a};t.Children={map:L,forEach:function(e,t,n){L(e,(function(){t.apply(this,arguments)}),n)},count:function(e){var t=0;return L(e,(function(){t++})),t},toArray:function(e){return L(e,(function(e){return e}))||[]},only:function(e){if(!_(e))throw Error(f(143));return e}},t.Component=h,t.PureComponent=v,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=N,t.cloneElement=function(e,t,n){if(null==e)throw Error(f(267,e));var o=a({},e.props),s=e.key,i=e.ref,c=e._owner;if(null!=t){if(void 0!==t.ref&&(i=t.ref,c=k.current),void 0!==t.key&&(s=""+t.key),e.type&&e.type.defaultProps)var d=e.type.defaultProps;for(l in t)w.call(t,l)&&!x.hasOwnProperty(l)&&(o[l]=void 0===t[l]&&void 0!==d?d[l]:t[l])}var l=arguments.length-2;if(1===l)o.children=n;else if(1<l){d=Array(l);for(var u=0;u<l;u++)d[u]=arguments[u+2];o.children=d}return{$$typeof:r,type:e.type,key:s,ref:i,props:o,_owner:c}},t.createContext=function(e,t){return void 0===t&&(t=null),(e={$$typeof:i,_calculateChangedBits:t,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null}).Provider={$$typeof:s,_context:e},e.Consumer=e},t.createElement=E,t.createFactory=function(e){var t=E.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:c,render:e}},t.isValidElement=_,t.lazy=function(e){return{$$typeof:l,_payload:{_status:-1,_result:e},_init:P}},t.memo=function(e,t){return{$$typeof:d,type:e,compare:void 0===t?null:t}},t.useCallback=function(e,t){return O().useCallback(e,t)},t.useContext=function(e,t){return O().useContext(e,t)},t.useDebugValue=function(){},t.useEffect=function(e,t){return O().useEffect(e,t)},t.useImperativeHandle=function(e,t,n){return O().useImperativeHandle(e,t,n)},t.useLayoutEffect=function(e,t){return O().useLayoutEffect(e,t)},t.useMemo=function(e,t){return O().useMemo(e,t)},t.useReducer=function(e,t,n){return O().useReducer(e,t,n)},t.useRef=function(e){return O().useRef(e)},t.useState=function(e){return O().useState(e)},t.version="17.0.2"},67294:(e,t,n)=>{"use strict";e.exports=n(72408)},60053:(e,t)=>{"use strict";var n,a,r,o;if("object"==typeof performance&&"function"==typeof performance.now){var s=performance;t.unstable_now=function(){return s.now()}}else{var i=Date,c=i.now();t.unstable_now=function(){return i.now()-c}}if("undefined"==typeof window||"function"!=typeof MessageChannel){var d=null,l=null,u=function(){if(null!==d)try{var e=t.unstable_now();d(!0,e),d=null}catch(n){throw setTimeout(u,0),n}};n=function(e){null!==d?setTimeout(n,0,e):(d=e,setTimeout(u,0))},a=function(e,t){l=setTimeout(e,t)},r=function(){clearTimeout(l)},t.unstable_shouldYield=function(){return!1},o=t.unstable_forceFrameRate=function(){}}else{var p=window.setTimeout,f=window.clearTimeout;if("undefined"!=typeof console){var m=window.cancelAnimationFrame;"function"!=typeof window.requestAnimationFrame&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills"),"function"!=typeof m&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills")}var g=!1,h=null,b=-1,v=5,y=0;t.unstable_shouldYield=function(){return t.unstable_now()>=y},o=function(){},t.unstable_forceFrameRate=function(e){0>e||125<e?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):v=0<e?Math.floor(1e3/e):5};var k=new MessageChannel,w=k.port2;k.port1.onmessage=function(){if(null!==h){var e=t.unstable_now();y=e+v;try{h(!0,e)?w.postMessage(null):(g=!1,h=null)}catch(n){throw w.postMessage(null),n}}else g=!1},n=function(e){h=e,g||(g=!0,w.postMessage(null))},a=function(e,n){b=p((function(){e(t.unstable_now())}),n)},r=function(){f(b),b=-1}}function x(e,t){var n=e.length;e.push(t);e:for(;;){var a=n-1>>>1,r=e[a];if(!(void 0!==r&&0<S(r,t)))break e;e[a]=t,e[n]=r,n=a}}function E(e){return void 0===(e=e[0])?null:e}function _(e){var t=e[0];if(void 0!==t){var n=e.pop();if(n!==t){e[0]=n;e:for(var a=0,r=e.length;a<r;){var o=2*(a+1)-1,s=e[o],i=o+1,c=e[i];if(void 0!==s&&0>S(s,n))void 0!==c&&0>S(c,s)?(e[a]=c,e[i]=n,a=i):(e[a]=s,e[o]=n,a=o);else{if(!(void 0!==c&&0>S(c,n)))break e;e[a]=c,e[i]=n,a=i}}}return t}return null}function S(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}var C=[],T=[],L=1,P=null,R=3,O=!1,N=!1,I=!1;function A(e){for(var t=E(T);null!==t;){if(null===t.callback)_(T);else{if(!(t.startTime<=e))break;_(T),t.sortIndex=t.expirationTime,x(C,t)}t=E(T)}}function D(e){if(I=!1,A(e),!N)if(null!==E(C))N=!0,n(M);else{var t=E(T);null!==t&&a(D,t.startTime-e)}}function M(e,n){N=!1,I&&(I=!1,r()),O=!0;var o=R;try{for(A(n),P=E(C);null!==P&&(!(P.expirationTime>n)||e&&!t.unstable_shouldYield());){var s=P.callback;if("function"==typeof s){P.callback=null,R=P.priorityLevel;var i=s(P.expirationTime<=n);n=t.unstable_now(),"function"==typeof i?P.callback=i:P===E(C)&&_(C),A(n)}else _(C);P=E(C)}if(null!==P)var c=!0;else{var d=E(T);null!==d&&a(D,d.startTime-n),c=!1}return c}finally{P=null,R=o,O=!1}}var F=o;t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(e){e.callback=null},t.unstable_continueExecution=function(){N||O||(N=!0,n(M))},t.unstable_getCurrentPriorityLevel=function(){return R},t.unstable_getFirstCallbackNode=function(){return E(C)},t.unstable_next=function(e){switch(R){case 1:case 2:case 3:var t=3;break;default:t=R}var n=R;R=t;try{return e()}finally{R=n}},t.unstable_pauseExecution=function(){},t.unstable_requestPaint=F,t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=R;R=e;try{return t()}finally{R=n}},t.unstable_scheduleCallback=function(e,o,s){var i=t.unstable_now();switch("object"==typeof s&&null!==s?s="number"==typeof(s=s.delay)&&0<s?i+s:i:s=i,e){case 1:var c=-1;break;case 2:c=250;break;case 5:c=1073741823;break;case 4:c=1e4;break;default:c=5e3}return e={id:L++,callback:o,priorityLevel:e,startTime:s,expirationTime:c=s+c,sortIndex:-1},s>i?(e.sortIndex=s,x(T,e),null===E(C)&&e===E(T)&&(I?r():I=!0,a(D,s-i))):(e.sortIndex=c,x(C,e),N||O||(N=!0,n(M))),e},t.unstable_wrapCallback=function(e){var t=R;return function(){var n=R;R=t;try{return e.apply(this,arguments)}finally{R=n}}}},63840:(e,t,n)=>{"use strict";e.exports=n(60053)},96774:e=>{e.exports=function(e,t,n,a){var r=n?n.call(a,e,t):void 0;if(void 0!==r)return!!r;if(e===t)return!0;if("object"!=typeof e||!e||"object"!=typeof t||!t)return!1;var o=Object.keys(e),s=Object.keys(t);if(o.length!==s.length)return!1;for(var i=Object.prototype.hasOwnProperty.bind(t),c=0;c<o.length;c++){var d=o[c];if(!i(d))return!1;var l=e[d],u=t[d];if(!1===(r=n?n.call(a,l,u,d):void 0)||void 0===r&&l!==u)return!1}return!0}},53250:(e,t,n)=>{"use strict";var a=n(67294);var r="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},o=a.useState,s=a.useEffect,i=a.useLayoutEffect,c=a.useDebugValue;function d(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!r(e,n)}catch(a){return!0}}var l="undefined"==typeof window||void 0===window.document||void 0===window.document.createElement?function(e,t){return t()}:function(e,t){var n=t(),a=o({inst:{value:n,getSnapshot:t}}),r=a[0].inst,l=a[1];return i((function(){r.value=n,r.getSnapshot=t,d(r)&&l({inst:r})}),[e,n,t]),s((function(){return d(r)&&l({inst:r}),e((function(){d(r)&&l({inst:r})}))}),[e]),c(n),n};t.useSyncExternalStore=void 0!==a.useSyncExternalStore?a.useSyncExternalStore:l},61688:(e,t,n)=>{"use strict";e.exports=n(53250)},36809:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>a});const a={title:"One platform \u2014 standardized, built and operated by many.",tagline:"Documentation and Community Platform for the Sovereign Cloud Stack",url:"https://docs.scs.community",baseUrl:"/",onBrokenLinks:"throw",onBrokenMarkdownLinks:"warn",favicon:"img/favicon.ico",markdown:{mermaid:!0},organizationName:"SovereignCloudStack",projectName:"docs",i18n:{defaultLocale:"en",locales:["en"],path:"i18n",localeConfigs:{}},presets:[["classic",{docs:{sidebarPath:"/home/runner/work/docs/docs/sidebarsDocs.js",editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/"},blog:{showReadingTime:!0,editUrl:"https://github.com/SovereignCloudStack/docs/tree/main/"},theme:{customCss:["/home/runner/work/docs/docs/src/css/custom.css"]}}]],plugins:[["@docusaurus/plugin-client-redirects",{redirects:[]}],["@docusaurus/plugin-content-docs",{id:"community",path:"community",routeBasePath:"community",sidebarPath:"/home/runner/work/docs/docs/sidebarsCommunity.js"}],["@docusaurus/plugin-content-docs",{id:"dev-docs",path:"dev-docs",routeBasePath:"dev-docs",sidebarPath:"/home/runner/work/docs/docs/sidebarsDevDocs.js"}],["@docusaurus/plugin-content-docs",{id:"standards",path:"standards",routeBasePath:"standards",sidebarPath:"/home/runner/work/docs/docs/sidebarsStandards.js"}],"./src/plugins/docusaurus-plugin-matomo-analytics/index.js"],themeConfig:{metadata:[{title:"One platform \u2014 standardized, built and operated by many.",description:"Documentation and Community Platform for the Sovereign Cloud Stack"}],image:"img/summit-social.png",navbar:{title:"",logo:{alt:"SCS",src:"img/logo.svg"},items:[{to:"/standards",label:"Standards",position:"left"},{to:"/docs",label:"For Operators",position:"left"},{to:"/dev-docs",label:"For Developers",position:"left"},{to:"/community",label:"Community",position:"left"},{to:"/docs/faq",label:"FAQ",position:"left"},{href:"https://github.com/SovereignCloudStack/docs",label:"GitHub",position:"right"}],hideOnScroll:!1},footer:{style:"light",links:[{title:"Docs",items:[{label:"Contribute",to:"/docs"}]},{title:"Community",items:[{label:"Matrix",href:"https://matrix.to/#/!TiDqlLmEUaXqTemaLc:matrix.org?via=matrix.org"},{label:"Mastodon",href:"https://fosstodon.org/@sovereigncloudstack"}]},{title:"More",items:[{label:"GitHub",href:"https://github.com/SovereignCloudStack/docs"}]}],copyright:"Sovereign Cloud Stack, SCS and the logo are registered trademarks of the Open Source Business Alliance e.V. \u2014 Other trademarks are property of their respective owners."},prism:{theme:{plain:{color:"#F8F8F2",backgroundColor:"#282A36"},styles:[{types:["prolog","constant","builtin"],style:{color:"rgb(189, 147, 249)"}},{types:["inserted","function"],style:{color:"rgb(80, 250, 123)"}},{types:["deleted"],style:{color:"rgb(255, 85, 85)"}},{types:["changed"],style:{color:"rgb(255, 184, 108)"}},{types:["punctuation","symbol"],style:{color:"rgb(248, 248, 242)"}},{types:["string","char","tag","selector"],style:{color:"rgb(255, 121, 198)"}},{types:["keyword","variable"],style:{color:"rgb(189, 147, 249)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(98, 114, 164)"}},{types:["attr-name"],style:{color:"rgb(241, 250, 140)"}}]},darkTheme:{plain:{color:"#F8F8F2",backgroundColor:"#282A36"},styles:[{types:["prolog","constant","builtin"],style:{color:"rgb(189, 147, 249)"}},{types:["inserted","function"],style:{color:"rgb(80, 250, 123)"}},{types:["deleted"],style:{color:"rgb(255, 85, 85)"}},{types:["changed"],style:{color:"rgb(255, 184, 108)"}},{types:["punctuation","symbol"],style:{color:"rgb(248, 248, 242)"}},{types:["string","char","tag","selector"],style:{color:"rgb(255, 121, 198)"}},{types:["keyword","variable"],style:{color:"rgb(189, 147, 249)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(98, 114, 164)"}},{types:["attr-name"],style:{color:"rgb(241, 250, 140)"}}]},additionalLanguages:["powershell","ruby"],magicComments:[{className:"theme-code-block-highlighted-line",line:"highlight-next-line",block:{start:"highlight-start",end:"highlight-end"}}]},matomoAnalytics:{matomoUrl:"https://matomo.scs.community/",siteId:"2",phpLoader:"matomo.php",jsLoader:"matomo.js",disableCookies:!0},colorMode:{defaultMode:"light",disableSwitch:!1,respectPrefersColorScheme:!1},docs:{versionPersistence:"localStorage",sidebar:{hideable:!1,autoCollapseCategories:!1}},tableOfContents:{minHeadingLevel:2,maxHeadingLevel:3},mermaid:{theme:{dark:"dark",light:"default"},options:{}}},themes:["@docusaurus/theme-mermaid",["@easyops-cn/docusaurus-search-local",{hashed:!0,docsDir:["docs","community","standards","dev-docs"],docsRouteBasePath:["docs","community","standards","dev-docs"]}]],baseUrlIssueBanner:!0,onDuplicateRoutes:"warn",staticDirectories:["static"],customFields:{},scripts:[],headTags:[],stylesheets:[],clientModules:[],titleDelimiter:"|",noIndex:!1}},87462:(e,t,n)=>{"use strict";function a(){return a=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var a in n)Object.prototype.hasOwnProperty.call(n,a)&&(e[a]=n[a])}return e},a.apply(this,arguments)}n.d(t,{Z:()=>a})},75068:(e,t,n)=>{"use strict";function a(e,t){return a=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},a(e,t)}function r(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,a(e,t)}n.d(t,{Z:()=>r})},63366:(e,t,n)=>{"use strict";function a(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}n.d(t,{Z:()=>a})},38776:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var a=!0,r="Invariant failed";function o(e,t){if(!e){if(a)throw new Error(r);var n="function"==typeof t?t():t,o=n?"".concat(r,": ").concat(n):r;throw new Error(o)}}},57529:e=>{"use strict";e.exports={}},16887:e=>{"use strict";e.exports=JSON.parse('{"/blog-9f2":{"__comp":"a6aa9e1f","__context":{"plugin":"1c091541"},"sidebar":"814f3328","items":[{"content":"04fe2bfd"}],"metadata":"b2b675dd"},"/blog/archive-d5c":{"__comp":"9e4087bc","__context":{"plugin":"1c091541"},"archive":"b2f554cd"},"/blog/first-blog-post-36f":{"__comp":"ccc49370","__context":{"plugin":"1c091541"},"sidebar":"814f3328","content":"4468ebd1"},"/blog/tags-e00":{"__comp":"01a85c17","__context":{"plugin":"1c091541"},"sidebar":"814f3328","tags":"a7023ddc"},"/blog/tags/community-928":{"__comp":"6875c492","__context":{"plugin":"1c091541"},"sidebar":"814f3328","items":[{"content":"04fe2bfd"}],"tag":"69b09ea9","listMetadata":"afaff11a"},"/blog/tags/howto-1c2":{"__comp":"6875c492","__context":{"plugin":"1c091541"},"sidebar":"814f3328","items":[{"content":"04fe2bfd"}],"tag":"d5ac8ed7","listMetadata":"14c1041d"},"/search-ae7":{"__comp":"1a4e3797","__context":{"plugin":"4129286c"}},"/community-3ce":{"__comp":"1be78505","__context":{"plugin":"f793d2d5"},"versionMetadata":"306a8c6c"},"/community/-28b":{"__comp":"17896441","content":"edc931f8"},"/community/calendar-f00":{"__comp":"17896441","content":"aa0979a6"},"/community/category/contribute-1d0":{"__comp":"14eb3368","categoryGeneratedIndex":"8aa3e7cc"},"/community/cloud-resources/-525":{"__comp":"17896441","content":"1722e234"},"/community/cloud-resources/getting-started-openstack-8a1":{"__comp":"17896441","content":"7bd33c3d"},"/community/cloud-resources/plusserver-gx-scs-caa":{"__comp":"17896441","content":"35fbae7a"},"/community/cloud-resources/wavestack-eb6":{"__comp":"17896441","content":"1f34ee25"},"/community/collaboration-457":{"__comp":"17896441","content":"a0eeb362"},"/community/communication/jitsi-d2a":{"__comp":"17896441","content":"183af61f"},"/community/communication/mailinglists-814":{"__comp":"17896441","content":"aaad657b"},"/community/communication/matrix-70e":{"__comp":"17896441","content":"301607a5"},"/community/contribute/adding-docs-guide-dcc":{"__comp":"17896441","content":"a8f67d60"},"/community/contribute/doc-files-structure-guide-df7":{"__comp":"17896441","content":"29c2cfba"},"/community/contribute/docs-workflow-explanation-04b":{"__comp":"17896441","content":"cffc493c"},"/community/contribute/linting-guide-ce6":{"__comp":"17896441","content":"096c51c8"},"/community/contribute/local-docusaurus-development-guide-458":{"__comp":"17896441","content":"ef9d238d"},"/community/contribute/styleguide-972":{"__comp":"17896441","content":"931040e8"},"/community/contribute/styleguides/ansible_styleguide-445":{"__comp":"17896441","content":"b08c16de"},"/community/github/branchprotection-0e8":{"__comp":"17896441","content":"d227faa6"},"/community/github/dco-and-licenses-8d0":{"__comp":"17896441","content":"39eb4dc7"},"/community/github/tips-and-tricks-285":{"__comp":"17896441","content":"2c42a58f"},"/community/hackathons/checklist-65a":{"__comp":"17896441","content":"49bc3785"},"/community/license-considerations-b75":{"__comp":"17896441","content":"ce756c16"},"/dev-docs-759":{"__comp":"1be78505","__context":{"plugin":"644d3432"},"versionMetadata":"d078bc1c"},"/dev-docs/-c0d":{"__comp":"17896441","content":"5268a994"},"/dev-docs/operations/iam/identity-federation-in-scs-7be":{"__comp":"17896441","content":"24fca748"},"/dev-docs/operations/iam/openstack-federation-via-oidc-c91":{"__comp":"17896441","content":"6a15e24c"},"/dev-docs/operations/operations/zuul-ci-cd-quickstart-user-guide-26d":{"__comp":"17896441","content":"61ce23c3"},"/docs-2e7":{"__comp":"1be78505","__context":{"plugin":"247783bb"},"versionMetadata":"935f2afb"},"/docs/-e7a":{"__comp":"17896441","content":"c377a04b"},"/docs/category/components-f2e":{"__comp":"14eb3368","categoryGeneratedIndex":"f14351c1"},"/docs/category/components-1-f0f":{"__comp":"14eb3368","categoryGeneratedIndex":"65c90e53"},"/docs/category/components-2-781":{"__comp":"14eb3368","categoryGeneratedIndex":"2163574d"},"/docs/category/iaas-layer-429":{"__comp":"14eb3368","categoryGeneratedIndex":"29331985"},"/docs/category/identity-and-access-management-iam-238":{"__comp":"14eb3368","categoryGeneratedIndex":"de0540ff"},"/docs/category/k8s-cluster-api-provider-de7":{"__comp":"14eb3368","categoryGeneratedIndex":"9fb1f91e"},"/docs/category/metering-c3e":{"__comp":"14eb3368","categoryGeneratedIndex":"b840bdcc"},"/docs/category/operating-scs-b51":{"__comp":"14eb3368","categoryGeneratedIndex":"f91986bc"},"/docs/category/releases-d6f":{"__comp":"14eb3368","categoryGeneratedIndex":"3bf9fbe6"},"/docs/category/status-page-api-18b":{"__comp":"14eb3368","categoryGeneratedIndex":"059c4264"},"/docs/container/-a92":{"__comp":"17896441","content":"3ff13a62"},"/docs/container/components/k8s-cluster-api-provider/doc/application-credentials-449":{"__comp":"17896441","content":"0683500c"},"/docs/container/components/k8s-cluster-api-provider/doc/configuration-14c":{"__comp":"17896441","content":"a51c5cdb"},"/docs/container/components/k8s-cluster-api-provider/doc/continuous-integration-caf":{"__comp":"17896441","content":"431e6cfe"},"/docs/container/components/k8s-cluster-api-provider/doc/LoadBalancer-ExtTrafficLocal-6d4":{"__comp":"17896441","content":"421b5e65"},"/docs/container/components/k8s-cluster-api-provider/doc/Maintenance_and_Troubleshooting-aee":{"__comp":"17896441","content":"441ae8e9"},"/docs/container/components/k8s-cluster-api-provider/doc/make-reference-a20":{"__comp":"17896441","content":"a38b6a75"},"/docs/container/components/k8s-cluster-api-provider/doc/overview-3f1":{"__comp":"17896441","content":"a8ea16f4"},"/docs/container/components/k8s-cluster-api-provider/doc/quickstart-315":{"__comp":"17896441","content":"15336817"},"/docs/container/components/k8s-cluster-api-provider/doc/requirements-3b4":{"__comp":"17896441","content":"95d93785"},"/docs/container/components/k8s-cluster-api-provider/doc/roadmap-dde":{"__comp":"17896441","content":"8ba37aa2"},"/docs/container/components/k8s-cluster-api-provider/doc/Upgrade-Guide-16c":{"__comp":"17896441","content":"38b583d2"},"/docs/container/components/k8s-cluster-api-provider/doc/usage/-947":{"__comp":"17896441","content":"95fe5f6c"},"/docs/container/components/k8s-cluster-api-provider/doc/usage/cluster-mgmt-capi-mgmt-node-c59":{"__comp":"17896441","content":"8a671cf8"},"/docs/container/components/k8s-cluster-api-provider/doc/usage/containter-registry-configuration-1cc":{"__comp":"17896441","content":"d6a104fd"},"/docs/container/components/k8s-cluster-api-provider/doc/usage/create-new-cluster-ee0":{"__comp":"17896441","content":"23cd166f"},"/docs/container/components/k8s-cluster-api-provider/doc/usage/custom-ca-bad":{"__comp":"17896441","content":"653904f7"},"/docs/container/components/k8s-cluster-api-provider/doc/usage/gateway-api-2a3":{"__comp":"17896441","content":"739c0ae8"},"/docs/container/components/k8s-cluster-api-provider/doc/usage/harbor-8c4":{"__comp":"17896441","content":"564eabfd"},"/docs/container/components/k8s-cluster-api-provider/doc/usage/managing-many-clusters-4f0":{"__comp":"17896441","content":"dfe27b1e"},"/docs/container/components/k8s-cluster-api-provider/doc/usage/migrate-to-cluster-class-76a":{"__comp":"17896441","content":"d770ad8d"},"/docs/container/components/k8s-cluster-api-provider/doc/usage/multi-az-and-multi-cloud-environments-335":{"__comp":"17896441","content":"42088e64"},"/docs/container/components/k8s-cluster-api-provider/doc/usage/testing-196":{"__comp":"17896441","content":"50963409"},"/docs/container/deployment-examples/a/-2d2":{"__comp":"17896441","content":"83100446"},"/docs/container/deployment-examples/a/hardware-17e":{"__comp":"17896441","content":"fe5fac7c"},"/docs/container/deployment-examples/a/software-3b1":{"__comp":"17896441","content":"0bcc5672"},"/docs/container/guides/guide1-5f1":{"__comp":"17896441","content":"dcf2f717"},"/docs/container/overview/architecture-a46":{"__comp":"17896441","content":"a94c36cd"},"/docs/container/overview/knowledge-ed6":{"__comp":"17896441","content":"f4cdb2d9"},"/docs/faq/-7ca":{"__comp":"17896441","content":"94f31572"},"/docs/getting-started/containerization-f2a":{"__comp":"17896441","content":"cd0ad4f0"},"/docs/getting-started/overview-76a":{"__comp":"17896441","content":"19afbcc8"},"/docs/getting-started/virtualization-23f":{"__comp":"17896441","content":"e44168e5"},"/docs/glossary-949":{"__comp":"17896441","content":"e747ec83"},"/docs/iaas/components/-16c":{"__comp":"17896441","content":"86ee3414"},"/docs/iaas/components/flavor-manager-826":{"__comp":"17896441","content":"88684b71"},"/docs/iaas/components/image-manager-84e":{"__comp":"17896441","content":"da20a34d"},"/docs/iaas/components/project-manager-f3d":{"__comp":"17896441","content":"a708848c"},"/docs/iaas/components/resource-manager-c1c":{"__comp":"17896441","content":"685813dc"},"/docs/iaas/components/sandbox-manager-bb6":{"__comp":"17896441","content":"b8fd74b5"},"/docs/iaas/guides/-77d":{"__comp":"17896441","content":"502adbf6"},"/docs/iaas/guides/configuration-guide/-ab0":{"__comp":"17896441","content":"f0e20cb6"},"/docs/iaas/guides/configuration-guide/ceph-be5":{"__comp":"17896441","content":"6c33bb99"},"/docs/iaas/guides/configuration-guide/commons/-78f":{"__comp":"17896441","content":"3d19221e"},"/docs/iaas/guides/configuration-guide/commons/network-514":{"__comp":"17896441","content":"fd74033a"},"/docs/iaas/guides/configuration-guide/commons/packages-546":{"__comp":"17896441","content":"60fc342f"},"/docs/iaas/guides/configuration-guide/commons/services-bfc":{"__comp":"17896441","content":"df35cf96"},"/docs/iaas/guides/configuration-guide/commons/sshconfig-3ef":{"__comp":"17896441","content":"05e7973d"},"/docs/iaas/guides/configuration-guide/commons/sysctl-4c7":{"__comp":"17896441","content":"e24c1f8d"},"/docs/iaas/guides/configuration-guide/commons/timezone-f6e":{"__comp":"17896441","content":"a51f78bf"},"/docs/iaas/guides/configuration-guide/configuration-repository-d89":{"__comp":"17896441","content":"767805d3"},"/docs/iaas/guides/configuration-guide/inventory-a1b":{"__comp":"17896441","content":"6db2ece2"},"/docs/iaas/guides/configuration-guide/manager-674":{"__comp":"17896441","content":"7f34127d"},"/docs/iaas/guides/configuration-guide/openstack/-7df":{"__comp":"17896441","content":"d0ee365b"},"/docs/iaas/guides/configuration-guide/openstack/horizon-855":{"__comp":"17896441","content":"f385820d"},"/docs/iaas/guides/configuration-guide/openstack/keystone-a4a":{"__comp":"17896441","content":"be01f2a0"},"/docs/iaas/guides/configuration-guide/proxy-215":{"__comp":"17896441","content":"bd8a97c5"},"/docs/iaas/guides/configuration-guide/self-signed-certificates-ec8":{"__comp":"17896441","content":"5b9bf978"},"/docs/iaas/guides/configuration-guide/services/-e17":{"__comp":"17896441","content":"0047ab5d"},"/docs/iaas/guides/deploy-guide/-036":{"__comp":"17896441","content":"09ba26e2"},"/docs/iaas/guides/deploy-guide/bootstrap-171":{"__comp":"17896441","content":"6c4198a1"},"/docs/iaas/guides/deploy-guide/examples/-ce8":{"__comp":"17896441","content":"6f1c571c"},"/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box-47e":{"__comp":"17896441","content":"5565c8ed"},"/docs/iaas/guides/deploy-guide/examples/testbed-061":{"__comp":"17896441","content":"bd319452"},"/docs/iaas/guides/deploy-guide/manager-486":{"__comp":"17896441","content":"6f4a06ca"},"/docs/iaas/guides/deploy-guide/provisioning-c75":{"__comp":"17896441","content":"67dad519"},"/docs/iaas/guides/deploy-guide/seed-fcd":{"__comp":"17896441","content":"45f4377b"},"/docs/iaas/guides/deploy-guide/services/-7ed":{"__comp":"17896441","content":"89ad43f4"},"/docs/iaas/guides/deploy-guide/services/ceph-e38":{"__comp":"17896441","content":"1f1274a0"},"/docs/iaas/guides/deploy-guide/services/infrastructure-b23":{"__comp":"17896441","content":"589280f5"},"/docs/iaas/guides/deploy-guide/services/logging-monitoring-878":{"__comp":"17896441","content":"abecca15"},"/docs/iaas/guides/deploy-guide/services/network-6ec":{"__comp":"17896441","content":"4b015924"},"/docs/iaas/guides/deploy-guide/services/openstack-64d":{"__comp":"17896441","content":"f2a59390"},"/docs/iaas/guides/operations-guide/-e79":{"__comp":"17896441","content":"5bd7bc3b"},"/docs/iaas/guides/operations-guide/ceph-f59":{"__comp":"17896441","content":"5d54de92"},"/docs/iaas/guides/operations-guide/manager/-ab9":{"__comp":"17896441","content":"8fc094a7"},"/docs/iaas/guides/operations-guide/manager/apply-3c2":{"__comp":"17896441","content":"abfb0638"},"/docs/iaas/guides/operations-guide/manager/console-6ab":{"__comp":"17896441","content":"670b12e1"},"/docs/iaas/guides/operations-guide/manager/log-75f":{"__comp":"17896441","content":"96f8fd49"},"/docs/iaas/guides/operations-guide/manager/task-25a":{"__comp":"17896441","content":"6d890b23"},"/docs/iaas/guides/operations-guide/openstack/-993":{"__comp":"17896441","content":"d1aa920e"},"/docs/iaas/guides/operations-guide/openstack/cinder-207":{"__comp":"17896441","content":"a12f05ab"},"/docs/iaas/guides/operations-guide/openstack/day2-operations/-57d":{"__comp":"17896441","content":"08bf2ad2"},"/docs/iaas/guides/operations-guide/openstack/day2-operations/flavor-manager-3a0":{"__comp":"17896441","content":"be96733a"},"/docs/iaas/guides/operations-guide/openstack/day2-operations/image-manager-ce1":{"__comp":"17896441","content":"cf2bf9cf"},"/docs/iaas/guides/operations-guide/openstack/day2-operations/project-manager-956":{"__comp":"17896441","content":"7aa2de41"},"/docs/iaas/guides/operations-guide/openstack/day2-operations/resource-manager-dcb":{"__comp":"17896441","content":"684abe8e"},"/docs/iaas/guides/operations-guide/openstack/day2-operations/sandbox-manager-d79":{"__comp":"17896441","content":"082859ca"},"/docs/iaas/guides/operations-guide/openstack/octavia-990":{"__comp":"17896441","content":"f40b2df0"},"/docs/iaas/guides/other-guides/-a47":{"__comp":"17896441","content":"26dd306b"},"/docs/iaas/guides/other-guides/contributor-guide-b3b":{"__comp":"17896441","content":"5b235e06"},"/docs/iaas/guides/other-guides/developer-guide/-a72":{"__comp":"17896441","content":"40d9468c"},"/docs/iaas/guides/other-guides/developer-guide/releases-cb8":{"__comp":"17896441","content":"49993131"},"/docs/iaas/guides/other-guides/developer-guide/scripts-7c2":{"__comp":"17896441","content":"da1a5473"},"/docs/iaas/guides/other-guides/developer-guide/zuul-ci-c98":{"__comp":"17896441","content":"6e7e1a19"},"/docs/iaas/guides/other-guides/style-guide-ef3":{"__comp":"17896441","content":"f0b55dfe"},"/docs/iaas/guides/other-guides/zuul-48d":{"__comp":"17896441","content":"3a00f46c"},"/docs/iaas/guides/troubleshooting-guide/-597":{"__comp":"17896441","content":"ac087500"},"/docs/iaas/guides/troubleshooting-guide/manager-7cd":{"__comp":"17896441","content":"eb99bfed"},"/docs/iaas/guides/troubleshooting-guide/openstack-c90":{"__comp":"17896441","content":"c2f44c5f"},"/docs/iaas/guides/upgrade-guide/-bf8":{"__comp":"17896441","content":"fff9aecb"},"/docs/iaas/guides/upgrade-guide/ceph-e67":{"__comp":"17896441","content":"070e71f0"},"/docs/iaas/guides/upgrade-guide/docker-fff":{"__comp":"17896441","content":"26bc5a46"},"/docs/iaas/guides/upgrade-guide/infrastructure-4d7":{"__comp":"17896441","content":"dbde4c02"},"/docs/iaas/guides/upgrade-guide/logging-monitoring-02d":{"__comp":"17896441","content":"c75320ff"},"/docs/iaas/guides/upgrade-guide/manager-f3c":{"__comp":"17896441","content":"d5256f0a"},"/docs/iaas/guides/upgrade-guide/network-1ca":{"__comp":"17896441","content":"fa7c4c29"},"/docs/iaas/guides/upgrade-guide/openstack-f09":{"__comp":"17896441","content":"6d32cafb"},"/docs/iaas/overview/architecture-3e8":{"__comp":"17896441","content":"9f356e5b"},"/docs/iaas/overview/compute-5a3":{"__comp":"17896441","content":"73956345"},"/docs/iaas/overview/knowledge-df1":{"__comp":"17896441","content":"0a757274"},"/docs/iaas/overview/network-dd9":{"__comp":"17896441","content":"3e493f26"},"/docs/iaas/overview/storage-94d":{"__comp":"17896441","content":"c0cd111c"},"/docs/iam/intra-SCS-federation-setup-description-for-osism-doc-operations-bdd":{"__comp":"17896441","content":"88f37d1b"},"/docs/operating-scs/audits/-497":{"__comp":"17896441","content":"36f749d2"},"/docs/operating-scs/components/status-page/docs/component_overview-8e0":{"__comp":"17896441","content":"e57b2c87"},"/docs/operating-scs/components/status-page/docs/components-e16":{"__comp":"17896441","content":"99b53e63"},"/docs/operating-scs/components/status-page/docs/levels_of_consensus-381":{"__comp":"17896441","content":"53596370"},"/docs/operating-scs/components/status-page/docs/overview-17d":{"__comp":"17896441","content":"9d187656"},"/docs/operating-scs/guides/guide-1-7e5":{"__comp":"17896441","content":"9e10b8d6"},"/docs/operating-scs/incident-management/-c12":{"__comp":"17896441","content":"09adb968"},"/docs/operating-scs/lifecycle-management/-cb7":{"__comp":"17896441","content":"a9f40339"},"/docs/operating-scs/logging/-d7c":{"__comp":"17896441","content":"343a1afc"},"/docs/operating-scs/metering/meter_configuration-5aa":{"__comp":"17896441","content":"41ab9761"},"/docs/operating-scs/monitoring/-66c":{"__comp":"17896441","content":"15e4a743"},"/docs/operating-scs/overview-6df":{"__comp":"17896441","content":"09cf625e"},"/docs/releases/Release0-487":{"__comp":"17896441","content":"7b787d81"},"/docs/releases/Release1-066":{"__comp":"17896441","content":"a3e11933"},"/docs/releases/Release2-0aa":{"__comp":"17896441","content":"7f1a31c3"},"/docs/releases/Release3-33d":{"__comp":"17896441","content":"5c201b0a"},"/docs/releases/Release4-352":{"__comp":"17896441","content":"437bedbc"},"/docs/releases/Release5-01d":{"__comp":"17896441","content":"a0b1bbd7"},"/docs/releases/ReleaseX-138":{"__comp":"17896441","content":"1bc22123"},"/docs/standards/-41f":{"__comp":"17896441","content":"89176cae"},"/standards-e22":{"__comp":"1be78505","__context":{"plugin":"b12ed0df"},"versionMetadata":"52e3f5ca"},"/standards/-4e4":{"__comp":"17896441","content":"929c4e1b"},"/standards/certification/certified-clouds-a1c":{"__comp":"17896441","content":"eaf80524"},"/standards/certification/get-certified-d64":{"__comp":"17896441","content":"ddebfa81"},"/standards/certification/overview-60a":{"__comp":"17896441","content":"0ea173ba"},"/standards/certification/subjects-versions-494":{"__comp":"17896441","content":"7e793606"},"/standards/decision-records-16a":{"__comp":"14eb3368","categoryGeneratedIndex":"5ad6acbd"},"/standards/global/-033":{"__comp":"17896441","content":"38c9ef35"},"/standards/global/scs-0001-cf3":{"__comp":"17896441","content":"f9ec068e"},"/standards/global/scs-0002-1c7":{"__comp":"17896441","content":"a70dabb3"},"/standards/global/scs-0003-e5c":{"__comp":"17896441","content":"7e7cf0e4"},"/standards/iaas/-a82":{"__comp":"17896441","content":"3f3928dc"},"/standards/iaas/scs-0100-595":{"__comp":"17896441","content":"f1715aef"},"/standards/iaas/scs-0101-31e":{"__comp":"17896441","content":"477ed06d"},"/standards/iaas/scs-0102-450":{"__comp":"17896441","content":"184e5ead"},"/standards/iaas/scs-0103-837":{"__comp":"17896441","content":"6ad9ab45"},"/standards/iaas/scs-0104-d89":{"__comp":"17896441","content":"97b1504a"},"/standards/iam/-6c8":{"__comp":"17896441","content":"abb47370"},"/standards/iam/scs-0300-e37":{"__comp":"17896441","content":"23e62f09"},"/standards/kaas/-576":{"__comp":"17896441","content":"f8869d03"},"/standards/kaas/scs-0210-d68":{"__comp":"17896441","content":"422fff4b"},"/standards/kaas/scs-0211-fe7":{"__comp":"17896441","content":"59307471"},"/standards/ops/-49c":{"__comp":"17896441","content":"178df98e"},"/standards/ops/scs-0412-b48":{"__comp":"17896441","content":"03c8668f"},"/standards/scs-0001-v1-sovereign-cloud-standards-413":{"__comp":"17896441","content":"1c894279"},"/standards/scs-0002-v1-standards-docs-org-11e":{"__comp":"17896441","content":"5b402526"},"/standards/scs-0002-v2-standards-docs-org-37a":{"__comp":"17896441","content":"7b449e09"},"/standards/scs-0003-v1-sovereign-cloud-standards-yaml-98f":{"__comp":"17896441","content":"32227eef"},"/standards/scs-0100-v1-flavor-naming-c40":{"__comp":"17896441","content":"9d1324c7"},"/standards/scs-0100-v2-flavor-naming-b94":{"__comp":"17896441","content":"cd4fb20e"},"/standards/scs-0100-v3-flavor-naming-47a":{"__comp":"17896441","content":"061d8128"},"/standards/scs-0101-v1-entropy-7f1":{"__comp":"17896441","content":"63c8fde6"},"/standards/scs-0102-v1-image-metadata-1b7":{"__comp":"17896441","content":"ad39e84b"},"/standards/scs-0103-v1-standard-flavors-4e4":{"__comp":"17896441","content":"526992cf"},"/standards/scs-0104-v1-standard-images-0bb":{"__comp":"17896441","content":"a4833b52"},"/standards/scs-0110-981":{"__comp":"14eb3368","categoryGeneratedIndex":"fd8cbe72"},"/standards/scs-0110-v1-ssd-flavors-17d":{"__comp":"17896441","content":"1109f10b"},"/standards/scs-0111-v1-volume-type-decisions-519":{"__comp":"17896441","content":"699c0e5c"},"/standards/scs-0210-v1-k8s-new-version-policy-72c":{"__comp":"17896441","content":"c5533f5e"},"/standards/scs-0210-v2-k8s-version-policy-5b6":{"__comp":"17896441","content":"f5b4e375"},"/standards/scs-0211-v1-kaas-default-storage-class-bf3":{"__comp":"17896441","content":"07d3bac7"},"/standards/scs-0212-v1-requirements-for-container-registry-116":{"__comp":"17896441","content":"a71bcd95"},"/standards/scs-0213-v1-k8s-nodes-anti-affinity-403":{"__comp":"17896441","content":"9278f3d6"},"/standards/scs-0213-v1-requirements-for-testing-cluster-stacks-f28":{"__comp":"17896441","content":"a12a2e44"},"/standards/scs-0214-v1-k8s-node-distribution-b65":{"__comp":"17896441","content":"27f24dfd"},"/standards/scs-0300-v1-requirements-for-sso-identity-federation-ec7":{"__comp":"17896441","content":"f68824be"},"/standards/scs-0301-v1-naming-conventions-c1b":{"__comp":"17896441","content":"d59f7d52"},"/standards/scs-0302-v1-domain-manager-role-987":{"__comp":"17896441","content":"4e6fa974"},"/standards/scs-0400-v1-status-page-create-decision-5d8":{"__comp":"17896441","content":"eea6a18c"},"/standards/scs-0401-v1-status-page-reference-implementation-decision-3b2":{"__comp":"17896441","content":"dfce392e"},"/standards/scs-0402-v1-status-page-openapi-spec-decision-3ef":{"__comp":"17896441","content":"fd34a958"},"/standards/scs-0410-v1-gnocchi-as-metering-database-4d3":{"__comp":"17896441","content":"0dfeccb2"},"/standards/scs-0411-v1-publishing_method_for_metering_data-231":{"__comp":"17896441","content":"1276f6ab"},"/standards/scs-0412-v1-metering-json-3c8":{"__comp":"17896441","content":"a15c4cb6"},"/standards/scs-XXXX-vN-template-4a0":{"__comp":"17896441","content":"ed24060c"},"/standards/standards/overview-900":{"__comp":"17896441","content":"5830dd0a"},"/standards/standards/scs-0111-2f9":{"__comp":"14eb3368","categoryGeneratedIndex":"e5a53cb8"},"/standards/standards/scs-0212-ddd":{"__comp":"14eb3368","categoryGeneratedIndex":"16aafd28"},"/standards/standards/scs-0213-f5c":{"__comp":"14eb3368","categoryGeneratedIndex":"d755aabc"},"/standards/standards/scs-0301-6e7":{"__comp":"14eb3368","categoryGeneratedIndex":"0860b861"},"/standards/standards/scs-0400-b78":{"__comp":"14eb3368","categoryGeneratedIndex":"c490e74d"},"/standards/standards/scs-0401-445":{"__comp":"14eb3368","categoryGeneratedIndex":"a58a5045"},"/standards/standards/scs-0402-a78":{"__comp":"14eb3368","categoryGeneratedIndex":"6e35e719"},"/standards/standards/scs-0410-6f0":{"__comp":"14eb3368","categoryGeneratedIndex":"495e0345"},"/standards/standards/scs-0411-049":{"__comp":"14eb3368","categoryGeneratedIndex":"98f69cae"},"/-39f":{"__comp":"1df93b7f","__context":{"plugin":"a7434565"},"config":"5e9f5e1a"}}')}},e=>{e.O(0,[532],(()=>{return t=97221,e(e.s=t);var t}));e.O()}]); \ No newline at end of file diff --git a/assets/js/main.9d213e76.js.LICENSE.txt b/assets/js/main.9d213e76.js.LICENSE.txt new file mode 100644 index 0000000000..2c826395b9 --- /dev/null +++ b/assets/js/main.9d213e76.js.LICENSE.txt @@ -0,0 +1,125 @@ +/* +object-assign +(c) Sindre Sorhus +@license MIT +*/ + +/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress + * @license MIT */ + +/*! + * lunr.Builder + * Copyright (C) 2020 Oliver Nightingale + */ + +/*! + * lunr.Index + * Copyright (C) 2020 Oliver Nightingale + */ + +/*! + * lunr.Pipeline + * Copyright (C) 2020 Oliver Nightingale + */ + +/*! + * lunr.Set + * Copyright (C) 2020 Oliver Nightingale + */ + +/*! + * lunr.TokenSet + * Copyright (C) 2020 Oliver Nightingale + */ + +/*! + * lunr.Vector + * Copyright (C) 2020 Oliver Nightingale + */ + +/*! + * lunr.stemmer + * Copyright (C) 2020 Oliver Nightingale + * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt + */ + +/*! + * lunr.stopWordFilter + * Copyright (C) 2020 Oliver Nightingale + */ + +/*! + * lunr.tokenizer + * Copyright (C) 2020 Oliver Nightingale + */ + +/*! + * lunr.trimmer + * Copyright (C) 2020 Oliver Nightingale + */ + +/*! + * lunr.utils + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * @license React + * use-sync-external-store-shim.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** + * Prism: Lightweight, robust, elegant syntax highlighting + * + * @license MIT <https://opensource.org/licenses/MIT> + * @author Lea Verou <https://lea.verou.me> + * @namespace + * @public + */ + +/** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 + * Copyright (C) 2020 Oliver Nightingale + * @license MIT + */ + +/** @license React v0.20.2 + * scheduler.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** @license React v16.13.1 + * react-is.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** @license React v17.0.2 + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** @license React v17.0.2 + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ diff --git a/assets/js/runtime~main.21e39613.js b/assets/js/runtime~main.21e39613.js new file mode 100644 index 0000000000..56c9f84f92 --- /dev/null +++ b/assets/js/runtime~main.21e39613.js @@ -0,0 +1 @@ +(()=>{"use strict";var e,a,f,c,d,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var f=t[e]={exports:{}};return b[e].call(f.exports,f,f.exports,r),f.exports}r.m=b,e=[],r.O=(a,f,c,d)=>{if(!f){var b=1/0;for(i=0;i<e.length;i++){f=e[i][0],c=e[i][1],d=e[i][2];for(var t=!0,o=0;o<f.length;o++)(!1&d||b>=d)&&Object.keys(r.O).every((e=>r.O[e](f[o])))?f.splice(o--,1):(t=!1,d<b&&(b=d));if(t){e.splice(i--,1);var n=c();void 0!==n&&(a=n)}}return a}d=d||0;for(var i=e.length;i>0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[f,c,d]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,c){if(1&c&&(e=this(e)),8&c)return e;if("object"==typeof e&&e){if(4&c&&e.__esModule)return e;if(16&c&&"function"==typeof e.then)return e}var d=Object.create(null);r.r(d);var b={};a=a||[null,f({}),f([]),f(f)];for(var t=2&c&&e;"object"==typeof t&&!~a.indexOf(t);t=f(t))Object.getOwnPropertyNames(t).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,r.d(d,b),d},r.d=(e,a)=>{for(var f in a)r.o(a,f)&&!r.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,f)=>(r.f[f](e,a),a)),[])),r.u=e=>"assets/js/"+({53:"935f2afb",87:"6f1c571c",116:"301607a5",200:"441ae8e9",261:"a9f40339",297:"0a757274",342:"4e6fa974",361:"e44168e5",401:"7e7cf0e4",498:"69b09ea9",503:"dfe27b1e",531:"b08c16de",533:"b2b675dd",547:"fff9aecb",570:"d5256f0a",642:"fd74033a",713:"061d8128",739:"183af61f",788:"24fca748",867:"53596370",953:"a8ea16f4",969:"c5533f5e",972:"5b235e06",984:"a0eeb362",987:"73956345",1006:"589280f5",1085:"cf2bf9cf",1114:"a38b6a75",1156:"5ad6acbd",1265:"c490e74d",1266:"096c51c8",1294:"0683500c",1302:"61ce23c3",1477:"b2f554cd",1481:"95d93785",1498:"7bd33c3d",1505:"5d54de92",1548:"5b402526",1653:"29331985",1713:"a7023ddc",1756:"09cf625e",1757:"3e493f26",1770:"5bd7bc3b",1775:"477ed06d",1776:"f5b4e375",1849:"bd319452",1893:"5c201b0a",1906:"fd34a958",1907:"082859ca",1949:"fa7c4c29",2019:"fe5fac7c",2023:"ef9d238d",2085:"431e6cfe",2114:"5b9bf978",2122:"aaad657b",2144:"d6a104fd",2199:"d755aabc",2272:"c75320ff",2286:"6e35e719",2291:"e747ec83",2443:"97b1504a",2447:"a51f78bf",2491:"059c4264",2501:"f68824be",2517:"a8f67d60",2527:"04fe2bfd",2535:"814f3328",2602:"9fb1f91e",2656:"35fbae7a",2661:"aa0979a6",2690:"de0540ff",2711:"08bf2ad2",2821:"526992cf",2878:"afaff11a",2909:"bd8a97c5",2936:"4468ebd1",2966:"96f8fd49",2990:"39eb4dc7",3006:"685813dc",3089:"a6aa9e1f",3178:"a70dabb3",3197:"1722e234",3200:"6e7e1a19",3237:"1df93b7f",3271:"a94c36cd",3282:"89176cae",3286:"8fc094a7",3298:"27f24dfd",3299:"05e7973d",3356:"f14351c1",3414:"dfce392e",3438:"d770ad8d",3454:"1f1274a0",3478:"9278f3d6",3518:"a71bcd95",3608:"9e4087bc",3675:"f4cdb2d9",3722:"94f31572",3750:"8aa3e7cc",3778:"abecca15",3826:"15336817",3836:"e24c1f8d",3852:"52e3f5ca",3897:"eaf80524",3907:"2163574d",3946:"09adb968",3959:"45f4377b",3973:"d227faa6",3976:"67dad519",4013:"01a85c17",4050:"a12a2e44",4081:"6f4a06ca",4165:"184e5ead",4166:"cd0ad4f0",4227:"d0ee365b",4233:"88f37d1b",4234:"c0cd111c",4245:"cd4fb20e",4250:"5268a994",4337:"8a671cf8",4338:"50963409",4342:"653904f7",4466:"dbde4c02",4476:"4b015924",4477:"14c1041d",4504:"a58a5045",4521:"d5ac8ed7",4561:"60fc342f",4573:"6d890b23",4665:"7b449e09",4687:"cffc493c",4726:"abfb0638",4819:"739c0ae8",4855:"9d1324c7",4898:"7e793606",4938:"a708848c",4945:"83100446",4981:"6c33bb99",5012:"0047ab5d",5028:"7aa2de41",5038:"ddebfa81",5053:"eea6a18c",5101:"699c0e5c",5156:"4129286c",5183:"2c42a58f",5230:"e57b2c87",5258:"0ea173ba",5482:"421b5e65",5516:"89ad43f4",5598:"da1a5473",5645:"98f69cae",5646:"0860b861",5729:"b12ed0df",5739:"f8869d03",5777:"41ab9761",5829:"f2a59390",5830:"df35cf96",5869:"3ff13a62",5880:"09ba26e2",5889:"178df98e",5912:"502adbf6",5923:"0dfeccb2",5929:"e5a53cb8",5938:"32227eef",5942:"9d187656",5961:"eb99bfed",5980:"36f749d2",5988:"929c4e1b",6002:"a51c5cdb",6055:"26dd306b",6103:"ccc49370",6152:"88684b71",6160:"edc931f8",6264:"63c8fde6",6271:"be96733a",6303:"070e71f0",6309:"495e0345",6336:"1c894279",6401:"f1715aef",6412:"a12f05ab",6470:"d1aa920e",6490:"23cd166f",6686:"6c4198a1",6730:"65c90e53",6815:"f0e20cb6",6846:"1276f6ab",6860:"7b787d81",6861:"42088e64",6870:"f9ec068e",6876:"3a00f46c",6892:"0bcc5672",6926:"be01f2a0",6971:"c377a04b",6990:"6db2ece2",6995:"da20a34d",7039:"19afbcc8",7046:"437bedbc",7060:"49993131",7103:"343a1afc",7105:"ad39e84b",7165:"fd8cbe72",7170:"d078bc1c",7190:"1bc22123",7214:"dcf2f717",7321:"f40b2df0",7334:"b840bdcc",7472:"1109f10b",7477:"15e4a743",7616:"306a8c6c",7645:"a7434565",7701:"d59f7d52",7762:"c2f44c5f",7836:"670b12e1",7856:"3d19221e",7859:"644d3432",7918:"17896441",7920:"1a4e3797",8049:"1f34ee25",8086:"95fe5f6c",8106:"5565c8ed",8116:"40d9468c",8152:"ed24060c",8205:"f91986bc",8211:"b8fd74b5",8235:"6ad9ab45",8271:"1c091541",8275:"03c8668f",8428:"23e62f09",8503:"a4833b52",8505:"38c9ef35",8581:"07d3bac7",8604:"29c2cfba",8610:"6875c492",8645:"9e10b8d6",8679:"5830dd0a",8681:"ce756c16",8752:"abb47370",8809:"86ee3414",8848:"6d32cafb",8872:"a15c4cb6",8888:"931040e8",8908:"f385820d",8934:"422fff4b",8994:"8ba37aa2",9003:"3f3928dc",9042:"f0b55dfe",9080:"f793d2d5",9279:"9f356e5b",9327:"a3e11933",9334:"247783bb",9398:"a0b1bbd7",9468:"564eabfd",9477:"16aafd28",9478:"26bc5a46",9514:"1be78505",9564:"ac087500",9658:"6a15e24c",9668:"767805d3",9693:"7f34127d",9719:"38b583d2",9729:"684abe8e",9742:"99b53e63",9810:"49bc3785",9817:"14eb3368",9818:"7f1a31c3",9896:"59307471",9899:"3bf9fbe6"}[e]||e)+"."+{53:"62081e2d",87:"221182a2",116:"9abced11",200:"4fc54eca",261:"71286c0d",297:"443da196",342:"528e633e",361:"8403ffa6",401:"12d3736a",498:"9965528d",503:"573cbd5b",531:"3569e2f3",533:"d31b93c7",547:"216c5323",570:"ead868d7",642:"43f2e499",713:"3afef4fd",739:"acca119c",788:"05fabdc8",867:"a38fddc7",904:"c767a1e2",953:"8d2c7e70",969:"ff101166",972:"ed305ad4",984:"9541cb2a",987:"ebd80645",1006:"5bb03a5e",1085:"f4845141",1114:"f555d2a8",1156:"603ce1a3",1265:"32f50109",1266:"d7561d62",1294:"2b8b2a8c",1302:"bb3640ae",1477:"9dc96d6c",1481:"1a6fd97a",1498:"7bf609e7",1505:"69868db2",1548:"4c477e61",1653:"4f0161cb",1713:"37c6ea90",1756:"1e69a60f",1757:"8bc7968d",1770:"6f984540",1775:"df0a39b2",1776:"3677f5dc",1849:"5e3ee300",1893:"9f1a2f88",1906:"fe509446",1907:"7f7eaa73",1949:"5326d7fa",2019:"8e37e6d4",2023:"47a1d3f2",2085:"2c1b1bfb",2114:"423a0463",2122:"701f6b3f",2144:"5042bce1",2199:"ad59fddc",2272:"8107d9f1",2286:"32fa9b7d",2291:"fe9df707",2443:"b1e7ce48",2447:"66f3f342",2491:"3f0b191f",2501:"99ea73af",2517:"710bcfa2",2527:"11a803b5",2535:"146ae6f7",2602:"1f39b355",2656:"de4a7feb",2661:"0d55683d",2690:"3766e6e4",2711:"03b3f319",2821:"021d92b1",2878:"de4f00b8",2909:"cbf09d3b",2936:"8749ca1b",2966:"1849021a",2990:"68678439",3006:"4342e07f",3089:"31d56e6b",3178:"8edceb88",3197:"839a439e",3200:"3537e037",3237:"975423cf",3271:"83a287d6",3282:"00a7820f",3286:"5adfaa2c",3298:"c21ec51f",3299:"e9b6c205",3356:"a849afd8",3414:"26c34b2f",3438:"52adb3ce",3454:"26037ab8",3478:"bdbbd293",3518:"bdd15d3b",3608:"41d5876d",3675:"de0eb0fa",3722:"2cd0b599",3750:"d48d075e",3778:"d865e5c1",3826:"ef571073",3836:"cc8bc8ba",3852:"2c36c8fb",3897:"07fe535f",3907:"81ce3d02",3946:"d5282853",3959:"7e84abe9",3973:"82a9ebe7",3976:"3679338b",4013:"9d138910",4050:"e23f917a",4081:"9c263a3e",4165:"1c8c2a49",4166:"5060300f",4227:"c08542e5",4233:"ffc0586d",4234:"82864e7a",4245:"cf9156e9",4250:"b87d3303",4337:"8561a958",4338:"2fac71a6",4342:"3520249c",4466:"92aaf750",4476:"e7f9ce9f",4477:"4d50ef28",4504:"5a291913",4521:"92329f52",4561:"dae6297c",4573:"b42a27b6",4665:"e32dd5c7",4687:"ba4544e9",4726:"be57d877",4819:"eef7e9df",4855:"3b4cab1d",4898:"77dcc9f1",4938:"10af8687",4945:"3577da70",4972:"908ebfbb",4981:"28960205",5012:"2b37419c",5028:"bfeda755",5038:"a9802837",5053:"1d76c598",5101:"2f09704f",5156:"516ed141",5183:"ff2f3274",5230:"e698bb2d",5258:"bcf8204e",5482:"74a01f86",5516:"2d8e789d",5525:"640f1c90",5598:"e602bded",5645:"ab53b220",5646:"421e2adb",5729:"5be3e843",5739:"86281479",5777:"6a8fa08f",5829:"ffc7a27c",5830:"7b771da6",5869:"e2f45d6a",5880:"70c31ef5",5889:"b749cc52",5912:"68fb27d5",5923:"fb23b4b5",5929:"2a2a4151",5938:"91ab4d35",5942:"4abc6493",5961:"1ded4987",5980:"ee037847",5988:"79dd42bc",6002:"e128bc50",6048:"9ebfb35f",6055:"dca4caf2",6103:"fb6007ce",6152:"a421c8ed",6160:"0c3dcc30",6264:"64de5717",6271:"27792029",6303:"58103e04",6309:"3521aa1c",6316:"97d4676f",6336:"6c35e1a4",6401:"4e0027fc",6412:"fe72d9a5",6470:"0ef065cf",6490:"4301e5b2",6686:"ff28e6e9",6730:"e76dec9c",6815:"93b69c09",6846:"575dfd89",6860:"a1ba85d0",6861:"b8cc5f7f",6870:"31f29287",6876:"eaf48fb4",6892:"c34c9f3f",6926:"1174b07a",6971:"fec5be02",6990:"bdb3ea87",6995:"30617762",7039:"847c21ab",7046:"714985c6",7060:"ee5e1f6f",7103:"185eefda",7105:"2dc71df5",7165:"223d7825",7170:"9daaac60",7190:"4d28e76e",7214:"cfa622d3",7321:"678c2584",7334:"a3f773d3",7472:"74701188",7477:"0af51b01",7616:"46bc9fa6",7645:"30e719e3",7701:"7408da31",7724:"5e8ea986",7762:"85d26394",7836:"9f8c72b5",7856:"556718cc",7859:"6b01bab3",7918:"7488da5b",7920:"9cf10c41",8049:"36ef8ed2",8086:"61193966",8106:"3ad273b7",8116:"d7025893",8152:"115358fc",8205:"9a1b755b",8211:"899b29ef",8235:"1eada8ec",8271:"8267c1b7",8275:"49e46fdd",8428:"0000ff74",8443:"eb0070b3",8503:"43cd4468",8505:"2ecdc10a",8581:"51a7e5f9",8604:"1c8a2c33",8610:"177d3290",8645:"a1122053",8679:"62787c53",8681:"116ea445",8752:"83d4a1df",8809:"80d0289f",8848:"417ec17e",8872:"3f6510d3",8888:"21c93343",8908:"2967b809",8934:"dddbd424",8954:"a36c6917",8994:"72eb127d",9003:"b46b088f",9042:"1cf7d917",9080:"c5d3177c",9279:"0298bb37",9327:"25ca3db0",9334:"49d074f5",9398:"f2667178",9468:"ad788772",9477:"b86ae6c0",9478:"56d13ab6",9487:"e7898b96",9514:"c760445e",9564:"5526b6b8",9658:"e21634b6",9668:"06228b2e",9693:"ae52c4fe",9719:"5ce52315",9729:"5aee6941",9742:"b234e41b",9810:"51b02e13",9817:"75e9f711",9818:"0f6888d8",9896:"5353ba55",9899:"8f219a6a"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),c={},d="docs:",r.l=(e,a,f,b)=>{if(c[e])c[e].push(a);else{var t,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i<n.length;i++){var u=n[i];if(u.getAttribute("src")==e||u.getAttribute("data-webpack")==d+f){t=u;break}}t||(o=!0,(t=document.createElement("script")).charset="utf-8",t.timeout=120,r.nc&&t.setAttribute("nonce",r.nc),t.setAttribute("data-webpack",d+f),t.src=e),c[e]=[a];var l=(a,f)=>{t.onerror=t.onload=null,clearTimeout(s);var d=c[e];if(delete c[e],t.parentNode&&t.parentNode.removeChild(t),d&&d.forEach((e=>e(f))),a)return a(f)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/",r.gca=function(e){return e={15336817:"3826",17896441:"7918",29331985:"1653",49993131:"7060",50963409:"4338",53596370:"867",59307471:"9896",73956345:"987",83100446:"4945","935f2afb":"53","6f1c571c":"87","301607a5":"116","441ae8e9":"200",a9f40339:"261","0a757274":"297","4e6fa974":"342",e44168e5:"361","7e7cf0e4":"401","69b09ea9":"498",dfe27b1e:"503",b08c16de:"531",b2b675dd:"533",fff9aecb:"547",d5256f0a:"570",fd74033a:"642","061d8128":"713","183af61f":"739","24fca748":"788",a8ea16f4:"953",c5533f5e:"969","5b235e06":"972",a0eeb362:"984","589280f5":"1006",cf2bf9cf:"1085",a38b6a75:"1114","5ad6acbd":"1156",c490e74d:"1265","096c51c8":"1266","0683500c":"1294","61ce23c3":"1302",b2f554cd:"1477","95d93785":"1481","7bd33c3d":"1498","5d54de92":"1505","5b402526":"1548",a7023ddc:"1713","09cf625e":"1756","3e493f26":"1757","5bd7bc3b":"1770","477ed06d":"1775",f5b4e375:"1776",bd319452:"1849","5c201b0a":"1893",fd34a958:"1906","082859ca":"1907",fa7c4c29:"1949",fe5fac7c:"2019",ef9d238d:"2023","431e6cfe":"2085","5b9bf978":"2114",aaad657b:"2122",d6a104fd:"2144",d755aabc:"2199",c75320ff:"2272","6e35e719":"2286",e747ec83:"2291","97b1504a":"2443",a51f78bf:"2447","059c4264":"2491",f68824be:"2501",a8f67d60:"2517","04fe2bfd":"2527","814f3328":"2535","9fb1f91e":"2602","35fbae7a":"2656",aa0979a6:"2661",de0540ff:"2690","08bf2ad2":"2711","526992cf":"2821",afaff11a:"2878",bd8a97c5:"2909","4468ebd1":"2936","96f8fd49":"2966","39eb4dc7":"2990","685813dc":"3006",a6aa9e1f:"3089",a70dabb3:"3178","1722e234":"3197","6e7e1a19":"3200","1df93b7f":"3237",a94c36cd:"3271","89176cae":"3282","8fc094a7":"3286","27f24dfd":"3298","05e7973d":"3299",f14351c1:"3356",dfce392e:"3414",d770ad8d:"3438","1f1274a0":"3454","9278f3d6":"3478",a71bcd95:"3518","9e4087bc":"3608",f4cdb2d9:"3675","94f31572":"3722","8aa3e7cc":"3750",abecca15:"3778",e24c1f8d:"3836","52e3f5ca":"3852",eaf80524:"3897","2163574d":"3907","09adb968":"3946","45f4377b":"3959",d227faa6:"3973","67dad519":"3976","01a85c17":"4013",a12a2e44:"4050","6f4a06ca":"4081","184e5ead":"4165",cd0ad4f0:"4166",d0ee365b:"4227","88f37d1b":"4233",c0cd111c:"4234",cd4fb20e:"4245","5268a994":"4250","8a671cf8":"4337","653904f7":"4342",dbde4c02:"4466","4b015924":"4476","14c1041d":"4477",a58a5045:"4504",d5ac8ed7:"4521","60fc342f":"4561","6d890b23":"4573","7b449e09":"4665",cffc493c:"4687",abfb0638:"4726","739c0ae8":"4819","9d1324c7":"4855","7e793606":"4898",a708848c:"4938","6c33bb99":"4981","0047ab5d":"5012","7aa2de41":"5028",ddebfa81:"5038",eea6a18c:"5053","699c0e5c":"5101","4129286c":"5156","2c42a58f":"5183",e57b2c87:"5230","0ea173ba":"5258","421b5e65":"5482","89ad43f4":"5516",da1a5473:"5598","98f69cae":"5645","0860b861":"5646",b12ed0df:"5729",f8869d03:"5739","41ab9761":"5777",f2a59390:"5829",df35cf96:"5830","3ff13a62":"5869","09ba26e2":"5880","178df98e":"5889","502adbf6":"5912","0dfeccb2":"5923",e5a53cb8:"5929","32227eef":"5938","9d187656":"5942",eb99bfed:"5961","36f749d2":"5980","929c4e1b":"5988",a51c5cdb:"6002","26dd306b":"6055",ccc49370:"6103","88684b71":"6152",edc931f8:"6160","63c8fde6":"6264",be96733a:"6271","070e71f0":"6303","495e0345":"6309","1c894279":"6336",f1715aef:"6401",a12f05ab:"6412",d1aa920e:"6470","23cd166f":"6490","6c4198a1":"6686","65c90e53":"6730",f0e20cb6:"6815","1276f6ab":"6846","7b787d81":"6860","42088e64":"6861",f9ec068e:"6870","3a00f46c":"6876","0bcc5672":"6892",be01f2a0:"6926",c377a04b:"6971","6db2ece2":"6990",da20a34d:"6995","19afbcc8":"7039","437bedbc":"7046","343a1afc":"7103",ad39e84b:"7105",fd8cbe72:"7165",d078bc1c:"7170","1bc22123":"7190",dcf2f717:"7214",f40b2df0:"7321",b840bdcc:"7334","1109f10b":"7472","15e4a743":"7477","306a8c6c":"7616",a7434565:"7645",d59f7d52:"7701",c2f44c5f:"7762","670b12e1":"7836","3d19221e":"7856","644d3432":"7859","1a4e3797":"7920","1f34ee25":"8049","95fe5f6c":"8086","5565c8ed":"8106","40d9468c":"8116",ed24060c:"8152",f91986bc:"8205",b8fd74b5:"8211","6ad9ab45":"8235","1c091541":"8271","03c8668f":"8275","23e62f09":"8428",a4833b52:"8503","38c9ef35":"8505","07d3bac7":"8581","29c2cfba":"8604","6875c492":"8610","9e10b8d6":"8645","5830dd0a":"8679",ce756c16:"8681",abb47370:"8752","86ee3414":"8809","6d32cafb":"8848",a15c4cb6:"8872","931040e8":"8888",f385820d:"8908","422fff4b":"8934","8ba37aa2":"8994","3f3928dc":"9003",f0b55dfe:"9042",f793d2d5:"9080","9f356e5b":"9279",a3e11933:"9327","247783bb":"9334",a0b1bbd7:"9398","564eabfd":"9468","16aafd28":"9477","26bc5a46":"9478","1be78505":"9514",ac087500:"9564","6a15e24c":"9658","767805d3":"9668","7f34127d":"9693","38b583d2":"9719","684abe8e":"9729","99b53e63":"9742","49bc3785":"9810","14eb3368":"9817","7f1a31c3":"9818","3bf9fbe6":"9899"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(a,f)=>{var c=r.o(e,a)?e[a]:void 0;if(0!==c)if(c)f.push(c[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var d=new Promise(((f,d)=>c=e[a]=[f,d]));f.push(c[2]=d);var b=r.p+r.u(a),t=new Error;r.l(b,(f=>{if(r.o(e,a)&&(0!==(c=e[a])&&(e[a]=void 0),c)){var d=f&&("load"===f.type?"missing":f.type),b=f&&f.target&&f.target.src;t.message="Loading chunk "+a+" failed.\n("+d+": "+b+")",t.name="ChunkLoadError",t.type=d,t.request=b,c[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,f)=>{var c,d,b=f[0],t=f[1],o=f[2],n=0;if(b.some((a=>0!==e[a]))){for(c in t)r.o(t,c)&&(r.m[c]=t[c]);if(o)var i=o(r)}for(a&&a(f);n<b.length;n++)d=b[n],r.o(e,d)&&e[d]&&e[d][0](),e[d]=0;return r.O(i)},f=self.webpackChunkdocs=self.webpackChunkdocs||[];f.forEach(a.bind(null,0)),f.push=a.bind(null,f.push.bind(f))})()})(); \ No newline at end of file diff --git a/blog/archive/index.html b/blog/archive/index.html new file mode 100644 index 0000000000..a25b3bee50 --- /dev/null +++ b/blog/archive/index.html @@ -0,0 +1,26 @@ +<!doctype html> +<html lang="en" dir="ltr" class="plugin-blog plugin-id-default" data-has-hydrated="false"> +<head> +<meta charset="UTF-8"> +<meta name="generator" content="Docusaurus v2.4.3"> +<title data-rh="true">Archive | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/blog/atom.xml b/blog/atom.xml new file mode 100644 index 0000000000..c9173ab19a --- /dev/null +++ b/blog/atom.xml @@ -0,0 +1,24 @@ + + + https://docs.scs.community/blog + One platform — standardized, built and operated by many. Blog + 2022-10-28T00:00:00.000Z + https://github.com/jpmonette/feed + + One platform — standardized, built and operated by many. Blog + https://docs.scs.community/img/favicon.ico + + <![CDATA[First Blog Post]]> + https://docs.scs.community/blog/first-blog-post + + 2022-10-28T00:00:00.000Z + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

]]>
+ + Eduard Itrich + https://github.com/itrich + + + +
+
\ No newline at end of file diff --git a/blog/first-blog-post/index.html b/blog/first-blog-post/index.html new file mode 100644 index 0000000000..1d3bafbb71 --- /dev/null +++ b/blog/first-blog-post/index.html @@ -0,0 +1,26 @@ + + + + + +First Blog Post | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

First Blog Post

· One min read
Eduard Itrich

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+ + + + \ No newline at end of file diff --git a/blog/index.html b/blog/index.html new file mode 100644 index 0000000000..91fb326d6d --- /dev/null +++ b/blog/index.html @@ -0,0 +1,26 @@ + + + + + +Blog | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

· One min read
Eduard Itrich

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+ + + + \ No newline at end of file diff --git a/blog/rss.xml b/blog/rss.xml new file mode 100644 index 0000000000..5a7a65d46d --- /dev/null +++ b/blog/rss.xml @@ -0,0 +1,22 @@ + + + + One platform — standardized, built and operated by many. Blog + https://docs.scs.community/blog + One platform — standardized, built and operated by many. Blog + Fri, 28 Oct 2022 00:00:00 GMT + https://validator.w3.org/feed/docs/rss2.html + https://github.com/jpmonette/feed + en + + <![CDATA[First Blog Post]]> + https://docs.scs.community/blog/first-blog-post + https://docs.scs.community/blog/first-blog-post + Fri, 28 Oct 2022 00:00:00 GMT + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

]]>
+ community + howto +
+
+
\ No newline at end of file diff --git a/blog/tags/community/community/index.html b/blog/tags/community/community/index.html new file mode 100644 index 0000000000..fe04b1108a --- /dev/null +++ b/blog/tags/community/community/index.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/blog/tags/community/index.html b/blog/tags/community/index.html new file mode 100644 index 0000000000..09f7403936 --- /dev/null +++ b/blog/tags/community/index.html @@ -0,0 +1,26 @@ + + + + + +One post tagged with "community" | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

One post tagged with "community"

View All Tags

· One min read
Eduard Itrich

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+ + + + \ No newline at end of file diff --git a/blog/tags/howto/index.html b/blog/tags/howto/index.html new file mode 100644 index 0000000000..bbf4847eea --- /dev/null +++ b/blog/tags/howto/index.html @@ -0,0 +1,26 @@ + + + + + +One post tagged with "howto" | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

One post tagged with "howto"

View All Tags

· One min read
Eduard Itrich

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+ + + + \ No newline at end of file diff --git a/blog/tags/index.html b/blog/tags/index.html new file mode 100644 index 0000000000..42422ee288 --- /dev/null +++ b/blog/tags/index.html @@ -0,0 +1,26 @@ + + + + + +Tags | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/community/calendar/index.html b/community/calendar/index.html new file mode 100644 index 0000000000..efa497b0c1 --- /dev/null +++ b/community/calendar/index.html @@ -0,0 +1,26 @@ + + + + + +Calendar | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Calendar

We’re an open community

Our meetings are publicly announced and we are happy to welcome both newcomers and established members alike. You can navigate either through the calendar below or subscribe with your favorite client to https://sovereigncloudstack.github.io/calendar/scs.ics. The calendar is collaboratively maintained on GitHub and new entries, such as a lightning talk, are highly appreciated!

+ + + + \ No newline at end of file diff --git a/community/category/contribute/index.html b/community/category/contribute/index.html new file mode 100644 index 0000000000..9459407a82 --- /dev/null +++ b/community/category/contribute/index.html @@ -0,0 +1,26 @@ + + + + + +Contribute | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/community/cloud-resources/getting-started-openstack/index.html b/community/cloud-resources/getting-started-openstack/index.html new file mode 100644 index 0000000000..52b7e9c49f --- /dev/null +++ b/community/cloud-resources/getting-started-openstack/index.html @@ -0,0 +1,40 @@ + + + + + +Getting Started with OpenStack | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Getting Started with OpenStack

Getting Started with OpenStack CLI

OpenStackClient (CLI)

The OpenStackClient is installable via all major Linux Distributions:

for debian and ubuntu with apt:

sudo apt install python3-openstackclient

for ubuntu with snap openstack CLI is installable too:

sudo snap install openstackclients

[!NOTE] +Versions from Linux repository could be in a stable but old state.

Install it directly via pypi +from upstream is the recommend way.

Here for example RHEL:

sudo dnf install python3 python3-devel gcc python3-pip

Here for example Debian and Ubuntu:

sudo apt install python3-minimal python3-pip python3-venv python3-dev build-essential

Here as example for SUSE

sudo zypper in python3-pip python3-venv python3-dev

Here for example with Apple's MacOS

brew install python3

[!NOTE] +Python installation for windows systems please use the python installation guide +or recommend use the Linux Subsystem WSL

Python Virtualenv

It is also recommended to use virtual environments, here as an example for +Linux and MacOS:

python3 -m venv oscli
source oscli/bin/activate
pip install --upgrade pip
pip install python-openstackclient \
python-cinderclient \
python-designateclient \
python-glanceclient \
python-neutronclient \
python-novaclient \
python-octaviaclient \
python-barbicanclient

For further Information see the OpenStack Project upstream website +python-openstackclient.

This repo holds examples for clouds-public.yaml + clouds.yaml.

Alternatively you can download an OpenRC Environment file when you're logged +in to Horizon:

  • upper right side ➡️ <your login name>
  • OpenStack RC File
$ source ./<your file>-openrc.sh
Please enter your OpenStack Password for project XXX as user YYY:
openstack --help

when you're using clouds.yaml you can specify multiple endpoints and +select the specific endpoint by passing --os-cloud= to the +openstack cmdline or setting OS_CLOUD.

openstack --os-cloud MYCLOUD

or

export OS_CLOUD=MYCLOUD
openstack

OpenStack Client in action inside of the OSISM testbed: +Example OpenStackClient in testbed

Object Storage (S3)

Create AWS like credentials with openstack ec2 credentials create. +If you use libs3, store the access field in S3_ACCESS_KEY_ID and the secret +field inS3_SECRET_ACCESS_KEY and set S3_HOSTNAME=<Object Storage endpoint>. +You will see the same buckets (containers) and objects whether you access your +object store via the swift or via the s3 protocol.

References

+ + + + \ No newline at end of file diff --git a/community/cloud-resources/index.html b/community/cloud-resources/index.html new file mode 100644 index 0000000000..87d06a66f1 --- /dev/null +++ b/community/cloud-resources/index.html @@ -0,0 +1,29 @@ + + + + + +Test and development cloud resources | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Test and development cloud resources

This document gives an overview of the test and development cloud resources currently provided by our partners.

How to request cloud resources

To request access to an existing project, please contact the responsible community member. To apply for a new project, please create a pull request against this document (leave Unique Identifier blank) and assign it to the particular CSP team (e.g. @SovereignCloudStack/plusserver, @SovereignCloudStack/wavecon, ...)

plusserver

Usage

A brief guide on how to use the resources provided by plusserver GmbH can be found here

Users

As suggested in #155 the username for non-"service users" will contain the users github handle and are prefixed with a plusserver default. +prefix-<github handle>

Note +ATM this is not directly connected to the SovereignCloudStack github org membership, accounts will be created manually for now.

Example:

github handleplusserver login
frosty-geeku500924-frosty-geek
fkru500924-fkr

Note +To easy collaboration & transparency within the SCS team all users will have their default_project_id set to p500924-scs-community by default and will have full access on all projects listed below.

Service Users

Service users will have their default_project_id set to a specific project and will NOT be granted full access to other projects by default.

Unique IdentifierService User NameFull Access onCommunity ContactDescriptionNeeded until
9a1576af59644a2dbbace773ad17158du500924-svc-sig-monitoringp500924-sig-monitoring1fkrService User - SIG Monitoring31.12.2023
4925967416894fd78be6701689059653u500924-svc-cloudmonp500924-cloudmon-targetcostelterService User - CloudMon Test Project31.12.2023
f89b3d64ddff4d9d8cadb5e06fa22299u500924-svc-healthmonitorp500924-scs-healthmonitorgarloffService User - SCS Health Monitor
49cc3d72fbdf41fe8dc407f57f026dbfu500924-svc-standardsp500924-scs-healthmonitorgarloffService User - SCS Standards Compliance Check
49cc3d72fbdf41fe8dc407f57f026dbfu500924-svc-zuulp500924-scs-zuulo-otteService User - SCS Zuul30.11.2024

Projects

Unique IdentifierProject NameCommunity ContactDescriptionNeeded until
2237c767cf5f456da19359ed31c1c16bp500924-scs-communityfkrSCS Community Project
b43cfafbcf1f4eb08865b2886c29e09bp500924-cluster-api-sessiongarloffcluster-api hands on session
9b7a73e516be4cd1acbd63d543985c52p500924-gonicus-devo-otteGONICUS GmbH
3829cc7c8f034fc985f5055a1df6f247p500924-scs-healthmonitorgarloffSCS Health Monitor
b97d38bf128b4479981c4dbe2ef70cd5p500924-SIG-IAMfkrSIG IAM and VP08
9de7d8dc2d674e52be44904d6b338b0bp500924-cloudmoncostelterCloudMon Test Project31.12.2023
2c9e0e4ef8d44c36807df50b06b3c81dp500924-cloudmon-targetcostelterTarget project for CloudMon tests31.12.2023
3501db829014406884990a1016f3e25dp500924-sig-monitoring1fkrSIG Monitoring - cloudmon target31.12.2023
602778bad3d3470cbe58c4f7611e8eb7p500924-dnationchess-knightdNation dev for VP06c
91091d4039a6457db27d48d58bb1b4e4p500924-jschoonejschooneKaaS dev and evaluation
93956190702b4a7d8a8886806d57713fp500924-meteringcah-linkDev Environment for VP1331.12.2023
abbe6561cf6248b6af395334aa09af85p500924-harborchess-knightSCS Harbor for VP06c
4ff97734574146ccb4c7e7568bc1e36fp500924-XPanseswarooparEclipse XPanse Projekt POC31.11.2023
e7622c1048ac4520a2d050ae141e826bp500924-tender-6amxmxchereDev Environment for VP06a
eeed7e0ad33f42f189fb4165116f5a1bp500924-dnation-k8smatofederdNation dev for VP06c
b342f37804f14459bdf703573169bf79p500924-minery90n20Testbed env for Pentesting30.11.2024
0fa3c3559f0d4f39ba7aa70c7f7188cap500924-tender-10-3tonifingerDev Environment for VP10-3
b682eb90fb834278afb1182018dd2133p500924-scoopexscoopexMarc's gx-scs project
021af0688c594bf88ed675b942d3bea8p500924-gx-cred-generatoranjastrunkSCS Gaia-X Self-Description Generator
a07c811315ad40f585945b2939ef12ddp500924-scs-zuulo-otteSCS Zuul30.11.2024

Wavecon

Service Users

Unique IdentifierService User NameFull Access onCommunity ContactDescriptionNeeded until
df4af5376bbd4de587c4335622149be7scs-standardsscs-standardsitrichService User - SCS Standards Compliance Check

Projects

Unique IdentifierProject NameCommunity ContactDescriptionNeeded until
718964b4b87446688ac04b151519fb51scsgarloffSCS Health Monitor
c46ccc9e695c4b23bacee2ad11145d9ascs-health-monitorgarloffSCS Health Monitor
00de553df86949b49365baee6375fb5ascs-standardsitrichSCS Health Monitor
+ + + + \ No newline at end of file diff --git a/community/cloud-resources/plusserver-gx-scs/index.html b/community/cloud-resources/plusserver-gx-scs/index.html new file mode 100644 index 0000000000..caad347d92 --- /dev/null +++ b/community/cloud-resources/plusserver-gx-scs/index.html @@ -0,0 +1,26 @@ + + + + + +Getting Started Gaia-X Demonstrator @ plusserver | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Getting Started Gaia-X Demonstrator @ plusserver

Getting Started for the Gaia-X Demonstrator @ plusserver

URLs for access

Authentication (UI)

For your login you will need:

  • Username (u500924-<github handle>)
  • Password
  • Domain (d500924)

Getting Started with OpenStack

See Getting Started with OpenStack

+ + + + \ No newline at end of file diff --git a/community/cloud-resources/wavestack/index.html b/community/cloud-resources/wavestack/index.html new file mode 100644 index 0000000000..a517829012 --- /dev/null +++ b/community/cloud-resources/wavestack/index.html @@ -0,0 +1,26 @@ + + + + + +Getting Started with Wavestack | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/community/collaboration/index.html b/community/collaboration/index.html new file mode 100644 index 0000000000..ce7ed524ca --- /dev/null +++ b/community/collaboration/index.html @@ -0,0 +1,47 @@ + + + + + +Collaboration | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Collaboration

Collaborating with issues and pull requests

We use the GitHub flow to track and discuss changes in issues, then propose and +review changes in pull requests. See the +GitHub documentation +for more details.

Meetings

Project updates

  • Weekly with all teams on Thursday at 1505 CEST (45 mins)

Sprint review/Backlog refinement/Sprint planning meetings

  • Weekly with Team IaaS on Wednesdays at 1005 CEST (1 hour)
  • Weekly with Team Container on Mondays at 1005 CEST (1 hour)
  • Weekly with Team OPS & IAM on Thursdays at 1005 CEST (1 hour)

Special interest groups (SIGs)

  • Identity & Access Management (IAM): Bi-Weekly on Friday at 1005 CEST (1 hour)
  • Monitoring & Logging: Weekly on Friday at 1205 CEST (1 hour)

Videoconference

We use a self-hosted Jitsi Meet instance for video conferencing.

The server uses an automated deployment based on the +heat-docker-jitsi-meet project.

Configuration is such everyone who knows the room can connect, unless the moderator +sets a password/PIN. Opening a new room requires authentication. (Contact Kurt if +you need a password.)

Usage

Connect with a desktop browser (Chrome/Chromium or other blink based browser +recommended due to superior WebRTC implementation with SimulCast/SVC for VP8/VP9 -- +Safari & Firefox work, but cause higher data traffic). For mobile devices use +the Jitsi Meet App.

Use the little arrows in the control bar at the bottom to select speaker, microphone +and camera in case you lack audio/video. Occasionally, you can not hear all but +one participant; in this case reconnecting typically helps.

We have an asterisk connected to some conference rooms to provide dial-in capabilities +for folks that lack internet connectivity (but have a working phone connection).

Nextcloud

We have a Nextcloud +instance for sharing files, calendar, contacts, ... +setup for things that are not public.

We are also using it for our taskboards currently, though we are looking at +options to do this in the open.

If you want to contribute, we'll do an onboarding call and add you to nextcloud. +This will also add you to the scs-member@lists.scs.community mailing list.

We have an announcements mailing list there announce@lists.scs.community and you +can subscribe via the mailman3 frontend

Zuul CI/CD pipelines and project gating

Since we are expecting a lot of pipelines beeing created and used GitHub actions won't keep up +well. We also expect cross-repository and even cross-project dependencies. Therefore we decided to +use Zuul as our main pipeline solution.

How to make a repo use Zuul

  • Make Zuul aware of your repository in this repo
  • Create a file .zuul.yaml
    • An example can be found here
    • You can have a job section containing self-defined jobs which you need to write on your own
    • You have to have a project section containing
      • the default-branch name
      • the merge-mode which should be used to auto-merge
      • the jobs to run in each pipeline (gh_check, gh_gate, gh_post, gh_tag)
      • these pipelines are triggered by events which can be looked up here
      • some default jobs can be found here
  • If you have self-defined jobs, you need to create a folder .playbooks
    • this folder containers ansible playbooks which will be triggered

General information about Zuul

Zuul does not take anything for granted. If you need to have something installed, +you should install it via ansible. Our test-machines are basically pimped +docker-containers, so we might run into issues some time. But for now, things work pretty good.

+ + + + \ No newline at end of file diff --git a/community/communication/jitsi/index.html b/community/communication/jitsi/index.html new file mode 100644 index 0000000000..85be845c73 --- /dev/null +++ b/community/communication/jitsi/index.html @@ -0,0 +1,26 @@ + + + + + +jitsi | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

jitsi

+ + + + \ No newline at end of file diff --git a/community/communication/mailinglists/index.html b/community/communication/mailinglists/index.html new file mode 100644 index 0000000000..945e1fd3af --- /dev/null +++ b/community/communication/mailinglists/index.html @@ -0,0 +1,26 @@ + + + + + +mailinglists | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

mailinglists

+ + + + \ No newline at end of file diff --git a/community/communication/matrix/index.html b/community/communication/matrix/index.html new file mode 100644 index 0000000000..59d8ca1a32 --- /dev/null +++ b/community/communication/matrix/index.html @@ -0,0 +1,26 @@ + + + + + +Matrix | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Matrix

We have created an open community space on the Matrix federation. Feel free to join the several channels and start chatting with our community. A good starting point is entering the General & Announcements and the Tech channel.

Client and Registration

To connect to the Matrix federation, you will need an account on a federated homeserver and a client. The easiest way to join us is register on the popular matrix.org homeserver via the Element web client: https://app.element.io/#/register. A list of curated Matrix clients is collected on the official Matrix website: https://matrix.org/clients/.

+ + + + \ No newline at end of file diff --git a/community/community/calendar/index.html b/community/community/calendar/index.html new file mode 100644 index 0000000000..58c863cdb1 --- /dev/null +++ b/community/community/calendar/index.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/community/community/category/contribute/index.html b/community/community/category/contribute/index.html new file mode 100644 index 0000000000..1718906195 --- /dev/null +++ b/community/community/category/contribute/index.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/community/community/cloud-resources/getting-started-openstack/index.html b/community/community/cloud-resources/getting-started-openstack/index.html new file mode 100644 index 0000000000..fc40aed3a6 --- /dev/null +++ b/community/community/cloud-resources/getting-started-openstack/index.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/community/community/cloud-resources/index.html b/community/community/cloud-resources/index.html new file mode 100644 index 0000000000..2e9f439d9b --- /dev/null +++ b/community/community/cloud-resources/index.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/community/community/cloud-resources/plusserver-gx-scs/index.html b/community/community/cloud-resources/plusserver-gx-scs/index.html new file mode 100644 index 0000000000..32216711a6 --- /dev/null +++ b/community/community/cloud-resources/plusserver-gx-scs/index.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/community/community/cloud-resources/wavestack/index.html b/community/community/cloud-resources/wavestack/index.html new file mode 100644 index 0000000000..b13d66f100 --- /dev/null +++ b/community/community/cloud-resources/wavestack/index.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/community/community/collaboration/index.html b/community/community/collaboration/index.html new file mode 100644 index 0000000000..bf98096127 --- /dev/null +++ b/community/community/collaboration/index.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/community/community/communication/jitsi/index.html b/community/community/communication/jitsi/index.html new file mode 100644 index 0000000000..3395bd3b37 --- /dev/null +++ b/community/community/communication/jitsi/index.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/community/community/communication/mailinglists/index.html b/community/community/communication/mailinglists/index.html new file mode 100644 index 0000000000..30249472c4 --- /dev/null +++ b/community/community/communication/mailinglists/index.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/community/community/communication/matrix/index.html b/community/community/communication/matrix/index.html new file mode 100644 index 0000000000..9d0dd73a9e --- /dev/null +++ b/community/community/communication/matrix/index.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/community/community/contribute/adding-docs-guide/index.html b/community/community/contribute/adding-docs-guide/index.html new file mode 100644 index 0000000000..706521ab60 --- /dev/null +++ b/community/community/contribute/adding-docs-guide/index.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/community/community/contribute/doc-files-structure-guide/index.html b/community/community/contribute/doc-files-structure-guide/index.html new file mode 100644 index 0000000000..81f157bc94 --- /dev/null +++ b/community/community/contribute/doc-files-structure-guide/index.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/community/community/contribute/docs-workflow-explanation/index.html b/community/community/contribute/docs-workflow-explanation/index.html new file mode 100644 index 0000000000..5009c317ac --- /dev/null +++ b/community/community/contribute/docs-workflow-explanation/index.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/community/community/contribute/linting-guide/index.html b/community/community/contribute/linting-guide/index.html new file mode 100644 index 0000000000..bf183e9f0b --- /dev/null +++ b/community/community/contribute/linting-guide/index.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/community/community/contribute/local-docusaurus-development-guide/index.html b/community/community/contribute/local-docusaurus-development-guide/index.html new file mode 100644 index 0000000000..9a044694f1 --- /dev/null +++ b/community/community/contribute/local-docusaurus-development-guide/index.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/community/community/contribute/styleguide/index.html b/community/community/contribute/styleguide/index.html new file mode 100644 index 0000000000..ba4e409a70 --- /dev/null +++ b/community/community/contribute/styleguide/index.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/community/community/contribute/styleguides/ansible_styleguide/index.html b/community/community/contribute/styleguides/ansible_styleguide/index.html new file mode 100644 index 0000000000..5234f1b100 --- /dev/null +++ b/community/community/contribute/styleguides/ansible_styleguide/index.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/community/community/github/branchprotection/index.html b/community/community/github/branchprotection/index.html new file mode 100644 index 0000000000..7c3cc0b1d2 --- /dev/null +++ b/community/community/github/branchprotection/index.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/community/community/github/dco-and-licenses/index.html b/community/community/github/dco-and-licenses/index.html new file mode 100644 index 0000000000..292222f9e5 --- /dev/null +++ b/community/community/github/dco-and-licenses/index.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/community/community/github/tips-and-tricks/index.html b/community/community/github/tips-and-tricks/index.html new file mode 100644 index 0000000000..b6bc58860a --- /dev/null +++ b/community/community/github/tips-and-tricks/index.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/community/community/hackathons/checklist/index.html b/community/community/hackathons/checklist/index.html new file mode 100644 index 0000000000..984523b3b9 --- /dev/null +++ b/community/community/hackathons/checklist/index.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/community/community/index.html b/community/community/index.html new file mode 100644 index 0000000000..43e45251f4 --- /dev/null +++ b/community/community/index.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/community/community/license-considerations/index.html b/community/community/license-considerations/index.html new file mode 100644 index 0000000000..88c63d3a58 --- /dev/null +++ b/community/community/license-considerations/index.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/community/contribute/adding-docs-guide/index.html b/community/contribute/adding-docs-guide/index.html new file mode 100644 index 0000000000..c22583aa93 --- /dev/null +++ b/community/contribute/adding-docs-guide/index.html @@ -0,0 +1,26 @@ + + + + + +Adding Docs Guide | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Adding Docs Guide

In this Guide you will learn how to integrate your documentation to the SCS documentation, which you will find on docs.scs.community.

Step 1 – Documentation type

Determine the type of your documentation and click to continue.

  1. Technical documentation
  2. Operational documentation
  3. Community documentation

If unsure don't hestitate to ask us at Matrix

1. Technical Documentation

Step 1 – Checklist

Your repository containing the documentation has to...

  • be a public repository
  • contain a directory named /doc or /docs within root, containing the documentation files

The documentation files have to be in markdown format and...

Step 2 – Adding your repo to the docs.json

File a Pull Request within the docs-page repository and add your repo to the docs.package.json:

[
{
"repo": "demo-organisation/demo-repository",
"source": "doc/*.md",
"target": "docs",
"label": "demo-repository-label"
}
]
keydescription
reporeference to github organisation and repository
sourcepath to content to copy: Either glob matching individual markdown files OR the path of a single directory
targetdirectory where the files should be copied to within the docs-page repo
labellabel for directory. only mandatory if source file is set to copy only *.md files and not the complete directory

Once it is approved and merged, a postinstall script will be triggered within the build process. This initiates downloading, copy and distilling which results in this static generated documentation page – now with your content.

An explanation on how the sync & distill workflow and a guide on how to test it in a local development environment you will find here.

2. Operational documentation

Your doc files contain operational knowledge. Which layer in the stack do they belong to?

  1. iaas
  2. iam
  3. kaas
  4. operations

File a Pull Request within the docs repository and add your markdown files to the fitting directory.

3. Community documentation

Your doc files contain knowledge regarding our community? Choose the right directory. If unsure don't hestitate to ask us at Matrix.

File a Pull Request within the docs repository and add your markdown files to the fitting directory.

+ + + + \ No newline at end of file diff --git a/community/contribute/doc-files-structure-guide/index.html b/community/contribute/doc-files-structure-guide/index.html new file mode 100644 index 0000000000..e8503d9ec3 --- /dev/null +++ b/community/contribute/doc-files-structure-guide/index.html @@ -0,0 +1,26 @@ + + + + + +Documentation Files Structure | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Documentation Files Structure

Structure Best Practice

Overview - mandatory

  • What is it and for what do I need this? What benefits does it have for users?
  • What organization/company does this belong to? (Link to company/organization)
  • Where am I – as module – within the bigger context of SCS?

Requirements - mandatory

  • What minimal requirements do i need to quickstart?

Quickstart - optional. If it is possible, then mandatory

  • Link to requirements
  • What is the aim of this quickstart guide?
  • Caution: only for testing, not for production
  • Rule: one line per command for easy copy&paste and one line for description where possible
  • Rule: only one working path for installation!

Getting Started - mandatory

  • Aim is a production ready installation

Configuration – mandatory

  • Showing all possible config options

Contribute – mandatory

  • Description for how can i contribute with Link to Github repository

FAQ`s – optional

  • Roadmap - optional
+ + + + \ No newline at end of file diff --git a/community/contribute/docs-workflow-explanation/index.html b/community/contribute/docs-workflow-explanation/index.html new file mode 100644 index 0000000000..bc95863cb3 --- /dev/null +++ b/community/contribute/docs-workflow-explanation/index.html @@ -0,0 +1,26 @@ + + + + + +Documentation workflow explanation | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Documentation workflow explanation

The aim within this documentation is to have a good developer experience and a low entry barrier to start with SCS. For this to achieve we think all docs that define the SCS stack and have been developed by the SCS community should be within this documentation framework.

Information Architecture

  • All general docs are located within the SovereignCloudStack/docs repository.

  • Docs that explain, guide or contextualize specific modules such as the openstack-image-manager or the k8s-cluster-api-provider reside within their repository in a seperate docs directory.

Both, the general docs and docs of the external repositories are combined into the one unified documentation collection that is being rendered in a static page on https://docs.scs.community. In order to make this work we have developed a workflow that syncs all doc repositories and distills only the relevant markdown files.

The script is called getDocs. It is a postinstall script and is executed after npm install. This has the advantage to have the docs – coming from the cloud – in your local docusaurus development environment as well as in the build process.

You'll find the script in the root directory of the SovereignCloudStack/docs-page repository:

getDocs.js
const fs = require("fs");
const { execSync } = require("child_process");

// Read the contents of the "docs.package.json" file and remove all whitespace
const reposJson = fs
.readFileSync("./docs.package.json", "utf8")
.replace(/\s/g, "");

// Parse the JSON and create an array of repositories
const repos = JSON.parse(reposJson);
const ghUrl = "https://github.com/";

// Clone each repository, remove git folders and README files, and copy the docs to the target directory
repos.forEach((repo) => {
const repoDir = `repo_to_be_edited/${repo.label}`;

// Clone the repository
const cloneCommand = `git clone ${ghUrl + repo.repo} ${repoDir}`;
execSync(cloneCommand);

// Remove git folders
const removeGitCommand = `rm -rf ${repoDir}/.git`;
execSync(removeGitCommand);

// Remove README files
const removeReadmeCommand = `find ${repoDir} -name "README.md" | xargs rm -f`;
execSync(removeReadmeCommand);

// Create the docusaurus subdirectory
const subDirPath = `${repo.target}/${repo.label}`;
fs.mkdirSync(subDirPath, { recursive: true });

// Copy docs content from A to B
const copyDocsCommand = `cp -r ${repoDir}/${repo.source} ${subDirPath}`;
execSync(copyDocsCommand);

// Remove the cloned repository
const removeRepoCommand = "rm -rf repo_to_be_edited";
execSync(removeRepoCommand);
});
+ + + + \ No newline at end of file diff --git a/community/contribute/linting-guide/index.html b/community/contribute/linting-guide/index.html new file mode 100644 index 0000000000..895cb5a89a --- /dev/null +++ b/community/contribute/linting-guide/index.html @@ -0,0 +1,26 @@ + + + + + +Linting Guide | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Linting Guide

In order to have a clean content repository regarding all markdown files we enforce linting on:

  1. all staged files prior committing
  2. all Pull Requests

Pre Commit

Run markdownlint against staged git files with Husky git hook:

  1. lint-staged
  2. husky

The rules are enforced on markdown files, for which we use:

  1. markdownlint-cli2 for markdownlint
  2. prettier for code formatting

The markdownlint rules are defined in the configuration file .markdownlint-cli2.jsonc

Additionally we use markdownlint-rule-search-replace for fixing

Github Workflows

There are two actions running on every Pull Request on the main branch.

  1. link-validator.ymlis checking every link in markdown files.
  2. pr-markdownlint.ymlis checking all markdown files regarding to the rules defined within .markdownlint-cli2.jsonc
+ + + + \ No newline at end of file diff --git a/community/contribute/local-docusaurus-development-guide/index.html b/community/contribute/local-docusaurus-development-guide/index.html new file mode 100644 index 0000000000..a30c5ada62 --- /dev/null +++ b/community/contribute/local-docusaurus-development-guide/index.html @@ -0,0 +1,27 @@ + + + + + +Installation | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Installation

This Guide shows you how to setup docusaurus on your local machine to run this docs-page in your local development enviroment.

Requirements

  • git
  • Node.js v16

Installation Guide

Step 1 – Installing Node.js via nvm

It is recommended to install Node.js via nvm – a node version manager – to have the possibility to switch between different node.js versions.

You must have macOS desktop access with administrator privileges.

Login to the macOS desktop system and install Homebrew on your system (if not already installed).

Install nvm via homebrew:

brew install nvm

Once installed you can check the available versions with

nvm list

If you have no other projects, where you need a different version, it is recommended to install the latest stable LTS version of node.

nvm install lts

nvm has now installed the latest node.js version with its package manager npm. Check if the installation has been successfull by checking it:

node --version

Step 2 – Cloning the repository

Clone the docs-page repository via your favourite method:

HTTPS
git clone https://github.com/SovereignCloudStack/docs-page.git

Step 3 – Installing dependencies

Change your working directory within your terminal to the root of the cloned repository /docs-page and install all dependencies:

npm install

Step 4 – Starting the development server

You can now run the local development server from your terminal:

npm start

Once the server is up and running, your terminal will show you the local URL which you can open with your browser to see the page.

+ + + + \ No newline at end of file diff --git a/community/contribute/styleguide/index.html b/community/contribute/styleguide/index.html new file mode 100644 index 0000000000..04b99fc7ee --- /dev/null +++ b/community/contribute/styleguide/index.html @@ -0,0 +1,33 @@ + + + + + +Styleguide | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Styleguide

Admonitions

We adopt the default Admonition colors for Note, Tip, Info, Caution, Danger by docusaurus:

Docusaurus Admonitons

note

Some content with Markdown syntax.

tip

Some content with Markdown syntax.

info

Some content with Markdown syntax.

caution

Some content with Markdown syntax.

danger

Some content with Markdown syntax.

Blockquotes

Blockquotes should be handled with standard markdown >

Example Blockquote:

The raw data format is really the only sensible format option to use with RBD. asdasdasdasd asd asd a +Technically, you could use other QEMU-supported formats +(such as qcow2 or vmdk), but doing so would add additional overhead, and would +also render the volume unsafe for virtual machine live +migration when caching (see below) is enabled.

Codeblocks

We support markdown language features for Codeblocks. +It is mandatory to define the language to be quoted, when using codeblocks. +Syntax Highlighting is also supported by Docusaurus via Prism. +We are using the GitHub language themeing as default.

Python example
def code_block():
# Everything in this function is part of the same code block
print (1)
print (2)

for i in range(4):
# Everyting in this loop is part of the same code block
print (i)
Javascript example
const code_block = () => {
console.log("inside code_block");
};
YAML example
---
doe: "a deer, a female deer"
ray: "a drop of golden sun"
pi: 3.14159
xmas: true
french-hens: 3
calling-birds:
- huey
- dewey
- louie
- fred
Ruby example
require 'redcarpet'
markdown = Redcarpet.new("Hello World!")
puts markdown.to_html
+ + + + \ No newline at end of file diff --git a/community/contribute/styleguides/ansible_styleguide/index.html b/community/contribute/styleguides/ansible_styleguide/index.html new file mode 100644 index 0000000000..8d126761d9 --- /dev/null +++ b/community/contribute/styleguides/ansible_styleguide/index.html @@ -0,0 +1,37 @@ + + + + + +Ansible Style Guide | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Ansible Style Guide

We use nearly all default rules of ansible lint. A listing of all these rules can be found in the Ansible Lint documentation: +https://ansible.readthedocs.io/projects/lint/rules/. +Please always use the ansible linting to check if the code complies with the default linting rules. +However, since in most cases we always use the latest version of packages and Ansible lint does not provide this, we decided to +disable the package_latest rule.

Task naming

  • Tasks must always have names. The only exception allowed is for forked playbooks.
  • A name never starts with a small letter
  • Names are written in present tense
  • No punctuation is used in names

Key Order

To check the key order we use our own rule. This can be found here.

Positioning and use of the become directive

The become directive is only set when needed and is always set explicitly for each task that needs it.

Blocks, roles or playbooks are never executed in a privileged mode.

We always insert the become directive between the name of a task and the task itself. This also applies to related directives +like become_user or become_flags. This is for better visibility if a task is privileged or not.

- name: Copy hddtemp configuration file
become: true
ansible.builtin.copy:
src: "{{ ansible_os_family }}/hddtemp"
dest: "{{ hddtemp_conf_file }}"
owner: root
group: root
mode: 0644
notify: Restart hddtemp service

Position of the when condition

If you need to use the when condition please add this at the end-section from the task where it is needed. This makes the code +easier to understand for others. Ansible lint provides the when condition under the task name for blocks. To keep the code clear +we decided against it. Please disable this with a noqa if necessary. For example:

- name: "Archive existing {{ resolvconf_file }} file"
become: true
ansible.posix.synchronize:
src: "/etc/resolv.conf"
dest: "/etc/resolv.conf.{{ ansible_date_time.date }}"
archive: true
delegate_to: "{{ inventory_hostname }}"
when: stat_resolvconf_file.stat.islnk is defined and not stat_resolvconf_file.stat.islnk

Usage of collections

Collections are always defined as in the following example.

netbox.netbox is here the collection that is used.

- name: Configure netbox manufacturers
netbox.netbox.netbox_manufacturer:
netbox_url: "{{ netbox_url }}"
netbox_token: "{{ netbox_token }}"
data:
name: "{{ item.value.name }}"
slug: "{{ item.value.slug }}"
description: "{{ item.value.description | default('') }}"
state: present
with_dict: "{{ netbox_data_manufacturers }}"

Please don´t declare it in this way!:

collections:
- netbox.netbox

tasks:
- name: Manage Discworld site
netbox_site:
netbox_url: "{{ netbox_url }}"
netbox_token: "{{ netbox_token }}"
validate_certs: false
data:
name: Discworld
slug: discworld
state: present

If you have to use collections please define them in a requirements.yml.

Example yaml:

roles:
- name: geerlingguy.certbot
version: master
type: git
src: git+https://github.com/geerlingguy/ansible-role-certbot.git
...

collections:
- name: ansible.netcommon
source: https://galaxy.ansible.com

- name: https://github.com/ansible-collections/ansible.posix.git
type: git
version: main

Usage of roles from other collections

If you want to reuse roles please do it in the following way:

First you have to declare the role or collection in the requirements.yml like shown in the example before.

Than you can use it in playbooks like this

  roles:
- role: osism.services.auditd

Parameters that offer lists

Parameters that provide a list are always defined as in the following example.

docker_hosts_defaults sets the defaults in the role. Overriding is only possible with the ansible-defaults repository.

In the configuration repository, docker_hosts_extra is then used to add additional items to the list.

docker_hosts itself is never modified from the outside.

   docker_hosts_defaults:
- "unix:///var/run/docker.sock"
docker_hosts_extra: []
docker_hosts: "{{ docker_hosts_defaults + docker_hosts_extra }}"

Usage of changed_when

Please think twice before turning off changed_when. It's a fairly simple yet safety-relevant linting rule and is quite easy to +implement.

Disable linting rules

In principle, it is only allowed to disable rules if there is really no other possibility. +Please do not disable rules in general but only in individual cases via Noqa. Please use in this case the full rulename and not +the numbers, because them are depricated. If it makes sense to ignore a rule, please open up an issue in the +https://github.com/osism/issues repository with a label discussion.

+ + + + \ No newline at end of file diff --git a/community/github/branchprotection/index.html b/community/github/branchprotection/index.html new file mode 100644 index 0000000000..fb7c5fe17e --- /dev/null +++ b/community/github/branchprotection/index.html @@ -0,0 +1,26 @@ + + + + + +Branch Protection Rules | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Branch Protection Rules

To protect our source code from unwanted changes, we enforce the following branch protection rules for all repositories within our GitHub organization:

  • Require a pull request before merging into our default branch main.
    • Require at least one approval before pull requests can be merged.
    • Dismiss stale pull request approvals when new commits are pushed
  • Require status checks to pass before merging
    • Require branches to be up to date before merging
    • Status checks that are required:
  • Do not allow bypassing the above settings

The branch protection rules are rolled out by our github-manager to ensure that all repositories use a consistent set of rules. Should you intend to propose changes to the above rules, please open a pull request against orgs/SovereignCloudStack/data.yaml.

Some repositories however do allow that the above rules are bypassed by the organization's owners, especially repositories that are used for public resources such as the website or the weekly digest.

+ + + + \ No newline at end of file diff --git a/community/github/dco-and-licenses/index.html b/community/github/dco-and-licenses/index.html new file mode 100644 index 0000000000..68fa97bb2b --- /dev/null +++ b/community/github/dco-and-licenses/index.html @@ -0,0 +1,33 @@ + + + + + +Developer Certificate of Origin + Licenses | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Developer Certificate of Origin + Licenses

The Developer Certificate of Origin (DCO) is a lightweight way for contributors +to certify that they wrote or otherwise have the right to submit the code they +are contributing to the Sovereign Cloud Stack.

By making a contribution to this project, I certify that:

(a) The contribution was created in whole or in part by me and I
have the right to submit it under the open source license
indicated in the file; or

(b) The contribution is based upon previous work that, to the best
of my knowledge, is covered under an appropriate open source
license and I have the right under that license to submit that
work with modifications, whether created in whole or in part
by me, under the same open source license (unless I am
permitted to submit under a different license), as indicated
in the file; or

(c) The contribution was provided directly to me by some other
person who certified (a), (b) or (c) and I have not modified
it.

(d) I understand and agree that this project and the contribution
are public and that a record of the contribution (including all
personal information I submit with it, including my sign-off) is
maintained indefinitely and may be redistributed consistent with
this project or the open source license(s) involved.

All contributions to the Sovereign Cloud Stack are licensed under the +(OSI approved) open source license of the upstream project being used therein +(very often this is the Apache Software License v2).

Where we create independent code, we prefer to use the GNU Affero General Public License 3, +except for interface code which we would put under LGPL-3 (weak copyleft). +Own documentation content is licensed under Creative Commons BY-SA 4.0.

Contributors sign-off that they adhere to these requirements by adding a Signed-off-by +line to commit messages.

My fancy commit message

Signed-off-by: Christian Berendt <berendt@betacloud-solutions.de>

Git has a -s command line option to append this automatically to your commit message:

git commit -s -m 'My fancy commit message'

The status of a pull request is set to failed if commits do not contain a valid Signed-off-by line.

Failed DCO in GitHub

Considerations behind the choice of AGPLv3, CC-BY-SA and the usage of the DCO can be found license-considerations.md.

Further reading

+ + + + \ No newline at end of file diff --git a/community/github/tips-and-tricks/index.html b/community/github/tips-and-tricks/index.html new file mode 100644 index 0000000000..5a16862358 --- /dev/null +++ b/community/github/tips-and-tricks/index.html @@ -0,0 +1,26 @@ + + + + + +Tips and Tricks | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Tips and Tricks

Octo Reminder - your friendly assistant

Are you tired of keeping track of planned changes or issues you scheduled for the future? Our Octo Reminder is here to safe you from unneeded cognitive load!

The app configuration is stored in our .github repository. Using the bot is fairly simple:

  • To schedule a reminder, simply comment with /remind-me [date] [message] on an issue or pull request. The bot will answer and mention you in the particular issue/pull request upon reaching the configured date.
  • If you don't specify a time for the reminder, the bot will use 9:00 CET as default reminder time.
  • The date and time can be anything that momentjs understands, e.g. an ISO 8601 string or a relative string such as tomorrow or next week.
+ + + + \ No newline at end of file diff --git a/community/hackathons/checklist/index.html b/community/hackathons/checklist/index.html new file mode 100644 index 0000000000..fecb3d73e5 --- /dev/null +++ b/community/hackathons/checklist/index.html @@ -0,0 +1,29 @@ + + + + + +Hackathon planning checklist | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Hackathon planning checklist

This checklist is designed to simplify the planning of hackathons and meetups. All items are suggestions and optionally adaptable +to the situation.

Checklist 6 months before Hackathon

DateTask
  • - [ ]
Clarify sponsorship
  • - [ ]
Clarify who is responsible for planning. Contact persons of the companies involved. These should then also be present at the hackathon.
  • - [ ]
Set a specific date.
  • - [ ]
Clarify responsibilities.
  • - [ ]
First advertising in form of advertising in meetings, LinkedIn post, mailing list or similar.
  • - [ ]
Clarify which advertising measures are required (see checklist advertising).
  • - [ ]
Determine venue.
  • - [ ]
Set the theme for the hackathon and apply it to the design.

Checklist advertising

TopicTask
  • - [ ]
Social MediaCreate content plan.
  • - [ ]
Which accounts/people/companies have to be mentioned as well.
  • - [ ]
Which persons must agree to a publication.
  • - [ ]
Should hashtags be used, if yes which ones.
  • - [ ]
NewsletterCreate content plan with possible content and frequency.
  • - [ ]
WebsiteContent plan: Blogposts.
  • - [ ]
Info landing page.
  • - [ ]
Registration page.
  • - [ ]
Special newsletter or just regular.
  • - [ ]
Other placementsSpread the word in meetings or at other events.
  • - [ ]
MediaShould be changeable, specify target audience, language, sources.
  • - [ ]
Media suggestionsVideo, images, PDF, texts, merch, graphics. Everything should be planned in advance precisely date, type, releases, scope, size, etc.
  • - [ ]
GraphicsSet design motto.
  • - [ ]
Key metricsShould the success be tracked by key metrics, if so which ones.

Checklist 5 months before Hackathon

DateTask
  • - [ ]
Clarify if extra merch is desired and start looking for vendors. Order samples.
  • - [ ]
Discuss concrete advertising measures.
  • - [ ]
Check hotels (see checklist hotel).

Checklist hotel

Iportant things

  • Availabilities in the period.
  • Way from the hotel to the hackathon.
  • Parking at the hotel.
  • Way from train station to hotel.
  • Checkin / Checkout times.
  • Check barrier-free accessibility.

Nice-to-have things

  • Bar in the hotel, for relaxed sitting together in the evening.
  • Clarify whether employees from on site are also allowed in the bar.
  • Clarify whether reservations must be made in the bar, if so, reserve for the evening before.
  • Possibility of contingent reservation.

Checklist 4 months before Hackathon

DateTask
  • - [ ]
Determine hotel final and make recommendation. Possibly reserve contingent if the hotel offers it.
  • - [ ]
Find the location for the evening before (see checklist for evening before location).
  • - [ ]
Start organizing venue. (See checklist rooms 1).
  • - [ ]
Roughly plan evening event (consider volume level and space available).
  • - [ ]
Promotional drumbeat. Social media, website, meetings, newsletter.
  • - [ ]
Order special merch.
  • - [ ]
Organize merch in general (see merch checklist).
  • - [ ]
Start collecting statements that need to be sent around. (Privacy statements, photo statements, data center statements, security statements).
  • - [ ]
Rough sequence of events to be able to plan more precisely at a later date.

Checklist for evening before location

  • Volume level.
  • Consider food possibilities.
  • Enough space.
  • Availability.
  • If intermediate change from A to B, then plan and include firmly in the plan.
  • If it is necessary to choose two locations because of food, drink, coziness, distance to the hotel: plan both, ask for and book them.
  • Ask for flexibility in the reservation. If more people come as registered.
  • Plan times.
  • Price / performance ratio should fit.
  • Way from the hotel to the evening before location.

Checklist rooms 1

  • Space available (Enough space available for: Work area, meet-up area, no-photo area, break room, restrooms?).
  • Provisional room plan.
  • How long are the rooms available?
  • Are there any legal/corporate issues to consider?
  • Do declarations need to be signed to enter the premises?
  • List what hackathon relevant equipment is on site and if anything needs to be organized. For example, screens, whiteboards, power sockets if necessary, +tables, chairs, wi-fi, etc.

Checklist merch (examples)

  • Ballpens
  • Lanyards
  • Notepads
  • Stickers
  • ID card / name badge covers
  • Name badges
  • Snacks

Checklist 3 months before Hackathon

DateTask
  • - [ ]
Required declarations (photo/video usage rights, data center, premises, etc.) are available as a form. Have a look if you can have
them confirmed with the registration. Otherwise as a circular email to all who register with the registration confirmation. Well
visible. For the photo/video declaration: Give the option of refusing and explain the variant with the no-photo dot.
  • - [ ]
Promote again: Website, social media, newsletter, meetings, circular email, etc....
  • - [ ]
Make reservations for pre-evening event.
  • - [ ]
Plan evening event and reserve location / tables (see checklist evening event).
  • - [ ]
Create a provisional schedule.
  • - [ ]
Eventually invite people separately. (Special guests).
  • - [ ]
Schedule start time and arrival time. Allow enough time for everyone to arrive.
  • - [ ]
Set presentation time and end time.
  • - [ ]
Define arrival time evening event. Leave enough time to change, but also do not define too long.
  • - [ ]
Schedule a fixed cleanup time.
  • - [ ]
Plan break time.
  • - [ ]
Activate login page.

Checklist evening event

  • Volume level (It should be possible to have relaxed conversations)
  • Available space
  • Price / performance ratio should be suitable
  • Check availabilities
  • Snacks should be possible
  • Request flexibility with reservation (number of participants)
  • Actions would be a nice-to-have, everyone has been sitting and working all day, so it's good to have a change.
  • Way from the hotel to the evening location.

Checklist 2 months before Hackathon

DateTask
  • - [ ]
Start collecting goals and topics.
  • - [ ]
Work out goals and topics yourself.
  • - [ ]
Check results from the checklist rooms 1 again.
  • - [ ]
Go through checklist rooms 2.
  • - [ ]
Advertising (social media, mailing list, website, blog post, newsletter, room plan video, etc).
  • - [ ]
Go through checklists again in general, was anything forgotten?
  • - [ ]
Plan food for the break.
  • - [ ]
Plan snacks / breakfast (See snacks checklist).

Snacks checklist

Breakfast examples

  • Sandwiches (rolls)
  • Pretzel sandwiches
  • Sandwiches (toast)
  • Cocktail tomatoes

Snack exemples

  • "Kinder Schokobons"
  • "Kinder Schokoriegel"
  • "Kinder Duplo"
  • Hanuta
  • Gummy bears
  • Apples
  • Bananas
  • Nuts
  • Grapes
  • Dried fruits
  • Salted sticks
  • Salted pretzels

Vegan snack examples

  • "Katjes Fruchtgummi"
  • "Katjes Lakritz"

Checklist rooms 2

  • Create a room plan for publication. In it, work areas, break areas, no-photo area, meet-up places should be clearly +visible. Gladly also again as a video.
  • If necessary route map.
  • Is wifi available without any problems?
  • Where will drinks be located?
  • Where to set up snacks?
  • Where the food for the break?
  • Are there enough plates, cups, glasses, cutlery, napkins, and bowls for snacks?

Checklist 1 month before Hackathon

DateTask
  • - [ ]
Fix and publish the agenda.
  • - [ ]
Check the declarations once again, has every declaration been send, have any answered yet?
  • - [ ]
Check reservations, expand if necessary.
  • - [ ]
Check whether all possible special features have been observed (location etc).
  • - [ ]
Pre-order food for in-between meals and for the lunch break.
  • - [ ]
Plan drinks, type and quantity (don't forget coffee, tea, milk, sugar).

Checklist 1 week before Hackathon

DateTask
  • - [ ]
Print statements and forms.
  • - [ ]
Advertise again.
  • - [ ]
Make a list for the snacks (See for inspiration checklist snacks).
  • - [ ]
Pre-order the food, if necessary, check whether the quantity still fits with the registrations.
Depending on expand. Firmly plan transport / pickup / delivery.
  • - [ ]
Create a room plan with the topics, where, when, what takes place.
  • - [ ]
Organize drinks.
  • - [ ]
Determine the time when the helpers / organizers meet.
  • - [ ]
If necessary create / organize lists and visitor cards.

Checklist one day before Hackathon

DateTask
  • - [ ]
Buy snacks.
  • - [ ]
Contact food supplier again if the delivery date is suitable.
  • - [ ]
Check technology for functionality.
  • - [ ]
Send around the room plan with the topics by email.
  • - [ ]
Prepare rooms if necessary / possible.
  • - [ ]
Put drinks in the refrigerator.
  • - [ ]
Provide coffee machine.
  • - [ ]
Provide dishes.
  • - [ ]
Label rooms.
  • - [ ]
Check visitor cards and lists for completeness.

Checklist Hackathon Day X

TimeTask
  • - [ ]
Place snacks on the tables in small bowls or similar.
  • - [ ]
Distribute merchandise.
  • - [ ]
Have declarations and forms ready for late deciders.
  • - [ ]
Have lists and visitor cards ready if necessary.
  • - [ ]
Check drinks in an interval.
  • - [ ]
Make coffee if necessary.
  • - [ ]
Provide tea, coffee, milk, sugar.
  • - [ ]
Provide breakfast / snacks.
  • - [ ]
Pick up lunch.
  • - [ ]
Lunch "build up"
  • - [ ]
Cleanup
  • - [ ]
Keep an eye on the process (keep times a little bit).
  • - [ ]
See if everyone feels picked up, no one is bored.
  • - [ ]
Makes Photos.

Checklist after Hackathon

DateTask
  • - [ ]
Collect photos and provide them in a link for review and approval.
  • - [ ]
Create and send feedback sheet.
  • - [ ]
Create Blog Post Article.
  • - [ ]
Eventually create retro video.
  • - [ ]
Create social media posts. (After all approvals).
  • - [ ]
Prepare debriefing.
  • - [ ]
Summarize and process feedback.
+ + + + \ No newline at end of file diff --git a/community/index.html b/community/index.html new file mode 100644 index 0000000000..878f056702 --- /dev/null +++ b/community/index.html @@ -0,0 +1,26 @@ + + + + + +Overview | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Overview

Welcome to our SCS Community

Contribute to Sovereign Cloud Stack

Sovereign Cloud Stack is an open community of providers and end-users joining forces in defining, implementing and operating a fully open, federated, compatible platform. We actively encourage you to contribute either code, documentation or issues and to participate in the various discussions happening on GitHub or during our various meetings.

We're chatty

We have created an open community space on the Matrix network. Feel free to join the several channels and start interacting with the community. A good starting point is entering the General & Announcements and the Tech channel.

We're on GitHub

We're actively developing, discussing and planning on GitHub. The three technical teams are using a joint project board to plan and monitor the progress during our sprints.

+ + + + \ No newline at end of file diff --git a/community/license-considerations/index.html b/community/license-considerations/index.html new file mode 100644 index 0000000000..dec6519090 --- /dev/null +++ b/community/license-considerations/index.html @@ -0,0 +1,156 @@ + + + + + +License considerations for SCS | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

License considerations for SCS

As Sovereign Cloud Stack (SCS), our mission is to provide Operators +(be it Cloud Service Providers or just internal IT departments) with a well working software +stack, that avoids exposing them to legal risks or additional restrictions that limits the +usefulness. Free software licenses have this intention but differ in how they achieve it and in +what kind of protections they provide. In the first approximation, all OSI-approved +open source licenses can be considered as valid options. As a matter of fact, +we do consider projects under such licenses as valid modules for SCS — where we +use such projects and adjust or extend them, we would provide our contributions +under the license terms of the respective project, so we can achieve our goal to feed back code +upstream to the respective project, contribute to it and avoid fragmentation.

Where we do create independent code, we do have additional preferences, though.

For our own code, we do prefer the Affero General Public License version 3 +(AGPLv3) as license. Likewise, for documentation, we prefer CC-BY-SA. +Where we create standard libraries to interface with our software, we would +consider the LGPLv3 for these, +as we don't want interaction with our platform to be seen as requiring licensing +code.

Reciprocity

The GPL family of licenses are reciprocal licenses — sometimes called copyleft +licenses — the recipient of the licensed code can make all sorts of modifications, +but if she uses the code to release software (GPL) or provide a networked service +(AGPL) to others, then she must grant the same rights to the recipients — this +includes making the modifications available under the same terms as the received software. +Microsoft has infamously attacked +copyleft licenses (and specifically the GPL) as cancerous "viral" license.

Reciprocity has many advantages:

  • Code that has been created as free software will stay free. While GPL code can be +combined in a larger software collection with proprietary software, the code itself +including its enhancements etc. (technically: all derived works, see below) will +remain free.

  • The obligation to make the changes available avoids fragmentation. As changed and +"improved" versions need to be made available, it is much easier to review and feed +those changes back and create a unified upstream codebase that reflects the needs of +the complete user base by including the needed changes. This was observed and +reported by Martin Fink (HP's former CTO).

The hugely successful Linux kernel project uses the GNU GPL; +many of the more traditional key projects in the open source world use copyleft licenses such as +the AGPL, GNU GPL, GNU LGPL, MPL or the OSL.

Controversy

  • Not fulfilling the license terms of a software license typically leads to the ability for the +license owner to revoke the license — as it is relatively easy to not fulfill all obligations +of the GPL out of sheer negligence, the revocation without prior warning seems +disproportionate — this is sometimes called the GPL death penalty. The open source community +though has a strong interest in bringing every licensee into compliance by giving violators a +fair chance to correct their behavior. SCS explicitly supports the GPL Cooperation Commitment +and the respective document +from the Linux kernel developers and pledges to give violators a warning and a chance to correct action +by allowing for a cure period. This is a bit of a legacy issue — it is relevant to (L)GPLv2 +code only — v3 of L/A/GPL does already contain language that has cure provisions, so it's +clear by the licensing terms.

  • Many companies seem to be worried that they will inadvertently violate the GPL by negligence. +And it is true that a company needs a tighter control of the usage of inbound source code +which comes with a reciprocal license than the permissive BSD 3-clause or Apache Software (v2) +licenses. This advantage however quickly turns into a disadvantage as soon as the company does +significant outbound open source contributions under a permissive license — they rarely want +to give their competitors an opportunity to consume their contributions and then add +proprietary changes to gain an advantage. In general, companies are well advised to have a +detailed understanding of all code that is being used and contributed and their respective +license terms — for proprietary and open source code and for reciprocal and for permissive +licenses. Some companies have successfully installed license review boards or +open source review boards +to create oversight, recommendations and policies to ease the governance.

Despite this, many of the recent open source projects, especially in the cloud world +have adopted permissive licenses, such as X11, BSD 3-clause, MIT and especially the popular +Apache software license (ASL2), as it +appears to allow for faster adoption by companies that may not have mature open source +policies in place or that simply have overly careful lawyers which may be influenced +by the scare tactics some bad companies have built on top of copyleft licenses.

Affero

The reciprocity of the GNU GPL does not apply on the creation of a derived work. A company +can consume GPL'ed code and change it to their own liking without ever making any the +changes available if only used in-house. The terms however do apply as soon as the derived +work is released, i.e. the software is passed on to a third party.

In modern times, software is often used to provide a networked service (think SaaS) to third +parties. Unlike the standard GPL, the Affero GPL (AGPL) does consider the act of making it +available in such a way as similar to releasing the software and does require that applied +changes to the software are being made available in this case.

The AGPL thus closes a shortcoming in the traditional non-Affero GPL for a world that +increasingly moves towards networked services.

The very successful Nextcloud project uses the AGPLv3.

Derived works and Strong vs. Weak Copyleft

What exactly constitutes derived work needs to be defined — it's one of the questions where +copyright law can get subtle. From a practical view, consuming (non-trivial) source code and +binary linking is typically considered creating derived works. Whereas interacting via a network +API or starting another process is typically considered a copyright boundary. To avoid any +unclarity, the Linux kernel community has explicitly called out using Linux system calls (which +includes using the interface definitions) is a copyright boundary and can thus be done by +applications without any license implications.

Considering linked code to be derived works (as is the case in the GPL and AGPL) and thus +requiring it under the same (or a compatible) copyleft license is considered a Strong Copyleft +license.

Libraries are often providing implementations for standard services and helpers; it may not be +reasonable to consider applications that want to use a library as derived works from that +library and requiring the application to thus be licensed under a (compatible) copyleft license. +For these libraries, a Weak Copyleft license (such as the LGPL +or the EPL can be used. This would still require changes to +the library itself to me made available under the copyleft license but would make binary +linking (including the use of interface definitions) a copyright barrier and thus allow for +non-copylefted code to be linked against a weakly copylefted library. This license is used by +many of the standard and system libraries in the Linux world and is often a good choice for +libraries of standardized services.

Patents

Free software licenses are intended to give users broad rights — the GNU GPL talks about the +four freedoms to use software for any purpose, to study and +adjust the software (this needs source code access), to redistribute the software and to improve +it and to make these improvements available.

Software patents can significantly subvert the intended rights — the open source community in +general dislikes software patents for this and many other reasons that are discussed +elsewhere . +In some countries, there are rules that prevent pure software from being patented, though not +all patent offices are fully following these rules.

As software patents are existing and a serious danger to the open source goals, there are a few +attempts to improve the situation. The Apache Software License (a permissive license), requires +code contributors to grant a patent license to all downstream recipients of the code +to use the contributed code by itself or in combination with the project that it was contributed +to and makes a possible patent holder lose its license rights should he nevertheless try to +assert a patent against the thus licensed use. The (A)GPLv3 has a similar clause.

The Open Invention Network (OIN) has a meanwhile +huge patent pool that is cross-licensed between all participants and which can freely be used +in a large list of covered open source software by everyone, except for those that raise patent +violation claims against any of the covered open source projects. This basically restricts +those patents to be only used defensively in the context of the covered open source projects.

Should SCS be in a position to make inventions that should be protected by a software patent, +it pledges to contribute these to the OIN pool.

Very few Open Source projects require copyright assignment; the GNU projects are the +only commonly used ones that the author is aware of. This results in fully centralized +copyright ownership. This puts the FSF into a very +strong position — a position to enforce copyright, to change licenses etc. This requires +a lot of trust towards the copyright assigneed.

Most open source projects prefer distributed copyright — the authors (or their +employers) retain the copyright to their works. They grant a license for the open +source project to use and integrate and redistribute the work — typically the +license grant is extended to the public. In a sufficiently distributed copyright model, +it is very hard to change a license, as all copyright holders would need to agree. +This can both be considered advantageous and disadvantageous.

Many software projects use Contributor License Agreements +(CLAs), documenting that contributed code grants certain rights to the project +owner (a foundation or sometimes a company). This ensures that the project owner +has all needed rights to use, protect, redistribute ... the code. If the CLA contains +copyright assignment, it also allows the project to change the license or to +create derived works under a different license.

While this is advantageous for the project owner, it is not necessarily advantageous for the +code contributor.

Copyright enforcement does not require all copyrights to be held by a legal entity. Any holder +of significant copyrights can actually enforce it against violators.

The Linux kernel and an increasing number of projects do not work with copyright assignments +nor CLAs, but with Developer Certificates of Origin +(DCO — the signed-off lines of kernel commits). This is deemed sufficient to document the origin and the authorization to +contribute code.

The SCS project will not change the license. There however might be cases, where potential users +can not consume AGPL'ed or LGPL'ed code (due to corporate policies, e.g. based on bad experience, +immature license governance practices or lawyers that panic). Our goal would be to ensure that our +licensing terms and all other pledges provide the assurance needed that users do not need to be +afraid of the AGPL. The cure provisions from v3 of the GPL license family actually also help to +avoid unnecessary fear. However, unfortunately, some "open source" companies in the past have +abused copyleft with a scare and sell a proprietary license tactics to make money, which has +hurt copyleft acceptance significantly. We might thus not be successful and need to somehow +accept not serving all users or come up with a relicensing scheme that can not corrupt +ourselves. We are following the copyleft-next discussion to work out how we can best achieve +this, but have not yet found the silver bullet. This might have an influence how we do DCOs, +maybe under a permissive license, or maybe need to use CLAs.

License in = License out

It is best practice that open source projects grant their downstream users the same +license rights as they received contributions under. Or worded the opposite direction: +It is best practice to require no more rights to be granted from upstream contributors +(in the CLA or DCO) than the projects grants to downstream consumers of the project. +SCS follows this best practice.

Further reading

+ + + + \ No newline at end of file diff --git a/dev-docs/index.html b/dev-docs/index.html new file mode 100644 index 0000000000..b98435cccc --- /dev/null +++ b/dev-docs/index.html @@ -0,0 +1,26 @@ + + + + + +Documentation for SCS Developers | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Documentation for SCS Developers

Welcome to the Dev Docs. This section is primarily for SCS Developers and will contain documentation regarding the Development and Architecture of the Sovereign Cloud Stack and its components. You will find documents, explanations and guides regarding the tooling necessary for the development of SCS.

If you want to contribute you can reach out to us via our Matrix Channel.

+ + + + \ No newline at end of file diff --git a/dev-docs/operations/iam/identity-federation-in-scs/index.html b/dev-docs/operations/iam/identity-federation-in-scs/index.html new file mode 100644 index 0000000000..d58e08eb3a --- /dev/null +++ b/dev-docs/operations/iam/identity-federation-in-scs/index.html @@ -0,0 +1,39 @@ + + + + + +Identity Federation in SCS | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Identity Federation in SCS

SovereignCloudStack wants to make it possible for operators to delegate +administration of user identities to the organizational entities that the +users are part of. Usually that's customer organizations but it could also +be the operator itself. Federation protocols like OpenID Connect can be used +to achieve that goal. To simplify connecting the different parts of SCS +to customer owned IAM solutions, SCS deploys Keycloak as central Identity +Provider (IdP) service.

Currently this is deployed automatically only in the osism/testbed, +which provides its own documentation for authentication with OIDC.

The following sections describe how this is done.

1. IaaS / OpenStack

To provide Infrastrucure as a Service SCS builds upon +OpenStack. See section OpenStack Federation via OpenID-Connect +for more details on identity federation for OpenStack.

2. CaaS

To provide Container as a Service SCS builds upon +Kubernetes. There is +work in progress +to optionally connect Kubernetes to Keycloak and to +map authorization decisions based on claims via cluster role bindings.

+ + + + \ No newline at end of file diff --git a/dev-docs/operations/iam/openstack-federation-via-oidc/index.html b/dev-docs/operations/iam/openstack-federation-via-oidc/index.html new file mode 100644 index 0000000000..87f3a86355 --- /dev/null +++ b/dev-docs/operations/iam/openstack-federation-via-oidc/index.html @@ -0,0 +1,66 @@ + + + + + +OpenStack Federation via OpenID-Connect | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

OpenStack Federation via OpenID-Connect

Keystone supports federating authentication and authorization decisions via several mechanisms +as documented by the project.

In SCS OpenID Connect is used for federation between Keystone and the IdP, which is +currently provided by Keycloak +in SCS.

The following sections describe the setup.

1. Keystone

Keystone supports federated identities. +To allow SCS to consume identities managed in external IAM solutions, +federation protocols like OpenID Connect or SAML can be used. +Keystone currently makes use of third party apache modules like +mod_auth_openidc, +mod_oauth2 and +mod_auth_mellon to delegate +authentication to a SSO IdP (i.e. SAML IdP or OpenID Connect provider).

In OpenStack the apache modules are configured using the +wsgi-keystone.conf template.

In SCS we make use of the OAuth 2.0 Authorization Code Grant flow between Keystone and Keycloak +and use PKCE (RFC 7636) with the S256 challenge method.

In addition to the usual SSL CA of the environment, Keycloak uses separate certificates to sign the OIDC tokens.

Due to the way the Keystone container image runs apache (in the foreground) and keystone itself (as WSGI module), +reconfiguring the apache URL locations on the fly is not possible currently without a downtime of several seconds. +That is the reason why SCS currently makes use of a single central proxy realm in Keycloak, to which Keystone +connects.

1.1 Keycloak IdP realm discovery

Keycloak offers standard OIDC service discovery via .well-known documents to advertise its endpoints.

In SCS we want to represent each customer by a separate dedicated Keycloak realm, which can enventually be used +for customer self service and to federate out to customer owned IAM external solutions.

In the SCS testbed we currently experiment with the implications of using a single central proxy realm in Keycloak +and chaining federation from there to customer specific realms, also hosted in the same Keycloak instance. +To make this usable, SCS makes use of the +Keycloak Home IdP Discovery +extension.

1.2 Keystone mapping of token claims

Upon login of a user Keystone evaluates the credentials obtained from the ID token that the IdP issued. +These include group memberships and roles, which can be used to assign the user to a certain project. +Keystone maps these external identities to internal (shadow) users. +It can either attempt to map the obtained information to a local type user, which needs to be +provisioned before authentication by external tooling, or it can be instructed via the mapping to +generate an ephemeral type user. ephemeral users are cleaned up automatically after some time +of inactivity and with that, they lose access to projects, iff the access is granted indirectly +via group membership rather than directly to the user itself.

Group memberships for ephemeral users are only represented via their tokens, but not stored in the +Keystone backend database.

After successful authorization Keystone issues an OpenStack specific fernet token to the user, +which is the currency that is understood by other OpenStack services and can be used to access them.

In SCS we want to represent each customer by a sepatate dedicated OpenStack domain to host +their projects and (shadow) user accounts.

The processing of information from the OIDC tokens is configured by two parts. The first part is the +rules.json mapping which is described in the +OpenStack federation mapping combinations +document. This file is used to configure Keystones internal mapping engine +and it needs to be attached to some OpenStack domain, which is named keycloak by default in SCS.

The second (static) part is the [auth] and [mapped] sections in keystone.conf (see e.g. +the overlays currently used in the OSISM testbed +).

1.3 Horizon WebSSO for federated users

The Horizon dashboard supports login via OpenID Connect via Keystone endpoint. +SCS adjusted the logout behavior to invalidate both, the OpenID Connect session +with the IdP and the Keystone token.

1.4 OpenStack CLI and API access for federated users

To support OpenStack CLI and API access, SCS implemented support for the OIDC Device Authorization Grant +in Keystone. On top we added support for PKCE (RFC 7636) in combination with that.

1.5 SSO Federation between to SCS deployments

To show the potential of this approach to federation SCS created a +Howto for OIDC federation between SCS deployments.

+ + + + \ No newline at end of file diff --git a/dev-docs/operations/operations/zuul-ci-cd-quickstart-user-guide/index.html b/dev-docs/operations/operations/zuul-ci-cd-quickstart-user-guide/index.html new file mode 100644 index 0000000000..17a0b7b969 --- /dev/null +++ b/dev-docs/operations/operations/zuul-ci-cd-quickstart-user-guide/index.html @@ -0,0 +1,101 @@ + + + + + +Zuul users guide | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Zuul users guide

Prerequisites

  1. Repository is known by SCS Zuul
  2. Basic ansible knowledge
  3. Basic yaml knowledge
  4. zuul-client installed (Only if you want to create secrets. See also)

Check SCS Zuul projects for your repository to +be available. If it is missing you need an administrator to get your repository +configured to Zuul.

Who is it for?

You may have heard about Zuul and may ask yourself if it is capable to support you. +Basically everything you use ansible for can be done using Zuul. That is not always +a good thing since you may get careless and your workload will exceed the CI/CD concept.

If you find yourself doing things under the following list you are at the right place.

  1. Code testing
  2. Deployment tests using IaC

If you want to, let's say, monitor something using Zuul, that is possible but not the +intended use case.

Where do I start?

Right in your project's repository! The only prerequisite is that +your repository you want Zuul to work on is known by Zuul. This is done by the Zuul's +tenant configuration. To update this configuration you need access to the Zuul instance +or ask an administrator for help.

We assume that Zuul knows about your repository so we can get started. There are three +topics that you should know about. To get jobs running you need the "job" itself. Jobs run +within a "pipeline". The third important thing is to provide a "project" definition.

Where to save the Zuul relevant data?

Zuul will parse all branches of the untrusted repositories that Zuul knows about. +Your repository is most likely an untrusted one since only the configuration repositories should +have the "trusted" state. +So it doesn't matter whether you have just one branch containing Zuul files or all branches. Zuul +is looking for the following pathes on your repositories root.

./zuul.yaml # everything is in here

./.zuul.yaml # ... or here

./zuul.d/ # use directory style to get a bit of a structure
├── jobs.yaml
└── project.yaml

./.zuul.d/ # the same as before just hidden
├── jobs.yaml
└── project.yaml

Just use exactly one of the four possibilities.

If using the directory style configuration all yaml files within this directory will be +processed. If your projects configuration is small enough you may put all information in +a single file called zuul.yaml. It is also possible to create the file or the directory +with a leading dot to hide them for non zuul related work within the repository.

Projects

If Zuul is configured to observe your repository it will have a look at your projects +definition. Minimal example:

- project:
name: my-org/my-repo
default-branch: main
merge-mode: "squash-merge"
my_pipeline1:
jobs:
- my_job1
- my_job2
......
my_pipeline2:
jobs:
- my_jobs
...

By default Zuul will observe all branches for such files. We have to set the repository name +that have to match the exact value that was set for Zuul. Set a default-branch where actions +that don't match an explicit branch are executed on. Set the merge-mode that Zuul has to use. +But beware that not all issue tracker support all methods. For github squash-merge will work.

After these three properties add the pipelines you want to use to the project definition. +With the jobs list you define which jobs to run in which pipeline.

See official documentation

Pipelines

Every Zuul instance will have at least one repository that is used for configuration. There +you will find the available pipelines. Pipelines are used to run your jobs on a periodic or +event driven base. Pipelines can be used to run other pipelines and to keep your jobs in a +defined order if you need this.

Have a look at the configuration repository to utilize the pipelines for your repository. +See available pipelines for SCS. +You are not able to define new pipelines outside of a so called "configuration" repository. Since, +by default your repo is considered "untrusted". So in the first place you don't need to +think about, how to create a pipeline. Just use one that fits your needs as close as possible. Next you will +find an enumeration and a small description about the available pipelines in SCS Zuul.

Pipelines available in SCS Zuul:

1. check

  • event driven pipeline
  • runs if a pull request is created, changed or reopened
  • re-runs if a comment contains recheck

2. gate

  • event driven pipeline
  • trigger events: pull_request_review, pull_request, check_run

3. post

  • event driven pipeline
  • trigger event: post

4. tag

  • event driven pipeline
  • trigger event: push

5. e2e-test

  • event driven pipeline
  • trigger event: pull_request

6. e2e-quick-test

  • event driven pipeline
  • trigger event: pull_request

7. unlabel-on-update-e2e-test

  • event driven pipeline
  • trigger event: pull_request

8. unlabel-on-update-e2e-quick-test

  • event driven pipeline
  • trigger event: pull_request

9. periodic-hourly

  • time based pipeline that runs every hour

10. periodic-daily

  • time based pipeline that runs every day at 3 o'clock am.

11. compliance_check

  • time based pipeline that runs every 15 minutes

If you want to know more about pipelines: See official documentation

Jobs

All jobs that your Zuul instances knows of can be used for your own purposes. +Call them directly or implement a job that uses an existing job as parent. +Didn't find the right job? Than we have to create a new one. Existing jobs +can be found in the web ui of your Zuul instance: Example

First have a look on a basic job example:

- job:
name: base
parent: null
description: |
The recommended base job.

All jobs ultimately inherit from this. It runs a pre-playbook
which copies all of the job's prepared git repos on to all of
the nodes in the nodeset.

It also sets a default timeout value (which may be overidden).
pre-run: playbooks/base/pre.yaml
post-run:
- playbooks/base/post.yaml
- playbooks/base/post-logs.yaml
roles:
- zuul: zuul/zuul-jobs
timeout: 1800
nodeset:
nodes:
- name: ubuntu-jammy
label: ubuntu-jammy

Each job needs a name that has to be unique within the whole tenant. +A useful convention to achieve this is to prepend the name of the repository. +Each job need to define whether there is parent job or not. +Jobs without a parent are called "base" jobs. Usually you don't want to implement base jobs since +there are already some base jobs that implement often used stuff. A description may not be mandatory +but is obviously useful.

Necessary for Zuul to do anything you just need to add a run or roles property. Within a job that is +like a noop job or just printing something to stdout that is everything you need to run your first job. +Since anything we want to do requires a little bit more you have to define a nodeset. The nodes +are used to run your playbooks on. In 99,9% you will need this too.

The properties pre-run and post-run are useful for bootstrap and cleanup. If your actual job wants to create +bootstrap some infrastructure you can to this in the pre-run. Using an cloud provider you want to release +no longer used resources. That can be done in the post-run. If you are using a parent job it is likely +that the parent job may has pre- and post-run playbooks. In this case your pre- and post-run playbooks are +"nested". Example:

  1. pre-run parent
  2. pre-run my job
  3. post-run my job
  4. post-run parent

If your job exceeds the defined timeout, the job is considered as failed.

See official documentation

What about secrets?

Right now you should be able to run basic tasks. But what if you try to test something +that needs credentials to connect to an outside service? Or you have to address additional +ressources in an openstack environment and you have to use something like app credentials?

That is where job secrets are used. Example:

- job:
name: SOME_JOB
parent: base
description: |
A job basic job used as example
secrets:
- name: clouds_conf
secret: app_credential_cloud_conf
run: playbooks/my-playbook.yaml

Secrets for a job are simply defined by the keyword secrets. +Each secret needs a name that can be used in your playbooks. +The property secret references the secret that is defined within your project.

ATTENTION! If your job is using a secret job.post-review is automatically +set to true. For untrusted projects, that means that your job is only called +in piplines that have the pipeline.post-review flag set to true. In SCS context +that means you may run these jobs only with the pipelines tag and post.

If you want to run jobs on pipelines that have post-review set to false, which +is default, and your job needs a secret, the secret may be defined in the zuul-config repository.

Example:

- secret:
name: app_credential_cloud_conf
data:
credentials: my-secret-value

Within my-playbook.yaml you can reference the secret value using "{{ clouds_conf.credentials }}". +In this example my-secret-value is clear readable text. That is not something we want to keep +secrets. But how do you encrypt secrets in a way that they are secure and also can be decrypted by +Zuul?

For this purpose Zuul creates its own public/private key pair for each project. Everyone may use the +public key to create secrets. But only Zuul will be able to decrypt these values. To avoid the user +to be responsible for the correct encryption there is an zuul-client tool that will do this for you.

Example (reading from stdin and writing to stdout):

zuul-client --zuul-url ZUUL_URL encrypt --tenant SCS --project SovereignCloudStack/REPO

Add --infile INFILE or --outfile OUTFILE if you prefer to work with files directly.

The output might look like this:

- secret:
name: <name>
data:
<fieldname>: !encrypted/pkcs1-oaep
- IGZ2Wu47R9mEY4fjetbxSAUGNaz4HR1mjk9lCLq3HsUMjHGj9YPlb2MvnPQw1LCJSvpaK
ogth7hi2zYwrs5tNAik/qlVSB7AM+LQRP7lmlM4JmD6WOyR7DisHu7oMD1Gqem2ZuMggA
DIBn5+DeBIvnwihDOcS+BKPTVMEtXOJNkuObZHE8DweB/RQIGUvjyeq5yoAmz/y+qGVqe
0Vk4pTYFIBgk5DMzwVnDzDkqs/QokoOupMUoBcpapmM11do4ymjbDpeINjayoro6VXTtX
Mkk9fDv9wuJIQTuyHAOfMD+UYS/HqVSF/Hm9ScUvfhw02gTdzKCxliWhFHJOj7RbdUUMK
OYYcUkNp5cXZUYFnflMhxVEnzREbdAIklNPfoHOizsxLPaUZ9yk6XcFRflFfMvqBtUS00
LCx0Uh906NwdaEUrv2ZdrN123rwfwfw4333232rDFDFfsdfddsfdDFSFSdqrrtwms5Mi0
szUBaM4j+Mayep+41vl0cpsLU91GzXEATWMaPIN8OnEHF6qQIv0wB6VaKd5aeAyERisb3
wFdjEo4faLO70RWzR33k+4xqAYNIIFyTMpWJz21CUSfoYG8ygL6t7RJGgyjA+0KsVEyj+
ewEtiaUOLYyD7pXtqdw1HgzjqiXnfxk+wSv/y5y/TGGYpQj8zU76jS7Zj0ft/0=

You may use this content or the file to provide it as a secret. You just have to update the <name> and the +<fieldname> part.

The secret name has to be unique across all projects. Because of this, we have a naming convention in the +SovereignCloudStack organisation that ensures that a secret has a unique name.

Our convention is as follows. There is only one secret per Zuul configuration per project (for exceptions, +see below). This secret always has a name in the form +SECRET_REPOSITORY_NAME. For instance, if a secret in the SovereignCloudStack/k8s-cluster-api-provider +repository is +to be used, it is given the name SECRET_K8S_CLUSTER_API_PROVIDER. The name of the repository is +always written in capital letters. A dash is replaced with an underscore. Any number of values +(<fieldname>: !encrypted/pkcs1-oaep) can then be assigned to this one secret.

In certain cases, it can be undesireable to expose all secret information to all jobs in a project. +Then additional secrets may be used, whose names have to be formed by appending an underscore and some +upper-case prefix to the name of the primary secret. For instance, we might use the +name SECRET_REPOSITORY_NAME_FOOBAR.

Official documentation:

  1. Secrets documentation
  2. Encryption documentation

Let's put it all together

For a basic but working example the following content may be written into a zuul.yaml file.

# zuul.yaml content
---
- secret:
name: SECRET_REPOSITORY_NAME
data:
secretValue1: !encrypted/pkcs1-oaep
- <ENCRYPTED_DATA>
secretValue2: !encrypted/pkcs1-oaep
- <ENCRYPTED_DATA>
secretValue3: !encrypted/pkcs1-oaep
- <ENCRYPTED_DATA>

- job:
name: myFirstTestJob
parent: base
secrets:
- name: secretName # The name of the secret that is used within "playbooks/testPlaybook.yaml"
secret: SECRET_REPOSITORY_NAME
run: playbooks/testPlaybook.yaml

- job:
name: mySecondTestJob
parent: base
run: playbooks/testPlaybookTwo.yaml

- project:
tag:
jobs:
- myFirstTestJob
check:
jobs:
- mySecondTestJob

This will run the job myFirstTestJob whenever the tag pipeline is triggered, and +mySecondTestJob whenever check is triggered.

Within SCS the check pipeline is always triggered if you open, change or reopen a pull request. +This pipeline can also be triggered manually if you write a comment on an already +existing pull request and place the string recheck in it.

Recall that the first test job cannot run on the same pipeline because it uses a secret. +The tag pipeline is run whenever a new tag is created.

The path to you playbook is always the full path within the repository. The playbook +contains the tasks you actually want to run on all or a specific subset of nodes. +Example playbook:

# playbooks/testPlaybook.yaml content
---
- hosts: all
tasks:
- debug:
msg: 'Debug print my secrets! {{ secretName.secretValue1 }}' # do not do this as it will expose your secrets
+ + + + \ No newline at end of file diff --git a/docs/category/components-1/index.html b/docs/category/components-1/index.html new file mode 100644 index 0000000000..f960d3d974 --- /dev/null +++ b/docs/category/components-1/index.html @@ -0,0 +1,26 @@ + + + + + +Components | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/category/components-2/index.html b/docs/category/components-2/index.html new file mode 100644 index 0000000000..dbfb9c5f69 --- /dev/null +++ b/docs/category/components-2/index.html @@ -0,0 +1,26 @@ + + + + + +Components | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/category/components/index.html b/docs/category/components/index.html new file mode 100644 index 0000000000..2faa3ffb84 --- /dev/null +++ b/docs/category/components/index.html @@ -0,0 +1,26 @@ + + + + + +Components | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/category/iaas-layer/index.html b/docs/category/iaas-layer/index.html new file mode 100644 index 0000000000..618585a112 --- /dev/null +++ b/docs/category/iaas-layer/index.html @@ -0,0 +1,26 @@ + + + + + +IaaS Layer | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/docs/category/identity-and-access-management-iam/index.html b/docs/category/identity-and-access-management-iam/index.html new file mode 100644 index 0000000000..fd16fa408b --- /dev/null +++ b/docs/category/identity-and-access-management-iam/index.html @@ -0,0 +1,26 @@ + + + + + +Identity and Access Management (IAM) | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/category/k8s-cluster-api-provider/index.html b/docs/category/k8s-cluster-api-provider/index.html new file mode 100644 index 0000000000..eab28bf01a --- /dev/null +++ b/docs/category/k8s-cluster-api-provider/index.html @@ -0,0 +1,26 @@ + + + + + +K8s Cluster API Provider | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/docs/category/metering/index.html b/docs/category/metering/index.html new file mode 100644 index 0000000000..3675be92cb --- /dev/null +++ b/docs/category/metering/index.html @@ -0,0 +1,26 @@ + + + + + +Metering | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/category/operating-scs/index.html b/docs/category/operating-scs/index.html new file mode 100644 index 0000000000..ddfa54271d --- /dev/null +++ b/docs/category/operating-scs/index.html @@ -0,0 +1,26 @@ + + + + + +Operating SCS | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/docs/category/releases/index.html b/docs/category/releases/index.html new file mode 100644 index 0000000000..4407d95bdd --- /dev/null +++ b/docs/category/releases/index.html @@ -0,0 +1,26 @@ + + + + + +Releases | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/category/status-page-api/index.html b/docs/category/status-page-api/index.html new file mode 100644 index 0000000000..48595be7de --- /dev/null +++ b/docs/category/status-page-api/index.html @@ -0,0 +1,26 @@ + + + + + +Status Page API | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/container/components/k8s-cluster-api-provider/doc/LoadBalancer-ExtTrafficLocal/index.html b/docs/container/components/k8s-cluster-api-provider/doc/LoadBalancer-ExtTrafficLocal/index.html new file mode 100644 index 0000000000..ec89d9ab46 --- /dev/null +++ b/docs/container/components/k8s-cluster-api-provider/doc/LoadBalancer-ExtTrafficLocal/index.html @@ -0,0 +1,81 @@ + + + + + +Ingress with externalTrafficPolicy: local | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Ingress with externalTrafficPolicy: local

Setting up the nginx ingress controller from the upstream deployment templates +using the externalTrafficPolicy: local setting and -- without any special +treatment -- results in a service that is only partially working: Only requests +that the LoadBalancer happens to route at the node where the nginx container is +running get a response.

nginx could just use the cluster setting instead and kube-proxy would forward +the network packets. There are two reasons for nginx not to do that

  1. Having a load-balancer balance the traffic to a node that is not active just +to have kube-proxy forward it to the active node does not make much sense. +It creates an unnecessary hop and makes the LoadBalancer pretty useless.

  2. Packets forwarded by kube-proxy do not carry the original client IP, so any +source IP dependant handling in nginx (filtering, QoS, ...) will not be +possible.

Getting it to work for managed ingress

There does not seem to be a standard mechanism where k8s tells the LoadBalancer (LB) +which backend members are active, but the load-balancer can find this out by using +a health-monitor that probes for the availability of the service and then takes +the inactive nodes out of the rotation. Should the container be rescheduled on +some other node, the health-monitor will adapt within a few seconds.

Since SCS R2, the deployed nginx-ingress deployment is patched to carry a service +annotation (a behavior specifically needed by OpenStack) that enables the health-monitor for the LB in +front of the ingress. This results in traffic to flow.

This covers the nginx ingress controller that is deployed by setting + DEPLOY_NGINX_INGRESS: true with the create_cluster.sh or apply_nginx_ingress.sh. +That the ingress we call the "managed ingress".

For the ingress service to see the client IPs, more is needed. The Octavia LB +as well as the nginx service both support the proxy protocol, which can be used to +communicate the real client IP. We had plumbing included which we disabled by +default prior to releasing R2, because it broke the access to ingress from +software that runs inside the cluster.

A workaround for this has been implemented, so the default is +NGINX_USE_PROXY: true as of R4. So the managed nginx ingress service +does work reliably and gets the client IPs.

Getting it to work in general

Users that deploy their own nginx or other services with externalTrafficPolicy: local +won't be helped by the annotations done by the SCS cluster management. They will +have to do similar custom patching or revert to a cluster policy and forego the +visibility on real client IPs.

A generic solution to this would be a different kind of LB that does work at the +networking layer 3 (routing), so the (TCP) connections are not terminated at the +LB and then data being forwarded on a new connection to the backend member, but +the routing would create a direct connection. Google (with Direct Server Return, DSR) +and Azure support such LB modes.

As it turns out, on OpenStack clouds that use OVN as networking (SDN) layer, the OVN +loadbalancer does almost deliver what's needed.

OVN provider LoadBalancer

The OVN provider for the load-balancer does create direct flows to the chosen backend +member, so no proxy protocol (or similar hacks) are needed to make the backend service +see the client IPs. This has been validated (and can even be monitored by openstack-health-monitor) +on SCS clouds that use OVN.

A health-monitor is still needed to ensure that only active members receive requests. +There are unfortunately two problems with the health-monitoring on the OVN provider:

  • The health-monitor does correctly detect members that are not responding and stops +routing traffic from the VIP towards the inactive member. Unfortunately the +traffic that comes in from the floating IP associated with the VIP is not treated +the same, but is still distributed to the inactive members, resulting in a good +fraction of the requests to go unanswered. This is tracked in bug +https://bugs.launchpad.net/neutron/+bug/1956035
  • The OCCM always tries to create an HTTP health-monitor. The OVN provider however +does not yet support HTTP health-monitors, only TCP. We'll have to wait for (and +possibly help with) HTTP health-monitors to be implemented upstream.

Due to the HTTP health-monitor not being supported, the created loadbalancer is not +considered functional, so the reconciliation loop creates another loadbalancer until +your project runs into quota limits (on the loadbalancer or on ports). +So for now, the feature use_ovn_lb_provider should not be enabled.

Note that the use_ovn_lb_provider does not affect the LB in front of the kube API. +That one is created by capo and requires other settings. Also note that it would +not yet support the CIDR filtering with restrict_kubeapi setting.

Disabled health-monitor by default

We could enable a health-monitor by default for load-balancers created from OCCM +in the k8s clusters. This would make services with externalTrafficPolicy: local +work, as the traffic would be routed exclusively to active members. But the +other goal would not be achieved: Getting the real client IPs. +We decided against turning on the health-monitor by default, as this might result +in the wrong impression that local fully works. Rather break and then have users take +a decision to go for cluster, to enable health-monitoring to get it half-working +or to do health-monitoring plus some extra plumbing for proxy protocol (or similar) +to get all aspects working.

+ + + + \ No newline at end of file diff --git a/docs/container/components/k8s-cluster-api-provider/doc/Maintenance_and_Troubleshooting/index.html b/docs/container/components/k8s-cluster-api-provider/doc/Maintenance_and_Troubleshooting/index.html new file mode 100644 index 0000000000..fd29094ab6 --- /dev/null +++ b/docs/container/components/k8s-cluster-api-provider/doc/Maintenance_and_Troubleshooting/index.html @@ -0,0 +1,81 @@ + + + + + +Maintenance and Troubleshooting Guide for SCS k8s-cluster-api-provider | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Maintenance and Troubleshooting Guide for SCS k8s-cluster-api-provider

Client Certificates in Kubernetes expire after one year.

What does a provider need to do in order to NOT run into a certificate issue?

  1. Update the cluster at least once a year to rotate certificates automatically

    • Automatic certificate renewal for cluster upgrades
    • kubeadm renews all the certificates during control plane +upgrade. +This feature is designed for addressing the simplest use cases; if you don't have specific +requirements on certificate renewal and perform Kubernetes version upgrades regularly +(less than 1 year in between each upgrade), kubeadm will take care of keeping your +cluster up to date and reasonably secure.

  2. Renew all certificates with kubeadm certs renew all

Certificate Authority expires

Another problem is that the CA might expire as well (normally after 10 years)

  • kubeadm does not have any tooling for this at the time of writing
  • There is documentation for +Manual Rotation of CA Certifcates
  • On the management node, there is a signer.sh that can be used to sign server certificates +after checking that they belong to the server.

Failed cluster deployment debugging

NOTE: The following kubectl and clusterctl commands should be executed against +the management Kubernetes cluster API. Keep in mind that these tools and the +kubeconfig to access the management Kubernetes cluster are available in the management +host, hence it is convenient to execute the following commands from the management host.

Ask Kubernetes what went wrong:

kubectl describe cluster <CLUSTER_NAME>

The status and the events may give you a clue what happened. The healthy cluster should +be in the phase: Provisioned

$ kubectl describe cluster <CLUSTER_NAME> | yq .Status.Phase
Provisioned

You can also have a look at the openstackcluster object and see OpenStack related +statuses and events. The healthy cluster should be ready:

$ kubectl describe openstackcluster <CLUSTER_NAME> | yq .Status.Ready
true

Note that you can instead execute kubectl get cluster <CLUSTER_NAME> -ojsonpath='{ .status.phase }' +and kubectl get openstackcluster <CLUSTER_NAME> -ojsonpath='{ .status.ready }' +if you don't have yq at hand.

A handy command for cluster health investigation is clusterctl describe cluster <CLUSTER_NAME>. +This prints infrastructure/control plane/workers readiness status and other relevant +information like a failure reason. The healthy cluster output is similar to this:

$ clusterctl describe cluster <CLUSTER_NAME>
NAME READY SEVERITY REASON SINCE MESSAGE
Cluster/testcluster True 21m
├─ClusterInfrastructure - OpenStackCluster/testcluster
├─ControlPlane - KubeadmControlPlane/testcluster-control-plane True 23m
│ └─3 Machines... True 21m See testcluster-control-plane-5ftjs, testcluster-control-plane-62cdj, ...

└─Workers
└─MachineDeployment/capi-testcluster-md-0-no1 True 22m
└─3 Machines... True 21m See capi-testcluster-md-0-no1-84dd86f598-bhxfd, capi-testcluster-md-0-no1-84dd86f598-f6pnl, ...

The logs of the capi pod and especially the capo pod are a good source of information. +To find out in which condition the deployment status is, you can use the following way:

kubectl logs -n capo-system -l control-plane=capo-controller-manager -c manager

Successful cluster creation will log Reconciled Machine create successfully for +successfully created nodes.

kubectl logs -n capi-system -l control-plane=controller-manager -c manager

In some cases could be a good idea to go through the official [capi] +(https://cluster-api.sigs.k8s.io/user/troubleshooting.html) and capo +troubleshooting guides or check whether you hit some known bug already reported in +capi +or capo projects.

You can also check the OpenStack layer. A cluster deployment should result in a +router,a network, a subnet, a loadbalancer (in front of kubeapi) and a number of servers (VMs) +for the control-plane and worker nodes. Have you run out of quota?

Cluster state

Have a look at the pods that run: +kubectl --context=<CLUSTER_NAME>-admin@<CLUSTER_NAME> get pods -A

or have a look at the nodes: +kubectl --context=<CLUSTER_NAME>-admin@<CLUSTER_NAME> get nodes -o wide

If you fall into some Kubernetes specific issues after a successful cluster +creation, go through the official Kubernetes +troubleshooting guide.

Etcd maintenance

Etcd is a highly-available key value store used as Kubernetes' +backing store for all cluster data. This section contains etcd related maintenance +notes from SCS k8s-cluster-api-provider project perspective.

For further information about etcd maintenance visit an official etcd maintenance guide +and/or Kubernetes etcd operating guide.

Defragmentation and backup

Etcd storage can become fragmented over time, for this, we have included a +maintenance script that regularly defragments and then also backups the database. +The script, called etcd-defrag.sh is located in each control plane node's /root +directory . It is executed through the systemd service unit file etcd-defrag.service +and scheduled to run each day at 02:30:00 using the etcd-defrag.timer systemd timer.

The defragmentation strategy is inspired by the etcd-defrag-cronjob and +practices recommended by the OpenShift project. +Note that the proposed strategy could be changed in a future version based on results from +related upstream issue #15477 which wants to define +an official solution on how to defragment etcd cluster.

The etcd-defrag.sh script checks multiple conditions before the actual defragmentation as +follows:

  • The script should not be executed on non leader etcd member
  • The script should not be executed on etcd cluster with some unhealthy member
  • The script should not be executed on single member etcd cluster

These pre-flight checks should ensure, that the defragmentation does not cause temporary +etcd cluster failures and/or unwanted etcd leader changes. They also prevent executing +the script on a single control-plane node cluster. Single-node etcd clusters are not +made for long-term operation. As a workaround, however, you can scale up to three +control-plane nodes overnight from time to time.

After all pre-flight checks passed the etcd cluster defragmentation is performed as follows:

  • Defragment the non leader etcd members first
  • Change the leadership to the randomly selected and defragmentation completed etcd member
  • Defragment the local (ex-leader) etcd member

At the end of the defragmentation script, the local (ex-leader) etcd member is backed up +and trimmed. Backup is saved and then compressed in the control plane /root directory. +You can find it here: /root/etcd-backup.xz. File system trim is performed by the fstrim +command that discards unused blocks on a filesystem which could increase write performance +on the long run and also release unused storage. Cluster admins are not supposed to log +in to the cluster nodes (neither control plane nor workers) and thus won't access or use +these backup files. The local backups on these nodes however can prove useful however +in a disaster recovery scenario.

All mentioned pre-flight checks could be skipped by the optional arguments that force +defragmentation despite potential failures. Optional arguments are:

  • --force-single (allows to execute defragmentation on single member etcd cluster)
  • --force-unhealthy (allows to execute defragmentation on unhealthy etcd member)
  • --force-nonleader (allows to execute defragmentation on non leader etcd member)

We do not recommend to log in to the cluster nodes let alone executing manual +defragmentation using the optional arguments above. If you are aware of potential +issues, you can access the control plane node and execute the defragmentation script +manually as follows:

/root/etcd-defrag.sh [--force-single] [--force-unhealthy] [--force-nonleader]
+ + + + \ No newline at end of file diff --git a/docs/container/components/k8s-cluster-api-provider/doc/Upgrade-Guide/index.html b/docs/container/components/k8s-cluster-api-provider/doc/Upgrade-Guide/index.html new file mode 100644 index 0000000000..3409f9f9ed --- /dev/null +++ b/docs/container/components/k8s-cluster-api-provider/doc/Upgrade-Guide/index.html @@ -0,0 +1,186 @@ + + + + + +SCS k8s-cluster-api-provider upgrade guide | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

SCS k8s-cluster-api-provider upgrade guide

SCS k8s-cluster-api-provider upgrade guide

This document explains the steps to upgrade the SCS Kubernetes cluster-API +based cluster management solution as follows:

  • from the R2 (2022-03) to the R3 (2022-09) state
  • from the R3 (2022-09) to the R4 state
  • from the R4 (2023-09) to the R5 state +The document explains how the management cluster and the workload clusters can be +upgraded without disruption. It is highly recommended to do a step-by-step upgrade +across major releases i.e. upgrade from R2 to R3 and then to R4 in the case of +upgrade from the R2 to the R4. Upgrades across major releases without step-by-step +process is not recommended and could lead to undocumented issues.

The various steps are not very complicated, but there are numerous steps to +take, and it is advisable that cluster operators get some experience with +this kind of cluster management before applying this to customer clusters +that carry important workloads.

Note that while the detailed steps are tested and targeted to a R2 -> R3 move, +R3 -> R4 move or R4 -> R5 move, many of the steps are a generic approach that will apply also for other +upgrades, so expect a lot of similar steps when moving beyond R5.

Upgrades from cluster management prior to R2 is difficult; many changes before +R2 assumed that you would redeploy the management cluster. Redeploying the +management cluster can of course always be done, but it's typically disruptive +to your workload clusters, unless you move your cluster management state into +a new management cluster with clusterctl move.

Management host (cluster) vs. Workload clusters

When you initially deployed the SCS k8s-cluster-api-provider, you create a +VM with a kind cluster inside and a number of +templates, scripts and binaries that are then used to do the cluster management. +This is your management host (or more precisely you single-host management +cluster). Currently, all cluster management including upgrading etc. is done +by connecting to this host via ssh and performing commands there. (You don't +need root privileges to do cluster management there, the normal ubuntu user +rights are sufficient; there are obviously host management tasks such as +installing package updates that do require root power and the user has the +sudo rights to do so.)

When you create the management host, you have the option to create your +first workload cluster. This cluster is no different from other workload +clusters that you create by calling commands on the management host, so you +can manage it there. (The default name of this cluster is typically +testcluster, though that can be changed since a while, #264).

On the management host, you have the openstack and kubernetes tools +installed and configured, so you can nicely manage all aspects of your +CaaS setups as well as the underlying IaaS. The kubectl configuration +is in ~/.kube/config while you will find the OpenStack configuration +in ~/.config/openstack/clouds.yaml. These files are automatically +managed; you can add entries to the files though, and they should +persist.

Updating the management host

There are two different possibilities to upgrade the management host.

  1. You do a component-wise in-place upgrade of it.
  2. You deploy a new management host and clusterctl move the resources +over to it from the old one. (Note: Config state in ~/CLUSTER_NAME/)

TODO: Advice when to do what, risks, limitations

In-place upgrade

Operating system

You should keep the host up-to-date with respect to normal operating system +upgrades, so perform your normal sudo apt-get update && sudo apt-get upgrade. +kubectl, kustomize, yq, lxd and a few other tools are installed as +snaps, so you may want to upgrade these as well: sudo snap refresh. +From R5 sudo apt-get install -y jq is also required as this is used by the diskless flavors feature, #424. +Default operating system image was changed from Ubuntu 20.04 to Ubuntu 22.04 in R4.

k8s-cluster-api-provider git

The automation is deployed on the management host by cloning the relevant +git repository. +into the k8s-cluster-api-provider directory. Note that the checked out +branch will be the one that has been used when creating the management host, +and you might want to change branches from maintained/v3.x to maintained/v4.x +in case of R2 to R3 upgrade, maintained/v5.x for R3 to R4 upgrade, or maintained/v6.x +for R4 to R5 upgrade. +Use git branch -rl to see available branches in the k8s-cluster-api-provider +repository.

You can update the scripts and templates by checking out the relevant branch +main, maintained/v4.x, maintained/v5.x, or maintained/v6.x and using a git pull to ensure +the latest content is retrieved. Once you do that, the cluster-management scripts +will be up-to-date. (The ~/bin directory in your search PATH is symlinked to the +check-ed out scripts.)

Note however that the binaries and used templates are NOT automatically updated. +This should not normally result in problems -- when new features are introduced +in the management scripts, they ensure to continue to support older templates.

Updating cluster-API and openstack cluster-API provider

To get the latest version of cluster-API, you can download a new clusterctl +binary from https://github.com/kubernetes-sigs/cluster-api/releases, +make it executable chmod +x clusterctl and install it to /usr/local/bin/, +possibly saving the old binary by renaming it. clusterctl version should now +display the current version number (v1.3.5 at the time of this writing).

You can now issue the command clusterctl upgrade plan and clusterctl will +list the components in your (kind) management cluster that can be upgraded. +Here's an example output:

ubuntu@capi-old-mgmtcluster:~ [0]$ clusterctl upgrade plan
Checking cert-manager version...
Cert-Manager is already up to date

Checking new release availability...

Latest release available for the v1beta1 API Version of Cluster API (contract):

NAME NAMESPACE TYPE CURRENT VERSION NEXT VERSION
bootstrap-kubeadm capi-kubeadm-bootstrap-system BootstrapProvider v1.3.5 v1.5.1
control-plane-kubeadm capi-kubeadm-control-plane-system ControlPlaneProvider v1.3.5 v1.5.1
cluster-api capi-system CoreProvider v1.3.5 v1.5.1
infrastructure-openstack capo-system InfrastructureProvider v0.7.1 v0.7.3

You can now apply the upgrade by executing the following command:

clusterctl upgrade apply --contract v1beta1

You can then upgrade the components. You can do them one-by-one or simply do +clusterctl upgrade apply --contract v1beta1

New templates

The cluster-template.yaml template used for the workload clusters is located in +~/k8s-cluster-api-provider/terraform/files/template/ and copied from there into +~/cluster-defaults/. Then workload clusters are created, they will also have a +copy of it in ~/${CLUSTER_NAME}/. If you have not changed it manually, you can +copy it over the old templates. (Consider backing up the old one though.)

The next create_cluster.sh <CLUSTER_NAME> run will then use the new template. +Note that create_cluster.sh is idempotent -- it will not perform any changes +on the cluster unless you have changed its configuration by tweaking +cluster-template.yaml (which you almost never do!) or clusterctl.yaml +(which you do often).

The other template file that changed -- however, some terraform logic is used to +prefill it with values. So you can't copy it from git.

R2 to R3

For going from R2 to R3, there is just one real change that you want +to apply: Add the variables CONTROL_PLANE_MACHINE_GEN: genc01 and +WORKER_MACHINE_GEN: genw01 to it. If you have copied over the new +cluster-template.yaml as described above, then you're done. Otherwise +you can use the script update-R2-R3.sh <CLUSTER_NAME> +to tweak both clusterctl.yaml and cluster-template.yaml for the +relevant cluster. (You can use cluster-defaults to change the templates +in ~/cluster-defaults/ which get used when creating new clusters.)

R3 to R4

In the R3 to R4, CALICO_VERSION was moved from .capi-settings to clusterctl.yaml. So +before upgrading workload clusters, you must add it also to the ~/${CLUSTER_NAME}/clusterctl.yaml.

echo "CALICO_VERSION: v3.25.0" >> ~/cluster-defaults/clusterctl.yaml
echo "CALICO_VERSION: v3.25.0" >> ~/testcluster/clusterctl.yaml

In the R3 to R4 upgrade process, cluster-template.yaml changed etcd defrag process in the +kubeadm control-planes and also security group names by adding ${PREFIX}- to them, so it +has to be changed also in openstack project e.g. (PREFIX=capi):

openstack security group set --name capi-allow-ssh allow-ssh
openstack security group set --name capi-allow-icmp allow-icmp

We changed immutable fields in the Cluster API templates, so before running +create_cluster.sh to upgrade existing workload cluster the CONTROL_PLANE_MACHINE_GEN +and WORKER_MACHINE_GEN needs to be incremented in cluster specific clusterctl.yaml.

In the R3 to R4 process, also cloud.conf added enable-ingress-hostname=true to the +LoadBalancer section. It is due to NGINX_INGRESS_PROXY defaulting to true now. So if +you want to use, or you are already using this proxy functionality we recommend you to +add this line to your cloud.conf, e.g.:

echo "enable-ingress-hostname=true" >> ~/cluster-defaults/cloud.conf
echo "enable-ingress-hostname=true" >> ~/testcluster/cloud.conf

Then, before upgrading workload cluster by create_cluster.sh, +you should delete cloud-config secret in the kube-system namespace, so it can be recreated. E.g.: +kubectl delete secret cloud-config -n kube-system --kubeconfig=testcluster/testcluster.yaml

Also, the default nginx-ingress version has changed, so we recommend before upgrading cluster +to delete ingress-nginx jobs, so new job with new image can be created in the update process.

kubectl delete job ingress-nginx-admission-create -n ingress-nginx --kubeconfig=testcluster/testcluster.yaml
kubectl delete job ingress-nginx-admission-patch -n ingress-nginx --kubeconfig=testcluster/testcluster.yaml
R4 to R5

In R4 to R5, the cluster-template.yaml and clusterctl.yaml changed (see release notes). +You can use script update-R4-to-R5.sh to update the cluster's cluster-template.yaml and clusterctl.yaml from +R4 to R5. This script could update an existing Kubernetes cluster configuration files +as well as cluster-defaults files that could be used for spawning new R5 clusters.

If you want to update an existing cluster configuration files from R4 to R5, just use script as follows:

update-R4-to-R5.sh <CLUSTER_NAME>

After you executed the above you will find that e.g. Calico version has been bumped from +v3.25.0 to v3.26.1. Note that some software versions are not configurable and are not +directly mentioned in the cluster configuration files, but they are hardcoded +in R5 scripts (e.g. ingress nginx controller, metrics server), see new-defaults section. +Note that the Kubernetes version was not updated as well the default CNI is not the Cilium yet. +This two R5 features are out of scope this script when it is applied on the existing cluster +configuration files as this features require advanced action such as CNI migration +and step-by-step Kubernetes upgrade of +2 minor releases.

If you want to update cluster-defaults configuration files from R4 to R5, just use script as follows:

update-R4-to-R5.sh cluster-defaults

The above action updates a cluster-defaults configuration file, which is almost similar +to updating an existing cluster configuration file described above. The distinction lies +in the fact that both the Kubernetes version and the default CNI are also updated, specifically +to Kubernetes version v1.27.5 and Cilium as a default CNI.

If you are curious: In R2, doing rolling upgrades of k8s versions required +edits in cluster-template.yaml -- this is no longer the case in R3, R4 and R5. +Just increase the generation counter for node and control plane nodes if you +upgrade k8s versions -- or otherwise change the worker or control plane +node specs, such as e.g. using a different flavor.

New defaults

You deploy a CNI (calico or cilium), the OpenStack Cloud Controller +Manager (OCCM), the cinder CSI driver to clusters; optionally also a +metrics server (default is true), a nginx ingress controller (also +defaulting to true), the flux2 controller, the cert-manager. +Some of these tools come with binaries that you can use for management +purposes and which get installed on the management host in /usr/local/bin/.

The scripts that deploy these components into your workload clusters +download the manifests into ~/kubernetes-manifests.d/ with a version +specific name. If you request a new version, a new download will happen; +already existing versions will not be re-downloaded.

Most binaries in /usr/local/bin/ are not stored under a version-specific +name. You need to rename them to case a re-download of a newer version. +(The reason for not having version specific names is that this would +break scripts from users that assume the unversioned names; the good +news is that most of these binaries have no trouble managing somewhat +older deployments, so you can typically work with the latest binary +tool even if you have a variety of versions deployed into various +clusters.)

The defaults have changed as follows:

R2R3R4R5
kindv0.14.0v0.14.0v0.17.0v0.20.0
capiv1.0.5v1.2.2v1.3.5v1.5.1
capov0.5.3v0.6.3v0.7.1v0.7.3
helmv3.8.1v3.9.4v3.11.1v3.12.3
sonobuoyv0.56.2v0.56.10v0.56.16v0.56.17
k9sunversionedunversionedunversionedv0.27.4
calicov3.22.1v3.24.1v3.25.0v3.26.1
calico CLIv3.22.1v3.24.1v3.25.0v3.26.1
ciliumunversionedunversionedv1.13.0v1.14.1
cilium CLIunversionedunversionedv0.13.1v0.15.7
hubble CLIunversionedunversionedv0.11.2v0.12.0
nginx-ingressv1.1.2v1.3.0v1.6.4v1.8.1
flux2unversionedunversionedv0.40.2v2.1.0
cert-managerv1.7.1v1.9.1v1.11.0v1.12.4
metrics-serverv0.6.1v0.6.1v0.6.1v0.6.4

The clusterctl move approach

To be written

  1. Create new management host in same project -- avoid name conflicts +with different prefix, to be tweaked later. Avoid testcluster creation
  2. Ensure it's up and running ...
  3. Tweak prefix
  4. Copy over configs (and a bit of state though that's uncritical) by using +the directories
  5. Copy over the openstack credentials clouds.yaml and the kubectl config
  6. clusterctl move

Updating workload clusters

k8s version upgrade

On R2 clusters

The old way: Editing cluster-template.yaml. Or better use the +update-R2-to-R3.sh script to convert first.

On R3 and R4 clusters

Edit ~/<CLUSTER_NAME>/clusterctl.yaml and put the wanted version into the +fields KUBERNETES_VERSION and OPENSTACK_IMAGE_NAME. The node image will +be downloaded from https://minio.services.osism.tech/openstack-k8s-capi-images +and registered if needed. (If you have updated the k8s-cluster-api-provider repo, +you can use a version v1.NN.x, where you fill in NN with the wanted k8s version, +but leave a literal .x which will get translated to the newest tested version.)

In the same file, increase the generation counters for CONTROL_PLANE_MACHINE_GEN +and WORKER_MACHINE_GEN.

Now do the normal create_cluster.sh <CLUSTER_NAME> and watch cluster-api +replace your worker nodes and doing a rolling upgrade of your control plane. +If you used a 3-node (or 5 or higher) control plane node setup, you will have +uninterrupted access not just to your workloads but also the workload's cluster +control plane. Use clusterctl describe cluster <CLUSTER_NAME> or simply +kubectl --context <CLUSTER_NAME>-admin@<CLUSTER_NAME> get nodes -o wide +to watch the progress of this.

On R5 clusters

If you decide to migrate your existing Kubernetes cluster from R4 to R5 be aware of the following:

  • R5 features such as per cluster namespaces and Cilium as a default CNI are supported +only on new clusters and will not be migrated on the existing clusters
  • R4 default Kubernetes version v1.25.6 can not be directly migrated to the R5 default +Kubernetes version v1.27.5, because +2 minor Kubernetes version upgrade is not allowed. +See further migration steps below if you want to upgrade also Kubernetes version to R5

Follow the below steps if you want to migrate an existing cluster from R4 to R5:

  1. Access your management node
  2. Checkout R5 tag
    cd k8s-cluster-api-provider
    git pull
    git checkout tags/v6.0.0
  3. Backup an existing cluster configuration files (recommended)
    cd ..
    cp -R <CLUSTER_NAME> <CLUSTER_NAME>-backup
  4. Update an existing cluster configuration files from R4 to R5:
    update-R4-to-R5.sh <CLUSTER_NAME>
  5. Validate updated cluster configuration files. You will find that e.g. Calico version +has been bumped from v3.25.0 to v3.26.1. Note that some software versions are not configurable +and are not directly mentioned in the cluster configuration files, but they are hardcoded +in R5 scripts (e.g. ingress nginx controller, metrics server). Hence, read carefully the +R5 release notes too. Also see that Kubernetes version was not updated, and it is still v1.25.6.
  6. Update an existing cluster (expect Kubernetes version)
    create_cluster.sh <CLUSTER_NAME>
  7. Update cluster-API and openstack cluster-API provider, see related section for details
     clusterctl upgrade plan
    clusterctl upgrade apply --contract v1beta1
  8. Bump Kubernetes version +1 minor release (to v1.26.8) and increase the generation counter for node and control plane nodes
    sed -i 's/^KUBERNETES_VERSION: v1.25.6/KUBERNETES_VERSION: v1.26.8/' <CLUSTER_NAME>/clusterctl.yaml
    sed -i 's/^OPENSTACK_IMAGE_NAME: ubuntu-capi-image-v1.25.6/OPENSTACK_IMAGE_NAME: ubuntu-capi-image-v1.26.8/' <CLUSTER_NAME>/clusterctl.yaml
    sed -r 's/(^CONTROL_PLANE_MACHINE_GEN: genc)([0-9][0-9])/printf "\1%02d" $((\2+1))/ge' -i <CLUSTER_NAME>/clusterctl.yaml
    sed -r 's/(^WORKER_MACHINE_GEN: genw)([0-9][0-9])/printf "\1%02d" $((\2+1))/ge' -i <CLUSTER_NAME>/clusterctl.yaml
  9. Update an existing cluster Kubernetes version to v1.26.8
    create_cluster.sh <CLUSTER_NAME>
  10. Bump Kubernetes version to R5 v1.27.5 and increase the generation counter for node and control plane nodes
    sed -i 's/^KUBERNETES_VERSION: v1.26.8/KUBERNETES_VERSION: v1.27.5/' <CLUSTER_NAME>/clusterctl.yaml
    sed -i 's/^OPENSTACK_IMAGE_NAME: ubuntu-capi-image-v1.26.8 /OPENSTACK_IMAGE_NAME: ubuntu-capi-image-v1.27.5/' <CLUSTER_NAME>/clusterctl.yaml
    sed -r 's/(^CONTROL_PLANE_MACHINE_GEN: genc)([0-9][0-9])/printf "\1%02d" $((\2+1))/ge' -i <CLUSTER_NAME>/clusterctl.yaml
    sed -r 's/(^WORKER_MACHINE_GEN: genw)([0-9][0-9])/printf "\1%02d" $((\2+1))/ge' -i <CLUSTER_NAME>/clusterctl.yaml
  11. Update an existing cluster to the R5 Kubernetes version v1.27.5
    create_cluster.sh <CLUSTER_NAME>

New versions for mandatory components

OCCM, CNI (calico/cilium), CSI

New versions for optional components

nginx, metrics (nothing to do), cert-manager, flux

etcd leader changes

While testing clusters with >= 3 control nodes, we have observed occasional transient +error messages that reported an etcd leader change preventing a command from succeeding. +This could result in a dozen of random failed tests in a sonobuoy conformance run. +(Retrying the commands would let them succeed.)

Too frequent etcd leader changes are detrimental to your control plane performance and +can lead to transient failures. They are a sign that the infrastructure supporting your +cluster is introducing too high latencies.

We recommend to deploy the control nodes (which run etcd) on instances with local SSD +storage (which we reflect in the default flavor name) and recommend using flavors with +dedicated cores and that your network does not introduce latencies by significant packet drop.

We now always use slower heartbeat (250ms) and increase CPU and IO priority which used to be +controlled by ETCD_PRIO_BOOST. This is safe.

If you build multi-controller clusters and can not use a flavor with low latency local storage +(ideally SSD), you can also work around this with ETCD_UNSAFE_FS. ETCD_UNSAFE_FS is using +barrier=0 mount option, which violates filesystem ordering guarantees. +This works around storage latencies, but introduces the risk of inconsistent +filesystem state and inconsistent etcd data in case of an unclean shutdown. +You may be able to live with this risk in a multi-controller etcd setup. +If you don't have flavors that fulfill the requirements (low-latency +storage attached), your choice is between a single-controller cluster +(without ETCD_UNSAFE_FS) and a multi-controller cluster with +ETCD_UNSAFE_FS. Neither option is perfect, but we deem the +multi-controller cluster preferable in such a scenario.

+ + + + \ No newline at end of file diff --git a/docs/container/components/k8s-cluster-api-provider/doc/application-credentials/index.html b/docs/container/components/k8s-cluster-api-provider/doc/application-credentials/index.html new file mode 100644 index 0000000000..ac04226dc7 --- /dev/null +++ b/docs/container/components/k8s-cluster-api-provider/doc/application-credentials/index.html @@ -0,0 +1,26 @@ + + + + + +Application Credentials | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Application Credentials

The terraform creates an application credential that it passes into the created VM. This one is then used to authenticate the cluster API provider against the OpenStack API to allow it to create resources needed for the k8s cluster.

The AppCredential has a few advantages:

  • We take out variance in how the authentication works -- we don't have to deal with a mixture of project_id, project_name, project_domain_name, user_domain_name, only a subset of which is needed depending on the cloud.
  • We do not leak the user credentials into the cluster, making any security breach easier to contain.
  • AppCreds are connected to one project and can be revoked.

We are using an unrestricted AppCred for the management server which can then create further AppCreds, so we can each cluster its own (restricted) credentials. In the case of breaches, these AppCreds can be revoked.

Note that you can have additional projects or clouds listed in your ~/.config/openstack/clouds.yaml (and secure.yaml) and reference them in the OPENSTACK_CLOUD setting of your clusterctl.yaml, so you can manage clusters in various projects and clouds from the same management server.

+ + + + \ No newline at end of file diff --git a/docs/container/components/k8s-cluster-api-provider/doc/configuration/index.html b/docs/container/components/k8s-cluster-api-provider/doc/configuration/index.html new file mode 100644 index 0000000000..dfc849b0ab --- /dev/null +++ b/docs/container/components/k8s-cluster-api-provider/doc/configuration/index.html @@ -0,0 +1,29 @@ + + + + + +Configuration | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Configuration

Supported k8s versions

As of R5, our tests cover 1.24.latest ... 1.27.latest. +All of them pass the sonobuoy CNCF conformance tests.

Overview over the parameters in clusterctl.yaml and environment-XXX.tfvars

The provenance capo means that this setting comes from the templates used by +the cluster-api-provider-openstack, while SCS denotes that this setting has +been added by the SCS project.

Parameters CAPI management server

Parameters controlling the Cluster-API management server (capi management server) creation:

environmentclusterctl.yamlprovenancedefaultmeaning
prefixSCScapiPrefix used for OpenStack resources for the capi mgmt node
kind_flavorSCSSCS-2V-4Flavor to be used for the k8s capi mgmt server
imageSCSUbuntu 22.04Image for the capi mgmt server. Use Ubuntu 22.04 or Debian 12. Check also the ssh_username parameter
ssh_usernameSCSubuntuName of the default user for the image
clusterapi_versionSCS1.5.3 Version of the cluster-API incl. clusterctl
capi_openstack_versionSCS0.8.0 Version of the cluster-api-provider-openstack (needs to fit the CAPI version)
cilium_binariesSCSv0.15.7;v0.12.0Versions of the cilium and hubble CLI in the vA.B.C;vX.Y.Z format

Common parameters management server and clusters

Parameters controlling both management server creation and cluster creation:

environmentclusterctl.yamlprovenancedefaultmeaning
cloud_providerOPENSTACK_CLOUDcapoOS_CLOUD name in clouds.yaml
external/external_idOPENSTACK_EXTERNAL_NETWORK_IDcapo""Name/ID of the external (public) OpenStack network, default "" uses the detected external network (for clouds with one external network). Required for clouds with more than one external network
dns_nameserversOPENSTACK_DNS_NAMESERVERScapo[ "5.1.66.255", "185.150.99.255" ]Array of nameservers for capi mgmt server and for cluster nodes, replace the FF MUC defaults with local servers if available
availability_zoneOPENSTACK_FAILURE_DOMAINcapoAvailability Zone(s) for the mgmt node / workload clusters
kind_mtuMTU_VALUESCS0MTU for the mgmt server; Calico is set 50 bytes smaller; 0 means autodetection
restrict_mgmt_serverSCS["0.0.0.0/0"]Allows restricting access to the management server by the given list of CIDRs. Empty value (default) means public.
http_proxySCSGlobal setting for HTTP Proxy is set on the management host including all cluster-api components running in the bootstrap-cluster. Specify with protocol: e.g "http://10.10.10.10:3128"
no_proxySCSGlobal setting for HTTP Proxy exception list. If http_proxy is not set this setting has no effect. If http_proxy is set, the default value for the NO_PROXY environment variable on all affected components is set to .svc,.svc.cluster,.svc.cluster.local,127.0.0.0/8,169.254.169.254/32,fd00:ec2::254/128,${var.node_cidr},${var.pod_cidr},${var.service_cidr}. The content of no_proxy is appended to this list. This setting has no effect on apt and snap commands, the way http_proxy is set for apt and snap does not allow the configuration of proxy exceptions.

Parameters clusters

Parameters controlling the cluster creation:

environmentclusterctl.yamlprovenancedefaultmeaning
node_cidrNODE_CIDRSCS10.8.0.0/20IPv4 address range (CIDR notation) for workload nodes
pod_cidrPOD_CIDRSCS192.168.0.0/16IPv4 address range (CIDR notation) for pods
service_cidrSERVICE_CIDRSCS10.96.0.0/12IPv4 address range (CIDR notation) for services
use_ciliumUSE_CILIUMSCStrueUse cilium as CNI instead of calico, it can be set to vX.Y.Z and true results in v1.14.1, also see cilium_binaries
calico_versionCALICO_VERSIONSCSv3.26.4 Version of the Calico CNI provider (ignored if use_cilium is set)
kubernetes_versionKUBERNETES_VERSIONcapov1.27.xKubernetes version deployed into workload cluster (.x means latest patch release)
``OPENSTACK_IMAGE_NAMEcapoubuntu-capi-image-${KUBERNETES_VERION}Image name for k8s controller and worker nodes. Ubuntu 22.04 image is used for k8s versions >= 1.27.3, 1.26.6, 1.25.11, Ubuntu 20.04 otherwise.
kube_image_rawOPENSTACK_IMAGE_RAWSCStrueRegister images in raw format (instead of qcow2), good for ceph COW
image_registration_extra_flagsOPENSTACK_IMAGE_REGISTATION_EXTRA_FLAGSSCS""Extra flags passed during image registration
``OPENSTACK_CONTROL_PLANE_IPcapo127.0.0.1Use localhost to talk to capi cluster (don't change this!)
``OPENSTACK_SSH_KEY_NAMEcapo${prefix}-keypairSSH key name generated and used to connect to workload cluster nodes
controller_flavorOPENSTACK_CONTROL_PLANE_MACHINE_FLAVORcapoSCS-2V-4-20sFlavor to be used for control plane nodes
worker_flavorOPENSTACK_NODE_MACHINE_FLAVORcapoSCS-2V-4-20sFlavor to be used for worker nodes
controller_countCONTROL_PLANE_MACHINE_COUNTcapo1Number of control plane nodes in testcluster (0 skips testcluster creation)
``CONTROL_PLANE_MACHINE_GENSCSgenc01Suffix for control plane node resources, to be changed for rolling upgrades
worker_countWORKER_MACHINE_COUNTcapo3Number of worker nodes in testcluster
``WORKER_MACHINE_GENSCSgenw01Suffix for worker node resources, to be changed for rolling upgrades
``CONTROL_PLANE_ROOT_DISKSIZESCS20If diskless flavors are used for control plane nodes, this is the allocated root volume disk size (in GB)
``WORKER_ROOT_DISKSIZESCS20If diskless flavors are used for worker nodes, this is the allocated root volume disk size (in GB)
anti_affinityOPENSTACK_ANTI_AFFINITYSCStrueUse anti-affinity server groups to prevent k8s nodes on same host (soft for workers, hard for controllers)
``OPENSTACK_SRVGRP_CONTROLLERSCSnononoAutogenerated if anti_affinity is true, eliminated otherwise
``OPENSTACK_SRVGRP_WORKERSCSnononoAutogenerated if anti_affinity is true, eliminated otherwise
deploy_occmDEPLOY_OCCMSCStrueDeploy the given version of OCCM into the cluster. true (default) chooses the latest version matching the k8s version. You can specify master to chose the upstream master branch. Don't disable this.
deploy_cindercsiDEPLOY_CINDERCSISCStrueDeploy the given (or latest matching for the default true value) of cinder CSI.
etcd_unsafe_fsETCD_UNSAFE_FSSCSfalseUse barrier=0 for filesystem on control nodes to avoid storage latency. Use for multi-controller clusters on slow/networked storage, otherwise not recommended.
testcluster_name(cmd line)SCStestclusterAllows setting the default cluster name, created at bootstrap (if controller_count is larger than 0)
restrict_kubeapiRESTRICT_KUBEAPISCS[ ]Allows restricting access to kubernetes API by list of CIDRs. Empty list (default) means public, [ "none" ] means internal access only.
capo_instance_create_timeoutCLUSTER_API_OPENSTACK_INSTANCE_CREATE_TIMEOUTcapo5Time to wait for an OpenStack machine to be created (in minutes)
containerd_registry_filesSCS{"hosts":["./files/containerd/docker.io"], "certs":[]}Containerd registry hosts config files, see related docs for details.

Optional services deployed to cluster:

environmentclusterctl.yamlprovenancedefaultscriptmeaning
deploy_metricsDEPLOY_METRICSSCStrueapply_metrics.shDeploy metrics service to nodes to make kubectl top work
deploy_nginx_ingressDEPLOY_NGINX_INGRESSSCStrueapply_nginx_ingress.shDeploy NGINX ingress controller (this spawns an OpenStack Loadbalancer), pass version to explicitly choose the version, true results in v1.8.1 (supported k8s >= 1.24)
``NGINX_INGRESS_PROXYSCStrue(dito)Configure LB and nginx to get real IP via PROXY protocol; trouble for pod to LB connections has been resolved by setting hostname
use_ovn_lb_providerUSE_OVN_LB_PROVIDERSCSfalseapply_nginx_ingress.shClouds using OVN networking can deploy the OVN provider that has low overhead (L3) and makes real client IPs visible without proxy protocol hacks. Set to auto to enable; not yet ready for prime time, thus defaults to false.
deploy_gateway_apiDEPLOY_GATEWAY_APISCSfalsecreate_cluster.shDeploy Gateway APIs CRDs and enable ciliums Gateway API implementation. This only works in conjunction with USE_CILIUM=true. Also this will break at least one CNCF conformance test. This feature is considered a tech-review. Keep in mind that Gateway API itself is under development and not GA. Also note that ciliums implementation of Gateway API is considered "beta".
deploy_cert_managerDEPLOY_CERT_MANAGERSCSfalseapply_cert_manager.shDeploy cert-manager, pass version (e.g. v1.12.4) to explicitly choose a version
deploy_fluxDEPLOY_FLUXSCSfalsecreate_cluster.shDeploy flux2 into the cluster
deploy_harborSCSfalsedeploy_harbor.shDeploy harbor into the cluster. When enabled, it will overwrite the settings above. Harbor forces deployment of flux and based on config, it can force deployment of other dependencies (cert-manager, ingress-nginx and Cinder CSI)
harbor_configSCS{domain_name:"", issuer_email:"", persistence:false, database_size:"1Gi", redis_size:"1Gi", trivy_size:"5Gi"}(dito)Harbor container registry configuration options, see related docs for details.
+ + + + \ No newline at end of file diff --git a/docs/container/components/k8s-cluster-api-provider/doc/continuous-integration/index.html b/docs/container/components/k8s-cluster-api-provider/doc/continuous-integration/index.html new file mode 100644 index 0000000000..494717bc73 --- /dev/null +++ b/docs/container/components/k8s-cluster-api-provider/doc/continuous-integration/index.html @@ -0,0 +1,65 @@ + + + + + +Continuous integration | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Continuous integration

Project k8s-cluster-api-provider uses SCS Zuul CI platform to +drive its continuous integration tests. The project is registered under the SCS tenant +and therefore is able to use a set of pre-defined pipelines, jobs, and ansible roles that +SCS Zuul instance defines and imports. If you want to explore currently available SCS pipelines, +visit the SCS zuul-config project. +If you want to see the full list of jobs that are available, visit the SCS Zuul UI. +And if you are looking for some handy ansible role that SCS Zuul imports, visit they source.

Refer to SCS Zuul users guide and/or +Zuul docs for further details on how to define and use Zuul +CI/CD pipelines and jobs.

Note (for geeks): If you are interested in Zuul CI platform and want to deploy your own development instance of it, +then read the official quick-start manual +or visit this tutorial which aims a connection +of Zuul CI platform with a GitHub organization.

Configuration

SCS Zuul automatically recognizes .zuul.yaml configuration file that is located in the +k8s-cluster-api-provider's root. This file informs Zuul about the project's default-branch and +preferred merge-mode. +It also references SCS Zuul pipelines and +their jobs used by the k8s-cluster-api-provider project. Then, jobs link Ansible playbooks that contain +tasks for actual CI testing.

See relevant CI configuration files:

├── .zuul.yaml
├── playbooks
│ ├── cleanup.yaml
│ ├── dependencies.yaml
│ ├── e2e.yaml
│ ├── templates
│ │ └── environment.tfvars.j2

Pipelines

This section describes an SCS Zuul pipelines that are used by the k8s-cluster-api-provider project.

  • e2e-test

    • It is triggered by the e2e-test label in the opened PR
    • It executes k8s-cluster-api-provider-e2e-conformance job
    • It applies the PR label successful-e2e-test and leaves an informative PR comment when the k8s-cluster-api-provider-e2e-conformance job succeeded
    • It applies the PR label failed-e2e-test and leaves an informative PR comment when the k8s-cluster-api-provider-e2e-conformance job failed
    • It applies the PR label cancelled-e2e-test and leaves an informative PR comment when the k8s-cluster-api-provider-e2e-conformance job is canceled
  • unlabel-on-update-e2e-test

    • It is triggered by the PR update only when PR contains the successful-e2e-test label
    • It ensures that any PR update invalidates a previous successful e2e test
    • It removes successful-e2e-test label from the PR
  • e2e-quick-test

    • It is triggered by the e2e-quick-test label in the opened PR
    • It executes k8s-cluster-api-provider-e2e-quick job
    • It applies the PR label successful-e2e-quick-test and leaves an informative PR comment when the k8s-cluster-api-provider-e2e-quick job succeeded
    • It applies the PR label failed-e2e-quick-test and leaves an informative PR comment when the k8s-cluster-api-provider-e2e-quick job failed
    • It applies the PR label cancelled-e2e-quick-test and leaves an informative PR comment when the k8s-cluster-api-provider-e2e-quick job is canceled
  • unlabel-on-update-e2e-quick-test

    • It is triggered by the PR update only when PR contains the successful-e2e-quick-test label
    • It ensures that any PR update invalidates a previous successful e2e test
    • It removes successful-e2e-quick-test label from the PR
  • periodic-daily

    • This pipeline runs jobs daily at 3AM
    • It executes k8s-cluster-api-provider-e2e-conformance job
    • The job overrides the git_reference variable to ensure that the e2e conformance testing is executed on a specific tag

Jobs

This section describes Zuul jobs defined within the k8s-cluster-api-provider project and linked in the above pipelines.

  • k8s-cluster-api-provider-e2e-conformance

    • It runs a sonobuoy conformance test against Kubernetes cluster spawned by k8s-cluster-api-provider scripts
    • This job is a child job of openstack-access-base that ensures OpenStack credentials +availability in Zuul worker node. Parent job also defines a Zuul semaphore semaphore-openstack-access, +that ensures that only one openstack-access-base job (or its children) can run at a time
    • See a high level k8s-cluster-api-provider-e2e-conformance job steps:
      • Pre-run playbook dependencies.yaml installs project prerequisites, e.g. terraform, yq, etc.
      • Main playbook e2e.yaml spawns a k8s cluster, runs sonobuoy conformance test, and cleans created infrastructure, all by k8s-cluster-api-provider scripts
      • Cleanup-run playbook cleanup.yaml runs ospurge, cleanup created application credentials and keypair to ensure that multiple e2e runs do not interfere
  • k8s-cluster-api-provider-e2e-quick

    • It runs a sonobuoy quick test against Kubernetes cluster spawned by k8s-cluster-api-provider scripts
    • This job is a child job of openstack-access-base that ensures OpenStack credentials +availability in Zuul worker node. Parent job also defines a Zuul semaphore semaphore-openstack-access, +that ensures that only one openstack-access-base job (or its children) can run at a time
    • See a high level k8s-cluster-api-provider-e2e-quick job steps:
      • Pre-run playbook dependencies.yaml installs project prerequisites, e.g. terraform, yq, etc.
      • Main playbook e2e.yaml spawns a k8s cluster, runs sonobuoy quick test, and cleans created infrastructure, all by k8s-cluster-api-provider scripts
      • Cleanup-run playbook cleanup.yaml runs ospurge, cleanup created application credentials and keypair to ensure that multiple e2e runs do not interfere

Secrets

The parent job openstack-access-base, from which e2e jobs inherit, defines secret variable openstack-application-credential. +This secret is stored directly in the SCS/zuul-config repository in an encrypted form. +It contains OpenStack application credentials to access the OpenStack project dedicated for CI testing.

This secret is encrypted by the SCS/zuul-config repository RSA key that has been generated by SCS Zuul instance. +So only SCS Zuul instance is able to decrypt it (read the docs).

If you want to re-generate the mentioned secret or add another one using SCS/zuul-config repository RSA key, follow the below instructions:

  • Install zuul-client
pip install zuul-client
  • Encrypt "super-secret" string by the SCS/zuul-config repository public key from SCS Zuul
echo -n "super-secret" | \
zuul-client --zuul-url https://zuul.scs.community encrypt \
--tenant SCS \
--project github.com/SovereignCloudStack/zuul-config

Job customization

In some cases you may want to change your environment.tfvars file before running the e2e test without changing +the environment.tfvars file in the repository. For example, you may want to change the image variable to test a different +system image without altering the default image used by the project.

To do so, you can in the body of the PR add the following text:

    ```ZUUL_CONFIG
image = "Ubuntu 20.04"
```

FAQ

How do developers/reviewers should proceed if they want to CI test this project?

A developer initiates a PR as usual. If a reviewer deems that the PR requires e2e testing, +they can apply a specific label to the PR. +Currently, the following labels could be applied:

  • e2e-test (for comprehensive e2e testing, including k8s cluster creation, execution of sonobuoy conformance tests, and cluster deletion)
  • e2e-quick-test (for expedited e2e testing, involving k8s cluster creation, quick sonobuoy tests, and cluster deletion)

After the e2e test has completed, the reviewer can examine the test results and respond +accordingly, such as approving the PR if everything appears to be in order or requesting changes. +Sonobuoy test results, along with a link to the e2e logs, are conveyed back to the PR via a comment. +Additionally, the PR is labeled appropriately based on the overall e2e test result, using labels like +successful-e2e-test, successful-e2e-quick-test, failed-e2e-test, or failed-e2e-quick-test.

Why do we use PR label as an e2e pipeline trigger instead of e.g. PR comment?

We consider PR labels to be a more secure pipeline trigger compared to, for example, PR comments. +PR labels can only be applied by developers with triage repository access or higher. +In contrast, PR comments can be added by anyone with a GitHub account.

Members of the SCS GitHub organization are automatically granted 'write' access to SCS repositories. +Consequently, the PR label mechanism ensures that only SCS organization members can trigger e2e pipelines.

How do we ensure that any PR update invalidates a previous successful e2e test?

In fact, two mechanisms ensure the invalidation of a previously successful test when a PR is updated.

Firstly, the pipelines unlabel-on-update-<e2e-test-name> remove the successful-<e2e-test-name> label +from the PR when it's updated after a successful e2e test has finished. +If an e2e test is in progress and the PR is updated, the currently running e2e test is +canceled, the successful-<e2e-test-name> label is removed (if it exists), and the +cancelled-<e2e-test-name> label is applied along with an informative PR comment to +inform the reviewer about the situation.

+ + + + \ No newline at end of file diff --git a/docs/container/components/k8s-cluster-api-provider/doc/make-reference/index.html b/docs/container/components/k8s-cluster-api-provider/doc/make-reference/index.html new file mode 100644 index 0000000000..609463066f --- /dev/null +++ b/docs/container/components/k8s-cluster-api-provider/doc/make-reference/index.html @@ -0,0 +1,63 @@ + + + + + +Makefile reference | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Makefile reference

This is a reference to the Makefile targets.

Almost all targets require the ENVIRONMENT variable to be set to the name of the environment you want to use. +(See Environments in the requirements documentation for more information.)

General commands

make create

make create

To initiate the management server setup, various components are created. This includes the provisioning of networks, +security groups, and a virtual machine. An application credential is also generated for authentication purposes. Once +the virtual machine is up and running, it is bootstrapped by cloning the specified git repository. Additionally, +specific tools are installed to facilitate the process.

Next, a local Kubernetes cluster is deployed using kind. The cluster acts as a foundation for further operations. During +the setup, the Cluster API, as well as the Cluster API Provider (e.g. CAPO), are installed within the local cluster. This provider serves as the API server for +Kubernetes CAPI, enabling management and interaction with the cloud backends (e.g. OpenStack).

Finally, a test cluster is created utilizing Kubernetes CAPI. This test cluster allows for experimentation, validation, +and development within the CAPI environment.

Note that make create will not create a testcluster if you have set controller_count to zero in your +environment file (environment-<yourcloud>.tfvars).

Note that make create does not copy local files to the management server, only some files are templated there from the terraform/files/template directory. If you want to change any of the scripts +being copied to the management server, you need to commit, push your changes, and run make create again. +make create will pull the latest changes from the git repository.

make get-kubeconfig

make get-kubeconfig

This will get the kubeconfig of the testcluster and store it in the file testcluster.yaml.<yourcloud>.

make ssh

make ssh

This will ssh into the management server, using the username that was set in your environment-<yourcloud>.tfvarsfile. The default in the environment file is ubuntu.

Note: there is also an alias to this make login

make openstack

make openstack

This will run openstack cli.

make k9s

make k9s

This will run k9s on the management server.

make log

make log CONSOLE=capi-mgmtcluster

This will show openstack console log of the management server. You can specify the console log you want to see by +setting the CONSOLE variable. The default is capi-mgmtcluster.

make console

make console CONSOLE=capi-mgmtcluster

This will open openstack console of the management server in the browser using XDG-open. You can specify the console you +want to open by setting the CONSOLE variable. The default is capi-mgmtcluster.

Teardown

Note that clean and fullclean leave the ubuntu-capi-image-$KUBERNETES_VERSION image registered, +so it can be reused. +You need to manually unregister it, if you want your next deployment to register a new image with +the same kubernetes version number.

Make clean

make clean does ssh to the capi management server to clean up the created clusters prior +to terraform cleaning up the resources it has created. This is sometimes insufficient to clean up +unfortunately, some error in the deployment may result in resources left around.

Make fullclean

make fullclean uses a custom script cleanup/cleanup.sh (using the openstack CLI) to clean up +everything while trying to not hit any resources not created by the CAPI or terraform for +clusters from this management host. +It is the recommended way for doing cleanups if make clean fails. Watch out for leftover +floating IP addresses and persistent volumes, as these can not be easily traced back to the +Cluster API created resources and may thus be left. There is also a make forceclean variant +that hits unused floating IPs and all persistent volumes -- this is risky as there is no good +way to tell which PVCs belong to us unless we find them attached to cluster nodes in which +case we don't need the force options.

Make purge

You can purge the whole project via make purge. Be careful with that command as it will purge +all resources in the OpenStack project even those that have not been created through this +Terraform script or the Cluster API. +It requires the ospurge tool. +Install it with python3 -m pip install git+https://git.openstack.org/openstack/ospurge.

Testing commands

make check

make check SONOMODE=...

This will run tests of the configuration on testcluster using sonobuoy. It will also download the results and +print them to the console. Optionally you can also specify a mode by using for example SONOMODE="--mode quick"

Note: This runs over 5000 tests and takes a long time to complete (~ 2 hours).

make check-quick

make check-quick

This will run tests of the configuration on testcluster using sonobuoy with mode quick.

make check-conformance

make check-conformance

This will run tests of the configuration on testcluster using sonobuoy with mode conformance meaning it will test if the +cluster is conformant to the CNCF.

make check-storage

make check-storage

This will run tests of the configuration on testcluster using sonobuoy of the storage.

make check-csi

make check-csi

This will run tests of the configuration on testcluster using sonobuoy of the CSI.

Terraform commands

make init

make init

This will initialize terraform. It will download the required providers and modules. +It will also select or create a new workspace for you. The workspace name is the same as the +ENVIROMENT variable.

make attach

make attach RESOURCE=<resource-id> PARAMS=...

This will attach a resource to the terraform state. This is useful if you have created a resource outside of terraform +and want to manage it with terraform.

make detach

make detach RESOURCE=<resource-id> PARAMS=...

This will detach a resource from the terraform state. This is useful if you have changed a resource outside of terraform +or you no longer want to manage it with terraform.

make state-push

make state-push

This will push the terraform state to specified storage if set. This is useful if you don't want to store the state +locally.

make dry-run

make dry-run

This will run a dry-run of the terraform apply command. This is useful if you want to see what terraform will do before +actually doing it.

make show

make show

This will show the terraform state. This is useful if you want to see what terraform is managing.

make list

make list

This will list all the resources managed by terraform. This is useful if you want to see what terraform is managing.

+ + + + \ No newline at end of file diff --git a/docs/container/components/k8s-cluster-api-provider/doc/overview/index.html b/docs/container/components/k8s-cluster-api-provider/doc/overview/index.html new file mode 100644 index 0000000000..21c2e3b197 --- /dev/null +++ b/docs/container/components/k8s-cluster-api-provider/doc/overview/index.html @@ -0,0 +1,26 @@ + + + + + +Overview | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Overview

Creating and scaling k8s clusters on demand is providing a lot of flexibility to DevOps teams that develop, test, deploy and operate services and applications.

We expect the functionality to be mainly consumed in two scenarios:

  • Self-service: The DevOps team leverages the code provided from this repository to create their own capi management server and use it then to manage a number of k8s clusters for their own needs.
  • Managed k8s: The Operator's service team creates the capi management server and uses it to provide managed k8s clusters for their clients.

Note that we have an intermediate model in mind -- a model where a one-click / one-API call interface would allow the management server to be created on behalf of a user and then serve as an API endpoint to that user's k8s CAPI needs. Ideally with some dashboard or GUI that would shield less experienced users from all the YAML.

Once we as the SCS Community have the gitops style cluster control working, the self-service model will become more convenient to use.

The provided solution covers the following two main topics:

  1. Automation (terraform, Makefile) to bootstrap a cluster-API management server by installing kind on a vanilla Ubuntu image and deploying some tools on this node (kubectl, openstack CLI tools, k9s, cilium, calico, helm, flux ...) and deploying cluster-API (clusterctl) and the OpenStack cluster-api provider along with suitable credentials. The terraform automation is driven by a Makefile for convenience. The tooling also contains all the logic to clean up again. The newly deployed node clones this git repository early in the bootstrap process and uses the thus received files to set up the management cluster and scripts.

  2. This node can be connected to via ssh and the deployed scripts there can be used to manage workload clusters and then deploy various standardized tools (such as e.g. OpenStack Cloud Controller Manager(OCCM), cinder CSI, calico or cilium CNI, nginx ingress controller, cert-manager, ...) and run tests (e.g. CNCF conformance with sonobuoy). The tools and artifacts can be updated via git pull at any time and the updated settings rolled out to the workload clusters. Note that the script collection will eventually be superseded by the capi-helm-charts. The medium-term goal is to actually create a reconciliation loop here that would perform life-cycle-management for clusters according to the cluster configuration stored in an enhanced cluster-api style clusterctl.yaml from git repositories and thus allow a pure gitops style cluster management without ever ssh'ing to the management server.

+ + + + \ No newline at end of file diff --git a/docs/container/components/k8s-cluster-api-provider/doc/quickstart/index.html b/docs/container/components/k8s-cluster-api-provider/doc/quickstart/index.html new file mode 100644 index 0000000000..6d82e66f45 --- /dev/null +++ b/docs/container/components/k8s-cluster-api-provider/doc/quickstart/index.html @@ -0,0 +1,37 @@ + + + + + +Quickstart | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Quickstart

This guide shows you how to get working Kubernetes clusters on a SCS cloud +via cluster-api(CAPI).

Requirements

  • make
  • kubectl
  • terraform
  • yq v2 or v4 (see note below)
  • python3-openstackclient, python3-octaviaclient

Prepare the environment

You need access to an OpenStack project. +Copy the default environment and adjust the options according to your cloud.

cp terraform/environments/environment-{default,<YOURCLOUD>}.tfvars

Edit terraform/environments/environment-<YOURCLOUD>.tfvars with your favourite text editor. Every option without a +default value must be set. +Add +a clouds.yaml +inside the terraform dir, in ~/.config/openstack or /etc/openstack.

It is recommended to set the name of the cloud in the clouds.yml to the same value as the cloud_provider in +the environment-<YOURCLOUD>.tfvars, then you only have to specify the ENVIRONMENT or OS_CLOUD variable.

Create a test cluster

# Set the ENVIRONMENT to the name specified in the name of the file
# `cloud_provider` option has to be set in the environment file
# to the name of the cloud in the clouds.yaml
export ENVIRONMENT=<YOURCLOUD>`

# Create your environment. This includes a management node as virtual machine
# in your OpenStack environment as well as a Kubernetes testcluster.
make create

# Get the kubeconfig of the testcluster
make get-kubeconfig

# Interact with the testcluster
kubectl --kubeconfig testcluster.yaml.<YOURCLOUD> get nodes

Teardown

make clean

If make clean fails to clean up completely, you can also use the fullclean target. +Review the Teardown section of the Makefile reference document for more details.

Beyond quickstart

This guide assumes you just create one test cluster directly when creating the +management server. +In a production setting, you would not use this test cluster but create clusters +via the management server. You can read more about this in the usage guide.

+ + + + \ No newline at end of file diff --git a/docs/container/components/k8s-cluster-api-provider/doc/requirements/index.html b/docs/container/components/k8s-cluster-api-provider/doc/requirements/index.html new file mode 100644 index 0000000000..b814b47128 --- /dev/null +++ b/docs/container/components/k8s-cluster-api-provider/doc/requirements/index.html @@ -0,0 +1,50 @@ + + + + + +Requirements | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Requirements

Cluster API requires an existing Kubernetes cluster to operate. In our setup, we +utilize kind a tool for running Kubernetes clusters using Docker containers, to create +the initial management Kubernetes cluster in a single docker container. The OpenStack instance serves as the CAPI +management server or management cluster, responsible for overseeing the +management and operation of the created kubernetes clusters.

The provisioning of the CAPI management server is done on a deployment host, possibly a tiny jumphost style VM, or some +Linux/MacOS/WSL laptop.

Requirements for the deployment host:

  • You need to have installed:
    • Terraform (https://learn.hashicorp.com/tutorials/terraform/install-cli).
    • yq (python3-yq or yq snap)
    • GNU make
    • openstack (python3-openstackclient) and plugin for octavia (python3-octaviaclient) Via pip or your distribution. +Needed only in case you want to clean the management server or interact with openstack directly.
  • You must have credentials to access the cloud. Terraform will look for clouds.yaml and optionally secure.yaml in +the current working directory (terraform), in ~/.config/openstack/ or /etc/openstack (in this order), just like +the openstack client.
  • The API endpoints of the OpenStack cloud should have a certificate signed by a trusted CA. (Self-signed or custom CAs +need significant manual work -- this will be improved after R4.)
  • An Environment file for the cloud you want to use. See Environments below for more details.

Environments

To use a specific environment, you have to set the ENVIRONMENT variable (export ENVIRONMENT=<yourcloud>) or pass it +to the make command by using make <command> ENVIRONMENT=<yourcloud>. +You can also do the same by utilizing the OS_CLOUD (openstack native) variable. +The name of the environment is derived from the name of the file environments/environment-<yourcloud>.tfvars.

The name of the environment specified either via ENVIRONMENT or OS_CLOUD has to be equal the name of the +cloud (cloud_provider) as specified in your clouds.yaml.

In case you use plusserver community environment +or wavestack environment you can use the default environment file for +those directly or base your configuration on it. In case you need custom configuration +see Custom environment.

More information about the configuration options can be found in the configuration documentation.

Plusserver community environment

Using it directly: +export ENVIRONMENT=gx-scs

or insert inside of Makefile: +ENVIRONMENT=gx-scs

File: environments/environment-gx-scs.tfvars

The name of the cloud has to be gx-scs in the cloud.yaml file, otherwise you will need +to change the cloud_provider variable inside of terraform/environments/environment-gx-scs.tfvars file.

Wavestack environment

Using it directly: +export ENVIRONMENT=gx-wavestack

or insert inside of Makefile: +ENVIRONMENT=gx-wavestack

File: environments/environment-gx-wavestack.tfvars

The name of the cloud has to be gx-wavestack in the cloud.yaml file, otherwise you will need +to change the cloud_provider variable inside of terraform/environments/environment-gx-scs.tfvars file.

Custom environment

You can create your own environment file from the sample file environments/environment-default.tfvars and provide the +necessary information like machine flavor or machine image. You can comment out all lines where the defaults match your +needs.

+ + + + \ No newline at end of file diff --git a/docs/container/components/k8s-cluster-api-provider/doc/roadmap/index.html b/docs/container/components/k8s-cluster-api-provider/doc/roadmap/index.html new file mode 100644 index 0000000000..e213e5215e --- /dev/null +++ b/docs/container/components/k8s-cluster-api-provider/doc/roadmap/index.html @@ -0,0 +1,27 @@ + + + + + +Roadmap | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Roadmap

Advanced cluster templating with helm (Technical Preview)

On the management server, we have not only helm installed, but also the repository https://github.com/stackhpc/capi-helm-charts checked out. Amongst other things, it automates the creation of new machine templates when needed and doing rolling updates on your k8s cluster with clusterctl. This allows for an easy adaptation of your cluster to +different requirements, new k8s versions etc.

Please note that this is currently evolving quickly and we have not completely assessed and tested the capabilities. We intend to do this after R2 and eventually recommend this as the standard way of managing clusters in production. At this point, it's included as a technical preview.

+ + + + \ No newline at end of file diff --git a/docs/container/components/k8s-cluster-api-provider/doc/usage/cluster-mgmt-capi-mgmt-node/index.html b/docs/container/components/k8s-cluster-api-provider/doc/usage/cluster-mgmt-capi-mgmt-node/index.html new file mode 100644 index 0000000000..990ace23e1 --- /dev/null +++ b/docs/container/components/k8s-cluster-api-provider/doc/usage/cluster-mgmt-capi-mgmt-node/index.html @@ -0,0 +1,94 @@ + + + + + +Cluster Management on the capi management node | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Cluster Management on the capi management node

You can use make ssh to log in to the capi management server. There you can issueclusterctl and kubectl (aliased +to k) commands. The context kind-kind +is used for the CAPI management while the context testcluster-admin@testcluster can +be used to control the workload cluster testcluster. You can of course create many +of them. There are management scripts on the management server:

  • In the user's (ubuntu) home directory, create a subdirectory with the CLUSTERNAME +to hold your cluster's configuration data. Copy over the clusterctl.yaml file +from ~/cluster-defaults/ and edit it to meet your needs. Note that you can also +copy over cloud.conf and cluster-template.yaml and adjust them, but you don't +need to. (If you don't create the subdirectory, the create_cluster.sh script +will do so for you and use all defaults settings.)
  • create_cluster.sh CLUSTERNAME: Use this command to create a cluster with +the settings from ~/$CLUSTERNAME/clusterctl.yaml. More precisely, it uses the template +$CLUSTERNAME/cluster-template.yaml and fills in the settings from +$CLUSTERNAME/clusterctl.yaml to render a config file $CLUSTERNAME/$CLUSTERNAME-config.yaml +which will then be submitted to the capi server (kind-kind context) for creating +the control plane nodes and worker nodes. The script will also apply openstack integration, +cinder CSI, calico or cilium CNI, and optionally also metrics server, nginx ingress controller, +flux, cert-manager. (These can be controlled by DEPLOY_XXX variables, see below. +Defaults can be preconfigured from the environment.tfvars file during management server +creation.) +Note that CLUSTERNAME defaults to testcluster and must not contain +whitespace. +The script also makes sure that appropriate CAPI images are available (it grabs them +from OSISM +as needed and registers them with OpenStack, following the SCS image metadata +standard). +The script returns once the control plane is fully working (the worker +nodes might still be under construction). The kubectl file to talk to this +cluster (as admin) can be found in ~/$CLUSTERNAME/$CLUSTERNAME.yaml. Expect the cluster +creation to take ~8mins. (CLUSTERNAME defaults to testcluster.) You can pass +--context=${CLUSTERNAME}-admin@$CLUSTERNAME to kubectl (with the +default ~/.kubernetes/config config file) or export KUBECONFIG=$CLUSTERNAME.yaml\ +to talk to the workload cluster.
  • The subdirectory ~/$CLUSTERNAME/deployed-manifests.d/ will contain the +deployed manifests for reference (and in case of nginx-ingress also to facilitate +a full cleanup).
  • The clusterctl.yaml file can be edited the create_cluster.sh script +be called again to submit the changes. (If you have not done any changes, +re-running the script again is harmless.) Note that the create_cluster.sh +does not currently remove any of the previously deployed services/deployments +from the workload clusters -- this will be added later on with the appropriate +care and warnings. Also note that not all changes are allowed. You can easily +change the number of nodes or add k8s services to a cluster. For changing +machine flavors, machine images, kubernetes versions ... you will need to +also increase the CONTROL_PLANE_MACHINE_GEN or the WORKER_MACHINE_GEN +counter to add a different suffix to these read-only resources. This will +cause Cluster-API to orchestrate a rolling upgrade for you on rollout. +(This is solved more elegantly in the helm chart style cluster management, see below.)
  • The directory ~/k8s-cluster-api-provider/ contains a checked out git tree +from the SCS project. It can be updated (git pull) to receive the latest +fixes and improvements. This way, most incremental updates do not need the +recreation of the management server (and thus also not the recreation of your +managed workload clusters), but can be applied with calling create_cluster.sh +again to the workload clusters.
  • The installation of the openstack integration, cinder CSI, metrics server and +nginx ingress controller is done via the bin/apply_*.sh scripts that are called +from create_cluster.sh. You can manually call them as well -- they take +the cluster name as argument. (It's better to just call create_cluster.sh +again, though.) The applied yaml files are collected in +~/$CLUSTERNAME/deployed-manifests.d/. You can kubectl delete -f them +to remove the functionality again.
  • You can, of course, also delete the cluster and create a new one if that +level of disruption is fine for you. (See below in Advanced cluster templating +with helm to get an idea how we want to make this more convenient in the future.)
  • Use kubectl get clusters -A in the kind-kind context to see what clusters +exist. Use kubectl get all -A in the testcluster-admin@testcluster context +to get an overview over the state of your workload cluster. You can access the logs +from the capo controller in case you have trouble with cluster creation.
  • delete_cluster.sh [CLUSTERNAME]: Tell the capi management server to remove +the cluster $CLUSTERNAME. It will also remove persistent volume claims belonging +to the cluster. The script will return once the removal is done.
  • cleanup.sh: Remove all running clusters.
  • add_cluster-network.sh CLUSTERNAME adds the management server to the node network +of the cluster CLUSTERNAME, assuming that it runs on the same cloud (a region). +remove_cluster-network.sh undoes this again. This is useful for debugging +purposes.

For your convenience, k9s is installed on the management server as well +as calicoctl, cilium, hubble, cmctl, helm and sonobuoy. +These binaries can all be found in /usr/local/bin while the helper scripts +have been deployed to ~/bin/.

+ + + + \ No newline at end of file diff --git a/docs/container/components/k8s-cluster-api-provider/doc/usage/containter-registry-configuration/index.html b/docs/container/components/k8s-cluster-api-provider/doc/usage/containter-registry-configuration/index.html new file mode 100644 index 0000000000..49c485a3d9 --- /dev/null +++ b/docs/container/components/k8s-cluster-api-provider/doc/usage/containter-registry-configuration/index.html @@ -0,0 +1,80 @@ + + + + + +Container registry configuration | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Container registry configuration

Containerd as container runtime +interface (CRI) used in the reference SCS KaaS implementation allows configuring its +behavior when it interacts with public or private container registry hosts. Container +registry hosts configuration options in containerd are well described in +related docs.

This feature could be useful in various uses cases, e.g.:

  • Configure containerd to use a custom CA certificate when it interacts with a container +registry host that uses this CA
  • Configure containerd to use some container registry mirror host instead of the target public or private container +registry. +This could be useful when the target container registry somehow restricts its clients e.g. +DockerHub's pull rate limit to 100 pulls per 6 hours per IP address

SCS KaaS reference implementation allows users to pass container registry host config +files to configure containerd. Containerd configuration is applied cluster wide as it +is CRI used in SCS KaaS clusters. Additional registry host config files for containerd +could be passed through the containerd_registry_files terraform variable. This variable +expects an object with two attributes:

  • hosts attribute defines additional registry host config files for containerd. +The filename should reference the registry host namespace. Files defined in this set +will be copied into the /etc/containerd/certs.d directory on each workload cluster node
  • certs attribute defines additional client and/or CA certificate files needed for +containerd authentication against registries defined by hosts. Files defined in this +set will be copied into the /etc/containerd/certs directory on each workload cluster node

The default value of the containerd_registry_files variable instructs containerd to use +registry.scs.community container registry instance as a public mirror of DockerHub +container registry, see related +issue #417. +The host config file used as a default is +defined here.
+This should prevent issues with pull rate limiting from DockerHub public container registry, +e.g. #414.

The above default value could be overridden using any techniques that Terraform allows, e.g. +via environment variable:

export TF_VAR_containerd_registry_files='{"hosts":["<path to the custom container registry host config>"], "certs":["<path to the custom CA or client certificate>"]}'

SCS container registry reference installation https://registry.scs.community contains +several pre-configured "proxy-cache" projects. These projects allow you to use SCS +container registry reference installation to proxy and cache images from target public +registries. This may reduce the load of overused public container registries and/or helps +to avoid rate limiting by individual public registries. +Currently, SCS container registry is set up to "proxy-cache" the following public container registries:

  • docker.io
  • ghcr.io
  • quay.io
  • registry.gitlab.com
  • registry.k8s.io

Find also a corresponding containerd registry host config files +in ./terraform/files/containerd +directory. If you want to configure containerd to use mentioned +pre-configured SCS container registry +"proxy cache" projects, feel free to do that e.g. as follows (path is relative to the terraform directory):

export TF_VAR_containerd_registry_files='{"hosts":["./files/containerd/docker.io", "./files/containerd/ghcr.io", "./files/containerd/quay.io", "./files/containerd/registry.gitlab.com", "./files/containerd/registry.k8s.io" ]}'

If you did not find your preferred public container registry in the list of pre-configured +SCS container registry "proxy cache" projects, and you would like to use +the SCS container registry +as a mirror for it, please open an issue in one of the following +repositories: scs/k8s-cluster-api-provider, +scs/k8s-harbor.

Tutorial: configure an existing cluster to use containerd registry configuration

This tutorial is experimental and out of the usual release cycle. We recommend to +upgrade existing environments (workload clusters) with stable releases which are properly +tested.

This tutorial instructs (advanced) users what needs to be done on the cluster management +instance without re-deploying it via Terraform. Patches described in this tutorial +modify existing environment with changes that have been developed within "containerd registry"-related PRs:

  • PR#432
  • PR#447
  • PR#472

Warning: This tutorial causes a rolling update (rolling re-deployment) of the control plane and worker nodes.

  1. Log in to the cluster management instance, pull remote changes, and then checkout to relevant commit that +includes all mentioned PRs.

    cd k8s-cluster-api-provider/
    git pull
    git checkout b31a79db26c3956b473f026038e71e9aba7819b8
  2. Backup the config directory of an existing cluster.

    cd ..
    cp -R <CLUSTER_NAME> <CLUSTER_NAME>.bkp
  3. Ensure that the directory for containerd registry configs exists and create a default containerd registry +config file that instructs containerd to use registry.scs.community container registry +instance as a public mirror of DockerHub. +Optionally, create another containerd container registry host file in the containerd/hosts directory. +You can find working examples of those files here.

    cd <CLUSTER_NAME>
    mkdir -p containerd/hosts
    cat >containerd/hosts/docker.io <<EOF
    server = "https://registry-1.docker.io"

    [host."https://registry.scs.community/v2/docker.io"]
    capabilities = ["pull"]
    override_path = true
    EOF
    # Optionally, create another containerd container registry host file here.
  4. Injects containerd registry host file(s) (from point 3.) into cluster-template.yaml. +Script configure_containerd.sh does the injection.

    configure_containerd.sh cluster-template.yaml <CLUSTER_NAME>
  5. Inject containerd configuration in cluster-template.yaml. This configuration allows +containerd to discover registry host file(s).

    • Create containerd_conf_append temp file

      cat >containerd_conf_append <<EOF
      cat <<EOT >> /etc/containerd/config.toml
      [plugins."io.containerd.grpc.v1.cri".registry]
      config_path = "/etc/containerd/certs.d"
      EOT
      EOF
    • Inject temp file and systemctl restart containerd.service line into the cluster-template.yaml (inplace)

      yq 'select(.kind == "KubeadmControlPlane").spec.kubeadmConfigSpec.preKubeadmCommands |= (
      (.[] | select(. == "apt-get install -y ca-certificates socat*") | key + 1) as $pos |
      .[:$pos] +
      [load_str("containerd_conf_append")] +
      .[$pos:])' -i cluster-template.yaml

      yq 'select(.kind == "KubeadmControlPlane").spec.kubeadmConfigSpec.preKubeadmCommands |= (
      (.[] | select(. == "systemctl daemon-reload") | key + 1) as $pos |
      .[:$pos] +
      ["systemctl restart containerd.service"] +
      .[$pos:])' -i cluster-template.yaml

      yq 'select(.kind == "KubeadmConfigTemplate").spec.template.spec.preKubeadmCommands |= (
      (.[] | select(. == "apt-get install -y ca-certificates socat*") | key + 1) as $pos |
      .[:$pos] +
      [load_str("containerd_conf_append")] +
      .[$pos:])' -i cluster-template.yaml

      yq 'select(.kind == "KubeadmConfigTemplate").spec.template.spec.preKubeadmCommands |= (
      (.[] | select(. == "systemctl daemon-reload") | key + 1) as $pos |
      .[:$pos] +
      ["systemctl restart containerd.service"] +
      .[$pos:])' -i cluster-template.yaml
  6. The above changes (when point 8. will be applied) of KubeadmControlPlane will cause a rolling update of control plane nodes. +As the KubeadmConfigTemplate has been adjusted we need to increase the generation +counter of worker machines to ensure that the worker nodes will be rolling updated as well.

    sed -r 's/(^WORKER_MACHINE_GEN: genw)([0-9][0-9])/printf "\1%02d" $((\2+1))/ge' -i clusterctl.yaml
  7. Workaround: If your environment contains nginx ingress deployed via k8s-cluster-api-provider +(variable DEPLOY_NGINX_INGRESS=true) disable its update. Nginx-ingress controller has +been updated to version 1.8.0 in PR#440 and later to 1.8.1. This is a breaking change that includes updates +of immutable fields. If the above is the case skip this update as follows:

    sed 's/DEPLOY_NGINX_INGRESS: true/DEPLOY_NGINX_INGRESS: false/g' -i clusterctl.yaml
  8. Update the existing cluster.

    create_cluster.sh test1
+ + + + \ No newline at end of file diff --git a/docs/container/components/k8s-cluster-api-provider/doc/usage/create-new-cluster/index.html b/docs/container/components/k8s-cluster-api-provider/doc/usage/create-new-cluster/index.html new file mode 100644 index 0000000000..9625146db7 --- /dev/null +++ b/docs/container/components/k8s-cluster-api-provider/doc/usage/create-new-cluster/index.html @@ -0,0 +1,37 @@ + + + + + +Create a new cluster | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Create a new cluster

On the management server (login with make ssh), create a directory (below the home of +the standard ubuntu user) with the name of your cluster. Copy over clusterctl.yaml from +~/cluster-defaults/ and edit it according to your needs. You can also copy over other +files from ~/cluster-defaults/ and adjust them, but this is only needed in exceptional +cases. +Now run create_cluster.sh <CLUSTER_NAME>

This will copy all missing defaults from ~/cluster-defaults/ into the directory with your +cluster name and then ask cluster-api to create the cluster. The scripts also take +care of security groups, anti-affinity, node image registration (if needed) and +of deploying CCM, CNI, CSI as well as optional services such as metrics or nginx-ingress +controller.

You can access the new cluster with kubectl --context clustername-admin@cluster +or KUBECONFIG=~/clustername/clustername.yaml kubectl.

The management cluster is in context kind-kind.

Note that you can always change clusterctl.yaml and re-run create_cluster.sh. The script is idempotent and running +it multiple times with the unchanged input file will result in no changes to the cluster.

+ + + + \ No newline at end of file diff --git a/docs/container/components/k8s-cluster-api-provider/doc/usage/custom-ca/index.html b/docs/container/components/k8s-cluster-api-provider/doc/usage/custom-ca/index.html new file mode 100644 index 0000000000..1b5268fd34 --- /dev/null +++ b/docs/container/components/k8s-cluster-api-provider/doc/usage/custom-ca/index.html @@ -0,0 +1,48 @@ + + + + + +Custom CA | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Custom CA

OpenStack provides public-facing API endpoints which protection by SSL/TLS certificates +is highly recommended in production environments. +These certificates are usually issued by public CA but also the custom or private CA could be used.

If the communication with OpenStack API is protected by the certificate issued by custom CA +the cacert setting needs to be provided inside clouds.yaml, e.g.:

clouds:
devstack:
cacert: ca-bundle.pem
auth:
auth_url: https://10.0.3.15/identity
project_domain_id: default
project_name: demo
user_domain_id: default
identity_api_version: 3
region_name: RegionOne
interface: public

Here the file ca-bundle.pem contains custom root CA and potentially intermediate CA(s).

The ca-bundle.pem file will be copied to the management server and used by CAPO +in the management cluster. Also, it will be copied to the workload cluster (control plane and worker nodes) +and mounted and used by OCCM and CCSI pods. +So provide only the necessary certificates in that file.

Steps of what happens with the custom cacert in k8s-cluster-api-provider:

  1. cacert setting is provided inside clouds.yaml
  2. Cacert file referenced by cacert key (1.) is copied to the management server +directory ~/cluster-defaults/${cloud_provider}-cacert by Terraform
  3. During the management server bootstrap process cacert is injected to +the ~/cluster-defaults/cluster-template.yaml to KubeadmControlPlane and KubeadmConfigTemplate files +as file with cacert content from already defined secret ${CLUSTER_NAME}-cloud-config and will be later +templated and copied to the workload cluster (control plane and worker nodes) provisioned by CAPO, e.g.:
    files:
    - contentFrom:
    secret:
    key: cacert
    name: ${CLUSTER_NAME}-cloud-config
    owner: root:root
    path: /etc/ssl/certs/devstack-cacert
    permissions: "0644"
  4. When the creation of the workload cluster (create_cluster.sh) starts, +~/cluster-defaults/cluster-template.yaml is copied into workload cluster directory (~/$CLUSTER_NAME/)
  5. Then the cacert file content is base64 encoded and saved in OPENSTACK_CLOUD_CACERT_B64 variable +inside ~/$CLUSTER_NAME/clusterctl.yaml, so it can be used during +the workload cluster templating
  6. Later, when the workload cluster templates are applied to the management cluster, +secret ${CLUSTER_NAME}-cloud-config with base64 encoded cacert is created and used by CAPO
  7. CAPO will create workload cluster (thanks to steps 5. and 6.) and cacert is +transferred to the control plane and worker nodes (thanks to steps 3. and 4.)
  8. OCCM and CCSI pods mount cacert via hostPath volume +and use it for e.g. creating load balancers or volumes

Rotation

When the custom CA expires or otherwise changes it needs to be rotated. +CAPO uses the custom CA certificate in the management cluster for creating the infrastructure +for the workload clusters and in the workload clusters by OCCM and CCSI for e.g. creating load balancers or volumes. +In both cases, cacert is provided via secret ${CLUSTER_NAME}-cloud-config and needs to be updated.

There are 3 steps in this rotation process:

  1. Replace/append custom CA certificate in ~/cluster-defaults/${cloud_provider}-cacert
  2. Increase generation counters CONTROL_PLANE_MACHINE_GEN and WORKER_MACHINE_GEN in ~/$CLUSTER_NAME/clusterctl.yaml
  3. Run create_cluster.sh $CLUSTER_NAME and wait for the rolling update of your workload cluster

In step 1, appending can be useful for avoiding downtime of your services. +Your cacert file will contain two CA certificates - old and new. +This should help with a smooth transition to a new certificate and later, the old one can be removed.

Steps 2 and 3 need to be done per workload cluster.

When step 2 is omitted, only cacert secret in the management cluster is updated and no rolling update of +the workload cluster in step 3 is started and existing nodes remain with the old certificate.

+ + + + \ No newline at end of file diff --git a/docs/container/components/k8s-cluster-api-provider/doc/usage/gateway-api/index.html b/docs/container/components/k8s-cluster-api-provider/doc/usage/gateway-api/index.html new file mode 100644 index 0000000000..09e7b8c63c --- /dev/null +++ b/docs/container/components/k8s-cluster-api-provider/doc/usage/gateway-api/index.html @@ -0,0 +1,26 @@ + + + + + +Gateway-API | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Gateway-API

Starting with R5, this k8s-solution offers experimental kubernetes gateway API support. You need to set deploy_gateway_api to true in your environments configuration. Also you need to use cilium as your CNI (default since R5).

After deploying your cluster, you can use gateway API and deploy Gateways and HTTP-Routes. As a starting point you can deploy this example app:

kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.11/samples/bookinfo/platform/kube/bookinfo.yaml

and this example Gateway and HTTP-Route

kubectl apply -f https://raw.githubusercontent.com/cilium/cilium/1.14.1/examples/kubernetes/gateway/basic-http.yaml
+ + + + \ No newline at end of file diff --git a/docs/container/components/k8s-cluster-api-provider/doc/usage/harbor/index.html b/docs/container/components/k8s-cluster-api-provider/doc/usage/harbor/index.html new file mode 100644 index 0000000000..fa2f850651 --- /dev/null +++ b/docs/container/components/k8s-cluster-api-provider/doc/usage/harbor/index.html @@ -0,0 +1,47 @@ + + + + + +Harbor | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Harbor

Project k8s-harbor is used for the SCS Harbor +container registry deployment https://registry.scs.community/.

With this project, it is possible to deploy Harbor in a similar way into the workload cluster. +If you want to deploy Harbor, set terraform variable deploy_harbor = true. It will deploy +Harbor with default options. The recommended approach is to +set up also persistence and ingress with tls.

It automatically deploys flux as k8s-harbor requirement. +It also expects that the Swift object store is available in the targeting OpenStack project. S3 credentials +(openstack ec2 credentials create) are created and saved into ~/$CLUSTER_NAME/deployed-manifests.d/harbor/.ec2. +Bucket (openstack container create "$PREFIX-$CLUSTER_NAME-harbor-registry") for storing container images +is also automatically created in the openstack Swift object store.

Warning: Swift container and ec2 credentials are not removed when the workload cluster is deleted.

Default deployment

By default, Harbor will be deployed with these options:

harbor_config = {
domain_name: "",
issuer_email: "",
persistence: false,
database_size: "1Gi",
redis_size: "1Gi",
trivy_size: "5Gi"
}

These options are templated to the mgmt server and used as environment variables +during the creation of the workload cluster:

$ cat ~/cluster-defaults/harbor-settings
DEPLOY_HARBOR=true
HARBOR_DATABASE_SIZE=1Gi
HARBOR_DOMAIN_NAME=
HARBOR_ISSUER_EMAIL=
HARBOR_PERSISTENCE=false
HARBOR_REDIS_SIZE=1Gi
HARBOR_TRIVY_SIZE=5G

When the Harbor is deployed, you can check the status, e.g. by:

$ flux get helmrelease -n default
NAME REVISION SUSPENDED READY MESSAGE
harbor 1.12.4 False True Release reconciliation succeeded

or you can simply check if pods are running by kubectl get pods.

Harbor components are deployed as deployments and statefulsets:

$ kubectl get deploy,sts
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/harbor-core 2/2 2 2 11m
deployment.apps/harbor-exporter 1/1 1 1 11m
deployment.apps/harbor-jobservice 2/2 2 2 11m
deployment.apps/harbor-nginx 1/1 1 1 11m
deployment.apps/harbor-portal 2/2 2 2 11m
deployment.apps/harbor-registry 2/2 2 2 11m

NAME READY AGE
statefulset.apps/harbor-database 1/1 11m
statefulset.apps/harbor-redis 1/1 11m
statefulset.apps/harbor-trivy 2/2 11m

Default options deploy Harbor as clusterIP service without pvc persistence for database, redis and trivy. +See terraform/files/kubernetes-manifests.d/harbor/envs/clusterIP/ for further details. +You can access it via the k8s service harbor, for example, port-forward it and access it at http://localhost:8080:

$ kubectl get svc harbor -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
harbor ClusterIP 10.109.57.148 <none> 80/TCP 11m app=harbor,component=nginx,release=harbor
$ kubectl port-forward svc/harbor 8080:80
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080

Admin username is admin and password can be obtained from the secret by:

kubectl get secret harbor-secrets -o jsonpath='{.data.values\.yaml}' | base64 -d | yq .harborAdminPassword

Configuration options

Persistence

By default, persistence is set to false. +When persistence is set to true, i.e. harbor_config = {persistence: true}, +Harbor components (database, redis, trivy) are deployed with PVCs:

$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
data-harbor-redis-0 Bound pvc-982221c1-64cb-4d3e-a77d-1db5b4429a69 1Gi RWO cinder-default 6m12s
data-harbor-trivy-0 Bound pvc-8a2ad60c-c7bf-40e1-8593-0d00b3d40b4f 5Gi RWO cinder-default 6m12s
data-harbor-trivy-1 Bound pvc-734f9b6a-9cee-40e4-9e1c-b959d9f7b7cf 5Gi RWO cinder-default 5m11s
database-data-harbor-database-0 Bound pvc-c5c3a7e6-a99a-4f16-a5cc-792e9b3665d8 1Gi RWO cinder-default 6m12s

The size of PVCs can be configured by harbor_config = {<component>_size: "size"}. +Trivy has 2 replicas, i.e. 2 PVCs will be created.

When persistence is set to true, Cinder CSI is automatically deployed.

Ingress and TLS

If you want to deploy ingress in front of Harbor and secure it with SSL/TLS certificate, set the domain_name option. +Relevant files which will be deployed are located in terraform/files/kubernetes-manifests.d/harbor/envs/ingress/.

When domain_name is set, cert-manager and ingress-nginx are automatically deployed.

So, instead of default harbor clusterIP service and harbor-nginx deployment, harbor-ingress will be deployed:

$ kubectl get ing harbor-ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
harbor-ingress nginx harbor.example.com 213.131.230.203.nip.io 80, 443 13m

There will be also an additional cert-manager issuer letsencrypt deployed:

$ kubectl get issuers -o wide
NAME READY STATUS AGE
letsencrypt True The ACME account was registered with the ACME server 13m

This ACME issuer has an optional email field, which can be set by issuer_email option. +This is recommended option because it will be used to contact you in case of issues with your account or certificates, +including expiry notification emails.

Then, the settings can look like this:

harbor_config = {
domain_name: "harbor.example.com",
issuer_email: "email@example.com",
}

After the deployment, there is one mandatory step to set up proper TLS communication with this Harbor instance. +harbor-ingress has special annotation cert-manager.io/issuer: letsencrypt which instructs cert-manager +to create a certificate object:

$ kubectl get cert -o wide
NAME READY SECRET ISSUER STATUS AGE
harbor-crt False harbor-crt letsencrypt Issuing certificate as Secret does not exist 13m

The certificate is not ready, because it uses Let’s Encrypt standard ACME HTTP-01 challenge. +In this challenge, you need to take the IP address of the ingress load balancer and create a DNS record +for your domain_name. You can get an IP address (don't look on nip.io suffix) e.g. by this command:

$ kubectl -n ingress-nginx get svc ingress-nginx-controller -o jsonpath='{.status.loadBalancer.ingress}'
[{"hostname":"213.131.230.203.nip.io"}]

And after a while, your cert is ready, and you can access harbor at https://harbor.example.com/:

$ kubectl get cert -o wide
NAME READY SECRET ISSUER STATUS AGE
harbor-crt True harbor-crt letsencrypt Certificate is up to date and has not expired 18m
+ + + + \ No newline at end of file diff --git a/docs/container/components/k8s-cluster-api-provider/doc/usage/index.html b/docs/container/components/k8s-cluster-api-provider/doc/usage/index.html new file mode 100644 index 0000000000..d88700e9d4 --- /dev/null +++ b/docs/container/components/k8s-cluster-api-provider/doc/usage/index.html @@ -0,0 +1,33 @@ + + + + + +Usage | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Usage

The subsequent management of the cluster can best be done from the management server VM, as it has all the tools +deployed there and config files can be edited and resubmitted to the kubernetes kind cluster for reconciliation. To log +in to this management server via ssh, you can issue make ssh.

You can create and do life cycle management for many more clusters from this management server.

The kubeconfig with admin power for the created testcluster is named testcluster/testcluster.yaml ( +or $CLUSTER_NAME/$CLUSTER_NAME.yaml for all the other clusters) and can be handed out to users that should get full +administrative control over the cluster. You can also retrieve them +using make get-kubeconfig TESTCLUSTER=${CLUSTER_NAME} from the machines where you created the management server from, +and possibly create an encrypted .zip file for handing these out. (You can omit TESTCLUSTER=... for the +default testcluster.)

+ + + + \ No newline at end of file diff --git a/docs/container/components/k8s-cluster-api-provider/doc/usage/managing-many-clusters/index.html b/docs/container/components/k8s-cluster-api-provider/doc/usage/managing-many-clusters/index.html new file mode 100644 index 0000000000..19026c5cc3 --- /dev/null +++ b/docs/container/components/k8s-cluster-api-provider/doc/usage/managing-many-clusters/index.html @@ -0,0 +1,38 @@ + + + + + +Managing many clusters | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Managing many clusters

While the scripts all use a default testcluster, they have +been developed and tested to manage many clusters from a single management +node. Copy the ~/cluster-defaults/clusterctl.yaml file to +~/MYCLUSTER/clusterctl.yaml +and edit the copy to describe the properties of the cluster to be created. +Use ./create_cluster.sh MYCLUSTER then to create a workload cluster +with the name MYCLUSTER. You will find the kubeconfig file in +~/MYCLUSTER/MYCLUSTER.yaml, granting its owner admin access to that cluster. +Likewise, delete_cluster.sh and the apply_*.sh scripts take a +cluster name as parameter.

This way, dozens of clusters can be controlled from one management server.

You can add credentials from different projects into +~/.config/openstack/clouds.yaml and reference them in the OPENSTACK_CLOUD +setting in clusterctl.yaml, this way managing clusters in many different +projects and even clouds from one management server.

+ + + + \ No newline at end of file diff --git a/docs/container/components/k8s-cluster-api-provider/doc/usage/migrate-to-cluster-class/index.html b/docs/container/components/k8s-cluster-api-provider/doc/usage/migrate-to-cluster-class/index.html new file mode 100644 index 0000000000..30261201ae --- /dev/null +++ b/docs/container/components/k8s-cluster-api-provider/doc/usage/migrate-to-cluster-class/index.html @@ -0,0 +1,36 @@ + + + + + +Migration to ClusterClass | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Migration to ClusterClass

From #600, this repository uses CAPI +ClusterClass feature for the creation of +new clusters, additionally see k8s blog. +This feature is also used e.g. in the SCS cluster-stacks repository.

Note: For now, ClusterClass is created per Cluster, which is not optimal and most likely it can be improved.

Therefore, existing clusters must be migrated from 'old' cluster templates to 'new' cluster class based templates. +Based on ClusterClass proposal +of update strategy, we shouldn't be able to migrate, but in CAPI PR #6292 +the validation webhook was relaxed (via special Cluster annotation +unsafe.topology.cluster.x-k8s.io/disable-update-class-name-check) and manual migration is now possible.

The script migrate-to-cluster-class.sh uses that special annotation for migration. In the beginning, it patches +CAPI and KCP deployments with the ClusterTopology=true container argument. Then creates new resources +(KubeadmControlPlaneTemplate, OpenStackClusterTemplate, ClusterClass). After that, annotates, labels and +patches existing cluster resources. In the end, it patches the Cluster object with .spec.topology and it's done.

Migration

Prerequisites

  • CAPI >= v1.5.2 due to NamingStrategy feature
    • upgrade can be performed as stated in upgrade guide

Steps

  1. Git pull/checkout new changes into the ~/k8s-cluster-api-provider directory
  2. Run migrate-to-cluster-class.sh <CLUSTER_NAME> (verify machines were not recreated)
  3. Copy new templates for existing and new clusters (consider backup)
    cp ~/k8s-cluster-api-provider/terraform/files/template/cluster-template.yaml ~/<CLUSTER_NAME>/cluster-template.yaml
    cp ~/k8s-cluster-api-provider/terraform/files/template/cluster-template.yaml ~/cluster-defaults/cluster-template.yaml
  4. Next run of create_cluster.sh <CLUSTER_NAME> should be idempotent
+ + + + \ No newline at end of file diff --git a/docs/container/components/k8s-cluster-api-provider/doc/usage/multi-az-and-multi-cloud-environments/index.html b/docs/container/components/k8s-cluster-api-provider/doc/usage/multi-az-and-multi-cloud-environments/index.html new file mode 100644 index 0000000000..a3ae066e32 --- /dev/null +++ b/docs/container/components/k8s-cluster-api-provider/doc/usage/multi-az-and-multi-cloud-environments/index.html @@ -0,0 +1,32 @@ + + + + + +Multi-AZ and multi-cloud environments | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Multi-AZ and multi-cloud environments

The provided cluster-template.yaml assumes that all control nodes on one hand and all worker nodes on the other are +equal. They are in the same cloud within the same availability zone, using the same flavor. cluster API allows k8s +clusters to have varying flavors, span availability zones and even clouds. For this, you can create an advanced +cluster-template with more different machine descriptions and potentially several secrets. Depending on your changes, +the logic in create_cluster.sh might also need enhancements to handle this. Extending this is not hard and we're happy +to hear from your use cases and take patches.

However, we are currently investigating to use helm templating for anything beyond the simple use cases instead, see +next chapter.

+ + + + \ No newline at end of file diff --git a/docs/container/components/k8s-cluster-api-provider/doc/usage/testing/index.html b/docs/container/components/k8s-cluster-api-provider/doc/usage/testing/index.html new file mode 100644 index 0000000000..adafe11a91 --- /dev/null +++ b/docs/container/components/k8s-cluster-api-provider/doc/usage/testing/index.html @@ -0,0 +1,40 @@ + + + + + +Testing | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Testing

To test the created k8s cluster, there are several tools available. +Apply all commands to the testcluster context (by passing the appropriate +--context setting to kubectl or by using the right KUBECONFIG +file).

  • Looking at all pods (kubectl get pods -A) to see that they all come +up (and don't suffer excessive restarts) is a good first check. +Look at the pod logs to investigate any failures.

  • You can create a very simple deployment with the provided kuard.yaml, which is +an example taken from the O'Reilly book from B. Burns, J. Beda, K. Hightower: +"Kubernetes Up & Running" enhanced to also use a persistent volume.

  • You can deploy Google's demo microservice application.

  • sonobuoy runs a subset of the k8s tests, providing a simple way to +filter the >5000 existing test cases to only run the CNCF conformance +tests or to restrict testing to non-disruptive tests. The sonobuoy.sh wrapper +helps with calling it. There are also Makefile targets check-* that +call various sonobuoy test sets. +This is how we call sonobuoy for our CI tests.

  • You can use cilium connectivity test to check whether your cilium +CNI is working properly. You might need to enable hubble to get +a fully successful result.

+ + + + \ No newline at end of file diff --git a/docs/container/deployment-examples/a/hardware/index.html b/docs/container/deployment-examples/a/hardware/index.html new file mode 100644 index 0000000000..c86733dbab --- /dev/null +++ b/docs/container/deployment-examples/a/hardware/index.html @@ -0,0 +1,26 @@ + + + + + +Hardware Requirements | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/docs/container/deployment-examples/a/index.html b/docs/container/deployment-examples/a/index.html new file mode 100644 index 0000000000..0b2f21a320 --- /dev/null +++ b/docs/container/deployment-examples/a/index.html @@ -0,0 +1,26 @@ + + + + + +Overview | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/docs/container/deployment-examples/a/software/index.html b/docs/container/deployment-examples/a/software/index.html new file mode 100644 index 0000000000..c41249f683 --- /dev/null +++ b/docs/container/deployment-examples/a/software/index.html @@ -0,0 +1,26 @@ + + + + + +Software Requirements | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/docs/container/guides/guide1/index.html b/docs/container/guides/guide1/index.html new file mode 100644 index 0000000000..5f37db07fa --- /dev/null +++ b/docs/container/guides/guide1/index.html @@ -0,0 +1,26 @@ + + + + + +Guide 1 | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/docs/container/index.html b/docs/container/index.html new file mode 100644 index 0000000000..ccd2bc813d --- /dev/null +++ b/docs/container/index.html @@ -0,0 +1,27 @@ + + + + + +Container Layer Introduction | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Container Layer Introduction

The container layer within the Sovereign Cloud Stack (SCS) offers a robust solution for managing container workloads on a Kubernetes infrastructure. It facilitates the on-demand creation and scaling of Kubernetes clusters, catering to various needs across development, testing, deployment, and operation of services and applications. While the container layer is versatile for a range of use cases, the most common ones include:

  • Self-Service: Here, entities can empower their development teams with the autonomy to spawn and manage their clusters on demand, fostering a more agile and responsive development environment.
  • KaaS (Kubernetes as a Service): In this model, an SCS Cloud provider can offer their customers a managed Kubernetes service, abstracting much of the underlying operational complexity from their customers.

Target groups

  • DevOps/SysOps Teams: They are the primary beneficiaries as the container layer promotes flexible, on-demand operations helpful for continuous development, testing, deployment, and service management.
  • Cloud Service Providers: By delivering a standardized container orchestration platform, they can provide more reliable and robust services to their customers, enhancing their product portfolio.

What is it not

  • The container layer is not an alternative to Infrastructure as a Service (IaaS) but rather an extension that allows for more streamlined operation and management of containerized applications.
  • Although the container layer doesn't directly support Serverless Containers or Functions as a Service, these can be run on a Kubernetes cluster. However, as of now, the SCS container layer doesn't offer specialized tools for these use cases.

Prerequisites and Requirements

  • Knowledge: Familiarity with Kubernetes, container orchestration, and basic cloud infrastructure principles is pivotal.
  • Software: The core software component is the K8s Cluster API Provider, crafted to function optimally on OpenStack environments. Although designed to run on the SCS IaaS layer, with minor configuration adjustments, it can operate on any OpenStack environment.
  • Hardware: Virtualization-enabled hardware capable of running OpenStack is essential if hosting the IaaS layer independently. For further details, refer to the IaaS layer documentation.

Features

  • Automated Cluster Management: The K8s Cluster API Provider automates the process of creating, scaling, managing and updating Kubernetes clusters, thus significantly reducing the operational overhead.
  • Standardized Operations: Upholding SCS standards across various clusters ensures operational consistency and reliability.
  • Integration with OpenStack: The K8s Cluster API Provider is tailored to work seamlessly with SCS IaaS (OpenStack), thus offering a unified platform for managing both containers and the underlying infrastructure.
  • Container Registry Integration: The container layer has an integrated container registry, facilitating easy management and deployment of container images.
  • Certificate Managment: The kubernetes clusters can optionaly include a certbot allowing for ease of deployment of public facing services out of the box.
  • Preconfigured ingress: Certificate Management: Optional inclusion of Certbot in Kubernetes clusters facilitates straightforward deployment of publicly accessible services. +Preconfigured Ingress: Kubernetes clusters come with a preconfigured Nginx ingress, designed with OpenStack in mind, providing a ready-to-use ingress solution with enhancements like out-of-the-box client source IP visibility.

Limitations

  • OpenStack Dependency: The current design primarily supports OpenStack environments, which could be a limitation for other infrastructure setups.
  • Serverless/Functions as a Service Support: Lack of direct support for serverless containers and Functions as a Service (FaaS) might require additional tools or platforms.

Current state and future Outlook

The container layer has matured with multiple cloud providers now offering Kubernetes as a Service using this layer to manage a multitude of clusters. It follows a half-yearly release schedule to ensure security and up-to-date Kubernetes clusters, alongside providing backports for significant features into older versions.

Looking ahead, a new version based on ClusterStacks is in the pipeline, currently in its Alpha state. This upcoming release aims to be backward compatible, facilitating smooth migration from existing setups, and further extending the capabilities of the SCS container layer.

+ + + + \ No newline at end of file diff --git a/docs/container/overview/architecture/index.html b/docs/container/overview/architecture/index.html new file mode 100644 index 0000000000..75fcf3905d --- /dev/null +++ b/docs/container/overview/architecture/index.html @@ -0,0 +1,26 @@ + + + + + +Architecture | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/docs/container/overview/knowledge/index.html b/docs/container/overview/knowledge/index.html new file mode 100644 index 0000000000..c1d1c28b93 --- /dev/null +++ b/docs/container/overview/knowledge/index.html @@ -0,0 +1,26 @@ + + + + + +Knowledge | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/docs/faq/index.html b/docs/faq/index.html new file mode 100644 index 0000000000..245c714bed --- /dev/null +++ b/docs/faq/index.html @@ -0,0 +1,26 @@ + + + + + +Frequently Asked Questions | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Frequently Asked Questions

What does SCS stand for?

The Sovereign Cloud Stack (SCS) provides standards for a range of cloud infrastructure types. It strives for interoperable and sovereign cloud offerings which can be deployed and used by a wide range of organizations and individuals.

Who is SCS intended for?

SCS is a Software Stack to power data centers of different scale. It empowers public or private cloud service providers to offer resources to their endusers.

Who or what is behind SCS?

SCS is run by the SCS Project Team which is based at the Open Source Business Alliance e.V. and 100% funded by the German Ministry of Economics and Climate Action (BMWK). Public money means public code.

Why is there a need for a standardized cloud environment?

A standardized environment promotes interoperability, reduces vendor lock-in, and facilitates smoother transitions between providers. It gives individuals, companies and public institutions the freedom of choice.

Where can I find the SCS standards?

The SCS standards are available on the standards pages within our documentation page. Find them here

How is the SCS different from other cloud environments (e.g. AWS, Azure,...)?

Unlike proprietary clouds, SCS emphasizes standardization, ensuring interoperability and reduced dependency on one provider.

My company already has a cloud environment. Can we still use the SCS?

Yes, SCS can complement existing environments, enhancing standardization and interoperability.

What does reference implementation mean?

Reference implementation is a concrete example or blueprint of how the SCS standards can be implemented.

Do I need to use the reference implementation to be SCS compliant?

No, while the reference implementation is a guide, compliance requires adhering to SCS standards, not the exact blueprint of the reference implementation. Check the standards page on how to be SCS-compatible

Do I have to use all layers of the reference implementation (IaaS, CaaS)?

No, you can choose layers based on your needs and still be SCS compliant.

What does IaaS mean?

IaaS stands for Infrastructure as a Service, providing virtualized computing resources over the internet.

How is the IaaS layer structured?

IaaS typically comprises virtual machines, storage, and network resources, all offered as scalable services. Find the architecture here

What does CaaS mean? (Container Layer)

CaaS refers to Container as a Service, where providers offer container orchestration platforms.

I want to try out the SCS! Where do I start?

As a user:

  • Existing SCS Clouds: Explore and test on any of the cloud providers offering SCS. Choose one from here

As a Cloud Service Provider:

I want to use an SCS Cloud! How do I get started?

As a user:

As a Cloud Service Provider:

I want to use the SCS in my company and build my own cloud! Where do I start?

Start by understanding SCS standards and then move on to the reference implementation. Link to guide).

I have a technical problem. Where can I find help?

Refer to our support section or check our community channels for assistance. Link to community.

+ + + + \ No newline at end of file diff --git a/docs/getting-started/containerization/index.html b/docs/getting-started/containerization/index.html new file mode 100644 index 0000000000..ed813e8239 --- /dev/null +++ b/docs/getting-started/containerization/index.html @@ -0,0 +1,26 @@ + + + + + +Containerization | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/docs/getting-started/overview/index.html b/docs/getting-started/overview/index.html new file mode 100644 index 0000000000..7c26ba98b7 --- /dev/null +++ b/docs/getting-started/overview/index.html @@ -0,0 +1,26 @@ + + + + + +Overview | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/docs/getting-started/virtualization/index.html b/docs/getting-started/virtualization/index.html new file mode 100644 index 0000000000..96072042f4 --- /dev/null +++ b/docs/getting-started/virtualization/index.html @@ -0,0 +1,26 @@ + + + + + +Virtualization | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/docs/glossary/index.html b/docs/glossary/index.html new file mode 100644 index 0000000000..3dc6e975d5 --- /dev/null +++ b/docs/glossary/index.html @@ -0,0 +1,31 @@ + + + + + +Glossary | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Glossary

This file serves as the central glossary within SCS. It is intended to clearly +define terms used within SCS where there may be differing understandings. The +glossary is not intended to evaluate or standardize specific terms.

Definition of a Region

An OpenStack/SCS region consists of at least one or more Availability Zones that share a Control Plane with their services. As a result, they share one API. Also a Control Plane can share one CEPH cluster over different fire departments or each Availbility Zone can have its own CEPH cluster. Within the region, any Layer 2 networks are available to the user. Availbility Zones which build a region are connected by redundant low-latency (<2ms (guess!!) ) high bandwidth (10s of Gbps) connections.

Regions can be federated when the SCS code is ready.

Definition of a Availability Zone

An Availability Zone is a (physical) group of multiple compute nodes, controlled by the region's control plane that provides the API and interface.

An Availability Zone allows OpenStack compute hosts to be divided into logical groups and provides a form of physical isolation and redundancy from other Availability Zones, for example by using a separate power supply or network devices.

When users provision resources, they can specify in which Availability Zone their instances should be created. In this way, customers can ensure that their application resources are distributed across different failure domains to achieve high availability in the event of a hardware failure.

Definition of Host Aggregates

Host aggregates are a mechanism for partitioning compute nodes which is not explicitly visible to users in an OpenStack/SCS cloud. Host aggregates are based on arbitrary characteristics such as server type, processor type, GPU, disk speed, etc. +Administrators assign flavors to host aggregates by specifying metadata on the host aggregate and customizing the extra specifications of the flavor. It is then up to the Nova scheduler to determine the best match for the user request. Compute nodes can also be in more than one host aggregate.

Optionally, one can designate a host aggregate as an Availability Zone, e.g. for simplification reasons of the user selection of an availbility zone. +Availability Zones differ from Host Aggregates in that they are shown to the user as a Nova boot option, so Compute VMs can be started on them. +Compute Nodes, however, can only be in a single Availability Zone. We can configure a default Availability Zone where instances will be scheduled if the user does not specify an Availability Zone.

Info: A prerequisite for creating an Availability Zone is a host aggregate.

Definition of a Cell

The Cells paradigm simplifies the handling of large Openstack deployments.

Cells is an OpenStack Nova feature that improves scalability for Nova in OpenStack Platform. Each Cell has a separate database and message queue, which increases performance when scaling. One can provision additional Cells to handle large deployments, and compared to Regions, this allows access to a large number of compute nodes through a single API.

Each Cell has its own Cell controllers running the database server and RabbitMQ along with the Nova Conductor services.

Nova Conductor services, called "Super Conductor", continue to run on the main controller nodes.

The services in the Cell Controllers can still call placement APIs, but cannot access other API layer services via RPC, nor can they access global API databases on the control nodes.

Definition of a Control Plane

In Openstack/SCS, a Control Plane consists of at least 5 hardware nodes, which together serve several Availability Zones and thus provide a common usable API for a region. The Control Plane also shares the network (Neutron), the Scheduler and the CEPH services.

It includes the Controller Nodes (Galera Cluster, RabbitMQ) and the Manager Nodes, Maas,...

Definition of Control Node

The Control Node runs the Identity Service, Image Service , management processes for compute nodes, management processes for networking, various networking agents, and the Dashboard. It also includes supporting services such as an SQL database, a message queue, and NTP.

Optionally, the Controller Node runs parts of the Block Storage, Object Storage, Orchestration and Telemetry services.

The Controller Node requires at least two network interfaces.

Definition of Compute Node

A compute host runs the hypervisor part of compute that runs instances. By default, compute uses the KVM hypervisor. The compute host also runs a networking service agent that connects instances to virtual networks and provides firewall services to the instances through security groups.

If you offer hyper-converged infrastructure, a compute host also serves the Ceph. This makes the storage dynamically scalable (horizontally and vertically). For the Ceph services, 1 CPU core and 4 GB of RAM are reserved per OSD to ensure appropriate performance.

Definition of Manager Node

From here, the OSISM Ansible playbooks are applied to the environment. Furthermore, the following services often run here non-redundantly: Prometheus server,....

Definition of provider network

The provider network is the network that is "in front", i.e. at the output points of the openstack/SCS. This is usually a public network, but can also be a private network in individual cases. IPs from the provider network can be assigned to instances within the SCS. The same applies to load balancers, of course.

Definition of API

The Rest API provides the core of openstack/SCS and can be addressed for a whole region. It accepts and responds to end-user API calls. The service supports the OpenStack Compute API, the Amazon EC2 API, and a special Admin API for privileged users to perform administrative actions. Policies are enforced and most orchestration actions can be started, such as launching an instance.

Horizon

Horizon is openstack's preferred GUI for the end user, but also for the administrator for a quick overview. It runs on the controller node. Other GUIs are possible, also GUIs which replace the horizon interface

Message Queue

Most OpenStack services communicate with each other through the message queue. For example, Compute communicates with Block Storage services and Network services via the message queue. RabbitMQ, Qpid, and Zeromq are popular choices for a message queue service. When the message queue fails or becomes inaccessible, the cluster generally comes to a halt and ends up in a read-only state where the information is stuck at the point where the last message was sent. Therefore, this is clustered. RabbitMQ has shown itself to be the most widespread and best supported variant in the OpenStack context, Qpid occurs occasionally, ZeroMQ lacks HA functionality to date

Keystone

( The OpenStack Identity module called Keystone is used as an authentication and rights system between the OpenStack components. Keystone divides access to projects in the cloud into so-called "tenants". A tenant is a tenant of the cloud and has at least one assigned user. It is possible to create multiple users per tenant with different rights. Keystone uses a token system for authorization and also supports the connection to other authentication options such as LDAP. (wikipedia) )

Glance

The OpenStack Image Service, also called Glance, is a service that provides virtual machine images to OpenStack users. These images are used by Nova as a template to compile virtual machine instances. Both local hard disks and object storage solutions such as Swift or Ceph can be used as storage backends.

In addition to the images, Glance can also store metadata such as the operating system used or the kernel version. Access to both this metadata and the images themselves is via a REST API. Glance supports a number of formats such as VHD, VMDK and qcow2.

OSISM

The Open Source Infrastructure & Service Manager is a powerful deployment framework for OpenStack and Ceph as well as required services such as a RabbitMQ broker or a MariaDB Galera cluster.

Ceph

Ceph is an open source distributed storage solution. The core component is RADOS (Reliable Autonomic Distributed Object Store), an object store that can be distributed redundantly over any number of servers. Ceph offers the user three types of storage: An object store compatible with the Swift and S3 API (RADOS Gateway), virtual block devices (RADOS Block Devices) and CephFS, a distributed file system.

Nova

Nova is virtually a synonym for Compute. It is the part of the stack that can manage groups of virtual machines.

The virtualized systems can be distributed over any number of so-called compute nodes. Hypervisors supported include KVM, Xen Hyper-V and ESXI. In the community, KVM is considered to be set and best supported (we use KVM), which is controlled via libvirt. ESXI and Hyper-V can be used, sometimes with limited functionality.

Neutron

The OpenStack Networking module Neutron provides the networking service for OpenStack. Neutron can be used to manage networks, subnets, and IP addresses/floating IPs. A floating IP in OpenStack refers to an official IP that serves as an interface from the internal to the public network. In addition to a load balancer, HA proxy and health monitor, Neutron also supports techniques such as VLAN and VPN. To secure the networks, Neutron uses a firewall that allows versatile port rules, e.g. on a security group basis. For trademark reasons, the OpenStack networking module had to be renamed "Neutron". The previous name was "Quantum."

For the management of the data link layer, Neutron offers the possibility to use various already existing networking software such as Open vSwitch or the bridge functionality of the Linux kernel by means of plugins.

In the OpenStack releases since Ussuri, the "OpenVirtualNetwork"(OVN) has established itself, it replaces many of the Neutron components, e.g. L3 and DHCP agent, so that Neutron only has to talk directly to OVN.

Cinder

OpenStack Block Storage or Cinder provides virtual block storage in the form of virtualized storage media (hard disks, CDs, etc.). The block storage can be attached to virtual machines. An API interface allows Cinder to connect to Swift so that block storage media can communicate with object storage. Meanwhile, many other storage backends are also fully or partially supported. There is also the option of defining multiple backends and creating a volume type for each backend, so that when a new volume is created, it can be selected on which storage backend the volume is created.

Swift

Swift is the so-called object storage that can be used by Nova. This is responsible for redundant data storage. Swift can also be used as a backend for Cinder or Glance. Objects are stored in so-called containers, which are primarily used to group objects and store metadata and in turn belong to individual accounts. Objects and containers are accessed via a REST API.

Ceph OSD

A Ceph OSD (Object Storage Daemon) logically represents a storage device in a Ceph cluster, which can logically be a hard disk, which is the ideal case. In other cases it can also be a raid, which however leads to considerable performance limitations due to caching or other raid optimization.

Personas

PersonaDescription
SCS OperatorThe SCS Operator is the one who owns and operates a standardized cloud environment.
SCS Operations TeamThe team at the SCS Operator which actually runs the cloud environment.
SCS ConsumerThe SCS Consumer consumes a standardized SCS environment and operates and orchestrates applications on top of it. The SCS Consumer is typically a customer or user of the SCS Operator.
SCS IntegratorThe SCS Integrator assists in or is building up a standardized cloud environment. The SCS Integrator can be 2nd or 3rd level support for the SCS Operator.
SCS ProjectThe SCS Project oversees the overall activities around the Sovereign Cloud Stack.
SCS DeveloperThe SCS Developer actively contributes to technical elements of the Sovereign Cloud Stack.
+ + + + \ No newline at end of file diff --git a/docs/iaas/components/flavor-manager/index.html b/docs/iaas/components/flavor-manager/index.html new file mode 100644 index 0000000000..bf3375970f --- /dev/null +++ b/docs/iaas/components/flavor-manager/index.html @@ -0,0 +1,41 @@ + + + + + +Flavor Manager | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Flavor Manager

Overview

The OpenStack Flavor Manager manages the creation, modification, and removal of flavors within an OpenStack environment. +The OpenStack Flavor Manager operates as a facilitator that orchestrates compute flavors in alignment +with the standard SCS-0100: Flavor Naming +by utilizing YAML files provided by the SCS project.

Installation

Install the openstack-flavor-manager package with pip.

pip install openstack-flavor-manager

Or clone the repository osism/openstack-flavor-manager +and use the OpenStack Flavor Manager from source with tox.

tox -- --help

Usage

There must be a clouds.yml and a secure.yml file in the directory where the OpenStack Flavor Manager +will be executed. The cloud profile to be used can be specified via the optional --cloud parameter. +By default the cloud profile with the name admin is used. It must be possible to create and delete +flavors with the used cloud credentials.

$ openstack-flavor-manager --help

Usage: openstack-flavor-manager [OPTIONS]

╭─ Options ────────────────────────────────────────────────────────────────────────────────────╮
│ --name TEXT Name of flavor definitions. [default: scs] │
│ --debug Enable debug logging. │
│ --cloud TEXT Cloud name in clouds.yaml. [default: admin] │
│ --recommended Create recommended flavors. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────╯

To create the mandatory flavors by the SCS Flavor Naming Standard, you run:

$ openstack-flavor-manager

To create the recommended flavors by the SCS Flavor Naming Standard, you run:

$ openstack-flavor-manager --recommended

The output should look like this:

2023-09-20 13:03:14 | INFO     | Flavor 'SCS-1V-4' created.
2023-09-20 13:03:14 | INFO | Flavor 'SCS-2V-8' created.
2023-09-20 13:03:14 | INFO | Flavor 'SCS-4V-16' created.
2023-09-20 13:03:14 | INFO | Flavor 'SCS-8V-32' created.
...

All recommended flavors are now be available in your OpenStack environment. +Check yourself by running:

openstack --os-cloud admin flavor list

Definitions

There are two flavor definitions available by default. One for +SCS +and one for OSISM. +Each definition has its own set of mandatory and recommended flavors.

To run the OpenStack Flavor Manager with a specific definition, either scs or osism, +use the optional --name parameter. By default the SCS Flavor Naming Standard +definition will be used.

$ openstack-flavor-manager --name osism

Name parser and generator

A generator and parser for flavor names according to the SCS standard is available on +flavors.scs.community.

The flavor name SCS-2V-4-20s is inserted in field Flavor name:

The flavor SCS-2V-4-20s translated is +2 generic x86-64 vCPUs with 4.0 GiB RAM and SSD 20GB root volume:

+ + + + \ No newline at end of file diff --git a/docs/iaas/components/image-manager/index.html b/docs/iaas/components/image-manager/index.html new file mode 100644 index 0000000000..28451d85e3 --- /dev/null +++ b/docs/iaas/components/image-manager/index.html @@ -0,0 +1,57 @@ + + + + + +Image Manager | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Image Manager

The OpenStack Image Manager is a tool for managing all images on an OpenStack environment

Requirements

This information is only relevant for the operator of an OpenStack environment. You can skip this section if +you want to use OpenStack Image Manager as a normal user and you are not an operator of an openStack environment.

OpenStack Image Service (Glance)

The OpenStack Image Service (Glance) is required to upload and discover data assets that are used by other +services.

Since this script stores many images in a single project, the Glance quota must be set accordingly high or to unlimited.

[DEFAULT]
user_storage_quota = 1TB

With most storage backends it makes sense to convert the imported images directly to RAW. So it is required for using Ceph and it's +features too. Recited from the Ceph documentation QEMU and block devices and +Block devices and OpenStack.

"The raw data format is really the only sensible format option to use with RBD. Technically, you could use other QEMU-supported formats +(such as qcow2 or vmdk), but doing so would add additional overhead, and would also render the volume unsafe for virtual machine live +migration when caching (see below) is enabled."

"Important Ceph doesn't support QCOW2 for hosting a virtual machine disk. Thus if you want to boot virtual machines in Ceph (ephemeral +backend or boot from volume), the Glance image format must be RAW."

This requires the following parameter for the image import workflow.

[taskflow_executor]
conversion_format = raw

[image_import_opts]
image_import_plugins = ['image_decompression', 'image_conversion']

[image_conversion]
output_format = raw

See OpenStack Glance documentation +for more details.

Object storage backend

If the mirror functionality is used, an object storage backend is required. The use of the mirror functionality +is optional and is not used by default.

Getting started

This Getting started will upload a private image to your OpenStack environment with +the help of the OpenStack Image Manager.

  1. Install the openstack-image-manager package with pip.

    pip3 install openstack-image-manager
  2. Create a image definition in the file getting-started.yml in the local directory images.

    ---
    images:
    - name: MyCirros
    format: qcow2
    login: cirros
    password: gocubsgo
    min_disk: 1
    min_ram: 32
    status: active
    visibility: private
    multi: false
    meta:
    architecture: x86_64
    hw_disk_bus: scsi
    hw_rng_model: virtio
    hw_scsi_model: virtio-scsi
    hw_watchdog_action: reset
    os_distro: cirros
    replace_frequency: never
    uuid_validity: none
    provided_until: none
    tags: []
    versions:
    - version: '0.6.0'
    url: https://github.com/cirros-dev/cirros/releases/download/0.6.0/cirros-0.6.0-x86_64-disk.img
    checksum: "sha256:94e1e2c94dbbae7d4bdc38e68590a1daf73c9de2d03dd693857b4b0a042548e8"
    build_date: 2022-09-28
  3. Run the OpenStack Image Manager. It is assumed that a profile with the name openstack exists in the +clouds.yaml.

    openstack-image-manager --cloud openstack --filter ".*Cirr.*" --images images/

Image definitions

The configuration consists of different parameter settings, such as values for +minimum RAM or the visibility of the image. Have a look at the examples below +for all parameters. After a change to the configuration, validate it with +tox -- --dry-run.

SCS image standard

  • The value of login is stored as image_original_user in the metadata of an image.
  • If image_description is not set as meta information, image_description is set to the name of the image.
  • The value of build_date of a specific version of an image is stored as image_build_date in the metadata of an image.
  • The value of url of a specific version of an image is stored as image_source in the metadata of an image.

Image with regular rebuilds

This type of image definition is used for images that are rebuilt at regular +intervals. For example, this is the case for the daily builds of the Ubuntu +images.

The attribute multi: true is set.

With this type of image definition, the version of the distribution (or product, +whatever is contained in the image) used is already in the name of the image +definition. The version properties from the definition's versions list +are appended only to older iterations of the image as timestamp suffixes +in parentheses upon each rotation (except for the latest entry).

images:
- name: Ubuntu 16.04
format: qcow2
login: ubuntu
min_disk: 8
min_ram: 512
status: active
visibility: public
multi: true
meta:
architecture: x86_64
hw_disk_bus: scsi
hw_scsi_model: virtio-scsi
hw_watchdog_action: reset
os_distro: ubuntu
os_version: '16.04'
tags: []
versions:
- version: '20180928'
url: https://cloud-images.ubuntu.com/xenial/20180928/xenial-server-cloudimg-amd64-disk1.img
- version: '20181004'
url: https://cloud-images.ubuntu.com/xenial/20181004/xenial-server-cloudimg-amd64-disk1.img

This configuration creates the following images:

  • Ubuntu 16.04 (20180928)
  • Ubuntu 16.04

If a newer build is added, the following rotation takes place:

  • Ubuntu 16.04 (20180928) does not change
  • Ubuntu 16.04 becomes Ubuntu 16.04 (20181004)
  • the new image becomes Ubuntu 16.04

By default the last three images will be visible. When a fourth image is added, the visibility of +the last image in the list is changed to community and the image can be deleted in the future.

Image without regular rebuild

This type of image definition is used for images that are not rebuilt. For example, +this is the case for the flatcar images. For each release of Flatcar there is exactly +one image which will not be rebuilt in the future.

The attribute multi: false is set.

With this type of image definition, the version of the distribution (or product, +whatever is contained in the image) used is not in the name of the image definition. +Instead, the version properties from the image definition's versions list +are appended as static version suffixes to the images' names.

images:
- name: RancherOS
format: qcow2
login: rancher
min_disk: 8
min_ram: 2048
status: active
visibility: public
multi: false
meta:
architecture: x86_64
hw_disk_bus: scsi
hw_scsi_model: virtio-scsi
hw_watchdog_action: reset
tags: []
versions:
- version: '1.3.0'
url: https://github.com/rancher/os/releases/download/v1.3.0/rancheros-openstack.img
- version: '1.4.0'
url: https://github.com/rancher/os/releases/download/v1.4.0/rancheros-openstack.img
- version: '1.4.1'
url: https://github.com/rancher/os/releases/download/v1.4.1/rancheros-openstack.img

This configuration creates the following images:

  • RancherOS 1.3.0
  • RancherOS 1.4.0
  • RancherOS 1.4.1

If a new version is added, no rotation takes place. The new version is added +as RancherOS x.y.z. Here also the visibility of older images is not changed.

Other properties

Image properties

  • Removal of properties is not yet possible
  • URL, name and format can not be changed
  • Any keys can be added to meta, these will be added to the image
  • Existing keys in meta can be changed, the same applies to min_disk +and min_ram

Image tags

image status

  • deactivation: change status to deactivated
  • reactivation: change status to active

Image visibility

A full documentation about the visibility of images can be found in the Image visibility section in the +OpenStack Image Service API Documentation.

  • public: set visibility to public
  • community: set visibility to community
  • shared: set visibility to shared
  • private: set visibility to private

Usage

Mirroring images

Since the upstreams often only keep their images for a short time, we mirror most of the images on REGIO.cloud. +This makes us independent of the availability of the images in the individual upstreams.

Updating images

Some of the images are automatically updated by a CI job. The latest available build at the time of the CI job execution is mirrored and +made available as the current version.

Currently, the following images are updated once a week (every Sunday at 0 am):

  • Almalinux
  • CentOS
  • Debian
  • Rockylinux
  • Ubuntu
+ + + + \ No newline at end of file diff --git a/docs/iaas/components/index.html b/docs/iaas/components/index.html new file mode 100644 index 0000000000..e74487e5b6 --- /dev/null +++ b/docs/iaas/components/index.html @@ -0,0 +1,26 @@ + + + + + +Day-2 Operations | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/docs/iaas/components/project-manager/index.html b/docs/iaas/components/project-manager/index.html new file mode 100644 index 0000000000..94928757c7 --- /dev/null +++ b/docs/iaas/components/project-manager/index.html @@ -0,0 +1,26 @@ + + + + + +Project Manager | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/docs/iaas/components/resource-manager/index.html b/docs/iaas/components/resource-manager/index.html new file mode 100644 index 0000000000..352a0ecf02 --- /dev/null +++ b/docs/iaas/components/resource-manager/index.html @@ -0,0 +1,26 @@ + + + + + +Resource Manager | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Resource Manager

Octavia

Amphora rotation

Rotation of amphorae older than 30 days.

$ python3 src/amphora.py --rotate
2023-10-12 21:00:38 | INFO | Amphora 95a07c43-c0f9-44d2-bde8-a989e52427fa is older than 30 days
2023-10-12 21:00:38 | INFO | Amphora 95a07c43-c0f9-44d2-bde8-a989e52427fa of loadbalancer 9008d3d7-f593-4bc3-941c-a740c178148d is rotated by a loadbalancer failover
+ + + + \ No newline at end of file diff --git a/docs/iaas/components/sandbox-manager/index.html b/docs/iaas/components/sandbox-manager/index.html new file mode 100644 index 0000000000..2055c7fa93 --- /dev/null +++ b/docs/iaas/components/sandbox-manager/index.html @@ -0,0 +1,26 @@ + + + + + +Sandbox Manager | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/configuration-guide/ceph/index.html b/docs/iaas/guides/configuration-guide/ceph/index.html new file mode 100644 index 0000000000..dfbd40d1da --- /dev/null +++ b/docs/iaas/guides/configuration-guide/ceph/index.html @@ -0,0 +1,36 @@ + + + + + +Ceph | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Ceph

Unique Identifier

The File System ID is a unique identifier for the cluster. +The identifier is set via the parameter fsid in environments/ceph/configuration.yml +and must be unique. It can be generated with uuidgen.

environments/ceph/configuration.yml
fsid: c2120a4a-669c-4769-a32c-b7e9d7b848f4

Client

The client.admin keyring is placed in the file environments/infrastructure/files/ceph/ceph.client.admin.keyring.

Swappiness

The swappiness is set via the os_tuning_params dictionary. The dictionary can +only be completely overwritten via an entry in the file environments/ceph/configuration.yml.

By default, the dictionary looks like this:

os_tuning_params:
- { name: fs.file-max, value: 26234859 }
- { name: vm.zone_reclaim_mode, value: 0 }
- { name: vm.swappiness, value: 10 }
- { name: vm.min_free_kbytes, value: "{{ vm_min_free_kbytes }}" }

The sysctl paremeters are written to the file /etc/sysctl.d/ceph-tuning.conf +on the storage nodes.

# cat /etc/sysctl.d/ceph-tuning.conf
fs.aio-max-nr=1048576
fs.file-max=26234859
vm.zone_reclaim_mode=0
vm.swappiness=10
vm.min_free_kbytes=4194303

RGW service

  1. Add following configuration in environments/ceph/configuration.yml

    ceph_conf_overrides:
    "client.rgw.{{ hostvars[inventory_hostname]['ansible_hostname'] }}.rgw0":
    "rgw content length compat": "true"
    "rgw enable apis": "swift, s3, admin"
    "rgw keystone accepted roles": "member, admin"
    "rgw keystone accepted admin roles": "admin"
    "rgw keystone admin domain": "default"
    "rgw keystone admin password": "{{ ceph_rgw_keystone_password }}"
    "rgw keystone admin project": "service"
    "rgw keystone admin tenant": "service"
    "rgw keystone admin user": "ceph_rgw"
    "rgw keystone api version": "3"
    "rgw keystone url": "https://api-int.testbed.osism.xyz:5000"
    "rgw keystone verify ssl": "false"
    "rgw keystone implicit tenants": "true"
    "rgw s3 auth use keystone": "true"
    "rgw swift account in url": "true"
    "rgw swift versioning enabled": "true"

    If the ceph_conf_overrides parameter already exists in environments/ceph/configuration.yml, +expand it and do not overwrite it.

    If self-signed SSL certificates are used, two additional parameters must be set.

     "rgw keystone verify ssl": "false"
    "rgw verify ssl": "false"

    For all possible configuration parameters visit the +Ceph configuration reference.

  2. Add the ceph_rgw_keystone_password from environments/kolla/secrets.yml to +environments/ceph/secrets.yml.

  3. Add following configuration in environments/kolla/configuration.yml

    enable_ceph_rgw: true
    enable_ceph_rgw_keystone: true

    ceph_rgw_swift_compatibility: false
    ceph_rgw_swift_account_in_url: true

Extra pools

Extra pools can be defined via the openstack_pools_extra parameter.

inventory/group_vars/generic/ceph.yml
openstack_cinder_extra001_pool:
name: extra001
pg_num: "{{ openstack_pool_default_pg_num }}"
pgp_num: "{{ openstack_pool_default_pg_num }}"
rule_name: "replicated_rule"
min_size: "{{ openstack_pool_default_min_size }}"
application: "rbd"

openstack_pools_extra:
- "{{ openstack_cinder_extra001_pool }}"

If more than one Ceph cluster is managed with one manager, do not place the +parameters in inventory/group_vars/generic but in a corresponding directory.

If, for example, the inventory group of the Ceph cluster on which the additional +pools are to be created is ceph.rbd, then the parameters would be stored in +inventory/group_vars/ceph.rbd.yml accordingly.

ParameterDefault value
openstack_pool_default_pg_num64
openstack_pool_default_min_size0
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/configuration-guide/commons/index.html b/docs/iaas/guides/configuration-guide/commons/index.html new file mode 100644 index 0000000000..254a33ec43 --- /dev/null +++ b/docs/iaas/guides/configuration-guide/commons/index.html @@ -0,0 +1,26 @@ + + + + + +Commons | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/configuration-guide/commons/network/index.html b/docs/iaas/guides/configuration-guide/commons/network/index.html new file mode 100644 index 0000000000..461740e5a1 --- /dev/null +++ b/docs/iaas/guides/configuration-guide/commons/network/index.html @@ -0,0 +1,39 @@ + + + + + +Network | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Network

The osism.commons.network role is used for the netwok configuration. +Netplan is used by default. It is also possible to use the +old /etc/interfaces file.

Netplan

Since OSISM 6.1.0, the default network type is a netplan and no longer needs to be set explicitly
network_type: netplan

The configuration is written to /etc/netplan/01-osism.yaml by default. Can be changed +via the network_netplan_path and network_netplan_file parameters. The file permissions +are 0600 by default (cane be changed via the network_netplan_permissions parameter). +By default, all other files in /etc/netplan are removed. If you do not want this, you +can set network_netplan_remove_unmanaged_files to false. It is also possible to explicitly +list individual files that should not be deleted in network_netplan_managed_files_extra.

An existing /etc/intefaces file is replaced with a placeholder file. It is not possible +to use /etc/interfaces and Netplan in parallel.

This template is used as the base for the configuration
# This file describes the network interfaces available on your system
# For more information, see netplan(5).
---
network:
version: {{ network_version }}
renderer: {{ network_renderer }}

bonds:
{{ network_bonds|to_nice_yaml(indent=4)|indent(4) }}

bridges:
{{ network_bridges|to_nice_yaml(indent=4)|indent(4) }}

ethernets:
{{ network_ethernets|to_nice_yaml(indent=4)|indent(4) }}

tunnels:
{{ network_tunnels|to_nice_yaml(indent=4)|indent(4) }}

vlans:
{{ network_vlans|to_nice_yaml(indent=4)|indent(4) }}

The parameters listed in the following table can be used in the template.

ParameterDefaultDescription
network_version2Defines what version of the configuration format is used. The only value supported at the moment is 2.
network_renderernetworkdDefines what network configuration tool will be used to set up your configuration. Valid values are networkd and NetworkManager.
network_bonds{}https://netplan.readthedocs.io/en/stable/netplan-yaml/#properties-for-device-type-bonds
network_bridges{}https://netplan.readthedocs.io/en/stable/netplan-yaml/#properties-for-device-type-bridges
network_ethernets{}https://netplan.readthedocs.io/en/stable/netplan-yaml/#properties-for-device-type-ethernets
network_tunnels{}https://netplan.readthedocs.io/en/stable/netplan-yaml/#properties-for-device-type-tunnels
network_vlans{}https://netplan.readthedocs.io/en/stable/netplan-yaml/#properties-for-device-type-vlans

Changes to the configuration are currently not applied utomatically. This is done on +purpose to enable a manual check in advance. Changes to the network configuration can +be applied either by rebooting or by executing netplan apply.

$ osism console --type clush all
Enter 'quit' to leave this interactive mode
Working with nodes: testbed-manager.testbed.osism.xyz,testbed-node-[0-2].testbed.osism.xyz
clush> sudo netplan apply

Example

The Netplan documentation contains a large number of example configurations. The following +example shows the use of How to create VLANs with the osism.commons.network role.

network_ethernets:
mainif:
match:
macaddress: "de:ad:be:ef:ca:fe"
set-name: mainif
addresses: [ "10.3.0.5/23" ]
nameservers:
addresses: [ "8.8.8.8", "8.8.4.4" ]
search: [ example.com ]
routes:
- to: default
via: 10.3.0.1

network_vlans:
vlan15:
id: 15
link: mainif
addresses: [ "10.3.99.5/24" ]
vlan10:
id: 10
link: mainif
addresses: [ "10.3.98.5/24" ]
nameservers:
addresses: [ "127.0.0.1" ]
search: [ domain1.example.com, domain2.example.com ]

Dispatcher scripts

Dummy interfaces

Dummy devices are created with the help of +systemd.netdev +and can then be used as a normal netowrk device in the Netplan configuration.

network_dummy_interfaces:
- dummy0

The MTU is set to 9000 by default and can be set via network_dummy_interface_mtu.

/etc/interfaces

If /etc/interfaces is to be used, the network_type must be explicitly set in environments/configuration.yml
network_type: interfaces
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/configuration-guide/commons/packages/index.html b/docs/iaas/guides/configuration-guide/commons/packages/index.html new file mode 100644 index 0000000000..9686e3354a --- /dev/null +++ b/docs/iaas/guides/configuration-guide/commons/packages/index.html @@ -0,0 +1,30 @@ + + + + + +Packages | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Packages

With the osism.commons.packages role, it is possible to add packages on a node +in a general form.

required_packages_default:
- ethtool
- jq
- rsyslog

required_packages_extra: []
required_packages: "{{ required_packages_default + required_packages_extra + required_packages_distribution }}"

Distribution specific packages

Debian

With Debian, the packages listed in required_packages_distribution are installed by default.

required_packages_distribution:
- debsums
- selinux-utils
- ssh

The apt_cache_valid_time parameter can be used to set the cache_valid_time paremter +of the ansible.builtin.apt module. The module updates the apt cache if it is older than +the cache_valid_time. The parameter is set in seconds and defaults to 3600.

Upgrade of packages

The upgrade_packages parameter can be used to configure the upgrade of packages. +The parameter is set to true by default.

+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/configuration-guide/commons/services/index.html b/docs/iaas/guides/configuration-guide/commons/services/index.html new file mode 100644 index 0000000000..5ac1f8953c --- /dev/null +++ b/docs/iaas/guides/configuration-guide/commons/services/index.html @@ -0,0 +1,28 @@ + + + + + +Services | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Services

With the osism.commons.services role, it is possible to manage services on a node +in a general form. This allows you to either activate any services or indicate that +specific services are running and should be deactivated.

Start and enable required services

services_required_default:
- cron
services_required_extra: []
services_required: "{{ services_required_default + services_required_extra }}"
note

services_required should not be overwritten. Use services_required_extra to add extra services.

Note on services that should be deactivated

services_warning_default:
- nscd
services_warning_extra: []
services_warning: "{{ services_warning_default + services_warning_extra }}"
note

services_warning should not be overwritten. Use services_warning_extra to add extra services.

+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/configuration-guide/commons/sshconfig/index.html b/docs/iaas/guides/configuration-guide/commons/sshconfig/index.html new file mode 100644 index 0000000000..5c631ffca9 --- /dev/null +++ b/docs/iaas/guides/configuration-guide/commons/sshconfig/index.html @@ -0,0 +1,28 @@ + + + + + +SSH Config | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

SSH Config

With the osism.commons.sshconfig role, it is possible to manage a SSH config +file in the home directory of the operator user.

Example

In the testbed +the /home/dragon/.ssh/config file is created on the manager node testbed-manager.

Example for an assembled /home/dragon/.ssh/config file
Host testbed-manager
HostName testbed-manager.testbed.osism.xyz
User dragon
Port 22
IdentityFile /opt/ansible/secrets/id_rsa.operator

####################
Host testbed-node-0
HostName testbed-node-0.testbed.osism.xyz
User dragon
Port 22
IdentityFile /opt/ansible/secrets/id_rsa.operator

####################
Host testbed-node-1
HostName testbed-node-1.testbed.osism.xyz
User dragon
Port 22
IdentityFile /opt/ansible/secrets/id_rsa.operator

####################
Host testbed-node-2
HostName testbed-node-2.testbed.osism.xyz
User dragon
Port 22
IdentityFile /opt/ansible/secrets/id_rsa.operator

Defaults

ParameterDefaultDescription
sshconfig_groupnameallAll nodes in this group are included.
sshconfig_order20The .ssh/config.d directory is used to prepare the .ssh/config file. You can add your own files in this directory. Everything with a filename prefix smaller than sshconfig_order is placed at the beginning of the assembled .ssh/config file. Anything with a filename prefix greater than sshconfig_order goes at the end.
sshconfig_port22The SSH port.
sshconfig_private_key_file/opt/ansible/secrets/id_rsa.operatorThe identity file to use. The file itself must already exist there. The file is created by the osism.services.manager role.
sshconfig_user"{{ operator_user }}"The user in which home directory the .ssh/config file will be generated.
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/configuration-guide/commons/sysctl/index.html b/docs/iaas/guides/configuration-guide/commons/sysctl/index.html new file mode 100644 index 0000000000..2ebdda6a0c --- /dev/null +++ b/docs/iaas/guides/configuration-guide/commons/sysctl/index.html @@ -0,0 +1,28 @@ + + + + + +Sysctl | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Sysctl

With the osism.commons.sysctl role, it is possible to manage the attributes of the kernel +via sysctl on a node.

The following defaults are set via the parameter sysctl_defaults.

GroupAttributeDefault
elasticsearchvm.max_map_count262144
rabbitmqnet.ipv4.tcp_keepalive_time6
rabbitmqnet.ipv4.tcp_keepalive_intvl3
rabbitmqnet.ipv4.tcp_keepalive_probes3
rabbitmqnet.core.wmem_max16777216
rabbitmqnet.core.rmem_max16777216
rabbitmqnet.ipv4.tcp_fin_timeout20
rabbitmqnet.ipv4.tcp_tw_reuse1
rabbitmqnet.core.somaxconn4096
rabbitmqnet.ipv4.tcp_syncookies0
rabbitmqnet.ipv4.tcp_max_syn_backlog8192
genericvm.swappiness1
computenet.netfilter.nf_conntrack_max1048576

The sysctl_extra parameter can be used to set your own parameters or overwrite existing +parameters in the defaults.

Set attribute fs.inotify.max_user_instances to 256 for all nodes in group generic
sysctl_extra:
generic:
- name: fs.inotify.max_user_instances
value: 256
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/configuration-guide/commons/timezone/index.html b/docs/iaas/guides/configuration-guide/commons/timezone/index.html new file mode 100644 index 0000000000..515ae6f009 --- /dev/null +++ b/docs/iaas/guides/configuration-guide/commons/timezone/index.html @@ -0,0 +1,27 @@ + + + + + +Timezone | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Timezone

With the osism.commons.timezone role, it is possible to manage the used timezone on a node.

This role is just a wrapper for the community.general.timezone +module. The role also installs the tzdata package.

ParameterDefaultDescription
timezone_hwclockUTCWhether the hardware clock is in UTC or in local timezone.
timezone_nameUTCName of the timezone for the system clock.
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/configuration-guide/configuration-repository/index.html b/docs/iaas/guides/configuration-guide/configuration-repository/index.html new file mode 100644 index 0000000000..3446382dd0 --- /dev/null +++ b/docs/iaas/guides/configuration-guide/configuration-repository/index.html @@ -0,0 +1,47 @@ + + + + + +Configuration Repository | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Configuration Repository

The configuration required for OSISM is stored in a single Git monorepo, the configuration repository.

Configuration repository layout

A configuration repository is always composed of the same basic layout.

  • environments directory

  • inventory directory

  • netbox directory (optional)

  • requirements.txt file

    In the requirements.txt the necessary dependencies are listed to be able to execute Gilt.

  • gilt.yml file

    Gilt is a Git layering tool. We use Gilt to maintain the image versions, +Ansible configuration and scripts within the environments/manager directory.

    The current gilt.yml file is always +located in the osism/cfg-generics repository.

    To use Gilt the dependencies are installed first.

    pip3 install -r requirements.txt

    After that you can update the manager environment in environments/manager. Since the gilt.yml +itself is updated with Gilt it is always important to run the command twice.

    gilt overlay
    gilt overlay

Creating a new configuration repository

The initial content for this repository is generated using the +cookiecutter.

Git repository

The content generated by the cookiecutter in the output/configuration directory is +committed to a new Git repository. By default, it is assumed that the configuration +repository is stored on GitHub. This can also be GitLab or an internal Git service +as well.

Host and path to the Git repository are specified via the git_ parameters: The +git_ parameters do not specify the path to the cookiecutter to use.

  [8/20] git_host (github.com):
[9/20] git_port (22):
[10/20] git_repository (YOUR_ORG/YOUR_NEW_CONFIGURATION_REPOSITORY): regiocloud/configuration
[11/20] git_username (git):
[12/20] git_version (main):

In this case, the generated configuration in the output/configuration directory is +stored on GitHub in the regiocloud/configuration repository.

Creation

In this example a new configuration repository is created with the defaults. The current stable +version of OSISM is used. The use of latest is described in the section +Use of latest.

The directory output is created and used as output volume.

mkdir output

The cookiecutter is executed within a container. Docker must be usable on the system +on which the cookiecutter is to be used. It should also work with podman.

docker run --rm -v $(pwd)/output:/output -it quay.io/osism/cookiecutter
[1/20] with_ceph (1):
[2/20] ceph_network_backend (192.168.80.0/20):
[3/20] ceph_network_frontend (192.168.64.0/20):
[4/20] ceph_version (quincy):
[5/20] domain (osism.xyz):
[6/20] fqdn_external (api.osism.xyz):
[7/20] fqdn_internal (api-int.osism.xyz):
[8/20] git_host (github.com):
[9/20] git_port (22):
[10/20] git_repository (YOUR_ORG/YOUR_NEW_CONFIGURATION_REPOSITORY):
[11/20] git_username (git):
[12/20] git_version (main):
[13/20] ip_external (192.168.96.9):
[14/20] ip_internal (192.168.32.9):
[15/20] manager_version (6.0.2):
[16/20] name_server (149.112.112.112):
[17/20] ntp_server (de.pool.ntp.org):
[18/20] openstack_version (2023.1):
[19/20] project_name (configuration):
[...]

Since we run the cookiecutter inside a container, the user rights are not correct +afterwards and have to be changed.

sudo chown -R $USER: output/

Use of latest

When you want to use latest this is done via the parameter manager_version. +By default, this is always set to the current stable version.

manager_version [6.0.2]: latest

If the manager_version parameter is set to latest it is also possible to explicitly +set the openstack_version and the ceph_version.

Make commit

The content is now committed to the previously created Git repository.

$ git clone git@github.com:YOUR_ORG/YOUR_NEW_CONFIGURATION_REPOSITORY.git YOUR_NEW_CONFIGURATION_REPOSITORY
$ cp -r output/configuration/* output/configuration/.gitignore YOUR_NEW_CONFIGURATION_REPOSITORY
$ cd YOUR_NEW_CONFIGURATION_REPOSITORY
$ git add .gitignore *
$ git commit -m "Initial commit"
$ git push

The secrets directory is not stored in the Git repository. Its contents can be +stored in a suitable location.

The secrets directory contains an SSH key pair which is used as a deploy key to +make the configuration repository available on the manager node later. Write access +is not required. The public SSH key is stored in the file secrets/id_rsa.configuration.pub.

How to add a deploy key on GitHub is documented in +Managing deploy keys.

Post-processing

The configuration repository that is initially created with the Cookiecutter is not directly usable. +For example, the inventory needs to be built. All further information can be found in the +Configuration Guide.

Notes

  • The password for Ansible Vault encrypted files, ist stored at secrets/vaultpass.
  • The password of the generated Keepass file is password. This has to be changed.

Parameters

ParameterDescriptionDefault
ceph_network_backendAddress range for ceph's backend network192.168.80.0/20
ceph_network_frontendAddress range for ceph's frontend network192.168.64.0/20
ceph_versionThe version of Ceph. When using a stable OSISM release (manager_version != latest), this value is ignored.quincy
domainThe domain used by hostnamesosism.xyz
fqdn_externalExternal API FQDNapi.osism.xyz
fqdn_internalInternal API FQDNapi-int.osism.xyz
git_hostAddress of the used Git servergithub.com
git_portPort of the used Git server22
git_repositoryPath to the git configuration repositoryYOUR_ORG/YOUR_NEW_CONFIGURATION_REPOSITORY
git_usernameUsername of the git repositorygit
git_versionGit branch namemain
ip_externalThe external IP address of the API (resolves to fqdn_external)192.168.96.9
ip_internalThe internal IP address of the API (resolves to fqdn_internal)192.168.32.9
manager_versionThe version of OSISM. An overview of available OSISM releases can be found on release.osism.tech.6.0.2
name_serverNameserver. Only one nameserver is set here because the query of multiple values in Cooiecutter is weird. Add more nameservers afterwards.149.112.112.112
ntp_serverNTP server. Only one NTP server is set here because the query of multiple values in Cooiecutter is weird. Add more NTP servers afterwards.de.pool.ntp.org
openstack_versionThe version of OpenStack. When using a stable OSISM release (manager_version != latest), this value is ignored.2023.1
project_nameName of the configuration repository directoryconfiguration
with_ceph1 to use Ceph, 0 to not use Ceph1

Preparing a new configuration repository

Manager environment

environments/manager/hosts
[manager]
manager01
environments/manager/host_vars/manager01.yml
---
##########################################################
# ansible

ansible_host: 192.168.16.5

##########################################################
# generic

internal_interface: eno1

##########################################################
# network

network_type: netplan
network_ethernets:
eno1:
addresses:
- "192.168.16.10/20"
gateway4: "192.168.16.1"
mtu: 1500

Inventory

inventory/20-roles
##########################################################
# roles

# NOTE: If netbox is not used, nothing needs to be changed here. In
# this case this inventory is used as before. The hosts are
# then managed here as normal.
#
# If netbox is used this file is only used to store the hosts
# for the initial import into the netbox.
#
# After the initial import of the inventory in the netbox,
# the groups in this file can be emptied. The systems are
# then assigned to their roles via tags in the netbox.

# The "all" group is not used in OSISM. Therefore it is important
# that all nodes are explicitly listed here.
[generic]
node01

# Nodes that act as manager (sometimes called deployment node)
# are included in this group.
[manager]
manager01

# Nodes which are intended for monitoring services belong to
# this group
[monitoring]

# Nodes that serve as controllers, so things like scheduler,
# API or database run there, of the environment.
[control]

# Virtual systems managed by OpenStack Nova are placed on
# nodes in this group.
[compute]

# Network resources managed by OpenStack Neutron, such as
# L3 routers, are placed on these nodes. This group has nothing
# to do with the general network configuration.
[network]

# Nodes that serve as controllers for Ceph, so things like the
# Ceph Monitor service run here.
[ceph-control]

# The storage available in these systems is provided in the
# form of OSDs for Ceph.
[ceph-resource]

# NOTE: These empty groups are only necessary if netbox is used. After
# the initial import of the hosts these groups can be commented
# out. The groups above with the initial hosts can be commented.
#
# [generic]
#
# [manager]
#
# [monitoring]
#
# [control]
#
# [compute]
#
# [network]
#
# [ceph-control]
#
# [ceph-resource]
inventory/host_vars/node01.yml
---
##########################################################
# ansible

# NOTE: Address where the node can be reached via SSH.
ansible_host: 192.168.16.10

##########################################################
# generic

internal_interface: eno1

# NOTE: The address of the internal interface.
internal_address: 192.168.16.10

##########################################################
# netdata

netdata_host_type: client

# NOTE: Uncomment this when this node should be a Netdata server.

# netdata_host_type: server

##########################################################
# network

# NOTE: This is the initial management interface. Further interfaces
# must be added.

network_type: netplan
network_ethernets:
eno1:
addresses:
- "192.168.16.10/20"
gateway4: "192.168.16.1"
mtu: 1500

##########################################################
# kolla

network_interface: eno1

# api_interface:
# bifrost_network_interface:
# dns_interface:
# kolla_external_vip_interface:
# migration_interface:
# neutron_external_interface:
# octavia_network_interface:
# storage_interface:
# tunnel_interface:

##########################################################
# ceph

# NOTE: Uncomment this when this node is a part of the Ceph cluster.

# monitor_address:
# radosgw_address:

# monitor_interface:
# radosgw_interface:

# NOTE: Uncomment this when this node should be a OSD node.

# devices:
# - /dev/sdb
# - /dev/sdc
# - /dev/sdd
# - /dev/sde
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/configuration-guide/index.html b/docs/iaas/guides/configuration-guide/index.html new file mode 100644 index 0000000000..8b971b5819 --- /dev/null +++ b/docs/iaas/guides/configuration-guide/index.html @@ -0,0 +1,26 @@ + + + + + +Configuration Guide | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/iaas/guides/configuration-guide/inventory/index.html b/docs/iaas/guides/configuration-guide/inventory/index.html new file mode 100644 index 0000000000..e3223ef89f --- /dev/null +++ b/docs/iaas/guides/configuration-guide/inventory/index.html @@ -0,0 +1,30 @@ + + + + + +Inventory | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Inventory

The inventory used for the environment is located in the inventory directory.

Manager

The manager has his own inventory which is used exclusively for the seed phase of the manager. +It is located in the directory environments/manager. There is a hosts file with only the +manager node in it.

Reconciler

Inventory Reconciler

Host Vars

Group Vars

Define variable for all nodes

The Ansible group all is specifically used internally by OSISM, is reserved and is not supported +for additional variables. When variables are added in the configuration repository for the all group, +they are ignored. In OSISM the group generic can be used to store variables for all nodes.

+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/configuration-guide/manager/index.html b/docs/iaas/guides/configuration-guide/manager/index.html new file mode 100644 index 0000000000..cba92361b6 --- /dev/null +++ b/docs/iaas/guides/configuration-guide/manager/index.html @@ -0,0 +1,47 @@ + + + + + +Manager | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Manager

Stable release

It is recommended to use a stable release of OSISM. All available releases are listed on +release.osism.tech. Always check there in advance and do not copy +the stable release used here as an example.

In the example, OSISM release 6.0.0 is used.

  1. Sync the image versions in the configuration repository. It is important to do this so +that the correct versions are available in environments/manager/images.yml.

    gilt overlay  # you have to do this 2x
    gilt overlay

    Optionally, this is normally not necessary, it is possible to reference a specific tag of the +osism/cfg-generics repository. To do this, first +check which version of osism/cfg-generics is used in a particular release. The version is +defined in generics_version in the base.yml file in the osism/release repository. For OSISM 6.0.0, +for example, this is version v0.20230919.0. +This version is then added to the file gilt.yml in the configuration repository instead of +main at version. This change must be made again after each execution of gilt overlay as +it is overwritten by the call of gilt overlay. This cannot be realized differently in the +current implementation of Gilt.

  2. Set the new manager version in the configuration repository.

    yq -i '.manager_version = "6.0.0"' environments/manager/configuration.yml
  3. If openstack_version or ceph_version are set in environments/manager/configuration.yml +(or anywhere else), they must be removed. If these are set, the stable release is not used for +these components.

  4. Commit and push changes in the configuration repository. Since everyone here has their own +workflows for changes to the configuration repository, only a generic example for Git.

    git commit -a -s -m "manager: use OSISM version 6.0.0"
    git push

OpenSearch integration

With the command osism log opensearch it is possible to send SQL queries +to the OpenSearch service. For the command to be functional, the OpenSearch +integration must be activated in the manager environment and the OpenSearch +address and port must be set.

environments/manager/configuration.yml
manager_opensearch_enable: true
manager_opensearch_address: api-int.testbed.osism.xyz
manager_opensearch_port: 9200
manager_opensearch_protocol: https

The integration can also be enabled later. osism update manager is then +executed after the configuration has been changed.

OpenStack broker integration

If the Baremetal Service Integration in OSISM is used, the OpenStack Broker integration is +required. The integration itself is activated by setting the parameter enable_listener to true.

The hosts in the manager_listener_broker_hosts list are the control nodes of OpenStack. +The user is set via manager_listener_broker_username. On OpenStack's RabbitMQ broker, the user openstack +is present by default.

environments/manager/configuration.yml
enable_listener: true
manager_listener_broker_hosts:
- 192.168.16.10
- 192.168.16.11
- 192.168.16.12
manager_listener_broker_username: openstack
manager_listener_broker_uri: "{% for host in manager_listener_broker_hosts %}amqp://{{ manager_listener_broker_username }}:{{ manager_listener_broker_password }}@{{ host }}:5672/{% if not loop.last %};{% endif %}{% endfor %}"

The password used when using the openstack user is rabbitmq_password from environments/kolla/secrets.yml.

environments/manager/secrets.yml
manager_listener_broker_password: RABBITMQ_PASSWORD
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/configuration-guide/openstack/horizon/index.html b/docs/iaas/guides/configuration-guide/openstack/horizon/index.html new file mode 100644 index 0000000000..3826724f5e --- /dev/null +++ b/docs/iaas/guides/configuration-guide/openstack/horizon/index.html @@ -0,0 +1,30 @@ + + + + + +Horizon | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Horizon

Problems uploading machine images larger than 1 GiB

By default, the LimitRequestBody is set to 1073741824 (1 GiB). +This is a security feature (CVE-2022-29404) +and not a bug. Further details in the +A new default for the LimitRequestBody directive in httpd configuration +article in the RedHat knowledgebase.

This limit can be increased via the parameter horizon_httpd_limitrequestbody.

environments/kolla/configuration.yml
horizon_httpd_limitrequestbody: 2147483648  # 2 GiB
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/configuration-guide/openstack/index.html b/docs/iaas/guides/configuration-guide/openstack/index.html new file mode 100644 index 0000000000..6436a8ffe1 --- /dev/null +++ b/docs/iaas/guides/configuration-guide/openstack/index.html @@ -0,0 +1,40 @@ + + + + + +OpenStack | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

OpenStack

Network interfaces

ParameterDefaultDescription
network_interfaceeth0
neutron_external_interface{{ network_interface }}
kolla_external_vip_interface{{ network_interface }}
api_interface{{ network_interface }}
migration_interface{{ api_interface }}
tunnel_interface{{ network_interface }}
octavia_network_interface{{ 'o-hm0' if octavia_network_type == 'tenant' else api_interface }}
dns_interface{{ network_interface }}
dpdk_tunnel_interface{{ neutron_external_interface }}
ironic_http_interface{{ api_interface }}
ironic_tftp_interface{{ api_interface }}

How does the configuration get into services?

It is explained with example of OpenSearch Service how the configuration for OpenSearch +is created and gets into the container.

  • The task Copying over opensearch service config file +merges the individual sources of the files.

    Copying over opensearch service config file task
    - name: Copying over opensearch service config file
    merge_yaml:
    sources:
    - "{{ role_path }}/templates/opensearch.yml.j2"
    - "{{ node_custom_config }}/opensearch.yml"
    - "{{ node_custom_config }}/opensearch/opensearch.yml"
    - "{{ node_custom_config }}/opensearch/{{ inventory_hostname }}/opensearch.yml"
    dest: "{{ node_config_directory }}/opensearch/opensearch.yml"
    mode: "0660"
    become: true
    when:
    - inventory_hostname in groups['opensearch']
    - opensearch_services['opensearch'].enabled | bool
    notify:
    - Restart opensearch container
  • As a basis a template opensearch.yml.j2 +is used which is part of the OpenSearch service role.

    opensearch.yml.j2 template
    {% set num_nodes = groups['opensearch'] | length %}
    {% set recover_after_nodes = (num_nodes * 2 / 3) | round(0, 'floor') | int if num_nodes > 1 else 1 %}
    plugins.security.disabled: "true"

    node.name: "{{ 'api' | kolla_address | put_address_in_context('url') }}"
    network.host: "{{ 'api' | kolla_address | put_address_in_context('url') }}"

    cluster.name: "{{ opensearch_cluster_name }}"
    cluster.initial_master_nodes: [{% for host in groups['opensearch'] %}"{{ 'api' | kolla_address(host) }}"{% if not loop.last %},{% endif %}{% endfor %}]
    node.master: true
    node.data: true
    discovery.seed_hosts: [{% for host in groups['opensearch'] %}"{{ 'api' | kolla_address(host) | put_address_in_context('url') }}"{% if not loop.last %},{% endif %}{% endfor %}]

    http.port: {{ opensearch_port }}
    gateway.expected_nodes: {{ num_nodes }}
    gateway.recover_after_time: "5m"
    gateway.recover_after_nodes: {{ recover_after_nodes }}
    path.data: "/var/lib/opensearch/data"
    path.logs: "/var/log/kolla/opensearch"
    indices.fielddata.cache.size: 40%
    action.auto_create_index: "true"
  • For OpenSearch, overlay files can additionally be stored in 3 places in the configuration repository.

    • environments/kolla/files/overlays/opensearch.yml
    • environments/kolla/files/overlays/opensearch/opensearch.yml
    • environments/kolla/files/overlays/opensearch/{{ inventory_hostname }}/opensearch.yml

    When merging files, the last file found has the most weight. If there is a parameter node.master: true +in the service role template opensearch.yml.j2 of the OpenSearch service and you set e.g. +node.master: false in environments/kolla/files/overlays/opensearch.yml then accordingly in the finished opensearch.yml +node.master: false is used.

  • After the merge the task Copying over opensearch service config file copies the content into the +configuration directory /etc/kolla/opensearch of the service.

    /etc/kolla/opensearch/opensearch.yml
    action.auto_create_index: 'true'
    cluster.initial_master_nodes:
    - 192.168.16.10
    cluster.name: kolla_logging
    discovery.seed_hosts:
    - 192.168.16.10
    gateway.expected_nodes: 1
    gateway.recover_after_nodes: 1
    gateway.recover_after_time: 5m
    http.port: 9200
    indices.fielddata.cache.size: 40%
    network.host: 192.168.16.10
    node.data: true
    node.master: true
    node.name: 192.168.16.10
    path.data: /var/lib/opensearch/data
    path.logs: /var/log/kolla/opensearch
    plugins.security.disabled: 'true'
  • The configuration directory /etc/kolla/opensearch is mounted in each container of the OpenSearch service +to /var/lib/kolla/config_files.

    Output of docker inspect opensearch
    "Mounts": [
    {
    "Type": "bind",
    "Source": "/etc/kolla/opensearch",
    "Destination": "/var/lib/kolla/config_files",
    "Mode": "rw",
    "RW": true,
    "Propagation": "rprivate"
    },
  • Entrypoint of a service is always kolla_start. +This script calls a script set_configs.py. +This script takes care of copying files from /var/lib/kolla/config_files to the right place inside the container. +For this purpose, the container has a +config.json +in which the individual actions are configured.

    The file /var/lib/kolla/config_files/opensearch.yml is copied to /etc/opensearch/opensearch.yml.

    The permissions of /var/lib/opensearch and /var/log/kolla/opensearch are set accordingly.

    /etc/kolla/opensearch/config.json
    {
    "command": "/usr/share/opensearch/bin/opensearch",
    "config_files": [
    {
    "source": "/var/lib/kolla/config_files/opensearch.yml",
    "dest": "/etc/opensearch/opensearch.yml",
    "owner": "opensearch",
    "perm": "0600"
    }
    ],
    "permissions": [
    {
    "path": "/var/lib/opensearch",
    "owner": "opensearch:opensearch",
    "recurse": true
    },
    {
    "path": "/var/log/kolla/opensearch",
    "owner": "opensearch:opensearch",
    "recurse": true
    }
    ]
    }
  • In the config.json of the service is also defined the command which will be executed after finishing the preparations. +In the case of OpenSearch this is /usr/share/opensearch/bin/opensearch.

    /etc/kolla/opensearch/config.json
    {
    "command": "/usr/share/opensearch/bin/opensearch",
    "config_files": [
    {
    "source": "/var/lib/kolla/config_files/opensearch.yml",
    "dest": "/etc/opensearch/opensearch.yml",
    "owner": "opensearch",
    "perm": "0600"
    }
    ],
    "permissions": [
    {
    "path": "/var/lib/opensearch",
    "owner": "opensearch:opensearch",
    "recurse": true
    },
    {
    "path": "/var/log/kolla/opensearch",
    "owner": "opensearch:opensearch",
    "recurse": true
    }
    ]
    }
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/configuration-guide/openstack/keystone/index.html b/docs/iaas/guides/configuration-guide/openstack/keystone/index.html new file mode 100644 index 0000000000..762ac73ff6 --- /dev/null +++ b/docs/iaas/guides/configuration-guide/openstack/keystone/index.html @@ -0,0 +1,30 @@ + + + + + +Keystone | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Keystone

Domain manager role

SCS Standard TrackSCS StandardSCS Documentation
IAMscs-0302Domain Manager configuration for Keystone

To configure and use the domain manager role from the SCS project, the +environments/kolla/files/overlays/keystone/policy.yaml file is created +in the configuration repository. The deployment and upgrade of the Keystone +service itself is then done as usual.

environments/kolla/files/overlays/keystone/policy.yaml
# classify domain managers with a special role
"is_domain_manager": "role:domain-manager"

# specify a rule that whitelists roles which domain admins are permitted
# to assign and revoke within their domain
"is_domain_managed_role": "'member':%(target.role.name)s or 'load-balancer_member':%(target.role.name)s or 'creator':%(target.role.name)s"

# allow domain admins to retrieve their own domain
"identity:get_domain": "(rule:is_domain_manager and token.domain.id:%(target.domain.id)s) or rule:admin_required"

# list_domains is needed for GET /v3/domains?name=... requests
# this is mandatory for things like
# `create user --domain $DOMAIN_NAME $USER_NAME` to correctly discover
# domains by name
"identity:list_domains": "rule:is_domain_manager or rule:admin_required"

# list_roles is needed for GET /v3/roles?name=... requests
# this is mandatory for things like `role add ... $ROLE_NAME`` to correctly
# discover roles by name
"identity:list_roles": "rule:is_domain_manager or rule:admin_required"

# get_role is needed for GET /v3/roles/{role_id} requests
# this is mandatory for the OpenStack SDK to properly process role assignments
# which are issued by role id instead of name
"identity:get_role": "(rule:is_domain_manager and rule:is_domain_managed_role) or rule:admin_required"

# allow domain admins to manage users within their domain
"identity:list_users": "(rule:is_domain_manager and token.domain.id:%(target.domain_id)s) or rule:admin_required"
"identity:get_user": "(rule:is_domain_manager and token.domain.id:%(target.user.domain_id)s) or rule:admin_required"
"identity:create_user": "(rule:is_domain_manager and token.domain.id:%(target.user.domain_id)s) or rule:admin_required"
"identity:update_user": "(rule:is_domain_manager and token.domain.id:%(target.user.domain_id)s) or rule:admin_required"
"identity:delete_user": "(rule:is_domain_manager and token.domain.id:%(target.user.domain_id)s) or rule:admin_required"

# allow domain admins to manage projects within their domain
"identity:list_projects": "(rule:is_domain_manager and token.domain.id:%(target.domain_id)s) or rule:admin_required"
"identity:get_project": "(rule:is_domain_manager and token.domain.id:%(target.project.domain_id)s) or rule:admin_required"
"identity:create_project": "(rule:is_domain_manager and token.domain.id:%(target.project.domain_id)s) or rule:admin_required"
"identity:update_project": "(rule:is_domain_manager and token.domain.id:%(target.project.domain_id)s) or rule:admin_required"
"identity:delete_project": "(rule:is_domain_manager and token.domain.id:%(target.project.domain_id)s) or rule:admin_required"
"identity:list_user_projects": "(rule:is_domain_manager and token.domain.id:%(target.user.domain_id)s) or user_id:%(user_id)s or rule:admin_required"

# allow domain managers to manage role assignments within their domain
# (restricted to specific roles by the 'is_domain_managed_role' rule)
#
# project-level role assignment to user within domain
"is_domain_user_project_grant": "token.domain.id:%(target.user.domain_id)s and token.domain.id:%(target.project.domain_id)s and rule:is_domain_managed_role"
# project-level role assignment to group within domain
"is_domain_group_project_grant": "token.domain.id:%(target.group.domain_id)s and token.domain.id:%(target.project.domain_id)s and rule:is_domain_managed_role"
# domain-level role assignment to group
"is_domain_level_group_grant": "token.domain.id:%(target.group.domain_id)s and token.domain.id:%(target.domain.id)s and rule:is_domain_managed_role"
# domain-level role assignment to user
"is_domain_level_user_grant": "token.domain.id:%(target.user.domain_id)s and token.domain.id:%(target.domain.id)s and rule:is_domain_managed_role"
"domain_manager_grant": "rule:is_domain_manager and (rule:is_domain_user_project_grant or rule:is_domain_group_project_grant or rule:is_domain_level_group_grant or rule:is_domain_level_user_grant)"
"identity:check_grant": "rule:domain_manager_grant or rule:admin_required"
"identity:list_grants": "rule:domain_manager_grant or rule:admin_required"
"identity:create_grant": "rule:domain_manager_grant or rule:admin_required"
"identity:revoke_grant": "rule:domain_manager_grant or rule:admin_required"
"identity:list_role_assignments": "(rule:is_domain_manager and token.domain.id:%(target.domain_id)s) or rule:admin_required"

# allow domain managers to manage groups within their domain
"identity:list_groups": "(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s) or rule:admin_required"
"identity:get_group": "(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s) or rule:admin_required"
"identity:create_group": "(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s) or rule:admin_required"
"identity:update_group": "(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s) or rule:admin_required"
"identity:delete_group": "(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s) or rule:admin_required"
"identity:list_groups_for_user": "(rule:is_domain_manager and token.domain.id:%(target.user.domain_id)s) or rule:admin_required"
"identity:list_users_in_group": "(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s) or rule:admin_required"
"identity:remove_user_from_group": "(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s and token.domain.id:%(target.user.domain_id)s) or rule:admin_required"
"identity:check_user_in_group": "(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s and token.domain.id:%(target.user.domain_id)s) or rule:admin_required"
"identity:add_user_to_group": "(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s and token.domain.id:%(target.user.domain_id)s) or rule:admin_required"

The role domain-manager is created using the OpenStack CLI. Alternatively, the role can +be added using Ansible or other tools.

$ openstack --os-cloud admin \
role create \
--or-show \
--description "Domain Manager Role" \
domain-manager
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | Domain Manager Role |
| domain_id | None |
| id | 9b7140bfe628468ab9b86b365f9ac4c2 |
| name | domain-manager |
| options | {} |
+-------------+----------------------------------+

A user can then be made a domain manager for a particular domain by assigning this role.

$ openstack --os-cloud admin \
role add \
--user test \
--domain test \
domain-manager

OIDC Federation

+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/configuration-guide/proxy/index.html b/docs/iaas/guides/configuration-guide/proxy/index.html new file mode 100644 index 0000000000..1fdd040abf --- /dev/null +++ b/docs/iaas/guides/configuration-guide/proxy/index.html @@ -0,0 +1,26 @@ + + + + + +Proxy | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Proxy

##########################################################
# proxy

docker_configure_proxy: true
docker_proxy_http: "http://{{ groups['manager'][0] }}:3128"
docker_proxy_https: "{{ docker_proxy_http }}"

proxy_proxies:
http: "http://{{ groups['manager'][0] }}:3128"
https: "http://{{ groups['manager'][0] }}:3128"
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/configuration-guide/self-signed-certificates/index.html b/docs/iaas/guides/configuration-guide/self-signed-certificates/index.html new file mode 100644 index 0000000000..1ccb5b333c --- /dev/null +++ b/docs/iaas/guides/configuration-guide/self-signed-certificates/index.html @@ -0,0 +1,26 @@ + + + + + +Self-signed certificates | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/configuration-guide/services/index.html b/docs/iaas/guides/configuration-guide/services/index.html new file mode 100644 index 0000000000..95bd329ebc --- /dev/null +++ b/docs/iaas/guides/configuration-guide/services/index.html @@ -0,0 +1,26 @@ + + + + + +Services | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/iaas/guides/deploy-guide/bootstrap/index.html b/docs/iaas/guides/deploy-guide/bootstrap/index.html new file mode 100644 index 0000000000..88a3844c52 --- /dev/null +++ b/docs/iaas/guides/deploy-guide/bootstrap/index.html @@ -0,0 +1,41 @@ + + + + + +Bootstrap | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Bootstrap

Before the nodes can be bootstrapped, they must all have already been provisioned. +The guide for this can be found in the section +Provisioning of management and control plane nodes

The following steps are applied to bootstrap all nodes. After the completion of the bootstrap, +the nodes are already ready for use.

  1. Create operator user.

    osism apply operator -u osism
    • When using the osism/node-image the user is osism +and the password of this user is password. If you install Ubuntu manually the user usually +is ubuntu. If you want to use any other user here, that's no problem. It is important that +this user has sudo rights. The password according to what you have set yourself.

    • The operator public SSH key has to be added in advance on all nodes to authorized_keys file +of the user specified with -u. This key is stored as operator_public_key in the file +environments/configuration.yml.

      Alternatively (not recommended), the password can be stored in plain text in a file /opt/configuration/secrets/conn_password. +The parameter --conn-pass-file /opt/configuration/secrets/conn_password must then also be specified:

      osism apply operator -u osism \
      --conn-pass-file /opt/configuration/secrets/conn_password
    • It is important that this user has sudo rights with NOPASSWD.

      Alternatively (not recommended), the password can be stored in plain text in a file /opt/configuration/secrets/become_password. +The parameter --become-pass-file /opt/configuration/secrets/become_password must then also be specified:

      osism apply operator -u osism \
      --become-pass-file /opt/configuration/secrets/become_password
    • If a password is required for both sudo and login, use both arguments at the same time.

      osism apply operator -u osism \
      --become-pass-file /opt/configuration/secrets/become_password \
      --conn-pass-file /opt/configuration/secrets/conn_password
    • When using the osism/node-image the user is osism and the password of this +user is password. If you install Ubuntu manually the user usually is ubuntu. The password according to what you +have set yourself

  2. Proxy deployment (optional). This is only necessary if you use the proxy on the manager to enable external access to +the nodes.

    osism apply squid
  3. Proxy configuration (optional). This is only necessary if you use the proxy on the manager to enable external access to +the nodes.

    osism apply proxy
  4. Network configuration. It is recommended to backup the existing network configuration.

    osism apply network
  5. Reboot (optional). The reboot at this point is recommended to ensure that the network configuration is working.

    osism apply reboot -l 'all:!manager' -e ireallymeanit=yes
  6. Check if all systems are reachable (you probably have to do this several times until all systems are accessible).

    osism apply ping
    • System is currently rebooting and is not yet accessible via network.

      fatal: [net003]: UNREACHABLE! => {"changed": false, "msg": "Connection timed
      out.", "unreachable": true}``
    • System has already been rebooted and is not accessible via the network.

      fatal: [net003]: UNREACHABLE! => {"changed": false, "msg": "EOF on stream;
      last 100 lines received:\nssh: connect to host 10.15.0.33 port 22: No route
      to host\r", "unreachable": true}
  7. Refresh facts.

    osism apply facts
  8. Bootstrap.

    osism apply bootstrap
  9. Reboot (non-optional). Since the kernel version often changes after the initial bootstrap, +the reboot should always be performed.

    osism apply reboot -l 'all:!manager' -e ireallymeanit=yes
  10. Prepare the SSH configuration of the manager node.

    osism apply sshconfig
  11. Make all SSH public keys known.

    osism apply known-hosts
  12. Check again if all systems are reachable (you probably have to do this several times until all systems are accessible).

    osism apply ping

Ready. All nodes are now bootstrapped and available to deploy services.

+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box/index.html b/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box/index.html new file mode 100644 index 0000000000..9cc9e3d052 --- /dev/null +++ b/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box/index.html @@ -0,0 +1,89 @@ + + + + + +Cloud in a Box - CiaB | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Cloud in a Box - CiaB

💡 Cloud in a Box (CiaB) is a minimalistic installation of the latest stable OSISM release with only services which are needed to +make it work with Kubernetes. It is intended for use as a development +system on bare-metal or for use in edge environments.

danger

At the moment the secrets are stored in plain text in the osism/cloud-in-a-box +repository and are not secure. Do not use for public accessible systems. In the future, the secrets will be generated automatically.

Requirements

The system to be used as Cloud in a Box must fulfill these minimum requirements.

Type of resourceAmountNote
CPUat least 1 socket with 4 coresMore is better here. This is the minimum where you can't use much payload (LBaaS, VMs). The use of Kubernetes with Cluster API is not possible with this minimum size.
RAMat least 32 GByteMore is better here. In principle, it also works with 8 GByte, but then no payload (LBaaS, VMs) can be used. Kubernetes with Cluster API cannot be used then.
Storageat least 1 TByteHas to be available as /dev/sda or /dev/nvme0n1. Less than 1 TByte is also possible, the smaller the less storage is available for use in Ceph.
Networkat least 1 network interface (DHCP and internet access)An optional 2nd network interface can be used for external connectivity.
USB stickat least 2 GByteInstallation media for Cloud in a Box bootstrapping

Types

There are two types of Cloud in a Box.

  1. The sandbox type is intended for developers and demonstrations. A full OSISM installation +is one there which also includes Ceph and OpenSearch, for example. In the course of the +installation, necessary images, networks, etc. are also created.

  2. The edge type is intended to be deployed as an appliance to provide an edge cloud on a +single node. Compared to the sandbox, certain services are not provided there or are +implemented differently. For example, OpenSearch is not deployed because the logs are +delivered to a central location. The storage backend will also be implemented differently there +in the future instead of Ceph.

Installation

The images currently download and install the +latest state of the installation scripts, +therefore it is mandatory to update the installation media at least when the underlying Ubuntu operating +system release changes. The installation of older releases is currently not supported.

  1. Download one of the Cloud in a Box images of type sandbox

  2. Use a tool like balenaEtcher or dd to create a bootable USB stick with the Cloud +in a Box image.

  3. Boot from the USB stick. Make sure that the boot from USB is activated in the BIOS.

    danger

    When booting from this USB stick, all data on the hard disks will be destroyed +without confirmation.

  4. The installation of the operating system (Ubuntu 22.04) will start and take a few minutes. After that the system +will shutdown.

  5. The first start of the system

    • Remove the USB storage device +(The USB stick is only needed again if the Cloud in a Box system is to be fully reinstalled.)
    • Connect the first network interface to an ethernet interface that provides access to the internet via DHCP configuration
    • Boot the system from the internal hard disk device
  6. The deployment will start. This takes some time and the system will shutdown when the +deployment is finished. This takes roughly an hour, possibly longer depending on the +hardware and internet connection.

  7. Start the system again. System is ready for use, by default DHCP is tried on the first network device.

  8. Login via SSH. Use the user dragon with the password password. +(You can obtain the ip address by inspecting the logs of your dhcp server or from the issue text of the virtual consoles of the system)

    ssh dragon@IP_FROM_YOUR_SERVER
    passwd

    CiaB Issue Text

Manual installation

  1. Follow the provisioning guide, +skip the part about disk layout and do it this way:

    Disk layout

    1. Create a 1 GByte ext4 partition mounted in /boot
    2. Create a 8 GByte swap partition
    3. Create a 120 GByte unformatted partition
    4. Use a Create volume group (LVM) to create a volume group called system with the size of +120 GByte on the partition 4 you just created
    5. Create a logical volume by selecting the Free Space option under system LVM. This volume +should be mounted in / and have size of 100 GByte
    6. Create a partition with the size of the rest of the drive's space
    7. Create a new LVM volume group on partition 5 called osd-vg (will be used for Ceph)
  2. After the Ubuntu installation, the system will be rebooted

  3. Log into the machine via console to get its IP address and then use SSH to connect to the machine

  4. Clone the osism/cloud-in-a-box repository into /opt/cloud-in-a-box

    sudo git clone https://github.com/osism/cloud-in-a-box /opt/cloud-in-a-box
  5. Disable conflicting services from the default Ubuntu installation

    sudo /opt/cloud-in-a-box/cleanup.sh
  6. Install upgrades

    sudo apt update
    sudo apt upgrade
  7. Run the bootstrap.sh script with the required type (use of sandbox is recommended)

    sudo /opt/cloud-in-a-box/bootstrap.sh sandbox
  8. Run the deploy.sh script with the same type as in step 8 to deploy services like Ceph and OpenStack

    sudo /opt/cloud-in-a-box/deploy.sh sandbox
  9. Shutdown the system

    sudo shutdown -h now
  10. Start the system again. System is ready for use, by default DHCP is tried on the first network device.

  11. Login via SSH. Use the user dragon with the password password. +(You can obtain the ip address by inspecting the logs of your dhcp server or from the issue text of the virtual consoles of the system)

    ssh dragon@IP_FROM_YOUR_SERVER
    passwd

    CiaB Issue Text

info

The scripts are not idempotent yet. In case there is any fail during bootstrap.sh or deploy.sh you have to +start over with fresh installation.

Usage

Wireguard VPN service access

Copy the /home/dragon/wireguard-client.conf file from Cloud in a Box to your workstation. This is necessary +for using the web endpoints on your workstation. Rename the wireguard config file to something +like cloud-in-a-box.conf.

If you want to connect to the Cloud in a Box system from multiple clients, change the client IP +address in the config file to be different on each client.

scp dragon@IP_FROM_YOUR_SERVER:/home/dragon/wireguard-client.conf $HOME/cloud-in-a-box.conf

Install wireguard on your workstation, if you have not done this before. For instructions how to do +it on your workstation, please have a look on the documentation of your used distribution. The +wireguard documentation you will find here.

Start the wireguard tunnel.

sudo wg-quick up $HOME/cloud-in-a-box.conf

Webinterfaces

If you want to access the services please choose the URL from the following list:

NameURLUsernamePassword
ARAhttps://ara.services.in-a-box.cloudarapassword
Cephhttp://manager.systems.in-a-box.cloud:7000adminpassword
Flowerhttps://flower.services.in-a-box.cloud--
Grafanahttps://api.in-a-box.cloud:3000adminpassword
HAProxyhttp://manager.systems.in-a-box.cloud:1984openstackpassword
Homerhttps://homer.services.in-a-box.cloud--
Horizon - admin projecthttps://api.in-a-box.cloudadminpassword
Horizon - test projecthttps://api.in-a-box.cloudtesttest
Netboxhttps://netbox.services.in-a-box.cloudadminpassword
Netdatahttp://manager.systems.in-a-box.cloud:19999--
OpenSearch Dashboardshttps://api.in-a-box.cloud:5601opensearchpassword
PhpMyAdminhttps://phpmyadmin.services.in-a-box.cloudrootpassword
RabbitMQhttps://api.in-a-box.cloud:15672openstackpassword
Skyline - admin projecthttps://api.in-a-box.cloud:9999adminpassword
Skyline - test projecthttps://api.in-a-box.cloud:9999testtest

Command-line interfaces

Login to Cloud in a Box as described in step 8 of the installation chapter.

  • Select one of the preconfigured environments:
    • system
    • admin
    • test
  • Set the environment by exporting the environment variable: OS_CLOUD:
    export OS_CLOUD=admin
  • Use OpenStack CLI via the command openstack.
    openstack availability zone list
    openstack image list
    openstack server list # After installation there are no servers

Import of additional images

The OpenStack Image Manager is used to manage images. +In the example, the Garden Linux image is imported.

export OS_CLOUD=admin
osism manage images --filter 'Garden Linux'

All available images can be found in the osism/openstack-image-manager repository.

Upgrade

It is best to execute the commands within a screen session, it takes some time. Please note +that you cannot update the Ceph deployment at the moment. This will be enabled in the future.

osism apply configuration
/opt/configuration/upgrade.sh
docker system prune -a

Customisations

Use of 2nd NIC for external network

In the default configuration, the Cloud in a Box is built in such a way that an internal +VLAN101 is used as an simulated external network and this is made usable via the 1st network +interface using masquerading. This makes it possible for instances running on the Cloud +in a Box to reach the internet. The disadvantage of this is that the instances themselves +can only be reached via floating IP addresses from the Cloud in a Box system itself or +via the Wireguard tunnel. Especially in edge environments, however, one would usually like +to have this differently and the instances should be directly accessible via the local +network.

To make this work, first identify the name of a 2nd network card to be used.

dragon@manager:~$ sudo lshw -class network -short
H/W path Device Class Description
============================================================
/0/100/2.2/0 eno7 network Ethernet Connection X552 10 GbE SFP+
/0/100/2.2/0.1 eno8 network Ethernet Connection X552 10 GbE SFP+
/0/100/1c/0 eno1 network I210 Gigabit Network Connection
/0/100/1c.1/0 eno2 network I210 Gigabit Network Connection
/0/100/1c.4/0 eno3 network I350 Gigabit Network Connection
/0/100/1c.4/0.1 eno4 network I350 Gigabit Network Connection
/0/100/1c.4/0.2 eno5 network I350 Gigabit Network Connection
/0/100/1c.4/0.3 eno6 network I350 Gigabit Network Connection

In the following we use eno7. Activate the device manually with sudo ip link set up dev eno7. +Then check that a link is actually present.

dragon@manager:~$ ethtool eno7
Settings for eno7:
Supported ports: [ FIBRE ]
Supported link modes: 10000baseT/Full
[...]
Link detected: yes

Now this device is made permanently known in the network configuration. Select the MTU +accordingly. For 1 GBit rather 1500 than 9100.

  • /opt/configuration/inventory/group_vars/generic/network.yml
  • /opt/configuration/environments/manager/group_vars/manager.yml
network_ethernets:
eno1:
dhcp4: true
eno7:
mtu: 9100

Then, this change is deployed and applied.

osism apply network
sudo netplan apply

Now the configuration for Neutron and OVN is prepared. network_workload_interface +is expanded by the 2nd network interface. The order is not random, first vlan101 +then eno7. neutron_bridge_name is added.

  • /opt/configuration/inventory/group_vars/generic/network.yml
  • /opt/configuration/environments/manager/group_vars/manager.yml
network_workload_interface: "vlan101,eno7"
neutron_bridge_name: "br-ex,br-add"

Then, this change is deployed.

osism reconciler sync
osism apply openvswitch
osism apply ovn
osism apply neutron

Now segments and/or subnets can be configured. In this case, eno7 is configured as an +untagged port on the remote side.

  • /opt/configuration/environments/openstack/playbook-additional-public-network.yml
- name: Create additional public network
hosts: localhost
connection: local

tasks:
- name: Create additional public network
openstack.cloud.network:
cloud: admin
state: present
name: public-add
external: true
provider_network_type: flat
provider_physical_network: physnet2

- name: Create additional public subnet
openstack.cloud.subnet:
cloud: admin
state: present
name: subnet-public-add
network_name: public-add
cidr: 192.168.23.0/24
enable_dhcp: false
allocation_pool_start: 192.168.23.100
allocation_pool_end: 192.168.23.200
gateway_ip: 192.168.23.1
dns_nameservers:
- 8.8.8.8
- 9.9.9.9

The additional public network can now be made known with +osism apply -e openstack additional-public-network.

There is now a 2nd floating IP address pool with the name public-add +available for use. If instances are to be started directly in this network, +enable_dhcp: true must be set. In this case, it should be clarified in +advance with the provider of the external network whether the use of DHCP +is permitted there.

Running on a Virtual Machine

The Cloud in a Box has been tested to run on a virtual machine. However, the Cloud in a Box is mainly made +for running on bare metal, the automated installation does not work, and other things may not work either.

Nested virtualization

You likely want to run virtual machines on top of your Cloud in a Box. +The host machine has to support and enabled nested virtualization.

To enable nested virtualization the CPU configuration of the VM has to be host-passthrough or host-model

The linked guide can be used in other distributions as well.

Disk space saving

When using Cloud in a Box in a VM, you can utilize the qcow2 disk image or similar technology to save space. +In that case, the base installation requires just around 70 GB instead of a full 1 TB. +(The drive still needs to be made with a capacity of at least 1TB; however, the actual disk space usage is lower.)

Also in case you want to experiment a bit more and "hack around" using the manual installation +you can make disk snapshots when turned off after the Ubuntu installs, bootstrap.sh and deploy.sh to speed up your +progress.

If you use qemu, you can use following command to do snapshots.

sudo virsh snapshot-create-as --domain cib bootstrap "run of bootstrap.sh" --disk-only --diskspec sda,snapshot=external,file=/var/lib/libvirt/images/ub2022_cib_boostrap.qcow2 --atomic

QEMU guest agent

When running inside QEMU, it may be worth it to install the QEMU guest agent.

sudo apt -y install qemu-guest-agent
sudo systemctl enable qemu-guest-agent
sudo systemctl start qemu-guest-agent

Troubleshooting

Broken disk setup

This error means that your disk setup is broken. Use cfdisk and delete all partitions on +the system on which you want to install the Cloud in a Box image.

With lsblk you can verify if the partitions are empty.

Development

For the further development of the scripts and the mechanisms of the Cloud in a Box, +you need to know the following.

  • The operating system is brought onto the node via an automatic Ubuntu installation +that uses cloud-init
  • The installation starts the script init.sh which performs +an initial clone of the osism/cloud-in-a-box repository and a checkout of +the main branch. It also executes the deploy.sh and +bootstrap.sh scripts.
  • The installation persists the kernel parameters of the initial boot to the file /etc/.initial-kernel-commandline
  • The status and activities of the deployment are logged in /var/log/install-cloud-in-a-box.log. For proper colors use less -r. +Search for OVERALL STATUS to find the result of the specific installation steps.
  • Branch and location of the osism/cloud-in-a-box repository can be overriden +by setting the kernel parameters ciab_repo_url (a public repository address without authentication) and ciab_branch +(a name of a branch, use only ASCII chars, -, and _).
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/deploy-guide/examples/index.html b/docs/iaas/guides/deploy-guide/examples/index.html new file mode 100644 index 0000000000..9d7170fadc --- /dev/null +++ b/docs/iaas/guides/deploy-guide/examples/index.html @@ -0,0 +1,26 @@ + + + + + +Examples | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/iaas/guides/deploy-guide/examples/testbed/index.html b/docs/iaas/guides/deploy-guide/examples/testbed/index.html new file mode 100644 index 0000000000..647c14d2e4 --- /dev/null +++ b/docs/iaas/guides/deploy-guide/examples/testbed/index.html @@ -0,0 +1,86 @@ + + + + + +Testbed | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Testbed

💡 With the OSISM Testbed, it is possible to run a full Sovereign Cloud Stack +deployment on an existing OpenStack environment such as Cleura or REGIO.cloud.

OSISM is the reference implementation for the infrastructure as a service layer in the +Sovereign Cloud Stack (SCS) project. The OSISM Testbed is therefore +used in the SCS project to test and work on the Instrastructure as a Service layer.

The OSISM Testbed is intended as a playground. Further services and integration will +be added over time. More and more best practices and experiences from the productive +deployments will be included here in the future. It will become more production-like +over time. However, at no point does it claim to represent a production setup exactly.

Requirements

Cloud access

The prerequisite is to have an account on one of the supported OpenStack cloud providers.

It is not part of this guide to describe the registration with the individual cloud +providers. Please contact the respective cloud provider for this.

ProductProviderProfile name
CleuraCleuracleura
Fuga CloudFUGAfuga
HuaweiCloudHuaweiCloudhuaweicloud
OVHOVHovh
OpenTelekomCloudT-Systemsotc
pluscloud openplusserverpluscloudopen
REGIO.cloudOSISMregiocloud
Wavestacknoris networkwavestack

For each provider listed in the table, a predefined profile is available in the +terraform/environments directory. This profile contains the name of the public +network, which flavors to use, etc.

Here is an example from the profile for REGIO.cloud.

flavor_manager            = "SCS-4V-8-50"
flavor_node = "SCS-8V-32-100"
volume_type = "ssd"
image = "Ubuntu 22.04"
image_node = "Ubuntu 22.04"
public = "public"
availability_zone = "nova"
volume_availability_zone = "nova"
network_availability_zone = "nova"

Cloud resources

The OSISM Testbed requires at least the following project quota when using the default flavors:

ResourceQuantityNote
4Instances28 VCPUs + 104 GByte RAM
9Volumes90 GByte volume storage
1Floating IP
1Keypair
3Security group
16Security group rules
1Network
1Subetwork
6Ports
1Router

Preparations

Software

  • make must be installed on the system
  • yq must be installed on the system. yq is a portable +command-line YAML, JSON, XML, CSV, TOML and properties processor.
  • Ansible in a current version must be installed and usable on the local workstation. Currently Ansible 8 is supported. +Information on installing Ansible can be found in the Ansible +documentation
  • Terraform in a current version must be installed and usable on the local workstation. Currently Terraform 1.5 is supported. +Information on installing Terraform can be found in the Terraform +documentation

Custom CA

The OSISM Testbed installation currently uses hostnames in the domain testbed.osism.xyz. This is a real domain +and we provide the DNS records matching the addresses used in the OSISM Testbed, so that once you connect to your testbed via a direct +link or Wireguard, you can access hosts and servers by their hostname (e.g. ssh testbed-manager.testbed.osism.xyz).

We also provide a wildcard TLS certificate signed by a custom CA for testbed.osism.xyz and *.testbed.osism.xyz.

This CA is always used for each testbed. The CA is not regenerated and it is not planned to change this for the next 10 years.

In order for these certificates to be recognized locally as valid, the CA +environments/kolla/certificates/ca/testbed.crt +must be imported locally.

Getting Started

This section describes step by step how to deploy the OSISM Testbed.

  1. Clone the osism/testbed repository. +The repository can also be cloned to any other location.

    mkdir -p ~/src/github.com/osism
    git clone https://github.com/osism/testbed ~/src/github.com/osism/testbed
    cd ~/src/github.com/osism/testbed
  1. The access data for the cloud provider used is then stored in terraform/clouds.yaml. +The clouds.yaml file is provided by the cloud provider used. Please check the documentation +of the cloud provider you are using or their support for details.

    REGIO.cloud is used as an example. The cloud name in clouds.yaml +and the environment name (value of ENVIRONMENT) are regiocloud in this case. If another cloud +is used, replace regioclodu with the respective profile name from the table above.

    clouds:
    regiocloud:
    auth:
    auth_url: https://keystone.services.a.regiocloud.tech/v3
    project_name: PROJECT
    username: USERNAME
    password: PASSWORD
    project_domain_name: DOMAIN
    user_domain_name: DOMAIN

    The use of application credentials is preferred. This way it is not necessary to store +details like username or project name or sensitive information like the password in the +clouds.yaml file.

    The application credentials can be found in Horizon under Identity. Use OSISM testbed as +name and click Create Application Credential.

    The clouds.yaml file of REGIO.cloud can be used as an example for the use of +application credentials. With another cloud provider, only the auth_url must then be changed +accordingly.

    clouds:
    regiocloud:
    auth:
    auth_url: https://keystone.services.a.regiocloud.tech/v3
    application_credential_id: ID
    application_credential_secret: SECRET
    auth_type: "v3applicationcredential"
  2. Prepare the deployment. The versions of Ansible and Terraform are checked and necessary +dependencies are cloned.

    make prepare
  3. Create the infrastructure with Terraform.

    make ENVIRONMENT=regiocloud create
  4. Deploy the OSISM manager and bootstrap all nodes.

    make ENVIRONMENT=regiocloud manager
  5. Deploy all services. Depending on the cloud, the installation will take some time. Up +to two hours is not unusual. In this step, Ceph, OpenStack and all necessary +infrastructure services (MariaDB, RabbitMQ, ...) are deployed.

    make ENVIRONMENT=regiocloud deploy

    Alternatively, it is also possible to deploy the services step by step directly on the +manager. To do this, first log in to the manager with make ENVIRONMENT=regiocloud login +and then execute the deploy scripts one after the other. It is recommended to do this +within a screen session.

    /opt/configuration/scripts/deploy/001-helper-services.sh
    /opt/configuration/scripts/deploy/100-ceph-services-basic.sh
    /opt/configuration/scripts/deploy/200-infrastructure-services-basic.sh
    /opt/configuration/scripts/deploy/300-openstack-services-basic.sh
    /opt/configuration/scripts/deploy/400-monitoring-services.sh

    Deploying the services takes some time and depends on how much bandwidth is available, +how the instances are equipped, etc. 90-120 minutes is not unusual when Ceph and OpenStack +are fully deployed.

  6. After the deployment, you can log in to the manager via SSH.

    make ENVIRONMENT=regiocloud login
  7. If you want you can create a test project with a test user after login. It also +creates an instance with a volume attached to a network with a router.

    osism apply --environment openstack test
  8. When the OSISM Testbed is no longer needed, it can be deleted.

    make ENVIRONMENT=regiocloud clean

Configuration

This section describes how to configure and customise the OSISM Testbed.

Variables

The defaults for the Terraform variables are intended for REGIO.cloud.

VariableDefaultDescription
availability_zonenova
ceph_versionquincy
cloud_providerregiocloud
configuration_versionmain
deploy_monitoringfalse
dns_nameservers["8.8.8.8", "9.9.9.9"]
enable_config_drivetrue
flavor_managerSCS-4V-8-50
flavor_nodeSCS-8V-32-50
imageUbuntu 22.04
manager_versionlatest
network_availability_zonenova
number_of_nodes3
number_of_volumes3
openstack_version2023.1
prefixtestbed
publicexternal
refstackfalse
volume_availability_zonenova
volume_size_base30
volume_size_storage10
volume_type__DEFAULT__

Overrides

NameDescription
manager_boot_from_image
manager_boot_from_volume
neutron_availability_zone_hints_network
neutron_availability_zone_hints_router
neutron_router_enable_snat
nodes_boot_from_image
nodes_boot_from_volume
nodes_use_ephemeral_storage

Customisations

NameDescription
access_floatingip
access_ipv4
access_ipv6
default
neutron_floatingip

Usage

VPN access

Copy the /home/dragon/wireguard-client.conf file to your workstation. This is necessary +for using the web endpoints on your workstation. Rename the wireguard config file to something +like testbed.conf.

If you want to connect to the OSISM Testbed from multiple clients, change the client IP +address in the config file to be different on each client.

scp dragon@IP_FROM_YOUR_SERVER:/home/dragon/wireguard-client.conf /home/ubuntu/testbed.conf

Install wireguard on your workstation, if you have not done this before. For instructions how to do +it on your workstation, please have a look on the documentation of your used distribution. The +wireguard documentation you will find here.

Start the wireguard tunnel.

wg-quick up /home/ubuntu/testbed.conf

If you do not want to use Wireguard you can also work with sshuttle.

make sshuttle ENVIRONMENT=regiocloud

Webinterfaces

All SSL enabled services within the OSISM Testbed use certs which are signed by the self-signed +OSISM Testbed CA.

If you want to access the services please choose the URL from the following table.

NameURLUsernamePasswordNote
ARAhttps://ara.testbed.osism.xyz/arapassword
Cephhttps://api-int.testbed.osism.xyz:8140adminpassword
Flowerhttps://api-int.testbed.osism.xyz:8140
Grafanahttps://api-int.testbed.osism.xyz:3000adminpassword
Homerhttps://homer.testbed.osism.xyz
Horizon (via Keystone)https://api.testbed.osism.xyzadminpassworddomain: default
Horizon (via Keystone)https://api.testbed.osism.xyztesttestdomain: test
Horizon (via Keycloak)https://api.testbed.osism.xyzalicepassword
Keycloakhttps://keycloak.testbed.osism.xyzadminpassword
Kibanahttps://api.testbed.osism.xyz:5601kibanapassword
Netboxhttps://netbox.testbed.osism.xyz/adminpassword
Netdatahttps://testbed-manager.testbed.osism.xyz:19999
Patchmanhttps://patchman.testbed.osism.xyz/patchmanpassword
Prometheushttps://api-int.testbed.osism.xyz:9091/
phpMyAdminhttps://phpmyadmin.testbed.osism.xyzrootpassword
RabbitMQhttps://api-int.testbed.osism.xyz:15672/openstackBO6yGAAq9eqA7IKqeBdtAEO7aJuNu4zfbhtnRo8Y

Authentication with OIDC

Authentication with OpenID Connect (OIDC) is possible via Keycloak, which is automatically configured for the OIDC mechanism.

OpenStack web dashboard (Horizon) login via OIDC

For logging in via OIDC, open your browser at OpenStack Dashboard Login Page, select Authenticate via Keycloak, after being +redirected to the Keycloak login page, perform the login with the credentials alice and password. +After that you will be redirected back to the Horizon dashboard, where you will be logged in with the user alice.

OpenStack web dashboard (Horizon) logout

Keep in mind, that clicking Sign Out on the Horizon dashboard currently doesn't revoke your OIDC token, and any consequent +attempt to Authenticate via Keycloak will succeed without providing the credentials.

The expiration time of the Single Sign On tokens can be controlled on multiple levels in Keycloak.

  1. On realm level under Realm Settings > Tokens. +Assuming the keycloak_realm ansible variable is the default osism, and keycloak is listening on +keycloak.testbed.osism.xyz, then the configuration form is available +here.

    Detailed information is available in the Keycloak Server Administrator Documentation +Session and Token Timeouts section.

  2. In a realm down on the client level +select the client (keystone), and under Settings > Advanced Settings.

    It is recommended to keep the Access Token Lifespan on a relatively low value, with the trend of blocking third party +cookies. For further information see the Keycloak documentation's Browsers with Blocked Third-Party Cookies section.

OpenStack CLI operations with OpenID Connect password

Using the OpenStack cli is also possible via OIDC, assuming you provisioned the user alice with password password, +then you can perform a simple project list operation like this:

openstack \
--os-cacert /etc/ssl/certs/ca-certificates.crt \
--os-auth-url https://api.testbed.osism.xyz:5000/v3 \
--os-auth-type v3oidcpassword \
--os-client-id keystone \
--os-client-secret 0056b89c-030f-486b-a6ad-f0fa398fa4ad \
--os-username alice \
--os-password password \
--os-identity-provider keycloak \
--os-protocol openid \
--os-identity-api-version 3 \
--os-discovery-endpoint https://keycloak.testbed.osism.xyz/auth/realms/osism/.well-known/openid-configuration \
project list

OpenStack CLI token issue with OpenID Connect

It is also possible to exchange your username/password to a token, for further use with the cli. +The token issue subcommand returns an SQL table, in which the id column's value field contains the token:

openstack \
--os-cacert /etc/ssl/certs/ca-certificates.crt \
--os-auth-url https://api.testbed.osism.xyz:5000/v3 \
--os-auth-type v3oidcpassword \
--os-client-id keystone \
--os-client-secret 0056b89c-030f-486b-a6ad-f0fa398fa4ad \
--os-username alice \
--os-password password \
--os-identity-provider keycloak \
--os-protocol openid \
--os-identity-api-version 3 \
--os-discovery-endpoint https://keycloak.testbed.osism.xyz/auth/realms/osism/.well-known/openid-configuration \
--os-openid-scope "openid profile email" \
token issue \
-c id
-f value

An example token is like:

gAAAAABhC98gL8nsQWknro3JWDXWLFCG3CDr3Mi9OIlvVAZMjy2mNgYtlXv_0yAIy-
nSlLAaLIGhht17-mwf8uclKgRuNVsYLSmgUpB163l89-ch2w2_OFe9zNSQNWf4qfd8
Cl7E7XvvUoFr1N8Gh09vaYLvRvYgCGV05xBUSs76qCHa0qElPUsk56s5ft4ALrSrzD
4cEQRVb5PXNjywdZk9_gtJziz31A7sD4LPIy82O5N9NryDoDw
  • TODO: OpenStack CLI operations with token
  • TODO: OpenStack CLI token revoke

Advanced Usage

Change versions

  1. Go to /opt/configuration on testbed-manager
  2. Run ./scripts/set-openstack-version.sh zed to set the OpenStack version to zed
  3. Run ./scripts/set-ceph-version.sh quincy to set the Ceph version to quincy
  4. Run osism-update-manager to update the manager

Deploy services

ScriptDescription
/opt/configuration/scripts/deploy/000-manager-service.sh
/opt/configuration/scripts/deploy/001-helper-services.sh
/opt/configuration/scripts/deploy/100-ceph-services-basic.sh
/opt/configuration/scripts/deploy/200-infrastructure-services-basic.sh
/opt/configuration/scripts/deploy/210-infrastructure-services-extended.sh
/opt/configuration/scripts/deploy/300-openstack-services-basic.sh
/opt/configuration/scripts/deploy/310-openstack-services-extended.sh
/opt/configuration/scripts/deploy/320-openstack-services-baremetal.sh
/opt/configuration/scripts/deploy/330-openstack-services-additional.sh
/opt/configuration/scripts/deploy/400-monitoring-services.sh

Upgrade services

ScriptDescription
/opt/configuration/scripts/upgrade/100-ceph-services.sh
/opt/configuration/scripts/upgrade/200-infrastructure-services-basic.sh
/opt/configuration/scripts/upgrade/300-openstack-services-basic.sh
/opt/configuration/scripts/upgrade/310-openstack-services-extended.sh
/opt/configuration/scripts/upgrade/320-openstack-services-baremetal.sh
/opt/configuration/scripts/upgrade/330-openstack-services-additional.sh

Troubleshooting

Unsupported locale setting

$ make prepare
ansible-playbook -i localhost, ansible/check-local-versions.yml
ERROR: Ansible could not initialize the preferred locale: unsupported locale setting
make: *** [prepare] Error 1

To solve the problem you have to modify the Makefile. Change the 1st line as follows.

export LC_ALL = en_US.UTF-8

To find out the locale used on the system printenv can be used.

$ printenv | grep -i lang|locale
LANG="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_CTYPE="UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL=

yq: No such file or directory

The following error occurs when yq is not installed.

make: yq: No such file or directory

yq must be installed on the system. yq is a portable +command-line YAML, JSON, XML, CSV, TOML and properties processor.

Notes

  • The configuration is intentionally kept quite static. Please create no PRs to make the configuration more flexible/dynamic.
  • The OSISM documentation uses hostnames, examples, addresses etc. from OSISM Testbed.
  • Even if all components (storage, network, compute, control) are operated on the same nodes, there are separate networks. +This is because in larger productive HCI environments, dedicated control nodes and network nodes are usually provided. +It is also common to place storage frontend and storage backend on an independent/additional network infrastructure.
  • The third volume (/dev/sdd) is not enabled for Ceph by default. This is to test the scaling of Ceph.
  • Ansible errors that have something to do with undefined variables (e.g. AnsibleUndefined) are most likely due to cached +facts that are no longer valid. The facts can be updated by running osism apply facts.
  • The manager is used as pull through cache for Docker images and Ubuntu packages. This reduces the amount of traffic consumed.
  • To speed up the Ansible playbooks, ARA can be disabled. This +is done by executing /opt/configuration/scripts/disable-ara.sh. Afterwards no more logs are available in the ARA web +interface.

Appendix

Supported releases

The following stable Ceph and OpenStack releases are supported.

The deployment of Ceph is based on ceph-ansible.

  • Ceph Pacific
  • Ceph Quincy (default)

The deployment of OpenStack is based on kolla-ansible.

  • OpenStack Zed
  • OpenStack 2023.1 (default)

Included services

The following services can currently be used with this testbed without further adjustments.

Infrastructure

  • Ceph
  • Fluentd
  • Gnocchi
  • Grafana
  • Haproxy
  • Influxdb
  • Keepalived
  • Keycloak
  • Kubernetes CAPI Management Cluster
  • Mariadb
  • Memcached
  • Netbox
  • Netdata
  • Opensearch
  • Openvswitch
  • Patchman
  • Prometheus exporters
  • Rabbitmq
  • Redis

OpenStack

  • Barbican
  • Ceilometer
  • Cinder
  • Designate
  • Glance
  • Heat
  • Horizon
  • Ironic
  • Keystone
  • Magnum
  • Manila
  • Neutron
  • Nova (with Libvirt/KVM)
  • Octavia
  • Senlin
  • Skyline

Makfile reference

TargetDescription
cleanDestroy infrastructure with Terraform.
createCreate required infrastructure with Terraform.
loginLog in on the manager.
bootstrapBootstrap everything.
managerDeploy only the manager service.
identityDeploy only identity services.
cephDeploy only ceph services.
deployDeploy everything and then check it.
prepareRun local preparations.

CI jobs

NameDescription
testbed-deploy
testbed-deploy-ceph
testbed-deploy-cleura
testbed-deploy-pco
testbed-deploy-stable
testbed-deploy-wavestack
testbed-update-stable
testbed-upgrade
testbed-upgrade-ceph
testbed-upgrade-cleura
testbed-upgrade-pco
testbed-upgrade-stable
testbed-upgrade-wavestack
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/deploy-guide/index.html b/docs/iaas/guides/deploy-guide/index.html new file mode 100644 index 0000000000..76c9f304a0 --- /dev/null +++ b/docs/iaas/guides/deploy-guide/index.html @@ -0,0 +1,35 @@ + + + + + +Deploy Guide | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Deploy Guide

💡 The Deploy Guide describe how to provision, bootstrap and deploy nodes and services.

A classification is made for services. For example, all infrastructure services +such as RabbitMQ or MariaDB are covered in the infrastructure section +of the services chapter.

The manager node is handled in a separate chapter because it must be handled differently when +building a new environment.

Before deploying services to nodes, they must all be bootstrapped. This is covered +in the bootstrap chapter.

The guide always assume that a node is already initially accessible via SSH and only +needs to be bootstrapped and integrated into the environment. Deploying bare-metal nodes +with an operating system is documented in the provisioning chapter.

In the examples, the pull of images (if supported by a role) is always run first. While +this is optional, it is recommended to speed up the execution of the deploy action in +the second step. This significantly reduces the times required for the restart from a +service.

Getting started

OSISM is deployed in a series of successive phases. The phases are documented in this guide.

  1. Creation of a configuration repository
  2. Preparation of a seed node
  3. Preparation of a manager node
  4. Provisioning of the bare-metal nodes
  5. Bootstrap of the bare-metal nodes
  6. Deployment of the services
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/deploy-guide/manager/index.html b/docs/iaas/guides/deploy-guide/manager/index.html new file mode 100644 index 0000000000..28dbc1868d --- /dev/null +++ b/docs/iaas/guides/deploy-guide/manager/index.html @@ -0,0 +1,50 @@ + + + + + +Manager | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Manager

Change into the configuration/environments/manager directory of the configuration repository. +on the seed node.

The deployment of the seed node is documented in the Deploy Guide for the seed node.

cd configuration/environments/manager

Create operator user

The operator user is created on each node. It is used as a service account for OSISM. All +containers run with this user. Ansible also uses this user to access the nodes. Commands +on the manager node need to be run as this user. The name of the operator user is always dragon.

With ANSIBLE_USER the existing user account is set after the provsioning of the management +node. When using the osism/node-image the user is osism +and the password of this user is password. If you install Ubuntu manually the user usually +is ubuntu. If you want to use any other user here, that's no problem. It is important that +this user has sudo rights. The password according to what you have set yourself.

ANSIBLE_BECOME_ASK_PASS=True \
ANSIBLE_ASK_VAULT_PASS=True \
ANSIBLE_ASK_PASS=True \
ANSIBLE_USER=osism \
./run.sh operator

When the ./run.sh operator is executed, the following prompts are displayed.

PromptValueComment
SSH password:Password so that the ANSIBLE_USER can loginEnabled by ANSIBLE_ASK_PASS
BECOME password[defaults to SSH password]:Password so that the ANSIBLE_USER can use sudoEnabled by ANSIBLE_BECOME_ASK_PASS
Vault password:Value of secrets/vaultpassEnabled by ANSIBLE_ASK_VAULT_PASS
  • If a password is required to login to the manager node, ANSIBLE_ASK_PASS=True must be set.

  • If an SSH key is required to login to the manager node, the key has to be added on the manager +node to ~/.ssh/authorized_keys in the home directory of the user specified as ANSIBLE_USER first.

  • If the error ERROR! Attempting to decrypt but no vault secrets found occurs, ANSIBLE_ASK_VAULT_PASS=True +has to be set.

  • If the error /bin/sh: 1: /usr/bin/python: not found occurs, Python has to be installed first on +the manager node:

    ANSIBLE_USER=osism ./run.sh python3
  • If you receive the following error message ssh: Too many authentication failures set +ANSIBLE_SSH_ARGS environment variable to use only the operator ssh key for authentication.

    export ANSIBLE_SSH_ARGS="-o IdentitiesOnly=yes"
  • The warning message [WARNING]: running playbook inside collection osism.manager can be ignored

  • If Ansible Vault is used, let Ansible ask for the Vault password:

    export ANSIBLE_ASK_VAULT_PASS=True

Details on all parameters can be found in +Ansible Configuration Settings +in the Ansible documentation.

Environment variableTypeDescription
ANSIBLE_ASK_PASSBooleanThis controls whether an Ansible playbook should prompt for a login password. If using SSH keys for authentication, you probably do not need to change this setting.
ANSIBLE_ASK_VAULT_PASSBooleanThis controls whether an Ansible playbook should prompt for a vault password.
ANSIBLE_BECOME_ASK_PASSBooleanToggle to prompt for privilege escalation password.
ANSIBLE_SSH_ARGSStringIf set, this will override the Ansible default ssh arguments.
ANSIBLE_USERStringThe user Ansible ‘logs in’ as.

To verify the creation of the operator user, use the private key file id_rsa.operator. Make +sure you purge all keys from ssh-agent identity cache using ssh-add -D. You can print the list +using ssh-add -l. The list should be empty.

ssh-add -D
ssh -o IdentitiesOnly=yes -i id_rsa.operator dragon@testbed-manager

Apply the network configuration

Most of the parameters required for Ansible (ANSIBLE_BECOME_ASK_PASS, ANSIBLE_ASK_PASS, ANSIBLE_USER, ...) +in the previous step are no longer necessary. If Ansible Vault is used, however, ANSIBLE_ASK_VAULT_PASS +must still be set.

export ANSIBLE_ASK_VAULT_PASS=True

To prevent recurring installation of Ansible Collections, export INSTALL_ANSIBLE_ROLES=False can be set.

The network configuration, already present on a node should be backuped before this step. +Then you can deploy the network configuration with the network role.

./run.sh network

Upon completion of the network configurtion, a node reboot should be performed to ensure the configuration +is functional and reboot safe. Since network services are not restarted automatically, later changes to the +network configuration are not effective without a manual apply of the network configuration or reboot of the +nodes.

Bootstrap

Most of the parameters required for Ansible (ANSIBLE_BECOME_ASK_PASS, ANSIBLE_ASK_PASS, ANSIBLE_USER, ...) +in the previous step are no longer necessary.

If Ansible Vault is used, however, export ANSIBLE_ASK_VAULT_PASS=True must still be set.

To prevent recurring installation of Ansible Collections, export INSTALL_ANSIBLE_ROLES=False can be set. +This is recommended.

  1. Bootstrap the manager node.

    ./run.sh bootstrap
  2. Reboot the manager node.

    ./run.sh reboot

Deploy

  1. Transfer the configuration repository.

    ./run.sh configuration
  2. Deploy the Traefik service. This is optional and only necessary if the Traefik service is to be used.

    ./run.sh traefik
  3. Deploy the Netbox service. This is optional and only necessary if the Netbox service is to be used.

    ./run.sh netbox
  4. Deploy the manager service.

    ./run.sh manager

Finally, the Ansible Vault password is made known on the manager node.

osism set vault password
Ansible Vault password: ********

Ready. The manager is now prepared and you can continue with the bootstrap of the other nodes. +The seed node used until here is no longer necessary.

+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/deploy-guide/provisioning/index.html b/docs/iaas/guides/deploy-guide/provisioning/index.html new file mode 100644 index 0000000000..66b24a1954 --- /dev/null +++ b/docs/iaas/guides/deploy-guide/provisioning/index.html @@ -0,0 +1,43 @@ + + + + + +Provisioning of management and control plane nodes | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Provisioning of management and control plane nodes

For the initial deployment of the management plane and the control plane of OSISM, +the nodes must be pre-provisioned with Ubuntu 22.04. Currently, only Ubuntu 22.04 is supported +by OSISM.

Data plane nodes can be automatically provisioned after the initial deployment and +do not need to be pre-provisioned.

It is recommended not to install the initial nodes of the management plane and the +control plane manually. An ISO image is provided for this purpose which automatically +provisions a node. The ISO images are available for download in the +osism/node-image repository.

There are different variants of the ISO image. The variants differ in the disc layout. +The available variants are described in the README file of the osism/node-image +repository.

Manual provisioning

If none of the provided variants is suitable, this section describes the manual +installation with the help of the Ubuntu 22.04 live ISO image. The manual installation +is possible without network connectivity.

  • Download the latest ISO image for Ubuntu 22.04 from releases.ubuntu.com.
    • Use the ubuntu-22.04.1-live-server-amd64.iso image.
    • The version number may be different, always use the latest available version of 22.04 LTS.
  • Choose English as language.
  • Choose Install Ubuntu Server.
  • Choose English as language (again).
  • Choose your location (e.g. Germany).
  • Choose en_US.UTF-8 as locale.
  • Choose the keyboard layout from a list, use English (US).
  • Choose and configure the primary network interface.
    • Depending on the environment, the network may not work at this point. Then select any interface +and then select Do not configure the network at this time in the next step.
  • Set the hostname.
    • The hostname is e.g. node and not a FQDN like node.systems.osism.xyz.
  • Set osism as full name for the new user.
  • Set osism as the username for the account.
    • The later used operator user dragon is created during the bootstrap and should not be created during the installation
    • The account is only needed initially and can be deleted after completion of the bootstrap.
  • Set a password for the account.
  • Choose Manual as partitioning method and execute the partitioning according to company specifications
    • The use of a UEFI is recommended
    • The use of a RAID is recommended. We prefer the use of software RAIDs to make us less dependent on hardware. +But there is nothing against using hardware RAIDs.
    • The use of a LVM2 is recommended. system is recommended as the name for the volume group.
    • Dedicated disks may be provided for /var/lib/docker on the controller nodes. In this case, do not +use an LV for /var/lib/docker but the devices provided for it.
    • Do not configure devices that are not required for the operating system.
    • The use of own file systems for the following mountpoints is recommended. The size of the individual partitions +is minimal. Depending on the node type, the individual partitions should be made larger. This applies in +particular to /var/lib/docker. On controllers at least 100 GByte should be used.
      • / (10 GByte, logical volume root)
      • /home (2 GByte, logical volume home)
      • /tmp (5 GByte, logical volume tmp)
      • /var/lib/ceph (50 GByte, logical volume ceph) (optional for storage nodes)
      • /var/lib/docker (30 GByte, logical volume docker, do not set the nosuid flag on /var/lib/docker)
        • When using XFS as the file system for /var/lib/docker, note the following: Running on XFS without d_type support +causes Docker to skip the attempt to use the overlay or overlay2 driver.
      • /var/log/audit (1 GByte, logical volume audit)
      • /var (10 GByte, logical volume var)
      • swap (min 8 GByte, logical volume swap)
  • Choose No automatic updates.
  • Choose OpenSSH server as software to install.
    • Do not install any other software component. Everything you need will be installed later by OSISM. +In particular, it is not necessary to install a desktop environment.
  • After completion, restart the system.
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/deploy-guide/seed/index.html b/docs/iaas/guides/deploy-guide/seed/index.html new file mode 100644 index 0000000000..96024a42db --- /dev/null +++ b/docs/iaas/guides/deploy-guide/seed/index.html @@ -0,0 +1,41 @@ + + + + + +Seed | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Seed

The seed node is used once for the initial bootstrap of the manager node. It is sufficient +to use the local workstation. It doesn't have to be a dedicated system. The seed node is +no longer needed in the further process. The seed node must be able to reach the manager +node via SSH.

The use of Linux on the seed node is recommended. Other operating systems should also +work without problems.

Install required packages

sudo apt-get install git python3-pip python3-virtualenv sshpass

Get a copy of the configuration repository

Each environment managed with OSISM is based on a configuration repository. This was +previously created with Cookiecutter and the osism/cfg-cookiecutter +repository.

The creation of the configuration repository is covered in chapter +Creation of a configuration repository +of the Configuration Guide.

A configuration repository is stored on a Git server (e.g. GitHub, Gitlab, ...). The +configuration repository is individual for each environment and is therefore not provided +by us.

The configuration repository to be used must be available on the seed node. In the following +example, replace YOUR_ORG and YOUR_NEW_CONFIGURATION_REPOSITORY accordingly.

git clone ssh://git@github.com:YOUR_ORG/YOUR_NEW_CONFIGURATION_REPOSITORY.git

Examples:

  • The repository is located in the regiocloud organisation on GitHub, has the name +configuration and can be accessed via SSH: ssh://git@github.com:regiocloud/configuration.git
  • The repository is located in the regiocloud organisation on Gitlab, has the name configuration +and can be accessed via SSH: ssh://git@gitlab.com:regiocloud/configuration.git
  • The repository is located in the regiocloud organisation on an internal Gitlab, has the name +configuration and can be accessed via SSH: ssh://git@git.services.osism.tech:regiocloud/configuration.git

If necessary, the configuration SSH key can be used for the initial transfer of the repository.

For this, the following content is added in ~/.ssh/config and the SSH privte key is stored in +~/.ssh/id_rsa.configuration.

Host github.com
HostName github.com
User git
Port 22
IdentityFile ~/.ssh/id_rsa.configuration
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/deploy-guide/services/ceph/index.html b/docs/iaas/guides/deploy-guide/services/ceph/index.html new file mode 100644 index 0000000000..cb1b0c4ce8 --- /dev/null +++ b/docs/iaas/guides/deploy-guide/services/ceph/index.html @@ -0,0 +1,32 @@ + + + + + +Ceph | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Ceph

  1. Deploy base services.

    osism apply ceph-mons
    osism apply ceph-mgrs
    osism apply ceph-osds
    osism apply ceph-crash

    It's all done here step by step. It is also possible to do this in a single step:

    osism apply ceph-base
  2. Get ceph keys. This places the necessary keys in /opt/configuration.

    osism apply copy-ceph-keys

    After run, these keys must be permanently added to the configuration repository +via Git.

    environments/infrastructure/files/ceph/ceph.client.admin.keyring
    environments/kolla/files/overlays/gnocchi/ceph.client.gnocchi.keyring
    environments/kolla/files/overlays/nova/ceph.client.cinder.keyring
    environments/kolla/files/overlays/nova/ceph.client.nova.keyring
    environments/kolla/files/overlays/cinder/cinder-backup/ceph.client.cinder.keyring
    environments/kolla/files/overlays/cinder/cinder-backup/ceph.client.cinder-backup.keyring
    environments/kolla/files/overlays/cinder/cinder-volume/ceph.client.cinder.keyring
    environments/kolla/files/overlays/manila/ceph.client.manila.keyring
    environments/kolla/files/overlays/glance/ceph.client.glance.keyring

    If the osism apply copy-ceph-keys fails and the keys are not found in the /share +directory, this can be solved with osism apply ceph-fetch-keys.

  3. After the Ceph keys have been persisted in the configuration repository, the Ceph +client can be deployed.

    osism apply cephclient

RGW service

Deployment of the Ceph RGW Service is optional. How the Ceph RGW service can be deployed +and integrated into OpenStack is described here.

info

If an initial deployment is performed and Ceph RGW is not added to an existing deployment, +steps 4 and 5 are not required. Step 3 is then performed later after the OpenStack +Keystone service has been deployed.

  1. Configure the RGW service

  2. Apply role ceph-rgws to deploy the Ceph RGW services.

    osism apply ceph-rgws
  3. Apply role kolla-ceph-rgw to add the OpenStack endpoint.

    osism apply kolla-ceph-rgw
  4. Apply role loadbalancer to add the HAProxy backend and frontend.

    osism apply loadbalancer
  5. Apply role horizon to enable the Swift dashboard.

    osism apply horizon
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/deploy-guide/services/index.html b/docs/iaas/guides/deploy-guide/services/index.html new file mode 100644 index 0000000000..71734d13b6 --- /dev/null +++ b/docs/iaas/guides/deploy-guide/services/index.html @@ -0,0 +1,26 @@ + + + + + +Services | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/iaas/guides/deploy-guide/services/infrastructure/index.html b/docs/iaas/guides/deploy-guide/services/infrastructure/index.html new file mode 100644 index 0000000000..5932563f54 --- /dev/null +++ b/docs/iaas/guides/deploy-guide/services/infrastructure/index.html @@ -0,0 +1,30 @@ + + + + + +Infrastructure | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Infrastructure

Common issues with deploying infrastructure services required by OpenStack +are documented in the OpenStack Troubleshooting Guide.

Cron, Fluentd & Kolla Toolbox

The common role of Kolla is used to manage the services cron, fluentd +and kolla-toolbox.

It is important to do this deployment before any other deployements in the Kolla +environment, as parts of the other deployments depend on the kolla-toolbox +service.

osism apply -a pull common
osism apply common

Loadbalancer

osism apply -a pull loadbalancer
osism apply loadbalancer

Redis

osism apply -a pull redis
osism apply redis

Memcached

osism apply -a pull memcached
osism apply memcached

RabbitMQ

osism apply -a pull rabbitmq
osism apply rabbitmq

MariaDB

osism apply -a pull mariadb
osism apply mariadb
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/deploy-guide/services/logging-monitoring/index.html b/docs/iaas/guides/deploy-guide/services/logging-monitoring/index.html new file mode 100644 index 0000000000..b0598e7529 --- /dev/null +++ b/docs/iaas/guides/deploy-guide/services/logging-monitoring/index.html @@ -0,0 +1,27 @@ + + + + + +Logging & Monitoring | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Logging & Monitoring

Common issues with deploying logging & monitoring services provided by Kolla +are documented in the OpenStack Troubleshooting Guide.

OpenSearch

OpenSearch dashboards is also deployed with the opensearch role.

osism apply -a pull opensearch
osism apply opensearch

Prometheus

osism apply -a pull prometheus
osism apply prometheus

Grafana

osism apply -a pull grafana
osism apply grafana
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/deploy-guide/services/network/index.html b/docs/iaas/guides/deploy-guide/services/network/index.html new file mode 100644 index 0000000000..9159ed0307 --- /dev/null +++ b/docs/iaas/guides/deploy-guide/services/network/index.html @@ -0,0 +1,28 @@ + + + + + +Network | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Network

Open vSwitch

osism apply -a pull openvswitch
osism apply openvswitch

OVN (if used)

In environments/kolla/configuration.yml the parameter neutron_plugin_agent is set to +ovn if OVN is used as a network plugin. Otherwise the network plugin is set to openvswitch.

environments/kolla/configuration.yml
# neutron
neutron_plugin_agent: "ovn"
neutron_ovn_availability_zones: [ nova ]

The deployment of the Open vSwitch service is non-optional. +Before the deployment of OVN, the deployment of Open vSwitch must already have been done.

osism apply -a pull ovn
osism apply ovn
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/deploy-guide/services/openstack/index.html b/docs/iaas/guides/deploy-guide/services/openstack/index.html new file mode 100644 index 0000000000..d46d3c7357 --- /dev/null +++ b/docs/iaas/guides/deploy-guide/services/openstack/index.html @@ -0,0 +1,27 @@ + + + + + +OpenStack | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

OpenStack

Common issues with deploying OpenStack services are documented in the +OpenStack Troubleshooting Guide.

OpenStack client

osism apply openstackclient

Keystone

osism apply -a pull keystone
osism apply keystone

Glance

osism apply -a pull glance
osism apply glance

Designate

osism apply -a pull designate
osism apply designate

Placement

osism apply -a pull placement
osism apply placement

Cinder

osism apply -a pull cinder
osism apply cinder

Neutron

osism apply -a pull neutron
osism apply neutron

Nova

osism apply -a pull nova
osism apply nova

Octavia

osism apply -a pull octavia
osism apply octavia

Horizon

osism apply -a pull horizon
osism apply horizon
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/index.html b/docs/iaas/guides/index.html new file mode 100644 index 0000000000..cc61eb4bab --- /dev/null +++ b/docs/iaas/guides/index.html @@ -0,0 +1,26 @@ + + + + + +Guides | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/iaas/guides/operations-guide/ceph/index.html b/docs/iaas/guides/operations-guide/ceph/index.html new file mode 100644 index 0000000000..d4713e411c --- /dev/null +++ b/docs/iaas/guides/operations-guide/ceph/index.html @@ -0,0 +1,91 @@ + + + + + +Ceph operations cheatsheet | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Ceph operations cheatsheet

Where to find docs

The official Ceph documentation is located on https://docs.ceph.com/en/latest

It is strongly advised to use the documentation for the version being used.

ceph-ansible documentation is located on https://docs.ceph.com/projects/ceph-ansible/en/latest/

note

Do not take information in the documentation at face value. +Especially when it comes to advanced/rarely used/very new features it is strongly advised +to test any claims made in the documentation about any particular feature.

Never assume that things will work as written without actually testing it on a test setup +as close to your real workload scenario as possible.

Advice on Ceph releases

The current Ceph releases and their support status can be found on https://docs.ceph.com/en/latest/releases/

When a new Ceph stable version is released you are strongly advised +to not roll it out on any production cluster whatsoever. +Even though its listed as "stable" it doesn't mean that this is actually true. +Especially avoid using .0 releases on anything remotely production +unless you really, really now what you're doing and can live with a possible catastrophic failure.

Be very conservative about what version you run on production systems.

Shiny new features aren't worth the risk of total or partial data loss/corruption.

General maintenance

60 seconds cluster overview

The following commands can be used to quickly check the status of Ceph:

$ ceph -s # Print overall cluster status
$ ceph health detail # Print detailed health information
$ ceph osd tree # Display current OSD tree
$ ceph df # Cluster storage usage by pool and storage class
$ ceph osd pool ls detail # List pools with detailed configuration
$ ceph osd df {plain|tree} {class e.g. hdd|ssd} # Get usage stats for OSDs
$ ceph -w # Watch Ceph health messages sequentially
$ ceph versions # List daemon versions running in the cluster

Also you can run the following on each node running ceph-daemons, +to provide further debug information about the environment:

# lscpu
# cat /proc/cpuinfo # if lscpu isn't available
# free -g
# ip l
# ethtool <device> # for each network adapter

Mute/Unmute a health warning

$ ceph health mute <what> <duration>
$ ceph health unmute <what>

Disable/Enable (deep-)scrubbing

$ ceph osd set noscrub
$ ceph osd set nodeep-scrub
$ ceph osd unset noscrub
$ ceph osd unset nodeep-scrub
danger

Use this sparingly only in emergency situations. +Setting these flags will cause a HEALTH_WARN status, +increase risk of data corruption and also the risk of generating +a HEALTH_WARN due to PGs not being (deep-)scrubbed in time.

Reboot a single node

The traditional way of doing this is by setting the noout flag, +do the appropriate maintenance work and after the node is back online +unset the flag like so:

ceph osd set noout

After maintenance is done and host is back up:

ceph osd unset noout

On versions Luminous or above you can set the flag individually for single +OSDs or entire CRUSH buckets, which can be a safer option in case of prolonged +maintenance periods.

Add noout for a OSD:

ceph osd add-noout osd.<ID>

Remove noout for a OSD:

ceph osd rm-noout osd.<ID>

Add noout for CRUSH bucket (e.g. host name as seen in ceph osd tree):

ceph osd set-group noout <crush-bucket-name>

Remove noout for CRUSH bucket:

ceph osd unset-group noout <crush-bucket-name>

Gathering information about block devices

Enumerate typical storage devices and LVM

# lsblk
# lsblk -S
# lsscsi
# nvme list
# pvs
# vgs
# lvs

SMART data for SATA/SAS and NVME devices

# smartctl -a /dev/sdX
# nvme smart-log /dev/nvmeXnY

Check format of a NVME device

# nvme id-ns -H /dev/nvmeXnY
note

Check the last lines named "LBA Format". +It will show which formats are supported, +which format is in use and which format offers the best performance +according to the vendor.

Format a NVME device to a different LBA format using nvme-cli

danger

This will destroy all data on the device!

# nvme format --lbaf=<id> /dev/nvmeXnY

Secure Erase a NVME drive using nvme-cli

danger

This will destroy all data on the device!

# nvme format -s2 /dev/nvmeXnY
# blkdiscard /dev/nvmeXnY
# nvme format -s1 /dev/nvmeXnY

Secure Erase a SATA/SAS drive using hdparm

danger

This will destroy all data on the device!

  1. Gather device info:

    # hdparm -I /dev/sdX

    Check that the output says "not frozen" and "not locked", +also it should list support for enhanced erase and list time estimates +for SECURITY ERASE UNIT and/or ENHANCED SECURITY ERASE UNIT

  2. Set a master password for the disk (required, will be automatically removed after wipe)

    # hdparm --user-master wipeit --security-set-pass wipeit /dev/sdX
    # hdparm -I /dev/sdX

    Check that "Security level" is now "high" and master password is now +"enabled" instead of "not enabled" before

  3. Wipe the device

    If device supports enhanced security erase (better), use the following:

    # hdparm --user-master wipeit --security-erase-enhanced wipeit /dev/sdX

    If not, use standard security erase:

    # hdparm --user-master wipeit --security-erase wipeit /dev/sdX
note

On some systems the system firmware might "freeze" the device, +which makes it impossible to issue a secure erase or reformat the device. +In that case it might be necessary to either "unfreeze" the drive or +to install the drive in another system where it can be unfrozen. +Also make sure that the device is actually wiped. Its recommended to +at least perform a blanking pass on HDDs with a tool like nwipe.

OSD maintenance tasks

Locate a specific OSD in the cluster

$ ceph osd find osd.<ID>

Get OSD metadata (global and single OSD)

$ ceph osd metadata
$ ceph osd metadata osd.<ID>
note
  Interesting fields:
osd_objectstore, rotational, hostname, devices, device_ids, device_paths,
bluefs_db_rotational, bluefs_wal_rotational,
bluefs_dedicated_db, bluefs_dedicated_wal,
bluestore_bdev_rotational

Add a new OSD using ceph-ansible

Remove a OSD using ceph-ansible

Replace a defect OSD

Remove a single OSD node

Remove an OSD (removing it completely, not reprovisioning it again) without double rebalance

$ ceph osd crush reweight osd.<ID> 0.0
... Wait for rebalance to complete, then mark it OUT:
$ ceph osd out osd.<ID>
# systemctl stop ceph-osd@<ID>
# systemctl disable ceph-osd@<ID>
$ ceph osd purge osd.<ID> --yes-i-really-mean-it

Remove an OSD (temporarily e.g. when replacing a broken disk)

$ ceph osd out osd.<ID>
# systemctl stop ceph-osd@<ID>
# systemctl disable ceph-osd@<ID>

Disable backfills/recovery completely

danger

Use only in emergency situations!

$ ceph osd set nobackfill
$ ceph osd set norecovery
$ ceph osd set norebalance

Unset the flags with ceph osd unset <flag>.

Rebalance OSDs

Placement Group maintenance

Dump placement groups

Usually only useful when parsing it, so here are two ways to get the data:

$ ceph pg dump
$ ceph pg dump --format=json-pretty

Query a PG about its status

$ ceph pg <pgid> query

Start (deep-)scrubbing of a placement group

$ ceph pg scrub <pgid>
$ ceph pg deep-scrub <pgid>
note

Instructing a PG to (deep-)scrub does not mean that it will do so immediately, +it can take some time for the scrub to start.

HEALTH_WARN - Large omap objects found...

Finding PGs which have large OMAP objects:

# ceph pg dump --format=json | jq '.pg_map.pg_stats[] |
select(.stat_sum.num_large_omap_objects != 0) |
(.pgid, .stat_sum.num_large_omap_objects, .up, .acting)'

(Remove the line breaks between the single quotes or jq might act weird!)

This will dump all PG IDs with large OMAP objects and their up/acting OSDs. +You then can grep the logs of these OSDs for "Large omap object" +to find the actual objects causing the health warning.

Also the PG ID before the dot is equal to the pool ID it belongs to.

In case the logs have been rotated, instruct those OSDs to do a deep-scrub +and watch the logs for the message to appear.

From there you can investigate the issue further, +mostly it'll be due to the index of a RGW bucket getting too big due to too many objects, +thus resharding that bucket's index will be necessary.

Instruct a PG to repair in case of scrub errors (inconsistent PG)

$ ceph pg repair <pgid>
note

Recovery might not start immediately and might take some time. +You can query the status of the recovery through ceph pg <pgid> query. +Be sure to read the Ceph manual about this topic thoroughly:

https://docs.ceph.com/en/latest/rados/operations/pg-repair/

RADOS Pool maintenance

note

Read the RADOS pool operations documentation in detail before playing around with pools. +Especially when considering making changes to the CRUSH map. +Wrong decisions there can lead to data loss or other catastrophic failures.

https://docs.ceph.com/en/latest/rados/operations/pools/

Get pools and their configuration

$ ceph osd pool ls detail

Dump all CRUSH rules

$ ceph osd crush rule dump

Get autoscaler status

$ ceph osd pool autoscale-status

Create a replicated pool

$ ceph osd pool create <pool_name> <pg_num> <pgp_num> replicated [<crush_rule_name>]

Enabling an application on a pool

Required, otherwise a health warning will be raised after some time.

$ ceph osd pool application enable <pool_name> <application_name> # Syntax
$ ceph osd pool application enable cinder rbd # Example

Typical application names are: rbd, rgw, cephfs

Delete a pool

danger

This will delete all data in that pool. There is no undo/undelete.

$ ceph osd pool delete <pool_name> <pool_name> --yes-i-really-really-mean-it
note

In order to be able to delete pools, it has to be enabled on the monitors +by setting the mon_allow_pool_delete flag to true. Default is false.

See: https://docs.ceph.com/en/latest/rados/configuration/mon-config-ref

Set number of PGs for a pool

$ ceph osd pool set <poolname> pg_num <num_pgs>
note

Num PGs must be a power of two! Be careful about changing number of PGs. +Changing pg_num to a new value will gradually increase pgp_num on newer versions of Ceph.

In older versions one also has to set pgp_num manually, either in increments or in one big leap.

Create CRUSH rules for different storage classes

$ ceph osd crush rule create-replicated replicated_hdd default host hdd
$ ceph osd crush rule create-replicated replicated_ssd default host ssd
$ ceph osd crush rule create-replicated replicated_nvme default host nvme

Change CRUSH rule for a pool ("move pool")

$ ceph osd pool set <poolname> crush_rule <rule_name>

This can be used to move a pool from e.g. HDD to SSD or NVME class +or anything else that the new CRUSH rule specifies.

Advanced topics

Configure and create LVM devices for ceph-ansible using OSISM

For more advanced OSD layout requirements leave out the devices key +and instead use lvm_volumes.

Details for this can be found on the official ceph-ansible OSD Scenario documentation.

In order to aid in creating the lvm_volumes config entries and provision the LVM devices for them, +OSISM has the two playbooks configure-lvm-devices and create-lvm-devices available.

Their usage is as follows:

  1. For each Ceph storage node edit the file inventory/host_vars/<nodename>.yml +add a configuration like the following to it:

    ceph_osd_db_wal_devices_buffer_space_percent: 10
    # optional percentage of VGs to leave free,
    # defaults to false
    # Can be helpful for SSD performance of some older SSD models
    # or to extend lifetime of SSDs in general

    ceph_db_devices:
    nvme0n1: # required, PV for a DB VG
    # Will be prefixed by /dev/ and can also be specified
    # like "by-path/foo" or other things under /dev/
    num_osds: 6 # required, number of OSDs that shall be
    # maximum deployed to this device
    db_size: 30 GB # optional, if not set, defaults to
    # (VG size - buffer space (if enabled)) / num_osds
    ceph_wal_devices:
    nvme1n1: # See above, PV for a WAL VG
    num_osds: 6 # See above
    wal_size: 2 GB # optional, if not set, defaults to 2 GiB

    ceph_db_wal_devices:
    nvme2n1: # See above, PV for combined WAL+DB VG
    num_osds: 3 # See above
    db_size: 30 GB # See above, except that it also considers
    # total WAL size when calculating LV sizes
    wal_size: 2 GB # See above

    ceph_osd_devices:
    sda: # Device name, will be prefixed by /dev/, see above conventions
    # This would create a "block only" OSD without DB/WAL
    # In reality, to ensure each device is uniquely identifiable,
    # you should use WWN or EUI-64
    # (in that case the entry here would be something like
    # disk/by-id/wwn-<something> or disk/by-id/nvme-eui.<something>)
    sdb: # Create an OSD with dedicated DB
    db_pv: nvme0n1 # Must be one device configured in ceph_db_devices
    # or ceph_db_wal_devices
    sdc: # Create an OSD with dedicated WAL
    wal_pv: nvme1n1 # Must be one device configured in ceph_wal_devices
    # or ceph_db_wal_devices
    sdb: # Create an OSD with dedicated DB/WAL residing on different devices
    db_pv: nvme0n1 # See above
    wal_pv: nvme1n1 # See above
    sdc: # Create an OSD with dedicated DB/WAL residing on the same VG/PV
    db_pv: nvme2n1 # Must be one device configured in ceph_db_wal_devices
    wal_pv: nvme2n1 # Must be the same device configured in ceph_db_wal_devices
  2. Push the configuration to your configuration repository and after that do the following

    $ osism apply configuration
    $ osism apply facts
  3. After the configuration has been pulled and facts updated, +you can run the LVM configuration playbook:

    $ osism apply ceph-configure-lvm-volumes [-l INVENTORY HOST PATTERN]

    This will generate a new configuration file for each node in /tmp +on the first manager node named <nodename>-ceph-lvm-configuration.yml.

  4. Take the generated configuration file from /tmp and replace the previously generated configuration for each node.

  5. Push the updated configuration again to your configuration repository and re-run:

    $ osism apply configuration
    $ osism apply facts
  6. Finally you can let OSISM create the LVM devices for you, because +ceph-ansible will not do that. To do that you simply run:

    $ osism apply ceph-create-lvm-devices [-l INVENTORY HOST PATTERN]
  7. Deploy OSDs with ceph-ansible

    When everything has finished and is ready to be deployed, +you can run:

    $ osism apply ceph-osds [-l INVENTORY HOST PATTERN]

    This should then have ceph-ansible create new OSDs on the node.

Validating Ceph using OSISM playbooks

For Ceph, special playbooks were added to validate the deployment status of +the OSD, MON and MGR services. The commands for use are osism validate ceph-osds, +osism validate ceph-mons, and osism validate ceph-mgrs.

These playbooks will validate that the deployed Ceph environment matches +the configuration and is overall in a healthy state. The playbooks will +generate report files in JSON format on the first manager node in /opt/reports/validator.

Shutdown a Ceph cluster

In order to fully shutdown a Ceph cluster safely, you first do the following steps:

danger

Take GOOD NOTES of the unit names and OSD IDs running on each node. +You will need them to restart the cluster later.

  1. Stop the workload that is using the cluster

    This will vary depending on your environment and is not covered here.

  2. Pause/Stop operations on the cluster by setting flags

    $ ceph osd set noout
    $ ceph osd set nobackfill
    $ ceph osd set norecover
    $ ceph osd set norebalance
    $ ceph osd set nodown
    $ ceph osd set pause
  3. Stop and disable the radosgw services on all nodes (on each rgw node) (if RGW is used)

    Get the name of the unit (globs not supported for disable) and +make a note of the unit name for that node:

    # systemctl | grep ceph-radosgw

    Then disable and stop the unit:

    # systemctl disable --now ceph-radosgw@<name>.service
  4. Stop all CephFS file systems (if CephFS is used)

    List all Ceph file systems

    $ ceph fs ls

    For each CephFS do:

    $ ceph fs <file system name> down true
  5. After that disable and stop all ceph-mds services on all nodes (do this on each node)

    Get the name of the unit (globs not supported for disable) and +make a note of the unit name for that node:

    # systemctl | grep ceph-mds
    # systemctl disable --now ceph-mds@<unit>.service
  6. Stop and disable the ceph-mgr services on all nodes (do this on each node)

    Get the name of the unit (globs not supported for disable) and +make a note of the unit name for that node:

    # systemctl | grep ceph-mgr
    # systemctl disable --now ceph-mgr@<unit>.service
  7. Stop and disable the ceph-osd services on all nodes (do this on each node)

    Get the names of the units (globs not supported for disable) and +make a note of the unit names for that node (best to save it to a file):

    # systemctl | grep ceph-osd

    For each OSD unit execute:

    # systemctl disable ceph-osd@<osd-id>.service

    Stop all OSDs at once:

    # systemctl stop ceph-osd\*.service
  8. Finally stop the ceph-mon services on all nodes (do this on each node)

    Get the name of the unit (globs not supported for disable) and +make a note of the unit name for that node:

    # systemctl | grep ceph-mon
    # systemctl disable --now ceph-mon@<unit>.service

Restart a Ceph cluster after manual shutdown

danger

You will need the notes taken during shutdown of the unit names. +It can be done without, but then it'll be way more work finding out the names.

In order to restart a Ceph cluster after performing a manual shutdown like described +in the section above, you do the following:

  1. Enable & start the ceph-mon services on all nodes (do this on each node)

    # systemctl enable --now ceph-mon@<unit-name>.service
  2. Enable & start the ceph-osd services on all nodes (do this on each node)

    For each Ceph OSD on that node do:

    # systemctl enable --now ceph-osd@<osd-id>.service

    Depending on the number of OSDs on that node it can take a while.

  3. Enable & start the ceph-mgr services on all nodes (do this on each node)

    # systemctl enable --now ceph-mgr@<unit-name>.service
  4. Check the status of your cluster and wait for all OSDs to come online

    You can watch the status periodically by running:

    $ watch ceph -s

    You should wait until all OSDs are up + in again, before removing flags.

  5. Remove flags to unpause operations

    $ ceph osd unset pause
    $ ceph osd unset nodown
    $ ceph osd unset noout
    $ ceph osd unset nobackfill
    $ ceph osd unset norecover
    $ ceph osd unset norebalance
  6. Wait for cluster to resume operations

    See step #4 of this SOP. +Now you wait until the cluster seems "happy enough" to accept clients. +(i.e. rebalancing finished etc.) +Maybe it will complain about MDS being down, but that's normal for now.

  7. Enable & start the ceph-mds services on each node (if CephFS is used)

    # systemctl enable --now ceph-mds@<unit>.service
  8. Start CephFS file systems again

    List all Ceph file systems

    $ ceph fs ls

    For each CephFS do:

    $ ceph fs <file system name> down false
  9. Enable & start the radosgw services on each node (if RGW is used)

    # systemctl enable --now ceph-radosgw@<name>.service

Where and how to get further help

Join the #ceph IRC channel on irc.oftc.net, state the problem with as many details as possible +including information about what steps have already been taken to solve the problem +also provide information from the command output from the "60 seconds cluster overview" above +through a pastebin or a similar service. In order for people to be able +to help, details and some patience are important.

+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/operations-guide/index.html b/docs/iaas/guides/operations-guide/index.html new file mode 100644 index 0000000000..8fbe7d0989 --- /dev/null +++ b/docs/iaas/guides/operations-guide/index.html @@ -0,0 +1,28 @@ + + + + + +Operations Guide | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Operations Guide

Node states

note

This feature is currently under development and it is only usable with latest.

A node can be in different states. Depending on the state, different actions +are possible or are triggered.

The individual states of a node can be retrieved via Ansible Facts and local +files on the node itself.

Maintenance

osism set maintenance NODE
osism noset maintenance NODE
  • Ansible fact: ansible_local.osism.maintenance
  • State file: /etc/osism/maintenance

Bootstrap

osism set bootstrap NODE
osism noset bootstrap NODE
  • Ansible fact: ansible_local.osism.bootstrap
  • State file: /etc/osism/bootstrap
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/operations-guide/manager/apply/index.html b/docs/iaas/guides/operations-guide/manager/apply/index.html new file mode 100644 index 0000000000..e05c74dccf --- /dev/null +++ b/docs/iaas/guides/operations-guide/manager/apply/index.html @@ -0,0 +1,26 @@ + + + + + +Apply | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Apply

List all available plays

$ osism apply
2023-09-30 10:09:25 | INFO | No role given for execution. The roles listed in the table can be used.
+------------------------------------------------------------------+----------------+
| Role | Environment |
|------------------------------------------------------------------+----------------|
| aodh | kolla |
| barbican | kolla |
| bifrost | kolla |
| bifrost-keypair | kolla |
| ceilometer | kolla |
| certificates | generic |
| cinder | kolla |
| cloudkitty | kolla |
| collectd | kolla |
| common | kolla |
| designate | kolla |
| elasticsearch | kolla |
| etcd | kolla |
| glance | kolla |
| gnocchi | kolla |
| grafana | kolla |
| heat | kolla |
| horizon | kolla |
| ironic | kolla |
| iscsi | kolla |
...
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/operations-guide/manager/console/index.html b/docs/iaas/guides/operations-guide/manager/console/index.html new file mode 100644 index 0000000000..98b03e9de5 --- /dev/null +++ b/docs/iaas/guides/operations-guide/manager/console/index.html @@ -0,0 +1,27 @@ + + + + + +Console | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Console

A console command is available in the OSISM CLI. This allows specific parts of the +environment to be operated interactively.

Ansible

Used tool: ansible-console

$ osism console --type ansible testbed-node-0
Welcome to the ansible console. Type help or ? to list commands.

dragon@testbed-node-0 (1)[f:5]$ !uptime
testbed-node-0 | CHANGED | rc=0 >>
18:14:15 up 80 days, 33 min, 0 users, load average: 4.00, 3.07, 2.67
dragon@testbed-node-0 (1)[f:5]$

Shortcut: osism console .testbed-node-0

Clush

Used tool: ClusterShell

The same groups as defined in the Ansible Inventory can be used.

$ osism console --type clush control
Enter 'quit' to leave this interactive mode
Working with nodes: testbed-node-[0-2]
clush>

Shortcut: osism console :control

Container

Used tool: Python Prompt Toolkit

$ osism console --type container testbed-node-0/fluentd
(fluentd)[td-agent@testbed-node-0 /]$ ps ax
PID TTY STAT TIME COMMAND
1 ? Ss 0:00 dumb-init --single-child -- kolla_start
7 ? Sl 24:28 /opt/td-agent/bin/ruby /usr/sbin/td-agent -o /var/log/kolla/fluentd/fluent
25 ? Sl 3519:55 /opt/td-agent/bin/ruby -Eascii-8bit:ascii-8bit /usr/sbin/td-agent -o /var
238 pts/0 Ss 0:00 bash
247 pts/0 R+ 0:00 ps ax

Shortcut: osism console testbed-node-0/fluentd

SSH

Used tool: OpenSSH

$ osism console --type ssh testbed-node-0
You have new mail.
Last login: Wed Sep 27 18:15:39 2023 from 192.168.16.5
dragon@testbed-node-0:~$ uptime
18:16:25 up 80 days, 35 min, 1 user, load average: 2.85, 3.04, 2.71

Shortcut: osism console testbed-node-0

+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/operations-guide/manager/index.html b/docs/iaas/guides/operations-guide/manager/index.html new file mode 100644 index 0000000000..fba3311370 --- /dev/null +++ b/docs/iaas/guides/operations-guide/manager/index.html @@ -0,0 +1,26 @@ + + + + + +Manager | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/iaas/guides/operations-guide/manager/log/index.html b/docs/iaas/guides/operations-guide/manager/log/index.html new file mode 100644 index 0000000000..6509160a0a --- /dev/null +++ b/docs/iaas/guides/operations-guide/manager/log/index.html @@ -0,0 +1,28 @@ + + + + + +Logging | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Logging

Ansible

Files

Each Ansible service has its own local Ansible log file. These log files are not persistent. The ARA service is +used for the persistence of Ansible logs. The log files can be used to view currently running Ansible Plays, +for example if they are running as a background task.

$ docker exec -it osism-ansible tail -f /ansible/logs/ansible.log
$ docker exec -it ceph-ansible tail -f /ansible/logs/ansible.log
$ docker exec -it kolla-ansible tail -f /ansible/logs/ansible.log

ARA - ARA Records Ansible

$ osism log ansible
(ara) help

Documented commands (use 'help -v' for verbose/'help <topic>' for details):
===========================================================================
alias exit history quit run_script shell
edit help macro run_pyscript set shortcuts

Application commands (type help <topic>):
=========================================
complete host metrics playbook delete record delete result show
expire host show playbook list record list task delete
help play delete playbook metrics record show task list
host delete play list playbook prune result delete task metrics
host list play show playbook show result list task show

Sample usage

As an example, the role common is run. Irrelevant parts of outputs have been removed.

$ osism apply common
$ osism log ansible
(ara) play list
+----+-----------+-------------------------------------------------------+----------+-------+---------+-----------------------------+-----------------+
| id | status | name | playbook | tasks | results | started | duration |
+----+-----------+-------------------------------------------------------+----------+-------+---------+-----------------------------+-----------------+
| 69 | completed | Apply role common | 49 | 21 | 68 | 2023-09-30T10:14:01.731212Z | 00:00:38.238032 |
+----+-----------+-------------------------------------------------------+----------+-------+---------+-----------------------------+-----------------+
(ara) play show 69
+----------+------------------------------------------+
| Field | Value |
+----------+------------------------------------------+
| id | 69 |
| report | http://ara-server:8000/playbooks/49.html |
| status | completed |
| name | Apply role common |
| playbook | (49) /ansible/kolla-common.yml |
| started | 2023-09-30T10:14:01.731212Z |
| ended | 2023-09-30T10:14:39.969244Z |
| duration | 00:00:38.238032 |
| items | {'tasks': 21, 'results': 68} |
+----------+------------------------------------------+
(ara) task list
+-----+-----------+---------+---------------------------------+----------------------------------------------------------------------------+----------+-----------------------------+-----------------+
| id | status | results | action | name | playbook | started | duration |
+-----+-----------+---------+---------------------------------+----------------------------------------------------------------------------+----------+-----------------------------+-----------------+
| 910 | completed | 0 | meta | common : Flush handlers | 49 | 2023-09-30T10:14:37.126872Z | 00:00:02.552006 |
| 909 | completed | 4 | file | common : Link kolla_logs volume to /var/log/kolla | 49 | 2023-09-30T10:14:35.502754Z | 00:00:01.039468 |
| 908 | completed | 4 | kolla_docker | common : Creating log volume | 49 | 2023-09-30T10:14:34.134312Z | 00:00:01.076976 |
| 907 | completed | 4 | kolla_docker | common : Check common containers | 49 | 2023-09-30T10:14:31.411916Z | 00:00:02.146165 |
| 906 | completed | 4 | template | common : Copy rabbitmq erl_inetrc to kolla toolbox | 49 | 2023-09-30T10:14:29.500998Z | 00:00:01.327607 |
| 905 | completed | 4 | template | common : Copy rabbitmq-env.conf to kolla toolbox | 49 | 2023-09-30T10:14:27.979869Z | 00:00:01.231630 |
| 904 | completed | 4 | file | common : Ensuring config directories have correct owner and permission | 49 | 2023-09-30T10:14:26.422535Z | 00:00:01.263370 |
| 903 | completed | 4 | template | common : Ensure RabbitMQ Erlang cookie exists | 49 | 2023-09-30T10:14:24.880329Z | 00:00:01.255475 |
| 902 | completed | 4 | template | common : Copying over cron logrotate config file | 49 | 2023-09-30T10:14:23.199518Z | 00:00:01.392765 |
| 901 | completed | 4 | template | common : Copying over td-agent.conf | 49 | 2023-09-30T10:14:21.085351Z | 00:00:01.826039 |
| 900 | completed | 1 | find | common : Find custom fluentd output config files | 49 | 2023-09-30T10:14:19.859670Z | 00:00:00.939663 |
| 899 | completed | 1 | find | common : Find custom fluentd format config files | 49 | 2023-09-30T10:14:18.711171Z | 00:00:00.858586 |
| 898 | completed | 1 | find | common : Find custom fluentd filter config files | 49 | 2023-09-30T10:14:17.542234Z | 00:00:00.877270 |
| 897 | completed | 1 | find | common : Find custom fluentd input config files | 49 | 2023-09-30T10:14:15.911699Z | 00:00:01.315217 |
| 896 | completed | 4 | template | common : Copying over config.json files for services | 49 | 2023-09-30T10:14:13.588195Z | 00:00:02.031647 |
| 895 | completed | 4 | copy | service-cert-copy : common | Copying over backend internal TLS key | 49 | 2023-09-30T10:14:12.216984Z | 00:00:01.074853 |
| 894 | completed | 4 | copy | service-cert-copy : common | Copying over backend internal TLS certificate | 49 | 2023-09-30T10:14:10.895833Z | 00:00:01.022530 |
| 893 | completed | 4 | copy | service-cert-copy : common | Copying over extra CA certificates | 49 | 2023-09-30T10:14:08.551850Z | 00:00:02.040932 |
| 892 | completed | 4 | include_tasks | common : include_tasks | 49 | 2023-09-30T10:14:07.019883Z | 00:00:00.950605 |
| 891 | completed | 4 | file | common : Ensuring config directories exist | 49 | 2023-09-30T10:14:04.801633Z | 00:00:01.926842 |
| 890 | completed | 4 | include_tasks | common : include_tasks | 49 | 2023-09-30T10:14:03.054547Z | 00:00:01.166032 |
+-----+-----------+---------+---------------------------------+----------------------------------------------------------------------------+----------+-----------------------------+-----------------+
(ara) task show 910
+----------+------------------------------------------+
| Field | Value |
+----------+------------------------------------------+
| id | 910 |
| uuid | 0242ac1f-6510-3867-9eea-00000000004f |
| report | http://ara-server:8000/playbooks/49.html |
| name | common : Flush handlers |
| action | meta |
| status | completed |
| path | /ansible/roles/common/tasks/deploy.yml |
| lineno | 8 |
| started | 2023-09-30T10:14:37.126872Z |
| ended | 2023-09-30T10:14:39.678878Z |
| duration | 00:00:02.552006 |
| tags | ['common'] |
| handler | False |
+----------+------------------------------------------+
(ara) playbook list
+----+-----------+-------------------------------+--------+-----------------+---------------------------------------------------+-------+---------+-------+-----------------------------+-----------------+
| id | status | controller | user | ansible_version | path | tasks | results | hosts | started | duration |
+----+-----------+-------------------------------+--------+-----------------+---------------------------------------------------+-------+---------+-------+-----------------------------+-----------------+
| 49 | completed | kolla-ansible.manager_default | dragon | 2.14.10 | /ansible/kolla-common.yml | 21 | 68 | 5 | 2023-09-30T10:14:01.410334Z | 00:00:39.135309 |
+----+-----------+-------------------------------+--------+-----------------+---------------------------------------------------+-------+---------+-------+-----------------------------+-----------------+
(ara) playbook metrics
+---------------------------------------------------+-------+----------------+----------------+-------+---------+-------+-----------+--------+---------+
| aggregate | count | duration_total | duration_avg | tasks | results | hosts | completed | failed | running |
+---------------------------------------------------+-------+----------------+----------------+-------+---------+-------+-----------+--------+---------+
| /ansible/kolla-common.yml | 2 | 0:02:53.934432 | 0:01:26.967216 | 46 | 152 | 10 | 2 | 0 | 0 |
+---------------------------------------------------+-------+----------------+----------------+-------+---------+-------+-----------+--------+---------+
(ara) host list
+-----+-----------------------------------+----------+---------+--------+----+---------+-------------+-----------------------------+
| id | name | playbook | changed | failed | ok | skipped | unreachable | updated |
+-----+-----------------------------------+----------+---------+--------+----+---------+-------------+-----------------------------+
| 164 | testbed-node-2.testbed.osism.xyz | 49 | 0 | 0 | 14 | 2 | 0 | 2023-09-30T10:14:40.543599Z |
| 161 | testbed-manager.testbed.osism.xyz | 49 | 0 | 0 | 18 | 2 | 0 | 2023-09-30T10:14:40.283581Z |
| 163 | testbed-node-1.testbed.osism.xyz | 49 | 0 | 0 | 14 | 2 | 0 | 2023-09-30T10:14:40.280601Z |
| 162 | testbed-node-0.testbed.osism.xyz | 49 | 0 | 0 | 14 | 2 | 0 | 2023-09-30T10:14:40.279181Z |
| 165 | kolla-ansible.manager_default | 49 | 0 | 0 | 0 | 0 | 0 | 2023-09-30T10:14:16.932135Z |
+-----+-----------------------------------+----------+---------+--------+----+---------+-------------+-----------------------------+
(ara) host show 164
+-------------+------------------------------------------+
| Field | Value |
+-------------+------------------------------------------+
| id | 164 |
| report | http://ara-server:8000/playbooks/49.html |
| name | testbed-node-2.testbed.osism.xyz |
| changed | 0 |
| failed | 0 |
| ok | 14 |
| skipped | 2 |
| unreachable | 0 |
| updated | 2023-09-30T10:14:40.543599Z |
+-------------+------------------------------------------+

Container

$ osism log container testbed-node-0 horizon
[...]
++++ APACHE_LOCK_DIR=/var/lock/apache2
++++ export APACHE_LOG_DIR=/var/log/apache2
++++ APACHE_LOG_DIR=/var/log/apache2
++++ export LANG=C
++++ LANG=C
++++ export LANG
+++ install -d /var/run/apache2/
+++ rm -rf '/var/run/apache2/*'
+++ [[ ubuntu =~ centos|rocky ]]
+ echo 'Running command: '\''/usr/sbin/apache2 -DFOREGROUND'\'''
+ exec /usr/sbin/apache2 -DFOREGROUND
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 192.168.16.10. Set the 'ServerName' directive globally to suppress this message

OpenSearch

OpenSearch can be queried with SQL.

$ osism log opensearch
>>> SELECT * FROM flog-2023.10.31 LIMIT 1;
Oct 31 10:45:36 testbed-node-0 docker[847573]: cluster 2023-10-31T10:45:35.498718+0000 mgr.testbed-node-0 (mgr.5184) 24194 : cluster [DBG] pgmap v24196: 321 pgs: 321 active+clean; 577 KiB data, 270 MiB used, 60 GiB / 60 GiB avail

>>> SELECT * FROM flog-2023.10.31 LIMIT 5;
Oct 31 11:19:57 testbed-node-2 docker[880827]: 2023-10-31T11:19:57.650+0000 7fa7e7c88700 0 [dashboard INFO root] Redirecting to active 'http://192.168.16.10:7000/'
Oct 31 11:19:57 testbed-node-2 docker[880827]: 2023-10-31T11:19:57.650+0000 7fa7e7c88700 0 [dashboard INFO request] [::ffff:192.168.16.11:56210] [OPTIONS] [302] [0.001s] [105.0B] [8a69cc7a-23db-410b-b744-cc5689cb4f4c] /
Oct 31 11:19:58 testbed-node-2 docker[844686]: cluster 2023-10-31T11:19:56.329684+0000 mgr.testbed-node-0 (mgr.5184) 25224 : cluster [DBG] pgmap v25226: 321 pgs: 321 active+clean; 577 KiB data, 270 MiB used, 60 GiB / 60 GiB avail
Oct 31 11:19:58 testbed-node-2 docker[844686]: debug 2023-10-31T11:19:58.566+0000 7fdbc9728700 1 mon.testbed-node-2@2(peon).osd e74 _set_new_cache_sizes cache_size:1020054731 inc_alloc: 348127232 full_alloc: 348127232 kv_alloc: 322961408
Oct 31 11:19:58 testbed-node-2 docker[880827]: 2023-10-31T11:19:58.710+0000 7fa7eb48f700 0 [dashboard INFO root] Redirecting to active 'http://192.168.16.10:7000/'

>>> SELECT * FROM flog-2023.10.31 WHERE Hostname = 'testbed-node-0' LIMIT 5
PATH_INFO: `/` log_request_info /var/lib/kolla/venv/lib/python3.10/site-packages/keystone/server/flask/request_processing/req_logging.py:29
REQUEST_METHOD: `GET` log_request_info /var/lib/kolla/venv/lib/python3.10/site-packages/keystone/server/flask/request_processing/req_logging.py:27
SCRIPT_NAME: `` log_request_info /var/lib/kolla/venv/lib/python3.10/site-packages/keystone/server/flask/request_processing/req_logging.py:28
192.168.16.10 - - [31/Oct/2023 10:57:33] "GET / HTTP/1.1" 300 1761 0.001253
(1039) accepted ('192.168.16.10', 58732) server /var/lib/kolla/venv/lib/python3.10/site-packages/eventlet/wsgi.py:1004

>>> SELECT * FROM flog-2023.10.31 WHERE Hostname = 'testbed-node-0' AND programname = 'keystone' LIMIT 5
PATH_INFO: `/` log_request_info /var/lib/kolla/venv/lib/python3.10/site-packages/keystone/server/flask/request_processing/req_logging.py:29
REQUEST_METHOD: `GET` log_request_info /var/lib/kolla/venv/lib/python3.10/site-packages/keystone/server/flask/request_processing/req_logging.py:27
SCRIPT_NAME: `` log_request_info /var/lib/kolla/venv/lib/python3.10/site-packages/keystone/server/flask/request_processing/req_logging.py:28
PATH_INFO: `/` log_request_info /var/lib/kolla/venv/lib/python3.10/site-packages/keystone/server/flask/request_processing/req_logging.py:29
REQUEST_METHOD: `GET` log_request_info /var/lib/kolla/venv/lib/python3.10/site-packages/keystone/server/flask/request_processing/req_logging.py:27
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/operations-guide/manager/task/index.html b/docs/iaas/guides/operations-guide/manager/task/index.html new file mode 100644 index 0000000000..1486c023ae --- /dev/null +++ b/docs/iaas/guides/operations-guide/manager/task/index.html @@ -0,0 +1,29 @@ + + + + + +Task | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Task

List

All running or scheduled tasks can be listed with osism task list.

+----------------------+--------------------------------------+-------------------------+----------+----------------------------+-----------------------------------------------+
| Worker | ID | Name | Status | Start time | Arguments |
|----------------------+--------------------------------------+-------------------------+----------+----------------------------+-----------------------------------------------|
| celery@kolla-ansible | 8a553e69-c532-4ba0-a5d4-08a983bde692 | osism.tasks.kolla.run | ACTIVE | 2023-09-27 17:55:54.252250 | ['kolla', 'common', ['-e kolla_action=pull']] |
| celery@osism-ansible | dba72dd5-1885-408f-9262-e0ded111a007 | osism.tasks.ansible.run | ACTIVE | 2023-09-27 18:00:31.215879 | ['generic', 'facts', []] |
+----------------------+--------------------------------------+-------------------------+----------+----------------------------+-----------------------------------------------+

Broker reset

Sometimes tasks get stuck. Due to the internal locks it is then not possible to re-execute +plays with the same name. Also it is currently not possible to cancel already running tasks +(is on the todo list). The only way to unblock the situation is to stop the manager service +and remove the Redis volume. Afterwards the manager is started again.

cd /opt/manager
docker compose down
docker volume rm manager_redis
docker compose up -d
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/operations-guide/openstack/cinder/index.html b/docs/iaas/guides/operations-guide/openstack/cinder/index.html new file mode 100644 index 0000000000..cb045839c6 --- /dev/null +++ b/docs/iaas/guides/operations-guide/openstack/cinder/index.html @@ -0,0 +1,26 @@ + + + + + +Cinder | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Cinder

Remove service

$ openstack --os-cloud admin volume service list
+------------------+-----------------------------------+----------+---------+-------+----------------------------+
| Binary | Host | Zone | Status | State | Updated At |
+------------------+-----------------------------------+----------+---------+-------+----------------------------+
| cinder-scheduler | testbed-node-0 | internal | enabled | up | 2023-10-01T08:53:14.000000 |
| cinder-scheduler | testbed-node-1 | internal | enabled | up | 2023-10-01T08:53:15.000000 |
| cinder-scheduler | testbed-node-2 | internal | enabled | up | 2023-10-01T08:53:15.000000 |
| cinder-volume | testbed-node-0@rbd-1 | nova | enabled | down | 2023-09-30T18:50:05.000000 |
| cinder-volume | testbed-node-2@rbd-1 | nova | enabled | down | 2023-09-30T18:50:05.000000 |
| cinder-volume | testbed-node-1@rbd-1 | nova | enabled | down | 2023-09-30T18:50:08.000000 |
+------------------+-----------------------------------+----------+---------+-------+----------------------------+
$ docker exec -it cinder_api cinder-manage service remove cinder-volume testbed-node-0@rbd-1
Service cinder-volume on host testbed-node-0@rbd-1 removed.
$ docker exec -it cinder_api cinder-manage service remove cinder-volume testbed-node-1@rbd-1
Service cinder-volume on host testbed-node-1@rbd-1 removed.
$ docker exec -it cinder_api cinder-manage service remove cinder-volume testbed-node-2@rbd-1
Service cinder-volume on host testbed-node-2@rbd-1 removed.
dragon@mgr001:~$ openstack --os-cloud admin volume service list
+------------------+-----------------------------------+----------+---------+-------+----------------------------+
| Binary | Host | Zone | Status | State | Updated At |
+------------------+-----------------------------------+----------+---------+-------+----------------------------+
| cinder-scheduler | testbed-node-0 | internal | enabled | up | 2023-10-01T08:56:24.000000 |
| cinder-scheduler | testbed-node-1 | internal | enabled | up | 2023-10-01T08:56:25.000000 |
| cinder-scheduler | testbed-node-2 | internal | enabled | up | 2023-10-01T08:56:25.000000 |
+------------------+-----------------------------------+----------+---------+-------+----------------------------+
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/operations-guide/openstack/day2-operations/flavor-manager/index.html b/docs/iaas/guides/operations-guide/openstack/day2-operations/flavor-manager/index.html new file mode 100644 index 0000000000..8385a1cca6 --- /dev/null +++ b/docs/iaas/guides/operations-guide/openstack/day2-operations/flavor-manager/index.html @@ -0,0 +1,41 @@ + + + + + +Flavor Manager | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Flavor Manager

Overview

The OpenStack Flavor Manager manages the creation, modification, and removal of flavors within an OpenStack environment. +The OpenStack Flavor Manager operates as a facilitator that orchestrates compute flavors in alignment +with the standard SCS-0100: Flavor Naming +by utilizing YAML files provided by the SCS project.

Installation

Install the openstack-flavor-manager package with pip.

pip install openstack-flavor-manager

Or clone the repository osism/openstack-flavor-manager +and use the OpenStack Flavor Manager from source with tox.

tox -- --help

Usage

There must be a clouds.yml and a secure.yml file in the directory where the OpenStack Flavor Manager +will be executed. The cloud profile to be used can be specified via the optional --cloud parameter. +By default the cloud profile with the name admin is used. It must be possible to create and delete +flavors with the used cloud credentials.

$ openstack-flavor-manager --help

Usage: openstack-flavor-manager [OPTIONS]

╭─ Options ────────────────────────────────────────────────────────────────────────────────────╮
│ --name TEXT Name of flavor definitions. [default: scs] │
│ --debug Enable debug logging. │
│ --cloud TEXT Cloud name in clouds.yaml. [default: admin] │
│ --recommended Create recommended flavors. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────╯

To create the mandatory flavors by the SCS Flavor Naming Standard, you run:

$ openstack-flavor-manager

To create the recommended flavors by the SCS Flavor Naming Standard, you run:

$ openstack-flavor-manager --recommended

The output should look like this:

2023-09-20 13:03:14 | INFO     | Flavor 'SCS-1V-4' created.
2023-09-20 13:03:14 | INFO | Flavor 'SCS-2V-8' created.
2023-09-20 13:03:14 | INFO | Flavor 'SCS-4V-16' created.
2023-09-20 13:03:14 | INFO | Flavor 'SCS-8V-32' created.
...

All recommended flavors are now be available in your OpenStack environment. +Check yourself by running:

openstack --os-cloud admin flavor list

Definitions

There are two flavor definitions available by default. One for +SCS +and one for OSISM. +Each definition has its own set of mandatory and recommended flavors.

To run the OpenStack Flavor Manager with a specific definition, either scs or osism, +use the optional --name parameter. By default the SCS Flavor Naming Standard +definition will be used.

$ openstack-flavor-manager --name osism

Name parser and generator

A generator and parser for flavor names according to the SCS standard is available on +flavors.scs.community.

The flavor name SCS-2V-4-20s is inserted in field Flavor name:

The flavor SCS-2V-4-20s translated is +2 generic x86-64 vCPUs with 4.0 GiB RAM and SSD 20GB root volume:

+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/operations-guide/openstack/day2-operations/image-manager/index.html b/docs/iaas/guides/operations-guide/openstack/day2-operations/image-manager/index.html new file mode 100644 index 0000000000..97afcaf8ea --- /dev/null +++ b/docs/iaas/guides/operations-guide/openstack/day2-operations/image-manager/index.html @@ -0,0 +1,57 @@ + + + + + +Image Manager | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Image Manager

The OpenStack Image Manager is a tool for managing all images on an OpenStack environment

Requirements

This information is only relevant for the operator of an OpenStack environment. You can skip this section if +you want to use OpenStack Image Manager as a normal user and you are not an operator of an openStack environment.

OpenStack Image Service (Glance)

The OpenStack Image Service (Glance) is required to upload and discover data assets that are used by other +services.

Since this script stores many images in a single project, the Glance quota must be set accordingly high or to unlimited.

[DEFAULT]
user_storage_quota = 1TB

With most storage backends it makes sense to convert the imported images directly to RAW. So it is required for using Ceph and it's +features too. Recited from the Ceph documentation QEMU and block devices and +Block devices and OpenStack.

"The raw data format is really the only sensible format option to use with RBD. Technically, you could use other QEMU-supported formats +(such as qcow2 or vmdk), but doing so would add additional overhead, and would also render the volume unsafe for virtual machine live +migration when caching (see below) is enabled."

"Important Ceph doesn't support QCOW2 for hosting a virtual machine disk. Thus if you want to boot virtual machines in Ceph (ephemeral +backend or boot from volume), the Glance image format must be RAW."

This requires the following parameter for the image import workflow.

[taskflow_executor]
conversion_format = raw

[image_import_opts]
image_import_plugins = ['image_decompression', 'image_conversion']

[image_conversion]
output_format = raw

See OpenStack Glance documentation +for more details.

Object storage backend

If the mirror functionality is used, an object storage backend is required. The use of the mirror functionality +is optional and is not used by default.

Getting started

This Getting started will upload a private image to your OpenStack environment with +the help of the OpenStack Image Manager.

  1. Install the openstack-image-manager package with pip.

    pip3 install openstack-image-manager
  2. Create a image definition in the file getting-started.yml in the local directory images.

    ---
    images:
    - name: MyCirros
    format: qcow2
    login: cirros
    password: gocubsgo
    min_disk: 1
    min_ram: 32
    status: active
    visibility: private
    multi: false
    meta:
    architecture: x86_64
    hw_disk_bus: scsi
    hw_rng_model: virtio
    hw_scsi_model: virtio-scsi
    hw_watchdog_action: reset
    os_distro: cirros
    replace_frequency: never
    uuid_validity: none
    provided_until: none
    tags: []
    versions:
    - version: '0.6.0'
    url: https://github.com/cirros-dev/cirros/releases/download/0.6.0/cirros-0.6.0-x86_64-disk.img
    checksum: "sha256:94e1e2c94dbbae7d4bdc38e68590a1daf73c9de2d03dd693857b4b0a042548e8"
    build_date: 2022-09-28
  3. Run the OpenStack Image Manager. It is assumed that a profile with the name openstack exists in the +clouds.yaml.

    openstack-image-manager --cloud openstack --filter ".*Cirr.*" --images images/

Image definitions

The configuration consists of different parameter settings, such as values for +minimum RAM or the visibility of the image. Have a look at the examples below +for all parameters. After a change to the configuration, validate it with +tox -- --dry-run.

SCS image standard

  • The value of login is stored as image_original_user in the metadata of an image.
  • If image_description is not set as meta information, image_description is set to the name of the image.
  • The value of build_date of a specific version of an image is stored as image_build_date in the metadata of an image.
  • The value of url of a specific version of an image is stored as image_source in the metadata of an image.

Image with regular rebuilds

This type of image definition is used for images that are rebuilt at regular +intervals. For example, this is the case for the daily builds of the Ubuntu +images.

The attribute multi: true is set.

With this type of image definition, the version of the distribution (or product, +whatever is contained in the image) used is already in the name of the image +definition. The version properties from the definition's versions list +are appended only to older iterations of the image as timestamp suffixes +in parentheses upon each rotation (except for the latest entry).

images:
- name: Ubuntu 16.04
format: qcow2
login: ubuntu
min_disk: 8
min_ram: 512
status: active
visibility: public
multi: true
meta:
architecture: x86_64
hw_disk_bus: scsi
hw_scsi_model: virtio-scsi
hw_watchdog_action: reset
os_distro: ubuntu
os_version: '16.04'
tags: []
versions:
- version: '20180928'
url: https://cloud-images.ubuntu.com/xenial/20180928/xenial-server-cloudimg-amd64-disk1.img
- version: '20181004'
url: https://cloud-images.ubuntu.com/xenial/20181004/xenial-server-cloudimg-amd64-disk1.img

This configuration creates the following images:

  • Ubuntu 16.04 (20180928)
  • Ubuntu 16.04

If a newer build is added, the following rotation takes place:

  • Ubuntu 16.04 (20180928) does not change
  • Ubuntu 16.04 becomes Ubuntu 16.04 (20181004)
  • the new image becomes Ubuntu 16.04

By default the last three images will be visible. When a fourth image is added, the visibility of +the last image in the list is changed to community and the image can be deleted in the future.

Image without regular rebuild

This type of image definition is used for images that are not rebuilt. For example, +this is the case for the flatcar images. For each release of Flatcar there is exactly +one image which will not be rebuilt in the future.

The attribute multi: false is set.

With this type of image definition, the version of the distribution (or product, +whatever is contained in the image) used is not in the name of the image definition. +Instead, the version properties from the image definition's versions list +are appended as static version suffixes to the images' names.

images:
- name: RancherOS
format: qcow2
login: rancher
min_disk: 8
min_ram: 2048
status: active
visibility: public
multi: false
meta:
architecture: x86_64
hw_disk_bus: scsi
hw_scsi_model: virtio-scsi
hw_watchdog_action: reset
tags: []
versions:
- version: '1.3.0'
url: https://github.com/rancher/os/releases/download/v1.3.0/rancheros-openstack.img
- version: '1.4.0'
url: https://github.com/rancher/os/releases/download/v1.4.0/rancheros-openstack.img
- version: '1.4.1'
url: https://github.com/rancher/os/releases/download/v1.4.1/rancheros-openstack.img

This configuration creates the following images:

  • RancherOS 1.3.0
  • RancherOS 1.4.0
  • RancherOS 1.4.1

If a new version is added, no rotation takes place. The new version is added +as RancherOS x.y.z. Here also the visibility of older images is not changed.

Other properties

Image properties

  • Removal of properties is not yet possible
  • URL, name and format can not be changed
  • Any keys can be added to meta, these will be added to the image
  • Existing keys in meta can be changed, the same applies to min_disk +and min_ram

Image tags

image status

  • deactivation: change status to deactivated
  • reactivation: change status to active

Image visibility

A full documentation about the visibility of images can be found in the Image visibility section in the +OpenStack Image Service API Documentation.

  • public: set visibility to public
  • community: set visibility to community
  • shared: set visibility to shared
  • private: set visibility to private

Usage

Mirroring images

Since the upstreams often only keep their images for a short time, we mirror most of the images on REGIO.cloud. +This makes us independent of the availability of the images in the individual upstreams.

Updating images

Some of the images are automatically updated by a CI job. The latest available build at the time of the CI job execution is mirrored and +made available as the current version.

Currently, the following images are updated once a week (every Sunday at 0 am):

  • Almalinux
  • CentOS
  • Debian
  • Rockylinux
  • Ubuntu
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/operations-guide/openstack/day2-operations/index.html b/docs/iaas/guides/operations-guide/openstack/day2-operations/index.html new file mode 100644 index 0000000000..8d8bfd7061 --- /dev/null +++ b/docs/iaas/guides/operations-guide/openstack/day2-operations/index.html @@ -0,0 +1,26 @@ + + + + + +Day-2 Operations | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/iaas/guides/operations-guide/openstack/day2-operations/project-manager/index.html b/docs/iaas/guides/operations-guide/openstack/day2-operations/project-manager/index.html new file mode 100644 index 0000000000..2e2f36d293 --- /dev/null +++ b/docs/iaas/guides/operations-guide/openstack/day2-operations/project-manager/index.html @@ -0,0 +1,26 @@ + + + + + +Project Manager | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/iaas/guides/operations-guide/openstack/day2-operations/resource-manager/index.html b/docs/iaas/guides/operations-guide/openstack/day2-operations/resource-manager/index.html new file mode 100644 index 0000000000..1ad897f793 --- /dev/null +++ b/docs/iaas/guides/operations-guide/openstack/day2-operations/resource-manager/index.html @@ -0,0 +1,26 @@ + + + + + +Resource Manager | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Resource Manager

Octavia

Amphora rotation

Rotation of amphorae older than 30 days.

$ python3 src/amphora.py --rotate
2023-10-12 21:00:38 | INFO | Amphora 95a07c43-c0f9-44d2-bde8-a989e52427fa is older than 30 days
2023-10-12 21:00:38 | INFO | Amphora 95a07c43-c0f9-44d2-bde8-a989e52427fa of loadbalancer 9008d3d7-f593-4bc3-941c-a740c178148d is rotated by a loadbalancer failover
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/operations-guide/openstack/day2-operations/sandbox-manager/index.html b/docs/iaas/guides/operations-guide/openstack/day2-operations/sandbox-manager/index.html new file mode 100644 index 0000000000..d1bfcca3aa --- /dev/null +++ b/docs/iaas/guides/operations-guide/openstack/day2-operations/sandbox-manager/index.html @@ -0,0 +1,26 @@ + + + + + +Sandbox Manager | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/iaas/guides/operations-guide/openstack/index.html b/docs/iaas/guides/operations-guide/openstack/index.html new file mode 100644 index 0000000000..f7568613fb --- /dev/null +++ b/docs/iaas/guides/operations-guide/openstack/index.html @@ -0,0 +1,26 @@ + + + + + +OpenStack | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/iaas/guides/operations-guide/openstack/octavia/index.html b/docs/iaas/guides/operations-guide/openstack/octavia/index.html new file mode 100644 index 0000000000..909357ca4a --- /dev/null +++ b/docs/iaas/guides/operations-guide/openstack/octavia/index.html @@ -0,0 +1,26 @@ + + + + + +Octavia | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Octavia

Cleanup of amphora missing from the DB

/var/log/kolla/octavia/octavia-health-manager.log
2023-10-25 16:43:52.547 22 WARNING octavia.amphorae.drivers.health.heartbeat_udp [-]
The amphora 2a33a889-4f9a-4340-84a5-e58a7a8af17e with IP 10.1.0.79 is missing from the
DB, so it cannot be automatically deleted (the compute_id is unknown). An operator must
manually delete it from the compute service.
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/other-guides/contributor-guide/index.html b/docs/iaas/guides/other-guides/contributor-guide/index.html new file mode 100644 index 0000000000..1831939e86 --- /dev/null +++ b/docs/iaas/guides/other-guides/contributor-guide/index.html @@ -0,0 +1,33 @@ + + + + + +Contributor Guide | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Contributor Guide

We welcome any issues, change requests or general feedback. Do not hestiate to open an issue.

We use GitHub Issues to capture feature requests, feedback, bugs, etc. The tracker is available in the +osism/issues repository. There are no specific requirements for the creation of an issue. +Error cases should be described in such a way that they are directly reproducible. The more outputs there are, +the better.

We use GitHub pull requests for contributions. The use of pull requets is documented in the +official GitHub documentation. +The process in detail for the creation of a fork, branch etc. is also documented in the +official GitHub documentation. +It is recommended to use the GitHub CLI. Makes many steps easier.

+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/other-guides/developer-guide/index.html b/docs/iaas/guides/other-guides/developer-guide/index.html new file mode 100644 index 0000000000..efa93ed83c --- /dev/null +++ b/docs/iaas/guides/other-guides/developer-guide/index.html @@ -0,0 +1,30 @@ + + + + + +Developer Guide | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Developer Guide

How to add a new service

If you want to add a new service to OSISM, this is done via an Ansible role and (most often) +a container image. The following steps are necessary and are demonstrated using the example +of osism.services.cgit.

DescriptionExample
Add the Ansible role in one of the Ansible collection repositorieshttps://github.com/osism/ansible-collection-services/pull/578/files
Add the Ansible playbookhttps://github.com/osism/ansible-playbooks/pull/215/files
Add the Ansible inventory grouphttps://github.com/osism/cfg-generics/pull/225/files
Add the used container image(s) to the release repositoryhttps://github.com/osism/release/pull/278/files
Add the container images(s) to osism-ansible container imagehttps://github.com/osism/container-image-osism-ansible/pull/215/files
Add the container image registry/registries and host(s) to the defaults repositoryhttps://github.com/osism/defaults/pull/54/files
Add a sample deployment to the testbedhttps://github.com/osism/testbed/pull/1043/files

How to add a new container image

If required, add a new container image in the osism/container-images +repository. The example here is from the osism.services.keycloak role: https://github.com/osism/container-images/pull/34/files.

Whenever possible, upstream container images should be used. If only minor customizations are necessary, +always work with overlay container images based on upstream container images.

+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/other-guides/developer-guide/releases/index.html b/docs/iaas/guides/other-guides/developer-guide/releases/index.html new file mode 100644 index 0000000000..339d88a2b0 --- /dev/null +++ b/docs/iaas/guides/other-guides/developer-guide/releases/index.html @@ -0,0 +1,62 @@ + + + + + +Releases | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Releases

How we handle releases

Currently we do a major release every 6 months. Minor releases we do when +needed and about every 2 weeks.

In a minor release, only updates, bug fixes, etc. take place. There are also +no major upgrades of included components such as OpenStack, Keycloak or Ceph +in a minor release.

It is possible to jump from any minor version within a major version to higher +minor versions without any intervention.

Deprecations, removals, etc. take place in a major release. New mandatory +features are also added in a major release. Upgrades of the included components +can also take place during a major release (e.g. OpenStack Xena -> OpenStack Yoga).

It is possible to jump from the previous major version to the next major version. +It may be that manual intervention is necessary. For example, configuration +parameters may need to be added or services that no longer exist may need to be +removed.

How to make a release

  1. On all repositories that are used, check that the versions to be used have an +appropriate version tag (e.g. v0.20230308.0).

    osism/ansible-collection-commons
    osism/ansible-collection-services
    osism/ansible-collection-validations
    osism/ansible-defaults
    osism/ansible-playbooks
    osism/ansible-playbooks-manager
    osism/cf-generics
    osism/kolla-operations
    osism/python-osism
  2. Copy the latest directory. The release to be created is used as the new name.

    latest -> 6.0.0b
  3. Remove all # renovate lines from the base.yml file.

  4. Remove all Ceph and OpenStack releases that should not be part of the pre-release. +There is only one OpenStack version and one Ceph version per (pre-)release.

  5. Ensure that the symlinks openstack.yml and ceph.yml point to the releases +to be used in this pre-release.

    base.yml
    ceph-pacific.yml
    ceph.yml -> ceph-pacific.yml
    openstack-zed.yml
    openstack.yml -> openstack-zed.yml
  6. Run src/prepare-release.py.

    RELEASE=6.0.0b python3 src/prepare-release.py
  7. Do the steps from the Stable release starting from the 4th step.

Stable release

  1. Copy the directory of the last pre-release or the previous stable release. +The release to be created is used as the new name.

    5.0.0a -> 5.0.0b
    5.0.0b -> 5.0.0
    5.0.0 -> 5.1.0
    5.1.0 -> 5.2.0
    5.2.0 -> 5.3.0
  2. Change all necessary versions in the YAML files within the new directory. +In any case, the version of the pre-release or the version of the stable +release must be replaced by the release to be created.

  3. The release to be created is submitted as a pull request as usual and then +merged.

  4. Add a tag with the name of the new release to the listed repositories.

    osism/container-image-ceph-ansible
    osism/container-image-inventory-reconciler
    osism/container-image-osism-ansible
    osism/container-images-kolla
  5. After completing the creation of the images in repository container-images-kolla, +the file images.yml must be added to repository osism/sbom as +5.0.0/openstack.yml (instead of 5.0.0, the corresponding release is used). +The file is available as a build artefact of the Release container images action +on the created tag.

    Before the file is added, it is enhanced with the checksums of the images. The script +is available in the osism/sbom repository.

    VERSION=5.0.0 python3 scripts/add-image-checksum.py
  6. If 5.0.0/openstack.yml is present in osism/sbom, repository +osism/container-image-kolla-ansible can be tagged like the other +repositories before.

  7. Add the created SPDX files from the listed repositories to the osism/sbom repository. +The file are available as build artefacts of the Build container image action +on the created tags.

    osism/container-image-ceph-ansible
    osism/container-image-kolla-ansible
    osism/container-image-osism-ansible
  8. Add and run temporary CI jobs in osism/testbed that uses the pre-release.

    - job:
    name: testbed-deploy-stable-next
    parent: testbed-deploy
    vars:
    manager_version: "5.0.0a"
    refstack: true
    nodeset: testbed-orchestrator

    - job:
    name: testbed-upgrade-stable-next
    parent: testbed-deploy
    vars:
    manager_version: "4.2.0"
    manager_version_next: "5.0.0a"
    nodeset: testbed-orchestrator
  9. Test. Test. Test.

  10. Prepare a PR to change the stable version to the new stable version in the following Zuul jobs +in the osism/testbed repository. All tests there must pass successfully before the tag is +set on this repository in the next step. The temporary CI jobs (step 8) are removed again with +this PR.

    testbed-deploy-stable
    testbed-update-stable
    testbed-update-stable
    testbed-upgrade-stable
  11. Add a new release notes file to doc/sorce/notes. Generate the versions table with the +help of the release-table.py script in the osism/sbom repository.

  12. After all known issues are documented, a corresponding tag, e.g. 5.0.0, is set on the +osism/release repository.

  13. Create a GitHub release with the new tag on the +osism/release repository. The release is +now public available.

  14. As the last of the release process, the previously prepared PR is merged on the +osism/testbed repository to change the stable version.

How we write release notes

We use Reno to manage the release notes.

Installation

Reno is provided as a Python package and can be installed with pip.

pip3 install reno

Usage

For each change in a repository, a release note is created with Reno. +Something meaningful is used as the name for the note. For example, if the +requirements file for Ansible is removed, remove-ansible-requirements is a good name.

$ reno new remove-ansible-requirements
no configuration file in: ./releasenotes/config.yaml, ./reno.yaml
Created new notes file in releasenotes/notes/remove-ansible-requirements-6c6eba43f616bc6b.yaml

The created file contains prepared entries for several categories. It is described briefly +in each instance which contents belong in which category. What is not needed is deleted.

prelude: >
Replace this text with content to appear at the top of the section for this
release. All of the prelude content is merged together and then rendered
separately from the items listed in other parts of the file, so the text
needs to be worded so that both the prelude and the other items make sense
when read independently. This may mean repeating some details. Not every
release note requires a prelude. Usually only notes describing major
features or adding release theme details should have a prelude.
features:
- |
List new features here, or remove this section. All of the list items in
this section are combined when the release notes are rendered, so the text
needs to be worded so that it does not depend on any information only
available in another section, such as the prelude. This may mean repeating
some details.
issues:
- |
List known issues here, or remove this section. All of the list items in
this section are combined when the release notes are rendered, so the text
needs to be worded so that it does not depend on any information only
available in another section, such as the prelude. This may mean repeating
some details.
upgrade:
- |
List upgrade notes here, or remove this section. All of the list items in
this section are combined when the release notes are rendered, so the text
needs to be worded so that it does not depend on any information only
available in another section, such as the prelude. This may mean repeating
some details.
deprecations:
- |
List deprecations notes here, or remove this section. All of the list
items in this section are combined when the release notes are rendered, so
the text needs to be worded so that it does not depend on any information
only available in another section, such as the prelude. This may mean
repeating some details.
critical:
- |
Add critical notes here, or remove this section. All of the list items in
this section are combined when the release notes are rendered, so the text
needs to be worded so that it does not depend on any information only
available in another section, such as the prelude. This may mean repeating
some details.
security:
- |
Add security notes here, or remove this section. All of the list items in
this section are combined when the release notes are rendered, so the text
needs to be worded so that it does not depend on any information only
available in another section, such as the prelude. This may mean repeating
some details.
fixes:
- |
Add normal bug fixes here, or remove this section. All of the list items
in this section are combined when the release notes are rendered, so the
text needs to be worded so that it does not depend on any information only
available in another section, such as the prelude. This may mean repeating
some details.
other:
- |
Add other notes here, or remove this section. All of the list items in
this section are combined when the release notes are rendered, so the text
needs to be worded so that it does not depend on any information only
available in another section, such as the prelude. This may mean repeating
some details.

Example

Here is an example of a commit from the osism/cfg-generics repository.

---
features:
- |
The `requirements.yml` has been removed. The version will be set in the `run.sh`
script for the seed process in the future exactly as later in the update process
via the parameters `ANSIBLE_COLLECTION_SERVICES_VERSION` and
`ANSIBLE_PLAYBOOKS_MANAGER_VERSION`.
upgrade:
- |
In existing configuration repositories, the `environments/manager/requirements.yml`
file can be removed after the generics have been synced.

Repositories without release notes

We do not create release notes in the following repositories:

  • osism/github-manager
  • osism/osism.github.io
  • osism/release
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/other-guides/developer-guide/scripts/index.html b/docs/iaas/guides/other-guides/developer-guide/scripts/index.html new file mode 100644 index 0000000000..c9e53f50e5 --- /dev/null +++ b/docs/iaas/guides/other-guides/developer-guide/scripts/index.html @@ -0,0 +1,35 @@ + + + + + +Scripts | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Scripts

Scripts are included in container images to simplify development work and to enable +testing and hotfixes in running environments. What scripts are available and how to +use them is described in this chapter.

change-osism.sh

With the change-osism.sh script it is possible to bring the +Python package osism to a +development state from the +osism/python-osism +repository.

Here, the script is used in the running inventory reconciler +service to install the branch main of +osism/python-osism. +Instead of main, any branch can be used.

docker exec -u root -it manager-inventory_reconciler-1 /change-osism.sh main

It is important to restart the container afterwards.

docker restart manager-inventory_reconciler-1

The script is included in the following container images:

Inventory Reconciler

The container image of the inventory eeconciler contains a few more scripts.

It is important to restart the container afterwards.

docker restart manager-inventory_reconciler-1

osism-ansible

The osism-ansible container image contains a few more scripts.

+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/other-guides/developer-guide/zuul-ci/index.html b/docs/iaas/guides/other-guides/developer-guide/zuul-ci/index.html new file mode 100644 index 0000000000..7ee9cc6312 --- /dev/null +++ b/docs/iaas/guides/other-guides/developer-guide/zuul-ci/index.html @@ -0,0 +1,31 @@ + + + + + +Zuul CI | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Zuul CI

We use Zuul CI for our CI. Our Zuul CI instance is available +at zuul.services.betacloud.xyz.

The zuul label

On CI jobs that consume a lot of resources and have long runtimes we use a label +zuul to run these jobs.

These CI jobs run in the label pipeline +and are only started once after the label has been assigned. If changes are made +to a PR, the label must first be removed and then reassigned for a new run of the +CI jobs.

The zuul label is usable in the following repositories:

+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/other-guides/index.html b/docs/iaas/guides/other-guides/index.html new file mode 100644 index 0000000000..a5a2ecfa40 --- /dev/null +++ b/docs/iaas/guides/other-guides/index.html @@ -0,0 +1,26 @@ + + + + + +Other Guides | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/iaas/guides/other-guides/style-guide/index.html b/docs/iaas/guides/other-guides/style-guide/index.html new file mode 100644 index 0000000000..70142c17e4 --- /dev/null +++ b/docs/iaas/guides/other-guides/style-guide/index.html @@ -0,0 +1,35 @@ + + + + + +Style Guide | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Style Guide

Ansible

We implement all the default rules of Ansible Lint. All default rules can be found in the +Ansible Lint documentation: https://ansible-lint.readthedocs.io/en/latest/default_rules/

Task names

  • Tasks must always have names. The only exception allowed is for forked playbooks.
  • A name never starts with a small letter
  • Names are written in present tense
  • No punctuation is used in names

become directive

The become directive is only set when needed and is always set explicitly for each task that needs it.

Blocks, roles, or playbooks are never executed in a privileged mode.

We always insert the become directive between the name of a task and the task itself. This also applies +to related directives like become_user or become_flags. This is for better visibility if a task is +privileged or not.

- name: Copy hddtemp configuration file
become: true
ansible.builtin.copy:
src: "{{ ansible_os_family }}/hddtemp"
dest: "{{ hddtemp_conf_file }}"
owner: root
group: root
mode: 0644
notify: Restart hddtemp service

when directive

If you need to use the when directive add this at the end-section from the task where it is needed. This +makes the code easier to understand for others.

- name: "Archive existing {{ resolvconf_file }} file"
become: true
ansible.posix.synchronize:
src: "/etc/resolv.conf"
dest: "/etc/resolv.conf.{{ ansible_date_time.date }}"
archive: true
delegate_to: "{{ inventory_hostname }}"
when: stat_resolvconf_file.stat.islnk is defined and not stat_resolvconf_file.stat.islnk

Lists as defaults

Defaults that provide a list are always defined as in the following example.

docker_hosts_defaults sets the defaults in the role. Overriding is only possible with the defaults repository.

In the configuration repository, docker_hosts_extra is then used to add additional items to the list.

docker_hosts itself is never modified from the outside.

docker_hosts_defaults:
- "unix:///var/run/docker.sock"
docker_hosts_extra: []
docker_hosts: "{{ docker_hosts_defaults + docker_hosts_extra }}"

Containerfiles

Commit messages

Python

Black is a popular Python code formatter that automatically +formats your code to adhere to a consistent style. We use it to automatically format the +syntax of Python. A job is running in the CI that checks, if Black has been applied. Therefore, +format the files with Black accordingly in advance.

Installation

pip install black

Formatting a Single File

black myfile.py

Formatting Multiple Files and/or directories

black file1.py file2.py dir/

Formatting an Entire Project

This command will format all Python files in the current directory and its subdirectories:

black .

Check Mode (Dry Run)

Running Black with the --check option performs a dry run and reports files that would be +changed without actually modifying them:

black --check myfile.py

Excluding Files or Directories

You can exclude files or directories from formatting using the --exclude option:

black --exclude=dir_to_exclude/ .

Integration with Code Editors

Many code editors have extensions or plugins that can automatically run Black on your code. +For example, if you're using VSCode or PyCharm, you can easily integrate it into your IDE.

Example of failed python-black Zuul job

job-output.txt:

[…]
2023-11-16 14:38:14.149756 | TASK [python-black : Install pip module black]
2023-11-16 14:38:18.717886 | ubuntu-jammy | changed
2023-11-16 14:38:18.723062 |
2023-11-16 14:38:18.723137 | TASK [python-black : Format code with Black if there is nothing to exclude]
2023-11-16 14:38:19.138060 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/adminer.py
2023-11-16 14:38:19.151965 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/bird.py
2023-11-16 14:38:19.163608 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/auditd.py
2023-11-16 14:38:19.187772 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/cephclient/package.py
2023-11-16 14:38:19.192695 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/cephclient/container.py
2023-11-16 14:38:19.219694 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/cgit.py
2023-11-16 14:38:19.230577 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/dnsdist.py
2023-11-16 14:38:19.275681 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/hddtemp/redhat.py
2023-11-16 14:38:19.300350 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/homer.py
2023-11-16 14:38:19.310641 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/lldpd.py
2023-11-16 14:38:19.318096 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/docker.py
2023-11-16 14:38:19.329099 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/osquery.py
2023-11-16 14:38:19.344766 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/rsyslog.py
2023-11-16 14:38:19.358190 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/smartd.py
2023-11-16 14:38:19.363578 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/tuned.py
2023-11-16 14:38:19.389205 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/util/util.py
2023-11-16 14:38:19.406360 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/plugins/modules/kolla_container_facts.py
2023-11-16 14:38:19.415046 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/plugins/filter/address.py
2023-11-16 14:38:19.473508 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/plugins/modules/kolla_toolbox.py
2023-11-16 14:38:19.908963 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/plugins/modules/kolla_docker.py
2023-11-16 14:38:19.914395 | ubuntu-jammy |
2023-11-16 14:38:19.914412 | ubuntu-jammy | Oh no! 💥 💔 💥
2023-11-16 14:38:19.914419 | ubuntu-jammy | 20 files would be reformatted, 18 files would be left unchanged.
2023-11-16 14:38:20.249358 | ubuntu-jammy | ERROR
2023-11-16 14:38:20.249501 | ubuntu-jammy | {
2023-11-16 14:38:20.249533 | ubuntu-jammy | "delta": "0:00:01.053565",
2023-11-16 14:38:20.249553 | ubuntu-jammy | "end": "2023-11-16 14:38:19.932073",
2023-11-16 14:38:20.249571 | ubuntu-jammy | "msg": "non-zero return code",
2023-11-16 14:38:20.249587 | ubuntu-jammy | "rc": 1,
2023-11-16 14:38:20.249603 | ubuntu-jammy | "start": "2023-11-16 14:38:18.878508"
2023-11-16 14:38:20.249618 | ubuntu-jammy | }
[…]
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/other-guides/zuul/index.html b/docs/iaas/guides/other-guides/zuul/index.html new file mode 100644 index 0000000000..f3b74eb891 --- /dev/null +++ b/docs/iaas/guides/other-guides/zuul/index.html @@ -0,0 +1,67 @@ + + + + + +Zuul CI | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Zuul CI

note

We use Zuul CI as a CI service for OSISM. The service is not required for +the use of OSISM itself. However, as we deploy and provide Zuul CI ourselves, +the documentation for this is also included in the OSISM deploy guide.

osism.services.zuul is the Ansible role to set up Zuul CI as a single-node +installation with Docker Compose.

Installation

Server preparation

Set up a server (VM) with Ubuntu Server 22.04 LTS and make +sure that these packages are installed:

  • docker.io
  • docker-compose
  • python3-docker
  • python3-openstackclient

Also configure your deploy user to be in the docker group and set up the +account for the zuul user. TCP-Ports 80 and 443 should be accessible +from the internet, port 22 for management via SSH will also often be +useful, but not required.

If you have an OpenStack tenant where you want to deploy the Zuul +server, you can download and adapt this example +playbook:

---
- name: Setup zuul server
hosts: localhost
vars:
cloud: mycloud
flavor: myflavor
image: Ubuntu 22.04
keypair: mykeypair
network: myprivatenet
project: myproject
zuul_domain: mydomain.xyz.
zuul_fqdn: "zuul01.services.{{ zuul_domain }}"
zuul_host: zuul01

tasks:
- name: Create security group
openstack.cloud.security_group:
cloud: "{{ cloud }}"
name: "{{ project }}-zuul"
description: "Default security group for {{ project }}-zuul"

- name: Create security group rule (icmp)
openstack.cloud.security_group_rule:
cloud: "{{ cloud }}"
security_group: "{{ project }}-zuul"
protocol: icmp
remote_ip_prefix: 0.0.0.0/0

- name: Create security group rules (tcp)
openstack.cloud.security_group_rule:
cloud: "{{ cloud }}"
security_group: "{{ project }}-zuul"
protocol: tcp
remote_ip_prefix: 0.0.0.0/0
port_range_min: "{{ item }}"
port_range_max: "{{ item }}"
loop:
- 22
- 80
- 443

- name: Create zuul server
openstack.cloud.server:
cloud: "{{ cloud }}"
flavor: "{{ flavor }}"
image: "{{ image }}"
key_name: "{{ keypair }}"
name: "{{ zuul_host }}"
network: "{{ network }}"
security_groups:
- default
- "{{ project }}-zuul"
meta:
hostname: "{{ zuul_host }}"
register: zuul_server

- name: Add host
ansible.builtin.add_host:
name: "{{ zuul_server.openstack.accessIPv4 }}"
groups: zuul
ansible_user: ubuntu

- name: Initialize zuul server
hosts: zuul
gather_facts: false
vars:
zuul_user: zuul

tasks:
- name: Wait for system to become reachable
ansible.builtin.wait_for_connection:

- name: Update all packages
ansible.builtin.apt:
update_cache: true
name: '*'
state: latest
become: true

- name: Install required packages
ansible.builtin.apt:
name:
- docker.io
- docker-compose
- python3-docker
- python3-openstackclient
become: true

- name: Add user to docker group
ansible.builtin.user:
name: "{{ ansible_ssh_user }}"
groups: docker
append: true
become: true

- name: Add group
ansible.builtin.group:
name: "{{ zuul_user }}"
become: true

- name: Add user
ansible.builtin.user:
name: "{{ zuul_user }}"
uid: 10001
shell: /bin/bash
group: "{{ zuul_user }}"
groups: sudo
append: true
home: "/home/{{ zuul_user }}"
become: true

Define secrets

There need to be some secrets handed to the deployment, the suggested +method is to have a dedicated file that contains them, which will be +included in the example playbook below via a vars_files statement. +This allows you to easily protect all your secrets by applying +ansible-vault encrypt to that file. The contents of this file should +look like:

---
zuul_auth_secret: secret used for zuul web auth
webhook_token: token defined for github webhooks
db_user_pass: DB password for the zuul user
db_root_pass: DB root password

In addition you need to prepare some further data that needs to be +placed into a files directory in order to be consumed by the zuul +role. These are:

  1. A clouds.yaml file for nodepool. This will be used by +nodepool-builder to upload the newly created images and by +nodepool-launcher to start instances running these images, these +will then be handed over to Zuul as CI nodes.
  2. An SSH private key in the file nodepool and the matching public +key in nodepool.pub. These will be used by nodepool and zuul to +access the CI nodes via SSH.
  3. An SSL private key and certificate pasted together in a file +named server.crt. This file will be used in the https setup by +the webserver. The certificate should cover both zuul_webserver_fqdn +and zuul_logserver_fqdn.

Github App setup

In order for zuul to be able to interact with repositories hosted on +github, you need to set up a github application. Follow the instructions +at https://zuul-ci.org/docs/zuul/latest/drivers/github.html#application +to do this. The webhook token to use is the one defined in the +pervious section. Use github in place of <connection-name> for the +Webhook URL in the app configuration. After the app has been created, +place the PEM files that you downloaded into a +directory named pem-files:

$ mkdir -p pem-files
$ cp ~/Downloads/my-org-zuul.*.private-key.pem pem-files/my-org-zuul.pem

Now add the information about your github app to vars.yml:

github_app_id: 000000
github_pem_name: my-org-zuul

Example Playbook

Save this file as main.yaml:

---
- name: Set up zuul
hosts: zuul.example.com
vars_files:
- vars.yml
pre_tasks:
- name: Create /etc/openstack/
ansible.builtin.file:
state: directory
path: /etc/openstack
owner: root
group: root
mode: 0755
become: true

- name: Deploy clouds.yaml file
ansible.builtin.copy:
src: clouds.yaml
dest: /etc/openstack/clouds.yaml
owner: root
group: zuul
mode: '0640'
become: true

- name: Create keypair in the cloud
openstack.cloud.keypair:
cloud: osism-ci
name: osism-zuul
public_key: "{{ lookup('file', 'nodepool.pub') }}"
become: true

roles:
- name: Execute zuul role
role: zuul
vars:
zuul_connections:
github:
driver: github
webhook_token: "{{ webhook_token }}"
app_id: "{{ github_app_id }}"
app_key: "/etc/zuul/pem-files/{{ github_pem_name }}.pem"
opendevorg:
name: opendev
driver: git
baseurl: https://opendev.org
zuul_tenants:
- tenant:
name: my-tenant-name
source:
opendevorg:
untrusted-projects:
- zuul/zuul-jobs:
include:
- job
github:
config-projects:
- my-org/zuul_demo_config:
load-branch: main
untrusted-projects:
- my-org/zuul_demo_repo
become: true

Create an inventory file containing the login information for your zuul +server, it might look like:

zuul.example.com ansible_host=192.0.2.2 ansible_user=ubuntu

Then you can deploy your zuul server by running:

ansible-playbook -i inventory main.yaml

This will deploy a simple zuul setup with sample example repos being +referenced. You can fork the example repos from the +https://github.com/osism tenant or just use them as a guide for how +to build your own.

For further information about how to tune this setup for +you specific environment, have a look at the sections covering +nodepool and tenant configuration.

Troubleshooting

Your git repos are not displayed?

Have you thought of naming your repos with the prefix of your organization? release should be osism/release for example.

Your git repos are using the wrong branch?

For config-projects you set this value in the tenant-configuration with the load-branch stanza. +For untrusted-projects you set this value in the config-projects project sections AND in EVERY untrusted-project. +Each project section needs to have the default-branch stanza.

Your logs are not displayed in the web-UI?

Check, if the IP of the logfile server is really correct. In combination with GitHub there is a +bug which keeps the GitHub App posting to the old IP even if the webhook IP was changed. Current +workaround: Delete the old GitHub App and create a new one.

+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/troubleshooting-guide/index.html b/docs/iaas/guides/troubleshooting-guide/index.html new file mode 100644 index 0000000000..0ae3b0e710 --- /dev/null +++ b/docs/iaas/guides/troubleshooting-guide/index.html @@ -0,0 +1,26 @@ + + + + + +Troubleshooting Guide | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/troubleshooting-guide/manager/index.html b/docs/iaas/guides/troubleshooting-guide/manager/index.html new file mode 100644 index 0000000000..b860fa8f47 --- /dev/null +++ b/docs/iaas/guides/troubleshooting-guide/manager/index.html @@ -0,0 +1,29 @@ + + + + + +Manager | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Manager

Reset

Sometimes it is necessary to reset the entire manager service.

danger

This is a disruptive action. Data is lost in the course of the process. +For example, the database of the ARA service.

sudo systemctl stop docker-compose@manager.service
docker compose --project-directory /opt/manager down -v
sudo systemctl start docker-compose@manager.service

After starting the manager service, the inventory and the fact cache +must be rebuilt.

osism reconciler sync
osism apply facts

If Ceph is used, the Ceph keys should also be re-provisioned within +the manager service.

osism apply ceph-fetch-keys
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/troubleshooting-guide/openstack/index.html b/docs/iaas/guides/troubleshooting-guide/openstack/index.html new file mode 100644 index 0000000000..701c9582db --- /dev/null +++ b/docs/iaas/guides/troubleshooting-guide/openstack/index.html @@ -0,0 +1,26 @@ + + + + + +OpenStack | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

OpenStack

Database creation fails

Problem:

TASK [keystone : Creating keystone database] ***********************************
fatal: [testbed-node-0]: FAILED! => changed=false
action: mysql_db
msg: 'unable to find /var/lib/ansible/.my.cnf. Exception message: (2003, "Can''t connect to MySQL server on ''api-int.local'' ([Errno 111] Connection refused)")'

Solution:

Restart the kolla_toolbox container. in this case on the node testbed-node-0.

$ osism console testbed-node-0/
testbed-node-0>>> restart kolla_toolbox
kolla_toolbox
testbed-node-0>>>
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/upgrade-guide/ceph/index.html b/docs/iaas/guides/upgrade-guide/ceph/index.html new file mode 100644 index 0000000000..3a561ed62c --- /dev/null +++ b/docs/iaas/guides/upgrade-guide/ceph/index.html @@ -0,0 +1,26 @@ + + + + + +Ceph | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/iaas/guides/upgrade-guide/docker/index.html b/docs/iaas/guides/upgrade-guide/docker/index.html new file mode 100644 index 0000000000..b2d5725901 --- /dev/null +++ b/docs/iaas/guides/upgrade-guide/docker/index.html @@ -0,0 +1,53 @@ + + + + + +Docker | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Docker

The Docker version used is defined via the parameter docker_version in the file +environments/configuration.yml.

docker_version: '5:20.10.24'

All installable versions can be displayed with apt-cache madison docker-ce.

$ apt-cache madison docker-ce
docker-ce | 5:24.0.6-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
docker-ce | 5:24.0.5-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
docker-ce | 5:24.0.4-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
docker-ce | 5:24.0.3-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
docker-ce | 5:24.0.2-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
docker-ce | 5:24.0.1-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
docker-ce | 5:24.0.0-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
docker-ce | 5:23.0.6-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
docker-ce | 5:23.0.5-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
docker-ce | 5:23.0.4-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
docker-ce | 5:23.0.3-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
docker-ce | 5:23.0.2-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
docker-ce | 5:23.0.1-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
docker-ce | 5:23.0.0-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
docker-ce | 5:20.10.24~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
docker-ce | 5:20.10.23~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
docker-ce | 5:20.10.22~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
docker-ce | 5:20.10.21~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
docker-ce | 5:20.10.20~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
docker-ce | 5:20.10.19~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
docker-ce | 5:20.10.18~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
docker-ce | 5:20.10.17~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
docker-ce | 5:20.10.16~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
docker-ce | 5:20.10.15~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
docker-ce | 5:20.10.14~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
docker-ce | 5:20.10.13~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages

If, for example, you want to change the Docker version from 20.10.24 to 24.0.6, docker_version in +environments/configuration.yml is changed accordingly. The 5: prefix is placed in front of the version. Commit and push the changes to your configuration repository afterwards.

The upgrade of Docker is then done with the OSISM CLI. Docker on the manager itself is updated differently. +This does not work on the manager itself because the Docker service may be started during the upgrade and +individual containers may be started as a result. This would interrupt the run of the role itself.

osism apply docker -l 'docker:!manager'

By default, serial is set to 1 so that the the hosts are upgrade one after the other. +To adjust this, either use the osism_serial dictionary in the environments/configuration.yml file +to change the value in docker or append -e serial=10% to upgrade, for example, 10% +with each iteration.

Please note that it is not a good idea to upgrade more than one Docker service at a time. +This can lead to anomalies, especially on storage nodes and control nodes. It is recommended +not to change the default of 1.

osism_serial:
docker: 10%

On the manager itself, the run.sh script in the manager environment of the configuration must +currently be used to upgrade the Docker service. In a future release a dedicated osism update docker +command will be available for this purpose.

cd /opt/configuration/environments/manager
ANSIBLE_ASK_VAULT_PASS=True ./run.sh docker

Restart behaviour

When upgrading, the Docker service is restarted. As a result, it can come to a restart of the +running containers. This can lead to interruptions in individual services. A change in +/etc/docker/daemon.json due to a new configuration parameter etc. can also result in a +required restart.

Whether the containers are restarted when the Docker Service is restarted depends on whether the +Live Restore feature is used. +This can be configured via the parameter docker_live_restore. Live restore is enabled by default.

It is important to set the docker_live_restore parameter explicitly as a string. This means +docker_live_restore: "false" or docker_live_restore: "true".

But even if the Live Restore feature is enabled, certain upgrades will cause running containers +to be restarted:

Live restore allows you to keep containers running across Docker daemon updates, but is only +supported when installing patch releases (YY.MM.x), not for major (YY.MM) daemon upgrades.

There are two ways to prevent a restart of the Docker service during an upgrade.

If the restart behaviour of the Docker service is changed, always make sure to restart the +Docker service manually afterwards (e.g. by a system reboot).

  1. A host group can be defined via the parameter docker_ignore_restart_groupname. The +restart of the Docker service is not triggered for all hosts in this group. By default, +docker_ignore_restart_groupname is set to manager. The parameter is best set in the +environments/configuration.yml file when making an adjustment. For example, to prevent +the restart on all hosts, docker_ignore_restart_groupname is set to generic.

    docker_ignore_restart_groupname: generic
  2. With the parameter docker_allow_restart, the restart of the Docker service can be +prevented. By default, docker_allow_restart is set to true. It is recommended to set +this parameter only at runtime. Otherwise, the best place for the parameter is the +environments/configuration.yml file.

    osism apply docker -e docker_allow_restart=false
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/upgrade-guide/index.html b/docs/iaas/guides/upgrade-guide/index.html new file mode 100644 index 0000000000..5136e26618 --- /dev/null +++ b/docs/iaas/guides/upgrade-guide/index.html @@ -0,0 +1,29 @@ + + + + + +Upgrade Guide | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Upgrade Guide

In the examples, the pull of images (if supported by a role) is always run first. While +this is optional, it is recommended to speed up the execution of the upgrade action in +the second step. This significantly reduces the times required for the restart from a +service.

+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/upgrade-guide/infrastructure/index.html b/docs/iaas/guides/upgrade-guide/infrastructure/index.html new file mode 100644 index 0000000000..77d93f3008 --- /dev/null +++ b/docs/iaas/guides/upgrade-guide/infrastructure/index.html @@ -0,0 +1,29 @@ + + + + + +Infrastructure | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Infrastructure

Kubernetes

Cron, Fluentd & Kolla Toolbox

The common role of Kolla is used to manage the services cron, fluentd +and kolla-toolbox.

It is important to do this upgrade before any other upgrades in the Kolla +environment, as parts of the other upgrades depend on the kolla-toolbox +service.

osism apply -a pull common
osism apply -a upgrade common

Loadbalancer

osism apply -a pull loadbalancer
osism apply -a upgrade loadbalancer

Redis

osism apply -a pull redis
osism apply -a upgrade redis

Memcached

osism apply -a pull memcached
osism apply -a upgrade memcached

RabbitMQ

osism apply -a pull rabbitmq
osism apply -a upgrade rabbitmq

MariaDB

osism apply -a pull mariadb
osism apply -a upgrade mariadb
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/upgrade-guide/logging-monitoring/index.html b/docs/iaas/guides/upgrade-guide/logging-monitoring/index.html new file mode 100644 index 0000000000..1260caa61a --- /dev/null +++ b/docs/iaas/guides/upgrade-guide/logging-monitoring/index.html @@ -0,0 +1,26 @@ + + + + + +Logging & Monitoring | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Logging & Monitoring

OpenSearch

OpenSearch dashboards is also upgraded with the opensearch role.

osism apply -a pull opensearch
osism apply -a upgrade opensearch

Prometheus

osism apply -a pull prometheus
osism apply prometheus

Grafana

osism apply -a pull grafana
osism apply -a upgrade grafana
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/upgrade-guide/manager/index.html b/docs/iaas/guides/upgrade-guide/manager/index.html new file mode 100644 index 0000000000..84a0a974d0 --- /dev/null +++ b/docs/iaas/guides/upgrade-guide/manager/index.html @@ -0,0 +1,30 @@ + + + + + +Manager | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Manager

Always read the release notes first to learn what has changed and what +adjustments are necessary

  1. Update the OSISM release in use in the configuration repository as described in +Configuration Guide > Manager > Stable release.

  2. Update the configuration repository on the manager.

    osism apply configuration
  3. Update the manager services on the manager.

    osism update manager
    • If Ansible Vault was used to encrypt environments/manager/secrets.yml, the parameter +--ask-vault-pass is also appended.
    • If osism update manager does not work yet, use osism-update-manager instead.
  1. Refresh the facts cache.

    osism apply facts
  2. If Traefik is used on the management plane (traefik_enable: true in environments/infrastructure/configuration.yml) +then Traefik should also be upgraded directly.

    osism apply traefik
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/upgrade-guide/network/index.html b/docs/iaas/guides/upgrade-guide/network/index.html new file mode 100644 index 0000000000..d643036b93 --- /dev/null +++ b/docs/iaas/guides/upgrade-guide/network/index.html @@ -0,0 +1,26 @@ + + + + + +Network | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Network

Open vSwitch

osism apply -a pull openvswitch
osism apply -a upgrade openvswitch

OVN (if used)

Before the upgrade of OVN, the upgrade of Open vSwitch must already have been done.

osism apply -a pull ovn
osism apply -a upgrade ovn
+ + + + \ No newline at end of file diff --git a/docs/iaas/guides/upgrade-guide/openstack/index.html b/docs/iaas/guides/upgrade-guide/openstack/index.html new file mode 100644 index 0000000000..e88bf4e91f --- /dev/null +++ b/docs/iaas/guides/upgrade-guide/openstack/index.html @@ -0,0 +1,28 @@ + + + + + +OpenStack | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

OpenStack

Keystone

osism apply -a pull keystone
osism apply -a upgrade keystone

Glance

osism apply -a pull glance
osism apply -a rolling-upgrade glance

Designate

osism apply -a pull designate
osism apply -a upgrade designate

Placement

osism apply -a pull placement
osism apply -a upgrade placement

Cinder

osism apply -a pull cinder
osism apply -a upgrade cinder

Neutron

osism apply -a pull neutron
osism apply -a rolling-upgrade neutron

Nova

osism apply -a pull nova
osism apply -a rolling-upgrade nova

Octavia

osism apply -a pull octavia
osism apply -a upgrade octavia

Amphora image update

This step is only necessary if the Amphora Driver is used. If OVN is used as the driver, +this step is not necessary.

Amphora rotation

This step is only necessary if the Amphora Driver is used. If OVN is used as the driver, +this step is not necessary.

Horizon

osism apply -a pull horizon
osism apply -a upgrade horizon

OpenStack client

osism apply openstackclient
+ + + + \ No newline at end of file diff --git a/docs/iaas/overview/architecture/index.html b/docs/iaas/overview/architecture/index.html new file mode 100644 index 0000000000..099611a8da --- /dev/null +++ b/docs/iaas/overview/architecture/index.html @@ -0,0 +1,26 @@ + + + + + +Architecture | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/docs/iaas/overview/compute/index.html b/docs/iaas/overview/compute/index.html new file mode 100644 index 0000000000..08e657fd74 --- /dev/null +++ b/docs/iaas/overview/compute/index.html @@ -0,0 +1,26 @@ + + + + + +Compute | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/docs/iaas/overview/knowledge/index.html b/docs/iaas/overview/knowledge/index.html new file mode 100644 index 0000000000..015bfd3f0e --- /dev/null +++ b/docs/iaas/overview/knowledge/index.html @@ -0,0 +1,26 @@ + + + + + +Knowledge | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/docs/iaas/overview/network/index.html b/docs/iaas/overview/network/index.html new file mode 100644 index 0000000000..9e60ce6c7c --- /dev/null +++ b/docs/iaas/overview/network/index.html @@ -0,0 +1,26 @@ + + + + + +Network | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/docs/iaas/overview/storage/index.html b/docs/iaas/overview/storage/index.html new file mode 100644 index 0000000000..162eb524e9 --- /dev/null +++ b/docs/iaas/overview/storage/index.html @@ -0,0 +1,26 @@ + + + + + +Storage | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/docs/iam/intra-SCS-federation-setup-description-for-osism-doc-operations/index.html b/docs/iam/intra-SCS-federation-setup-description-for-osism-doc-operations/index.html new file mode 100644 index 0000000000..379d327f47 --- /dev/null +++ b/docs/iam/intra-SCS-federation-setup-description-for-osism-doc-operations/index.html @@ -0,0 +1,71 @@ + + + + + +Proposal for documentation for Keycloak to Keycloak Federation (WebSSO) | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Proposal for documentation for Keycloak to Keycloak Federation (WebSSO)

The followig section is a reasonably detailed hands on description of how +to configure a federation between two separate SCS compliant domains by means +of Keycloak Identity Brokering. If we decide to use Keycloak as a component +to allow self service by tenants, then this documentation may be a useful addition +to some tenant facing documentation (or for the SCS operators too).

OTOH one could probably also script pretty much everything of this to allow +tenants to use a CLI tool to automate the setup. For that purpose the documentation +may be useful to guide the implementation of such a scripted solution.

Detailed tutorial on how to configure Federation (OpenID Connect) between two Keycloak instances in two separate SCS domains

Assume you have two CSPs using SCS. The first one wants to grant access to users of the other. +So let's call the first domain "resource domain" and the second one "accounts domain". +Both domains need to agree upon a name for the "OIDC RP" (which Keycloak calls Clients). +The Keycloak in the "resource domain" will be the OIDC RP and the Keycloak in the "accounts domain" will be the OIDC OP. +Assuming the "resource domain" is called foo and the "accounts domain" is called bar, the name for the "OIDC RP" could be oidc-rp-foo.

  1. In the accounts domain (bar) open Keycloak realm osism, click on Clients in the sidebar and click on Create client. +Leave the client type as OpenID Connect and enter the Client ID, e.g. oidc-rp-foo. +Turn on Client authentication for it and click Save.

    On the Client details page open the tab Credentials and copy the Client secret. Communicate this to the operato of the "resource domain" foo via a secure channel.

  2. In the resource domain (foo) open Keycloak realm osism, click on Identity providers +and create a new provider definition of type OpenID Connect v1.0. As Alias choose a name, +e.g. oidc-op-bar. Don't copy the Redirect URI given at the top yet, because is will change depending +on the chosen Alias. Instead, scroll down to the mandatory field Discovery endpoint and paste +the OpenID Connect metadata URL of the KEycloak realm osism in the "accounts domain" (bar). +The operator of the "accounts domain" (bar) may easily copy that URL from the Realm Settins in the +sidebar of his Keycloak instance, where the Endpoints are listed on the bottom of that form. +The URL may have the format https://bar.com/auth/realms/osism/.well-known/openid-configuration. +Once you leave that input field, Keycloak will attempt to fetch the metadata and extract the required +details about protocol enspoints from the retrieved document. If this shows an error, it will give you +an HTTP status code. If this shows an error code of 500, then this may be caused by a failure in +certificate verification. In that case you may want to check the output of docker logs keycloak for +java stack traces. If you find any, the top of those stack traces may indicate what kind of problem +occurred to the java code. From here we will assume that the emtadata URL could be fecthed without +any issues.

    Now, go to the bottom of that form and insert tjhe Client ID (oidc-rp-foo) and the +Client secret that was provided by the operator of the "accounts domain" (bar). +Finally click on Add. From the Provider Details page on the top for the Settings tab copy the value of the +Redirect URI and communicate it back to the operator of the "accounts domain" (bar).

  3. In the accounts domain (bar) open Keycloak realm osism, click on Clients in the sidebar and click +on the name of the OIDC RP clinent that you created for domain foo (e.g. oidc-rp-foo). +On the Client details page on the tab Settings fill in the field Valid redirect URIs with the value +obtained from the resource domain (foo), which should look similar to +https://foo.com/auth/realms/osism/broker/oidc-op-bar/endpoint. Additionally the +Valid post logout redirect URIs need to be set to something like https://foo.com/auth/realms/osism/*.

  4. To test federated login in the "resource domain" (foo) open the URL of the Keycloak admin console for +the realm osism: https://foo.com/auth/admin/osism/console (or https://foo.com/auth/realms/osism/protocol/openid-connect/auth?client_id=security-admin-console). +Ignore the top section of the login form titled +Sign in to your account and choose one of the OIDC OP federation choises below the line Or sign in with. +In this example it would be oidc-op-bar. This should redirect your browser to the authentication endpoint +of the "accounts domain" (https://bar.com/auth/realms/osism/protocol/openid-connect/auth?scope=openid&...) +where you should be able to log in with credentials that are valid in the "accounts domain" (bar). +After successull authentication your broser should be redirected to admin console of the "resource domain", +which may offer you a "first login flow" form where you can choose a username, email, firstname and lastname. +The details depend on the Mappers that have been configured for the Identity Provider oidc-op-bar. +After that you will be presented with a Keycloak themed page with the error message Request failed with status code 403, +which is normal because the test account is not authorized to access any elements of the Keycloak admin console.

+ + + + \ No newline at end of file diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000000..c0450882e7 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,86 @@ + + + + + +Introduction | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Introduction

Creative Commons Attribution-ShareAlike 4.0 International

About

The Sovereign Cloud Stack combines the best of Cloud Computing in one unified standard. +SCS is built, backed, and operated by an active open-source community worldwide. +As only the sum of different repositories complete the SCS Stack, it is important to have an easy and accessible documentation in one place.

What is SCS? Why should I care?

SCS describes a standard as well as a reference implementation of this standard.

Please see our public web site and specifically +the About SCS page.

The reference implementation

Get it and test it: Testbed

The easiest way to get in touch with SCS is to deploy a SCS cloud virtually.

This means that you set up a SCS test installation including all the infrastructure +pieces such as database, message queueing, ceph, monitoring and logging, IAM, the +OpenStack core services, and (soon) the Container layer +on top of an existing +IaaS platform. Currently, only OpenStack is supported as IaaS under the SCS cloud +(so you end up using OpenStack on top of OpenStack — with nested virtualization +enabled, this performs decently). There is no fundamental limitation — just +noone has done the porting of the terraform recipes yet to AWS, libvirt, +VMware, ...

The SCS IaaS reference implementation is based on OSISM. Read on the +OSISM testbed docs to learn how to get the +testbed running. Please read carefully through the +deployment section of the +manual.

The Requirements:Cloud access subsection also lists some clouds that we have +SCS running on and test regularly.

You can easily deploy the container layer on top of the testbed (or a production +SCS cloud of course) checking out the code from +k8s-cluster-api-provider.

Existing SCS Clouds

A few production clouds are already based on SCS: betacloud and pluscloud open. +More will come soon.

CityNetwork, Open Telekom Cloud, OVH clouds are also known to support the +testbed well. (There are a few caveats with the latter two, but those are +documented and no blockers.) Read above mentioned +Requirements:Cloud access +subsections.

Development of SCS

The work done in SCS is supposed to be fed back upstream — into the relevant +CNCF projects, into OpenStack, into kolla-ansible, into OSISM and others. +An OSISM deployment thus will bring you all the SCS greatness in the base +layer. +Whenever possible SCS works directly in the upstream projects. While the SCS +projects tracks the efforts across the released in epics and userstories, +the work on the code happens upstream - as such these repositories are usually +not found in the SCS namespace.

Releases and Roadmap

Release 0 (2021-07-15)

SCS R0 has been released on 2021-07-15 and bundles the work +accomplished by the community prior to the full start of the project.

See Release Notes for R0 for more information.

Release 1 (2021-09-29)

R1 came quickly after R0 and was the first release to ship a production ready k8s stack +(with k8s cluster API), some identity federation integration and much improved +preconfiguration for monitoring and logging.

See Release Notes for R1 for more information.

Release 2 (2022-03-23)

This release delivers vast improvements for bare metal automation +and the features in the container layers.

See Release Notes for R2 for more information.

Release 3 (2022-09-21)

Release 3 features user federation, increase in deployment and upgrade +velocity by improving automated test coverage as well as bringing disk encryption +based on tang from the state of a technical preview to be fully supported.

See Release Notes for R3 for more information.

Release 4 (2023-03-22)

The implemented open source components have been updated to the latest stable versions. +Among others, this includes OpenStack Zed, Kubernetes Cluster API 1.3.x, Cluster API Provider +for OpenStack 0.7.x, Kubernetes 1.26.x, and Ubuntu 22.04 LTS.

See Release Notes for R4 for more information.

Roadmap

We have a 6 month release cadence — R4 will follow in March 2023. +Until then, we will provide bugfixes and security fixes for R3.

We do work towards a model where our partners can actually follow our main +development branches — right now, our CI needs a bit more coverage though +to make this safe.

Contribute and Connect

Please see the SCS contributor guide.

Standards, Conformity and Certification

We intend to work on a conformity test suite.

Right now, we are basically relying on upstream tests -- +RefStack (to perform +the OpenStack trademark certification +tests formerly known as DefCore) and the Kubernetes CNCF conformance tests run through +sonobuoy.

We have specific standards aligned within the SCS community +(and have also sought feedback from the broader Gaia-X and OpenStack communities).

Beyond this, we have a draft document that captures our +view on how SCS compatible environments should look like. This one has not yet +seen sufficient review to be eligible for standardization. However, we appreciate +feedback (raise issues and PRs or start discussions).

Issues and bugs

Please raise issues on github. If you can identify the affected component, +raise the issue against the relevant repository in the SovereignCloudStack +or OSISM space. Otherwise you can use +the issues repository. +Obviously we appreciate PRs even more than issues; +please don't forget to sign off your contributions (see +contributor guide ).

When reporting bugs, it is very useful to include some standard information +typically needed to analyze:

  • What state of software (SCS) were you testing? What version numbers ... ?
  • How does your environment look like (hardware, operating systems, etc.)?
  • What did you do?
  • What did you expect? What happened instead?
  • Have you done this successfully before? What changed?
  • Can this be reproduced? Occasionally? Reliably? How?
  • Any analysis you have done? Experiments and their results? Log files?

Other resources

Please check our main web page. +If you are an onboarded SCS community member, find here a link to our +nextcloud (login required).

Our community interacts through our github organization, +on mailing lists as well as +chats matrix.org:SCS.

+ + + + \ No newline at end of file diff --git a/docs/operating-scs/audits/index.html b/docs/operating-scs/audits/index.html new file mode 100644 index 0000000000..dea6fe6fb4 --- /dev/null +++ b/docs/operating-scs/audits/index.html @@ -0,0 +1,26 @@ + + + + + +Overview | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/docs/operating-scs/components/status-page/docs/component_overview/index.html b/docs/operating-scs/components/status-page/docs/component_overview/index.html new file mode 100644 index 0000000000..0188ad3ac4 --- /dev/null +++ b/docs/operating-scs/components/status-page/docs/component_overview/index.html @@ -0,0 +1,26 @@ + + + + + +Component Overview | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Component Overview

This represents a part of the decision process related to the overall structure the API wants to represent.

Color meaning:

  • Blue: Existing structure
  • Red: Deprecated / removed
  • Green: New
+ + + + \ No newline at end of file diff --git a/docs/operating-scs/components/status-page/docs/components/index.html b/docs/operating-scs/components/status-page/docs/components/index.html new file mode 100644 index 0000000000..718571b3e5 --- /dev/null +++ b/docs/operating-scs/components/status-page/docs/components/index.html @@ -0,0 +1,26 @@ + + + + + +Components | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Components

Illustrating multiple interchangable logical "layers" of possible Status Page application stacks:

Note that not everything that is shown here, actually exists or was tested. It is just shown for illustration purposes.

+ + + + \ No newline at end of file diff --git a/docs/operating-scs/components/status-page/docs/levels_of_consensus/index.html b/docs/operating-scs/components/status-page/docs/levels_of_consensus/index.html new file mode 100644 index 0000000000..8edff75c47 --- /dev/null +++ b/docs/operating-scs/components/status-page/docs/levels_of_consensus/index.html @@ -0,0 +1,27 @@ + + + + + +"Levels of consensus" | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

"Levels of consensus"

When implementing any system to be used by a group of potential users, there will be varying use cases and opinions about API's, programming languages, persistence models, authentication, authorization, deployment options and so on. +Hence, building a complete one-fits-all solution is difficult, but (while offering a pretty un-opinionated reference implementation) even finding consensus on a few basic concepts may make adaptation and integration of different solutions possible.

The "levels" of consensus could be split into:

Consensus on...

  1. Resource Definition
    • "What is an incident?"
    • Core REST API Spec
  2. General Architecture
    • "Monolithic Web App or multiple components?"
    • "Use static password file or rely on OIDC provider?"
    • (If any:) Interfaces between components:
      • AuthN mechanisms
      • AuthZ decisions
  3. Implementation of core component(s)
    • "Use reference implementation components?"
    • "Go vs. JavaScript?"
    • "Postgres vs. MySQL?"
  4. Choice of all used components
    • "Policy: Istio vs. traefik?"
    • "Deployment: Helm vs. ansible?"
    • "dex vs. keycloak vs. zitadel?"

Every user of the Status Page (API) should be able to either make full use of the full reference implementation, building little to none on their own; Or just pick core concepts/API's/automation and build partial compatibility.

E.g. while the value on agreeing on every aspect would bring the most value, this most likely is not likely to happen, but adopting only the "Resource Definition", should ideally bring value already.

+ + + + \ No newline at end of file diff --git a/docs/operating-scs/components/status-page/docs/overview/index.html b/docs/operating-scs/components/status-page/docs/overview/index.html new file mode 100644 index 0000000000..2b813732d3 --- /dev/null +++ b/docs/operating-scs/components/status-page/docs/overview/index.html @@ -0,0 +1,28 @@ + + + + + +Overview | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Overview

Service providers often times want to communicate the status of their systems transparently to their users. +A commonly used pattern is to provide a "status page" web application, where the current system health as well as recent incidents are made available.

SCS strives to implement a status page that works well, while being interoperable with other systems.

note

How was the decision to implement a new status page application made? What were the requirements? See the decision record.

To be easily interoperable with other software, being "API-first" is a priority. +As such, the status page should not need to be a typical monolithic web application (even though it could be), hence making it possible to split functionality into an API server and a frontend component.

The SCS status page API

The SCS status page API (as opposed to actual implementations) is supposed to be as un-opinionated as possible regarding deployment, user management, persistence and tech stack, to allow operators/developers (1) to make their own decisions regarding these topics and (2) to quickly implement the API with their own tech stack opinions, if the reference implementation does not fit theirs.

In particular, the API has no opinion about:

  • How authentication/authorization is done (apart from splitting Read-only from Read-write 1; See below)
  • Server implementation, used database, deployment automation, high availability

However, as un-opinionated the API (in its first iteration) strives to be, it is...:

  • a REST API (no GRPC/GraphQL/...)
  • defined using an OpenAPI file to make use of OpenAPI tooling
  • split in two parts 1:
    1. Read-only anonymous access
    2. Read-write authenticated access

Reference implementation

It is envisioned to have a well-maintained reference implementation of the status page API with some basic tech stack decisions made, to not require anyone to implement the API themselves:

  • Programming Language: Go
  • Persistence: Postgres compatible database

The SCS status page frontend

The SCS status page frontend is supposed to be an application which uses the status page API to get information. This could be an CLI tool as well as an web application.

Reference implementation

It is envisioned to have a well-maintained reference implementation of an status page frontend with some basic tech stack decisions made:

  • Platform: Web (HTML/JS/...)
  • Framework: VueJS, Vuetify

  1. In the future
+ + + + \ No newline at end of file diff --git a/docs/operating-scs/guides/guide-1/index.html b/docs/operating-scs/guides/guide-1/index.html new file mode 100644 index 0000000000..598cc5b099 --- /dev/null +++ b/docs/operating-scs/guides/guide-1/index.html @@ -0,0 +1,26 @@ + + + + + +Guide 1 | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/docs/operating-scs/incident-management/index.html b/docs/operating-scs/incident-management/index.html new file mode 100644 index 0000000000..b083697e06 --- /dev/null +++ b/docs/operating-scs/incident-management/index.html @@ -0,0 +1,26 @@ + + + + + +Overview | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/docs/operating-scs/lifecycle-management/index.html b/docs/operating-scs/lifecycle-management/index.html new file mode 100644 index 0000000000..6335ef1d57 --- /dev/null +++ b/docs/operating-scs/lifecycle-management/index.html @@ -0,0 +1,26 @@ + + + + + +Overview | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/docs/operating-scs/logging/index.html b/docs/operating-scs/logging/index.html new file mode 100644 index 0000000000..3b2640953a --- /dev/null +++ b/docs/operating-scs/logging/index.html @@ -0,0 +1,26 @@ + + + + + +Overview | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/docs/operating-scs/metering/meter_configuration/index.html b/docs/operating-scs/metering/meter_configuration/index.html new file mode 100644 index 0000000000..e78578035f --- /dev/null +++ b/docs/operating-scs/metering/meter_configuration/index.html @@ -0,0 +1,30 @@ + + + + + +Metering Configuration | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Metering Configuration

The Metrics and events we want to use in the metering process can be defined in two ways. The first one is to allow ceilometer to poll distinct metrics and events. +This can be achived by setting up ceilometers config files.

1. ceilometer metering configuration

there is the polling.yaml file that describes what metrics to poll and when. It allows to create multiple sources for the ceilometer pipeline with different metrics and intervals.

ceilometer polling +ceilometer polling metrics

1.1 polling.yaml

---
sources:
- name: billing_source # 'source name'
interval: 300 # 'how often the samples should be generated'
meters:
- "volume.size" # 'meter filter'
# - "*" # 'using all pollsters

in the event_definitions file all data structure of events are defined. If a message with a distinct event_type appears, the Fields and values from the message are matched with the Event-object.

ceilometer events +ceilometer event_definitions

1.2 event_definitions.yaml

---
- event_type: "compute.instance.*"
traits: &instance_traits
tenant_id:
fields: payload.tenant_id
user_id:
fields: payload.user_id
instance_id:
fields: payload.instance_id
display_name:
fields: payload.display_name
resource_id:
fields: payload.instance_id
cell_name:
fields: payload.cell_name
host:
fields: publisher_id.`split(., 1, 1)`
service:
fields: publisher_id.`split(., 0, -1)`
memory_mb:
type: int
fields: payload.memory_mb
disk_gb:
type: int
fields: payload.disk_gb
root_gb:
type: int
fields: payload.root_gb
ephemeral_gb:
type: int
fields: payload.ephemeral_gb
vcpus:
type: int
fields: payload.vcpus
instance_type_id:
fields: payload.instance_type_id
instance_type:
fields: payload.instance_type
state:
fields: payload.state
os_architecture:
fields: payload.image_meta.'org.openstack__1__architecture'
os_version:
fields: payload.image_meta.'org.openstack__1__os_version'
os_distro:
fields: payload.image_meta.'org.openstack__1__os_distro'
launched_at:
type: datetime
fields: payload.launched_at
deleted_at:
type: datetime
fields: payload.deleted_at
- event_type: compute.instance.create.end
traits:
<<: *instance_traits
availability_zone:
fields: payload.availability_zone
- event_type: compute.instance.update
traits:
<<: *instance_traits
old_state:
fields: payload.old_state
- event_type: compute.instance.exists
traits:
<<: *instance_traits
audit_period_beginning:
type: datetime
fields: payload.audit_period_beginning
audit_period_ending:
type: datetime
fields: payload.audit_period_ending
- event_type:
[
"volume.exists",
"volume.retype",
"volume.create.*",
"volume.delete.*",
"volume.resize.*",
"volume.attach.*",
"volume.detach.*",
"volume.update.*",
"snapshot.exists",
"snapshot.create.*",
"snapshot.delete.*",
"snapshot.update.*",
"volume.transfer.accept.end",
"snapshot.transfer.accept.end",
]
traits: &cinder_traits
user_id:
fields: payload.user_id
project_id:
fields: payload.tenant_id
availability_zone:
fields: payload.availability_zone
display_name:
fields: payload.display_name
replication_status:
fields: payload.replication_status
status:
fields: payload.status
created_at:
type: datetime
fields: payload.created_at
image_id:
fields: payload.glance_metadata[?key=image_id].value
instance_id:
fields: payload.volume_attachment[0].server_id
- event_type:
[
"volume.transfer.*",
"volume.exists",
"volume.retype",
"volume.create.*",
"volume.delete.*",
"volume.resize.*",
"volume.attach.*",
"volume.detach.*",
"volume.update.*",
"snapshot.transfer.accept.end",
]
traits:
<<: *cinder_traits
resource_id:
fields: payload.volume_id
host:
fields: payload.host
size:
type: int
fields: payload.size
type:
fields: payload.volume_type
replication_status:
fields: payload.replication_status
- event_type: ["snapshot.transfer.accept.end"]
traits:
<<: *cinder_traits
resource_id:
fields: payload.snapshot_id
project_id:
fields: payload.tenant_id
- event_type:
["share.create.*", "share.delete.*", "share.extend.*", "share.shrink.*"]
traits: &share_traits
share_id:
fields: payload.share_id
user_id:
fields: payload.user_id
project_id:
fields: payload.tenant_id
snapshot_id:
fields: payload.snapshot_id
availability_zone:
fields: payload.availability_zone
status:
fields: payload.status
created_at:
type: datetime
fields: payload.created_at
share_group_id:
fields: payload.share_group_id
size:
type: int
fields: payload.size
name:
fields: payload.name
proto:
fields: payload.proto
is_public:
fields: payload.is_public
description:
fields: payload.description
host:
fields: payload.host
- event_type:
[
"snapshot.exists",
"snapshot.create.*",
"snapshot.delete.*",
"snapshot.update.*",
]
traits:
<<: *cinder_traits
resource_id:
fields: payload.snapshot_id
volume_id:
fields: payload.volume_id
- event_type: ["image_volume_cache.*"]
traits:
image_id:
fields: payload.image_id
host:
fields: payload.host
- event_type: ["image.create", "image.update", "image.upload", "image.delete"]
traits: &glance_crud
project_id:
fields: payload.owner
resource_id:
fields: payload.id
name:
fields: payload.name
status:
fields: payload.status
created_at:
type: datetime
fields: payload.created_at
user_id:
fields: payload.owner
deleted_at:
type: datetime
fields: payload.deleted_at
size:
type: int
fields: payload.size
- event_type: image.send
traits: &glance_send
receiver_project:
fields: payload.receiver_tenant_id
receiver_user:
fields: payload.receiver_user_id
user_id:
fields: payload.owner_id
image_id:
fields: payload.image_id
destination_ip:
fields: payload.destination_ip
bytes_sent:
type: int
fields: payload.bytes_sent
- event_type: orchestration.stack.*
traits: &orchestration_crud
project_id:
fields: payload.tenant_id
user_id:
fields: ["ctxt.trustor_user_id", "ctxt.user_id"]
resource_id:
fields: payload.stack_identity
name:
fields: payload.name
- event_type: sahara.cluster.*
traits: &sahara_crud
project_id:
fields: payload.project_id
user_id:
fields: ctxt.user_id
resource_id:
fields: payload.cluster_id
name:
fields: payload.name
- event_type: sahara.cluster.health
traits: &sahara_health
<<: *sahara_crud
verification_id:
fields: payload.verification_id
health_check_status:
fields: payload.health_check_status
health_check_name:
fields: payload.health_check_name
health_check_description:
fields: payload.health_check_description
created_at:
type: datetime
fields: payload.created_at
updated_at:
type: datetime
fields: payload.updated_at
- event_type:
[
"identity.user.*",
"identity.project.*",
"identity.group.*",
"identity.role.*",
"identity.OS-TRUST:trust.*",
"identity.region.*",
"identity.service.*",
"identity.endpoint.*",
"identity.policy.*",
]
traits: &identity_crud
resource_id:
fields: payload.resource_info
initiator_id:
fields: payload.initiator.id
project_id:
fields: payload.initiator.project_id
domain_id:
fields: payload.initiator.domain_id
- event_type: identity.role_assignment.*
traits: &identity_role_assignment
role:
fields: payload.role
group:
fields: payload.group
domain:
fields: payload.domain
user:
fields: payload.user
project:
fields: payload.project
- event_type: identity.authenticate
traits: &identity_authenticate
typeURI:
fields: payload.typeURI
id:
fields: payload.id
action:
fields: payload.action
eventType:
fields: payload.eventType
eventTime:
type: datetime
fields: payload.eventTime
outcome:
fields: payload.outcome
initiator_typeURI:
fields: payload.initiator.typeURI
initiator_id:
fields: payload.initiator.id
initiator_name:
fields: payload.initiator.name
initiator_host_agent:
fields: payload.initiator.host.agent
initiator_host_addr:
fields: payload.initiator.host.address
target_typeURI:
fields: payload.target.typeURI
target_id:
fields: payload.target.id
observer_typeURI:
fields: payload.observer.typeURI
observer_id:
fields: payload.observer.id
- event_type: objectstore.http.request
traits: &objectstore_request
typeURI:
fields: payload.typeURI
id:
fields: payload.id
action:
fields: payload.action
eventType:
fields: payload.eventType
eventTime:
type: datetime
fields: payload.eventTime
outcome:
fields: payload.outcome
initiator_typeURI:
fields: payload.initiator.typeURI
initiator_id:
fields: payload.initiator.id
initiator_project_id:
fields: payload.initiator.project_id
target_typeURI:
fields: payload.target.typeURI
target_id:
fields: payload.target.id
target_action:
fields: payload.target.action
target_metadata_path:
fields: payload.target.metadata.path
target_metadata_version:
fields: payload.target.metadata.version
target_metadata_container:
fields: payload.target.metadata.container
target_metadata_object:
fields: payload.target.metadata.object
observer_id:
fields: payload.observer.id
- event_type:
[
"network.*",
"subnet.*",
"port.*",
"router.*",
"floatingip.*",
"firewall.*",
"firewall_policy.*",
"firewall_rule.*",
"vpnservice.*",
"ipsecpolicy.*",
"ikepolicy.*",
"ipsec_site_connection.*",
]
traits: &network_traits
user_id:
fields: ctxt.user_id
project_id:
fields: ctxt.tenant_id
- event_type: network.*
traits:
<<: *network_traits
name:
fields: payload.network.name
resource_id:
fields: ["payload.network.id", "payload.id"]
- event_type: subnet.*
traits:
<<: *network_traits
name:
fields: payload.subnet.name
resource_id:
fields: ["payload.subnet.id", "payload.id"]
- event_type: port.*
traits:
<<: *network_traits
name:
fields: payload.port.name
resource_id:
fields: ["payload.port.id", "payload.id"]
- event_type: router.*
traits:
<<: *network_traits
name:
fields: payload.router.name
resource_id:
fields: ["payload.router.id", "payload.id"]
- event_type: floatingip.*
traits:
<<: *network_traits
resource_id:
fields: ["payload.floatingip.id", "payload.id"]
- event_type: firewall.*
traits:
<<: *network_traits
name:
fields: payload.firewall.name
resource_id:
fields: ["payload.firewall.id", "payload.id"]
- event_type: firewall_policy.*
traits:
<<: *network_traits
name:
fields: payload.firewall_policy.name
resource_id:
fields: ["payload.firewall_policy.id", "payload.id"]
- event_type: firewall_rule.*
traits:
<<: *network_traits
name:
fields: payload.firewall_rule.name
resource_id:
fields: ["payload.firewall_rule.id", "payload.id"]
- event_type: vpnservice.*
traits:
<<: *network_traits
name:
fields: payload.vpnservice.name
resource_id:
fields: ["payload.vpnservice.id", "payload.id"]
- event_type: ipsecpolicy.*
traits:
<<: *network_traits
name:
fields: payload.ipsecpolicy.name
resource_id:
fields: ["payload.ipsecpolicy.id", "payload.id"]
- event_type: ikepolicy.*
traits:
<<: *network_traits
name:
fields: payload.ikepolicy.name
resource_id:
fields: ["payload.ikepolicy.id", "payload.id"]
- event_type: ipsec_site_connection.*
traits:
<<: *network_traits
resource_id:
fields: ["payload.ipsec_site_connection.id", "payload.id"]
- event_type: "*http.*"
traits: &http_audit
project_id:
fields: payload.initiator.project_id
user_id:
fields: payload.initiator.id
typeURI:
fields: payload.typeURI
eventType:
fields: payload.eventType
action:
fields: payload.action
outcome:
fields: payload.outcome
id:
fields: payload.id
eventTime:
type: datetime
fields: payload.eventTime
requestPath:
fields: payload.requestPath
observer_id:
fields: payload.observer.id
target_id:
fields: payload.target.id
target_typeURI:
fields: payload.target.typeURI
target_name:
fields: payload.target.name
initiator_typeURI:
fields: payload.initiator.typeURI
initiator_id:
fields: payload.initiator.id
initiator_name:
fields: payload.initiator.name
initiator_host_address:
fields: payload.initiator.host.address
- event_type: "*http.response"
traits:
<<: *http_audit
reason_code:
fields: payload.reason.reasonCode
- event_type: ["dns.domain.create", "dns.domain.update", "dns.domain.delete"]
traits: &dns_domain_traits
status:
fields: payload.status
retry:
fields: payload.retry
description:
fields: payload.description
expire:
fields: payload.expire
email:
fields: payload.email
ttl:
fields: payload.ttl
action:
fields: payload.action
name:
fields: payload.name
resource_id:
fields: payload.id
created_at:
type: datetime
fields: payload.created_at
updated_at:
type: datetime
fields: payload.updated_at
version:
fields: payload.version
parent_domain_id:
fields: parent_domain_id
serial:
fields: payload.serial
- event_type: dns.domain.exists
traits:
<<: *dns_domain_traits
audit_period_beginning:
type: datetime
fields: payload.audit_period_beginning
audit_period_ending:
type: datetime
fields: payload.audit_period_ending
- event_type: trove.*
traits: &trove_base_traits
instance_type:
fields: payload.instance_type
user_id:
fields: payload.user_id
resource_id:
fields: payload.instance_id
instance_type_id:
fields: payload.instance_type_id
launched_at:
type: datetime
fields: payload.launched_at
instance_name:
fields: payload.instance_name
state:
fields: payload.state
nova_instance_id:
fields: payload.nova_instance_id
service_id:
fields: payload.service_id
created_at:
type: datetime
fields: payload.created_at
region:
fields: payload.region
- event_type:
[
"trove.instance.create",
"trove.instance.modify_volume",
"trove.instance.modify_flavor",
"trove.instance.delete",
]
traits: &trove_common_traits
name:
fields: payload.name
availability_zone:
fields: payload.availability_zone
instance_size:
type: int
fields: payload.instance_size
volume_size:
type: int
fields: payload.volume_size
nova_volume_id:
fields: payload.nova_volume_id
- event_type: trove.instance.create
traits:
<<: [*trove_base_traits, *trove_common_traits]
- event_type: trove.instance.modify_volume
traits:
<<: [*trove_base_traits, *trove_common_traits]
old_volume_size:
type: int
fields: payload.old_volume_size
modify_at:
type: datetime
fields: payload.modify_at
- event_type: trove.instance.modify_flavor
traits:
<<: [*trove_base_traits, *trove_common_traits]
old_instance_size:
type: int
fields: payload.old_instance_size
modify_at:
type: datetime
fields: payload.modify_at
- event_type: trove.instance.delete
traits:
<<: [*trove_base_traits, *trove_common_traits]
deleted_at:
type: datetime
fields: payload.deleted_at
- event_type: trove.instance.exists
traits:
<<: *trove_base_traits
display_name:
fields: payload.display_name
audit_period_beginning:
type: datetime
fields: payload.audit_period_beginning
audit_period_ending:
type: datetime
fields: payload.audit_period_ending
- event_type: profiler.*
traits:
project:
fields: payload.project
service:
fields: payload.service
name:
fields: payload.name
base_id:
fields: payload.base_id
trace_id:
fields: payload.trace_id
parent_id:
fields: payload.parent_id
timestamp:
type: datetime
fields: payload.timestamp
host:
fields: payload.info.host
path:
fields: payload.info.request.path
query:
fields: payload.info.request.query
method:
fields: payload.info.request.method
scheme:
fields: payload.info.request.scheme
db.statement:
fields: payload.info.db.statement
db.params:
fields: payload.info.db.params
- event_type: "magnum.cluster.*"
traits: &magnum_cluster_crud
id:
fields: payload.id
typeURI:
fields: payload.typeURI
eventType:
fields: payload.eventType
eventTime:
type: datetime
fields: payload.eventTime
action:
fields: payload.action
outcome:
fields: payload.outcome
initiator_id:
fields: payload.initiator.id
initiator_typeURI:
fields: payload.initiator.typeURI
initiator_name:
fields: payload.initiator.name
initiator_host_agent:
fields: payload.initiator.host.agent
initiator_host_address:
fields: payload.initiator.host.address
target_id:
fields: payload.target.id
target_typeURI:
fields: payload.target.typeURI
observer_id:
fields: payload.observer.id
observer_typeURI:
fields: payload.observer.typeURI
- event_type: "alarm.*"
traits:
id:
fields: payload.alarm_id
user_id:
fields: payload.user_id
project_id:
fields: payload.project_id
on_behalf_of:
fields: payload.on_behalf_of
severity:
fields: payload.severity
detail:
fields: payload.detail
type:
fields: payload.type

The event_pipeline can be used to filter events and pipeline them to different publishers. +the notifier publisher is the message queue broadcasster (RabbitMQ).

1.3 event_pipeline.yaml

---
sources:
- name: event_source # 'source name'
events:
- "*" # 'event filter'
sinks:
- event_sink # 'sink name'
sinks:
- name: event_sink # 'sink name'
publishers: # 'list of publishers'
- notifier://
- http://localhost:8088/post_json

The pipeline.yaml can be used to filter and pipeline all metrics and events since events send via the notifier also appears in the meters and send them to different publishers.

In our case we want to push to the metering api.

1.4 pipeline.yaml

---
sources:
- name: meter_source
meters:
- "*"
sinks:
- meter_sink
sinks:
- name: meter_sink
publishers:
- gnocchi://?archive_policy=ceilometer-low&filter_project=service
- http://localhost:8088/post_json
+ + + + \ No newline at end of file diff --git a/docs/operating-scs/monitoring/index.html b/docs/operating-scs/monitoring/index.html new file mode 100644 index 0000000000..d3ba415c97 --- /dev/null +++ b/docs/operating-scs/monitoring/index.html @@ -0,0 +1,26 @@ + + + + + +Overview | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/docs/operating-scs/overview/index.html b/docs/operating-scs/overview/index.html new file mode 100644 index 0000000000..c857a11c8b --- /dev/null +++ b/docs/operating-scs/overview/index.html @@ -0,0 +1,26 @@ + + + + + +Overview | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/docs/releases/Release0/index.html b/docs/releases/Release0/index.html new file mode 100644 index 0000000000..0426c325ee --- /dev/null +++ b/docs/releases/Release0/index.html @@ -0,0 +1,54 @@ + + + + + +Release Notes for SCS Release 0 | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Release Notes for SCS Release 0

(Release Date: 2021-07-15)

Scope

The main focus of R0 is to demonstrate the viability of our approach to a much broader +audience by providing a well-documented testbed. This will allow anyone interested +to study the system in real-life, test, contribute, compare, ... it.

Also we learn performing the release process.

Features

Fully automated virtual (testbed setup) with ansible (terraform bootstrap to create +storage, networking and VM resources for bootstrapping via cloud-init injected +scripts that call ansible).)

The infrastructure, management and openstack services are all deployed in containers.

Included tools for Operations: ARA, Netbox, Cockpit, Netdata, Skydive (opt-in), +Patchman, phpMyAdmin, Elasticsearch (b/f license change), Kibana, Grafana, influxdb

Validation: Rally, Refstack

Infrastructure: Linux, KVM, ceph (pacific), OpenVSwitch, OVN, MariaDB, RabbitMQ, Redis, +Etcd, HAproxy, Keepalived, Memcached, Keycloak

IaaS (OpenStack - Wallaby): keystone, nova, glance, cinder, neutron, octavia, horizon

Optional OpenStack services: designate, heat, gnocchi, ceilometer, aodh, panko, senlin, +barbican, manila, magnum

See testbed SBOM for +a complete list. The exact versions of the contained components can be retrieved from the +release repo of OSISM.

Get SCS

See main README.

Known Bugs

Nothing major known yet.

Technical Previews

While already in productive use (on bare metal) by two providers, the bare metal +setup currently has a few more manual steps than we would like. This will improve +with the next releases.

We have worked hard on supporting identity federation (OIDC and SAML) during the last +few months. We have also spent significant effort on getting the k8s stack with +k8s cluster API into a good shape. However, we have determined that we do not +yet consider those two key pieces as production-ready. The goal is to change that +for R1 (see below).

For now, you can use the software to see where SCS is going and test our technical +preview code. We really appreciate feedback we get on these pieces as well. +However keep in mind that we do not guarantee to ship technical previews from +a Release as production-ready software in one of the next releases. We certainly +hope to do so.

To test how our k8s aaS platform will look like, have a look at +https://github.com/SovereignCloudStack/k8s-cluster-api-provider +You can follow the documentation to set up the k8s cluster API on an SCS +cloud (or other well configured OpenStack clouds that support octavia).

The openstack-health-monitor +is used by us to monitor that the API works and successfully creates working resources +in finite time. We plan to integrate it with a dashboard and an alarming mechanism in +the next releases.

Release tagging

See Release Numbering scheme. +The containers have version number v1.0.0 for R0.

Updates

Updating the software can conveniently be done from the manager node by running the +ansible playbooks again. Details are in the +OSISM testbed documentation.

Bug reporting

See main README file.

+ + + + \ No newline at end of file diff --git a/docs/releases/Release1/index.html b/docs/releases/Release1/index.html new file mode 100644 index 0000000000..da40466c5c --- /dev/null +++ b/docs/releases/Release1/index.html @@ -0,0 +1,112 @@ + + + + + +Release Notes for SCS Release 1 | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Release Notes for SCS Release 1

(Release Date: 2021-09-29)

Scope

Main goals for Release 1 (R1) was the strengthening of our CI test coverage and +integration, the operational tooling (metrics collection, dashboards, logging), +latest versions of upstream software (OpenStack Wallaby, Kubernetes-1.21.5), +support for Bare Metal service, progress on user federation for clouds, and +progress on the integration of the container layer with k8s Cluster API (now in +version 0.4.x).

CI framework

Zuul-CI

For our internal development workflows we are planning to switch from GitHub +Actions to Zuul-CI (mostly). The infrastructure itself is already available, +yet most of the repositories in the SovereignCloudStack organisation have not +switched over. Reasons for switching include cross-dependencies, scalability +and costs. Reasons for using Zuul-CI include the close connection to the +OpenStack project and the enormous flexibility in comparison to other similar +tools. On top of that you have also gating instead of only CI. A quick example +for a Zuul-CI operated repository can be found here: +https://github.com/SovereignCloudStack/zuul-sandbox.

Metrics collection and dashboards

Prometheus exporters and Grafana dashboards

We provide generic configuration examples and blueprints for prometheus rules +and grafana dashboards. The examples need to be understood and adapted to the +particular needs of your environment. You can find the examples at +https://github.com/osism/kolla-operations.

With R2 we plan to implement a basic set of these alerts and dashboards in the +testbed deployment in order to make them even easier consumable for new users. +Feel free to give feedback on the examples and contribute your own generic +examples.

We're working on bringing a basic set of prometheus exporters to the +OpenStack-kolla upstream community.

As part of our effort to add more monitoring tooling, we're integrating further +prometheus exporters such as +libvirt and +ovn. Integration is +targeted for R2.

More detailed information on monitoring topics will be continously provided in +the corresponding design document.

openstack-health-monitor

We have made some progress with openstack-health-monitor since R0, but we have +not yet created ready-to-be-used influx data collection and the grafana +dashboard. While the black box monitoring is perceived as very useful, the +script certainly has reached a complexity that is not handled well with bash +scripting and makes it a difficult to maintain and even to use tool, so the +usefulness of shipping it with SCS to make it available for Ops teams to +monitor has been questioned. Instead an expectation has been expressed that the +SCS uses this to monitor all SCS partner clouds and provides some transparency +this way to the public -- and detailed statistics via e.g. a prometheus +exporter to the respective cloud provider. This is currently under consideration.

Logging

Central logging

OSISM now enables kolla-ansible centralized logging by default. The default +rules need to be further refined to suit your needs. We plan to implement a +more generic set of rules for R2.

Federation

OIDC support via keycloak

Logging in to Horizon by authenticating with OIDC via Keycloak is now possible. +For details see the testbed documentation.

non-TLS restrictions (testbed)

Only TLS secured deployments get full support. +Without TLS, certain browsers won't be able to log in. +For deatils see the testbed documentation

Known Issue with OIDC Logout

Clicking Sign Out on the Horizon dashboard doesn't perform +a proper OIDC logout. This is documented in osism testbed, +with some Keycloak settings that can be relevant for alleviating the issue, +but in Release 1 there is no solution for this yet.

Bare Metal Service

The ironic Bare Metal service can be deployed with the SCS (OSISM) +installation. For it to get full test coverage, a virtual BMC +solution has been created, so bare metal can be validated in our testbed +setup just as nicely as the other components. While most pieces +are ready, the final integration steps are still work-in-progress +and will happen after R1.

Container Layer

Overview and Goals for R1

The container layer on SCS is implemented as a Self-Service, +leveraging the Kubernetes cluster API +technology. This was provided as a technical preview from the +SCS k8s-cluster-api-provider +repository for R0 back in July.

The focus for R1 was to make it ready for production, so DevOps teams can +use this to create and manage their k8s clusters in self-service for +development, testing, deployment and production.

To achieve this, a lot of work has been invested, updating the +cluster API to 0.4 along the way, fixing snapshot classes, enabling +optional metrics and ingress services, using application credentials +and much improved management scripts. The sonobuoy test automation has +been included and successfully used to validate the created clusters. +Real-world testing has happened though the Gaia-X Hackathon #1, where +clusters were provided on the fly for the various work streams.

The detailed list of changes for R1 is covered in the +k8s capi provider Release Notes.

Still in technical preview, but very promising are the helm charts +based k8s cluster management templates also documented there.

Beyond CAPI

Some of our partners are using Gardener as a layer to manage +large fleets of (optionally cross-cloud) k8s clusters. While there is a bit of +overlap in functionality, they do happily coexist and our partner is actually +using k8s capi to bootstrap clusters on SCS clouds for Gardener management.

Standardization

As of this writing, the list of SCS defined standards still comprises +two standards:

As before, we continue to rely on OpenStack and CNCF defined standards +in addition to this -- the k8s clusters need to pass the conformance +tests with sonobuoy and the OpenStack environment the OpenStack powered +guidelines (with refstack).

There is a discussion on a glossary, detailing what we expect from regions, +availability zones etc. Some major parts of it still need to be agreed +before a useful doc can be published -- this will happen in due time and +is expected before R2.

We stand on the shoulders of giants: +Without all the great work from many open source communities, we would +not get anywhere.

We are working on automation to create a complete list for all the software +that is used and deployed with SCS, so we have a complete Software Bill +of Materials (SBoM). The reason this is non-trivial is that we are not +aggregating it all ourselves, but rely on pre-integrated pieces, such +as Linux distributions, OpenStack, CNCF projects etc. The good news is +that these projects are diligent in their work, making sure we don't need +to be too worried about security risks or legal risks introduced this way. +Nevertheless, the goal of creating a complete graph remains.

We have started to put SPDX license identifiers into the SCS produced +code, so we make it easier for downstream consumers of our software to +automate the license compliance checks when assembling an SBoM.

For R1, some of the major projects we build on have had releases that we +incorporated and whose release notes we want to link here for convenience:

Release tagging

See Release Numbering scheme -- unchanged from R0. +We have added the tag v2.0.0 to the relevant repositories to designate the SCS_RELEASE_R1.

List of known issues & restrictions in R1

+ + + + \ No newline at end of file diff --git a/docs/releases/Release2/index.html b/docs/releases/Release2/index.html new file mode 100644 index 0000000000..0c8b298492 --- /dev/null +++ b/docs/releases/Release2/index.html @@ -0,0 +1,101 @@ + + + + + +Release Notes for SCS Release 2 | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Release Notes for SCS Release 2

(Release Date: 2022-03-23)

Scope

Main goals for Release 2 (R2) were massive improvements in bare +metal deployment and our cluster management layer gaining the +ability to handle many clusters independently with a number +of optional services.

Component Versions and User-visible improvements (highlights)

  • We support the latest Kubernetes 1.22 and +1.23 releases.

  • The Kubernetes Cluster API is now available in a stable v1beta1 +release 1.0.x +with the corresponding cluster-api-provider-openstack 0.5.x.

  • There are a number of new standard services available for the +k8s capi +managed clusters, amongst which cert-manager and flux. The clusters +have better default settings for the nginx-ingress, anti-affinity +for the nodes and the ability to chose cilium over calico and +to have stable multi-controller node setups on clouds without +low-latency local storage. +Please consult the +k8s capi provider release notes +for more details.

  • OpenStack Xena release

    • We have also enabled SPICE support in addition to noVNC to +access the graphical console of VMs.
  • The base infrastructure is provided by +OSISM 3.0.0 +which in turn build on top of kolla and kolla-ansible.

New Features (Highlights)

Operator focused improvements

  • The Cluster Management Node is now well prepared to manage numerous +clusters with independent settings and different feature sets by +creating default settings and then keeping track of various workload +clusters in own directories. Documentation has been vastly improved.

  • The Cluster Management node now gets its artifacts directly from +git, making incremental updates to it a lot easier, thus also +avoiding to disrupt workload clusters through redeployed management +nodes to roll out updates.

  • Added dashboards for the operators:

    • Homer
    • Flower
    • Grafana dashboards
  • Work is underway to supersede openstack-health-monitor +with a solution that is using tempest and rally. The health-monitor +has received improvements though and is at this point still fully +supported and recommended -- it has surfaced a number of issues with +test clouds, especially failed metadata services.

  • User federation has been prepared to be ready for Gaia-X federation integration

    • Keystone can consume users from Keycloak via OpenID-Connect
    • Keycloak uses the highly-available Galera database cluster now
    • mod_oauth2 support for Keystone
  • Vast improvements in the SCS Deployment automation

    • Full automation of bare metal deployment with Bifrost and Ironic
    • Using NetBox as central source of truth for the complete setup
  • New services available (opt-in)

    • ClamAV, dnsdist, cgit, FRRouting, Nexus, Tang
  • Traefik centrally routes the connections to Nexus, NetBox, phpMyAdmin, Homer, Flower, ARA, cgit

SCS Developer focused improvements (testbed)

We now have scripts that allow us to connect to the workload cluster node network +for debugging purposes.

The configuration of the testbed was minimized and the deployment was made more production-oriented.

Further noteworthy improvements to testbed:

  • TLS is implemented throughout the services also in testbed
  • Virtual BMC in testbed
  • Public DNS for testbed (testbed.osism.xyz)

We have a Zuul CI framework running and started migrating CI testing from github actions to +using our Zuul infrastructure.

Renovate is being used to keep the pinned versions up-to-date and consistent across the +many repositories.

An overview over the used software versions is available from the +OSISM release repository as input +for a complete SBOM. This allows to e.g. investigate the contents of the +used (v3.0.0) images.

Upgrade/Migration notes

Cluster Management

The names of a few settings have changed since R1 -- if you have diverged from the defaults, +this may require adjusting the environment.tfvars or the clusterctl.yaml files. +See k8s-cluster-api-provider Release Notes +for more details.

The updating approach has fundamentally changed: +If you were used to deploy fresh management nodes regularly to +benefit from the upstream improvements, this need has been vastly reduced now, +allowing for long-living management nodes and workload clusters managed by them.

OSISM

  • Playbook generic-configuration.yml was deprecated. From now on, please use the playbook of +the same name in the manager environment (manager-configuration.yml). All configuration +parameters from environments/configuration.yml should be moved to environments/manager/configuration.yml.

  • In kolla-ansible the haproxy role was renamed to loadbalancer. Accordingly, loadbalancer must now be +used for the deployment of HAProxy.

Removals

  • OpenStack Victoria images are no longer built and thus no longer kept updated
  • Support for Zabbix has been removed, Prometheus will be used as the only monitoring stack in the future
  • Heimdall as a service was removed, as an alternative Homer is now available

Deprecations

Deprecations happen according to our deprecation policy.

  • Cockpit is deprecated in favor of Boundary by HashiCorp or Teleport
  • ceph-ansible is deprecated in preparation for cephadm
  • All osism- scripts on the manager are deprecated and will be replaced by the new OSISM CLI. The scripts will be removed in the next release
  • The following services are currently not used and are deprecated and scheduled for removal as of now: Falco, Jenkins, Rundeck, Lynis, Trivy
  • Heat will no longer be offered by default in the testbed in the future
  • The docker-compose CLI will be removed and replaced by the new compose plugin for Docker. +docker-compose is then no longer available and docker compose must be used instead

Security Fixes

  • The Elasticsearch container included in OSISM testbed was exposed to the log4j +issue -- new images were provided for addressing this. See the +security advisory

Resolved Issues

  • The nginx-ingress loadbalancer could run into name conflicts before. +The loadbalancer now uses a health monitor to avoid routing to the wrong +nodes, which typically resulted in 10s delays when connecting to the service +behind the ingress controller.

  • cAdvisor has now reduced number of Prometheus metrics and labels exported by +default - this will ease the load on the system. +This implies that corresponding time series data will no longer be created.

Standards Conformance

The clusters created with our cluster-API cluster management solution pass +the CNCF conformance tests +as reported by sonobuoy.

The OpenStack layer passes the +OIF trademark tests, so cloud providers +leveraging the stack should easily be able to achieve the +"OpenStack powered compute" +trademark certification.

Our partner plusserver has achieved +a BSI C5 +security certification for their SCS implementation pluscloud open.

We are working within Gaia-X to further the power +of Gaia-X self-descriptions and are closely working with the +GXFS project +to jointly deliver a standard toolbox for Gaia-X compliant +infrastructure and service offerings.

The SCS standards for flavor naming and +image metadata +are largely unchanged since R1. We have however +made progress in our reference implementation fully implementing +them without any further tweaks.

Release Tagging

See Release Numbering scheme -- unchanged from R0. +We have added the tag v3.0.0 to the relevant repositories to designate the SCS_RELEASE_R2.

Note that we will release R3 (v4.0.0) in September 2022 and stop providing maintenance +updates for R2 at the end of October.

List of known issues & restrictions in R2

Future directions (selected Highlights)

Alongside with R2 we published a blog post on some first thoughts on +future directions towards R3.

Contributing

We appreciate contribution to strategy and implementation, please join +our community -- or just leave input on the github issues and PRs. +Have a look at our contributor guide. +We also have worked on a Code of Conduct +to document the expected behavior of contributors and how we deal with +cases where individuals fail to meet the expectation.

+ + + + \ No newline at end of file diff --git a/docs/releases/Release3/index.html b/docs/releases/Release3/index.html new file mode 100644 index 0000000000..b26405f6cf --- /dev/null +++ b/docs/releases/Release3/index.html @@ -0,0 +1,112 @@ + + + + + +Release Notes for SCS Release 3 | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Release Notes for SCS Release 3

(Release Date: 2022-09-21)

Scope

Main goals for Release 3 (R3) were user federation, increase in deployment and upgrade +velocity by improving automated test coverage as well as bringing disk encryption based on +tang from the state of a technical preview to be fully supported.

Component Versions and User-visible improvements (highlights)

New Features (Highlights)

Operator focused improvements

  • Work is underway to supersede openstack-health-monitor +with a comprehensive approach using scenarios with ansible playbooks +that has been developed and used by T-Systems for their Open Telekom Cloud. +Meanwhile, openstack-health-monitor has seen the addition of data +collection with telegraf and influxdb as well as a good dashboard +with grafana.

  • We have used our keystone to keycloak federation to use keycloak as identity +broker to federate identities from other (SCS) clouds' keycloaks. +This works well for the Web-Interface; we have still some work to do to also make it smooth +also for API/CLI usage. We have documented the current status

  • We believe that Gaia-X self-descriptions should also contain a description of +technical properties of services; higher-level services and workloads can than +declare their requirements and be matched against lower level services / platforms. +In good platforms, most (or all) technical properties are discoverable. In the +Gaia-X Hackathon #4, we have worked on a demonstrator that characterizes some +aspects of an OpenStack-based IaaS platform and which produces self-descriptions +that can be submitted to the Gaia-X trust service, pass the tests and you can +be awared a verifiable credential. Code is available in the +gx-self-description-generator repo

SCS Developer focused improvements (testbed and k8s cluster management)

  • Following significant discussions on how to standardize our cluster management solution, +there is a draft concept as part of R3 now, which will be further worked on during +the R4 cycle. See Cluster standardization +section of the release notes from k8s-cluster-api-provider. +While our reference implementation uses the concepts and code from k8s cluster API on +top of our SCS reference implementation (OpenStack automated by OSISM), we want to +assure that non-OpenStack IaaS and solutions that diverge from cluster-API have the possibility +to be SCS compliant.

  • Workload clusters managed by our SCS cluster management solutions can now much +more easily receive k8s version upgrades, as the cluster-template no longer needs +to be touched for this. There is an Upgrade Guide available now.

  • LUKS encryption is now documented and enabled in the testbed by default.

  • Further noteworthy improvements to testbed:

    • Public DNS for testbed is now available (testbed.osism.xyz), allowing to access services +via TLS protected by a wildcard CA certificate.
    • The wireguard VPN service is deployed in the testbed by default.

An overview over the used software versions is available from the +OSISM release repository as input +for a complete SBOM. This allows to e.g. investigate the contents of the +used (v4.0.0) images.

Upgrade/Migration notes

Cluster Management

Upgrade from R2 to R3 for cluster management and clusters: +See k8s-cluster-api-provider Release Notes +for more details. There is an Upgrade Guide written specifically to address the steps needed for upgrading +your cluster management and the workload clusters.

OSISM

  • In environments/kolla/secrets.yml the parameter neutron_ssh_key must be +added.

    neutron_ssh_key:
    private_key:
    public_key:

    The ssh key can be generated as follows: ssh-keygen -t rsa -b 4096 -N "" -f id_rsa.neutron -C "" -m PEM

Removals

  • The Cockpit service has been removed.

Deprecations

Deprecations happen according to our deprecation policy.

  • Linux bridge support has been deprecated by the Neutron team and marked as experimental. +If Linux bridge is used in deployments, migrating to OpenVSwitch is recommended.
  • Debian dropped hddtemp (https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1002484), +therefore the hddtemp service will be removed from the next OSISM release, as there is +no package available for Ubuntu 22.04.
  • Heat will no longer be offered by default in the testbed in the future
  • The following services are currently not used and are deprecated and scheduled for removal as of now: Falco, Jenkins, Rundeck, Lynis, Trivy
  • The docker-compose CLI will be removed and replaced by the new compose plugin for Docker. +docker-compose is then no longer available and docker compose must be used instead
  • The cleanup-elasticsearch playbook is deprecated. In the future, +the elasticsearch-curator service (part of Kolla) has to be used +for Elasticsearch cleanup.
  • All osism- scripts on the manager are deprecated and will be replaced by the new OSISM CLI. The scripts will be removed in the next release

Security Fixes

No severe security issues need to be highlighted since Release 2. However, by updating to the latest stable version of +the integrated open source components, we benefit from the upstream security fixes and thus recommend to upgrade all +SCS environments. Please note that Release 2 maintenance by the SCS project team will end by the end of October.

Resolved Issues

  • Certificates in k8s clusters are subject to expiration - typically after one year. +We ensure these are renewed on control-plane upgrades, but operators may need manual attention +in case upgrades are not performed for extended periods of time. This is documented in +the k8s-cluster-api-provider's +Maintenance and Troubleshooting Guide.

Standards Conformance

The clusters created with our cluster-API cluster management solution pass +the CNCF conformance tests +as reported by sonobuoy.

The OpenStack layer passes the +OIF trademark tests, so cloud providers +leveraging the stack should easily be able to achieve the +"OpenStack powered compute" +trademark certification.

Our partner plusserver has achieved +a BSI C5 +security certification for their SCS implementation pluscloud open.

We are working within Gaia-X to further the power +of Gaia-X self-descriptions and are closely working with the +GXFS project +to jointly deliver a standard toolbox for Gaia-X compliant +infrastructure and service offerings.

The SCS standards for flavor naming and +image metadata +are largely unchanged since R1. We have however +made progress in our reference implementation fully implementing +them without any further tweaks. The +conformance test for the flavor naming +has seen minor improvements; a +conformance test for the image metadata +has been added.

Release Tagging

See Release Numbering scheme -- unchanged from R0. +We have added the tag v4.0.0 to the relevant repositories to designate the SCS_RELEASE_R3.

Note that we will release R4 (v5.0.0) in March 2023 and stop providing maintenance +updates for R3 at the end of April 2023.

List of known issues & restrictions in R3

  • Distributed Virtual Routing (DVR) is not officially supported by OSISM, not tested and not recommended.

Contributing

We appreciate contribution to strategy and implementation, please join +our community -- or just leave input on the github issues and PRs. +Have a look at our How to contribute page.

Thanks

The work for R3 has been done by many contributors from our community. +We have not collected detailed stats that would split out the individual contributor's +and companies shares ... we may do so in the future. We are grateful to have such an +active and engaged community that has done so much work! Thanks to our contributors!

Of course we are leveraging a huge amount of open source technology that has been +created by our friends in other communities, many of which are part of the +CNCF, Linux Foudation, OIF, and others. We participate and contribute where +we can and definitely want to acknowledge the great work that we build upon.

+ + + + \ No newline at end of file diff --git a/docs/releases/Release4/index.html b/docs/releases/Release4/index.html new file mode 100644 index 0000000000..21f17db04e --- /dev/null +++ b/docs/releases/Release4/index.html @@ -0,0 +1,52 @@ + + + + + +Release Notes for SCS Release 4 | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Release Notes for SCS Release 4

(Release Date: 2023-03-22)

Scope

Release 4 has been developed alongside a set of associated outcomes. These outcomes are comprised of:

  • SCS is standardized
  • SCS is federated
  • SCS is continuously built and tested
  • SCS is understandable
  • SCS enables Operators with an excellent toolbox

The SCS project is completely developed in the open, based on the principles of the four opens. Due to this a lot of our work can be tracked and used continuously without waiting for the half-year releases. Especially, but not limited to, this includes our efforts in regards to documentation and our standards.

One of the major highlights that happened in the R4 development cycle is our work on assuring SCS is understandable. +Be sure to look at our new documentation entry point. +We have created a systematic approach to structure documentation which already has been implemented for the OpenStack Image Manager, +the OSISM testbed and the K8s Cluster API Provider. More will follow in a continuous manner.

Our community has created a growing amount of blog articles which also help to understand the SCS project, its community and the technology that is worked on.

Component Versions and User-visible improvements (highlights)

  • OpenStack Zed release
  • Ceph Quincy is available, the default release of Ceph is still Pacific.
  • The base infrastructure is provided by +OSISM 5.0.0 +which in turn builds on top of kolla and kolla-ansible.
  • With Cloud-in-a-Box there is an easy way to get SCS up and running on a single hardware node as a test environment. There are two blog posts (part 1 and part2) covering it.
  • For new deployments of the IaaS reference implementation Ubuntu 22.04 is recommended while existing installations can be upgraded to R4 while staying on Ubuntu 20.04. With Release 5, upgrading to Ubuntu 22.04 will be required.
  • With osism/node-image an iso image for much easier bootstrapping of new OSISM environments is available now
  • The software for our Kubernetes Cluster-API reference implementation has been updated and highlights are covered in own release notes.

New Features (Highlights)

Operator focused improvements

  • The Openstack Image Manager has seen many improvements and is the reference command to assure the images available comply with the SCS Image Standard
  • For Ceph, special playbooks were added to validate the deployment status of the OSD, MON and MGR services in OSISM. The commands for use are osism validate ceph-osds, osism validate ceph-mons, and osism validate ceph-mgrs.
  • OVN has been updated to version 22.09.
  • OVS has been updated to version 3.0.1.
  • The testbed uses per default a proxy for container pulling. This will allow for airgapped installations out of the box. Please note: a full airgap support (with local mirrors, etc.) will follow in a future release.
  • The efforts to create a well-maintained status page with well-defined interfaces resulted in an OpenAPI specification (within its own repository) which is intended to be implementable by multiple implementations.
  • The dashboard of the OpenStack Health Monitor is in use by the SCS operators and has proven helpful a number of times in detecting and addressing issues. That said, it only received a few fixes and minor enhancements, as we plan to replace it with a more generic and more maintainable solution soon.
  • The k8s clusters built with our k8s-capi implementation now allow controlling the versions of more components; the latest tested and stable versions are used by default (if enabled). The latest version for the cilium CNI for example allows testing the upcoming k8s gateway API.
  • The k8s cluster now allows filtering access to the kubernetes API by IP ranges.
  • The k8s clusters now have the proxy protocol enabled with the nginx-ingress controller, so client IPs are visible; the previous issue that blocked internal access could be worked around.

SCS Developer focused improvements (testbed and k8s cluster management)

  • The testbed has been significantly simplified for new operators and developers and a Quick Start guide has been added.

Upgrade/Migration notes

  • For the IaaS reference implementation, please refer to the OSISM 5.0.0 Upgrade Notes.
  • The k8s Cluster Management solution has an enhanced upgrade guide that covers the upgrade of clusters as well as the upgrade of the cluster management server.

Removals

  • The ospurge wrapper script has been removed from the osism.services.openstackclient role. The ospurge project is no longer compatible with the current OpenStack SDK. The command openstack project purge can be used as an alternative.
  • The docker-compose package is uninstalled by the osism.commons.docker_compose role. The Compose v2 plugin for Docker is now used instead of the old standalone docker-compose CLI. A dummy script has been added to /usr/local/bin which displays a corresponding message when using docker-compose.
  • Further removals from the IaaS reference implementation, please refer to the OSISM 5.0.0 Removals Section.
  • The k8s cluster parameter ETCD_PRIO_BOOST that was already unused has been removed as announced with R3.

Deprecations

Deprecations via OSISM

For these please also refer to the upstream deprecation notices

  • The role osism.services.bird is deprecated. In future, FRRouting (osism.services.frr) will be used.
  • The role osism.services.minikube is deprecated. In future osism.services.k8s will be used.
  • Heat is deprecated in favor of more generic Infrastructure as Code tools like Terraform as of now and will be removed in the future (exact removal date is not yet known)
  • Swift (currently available as Technical Preview) will be removed in favor of Ceph RGW
  • Trove (currently available as Technical Preview) will be removed in favor of Kubernetes database operators
  • Skydive (currently available as Technical Preview) will be removed in the future, the project is not maintained anymore, last commit is 8th Jan 2022 (https://review.opendev.org/c/openstack/kolla/+/869191)
  • The login to a registry with the osism.services.docker role is deprecated in favor of the new osism.commons.docker_login role.

Security Fixes

Throughout the Release 4 development cycle, the SCS project issued two security advisories for upstream components:

Fixes were delivered via maintenance updates to existing R3 deployments, but of course also included in the main development branch that became R4.

Resolved Issues

  • Breakage with old kustomize syntax has been addressed.(k8s-capi/#328)
  • The move of k8s container images from k8s.gcr.io to registry.k8s.io needed adjustments.(k8s-capi/#321)

Standards Conformance

The last months saw intense work in the standardization area. The process how standards are created has been documented. +The standards are collected in its own standards repository. +A machine readable file lists the required (and optional) standards that apply to "SCS-compatible" conformance at +the IaaS and the Container (KaaS) layer. The referenced executables are used by the compliance checking framework +to test existing implementations for compliance. To run the checker, the tester needs access to the infrastructure +under test (normal user privileges are sufficient) and standard openstack and kubernetes client tools -- or just +use the docker container that is provided.

The public clouds based on the SCS reference implementation from plusserver and Noris/Wavecon are tested automatically +from us and the live result is visible in standards page. +We will enhance the standardization and test coverage significantly in the next months and we hope to list a number +of more clouds there soon.

Release Tagging

The code in OSISM and a number of SCS repositories will receive the v5.0.0 tag; some repositories use +maintained/v5.0.x and maintained/v5.x branches for providing code that only gets bug- and security fixes (5.0.x) +or only those plus selected, backwards-compatible enhancements (5.x).

List of known issues & restrictions in R4

  • The k8s cluster-API code does not work well with OpenStack API endpoints that require trusting a custom CA.
  • The OpenStack component Horizon has two issues when working with Swift endpoints. One issue is a known bug when uploading objects to Swift endpoints. A workaround will be released shortly after R4. The second issue is that existing Swift containers can not be set to public.

Contributing

We appreciate contribution to strategy and implementation, please join +our community -- or just leave input on the github issues and PRs. +Have a look at our How to contribute page.

Thanks

The work for R4 has been done by many contributors from our community. +The special thanks goes out to our contributors who participate in our community +on a very regular base - without these the various team calls and events like +the hackathons would be much less successful and fun.

Of course we are leveraging a huge amount of open source technology that has been +created by our friends in other communities, many of which are part of the +CNCF, Linux Foudation, OIF, and others. We participate and contribute where +we can and definitely want to acknowledge the great work that we build upon.

+ + + + \ No newline at end of file diff --git a/docs/releases/Release5/index.html b/docs/releases/Release5/index.html new file mode 100644 index 0000000000..7455a125f1 --- /dev/null +++ b/docs/releases/Release5/index.html @@ -0,0 +1,59 @@ + + + + + +Release Notes for SCS Release 5 | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Release Notes for SCS Release 5

(Release Date: 2023-09-20)

Scope

Just as our previous release, Release 5 has been developed alongside a set of associated outcomes. +These outcomes are comprised of:

  • SCS is standardized
  • SCS is understandable
  • SCS is transparent
  • SCS is continuously built and tested
  • SCS is opinionated
  • SCS enables

Component Versions and User-visible improvements (highlights)

IaaS

  • The IaaS reference implementation is based on OSISM 6.0.0.
  • OpenStack 2023.1 (Antelope)
  • Default Ceph version is now Ceph Quincy.
  • OVN and OVS have been updated to their latest versions (OVN: 23.06.1, OVS: 3.2.0).
  • IPv6 east-west and north-south support is present and documented upstream.
  • Cloud-in-a-Box now comes with Swift enabled as well as the option +for secondary NIC for external connectivity.

Container Management

  • The Kubernetes Cluster Management solution is available as version 6.0.0
  • Kubernetes v1.24 .. 1.27 are officially supported. v1.28 also works (technical preview until officially supported by capo) as do older versions (with downgrading nginx-ingress), matching OCCM and CSI versions.
  • Cluster-API (capi) v1.5.1, Cluster-API provider for Openstack (capo) v0.7.3
  • The node images now use Ubuntu 22.04, the management host can use Ubuntu 22.04 or Debian 12.
  • Cilium v1.14.1, default now, though Calico (3.26.x) is still supported.
  • Cilium also brings the upcoming gateway API (opt-in) as technical preview.
  • The Harbor container registry can now be rolled out with each cluster.
  • The clusters can use a registry as cache to upstream dockerhub or gcr registries.
  • The cluster management now works also on OpenStack clouds with a custom CA.
  • Storage snapshots are supported now (fix was also backported to maintained branches).
  • Diskless flavors are supported everywhere (cluster-management, health-monitor).
  • etcd defragmentation and backup.
  • Controls for pod and service IP ranges.

Preview: Cluster-Stacks

The old scripts that are used to create, change and delete Kubernetes clusters with +Cluster API will be replaced by a proper Operator in the next release. A description can be found at the +cluster-stacks +and cluster-stack-operator +repositories. The technical preview can be tried with the cluster-stacks-demo. +This solution will fit more nicely into the CNCF landscape and +also allow for easier support of IaaS solutions that do not comply to our SCS +IaaS standards.

  • A number of improvements when using identity federation via OIDC has been added, including +addressing openstack CLI usage with PKCE Device Authz Grant, logout, and the usage of a +proxy realm in keycloak. Improvements have been contributed to upstream keystone.
  • With the openstack-resource-manager a new day 2 operations tool has been added. +Furthermore an osism role for tuned to optimize system profiles is now present.
  • The openstack-flavor-manager is now able to create all standard, mandatory SCS flavors for you.
  • Scaphandre Prometheus Exporter has been added to export power consumption metrics more easily.
  • To optimize system profiles an osism role for tuned is now present.
  • Full support for air-gapped installation and operation of environments.
  • A migration script and guide for moving from R4 to R5 clusters is available.
  • Metering has been improved and a reference billing API implementation is available as technical preview.

SCS Developer focused improvements (Cloud-in-a-Box, testbed and k8s cluster management)

  • Documentation on testbed and Cloud-in-a-Box have been reworked.
  • Reflecting CiaB's usage as edge cloud appliance, it now receives more automated testing.

Project Infrastructure

  • zuul.scs.community now complements OSISM's existing zuul infrastructure and is used also +by the container layer to execute the CNCF e2e tests.
  • registry.scs.community has been migrated to a new IaaS location (documented in a blog +article) and is kept up-to-date now.

Upgrade/Migration notes

Removals

  • Please check the removals for OSISM in the upstream removal notices.

  • The services minio.services.osism.tech and harbor.services.osism.tech are deprecated and will be turned of on October 20th, 2023.

Deprecations

Deprecations via OSISM

For these please also refer to the upstream deprecation notices.

  • It is again noted that the old scripts of the form osism- will be removed in the future. +A note has been added to the scripts showing this when they are executed.

  • The following services are deprecated and will be removed with R6 (OSISM 6.1.0):

    • Patchman
    • Adminer
    • Patchman Client
    • Virtualbmc
    • Bird

Security Fixes

Throughout the Release 5 development cycle, the SCS project issued two security advisories for upstream components:

Resolved Issues

Numerous minor issue have been resolved. The most important steps on the IaaS side probably being the move to ceph Quincy +to avoid running out of upstream support. On the container side, the fix of storage snapshots is probably most significant.

For details, we again refer to the OSISM and +k8s-cluster-api-provider release notes.

Standards Conformance

A new certification set is expected in December. It will ensure we +run all automated tests also for all new standards, such as +v3 flavor naming, +and the (previously included) v1 standard flavors -- which includes the new SSD flavors, the v1 entropy standard. We have also split image naming and standard image recommendations into v1 standards images.

Requirements for k8s version recency, default storage class as well as requirements to the container registry have been captured.

The IAM area has seen ADRs on the chosen architecture.

The (design) decisions on the metering work as well as on the status page project have also been +captured.

The standards and the standards compliance of our operators' clouds can be seen in the +standards section of our doc pages while the raw content is developed +and discussed in the respective github standards repository.

The SCS reference implementation follows all approved SCS standards.

Release Tagging

Relevant repositories have been tagged with v6.0.0 tag. +For some repositories maintained/v6.x and maintained/v6.0.x branches have been created.

List of known issues & restrictions in R5

Nothing that we are aware of at this point.

Contributing

We appreciate contribution to strategy and implementation, please join +our community -- or just leave input on the github issues and PRs. +Have a look at our How to contribute page.

Thanks

Our wonderful community of integrators, operators, contractors and volunteers +made R5 possible. The project management team is employed by the OSB Alliance +and we as well as the contractors are paid thanks to funding from the German +Ministry for economic affairs and climate action. We build on top of a lot of +existing open source code from the CNCF, the OIF and various others and we +try to contribute back as much as we can.

+ + + + \ No newline at end of file diff --git a/docs/releases/ReleaseX/index.html b/docs/releases/ReleaseX/index.html new file mode 100644 index 0000000000..fdd7f3c7b5 --- /dev/null +++ b/docs/releases/ReleaseX/index.html @@ -0,0 +1,30 @@ + + + + + +Release Notes for SCS Release X | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Release Notes for SCS Release X

This document is work in progress for the upcoming Release X. +Release 4 will be released in <Months/Year>. +This note will be removed, once Release X is released and these notes are valid.

Scope

Component Versions and User-visible improvements (highlights)

New Features (Highlights)

Operator focused improvements

SCS Developer focused improvements (testbed and k8s cluster management)

Upgrade/Migration notes

Removals

Deprecations

Security Fixes

Resolved Issues

Standards Conformance

Release Tagging

List of known issues & restrictions in RX

Contributing

We appreciate contribution to strategy and implementation, please join +our community -- or just leave input on the github issues and PRs. +Have a look at our How to contribute page.

Thanks

+ + + + \ No newline at end of file diff --git a/docs/standards/index.html b/docs/standards/index.html new file mode 100644 index 0000000000..4f5310bb27 --- /dev/null +++ b/docs/standards/index.html @@ -0,0 +1,26 @@ + + + + + +Standards | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/img/favicon.ico b/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..8e0002e27e7ea1186644fee364e1e799a4ab589a GIT binary patch literal 15086 zcmeHOzl#$=6n;VB5QN-ckfcztJT0sa;uT^g_!nrd69r2-s{{hJr#>{3nJD1IwS$O&8&AcDqeEG@T9zYH*z{Un3mf+)6 zfLj1iDvkYhfbTfBj!5f|E&{y3fa@58DNsS9`S7};!9RKhyaHYUuYgy;E8rDKtH6h^ z_f=N*=5XsI4gaion|)V#52hC6r_m#BuFJkIYsKYHaW4D1td-RslJs>Mo0WFUvWFkf zZ&tdst#@QJK5P4R(kxEfd(!72cwG3_d6-vOnz@f8d&rWv?7hl+px2_*g2$#NS@>~Z zOaH?jNMF`oqN)2dO|qCXd9g3K^O)Bdv*2s?jQZ`(yd^SsMzh|cecN{k^OM|p%xevl998zu!l;kzA2nv)5~JdmaZPgP@iOv^;>5fqM#Z~WbN!hvx%1cs&sjCN zm&92)wsl#9$F^9P^W00~y!B;`EXVWmr@SnA%iiaC4{5mjT(5vvz$@St@CtYZR#yQP zUI4DKhLTptf5j;yl3zruD>cd^HnHIvVjHoJNd22*Y$JBj?^Q7gubr~S&7!VT$m@Ky zrt?)DptplDIe@{YjvW@XKgu@%Z=V8eh8H3d2r(ppenF=iv}H#}-HY zB@bJiIWPBZt|j&7<&d;bRQ&rd_g>A?q4VJKP@bE(8Z)oX+sd6N4zBu5tHT@!<8qKW zuE*zhwQ;)8wXxr1WFF{9!lFYczW$KTijZb1Lelev&G4J zwit6>=7eMVyh>x@o)EK_&HsmksF8Nf*3+D)*Ff4{X1>|O`(6RBz+x59=MK{!Yd|L{ zIaR~siIy5v12rt;F-s8-K6Y`wwX0OnQmP+dK)-=!Bv@uxRjpA`1(U=!7Kpg$oPv%e zN@$aF3jAL)f1Oq!>FHF!{4aHC4iR*$9PWL M{ex$=IOaIUzc6&UnE(I) literal 0 HcmV?d00001 diff --git a/img/github-failed-dco.png b/img/github-failed-dco.png new file mode 100644 index 0000000000000000000000000000000000000000..a21febb6298c7ef1bb6c2c70d9f0fe96c58daad7 GIT binary patch literal 210159 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 Rj zo(FV+s-$0pPLH@3t{-Cq=HRAL2YHI5iS{xB`S#KY!f{|WAjG1&aCwBfqcuL`gjU?$(A z$EePEh@2nVkYL8gO(9^2k7fNmjp=_LjQ)M?^$9i*IQVOaFNeS{H~D0W8)CG7Qw@bViK|Oy9nDU=)3`c$9y0HmPd}2%2m_?WWg0eRa0edxLHrRh^*y_{ zRty_%w(1~?Qe1m6R*P#f0;@g9@2aavyPiopwz#CjWTB!IdfY=l;iy(H=XoeNQM^c_ z8kK!BC~!|<^Q%qeqT4^By*F00$4hVD*7_X(e( zh2Lv7Jj(PKO#b?1-iFi*^QVL3>eQ23o0BSDj~lhJhH$YmBlKIRvu%vYwcSgUamdonOIo^=2~ciw@DO_VIs?4qhqq! z?_>jJrU{WK0Rz}@xy4TbOmVVV7tPDHSY4_4I)^pzorD}=wp~=Li9gw_ZwA%}B;U{P z5(FYiJ!-NjL)2Yx{Sp=N*07_)0 zO41cvGXmUPk71Cql9!BrLjn@#YmmTx1n8><&Z|7NIK{3FoRxh`T_LLBxmw_TihehO?al$srQOjqB3 zzJeTxU!Dw8x_~ZTbvTP?(c~(VOoh9I5(n=6=Y;!752u^rLN;1GcRcm_y!<}$#S;VR z5z*32y%_iidTqC`JqkN=q9EjpdmRt=-=cDMZYN_3FO7vk(Eq6E*zqFLwZSq~^`qb( zPWa_}-hmMBTyX}5;9b~ych0^#d(#n0zzEhjq>52M8D-L}G7mrH=G|}75cLhf=9Seq znrGNEtZVipJ$JxB(H%3en!^M&-Fjypn{$@|9#so|9V zQXpAjK7QIy968JKQ;P*CO_9K6HlSs86Vsm{S@uz~aBs5)i#YT$R+sEBx{8;g+FXOV zn3kNn0(ZgNq%z)Nb$8m%a#S?#@W?=1GB<*1u7}dLmG;~POXi5JbK0(`*0}GR5Kyf> zO`{dw{4`bborq_@PGGW7TN*&&@zP2u6sf62bYZG;J5+Wc4RJki_CS1{P{ zaY{_eKL5l!0n;67zeVf*6mJvj)0>_9Y+q!*h_`V1B4Cf1vJPfQSEA9Ct+JS1x8crJ z$czA)4wBnrxqK4=Rfk|pRH(7m2TYgX&Qw4U&utLoQ}O?SNs@Vcg)v5=xM1%o!nc{2 z#``T|Mi^6(<;-7es*20wSH_sx(A0DL?zGDuY|i>hVq(>_R#wkC{q$2$t8e^#CS!ab zPdXg*ZSz_bSsI)Ul2@6P`r?g~=d7d`7x*d>^Ias{@`9J1WlwELvRI53r7vY-s(IZU z^aO8>3Ul;E=TCHf)2Fo8CAydxd@a#~BY)5@y3x!-a0T-AplkFh-6c;c&xVjz8a?Js zC8OCg?NpcR(1ajUh%2ijYx%AM%+POwwi~X}3Yij2VfS~MkOUIm)50@N)lxT;T;)RB znt`uALAfZ+u4SiqAhWD& zBtv9_GOe2S4xZUu>}z{vj|VX~;{RxPgMbmGxq;*FKgkC9Gqkk=-)X8LNa*(X3{FqmLO8X)qhq+=M4^SP@);;fn6TL_Kpm#p4c zrZQer+Bl8h6y{XiUjiCi0?|9?^5s0IZ>DkGH@nVei{+SgS)I*Elf7wM5GjL8N}sH} zMS=EH`f#;39^%O4Pv+(8eB{cd!B`TXj_t0f6)yU>$TrmrF$;gl&t+iU--U>keneb zf%Dylfmk{}A9sLcs48=Ir_q0$rH11^YqJn9%J}8?uOX|Np%akAUpLklHwX-B-H+n* zo;rFcu$WD`#QSIKnZBDT6>c7T_~OeuP;2U^e)IuYP_G6U*e;y;b+o+Rd>-uxC8pN305vHYkGpjP3;=L7BWk`Wmqgt}(0^f@km^8+bn7h{xrKtLINl-U- zr}WofOvU9t;T4^;h!s*d4q5oL>n5q}vSi>6(tn`Ng%R;(wPFjn{jPuEa;Ci3y>2lz zlHyTEzL>(#_{M5J!dI%zVKe+o2E@31^s2Y*TN^9wkxIGV7xBWI zYP{b9nuAuyRk6(u;t!$@PaBSjWWyQ0uc{_nI{I|>M)#_&R^&BhJ5x!=D_Qf8WSy12 z8TE!2J;$b&mAsbKE~pF3l8M-zUL2ZbZa9tTT&aA{qhg&*2CrRXFZoM=RQHetZ!U52 zq3!J5QTEPE(Cu#d!*wJ722kUn?(O|h!jaN%BfEWG8zD-TySLiZHLtCcJ^~c^1`)@K zknfXjR-dh0#l`M0fx8z-ekftpAY$Z-svYcp^9dpe2L|_`$;(}uo|W94=6#br^PM?= zM6J{`ssdh*QGs|0KV)3%*C@7xlV@88gI$B1Bo2&5@|WyKW&X_Gxo5=k3o=N>Ny08m zYdx1LpP`X8cclDoKTZlMJabFG_lS(H?#W~nS^08S60SSn-5}hKbh8h(DQvL&^wcNH z{>sCX<^6tJ=c=w<{}sCl>j%NUPz~u%GB*5u+0sF#xL z+KpeP!!lOzCth4Jg-Zt^oNk+XxjKb`n#@`v=dtP|`DO&>*7w)@*Q2&89cax??D?() z2p90#%fGD?J7he|L)KEZubq_p+tunON4N1D`>NDkAp$}WY7xq~U#@)VItyGb$2@$x zzU&>9SaA+}3yO_XRU)b@5U9sq-p_b{>C0b+`Ku>;^`}#ZANpcmm3Q8n&y>AegW9_| zI_*upwQc-9Z%{vkL-D1*c>Ag~=iTJ5E?Q!tk>F7HLCf)NZEp8W# zYdxq|jk6?P*tK2`bbFaUz;3E=P|$(t{+kTJh~)jkd}6EG?80$1xAlLN&?4)=LXu^9 zrMFLKHTsrRC#tuaWQ$_;^*lF6WLs#amMkB>Z9wwnk=*6cfWev7uqV}}w9N~J z^uOTVB#npfulnwV!p0h;*k~^tDH`s2PzI%lqNT@81n#ra#O6I-RC~BHNGgSn_tCCM z-qh?5{*Xxt@VujJqGeX!y&lI)dDX51iMu@xKFZeCCYSn+o^!?7%nwC@3K#RP$%JpqMmB!c2xCuW8;bTDNB;}&Z5JF( ztN6AI)CXDgxGvNJ!IHo5-rhj^zS{R)5#>p~YVm9B(^g4dr7+S(fzsDkFx9~M{=8Ww zJAK%ltGS8@w9V%N&M#;O@em*W!}y38O2v;=lc8H(cgDh*-w;%CjHM;7gRLyb<)>US z8-4LbZO|fHr6(zz=mto-mv@Kcup}qN)hewf{YW=Xo3c3t{jW*qmW@sycjGWlA88vC zR~^s{ATb8J{PHTD*8x$)_}3OhWW~wu3qXk|eyISk0*=@2 zitX9I&;esG_9>gna@sr;EVOBMXXtohs= zt6t6Kt1?u=Gb*l|JRvVtUA(*E<=WA8UPj2(t*)})92!7QnW_*oYf6${A9Pp?w6o1s%+IplpHN)dGOvb-VfgV`WdP#)9bUj{T(kZD4Z?Q) zdQXTRDe1!8%G)p{ojI3+4_|7Zh2_l*KCbNcq6XVJ8gFQ=s7bdvxnG&q4}*z~YH=H0_Kk?Tt_kqQ9$mNOctDx!~C zd6V(>3^Q;-9@%o9kR&8>#yPHcx#z_o2hA_7d-d*<;n1fq*YW$$S) zA@d+@%qd$txg}Ru+T@99>=+6?W~H9Ht9?YD)TYx+bpGVWu4@B(8vvmkyI_jc#J)K< zpMok^9n8>Q>|d7q48?#XqFmMby2k1n2L(d%y#SkUg!X4MXtq)f68hDs+jTk04P^_( z4RZw|OS*Nog@F_{!nYoGrh#WSQn<_%YrQd1oTc;kxW}0oZ9AFt6Yw>Yab}G|Nzc7+ zePbZN5@=Fdn6DyMj?;4(Ga`9leSi08Yi{(6cz3uq$wO$fym0m`2(t#U)w;ON#f@5y zsbOzVyq>9H^_hH67JX@%qF;sr<$bTp5tLY< zx294+eRd$)t5Q)SN%)R=P~-)1)4u;M_fY~3@dVqMn(zp95WPWs!%G4fY8y@6Ra<4R zDLuI~h$tmWn;E1D1kfHQpKBia;M(n7yS{CwVv1x>JW zTHXbhN-;UW$ee*Z23I*PceF*AWxmQi+kR`E`EIOOReS+Ru4?J4Emr@H+MXOJLWH5V z-Rtaog6P86hSy&I#oAsTef7}xUY~#7^%VKgdVGO2Z5cYv4#!&%V60M(TUbGz*wA3t z0D}p9n9}Qw9N@Rg*5m%v#iHKOvF7J%16?*aH^zJXv=Lv2%8_-9DefF%^+S*by@yPP zNrOfFr{mV~Gqzv1@GphHXGsO|waX|@GM#g2iNVk5* z3`6V`=CitVzCtayN|d(S{f%L`aN}23oE;WH6_}go##2ZK>N;W2BIP-MC1(Ms?cGfb znD3;nJ6OHkaAeiQ>(wMcb~Aqia72^gbomt{+Y43C<#t8!ilkQtb%fQ{*fK#;CHtz$ z>%RbF0A!tAo*zEtL*>s8X_FG`%bvM8RX; zAEO-V*N%J&^d_ir-tJI-?NTxhZ5vttyj zYIQ!M%d!yvfFG^9f0Bg}mHlbHbc2yu^}5E0PY9}ZEXgC_!d~e4F|%2UMY|AQaq4UL z!jr5+8Vjzow41A;lcsAHm6?pe?qB;`tL+=w_pjfoixU2idApB)G}O-&lU8M#Y&w!9 zs(IlbZr@8AmnEMnKS*!W$;(+G$K!V#FPhUngf9%a%k%Z0LbpN>{!XvTL}g3lK*-Mk zub7PwH^}VF=hwE|lD?Jl-sK{WB?WT6Z-z-V3sVN`s9zJr;{o z%;y;8gR@L=vdL`kAb#H;l2?R2=bD?zro}Kf!F#-Cfr<6nWaPzmjZO?G_OpGMkl9!}ZMdsAz5PYvbXJyV#NU+4k_f z!IZl8(*_L4oa zjshaHx(cT4&R#Y$*E@OWyO_BCg4?f+nta7uYLhfYIwdkx07|@}zuDPiHCPxon<(uN zQk%z;k`YBx^)=-CQ54y9@7O>U;MQOUV`5`e64DK0wBVuYgy%FRZYsbFU2tO)$l^u;&FG2hZ1n@+`b< z!fpcO)-5PlBvmYPK1LqL;biuVGgfmI>X4M_Cfyv7E;+U8q9li$6&M73L)U!N@V8*j za-!)?iszj=$QRhbHFX^EwNWU`kp3Y!dk8#nw;it_hf8l_tOLI_xty$bSVj*eXvcF{ z=1lrr(7RTy#}M^O%Ld$QEGj7) zpX-Z=*zq8ljtPq?2D3@4i6)b^-l+F2hBnW<`I2#&Ckqxc25NWi7E3Kqx=$Qs=ldu5 zoh6a<4T|$69(NIE(mMEB3+oc?u#n{TYpjX*cp0q?|7j zlqHOBRLJ^{;nyBMr#FBE8Y zQ0i=pdwjSpP8b<8`0=g@zAvshbjQ3*wuD?SEZVOA5^=E#?|qtT*Pfy9I(BC5MIY1#o}hnRSn~5fys$VmQ)bO$wpsAn}siVp<1T@vv}-OcjNxwYSq<) zvq)Lev9uTi;ddK#65#-}{0rWU*GycffYVQCmEzWU=A+p_R=&Hg^OE~vzPlyH`Eq!T z*(Aw4uVK$B+m?uD_~T{Cr&(iD5n?B6@2H$z&HT(4oGdh}qhyI^HMO61;KIc{#jVeM zUx=9p;6y<~6)e0mceaDF#2=LKa>DY)&CCYn%_(tM+bj%ZnGW|wk(8ZZH`kC z``ewX6hUJ;L9*q$3`jN8L;u4UagGY)g|k&hO#+N+HEM6e&hAN?GJVI|Q8u_{Xzj|36Ik!Mys_h{|~)nLmnIkp}61ZRcX@w1Qbo$>g`Q# zKfb?D&QfD0w;f2VfA6WgIB=O2rJ!%8Prl{j(Y(fjhUOGZs^d*7>X=9k9KWT6z3a?6 zOgu_mhEqci8y<~mq7l;{R{2dbqAn+vb3r5J@6xaKh&kLU&aM?J6WPd(rtQCq3?@6`(|#{G{8S!EuPf*cj@z+I%Qis>mN*gfwVa z&rAq_Mnf$58toY{CYaoYg&5kyIT1!dU{xxdqA0-s93@k`-toAbI%O(I7#eEbgmk@A zq1fZYP=D-OrU{OnUC{xEryY%Vw$;aR&dugm6%{C9o4>baqPg7)+%dnr2cFKtprv-l z)r4ZkR0hw~4|F&SeA;i88X6UfWi248w}*#GH+~ElN~>&)x>doJJ}j9?s>nX#D|ni( z>6iyHTxZ?PrvZa)LM!WyK`uz&kvaM{&2NR2HD6~RLDF!gk%oJ0H4t|fp76z_1J!g3 z=W$3tR{0<}Dj2o|L>7EN(nsx8Zze7Ge$yj5YHtOSz!h|=@LWFn z;SImTG0#fIJAf?Ia|*_&&j0sg$cGi}`%qGWF?xXb$fW z?CiQb+|9JMUM;J&5{$x0QeI~o-QCZz7fr`+C;H$proNrGe)bU$9Nli*NdK zD(R?hwNXh>99vL$cRjh zFF8r38s*igZ++2j5WRPcI(2Y^6?s|Fs28PHdbJhXZz`o02Zh`j5KXt z532eSesMWk>3lQp`W3SdD0@^X7AUKazgaGMUA70|AuN0DJw71$LUgVbsZSn9ftShG zL?X^PIls*){a&0k)MaNO#h$BNUcrN)%9q z$UlA)TE4)9n)PmH|DBl?L~ZTb{A2IMSMF7DhQs}OZeMEQ_zxt>3>ClhLC*eaeldoc z$jX(^H^0N0Lsy9A*LKcWS&^w#igqcDg%~9Ax$Np*k?#Fvf0ibQqlHtivdKmS@Ru@f zb9Guxl!ZLgA@IiLjSjhV?L&HlQhKo7uW5UK=gzm05|wkku%=hl9OC(W z^U9fWESv{~IsBIW9zgMzLYjH%H9}@oMt=$$d!8Oqv%R~u>SKzVInfY4EL2NPG%;cv z%)Q;c-!^LqFlNgs2V%5u(0<(QKDn> zO1qfi0NqhGFPCMo16C`2JYSg=u%>C_&iAM14Z3veKZgu-81Pqkn@Ai`gCq4Q^#1n> zhD)`cymXDzy6!8?Z+Nq-BVtjXEi|f{H$E z2I&Q!=HOY~(5hP9Q#H|sO~QKo?zi}Pavd{u(M{1skc+-Y2_Sd5EB{^$x%azo$H$Zb z`1n2hBPxTQnl$?{34NgJZZ}za;YNiy3WQBBVt&odf)H<9ER(iv{R?X-FpFxV=<(h= zTbpgJbifM9flM|H^EQ4mt)I3V1B@V?2X!nV2ItYJT+;4Sf^wF`*TyX!$kq(}~>^$Mf!Q{0$76 zb??b;E=?Wvhxk?HRyai{d1lFqX6irPj3i|0ex$n^* zfr;skBF^h!S-&CBnH_J9PH7CJ&Y%(~OR!fdlywzvZ~lTWA1sZrNy$wB1E(?t&-n& zJZQ{xOMVCjhxq;*)}Ig*gYhD+zbdkb0gkPqV>}<0pq{tM;DY;FIb+ecnl3`9!7T0u zi<}{$_rY>{r{PXj()Pu#_~b_(y4U0!mX9Y1OH-f9bjn>xgr?juP2EHd_+Xd_thR`L z(b7c)1rlB$gnhTedt#eEgU0-Y+>O;&*tuwi5#)CZeN;#!b@o((At~IR*PD!6EBv9>Y^& zkClnq8-V@C z&8GvmO_}#;W@U0~Iu07Y@KU1JsdS^c5p;1^4cy~lM$^bfqlgUIOO!0k^OqLiX*9zw z1@J=v*LfWdur6JWSHmA6qQ}vh)#^3Fnaot=RubdV0})Q-{(LdVw}%OZ~bf5@bE(R=Lz79)k{MDoDK8A;g@{67lo^ z?c61vz@V<+_2UDteF)OW8NDsE*dgSsE|b~3caUD}fnCy;H!YhKbF8+G&rxJp90GMe zrO3MI76Ld7ros#!4qWkN_iL9#4^n}Ju;@&g&x9e%(r)!&AmItS*<+vI-YkpEbO%+l)t*(tg5s~5#|TX8 zbW?OjO1zprn}$xh^uxalKA5hTJ7K%UbbP*?-73t|9tZrOEeb5{PJ_;LE1B4HJQR`3 zYkn>$u>dllyJZqhC$IE;qA+(7L}Mw4m|J$Z`M7*|&cB`4J8uP|5}UM`H)Wjf+$jWQ z-#YG0y`6tFKP%)sU!bGGoe8xj<+pE0HM`1^i&d#}Fem(}IWftPBZDS?zjn}cPo5pU zaRutr_E=qzN(8P-QkkvGXcYJ#qLUL(z$mdmsB}j>9$$Pj&u!=Pcd;$mTP$!!(Y{oe$=E)p zfalkosp{E!&!4;QUXQ^zYWA(mXJz|C8njWhB^t}4?L%Zxh0W4TUXJ?GNOM|9NERe zPz=`{@qIjyaR#9z zo{s3?wHN27H&!*^h-@(fjTYqa6C&ChE(|(f2OjN8CXt*ex^dGj2RCO>lWzCb&R8r8 zT}JlkOtl#$@z{N193S;|{pG?imwm&YCn)5;CuT7N={X9j`x=?u)2D7H!(NJ#b&H4^ zBR5%Zo5kJWScooE08br9!hITYuJT%hESs@W`XJ|hXNL%(iCFgn~_?PZvdrr_DT$o}VI>*R*rx)IE>rDV^$3^bPvz zxQRhzC-d~HfwlKmwN#Bc+wd6!da7e5hs(QTqu}DZqzzI+r_~-(!)}tvlhhI{nSLQM z)Whi=&z=qOgYM&ormluXZCMe&vPLq}>J#>U3OC7Sj+St{0DU2{I;5<30+tMK4r<%d zmY||XB`@n-V&cu3nZSCq-|U0@j+if9^UK5o(!WnFSot?aAda{Gwy?MybQ2~MN^24;w;W9%bxWi_*_!o z{)J2iTRK1{H=a|Sn}lMlVdCyRwi-o_&d!{l<Q2bLBQd(tNwisF@WNOuBxuOm; z^o7iP6$bg*yOHnYKH3vjQ=(*9&8}ygS*=8fvs+D%F|$t^H6<`ZpFS?NNj_!^F|1d4 zubMCWXwAi5y}CKzR>P*3F~2Rty}lap(Av-Vq_}CJ{E9NRsB{T_RK0wo2ZR>l*2{nk zuKEB7zS5|qG`+JGSuBQt^i`Sp$JW+a9Kyq)0iv)C0crjmmv;#TQ~5V*-( zvkAb-%0f))*<1*UM7?EHLGYL1AzpU3Z{HPOGeMJ=ZBScZJ;r!vkbJy0b26Nkqz$vt zUoaqy3X4hi{C~8)1yEdHwl^Aqgg_uT!9BP`a0n2zk>KtjxI2v`xC9ICmPP{v4<6hh zxCVE3mv3|D-8(b?nfqnx)q7Q4)hA85&)I9Qwf55A0s)v~QW6W6W*l)}A^M$}tj77P zFGqdbL&~m-Pd=O%ZcLefEb`=COB$;7psT+f4owl!RaThn}wS9{qaJ6*t_U@ zUZe~zxpscedu$SoKciShS#h~X+GukRyf-nD!GWUzRG$;F&ySINrJ!~|vo{G6isDoc82EVqu#G+=A)HT1ZG z_9ovUFPi>my7H_b9gY>>(271o{FJj3NM9?sb>d!3M|O|o)5k8(?|7SnNiNIzhlh4k9xI5hRs zLliGu1X2#BV$$vK)(D!2PKgt1G4XQ|aFhAMyqrn8BV#ZU47 zoR8u9FLdH?ua`B&F9=3R=|fS+a-8K%L0)XOO0l;oIl^lYLEzqh_>a+vF@i@#_OKv0 z)qcYxTa+oPa zA;#pZXBvU-i(`&e%pZO6r<89y0sESeK3#G8)HBPNd-6m|Peez>Fcfbju1K55%-Uuq zz=klXE;2h*8(5B82-^IPhXI#$8T@bS?uXuxI->dGR#VBW>#sRm3|@18QG8a_K31g3 z^!N!fOOgf!8@IrLCX4J!6vrYD9uO?!S(zE1O;BWfBt+I>RZvL?3bM+^&Vh-cU2_s) zIjx;Zp_4z6E-aCA0x=9->$|VPWe8vTyjff0G(hK=^n!61Q2lkO&wWZ``fZMRlLA#<1yif|D(JeO7(5(LZ}tTeyQ*D8FI z5UTQ=SO+k_0{zms!w|2SH4X}o-t?wt*%=FA9&fRl9IlG^OZ7^&j3T@*<|0-4wDhNt zschoQ^nwI(s0(uVbbD^sF7WVfKe#jgr5D_Q@gb3) zaY|WX$|dVCKBL{uT#cCy|9Y_u@xD%%RHpvT;KQbV6Rv%!jVJvhy{czbih3y#R=N4T zboZw=Zn|A?bN&ic(x21DOUz0TrTkf_p4;}}-jM#K(Q|SvJE||99E$6XM+czULgD+K z^I<@DULuQ;mijQKPhRjoCHydgct4>({HJxY_{C2$Hac0e<5pV&K0O_a$ zhkqHthjSe?*|faRzc^Zp1LgbhFOdw|AyPk?7qRf}cev#87@q{6vzqV2cVv;-CWj53 zaUx|9il}TQQZ00w&NVkS9jwcnd|si4Nczoo7+Xa`6oCU(c_>GY%6K3p&QOY;)quwL zS7DlEIh?k1Go!l!zOc%vg>~m+%5(0PeAz^1S*chDzqzurGNk$+?V5D@mUp+s%*mBg z6=t2F95A7eBo0g^c=;1ohs{z$Fi$O`?lko;*uXDSsdR;UM6gy|-h>~W-UepG##>HJ z$H_(GsN}I?ef!n2ukuZ+I`e&hv?TPB%$=_Fg&}GH2|9NlBUu8^GSBa7j{@<9F?>dV zNi<7P#{ZUWHJZjK_4&4PT)&N$V2 z)Z=8mUXC=Y=o?+)Axr$xVg||(tg$&E-K+J7e}nq<3xkdzbcHnP*PIgRtpqbD*99*3 zML~2_nXI+s&-@1(CunquFI5bo7qGXit2a$!5IRzBV>gn&h7Th?lIh{#L6%+QOY5)) z7QO!+Y;R8Hay^z`H)#!H(ZIu`YAz0(O z1DCaHP9sukoswP=#fgSss$2+l{BTu#N)>NFl0#xnOz=M#zJZnh?=XC) z4Eu0mX0`J41<{vELLT_b`fuu4HQzLLh~b<6Tj=w&mD(Yk2shi$&vu-?>(_m11b)R- zrpT%RKedm_!)W!fWAq_U^v_CV|EHlc)ZpY35|QD+sQ7On_C6Q{e~_ zUy+wY07!&^I3+UjS?;1fB6cSlui@z#nWJ5NqyOhv;=L z6=OWw&Q*S~f!{&)+VH|Ro;ORxP3qWQiH$+H@uj!vI$JxT@TZUD&$2&vB%5?Q@(x@c z3ME!Y)JxUZ6P8tFO-k$>~@1b;p)6+DCEmphomnLjcXu;bA7J z$Y;^m2u$f1XsK$(St*uS22)H8SF<6db5Zh0adE9AX}|sF&Wh@8R5M1OsHo@T1;@%^ zS_3;16OWI3=e+Vrg<@V4xH-onh(M)WModHfhR_#7HXq*b`Hm;rQX{|!ks61M`?Euv zLu9)Gx*fNJ;y55GW;S~>eeI@$@`t1L4?uWpyQyAaA{(#52~fDb8tTN1 zy8S4%YMk~&uU@=_3s`Im9`bf=r1`xv_=RH*dsex{Km04G{LD-3s&i)0WG5eQN6wS3 zmfDOD!Re($3F+4PGHN!WGL1v0@phF{86Uub1fcZ%`X!YBd~Yd2Vpk?G6`< z#swyCrM0*ewKgm)d}_bPz22^xbEPLKKrZxii?}_Jre&ugwm5(58ffWiD0jG!nr!&R z1m6Wcc$C#ZKU4P6Ykfa$2wyF4xsu%f1y&kTV;<4?b#r^`vnL1Vu>D&m?Mm+v%pT`B;H;?JptxP!ar69OJID*RtJNte(*-{75xHvTR+ZqjI060 zRLD0q7Nh=wF$S%mHi)8=knf3ht!)TGo0sl&R@eUIz>QgrQpTbvlA`qjW#^cj?@eD! z%Xu5-Y%#;MGveTJ#PPLK`x?{;3k@TY(^PMHFn{D}74cc4+s>0hjH7zD->74OJ?DE5 zprvCDdD8TUiKSO$X{$pq1){r#f+zOjcTft^!}nx$)@YNebft$cn>LQ#_(~A7yMIph zu0=pfW-7J~vo*46T4@k*8MFtMJQ*!Q z;cQP#GEkvYJ!MO8nq^rm=(WFJf+|zL5jMx~5!2f^o$F~SMX7_%V$`%?ZAK9N=>fvW ze|WuRe55JYko|D>;T>`_rrIxQJV9ER#LE<^)j&u^2nFWapf}v{+Da9>{j?&F*SPNW z`%fG)U)D$Rwb0Ed_+G2ek4(43>6#Ai8ke86(p~Pa2p)Jedws={uD&6d%PGIyhius9 zA3IB7i}>GpFxDxF7rK$O&9p4ppn{Elqi#GA&D zl`_%nfIDBU+k6Bmn?}^6bGpj9XWvoF>ts_I*Gd7c9~7z!6A=+PfWgy6l@k;84xoGc zRlTY!>a5R9wf*o)kG~Ck_s&a4(_O$))mTz>!_syDbcwb$Qx13|xk4jnaVhMp&gahwoP!Iwz$5~3k}8PO;x%4_C?z>3_lKKd)jh2$XtrKFHJDbVjz?I zF3h%bb6Gfo^~7Rht-0FQIyj=IH=@2bCb{&|X|>4mf{%qWyV~w_YE`Q&xG#a{qc@%;P$m{f#-rZ*L9y zS&~US-J{6zD(mftW;|!^>I2pG7u)C#65gXi7*2Lq=D7QNE;ojaX-W?vVnXURmv9`} z3f4%@M$e&Khn~Nyp>hqrsJeBS?PN59#<6N9hgHkBCXXMHJou*<;zN{;tK+^#1s9nV zF1)tD50hsd+oKl;N6rRRqb?uFt{QW+@E0WNa;TH5bkuF&!7j zzmp;*>IgEOhFV8j!7rH~)e9!9xrjXGB;a_pqGxDHfz+U z$4`eqtG>zQ@dg0AJ>8y+`p_G%zn**5Wv~VMfE{2DnJ#WYT}}=#A@Gz-#is+p(>{0G zJba`tsu!@wn8 z3>V*iO0DO^ZutiQDo`)4)1KFJ@qLyirR0}*P@nl$>RdjnTf(g=?FAOCD!D)@gASJ< zz`2zOZZC@K^Fo>qs%uw$tLF5&e+AU)lWyC+$CBpeJm5ZHMbq3;VaU^-9y=ru{I~lD zKC~cz&@}SebDdBYjsV!JRNoeyG~>*ajZCy};JBzJK;k?PbP|`E0o0z6YJl2r%x2jB zIhsn2sK(_W^O$e+Y*gp!;zB-=eU;y)Kbczu^wU#Nj;B^y`ypbPT%qV%qV)@r^dit} zH+*>|lPEkW>N)*fc7sN<^4mxml(XQl*MIW8EjcQJ$fIOl*WEh!O+sD=6G)ySOrhBJ z(LV|0Kg#GB>PI~@WQOukW;l{~vG_uS$RO#Lf?@tBgl2Z%0C3YUz--h2#He((rzeDu zpMPVRs;6anw%R^m2nI2>bH`TX?$`jdmmUiz;!nIhA=WEJ@gqUShHLP+la==j=IR<~ zG3fj8^q^9_H9*8e$kvy{KSN}Bgeooa+{pJOh-H~a^QtnI*-J)}!CQg`cVCh| zrs+Dj6RA}^kGos`lJtC+^hErh$$IyouK8fhbmt4#X)V{oj;vSpAjwxazB#5iS>xw>IpO8`=d z#&W7$%n<-wQF3x}x?LQ?kSeel`JdaQu!OO5gKIZ_|ah zPbd50a1~}f*8pGh17I}=CWl1@+Q*lA++HVuDhn(VVoQ`^;N$&D7xFOy_)DKo0lYC{ z3coW*7kyF?ru@Ir6_9p95Rmq?F(A?o9#xvqej0~KLn4L85z)?eFjF)O@Xn#>#dM{N|E~6Ty-%1@3|(H`v)>A*%aI+ll)V4JviZyI{q3Lsd?V*+s?WsY zA^|AK2r2(xsB zCAIALCvqUA!bp*^m;PdK{q?clz`c6V#Qw+{CHq6_131Ma3j&zGePY`ltN&d<{>C|I0pPg;%W&d@uz;LsJnZRDDz&N6zj2#t^b*vraR^Ek z@GvV|qk(>T1&RF(hM`OL_xCGR>F^`KoNkl#F8?k6{ry8!Ex`Cb5R{wd7;qn(w(umM zKN0-n#}**Eo6MTH)!2`k*zI;WRgnHyDgU24Wr#lTHZ_TC`;j39E^-&!=KtqU|LX;+ zDPY-9cFi3%BrvF2?J8*WucZFhXMN*>_E8T{XW3Ra>0bRmBj)+@f*v4TlRRj`4ENSX z2RbQk+F$a|-+AK;v@UzI<+E4sp8T<__Grhdhgl!+73RRhKS`WD$$U02iyBwjzJNkBtPl522kV zp_e>(_X;l&{_}Sbkid6ZyjgeA76E(ub16JW_%km6uwJ-fiRzuxMw9>25o-UzlHS6B z8<96N>Y=EB6`66cI{YuE{y#l4vk*|U�+`&+iYJYyRfve^dl-eiGd?PJnhZ!Q*=( zK6r-sKT6{Na^Vf`WXhbL0Xe@X_$~A!?w@(}Bl*1`A=JKnHV$|R-HIpn`JaiG@dn(8 z`b}Fzh8(!KkMsOrp6dVk6AA16N^qSfAC4mc;1^CT$fJM9X#YgfPc}d%*a^~?Vk#O&nQ@OV*e*fLiS!akhdcXfB8rj zpDmqAK@rfV_MhA~^78}XL$Ok1=jat-X20A~Y<`!gVzy0<@| z%=Z_sxEvn;kwOnqnZepd5S}t_`vE-c7<9|(5&fAedUN0gQ)joLQNfs(iI2{`2G6SllZPs28D=BY1Z*FZo|h^1uHUg5tg6z~r>TR=8Ijn3A9W#fAIV z6-Fij#nD-R=Tz&4knL3K7|-=*UHF#zo?;_TdaSYc+MR}`{6E>*`=KPmKiAV4oA2qN zU-bmzKloPdJv)HXyeMU`Tgnpi|A8tb(L)04Q29$_&gT9+nfbNU{;$ja>nHQ?0Lgep zoWxSw!1>4r4UPGumGtqA$^AkS9ax-l?>E-WgoXJ(pdIZ!?M9t=`wd9rdHQt>DF6B> z|0wx?yGBjD-%l!!8QuwS@dTfc=g$xK0Ko)MZ1m^Pyc?jX%mhJy^q;@<=Iyf#AzOt@RBB1^6*^s~U28T<<*c zZG(ApJ~{<3mG^0CHxfdOinWup(n=6;`o#J#rQ974 z-%$snLM8!1s?^q4Vb;yn*)Z^vH#UZIj(4UxlduUXr7!`)9WJPo2?2qDJW!Ay&7k?3 zdzF(k(en<)SuyEB7TX^dF@XkH$*EjD9)Q&%0I*tu9ceU(IyE7`8+)NvHLG;&M7gOV z9*;vVrYvcq|1-N8xIZj}>^?YvW`NK9%p54iir9FMa@E!$kmgqe>3fS)iVCOEZC6k+ zV_`Pez%RsJ5lb}n2MzPl<6Z{SuCOgedOzweB&(N53Fp+d%E z54^?7@Deps{NuKLd<;(8&7VnIoe&@3)YRfrcFUF9G(Fm!D9KU|S>pQ&=$Qp(5(4)f zqb-~`?Urg}oYQ(XA}x(Lg&!J=LcsL~w1ZZffmq?1!nD(lZ`_u1!DR-^A1M9tqX!To zGufIEVwdh{dkkWYV03p8d3i1Prk`^9AK!c-?b9_AP^N+ag$tIuG|w_4j^;h;IyY^ zfpjS)N&=`gFMTteSm1th$q|aj5e&iLUz4-m3?jG_>t;9fbK+XOL zCFoEtO<=Hh(%$!hg_@kt9`N~;5VC3Vd#nrFeeVv-*Z0Qu)JC8fYy5ecY@%~$) z2>_;$rI>?kE}6`QR$*&yG>QqPeZLVXP$}@3`cd(*3A0B?IMCsqI3}Y;+88?dS-$E*B64qdpVgjyEc*RJQZQ(s(as2>eq5ED z79@DOokJy;CO;~*LgUJMb)ngPhuk#CnJE^E4rij ziOGQIwIy`Odu*zi7Rc^=Cm%^~n`g0`wqteicdLD*B-JO0vq%wyR~~CC0Yu?@k6H;P z74v3VUE=~!Tmh8uuY8(jSAdrrJIiLsOUUY2IEVXMnBZMIb@yg zOy!QB+6?7Nveme3lqPRR2tDqskR&e~9y`Jl9E&nja%PzpV5gOep^+>0?Hs@cqh)yP zOwwq@!U*{NRf^TAwm{Sc!dq$eWi9rW>vY`KY`P(8%KavB&W94=Y83<8Ofk>E zHIc{Y3(p6aRJaPS%0r}qiiO#BxK$>#w~9Ff(SEqe$tEo|%A0#Zwmsi#c`nDF)wrMV z{649b1NG9;2Bw$grk!0hgjftp5vA|@UphrKr7R0bCmi6{d)|n_)T8Wn zy`B>^IpJwp+smvTrU`~`J`ZY?8}8*sT47NCak4(j@uTX6Q{zp*?N^X2>$wGhNZFrp zdmG=JEVPIp-WW2a@HuJ()(xyc_-GWf)1Pk)%a>&OQ9H}_WO~3sOV|J9NirniLDU6qLdi#G{l$4V796gut`4u}m_O;glN6CkVxDoLpJkB}Pqu&7y^0>^U0H zz01;_Vd^}31;ZGQ5X&PwRFLjR_Rf=}r~bSS4oI~Qm72KYS|6q5dTs zlV(Hdrv6r~B^wOukw5qF5#o!ca+s#(rKY=3U#uwK9sc+g)OU*Z+|O6f4P**O@*vLK zjqxl7zhY&!Xq5A#4|(dm{MdKE?x zt^2NX)+}_SDLZq znlwJK4Lg0&OE?#mTAu`!_1*+}-Vw+uBgnTaX;JZ>*3`rOvwWkJ2l@>4|pMb87Y@C7N(?a~mDK)98E(qD+ z(EDP579i+gKI(0^x_`DTx+#x^rt|V&H#^~@3bTZ)Go;hGCN%$ikGiUk-_&OhLbF>x(jZPMSLKR6N2}T{f4nkz9scV)a3p2~ z>#p36iQi5;pLd(GTdztzzJkK>Q1Tb=qe?$cN-y+IEA*yWd$2QD5YE#^iL@pUFw;l2 z_644q-C3;Q%x;CypH(R_uMAk9k{G{`dwpMcGW@-~Q8qbq@(8<2^F#OiTmG8z9JpuC z^-ZH)Z4gFG%T@;k7uf`5lPB0chSZk5mF9hi4w_mz*iC-q5Y&qfiz$_8C7{+T+Q1E? zrhJ6=DT!}%yLol^yFwMQV|zu5MAz!_s=TRZBw3Hg_!FnCi)m#$@@51iCRofFN}_=H znTRt%!1J0ybnYOvW!}i_EdtJ8e2~acu%{_A8omV#CfD^3pe95O$0}}KIv)FyZEQJZ z7%|Rhgw@(lj>By zrd>ihO}{2-Kqw!*zTTDR0C{JX3MtA&zCl6aTm{eNbr!R^!8?ejrHLf=qw+<|RcTx! z9X@PC00<-;PAr%WeixCcl^~kk6x~STBo`+Fvnje!qMr8c5)uw$m#2E!dlp=k6Ws+; z$1QOQ5u)gN_Q|M_zL^;Tk4p-*wCvimU3qYX(g2e@np&Q0Qv9OHgV+qtzJD}<-t=cx zezZ-}43o+?wZ)#v_uZ&MM6RK*6uR7tt<~OCAs8g)d3joDoC@Bl(Bud(SwNbRJcd@C_2=x7@$3ehv5|?*te59%nNbg(NxX>>k({6L zwb23Z08_+163(RG+QGo0`p8|_hu(RL)*rd0_;Wr0#x#21#Y$rM_0=X-s(Kr%QLo-m z$V_bYQ4hKE-VBVcx!^AJd|N7#kDD7NCx^?*MN<_czS_<7BU#WZvc_RAZ>%qsB@_(! zq%6KTl6}_K4-XQnL&UXb-8IsSN47`)6^DG^JincLFzle~_*iVWnJ^YFy`K9`wgziz zsaLHE6aLXne&xIT0%f~d$2Yl*O>(idb+#yWit0dN5S-Pp@9mA#vCGTLCF<=XX5fKRIil61OW( z@y@^b@+Ot)mYY@-r&{Uc^qLqAcWctv?edb25`$Z%EGJCV*5LN5^{e7JuS?lG1Sa(c z=OGvWy_6r#3QfmLaeEFcw^VM|n;~_oPZolbBzoz{UfRWr`D*_p_y&RjBkZiV-VR-# z+RE1!iSp&YKjEO+HLKBwqYFj*jhgs|mqBzysbO1nQ*C{LX%MSG0fxBJn-Fz-du3hY zaaDev2ARY3Ic5K9?m%yTnj#>j{>^a$ent2{->5Dc^ zAcc>qtAsygPsvuGTa1E?%l-y2U+QW7$5v2EAd|rJyR$a7G55pXxWFzyj5+VP(P@Wg z)bf{F_189}Rm6dr=0gp^s^7d-!`s~Uu=IAaFav`2V)3)0ky25%6C~Syd9^Gjen({b z>+OjKbx+%(<6$UU4Jb|>&l!2@IMN?3I!hk#qBFw#)5-9WK~r>_)&R>=pr}M!yy}Hr zf9nbTvRR>9UyYeg8^B>2>|78jA3aQN2`$AT)QstlG3lo8BCR*x6Ckr#5>QuNkMmxx zpNKdLL-IzyR*MHScAi^Kluxev!FlfTI$BWqodBbztK_2NlA{sQB+G!X?0Z%YaAAhn z5|cnlLrD8)BK;AOo@Baj9y-+|c9(?7Qf9~Cd2h55)(hxH~j={SG@*LBUuIWcIGK zI~CCG+0kvI!iffc-p6(EHs=H6BPC^bYv@Q}^n7LvKkV07RK8tnd(M7mE~wH)#7_70 z_}zxY@Py^~Y}DMOJV$7Gs7kqLyzn%VNuPTBQlJh8H+hI|G{ZBw%7o^|_4r5KK)IwL zwUGN#l|;<5@84ZEx;b1E7%k1DE|)}ur-dbmIGjr9_vUhVjRq1$H!_L1pKk`TU@TXN z7Z)v_aV2SVP|>ScO*TZGZVSG(o;??r(Tk+l1dV#M&Dn=X2Hod=$&UC{Ll+@&Fo|}{ zO!1IcI$@F!EML_R2btOYo!p%3HOQLlnJz3M=IX6w!{2onTy-t0?fNr+3?w2utZuuy zU2Ik;(652%0_t{o8uGKcg{V|x$NC3T#wTuFZ+V|URZBU{wbIT7EE@acMb=s&BE2SW z(uhi>?+h=uT^%mB;UndE$dM1%VJc67amHMkQWM17WPrKDH{0ML&VPyLDR*_ePOtl8 zvcx{zT|L?N1J-?L9FUx=(s0F#Tv@^WoWy#i3MC8@04rLP9=M7D489wz9H>K%b-<6Kya`$^{kxEROFGvF=j;zVBDbm2GgtE0? z*7mDiDwGh+99R1f@Pj^IjmXP zjzYceUg+5Y0?DGubeTyfY1ql5>#sD5rUzeOQ`ur`$eW|EiY?AuqbYvmXH6rq)#m(P zMxSlUdfr|bYcx2Z8TCg8xvLb$GEuE3zSQ1?S3E7Zp7@bB<*$2bvNR@DkFpabqv?za zoi0(vswPk$DQ&l!ts%Ehwd(9vxr^va#3pvRB7#G$i<0*jd#uG@?Ft1; zxq5VBfg8h`zxchvuw5?WjQIKNu2_s9V?NTuGX46g%^pTA_q!&MLxQ`4%jS><;zkO# zTwQC@nrxPQgMslNMdPkpDZj%iwd(#P-kjuuFLcvW0=!N;8FPLl=KYC?P32N;cBO7# z;*pTr)Y*(Pn{J><+pI>H)($Ezd}V7V-#>Ybylz61<}Nl1u-dhIZn-OmU5(Wg-7>d} zo`!RGi_iS%sk6m!DNPK6ws4BL9u>V-DxYJl6ee5Ua;v2ex^zx|G9BFF(NLD-YP7AL z3$`1vfSa^+>n(Rs9NJb#TBMfNe)UhjSH}ybhu$sVP?xi5oQl6KG7uUx(v5!Gk;~d zrS@Q9d(j{B?zjd8MlF7NHL?iV7Hc`0ui{I^O=}aX)=!|rckL@BtQ6rwbTe%7brbUE ztXj{(>{`7J8B0oVcE_jd(63DK_-!e4Al}Xzw)2yX#pp20Fg3Hy{;+L%Pu;0Rc1;nG zTG6KF>jFZYq8O=cZgkXqJOjzxhDrqJ-ZW7EXj;YD&L}pk87?J7UraC$h#jjlP1n~s z)X+iq#!u&?!shT-Ss5@U8H?1B2_30SBZeKZF z+!pjpP-U7q5uHyIh7q>GPrncxzj4Q(bEJho+IJq80pL~1CV5lC z{Nj62vjn1c>ldS!&%CgfCbI2`E!_4XT!6Ka4k-_yoMF30H+FvL66KoO9L*1A9)0E) z_gkI(VUpiXbz`4W8;v3~Q67O4IM5(CD;F}*M%7(7n&qT>d{cPBTw%0JfcV1>K;zUM zhRmgb(MQ1p=eZ8ot6N1$1(-J~V-KWQ{KI$8qt^##>;4wgg^HTA*C7j@W2gFZA5b3m zxW4ALrq}HG5c)RveG7s5b_gz8Hhp-YH;vrqyV~@I`9zs(28xAnx3|j}zZr#jj^?CM z%J__CsDp`qqvGi@wgwY}&cK@|;h2M%sa?hyhSRa-`aLL9^=BU=ouQjbG|NZ7)2;d* z-1U9f@lt~TO*}ut9 z^zlVq^qp)a#b92`-24=W>HSl;N{D$ZnKy4|`Pme9k4xT98(ZJPhO1_W=U1MrMGt%Ku4Sgq7=+2dbm@V*Vjb9~QJGKnVv8a&T)70q z7^Vb@jL;Qpr6gg@ZmXwH6KgJ54m2h&$03pot$fWrAo7LdIy3$XWDai*63`(9%LP*W z1*Zy)CTG@!ECa{hrj4FACZJ6F;j5mD%fpo(@v}XAf$hia-@ku6n!T?yUG|a2O78%Z z{JL6NT5|a);1r2$`le3U4We@fC%WO0;^;rvO30k{FKeZ_u~ELc?-KA;wFILhYAoPG z(@YRHI{hyEB5DjK(bd6ud7es7R*lf)AKLhFXWE)%XXYfJZk0Id)#ofTWx5`7b2vp5 z?b`Q)?%gL#Asa86&GY;;HEZnJ1m7=3id?-d;%S+dbN2y3WCb5F85k9dE*lbx%%(#9 z>-rls|7y^a#qQK=0!q(yg4ePws-^5aW=yAJky(um-aTG-wY_q4G#}1IYZ;j<6m;4{ zbH%txi)$rQoo@nBJqxt!bI&F$=`Bt>4g-FN&NsLp5<1=|@p!xfs6w4K2TM6BT5S2u zwk%gw)$EXK-I7K*0%X+1iLteqj!M5Y&pUw6V>GZ^S@`=A0>TcjBaB=;Ov)n9*QCPX zKzNZLGFT=_AY_$6EmvzOtT1T=2m2VxV=#egHt}=LXE6FK&q>Y_OWHD_c3`hrbEIcK zp}%?RAS)mgOuKn7*Lat%<-9pUV>(rQo2E}tl-Qy|SNXTj67lNiHs7?XGOpBdq-_w#s4ua(sqt+@hhbn%XjPMC_#7kHI@{j4e{+VK~7Q z(;JETxmBhN!w%#{wt(oB{W1%U;*pvPtz21|yI-SP13F(@_&Xp6Y~rWi%sMr!7y4?> ze(GO%L&A#)sl8@rX0$l4O^gRLDd3kiMhhes6aD%^kc}qKyt02#CwG~gK1-)EsDoygV7VOO`Eb+74_**p#?&5f zQXQGc0dOO}$Kjvta<>AQl$Zq_HzvdckfgM2&LA8A&Od%=4nJH)hGP=V{$Fxt3|09E4xGAgoU6 zEX^xJDJXNWDDu{Px!T5L5si*GkUH>AzKcLmQIj;=KTe1lnd$IHu?&bu2 zB4vZZOAMVjqsM&Y03IW|+Wtl~@d5HT>Uo<+f>Tv%9KSQ|RK9lI_5ffBUsYK6h4*TA zE*v~!!$#s44`oJIJbr|^_ClN8D~xuQX324LC;-_>np6_Bpv^R zyB53b9%-?iadLJ*{xEU+vhMI><^J%VuG+Kg;DGlJNHWvkZrG6(FXO9oyx)IdXF1cE zJE@AcTWS(Cl>ao}T|eCni-y4TEV{mZ5~^jstvy-pmvqdo+Fb!PE6~H6sXo%eW<1TN zX_QsW7NwuJKi9)X_hAK$qEa|L*wrZ4rO#b{kRQ|IT_YMePRx72X^Fky%H3N?(=#6( zW;UMtivO(qq!J;UfG0*IxAX*a(WvR#wL+xl2w+MN6E}-Q@MGDp^fI;#*tP8sF5Pzq z*`W`@i6J};tCv1;0x1$2K0B8gARgVD3#k}i1KagKar1qr!DqGmw%xJdcy+v;`5Kpf zM)7bV@Wm2;06gB5@&;zIz|6P~Fs=_*_Pg9_otCl@(yj~WcZV`Um8+#I4B=nJA9@v+ z?@oxE#IAZKKdrJV+-xr3N4lX%jqFh^Mk*fOIR?WIxh=XDMe{_Gus0dJYjrmta6SCX zVfK)hLJv3u5PHF5M1HJhqjKuItYO6)U9lpPZuMWiTbM~Ir(N&Ah_&gfu9tKo=by<| zyk+L#PS3UhNt)IzeO^9BD#}0%(Ny4$8Xd&gSJ*Wuocc3Fuv8MzW!`||mO&@Dqmn?7 zGe2<5IcJ3=l|?sACK>0IPHHqo*AuC~3j~O23Jl={!ki%JE-Z0wp+q!;bSr#5R;by! z;8oGC6HD)Oa}-Xx{9xQKS}%VlK*ZQ;vL@8skBTZJ!d*@=mQS5^s?IhAFJG1E&B@l5 zY@x>M7rz{IYWv}VG?ht#9Rqf z7xzO9KX+2?YxePx+~gxOr|n(Fdf5 z_qyQ+MP05J$*Ml+FTmot6~!WJIkTr^q3D2-=Kv#nzCOnt#19bPWz&nNuY47r=a~%r z7bk7EuA3E4$yOxDV}7^JEGL50ka1sKBQ9eU*xmH8x?Bv;8GihA`@ASRPGq_Bf(?Mo&dXSo4AO&*Vey5LoHi*VOt_+1Z} zxn5nE0j1etG&;R2L;IWv*$a(NuUYvSOs=A>H$5i`R+Y&R_FEsJ@d-emBmWAoxKqbH0wyf3t#=L@mP5~U7Hp5+ zY06m6XrQgNy&pz;r=c%9y|G@>n5!MoZ-xfNDUH*A_vp)z(3T{&R+B^9P+O}jVnsW* z3O?t_nE(rAydAWkqnlg2qTN-;cwqnR-S8N^Q@;Uwz|zY1It#uh;YL9luE_YTfq0x| zsObf1`@Q)pS(O?^Sece+*Dh}g&s!E**%U26YNWOL?IhO#J<<|r2G~mnv!r_LZ}k~{ zH;M$E6!!#fMw~QkWf<7)n;)?twON2!)TDEkNh{T-0skF!xOaujHYe9A&UdeUE?th- z6hlJ&oNxJG1o2mh-n%s21{ahlo(V0<2W#*FFOB!y3f1Z2Pj@&!I-TPQFCIdupw3rj z0Z3K$p13O`3HIgoX9AIT=MBkE@A_~%Gi=LV&Z2`KO5wA7olO^<#~sILDzA%@(?hCS$bv1c&ShjsbcDl1)nAy;;b|J&f>ZXcGqpeiNtSrm zy4X99n;6VYTMbD^@DTv@OeUgq(VZHZ%3@!P=xw zG;@SP%$b{^@No0LS5p41V)Q%JqcOznxLuF0Vi?cE$ki3vz9K&^>s%qiG%$+ecK)Vu z=`W;C4UuYrbjBiNr@fu{?N^&NczDAUDDwE}hf2h3rny^)&s*8i7P7Pa*)Jf^U`hK5 z)(%5QTQfwK^U=dgJ+|G`!wBs4&dUmdU89=74+G%XVO_5qtocc`8V8!{>S}oEDwy8T zSIOnw-96mg&&pY1$Wsl!=jdqI;T2a>-IpU0hu>OBqUh$m3_+m(`F#VP+J14aNhBc8 zew?Tql^vRm`m86q62D2QQC3Id)q-QWRmBV7=Sz&mt9%V5;^(oQRYG}a8ngjl1%{L< z05tu_4)rv3oo1saI0}^!T+CGE; z5_|FMQ;YbDG_A5t_NvVDG~)Z?JS?u|a1&rq5jx#sXzpnbx1I^}8{b(p@(yW6I=i`gA!Z2hXFj<(Z(#z+%qam>>Co@_IKZ#O z@Jf-yVbqS?=?KFU&hzc4q!~V3vFSV68eujA{v@trJN&;Sb#U*ERt~R*uaS*{5d{wY zgyA2Yq?rc7wOqvsKj0<@b75K~Qnb@FOY0{r$I4pbMC;MI2Ye-gN|5V`Vd>=4po?XJ zCdzl$6Y}eqS#qtZMHYaCy4~e|yURgN1#*_g=OA(_u;g(1WXA2(NLE;21_R14s9w_# z#^*$$c@#z#Z^d1a@H%zk4Xi9KL&a!D>4ms`GJ!n(N`)ExumVhK5EMf_CQ+*}!>X>S zd2-KK?VoW+D$IY@nV)QqW`*K&=8FV?$m!Cm42{}hI{gG_dKV|ug&s=!5)>&-ik<{Y zC$c}=nKRsv9YT7?4|SkCeK0zmNjb~z8r;aaIxFb(4rKLqgqc@nijeU*DX~dU#$fj1 zo3yvqp{Dkk*i0(X*u7VMi@R=3p)FH(E}Hcl^?R|dOqt$ft<*^>`}Szn)ZA3C+3wil zuLAhWw5pjjQO_6QtB^p2$~d5-*?GV`M+{w5M=EXW#RU@fK^{8@)avH+rNblrAIknR zpsKCw|A&=O5eY>aK|nf{mQ+eQHr;}Nba$hGba&ULOS+L}Q_|ht-SwZG-yPR=&V8Np zJnuH_z1EC1*Nic~<183>512mTP){Fn1!^A(=$lAfe)Ka<&Fg@$~s?&-*qvW|O2ACNM7 zb*w0Fa64^9Ef77J_O|+BIjh?j*sTYa3*!37x{lG?zHa8b3jx_&go#X4#8g)fT{VQS1YL7G@=?YfQw)~Z{-9S zZ#PZ>a-2%%5gu!C@T6Y+9#NTN;;$CBf$5EhJjf&7apC>RjZb#Hu`A+ObA{!pBcsdB zX0Q3VFHytRR_laYU@g`q=%;5y*N{Hlo*y3~$Ze>5pI%FqJLk#g@JZkepA-!zDA#Dl z(X;>A^zyKl6j(_wSLW`3=|$E0GHL;FQAT1&x_%L9B~G*cDq0k+j<$a*`jY^uIz+XN zg!0$18L?VLoZ#@&*T^WpFM*`D5?8z@JQ_xXgMe(bZ1V{T3Y#Z*bUyh_s%)zV zU&Uq}vHn79-<&S-NdK~+G<=Y@Cm6`%2{=q~ULX(%GTK}fka0U436LOB-%+{^EK_ob zo%93Q!-{zo*kz8frGkhzU+G+3_=qXlV%HnTTu6tel5D%Bg$1#u<{e`YF>#FH(bu2F zWiC_X2P-;Fyw=+;at*Tbj;Gtz36eminxRjoxsI5ful#Okk0v_rqPYsi$%MsZK?rd5 z7R45NF*F_J4;`f8UQ~WY?hmOO((g&DKEj4Mv<5u?_7saY#nHdSZewzUMlgtz|6Fu} z@&}Pbd}Y{lRjhFG?DA-?AUgMT-btNOokpWACYk8hb2RKskV&)t2lv{z5*OF$+J_O+ zT;=XjYoQ+>jq5b=M{%8MH>~)*ziYwzr9&4pbvwlx82l^61SmBNQo2%K;Io>NH(WQi zNMsm*eQwXR#e`oZv+4Dla+T*RBXAblTSqXRiDs!rw*|VGL&rZD{KA1`jZSEkPNTFWWyQqSb@{~y9Zmk5<_^ih0v=!Pgi1Ps@i8^1iKw~a*y&) zC^M!LsP)sEG`M~9c;B6;$@_9(gae>i1) zwZ#%Qn8oD$xtC364~B%171B@bwvh6nzJ}SdRhk34{z02pxzT9K2ly*7k08Ww-*7ki zBNa;*;MX%a@T_*mTRV)TAysPl)HR-0_9R-B92RbUTuN7B;8!^Xd9knc3s=5@m(}Y zI5SWoLl)Na%5L}a+w|3`VqPRywV?-l$%(^CiSa_#T;q?|F}B;&fv9&50@{n{14pj$ zB3{VYVPn@z?W=i zM}vkEwOMAfb)gLWlqUp*QT4%Y&l$+}=VENO*am;dv@fQe+OKBY{h!LU*~5)y~;#w zq{#$qq|7OKArr0d)ntmPgmU4v7O~xUw#BjF_00-nHUDFrIvQ-pqLgnWWsF6Y{P9t8 zX-c0n{kaa;PJtA8qpe#pf=gL;b7ltJ@ZummD;Hf6O0=0$liT5OtaH?(vn|2v#gNf+<>R>hydQoC zDm;%d>V>2S-}stL{-?vLuhwPoJ~V-{Rn#<3X|9HErAv@feQseQVqtxI2W{9GCgGr7uH_szJbB0Ym45nsj0TUy((mU8T~vq= z8`Eu&S}m%nj=z@UY2V|`_iLzV{3FO@DIO@YT~;d{Yejc5IS-@P(>rtGSZu^qcwhU= zVy+5<-Cqy^+cTv5-QOX0{0E0Xl|k}1G2Ux9z%J8h?{czj| zNGyW#gAW=J>hC~qW{jt3&1ZXac{X4%JH+k)LR4A)qQm*O+5*^`N^4&?CE_u`g1pxIh}V2zqrD5Y*5Rn$qLhGf0L^DYZL2P5TiUy6rJK zUhah_$^-<>Wx7L-R7vLRil{8PF$w~*F!5KFSG#Y5UEy`*MMIrT&LqDnM&(pMVaJ~F zgWmN^@BF!|@8*e1J{92b)-pjQQZ4&#HP`{;E$iX8fco@t2&+8Mbuw)wZQ5i7JeTzZ z5kLB!1tyQvxk9h&I5;>4z(!VHMx~m8sC+T5VtSavsWTEY$(bN1yubvX&2n#~B|8V4 zZ_)JbU44QGK(5mmWok0=yWpC(__6tFPwe{S3BI+$k7+-pIDsFioOZ^Mjqp8-%X3-T z6171>P92Nd)C-vQirvSiXN&zv1^1C1vyDzgeIlw^e|Q0ShRpy|MlQX^ z|2T=;ZZ{#+UbEyQhxS8_x3}A0_Ec_FvvH6;uB+LFmhDCyH@8}J`jeUbMI$H+t&vaC zM@fTu(Wn*8v67Myee2&ex?D-Ro)Lu)xKV9zTy>mB98Q;RdJ2gar#S*#Zg6_ zo>ZSD$s0Pi_PIJ2pNgy9D6l~4fDNkdl)%lV4Zg08;Q_8ns+s|eD(z+Qyp7Pb)!f6D zIW8=Q4kuIyw+Kh;)_O^J24B}v;p<&hY5Rs-0ycW}=l$EWH$FcEA*@(JVjvGP*b~}| zqzmw(l6JclZ6YnOnI$E>WRoPQAxrAo;XM1@tLj}|W@RLqDTWn(W6yAfhD)~A=9U%5 zoX-!)j?djNbkKvVU56CjTW)_ho=P(y%~dK4n07O|>U`LWCWbJCOhT|H@H{G-PGnI4 z=yjIw`8V%4NN-tb;Mm55fvs!oa&4gT>uj2?Gj%nyfs!H*#Mwo;ZhNWJ@!L4lH+N0R zZg% zd4agERX;aR!~12Azj#Cz=!GK434PBGeAN=7d2II_c3QH}r+b9%X+#q^e<{99NXIsg zKFFqboSg0PWJ{IANeu?ft?U$=Lu{Hk*C8}N8P@1cb`xS;yIu;jCq1!{TV_#rYDKRX zV@2mRelFhlw12>lzvwqI@wQ*lt89y$R=Gxjk8gvs?`>Og4JSzI$4u_vVw>{{7?{dkENu$v7>E*NEot|*FAMMX} zXXFaisvi_gltyrimtz43fAHFxU9jWH0plU%@T{;?61#$r;f$0h*}~ zDgjppokG8IXKx5G{3{MixhP;LhJCwfa6}0_CCHl%ntC1{;(*M|iipC6V}Eny3_2jbE-hv0uqrZzcF4T-em zIb2h@sj>OGbBSVD;wlAH!XFZAY}uUl?&W!tHn%cppexbtJr4ee1gJ_|C;5`HR?Q5q z#Y(V+yz)`ACau^lIo0;HErly|A38zBQJmR9L^o}PC4s#s_~%p zD81R4%}G2SAFj~(Y<<1Fp?8-3olvD48pBdUm~Y(W3p?hA%&nFgY;X zi@Ryo4t!!{g*#gE^5Y z8I0!Nsz`Q-SF&c-7c6bh%sA2mLd(B6|QKzY945P$uoznc)cZD0sHPu_PJ z>QK0v0<}8d`u>2^aD@M$x$(kg8AE$F0Cj_EpkGEpf=V0)Jl;rp({D16*u%77#y!4J zwaTM>2BM5uf2eq@wk5~x?Cfx%IwvUuO*l&L%R}r6pq%~}*rHc? z$P4icR{}$e>sFE0BxwQ?h#3ebOx67U3AU*5GeaaW_XKX(FVo*EdI>&`{Lq!h`TUbf zH}TPAr3rs;93B^UgkN;CRi*XBQy7^<0%Md~u7XTaB!+2=$;5jbW2qUzajA+eHdAT9 zAztRV+t;Y$Ta{ft0^)MnB`DpwTwK3j<~!#?%ia#L=%OD4{@(j(&h=_fj1j;8K2>s- z(JT-$87VDP8Xze%za=nDn*_!?-E7&+l#dsd%r3c&*m1Ij1Q&L>#uu>G&t?-winKw-mhJdmlcwrRSC^w$Tqa)hsABoKU5<8^ObUf;F2G z%cLK%5ENOFpefHFM`Z&IqEWb&)L0_#q&}^=X|cmEsZ7(Z;3!ahNC+L^529>Q&xO8gU z1*;p&ma`D7;|ZM-Nc65KB%I{j1K#KBWfpKb+lBL?~Ci7hSkYBe8e6bmqCQ=|e$yR3XMX`nq96E$9W zoo`?DFCULjS?sjaEt17w<*qTFEtyvXb~1GK=9ydirEhU#wdFZ-I~R`C_)nKCbO|(( zeyNp5&PDmn;nfb|kAw&dM7fFfendNtnvQ>TcGGnmw_+~X*QQ@n^HXAE(N!#(NwLvx zP%N60%X4rW4=;y`=`Mt-$kB}@6-VF7K1V$VLZ6ePWL|#A8!7VUE38nLljNLx9^$nN z0pKClmH$5;BJrlDExmJ}gJ?AE+4IyQh8IpV)KT23Sh4ZpEm)<|rdS6P92t$ZvJ#x% zDR%aZ*gln*17ISSSHRkSJAfsM_0>^CQnPm-u$Nh~ojp8M+ltJa6;Dta6q*A08T^mZ z>z-9-b5`1=YYRS&H4+uRdoM!M%G7%{isw{q)hCO(ls`vfik)yX7!+*v7ehMRf8i6) z#3kbqdovEwW&OSnk>&a`fC_kBQXAwYu9uIN~U?NE#&1QY1Tc ze|)$uJ>S;l{E&uj@+P1n$zG7C;hLg>={y+B(rgJ!R}l(Cu2kHTkwKDO+MWB2{a(?V z0OOhw<7BTU$L&!~dA?ktRm1|lC5 z$)l+z*{PHSQ6s*PuH5VrcuFpV9`pzRI~JBke^K1S6T=w+JQ3-C;fYm)0G^29v#C?- zc#?~b7A6a5s>>$;G2YqI@(r+(sEg=sekG-YTw6>V^)Q`%!ey)lBL+>@?=;fwC?db) zaKnS|Nr!o3g<}08r~`3ystOw{2Ag8Sre>n_P>_qvT5UNvARwK8bby|~gw7rQ7Od$BZU(&u&Y z2LsXad_RSj-Nh3RqIw6M>zB0W6j*mNzxwfd_}tHY>-|6=C3P}Y-w7d^G^EqqX>~_boaf*| ziim8s$7P}pf`Mh^H%JwkVP0doB3iEIG+6wZpIW_!nS+y4?5&(?7Vp`~2^lsvwoA$R z;IL*7vNSG8K!7CunH{CJYGnEX*`Q{>PM1cl3Y|`wy`O&7#4J4F?H1c}sC`2MtG}tL z;H>(7q0@?c@N_t$IB{VP*NmV}0Dvl@l7+FtSJq_O~bjs)?v_s+_!qP@;u?*}>JLeZror1&hzamUyL3yTa0eHH$yj;Iaf6d8gke4nlIX zaGI?=VxJMPhX6{V&`_2XT8L8_$oR#q)Bdcy==6KrCxR zQW1T+L-O(uL?ZM5LnQY6fk?z@cv3EdCD~5p@*ZH?WZXyp7m?`k2O`mw^mrQ3d5jv>9e__!*pmrcP~SOlxH0MDde3lppklbv%?bJDXhUa0 zxVb};r!`q^gcfRdShqY?BQIt+R$-G}+K%$)z2JY-6$t!+BBW!o|5GWRFt#{puh6Yh zwpe-YyRt&pnS?vz`vV7599OwqyY1=bbaiRZNi>MXhJ{n0fxt}}$E3|G!=jt(Yf1^c zqgf&SzJ$~;GBH@4eP6D(}0KEldA+x?wd(BqJcHIINmg8q=J z=yM}3h`~+E>{iHT+np@OAj7yw{`{v%#((|O;~pc$PBbheeUD&SZ%43F!DtUo2ZsK* z?L=V4d~ZJgV5KvZf7HprArw$ETrR&j#7uMA?Ml~JZ-@u=Yg4bW*W2wSbzK5G8l>?S zUVJna{U3NAd`-9aoR2&1fCw6Z)lixO6cQF#B2Dy!Ag~vBR+!C6-sku*(WrMMvkGi* zyGv4%mgkc0MbVOE1OfW*JSTP>H}vbJQV_QV1toY00%7IYg@uJ>txh==PuBjmAOFwKs6ya{{$}#^i!$mxf6?IdU2ilS0|@M-``tE@ z1MvZPLV<*qh@GRg{+Bcg`FvMjtzvlW_uU_%;0bg`(IJ;ff$+-p?P{xidX$J4)c?Q~ z`}barnQE{f__#To0}1g5slxDB3qH$CL%Qi-?o@QxzuftoJ+-ku#(XMQ$Od zdL}bala!^j7yth~zN#sn&)4jL_wu!h-u!rdV7Tbc-8>QA6!p)`!=Jkdo%KF^9Yued z?E5_n>vPI;WA;<#oyl^ekOc>R$4LTjJHS2Nr$sR+#zFgsI+5Jd6rbB$F|r(io5txc zQL-cqSqEfMT%4bO?+Q~>S2x%XA?{ShBQLYS_=lnLgB{#LD51VdJpVr2`l*ubY=qYk z%GTJ>?adVk(iJ;C-hjk&OHG6`gRvLEq%Ub{YYVM8+5A9Rezb-#^cOwPznAARe@{qK zvs}k6yl+2^>-0Y|H6I`l+_QdsCSaZA=ue=bMvWyZ|9;ayONj2jeL@FbX?}m&b`<&h z510&({-I{zCLW*o0U9l1!mvYy@_rVR%763^JrAbAW-#Lo?UMvwO$vbVE^+=F_n)uf zn|}>1oscwRE&{W>>gA0{l(;;Em?o%G(LEOa8HDk{w_^K z3`SXC$dsqZe_W^j=W_R%d+v^%sy7nTeJxS{(_H_r|NrO-dLbm`$J^!v@PSb{2>+ki zQttdu>JO%=~_cX3{ZO z&t|&*{mcLPmHPva2M@gr9^{4|z&#zZ*TMg{d;H7K9>QTFyo6%PO4_G4Gk?yOB>CTx z{_R%?PnglAV_5kr4;z|fVrG-S!2P*m|MGK>LeY(#oBh1{?v~D z{W)J1Xi>trCk0|qvo)R%MMs?A|9<)B_DhR5Q8@S`CatJ>8AQFA`9C`7zpnjClfr1S zWp*X_&}&1G-Hr4=whNsdR8We5@RlTn@kUH`HvG>;{?C>BCLWbfhfp3oxVxix%&7j~ zxWw%lL@mg~DC<08CSOTfCZEUR?z<`@3*70MnHdJ2^QQS-ddT#Q`XkDhc6PN+JLZy7 zgJlwNWfFsScXuX1-ByF|G-vbcNv~f7{(h}R_Hgd8)N<$xvH-J8(nUseFwR~-c=&|x z0o?!naY1H&AbjnxBAiSFC#{m`p@+ebOYhomq>Lzb!N9rnH&@=@@1wv2a6$263Nf8~ z6LW@_h4X(d>5uZ!c@WTJyo1-a&Fy@fh8GB_OrQLRiv4$WzxzIb8)E$2Awq}Ar)8M) z`V;_s|F%WwS`QJR_C({E58xoR&c;;$h4-Ht|3?{GR&YGfd zPeehpr9Uc}h2LL#STdjX_cd~NpFw)fSY9jajjZ=a<^H}#;CU(WKk&$5d1(IDjL31X)j6eK`ht1dY13WcSN~JGX_dR=u zyYQ6w??x}WyF2%N89rIxjgBeYn}&&yu>P@c5kTJ>F#awU8%KW4h;pTmuA+!e3@3wd zK$><=)TmN=b9v(L>UVdLcYgQvzenN!ebev!pwk!jQ#qUINEvOuXW^W4o3r8p4=QfN zqlQeIQA_j7qctgntkH#5nZNBTTT)PWQ$kF7IU4sSxx5AYA;8XmP4PU+vKE{J3e;<( zPIsn+qZu@z0IxR)Odhl~1{4$&mR45j07WkYd_LJifq1|p``)34h=lp(0%HY=^-xFu z?}onntNSsT?&BqPg2AV?slV_QBB})Yu(7|;VgP7rsh0lt!azWcht0oCHOLNGdh@rP z5f6rwAx7{+?9YYZ5n8ov>o}3o0w^GBxzSkPqNuFZ9!TP@-xKqJPPO9Acj)ToXQ#id zoy${DyZ$w--6A}XoTYk1`<}s1B*g?QhA&ZY7+;H;h?F(AnEdf+AO3c@ z&o_bb^y+-!{b2zyqfK4b*7D2H)xKE%0@X^^tyO!1!NoRz2+(bH4Go2ZO*EC~C(XG! z2mXeJ2J72vhkG_SXv%2*5`dQb$5nnM&Q)`ZD<@(FyVbvWu1yVKvYQ+`Y96`80zIr` zhFC~nZ*xSh+m|qrVQR0_`h&Q(ccst@7&gpacn1fg^*;C5?uljE7|B!ou-h_oqyc#3 zvYC>B)I+b!iy!`NQLf-6p4=-%9#afz0{leYVD-r=8B&!BW91aK_Q>?!cs7dNcVoT1 zbiYmDRW5)r0gu%fMGiyPSiI|MIGQa<#T6d!ybjbJvIRAN7*LjXlR}~x)CEkDUc}Tj(ivA7ooT#x+D)j7 zNZ|Mh>3Y!yUq{Pd1jD2O2WbQNX`VLk7(7dpk&5&0H<1&$#8;mqByYL&e0NN-d<5TFzEo*kE2XK`x zyMqN&JjaJ4Mt*oKPvt2UCl}Wio%SBiR5|#Q_|3I}Vat8@$eWol1AP0 zMa{(6+{pv`5}dzIV;<<}<5mlFbdy&JgHBb_XSut}+i!AH1(y1MQ-36+YR~1N25>X&(~$&>VEB3z`f06fmKz=KFOd2HzL_ri$WL4*y_BE2 zqL7MwR*ksOw`so1;0H^SbzsffsX6a+QA3H0|(f3#O8gtw%n&s223c3JfBc&hrlC z_X*Ab>JgYtR~T8QTcvTt5cHPa_8Ni3Y(i+pd1e#y*VFH{wtIq{w!2{+RO-115^?Mr z+|YW-uO=5~mc6-6jXkOL{dRkE;fig!$A>Fo)%L@kpXD-T1$W3(d2X)Tkl&lH9|*E1H8bI6iY`z!uuFd@nR4iSwV92TWWErFS*CwST%X<(!xfe0KW8O2 zsj!z=W>~Om_Nz`A(n+P=`Wnsd@K`yH)v9os-U|9`xK!-w^;ya3qbpQGXndvf@@KJ^ zbmCMHgj-!gtIEpLlSTW#&U!j<9fgfqv9nTv1te>qo_F?+#J*^^g?_}h4%iUBsV6P8d2VJAe%jvS9NYg;cTW@LeRdR5Sa z1z^oYQ2-Cie~k?Q9TKmm>!9>CmGlzO;55d?3#dFJJb7Q3$aY3I12xf z`|2ZThg3p_9^ExH0foO-e#Dc`?aUH~ffu^NPgVB{;wcSegC8)={idOX8xoR;8`@y1 zIj|f0adzizlQ+CI;_dhuGlr1MI%cwLi?WEyFoLqoVd=eS0(+=q;OYC+auznm6{p!^ z3yc#Yc7a(}fUx?ywR!>!KeQY~le~p$^^!w(vBH3M^<;mzt99?g+9{px54?FHrOzxL z{vZ+Ac^A|2!TDT?92GZ}1&N)ZQc+afFB@~XA&7q8z;NSQ=N8gVQ$(W{quIi{_g1@} zn^QFoI@BQy!S9O_8SR{Q8e;xBEq^a-x&&0h`N1pl#P%V&rzZumKc4FSFc>^tH3n2d z#kjhQlIhIP2j>yJLq8e5(yXlp;dG-m2nB1ng!}829b}NiT8{-c$;mvuWbu4LjX;Kn zkbl2szYnUgjCiWCVlYOp?iIJd;$Uz88`u;nfx*N(FaI5IF)&ffW;{`Ebe&m05RIf3 zRIR)*vQDfcUZ}Q-eV3;Es&X9p$G#}HLZ0}Xg*1Y?0Xc_K*HdH}}4_9x^UsU`=+-#;s!fLe_ zdq(&!gFFylw*8r_&Z!}PJ^1Q^TeaE{rRJ_yv{q#V#;iRa!Y8q#n>otL?m=Z|p^|Iu z;7EPjV4ioPkAlZl?3O*p^Z4_SelLc4+I7TQUkvf9Oo_xWK+}={ZmV<Nc zc)IWc@g|eCYd0G(aW=8>gCwggdml|!sGpf>?CmB}>NsxMoV-eCikK^^6^O3u7hpgD z`XJ^k?2JJ>Z;j&V}z{dGl6eVu|L&VgumqT^zFIJ4H#7kTxT-{EjsVQt6ZqY*yn&pnss)-GnV zUmv@gH2v7i+=90iIGEKhpAkp~6Y_?RoJ-)3W~O-|uO}vTyi+eT#@ykx7oaaX(r2O8 zgl5dL#*{QP9V=UHwC0q)6brE6)NQ6LuS76PpkfCnk3OTmx9m-t<))+#d*h@ux1@fi z->klLi)Zz3=8B`hgD1tdrczAzmn}(C9Nc7+^+(8nx{2fs1JufEHI-)X%gNfwLFPB`kdrhNa`YHHcZ7HTP0Z*7`R_Er5#d6wqE47OIy=p?Z!ew&Rvv`U z7F1(*hWy3eA@-f_Jt9!9%KY=@K>B0(Z0QdZT))QvP;e0F&JBROA%eq7@4eM(!0ai| zU%Xt)CKgW~IAAKzp;oZ$!*(|qc5;Ik%RB{l2 z4(Ac_Pn@NaGp?1qpLub9r!bOOYd3PErlux<84>@UXc%EmXF;26WjwHMrw133W1i~i zv8%V9i6VZX0+Lq0ZchsQurUZFLkoT*6l}9M3uuMUsw~Fx0X*=ia^{;4+D3~{uw`|g z5pDgIZ$}SAD3{(Y%K#lsuuj)l><2FR+h&hU9T2(48^UTb z3;foh>yp-4XA1T66e(xlbM_Q@iZfjg7hBP8o114i?Ka}F-?)*wYEEO2zv*A@q7r;6 zRWj-}G-(Jw#FqAAcR7dY(2hRx{6;L9KJk)M%RU1CZYIN!<+{Byk=-?bAbH%pHYD!u z`~ahTC;v*856_|i{?eMsF}Emfv0kkI_K-Vf_Z4~XYq)?TgG%hELUJnjA z(QfIvXE$*5=@z%|F+tjwm%knDUDLc(*otQ}^Xryl*IA)A`1rN z4VW`=+$|hQInv~QxtK=M7L=`g%ffhbd_tjKdlyUCcuCzK`B84M9dk?<8AT^%vKi9E z5(BI?!|b?jl=WJ7&XX<RWP|IXS z(y2zh)9d*J&Y$E&L_~{ED7SaxoXfMXtYZ6{hIN0~1@9A)MK56F3y z{_Qauwg2!KgJxsS(62;xhr^dF2D73w^}7Cg!RA9M}#w_NEF$rQzk z9s=pfGaOOy^5QM|+GY^@m;jpu;e6&q@Cl`W4LXNWJa}_uv zZw-PN%NS1W<*$qAvIg7o01~%&qQan|nJUZj+;T25el%Yu(HoU8WgFTsS}^y6{zsuq zbtD}mj$H|&vQ{`Fs2JnREk5fzX)J4)s|}hCL}EARIAYNS zA$u06dnl@f2^`sq!KRC1FJq4t3`{r}6WR31%eTh8`Vu*df;_r8&28A{?D!(fL7Yz5 zFMP8t`9j)2{43t1XOZCiYqdFG_Jd2Yq!}^CAl?0ryK2Wu(c3?ighQr+_B}Gub4IkQ zIfQDrz1>$-E|bi+g;#}pE_eWfpf+17=5&xGnpKJ76BS=+k~MRM3Y(Wz?jlyMDa*+L zWP{emy>>js)1sMTFM5rJ+&E!dTP$K7S!(6FCo6X?_AE?|du*n+(SX`VISXJc3j2F{ zZ)HBKma6C;unl(2QE|*`HaK!8a=L*aAjg8jwJjR?v}}9V%zz*Um`-bvcodp^p#^xi2fkr0U{RbCTYz! z%P6$x+y_ME2^a`qci%YL%CI3xYQa(+;!$TroVy}7#|nw}6glP>SMm&k?OnP04ABk( zu<4aQM7MEUq4x&DZ>w>Xb{!~IYmY`i5mFqi*4`942VwPk-D1oHKgNuStEsm{`Q-wI z-P(i1Hhjm=M7GG9_%k%a zf-qmm2Ew_vQ6ZmlWgTo08L$n-6DrZX9iiV={QZk~<2y>Q!CYHq>qwC(29cet;aN6w zg@LRnY0d0N1#vgg?>JJ1HvL)wY;yh3qB@>zu(#mesa;QcW>voCM|nv`AKwz`s9+QQ zF!xj~l{>JBxvb5CClA=yPWn4N=DzHSl-<--s^M~~7^}=0WZt2enERGAfqU7YQW^l9do{4Jbix;vkuL7F{Yk?*W{39Em*W}RN z7!kMrYhhFQVm{YP{ng{wr>}9zvFT(~W`a7_r)zpu6^3$=Suomjz3EV{X_3S`B+mV@ zXw~woKi-I-E=Dp&jm2QZ;3;Gso+n(p4zh~P6*<$2-IU1}PZ|wLcDy9+4--5RD2^0W z&qon=;0V5OI2<;xskilnKkvmK>)MyAO~{(^53!lMg|~eBcm%{uvsJ?e_LWxqtjx!A zT@;@$-k?YR9x(WHr;&Czu*du3+xuA%123SJdzH97Q;^=s7;&~HZPVFlaVSjy)$NM- zuvd&MP*q_EPP)32xD844uT;W?!&)cXEY(Irb;t*Of@@$#^^uMG)IS~^^>4}#GiXpw z^{7@woD#jy?YVU7y%Q#s8CXAS!|jqiPxbG;I|n>d+kTOdf;g<0B;_qc{BYn`^k-)JF)9c+|_8|@Tz;)hzP-2C5u zW$=H^gov^^r9MLr&K1GJ)4AUY;i{9KlypbYrxHpzc&njoQ8yH~ekd$iC3mDapDTWN zh|JkOY7}h|;;`A{Kpi4==7q0;t)ykRd+J;_&jXpoM)`}q1zqi-6&!@8<9eq5i&obV z=20tjATaDOWAaqpQ7lpK3YIHtld9**-|gEQCbO|!Q|R{Xsrcg`O=W$1O~>`wFAJD< zp(-o69Qp5YTiSf}e0M!dGk-wo@xh6=oP=@3*22%ggGw=?BE~je!)<@AJHvARB~tqD zLDL*c1?D?VYsCtr4MkwOp$k~@xi?w6D6|wuj4AX&0#%}q^9YCLS}Inb!4EB`<@JEA z3Es{sLrM1fVxc~r!S%0Wu)*w7mZQO~NJvXN0;y6Q{R^JQSlY{Ee?qDkl|+3@?Mv?k zqzvMK-V>ebJ?o32_Y9s=w_G^v4ai}mFp#;cyQrlwMJ_=g3?S1H{$Nj{(K#YvAh@D5 z$($otS$8*Zvc(1@cVq`=`iq z)h`M@q(fWJIs^Obh2*#nZ2&LpN4r$Qo9H7nNX?Ku+by@uea->pvJikmM3QsIj#%WvolkHwrmBv zS}VRHLwdf{0yBFr?|7o-h}dRG`ym~Bvg>-iQ?f0fR)dedSv)r#PaS} zhi6izA}=V?WcaVT4Q_vZzbS62$vD&&xqPdXoMv6^7I;hVuEILizq9V|EcI*2u{3SE}5DbLLa6h$rBHj3uz zu;g>2zjpbt9NuKs^EQ|kp01*Y(LgYK8QiRQvajsoz9|*ft?2oC4eyKD6v~j+y2@ayufoym+&jrz0`}OWGCU|!axO?-ESzXpD z#ATW49l1@ae7$U5R_*qcZ=868#I#pIcy_b#+KP~uTdjTP3?Yl4Psp5E z89iO<%N6~z&RM0EywZ1MHH+brm>9Cv2_-8QGiszV!=2ApnC&LINAjj`KjDAF!wi-p zP|-NOp^R!IMm4IA#8@g0!d@z&rUQpi+hlNJm+>D&`oiegw?-;4d90KG8Jp7H+w{#& ztqLkOd?MZ=O1M`32^<`Wl1qxqj4LdMtJSdGBH3J>CPpJZYfa`UGT?DLmNoh>@7e;) zxzO3(*6sM!R8uP=SKk^)7}aJU;(N36_H#4B=0s`MtfdhG)VT>jAqPS}lO6{Z^q8A> zeO74TJ$&KAz%`onnF))}#&}M_x@b~%#(H2elUXmJ5MM$gMjatX44WZj3k9B!hr*6@ zOTHmNtv^*47>^9Df)Xv0+yaO=<6zM=q-(uM;?-M|h(~%5Xh4l$X>gis{^#&jz*n|8 z85c&~#ax2FL~(XK8l}rs&P&RFvl=+=S<85mEA2IVv+G@Lnfdg%F|=hwC+6LOY@L}O z7DIu8hsjKxMvx}%aD%r-oy&=#{MYf251V_Ved@J2Vr-3PVjxYzdXok(uNWLJkES{N z5MKG_rZO7AZ$;bEo{nW!0~j;NBb{WrdM2flnl<| z2SovWP1b5-bL9v;*=JdS8E($?R6)(bs>AMZ=4s(HEIG$Pt65vIy=^9o zqpay$8BMq1G@#OVy_ffafQaFwF z7(U3)XFFlZelWbx{=tL@oEq&>d-(t2sp`RGWCH-$b~w7nN zsN2JMt7mXb`P|?uH=186ZfOMn-~BOTlE`x&>}$QK

{Po53n(N(8J^W8Cml2;D(CBIvnU;@M+~PS$!{#*lT5E1PKg^ zvTKH2C<|QD%S@)C^m-4G4FGx}adp?VdP=j!R#|RNw<}E0tfU+c;;P{vO`p|BE`e06 zs<_fhfE9$pDxh#c2~N|LguK?X+p&iBS;k{fb>a8+>%|Ex?rW_B-z@Q49u$Lkj^iQc+Pfl<2nZU?ab>*$mf&K3JUdWM%q==5LaHJc=gswp+ppAqd# z!W#9q5`C69)ymd7`6$YfJ8(`jKW*?&cJuH#hg(RIOy;0@e8|Q`8v5&Pm~lpeBQ$ou za!m+4t#AsqH`GYsN=Hs@Pt(}%Iq~rRA9)#b8#Z`PQ&}f+(%90KRX+$o5$DHpkq;IpHo_7tk>d51< z7IM+4F(&6%En6^0>WOHBAJ(LwJvzK&~fh-VVSI z+$P*Z;ye_j4D&oyP|oGDG0}p_2ZK2K=SvVFMTKs~-H&X*wtGzGelT~;%KF)x<_l2a zN=)ArRaiul`KX)CZPpOX+l)RHk38Z68JbwlCPZh`!ovAK@nn@m{q7B9HBrj59Wlb; zJJ}ov1emUQvoSJ~h?_Z_872F=!#O&9-O3v8hbbjDye^jl7s!~97S(!}&ypgS7l=IUBU1W_O;yTEiug*nA7 zxrtSA4A*g_fb?`{&25g`=}e}hZ)W&LuRrbs;^A8OQ51r!vpcXktKBFS2+^H5R*_T) zo#bxTz5A?0W+N|pph=nA!4QE`SzT!j zeP+uty1zY+m2su8H24+IJVVt|p>1`ydS)W8RkJ3J(K%;}rssT#c}toFc5_z0Mu?7% zweZ?C_^-2pGlj$@kDe*g_fJ-)UCmx-lIf0a^8XdF= z6FNmp*6gdSlHLINC3>4`dY6f& z=Y9m;eg~0Tv9#OpHtD-2vzE4w?AZfB4gqIrT2;Xd&e9LFtEV2X#o{HwAN|!8Xoc8= zBHnm&F6dCJN$whmLHgp=b#h_YQS}pSf8UT$Rmb3LxxA3wBfOTa*p(YO?_7e4q?iy9 z@4~u34v!ql?To2l-tfKBqGJWQx(4h!r>hN$S9RAx^s_gVQe9(hV;x{4WI!}U13~%NB2|aUV%fYDv}(4d`^_2n<0$XHJC8`gw1@-)Y2h&KG2R1f^liP^qF3T&}s^_bB z3{glXhU!FG+BHpLG3h;{mSt=t=x5Rkz?qb{oFs%FYHI%Nr7b?neT6n52VkiBn|q%> z|5Xms^z5M({1D9-!-Z~EY6gTe9y>W|`|Gd-Mo39(;Y8kr-=LwEh>z~q@M zSXpaj$DK}grGajTLZDR2%;<8l%XxyKlS}wQrwFg&yo5xiR2C`QHnpmCsl;2CUkfkl zlHINtvDr#%^Xq4-Mx-(i1CVEO{rq6*b`~F;Skr*e|6J9y%M&;vAeE-Bksh!TYK8ny zQxzN3k@m`;9zkIo7bhTsj9EE=u1npQIuQO9D$)J$dg$f$7?m&$WH+JmNx>Zw_@tCk zJc9uBKI>u&qm~y{sWq&AznbD`^+EhA|72$Yb!pE>Es^96=g~ zT(w??Pb(l2MrcLPU>-Z6Y1mwC#NE@NMQbFXsqC(axa@N}{hL5c8mw2`Wm2<6r#=f- z%x5>Sj-SK9!6jyQ4^>JmSq`v~syru@jHaNNHebht)O8D*jzK)QoTjx)e%ZW&2+fsG zD@`yGY$?GKk-8E$yhGM{AhPm)tJ={$b7(nM0U^KcU+!Klw67M^Fr9oV4cV z9Go0BgK*S1AiA_0v^AP5+2*(Y`2Qp9t;4G7*7ac(5fnj@Qd*F1=~hy@S#*dU zIaAK|d%t}8j zRA~9Ms~f#lz6oNcqn0E48nA9W`MrTLnEYIw-8EhHryqdFkqd|;H)wLe9&EZq*Qah4 z*9+FCUJcSbNUJUVD(ytYm$Y^G^qL(Kg#nUZiTQSB8hs$=D3aU`#tby?R>k|molvlc zzXZCE#k<(wNIb?MuK-olR{zAxEp-2{eubJdr;P73&2RqK&Xo&+&XAitJVmCzt~#eXjbKRQEuo())-u5>TQ_bPorEzQSPHnA^9t)q0KbI38!1ZyCGlX~c^r?B}F2=V=w7K}yKR^rZ z@Q^rzQ+c0xXdJv$Q7`?>dtL8VJ^M)~Z8w8v8q?X!s9M^LNIQ0p@VwfhaFd05y}L0y*l+mr9Ve&+|8VxD!3Pb#5|kX3HBTb z_t1huM{kjx)YQNv+m*$RkAL{5c32TF(#8(=Ts0Brndvm+Zx4UqA}2H<95-1HC%}w3 zgsh~WH?rEV=nRcnX`CoRA3*_9Y~bCw+FidF?CM6IGXjU#>KV42cY<;}9>BQmlRnu1NR;#3ECuOHP>N$VTfDSF)NJ&V+Bnpo^FIM( zt+KpGIQ!FkW~CBZJ2hW5Qev15(55t*w42Lc3R?8#>683o;_KqH(3{+3HKd($bONTp zxnj$Hen}5GEH>H~PwH4{sLb)_JZdPptM(>^m6;BC{QY_6$--T_L-SE;d%oiF7oV6w zx{X#l!B&`403p+lEkKVybfL7k`B|1E$H(YjjUohTnl44Et?%JCnZWVtB{-P{$69dv z%N)|{$iJjcZ>W1GsdC}Is;9ctxd`gQD;=8ohqo1GZ8<{~uD%OLgY(Um4@R)^l}Gl` z-CuJ$X#UcC=`W&Q_7QbwwoxV(i0$(M38BC?3==ocZJc3RWSGsMjMYB7g)rOuTAx$EM=YLSOQ`(;sM0tM9#kYbg^snIeKp zpffxaeJ_rkjRl#SG38)@hs*s?(o+-H2B)Wx+dfK@ijp7>p4J-PJ3TUO7Zel z`TSe$$7}x|r5`Wd>RJb*iSz0gG(k2Gr@2WG+F!(^h|}^#G^=bt6>LMtK4V4BTOmn$%*juv2@*+5`zY9mVSgoNS-g zN-v;xSdE!ur~%ZrpakxEX`W~1L+I^xs_>Rfk%HNSCsG8Qw5v%IkD!Evgex@ED^F** z2jI;N;qG+cvY!vwJ*tk zZ6JXx8)VJYQ6!5s>!m9<*}f`$cKx9trIsnes;b|0pQ!pyLUFhq<;qvvI_pRHMDc22$?617e{Db;+kUrE=b3*=u*nl>kNrZr{XUL;eTk&9YjVjXF-6rpNWk+y z0%m{^Mc>1A)Nl*yRu~MP5^^fr zzsFN`rP96l&eS#sIcnwxvxuUI?^h(1&r_kwxXX(^JlxlHhi<1Da4A7Eor~Q$m(9t> zVxC8kI5fOb^)QRvIgfsCGTZ%qrrMnB9O*vV{vT!sWlCki>Z!mu%0&6-Qs6$rGO@#8 z$B`K-D@C6W>^PPR!PHcGodFntwAxz65@&ZD~GlHi5z{`PtB zY6jmNx18Ux(b(8~MCdg2(0ezR0BU&|JMGlLB2k@9en!+?<}tyJr++!O5Wjo?j;9vF ztg9U8%7<0rTXJ;htW@aQ2{FZ*YiEdgJRJtr)EDV%a|YTuQsVa*x$KT67(j~%wBFP@z6lTOSdS?G!BIN$V(8uK5a z5&2QCgh{!XkjIYngflF-%cb){HlkiCu$o2YR1}5VH9aiGUq}Yko;5>V^(1s~tQn0a z9*s6LUHkFyNT9-t%Kr&~ijffF43${1Za}5#_J3HW)E*%|!TbhfM9*hJX;_v6p8R}9 z#Fw)L0;ctENRfbk<(3j32gL7lf3%o#qWjsI7k$t!T^f&DUTR#uwFUz7xI_Rkc} z3p~8Mu(dvQW6HwhIBk&K)^2o{5)O{ZAZl&}vU7>D)%5PmYljE4Ac@RGd$7!aX1SkR zfl0-a`w@{Lh`eLH!E(`COGhK`lhx87#0cb6Xp{=m?XQz~)sbbQWd@20SrZ}DbaS{R)) zuh`4`)0A>`ni`h&Y%rZ~mdFZcYJ9`+xv9dZfaxH$QbR!U+WtwJQ}Bwd2)dv3ye- zVPXpEPLWV{joO~|Zk$)n)-64S^7E65Lbj@SbV25>Ls%I!Go2X^V$@~OYuLsg77esb zX0~5$)g6c8a*~W;&Rt-CAo3}579l0XIDsWuD1P+ZwNW9guXtbT7)_&OE9Xe^Q;w+! z2G9wsRxw22X1yS^YMARavEhqs-!96lSTD3@>QOBvN0#8XL$fUcj2%-`94cL z=Fou#$Vg;?GbhZ~`-bhU?tKsBW|IkeYORKv=EB;tXd21NzPrs~U;<8P2b)(Y&X9E> z+_43fTF!;~>N}B!F&itF z(Z*P#xx*)9srqNVQb*-@gHeq8@#)X3ll| z=6>W+T=NcPI4RiS%WHiC@Rb=GVwb}es?_MYo5RV%>Cdps7~ma1tL^aVp+thzSGQMXjKpa9XKz!@mJcQ>-Jv9SQ}9PLr(Ti09j!u*LKkE4H2aM2|Ki znKrwBB@y45+w1ohqD%?}mhX)fn`58y#@Jo$Q9*(Uxzk;=se3Dnhcaqq{n_X!6&^KP zXj;Ro@!bzErHt^OnyhnT?o3u?A~`lA)&vD!yI4Zl9MdZ8_Hmdj^@rjx{;D|3Fh zBF`343^p5ABIcU}8IV&MnvqFZ+~?2_T4~cHB4s=wiZ4^JOwC;ihWvF6SR#UKhHU3= z&k83a_DxCwfz}emskr)aGtNGL4%??W*AZ-w`b^iw`bo}4t1d9i(IF1TGxvsgEm9Wd zj;wvDAc?pp_@v>hp+|LVbr ztZs)`0p0HpUQ{y=F%u8DM4w5V6QUxF&}-HWwgqB1#WYu0E(#bAW%v#~;q<`6Q*F_O z0XOS_0o{U7T-KmRPY0ikgIIicUgOfswA>K|KTXNF*a&Tw_+83i6Zkc{mACrg zN3s$)eK<;C&kPSoVRsx6J9R>na{Z&vip^RCcCTa_Fk|X{gEs{}q!O{8daM92n9L^Y zykGU|IMhyJbF!&0`DSlTDo?F3HhGN*Wqsf^*Q(AqKJI`~!B zc7IT}(V*X6@X@pHFyhzo@so`@RCVBBLRpw(#O2r!U@@Oiiu}G9CokhMwK9m{2EIB{Rbu+GiVfure$b<71WD#C&rH zXA3d_2;E!*`S2J7aACnJIa+6kmX;Bk$iHfm#nmLN^DXBPcZSJw8}9Vc#c z*V}bzq6w5eiE4>B(uP0+A+0N-}%`JSs1D)lz}a2 zHV<%e=$r%)CE((O%Tx-rLnFf9z!rNgSS%)(r>zgM+^#MpT&0hK!8tEY4+>WR+VWWi z97_E#7`Cwe?WKldE}HuJJHJ|g5d+0e2tn!QYb!fobf0=nQ|@ezW@qD2Pb)a&w^Zj0 zk@=1<-*k8qu5}bp#C!H#dGgSX0t+t3CThAV`y({@fq2+S7^XEd*vk5`MbX~h7e$dw z=ut7uBeQMmkzc(5sZODcdU*i815&YclY}%tgcS)4{217;qR?8*=$; ztZjiliAX-={N>ftx52w6#ad%_kZ<@Ci2z0;>Fx#);hN0{X$8qE^lBqn5;Xbbp}yt~ zjivXffzf?~_#>ZiLSFJBNhwOc-|P1}Qxok?)zE}PG@I@5v<7AnM=KU-AwdM3H3Qm| z*n>?_+I88E^?m~Dz)b-SGTg~Z%Fbo@MBz-ezTxU?0ixCGf`Vtc5VS%LT34V4L-u?w ztpiI_T0PSWKD63Eoxdm_Cryw8@W7kth1c$tqv7@KO>_bYY5X2tgB;M8>dbG{ul?MY zyR54xX=3S~bdMz1Zm%z)Jalj)8mx!!eS(*Y348V~S0@gip`h}xz47;&l`?(jksU%1 zyx>#Z7XOpS-Q4s5(Py$$Gt}&}?JEbID*@Zw-gSwMH7Ml1iLL(v3g@pCE2&x+JDdLQ zJ?7nuQ?SU(>UDN|rlUJ1x-YHblZoAV6zrLt@CXe~gZI~qqR-C^*B*m(RH6g6De7M# z;Hvj`hvBfKy|PFaF&=}UCDZBkW{t6PSg*_y$(Rbgv~f#r<8*d$^AO(9iN*HIhzA~X zasQ_UK>5DlYvKON?{WA!QJu0k2bTYrJsv?TwXGh(oOl-27ECaB-E? zEJ`^$8sN{hT>Pn6pu+UZ&v@dMw2O;NR9sx#;>Uycl|>AW9y9_@?{)4gQfdeFrJ0X! z*RlvJ&Rh3JQLxj+UxxQ-m-A}<9))=Xn+F;6N~{-|RR>rZ#O!nMG;3P~FbF8-tE$&o z4ps{(`W(H4{zn$Ir`a9Jw{P7$|A|109D+iVS?l2F5J(TN8)kf5>wGr%dyHp*&Tez` zj^Y+Xl9x95-D07s!fs1B@vVMPbEzn(VMzjQy0IO@{ixP)0O-M^J>l;K%3=KcDO_3n zrv(1|M8d0I=_>Z|-z97G#Hqu# z=VKCC#_js>Qx}S-4>U~xsvJa(7g zANHoa4Oi79Qj_644qHj!dBy8|+_mr+35XsE`aO;4twkAaa5@Uw{fsgE`-cw|;D1?j zI+Vj;Fscqi*EI_dt>>)9iq6*;mD7#IL!oUyVI$cJU|6pU*LJ=3W=~G4d1$e}tl#Uw zw{S0xrd3Eii9y#D@vFZ4&Gco{jm6lksXb{E;9?j?1m&Q_Y> zU{T2n6{!J*x=H{80fqnqR0`1Vw5nx;tG#jhtGSC!(@xsj+K2o5gY?5md=9(#ShOl% zIb2yy$s}UGo83C&(W6D315NUw0*|$vb@Q>jTKpqLP0z>3lV9)67qcBRT2lQb#Q*P_ zd-n|#^AT2mh^ya8L*&blJ5I0y_fT98%Wp#|%bnpem+-ypr?1|2on(rHW&lS0;Q9d6 zA<6|rD{!Mu7+SW8@6k)1uXh;OxL9oUS16u$3n^+9_{-VwU-EX_cRZzQ{#HvTB)}-& zD!qj-p!OtFDR{E4?(Rwht*K042G;uzO|MSe>-|Lpt8aOV-yYd|dOjGry}1nUiJ=kY z>_@t$!ZEt=eD#ks^`x5hC8+ZvcE{tyn7&YeaKTzm&-9B3H z%VIN|e&}QaCaq$&G=cF{8JTbxegY_D<81J$SDVLZ!uu1LMIU8BLp*xM3Z#-)pB>kz zJpM~8{%7?Q&ubv}P#k4H>ey8nB>AQOOo zNnZ{rS5XB&67$|{+fu`5y2ZtAt$6<1Jn}@n`v>Acy%6m)aeekL;(Lmtk zYh=5Xpd#prfWxKV|8=q;zayRnlmt}v@aa->Os`x$UYS|c|JFaCtB`3xD|E@ikJR3P z9wOn}{*$f^@jehNp_+eUPX+!zJrN!~?jIU4nGBX_lFOSKVg)c7i5Xwa{*C7GR{;@k z0I0)_em*|){q9j$+8W9~bghm9=-Qp#h(&KO_o(KP{?JYL9*o~fa-a(1la7KI?#IO` zjr?C12vA=G3NN{We9E28R1cwHw;@*ke|QHm%blE$-`jp&JJ7?*6z%u_`||O8SAz*! zO;1#Ry}$xunulKv!k=1=0$OdhNc9`{7ZA}fW_xA-&x`tBLi7K1IU@-eHRLDQQ%#^} zXFNn|{t(iMb)Mbz>>|}7?lsUvIT7_n{6o9%J@|2_p7WGt`^71E^dAVE|9ks?_&iTi zFl+BLV$k-0$P$O^MveX-TK@b2_-Vm=SpH9)KI<^dhHW~MasjYkJKOv zqW77smBb&~LHzV?{O)r}8`XNgh*xuega1c`o_i03x+C8_mGeVx7D5?f{{4ILP7JBW zdA3INPwiQ{Yfth^iV`Sz8M*k&g+%}M(tl~e-_6gT3HRz&Pz|2V%9-PM2DHWO^8EMagS&}v z?6>--$&Qe?QW0QTgNdkCImg~c3flir>|1F zTZOA_KLjK|!wtojdHyi|Eu|nbaGf66P1XzQY?g#$v;URS`mgg@KneWv|KK~oYNQjx zNBTo#{9*yVY4P%WW@nC+v2sS#ALUO1UTk+A1tmnH?@$DfLdA8t|IqAv00Qtl{t?v2 zjt$5sjeaIVr3aFE|N7nk*4L9UV4&-rHEL9ZLC7QV`fEb)-y@3zc!gSqzgw#$=z#d4 z<+lI+f_E+H-~q1D<){4YJ}oR)JSMYLf0%{HVxYONbA$E#FkHPeA3n?P3 zUY?}|2Pdc48jL^m)bm&{_gdwN*3qiKD|AM5MgQ=?z5Ah{qfj4_?}&nay5^zL_){xN z^g%1Cu52yM?t{x6>er4%Wubs~nD4IwC~rE8$4#5vuQSq?Jg%s3_;LSJhddW~aP?}g zRWuydAw_f!%Fx`-q~PJSX4l7=`9FuVQuYQ1ZEs5oKUvLuA&epq=n}2F0#=`qRlpW7 z`haH}*Zyv#`}w{Pm>Q`#FAodvw#E&A?!n)d5H`d$<=XxaM*%Nl#D47t0l-QkEuvqg z*DU`eE`xZ}C6z1h92pg*@byy9rvwM!{gCGB-2B7v`Gs*9w4+*6tzwK$dbFbHBsxl( z-+?3JFR;rSlfPuEM!lO12lxeUSh0Rt6ZFXx>p$jJ^xcRqaI$(6StsKH23aO;C(-}I zY862QqR7%F?BdF@ZGID>e;*YgZir(;mLjhlL< zGUvnq-t70b!T*x0@O`i#1Q3%r^x1gq778m}5xHd$qaHw|+@(e9yZ`XaW;C-?W*BP5 z4FmkXXf``>#2voqY8l zMxw%G;Qn-#-ZP*KCYxQ=N13kvAcv!*1*Crsdlrs1z@=wJ3HmUGTCUA&54(De67)I2 zs+eE-<(=-?v)SZQiDy9vsLJ!M!f7NgiLS2oemP>kch&D(y_U%QK;P^xyEAH)Q?ent z5bakgDJA!l&F?|8JA^_s=+l*(agCeK5q~?*y)#E?Y!7}Uw1O}B#}SD>ceNQ$wn@}2Ir(#ywavXjZ#74*wkX-Lk9Oe zGP!N%<@u3;anmv`r)aP^zmO+pA7{pozI`Htp=ST-<8^-5Yccu=lHvMlBBS@UPccD8 z$FA3toFnJLJj>jPLNZyhSgZN1Gc{rL54!gc#N!!XW6{QIOXJNAcKrm3SR)sxNrqch z9x$L(f4tU*SE~fT#?f>p%6Te7!98(wdXc5!0|aWN#;gQ<*3pE#&UY$85t{fEk{cqg zhO@KPJjTCyBOWH%(vrsEt_1^z{5OJnIBp}F0TVKBQhO+#f7$1r4@E_#A?7%PKh=Ml zukX6G-HNsZ$1%X-&cYu)3vY|2_NB;@j`0QzN;CP5bHR`l7a*X;W%+@}he8GhD$;Km zLw7c*=ZPNY$a?WpYNu+vynX!*$!qm*_Q%PP76_9$tfu*Mz<{`xTtcL9t_Ez0&BmVyV%l_>9(^za1m3`eb`LjD-8l5&D19TZx>aLGR3q z`lA`En6Y}E`&dJR%x$^VwYt&`Bitdd6Mv$^w-hWABKkHpJ+M1eN0E8lifziz1H*TP zZB?!`BE_g)xpLUF6?Zq6s+%vr>iG;X^7nUxZ}w&gJ>GXO3q!@lG7}sk7t}2duRk;~ zG!HL$w2?l;=oC9U)r3ELS0bG=l`E8MeY}!;;K9h66cP2(r&8y~gVB7^YT{c2*x(}R zXr=+t(jZHTa+RbJF6&1_&(}=;wwaw_*+6^kk^ReBdYdX9IeLv}&xUuUML9|69^ zH!9|v$A@KSuRdYv(T)}>@pjRF1W}N_iLUxfSPBQ$hSdmET9{zEig-fhzDND$jgLQz z(KM~|>6P%e&Ly2{iA&|^pBM|jP%xj+{LT3RS>gV!UtIn2$%n`fuCYV%?o12GD0NoL z{7duIA(cXbv+X$ZcDkXZC#Pj0C~VY_e6eba%dP=L2lEB$U~1FF3ksmzXR}WCHLeU; z7WJg`R%l&Do2(nK8(o;z-Tsc)j*Y8dw_B;YnWVw3Ic^fG-hg5IUW`i$Au>O_QcV{_ zdRsQsxUOwAgX)7Z^j|FW zTU}`8_IOwqHC{`@`CPL%mS(tBmpK$94Jf$IuTTh@Zv#KCgi44-#h=o}4WdcLbiSZd zW4Txe&{fQfKDhn*J7~D+`q2vqJX7)BXeI=yl*72@Z&9to<7V80fCnMP88S=$-utXV zXWsNs(p=jsg^f{aGvdp~j*#?vg9CS`+eL&%$Acg~*Q*?^ni`?3@jg6-FjLi0{prV5 zMDPigI_DifjbAat_!Us8m`IYK9$0-79JYCam$3;i)F5J)Hr*UfMXHfLc6=xH^9iqc6-I>;_M(QdEH{gZg(*8t$`%N`T@e zmKldV!<9*@Hf^@O*&;+TiNv;o-sORUvb8RZ4ZiLuvdjWiW`*@If&c_X7gHiW*YDoK zK_l#Pp}l5nA-Re*vhR~>Vh%7UhOQ8US1M`aFQ2V;N6l<+EfFq|55x;b2<@3)yVzx@ zFclI#Pjr)eUEu?WLhnX3UCH}G|9|1G=B4C-44=0CnAuz>qpdKQ%jO!A@!Rt%9(ax) zp(3XRKBrkI5zembo2G%$zzq30l7oOfFT4i|DLz#E=>N#BNZ#cFz61#}%V8OW_szDj z06=_{h)o8;Gd=~?aFuAjY{3%Xh3inNb^dapQsfv$-0X@?K{{8?d;&iZM9d zs?5uTRF8A9&Rt(Ooka16#vbDZ^h7wforCScaj@fra*`64bU1Qt{=5=RtZd?F?nx}a z)1i?2(KZ0UZXQ+`$t(0?_fdjm{_({a4VS~sgT4fIZF^XrXc)TV(qYdCs6kX%9>_aiD&t%obf}hpf&wg3mqk-9_srQBHpZQ) zN}uME2%l3Lk}HjRU6i@H9nw8NpYC)77ln_cw?mC)m-K42pMA`^4+<`9_k_R!ZIjCK z9=FTXwRlKi*=Ei^@N(rc@%;xFLah_<`l zMJ^~sECjr!_rTt6$ll8Gcc)ck8?U|@`{8*6e}FI#0g!RJ^5V|u7DY}<_!l;pabSTt zyIp$CY(P(^RuOHz_UpZe)Jv1$66tiSv~eIj$Av?$dFMc$z9jrao~(E{-3q2_jb^69 zm7cp%#Fp)j$O17WtUHue_RzvfGovy4tS&>k}`i?Qeiq}NK$cp*c5nO^>*igVZtI~Si>U+9adBQgVc$%p zy5HDn7YbB#C0I?yGHjYZ20a;uui$b%sO1uc_LO=I9qLO^$;>xIle^GwdaN;Jg=0*S zQ%g$3QqtE~vPScJERs|jO#tt?U-7Sb3$ZBF8lkh zE6o-H%>y@uv#cEIT;0tZ=JP))olEiSyUnl_<_Ola^%Pw6OpMnUp`6T^H+&rQbXTlb zma@ZBPXkC|rJ~!B>;V?z**Aw+dOraM!ovS}FSj7J7+)Dw(Z4piUsJEEvzmNBJi1M< z4t?ADej8{dZUF9x^-#bMw?G<=m@3_)<_h4j$%)6WrD0X1X_><*5ui4(gvxQR4qzizU9lGqqX>q5QV%8L0DEg@*B@@%G(QK~{Baq^G+RQp!n>w!BSUv%di} z{h@ZC@ra+t9F$w8xl5R*3U-zaZ&)I!S^_aKDa#}};w$NQ`7L&7Hv;&1qtrT5Td zNM4x^q?19)Qfp7VoEaJ@;JeE0DLv~!blJ=8Awm(t79oB+wHvtyyX6eWimq$BGn4qO4lUC;y^~^-SMb=K{7RQ)hq6%>!qIm@#AHXZe2W+-DcR6EvWcFiW=A$IfpkPv}6c zRKU^bdL9`Re9y9AgCt`l5D6RwN$k46dai{Mh;2<2W>WrKZCMm#Ih*m43y8nhQJN(CrAqT(@$&+)lb6;#+B zJg}P|r;r2)IKCRZxkaE6Q*JP@YGxIaYf$!mla7$bI%F-NRH7D(PQx>iH7~n}na!$q z9Ss$aRjY_vuHreX`EU5D-#mif&@zP#&@L%Q+a8%SjBA|MvsU5yw8C*tXlWNJ9Mu`x zcFXh)@#o*g5MAmPUdKMw63OGqn6J*Z=6D4rLyw@lyN`_k>+~8FYO8bAmSrmaD*?v< z9scw4@%Hc8Bk0hrH`*Wj0cO*DEze z{>?3v4qj^mc{+0(F&wDXQ{}TCLyfIMomK5wLsVE`=m$qeY+O|K5Pjhg`t;#5mlzo&)d|?4~gHM zcGRV`XBN&~4I`71l3bc=8TKNy`#EcErUYu7#Ti#`q!PJ&1O$o)f8WT+tp=?PFjX#p z2;K^N0_CZaSS&q0UQxg#ZxgSA2};NY8^5>KyflFABEuqjKIV=eJ}EuSl19uiXq`1a z2sbGn`i_{sS!K1F(up#HA$6G3P8%t$<(M!|R3o;1o%d2^s|*ogBkF#8PBL<1ex;QS z!%#!v;*#o{p_|;Xl}I=RMZER=2)lb7al6J&?c2ckrXAz8?@ZxX(GP&YlX5XI$VlYq zUq^oclVjv%HN(}sx_%ZTQ_;^=JUz;$uDneOV16?wFu10iZ3oGMhfJfpI zzLRN?>K6Mb%+YuLeDAG3jyJ4a-+JVf-veDMSs~|Bt~`syqJZ;qGh+|U?%t(9W}_P8 z>elH9gU!aWjOh}t1#s627is)hUzI;mkQq@Nvi8wP=ETW+-g%i-f5i5DO?@xVVn(Sz z#Y>BjNn?ELx=q3MtV`}BzA`_SB1!S)fZ}pEy_HQy>_)D}FC1N0X4spPH2%<$&2(CP z;g&@dtx(~T?bva^e3LQT?F7}z#Z+$rUl3^J$ik=87n4!1GFic@Xmiq;q7RyFun4ql zFpX&o7e?FK3NRYDJvGS`np~@RW!(``nt}FrP9X25NlJ8vtfwpNkSfi_LZ+*Y7UkCo z&?Rei-TgWSh9~D8&7ShkRflUpZY*nN(mWDqQs`@Fqn`891g`6a;w>9{zylHK27#D@Y9}gWJz%}I5 zN^K+L3+O4_c>>*U#>OXVn{VDIXdOt0ZB|__@E-b}xw+Wqy>{Z18V_b@qz(75xKgQm zjc>kob;_;j{?f@5wuIOgv5sk@Utls(m@O8SJy?6R9`pIT-XnesjcRwF8BWO<5lDfW zD9wcFH*(Z1Id~C4^pb6*tq9|)*KG;8YmJVZRxq720;bTosnx?@NCwcrjLXEjO5>e+c)^ zt=WP#2*3KOIW(G3XC6_trelDp(65W@Op%I<(=iMt|XLw_v^@p)M#SDnHyBxv%)?Nce>r$EF)yZ-9&!{Qwx%FQ?{c|oGy~WLO z{u~%u4vS0rBq4imon}1^E@h9%Lz6k_Hvirw=Uotb{KXjU>lV%LIFIFZ|D;;lhei!vHM<C7mk;Rp`cgNMh0P13Ea|Z7sS%g5J_Ks;Rs>G6E$1jFf$!E#{1wR zG|I__Es0eux7#W~D%yR>WoJB6q*=dOcPL5|U-wqI98*Jl=01tBc3)!nAYk-<8VX-< z6P!hY?6h@{u;`7;ye*sV()H0a>&OqcQD&U8y23_HbQcNBEpuGE?!0}`kohd7S>if7 zl^jiXi>86m-|m-;6yX}@+?&I1?zP)_nDXVw>*-UZ5(;B4yvoc~R(PjfF4!7RdWENU z1Nsqjt~0B?Hk`MYAKdd$&(TDi>YdLwJ?SyXHc($7!=?kjP1-}6rP6yj9n4b@CB&!P z4&qy7=dn?u|D)<|3g4mI{@HY@VESO2`Ix@u@yzGEq!$tYH2vbdsW7aBknO&QsoNIv zPh$P3NDLUcf!A_JxAHS%^>2!Hl4ekGwD_w9%HF5d*+CA5j<7H1TJPSgqo0qhb*1pD zi|rB@C0!o=qJxWrBWkzFu6*PR5;_rU*Sap3+nM3~S=#O?`C61aGls_L2sG>#^WPtZ zCgroL9)CJu=1ijDNnf~aAt$k(3+HnTud|0m&+2NGE~x&9_K1H*z^At6xSE`q?4nqz zOL|LjWVwQqnvv$tAx&lPTx;Cte6d>XbXfBmAvL{YiH=)Tk~@}gj!Uk(A9mEoBdYT4 zZ{wY(1G=NZPm06Z?wV>5g|9w~7NMk;LX7%WM+rARpMq%kQX3gvY^#Nlli(8%aJlY@IBdo$Eoz}K9R;U1^7kMQB zavX|+V=92TS1r%DdUPH%*kU$Q@gg;MtSxipaFb*4!auiZ#2tnIjI&s&u4d^K-n`hgo1Lr--g3n_JV9}VS~w7l9@vEgMP&X*vZ0Z zS`nSLJC|5W)F5n$n!p#LUt93+LPEIsehKC&>M+P)lT2~Y?w#=oM{8DGu9#6(S^w}K zz|1PLGkYC7_T-~)cq55*?C0Ldzz%+;=rR-Q*s>2ZONFFuS~`X%F zPA5@j@WjVlOLKlTPCng`SxSF$LUvK1RSYXbD15b@;}c_k3XajCOD$t#FV_NRhujyJNWV9uADPV=DZX}Ltj(rLf$Js&uw z!^7{d|3>&mxj&U#G^NfK5`4jT@}}|J`H)}PetT9J0g2)&0H65+>s6SLSywQmf@C=! z;-@gybHQL(UewIINV+6j_k+`BcvOt2i~7pPw#BAuu$DCsk|oE$Yhj-wsDFe*pDrw6 zHeoZXu9u_O{e_WQjJ1VRh7(Suo}}CdgHgDUDG^-0`~O_9{`oI0Zy#hXykrAn4Bs-r{PcWqa- zZ!5JwUk{}20(QsaCey#krh8Xhr0E+!OJcDo^xJd0?3>6PhzifYgBcq0ovs@*~+gT zj*OCoAJqvHYob6UJHiZm>ggF&f1(({z#-4;CF02Bq{?);J?ogoLWF&>reJNh+dKHx zb@zH^vEk?qx8l17vk?hbxe|)pk6uHNoS(Zy8}HBP)SWDqx#TWY>j>iaKchCIv+ivZ z)R8nuHWx$%XK1;2J+N5FC|U26Z9F9~?Bu7(5h-6g?2H+vXHbw}R1$EsB6d+)B7gLPMDE^=>j#V;T4d1UCWf=`*6m@?l?&^ zj1WInJ_yUB(=1KAiEoxAygA%o&-ol`jK*rWeI|CXKSEVz9v8Ng1A)_{5%`M}|J8&I z{L9zjha!!9(rZsrju-3c)5K}wtx31Va#cbc-Ma>!V=XI+=`A<~*V$F_5(U1P55ZRr zO+%_OAM=K~^Qq?M(Tg@-;9i$o$IQ+*SQTQbwf-!UJ5n~&S3N&mHT==AFm}Qqua`VEdEb5KnRVEG#~YY$;u z7146D@jec@HeKSF`s{qUTmW{KThGlfKB0zRF}%!X7hP-JPErBEeZE~?%B6<)c;`97 zsq%^;8ZjBv!G+uukcbQ#2sqziaj~T|;Y+QzeuP2y9UIAR<{Dhm*a(6$5J-NK;=zM2 zJJ*7AF6xkP>sNHow9S1G70@s=@+H}*wcmJZxMq7N9p=1eJfW0k`Hbad%Mkze1ICbI zFMDG^77ux*PTi^hUe3xwv;6EAD#dgl?r_|LqPTG-_9T_lU&M@4G@&g#bEfnFlX$6| zf=yTm%fZ=4xRdv}u8SKL*V~{bb4UXH>7JM_VvuYmtbAj1D0AiLf{|+`m%S4I(0jLQ z^tt4@S>^Z+SKf7wb}_vhypRqvfQjhG=m0qYL5rdI8Ve?3-3*<7D0Ds)eS#B5uLn6D>i!aZoJ|IUXv00?A`!~Mn{dJgh7>0oKY&c4Wmu5?a zD!ys|N*0%o)+(AA(%GZ;yR^irNomcnLYE=*J1QPq_eW%?2v=Zr3YO$E?HY-24{Lcg z#UjglbdH(H8Vi(dJ-W;T3RXyo`!>>*>Q zHw-sIw0!i?$u?b*?9gl?GH7m6AlqC&GyX6o$FND`c*etEBg}D2q-}n+)pu&#VvSzt zz+LrIpp5BL#0BJttt$SiI@NaGYMH)aOkBeErJ^_K##5~@4NJiw_3}V*LjDig>JI7S zt=dEQaa@GZ=`Xvp38}nZh8AJNjlm&7rsY$rmP$5pbc!{QdSuob}j|>x~8Qi#5{mNczz2woqbKPJL=; zxDZS3_EwJldu=lc!{D=H{kkW9p$_xzKB=w^>_&~EJCCCm+0A96KC@X!(jbn+`8~^A z_eWzpPVO2jWiy|SoK*G9JlmP64?dgvHpG{F_V}7>on3XiNGIrPgGil_hxy~|gXXEj zuWZG*LfSkK0p)4uV{Fvx!w`*i*&5*^^6Q3J8tF}Kjl#HOogPjF)vt5k(HWUh7{Ep?wjWAD#V^ zgvjfo#Z^-z+Bwem&4gzo-)Jwp9Hy+Eg!aA9>Ts7lN5PcM>&_Y@gaWOs^cw{K!SvRu z5|r6MhHRPiwLa62Iv+kzRvImc?U1_o-JH)92MRoW0P6bMOduKsMtkM@@F zp~=0YsVOfWEH1mHLN_)HRkPmRTvdD?vyN+|*-4?u>H#yypg&P+#(q0;&I#uGL-BG* zbhL<0qahiaR*kwE>2yn?50_mQo=|9s93QG)HR857mBcP%o~K+{R$#w3&+B{;GeI^o zTk8#5hA+fuDCbWF)WVO2+; z%Df2_e=@$QFR~OFA@-!P7tbE;ER9vXX(GmYdWsQPYN0T4X2Vhkaag6C8wO`h4`ehv zKKUCC1uk?sRM z=BnKAO-C4Y`%D9}asD7HN9{0{qwFgZI_Mw4#{EeD?~hkHSYEl>eHk|E48tfsX<63# z67{yz-ybTN@Ap-A4le{__f~C<=1Ohf&s7l;dc$fwEnsd9uJ^SdX=f9!oFkihb1|}} znag|nKZoyXUW~WS@oZ*8enr~N^rSVQpr+{(uQB2G<0M*Vb5o@<4D&NpGfztE@&9He z6f+#??^$%_G-Xh?ia=SOV;9*H zQpy7MU;=>0TugZ-^6)&^WdEGv|1tIzP*rW;-Udi1A*Fz%bR4=5ASvD5-5}kdNJy)6 zOC7qqrMo*0NOvAOzwPzD_wIZDd%x=#XD~MCK5NZ2=bH7KYp#Qzmo`R09mQRrHM8iG z9{Ipcr|d$LxhpFDo#ko4TI%)sECY8PXNJj(-w3YP^Of?9kPO+ZKK}O&*nfQx$iq-8 zG2^nHt@}7zWg)sZH|-~B$`hHS=T80FkK1WW#?H>JY^xX|n`JVPkdtjbl@{U&Svxq8 z=<-SLH)+p7O>M9XX zwq~87*E=*b{pQ1-<`?Gz{f}4n$@e7)Tkqcp1!aVlx&c^1mDbCAm5a5TEZAL~5Etvh zcg1Wk@x}hD@Wj}4o3{(t`IAAWHuyQ>ZSLcZmcC>kM!ntDxJdy8xe%3#T>5o~=FH+; zaJ)Hd0b^xN9m$twSahkv%rFPHP=Puesl88G%y7lTuDdI;qse9# zvW&_U{cJ}nlV|x$QCyM_qJtwK_#7E#Cc-MgHLqmX>^n!MYf?AQS}d{D7I4alBb)c6 z3GSBKKntNmqp32&Mlq#RsVGg-@b(+&E9YKYca5BR$vjl*Eg*6@MPsWTdLE};fmErR z?-jF_whhvfF$`mSD@1I@y-^S7U^d8??TJGB6L#{VL;b^(W z8_yRSLfh}k52E9}dD6&q_LxnWshMP|QqhBkvgku|bLxdWp#*~eizcH>n$xa#i7^A4 zTYQa}m6h*~m@$^8oWU$X@8+IuPe5=6@cQIN2~@aOkFhnH?LyECUC^7Cx;lYyEuZo4 zZ$Uq#cm#yQ+3Ng*7(;Bx!}(;|A)!DHzIWvo0A03XbvJs`U@WBoaxCXyXU}zD+8574 z`OL$cYNFs0QM=JSI)?sU>_(I1+%B_{tGPdB=SB>_Ff193ll35jRC-JV!`kZTYnJ1Z zue8~6ooGu`GH%oLo!A0-GM+}YjmYkj`&IwTtG#M|s_jYo+K78s1x6?1f?cG!oull{ zytfgZDotAI+w-|(YuFg$)43ln4`Iq3^Vm|9(#dZ~(p1gf-Dl_6cN|NUZ&~DG<7q0R zrAu@?nmDqHgGx@Vn9Y?^8GMl|HBojLK1m}N$9$%`&+R}i8k|B`Qs$J4FC{I~JzJn| zbt&S5nPvq-K~t(?5`4FpjiJ>hyg!0tJ0p1Y$5#2p{_L6nj z#(Nk@>A1Vh!yO4pgAx*+Q4tfrUr1z(;jXeZtx61k#Uld>cU5m9H`REf*sbre=(gju zJy9MAVYM!>fFE0R@1OeCWtf}`AZX6T53B9gcipZ$ubu{D33@AZE_?$tYg!7FJLIGd zjejWN@dd)Bt`8^+NY?RBveiqes?&L;PZ^4z4V(yI{R4J^jHw6eJtFd^fWX=%L3P<8pOrPWGTQ=x~+>DKDdR@V&w9GDFym!&BQA}QN3WTu116%5?1 zr01^n@#@rU?(CI)syw4{mtWJ+2_@>DC95|((AYxzR81Bc;>n=e*~=w${p^L*P11_t}8FMYzfe*Vt8+3Zt|Q9o=VCi^x=+=cH-! zbjsmt!*xPUoI-Tmv*qq<)6OKz#2FH&N`QZr-Y{c6(% zI;8pT4LrWo)%?1MC79l57&63XUGhSoYR3X&zRhznCj$4RG9yA_^g6|PrHQqXA%lo% zgX5>HH&|vv7=U}1)4y2uasBoJ3}(6VStY`eSkxL2CHGU@vZRD4>dk0j;Sx$WEe}M+ zjeWuLp$+$Zj&TmQkP%519SJtHZ0<9VZ{n3<1sMzDyx~Cytl6R&8lMZ z9l=QYFGEjV6MgjV4p)Xwrds{mYtcg2fxef8nw6O!Zd0@Jl=EM>WCvNJruOMO4utx^ zts@VL*ZL#ahgm4++I_5B-fJT+&kO3E9&M4m1faLZ`_IlxLFYG0}A_K48 z@#{v|J{-5_>LNo?FJXeD>`jtd57owKiv66Q##o6w)cANh+kF6aUo<;L%{-0Due0pSWPX;_((d z9ZkM%qs!CYk*^GAp)L2h{do3@Q;I%;J)Pmz9H)a>LSDU*3tS`LwXb=q`fz_N3k!Dt znrs-2akh<_gc84NchQgx7%FZkcN|*!)c=rV`d~vb|<&n zj2dM-PoP0w#0_FZpH&#wu2@vHviR8pB_kBqF1}utcON!S`NeMgErP_ETwv|J7Ty!* z_lP8CHpWBajj5{2Lj&nHd-8#qR9B&!Q>x_lH8An1@RUTajR2#xdXpL0A2Cy`y8-5tYwiPkT8#u!_{0x=GWb97&7dVF?51S`GVvUSgJn6-0pdCacbP| zyKz`9T(8CC!grN`cC|FBRiWsZ4m`6`0R=7_gW7de3$GiT>9ua+nn7(_IP?nBB>D@8 zyLIUL#agvAZE!HO1ztCM#g<2xRJJMY{L5io2KaD)E6ECp-v@H2u6{(CE4(A%vSI{! zurJ=K1`@TDoSW^1vgShqV3PN##>UVQ_28nWn{eAMBLf-*4EE;GOkTg z+BCS6?{X}sZ}Lm@v+V|ahtz3tHmYG&Y|cujV$pW_OvGFKBrwYw ziiA3vERM~PZb+6#x{$x0YZCqUQaiKjM1>u6DaByAS!wy7MJ3RYd=8Po012C(;4EbA zk7fztpNym@i{#HB@mU$Zxpo3{aq9!I(K_eXfj0+p%Sre_T?QgngV zP?~kF)KMDMRuZq~s-z^LV!A9Z9wI_s?)qlOE;!QCFz3%LNbQ{+BiX4ws0&UZh*qLsj^( zNYla5PQ#5&0|I#|KGSAqZESv`24O&5=_9r7M*hKteeg3W6^r;z zO$T)d|HX^9WI8Y20+$y!|s(1udI#G1#^5i?p|Ss3}>l^^|@+Itw>vM}G+ zfyq!7P?Hzg+|2K^Hyr?kAdi^_+@f^c;6j#xY+|}dpNhPd6_sa$3WmnmP^F?ePgKe?kw3(ERA{+;m&+YFgE?}@KMfcG8}`} z(=>lcmErjE4P%6z3AZSB=bg7eg}~V$YKAJYp5O!DTqG3-R02pd4t=D)rdRvN z77Jw>g*NxfT&bsE(?@lsx+gGgb?++HzN`_s}0sIRc)uL!%}^?~c0vC>>= zJ&u*kP~hlD9<+=<@8=B42GY@|tnvqDL(y6gCMKr#`}BhardPrO0>tp2jE)J`+g=Lo zE0~(4G5jOvIK_y$xf3RBrUij>WZ7yMMX~gZjPGfJ#x<~eW7B^8NQz>iLVyqQd8l5- zImKz=5hYOJdgl%^!4e7f0q|zW-3w}N`x`iDBR>7m3aE9T-C8SEgWXd2;lqc7U=F;; z5AzWP7%PKW2Up~QtpE-l%g1vNVTB$K*+!AAhZ1x>{#b1uWs6}kpPQ;^=%==g#h~=$ z9~l~pBrF0=2lCRR`#$IL!bX{Wdp`trkl;4@#Vai*fby_yi35clkM}IT?>B&9PYEO| zj7R|H;k3&5E7p=G*mJnps!Q83RU1W=uhR*zS+KpUJ4csH77cj(w|4O7AHQ2aA{b?R zeZu^T-%XSOJ3>^aERc-u6tN@_An(u6W*^=5S(giRrN2*t|79)S z0w>MmARj~GFaiNpx1!}VDS1gxjw1uUt$N;E*(pd3B8f6d;`0CU_p#1@>yY;`58xE( zpA}>S$LplV`m+SZ{!wQCTYkUi{}i?DzK?@5WPtDyzKr_&q}6{9^2YM{antSzC>>XgcjCY9nH|EfA0jQ3r09hN>pxl5 zzs&As!UMRmr(Tz1`#(tHAW+M|lz(5l_Z&a1n6&C+FS|H^TY>Uvr2n{u|7Q^eo&zLN zJVdB(hy`9cXk_1f`R{LKlK&Kg(Fs9aW#B;>OYPxbWbUsE_SffkK>Kh-jvq_Is1b3cvk87abm7qd`{D_R{`3XN zwD%lYRe;^NX<$J08?y`kDGsEbNwZGCGH9CylKuOxcmVhOCrNrADp`dA3x-#xw)q<* zxiSHi=y=)vI6GYo*(8L1Zqk ze9c9hu3qr``-;1U1FRh?6_&(#E(fQGA{(Um|8YhBTlO*yA9aLay&W03KRFv$S>I9M-X6mu%lOH}jU>3i^KLF_vX6p0YB;IcR77*UW= zV~+Qn8|@!F-M{Qf;?Hys^BpM>Aw4?CO78;RD`QT@^ZkF!`S> zS@C`;@M1p6H;3Pus|{v}gp04<_F0zTV~s~D(pr05rKrC%)jLGBES@)v(moE9%3?+n z?a~u(mVZMjK6pee^K*54&4YD&L!BPwQ`mH-2ao)VbpRB!K9VXnEQuFv${$myC`4f?68NZ`X7@z;KHWsfVtg8{#*zBO&uTlTm5BML6 zI&^=evLyp-2ydFqLR1Yl;FdD%6P$n7;{xB+f4!L8$efe<`XR73Uz5Mf{LdHvRoVTo z=MSv1zZNwim1cqMK|V#1OBi0`@6dS2`b*?en(SXTfPoR8bcHVchBm9C{3UQuS#nDR zvx)XfXC+Sjf8WRN-%r35j3yJuX?PirU0wovV~c<+0O8*S?q$j^CO+k#;6?eK7ql~@ zlfm{IEA!Cym)MNY6?x(vL;zwFW+-_6J7V*d%X!J@eQVSkzoz zsU*VR7?Ic?>DMk^LWv(qsJ2)(VJ&(A`gb-OvHqGV%WS{I(h(rximorrerv$!KL=bx zNnVh#1=NP^JR{-n@DcorMECt^`^cY~almHz-S4~y`X#92eUyS4J1GGF3+>+c{0{$< z{uG?r9pBj=bb$X9W6ySfi~lQs^8YAk*%}Hgs{35c2+{A%b?BGE*`C>nS<);AxZyhd z;IH=KAD*|8e(eoMzApuY0EtuEb{$>Nbe<_xImdRU;99o;16%*$#!X8sB9F-ZuCCsF zqvKOb-FxC*g3qxx<+u>KH(6A~HIIx3G{Zb^%QT_JNxvbkqkn1+bN2*S-HpP88kJDq zeP=2W9W62WG)+IXx}icvlL5_-_E;9eTp?A&%~t;N7AOe6p<6_Wf9*W7ehQQ>K(|Qu zkcjx(WZ;|LL2^D1P}?UE_~R=UDM0<+&k~Ewie>z}o%>Aqr?o;W?+EGC1HLkdq+HH@ zZyIFd5y?HvamGEMxnz!*9sWoN{BMl<@KofNt_?^~q2^ZubS3$p_pSNaX=ZWgiXh=^8lDYPvp zBW-bLF1q_jm27ci!@J)62FVM5l5ERD8Qo<#(SF*_D0D8BemI5#9*OFj?bg0xqB+^j zC$vO+_V2!wfCl+5o)iwEgZ8Qc8B1R30%R;?ZZS(!)wym=D)?1mqkuMzhR>tRD`VMG zhj04-wvZ2hW}N-v7c(mQoFJM9j8&=q&`;xRY0(XM@hf{u%UQI(u#!Hm=xwcD`g z^4;^__)_*izjUuR`{)iZ+uAMdDOnrrP0ObSxyHEj) zBgd6v5-1p?+CsCs64{e4diJBmtImNX%0^5pv%b10xam?Z=DQw^T-n1*V8i7#rL!!E z{LtC8zOo(Ya=bfaKE`!`2tx0aiq6IsCd5yk{Efo?`sY>%3VE+Ri22h9EwZFLB#OFO zztHhmSvqVWPw+IcbqS6xH^afjjJCRNYEq{v_n9=>$vQ_qUs*BR3T4Ogx~}6MSD2_* z+(X42->WEl?yS#In93qB1w9kOQ4F6acQT&-=}vq&5%@9N(O9uRW$Gkk&SCZtevLk# zR&pSW))Z)P?i5M2yj>~`-Q+gNK$meKrxAOINChXednbYn>1A(zI=oc77DaEWpM@y- zH%vOT_>(K{c$tlZ0IQS9G3!j9`={z`?&|Bv^Sf+yg=H}_9JwkA5^b_gez&&9CtAWyl6*+*|L_mkL6 zfXhxTF?7yQvgZ)HV`39{`67K`s_(9*D?A@~tTH5z#H8E$=eE5qCxqyb#)&RAiE6Gl zXJR0E=IF#m_-9)pMcYXf9L_g8lD^p-RBb?=Fw@^dL7`@1sMzv?Q?Ly8APO4a`%;Yp z+1WVBEaxLGy-YD9WsF+4bavmFO!^g(y}~LZ zlrz~zEI`g1XJ*t4Rnhi{F|5uzK&5{>FYz(`)gYunglHn#&E4=ioyl>j8@Y1khJ0JT zoYFLR4oDctV!SQn+Rweqj&*KOXEZJzg-@NzxTrD1cF_yJQL0^nF{`rsESj7RLH65_ z5#uoA?BjHv*G_t|n7%<(WO+;V_&-t({~^S$$Q|su)PfsII!CsHw&AhOMK5X4GT$c| zKi_kJ5OW`6`M(YF!a-=oq%Dx}wd(*#X>?!_76zGRKUS_? za!|_Zd8hr7UEn*@BQ!!4m|X$4#ows&_p#`|;yiL(-bTkZz<)+8&Kb6L^zM5hmX|O| zeY5$ZSGg{6i%%8BHt8-=@XT|2dr7HbBs(fY?s05{%ZUI>%Q&y>>|<`1cT9WQw-_BA z^P_CKSx1a{^PBL%_zkH*fDTNMUvf+gjU>*!%jv|VDk{X z20-z=HU6a=6fXs{tH(6i>|QN7o7{#tZp`wDcIci z!DwUs)Yly2CR)n{Jf*zL*mWMT+IEee1<%%HTc26i@{}X^Elt$c1dL~E_d~OP;I{ft z%}h8SkqxL4Dvx(eG&;49u^HxkJ((}JXIX68JA_Aa8=L#)ZCq@0aO#QV&a^tHWtYTq ztP1&}W;*@GdjrdU;+Jh zP{N7FN4OSQMJ2B{i!#nmi0)I$O!ND6o1{oC)yL%<8Q&U=bA%^~m_y4b;l~b#A0K=2 zvftr)?cl*14N0nhL>3=3w&0_lMA`0ib6@1`x!fpkpFQk|4tJx3YTO|cK2ud78?`kF>piLmgTZt#@`O$hL# zpgue)w)%vuabmlJrZW2*Z`NAU>FSNV%sbE-sy1&^FljMiY`={T4>cbOa9dr$8~@z6 zI2ZrEN~y^ZF46w1@?~ya3|K0^Ayaj62yY-4wcO#L<|+n_az?h$<&IWuK(E?YjoEA7 zL-5kY;EW@9m7fW%wcWEvj0+Z>Q5M0Mi_+Df+F{7!Lu?Zm(ewO;lw0s5mSMiQXV`R~ zwq;s2`*79@Qmr|VKBsF<;L9#dFT%g>w4Shn1x%+-)AnKW?GM^jW+Y%6rbb_*EaC#~ zzyxDuZ6Sc!54zSSFz!j1>r|RQuwP}!HSe%GeW=Y>9?d|Y!@wtt+tDnCL3qZn)~zT} zA+O^djuK<@nt#khjMg|MZmOt6WiWMov`J4RKv1SA_9ne36&nOE5_FJz6Gf&fetFqL zyPin4-rJbijA|^^f?7DXfd@?S2#8oHd($UCK zuKRw|=Z#x4NWC)gf;awraY4)eq`p`2oNy)1b?yS(e-57#Xo|-09ArzMu8D!W+8EzF z=IV*P^NduN$)@9iqa|x4pPG5sFEsp1zJRgYB9#_|8b0J8V6{Kmvd6lv@1%ETZ<%9E z(BNUR1JPVlbzkrzOL7p*3Wj2N4YVV1@V++ceeGaNyOcoICKJ5)l0Uz#Z*@nOO|!Y^ zZm?{M|8Af2=%D!6vTV8@!%^Wzrrz7GxWR`P9ks~Q zbH7!&1AI#z-`aA)Qz+1LwM@7`l50}>pCJbE<6rSl!b3_`3DlXqpv3tXTBi)gr4_;} zJvMFqA($DADM;L-2Dz5R|v_L}xTp9CkFlJ-@{I+3oZY(-`EA0zp|G?d;XnYQ} z3#)O%Jl7J<$r?!;n9%O45M9c_K4TNQrpdjN4_Hrzh^mnEwIckZuC%QQn{FPYI<%RG z`Ac{|FgKBGvLN^8HP+2~B9v<}78@n4ab%54Jx>J>^k|4gql>o2xpyvpk!^+iA*}>m zlt1%X^RusLt`n~evbHc6pYyXC!LZ6b1Xri;&drVu^ zV)ekrDncja`3(fKWdPN5sZyrv{1Xvgd1*CCqVg$~-Vt*J4hX)jcX&2%Wkknv&CBX>jIRN{7KeHX zbA?}b>+D4Pb-SJYSgdfF2waBwh|Lsg;?P0W=J_E(J3HAi2bvt>$fXhwSyoGyOiXt1 zr?%ME`IWVPSi4-*aCcocob^weHZ@mlUVn^}Eq;y?w!SWez5VRl_JA%Ebbz#XFv}Jx z?KE@CJL|LmMF1EwJ)pU_-{2frIog#Oa|So2=;1TgxN2aP@%D03skpCQc)3AgDA}X> z=vv8qtmXvQ*Ss3z%7c3dKKu&Z2h^#iT|J!K-c5uwBBYCuid26lknRBUuMB%^tcN1|K8oZr0&ALijj(&REg=33)Gf9YAo zY)s;~;~VP)@_u=(TOp`9~V^?|>Bt zw&UootBJkye>|+8zY6>j8ZpiAN&uOlM6K*0Td(AFL3T=2`jI<@fo2J&A%&Hm>9Ldk zEB(%8qiP2%8>tR_8L6ri9&F&We(Zo1h!>F|H`{om3|2C+&FtVxfc*skY>q zOW@AP=_8^|e}*-8Jk>2sno;z1`mpb-5Moi*)>W3*HiPYRDfI`-fzVwHb5;??Q!JJ< zh&I2=18qzl!k(8NdJ8r7!m0x=TcU$8AqP^Qi!Q#71{V6oz8Y!e~ zIa@0?#Nd2YL{2hdBHUPEE zvF=-_J9-HA!I{>irnU>`XNjnAm;Tg}I(mD3zRO167ouV&^o;OYs&GZTWn7!DXwc4y zk%Cq=Yfk0oMID^1L{?G$%;v~V&BDedE2n@@{LgyEO3wW+G9hIlPxq^@WCbXjel|0bcR&z-N5@Q^>;hj*_td%|wO63km zU5QmXHt-k7@I(@1jps((dj{ED<9Ii(+?U$p%?-G)RHnV3tkt{9Qv>PYxd5LhTK!>h zS_U8K>(_y5Uc`a}L2~W^ftD?#eir%O%^3WlriLK#v(?q%cSUg=ND%SUMT)pd7$OTF zTA<4f5Y>t&GxvB6B0@~h?nUZjBPJ@l&_qy>9<~ngCn8qX>AEXefMqW~@NRS)M@0KH zc}NAIPO#~fwUAKr@KtN=Bh{B^mNBcW1lI0~cavxiG!#xtMm8EU5NeCh`JES%b*7^S zwx47MQillkHE&Vra3YR4edyTH^3UsyeX2ITgr2NHtGl6|?7|ReJ%4eHZjD_#2tq4y z?Obk%7tqypjmOTPmH`g}62>0Y9xN}wsItbT-$3+Y=g?WpU*^*ES<3CXiHRLn5{D?VI$0vAft)!GJ_OU_ z6xPVd$1r=s(vbq8!#Xw%8i=pWY?xok^@!LNc_*uDxI1Bdf*x-VL)COO4O13|_tn3 zw_J4cH49hT{PK-4;RjdZ?y+{aaIi0F++4f{RZ0FvP2jVV6-F;n7*I0bQD9$r9Xy}U zW<)43DBEe^uqnP|XNG>HrQewj&+lp4q+!TZWbl!M8IEM5#_%9fD6xsv>(g$iUa!~s zPT>oWl((|ofn4V`NkV!18dp^cA`Dy=#z(!$MlaNHjM7_&x(^FxC3tl?#mF@&7W*yU zLVfPziH~n?b91-J1eu#_?-!gfOmX-S-!WLbvylTbaQCx1t|-E3MBYp+HQuIaNP7A^OV7-xXAjL zMp_3kyu{^_UV`*kA)7Ln(Lr)sisOLgoz4Ygs}w9L=vrHf;ozX%%0<}Rnd|XJvBemM zQjQ}gQ=bT*0>;kEvbN@(fMMpPpDT1q@_G|HZsycLY{dCNN-_^g^GP)Cl zT--xLD(0M7Q(c$=rd=F^BGjgwWg&Su^enhwr!E2>?!Kgg3DD#ymM-wekZM8IP0GqU zC~icd#CWJ~%x?NZU{y)IAmdt63Ie;-#KcPM6AdsdUt>MUvL}qIPig+!*1?wabN}+S z1F|Omb&$O7`t15aURz@GD0C=#&;xiAH<JEBR0y=x=%`L_N>ZVJKD5Rj z_{qptu<)p@Ax}EMGDLW=(6VB?s|(Zr{*=8Xis*zLn^bSmbIs{?nH6R)~R5-vZKjufTLkqCnBvvJBlbxzHi)yFo|4&_H}^sC0qqH2A!>Rme% zF*M?Qlf~#0#d{X*M(kXFb5 zi?lD&&UiI<^bs-jGQOy0?|bujQcg-;Kpo}__I@}x)Qw)yTeH3Kg+>4G8AGPA&92%O zSF6=|VgyqWHSVlmN|Z$AacM%XA16}6E6N_(nS}Sfd41FsN*S^`aOIgDY}va+r($)r z!j;_Jx=g&$Y9uS{o%>^Ykf_504rz&1Qu*Ku)fD++cI=>81}kkW!IStll5#f#9gpD3 z-OtJVXK;$-x}|4~O(yw1?g~weY4o-{@0#3+&c_=Q=bFiz3}b!9#64)150*VUb~bza z*L|vzMEtsnKZ%m)^o}H`w?D)w<2(Q*&S*(&*Y`%A6I$~ROosVV4{6>Nwk!+;mrnP8 zq1vB+svNxf^Y-(@c#`$=NylB0e zGCQKN({U+0lElAhG;IK2>&hsgdHDZzNWcBcALXHUjgr9u2;&(yK9NgE_+7FZRjF!f z-$zO3Ow!6lsXU3`gZheVpeZp5mIX zMJfP85^bD<)ll=sTc9sZ7kee}qwZz1ndnham1UD} zNUfCAYB-28LhsJ=9hb~}tFfyUufFIQB+2IbCRJH`?4)2tMmdyhFm22zhBhA5J=HC? z>NU1NgzRE>F6e6*9*jt|K8_O+?)WHGzgXk#cun`QIttCn%lxA&b;~+NP9c#OZ77b< zjDqHC{)k?!lX153#CE43GCo!h6`eQro)lGx!D)4 z_Th;~1#-6U4;2WF+h14Dpd75G)Yf_JwrH0qk!h>jom!i^DBpW6^D^U$2K&7|SOF z$4A%mCWCcM{!q2mdp#Zz>bjN2fW_7QwuEaQYSM2$05Uzg9X8uFzFNe)mBa(08WLTC z!`1VWa;aL`d5%JJ@OtH1L(^HTsUzr_U3|T7?&MC~oMQh4xOYuEpg58%hYS38F|aa5 z%yqA7+;z|5T$`&rnmss{qvA=6lH}vR32~5rd9KKIbYMXs#<46emrtA9yoq5tb54wj zwYb9u07f>8YIbrIH-3Y5pq)!;_%+?f~RV8Zc4

%gM8#?IaN$^77*5=x5+NEPl=UZ-b!$%%afaDH7n3y=klC_}EN ztBYd^REhR8=?Ai{V>OVXP>xU#y;9CxYF>588srpkR;hvb=ScW5F1!gZ{`r*zqKUh6 zZ|MdahzuvXB8C$;+ZwbHii!pX?m^YTO3g|06tlG1eA6UDH>EmHS9^+3$ZEL$}LE(Bt^%`YnM zoe~aJxKrC90|*irZy1&3_2B;lpAiuH1xq~PR)JCi7;oj&SP2>b=!8&Eo9S$RD!CXE z%^U-XZgiu&N>u7iHVD9A94?eD^PfUIqpx_h7UP3~V+#b_u|k^`VM5h*aoR4S@O<8` z=ALf{TCHj|y!O}|9YuLC_UVP82iCsk#Z33PY4_tY!Pv4)hVoI3Rx@)dO!x1Jx7qDO z%Hqw;V|2%X@VL#bDCO2D-ScaZ%xh#$O4 zZeq659K;T)38%OpJ0oOf=;Jmw1rqS%wWfu+SP+@m-dbidoafDyibtF4@*R$|No{+Y zJo25{_#m<>GM2ENU|>srroo&b&nQie_S5D$hvRqUL)lkyKfRcB@8xdhEjjkMnNeeI&XwAyHs- zY+Cg_ro6EuaKu7=t+g1?)@ZR;UkiJMw~WAGCMDiY#eUNfHO+=Swx2IiVlJiOoXUDu z6AxZ-FNAQ`FcgS3WngS<3AuV#!)@b{i*19<(8D>sWjR)ihkis77N|2EIT)8pJ+}K{Xpe^Njc7>9;blW+xaaUMN|izsNz@{;$FUR< z*$I;^N|3w;Y!yybMeT5S2!YGZ4>il(mX;I(je2kMR7BkKimL7{C-1{9H}R>v0$j1n zhiv>gRi;T}UtsyvF~C_IS*E_2@{(@l3tnx$NaD{X&uD~`b<}c+#VZ;dJ;SQuk?oQOYoC%=Lgip#ZmmkVCpnb#YBq~+swue=CeX9P^w5+k5Jjx?d zueWh|zWDwQmV)k6{MvDJ5YHo?egD!wq3?4Wp1rG(>cGY4SP2OTt{KsR^lU zU$##bKKzHqrFGdn`nGmjYn>)Cdjg4VlCj;|kdVlVU2DMRpD$1sUf(lJV)}u~5t`_;uOU&+F2-pv18E=bH?6ms7vNU7L^{VtK55q`_7_L%*ZSA zh=G2C+BtZ}L&~8ykL|yv9u_~)1XXyV`}SWDQnvXM`_QC{bv`FyWIr;9_I}_iv-zvC1~*%|-U`XVwf?>7@`?{1G?8Pd(V>0qm>IP^*ShFyYjqWUW+CqSv~-n1yM%RncA9vm7{S zr2_%l6_z6un~=B-v{J0os%Q>|^xw^lpSgC#Z48Y0=JLSArsM~nYy_`1G-aO;$VP#_ z=2PplhH-IoAuJmfTTw3dtFso?R&VbD76jPLh}7h9%(ysF6(AR?TPTpF=JxnuYplo+ z`J5vvc<|WHF`RafvXXVh+!N`I$IVf4dC*4aBpxrjdVmKzO6hFQh9iwuRc%#WzkV<1 z>tPLcIb|Hpb#zt+Oe5D;i@R^uwZR!kh)GMVE}?G_Y-?F2-N!a#^12+-GMx}O_ttvkL4EYSY_(ykv2bdTTCBC zqp4iWXqc06Z|AIT$`=qh^<0D0vzGA~o)n*K^3~UChg&zt0rA>g^mIW_79(d8j>XTQ#SUTuDX3yNTpKvqzW4Av~)`6?3c`A$#Q98_Cg{;(ldNq z-d%XcdzQ;(?S}^vIoIgRj{xV<=Xfp;2r%4F$+X9I(^?6G;yrK2kJlC*anQVh7G40P zOM$aDjnZjWI`XCN&?^46{AbOL5!>0e{sCc!8kWU^OO-ia8?evDIt*!}^Xzkha)=Lv zC?y)jVi{)H1fBq#d*$NKcVj03oY>a^yp3Wq!<;5T;{?PvN0N3iaI$)QrtQ&Wq@Kqt zL4x!=EBd{)!j))}Gx!6Pksyv@yg+*$?hN{lc_h_7-{Y7p=a0{I9x!4?_6ss5y0y)C zl-vxtK>f`;6u{YJfT6Za2&_7pzp2Ib(BwdyxsGi#2GMwK?C#oO0)-p5Y@b9G^gL{Kk2)26a<=Wly=mh7<=u*K zs<1f~V3loTwIxmC6V{N{4$|2l-@QG7eox7|_7BV*Q4nHW<9mk+!;eMVs#64jIvOD5 zto?FvPWApGlVONg^}SwRo8Ny{I(!KHRTXN`>lXF1epM$MZNQS$nY>}frZ`1GCu@Tu z?d6sTnQ`h`9|GFuu;+er#=4NQd(d6>doG%|g@}k~G%PNyqDf9xl0Yh@-5;Iijz)=m zo{WLI#%NT9M~^E2sDt;Zki{HkQggcN+l%b^ABPc?=lv6eq^)0Z(p6eLNQga}0@u(s zH_wQKYkmwlow^Ev;+|VySTkyatA!MY#8yYKNEK(+Enf0VnW7;YHcdw1NP#=()(4*f zsY8ck+!ts?5-a-5x@n{u<=KoI2@~tj6^S`%;>v1T&?+ib)K`TINbSii!W!FDNatc`ZN)zY)H6p`-SKd?#x!={E4W}Of6f*-%)~=_k{EI&|q+cC`6SztA z;A&sQ0Z4$twA)!z<;x)=9JI=XUb-`zE0`M;g-%No=wrV zHyu}l!oC*1PpX#a)!G{Fy+Qzu>&-VC}#}NY6j{9j?;8j zCk#jNyIlE-B1ZwLMXt8gIk5r4)a)> z*t0B7q8^z5MVBOBb+B63s+sw-6#`>_0neDn6nr&AvM|aiQXPvh2U!5k7ItrqE}oNh z74IBr&3)$N5aORKXq<=j_>z{7h>hyZ22LAoMhrLn-Tt5-uA~~e<+ab*;A5R&4eJ%q?YqrJm-Zqx z4BB+HQp5B5Doa~6bo4B$97mKG%Y(-AM`yv<*dp!+jV{f+TqZq(gS$UJGvEy*{=xpi z*YT_T@lq7B$LqdR1}sf1PH20MoaeX5i1E**^mSli_1qNWucGrOR7u+xG~(2lO_MaT zUHw^dud3-^7zalzGVdo4cfH|A>6E-gjy`p7dO_fKeNYg%G?emiUFBZ2cuXUqf=4PO z@CEV5Q+s`tsV%D(R?IbS#e(Fm3Lg(7$l*s*q8)410xh8sUK=-?@~)Q>R155%Ng|!9 zbz88^JLrTqxMNC4rl6*9c#!OT9}Q+Wl&zUOiIa=8fvmx~;52l|}VWk#|0Y66y& zicS&OSvxl4zUGj9V|0j3`LcGJD*+ut3)Z761T>;lJ?BNTc%(q;I11vWhtG-s??;4~ z1{wr3?b8%R5>|fK_*^=&LC0v6XMa-P`({G-b-$}n!RE>R;RvSD#OO;q+!^@+I=>%= zNr{&_4uh5PBl z6TkC3>^>?I3`+IPCX17~-g6@V)-^;R*^-p!mWMo{m ziOI?^+P#4NC@sGiCyRdJ?7C}3aiCA9&=s!xkVMg!n&EzeHkPu#!0~k-EF0kH*Pk4X zFY%GBIcnE~FMfmW?1?T^pL5DUg4(M8{jpy!@gR;Ai+mAF&nzv!jjy=~Tg~IgPZhW> zc&?UR3_jw7-b+nDw-6yE7l%if*bz4snvqW94W5=4z? zqYOe2y^P+ws1tQCMrX9q8QpL4&2!%Ocb@00b=Lc?HGddu`Iy;zU)O!zZQn7ST1Zc) zldtvh(7aW&JGSlVWS*)FXMFU>*) z`@c7Xo-JVyPYp`}+!TRS31tbyhMljv#wYqd-+2u3cQ+R2dTb8GpkXne791H@3cy=vgB>{qfvad3ev zH(vZS9^@p;OxaO5`AdTs0E>3LTA%Ng&z&JOgS^9>@-DsQ!>9CNn8)DWT8N>(0yFrj zAIm1a7{KwO8@rkS^Ia>oJhJvczt+}4s+$;vZlR)E*s&q(9D%>Hta@?T?{>3c*IaMs z7R!!03zBZ|qvyI$*ky5&K{*^Z&usH;WbeC=xc~Ob9)&yyR~B0(ywbW0XCKk*HF~y{ zR1bUSMmSa_6Id`}j~IL*ETs-GxU{#}b;1elZeFG4$N0+5=MdW^_ozs(2QfO)b(Nb+ zw#YmlJk=>5UJ=rLyNY(kB1eHaOGb%@ZI*{)&8 z;Pb{%gDqzhQf&S!595=^UuOEoC90MME&?*~5+K66B0Qx{uLtkoh|HWxx%53WQ-cW(`LbF7X!hp4#F)HE11dF{sWEzq-L5?Qz7OG;0zOKCQ= zGZXFUX7b{M7GoPx*qC>H9Dm9*!=Nvx~8yT{8(akFd*$0e_z% zBl|7<`~d?_XyK$I+t5VT-Qr_0r+!M?dsmP4XxwVdQeR|l{2+b(d~#Qa1Rb_qda0Fm zD%?Bx*y;h!X42r5a#_8>+myR}l&MIQzHV9>!nq5bR7d2OBt#izZEUily=YpvK z7G*J_J+u^D{5_yr&{kr=qli+`TkxXnl}Cqe$;4pt#}5a=)2d`xy3kXXGdirJE+LcH zP9Zc2F8D%fcfl#!3yG-BPL`lk_C|LR&(-lDh=G02j+=4s?l`9LkS z3^orYG4+T~&_~T^l&B1V&tUFLq0R*66#N`R=XH*Y>MWCG#@WhO+9lIQJdFZToq{e7 zMq^-3k4WzLRXqLzUGB8+gTbZ0-xCaK`VtsA+O+eEGmx3UOH<44%FQlsdLUjLexGO# z_M(T4OB^-5;!SUhdP!9GJm=cHCSHP861igekEBw{Og4*X=W-^?(B*`bW@dJ566cot zSj@x3-;fUK^<35jcZez!7v!HT0fm-n0*qMtJ@WJ}~sSxf)d7C@# zr39_d=gEwp7&uKgsUtC=qF3d&;*^v78d%ddh#q>nAO|dMJPdb_KH0U9Xu(+SM^@q}3VP^Y1uZW6_P6HbJX=Rk}?`W|H7Bv#qAF6DImw%rqqZ}5JVF4o)P>w zENu^&)BnELtwPa4Z89i-wg_*li{!eI{|Y0#5{7a7B1Tj}k~sh!4dU~2Mla1<&H$71AK4w^j5owai{?Gb ztMbk>Gnmc7dJd#4A!QO}c5S zweoGVLX#i4N$@m(OZihdUExA2J=M1yJ1MwN;A};Bnt}e>oUpwgsb@`3l9UF+rQW8@ z^b&cA{-@A+SWfUJS4^F!y1-3JAn51)Qr*|J_6D5fbK?D5Ra^V1oUw5%zVj&zIkrK6`cN zzrECG{(e5r=v?+l@0h{`mVu5cSn1d5$X@2dZ_cI4$*j3qZ__?4tJCRW2Zt)1oz7Nq zY3q4<+DvS;RCOf0g;6LeE*k?gYVwUQ))SaktvsGtXax8)o89C5pEkelLAZivHrD)S_TKrU z6j>A(mRd98vG=cM4k~ukZz_|-Sp)Ex>0+1Kim}6*`$aPIJqqqMns9m4O0k#l z&R?qPaHLZW_=F@~$ZwtG_XN0w{h>RBJGa4W>8G7z6~zhcrs^kXpT=`z7EqKJc7e|1 z%<3O91fK8J1P<+7FMkW-vlX%-w<^T&Odl`U{jjgU&lQj@Rpl|jlCpsTbNWoCr{c9u21Vx8Cyi`~M4TtUsPi1ldND zCahh|r}Wdpu=Mb6-1F~mUzw2qv#F`@?q`^X4BG9=iHF*UEr}_nn0Kq3i+*SQ9=Y8? zozRvHwnfiDgBq~=M(IRtH%wl!pe4gcd0|ILXF`lj-)=WxqE zKyhR3tgs=pb(fXhI(mOgqTTeECG1@@gbUvxo07$g^6Cs+oPOxtA$Upub7Y&xX2$%Z z>F$x-f5-H{LHwV$-pYUfiwR}?tfC)QEjtYhV^3VXl&D;da2J)IY-2!RSRmfCZ6AP=q z780Mt^?QKg6ebMiKX;sKl=^9-0|(Y7Ds9lOr^{VaiwzILicR)H?DYgY`AgkZ1m=qJ z$89}~M5Wi0|G)3OV}nR0=8#8U^f=l*WcAa{Oo?j3Ti>~_vrPpDbl-ZHwB^`IN%Zvy_`KU>6K=XY$Wp_BQj;m^}f zYp^DPzokxRlJkQ7-QKTGtv_DMORpaZMQWA@!Uwo}!T*i4|ECRprWWzoLEaUueh3GS~8vX}1r(DMek0D*<6X~$t~MDh7b@daZ*h3<$)KgOglP+Bu!@TiPgk&jA`-%0M}VeGFMF?-gbRDofi zwdT$8V$+ukcMmw5Z$tac=y5xm41t5`oD9)tN;6fqY!ETPy36NFsqOAxTVB^Fu*e^( z3EIQWQ-W~Ck7L?KtpgP~#zFon&;prhR7SFNIxO_sExbvo6Ah7?9$q#|T;52!vw8_EvyMf}*v1HO`S=F*! z_=hvf2XZyOD=^KQM|3htI%BWiE#&t1sU^>~j^31yciHLI9mrEoTj^SkNg7j;lw8B0 zF_PaYWafL)qM*n73YzqigZecke>ub1P{i})o%B^>(n_QPKcf1!Msue2ho zkn^H$`eTLdTy5p)F3=La;j}06lemU~`%x%)ZMh}{OB+d+l;sd#67@6i@ zJiI%MHd39bEqoZrf65LdP~%bdw`)sQtE-m3Xk_${=&g*$!SxK}MfwwVizOaM+4c1NiHxtl8}D zvejO=y69Lr{&GQrJdyc5du0~nkD-| z{YN_l-cJ%}Zb{vorx7(?+&hFK7Zx* zgDkVu)Dm4tn&>nC715v+=-Ruo790=0vet9HX}ehD!*6tJ$oq$3IZ|h@4XW+AAf#;d zEZ)sj-T>8)gE;z33;9t%^pXhG{x9{Lc!q#;ZG)N*EVYD)opCe=i%=< zOd;PRbLZLDqQBg`W=rsE%w1O7Ij0RrvzgsG@CDXY0r*U^S;y$K;aK0Ki5Sln3#Kny3!@r9$Bd##%5TWolvA_+)p{47@ zBWvwML(fx}P4|1DUDKJf^H6HFYdv3Yqs^hULn!6e)T^d8nqWP}-vi$MWL5`EUegDU zDlPjo95Q}8a6+)dQwElp6)m?W1AjO|W?JBg={lEq4ud8=PonWMUETgyJ#DTqcG_i<2l`C*i zkKLn4_iM7RV}7$%p_FFMRx>PN(}oHb|#<`l+3eeO&*e0fmynFYq_Fqyi=#rd|XV zh{FtP)M=g{c9hU)xekS>d^`s3_bc9wW zmOw>L99CNm=-ABul+Hq#&0XHzJVO)?Xw|!}elz9*If`U#SqTvptV^af5 z`b}O1SX0!mx%^fht_CXV{F*G{hLV@gRnVw)1eij?@S$3(!0w1djb;Pwf|AXrt#-l| zAMa;)UzX*UhV7XQb2ggzk$kl%r|*jt$I|cF$$S*m%&P~gm39%U)zb|xCLUE;GFt%Cm#Pa2UPOi(YWXs zloq;IX+`RnnAEh#n0XRMhWl{tm`eGwGRof}EOP0rvMiZo%sxRzj1x85T3{IcoUAUy~}Uj1;N^I9E9TdG+Ipn1#0aVjoqA0@{P^J z1MM*b+f0yw3112a*YPt!J1yaSz7}Q7bl)3aa&N;5*W7b!yXTLL&bgAf4D*J|zU3*? zG-i0dewVD<;0-c?UDjllY0XQrM9n)0&D=HLbdKM#+(i-73U3PWoqwPyVix%(Van3t zUK6w##gWejIU3`}y7?PS|Csoyqr{TpwU<~EKcU2P@bV7XI|i&#^tV3+T&+ge&L?xX zo|$;QLJA+Kz+wW+NV6Fk+Vu?YWpmC(!%YgL`mv(r^A25ag(BBwteLU!GK(sNg}eDY z>2e>1>-NqGYj`<a6CV9WzKVLpubv{L%EJcL7=(NPDZ4U?@OZ`X5O;oAvKb&Yt$)p z`=RH37pd$?G2?PS&Ds6JyQ?cvA)CL5703iTHY{=|`xkUkJ!jCsBPnP>y0^2j|9aIE za;w>@>Pq9~JKm_IY+uWZ?(39JmOhw*pTk)BtGO-8UEt1W^yuN2l!N7!iEQ_CaEPAY zc!uC{Lou-}3+UOaPtB|K`h4f`N0r_8!^P>UG(GAyQ^-K%(IF<>Nj%Ar`Q97mvLcjU z$9(*IAn%7PoA|f3SzYF?zpnxBdxwU}VNK6}vX{3!>c?29O6F%u`89Q7$FTUqPF!0I zF!%W%&C*R8d8{H`nKqHTg*j2KX=p9K-JW2G3Wwy_J&I@JzHhsM-7bqn4?B(Tx%VRVf7nXbY4_|dVu!t-aZB(GQ8ko6WF?-%eklih~5Stbg5 zBJ)8$s$yqeGh$Yl7J+qErce`co`+C7aitr%H6sy?tL&#xmrdLUse9O zYL?&r>!*U7^yArvr8hd?jtiVL6w&t+pGQ~#S?wq6i`094I?tB9FqU^08 ziJq}ivEAoLmF*XZ0v{>kF!AQg8N*=UZGdo(`7Pr9xwtR}TaxaYlwXP*m4Tiur{`kc z>lOLOSvVJ1-D-6VW9P1ab%OBZZr=5)Z8_cv3qJm_C;o)=Cmey5=9G{?Q1I`oC3dHN z#BSg-?fZnQffz^M+7!Db<5adDP)dV-Gq=>~siyZKk`y-t8YLs)T4TWOe}SG!m8n4g zZrss@?Ry>5JFyGT>uIresbIsKOLKUuDAT}X5TZJ+rMWZ`0^;L?mB9D)Uc~~$xJ_VT z1TD zgujcNg_{K+Jwt#`yW$`1tS)X^7vr+Q(|p=bYl&{~aM`8TBtbi6mBYex8@o$XdhB(< z1ze^r>9bO<5=zVj`>Q)}7AJyUnMc>==1i;LIh%JfAPBBCw zekK>*C;8RMQe#%9X3X~%Cy*gdFxw0@WrnX#$E%Vo4}}H~FP53K0o`IX2UM)pWO}xf zv7Z}Ya>ESisjmJ7o*8%+-E?%02)nZ z_0{v5DfX1$E!=`m2zKi(sNs4AT@FWz-*5Vk6sP?KTCeu=#jh^e39d9u(jjmX4Ir*^ zym=4jA79oo_-_nKX_m9+0Tb5wjW+%&rqB9Ymmmo1R7RHM9Bnx*TmAZ_e%>I_V9MpY z-BM&n(xMJ-K9|1FRVY4R@FrnD@T#P2<1%F0Uaa6aqJ{QC^K}L!0MhE@ubZzZb1lZ zztdQv*~~kFJpbixHMeH|P?c|{d8Kia3OxSv50!Xxj+z?tejNzPc0l)?oF1%o(<9`M zI~<^#!j9K+!;QX`mjd3=XhFw7jLzqS@oIo#=+@ zx{ucEhFs#S2$E-hA9HZ-9Dhm+c_(bCHvcJZXuXPB{JoYDDjh%%;rru;GbrftbVvQZ zt|g5mx7@C)2%P1WTW_a0B@-MTH>ZjU0^&j)kaWX2B(4o%T47f}Q$Msg-39UY<%mdF z>{X2?k?IAw*;JLl^Yqjy@9h^_;HdACi(Dj`rz!Kff~*=zE|iBZ#gLml*L~GIY

+YKyXa*(wN&DlH8($OTz1^;zFUf!Y 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 z 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 VDCxUHycfWasGy`kDW8_l{{i^X;`9Ij literal 0 HcmV?d00001 diff --git a/img/logo.svg b/img/logo.svg new file mode 100644 index 0000000000..8950ebcd07 --- /dev/null +++ b/img/logo.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/img/summit-social.png b/img/summit-social.png new file mode 100644 index 0000000000000000000000000000000000000000..66a362e6f588ab962646a906a348a0985164b243 GIT binary patch literal 253644 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�miY90cW1=YQ~oynv8UOb2! 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�cy{7sX@d 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

vwmO<5#rNdeAj-b=o8>W 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 FV1kGqj|Tt% literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 0000000000..e4f4e1047e --- /dev/null +++ b/index.html @@ -0,0 +1,26 @@ + + + + + +One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +

+

Welcome to the SCS Documentation

Find user guides, code samples, deployment examples, reference, community pages and more.

Introduction to SCS

Get to know SCS better and learn about the background.

Releases

SCS is currently in Release 5. Check out the latest Release Notes.

Frequently Asked Questions

You are curious what SCS is all about, what it can do and what it cant?

Existing Public Clouds

There are public SCS compliant clouds in production.

Architectural Layers

Ops Layer

Tooling and infrastructure design for easy, efficient and transparent ways to operate an SCS Cloud.

Container Layer

SCS offers a robust solution for managing container workloads on a Kubernetes infrastructure.

IaaS Layer

SCS offers OpenStack infrastructure solutions based on KVM virutalization to deploy VM workloads and enabling the container layer optionally.

IAM Layer

Working on Keycloak federated identity provider within our Team IAM.

Additional Resources

Get in touch

Come into our Matrix Chat in the SCS | Tech Room.

Come to our Meet-Ups

Our working groups and special interest groups meet weekly or biweekly. When? Find out within our public community calendar.

Standardization in progress

Get to know our current Decision Records and Standards.

Deployment Examples

Get to know different ways to deploy SCS with cloud resources or on bare metal.

+ + + + \ No newline at end of file diff --git a/search-index.json b/search-index.json new file mode 100644 index 0000000000..2a3620aeee --- /dev/null +++ b/search-index.json @@ -0,0 +1 @@ +[{"documents":[{"i":1,"t":"","u":"/blog/archive","b":[]},{"i":2,"t":"First Blog Post","u":"/blog/first-blog-post","b":[]},{"i":4,"t":"Overview","u":"/community/","b":["Community"]},{"i":12,"t":"Calendar","u":"/community/calendar","b":["Community"]},{"i":15,"t":"Test and development cloud resources","u":"/community/cloud-resources/","b":["Community","Cloud Resources"]},{"i":33,"t":"Getting Started with OpenStack","u":"/community/cloud-resources/getting-started-openstack","b":["Community","Cloud Resources"]},{"i":41,"t":"Getting Started Gaia-X Demonstrator @ plusserver","u":"/community/cloud-resources/plusserver-gx-scs","b":["Community","Cloud Resources"]},{"i":49,"t":"Getting Started with Wavestack","u":"/community/cloud-resources/wavestack","b":["Community","Cloud Resources"]},{"i":56,"t":"jitsi","u":"/community/communication/jitsi","b":["Community"]},{"i":57,"t":"Collaboration","u":"/community/collaboration","b":["Community"]},{"i":79,"t":"mailinglists","u":"/community/communication/mailinglists","b":["Community"]},{"i":80,"t":"Matrix","u":"/community/communication/matrix","b":["Community","Communication"]},{"i":84,"t":"Adding Docs Guide","u":"/community/contribute/adding-docs-guide","b":["Community","Contribute"]},{"i":97,"t":"Documentation workflow explanation","u":"/community/contribute/docs-workflow-explanation","b":["Community","Contribute"]},{"i":101,"t":"Documentation Files Structure","u":"/community/contribute/doc-files-structure-guide","b":["Community","Contribute"]},{"i":117,"t":"Linting Guide","u":"/community/contribute/linting-guide","b":["Community","Contribute"]},{"i":123,"t":"Installation","u":"/community/contribute/local-docusaurus-development-guide","b":["Community","Contribute"]},{"i":136,"t":"Styleguide","u":"/community/contribute/styleguide","b":["Community","Contribute"]},{"i":143,"t":"Ansible Style Guide","u":"/community/contribute/styleguides/ansible_styleguide","b":["Community"]},{"i":163,"t":"Branch Protection Rules","u":"/community/github/branchprotection","b":["Community","GitHub"]},{"i":165,"t":"Developer Certificate of Origin + Licenses","u":"/community/github/dco-and-licenses","b":["Community","GitHub"]},{"i":169,"t":"Tips and Tricks","u":"/community/github/tips-and-tricks","b":["Community","GitHub"]},{"i":172,"t":"License considerations for SCS","u":"/community/license-considerations","b":["Community"]},{"i":190,"t":"Hackathon planning checklist","u":"/community/hackathons/checklist","b":["Community"]},{"i":236,"t":"Documentation for SCS Developers","u":"/dev-docs/","b":["For Developers"]},{"i":238,"t":"Identity Federation in SCS","u":"/dev-docs/operations/iam/identity-federation-in-scs","b":["For Developers","operations","iam"]},{"i":244,"t":"OpenStack Federation via OpenID-Connect","u":"/dev-docs/operations/iam/openstack-federation-via-oidc","b":["For Developers","operations","iam"]},{"i":258,"t":"Introduction","u":"/docs/","b":["For Operators"]},{"i":291,"t":"Container Layer Introduction","u":"/docs/container/","b":["For Operators","Container Layer"]},{"i":305,"t":"Zuul users guide","u":"/dev-docs/operations/operations/zuul-ci-cd-quickstart-user-guide","b":["For Developers","operations","operations"]},{"i":320,"t":"Application Credentials","u":"/docs/container/components/k8s-cluster-api-provider/doc/application-credentials","b":["For Operators","Container Layer","Components","K8s Cluster API Provider"]},{"i":322,"t":"Ingress with externalTrafficPolicy: local","u":"/docs/container/components/k8s-cluster-api-provider/doc/LoadBalancer-ExtTrafficLocal","b":["For Operators","Container Layer","Components","K8s Cluster API Provider"]},{"i":332,"t":"Continuous integration","u":"/docs/container/components/k8s-cluster-api-provider/doc/continuous-integration","b":["For Operators"]},{"i":346,"t":"Maintenance and Troubleshooting Guide for SCS k8s-cluster-api-provider","u":"/docs/container/components/k8s-cluster-api-provider/doc/Maintenance_and_Troubleshooting","b":["For Operators","Container Layer","Components","K8s Cluster API Provider"]},{"i":359,"t":"Makefile reference","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","b":["For Operators","Container Layer","Components","K8s Cluster API Provider"]},{"i":410,"t":"Configuration","u":"/docs/container/components/k8s-cluster-api-provider/doc/configuration","b":["For Operators","Container Layer","Components","K8s Cluster API Provider"]},{"i":421,"t":"Overview","u":"/docs/container/components/k8s-cluster-api-provider/doc/overview","b":["For Operators","Container Layer","Components","K8s Cluster API Provider"]},{"i":423,"t":"Requirements","u":"/docs/container/components/k8s-cluster-api-provider/doc/requirements","b":["For Operators","Container Layer","Components","K8s Cluster API Provider"]},{"i":433,"t":"Quickstart","u":"/docs/container/components/k8s-cluster-api-provider/doc/quickstart","b":["For Operators","Container Layer","Components","K8s Cluster API Provider"]},{"i":445,"t":"Roadmap","u":"/docs/container/components/k8s-cluster-api-provider/doc/roadmap","b":["For Operators","Container Layer","Components","K8s Cluster API Provider"]},{"i":448,"t":"Usage","u":"/docs/container/components/k8s-cluster-api-provider/doc/usage/","b":["For Operators","Container Layer","Components","K8s Cluster API Provider","Usage"]},{"i":450,"t":"SCS k8s-cluster-api-provider upgrade guide","u":"/docs/container/components/k8s-cluster-api-provider/doc/Upgrade-Guide","b":["For Operators","Container Layer","Components","K8s Cluster API Provider"]},{"i":469,"t":"Cluster Management on the capi management node","u":"/docs/container/components/k8s-cluster-api-provider/doc/usage/cluster-mgmt-capi-mgmt-node","b":["For Operators","Container Layer","Components","K8s Cluster API Provider","Usage"]},{"i":471,"t":"Container registry configuration","u":"/docs/container/components/k8s-cluster-api-provider/doc/usage/containter-registry-configuration","b":["For Operators"]},{"i":475,"t":"Custom CA","u":"/docs/container/components/k8s-cluster-api-provider/doc/usage/custom-ca","b":["For Operators"]},{"i":479,"t":"Create a new cluster","u":"/docs/container/components/k8s-cluster-api-provider/doc/usage/create-new-cluster","b":["For Operators","Container Layer","Components","K8s Cluster API Provider","Usage"]},{"i":481,"t":"Gateway-API","u":"/docs/container/components/k8s-cluster-api-provider/doc/usage/gateway-api","b":["For Operators"]},{"i":483,"t":"Harbor","u":"/docs/container/components/k8s-cluster-api-provider/doc/usage/harbor","b":["For Operators"]},{"i":492,"t":"Managing many clusters","u":"/docs/container/components/k8s-cluster-api-provider/doc/usage/managing-many-clusters","b":["For Operators","Container Layer","Components","K8s Cluster API Provider","Usage"]},{"i":494,"t":"Migration to ClusterClass","u":"/docs/container/components/k8s-cluster-api-provider/doc/usage/migrate-to-cluster-class","b":["For Operators"]},{"i":501,"t":"Multi-AZ and multi-cloud environments","u":"/docs/container/components/k8s-cluster-api-provider/doc/usage/multi-az-and-multi-cloud-environments","b":["For Operators","Container Layer","Components","K8s Cluster API Provider","Usage"]},{"i":503,"t":"Testing","u":"/docs/container/components/k8s-cluster-api-provider/doc/usage/testing","b":["For Operators","Container Layer","Components","K8s Cluster API Provider","Usage"]},{"i":505,"t":"Overview","u":"/docs/container/deployment-examples/a/","b":["For Operators"]},{"i":507,"t":"Software Requirements","u":"/docs/container/deployment-examples/a/software","b":["For Operators"]},{"i":509,"t":"Guide 1","u":"/docs/container/guides/guide1","b":["For Operators"]},{"i":511,"t":"Hardware Requirements","u":"/docs/container/deployment-examples/a/hardware","b":["For Operators"]},{"i":513,"t":"Architecture","u":"/docs/container/overview/architecture","b":["For Operators"]},{"i":515,"t":"Knowledge","u":"/docs/container/overview/knowledge","b":["For Operators"]},{"i":517,"t":"Frequently Asked Questions","u":"/docs/faq/","b":["For Operators"]},{"i":552,"t":"Containerization","u":"/docs/getting-started/containerization","b":["For Operators"]},{"i":554,"t":"Overview","u":"/docs/getting-started/overview","b":["For Operators"]},{"i":556,"t":"Virtualization","u":"/docs/getting-started/virtualization","b":["For Operators"]},{"i":558,"t":"Glossary","u":"/docs/glossary","b":["For Operators"]},{"i":604,"t":"Flavor Manager","u":"/docs/iaas/components/flavor-manager","b":["For Operators","IaaS Layer","Components"]},{"i":615,"t":"Project Manager","u":"/docs/iaas/components/project-manager","b":["For Operators"]},{"i":616,"t":"Day-2 Operations","u":"/docs/iaas/components/","b":["For Operators"]},{"i":617,"t":"Image Manager","u":"/docs/iaas/components/image-manager","b":["For Operators","IaaS Layer","Components"]},{"i":642,"t":"Sandbox Manager","u":"/docs/iaas/components/sandbox-manager","b":["For Operators"]},{"i":643,"t":"Resource Manager","u":"/docs/iaas/components/resource-manager","b":["For Operators"]},{"i":647,"t":"Guides","u":"/docs/iaas/guides/","b":["For Operators","IaaS Layer","Guides"]},{"i":648,"t":"Configuration Guide","u":"/docs/iaas/guides/configuration-guide/","b":["For Operators","IaaS Layer","Guides","Configuration Guide"]},{"i":649,"t":"Commons","u":"/docs/iaas/guides/configuration-guide/commons/","b":["For Operators","IaaS Layer","Guides","Configuration Guide","Commons"]},{"i":651,"t":"Ceph","u":"/docs/iaas/guides/configuration-guide/ceph","b":["For Operators","IaaS Layer","Guides","Configuration Guide"]},{"i":662,"t":"Network","u":"/docs/iaas/guides/configuration-guide/commons/network","b":["For Operators","IaaS Layer","Guides","Configuration Guide","Commons"]},{"i":673,"t":"Packages","u":"/docs/iaas/guides/configuration-guide/commons/packages","b":["For Operators","IaaS Layer","Guides","Configuration Guide","Commons"]},{"i":680,"t":"Services","u":"/docs/iaas/guides/configuration-guide/commons/services","b":["For Operators","IaaS Layer","Guides","Configuration Guide","Commons"]},{"i":686,"t":"SSH Config","u":"/docs/iaas/guides/configuration-guide/commons/sshconfig","b":["For Operators","IaaS Layer","Guides","Configuration Guide","Commons"]},{"i":692,"t":"Sysctl","u":"/docs/iaas/guides/configuration-guide/commons/sysctl","b":["For Operators","IaaS Layer","Guides","Configuration Guide","Commons"]},{"i":694,"t":"Timezone","u":"/docs/iaas/guides/configuration-guide/commons/timezone","b":["For Operators","IaaS Layer","Guides","Configuration Guide","Commons"]},{"i":696,"t":"Inventory","u":"/docs/iaas/guides/configuration-guide/inventory","b":["For Operators","IaaS Layer","Guides","Configuration Guide"]},{"i":705,"t":"Configuration Repository","u":"/docs/iaas/guides/configuration-guide/configuration-repository","b":["For Operators","IaaS Layer","Guides","Configuration Guide"]},{"i":730,"t":"Horizon","u":"/docs/iaas/guides/configuration-guide/openstack/horizon","b":["For Operators","IaaS Layer","Guides","Configuration Guide","OpenStack"]},{"i":733,"t":"Manager","u":"/docs/iaas/guides/configuration-guide/manager","b":["For Operators","IaaS Layer","Guides","Configuration Guide"]},{"i":740,"t":"Proxy","u":"/docs/iaas/guides/configuration-guide/proxy","b":["For Operators","IaaS Layer","Guides","Configuration Guide"]},{"i":742,"t":"OpenStack","u":"/docs/iaas/guides/configuration-guide/openstack/","b":["For Operators","IaaS Layer","Guides","Configuration Guide","OpenStack"]},{"i":747,"t":"Keystone","u":"/docs/iaas/guides/configuration-guide/openstack/keystone","b":["For Operators","IaaS Layer","Guides","Configuration Guide","OpenStack"]},{"i":751,"t":"Self-signed certificates","u":"/docs/iaas/guides/configuration-guide/self-signed-certificates","b":["For Operators","IaaS Layer","Guides","Configuration Guide"]},{"i":755,"t":"Services","u":"/docs/iaas/guides/configuration-guide/services/","b":["For Operators","IaaS Layer","Guides","Configuration Guide"]},{"i":757,"t":"Deploy Guide","u":"/docs/iaas/guides/deploy-guide/","b":["For Operators","IaaS Layer","Guides","Deploy Guide"]},{"i":761,"t":"Examples","u":"/docs/iaas/guides/deploy-guide/examples/","b":["For Operators","IaaS Layer","Guides","Deploy Guide","Examples"]},{"i":762,"t":"Bootstrap","u":"/docs/iaas/guides/deploy-guide/bootstrap","b":["For Operators","IaaS Layer","Guides","Deploy Guide"]},{"i":764,"t":"Manager","u":"/docs/iaas/guides/deploy-guide/manager","b":["For Operators","IaaS Layer","Guides","Deploy Guide"]},{"i":774,"t":"Testbed","u":"/docs/iaas/guides/deploy-guide/examples/testbed","b":["For Operators","IaaS Layer","Guides","Deploy Guide","Examples"]},{"i":826,"t":"Cloud in a Box - CiaB","u":"/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box","b":["For Operators","IaaS Layer","Guides","Deploy Guide","Examples"]},{"i":857,"t":"Provisioning of management and control plane nodes","u":"/docs/iaas/guides/deploy-guide/provisioning","b":["For Operators","IaaS Layer","Guides","Deploy Guide"]},{"i":861,"t":"Services","u":"/docs/iaas/guides/deploy-guide/services/","b":["For Operators","IaaS Layer","Guides","Deploy Guide","Services"]},{"i":864,"t":"Seed","u":"/docs/iaas/guides/deploy-guide/seed","b":["For Operators","IaaS Layer","Guides","Deploy Guide"]},{"i":870,"t":"Ceph","u":"/docs/iaas/guides/deploy-guide/services/ceph","b":["For Operators","IaaS Layer","Guides","Deploy Guide","Services"]},{"i":874,"t":"Infrastructure","u":"/docs/iaas/guides/deploy-guide/services/infrastructure","b":["For Operators","IaaS Layer","Guides","Deploy Guide","Services"]},{"i":888,"t":"Logging & Monitoring","u":"/docs/iaas/guides/deploy-guide/services/logging-monitoring","b":["For Operators","IaaS Layer","Guides","Deploy Guide","Services"]},{"i":896,"t":"Network","u":"/docs/iaas/guides/deploy-guide/services/network","b":["For Operators","IaaS Layer","Guides","Deploy Guide","Services"]},{"i":901,"t":"OpenStack","u":"/docs/iaas/guides/deploy-guide/services/openstack","b":["For Operators","IaaS Layer","Guides","Deploy Guide","Services"]},{"i":923,"t":"Manager","u":"/docs/iaas/guides/operations-guide/manager/","b":["For Operators","IaaS Layer","Guides","Operations Guide","Manager"]},{"i":924,"t":"Operations Guide","u":"/docs/iaas/guides/operations-guide/","b":["For Operators","IaaS Layer","Guides","Operations Guide"]},{"i":931,"t":"Apply","u":"/docs/iaas/guides/operations-guide/manager/apply","b":["For Operators","IaaS Layer","Guides","Operations Guide","Manager"]},{"i":934,"t":"Ceph operations cheatsheet","u":"/docs/iaas/guides/operations-guide/ceph","b":["For Operators","IaaS Layer","Guides","Operations Guide"]},{"i":1019,"t":"Console","u":"/docs/iaas/guides/operations-guide/manager/console","b":["For Operators","IaaS Layer","Guides","Operations Guide","Manager"]},{"i":1029,"t":"Logging","u":"/docs/iaas/guides/operations-guide/manager/log","b":["For Operators","IaaS Layer","Guides","Operations Guide","Manager"]},{"i":1039,"t":"Task","u":"/docs/iaas/guides/operations-guide/manager/task","b":["For Operators","IaaS Layer","Guides","Operations Guide","Manager"]},{"i":1044,"t":"OpenStack","u":"/docs/iaas/guides/operations-guide/openstack/","b":["For Operators","IaaS Layer","Guides","Operations Guide","OpenStack"]},{"i":1045,"t":"Cinder","u":"/docs/iaas/guides/operations-guide/openstack/cinder","b":["For Operators","IaaS Layer","Guides","Operations Guide","OpenStack"]},{"i":1048,"t":"Day-2 Operations","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/","b":["For Operators","IaaS Layer","Guides","Operations Guide","OpenStack","Day-2 Operations"]},{"i":1049,"t":"Flavor Manager","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/flavor-manager","b":["For Operators","IaaS Layer","Guides","Operations Guide","OpenStack","Day-2 Operations"]},{"i":1060,"t":"Image Manager","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/image-manager","b":["For Operators","IaaS Layer","Guides","Operations Guide","OpenStack","Day-2 Operations"]},{"i":1085,"t":"Resource Manager","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/resource-manager","b":["For Operators","IaaS Layer","Guides","Operations Guide","OpenStack","Day-2 Operations"]},{"i":1089,"t":"Project Manager","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/project-manager","b":["For Operators","IaaS Layer","Guides","Operations Guide","OpenStack","Day-2 Operations"]},{"i":1090,"t":"Sandbox Manager","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/sandbox-manager","b":["For Operators","IaaS Layer","Guides","Operations Guide","OpenStack","Day-2 Operations"]},{"i":1091,"t":"Octavia","u":"/docs/iaas/guides/operations-guide/openstack/octavia","b":["For Operators","IaaS Layer","Guides","Operations Guide","OpenStack"]},{"i":1094,"t":"Other Guides","u":"/docs/iaas/guides/other-guides/","b":["For Operators","IaaS Layer","Guides","Other Guides"]},{"i":1095,"t":"Contributor Guide","u":"/docs/iaas/guides/other-guides/contributor-guide","b":["For Operators","IaaS Layer","Guides","Other Guides"]},{"i":1097,"t":"Developer Guide","u":"/docs/iaas/guides/other-guides/developer-guide/","b":["For Operators","IaaS Layer","Guides","Other Guides","Developer Guide"]},{"i":1102,"t":"Scripts","u":"/docs/iaas/guides/other-guides/developer-guide/scripts","b":["For Operators","IaaS Layer","Guides","Other Guides","Developer Guide"]},{"i":1110,"t":"Releases","u":"/docs/iaas/guides/other-guides/developer-guide/releases","b":["For Operators","IaaS Layer","Guides","Other Guides","Developer Guide"]},{"i":1127,"t":"Zuul CI","u":"/docs/iaas/guides/other-guides/developer-guide/zuul-ci","b":["For Operators","IaaS Layer","Guides","Other Guides","Developer Guide"]},{"i":1131,"t":"Style Guide","u":"/docs/iaas/guides/other-guides/style-guide","b":["For Operators","IaaS Layer","Guides","Other Guides"]},{"i":1162,"t":"Troubleshooting Guide","u":"/docs/iaas/guides/troubleshooting-guide/","b":["For Operators","IaaS Layer","Guides","Troubleshooting Guide"]},{"i":1164,"t":"Zuul CI","u":"/docs/iaas/guides/other-guides/zuul","b":["For Operators","IaaS Layer","Guides","Other Guides"]},{"i":1182,"t":"Manager","u":"/docs/iaas/guides/troubleshooting-guide/manager","b":["For Operators","IaaS Layer","Guides","Troubleshooting Guide"]},{"i":1185,"t":"OpenStack","u":"/docs/iaas/guides/troubleshooting-guide/openstack","b":["For Operators","IaaS Layer","Guides","Troubleshooting Guide"]},{"i":1188,"t":"Upgrade Guide","u":"/docs/iaas/guides/upgrade-guide/","b":["For Operators","IaaS Layer","Guides","Upgrade Guide"]},{"i":1190,"t":"Ceph","u":"/docs/iaas/guides/upgrade-guide/ceph","b":["For Operators","IaaS Layer","Guides","Upgrade Guide"]},{"i":1192,"t":"Infrastructure","u":"/docs/iaas/guides/upgrade-guide/infrastructure","b":["For Operators","IaaS Layer","Guides","Upgrade Guide"]},{"i":1206,"t":"Docker","u":"/docs/iaas/guides/upgrade-guide/docker","b":["For Operators","IaaS Layer","Guides","Upgrade Guide"]},{"i":1210,"t":"Logging & Monitoring","u":"/docs/iaas/guides/upgrade-guide/logging-monitoring","b":["For Operators","IaaS Layer","Guides","Upgrade Guide"]},{"i":1217,"t":"Manager","u":"/docs/iaas/guides/upgrade-guide/manager","b":["For Operators","IaaS Layer","Guides","Upgrade Guide"]},{"i":1219,"t":"Network","u":"/docs/iaas/guides/upgrade-guide/network","b":["For Operators","IaaS Layer","Guides","Upgrade Guide"]},{"i":1224,"t":"Architecture","u":"/docs/iaas/overview/architecture","b":["For Operators"]},{"i":1226,"t":"OpenStack","u":"/docs/iaas/guides/upgrade-guide/openstack","b":["For Operators","IaaS Layer","Guides","Upgrade Guide"]},{"i":1251,"t":"Compute","u":"/docs/iaas/overview/compute","b":["For Operators"]},{"i":1253,"t":"Knowledge","u":"/docs/iaas/overview/knowledge","b":["For Operators"]},{"i":1255,"t":"Storage","u":"/docs/iaas/overview/storage","b":["For Operators"]},{"i":1257,"t":"Network","u":"/docs/iaas/overview/network","b":["For Operators"]},{"i":1259,"t":"Proposal for documentation for Keycloak to Keycloak Federation (WebSSO)","u":"/docs/iam/intra-SCS-federation-setup-description-for-osism-doc-operations","b":["For Operators","Identity and Access Management (IAM)"]},{"i":1263,"t":"Overview","u":"/docs/operating-scs/audits/","b":["For Operators"]},{"i":1265,"t":"Component Overview","u":"/docs/operating-scs/components/status-page/docs/component_overview","b":["For Operators","Operating SCS","Components","Status Page API"]},{"i":1267,"t":"Components","u":"/docs/operating-scs/components/status-page/docs/components","b":["For Operators","Operating SCS","Components","Status Page API"]},{"i":1269,"t":"Overview","u":"/docs/operating-scs/components/status-page/docs/overview","b":["For Operators","Operating SCS","Components","Status Page API"]},{"i":1279,"t":"\"Levels of consensus\"","u":"/docs/operating-scs/components/status-page/docs/levels_of_consensus","b":["For Operators","Operating SCS","Components","Status Page API"]},{"i":1281,"t":"Guide 1","u":"/docs/operating-scs/guides/guide-1","b":["For Operators"]},{"i":1283,"t":"Overview","u":"/docs/operating-scs/incident-management/","b":["For Operators"]},{"i":1285,"t":"Overview","u":"/docs/operating-scs/lifecycle-management/","b":["For Operators"]},{"i":1287,"t":"Overview","u":"/docs/operating-scs/logging/","b":["For Operators"]},{"i":1289,"t":"Overview","u":"/docs/operating-scs/monitoring/","b":["For Operators"]},{"i":1291,"t":"Metering Configuration","u":"/docs/operating-scs/metering/meter_configuration","b":["For Operators","Operating SCS","Metering"]},{"i":1303,"t":"Release Notes for SCS Release 0","u":"/docs/releases/Release0","b":["For Operators","Releases"]},{"i":1321,"t":"Overview","u":"/docs/operating-scs/overview","b":["For Operators"]},{"i":1323,"t":"Release Notes for SCS Release 1","u":"/docs/releases/Release1","b":["For Operators","Releases"]},{"i":1360,"t":"Release Notes for SCS Release 4","u":"/docs/releases/Release4","b":["For Operators","Releases"]},{"i":1392,"t":"Release Notes for SCS Release 3","u":"/docs/releases/Release3","b":["For Operators","Releases"]},{"i":1426,"t":"Release Notes for SCS Release 2","u":"/docs/releases/Release2","b":["For Operators","Releases"]},{"i":1459,"t":"Release Notes for SCS Release 5","u":"/docs/releases/Release5","b":["For Operators","Releases"]},{"i":1497,"t":"Release Notes for SCS Release X","u":"/docs/releases/ReleaseX","b":["For Operators"]},{"i":1515,"t":"Introduction","u":"/standards/","b":["Standards"]},{"i":1517,"t":"Standards","u":"/docs/standards/","b":["For Operators"]},{"i":1519,"t":"Certified Clouds","u":"/standards/certification/certified-clouds","b":["Standards"]},{"i":1533,"t":"Certification","u":"/standards/certification/overview","b":["Standards"]},{"i":1540,"t":"How to get certified","u":"/standards/certification/get-certified","b":["Standards"]},{"i":1542,"t":"Scopes and Versions","u":"/standards/certification/subjects-versions","b":["Standards"]},{"i":1544,"t":"Global Standards","u":"/standards/global/","b":["Standards","Standards","Global"]},{"i":1546,"t":"SCS-0001: SCS Standards","u":"/standards/global/scs-0001","b":["Standards","Standards","Global","🟢 SCS-0001"]},{"i":1548,"t":"SCS-0002: Org & Docs Standards","u":"/standards/global/scs-0002","b":["Standards","Standards","Global","🟢 SCS-0002"]},{"i":1550,"t":"SCS-0003: YAML Standards","u":"/standards/global/scs-0003","b":["Standards","Standards","Global","🟠 SCS-0003"]},{"i":1552,"t":"IaaS Standards","u":"/standards/iaas/","b":["Standards","Standards","IaaS"]},{"i":1554,"t":"SCS-0101: Entropy","u":"/standards/iaas/scs-0101","b":["Standards","Standards","IaaS","🟠 SCS-0101"]},{"i":1556,"t":"SCS-0102: Image Metadata","u":"/standards/iaas/scs-0102","b":["Standards","Standards","IaaS","🟢 SCS-0102"]},{"i":1558,"t":"SCS-0100: Flavor Naming","u":"/standards/iaas/scs-0100","b":["Standards","Standards","IaaS","🟢 SCS-0100"]},{"i":1560,"t":"SCS-0103: Standard Flavors","u":"/standards/iaas/scs-0103","b":["Standards","Standards","IaaS","🟠 SCS-0103"]},{"i":1562,"t":"SCS-0104: Standard Images","u":"/standards/iaas/scs-0104","b":["Standards","Standards","IaaS","🟠 SCS-0104"]},{"i":1564,"t":"IAM Standards","u":"/standards/iam/","b":["Standards","Standards","IAM"]},{"i":1566,"t":"SCS-0300: SSO Identity Federation","u":"/standards/iam/scs-0300","b":["Standards","Standards","IAM","🟢 SCS-0300"]},{"i":1568,"t":"KaaS Standards","u":"/standards/kaas/","b":["Standards","Standards","KaaS"]},{"i":1570,"t":"SCS-0210: k8s New Version Policy","u":"/standards/kaas/scs-0210","b":["Standards","Standards","KaaS","🟢 SCS-0210"]},{"i":1572,"t":"Ops Standards","u":"/standards/ops/","b":["Standards","Standards","Ops"]},{"i":1574,"t":"SCS-0211: KaaS Default Storage Class","u":"/standards/kaas/scs-0211","b":["Standards","Standards","KaaS","🟢 SCS-0211"]},{"i":1576,"t":"SCS-0412: Metering JSON","u":"/standards/ops/scs-0412","b":["Standards","Standards","Ops","🟠 SCS-0412"]},{"i":1578,"t":"Sovereign Cloud Standards","u":"/standards/scs-0001-v1-sovereign-cloud-standards","b":["Standards","Standards","Global","🟢 SCS-0001"]},{"i":1613,"t":"Standards, Docs and Organisation","u":"/standards/scs-0002-v1-standards-docs-org","b":["Standards","Standards","Global","🟢 SCS-0002"]},{"i":1620,"t":"Sovereign Cloud Standards YAML","u":"/standards/scs-0003-v1-sovereign-cloud-standards-yaml","b":["Standards","Standards","Global","🟠 SCS-0003"]},{"i":1655,"t":"SCS Documentation structure","u":"/standards/scs-0002-v2-standards-docs-org","b":["Standards","Standards","Global","🟢 SCS-0002"]},{"i":1676,"t":"SCS Flavor Naming Standard","u":"/standards/scs-0100-v1-flavor-naming","b":["Standards","Standards","IaaS","🟢 SCS-0100"]},{"i":1713,"t":"SCS Flavor Naming Standard","u":"/standards/scs-0100-v2-flavor-naming","b":["Standards","Standards","IaaS","🟢 SCS-0100"]},{"i":1758,"t":"SCS Flavor Naming Standard","u":"/standards/scs-0100-v3-flavor-naming","b":["Standards","Standards","IaaS","🟢 SCS-0100"]},{"i":1799,"t":"SCS Image Metadata Standard","u":"/standards/scs-0102-v1-image-metadata","b":["Standards","Standards","IaaS","🟢 SCS-0102"]},{"i":1819,"t":"SCS Entropy","u":"/standards/scs-0101-v1-entropy","b":["Standards","Standards","IaaS","🟠 SCS-0101"]},{"i":1838,"t":"SCS Standard Flavors and Properties","u":"/standards/scs-0103-v1-standard-flavors","b":["Standards","Standards","IaaS","🟠 SCS-0103"]},{"i":1860,"t":"SCS Standard Images","u":"/standards/scs-0104-v1-standard-images","b":["Standards","Standards","IaaS","🟠 SCS-0104"]},{"i":1884,"t":"SSD Flavors","u":"/standards/scs-0110-v1-ssd-flavors","b":["Standards","Decision Records","SCS-0110"]},{"i":1902,"t":"SCS K8S Version Policy for new Kubernetes versions","u":"/standards/scs-0210-v1-k8s-new-version-policy","b":["Standards","Standards","KaaS","🟢 SCS-0210"]},{"i":1913,"t":"SCS K8S Version Policy","u":"/standards/scs-0210-v2-k8s-version-policy","b":["Standards"]},{"i":1924,"t":"Decisions for the Volume Type Standard","u":"/standards/scs-0111-v1-volume-type-decisions","b":["Standards","Decision Records","SCS-0111"]},{"i":1939,"t":"SCS KaaS default storage class","u":"/standards/scs-0211-v1-kaas-default-storage-class","b":["Standards","Standards","KaaS","🟢 SCS-0211"]},{"i":1954,"t":"Requirements for container registry","u":"/standards/scs-0212-v1-requirements-for-container-registry","b":["Standards","Decision Records","SCS-0212"]},{"i":1969,"t":"Kubernetes Nodes Anti Affinity","u":"/standards/scs-0213-v1-k8s-nodes-anti-affinity","b":["Standards","Decision Records","SCS-0213"]},{"i":1982,"t":"Requirements for testing cluster-stacks","u":"/standards/scs-0213-v1-requirements-for-testing-cluster-stacks","b":["Standards"]},{"i":2005,"t":"Kubernetes Node Distribution and Availability","u":"/standards/scs-0214-v1-k8s-node-distribution","b":["Standards"]},{"i":2020,"t":"Requirements for SSO identity federation","u":"/standards/scs-0300-v1-requirements-for-sso-identity-federation","b":["Standards","Standards","IAM","🟢 SCS-0300"]},{"i":2037,"t":"Domain Manager configuration for Keystone","u":"/standards/scs-0302-v1-domain-manager-role","b":["Standards"]},{"i":2069,"t":"Naming for domains/groups/roles/project when onboarding new customers","u":"/standards/scs-0301-v1-naming-conventions","b":["Standards","Decision Records","SCS-0301"]},{"i":2086,"t":"Status Page create decision","u":"/standards/scs-0400-v1-status-page-create-decision","b":["Standards","Decision Records","SCS-0400"]},{"i":2097,"t":"Status page OpenAPI decision","u":"/standards/scs-0402-v1-status-page-openapi-spec-decision","b":["Standards","Decision Records","SCS-0402"]},{"i":2129,"t":"Gnocchi as database for metering","u":"/standards/scs-0410-v1-gnocchi-as-metering-database","b":["Standards","Decision Records","SCS-0410"]},{"i":2148,"t":"Status page reference implementation decision","u":"/standards/scs-0401-v1-status-page-reference-implementation-decision","b":["Standards","Decision Records","SCS-0401"]},{"i":2158,"t":"Push-based approach for providing usage data","u":"/standards/scs-0411-v1-publishing_method_for_metering_data","b":["Standards","Decision Records","SCS-0411"]},{"i":2177,"t":"_Descriptive title_","u":"/standards/scs-XXXX-vN-template","b":["Standards"]},{"i":2194,"t":"Exposition of IaaS metering data as JSON","u":"/standards/scs-0412-v1-metering-json","b":["Standards","Standards","Ops","🟠 SCS-0412"]},{"i":2211,"t":"Overview","u":"/standards/standards/overview","b":["Standards","Standards"]}],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[["t/1",[]],["t/2",[0,4.499,1,4.499,2,4.499]],["t/4",[3,3.642]],["t/12",[4,6.524]],["t/15",[5,3.231,6,3.035,7,2.747,8,3.231]],["t/33",[9,3.733,10,3.733,11,3.043]],["t/41",[9,2.303,10,2.303,12,2.776,13,2.491,14,2.776,15,2.051,16,2.776]],["t/49",[9,3.733,10,3.733,17,4.499]],["t/56",[18,6.524]],["t/57",[19,6.524]],["t/79",[20,6.524]],["t/80",[21,6.524]],["t/84",[22,4.499,23,3.733,24,2.227]],["t/97",[25,3.324,26,4.499,27,4.499]],["t/101",[25,3.324,28,4.499,29,4.037]],["t/117",[24,2.636,30,5.326]],["t/123",[31,6.524]],["t/136",[32,6.524]],["t/143",[24,2.227,33,4.499,34,4.037]],["t/163",[35,4.499,36,4.499,37,4.499]],["t/165",[6,2.675,15,2.537,38,2.849,39,3.433,40,3.081]],["t/169",[41,5.326,42,5.326]],["t/172",[40,4.037,43,4.499,44,1.637]],["t/190",[45,4.499,46,4.499,47,4.499]],["t/236",[6,3.505,25,3.324,44,1.637]],["t/238",[44,1.637,48,3.733,49,3.324]],["t/244",[11,2.323,49,2.537,50,3.433,51,3.433,52,3.433]],["t/258",[53,5.413]],["t/291",[53,3.733,54,3.733,55,4.499]],["t/305",[24,2.227,56,3.733,57,4.499]],["t/320",[58,5.326,59,5.326]],["t/322",[60,4.499,61,4.499,62,4.499]],["t/332",[63,5.326,64,5.326]],["t/346",[24,1.254,44,0.922,65,2.533,66,2.273,67,1.872,68,1.787,69,2.102,70,2.102]],["t/359",[71,5.326,72,4.779]],["t/410",[73,4.601]],["t/421",[3,3.642]],["t/423",[74,4.601]],["t/433",[75,6.524]],["t/445",[76,6.524]],["t/448",[77,5.854]],["t/450",[24,1.374,44,1.01,67,2.051,68,1.958,69,2.303,70,2.303,78,2.491]],["t/469",[68,2.421,79,2.532,80,3.433,81,2.675]],["t/471",[54,3.733,73,3.173,82,4.037]],["t/475",[83,4.779,84,5.326]],["t/479",[68,3.173,85,4.037,86,3.505]],["t/481",[69,4.418,87,5.326]],["t/483",[88,6.524]],["t/492",[68,3.173,79,2.179,89,4.499]],["t/494",[90,5.326,91,5.326]],["t/501",[7,2.421,92,5.227,93,3.433,94,3.433]],["t/503",[5,5.413]],["t/505",[3,3.642]],["t/507",[74,3.756,95,5.326]],["t/509",[24,2.636,96,4.418]],["t/511",[74,3.756,97,5.326]],["t/513",[98,5.854]],["t/515",[99,5.854]],["t/517",[100,4.499,101,4.499,102,4.499]],["t/552",[103,6.524]],["t/554",[3,3.642]],["t/556",[104,6.524]],["t/558",[105,6.524]],["t/604",[79,2.58,106,3.349]],["t/615",[79,2.58,107,4.779]],["t/616",[108,4.037,109,3.733,110,3.505]],["t/617",[79,2.58,111,3.756]],["t/642",[79,2.58,112,4.779]],["t/643",[8,4.418,79,2.58]],["t/647",[24,3.229]],["t/648",[24,2.636,73,3.756]],["t/649",[113,6.524]],["t/651",[114,5.083]],["t/662",[115,5.083]],["t/673",[116,6.524]],["t/680",[117,5.413]],["t/686",[118,5.326,119,5.326]],["t/692",[120,6.524]],["t/694",[121,6.524]],["t/696",[122,6.524]],["t/705",[73,3.756,123,5.326]],["t/730",[124,6.524]],["t/733",[79,3.16]],["t/740",[125,6.524]],["t/742",[11,4.413]],["t/747",[126,5.854]],["t/751",[38,3.733,127,4.499,128,4.499]],["t/755",[117,5.413]],["t/757",[24,2.636,129,5.326]],["t/761",[130,6.524]],["t/762",[131,6.524]],["t/764",[79,3.16]],["t/774",[132,6.524]],["t/826",[7,3.173,133,4.499,134,4.499]],["t/857",[79,1.663,81,2.675,135,3.433,136,3.433,137,3.433]],["t/861",[117,5.413]],["t/864",[138,6.524]],["t/870",[114,5.083]],["t/874",[139,5.854]],["t/888",[15,3.324,140,3.733,141,4.037]],["t/896",[115,5.083]],["t/901",[11,4.413]],["t/923",[79,3.16]],["t/924",[24,2.636,110,4.149]],["t/931",[142,6.524]],["t/934",[110,3.505,114,3.505,143,4.499]],["t/1019",[144,6.524]],["t/1029",[140,5.413]],["t/1039",[145,6.524]],["t/1044",[11,4.413]],["t/1045",[146,6.524]],["t/1048",[108,4.037,109,3.733,110,3.505]],["t/1049",[79,2.58,106,3.349]],["t/1060",[79,2.58,111,3.756]],["t/1085",[8,4.418,79,2.58]],["t/1089",[79,2.58,107,4.779]],["t/1090",[79,2.58,112,4.779]],["t/1091",[147,6.524]],["t/1094",[24,3.229]],["t/1095",[24,2.636,148,5.326]],["t/1097",[6,4.149,24,2.636]],["t/1102",[149,6.524]],["t/1110",[150,4.249]],["t/1127",[56,4.418,151,4.779]],["t/1131",[24,2.636,34,4.779]],["t/1162",[24,2.636,66,4.779]],["t/1164",[56,4.418,151,4.779]],["t/1182",[79,3.16]],["t/1185",[11,4.413]],["t/1188",[24,2.636,78,4.779]],["t/1190",[114,5.083]],["t/1192",[139,5.854]],["t/1206",[152,6.524]],["t/1210",[15,3.324,140,3.733,141,4.037]],["t/1217",[79,3.16]],["t/1219",[115,5.083]],["t/1224",[98,5.854]],["t/1226",[11,4.413]],["t/1251",[153,6.524]],["t/1253",[99,5.854]],["t/1255",[154,5.413]],["t/1257",[115,5.083]],["t/1259",[25,2.268,49,2.268,155,3.07,156,4.795,157,3.07]],["t/1263",[3,3.642]],["t/1265",[3,2.973,158,4.779]],["t/1267",[158,5.854]],["t/1269",[3,3.642]],["t/1279",[159,5.326,160,5.326]],["t/1281",[24,2.636,96,4.418]],["t/1283",[3,3.642]],["t/1285",[3,3.642]],["t/1287",[3,3.642]],["t/1289",[3,3.642]],["t/1291",[73,3.756,161,4.149]],["t/1303",[44,1.25,150,3.404,162,2.323,163,3.433]],["t/1321",[3,3.642]],["t/1323",[44,1.25,96,2.849,150,3.404,162,2.323]],["t/1360",[44,1.25,150,3.404,162,2.323,164,3.433]],["t/1392",[44,1.25,150,3.404,162,2.323,165,3.433]],["t/1426",[44,1.25,109,2.849,150,3.404,162,2.323]],["t/1459",[44,1.25,150,3.404,162,2.323,166,3.433]],["t/1497",[13,3.081,44,1.25,150,3.404,162,2.323]],["t/1515",[53,5.413]],["t/1517",[167,3.032]],["t/1519",[7,3.756,168,4.779]],["t/1533",[38,5.413]],["t/1540",[168,5.854]],["t/1542",[169,5.326,170,4.149]],["t/1544",[167,2.475,171,5.326]],["t/1546",[44,2.091,167,1.81,172,3.895]],["t/1548",[15,2.268,23,2.547,44,1.117,167,1.427,173,3.07,174,3.07]],["t/1550",[44,1.417,167,1.81,175,3.895,176,3.495]],["t/1552",[167,2.475,177,4.779]],["t/1554",[44,1.637,178,4.499,179,4.037]],["t/1556",[44,1.417,111,2.747,180,3.895,181,3.495]],["t/1558",[44,1.417,106,2.45,182,3.895,183,2.877]],["t/1560",[44,1.417,106,2.45,167,1.81,184,3.895]],["t/1562",[44,1.417,111,2.747,167,1.81,185,3.895]],["t/1564",[167,2.475,186,5.326]],["t/1566",[44,1.25,48,2.849,49,2.537,187,3.433,188,3.081]],["t/1568",[167,2.475,189,4.418]],["t/1570",[44,1.117,67,2.268,86,2.392,170,2.392,190,3.07,191,2.547]],["t/1572",[167,2.475,192,5.326]],["t/1574",[44,1.117,154,2.547,189,2.547,193,3.07,194,2.755,195,2.755]],["t/1576",[44,1.417,161,3.035,196,3.895,197,3.495]],["t/1578",[7,3.173,167,2.091,198,4.037]],["t/1613",[23,3.733,167,2.091,199,4.499]],["t/1620",[7,2.747,167,1.81,176,3.495,198,3.495]],["t/1655",[25,3.324,29,4.037,44,1.637]],["t/1676",[44,1.417,106,2.45,167,1.81,183,2.877]],["t/1713",[44,1.417,106,2.45,167,1.81,183,2.877]],["t/1758",[44,1.417,106,2.45,167,1.81,183,2.877]],["t/1799",[44,1.417,111,2.747,167,1.81,181,3.495]],["t/1819",[44,1.938,179,4.779]],["t/1838",[44,1.417,106,2.45,167,1.81,200,3.895]],["t/1860",[44,1.637,111,3.173,167,2.091]],["t/1884",[106,3.349,201,5.326]],["t/1902",[44,1.01,67,2.051,86,2.163,170,3.451,191,2.303,202,2.303]],["t/1913",[44,1.417,67,2.877,170,3.035,191,3.231]],["t/1924",[167,1.81,203,3.035,204,3.895,205,3.895]],["t/1939",[44,1.25,154,2.849,189,2.849,194,3.081,195,3.081]],["t/1954",[54,3.733,74,3.173,82,4.037]],["t/1969",[81,3.035,202,3.231,206,3.895,207,3.895]],["t/1982",[5,3.231,68,2.747,74,2.747,208,3.895]],["t/2005",[81,3.035,202,3.231,209,3.895,210,3.895]],["t/2020",[48,3.231,49,2.877,74,2.747,188,3.495]],["t/2037",[73,2.747,79,1.886,126,3.495,211,3.895]],["t/2069",[83,3.081,86,2.675,183,2.537,212,3.433,213,3.433]],["t/2086",[85,3.495,203,3.035,214,3.231,215,3.231]],["t/2097",[203,3.035,214,3.231,215,3.231,216,3.895]],["t/2129",[161,3.505,217,4.499,218,4.499]],["t/2148",[72,3.081,203,2.675,214,2.849,215,2.849,219,3.433]],["t/2158",[70,2.547,77,2.755,220,3.07,221,3.07,222,3.07,223,2.755]],["t/2177",[224,5.326,225,5.326]],["t/2194",[161,2.675,177,3.081,197,3.081,223,3.081,226,3.433]],["t/2211",[3,3.642]]],"invertedIndex":[["",{"_index":15,"t":{"41":{"position":[[36,1]]},"165":{"position":[[32,1]]},"888":{"position":[[8,1]]},"1210":{"position":[[8,1]]},"1548":{"position":[[14,1]]}}}],["0",{"_index":163,"t":{"1303":{"position":[[30,1]]}}}],["0001",{"_index":172,"t":{"1546":{"position":[[4,5]]}}}],["0002",{"_index":173,"t":{"1548":{"position":[[4,5]]}}}],["0003",{"_index":175,"t":{"1550":{"position":[[4,5]]}}}],["0100",{"_index":182,"t":{"1558":{"position":[[4,5]]}}}],["0101",{"_index":178,"t":{"1554":{"position":[[4,5]]}}}],["0102",{"_index":180,"t":{"1556":{"position":[[4,5]]}}}],["0103",{"_index":184,"t":{"1560":{"position":[[4,5]]}}}],["0104",{"_index":185,"t":{"1562":{"position":[[4,5]]}}}],["0210",{"_index":190,"t":{"1570":{"position":[[4,5]]}}}],["0211",{"_index":193,"t":{"1574":{"position":[[4,5]]}}}],["0300",{"_index":187,"t":{"1566":{"position":[[4,5]]}}}],["0412",{"_index":196,"t":{"1576":{"position":[[4,5]]}}}],["1",{"_index":96,"t":{"509":{"position":[[6,1]]},"1281":{"position":[[6,1]]},"1323":{"position":[[30,1]]}}}],["2",{"_index":109,"t":{"616":{"position":[[4,1]]},"1048":{"position":[[4,1]]},"1426":{"position":[[30,1]]}}}],["3",{"_index":165,"t":{"1392":{"position":[[30,1]]}}}],["4",{"_index":164,"t":{"1360":{"position":[[30,1]]}}}],["5",{"_index":166,"t":{"1459":{"position":[[30,1]]}}}],["_descript",{"_index":224,"t":{"2177":{"position":[[0,12]]}}}],["ad",{"_index":22,"t":{"84":{"position":[[0,6]]}}}],["affin",{"_index":207,"t":{"1969":{"position":[[22,8]]}}}],["ansibl",{"_index":33,"t":{"143":{"position":[[0,7]]}}}],["anti",{"_index":206,"t":{"1969":{"position":[[17,4]]}}}],["api",{"_index":69,"t":{"346":{"position":[[58,3]]},"450":{"position":[[16,3]]},"481":{"position":[[8,3]]}}}],["appli",{"_index":142,"t":{"931":{"position":[[0,5]]}}}],["applic",{"_index":58,"t":{"320":{"position":[[0,11]]}}}],["approach",{"_index":222,"t":{"2158":{"position":[[11,8]]}}}],["architectur",{"_index":98,"t":{"513":{"position":[[0,12]]},"1224":{"position":[[0,12]]}}}],["ask",{"_index":101,"t":{"517":{"position":[[11,5]]}}}],["avail",{"_index":210,"t":{"2005":{"position":[[33,12]]}}}],["az",{"_index":93,"t":{"501":{"position":[[6,2]]}}}],["base",{"_index":221,"t":{"2158":{"position":[[5,5]]}}}],["blog",{"_index":1,"t":{"2":{"position":[[6,4]]}}}],["bootstrap",{"_index":131,"t":{"762":{"position":[[0,9]]}}}],["box",{"_index":133,"t":{"826":{"position":[[11,3]]}}}],["branch",{"_index":35,"t":{"163":{"position":[[0,6]]}}}],["ca",{"_index":84,"t":{"475":{"position":[[7,2]]}}}],["calendar",{"_index":4,"t":{"12":{"position":[[0,8]]}}}],["capi",{"_index":80,"t":{"469":{"position":[[26,4]]}}}],["ceph",{"_index":114,"t":{"651":{"position":[[0,4]]},"870":{"position":[[0,4]]},"934":{"position":[[0,4]]},"1190":{"position":[[0,4]]}}}],["certif",{"_index":38,"t":{"165":{"position":[[10,11]]},"751":{"position":[[12,12]]},"1533":{"position":[[0,13]]}}}],["certifi",{"_index":168,"t":{"1519":{"position":[[0,9]]},"1540":{"position":[[11,9]]}}}],["cheatsheet",{"_index":143,"t":{"934":{"position":[[16,10]]}}}],["checklist",{"_index":47,"t":{"190":{"position":[[19,9]]}}}],["ci",{"_index":151,"t":{"1127":{"position":[[5,2]]},"1164":{"position":[[5,2]]}}}],["ciab",{"_index":134,"t":{"826":{"position":[[17,4]]}}}],["cinder",{"_index":146,"t":{"1045":{"position":[[0,6]]}}}],["class",{"_index":195,"t":{"1574":{"position":[[31,5]]},"1939":{"position":[[25,5]]}}}],["cloud",{"_index":7,"t":{"15":{"position":[[21,5]]},"501":{"position":[[19,5]]},"826":{"position":[[0,5]]},"1519":{"position":[[10,6]]},"1578":{"position":[[10,5]]},"1620":{"position":[[10,5]]}}}],["cluster",{"_index":68,"t":{"346":{"position":[[50,7]]},"450":{"position":[[8,7]]},"469":{"position":[[0,7]]},"479":{"position":[[13,7]]},"492":{"position":[[14,8]]},"1982":{"position":[[25,7]]}}}],["clusterclass",{"_index":91,"t":{"494":{"position":[[13,12]]}}}],["collabor",{"_index":19,"t":{"57":{"position":[[0,13]]}}}],["common",{"_index":113,"t":{"649":{"position":[[0,7]]}}}],["compon",{"_index":158,"t":{"1265":{"position":[[0,9]]},"1267":{"position":[[0,10]]}}}],["comput",{"_index":153,"t":{"1251":{"position":[[0,7]]}}}],["config",{"_index":119,"t":{"686":{"position":[[4,6]]}}}],["configur",{"_index":73,"t":{"410":{"position":[[0,13]]},"471":{"position":[[19,13]]},"648":{"position":[[0,13]]},"705":{"position":[[0,13]]},"1291":{"position":[[9,13]]},"2037":{"position":[[15,13]]}}}],["connect",{"_index":52,"t":{"244":{"position":[[32,7]]}}}],["consensu",{"_index":160,"t":{"1279":{"position":[[11,10]]}}}],["consider",{"_index":43,"t":{"172":{"position":[[8,14]]}}}],["consol",{"_index":144,"t":{"1019":{"position":[[0,7]]}}}],["contain",{"_index":54,"t":{"291":{"position":[[0,9]]},"471":{"position":[[0,9]]},"1954":{"position":[[17,9]]}}}],["container",{"_index":103,"t":{"552":{"position":[[0,16]]}}}],["continu",{"_index":63,"t":{"332":{"position":[[0,10]]}}}],["contributor",{"_index":148,"t":{"1095":{"position":[[0,11]]}}}],["control",{"_index":136,"t":{"857":{"position":[[31,7]]}}}],["creat",{"_index":85,"t":{"479":{"position":[[0,6]]},"2086":{"position":[[12,6]]}}}],["credenti",{"_index":59,"t":{"320":{"position":[[12,11]]}}}],["custom",{"_index":83,"t":{"475":{"position":[[0,6]]},"2069":{"position":[[60,9]]}}}],["data",{"_index":223,"t":{"2158":{"position":[[40,4]]},"2194":{"position":[[28,4]]}}}],["databas",{"_index":218,"t":{"2129":{"position":[[11,8]]}}}],["day",{"_index":108,"t":{"616":{"position":[[0,3]]},"1048":{"position":[[0,3]]}}}],["decis",{"_index":203,"t":{"1924":{"position":[[0,9]]},"2086":{"position":[[19,8]]},"2097":{"position":[[20,8]]},"2148":{"position":[[37,8]]}}}],["default",{"_index":194,"t":{"1574":{"position":[[15,7]]},"1939":{"position":[[9,7]]}}}],["demonstr",{"_index":14,"t":{"41":{"position":[[23,12]]}}}],["deploy",{"_index":129,"t":{"757":{"position":[[0,6]]}}}],["develop",{"_index":6,"t":{"15":{"position":[[9,11]]},"165":{"position":[[0,9]]},"236":{"position":[[22,10]]},"1097":{"position":[[0,9]]}}}],["distribut",{"_index":209,"t":{"2005":{"position":[[16,12]]}}}],["doc",{"_index":23,"t":{"84":{"position":[[7,4]]},"1548":{"position":[[16,4]]},"1613":{"position":[[11,4]]}}}],["docker",{"_index":152,"t":{"1206":{"position":[[0,6]]}}}],["document",{"_index":25,"t":{"97":{"position":[[0,13]]},"101":{"position":[[0,13]]},"236":{"position":[[0,13]]},"1259":{"position":[[13,13]]},"1655":{"position":[[4,13]]}}}],["domain",{"_index":211,"t":{"2037":{"position":[[0,6]]}}}],["domains/groups/roles/project",{"_index":212,"t":{"2069":{"position":[[11,28]]}}}],["entropi",{"_index":179,"t":{"1554":{"position":[[10,7]]},"1819":{"position":[[4,7]]}}}],["environ",{"_index":94,"t":{"501":{"position":[[25,12]]}}}],["exampl",{"_index":130,"t":{"761":{"position":[[0,8]]}}}],["explan",{"_index":27,"t":{"97":{"position":[[23,11]]}}}],["exposit",{"_index":226,"t":{"2194":{"position":[[0,10]]}}}],["externaltrafficpolici",{"_index":61,"t":{"322":{"position":[[13,22]]}}}],["feder",{"_index":49,"t":{"238":{"position":[[9,10]]},"244":{"position":[[10,10]]},"1259":{"position":[[52,10]]},"1566":{"position":[[23,10]]},"2020":{"position":[[30,10]]}}}],["file",{"_index":28,"t":{"101":{"position":[[14,5]]}}}],["first",{"_index":0,"t":{"2":{"position":[[0,5]]}}}],["flavor",{"_index":106,"t":{"604":{"position":[[0,6]]},"1049":{"position":[[0,6]]},"1558":{"position":[[10,6]]},"1560":{"position":[[19,7]]},"1676":{"position":[[4,6]]},"1713":{"position":[[4,6]]},"1758":{"position":[[4,6]]},"1838":{"position":[[13,7]]},"1884":{"position":[[4,7]]}}}],["frequent",{"_index":100,"t":{"517":{"position":[[0,10]]}}}],["gaia",{"_index":12,"t":{"41":{"position":[[16,4]]}}}],["gateway",{"_index":87,"t":{"481":{"position":[[0,7]]}}}],["get",{"_index":9,"t":{"33":{"position":[[0,7]]},"41":{"position":[[0,7]]},"49":{"position":[[0,7]]}}}],["global",{"_index":171,"t":{"1544":{"position":[[0,6]]}}}],["glossari",{"_index":105,"t":{"558":{"position":[[0,8]]}}}],["gnocchi",{"_index":217,"t":{"2129":{"position":[[0,7]]}}}],["guid",{"_index":24,"t":{"84":{"position":[[12,5]]},"117":{"position":[[8,5]]},"143":{"position":[[14,5]]},"305":{"position":[[11,5]]},"346":{"position":[[32,5]]},"450":{"position":[[37,5]]},"509":{"position":[[0,5]]},"647":{"position":[[0,6]]},"648":{"position":[[14,5]]},"757":{"position":[[7,5]]},"924":{"position":[[11,5]]},"1094":{"position":[[6,6]]},"1095":{"position":[[12,5]]},"1097":{"position":[[10,5]]},"1131":{"position":[[6,5]]},"1162":{"position":[[16,5]]},"1188":{"position":[[8,5]]},"1281":{"position":[[0,5]]}}}],["hackathon",{"_index":45,"t":{"190":{"position":[[0,9]]}}}],["harbor",{"_index":88,"t":{"483":{"position":[[0,6]]}}}],["hardwar",{"_index":97,"t":{"511":{"position":[[0,8]]}}}],["horizon",{"_index":124,"t":{"730":{"position":[[0,7]]}}}],["iaa",{"_index":177,"t":{"1552":{"position":[[0,4]]},"2194":{"position":[[14,4]]}}}],["iam",{"_index":186,"t":{"1564":{"position":[[0,3]]}}}],["ident",{"_index":48,"t":{"238":{"position":[[0,8]]},"1566":{"position":[[14,8]]},"2020":{"position":[[21,8]]}}}],["imag",{"_index":111,"t":{"617":{"position":[[0,5]]},"1060":{"position":[[0,5]]},"1556":{"position":[[10,5]]},"1562":{"position":[[19,6]]},"1799":{"position":[[4,5]]},"1860":{"position":[[13,6]]}}}],["implement",{"_index":219,"t":{"2148":{"position":[[22,14]]}}}],["infrastructur",{"_index":139,"t":{"874":{"position":[[0,14]]},"1192":{"position":[[0,14]]}}}],["ingress",{"_index":60,"t":{"322":{"position":[[0,7]]}}}],["instal",{"_index":31,"t":{"123":{"position":[[0,12]]}}}],["integr",{"_index":64,"t":{"332":{"position":[[11,11]]}}}],["introduct",{"_index":53,"t":{"258":{"position":[[0,12]]},"291":{"position":[[16,12]]},"1515":{"position":[[0,12]]}}}],["inventori",{"_index":122,"t":{"696":{"position":[[0,9]]}}}],["jitsi",{"_index":18,"t":{"56":{"position":[[0,5]]}}}],["json",{"_index":197,"t":{"1576":{"position":[[19,4]]},"2194":{"position":[[36,4]]}}}],["k8",{"_index":67,"t":{"346":{"position":[[46,3]]},"450":{"position":[[4,3]]},"1570":{"position":[[10,3]]},"1902":{"position":[[4,3]]},"1913":{"position":[[4,3]]}}}],["kaa",{"_index":189,"t":{"1568":{"position":[[0,4]]},"1574":{"position":[[10,4]]},"1939":{"position":[[4,4]]}}}],["keycloak",{"_index":156,"t":{"1259":{"position":[[31,8],[43,8]]}}}],["keyston",{"_index":126,"t":{"747":{"position":[[0,8]]},"2037":{"position":[[33,8]]}}}],["knowledg",{"_index":99,"t":{"515":{"position":[[0,9]]},"1253":{"position":[[0,9]]}}}],["kubernet",{"_index":202,"t":{"1902":{"position":[[31,10]]},"1969":{"position":[[0,10]]},"2005":{"position":[[0,10]]}}}],["layer",{"_index":55,"t":{"291":{"position":[[10,5]]}}}],["level",{"_index":159,"t":{"1279":{"position":[[0,7]]}}}],["licens",{"_index":40,"t":{"165":{"position":[[34,8]]},"172":{"position":[[0,7]]}}}],["lint",{"_index":30,"t":{"117":{"position":[[0,7]]}}}],["local",{"_index":62,"t":{"322":{"position":[[36,5]]}}}],["log",{"_index":140,"t":{"888":{"position":[[0,7]]},"1029":{"position":[[0,7]]},"1210":{"position":[[0,7]]}}}],["mailinglist",{"_index":20,"t":{"79":{"position":[[0,12]]}}}],["mainten",{"_index":65,"t":{"346":{"position":[[0,11]]}}}],["makefil",{"_index":71,"t":{"359":{"position":[[0,8]]}}}],["manag",{"_index":79,"t":{"469":{"position":[[8,10],[31,10]]},"492":{"position":[[0,8]]},"604":{"position":[[7,7]]},"615":{"position":[[8,7]]},"617":{"position":[[6,7]]},"642":{"position":[[8,7]]},"643":{"position":[[9,7]]},"733":{"position":[[0,7]]},"764":{"position":[[0,7]]},"857":{"position":[[16,10]]},"923":{"position":[[0,7]]},"1049":{"position":[[7,7]]},"1060":{"position":[[6,7]]},"1085":{"position":[[9,7]]},"1089":{"position":[[8,7]]},"1090":{"position":[[8,7]]},"1182":{"position":[[0,7]]},"1217":{"position":[[0,7]]},"2037":{"position":[[7,7]]}}}],["mani",{"_index":89,"t":{"492":{"position":[[9,4]]}}}],["matrix",{"_index":21,"t":{"80":{"position":[[0,6]]}}}],["metadata",{"_index":181,"t":{"1556":{"position":[[16,8]]},"1799":{"position":[[10,8]]}}}],["meter",{"_index":161,"t":{"1291":{"position":[[0,8]]},"1576":{"position":[[10,8]]},"2129":{"position":[[24,8]]},"2194":{"position":[[19,8]]}}}],["migrat",{"_index":90,"t":{"494":{"position":[[0,9]]}}}],["monitor",{"_index":141,"t":{"888":{"position":[[10,10]]},"1210":{"position":[[10,10]]}}}],["multi",{"_index":92,"t":{"501":{"position":[[0,5],[13,5]]}}}],["name",{"_index":183,"t":{"1558":{"position":[[17,6]]},"1676":{"position":[[11,6]]},"1713":{"position":[[11,6]]},"1758":{"position":[[11,6]]},"2069":{"position":[[0,6]]}}}],["network",{"_index":115,"t":{"662":{"position":[[0,7]]},"896":{"position":[[0,7]]},"1219":{"position":[[0,7]]},"1257":{"position":[[0,7]]}}}],["new",{"_index":86,"t":{"479":{"position":[[9,3]]},"1570":{"position":[[14,3]]},"1902":{"position":[[27,3]]},"2069":{"position":[[56,3]]}}}],["node",{"_index":81,"t":{"469":{"position":[[42,4]]},"857":{"position":[[45,5]]},"1969":{"position":[[11,5]]},"2005":{"position":[[11,4]]}}}],["note",{"_index":162,"t":{"1303":{"position":[[8,5]]},"1323":{"position":[[8,5]]},"1360":{"position":[[8,5]]},"1392":{"position":[[8,5]]},"1426":{"position":[[8,5]]},"1459":{"position":[[8,5]]},"1497":{"position":[[8,5]]}}}],["octavia",{"_index":147,"t":{"1091":{"position":[[0,7]]}}}],["onboard",{"_index":213,"t":{"2069":{"position":[[45,10]]}}}],["op",{"_index":192,"t":{"1572":{"position":[[0,3]]}}}],["openapi",{"_index":216,"t":{"2097":{"position":[[12,7]]}}}],["openid",{"_index":51,"t":{"244":{"position":[[25,6]]}}}],["openstack",{"_index":11,"t":{"33":{"position":[[21,9]]},"244":{"position":[[0,9]]},"742":{"position":[[0,9]]},"901":{"position":[[0,9]]},"1044":{"position":[[0,9]]},"1185":{"position":[[0,9]]},"1226":{"position":[[0,9]]}}}],["oper",{"_index":110,"t":{"616":{"position":[[6,10]]},"924":{"position":[[0,10]]},"934":{"position":[[5,10]]},"1048":{"position":[[6,10]]}}}],["org",{"_index":174,"t":{"1548":{"position":[[10,3]]}}}],["organis",{"_index":199,"t":{"1613":{"position":[[20,12]]}}}],["origin",{"_index":39,"t":{"165":{"position":[[25,6]]}}}],["overview",{"_index":3,"t":{"4":{"position":[[0,8]]},"421":{"position":[[0,8]]},"505":{"position":[[0,8]]},"554":{"position":[[0,8]]},"1263":{"position":[[0,8]]},"1265":{"position":[[10,8]]},"1269":{"position":[[0,8]]},"1283":{"position":[[0,8]]},"1285":{"position":[[0,8]]},"1287":{"position":[[0,8]]},"1289":{"position":[[0,8]]},"1321":{"position":[[0,8]]},"2211":{"position":[[0,8]]}}}],["packag",{"_index":116,"t":{"673":{"position":[[0,8]]}}}],["page",{"_index":215,"t":{"2086":{"position":[[7,4]]},"2097":{"position":[[7,4]]},"2148":{"position":[[7,4]]}}}],["plan",{"_index":46,"t":{"190":{"position":[[10,8]]}}}],["plane",{"_index":137,"t":{"857":{"position":[[39,5]]}}}],["plusserv",{"_index":16,"t":{"41":{"position":[[38,10]]}}}],["polici",{"_index":191,"t":{"1570":{"position":[[26,6]]},"1902":{"position":[[16,6]]},"1913":{"position":[[16,6]]}}}],["post",{"_index":2,"t":{"2":{"position":[[11,4]]}}}],["project",{"_index":107,"t":{"615":{"position":[[0,7]]},"1089":{"position":[[0,7]]}}}],["properti",{"_index":200,"t":{"1838":{"position":[[25,10]]}}}],["propos",{"_index":155,"t":{"1259":{"position":[[0,8]]}}}],["protect",{"_index":36,"t":{"163":{"position":[[7,10]]}}}],["provid",{"_index":70,"t":{"346":{"position":[[62,8]]},"450":{"position":[[20,8]]},"2158":{"position":[[24,9]]}}}],["provis",{"_index":135,"t":{"857":{"position":[[0,12]]}}}],["proxi",{"_index":125,"t":{"740":{"position":[[0,5]]}}}],["push",{"_index":220,"t":{"2158":{"position":[[0,4]]}}}],["question",{"_index":102,"t":{"517":{"position":[[17,9]]}}}],["quickstart",{"_index":75,"t":{"433":{"position":[[0,10]]}}}],["refer",{"_index":72,"t":{"359":{"position":[[9,9]]},"2148":{"position":[[12,9]]}}}],["registri",{"_index":82,"t":{"471":{"position":[[10,8]]},"1954":{"position":[[27,8]]}}}],["releas",{"_index":150,"t":{"1110":{"position":[[0,8]]},"1303":{"position":[[0,7],[22,7]]},"1323":{"position":[[0,7],[22,7]]},"1360":{"position":[[0,7],[22,7]]},"1392":{"position":[[0,7],[22,7]]},"1426":{"position":[[0,7],[22,7]]},"1459":{"position":[[0,7],[22,7]]},"1497":{"position":[[0,7],[22,7]]}}}],["repositori",{"_index":123,"t":{"705":{"position":[[14,10]]}}}],["requir",{"_index":74,"t":{"423":{"position":[[0,12]]},"507":{"position":[[9,12]]},"511":{"position":[[9,12]]},"1954":{"position":[[0,12]]},"1982":{"position":[[0,12]]},"2020":{"position":[[0,12]]}}}],["resourc",{"_index":8,"t":{"15":{"position":[[27,9]]},"643":{"position":[[0,8]]},"1085":{"position":[[0,8]]}}}],["roadmap",{"_index":76,"t":{"445":{"position":[[0,7]]}}}],["rule",{"_index":37,"t":{"163":{"position":[[18,5]]}}}],["sandbox",{"_index":112,"t":{"642":{"position":[[0,7]]},"1090":{"position":[[0,7]]}}}],["sc",{"_index":44,"t":{"172":{"position":[[27,3]]},"236":{"position":[[18,3]]},"238":{"position":[[23,3]]},"346":{"position":[[42,3]]},"450":{"position":[[0,3]]},"1303":{"position":[[18,3]]},"1323":{"position":[[18,3]]},"1360":{"position":[[18,3]]},"1392":{"position":[[18,3]]},"1426":{"position":[[18,3]]},"1459":{"position":[[18,3]]},"1497":{"position":[[18,3]]},"1546":{"position":[[0,3],[10,3]]},"1548":{"position":[[0,3]]},"1550":{"position":[[0,3]]},"1554":{"position":[[0,3]]},"1556":{"position":[[0,3]]},"1558":{"position":[[0,3]]},"1560":{"position":[[0,3]]},"1562":{"position":[[0,3]]},"1566":{"position":[[0,3]]},"1570":{"position":[[0,3]]},"1574":{"position":[[0,3]]},"1576":{"position":[[0,3]]},"1655":{"position":[[0,3]]},"1676":{"position":[[0,3]]},"1713":{"position":[[0,3]]},"1758":{"position":[[0,3]]},"1799":{"position":[[0,3]]},"1819":{"position":[[0,3]]},"1838":{"position":[[0,3]]},"1860":{"position":[[0,3]]},"1902":{"position":[[0,3]]},"1913":{"position":[[0,3]]},"1939":{"position":[[0,3]]}}}],["scope",{"_index":169,"t":{"1542":{"position":[[0,6]]}}}],["script",{"_index":149,"t":{"1102":{"position":[[0,7]]}}}],["seed",{"_index":138,"t":{"864":{"position":[[0,4]]}}}],["self",{"_index":127,"t":{"751":{"position":[[0,4]]}}}],["servic",{"_index":117,"t":{"680":{"position":[[0,8]]},"755":{"position":[[0,8]]},"861":{"position":[[0,8]]}}}],["sign",{"_index":128,"t":{"751":{"position":[[5,6]]}}}],["softwar",{"_index":95,"t":{"507":{"position":[[0,8]]}}}],["sovereign",{"_index":198,"t":{"1578":{"position":[[0,9]]},"1620":{"position":[[0,9]]}}}],["ssd",{"_index":201,"t":{"1884":{"position":[[0,3]]}}}],["ssh",{"_index":118,"t":{"686":{"position":[[0,3]]}}}],["sso",{"_index":188,"t":{"1566":{"position":[[10,3]]},"2020":{"position":[[17,3]]}}}],["stack",{"_index":208,"t":{"1982":{"position":[[33,6]]}}}],["standard",{"_index":167,"t":{"1517":{"position":[[0,9]]},"1544":{"position":[[7,9]]},"1546":{"position":[[14,9]]},"1548":{"position":[[21,9]]},"1550":{"position":[[15,9]]},"1552":{"position":[[5,9]]},"1560":{"position":[[10,8]]},"1562":{"position":[[10,8]]},"1564":{"position":[[4,9]]},"1568":{"position":[[5,9]]},"1572":{"position":[[4,9]]},"1578":{"position":[[16,9]]},"1613":{"position":[[0,10]]},"1620":{"position":[[16,9]]},"1676":{"position":[[18,8]]},"1713":{"position":[[18,8]]},"1758":{"position":[[18,8]]},"1799":{"position":[[19,8]]},"1838":{"position":[[4,8]]},"1860":{"position":[[4,8]]},"1924":{"position":[[30,8]]}}}],["start",{"_index":10,"t":{"33":{"position":[[8,7]]},"41":{"position":[[8,7]]},"49":{"position":[[8,7]]}}}],["statu",{"_index":214,"t":{"2086":{"position":[[0,6]]},"2097":{"position":[[0,6]]},"2148":{"position":[[0,6]]}}}],["storag",{"_index":154,"t":{"1255":{"position":[[0,7]]},"1574":{"position":[[23,7]]},"1939":{"position":[[17,7]]}}}],["structur",{"_index":29,"t":{"101":{"position":[[20,9]]},"1655":{"position":[[18,9]]}}}],["style",{"_index":34,"t":{"143":{"position":[[8,5]]},"1131":{"position":[[0,5]]}}}],["styleguid",{"_index":32,"t":{"136":{"position":[[0,10]]}}}],["sysctl",{"_index":120,"t":{"692":{"position":[[0,6]]}}}],["task",{"_index":145,"t":{"1039":{"position":[[0,4]]}}}],["test",{"_index":5,"t":{"15":{"position":[[0,4]]},"503":{"position":[[0,7]]},"1982":{"position":[[17,7]]}}}],["testb",{"_index":132,"t":{"774":{"position":[[0,7]]}}}],["timezon",{"_index":121,"t":{"694":{"position":[[0,8]]}}}],["tip",{"_index":41,"t":{"169":{"position":[[0,4]]}}}],["title_",{"_index":225,"t":{"2177":{"position":[[13,6]]}}}],["trick",{"_index":42,"t":{"169":{"position":[[9,6]]}}}],["troubleshoot",{"_index":66,"t":{"346":{"position":[[16,15]]},"1162":{"position":[[0,15]]}}}],["type",{"_index":205,"t":{"1924":{"position":[[25,4]]}}}],["upgrad",{"_index":78,"t":{"450":{"position":[[29,7]]},"1188":{"position":[[0,7]]}}}],["usag",{"_index":77,"t":{"448":{"position":[[0,5]]},"2158":{"position":[[34,5]]}}}],["user",{"_index":57,"t":{"305":{"position":[[5,5]]}}}],["version",{"_index":170,"t":{"1542":{"position":[[11,8]]},"1570":{"position":[[18,7]]},"1902":{"position":[[8,7],[42,8]]},"1913":{"position":[[8,7]]}}}],["via",{"_index":50,"t":{"244":{"position":[[21,3]]}}}],["virtual",{"_index":104,"t":{"556":{"position":[[0,14]]}}}],["volum",{"_index":204,"t":{"1924":{"position":[[18,6]]}}}],["wavestack",{"_index":17,"t":{"49":{"position":[[21,9]]}}}],["websso",{"_index":157,"t":{"1259":{"position":[[63,8]]}}}],["workflow",{"_index":26,"t":{"97":{"position":[[14,8]]}}}],["x",{"_index":13,"t":{"41":{"position":[[21,1]]},"1497":{"position":[[30,1]]}}}],["yaml",{"_index":176,"t":{"1550":{"position":[[10,4]]},"1620":{"position":[[26,4]]}}}],["zuul",{"_index":56,"t":{"305":{"position":[[0,4]]},"1127":{"position":[[0,4]]},"1164":{"position":[[0,4]]}}}]],"pipeline":["stemmer"]}},{"documents":[{"i":5,"t":"Welcome to our SCS Community","u":"/community/","h":"#welcome-to-our-scs-community","p":4},{"i":6,"t":"Contribute to Sovereign Cloud Stack","u":"/community/","h":"#contribute-to-sovereign-cloud-stack","p":4},{"i":8,"t":"We're chatty","u":"/community/","h":"#were-chatty","p":4},{"i":10,"t":"We're on GitHub","u":"/community/","h":"#were-on-github","p":4},{"i":13,"t":"We’re an open community","u":"/community/calendar","h":"#were-an-open-community","p":12},{"i":17,"t":"How to request cloud resources","u":"/community/cloud-resources/","h":"#how-to-request-cloud-resources","p":15},{"i":19,"t":"plusserver","u":"/community/cloud-resources/","h":"#plusserver","p":15},{"i":20,"t":"Usage","u":"/community/cloud-resources/","h":"#usage","p":15},{"i":22,"t":"Users","u":"/community/cloud-resources/","h":"#users","p":15},{"i":24,"t":"Service Users","u":"/community/cloud-resources/","h":"#service-users","p":15},{"i":26,"t":"Projects","u":"/community/cloud-resources/","h":"#projects","p":15},{"i":28,"t":"Wavecon","u":"/community/cloud-resources/","h":"#wavecon","p":15},{"i":29,"t":"Service Users","u":"/community/cloud-resources/","h":"#service-users-1","p":15},{"i":31,"t":"Projects","u":"/community/cloud-resources/","h":"#projects-1","p":15},{"i":34,"t":"Getting Started with OpenStack CLI","u":"/community/cloud-resources/getting-started-openstack","h":"#getting-started-with-openstack-cli","p":33},{"i":35,"t":"OpenStackClient (CLI)","u":"/community/cloud-resources/getting-started-openstack","h":"#openstackclient-cli","p":33},{"i":37,"t":"Object Storage (S3)","u":"/community/cloud-resources/getting-started-openstack","h":"#object-storage-s3","p":33},{"i":39,"t":"References","u":"/community/cloud-resources/getting-started-openstack","h":"#references","p":33},{"i":42,"t":"Getting Started for the Gaia-X Demonstrator @ plusserver","u":"/community/cloud-resources/plusserver-gx-scs","h":"#getting-started-for-the-gaia-x-demonstrator--plusserver","p":41},{"i":43,"t":"URLs for access","u":"/community/cloud-resources/plusserver-gx-scs","h":"#urls-for-access","p":41},{"i":45,"t":"Authentication (UI)","u":"/community/cloud-resources/plusserver-gx-scs","h":"#authentication-ui","p":41},{"i":47,"t":"Getting Started with OpenStack","u":"/community/cloud-resources/plusserver-gx-scs","h":"#getting-started-with-openstack","p":41},{"i":50,"t":"URLs for access","u":"/community/cloud-resources/wavestack","h":"#urls-for-access","p":49},{"i":52,"t":"Authentication (UI)","u":"/community/cloud-resources/wavestack","h":"#authentication-ui","p":49},{"i":54,"t":"OpenStackClient (CLI)","u":"/community/cloud-resources/wavestack","h":"#openstackclient-cli","p":49},{"i":58,"t":"Collaborating with issues and pull requests","u":"/community/collaboration","h":"#collaborating-with-issues-and-pull-requests","p":57},{"i":60,"t":"Meetings","u":"/community/collaboration","h":"#meetings","p":57},{"i":61,"t":"Project updates","u":"/community/collaboration","h":"#project-updates","p":57},{"i":63,"t":"Sprint review/Backlog refinement/Sprint planning meetings","u":"/community/collaboration","h":"#sprint-reviewbacklog-refinementsprint-planning-meetings","p":57},{"i":65,"t":"Special interest groups (SIGs)","u":"/community/collaboration","h":"#special-interest-groups-sigs","p":57},{"i":67,"t":"Videoconference","u":"/community/collaboration","h":"#videoconference","p":57},{"i":69,"t":"Usage","u":"/community/collaboration","h":"#usage","p":57},{"i":71,"t":"Nextcloud","u":"/community/collaboration","h":"#nextcloud","p":57},{"i":73,"t":"Zuul CI/CD pipelines and project gating","u":"/community/collaboration","h":"#zuul-cicd-pipelines-and-project-gating","p":57},{"i":75,"t":"How to make a repo use Zuul","u":"/community/collaboration","h":"#how-to-make-a-repo-use-zuul","p":57},{"i":77,"t":"General information about Zuul","u":"/community/collaboration","h":"#general-information-about-zuul","p":57},{"i":82,"t":"Client and Registration","u":"/community/communication/matrix","h":"#client-and-registration","p":80},{"i":86,"t":"Step 1 – Documentation type","u":"/community/contribute/adding-docs-guide","h":"#step-1--documentation-type","p":84},{"i":88,"t":"1. Technical Documentation","u":"/community/contribute/adding-docs-guide","h":"#1-technical-documentation","p":84},{"i":89,"t":"Step 1 – Checklist","u":"/community/contribute/adding-docs-guide","h":"#step-1--checklist","p":84},{"i":91,"t":"Step 2 – Adding your repo to the docs.json","u":"/community/contribute/adding-docs-guide","h":"#step-2--adding-your-repo-to-the-docsjson","p":84},{"i":93,"t":"2. Operational documentation","u":"/community/contribute/adding-docs-guide","h":"#2-operational-documentation","p":84},{"i":95,"t":"3. Community documentation","u":"/community/contribute/adding-docs-guide","h":"#3-community-documentation","p":84},{"i":99,"t":"Information Architecture","u":"/community/contribute/docs-workflow-explanation","h":"#information-architecture","p":97},{"i":102,"t":"Structure Best Practice","u":"/community/contribute/doc-files-structure-guide","h":"#structure-best-practice","p":101},{"i":103,"t":"Overview - mandatory","u":"/community/contribute/doc-files-structure-guide","h":"#overview---mandatory","p":101},{"i":105,"t":"Requirements - mandatory","u":"/community/contribute/doc-files-structure-guide","h":"#requirements---mandatory","p":101},{"i":107,"t":"Quickstart - optional. If it is possible, then mandatory","u":"/community/contribute/doc-files-structure-guide","h":"#quickstart---optional-if-it-is-possible-then-mandatory","p":101},{"i":109,"t":"Getting Started - mandatory","u":"/community/contribute/doc-files-structure-guide","h":"#getting-started---mandatory","p":101},{"i":111,"t":"Configuration – mandatory","u":"/community/contribute/doc-files-structure-guide","h":"#configuration--mandatory","p":101},{"i":113,"t":"Contribute – mandatory","u":"/community/contribute/doc-files-structure-guide","h":"#contribute--mandatory","p":101},{"i":115,"t":"FAQ`s – optional","u":"/community/contribute/doc-files-structure-guide","h":"#faqs--optional","p":101},{"i":119,"t":"Pre Commit","u":"/community/contribute/linting-guide","h":"#pre-commit","p":117},{"i":121,"t":"Github Workflows","u":"/community/contribute/linting-guide","h":"#github-workflows","p":117},{"i":125,"t":"Requirements","u":"/community/contribute/local-docusaurus-development-guide","h":"#requirements","p":123},{"i":127,"t":"Installation Guide","u":"/community/contribute/local-docusaurus-development-guide","h":"#installation-guide","p":123},{"i":128,"t":"Step 1 – Installing Node.js via nvm","u":"/community/contribute/local-docusaurus-development-guide","h":"#step-1--installing-nodejs-via-nvm","p":123},{"i":130,"t":"Step 2 – Cloning the repository","u":"/community/contribute/local-docusaurus-development-guide","h":"#step-2-cloning-the-repository","p":123},{"i":132,"t":"Step 3 – Installing dependencies","u":"/community/contribute/local-docusaurus-development-guide","h":"#step-3--installing-dependencies","p":123},{"i":134,"t":"Step 4 – Starting the development server","u":"/community/contribute/local-docusaurus-development-guide","h":"#step-4--starting-the-development-server","p":123},{"i":137,"t":"Admonitions","u":"/community/contribute/styleguide","h":"#admonitions","p":136},{"i":139,"t":"Blockquotes","u":"/community/contribute/styleguide","h":"#blockquotes","p":136},{"i":141,"t":"Codeblocks","u":"/community/contribute/styleguide","h":"#codeblocks","p":136},{"i":145,"t":"Task naming","u":"/community/contribute/styleguides/ansible_styleguide","h":"#task-naming","p":143},{"i":147,"t":"Key Order","u":"/community/contribute/styleguides/ansible_styleguide","h":"#key-order","p":143},{"i":149,"t":"Positioning and use of the become directive","u":"/community/contribute/styleguides/ansible_styleguide","h":"#positioning-and-use-of-the-become-directive","p":143},{"i":151,"t":"Position of the when condition","u":"/community/contribute/styleguides/ansible_styleguide","h":"#position-of-the-when-condition","p":143},{"i":153,"t":"Usage of collections","u":"/community/contribute/styleguides/ansible_styleguide","h":"#usage-of-collections","p":143},{"i":155,"t":"Usage of roles from other collections","u":"/community/contribute/styleguides/ansible_styleguide","h":"#usage-of-roles-from-other-collections","p":143},{"i":157,"t":"Parameters that offer lists","u":"/community/contribute/styleguides/ansible_styleguide","h":"#parameters-that-offer-lists","p":143},{"i":159,"t":"Usage of changed_when","u":"/community/contribute/styleguides/ansible_styleguide","h":"#usage-of-changed_when","p":143},{"i":161,"t":"Disable linting rules","u":"/community/contribute/styleguides/ansible_styleguide","h":"#disable-linting-rules","p":143},{"i":167,"t":"Further reading","u":"/community/github/dco-and-licenses","h":"#further-reading","p":165},{"i":170,"t":"Octo Reminder - your friendly assistant","u":"/community/github/tips-and-tricks","h":"#octo-reminder---your-friendly-assistant","p":169},{"i":174,"t":"Reciprocity","u":"/community/license-considerations","h":"#reciprocity","p":172},{"i":176,"t":"Controversy","u":"/community/license-considerations","h":"#controversy","p":172},{"i":178,"t":"Affero","u":"/community/license-considerations","h":"#affero","p":172},{"i":180,"t":"Derived works and Strong vs. Weak Copyleft","u":"/community/license-considerations","h":"#derived-works-and-strong-vs-weak-copyleft","p":172},{"i":182,"t":"Patents","u":"/community/license-considerations","h":"#patents","p":172},{"i":184,"t":"Copyright Assignments and Contributor License Agreements","u":"/community/license-considerations","h":"#copyright-assignments-and-contributor-license-agreements","p":172},{"i":186,"t":"License in = License out","u":"/community/license-considerations","h":"#license-in--license-out","p":172},{"i":188,"t":"Further reading","u":"/community/license-considerations","h":"#further-reading","p":172},{"i":192,"t":"Checklist 6 months before Hackathon","u":"/community/hackathons/checklist","h":"#checklist-6-months-before-hackathon","p":190},{"i":194,"t":"Checklist advertising","u":"/community/hackathons/checklist","h":"#checklist-advertising","p":190},{"i":196,"t":"Checklist 5 months before Hackathon","u":"/community/hackathons/checklist","h":"#checklist-5-months-before-hackathon","p":190},{"i":198,"t":"Checklist hotel","u":"/community/hackathons/checklist","h":"#checklist-hotel","p":190},{"i":199,"t":"Iportant things","u":"/community/hackathons/checklist","h":"#iportant-things","p":190},{"i":201,"t":"Nice-to-have things","u":"/community/hackathons/checklist","h":"#nice-to-have-things","p":190},{"i":203,"t":"Checklist 4 months before Hackathon","u":"/community/hackathons/checklist","h":"#checklist-4-months-before-hackathon","p":190},{"i":205,"t":"Checklist for evening before location","u":"/community/hackathons/checklist","h":"#checklist-for-evening-before-location","p":190},{"i":207,"t":"Checklist rooms 1","u":"/community/hackathons/checklist","h":"#checklist-rooms-1","p":190},{"i":209,"t":"Checklist merch (examples)","u":"/community/hackathons/checklist","h":"#checklist-merch-examples","p":190},{"i":211,"t":"Checklist 3 months before Hackathon","u":"/community/hackathons/checklist","h":"#checklist-3-months-before-hackathon","p":190},{"i":213,"t":"Checklist evening event","u":"/community/hackathons/checklist","h":"#checklist-evening-event","p":190},{"i":215,"t":"Checklist 2 months before Hackathon","u":"/community/hackathons/checklist","h":"#checklist-2-months-before-hackathon","p":190},{"i":217,"t":"Snacks checklist","u":"/community/hackathons/checklist","h":"#snacks-checklist","p":190},{"i":218,"t":"Breakfast examples","u":"/community/hackathons/checklist","h":"#breakfast-examples","p":190},{"i":220,"t":"Snack exemples","u":"/community/hackathons/checklist","h":"#snack-exemples","p":190},{"i":222,"t":"Vegan snack examples","u":"/community/hackathons/checklist","h":"#vegan-snack-examples","p":190},{"i":224,"t":"Checklist rooms 2","u":"/community/hackathons/checklist","h":"#checklist-rooms-2","p":190},{"i":226,"t":"Checklist 1 month before Hackathon","u":"/community/hackathons/checklist","h":"#checklist-1-month-before-hackathon","p":190},{"i":228,"t":"Checklist 1 week before Hackathon","u":"/community/hackathons/checklist","h":"#checklist-1-week-before-hackathon","p":190},{"i":230,"t":"Checklist one day before Hackathon","u":"/community/hackathons/checklist","h":"#checklist-one-day-before-hackathon","p":190},{"i":232,"t":"Checklist Hackathon Day X","u":"/community/hackathons/checklist","h":"#checklist-hackathon-day-x","p":190},{"i":234,"t":"Checklist after Hackathon","u":"/community/hackathons/checklist","h":"#checklist-after-hackathon","p":190},{"i":240,"t":"1. IaaS / OpenStack","u":"/dev-docs/operations/iam/identity-federation-in-scs","h":"#1-iaas--openstack","p":238},{"i":242,"t":"2. CaaS","u":"/dev-docs/operations/iam/identity-federation-in-scs","h":"#2-caas","p":238},{"i":246,"t":"1. Keystone","u":"/dev-docs/operations/iam/openstack-federation-via-oidc","h":"#1-keystone","p":244},{"i":248,"t":"1.1 Keycloak IdP realm discovery","u":"/dev-docs/operations/iam/openstack-federation-via-oidc","h":"#11-keycloak-idp-realm-discovery","p":244},{"i":250,"t":"1.2 Keystone mapping of token claims","u":"/dev-docs/operations/iam/openstack-federation-via-oidc","h":"#12-keystone-mapping-of-token-claims","p":244},{"i":252,"t":"1.3 Horizon WebSSO for federated users","u":"/dev-docs/operations/iam/openstack-federation-via-oidc","h":"#13-horizon-websso-for-federated-users","p":244},{"i":254,"t":"1.4 OpenStack CLI and API access for federated users","u":"/dev-docs/operations/iam/openstack-federation-via-oidc","h":"#14-openstack-cli-and-api-access-for-federated-users","p":244},{"i":256,"t":"1.5 SSO Federation between to SCS deployments","u":"/dev-docs/operations/iam/openstack-federation-via-oidc","h":"#15-sso-federation-between-to-scs-deployments","p":244},{"i":259,"t":"About","u":"/docs/","h":"#about","p":258},{"i":261,"t":"What is SCS? Why should I care?","u":"/docs/","h":"#what-is-scs-why-should-i-care","p":258},{"i":263,"t":"The reference implementation","u":"/docs/","h":"#the-reference-implementation","p":258},{"i":264,"t":"Get it and test it: Testbed","u":"/docs/","h":"#get-it-and-test-it-testbed","p":258},{"i":266,"t":"Existing SCS Clouds","u":"/docs/","h":"#existing-scs-clouds","p":258},{"i":268,"t":"Development of SCS","u":"/docs/","h":"#development-of-scs","p":258},{"i":270,"t":"Releases and Roadmap","u":"/docs/","h":"#releases-and-roadmap","p":258},{"i":271,"t":"Release 0 (2021-07-15)","u":"/docs/","h":"#release-0-2021-07-15","p":258},{"i":273,"t":"Release 1 (2021-09-29)","u":"/docs/","h":"#release-1-2021-09-29","p":258},{"i":275,"t":"Release 2 (2022-03-23)","u":"/docs/","h":"#release-2-2022-03-23","p":258},{"i":277,"t":"Release 3 (2022-09-21)","u":"/docs/","h":"#release-3-2022-09-21","p":258},{"i":279,"t":"Release 4 (2023-03-22)","u":"/docs/","h":"#release-4-2023-03-22","p":258},{"i":281,"t":"Roadmap","u":"/docs/","h":"#roadmap","p":258},{"i":283,"t":"Contribute and Connect","u":"/docs/","h":"#contribute-and-connect","p":258},{"i":285,"t":"Standards, Conformity and Certification","u":"/docs/","h":"#standards-conformity-and-certification","p":258},{"i":287,"t":"Issues and bugs","u":"/docs/","h":"#issues-and-bugs","p":258},{"i":289,"t":"Other resources","u":"/docs/","h":"#other-resources","p":258},{"i":293,"t":"Target groups","u":"/docs/container/","h":"#target-groups","p":291},{"i":295,"t":"What is it not","u":"/docs/container/","h":"#what-is-it-not","p":291},{"i":297,"t":"Prerequisites and Requirements","u":"/docs/container/","h":"#prerequisites-and-requirements","p":291},{"i":299,"t":"Features","u":"/docs/container/","h":"#features","p":291},{"i":301,"t":"Limitations","u":"/docs/container/","h":"#limitations","p":291},{"i":303,"t":"Current state and future Outlook","u":"/docs/container/","h":"#current-state-and-future-outlook","p":291},{"i":306,"t":"Prerequisites","u":"/dev-docs/operations/operations/zuul-ci-cd-quickstart-user-guide","h":"#prerequisites","p":305},{"i":308,"t":"Who is it for?","u":"/dev-docs/operations/operations/zuul-ci-cd-quickstart-user-guide","h":"#who-is-it-for","p":305},{"i":310,"t":"Where do I start?","u":"/dev-docs/operations/operations/zuul-ci-cd-quickstart-user-guide","h":"#where-do-i-start","p":305},{"i":312,"t":"Where to save the Zuul relevant data?","u":"/dev-docs/operations/operations/zuul-ci-cd-quickstart-user-guide","h":"#where-to-save-the-zuul-relevant-data","p":305},{"i":314,"t":"Projects","u":"/dev-docs/operations/operations/zuul-ci-cd-quickstart-user-guide","h":"#projects","p":305},{"i":316,"t":"Pipelines","u":"/dev-docs/operations/operations/zuul-ci-cd-quickstart-user-guide","h":"#pipelines","p":305},{"i":318,"t":"Jobs","u":"/dev-docs/operations/operations/zuul-ci-cd-quickstart-user-guide","h":"#jobs","p":305},{"i":324,"t":"Getting it to work for managed ingress","u":"/docs/container/components/k8s-cluster-api-provider/doc/LoadBalancer-ExtTrafficLocal","h":"","p":322},{"i":326,"t":"Getting it to work in general","u":"/docs/container/components/k8s-cluster-api-provider/doc/LoadBalancer-ExtTrafficLocal","h":"","p":322},{"i":328,"t":"OVN provider LoadBalancer","u":"/docs/container/components/k8s-cluster-api-provider/doc/LoadBalancer-ExtTrafficLocal","h":"","p":322},{"i":330,"t":"Disabled health-monitor by default","u":"/docs/container/components/k8s-cluster-api-provider/doc/LoadBalancer-ExtTrafficLocal","h":"","p":322},{"i":334,"t":"Configuration","u":"/docs/container/components/k8s-cluster-api-provider/doc/continuous-integration","h":"#configuration","p":332},{"i":336,"t":"Pipelines","u":"/docs/container/components/k8s-cluster-api-provider/doc/continuous-integration","h":"#pipelines","p":332},{"i":338,"t":"Jobs","u":"/docs/container/components/k8s-cluster-api-provider/doc/continuous-integration","h":"#jobs","p":332},{"i":340,"t":"Secrets","u":"/docs/container/components/k8s-cluster-api-provider/doc/continuous-integration","h":"#secrets","p":332},{"i":342,"t":"Job customization","u":"/docs/container/components/k8s-cluster-api-provider/doc/continuous-integration","h":"#job-customization","p":332},{"i":344,"t":"FAQ","u":"/docs/container/components/k8s-cluster-api-provider/doc/continuous-integration","h":"#faq","p":332},{"i":347,"t":"Client Certificates in Kubernetes expire after one year.","u":"/docs/container/components/k8s-cluster-api-provider/doc/Maintenance_and_Troubleshooting","h":"#client-certificates-in-kubernetes-expire-after-one-year","p":346},{"i":349,"t":"Certificate Authority expires","u":"/docs/container/components/k8s-cluster-api-provider/doc/Maintenance_and_Troubleshooting","h":"#certificate-authority-expires","p":346},{"i":351,"t":"Failed cluster deployment debugging","u":"/docs/container/components/k8s-cluster-api-provider/doc/Maintenance_and_Troubleshooting","h":"#failed-cluster-deployment-debugging","p":346},{"i":353,"t":"Cluster state","u":"/docs/container/components/k8s-cluster-api-provider/doc/Maintenance_and_Troubleshooting","h":"#cluster-state","p":346},{"i":355,"t":"Etcd maintenance","u":"/docs/container/components/k8s-cluster-api-provider/doc/Maintenance_and_Troubleshooting","h":"#etcd-maintenance","p":346},{"i":357,"t":"Defragmentation and backup","u":"/docs/container/components/k8s-cluster-api-provider/doc/Maintenance_and_Troubleshooting","h":"#defragmentation-and-backup","p":346},{"i":361,"t":"General commands","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#general-commands","p":359},{"i":362,"t":"make create","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-create","p":359},{"i":364,"t":"make get-kubeconfig","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-get-kubeconfig","p":359},{"i":366,"t":"make ssh","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-ssh","p":359},{"i":368,"t":"make openstack","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-openstack","p":359},{"i":370,"t":"make k9s","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-k9s","p":359},{"i":372,"t":"make log","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-log","p":359},{"i":374,"t":"make console","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-console","p":359},{"i":376,"t":"Teardown","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#teardown","p":359},{"i":378,"t":"Make clean","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-clean","p":359},{"i":380,"t":"Make fullclean","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-fullclean","p":359},{"i":382,"t":"Make purge","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-purge","p":359},{"i":384,"t":"Testing commands","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#testing-commands","p":359},{"i":385,"t":"make check","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-check","p":359},{"i":387,"t":"make check-quick","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-check-quick","p":359},{"i":389,"t":"make check-conformance","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-check-conformance","p":359},{"i":391,"t":"make check-storage","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-check-storage","p":359},{"i":393,"t":"make check-csi","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-check-csi","p":359},{"i":395,"t":"Terraform commands","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#terraform-commands","p":359},{"i":396,"t":"make init","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-init","p":359},{"i":398,"t":"make attach","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-attach","p":359},{"i":400,"t":"make detach","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-detach","p":359},{"i":402,"t":"make state-push","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-state-push","p":359},{"i":404,"t":"make dry-run","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-dry-run","p":359},{"i":406,"t":"make show","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-show","p":359},{"i":408,"t":"make list","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-list","p":359},{"i":411,"t":"Supported k8s versions","u":"/docs/container/components/k8s-cluster-api-provider/doc/configuration","h":"#supported-k8s-versions","p":410},{"i":413,"t":"Overview over the parameters in clusterctl.yaml and environment-XXX.tfvars","u":"/docs/container/components/k8s-cluster-api-provider/doc/configuration","h":"#overview-over-the-parameters-in-clusterctlyaml-and-environment-xxxtfvars","p":410},{"i":415,"t":"Parameters CAPI management server","u":"/docs/container/components/k8s-cluster-api-provider/doc/configuration","h":"#parameters-capi-management-server","p":410},{"i":417,"t":"Common parameters management server and clusters","u":"/docs/container/components/k8s-cluster-api-provider/doc/configuration","h":"#common-parameters-management-server-and-clusters","p":410},{"i":419,"t":"Parameters clusters","u":"/docs/container/components/k8s-cluster-api-provider/doc/configuration","h":"#parameters-clusters","p":410},{"i":425,"t":"Environments","u":"/docs/container/components/k8s-cluster-api-provider/doc/requirements","h":"#environments","p":423},{"i":427,"t":"Plusserver community environment","u":"/docs/container/components/k8s-cluster-api-provider/doc/requirements","h":"#plusserver-community-environment","p":423},{"i":429,"t":"Wavestack environment","u":"/docs/container/components/k8s-cluster-api-provider/doc/requirements","h":"#wavestack-environment","p":423},{"i":431,"t":"Custom environment","u":"/docs/container/components/k8s-cluster-api-provider/doc/requirements","h":"#custom-environment","p":423},{"i":435,"t":"Requirements","u":"/docs/container/components/k8s-cluster-api-provider/doc/quickstart","h":"#requirements","p":433},{"i":437,"t":"Prepare the environment","u":"/docs/container/components/k8s-cluster-api-provider/doc/quickstart","h":"#prepare-the-environment","p":433},{"i":439,"t":"Create a test cluster","u":"/docs/container/components/k8s-cluster-api-provider/doc/quickstart","h":"#create-a-test-cluster","p":433},{"i":441,"t":"Teardown","u":"/docs/container/components/k8s-cluster-api-provider/doc/quickstart","h":"#teardown","p":433},{"i":443,"t":"Beyond quickstart","u":"/docs/container/components/k8s-cluster-api-provider/doc/quickstart","h":"#beyond-quickstart","p":433},{"i":446,"t":"Advanced cluster templating with helm (Technical Preview)","u":"/docs/container/components/k8s-cluster-api-provider/doc/roadmap","h":"#advanced-cluster-templating-with-helm-technical-preview","p":445},{"i":452,"t":"Management host (cluster) vs. Workload clusters","u":"/docs/container/components/k8s-cluster-api-provider/doc/Upgrade-Guide","h":"#management-host-cluster-vs-workload-clusters","p":450},{"i":454,"t":"Updating the management host","u":"/docs/container/components/k8s-cluster-api-provider/doc/Upgrade-Guide","h":"#updating-the-management-host","p":450},{"i":456,"t":"In-place upgrade","u":"/docs/container/components/k8s-cluster-api-provider/doc/Upgrade-Guide","h":"#in-place-upgrade","p":450},{"i":458,"t":"The clusterctl move approach","u":"/docs/container/components/k8s-cluster-api-provider/doc/Upgrade-Guide","h":"#the-clusterctl-move-approach","p":450},{"i":460,"t":"Updating workload clusters","u":"/docs/container/components/k8s-cluster-api-provider/doc/Upgrade-Guide","h":"#updating-workload-clusters","p":450},{"i":461,"t":"k8s version upgrade","u":"/docs/container/components/k8s-cluster-api-provider/doc/Upgrade-Guide","h":"#k8s-version-upgrade","p":450},{"i":463,"t":"New versions for mandatory components","u":"/docs/container/components/k8s-cluster-api-provider/doc/Upgrade-Guide","h":"#new-versions-for-mandatory-components","p":450},{"i":465,"t":"New versions for optional components","u":"/docs/container/components/k8s-cluster-api-provider/doc/Upgrade-Guide","h":"#new-versions-for-optional-components","p":450},{"i":467,"t":"etcd leader changes","u":"/docs/container/components/k8s-cluster-api-provider/doc/Upgrade-Guide","h":"#etcd-leader-changes","p":450},{"i":473,"t":"Tutorial: configure an existing cluster to use containerd registry configuration","u":"/docs/container/components/k8s-cluster-api-provider/doc/usage/containter-registry-configuration","h":"#tutorial-configure-an-existing-cluster-to-use-containerd-registry-configuration","p":471},{"i":477,"t":"Rotation","u":"/docs/container/components/k8s-cluster-api-provider/doc/usage/custom-ca","h":"#rotation","p":475},{"i":485,"t":"Default deployment","u":"/docs/container/components/k8s-cluster-api-provider/doc/usage/harbor","h":"#default-deployment","p":483},{"i":487,"t":"Configuration options","u":"/docs/container/components/k8s-cluster-api-provider/doc/usage/harbor","h":"#configuration-options","p":483},{"i":488,"t":"Persistence","u":"/docs/container/components/k8s-cluster-api-provider/doc/usage/harbor","h":"#persistence","p":483},{"i":490,"t":"Ingress and TLS","u":"/docs/container/components/k8s-cluster-api-provider/doc/usage/harbor","h":"#ingress-and-tls","p":483},{"i":496,"t":"Migration","u":"/docs/container/components/k8s-cluster-api-provider/doc/usage/migrate-to-cluster-class","h":"#migration","p":494},{"i":497,"t":"Prerequisites","u":"/docs/container/components/k8s-cluster-api-provider/doc/usage/migrate-to-cluster-class","h":"#prerequisites","p":494},{"i":499,"t":"Steps","u":"/docs/container/components/k8s-cluster-api-provider/doc/usage/migrate-to-cluster-class","h":"#steps","p":494},{"i":518,"t":"What does SCS stand for?","u":"/docs/faq/","h":"#what-does-scs-stand-for","p":517},{"i":520,"t":"Who is SCS intended for?","u":"/docs/faq/","h":"#who-is-scs-intended-for","p":517},{"i":522,"t":"Who or what is behind SCS?","u":"/docs/faq/","h":"#who-or-what-is-behind-scs","p":517},{"i":524,"t":"Why is there a need for a standardized cloud environment?","u":"/docs/faq/","h":"#why-is-there-a-need-for-a-standardized-cloud-environment","p":517},{"i":526,"t":"Where can I find the SCS standards?","u":"/docs/faq/","h":"#where-can-i-find-the-scs-standards","p":517},{"i":528,"t":"How is the SCS different from other cloud environments (e.g. AWS, Azure,...)?","u":"/docs/faq/","h":"#how-is-the-scs-different-from-other-cloud-environments-eg-aws-azure","p":517},{"i":530,"t":"My company already has a cloud environment. Can we still use the SCS?","u":"/docs/faq/","h":"#my-company-already-has-a-cloud-environment-can-we-still-use-the-scs","p":517},{"i":532,"t":"What does reference implementation mean?","u":"/docs/faq/","h":"#what-does-reference-implementation-mean","p":517},{"i":534,"t":"Do I need to use the reference implementation to be SCS compliant?","u":"/docs/faq/","h":"#do-i-need-to-use-the-reference-implementation-to-be-scs-compliant","p":517},{"i":536,"t":"Do I have to use all layers of the reference implementation (IaaS, CaaS)?","u":"/docs/faq/","h":"#do-i-have-to-use-all-layers-of-the-reference-implementation-iaas-caas","p":517},{"i":538,"t":"What does IaaS mean?","u":"/docs/faq/","h":"#what-does-iaas-mean","p":517},{"i":540,"t":"How is the IaaS layer structured?","u":"/docs/faq/","h":"#how-is-the-iaas-layer-structured","p":517},{"i":542,"t":"What does CaaS mean? (Container Layer)","u":"/docs/faq/","h":"#what-does-caas-mean-container-layer","p":517},{"i":544,"t":"I want to try out the SCS! Where do I start?","u":"/docs/faq/","h":"#i-want-to-try-out-the-scs-where-do-i-start","p":517},{"i":546,"t":"I want to use an SCS Cloud! How do I get started?","u":"/docs/faq/","h":"#i-want-to-use-an-scs-cloud-how-do-i-get-started","p":517},{"i":548,"t":"I want to use the SCS in my company and build my own cloud! Where do I start?","u":"/docs/faq/","h":"#i-want-to-use-the-scs-in-my-company-and-build-my-own-cloud-where-do-i-start","p":517},{"i":550,"t":"I have a technical problem. Where can I find help?","u":"/docs/faq/","h":"#i-have-a-technical-problem-where-can-i-find-help","p":517},{"i":560,"t":"Definition of a Region","u":"/docs/glossary","h":"#definition-of-a-region","p":558},{"i":562,"t":"Definition of a Availability Zone","u":"/docs/glossary","h":"#definition-of-a-availability-zone","p":558},{"i":564,"t":"Definition of Host Aggregates","u":"/docs/glossary","h":"#definition-of-host-aggregates","p":558},{"i":566,"t":"Definition of a Cell","u":"/docs/glossary","h":"#definition-of-a-cell","p":558},{"i":568,"t":"Definition of a Control Plane","u":"/docs/glossary","h":"#definition-of-a-control-plane","p":558},{"i":570,"t":"Definition of Control Node","u":"/docs/glossary","h":"#definition-of-control-node","p":558},{"i":572,"t":"Definition of Compute Node","u":"/docs/glossary","h":"#definition-of-compute-node","p":558},{"i":574,"t":"Definition of Manager Node","u":"/docs/glossary","h":"#definition-of-manager-node","p":558},{"i":576,"t":"Definition of provider network","u":"/docs/glossary","h":"#definition-of-provider-network","p":558},{"i":578,"t":"Definition of API","u":"/docs/glossary","h":"#definition-of-api","p":558},{"i":580,"t":"Horizon","u":"/docs/glossary","h":"#horizon","p":558},{"i":582,"t":"Message Queue","u":"/docs/glossary","h":"#message-queue","p":558},{"i":584,"t":"Keystone","u":"/docs/glossary","h":"#keystone","p":558},{"i":586,"t":"Glance","u":"/docs/glossary","h":"#glance","p":558},{"i":588,"t":"OSISM","u":"/docs/glossary","h":"#osism","p":558},{"i":590,"t":"Ceph","u":"/docs/glossary","h":"#ceph","p":558},{"i":592,"t":"Nova","u":"/docs/glossary","h":"#nova","p":558},{"i":594,"t":"Neutron","u":"/docs/glossary","h":"#neutron","p":558},{"i":596,"t":"Cinder","u":"/docs/glossary","h":"#cinder","p":558},{"i":598,"t":"Swift","u":"/docs/glossary","h":"#swift","p":558},{"i":600,"t":"Ceph OSD","u":"/docs/glossary","h":"#ceph-osd","p":558},{"i":602,"t":"Personas","u":"/docs/glossary","h":"#personas","p":558},{"i":605,"t":"Overview","u":"/docs/iaas/components/flavor-manager","h":"#overview","p":604},{"i":607,"t":"Installation","u":"/docs/iaas/components/flavor-manager","h":"#installation","p":604},{"i":609,"t":"Usage","u":"/docs/iaas/components/flavor-manager","h":"#usage","p":604},{"i":611,"t":"Definitions","u":"/docs/iaas/components/flavor-manager","h":"#definitions","p":604},{"i":613,"t":"Name parser and generator","u":"/docs/iaas/components/flavor-manager","h":"#name-parser-and-generator","p":604},{"i":619,"t":"Requirements","u":"/docs/iaas/components/image-manager","h":"#requirements","p":617},{"i":621,"t":"OpenStack Image Service (Glance)","u":"/docs/iaas/components/image-manager","h":"#openstack-image-service-glance","p":617},{"i":623,"t":"Object storage backend","u":"/docs/iaas/components/image-manager","h":"#object-storage-backend","p":617},{"i":625,"t":"Getting started","u":"/docs/iaas/components/image-manager","h":"#getting-started","p":617},{"i":627,"t":"Image definitions","u":"/docs/iaas/components/image-manager","h":"#image-definitions","p":617},{"i":629,"t":"SCS image standard","u":"/docs/iaas/components/image-manager","h":"#scs-image-standard","p":617},{"i":631,"t":"Image with regular rebuilds","u":"/docs/iaas/components/image-manager","h":"#image-with-regular-rebuilds","p":617},{"i":633,"t":"Image without regular rebuild","u":"/docs/iaas/components/image-manager","h":"#image-without-regular-rebuild","p":617},{"i":635,"t":"Other properties","u":"/docs/iaas/components/image-manager","h":"#other-properties","p":617},{"i":637,"t":"Usage","u":"/docs/iaas/components/image-manager","h":"#usage","p":617},{"i":638,"t":"Mirroring images","u":"/docs/iaas/components/image-manager","h":"#mirroring-images","p":617},{"i":640,"t":"Updating images","u":"/docs/iaas/components/image-manager","h":"#updating-images","p":617},{"i":644,"t":"Octavia","u":"/docs/iaas/components/resource-manager","h":"#octavia","p":643},{"i":645,"t":"Amphora rotation","u":"/docs/iaas/components/resource-manager","h":"#amphora-rotation","p":643},{"i":652,"t":"Unique Identifier","u":"/docs/iaas/guides/configuration-guide/ceph","h":"#unique-identifier","p":651},{"i":654,"t":"Client","u":"/docs/iaas/guides/configuration-guide/ceph","h":"#client","p":651},{"i":656,"t":"Swappiness","u":"/docs/iaas/guides/configuration-guide/ceph","h":"#swappiness","p":651},{"i":658,"t":"RGW service","u":"/docs/iaas/guides/configuration-guide/ceph","h":"#rgw-service","p":651},{"i":660,"t":"Extra pools","u":"/docs/iaas/guides/configuration-guide/ceph","h":"#extra-pools","p":651},{"i":664,"t":"Netplan","u":"/docs/iaas/guides/configuration-guide/commons/network","h":"#netplan","p":662},{"i":666,"t":"Example","u":"/docs/iaas/guides/configuration-guide/commons/network","h":"#example","p":662},{"i":668,"t":"Dispatcher scripts","u":"/docs/iaas/guides/configuration-guide/commons/network","h":"#dispatcher-scripts","p":662},{"i":669,"t":"Dummy interfaces","u":"/docs/iaas/guides/configuration-guide/commons/network","h":"#dummy-interfaces","p":662},{"i":671,"t":"/etc/interfaces","u":"/docs/iaas/guides/configuration-guide/commons/network","h":"#etcinterfaces","p":662},{"i":675,"t":"Distribution specific packages","u":"/docs/iaas/guides/configuration-guide/commons/packages","h":"#distribution-specific-packages","p":673},{"i":676,"t":"Debian","u":"/docs/iaas/guides/configuration-guide/commons/packages","h":"#debian","p":673},{"i":678,"t":"Upgrade of packages","u":"/docs/iaas/guides/configuration-guide/commons/packages","h":"#upgrade-of-packages","p":673},{"i":682,"t":"Start and enable required services","u":"/docs/iaas/guides/configuration-guide/commons/services","h":"#start-and-enable-required-services","p":680},{"i":684,"t":"Note on services that should be deactivated","u":"/docs/iaas/guides/configuration-guide/commons/services","h":"#note-on-services-that-should-be-deactivated","p":680},{"i":688,"t":"Example","u":"/docs/iaas/guides/configuration-guide/commons/sshconfig","h":"#example","p":686},{"i":690,"t":"Defaults","u":"/docs/iaas/guides/configuration-guide/commons/sshconfig","h":"#defaults","p":686},{"i":698,"t":"Manager","u":"/docs/iaas/guides/configuration-guide/inventory","h":"#manager","p":696},{"i":700,"t":"Reconciler","u":"/docs/iaas/guides/configuration-guide/inventory","h":"#reconciler","p":696},{"i":701,"t":"Host Vars","u":"/docs/iaas/guides/configuration-guide/inventory","h":"#host-vars","p":696},{"i":702,"t":"Group Vars","u":"/docs/iaas/guides/configuration-guide/inventory","h":"#group-vars","p":696},{"i":703,"t":"Define variable for all nodes","u":"/docs/iaas/guides/configuration-guide/inventory","h":"#define-variable-for-all-nodes","p":696},{"i":707,"t":"Configuration repository layout","u":"/docs/iaas/guides/configuration-guide/configuration-repository","h":"#configuration-repository-layout","p":705},{"i":709,"t":"Creating a new configuration repository","u":"/docs/iaas/guides/configuration-guide/configuration-repository","h":"#creating-a-new-configuration-repository","p":705},{"i":711,"t":"Git repository","u":"/docs/iaas/guides/configuration-guide/configuration-repository","h":"#git-repository","p":705},{"i":713,"t":"Creation","u":"/docs/iaas/guides/configuration-guide/configuration-repository","h":"#creation","p":705},{"i":715,"t":"Use of latest","u":"/docs/iaas/guides/configuration-guide/configuration-repository","h":"#use-of-latest","p":705},{"i":717,"t":"Make commit","u":"/docs/iaas/guides/configuration-guide/configuration-repository","h":"#make-commit","p":705},{"i":719,"t":"Post-processing","u":"/docs/iaas/guides/configuration-guide/configuration-repository","h":"#post-processing","p":705},{"i":721,"t":"Notes","u":"/docs/iaas/guides/configuration-guide/configuration-repository","h":"#notes","p":705},{"i":723,"t":"Parameters","u":"/docs/iaas/guides/configuration-guide/configuration-repository","h":"#parameters","p":705},{"i":725,"t":"Preparing a new configuration repository","u":"/docs/iaas/guides/configuration-guide/configuration-repository","h":"#preparing-a-new-configuration-repository","p":705},{"i":726,"t":"Manager environment","u":"/docs/iaas/guides/configuration-guide/configuration-repository","h":"#manager-environment","p":705},{"i":728,"t":"Inventory","u":"/docs/iaas/guides/configuration-guide/configuration-repository","h":"#inventory","p":705},{"i":731,"t":"Problems uploading machine images larger than 1 GiB","u":"/docs/iaas/guides/configuration-guide/openstack/horizon","h":"#problems-uploading-machine-images-larger-than-1-gib","p":730},{"i":734,"t":"Stable release","u":"/docs/iaas/guides/configuration-guide/manager","h":"#stable-release","p":733},{"i":736,"t":"OpenSearch integration","u":"/docs/iaas/guides/configuration-guide/manager","h":"#opensearch-integration","p":733},{"i":738,"t":"OpenStack broker integration","u":"/docs/iaas/guides/configuration-guide/manager","h":"#openstack-broker-integration","p":733},{"i":743,"t":"Network interfaces","u":"/docs/iaas/guides/configuration-guide/openstack/","h":"#network-interfaces","p":742},{"i":745,"t":"How does the configuration get into services?","u":"/docs/iaas/guides/configuration-guide/openstack/","h":"#how-does-the-configuration-get-into-services","p":742},{"i":748,"t":"Domain manager role","u":"/docs/iaas/guides/configuration-guide/openstack/keystone","h":"#domain-manager-role","p":747},{"i":750,"t":"OIDC Federation","u":"/docs/iaas/guides/configuration-guide/openstack/keystone","h":"#oidc-federation","p":747},{"i":752,"t":"OpenStack","u":"/docs/iaas/guides/configuration-guide/self-signed-certificates","h":"#openstack","p":751},{"i":753,"t":"Horizon","u":"/docs/iaas/guides/configuration-guide/self-signed-certificates","h":"#horizon","p":751},{"i":759,"t":"Getting started","u":"/docs/iaas/guides/deploy-guide/","h":"#getting-started","p":757},{"i":766,"t":"Create operator user","u":"/docs/iaas/guides/deploy-guide/manager","h":"#create-operator-user","p":764},{"i":768,"t":"Apply the network configuration","u":"/docs/iaas/guides/deploy-guide/manager","h":"#apply-the-network-configuration","p":764},{"i":770,"t":"Bootstrap","u":"/docs/iaas/guides/deploy-guide/manager","h":"#bootstrap","p":764},{"i":772,"t":"Deploy","u":"/docs/iaas/guides/deploy-guide/manager","h":"#deploy","p":764},{"i":776,"t":"Requirements","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#requirements","p":774},{"i":777,"t":"Cloud access","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#cloud-access","p":774},{"i":779,"t":"Cloud resources","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#cloud-resources","p":774},{"i":781,"t":"Preparations","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#preparations","p":774},{"i":782,"t":"Software","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#software","p":774},{"i":784,"t":"Custom CA","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#custom-ca","p":774},{"i":786,"t":"Getting Started","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#getting-started","p":774},{"i":788,"t":"Configuration","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#configuration","p":774},{"i":790,"t":"Variables","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#variables","p":774},{"i":792,"t":"Overrides","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#overrides","p":774},{"i":794,"t":"Customisations","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#customisations","p":774},{"i":796,"t":"Usage","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#usage","p":774},{"i":797,"t":"VPN access","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#vpn-access","p":774},{"i":799,"t":"Webinterfaces","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#webinterfaces","p":774},{"i":801,"t":"Authentication with OIDC","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#authentication-with-oidc","p":774},{"i":803,"t":"Advanced Usage","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#advanced-usage","p":774},{"i":804,"t":"Change versions","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#change-versions","p":774},{"i":806,"t":"Deploy services","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#deploy-services","p":774},{"i":808,"t":"Upgrade services","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#upgrade-services","p":774},{"i":810,"t":"Troubleshooting","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#troubleshooting","p":774},{"i":811,"t":"Unsupported locale setting","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#unsupported-locale-setting","p":774},{"i":813,"t":"yq: No such file or directory","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#yq-no-such-file-or-directory","p":774},{"i":815,"t":"Notes","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#notes","p":774},{"i":817,"t":"Appendix","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#appendix","p":774},{"i":818,"t":"Supported releases","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#supported-releases","p":774},{"i":820,"t":"Included services","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#included-services","p":774},{"i":822,"t":"Makfile reference","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#makfile-reference","p":774},{"i":824,"t":"CI jobs","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#ci-jobs","p":774},{"i":828,"t":"Requirements","u":"/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box","h":"#requirements","p":826},{"i":830,"t":"Types","u":"/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box","h":"#types","p":826},{"i":832,"t":"Installation","u":"/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box","h":"#installation","p":826},{"i":833,"t":"Automated installation (recommended)","u":"/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box","h":"#automated-installation-recommended","p":826},{"i":835,"t":"Manual installation","u":"/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box","h":"#manual-installation","p":826},{"i":837,"t":"Usage","u":"/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box","h":"#usage","p":826},{"i":838,"t":"Wireguard VPN service access","u":"/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box","h":"#wireguard-vpn-service-access","p":826},{"i":840,"t":"Webinterfaces","u":"/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box","h":"#webinterfaces","p":826},{"i":842,"t":"Command-line interfaces","u":"/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box","h":"#command-line-interfaces","p":826},{"i":844,"t":"Import of additional images","u":"/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box","h":"#import-of-additional-images","p":826},{"i":846,"t":"Upgrade","u":"/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box","h":"#upgrade","p":826},{"i":848,"t":"Customisations","u":"/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box","h":"#customisations","p":826},{"i":849,"t":"Use of 2nd NIC for external network","u":"/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box","h":"#use-of-2nd-nic-for-external-network","p":826},{"i":851,"t":"Running on a Virtual Machine","u":"/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box","h":"#running-on-a-virtual-machine","p":826},{"i":853,"t":"Troubleshooting","u":"/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box","h":"#troubleshooting","p":826},{"i":855,"t":"Development","u":"/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box","h":"#development","p":826},{"i":859,"t":"Manual provisioning","u":"/docs/iaas/guides/deploy-guide/provisioning","h":"#manual-provisioning","p":857},{"i":862,"t":"Getting started","u":"/docs/iaas/guides/deploy-guide/services/","h":"#getting-started","p":861},{"i":866,"t":"Install required packages","u":"/docs/iaas/guides/deploy-guide/seed","h":"#install-required-packages","p":864},{"i":868,"t":"Get a copy of the configuration repository","u":"/docs/iaas/guides/deploy-guide/seed","h":"#get-a-copy-of-the-configuration-repository","p":864},{"i":872,"t":"RGW service","u":"/docs/iaas/guides/deploy-guide/services/ceph","h":"#rgw-service","p":870},{"i":876,"t":"Cron, Fluentd & Kolla Toolbox","u":"/docs/iaas/guides/deploy-guide/services/infrastructure","h":"#cron-fluentd--kolla-toolbox","p":874},{"i":878,"t":"Loadbalancer","u":"/docs/iaas/guides/deploy-guide/services/infrastructure","h":"#loadbalancer","p":874},{"i":880,"t":"Redis","u":"/docs/iaas/guides/deploy-guide/services/infrastructure","h":"#redis","p":874},{"i":882,"t":"Memcached","u":"/docs/iaas/guides/deploy-guide/services/infrastructure","h":"#memcached","p":874},{"i":884,"t":"RabbitMQ","u":"/docs/iaas/guides/deploy-guide/services/infrastructure","h":"#rabbitmq","p":874},{"i":886,"t":"MariaDB","u":"/docs/iaas/guides/deploy-guide/services/infrastructure","h":"#mariadb","p":874},{"i":890,"t":"OpenSearch","u":"/docs/iaas/guides/deploy-guide/services/logging-monitoring","h":"#opensearch","p":888},{"i":892,"t":"Prometheus","u":"/docs/iaas/guides/deploy-guide/services/logging-monitoring","h":"#prometheus","p":888},{"i":894,"t":"Grafana","u":"/docs/iaas/guides/deploy-guide/services/logging-monitoring","h":"#grafana","p":888},{"i":897,"t":"Open vSwitch","u":"/docs/iaas/guides/deploy-guide/services/network","h":"#open-vswitch","p":896},{"i":899,"t":"OVN (if used)","u":"/docs/iaas/guides/deploy-guide/services/network","h":"#ovn-if-used","p":896},{"i":903,"t":"OpenStack client","u":"/docs/iaas/guides/deploy-guide/services/openstack","h":"#openstack-client","p":901},{"i":905,"t":"Keystone","u":"/docs/iaas/guides/deploy-guide/services/openstack","h":"#keystone","p":901},{"i":907,"t":"Glance","u":"/docs/iaas/guides/deploy-guide/services/openstack","h":"#glance","p":901},{"i":909,"t":"Designate","u":"/docs/iaas/guides/deploy-guide/services/openstack","h":"#designate","p":901},{"i":911,"t":"Placement","u":"/docs/iaas/guides/deploy-guide/services/openstack","h":"#placement","p":901},{"i":913,"t":"Cinder","u":"/docs/iaas/guides/deploy-guide/services/openstack","h":"#cinder","p":901},{"i":915,"t":"Neutron","u":"/docs/iaas/guides/deploy-guide/services/openstack","h":"#neutron","p":901},{"i":917,"t":"Nova","u":"/docs/iaas/guides/deploy-guide/services/openstack","h":"#nova","p":901},{"i":919,"t":"Octavia","u":"/docs/iaas/guides/deploy-guide/services/openstack","h":"#octavia","p":901},{"i":921,"t":"Horizon","u":"/docs/iaas/guides/deploy-guide/services/openstack","h":"#horizon","p":901},{"i":925,"t":"Node states","u":"/docs/iaas/guides/operations-guide/","h":"#node-states","p":924},{"i":927,"t":"Maintenance","u":"/docs/iaas/guides/operations-guide/","h":"#maintenance","p":924},{"i":929,"t":"Bootstrap","u":"/docs/iaas/guides/operations-guide/","h":"#bootstrap","p":924},{"i":932,"t":"List all available plays","u":"/docs/iaas/guides/operations-guide/manager/apply","h":"#list-all-available-plays","p":931},{"i":935,"t":"Where to find docs","u":"/docs/iaas/guides/operations-guide/ceph","h":"#where-to-find-docs","p":934},{"i":937,"t":"Advice on Ceph releases","u":"/docs/iaas/guides/operations-guide/ceph","h":"#advice-on-ceph-releases","p":934},{"i":939,"t":"General maintenance","u":"/docs/iaas/guides/operations-guide/ceph","h":"#general-maintenance","p":934},{"i":940,"t":"60 seconds cluster overview","u":"/docs/iaas/guides/operations-guide/ceph","h":"#60-seconds-cluster-overview","p":934},{"i":942,"t":"Mute/Unmute a health warning","u":"/docs/iaas/guides/operations-guide/ceph","h":"#muteunmute-a-health-warning","p":934},{"i":944,"t":"Disable/Enable (deep-)scrubbing","u":"/docs/iaas/guides/operations-guide/ceph","h":"#disableenable-deep-scrubbing","p":934},{"i":946,"t":"Reboot a single node","u":"/docs/iaas/guides/operations-guide/ceph","h":"#reboot-a-single-node","p":934},{"i":948,"t":"Gathering information about block devices","u":"/docs/iaas/guides/operations-guide/ceph","h":"#gathering-information-about-block-devices","p":934},{"i":949,"t":"Enumerate typical storage devices and LVM","u":"/docs/iaas/guides/operations-guide/ceph","h":"#enumerate-typical-storage-devices-and-lvm","p":934},{"i":951,"t":"SMART data for SATA/SAS and NVME devices","u":"/docs/iaas/guides/operations-guide/ceph","h":"#smart-data-for-satasas-and-nvme-devices","p":934},{"i":953,"t":"Check format of a NVME device","u":"/docs/iaas/guides/operations-guide/ceph","h":"#check-format-of-a-nvme-device","p":934},{"i":955,"t":"Format a NVME device to a different LBA format using nvme-cli","u":"/docs/iaas/guides/operations-guide/ceph","h":"#format-a-nvme-device-to-a-different-lba-format-using-nvme-cli","p":934},{"i":957,"t":"Secure Erase a NVME drive using nvme-cli","u":"/docs/iaas/guides/operations-guide/ceph","h":"#secure-erase-a-nvme-drive-using-nvme-cli","p":934},{"i":959,"t":"Secure Erase a SATA/SAS drive using hdparm","u":"/docs/iaas/guides/operations-guide/ceph","h":"#secure-erase-a-satasas-drive-using-hdparm","p":934},{"i":961,"t":"OSD maintenance tasks","u":"/docs/iaas/guides/operations-guide/ceph","h":"#osd-maintenance-tasks","p":934},{"i":962,"t":"Locate a specific OSD in the cluster","u":"/docs/iaas/guides/operations-guide/ceph","h":"#locate-a-specific-osd-in-the-cluster","p":934},{"i":964,"t":"Get OSD metadata (global and single OSD)","u":"/docs/iaas/guides/operations-guide/ceph","h":"#get-osd-metadata-global-and-single-osd","p":934},{"i":966,"t":"Add a new OSD using ceph-ansible","u":"/docs/iaas/guides/operations-guide/ceph","h":"#add-a-new-osd-using-ceph-ansible","p":934},{"i":967,"t":"Remove a OSD using ceph-ansible","u":"/docs/iaas/guides/operations-guide/ceph","h":"#remove-a-osd-using-ceph-ansible","p":934},{"i":968,"t":"Replace a defect OSD","u":"/docs/iaas/guides/operations-guide/ceph","h":"#replace-a-defect-osd","p":934},{"i":969,"t":"Remove a single OSD node","u":"/docs/iaas/guides/operations-guide/ceph","h":"#remove-a-single-osd-node","p":934},{"i":970,"t":"Remove an OSD (removing it completely, not reprovisioning it again) without double rebalance","u":"/docs/iaas/guides/operations-guide/ceph","h":"#remove-an-osd-removing-it-completely-not-reprovisioning-it-again-without-double-rebalance","p":934},{"i":972,"t":"Remove an OSD (temporarily e.g. when replacing a broken disk)","u":"/docs/iaas/guides/operations-guide/ceph","h":"#remove-an-osd-temporarily-eg-when-replacing-a-broken-disk","p":934},{"i":974,"t":"Disable backfills/recovery completely","u":"/docs/iaas/guides/operations-guide/ceph","h":"#disable-backfillsrecovery-completely","p":934},{"i":976,"t":"Rebalance OSDs","u":"/docs/iaas/guides/operations-guide/ceph","h":"#rebalance-osds","p":934},{"i":977,"t":"Placement Group maintenance","u":"/docs/iaas/guides/operations-guide/ceph","h":"#placement-group-maintenance","p":934},{"i":978,"t":"Dump placement groups","u":"/docs/iaas/guides/operations-guide/ceph","h":"#dump-placement-groups","p":934},{"i":980,"t":"Query a PG about its status","u":"/docs/iaas/guides/operations-guide/ceph","h":"#query-a-pg-about-its-status","p":934},{"i":982,"t":"Start (deep-)scrubbing of a placement group","u":"/docs/iaas/guides/operations-guide/ceph","h":"#start-deep-scrubbing-of-a-placement-group","p":934},{"i":984,"t":"HEALTH_WARN - Large omap objects found...","u":"/docs/iaas/guides/operations-guide/ceph","h":"#health_warn---large-omap-objects-found","p":934},{"i":986,"t":"Instruct a PG to repair in case of scrub errors (inconsistent PG)","u":"/docs/iaas/guides/operations-guide/ceph","h":"#instruct-a-pg-to-repair-in-case-of-scrub-errors-inconsistent-pg","p":934},{"i":988,"t":"RADOS Pool maintenance","u":"/docs/iaas/guides/operations-guide/ceph","h":"#rados-pool-maintenance","p":934},{"i":990,"t":"Get pools and their configuration","u":"/docs/iaas/guides/operations-guide/ceph","h":"#get-pools-and-their-configuration","p":934},{"i":992,"t":"Dump all CRUSH rules","u":"/docs/iaas/guides/operations-guide/ceph","h":"#dump-all-crush-rules","p":934},{"i":994,"t":"Get autoscaler status","u":"/docs/iaas/guides/operations-guide/ceph","h":"#get-autoscaler-status","p":934},{"i":996,"t":"Create a replicated pool","u":"/docs/iaas/guides/operations-guide/ceph","h":"#create-a-replicated-pool","p":934},{"i":998,"t":"Enabling an application on a pool","u":"/docs/iaas/guides/operations-guide/ceph","h":"#enabling-an-application-on-a-pool","p":934},{"i":1000,"t":"Delete a pool","u":"/docs/iaas/guides/operations-guide/ceph","h":"#delete-a-pool","p":934},{"i":1002,"t":"Set number of PGs for a pool","u":"/docs/iaas/guides/operations-guide/ceph","h":"#set-number-of-pgs-for-a-pool","p":934},{"i":1004,"t":"Create CRUSH rules for different storage classes","u":"/docs/iaas/guides/operations-guide/ceph","h":"#create-crush-rules-for-different-storage-classes","p":934},{"i":1006,"t":"Change CRUSH rule for a pool (\"move pool\")","u":"/docs/iaas/guides/operations-guide/ceph","h":"#change-crush-rule-for-a-pool-move-pool","p":934},{"i":1008,"t":"Advanced topics","u":"/docs/iaas/guides/operations-guide/ceph","h":"#advanced-topics","p":934},{"i":1009,"t":"Configure and create LVM devices for ceph-ansible using OSISM","u":"/docs/iaas/guides/operations-guide/ceph","h":"#configure-and-create-lvm-devices-for-ceph-ansible-using-osism","p":934},{"i":1011,"t":"Validating Ceph using OSISM playbooks","u":"/docs/iaas/guides/operations-guide/ceph","h":"#validating-ceph-using-osism-playbooks","p":934},{"i":1013,"t":"Shutdown a Ceph cluster","u":"/docs/iaas/guides/operations-guide/ceph","h":"#shutdown-a-ceph-cluster","p":934},{"i":1015,"t":"Restart a Ceph cluster after manual shutdown","u":"/docs/iaas/guides/operations-guide/ceph","h":"#restart-a-ceph-cluster-after-manual-shutdown","p":934},{"i":1017,"t":"Where and how to get further help","u":"/docs/iaas/guides/operations-guide/ceph","h":"#where-and-how-to-get-further-help","p":934},{"i":1021,"t":"Ansible","u":"/docs/iaas/guides/operations-guide/manager/console","h":"#ansible","p":1019},{"i":1023,"t":"Clush","u":"/docs/iaas/guides/operations-guide/manager/console","h":"#clush","p":1019},{"i":1025,"t":"Container","u":"/docs/iaas/guides/operations-guide/manager/console","h":"#container","p":1019},{"i":1027,"t":"SSH","u":"/docs/iaas/guides/operations-guide/manager/console","h":"#ssh","p":1019},{"i":1030,"t":"Ansible","u":"/docs/iaas/guides/operations-guide/manager/log","h":"#ansible","p":1029},{"i":1031,"t":"Files","u":"/docs/iaas/guides/operations-guide/manager/log","h":"#files","p":1029},{"i":1033,"t":"ARA - ARA Records Ansible","u":"/docs/iaas/guides/operations-guide/manager/log","h":"#ara---ara-records-ansible","p":1029},{"i":1035,"t":"Container","u":"/docs/iaas/guides/operations-guide/manager/log","h":"#container","p":1029},{"i":1037,"t":"OpenSearch","u":"/docs/iaas/guides/operations-guide/manager/log","h":"#opensearch","p":1029},{"i":1040,"t":"List","u":"/docs/iaas/guides/operations-guide/manager/task","h":"#list","p":1039},{"i":1042,"t":"Broker reset","u":"/docs/iaas/guides/operations-guide/manager/task","h":"#broker-reset","p":1039},{"i":1046,"t":"Remove service","u":"/docs/iaas/guides/operations-guide/openstack/cinder","h":"#remove-service","p":1045},{"i":1050,"t":"Overview","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/flavor-manager","h":"#overview","p":1049},{"i":1052,"t":"Installation","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/flavor-manager","h":"#installation","p":1049},{"i":1054,"t":"Usage","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/flavor-manager","h":"#usage","p":1049},{"i":1056,"t":"Definitions","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/flavor-manager","h":"#definitions","p":1049},{"i":1058,"t":"Name parser and generator","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/flavor-manager","h":"#name-parser-and-generator","p":1049},{"i":1062,"t":"Requirements","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/image-manager","h":"#requirements","p":1060},{"i":1064,"t":"OpenStack Image Service (Glance)","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/image-manager","h":"#openstack-image-service-glance","p":1060},{"i":1066,"t":"Object storage backend","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/image-manager","h":"#object-storage-backend","p":1060},{"i":1068,"t":"Getting started","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/image-manager","h":"#getting-started","p":1060},{"i":1070,"t":"Image definitions","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/image-manager","h":"#image-definitions","p":1060},{"i":1072,"t":"SCS image standard","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/image-manager","h":"#scs-image-standard","p":1060},{"i":1074,"t":"Image with regular rebuilds","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/image-manager","h":"#image-with-regular-rebuilds","p":1060},{"i":1076,"t":"Image without regular rebuild","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/image-manager","h":"#image-without-regular-rebuild","p":1060},{"i":1078,"t":"Other properties","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/image-manager","h":"#other-properties","p":1060},{"i":1080,"t":"Usage","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/image-manager","h":"#usage","p":1060},{"i":1081,"t":"Mirroring images","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/image-manager","h":"#mirroring-images","p":1060},{"i":1083,"t":"Updating images","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/image-manager","h":"#updating-images","p":1060},{"i":1086,"t":"Octavia","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/resource-manager","h":"#octavia","p":1085},{"i":1087,"t":"Amphora rotation","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/resource-manager","h":"#amphora-rotation","p":1085},{"i":1092,"t":"Cleanup of amphora missing from the DB","u":"/docs/iaas/guides/operations-guide/openstack/octavia","h":"#cleanup-of-amphora-missing-from-the-db","p":1091},{"i":1098,"t":"How to add a new service","u":"/docs/iaas/guides/other-guides/developer-guide/","h":"#how-to-add-a-new-service","p":1097},{"i":1100,"t":"How to add a new container image","u":"/docs/iaas/guides/other-guides/developer-guide/","h":"#how-to-add-a-new-container-image","p":1097},{"i":1104,"t":"change-osism.sh","u":"/docs/iaas/guides/other-guides/developer-guide/scripts","h":"#change-osismsh","p":1102},{"i":1106,"t":"Inventory Reconciler","u":"/docs/iaas/guides/other-guides/developer-guide/scripts","h":"#inventory-reconciler","p":1102},{"i":1108,"t":"osism-ansible","u":"/docs/iaas/guides/other-guides/developer-guide/scripts","h":"#osism-ansible","p":1102},{"i":1111,"t":"How we handle releases","u":"/docs/iaas/guides/other-guides/developer-guide/releases","h":"#how-we-handle-releases","p":1110},{"i":1113,"t":"How to make a release","u":"/docs/iaas/guides/other-guides/developer-guide/releases","h":"#how-to-make-a-release","p":1110},{"i":1115,"t":"Stable release","u":"/docs/iaas/guides/other-guides/developer-guide/releases","h":"#stable-release","p":1110},{"i":1117,"t":"How we write release notes","u":"/docs/iaas/guides/other-guides/developer-guide/releases","h":"#how-we-write-release-notes","p":1110},{"i":1119,"t":"Installation","u":"/docs/iaas/guides/other-guides/developer-guide/releases","h":"#installation","p":1110},{"i":1121,"t":"Usage","u":"/docs/iaas/guides/other-guides/developer-guide/releases","h":"#usage","p":1110},{"i":1123,"t":"Example","u":"/docs/iaas/guides/other-guides/developer-guide/releases","h":"#example","p":1110},{"i":1125,"t":"Repositories without release notes","u":"/docs/iaas/guides/other-guides/developer-guide/releases","h":"#repositories-without-release-notes","p":1110},{"i":1129,"t":"The zuul label","u":"/docs/iaas/guides/other-guides/developer-guide/zuul-ci","h":"#the-zuul-label","p":1127},{"i":1132,"t":"Ansible","u":"/docs/iaas/guides/other-guides/style-guide","h":"#ansible","p":1131},{"i":1134,"t":"Task names","u":"/docs/iaas/guides/other-guides/style-guide","h":"#task-names","p":1131},{"i":1136,"t":"become directive","u":"/docs/iaas/guides/other-guides/style-guide","h":"#become-directive","p":1131},{"i":1138,"t":"when directive","u":"/docs/iaas/guides/other-guides/style-guide","h":"#when-directive","p":1131},{"i":1140,"t":"Lists as defaults","u":"/docs/iaas/guides/other-guides/style-guide","h":"#lists-as-defaults","p":1131},{"i":1142,"t":"Containerfiles","u":"/docs/iaas/guides/other-guides/style-guide","h":"#containerfiles","p":1131},{"i":1143,"t":"Commit messages","u":"/docs/iaas/guides/other-guides/style-guide","h":"#commit-messages","p":1131},{"i":1144,"t":"Python","u":"/docs/iaas/guides/other-guides/style-guide","h":"#python","p":1131},{"i":1146,"t":"Installation","u":"/docs/iaas/guides/other-guides/style-guide","h":"#installation","p":1131},{"i":1148,"t":"Formatting a Single File","u":"/docs/iaas/guides/other-guides/style-guide","h":"#formatting-a-single-file","p":1131},{"i":1150,"t":"Formatting Multiple Files and/or directories","u":"/docs/iaas/guides/other-guides/style-guide","h":"#formatting-multiple-files-andor-directories","p":1131},{"i":1152,"t":"Formatting an Entire Project","u":"/docs/iaas/guides/other-guides/style-guide","h":"#formatting-an-entire-project","p":1131},{"i":1154,"t":"Check Mode (Dry Run)","u":"/docs/iaas/guides/other-guides/style-guide","h":"#check-mode-dry-run","p":1131},{"i":1156,"t":"Excluding Files or Directories","u":"/docs/iaas/guides/other-guides/style-guide","h":"#excluding-files-or-directories","p":1131},{"i":1158,"t":"Integration with Code Editors","u":"/docs/iaas/guides/other-guides/style-guide","h":"#integration-with-code-editors","p":1131},{"i":1160,"t":"Example of failed python-black Zuul job","u":"/docs/iaas/guides/other-guides/style-guide","h":"#example-of-failed-python-black-zuul-job","p":1131},{"i":1166,"t":"Installation","u":"/docs/iaas/guides/other-guides/zuul","h":"#installation","p":1164},{"i":1167,"t":"Server preparation","u":"/docs/iaas/guides/other-guides/zuul","h":"#server-preparation","p":1164},{"i":1169,"t":"Define secrets","u":"/docs/iaas/guides/other-guides/zuul","h":"#define-secrets","p":1164},{"i":1171,"t":"Github App setup","u":"/docs/iaas/guides/other-guides/zuul","h":"#github-app-setup","p":1164},{"i":1173,"t":"Example Playbook","u":"/docs/iaas/guides/other-guides/zuul","h":"#example-playbook","p":1164},{"i":1175,"t":"Troubleshooting","u":"/docs/iaas/guides/other-guides/zuul","h":"#troubleshooting","p":1164},{"i":1176,"t":"Your git repos are not displayed?","u":"/docs/iaas/guides/other-guides/zuul","h":"#your-git-repos-are-not-displayed","p":1164},{"i":1178,"t":"Your git repos are using the wrong branch?","u":"/docs/iaas/guides/other-guides/zuul","h":"#your-git-repos-are-using-the-wrong-branch","p":1164},{"i":1180,"t":"Your logs are not displayed in the web-UI?","u":"/docs/iaas/guides/other-guides/zuul","h":"#your-logs-are-not-displayed-in-the-web-ui","p":1164},{"i":1183,"t":"Reset","u":"/docs/iaas/guides/troubleshooting-guide/manager","h":"#reset","p":1182},{"i":1186,"t":"Database creation fails","u":"/docs/iaas/guides/troubleshooting-guide/openstack","h":"#database-creation-fails","p":1185},{"i":1193,"t":"Kubernetes","u":"/docs/iaas/guides/upgrade-guide/infrastructure","h":"#kubernetes","p":1192},{"i":1194,"t":"Cron, Fluentd & Kolla Toolbox","u":"/docs/iaas/guides/upgrade-guide/infrastructure","h":"#cron-fluentd--kolla-toolbox","p":1192},{"i":1196,"t":"Loadbalancer","u":"/docs/iaas/guides/upgrade-guide/infrastructure","h":"#loadbalancer","p":1192},{"i":1198,"t":"Redis","u":"/docs/iaas/guides/upgrade-guide/infrastructure","h":"#redis","p":1192},{"i":1200,"t":"Memcached","u":"/docs/iaas/guides/upgrade-guide/infrastructure","h":"#memcached","p":1192},{"i":1202,"t":"RabbitMQ","u":"/docs/iaas/guides/upgrade-guide/infrastructure","h":"#rabbitmq","p":1192},{"i":1204,"t":"MariaDB","u":"/docs/iaas/guides/upgrade-guide/infrastructure","h":"#mariadb","p":1192},{"i":1208,"t":"Restart behaviour","u":"/docs/iaas/guides/upgrade-guide/docker","h":"#restart-behaviour","p":1206},{"i":1211,"t":"OpenSearch","u":"/docs/iaas/guides/upgrade-guide/logging-monitoring","h":"#opensearch","p":1210},{"i":1213,"t":"Prometheus","u":"/docs/iaas/guides/upgrade-guide/logging-monitoring","h":"#prometheus","p":1210},{"i":1215,"t":"Grafana","u":"/docs/iaas/guides/upgrade-guide/logging-monitoring","h":"#grafana","p":1210},{"i":1220,"t":"Open vSwitch","u":"/docs/iaas/guides/upgrade-guide/network","h":"#open-vswitch","p":1219},{"i":1222,"t":"OVN (if used)","u":"/docs/iaas/guides/upgrade-guide/network","h":"#ovn-if-used","p":1219},{"i":1227,"t":"Keystone","u":"/docs/iaas/guides/upgrade-guide/openstack","h":"#keystone","p":1226},{"i":1229,"t":"Glance","u":"/docs/iaas/guides/upgrade-guide/openstack","h":"#glance","p":1226},{"i":1231,"t":"Designate","u":"/docs/iaas/guides/upgrade-guide/openstack","h":"#designate","p":1226},{"i":1233,"t":"Placement","u":"/docs/iaas/guides/upgrade-guide/openstack","h":"#placement","p":1226},{"i":1235,"t":"Cinder","u":"/docs/iaas/guides/upgrade-guide/openstack","h":"#cinder","p":1226},{"i":1237,"t":"Neutron","u":"/docs/iaas/guides/upgrade-guide/openstack","h":"#neutron","p":1226},{"i":1239,"t":"Nova","u":"/docs/iaas/guides/upgrade-guide/openstack","h":"#nova","p":1226},{"i":1241,"t":"Octavia","u":"/docs/iaas/guides/upgrade-guide/openstack","h":"#octavia","p":1226},{"i":1243,"t":"Amphora image update","u":"/docs/iaas/guides/upgrade-guide/openstack","h":"#amphora-image-update","p":1226},{"i":1245,"t":"Amphora rotation","u":"/docs/iaas/guides/upgrade-guide/openstack","h":"#amphora-rotation","p":1226},{"i":1247,"t":"Horizon","u":"/docs/iaas/guides/upgrade-guide/openstack","h":"#horizon","p":1226},{"i":1249,"t":"OpenStack client","u":"/docs/iaas/guides/upgrade-guide/openstack","h":"#openstack-client","p":1226},{"i":1261,"t":"Detailed tutorial on how to configure Federation (OpenID Connect) between two Keycloak instances in two separate SCS domains","u":"/docs/iam/intra-SCS-federation-setup-description-for-osism-doc-operations","h":"#detailed-tutorial-on-how-to-configure-federation-openid-connect-between-two-keycloak-instances-in-two-separate-scs-domains","p":1259},{"i":1271,"t":"The SCS status page API","u":"/docs/operating-scs/components/status-page/docs/overview","h":"#the-scs-status-page-api","p":1269},{"i":1273,"t":"Reference implementation","u":"/docs/operating-scs/components/status-page/docs/overview","h":"#reference-implementation","p":1269},{"i":1275,"t":"The SCS status page frontend","u":"/docs/operating-scs/components/status-page/docs/overview","h":"#the-scs-status-page-frontend","p":1269},{"i":1277,"t":"Reference implementation","u":"/docs/operating-scs/components/status-page/docs/overview","h":"#reference-implementation-1","p":1269},{"i":1293,"t":"1. ceilometer metering configuration","u":"/docs/operating-scs/metering/meter_configuration","h":"#1-ceilometer-metering-configuration","p":1291},{"i":1295,"t":"1.1 polling.yaml","u":"/docs/operating-scs/metering/meter_configuration","h":"#11-pollingyaml","p":1291},{"i":1297,"t":"1.2 event_definitions.yaml","u":"/docs/operating-scs/metering/meter_configuration","h":"#12-event_definitionsyaml","p":1291},{"i":1299,"t":"1.3 event_pipeline.yaml","u":"/docs/operating-scs/metering/meter_configuration","h":"#13-event_pipelineyaml","p":1291},{"i":1301,"t":"1.4 pipeline.yaml","u":"/docs/operating-scs/metering/meter_configuration","h":"#14-pipelineyaml","p":1291},{"i":1305,"t":"Scope","u":"/docs/releases/Release0","h":"#scope","p":1303},{"i":1307,"t":"Features","u":"/docs/releases/Release0","h":"#features","p":1303},{"i":1309,"t":"Get SCS","u":"/docs/releases/Release0","h":"#get-scs","p":1303},{"i":1311,"t":"Known Bugs","u":"/docs/releases/Release0","h":"#known-bugs","p":1303},{"i":1313,"t":"Technical Previews","u":"/docs/releases/Release0","h":"#technical-previews","p":1303},{"i":1315,"t":"Release tagging","u":"/docs/releases/Release0","h":"#release-tagging","p":1303},{"i":1317,"t":"Updates","u":"/docs/releases/Release0","h":"#updates","p":1303},{"i":1319,"t":"Bug reporting","u":"/docs/releases/Release0","h":"#bug-reporting","p":1303},{"i":1325,"t":"Scope","u":"/docs/releases/Release1","h":"#scope","p":1323},{"i":1327,"t":"CI framework","u":"/docs/releases/Release1","h":"#ci-framework","p":1323},{"i":1328,"t":"Zuul-CI","u":"/docs/releases/Release1","h":"#zuul-ci","p":1323},{"i":1330,"t":"Metrics collection and dashboards","u":"/docs/releases/Release1","h":"#metrics-collection-and-dashboards","p":1323},{"i":1331,"t":"Prometheus exporters and Grafana dashboards","u":"/docs/releases/Release1","h":"#prometheus-exporters-and-grafana-dashboards","p":1323},{"i":1333,"t":"openstack-health-monitor","u":"/docs/releases/Release1","h":"#openstack-health-monitor","p":1323},{"i":1335,"t":"Logging","u":"/docs/releases/Release1","h":"#logging","p":1323},{"i":1336,"t":"Central logging","u":"/docs/releases/Release1","h":"#central-logging","p":1323},{"i":1338,"t":"Federation","u":"/docs/releases/Release1","h":"#federation","p":1323},{"i":1339,"t":"OIDC support via keycloak","u":"/docs/releases/Release1","h":"#oidc-support-via-keycloak","p":1323},{"i":1341,"t":"non-TLS restrictions (testbed)","u":"/docs/releases/Release1","h":"#non-tls-restrictions-testbed","p":1323},{"i":1343,"t":"Known Issue with OIDC Logout","u":"/docs/releases/Release1","h":"#known-issue-with-oidc-logout","p":1323},{"i":1345,"t":"Bare Metal Service","u":"/docs/releases/Release1","h":"#bare-metal-service","p":1323},{"i":1347,"t":"Container Layer","u":"/docs/releases/Release1","h":"#container-layer","p":1323},{"i":1348,"t":"Overview and Goals for R1","u":"/docs/releases/Release1","h":"#overview-and-goals-for-r1","p":1323},{"i":1350,"t":"Beyond CAPI","u":"/docs/releases/Release1","h":"#beyond-capi","p":1323},{"i":1352,"t":"Standardization","u":"/docs/releases/Release1","h":"#standardization","p":1323},{"i":1354,"t":"SBOM and Links","u":"/docs/releases/Release1","h":"#sbom-and-links","p":1323},{"i":1356,"t":"Release tagging","u":"/docs/releases/Release1","h":"#release-tagging","p":1323},{"i":1358,"t":"List of known issues & restrictions in R1","u":"/docs/releases/Release1","h":"#list-of-known-issues--restrictions-in-r1","p":1323},{"i":1362,"t":"Scope","u":"/docs/releases/Release4","h":"#scope","p":1360},{"i":1364,"t":"Component Versions and User-visible improvements (highlights)","u":"/docs/releases/Release4","h":"#component-versions-and-user-visible-improvements-highlights","p":1360},{"i":1366,"t":"New Features (Highlights)","u":"/docs/releases/Release4","h":"#new-features-highlights","p":1360},{"i":1367,"t":"Operator focused improvements","u":"/docs/releases/Release4","h":"#operator-focused-improvements","p":1360},{"i":1369,"t":"SCS Developer focused improvements (testbed and k8s cluster management)","u":"/docs/releases/Release4","h":"#scs-developer-focused-improvements-testbed-and-k8s-cluster-management","p":1360},{"i":1371,"t":"Upgrade/Migration notes","u":"/docs/releases/Release4","h":"#upgrademigration-notes","p":1360},{"i":1373,"t":"Removals","u":"/docs/releases/Release4","h":"#removals","p":1360},{"i":1375,"t":"Deprecations","u":"/docs/releases/Release4","h":"#deprecations","p":1360},{"i":1376,"t":"Deprecations via OSISM","u":"/docs/releases/Release4","h":"#deprecations-via-osism","p":1360},{"i":1378,"t":"Security Fixes","u":"/docs/releases/Release4","h":"#security-fixes","p":1360},{"i":1380,"t":"Resolved Issues","u":"/docs/releases/Release4","h":"#resolved-issues","p":1360},{"i":1382,"t":"Standards Conformance","u":"/docs/releases/Release4","h":"#standards-conformance","p":1360},{"i":1384,"t":"Release Tagging","u":"/docs/releases/Release4","h":"#release-tagging","p":1360},{"i":1386,"t":"List of known issues & restrictions in R4","u":"/docs/releases/Release4","h":"#list-of-known-issues--restrictions-in-r4","p":1360},{"i":1388,"t":"Contributing","u":"/docs/releases/Release4","h":"#contributing","p":1360},{"i":1390,"t":"Thanks","u":"/docs/releases/Release4","h":"#thanks","p":1360},{"i":1394,"t":"Scope","u":"/docs/releases/Release3","h":"#scope","p":1392},{"i":1396,"t":"Component Versions and User-visible improvements (highlights)","u":"/docs/releases/Release3","h":"#component-versions-and-user-visible-improvements-highlights","p":1392},{"i":1398,"t":"New Features (Highlights)","u":"/docs/releases/Release3","h":"#new-features-highlights","p":1392},{"i":1399,"t":"Operator focused improvements","u":"/docs/releases/Release3","h":"#operator-focused-improvements","p":1392},{"i":1401,"t":"SCS Developer focused improvements (testbed and k8s cluster management)","u":"/docs/releases/Release3","h":"#scs-developer-focused-improvements-testbed-and-k8s-cluster-management","p":1392},{"i":1403,"t":"Upgrade/Migration notes","u":"/docs/releases/Release3","h":"#upgrademigration-notes","p":1392},{"i":1404,"t":"Cluster Management","u":"/docs/releases/Release3","h":"#cluster-management","p":1392},{"i":1406,"t":"OSISM","u":"/docs/releases/Release3","h":"#osism","p":1392},{"i":1408,"t":"Removals","u":"/docs/releases/Release3","h":"#removals","p":1392},{"i":1410,"t":"Deprecations","u":"/docs/releases/Release3","h":"#deprecations","p":1392},{"i":1412,"t":"Security Fixes","u":"/docs/releases/Release3","h":"#security-fixes","p":1392},{"i":1414,"t":"Resolved Issues","u":"/docs/releases/Release3","h":"#resolved-issues","p":1392},{"i":1416,"t":"Standards Conformance","u":"/docs/releases/Release3","h":"#standards-conformance","p":1392},{"i":1418,"t":"Release Tagging","u":"/docs/releases/Release3","h":"#release-tagging","p":1392},{"i":1420,"t":"List of known issues & restrictions in R3","u":"/docs/releases/Release3","h":"#list-of-known-issues--restrictions-in-r3","p":1392},{"i":1422,"t":"Contributing","u":"/docs/releases/Release3","h":"#contributing","p":1392},{"i":1424,"t":"Thanks","u":"/docs/releases/Release3","h":"#thanks","p":1392},{"i":1428,"t":"Scope","u":"/docs/releases/Release2","h":"#scope","p":1426},{"i":1430,"t":"Component Versions and User-visible improvements (highlights)","u":"/docs/releases/Release2","h":"#component-versions-and-user-visible-improvements-highlights","p":1426},{"i":1432,"t":"New Features (Highlights)","u":"/docs/releases/Release2","h":"#new-features-highlights","p":1426},{"i":1433,"t":"Operator focused improvements","u":"/docs/releases/Release2","h":"#operator-focused-improvements","p":1426},{"i":1435,"t":"SCS Developer focused improvements (testbed)","u":"/docs/releases/Release2","h":"#scs-developer-focused-improvements-testbed","p":1426},{"i":1437,"t":"Upgrade/Migration notes","u":"/docs/releases/Release2","h":"#upgrademigration-notes","p":1426},{"i":1438,"t":"Cluster Management","u":"/docs/releases/Release2","h":"#cluster-management","p":1426},{"i":1440,"t":"OSISM","u":"/docs/releases/Release2","h":"#osism","p":1426},{"i":1442,"t":"Removals","u":"/docs/releases/Release2","h":"#removals","p":1426},{"i":1444,"t":"Deprecations","u":"/docs/releases/Release2","h":"#deprecations","p":1426},{"i":1446,"t":"Security Fixes","u":"/docs/releases/Release2","h":"#security-fixes","p":1426},{"i":1448,"t":"Resolved Issues","u":"/docs/releases/Release2","h":"#resolved-issues","p":1426},{"i":1450,"t":"Standards Conformance","u":"/docs/releases/Release2","h":"#standards-conformance","p":1426},{"i":1452,"t":"Release Tagging","u":"/docs/releases/Release2","h":"#release-tagging","p":1426},{"i":1454,"t":"List of known issues & restrictions in R2","u":"/docs/releases/Release2","h":"#list-of-known-issues--restrictions-in-r2","p":1426},{"i":1455,"t":"Future directions (selected Highlights)","u":"/docs/releases/Release2","h":"#future-directions-selected-highlights","p":1426},{"i":1457,"t":"Contributing","u":"/docs/releases/Release2","h":"#contributing","p":1426},{"i":1461,"t":"Scope","u":"/docs/releases/Release5","h":"#scope","p":1459},{"i":1463,"t":"Component Versions and User-visible improvements (highlights)","u":"/docs/releases/Release5","h":"#component-versions-and-user-visible-improvements-highlights","p":1459},{"i":1464,"t":"IaaS","u":"/docs/releases/Release5","h":"#iaas","p":1459},{"i":1466,"t":"Container Management","u":"/docs/releases/Release5","h":"#container-management","p":1459},{"i":1468,"t":"Preview: Cluster-Stacks","u":"/docs/releases/Release5","h":"#preview-cluster-stacks","p":1459},{"i":1470,"t":"Operations and IAM related","u":"/docs/releases/Release5","h":"#operations-and-iam-related","p":1459},{"i":1472,"t":"SCS Developer focused improvements (Cloud-in-a-Box, testbed and k8s cluster management)","u":"/docs/releases/Release5","h":"#scs-developer-focused-improvements-cloud-in-a-box-testbed-and-k8s-cluster-management","p":1459},{"i":1474,"t":"Project Infrastructure","u":"/docs/releases/Release5","h":"#project-infrastructure","p":1459},{"i":1476,"t":"Upgrade/Migration notes","u":"/docs/releases/Release5","h":"#upgrademigration-notes","p":1459},{"i":1478,"t":"Removals","u":"/docs/releases/Release5","h":"#removals","p":1459},{"i":1480,"t":"Deprecations","u":"/docs/releases/Release5","h":"#deprecations","p":1459},{"i":1481,"t":"Deprecations via OSISM","u":"/docs/releases/Release5","h":"#deprecations-via-osism","p":1459},{"i":1483,"t":"Security Fixes","u":"/docs/releases/Release5","h":"#security-fixes","p":1459},{"i":1485,"t":"Resolved Issues","u":"/docs/releases/Release5","h":"#resolved-issues","p":1459},{"i":1487,"t":"Standards Conformance","u":"/docs/releases/Release5","h":"#standards-conformance","p":1459},{"i":1489,"t":"Release Tagging","u":"/docs/releases/Release5","h":"#release-tagging","p":1459},{"i":1491,"t":"List of known issues & restrictions in R5","u":"/docs/releases/Release5","h":"#list-of-known-issues--restrictions-in-r5","p":1459},{"i":1493,"t":"Contributing","u":"/docs/releases/Release5","h":"#contributing","p":1459},{"i":1495,"t":"Thanks","u":"/docs/releases/Release5","h":"#thanks","p":1459},{"i":1499,"t":"Scope","u":"/docs/releases/ReleaseX","h":"#scope","p":1497},{"i":1500,"t":"Component Versions and User-visible improvements (highlights)","u":"/docs/releases/ReleaseX","h":"#component-versions-and-user-visible-improvements-highlights","p":1497},{"i":1501,"t":"New Features (Highlights)","u":"/docs/releases/ReleaseX","h":"#new-features-highlights","p":1497},{"i":1502,"t":"Operator focused improvements","u":"/docs/releases/ReleaseX","h":"#operator-focused-improvements","p":1497},{"i":1503,"t":"SCS Developer focused improvements (testbed and k8s cluster management)","u":"/docs/releases/ReleaseX","h":"#scs-developer-focused-improvements-testbed-and-k8s-cluster-management","p":1497},{"i":1504,"t":"Upgrade/Migration notes","u":"/docs/releases/ReleaseX","h":"#upgrademigration-notes","p":1497},{"i":1505,"t":"Removals","u":"/docs/releases/ReleaseX","h":"#removals","p":1497},{"i":1506,"t":"Deprecations","u":"/docs/releases/ReleaseX","h":"#deprecations","p":1497},{"i":1507,"t":"Security Fixes","u":"/docs/releases/ReleaseX","h":"#security-fixes","p":1497},{"i":1508,"t":"Resolved Issues","u":"/docs/releases/ReleaseX","h":"#resolved-issues","p":1497},{"i":1509,"t":"Standards Conformance","u":"/docs/releases/ReleaseX","h":"#standards-conformance","p":1497},{"i":1510,"t":"Release Tagging","u":"/docs/releases/ReleaseX","h":"#release-tagging","p":1497},{"i":1511,"t":"List of known issues & restrictions in RX","u":"/docs/releases/ReleaseX","h":"#list-of-known-issues--restrictions-in-rx","p":1497},{"i":1512,"t":"Contributing","u":"/docs/releases/ReleaseX","h":"#contributing","p":1497},{"i":1514,"t":"Thanks","u":"/docs/releases/ReleaseX","h":"#thanks","p":1497},{"i":1521,"t":"SCS standards overview","u":"/standards/certification/certified-clouds","h":"#scs-standards-overview","p":1519},{"i":1523,"t":"Repo Structure","u":"/standards/certification/certified-clouds","h":"#repo-structure","p":1519},{"i":1525,"t":"Decisions","u":"/standards/certification/certified-clouds","h":"#decisions","p":1519},{"i":1527,"t":"Drafts","u":"/standards/certification/certified-clouds","h":"#drafts","p":1519},{"i":1529,"t":"Standards","u":"/standards/certification/certified-clouds","h":"#standards","p":1519},{"i":1531,"t":"Tests","u":"/standards/certification/certified-clouds","h":"#tests","p":1519},{"i":1534,"t":"Scopes and versions","u":"/standards/certification/overview","h":"#scopes-and-versions","p":1533},{"i":1536,"t":"Becoming certified","u":"/standards/certification/overview","h":"#becoming-certified","p":1533},{"i":1538,"t":"Compliant cloud environments","u":"/standards/certification/overview","h":"#compliant-cloud-environments","p":1533},{"i":1579,"t":"Introduction","u":"/standards/scs-0001-v1-sovereign-cloud-standards","h":"#introduction","p":1578},{"i":1581,"t":"Requirements","u":"/standards/scs-0001-v1-sovereign-cloud-standards","h":"#requirements","p":1578},{"i":1583,"t":"Sovereign Cloud Standard documents","u":"/standards/scs-0001-v1-sovereign-cloud-standards","h":"#sovereign-cloud-standard-documents","p":1578},{"i":1585,"t":"Types of documents","u":"/standards/scs-0001-v1-sovereign-cloud-standards","h":"#types-of-documents","p":1578},{"i":1587,"t":"Document format","u":"/standards/scs-0001-v1-sovereign-cloud-standards","h":"#document-format","p":1578},{"i":1589,"t":"Sections","u":"/standards/scs-0001-v1-sovereign-cloud-standards","h":"#sections","p":1578},{"i":1591,"t":"Process","u":"/standards/scs-0001-v1-sovereign-cloud-standards","h":"#process","p":1578},{"i":1593,"t":"Proposal phase","u":"/standards/scs-0001-v1-sovereign-cloud-standards","h":"#proposal-phase","p":1578},{"i":1595,"t":"Development phase (Draft)","u":"/standards/scs-0001-v1-sovereign-cloud-standards","h":"#development-phase-draft","p":1578},{"i":1597,"t":"Stabilized phase (Stable)","u":"/standards/scs-0001-v1-sovereign-cloud-standards","h":"#stabilized-phase-stable","p":1578},{"i":1599,"t":"Deprecation phase (Deprecated)","u":"/standards/scs-0001-v1-sovereign-cloud-standards","h":"#deprecation-phase-deprecated","p":1578},{"i":1601,"t":"Rejection","u":"/standards/scs-0001-v1-sovereign-cloud-standards","h":"#rejection","p":1578},{"i":1603,"t":"Open Questions","u":"/standards/scs-0001-v1-sovereign-cloud-standards","h":"#open-questions","p":1578},{"i":1604,"t":"Stabilization criteria","u":"/standards/scs-0001-v1-sovereign-cloud-standards","h":"#stabilization-criteria","p":1578},{"i":1606,"t":"Breaking change criteria","u":"/standards/scs-0001-v1-sovereign-cloud-standards","h":"#breaking-change-criteria","p":1578},{"i":1608,"t":"Design Considerations","u":"/standards/scs-0001-v1-sovereign-cloud-standards","h":"#design-considerations","p":1578},{"i":1609,"t":"Versioning","u":"/standards/scs-0001-v1-sovereign-cloud-standards","h":"#versioning","p":1578},{"i":1611,"t":"Acknowledgements","u":"/standards/scs-0001-v1-sovereign-cloud-standards","h":"#acknowledgements","p":1578},{"i":1614,"t":"Introduction","u":"/standards/scs-0002-v1-standards-docs-org","h":"#introduction","p":1613},{"i":1616,"t":"Motivation","u":"/standards/scs-0002-v1-standards-docs-org","h":"#motivation","p":1613},{"i":1618,"t":"Suggested cleanup (step 1)","u":"/standards/scs-0002-v1-standards-docs-org","h":"#suggested-cleanup-step-1","p":1613},{"i":1621,"t":"Introduction","u":"/standards/scs-0003-v1-sovereign-cloud-standards-yaml","h":"#introduction","p":1620},{"i":1623,"t":"Motivation","u":"/standards/scs-0003-v1-sovereign-cloud-standards-yaml","h":"#motivation","p":1620},{"i":1625,"t":"Overview of mandatory SCS standards","u":"/standards/scs-0003-v1-sovereign-cloud-standards-yaml","h":"#overview-of-mandatory-scs-standards","p":1620},{"i":1627,"t":"Lifecycle of certificate scopes","u":"/standards/scs-0003-v1-sovereign-cloud-standards-yaml","h":"#lifecycle-of-certificate-scopes","p":1620},{"i":1629,"t":"Machine-readability for further processing","u":"/standards/scs-0003-v1-sovereign-cloud-standards-yaml","h":"#machine-readability-for-further-processing","p":1620},{"i":1631,"t":"SCS Certification YAML","u":"/standards/scs-0003-v1-sovereign-cloud-standards-yaml","h":"#scs-certification-yaml","p":1620},{"i":1633,"t":"Prerequisite","u":"/standards/scs-0003-v1-sovereign-cloud-standards-yaml","h":"#prerequisite","p":1620},{"i":1635,"t":"Version descriptor","u":"/standards/scs-0003-v1-sovereign-cloud-standards-yaml","h":"#version-descriptor","p":1620},{"i":1637,"t":"Standard descriptor","u":"/standards/scs-0003-v1-sovereign-cloud-standards-yaml","h":"#standard-descriptor","p":1620},{"i":1639,"t":"Check tool descriptor","u":"/standards/scs-0003-v1-sovereign-cloud-standards-yaml","h":"#check-tool-descriptor","p":1620},{"i":1641,"t":"Basic Example","u":"/standards/scs-0003-v1-sovereign-cloud-standards-yaml","h":"#basic-example","p":1620},{"i":1643,"t":"Process","u":"/standards/scs-0003-v1-sovereign-cloud-standards-yaml","h":"#process","p":1620},{"i":1645,"t":"Design Considerations","u":"/standards/scs-0003-v1-sovereign-cloud-standards-yaml","h":"#design-considerations","p":1620},{"i":1646,"t":"File format","u":"/standards/scs-0003-v1-sovereign-cloud-standards-yaml","h":"#file-format","p":1620},{"i":1648,"t":"Dependency graph for certifications","u":"/standards/scs-0003-v1-sovereign-cloud-standards-yaml","h":"#dependency-graph-for-certifications","p":1620},{"i":1650,"t":"Tooling","u":"/standards/scs-0003-v1-sovereign-cloud-standards-yaml","h":"#tooling","p":1620},{"i":1652,"t":"Open Questions","u":"/standards/scs-0003-v1-sovereign-cloud-standards-yaml","h":"#open-questions","p":1620},{"i":1653,"t":"Acknowledgements","u":"/standards/scs-0003-v1-sovereign-cloud-standards-yaml","h":"#acknowledgements","p":1620},{"i":1656,"t":"Introduction","u":"/standards/scs-0002-v2-standards-docs-org","h":"#introduction","p":1655},{"i":1658,"t":"Motivation","u":"/standards/scs-0002-v2-standards-docs-org","h":"#motivation","p":1655},{"i":1660,"t":"Distributed Documentation","u":"/standards/scs-0002-v2-standards-docs-org","h":"#distributed-documentation","p":1655},{"i":1662,"t":"Methodology and Taxonomy","u":"/standards/scs-0002-v2-standards-docs-org","h":"#methodology-and-taxonomy","p":1655},{"i":1664,"t":"Structure Template","u":"/standards/scs-0002-v2-standards-docs-org","h":"#structure-template","p":1655},{"i":1666,"t":"Single Component/Component","u":"/standards/scs-0002-v2-standards-docs-org","h":"#single-componentcomponent","p":1655},{"i":1668,"t":"Technical Implementation","u":"/standards/scs-0002-v2-standards-docs-org","h":"#technical-implementation","p":1655},{"i":1670,"t":"Writing Style and Format – Style Guide","u":"/standards/scs-0002-v2-standards-docs-org","h":"#writing-style-and-format--style-guide","p":1655},{"i":1672,"t":"Open Questions","u":"/standards/scs-0002-v2-standards-docs-org","h":"#open-questions","p":1655},{"i":1674,"t":"Reference","u":"/standards/scs-0002-v2-standards-docs-org","h":"#reference","p":1655},{"i":1677,"t":"Introduction","u":"/standards/scs-0100-v1-flavor-naming","h":"#introduction","p":1676},{"i":1679,"t":"Motivation","u":"/standards/scs-0100-v1-flavor-naming","h":"#motivation","p":1676},{"i":1681,"t":"Proposal","u":"/standards/scs-0100-v1-flavor-naming","h":"#proposal","p":1676},{"i":1682,"t":"Type of information included","u":"/standards/scs-0100-v1-flavor-naming","h":"#type-of-information-included","p":1676},{"i":1684,"t":"Complete Proposal","u":"/standards/scs-0100-v1-flavor-naming","h":"#complete-proposal","p":1676},{"i":1686,"t":"Proposal Details","u":"/standards/scs-0100-v1-flavor-naming","h":"#proposal-details","p":1676},{"i":1687,"t":"[REQUIRED] CPU Suffixes","u":"/standards/scs-0100-v1-flavor-naming","h":"#required-cpu-suffixes","p":1676},{"i":1689,"t":"[REQUIRED] Memory","u":"/standards/scs-0100-v1-flavor-naming","h":"#required-memory","p":1676},{"i":1691,"t":"[OPTIONAL] Disk sizes and types","u":"/standards/scs-0100-v1-flavor-naming","h":"#optional-disk-sizes-and-types","p":1676},{"i":1693,"t":"[OPTIONAL] Hypervisor","u":"/standards/scs-0100-v1-flavor-naming","h":"#optional-hypervisor","p":1676},{"i":1695,"t":"[OPTIONAL] Hardware virtualization / Nested virtualization","u":"/standards/scs-0100-v1-flavor-naming","h":"#optional-hardware-virtualization--nested-virtualization","p":1676},{"i":1697,"t":"[OPTIONAL] CPU Architecture Details","u":"/standards/scs-0100-v1-flavor-naming","h":"#optional-cpu-architecture-details","p":1676},{"i":1699,"t":"[OPTIONAL] Extra features","u":"/standards/scs-0100-v1-flavor-naming","h":"#optional-extra-features","p":1676},{"i":1701,"t":"Proposal Examples","u":"/standards/scs-0100-v1-flavor-naming","h":"#proposal-examples","p":1676},{"i":1703,"t":"Standard SCS flavors","u":"/standards/scs-0100-v1-flavor-naming","h":"#standard-scs-flavors","p":1676},{"i":1705,"t":"Naming policies","u":"/standards/scs-0100-v1-flavor-naming","h":"#naming-policies","p":1676},{"i":1707,"t":"Rationale","u":"/standards/scs-0100-v1-flavor-naming","h":"#rationale","p":1676},{"i":1709,"t":"Validation","u":"/standards/scs-0100-v1-flavor-naming","h":"#validation","p":1676},{"i":1711,"t":"Beyond SCS: Gaia-X","u":"/standards/scs-0100-v1-flavor-naming","h":"#beyond-scs-gaia-x","p":1676},{"i":1714,"t":"Introduction","u":"/standards/scs-0100-v2-flavor-naming","h":"#introduction","p":1713},{"i":1716,"t":"Motivation","u":"/standards/scs-0100-v2-flavor-naming","h":"#motivation","p":1713},{"i":1718,"t":"Design Considerations","u":"/standards/scs-0100-v2-flavor-naming","h":"#design-considerations","p":1713},{"i":1719,"t":"Type of information included","u":"/standards/scs-0100-v2-flavor-naming","h":"#type-of-information-included","p":1713},{"i":1721,"t":"Complete Proposal for systematic flavor naming","u":"/standards/scs-0100-v2-flavor-naming","h":"#complete-proposal-for-systematic-flavor-naming","p":1713},{"i":1723,"t":"Proposal Details","u":"/standards/scs-0100-v2-flavor-naming","h":"#proposal-details","p":1713},{"i":1724,"t":"[REQUIRED] CPU Suffixes","u":"/standards/scs-0100-v2-flavor-naming","h":"#required-cpu-suffixes","p":1713},{"i":1726,"t":"[REQUIRED] Memory","u":"/standards/scs-0100-v2-flavor-naming","h":"#required-memory","p":1713},{"i":1728,"t":"[OPTIONAL] Disk sizes and types","u":"/standards/scs-0100-v2-flavor-naming","h":"#optional-disk-sizes-and-types","p":1713},{"i":1730,"t":"Standard SCS flavors","u":"/standards/scs-0100-v2-flavor-naming","h":"#standard-scs-flavors","p":1713},{"i":1732,"t":"Naming policy compliance","u":"/standards/scs-0100-v2-flavor-naming","h":"#naming-policy-compliance","p":1713},{"i":1734,"t":"Validation","u":"/standards/scs-0100-v2-flavor-naming","h":"#validation","p":1713},{"i":1736,"t":"Operational tooling","u":"/standards/scs-0100-v2-flavor-naming","h":"#operational-tooling","p":1713},{"i":1738,"t":"Extensions","u":"/standards/scs-0100-v2-flavor-naming","h":"#extensions","p":1713},{"i":1740,"t":"[OPTIONAL] Hypervisor","u":"/standards/scs-0100-v2-flavor-naming","h":"#optional-hypervisor","p":1713},{"i":1742,"t":"[OPTIONAL] Hardware virtualization / Nested virtualization","u":"/standards/scs-0100-v2-flavor-naming","h":"#optional-hardware-virtualization--nested-virtualization","p":1713},{"i":1744,"t":"[OPTIONAL] CPU Architecture Details","u":"/standards/scs-0100-v2-flavor-naming","h":"#optional-cpu-architecture-details","p":1713},{"i":1746,"t":"[OPTIONAL] GPU support","u":"/standards/scs-0100-v2-flavor-naming","h":"#optional-gpu-support","p":1713},{"i":1748,"t":"[OPTIONAL] Infiniband","u":"/standards/scs-0100-v2-flavor-naming","h":"#optional-infiniband","p":1713},{"i":1750,"t":"Naming options advice","u":"/standards/scs-0100-v2-flavor-naming","h":"#naming-options-advice","p":1713},{"i":1752,"t":"Proposal Examples","u":"/standards/scs-0100-v2-flavor-naming","h":"#proposal-examples","p":1713},{"i":1754,"t":"Previous standard versions","u":"/standards/scs-0100-v2-flavor-naming","h":"#previous-standard-versions","p":1713},{"i":1756,"t":"Beyond SCS","u":"/standards/scs-0100-v2-flavor-naming","h":"#beyond-scs","p":1713},{"i":1759,"t":"Introduction","u":"/standards/scs-0100-v3-flavor-naming","h":"#introduction","p":1758},{"i":1761,"t":"Motivation","u":"/standards/scs-0100-v3-flavor-naming","h":"#motivation","p":1758},{"i":1763,"t":"Design Considerations","u":"/standards/scs-0100-v3-flavor-naming","h":"#design-considerations","p":1758},{"i":1764,"t":"Type of information included","u":"/standards/scs-0100-v3-flavor-naming","h":"#type-of-information-included","p":1758},{"i":1766,"t":"Complete Proposal for systematic flavor naming","u":"/standards/scs-0100-v3-flavor-naming","h":"#complete-proposal-for-systematic-flavor-naming","p":1758},{"i":1768,"t":"Proposal Details","u":"/standards/scs-0100-v3-flavor-naming","h":"#proposal-details","p":1758},{"i":1769,"t":"[REQUIRED] CPU Suffixes","u":"/standards/scs-0100-v3-flavor-naming","h":"#required-cpu-suffixes","p":1758},{"i":1771,"t":"[REQUIRED] Memory","u":"/standards/scs-0100-v3-flavor-naming","h":"#required-memory","p":1758},{"i":1773,"t":"[OPTIONAL] Disk sizes and types","u":"/standards/scs-0100-v3-flavor-naming","h":"#optional-disk-sizes-and-types","p":1758},{"i":1775,"t":"Naming policy compliance","u":"/standards/scs-0100-v3-flavor-naming","h":"#naming-policy-compliance","p":1758},{"i":1777,"t":"Conformance Tests","u":"/standards/scs-0100-v3-flavor-naming","h":"#conformance-tests","p":1758},{"i":1779,"t":"Extensions","u":"/standards/scs-0100-v3-flavor-naming","h":"#extensions","p":1758},{"i":1781,"t":"[OPTIONAL] Hypervisor","u":"/standards/scs-0100-v3-flavor-naming","h":"#optional-hypervisor","p":1758},{"i":1783,"t":"[OPTIONAL] Hardware virtualization / Nested virtualization","u":"/standards/scs-0100-v3-flavor-naming","h":"#optional-hardware-virtualization--nested-virtualization","p":1758},{"i":1785,"t":"[OPTIONAL] CPU Architecture Details","u":"/standards/scs-0100-v3-flavor-naming","h":"#optional-cpu-architecture-details","p":1758},{"i":1787,"t":"[OPTIONAL] GPU support","u":"/standards/scs-0100-v3-flavor-naming","h":"#optional-gpu-support","p":1758},{"i":1789,"t":"[OPTIONAL] Infiniband","u":"/standards/scs-0100-v3-flavor-naming","h":"#optional-infiniband","p":1758},{"i":1791,"t":"Naming options advice","u":"/standards/scs-0100-v3-flavor-naming","h":"#naming-options-advice","p":1758},{"i":1793,"t":"Proposal Examples","u":"/standards/scs-0100-v3-flavor-naming","h":"#proposal-examples","p":1758},{"i":1795,"t":"Previous standard versions","u":"/standards/scs-0100-v3-flavor-naming","h":"#previous-standard-versions","p":1758},{"i":1797,"t":"Beyond SCS","u":"/standards/scs-0100-v3-flavor-naming","h":"#beyond-scs","p":1758},{"i":1800,"t":"Motivation","u":"/standards/scs-0102-v1-image-metadata","h":"#motivation","p":1799},{"i":1802,"t":"Overview","u":"/standards/scs-0102-v1-image-metadata","h":"#overview","p":1799},{"i":1804,"t":"Naming","u":"/standards/scs-0102-v1-image-metadata","h":"#naming","p":1799},{"i":1806,"t":"Technical requirements and features","u":"/standards/scs-0102-v1-image-metadata","h":"#technical-requirements-and-features","p":1799},{"i":1808,"t":"Image handling","u":"/standards/scs-0102-v1-image-metadata","h":"#image-handling","p":1799},{"i":1809,"t":"Image updating","u":"/standards/scs-0102-v1-image-metadata","h":"#image-updating","p":1799},{"i":1811,"t":"Image Origin","u":"/standards/scs-0102-v1-image-metadata","h":"#image-origin","p":1799},{"i":1813,"t":"Image build info","u":"/standards/scs-0102-v1-image-metadata","h":"#image-build-info","p":1799},{"i":1815,"t":"Licensing / Maintenance subscription / Support","u":"/standards/scs-0102-v1-image-metadata","h":"#licensing--maintenance-subscription--support","p":1799},{"i":1817,"t":"Conformance Tests","u":"/standards/scs-0102-v1-image-metadata","h":"#conformance-tests","p":1799},{"i":1820,"t":"Introduction","u":"/standards/scs-0101-v1-entropy","h":"#introduction","p":1819},{"i":1821,"t":"Entropy in information technology","u":"/standards/scs-0101-v1-entropy","h":"#entropy-in-information-technology","p":1819},{"i":1823,"t":"Real-world uses of entropy","u":"/standards/scs-0101-v1-entropy","h":"#real-world-uses-of-entropy","p":1819},{"i":1825,"t":"Sources of entropy","u":"/standards/scs-0101-v1-entropy","h":"#sources-of-entropy","p":1819},{"i":1827,"t":"Entropy in virtual instances","u":"/standards/scs-0101-v1-entropy","h":"#entropy-in-virtual-instances","p":1819},{"i":1829,"t":"Motivation","u":"/standards/scs-0101-v1-entropy","h":"#motivation","p":1819},{"i":1831,"t":"Entropy in SCS clouds","u":"/standards/scs-0101-v1-entropy","h":"#entropy-in-scs-clouds","p":1819},{"i":1832,"t":"Flavors","u":"/standards/scs-0101-v1-entropy","h":"#flavors","p":1819},{"i":1834,"t":"Images","u":"/standards/scs-0101-v1-entropy","h":"#images","p":1819},{"i":1836,"t":"Compute nodes","u":"/standards/scs-0101-v1-entropy","h":"#compute-nodes","p":1819},{"i":1839,"t":"Introduction","u":"/standards/scs-0103-v1-standard-flavors","h":"#introduction","p":1838},{"i":1840,"t":"Motivation","u":"/standards/scs-0103-v1-standard-flavors","h":"#motivation","p":1838},{"i":1842,"t":"Properties (extra specs)","u":"/standards/scs-0103-v1-standard-flavors","h":"#properties-extra-specs","p":1838},{"i":1844,"t":"Standard SCS flavors","u":"/standards/scs-0103-v1-standard-flavors","h":"#standard-scs-flavors","p":1838},{"i":1846,"t":"Mandatory","u":"/standards/scs-0103-v1-standard-flavors","h":"#mandatory","p":1838},{"i":1848,"t":"Recommended","u":"/standards/scs-0103-v1-standard-flavors","h":"#recommended","p":1838},{"i":1850,"t":"Guarantees and properties","u":"/standards/scs-0103-v1-standard-flavors","h":"#guarantees-and-properties","p":1838},{"i":1852,"t":"Remarks","u":"/standards/scs-0103-v1-standard-flavors","h":"#remarks","p":1838},{"i":1854,"t":"Conformance Tests","u":"/standards/scs-0103-v1-standard-flavors","h":"#conformance-tests","p":1838},{"i":1856,"t":"Operational tooling","u":"/standards/scs-0103-v1-standard-flavors","h":"#operational-tooling","p":1838},{"i":1858,"t":"Previous standard versions","u":"/standards/scs-0103-v1-standard-flavors","h":"#previous-standard-versions","p":1838},{"i":1861,"t":"Introduction","u":"/standards/scs-0104-v1-standard-images","h":"#introduction","p":1860},{"i":1863,"t":"Motivation","u":"/standards/scs-0104-v1-standard-images","h":"#motivation","p":1860},{"i":1865,"t":"Uploading custom images","u":"/standards/scs-0104-v1-standard-images","h":"#uploading-custom-images","p":1860},{"i":1867,"t":"Standard images YAML","u":"/standards/scs-0104-v1-standard-images","h":"#standard-images-yaml","p":1860},{"i":1869,"t":"Image specification, single image","u":"/standards/scs-0104-v1-standard-images","h":"#image-specification-single-image","p":1860},{"i":1871,"t":"Image specification, class of images","u":"/standards/scs-0104-v1-standard-images","h":"#image-specification-class-of-images","p":1860},{"i":1873,"t":"Full example","u":"/standards/scs-0104-v1-standard-images","h":"#full-example","p":1860},{"i":1875,"t":"Lifecycle considerations","u":"/standards/scs-0104-v1-standard-images","h":"#lifecycle-considerations","p":1860},{"i":1876,"t":"YAML lifecycle","u":"/standards/scs-0104-v1-standard-images","h":"#yaml-lifecycle","p":1860},{"i":1878,"t":"Image lifecycle","u":"/standards/scs-0104-v1-standard-images","h":"#image-lifecycle","p":1860},{"i":1880,"t":"Conformance Tests","u":"/standards/scs-0104-v1-standard-images","h":"#conformance-tests","p":1860},{"i":1882,"t":"Operational tooling","u":"/standards/scs-0104-v1-standard-images","h":"#operational-tooling","p":1860},{"i":1885,"t":"Introduction","u":"/standards/scs-0110-v1-ssd-flavors","h":"#introduction","p":1884},{"i":1887,"t":"Motivation","u":"/standards/scs-0110-v1-ssd-flavors","h":"#motivation","p":1884},{"i":1889,"t":"Design Considerations","u":"/standards/scs-0110-v1-ssd-flavors","h":"#design-considerations","p":1884},{"i":1890,"t":"Options considered","u":"/standards/scs-0110-v1-ssd-flavors","h":"#options-considered","p":1884},{"i":1892,"t":"Decision","u":"/standards/scs-0110-v1-ssd-flavors","h":"#decision","p":1884},{"i":1894,"t":"Out of Scope","u":"/standards/scs-0110-v1-ssd-flavors","h":"#out-of-scope","p":1884},{"i":1896,"t":"Implementation note","u":"/standards/scs-0110-v1-ssd-flavors","h":"#implementation-note","p":1884},{"i":1898,"t":"Related Documents","u":"/standards/scs-0110-v1-ssd-flavors","h":"#related-documents","p":1884},{"i":1900,"t":"Conformance Tests","u":"/standards/scs-0110-v1-ssd-flavors","h":"#conformance-tests","p":1884},{"i":1903,"t":"Introduction","u":"/standards/scs-0210-v1-k8s-new-version-policy","h":"#introduction","p":1902},{"i":1905,"t":"Motivation","u":"/standards/scs-0210-v1-k8s-new-version-policy","h":"#motivation","p":1902},{"i":1907,"t":"Decision","u":"/standards/scs-0210-v1-k8s-new-version-policy","h":"#decision","p":1902},{"i":1909,"t":"Related Documents","u":"/standards/scs-0210-v1-k8s-new-version-policy","h":"#related-documents","p":1902},{"i":1911,"t":"Conformance Tests","u":"/standards/scs-0210-v1-k8s-new-version-policy","h":"#conformance-tests","p":1902},{"i":1914,"t":"Introduction","u":"/standards/scs-0210-v2-k8s-version-policy","h":"#introduction","p":1913},{"i":1916,"t":"Motivation","u":"/standards/scs-0210-v2-k8s-version-policy","h":"#motivation","p":1913},{"i":1918,"t":"Decision","u":"/standards/scs-0210-v2-k8s-version-policy","h":"#decision","p":1913},{"i":1920,"t":"Related Documents","u":"/standards/scs-0210-v2-k8s-version-policy","h":"#related-documents","p":1913},{"i":1922,"t":"Validation / Conformance","u":"/standards/scs-0210-v2-k8s-version-policy","h":"#validation--conformance","p":1913},{"i":1925,"t":"Introduction","u":"/standards/scs-0111-v1-volume-type-decisions","h":"#introduction","p":1924},{"i":1927,"t":"Motivation","u":"/standards/scs-0111-v1-volume-type-decisions","h":"#motivation","p":1924},{"i":1929,"t":"Design Considerations","u":"/standards/scs-0111-v1-volume-type-decisions","h":"#design-considerations","p":1924},{"i":1931,"t":"Options considered","u":"/standards/scs-0111-v1-volume-type-decisions","h":"#options-considered","p":1924},{"i":1933,"t":"Open questions","u":"/standards/scs-0111-v1-volume-type-decisions","h":"#open-questions","p":1924},{"i":1935,"t":"Decision","u":"/standards/scs-0111-v1-volume-type-decisions","h":"#decision","p":1924},{"i":1937,"t":"Related Documents","u":"/standards/scs-0111-v1-volume-type-decisions","h":"#related-documents","p":1924},{"i":1940,"t":"Introduction","u":"/standards/scs-0211-v1-kaas-default-storage-class","h":"#introduction","p":1939},{"i":1942,"t":"Motivation","u":"/standards/scs-0211-v1-kaas-default-storage-class","h":"#motivation","p":1939},{"i":1944,"t":"Decision","u":"/standards/scs-0211-v1-kaas-default-storage-class","h":"#decision","p":1939},{"i":1946,"t":"Required non-performance-related properties","u":"/standards/scs-0211-v1-kaas-default-storage-class","h":"#required-non-performance-related-properties","p":1939},{"i":1948,"t":"Required performance-related properties","u":"/standards/scs-0211-v1-kaas-default-storage-class","h":"#required-performance-related-properties","p":1939},{"i":1950,"t":"Related Documents","u":"/standards/scs-0211-v1-kaas-default-storage-class","h":"#related-documents","p":1939},{"i":1952,"t":"Conformance Tests","u":"/standards/scs-0211-v1-kaas-default-storage-class","h":"#conformance-tests","p":1939},{"i":1955,"t":"Introduction","u":"/standards/scs-0212-v1-requirements-for-container-registry","h":"#introduction","p":1954},{"i":1957,"t":"Motivation","u":"/standards/scs-0212-v1-requirements-for-container-registry","h":"#motivation","p":1954},{"i":1959,"t":"Design considerations","u":"/standards/scs-0212-v1-requirements-for-container-registry","h":"#design-considerations","p":1954},{"i":1961,"t":"OSS health check","u":"/standards/scs-0212-v1-requirements-for-container-registry","h":"#oss-health-check","p":1954},{"i":1963,"t":"Required and desirable features check","u":"/standards/scs-0212-v1-requirements-for-container-registry","h":"#required-and-desirable-features-check","p":1954},{"i":1965,"t":"Conclusion","u":"/standards/scs-0212-v1-requirements-for-container-registry","h":"#conclusion","p":1954},{"i":1967,"t":"Decision","u":"/standards/scs-0212-v1-requirements-for-container-registry","h":"#decision","p":1954},{"i":1970,"t":"Introduction","u":"/standards/scs-0213-v1-k8s-nodes-anti-affinity","h":"#introduction","p":1969},{"i":1972,"t":"Glossary","u":"/standards/scs-0213-v1-k8s-nodes-anti-affinity","h":"#glossary","p":1969},{"i":1974,"t":"Motivation","u":"/standards/scs-0213-v1-k8s-nodes-anti-affinity","h":"#motivation","p":1969},{"i":1976,"t":"Design considerations","u":"/standards/scs-0213-v1-k8s-nodes-anti-affinity","h":"#design-considerations","p":1969},{"i":1978,"t":"Decision","u":"/standards/scs-0213-v1-k8s-nodes-anti-affinity","h":"#decision","p":1969},{"i":1980,"t":"Documents","u":"/standards/scs-0213-v1-k8s-nodes-anti-affinity","h":"#documents","p":1969},{"i":1983,"t":"Introduction","u":"/standards/scs-0213-v1-requirements-for-testing-cluster-stacks","h":"#introduction","p":1982},{"i":1985,"t":"Motivation","u":"/standards/scs-0213-v1-requirements-for-testing-cluster-stacks","h":"#motivation","p":1982},{"i":1987,"t":"Design Considerations","u":"/standards/scs-0213-v1-requirements-for-testing-cluster-stacks","h":"#design-considerations","p":1982},{"i":1989,"t":"Required Features","u":"/standards/scs-0213-v1-requirements-for-testing-cluster-stacks","h":"#required-features","p":1982},{"i":1991,"t":"Pros and Cons of Different Approaches","u":"/standards/scs-0213-v1-requirements-for-testing-cluster-stacks","h":"#pros-and-cons-of-different-approaches","p":1982},{"i":1993,"t":"IaaS Provider (OpenStack, Hetzner, AWS)","u":"/standards/scs-0213-v1-requirements-for-testing-cluster-stacks","h":"#iaas-provider-openstack-hetzner-aws","p":1982},{"i":1995,"t":"Local Environment (Docker, Kubevirt)","u":"/standards/scs-0213-v1-requirements-for-testing-cluster-stacks","h":"#local-environment-docker-kubevirt","p":1982},{"i":1997,"t":"Beyond Docker: Virtual Machine based Approach","u":"/standards/scs-0213-v1-requirements-for-testing-cluster-stacks","h":"#beyond-docker-virtual-machine-based-approach","p":1982},{"i":1999,"t":"Virtual Machine Based Approach","u":"/standards/scs-0213-v1-requirements-for-testing-cluster-stacks","h":"#virtual-machine-based-approach","p":1982},{"i":2001,"t":"Proposed Path Forward","u":"/standards/scs-0213-v1-requirements-for-testing-cluster-stacks","h":"#proposed-path-forward","p":1982},{"i":2003,"t":"Conclusion","u":"/standards/scs-0213-v1-requirements-for-testing-cluster-stacks","h":"#conclusion","p":1982},{"i":2006,"t":"Introduction","u":"/standards/scs-0214-v1-k8s-node-distribution","h":"#introduction","p":2005},{"i":2008,"t":"Glossary","u":"/standards/scs-0214-v1-k8s-node-distribution","h":"#glossary","p":2005},{"i":2010,"t":"Motivation","u":"/standards/scs-0214-v1-k8s-node-distribution","h":"#motivation","p":2005},{"i":2012,"t":"Design Considerations","u":"/standards/scs-0214-v1-k8s-node-distribution","h":"#design-considerations","p":2005},{"i":2014,"t":"Decision","u":"/standards/scs-0214-v1-k8s-node-distribution","h":"#decision","p":2005},{"i":2016,"t":"Related Documents","u":"/standards/scs-0214-v1-k8s-node-distribution","h":"#related-documents","p":2005},{"i":2018,"t":"Conformance Tests","u":"/standards/scs-0214-v1-k8s-node-distribution","h":"#conformance-tests","p":2005},{"i":2021,"t":"Introduction","u":"/standards/scs-0300-v1-requirements-for-sso-identity-federation","h":"#introduction","p":2020},{"i":2023,"t":"Motivation for this document","u":"/standards/scs-0300-v1-requirements-for-sso-identity-federation","h":"#motivation-for-this-document","p":2020},{"i":2025,"t":"Design Considerations","u":"/standards/scs-0300-v1-requirements-for-sso-identity-federation","h":"#design-considerations","p":2020},{"i":2027,"t":"Options considered","u":"/standards/scs-0300-v1-requirements-for-sso-identity-federation","h":"#options-considered","p":2020},{"i":2029,"t":"Open questions","u":"/standards/scs-0300-v1-requirements-for-sso-identity-federation","h":"#open-questions","p":2020},{"i":2031,"t":"Decision","u":"/standards/scs-0300-v1-requirements-for-sso-identity-federation","h":"#decision","p":2020},{"i":2033,"t":"Related Documents","u":"/standards/scs-0300-v1-requirements-for-sso-identity-federation","h":"#related-documents","p":2020},{"i":2035,"t":"Conformance Tests","u":"/standards/scs-0300-v1-requirements-for-sso-identity-federation","h":"#conformance-tests","p":2020},{"i":2036,"t":"Conformance Tests, OPTIONAL","u":"/standards/scs-0300-v1-requirements-for-sso-identity-federation","h":"#conformance-tests-optional","p":2020},{"i":2038,"t":"Introduction","u":"/standards/scs-0302-v1-domain-manager-role","h":"#introduction","p":2037},{"i":2040,"t":"Glossary","u":"/standards/scs-0302-v1-domain-manager-role","h":"#glossary","p":2037},{"i":2042,"t":"Impact","u":"/standards/scs-0302-v1-domain-manager-role","h":"#impact","p":2037},{"i":2044,"t":"Motivation","u":"/standards/scs-0302-v1-domain-manager-role","h":"#motivation","p":2037},{"i":2046,"t":"Desired Workflow","u":"/standards/scs-0302-v1-domain-manager-role","h":"#desired-workflow","p":2037},{"i":2048,"t":"Design Considerations","u":"/standards/scs-0302-v1-domain-manager-role","h":"#design-considerations","p":2037},{"i":2050,"t":"Options considered","u":"/standards/scs-0302-v1-domain-manager-role","h":"#options-considered","p":2037},{"i":2052,"t":"Open questions","u":"/standards/scs-0302-v1-domain-manager-role","h":"#open-questions","p":2037},{"i":2053,"t":"Limitations","u":"/standards/scs-0302-v1-domain-manager-role","h":"#limitations","p":2037},{"i":2055,"t":"Decision","u":"/standards/scs-0302-v1-domain-manager-role","h":"#decision","p":2037},{"i":2057,"t":"Policy adjustments","u":"/standards/scs-0302-v1-domain-manager-role","h":"#policy-adjustments","p":2037},{"i":2059,"t":"Related Documents","u":"/standards/scs-0302-v1-domain-manager-role","h":"#related-documents","p":2037},{"i":2060,"t":"\"admin\"-ness not properly scoped","u":"/standards/scs-0302-v1-domain-manager-role","h":"#admin-ness-not-properly-scoped","p":2037},{"i":2062,"t":"Consistent and Secure Default RBAC","u":"/standards/scs-0302-v1-domain-manager-role","h":"#consistent-and-secure-default-rbac","p":2037},{"i":2064,"t":"Conformance Tests","u":"/standards/scs-0302-v1-domain-manager-role","h":"#conformance-tests","p":2037},{"i":2066,"t":"Appendix","u":"/standards/scs-0302-v1-domain-manager-role","h":"#appendix","p":2037},{"i":2067,"t":"Decision Record","u":"/standards/scs-0302-v1-domain-manager-role","h":"#decision-record","p":2037},{"i":2070,"t":"Introduction","u":"/standards/scs-0301-v1-naming-conventions","h":"#introduction","p":2069},{"i":2072,"t":"Motivation","u":"/standards/scs-0301-v1-naming-conventions","h":"#motivation","p":2069},{"i":2074,"t":"Design Considerations","u":"/standards/scs-0301-v1-naming-conventions","h":"#design-considerations","p":2069},{"i":2076,"t":"Options considered","u":"/standards/scs-0301-v1-naming-conventions","h":"#options-considered","p":2069},{"i":2078,"t":"Open questions","u":"/standards/scs-0301-v1-naming-conventions","h":"#open-questions","p":2069},{"i":2080,"t":"Decision","u":"/standards/scs-0301-v1-naming-conventions","h":"#decision","p":2069},{"i":2082,"t":"Related Documents","u":"/standards/scs-0301-v1-naming-conventions","h":"#related-documents","p":2069},{"i":2084,"t":"Conformance Tests","u":"/standards/scs-0301-v1-naming-conventions","h":"#conformance-tests","p":2069},{"i":2087,"t":"Introduction","u":"/standards/scs-0400-v1-status-page-create-decision","h":"#introduction","p":2086},{"i":2089,"t":"Existing Applications","u":"/standards/scs-0400-v1-status-page-create-decision","h":"#existing-applications","p":2086},{"i":2091,"t":"Decision","u":"/standards/scs-0400-v1-status-page-create-decision","h":"#decision","p":2086},{"i":2093,"t":"Status Page Requirements","u":"/standards/scs-0400-v1-status-page-create-decision","h":"#status-page-requirements","p":2086},{"i":2095,"t":"Comparison matrix","u":"/standards/scs-0400-v1-status-page-create-decision","h":"#comparison-matrix","p":2086},{"i":2098,"t":"Introduction","u":"/standards/scs-0402-v1-status-page-openapi-spec-decision","h":"#introduction","p":2097},{"i":2100,"t":"Requirements","u":"/standards/scs-0402-v1-status-page-openapi-spec-decision","h":"#requirements","p":2097},{"i":2102,"t":"Motivation","u":"/standards/scs-0402-v1-status-page-openapi-spec-decision","h":"#motivation","p":2097},{"i":2104,"t":"Decision","u":"/standards/scs-0402-v1-status-page-openapi-spec-decision","h":"#decision","p":2097},{"i":2105,"t":"Common definitions","u":"/standards/scs-0402-v1-status-page-openapi-spec-decision","h":"#common-definitions","p":2097},{"i":2107,"t":"API objects","u":"/standards/scs-0402-v1-status-page-openapi-spec-decision","h":"#api-objects","p":2097},{"i":2109,"t":"API object fields","u":"/standards/scs-0402-v1-status-page-openapi-spec-decision","h":"#api-object-fields","p":2097},{"i":2111,"t":"Endpoint naming","u":"/standards/scs-0402-v1-status-page-openapi-spec-decision","h":"#endpoint-naming","p":2097},{"i":2113,"t":"Phase list","u":"/standards/scs-0402-v1-status-page-openapi-spec-decision","h":"#phase-list","p":2097},{"i":2115,"t":"Labels","u":"/standards/scs-0402-v1-status-page-openapi-spec-decision","h":"#labels","p":2097},{"i":2117,"t":"Impact","u":"/standards/scs-0402-v1-status-page-openapi-spec-decision","h":"#impact","p":2097},{"i":2119,"t":"Component impacts","u":"/standards/scs-0402-v1-status-page-openapi-spec-decision","h":"#component-impacts","p":2097},{"i":2121,"t":"Return of POST requests","u":"/standards/scs-0402-v1-status-page-openapi-spec-decision","h":"#return-of-post-requests","p":2097},{"i":2123,"t":"Return of PATCH requestes","u":"/standards/scs-0402-v1-status-page-openapi-spec-decision","h":"#return-of-patch-requestes","p":2097},{"i":2125,"t":"PATCH vs PUT for updating resources","u":"/standards/scs-0402-v1-status-page-openapi-spec-decision","h":"#patch-vs-put-for-updating-resources","p":2097},{"i":2127,"t":"Authentication and authorization","u":"/standards/scs-0402-v1-status-page-openapi-spec-decision","h":"#authentication-and-authorization","p":2097},{"i":2130,"t":"Introduction","u":"/standards/scs-0410-v1-gnocchi-as-metering-database","h":"#introduction","p":2129},{"i":2132,"t":"Definitions","u":"/standards/scs-0410-v1-gnocchi-as-metering-database","h":"#definitions","p":2129},{"i":2134,"t":"Motivation","u":"/standards/scs-0410-v1-gnocchi-as-metering-database","h":"#motivation","p":2129},{"i":2136,"t":"Design Considerations","u":"/standards/scs-0410-v1-gnocchi-as-metering-database","h":"#design-considerations","p":2129},{"i":2138,"t":"Options","u":"/standards/scs-0410-v1-gnocchi-as-metering-database","h":"#options","p":2129},{"i":2140,"t":"Decision","u":"/standards/scs-0410-v1-gnocchi-as-metering-database","h":"#decision","p":2129},{"i":2142,"t":"Open questions","u":"/standards/scs-0410-v1-gnocchi-as-metering-database","h":"#open-questions","p":2129},{"i":2144,"t":"Related Documents","u":"/standards/scs-0410-v1-gnocchi-as-metering-database","h":"#related-documents","p":2129},{"i":2146,"t":"Conformance Tests","u":"/standards/scs-0410-v1-gnocchi-as-metering-database","h":"#conformance-tests","p":2129},{"i":2149,"t":"Introduction","u":"/standards/scs-0401-v1-status-page-reference-implementation-decision","h":"#introduction","p":2148},{"i":2151,"t":"Motivation","u":"/standards/scs-0401-v1-status-page-reference-implementation-decision","h":"#motivation","p":2148},{"i":2153,"t":"Decision","u":"/standards/scs-0401-v1-status-page-reference-implementation-decision","h":"#decision","p":2148},{"i":2154,"t":"Programming Language","u":"/standards/scs-0401-v1-status-page-reference-implementation-decision","h":"#programming-language","p":2148},{"i":2156,"t":"Database","u":"/standards/scs-0401-v1-status-page-reference-implementation-decision","h":"#database","p":2148},{"i":2159,"t":"Introduction","u":"/standards/scs-0411-v1-publishing_method_for_metering_data","h":"#introduction","p":2158},{"i":2161,"t":"Definitions","u":"/standards/scs-0411-v1-publishing_method_for_metering_data","h":"#definitions","p":2158},{"i":2163,"t":"Motivation","u":"/standards/scs-0411-v1-publishing_method_for_metering_data","h":"#motivation","p":2158},{"i":2165,"t":"Design Considerations","u":"/standards/scs-0411-v1-publishing_method_for_metering_data","h":"#design-considerations","p":2158},{"i":2167,"t":"Options","u":"/standards/scs-0411-v1-publishing_method_for_metering_data","h":"#options","p":2158},{"i":2169,"t":"Open questions","u":"/standards/scs-0411-v1-publishing_method_for_metering_data","h":"#open-questions","p":2158},{"i":2171,"t":"Decision","u":"/standards/scs-0411-v1-publishing_method_for_metering_data","h":"#decision","p":2158},{"i":2173,"t":"Related Documents","u":"/standards/scs-0411-v1-publishing_method_for_metering_data","h":"#related-documents","p":2158},{"i":2175,"t":"Conformance Tests","u":"/standards/scs-0411-v1-publishing_method_for_metering_data","h":"#conformance-tests","p":2158},{"i":2178,"t":"Introduction","u":"/standards/scs-XXXX-vN-template","h":"#introduction","p":2177},{"i":2180,"t":"Motivation","u":"/standards/scs-XXXX-vN-template","h":"#motivation","p":2177},{"i":2182,"t":"Design Considerations","u":"/standards/scs-XXXX-vN-template","h":"#design-considerations","p":2177},{"i":2184,"t":"Options considered","u":"/standards/scs-XXXX-vN-template","h":"#options-considered","p":2177},{"i":2186,"t":"Open questions","u":"/standards/scs-XXXX-vN-template","h":"#open-questions","p":2177},{"i":2188,"t":"Decision","u":"/standards/scs-XXXX-vN-template","h":"#decision","p":2177},{"i":2190,"t":"Related Documents","u":"/standards/scs-XXXX-vN-template","h":"#related-documents","p":2177},{"i":2192,"t":"Conformance Tests","u":"/standards/scs-XXXX-vN-template","h":"#conformance-tests","p":2177},{"i":2195,"t":"Introduction","u":"/standards/scs-0412-v1-metering-json","h":"#introduction","p":2194},{"i":2197,"t":"Motivation","u":"/standards/scs-0412-v1-metering-json","h":"#motivation","p":2194},{"i":2199,"t":"Design Considerations","u":"/standards/scs-0412-v1-metering-json","h":"#design-considerations","p":2194},{"i":2201,"t":"Options considered","u":"/standards/scs-0412-v1-metering-json","h":"#options-considered","p":2194},{"i":2203,"t":"Open questions","u":"/standards/scs-0412-v1-metering-json","h":"#open-questions","p":2194},{"i":2205,"t":"Decision","u":"/standards/scs-0412-v1-metering-json","h":"#decision","p":2194},{"i":2207,"t":"Related Documents","u":"/standards/scs-0412-v1-metering-json","h":"#related-documents","p":2194},{"i":2209,"t":"Conformance Tests","u":"/standards/scs-0412-v1-metering-json","h":"#conformance-tests","p":2194},{"i":2213,"t":"Stabilized Standards","u":"/standards/standards/overview","h":"#stabilized-standards","p":2211},{"i":2215,"t":"Drafts","u":"/standards/standards/overview","h":"#drafts","p":2211}],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[["t/5",[0,5.848,1,2.973,2,4.858]],["t/6",[3,3.708,4,4.661,5,3.291,6,4.661]],["t/8",[7,6.383,8,6.928]],["t/10",[7,6.383,9,6.024]],["t/13",[2,4.858,10,5.848,11,3.805]],["t/17",[5,3.805,12,4.858,13,4.858]],["t/19",[14,7.389]],["t/20",[15,5.623]],["t/22",[16,5.832]],["t/24",[16,4.755,17,4.37]],["t/26",[18,6.392]],["t/28",[19,8.498]],["t/29",[16,4.755,17,4.37]],["t/31",[18,6.392]],["t/34",[20,3.472,21,3.191,22,3.347,23,3.917]],["t/35",[23,5.364,24,6.383]],["t/37",[25,4.527,26,4.527,27,5.848]],["t/39",[28,6.083]],["t/42",[14,3.131,20,2.472,21,2.271,29,3.318,30,3.131,31,3.601,32,1.988]],["t/43",[33,6.383,34,5.364]],["t/45",[35,5.756,36,6.024]],["t/47",[20,4.013,21,3.688,22,3.869]],["t/50",[33,6.383,34,5.364]],["t/52",[35,5.756,36,6.024]],["t/54",[23,5.364,24,6.383]],["t/58",[12,4.203,37,5.059,38,3.291,39,5.059]],["t/60",[40,7.83]],["t/61",[18,5.211,41,4.959]],["t/63",[40,4.107,42,4.458,43,4.458,44,4.458,45,4.458]],["t/65",[46,5.059,47,5.059,48,3.917,49,5.059]],["t/67",[50,8.498]],["t/69",[15,5.623]],["t/71",[51,8.498]],["t/73",[18,3.353,52,3.353,53,4.458,54,3.876,55,4.458]],["t/75",[52,3.805,56,2.852,57,4.047,58,2.985]],["t/77",[52,4.398,59,4.527,60,4.398]],["t/82",[61,5.542,62,6.928]],["t/86",[32,2.461,63,3.19,64,2.949,65,2.569,66,3.19]],["t/88",[64,3.869,65,3.37,67,4.527]],["t/89",[32,2.793,63,3.621,64,3.347,68,3.061]],["t/91",[32,2.199,57,3.187,63,2.852,69,2.997,70,3.984,71,3.984]],["t/93",[65,3.37,69,4.398,72,4.095]],["t/95",[2,4.858,65,3.37,73,4.858]],["t/99",[60,5.211,74,5.756]],["t/102",[75,4.858,76,5.848,77,5.848]],["t/103",[78,4.959,79,4.959]],["t/105",[79,4.959,80,3.948]],["t/107",[79,3.621,81,4.661,82,2.639,83,5.059]],["t/109",[20,4.013,21,3.688,79,4.186]],["t/111",[32,3.228,79,4.186,84,3.745]],["t/113",[3,4.286,32,3.228,79,4.186]],["t/115",[32,3.228,82,3.051,85,5.848]],["t/119",[86,6.928,87,6.024]],["t/121",[9,6.024,88,6.383]],["t/125",[80,4.843]],["t/127",[89,4.666,90,6.383]],["t/128",[32,1.988,63,2.578,64,2.383,89,2.425,91,3.601,92,2.992,93,3.601]],["t/130",[32,2.461,63,3.19,69,3.353,94,4.458,95,3.353]],["t/132",[32,2.461,63,3.19,73,3.703,89,3.002,96,4.107]],["t/134",[21,2.513,32,2.199,63,2.852,97,3.464,98,2.852,99,3.31]],["t/137",[100,8.498]],["t/139",[101,8.498]],["t/141",[102,8.498]],["t/145",[103,6.024,104,4.584]],["t/147",[105,6.928,106,6.928]],["t/149",[58,2.985,107,4.661,108,4.399,109,4.203]],["t/151",[107,6.383,110,6.928]],["t/153",[15,4.584,111,6.024]],["t/155",[15,3.869,111,5.085,112,5.388]],["t/157",[113,4.527,114,5.848,115,3.938]],["t/159",[15,4.584,116,6.928]],["t/161",[117,5.085,118,5.848,119,4.858]],["t/167",[120,5.756,121,6.383]],["t/170",[122,5.059,123,5.059,124,5.059,125,5.059]],["t/174",[126,8.498]],["t/176",[127,8.498]],["t/178",[128,8.498]],["t/180",[129,3.984,130,3.464,131,3.984,132,3.464,133,3.984,134,3.984]],["t/182",[135,8.498]],["t/184",[136,4.458,137,4.458,138,4.458,139,3.876,140,4.458]],["t/186",[32,2.793,139,6.497,141,4.399]],["t/188",[120,5.756,121,6.383]],["t/192",[68,2.697,142,4.458,143,3.451,144,3.19,145,3.122]],["t/194",[68,4.191,146,6.928]],["t/196",[68,2.697,143,3.451,144,3.19,145,3.122,147,4.458]],["t/198",[68,4.191,148,6.928]],["t/199",[149,6.928,150,6.383]],["t/201",[150,6.383,151,6.928]],["t/203",[68,2.697,97,3.876,143,3.451,144,3.19,145,3.122]],["t/205",[68,3.061,144,3.621,152,4.661,153,4.661]],["t/207",[64,3.869,68,3.538,154,5.388]],["t/209",[68,3.538,155,5.848,156,3.869]],["t/211",[68,2.697,73,3.703,143,3.451,144,3.19,145,3.122]],["t/213",[68,3.538,152,5.388,157,5.848]],["t/215",[68,2.697,69,3.353,143,3.451,144,3.19,145,3.122]],["t/217",[68,4.191,158,6.024]],["t/218",[156,4.584,159,6.928]],["t/220",[158,6.024,160,6.928]],["t/222",[156,3.869,158,5.085,161,5.848]],["t/224",[68,3.538,69,4.398,154,5.388]],["t/226",[64,2.949,68,2.697,143,3.451,144,3.19,145,3.122]],["t/228",[64,2.949,68,2.697,144,3.19,145,3.122,162,4.458]],["t/230",[68,2.697,144,3.19,145,3.122,163,4.107,164,4.107]],["t/232",[30,4.399,68,3.061,145,3.543,164,4.661]],["t/234",[68,4.191,145,4.852]],["t/240",[22,3.347,32,2.793,64,3.347,165,3.917]],["t/242",[69,5.211,166,6.024]],["t/246",[64,4.584,167,5.542]],["t/248",[168,4.107,169,3.876,170,4.458,171,4.458,172,4.458]],["t/250",[167,3.566,173,4.107,174,4.458,175,4.458,176,4.458]],["t/252",[16,3.059,177,4.107,178,3.566,179,4.458,180,3.451]],["t/254",[16,2.472,22,2.383,23,2.788,34,2.788,180,2.788,181,3.318,182,2.881]],["t/256",[1,2.026,180,3.084,183,3.984,184,3.984,185,3.671,186,3.187]],["t/259",[]],["t/261",[1,3.523,187,6.928]],["t/263",[28,4.959,188,5.077]],["t/264",[189,4.138,190,5.211]],["t/266",[1,2.973,5,3.805,191,5.085]],["t/268",[1,3.523,98,4.959]],["t/270",[192,4.087,193,6.383]],["t/271",[192,2.63,194,4.458,195,4.107,196,4.458,197,4.458]],["t/273",[64,2.949,192,2.63,195,4.107,198,4.107,199,4.458]],["t/275",[69,3.353,192,2.63,200,4.107,201,4.107,202,4.458]],["t/277",[73,3.703,192,2.63,198,4.107,200,4.107,203,4.458]],["t/279",[97,3.876,192,2.63,201,4.107,204,4.458,205,4.458]],["t/281",[193,7.83]],["t/283",[3,5.077,206,6.383]],["t/285",[207,3.332,208,3.332,209,4.527]],["t/287",[38,4.508,210,6.024]],["t/289",[13,7.06]],["t/293",[48,5.364,211,6.928]],["t/295",[]],["t/297",[80,3.948,212,5.756]],["t/299",[213,5.952]],["t/301",[214,7.83]],["t/303",[215,5.059,216,4.203,217,4.661,218,5.059]],["t/306",[212,7.06]],["t/308",[]],["t/310",[21,5.36]],["t/312",[52,3.805,219,5.059,220,5.059,221,4.661]],["t/314",[18,6.392]],["t/316",[54,7.389]],["t/318",[222,6.798]],["t/324",[20,3.472,130,4.399,223,3.191,224,4.661]],["t/326",[20,4.013,59,4.527,130,5.085]],["t/328",[225,5.085,226,5.085,227,5.085]],["t/330",[117,4.399,228,4.203,229,4.661,230,4.047]],["t/334",[84,5.442]],["t/336",[54,7.389]],["t/338",[222,6.798]],["t/340",[231,7.83]],["t/342",[222,5.542,232,5.756]],["t/344",[233,8.498]],["t/347",[61,3.187,163,3.671,209,3.084,234,3.671,235,3.671,236,3.984]],["t/349",[209,4.527,235,5.388,237,5.388]],["t/351",[186,4.047,238,4.399,239,3.022,240,5.059]],["t/353",[216,5.756,239,4.138]],["t/355",[241,6.383,242,5.211]],["t/357",[243,6.928,244,6.928]],["t/361",[59,5.364,245,5.756]],["t/362",[56,3.905,246,5.211]],["t/364",[56,3.905,247,6.928]],["t/366",[56,3.905,248,6.383]],["t/368",[22,4.584,56,3.905]],["t/370",[56,3.905,249,6.928]],["t/372",[56,3.905,250,5.756]],["t/374",[56,3.905,251,6.928]],["t/376",[252,7.83]],["t/378",[56,3.905,253,6.928]],["t/380",[56,3.905,254,6.928]],["t/382",[56,3.905,255,6.928]],["t/384",[189,4.138,245,5.756]],["t/385",[56,3.905,256,4.852]],["t/387",[56,3.296,256,4.095,257,5.848]],["t/389",[56,3.296,208,3.332,256,4.095]],["t/391",[26,4.527,56,3.296,256,4.095]],["t/393",[56,3.296,256,4.095,258,5.848]],["t/395",[245,5.756,259,6.928]],["t/396",[56,3.905,260,6.928]],["t/398",[56,3.905,261,6.928]],["t/400",[56,3.905,262,6.928]],["t/402",[56,3.296,216,4.858,263,5.848]],["t/404",[56,3.296,264,5.388,265,5.085]],["t/406",[56,3.905,266,6.928]],["t/408",[56,3.905,115,4.666]],["t/411",[267,4.527,268,4.527,269,3.688]],["t/413",[78,2.852,113,3.084,270,3.984,271,3.984,272,2.683,273,3.984]],["t/415",[99,4.203,113,3.917,223,3.191,274,4.661]],["t/417",[99,3.703,113,3.451,223,2.811,239,2.662,275,4.107]],["t/419",[113,5.364,239,4.138]],["t/425",[272,5.723]],["t/427",[2,4.858,14,5.085,272,3.938]],["t/429",[272,4.666,276,6.928]],["t/431",[232,5.756,272,4.666]],["t/435",[80,4.843]],["t/437",[272,4.666,277,5.756]],["t/439",[189,3.493,239,3.493,246,4.398]],["t/441",[252,7.83]],["t/443",[81,6.383,278,5.364]],["t/446",[67,3.084,239,2.38,279,3.464,280,3.671,281,3.984,282,3.464]],["t/452",[132,3.464,223,2.513,239,3.721,283,3.31,284,3.671]],["t/454",[41,4.186,223,3.688,283,4.858]],["t/456",[285,6.928,286,5.542]],["t/458",[287,5.848,288,5.388,289,4.858]],["t/460",[41,4.186,239,3.493,284,5.388]],["t/461",[268,4.527,269,3.688,286,4.678]],["t/463",[79,3.621,269,3.191,290,3.472,291,3.708]],["t/465",[82,2.639,269,3.191,290,3.472,291,3.708]],["t/467",[241,5.388,292,5.848,293,4.678]],["t/473",[58,1.938,84,3.421,191,2.857,239,1.963,294,3.027,295,3.286,296,3.286]],["t/477",[297,7.06]],["t/485",[186,5.542,230,5.542]],["t/487",[82,3.614,84,4.436]],["t/488",[298,8.498]],["t/490",[224,6.383,299,6.383]],["t/496",[300,8.498]],["t/497",[212,7.06]],["t/499",[63,6.083]],["t/518",[1,3.523,301,6.928]],["t/520",[1,3.523,302,6.928]],["t/522",[1,3.523,303,6.928]],["t/524",[5,3.291,207,2.883,272,3.407,304,4.661]],["t/526",[1,2.973,207,3.332,305,5.085]],["t/528",[1,1.831,5,2.343,272,2.425,306,2.992,307,3.318,308,3.318,309,3.601]],["t/530",[1,1.831,5,2.343,58,2.125,272,2.425,310,3.318,311,3.601,312,3.601]],["t/532",[28,4.186,188,4.286,313,5.085]],["t/534",[1,2.026,28,2.852,58,2.35,188,2.92,304,3.671,314,3.671]],["t/536",[28,2.852,58,2.35,165,3.084,166,3.464,188,2.92,315,3.31]],["t/538",[165,5.364,313,6.024]],["t/540",[75,4.858,165,4.527,315,4.858]],["t/542",[166,4.399,313,4.399,315,4.203,316,3.917]],["t/544",[1,2.266,21,2.811,141,3.876,317,3.876,318,4.458]],["t/546",[1,2.266,5,2.9,21,2.811,58,2.63,317,3.876]],["t/548",[1,1.831,5,2.343,21,2.271,58,2.125,310,3.318,317,3.131,319,3.318]],["t/550",[67,3.917,305,4.399,320,4.661,321,4.661]],["t/560",[322,4.307,323,6.928]],["t/562",[322,3.635,324,5.388,325,5.848]],["t/564",[283,4.858,322,3.635,326,5.848]],["t/566",[322,4.307,327,6.928]],["t/568",[322,3.635,328,5.388,329,5.848]],["t/570",[322,3.635,328,5.388,330,4.286]],["t/572",[322,3.635,330,4.286,331,5.388]],["t/574",[223,3.688,322,3.635,330,4.286]],["t/576",[226,5.085,322,3.635,332,4.858]],["t/578",[182,5.542,322,4.307]],["t/580",[178,6.798]],["t/582",[333,6.383,334,6.928]],["t/584",[167,6.798]],["t/586",[335,6.798]],["t/588",[336,6.228]],["t/590",[337,6.083]],["t/592",[338,7.389]],["t/594",[339,7.389]],["t/596",[340,7.389]],["t/598",[341,8.498]],["t/600",[337,4.959,342,4.755]],["t/602",[343,8.498]],["t/605",[78,6.083]],["t/607",[89,5.723]],["t/609",[15,5.623]],["t/611",[322,5.283]],["t/613",[59,4.527,104,3.869,344,5.388]],["t/619",[80,4.843]],["t/621",[17,3.191,22,3.347,335,4.047,345,2.765]],["t/623",[25,4.527,26,4.527,346,5.388]],["t/625",[20,4.755,21,4.37]],["t/627",[322,4.307,345,3.787]],["t/629",[1,2.973,207,3.332,345,3.196]],["t/631",[345,3.196,347,4.858,348,4.858]],["t/633",[345,2.765,347,4.203,348,4.203,349,4.203]],["t/635",[350,6.579]],["t/637",[15,5.623]],["t/638",[345,3.787,351,6.383]],["t/640",[41,4.959,345,3.787]],["t/644",[352,7.06]],["t/645",[297,5.756,353,5.542]],["t/652",[354,6.928,355,6.928]],["t/654",[61,6.798]],["t/656",[356,8.498]],["t/658",[17,4.37,357,6.383]],["t/660",[358,6.024,359,5.077]],["t/664",[360,8.498]],["t/666",[156,5.623]],["t/668",[361,6.928,362,6.928]],["t/669",[363,6.928,364,6.024]],["t/671",[365,8.498]],["t/675",[366,5.388,367,4.858,368,5.085]],["t/676",[369,8.498]],["t/678",[286,5.542,368,6.024]],["t/682",[17,3.191,21,3.191,80,2.883,370,4.661]],["t/684",[17,3.688,371,4.013,372,5.848]],["t/688",[156,5.623]],["t/690",[230,6.798]],["t/698",[223,5.36]],["t/700",[373,7.83]],["t/701",[283,5.756,374,6.383]],["t/702",[48,5.364,374,6.383]],["t/703",[330,4.286,375,5.388,376,5.388]],["t/707",[84,3.745,95,4.398,377,5.848]],["t/709",[84,3.239,95,3.805,246,3.805,290,3.472]],["t/711",[95,5.211,378,6.024]],["t/713",[379,7.83]],["t/715",[58,4.087,380,6.928]],["t/717",[56,3.905,87,6.024]],["t/719",[381,6.383,382,5.756]],["t/721",[371,5.832]],["t/723",[113,6.579]],["t/725",[84,3.239,95,3.805,277,4.203,290,3.472]],["t/726",[223,4.37,272,4.666]],["t/728",[383,7.83]],["t/731",[64,2.383,320,3.318,345,1.968,384,3.318,385,2.881,386,3.601,387,3.601]],["t/734",[192,4.087,388,6.024]],["t/736",[389,5.756,390,6.024]],["t/738",[22,3.869,390,5.085,391,5.388]],["t/743",[332,5.756,364,6.024]],["t/745",[17,4.37,84,4.436]],["t/748",[112,5.388,223,3.688,392,5.388]],["t/750",[180,5.364,393,5.756]],["t/752",[22,5.623]],["t/753",[178,6.798]],["t/759",[20,4.755,21,4.37]],["t/766",[16,4.013,72,4.095,246,4.398]],["t/768",[84,3.745,332,4.858,394,5.848]],["t/770",[395,7.83]],["t/772",[186,6.798]],["t/776",[80,4.843]],["t/777",[5,4.508,34,5.364]],["t/779",[5,4.508,13,5.756]],["t/781",[277,7.06]],["t/782",[396,8.498]],["t/784",[232,5.756,397,6.928]],["t/786",[20,4.755,21,4.37]],["t/788",[84,5.442]],["t/790",[376,7.83]],["t/792",[398,8.498]],["t/794",[399,7.83]],["t/796",[15,5.623]],["t/797",[34,5.364,400,6.383]],["t/799",[401,7.83]],["t/801",[35,5.756,393,5.756]],["t/803",[15,4.584,279,6.024]],["t/804",[269,4.37,293,5.542]],["t/806",[17,4.37,186,5.542]],["t/808",[17,4.37,286,5.542]],["t/810",[402,7.389]],["t/811",[403,5.848,404,5.388,405,5.388]],["t/813",[406,5.059,407,5.059,408,3.917,409,4.399]],["t/815",[371,5.832]],["t/817",[410,7.83]],["t/818",[192,4.087,267,5.364]],["t/820",[17,4.37,411,5.756]],["t/822",[28,4.959,412,6.928]],["t/824",[222,5.542,413,6.024]],["t/828",[80,4.843]],["t/830",[66,6.083]],["t/832",[89,5.723]],["t/833",[89,3.938,414,5.848,415,5.388]],["t/835",[89,4.666,416,6.024]],["t/837",[15,5.623]],["t/838",[17,3.191,34,3.917,400,4.661,417,5.059]],["t/840",[401,7.83]],["t/842",[245,4.858,364,5.085,418,5.848]],["t/844",[345,3.196,419,5.848,420,5.848]],["t/846",[286,6.798]],["t/848",[399,7.83]],["t/849",[58,2.63,332,3.703,421,4.458,422,4.458,423,4.458]],["t/851",[265,5.085,385,4.678,424,4.398]],["t/853",[402,7.389]],["t/855",[98,6.083]],["t/859",[416,6.024,425,6.928]],["t/862",[20,4.755,21,4.37]],["t/866",[80,3.332,89,3.938,368,5.085]],["t/868",[84,3.745,95,4.398,426,5.848]],["t/872",[17,4.37,357,6.383]],["t/876",[32,2.461,427,4.107,428,4.107,429,4.107,430,4.107]],["t/878",[227,7.389]],["t/880",[431,7.83]],["t/882",[432,7.83]],["t/884",[433,7.83]],["t/886",[434,7.83]],["t/890",[389,7.06]],["t/892",[435,7.389]],["t/894",[436,7.389]],["t/897",[11,4.508,437,6.383]],["t/899",[58,4.087,225,6.024]],["t/903",[22,4.584,61,5.542]],["t/905",[167,6.798]],["t/907",[335,6.798]],["t/909",[438,5.141]],["t/911",[439,6.798]],["t/913",[340,7.389]],["t/915",[339,7.389]],["t/917",[338,7.389]],["t/919",[352,7.06]],["t/921",[178,6.798]],["t/925",[216,5.756,330,5.077]],["t/927",[242,6.392]],["t/929",[395,7.83]],["t/932",[115,3.938,324,5.388,440,5.848]],["t/935",[305,6.024,441,6.928]],["t/937",[192,3.45,337,4.186,442,5.085]],["t/939",[59,5.364,242,5.211]],["t/940",[78,3.621,239,3.022,443,5.059,444,5.059]],["t/942",[228,4.858,445,5.848,446,5.848]],["t/944",[447,5.848,448,5.388,449,5.085]],["t/946",[330,4.286,450,5.848,451,4.527]],["t/948",[60,3.805,452,5.059,453,5.059,454,3.917]],["t/949",[26,3.451,454,3.451,455,4.458,456,4.458,457,4.107]],["t/951",[221,4.107,454,3.451,458,4.458,459,4.107,460,3.703]],["t/953",[256,3.543,454,3.917,460,4.203,461,3.708]],["t/955",[23,2.339,58,1.782,306,2.51,454,2.339,460,4.144,461,3.655,462,3.021]],["t/957",[23,2.788,58,2.125,460,4.779,463,2.639,464,3.318,465,3.318]],["t/959",[58,2.35,459,3.671,463,2.92,464,3.671,465,3.671,466,3.984]],["t/961",[103,5.085,242,4.398,342,4.013]],["t/962",[153,4.661,239,3.022,342,3.472,367,4.203]],["t/964",[342,4.663,451,3.451,467,4.458,468,4.458]],["t/966",[58,2.35,290,2.734,337,2.852,342,2.734,469,3.464,470,2.92]],["t/967",[58,2.63,337,3.19,342,3.059,470,3.267,471,3.122]],["t/968",[342,4.013,472,5.388,473,5.848]],["t/969",[330,3.708,342,3.472,451,3.917,471,3.543]],["t/970",[342,2.073,349,2.51,471,3.493,474,2.417,475,3.021,476,3.021,477,3.021,478,2.783]],["t/972",[307,3.318,342,2.472,471,2.522,472,3.318,479,3.601,480,3.601,481,2.992]],["t/974",[117,5.085,474,4.678,482,5.848]],["t/976",[342,4.755,478,6.383]],["t/977",[48,4.527,242,4.398,439,4.678]],["t/978",[48,4.527,439,4.678,483,5.388]],["t/980",[484,5.848,485,5.085,486,4.678]],["t/982",[21,2.811,48,3.451,439,3.566,448,4.107,449,3.876]],["t/984",[25,3.451,487,4.458,488,4.458,489,4.458,490,4.458]],["t/986",[449,2.857,485,4.646,491,3.286,492,3.286,493,3.286,494,3.286,495,3.286]],["t/988",[242,4.398,359,4.286,496,5.848]],["t/990",[84,4.436,359,5.077]],["t/992",[119,4.858,483,5.388,497,5.085]],["t/994",[486,5.542,498,6.928]],["t/996",[246,4.398,359,4.286,499,5.848]],["t/998",[359,4.286,370,5.388,500,5.388]],["t/1000",[359,5.077,501,6.928]],["t/1002",[359,3.708,405,4.661,485,4.399,502,5.059]],["t/1004",[26,3.084,119,3.31,246,2.997,306,3.31,497,3.464,503,3.671]],["t/1006",[119,3.31,288,3.671,293,3.187,359,4.566,497,3.464]],["t/1008",[279,6.024,504,6.928]],["t/1009",[58,1.938,84,2.104,246,2.471,336,2.408,337,2.352,454,2.544,457,3.027,470,2.408]],["t/1011",[58,2.63,336,3.267,337,3.19,505,3.703,506,4.107]],["t/1013",[239,3.493,337,4.186,507,5.388]],["t/1015",[239,2.662,337,3.19,416,3.876,507,4.107,508,4.107]],["t/1017",[120,5.756,321,6.383]],["t/1021",[470,6.228]],["t/1023",[509,8.498]],["t/1025",[316,6.579]],["t/1027",[248,7.83]],["t/1030",[470,6.228]],["t/1031",[408,6.579]],["t/1033",[470,3.708,510,7.472,511,4.661]],["t/1035",[316,6.579]],["t/1037",[389,7.06]],["t/1040",[115,5.723]],["t/1042",[391,6.383,512,6.383]],["t/1046",[17,4.37,471,4.852]],["t/1050",[78,6.083]],["t/1052",[89,5.723]],["t/1054",[15,5.623]],["t/1056",[322,5.283]],["t/1058",[59,4.527,104,3.869,344,5.388]],["t/1062",[80,4.843]],["t/1064",[17,3.191,22,3.347,335,4.047,345,2.765]],["t/1066",[25,4.527,26,4.527,346,5.388]],["t/1068",[20,4.755,21,4.37]],["t/1070",[322,4.307,345,3.787]],["t/1072",[1,2.973,207,3.332,345,3.196]],["t/1074",[345,3.196,347,4.858,348,4.858]],["t/1076",[345,2.765,347,4.203,348,4.203,349,4.203]],["t/1078",[350,6.579]],["t/1080",[15,5.623]],["t/1081",[345,3.787,351,6.383]],["t/1083",[41,4.959,345,3.787]],["t/1086",[352,7.06]],["t/1087",[297,5.756,353,5.542]],["t/1092",[353,4.047,513,4.661,514,5.059,515,5.059]],["t/1098",[17,3.688,290,4.013,469,5.085]],["t/1100",[290,3.472,316,3.917,345,2.765,469,4.399]],["t/1104",[293,5.542,516,6.928]],["t/1106",[373,6.383,383,6.383]],["t/1108",[336,5.077,470,5.077]],["t/1111",[192,4.087,517,6.383]],["t/1113",[56,3.905,192,4.087]],["t/1115",[192,4.087,388,6.024]],["t/1117",[192,3.45,371,4.013,518,5.388]],["t/1119",[89,5.723]],["t/1121",[15,5.623]],["t/1123",[156,5.623]],["t/1125",[95,3.805,192,2.985,349,4.203,371,3.472]],["t/1129",[52,5.211,519,6.383]],["t/1132",[470,6.228]],["t/1134",[103,6.024,104,4.584]],["t/1136",[108,6.024,109,5.756]],["t/1138",[109,7.06]],["t/1140",[115,4.666,230,5.542]],["t/1142",[520,8.498]],["t/1143",[87,6.024,333,6.383]],["t/1144",[521,7.83]],["t/1146",[89,5.723]],["t/1148",[408,4.527,451,4.527,461,4.286]],["t/1150",[408,3.451,409,3.876,461,3.267,522,4.458,523,4.458]],["t/1152",[18,4.398,461,4.286,524,5.848]],["t/1154",[256,3.543,264,4.661,265,4.399,525,5.059]],["t/1156",[408,4.527,409,5.085,526,5.848]],["t/1158",[390,5.085,527,5.848,528,5.848]],["t/1160",[52,2.997,156,2.636,222,3.187,238,3.464,521,3.671,529,3.984]],["t/1166",[89,5.723]],["t/1167",[99,5.756,277,5.756]],["t/1169",[231,6.383,375,6.383]],["t/1171",[9,5.085,530,5.848,531,5.848]],["t/1173",[156,4.584,506,6.383]],["t/1175",[402,7.389]],["t/1176",[57,4.678,378,5.085,532,5.388]],["t/1178",[57,3.566,58,2.63,378,3.876,533,4.458,534,4.458]],["t/1180",[36,4.399,250,4.203,532,4.661,535,5.059]],["t/1183",[512,7.83]],["t/1186",[238,5.085,379,5.388,536,5.388]],["t/1193",[234,7.83]],["t/1194",[32,2.461,427,4.107,428,4.107,429,4.107,430,4.107]],["t/1196",[227,7.389]],["t/1198",[431,7.83]],["t/1200",[432,7.83]],["t/1202",[433,7.83]],["t/1204",[434,7.83]],["t/1208",[508,6.383,537,6.928]],["t/1211",[389,7.06]],["t/1213",[435,7.389]],["t/1215",[436,7.389]],["t/1220",[11,4.508,437,6.383]],["t/1222",[58,4.087,225,6.024]],["t/1227",[167,6.798]],["t/1229",[335,6.798]],["t/1231",[438,5.141]],["t/1233",[439,6.798]],["t/1235",[340,7.389]],["t/1237",[339,7.389]],["t/1239",[338,7.389]],["t/1241",[352,7.06]],["t/1243",[41,4.186,345,3.196,353,4.678]],["t/1245",[297,5.756,353,5.542]],["t/1247",[178,6.798]],["t/1249",[22,4.584,61,5.542]],["t/1261",[1,1.095,84,1.379,169,1.873,180,1.667,185,1.984,206,1.984,294,1.984,392,1.984,538,1.62,539,2.154,540,3.743,541,1.984,542,2.154]],["t/1271",[1,2.572,182,4.047,486,4.047,543,4.399]],["t/1273",[28,4.959,188,5.077]],["t/1275",[1,2.572,486,4.047,543,4.399,544,5.059]],["t/1277",[28,4.959,188,5.077]],["t/1293",[64,3.347,84,3.239,545,5.059,546,5.059]],["t/1295",[168,6.383,547,6.928]],["t/1297",[173,6.383,548,6.928]],["t/1299",[177,6.383,549,6.928]],["t/1301",[181,6.383,550,6.928]],["t/1305",[551,5.832]],["t/1307",[213,5.952]],["t/1309",[1,4.321]],["t/1311",[210,6.024,552,5.077]],["t/1313",[67,5.364,282,6.024]],["t/1315",[192,4.087,553,5.211]],["t/1317",[41,6.083]],["t/1319",[210,6.024,554,6.928]],["t/1325",[551,5.832]],["t/1327",[413,6.024,555,6.928]],["t/1328",[52,5.211,413,6.024]],["t/1330",[111,5.085,556,5.848,557,5.388]],["t/1331",[435,4.399,436,4.399,557,4.661,558,5.059]],["t/1333",[22,3.869,228,4.858,229,5.388]],["t/1335",[250,7.06]],["t/1336",[250,5.756,559,6.928]],["t/1338",[180,6.579]],["t/1339",[92,4.203,169,4.399,267,3.917,393,4.203]],["t/1341",[190,3.805,299,4.661,560,4.661,561,3.805]],["t/1343",[38,3.291,393,4.203,552,3.708,562,5.059]],["t/1345",[17,3.688,563,5.848,564,5.848]],["t/1347",[315,5.756,316,5.364]],["t/1348",[78,4.186,565,5.848,566,5.388]],["t/1350",[274,6.383,278,5.364]],["t/1352",[207,4.843]],["t/1354",[567,6.928,568,6.928]],["t/1356",[192,4.087,553,5.211]],["t/1358",[32,2.199,38,2.592,115,2.683,552,2.92,561,2.997,566,3.671]],["t/1362",[551,5.832]],["t/1364",[16,2.734,269,2.513,291,2.92,569,3.187,570,2.592,571,2.79]],["t/1366",[213,4.095,290,4.013,571,4.095]],["t/1367",[72,4.095,570,3.805,572,4.186]],["t/1369",[1,1.671,98,2.352,190,2.471,223,2.072,239,1.963,268,2.544,570,2.138,572,2.352]],["t/1371",[371,4.755,573,5.542]],["t/1373",[471,5.952]],["t/1375",[574,6.228]],["t/1376",[92,4.858,336,4.286,574,4.286]],["t/1378",[463,5.077,575,5.542]],["t/1380",[38,4.508,576,5.542]],["t/1382",[207,3.948,208,3.948]],["t/1384",[192,4.087,553,5.211]],["t/1386",[32,2.199,38,2.592,115,2.683,552,2.92,561,2.997,577,3.984]],["t/1388",[3,6.228]],["t/1390",[578,7.06]],["t/1394",[551,5.832]],["t/1396",[16,2.734,269,2.513,291,2.92,569,3.187,570,2.592,571,2.79]],["t/1398",[213,4.095,290,4.013,571,4.095]],["t/1399",[72,4.095,570,3.805,572,4.186]],["t/1401",[1,1.671,98,2.352,190,2.471,223,2.072,239,1.963,268,2.544,570,2.138,572,2.352]],["t/1403",[371,4.755,573,5.542]],["t/1404",[223,4.37,239,4.138]],["t/1406",[336,6.228]],["t/1408",[471,5.952]],["t/1410",[574,6.228]],["t/1412",[463,5.077,575,5.542]],["t/1414",[38,4.508,576,5.542]],["t/1416",[207,3.948,208,3.948]],["t/1418",[192,4.087,553,5.211]],["t/1420",[32,2.199,38,2.592,115,2.683,552,2.92,561,2.997,579,3.984]],["t/1422",[3,6.228]],["t/1424",[578,7.06]],["t/1428",[551,5.832]],["t/1430",[16,2.734,269,2.513,291,2.92,569,3.187,570,2.592,571,2.79]],["t/1432",[213,4.095,290,4.013,571,4.095]],["t/1433",[72,4.095,570,3.805,572,4.186]],["t/1435",[1,2.266,98,3.19,190,3.353,570,2.9,572,3.19]],["t/1437",[371,4.755,573,5.542]],["t/1438",[223,4.37,239,4.138]],["t/1440",[336,6.228]],["t/1442",[471,5.952]],["t/1444",[574,6.228]],["t/1446",[463,5.077,575,5.542]],["t/1448",[38,4.508,576,5.542]],["t/1450",[207,3.948,208,3.948]],["t/1452",[192,4.087,553,5.211]],["t/1454",[32,2.199,38,2.592,115,2.683,552,2.92,561,2.997,580,3.984]],["t/1455",[109,4.203,217,4.661,571,3.543,581,5.059]],["t/1457",[3,6.228]],["t/1461",[551,5.832]],["t/1463",[16,2.734,269,2.513,291,2.92,569,3.187,570,2.592,571,2.79]],["t/1464",[165,6.579]],["t/1466",[223,4.37,316,5.364]],["t/1468",[6,5.388,239,3.493,282,5.085]],["t/1470",[72,4.095,582,5.848,583,3.688]],["t/1472",[1,1.422,5,1.819,98,2.001,190,2.103,223,1.763,239,1.67,268,2.165,570,1.819,572,2.001,584,2.796]],["t/1474",[18,5.211,585,6.928]],["t/1476",[371,4.755,573,5.542]],["t/1478",[471,5.952]],["t/1480",[574,6.228]],["t/1481",[92,4.858,336,4.286,574,4.286]],["t/1483",[463,5.077,575,5.542]],["t/1485",[38,4.508,576,5.542]],["t/1487",[207,3.948,208,3.948]],["t/1489",[192,4.087,553,5.211]],["t/1491",[32,2.199,38,2.592,115,2.683,552,2.92,561,2.997,586,3.984]],["t/1493",[3,6.228]],["t/1495",[578,7.06]],["t/1499",[551,5.832]],["t/1500",[16,2.734,269,2.513,291,2.92,569,3.187,570,2.592,571,2.79]],["t/1501",[213,4.095,290,4.013,571,4.095]],["t/1502",[72,4.095,570,3.805,572,4.186]],["t/1503",[1,1.671,98,2.352,190,2.471,223,2.072,239,1.963,268,2.544,570,2.138,572,2.352]],["t/1504",[371,4.755,573,5.542]],["t/1505",[471,5.952]],["t/1506",[574,6.228]],["t/1507",[463,5.077,575,5.542]],["t/1508",[38,4.508,576,5.542]],["t/1509",[207,3.948,208,3.948]],["t/1510",[192,4.087,553,5.211]],["t/1511",[32,2.199,38,2.592,115,2.683,552,2.92,561,2.997,587,3.984]],["t/1512",[3,6.228]],["t/1514",[578,7.06]],["t/1521",[1,2.973,78,4.186,207,3.332]],["t/1523",[57,5.542,75,5.756]],["t/1525",[588,5.076]],["t/1527",[589,7.389]],["t/1529",[207,4.843]],["t/1531",[189,5.076]],["t/1534",[269,4.37,551,4.755]],["t/1536",[108,6.024,590,6.928]],["t/1538",[5,3.805,272,3.938,314,5.388]],["t/1579",[591,4.6]],["t/1581",[80,4.843]],["t/1583",[4,4.661,5,3.291,65,2.915,207,2.883]],["t/1585",[65,3.992,66,4.959]],["t/1587",[65,3.992,461,5.077]],["t/1589",[592,8.498]],["t/1591",[382,7.06]],["t/1593",[593,4.666,594,5.542]],["t/1595",[98,4.186,589,5.085,594,4.678]],["t/1597",[388,5.085,594,4.678,595,5.085]],["t/1599",[574,6.082,594,4.678]],["t/1601",[596,8.498]],["t/1603",[11,4.508,597,4.755]],["t/1604",[595,6.024,598,6.383]],["t/1606",[293,4.678,598,5.388,599,5.848]],["t/1608",[438,4.191,600,4.248]],["t/1609",[269,5.36]],["t/1611",[601,7.83]],["t/1614",[591,4.6]],["t/1616",[602,4.645]],["t/1618",[63,3.621,64,3.347,513,4.661,603,5.059]],["t/1621",[591,4.6]],["t/1623",[602,4.645]],["t/1625",[1,2.572,78,3.621,79,3.621,207,2.883]],["t/1627",[209,4.527,551,4.013,604,4.858]],["t/1629",[120,4.203,382,4.203,385,4.047,605,5.059]],["t/1631",[1,2.973,209,4.527,606,5.085]],["t/1633",[212,7.06]],["t/1635",[269,4.37,607,6.024]],["t/1637",[207,3.948,607,6.024]],["t/1639",[256,4.095,607,5.085,608,4.678]],["t/1641",[156,4.584,609,6.928]],["t/1643",[382,7.06]],["t/1645",[438,4.191,600,4.248]],["t/1646",[408,5.364,461,5.077]],["t/1648",[96,5.388,209,4.527,610,5.848]],["t/1650",[608,6.798]],["t/1652",[11,4.508,597,4.755]],["t/1653",[601,7.83]],["t/1656",[591,4.6]],["t/1658",[602,4.645]],["t/1660",[65,3.992,366,6.383]],["t/1662",[611,6.928,612,6.928]],["t/1664",[75,5.756,280,6.383]],["t/1666",[451,5.364,613,6.928]],["t/1668",[67,5.364,188,5.077]],["t/1670",[32,2.199,90,3.671,461,2.92,518,3.671,614,6.23]],["t/1672",[11,4.508,597,4.755]],["t/1674",[28,6.083]],["t/1677",[591,4.6]],["t/1679",[602,4.645]],["t/1681",[593,5.723]],["t/1682",[60,4.398,66,4.186,411,4.858]],["t/1684",[474,5.542,593,4.666]],["t/1686",[538,5.211,593,4.666]],["t/1687",[80,3.332,615,4.527,616,5.085]],["t/1689",[80,3.948,617,6.024]],["t/1691",[66,3.621,82,2.639,481,4.203,618,4.399]],["t/1693",[82,3.614,619,6.024]],["t/1695",[32,2.199,82,2.078,424,4.686,620,3.464,621,3.464]],["t/1697",[74,4.203,82,2.639,538,3.805,615,3.917]],["t/1699",[82,3.051,213,4.095,358,5.085]],["t/1701",[156,4.584,593,4.666]],["t/1703",[1,2.973,207,3.332,622,4.527]],["t/1705",[104,4.584,623,5.756]],["t/1707",[624,8.498]],["t/1709",[505,7.06]],["t/1711",[1,2.572,29,4.661,30,4.399,278,3.917]],["t/1714",[591,4.6]],["t/1716",[602,4.645]],["t/1718",[438,4.191,600,4.248]],["t/1719",[60,4.398,66,4.186,411,4.858]],["t/1721",[104,2.949,474,3.566,593,3.002,622,3.451,625,4.107]],["t/1723",[538,5.211,593,4.666]],["t/1724",[80,3.332,615,4.527,616,5.085]],["t/1726",[80,3.948,617,6.024]],["t/1728",[66,3.621,82,2.639,481,4.203,618,4.399]],["t/1730",[1,2.973,207,3.332,622,4.527]],["t/1732",[104,3.869,623,4.858,626,5.388]],["t/1734",[505,7.06]],["t/1736",[72,4.852,608,5.542]],["t/1738",[627,7.83]],["t/1740",[82,3.614,619,6.024]],["t/1742",[32,2.199,82,2.078,424,4.686,620,3.464,621,3.464]],["t/1744",[74,4.203,82,2.639,538,3.805,615,3.917]],["t/1746",[82,3.051,267,4.527,628,5.388]],["t/1748",[82,3.614,629,6.383]],["t/1750",[82,3.051,104,3.869,442,5.085]],["t/1752",[156,4.584,593,4.666]],["t/1754",[207,3.332,269,3.688,630,5.085]],["t/1756",[1,3.523,278,5.364]],["t/1759",[591,4.6]],["t/1761",[602,4.645]],["t/1763",[438,4.191,600,4.248]],["t/1764",[60,4.398,66,4.186,411,4.858]],["t/1766",[104,2.949,474,3.566,593,3.002,622,3.451,625,4.107]],["t/1768",[538,5.211,593,4.666]],["t/1769",[80,3.332,615,4.527,616,5.085]],["t/1771",[80,3.948,617,6.024]],["t/1773",[66,3.621,82,2.639,481,4.203,618,4.399]],["t/1775",[104,3.869,623,4.858,626,5.388]],["t/1777",[189,4.138,208,3.948]],["t/1779",[627,7.83]],["t/1781",[82,3.614,619,6.024]],["t/1783",[32,2.199,82,2.078,424,4.686,620,3.464,621,3.464]],["t/1785",[74,4.203,82,2.639,538,3.805,615,3.917]],["t/1787",[82,3.051,267,4.527,628,5.388]],["t/1789",[82,3.614,629,6.383]],["t/1791",[82,3.051,104,3.869,442,5.085]],["t/1793",[156,4.584,593,4.666]],["t/1795",[207,3.332,269,3.688,630,5.085]],["t/1797",[1,3.523,278,5.364]],["t/1800",[602,4.645]],["t/1802",[78,6.083]],["t/1804",[104,5.623]],["t/1806",[67,4.527,80,3.332,213,4.095]],["t/1808",[345,3.787,517,6.383]],["t/1809",[41,4.959,345,3.787]],["t/1811",[345,3.787,631,6.928]],["t/1813",[319,5.388,345,3.196,632,5.848]],["t/1815",[32,3.439,139,3.464,242,2.997,267,3.084,633,3.984]],["t/1817",[189,4.138,208,3.948]],["t/1820",[591,4.6]],["t/1821",[60,4.398,634,4.678,635,5.848]],["t/1823",[58,2.985,634,4.047,636,5.059,637,5.059]],["t/1825",[634,5.542,638,6.928]],["t/1827",[424,4.398,541,5.388,634,4.678]],["t/1829",[602,4.645]],["t/1831",[1,2.973,5,3.805,634,4.678]],["t/1832",[622,6.579]],["t/1834",[345,4.645]],["t/1836",[330,5.077,331,6.383]],["t/1839",[591,4.6]],["t/1840",[602,4.645]],["t/1842",[350,4.527,358,5.085,639,5.848]],["t/1844",[1,2.973,207,3.332,622,4.527]],["t/1846",[79,6.083]],["t/1848",[415,7.83]],["t/1850",[350,5.364,640,6.928]],["t/1852",[641,8.498]],["t/1854",[189,4.138,208,3.948]],["t/1856",[72,4.852,608,5.542]],["t/1858",[207,3.332,269,3.688,630,5.085]],["t/1861",[591,4.6]],["t/1863",[602,4.645]],["t/1865",[232,4.858,345,3.196,384,5.388]],["t/1867",[207,3.332,345,3.196,606,5.085]],["t/1869",[345,4.084,367,4.203,451,3.917]],["t/1871",[345,4.084,367,4.203,503,4.661]],["t/1873",[156,4.584,642,6.928]],["t/1875",[600,4.248,604,5.756]],["t/1876",[604,5.756,606,6.024]],["t/1878",[345,3.787,604,5.756]],["t/1880",[189,4.138,208,3.948]],["t/1882",[72,4.852,608,5.542]],["t/1885",[591,4.6]],["t/1887",[602,4.645]],["t/1889",[438,4.191,600,4.248]],["t/1890",[82,3.614,643,5.211]],["t/1892",[588,5.076]],["t/1894",[141,6.024,551,4.755]],["t/1896",[188,5.077,371,4.755]],["t/1898",[65,3.992,583,4.37]],["t/1900",[189,4.138,208,3.948]],["t/1903",[591,4.6]],["t/1905",[602,4.645]],["t/1907",[588,5.076]],["t/1909",[65,3.992,583,4.37]],["t/1911",[189,4.138,208,3.948]],["t/1914",[591,4.6]],["t/1916",[602,4.645]],["t/1918",[588,5.076]],["t/1920",[65,3.992,583,4.37]],["t/1922",[32,3.228,208,3.332,505,4.858]],["t/1925",[591,4.6]],["t/1927",[602,4.645]],["t/1929",[438,4.191,600,4.248]],["t/1931",[82,3.614,643,5.211]],["t/1933",[11,4.508,597,4.755]],["t/1935",[588,5.076]],["t/1937",[65,3.992,583,4.37]],["t/1940",[591,4.6]],["t/1942",[602,4.645]],["t/1944",[588,5.076]],["t/1946",[80,2.54,350,3.451,560,4.107,583,2.811,644,4.107]],["t/1948",[80,2.883,350,3.917,583,3.191,644,4.661]],["t/1950",[65,3.992,583,4.37]],["t/1952",[189,4.138,208,3.948]],["t/1955",[591,4.6]],["t/1957",[602,4.645]],["t/1959",[438,4.191,600,4.248]],["t/1961",[228,4.858,256,4.095,645,5.848]],["t/1963",[80,2.883,213,3.543,256,3.543,646,4.661]],["t/1965",[647,7.83]],["t/1967",[588,5.076]],["t/1970",[591,4.6]],["t/1972",[648,7.389]],["t/1974",[602,4.645]],["t/1976",[438,4.191,600,4.248]],["t/1978",[588,5.076]],["t/1980",[65,4.897]],["t/1983",[591,4.6]],["t/1985",[602,4.645]],["t/1987",[438,4.191,600,4.248]],["t/1989",[80,3.948,213,4.852]],["t/1991",[289,4.203,306,4.203,649,5.059,650,5.059]],["t/1993",[22,2.949,165,3.451,226,3.876,308,4.107,651,4.458]],["t/1995",[272,3.407,404,4.661,652,4.661,653,5.059]],["t/1997",[278,3.084,289,3.31,385,3.187,424,2.997,652,3.671,654,3.671]],["t/1999",[289,4.203,385,4.047,424,3.805,654,4.661]],["t/2001",[593,3.938,655,5.848,656,5.848]],["t/2003",[647,7.83]],["t/2006",[591,4.6]],["t/2008",[648,7.389]],["t/2010",[602,4.645]],["t/2012",[438,4.191,600,4.248]],["t/2014",[588,5.076]],["t/2016",[65,3.992,583,4.37]],["t/2018",[189,4.138,208,3.948]],["t/2021",[591,4.6]],["t/2023",[65,3.992,602,3.787]],["t/2025",[438,4.191,600,4.248]],["t/2027",[82,3.614,643,5.211]],["t/2029",[11,4.508,597,4.755]],["t/2031",[588,5.076]],["t/2033",[65,3.992,583,4.37]],["t/2035",[189,4.138,208,3.948]],["t/2036",[82,3.051,189,3.493,208,3.332]],["t/2038",[591,4.6]],["t/2040",[648,7.389]],["t/2042",[657,7.389]],["t/2044",[602,4.645]],["t/2046",[88,6.383,646,6.383]],["t/2048",[438,4.191,600,4.248]],["t/2050",[82,3.614,643,5.211]],["t/2052",[11,4.508,597,4.755]],["t/2053",[214,7.83]],["t/2055",[588,5.076]],["t/2057",[623,5.756,658,6.928]],["t/2059",[65,3.992,583,4.37]],["t/2060",[551,3.472,659,5.059,660,5.059,661,5.059]],["t/2062",[230,4.047,463,3.708,662,5.059,663,5.059]],["t/2064",[189,4.138,208,3.948]],["t/2066",[410,7.83]],["t/2067",[511,6.383,588,4.138]],["t/2070",[591,4.6]],["t/2072",[602,4.645]],["t/2074",[438,4.191,600,4.248]],["t/2076",[82,3.614,643,5.211]],["t/2078",[11,4.508,597,4.755]],["t/2080",[588,5.076]],["t/2082",[65,3.992,583,4.37]],["t/2084",[189,4.138,208,3.948]],["t/2087",[591,4.6]],["t/2089",[191,6.024,500,6.383]],["t/2091",[588,5.076]],["t/2093",[80,3.332,486,4.678,543,5.085]],["t/2095",[664,6.928,665,6.928]],["t/2098",[591,4.6]],["t/2100",[80,4.843]],["t/2102",[602,4.645]],["t/2104",[588,5.076]],["t/2105",[275,6.383,322,4.307]],["t/2107",[25,5.364,182,5.542]],["t/2109",[25,4.527,182,4.678,666,5.848]],["t/2111",[104,4.584,667,6.928]],["t/2113",[115,4.666,594,5.542]],["t/2115",[519,7.83]],["t/2117",[657,7.389]],["t/2119",[291,5.077,657,6.024]],["t/2121",[12,4.858,381,5.388,668,5.388]],["t/2123",[12,4.858,668,5.388,669,5.388]],["t/2125",[13,3.703,41,3.19,132,3.876,669,4.107,670,4.458]],["t/2127",[35,5.756,237,6.383]],["t/2130",[591,4.6]],["t/2132",[322,5.283]],["t/2134",[602,4.645]],["t/2136",[438,4.191,600,4.248]],["t/2138",[82,4.433]],["t/2140",[588,5.076]],["t/2142",[11,4.508,597,4.755]],["t/2144",[65,3.992,583,4.37]],["t/2146",[189,4.138,208,3.948]],["t/2149",[591,4.6]],["t/2151",[602,4.645]],["t/2153",[588,5.076]],["t/2154",[671,6.928,672,6.928]],["t/2156",[536,7.83]],["t/2159",[591,4.6]],["t/2161",[322,5.283]],["t/2163",[602,4.645]],["t/2165",[438,4.191,600,4.248]],["t/2167",[82,4.433]],["t/2169",[11,4.508,597,4.755]],["t/2171",[588,5.076]],["t/2173",[65,3.992,583,4.37]],["t/2175",[189,4.138,208,3.948]],["t/2178",[591,4.6]],["t/2180",[602,4.645]],["t/2182",[438,4.191,600,4.248]],["t/2184",[82,3.614,643,5.211]],["t/2186",[11,4.508,597,4.755]],["t/2188",[588,5.076]],["t/2190",[65,3.992,583,4.37]],["t/2192",[189,4.138,208,3.948]],["t/2195",[591,4.6]],["t/2197",[602,4.645]],["t/2199",[438,4.191,600,4.248]],["t/2201",[82,3.614,643,5.211]],["t/2203",[11,4.508,597,4.755]],["t/2205",[588,5.076]],["t/2207",[65,3.992,583,4.37]],["t/2209",[189,4.138,208,3.948]],["t/2213",[207,3.948,595,6.024]],["t/2215",[589,7.389]]],"invertedIndex":[["",{"_index":32,"t":{"42":{"position":[[44,1]]},"86":{"position":[[7,1]]},"89":{"position":[[7,1]]},"91":{"position":[[7,1]]},"111":{"position":[[14,1]]},"113":{"position":[[11,1]]},"115":{"position":[[6,1]]},"128":{"position":[[7,1]]},"130":{"position":[[7,1]]},"132":{"position":[[7,1]]},"134":{"position":[[7,1]]},"186":{"position":[[11,1]]},"240":{"position":[[8,1]]},"876":{"position":[[14,1]]},"1194":{"position":[[14,1]]},"1358":{"position":[[21,1]]},"1386":{"position":[[21,1]]},"1420":{"position":[[21,1]]},"1454":{"position":[[21,1]]},"1491":{"position":[[21,1]]},"1511":{"position":[[21,1]]},"1670":{"position":[[25,1]]},"1695":{"position":[[35,1]]},"1742":{"position":[[35,1]]},"1783":{"position":[[35,1]]},"1815":{"position":[[10,1],[37,1]]},"1922":{"position":[[11,1]]}}}],["0",{"_index":194,"t":{"271":{"position":[[8,1]]}}}],["03",{"_index":201,"t":{"275":{"position":[[16,2]]},"279":{"position":[[16,2]]}}}],["07",{"_index":196,"t":{"271":{"position":[[16,2]]}}}],["09",{"_index":198,"t":{"273":{"position":[[16,2]]},"277":{"position":[[16,2]]}}}],["1",{"_index":64,"t":{"86":{"position":[[5,1]]},"88":{"position":[[0,2]]},"89":{"position":[[5,1]]},"128":{"position":[[5,1]]},"207":{"position":[[16,1]]},"226":{"position":[[10,1]]},"228":{"position":[[10,1]]},"240":{"position":[[0,2]]},"246":{"position":[[0,2]]},"273":{"position":[[8,1]]},"731":{"position":[[46,1]]},"1293":{"position":[[0,2]]},"1618":{"position":[[24,2]]}}}],["1.1",{"_index":168,"t":{"248":{"position":[[0,3]]},"1295":{"position":[[0,3]]}}}],["1.2",{"_index":173,"t":{"250":{"position":[[0,3]]},"1297":{"position":[[0,3]]}}}],["1.3",{"_index":177,"t":{"252":{"position":[[0,3]]},"1299":{"position":[[0,3]]}}}],["1.4",{"_index":181,"t":{"254":{"position":[[0,3]]},"1301":{"position":[[0,3]]}}}],["1.5",{"_index":183,"t":{"256":{"position":[[0,3]]}}}],["15",{"_index":197,"t":{"271":{"position":[[19,3]]}}}],["2",{"_index":69,"t":{"91":{"position":[[5,1]]},"93":{"position":[[0,2]]},"130":{"position":[[5,1]]},"215":{"position":[[10,1]]},"224":{"position":[[16,1]]},"242":{"position":[[0,2]]},"275":{"position":[[8,1]]}}}],["2021",{"_index":195,"t":{"271":{"position":[[10,5]]},"273":{"position":[[10,5]]}}}],["2022",{"_index":200,"t":{"275":{"position":[[10,5]]},"277":{"position":[[10,5]]}}}],["2023",{"_index":204,"t":{"279":{"position":[[10,5]]}}}],["21",{"_index":203,"t":{"277":{"position":[[19,3]]}}}],["22",{"_index":205,"t":{"279":{"position":[[19,3]]}}}],["23",{"_index":202,"t":{"275":{"position":[[19,3]]}}}],["29",{"_index":199,"t":{"273":{"position":[[19,3]]}}}],["2nd",{"_index":421,"t":{"849":{"position":[[7,3]]}}}],["3",{"_index":73,"t":{"95":{"position":[[0,2]]},"132":{"position":[[5,1]]},"211":{"position":[[10,1]]},"277":{"position":[[8,1]]}}}],["4",{"_index":97,"t":{"134":{"position":[[5,1]]},"203":{"position":[[10,1]]},"279":{"position":[[8,1]]}}}],["5",{"_index":147,"t":{"196":{"position":[[10,1]]}}}],["6",{"_index":142,"t":{"192":{"position":[[10,1]]}}}],["60",{"_index":443,"t":{"940":{"position":[[0,2]]}}}],["access",{"_index":34,"t":{"43":{"position":[[9,6]]},"50":{"position":[[9,6]]},"254":{"position":[[26,6]]},"777":{"position":[[6,6]]},"797":{"position":[[4,6]]},"838":{"position":[[22,6]]}}}],["acknowledg",{"_index":601,"t":{"1611":{"position":[[0,16]]},"1653":{"position":[[0,16]]}}}],["ad",{"_index":70,"t":{"91":{"position":[[9,6]]}}}],["add",{"_index":469,"t":{"966":{"position":[[0,3]]},"1098":{"position":[[7,3]]},"1100":{"position":[[7,3]]}}}],["addit",{"_index":420,"t":{"844":{"position":[[10,10]]}}}],["adjust",{"_index":658,"t":{"2057":{"position":[[7,11]]}}}],["admin",{"_index":659,"t":{"2060":{"position":[[0,7]]}}}],["admonit",{"_index":100,"t":{"137":{"position":[[0,11]]}}}],["advanc",{"_index":279,"t":{"446":{"position":[[0,8]]},"803":{"position":[[0,8]]},"1008":{"position":[[0,8]]}}}],["advertis",{"_index":146,"t":{"194":{"position":[[10,11]]}}}],["advic",{"_index":442,"t":{"937":{"position":[[0,6]]},"1750":{"position":[[15,6]]},"1791":{"position":[[15,6]]}}}],["affero",{"_index":128,"t":{"178":{"position":[[0,6]]}}}],["again",{"_index":476,"t":{"970":{"position":[[61,6]]}}}],["aggreg",{"_index":326,"t":{"564":{"position":[[19,10]]}}}],["agreement",{"_index":140,"t":{"184":{"position":[[46,10]]}}}],["alreadi",{"_index":311,"t":{"530":{"position":[[11,7]]}}}],["amphora",{"_index":353,"t":{"645":{"position":[[0,7]]},"1087":{"position":[[0,7]]},"1092":{"position":[[11,7]]},"1243":{"position":[[0,7]]},"1245":{"position":[[0,7]]}}}],["and/or",{"_index":523,"t":{"1150":{"position":[[26,6]]}}}],["ansibl",{"_index":470,"t":{"966":{"position":[[25,7]]},"967":{"position":[[24,7]]},"1009":{"position":[[42,7]]},"1021":{"position":[[0,7]]},"1030":{"position":[[0,7]]},"1033":{"position":[[18,7]]},"1108":{"position":[[6,7]]},"1132":{"position":[[0,7]]}}}],["api",{"_index":182,"t":{"254":{"position":[[22,3]]},"578":{"position":[[14,3]]},"1271":{"position":[[20,3]]},"2107":{"position":[[0,3]]},"2109":{"position":[[0,3]]}}}],["app",{"_index":530,"t":{"1171":{"position":[[7,3]]}}}],["appendix",{"_index":410,"t":{"817":{"position":[[0,8]]},"2066":{"position":[[0,8]]}}}],["appli",{"_index":394,"t":{"768":{"position":[[0,5]]}}}],["applic",{"_index":500,"t":{"998":{"position":[[12,11]]},"2089":{"position":[[9,12]]}}}],["approach",{"_index":289,"t":{"458":{"position":[[20,8]]},"1991":{"position":[[27,10]]},"1997":{"position":[[37,8]]},"1999":{"position":[[22,8]]}}}],["ara",{"_index":510,"t":{"1033":{"position":[[0,3],[6,3]]}}}],["architectur",{"_index":74,"t":{"99":{"position":[[12,12]]},"1697":{"position":[[15,12]]},"1744":{"position":[[15,12]]},"1785":{"position":[[15,12]]}}}],["assign",{"_index":137,"t":{"184":{"position":[[10,11]]}}}],["assist",{"_index":125,"t":{"170":{"position":[[30,9]]}}}],["attach",{"_index":261,"t":{"398":{"position":[[5,6]]}}}],["authent",{"_index":35,"t":{"45":{"position":[[0,14]]},"52":{"position":[[0,14]]},"801":{"position":[[0,14]]},"2127":{"position":[[0,14]]}}}],["author",{"_index":237,"t":{"349":{"position":[[12,9]]},"2127":{"position":[[19,13]]}}}],["autom",{"_index":414,"t":{"833":{"position":[[0,9]]}}}],["autoscal",{"_index":498,"t":{"994":{"position":[[4,10]]}}}],["avail",{"_index":324,"t":{"562":{"position":[[16,12]]},"932":{"position":[[9,9]]}}}],["aw",{"_index":308,"t":{"528":{"position":[[61,4]]},"1993":{"position":[[35,4]]}}}],["azur",{"_index":309,"t":{"528":{"position":[[66,11]]}}}],["backend",{"_index":346,"t":{"623":{"position":[[15,7]]},"1066":{"position":[[15,7]]}}}],["backfills/recoveri",{"_index":482,"t":{"974":{"position":[[8,18]]}}}],["backup",{"_index":244,"t":{"357":{"position":[[20,6]]}}}],["bare",{"_index":563,"t":{"1345":{"position":[[0,4]]}}}],["base",{"_index":654,"t":{"1997":{"position":[[31,5]]},"1999":{"position":[[16,5]]}}}],["basic",{"_index":609,"t":{"1641":{"position":[[0,5]]}}}],["becom",{"_index":108,"t":{"149":{"position":[[27,6]]},"1136":{"position":[[0,6]]},"1536":{"position":[[0,8]]}}}],["befor",{"_index":144,"t":{"192":{"position":[[19,6]]},"196":{"position":[[19,6]]},"203":{"position":[[19,6]]},"205":{"position":[[22,6]]},"211":{"position":[[19,6]]},"215":{"position":[[19,6]]},"226":{"position":[[18,6]]},"228":{"position":[[17,6]]},"230":{"position":[[18,6]]}}}],["behaviour",{"_index":537,"t":{"1208":{"position":[[8,9]]}}}],["behind",{"_index":303,"t":{"522":{"position":[[15,6]]}}}],["best",{"_index":76,"t":{"102":{"position":[[10,4]]}}}],["between",{"_index":185,"t":{"256":{"position":[[19,7]]},"1261":{"position":[[66,7]]}}}],["beyond",{"_index":278,"t":{"443":{"position":[[0,6]]},"1350":{"position":[[0,6]]},"1711":{"position":[[0,6]]},"1756":{"position":[[0,6]]},"1797":{"position":[[0,6]]},"1997":{"position":[[0,6]]}}}],["black",{"_index":529,"t":{"1160":{"position":[[25,5]]}}}],["block",{"_index":453,"t":{"948":{"position":[[28,5]]}}}],["blockquot",{"_index":101,"t":{"139":{"position":[[0,11]]}}}],["bootstrap",{"_index":395,"t":{"770":{"position":[[0,9]]},"929":{"position":[[0,9]]}}}],["box",{"_index":584,"t":{"1472":{"position":[[47,4]]}}}],["branch",{"_index":534,"t":{"1178":{"position":[[35,7]]}}}],["break",{"_index":599,"t":{"1606":{"position":[[0,8]]}}}],["breakfast",{"_index":159,"t":{"218":{"position":[[0,9]]}}}],["broken",{"_index":480,"t":{"972":{"position":[[49,6]]}}}],["broker",{"_index":391,"t":{"738":{"position":[[10,6]]},"1042":{"position":[[0,6]]}}}],["bug",{"_index":210,"t":{"287":{"position":[[11,4]]},"1311":{"position":[[6,4]]},"1319":{"position":[[0,3]]}}}],["build",{"_index":319,"t":{"548":{"position":[[40,5]]},"1813":{"position":[[6,5]]}}}],["ca",{"_index":397,"t":{"784":{"position":[[7,2]]}}}],["caa",{"_index":166,"t":{"242":{"position":[[3,4]]},"536":{"position":[[67,6]]},"542":{"position":[[10,4]]}}}],["capi",{"_index":274,"t":{"415":{"position":[[11,4]]},"1350":{"position":[[7,4]]}}}],["care",{"_index":187,"t":{"261":{"position":[[26,5]]}}}],["case",{"_index":493,"t":{"986":{"position":[[27,4]]}}}],["ceilomet",{"_index":545,"t":{"1293":{"position":[[3,10]]}}}],["cell",{"_index":327,"t":{"566":{"position":[[16,4]]}}}],["central",{"_index":559,"t":{"1336":{"position":[[0,7]]}}}],["ceph",{"_index":337,"t":{"590":{"position":[[0,4]]},"600":{"position":[[0,4]]},"937":{"position":[[10,4]]},"966":{"position":[[20,4]]},"967":{"position":[[19,4]]},"1009":{"position":[[37,4]]},"1011":{"position":[[11,4]]},"1013":{"position":[[11,4]]},"1015":{"position":[[10,4]]}}}],["certif",{"_index":209,"t":{"285":{"position":[[26,13]]},"347":{"position":[[7,12]]},"349":{"position":[[0,11]]},"1627":{"position":[[13,11]]},"1631":{"position":[[4,13]]},"1648":{"position":[[21,14]]}}}],["certifi",{"_index":590,"t":{"1536":{"position":[[9,9]]}}}],["chang",{"_index":293,"t":{"467":{"position":[[12,7]]},"804":{"position":[[0,6]]},"1006":{"position":[[0,6]]},"1104":{"position":[[0,6]]},"1606":{"position":[[9,6]]}}}],["changed_when",{"_index":116,"t":{"159":{"position":[[9,12]]}}}],["chatti",{"_index":8,"t":{"8":{"position":[[6,6]]}}}],["check",{"_index":256,"t":{"385":{"position":[[5,5]]},"387":{"position":[[5,5]]},"389":{"position":[[5,5]]},"391":{"position":[[5,5]]},"393":{"position":[[5,5]]},"953":{"position":[[0,5]]},"1154":{"position":[[0,5]]},"1639":{"position":[[0,5]]},"1961":{"position":[[11,5]]},"1963":{"position":[[32,5]]}}}],["checklist",{"_index":68,"t":{"89":{"position":[[9,9]]},"192":{"position":[[0,9]]},"194":{"position":[[0,9]]},"196":{"position":[[0,9]]},"198":{"position":[[0,9]]},"203":{"position":[[0,9]]},"205":{"position":[[0,9]]},"207":{"position":[[0,9]]},"209":{"position":[[0,9]]},"211":{"position":[[0,9]]},"213":{"position":[[0,9]]},"215":{"position":[[0,9]]},"217":{"position":[[7,9]]},"224":{"position":[[0,9]]},"226":{"position":[[0,9]]},"228":{"position":[[0,9]]},"230":{"position":[[0,9]]},"232":{"position":[[0,9]]},"234":{"position":[[0,9]]}}}],["ci",{"_index":413,"t":{"824":{"position":[[0,2]]},"1327":{"position":[[0,2]]},"1328":{"position":[[5,2]]}}}],["ci/cd",{"_index":53,"t":{"73":{"position":[[5,5]]}}}],["cinder",{"_index":340,"t":{"596":{"position":[[0,6]]},"913":{"position":[[0,6]]},"1235":{"position":[[0,6]]}}}],["claim",{"_index":176,"t":{"250":{"position":[[30,6]]}}}],["class",{"_index":503,"t":{"1004":{"position":[[41,7]]},"1871":{"position":[[21,5]]}}}],["clean",{"_index":253,"t":{"378":{"position":[[5,5]]}}}],["cleanup",{"_index":513,"t":{"1092":{"position":[[0,7]]},"1618":{"position":[[10,7]]}}}],["cli",{"_index":23,"t":{"34":{"position":[[31,3]]},"35":{"position":[[16,5]]},"54":{"position":[[16,5]]},"254":{"position":[[14,3]]},"955":{"position":[[58,3]]},"957":{"position":[[37,3]]}}}],["client",{"_index":61,"t":{"82":{"position":[[0,6]]},"347":{"position":[[0,6]]},"654":{"position":[[0,6]]},"903":{"position":[[10,6]]},"1249":{"position":[[10,6]]}}}],["clone",{"_index":94,"t":{"130":{"position":[[9,7]]}}}],["cloud",{"_index":5,"t":{"6":{"position":[[24,5]]},"17":{"position":[[15,5]]},"266":{"position":[[13,6]]},"524":{"position":[[39,5]]},"528":{"position":[[36,5]]},"530":{"position":[[25,5]]},"546":{"position":[[21,6]]},"548":{"position":[[53,6]]},"777":{"position":[[0,5]]},"779":{"position":[[0,5]]},"1472":{"position":[[35,6]]},"1538":{"position":[[10,5]]},"1583":{"position":[[10,5]]},"1831":{"position":[[15,6]]}}}],["clush",{"_index":509,"t":{"1023":{"position":[[0,5]]}}}],["cluster",{"_index":239,"t":{"351":{"position":[[7,7]]},"353":{"position":[[0,7]]},"417":{"position":[[40,8]]},"419":{"position":[[11,8]]},"439":{"position":[[14,7]]},"446":{"position":[[9,7]]},"452":{"position":[[16,9],[39,8]]},"460":{"position":[[18,8]]},"473":{"position":[[32,7]]},"940":{"position":[[11,7]]},"962":{"position":[[29,7]]},"1013":{"position":[[16,7]]},"1015":{"position":[[15,7]]},"1369":{"position":[[52,7]]},"1401":{"position":[[52,7]]},"1404":{"position":[[0,7]]},"1438":{"position":[[0,7]]},"1468":{"position":[[9,7]]},"1472":{"position":[[68,7]]},"1503":{"position":[[52,7]]}}}],["clusterctl",{"_index":287,"t":{"458":{"position":[[4,10]]}}}],["clusterctl.yaml",{"_index":271,"t":{"413":{"position":[[32,15]]}}}],["code",{"_index":527,"t":{"1158":{"position":[[17,4]]}}}],["codeblock",{"_index":102,"t":{"141":{"position":[[0,10]]}}}],["collabor",{"_index":37,"t":{"58":{"position":[[0,13]]}}}],["collect",{"_index":111,"t":{"153":{"position":[[9,11]]},"155":{"position":[[26,11]]},"1330":{"position":[[8,10]]}}}],["command",{"_index":245,"t":{"361":{"position":[[8,8]]},"384":{"position":[[8,8]]},"395":{"position":[[10,8]]},"842":{"position":[[0,7]]}}}],["commit",{"_index":87,"t":{"119":{"position":[[4,6]]},"717":{"position":[[5,6]]},"1143":{"position":[[0,6]]}}}],["common",{"_index":275,"t":{"417":{"position":[[0,6]]},"2105":{"position":[[0,6]]}}}],["commun",{"_index":2,"t":{"5":{"position":[[19,9]]},"13":{"position":[[14,9]]},"95":{"position":[[3,9]]},"427":{"position":[[11,9]]}}}],["compani",{"_index":310,"t":{"530":{"position":[[3,7]]},"548":{"position":[[28,7]]}}}],["comparison",{"_index":664,"t":{"2095":{"position":[[0,10]]}}}],["complet",{"_index":474,"t":{"970":{"position":[[27,11]]},"974":{"position":[[27,10]]},"1684":{"position":[[0,8]]},"1721":{"position":[[0,8]]},"1766":{"position":[[0,8]]}}}],["complianc",{"_index":626,"t":{"1732":{"position":[[14,10]]},"1775":{"position":[[14,10]]}}}],["compliant",{"_index":314,"t":{"534":{"position":[[56,10]]},"1538":{"position":[[0,9]]}}}],["compon",{"_index":291,"t":{"463":{"position":[[27,10]]},"465":{"position":[[26,10]]},"1364":{"position":[[0,9]]},"1396":{"position":[[0,9]]},"1430":{"position":[[0,9]]},"1463":{"position":[[0,9]]},"1500":{"position":[[0,9]]},"2119":{"position":[[0,9]]}}}],["component/compon",{"_index":613,"t":{"1666":{"position":[[7,19]]}}}],["comput",{"_index":331,"t":{"572":{"position":[[14,7]]},"1836":{"position":[[0,7]]}}}],["con",{"_index":650,"t":{"1991":{"position":[[9,4]]}}}],["conclus",{"_index":647,"t":{"1965":{"position":[[0,10]]},"2003":{"position":[[0,10]]}}}],["condit",{"_index":110,"t":{"151":{"position":[[21,9]]}}}],["configur",{"_index":84,"t":{"111":{"position":[[0,13]]},"334":{"position":[[0,13]]},"473":{"position":[[10,9],[67,13]]},"487":{"position":[[0,13]]},"707":{"position":[[0,13]]},"709":{"position":[[15,13]]},"725":{"position":[[16,13]]},"745":{"position":[[13,13]]},"768":{"position":[[18,13]]},"788":{"position":[[0,13]]},"868":{"position":[[18,13]]},"990":{"position":[[20,13]]},"1009":{"position":[[0,9]]},"1261":{"position":[[28,9]]},"1293":{"position":[[23,13]]}}}],["conform",{"_index":208,"t":{"285":{"position":[[11,10]]},"389":{"position":[[11,11]]},"1382":{"position":[[10,11]]},"1416":{"position":[[10,11]]},"1450":{"position":[[10,11]]},"1487":{"position":[[10,11]]},"1509":{"position":[[10,11]]},"1777":{"position":[[0,11]]},"1817":{"position":[[0,11]]},"1854":{"position":[[0,11]]},"1880":{"position":[[0,11]]},"1900":{"position":[[0,11]]},"1911":{"position":[[0,11]]},"1922":{"position":[[13,11]]},"1952":{"position":[[0,11]]},"2018":{"position":[[0,11]]},"2035":{"position":[[0,11]]},"2036":{"position":[[0,11]]},"2064":{"position":[[0,11]]},"2084":{"position":[[0,11]]},"2146":{"position":[[0,11]]},"2175":{"position":[[0,11]]},"2192":{"position":[[0,11]]},"2209":{"position":[[0,11]]}}}],["connect",{"_index":206,"t":{"283":{"position":[[15,7]]},"1261":{"position":[[57,8]]}}}],["consid",{"_index":643,"t":{"1890":{"position":[[8,10]]},"1931":{"position":[[8,10]]},"2027":{"position":[[8,10]]},"2050":{"position":[[8,10]]},"2076":{"position":[[8,10]]},"2184":{"position":[[8,10]]},"2201":{"position":[[8,10]]}}}],["consider",{"_index":600,"t":{"1608":{"position":[[7,14]]},"1645":{"position":[[7,14]]},"1718":{"position":[[7,14]]},"1763":{"position":[[7,14]]},"1875":{"position":[[10,14]]},"1889":{"position":[[7,14]]},"1929":{"position":[[7,14]]},"1959":{"position":[[7,14]]},"1976":{"position":[[7,14]]},"1987":{"position":[[7,14]]},"2012":{"position":[[7,14]]},"2025":{"position":[[7,14]]},"2048":{"position":[[7,14]]},"2074":{"position":[[7,14]]},"2136":{"position":[[7,14]]},"2165":{"position":[[7,14]]},"2182":{"position":[[7,14]]},"2199":{"position":[[7,14]]}}}],["consist",{"_index":662,"t":{"2062":{"position":[[0,10]]}}}],["consol",{"_index":251,"t":{"374":{"position":[[5,7]]}}}],["contain",{"_index":316,"t":{"542":{"position":[[21,10]]},"1025":{"position":[[0,9]]},"1035":{"position":[[0,9]]},"1100":{"position":[[17,9]]},"1347":{"position":[[0,9]]},"1466":{"position":[[0,9]]}}}],["containerd",{"_index":295,"t":{"473":{"position":[[47,10]]}}}],["containerfil",{"_index":520,"t":{"1142":{"position":[[0,14]]}}}],["contribut",{"_index":3,"t":{"6":{"position":[[0,10]]},"113":{"position":[[0,10]]},"283":{"position":[[0,10]]},"1388":{"position":[[0,12]]},"1422":{"position":[[0,12]]},"1457":{"position":[[0,12]]},"1493":{"position":[[0,12]]},"1512":{"position":[[0,12]]}}}],["contributor",{"_index":138,"t":{"184":{"position":[[26,11]]}}}],["control",{"_index":328,"t":{"568":{"position":[[16,7]]},"570":{"position":[[14,7]]}}}],["controversi",{"_index":127,"t":{"176":{"position":[[0,11]]}}}],["copi",{"_index":426,"t":{"868":{"position":[[6,4]]}}}],["copyleft",{"_index":134,"t":{"180":{"position":[[34,8]]}}}],["copyright",{"_index":136,"t":{"184":{"position":[[0,9]]}}}],["cpu",{"_index":615,"t":{"1687":{"position":[[11,3]]},"1697":{"position":[[11,3]]},"1724":{"position":[[11,3]]},"1744":{"position":[[11,3]]},"1769":{"position":[[11,3]]},"1785":{"position":[[11,3]]}}}],["creat",{"_index":246,"t":{"362":{"position":[[5,6]]},"439":{"position":[[0,6]]},"709":{"position":[[0,8]]},"766":{"position":[[0,6]]},"996":{"position":[[0,6]]},"1004":{"position":[[0,6]]},"1009":{"position":[[14,6]]}}}],["creation",{"_index":379,"t":{"713":{"position":[[0,8]]},"1186":{"position":[[9,8]]}}}],["criteria",{"_index":598,"t":{"1604":{"position":[[14,8]]},"1606":{"position":[[16,8]]}}}],["cron",{"_index":427,"t":{"876":{"position":[[0,5]]},"1194":{"position":[[0,5]]}}}],["crush",{"_index":497,"t":{"992":{"position":[[9,5]]},"1004":{"position":[[7,5]]},"1006":{"position":[[7,5]]}}}],["csi",{"_index":258,"t":{"393":{"position":[[11,3]]}}}],["current",{"_index":215,"t":{"303":{"position":[[0,7]]}}}],["custom",{"_index":232,"t":{"342":{"position":[[4,13]]},"431":{"position":[[0,6]]},"784":{"position":[[0,6]]},"1865":{"position":[[10,6]]}}}],["customis",{"_index":399,"t":{"794":{"position":[[0,14]]},"848":{"position":[[0,14]]}}}],["dashboard",{"_index":557,"t":{"1330":{"position":[[23,10]]},"1331":{"position":[[33,10]]}}}],["data",{"_index":221,"t":{"312":{"position":[[32,5]]},"951":{"position":[[6,4]]}}}],["databas",{"_index":536,"t":{"1186":{"position":[[0,8]]},"2156":{"position":[[0,8]]}}}],["day",{"_index":164,"t":{"230":{"position":[[14,3]]},"232":{"position":[[20,3]]}}}],["db",{"_index":515,"t":{"1092":{"position":[[36,2]]}}}],["deactiv",{"_index":372,"t":{"684":{"position":[[32,11]]}}}],["debian",{"_index":369,"t":{"676":{"position":[[0,6]]}}}],["debug",{"_index":240,"t":{"351":{"position":[[26,9]]}}}],["decis",{"_index":588,"t":{"1525":{"position":[[0,9]]},"1892":{"position":[[0,8]]},"1907":{"position":[[0,8]]},"1918":{"position":[[0,8]]},"1935":{"position":[[0,8]]},"1944":{"position":[[0,8]]},"1967":{"position":[[0,8]]},"1978":{"position":[[0,8]]},"2014":{"position":[[0,8]]},"2031":{"position":[[0,8]]},"2055":{"position":[[0,8]]},"2067":{"position":[[0,8]]},"2080":{"position":[[0,8]]},"2091":{"position":[[0,8]]},"2104":{"position":[[0,8]]},"2140":{"position":[[0,8]]},"2153":{"position":[[0,8]]},"2171":{"position":[[0,8]]},"2188":{"position":[[0,8]]},"2205":{"position":[[0,8]]}}}],["deep",{"_index":448,"t":{"944":{"position":[[15,5]]},"982":{"position":[[6,5]]}}}],["default",{"_index":230,"t":{"330":{"position":[[27,7]]},"485":{"position":[[0,7]]},"690":{"position":[[0,8]]},"1140":{"position":[[9,8]]},"2062":{"position":[[22,7]]}}}],["defect",{"_index":473,"t":{"968":{"position":[[10,6]]}}}],["defin",{"_index":375,"t":{"703":{"position":[[0,6]]},"1169":{"position":[[0,6]]}}}],["definit",{"_index":322,"t":{"560":{"position":[[0,10]]},"562":{"position":[[0,10]]},"564":{"position":[[0,10]]},"566":{"position":[[0,10]]},"568":{"position":[[0,10]]},"570":{"position":[[0,10]]},"572":{"position":[[0,10]]},"574":{"position":[[0,10]]},"576":{"position":[[0,10]]},"578":{"position":[[0,10]]},"611":{"position":[[0,11]]},"627":{"position":[[6,11]]},"1056":{"position":[[0,11]]},"1070":{"position":[[6,11]]},"2105":{"position":[[7,11]]},"2132":{"position":[[0,11]]},"2161":{"position":[[0,11]]}}}],["defragment",{"_index":243,"t":{"357":{"position":[[0,15]]}}}],["delet",{"_index":501,"t":{"1000":{"position":[[0,6]]}}}],["demonstr",{"_index":31,"t":{"42":{"position":[[31,12]]}}}],["depend",{"_index":96,"t":{"132":{"position":[[20,12]]},"1648":{"position":[[0,10]]}}}],["deploy",{"_index":186,"t":{"256":{"position":[[34,11]]},"351":{"position":[[15,10]]},"485":{"position":[[8,10]]},"772":{"position":[[0,6]]},"806":{"position":[[0,6]]}}}],["deprec",{"_index":574,"t":{"1375":{"position":[[0,12]]},"1376":{"position":[[0,12]]},"1410":{"position":[[0,12]]},"1444":{"position":[[0,12]]},"1480":{"position":[[0,12]]},"1481":{"position":[[0,12]]},"1506":{"position":[[0,12]]},"1599":{"position":[[0,11],[18,12]]}}}],["deriv",{"_index":129,"t":{"180":{"position":[[0,7]]}}}],["descriptor",{"_index":607,"t":{"1635":{"position":[[8,10]]},"1637":{"position":[[9,10]]},"1639":{"position":[[11,10]]}}}],["design",{"_index":438,"t":{"909":{"position":[[0,9]]},"1231":{"position":[[0,9]]},"1608":{"position":[[0,6]]},"1645":{"position":[[0,6]]},"1718":{"position":[[0,6]]},"1763":{"position":[[0,6]]},"1889":{"position":[[0,6]]},"1929":{"position":[[0,6]]},"1959":{"position":[[0,6]]},"1976":{"position":[[0,6]]},"1987":{"position":[[0,6]]},"2012":{"position":[[0,6]]},"2025":{"position":[[0,6]]},"2048":{"position":[[0,6]]},"2074":{"position":[[0,6]]},"2136":{"position":[[0,6]]},"2165":{"position":[[0,6]]},"2182":{"position":[[0,6]]},"2199":{"position":[[0,6]]}}}],["desir",{"_index":646,"t":{"1963":{"position":[[13,9]]},"2046":{"position":[[0,7]]}}}],["detach",{"_index":262,"t":{"400":{"position":[[5,6]]}}}],["detail",{"_index":538,"t":{"1261":{"position":[[0,8]]},"1686":{"position":[[9,7]]},"1697":{"position":[[28,7]]},"1723":{"position":[[9,7]]},"1744":{"position":[[28,7]]},"1768":{"position":[[9,7]]},"1785":{"position":[[28,7]]}}}],["develop",{"_index":98,"t":{"134":{"position":[[22,11]]},"268":{"position":[[0,11]]},"855":{"position":[[0,11]]},"1369":{"position":[[4,9]]},"1401":{"position":[[4,9]]},"1435":{"position":[[4,9]]},"1472":{"position":[[4,9]]},"1503":{"position":[[4,9]]},"1595":{"position":[[0,11]]}}}],["devic",{"_index":454,"t":{"948":{"position":[[34,7]]},"949":{"position":[[26,7]]},"951":{"position":[[33,7]]},"953":{"position":[[23,6]]},"955":{"position":[[14,6]]},"1009":{"position":[[25,7]]}}}],["differ",{"_index":306,"t":{"528":{"position":[[15,9]]},"955":{"position":[[26,9]]},"1004":{"position":[[23,9]]},"1991":{"position":[[17,9]]}}}],["direct",{"_index":109,"t":{"149":{"position":[[34,9]]},"1136":{"position":[[7,9]]},"1138":{"position":[[5,9]]},"1455":{"position":[[7,10]]}}}],["directori",{"_index":409,"t":{"813":{"position":[[20,9]]},"1150":{"position":[[33,11]]},"1156":{"position":[[19,11]]}}}],["disabl",{"_index":117,"t":{"161":{"position":[[0,7]]},"330":{"position":[[0,8]]},"974":{"position":[[0,7]]}}}],["disable/en",{"_index":447,"t":{"944":{"position":[[0,14]]}}}],["discoveri",{"_index":172,"t":{"248":{"position":[[23,9]]}}}],["disk",{"_index":481,"t":{"972":{"position":[[56,5]]},"1691":{"position":[[11,4]]},"1728":{"position":[[11,4]]},"1773":{"position":[[11,4]]}}}],["dispatch",{"_index":361,"t":{"668":{"position":[[0,10]]}}}],["display",{"_index":532,"t":{"1176":{"position":[[23,10]]},"1180":{"position":[[18,9]]}}}],["distribut",{"_index":366,"t":{"675":{"position":[[0,12]]},"1660":{"position":[[0,11]]}}}],["doc",{"_index":441,"t":{"935":{"position":[[14,4]]}}}],["docker",{"_index":652,"t":{"1995":{"position":[[18,8]]},"1997":{"position":[[7,7]]}}}],["docs.json",{"_index":71,"t":{"91":{"position":[[33,9]]}}}],["document",{"_index":65,"t":{"86":{"position":[[9,13]]},"88":{"position":[[13,13]]},"93":{"position":[[15,13]]},"95":{"position":[[13,13]]},"1583":{"position":[[25,9]]},"1585":{"position":[[9,9]]},"1587":{"position":[[0,8]]},"1660":{"position":[[12,13]]},"1898":{"position":[[8,9]]},"1909":{"position":[[8,9]]},"1920":{"position":[[8,9]]},"1937":{"position":[[8,9]]},"1950":{"position":[[8,9]]},"1980":{"position":[[0,9]]},"2016":{"position":[[8,9]]},"2023":{"position":[[20,8]]},"2033":{"position":[[8,9]]},"2059":{"position":[[8,9]]},"2082":{"position":[[8,9]]},"2144":{"position":[[8,9]]},"2173":{"position":[[8,9]]},"2190":{"position":[[8,9]]},"2207":{"position":[[8,9]]}}}],["domain",{"_index":392,"t":{"748":{"position":[[0,6]]},"1261":{"position":[[117,7]]}}}],["doubl",{"_index":477,"t":{"970":{"position":[[76,6]]}}}],["draft",{"_index":589,"t":{"1527":{"position":[[0,6]]},"1595":{"position":[[18,7]]},"2215":{"position":[[0,6]]}}}],["dri",{"_index":264,"t":{"404":{"position":[[5,3]]},"1154":{"position":[[11,4]]}}}],["drive",{"_index":465,"t":{"957":{"position":[[20,5]]},"959":{"position":[[24,5]]}}}],["dummi",{"_index":363,"t":{"669":{"position":[[0,5]]}}}],["dump",{"_index":483,"t":{"978":{"position":[[0,4]]},"992":{"position":[[0,4]]}}}],["e.g",{"_index":307,"t":{"528":{"position":[[55,5]]},"972":{"position":[[27,4]]}}}],["editor",{"_index":528,"t":{"1158":{"position":[[22,7]]}}}],["enabl",{"_index":370,"t":{"682":{"position":[[10,6]]},"998":{"position":[[0,8]]}}}],["endpoint",{"_index":667,"t":{"2111":{"position":[[0,8]]}}}],["entir",{"_index":524,"t":{"1152":{"position":[[14,6]]}}}],["entropi",{"_index":634,"t":{"1821":{"position":[[0,7]]},"1823":{"position":[[19,7]]},"1825":{"position":[[11,7]]},"1827":{"position":[[0,7]]},"1831":{"position":[[0,7]]}}}],["enumer",{"_index":455,"t":{"949":{"position":[[0,9]]}}}],["environ",{"_index":272,"t":{"413":{"position":[[52,11]]},"425":{"position":[[0,12]]},"427":{"position":[[21,11]]},"429":{"position":[[10,11]]},"431":{"position":[[7,11]]},"437":{"position":[[12,11]]},"524":{"position":[[45,12]]},"528":{"position":[[42,12]]},"530":{"position":[[31,12]]},"726":{"position":[[8,11]]},"1538":{"position":[[16,12]]},"1995":{"position":[[6,11]]}}}],["eras",{"_index":464,"t":{"957":{"position":[[7,5]]},"959":{"position":[[7,5]]}}}],["error",{"_index":494,"t":{"986":{"position":[[41,6]]}}}],["etc/interfac",{"_index":365,"t":{"671":{"position":[[0,15]]}}}],["etcd",{"_index":241,"t":{"355":{"position":[[0,4]]},"467":{"position":[[0,4]]}}}],["even",{"_index":152,"t":{"205":{"position":[[14,7]]},"213":{"position":[[10,7]]}}}],["event",{"_index":157,"t":{"213":{"position":[[18,5]]}}}],["event_definitions.yaml",{"_index":548,"t":{"1297":{"position":[[4,22]]}}}],["event_pipeline.yaml",{"_index":549,"t":{"1299":{"position":[[4,19]]}}}],["exampl",{"_index":156,"t":{"209":{"position":[[16,10]]},"218":{"position":[[10,8]]},"222":{"position":[[12,8]]},"666":{"position":[[0,7]]},"688":{"position":[[0,7]]},"1123":{"position":[[0,7]]},"1160":{"position":[[0,7]]},"1173":{"position":[[0,7]]},"1641":{"position":[[6,7]]},"1701":{"position":[[9,8]]},"1752":{"position":[[9,8]]},"1793":{"position":[[9,8]]},"1873":{"position":[[5,7]]}}}],["exclud",{"_index":526,"t":{"1156":{"position":[[0,9]]}}}],["exempl",{"_index":160,"t":{"220":{"position":[[6,8]]}}}],["exist",{"_index":191,"t":{"266":{"position":[[0,8]]},"473":{"position":[[23,8]]},"2089":{"position":[[0,8]]}}}],["expir",{"_index":235,"t":{"347":{"position":[[34,6]]},"349":{"position":[[22,7]]}}}],["export",{"_index":558,"t":{"1331":{"position":[[11,9]]}}}],["extens",{"_index":627,"t":{"1738":{"position":[[0,10]]},"1779":{"position":[[0,10]]}}}],["extern",{"_index":423,"t":{"849":{"position":[[19,8]]}}}],["extra",{"_index":358,"t":{"660":{"position":[[0,5]]},"1699":{"position":[[11,5]]},"1842":{"position":[[11,6]]}}}],["fail",{"_index":238,"t":{"351":{"position":[[0,6]]},"1160":{"position":[[11,6]]},"1186":{"position":[[18,5]]}}}],["faq",{"_index":233,"t":{"344":{"position":[[0,3]]}}}],["faq`",{"_index":85,"t":{"115":{"position":[[0,5]]}}}],["featur",{"_index":213,"t":{"299":{"position":[[0,8]]},"1307":{"position":[[0,8]]},"1366":{"position":[[4,8]]},"1398":{"position":[[4,8]]},"1432":{"position":[[4,8]]},"1501":{"position":[[4,8]]},"1699":{"position":[[17,8]]},"1806":{"position":[[27,8]]},"1963":{"position":[[23,8]]},"1989":{"position":[[9,8]]}}}],["feder",{"_index":180,"t":{"252":{"position":[[23,9]]},"254":{"position":[[37,9]]},"256":{"position":[[8,10]]},"750":{"position":[[5,10]]},"1261":{"position":[[38,10]]},"1338":{"position":[[0,10]]}}}],["field",{"_index":666,"t":{"2109":{"position":[[11,6]]}}}],["file",{"_index":408,"t":{"813":{"position":[[12,4]]},"1031":{"position":[[0,5]]},"1148":{"position":[[20,4]]},"1150":{"position":[[20,5]]},"1156":{"position":[[10,5]]},"1646":{"position":[[0,4]]}}}],["find",{"_index":305,"t":{"526":{"position":[[12,4]]},"550":{"position":[[40,4]]},"935":{"position":[[9,4]]}}}],["fix",{"_index":575,"t":{"1378":{"position":[[9,5]]},"1412":{"position":[[9,5]]},"1446":{"position":[[9,5]]},"1483":{"position":[[9,5]]},"1507":{"position":[[9,5]]}}}],["flavor",{"_index":622,"t":{"1703":{"position":[[13,7]]},"1721":{"position":[[33,6]]},"1730":{"position":[[13,7]]},"1766":{"position":[[33,6]]},"1832":{"position":[[0,7]]},"1844":{"position":[[13,7]]}}}],["fluentd",{"_index":428,"t":{"876":{"position":[[6,7]]},"1194":{"position":[[6,7]]}}}],["focus",{"_index":572,"t":{"1367":{"position":[[9,7]]},"1369":{"position":[[14,7]]},"1399":{"position":[[9,7]]},"1401":{"position":[[14,7]]},"1433":{"position":[[9,7]]},"1435":{"position":[[14,7]]},"1472":{"position":[[14,7]]},"1502":{"position":[[9,7]]},"1503":{"position":[[14,7]]}}}],["format",{"_index":461,"t":{"953":{"position":[[6,6]]},"955":{"position":[[0,6],[40,6]]},"1148":{"position":[[0,10]]},"1150":{"position":[[0,10]]},"1152":{"position":[[0,10]]},"1587":{"position":[[9,6]]},"1646":{"position":[[5,6]]},"1670":{"position":[[18,6]]}}}],["forward",{"_index":656,"t":{"2001":{"position":[[14,7]]}}}],["found",{"_index":490,"t":{"984":{"position":[[33,8]]}}}],["framework",{"_index":555,"t":{"1327":{"position":[[3,9]]}}}],["friendli",{"_index":124,"t":{"170":{"position":[[21,8]]}}}],["frontend",{"_index":544,"t":{"1275":{"position":[[20,8]]}}}],["full",{"_index":642,"t":{"1873":{"position":[[0,4]]}}}],["fullclean",{"_index":254,"t":{"380":{"position":[[5,9]]}}}],["further",{"_index":120,"t":{"167":{"position":[[0,7]]},"188":{"position":[[0,7]]},"1017":{"position":[[21,7]]},"1629":{"position":[[24,7]]}}}],["futur",{"_index":217,"t":{"303":{"position":[[18,6]]},"1455":{"position":[[0,6]]}}}],["gaia",{"_index":29,"t":{"42":{"position":[[24,4]]},"1711":{"position":[[12,4]]}}}],["gate",{"_index":55,"t":{"73":{"position":[[33,6]]}}}],["gather",{"_index":452,"t":{"948":{"position":[[0,9]]}}}],["gener",{"_index":59,"t":{"77":{"position":[[0,7]]},"326":{"position":[[22,7]]},"361":{"position":[[0,7]]},"613":{"position":[[16,9]]},"939":{"position":[[0,7]]},"1058":{"position":[[16,9]]}}}],["get",{"_index":20,"t":{"34":{"position":[[0,7]]},"42":{"position":[[0,7]]},"47":{"position":[[0,7]]},"109":{"position":[[0,7]]},"324":{"position":[[0,7]]},"326":{"position":[[0,7]]},"625":{"position":[[0,7]]},"759":{"position":[[0,7]]},"786":{"position":[[0,7]]},"862":{"position":[[0,7]]},"1068":{"position":[[0,7]]}}}],["gib",{"_index":387,"t":{"731":{"position":[[48,3]]}}}],["git",{"_index":378,"t":{"711":{"position":[[0,3]]},"1176":{"position":[[5,3]]},"1178":{"position":[[5,3]]}}}],["github",{"_index":9,"t":{"10":{"position":[[9,6]]},"121":{"position":[[0,6]]},"1171":{"position":[[0,6]]}}}],["glanc",{"_index":335,"t":{"586":{"position":[[0,6]]},"621":{"position":[[24,8]]},"907":{"position":[[0,6]]},"1064":{"position":[[24,8]]},"1229":{"position":[[0,6]]}}}],["global",{"_index":468,"t":{"964":{"position":[[17,7]]}}}],["glossari",{"_index":648,"t":{"1972":{"position":[[0,8]]},"2008":{"position":[[0,8]]},"2040":{"position":[[0,8]]}}}],["goal",{"_index":565,"t":{"1348":{"position":[[13,5]]}}}],["gpu",{"_index":628,"t":{"1746":{"position":[[11,3]]},"1787":{"position":[[11,3]]}}}],["grafana",{"_index":436,"t":{"894":{"position":[[0,7]]},"1215":{"position":[[0,7]]},"1331":{"position":[[25,7]]}}}],["graph",{"_index":610,"t":{"1648":{"position":[[11,5]]}}}],["group",{"_index":48,"t":{"65":{"position":[[17,6]]},"293":{"position":[[7,6]]},"702":{"position":[[0,5]]},"977":{"position":[[10,5]]},"978":{"position":[[15,6]]},"982":{"position":[[38,5]]}}}],["guarante",{"_index":640,"t":{"1850":{"position":[[0,10]]}}}],["guid",{"_index":90,"t":{"127":{"position":[[13,5]]},"1670":{"position":[[33,5]]}}}],["hackathon",{"_index":145,"t":{"192":{"position":[[26,9]]},"196":{"position":[[26,9]]},"203":{"position":[[26,9]]},"211":{"position":[[26,9]]},"215":{"position":[[26,9]]},"226":{"position":[[25,9]]},"228":{"position":[[24,9]]},"230":{"position":[[25,9]]},"232":{"position":[[10,9]]},"234":{"position":[[16,9]]}}}],["handl",{"_index":517,"t":{"1111":{"position":[[7,6]]},"1808":{"position":[[6,8]]}}}],["hardwar",{"_index":620,"t":{"1695":{"position":[[11,8]]},"1742":{"position":[[11,8]]},"1783":{"position":[[11,8]]}}}],["hdparm",{"_index":466,"t":{"959":{"position":[[36,6]]}}}],["health",{"_index":228,"t":{"330":{"position":[[9,6]]},"942":{"position":[[14,6]]},"1333":{"position":[[10,6]]},"1961":{"position":[[4,6]]}}}],["health_warn",{"_index":487,"t":{"984":{"position":[[0,11]]}}}],["helm",{"_index":281,"t":{"446":{"position":[[33,4]]}}}],["help",{"_index":321,"t":{"550":{"position":[[45,5]]},"1017":{"position":[[29,4]]}}}],["hetzner",{"_index":651,"t":{"1993":{"position":[[26,8]]}}}],["highlight",{"_index":571,"t":{"1364":{"position":[[49,12]]},"1366":{"position":[[13,12]]},"1396":{"position":[[49,12]]},"1398":{"position":[[13,12]]},"1430":{"position":[[49,12]]},"1432":{"position":[[13,12]]},"1455":{"position":[[28,11]]},"1463":{"position":[[49,12]]},"1500":{"position":[[49,12]]},"1501":{"position":[[13,12]]}}}],["horizon",{"_index":178,"t":{"252":{"position":[[4,7]]},"580":{"position":[[0,7]]},"753":{"position":[[0,7]]},"921":{"position":[[0,7]]},"1247":{"position":[[0,7]]}}}],["host",{"_index":283,"t":{"452":{"position":[[11,4]]},"454":{"position":[[24,4]]},"564":{"position":[[14,4]]},"701":{"position":[[0,4]]}}}],["hotel",{"_index":148,"t":{"198":{"position":[[10,5]]}}}],["hypervisor",{"_index":619,"t":{"1693":{"position":[[11,10]]},"1740":{"position":[[11,10]]},"1781":{"position":[[11,10]]}}}],["iaa",{"_index":165,"t":{"240":{"position":[[3,4]]},"536":{"position":[[60,6]]},"538":{"position":[[10,4]]},"540":{"position":[[11,4]]},"1464":{"position":[[0,4]]},"1993":{"position":[[0,4]]}}}],["iam",{"_index":582,"t":{"1470":{"position":[[15,3]]}}}],["identifi",{"_index":355,"t":{"652":{"position":[[7,10]]}}}],["idp",{"_index":170,"t":{"248":{"position":[[13,3]]}}}],["imag",{"_index":345,"t":{"621":{"position":[[10,5]]},"627":{"position":[[0,5]]},"629":{"position":[[4,5]]},"631":{"position":[[0,5]]},"633":{"position":[[0,5]]},"638":{"position":[[10,6]]},"640":{"position":[[9,6]]},"731":{"position":[[27,6]]},"844":{"position":[[21,6]]},"1064":{"position":[[10,5]]},"1070":{"position":[[0,5]]},"1072":{"position":[[4,5]]},"1074":{"position":[[0,5]]},"1076":{"position":[[0,5]]},"1081":{"position":[[10,6]]},"1083":{"position":[[9,6]]},"1100":{"position":[[27,5]]},"1243":{"position":[[8,5]]},"1808":{"position":[[0,5]]},"1809":{"position":[[0,5]]},"1811":{"position":[[0,5]]},"1813":{"position":[[0,5]]},"1834":{"position":[[0,6]]},"1865":{"position":[[17,6]]},"1867":{"position":[[9,6]]},"1869":{"position":[[0,5],[28,5]]},"1871":{"position":[[0,5],[30,6]]},"1878":{"position":[[0,5]]}}}],["impact",{"_index":657,"t":{"2042":{"position":[[0,6]]},"2117":{"position":[[0,6]]},"2119":{"position":[[10,7]]}}}],["implement",{"_index":188,"t":{"263":{"position":[[14,14]]},"532":{"position":[[20,14]]},"534":{"position":[[31,14]]},"536":{"position":[[45,14]]},"1273":{"position":[[10,14]]},"1277":{"position":[[10,14]]},"1668":{"position":[[10,14]]},"1896":{"position":[[0,14]]}}}],["import",{"_index":419,"t":{"844":{"position":[[0,6]]}}}],["improv",{"_index":570,"t":{"1364":{"position":[[36,12]]},"1367":{"position":[[17,12]]},"1369":{"position":[[22,12]]},"1396":{"position":[[36,12]]},"1399":{"position":[[17,12]]},"1401":{"position":[[22,12]]},"1430":{"position":[[36,12]]},"1433":{"position":[[17,12]]},"1435":{"position":[[22,12]]},"1463":{"position":[[36,12]]},"1472":{"position":[[22,12]]},"1500":{"position":[[36,12]]},"1502":{"position":[[17,12]]},"1503":{"position":[[22,12]]}}}],["includ",{"_index":411,"t":{"820":{"position":[[0,8]]},"1682":{"position":[[20,8]]},"1719":{"position":[[20,8]]},"1764":{"position":[[20,8]]}}}],["inconsist",{"_index":495,"t":{"986":{"position":[[48,13]]}}}],["infiniband",{"_index":629,"t":{"1748":{"position":[[11,10]]},"1789":{"position":[[11,10]]}}}],["info",{"_index":632,"t":{"1813":{"position":[[12,4]]}}}],["inform",{"_index":60,"t":{"77":{"position":[[8,11]]},"99":{"position":[[0,11]]},"948":{"position":[[10,11]]},"1682":{"position":[[8,11]]},"1719":{"position":[[8,11]]},"1764":{"position":[[8,11]]},"1821":{"position":[[11,11]]}}}],["infrastructur",{"_index":585,"t":{"1474":{"position":[[8,14]]}}}],["ingress",{"_index":224,"t":{"324":{"position":[[31,7]]},"490":{"position":[[0,7]]}}}],["init",{"_index":260,"t":{"396":{"position":[[5,4]]}}}],["instal",{"_index":89,"t":{"127":{"position":[[0,12]]},"128":{"position":[[9,10]]},"132":{"position":[[9,10]]},"607":{"position":[[0,12]]},"832":{"position":[[0,12]]},"833":{"position":[[10,12]]},"835":{"position":[[7,12]]},"866":{"position":[[0,7]]},"1052":{"position":[[0,12]]},"1119":{"position":[[0,12]]},"1146":{"position":[[0,12]]},"1166":{"position":[[0,12]]}}}],["instanc",{"_index":541,"t":{"1261":{"position":[[87,9]]},"1827":{"position":[[19,9]]}}}],["instruct",{"_index":491,"t":{"986":{"position":[[0,8]]}}}],["integr",{"_index":390,"t":{"736":{"position":[[11,11]]},"738":{"position":[[17,11]]},"1158":{"position":[[0,11]]}}}],["intend",{"_index":302,"t":{"520":{"position":[[11,8]]}}}],["interest",{"_index":47,"t":{"65":{"position":[[8,8]]}}}],["interfac",{"_index":364,"t":{"669":{"position":[[6,10]]},"743":{"position":[[8,10]]},"842":{"position":[[13,10]]}}}],["introduct",{"_index":591,"t":{"1579":{"position":[[0,12]]},"1614":{"position":[[0,12]]},"1621":{"position":[[0,12]]},"1656":{"position":[[0,12]]},"1677":{"position":[[0,12]]},"1714":{"position":[[0,12]]},"1759":{"position":[[0,12]]},"1820":{"position":[[0,12]]},"1839":{"position":[[0,12]]},"1861":{"position":[[0,12]]},"1885":{"position":[[0,12]]},"1903":{"position":[[0,12]]},"1914":{"position":[[0,12]]},"1925":{"position":[[0,12]]},"1940":{"position":[[0,12]]},"1955":{"position":[[0,12]]},"1970":{"position":[[0,12]]},"1983":{"position":[[0,12]]},"2006":{"position":[[0,12]]},"2021":{"position":[[0,12]]},"2038":{"position":[[0,12]]},"2070":{"position":[[0,12]]},"2087":{"position":[[0,12]]},"2098":{"position":[[0,12]]},"2130":{"position":[[0,12]]},"2149":{"position":[[0,12]]},"2159":{"position":[[0,12]]},"2178":{"position":[[0,12]]},"2195":{"position":[[0,12]]}}}],["inventori",{"_index":383,"t":{"728":{"position":[[0,9]]},"1106":{"position":[[0,9]]}}}],["iport",{"_index":149,"t":{"199":{"position":[[0,8]]}}}],["issu",{"_index":38,"t":{"58":{"position":[[19,6]]},"287":{"position":[[0,6]]},"1343":{"position":[[6,5]]},"1358":{"position":[[14,6]]},"1380":{"position":[[9,6]]},"1386":{"position":[[14,6]]},"1414":{"position":[[9,6]]},"1420":{"position":[[14,6]]},"1448":{"position":[[9,6]]},"1454":{"position":[[14,6]]},"1485":{"position":[[9,6]]},"1491":{"position":[[14,6]]},"1508":{"position":[[9,6]]},"1511":{"position":[[14,6]]}}}],["job",{"_index":222,"t":{"318":{"position":[[0,4]]},"338":{"position":[[0,4]]},"342":{"position":[[0,3]]},"824":{"position":[[3,4]]},"1160":{"position":[[36,3]]}}}],["k8",{"_index":268,"t":{"411":{"position":[[10,3]]},"461":{"position":[[0,3]]},"1369":{"position":[[48,3]]},"1401":{"position":[[48,3]]},"1472":{"position":[[64,3]]},"1503":{"position":[[48,3]]}}}],["k9",{"_index":249,"t":{"370":{"position":[[5,3]]}}}],["key",{"_index":105,"t":{"147":{"position":[[0,3]]}}}],["keycloak",{"_index":169,"t":{"248":{"position":[[4,8]]},"1261":{"position":[[78,8]]},"1339":{"position":[[17,8]]}}}],["keyston",{"_index":167,"t":{"246":{"position":[[3,8]]},"250":{"position":[[4,8]]},"584":{"position":[[0,8]]},"905":{"position":[[0,8]]},"1227":{"position":[[0,8]]}}}],["known",{"_index":552,"t":{"1311":{"position":[[0,5]]},"1343":{"position":[[0,5]]},"1358":{"position":[[8,5]]},"1386":{"position":[[8,5]]},"1420":{"position":[[8,5]]},"1454":{"position":[[8,5]]},"1491":{"position":[[8,5]]},"1511":{"position":[[8,5]]}}}],["kolla",{"_index":429,"t":{"876":{"position":[[16,5]]},"1194":{"position":[[16,5]]}}}],["kubeconfig",{"_index":247,"t":{"364":{"position":[[9,10]]}}}],["kubernet",{"_index":234,"t":{"347":{"position":[[23,10]]},"1193":{"position":[[0,10]]}}}],["kubevirt",{"_index":653,"t":{"1995":{"position":[[27,9]]}}}],["label",{"_index":519,"t":{"1129":{"position":[[9,5]]},"2115":{"position":[[0,6]]}}}],["languag",{"_index":672,"t":{"2154":{"position":[[12,8]]}}}],["larg",{"_index":488,"t":{"984":{"position":[[14,5]]}}}],["larger",{"_index":386,"t":{"731":{"position":[[34,6]]}}}],["latest",{"_index":380,"t":{"715":{"position":[[7,6]]}}}],["layer",{"_index":315,"t":{"536":{"position":[[21,6]]},"540":{"position":[[16,5]]},"542":{"position":[[32,6]]},"1347":{"position":[[10,5]]}}}],["layout",{"_index":377,"t":{"707":{"position":[[25,6]]}}}],["lba",{"_index":462,"t":{"955":{"position":[[36,3]]}}}],["leader",{"_index":292,"t":{"467":{"position":[[5,6]]}}}],["licens",{"_index":139,"t":{"184":{"position":[[38,7]]},"186":{"position":[[0,7],[13,7]]},"1815":{"position":[[0,9]]}}}],["lifecycl",{"_index":604,"t":{"1627":{"position":[[0,9]]},"1875":{"position":[[0,9]]},"1876":{"position":[[5,9]]},"1878":{"position":[[6,9]]}}}],["limit",{"_index":214,"t":{"301":{"position":[[0,11]]},"2053":{"position":[[0,11]]}}}],["line",{"_index":418,"t":{"842":{"position":[[8,4]]}}}],["link",{"_index":568,"t":{"1354":{"position":[[9,5]]}}}],["lint",{"_index":118,"t":{"161":{"position":[[8,7]]}}}],["list",{"_index":115,"t":{"157":{"position":[[22,5]]},"408":{"position":[[5,4]]},"932":{"position":[[0,4]]},"1040":{"position":[[0,4]]},"1140":{"position":[[0,5]]},"1358":{"position":[[0,4]]},"1386":{"position":[[0,4]]},"1420":{"position":[[0,4]]},"1454":{"position":[[0,4]]},"1491":{"position":[[0,4]]},"1511":{"position":[[0,4]]},"2113":{"position":[[6,4]]}}}],["loadbalanc",{"_index":227,"t":{"328":{"position":[[13,12]]},"878":{"position":[[0,12]]},"1196":{"position":[[0,12]]}}}],["local",{"_index":404,"t":{"811":{"position":[[12,6]]},"1995":{"position":[[0,5]]}}}],["locat",{"_index":153,"t":{"205":{"position":[[29,8]]},"962":{"position":[[0,6]]}}}],["log",{"_index":250,"t":{"372":{"position":[[5,3]]},"1180":{"position":[[5,4]]},"1335":{"position":[[0,7]]},"1336":{"position":[[8,7]]}}}],["logout",{"_index":562,"t":{"1343":{"position":[[22,6]]}}}],["lvm",{"_index":457,"t":{"949":{"position":[[38,3]]},"1009":{"position":[[21,3]]}}}],["machin",{"_index":385,"t":{"731":{"position":[[19,7]]},"851":{"position":[[21,7]]},"1629":{"position":[[0,7]]},"1997":{"position":[[23,7]]},"1999":{"position":[[8,7]]}}}],["mainten",{"_index":242,"t":{"355":{"position":[[5,11]]},"927":{"position":[[0,11]]},"939":{"position":[[8,11]]},"961":{"position":[[4,11]]},"977":{"position":[[16,11]]},"988":{"position":[[11,11]]},"1815":{"position":[[12,11]]}}}],["make",{"_index":56,"t":{"75":{"position":[[7,4]]},"362":{"position":[[0,4]]},"364":{"position":[[0,4]]},"366":{"position":[[0,4]]},"368":{"position":[[0,4]]},"370":{"position":[[0,4]]},"372":{"position":[[0,4]]},"374":{"position":[[0,4]]},"378":{"position":[[0,4]]},"380":{"position":[[0,4]]},"382":{"position":[[0,4]]},"385":{"position":[[0,4]]},"387":{"position":[[0,4]]},"389":{"position":[[0,4]]},"391":{"position":[[0,4]]},"393":{"position":[[0,4]]},"396":{"position":[[0,4]]},"398":{"position":[[0,4]]},"400":{"position":[[0,4]]},"402":{"position":[[0,4]]},"404":{"position":[[0,4]]},"406":{"position":[[0,4]]},"408":{"position":[[0,4]]},"717":{"position":[[0,4]]},"1113":{"position":[[7,4]]}}}],["makfil",{"_index":412,"t":{"822":{"position":[[0,7]]}}}],["manag",{"_index":223,"t":{"324":{"position":[[23,7]]},"415":{"position":[[16,10]]},"417":{"position":[[18,10]]},"452":{"position":[[0,10]]},"454":{"position":[[13,10]]},"574":{"position":[[14,7]]},"698":{"position":[[0,7]]},"726":{"position":[[0,7]]},"748":{"position":[[7,7]]},"1369":{"position":[[60,11]]},"1401":{"position":[[60,11]]},"1404":{"position":[[8,10]]},"1438":{"position":[[8,10]]},"1466":{"position":[[10,10]]},"1472":{"position":[[76,11]]},"1503":{"position":[[60,11]]}}}],["mandatori",{"_index":79,"t":{"103":{"position":[[11,9]]},"105":{"position":[[15,9]]},"107":{"position":[[47,9]]},"109":{"position":[[18,9]]},"111":{"position":[[16,9]]},"113":{"position":[[13,9]]},"463":{"position":[[17,9]]},"1625":{"position":[[12,9]]},"1846":{"position":[[0,9]]}}}],["manual",{"_index":416,"t":{"835":{"position":[[0,6]]},"859":{"position":[[0,6]]},"1015":{"position":[[29,6]]}}}],["map",{"_index":174,"t":{"250":{"position":[[13,7]]}}}],["mariadb",{"_index":434,"t":{"886":{"position":[[0,7]]},"1204":{"position":[[0,7]]}}}],["matrix",{"_index":665,"t":{"2095":{"position":[[11,6]]}}}],["mean",{"_index":313,"t":{"532":{"position":[[35,5]]},"538":{"position":[[15,5]]},"542":{"position":[[15,5]]}}}],["meet",{"_index":40,"t":{"60":{"position":[[0,8]]},"63":{"position":[[49,8]]}}}],["memcach",{"_index":432,"t":{"882":{"position":[[0,9]]},"1200":{"position":[[0,9]]}}}],["memori",{"_index":617,"t":{"1689":{"position":[[11,6]]},"1726":{"position":[[11,6]]},"1771":{"position":[[11,6]]}}}],["merch",{"_index":155,"t":{"209":{"position":[[10,5]]}}}],["messag",{"_index":333,"t":{"582":{"position":[[0,7]]},"1143":{"position":[[7,8]]}}}],["metadata",{"_index":467,"t":{"964":{"position":[[8,8]]}}}],["metal",{"_index":564,"t":{"1345":{"position":[[5,5]]}}}],["meter",{"_index":546,"t":{"1293":{"position":[[14,8]]}}}],["methodolog",{"_index":611,"t":{"1662":{"position":[[0,11]]}}}],["metric",{"_index":556,"t":{"1330":{"position":[[0,7]]}}}],["migrat",{"_index":300,"t":{"496":{"position":[[0,9]]}}}],["mirror",{"_index":351,"t":{"638":{"position":[[0,9]]},"1081":{"position":[[0,9]]}}}],["miss",{"_index":514,"t":{"1092":{"position":[[19,7]]}}}],["mode",{"_index":525,"t":{"1154":{"position":[[6,4]]}}}],["monitor",{"_index":229,"t":{"330":{"position":[[16,7]]},"1333":{"position":[[17,7]]}}}],["month",{"_index":143,"t":{"192":{"position":[[12,6]]},"196":{"position":[[12,6]]},"203":{"position":[[12,6]]},"211":{"position":[[12,6]]},"215":{"position":[[12,6]]},"226":{"position":[[12,5]]}}}],["motiv",{"_index":602,"t":{"1616":{"position":[[0,10]]},"1623":{"position":[[0,10]]},"1658":{"position":[[0,10]]},"1679":{"position":[[0,10]]},"1716":{"position":[[0,10]]},"1761":{"position":[[0,10]]},"1800":{"position":[[0,10]]},"1829":{"position":[[0,10]]},"1840":{"position":[[0,10]]},"1863":{"position":[[0,10]]},"1887":{"position":[[0,10]]},"1905":{"position":[[0,10]]},"1916":{"position":[[0,10]]},"1927":{"position":[[0,10]]},"1942":{"position":[[0,10]]},"1957":{"position":[[0,10]]},"1974":{"position":[[0,10]]},"1985":{"position":[[0,10]]},"2010":{"position":[[0,10]]},"2023":{"position":[[0,10]]},"2044":{"position":[[0,10]]},"2072":{"position":[[0,10]]},"2102":{"position":[[0,10]]},"2134":{"position":[[0,10]]},"2151":{"position":[[0,10]]},"2163":{"position":[[0,10]]},"2180":{"position":[[0,10]]},"2197":{"position":[[0,10]]}}}],["move",{"_index":288,"t":{"458":{"position":[[15,4]]},"1006":{"position":[[29,6]]}}}],["multipl",{"_index":522,"t":{"1150":{"position":[[11,8]]}}}],["mute/unmut",{"_index":445,"t":{"942":{"position":[[0,11]]}}}],["name",{"_index":104,"t":{"145":{"position":[[5,6]]},"613":{"position":[[0,4]]},"1058":{"position":[[0,4]]},"1134":{"position":[[5,5]]},"1705":{"position":[[0,6]]},"1721":{"position":[[40,6]]},"1732":{"position":[[0,6]]},"1750":{"position":[[0,6]]},"1766":{"position":[[40,6]]},"1775":{"position":[[0,6]]},"1791":{"position":[[0,6]]},"1804":{"position":[[0,6]]},"2111":{"position":[[9,6]]}}}],["need",{"_index":304,"t":{"524":{"position":[[15,4]]},"534":{"position":[[5,4]]}}}],["ness",{"_index":660,"t":{"2060":{"position":[[8,4]]}}}],["nest",{"_index":621,"t":{"1695":{"position":[[37,6]]},"1742":{"position":[[37,6]]},"1783":{"position":[[37,6]]}}}],["netplan",{"_index":360,"t":{"664":{"position":[[0,7]]}}}],["network",{"_index":332,"t":{"576":{"position":[[23,7]]},"743":{"position":[[0,7]]},"768":{"position":[[10,7]]},"849":{"position":[[28,7]]}}}],["neutron",{"_index":339,"t":{"594":{"position":[[0,7]]},"915":{"position":[[0,7]]},"1237":{"position":[[0,7]]}}}],["new",{"_index":290,"t":{"463":{"position":[[0,3]]},"465":{"position":[[0,3]]},"709":{"position":[[11,3]]},"725":{"position":[[12,3]]},"966":{"position":[[6,3]]},"1098":{"position":[[13,3]]},"1100":{"position":[[13,3]]},"1366":{"position":[[0,3]]},"1398":{"position":[[0,3]]},"1432":{"position":[[0,3]]},"1501":{"position":[[0,3]]}}}],["nextcloud",{"_index":51,"t":{"71":{"position":[[0,9]]}}}],["nic",{"_index":422,"t":{"849":{"position":[[11,3]]}}}],["nice",{"_index":151,"t":{"201":{"position":[[0,4]]}}}],["node",{"_index":330,"t":{"570":{"position":[[22,4]]},"572":{"position":[[22,4]]},"574":{"position":[[22,4]]},"703":{"position":[[24,5]]},"925":{"position":[[0,4]]},"946":{"position":[[16,4]]},"969":{"position":[[20,4]]},"1836":{"position":[[8,5]]}}}],["node.j",{"_index":91,"t":{"128":{"position":[[20,7]]}}}],["non",{"_index":560,"t":{"1341":{"position":[[0,3]]},"1946":{"position":[[9,3]]}}}],["note",{"_index":371,"t":{"684":{"position":[[0,4]]},"721":{"position":[[0,5]]},"815":{"position":[[0,5]]},"1117":{"position":[[21,5]]},"1125":{"position":[[29,5]]},"1371":{"position":[[18,5]]},"1403":{"position":[[18,5]]},"1437":{"position":[[18,5]]},"1476":{"position":[[18,5]]},"1504":{"position":[[18,5]]},"1896":{"position":[[15,4]]}}}],["nova",{"_index":338,"t":{"592":{"position":[[0,4]]},"917":{"position":[[0,4]]},"1239":{"position":[[0,4]]}}}],["number",{"_index":502,"t":{"1002":{"position":[[4,6]]}}}],["nvm",{"_index":93,"t":{"128":{"position":[[32,3]]}}}],["nvme",{"_index":460,"t":{"951":{"position":[[28,4]]},"953":{"position":[[18,4]]},"955":{"position":[[9,4],[53,4]]},"957":{"position":[[15,4],[32,4]]}}}],["object",{"_index":25,"t":{"37":{"position":[[0,6]]},"623":{"position":[[0,6]]},"984":{"position":[[25,7]]},"1066":{"position":[[0,6]]},"2107":{"position":[[4,7]]},"2109":{"position":[[4,6]]}}}],["octavia",{"_index":352,"t":{"644":{"position":[[0,7]]},"919":{"position":[[0,7]]},"1086":{"position":[[0,7]]},"1241":{"position":[[0,7]]}}}],["octo",{"_index":122,"t":{"170":{"position":[[0,4]]}}}],["offer",{"_index":114,"t":{"157":{"position":[[16,5]]}}}],["oidc",{"_index":393,"t":{"750":{"position":[[0,4]]},"801":{"position":[[20,4]]},"1339":{"position":[[0,4]]},"1343":{"position":[[17,4]]}}}],["omap",{"_index":489,"t":{"984":{"position":[[20,4]]}}}],["on",{"_index":163,"t":{"230":{"position":[[10,3]]},"347":{"position":[[47,3]]}}}],["open",{"_index":11,"t":{"13":{"position":[[9,4]]},"897":{"position":[[0,4]]},"1220":{"position":[[0,4]]},"1603":{"position":[[0,4]]},"1652":{"position":[[0,4]]},"1672":{"position":[[0,4]]},"1933":{"position":[[0,4]]},"2029":{"position":[[0,4]]},"2052":{"position":[[0,4]]},"2078":{"position":[[0,4]]},"2142":{"position":[[0,4]]},"2169":{"position":[[0,4]]},"2186":{"position":[[0,4]]},"2203":{"position":[[0,4]]}}}],["openid",{"_index":539,"t":{"1261":{"position":[[49,7]]}}}],["opensearch",{"_index":389,"t":{"736":{"position":[[0,10]]},"890":{"position":[[0,10]]},"1037":{"position":[[0,10]]},"1211":{"position":[[0,10]]}}}],["openstack",{"_index":22,"t":{"34":{"position":[[21,9]]},"47":{"position":[[21,9]]},"240":{"position":[[10,9]]},"254":{"position":[[4,9]]},"368":{"position":[[5,9]]},"621":{"position":[[0,9]]},"738":{"position":[[0,9]]},"752":{"position":[[0,9]]},"903":{"position":[[0,9]]},"1064":{"position":[[0,9]]},"1249":{"position":[[0,9]]},"1333":{"position":[[0,9]]},"1993":{"position":[[14,11]]}}}],["openstackcli",{"_index":24,"t":{"35":{"position":[[0,15]]},"54":{"position":[[0,15]]}}}],["oper",{"_index":72,"t":{"93":{"position":[[3,11]]},"766":{"position":[[7,8]]},"1367":{"position":[[0,8]]},"1399":{"position":[[0,8]]},"1433":{"position":[[0,8]]},"1470":{"position":[[0,10]]},"1502":{"position":[[0,8]]},"1736":{"position":[[0,11]]},"1856":{"position":[[0,11]]},"1882":{"position":[[0,11]]}}}],["option",{"_index":82,"t":{"107":{"position":[[13,9]]},"115":{"position":[[8,8]]},"465":{"position":[[17,8]]},"487":{"position":[[14,7]]},"1691":{"position":[[0,10]]},"1693":{"position":[[0,10]]},"1695":{"position":[[0,10]]},"1697":{"position":[[0,10]]},"1699":{"position":[[0,10]]},"1728":{"position":[[0,10]]},"1740":{"position":[[0,10]]},"1742":{"position":[[0,10]]},"1744":{"position":[[0,10]]},"1746":{"position":[[0,10]]},"1748":{"position":[[0,10]]},"1750":{"position":[[7,7]]},"1773":{"position":[[0,10]]},"1781":{"position":[[0,10]]},"1783":{"position":[[0,10]]},"1785":{"position":[[0,10]]},"1787":{"position":[[0,10]]},"1789":{"position":[[0,10]]},"1791":{"position":[[7,7]]},"1890":{"position":[[0,7]]},"1931":{"position":[[0,7]]},"2027":{"position":[[0,7]]},"2036":{"position":[[19,8]]},"2050":{"position":[[0,7]]},"2076":{"position":[[0,7]]},"2138":{"position":[[0,7]]},"2167":{"position":[[0,7]]},"2184":{"position":[[0,7]]},"2201":{"position":[[0,7]]}}}],["order",{"_index":106,"t":{"147":{"position":[[4,5]]}}}],["origin",{"_index":631,"t":{"1811":{"position":[[6,6]]}}}],["osd",{"_index":342,"t":{"600":{"position":[[5,3]]},"961":{"position":[[0,3]]},"962":{"position":[[18,3]]},"964":{"position":[[4,3],[36,4]]},"966":{"position":[[10,3]]},"967":{"position":[[9,3]]},"968":{"position":[[17,3]]},"969":{"position":[[16,3]]},"970":{"position":[[10,3]]},"972":{"position":[[10,3]]},"976":{"position":[[10,4]]}}}],["osism",{"_index":336,"t":{"588":{"position":[[0,5]]},"1009":{"position":[[56,5]]},"1011":{"position":[[22,5]]},"1108":{"position":[[0,5]]},"1376":{"position":[[17,5]]},"1406":{"position":[[0,5]]},"1440":{"position":[[0,5]]},"1481":{"position":[[17,5]]}}}],["osism.sh",{"_index":516,"t":{"1104":{"position":[[7,8]]}}}],["oss",{"_index":645,"t":{"1961":{"position":[[0,3]]}}}],["out",{"_index":141,"t":{"186":{"position":[[21,3]]},"544":{"position":[[14,3]]},"1894":{"position":[[0,3]]}}}],["outlook",{"_index":218,"t":{"303":{"position":[[25,7]]}}}],["over",{"_index":270,"t":{"413":{"position":[[9,4]]}}}],["overrid",{"_index":398,"t":{"792":{"position":[[0,9]]}}}],["overview",{"_index":78,"t":{"103":{"position":[[0,8]]},"413":{"position":[[0,8]]},"605":{"position":[[0,8]]},"940":{"position":[[19,8]]},"1050":{"position":[[0,8]]},"1348":{"position":[[0,8]]},"1521":{"position":[[14,8]]},"1625":{"position":[[0,8]]},"1802":{"position":[[0,8]]}}}],["ovn",{"_index":225,"t":{"328":{"position":[[0,3]]},"899":{"position":[[0,3]]},"1222":{"position":[[0,3]]}}}],["packag",{"_index":368,"t":{"675":{"position":[[22,8]]},"678":{"position":[[11,8]]},"866":{"position":[[17,8]]}}}],["page",{"_index":543,"t":{"1271":{"position":[[15,4]]},"1275":{"position":[[15,4]]},"2093":{"position":[[7,4]]}}}],["paramet",{"_index":113,"t":{"157":{"position":[[0,10]]},"413":{"position":[[18,10]]},"415":{"position":[[0,10]]},"417":{"position":[[7,10]]},"419":{"position":[[0,10]]},"723":{"position":[[0,10]]}}}],["parser",{"_index":344,"t":{"613":{"position":[[5,6]]},"1058":{"position":[[5,6]]}}}],["patch",{"_index":669,"t":{"2123":{"position":[[10,5]]},"2125":{"position":[[0,5]]}}}],["patent",{"_index":135,"t":{"182":{"position":[[0,7]]}}}],["path",{"_index":655,"t":{"2001":{"position":[[9,4]]}}}],["perform",{"_index":644,"t":{"1946":{"position":[[13,11]]},"1948":{"position":[[9,11]]}}}],["persist",{"_index":298,"t":{"488":{"position":[[0,11]]}}}],["persona",{"_index":343,"t":{"602":{"position":[[0,8]]}}}],["pg",{"_index":485,"t":{"980":{"position":[[8,2]]},"986":{"position":[[11,2],[62,3]]},"1002":{"position":[[14,3]]}}}],["phase",{"_index":594,"t":{"1593":{"position":[[9,5]]},"1595":{"position":[[12,5]]},"1597":{"position":[[11,5]]},"1599":{"position":[[12,5]]},"2113":{"position":[[0,5]]}}}],["pipelin",{"_index":54,"t":{"73":{"position":[[11,9]]},"316":{"position":[[0,9]]},"336":{"position":[[0,9]]}}}],["pipeline.yaml",{"_index":550,"t":{"1301":{"position":[[4,13]]}}}],["place",{"_index":285,"t":{"456":{"position":[[3,5]]}}}],["placement",{"_index":439,"t":{"911":{"position":[[0,9]]},"977":{"position":[[0,9]]},"978":{"position":[[5,9]]},"982":{"position":[[28,9]]},"1233":{"position":[[0,9]]}}}],["plan",{"_index":45,"t":{"63":{"position":[[40,8]]}}}],["plane",{"_index":329,"t":{"568":{"position":[[24,5]]}}}],["play",{"_index":440,"t":{"932":{"position":[[19,5]]}}}],["playbook",{"_index":506,"t":{"1011":{"position":[[28,9]]},"1173":{"position":[[8,8]]}}}],["plusserv",{"_index":14,"t":{"19":{"position":[[0,10]]},"42":{"position":[[46,10]]},"427":{"position":[[0,10]]}}}],["polici",{"_index":623,"t":{"1705":{"position":[[7,8]]},"1732":{"position":[[7,6]]},"1775":{"position":[[7,6]]},"2057":{"position":[[0,6]]}}}],["polling.yaml",{"_index":547,"t":{"1295":{"position":[[4,12]]}}}],["pool",{"_index":359,"t":{"660":{"position":[[6,5]]},"988":{"position":[[6,4]]},"990":{"position":[[4,5]]},"996":{"position":[[20,4]]},"998":{"position":[[29,4]]},"1000":{"position":[[9,4]]},"1002":{"position":[[24,4]]},"1006":{"position":[[24,4],[36,6]]}}}],["posit",{"_index":107,"t":{"149":{"position":[[0,11]]},"151":{"position":[[0,8]]}}}],["possibl",{"_index":83,"t":{"107":{"position":[[32,9]]}}}],["post",{"_index":381,"t":{"719":{"position":[[0,4]]},"2121":{"position":[[10,4]]}}}],["practic",{"_index":77,"t":{"102":{"position":[[15,8]]}}}],["pre",{"_index":86,"t":{"119":{"position":[[0,3]]}}}],["prepar",{"_index":277,"t":{"437":{"position":[[0,7]]},"725":{"position":[[0,9]]},"781":{"position":[[0,12]]},"1167":{"position":[[7,11]]}}}],["prerequisit",{"_index":212,"t":{"297":{"position":[[0,13]]},"306":{"position":[[0,13]]},"497":{"position":[[0,13]]},"1633":{"position":[[0,12]]}}}],["preview",{"_index":282,"t":{"446":{"position":[[49,8]]},"1313":{"position":[[10,8]]},"1468":{"position":[[0,8]]}}}],["previou",{"_index":630,"t":{"1754":{"position":[[0,8]]},"1795":{"position":[[0,8]]},"1858":{"position":[[0,8]]}}}],["pro",{"_index":649,"t":{"1991":{"position":[[0,4]]}}}],["problem",{"_index":320,"t":{"550":{"position":[[19,8]]},"731":{"position":[[0,8]]}}}],["process",{"_index":382,"t":{"719":{"position":[[5,10]]},"1591":{"position":[[0,7]]},"1629":{"position":[[32,10]]},"1643":{"position":[[0,7]]}}}],["program",{"_index":671,"t":{"2154":{"position":[[0,11]]}}}],["project",{"_index":18,"t":{"26":{"position":[[0,8]]},"31":{"position":[[0,8]]},"61":{"position":[[0,7]]},"73":{"position":[[25,7]]},"314":{"position":[[0,8]]},"1152":{"position":[[21,7]]},"1474":{"position":[[0,7]]}}}],["prometheu",{"_index":435,"t":{"892":{"position":[[0,10]]},"1213":{"position":[[0,10]]},"1331":{"position":[[0,10]]}}}],["properli",{"_index":661,"t":{"2060":{"position":[[17,8]]}}}],["properti",{"_index":350,"t":{"635":{"position":[[6,10]]},"1078":{"position":[[6,10]]},"1842":{"position":[[0,10]]},"1850":{"position":[[15,10]]},"1946":{"position":[[33,10]]},"1948":{"position":[[29,10]]}}}],["propos",{"_index":593,"t":{"1593":{"position":[[0,8]]},"1681":{"position":[[0,8]]},"1684":{"position":[[9,8]]},"1686":{"position":[[0,8]]},"1701":{"position":[[0,8]]},"1721":{"position":[[9,8]]},"1723":{"position":[[0,8]]},"1752":{"position":[[0,8]]},"1766":{"position":[[9,8]]},"1768":{"position":[[0,8]]},"1793":{"position":[[0,8]]},"2001":{"position":[[0,8]]}}}],["provid",{"_index":226,"t":{"328":{"position":[[4,8]]},"576":{"position":[[14,8]]},"1993":{"position":[[5,8]]}}}],["provis",{"_index":425,"t":{"859":{"position":[[7,12]]}}}],["pull",{"_index":39,"t":{"58":{"position":[[30,4]]}}}],["purg",{"_index":255,"t":{"382":{"position":[[5,5]]}}}],["push",{"_index":263,"t":{"402":{"position":[[11,4]]}}}],["put",{"_index":670,"t":{"2125":{"position":[[9,3]]}}}],["python",{"_index":521,"t":{"1144":{"position":[[0,6]]},"1160":{"position":[[18,6]]}}}],["queri",{"_index":484,"t":{"980":{"position":[[0,5]]}}}],["question",{"_index":597,"t":{"1603":{"position":[[5,9]]},"1652":{"position":[[5,9]]},"1672":{"position":[[5,9]]},"1933":{"position":[[5,9]]},"2029":{"position":[[5,9]]},"2052":{"position":[[5,9]]},"2078":{"position":[[5,9]]},"2142":{"position":[[5,9]]},"2169":{"position":[[5,9]]},"2186":{"position":[[5,9]]},"2203":{"position":[[5,9]]}}}],["queue",{"_index":334,"t":{"582":{"position":[[8,5]]}}}],["quick",{"_index":257,"t":{"387":{"position":[[11,5]]}}}],["quickstart",{"_index":81,"t":{"107":{"position":[[0,10]]},"443":{"position":[[7,10]]}}}],["r1",{"_index":566,"t":{"1348":{"position":[[23,2]]},"1358":{"position":[[39,2]]}}}],["r2",{"_index":580,"t":{"1454":{"position":[[39,2]]}}}],["r3",{"_index":579,"t":{"1420":{"position":[[39,2]]}}}],["r4",{"_index":577,"t":{"1386":{"position":[[39,2]]}}}],["r5",{"_index":586,"t":{"1491":{"position":[[39,2]]}}}],["rabbitmq",{"_index":433,"t":{"884":{"position":[[0,8]]},"1202":{"position":[[0,8]]}}}],["rado",{"_index":496,"t":{"988":{"position":[[0,5]]}}}],["rational",{"_index":624,"t":{"1707":{"position":[[0,9]]}}}],["rbac",{"_index":663,"t":{"2062":{"position":[[30,4]]}}}],["read",{"_index":121,"t":{"167":{"position":[[8,7]]},"188":{"position":[[8,7]]}}}],["readabl",{"_index":605,"t":{"1629":{"position":[[8,11]]}}}],["real",{"_index":636,"t":{"1823":{"position":[[0,4]]}}}],["realm",{"_index":171,"t":{"248":{"position":[[17,5]]}}}],["rebal",{"_index":478,"t":{"970":{"position":[[83,9]]},"976":{"position":[[0,9]]}}}],["reboot",{"_index":450,"t":{"946":{"position":[[0,6]]}}}],["rebuild",{"_index":348,"t":{"631":{"position":[[19,8]]},"633":{"position":[[22,7]]},"1074":{"position":[[19,8]]},"1076":{"position":[[22,7]]}}}],["reciproc",{"_index":126,"t":{"174":{"position":[[0,11]]}}}],["recommend",{"_index":415,"t":{"833":{"position":[[23,13]]},"1848":{"position":[[0,11]]}}}],["reconcil",{"_index":373,"t":{"700":{"position":[[0,10]]},"1106":{"position":[[10,10]]}}}],["record",{"_index":511,"t":{"1033":{"position":[[10,7]]},"2067":{"position":[[9,6]]}}}],["redi",{"_index":431,"t":{"880":{"position":[[0,5]]},"1198":{"position":[[0,5]]}}}],["refer",{"_index":28,"t":{"39":{"position":[[0,10]]},"263":{"position":[[4,9]]},"532":{"position":[[10,9]]},"534":{"position":[[21,9]]},"536":{"position":[[35,9]]},"822":{"position":[[8,9]]},"1273":{"position":[[0,9]]},"1277":{"position":[[0,9]]},"1674":{"position":[[0,9]]}}}],["refinement/sprint",{"_index":44,"t":{"63":{"position":[[22,17]]}}}],["region",{"_index":323,"t":{"560":{"position":[[16,6]]}}}],["registr",{"_index":62,"t":{"82":{"position":[[11,12]]}}}],["registri",{"_index":296,"t":{"473":{"position":[[58,8]]}}}],["regular",{"_index":347,"t":{"631":{"position":[[11,7]]},"633":{"position":[[14,7]]},"1074":{"position":[[11,7]]},"1076":{"position":[[14,7]]}}}],["reject",{"_index":596,"t":{"1601":{"position":[[0,9]]}}}],["relat",{"_index":583,"t":{"1470":{"position":[[19,7]]},"1898":{"position":[[0,7]]},"1909":{"position":[[0,7]]},"1920":{"position":[[0,7]]},"1937":{"position":[[0,7]]},"1946":{"position":[[25,7]]},"1948":{"position":[[21,7]]},"1950":{"position":[[0,7]]},"2016":{"position":[[0,7]]},"2033":{"position":[[0,7]]},"2059":{"position":[[0,7]]},"2082":{"position":[[0,7]]},"2144":{"position":[[0,7]]},"2173":{"position":[[0,7]]},"2190":{"position":[[0,7]]},"2207":{"position":[[0,7]]}}}],["releas",{"_index":192,"t":{"270":{"position":[[0,8]]},"271":{"position":[[0,7]]},"273":{"position":[[0,7]]},"275":{"position":[[0,7]]},"277":{"position":[[0,7]]},"279":{"position":[[0,7]]},"734":{"position":[[7,7]]},"818":{"position":[[10,8]]},"937":{"position":[[15,8]]},"1111":{"position":[[14,8]]},"1113":{"position":[[14,7]]},"1115":{"position":[[7,7]]},"1117":{"position":[[13,7]]},"1125":{"position":[[21,7]]},"1315":{"position":[[0,7]]},"1356":{"position":[[0,7]]},"1384":{"position":[[0,7]]},"1418":{"position":[[0,7]]},"1452":{"position":[[0,7]]},"1489":{"position":[[0,7]]},"1510":{"position":[[0,7]]}}}],["relev",{"_index":220,"t":{"312":{"position":[[23,8]]}}}],["remark",{"_index":641,"t":{"1852":{"position":[[0,7]]}}}],["remind",{"_index":123,"t":{"170":{"position":[[5,8]]}}}],["remov",{"_index":471,"t":{"967":{"position":[[0,6]]},"969":{"position":[[0,6]]},"970":{"position":[[0,6],[14,9]]},"972":{"position":[[0,6]]},"1046":{"position":[[0,6]]},"1373":{"position":[[0,8]]},"1408":{"position":[[0,8]]},"1442":{"position":[[0,8]]},"1478":{"position":[[0,8]]},"1505":{"position":[[0,8]]}}}],["repair",{"_index":492,"t":{"986":{"position":[[17,6]]}}}],["replac",{"_index":472,"t":{"968":{"position":[[0,7]]},"972":{"position":[[37,9]]}}}],["replic",{"_index":499,"t":{"996":{"position":[[9,10]]}}}],["repo",{"_index":57,"t":{"75":{"position":[[14,4]]},"91":{"position":[[21,4]]},"1176":{"position":[[9,5]]},"1178":{"position":[[9,5]]},"1523":{"position":[[0,4]]}}}],["report",{"_index":554,"t":{"1319":{"position":[[4,9]]}}}],["repositori",{"_index":95,"t":{"130":{"position":[[21,10]]},"707":{"position":[[14,10]]},"709":{"position":[[29,10]]},"711":{"position":[[4,10]]},"725":{"position":[[30,10]]},"868":{"position":[[32,10]]},"1125":{"position":[[0,12]]}}}],["reprovis",{"_index":475,"t":{"970":{"position":[[43,14]]}}}],["request",{"_index":12,"t":{"17":{"position":[[7,7]]},"58":{"position":[[35,8]]},"2121":{"position":[[15,8]]},"2123":{"position":[[16,9]]}}}],["requir",{"_index":80,"t":{"105":{"position":[[0,12]]},"125":{"position":[[0,12]]},"297":{"position":[[18,12]]},"435":{"position":[[0,12]]},"619":{"position":[[0,12]]},"682":{"position":[[17,8]]},"776":{"position":[[0,12]]},"828":{"position":[[0,12]]},"866":{"position":[[8,8]]},"1062":{"position":[[0,12]]},"1581":{"position":[[0,12]]},"1687":{"position":[[0,10]]},"1689":{"position":[[0,10]]},"1724":{"position":[[0,10]]},"1726":{"position":[[0,10]]},"1769":{"position":[[0,10]]},"1771":{"position":[[0,10]]},"1806":{"position":[[10,12]]},"1946":{"position":[[0,8]]},"1948":{"position":[[0,8]]},"1963":{"position":[[0,8]]},"1989":{"position":[[0,8]]},"2093":{"position":[[12,12]]},"2100":{"position":[[0,12]]}}}],["reset",{"_index":512,"t":{"1042":{"position":[[7,5]]},"1183":{"position":[[0,5]]}}}],["resolv",{"_index":576,"t":{"1380":{"position":[[0,8]]},"1414":{"position":[[0,8]]},"1448":{"position":[[0,8]]},"1485":{"position":[[0,8]]},"1508":{"position":[[0,8]]}}}],["resourc",{"_index":13,"t":{"17":{"position":[[21,9]]},"289":{"position":[[6,9]]},"779":{"position":[[6,9]]},"2125":{"position":[[26,9]]}}}],["restart",{"_index":508,"t":{"1015":{"position":[[0,7]]},"1208":{"position":[[0,7]]}}}],["restrict",{"_index":561,"t":{"1341":{"position":[[8,12]]},"1358":{"position":[[23,12]]},"1386":{"position":[[23,12]]},"1420":{"position":[[23,12]]},"1454":{"position":[[23,12]]},"1491":{"position":[[23,12]]},"1511":{"position":[[23,12]]}}}],["return",{"_index":668,"t":{"2121":{"position":[[0,6]]},"2123":{"position":[[0,6]]}}}],["review/backlog",{"_index":43,"t":{"63":{"position":[[7,14]]}}}],["rgw",{"_index":357,"t":{"658":{"position":[[0,3]]},"872":{"position":[[0,3]]}}}],["roadmap",{"_index":193,"t":{"270":{"position":[[13,7]]},"281":{"position":[[0,7]]}}}],["role",{"_index":112,"t":{"155":{"position":[[9,5]]},"748":{"position":[[15,4]]}}}],["room",{"_index":154,"t":{"207":{"position":[[10,5]]},"224":{"position":[[10,5]]}}}],["rotat",{"_index":297,"t":{"477":{"position":[[0,8]]},"645":{"position":[[8,8]]},"1087":{"position":[[8,8]]},"1245":{"position":[[8,8]]}}}],["rule",{"_index":119,"t":{"161":{"position":[[16,5]]},"992":{"position":[[15,5]]},"1004":{"position":[[13,5]]},"1006":{"position":[[13,4]]}}}],["run",{"_index":265,"t":{"404":{"position":[[9,3]]},"851":{"position":[[0,7]]},"1154":{"position":[[16,4]]}}}],["rx",{"_index":587,"t":{"1511":{"position":[[39,2]]}}}],["s3",{"_index":27,"t":{"37":{"position":[[15,4]]}}}],["sata/sa",{"_index":459,"t":{"951":{"position":[[15,8]]},"959":{"position":[[15,8]]}}}],["save",{"_index":219,"t":{"312":{"position":[[9,4]]}}}],["sbom",{"_index":567,"t":{"1354":{"position":[[0,4]]}}}],["sc",{"_index":1,"t":{"5":{"position":[[15,3]]},"256":{"position":[[30,3]]},"261":{"position":[[8,4]]},"266":{"position":[[9,3]]},"268":{"position":[[15,3]]},"518":{"position":[[10,3]]},"520":{"position":[[7,3]]},"522":{"position":[[22,4]]},"526":{"position":[[21,3]]},"528":{"position":[[11,3]]},"530":{"position":[[65,4]]},"534":{"position":[[52,3]]},"544":{"position":[[22,4]]},"546":{"position":[[17,3]]},"548":{"position":[[18,3]]},"629":{"position":[[0,3]]},"1072":{"position":[[0,3]]},"1261":{"position":[[113,3]]},"1271":{"position":[[4,3]]},"1275":{"position":[[4,3]]},"1309":{"position":[[4,3]]},"1369":{"position":[[0,3]]},"1401":{"position":[[0,3]]},"1435":{"position":[[0,3]]},"1472":{"position":[[0,3]]},"1503":{"position":[[0,3]]},"1521":{"position":[[0,3]]},"1625":{"position":[[22,3]]},"1631":{"position":[[0,3]]},"1703":{"position":[[9,3]]},"1711":{"position":[[7,4]]},"1730":{"position":[[9,3]]},"1756":{"position":[[7,3]]},"1797":{"position":[[7,3]]},"1831":{"position":[[11,3]]},"1844":{"position":[[9,3]]}}}],["scope",{"_index":551,"t":{"1305":{"position":[[0,5]]},"1325":{"position":[[0,5]]},"1362":{"position":[[0,5]]},"1394":{"position":[[0,5]]},"1428":{"position":[[0,5]]},"1461":{"position":[[0,5]]},"1499":{"position":[[0,5]]},"1534":{"position":[[0,6]]},"1627":{"position":[[25,6]]},"1894":{"position":[[7,5]]},"2060":{"position":[[26,6]]}}}],["script",{"_index":362,"t":{"668":{"position":[[11,7]]}}}],["scrub",{"_index":449,"t":{"944":{"position":[[21,10]]},"982":{"position":[[12,10]]},"986":{"position":[[35,5]]}}}],["second",{"_index":444,"t":{"940":{"position":[[3,7]]}}}],["secret",{"_index":231,"t":{"340":{"position":[[0,7]]},"1169":{"position":[[7,7]]}}}],["section",{"_index":592,"t":{"1589":{"position":[[0,8]]}}}],["secur",{"_index":463,"t":{"957":{"position":[[0,6]]},"959":{"position":[[0,6]]},"1378":{"position":[[0,8]]},"1412":{"position":[[0,8]]},"1446":{"position":[[0,8]]},"1483":{"position":[[0,8]]},"1507":{"position":[[0,8]]},"2062":{"position":[[15,6]]}}}],["select",{"_index":581,"t":{"1455":{"position":[[18,9]]}}}],["separ",{"_index":542,"t":{"1261":{"position":[[104,8]]}}}],["server",{"_index":99,"t":{"134":{"position":[[34,6]]},"415":{"position":[[27,6]]},"417":{"position":[[29,6]]},"1167":{"position":[[0,6]]}}}],["servic",{"_index":17,"t":{"24":{"position":[[0,7]]},"29":{"position":[[0,7]]},"621":{"position":[[16,7]]},"658":{"position":[[4,7]]},"682":{"position":[[26,8]]},"684":{"position":[[8,8]]},"745":{"position":[[36,9]]},"806":{"position":[[7,8]]},"808":{"position":[[8,8]]},"820":{"position":[[9,8]]},"838":{"position":[[14,7]]},"872":{"position":[[4,7]]},"1046":{"position":[[7,7]]},"1064":{"position":[[16,7]]},"1098":{"position":[[17,7]]},"1345":{"position":[[11,7]]}}}],["set",{"_index":405,"t":{"811":{"position":[[19,7]]},"1002":{"position":[[0,3]]}}}],["setup",{"_index":531,"t":{"1171":{"position":[[11,5]]}}}],["show",{"_index":266,"t":{"406":{"position":[[5,4]]}}}],["shutdown",{"_index":507,"t":{"1013":{"position":[[0,8]]},"1015":{"position":[[36,8]]}}}],["sig",{"_index":49,"t":{"65":{"position":[[24,6]]}}}],["singl",{"_index":451,"t":{"946":{"position":[[9,6]]},"964":{"position":[[29,6]]},"969":{"position":[[9,6]]},"1148":{"position":[[13,6]]},"1666":{"position":[[0,6]]},"1869":{"position":[[21,6]]}}}],["size",{"_index":618,"t":{"1691":{"position":[[16,5]]},"1728":{"position":[[16,5]]},"1773":{"position":[[16,5]]}}}],["smart",{"_index":458,"t":{"951":{"position":[[0,5]]}}}],["snack",{"_index":158,"t":{"217":{"position":[[0,6]]},"220":{"position":[[0,5]]},"222":{"position":[[6,5]]}}}],["softwar",{"_index":396,"t":{"782":{"position":[[0,8]]}}}],["sourc",{"_index":638,"t":{"1825":{"position":[[0,7]]}}}],["sovereign",{"_index":4,"t":{"6":{"position":[[14,9]]},"1583":{"position":[[0,9]]}}}],["spec",{"_index":639,"t":{"1842":{"position":[[18,6]]}}}],["special",{"_index":46,"t":{"65":{"position":[[0,7]]}}}],["specif",{"_index":367,"t":{"675":{"position":[[13,8]]},"962":{"position":[[9,8]]},"1869":{"position":[[6,14]]},"1871":{"position":[[6,14]]}}}],["sprint",{"_index":42,"t":{"63":{"position":[[0,6]]}}}],["ssh",{"_index":248,"t":{"366":{"position":[[5,3]]},"1027":{"position":[[0,3]]}}}],["sso",{"_index":184,"t":{"256":{"position":[[4,3]]}}}],["stabil",{"_index":595,"t":{"1597":{"position":[[0,10]]},"1604":{"position":[[0,13]]},"2213":{"position":[[0,10]]}}}],["stabl",{"_index":388,"t":{"734":{"position":[[0,6]]},"1115":{"position":[[0,6]]},"1597":{"position":[[17,8]]}}}],["stack",{"_index":6,"t":{"6":{"position":[[30,5]]},"1468":{"position":[[17,6]]}}}],["stand",{"_index":301,"t":{"518":{"position":[[14,5]]}}}],["standard",{"_index":207,"t":{"285":{"position":[[0,10]]},"524":{"position":[[26,12]]},"526":{"position":[[25,10]]},"629":{"position":[[10,8]]},"1072":{"position":[[10,8]]},"1352":{"position":[[0,15]]},"1382":{"position":[[0,9]]},"1416":{"position":[[0,9]]},"1450":{"position":[[0,9]]},"1487":{"position":[[0,9]]},"1509":{"position":[[0,9]]},"1521":{"position":[[4,9]]},"1529":{"position":[[0,9]]},"1583":{"position":[[16,8]]},"1625":{"position":[[26,9]]},"1637":{"position":[[0,8]]},"1703":{"position":[[0,8]]},"1730":{"position":[[0,8]]},"1754":{"position":[[9,8]]},"1795":{"position":[[9,8]]},"1844":{"position":[[0,8]]},"1858":{"position":[[9,8]]},"1867":{"position":[[0,8]]},"2213":{"position":[[11,9]]}}}],["start",{"_index":21,"t":{"34":{"position":[[8,7]]},"42":{"position":[[8,7]]},"47":{"position":[[8,7]]},"109":{"position":[[8,7]]},"134":{"position":[[9,8]]},"310":{"position":[[11,6]]},"544":{"position":[[38,6]]},"546":{"position":[[41,8]]},"548":{"position":[[71,6]]},"625":{"position":[[8,7]]},"682":{"position":[[0,5]]},"759":{"position":[[8,7]]},"786":{"position":[[8,7]]},"862":{"position":[[8,7]]},"982":{"position":[[0,5]]},"1068":{"position":[[8,7]]}}}],["state",{"_index":216,"t":{"303":{"position":[[8,5]]},"353":{"position":[[8,5]]},"402":{"position":[[5,5]]},"925":{"position":[[5,6]]}}}],["statu",{"_index":486,"t":{"980":{"position":[[21,6]]},"994":{"position":[[15,6]]},"1271":{"position":[[8,6]]},"1275":{"position":[[8,6]]},"2093":{"position":[[0,6]]}}}],["step",{"_index":63,"t":{"86":{"position":[[0,4]]},"89":{"position":[[0,4]]},"91":{"position":[[0,4]]},"128":{"position":[[0,4]]},"130":{"position":[[0,4]]},"132":{"position":[[0,4]]},"134":{"position":[[0,4]]},"499":{"position":[[0,5]]},"1618":{"position":[[18,5]]}}}],["still",{"_index":312,"t":{"530":{"position":[[51,5]]}}}],["storag",{"_index":26,"t":{"37":{"position":[[7,7]]},"391":{"position":[[11,7]]},"623":{"position":[[7,7]]},"949":{"position":[[18,7]]},"1004":{"position":[[33,7]]},"1066":{"position":[[7,7]]}}}],["strong",{"_index":131,"t":{"180":{"position":[[18,6]]}}}],["structur",{"_index":75,"t":{"102":{"position":[[0,9]]},"540":{"position":[[22,11]]},"1523":{"position":[[5,9]]},"1664":{"position":[[0,9]]}}}],["style",{"_index":614,"t":{"1670":{"position":[[8,5],[27,5]]}}}],["subscript",{"_index":633,"t":{"1815":{"position":[[24,12]]}}}],["such",{"_index":407,"t":{"813":{"position":[[7,4]]}}}],["suffix",{"_index":616,"t":{"1687":{"position":[[15,8]]},"1724":{"position":[[15,8]]},"1769":{"position":[[15,8]]}}}],["suggest",{"_index":603,"t":{"1618":{"position":[[0,9]]}}}],["support",{"_index":267,"t":{"411":{"position":[[0,9]]},"818":{"position":[[0,9]]},"1339":{"position":[[5,7]]},"1746":{"position":[[15,7]]},"1787":{"position":[[15,7]]},"1815":{"position":[[39,7]]}}}],["swappi",{"_index":356,"t":{"656":{"position":[[0,10]]}}}],["swift",{"_index":341,"t":{"598":{"position":[[0,5]]}}}],["systemat",{"_index":625,"t":{"1721":{"position":[[22,10]]},"1766":{"position":[[22,10]]}}}],["tag",{"_index":553,"t":{"1315":{"position":[[8,7]]},"1356":{"position":[[8,7]]},"1384":{"position":[[8,7]]},"1418":{"position":[[8,7]]},"1452":{"position":[[8,7]]},"1489":{"position":[[8,7]]},"1510":{"position":[[8,7]]}}}],["target",{"_index":211,"t":{"293":{"position":[[0,6]]}}}],["task",{"_index":103,"t":{"145":{"position":[[0,4]]},"961":{"position":[[16,5]]},"1134":{"position":[[0,4]]}}}],["taxonomi",{"_index":612,"t":{"1662":{"position":[[16,8]]}}}],["teardown",{"_index":252,"t":{"376":{"position":[[0,8]]},"441":{"position":[[0,8]]}}}],["technic",{"_index":67,"t":{"88":{"position":[[3,9]]},"446":{"position":[[38,10]]},"550":{"position":[[9,9]]},"1313":{"position":[[0,9]]},"1668":{"position":[[0,9]]},"1806":{"position":[[0,9]]}}}],["technolog",{"_index":635,"t":{"1821":{"position":[[23,10]]}}}],["templat",{"_index":280,"t":{"446":{"position":[[17,10]]},"1664":{"position":[[10,8]]}}}],["temporarili",{"_index":479,"t":{"972":{"position":[[14,12]]}}}],["terraform",{"_index":259,"t":{"395":{"position":[[0,9]]}}}],["test",{"_index":189,"t":{"264":{"position":[[11,4]]},"384":{"position":[[0,7]]},"439":{"position":[[9,4]]},"1531":{"position":[[0,5]]},"1777":{"position":[[12,5]]},"1817":{"position":[[12,5]]},"1854":{"position":[[12,5]]},"1880":{"position":[[12,5]]},"1900":{"position":[[12,5]]},"1911":{"position":[[12,5]]},"1952":{"position":[[12,5]]},"2018":{"position":[[12,5]]},"2035":{"position":[[12,5]]},"2036":{"position":[[12,6]]},"2064":{"position":[[12,5]]},"2084":{"position":[[12,5]]},"2146":{"position":[[12,5]]},"2175":{"position":[[12,5]]},"2192":{"position":[[12,5]]},"2209":{"position":[[12,5]]}}}],["testb",{"_index":190,"t":{"264":{"position":[[20,7]]},"1341":{"position":[[21,9]]},"1369":{"position":[[35,8]]},"1401":{"position":[[35,8]]},"1435":{"position":[[35,9]]},"1472":{"position":[[52,7]]},"1503":{"position":[[35,8]]}}}],["thank",{"_index":578,"t":{"1390":{"position":[[0,6]]},"1424":{"position":[[0,6]]},"1495":{"position":[[0,6]]},"1514":{"position":[[0,6]]}}}],["thing",{"_index":150,"t":{"199":{"position":[[9,6]]},"201":{"position":[[13,6]]}}}],["tl",{"_index":299,"t":{"490":{"position":[[12,3]]},"1341":{"position":[[4,3]]}}}],["token",{"_index":175,"t":{"250":{"position":[[24,5]]}}}],["tool",{"_index":608,"t":{"1639":{"position":[[6,4]]},"1650":{"position":[[0,7]]},"1736":{"position":[[12,7]]},"1856":{"position":[[12,7]]},"1882":{"position":[[12,7]]}}}],["toolbox",{"_index":430,"t":{"876":{"position":[[22,7]]},"1194":{"position":[[22,7]]}}}],["topic",{"_index":504,"t":{"1008":{"position":[[9,6]]}}}],["tri",{"_index":318,"t":{"544":{"position":[[10,3]]}}}],["troubleshoot",{"_index":402,"t":{"810":{"position":[[0,15]]},"853":{"position":[[0,15]]},"1175":{"position":[[0,15]]}}}],["tutori",{"_index":294,"t":{"473":{"position":[[0,9]]},"1261":{"position":[[9,8]]}}}],["two",{"_index":540,"t":{"1261":{"position":[[74,3],[100,3]]}}}],["type",{"_index":66,"t":{"86":{"position":[[23,4]]},"830":{"position":[[0,5]]},"1585":{"position":[[0,5]]},"1682":{"position":[[0,4]]},"1691":{"position":[[26,5]]},"1719":{"position":[[0,4]]},"1728":{"position":[[26,5]]},"1764":{"position":[[0,4]]},"1773":{"position":[[26,5]]}}}],["typic",{"_index":456,"t":{"949":{"position":[[10,7]]}}}],["ui",{"_index":36,"t":{"45":{"position":[[15,4]]},"52":{"position":[[15,4]]},"1180":{"position":[[39,3]]}}}],["uniqu",{"_index":354,"t":{"652":{"position":[[0,6]]}}}],["unsupport",{"_index":403,"t":{"811":{"position":[[0,11]]}}}],["updat",{"_index":41,"t":{"61":{"position":[[8,7]]},"454":{"position":[[0,8]]},"460":{"position":[[0,8]]},"640":{"position":[[0,8]]},"1083":{"position":[[0,8]]},"1243":{"position":[[14,6]]},"1317":{"position":[[0,7]]},"1809":{"position":[[6,8]]},"2125":{"position":[[17,8]]}}}],["upgrad",{"_index":286,"t":{"456":{"position":[[9,7]]},"461":{"position":[[12,7]]},"678":{"position":[[0,7]]},"808":{"position":[[0,7]]},"846":{"position":[[0,7]]}}}],["upgrade/migr",{"_index":573,"t":{"1371":{"position":[[0,17]]},"1403":{"position":[[0,17]]},"1437":{"position":[[0,17]]},"1476":{"position":[[0,17]]},"1504":{"position":[[0,17]]}}}],["upload",{"_index":384,"t":{"731":{"position":[[9,9]]},"1865":{"position":[[0,9]]}}}],["url",{"_index":33,"t":{"43":{"position":[[0,4]]},"50":{"position":[[0,4]]}}}],["us",{"_index":58,"t":{"75":{"position":[[19,3]]},"149":{"position":[[16,3]]},"473":{"position":[[43,3]]},"530":{"position":[[57,3]]},"534":{"position":[[13,3]]},"536":{"position":[[13,3]]},"546":{"position":[[10,3]]},"548":{"position":[[10,3]]},"715":{"position":[[0,3]]},"849":{"position":[[0,3]]},"899":{"position":[[8,5]]},"955":{"position":[[47,5]]},"957":{"position":[[26,5]]},"959":{"position":[[30,5]]},"966":{"position":[[14,5]]},"967":{"position":[[13,5]]},"1009":{"position":[[50,5]]},"1011":{"position":[[16,5]]},"1178":{"position":[[19,5]]},"1222":{"position":[[8,5]]},"1823":{"position":[[11,4]]}}}],["usag",{"_index":15,"t":{"20":{"position":[[0,5]]},"69":{"position":[[0,5]]},"153":{"position":[[0,5]]},"155":{"position":[[0,5]]},"159":{"position":[[0,5]]},"609":{"position":[[0,5]]},"637":{"position":[[0,5]]},"796":{"position":[[0,5]]},"803":{"position":[[9,5]]},"837":{"position":[[0,5]]},"1054":{"position":[[0,5]]},"1080":{"position":[[0,5]]},"1121":{"position":[[0,5]]}}}],["user",{"_index":16,"t":{"22":{"position":[[0,5]]},"24":{"position":[[8,5]]},"29":{"position":[[8,5]]},"252":{"position":[[33,5]]},"254":{"position":[[47,5]]},"766":{"position":[[16,4]]},"1364":{"position":[[23,4]]},"1396":{"position":[[23,4]]},"1430":{"position":[[23,4]]},"1463":{"position":[[23,4]]},"1500":{"position":[[23,4]]}}}],["valid",{"_index":505,"t":{"1011":{"position":[[0,10]]},"1709":{"position":[[0,10]]},"1734":{"position":[[0,10]]},"1922":{"position":[[0,10]]}}}],["var",{"_index":374,"t":{"701":{"position":[[5,4]]},"702":{"position":[[6,4]]}}}],["variabl",{"_index":376,"t":{"703":{"position":[[7,8]]},"790":{"position":[[0,9]]}}}],["vegan",{"_index":161,"t":{"222":{"position":[[0,5]]}}}],["version",{"_index":269,"t":{"411":{"position":[[14,8]]},"461":{"position":[[4,7]]},"463":{"position":[[4,8]]},"465":{"position":[[4,8]]},"804":{"position":[[7,8]]},"1364":{"position":[[10,8]]},"1396":{"position":[[10,8]]},"1430":{"position":[[10,8]]},"1463":{"position":[[10,8]]},"1500":{"position":[[10,8]]},"1534":{"position":[[11,8]]},"1609":{"position":[[0,10]]},"1635":{"position":[[0,7]]},"1754":{"position":[[18,8]]},"1795":{"position":[[18,8]]},"1858":{"position":[[18,8]]}}}],["via",{"_index":92,"t":{"128":{"position":[[28,3]]},"1339":{"position":[[13,3]]},"1376":{"position":[[13,3]]},"1481":{"position":[[13,3]]}}}],["videoconfer",{"_index":50,"t":{"67":{"position":[[0,15]]}}}],["virtual",{"_index":424,"t":{"851":{"position":[[13,7]]},"1695":{"position":[[20,14],[44,14]]},"1742":{"position":[[20,14],[44,14]]},"1783":{"position":[[20,14],[44,14]]},"1827":{"position":[[11,7]]},"1997":{"position":[[15,7]]},"1999":{"position":[[0,7]]}}}],["visibl",{"_index":569,"t":{"1364":{"position":[[28,7]]},"1396":{"position":[[28,7]]},"1430":{"position":[[28,7]]},"1463":{"position":[[28,7]]},"1500":{"position":[[28,7]]}}}],["vpn",{"_index":400,"t":{"797":{"position":[[0,3]]},"838":{"position":[[10,3]]}}}],["vs",{"_index":132,"t":{"180":{"position":[[25,3]]},"452":{"position":[[26,3]]},"2125":{"position":[[6,2]]}}}],["vswitch",{"_index":437,"t":{"897":{"position":[[5,7]]},"1220":{"position":[[5,7]]}}}],["want",{"_index":317,"t":{"544":{"position":[[2,4]]},"546":{"position":[[2,4]]},"548":{"position":[[2,4]]}}}],["warn",{"_index":446,"t":{"942":{"position":[[21,7]]}}}],["wavecon",{"_index":19,"t":{"28":{"position":[[0,7]]}}}],["wavestack",{"_index":276,"t":{"429":{"position":[[0,9]]}}}],["we'r",{"_index":7,"t":{"8":{"position":[[0,5]]},"10":{"position":[[0,5]]}}}],["weak",{"_index":133,"t":{"180":{"position":[[29,4]]}}}],["web",{"_index":535,"t":{"1180":{"position":[[35,3]]}}}],["webinterfac",{"_index":401,"t":{"799":{"position":[[0,13]]},"840":{"position":[[0,13]]}}}],["websso",{"_index":179,"t":{"252":{"position":[[12,6]]}}}],["week",{"_index":162,"t":{"228":{"position":[[12,4]]}}}],["welcom",{"_index":0,"t":{"5":{"position":[[0,7]]}}}],["we’r",{"_index":10,"t":{"13":{"position":[[0,5]]}}}],["wireguard",{"_index":417,"t":{"838":{"position":[[0,9]]}}}],["without",{"_index":349,"t":{"633":{"position":[[6,7]]},"970":{"position":[[68,7]]},"1076":{"position":[[6,7]]},"1125":{"position":[[13,7]]}}}],["work",{"_index":130,"t":{"180":{"position":[[8,5]]},"324":{"position":[[14,4]]},"326":{"position":[[14,4]]}}}],["workflow",{"_index":88,"t":{"121":{"position":[[7,9]]},"2046":{"position":[[8,8]]}}}],["workload",{"_index":284,"t":{"452":{"position":[[30,8]]},"460":{"position":[[9,8]]}}}],["world",{"_index":637,"t":{"1823":{"position":[[5,5]]}}}],["write",{"_index":518,"t":{"1117":{"position":[[7,5]]},"1670":{"position":[[0,7]]}}}],["wrong",{"_index":533,"t":{"1178":{"position":[[29,5]]}}}],["x",{"_index":30,"t":{"42":{"position":[[29,1]]},"232":{"position":[[24,1]]},"1711":{"position":[[17,1]]}}}],["xxx.tfvar",{"_index":273,"t":{"413":{"position":[[64,10]]}}}],["yaml",{"_index":606,"t":{"1631":{"position":[[18,4]]},"1867":{"position":[[16,4]]},"1876":{"position":[[0,4]]}}}],["year",{"_index":236,"t":{"347":{"position":[[51,5]]}}}],["yq",{"_index":406,"t":{"813":{"position":[[0,3]]}}}],["zone",{"_index":325,"t":{"562":{"position":[[29,4]]}}}],["zuul",{"_index":52,"t":{"73":{"position":[[0,4]]},"75":{"position":[[23,4]]},"77":{"position":[[26,4]]},"312":{"position":[[18,4]]},"1129":{"position":[[4,4]]},"1160":{"position":[[31,4]]},"1328":{"position":[[0,4]]}}}]],"pipeline":["stemmer"]}},{"documents":[{"i":3,"t":"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet","s":"First Blog Post","u":"/blog/first-blog-post","h":"","p":2},{"i":7,"t":"Sovereign Cloud Stack is an open community of providers and end-users joining forces in defining, implementing and operating a fully open, federated, compatible platform. We actively encourage you to contribute either code, documentation or issues and to participate in the various discussions happening on GitHub or during our various meetings.","s":"Contribute to Sovereign Cloud Stack","u":"/community/","h":"#contribute-to-sovereign-cloud-stack","p":4},{"i":9,"t":"We have created an open community space on the Matrix network. Feel free to join the several channels and start interacting with the community. A good starting point is entering the General & Announcements and the Tech channel.","s":"We're chatty","u":"/community/","h":"#were-chatty","p":4},{"i":11,"t":"We're actively developing, discussing and planning on GitHub. The three technical teams are using a joint project board to plan and monitor the progress during our sprints.","s":"We're on GitHub","u":"/community/","h":"#were-on-github","p":4},{"i":14,"t":"Our meetings are publicly announced and we are happy to welcome both newcomers and established members alike. You can navigate either through the calendar below or subscribe with your favorite client to https://sovereigncloudstack.github.io/calendar/scs.ics. The calendar is collaboratively maintained on GitHub and new entries, such as a lightning talk, are highly appreciated!","s":"We’re an open community","u":"/community/calendar","h":"#were-an-open-community","p":12},{"i":16,"t":"This document gives an overview of the test and development cloud resources currently provided by our partners.","s":"Test and development cloud resources","u":"/community/cloud-resources/","h":"","p":15},{"i":18,"t":"To request access to an existing project, please contact the responsible community member. To apply for a new project, please create a pull request against this document (leave Unique Identifier blank) and assign it to the particular CSP team (e.g. @SovereignCloudStack/plusserver, @SovereignCloudStack/wavecon, ...)","s":"How to request cloud resources","u":"/community/cloud-resources/","h":"#how-to-request-cloud-resources","p":15},{"i":21,"t":"A brief guide on how to use the resources provided by plusserver GmbH can be found here","s":"Usage","u":"/community/cloud-resources/","h":"#usage","p":15},{"i":23,"t":"As suggested in #155 the username for non-\"service users\" will contain the users github handle and are prefixed with a plusserver default. prefix- Note ATM this is not directly connected to the SovereignCloudStack github org membership, accounts will be created manually for now. Example: github handle plusserver login frosty-geek u500924-frosty-geek fkr u500924-fkr Note To easy collaboration & transparency within the SCS team all users will have their default_project_id set to p500924-scs-community by default and will have full access on all projects listed below.","s":"Users","u":"/community/cloud-resources/","h":"#users","p":15},{"i":25,"t":"Service users will have their default_project_id set to a specific project and will NOT be granted full access to other projects by default. Unique Identifier Service User Name Full Access on Community Contact Description Needed until 9a1576af59644a2dbbace773ad17158d u500924-svc-sig-monitoring p500924-sig-monitoring1 fkr Service User - SIG Monitoring 31.12.2023 4925967416894fd78be6701689059653 u500924-svc-cloudmon p500924-cloudmon-target costelter Service User - CloudMon Test Project 31.12.2023 f89b3d64ddff4d9d8cadb5e06fa22299 u500924-svc-healthmonitor p500924-scs-healthmonitor garloff Service User - SCS Health Monitor ∞ 49cc3d72fbdf41fe8dc407f57f026dbf u500924-svc-standards p500924-scs-healthmonitor garloff Service User - SCS Standards Compliance Check ∞ 49cc3d72fbdf41fe8dc407f57f026dbf u500924-svc-zuul p500924-scs-zuul o-otte Service User - SCS Zuul 30.11.2024","s":"Service Users","u":"/community/cloud-resources/","h":"#service-users","p":15},{"i":27,"t":"Unique Identifier Project Name Community Contact Description Needed until 2237c767cf5f456da19359ed31c1c16b p500924-scs-community fkr SCS Community Project ∞ b43cfafbcf1f4eb08865b2886c29e09b p500924-cluster-api-session garloff cluster-api hands on session ∞ 9b7a73e516be4cd1acbd63d543985c52 p500924-gonicus-dev o-otte GONICUS GmbH ∞ 3829cc7c8f034fc985f5055a1df6f247 p500924-scs-healthmonitor garloff SCS Health Monitor ∞ b97d38bf128b4479981c4dbe2ef70cd5 p500924-SIG-IAM fkr SIG IAM and VP08 ∞ 9de7d8dc2d674e52be44904d6b338b0b p500924-cloudmon costelter CloudMon Test Project 31.12.2023 2c9e0e4ef8d44c36807df50b06b3c81d p500924-cloudmon-target costelter Target project for CloudMon tests 31.12.2023 3501db829014406884990a1016f3e25d p500924-sig-monitoring1 fkr SIG Monitoring - cloudmon target 31.12.2023 602778bad3d3470cbe58c4f7611e8eb7 p500924-dnation chess-knight dNation dev for VP06c ∞ 91091d4039a6457db27d48d58bb1b4e4 p500924-jschoone jschoone KaaS dev and evaluation ∞ 93956190702b4a7d8a8886806d57713f p500924-metering cah-link Dev Environment for VP13 31.12.2023 abbe6561cf6248b6af395334aa09af85 p500924-harbor chess-knight SCS Harbor for VP06c ∞ 4ff97734574146ccb4c7e7568bc1e36f p500924-XPanse swaroopar Eclipse XPanse Projekt POC 31.11.2023 e7622c1048ac4520a2d050ae141e826b p500924-tender-6a mxmxchere Dev Environment for VP06a ∞ eeed7e0ad33f42f189fb4165116f5a1b p500924-dnation-k8s matofeder dNation dev for VP06c ∞ b342f37804f14459bdf703573169bf79 p500924-minery 90n20 Testbed env for Pentesting 30.11.2024 0fa3c3559f0d4f39ba7aa70c7f7188ca p500924-tender-10-3 tonifinger Dev Environment for VP10-3 ∞ b682eb90fb834278afb1182018dd2133 p500924-scoopex scoopex Marc's gx-scs project ∞ 021af0688c594bf88ed675b942d3bea8 p500924-gx-cred-generator anjastrunk SCS Gaia-X Self-Description Generator ∞ a07c811315ad40f585945b2939ef12dd p500924-scs-zuul o-otte SCS Zuul 30.11.2024","s":"Projects","u":"/community/cloud-resources/","h":"#projects","p":15},{"i":30,"t":"Unique Identifier Service User Name Full Access on Community Contact Description Needed until df4af5376bbd4de587c4335622149be7 scs-standards scs-standards itrich Service User - SCS Standards Compliance Check ∞","s":"Service Users","u":"/community/cloud-resources/","h":"#service-users-1","p":15},{"i":32,"t":"Unique Identifier Project Name Community Contact Description Needed until 718964b4b87446688ac04b151519fb51 scs garloff SCS Health Monitor ∞ c46ccc9e695c4b23bacee2ad11145d9a scs-health-monitor garloff SCS Health Monitor ∞ 00de553df86949b49365baee6375fb5a scs-standards itrich SCS Health Monitor ∞","s":"Projects","u":"/community/cloud-resources/","h":"#projects-1","p":15},{"i":36,"t":"The OpenStackClient is installable via all major Linux Distributions: for debian and ubuntu with apt: sudo apt install python3-openstackclient for ubuntu with snap openstack CLI is installable too: sudo snap install openstackclients [!NOTE] Versions from Linux repository could be in a stable but old state. Install it directly via pypi from upstream is the recommend way. Here for example RHEL: sudo dnf install python3 python3-devel gcc python3-pip Here for example Debian and Ubuntu: sudo apt install python3-minimal python3-pip python3-venv python3-dev build-essential Here as example for SUSE sudo zypper in python3-pip python3-venv python3-dev Here for example with Apple's MacOS brew install python3 [!NOTE] Python installation for windows systems please use the python installation guide or recommend use the Linux Subsystem WSL Python Virtualenv It is also recommended to use virtual environments, here as an example for Linux and MacOS: python3 -m venv oscli source oscli/bin/activate pip install --upgrade pip pip install python-openstackclient \\ python-cinderclient \\ python-designateclient \\ python-glanceclient \\ python-neutronclient \\ python-novaclient \\ python-octaviaclient \\ python-barbicanclient For further Information see the OpenStack Project upstream website python-openstackclient. This repo holds examples for clouds-public.yaml + clouds.yaml. Alternatively you can download an OpenRC Environment file when you're logged in to Horizon: upper right side ➡️ OpenStack RC File $ source ./-openrc.sh Please enter your OpenStack Password for project XXX as user YYY: openstack --help when you're using clouds.yaml you can specify multiple endpoints and select the specific endpoint by passing --os-cloud= to the openstack cmdline or setting OS_CLOUD. openstack --os-cloud MYCLOUD or export OS_CLOUD=MYCLOUD openstack OpenStack Client in action inside of the OSISM testbed:","s":"OpenStackClient (CLI)","u":"/community/cloud-resources/getting-started-openstack","h":"#openstackclient-cli","p":33},{"i":38,"t":"Create AWS like credentials with openstack ec2 credentials create. If you use libs3, store the access field in S3_ACCESS_KEY_ID and the secret field inS3_SECRET_ACCESS_KEY and set S3_HOSTNAME=. You will see the same buckets (containers) and objects whether you access your object store via the swift or via the s3 protocol.","s":"Object Storage (S3)","u":"/community/cloud-resources/getting-started-openstack","h":"#object-storage-s3","p":33},{"i":40,"t":"OpenStack SovereignCloudStack OSISM ansible terraform cloud-init","s":"References","u":"/community/cloud-resources/getting-started-openstack","h":"#references","p":33},{"i":44,"t":"UI (Horizon): https://ui.gx-scs.sovereignit.cloud/ API auth url (Keystone): https://api.gx-scs.sovereignit.cloud:5000 Object Storage endpoint (S3/SWIFT): https://api.gx-scs.sovereignit.cloud:8080","s":"URLs for access","u":"/community/cloud-resources/plusserver-gx-scs","h":"#urls-for-access","p":41},{"i":46,"t":"For your login you will need: Username (u500924-) Password Domain (d500924)","s":"Authentication (UI)","u":"/community/cloud-resources/plusserver-gx-scs","h":"#authentication-ui","p":41},{"i":48,"t":"See Getting Started with OpenStack","s":"Getting Started with OpenStack","u":"/community/cloud-resources/plusserver-gx-scs","h":"#getting-started-with-openstack","p":41},{"i":51,"t":"UI (Horizon): https://dashboard.wavestack.de/ API auth url (Keystone): https://api.wavestack.de:5000 Object Storage endpoint (S3/SWIFT): https://rgw.muc5.wavestack.de:443","s":"URLs for access","u":"/community/cloud-resources/wavestack","h":"#urls-for-access","p":49},{"i":53,"t":"For your login you will need: Username Password Domain","s":"Authentication (UI)","u":"/community/cloud-resources/wavestack","h":"#authentication-ui","p":49},{"i":55,"t":"See: Getting Started with OpenStack","s":"OpenStackClient (CLI)","u":"/community/cloud-resources/wavestack","h":"#openstackclient-cli","p":49},{"i":59,"t":"We use the GitHub flow to track and discuss changes in issues, then propose and review changes in pull requests. See the GitHub documentation for more details.","s":"Collaborating with issues and pull requests","u":"/community/collaboration","h":"#collaborating-with-issues-and-pull-requests","p":57},{"i":62,"t":"Weekly with all teams on Thursday at 1505 CEST (45 mins)","s":"Project updates","u":"/community/collaboration","h":"#project-updates","p":57},{"i":64,"t":"Weekly with Team IaaS on Wednesdays at 1005 CEST (1 hour) Weekly with Team Container on Mondays at 1005 CEST (1 hour) Weekly with Team OPS & IAM on Thursdays at 1005 CEST (1 hour)","s":"Sprint review/Backlog refinement/Sprint planning meetings","u":"/community/collaboration","h":"#sprint-reviewbacklog-refinementsprint-planning-meetings","p":57},{"i":66,"t":"Identity & Access Management (IAM): Bi-Weekly on Friday at 1005 CEST (1 hour) Monitoring & Logging: Weekly on Friday at 1205 CEST (1 hour)","s":"Special interest groups (SIGs)","u":"/community/collaboration","h":"#special-interest-groups-sigs","p":57},{"i":68,"t":"We use a self-hosted Jitsi Meet instance for video conferencing. The server uses an automated deployment based on the heat-docker-jitsi-meet project. Configuration is such everyone who knows the room can connect, unless the moderator sets a password/PIN. Opening a new room requires authentication. (Contact Kurt if you need a password.)","s":"Videoconference","u":"/community/collaboration","h":"#videoconference","p":57},{"i":70,"t":"Connect with a desktop browser (Chrome/Chromium or other blink based browser recommended due to superior WebRTC implementation with SimulCast/SVC for VP8/VP9 -- Safari & Firefox work, but cause higher data traffic). For mobile devices use the Jitsi Meet App. Use the little arrows in the control bar at the bottom to select speaker, microphone and camera in case you lack audio/video. Occasionally, you can not hear all but one participant; in this case reconnecting typically helps. We have an asterisk connected to some conference rooms to provide dial-in capabilities for folks that lack internet connectivity (but have a working phone connection).","s":"Usage","u":"/community/collaboration","h":"#usage","p":57},{"i":72,"t":"We have a Nextcloud instance for sharing files, calendar, contacts, ... setup for things that are not public. We are also using it for our taskboards currently, though we are looking at options to do this in the open. If you want to contribute, we'll do an onboarding call and add you to nextcloud. This will also add you to the scs-member@lists.scs.community mailing list. We have an announcements mailing list there announce@lists.scs.community and you can subscribe via the mailman3 frontend","s":"Nextcloud","u":"/community/collaboration","h":"#nextcloud","p":57},{"i":74,"t":"Since we are expecting a lot of pipelines beeing created and used GitHub actions won't keep up well. We also expect cross-repository and even cross-project dependencies. Therefore we decided to use Zuul as our main pipeline solution.","s":"Zuul CI/CD pipelines and project gating","u":"/community/collaboration","h":"#zuul-cicd-pipelines-and-project-gating","p":57},{"i":76,"t":"Make Zuul aware of your repository in this repo Create a file .zuul.yaml An example can be found here You can have a job section containing self-defined jobs which you need to write on your own You have to have a project section containing the default-branch name the merge-mode which should be used to auto-merge the jobs to run in each pipeline (gh_check, gh_gate, gh_post, gh_tag) these pipelines are triggered by events which can be looked up here some default jobs can be found here If you have self-defined jobs, you need to create a folder .playbooks this folder containers ansible playbooks which will be triggered","s":"How to make a repo use Zuul","u":"/community/collaboration","h":"#how-to-make-a-repo-use-zuul","p":57},{"i":78,"t":"Zuul does not take anything for granted. If you need to have something installed, you should install it via ansible. Our test-machines are basically pimped docker-containers, so we might run into issues some time. But for now, things work pretty good.","s":"General information about Zuul","u":"/community/collaboration","h":"#general-information-about-zuul","p":57},{"i":81,"t":"We have created an open community space on the Matrix federation. Feel free to join the several channels and start chatting with our community. A good starting point is entering the General & Announcements and the Tech channel.","s":"Matrix","u":"/community/communication/matrix","h":"","p":80},{"i":83,"t":"To connect to the Matrix federation, you will need an account on a federated homeserver and a client. The easiest way to join us is register on the popular matrix.org homeserver via the Element web client: https://app.element.io/#/register. A list of curated Matrix clients is collected on the official Matrix website: https://matrix.org/clients/.","s":"Client and Registration","u":"/community/communication/matrix","h":"#client-and-registration","p":80},{"i":85,"t":"In this Guide you will learn how to integrate your documentation to the SCS documentation, which you will find on docs.scs.community.","s":"Adding Docs Guide","u":"/community/contribute/adding-docs-guide","h":"","p":84},{"i":87,"t":"Determine the type of your documentation and click to continue. Technical documentation Operational documentation Community documentation If unsure don't hestitate to ask us at Matrix","s":"Step 1 – Documentation type","u":"/community/contribute/adding-docs-guide","h":"#step-1--documentation-type","p":84},{"i":90,"t":"Your repository containing the documentation has to... be a public repository contain a directory named /doc or /docs within root, containing the documentation files The documentation files have to be in markdown format and... comply SCS licensing guidelines match our markdown file structure guideline linting Rules styleguide","s":"Step 1 – Checklist","u":"/community/contribute/adding-docs-guide","h":"#step-1--checklist","p":84},{"i":92,"t":"File a Pull Request within the docs-page repository and add your repo to the docs.package.json: [ { \"repo\": \"demo-organisation/demo-repository\", \"source\": \"doc/*.md\", \"target\": \"docs\", \"label\": \"demo-repository-label\" } ] key description repo reference to github organisation and repository source path to content to copy: Either glob matching individual markdown files OR the path of a single directory target directory where the files should be copied to within the docs-page repo label label for directory. only mandatory if source file is set to copy only *.md files and not the complete directory Once it is approved and merged, a postinstall script will be triggered within the build process. This initiates downloading, copy and distilling which results in this static generated documentation page – now with your content. An explanation on how the sync & distill workflow and a guide on how to test it in a local development environment you will find here.","s":"Step 2 – Adding your repo to the docs.json","u":"/community/contribute/adding-docs-guide","h":"#step-2--adding-your-repo-to-the-docsjson","p":84},{"i":94,"t":"Your doc files contain operational knowledge. Which layer in the stack do they belong to? iaas iam kaas operations File a Pull Request within the docs repository and add your markdown files to the fitting directory.","s":"2. Operational documentation","u":"/community/contribute/adding-docs-guide","h":"#2-operational-documentation","p":84},{"i":96,"t":"Your doc files contain knowledge regarding our community? Choose the right directory. If unsure don't hestitate to ask us at Matrix. File a Pull Request within the docs repository and add your markdown files to the fitting directory.","s":"3. Community documentation","u":"/community/contribute/adding-docs-guide","h":"#3-community-documentation","p":84},{"i":98,"t":"The aim within this documentation is to have a good developer experience and a low entry barrier to start with SCS. For this to achieve we think all docs that define the SCS stack and have been developed by the SCS community should be within this documentation framework.","s":"Documentation workflow explanation","u":"/community/contribute/docs-workflow-explanation","h":"","p":97},{"i":100,"t":"All general docs are located within the SovereignCloudStack/docs repository. Docs that explain, guide or contextualize specific modules such as the openstack-image-manager or the k8s-cluster-api-provider reside within their repository in a seperate docs directory. Both, the general docs and docs of the external repositories are combined into the one unified documentation collection that is being rendered in a static page on https://docs.scs.community. In order to make this work we have developed a workflow that syncs all doc repositories and distills only the relevant markdown files. The script is called getDocs. It is a postinstall script and is executed after npm install. This has the advantage to have the docs – coming from the cloud – in your local docusaurus development environment as well as in the build process. You'll find the script in the root directory of the SovereignCloudStack/docs-page repository: getDocs.js const fs = require(\"fs\"); const { execSync } = require(\"child_process\"); // Read the contents of the \"docs.package.json\" file and remove all whitespace const reposJson = fs .readFileSync(\"./docs.package.json\", \"utf8\") .replace(/\\s/g, \"\"); // Parse the JSON and create an array of repositories const repos = JSON.parse(reposJson); const ghUrl = \"https://github.com/\"; // Clone each repository, remove git folders and README files, and copy the docs to the target directory repos.forEach((repo) => { const repoDir = `repo_to_be_edited/${repo.label}`; // Clone the repository const cloneCommand = `git clone ${ghUrl + repo.repo} ${repoDir}`; execSync(cloneCommand); // Remove git folders const removeGitCommand = `rm -rf ${repoDir}/.git`; execSync(removeGitCommand); // Remove README files const removeReadmeCommand = `find ${repoDir} -name \"README.md\" | xargs rm -f`; execSync(removeReadmeCommand); // Create the docusaurus subdirectory const subDirPath = `${repo.target}/${repo.label}`; fs.mkdirSync(subDirPath, { recursive: true }); // Copy docs content from A to B const copyDocsCommand = `cp -r ${repoDir}/${repo.source} ${subDirPath}`; execSync(copyDocsCommand); // Remove the cloned repository const removeRepoCommand = \"rm -rf repo_to_be_edited\"; execSync(removeRepoCommand); });","s":"Information Architecture","u":"/community/contribute/docs-workflow-explanation","h":"#information-architecture","p":97},{"i":104,"t":"What is it and for what do I need this? What benefits does it have for users? What organization/company does this belong to? (Link to company/organization) Where am I – as module – within the bigger context of SCS?","s":"Overview - mandatory","u":"/community/contribute/doc-files-structure-guide","h":"#overview---mandatory","p":101},{"i":106,"t":"What minimal requirements do i need to quickstart?","s":"Requirements - mandatory","u":"/community/contribute/doc-files-structure-guide","h":"#requirements---mandatory","p":101},{"i":108,"t":"Link to requirements What is the aim of this quickstart guide? Caution: only for testing, not for production Rule: one line per command for easy copy&paste and one line for description where possible Rule: only one working path for installation!","s":"Quickstart - optional. If it is possible, then mandatory","u":"/community/contribute/doc-files-structure-guide","h":"#quickstart---optional-if-it-is-possible-then-mandatory","p":101},{"i":110,"t":"Aim is a production ready installation","s":"Getting Started - mandatory","u":"/community/contribute/doc-files-structure-guide","h":"#getting-started---mandatory","p":101},{"i":112,"t":"Showing all possible config options","s":"Configuration – mandatory","u":"/community/contribute/doc-files-structure-guide","h":"#configuration--mandatory","p":101},{"i":114,"t":"Description for how can i contribute with Link to Github repository","s":"Contribute – mandatory","u":"/community/contribute/doc-files-structure-guide","h":"#contribute--mandatory","p":101},{"i":116,"t":"Roadmap - optional","s":"FAQ`s – optional","u":"/community/contribute/doc-files-structure-guide","h":"#faqs--optional","p":101},{"i":118,"t":"In order to have a clean content repository regarding all markdown files we enforce linting on: all staged files prior committing all Pull Requests","s":"Linting Guide","u":"/community/contribute/linting-guide","h":"","p":117},{"i":120,"t":"Run markdownlint against staged git files with Husky git hook: lint-staged husky The rules are enforced on markdown files, for which we use: markdownlint-cli2 for markdownlint prettier for code formatting The markdownlint rules are defined in the configuration file .markdownlint-cli2.jsonc Additionally we use markdownlint-rule-search-replace for fixing","s":"Pre Commit","u":"/community/contribute/linting-guide","h":"#pre-commit","p":117},{"i":122,"t":"There are two actions running on every Pull Request on the main branch. link-validator.ymlis checking every link in markdown files. pr-markdownlint.ymlis checking all markdown files regarding to the rules defined within .markdownlint-cli2.jsonc","s":"Github Workflows","u":"/community/contribute/linting-guide","h":"#github-workflows","p":117},{"i":124,"t":"This Guide shows you how to setup docusaurus on your local machine to run this docs-page in your local development enviroment.","s":"Installation","u":"/community/contribute/local-docusaurus-development-guide","h":"","p":123},{"i":126,"t":"git Node.js v16","s":"Requirements","u":"/community/contribute/local-docusaurus-development-guide","h":"#requirements","p":123},{"i":129,"t":"It is recommended to install Node.js via nvm – a node version manager – to have the possibility to switch between different node.js versions. macOS Linux Windows You must have macOS desktop access with administrator privileges. Login to the macOS desktop system and install Homebrew on your system (if not already installed). Install nvm via homebrew: brew install nvm See this installation guide on GitHub by nvm-sh for installing nvm. NVM for Windows runs in an Admin shell. You'll need to start powershell or Command Prompt as Administrator to use nvm-windows. Install NVM for Windows with an Installer provided by nvm-sh on their release page. Once installed you can check the available versions with nvm list If you have no other projects, where you need a different version, it is recommended to install the latest stable LTS version of node. nvm install lts nvm has now installed the latest node.js version with its package manager npm. Check if the installation has been successfull by checking it: node --version","s":"Step 1 – Installing Node.js via nvm","u":"/community/contribute/local-docusaurus-development-guide","h":"#step-1--installing-nodejs-via-nvm","p":123},{"i":131,"t":"Clone the docs-page repository via your favourite method: HTTPS SSH HTTPS git clone https://github.com/SovereignCloudStack/docs-page.git SSH git clone git@github.com:SovereignCloudStack/docs-page.git","s":"Step 2 – Cloning the repository","u":"/community/contribute/local-docusaurus-development-guide","h":"#step-2-cloning-the-repository","p":123},{"i":133,"t":"Change your working directory within your terminal to the root of the cloned repository /docs-page and install all dependencies: npm install","s":"Step 3 – Installing dependencies","u":"/community/contribute/local-docusaurus-development-guide","h":"#step-3--installing-dependencies","p":123},{"i":135,"t":"You can now run the local development server from your terminal: npm start Once the server is up and running, your terminal will show you the local URL which you can open with your browser to see the page.","s":"Step 4 – Starting the development server","u":"/community/contribute/local-docusaurus-development-guide","h":"#step-4--starting-the-development-server","p":123},{"i":138,"t":"We adopt the default Admonition colors for Note, Tip, Info, Caution, Danger by docusaurus: Docusaurus Admonitons note Some content with Markdown syntax. tip Some content with Markdown syntax. info Some content with Markdown syntax. caution Some content with Markdown syntax. danger Some content with Markdown syntax.","s":"Admonitions","u":"/community/contribute/styleguide","h":"#admonitions","p":136},{"i":140,"t":"Blockquotes should be handled with standard markdown > Example Blockquote: The raw data format is really the only sensible format option to use with RBD. asdasdasdasd asd asd a Technically, you could use other QEMU-supported formats (such as qcow2 or vmdk), but doing so would add additional overhead, and would also render the volume unsafe for virtual machine live migration when caching (see below) is enabled.","s":"Blockquotes","u":"/community/contribute/styleguide","h":"#blockquotes","p":136},{"i":142,"t":"We support markdown language features for Codeblocks. It is mandatory to define the language to be quoted, when using codeblocks. Syntax Highlighting is also supported by Docusaurus via Prism. We are using the GitHub language themeing as default. Python example def code_block(): # Everything in this function is part of the same code block print (1) print (2) for i in range(4): # Everyting in this loop is part of the same code block print (i) Javascript example const code_block = () => { console.log(\"inside code_block\"); }; YAML example --- doe: \"a deer, a female deer\" ray: \"a drop of golden sun\" pi: 3.14159 xmas: true french-hens: 3 calling-birds: - huey - dewey - louie - fred Ruby example require 'redcarpet' markdown = Redcarpet.new(\"Hello World!\") puts markdown.to_html","s":"Codeblocks","u":"/community/contribute/styleguide","h":"#codeblocks","p":136},{"i":144,"t":"We use nearly all default rules of ansible lint. A listing of all these rules can be found in the Ansible Lint documentation: https://ansible.readthedocs.io/projects/lint/rules/. Please always use the ansible linting to check if the code complies with the default linting rules. However, since in most cases we always use the latest version of packages and Ansible lint does not provide this, we decided to disable the package_latest rule.","s":"Ansible Style Guide","u":"/community/contribute/styleguides/ansible_styleguide","h":"","p":143},{"i":146,"t":"Tasks must always have names. The only exception allowed is for forked playbooks. A name never starts with a small letter Names are written in present tense No punctuation is used in names","s":"Task naming","u":"/community/contribute/styleguides/ansible_styleguide","h":"#task-naming","p":143},{"i":148,"t":"To check the key order we use our own rule. This can be found here.","s":"Key Order","u":"/community/contribute/styleguides/ansible_styleguide","h":"#key-order","p":143},{"i":150,"t":"The become directive is only set when needed and is always set explicitly for each task that needs it. Blocks, roles or playbooks are never executed in a privileged mode. We always insert the become directive between the name of a task and the task itself. This also applies to related directives like become_user or become_flags. This is for better visibility if a task is privileged or not. - name: Copy hddtemp configuration file become: true ansible.builtin.copy: src: \"{{ ansible_os_family }}/hddtemp\" dest: \"{{ hddtemp_conf_file }}\" owner: root group: root mode: 0644 notify: Restart hddtemp service","s":"Positioning and use of the become directive","u":"/community/contribute/styleguides/ansible_styleguide","h":"#positioning-and-use-of-the-become-directive","p":143},{"i":152,"t":"If you need to use the when condition please add this at the end-section from the task where it is needed. This makes the code easier to understand for others. Ansible lint provides the when condition under the task name for blocks. To keep the code clear we decided against it. Please disable this with a noqa if necessary. For example: - name: \"Archive existing {{ resolvconf_file }} file\" become: true ansible.posix.synchronize: src: \"/etc/resolv.conf\" dest: \"/etc/resolv.conf.{{ ansible_date_time.date }}\" archive: true delegate_to: \"{{ inventory_hostname }}\" when: stat_resolvconf_file.stat.islnk is defined and not stat_resolvconf_file.stat.islnk","s":"Position of the when condition","u":"/community/contribute/styleguides/ansible_styleguide","h":"#position-of-the-when-condition","p":143},{"i":154,"t":"Collections are always defined as in the following example. netbox.netbox is here the collection that is used. - name: Configure netbox manufacturers netbox.netbox.netbox_manufacturer: netbox_url: \"{{ netbox_url }}\" netbox_token: \"{{ netbox_token }}\" data: name: \"{{ item.value.name }}\" slug: \"{{ item.value.slug }}\" description: \"{{ item.value.description | default('') }}\" state: present with_dict: \"{{ netbox_data_manufacturers }}\" Please don´t declare it in this way!: collections: - netbox.netbox tasks: - name: Manage Discworld site netbox_site: netbox_url: \"{{ netbox_url }}\" netbox_token: \"{{ netbox_token }}\" validate_certs: false data: name: Discworld slug: discworld state: present If you have to use collections please define them in a requirements.yml. Example yaml: roles: - name: geerlingguy.certbot version: master type: git src: git+https://github.com/geerlingguy/ansible-role-certbot.git ... collections: - name: ansible.netcommon source: https://galaxy.ansible.com - name: https://github.com/ansible-collections/ansible.posix.git type: git version: main","s":"Usage of collections","u":"/community/contribute/styleguides/ansible_styleguide","h":"#usage-of-collections","p":143},{"i":156,"t":"If you want to reuse roles please do it in the following way: First you have to declare the role or collection in the requirements.yml like shown in the example before. Than you can use it in playbooks like this roles: - role: osism.services.auditd","s":"Usage of roles from other collections","u":"/community/contribute/styleguides/ansible_styleguide","h":"#usage-of-roles-from-other-collections","p":143},{"i":158,"t":"Parameters that provide a list are always defined as in the following example. docker_hosts_defaults sets the defaults in the role. Overriding is only possible with the ansible-defaults repository. In the configuration repository, docker_hosts_extra is then used to add additional items to the list. docker_hosts itself is never modified from the outside. docker_hosts_defaults: - \"unix:///var/run/docker.sock\" docker_hosts_extra: [] docker_hosts: \"{{ docker_hosts_defaults + docker_hosts_extra }}\"","s":"Parameters that offer lists","u":"/community/contribute/styleguides/ansible_styleguide","h":"#parameters-that-offer-lists","p":143},{"i":160,"t":"Please think twice before turning off changed_when. It's a fairly simple yet safety-relevant linting rule and is quite easy to implement.","s":"Usage of changed_when","u":"/community/contribute/styleguides/ansible_styleguide","h":"#usage-of-changed_when","p":143},{"i":162,"t":"In principle, it is only allowed to disable rules if there is really no other possibility. Please do not disable rules in general but only in individual cases via Noqa. Please use in this case the full rulename and not the numbers, because them are depricated. If it makes sense to ignore a rule, please open up an issue in the https://github.com/osism/issues repository with a label discussion.","s":"Disable linting rules","u":"/community/contribute/styleguides/ansible_styleguide","h":"#disable-linting-rules","p":143},{"i":164,"t":"To protect our source code from unwanted changes, we enforce the following branch protection rules for all repositories within our GitHub organization: Require a pull request before merging into our default branch main. Require at least one approval before pull requests can be merged. Dismiss stale pull request approvals when new commits are pushed Require status checks to pass before merging Require branches to be up to date before merging Status checks that are required: DCO Do not allow bypassing the above settings The branch protection rules are rolled out by our github-manager to ensure that all repositories use a consistent set of rules. Should you intend to propose changes to the above rules, please open a pull request against orgs/SovereignCloudStack/data.yaml. Some repositories however do allow that the above rules are bypassed by the organization's owners, especially repositories that are used for public resources such as the website or the weekly digest.","s":"Branch Protection Rules","u":"/community/github/branchprotection","h":"","p":163},{"i":166,"t":"The Developer Certificate of Origin (DCO) is a lightweight way for contributors to certify that they wrote or otherwise have the right to submit the code they are contributing to the Sovereign Cloud Stack. By making a contribution to this project, I certify that: (a) The contribution was created in whole or in part by me and I have the right to submit it under the open source license indicated in the file; or (b) The contribution is based upon previous work that, to the best of my knowledge, is covered under an appropriate open source license and I have the right under that license to submit that work with modifications, whether created in whole or in part by me, under the same open source license (unless I am permitted to submit under a different license), as indicated in the file; or (c) The contribution was provided directly to me by some other person who certified (a), (b) or (c) and I have not modified it. (d) I understand and agree that this project and the contribution are public and that a record of the contribution (including all personal information I submit with it, including my sign-off) is maintained indefinitely and may be redistributed consistent with this project or the open source license(s) involved. All contributions to the Sovereign Cloud Stack are licensed under the (OSI approved) open source license of the upstream project being used therein (very often this is the Apache Software License v2). Where we create independent code, we prefer to use the GNU Affero General Public License 3, except for interface code which we would put under LGPL-3 (weak copyleft). Own documentation content is licensed under Creative Commons BY-SA 4.0. Contributors sign-off that they adhere to these requirements by adding a Signed-off-by line to commit messages. My fancy commit message Signed-off-by: Christian Berendt Git has a -s command line option to append this automatically to your commit message: git commit -s -m 'My fancy commit message' The status of a pull request is set to failed if commits do not contain a valid Signed-off-by line. Considerations behind the choice of AGPLv3, CC-BY-SA and the usage of the DCO can be found license-considerations.md.","s":"Developer Certificate of Origin + Licenses","u":"/community/github/dco-and-licenses","h":"","p":165},{"i":168,"t":"https://developercertificate.org/ https://julien.ponge.org/blog/developer-certificate-of-origin-versus-contributor-license-agreements/ https://lwn.net/Articles/592503/","s":"Further reading","u":"/community/github/dco-and-licenses","h":"#further-reading","p":165},{"i":171,"t":"Are you tired of keeping track of planned changes or issues you scheduled for the future? Our Octo Reminder is here to safe you from unneeded cognitive load! The app configuration is stored in our .github repository. Using the bot is fairly simple: To schedule a reminder, simply comment with /remind-me [date] [message] on an issue or pull request. The bot will answer and mention you in the particular issue/pull request upon reaching the configured date. If you don't specify a time for the reminder, the bot will use 9:00 CET as default reminder time. The date and time can be anything that momentjs understands, e.g. an ISO 8601 string or a relative string such as tomorrow or next week.","s":"Octo Reminder - your friendly assistant","u":"/community/github/tips-and-tricks","h":"#octo-reminder---your-friendly-assistant","p":169},{"i":173,"t":"As Sovereign Cloud Stack (SCS), our mission is to provide Operators (be it Cloud Service Providers or just internal IT departments) with a well working software stack, that avoids exposing them to legal risks or additional restrictions that limits the usefulness. Free software licenses have this intention but differ in how they achieve it and in what kind of protections they provide. In the first approximation, all OSI-approved open source licenses can be considered as valid options. As a matter of fact, we do consider projects under such licenses as valid modules for SCS — where we use such projects and adjust or extend them, we would provide our contributions under the license terms of the respective project, so we can achieve our goal to feed back code upstream to the respective project, contribute to it and avoid fragmentation. Where we do create independent code, we do have additional preferences, though. For our own code, we do prefer the Affero General Public License version 3 (AGPLv3) as license. Likewise, for documentation, we prefer CC-BY-SA. Where we create standard libraries to interface with our software, we would consider the LGPLv3 for these, as we don't want interaction with our platform to be seen as requiring licensing code.","s":"License considerations for SCS","u":"/community/license-considerations","h":"","p":172},{"i":175,"t":"The GPL family of licenses are reciprocal licenses — sometimes called copyleft licenses — the recipient of the licensed code can make all sorts of modifications, but if she uses the code to release software (GPL) or provide a networked service (AGPL) to others, then she must grant the same rights to the recipients — this includes making the modifications available under the same terms as the received software. Microsoft has infamously attacked copyleft licenses (and specifically the GPL) as cancerous \"viral\" license. Reciprocity has many advantages: Code that has been created as free software will stay free. While GPL code can be combined in a larger software collection with proprietary software, the code itself including its enhancements etc. (technically: all derived works, see below) will remain free. The obligation to make the changes available avoids fragmentation. As changed and \"improved\" versions need to be made available, it is much easier to review and feed those changes back and create a unified upstream codebase that reflects the needs of the complete user base by including the needed changes. This was observed and reported by Martin Fink (HP's former CTO). The hugely successful Linux kernel project uses the GNU GPL; many of the more traditional key projects in the open source world use copyleft licenses such as the AGPL, GNU GPL, GNU LGPL, MPL or the OSL.","s":"Reciprocity","u":"/community/license-considerations","h":"#reciprocity","p":172},{"i":177,"t":"Not fulfilling the license terms of a software license typically leads to the ability for the license owner to revoke the license — as it is relatively easy to not fulfill all obligations of the GPL out of sheer negligence, the revocation without prior warning seems disproportionate — this is sometimes called the GPL death penalty. The open source community though has a strong interest in bringing every licensee into compliance by giving violators a fair chance to correct their behavior. SCS explicitly supports the GPL Cooperation Commitment and the respective document from the Linux kernel developers and pledges to give violators a warning and a chance to correct action by allowing for a cure period. This is a bit of a legacy issue — it is relevant to (L)GPLv2 code only — v3 of L/A/GPL does already contain language that has cure provisions, so it's clear by the licensing terms. Many companies seem to be worried that they will inadvertently violate the GPL by negligence. And it is true that a company needs a tighter control of the usage of inbound source code which comes with a reciprocal license than the permissive BSD 3-clause or Apache Software (v2) licenses. This advantage however quickly turns into a disadvantage as soon as the company does significant outbound open source contributions under a permissive license — they rarely want to give their competitors an opportunity to consume their contributions and then add proprietary changes to gain an advantage. In general, companies are well advised to have a detailed understanding of all code that is being used and contributed and their respective license terms — for proprietary and open source code and for reciprocal and for permissive licenses. Some companies have successfully installed license review boards or open source review boards to create oversight, recommendations and policies to ease the governance. Despite this, many of the recent open source projects, especially in the cloud world have adopted permissive licenses, such as X11, BSD 3-clause, MIT and especially the popular Apache software license (ASL2), as it appears to allow for faster adoption by companies that may not have mature open source policies in place or that simply have overly careful lawyers which may be influenced by the scare tactics some bad companies have built on top of copyleft licenses.","s":"Controversy","u":"/community/license-considerations","h":"#controversy","p":172},{"i":179,"t":"The reciprocity of the GNU GPL does not apply on the creation of a derived work. A company can consume GPL'ed code and change it to their own liking without ever making any the changes available if only used in-house. The terms however do apply as soon as the derived work is released, i.e. the software is passed on to a third party. In modern times, software is often used to provide a networked service (think SaaS) to third parties. Unlike the standard GPL, the Affero GPL (AGPL) does consider the act of making it available in such a way as similar to releasing the software and does require that applied changes to the software are being made available in this case. The AGPL thus closes a shortcoming in the traditional non-Affero GPL for a world that increasingly moves towards networked services. The very successful Nextcloud project uses the AGPLv3.","s":"Affero","u":"/community/license-considerations","h":"#affero","p":172},{"i":181,"t":"What exactly constitutes derived work needs to be defined — it's one of the questions where copyright law can get subtle. From a practical view, consuming (non-trivial) source code and binary linking is typically considered creating derived works. Whereas interacting via a network API or starting another process is typically considered a copyright boundary. To avoid any unclarity, the Linux kernel community has explicitly called out using Linux system calls (which includes using the interface definitions) is a copyright boundary and can thus be done by applications without any license implications. Considering linked code to be derived works (as is the case in the GPL and AGPL) and thus requiring it under the same (or a compatible) copyleft license is considered a Strong Copyleft license. Libraries are often providing implementations for standard services and helpers; it may not be reasonable to consider applications that want to use a library as derived works from that library and requiring the application to thus be licensed under a (compatible) copyleft license. For these libraries, a Weak Copyleft license (such as the LGPL or the EPL can be used. This would still require changes to the library itself to me made available under the copyleft license but would make binary linking (including the use of interface definitions) a copyright barrier and thus allow for non-copylefted code to be linked against a weakly copylefted library. This license is used by many of the standard and system libraries in the Linux world and is often a good choice for libraries of standardized services.","s":"Derived works and Strong vs. Weak Copyleft","u":"/community/license-considerations","h":"#derived-works-and-strong-vs-weak-copyleft","p":172},{"i":183,"t":"Free software licenses are intended to give users broad rights — the GNU GPL talks about the four freedoms to use software for any purpose, to study and adjust the software (this needs source code access), to redistribute the software and to improve it and to make these improvements available. Software patents can significantly subvert the intended rights — the open source community in general dislikes software patents for this and many other reasons that are discussed elsewhere . In some countries, there are rules that prevent pure software from being patented, though not all patent offices are fully following these rules. As software patents are existing and a serious danger to the open source goals, there are a few attempts to improve the situation. The Apache Software License (a permissive license), requires code contributors to grant a patent license to all downstream recipients of the code to use the contributed code by itself or in combination with the project that it was contributed to and makes a possible patent holder lose its license rights should he nevertheless try to assert a patent against the thus licensed use. The (A)GPLv3 has a similar clause. The Open Invention Network (OIN) has a meanwhile huge patent pool that is cross-licensed between all participants and which can freely be used in a large list of covered open source software by everyone, except for those that raise patent violation claims against any of the covered open source projects. This basically restricts those patents to be only used defensively in the context of the covered open source projects. Should SCS be in a position to make inventions that should be protected by a software patent, it pledges to contribute these to the OIN pool.","s":"Patents","u":"/community/license-considerations","h":"#patents","p":172},{"i":185,"t":"Very few Open Source projects require copyright assignment; the GNU projects are the only commonly used ones that the author is aware of. This results in fully centralized copyright ownership. This puts the FSF into a very strong position — a position to enforce copyright, to change licenses etc. This requires a lot of trust towards the copyright assigneed. Most open source projects prefer distributed copyright — the authors (or their employers) retain the copyright to their works. They grant a license for the open source project to use and integrate and redistribute the work — typically the license grant is extended to the public. In a sufficiently distributed copyright model, it is very hard to change a license, as all copyright holders would need to agree. This can both be considered advantageous and disadvantageous. Many software projects use Contributor License Agreements (CLAs), documenting that contributed code grants certain rights to the project owner (a foundation or sometimes a company). This ensures that the project owner has all needed rights to use, protect, redistribute ... the code. If the CLA contains copyright assignment, it also allows the project to change the license or to create derived works under a different license. While this is advantageous for the project owner, it is not necessarily advantageous for the code contributor. Copyright enforcement does not require all copyrights to be held by a legal entity. Any holder of significant copyrights can actually enforce it against violators. The Linux kernel and an increasing number of projects do not work with copyright assignments nor CLAs, but with Developer Certificates of Origin (DCO — the signed-off lines of kernel commits). This is deemed sufficient to document the origin and the authorization to contribute code. The SCS project will not change the license. There however might be cases, where potential users can not consume AGPL'ed or LGPL'ed code (due to corporate policies, e.g. based on bad experience, immature license governance practices or lawyers that panic). Our goal would be to ensure that our licensing terms and all other pledges provide the assurance needed that users do not need to be afraid of the AGPL. The cure provisions from v3 of the GPL license family actually also help to avoid unnecessary fear. However, unfortunately, some \"open source\" companies in the past have abused copyleft with a scare and sell a proprietary license tactics to make money, which has hurt copyleft acceptance significantly. We might thus not be successful and need to somehow accept not serving all users or come up with a relicensing scheme that can not corrupt ourselves. We are following the copyleft-next discussion to work out how we can best achieve this, but have not yet found the silver bullet. This might have an influence how we do DCOs, maybe under a permissive license, or maybe need to use CLAs.","s":"Copyright Assignments and Contributor License Agreements","u":"/community/license-considerations","h":"#copyright-assignments-and-contributor-license-agreements","p":172},{"i":187,"t":"It is best practice that open source projects grant their downstream users the same license rights as they received contributions under. Or worded the opposite direction: It is best practice to require no more rights to be granted from upstream contributors (in the CLA or DCO) than the projects grants to downstream consumers of the project. SCS follows this best practice.","s":"License in = License out","u":"/community/license-considerations","h":"#license-in--license-out","p":172},{"i":189,"t":"https://en.wikipedia.org/wiki/Comparison_of_free_and_open-source_software_licences https://en.wikipedia.org/wiki/Software_patents_and_free_software https://joinup.ec.europa.eu/collection/eupl/matrix-eupl-compatible-open-source-licences https://lwn.net/Articles/592503/ https://sfconservancy.org/blog/2020/jan/06/copyleft-equality/ https://developercertificate.org https://julien.ponge.org/blog/developer-certificate-of-origin-versus-contributor-license-agreements/","s":"Further reading","u":"/community/license-considerations","h":"#further-reading","p":172},{"i":191,"t":"This checklist is designed to simplify the planning of hackathons and meetups. All items are suggestions and optionally adaptable to the situation.","s":"Hackathon planning checklist","u":"/community/hackathons/checklist","h":"","p":190},{"i":193,"t":"Date Task - [ ] Clarify sponsorship - [ ] Clarify who is responsible for planning. Contact persons of the companies involved. These should then also be present at the hackathon. - [ ] Set a specific date. - [ ] Clarify responsibilities. - [ ] First advertising in form of advertising in meetings, LinkedIn post, mailing list or similar. - [ ] Clarify which advertising measures are required (see checklist advertising). - [ ] Determine venue. - [ ] Set the theme for the hackathon and apply it to the design.","s":"Checklist 6 months before Hackathon","u":"/community/hackathons/checklist","h":"#checklist-6-months-before-hackathon","p":190},{"i":195,"t":"Topic Task - [ ] Social Media Create content plan. - [ ] Which accounts/people/companies have to be mentioned as well. - [ ] Which persons must agree to a publication. - [ ] Should hashtags be used, if yes which ones. - [ ] Newsletter Create content plan with possible content and frequency. - [ ] Website Content plan: Blogposts. - [ ] Info landing page. - [ ] Registration page. - [ ] Special newsletter or just regular. - [ ] Other placements Spread the word in meetings or at other events. - [ ] Media Should be changeable, specify target audience, language, sources. - [ ] Media suggestions Video, images, PDF, texts, merch, graphics. Everything should be planned in advance precisely date, type, releases, scope, size, etc. - [ ] Graphics Set design motto. - [ ] Key metrics Should the success be tracked by key metrics, if so which ones.","s":"Checklist advertising","u":"/community/hackathons/checklist","h":"#checklist-advertising","p":190},{"i":197,"t":"Date Task - [ ] Clarify if extra merch is desired and start looking for vendors. Order samples. - [ ] Discuss concrete advertising measures. - [ ] Check hotels (see checklist hotel).","s":"Checklist 5 months before Hackathon","u":"/community/hackathons/checklist","h":"#checklist-5-months-before-hackathon","p":190},{"i":200,"t":"Availabilities in the period. Way from the hotel to the hackathon. Parking at the hotel. Way from train station to hotel. Checkin / Checkout times. Check barrier-free accessibility.","s":"Iportant things","u":"/community/hackathons/checklist","h":"#iportant-things","p":190},{"i":202,"t":"Bar in the hotel, for relaxed sitting together in the evening. Clarify whether employees from on site are also allowed in the bar. Clarify whether reservations must be made in the bar, if so, reserve for the evening before. Possibility of contingent reservation.","s":"Nice-to-have things","u":"/community/hackathons/checklist","h":"#nice-to-have-things","p":190},{"i":204,"t":"Date Task - [ ] Determine hotel final and make recommendation. Possibly reserve contingent if the hotel offers it. - [ ] Find the location for the evening before (see checklist for evening before location). - [ ] Start organizing venue. (See checklist rooms 1). - [ ] Roughly plan evening event (consider volume level and space available). - [ ] Promotional drumbeat. Social media, website, meetings, newsletter. - [ ] Order special merch. - [ ] Organize merch in general (see merch checklist). - [ ] Start collecting statements that need to be sent around. (Privacy statements, photo statements, data center statements, security statements). - [ ] Rough sequence of events to be able to plan more precisely at a later date.","s":"Checklist 4 months before Hackathon","u":"/community/hackathons/checklist","h":"#checklist-4-months-before-hackathon","p":190},{"i":206,"t":"Volume level. Consider food possibilities. Enough space. Availability. If intermediate change from A to B, then plan and include firmly in the plan. If it is necessary to choose two locations because of food, drink, coziness, distance to the hotel: plan both, ask for and book them. Ask for flexibility in the reservation. If more people come as registered. Plan times. Price / performance ratio should fit. Way from the hotel to the evening before location.","s":"Checklist for evening before location","u":"/community/hackathons/checklist","h":"#checklist-for-evening-before-location","p":190},{"i":208,"t":"Space available (Enough space available for: Work area, meet-up area, no-photo area, break room, restrooms?). Provisional room plan. How long are the rooms available? Are there any legal/corporate issues to consider? Do declarations need to be signed to enter the premises? List what hackathon relevant equipment is on site and if anything needs to be organized. For example, screens, whiteboards, power sockets if necessary, tables, chairs, wi-fi, etc.","s":"Checklist rooms 1","u":"/community/hackathons/checklist","h":"#checklist-rooms-1","p":190},{"i":210,"t":"Ballpens Lanyards Notepads Stickers ID card / name badge covers Name badges Snacks","s":"Checklist merch (examples)","u":"/community/hackathons/checklist","h":"#checklist-merch-examples","p":190},{"i":212,"t":"Date Task - [ ] Required declarations (photo/video usage rights, data center, premises, etc.) are available as a form. Have a look if you can have them confirmed with the registration. Otherwise as a circular email to all who register with the registration confirmation. Well visible. For the photo/video declaration: Give the option of refusing and explain the variant with the no-photo dot. - [ ] Promote again: Website, social media, newsletter, meetings, circular email, etc.... - [ ] Make reservations for pre-evening event. - [ ] Plan evening event and reserve location / tables (see checklist evening event). - [ ] Create a provisional schedule. - [ ] Eventually invite people separately. (Special guests). - [ ] Schedule start time and arrival time. Allow enough time for everyone to arrive. - [ ] Set presentation time and end time. - [ ] Define arrival time evening event. Leave enough time to change, but also do not define too long. - [ ] Schedule a fixed cleanup time. - [ ] Plan break time. - [ ] Activate login page.","s":"Checklist 3 months before Hackathon","u":"/community/hackathons/checklist","h":"#checklist-3-months-before-hackathon","p":190},{"i":214,"t":"Volume level (It should be possible to have relaxed conversations) Available space Price / performance ratio should be suitable Check availabilities Snacks should be possible Request flexibility with reservation (number of participants) Actions would be a nice-to-have, everyone has been sitting and working all day, so it's good to have a change. Way from the hotel to the evening location.","s":"Checklist evening event","u":"/community/hackathons/checklist","h":"#checklist-evening-event","p":190},{"i":216,"t":"Date Task - [ ] Start collecting goals and topics. - [ ] Work out goals and topics yourself. - [ ] Check results from the checklist rooms 1 again. - [ ] Go through checklist rooms 2. - [ ] Advertising (social media, mailing list, website, blog post, newsletter, room plan video, etc). - [ ] Go through checklists again in general, was anything forgotten? - [ ] Plan food for the break. - [ ] Plan snacks / breakfast (See snacks checklist).","s":"Checklist 2 months before Hackathon","u":"/community/hackathons/checklist","h":"#checklist-2-months-before-hackathon","p":190},{"i":219,"t":"Sandwiches (rolls) Pretzel sandwiches Sandwiches (toast) Cocktail tomatoes","s":"Breakfast examples","u":"/community/hackathons/checklist","h":"#breakfast-examples","p":190},{"i":221,"t":"\"Kinder Schokobons\" \"Kinder Schokoriegel\" \"Kinder Duplo\" Hanuta Gummy bears Apples Bananas Nuts Grapes Dried fruits Salted sticks Salted pretzels","s":"Snack exemples","u":"/community/hackathons/checklist","h":"#snack-exemples","p":190},{"i":223,"t":"\"Katjes Fruchtgummi\" \"Katjes Lakritz\"","s":"Vegan snack examples","u":"/community/hackathons/checklist","h":"#vegan-snack-examples","p":190},{"i":225,"t":"Create a room plan for publication. In it, work areas, break areas, no-photo area, meet-up places should be clearly visible. Gladly also again as a video. If necessary route map. Is wifi available without any problems? Where will drinks be located? Where to set up snacks? Where the food for the break? Are there enough plates, cups, glasses, cutlery, napkins, and bowls for snacks?","s":"Checklist rooms 2","u":"/community/hackathons/checklist","h":"#checklist-rooms-2","p":190},{"i":227,"t":"Date Task - [ ] Fix and publish the agenda. - [ ] Check the declarations once again, has every declaration been send, have any answered yet? - [ ] Check reservations, expand if necessary. - [ ] Check whether all possible special features have been observed (location etc). - [ ] Pre-order food for in-between meals and for the lunch break. - [ ] Plan drinks, type and quantity (don't forget coffee, tea, milk, sugar).","s":"Checklist 1 month before Hackathon","u":"/community/hackathons/checklist","h":"#checklist-1-month-before-hackathon","p":190},{"i":229,"t":"Date Task - [ ] Print statements and forms. - [ ] Advertise again. - [ ] Make a list for the snacks (See for inspiration checklist snacks). - [ ] Pre-order the food, if necessary, check whether the quantity still fits with the registrations. Depending on expand. Firmly plan transport / pickup / delivery. - [ ] Create a room plan with the topics, where, when, what takes place. - [ ] Organize drinks. - [ ] Determine the time when the helpers / organizers meet. - [ ] If necessary create / organize lists and visitor cards.","s":"Checklist 1 week before Hackathon","u":"/community/hackathons/checklist","h":"#checklist-1-week-before-hackathon","p":190},{"i":231,"t":"Date Task - [ ] Buy snacks. - [ ] Contact food supplier again if the delivery date is suitable. - [ ] Check technology for functionality. - [ ] Send around the room plan with the topics by email. - [ ] Prepare rooms if necessary / possible. - [ ] Put drinks in the refrigerator. - [ ] Provide coffee machine. - [ ] Provide dishes. - [ ] Label rooms. - [ ] Check visitor cards and lists for completeness.","s":"Checklist one day before Hackathon","u":"/community/hackathons/checklist","h":"#checklist-one-day-before-hackathon","p":190},{"i":233,"t":"Time Task - [ ] Place snacks on the tables in small bowls or similar. - [ ] Distribute merchandise. - [ ] Have declarations and forms ready for late deciders. - [ ] Have lists and visitor cards ready if necessary. - [ ] Check drinks in an interval. - [ ] Make coffee if necessary. - [ ] Provide tea, coffee, milk, sugar. - [ ] Provide breakfast / snacks. - [ ] Pick up lunch. - [ ] Lunch \"build up\" - [ ] Cleanup - [ ] Keep an eye on the process (keep times a little bit). - [ ] See if everyone feels picked up, no one is bored. - [ ] Makes Photos.","s":"Checklist Hackathon Day X","u":"/community/hackathons/checklist","h":"#checklist-hackathon-day-x","p":190},{"i":235,"t":"Date Task - [ ] Collect photos and provide them in a link for review and approval. - [ ] Create and send feedback sheet. - [ ] Create Blog Post Article. - [ ] Eventually create retro video. - [ ] Create social media posts. (After all approvals). - [ ] Prepare debriefing. - [ ] Summarize and process feedback.","s":"Checklist after Hackathon","u":"/community/hackathons/checklist","h":"#checklist-after-hackathon","p":190},{"i":237,"t":"Welcome to the Dev Docs. This section is primarily for SCS Developers and will contain documentation regarding the Development and Architecture of the Sovereign Cloud Stack and its components. You will find documents, explanations and guides regarding the tooling necessary for the development of SCS. If you want to contribute you can reach out to us via our Matrix Channel.","s":"Documentation for SCS Developers","u":"/dev-docs/","h":"","p":236},{"i":239,"t":"SovereignCloudStack wants to make it possible for operators to delegate administration of user identities to the organizational entities that the users are part of. Usually that's customer organizations but it could also be the operator itself. Federation protocols like OpenID Connect can be used to achieve that goal. To simplify connecting the different parts of SCS to customer owned IAM solutions, SCS deploys Keycloak as central Identity Provider (IdP) service. Currently this is deployed automatically only in the osism/testbed, which provides its own documentation for authentication with OIDC. The following sections describe how this is done.","s":"Identity Federation in SCS","u":"/dev-docs/operations/iam/identity-federation-in-scs","h":"","p":238},{"i":241,"t":"To provide Infrastrucure as a Service SCS builds upon OpenStack. See section OpenStack Federation via OpenID-Connect for more details on identity federation for OpenStack.","s":"1. IaaS / OpenStack","u":"/dev-docs/operations/iam/identity-federation-in-scs","h":"#1-iaas--openstack","p":238},{"i":243,"t":"To provide Container as a Service SCS builds upon Kubernetes. There is work in progress to optionally connect Kubernetes to Keycloak and to map authorization decisions based on claims via cluster role bindings.","s":"2. CaaS","u":"/dev-docs/operations/iam/identity-federation-in-scs","h":"#2-caas","p":238},{"i":245,"t":"Keystone supports federating authentication and authorization decisions via several mechanisms as documented by the project. In SCS OpenID Connect is used for federation between Keystone and the IdP, which is currently provided by Keycloak in SCS. The following sections describe the setup.","s":"OpenStack Federation via OpenID-Connect","u":"/dev-docs/operations/iam/openstack-federation-via-oidc","h":"","p":244},{"i":247,"t":"Keystone supports federated identities. To allow SCS to consume identities managed in external IAM solutions, federation protocols like OpenID Connect or SAML can be used. Keystone currently makes use of third party apache modules like mod_auth_openidc, mod_oauth2 and mod_auth_mellon to delegate authentication to a SSO IdP (i.e. SAML IdP or OpenID Connect provider). In OpenStack the apache modules are configured using the wsgi-keystone.conf template. In SCS we make use of the OAuth 2.0 Authorization Code Grant flow between Keystone and Keycloak and use PKCE (RFC 7636) with the S256 challenge method. In addition to the usual SSL CA of the environment, Keycloak uses separate certificates to sign the OIDC tokens. Due to the way the Keystone container image runs apache (in the foreground) and keystone itself (as WSGI module), reconfiguring the apache URL locations on the fly is not possible currently without a downtime of several seconds. That is the reason why SCS currently makes use of a single central proxy realm in Keycloak, to which Keystone connects.","s":"1. Keystone","u":"/dev-docs/operations/iam/openstack-federation-via-oidc","h":"#1-keystone","p":244},{"i":249,"t":"Keycloak offers standard OIDC service discovery via .well-known documents to advertise its endpoints. In SCS we want to represent each customer by a separate dedicated Keycloak realm, which can enventually be used for customer self service and to federate out to customer owned IAM external solutions. In the SCS testbed we currently experiment with the implications of using a single central proxy realm in Keycloak and chaining federation from there to customer specific realms, also hosted in the same Keycloak instance. To make this usable, SCS makes use of the Keycloak Home IdP Discovery extension.","s":"1.1 Keycloak IdP realm discovery","u":"/dev-docs/operations/iam/openstack-federation-via-oidc","h":"#11-keycloak-idp-realm-discovery","p":244},{"i":251,"t":"Upon login of a user Keystone evaluates the credentials obtained from the ID token that the IdP issued. These include group memberships and roles, which can be used to assign the user to a certain project. Keystone maps these external identities to internal (shadow) users. It can either attempt to map the obtained information to a local type user, which needs to be provisioned before authentication by external tooling, or it can be instructed via the mapping to generate an ephemeral type user. ephemeral users are cleaned up automatically after some time of inactivity and with that, they lose access to projects, iff the access is granted indirectly via group membership rather than directly to the user itself. Group memberships for ephemeral users are only represented via their tokens, but not stored in the Keystone backend database. After successful authorization Keystone issues an OpenStack specific fernet token to the user, which is the currency that is understood by other OpenStack services and can be used to access them. In SCS we want to represent each customer by a sepatate dedicated OpenStack domain to host their projects and (shadow) user accounts. The processing of information from the OIDC tokens is configured by two parts. The first part is the rules.json mapping which is described in the OpenStack federation mapping combinations document. This file is used to configure Keystones internal mapping engine and it needs to be attached to some OpenStack domain, which is named keycloak by default in SCS. The second (static) part is the [auth] and [mapped] sections in keystone.conf (see e.g. the overlays currently used in the OSISM testbed ).","s":"1.2 Keystone mapping of token claims","u":"/dev-docs/operations/iam/openstack-federation-via-oidc","h":"#12-keystone-mapping-of-token-claims","p":244},{"i":253,"t":"The Horizon dashboard supports login via OpenID Connect via Keystone endpoint. SCS adjusted the logout behavior to invalidate both, the OpenID Connect session with the IdP and the Keystone token.","s":"1.3 Horizon WebSSO for federated users","u":"/dev-docs/operations/iam/openstack-federation-via-oidc","h":"#13-horizon-websso-for-federated-users","p":244},{"i":255,"t":"To support OpenStack CLI and API access, SCS implemented support for the OIDC Device Authorization Grant in Keystone. On top we added support for PKCE (RFC 7636) in combination with that.","s":"1.4 OpenStack CLI and API access for federated users","u":"/dev-docs/operations/iam/openstack-federation-via-oidc","h":"#14-openstack-cli-and-api-access-for-federated-users","p":244},{"i":257,"t":"To show the potential of this approach to federation SCS created a Howto for OIDC federation between SCS deployments.","s":"1.5 SSO Federation between to SCS deployments","u":"/dev-docs/operations/iam/openstack-federation-via-oidc","h":"#15-sso-federation-between-to-scs-deployments","p":244},{"i":260,"t":"The Sovereign Cloud Stack combines the best of Cloud Computing in one unified standard. SCS is built, backed, and operated by an active open-source community worldwide. As only the sum of different repositories complete the SCS Stack, it is important to have an easy and accessible documentation in one place.","s":"About","u":"/docs/","h":"#about","p":258},{"i":262,"t":"SCS describes a standard as well as a reference implementation of this standard. Please see our public web site and specifically the About SCS page.","s":"What is SCS? Why should I care?","u":"/docs/","h":"#what-is-scs-why-should-i-care","p":258},{"i":265,"t":"The easiest way to get in touch with SCS is to deploy a SCS cloud virtually. This means that you set up a SCS test installation including all the infrastructure pieces such as database, message queueing, ceph, monitoring and logging, IAM, the OpenStack core services, and (soon) the Container layer on top of an existing IaaS platform. Currently, only OpenStack is supported as IaaS under the SCS cloud (so you end up using OpenStack on top of OpenStack — with nested virtualization enabled, this performs decently). There is no fundamental limitation — just noone has done the porting of the terraform recipes yet to AWS, libvirt, VMware, ... The SCS IaaS reference implementation is based on OSISM. Read on the OSISM testbed docs to learn how to get the testbed running. Please read carefully through the deployment section of the manual. The Requirements:Cloud access subsection also lists some clouds that we have SCS running on and test regularly. You can easily deploy the container layer on top of the testbed (or a production SCS cloud of course) checking out the code from k8s-cluster-api-provider.","s":"Get it and test it: Testbed","u":"/docs/","h":"#get-it-and-test-it-testbed","p":258},{"i":267,"t":"A few production clouds are already based on SCS: betacloud and pluscloud open. More will come soon. CityNetwork, Open Telekom Cloud, OVH clouds are also known to support the testbed well. (There are a few caveats with the latter two, but those are documented and no blockers.) Read above mentioned Requirements:Cloud access subsections.","s":"Existing SCS Clouds","u":"/docs/","h":"#existing-scs-clouds","p":258},{"i":269,"t":"The work done in SCS is supposed to be fed back upstream — into the relevant CNCF projects, into OpenStack, into kolla-ansible, into OSISM and others. An OSISM deployment thus will bring you all the SCS greatness in the base layer. Whenever possible SCS works directly in the upstream projects. While the SCS projects tracks the efforts across the released in epics and userstories, the work on the code happens upstream - as such these repositories are usually not found in the SCS namespace.","s":"Development of SCS","u":"/docs/","h":"#development-of-scs","p":258},{"i":272,"t":"SCS R0 has been released on 2021-07-15 and bundles the work accomplished by the community prior to the full start of the project. See Release Notes for R0 for more information.","s":"Release 0 (2021-07-15)","u":"/docs/","h":"#release-0-2021-07-15","p":258},{"i":274,"t":"R1 came quickly after R0 and was the first release to ship a production ready k8s stack (with k8s cluster API), some identity federation integration and much improved preconfiguration for monitoring and logging. See Release Notes for R1 for more information.","s":"Release 1 (2021-09-29)","u":"/docs/","h":"#release-1-2021-09-29","p":258},{"i":276,"t":"This release delivers vast improvements for bare metal automation and the features in the container layers. See Release Notes for R2 for more information.","s":"Release 2 (2022-03-23)","u":"/docs/","h":"#release-2-2022-03-23","p":258},{"i":278,"t":"Release 3 features user federation, increase in deployment and upgrade velocity by improving automated test coverage as well as bringing disk encryption based on tang from the state of a technical preview to be fully supported. See Release Notes for R3 for more information.","s":"Release 3 (2022-09-21)","u":"/docs/","h":"#release-3-2022-09-21","p":258},{"i":280,"t":"The implemented open source components have been updated to the latest stable versions. Among others, this includes OpenStack Zed, Kubernetes Cluster API 1.3.x, Cluster API Provider for OpenStack 0.7.x, Kubernetes 1.26.x, and Ubuntu 22.04 LTS. See Release Notes for R4 for more information.","s":"Release 4 (2023-03-22)","u":"/docs/","h":"#release-4-2023-03-22","p":258},{"i":282,"t":"We have a 6 month release cadence — R4 will follow in March 2023. Until then, we will provide bugfixes and security fixes for R3. We do work towards a model where our partners can actually follow our main development branches — right now, our CI needs a bit more coverage though to make this safe.","s":"Roadmap","u":"/docs/","h":"#roadmap","p":258},{"i":284,"t":"Please see the SCS contributor guide.","s":"Contribute and Connect","u":"/docs/","h":"#contribute-and-connect","p":258},{"i":286,"t":"We intend to work on a conformity test suite. Right now, we are basically relying on upstream tests -- RefStack (to perform the OpenStack trademark certification tests formerly known as DefCore) and the Kubernetes CNCF conformance tests run through sonobuoy. We have specific standards aligned within the SCS community (and have also sought feedback from the broader Gaia-X and OpenStack communities). Beyond this, we have a draft document that captures our view on how SCS compatible environments should look like. This one has not yet seen sufficient review to be eligible for standardization. However, we appreciate feedback (raise issues and PRs or start discussions).","s":"Standards, Conformity and Certification","u":"/docs/","h":"#standards-conformity-and-certification","p":258},{"i":288,"t":"Please raise issues on github. If you can identify the affected component, raise the issue against the relevant repository in the SovereignCloudStack or OSISM space. Otherwise you can use the issues repository. Obviously we appreciate PRs even more than issues; please don't forget to sign off your contributions (see contributor guide ). When reporting bugs, it is very useful to include some standard information typically needed to analyze: What state of software (SCS) were you testing? What version numbers ... ? How does your environment look like (hardware, operating systems, etc.)? What did you do? What did you expect? What happened instead? Have you done this successfully before? What changed? Can this be reproduced? Occasionally? Reliably? How? Any analysis you have done? Experiments and their results? Log files?","s":"Issues and bugs","u":"/docs/","h":"#issues-and-bugs","p":258},{"i":290,"t":"Please check our main web page. If you are an onboarded SCS community member, find here a link to our nextcloud (login required). Our community interacts through our github organization, on mailing lists as well as chats matrix.org:SCS.","s":"Other resources","u":"/docs/","h":"#other-resources","p":258},{"i":292,"t":"The container layer within the Sovereign Cloud Stack (SCS) offers a robust solution for managing container workloads on a Kubernetes infrastructure. It facilitates the on-demand creation and scaling of Kubernetes clusters, catering to various needs across development, testing, deployment, and operation of services and applications. While the container layer is versatile for a range of use cases, the most common ones include: Self-Service: Here, entities can empower their development teams with the autonomy to spawn and manage their clusters on demand, fostering a more agile and responsive development environment. KaaS (Kubernetes as a Service): In this model, an SCS Cloud provider can offer their customers a managed Kubernetes service, abstracting much of the underlying operational complexity from their customers.","s":"Container Layer Introduction","u":"/docs/container/","h":"","p":291},{"i":294,"t":"DevOps/SysOps Teams: They are the primary beneficiaries as the container layer promotes flexible, on-demand operations helpful for continuous development, testing, deployment, and service management. Cloud Service Providers: By delivering a standardized container orchestration platform, they can provide more reliable and robust services to their customers, enhancing their product portfolio.","s":"Target groups","u":"/docs/container/","h":"#target-groups","p":291},{"i":296,"t":"The container layer is not an alternative to Infrastructure as a Service (IaaS) but rather an extension that allows for more streamlined operation and management of containerized applications. Although the container layer doesn't directly support Serverless Containers or Functions as a Service, these can be run on a Kubernetes cluster. However, as of now, the SCS container layer doesn't offer specialized tools for these use cases.","s":"What is it not","u":"/docs/container/","h":"#what-is-it-not","p":291},{"i":298,"t":"Knowledge: Familiarity with Kubernetes, container orchestration, and basic cloud infrastructure principles is pivotal. Software: The core software component is the K8s Cluster API Provider, crafted to function optimally on OpenStack environments. Although designed to run on the SCS IaaS layer, with minor configuration adjustments, it can operate on any OpenStack environment. Hardware: Virtualization-enabled hardware capable of running OpenStack is essential if hosting the IaaS layer independently. For further details, refer to the IaaS layer documentation.","s":"Prerequisites and Requirements","u":"/docs/container/","h":"#prerequisites-and-requirements","p":291},{"i":300,"t":"Automated Cluster Management: The K8s Cluster API Provider automates the process of creating, scaling, managing and updating Kubernetes clusters, thus significantly reducing the operational overhead. Standardized Operations: Upholding SCS standards across various clusters ensures operational consistency and reliability. Integration with OpenStack: The K8s Cluster API Provider is tailored to work seamlessly with SCS IaaS (OpenStack), thus offering a unified platform for managing both containers and the underlying infrastructure. Container Registry Integration: The container layer has an integrated container registry, facilitating easy management and deployment of container images. Certificate Managment: The kubernetes clusters can optionaly include a certbot allowing for ease of deployment of public facing services out of the box. Preconfigured ingress: Certificate Management: Optional inclusion of Certbot in Kubernetes clusters facilitates straightforward deployment of publicly accessible services. Preconfigured Ingress: Kubernetes clusters come with a preconfigured Nginx ingress, designed with OpenStack in mind, providing a ready-to-use ingress solution with enhancements like out-of-the-box client source IP visibility.","s":"Features","u":"/docs/container/","h":"#features","p":291},{"i":302,"t":"OpenStack Dependency: The current design primarily supports OpenStack environments, which could be a limitation for other infrastructure setups. Serverless/Functions as a Service Support: Lack of direct support for serverless containers and Functions as a Service (FaaS) might require additional tools or platforms.","s":"Limitations","u":"/docs/container/","h":"#limitations","p":291},{"i":304,"t":"The container layer has matured with multiple cloud providers now offering Kubernetes as a Service using this layer to manage a multitude of clusters. It follows a half-yearly release schedule to ensure security and up-to-date Kubernetes clusters, alongside providing backports for significant features into older versions. Looking ahead, a new version based on ClusterStacks is in the pipeline, currently in its Alpha state. This upcoming release aims to be backward compatible, facilitating smooth migration from existing setups, and further extending the capabilities of the SCS container layer.","s":"Current state and future Outlook","u":"/docs/container/","h":"#current-state-and-future-outlook","p":291},{"i":307,"t":"Repository is known by SCS Zuul Basic ansible knowledge Basic yaml knowledge zuul-client installed (Only if you want to create secrets. See also) Check SCS Zuul projects for your repository to be available. If it is missing you need an administrator to get your repository configured to Zuul.","s":"Prerequisites","u":"/dev-docs/operations/operations/zuul-ci-cd-quickstart-user-guide","h":"#prerequisites","p":305},{"i":309,"t":"You may have heard about Zuul and may ask yourself if it is capable to support you. Basically everything you use ansible for can be done using Zuul. That is not always a good thing since you may get careless and your workload will exceed the CI/CD concept. If you find yourself doing things under the following list you are at the right place. Code testing Deployment tests using IaC If you want to, let's say, monitor something using Zuul, that is possible but not the intended use case.","s":"Who is it for?","u":"/dev-docs/operations/operations/zuul-ci-cd-quickstart-user-guide","h":"#who-is-it-for","p":305},{"i":311,"t":"Right in your project's repository! The only prerequisite is that your repository you want Zuul to work on is known by Zuul. This is done by the Zuul's tenant configuration. To update this configuration you need access to the Zuul instance or ask an administrator for help. We assume that Zuul knows about your repository so we can get started. There are three topics that you should know about. To get jobs running you need the \"job\" itself. Jobs run within a \"pipeline\". The third important thing is to provide a \"project\" definition.","s":"Where do I start?","u":"/dev-docs/operations/operations/zuul-ci-cd-quickstart-user-guide","h":"#where-do-i-start","p":305},{"i":313,"t":"Zuul will parse all branches of the untrusted repositories that Zuul knows about. Your repository is most likely an untrusted one since only the configuration repositories should have the \"trusted\" state. So it doesn't matter whether you have just one branch containing Zuul files or all branches. Zuul is looking for the following pathes on your repositories root. ./zuul.yaml # everything is in here ./.zuul.yaml # ... or here ./zuul.d/ # use directory style to get a bit of a structure ├── jobs.yaml └── project.yaml ./.zuul.d/ # the same as before just hidden ├── jobs.yaml └── project.yaml Just use exactly one of the four possibilities. If using the directory style configuration all yaml files within this directory will be processed. If your projects configuration is small enough you may put all information in a single file called zuul.yaml. It is also possible to create the file or the directory with a leading dot to hide them for non zuul related work within the repository.","s":"Where to save the Zuul relevant data?","u":"/dev-docs/operations/operations/zuul-ci-cd-quickstart-user-guide","h":"#where-to-save-the-zuul-relevant-data","p":305},{"i":315,"t":"If Zuul is configured to observe your repository it will have a look at your projects definition. Minimal example: - project: name: my-org/my-repo default-branch: main merge-mode: \"squash-merge\" my_pipeline1: jobs: - my_job1 - my_job2 ...... my_pipeline2: jobs: - my_jobs ... By default Zuul will observe all branches for such files. We have to set the repository name that have to match the exact value that was set for Zuul. Set a default-branch where actions that don't match an explicit branch are executed on. Set the merge-mode that Zuul has to use. But beware that not all issue tracker support all methods. For github squash-merge will work. After these three properties add the pipelines you want to use to the project definition. With the jobs list you define which jobs to run in which pipeline. See official documentation","s":"Projects","u":"/dev-docs/operations/operations/zuul-ci-cd-quickstart-user-guide","h":"#projects","p":305},{"i":317,"t":"Every Zuul instance will have at least one repository that is used for configuration. There you will find the available pipelines. Pipelines are used to run your jobs on a periodic or event driven base. Pipelines can be used to run other pipelines and to keep your jobs in a defined order if you need this. Have a look at the configuration repository to utilize the pipelines for your repository. See available pipelines for SCS. You are not able to define new pipelines outside of a so called \"configuration\" repository. Since, by default your repo is considered \"untrusted\". So in the first place you don't need to think about, how to create a pipeline. Just use one that fits your needs as close as possible. Next you will find an enumeration and a small description about the available pipelines in SCS Zuul. Pipelines available in SCS Zuul: 1. check​ event driven pipeline runs if a pull request is created, changed or reopened re-runs if a comment contains recheck 2. gate​ event driven pipeline trigger events: pull_request_review, pull_request, check_run 3. post​ event driven pipeline trigger event: post 4. tag​ event driven pipeline trigger event: push 5. e2e-test​ event driven pipeline trigger event: pull_request 6. e2e-quick-test​ event driven pipeline trigger event: pull_request 7. unlabel-on-update-e2e-test​ event driven pipeline trigger event: pull_request 8. unlabel-on-update-e2e-quick-test​ event driven pipeline trigger event: pull_request 9. periodic-hourly​ time based pipeline that runs every hour 10. periodic-daily​ time based pipeline that runs every day at 3 o'clock am. 11. compliance_check​ time based pipeline that runs every 15 minutes If you want to know more about pipelines: See official documentation","s":"Pipelines","u":"/dev-docs/operations/operations/zuul-ci-cd-quickstart-user-guide","h":"#pipelines","p":305},{"i":319,"t":"All jobs that your Zuul instances knows of can be used for your own purposes. Call them directly or implement a job that uses an existing job as parent. Didn't find the right job? Than we have to create a new one. Existing jobs can be found in the web ui of your Zuul instance: Example First have a look on a basic job example: - job: name: base parent: null description: | The recommended base job. All jobs ultimately inherit from this. It runs a pre-playbook which copies all of the job's prepared git repos on to all of the nodes in the nodeset. It also sets a default timeout value (which may be overidden). pre-run: playbooks/base/pre.yaml post-run: - playbooks/base/post.yaml - playbooks/base/post-logs.yaml roles: - zuul: zuul/zuul-jobs timeout: 1800 nodeset: nodes: - name: ubuntu-jammy label: ubuntu-jammy Each job needs a name that has to be unique within the whole tenant. A useful convention to achieve this is to prepend the name of the repository. Each job need to define whether there is parent job or not. Jobs without a parent are called \"base\" jobs. Usually you don't want to implement base jobs since there are already some base jobs that implement often used stuff. A description may not be mandatory but is obviously useful. Necessary for Zuul to do anything you just need to add a run or roles property. Within a job that is like a noop job or just printing something to stdout that is everything you need to run your first job. Since anything we want to do requires a little bit more you have to define a nodeset. The nodes are used to run your playbooks on. In 99,9% you will need this too. The properties pre-run and post-run are useful for bootstrap and cleanup. If your actual job wants to create bootstrap some infrastructure you can to this in the pre-run. Using an cloud provider you want to release no longer used resources. That can be done in the post-run. If you are using a parent job it is likely that the parent job may has pre- and post-run playbooks. In this case your pre- and post-run playbooks are \"nested\". Example: pre-run parent pre-run my job post-run my job post-run parent If your job exceeds the defined timeout, the job is considered as failed. See official documentation What about secrets?​ Right now you should be able to run basic tasks. But what if you try to test something that needs credentials to connect to an outside service? Or you have to address additional ressources in an openstack environment and you have to use something like app credentials? That is where job secrets are used. Example: - job: name: SOME_JOB parent: base description: | A job basic job used as example secrets: - name: clouds_conf secret: app_credential_cloud_conf run: playbooks/my-playbook.yaml Secrets for a job are simply defined by the keyword secrets. Each secret needs a name that can be used in your playbooks. The property secret references the secret that is defined within your project. ATTENTION! If your job is using a secret job.post-review is automatically set to true. For untrusted projects, that means that your job is only called in piplines that have the pipeline.post-review flag set to true. In SCS context that means you may run these jobs only with the pipelines tag and post. If you want to run jobs on pipelines that have post-review set to false, which is default, and your job needs a secret, the secret may be defined in the zuul-config repository. Example: - secret: name: app_credential_cloud_conf data: credentials: my-secret-value Within my-playbook.yaml you can reference the secret value using \"{{ clouds_conf.credentials }}\". In this example my-secret-value is clear readable text. That is not something we want to keep secrets. But how do you encrypt secrets in a way that they are secure and also can be decrypted by Zuul? For this purpose Zuul creates its own public/private key pair for each project. Everyone may use the public key to create secrets. But only Zuul will be able to decrypt these values. To avoid the user to be responsible for the correct encryption there is an zuul-client tool that will do this for you. Example (reading from stdin and writing to stdout): zuul-client --zuul-url ZUUL_URL encrypt --tenant SCS --project SovereignCloudStack/REPO Add --infile INFILE or --outfile OUTFILE if you prefer to work with files directly. The output might look like this: - secret: name: data: : !encrypted/pkcs1-oaep - IGZ2Wu47R9mEY4fjetbxSAUGNaz4HR1mjk9lCLq3HsUMjHGj9YPlb2MvnPQw1LCJSvpaK ogth7hi2zYwrs5tNAik/qlVSB7AM+LQRP7lmlM4JmD6WOyR7DisHu7oMD1Gqem2ZuMggA DIBn5+DeBIvnwihDOcS+BKPTVMEtXOJNkuObZHE8DweB/RQIGUvjyeq5yoAmz/y+qGVqe 0Vk4pTYFIBgk5DMzwVnDzDkqs/QokoOupMUoBcpapmM11do4ymjbDpeINjayoro6VXTtX Mkk9fDv9wuJIQTuyHAOfMD+UYS/HqVSF/Hm9ScUvfhw02gTdzKCxliWhFHJOj7RbdUUMK OYYcUkNp5cXZUYFnflMhxVEnzREbdAIklNPfoHOizsxLPaUZ9yk6XcFRflFfMvqBtUS00 LCx0Uh906NwdaEUrv2ZdrN123rwfwfw4333232rDFDFfsdfddsfdDFSFSdqrrtwms5Mi0 szUBaM4j+Mayep+41vl0cpsLU91GzXEATWMaPIN8OnEHF6qQIv0wB6VaKd5aeAyERisb3 wFdjEo4faLO70RWzR33k+4xqAYNIIFyTMpWJz21CUSfoYG8ygL6t7RJGgyjA+0KsVEyj+ ewEtiaUOLYyD7pXtqdw1HgzjqiXnfxk+wSv/y5y/TGGYpQj8zU76jS7Zj0ft/0= You may use this content or the file to provide it as a secret. You just have to update the and the part. The secret name has to be unique across all projects. Because of this, we have a naming convention in the SovereignCloudStack organisation that ensures that a secret has a unique name. Our convention is as follows. There is only one secret per Zuul configuration per project (for exceptions, see below). This secret always has a name in the form SECRET_REPOSITORY_NAME. For instance, if a secret in the SovereignCloudStack/k8s-cluster-api-provider repository is to be used, it is given the name SECRET_K8S_CLUSTER_API_PROVIDER. The name of the repository is always written in capital letters. A dash is replaced with an underscore. Any number of values (: !encrypted/pkcs1-oaep) can then be assigned to this one secret. In certain cases, it can be undesireable to expose all secret information to all jobs in a project. Then additional secrets may be used, whose names have to be formed by appending an underscore and some upper-case prefix to the name of the primary secret. For instance, we might use the name SECRET_REPOSITORY_NAME_FOOBAR. Official documentation: Secrets documentation Encryption documentation Let's put it all together​ For a basic but working example the following content may be written into a zuul.yaml file. # zuul.yaml content --- - secret: name: SECRET_REPOSITORY_NAME data: secretValue1: !encrypted/pkcs1-oaep - secretValue2: !encrypted/pkcs1-oaep - secretValue3: !encrypted/pkcs1-oaep - - job: name: myFirstTestJob parent: base secrets: - name: secretName # The name of the secret that is used within \"playbooks/testPlaybook.yaml\" secret: SECRET_REPOSITORY_NAME run: playbooks/testPlaybook.yaml - job: name: mySecondTestJob parent: base run: playbooks/testPlaybookTwo.yaml - project: tag: jobs: - myFirstTestJob check: jobs: - mySecondTestJob This will run the job myFirstTestJob whenever the tag pipeline is triggered, and mySecondTestJob whenever check is triggered. Within SCS the check pipeline is always triggered if you open, change or reopen a pull request. This pipeline can also be triggered manually if you write a comment on an already existing pull request and place the string recheck in it. Recall that the first test job cannot run on the same pipeline because it uses a secret. The tag pipeline is run whenever a new tag is created. The path to you playbook is always the full path within the repository. The playbook contains the tasks you actually want to run on all or a specific subset of nodes. Example playbook: # playbooks/testPlaybook.yaml content --- - hosts: all tasks: - debug: msg: 'Debug print my secrets! {{ secretName.secretValue1 }}' # do not do this as it will expose your secrets","s":"Jobs","u":"/dev-docs/operations/operations/zuul-ci-cd-quickstart-user-guide","h":"#jobs","p":305},{"i":321,"t":"The terraform creates an application credential that it passes into the created VM. This one is then used to authenticate the cluster API provider against the OpenStack API to allow it to create resources needed for the k8s cluster. The AppCredential has a few advantages: We take out variance in how the authentication works -- we don't have to deal with a mixture of project_id, project_name, project_domain_name, user_domain_name, only a subset of which is needed depending on the cloud. We do not leak the user credentials into the cluster, making any security breach easier to contain. AppCreds are connected to one project and can be revoked. We are using an unrestricted AppCred for the management server which can then create further AppCreds, so we can each cluster its own (restricted) credentials. In the case of breaches, these AppCreds can be revoked. Note that you can have additional projects or clouds listed in your ~/.config/openstack/clouds.yaml (and secure.yaml) and reference them in the OPENSTACK_CLOUD setting of your clusterctl.yaml, so you can manage clusters in various projects and clouds from the same management server.","s":"Application Credentials","u":"/docs/container/components/k8s-cluster-api-provider/doc/application-credentials","h":"","p":320},{"i":323,"t":"Setting up the nginx ingress controller from the upstream deployment templates using the externalTrafficPolicy: local setting and -- without any special treatment -- results in a service that is only partially working: Only requests that the LoadBalancer happens to route at the node where the nginx container is running get a response. nginx could just use the cluster setting instead and kube-proxy would forward the network packets. There are two reasons for nginx not to do that Having a load-balancer balance the traffic to a node that is not active just to have kube-proxy forward it to the active node does not make much sense. It creates an unnecessary hop and makes the LoadBalancer pretty useless. Packets forwarded by kube-proxy do not carry the original client IP, so any source IP dependant handling in nginx (filtering, QoS, ...) will not be possible.","s":"Ingress with externalTrafficPolicy: local","u":"/docs/container/components/k8s-cluster-api-provider/doc/LoadBalancer-ExtTrafficLocal","h":"","p":322},{"i":325,"t":"There does not seem to be a standard mechanism where k8s tells the LoadBalancer (LB) which backend members are active, but the load-balancer can find this out by using a health-monitor that probes for the availability of the service and then takes the inactive nodes out of the rotation. Should the container be rescheduled on some other node, the health-monitor will adapt within a few seconds. Since SCS R2, the deployed nginx-ingress deployment is patched to carry a service annotation (a behavior specifically needed by OpenStack) that enables the health-monitor for the LB in front of the ingress. This results in traffic to flow. This covers the nginx ingress controller that is deployed by setting DEPLOY_NGINX_INGRESS: true with the create_cluster.sh or apply_nginx_ingress.sh. That the ingress we call the \"managed ingress\". For the ingress service to see the client IPs, more is needed. The Octavia LB as well as the nginx service both support the proxy protocol, which can be used to communicate the real client IP. We had plumbing included which we disabled by default prior to releasing R2, because it broke the access to ingress from software that runs inside the cluster. A workaround for this has been implemented, so the default is NGINX_USE_PROXY: true as of R4. So the managed nginx ingress service does work reliably and gets the client IPs.","s":"Getting it to work for managed ingress","u":"/docs/container/components/k8s-cluster-api-provider/doc/LoadBalancer-ExtTrafficLocal","h":"","p":322},{"i":327,"t":"Users that deploy their own nginx or other services with externalTrafficPolicy: local won't be helped by the annotations done by the SCS cluster management. They will have to do similar custom patching or revert to a cluster policy and forego the visibility on real client IPs. A generic solution to this would be a different kind of LB that does work at the networking layer 3 (routing), so the (TCP) connections are not terminated at the LB and then data being forwarded on a new connection to the backend member, but the routing would create a direct connection. Google (with Direct Server Return, DSR) and Azure support such LB modes. As it turns out, on OpenStack clouds that use OVN as networking (SDN) layer, the OVN loadbalancer does almost deliver what's needed.","s":"Getting it to work in general","u":"/docs/container/components/k8s-cluster-api-provider/doc/LoadBalancer-ExtTrafficLocal","h":"","p":322},{"i":329,"t":"The OVN provider for the load-balancer does create direct flows to the chosen backend member, so no proxy protocol (or similar hacks) are needed to make the backend service see the client IPs. This has been validated (and can even be monitored by openstack-health-monitor) on SCS clouds that use OVN. A health-monitor is still needed to ensure that only active members receive requests. There are unfortunately two problems with the health-monitoring on the OVN provider: The health-monitor does correctly detect members that are not responding and stops routing traffic from the VIP towards the inactive member. Unfortunately the traffic that comes in from the floating IP associated with the VIP is not treated the same, but is still distributed to the inactive members, resulting in a good fraction of the requests to go unanswered. This is tracked in bug https://bugs.launchpad.net/neutron/+bug/1956035 The OCCM always tries to create an HTTP health-monitor. The OVN provider however does not yet support HTTP health-monitors, only TCP. We'll have to wait for (and possibly help with) HTTP health-monitors to be implemented upstream. Due to the HTTP health-monitor not being supported, the created loadbalancer is not considered functional, so the reconciliation loop creates another loadbalancer until your project runs into quota limits (on the loadbalancer or on ports). So for now, the feature use_ovn_lb_provider should not be enabled. Note that the use_ovn_lb_provider does not affect the LB in front of the kube API. That one is created by capo and requires other settings. Also note that it would not yet support the CIDR filtering with restrict_kubeapi setting.","s":"OVN provider LoadBalancer","u":"/docs/container/components/k8s-cluster-api-provider/doc/LoadBalancer-ExtTrafficLocal","h":"","p":322},{"i":331,"t":"We could enable a health-monitor by default for load-balancers created from OCCM in the k8s clusters. This would make services with externalTrafficPolicy: local work, as the traffic would be routed exclusively to active members. But the other goal would not be achieved: Getting the real client IPs. We decided against turning on the health-monitor by default, as this might result in the wrong impression that local fully works. Rather break and then have users take a decision to go for cluster, to enable health-monitoring to get it half-working or to do health-monitoring plus some extra plumbing for proxy protocol (or similar) to get all aspects working.","s":"Disabled health-monitor by default","u":"/docs/container/components/k8s-cluster-api-provider/doc/LoadBalancer-ExtTrafficLocal","h":"","p":322},{"i":333,"t":"Project k8s-cluster-api-provider uses SCS Zuul CI platform to drive its continuous integration tests. The project is registered under the SCS tenant and therefore is able to use a set of pre-defined pipelines, jobs, and ansible roles that SCS Zuul instance defines and imports. If you want to explore currently available SCS pipelines, visit the SCS zuul-config project. If you want to see the full list of jobs that are available, visit the SCS Zuul UI. And if you are looking for some handy ansible role that SCS Zuul imports, visit they source. Refer to SCS Zuul users guide and/or Zuul docs for further details on how to define and use Zuul CI/CD pipelines and jobs. Note (for geeks): If you are interested in Zuul CI platform and want to deploy your own development instance of it, then read the official quick-start manual or visit this tutorial which aims a connection of Zuul CI platform with a GitHub organization.","s":"Continuous integration","u":"/docs/container/components/k8s-cluster-api-provider/doc/continuous-integration","h":"","p":332},{"i":335,"t":"SCS Zuul automatically recognizes .zuul.yaml configuration file that is located in the k8s-cluster-api-provider's root. This file informs Zuul about the project's default-branch and preferred merge-mode. It also references SCS Zuul pipelines and their jobs used by the k8s-cluster-api-provider project. Then, jobs link Ansible playbooks that contain tasks for actual CI testing. See relevant CI configuration files: ├── .zuul.yaml ├── playbooks │ ├── cleanup.yaml │ ├── dependencies.yaml │ ├── e2e.yaml │ ├── templates │ │ └── environment.tfvars.j2","s":"Configuration","u":"/docs/container/components/k8s-cluster-api-provider/doc/continuous-integration","h":"#configuration","p":332},{"i":337,"t":"This section describes an SCS Zuul pipelines that are used by the k8s-cluster-api-provider project. e2e-test It is triggered by the e2e-test label in the opened PR It executes k8s-cluster-api-provider-e2e-conformance job It applies the PR label successful-e2e-test and leaves an informative PR comment when the k8s-cluster-api-provider-e2e-conformance job succeeded It applies the PR label failed-e2e-test and leaves an informative PR comment when the k8s-cluster-api-provider-e2e-conformance job failed It applies the PR label cancelled-e2e-test and leaves an informative PR comment when the k8s-cluster-api-provider-e2e-conformance job is canceled unlabel-on-update-e2e-test It is triggered by the PR update only when PR contains the successful-e2e-test label It ensures that any PR update invalidates a previous successful e2e test It removes successful-e2e-test label from the PR e2e-quick-test It is triggered by the e2e-quick-test label in the opened PR It executes k8s-cluster-api-provider-e2e-quick job It applies the PR label successful-e2e-quick-test and leaves an informative PR comment when the k8s-cluster-api-provider-e2e-quick job succeeded It applies the PR label failed-e2e-quick-test and leaves an informative PR comment when the k8s-cluster-api-provider-e2e-quick job failed It applies the PR label cancelled-e2e-quick-test and leaves an informative PR comment when the k8s-cluster-api-provider-e2e-quick job is canceled unlabel-on-update-e2e-quick-test It is triggered by the PR update only when PR contains the successful-e2e-quick-test label It ensures that any PR update invalidates a previous successful e2e test It removes successful-e2e-quick-test label from the PR periodic-daily This pipeline runs jobs daily at 3AM It executes k8s-cluster-api-provider-e2e-conformance job The job overrides the git_reference variable to ensure that the e2e conformance testing is executed on a specific tag","s":"Pipelines","u":"/docs/container/components/k8s-cluster-api-provider/doc/continuous-integration","h":"#pipelines","p":332},{"i":339,"t":"This section describes Zuul jobs defined within the k8s-cluster-api-provider project and linked in the above pipelines. k8s-cluster-api-provider-e2e-conformance It runs a sonobuoy conformance test against Kubernetes cluster spawned by k8s-cluster-api-provider scripts This job is a child job of openstack-access-base that ensures OpenStack credentials availability in Zuul worker node. Parent job also defines a Zuul semaphore semaphore-openstack-access, that ensures that only one openstack-access-base job (or its children) can run at a time See a high level k8s-cluster-api-provider-e2e-conformance job steps: Pre-run playbook dependencies.yaml installs project prerequisites, e.g. terraform, yq, etc. Main playbook e2e.yaml spawns a k8s cluster, runs sonobuoy conformance test, and cleans created infrastructure, all by k8s-cluster-api-provider scripts Cleanup-run playbook cleanup.yaml runs ospurge, cleanup created application credentials and keypair to ensure that multiple e2e runs do not interfere k8s-cluster-api-provider-e2e-quick It runs a sonobuoy quick test against Kubernetes cluster spawned by k8s-cluster-api-provider scripts This job is a child job of openstack-access-base that ensures OpenStack credentials availability in Zuul worker node. Parent job also defines a Zuul semaphore semaphore-openstack-access, that ensures that only one openstack-access-base job (or its children) can run at a time See a high level k8s-cluster-api-provider-e2e-quick job steps: Pre-run playbook dependencies.yaml installs project prerequisites, e.g. terraform, yq, etc. Main playbook e2e.yaml spawns a k8s cluster, runs sonobuoy quick test, and cleans created infrastructure, all by k8s-cluster-api-provider scripts Cleanup-run playbook cleanup.yaml runs ospurge, cleanup created application credentials and keypair to ensure that multiple e2e runs do not interfere","s":"Jobs","u":"/docs/container/components/k8s-cluster-api-provider/doc/continuous-integration","h":"#jobs","p":332},{"i":341,"t":"The parent job openstack-access-base, from which e2e jobs inherit, defines secret variable openstack-application-credential. This secret is stored directly in the SCS/zuul-config repository in an encrypted form. It contains OpenStack application credentials to access the OpenStack project dedicated for CI testing. This secret is encrypted by the SCS/zuul-config repository RSA key that has been generated by SCS Zuul instance. So only SCS Zuul instance is able to decrypt it (read the docs). If you want to re-generate the mentioned secret or add another one using SCS/zuul-config repository RSA key, follow the below instructions: Install zuul-client pip install zuul-client Encrypt \"super-secret\" string by the SCS/zuul-config repository public key from SCS Zuul echo -n \"super-secret\" | \\ zuul-client --zuul-url https://zuul.scs.community encrypt \\ --tenant SCS \\ --project github.com/SovereignCloudStack/zuul-config","s":"Secrets","u":"/docs/container/components/k8s-cluster-api-provider/doc/continuous-integration","h":"#secrets","p":332},{"i":343,"t":"In some cases you may want to change your environment.tfvars file before running the e2e test without changing the environment.tfvars file in the repository. For example, you may want to change the image variable to test a different system image without altering the default image used by the project. To do so, you can in the body of the PR add the following text: ```ZUUL_CONFIG image = \"Ubuntu 20.04\" ```","s":"Job customization","u":"/docs/container/components/k8s-cluster-api-provider/doc/continuous-integration","h":"#job-customization","p":332},{"i":345,"t":"How do developers/reviewers should proceed if they want to CI test this project?​ A developer initiates a PR as usual. If a reviewer deems that the PR requires e2e testing, they can apply a specific label to the PR. Currently, the following labels could be applied: e2e-test (for comprehensive e2e testing, including k8s cluster creation, execution of sonobuoy conformance tests, and cluster deletion) e2e-quick-test (for expedited e2e testing, involving k8s cluster creation, quick sonobuoy tests, and cluster deletion) After the e2e test has completed, the reviewer can examine the test results and respond accordingly, such as approving the PR if everything appears to be in order or requesting changes. Sonobuoy test results, along with a link to the e2e logs, are conveyed back to the PR via a comment. Additionally, the PR is labeled appropriately based on the overall e2e test result, using labels like successful-e2e-test, successful-e2e-quick-test, failed-e2e-test, or failed-e2e-quick-test. Why do we use PR label as an e2e pipeline trigger instead of e.g. PR comment?​ We consider PR labels to be a more secure pipeline trigger compared to, for example, PR comments. PR labels can only be applied by developers with triage repository access or higher. In contrast, PR comments can be added by anyone with a GitHub account. Members of the SCS GitHub organization are automatically granted 'write' access to SCS repositories. Consequently, the PR label mechanism ensures that only SCS organization members can trigger e2e pipelines. How do we ensure that any PR update invalidates a previous successful e2e test?​ In fact, two mechanisms ensure the invalidation of a previously successful test when a PR is updated. Firstly, the pipelines unlabel-on-update- remove the successful- label from the PR when it's updated after a successful e2e test has finished. If an e2e test is in progress and the PR is updated, the currently running e2e test is canceled, the successful- label is removed (if it exists), and the cancelled- label is applied along with an informative PR comment to inform the reviewer about the situation.","s":"FAQ","u":"/docs/container/components/k8s-cluster-api-provider/doc/continuous-integration","h":"#faq","p":332},{"i":348,"t":"What does a provider need to do in order to NOT run into a certificate issue? Update the cluster at least once a year to rotate certificates automatically Automatic certificate renewal for cluster upgrades kubeadm renews all the certificates during control plane upgrade. This feature is designed for addressing the simplest use cases; if you don't have specific requirements on certificate renewal and perform Kubernetes version upgrades regularly (less than 1 year in between each upgrade), kubeadm will take care of keeping your cluster up to date and reasonably secure. Renew all certificates with kubeadm certs renew all You only need to do this when you don't upgrade your cluster kubeadm certs renew","s":"Client Certificates in Kubernetes expire after one year.","u":"/docs/container/components/k8s-cluster-api-provider/doc/Maintenance_and_Troubleshooting","h":"#client-certificates-in-kubernetes-expire-after-one-year","p":346},{"i":350,"t":"Another problem is that the CA might expire as well (normally after 10 years) kubeadm does not have any tooling for this at the time of writing There is documentation for Manual Rotation of CA Certifcates On the management node, there is a signer.sh that can be used to sign server certificates after checking that they belong to the server.","s":"Certificate Authority expires","u":"/docs/container/components/k8s-cluster-api-provider/doc/Maintenance_and_Troubleshooting","h":"#certificate-authority-expires","p":346},{"i":352,"t":"NOTE: The following kubectl and clusterctl commands should be executed against the management Kubernetes cluster API. Keep in mind that these tools and the kubeconfig to access the management Kubernetes cluster are available in the management host, hence it is convenient to execute the following commands from the management host. Ask Kubernetes what went wrong: kubectl describe cluster The status and the events may give you a clue what happened. The healthy cluster should be in the phase: Provisioned $ kubectl describe cluster | yq .Status.Phase Provisioned You can also have a look at the openstackcluster object and see OpenStack related statuses and events. The healthy cluster should be ready: $ kubectl describe openstackcluster | yq .Status.Ready true Note that you can instead execute kubectl get cluster -ojsonpath='{ .status.phase }' and kubectl get openstackcluster -ojsonpath='{ .status.ready }' if you don't have yq at hand. A handy command for cluster health investigation is clusterctl describe cluster . This prints infrastructure/control plane/workers readiness status and other relevant information like a failure reason. The healthy cluster output is similar to this: $ clusterctl describe cluster NAME READY SEVERITY REASON SINCE MESSAGE Cluster/testcluster True 21m ├─ClusterInfrastructure - OpenStackCluster/testcluster ├─ControlPlane - KubeadmControlPlane/testcluster-control-plane True 23m │ └─3 Machines... True 21m See testcluster-control-plane-5ftjs, testcluster-control-plane-62cdj, ... └─Workers └─MachineDeployment/capi-testcluster-md-0-no1 True 22m └─3 Machines... True 21m See capi-testcluster-md-0-no1-84dd86f598-bhxfd, capi-testcluster-md-0-no1-84dd86f598-f6pnl, ... The logs of the capi pod and especially the capo pod are a good source of information. To find out in which condition the deployment status is, you can use the following way: kubectl logs -n capo-system -l control-plane=capo-controller-manager -c manager Successful cluster creation will log Reconciled Machine create successfully for successfully created nodes. kubectl logs -n capi-system -l control-plane=controller-manager -c manager In some cases could be a good idea to go through the official [capi] (https://cluster-api.sigs.k8s.io/user/troubleshooting.html) and capo troubleshooting guides or check whether you hit some known bug already reported in capi or capo projects. You can also check the OpenStack layer. A cluster deployment should result in a router,a network, a subnet, a loadbalancer (in front of kubeapi) and a number of servers (VMs) for the control-plane and worker nodes. Have you run out of quota?","s":"Failed cluster deployment debugging","u":"/docs/container/components/k8s-cluster-api-provider/doc/Maintenance_and_Troubleshooting","h":"#failed-cluster-deployment-debugging","p":346},{"i":354,"t":"Have a look at the pods that run: kubectl --context=-admin@ get pods -A or have a look at the nodes: kubectl --context=-admin@ get nodes -o wide If you fall into some Kubernetes specific issues after a successful cluster creation, go through the official Kubernetes troubleshooting guide.","s":"Cluster state","u":"/docs/container/components/k8s-cluster-api-provider/doc/Maintenance_and_Troubleshooting","h":"#cluster-state","p":346},{"i":356,"t":"Etcd is a highly-available key value store used as Kubernetes' backing store for all cluster data. This section contains etcd related maintenance notes from SCS k8s-cluster-api-provider project perspective. For further information about etcd maintenance visit an official etcd maintenance guide and/or Kubernetes etcd operating guide.","s":"Etcd maintenance","u":"/docs/container/components/k8s-cluster-api-provider/doc/Maintenance_and_Troubleshooting","h":"#etcd-maintenance","p":346},{"i":358,"t":"Etcd storage can become fragmented over time, for this, we have included a maintenance script that regularly defragments and then also backups the database. The script, called etcd-defrag.sh is located in each control plane node's /root directory . It is executed through the systemd service unit file etcd-defrag.service and scheduled to run each day at 02:30:00 using the etcd-defrag.timer systemd timer. The defragmentation strategy is inspired by the etcd-defrag-cronjob and practices recommended by the OpenShift project. Note that the proposed strategy could be changed in a future version based on results from related upstream issue #15477 which wants to define an official solution on how to defragment etcd cluster. The etcd-defrag.sh script checks multiple conditions before the actual defragmentation as follows: The script should not be executed on non leader etcd member The script should not be executed on etcd cluster with some unhealthy member The script should not be executed on single member etcd cluster These pre-flight checks should ensure, that the defragmentation does not cause temporary etcd cluster failures and/or unwanted etcd leader changes. They also prevent executing the script on a single control-plane node cluster. Single-node etcd clusters are not made for long-term operation. As a workaround, however, you can scale up to three control-plane nodes overnight from time to time. After all pre-flight checks passed the etcd cluster defragmentation is performed as follows: Defragment the non leader etcd members first Change the leadership to the randomly selected and defragmentation completed etcd member Defragment the local (ex-leader) etcd member At the end of the defragmentation script, the local (ex-leader) etcd member is backed up and trimmed. Backup is saved and then compressed in the control plane /root directory. You can find it here: /root/etcd-backup.xz. File system trim is performed by the fstrim command that discards unused blocks on a filesystem which could increase write performance on the long run and also release unused storage. Cluster admins are not supposed to log in to the cluster nodes (neither control plane nor workers) and thus won't access or use these backup files. The local backups on these nodes however can prove useful however in a disaster recovery scenario. All mentioned pre-flight checks could be skipped by the optional arguments that force defragmentation despite potential failures. Optional arguments are: --force-single (allows to execute defragmentation on single member etcd cluster) --force-unhealthy (allows to execute defragmentation on unhealthy etcd member) --force-nonleader (allows to execute defragmentation on non leader etcd member) We do not recommend to log in to the cluster nodes let alone executing manual defragmentation using the optional arguments above. If you are aware of potential issues, you can access the control plane node and execute the defragmentation script manually as follows: /root/etcd-defrag.sh [--force-single] [--force-unhealthy] [--force-nonleader]","s":"Defragmentation and backup","u":"/docs/container/components/k8s-cluster-api-provider/doc/Maintenance_and_Troubleshooting","h":"#defragmentation-and-backup","p":346},{"i":360,"t":"This is a reference to the Makefile targets. Almost all targets require the ENVIRONMENT variable to be set to the name of the environment you want to use. (See Environments in the requirements documentation for more information.)","s":"Makefile reference","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"","p":359},{"i":363,"t":"make create To initiate the management server setup, various components are created. This includes the provisioning of networks, security groups, and a virtual machine. An application credential is also generated for authentication purposes. Once the virtual machine is up and running, it is bootstrapped by cloning the specified git repository. Additionally, specific tools are installed to facilitate the process. Next, a local Kubernetes cluster is deployed using kind. The cluster acts as a foundation for further operations. During the setup, the Cluster API, as well as the Cluster API Provider (e.g. CAPO), are installed within the local cluster. This provider serves as the API server for Kubernetes CAPI, enabling management and interaction with the cloud backends (e.g. OpenStack). Finally, a test cluster is created utilizing Kubernetes CAPI. This test cluster allows for experimentation, validation, and development within the CAPI environment. Note that make create will not create a testcluster if you have set controller_count to zero in your environment file (environment-.tfvars). Note that make create does not copy local files to the management server, only some files are templated there from the terraform/files/template directory. If you want to change any of the scripts being copied to the management server, you need to commit, push your changes, and run make create again. make create will pull the latest changes from the git repository.","s":"make create","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-create","p":359},{"i":365,"t":"make get-kubeconfig This will get the kubeconfig of the testcluster and store it in the file testcluster.yaml..","s":"make get-kubeconfig","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-get-kubeconfig","p":359},{"i":367,"t":"make ssh This will ssh into the management server, using the username that was set in your environment-.tfvarsfile. The default in the environment file is ubuntu. Note: there is also an alias to this make login","s":"make ssh","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-ssh","p":359},{"i":369,"t":"make openstack This will run openstack cli.","s":"make openstack","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-openstack","p":359},{"i":371,"t":"make k9s This will run k9s on the management server.","s":"make k9s","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-k9s","p":359},{"i":373,"t":"make log CONSOLE=capi-mgmtcluster This will show openstack console log of the management server. You can specify the console log you want to see by setting the CONSOLE variable. The default is capi-mgmtcluster.","s":"make log","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-log","p":359},{"i":375,"t":"make console CONSOLE=capi-mgmtcluster This will open openstack console of the management server in the browser using XDG-open. You can specify the console you want to open by setting the CONSOLE variable. The default is capi-mgmtcluster.","s":"make console","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-console","p":359},{"i":377,"t":"Note that clean and fullclean leave the ubuntu-capi-image-$KUBERNETES_VERSION image registered, so it can be reused. You need to manually unregister it, if you want your next deployment to register a new image with the same kubernetes version number.","s":"Teardown","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#teardown","p":359},{"i":379,"t":"make clean does ssh to the capi management server to clean up the created clusters prior to terraform cleaning up the resources it has created. This is sometimes insufficient to clean up unfortunately, some error in the deployment may result in resources left around.","s":"Make clean","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-clean","p":359},{"i":381,"t":"make fullclean uses a custom script cleanup/cleanup.sh (using the openstack CLI) to clean up everything while trying to not hit any resources not created by the CAPI or terraform for clusters from this management host. It is the recommended way for doing cleanups if make clean fails. Watch out for leftover floating IP addresses and persistent volumes, as these can not be easily traced back to the Cluster API created resources and may thus be left. There is also a make forceclean variant that hits unused floating IPs and all persistent volumes -- this is risky as there is no good way to tell which PVCs belong to us unless we find them attached to cluster nodes in which case we don't need the force options.","s":"Make fullclean","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-fullclean","p":359},{"i":383,"t":"You can purge the whole project via make purge. Be careful with that command as it will purge all resources in the OpenStack project even those that have not been created through this Terraform script or the Cluster API. It requires the ospurge tool. Install it with python3 -m pip install git+https://git.openstack.org/openstack/ospurge.","s":"Make purge","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-purge","p":359},{"i":386,"t":"make check SONOMODE=... This will run tests of the configuration on testcluster using sonobuoy. It will also download the results and print them to the console. Optionally you can also specify a mode by using for example SONOMODE=\"--mode quick\" Note: This runs over 5000 tests and takes a long time to complete (~ 2 hours).","s":"make check","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-check","p":359},{"i":388,"t":"make check-quick This will run tests of the configuration on testcluster using sonobuoy with mode quick.","s":"make check-quick","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-check-quick","p":359},{"i":390,"t":"make check-conformance This will run tests of the configuration on testcluster using sonobuoy with mode conformance meaning it will test if the cluster is conformant to the CNCF.","s":"make check-conformance","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-check-conformance","p":359},{"i":392,"t":"make check-storage This will run tests of the configuration on testcluster using sonobuoy of the storage.","s":"make check-storage","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-check-storage","p":359},{"i":394,"t":"make check-csi This will run tests of the configuration on testcluster using sonobuoy of the CSI.","s":"make check-csi","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-check-csi","p":359},{"i":397,"t":"make init This will initialize terraform. It will download the required providers and modules. It will also select or create a new workspace for you. The workspace name is the same as the ENVIROMENT variable.","s":"make init","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-init","p":359},{"i":399,"t":"make attach RESOURCE= PARAMS=... This will attach a resource to the terraform state. This is useful if you have created a resource outside of terraform and want to manage it with terraform.","s":"make attach","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-attach","p":359},{"i":401,"t":"make detach RESOURCE= PARAMS=... This will detach a resource from the terraform state. This is useful if you have changed a resource outside of terraform or you no longer want to manage it with terraform.","s":"make detach","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-detach","p":359},{"i":403,"t":"make state-push This will push the terraform state to specified storage if set. This is useful if you don't want to store the state locally.","s":"make state-push","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-state-push","p":359},{"i":405,"t":"make dry-run This will run a dry-run of the terraform apply command. This is useful if you want to see what terraform will do before actually doing it.","s":"make dry-run","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-dry-run","p":359},{"i":407,"t":"make show This will show the terraform state. This is useful if you want to see what terraform is managing.","s":"make show","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-show","p":359},{"i":409,"t":"make list This will list all the resources managed by terraform. This is useful if you want to see what terraform is managing.","s":"make list","u":"/docs/container/components/k8s-cluster-api-provider/doc/make-reference","h":"#make-list","p":359},{"i":412,"t":"As of R5, our tests cover 1.24.latest ... 1.27.latest. All of them pass the sonobuoy CNCF conformance tests.","s":"Supported k8s versions","u":"/docs/container/components/k8s-cluster-api-provider/doc/configuration","h":"#supported-k8s-versions","p":410},{"i":414,"t":"The provenance capo means that this setting comes from the templates used by the cluster-api-provider-openstack, while SCS denotes that this setting has been added by the SCS project.","s":"Overview over the parameters in clusterctl.yaml and environment-XXX.tfvars","u":"/docs/container/components/k8s-cluster-api-provider/doc/configuration","h":"#overview-over-the-parameters-in-clusterctlyaml-and-environment-xxxtfvars","p":410},{"i":416,"t":"Parameters controlling the Cluster-API management server (capi management server) creation: environment clusterctl.yaml provenance default meaning prefix SCS capi Prefix used for OpenStack resources for the capi mgmt node kind_flavor SCS SCS-2V-4 Flavor to be used for the k8s capi mgmt server image SCS Ubuntu 22.04 Image for the capi mgmt server. Use Ubuntu 22.04 or Debian 12. Check also the ssh_username parameter ssh_username SCS ubuntu Name of the default user for the image clusterapi_version SCS 1.5.3 Version of the cluster-API incl. clusterctl capi_openstack_version SCS 0.8.0 Version of the cluster-api-provider-openstack (needs to fit the CAPI version) cilium_binaries SCS v0.15.7;v0.12.0 Versions of the cilium and hubble CLI in the vA.B.C;vX.Y.Z format","s":"Parameters CAPI management server","u":"/docs/container/components/k8s-cluster-api-provider/doc/configuration","h":"#parameters-capi-management-server","p":410},{"i":418,"t":"Parameters controlling both management server creation and cluster creation: environment clusterctl.yaml provenance default meaning cloud_provider OPENSTACK_CLOUD capo OS_CLOUD name in clouds.yaml external/external_id OPENSTACK_EXTERNAL_NETWORK_ID capo \"\" Name/ID of the external (public) OpenStack network, default \"\" uses the detected external network (for clouds with one external network). Required for clouds with more than one external network dns_nameservers OPENSTACK_DNS_NAMESERVERS capo [ \"5.1.66.255\", \"185.150.99.255\" ] Array of nameservers for capi mgmt server and for cluster nodes, replace the FF MUC defaults with local servers if available availability_zone OPENSTACK_FAILURE_DOMAIN capo Availability Zone(s) for the mgmt node / workload clusters kind_mtu MTU_VALUE SCS 0 MTU for the mgmt server; Calico is set 50 bytes smaller; 0 means autodetection restrict_mgmt_server SCS [\"0.0.0.0/0\"] Allows restricting access to the management server by the given list of CIDRs. Empty value (default) means public. http_proxy SCS Global setting for HTTP Proxy is set on the management host including all cluster-api components running in the bootstrap-cluster. Specify with protocol: e.g \"http://10.10.10.10:3128\" no_proxy SCS Global setting for HTTP Proxy exception list. If http_proxy is not set this setting has no effect. If http_proxy is set, the default value for the NO_PROXY environment variable on all affected components is set to .svc,.svc.cluster,.svc.cluster.local,127.0.0.0/8,169.254.169.254/32,fd00:ec2::254/128,${var.node_cidr},${var.pod_cidr},${var.service_cidr}. The content of no_proxy is appended to this list. This setting has no effect on apt and snap commands, the way http_proxy is set for apt and snap does not allow the configuration of proxy exceptions.","s":"Common parameters management server and clusters","u":"/docs/container/components/k8s-cluster-api-provider/doc/configuration","h":"#common-parameters-management-server-and-clusters","p":410},{"i":420,"t":"Parameters controlling the cluster creation: environment clusterctl.yaml provenance default meaning node_cidr NODE_CIDR SCS 10.8.0.0/20 IPv4 address range (CIDR notation) for workload nodes pod_cidr POD_CIDR SCS 192.168.0.0/16 IPv4 address range (CIDR notation) for pods service_cidr SERVICE_CIDR SCS 10.96.0.0/12 IPv4 address range (CIDR notation) for services use_cilium USE_CILIUM SCS true Use cilium as CNI instead of calico, it can be set to vX.Y.Z and true results in v1.14.1, also see cilium_binaries calico_version CALICO_VERSION SCS v3.26.4 Version of the Calico CNI provider (ignored if use_cilium is set) kubernetes_version KUBERNETES_VERSION capo v1.27.x Kubernetes version deployed into workload cluster (.x means latest patch release) `` OPENSTACK_IMAGE_NAME capo ubuntu-capi-image-${KUBERNETES_VERION} Image name for k8s controller and worker nodes. Ubuntu 22.04 image is used for k8s versions >= 1.27.3, 1.26.6, 1.25.11, Ubuntu 20.04 otherwise. kube_image_raw OPENSTACK_IMAGE_RAW SCS true Register images in raw format (instead of qcow2), good for ceph COW image_registration_extra_flags OPENSTACK_IMAGE_REGISTATION_EXTRA_FLAGS SCS \"\" Extra flags passed during image registration `` OPENSTACK_CONTROL_PLANE_IP capo 127.0.0.1 Use localhost to talk to capi cluster (don't change this!) `` OPENSTACK_SSH_KEY_NAME capo ${prefix}-keypair SSH key name generated and used to connect to workload cluster nodes controller_flavor OPENSTACK_CONTROL_PLANE_MACHINE_FLAVOR capo SCS-2V-4-20s Flavor to be used for control plane nodes worker_flavor OPENSTACK_NODE_MACHINE_FLAVOR capo SCS-2V-4-20s Flavor to be used for worker nodes controller_count CONTROL_PLANE_MACHINE_COUNT capo 1 Number of control plane nodes in testcluster (0 skips testcluster creation) `` CONTROL_PLANE_MACHINE_GEN SCS genc01 Suffix for control plane node resources, to be changed for rolling upgrades worker_count WORKER_MACHINE_COUNT capo 3 Number of worker nodes in testcluster `` WORKER_MACHINE_GEN SCS genw01 Suffix for worker node resources, to be changed for rolling upgrades `` CONTROL_PLANE_ROOT_DISKSIZE SCS 20 If diskless flavors are used for control plane nodes, this is the allocated root volume disk size (in GB) `` WORKER_ROOT_DISKSIZE SCS 20 If diskless flavors are used for worker nodes, this is the allocated root volume disk size (in GB) anti_affinity OPENSTACK_ANTI_AFFINITY SCS true Use anti-affinity server groups to prevent k8s nodes on same host (soft for workers, hard for controllers) `` OPENSTACK_SRVGRP_CONTROLLER SCS nonono Autogenerated if anti_affinity is true, eliminated otherwise `` OPENSTACK_SRVGRP_WORKER SCS nonono Autogenerated if anti_affinity is true, eliminated otherwise deploy_occm DEPLOY_OCCM SCS true Deploy the given version of OCCM into the cluster. true (default) chooses the latest version matching the k8s version. You can specify master to chose the upstream master branch. Don't disable this. deploy_cindercsi DEPLOY_CINDERCSI SCS true Deploy the given (or latest matching for the default true value) of cinder CSI. etcd_unsafe_fs ETCD_UNSAFE_FS SCS false Use barrier=0 for filesystem on control nodes to avoid storage latency. Use for multi-controller clusters on slow/networked storage, otherwise not recommended. testcluster_name (cmd line) SCS testcluster Allows setting the default cluster name, created at bootstrap (if controller_count is larger than 0) restrict_kubeapi RESTRICT_KUBEAPI SCS [ ] Allows restricting access to kubernetes API by list of CIDRs. Empty list (default) means public, [ \"none\" ] means internal access only. capo_instance_create_timeout CLUSTER_API_OPENSTACK_INSTANCE_CREATE_TIMEOUT capo 5 Time to wait for an OpenStack machine to be created (in minutes) containerd_registry_files SCS {\"hosts\":[\"./files/containerd/docker.io\"], \"certs\":[]} Containerd registry hosts config files, see related docs for details. Optional services deployed to cluster: environment clusterctl.yaml provenance default script meaning deploy_metrics DEPLOY_METRICS SCS true apply_metrics.sh Deploy metrics service to nodes to make kubectl top work deploy_nginx_ingress DEPLOY_NGINX_INGRESS SCS true apply_nginx_ingress.sh Deploy NGINX ingress controller (this spawns an OpenStack Loadbalancer), pass version to explicitly choose the version, true results in v1.8.1 (supported k8s >= 1.24) `` NGINX_INGRESS_PROXY SCS true (dito) Configure LB and nginx to get real IP via PROXY protocol; trouble for pod to LB connections has been resolved by setting hostname use_ovn_lb_provider USE_OVN_LB_PROVIDER SCS false apply_nginx_ingress.sh Clouds using OVN networking can deploy the OVN provider that has low overhead (L3) and makes real client IPs visible without proxy protocol hacks. Set to auto to enable; not yet ready for prime time, thus defaults to false. deploy_gateway_api DEPLOY_GATEWAY_API SCS false create_cluster.sh Deploy Gateway APIs CRDs and enable ciliums Gateway API implementation. This only works in conjunction with USE_CILIUM=true. Also this will break at least one CNCF conformance test. This feature is considered a tech-review. Keep in mind that Gateway API itself is under development and not GA. Also note that ciliums implementation of Gateway API is considered \"beta\". deploy_cert_manager DEPLOY_CERT_MANAGER SCS false apply_cert_manager.sh Deploy cert-manager, pass version (e.g. v1.12.4) to explicitly choose a version deploy_flux DEPLOY_FLUX SCS false create_cluster.sh Deploy flux2 into the cluster deploy_harbor SCS false deploy_harbor.sh Deploy harbor into the cluster. When enabled, it will overwrite the settings above. Harbor forces deployment of flux and based on config, it can force deployment of other dependencies (cert-manager, ingress-nginx and Cinder CSI) harbor_config SCS {domain_name:\"\", issuer_email:\"\", persistence:false, database_size:\"1Gi\", redis_size:\"1Gi\", trivy_size:\"5Gi\"} (dito) Harbor container registry configuration options, see related docs for details.","s":"Parameters clusters","u":"/docs/container/components/k8s-cluster-api-provider/doc/configuration","h":"#parameters-clusters","p":410},{"i":422,"t":"Creating and scaling k8s clusters on demand is providing a lot of flexibility to DevOps teams that develop, test, deploy and operate services and applications. We expect the functionality to be mainly consumed in two scenarios: Self-service: The DevOps team leverages the code provided from this repository to create their own capi management server and use it then to manage a number of k8s clusters for their own needs. Managed k8s: The Operator's service team creates the capi management server and uses it to provide managed k8s clusters for their clients. Note that we have an intermediate model in mind -- a model where a one-click / one-API call interface would allow the management server to be created on behalf of a user and then serve as an API endpoint to that user's k8s CAPI needs. Ideally with some dashboard or GUI that would shield less experienced users from all the YAML. Once we as the SCS Community have the gitops style cluster control working, the self-service model will become more convenient to use. The provided solution covers the following two main topics: Automation (terraform, Makefile) to bootstrap a cluster-API management server by installing kind on a vanilla Ubuntu image and deploying some tools on this node (kubectl, openstack CLI tools, k9s, cilium, calico, helm, flux ...) and deploying cluster-API (clusterctl) and the OpenStack cluster-api provider along with suitable credentials. The terraform automation is driven by a Makefile for convenience. The tooling also contains all the logic to clean up again. The newly deployed node clones this git repository early in the bootstrap process and uses the thus received files to set up the management cluster and scripts. This node can be connected to via ssh and the deployed scripts there can be used to manage workload clusters and then deploy various standardized tools (such as e.g. OpenStack Cloud Controller Manager(OCCM), cinder CSI, calico or cilium CNI, nginx ingress controller, cert-manager, ...) and run tests (e.g. CNCF conformance with sonobuoy). The tools and artifacts can be updated via git pull at any time and the updated settings rolled out to the workload clusters. Note that the script collection will eventually be superseded by the capi-helm-charts. The medium-term goal is to actually create a reconciliation loop here that would perform life-cycle-management for clusters according to the cluster configuration stored in an enhanced cluster-api style clusterctl.yaml from git repositories and thus allow a pure gitops style cluster management without ever ssh'ing to the management server.","s":"Overview","u":"/docs/container/components/k8s-cluster-api-provider/doc/overview","h":"","p":421},{"i":424,"t":"Cluster API requires an existing Kubernetes cluster to operate. In our setup, we utilize kind a tool for running Kubernetes clusters using Docker containers, to create the initial management Kubernetes cluster in a single docker container. The OpenStack instance serves as the CAPI management server or management cluster, responsible for overseeing the management and operation of the created kubernetes clusters. The provisioning of the CAPI management server is done on a deployment host, possibly a tiny jumphost style VM, or some Linux/MacOS/WSL laptop. Requirements for the deployment host: You need to have installed: Terraform (https://learn.hashicorp.com/tutorials/terraform/install-cli). yq (python3-yq or yq snap) GNU make openstack (python3-openstackclient) and plugin for octavia (python3-octaviaclient) Via pip or your distribution. Needed only in case you want to clean the management server or interact with openstack directly. You must have credentials to access the cloud. Terraform will look for clouds.yaml and optionally secure.yaml in the current working directory (terraform), in ~/.config/openstack/ or /etc/openstack (in this order), just like the openstack client. The API endpoints of the OpenStack cloud should have a certificate signed by a trusted CA. (Self-signed or custom CAs need significant manual work -- this will be improved after R4.) An Environment file for the cloud you want to use. See Environments below for more details.","s":"Requirements","u":"/docs/container/components/k8s-cluster-api-provider/doc/requirements","h":"","p":423},{"i":426,"t":"To use a specific environment, you have to set the ENVIRONMENT variable (export ENVIRONMENT=) or pass it to the make command by using make ENVIRONMENT=. You can also do the same by utilizing the OS_CLOUD (openstack native) variable. The name of the environment is derived from the name of the file environments/environment-.tfvars. The name of the environment specified either via ENVIRONMENT or OS_CLOUD has to be equal the name of the cloud (cloud_provider) as specified in your clouds.yaml. In case you use plusserver community environment or wavestack environment you can use the default environment file for those directly or base your configuration on it. In case you need custom configuration see Custom environment. More information about the configuration options can be found in the configuration documentation.","s":"Environments","u":"/docs/container/components/k8s-cluster-api-provider/doc/requirements","h":"#environments","p":423},{"i":428,"t":"Using it directly: export ENVIRONMENT=gx-scs or insert inside of Makefile: ENVIRONMENT=gx-scs File: environments/environment-gx-scs.tfvars The name of the cloud has to be gx-scs in the cloud.yaml file, otherwise you will need to change the cloud_provider variable inside of terraform/environments/environment-gx-scs.tfvars file.","s":"Plusserver community environment","u":"/docs/container/components/k8s-cluster-api-provider/doc/requirements","h":"#plusserver-community-environment","p":423},{"i":430,"t":"Using it directly: export ENVIRONMENT=gx-wavestack or insert inside of Makefile: ENVIRONMENT=gx-wavestack File: environments/environment-gx-wavestack.tfvars The name of the cloud has to be gx-wavestack in the cloud.yaml file, otherwise you will need to change the cloud_provider variable inside of terraform/environments/environment-gx-scs.tfvars file.","s":"Wavestack environment","u":"/docs/container/components/k8s-cluster-api-provider/doc/requirements","h":"#wavestack-environment","p":423},{"i":432,"t":"You can create your own environment file from the sample file environments/environment-default.tfvars and provide the necessary information like machine flavor or machine image. You can comment out all lines where the defaults match your needs.","s":"Custom environment","u":"/docs/container/components/k8s-cluster-api-provider/doc/requirements","h":"#custom-environment","p":423},{"i":434,"t":"This guide shows you how to get working Kubernetes clusters on a SCS cloud via cluster-api(CAPI).","s":"Quickstart","u":"/docs/container/components/k8s-cluster-api-provider/doc/quickstart","h":"","p":433},{"i":436,"t":"make kubectl terraform yq v2 or v4 (see note below) python3-openstackclient, python3-octaviaclient","s":"Requirements","u":"/docs/container/components/k8s-cluster-api-provider/doc/quickstart","h":"#requirements","p":433},{"i":438,"t":"You need access to an OpenStack project. Copy the default environment and adjust the options according to your cloud. cp terraform/environments/environment-{default,}.tfvars Edit terraform/environments/environment-.tfvars with your favourite text editor. Every option without a default value must be set. Add a clouds.yaml inside the terraform dir, in ~/.config/openstack or /etc/openstack. It is recommended to set the name of the cloud in the clouds.yml to the same value as the cloud_provider in the environment-.tfvars, then you only have to specify the ENVIRONMENT or OS_CLOUD variable.","s":"Prepare the environment","u":"/docs/container/components/k8s-cluster-api-provider/doc/quickstart","h":"#prepare-the-environment","p":433},{"i":440,"t":"# Set the ENVIRONMENT to the name specified in the name of the file # `cloud_provider` option has to be set in the environment file # to the name of the cloud in the clouds.yaml export ENVIRONMENT=` # Create your environment. This includes a management node as virtual machine # in your OpenStack environment as well as a Kubernetes testcluster. make create # Get the kubeconfig of the testcluster make get-kubeconfig # Interact with the testcluster kubectl --kubeconfig testcluster.yaml. get nodes","s":"Create a test cluster","u":"/docs/container/components/k8s-cluster-api-provider/doc/quickstart","h":"#create-a-test-cluster","p":433},{"i":442,"t":"make clean If make clean fails to clean up completely, you can also use the fullclean target. Review the Teardown section of the Makefile reference document for more details.","s":"Teardown","u":"/docs/container/components/k8s-cluster-api-provider/doc/quickstart","h":"#teardown","p":433},{"i":444,"t":"This guide assumes you just create one test cluster directly when creating the management server. In a production setting, you would not use this test cluster but create clusters via the management server. You can read more about this in the usage guide.","s":"Beyond quickstart","u":"/docs/container/components/k8s-cluster-api-provider/doc/quickstart","h":"#beyond-quickstart","p":433},{"i":447,"t":"On the management server, we have not only helm installed, but also the repository https://github.com/stackhpc/capi-helm-charts checked out. Amongst other things, it automates the creation of new machine templates when needed and doing rolling updates on your k8s cluster with clusterctl. This allows for an easy adaptation of your cluster to different requirements, new k8s versions etc. Please note that this is currently evolving quickly and we have not completely assessed and tested the capabilities. We intend to do this after R2 and eventually recommend this as the standard way of managing clusters in production. At this point, it's included as a technical preview.","s":"Advanced cluster templating with helm (Technical Preview)","u":"/docs/container/components/k8s-cluster-api-provider/doc/roadmap","h":"#advanced-cluster-templating-with-helm-technical-preview","p":445},{"i":449,"t":"The subsequent management of the cluster can best be done from the management server VM, as it has all the tools deployed there and config files can be edited and resubmitted to the kubernetes kind cluster for reconciliation. To log in to this management server via ssh, you can issue make ssh. You can create and do life cycle management for many more clusters from this management server. The kubeconfig with admin power for the created testcluster is named testcluster/testcluster.yaml ( or $CLUSTER_NAME/$CLUSTER_NAME.yaml for all the other clusters) and can be handed out to users that should get full administrative control over the cluster. You can also retrieve them using make get-kubeconfig TESTCLUSTER=${CLUSTER_NAME} from the machines where you created the management server from, and possibly create an encrypted .zip file for handing these out. (You can omit TESTCLUSTER=... for the default testcluster.)","s":"Usage","u":"/docs/container/components/k8s-cluster-api-provider/doc/usage/","h":"","p":448},{"i":451,"t":"This document explains the steps to upgrade the SCS Kubernetes cluster-API based cluster management solution as follows: from the R2 (2022-03) to the R3 (2022-09) state from the R3 (2022-09) to the R4 state from the R4 (2023-09) to the R5 state The document explains how the management cluster and the workload clusters can be upgraded without disruption. It is highly recommended to do a step-by-step upgrade across major releases i.e. upgrade from R2 to R3 and then to R4 in the case of upgrade from the R2 to the R4. Upgrades across major releases without step-by-step process is not recommended and could lead to undocumented issues. The various steps are not very complicated, but there are numerous steps to take, and it is advisable that cluster operators get some experience with this kind of cluster management before applying this to customer clusters that carry important workloads. Note that while the detailed steps are tested and targeted to a R2 -> R3 move, R3 -> R4 move or R4 -> R5 move, many of the steps are a generic approach that will apply also for other upgrades, so expect a lot of similar steps when moving beyond R5. Upgrades from cluster management prior to R2 is difficult; many changes before R2 assumed that you would redeploy the management cluster. Redeploying the management cluster can of course always be done, but it's typically disruptive to your workload clusters, unless you move your cluster management state into a new management cluster with clusterctl move.","s":"SCS k8s-cluster-api-provider upgrade guide","u":"/docs/container/components/k8s-cluster-api-provider/doc/Upgrade-Guide","h":"#scs-k8s-cluster-api-provider-upgrade-guide","p":450},{"i":453,"t":"When you initially deployed the SCS k8s-cluster-api-provider, you create a VM with a kind cluster inside and a number of templates, scripts and binaries that are then used to do the cluster management. This is your management host (or more precisely you single-host management cluster). Currently, all cluster management including upgrading etc. is done by connecting to this host via ssh and performing commands there. (You don't need root privileges to do cluster management there, the normal ubuntu user rights are sufficient; there are obviously host management tasks such as installing package updates that do require root power and the user has the sudo rights to do so.) When you create the management host, you have the option to create your first workload cluster. This cluster is no different from other workload clusters that you create by calling commands on the management host, so you can manage it there. (The default name of this cluster is typically testcluster, though that can be changed since a while, #264). On the management host, you have the openstack and kubernetes tools installed and configured, so you can nicely manage all aspects of your CaaS setups as well as the underlying IaaS. The kubectl configuration is in ~/.kube/config while you will find the OpenStack configuration in ~/.config/openstack/clouds.yaml. These files are automatically managed; you can add entries to the files though, and they should persist.","s":"Management host (cluster) vs. Workload clusters","u":"/docs/container/components/k8s-cluster-api-provider/doc/Upgrade-Guide","h":"#management-host-cluster-vs-workload-clusters","p":450},{"i":455,"t":"There are two different possibilities to upgrade the management host. You do a component-wise in-place upgrade of it. You deploy a new management host and clusterctl move the resources over to it from the old one. (Note: Config state in ~/CLUSTER_NAME/) TODO: Advice when to do what, risks, limitations","s":"Updating the management host","u":"/docs/container/components/k8s-cluster-api-provider/doc/Upgrade-Guide","h":"#updating-the-management-host","p":450},{"i":457,"t":"Operating system​ You should keep the host up-to-date with respect to normal operating system upgrades, so perform your normal sudo apt-get update && sudo apt-get upgrade. kubectl, kustomize, yq, lxd and a few other tools are installed as snaps, so you may want to upgrade these as well: sudo snap refresh. From R5 sudo apt-get install -y jq is also required as this is used by the diskless flavors feature, #424. Default operating system image was changed from Ubuntu 20.04 to Ubuntu 22.04 in R4. k8s-cluster-api-provider git​ The automation is deployed on the management host by cloning the relevant git repository. into the k8s-cluster-api-provider directory. Note that the checked out branch will be the one that has been used when creating the management host, and you might want to change branches from maintained/v3.x to maintained/v4.x in case of R2 to R3 upgrade, maintained/v5.x for R3 to R4 upgrade, or maintained/v6.x for R4 to R5 upgrade. Use git branch -rl to see available branches in the k8s-cluster-api-provider repository. You can update the scripts and templates by checking out the relevant branch main, maintained/v4.x, maintained/v5.x, or maintained/v6.x and using a git pull to ensure the latest content is retrieved. Once you do that, the cluster-management scripts will be up-to-date. (The ~/bin directory in your search PATH is symlinked to the check-ed out scripts.) Note however that the binaries and used templates are NOT automatically updated. This should not normally result in problems -- when new features are introduced in the management scripts, they ensure to continue to support older templates. Updating cluster-API and openstack cluster-API provider​ To get the latest version of cluster-API, you can download a new clusterctl binary from https://github.com/kubernetes-sigs/cluster-api/releases, make it executable chmod +x clusterctl and install it to /usr/local/bin/, possibly saving the old binary by renaming it. clusterctl version should now display the current version number (v1.3.5 at the time of this writing). You can now issue the command clusterctl upgrade plan and clusterctl will list the components in your (kind) management cluster that can be upgraded. Here's an example output: ubuntu@capi-old-mgmtcluster:~ [0]$ clusterctl upgrade plan Checking cert-manager version... Cert-Manager is already up to date Checking new release availability... Latest release available for the v1beta1 API Version of Cluster API (contract): NAME NAMESPACE TYPE CURRENT VERSION NEXT VERSION bootstrap-kubeadm capi-kubeadm-bootstrap-system BootstrapProvider v1.3.5 v1.5.1 control-plane-kubeadm capi-kubeadm-control-plane-system ControlPlaneProvider v1.3.5 v1.5.1 cluster-api capi-system CoreProvider v1.3.5 v1.5.1 infrastructure-openstack capo-system InfrastructureProvider v0.7.1 v0.7.3 You can now apply the upgrade by executing the following command: clusterctl upgrade apply --contract v1beta1 You can then upgrade the components. You can do them one-by-one or simply do clusterctl upgrade apply --contract v1beta1 New templates​ The cluster-template.yaml template used for the workload clusters is located in ~/k8s-cluster-api-provider/terraform/files/template/ and copied from there into ~/cluster-defaults/. Then workload clusters are created, they will also have a copy of it in ~/${CLUSTER_NAME}/. If you have not changed it manually, you can copy it over the old templates. (Consider backing up the old one though.) The next create_cluster.sh run will then use the new template. Note that create_cluster.sh is idempotent -- it will not perform any changes on the cluster unless you have changed its configuration by tweaking cluster-template.yaml (which you almost never do!) or clusterctl.yaml (which you do often). The other template file that changed -- however, some terraform logic is used to prefill it with values. So you can't copy it from git. R2 to R3​ For going from R2 to R3, there is just one real change that you want to apply: Add the variables CONTROL_PLANE_MACHINE_GEN: genc01 and WORKER_MACHINE_GEN: genw01 to it. If you have copied over the new cluster-template.yaml as described above, then you're done. Otherwise you can use the script update-R2-R3.sh to tweak both clusterctl.yaml and cluster-template.yaml for the relevant cluster. (You can use cluster-defaults to change the templates in ~/cluster-defaults/ which get used when creating new clusters.) R3 to R4​ In the R3 to R4, CALICO_VERSION was moved from .capi-settings to clusterctl.yaml. So before upgrading workload clusters, you must add it also to the ~/${CLUSTER_NAME}/clusterctl.yaml. echo \"CALICO_VERSION: v3.25.0\" >> ~/cluster-defaults/clusterctl.yaml echo \"CALICO_VERSION: v3.25.0\" >> ~/testcluster/clusterctl.yaml In the R3 to R4 upgrade process, cluster-template.yaml changed etcd defrag process in the kubeadm control-planes and also security group names by adding ${PREFIX}- to them, so it has to be changed also in openstack project e.g. (PREFIX=capi): openstack security group set --name capi-allow-ssh allow-ssh openstack security group set --name capi-allow-icmp allow-icmp We changed immutable fields in the Cluster API templates, so before running create_cluster.sh to upgrade existing workload cluster the CONTROL_PLANE_MACHINE_GEN and WORKER_MACHINE_GEN needs to be incremented in cluster specific clusterctl.yaml. In the R3 to R4 process, also cloud.conf added enable-ingress-hostname=true to the LoadBalancer section. It is due to NGINX_INGRESS_PROXY defaulting to true now. So if you want to use, or you are already using this proxy functionality we recommend you to add this line to your cloud.conf, e.g.: echo \"enable-ingress-hostname=true\" >> ~/cluster-defaults/cloud.conf echo \"enable-ingress-hostname=true\" >> ~/testcluster/cloud.conf Then, before upgrading workload cluster by create_cluster.sh, you should delete cloud-config secret in the kube-system namespace, so it can be recreated. E.g.: kubectl delete secret cloud-config -n kube-system --kubeconfig=testcluster/testcluster.yaml Also, the default nginx-ingress version has changed, so we recommend before upgrading cluster to delete ingress-nginx jobs, so new job with new image can be created in the update process. kubectl delete job ingress-nginx-admission-create -n ingress-nginx --kubeconfig=testcluster/testcluster.yaml kubectl delete job ingress-nginx-admission-patch -n ingress-nginx --kubeconfig=testcluster/testcluster.yaml R4 to R5​ In R4 to R5, the cluster-template.yaml and clusterctl.yaml changed (see release notes). You can use script update-R4-to-R5.sh to update the cluster's cluster-template.yaml and clusterctl.yaml from R4 to R5. This script could update an existing Kubernetes cluster configuration files as well as cluster-defaults files that could be used for spawning new R5 clusters. If you want to update an existing cluster configuration files from R4 to R5, just use script as follows: update-R4-to-R5.sh After you executed the above you will find that e.g. Calico version has been bumped from v3.25.0 to v3.26.1. Note that some software versions are not configurable and are not directly mentioned in the cluster configuration files, but they are hardcoded in R5 scripts (e.g. ingress nginx controller, metrics server), see new-defaults section. Note that the Kubernetes version was not updated as well the default CNI is not the Cilium yet. This two R5 features are out of scope this script when it is applied on the existing cluster configuration files as this features require advanced action such as CNI migration and step-by-step Kubernetes upgrade of +2 minor releases. If you want to update cluster-defaults configuration files from R4 to R5, just use script as follows: update-R4-to-R5.sh cluster-defaults The above action updates a cluster-defaults configuration file, which is almost similar to updating an existing cluster configuration file described above. The distinction lies in the fact that both the Kubernetes version and the default CNI are also updated, specifically to Kubernetes version v1.27.5 and Cilium as a default CNI. If you are curious: In R2, doing rolling upgrades of k8s versions required edits in cluster-template.yaml -- this is no longer the case in R3, R4 and R5. Just increase the generation counter for node and control plane nodes if you upgrade k8s versions -- or otherwise change the worker or control plane node specs, such as e.g. using a different flavor. New defaults​ You deploy a CNI (calico or cilium), the OpenStack Cloud Controller Manager (OCCM), the cinder CSI driver to clusters; optionally also a metrics server (default is true), a nginx ingress controller (also defaulting to true), the flux2 controller, the cert-manager. Some of these tools come with binaries that you can use for management purposes and which get installed on the management host in /usr/local/bin/. The scripts that deploy these components into your workload clusters download the manifests into ~/kubernetes-manifests.d/ with a version specific name. If you request a new version, a new download will happen; already existing versions will not be re-downloaded. Most binaries in /usr/local/bin/ are not stored under a version-specific name. You need to rename them to case a re-download of a newer version. (The reason for not having version specific names is that this would break scripts from users that assume the unversioned names; the good news is that most of these binaries have no trouble managing somewhat older deployments, so you can typically work with the latest binary tool even if you have a variety of versions deployed into various clusters.) The defaults have changed as follows: R2 R3 R4 R5 kind v0.14.0 v0.14.0 v0.17.0 v0.20.0 capi v1.0.5 v1.2.2 v1.3.5 v1.5.1 capo v0.5.3 v0.6.3 v0.7.1 v0.7.3 helm v3.8.1 v3.9.4 v3.11.1 v3.12.3 sonobuoy v0.56.2 v0.56.10 v0.56.16 v0.56.17 k9s unversioned unversioned unversioned v0.27.4 calico v3.22.1 v3.24.1 v3.25.0 v3.26.1 calico CLI v3.22.1 v3.24.1 v3.25.0 v3.26.1 cilium unversioned unversioned v1.13.0 v1.14.1 cilium CLI unversioned unversioned v0.13.1 v0.15.7 hubble CLI unversioned unversioned v0.11.2 v0.12.0 nginx-ingress v1.1.2 v1.3.0 v1.6.4 v1.8.1 flux2 unversioned unversioned v0.40.2 v2.1.0 cert-manager v1.7.1 v1.9.1 v1.11.0 v1.12.4 metrics-server v0.6.1 v0.6.1 v0.6.1 v0.6.4","s":"In-place upgrade","u":"/docs/container/components/k8s-cluster-api-provider/doc/Upgrade-Guide","h":"#in-place-upgrade","p":450},{"i":459,"t":"To be written Create new management host in same project -- avoid name conflicts with different prefix, to be tweaked later. Avoid testcluster creation Ensure it's up and running ... Tweak prefix Copy over configs (and a bit of state though that's uncritical) by using the directories Copy over the openstack credentials clouds.yaml and the kubectl config clusterctl move","s":"The clusterctl move approach","u":"/docs/container/components/k8s-cluster-api-provider/doc/Upgrade-Guide","h":"#the-clusterctl-move-approach","p":450},{"i":462,"t":"On R2 clusters​ The old way: Editing cluster-template.yaml. Or better use the update-R2-to-R3.sh script to convert first. On R3 and R4 clusters​ Edit ~//clusterctl.yaml and put the wanted version into the fields KUBERNETES_VERSION and OPENSTACK_IMAGE_NAME. The node image will be downloaded from https://minio.services.osism.tech/openstack-k8s-capi-images and registered if needed. (If you have updated the k8s-cluster-api-provider repo, you can use a version v1.NN.x, where you fill in NN with the wanted k8s version, but leave a literal .x which will get translated to the newest tested version.) In the same file, increase the generation counters for CONTROL_PLANE_MACHINE_GEN and WORKER_MACHINE_GEN. Now do the normal create_cluster.sh and watch cluster-api replace your worker nodes and doing a rolling upgrade of your control plane. If you used a 3-node (or 5 or higher) control plane node setup, you will have uninterrupted access not just to your workloads but also the workload's cluster control plane. Use clusterctl describe cluster or simply kubectl --context -admin@ get nodes -o wide to watch the progress of this. On R5 clusters​ If you decide to migrate your existing Kubernetes cluster from R4 to R5 be aware of the following: R5 features such as per cluster namespaces and Cilium as a default CNI are supported only on new clusters and will not be migrated on the existing clusters R4 default Kubernetes version v1.25.6 can not be directly migrated to the R5 default Kubernetes version v1.27.5, because +2 minor Kubernetes version upgrade is not allowed. See further migration steps below if you want to upgrade also Kubernetes version to R5 Follow the below steps if you want to migrate an existing cluster from R4 to R5: Access your management node Checkout R5 tag cd k8s-cluster-api-provider git pull git checkout tags/v6.0.0 Backup an existing cluster configuration files (recommended) cd .. cp -R -backup Update an existing cluster configuration files from R4 to R5: update-R4-to-R5.sh Validate updated cluster configuration files. You will find that e.g. Calico version has been bumped from v3.25.0 to v3.26.1. Note that some software versions are not configurable and are not directly mentioned in the cluster configuration files, but they are hardcoded in R5 scripts (e.g. ingress nginx controller, metrics server). Hence, read carefully the R5 release notes too. Also see that Kubernetes version was not updated, and it is still v1.25.6. Update an existing cluster (expect Kubernetes version) create_cluster.sh Update cluster-API and openstack cluster-API provider, see related section for details clusterctl upgrade plan clusterctl upgrade apply --contract v1beta1 Bump Kubernetes version +1 minor release (to v1.26.8) and increase the generation counter for node and control plane nodes sed -i 's/^KUBERNETES_VERSION: v1.25.6/KUBERNETES_VERSION: v1.26.8/' /clusterctl.yaml sed -i 's/^OPENSTACK_IMAGE_NAME: ubuntu-capi-image-v1.25.6/OPENSTACK_IMAGE_NAME: ubuntu-capi-image-v1.26.8/' /clusterctl.yaml sed -r 's/(^CONTROL_PLANE_MACHINE_GEN: genc)([0-9][0-9])/printf \"\\1%02d\" $((\\2+1))/ge' -i /clusterctl.yaml sed -r 's/(^WORKER_MACHINE_GEN: genw)([0-9][0-9])/printf \"\\1%02d\" $((\\2+1))/ge' -i /clusterctl.yaml Update an existing cluster Kubernetes version to v1.26.8 create_cluster.sh Bump Kubernetes version to R5 v1.27.5 and increase the generation counter for node and control plane nodes sed -i 's/^KUBERNETES_VERSION: v1.26.8/KUBERNETES_VERSION: v1.27.5/' /clusterctl.yaml sed -i 's/^OPENSTACK_IMAGE_NAME: ubuntu-capi-image-v1.26.8 /OPENSTACK_IMAGE_NAME: ubuntu-capi-image-v1.27.5/' /clusterctl.yaml sed -r 's/(^CONTROL_PLANE_MACHINE_GEN: genc)([0-9][0-9])/printf \"\\1%02d\" $((\\2+1))/ge' -i /clusterctl.yaml sed -r 's/(^WORKER_MACHINE_GEN: genw)([0-9][0-9])/printf \"\\1%02d\" $((\\2+1))/ge' -i /clusterctl.yaml Update an existing cluster to the R5 Kubernetes version v1.27.5 create_cluster.sh ","s":"k8s version upgrade","u":"/docs/container/components/k8s-cluster-api-provider/doc/Upgrade-Guide","h":"#k8s-version-upgrade","p":450},{"i":464,"t":"OCCM, CNI (calico/cilium), CSI","s":"New versions for mandatory components","u":"/docs/container/components/k8s-cluster-api-provider/doc/Upgrade-Guide","h":"#new-versions-for-mandatory-components","p":450},{"i":466,"t":"nginx, metrics (nothing to do), cert-manager, flux","s":"New versions for optional components","u":"/docs/container/components/k8s-cluster-api-provider/doc/Upgrade-Guide","h":"#new-versions-for-optional-components","p":450},{"i":468,"t":"While testing clusters with >= 3 control nodes, we have observed occasional transient error messages that reported an etcd leader change preventing a command from succeeding. This could result in a dozen of random failed tests in a sonobuoy conformance run. (Retrying the commands would let them succeed.) Too frequent etcd leader changes are detrimental to your control plane performance and can lead to transient failures. They are a sign that the infrastructure supporting your cluster is introducing too high latencies. We recommend to deploy the control nodes (which run etcd) on instances with local SSD storage (which we reflect in the default flavor name) and recommend using flavors with dedicated cores and that your network does not introduce latencies by significant packet drop. We now always use slower heartbeat (250ms) and increase CPU and IO priority which used to be controlled by ETCD_PRIO_BOOST. This is safe. If you build multi-controller clusters and can not use a flavor with low latency local storage (ideally SSD), you can also work around this with ETCD_UNSAFE_FS. ETCD_UNSAFE_FS is using barrier=0 mount option, which violates filesystem ordering guarantees. This works around storage latencies, but introduces the risk of inconsistent filesystem state and inconsistent etcd data in case of an unclean shutdown. You may be able to live with this risk in a multi-controller etcd setup. If you don't have flavors that fulfill the requirements (low-latency storage attached), your choice is between a single-controller cluster (without ETCD_UNSAFE_FS) and a multi-controller cluster with ETCD_UNSAFE_FS. Neither option is perfect, but we deem the multi-controller cluster preferable in such a scenario.","s":"etcd leader changes","u":"/docs/container/components/k8s-cluster-api-provider/doc/Upgrade-Guide","h":"#etcd-leader-changes","p":450},{"i":470,"t":"You can use make ssh to log in to the capi management server. There you can issueclusterctl and kubectl (aliased to k) commands. The context kind-kind is used for the CAPI management while the context testcluster-admin@testcluster can be used to control the workload cluster testcluster. You can of course create many of them. There are management scripts on the management server: In the user's (ubuntu) home directory, create a subdirectory with the CLUSTERNAME to hold your cluster's configuration data. Copy over the clusterctl.yaml file from ~/cluster-defaults/ and edit it to meet your needs. Note that you can also copy over cloud.conf and cluster-template.yaml and adjust them, but you don't need to. (If you don't create the subdirectory, the create_cluster.sh script will do so for you and use all defaults settings.) create_cluster.sh CLUSTERNAME: Use this command to create a cluster with the settings from ~/$CLUSTERNAME/clusterctl.yaml. More precisely, it uses the template $CLUSTERNAME/cluster-template.yaml and fills in the settings from $CLUSTERNAME/clusterctl.yaml to render a config file $CLUSTERNAME/$CLUSTERNAME-config.yaml which will then be submitted to the capi server (kind-kind context) for creating the control plane nodes and worker nodes. The script will also apply openstack integration, cinder CSI, calico or cilium CNI, and optionally also metrics server, nginx ingress controller, flux, cert-manager. (These can be controlled by DEPLOY_XXX variables, see below. Defaults can be preconfigured from the environment.tfvars file during management server creation.) Note that CLUSTERNAME defaults to testcluster and must not contain whitespace. The script also makes sure that appropriate CAPI images are available (it grabs them from OSISM as needed and registers them with OpenStack, following the SCS image metadata standard). The script returns once the control plane is fully working (the worker nodes might still be under construction). The kubectl file to talk to this cluster (as admin) can be found in ~/$CLUSTERNAME/$CLUSTERNAME.yaml. Expect the cluster creation to take ~8mins. (CLUSTERNAME defaults to testcluster.) You can pass --context=${CLUSTERNAME}-admin@$CLUSTERNAME to kubectl (with the default ~/.kubernetes/config config file) or export KUBECONFIG=$CLUSTERNAME.yaml\\ to talk to the workload cluster. The subdirectory ~/$CLUSTERNAME/deployed-manifests.d/ will contain the deployed manifests for reference (and in case of nginx-ingress also to facilitate a full cleanup). The clusterctl.yaml file can be edited the create_cluster.sh script be called again to submit the changes. (If you have not done any changes, re-running the script again is harmless.) Note that the create_cluster.sh does not currently remove any of the previously deployed services/deployments from the workload clusters -- this will be added later on with the appropriate care and warnings. Also note that not all changes are allowed. You can easily change the number of nodes or add k8s services to a cluster. For changing machine flavors, machine images, kubernetes versions ... you will need to also increase the CONTROL_PLANE_MACHINE_GEN or the WORKER_MACHINE_GEN counter to add a different suffix to these read-only resources. This will cause Cluster-API to orchestrate a rolling upgrade for you on rollout. (This is solved more elegantly in the helm chart style cluster management, see below.) The directory ~/k8s-cluster-api-provider/ contains a checked out git tree from the SCS project. It can be updated (git pull) to receive the latest fixes and improvements. This way, most incremental updates do not need the recreation of the management server (and thus also not the recreation of your managed workload clusters), but can be applied with calling create_cluster.sh again to the workload clusters. The installation of the openstack integration, cinder CSI, metrics server and nginx ingress controller is done via the bin/apply_*.sh scripts that are called from create_cluster.sh. You can manually call them as well -- they take the cluster name as argument. (It's better to just call create_cluster.sh again, though.) The applied yaml files are collected in ~/$CLUSTERNAME/deployed-manifests.d/. You can kubectl delete -f them to remove the functionality again. You can, of course, also delete the cluster and create a new one if that level of disruption is fine for you. (See below in Advanced cluster templating with helm to get an idea how we want to make this more convenient in the future.) Use kubectl get clusters -A in the kind-kind context to see what clusters exist. Use kubectl get all -A in the testcluster-admin@testcluster context to get an overview over the state of your workload cluster. You can access the logs from the capo controller in case you have trouble with cluster creation. delete_cluster.sh [CLUSTERNAME]: Tell the capi management server to remove the cluster $CLUSTERNAME. It will also remove persistent volume claims belonging to the cluster. The script will return once the removal is done. cleanup.sh: Remove all running clusters. add_cluster-network.sh CLUSTERNAME adds the management server to the node network of the cluster CLUSTERNAME, assuming that it runs on the same cloud (a region). remove_cluster-network.sh undoes this again. This is useful for debugging purposes. For your convenience, k9s is installed on the management server as well as calicoctl, cilium, hubble, cmctl, helm and sonobuoy. These binaries can all be found in /usr/local/bin while the helper scripts have been deployed to ~/bin/.","s":"Cluster Management on the capi management node","u":"/docs/container/components/k8s-cluster-api-provider/doc/usage/cluster-mgmt-capi-mgmt-node","h":"","p":469},{"i":472,"t":"Containerd as container runtime interface (CRI) used in the reference SCS KaaS implementation allows configuring its behavior when it interacts with public or private container registry hosts. Container registry hosts configuration options in containerd are well described in related docs. This feature could be useful in various uses cases, e.g.: Configure containerd to use a custom CA certificate when it interacts with a container registry host that uses this CA Configure containerd to use some container registry mirror host instead of the target public or private container registry. This could be useful when the target container registry somehow restricts its clients e.g. DockerHub's pull rate limit to 100 pulls per 6 hours per IP address SCS KaaS reference implementation allows users to pass container registry host config files to configure containerd. Containerd configuration is applied cluster wide as it is CRI used in SCS KaaS clusters. Additional registry host config files for containerd could be passed through the containerd_registry_files terraform variable. This variable expects an object with two attributes: hosts attribute defines additional registry host config files for containerd. The filename should reference the registry host namespace. Files defined in this set will be copied into the /etc/containerd/certs.d directory on each workload cluster node certs attribute defines additional client and/or CA certificate files needed for containerd authentication against registries defined by hosts. Files defined in this set will be copied into the /etc/containerd/certs directory on each workload cluster node The default value of the containerd_registry_files variable instructs containerd to use registry.scs.community container registry instance as a public mirror of DockerHub container registry, see related issue #417. The host config file used as a default is defined here. This should prevent issues with pull rate limiting from DockerHub public container registry, e.g. #414. The above default value could be overridden using any techniques that Terraform allows, e.g. via environment variable: export TF_VAR_containerd_registry_files='{\"hosts\":[\"\"], \"certs\":[\"\"]}' SCS container registry reference installation https://registry.scs.community contains several pre-configured \"proxy-cache\" projects. These projects allow you to use SCS container registry reference installation to proxy and cache images from target public registries. This may reduce the load of overused public container registries and/or helps to avoid rate limiting by individual public registries. Currently, SCS container registry is set up to \"proxy-cache\" the following public container registries: docker.io ghcr.io quay.io registry.gitlab.com registry.k8s.io Find also a corresponding containerd registry host config files in ./terraform/files/containerd directory. If you want to configure containerd to use mentioned pre-configured SCS container registry \"proxy cache\" projects, feel free to do that e.g. as follows (path is relative to the terraform directory): export TF_VAR_containerd_registry_files='{\"hosts\":[\"./files/containerd/docker.io\", \"./files/containerd/ghcr.io\", \"./files/containerd/quay.io\", \"./files/containerd/registry.gitlab.com\", \"./files/containerd/registry.k8s.io\" ]}' If you did not find your preferred public container registry in the list of pre-configured SCS container registry \"proxy cache\" projects, and you would like to use the SCS container registry as a mirror for it, please open an issue in one of the following repositories: scs/k8s-cluster-api-provider, scs/k8s-harbor.","s":"Container registry configuration","u":"/docs/container/components/k8s-cluster-api-provider/doc/usage/containter-registry-configuration","h":"","p":471},{"i":474,"t":"This tutorial is experimental and out of the usual release cycle. We recommend to upgrade existing environments (workload clusters) with stable releases which are properly tested. This tutorial instructs (advanced) users what needs to be done on the cluster management instance without re-deploying it via Terraform. Patches described in this tutorial modify existing environment with changes that have been developed within \"containerd registry\"-related PRs: PR#432 PR#447 PR#472 Warning: This tutorial causes a rolling update (rolling re-deployment) of the control plane and worker nodes. Log in to the cluster management instance, pull remote changes, and then checkout to relevant commit that includes all mentioned PRs. cd k8s-cluster-api-provider/ git pull git checkout b31a79db26c3956b473f026038e71e9aba7819b8 Backup the config directory of an existing cluster. cd .. cp -R .bkp Ensure that the directory for containerd registry configs exists and create a default containerd registry config file that instructs containerd to use registry.scs.community container registry instance as a public mirror of DockerHub. Optionally, create another containerd container registry host file in the containerd/hosts directory. You can find working examples of those files here. cd mkdir -p containerd/hosts cat >containerd/hosts/docker.io < Inject containerd configuration in cluster-template.yaml. This configuration allows containerd to discover registry host file(s). Create containerd_conf_append temp file cat >containerd_conf_append <> /etc/containerd/config.toml [plugins.\"io.containerd.grpc.v1.cri\".registry] config_path = \"/etc/containerd/certs.d\" EOT EOF Inject temp file and systemctl restart containerd.service line into the cluster-template.yaml (inplace) yq 'select(.kind == \"KubeadmControlPlane\").spec.kubeadmConfigSpec.preKubeadmCommands |= ( (.[] | select(. == \"apt-get install -y ca-certificates socat*\") | key + 1) as $pos | .[:$pos] + [load_str(\"containerd_conf_append\")] + .[$pos:])' -i cluster-template.yaml yq 'select(.kind == \"KubeadmControlPlane\").spec.kubeadmConfigSpec.preKubeadmCommands |= ( (.[] | select(. == \"systemctl daemon-reload\") | key + 1) as $pos | .[:$pos] + [\"systemctl restart containerd.service\"] + .[$pos:])' -i cluster-template.yaml yq 'select(.kind == \"KubeadmConfigTemplate\").spec.template.spec.preKubeadmCommands |= ( (.[] | select(. == \"apt-get install -y ca-certificates socat*\") | key + 1) as $pos | .[:$pos] + [load_str(\"containerd_conf_append\")] + .[$pos:])' -i cluster-template.yaml yq 'select(.kind == \"KubeadmConfigTemplate\").spec.template.spec.preKubeadmCommands |= ( (.[] | select(. == \"systemctl daemon-reload\") | key + 1) as $pos | .[:$pos] + [\"systemctl restart containerd.service\"] + .[$pos:])' -i cluster-template.yaml The above changes (when point 8. will be applied) of KubeadmControlPlane will cause a rolling update of control plane nodes. As the KubeadmConfigTemplate has been adjusted we need to increase the generation counter of worker machines to ensure that the worker nodes will be rolling updated as well. sed -r 's/(^WORKER_MACHINE_GEN: genw)([0-9][0-9])/printf \"\\1%02d\" $((\\2+1))/ge' -i clusterctl.yaml Workaround: If your environment contains nginx ingress deployed via k8s-cluster-api-provider (variable DEPLOY_NGINX_INGRESS=true) disable its update. Nginx-ingress controller has been updated to version 1.8.0 in PR#440 and later to 1.8.1. This is a breaking change that includes updates of immutable fields. If the above is the case skip this update as follows: sed 's/DEPLOY_NGINX_INGRESS: true/DEPLOY_NGINX_INGRESS: false/g' -i clusterctl.yaml Update the existing cluster. create_cluster.sh test1","s":"Tutorial: configure an existing cluster to use containerd registry configuration","u":"/docs/container/components/k8s-cluster-api-provider/doc/usage/containter-registry-configuration","h":"#tutorial-configure-an-existing-cluster-to-use-containerd-registry-configuration","p":471},{"i":476,"t":"OpenStack provides public-facing API endpoints which protection by SSL/TLS certificates is highly recommended in production environments. These certificates are usually issued by public CA but also the custom or private CA could be used. If the communication with OpenStack API is protected by the certificate issued by custom CA the cacert setting needs to be provided inside clouds.yaml, e.g.: clouds: devstack: cacert: ca-bundle.pem auth: auth_url: https://10.0.3.15/identity project_domain_id: default project_name: demo user_domain_id: default identity_api_version: 3 region_name: RegionOne interface: public Here the file ca-bundle.pem contains custom root CA and potentially intermediate CA(s). The ca-bundle.pem file will be copied to the management server and used by CAPO in the management cluster. Also, it will be copied to the workload cluster (control plane and worker nodes) and mounted and used by OCCM and CCSI pods. So provide only the necessary certificates in that file. Steps of what happens with the custom cacert in k8s-cluster-api-provider: cacert setting is provided inside clouds.yaml Cacert file referenced by cacert key (1.) is copied to the management server directory ~/cluster-defaults/${cloud_provider}-cacert by Terraform During the management server bootstrap process cacert is injected to the ~/cluster-defaults/cluster-template.yaml to KubeadmControlPlane and KubeadmConfigTemplate files as file with cacert content from already defined secret ${CLUSTER_NAME}-cloud-config and will be later templated and copied to the workload cluster (control plane and worker nodes) provisioned by CAPO, e.g.: files: - contentFrom: secret: key: cacert name: ${CLUSTER_NAME}-cloud-config owner: root:root path: /etc/ssl/certs/devstack-cacert permissions: \"0644\" When the creation of the workload cluster (create_cluster.sh) starts, ~/cluster-defaults/cluster-template.yaml is copied into workload cluster directory (~/$CLUSTER_NAME/) Then the cacert file content is base64 encoded and saved in OPENSTACK_CLOUD_CACERT_B64 variable inside ~/$CLUSTER_NAME/clusterctl.yaml, so it can be used during the workload cluster templating Later, when the workload cluster templates are applied to the management cluster, secret ${CLUSTER_NAME}-cloud-config with base64 encoded cacert is created and used by CAPO CAPO will create workload cluster (thanks to steps 5. and 6.) and cacert is transferred to the control plane and worker nodes (thanks to steps 3. and 4.) OCCM and CCSI pods mount cacert via hostPath volume and use it for e.g. creating load balancers or volumes","s":"Custom CA","u":"/docs/container/components/k8s-cluster-api-provider/doc/usage/custom-ca","h":"","p":475},{"i":478,"t":"When the custom CA expires or otherwise changes it needs to be rotated. CAPO uses the custom CA certificate in the management cluster for creating the infrastructure for the workload clusters and in the workload clusters by OCCM and CCSI for e.g. creating load balancers or volumes. In both cases, cacert is provided via secret ${CLUSTER_NAME}-cloud-config and needs to be updated. There are 3 steps in this rotation process: Replace/append custom CA certificate in ~/cluster-defaults/${cloud_provider}-cacert Increase generation counters CONTROL_PLANE_MACHINE_GEN and WORKER_MACHINE_GEN in ~/$CLUSTER_NAME/clusterctl.yaml Run create_cluster.sh $CLUSTER_NAME and wait for the rolling update of your workload cluster In step 1, appending can be useful for avoiding downtime of your services. Your cacert file will contain two CA certificates - old and new. This should help with a smooth transition to a new certificate and later, the old one can be removed. Steps 2 and 3 need to be done per workload cluster. When step 2 is omitted, only cacert secret in the management cluster is updated and no rolling update of the workload cluster in step 3 is started and existing nodes remain with the old certificate.","s":"Rotation","u":"/docs/container/components/k8s-cluster-api-provider/doc/usage/custom-ca","h":"#rotation","p":475},{"i":480,"t":"On the management server (login with make ssh), create a directory (below the home of the standard ubuntu user) with the name of your cluster. Copy over clusterctl.yaml from ~/cluster-defaults/ and edit it according to your needs. You can also copy over other files from ~/cluster-defaults/ and adjust them, but this is only needed in exceptional cases. Now run create_cluster.sh This will copy all missing defaults from ~/cluster-defaults/ into the directory with your cluster name and then ask cluster-api to create the cluster. The scripts also take care of security groups, anti-affinity, node image registration (if needed) and of deploying CCM, CNI, CSI as well as optional services such as metrics or nginx-ingress controller. You can access the new cluster with kubectl --context clustername-admin@cluster or KUBECONFIG=~/clustername/clustername.yaml kubectl. The management cluster is in context kind-kind. Note that you can always change clusterctl.yaml and re-run create_cluster.sh. The script is idempotent and running it multiple times with the unchanged input file will result in no changes to the cluster.","s":"Create a new cluster","u":"/docs/container/components/k8s-cluster-api-provider/doc/usage/create-new-cluster","h":"","p":479},{"i":482,"t":"Starting with R5, this k8s-solution offers experimental kubernetes gateway API support. You need to set deploy_gateway_api to true in your environments configuration. Also you need to use cilium as your CNI (default since R5). After deploying your cluster, you can use gateway API and deploy Gateways and HTTP-Routes. As a starting point you can deploy this example app: kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.11/samples/bookinfo/platform/kube/bookinfo.yaml and this example Gateway and HTTP-Route kubectl apply -f https://raw.githubusercontent.com/cilium/cilium/1.14.1/examples/kubernetes/gateway/basic-http.yaml","s":"Gateway-API","u":"/docs/container/components/k8s-cluster-api-provider/doc/usage/gateway-api","h":"","p":481},{"i":484,"t":"Project k8s-harbor is used for the SCS Harbor container registry deployment https://registry.scs.community/. With this project, it is possible to deploy Harbor in a similar way into the workload cluster. If you want to deploy Harbor, set terraform variable deploy_harbor = true. It will deploy Harbor with default options. The recommended approach is to set up also persistence and ingress with tls. It automatically deploys flux as k8s-harbor requirement. It also expects that the Swift object store is available in the targeting OpenStack project. S3 credentials (openstack ec2 credentials create) are created and saved into ~/$CLUSTER_NAME/deployed-manifests.d/harbor/.ec2. Bucket (openstack container create \"$PREFIX-$CLUSTER_NAME-harbor-registry\") for storing container images is also automatically created in the openstack Swift object store. Warning: Swift container and ec2 credentials are not removed when the workload cluster is deleted.","s":"Harbor","u":"/docs/container/components/k8s-cluster-api-provider/doc/usage/harbor","h":"","p":483},{"i":486,"t":"By default, Harbor will be deployed with these options: harbor_config = { domain_name: \"\", issuer_email: \"\", persistence: false, database_size: \"1Gi\", redis_size: \"1Gi\", trivy_size: \"5Gi\" } These options are templated to the mgmt server and used as environment variables during the creation of the workload cluster: $ cat ~/cluster-defaults/harbor-settings DEPLOY_HARBOR=true HARBOR_DATABASE_SIZE=1Gi HARBOR_DOMAIN_NAME= HARBOR_ISSUER_EMAIL= HARBOR_PERSISTENCE=false HARBOR_REDIS_SIZE=1Gi HARBOR_TRIVY_SIZE=5G When the Harbor is deployed, you can check the status, e.g. by: $ flux get helmrelease -n default NAME REVISION SUSPENDED READY MESSAGE harbor 1.12.4 False True Release reconciliation succeeded or you can simply check if pods are running by kubectl get pods. Harbor components are deployed as deployments and statefulsets: $ kubectl get deploy,sts NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/harbor-core 2/2 2 2 11m deployment.apps/harbor-exporter 1/1 1 1 11m deployment.apps/harbor-jobservice 2/2 2 2 11m deployment.apps/harbor-nginx 1/1 1 1 11m deployment.apps/harbor-portal 2/2 2 2 11m deployment.apps/harbor-registry 2/2 2 2 11m NAME READY AGE statefulset.apps/harbor-database 1/1 11m statefulset.apps/harbor-redis 1/1 11m statefulset.apps/harbor-trivy 2/2 11m Default options deploy Harbor as clusterIP service without pvc persistence for database, redis and trivy. See terraform/files/kubernetes-manifests.d/harbor/envs/clusterIP/ for further details. You can access it via the k8s service harbor, for example, port-forward it and access it at http://localhost:8080: $ kubectl get svc harbor -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR harbor ClusterIP 10.109.57.148 80/TCP 11m app=harbor,component=nginx,release=harbor $ kubectl port-forward svc/harbor 8080:80 Forwarding from 127.0.0.1:8080 -> 8080 Forwarding from [::1]:8080 -> 8080 Admin username is admin and password can be obtained from the secret by: kubectl get secret harbor-secrets -o jsonpath='{.data.values\\.yaml}' | base64 -d | yq .harborAdminPassword","s":"Default deployment","u":"/docs/container/components/k8s-cluster-api-provider/doc/usage/harbor","h":"#default-deployment","p":483},{"i":489,"t":"By default, persistence is set to false. When persistence is set to true, i.e. harbor_config = {persistence: true}, Harbor components (database, redis, trivy) are deployed with PVCs: $ kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE data-harbor-redis-0 Bound pvc-982221c1-64cb-4d3e-a77d-1db5b4429a69 1Gi RWO cinder-default 6m12s data-harbor-trivy-0 Bound pvc-8a2ad60c-c7bf-40e1-8593-0d00b3d40b4f 5Gi RWO cinder-default 6m12s data-harbor-trivy-1 Bound pvc-734f9b6a-9cee-40e4-9e1c-b959d9f7b7cf 5Gi RWO cinder-default 5m11s database-data-harbor-database-0 Bound pvc-c5c3a7e6-a99a-4f16-a5cc-792e9b3665d8 1Gi RWO cinder-default 6m12s The size of PVCs can be configured by harbor_config = {_size: \"size\"}. Trivy has 2 replicas, i.e. 2 PVCs will be created. When persistence is set to true, Cinder CSI is automatically deployed.","s":"Persistence","u":"/docs/container/components/k8s-cluster-api-provider/doc/usage/harbor","h":"#persistence","p":483},{"i":491,"t":"If you want to deploy ingress in front of Harbor and secure it with SSL/TLS certificate, set the domain_name option. Relevant files which will be deployed are located in terraform/files/kubernetes-manifests.d/harbor/envs/ingress/. When domain_name is set, cert-manager and ingress-nginx are automatically deployed. So, instead of default harbor clusterIP service and harbor-nginx deployment, harbor-ingress will be deployed: $ kubectl get ing harbor-ingress NAME CLASS HOSTS ADDRESS PORTS AGE harbor-ingress nginx harbor.example.com 213.131.230.203.nip.io 80, 443 13m There will be also an additional cert-manager issuer letsencrypt deployed: $ kubectl get issuers -o wide NAME READY STATUS AGE letsencrypt True The ACME account was registered with the ACME server 13m This ACME issuer has an optional email field, which can be set by issuer_email option. This is recommended option because it will be used to contact you in case of issues with your account or certificates, including expiry notification emails. Then, the settings can look like this: harbor_config = { domain_name: \"harbor.example.com\", issuer_email: \"email@example.com\", } After the deployment, there is one mandatory step to set up proper TLS communication with this Harbor instance. harbor-ingress has special annotation cert-manager.io/issuer: letsencrypt which instructs cert-manager to create a certificate object: $ kubectl get cert -o wide NAME READY SECRET ISSUER STATUS AGE harbor-crt False harbor-crt letsencrypt Issuing certificate as Secret does not exist 13m The certificate is not ready, because it uses Let’s Encrypt standard ACME HTTP-01 challenge. In this challenge, you need to take the IP address of the ingress load balancer and create a DNS record for your domain_name. You can get an IP address (don't look on nip.io suffix) e.g. by this command: $ kubectl -n ingress-nginx get svc ingress-nginx-controller -o jsonpath='{.status.loadBalancer.ingress}' [{\"hostname\":\"213.131.230.203.nip.io\"}] And after a while, your cert is ready, and you can access harbor at https://harbor.example.com/: $ kubectl get cert -o wide NAME READY SECRET ISSUER STATUS AGE harbor-crt True harbor-crt letsencrypt Certificate is up to date and has not expired 18m","s":"Ingress and TLS","u":"/docs/container/components/k8s-cluster-api-provider/doc/usage/harbor","h":"#ingress-and-tls","p":483},{"i":493,"t":"While the scripts all use a default testcluster, they have been developed and tested to manage many clusters from a single management node. Copy the ~/cluster-defaults/clusterctl.yaml file to ~/MYCLUSTER/clusterctl.yaml and edit the copy to describe the properties of the cluster to be created. Use ./create_cluster.sh MYCLUSTER then to create a workload cluster with the name MYCLUSTER. You will find the kubeconfig file in ~/MYCLUSTER/MYCLUSTER.yaml, granting its owner admin access to that cluster. Likewise, delete_cluster.sh and the apply_*.sh scripts take a cluster name as parameter. This way, dozens of clusters can be controlled from one management server. You can add credentials from different projects into ~/.config/openstack/clouds.yaml and reference them in the OPENSTACK_CLOUD setting in clusterctl.yaml, this way managing clusters in many different projects and even clouds from one management server.","s":"Managing many clusters","u":"/docs/container/components/k8s-cluster-api-provider/doc/usage/managing-many-clusters","h":"","p":492},{"i":495,"t":"From #600, this repository uses CAPI ClusterClass feature for the creation of new clusters, additionally see k8s blog. This feature is also used e.g. in the SCS cluster-stacks repository. Note: For now, ClusterClass is created per Cluster, which is not optimal and most likely it can be improved. Therefore, existing clusters must be migrated from 'old' cluster templates to 'new' cluster class based templates. Based on ClusterClass proposal of update strategy, we shouldn't be able to migrate, but in CAPI PR #6292 the validation webhook was relaxed (via special Cluster annotation unsafe.topology.cluster.x-k8s.io/disable-update-class-name-check) and manual migration is now possible. The script migrate-to-cluster-class.sh uses that special annotation for migration. In the beginning, it patches CAPI and KCP deployments with the ClusterTopology=true container argument. Then creates new resources (KubeadmControlPlaneTemplate, OpenStackClusterTemplate, ClusterClass). After that, annotates, labels and patches existing cluster resources. In the end, it patches the Cluster object with .spec.topology and it's done.","s":"Migration to ClusterClass","u":"/docs/container/components/k8s-cluster-api-provider/doc/usage/migrate-to-cluster-class","h":"","p":494},{"i":498,"t":"CAPI >= v1.5.2 due to NamingStrategy feature upgrade can be performed as stated in upgrade guide","s":"Prerequisites","u":"/docs/container/components/k8s-cluster-api-provider/doc/usage/migrate-to-cluster-class","h":"#prerequisites","p":494},{"i":500,"t":"Git pull/checkout new changes into the ~/k8s-cluster-api-provider directory Run migrate-to-cluster-class.sh (verify machines were not recreated) Copy new templates for existing and new clusters (consider backup) cp ~/k8s-cluster-api-provider/terraform/files/template/cluster-template.yaml ~//cluster-template.yaml cp ~/k8s-cluster-api-provider/terraform/files/template/cluster-template.yaml ~/cluster-defaults/cluster-template.yaml Next run of create_cluster.sh should be idempotent","s":"Steps","u":"/docs/container/components/k8s-cluster-api-provider/doc/usage/migrate-to-cluster-class","h":"#steps","p":494},{"i":502,"t":"The provided cluster-template.yaml assumes that all control nodes on one hand and all worker nodes on the other are equal. They are in the same cloud within the same availability zone, using the same flavor. cluster API allows k8s clusters to have varying flavors, span availability zones and even clouds. For this, you can create an advanced cluster-template with more different machine descriptions and potentially several secrets. Depending on your changes, the logic in create_cluster.sh might also need enhancements to handle this. Extending this is not hard and we're happy to hear from your use cases and take patches. However, we are currently investigating to use helm templating for anything beyond the simple use cases instead, see next chapter.","s":"Multi-AZ and multi-cloud environments","u":"/docs/container/components/k8s-cluster-api-provider/doc/usage/multi-az-and-multi-cloud-environments","h":"","p":501},{"i":504,"t":"To test the created k8s cluster, there are several tools available. Apply all commands to the testcluster context (by passing the appropriate --context setting to kubectl or by using the right KUBECONFIG file). Looking at all pods (kubectl get pods -A) to see that they all come up (and don't suffer excessive restarts) is a good first check. Look at the pod logs to investigate any failures. You can create a very simple deployment with the provided kuard.yaml, which is an example taken from the O'Reilly book from B. Burns, J. Beda, K. Hightower: \"Kubernetes Up & Running\" enhanced to also use a persistent volume. You can deploy Google's demo microservice application. sonobuoy runs a subset of the k8s tests, providing a simple way to filter the >5000 existing test cases to only run the CNCF conformance tests or to restrict testing to non-disruptive tests. The sonobuoy.sh wrapper helps with calling it. There are also Makefile targets check-* that call various sonobuoy test sets. This is how we call sonobuoy for our CI tests. You can use cilium connectivity test to check whether your cilium CNI is working properly. You might need to enable hubble to get a fully successful result.","s":"Testing","u":"/docs/container/components/k8s-cluster-api-provider/doc/usage/testing","h":"","p":503},{"i":506,"t":"TODO","s":"Overview","u":"/docs/container/deployment-examples/a/","h":"","p":505},{"i":508,"t":"TODO","s":"Software Requirements","u":"/docs/container/deployment-examples/a/software","h":"","p":507},{"i":510,"t":"TODO","s":"Guide 1","u":"/docs/container/guides/guide1","h":"","p":509},{"i":512,"t":"TODO","s":"Hardware Requirements","u":"/docs/container/deployment-examples/a/hardware","h":"","p":511},{"i":514,"t":"TODO","s":"Architecture","u":"/docs/container/overview/architecture","h":"","p":513},{"i":516,"t":"TODO","s":"Knowledge","u":"/docs/container/overview/knowledge","h":"","p":515},{"i":519,"t":"The Sovereign Cloud Stack (SCS) provides standards for a range of cloud infrastructure types. It strives for interoperable and sovereign cloud offerings which can be deployed and used by a wide range of organizations and individuals.","s":"What does SCS stand for?","u":"/docs/faq/","h":"#what-does-scs-stand-for","p":517},{"i":521,"t":"SCS is a Software Stack to power data centers of different scale. It empowers public or private cloud service providers to offer resources to their endusers.","s":"Who is SCS intended for?","u":"/docs/faq/","h":"#who-is-scs-intended-for","p":517},{"i":523,"t":"SCS is run by the SCS Project Team which is based at the Open Source Business Alliance e.V. and 100% funded by the German Ministry of Economics and Climate Action (BMWK). Public money means public code.","s":"Who or what is behind SCS?","u":"/docs/faq/","h":"#who-or-what-is-behind-scs","p":517},{"i":525,"t":"A standardized environment promotes interoperability, reduces vendor lock-in, and facilitates smoother transitions between providers. It gives individuals, companies and public institutions the freedom of choice.","s":"Why is there a need for a standardized cloud environment?","u":"/docs/faq/","h":"#why-is-there-a-need-for-a-standardized-cloud-environment","p":517},{"i":527,"t":"The SCS standards are available on the standards pages within our documentation page. Find them here","s":"Where can I find the SCS standards?","u":"/docs/faq/","h":"#where-can-i-find-the-scs-standards","p":517},{"i":529,"t":"Unlike proprietary clouds, SCS emphasizes standardization, ensuring interoperability and reduced dependency on one provider.","s":"How is the SCS different from other cloud environments (e.g. AWS, Azure,...)?","u":"/docs/faq/","h":"#how-is-the-scs-different-from-other-cloud-environments-eg-aws-azure","p":517},{"i":531,"t":"Yes, SCS can complement existing environments, enhancing standardization and interoperability.","s":"My company already has a cloud environment. Can we still use the SCS?","u":"/docs/faq/","h":"#my-company-already-has-a-cloud-environment-can-we-still-use-the-scs","p":517},{"i":533,"t":"Reference implementation is a concrete example or blueprint of how the SCS standards can be implemented.","s":"What does reference implementation mean?","u":"/docs/faq/","h":"#what-does-reference-implementation-mean","p":517},{"i":535,"t":"No, while the reference implementation is a guide, compliance requires adhering to SCS standards, not the exact blueprint of the reference implementation. Check the standards page on how to be SCS-compatible","s":"Do I need to use the reference implementation to be SCS compliant?","u":"/docs/faq/","h":"#do-i-need-to-use-the-reference-implementation-to-be-scs-compliant","p":517},{"i":537,"t":"No, you can choose layers based on your needs and still be SCS compliant.","s":"Do I have to use all layers of the reference implementation (IaaS, CaaS)?","u":"/docs/faq/","h":"#do-i-have-to-use-all-layers-of-the-reference-implementation-iaas-caas","p":517},{"i":539,"t":"IaaS stands for Infrastructure as a Service, providing virtualized computing resources over the internet.","s":"What does IaaS mean?","u":"/docs/faq/","h":"#what-does-iaas-mean","p":517},{"i":541,"t":"IaaS typically comprises virtual machines, storage, and network resources, all offered as scalable services. Find the architecture here","s":"How is the IaaS layer structured?","u":"/docs/faq/","h":"#how-is-the-iaas-layer-structured","p":517},{"i":543,"t":"CaaS refers to Container as a Service, where providers offer container orchestration platforms.","s":"What does CaaS mean? (Container Layer)","u":"/docs/faq/","h":"#what-does-caas-mean-container-layer","p":517},{"i":545,"t":"As a user: Existing SCS Clouds: Explore and test on any of the cloud providers offering SCS. Choose one from here As a Cloud Service Provider: Cloud in a Box: Start with our pre-packaged solutions. Link to Ciab Testbed: Use the SCS test environment to experiment. Link to Testbed/deployment example","s":"I want to try out the SCS! Where do I start?","u":"/docs/faq/","h":"#i-want-to-try-out-the-scs-where-do-i-start","p":517},{"i":547,"t":"As a user: Browse our list of providers and choose one that fits your needs. As a Cloud Service Provider: Adopt SCS standards and utilize our resources and tools to integrate them.","s":"I want to use an SCS Cloud! How do I get started?","u":"/docs/faq/","h":"#i-want-to-use-an-scs-cloud-how-do-i-get-started","p":517},{"i":549,"t":"Start by understanding SCS standards and then move on to the reference implementation. Link to guide).","s":"I want to use the SCS in my company and build my own cloud! Where do I start?","u":"/docs/faq/","h":"#i-want-to-use-the-scs-in-my-company-and-build-my-own-cloud-where-do-i-start","p":517},{"i":551,"t":"Refer to our support section or check our community channels for assistance. Link to community.","s":"I have a technical problem. Where can I find help?","u":"/docs/faq/","h":"#i-have-a-technical-problem-where-can-i-find-help","p":517},{"i":553,"t":"TODO","s":"Containerization","u":"/docs/getting-started/containerization","h":"","p":552},{"i":555,"t":"TODO","s":"Overview","u":"/docs/getting-started/overview","h":"","p":554},{"i":557,"t":"TODO","s":"Virtualization","u":"/docs/getting-started/virtualization","h":"","p":556},{"i":559,"t":"This file serves as the central glossary within SCS. It is intended to clearly define terms used within SCS where there may be differing understandings. The glossary is not intended to evaluate or standardize specific terms.","s":"Glossary","u":"/docs/glossary","h":"","p":558},{"i":561,"t":"An OpenStack/SCS region consists of at least one or more Availability Zones that share a Control Plane with their services. As a result, they share one API. Also a Control Plane can share one CEPH cluster over different fire departments or each Availbility Zone can have its own CEPH cluster. Within the region, any Layer 2 networks are available to the user. Availbility Zones which build a region are connected by redundant low-latency (<2ms (guess!!) ) high bandwidth (10s of Gbps) connections. Regions can be federated when the SCS code is ready.","s":"Definition of a Region","u":"/docs/glossary","h":"#definition-of-a-region","p":558},{"i":563,"t":"An Availability Zone is a (physical) group of multiple compute nodes, controlled by the region's control plane that provides the API and interface. An Availability Zone allows OpenStack compute hosts to be divided into logical groups and provides a form of physical isolation and redundancy from other Availability Zones, for example by using a separate power supply or network devices. When users provision resources, they can specify in which Availability Zone their instances should be created. In this way, customers can ensure that their application resources are distributed across different failure domains to achieve high availability in the event of a hardware failure.","s":"Definition of a Availability Zone","u":"/docs/glossary","h":"#definition-of-a-availability-zone","p":558},{"i":565,"t":"Host aggregates are a mechanism for partitioning compute nodes which is not explicitly visible to users in an OpenStack/SCS cloud. Host aggregates are based on arbitrary characteristics such as server type, processor type, GPU, disk speed, etc. Administrators assign flavors to host aggregates by specifying metadata on the host aggregate and customizing the extra specifications of the flavor. It is then up to the Nova scheduler to determine the best match for the user request. Compute nodes can also be in more than one host aggregate. Optionally, one can designate a host aggregate as an Availability Zone, e.g. for simplification reasons of the user selection of an availbility zone. Availability Zones differ from Host Aggregates in that they are shown to the user as a Nova boot option, so Compute VMs can be started on them. Compute Nodes, however, can only be in a single Availability Zone. We can configure a default Availability Zone where instances will be scheduled if the user does not specify an Availability Zone. Info: A prerequisite for creating an Availability Zone is a host aggregate.","s":"Definition of Host Aggregates","u":"/docs/glossary","h":"#definition-of-host-aggregates","p":558},{"i":567,"t":"The Cells paradigm simplifies the handling of large Openstack deployments. Cells is an OpenStack Nova feature that improves scalability for Nova in OpenStack Platform. Each Cell has a separate database and message queue, which increases performance when scaling. One can provision additional Cells to handle large deployments, and compared to Regions, this allows access to a large number of compute nodes through a single API. Each Cell has its own Cell controllers running the database server and RabbitMQ along with the Nova Conductor services. Nova Conductor services, called \"Super Conductor\", continue to run on the main controller nodes. The services in the Cell Controllers can still call placement APIs, but cannot access other API layer services via RPC, nor can they access global API databases on the control nodes.","s":"Definition of a Cell","u":"/docs/glossary","h":"#definition-of-a-cell","p":558},{"i":569,"t":"In Openstack/SCS, a Control Plane consists of at least 5 hardware nodes, which together serve several Availability Zones and thus provide a common usable API for a region. The Control Plane also shares the network (Neutron), the Scheduler and the CEPH services. It includes the Controller Nodes (Galera Cluster, RabbitMQ) and the Manager Nodes, Maas,...","s":"Definition of a Control Plane","u":"/docs/glossary","h":"#definition-of-a-control-plane","p":558},{"i":571,"t":"The Control Node runs the Identity Service, Image Service , management processes for compute nodes, management processes for networking, various networking agents, and the Dashboard. It also includes supporting services such as an SQL database, a message queue, and NTP. Optionally, the Controller Node runs parts of the Block Storage, Object Storage, Orchestration and Telemetry services. The Controller Node requires at least two network interfaces.","s":"Definition of Control Node","u":"/docs/glossary","h":"#definition-of-control-node","p":558},{"i":573,"t":"A compute host runs the hypervisor part of compute that runs instances. By default, compute uses the KVM hypervisor. The compute host also runs a networking service agent that connects instances to virtual networks and provides firewall services to the instances through security groups. If you offer hyper-converged infrastructure, a compute host also serves the Ceph. This makes the storage dynamically scalable (horizontally and vertically). For the Ceph services, 1 CPU core and 4 GB of RAM are reserved per OSD to ensure appropriate performance.","s":"Definition of Compute Node","u":"/docs/glossary","h":"#definition-of-compute-node","p":558},{"i":575,"t":"From here, the OSISM Ansible playbooks are applied to the environment. Furthermore, the following services often run here non-redundantly: Prometheus server,....","s":"Definition of Manager Node","u":"/docs/glossary","h":"#definition-of-manager-node","p":558},{"i":577,"t":"The provider network is the network that is \"in front\", i.e. at the output points of the openstack/SCS. This is usually a public network, but can also be a private network in individual cases. IPs from the provider network can be assigned to instances within the SCS. The same applies to load balancers, of course.","s":"Definition of provider network","u":"/docs/glossary","h":"#definition-of-provider-network","p":558},{"i":579,"t":"The Rest API provides the core of openstack/SCS and can be addressed for a whole region. It accepts and responds to end-user API calls. The service supports the OpenStack Compute API, the Amazon EC2 API, and a special Admin API for privileged users to perform administrative actions. Policies are enforced and most orchestration actions can be started, such as launching an instance.","s":"Definition of API","u":"/docs/glossary","h":"#definition-of-api","p":558},{"i":581,"t":"Horizon is openstack's preferred GUI for the end user, but also for the administrator for a quick overview. It runs on the controller node. Other GUIs are possible, also GUIs which replace the horizon interface","s":"Horizon","u":"/docs/glossary","h":"#horizon","p":558},{"i":583,"t":"Most OpenStack services communicate with each other through the message queue. For example, Compute communicates with Block Storage services and Network services via the message queue. RabbitMQ, Qpid, and Zeromq are popular choices for a message queue service. When the message queue fails or becomes inaccessible, the cluster generally comes to a halt and ends up in a read-only state where the information is stuck at the point where the last message was sent. Therefore, this is clustered. RabbitMQ has shown itself to be the most widespread and best supported variant in the OpenStack context, Qpid occurs occasionally, ZeroMQ lacks HA functionality to date","s":"Message Queue","u":"/docs/glossary","h":"#message-queue","p":558},{"i":585,"t":"( The OpenStack Identity module called Keystone is used as an authentication and rights system between the OpenStack components. Keystone divides access to projects in the cloud into so-called \"tenants\". A tenant is a tenant of the cloud and has at least one assigned user. It is possible to create multiple users per tenant with different rights. Keystone uses a token system for authorization and also supports the connection to other authentication options such as LDAP. (wikipedia) )","s":"Keystone","u":"/docs/glossary","h":"#keystone","p":558},{"i":587,"t":"The OpenStack Image Service, also called Glance, is a service that provides virtual machine images to OpenStack users. These images are used by Nova as a template to compile virtual machine instances. Both local hard disks and object storage solutions such as Swift or Ceph can be used as storage backends. In addition to the images, Glance can also store metadata such as the operating system used or the kernel version. Access to both this metadata and the images themselves is via a REST API. Glance supports a number of formats such as VHD, VMDK and qcow2.","s":"Glance","u":"/docs/glossary","h":"#glance","p":558},{"i":589,"t":"The Open Source Infrastructure & Service Manager is a powerful deployment framework for OpenStack and Ceph as well as required services such as a RabbitMQ broker or a MariaDB Galera cluster.","s":"OSISM","u":"/docs/glossary","h":"#osism","p":558},{"i":591,"t":"Ceph is an open source distributed storage solution. The core component is RADOS (Reliable Autonomic Distributed Object Store), an object store that can be distributed redundantly over any number of servers. Ceph offers the user three types of storage: An object store compatible with the Swift and S3 API (RADOS Gateway), virtual block devices (RADOS Block Devices) and CephFS, a distributed file system.","s":"Ceph","u":"/docs/glossary","h":"#ceph","p":558},{"i":593,"t":"Nova is virtually a synonym for Compute. It is the part of the stack that can manage groups of virtual machines. The virtualized systems can be distributed over any number of so-called compute nodes. Hypervisors supported include KVM, Xen Hyper-V and ESXI. In the community, KVM is considered to be set and best supported (we use KVM), which is controlled via libvirt. ESXI and Hyper-V can be used, sometimes with limited functionality.","s":"Nova","u":"/docs/glossary","h":"#nova","p":558},{"i":595,"t":"The OpenStack Networking module Neutron provides the networking service for OpenStack. Neutron can be used to manage networks, subnets, and IP addresses/floating IPs. A floating IP in OpenStack refers to an official IP that serves as an interface from the internal to the public network. In addition to a load balancer, HA proxy and health monitor, Neutron also supports techniques such as VLAN and VPN. To secure the networks, Neutron uses a firewall that allows versatile port rules, e.g. on a security group basis. For trademark reasons, the OpenStack networking module had to be renamed \"Neutron\". The previous name was \"Quantum.\" For the management of the data link layer, Neutron offers the possibility to use various already existing networking software such as Open vSwitch or the bridge functionality of the Linux kernel by means of plugins. In the OpenStack releases since Ussuri, the \"OpenVirtualNetwork\"(OVN) has established itself, it replaces many of the Neutron components, e.g. L3 and DHCP agent, so that Neutron only has to talk directly to OVN.","s":"Neutron","u":"/docs/glossary","h":"#neutron","p":558},{"i":597,"t":"OpenStack Block Storage or Cinder provides virtual block storage in the form of virtualized storage media (hard disks, CDs, etc.). The block storage can be attached to virtual machines. An API interface allows Cinder to connect to Swift so that block storage media can communicate with object storage. Meanwhile, many other storage backends are also fully or partially supported. There is also the option of defining multiple backends and creating a volume type for each backend, so that when a new volume is created, it can be selected on which storage backend the volume is created.","s":"Cinder","u":"/docs/glossary","h":"#cinder","p":558},{"i":599,"t":"Swift is the so-called object storage that can be used by Nova. This is responsible for redundant data storage. Swift can also be used as a backend for Cinder or Glance. Objects are stored in so-called containers, which are primarily used to group objects and store metadata and in turn belong to individual accounts. Objects and containers are accessed via a REST API.","s":"Swift","u":"/docs/glossary","h":"#swift","p":558},{"i":601,"t":"A Ceph OSD (Object Storage Daemon) logically represents a storage device in a Ceph cluster, which can logically be a hard disk, which is the ideal case. In other cases it can also be a raid, which however leads to considerable performance limitations due to caching or other raid optimization.","s":"Ceph OSD","u":"/docs/glossary","h":"#ceph-osd","p":558},{"i":603,"t":"Persona Description SCS Operator The SCS Operator is the one who owns and operates a standardized cloud environment. SCS Operations Team The team at the SCS Operator which actually runs the cloud environment. SCS Consumer The SCS Consumer consumes a standardized SCS environment and operates and orchestrates applications on top of it. The SCS Consumer is typically a customer or user of the SCS Operator. SCS Integrator The SCS Integrator assists in or is building up a standardized cloud environment. The SCS Integrator can be 2nd or 3rd level support for the SCS Operator. SCS Project The SCS Project oversees the overall activities around the Sovereign Cloud Stack. SCS Developer The SCS Developer actively contributes to technical elements of the Sovereign Cloud Stack.","s":"Personas","u":"/docs/glossary","h":"#personas","p":558},{"i":606,"t":"The OpenStack Flavor Manager manages the creation, modification, and removal of flavors within an OpenStack environment. The OpenStack Flavor Manager operates as a facilitator that orchestrates compute flavors in alignment with the standard SCS-0100: Flavor Naming by utilizing YAML files provided by the SCS project.","s":"Overview","u":"/docs/iaas/components/flavor-manager","h":"#overview","p":604},{"i":608,"t":"Install the openstack-flavor-manager package with pip. pip install openstack-flavor-manager Or clone the repository osism/openstack-flavor-manager and use the OpenStack Flavor Manager from source with tox. tox -- --help","s":"Installation","u":"/docs/iaas/components/flavor-manager","h":"#installation","p":604},{"i":610,"t":"There must be a clouds.yml and a secure.yml file in the directory where the OpenStack Flavor Manager will be executed. The cloud profile to be used can be specified via the optional --cloud parameter. By default the cloud profile with the name admin is used. It must be possible to create and delete flavors with the used cloud credentials. $ openstack-flavor-manager --help Usage: openstack-flavor-manager [OPTIONS] ╭─ Options ────────────────────────────────────────────────────────────────────────────────────╮ │ --name TEXT Name of flavor definitions. [default: scs] │ │ --debug Enable debug logging. │ │ --cloud TEXT Cloud name in clouds.yaml. [default: admin] │ │ --recommended Create recommended flavors. │ │ --help Show this message and exit. │ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ To create the mandatory flavors by the SCS Flavor Naming Standard, you run: $ openstack-flavor-manager To create the recommended flavors by the SCS Flavor Naming Standard, you run: $ openstack-flavor-manager --recommended The output should look like this: 2023-09-20 13:03:14 | INFO | Flavor 'SCS-1V-4' created. 2023-09-20 13:03:14 | INFO | Flavor 'SCS-2V-8' created. 2023-09-20 13:03:14 | INFO | Flavor 'SCS-4V-16' created. 2023-09-20 13:03:14 | INFO | Flavor 'SCS-8V-32' created. ... All recommended flavors are now be available in your OpenStack environment. Check yourself by running: openstack --os-cloud admin flavor list","s":"Usage","u":"/docs/iaas/components/flavor-manager","h":"#usage","p":604},{"i":612,"t":"There are two flavor definitions available by default. One for SCS and one for OSISM. Each definition has its own set of mandatory and recommended flavors. To run the OpenStack Flavor Manager with a specific definition, either scs or osism, use the optional --name parameter. By default the SCS Flavor Naming Standard definition will be used. $ openstack-flavor-manager --name osism","s":"Definitions","u":"/docs/iaas/components/flavor-manager","h":"#definitions","p":604},{"i":614,"t":"A generator and parser for flavor names according to the SCS standard is available on flavors.scs.community. The flavor name SCS-2V-4-20s is inserted in field Flavor name: The flavor SCS-2V-4-20s translated is 2 generic x86-64 vCPUs with 4.0 GiB RAM and SSD 20GB root volume:","s":"Name parser and generator","u":"/docs/iaas/components/flavor-manager","h":"#name-parser-and-generator","p":604},{"i":618,"t":"The OpenStack Image Manager is a tool for managing all images on an OpenStack environment","s":"Image Manager","u":"/docs/iaas/components/image-manager","h":"","p":617},{"i":620,"t":"This information is only relevant for the operator of an OpenStack environment. You can skip this section if you want to use OpenStack Image Manager as a normal user and you are not an operator of an openStack environment.","s":"Requirements","u":"/docs/iaas/components/image-manager","h":"#requirements","p":617},{"i":622,"t":"The OpenStack Image Service (Glance) is required to upload and discover data assets that are used by other services. Since this script stores many images in a single project, the Glance quota must be set accordingly high or to unlimited. [DEFAULT] user_storage_quota = 1TB With most storage backends it makes sense to convert the imported images directly to RAW. So it is required for using Ceph and it's features too. Recited from the Ceph documentation QEMU and block devices and Block devices and OpenStack. \"The raw data format is really the only sensible format option to use with RBD. Technically, you could use other QEMU-supported formats (such as qcow2 or vmdk), but doing so would add additional overhead, and would also render the volume unsafe for virtual machine live migration when caching (see below) is enabled.\" \"Important Ceph doesn't support QCOW2 for hosting a virtual machine disk. Thus if you want to boot virtual machines in Ceph (ephemeral backend or boot from volume), the Glance image format must be RAW.\" This requires the following parameter for the image import workflow. [taskflow_executor] conversion_format = raw [image_import_opts] image_import_plugins = ['image_decompression', 'image_conversion'] [image_conversion] output_format = raw See OpenStack Glance documentation for more details.","s":"OpenStack Image Service (Glance)","u":"/docs/iaas/components/image-manager","h":"#openstack-image-service-glance","p":617},{"i":624,"t":"If the mirror functionality is used, an object storage backend is required. The use of the mirror functionality is optional and is not used by default.","s":"Object storage backend","u":"/docs/iaas/components/image-manager","h":"#object-storage-backend","p":617},{"i":626,"t":"This Getting started will upload a private image to your OpenStack environment with the help of the OpenStack Image Manager. Install the openstack-image-manager package with pip. pip3 install openstack-image-manager Create a image definition in the file getting-started.yml in the local directory images. --- images: - name: MyCirros format: qcow2 login: cirros password: gocubsgo min_disk: 1 min_ram: 32 status: active visibility: private multi: false meta: architecture: x86_64 hw_disk_bus: scsi hw_rng_model: virtio hw_scsi_model: virtio-scsi hw_watchdog_action: reset os_distro: cirros replace_frequency: never uuid_validity: none provided_until: none tags: [] versions: - version: '0.6.0' url: https://github.com/cirros-dev/cirros/releases/download/0.6.0/cirros-0.6.0-x86_64-disk.img checksum: \"sha256:94e1e2c94dbbae7d4bdc38e68590a1daf73c9de2d03dd693857b4b0a042548e8\" build_date: 2022-09-28 Run the OpenStack Image Manager. It is assumed that a profile with the name openstack exists in the clouds.yaml. openstack-image-manager --cloud openstack --filter \".*Cirr.*\" --images images/","s":"Getting started","u":"/docs/iaas/components/image-manager","h":"#getting-started","p":617},{"i":628,"t":"The configuration consists of different parameter settings, such as values for minimum RAM or the visibility of the image. Have a look at the examples below for all parameters. After a change to the configuration, validate it with tox -- --dry-run.","s":"Image definitions","u":"/docs/iaas/components/image-manager","h":"#image-definitions","p":617},{"i":630,"t":"The value of login is stored as image_original_user in the metadata of an image. If image_description is not set as meta information, image_description is set to the name of the image. The value of build_date of a specific version of an image is stored as image_build_date in the metadata of an image. The value of url of a specific version of an image is stored as image_source in the metadata of an image.","s":"SCS image standard","u":"/docs/iaas/components/image-manager","h":"#scs-image-standard","p":617},{"i":632,"t":"This type of image definition is used for images that are rebuilt at regular intervals. For example, this is the case for the daily builds of the Ubuntu images. The attribute multi: true is set. With this type of image definition, the version of the distribution (or product, whatever is contained in the image) used is already in the name of the image definition. The version properties from the definition's versions list are appended only to older iterations of the image as timestamp suffixes in parentheses upon each rotation (except for the latest entry). images: - name: Ubuntu 16.04 format: qcow2 login: ubuntu min_disk: 8 min_ram: 512 status: active visibility: public multi: true meta: architecture: x86_64 hw_disk_bus: scsi hw_scsi_model: virtio-scsi hw_watchdog_action: reset os_distro: ubuntu os_version: '16.04' tags: [] versions: - version: '20180928' url: https://cloud-images.ubuntu.com/xenial/20180928/xenial-server-cloudimg-amd64-disk1.img - version: '20181004' url: https://cloud-images.ubuntu.com/xenial/20181004/xenial-server-cloudimg-amd64-disk1.img This configuration creates the following images: Ubuntu 16.04 (20180928) Ubuntu 16.04 If a newer build is added, the following rotation takes place: Ubuntu 16.04 (20180928) does not change Ubuntu 16.04 becomes Ubuntu 16.04 (20181004) the new image becomes Ubuntu 16.04 By default the last three images will be visible. When a fourth image is added, the visibility of the last image in the list is changed to community and the image can be deleted in the future.","s":"Image with regular rebuilds","u":"/docs/iaas/components/image-manager","h":"#image-with-regular-rebuilds","p":617},{"i":634,"t":"This type of image definition is used for images that are not rebuilt. For example, this is the case for the flatcar images. For each release of Flatcar there is exactly one image which will not be rebuilt in the future. The attribute multi: false is set. With this type of image definition, the version of the distribution (or product, whatever is contained in the image) used is not in the name of the image definition. Instead, the version properties from the image definition's versions list are appended as static version suffixes to the images' names. images: - name: RancherOS format: qcow2 login: rancher min_disk: 8 min_ram: 2048 status: active visibility: public multi: false meta: architecture: x86_64 hw_disk_bus: scsi hw_scsi_model: virtio-scsi hw_watchdog_action: reset tags: [] versions: - version: '1.3.0' url: https://github.com/rancher/os/releases/download/v1.3.0/rancheros-openstack.img - version: '1.4.0' url: https://github.com/rancher/os/releases/download/v1.4.0/rancheros-openstack.img - version: '1.4.1' url: https://github.com/rancher/os/releases/download/v1.4.1/rancheros-openstack.img This configuration creates the following images: RancherOS 1.3.0 RancherOS 1.4.0 RancherOS 1.4.1 If a new version is added, no rotation takes place. The new version is added as RancherOS x.y.z. Here also the visibility of older images is not changed.","s":"Image without regular rebuild","u":"/docs/iaas/components/image-manager","h":"#image-without-regular-rebuild","p":617},{"i":636,"t":"Image properties​ Removal of properties is not yet possible URL, name and format can not be changed Any keys can be added to meta, these will be added to the image Existing keys in meta can be changed, the same applies to min_disk and min_ram Image tags​ image status​ deactivation: change status to deactivated reactivation: change status to active Image visibility​ A full documentation about the visibility of images can be found in the Image visibility section in the OpenStack Image Service API Documentation. public: set visibility to public community: set visibility to community shared: set visibility to shared private: set visibility to private","s":"Other properties","u":"/docs/iaas/components/image-manager","h":"#other-properties","p":617},{"i":639,"t":"Since the upstreams often only keep their images for a short time, we mirror most of the images on REGIO.cloud. This makes us independent of the availability of the images in the individual upstreams.","s":"Mirroring images","u":"/docs/iaas/components/image-manager","h":"#mirroring-images","p":617},{"i":641,"t":"Some of the images are automatically updated by a CI job. The latest available build at the time of the CI job execution is mirrored and made available as the current version. Currently, the following images are updated once a week (every Sunday at 0 am): Almalinux CentOS Debian Rockylinux Ubuntu","s":"Updating images","u":"/docs/iaas/components/image-manager","h":"#updating-images","p":617},{"i":646,"t":"Rotation of amphorae older than 30 days. $ python3 src/amphora.py --rotate 2023-10-12 21:00:38 | INFO | Amphora 95a07c43-c0f9-44d2-bde8-a989e52427fa is older than 30 days 2023-10-12 21:00:38 | INFO | Amphora 95a07c43-c0f9-44d2-bde8-a989e52427fa of loadbalancer 9008d3d7-f593-4bc3-941c-a740c178148d is rotated by a loadbalancer failover","s":"Amphora rotation","u":"/docs/iaas/components/resource-manager","h":"#amphora-rotation","p":643},{"i":650,"t":"This section contains the documentation of the Ansible collection osism.commons. Role Description osism.commons.network osism.commons.packages osism.commons.services osism.commons.sshconfig osism.commons.timezone","s":"Commons","u":"/docs/iaas/guides/configuration-guide/commons/","h":"","p":649},{"i":653,"t":"The File System ID is a unique identifier for the cluster. The identifier is set via the parameter fsid in environments/ceph/configuration.yml and must be unique. It can be generated with uuidgen. environments/ceph/configuration.yml fsid: c2120a4a-669c-4769-a32c-b7e9d7b848f4","s":"Unique Identifier","u":"/docs/iaas/guides/configuration-guide/ceph","h":"#unique-identifier","p":651},{"i":655,"t":"The client.admin keyring is placed in the file environments/infrastructure/files/ceph/ceph.client.admin.keyring.","s":"Client","u":"/docs/iaas/guides/configuration-guide/ceph","h":"#client","p":651},{"i":657,"t":"The swappiness is set via the os_tuning_params dictionary. The dictionary can only be completely overwritten via an entry in the file environments/ceph/configuration.yml. By default, the dictionary looks like this: os_tuning_params: - { name: fs.file-max, value: 26234859 } - { name: vm.zone_reclaim_mode, value: 0 } - { name: vm.swappiness, value: 10 } - { name: vm.min_free_kbytes, value: \"{{ vm_min_free_kbytes }}\" } The sysctl paremeters are written to the file /etc/sysctl.d/ceph-tuning.conf on the storage nodes. # cat /etc/sysctl.d/ceph-tuning.conf fs.aio-max-nr=1048576 fs.file-max=26234859 vm.zone_reclaim_mode=0 vm.swappiness=10 vm.min_free_kbytes=4194303","s":"Swappiness","u":"/docs/iaas/guides/configuration-guide/ceph","h":"#swappiness","p":651},{"i":659,"t":"Add following configuration in environments/ceph/configuration.yml ceph_conf_overrides: \"client.rgw.{{ hostvars[inventory_hostname]['ansible_hostname'] }}.rgw0\": \"rgw content length compat\": \"true\" \"rgw enable apis\": \"swift, s3, admin\" \"rgw keystone accepted roles\": \"member, admin\" \"rgw keystone accepted admin roles\": \"admin\" \"rgw keystone admin domain\": \"default\" \"rgw keystone admin password\": \"{{ ceph_rgw_keystone_password }}\" \"rgw keystone admin project\": \"service\" \"rgw keystone admin tenant\": \"service\" \"rgw keystone admin user\": \"ceph_rgw\" \"rgw keystone api version\": \"3\" \"rgw keystone url\": \"https://api-int.testbed.osism.xyz:5000\" \"rgw keystone verify ssl\": \"false\" \"rgw keystone implicit tenants\": \"true\" \"rgw s3 auth use keystone\": \"true\" \"rgw swift account in url\": \"true\" \"rgw swift versioning enabled\": \"true\" If the ceph_conf_overrides parameter already exists in environments/ceph/configuration.yml, expand it and do not overwrite it. If self-signed SSL certificates are used, two additional parameters must be set. \"rgw keystone verify ssl\": \"false\" \"rgw verify ssl\": \"false\" For all possible configuration parameters visit the Ceph configuration reference. Add the ceph_rgw_keystone_password from environments/kolla/secrets.yml to environments/ceph/secrets.yml. Add following configuration in environments/kolla/configuration.yml enable_ceph_rgw: true enable_ceph_rgw_keystone: true ceph_rgw_swift_compatibility: false ceph_rgw_swift_account_in_url: true","s":"RGW service","u":"/docs/iaas/guides/configuration-guide/ceph","h":"#rgw-service","p":651},{"i":661,"t":"Extra pools can be defined via the openstack_pools_extra parameter. inventory/group_vars/generic/ceph.yml openstack_cinder_extra001_pool: name: extra001 pg_num: \"{{ openstack_pool_default_pg_num }}\" pgp_num: \"{{ openstack_pool_default_pg_num }}\" rule_name: \"replicated_rule\" min_size: \"{{ openstack_pool_default_min_size }}\" application: \"rbd\" openstack_pools_extra: - \"{{ openstack_cinder_extra001_pool }}\" If more than one Ceph cluster is managed with one manager, do not place the parameters in inventory/group_vars/generic but in a corresponding directory. If, for example, the inventory group of the Ceph cluster on which the additional pools are to be created is ceph.rbd, then the parameters would be stored in inventory/group_vars/ceph.rbd.yml accordingly. Parameter Default value openstack_pool_default_pg_num 64 openstack_pool_default_min_size 0","s":"Extra pools","u":"/docs/iaas/guides/configuration-guide/ceph","h":"#extra-pools","p":651},{"i":663,"t":"The osism.commons.network role is used for the netwok configuration. Netplan is used by default. It is also possible to use the old /etc/interfaces file.","s":"Network","u":"/docs/iaas/guides/configuration-guide/commons/network","h":"","p":662},{"i":665,"t":"Since OSISM 6.1.0, the default network type is a netplan and no longer needs to be set explicitly network_type: netplan The configuration is written to /etc/netplan/01-osism.yaml by default. Can be changed via the network_netplan_path and network_netplan_file parameters. The file permissions are 0600 by default (cane be changed via the network_netplan_permissions parameter). By default, all other files in /etc/netplan are removed. If you do not want this, you can set network_netplan_remove_unmanaged_files to false. It is also possible to explicitly list individual files that should not be deleted in network_netplan_managed_files_extra. An existing /etc/intefaces file is replaced with a placeholder file. It is not possible to use /etc/interfaces and Netplan in parallel. This template is used as the base for the configuration # This file describes the network interfaces available on your system # For more information, see netplan(5). --- network: version: {{ network_version }} renderer: {{ network_renderer }} bonds: {{ network_bonds|to_nice_yaml(indent=4)|indent(4) }} bridges: {{ network_bridges|to_nice_yaml(indent=4)|indent(4) }} ethernets: {{ network_ethernets|to_nice_yaml(indent=4)|indent(4) }} tunnels: {{ network_tunnels|to_nice_yaml(indent=4)|indent(4) }} vlans: {{ network_vlans|to_nice_yaml(indent=4)|indent(4) }} The parameters listed in the following table can be used in the template. Parameter Default Description network_version 2 Defines what version of the configuration format is used. The only value supported at the moment is 2. network_renderer networkd Defines what network configuration tool will be used to set up your configuration. Valid values are networkd and NetworkManager. network_bonds {} https://netplan.readthedocs.io/en/stable/netplan-yaml/#properties-for-device-type-bonds network_bridges {} https://netplan.readthedocs.io/en/stable/netplan-yaml/#properties-for-device-type-bridges network_ethernets {} https://netplan.readthedocs.io/en/stable/netplan-yaml/#properties-for-device-type-ethernets network_tunnels {} https://netplan.readthedocs.io/en/stable/netplan-yaml/#properties-for-device-type-tunnels network_vlans {} https://netplan.readthedocs.io/en/stable/netplan-yaml/#properties-for-device-type-vlans Changes to the configuration are currently not applied utomatically. This is done on purpose to enable a manual check in advance. Changes to the network configuration can be applied either by rebooting or by executing netplan apply. $ osism console --type clush all Enter 'quit' to leave this interactive mode Working with nodes: testbed-manager.testbed.osism.xyz,testbed-node-[0-2].testbed.osism.xyz clush> sudo netplan apply","s":"Netplan","u":"/docs/iaas/guides/configuration-guide/commons/network","h":"#netplan","p":662},{"i":667,"t":"The Netplan documentation contains a large number of example configurations. The following example shows the use of How to create VLANs with the osism.commons.network role. network_ethernets: mainif: match: macaddress: \"de:ad:be:ef:ca:fe\" set-name: mainif addresses: [ \"10.3.0.5/23\" ] nameservers: addresses: [ \"8.8.8.8\", \"8.8.4.4\" ] search: [ example.com ] routes: - to: default via: 10.3.0.1 network_vlans: vlan15: id: 15 link: mainif addresses: [ \"10.3.99.5/24\" ] vlan10: id: 10 link: mainif addresses: [ \"10.3.98.5/24\" ] nameservers: addresses: [ \"127.0.0.1\" ] search: [ domain1.example.com, domain2.example.com ]","s":"Example","u":"/docs/iaas/guides/configuration-guide/commons/network","h":"#example","p":662},{"i":670,"t":"Dummy devices are created with the help of systemd.netdev and can then be used as a normal netowrk device in the Netplan configuration. network_dummy_interfaces: - dummy0 The MTU is set to 9000 by default and can be set via network_dummy_interface_mtu.","s":"Dummy interfaces","u":"/docs/iaas/guides/configuration-guide/commons/network","h":"#dummy-interfaces","p":662},{"i":672,"t":"If /etc/interfaces is to be used, the network_type must be explicitly set in environments/configuration.yml network_type: interfaces","s":"/etc/interfaces","u":"/docs/iaas/guides/configuration-guide/commons/network","h":"#etcinterfaces","p":662},{"i":674,"t":"With the osism.commons.packages role, it is possible to add packages on a node in a general form. required_packages_default: - ethtool - jq - rsyslog required_packages_extra: [] required_packages: \"{{ required_packages_default + required_packages_extra + required_packages_distribution }}\"","s":"Packages","u":"/docs/iaas/guides/configuration-guide/commons/packages","h":"","p":673},{"i":677,"t":"With Debian, the packages listed in required_packages_distribution are installed by default. required_packages_distribution: - debsums - selinux-utils - ssh The apt_cache_valid_time parameter can be used to set the cache_valid_time paremter of the ansible.builtin.apt module. The module updates the apt cache if it is older than the cache_valid_time. The parameter is set in seconds and defaults to 3600.","s":"Debian","u":"/docs/iaas/guides/configuration-guide/commons/packages","h":"#debian","p":673},{"i":679,"t":"The upgrade_packages parameter can be used to configure the upgrade of packages. The parameter is set to true by default.","s":"Upgrade of packages","u":"/docs/iaas/guides/configuration-guide/commons/packages","h":"#upgrade-of-packages","p":673},{"i":681,"t":"With the osism.commons.services role, it is possible to manage services on a node in a general form. This allows you to either activate any services or indicate that specific services are running and should be deactivated.","s":"Services","u":"/docs/iaas/guides/configuration-guide/commons/services","h":"","p":680},{"i":683,"t":"services_required_default: - cron services_required_extra: [] services_required: \"{{ services_required_default + services_required_extra }}\" note services_required should not be overwritten. Use services_required_extra to add extra services.","s":"Start and enable required services","u":"/docs/iaas/guides/configuration-guide/commons/services","h":"#start-and-enable-required-services","p":680},{"i":685,"t":"services_warning_default: - nscd services_warning_extra: [] services_warning: \"{{ services_warning_default + services_warning_extra }}\" note services_warning should not be overwritten. Use services_warning_extra to add extra services.","s":"Note on services that should be deactivated","u":"/docs/iaas/guides/configuration-guide/commons/services","h":"#note-on-services-that-should-be-deactivated","p":680},{"i":687,"t":"With the osism.commons.sshconfig role, it is possible to manage a SSH config file in the home directory of the operator user.","s":"SSH Config","u":"/docs/iaas/guides/configuration-guide/commons/sshconfig","h":"","p":686},{"i":689,"t":"In the testbed the /home/dragon/.ssh/config file is created on the manager node testbed-manager. Example for an assembled /home/dragon/.ssh/config file Host testbed-manager HostName testbed-manager.testbed.osism.xyz User dragon Port 22 IdentityFile /opt/ansible/secrets/id_rsa.operator #################### Host testbed-node-0 HostName testbed-node-0.testbed.osism.xyz User dragon Port 22 IdentityFile /opt/ansible/secrets/id_rsa.operator #################### Host testbed-node-1 HostName testbed-node-1.testbed.osism.xyz User dragon Port 22 IdentityFile /opt/ansible/secrets/id_rsa.operator #################### Host testbed-node-2 HostName testbed-node-2.testbed.osism.xyz User dragon Port 22 IdentityFile /opt/ansible/secrets/id_rsa.operator","s":"Example","u":"/docs/iaas/guides/configuration-guide/commons/sshconfig","h":"#example","p":686},{"i":691,"t":"Parameter Default Description sshconfig_groupname all All nodes in this group are included. sshconfig_order 20 The .ssh/config.d directory is used to prepare the .ssh/config file. You can add your own files in this directory. Everything with a filename prefix smaller than sshconfig_order is placed at the beginning of the assembled .ssh/config file. Anything with a filename prefix greater than sshconfig_order goes at the end. sshconfig_port 22 The SSH port. sshconfig_private_key_file /opt/ansible/secrets/id_rsa.operator The identity file to use. The file itself must already exist there. The file is created by the osism.services.manager role. sshconfig_user \"{{ operator_user }}\" The user in which home directory the .ssh/config file will be generated.","s":"Defaults","u":"/docs/iaas/guides/configuration-guide/commons/sshconfig","h":"#defaults","p":686},{"i":693,"t":"With the osism.commons.sysctl role, it is possible to manage the attributes of the kernel via sysctl on a node. The following defaults are set via the parameter sysctl_defaults. Group Attribute Default elasticsearch vm.max_map_count 262144 rabbitmq net.ipv4.tcp_keepalive_time 6 rabbitmq net.ipv4.tcp_keepalive_intvl 3 rabbitmq net.ipv4.tcp_keepalive_probes 3 rabbitmq net.core.wmem_max 16777216 rabbitmq net.core.rmem_max 16777216 rabbitmq net.ipv4.tcp_fin_timeout 20 rabbitmq net.ipv4.tcp_tw_reuse 1 rabbitmq net.core.somaxconn 4096 rabbitmq net.ipv4.tcp_syncookies 0 rabbitmq net.ipv4.tcp_max_syn_backlog 8192 generic vm.swappiness 1 compute net.netfilter.nf_conntrack_max 1048576 The sysctl_extra parameter can be used to set your own parameters or overwrite existing parameters in the defaults. Set attribute fs.inotify.max_user_instances to 256 for all nodes in group generic sysctl_extra: generic: - name: fs.inotify.max_user_instances value: 256","s":"Sysctl","u":"/docs/iaas/guides/configuration-guide/commons/sysctl","h":"","p":692},{"i":695,"t":"With the osism.commons.timezone role, it is possible to manage the used timezone on a node. This role is just a wrapper for the community.general.timezone module. The role also installs the tzdata package. Parameter Default Description timezone_hwclock UTC Whether the hardware clock is in UTC or in local timezone. timezone_name UTC Name of the timezone for the system clock.","s":"Timezone","u":"/docs/iaas/guides/configuration-guide/commons/timezone","h":"","p":694},{"i":697,"t":"The inventory used for the environment is located in the inventory directory.","s":"Inventory","u":"/docs/iaas/guides/configuration-guide/inventory","h":"","p":696},{"i":699,"t":"The manager has his own inventory which is used exclusively for the seed phase of the manager. It is located in the directory environments/manager. There is a hosts file with only the manager node in it.","s":"Manager","u":"/docs/iaas/guides/configuration-guide/inventory","h":"#manager","p":696},{"i":704,"t":"The Ansible group all is specifically used internally by OSISM, is reserved and is not supported for additional variables. When variables are added in the configuration repository for the all group, they are ignored. In OSISM the group generic can be used to store variables for all nodes.","s":"Define variable for all nodes","u":"/docs/iaas/guides/configuration-guide/inventory","h":"#define-variable-for-all-nodes","p":696},{"i":706,"t":"The configuration required for OSISM is stored in a single Git monorepo, the configuration repository.","s":"Configuration Repository","u":"/docs/iaas/guides/configuration-guide/configuration-repository","h":"","p":705},{"i":708,"t":"A configuration repository is always composed of the same basic layout. environments directory inventory directory netbox directory (optional) requirements.txt file In the requirements.txt the necessary dependencies are listed to be able to execute Gilt. gilt.yml file Gilt is a Git layering tool. We use Gilt to maintain the image versions, Ansible configuration and scripts within the environments/manager directory. The current gilt.yml file is always located in the osism/cfg-generics repository. To use Gilt the dependencies are installed first. pip3 install -r requirements.txt After that you can update the manager environment in environments/manager. Since the gilt.yml itself is updated with Gilt it is always important to run the command twice. gilt overlay gilt overlay","s":"Configuration repository layout","u":"/docs/iaas/guides/configuration-guide/configuration-repository","h":"#configuration-repository-layout","p":705},{"i":710,"t":"The initial content for this repository is generated using the cookiecutter.","s":"Creating a new configuration repository","u":"/docs/iaas/guides/configuration-guide/configuration-repository","h":"#creating-a-new-configuration-repository","p":705},{"i":712,"t":"The content generated by the cookiecutter in the output/configuration directory is committed to a new Git repository. By default, it is assumed that the configuration repository is stored on GitHub. This can also be GitLab or an internal Git service as well. Host and path to the Git repository are specified via the git_ parameters: The git_ parameters do not specify the path to the cookiecutter to use. [8/20] git_host (github.com): [9/20] git_port (22): [10/20] git_repository (YOUR_ORG/YOUR_NEW_CONFIGURATION_REPOSITORY): regiocloud/configuration [11/20] git_username (git): [12/20] git_version (main): In this case, the generated configuration in the output/configuration directory is stored on GitHub in the regiocloud/configuration repository.","s":"Git repository","u":"/docs/iaas/guides/configuration-guide/configuration-repository","h":"#git-repository","p":705},{"i":714,"t":"In this example a new configuration repository is created with the defaults. The current stable version of OSISM is used. The use of latest is described in the section Use of latest. The directory output is created and used as output volume. mkdir output The cookiecutter is executed within a container. Docker must be usable on the system on which the cookiecutter is to be used. It should also work with podman. docker run --rm -v $(pwd)/output:/output -it quay.io/osism/cookiecutter [1/20] with_ceph (1): [2/20] ceph_network_backend (192.168.80.0/20): [3/20] ceph_network_frontend (192.168.64.0/20): [4/20] ceph_version (quincy): [5/20] domain (osism.xyz): [6/20] fqdn_external (api.osism.xyz): [7/20] fqdn_internal (api-int.osism.xyz): [8/20] git_host (github.com): [9/20] git_port (22): [10/20] git_repository (YOUR_ORG/YOUR_NEW_CONFIGURATION_REPOSITORY): [11/20] git_username (git): [12/20] git_version (main): [13/20] ip_external (192.168.96.9): [14/20] ip_internal (192.168.32.9): [15/20] manager_version (6.0.2): [16/20] name_server (149.112.112.112): [17/20] ntp_server (de.pool.ntp.org): [18/20] openstack_version (2023.1): [19/20] project_name (configuration): [...] Since we run the cookiecutter inside a container, the user rights are not correct afterwards and have to be changed. sudo chown -R $USER: output/","s":"Creation","u":"/docs/iaas/guides/configuration-guide/configuration-repository","h":"#creation","p":705},{"i":716,"t":"When you want to use latest this is done via the parameter manager_version. By default, this is always set to the current stable version. manager_version [6.0.2]: latest If the manager_version parameter is set to latest it is also possible to explicitly set the openstack_version and the ceph_version.","s":"Use of latest","u":"/docs/iaas/guides/configuration-guide/configuration-repository","h":"#use-of-latest","p":705},{"i":718,"t":"The content is now committed to the previously created Git repository. $ git clone git@github.com:YOUR_ORG/YOUR_NEW_CONFIGURATION_REPOSITORY.git YOUR_NEW_CONFIGURATION_REPOSITORY $ cp -r output/configuration/* output/configuration/.gitignore YOUR_NEW_CONFIGURATION_REPOSITORY $ cd YOUR_NEW_CONFIGURATION_REPOSITORY $ git add .gitignore * $ git commit -m \"Initial commit\" $ git push The secrets directory is not stored in the Git repository. Its contents can be stored in a suitable location. The secrets directory contains an SSH key pair which is used as a deploy key to make the configuration repository available on the manager node later. Write access is not required. The public SSH key is stored in the file secrets/id_rsa.configuration.pub. How to add a deploy key on GitHub is documented in Managing deploy keys.","s":"Make commit","u":"/docs/iaas/guides/configuration-guide/configuration-repository","h":"#make-commit","p":705},{"i":720,"t":"The configuration repository that is initially created with the Cookiecutter is not directly usable. For example, the inventory needs to be built. All further information can be found in the Configuration Guide.","s":"Post-processing","u":"/docs/iaas/guides/configuration-guide/configuration-repository","h":"#post-processing","p":705},{"i":722,"t":"The password for Ansible Vault encrypted files, ist stored at secrets/vaultpass. The password of the generated Keepass file is password. This has to be changed.","s":"Notes","u":"/docs/iaas/guides/configuration-guide/configuration-repository","h":"#notes","p":705},{"i":724,"t":"Parameter Description Default ceph_network_backend Address range for ceph's backend network 192.168.80.0/20 ceph_network_frontend Address range for ceph's frontend network 192.168.64.0/20 ceph_version The version of Ceph. When using a stable OSISM release (manager_version != latest), this value is ignored. quincy domain The domain used by hostnames osism.xyz fqdn_external External API FQDN api.osism.xyz fqdn_internal Internal API FQDN api-int.osism.xyz git_host Address of the used Git server github.com git_port Port of the used Git server 22 git_repository Path to the git configuration repository YOUR_ORG/YOUR_NEW_CONFIGURATION_REPOSITORY git_username Username of the git repository git git_version Git branch name main ip_external The external IP address of the API (resolves to fqdn_external) 192.168.96.9 ip_internal The internal IP address of the API (resolves to fqdn_internal) 192.168.32.9 manager_version The version of OSISM. An overview of available OSISM releases can be found on release.osism.tech. 6.0.2 name_server Nameserver. Only one nameserver is set here because the query of multiple values in Cooiecutter is weird. Add more nameservers afterwards. 149.112.112.112 ntp_server NTP server. Only one NTP server is set here because the query of multiple values in Cooiecutter is weird. Add more NTP servers afterwards. de.pool.ntp.org openstack_version The version of OpenStack. When using a stable OSISM release (manager_version != latest), this value is ignored. 2023.1 project_name Name of the configuration repository directory configuration with_ceph 1 to use Ceph, 0 to not use Ceph 1","s":"Parameters","u":"/docs/iaas/guides/configuration-guide/configuration-repository","h":"#parameters","p":705},{"i":727,"t":"environments/manager/hosts [manager] manager01 environments/manager/host_vars/manager01.yml --- ########################################################## # ansible ansible_host: 192.168.16.5 ########################################################## # generic internal_interface: eno1 ########################################################## # network network_type: netplan network_ethernets: eno1: addresses: - \"192.168.16.10/20\" gateway4: \"192.168.16.1\" mtu: 1500","s":"Manager environment","u":"/docs/iaas/guides/configuration-guide/configuration-repository","h":"#manager-environment","p":705},{"i":729,"t":"inventory/20-roles ########################################################## # roles # NOTE: If netbox is not used, nothing needs to be changed here. In # this case this inventory is used as before. The hosts are # then managed here as normal. # # If netbox is used this file is only used to store the hosts # for the initial import into the netbox. # # After the initial import of the inventory in the netbox, # the groups in this file can be emptied. The systems are # then assigned to their roles via tags in the netbox. # The \"all\" group is not used in OSISM. Therefore it is important # that all nodes are explicitly listed here. [generic] node01 # Nodes that act as manager (sometimes called deployment node) # are included in this group. [manager] manager01 # Nodes which are intended for monitoring services belong to # this group [monitoring] # Nodes that serve as controllers, so things like scheduler, # API or database run there, of the environment. [control] # Virtual systems managed by OpenStack Nova are placed on # nodes in this group. [compute] # Network resources managed by OpenStack Neutron, such as # L3 routers, are placed on these nodes. This group has nothing # to do with the general network configuration. [network] # Nodes that serve as controllers for Ceph, so things like the # Ceph Monitor service run here. [ceph-control] # The storage available in these systems is provided in the # form of OSDs for Ceph. [ceph-resource] # NOTE: These empty groups are only necessary if netbox is used. After # the initial import of the hosts these groups can be commented # out. The groups above with the initial hosts can be commented. # # [generic] # # [manager] # # [monitoring] # # [control] # # [compute] # # [network] # # [ceph-control] # # [ceph-resource] inventory/host_vars/node01.yml --- ########################################################## # ansible # NOTE: Address where the node can be reached via SSH. ansible_host: 192.168.16.10 ########################################################## # generic internal_interface: eno1 # NOTE: The address of the internal interface. internal_address: 192.168.16.10 ########################################################## # netdata netdata_host_type: client # NOTE: Uncomment this when this node should be a Netdata server. # netdata_host_type: server ########################################################## # network # NOTE: This is the initial management interface. Further interfaces # must be added. network_type: netplan network_ethernets: eno1: addresses: - \"192.168.16.10/20\" gateway4: \"192.168.16.1\" mtu: 1500 ########################################################## # kolla network_interface: eno1 # api_interface: # bifrost_network_interface: # dns_interface: # kolla_external_vip_interface: # migration_interface: # neutron_external_interface: # octavia_network_interface: # storage_interface: # tunnel_interface: ########################################################## # ceph # NOTE: Uncomment this when this node is a part of the Ceph cluster. # monitor_address: # radosgw_address: # monitor_interface: # radosgw_interface: # NOTE: Uncomment this when this node should be a OSD node. # devices: # - /dev/sdb # - /dev/sdc # - /dev/sdd # - /dev/sde","s":"Inventory","u":"/docs/iaas/guides/configuration-guide/configuration-repository","h":"#inventory","p":705},{"i":732,"t":"By default, the LimitRequestBody is set to 1073741824 (1 GiB). This is a security feature (CVE-2022-29404) and not a bug. Further details in the A new default for the LimitRequestBody directive in httpd configuration article in the RedHat knowledgebase. This limit can be increased via the parameter horizon_httpd_limitrequestbody. environments/kolla/configuration.yml horizon_httpd_limitrequestbody: 2147483648 # 2 GiB","s":"Problems uploading machine images larger than 1 GiB","u":"/docs/iaas/guides/configuration-guide/openstack/horizon","h":"#problems-uploading-machine-images-larger-than-1-gib","p":730},{"i":735,"t":"It is recommended to use a stable release of OSISM. All available releases are listed on release.osism.tech. Always check there in advance and do not copy the stable release used here as an example. In the example, OSISM release 6.0.0 is used. Sync the image versions in the configuration repository. It is important to do this so that the correct versions are available in environments/manager/images.yml. gilt overlay # you have to do this 2x gilt overlay Optionally, this is normally not necessary, it is possible to reference a specific tag of the osism/cfg-generics repository. To do this, first check which version of osism/cfg-generics is used in a particular release. The version is defined in generics_version in the base.yml file in the osism/release repository. For OSISM 6.0.0, for example, this is version v0.20230919.0. This version is then added to the file gilt.yml in the configuration repository instead of main at version. This change must be made again after each execution of gilt overlay as it is overwritten by the call of gilt overlay. This cannot be realized differently in the current implementation of Gilt. Set the new manager version in the configuration repository. yq -i '.manager_version = \"6.0.0\"' environments/manager/configuration.yml If openstack_version or ceph_version are set in environments/manager/configuration.yml (or anywhere else), they must be removed. If these are set, the stable release is not used for these components. Commit and push changes in the configuration repository. Since everyone here has their own workflows for changes to the configuration repository, only a generic example for Git. git commit -a -s -m \"manager: use OSISM version 6.0.0\" git push","s":"Stable release","u":"/docs/iaas/guides/configuration-guide/manager","h":"#stable-release","p":733},{"i":737,"t":"With the command osism log opensearch it is possible to send SQL queries to the OpenSearch service. For the command to be functional, the OpenSearch integration must be activated in the manager environment and the OpenSearch address and port must be set. environments/manager/configuration.yml manager_opensearch_enable: true manager_opensearch_address: api-int.testbed.osism.xyz manager_opensearch_port: 9200 manager_opensearch_protocol: https The integration can also be enabled later. osism update manager is then executed after the configuration has been changed.","s":"OpenSearch integration","u":"/docs/iaas/guides/configuration-guide/manager","h":"#opensearch-integration","p":733},{"i":739,"t":"If the Baremetal Service Integration in OSISM is used, the OpenStack Broker integration is required. The integration itself is activated by setting the parameter enable_listener to true. The hosts in the manager_listener_broker_hosts list are the control nodes of OpenStack. The user is set via manager_listener_broker_username. On OpenStack's RabbitMQ broker, the user openstack is present by default. environments/manager/configuration.yml enable_listener: true manager_listener_broker_hosts: - 192.168.16.10 - 192.168.16.11 - 192.168.16.12 manager_listener_broker_username: openstack manager_listener_broker_uri: \"{% for host in manager_listener_broker_hosts %}amqp://{{ manager_listener_broker_username }}:{{ manager_listener_broker_password }}@{{ host }}:5672/{% if not loop.last %};{% endif %}{% endfor %}\" The password used when using the openstack user is rabbitmq_password from environments/kolla/secrets.yml. environments/manager/secrets.yml manager_listener_broker_password: RABBITMQ_PASSWORD","s":"OpenStack broker integration","u":"/docs/iaas/guides/configuration-guide/manager","h":"#openstack-broker-integration","p":733},{"i":741,"t":"########################################################## # proxy docker_configure_proxy: true docker_proxy_http: \"http://{{ groups['manager'][0] }}:3128\" docker_proxy_https: \"{{ docker_proxy_http }}\" proxy_proxies: http: \"http://{{ groups['manager'][0] }}:3128\" https: \"http://{{ groups['manager'][0] }}:3128\"","s":"Proxy","u":"/docs/iaas/guides/configuration-guide/proxy","h":"","p":740},{"i":744,"t":"Parameter Default Description network_interface eth0 neutron_external_interface {{ network_interface }} kolla_external_vip_interface {{ network_interface }} api_interface {{ network_interface }} migration_interface {{ api_interface }} tunnel_interface {{ network_interface }} octavia_network_interface {{ 'o-hm0' if octavia_network_type == 'tenant' else api_interface }} dns_interface {{ network_interface }} dpdk_tunnel_interface {{ neutron_external_interface }} ironic_http_interface {{ api_interface }} ironic_tftp_interface {{ api_interface }}","s":"Network interfaces","u":"/docs/iaas/guides/configuration-guide/openstack/","h":"#network-interfaces","p":742},{"i":746,"t":"It is explained with example of OpenSearch Service how the configuration for OpenSearch is created and gets into the container. The task Copying over opensearch service config file merges the individual sources of the files. Copying over opensearch service config file task - name: Copying over opensearch service config file merge_yaml: sources: - \"{{ role_path }}/templates/opensearch.yml.j2\" - \"{{ node_custom_config }}/opensearch.yml\" - \"{{ node_custom_config }}/opensearch/opensearch.yml\" - \"{{ node_custom_config }}/opensearch/{{ inventory_hostname }}/opensearch.yml\" dest: \"{{ node_config_directory }}/opensearch/opensearch.yml\" mode: \"0660\" become: true when: - inventory_hostname in groups['opensearch'] - opensearch_services['opensearch'].enabled | bool notify: - Restart opensearch container As a basis a template opensearch.yml.j2 is used which is part of the OpenSearch service role. opensearch.yml.j2 template {% set num_nodes = groups['opensearch'] | length %} {% set recover_after_nodes = (num_nodes * 2 / 3) | round(0, 'floor') | int if num_nodes > 1 else 1 %} plugins.security.disabled: \"true\" node.name: \"{{ 'api' | kolla_address | put_address_in_context('url') }}\" network.host: \"{{ 'api' | kolla_address | put_address_in_context('url') }}\" cluster.name: \"{{ opensearch_cluster_name }}\" cluster.initial_master_nodes: [{% for host in groups['opensearch'] %}\"{{ 'api' | kolla_address(host) }}\"{% if not loop.last %},{% endif %}{% endfor %}] node.master: true node.data: true discovery.seed_hosts: [{% for host in groups['opensearch'] %}\"{{ 'api' | kolla_address(host) | put_address_in_context('url') }}\"{% if not loop.last %},{% endif %}{% endfor %}] http.port: {{ opensearch_port }} gateway.expected_nodes: {{ num_nodes }} gateway.recover_after_time: \"5m\" gateway.recover_after_nodes: {{ recover_after_nodes }} path.data: \"/var/lib/opensearch/data\" path.logs: \"/var/log/kolla/opensearch\" indices.fielddata.cache.size: 40% action.auto_create_index: \"true\" For OpenSearch, overlay files can additionally be stored in 3 places in the configuration repository. environments/kolla/files/overlays/opensearch.yml environments/kolla/files/overlays/opensearch/opensearch.yml environments/kolla/files/overlays/opensearch/{{ inventory_hostname }}/opensearch.yml When merging files, the last file found has the most weight. If there is a parameter node.master: true in the service role template opensearch.yml.j2 of the OpenSearch service and you set e.g. node.master: false in environments/kolla/files/overlays/opensearch.yml then accordingly in the finished opensearch.yml node.master: false is used. After the merge the task Copying over opensearch service config file copies the content into the configuration directory /etc/kolla/opensearch of the service. /etc/kolla/opensearch/opensearch.yml action.auto_create_index: 'true' cluster.initial_master_nodes: - 192.168.16.10 cluster.name: kolla_logging discovery.seed_hosts: - 192.168.16.10 gateway.expected_nodes: 1 gateway.recover_after_nodes: 1 gateway.recover_after_time: 5m http.port: 9200 indices.fielddata.cache.size: 40% network.host: 192.168.16.10 node.data: true node.master: true node.name: 192.168.16.10 path.data: /var/lib/opensearch/data path.logs: /var/log/kolla/opensearch plugins.security.disabled: 'true' The configuration directory /etc/kolla/opensearch is mounted in each container of the OpenSearch service to /var/lib/kolla/config_files. Output of docker inspect opensearch \"Mounts\": [ { \"Type\": \"bind\", \"Source\": \"/etc/kolla/opensearch\", \"Destination\": \"/var/lib/kolla/config_files\", \"Mode\": \"rw\", \"RW\": true, \"Propagation\": \"rprivate\" }, Entrypoint of a service is always kolla_start. This script calls a script set_configs.py. This script takes care of copying files from /var/lib/kolla/config_files to the right place inside the container. For this purpose, the container has a config.json in which the individual actions are configured. The file /var/lib/kolla/config_files/opensearch.yml is copied to /etc/opensearch/opensearch.yml. The permissions of /var/lib/opensearch and /var/log/kolla/opensearch are set accordingly. /etc/kolla/opensearch/config.json { \"command\": \"/usr/share/opensearch/bin/opensearch\", \"config_files\": [ { \"source\": \"/var/lib/kolla/config_files/opensearch.yml\", \"dest\": \"/etc/opensearch/opensearch.yml\", \"owner\": \"opensearch\", \"perm\": \"0600\" } ], \"permissions\": [ { \"path\": \"/var/lib/opensearch\", \"owner\": \"opensearch:opensearch\", \"recurse\": true }, { \"path\": \"/var/log/kolla/opensearch\", \"owner\": \"opensearch:opensearch\", \"recurse\": true } ] } In the config.json of the service is also defined the command which will be executed after finishing the preparations. In the case of OpenSearch this is /usr/share/opensearch/bin/opensearch. /etc/kolla/opensearch/config.json { \"command\": \"/usr/share/opensearch/bin/opensearch\", \"config_files\": [ { \"source\": \"/var/lib/kolla/config_files/opensearch.yml\", \"dest\": \"/etc/opensearch/opensearch.yml\", \"owner\": \"opensearch\", \"perm\": \"0600\" } ], \"permissions\": [ { \"path\": \"/var/lib/opensearch\", \"owner\": \"opensearch:opensearch\", \"recurse\": true }, { \"path\": \"/var/log/kolla/opensearch\", \"owner\": \"opensearch:opensearch\", \"recurse\": true } ] }","s":"How does the configuration get into services?","u":"/docs/iaas/guides/configuration-guide/openstack/","h":"#how-does-the-configuration-get-into-services","p":742},{"i":749,"t":"SCS Standard Track SCS Standard SCS Documentation IAM scs-0302 Domain Manager configuration for Keystone To configure and use the domain manager role from the SCS project, the environments/kolla/files/overlays/keystone/policy.yaml file is created in the configuration repository. The deployment and upgrade of the Keystone service itself is then done as usual. environments/kolla/files/overlays/keystone/policy.yaml # classify domain managers with a special role \"is_domain_manager\": \"role:domain-manager\" # specify a rule that whitelists roles which domain admins are permitted # to assign and revoke within their domain \"is_domain_managed_role\": \"'member':%(target.role.name)s or 'load-balancer_member':%(target.role.name)s or 'creator':%(target.role.name)s\" # allow domain admins to retrieve their own domain \"identity:get_domain\": \"(rule:is_domain_manager and token.domain.id:%(target.domain.id)s) or rule:admin_required\" # list_domains is needed for GET /v3/domains?name=... requests # this is mandatory for things like # `create user --domain $DOMAIN_NAME $USER_NAME` to correctly discover # domains by name \"identity:list_domains\": \"rule:is_domain_manager or rule:admin_required\" # list_roles is needed for GET /v3/roles?name=... requests # this is mandatory for things like `role add ... $ROLE_NAME`` to correctly # discover roles by name \"identity:list_roles\": \"rule:is_domain_manager or rule:admin_required\" # get_role is needed for GET /v3/roles/{role_id} requests # this is mandatory for the OpenStack SDK to properly process role assignments # which are issued by role id instead of name \"identity:get_role\": \"(rule:is_domain_manager and rule:is_domain_managed_role) or rule:admin_required\" # allow domain admins to manage users within their domain \"identity:list_users\": \"(rule:is_domain_manager and token.domain.id:%(target.domain_id)s) or rule:admin_required\" \"identity:get_user\": \"(rule:is_domain_manager and token.domain.id:%(target.user.domain_id)s) or rule:admin_required\" \"identity:create_user\": \"(rule:is_domain_manager and token.domain.id:%(target.user.domain_id)s) or rule:admin_required\" \"identity:update_user\": \"(rule:is_domain_manager and token.domain.id:%(target.user.domain_id)s) or rule:admin_required\" \"identity:delete_user\": \"(rule:is_domain_manager and token.domain.id:%(target.user.domain_id)s) or rule:admin_required\" # allow domain admins to manage projects within their domain \"identity:list_projects\": \"(rule:is_domain_manager and token.domain.id:%(target.domain_id)s) or rule:admin_required\" \"identity:get_project\": \"(rule:is_domain_manager and token.domain.id:%(target.project.domain_id)s) or rule:admin_required\" \"identity:create_project\": \"(rule:is_domain_manager and token.domain.id:%(target.project.domain_id)s) or rule:admin_required\" \"identity:update_project\": \"(rule:is_domain_manager and token.domain.id:%(target.project.domain_id)s) or rule:admin_required\" \"identity:delete_project\": \"(rule:is_domain_manager and token.domain.id:%(target.project.domain_id)s) or rule:admin_required\" \"identity:list_user_projects\": \"(rule:is_domain_manager and token.domain.id:%(target.user.domain_id)s) or user_id:%(user_id)s or rule:admin_required\" # allow domain managers to manage role assignments within their domain # (restricted to specific roles by the 'is_domain_managed_role' rule) # # project-level role assignment to user within domain \"is_domain_user_project_grant\": \"token.domain.id:%(target.user.domain_id)s and token.domain.id:%(target.project.domain_id)s and rule:is_domain_managed_role\" # project-level role assignment to group within domain \"is_domain_group_project_grant\": \"token.domain.id:%(target.group.domain_id)s and token.domain.id:%(target.project.domain_id)s and rule:is_domain_managed_role\" # domain-level role assignment to group \"is_domain_level_group_grant\": \"token.domain.id:%(target.group.domain_id)s and token.domain.id:%(target.domain.id)s and rule:is_domain_managed_role\" # domain-level role assignment to user \"is_domain_level_user_grant\": \"token.domain.id:%(target.user.domain_id)s and token.domain.id:%(target.domain.id)s and rule:is_domain_managed_role\" \"domain_manager_grant\": \"rule:is_domain_manager and (rule:is_domain_user_project_grant or rule:is_domain_group_project_grant or rule:is_domain_level_group_grant or rule:is_domain_level_user_grant)\" \"identity:check_grant\": \"rule:domain_manager_grant or rule:admin_required\" \"identity:list_grants\": \"rule:domain_manager_grant or rule:admin_required\" \"identity:create_grant\": \"rule:domain_manager_grant or rule:admin_required\" \"identity:revoke_grant\": \"rule:domain_manager_grant or rule:admin_required\" \"identity:list_role_assignments\": \"(rule:is_domain_manager and token.domain.id:%(target.domain_id)s) or rule:admin_required\" # allow domain managers to manage groups within their domain \"identity:list_groups\": \"(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s) or rule:admin_required\" \"identity:get_group\": \"(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s) or rule:admin_required\" \"identity:create_group\": \"(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s) or rule:admin_required\" \"identity:update_group\": \"(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s) or rule:admin_required\" \"identity:delete_group\": \"(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s) or rule:admin_required\" \"identity:list_groups_for_user\": \"(rule:is_domain_manager and token.domain.id:%(target.user.domain_id)s) or rule:admin_required\" \"identity:list_users_in_group\": \"(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s) or rule:admin_required\" \"identity:remove_user_from_group\": \"(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s and token.domain.id:%(target.user.domain_id)s) or rule:admin_required\" \"identity:check_user_in_group\": \"(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s and token.domain.id:%(target.user.domain_id)s) or rule:admin_required\" \"identity:add_user_to_group\": \"(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s and token.domain.id:%(target.user.domain_id)s) or rule:admin_required\" The role domain-manager is created using the OpenStack CLI. Alternatively, the role can be added using Ansible or other tools. $ openstack --os-cloud admin \\ role create \\ --or-show \\ --description \"Domain Manager Role\" \\ domain-manager +-------------+----------------------------------+ | Field | Value | +-------------+----------------------------------+ | description | Domain Manager Role | | domain_id | None | | id | 9b7140bfe628468ab9b86b365f9ac4c2 | | name | domain-manager | | options | {} | +-------------+----------------------------------+ A user can then be made a domain manager for a particular domain by assigning this role. $ openstack --os-cloud admin \\ role add \\ --user test \\ --domain test \\ domain-manager","s":"Domain manager role","u":"/docs/iaas/guides/configuration-guide/openstack/keystone","h":"#domain-manager-role","p":747},{"i":754,"t":"environments/kolla/files/overlays/horizon/custom_local_settings OPENSTACK_SSL_NO_VERIFY = True","s":"Horizon","u":"/docs/iaas/guides/configuration-guide/self-signed-certificates","h":"#horizon","p":751},{"i":756,"t":"This section contains the documentation of the Ansible collection osism.services.","s":"Services","u":"/docs/iaas/guides/configuration-guide/services/","h":"","p":755},{"i":758,"t":"💡 The Deploy Guide describe how to provision, bootstrap and deploy nodes and services. A classification is made for services. For example, all infrastructure services such as RabbitMQ or MariaDB are covered in the infrastructure section of the services chapter. The manager node is handled in a separate chapter because it must be handled differently when building a new environment. Before deploying services to nodes, they must all be bootstrapped. This is covered in the bootstrap chapter. The guide always assume that a node is already initially accessible via SSH and only needs to be bootstrapped and integrated into the environment. Deploying bare-metal nodes with an operating system is documented in the provisioning chapter. In the examples, the pull of images (if supported by a role) is always run first. While this is optional, it is recommended to speed up the execution of the deploy action in the second step. This significantly reduces the times required for the restart from a service.","s":"Deploy Guide","u":"/docs/iaas/guides/deploy-guide/","h":"","p":757},{"i":760,"t":"OSISM is deployed in a series of successive phases. The phases are documented in this guide. Creation of a configuration repository Preparation of a seed node Preparation of a manager node Provisioning of the bare-metal nodes Bootstrap of the bare-metal nodes Deployment of the services","s":"Getting started","u":"/docs/iaas/guides/deploy-guide/","h":"#getting-started","p":757},{"i":763,"t":"Before the nodes can be bootstrapped, they must all have already been provisioned. The guide for this can be found in the section Provisioning of management and control plane nodes The following steps are applied to bootstrap all nodes. After the completion of the bootstrap, the nodes are already ready for use. Create operator user. osism apply operator -u osism When using the osism/node-image the user is osism and the password of this user is password. If you install Ubuntu manually the user usually is ubuntu. If you want to use any other user here, that's no problem. It is important that this user has sudo rights. The password according to what you have set yourself. The operator public SSH key has to be added in advance on all nodes to authorized_keys file of the user specified with -u. This key is stored as operator_public_key in the file environments/configuration.yml. Alternatively (not recommended), the password can be stored in plain text in a file /opt/configuration/secrets/conn_password. The parameter --conn-pass-file /opt/configuration/secrets/conn_password must then also be specified: osism apply operator -u osism \\ --conn-pass-file /opt/configuration/secrets/conn_password It is important that this user has sudo rights with NOPASSWD. Alternatively (not recommended), the password can be stored in plain text in a file /opt/configuration/secrets/become_password. The parameter --become-pass-file /opt/configuration/secrets/become_password must then also be specified: osism apply operator -u osism \\ --become-pass-file /opt/configuration/secrets/become_password If a password is required for both sudo and login, use both arguments at the same time. osism apply operator -u osism \\ --become-pass-file /opt/configuration/secrets/become_password \\ --conn-pass-file /opt/configuration/secrets/conn_password When using the osism/node-image the user is osism and the password of this user is password. If you install Ubuntu manually the user usually is ubuntu. The password according to what you have set yourself Proxy deployment (optional). This is only necessary if you use the proxy on the manager to enable external access to the nodes. osism apply squid Proxy configuration (optional). This is only necessary if you use the proxy on the manager to enable external access to the nodes. osism apply proxy Network configuration. It is recommended to backup the existing network configuration. osism apply network Reboot (optional). The reboot at this point is recommended to ensure that the network configuration is working. osism apply reboot -l 'all:!manager' -e ireallymeanit=yes Check if all systems are reachable (you probably have to do this several times until all systems are accessible). osism apply ping System is currently rebooting and is not yet accessible via network. fatal: [net003]: UNREACHABLE! => {\"changed\": false, \"msg\": \"Connection timed out.\", \"unreachable\": true}`` System has already been rebooted and is not accessible via the network. fatal: [net003]: UNREACHABLE! => {\"changed\": false, \"msg\": \"EOF on stream; last 100 lines received:\\nssh: connect to host 10.15.0.33 port 22: No route to host\\r\", \"unreachable\": true} Refresh facts. osism apply facts Bootstrap. osism apply bootstrap Reboot (non-optional). Since the kernel version often changes after the initial bootstrap, the reboot should always be performed. osism apply reboot -l 'all:!manager' -e ireallymeanit=yes Prepare the SSH configuration of the manager node. osism apply sshconfig Make all SSH public keys known. osism apply known-hosts Check again if all systems are reachable (you probably have to do this several times until all systems are accessible). osism apply ping Ready. All nodes are now bootstrapped and available to deploy services.","s":"Bootstrap","u":"/docs/iaas/guides/deploy-guide/bootstrap","h":"","p":762},{"i":765,"t":"Change into the configuration/environments/manager directory of the configuration repository. on the seed node. The deployment of the seed node is documented in the Deploy Guide for the seed node. cd configuration/environments/manager","s":"Manager","u":"/docs/iaas/guides/deploy-guide/manager","h":"","p":764},{"i":767,"t":"The operator user is created on each node. It is used as a service account for OSISM. All containers run with this user. Ansible also uses this user to access the nodes. Commands on the manager node need to be run as this user. The name of the operator user is always dragon. With ANSIBLE_USER the existing user account is set after the provsioning of the management node. When using the osism/node-image the user is osism and the password of this user is password. If you install Ubuntu manually the user usually is ubuntu. If you want to use any other user here, that's no problem. It is important that this user has sudo rights. The password according to what you have set yourself. ANSIBLE_BECOME_ASK_PASS=True \\ ANSIBLE_ASK_VAULT_PASS=True \\ ANSIBLE_ASK_PASS=True \\ ANSIBLE_USER=osism \\ ./run.sh operator When the ./run.sh operator is executed, the following prompts are displayed. Prompt Value Comment SSH password: Password so that the ANSIBLE_USER can login Enabled by ANSIBLE_ASK_PASS BECOME password[defaults to SSH password]: Password so that the ANSIBLE_USER can use sudo Enabled by ANSIBLE_BECOME_ASK_PASS Vault password: Value of secrets/vaultpass Enabled by ANSIBLE_ASK_VAULT_PASS If a password is required to login to the manager node, ANSIBLE_ASK_PASS=True must be set. If an SSH key is required to login to the manager node, the key has to be added on the manager node to ~/.ssh/authorized_keys in the home directory of the user specified as ANSIBLE_USER first. If the error ERROR! Attempting to decrypt but no vault secrets found occurs, ANSIBLE_ASK_VAULT_PASS=True has to be set. If the error /bin/sh: 1: /usr/bin/python: not found occurs, Python has to be installed first on the manager node: ANSIBLE_USER=osism ./run.sh python3 If you receive the following error message ssh: Too many authentication failures set ANSIBLE_SSH_ARGS environment variable to use only the operator ssh key for authentication. export ANSIBLE_SSH_ARGS=\"-o IdentitiesOnly=yes\" The warning message [WARNING]: running playbook inside collection osism.manager can be ignored If Ansible Vault is used, let Ansible ask for the Vault password: export ANSIBLE_ASK_VAULT_PASS=True Details on all parameters can be found in Ansible Configuration Settings in the Ansible documentation. Environment variable Type Description ANSIBLE_ASK_PASS Boolean This controls whether an Ansible playbook should prompt for a login password. If using SSH keys for authentication, you probably do not need to change this setting. ANSIBLE_ASK_VAULT_PASS Boolean This controls whether an Ansible playbook should prompt for a vault password. ANSIBLE_BECOME_ASK_PASS Boolean Toggle to prompt for privilege escalation password. ANSIBLE_SSH_ARGS String If set, this will override the Ansible default ssh arguments. ANSIBLE_USER String The user Ansible ‘logs in’ as. To verify the creation of the operator user, use the private key file id_rsa.operator. Make sure you purge all keys from ssh-agent identity cache using ssh-add -D. You can print the list using ssh-add -l. The list should be empty. ssh-add -D ssh -o IdentitiesOnly=yes -i id_rsa.operator dragon@testbed-manager","s":"Create operator user","u":"/docs/iaas/guides/deploy-guide/manager","h":"#create-operator-user","p":764},{"i":769,"t":"Most of the parameters required for Ansible (ANSIBLE_BECOME_ASK_PASS, ANSIBLE_ASK_PASS, ANSIBLE_USER, ...) in the previous step are no longer necessary. If Ansible Vault is used, however, ANSIBLE_ASK_VAULT_PASS must still be set. export ANSIBLE_ASK_VAULT_PASS=True To prevent recurring installation of Ansible Collections, export INSTALL_ANSIBLE_ROLES=False can be set. The network configuration, already present on a node should be backuped before this step. Then you can deploy the network configuration with the network role. ./run.sh network Upon completion of the network configurtion, a node reboot should be performed to ensure the configuration is functional and reboot safe. Since network services are not restarted automatically, later changes to the network configuration are not effective without a manual apply of the network configuration or reboot of the nodes.","s":"Apply the network configuration","u":"/docs/iaas/guides/deploy-guide/manager","h":"#apply-the-network-configuration","p":764},{"i":771,"t":"Most of the parameters required for Ansible (ANSIBLE_BECOME_ASK_PASS, ANSIBLE_ASK_PASS, ANSIBLE_USER, ...) in the previous step are no longer necessary. If Ansible Vault is used, however, export ANSIBLE_ASK_VAULT_PASS=True must still be set. To prevent recurring installation of Ansible Collections, export INSTALL_ANSIBLE_ROLES=False can be set. This is recommended. Bootstrap the manager node. ./run.sh bootstrap Reboot the manager node. ./run.sh reboot","s":"Bootstrap","u":"/docs/iaas/guides/deploy-guide/manager","h":"#bootstrap","p":764},{"i":773,"t":"Transfer the configuration repository. ./run.sh configuration Deploy the Traefik service. This is optional and only necessary if the Traefik service is to be used. ./run.sh traefik Deploy the Netbox service. This is optional and only necessary if the Netbox service is to be used. ./run.sh netbox Deploy the manager service. ./run.sh manager Finally, the Ansible Vault password is made known on the manager node. osism set vault password Ansible Vault password: ******** Ready. The manager is now prepared and you can continue with the bootstrap of the other nodes. The seed node used until here is no longer necessary.","s":"Deploy","u":"/docs/iaas/guides/deploy-guide/manager","h":"#deploy","p":764},{"i":775,"t":"💡 With the OSISM Testbed, it is possible to run a full Sovereign Cloud Stack deployment on an existing OpenStack environment such as Cleura or REGIO.cloud. OSISM is the reference implementation for the infrastructure as a service layer in the Sovereign Cloud Stack (SCS) project. The OSISM Testbed is therefore used in the SCS project to test and work on the Instrastructure as a Service layer. The OSISM Testbed is intended as a playground. Further services and integration will be added over time. More and more best practices and experiences from the productive deployments will be included here in the future. It will become more production-like over time. However, at no point does it claim to represent a production setup exactly.","s":"Testbed","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"","p":774},{"i":778,"t":"The prerequisite is to have an account on one of the supported OpenStack cloud providers. It is not part of this guide to describe the registration with the individual cloud providers. Please contact the respective cloud provider for this. Product Provider Profile name Cleura Cleura cleura Fuga Cloud FUGA fuga HuaweiCloud HuaweiCloud huaweicloud OVH OVH ovh OpenTelekomCloud T-Systems otc pluscloud open plusserver pluscloudopen REGIO.cloud OSISM regiocloud Wavestack noris network wavestack For each provider listed in the table, a predefined profile is available in the terraform/environments directory. This profile contains the name of the public network, which flavors to use, etc. Here is an example from the profile for REGIO.cloud. flavor_manager = \"SCS-4V-8-50\" flavor_node = \"SCS-8V-32-100\" volume_type = \"ssd\" image = \"Ubuntu 22.04\" image_node = \"Ubuntu 22.04\" public = \"public\" availability_zone = \"nova\" volume_availability_zone = \"nova\" network_availability_zone = \"nova\"","s":"Cloud access","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#cloud-access","p":774},{"i":780,"t":"The OSISM Testbed requires at least the following project quota when using the default flavors: Resource Quantity Note 4 Instances 28 VCPUs + 104 GByte RAM 9 Volumes 90 GByte volume storage 1 Floating IP 1 Keypair 3 Security group 16 Security group rules 1 Network 1 Subetwork 6 Ports 1 Router","s":"Cloud resources","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#cloud-resources","p":774},{"i":783,"t":"make must be installed on the system yq must be installed on the system. yq is a portable command-line YAML, JSON, XML, CSV, TOML and properties processor. Ansible in a current version must be installed and usable on the local workstation. Currently Ansible 8 is supported. Information on installing Ansible can be found in the Ansible documentation Terraform in a current version must be installed and usable on the local workstation. Currently Terraform 1.5 is supported. Information on installing Terraform can be found in the Terraform documentation","s":"Software","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#software","p":774},{"i":785,"t":"The OSISM Testbed installation currently uses hostnames in the domain testbed.osism.xyz. This is a real domain and we provide the DNS records matching the addresses used in the OSISM Testbed, so that once you connect to your testbed via a direct link or Wireguard, you can access hosts and servers by their hostname (e.g. ssh testbed-manager.testbed.osism.xyz). We also provide a wildcard TLS certificate signed by a custom CA for testbed.osism.xyz and *.testbed.osism.xyz. This CA is always used for each testbed. The CA is not regenerated and it is not planned to change this for the next 10 years. In order for these certificates to be recognized locally as valid, the CA environments/kolla/certificates/ca/testbed.crt must be imported locally.","s":"Custom CA","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#custom-ca","p":774},{"i":787,"t":"This section describes step by step how to deploy the OSISM Testbed. Clone the osism/testbed repository. The repository can also be cloned to any other location. mkdir -p ~/src/github.com/osism git clone https://github.com/osism/testbed ~/src/github.com/osism/testbed cd ~/src/github.com/osism/testbed The access data for the cloud provider used is then stored in terraform/clouds.yaml. The clouds.yaml file is provided by the cloud provider used. Please check the documentation of the cloud provider you are using or their support for details. REGIO.cloud is used as an example. The cloud name in clouds.yaml and the environment name (value of ENVIRONMENT) are regiocloud in this case. If another cloud is used, replace regioclodu with the respective profile name from the table above. clouds: regiocloud: auth: auth_url: https://keystone.services.a.regiocloud.tech/v3 project_name: PROJECT username: USERNAME password: PASSWORD project_domain_name: DOMAIN user_domain_name: DOMAIN The use of application credentials is preferred. This way it is not necessary to store details like username or project name or sensitive information like the password in the clouds.yaml file. The application credentials can be found in Horizon under Identity. Use OSISM testbed as name and click Create Application Credential. The clouds.yaml file of REGIO.cloud can be used as an example for the use of application credentials. With another cloud provider, only the auth_url must then be changed accordingly. clouds: regiocloud: auth: auth_url: https://keystone.services.a.regiocloud.tech/v3 application_credential_id: ID application_credential_secret: SECRET auth_type: \"v3applicationcredential\" Prepare the deployment. The versions of Ansible and Terraform are checked and necessary dependencies are cloned. make prepare Create the infrastructure with Terraform. make ENVIRONMENT=regiocloud create Deploy the OSISM manager and bootstrap all nodes. make ENVIRONMENT=regiocloud manager Deploy all services. Depending on the cloud, the installation will take some time. Up to two hours is not unusual. In this step, Ceph, OpenStack and all necessary infrastructure services (MariaDB, RabbitMQ, ...) are deployed. make ENVIRONMENT=regiocloud deploy Alternatively, it is also possible to deploy the services step by step directly on the manager. To do this, first log in to the manager with make ENVIRONMENT=regiocloud login and then execute the deploy scripts one after the other. It is recommended to do this within a screen session. /opt/configuration/scripts/deploy/001-helper-services.sh /opt/configuration/scripts/deploy/100-ceph-services-basic.sh /opt/configuration/scripts/deploy/200-infrastructure-services-basic.sh /opt/configuration/scripts/deploy/300-openstack-services-basic.sh /opt/configuration/scripts/deploy/400-monitoring-services.sh Deploying the services takes some time and depends on how much bandwidth is available, how the instances are equipped, etc. 90-120 minutes is not unusual when Ceph and OpenStack are fully deployed. After the deployment, you can log in to the manager via SSH. make ENVIRONMENT=regiocloud login If you want you can create a test project with a test user after login. It also creates an instance with a volume attached to a network with a router. osism apply --environment openstack test When the OSISM Testbed is no longer needed, it can be deleted. make ENVIRONMENT=regiocloud clean","s":"Getting Started","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#getting-started","p":774},{"i":789,"t":"This section describes how to configure and customise the OSISM Testbed.","s":"Configuration","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#configuration","p":774},{"i":791,"t":"The defaults for the Terraform variables are intended for REGIO.cloud. Variable Default Description availability_zone nova ceph_version quincy cloud_provider regiocloud configuration_version main deploy_monitoring false dns_nameservers [\"8.8.8.8\", \"9.9.9.9\"] enable_config_drive true flavor_manager SCS-4V-8-50 flavor_node SCS-8V-32-50 image Ubuntu 22.04 manager_version latest network_availability_zone nova number_of_nodes 3 number_of_volumes 3 openstack_version 2023.1 prefix testbed public external refstack false volume_availability_zone nova volume_size_base 30 volume_size_storage 10 volume_type __DEFAULT__","s":"Variables","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#variables","p":774},{"i":793,"t":"Name Description manager_boot_from_image manager_boot_from_volume neutron_availability_zone_hints_network neutron_availability_zone_hints_router neutron_router_enable_snat nodes_boot_from_image nodes_boot_from_volume nodes_use_ephemeral_storage","s":"Overrides","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#overrides","p":774},{"i":795,"t":"Name Description access_floatingip access_ipv4 access_ipv6 default neutron_floatingip","s":"Customisations","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#customisations","p":774},{"i":798,"t":"Copy the /home/dragon/wireguard-client.conf file to your workstation. This is necessary for using the web endpoints on your workstation. Rename the wireguard config file to something like testbed.conf. If you want to connect to the OSISM Testbed from multiple clients, change the client IP address in the config file to be different on each client. scp dragon@IP_FROM_YOUR_SERVER:/home/dragon/wireguard-client.conf /home/ubuntu/testbed.conf Install wireguard on your workstation, if you have not done this before. For instructions how to do it on your workstation, please have a look on the documentation of your used distribution. The wireguard documentation you will find here. Start the wireguard tunnel. wg-quick up /home/ubuntu/testbed.conf If you do not want to use Wireguard you can also work with sshuttle. make sshuttle ENVIRONMENT=regiocloud","s":"VPN access","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#vpn-access","p":774},{"i":800,"t":"All SSL enabled services within the OSISM Testbed use certs which are signed by the self-signed OSISM Testbed CA. If you want to access the services please choose the URL from the following table. Name URL Username Password Note ARA https://ara.testbed.osism.xyz/ ara password Ceph https://api-int.testbed.osism.xyz:8140 admin password Flower https://api-int.testbed.osism.xyz:8140 Grafana https://api-int.testbed.osism.xyz:3000 admin password Homer https://homer.testbed.osism.xyz Horizon (via Keystone) https://api.testbed.osism.xyz admin password domain: default Horizon (via Keystone) https://api.testbed.osism.xyz test test domain: test Horizon (via Keycloak) https://api.testbed.osism.xyz alice password Keycloak https://keycloak.testbed.osism.xyz admin password Kibana https://api.testbed.osism.xyz:5601 kibana password Netbox https://netbox.testbed.osism.xyz/ admin password Netdata https://testbed-manager.testbed.osism.xyz:19999 Patchman https://patchman.testbed.osism.xyz/ patchman password Prometheus https://api-int.testbed.osism.xyz:9091/ phpMyAdmin https://phpmyadmin.testbed.osism.xyz root password RabbitMQ https://api-int.testbed.osism.xyz:15672/ openstack BO6yGAAq9eqA7IKqeBdtAEO7aJuNu4zfbhtnRo8Y","s":"Webinterfaces","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#webinterfaces","p":774},{"i":802,"t":"Authentication with OpenID Connect (OIDC) is possible via Keycloak, which is automatically configured for the OIDC mechanism. OpenStack web dashboard (Horizon) login via OIDC​ For logging in via OIDC, open your browser at OpenStack Dashboard Login Page, select Authenticate via Keycloak, after being redirected to the Keycloak login page, perform the login with the credentials alice and password. After that you will be redirected back to the Horizon dashboard, where you will be logged in with the user alice. OpenStack web dashboard (Horizon) logout​ Keep in mind, that clicking Sign Out on the Horizon dashboard currently doesn't revoke your OIDC token, and any consequent attempt to Authenticate via Keycloak will succeed without providing the credentials. The expiration time of the Single Sign On tokens can be controlled on multiple levels in Keycloak. On realm level under Realm Settings > Tokens. Assuming the keycloak_realm ansible variable is the default osism, and keycloak is listening on keycloak.testbed.osism.xyz, then the configuration form is available here. Detailed information is available in the Keycloak Server Administrator Documentation Session and Token Timeouts section. In a realm down on the client level select the client (keystone), and under Settings > Advanced Settings. It is recommended to keep the Access Token Lifespan on a relatively low value, with the trend of blocking third party cookies. For further information see the Keycloak documentation's Browsers with Blocked Third-Party Cookies section. OpenStack CLI operations with OpenID Connect password​ Using the OpenStack cli is also possible via OIDC, assuming you provisioned the user alice with password password, then you can perform a simple project list operation like this: openstack \\ --os-cacert /etc/ssl/certs/ca-certificates.crt \\ --os-auth-url https://api.testbed.osism.xyz:5000/v3 \\ --os-auth-type v3oidcpassword \\ --os-client-id keystone \\ --os-client-secret 0056b89c-030f-486b-a6ad-f0fa398fa4ad \\ --os-username alice \\ --os-password password \\ --os-identity-provider keycloak \\ --os-protocol openid \\ --os-identity-api-version 3 \\ --os-discovery-endpoint https://keycloak.testbed.osism.xyz/auth/realms/osism/.well-known/openid-configuration \\ project list OpenStack CLI token issue with OpenID Connect​ It is also possible to exchange your username/password to a token, for further use with the cli. The token issue subcommand returns an SQL table, in which the id column's value field contains the token: openstack \\ --os-cacert /etc/ssl/certs/ca-certificates.crt \\ --os-auth-url https://api.testbed.osism.xyz:5000/v3 \\ --os-auth-type v3oidcpassword \\ --os-client-id keystone \\ --os-client-secret 0056b89c-030f-486b-a6ad-f0fa398fa4ad \\ --os-username alice \\ --os-password password \\ --os-identity-provider keycloak \\ --os-protocol openid \\ --os-identity-api-version 3 \\ --os-discovery-endpoint https://keycloak.testbed.osism.xyz/auth/realms/osism/.well-known/openid-configuration \\ --os-openid-scope \"openid profile email\" \\ token issue \\ -c id -f value An example token is like: gAAAAABhC98gL8nsQWknro3JWDXWLFCG3CDr3Mi9OIlvVAZMjy2mNgYtlXv_0yAIy- nSlLAaLIGhht17-mwf8uclKgRuNVsYLSmgUpB163l89-ch2w2_OFe9zNSQNWf4qfd8 Cl7E7XvvUoFr1N8Gh09vaYLvRvYgCGV05xBUSs76qCHa0qElPUsk56s5ft4ALrSrzD 4cEQRVb5PXNjywdZk9_gtJziz31A7sD4LPIy82O5N9NryDoDw TODO: OpenStack CLI operations with token TODO: OpenStack CLI token revoke","s":"Authentication with OIDC","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#authentication-with-oidc","p":774},{"i":805,"t":"Go to /opt/configuration on testbed-manager Run ./scripts/set-openstack-version.sh zed to set the OpenStack version to zed Run ./scripts/set-ceph-version.sh quincy to set the Ceph version to quincy Run osism-update-manager to update the manager","s":"Change versions","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#change-versions","p":774},{"i":807,"t":"Script Description /opt/configuration/scripts/deploy/000-manager-service.sh /opt/configuration/scripts/deploy/001-helper-services.sh /opt/configuration/scripts/deploy/100-ceph-services-basic.sh /opt/configuration/scripts/deploy/200-infrastructure-services-basic.sh /opt/configuration/scripts/deploy/210-infrastructure-services-extended.sh /opt/configuration/scripts/deploy/300-openstack-services-basic.sh /opt/configuration/scripts/deploy/310-openstack-services-extended.sh /opt/configuration/scripts/deploy/320-openstack-services-baremetal.sh /opt/configuration/scripts/deploy/330-openstack-services-additional.sh /opt/configuration/scripts/deploy/400-monitoring-services.sh","s":"Deploy services","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#deploy-services","p":774},{"i":809,"t":"Script Description /opt/configuration/scripts/upgrade/100-ceph-services.sh /opt/configuration/scripts/upgrade/200-infrastructure-services-basic.sh /opt/configuration/scripts/upgrade/300-openstack-services-basic.sh /opt/configuration/scripts/upgrade/310-openstack-services-extended.sh /opt/configuration/scripts/upgrade/320-openstack-services-baremetal.sh /opt/configuration/scripts/upgrade/330-openstack-services-additional.sh","s":"Upgrade services","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#upgrade-services","p":774},{"i":812,"t":"$ make prepare ansible-playbook -i localhost, ansible/check-local-versions.yml ERROR: Ansible could not initialize the preferred locale: unsupported locale setting make: *** [prepare] Error 1 To solve the problem you have to modify the Makefile. Change the 1st line as follows. export LC_ALL = en_US.UTF-8 To find out the locale used on the system printenv can be used. $ printenv | grep -i lang|locale LANG=\"en_US.UTF-8\" LC_COLLATE=\"en_US.UTF-8\" LC_CTYPE=\"UTF-8\" LC_MESSAGES=\"en_US.UTF-8\" LC_MONETARY=\"en_US.UTF-8\" LC_NUMERIC=\"en_US.UTF-8\" LC_TIME=\"en_US.UTF-8\" LC_ALL=","s":"Unsupported locale setting","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#unsupported-locale-setting","p":774},{"i":814,"t":"The following error occurs when yq is not installed. make: yq: No such file or directory yq must be installed on the system. yq is a portable command-line YAML, JSON, XML, CSV, TOML and properties processor.","s":"yq: No such file or directory","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#yq-no-such-file-or-directory","p":774},{"i":816,"t":"The configuration is intentionally kept quite static. Please create no PRs to make the configuration more flexible/dynamic. The OSISM documentation uses hostnames, examples, addresses etc. from OSISM Testbed. Even if all components (storage, network, compute, control) are operated on the same nodes, there are separate networks. This is because in larger productive HCI environments, dedicated control nodes and network nodes are usually provided. It is also common to place storage frontend and storage backend on an independent/additional network infrastructure. The third volume (/dev/sdd) is not enabled for Ceph by default. This is to test the scaling of Ceph. Ansible errors that have something to do with undefined variables (e.g. AnsibleUndefined) are most likely due to cached facts that are no longer valid. The facts can be updated by running osism apply facts. The manager is used as pull through cache for Docker images and Ubuntu packages. This reduces the amount of traffic consumed. To speed up the Ansible playbooks, ARA can be disabled. This is done by executing /opt/configuration/scripts/disable-ara.sh. Afterwards no more logs are available in the ARA web interface.","s":"Notes","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#notes","p":774},{"i":819,"t":"The following stable Ceph and OpenStack releases are supported. The deployment of Ceph is based on ceph-ansible. Ceph Pacific Ceph Quincy (default) The deployment of OpenStack is based on kolla-ansible. OpenStack Zed OpenStack 2023.1 (default)","s":"Supported releases","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#supported-releases","p":774},{"i":821,"t":"The following services can currently be used with this testbed without further adjustments. Infrastructure​ Ceph Fluentd Gnocchi Grafana Haproxy Influxdb Keepalived Keycloak Kubernetes CAPI Management Cluster Mariadb Memcached Netbox Netdata Opensearch Openvswitch Patchman Prometheus exporters Rabbitmq Redis OpenStack​ Barbican Ceilometer Cinder Designate Glance Heat Horizon Ironic Keystone Magnum Manila Neutron Nova (with Libvirt/KVM) Octavia Senlin Skyline","s":"Included services","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#included-services","p":774},{"i":823,"t":"Target Description clean Destroy infrastructure with Terraform. create Create required infrastructure with Terraform. login Log in on the manager. bootstrap Bootstrap everything. manager Deploy only the manager service. identity Deploy only identity services. ceph Deploy only ceph services. deploy Deploy everything and then check it. prepare Run local preparations.","s":"Makfile reference","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#makfile-reference","p":774},{"i":825,"t":"Results of the daily jobs Name Description testbed-deploy testbed-deploy-ceph testbed-deploy-cleura testbed-deploy-pco testbed-deploy-stable testbed-deploy-wavestack testbed-update-stable testbed-upgrade testbed-upgrade-ceph testbed-upgrade-cleura testbed-upgrade-pco testbed-upgrade-stable testbed-upgrade-wavestack","s":"CI jobs","u":"/docs/iaas/guides/deploy-guide/examples/testbed","h":"#ci-jobs","p":774},{"i":827,"t":"💡 Cloud in a Box (CiaB) is a minimalistic installation of the latest stable OSISM release with only services which are needed to make it work with Kubernetes. It is intended for use as a development system on bare-metal or for use in edge environments. danger At the moment the secrets are stored in plain text in the osism/cloud-in-a-box repository and are not secure. Do not use for public accessible systems. In the future, the secrets will be generated automatically.","s":"Cloud in a Box - CiaB","u":"/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box","h":"","p":826},{"i":829,"t":"The system to be used as Cloud in a Box must fulfill these minimum requirements. Type of resource Amount Note CPU at least 1 socket with 4 cores More is better here. This is the minimum where you can't use much payload (LBaaS, VMs). The use of Kubernetes with Cluster API is not possible with this minimum size. RAM at least 32 GByte More is better here. In principle, it also works with 8 GByte, but then no payload (LBaaS, VMs) can be used. Kubernetes with Cluster API cannot be used then. Storage at least 1 TByte Has to be available as /dev/sda or /dev/nvme0n1. Less than 1 TByte is also possible, the smaller the less storage is available for use in Ceph. Network at least 1 network interface (DHCP and internet access) An optional 2nd network interface can be used for external connectivity. USB stick at least 2 GByte Installation media for Cloud in a Box bootstrapping","s":"Requirements","u":"/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box","h":"#requirements","p":826},{"i":831,"t":"There are two types of Cloud in a Box. The sandbox type is intended for developers and demonstrations. A full OSISM installation is one there which also includes Ceph and OpenSearch, for example. In the course of the installation, necessary images, networks, etc. are also created. The edge type is intended to be deployed as an appliance to provide an edge cloud on a single node. Compared to the sandbox, certain services are not provided there or are implemented differently. For example, OpenSearch is not deployed because the logs are delivered to a central location. The storage backend will also be implemented differently there in the future instead of Ceph.","s":"Types","u":"/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box","h":"#types","p":826},{"i":834,"t":"The images currently download and install the latest state of the installation scripts, therefore it is mandatory to update the installation media at least when the underlying Ubuntu operating system release changes. The installation of older releases is currently not supported. Download one of the Cloud in a Box images of type sandbox ubuntu-autoinstall-cloud-in-a-box-1.iso (with first block device as /dev/sda) ubuntu-autoinstall-cloud-in-a-box-2.iso (with first block device as /dev/nvme0n1) Use a tool like balenaEtcher or dd to create a bootable USB stick with the Cloud in a Box image. Boot from the USB stick. Make sure that the boot from USB is activated in the BIOS. danger When booting from this USB stick, all data on the hard disks will be destroyed without confirmation. The installation of the operating system (Ubuntu 22.04) will start and take a few minutes. After that the system will shutdown. The first start of the system Remove the USB storage device (The USB stick is only needed again if the Cloud in a Box system is to be fully reinstalled.) Connect the first network interface to an ethernet interface that provides access to the internet via DHCP configuration Boot the system from the internal hard disk device The deployment will start. This takes some time and the system will shutdown when the deployment is finished. This takes roughly an hour, possibly longer depending on the hardware and internet connection. Start the system again. System is ready for use, by default DHCP is tried on the first network device. Login via SSH. Use the user dragon with the password password. (You can obtain the ip address by inspecting the logs of your dhcp server or from the issue text of the virtual consoles of the system) ssh dragon@IP_FROM_YOUR_SERVER passwd","s":"Automated installation (recommended)","u":"/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box","h":"#automated-installation-recommended","p":826},{"i":836,"t":"Follow the provisioning guide, skip the part about disk layout and do it this way: Create a 1 GByte ext4 partition mounted in /boot Create a 8 GByte swap partition Create a 120 GByte unformatted partition Use a Create volume group (LVM) to create a volume group called system with the size of 120 GByte on the partition 4 you just created Create a logical volume by selecting the Free Space option under system LVM. This volume should be mounted in / and have size of 100 GByte Create a partition with the size of the rest of the drive's space Create a new LVM volume group on partition 5 called osd-vg (will be used for Ceph) After the Ubuntu installation, the system will be rebooted Log into the machine via console to get its IP address and then use SSH to connect to the machine Clone the osism/cloud-in-a-box repository into /opt/cloud-in-a-box sudo git clone https://github.com/osism/cloud-in-a-box /opt/cloud-in-a-box Disable conflicting services from the default Ubuntu installation sudo /opt/cloud-in-a-box/cleanup.sh Install upgrades sudo apt update sudo apt upgrade Run the bootstrap.sh script with the required type (use of sandbox is recommended) sudo /opt/cloud-in-a-box/bootstrap.sh sandbox Run the deploy.sh script with the same type as in step 8 to deploy services like Ceph and OpenStack sudo /opt/cloud-in-a-box/deploy.sh sandbox Shutdown the system sudo shutdown -h now Start the system again. System is ready for use, by default DHCP is tried on the first network device. Login via SSH. Use the user dragon with the password password. (You can obtain the ip address by inspecting the logs of your dhcp server or from the issue text of the virtual consoles of the system) ssh dragon@IP_FROM_YOUR_SERVER passwd info The scripts are not idempotent yet. In case there is any fail during bootstrap.sh or deploy.sh you have to start over with fresh installation.","s":"Manual installation","u":"/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box","h":"#manual-installation","p":826},{"i":839,"t":"Copy the /home/dragon/wireguard-client.conf file from Cloud in a Box to your workstation. This is necessary for using the web endpoints on your workstation. Rename the wireguard config file to something like cloud-in-a-box.conf. If you want to connect to the Cloud in a Box system from multiple clients, change the client IP address in the config file to be different on each client. scp dragon@IP_FROM_YOUR_SERVER:/home/dragon/wireguard-client.conf $HOME/cloud-in-a-box.conf Install wireguard on your workstation, if you have not done this before. For instructions how to do it on your workstation, please have a look on the documentation of your used distribution. The wireguard documentation you will find here. Start the wireguard tunnel. sudo wg-quick up $HOME/cloud-in-a-box.conf","s":"Wireguard VPN service access","u":"/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box","h":"#wireguard-vpn-service-access","p":826},{"i":841,"t":"If you want to access the services please choose the URL from the following list: Name URL Username Password ARA https://ara.services.in-a-box.cloud ara password Ceph http://manager.systems.in-a-box.cloud:7000 admin password Flower https://flower.services.in-a-box.cloud - - Grafana https://api.in-a-box.cloud:3000 admin password HAProxy http://manager.systems.in-a-box.cloud:1984 openstack password Homer https://homer.services.in-a-box.cloud - - Horizon - admin project https://api.in-a-box.cloud admin password Horizon - test project https://api.in-a-box.cloud test test Netbox https://netbox.services.in-a-box.cloud admin password Netdata http://manager.systems.in-a-box.cloud:19999 - - OpenSearch Dashboards https://api.in-a-box.cloud:5601 opensearch password PhpMyAdmin https://phpmyadmin.services.in-a-box.cloud root password RabbitMQ https://api.in-a-box.cloud:15672 openstack password Skyline - admin project https://api.in-a-box.cloud:9999 admin password Skyline - test project https://api.in-a-box.cloud:9999 test test","s":"Webinterfaces","u":"/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box","h":"#webinterfaces","p":826},{"i":843,"t":"Login to Cloud in a Box as described in step 8 of the installation chapter. Select one of the preconfigured environments: system admin test Set the environment by exporting the environment variable: OS_CLOUD: export OS_CLOUD=admin Use OpenStack CLI via the command openstack. openstack availability zone list openstack image list openstack server list # After installation there are no servers","s":"Command-line interfaces","u":"/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box","h":"#command-line-interfaces","p":826},{"i":845,"t":"The OpenStack Image Manager is used to manage images. In the example, the Garden Linux image is imported. export OS_CLOUD=admin osism manage images --filter 'Garden Linux' All available images can be found in the osism/openstack-image-manager repository.","s":"Import of additional images","u":"/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box","h":"#import-of-additional-images","p":826},{"i":847,"t":"It is best to execute the commands within a screen session, it takes some time. Please note that you cannot update the Ceph deployment at the moment. This will be enabled in the future. osism apply configuration /opt/configuration/upgrade.sh docker system prune -a","s":"Upgrade","u":"/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box","h":"#upgrade","p":826},{"i":850,"t":"In the default configuration, the Cloud in a Box is built in such a way that an internal VLAN101 is used as an simulated external network and this is made usable via the 1st network interface using masquerading. This makes it possible for instances running on the Cloud in a Box to reach the internet. The disadvantage of this is that the instances themselves can only be reached via floating IP addresses from the Cloud in a Box system itself or via the Wireguard tunnel. Especially in edge environments, however, one would usually like to have this differently and the instances should be directly accessible via the local network. To make this work, first identify the name of a 2nd network card to be used. dragon@manager:~$ sudo lshw -class network -short H/W path Device Class Description ============================================================ /0/100/2.2/0 eno7 network Ethernet Connection X552 10 GbE SFP+ /0/100/2.2/0.1 eno8 network Ethernet Connection X552 10 GbE SFP+ /0/100/1c/0 eno1 network I210 Gigabit Network Connection /0/100/1c.1/0 eno2 network I210 Gigabit Network Connection /0/100/1c.4/0 eno3 network I350 Gigabit Network Connection /0/100/1c.4/0.1 eno4 network I350 Gigabit Network Connection /0/100/1c.4/0.2 eno5 network I350 Gigabit Network Connection /0/100/1c.4/0.3 eno6 network I350 Gigabit Network Connection In the following we use eno7. Activate the device manually with sudo ip link set up dev eno7. Then check that a link is actually present. dragon@manager:~$ ethtool eno7 Settings for eno7: Supported ports: [ FIBRE ] Supported link modes: 10000baseT/Full [...] Link detected: yes Now this device is made permanently known in the network configuration. Select the MTU accordingly. For 1 GBit rather 1500 than 9100. /opt/configuration/inventory/group_vars/generic/network.yml /opt/configuration/environments/manager/group_vars/manager.yml network_ethernets: eno1: dhcp4: true eno7: mtu: 9100 Then, this change is deployed and applied. osism apply network sudo netplan apply Now the configuration for Neutron and OVN is prepared. network_workload_interface is expanded by the 2nd network interface. The order is not random, first vlan101 then eno7. neutron_bridge_name is added. /opt/configuration/inventory/group_vars/generic/network.yml /opt/configuration/environments/manager/group_vars/manager.yml network_workload_interface: \"vlan101,eno7\" neutron_bridge_name: \"br-ex,br-add\" Then, this change is deployed. osism reconciler sync osism apply openvswitch osism apply ovn osism apply neutron Now segments and/or subnets can be configured. In this case, eno7 is configured as an untagged port on the remote side. /opt/configuration/environments/openstack/playbook-additional-public-network.yml - name: Create additional public network hosts: localhost connection: local tasks: - name: Create additional public network openstack.cloud.network: cloud: admin state: present name: public-add external: true provider_network_type: flat provider_physical_network: physnet2 - name: Create additional public subnet openstack.cloud.subnet: cloud: admin state: present name: subnet-public-add network_name: public-add cidr: 192.168.23.0/24 enable_dhcp: false allocation_pool_start: 192.168.23.100 allocation_pool_end: 192.168.23.200 gateway_ip: 192.168.23.1 dns_nameservers: - 8.8.8.8 - 9.9.9.9 The additional public network can now be made known with osism apply -e openstack additional-public-network. There is now a 2nd floating IP address pool with the name public-add available for use. If instances are to be started directly in this network, enable_dhcp: true must be set. In this case, it should be clarified in advance with the provider of the external network whether the use of DHCP is permitted there.","s":"Use of 2nd NIC for external network","u":"/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box","h":"#use-of-2nd-nic-for-external-network","p":826},{"i":852,"t":"The Cloud in a Box has been tested to run on a virtual machine. However, the Cloud in a Box is mainly made for running on bare metal, the automated installation does not work, and other things may not work either. Nested virtualization​ You likely want to run virtual machines on top of your Cloud in a Box. The host machine has to support and enabled nested virtualization. To enable nested virtualization the CPU configuration of the VM has to be host-passthrough or host-model Enabling nested virtualization in Fedora The linked guide can be used in other distributions as well. Disk space saving​ When using Cloud in a Box in a VM, you can utilize the qcow2 disk image or similar technology to save space. In that case, the base installation requires just around 70 GB instead of a full 1 TB. (The drive still needs to be made with a capacity of at least 1TB; however, the actual disk space usage is lower.) Also in case you want to experiment a bit more and \"hack around\" using the manual installation you can make disk snapshots when turned off after the Ubuntu installs, bootstrap.sh and deploy.sh to speed up your progress. If you use qemu, you can use following command to do snapshots. sudo virsh snapshot-create-as --domain cib bootstrap \"run of bootstrap.sh\" --disk-only --diskspec sda,snapshot=external,file=/var/lib/libvirt/images/ub2022_cib_boostrap.qcow2 --atomic QEMU guest agent​ When running inside QEMU, it may be worth it to install the QEMU guest agent. sudo apt -y install qemu-guest-agent sudo systemctl enable qemu-guest-agent sudo systemctl start qemu-guest-agent","s":"Running on a Virtual Machine","u":"/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box","h":"#running-on-a-virtual-machine","p":826},{"i":854,"t":"This error means that your disk setup is broken. Use cfdisk and delete all partitions on the system on which you want to install the Cloud in a Box image. With lsblk you can verify if the partitions are empty.","s":"Troubleshooting","u":"/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box","h":"#troubleshooting","p":826},{"i":856,"t":"For the further development of the scripts and the mechanisms of the Cloud in a Box, you need to know the following. The operating system is brought onto the node via an automatic Ubuntu installation that uses cloud-init The installation starts the script init.sh which performs an initial clone of the osism/cloud-in-a-box repository and a checkout of the main branch. It also executes the deploy.sh and bootstrap.sh scripts. The installation persists the kernel parameters of the initial boot to the file /etc/.initial-kernel-commandline The status and activities of the deployment are logged in /var/log/install-cloud-in-a-box.log. For proper colors use less -r. Search for OVERALL STATUS to find the result of the specific installation steps. Branch and location of the osism/cloud-in-a-box repository can be overriden by setting the kernel parameters ciab_repo_url (a public repository address without authentication) and ciab_branch (a name of a branch, use only ASCII chars, -, and _).","s":"Development","u":"/docs/iaas/guides/deploy-guide/examples/cloud-in-a-box","h":"#development","p":826},{"i":858,"t":"For the initial deployment of the management plane and the control plane of OSISM, the nodes must be pre-provisioned with Ubuntu 22.04. Currently, only Ubuntu 22.04 is supported by OSISM. Data plane nodes can be automatically provisioned after the initial deployment and do not need to be pre-provisioned. It is recommended not to install the initial nodes of the management plane and the control plane manually. An ISO image is provided for this purpose which automatically provisions a node. The ISO images are available for download in the osism/node-image repository. There are different variants of the ISO image. The variants differ in the disc layout. The available variants are described in the README file of the osism/node-image repository.","s":"Provisioning of management and control plane nodes","u":"/docs/iaas/guides/deploy-guide/provisioning","h":"","p":857},{"i":860,"t":"If none of the provided variants is suitable, this section describes the manual installation with the help of the Ubuntu 22.04 live ISO image. The manual installation is possible without network connectivity. Download the latest ISO image for Ubuntu 22.04 from releases.ubuntu.com. Use the ubuntu-22.04.1-live-server-amd64.iso image. The version number may be different, always use the latest available version of 22.04 LTS. Choose English as language. Choose Install Ubuntu Server. Choose English as language (again). Choose your location (e.g. Germany). Choose en_US.UTF-8 as locale. Choose the keyboard layout from a list, use English (US). Choose and configure the primary network interface. Depending on the environment, the network may not work at this point. Then select any interface and then select Do not configure the network at this time in the next step. Set the hostname. The hostname is e.g. node and not a FQDN like node.systems.osism.xyz. Set osism as full name for the new user. Set osism as the username for the account. The later used operator user dragon is created during the bootstrap and should not be created during the installation The account is only needed initially and can be deleted after completion of the bootstrap. Set a password for the account. Choose Manual as partitioning method and execute the partitioning according to company specifications The use of a UEFI is recommended The use of a RAID is recommended. We prefer the use of software RAIDs to make us less dependent on hardware. But there is nothing against using hardware RAIDs. The use of a LVM2 is recommended. system is recommended as the name for the volume group. Dedicated disks may be provided for /var/lib/docker on the controller nodes. In this case, do not use an LV for /var/lib/docker but the devices provided for it. Do not configure devices that are not required for the operating system. The use of own file systems for the following mountpoints is recommended. The size of the individual partitions is minimal. Depending on the node type, the individual partitions should be made larger. This applies in particular to /var/lib/docker. On controllers at least 100 GByte should be used. / (10 GByte, logical volume root) /home (2 GByte, logical volume home) /tmp (5 GByte, logical volume tmp) /var/lib/ceph (50 GByte, logical volume ceph) (optional for storage nodes) /var/lib/docker (30 GByte, logical volume docker, do not set the nosuid flag on /var/lib/docker) When using XFS as the file system for /var/lib/docker, note the following: Running on XFS without d_type support causes Docker to skip the attempt to use the overlay or overlay2 driver. /var/log/audit (1 GByte, logical volume audit) /var (10 GByte, logical volume var) swap (min 8 GByte, logical volume swap) Choose No automatic updates. Choose OpenSSH server as software to install. Do not install any other software component. Everything you need will be installed later by OSISM. In particular, it is not necessary to install a desktop environment. After completion, restart the system.","s":"Manual provisioning","u":"/docs/iaas/guides/deploy-guide/provisioning","h":"#manual-provisioning","p":857},{"i":863,"t":"When setting up a new environment, the services are deployed in a specific order. Infrastructure Network Logging & Monitoring Ceph OpenStack","s":"Getting started","u":"/docs/iaas/guides/deploy-guide/services/","h":"#getting-started","p":861},{"i":865,"t":"The seed node is used once for the initial bootstrap of the manager node. It is sufficient to use the local workstation. It doesn't have to be a dedicated system. The seed node is no longer needed in the further process. The seed node must be able to reach the manager node via SSH. The use of Linux on the seed node is recommended. Other operating systems should also work without problems.","s":"Seed","u":"/docs/iaas/guides/deploy-guide/seed","h":"","p":864},{"i":867,"t":"sudo apt-get install git python3-pip python3-virtualenv sshpass","s":"Install required packages","u":"/docs/iaas/guides/deploy-guide/seed","h":"#install-required-packages","p":864},{"i":869,"t":"Each environment managed with OSISM is based on a configuration repository. This was previously created with Cookiecutter and the osism/cfg-cookiecutter repository. The creation of the configuration repository is covered in chapter Creation of a configuration repository of the Configuration Guide. A configuration repository is stored on a Git server (e.g. GitHub, Gitlab, ...). The configuration repository is individual for each environment and is therefore not provided by us. The configuration repository to be used must be available on the seed node. In the following example, replace YOUR_ORG and YOUR_NEW_CONFIGURATION_REPOSITORY accordingly. git clone ssh://git@github.com:YOUR_ORG/YOUR_NEW_CONFIGURATION_REPOSITORY.git Examples: The repository is located in the regiocloud organisation on GitHub, has the name configuration and can be accessed via SSH: ssh://git@github.com:regiocloud/configuration.git The repository is located in the regiocloud organisation on Gitlab, has the name configuration and can be accessed via SSH: ssh://git@gitlab.com:regiocloud/configuration.git The repository is located in the regiocloud organisation on an internal Gitlab, has the name configuration and can be accessed via SSH: ssh://git@git.services.osism.tech:regiocloud/configuration.git If necessary, the configuration SSH key can be used for the initial transfer of the repository. For this, the following content is added in ~/.ssh/config and the SSH privte key is stored in ~/.ssh/id_rsa.configuration. Host github.com HostName github.com User git Port 22 IdentityFile ~/.ssh/id_rsa.configuration","s":"Get a copy of the configuration repository","u":"/docs/iaas/guides/deploy-guide/seed","h":"#get-a-copy-of-the-configuration-repository","p":864},{"i":871,"t":"Deploy base services. osism apply ceph-mons osism apply ceph-mgrs osism apply ceph-osds osism apply ceph-crash It's all done here step by step. It is also possible to do this in a single step: osism apply ceph-base Get ceph keys. This places the necessary keys in /opt/configuration. osism apply copy-ceph-keys After run, these keys must be permanently added to the configuration repository via Git. environments/infrastructure/files/ceph/ceph.client.admin.keyring environments/kolla/files/overlays/gnocchi/ceph.client.gnocchi.keyring environments/kolla/files/overlays/nova/ceph.client.cinder.keyring environments/kolla/files/overlays/nova/ceph.client.nova.keyring environments/kolla/files/overlays/cinder/cinder-backup/ceph.client.cinder.keyring environments/kolla/files/overlays/cinder/cinder-backup/ceph.client.cinder-backup.keyring environments/kolla/files/overlays/cinder/cinder-volume/ceph.client.cinder.keyring environments/kolla/files/overlays/manila/ceph.client.manila.keyring environments/kolla/files/overlays/glance/ceph.client.glance.keyring If the osism apply copy-ceph-keys fails and the keys are not found in the /share directory, this can be solved with osism apply ceph-fetch-keys. After the Ceph keys have been persisted in the configuration repository, the Ceph client can be deployed. osism apply cephclient","s":"Ceph","u":"/docs/iaas/guides/deploy-guide/services/ceph","h":"","p":870},{"i":873,"t":"Deployment of the Ceph RGW Service is optional. How the Ceph RGW service can be deployed and integrated into OpenStack is described here. info If an initial deployment is performed and Ceph RGW is not added to an existing deployment, steps 4 and 5 are not required. Step 3 is then performed later after the OpenStack Keystone service has been deployed. Configure the RGW service Apply role ceph-rgws to deploy the Ceph RGW services. osism apply ceph-rgws Apply role kolla-ceph-rgw to add the OpenStack endpoint. osism apply kolla-ceph-rgw Apply role loadbalancer to add the HAProxy backend and frontend. osism apply loadbalancer Apply role horizon to enable the Swift dashboard. osism apply horizon","s":"RGW service","u":"/docs/iaas/guides/deploy-guide/services/ceph","h":"#rgw-service","p":870},{"i":875,"t":"Common issues with deploying infrastructure services required by OpenStack are documented in the OpenStack Troubleshooting Guide.","s":"Infrastructure","u":"/docs/iaas/guides/deploy-guide/services/infrastructure","h":"","p":874},{"i":877,"t":"The common role of Kolla is used to manage the services cron, fluentd and kolla-toolbox. It is important to do this deployment before any other deployements in the Kolla environment, as parts of the other deployments depend on the kolla-toolbox service. osism apply -a pull common osism apply common","s":"Cron, Fluentd & Kolla Toolbox","u":"/docs/iaas/guides/deploy-guide/services/infrastructure","h":"#cron-fluentd--kolla-toolbox","p":874},{"i":879,"t":"osism apply -a pull loadbalancer osism apply loadbalancer","s":"Loadbalancer","u":"/docs/iaas/guides/deploy-guide/services/infrastructure","h":"#loadbalancer","p":874},{"i":881,"t":"osism apply -a pull redis osism apply redis","s":"Redis","u":"/docs/iaas/guides/deploy-guide/services/infrastructure","h":"#redis","p":874},{"i":883,"t":"osism apply -a pull memcached osism apply memcached","s":"Memcached","u":"/docs/iaas/guides/deploy-guide/services/infrastructure","h":"#memcached","p":874},{"i":885,"t":"osism apply -a pull rabbitmq osism apply rabbitmq","s":"RabbitMQ","u":"/docs/iaas/guides/deploy-guide/services/infrastructure","h":"#rabbitmq","p":874},{"i":887,"t":"osism apply -a pull mariadb osism apply mariadb","s":"MariaDB","u":"/docs/iaas/guides/deploy-guide/services/infrastructure","h":"#mariadb","p":874},{"i":889,"t":"Common issues with deploying logging & monitoring services provided by Kolla are documented in the OpenStack Troubleshooting Guide.","s":"Logging & Monitoring","u":"/docs/iaas/guides/deploy-guide/services/logging-monitoring","h":"","p":888},{"i":891,"t":"OpenSearch dashboards is also deployed with the opensearch role. osism apply -a pull opensearch osism apply opensearch","s":"OpenSearch","u":"/docs/iaas/guides/deploy-guide/services/logging-monitoring","h":"#opensearch","p":888},{"i":893,"t":"osism apply -a pull prometheus osism apply prometheus","s":"Prometheus","u":"/docs/iaas/guides/deploy-guide/services/logging-monitoring","h":"#prometheus","p":888},{"i":895,"t":"osism apply -a pull grafana osism apply grafana","s":"Grafana","u":"/docs/iaas/guides/deploy-guide/services/logging-monitoring","h":"#grafana","p":888},{"i":898,"t":"osism apply -a pull openvswitch osism apply openvswitch","s":"Open vSwitch","u":"/docs/iaas/guides/deploy-guide/services/network","h":"#open-vswitch","p":896},{"i":900,"t":"In environments/kolla/configuration.yml the parameter neutron_plugin_agent is set to ovn if OVN is used as a network plugin. Otherwise the network plugin is set to openvswitch. environments/kolla/configuration.yml # neutron neutron_plugin_agent: \"ovn\" neutron_ovn_availability_zones: [ nova ] The deployment of the Open vSwitch service is non-optional. Before the deployment of OVN, the deployment of Open vSwitch must already have been done. osism apply -a pull ovn osism apply ovn","s":"OVN (if used)","u":"/docs/iaas/guides/deploy-guide/services/network","h":"#ovn-if-used","p":896},{"i":902,"t":"Common issues with deploying OpenStack services are documented in the OpenStack Troubleshooting Guide.","s":"OpenStack","u":"/docs/iaas/guides/deploy-guide/services/openstack","h":"","p":901},{"i":904,"t":"osism apply openstackclient","s":"OpenStack client","u":"/docs/iaas/guides/deploy-guide/services/openstack","h":"#openstack-client","p":901},{"i":906,"t":"osism apply -a pull keystone osism apply keystone","s":"Keystone","u":"/docs/iaas/guides/deploy-guide/services/openstack","h":"#keystone","p":901},{"i":908,"t":"osism apply -a pull glance osism apply glance","s":"Glance","u":"/docs/iaas/guides/deploy-guide/services/openstack","h":"#glance","p":901},{"i":910,"t":"osism apply -a pull designate osism apply designate","s":"Designate","u":"/docs/iaas/guides/deploy-guide/services/openstack","h":"#designate","p":901},{"i":912,"t":"osism apply -a pull placement osism apply placement","s":"Placement","u":"/docs/iaas/guides/deploy-guide/services/openstack","h":"#placement","p":901},{"i":914,"t":"osism apply -a pull cinder osism apply cinder","s":"Cinder","u":"/docs/iaas/guides/deploy-guide/services/openstack","h":"#cinder","p":901},{"i":916,"t":"osism apply -a pull neutron osism apply neutron","s":"Neutron","u":"/docs/iaas/guides/deploy-guide/services/openstack","h":"#neutron","p":901},{"i":918,"t":"osism apply -a pull nova osism apply nova","s":"Nova","u":"/docs/iaas/guides/deploy-guide/services/openstack","h":"#nova","p":901},{"i":920,"t":"osism apply -a pull octavia osism apply octavia","s":"Octavia","u":"/docs/iaas/guides/deploy-guide/services/openstack","h":"#octavia","p":901},{"i":922,"t":"osism apply -a pull horizon osism apply horizon","s":"Horizon","u":"/docs/iaas/guides/deploy-guide/services/openstack","h":"#horizon","p":901},{"i":926,"t":"note This feature is currently under development and it is only usable with latest. A node can be in different states. Depending on the state, different actions are possible or are triggered. The individual states of a node can be retrieved via Ansible Facts and local files on the node itself.","s":"Node states","u":"/docs/iaas/guides/operations-guide/","h":"#node-states","p":924},{"i":928,"t":"osism set maintenance NODE osism noset maintenance NODE Ansible fact: ansible_local.osism.maintenance State file: /etc/osism/maintenance","s":"Maintenance","u":"/docs/iaas/guides/operations-guide/","h":"#maintenance","p":924},{"i":930,"t":"osism set bootstrap NODE osism noset bootstrap NODE Ansible fact: ansible_local.osism.bootstrap State file: /etc/osism/bootstrap","s":"Bootstrap","u":"/docs/iaas/guides/operations-guide/","h":"#bootstrap","p":924},{"i":933,"t":"$ osism apply 2023-09-30 10:09:25 | INFO | No role given for execution. The roles listed in the table can be used. +------------------------------------------------------------------+----------------+ | Role | Environment | |------------------------------------------------------------------+----------------| | aodh | kolla | | barbican | kolla | | bifrost | kolla | | bifrost-keypair | kolla | | ceilometer | kolla | | certificates | generic | | cinder | kolla | | cloudkitty | kolla | | collectd | kolla | | common | kolla | | designate | kolla | | elasticsearch | kolla | | etcd | kolla | | glance | kolla | | gnocchi | kolla | | grafana | kolla | | heat | kolla | | horizon | kolla | | ironic | kolla | | iscsi | kolla | ...","s":"List all available plays","u":"/docs/iaas/guides/operations-guide/manager/apply","h":"#list-all-available-plays","p":931},{"i":936,"t":"The official Ceph documentation is located on https://docs.ceph.com/en/latest It is strongly advised to use the documentation for the version being used. Pacific - https://docs.ceph.com/en/pacific Quincy - https://docs.ceph.com/en/quincy Reef - https://docs.ceph.com/en/reef ceph-ansible documentation is located on https://docs.ceph.com/projects/ceph-ansible/en/latest/ note Do not take information in the documentation at face value. Especially when it comes to advanced/rarely used/very new features it is strongly advised to test any claims made in the documentation about any particular feature. Never assume that things will work as written without actually testing it on a test setup as close to your real workload scenario as possible.","s":"Where to find docs","u":"/docs/iaas/guides/operations-guide/ceph","h":"#where-to-find-docs","p":934},{"i":938,"t":"The current Ceph releases and their support status can be found on https://docs.ceph.com/en/latest/releases/ When a new Ceph stable version is released you are strongly advised to not roll it out on any production cluster whatsoever. Even though its listed as \"stable\" it doesn't mean that this is actually true. Especially avoid using .0 releases on anything remotely production unless you really, really now what you're doing and can live with a possible catastrophic failure. Be very conservative about what version you run on production systems. Shiny new features aren't worth the risk of total or partial data loss/corruption.","s":"Advice on Ceph releases","u":"/docs/iaas/guides/operations-guide/ceph","h":"#advice-on-ceph-releases","p":934},{"i":941,"t":"The following commands can be used to quickly check the status of Ceph: $ ceph -s # Print overall cluster status $ ceph health detail # Print detailed health information $ ceph osd tree # Display current OSD tree $ ceph df # Cluster storage usage by pool and storage class $ ceph osd pool ls detail # List pools with detailed configuration $ ceph osd df {plain|tree} {class e.g. hdd|ssd} # Get usage stats for OSDs $ ceph -w # Watch Ceph health messages sequentially $ ceph versions # List daemon versions running in the cluster Also you can run the following on each node running ceph-daemons, to provide further debug information about the environment: # lscpu # cat /proc/cpuinfo # if lscpu isn't available # free -g # ip l # ethtool # for each network adapter","s":"60 seconds cluster overview","u":"/docs/iaas/guides/operations-guide/ceph","h":"#60-seconds-cluster-overview","p":934},{"i":943,"t":"$ ceph health mute $ ceph health unmute ","s":"Mute/Unmute a health warning","u":"/docs/iaas/guides/operations-guide/ceph","h":"#muteunmute-a-health-warning","p":934},{"i":945,"t":"$ ceph osd set noscrub $ ceph osd set nodeep-scrub $ ceph osd unset noscrub $ ceph osd unset nodeep-scrub danger Use this sparingly only in emergency situations. Setting these flags will cause a HEALTH_WARN status, increase risk of data corruption and also the risk of generating a HEALTH_WARN due to PGs not being (deep-)scrubbed in time.","s":"Disable/Enable (deep-)scrubbing","u":"/docs/iaas/guides/operations-guide/ceph","h":"#disableenable-deep-scrubbing","p":934},{"i":947,"t":"The traditional way of doing this is by setting the noout flag, do the appropriate maintenance work and after the node is back online unset the flag like so: ceph osd set noout After maintenance is done and host is back up: ceph osd unset noout On versions Luminous or above you can set the flag individually for single OSDs or entire CRUSH buckets, which can be a safer option in case of prolonged maintenance periods. Add noout for a OSD: ceph osd add-noout osd. Remove noout for a OSD: ceph osd rm-noout osd. Add noout for CRUSH bucket (e.g. host name as seen in ceph osd tree): ceph osd set-group noout Remove noout for CRUSH bucket: ceph osd unset-group noout ","s":"Reboot a single node","u":"/docs/iaas/guides/operations-guide/ceph","h":"#reboot-a-single-node","p":934},{"i":950,"t":"# lsblk # lsblk -S # lsscsi # nvme list # pvs # vgs # lvs","s":"Enumerate typical storage devices and LVM","u":"/docs/iaas/guides/operations-guide/ceph","h":"#enumerate-typical-storage-devices-and-lvm","p":934},{"i":952,"t":"# smartctl -a /dev/sdX # nvme smart-log /dev/nvmeXnY","s":"SMART data for SATA/SAS and NVME devices","u":"/docs/iaas/guides/operations-guide/ceph","h":"#smart-data-for-satasas-and-nvme-devices","p":934},{"i":954,"t":"# nvme id-ns -H /dev/nvmeXnY note Check the last lines named \"LBA Format\". It will show which formats are supported, which format is in use and which format offers the best performance according to the vendor.","s":"Check format of a NVME device","u":"/docs/iaas/guides/operations-guide/ceph","h":"#check-format-of-a-nvme-device","p":934},{"i":956,"t":"danger This will destroy all data on the device! # nvme format --lbaf= /dev/nvmeXnY","s":"Format a NVME device to a different LBA format using nvme-cli","u":"/docs/iaas/guides/operations-guide/ceph","h":"#format-a-nvme-device-to-a-different-lba-format-using-nvme-cli","p":934},{"i":958,"t":"danger This will destroy all data on the device! # nvme format -s2 /dev/nvmeXnY # blkdiscard /dev/nvmeXnY # nvme format -s1 /dev/nvmeXnY","s":"Secure Erase a NVME drive using nvme-cli","u":"/docs/iaas/guides/operations-guide/ceph","h":"#secure-erase-a-nvme-drive-using-nvme-cli","p":934},{"i":960,"t":"danger This will destroy all data on the device! Gather device info: # hdparm -I /dev/sdX Check that the output says \"not frozen\" and \"not locked\", also it should list support for enhanced erase and list time estimates for SECURITY ERASE UNIT and/or ENHANCED SECURITY ERASE UNIT Set a master password for the disk (required, will be automatically removed after wipe) # hdparm --user-master wipeit --security-set-pass wipeit /dev/sdX # hdparm -I /dev/sdX Check that \"Security level\" is now \"high\" and master password is now \"enabled\" instead of \"not enabled\" before Wipe the device If device supports enhanced security erase (better), use the following: # hdparm --user-master wipeit --security-erase-enhanced wipeit /dev/sdX If not, use standard security erase: # hdparm --user-master wipeit --security-erase wipeit /dev/sdX note On some systems the system firmware might \"freeze\" the device, which makes it impossible to issue a secure erase or reformat the device. In that case it might be necessary to either \"unfreeze\" the drive or to install the drive in another system where it can be unfrozen. Also make sure that the device is actually wiped. Its recommended to at least perform a blanking pass on HDDs with a tool like nwipe.","s":"Secure Erase a SATA/SAS drive using hdparm","u":"/docs/iaas/guides/operations-guide/ceph","h":"#secure-erase-a-satasas-drive-using-hdparm","p":934},{"i":963,"t":"$ ceph osd find osd.","s":"Locate a specific OSD in the cluster","u":"/docs/iaas/guides/operations-guide/ceph","h":"#locate-a-specific-osd-in-the-cluster","p":934},{"i":965,"t":"$ ceph osd metadata $ ceph osd metadata osd. note Interesting fields: osd_objectstore, rotational, hostname, devices, device_ids, device_paths, bluefs_db_rotational, bluefs_wal_rotational, bluefs_dedicated_db, bluefs_dedicated_wal, bluestore_bdev_rotational","s":"Get OSD metadata (global and single OSD)","u":"/docs/iaas/guides/operations-guide/ceph","h":"#get-osd-metadata-global-and-single-osd","p":934},{"i":971,"t":"$ ceph osd crush reweight osd. 0.0 ... Wait for rebalance to complete, then mark it OUT: $ ceph osd out osd. # systemctl stop ceph-osd@ # systemctl disable ceph-osd@ $ ceph osd purge osd. --yes-i-really-mean-it","s":"Remove an OSD (removing it completely, not reprovisioning it again) without double rebalance","u":"/docs/iaas/guides/operations-guide/ceph","h":"#remove-an-osd-removing-it-completely-not-reprovisioning-it-again-without-double-rebalance","p":934},{"i":973,"t":"$ ceph osd out osd. # systemctl stop ceph-osd@ # systemctl disable ceph-osd@","s":"Remove an OSD (temporarily e.g. when replacing a broken disk)","u":"/docs/iaas/guides/operations-guide/ceph","h":"#remove-an-osd-temporarily-eg-when-replacing-a-broken-disk","p":934},{"i":975,"t":"danger Use only in emergency situations! $ ceph osd set nobackfill $ ceph osd set norecovery $ ceph osd set norebalance Unset the flags with ceph osd unset .","s":"Disable backfills/recovery completely","u":"/docs/iaas/guides/operations-guide/ceph","h":"#disable-backfillsrecovery-completely","p":934},{"i":979,"t":"Usually only useful when parsing it, so here are two ways to get the data: $ ceph pg dump $ ceph pg dump --format=json-pretty","s":"Dump placement groups","u":"/docs/iaas/guides/operations-guide/ceph","h":"#dump-placement-groups","p":934},{"i":981,"t":"$ ceph pg query","s":"Query a PG about its status","u":"/docs/iaas/guides/operations-guide/ceph","h":"#query-a-pg-about-its-status","p":934},{"i":983,"t":"$ ceph pg scrub $ ceph pg deep-scrub note Instructing a PG to (deep-)scrub does not mean that it will do so immediately, it can take some time for the scrub to start.","s":"Start (deep-)scrubbing of a placement group","u":"/docs/iaas/guides/operations-guide/ceph","h":"#start-deep-scrubbing-of-a-placement-group","p":934},{"i":985,"t":"Finding PGs which have large OMAP objects: # ceph pg dump --format=json | jq '.pg_map.pg_stats[] | select(.stat_sum.num_large_omap_objects != 0) | (.pgid, .stat_sum.num_large_omap_objects, .up, .acting)' (Remove the line breaks between the single quotes or jq might act weird!) This will dump all PG IDs with large OMAP objects and their up/acting OSDs. You then can grep the logs of these OSDs for \"Large omap object\" to find the actual objects causing the health warning. Also the PG ID before the dot is equal to the pool ID it belongs to. In case the logs have been rotated, instruct those OSDs to do a deep-scrub and watch the logs for the message to appear. From there you can investigate the issue further, mostly it'll be due to the index of a RGW bucket getting too big due to too many objects, thus resharding that bucket's index will be necessary.","s":"HEALTH_WARN - Large omap objects found...","u":"/docs/iaas/guides/operations-guide/ceph","h":"#health_warn---large-omap-objects-found","p":934},{"i":987,"t":"$ ceph pg repair note Recovery might not start immediately and might take some time. You can query the status of the recovery through ceph pg query. Be sure to read the Ceph manual about this topic thoroughly: https://docs.ceph.com/en/latest/rados/operations/pg-repair/","s":"Instruct a PG to repair in case of scrub errors (inconsistent PG)","u":"/docs/iaas/guides/operations-guide/ceph","h":"#instruct-a-pg-to-repair-in-case-of-scrub-errors-inconsistent-pg","p":934},{"i":989,"t":"note Read the RADOS pool operations documentation in detail before playing around with pools. Especially when considering making changes to the CRUSH map. Wrong decisions there can lead to data loss or other catastrophic failures. https://docs.ceph.com/en/latest/rados/operations/pools/","s":"RADOS Pool maintenance","u":"/docs/iaas/guides/operations-guide/ceph","h":"#rados-pool-maintenance","p":934},{"i":991,"t":"$ ceph osd pool ls detail","s":"Get pools and their configuration","u":"/docs/iaas/guides/operations-guide/ceph","h":"#get-pools-and-their-configuration","p":934},{"i":993,"t":"$ ceph osd crush rule dump","s":"Dump all CRUSH rules","u":"/docs/iaas/guides/operations-guide/ceph","h":"#dump-all-crush-rules","p":934},{"i":995,"t":"$ ceph osd pool autoscale-status","s":"Get autoscaler status","u":"/docs/iaas/guides/operations-guide/ceph","h":"#get-autoscaler-status","p":934},{"i":997,"t":"$ ceph osd pool create replicated []","s":"Create a replicated pool","u":"/docs/iaas/guides/operations-guide/ceph","h":"#create-a-replicated-pool","p":934},{"i":999,"t":"Required, otherwise a health warning will be raised after some time. $ ceph osd pool application enable # Syntax $ ceph osd pool application enable cinder rbd # Example Typical application names are: rbd, rgw, cephfs","s":"Enabling an application on a pool","u":"/docs/iaas/guides/operations-guide/ceph","h":"#enabling-an-application-on-a-pool","p":934},{"i":1001,"t":"danger This will delete all data in that pool. There is no undo/undelete. $ ceph osd pool delete --yes-i-really-really-mean-it note In order to be able to delete pools, it has to be enabled on the monitors by setting the mon_allow_pool_delete flag to true. Default is false. See: https://docs.ceph.com/en/latest/rados/configuration/mon-config-ref","s":"Delete a pool","u":"/docs/iaas/guides/operations-guide/ceph","h":"#delete-a-pool","p":934},{"i":1003,"t":"$ ceph osd pool set pg_num note Num PGs must be a power of two! Be careful about changing number of PGs. Changing pg_num to a new value will gradually increase pgp_num on newer versions of Ceph. In older versions one also has to set pgp_num manually, either in increments or in one big leap.","s":"Set number of PGs for a pool","u":"/docs/iaas/guides/operations-guide/ceph","h":"#set-number-of-pgs-for-a-pool","p":934},{"i":1005,"t":"$ ceph osd crush rule create-replicated replicated_hdd default host hdd $ ceph osd crush rule create-replicated replicated_ssd default host ssd $ ceph osd crush rule create-replicated replicated_nvme default host nvme","s":"Create CRUSH rules for different storage classes","u":"/docs/iaas/guides/operations-guide/ceph","h":"#create-crush-rules-for-different-storage-classes","p":934},{"i":1007,"t":"$ ceph osd pool set crush_rule This can be used to move a pool from e.g. HDD to SSD or NVME class or anything else that the new CRUSH rule specifies.","s":"Change CRUSH rule for a pool (\"move pool\")","u":"/docs/iaas/guides/operations-guide/ceph","h":"#change-crush-rule-for-a-pool-move-pool","p":934},{"i":1010,"t":"For more advanced OSD layout requirements leave out the devices key and instead use lvm_volumes. Details for this can be found on the official ceph-ansible OSD Scenario documentation. In order to aid in creating the lvm_volumes config entries and provision the LVM devices for them, OSISM has the two playbooks configure-lvm-devices and create-lvm-devices available. Their usage is as follows: For each Ceph storage node edit the file inventory/host_vars/.yml add a configuration like the following to it: ceph_osd_db_wal_devices_buffer_space_percent: 10 # optional percentage of VGs to leave free, # defaults to false # Can be helpful for SSD performance of some older SSD models # or to extend lifetime of SSDs in general ceph_db_devices: nvme0n1: # required, PV for a DB VG # Will be prefixed by /dev/ and can also be specified # like \"by-path/foo\" or other things under /dev/ num_osds: 6 # required, number of OSDs that shall be # maximum deployed to this device db_size: 30 GB # optional, if not set, defaults to # (VG size - buffer space (if enabled)) / num_osds ceph_wal_devices: nvme1n1: # See above, PV for a WAL VG num_osds: 6 # See above wal_size: 2 GB # optional, if not set, defaults to 2 GiB ceph_db_wal_devices: nvme2n1: # See above, PV for combined WAL+DB VG num_osds: 3 # See above db_size: 30 GB # See above, except that it also considers # total WAL size when calculating LV sizes wal_size: 2 GB # See above ceph_osd_devices: sda: # Device name, will be prefixed by /dev/, see above conventions # This would create a \"block only\" OSD without DB/WAL # In reality, to ensure each device is uniquely identifiable, # you should use WWN or EUI-64 # (in that case the entry here would be something like # disk/by-id/wwn- or disk/by-id/nvme-eui.) sdb: # Create an OSD with dedicated DB db_pv: nvme0n1 # Must be one device configured in ceph_db_devices # or ceph_db_wal_devices sdc: # Create an OSD with dedicated WAL wal_pv: nvme1n1 # Must be one device configured in ceph_wal_devices # or ceph_db_wal_devices sdb: # Create an OSD with dedicated DB/WAL residing on different devices db_pv: nvme0n1 # See above wal_pv: nvme1n1 # See above sdc: # Create an OSD with dedicated DB/WAL residing on the same VG/PV db_pv: nvme2n1 # Must be one device configured in ceph_db_wal_devices wal_pv: nvme2n1 # Must be the same device configured in ceph_db_wal_devices Push the configuration to your configuration repository and after that do the following $ osism apply configuration $ osism apply facts After the configuration has been pulled and facts updated, you can run the LVM configuration playbook: $ osism apply ceph-configure-lvm-volumes [-l INVENTORY HOST PATTERN] This will generate a new configuration file for each node in /tmp on the first manager node named -ceph-lvm-configuration.yml. Take the generated configuration file from /tmp and replace the previously generated configuration for each node. Push the updated configuration again to your configuration repository and re-run: $ osism apply configuration $ osism apply facts Finally you can let OSISM create the LVM devices for you, because ceph-ansible will not do that. To do that you simply run: $ osism apply ceph-create-lvm-devices [-l INVENTORY HOST PATTERN] Deploy OSDs with ceph-ansible When everything has finished and is ready to be deployed, you can run: $ osism apply ceph-osds [-l INVENTORY HOST PATTERN] This should then have ceph-ansible create new OSDs on the node.","s":"Configure and create LVM devices for ceph-ansible using OSISM","u":"/docs/iaas/guides/operations-guide/ceph","h":"#configure-and-create-lvm-devices-for-ceph-ansible-using-osism","p":934},{"i":1012,"t":"For Ceph, special playbooks were added to validate the deployment status of the OSD, MON and MGR services. The commands for use are osism validate ceph-osds, osism validate ceph-mons, and osism validate ceph-mgrs. These playbooks will validate that the deployed Ceph environment matches the configuration and is overall in a healthy state. The playbooks will generate report files in JSON format on the first manager node in /opt/reports/validator.","s":"Validating Ceph using OSISM playbooks","u":"/docs/iaas/guides/operations-guide/ceph","h":"#validating-ceph-using-osism-playbooks","p":934},{"i":1014,"t":"In order to fully shutdown a Ceph cluster safely, you first do the following steps: danger Take GOOD NOTES of the unit names and OSD IDs running on each node. You will need them to restart the cluster later. Stop the workload that is using the cluster This will vary depending on your environment and is not covered here. Pause/Stop operations on the cluster by setting flags $ ceph osd set noout $ ceph osd set nobackfill $ ceph osd set norecover $ ceph osd set norebalance $ ceph osd set nodown $ ceph osd set pause Stop and disable the radosgw services on all nodes (on each rgw node) (if RGW is used) Get the name of the unit (globs not supported for disable) and make a note of the unit name for that node: # systemctl | grep ceph-radosgw Then disable and stop the unit: # systemctl disable --now ceph-radosgw@.service Stop all CephFS file systems (if CephFS is used) List all Ceph file systems $ ceph fs ls For each CephFS do: $ ceph fs down true After that disable and stop all ceph-mds services on all nodes (do this on each node) Get the name of the unit (globs not supported for disable) and make a note of the unit name for that node: # systemctl | grep ceph-mds # systemctl disable --now ceph-mds@.service Stop and disable the ceph-mgr services on all nodes (do this on each node) Get the name of the unit (globs not supported for disable) and make a note of the unit name for that node: # systemctl | grep ceph-mgr # systemctl disable --now ceph-mgr@.service Stop and disable the ceph-osd services on all nodes (do this on each node) Get the names of the units (globs not supported for disable) and make a note of the unit names for that node (best to save it to a file): # systemctl | grep ceph-osd For each OSD unit execute: # systemctl disable ceph-osd@.service Stop all OSDs at once: # systemctl stop ceph-osd\\*.service Finally stop the ceph-mon services on all nodes (do this on each node) Get the name of the unit (globs not supported for disable) and make a note of the unit name for that node: # systemctl | grep ceph-mon # systemctl disable --now ceph-mon@.service","s":"Shutdown a Ceph cluster","u":"/docs/iaas/guides/operations-guide/ceph","h":"#shutdown-a-ceph-cluster","p":934},{"i":1016,"t":"danger You will need the notes taken during shutdown of the unit names. It can be done without, but then it'll be way more work finding out the names. In order to restart a Ceph cluster after performing a manual shutdown like described in the section above, you do the following: Enable & start the ceph-mon services on all nodes (do this on each node) # systemctl enable --now ceph-mon@.service Enable & start the ceph-osd services on all nodes (do this on each node) For each Ceph OSD on that node do: # systemctl enable --now ceph-osd@.service Depending on the number of OSDs on that node it can take a while. Enable & start the ceph-mgr services on all nodes (do this on each node) # systemctl enable --now ceph-mgr@.service Check the status of your cluster and wait for all OSDs to come online You can watch the status periodically by running: $ watch ceph -s You should wait until all OSDs are up + in again, before removing flags. Remove flags to unpause operations $ ceph osd unset pause $ ceph osd unset nodown $ ceph osd unset noout $ ceph osd unset nobackfill $ ceph osd unset norecover $ ceph osd unset norebalance Wait for cluster to resume operations See step #4 of this SOP. Now you wait until the cluster seems \"happy enough\" to accept clients. (i.e. rebalancing finished etc.) Maybe it will complain about MDS being down, but that's normal for now. Enable & start the ceph-mds services on each node (if CephFS is used) # systemctl enable --now ceph-mds@.service Start CephFS file systems again List all Ceph file systems $ ceph fs ls For each CephFS do: $ ceph fs down false Enable & start the radosgw services on each node (if RGW is used) # systemctl enable --now ceph-radosgw@.service","s":"Restart a Ceph cluster after manual shutdown","u":"/docs/iaas/guides/operations-guide/ceph","h":"#restart-a-ceph-cluster-after-manual-shutdown","p":934},{"i":1018,"t":"Join the #ceph IRC channel on irc.oftc.net, state the problem with as many details as possible including information about what steps have already been taken to solve the problem also provide information from the command output from the \"60 seconds cluster overview\" above through a pastebin or a similar service. In order for people to be able to help, details and some patience are important.","s":"Where and how to get further help","u":"/docs/iaas/guides/operations-guide/ceph","h":"#where-and-how-to-get-further-help","p":934},{"i":1020,"t":"A console command is available in the OSISM CLI. This allows specific parts of the environment to be operated interactively.","s":"Console","u":"/docs/iaas/guides/operations-guide/manager/console","h":"","p":1019},{"i":1022,"t":"Used tool: ansible-console $ osism console --type ansible testbed-node-0 Welcome to the ansible console. Type help or ? to list commands. dragon@testbed-node-0 (1)[f:5]$ !uptime testbed-node-0 | CHANGED | rc=0 >> 18:14:15 up 80 days, 33 min, 0 users, load average: 4.00, 3.07, 2.67 dragon@testbed-node-0 (1)[f:5]$ Shortcut: osism console .testbed-node-0","s":"Ansible","u":"/docs/iaas/guides/operations-guide/manager/console","h":"#ansible","p":1019},{"i":1024,"t":"Used tool: ClusterShell The same groups as defined in the Ansible Inventory can be used. $ osism console --type clush control Enter 'quit' to leave this interactive mode Working with nodes: testbed-node-[0-2] clush> Shortcut: osism console :control","s":"Clush","u":"/docs/iaas/guides/operations-guide/manager/console","h":"#clush","p":1019},{"i":1026,"t":"Used tool: Python Prompt Toolkit $ osism console --type container testbed-node-0/fluentd (fluentd)[td-agent@testbed-node-0 /]$ ps ax PID TTY STAT TIME COMMAND 1 ? Ss 0:00 dumb-init --single-child -- kolla_start 7 ? Sl 24:28 /opt/td-agent/bin/ruby /usr/sbin/td-agent -o /var/log/kolla/fluentd/fluent 25 ? Sl 3519:55 /opt/td-agent/bin/ruby -Eascii-8bit:ascii-8bit /usr/sbin/td-agent -o /var 238 pts/0 Ss 0:00 bash 247 pts/0 R+ 0:00 ps ax Shortcut: osism console testbed-node-0/fluentd","s":"Container","u":"/docs/iaas/guides/operations-guide/manager/console","h":"#container","p":1019},{"i":1028,"t":"Used tool: OpenSSH $ osism console --type ssh testbed-node-0 You have new mail. Last login: Wed Sep 27 18:15:39 2023 from 192.168.16.5 dragon@testbed-node-0:~$ uptime 18:16:25 up 80 days, 35 min, 1 user, load average: 2.85, 3.04, 2.71 Shortcut: osism console testbed-node-0","s":"SSH","u":"/docs/iaas/guides/operations-guide/manager/console","h":"#ssh","p":1019},{"i":1032,"t":"Each Ansible service has its own local Ansible log file. These log files are not persistent. The ARA service is used for the persistence of Ansible logs. The log files can be used to view currently running Ansible Plays, for example if they are running as a background task. $ docker exec -it osism-ansible tail -f /ansible/logs/ansible.log $ docker exec -it ceph-ansible tail -f /ansible/logs/ansible.log $ docker exec -it kolla-ansible tail -f /ansible/logs/ansible.log","s":"Files","u":"/docs/iaas/guides/operations-guide/manager/log","h":"#files","p":1029},{"i":1034,"t":"$ osism log ansible (ara) help Documented commands (use 'help -v' for verbose/'help ' for details): =========================================================================== alias exit history quit run_script shell edit help macro run_pyscript set shortcuts Application commands (type help ): ========================================= complete host metrics playbook delete record delete result show expire host show playbook list record list task delete help play delete playbook metrics record show task list host delete play list playbook prune result delete task metrics host list play show playbook show result list task show Sample usage​ As an example, the role common is run. Irrelevant parts of outputs have been removed. $ osism apply common $ osism log ansible (ara) play list +----+-----------+-------------------------------------------------------+----------+-------+---------+-----------------------------+-----------------+ | id | status | name | playbook | tasks | results | started | duration | +----+-----------+-------------------------------------------------------+----------+-------+---------+-----------------------------+-----------------+ | 69 | completed | Apply role common | 49 | 21 | 68 | 2023-09-30T10:14:01.731212Z | 00:00:38.238032 | +----+-----------+-------------------------------------------------------+----------+-------+---------+-----------------------------+-----------------+ (ara) play show 69 +----------+------------------------------------------+ | Field | Value | +----------+------------------------------------------+ | id | 69 | | report | http://ara-server:8000/playbooks/49.html | | status | completed | | name | Apply role common | | playbook | (49) /ansible/kolla-common.yml | | started | 2023-09-30T10:14:01.731212Z | | ended | 2023-09-30T10:14:39.969244Z | | duration | 00:00:38.238032 | | items | {'tasks': 21, 'results': 68} | +----------+------------------------------------------+ (ara) task list +-----+-----------+---------+---------------------------------+----------------------------------------------------------------------------+----------+-----------------------------+-----------------+ | id | status | results | action | name | playbook | started | duration | +-----+-----------+---------+---------------------------------+----------------------------------------------------------------------------+----------+-----------------------------+-----------------+ | 910 | completed | 0 | meta | common : Flush handlers | 49 | 2023-09-30T10:14:37.126872Z | 00:00:02.552006 | | 909 | completed | 4 | file | common : Link kolla_logs volume to /var/log/kolla | 49 | 2023-09-30T10:14:35.502754Z | 00:00:01.039468 | | 908 | completed | 4 | kolla_docker | common : Creating log volume | 49 | 2023-09-30T10:14:34.134312Z | 00:00:01.076976 | | 907 | completed | 4 | kolla_docker | common : Check common containers | 49 | 2023-09-30T10:14:31.411916Z | 00:00:02.146165 | | 906 | completed | 4 | template | common : Copy rabbitmq erl_inetrc to kolla toolbox | 49 | 2023-09-30T10:14:29.500998Z | 00:00:01.327607 | | 905 | completed | 4 | template | common : Copy rabbitmq-env.conf to kolla toolbox | 49 | 2023-09-30T10:14:27.979869Z | 00:00:01.231630 | | 904 | completed | 4 | file | common : Ensuring config directories have correct owner and permission | 49 | 2023-09-30T10:14:26.422535Z | 00:00:01.263370 | | 903 | completed | 4 | template | common : Ensure RabbitMQ Erlang cookie exists | 49 | 2023-09-30T10:14:24.880329Z | 00:00:01.255475 | | 902 | completed | 4 | template | common : Copying over cron logrotate config file | 49 | 2023-09-30T10:14:23.199518Z | 00:00:01.392765 | | 901 | completed | 4 | template | common : Copying over td-agent.conf | 49 | 2023-09-30T10:14:21.085351Z | 00:00:01.826039 | | 900 | completed | 1 | find | common : Find custom fluentd output config files | 49 | 2023-09-30T10:14:19.859670Z | 00:00:00.939663 | | 899 | completed | 1 | find | common : Find custom fluentd format config files | 49 | 2023-09-30T10:14:18.711171Z | 00:00:00.858586 | | 898 | completed | 1 | find | common : Find custom fluentd filter config files | 49 | 2023-09-30T10:14:17.542234Z | 00:00:00.877270 | | 897 | completed | 1 | find | common : Find custom fluentd input config files | 49 | 2023-09-30T10:14:15.911699Z | 00:00:01.315217 | | 896 | completed | 4 | template | common : Copying over config.json files for services | 49 | 2023-09-30T10:14:13.588195Z | 00:00:02.031647 | | 895 | completed | 4 | copy | service-cert-copy : common | Copying over backend internal TLS key | 49 | 2023-09-30T10:14:12.216984Z | 00:00:01.074853 | | 894 | completed | 4 | copy | service-cert-copy : common | Copying over backend internal TLS certificate | 49 | 2023-09-30T10:14:10.895833Z | 00:00:01.022530 | | 893 | completed | 4 | copy | service-cert-copy : common | Copying over extra CA certificates | 49 | 2023-09-30T10:14:08.551850Z | 00:00:02.040932 | | 892 | completed | 4 | include_tasks | common : include_tasks | 49 | 2023-09-30T10:14:07.019883Z | 00:00:00.950605 | | 891 | completed | 4 | file | common : Ensuring config directories exist | 49 | 2023-09-30T10:14:04.801633Z | 00:00:01.926842 | | 890 | completed | 4 | include_tasks | common : include_tasks | 49 | 2023-09-30T10:14:03.054547Z | 00:00:01.166032 | +-----+-----------+---------+---------------------------------+----------------------------------------------------------------------------+----------+-----------------------------+-----------------+ (ara) task show 910 +----------+------------------------------------------+ | Field | Value | +----------+------------------------------------------+ | id | 910 | | uuid | 0242ac1f-6510-3867-9eea-00000000004f | | report | http://ara-server:8000/playbooks/49.html | | name | common : Flush handlers | | action | meta | | status | completed | | path | /ansible/roles/common/tasks/deploy.yml | | lineno | 8 | | started | 2023-09-30T10:14:37.126872Z | | ended | 2023-09-30T10:14:39.678878Z | | duration | 00:00:02.552006 | | tags | ['common'] | | handler | False | +----------+------------------------------------------+ (ara) playbook list +----+-----------+-------------------------------+--------+-----------------+---------------------------------------------------+-------+---------+-------+-----------------------------+-----------------+ | id | status | controller | user | ansible_version | path | tasks | results | hosts | started | duration | +----+-----------+-------------------------------+--------+-----------------+---------------------------------------------------+-------+---------+-------+-----------------------------+-----------------+ | 49 | completed | kolla-ansible.manager_default | dragon | 2.14.10 | /ansible/kolla-common.yml | 21 | 68 | 5 | 2023-09-30T10:14:01.410334Z | 00:00:39.135309 | +----+-----------+-------------------------------+--------+-----------------+---------------------------------------------------+-------+---------+-------+-----------------------------+-----------------+ (ara) playbook metrics +---------------------------------------------------+-------+----------------+----------------+-------+---------+-------+-----------+--------+---------+ | aggregate | count | duration_total | duration_avg | tasks | results | hosts | completed | failed | running | +---------------------------------------------------+-------+----------------+----------------+-------+---------+-------+-----------+--------+---------+ | /ansible/kolla-common.yml | 2 | 0:02:53.934432 | 0:01:26.967216 | 46 | 152 | 10 | 2 | 0 | 0 | +---------------------------------------------------+-------+----------------+----------------+-------+---------+-------+-----------+--------+---------+ (ara) host list +-----+-----------------------------------+----------+---------+--------+----+---------+-------------+-----------------------------+ | id | name | playbook | changed | failed | ok | skipped | unreachable | updated | +-----+-----------------------------------+----------+---------+--------+----+---------+-------------+-----------------------------+ | 164 | testbed-node-2.testbed.osism.xyz | 49 | 0 | 0 | 14 | 2 | 0 | 2023-09-30T10:14:40.543599Z | | 161 | testbed-manager.testbed.osism.xyz | 49 | 0 | 0 | 18 | 2 | 0 | 2023-09-30T10:14:40.283581Z | | 163 | testbed-node-1.testbed.osism.xyz | 49 | 0 | 0 | 14 | 2 | 0 | 2023-09-30T10:14:40.280601Z | | 162 | testbed-node-0.testbed.osism.xyz | 49 | 0 | 0 | 14 | 2 | 0 | 2023-09-30T10:14:40.279181Z | | 165 | kolla-ansible.manager_default | 49 | 0 | 0 | 0 | 0 | 0 | 2023-09-30T10:14:16.932135Z | +-----+-----------------------------------+----------+---------+--------+----+---------+-------------+-----------------------------+ (ara) host show 164 +-------------+------------------------------------------+ | Field | Value | +-------------+------------------------------------------+ | id | 164 | | report | http://ara-server:8000/playbooks/49.html | | name | testbed-node-2.testbed.osism.xyz | | changed | 0 | | failed | 0 | | ok | 14 | | skipped | 2 | | unreachable | 0 | | updated | 2023-09-30T10:14:40.543599Z | +-------------+------------------------------------------+","s":"ARA - ARA Records Ansible","u":"/docs/iaas/guides/operations-guide/manager/log","h":"#ara---ara-records-ansible","p":1029},{"i":1036,"t":"$ osism log container testbed-node-0 horizon [...] ++++ APACHE_LOCK_DIR=/var/lock/apache2 ++++ export APACHE_LOG_DIR=/var/log/apache2 ++++ APACHE_LOG_DIR=/var/log/apache2 ++++ export LANG=C ++++ LANG=C ++++ export LANG +++ install -d /var/run/apache2/ +++ rm -rf '/var/run/apache2/*' +++ [[ ubuntu =~ centos|rocky ]] + echo 'Running command: '\\''/usr/sbin/apache2 -DFOREGROUND'\\''' + exec /usr/sbin/apache2 -DFOREGROUND AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 192.168.16.10. Set the 'ServerName' directive globally to suppress this message","s":"Container","u":"/docs/iaas/guides/operations-guide/manager/log","h":"#container","p":1029},{"i":1038,"t":"OpenSearch can be queried with SQL. $ osism log opensearch >>> SELECT * FROM flog-2023.10.31 LIMIT 1; Oct 31 10:45:36 testbed-node-0 docker[847573]: cluster 2023-10-31T10:45:35.498718+0000 mgr.testbed-node-0 (mgr.5184) 24194 : cluster [DBG] pgmap v24196: 321 pgs: 321 active+clean; 577 KiB data, 270 MiB used, 60 GiB / 60 GiB avail >>> SELECT * FROM flog-2023.10.31 LIMIT 5; Oct 31 11:19:57 testbed-node-2 docker[880827]: 2023-10-31T11:19:57.650+0000 7fa7e7c88700 0 [dashboard INFO root] Redirecting to active 'http://192.168.16.10:7000/' Oct 31 11:19:57 testbed-node-2 docker[880827]: 2023-10-31T11:19:57.650+0000 7fa7e7c88700 0 [dashboard INFO request] [::ffff:192.168.16.11:56210] [OPTIONS] [302] [0.001s] [105.0B] [8a69cc7a-23db-410b-b744-cc5689cb4f4c] / Oct 31 11:19:58 testbed-node-2 docker[844686]: cluster 2023-10-31T11:19:56.329684+0000 mgr.testbed-node-0 (mgr.5184) 25224 : cluster [DBG] pgmap v25226: 321 pgs: 321 active+clean; 577 KiB data, 270 MiB used, 60 GiB / 60 GiB avail Oct 31 11:19:58 testbed-node-2 docker[844686]: debug 2023-10-31T11:19:58.566+0000 7fdbc9728700 1 mon.testbed-node-2@2(peon).osd e74 _set_new_cache_sizes cache_size:1020054731 inc_alloc: 348127232 full_alloc: 348127232 kv_alloc: 322961408 Oct 31 11:19:58 testbed-node-2 docker[880827]: 2023-10-31T11:19:58.710+0000 7fa7eb48f700 0 [dashboard INFO root] Redirecting to active 'http://192.168.16.10:7000/' >>> SELECT * FROM flog-2023.10.31 WHERE Hostname = 'testbed-node-0' LIMIT 5 PATH_INFO: `/` log_request_info /var/lib/kolla/venv/lib/python3.10/site-packages/keystone/server/flask/request_processing/req_logging.py:29 REQUEST_METHOD: `GET` log_request_info /var/lib/kolla/venv/lib/python3.10/site-packages/keystone/server/flask/request_processing/req_logging.py:27 SCRIPT_NAME: `` log_request_info /var/lib/kolla/venv/lib/python3.10/site-packages/keystone/server/flask/request_processing/req_logging.py:28 192.168.16.10 - - [31/Oct/2023 10:57:33] \"GET / HTTP/1.1\" 300 1761 0.001253 (1039) accepted ('192.168.16.10', 58732) server /var/lib/kolla/venv/lib/python3.10/site-packages/eventlet/wsgi.py:1004 >>> SELECT * FROM flog-2023.10.31 WHERE Hostname = 'testbed-node-0' AND programname = 'keystone' LIMIT 5 PATH_INFO: `/` log_request_info /var/lib/kolla/venv/lib/python3.10/site-packages/keystone/server/flask/request_processing/req_logging.py:29 REQUEST_METHOD: `GET` log_request_info /var/lib/kolla/venv/lib/python3.10/site-packages/keystone/server/flask/request_processing/req_logging.py:27 SCRIPT_NAME: `` log_request_info /var/lib/kolla/venv/lib/python3.10/site-packages/keystone/server/flask/request_processing/req_logging.py:28 PATH_INFO: `/` log_request_info /var/lib/kolla/venv/lib/python3.10/site-packages/keystone/server/flask/request_processing/req_logging.py:29 REQUEST_METHOD: `GET` log_request_info /var/lib/kolla/venv/lib/python3.10/site-packages/keystone/server/flask/request_processing/req_logging.py:27","s":"OpenSearch","u":"/docs/iaas/guides/operations-guide/manager/log","h":"#opensearch","p":1029},{"i":1041,"t":"All running or scheduled tasks can be listed with osism task list. +----------------------+--------------------------------------+-------------------------+----------+----------------------------+-----------------------------------------------+ | Worker | ID | Name | Status | Start time | Arguments | |----------------------+--------------------------------------+-------------------------+----------+----------------------------+-----------------------------------------------| | celery@kolla-ansible | 8a553e69-c532-4ba0-a5d4-08a983bde692 | osism.tasks.kolla.run | ACTIVE | 2023-09-27 17:55:54.252250 | ['kolla', 'common', ['-e kolla_action=pull']] | | celery@osism-ansible | dba72dd5-1885-408f-9262-e0ded111a007 | osism.tasks.ansible.run | ACTIVE | 2023-09-27 18:00:31.215879 | ['generic', 'facts', []] | +----------------------+--------------------------------------+-------------------------+----------+----------------------------+-----------------------------------------------+","s":"List","u":"/docs/iaas/guides/operations-guide/manager/task","h":"#list","p":1039},{"i":1043,"t":"Sometimes tasks get stuck. Due to the internal locks it is then not possible to re-execute plays with the same name. Also it is currently not possible to cancel already running tasks (is on the todo list). The only way to unblock the situation is to stop the manager service and remove the Redis volume. Afterwards the manager is started again. cd /opt/manager docker compose down docker volume rm manager_redis docker compose up -d","s":"Broker reset","u":"/docs/iaas/guides/operations-guide/manager/task","h":"#broker-reset","p":1039},{"i":1047,"t":"$ openstack --os-cloud admin volume service list +------------------+-----------------------------------+----------+---------+-------+----------------------------+ | Binary | Host | Zone | Status | State | Updated At | +------------------+-----------------------------------+----------+---------+-------+----------------------------+ | cinder-scheduler | testbed-node-0 | internal | enabled | up | 2023-10-01T08:53:14.000000 | | cinder-scheduler | testbed-node-1 | internal | enabled | up | 2023-10-01T08:53:15.000000 | | cinder-scheduler | testbed-node-2 | internal | enabled | up | 2023-10-01T08:53:15.000000 | | cinder-volume | testbed-node-0@rbd-1 | nova | enabled | down | 2023-09-30T18:50:05.000000 | | cinder-volume | testbed-node-2@rbd-1 | nova | enabled | down | 2023-09-30T18:50:05.000000 | | cinder-volume | testbed-node-1@rbd-1 | nova | enabled | down | 2023-09-30T18:50:08.000000 | +------------------+-----------------------------------+----------+---------+-------+----------------------------+ $ docker exec -it cinder_api cinder-manage service remove cinder-volume testbed-node-0@rbd-1 Service cinder-volume on host testbed-node-0@rbd-1 removed. $ docker exec -it cinder_api cinder-manage service remove cinder-volume testbed-node-1@rbd-1 Service cinder-volume on host testbed-node-1@rbd-1 removed. $ docker exec -it cinder_api cinder-manage service remove cinder-volume testbed-node-2@rbd-1 Service cinder-volume on host testbed-node-2@rbd-1 removed. dragon@mgr001:~$ openstack --os-cloud admin volume service list +------------------+-----------------------------------+----------+---------+-------+----------------------------+ | Binary | Host | Zone | Status | State | Updated At | +------------------+-----------------------------------+----------+---------+-------+----------------------------+ | cinder-scheduler | testbed-node-0 | internal | enabled | up | 2023-10-01T08:56:24.000000 | | cinder-scheduler | testbed-node-1 | internal | enabled | up | 2023-10-01T08:56:25.000000 | | cinder-scheduler | testbed-node-2 | internal | enabled | up | 2023-10-01T08:56:25.000000 | +------------------+-----------------------------------+----------+---------+-------+----------------------------+","s":"Remove service","u":"/docs/iaas/guides/operations-guide/openstack/cinder","h":"#remove-service","p":1045},{"i":1051,"t":"The OpenStack Flavor Manager manages the creation, modification, and removal of flavors within an OpenStack environment. The OpenStack Flavor Manager operates as a facilitator that orchestrates compute flavors in alignment with the standard SCS-0100: Flavor Naming by utilizing YAML files provided by the SCS project.","s":"Overview","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/flavor-manager","h":"#overview","p":1049},{"i":1053,"t":"Install the openstack-flavor-manager package with pip. pip install openstack-flavor-manager Or clone the repository osism/openstack-flavor-manager and use the OpenStack Flavor Manager from source with tox. tox -- --help","s":"Installation","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/flavor-manager","h":"#installation","p":1049},{"i":1055,"t":"There must be a clouds.yml and a secure.yml file in the directory where the OpenStack Flavor Manager will be executed. The cloud profile to be used can be specified via the optional --cloud parameter. By default the cloud profile with the name admin is used. It must be possible to create and delete flavors with the used cloud credentials. $ openstack-flavor-manager --help Usage: openstack-flavor-manager [OPTIONS] ╭─ Options ────────────────────────────────────────────────────────────────────────────────────╮ │ --name TEXT Name of flavor definitions. [default: scs] │ │ --debug Enable debug logging. │ │ --cloud TEXT Cloud name in clouds.yaml. [default: admin] │ │ --recommended Create recommended flavors. │ │ --help Show this message and exit. │ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ To create the mandatory flavors by the SCS Flavor Naming Standard, you run: $ openstack-flavor-manager To create the recommended flavors by the SCS Flavor Naming Standard, you run: $ openstack-flavor-manager --recommended The output should look like this: 2023-09-20 13:03:14 | INFO | Flavor 'SCS-1V-4' created. 2023-09-20 13:03:14 | INFO | Flavor 'SCS-2V-8' created. 2023-09-20 13:03:14 | INFO | Flavor 'SCS-4V-16' created. 2023-09-20 13:03:14 | INFO | Flavor 'SCS-8V-32' created. ... All recommended flavors are now be available in your OpenStack environment. Check yourself by running: openstack --os-cloud admin flavor list","s":"Usage","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/flavor-manager","h":"#usage","p":1049},{"i":1057,"t":"There are two flavor definitions available by default. One for SCS and one for OSISM. Each definition has its own set of mandatory and recommended flavors. To run the OpenStack Flavor Manager with a specific definition, either scs or osism, use the optional --name parameter. By default the SCS Flavor Naming Standard definition will be used. $ openstack-flavor-manager --name osism","s":"Definitions","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/flavor-manager","h":"#definitions","p":1049},{"i":1059,"t":"A generator and parser for flavor names according to the SCS standard is available on flavors.scs.community. The flavor name SCS-2V-4-20s is inserted in field Flavor name: The flavor SCS-2V-4-20s translated is 2 generic x86-64 vCPUs with 4.0 GiB RAM and SSD 20GB root volume:","s":"Name parser and generator","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/flavor-manager","h":"#name-parser-and-generator","p":1049},{"i":1061,"t":"The OpenStack Image Manager is a tool for managing all images on an OpenStack environment","s":"Image Manager","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/image-manager","h":"","p":1060},{"i":1063,"t":"This information is only relevant for the operator of an OpenStack environment. You can skip this section if you want to use OpenStack Image Manager as a normal user and you are not an operator of an openStack environment.","s":"Requirements","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/image-manager","h":"#requirements","p":1060},{"i":1065,"t":"The OpenStack Image Service (Glance) is required to upload and discover data assets that are used by other services. Since this script stores many images in a single project, the Glance quota must be set accordingly high or to unlimited. [DEFAULT] user_storage_quota = 1TB With most storage backends it makes sense to convert the imported images directly to RAW. So it is required for using Ceph and it's features too. Recited from the Ceph documentation QEMU and block devices and Block devices and OpenStack. \"The raw data format is really the only sensible format option to use with RBD. Technically, you could use other QEMU-supported formats (such as qcow2 or vmdk), but doing so would add additional overhead, and would also render the volume unsafe for virtual machine live migration when caching (see below) is enabled.\" \"Important Ceph doesn't support QCOW2 for hosting a virtual machine disk. Thus if you want to boot virtual machines in Ceph (ephemeral backend or boot from volume), the Glance image format must be RAW.\" This requires the following parameter for the image import workflow. [taskflow_executor] conversion_format = raw [image_import_opts] image_import_plugins = ['image_decompression', 'image_conversion'] [image_conversion] output_format = raw See OpenStack Glance documentation for more details.","s":"OpenStack Image Service (Glance)","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/image-manager","h":"#openstack-image-service-glance","p":1060},{"i":1067,"t":"If the mirror functionality is used, an object storage backend is required. The use of the mirror functionality is optional and is not used by default.","s":"Object storage backend","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/image-manager","h":"#object-storage-backend","p":1060},{"i":1069,"t":"This Getting started will upload a private image to your OpenStack environment with the help of the OpenStack Image Manager. Install the openstack-image-manager package with pip. pip3 install openstack-image-manager Create a image definition in the file getting-started.yml in the local directory images. --- images: - name: MyCirros format: qcow2 login: cirros password: gocubsgo min_disk: 1 min_ram: 32 status: active visibility: private multi: false meta: architecture: x86_64 hw_disk_bus: scsi hw_rng_model: virtio hw_scsi_model: virtio-scsi hw_watchdog_action: reset os_distro: cirros replace_frequency: never uuid_validity: none provided_until: none tags: [] versions: - version: '0.6.0' url: https://github.com/cirros-dev/cirros/releases/download/0.6.0/cirros-0.6.0-x86_64-disk.img checksum: \"sha256:94e1e2c94dbbae7d4bdc38e68590a1daf73c9de2d03dd693857b4b0a042548e8\" build_date: 2022-09-28 Run the OpenStack Image Manager. It is assumed that a profile with the name openstack exists in the clouds.yaml. openstack-image-manager --cloud openstack --filter \".*Cirr.*\" --images images/","s":"Getting started","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/image-manager","h":"#getting-started","p":1060},{"i":1071,"t":"The configuration consists of different parameter settings, such as values for minimum RAM or the visibility of the image. Have a look at the examples below for all parameters. After a change to the configuration, validate it with tox -- --dry-run.","s":"Image definitions","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/image-manager","h":"#image-definitions","p":1060},{"i":1073,"t":"The value of login is stored as image_original_user in the metadata of an image. If image_description is not set as meta information, image_description is set to the name of the image. The value of build_date of a specific version of an image is stored as image_build_date in the metadata of an image. The value of url of a specific version of an image is stored as image_source in the metadata of an image.","s":"SCS image standard","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/image-manager","h":"#scs-image-standard","p":1060},{"i":1075,"t":"This type of image definition is used for images that are rebuilt at regular intervals. For example, this is the case for the daily builds of the Ubuntu images. The attribute multi: true is set. With this type of image definition, the version of the distribution (or product, whatever is contained in the image) used is already in the name of the image definition. The version properties from the definition's versions list are appended only to older iterations of the image as timestamp suffixes in parentheses upon each rotation (except for the latest entry). images: - name: Ubuntu 16.04 format: qcow2 login: ubuntu min_disk: 8 min_ram: 512 status: active visibility: public multi: true meta: architecture: x86_64 hw_disk_bus: scsi hw_scsi_model: virtio-scsi hw_watchdog_action: reset os_distro: ubuntu os_version: '16.04' tags: [] versions: - version: '20180928' url: https://cloud-images.ubuntu.com/xenial/20180928/xenial-server-cloudimg-amd64-disk1.img - version: '20181004' url: https://cloud-images.ubuntu.com/xenial/20181004/xenial-server-cloudimg-amd64-disk1.img This configuration creates the following images: Ubuntu 16.04 (20180928) Ubuntu 16.04 If a newer build is added, the following rotation takes place: Ubuntu 16.04 (20180928) does not change Ubuntu 16.04 becomes Ubuntu 16.04 (20181004) the new image becomes Ubuntu 16.04 By default the last three images will be visible. When a fourth image is added, the visibility of the last image in the list is changed to community and the image can be deleted in the future.","s":"Image with regular rebuilds","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/image-manager","h":"#image-with-regular-rebuilds","p":1060},{"i":1077,"t":"This type of image definition is used for images that are not rebuilt. For example, this is the case for the flatcar images. For each release of Flatcar there is exactly one image which will not be rebuilt in the future. The attribute multi: false is set. With this type of image definition, the version of the distribution (or product, whatever is contained in the image) used is not in the name of the image definition. Instead, the version properties from the image definition's versions list are appended as static version suffixes to the images' names. images: - name: RancherOS format: qcow2 login: rancher min_disk: 8 min_ram: 2048 status: active visibility: public multi: false meta: architecture: x86_64 hw_disk_bus: scsi hw_scsi_model: virtio-scsi hw_watchdog_action: reset tags: [] versions: - version: '1.3.0' url: https://github.com/rancher/os/releases/download/v1.3.0/rancheros-openstack.img - version: '1.4.0' url: https://github.com/rancher/os/releases/download/v1.4.0/rancheros-openstack.img - version: '1.4.1' url: https://github.com/rancher/os/releases/download/v1.4.1/rancheros-openstack.img This configuration creates the following images: RancherOS 1.3.0 RancherOS 1.4.0 RancherOS 1.4.1 If a new version is added, no rotation takes place. The new version is added as RancherOS x.y.z. Here also the visibility of older images is not changed.","s":"Image without regular rebuild","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/image-manager","h":"#image-without-regular-rebuild","p":1060},{"i":1079,"t":"Image properties​ Removal of properties is not yet possible URL, name and format can not be changed Any keys can be added to meta, these will be added to the image Existing keys in meta can be changed, the same applies to min_disk and min_ram Image tags​ image status​ deactivation: change status to deactivated reactivation: change status to active Image visibility​ A full documentation about the visibility of images can be found in the Image visibility section in the OpenStack Image Service API Documentation. public: set visibility to public community: set visibility to community shared: set visibility to shared private: set visibility to private","s":"Other properties","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/image-manager","h":"#other-properties","p":1060},{"i":1082,"t":"Since the upstreams often only keep their images for a short time, we mirror most of the images on REGIO.cloud. This makes us independent of the availability of the images in the individual upstreams.","s":"Mirroring images","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/image-manager","h":"#mirroring-images","p":1060},{"i":1084,"t":"Some of the images are automatically updated by a CI job. The latest available build at the time of the CI job execution is mirrored and made available as the current version. Currently, the following images are updated once a week (every Sunday at 0 am): Almalinux CentOS Debian Rockylinux Ubuntu","s":"Updating images","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/image-manager","h":"#updating-images","p":1060},{"i":1088,"t":"Rotation of amphorae older than 30 days. $ python3 src/amphora.py --rotate 2023-10-12 21:00:38 | INFO | Amphora 95a07c43-c0f9-44d2-bde8-a989e52427fa is older than 30 days 2023-10-12 21:00:38 | INFO | Amphora 95a07c43-c0f9-44d2-bde8-a989e52427fa of loadbalancer 9008d3d7-f593-4bc3-941c-a740c178148d is rotated by a loadbalancer failover","s":"Amphora rotation","u":"/docs/iaas/guides/operations-guide/openstack/day2-operations/resource-manager","h":"#amphora-rotation","p":1085},{"i":1093,"t":"/var/log/kolla/octavia/octavia-health-manager.log 2023-10-25 16:43:52.547 22 WARNING octavia.amphorae.drivers.health.heartbeat_udp [-] The amphora 2a33a889-4f9a-4340-84a5-e58a7a8af17e with IP 10.1.0.79 is missing from the DB, so it cannot be automatically deleted (the compute_id is unknown). An operator must manually delete it from the compute service.","s":"Cleanup of amphora missing from the DB","u":"/docs/iaas/guides/operations-guide/openstack/octavia","h":"#cleanup-of-amphora-missing-from-the-db","p":1091},{"i":1096,"t":"We welcome any issues, change requests or general feedback. Do not hestiate to open an issue. We use GitHub Issues to capture feature requests, feedback, bugs, etc. The tracker is available in the osism/issues repository. There are no specific requirements for the creation of an issue. Error cases should be described in such a way that they are directly reproducible. The more outputs there are, the better. We use GitHub pull requests for contributions. The use of pull requets is documented in the official GitHub documentation. The process in detail for the creation of a fork, branch etc. is also documented in the official GitHub documentation. It is recommended to use the GitHub CLI. Makes many steps easier.","s":"Contributor Guide","u":"/docs/iaas/guides/other-guides/contributor-guide","h":"","p":1095},{"i":1099,"t":"If you want to add a new service to OSISM, this is done via an Ansible role and (most often) a container image. The following steps are necessary and are demonstrated using the example of osism.services.cgit. Description Example Add the Ansible role in one of the Ansible collection repositories https://github.com/osism/ansible-collection-services/pull/578/files Add the Ansible playbook https://github.com/osism/ansible-playbooks/pull/215/files Add the Ansible inventory group https://github.com/osism/cfg-generics/pull/225/files Add the used container image(s) to the release repository https://github.com/osism/release/pull/278/files Add the container images(s) to osism-ansible container image https://github.com/osism/container-image-osism-ansible/pull/215/files Add the container image registry/registries and host(s) to the defaults repository https://github.com/osism/defaults/pull/54/files Add a sample deployment to the testbed https://github.com/osism/testbed/pull/1043/files","s":"How to add a new service","u":"/docs/iaas/guides/other-guides/developer-guide/","h":"#how-to-add-a-new-service","p":1097},{"i":1101,"t":"If required, add a new container image in the osism/container-images repository. The example here is from the osism.services.keycloak role: https://github.com/osism/container-images/pull/34/files. Whenever possible, upstream container images should be used. If only minor customizations are necessary, always work with overlay container images based on upstream container images.","s":"How to add a new container image","u":"/docs/iaas/guides/other-guides/developer-guide/","h":"#how-to-add-a-new-container-image","p":1097},{"i":1103,"t":"Scripts are included in container images to simplify development work and to enable testing and hotfixes in running environments. What scripts are available and how to use them is described in this chapter.","s":"Scripts","u":"/docs/iaas/guides/other-guides/developer-guide/scripts","h":"","p":1102},{"i":1105,"t":"With the change-osism.sh script it is possible to bring the Python package osism to a development state from the osism/python-osism repository. Here, the script is used in the running inventory reconciler service to install the branch main of osism/python-osism. Instead of main, any branch can be used. docker exec -u root -it manager-inventory_reconciler-1 /change-osism.sh main It is important to restart the container afterwards. docker restart manager-inventory_reconciler-1 The script is included in the following container images: osism/ceph-ansible used by the service ceph-ansible osism/inventory-reconciler used by the service manager-inventory_reconciler-1 osism/kolla-ansible used by the service kolla-ansible osism/osism-ansible used by the service osism-ansible osism/python-osism osed by the service osismclient","s":"change-osism.sh","u":"/docs/iaas/guides/other-guides/developer-guide/scripts","h":"#change-osismsh","p":1102},{"i":1107,"t":"The container image of the inventory eeconciler contains a few more scripts. change-generics.sh for the osism/cfg-generics repository change-defaults.sh for the osism/defaults repository change-release.sh for the osism/release repository It is important to restart the container afterwards. docker restart manager-inventory_reconciler-1","s":"Inventory Reconciler","u":"/docs/iaas/guides/other-guides/developer-guide/scripts","h":"#inventory-reconciler","p":1102},{"i":1109,"t":"The osism-ansible container image contains a few more scripts. change.sh for the osism/ansible-collection-services, osism/ansible-collection-commons, and osism/ansible-collection-validations repositories In this example, the main branch of osism/ansible-collection-services is used. docker exec -u root -it osism-ansible /change.sh services main change-playbooks.sh for the osism/ansible-playbooks repository","s":"osism-ansible","u":"/docs/iaas/guides/other-guides/developer-guide/scripts","h":"#osism-ansible","p":1102},{"i":1112,"t":"Currently we do a major release every 6 months. Minor releases we do when needed and about every 2 weeks. In a minor release, only updates, bug fixes, etc. take place. There are also no major upgrades of included components such as OpenStack, Keycloak or Ceph in a minor release. It is possible to jump from any minor version within a major version to higher minor versions without any intervention. Deprecations, removals, etc. take place in a major release. New mandatory features are also added in a major release. Upgrades of the included components can also take place during a major release (e.g. OpenStack Xena -> OpenStack Yoga). It is possible to jump from the previous major version to the next major version. It may be that manual intervention is necessary. For example, configuration parameters may need to be added or services that no longer exist may need to be removed.","s":"How we handle releases","u":"/docs/iaas/guides/other-guides/developer-guide/releases","h":"#how-we-handle-releases","p":1110},{"i":1114,"t":"On all repositories that are used, check that the versions to be used have an appropriate version tag (e.g. v0.20230308.0). osism/ansible-collection-commons osism/ansible-collection-services osism/ansible-collection-validations osism/ansible-defaults osism/ansible-playbooks osism/ansible-playbooks-manager osism/cf-generics osism/kolla-operations osism/python-osism Copy the latest directory. The release to be created is used as the new name. latest -> 6.0.0b Remove all # renovate lines from the base.yml file. Remove all Ceph and OpenStack releases that should not be part of the pre-release. There is only one OpenStack version and one Ceph version per (pre-)release. Ensure that the symlinks openstack.yml and ceph.yml point to the releases to be used in this pre-release. base.yml ceph-pacific.yml ceph.yml -> ceph-pacific.yml openstack-zed.yml openstack.yml -> openstack-zed.yml Run src/prepare-release.py. RELEASE=6.0.0b python3 src/prepare-release.py Do the steps from the Stable release starting from the 4th step.","s":"How to make a release","u":"/docs/iaas/guides/other-guides/developer-guide/releases","h":"#how-to-make-a-release","p":1110},{"i":1116,"t":"Copy the directory of the last pre-release or the previous stable release. The release to be created is used as the new name. 5.0.0a -> 5.0.0b 5.0.0b -> 5.0.0 5.0.0 -> 5.1.0 5.1.0 -> 5.2.0 5.2.0 -> 5.3.0 Change all necessary versions in the YAML files within the new directory. In any case, the version of the pre-release or the version of the stable release must be replaced by the release to be created. The release to be created is submitted as a pull request as usual and then merged. Add a tag with the name of the new release to the listed repositories. osism/container-image-ceph-ansible osism/container-image-inventory-reconciler osism/container-image-osism-ansible osism/container-images-kolla After completing the creation of the images in repository container-images-kolla, the file images.yml must be added to repository osism/sbom as 5.0.0/openstack.yml (instead of 5.0.0, the corresponding release is used). The file is available as a build artefact of the Release container images action on the created tag. Before the file is added, it is enhanced with the checksums of the images. The script is available in the osism/sbom repository. VERSION=5.0.0 python3 scripts/add-image-checksum.py If 5.0.0/openstack.yml is present in osism/sbom, repository osism/container-image-kolla-ansible can be tagged like the other repositories before. Add the created SPDX files from the listed repositories to the osism/sbom repository. The file are available as build artefacts of the Build container image action on the created tags. osism/container-image-ceph-ansible osism/container-image-kolla-ansible osism/container-image-osism-ansible Add and run temporary CI jobs in osism/testbed that uses the pre-release. - job: name: testbed-deploy-stable-next parent: testbed-deploy vars: manager_version: \"5.0.0a\" refstack: true nodeset: testbed-orchestrator - job: name: testbed-upgrade-stable-next parent: testbed-deploy vars: manager_version: \"4.2.0\" manager_version_next: \"5.0.0a\" nodeset: testbed-orchestrator Test. Test. Test. Prepare a PR to change the stable version to the new stable version in the following Zuul jobs in the osism/testbed repository. All tests there must pass successfully before the tag is set on this repository in the next step. The temporary CI jobs (step 8) are removed again with this PR. testbed-deploy-stable testbed-update-stable testbed-update-stable testbed-upgrade-stable Add a new release notes file to doc/sorce/notes. Generate the versions table with the help of the release-table.py script in the osism/sbom repository. After all known issues are documented, a corresponding tag, e.g. 5.0.0, is set on the osism/release repository. Create a GitHub release with the new tag on the osism/release repository. The release is now public available. As the last of the release process, the previously prepared PR is merged on the osism/testbed repository to change the stable version.","s":"Stable release","u":"/docs/iaas/guides/other-guides/developer-guide/releases","h":"#stable-release","p":1110},{"i":1118,"t":"We use Reno to manage the release notes.","s":"How we write release notes","u":"/docs/iaas/guides/other-guides/developer-guide/releases","h":"#how-we-write-release-notes","p":1110},{"i":1120,"t":"Reno is provided as a Python package and can be installed with pip. pip3 install reno","s":"Installation","u":"/docs/iaas/guides/other-guides/developer-guide/releases","h":"#installation","p":1110},{"i":1122,"t":"For each change in a repository, a release note is created with Reno. Something meaningful is used as the name for the note. For example, if the requirements file for Ansible is removed, remove-ansible-requirements is a good name. $ reno new remove-ansible-requirements no configuration file in: ./releasenotes/config.yaml, ./reno.yaml Created new notes file in releasenotes/notes/remove-ansible-requirements-6c6eba43f616bc6b.yaml The created file contains prepared entries for several categories. It is described briefly in each instance which contents belong in which category. What is not needed is deleted. prelude: > Replace this text with content to appear at the top of the section for this release. All of the prelude content is merged together and then rendered separately from the items listed in other parts of the file, so the text needs to be worded so that both the prelude and the other items make sense when read independently. This may mean repeating some details. Not every release note requires a prelude. Usually only notes describing major features or adding release theme details should have a prelude. features: - | List new features here, or remove this section. All of the list items in this section are combined when the release notes are rendered, so the text needs to be worded so that it does not depend on any information only available in another section, such as the prelude. This may mean repeating some details. issues: - | List known issues here, or remove this section. All of the list items in this section are combined when the release notes are rendered, so the text needs to be worded so that it does not depend on any information only available in another section, such as the prelude. This may mean repeating some details. upgrade: - | List upgrade notes here, or remove this section. All of the list items in this section are combined when the release notes are rendered, so the text needs to be worded so that it does not depend on any information only available in another section, such as the prelude. This may mean repeating some details. deprecations: - | List deprecations notes here, or remove this section. All of the list items in this section are combined when the release notes are rendered, so the text needs to be worded so that it does not depend on any information only available in another section, such as the prelude. This may mean repeating some details. critical: - | Add critical notes here, or remove this section. All of the list items in this section are combined when the release notes are rendered, so the text needs to be worded so that it does not depend on any information only available in another section, such as the prelude. This may mean repeating some details. security: - | Add security notes here, or remove this section. All of the list items in this section are combined when the release notes are rendered, so the text needs to be worded so that it does not depend on any information only available in another section, such as the prelude. This may mean repeating some details. fixes: - | Add normal bug fixes here, or remove this section. All of the list items in this section are combined when the release notes are rendered, so the text needs to be worded so that it does not depend on any information only available in another section, such as the prelude. This may mean repeating some details. other: - | Add other notes here, or remove this section. All of the list items in this section are combined when the release notes are rendered, so the text needs to be worded so that it does not depend on any information only available in another section, such as the prelude. This may mean repeating some details.","s":"Usage","u":"/docs/iaas/guides/other-guides/developer-guide/releases","h":"#usage","p":1110},{"i":1124,"t":"Here is an example of a commit from the osism/cfg-generics repository. --- features: - | The `requirements.yml` has been removed. The version will be set in the `run.sh` script for the seed process in the future exactly as later in the update process via the parameters `ANSIBLE_COLLECTION_SERVICES_VERSION` and `ANSIBLE_PLAYBOOKS_MANAGER_VERSION`. upgrade: - | In existing configuration repositories, the `environments/manager/requirements.yml` file can be removed after the generics have been synced.","s":"Example","u":"/docs/iaas/guides/other-guides/developer-guide/releases","h":"#example","p":1110},{"i":1126,"t":"We do not create release notes in the following repositories: osism/github-manager osism/osism.github.io osism/release","s":"Repositories without release notes","u":"/docs/iaas/guides/other-guides/developer-guide/releases","h":"#repositories-without-release-notes","p":1110},{"i":1128,"t":"We use Zuul CI for our CI. Our Zuul CI instance is available at zuul.services.betacloud.xyz.","s":"Zuul CI","u":"/docs/iaas/guides/other-guides/developer-guide/zuul-ci","h":"","p":1127},{"i":1130,"t":"On CI jobs that consume a lot of resources and have long runtimes we use a label zuul to run these jobs. These CI jobs run in the label pipeline and are only started once after the label has been assigned. If changes are made to a PR, the label must first be removed and then reassigned for a new run of the CI jobs. The zuul label is usable in the following repositories: osism/container-images-kolla osism/testbed","s":"The zuul label","u":"/docs/iaas/guides/other-guides/developer-guide/zuul-ci","h":"#the-zuul-label","p":1127},{"i":1133,"t":"We implement all the default rules of Ansible Lint. All default rules can be found in the Ansible Lint documentation: https://ansible-lint.readthedocs.io/en/latest/default_rules/","s":"Ansible","u":"/docs/iaas/guides/other-guides/style-guide","h":"#ansible","p":1131},{"i":1135,"t":"Tasks must always have names. The only exception allowed is for forked playbooks. A name never starts with a small letter Names are written in present tense No punctuation is used in names","s":"Task names","u":"/docs/iaas/guides/other-guides/style-guide","h":"#task-names","p":1131},{"i":1137,"t":"The become directive is only set when needed and is always set explicitly for each task that needs it. Blocks, roles, or playbooks are never executed in a privileged mode. We always insert the become directive between the name of a task and the task itself. This also applies to related directives like become_user or become_flags. This is for better visibility if a task is privileged or not. - name: Copy hddtemp configuration file become: true ansible.builtin.copy: src: \"{{ ansible_os_family }}/hddtemp\" dest: \"{{ hddtemp_conf_file }}\" owner: root group: root mode: 0644 notify: Restart hddtemp service","s":"become directive","u":"/docs/iaas/guides/other-guides/style-guide","h":"#become-directive","p":1131},{"i":1139,"t":"If you need to use the when directive add this at the end-section from the task where it is needed. This makes the code easier to understand for others. - name: \"Archive existing {{ resolvconf_file }} file\" become: true ansible.posix.synchronize: src: \"/etc/resolv.conf\" dest: \"/etc/resolv.conf.{{ ansible_date_time.date }}\" archive: true delegate_to: \"{{ inventory_hostname }}\" when: stat_resolvconf_file.stat.islnk is defined and not stat_resolvconf_file.stat.islnk","s":"when directive","u":"/docs/iaas/guides/other-guides/style-guide","h":"#when-directive","p":1131},{"i":1141,"t":"Defaults that provide a list are always defined as in the following example. docker_hosts_defaults sets the defaults in the role. Overriding is only possible with the defaults repository. In the configuration repository, docker_hosts_extra is then used to add additional items to the list. docker_hosts itself is never modified from the outside. docker_hosts_defaults: - \"unix:///var/run/docker.sock\" docker_hosts_extra: [] docker_hosts: \"{{ docker_hosts_defaults + docker_hosts_extra }}\"","s":"Lists as defaults","u":"/docs/iaas/guides/other-guides/style-guide","h":"#lists-as-defaults","p":1131},{"i":1145,"t":"Black is a popular Python code formatter that automatically formats your code to adhere to a consistent style. We use it to automatically format the syntax of Python. A job is running in the CI that checks, if Black has been applied. Therefore, format the files with Black accordingly in advance.","s":"Python","u":"/docs/iaas/guides/other-guides/style-guide","h":"#python","p":1131},{"i":1147,"t":"pip install black","s":"Installation","u":"/docs/iaas/guides/other-guides/style-guide","h":"#installation","p":1131},{"i":1149,"t":"black myfile.py","s":"Formatting a Single File","u":"/docs/iaas/guides/other-guides/style-guide","h":"#formatting-a-single-file","p":1131},{"i":1151,"t":"black file1.py file2.py dir/","s":"Formatting Multiple Files and/or directories","u":"/docs/iaas/guides/other-guides/style-guide","h":"#formatting-multiple-files-andor-directories","p":1131},{"i":1153,"t":"This command will format all Python files in the current directory and its subdirectories: black .","s":"Formatting an Entire Project","u":"/docs/iaas/guides/other-guides/style-guide","h":"#formatting-an-entire-project","p":1131},{"i":1155,"t":"Running Black with the --check option performs a dry run and reports files that would be changed without actually modifying them: black --check myfile.py","s":"Check Mode (Dry Run)","u":"/docs/iaas/guides/other-guides/style-guide","h":"#check-mode-dry-run","p":1131},{"i":1157,"t":"You can exclude files or directories from formatting using the --exclude option: black --exclude=dir_to_exclude/ .","s":"Excluding Files or Directories","u":"/docs/iaas/guides/other-guides/style-guide","h":"#excluding-files-or-directories","p":1131},{"i":1159,"t":"Many code editors have extensions or plugins that can automatically run Black on your code. For example, if you're using VSCode or PyCharm, you can easily integrate it into your IDE.","s":"Integration with Code Editors","u":"/docs/iaas/guides/other-guides/style-guide","h":"#integration-with-code-editors","p":1131},{"i":1161,"t":"job-output.txt: […] 2023-11-16 14:38:14.149756 | TASK [python-black : Install pip module black] 2023-11-16 14:38:18.717886 | ubuntu-jammy | changed 2023-11-16 14:38:18.723062 | 2023-11-16 14:38:18.723137 | TASK [python-black : Format code with Black if there is nothing to exclude] 2023-11-16 14:38:19.138060 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/adminer.py 2023-11-16 14:38:19.151965 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/bird.py 2023-11-16 14:38:19.163608 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/auditd.py 2023-11-16 14:38:19.187772 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/cephclient/package.py 2023-11-16 14:38:19.192695 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/cephclient/container.py 2023-11-16 14:38:19.219694 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/cgit.py 2023-11-16 14:38:19.230577 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/dnsdist.py 2023-11-16 14:38:19.275681 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/hddtemp/redhat.py 2023-11-16 14:38:19.300350 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/homer.py 2023-11-16 14:38:19.310641 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/lldpd.py 2023-11-16 14:38:19.318096 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/docker.py 2023-11-16 14:38:19.329099 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/osquery.py 2023-11-16 14:38:19.344766 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/rsyslog.py 2023-11-16 14:38:19.358190 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/smartd.py 2023-11-16 14:38:19.363578 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/tuned.py 2023-11-16 14:38:19.389205 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/molecule/delegated/tests/util/util.py 2023-11-16 14:38:19.406360 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/plugins/modules/kolla_container_facts.py 2023-11-16 14:38:19.415046 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/plugins/filter/address.py 2023-11-16 14:38:19.473508 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/plugins/modules/kolla_toolbox.py 2023-11-16 14:38:19.908963 | ubuntu-jammy | would reformat /home/zuul/src/github.com/osism/ansible-collection-services/plugins/modules/kolla_docker.py 2023-11-16 14:38:19.914395 | ubuntu-jammy | 2023-11-16 14:38:19.914412 | ubuntu-jammy | Oh no! 💥 💔 💥 2023-11-16 14:38:19.914419 | ubuntu-jammy | 20 files would be reformatted, 18 files would be left unchanged. 2023-11-16 14:38:20.249358 | ubuntu-jammy | ERROR 2023-11-16 14:38:20.249501 | ubuntu-jammy | { 2023-11-16 14:38:20.249533 | ubuntu-jammy | \"delta\": \"0:00:01.053565\", 2023-11-16 14:38:20.249553 | ubuntu-jammy | \"end\": \"2023-11-16 14:38:19.932073\", 2023-11-16 14:38:20.249571 | ubuntu-jammy | \"msg\": \"non-zero return code\", 2023-11-16 14:38:20.249587 | ubuntu-jammy | \"rc\": 1, 2023-11-16 14:38:20.249603 | ubuntu-jammy | \"start\": \"2023-11-16 14:38:18.878508\" 2023-11-16 14:38:20.249618 | ubuntu-jammy | } […]","s":"Example of failed python-black Zuul job","u":"/docs/iaas/guides/other-guides/style-guide","h":"#example-of-failed-python-black-zuul-job","p":1131},{"i":1163,"t":"💡 The Troubleshooting Guide describe how to solve issues.","s":"Troubleshooting Guide","u":"/docs/iaas/guides/troubleshooting-guide/","h":"","p":1162},{"i":1165,"t":"note We use Zuul CI as a CI service for OSISM. The service is not required for the use of OSISM itself. However, as we deploy and provide Zuul CI ourselves, the documentation for this is also included in the OSISM deploy guide. osism.services.zuul is the Ansible role to set up Zuul CI as a single-node installation with Docker Compose.","s":"Zuul CI","u":"/docs/iaas/guides/other-guides/zuul","h":"","p":1164},{"i":1168,"t":"Set up a server (VM) with Ubuntu Server 22.04 LTS and make sure that these packages are installed: docker.io docker-compose python3-docker python3-openstackclient Also configure your deploy user to be in the docker group and set up the account for the zuul user. TCP-Ports 80 and 443 should be accessible from the internet, port 22 for management via SSH will also often be useful, but not required. If you have an OpenStack tenant where you want to deploy the Zuul server, you can download and adapt this example playbook: --- - name: Setup zuul server hosts: localhost vars: cloud: mycloud flavor: myflavor image: Ubuntu 22.04 keypair: mykeypair network: myprivatenet project: myproject zuul_domain: mydomain.xyz. zuul_fqdn: \"zuul01.services.{{ zuul_domain }}\" zuul_host: zuul01 tasks: - name: Create security group openstack.cloud.security_group: cloud: \"{{ cloud }}\" name: \"{{ project }}-zuul\" description: \"Default security group for {{ project }}-zuul\" - name: Create security group rule (icmp) openstack.cloud.security_group_rule: cloud: \"{{ cloud }}\" security_group: \"{{ project }}-zuul\" protocol: icmp remote_ip_prefix: 0.0.0.0/0 - name: Create security group rules (tcp) openstack.cloud.security_group_rule: cloud: \"{{ cloud }}\" security_group: \"{{ project }}-zuul\" protocol: tcp remote_ip_prefix: 0.0.0.0/0 port_range_min: \"{{ item }}\" port_range_max: \"{{ item }}\" loop: - 22 - 80 - 443 - name: Create zuul server openstack.cloud.server: cloud: \"{{ cloud }}\" flavor: \"{{ flavor }}\" image: \"{{ image }}\" key_name: \"{{ keypair }}\" name: \"{{ zuul_host }}\" network: \"{{ network }}\" security_groups: - default - \"{{ project }}-zuul\" meta: hostname: \"{{ zuul_host }}\" register: zuul_server - name: Add host ansible.builtin.add_host: name: \"{{ zuul_server.openstack.accessIPv4 }}\" groups: zuul ansible_user: ubuntu - name: Initialize zuul server hosts: zuul gather_facts: false vars: zuul_user: zuul tasks: - name: Wait for system to become reachable ansible.builtin.wait_for_connection: - name: Update all packages ansible.builtin.apt: update_cache: true name: '*' state: latest become: true - name: Install required packages ansible.builtin.apt: name: - docker.io - docker-compose - python3-docker - python3-openstackclient become: true - name: Add user to docker group ansible.builtin.user: name: \"{{ ansible_ssh_user }}\" groups: docker append: true become: true - name: Add group ansible.builtin.group: name: \"{{ zuul_user }}\" become: true - name: Add user ansible.builtin.user: name: \"{{ zuul_user }}\" uid: 10001 shell: /bin/bash group: \"{{ zuul_user }}\" groups: sudo append: true home: \"/home/{{ zuul_user }}\" become: true","s":"Server preparation","u":"/docs/iaas/guides/other-guides/zuul","h":"#server-preparation","p":1164},{"i":1170,"t":"There need to be some secrets handed to the deployment, the suggested method is to have a dedicated file that contains them, which will be included in the example playbook below via a vars_files statement. This allows you to easily protect all your secrets by applying ansible-vault encrypt to that file. The contents of this file should look like: --- zuul_auth_secret: secret used for zuul web auth webhook_token: token defined for github webhooks db_user_pass: DB password for the zuul user db_root_pass: DB root password In addition you need to prepare some further data that needs to be placed into a files directory in order to be consumed by the zuul role. These are: A clouds.yaml file for nodepool. This will be used by nodepool-builder to upload the newly created images and by nodepool-launcher to start instances running these images, these will then be handed over to Zuul as CI nodes. An SSH private key in the file nodepool and the matching public key in nodepool.pub. These will be used by nodepool and zuul to access the CI nodes via SSH. An SSL private key and certificate pasted together in a file named server.crt. This file will be used in the https setup by the webserver. The certificate should cover both zuul_webserver_fqdn and zuul_logserver_fqdn.","s":"Define secrets","u":"/docs/iaas/guides/other-guides/zuul","h":"#define-secrets","p":1164},{"i":1172,"t":"In order for zuul to be able to interact with repositories hosted on github, you need to set up a github application. Follow the instructions at https://zuul-ci.org/docs/zuul/latest/drivers/github.html#application to do this. The webhook token to use is the one defined in the pervious section. Use github in place of for the Webhook URL in the app configuration. After the app has been created, place the PEM files that you downloaded into a directory named pem-files: $ mkdir -p pem-files $ cp ~/Downloads/my-org-zuul.*.private-key.pem pem-files/my-org-zuul.pem Now add the information about your github app to vars.yml: github_app_id: 000000 github_pem_name: my-org-zuul","s":"Github App setup","u":"/docs/iaas/guides/other-guides/zuul","h":"#github-app-setup","p":1164},{"i":1174,"t":"Save this file as main.yaml: --- - name: Set up zuul hosts: zuul.example.com vars_files: - vars.yml pre_tasks: - name: Create /etc/openstack/ ansible.builtin.file: state: directory path: /etc/openstack owner: root group: root mode: 0755 become: true - name: Deploy clouds.yaml file ansible.builtin.copy: src: clouds.yaml dest: /etc/openstack/clouds.yaml owner: root group: zuul mode: '0640' become: true - name: Create keypair in the cloud openstack.cloud.keypair: cloud: osism-ci name: osism-zuul public_key: \"{{ lookup('file', 'nodepool.pub') }}\" become: true roles: - name: Execute zuul role role: zuul vars: zuul_connections: github: driver: github webhook_token: \"{{ webhook_token }}\" app_id: \"{{ github_app_id }}\" app_key: \"/etc/zuul/pem-files/{{ github_pem_name }}.pem\" opendevorg: name: opendev driver: git baseurl: https://opendev.org zuul_tenants: - tenant: name: my-tenant-name source: opendevorg: untrusted-projects: - zuul/zuul-jobs: include: - job github: config-projects: - my-org/zuul_demo_config: load-branch: main untrusted-projects: - my-org/zuul_demo_repo become: true Create an inventory file containing the login information for your zuul server, it might look like: zuul.example.com ansible_host=192.0.2.2 ansible_user=ubuntu Then you can deploy your zuul server by running: ansible-playbook -i inventory main.yaml This will deploy a simple zuul setup with sample example repos being referenced. You can fork the example repos from the https://github.com/osism tenant or just use them as a guide for how to build your own. For further information about how to tune this setup for you specific environment, have a look at the sections covering nodepool and tenant configuration.","s":"Example Playbook","u":"/docs/iaas/guides/other-guides/zuul","h":"#example-playbook","p":1164},{"i":1177,"t":"Have you thought of naming your repos with the prefix of your organization? release should be osism/release for example.","s":"Your git repos are not displayed?","u":"/docs/iaas/guides/other-guides/zuul","h":"#your-git-repos-are-not-displayed","p":1164},{"i":1179,"t":"For config-projects you set this value in the tenant-configuration with the load-branch stanza. For untrusted-projects you set this value in the config-projects project sections AND in EVERY untrusted-project. Each project section needs to have the default-branch stanza.","s":"Your git repos are using the wrong branch?","u":"/docs/iaas/guides/other-guides/zuul","h":"#your-git-repos-are-using-the-wrong-branch","p":1164},{"i":1181,"t":"Check, if the IP of the logfile server is really correct. In combination with GitHub there is a bug which keeps the GitHub App posting to the old IP even if the webhook IP was changed. Current workaround: Delete the old GitHub App and create a new one.","s":"Your logs are not displayed in the web-UI?","u":"/docs/iaas/guides/other-guides/zuul","h":"#your-logs-are-not-displayed-in-the-web-ui","p":1164},{"i":1184,"t":"Sometimes it is necessary to reset the entire manager service. danger This is a disruptive action. Data is lost in the course of the process. For example, the database of the ARA service. sudo systemctl stop docker-compose@manager.service docker compose --project-directory /opt/manager down -v sudo systemctl start docker-compose@manager.service After starting the manager service, the inventory and the fact cache must be rebuilt. osism reconciler sync osism apply facts If Ceph is used, the Ceph keys should also be re-provisioned within the manager service. osism apply ceph-fetch-keys","s":"Reset","u":"/docs/iaas/guides/troubleshooting-guide/manager","h":"#reset","p":1182},{"i":1187,"t":"Problem: TASK [keystone : Creating keystone database] *********************************** fatal: [testbed-node-0]: FAILED! => changed=false action: mysql_db msg: 'unable to find /var/lib/ansible/.my.cnf. Exception message: (2003, \"Can''t connect to MySQL server on ''api-int.local'' ([Errno 111] Connection refused)\")' Solution: Restart the kolla_toolbox container. in this case on the node testbed-node-0. $ osism console testbed-node-0/ testbed-node-0>>> restart kolla_toolbox kolla_toolbox testbed-node-0>>>","s":"Database creation fails","u":"/docs/iaas/guides/troubleshooting-guide/openstack","h":"#database-creation-fails","p":1185},{"i":1189,"t":"In the examples, the pull of images (if supported by a role) is always run first. While this is optional, it is recommended to speed up the execution of the upgrade action in the second step. This significantly reduces the times required for the restart from a service.","s":"Upgrade Guide","u":"/docs/iaas/guides/upgrade-guide/","h":"","p":1188},{"i":1191,"t":"osism apply ceph-rolling_update -e ireallymeanit=yes osism apply cephclient","s":"Ceph","u":"/docs/iaas/guides/upgrade-guide/ceph","h":"","p":1190},{"i":1195,"t":"The common role of Kolla is used to manage the services cron, fluentd and kolla-toolbox. It is important to do this upgrade before any other upgrades in the Kolla environment, as parts of the other upgrades depend on the kolla-toolbox service. osism apply -a pull common osism apply -a upgrade common","s":"Cron, Fluentd & Kolla Toolbox","u":"/docs/iaas/guides/upgrade-guide/infrastructure","h":"#cron-fluentd--kolla-toolbox","p":1192},{"i":1197,"t":"osism apply -a pull loadbalancer osism apply -a upgrade loadbalancer","s":"Loadbalancer","u":"/docs/iaas/guides/upgrade-guide/infrastructure","h":"#loadbalancer","p":1192},{"i":1199,"t":"osism apply -a pull redis osism apply -a upgrade redis","s":"Redis","u":"/docs/iaas/guides/upgrade-guide/infrastructure","h":"#redis","p":1192},{"i":1201,"t":"osism apply -a pull memcached osism apply -a upgrade memcached","s":"Memcached","u":"/docs/iaas/guides/upgrade-guide/infrastructure","h":"#memcached","p":1192},{"i":1203,"t":"osism apply -a pull rabbitmq osism apply -a upgrade rabbitmq","s":"RabbitMQ","u":"/docs/iaas/guides/upgrade-guide/infrastructure","h":"#rabbitmq","p":1192},{"i":1205,"t":"osism apply -a pull mariadb osism apply -a upgrade mariadb","s":"MariaDB","u":"/docs/iaas/guides/upgrade-guide/infrastructure","h":"#mariadb","p":1192},{"i":1207,"t":"The Docker version used is defined via the parameter docker_version in the file environments/configuration.yml. docker_version: '5:20.10.24' All installable versions can be displayed with apt-cache madison docker-ce. $ apt-cache madison docker-ce docker-ce | 5:24.0.6-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages docker-ce | 5:24.0.5-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages docker-ce | 5:24.0.4-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages docker-ce | 5:24.0.3-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages docker-ce | 5:24.0.2-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages docker-ce | 5:24.0.1-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages docker-ce | 5:24.0.0-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages docker-ce | 5:23.0.6-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages docker-ce | 5:23.0.5-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages docker-ce | 5:23.0.4-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages docker-ce | 5:23.0.3-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages docker-ce | 5:23.0.2-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages docker-ce | 5:23.0.1-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages docker-ce | 5:23.0.0-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages docker-ce | 5:20.10.24~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages docker-ce | 5:20.10.23~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages docker-ce | 5:20.10.22~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages docker-ce | 5:20.10.21~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages docker-ce | 5:20.10.20~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages docker-ce | 5:20.10.19~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages docker-ce | 5:20.10.18~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages docker-ce | 5:20.10.17~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages docker-ce | 5:20.10.16~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages docker-ce | 5:20.10.15~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages docker-ce | 5:20.10.14~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages docker-ce | 5:20.10.13~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages If, for example, you want to change the Docker version from 20.10.24 to 24.0.6, docker_version in environments/configuration.yml is changed accordingly. The 5: prefix is placed in front of the version. Commit and push the changes to your configuration repository afterwards. The upgrade of Docker is then done with the OSISM CLI. Docker on the manager itself is updated differently. This does not work on the manager itself because the Docker service may be started during the upgrade and individual containers may be started as a result. This would interrupt the run of the role itself. osism apply docker -l 'docker:!manager' By default, serial is set to 1 so that the the hosts are upgrade one after the other. To adjust this, either use the osism_serial dictionary in the environments/configuration.yml file to change the value in docker or append -e serial=10% to upgrade, for example, 10% with each iteration. Please note that it is not a good idea to upgrade more than one Docker service at a time. This can lead to anomalies, especially on storage nodes and control nodes. It is recommended not to change the default of 1. osism_serial: docker: 10% On the manager itself, the run.sh script in the manager environment of the configuration must currently be used to upgrade the Docker service. In a future release a dedicated osism update docker command will be available for this purpose. cd /opt/configuration/environments/manager ANSIBLE_ASK_VAULT_PASS=True ./run.sh docker","s":"Docker","u":"/docs/iaas/guides/upgrade-guide/docker","h":"","p":1206},{"i":1209,"t":"When upgrading, the Docker service is restarted. As a result, it can come to a restart of the running containers. This can lead to interruptions in individual services. A change in /etc/docker/daemon.json due to a new configuration parameter etc. can also result in a required restart. Whether the containers are restarted when the Docker Service is restarted depends on whether the Live Restore feature is used. This can be configured via the parameter docker_live_restore. Live restore is enabled by default. It is important to set the docker_live_restore parameter explicitly as a string. This means docker_live_restore: \"false\" or docker_live_restore: \"true\". But even if the Live Restore feature is enabled, certain upgrades will cause running containers to be restarted: Live restore allows you to keep containers running across Docker daemon updates, but is only supported when installing patch releases (YY.MM.x), not for major (YY.MM) daemon upgrades. There are two ways to prevent a restart of the Docker service during an upgrade. If the restart behaviour of the Docker service is changed, always make sure to restart the Docker service manually afterwards (e.g. by a system reboot). A host group can be defined via the parameter docker_ignore_restart_groupname. The restart of the Docker service is not triggered for all hosts in this group. By default, docker_ignore_restart_groupname is set to manager. The parameter is best set in the environments/configuration.yml file when making an adjustment. For example, to prevent the restart on all hosts, docker_ignore_restart_groupname is set to generic. docker_ignore_restart_groupname: generic With the parameter docker_allow_restart, the restart of the Docker service can be prevented. By default, docker_allow_restart is set to true. It is recommended to set this parameter only at runtime. Otherwise, the best place for the parameter is the environments/configuration.yml file. osism apply docker -e docker_allow_restart=false","s":"Restart behaviour","u":"/docs/iaas/guides/upgrade-guide/docker","h":"#restart-behaviour","p":1206},{"i":1212,"t":"OpenSearch dashboards is also upgraded with the opensearch role. osism apply -a pull opensearch osism apply -a upgrade opensearch","s":"OpenSearch","u":"/docs/iaas/guides/upgrade-guide/logging-monitoring","h":"#opensearch","p":1210},{"i":1214,"t":"osism apply -a pull prometheus osism apply prometheus","s":"Prometheus","u":"/docs/iaas/guides/upgrade-guide/logging-monitoring","h":"#prometheus","p":1210},{"i":1216,"t":"osism apply -a pull grafana osism apply -a upgrade grafana","s":"Grafana","u":"/docs/iaas/guides/upgrade-guide/logging-monitoring","h":"#grafana","p":1210},{"i":1218,"t":"Always read the release notes first to learn what has changed and what adjustments are necessary Update the OSISM release in use in the configuration repository as described in Configuration Guide > Manager > Stable release. Update the configuration repository on the manager. osism apply configuration Update the manager services on the manager. osism update manager If Ansible Vault was used to encrypt environments/manager/secrets.yml, the parameter --ask-vault-pass is also appended. If osism update manager does not work yet, use osism-update-manager instead. Refresh the facts cache. osism apply facts If Traefik is used on the management plane (traefik_enable: true in environments/infrastructure/configuration.yml) then Traefik should also be upgraded directly. osism apply traefik","s":"Manager","u":"/docs/iaas/guides/upgrade-guide/manager","h":"","p":1217},{"i":1221,"t":"osism apply -a pull openvswitch osism apply -a upgrade openvswitch","s":"Open vSwitch","u":"/docs/iaas/guides/upgrade-guide/network","h":"#open-vswitch","p":1219},{"i":1223,"t":"Before the upgrade of OVN, the upgrade of Open vSwitch must already have been done. osism apply -a pull ovn osism apply -a upgrade ovn","s":"OVN (if used)","u":"/docs/iaas/guides/upgrade-guide/network","h":"#ovn-if-used","p":1219},{"i":1225,"t":"TODO","s":"Architecture","u":"/docs/iaas/overview/architecture","h":"","p":1224},{"i":1228,"t":"osism apply -a pull keystone osism apply -a upgrade keystone","s":"Keystone","u":"/docs/iaas/guides/upgrade-guide/openstack","h":"#keystone","p":1226},{"i":1230,"t":"osism apply -a pull glance osism apply -a rolling-upgrade glance","s":"Glance","u":"/docs/iaas/guides/upgrade-guide/openstack","h":"#glance","p":1226},{"i":1232,"t":"osism apply -a pull designate osism apply -a upgrade designate","s":"Designate","u":"/docs/iaas/guides/upgrade-guide/openstack","h":"#designate","p":1226},{"i":1234,"t":"osism apply -a pull placement osism apply -a upgrade placement","s":"Placement","u":"/docs/iaas/guides/upgrade-guide/openstack","h":"#placement","p":1226},{"i":1236,"t":"osism apply -a pull cinder osism apply -a upgrade cinder","s":"Cinder","u":"/docs/iaas/guides/upgrade-guide/openstack","h":"#cinder","p":1226},{"i":1238,"t":"osism apply -a pull neutron osism apply -a rolling-upgrade neutron","s":"Neutron","u":"/docs/iaas/guides/upgrade-guide/openstack","h":"#neutron","p":1226},{"i":1240,"t":"osism apply -a pull nova osism apply -a rolling-upgrade nova","s":"Nova","u":"/docs/iaas/guides/upgrade-guide/openstack","h":"#nova","p":1226},{"i":1242,"t":"osism apply -a pull octavia osism apply -a upgrade octavia","s":"Octavia","u":"/docs/iaas/guides/upgrade-guide/openstack","h":"#octavia","p":1226},{"i":1244,"t":"This step is only necessary if the Amphora Driver is used. If OVN is used as the driver, this step is not necessary.","s":"Amphora image update","u":"/docs/iaas/guides/upgrade-guide/openstack","h":"#amphora-image-update","p":1226},{"i":1246,"t":"This step is only necessary if the Amphora Driver is used. If OVN is used as the driver, this step is not necessary.","s":"Amphora rotation","u":"/docs/iaas/guides/upgrade-guide/openstack","h":"#amphora-rotation","p":1226},{"i":1248,"t":"osism apply -a pull horizon osism apply -a upgrade horizon","s":"Horizon","u":"/docs/iaas/guides/upgrade-guide/openstack","h":"#horizon","p":1226},{"i":1250,"t":"osism apply openstackclient","s":"OpenStack client","u":"/docs/iaas/guides/upgrade-guide/openstack","h":"#openstack-client","p":1226},{"i":1252,"t":"TODO","s":"Compute","u":"/docs/iaas/overview/compute","h":"","p":1251},{"i":1254,"t":"TODO","s":"Knowledge","u":"/docs/iaas/overview/knowledge","h":"","p":1253},{"i":1256,"t":"TODO","s":"Storage","u":"/docs/iaas/overview/storage","h":"","p":1255},{"i":1258,"t":"TODO","s":"Network","u":"/docs/iaas/overview/network","h":"","p":1257},{"i":1260,"t":"The followig section is a reasonably detailed hands on description of how to configure a federation between two separate SCS compliant domains by means of Keycloak Identity Brokering. If we decide to use Keycloak as a component to allow self service by tenants, then this documentation may be a useful addition to some tenant facing documentation (or for the SCS operators too). OTOH one could probably also script pretty much everything of this to allow tenants to use a CLI tool to automate the setup. For that purpose the documentation may be useful to guide the implementation of such a scripted solution.","s":"Proposal for documentation for Keycloak to Keycloak Federation (WebSSO)","u":"/docs/iam/intra-SCS-federation-setup-description-for-osism-doc-operations","h":"","p":1259},{"i":1262,"t":"Assume you have two CSPs using SCS. The first one wants to grant access to users of the other. So let's call the first domain \"resource domain\" and the second one \"accounts domain\". Both domains need to agree upon a name for the \"OIDC RP\" (which Keycloak calls Clients). The Keycloak in the \"resource domain\" will be the OIDC RP and the Keycloak in the \"accounts domain\" will be the OIDC OP. Assuming the \"resource domain\" is called foo and the \"accounts domain\" is called bar, the name for the \"OIDC RP\" could be oidc-rp-foo. In the accounts domain (bar) open Keycloak realm osism, click on Clients in the sidebar and click on Create client. Leave the client type as OpenID Connect and enter the Client ID, e.g. oidc-rp-foo. Turn on Client authentication for it and click Save. On the Client details page open the tab Credentials and copy the Client secret. Communicate this to the operato of the \"resource domain\" foo via a secure channel. In the resource domain (foo) open Keycloak realm osism, click on Identity providers and create a new provider definition of type OpenID Connect v1.0. As Alias choose a name, e.g. oidc-op-bar. Don't copy the Redirect URI given at the top yet, because is will change depending on the chosen Alias. Instead, scroll down to the mandatory field Discovery endpoint and paste the OpenID Connect metadata URL of the KEycloak realm osism in the \"accounts domain\" (bar). The operator of the \"accounts domain\" (bar) may easily copy that URL from the Realm Settins in the sidebar of his Keycloak instance, where the Endpoints are listed on the bottom of that form. The URL may have the format https://bar.com/auth/realms/osism/.well-known/openid-configuration. Once you leave that input field, Keycloak will attempt to fetch the metadata and extract the required details about protocol enspoints from the retrieved document. If this shows an error, it will give you an HTTP status code. If this shows an error code of 500, then this may be caused by a failure in certificate verification. In that case you may want to check the output of docker logs keycloak for java stack traces. If you find any, the top of those stack traces may indicate what kind of problem occurred to the java code. From here we will assume that the emtadata URL could be fecthed without any issues. Now, go to the bottom of that form and insert tjhe Client ID (oidc-rp-foo) and the Client secret that was provided by the operator of the \"accounts domain\" (bar). Finally click on Add. From the Provider Details page on the top for the Settings tab copy the value of the Redirect URI and communicate it back to the operator of the \"accounts domain\" (bar). In the accounts domain (bar) open Keycloak realm osism, click on Clients in the sidebar and click on the name of the OIDC RP clinent that you created for domain foo (e.g. oidc-rp-foo). On the Client details page on the tab Settings fill in the field Valid redirect URIs with the value obtained from the resource domain (foo), which should look similar to https://foo.com/auth/realms/osism/broker/oidc-op-bar/endpoint. Additionally the Valid post logout redirect URIs need to be set to something like https://foo.com/auth/realms/osism/*. To test federated login in the \"resource domain\" (foo) open the URL of the Keycloak admin console for the realm osism: https://foo.com/auth/admin/osism/console (or https://foo.com/auth/realms/osism/protocol/openid-connect/auth?client_id=security-admin-console). Ignore the top section of the login form titled Sign in to your account and choose one of the OIDC OP federation choises below the line Or sign in with. In this example it would be oidc-op-bar. This should redirect your browser to the authentication endpoint of the \"accounts domain\" (https://bar.com/auth/realms/osism/protocol/openid-connect/auth?scope=openid&...) where you should be able to log in with credentials that are valid in the \"accounts domain\" (bar). After successull authentication your broser should be redirected to admin console of the \"resource domain\", which may offer you a \"first login flow\" form where you can choose a username, email, firstname and lastname. The details depend on the Mappers that have been configured for the Identity Provider oidc-op-bar. After that you will be presented with a Keycloak themed page with the error message Request failed with status code 403, which is normal because the test account is not authorized to access any elements of the Keycloak admin console.","s":"Detailed tutorial on how to configure Federation (OpenID Connect) between two Keycloak instances in two separate SCS domains","u":"/docs/iam/intra-SCS-federation-setup-description-for-osism-doc-operations","h":"#detailed-tutorial-on-how-to-configure-federation-openid-connect-between-two-keycloak-instances-in-two-separate-scs-domains","p":1259},{"i":1264,"t":"TODO","s":"Overview","u":"/docs/operating-scs/audits/","h":"","p":1263},{"i":1266,"t":"This represents a part of the decision process related to the overall structure the API wants to represent. Color meaning: Blue: Existing structure Red: Deprecated / removed Green: New","s":"Component Overview","u":"/docs/operating-scs/components/status-page/docs/component_overview","h":"","p":1265},{"i":1268,"t":"Illustrating multiple interchangable logical \"layers\" of possible Status Page application stacks: Note that not everything that is shown here, actually exists or was tested. It is just shown for illustration purposes.","s":"Components","u":"/docs/operating-scs/components/status-page/docs/components","h":"","p":1267},{"i":1270,"t":"Service providers often times want to communicate the status of their systems transparently to their users. A commonly used pattern is to provide a \"status page\" web application, where the current system health as well as recent incidents are made available. SCS strives to implement a status page that works well, while being interoperable with other systems. note How was the decision to implement a new status page application made? What were the requirements? See the decision record. To be easily interoperable with other software, being \"API-first\" is a priority. As such, the status page should not need to be a typical monolithic web application (even though it could be), hence making it possible to split functionality into an API server and a frontend component.","s":"Overview","u":"/docs/operating-scs/components/status-page/docs/overview","h":"","p":1269},{"i":1272,"t":"The SCS status page API (as opposed to actual implementations) is supposed to be as un-opinionated as possible regarding deployment, user management, persistence and tech stack, to allow operators/developers (1) to make their own decisions regarding these topics and (2) to quickly implement the API with their own tech stack opinions, if the reference implementation does not fit theirs. In particular, the API has no opinion about: How authentication/authorization is done (apart from splitting Read-only from Read-write 1; See below) Server implementation, used database, deployment automation, high availability However, as un-opinionated the API (in its first iteration) strives to be, it is...: a REST API (no GRPC/GraphQL/...) defined using an OpenAPI file to make use of OpenAPI tooling split in two parts 1: Read-only anonymous access Read-write authenticated access","s":"The SCS status page API","u":"/docs/operating-scs/components/status-page/docs/overview","h":"#the-scs-status-page-api","p":1269},{"i":1274,"t":"It is envisioned to have a well-maintained reference implementation of the status page API with some basic tech stack decisions made, to not require anyone to implement the API themselves: Programming Language: Go Persistence: Postgres compatible database","s":"Reference implementation","u":"/docs/operating-scs/components/status-page/docs/overview","h":"#reference-implementation","p":1269},{"i":1276,"t":"The SCS status page frontend is supposed to be an application which uses the status page API to get information. This could be an CLI tool as well as an web application.","s":"The SCS status page frontend","u":"/docs/operating-scs/components/status-page/docs/overview","h":"#the-scs-status-page-frontend","p":1269},{"i":1278,"t":"It is envisioned to have a well-maintained reference implementation of an status page frontend with some basic tech stack decisions made: Platform: Web (HTML/JS/...) Framework: VueJS, Vuetify In the future↩","s":"Reference implementation","u":"/docs/operating-scs/components/status-page/docs/overview","h":"#reference-implementation-1","p":1269},{"i":1280,"t":"When implementing any system to be used by a group of potential users, there will be varying use cases and opinions about API's, programming languages, persistence models, authentication, authorization, deployment options and so on. Hence, building a complete one-fits-all solution is difficult, but (while offering a pretty un-opinionated reference implementation) even finding consensus on a few basic concepts may make adaptation and integration of different solutions possible. The \"levels\" of consensus could be split into: Consensus on... Resource Definition \"What is an incident?\" Core REST API Spec General Architecture \"Monolithic Web App or multiple components?\" \"Use static password file or rely on OIDC provider?\" (If any:) Interfaces between components: AuthN mechanisms AuthZ decisions Implementation of core component(s) \"Use reference implementation components?\" \"Go vs. JavaScript?\" \"Postgres vs. MySQL?\" Choice of all used components \"Policy: Istio vs. traefik?\" \"Deployment: Helm vs. ansible?\" \"dex vs. keycloak vs. zitadel?\" Every user of the Status Page (API) should be able to either make full use of the full reference implementation, building little to none on their own; Or just pick core concepts/API's/automation and build partial compatibility. E.g. while the value on agreeing on every aspect would bring the most value, this most likely is not likely to happen, but adopting only the \"Resource Definition\", should ideally bring value already.","s":"\"Levels of consensus\"","u":"/docs/operating-scs/components/status-page/docs/levels_of_consensus","h":"","p":1279},{"i":1282,"t":"TODO","s":"Guide 1","u":"/docs/operating-scs/guides/guide-1","h":"","p":1281},{"i":1284,"t":"TODO","s":"Overview","u":"/docs/operating-scs/incident-management/","h":"","p":1283},{"i":1286,"t":"TODO","s":"Overview","u":"/docs/operating-scs/lifecycle-management/","h":"","p":1285},{"i":1288,"t":"TODO","s":"Overview","u":"/docs/operating-scs/logging/","h":"","p":1287},{"i":1290,"t":"TODO","s":"Overview","u":"/docs/operating-scs/monitoring/","h":"","p":1289},{"i":1292,"t":"The Metrics and events we want to use in the metering process can be defined in two ways. The first one is to allow ceilometer to poll distinct metrics and events. This can be achived by setting up ceilometers config files.","s":"Metering Configuration","u":"/docs/operating-scs/metering/meter_configuration","h":"","p":1291},{"i":1294,"t":"there is the polling.yaml file that describes what metrics to poll and when. It allows to create multiple sources for the ceilometer pipeline with different metrics and intervals. ceilometer polling ceilometer polling metrics","s":"1. ceilometer metering configuration","u":"/docs/operating-scs/metering/meter_configuration","h":"#1-ceilometer-metering-configuration","p":1291},{"i":1296,"t":"--- sources: - name: billing_source # 'source name' interval: 300 # 'how often the samples should be generated' meters: - \"volume.size\" # 'meter filter' # - \"*\" # 'using all pollsters in the event_definitions file all data structure of events are defined. If a message with a distinct event_type appears, the Fields and values from the message are matched with the Event-object. ceilometer events ceilometer event_definitions","s":"1.1 polling.yaml","u":"/docs/operating-scs/metering/meter_configuration","h":"#11-pollingyaml","p":1291},{"i":1298,"t":"--- - event_type: \"compute.instance.*\" traits: &instance_traits tenant_id: fields: payload.tenant_id user_id: fields: payload.user_id instance_id: fields: payload.instance_id display_name: fields: payload.display_name resource_id: fields: payload.instance_id cell_name: fields: payload.cell_name host: fields: publisher_id.`split(., 1, 1)` service: fields: publisher_id.`split(., 0, -1)` memory_mb: type: int fields: payload.memory_mb disk_gb: type: int fields: payload.disk_gb root_gb: type: int fields: payload.root_gb ephemeral_gb: type: int fields: payload.ephemeral_gb vcpus: type: int fields: payload.vcpus instance_type_id: fields: payload.instance_type_id instance_type: fields: payload.instance_type state: fields: payload.state os_architecture: fields: payload.image_meta.'org.openstack__1__architecture' os_version: fields: payload.image_meta.'org.openstack__1__os_version' os_distro: fields: payload.image_meta.'org.openstack__1__os_distro' launched_at: type: datetime fields: payload.launched_at deleted_at: type: datetime fields: payload.deleted_at - event_type: compute.instance.create.end traits: <<: *instance_traits availability_zone: fields: payload.availability_zone - event_type: compute.instance.update traits: <<: *instance_traits old_state: fields: payload.old_state - event_type: compute.instance.exists traits: <<: *instance_traits audit_period_beginning: type: datetime fields: payload.audit_period_beginning audit_period_ending: type: datetime fields: payload.audit_period_ending - event_type: [ \"volume.exists\", \"volume.retype\", \"volume.create.*\", \"volume.delete.*\", \"volume.resize.*\", \"volume.attach.*\", \"volume.detach.*\", \"volume.update.*\", \"snapshot.exists\", \"snapshot.create.*\", \"snapshot.delete.*\", \"snapshot.update.*\", \"volume.transfer.accept.end\", \"snapshot.transfer.accept.end\", ] traits: &cinder_traits user_id: fields: payload.user_id project_id: fields: payload.tenant_id availability_zone: fields: payload.availability_zone display_name: fields: payload.display_name replication_status: fields: payload.replication_status status: fields: payload.status created_at: type: datetime fields: payload.created_at image_id: fields: payload.glance_metadata[?key=image_id].value instance_id: fields: payload.volume_attachment[0].server_id - event_type: [ \"volume.transfer.*\", \"volume.exists\", \"volume.retype\", \"volume.create.*\", \"volume.delete.*\", \"volume.resize.*\", \"volume.attach.*\", \"volume.detach.*\", \"volume.update.*\", \"snapshot.transfer.accept.end\", ] traits: <<: *cinder_traits resource_id: fields: payload.volume_id host: fields: payload.host size: type: int fields: payload.size type: fields: payload.volume_type replication_status: fields: payload.replication_status - event_type: [\"snapshot.transfer.accept.end\"] traits: <<: *cinder_traits resource_id: fields: payload.snapshot_id project_id: fields: payload.tenant_id - event_type: [\"share.create.*\", \"share.delete.*\", \"share.extend.*\", \"share.shrink.*\"] traits: &share_traits share_id: fields: payload.share_id user_id: fields: payload.user_id project_id: fields: payload.tenant_id snapshot_id: fields: payload.snapshot_id availability_zone: fields: payload.availability_zone status: fields: payload.status created_at: type: datetime fields: payload.created_at share_group_id: fields: payload.share_group_id size: type: int fields: payload.size name: fields: payload.name proto: fields: payload.proto is_public: fields: payload.is_public description: fields: payload.description host: fields: payload.host - event_type: [ \"snapshot.exists\", \"snapshot.create.*\", \"snapshot.delete.*\", \"snapshot.update.*\", ] traits: <<: *cinder_traits resource_id: fields: payload.snapshot_id volume_id: fields: payload.volume_id - event_type: [\"image_volume_cache.*\"] traits: image_id: fields: payload.image_id host: fields: payload.host - event_type: [\"image.create\", \"image.update\", \"image.upload\", \"image.delete\"] traits: &glance_crud project_id: fields: payload.owner resource_id: fields: payload.id name: fields: payload.name status: fields: payload.status created_at: type: datetime fields: payload.created_at user_id: fields: payload.owner deleted_at: type: datetime fields: payload.deleted_at size: type: int fields: payload.size - event_type: image.send traits: &glance_send receiver_project: fields: payload.receiver_tenant_id receiver_user: fields: payload.receiver_user_id user_id: fields: payload.owner_id image_id: fields: payload.image_id destination_ip: fields: payload.destination_ip bytes_sent: type: int fields: payload.bytes_sent - event_type: orchestration.stack.* traits: &orchestration_crud project_id: fields: payload.tenant_id user_id: fields: [\"ctxt.trustor_user_id\", \"ctxt.user_id\"] resource_id: fields: payload.stack_identity name: fields: payload.name - event_type: sahara.cluster.* traits: &sahara_crud project_id: fields: payload.project_id user_id: fields: ctxt.user_id resource_id: fields: payload.cluster_id name: fields: payload.name - event_type: sahara.cluster.health traits: &sahara_health <<: *sahara_crud verification_id: fields: payload.verification_id health_check_status: fields: payload.health_check_status health_check_name: fields: payload.health_check_name health_check_description: fields: payload.health_check_description created_at: type: datetime fields: payload.created_at updated_at: type: datetime fields: payload.updated_at - event_type: [ \"identity.user.*\", \"identity.project.*\", \"identity.group.*\", \"identity.role.*\", \"identity.OS-TRUST:trust.*\", \"identity.region.*\", \"identity.service.*\", \"identity.endpoint.*\", \"identity.policy.*\", ] traits: &identity_crud resource_id: fields: payload.resource_info initiator_id: fields: payload.initiator.id project_id: fields: payload.initiator.project_id domain_id: fields: payload.initiator.domain_id - event_type: identity.role_assignment.* traits: &identity_role_assignment role: fields: payload.role group: fields: payload.group domain: fields: payload.domain user: fields: payload.user project: fields: payload.project - event_type: identity.authenticate traits: &identity_authenticate typeURI: fields: payload.typeURI id: fields: payload.id action: fields: payload.action eventType: fields: payload.eventType eventTime: type: datetime fields: payload.eventTime outcome: fields: payload.outcome initiator_typeURI: fields: payload.initiator.typeURI initiator_id: fields: payload.initiator.id initiator_name: fields: payload.initiator.name initiator_host_agent: fields: payload.initiator.host.agent initiator_host_addr: fields: payload.initiator.host.address target_typeURI: fields: payload.target.typeURI target_id: fields: payload.target.id observer_typeURI: fields: payload.observer.typeURI observer_id: fields: payload.observer.id - event_type: objectstore.http.request traits: &objectstore_request typeURI: fields: payload.typeURI id: fields: payload.id action: fields: payload.action eventType: fields: payload.eventType eventTime: type: datetime fields: payload.eventTime outcome: fields: payload.outcome initiator_typeURI: fields: payload.initiator.typeURI initiator_id: fields: payload.initiator.id initiator_project_id: fields: payload.initiator.project_id target_typeURI: fields: payload.target.typeURI target_id: fields: payload.target.id target_action: fields: payload.target.action target_metadata_path: fields: payload.target.metadata.path target_metadata_version: fields: payload.target.metadata.version target_metadata_container: fields: payload.target.metadata.container target_metadata_object: fields: payload.target.metadata.object observer_id: fields: payload.observer.id - event_type: [ \"network.*\", \"subnet.*\", \"port.*\", \"router.*\", \"floatingip.*\", \"firewall.*\", \"firewall_policy.*\", \"firewall_rule.*\", \"vpnservice.*\", \"ipsecpolicy.*\", \"ikepolicy.*\", \"ipsec_site_connection.*\", ] traits: &network_traits user_id: fields: ctxt.user_id project_id: fields: ctxt.tenant_id - event_type: network.* traits: <<: *network_traits name: fields: payload.network.name resource_id: fields: [\"payload.network.id\", \"payload.id\"] - event_type: subnet.* traits: <<: *network_traits name: fields: payload.subnet.name resource_id: fields: [\"payload.subnet.id\", \"payload.id\"] - event_type: port.* traits: <<: *network_traits name: fields: payload.port.name resource_id: fields: [\"payload.port.id\", \"payload.id\"] - event_type: router.* traits: <<: *network_traits name: fields: payload.router.name resource_id: fields: [\"payload.router.id\", \"payload.id\"] - event_type: floatingip.* traits: <<: *network_traits resource_id: fields: [\"payload.floatingip.id\", \"payload.id\"] - event_type: firewall.* traits: <<: *network_traits name: fields: payload.firewall.name resource_id: fields: [\"payload.firewall.id\", \"payload.id\"] - event_type: firewall_policy.* traits: <<: *network_traits name: fields: payload.firewall_policy.name resource_id: fields: [\"payload.firewall_policy.id\", \"payload.id\"] - event_type: firewall_rule.* traits: <<: *network_traits name: fields: payload.firewall_rule.name resource_id: fields: [\"payload.firewall_rule.id\", \"payload.id\"] - event_type: vpnservice.* traits: <<: *network_traits name: fields: payload.vpnservice.name resource_id: fields: [\"payload.vpnservice.id\", \"payload.id\"] - event_type: ipsecpolicy.* traits: <<: *network_traits name: fields: payload.ipsecpolicy.name resource_id: fields: [\"payload.ipsecpolicy.id\", \"payload.id\"] - event_type: ikepolicy.* traits: <<: *network_traits name: fields: payload.ikepolicy.name resource_id: fields: [\"payload.ikepolicy.id\", \"payload.id\"] - event_type: ipsec_site_connection.* traits: <<: *network_traits resource_id: fields: [\"payload.ipsec_site_connection.id\", \"payload.id\"] - event_type: \"*http.*\" traits: &http_audit project_id: fields: payload.initiator.project_id user_id: fields: payload.initiator.id typeURI: fields: payload.typeURI eventType: fields: payload.eventType action: fields: payload.action outcome: fields: payload.outcome id: fields: payload.id eventTime: type: datetime fields: payload.eventTime requestPath: fields: payload.requestPath observer_id: fields: payload.observer.id target_id: fields: payload.target.id target_typeURI: fields: payload.target.typeURI target_name: fields: payload.target.name initiator_typeURI: fields: payload.initiator.typeURI initiator_id: fields: payload.initiator.id initiator_name: fields: payload.initiator.name initiator_host_address: fields: payload.initiator.host.address - event_type: \"*http.response\" traits: <<: *http_audit reason_code: fields: payload.reason.reasonCode - event_type: [\"dns.domain.create\", \"dns.domain.update\", \"dns.domain.delete\"] traits: &dns_domain_traits status: fields: payload.status retry: fields: payload.retry description: fields: payload.description expire: fields: payload.expire email: fields: payload.email ttl: fields: payload.ttl action: fields: payload.action name: fields: payload.name resource_id: fields: payload.id created_at: type: datetime fields: payload.created_at updated_at: type: datetime fields: payload.updated_at version: fields: payload.version parent_domain_id: fields: parent_domain_id serial: fields: payload.serial - event_type: dns.domain.exists traits: <<: *dns_domain_traits audit_period_beginning: type: datetime fields: payload.audit_period_beginning audit_period_ending: type: datetime fields: payload.audit_period_ending - event_type: trove.* traits: &trove_base_traits instance_type: fields: payload.instance_type user_id: fields: payload.user_id resource_id: fields: payload.instance_id instance_type_id: fields: payload.instance_type_id launched_at: type: datetime fields: payload.launched_at instance_name: fields: payload.instance_name state: fields: payload.state nova_instance_id: fields: payload.nova_instance_id service_id: fields: payload.service_id created_at: type: datetime fields: payload.created_at region: fields: payload.region - event_type: [ \"trove.instance.create\", \"trove.instance.modify_volume\", \"trove.instance.modify_flavor\", \"trove.instance.delete\", ] traits: &trove_common_traits name: fields: payload.name availability_zone: fields: payload.availability_zone instance_size: type: int fields: payload.instance_size volume_size: type: int fields: payload.volume_size nova_volume_id: fields: payload.nova_volume_id - event_type: trove.instance.create traits: <<: [*trove_base_traits, *trove_common_traits] - event_type: trove.instance.modify_volume traits: <<: [*trove_base_traits, *trove_common_traits] old_volume_size: type: int fields: payload.old_volume_size modify_at: type: datetime fields: payload.modify_at - event_type: trove.instance.modify_flavor traits: <<: [*trove_base_traits, *trove_common_traits] old_instance_size: type: int fields: payload.old_instance_size modify_at: type: datetime fields: payload.modify_at - event_type: trove.instance.delete traits: <<: [*trove_base_traits, *trove_common_traits] deleted_at: type: datetime fields: payload.deleted_at - event_type: trove.instance.exists traits: <<: *trove_base_traits display_name: fields: payload.display_name audit_period_beginning: type: datetime fields: payload.audit_period_beginning audit_period_ending: type: datetime fields: payload.audit_period_ending - event_type: profiler.* traits: project: fields: payload.project service: fields: payload.service name: fields: payload.name base_id: fields: payload.base_id trace_id: fields: payload.trace_id parent_id: fields: payload.parent_id timestamp: type: datetime fields: payload.timestamp host: fields: payload.info.host path: fields: payload.info.request.path query: fields: payload.info.request.query method: fields: payload.info.request.method scheme: fields: payload.info.request.scheme db.statement: fields: payload.info.db.statement db.params: fields: payload.info.db.params - event_type: \"magnum.cluster.*\" traits: &magnum_cluster_crud id: fields: payload.id typeURI: fields: payload.typeURI eventType: fields: payload.eventType eventTime: type: datetime fields: payload.eventTime action: fields: payload.action outcome: fields: payload.outcome initiator_id: fields: payload.initiator.id initiator_typeURI: fields: payload.initiator.typeURI initiator_name: fields: payload.initiator.name initiator_host_agent: fields: payload.initiator.host.agent initiator_host_address: fields: payload.initiator.host.address target_id: fields: payload.target.id target_typeURI: fields: payload.target.typeURI observer_id: fields: payload.observer.id observer_typeURI: fields: payload.observer.typeURI - event_type: \"alarm.*\" traits: id: fields: payload.alarm_id user_id: fields: payload.user_id project_id: fields: payload.project_id on_behalf_of: fields: payload.on_behalf_of severity: fields: payload.severity detail: fields: payload.detail type: fields: payload.type The event_pipeline can be used to filter events and pipeline them to different publishers. the notifier publisher is the message queue broadcasster (RabbitMQ).","s":"1.2 event_definitions.yaml","u":"/docs/operating-scs/metering/meter_configuration","h":"#12-event_definitionsyaml","p":1291},{"i":1300,"t":"--- sources: - name: event_source # 'source name' events: - \"*\" # 'event filter' sinks: - event_sink # 'sink name' sinks: - name: event_sink # 'sink name' publishers: # 'list of publishers' - notifier:// - http://localhost:8088/post_json The pipeline.yaml can be used to filter and pipeline all metrics and events since events send via the notifier also appears in the meters and send them to different publishers. In our case we want to push to the metering api.","s":"1.3 event_pipeline.yaml","u":"/docs/operating-scs/metering/meter_configuration","h":"#13-event_pipelineyaml","p":1291},{"i":1302,"t":"--- sources: - name: meter_source meters: - \"*\" sinks: - meter_sink sinks: - name: meter_sink publishers: - gnocchi://?archive_policy=ceilometer-low&filter_project=service - http://localhost:8088/post_json","s":"1.4 pipeline.yaml","u":"/docs/operating-scs/metering/meter_configuration","h":"#14-pipelineyaml","p":1291},{"i":1304,"t":"(Release Date: 2021-07-15)","s":"Release Notes for SCS Release 0","u":"/docs/releases/Release0","h":"","p":1303},{"i":1306,"t":"The main focus of R0 is to demonstrate the viability of our approach to a much broader audience by providing a well-documented testbed. This will allow anyone interested to study the system in real-life, test, contribute, compare, ... it. Also we learn performing the release process.","s":"Scope","u":"/docs/releases/Release0","h":"#scope","p":1303},{"i":1308,"t":"Fully automated virtual (testbed setup) with ansible (terraform bootstrap to create storage, networking and VM resources for bootstrapping via cloud-init injected scripts that call ansible).) The infrastructure, management and openstack services are all deployed in containers. Included tools for Operations: ARA, Netbox, Cockpit, Netdata, Skydive (opt-in), Patchman, phpMyAdmin, Elasticsearch (b/f license change), Kibana, Grafana, influxdb Validation: Rally, Refstack Infrastructure: Linux, KVM, ceph (pacific), OpenVSwitch, OVN, MariaDB, RabbitMQ, Redis, Etcd, HAproxy, Keepalived, Memcached, Keycloak IaaS (OpenStack - Wallaby): keystone, nova, glance, cinder, neutron, octavia, horizon Optional OpenStack services: designate, heat, gnocchi, ceilometer, aodh, panko, senlin, barbican, manila, magnum See testbed SBOM for a complete list. The exact versions of the contained components can be retrieved from the release repo of OSISM.","s":"Features","u":"/docs/releases/Release0","h":"#features","p":1303},{"i":1310,"t":"See main README.","s":"Get SCS","u":"/docs/releases/Release0","h":"#get-scs","p":1303},{"i":1312,"t":"Nothing major known yet.","s":"Known Bugs","u":"/docs/releases/Release0","h":"#known-bugs","p":1303},{"i":1314,"t":"While already in productive use (on bare metal) by two providers, the bare metal setup currently has a few more manual steps than we would like. This will improve with the next releases. We have worked hard on supporting identity federation (OIDC and SAML) during the last few months. We have also spent significant effort on getting the k8s stack with k8s cluster API into a good shape. However, we have determined that we do not yet consider those two key pieces as production-ready. The goal is to change that for R1 (see below). For now, you can use the software to see where SCS is going and test our technical preview code. We really appreciate feedback we get on these pieces as well. However keep in mind that we do not guarantee to ship technical previews from a Release as production-ready software in one of the next releases. We certainly hope to do so. To test how our k8s aaS platform will look like, have a look at https://github.com/SovereignCloudStack/k8s-cluster-api-provider You can follow the documentation to set up the k8s cluster API on an SCS cloud (or other well configured OpenStack clouds that support octavia). The openstack-health-monitor is used by us to monitor that the API works and successfully creates working resources in finite time. We plan to integrate it with a dashboard and an alarming mechanism in the next releases.","s":"Technical Previews","u":"/docs/releases/Release0","h":"#technical-previews","p":1303},{"i":1316,"t":"See Release Numbering scheme. The containers have version number v1.0.0 for R0.","s":"Release tagging","u":"/docs/releases/Release0","h":"#release-tagging","p":1303},{"i":1318,"t":"Updating the software can conveniently be done from the manager node by running the ansible playbooks again. Details are in the OSISM testbed documentation.","s":"Updates","u":"/docs/releases/Release0","h":"#updates","p":1303},{"i":1320,"t":"See main README file.","s":"Bug reporting","u":"/docs/releases/Release0","h":"#bug-reporting","p":1303},{"i":1322,"t":"TODO","s":"Overview","u":"/docs/operating-scs/overview","h":"","p":1321},{"i":1324,"t":"(Release Date: 2021-09-29)","s":"Release Notes for SCS Release 1","u":"/docs/releases/Release1","h":"","p":1323},{"i":1326,"t":"Main goals for Release 1 (R1) was the strengthening of our CI test coverage and integration, the operational tooling (metrics collection, dashboards, logging), latest versions of upstream software (OpenStack Wallaby, Kubernetes-1.21.5), support for Bare Metal service, progress on user federation for clouds, and progress on the integration of the container layer with k8s Cluster API (now in version 0.4.x).","s":"Scope","u":"/docs/releases/Release1","h":"#scope","p":1323},{"i":1329,"t":"For our internal development workflows we are planning to switch from GitHub Actions to Zuul-CI (mostly). The infrastructure itself is already available, yet most of the repositories in the SovereignCloudStack organisation have not switched over. Reasons for switching include cross-dependencies, scalability and costs. Reasons for using Zuul-CI include the close connection to the OpenStack project and the enormous flexibility in comparison to other similar tools. On top of that you have also gating instead of only CI. A quick example for a Zuul-CI operated repository can be found here: https://github.com/SovereignCloudStack/zuul-sandbox.","s":"Zuul-CI","u":"/docs/releases/Release1","h":"#zuul-ci","p":1323},{"i":1332,"t":"We provide generic configuration examples and blueprints for prometheus rules and grafana dashboards. The examples need to be understood and adapted to the particular needs of your environment. You can find the examples at https://github.com/osism/kolla-operations. With R2 we plan to implement a basic set of these alerts and dashboards in the testbed deployment in order to make them even easier consumable for new users. Feel free to give feedback on the examples and contribute your own generic examples. We're working on bringing a basic set of prometheus exporters to the OpenStack-kolla upstream community. As part of our effort to add more monitoring tooling, we're integrating further prometheus exporters such as libvirt and ovn. Integration is targeted for R2. More detailed information on monitoring topics will be continously provided in the corresponding design document.","s":"Prometheus exporters and Grafana dashboards","u":"/docs/releases/Release1","h":"#prometheus-exporters-and-grafana-dashboards","p":1323},{"i":1334,"t":"We have made some progress with openstack-health-monitor since R0, but we have not yet created ready-to-be-used influx data collection and the grafana dashboard. While the black box monitoring is perceived as very useful, the script certainly has reached a complexity that is not handled well with bash scripting and makes it a difficult to maintain and even to use tool, so the usefulness of shipping it with SCS to make it available for Ops teams to monitor has been questioned. Instead an expectation has been expressed that the SCS uses this to monitor all SCS partner clouds and provides some transparency this way to the public -- and detailed statistics via e.g. a prometheus exporter to the respective cloud provider. This is currently under consideration.","s":"openstack-health-monitor","u":"/docs/releases/Release1","h":"#openstack-health-monitor","p":1323},{"i":1337,"t":"OSISM now enables kolla-ansible centralized logging by default. The default rules need to be further refined to suit your needs. We plan to implement a more generic set of rules for R2.","s":"Central logging","u":"/docs/releases/Release1","h":"#central-logging","p":1323},{"i":1340,"t":"Logging in to Horizon by authenticating with OIDC via Keycloak is now possible. For details see the testbed documentation.","s":"OIDC support via keycloak","u":"/docs/releases/Release1","h":"#oidc-support-via-keycloak","p":1323},{"i":1342,"t":"Only TLS secured deployments get full support. Without TLS, certain browsers won't be able to log in. For deatils see the testbed documentation","s":"non-TLS restrictions (testbed)","u":"/docs/releases/Release1","h":"#non-tls-restrictions-testbed","p":1323},{"i":1344,"t":"Clicking Sign Out on the Horizon dashboard doesn't perform a proper OIDC logout. This is documented in osism testbed, with some Keycloak settings that can be relevant for alleviating the issue, but in Release 1 there is no solution for this yet.","s":"Known Issue with OIDC Logout","u":"/docs/releases/Release1","h":"#known-issue-with-oidc-logout","p":1323},{"i":1346,"t":"The ironic Bare Metal service can be deployed with the SCS (OSISM) installation. For it to get full test coverage, a virtual BMC solution has been created, so bare metal can be validated in our testbed setup just as nicely as the other components. While most pieces are ready, the final integration steps are still work-in-progress and will happen after R1.","s":"Bare Metal Service","u":"/docs/releases/Release1","h":"#bare-metal-service","p":1323},{"i":1349,"t":"The container layer on SCS is implemented as a Self-Service, leveraging the Kubernetes cluster API technology. This was provided as a technical preview from the SCS k8s-cluster-api-provider repository for R0 back in July. The focus for R1 was to make it ready for production, so DevOps teams can use this to create and manage their k8s clusters in self-service for development, testing, deployment and production. To achieve this, a lot of work has been invested, updating the cluster API to 0.4 along the way, fixing snapshot classes, enabling optional metrics and ingress services, using application credentials and much improved management scripts. The sonobuoy test automation has been included and successfully used to validate the created clusters. Real-world testing has happened though the Gaia-X Hackathon #1, where clusters were provided on the fly for the various work streams. The detailed list of changes for R1 is covered in the k8s capi provider Release Notes. Still in technical preview, but very promising are the helm charts based k8s cluster management templates also documented there.","s":"Overview and Goals for R1","u":"/docs/releases/Release1","h":"#overview-and-goals-for-r1","p":1323},{"i":1351,"t":"Some of our partners are using Gardener as a layer to manage large fleets of (optionally cross-cloud) k8s clusters. While there is a bit of overlap in functionality, they do happily coexist and our partner is actually using k8s capi to bootstrap clusters on SCS clouds for Gardener management.","s":"Beyond CAPI","u":"/docs/releases/Release1","h":"#beyond-capi","p":1323},{"i":1353,"t":"As of this writing, the list of SCS defined standards still comprises two standards: SCS Flavor naming and standard flavors standard SCS Image naming and metadata standard As before, we continue to rely on OpenStack and CNCF defined standards in addition to this -- the k8s clusters need to pass the conformance tests with sonobuoy and the OpenStack environment the OpenStack powered guidelines (with refstack). There is a discussion on a glossary, detailing what we expect from regions, availability zones etc. Some major parts of it still need to be agreed before a useful doc can be published -- this will happen in due time and is expected before R2.","s":"Standardization","u":"/docs/releases/Release1","h":"#standardization","p":1323},{"i":1355,"t":"We stand on the shoulders of giants: Without all the great work from many open source communities, we would not get anywhere. We are working on automation to create a complete list for all the software that is used and deployed with SCS, so we have a complete Software Bill of Materials (SBoM). The reason this is non-trivial is that we are not aggregating it all ourselves, but rely on pre-integrated pieces, such as Linux distributions, OpenStack, CNCF projects etc. The good news is that these projects are diligent in their work, making sure we don't need to be too worried about security risks or legal risks introduced this way. Nevertheless, the goal of creating a complete graph remains. We have started to put SPDX license identifiers into the SCS produced code, so we make it easier for downstream consumers of our software to automate the license compliance checks when assembling an SBoM. For R1, some of the major projects we build on have had releases that we incorporated and whose release notes we want to link here for convenience: Kubernetes v1.21.x Kubernetes Cluster API v0.4 and k8s cluster-api-provider openstack v0.4 OpenStack Wallaby Release Highlights","s":"SBOM and Links","u":"/docs/releases/Release1","h":"#sbom-and-links","p":1323},{"i":1357,"t":"See Release Numbering scheme -- unchanged from R0. We have added the tag v2.0.0 to the relevant repositories to designate the SCS_RELEASE_R1.","s":"Release tagging","u":"/docs/releases/Release1","h":"#release-tagging","p":1323},{"i":1359,"t":"OIDC Logout doesn't work properly. OIDC Login is meant to be used with TLS, on non-TLS setups it only works with restrictions.","s":"List of known issues & restrictions in R1","u":"/docs/releases/Release1","h":"#list-of-known-issues--restrictions-in-r1","p":1323},{"i":1361,"t":"(Release Date: 2023-03-22)","s":"Release Notes for SCS Release 4","u":"/docs/releases/Release4","h":"","p":1360},{"i":1363,"t":"Release 4 has been developed alongside a set of associated outcomes. These outcomes are comprised of: SCS is standardized SCS is federated SCS is continuously built and tested SCS is understandable SCS enables Operators with an excellent toolbox The SCS project is completely developed in the open, based on the principles of the four opens. Due to this a lot of our work can be tracked and used continuously without waiting for the half-year releases. Especially, but not limited to, this includes our efforts in regards to documentation and our standards. One of the major highlights that happened in the R4 development cycle is our work on assuring SCS is understandable. Be sure to look at our new documentation entry point. We have created a systematic approach to structure documentation which already has been implemented for the OpenStack Image Manager, the OSISM testbed and the K8s Cluster API Provider. More will follow in a continuous manner. Our community has created a growing amount of blog articles which also help to understand the SCS project, its community and the technology that is worked on.","s":"Scope","u":"/docs/releases/Release4","h":"#scope","p":1360},{"i":1365,"t":"OpenStack Zed release Ceph Quincy is available, the default release of Ceph is still Pacific. The base infrastructure is provided by OSISM 5.0.0 which in turn builds on top of kolla and kolla-ansible. With Cloud-in-a-Box there is an easy way to get SCS up and running on a single hardware node as a test environment. There are two blog posts (part 1 and part2) covering it. For new deployments of the IaaS reference implementation Ubuntu 22.04 is recommended while existing installations can be upgraded to R4 while staying on Ubuntu 20.04. With Release 5, upgrading to Ubuntu 22.04 will be required. With osism/node-image an iso image for much easier bootstrapping of new OSISM environments is available now The software for our Kubernetes Cluster-API reference implementation has been updated and highlights are covered in own release notes.","s":"Component Versions and User-visible improvements (highlights)","u":"/docs/releases/Release4","h":"#component-versions-and-user-visible-improvements-highlights","p":1360},{"i":1368,"t":"The Openstack Image Manager has seen many improvements and is the reference command to assure the images available comply with the SCS Image Standard For Ceph, special playbooks were added to validate the deployment status of the OSD, MON and MGR services in OSISM. The commands for use are osism validate ceph-osds, osism validate ceph-mons, and osism validate ceph-mgrs. OVN has been updated to version 22.09. OVS has been updated to version 3.0.1. The testbed uses per default a proxy for container pulling. This will allow for airgapped installations out of the box. Please note: a full airgap support (with local mirrors, etc.) will follow in a future release. The efforts to create a well-maintained status page with well-defined interfaces resulted in an OpenAPI specification (within its own repository) which is intended to be implementable by multiple implementations. The dashboard of the OpenStack Health Monitor is in use by the SCS operators and has proven helpful a number of times in detecting and addressing issues. That said, it only received a few fixes and minor enhancements, as we plan to replace it with a more generic and more maintainable solution soon. The k8s clusters built with our k8s-capi implementation now allow controlling the versions of more components; the latest tested and stable versions are used by default (if enabled). The latest version for the cilium CNI for example allows testing the upcoming k8s gateway API. The k8s cluster now allows filtering access to the kubernetes API by IP ranges. The k8s clusters now have the proxy protocol enabled with the nginx-ingress controller, so client IPs are visible; the previous issue that blocked internal access could be worked around.","s":"Operator focused improvements","u":"/docs/releases/Release4","h":"#operator-focused-improvements","p":1360},{"i":1370,"t":"The testbed has been significantly simplified for new operators and developers and a Quick Start guide has been added.","s":"SCS Developer focused improvements (testbed and k8s cluster management)","u":"/docs/releases/Release4","h":"#scs-developer-focused-improvements-testbed-and-k8s-cluster-management","p":1360},{"i":1372,"t":"For the IaaS reference implementation, please refer to the OSISM 5.0.0 Upgrade Notes. The k8s Cluster Management solution has an enhanced upgrade guide that covers the upgrade of clusters as well as the upgrade of the cluster management server.","s":"Upgrade/Migration notes","u":"/docs/releases/Release4","h":"#upgrademigration-notes","p":1360},{"i":1374,"t":"The ospurge wrapper script has been removed from the osism.services.openstackclient role. The ospurge project is no longer compatible with the current OpenStack SDK. The command openstack project purge can be used as an alternative. The docker-compose package is uninstalled by the osism.commons.docker_compose role. The Compose v2 plugin for Docker is now used instead of the old standalone docker-compose CLI. A dummy script has been added to /usr/local/bin which displays a corresponding message when using docker-compose. Further removals from the IaaS reference implementation, please refer to the OSISM 5.0.0 Removals Section. The k8s cluster parameter ETCD_PRIO_BOOST that was already unused has been removed as announced with R3.","s":"Removals","u":"/docs/releases/Release4","h":"#removals","p":1360},{"i":1377,"t":"For these please also refer to the upstream deprecation notices The role osism.services.bird is deprecated. In future, FRRouting (osism.services.frr) will be used. The role osism.services.minikube is deprecated. In future osism.services.k8s will be used. Heat is deprecated in favor of more generic Infrastructure as Code tools like Terraform as of now and will be removed in the future (exact removal date is not yet known) Swift (currently available as Technical Preview) will be removed in favor of Ceph RGW Trove (currently available as Technical Preview) will be removed in favor of Kubernetes database operators Skydive (currently available as Technical Preview) will be removed in the future, the project is not maintained anymore, last commit is 8th Jan 2022 (https://review.opendev.org/c/openstack/kolla/+/869191) The login to a registry with the osism.services.docker role is deprecated in favor of the new osism.commons.docker_login role.","s":"Deprecations via OSISM","u":"/docs/releases/Release4","h":"#deprecations-via-osism","p":1360},{"i":1379,"t":"Throughout the Release 4 development cycle, the SCS project issued two security advisories for upstream components: In November 2022 an advisory regarding CVE-2022-3602 and CVE-2022-3786 in OpenSSL was issued. Our advisory. In February 2023 an advisory regarding CVE 2022-47951 in OpenStack components nova and glance was published. Our advisory. Fixes were delivered via maintenance updates to existing R3 deployments, but of course also included in the main development branch that became R4.","s":"Security Fixes","u":"/docs/releases/Release4","h":"#security-fixes","p":1360},{"i":1381,"t":"Breakage with old kustomize syntax has been addressed.(k8s-capi/#328) The move of k8s container images from k8s.gcr.io to registry.k8s.io needed adjustments.(k8s-capi/#321)","s":"Resolved Issues","u":"/docs/releases/Release4","h":"#resolved-issues","p":1360},{"i":1383,"t":"The last months saw intense work in the standardization area. The process how standards are created has been documented. The standards are collected in its own standards repository. A machine readable file lists the required (and optional) standards that apply to \"SCS-compatible\" conformance at the IaaS and the Container (KaaS) layer. The referenced executables are used by the compliance checking framework to test existing implementations for compliance. To run the checker, the tester needs access to the infrastructure under test (normal user privileges are sufficient) and standard openstack and kubernetes client tools -- or just use the docker container that is provided. The public clouds based on the SCS reference implementation from plusserver and Noris/Wavecon are tested automatically from us and the live result is visible in standards page. We will enhance the standardization and test coverage significantly in the next months and we hope to list a number of more clouds there soon.","s":"Standards Conformance","u":"/docs/releases/Release4","h":"#standards-conformance","p":1360},{"i":1385,"t":"The code in OSISM and a number of SCS repositories will receive the v5.0.0 tag; some repositories use maintained/v5.0.x and maintained/v5.x branches for providing code that only gets bug- and security fixes (5.0.x) or only those plus selected, backwards-compatible enhancements (5.x).","s":"Release Tagging","u":"/docs/releases/Release4","h":"#release-tagging","p":1360},{"i":1387,"t":"The k8s cluster-API code does not work well with OpenStack API endpoints that require trusting a custom CA. The OpenStack component Horizon has two issues when working with Swift endpoints. One issue is a known bug when uploading objects to Swift endpoints. A workaround will be released shortly after R4. The second issue is that existing Swift containers can not be set to public.","s":"List of known issues & restrictions in R4","u":"/docs/releases/Release4","h":"#list-of-known-issues--restrictions-in-r4","p":1360},{"i":1389,"t":"We appreciate contribution to strategy and implementation, please join our community -- or just leave input on the github issues and PRs. Have a look at our How to contribute page.","s":"Contributing","u":"/docs/releases/Release4","h":"#contributing","p":1360},{"i":1391,"t":"The work for R4 has been done by many contributors from our community. The special thanks goes out to our contributors who participate in our community on a very regular base - without these the various team calls and events like the hackathons would be much less successful and fun. Of course we are leveraging a huge amount of open source technology that has been created by our friends in other communities, many of which are part of the CNCF, Linux Foudation, OIF, and others. We participate and contribute where we can and definitely want to acknowledge the great work that we build upon.","s":"Thanks","u":"/docs/releases/Release4","h":"#thanks","p":1360},{"i":1393,"t":"(Release Date: 2022-09-21)","s":"Release Notes for SCS Release 3","u":"/docs/releases/Release3","h":"","p":1392},{"i":1395,"t":"Main goals for Release 3 (R3) were user federation, increase in deployment and upgrade velocity by improving automated test coverage as well as bringing disk encryption based on tang from the state of a technical preview to be fully supported.","s":"Scope","u":"/docs/releases/Release3","h":"#scope","p":1392},{"i":1397,"t":"We support the latest Kubernetes 1.25 releases. The Kubernetes Cluster API is now available in a stable v1beta1 release 1.2.x with the corresponding cluster-api-provider-openstack 0.6.x. The Kubernetes Cluster API cluster management service has seen major managability improvements. Please consult the k8s cluster api provider release notes for more details. OpenStack Yoga release Ceph Quincy is available, the default release of Ceph is still Pacific. The base infrastructure is provided by OSISM 4.0.0 which in turn builds on top of kolla and kolla-ansible. Disk encryption based on Network bound disk encryption (NBDE) is available.","s":"Component Versions and User-visible improvements (highlights)","u":"/docs/releases/Release3","h":"#component-versions-and-user-visible-improvements-highlights","p":1392},{"i":1400,"t":"Work is underway to supersede openstack-health-monitor with a comprehensive approach using scenarios with ansible playbooks that has been developed and used by T-Systems for their Open Telekom Cloud. Meanwhile, openstack-health-monitor has seen the addition of data collection with telegraf and influxdb as well as a good dashboard with grafana. We have used our keystone to keycloak federation to use keycloak as identity broker to federate identities from other (SCS) clouds' keycloaks. This works well for the Web-Interface; we have still some work to do to also make it smooth also for API/CLI usage. We have documented the current status We believe that Gaia-X self-descriptions should also contain a description of technical properties of services; higher-level services and workloads can than declare their requirements and be matched against lower level services / platforms. In good platforms, most (or all) technical properties are discoverable. In the Gaia-X Hackathon #4, we have worked on a demonstrator that characterizes some aspects of an OpenStack-based IaaS platform and which produces self-descriptions that can be submitted to the Gaia-X trust service, pass the tests and you can be awared a verifiable credential. Code is available in the gx-self-description-generator repo","s":"Operator focused improvements","u":"/docs/releases/Release3","h":"#operator-focused-improvements","p":1392},{"i":1402,"t":"Following significant discussions on how to standardize our cluster management solution, there is a draft concept as part of R3 now, which will be further worked on during the R4 cycle. See Cluster standardization section of the release notes from k8s-cluster-api-provider. While our reference implementation uses the concepts and code from k8s cluster API on top of our SCS reference implementation (OpenStack automated by OSISM), we want to assure that non-OpenStack IaaS and solutions that diverge from cluster-API have the possibility to be SCS compliant. Workload clusters managed by our SCS cluster management solutions can now much more easily receive k8s version upgrades, as the cluster-template no longer needs to be touched for this. There is an Upgrade Guide available now. LUKS encryption is now documented and enabled in the testbed by default. Further noteworthy improvements to testbed: Public DNS for testbed is now available (testbed.osism.xyz), allowing to access services via TLS protected by a wildcard CA certificate. The wireguard VPN service is deployed in the testbed by default. An overview over the used software versions is available from the OSISM release repository as input for a complete SBOM. This allows to e.g. investigate the contents of the used (v4.0.0) images.","s":"SCS Developer focused improvements (testbed and k8s cluster management)","u":"/docs/releases/Release3","h":"#scs-developer-focused-improvements-testbed-and-k8s-cluster-management","p":1392},{"i":1405,"t":"Upgrade from R2 to R3 for cluster management and clusters: See k8s-cluster-api-provider Release Notes for more details. There is an Upgrade Guide written specifically to address the steps needed for upgrading your cluster management and the workload clusters.","s":"Cluster Management","u":"/docs/releases/Release3","h":"#cluster-management","p":1392},{"i":1407,"t":"In environments/kolla/secrets.yml the parameter neutron_ssh_key must be added. neutron_ssh_key: private_key: public_key: The ssh key can be generated as follows: ssh-keygen -t rsa -b 4096 -N \"\" -f id_rsa.neutron -C \"\" -m PEM","s":"OSISM","u":"/docs/releases/Release3","h":"#osism","p":1392},{"i":1409,"t":"The Cockpit service has been removed.","s":"Removals","u":"/docs/releases/Release3","h":"#removals","p":1392},{"i":1411,"t":"Deprecations happen according to our deprecation policy. Linux bridge support has been deprecated by the Neutron team and marked as experimental. If Linux bridge is used in deployments, migrating to OpenVSwitch is recommended. Debian dropped hddtemp (https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1002484), therefore the hddtemp service will be removed from the next OSISM release, as there is no package available for Ubuntu 22.04. Heat will no longer be offered by default in the testbed in the future The following services are currently not used and are deprecated and scheduled for removal as of now: Falco, Jenkins, Rundeck, Lynis, Trivy The docker-compose CLI will be removed and replaced by the new compose plugin for Docker. docker-compose is then no longer available and docker compose must be used instead The cleanup-elasticsearch playbook is deprecated. In the future, the elasticsearch-curator service (part of Kolla) has to be used for Elasticsearch cleanup. All osism- scripts on the manager are deprecated and will be replaced by the new OSISM CLI. The scripts will be removed in the next release","s":"Deprecations","u":"/docs/releases/Release3","h":"#deprecations","p":1392},{"i":1413,"t":"No severe security issues need to be highlighted since Release 2. However, by updating to the latest stable version of the integrated open source components, we benefit from the upstream security fixes and thus recommend to upgrade all SCS environments. Please note that Release 2 maintenance by the SCS project team will end by the end of October.","s":"Security Fixes","u":"/docs/releases/Release3","h":"#security-fixes","p":1392},{"i":1415,"t":"Certificates in k8s clusters are subject to expiration - typically after one year. We ensure these are renewed on control-plane upgrades, but operators may need manual attention in case upgrades are not performed for extended periods of time. This is documented in the k8s-cluster-api-provider's Maintenance and Troubleshooting Guide.","s":"Resolved Issues","u":"/docs/releases/Release3","h":"#resolved-issues","p":1392},{"i":1417,"t":"The clusters created with our cluster-API cluster management solution pass the CNCF conformance tests as reported by sonobuoy. The OpenStack layer passes the OIF trademark tests, so cloud providers leveraging the stack should easily be able to achieve the \"OpenStack powered compute\" trademark certification. Our partner plusserver has achieved a BSI C5 security certification for their SCS implementation pluscloud open. We are working within Gaia-X to further the power of Gaia-X self-descriptions and are closely working with the GXFS project to jointly deliver a standard toolbox for Gaia-X compliant infrastructure and service offerings. The SCS standards for flavor naming and image metadata are largely unchanged since R1. We have however made progress in our reference implementation fully implementing them without any further tweaks. The conformance test for the flavor naming has seen minor improvements; a conformance test for the image metadata has been added.","s":"Standards Conformance","u":"/docs/releases/Release3","h":"#standards-conformance","p":1392},{"i":1419,"t":"See Release Numbering scheme -- unchanged from R0. We have added the tag v4.0.0 to the relevant repositories to designate the SCS_RELEASE_R3. Note that we will release R4 (v5.0.0) in March 2023 and stop providing maintenance updates for R3 at the end of April 2023.","s":"Release Tagging","u":"/docs/releases/Release3","h":"#release-tagging","p":1392},{"i":1421,"t":"Distributed Virtual Routing (DVR) is not officially supported by OSISM, not tested and not recommended.","s":"List of known issues & restrictions in R3","u":"/docs/releases/Release3","h":"#list-of-known-issues--restrictions-in-r3","p":1392},{"i":1423,"t":"We appreciate contribution to strategy and implementation, please join our community -- or just leave input on the github issues and PRs. Have a look at our How to contribute page.","s":"Contributing","u":"/docs/releases/Release3","h":"#contributing","p":1392},{"i":1425,"t":"The work for R3 has been done by many contributors from our community. We have not collected detailed stats that would split out the individual contributor's and companies shares ... we may do so in the future. We are grateful to have such an active and engaged community that has done so much work! Thanks to our contributors! Of course we are leveraging a huge amount of open source technology that has been created by our friends in other communities, many of which are part of the CNCF, Linux Foudation, OIF, and others. We participate and contribute where we can and definitely want to acknowledge the great work that we build upon.","s":"Thanks","u":"/docs/releases/Release3","h":"#thanks","p":1392},{"i":1427,"t":"(Release Date: 2022-03-23)","s":"Release Notes for SCS Release 2","u":"/docs/releases/Release2","h":"","p":1426},{"i":1429,"t":"Main goals for Release 2 (R2) were massive improvements in bare metal deployment and our cluster management layer gaining the ability to handle many clusters independently with a number of optional services.","s":"Scope","u":"/docs/releases/Release2","h":"#scope","p":1426},{"i":1431,"t":"We support the latest Kubernetes 1.22 and 1.23 releases. The Kubernetes Cluster API is now available in a stable v1beta1 release 1.0.x with the corresponding cluster-api-provider-openstack 0.5.x. There are a number of new standard services available for the k8s capi managed clusters, amongst which cert-manager and flux. The clusters have better default settings for the nginx-ingress, anti-affinity for the nodes and the ability to chose cilium over calico and to have stable multi-controller node setups on clouds without low-latency local storage. Please consult the k8s capi provider release notes for more details. OpenStack Xena release We have also enabled SPICE support in addition to noVNC to access the graphical console of VMs. The base infrastructure is provided by OSISM 3.0.0 which in turn build on top of kolla and kolla-ansible.","s":"Component Versions and User-visible improvements (highlights)","u":"/docs/releases/Release2","h":"#component-versions-and-user-visible-improvements-highlights","p":1426},{"i":1434,"t":"The Cluster Management Node is now well prepared to manage numerous clusters with independent settings and different feature sets by creating default settings and then keeping track of various workload clusters in own directories. Documentation has been vastly improved. The Cluster Management node now gets its artifacts directly from git, making incremental updates to it a lot easier, thus also avoiding to disrupt workload clusters through redeployed management nodes to roll out updates. Added dashboards for the operators: Homer Flower Grafana dashboards Work is underway to supersede openstack-health-monitor with a solution that is using tempest and rally. The health-monitor has received improvements though and is at this point still fully supported and recommended -- it has surfaced a number of issues with test clouds, especially failed metadata services. User federation has been prepared to be ready for Gaia-X federation integration Keystone can consume users from Keycloak via OpenID-Connect Keycloak uses the highly-available Galera database cluster now mod_oauth2 support for Keystone Vast improvements in the SCS Deployment automation Full automation of bare metal deployment with Bifrost and Ironic Using NetBox as central source of truth for the complete setup New services available (opt-in) ClamAV, dnsdist, cgit, FRRouting, Nexus, Tang Traefik centrally routes the connections to Nexus, NetBox, phpMyAdmin, Homer, Flower, ARA, cgit","s":"Operator focused improvements","u":"/docs/releases/Release2","h":"#operator-focused-improvements","p":1426},{"i":1436,"t":"We now have scripts that allow us to connect to the workload cluster node network for debugging purposes. The configuration of the testbed was minimized and the deployment was made more production-oriented. Further noteworthy improvements to testbed: TLS is implemented throughout the services also in testbed Virtual BMC in testbed Public DNS for testbed (testbed.osism.xyz) We have a Zuul CI framework running and started migrating CI testing from github actions to using our Zuul infrastructure. Renovate is being used to keep the pinned versions up-to-date and consistent across the many repositories. An overview over the used software versions is available from the OSISM release repository as input for a complete SBOM. This allows to e.g. investigate the contents of the used (v3.0.0) images.","s":"SCS Developer focused improvements (testbed)","u":"/docs/releases/Release2","h":"#scs-developer-focused-improvements-testbed","p":1426},{"i":1439,"t":"The names of a few settings have changed since R1 -- if you have diverged from the defaults, this may require adjusting the environment.tfvars or the clusterctl.yaml files. See k8s-cluster-api-provider Release Notes for more details. The updating approach has fundamentally changed: If you were used to deploy fresh management nodes regularly to benefit from the upstream improvements, this need has been vastly reduced now, allowing for long-living management nodes and workload clusters managed by them.","s":"Cluster Management","u":"/docs/releases/Release2","h":"#cluster-management","p":1426},{"i":1441,"t":"Playbook generic-configuration.yml was deprecated. From now on, please use the playbook of the same name in the manager environment (manager-configuration.yml). All configuration parameters from environments/configuration.yml should be moved to environments/manager/configuration.yml. In kolla-ansible the haproxy role was renamed to loadbalancer. Accordingly, loadbalancer must now be used for the deployment of HAProxy.","s":"OSISM","u":"/docs/releases/Release2","h":"#osism","p":1426},{"i":1443,"t":"OpenStack Victoria images are no longer built and thus no longer kept updated Support for Zabbix has been removed, Prometheus will be used as the only monitoring stack in the future Heimdall as a service was removed, as an alternative Homer is now available","s":"Removals","u":"/docs/releases/Release2","h":"#removals","p":1426},{"i":1445,"t":"Deprecations happen according to our deprecation policy. Cockpit is deprecated in favor of Boundary by HashiCorp or Teleport ceph-ansible is deprecated in preparation for cephadm All osism- scripts on the manager are deprecated and will be replaced by the new OSISM CLI. The scripts will be removed in the next release The following services are currently not used and are deprecated and scheduled for removal as of now: Falco, Jenkins, Rundeck, Lynis, Trivy Heat will no longer be offered by default in the testbed in the future The docker-compose CLI will be removed and replaced by the new compose plugin for Docker. docker-compose is then no longer available and docker compose must be used instead","s":"Deprecations","u":"/docs/releases/Release2","h":"#deprecations","p":1426},{"i":1447,"t":"The Elasticsearch container included in OSISM testbed was exposed to the log4j issue -- new images were provided for addressing this. See the security advisory","s":"Security Fixes","u":"/docs/releases/Release2","h":"#security-fixes","p":1426},{"i":1449,"t":"The nginx-ingress loadbalancer could run into name conflicts before. The loadbalancer now uses a health monitor to avoid routing to the wrong nodes, which typically resulted in 10s delays when connecting to the service behind the ingress controller. cAdvisor has now reduced number of Prometheus metrics and labels exported by default - this will ease the load on the system. This implies that corresponding time series data will no longer be created.","s":"Resolved Issues","u":"/docs/releases/Release2","h":"#resolved-issues","p":1426},{"i":1451,"t":"The clusters created with our cluster-API cluster management solution pass the CNCF conformance tests as reported by sonobuoy. The OpenStack layer passes the OIF trademark tests, so cloud providers leveraging the stack should easily be able to achieve the \"OpenStack powered compute\" trademark certification. Our partner plusserver has achieved a BSI C5 security certification for their SCS implementation pluscloud open. We are working within Gaia-X to further the power of Gaia-X self-descriptions and are closely working with the GXFS project to jointly deliver a standard toolbox for Gaia-X compliant infrastructure and service offerings. The SCS standards for flavor naming and image metadata are largely unchanged since R1. We have however made progress in our reference implementation fully implementing them without any further tweaks.","s":"Standards Conformance","u":"/docs/releases/Release2","h":"#standards-conformance","p":1426},{"i":1453,"t":"See Release Numbering scheme -- unchanged from R0. We have added the tag v3.0.0 to the relevant repositories to designate the SCS_RELEASE_R2. Note that we will release R3 (v4.0.0) in September 2022 and stop providing maintenance updates for R2 at the end of October.","s":"Release Tagging","u":"/docs/releases/Release2","h":"#release-tagging","p":1426},{"i":1456,"t":"Alongside with R2 we published a blog post on some first thoughts on future directions towards R3.","s":"Future directions (selected Highlights)","u":"/docs/releases/Release2","h":"#future-directions-selected-highlights","p":1426},{"i":1458,"t":"We appreciate contribution to strategy and implementation, please join our community -- or just leave input on the github issues and PRs. Have a look at our contributor guide. We also have worked on a Code of Conduct to document the expected behavior of contributors and how we deal with cases where individuals fail to meet the expectation.","s":"Contributing","u":"/docs/releases/Release2","h":"#contributing","p":1426},{"i":1460,"t":"(Release Date: 2023-09-20)","s":"Release Notes for SCS Release 5","u":"/docs/releases/Release5","h":"","p":1459},{"i":1462,"t":"Just as our previous release, Release 5 has been developed alongside a set of associated outcomes. These outcomes are comprised of: SCS is standardized SCS is understandable SCS is transparent SCS is continuously built and tested SCS is opinionated SCS enables","s":"Scope","u":"/docs/releases/Release5","h":"#scope","p":1459},{"i":1465,"t":"The IaaS reference implementation is based on OSISM 6.0.0. OpenStack 2023.1 (Antelope) Default Ceph version is now Ceph Quincy. OVN and OVS have been updated to their latest versions (OVN: 23.06.1, OVS: 3.2.0). IPv6 east-west and north-south support is present and documented upstream. Cloud-in-a-Box now comes with Swift enabled as well as the option for secondary NIC for external connectivity.","s":"IaaS","u":"/docs/releases/Release5","h":"#iaas","p":1459},{"i":1467,"t":"The Kubernetes Cluster Management solution is available as version 6.0.0 Kubernetes v1.24 .. 1.27 are officially supported. v1.28 also works (technical preview until officially supported by capo) as do older versions (with downgrading nginx-ingress), matching OCCM and CSI versions. Cluster-API (capi) v1.5.1, Cluster-API provider for Openstack (capo) v0.7.3 The node images now use Ubuntu 22.04, the management host can use Ubuntu 22.04 or Debian 12. Cilium v1.14.1, default now, though Calico (3.26.x) is still supported. Cilium also brings the upcoming gateway API (opt-in) as technical preview. The Harbor container registry can now be rolled out with each cluster. The clusters can use a registry as cache to upstream dockerhub or gcr registries. The cluster management now works also on OpenStack clouds with a custom CA. Storage snapshots are supported now (fix was also backported to maintained branches). Diskless flavors are supported everywhere (cluster-management, health-monitor). etcd defragmentation and backup. Controls for pod and service IP ranges.","s":"Container Management","u":"/docs/releases/Release5","h":"#container-management","p":1459},{"i":1469,"t":"The old scripts that are used to create, change and delete Kubernetes clusters with Cluster API will be replaced by a proper Operator in the next release. A description can be found at the cluster-stacks and cluster-stack-operator repositories. The technical preview can be tried with the cluster-stacks-demo. This solution will fit more nicely into the CNCF landscape and also allow for easier support of IaaS solutions that do not comply to our SCS IaaS standards.","s":"Preview: Cluster-Stacks","u":"/docs/releases/Release5","h":"#preview-cluster-stacks","p":1459},{"i":1471,"t":"A number of improvements when using identity federation via OIDC has been added, including addressing openstack CLI usage with PKCE Device Authz Grant, logout, and the usage of a proxy realm in keycloak. Improvements have been contributed to upstream keystone. With the openstack-resource-manager a new day 2 operations tool has been added. Furthermore an osism role for tuned to optimize system profiles is now present. The openstack-flavor-manager is now able to create all standard, mandatory SCS flavors for you. Scaphandre Prometheus Exporter has been added to export power consumption metrics more easily. To optimize system profiles an osism role for tuned is now present. Full support for air-gapped installation and operation of environments. A migration script and guide for moving from R4 to R5 clusters is available. Metering has been improved and a reference billing API implementation is available as technical preview.","s":"Operations and IAM related","u":"/docs/releases/Release5","h":"#operations-and-iam-related","p":1459},{"i":1473,"t":"Documentation on testbed and Cloud-in-a-Box have been reworked. Reflecting CiaB's usage as edge cloud appliance, it now receives more automated testing.","s":"SCS Developer focused improvements (Cloud-in-a-Box, testbed and k8s cluster management)","u":"/docs/releases/Release5","h":"#scs-developer-focused-improvements-cloud-in-a-box-testbed-and-k8s-cluster-management","p":1459},{"i":1475,"t":"zuul.scs.community now complements OSISM's existing zuul infrastructure and is used also by the container layer to execute the CNCF e2e tests. registry.scs.community has been migrated to a new IaaS location (documented in a blog article) and is kept up-to-date now.","s":"Project Infrastructure","u":"/docs/releases/Release5","h":"#project-infrastructure","p":1459},{"i":1477,"t":"For the IaaS reference implementation, please refer to the OSISM 6.0.0 Upgrade Notes.","s":"Upgrade/Migration notes","u":"/docs/releases/Release5","h":"#upgrademigration-notes","p":1459},{"i":1479,"t":"Please check the removals for OSISM in the upstream removal notices. The services minio.services.osism.tech and harbor.services.osism.tech are deprecated and will be turned of on October 20th, 2023.","s":"Removals","u":"/docs/releases/Release5","h":"#removals","p":1459},{"i":1482,"t":"For these please also refer to the upstream deprecation notices. It is again noted that the old scripts of the form osism- will be removed in the future. A note has been added to the scripts showing this when they are executed. The following services are deprecated and will be removed with R6 (OSISM 6.1.0): Patchman Adminer Patchman Client Virtualbmc Bird","s":"Deprecations via OSISM","u":"/docs/releases/Release5","h":"#deprecations-via-osism","p":1459},{"i":1484,"t":"Throughout the Release 5 development cycle, the SCS project issued two security advisories for upstream components: In April 2023 an advisory in Open vSwitch (OvS) (CVE-2023-1668 was issued. Our advisory. In May 2023 an advisory affecting the OpenStack component Cinder (CVE-2023-2088) was issued. Our advisory.","s":"Security Fixes","u":"/docs/releases/Release5","h":"#security-fixes","p":1459},{"i":1486,"t":"Numerous minor issue have been resolved. The most important steps on the IaaS side probably being the move to ceph Quincy to avoid running out of upstream support. On the container side, the fix of storage snapshots is probably most significant. For details, we again refer to the OSISM and k8s-cluster-api-provider release notes.","s":"Resolved Issues","u":"/docs/releases/Release5","h":"#resolved-issues","p":1459},{"i":1488,"t":"A new certification set is expected in December. It will ensure we run all automated tests also for all new standards, such as v3 flavor naming, and the (previously included) v1 standard flavors -- which includes the new SSD flavors, the v1 entropy standard. We have also split image naming and standard image recommendations into v1 standards images. Requirements for k8s version recency, default storage class as well as requirements to the container registry have been captured. The IAM area has seen ADRs on the chosen architecture. The (design) decisions on the metering work as well as on the status page project have also been captured. The standards and the standards compliance of our operators' clouds can be seen in the standards section of our doc pages while the raw content is developed and discussed in the respective github standards repository. The SCS reference implementation follows all approved SCS standards.","s":"Standards Conformance","u":"/docs/releases/Release5","h":"#standards-conformance","p":1459},{"i":1490,"t":"Relevant repositories have been tagged with v6.0.0 tag. For some repositories maintained/v6.x and maintained/v6.0.x branches have been created.","s":"Release Tagging","u":"/docs/releases/Release5","h":"#release-tagging","p":1459},{"i":1492,"t":"Nothing that we are aware of at this point.","s":"List of known issues & restrictions in R5","u":"/docs/releases/Release5","h":"#list-of-known-issues--restrictions-in-r5","p":1459},{"i":1494,"t":"We appreciate contribution to strategy and implementation, please join our community -- or just leave input on the github issues and PRs. Have a look at our How to contribute page.","s":"Contributing","u":"/docs/releases/Release5","h":"#contributing","p":1459},{"i":1496,"t":"Our wonderful community of integrators, operators, contractors and volunteers made R5 possible. The project management team is employed by the OSB Alliance and we as well as the contractors are paid thanks to funding from the German Ministry for economic affairs and climate action. We build on top of a lot of existing open source code from the CNCF, the OIF and various others and we try to contribute back as much as we can.","s":"Thanks","u":"/docs/releases/Release5","h":"#thanks","p":1459},{"i":1498,"t":"This document is work in progress for the upcoming Release X. Release 4 will be released in . This note will be removed, once Release X is released and these notes are valid.","s":"Release Notes for SCS Release X","u":"/docs/releases/ReleaseX","h":"","p":1497},{"i":1513,"t":"We appreciate contribution to strategy and implementation, please join our community -- or just leave input on the github issues and PRs. Have a look at our How to contribute page.","s":"Contributing","u":"/docs/releases/ReleaseX","h":"#contributing","p":1497},{"i":1516,"t":"The Sovereign Cloud Stack (SCS) is a community-driven project that curates a set of standards—including both existing standards, such as the OpenInfra interoperability guides or the CNCF Kubernetes conformance, and newly created ones—to enable and ensure compatibility, openness, and sovereignty of cloud services across a wide range of providers, particularly small and medium businesses. In addition, SCS provides a certification framework that enables these providers to verify and advertise their compliance with these standards. This framework consists of six kinds of certificates of varying scope, where each scope corresponds to a subset of the set of standards mentioned above. Learn more about these scopes as well as the currently certified clouds under Certification. More details on individual standards can be found under Standards.","s":"Introduction","u":"/standards/","h":"","p":1515},{"i":1518,"t":"TODO","s":"Standards","u":"/docs/standards/","h":"","p":1517},{"i":1520,"t":"This is a list of clouds that we test on a nightly basis against our scs-compatible certification level. Name Description Operator IaaS Compliance Check HealthMon gx-scs Dev environment provided for SCS & GAIA-X context plusserver GmbH HM pluscloud open - prod1 Public cloud for customers plusserver GmbH HM pluscloud open - prod2 Public cloud for customers plusserver GmbH HM Wavestack Public cloud for customers noris network AG/Wavecon GmbH HM REGIO.cloud Public cloud for customers OSISM GmbH Dashboard","s":"Certified Clouds","u":"/standards/certification/certified-clouds","h":"","p":1519},{"i":1522,"t":"Standards are organized as certification levels according to SCS-0003-v1. We currently maintain one certification level scs-compatible that is described here: Tests/scs-compatible.yaml. More certification levels will follow as the project progresses.","s":"SCS standards overview","u":"/standards/certification/certified-clouds","h":"#scs-standards-overview","p":1519},{"i":1524,"t":"This repository is organized according to SCS-0002-v1.","s":"Repo Structure","u":"/standards/certification/certified-clouds","h":"#repo-structure","p":1519},{"i":1526,"t":"Decision Records, see Standards/scs-0001-v1-sovereign-cloud-standards.md","s":"Decisions","u":"/standards/certification/certified-clouds","h":"#decisions","p":1519},{"i":1528,"t":"Old Design-Docs folder with existing Architectural Decision Records (ADRs). This directory is currently in the process of being consolidated and cleaned up. See cleanup step-1 and open questions.","s":"Drafts","u":"/standards/certification/certified-clouds","h":"#drafts","p":1519},{"i":1530,"t":"Official SCS standards, see Standards/scs-0001-v1-sovereign-cloud-standards.md).","s":"Standards","u":"/standards/certification/certified-clouds","h":"#standards","p":1519},{"i":1532,"t":"Testsuite and tools for SCS standards, see Tests/README.md.","s":"Tests","u":"/standards/certification/certified-clouds","h":"#tests","p":1519},{"i":1535,"t":"SCS provides a certification framework consisting of six different kinds of certificates of varying scope. These scopes can be sorted into two dimensions: certification level, of which there are three: SCS-compatible SCS-open SCS-sovereign cloud layer, of which there are two: infastructure as a service (IaaS) Kubernetes as a service (KaaS) So, for instance, a certificate can have the scope SCS-compatible IaaS or SCS-sovereign KaaS. Each scope corresponds to a set of standards. As these standards progress, so do the scopes, and we keep track of this by versioning. Each version undergoes a lifecycle of Draft, Stable, and Deprecated, and we aim to keep at most one version stable at the same time, with the exception of a transition period of 4 to 6 weeks.","s":"Scopes and versions","u":"/standards/certification/overview","h":"#scopes-and-versions","p":1533},{"i":1537,"t":"In order for a cloud service offering to obtain a certificate, it has to conform to all standards of the respective scope, which will be tested at regular intervals, and the results of these tests will be made available publicly. For more details on how to become certified, please consult the corresponding document.","s":"Becoming certified","u":"/standards/certification/overview","h":"#becoming-certified","p":1533},{"i":1539,"t":"This is a list of clouds that we test on a nightly basis against the certificate scope SCS-compatible IaaS. Name Description Operator IaaS Compliance Check HealthMon gx-scs Dev environment provided for SCS & GAIA-X context plusserver GmbH HM pluscloud open - prod1 Public cloud for customers plusserver GmbH HM pluscloud open - prod2 Public cloud for customers plusserver GmbH HM Wavestack Public cloud for customers noris network AG/Wavecon GmbH HM REGIO.cloud Public cloud for customers OSISM GmbH Dashboard","s":"Compliant cloud environments","u":"/standards/certification/overview","h":"#compliant-cloud-environments","p":1533},{"i":1541,"t":"(optional) Download the compliance check tool and run it on your environment in order to check that all standards for the certification scope are met. Contact the SCS project team and request to officially certified. Prepare yourself to give the SCS project team user access to your cloud environment The SCS project team will run regular tests (the same as the compliance check tool), in order to check whether all standards compiled in the certification scope are met. If so, then your environment is listed in the \"certified clouds\" section on this site. The above workflow applies at the moment to the certification scope SCS-compatible on IaaS. For more complex standards to be met, which may not be automatically and remotely tested. For cloud environments, which do not provide public access for various reasons, but do want to accomplish a certification an individual process will provided accordingly.","s":"How to get certified","u":"/standards/certification/get-certified","h":"","p":1540},{"i":1543,"t":"The SCS Certification scopes are discriminated in two dimensions. The first is the technology layer, which is either IaaS (infrastructure) or KaaS (Kubernetes). The second dimension is the level, which refer to the level of sovereignty, which is achieved by the certificate. There are three different levels: SCS compatible SCS open SCS sovereign Consequently, an SCS user can achieve certificates in six different scopes. Hence, an SCS certification scope examines all standards required to achieve a certain level for a certain layer, e.g. the \"SCS-compatible\" level for the IaaS-layer. Like software states, certification scopes are versioned. To achieve the certificate for a scope all standards, which are part of the current version of this scope must be met. A certification scope version has an expiry date after which the next version of this scope becomes valid. An SCS user must fulfil the standards in the actual certification scope version to stay certified. There is a transition period between two versions, in which both versions are valid as shown in the diagram below. It also shows that each scope has its own versioning cycle independent from all other scopes.","s":"Scopes and Versions","u":"/standards/certification/subjects-versions","h":"","p":1542},{"i":1545,"t":"This track encompasses the foundational standards that guide the overall structure, documentation, and general topics related to the Sovereign Cloud Stack. It serves as the core framework, ensuring consistency, clarity, and comprehensibility across all aspects of the cloud stack, fostering an environment where information is easily accessible and understood. Standard Most Recent Version State Description stabilized SCS-001 v1 🟢 Stable Sovereign Cloud Standards 2022-11-28 SCS-002 v2 🟢 Stable Standards, Docs and Organisation 2023-03-08 SCS-003 v1 🟠 Draft Sovereign Cloud Standards YAML -","s":"Global Standards","u":"/standards/global/","h":"","p":1544},{"i":1547,"t":"SCS-0001 outlines the structure, requirements, and lifecycle of standards, procedural documents, and decision records within the Sovereign Cloud Stack (SCS) community, ensuring clarity, organization, and governance in the development and maintenance of interoperable and transparent cloud infrastructure standards. Version Type State stabilized obsoleted SCS-0001-v1 Procedural 🟢 Stable 2022-11-28 -","s":"SCS-0001: SCS Standards","u":"/standards/global/scs-0001","h":"","p":1546},{"i":1549,"t":"SCS-0002 standard outlines the standardized structure and maintenance processes for easily accessible and comprehensible content of the SCS project. Version Type State stabilized obsoleted SCS-0002-v1 Procedural 🟢 Stable 2023-02-06 - SCS-0002-v2 Procedural 🟢 Stable 2023-08-03 -","s":"SCS-0002: Org & Docs Standards","u":"/standards/global/scs-0002","h":"","p":1548},{"i":1551,"t":"SCS-0003 outlines the standards and certification processes for interoperable and sovereign cloud offerings, categorizing certifications into levels and layers, and detailing their progression, prerequisites, and versioning in a machine-readable YAML format for clarity, traceability, and tool integration. Version Type State stabilized obsoleted SCS-0003-v1 Procedural 🟠 Draft - -","s":"SCS-0003: YAML Standards","u":"/standards/global/scs-0003","h":"","p":1550},{"i":1553,"t":"The IaaS Layer Standards track focuses on the protocols, guidelines, and specifications that govern the infrastructure as a service layer. This encompasses standards for virtual machines, storage, networking, and other foundational resources, ensuring seamless, efficient, and secure operation, interoperability, and management of the underlying cloud infrastructure. Standard Most Recent Version State Description stabilized SCS-0100 v3 🟢 Stable Flavor Naming 2023-06-14 SCS-0101 v1 🟠 Draft Entropy 2023-03-08 SCS-0102 v1 🟢 Stable Image Meta Data 2022-10-31 SCS-0103 v1 🟠 Draft Sovereign Cloud Standards YAML - SCS-0104 v1 🟠 Draft Sovereign Cloud Standards YAML -","s":"IaaS Standards","u":"/standards/iaas/","h":"","p":1552},{"i":1555,"t":"The SCS-0101 Entropy Standard ensures adequate entropy is available in virtual instances, crucial for operations like secure key creation in cryptography. The standard recommends using kernel version 5.18 or higher and activating the hw_rng_model: virtio attribute for images, while compute nodes should employ CPUs with entropy accessing instructions unfiltered by the hypervisor. It allows the infusion of the hosts entropy sources into virtual instances and ensures the availability and quality of entropy in virtual environments, promoting system security and efficiency. Version Type State stabilized obsoleted SCS-0101-v1 Standard 🟠 Draft - -","s":"SCS-0101: Entropy","u":"/standards/iaas/scs-0101","h":"","p":1554},{"i":1557,"t":"The SCS-0102 Image Metadata Standard outlines how to categorize and manage metadata for cloud-based operating system images to ensure usability and clarity. The standard encompasses naming conventions, technical requirements, image handling protocols including updating and origin, and licensing/support details. These guidelines ensure that users can understand, access, and utilize OS images effectively, with clear information on features, updates, and licensing provided through well-defined metadata properties. Version Type State stabilized obsoleted SCS-0102-v1 Standard 🟢 Stable 2022-10-31 -","s":"SCS-0102: Image Metadata","u":"/standards/iaas/scs-0102","h":"","p":1556},{"i":1559,"t":"The SCS Flavor Naming Standard provides a systematic approach for naming instance flavors in OpenStack environments, ensuring backward compatibility and clarity on key features like the number of vCPUs, RAM, and Root Disk, as well as extra features like GPU support and CPU generation. The standard aims for usability and portability across all SCS flavors. Version Type State stabilized obsoleted SCS-0100-v1 Standard 🟢 Stable 2022-09-08 2023-10-31 SCS-0100-v2 Standard 🟠 Draft - - SCS-0100-v3 Standard 🟢 Stable 2023-06-14 - Note V2 and V3 are both concurrent stable versions","s":"SCS-0100: Flavor Naming","u":"/standards/iaas/scs-0100","h":"","p":1558},{"i":1561,"t":"The SCS-0103 standard outlines mandatory and recommended specifications for flavors and properties in OpenStack environments to ensure uniformity across SCS clouds. Mandatory and recommended flavors are defined with specific configurations of vCPUs, vCPU types, RAM, and root disk sizes, alongside extra specs like scs:name-vN, scs:cpu-type, and scs:diskN-type to detail the flavor's specifications. This standard facilitates guaranteed availability and consistency of flavors, simplifying the deployment process for DevOps teams. Version Type State stabilized obsoleted SCS-0103-v1 Standard 🟠 Draft - -","s":"SCS-0103: Standard Flavors","u":"/standards/iaas/scs-0103","h":"","p":1560},{"i":1563,"t":"The SCS-0104 standard establishes guidelines for virtual machine images in Sovereign Cloud Stack (SCS) environments, specifying mandatory, recommended, and optional images via a YAML file, ensuring interoperability and streamlined deployments. It mandates that image upload via Glance must be allowed, ensuring flexibility for users. The standard's machine-readable document facilitates automated processing for compliance and integration purposes, promoting consistency and reliability in cloud environments. Version Type State stabilized obsoleted SCS-0104-v1 Standard 🟠 Draft - -","s":"SCS-0104: Standard Images","u":"/standards/iaas/scs-0104","h":"","p":1562},{"i":1565,"t":"This track revolves around Identity and Access Management (IAM) standards, providing guidelines for ensuring secure and efficient user authentication, authorization, and administration. It addresses issues related to user identity, permissions, roles, and policies, aiming to safeguard and streamline access to cloud resources and services. Standard Most Recent Version State Description stabilized SCS-0300 v1 🟢 Stable Requirements for SSO identity federation 2023-06-21","s":"IAM Standards","u":"/standards/iam/","h":"","p":1564},{"i":1567,"t":"The SCS-0300 standard outlines requirements for Single Sign-On (SSO) identity federation within the Sovereign Cloud Stack (SCS). It addresses the need for customers to access SCS services using credentials stored and managed externally, facilitating user onboarding and reducing the need for additional dedicated SCS accounts. The standard focuses on delegating authentication to external identity providers and mapping users to roles within SCS for authorization, while also considering the use of machine identities. Keycloak is the current choice as an Identity Provider (IdP) for its support of OAuth 2.0 grants and its integration with OpenStack and kolla-ansible. Version Type State stabilized obsoleted SCS-0300-v1 Standard 🟢 Stable 2023-06-21 -","s":"SCS-0300: SSO Identity Federation","u":"/standards/iam/scs-0300","h":"","p":1566},{"i":1569,"t":"Standards in this track are concerned with Kubernetes as a Service layer, outlining norms and best practices for deploying, managing, and operating Kubernetes clusters. These standards aim to ensure that the orchestration of containers is streamlined, secure, and compatible across various cloud environments and platforms. Standard Most Recent Version State Description stabilized SCS-0210 v1 🟢 Stable New Version Policy 2023-02-07 SCS-0211 v1 🟢 Stable Default Storage Class 2023-02-13","s":"KaaS Standards","u":"/standards/kaas/","h":"","p":1568},{"i":1571,"t":"The SCS-0210 standard outlines the expected pace at which providers should adopt new Kubernetes versions, aiming for alignment with the rapid development cycle of Kubernetes. Providers must offer the latest minor version within four months of its release and the newest patch version within a week, ensuring users have timely access to security updates, bug fixes, and features. The standard emphasizes the need for expedited updates for critical CVEs and expects providers to thoroughly test new versions before deployment. Version Type State stabilized obsoleted SCS-0210-v1 Standard 🟢 Stable 2023-02-07 -","s":"SCS-0210: k8s New Version Policy","u":"/standards/kaas/scs-0210","h":"","p":1570},{"i":1573,"t":"Operational Tooling Standards cover the protocols and guidelines associated with tools and utilities used for monitoring, management, and maintenance of the cloud environment. This includes standards for status pages, alerts, logs, and other operational tools, aiming to optimize the reliability, performance, and security of cloud services and resources. Standard Most Recent Version State Description stabilized SCS-0412 v1 🟠 Draft Exposition of IaaS metering data as JSON -","s":"Ops Standards","u":"/standards/ops/","h":"","p":1572},{"i":1575,"t":"The SCS-0211 standard outlines the properties required for the default StorageClass in Kubernetes as a Service (KaaS). The standard ensures that the default StorageClass, identified by the \"storageclass.kubernetes.io/is-default-class\" annotation, supports the ReadWriteOnce access mode and protects volume data against loss due to single disk or host hardware failures. Version Type State stabilized obsoleted SCS-0211-v1 Standard 🟢 Stable 2023-02-13 -","s":"SCS-0211: KaaS Default Storage Class","u":"/standards/kaas/scs-0211","h":"","p":1574},{"i":1577,"t":"The SCS-0412 standard addresses the need for a standardized interface to expose IaaS metering data in JSON format within the Sovereign Cloud Stack (SCS). This is to aid cloud operators in integrating SCS IaaS layer data with their existing billing and customer relationship systems. The standard adopts the Ceilometer HTTP hook format provided by the OpenStack Ceilometer project for telemetry and metering, avoiding the need for additional translation layers and implementation components. Version Type State stabilized obsoleted SCS-0412-v1 Standard 🟠 Draft - -","s":"SCS-0412: Metering JSON","u":"/standards/ops/scs-0412","h":"","p":1576},{"i":1580,"t":"The Sovereign Cloud Stack (SCS) provides standards for a range of cloud infrastructure types. It strives for interoperable and sovereign cloud stacks which can be deployed and used by a wide range of organizations and individuals. Wherever feasible, transparency and openness both in respect to the inner workings of the platforms standardised by SCS, as well as the SCS organisation itself are a paradigm we intend to live.","s":"Introduction","u":"/standards/scs-0001-v1-sovereign-cloud-standards","h":"#introduction","p":1578},{"i":1582,"t":"The key words \"MUST\", \"MUST NOT\", \"REQUIRED\", \"SHALL\", \"SHALL NOT\", \"SHOULD\", \"SHOULD NOT\", \"RECOMMENDED\", \"MAY\", and \"OPTIONAL\" in this document are to be interpreted as described in RFC 2119. In addition, \"FORBIDDEN\" is to be interpreted equivalent to \"MUST NOT\".","s":"Requirements","u":"/standards/scs-0001-v1-sovereign-cloud-standards","h":"#requirements","p":1578},{"i":1584,"t":"One of the main products of the SCS organisation are Sovereign Cloud Standard documents.","s":"Sovereign Cloud Standard documents","u":"/standards/scs-0001-v1-sovereign-cloud-standards","h":"#sovereign-cloud-standard-documents","p":1578},{"i":1586,"t":"Procedural​ A procedural SCS document describes a process, a policy or a guideline to which the SCS community adheres. Standard​ A standard SCS document describes a technical standard for SCS compliant clouds. Note that it may not be necessary for all clouds to implement all standards. Decision Record​ Sometimes during the development of the SCS standard, a complex technical decision needs to be taken, which does not directly result in a new standard. The SCS document format formally integrates the documentation of such decisions as documents of type Decision Record.","s":"Types of documents","u":"/standards/scs-0001-v1-sovereign-cloud-standards","h":"#types-of-documents","p":1578},{"i":1588,"t":"The SCS documents are provided in GitHub flavored markdown. Each document is assigned a unique number. To disambiguate with other organisations using similar schemes (such as XEPs, PEPs or IETF RFCs), the numbers are prefixed with SCS-. To allow a concept to evolve while allowing breaking changes, each SCS document is associated with a major version number. This major version number is a positive number and the numbering starts at one for each document. In order to make organisation of the SCS documents easier, each document also has a slugified title. The slugified title MUST NOT be changed after the acceptance of the document into the repository, as it is part of its canonical URL. It MUST consist only of lower-case ASCII letters, numbers and hyphens. It MUST NOT start with a hyphen and SHOULD start with a lower-case letter. It SHOULD NOT contain more than one subsequent hyphen. The file name of an SCS document is formed using the following pattern: scs-XXXX-vN-T.md, where XXXX is replaced with the zero-padded document number, N is replaced with the major version of the document, and T is replaced with the slugified title. For a document with the number 190, with a major version number 2 and a slugified title flavor-naming, the resulting file name would be scs-0190-v2-flavor-naming.md. The second digit in XXXX describes the track where the document belongs: Track Number Global 0 IaaS 1 KaaS 2 IAM 3 Ops 4 In addition to the number, each document has the following metadata, embedded in the markdown header. Field name Requirement Description type REQUIRED one of Procedural, Standard, or Decision Record status REQUIRED one of Proposal, Draft, Stable, Deprecated, or Rejected track REQUIRED one of Global, IaaS, KaaS, IAM, Ops obsoleted_at REQUIRED if status is Deprecated ISO formatted date indicating the date after which the deprecation is in effect stabilized_at REQUIRED if status was ever Stable ISO formatted date indicating the date after which the document was considered stable rejected_at REQUIRED if status is Rejected ISO formatted date indicating the date on which the document was rejected replaced_by RECOMMENDED if status is Deprecated or Rejected, FORBIDDEN otherwise List of documents which replace this document. replaces OPTIONAL List of documents which this document replaces.","s":"Document format","u":"/standards/scs-0001-v1-sovereign-cloud-standards","h":"#document-format","p":1578},{"i":1590,"t":"Each document SHOULD have the following sections: An Introduction providing context on the document and linking to other relevant materials. A Motivation section which details why this document or the thing it describes is necessary. In addition, the following OPTIONAL sections should be considered: A Design Considerations section for Standard type documents, which details other choices which have been considered for the specific feature but were ultimately rejected. An Open Questions section which links to issues detailing any open discussion points with respect to a document. This section is RECOMMENDED during the discussion phase (pre 1.0.0) as a \"table of contents\" of things to work on in that context. A Related Documents section which references related Standards or Decisions, both upstream and/or other SCS documents. A Conformance Tests section that contains hints on how to validate conformance with this spec, ideally links to conformance test cases.","s":"Sections","u":"/standards/scs-0001-v1-sovereign-cloud-standards","h":"#sections","p":1578},{"i":1592,"t":"The lifecycle of an SCS document goes through the following phases: Proposal, Draft, Stable, Deprecated, and Rejected. All decisions for phase transitions follow loose consensus, where the group which has to form the consensus depends on the track of the document: IaaS: The team working on infrastructure-as-a-service topics KaaS: The team working on Kubernetes-as-a-service topics Ops: The team working on operations topics IAM: The team working on identity and access management topics Global: The entire SCS community","s":"Process","u":"/standards/scs-0001-v1-sovereign-cloud-standards","h":"#process","p":1578},{"i":1594,"t":"Proposal of a new document​ To propose a new SCS document, a community participant creates a pull request on GitHub against the standards repository in the SovereignCloudStack organisation. The pull request MUST add exactly one SCS document, in the Standards folder. In the proposal phase, the document number MUST be replaced with xxxx in the file name. The major version MUST be 1. For a document with a slugified title flavor-naming, the file name would for instance be scs-xxxx-v1-flavor-naming.md. The metadata MUST indicate the intended track and type of the document, and the status MUST be set to Proposal. Upon acceptance by the group of people identified by the track, a number is assigned (the next unused number) and the proposer is asked to rename the file to replace the xxxx with that number. Note: Documents on the Design Record track MAY be proposed or accepted directly into Stable state, if no further discussion is required. Hereafter, the pull request can be merged and henceforth the document is an official SCS document in Draft state. Proposal of a major update to a stable document​ To propose major update to a Stable SCS document, a community participant creates a pull request on GitHub against the standards repository in the SovereignCloudStack organisation. The pull request MUST add exactly one SCS document, in the Standards folder. The document number MUST be the same as the document it is updating, and the major version number MUST be incremented by 1. The slugified title MAY be changed. It MUST refer to the old document in its replaces metadata. The pull request SHOULD NOT modify the previous document; deprecation of the previous document as well as adding the replaced_by metadata is a separate step, and can only be executed once the new document is Stable. For a document updating a hypothetical SCS-0390-v3 document, the file name may be scs-0390-v4-flavor-naming-this-time-its-serious.md. Other than the file naming difference, the proposal process is the same as for new documents. In particular, the new document starts out in Draft state and does not automatically become part of the normative corpus of an SCS release.","s":"Proposal phase","u":"/standards/scs-0001-v1-sovereign-cloud-standards","h":"#proposal-phase","p":1578},{"i":1596,"t":"In this phase, the document is developed inside the SCS community. It should not be considered to be normative for any SCS release, even if an SCS release happens after the acceptance of the document. Experimental and exploratory implementations are encouraged, however, implementors must be prepared for breaking changes. Changes to the documents are gated through pull requests.","s":"Development phase (Draft)","u":"/standards/scs-0001-v1-sovereign-cloud-standards","h":"#development-phase-draft","p":1578},{"i":1598,"t":"Once the document is deemed ready for production use, its status is changed to Stable. After stabilization, changes to the document which may render existing implementations non-conformant MUST NOT be made. If a breaking change to an existing SCS document is deemed necessary, a new document with a new number shall be created and the old document SHOULD be deprecated.","s":"Stabilized phase (Stable)","u":"/standards/scs-0001-v1-sovereign-cloud-standards","h":"#stabilized-phase-stable","p":1578},{"i":1600,"t":"Should a document become obsolete, it can be deprecated. Obsoletions SHOULD be announced ahead of their execution by setting the deprecated_at field to a future date and moving the status to Deprecated. This signals current and future implementors that the subject matter of the document is not considered necessary or state of the art anymore. If one or more replacement documents for the document exists, it MUST be listed in the replaced_by metadata field.","s":"Deprecation phase (Deprecated)","u":"/standards/scs-0001-v1-sovereign-cloud-standards","h":"#deprecation-phase-deprecated","p":1578},{"i":1602,"t":"If a document is removed from the normative corpus of SCS standards, its status is changed to Rejected. If one or more replacement documents for the document exists, it MUST be listed in the replaced_by metadata field.","s":"Rejection","u":"/standards/scs-0001-v1-sovereign-cloud-standards","h":"#rejection","p":1578},{"i":1605,"t":"When should a document be stabilized? Should we require at least one public implementation? Should we require a minimum experimental time? What about non-Standard track documents?","s":"Stabilization criteria","u":"/standards/scs-0001-v1-sovereign-cloud-standards","h":"#stabilization-criteria","p":1578},{"i":1607,"t":"When is a change breaking and cannot be applied to a Stable document? What about previously undefined behaviour (uncovered edge case)? What about ambiguous wording? Do we need a separate \"Errata\" section?","s":"Breaking change criteria","u":"/standards/scs-0001-v1-sovereign-cloud-standards","h":"#breaking-change-criteria","p":1578},{"i":1610,"t":"An alternative to the proposed scheme for stabilization is the use of SemVer-like versioning. In that case, one would have an individual version number with each document, where a major version greater than zero indicates a stable document. The Stable state would be merged with Draft state into an Active state and shared between the stabilized and the development phase. The advantages of such an approach are: It is easy to recognize whether an SCS document has changed between two SCS releases, just by looking at the released version number. It is possible to make breaking changes after stabilization by increasing the major version number. The disadvantages of that approach are: It is possible to make breaking changes after stabilization. Potentially, an hypothetical SCS-1234 document might refer to something completely different in a hypothetical R15 release than what it meant in R5, if there have been sufficient, gradual breaking changes to the document. That means that for proper linking, it would be required to always include the major version number when referring to an SCS document. This implies having to keep all former versions around in a canonical, linkable form. This induces non-trivial organizational and editorial overhead and raises questions around which changes are acceptable to \"archived\" versions, if any. It would require a clone of the SemVer spec, as that spec is highly specific toward software and does not fully (at least not in the standard-as-written) cover specifics of a standards organisation's use-cases.","s":"Versioning","u":"/standards/scs-0001-v1-sovereign-cloud-standards","h":"#versioning","p":1578},{"i":1612,"t":"This document is heavily inspired by XEP-0001, as published by the XMPP Standards Foundation.","s":"Acknowledgements","u":"/standards/scs-0001-v1-sovereign-cloud-standards","h":"#acknowledgements","p":1578},{"i":1615,"t":"The old Docs repository had a subdirectory Design-Docs/ which holds Docs on Design Considerations, older Architecture Decision Records (ADRs) and even Standards. It also has a Design-Docs/tools/ subdirectory with conformance checks and our overall conformance check driver (from PR#182).","s":"Introduction","u":"/standards/scs-0002-v1-standards-docs-org","h":"#introduction","p":1613},{"i":1617,"t":"This directory structure is confusing in a number of ways: The conformance checks are hard to find. The mixture of document types requires searching at two or three places. We want to improve this (while avoiding unnecessary churn).","s":"Motivation","u":"/standards/scs-0002-v1-standards-docs-org","h":"#motivation","p":1613},{"i":1619,"t":"Move Design-Docs/tools/ contents to Tests/ Also create subdirectories then for layers and test, while the overall conformance check tool, certification specs and README remain in Tests/. Rename Design-Docs/ to Drafts/. Use individual PRs to rewrite existing ADRs and Standards there to conform to our standards and move them over to Standards/. Some documents with findings will remain in the Drafts directory. We may want to categorize these and have a folder e.g. for research results.","s":"Suggested cleanup (step 1)","u":"/standards/scs-0002-v1-standards-docs-org","h":"#suggested-cleanup-step-1","p":1613},{"i":1622,"t":"The Sovereign Cloud Stack (SCS) provides standards for a range of cloud infrastructure types. It strives for interoperable and sovereign cloud offerings which can be deployed and used by a wide range of organizations and individuals. SCS plans to offer six kinds of certificates with varying scope. These scopes can be sorted into two dimensions: certification level, of which there are three: SCS-compatible SCS-open SCS-sovereign cloud layer, of which there are two: infastructure as a service (IaaS) Kubernetes as a service (KaaS) So, for instance, a certificate can have the scope SCS-compatible IaaS or SCS-sovereign KaaS. Note that we don't currently have separate certification layers for Operations and IAM. We expect that tests for these aspects will exist, but be incorporated into the IaaS and KaaS layers. Each certificate scope amounts to a set of standards that have to be fulfilled by the cloud service in question in order for a certificate to be issued. In addition, a certificate with a certain scope may only be issued if some other certificate is already held. Case in point: the certification levels are meant to be seen as a progression, where the upper levels build on the lower ones, and the certificate for \"SCS-open IaaS\" will only be issued if a certificate for \"SCS-compatible IaaS\" is already held. We say that the latter certificate is a prerequisite of the former. Naturally, as the state of the art progresses, so do our certificates. We keep track of the changes by means of versioning. That is to say that each certificate scope can come in several versions, each one of them having its distinct timespan when it is in effect. For instance, we might have SCS-compatible IaaS v1, effective 2021-01-01 through 2023-10-31 SCS-compatible IaaS v2, effective 2023-03-23 through 2023-11-30 and so on (but usually, we aim to keep at most two versions in effect, with an overlap of 4 to 6 weeks). This decision record describes two main points: How we denote our certificate scopes by means of a YAML file. Our process for constructing and progressing the certificate scopes.","s":"Introduction","u":"/standards/scs-0003-v1-sovereign-cloud-standards-yaml","h":"#introduction","p":1620},{"i":1624,"t":"This decision record establishes a mechanism (by means of the YAML file) with the following three main objectives: to provide an overview of the mandatory standards for the different SCS certificate scopes to make the lifecycle of certificate scopes traceable to provide a machine-readable document for further processing (e.g. for a compliance tool suite or continuous integration).","s":"Motivation","u":"/standards/scs-0003-v1-sovereign-cloud-standards-yaml","h":"#motivation","p":1620},{"i":1626,"t":"Digging through a repository of draft, stable, replaced and rejected standards becomes increasingly challenging with a growing number documents and decision records. A central document that lists all mandatory standards to acquire a certificate with a certain scope can resolve this issue. It provides clarity for providers as well as users and helps to understand the value proposition of SCS.","s":"Overview of mandatory SCS standards","u":"/standards/scs-0003-v1-sovereign-cloud-standards-yaml","h":"#overview-of-mandatory-scs-standards","p":1620},{"i":1628,"t":"Standards and therefore certifications will evolve over time. To provide transparency and traceability for the lifecycle of SCS certificate scopes, the whole history of our certifications should be recorded. Pre-notification of changes to our certificate scopes allows users to adapt their environments or deployment automation to the new standards in advance.","s":"Lifecycle of certificate scopes","u":"/standards/scs-0003-v1-sovereign-cloud-standards-yaml","h":"#lifecycle-of-certificate-scopes","p":1620},{"i":1630,"t":"By providing a machine-readable document, we can generate web-friendly overviews of our certificate scopes as well as create a tool suite that checks environments against all described standards.","s":"Machine-readability for further processing","u":"/standards/scs-0003-v1-sovereign-cloud-standards-yaml","h":"#machine-readability-for-further-processing","p":1620},{"i":1632,"t":"Each certificate scope is recorded in a dedicated YAML file, e.g. scs-open-kaas.yaml. The certification YAML MUST contain the following keys: Key Type Description Example name String Full name of this certificate scope SCS Open KaaS url String Valid URL to the latest raw version of this document https://raw.githubusercontent.com/SovereignCloudStack/standards/main/Tests/scs-open-kaas.yaml versions Array of maps List of version descriptors (described below) (see below) The certification YAML MAY contain the following keys:","s":"SCS Certification YAML","u":"/standards/scs-0003-v1-sovereign-cloud-standards-yaml","h":"#scs-certification-yaml","p":1620},{"i":1634,"t":"A certificate within a certain level (above SCS-compatible) can only be granted if a valid corresponding certificate of the level below is presented, where corresponding means: of the same layer. The latter certificate is said to be a prerequisite for the former. We implement this logic by allowing for the designation of a certificate scope as a prerequisite; then a certificate of that prerequisite scope has to be presented before the certificate of the scope in question can be granted. Key Type Description Example prerequisite Map Descriptor for the prerequisite certificate scope, if any prerequisite.name String Full name of the certificate scope SCS Compatible IaaS prerequisite.url String Valid URL to the latest raw version of the certificate scope scs-compatible-iaas.yaml","s":"Prerequisite","u":"/standards/scs-0003-v1-sovereign-cloud-standards-yaml","h":"#prerequisite","p":1620},{"i":1636,"t":"Key Type Description Example version String Mandatory: Version of the particular list of standards v3 standards Array of maps Mandatory: List of standard descriptors for this particular layer stabilized_at Date ISO formatted date indicating the date after this version is considered stable. 2022-11-09 obsoleted_at Date ISO formatted date indicating the date on which this version is expired. 2023-04-09 Once a version has a stabilized_at field, this field may not be changed. The same holds true for the obsoleted_at field. Note that at any point in time, all versions that are older (stabilized_at is at or before this point) can be certified against, unless the version is already obsoleted (the point is after obsoleted_at). This means that more than one version may be allowable at a certain point in time. Tooling should default to use the newest allowable version (the one with the most recent stabilized_at date) then. Note: We intend to keep only one version in effect, except for a grace period of 4 to 6 weeks, when two versions are effective at the same time.","s":"Version descriptor","u":"/standards/scs-0003-v1-sovereign-cloud-standards-yaml","h":"#version-descriptor","p":1620},{"i":1638,"t":"Every list of standards consists of several standards that – altogether – define the particular layer standard in the given version. Key Type Description Example name String Full name of the particular standard Flavor naming url String Valid URL to the latest raw version of the particular standard Flavor naming condition String State of the particular standard, currently either mandatory or optional, default is mandatory mandatory check_tools Array List of check tool descriptors: listing all tools that must pass","s":"Standard descriptor","u":"/standards/scs-0003-v1-sovereign-cloud-standards-yaml","h":"#standard-descriptor","p":1620},{"i":1640,"t":"Key Type Description Example executable String Valid local filename (relative to the path of scs-compliance-check.py) of a script that verifies compliance with the particular standard image-md-check.py args String Optional list of arguments to be passed to the check_tool. Preferably none needed. -v condition String Optionally overrides the per-standard condition (mandatory or optional) optional classification String One of: light (default), medium, heavy; describes the resource usage of the script; used to select an appropiate test interval heavy Note: the executable could in principle also be given via a URL; however, this is not yet supported due to security considerations.","s":"Check tool descriptor","u":"/standards/scs-0003-v1-sovereign-cloud-standards-yaml","h":"#check-tool-descriptor","p":1620},{"i":1642,"t":"name: SCS Open IaaS url: https://raw.githubusercontent.com/SovereignCloudStack/Docs/main/Certification/scs-open-iaas.yaml prerequisite: name: SCS Compatible IaaS url: https://raw.githubusercontent.com/SovereignCloudStack/standards/main/Tests/scs-compatible-iaas.yaml versions: - version: v5 # This version is in a draft state and work in progress # No stabilized_at: date set yet standards: - name: Flavor naming url: https://raw.githubusercontent.com/SovereignCloudStack/standards/main/Standards/scs-0100-v2-flavor-naming.md condition: mandatory # is default and can be left out check_tools: - executable: flavor-name-check.py - name: Image metadata url: https://raw.githubusercontent.com/SovereignCloudStack/Docs/main/Standards/SCS-0004-v1-image-metadata.md condition: mandatory check_tools: - executable: image-md-check.py args: -v - executable: image-md-check2.py condition: optional - version: v4 # This is the upcoming version with a given target date. No further changes should be done to this set of standards stabilized_at: 2022-04-01 standards: - name: .... - version: v3 # This is the stable set of standards that is currently active stabilized_at: 2021-10-01 obsoleted_at: 2022-11-08 standards: - name: .... - version: v2 # This set of standards is obsolete and has been replaced by v3 stabilized_at: 2021-07-01 obsoleted_at: 2021-11-01 standards: - name: .... kaas: - ...","s":"Basic Example","u":"/standards/scs-0003-v1-sovereign-cloud-standards-yaml","h":"#basic-example","p":1620},{"i":1644,"t":"The lifecycle any version of any certificate scope goes through the following phases: Draft, Stable, and Deprecated. Note that one pull request can affect multiple versions, but each pull request has to affect at most one layer. Each pull request is to be voted upon in the corresponding team meeting. The vote has to be on the pull request only, i.e., it may not affect any other pull request or issue, and it must be announced 14 days in advance via the corresponding mailing list.","s":"Process","u":"/standards/scs-0003-v1-sovereign-cloud-standards-yaml","h":"#process","p":1620},{"i":1647,"t":"In order to have a document that can be processed by a wide range of tools, we need to opt for a simple but yet well supported format. YAML offers readability for humans as well as good support by many frameworks. Since YAML is heavily used in the cloud and container domain, the choice is obvious.","s":"File format","u":"/standards/scs-0003-v1-sovereign-cloud-standards-yaml","h":"#file-format","p":1620},{"i":1649,"t":"This standard only allows exactly one depending certification, otherwise we would need to use a list of mappings. Since this is in accordance to the current plan of the SIG Standardization & Certification, we can safely ignore multiple dependency of certification for now.","s":"Dependency graph for certifications","u":"/standards/scs-0003-v1-sovereign-cloud-standards-yaml","h":"#dependency-graph-for-certifications","p":1620},{"i":1651,"t":"The SCS repository Docs has a tool scs-compliance-check.py in the Tests directory which parses the SCS Certification YAML and then runs the tests referenced there, returning the results of the tests.","s":"Tooling","u":"/standards/scs-0003-v1-sovereign-cloud-standards-yaml","h":"#tooling","p":1620},{"i":1654,"t":"This document is heavily inspired by the publiccode.yml standard, as published by the Foundation for Public Code.","s":"Acknowledgements","u":"/standards/scs-0003-v1-sovereign-cloud-standards-yaml","h":"#acknowledgements","p":1620},{"i":1657,"t":"The Sovereign Cloud Stack (SCS) is a complex ecosystem, comprised of numerous Components and packages designed to accommodate a wide array of use cases. Given the unique functionalities of these components, the creation of a unified and comprehensible documentation presents a significant challenge. This procedural standard aims to define the structure and maintenance process for our documentation, thereby offering seamless and efficient access to users.","s":"Introduction","u":"/standards/scs-0002-v2-standards-docs-org","h":"#introduction","p":1655},{"i":1659,"t":"SCS promotes a collaborative environment by actively contributing to upstream projects. The involvement of individuals and companies within our community significantly enhances the SCS Bill of Materials (BOM), further amplifying its complexity. Consequently, our documentation must: Offer an overview and visual representation of the architectural model Foster coherence by maintaining a consistent theme throughout the documentation Facilitate a transparent and inclusive community environment Describe various deployment examples and use cases Reflect the SCS structure in the documentation's navigation","s":"Motivation","u":"/standards/scs-0002-v2-standards-docs-org","h":"#motivation","p":1655},{"i":1661,"t":"In line with the OpenStack documentation approach, most SCS Components and components maintain independent documentation. To keep this documentation up-to-date and eliminate manual duplication, we utilize a custom workflow that synchronizes individual documents during the static documentation page's build process.","s":"Distributed Documentation","u":"/standards/scs-0002-v2-standards-docs-org","h":"#distributed-documentation","p":1655},{"i":1663,"t":"Addressing the complexity of SCS requires an effective documentation structure. Accordingly, we have adopted the Diataxis taxonomy, categorizing the documentation into four distinct sections: Tutorials, Guides, References, and Explanations.","s":"Methodology and Taxonomy","u":"/standards/scs-0002-v2-standards-docs-org","h":"#methodology-and-taxonomy","p":1655},{"i":1665,"t":"The technical documentation and navigation should parallel the logical structure of the SCS Architecture. By doing so, users can better comprehend the information hierarchy and effectively visualize the SCS. The proposed structure is as follows: ├── Introduction ├── Getting Started │ ├── Overview │ ├── Virtualization │ └── Containerization ├── IaaS Layer │ ├── Overview │ │ ├── Architecture │ │ ├── Compute │ │ ├── Storage │ │ ├── Knowledge │ │ └── Network │ ├── Deployment Examples │ │ ├── Example 1 │ │ │ ├── Hardware │ │ │ └── Software │ │ ├── ... │ │ │ ├── Hardware │ │ │ └── Software │ │ └── Example x │ │ ├── Hardware │ │ └── Software │ ├── Guides │ │ ├── Guide 1 │ │ ├ ... │ │ └── Guide x │ └── Components │ ├── Component 1 │ ├ ... │ └── Component x ├── Container Layer │ ├── Overview │ │ ├── Architecture │ │ └── ... │ ├── Prerequisites │ │ ├── Hardware │ │ ├── Software │ │ └── Knowledge │ ├── Guides │ │ ├── Guide 1 │ │ ├── ... │ │ └── Guide x │ └── Components │ ├── k8s-cluster-api-provider │ ├ ... │ └── Component x ├── Operating SCS │ ├── Overview │ ├── Guides │ │ ├── Guide 1 │ │ ├── ... │ │ └── Guide x │ ├── Monitoring │ ├── Incident Management │ ├── Audits │ ├── Lifecycle Management: Patches/Updates & Upgrades │ └── Logging ├── Identity and Access Management (IAM) ├── Releases ├── Standards ├── FAQ └── Glossary","s":"Structure Template","u":"/standards/scs-0002-v2-standards-docs-org","h":"#structure-template","p":1655},{"i":1667,"t":"The technical documentation and navigation should parallel the logical structure of the SCS Architecture. By doing so, users can better comprehend the information hierarchy and effectively visualize the SCS. The proposed structure is as follows: │ ├── Component │ │ ├── overview.md │ │ └── requirements.md │ │ ├── quickstart.md │ │ ├── configuration.md │ │ ├── contribute.md Each document serves a specific purpose: Overview​ This document introduces the Component/component by addressing the basic \"Why,\" \"How,\" and \"What\" questions, and articulating the problems it solves in the broader SCS context answering the following questions: What is it and for what do I need this? What benefits does it have for users? What organization/company does this belong to? (Link to company/organization) Where am I – as module – within the bigger context of SCS? Requirements​ This section enumerates the necessary prerequisites to utilize the component, including software, hardware, and any required technical knowledge. What are the minimal requirements needed for a quickstart? Quickstart​ A concise guide providing users with a quick set up of the component, covering installation instructions, basic configuration, and initial steps. Caution: it is only for testing and not for production. What is the aim of this quickstart guide? Rule: one line per command for easy copy&paste and one line for description where possible Rule: only one working path for installation. Configuration​ This section elaborates on the configurable aspects of the component, such as options, parameters, or settings that users can modify to suit their needs. Contribute​ This document provides instructions on how interested parties can contribute to the component's development. It includes information on issue submission, proposed changes, and participation in discussions.","s":"Single Component/Component","u":"/standards/scs-0002-v2-standards-docs-org","h":"#single-componentcomponent","p":1655},{"i":1669,"t":"SCS employs Docusaurus, a contemporary static website generator, to implement the Docs Standard. Docusaurus serves as an ideal platform for creating, managing, and deploying extensive documentation. Documentation Framework​ Docusaurus' robust toolkit assists in crafting and maintaining quality documentation. It offers comprehensive features such as Markdown support, customizable themes, and versioning, making it an excellent choice for our needs. This platform allows us to create user-friendly and visually engaging documentation. Special Implementation Details​ SCS's unique architecture necessitates a unique approach to documentation. To ensure seamless integration of reference documentation for Components and components developed for SCS, we have created a custom workflow. This workflow automatically syncs upstream repositories, pulling the most recent documentation at regular intervals. We have accomplished this by utilizing a Node.js post-install script found here. This script prompts the system to pull the latest docs every eight hours and build the static page. The workflow's specifications can be viewed here. The SCS documentation is built by the tooling from the docs-page repository, pulling content from docs repository as well as many other components as defined in the docs.package.json here.","s":"Technical Implementation","u":"/standards/scs-0002-v2-standards-docs-org","h":"#technical-implementation","p":1655},{"i":1671,"t":"Formatting and Linting​ All documentation text files must be provided as markdown files with an .md extension. This prerequisite ensures uniformity across our documents, making them more accessible and comprehensible. Diagrams, Charts, and Images​ When necessary, diagrams, charts, and images can be used to simplify complex information. They should be properly captioned and referenced in the text. Linting​ To maintain a clean and consistent content repository, we enforce linting on: All staged files before committing All Pull Requests Pre Commit​ We run markdownlint against staged Git files using the Husky Git hook. This process is facilitated by lint-staged and husky. The markdown files are linted according to the rules specified by markdownlint-cli2 and formatted with prettier. The linting rules are specified in the configuration file .markdownlint-cli2.jsonc. Additionally, markdownlint-rule-search-replace GitHub Workflows​ There are two actions running on every Pull Request on the main branch: link-validator.yml validates every link in the markdown files. pr-markdownlint.yml checks all markdown files according to the rules defined within .markdownlint-cli2.jsonc. The Style Guide can be found here.","s":"Writing Style and Format – Style Guide","u":"/standards/scs-0002-v2-standards-docs-org","h":"#writing-style-and-format--style-guide","p":1655},{"i":1673,"t":"--","s":"Open Questions","u":"/standards/scs-0002-v2-standards-docs-org","h":"#open-questions","p":1655},{"i":1675,"t":"--","s":"Reference","u":"/standards/scs-0002-v2-standards-docs-org","h":"#reference","p":1655},{"i":1678,"t":"This is the standard v1.0 for SCS Release 0. Note that we intend to only extend it (so it's always backwards compatible), but try to avoid changing in incompatible ways.","s":"Introduction","u":"/standards/scs-0100-v1-flavor-naming","h":"#introduction","p":1676},{"i":1680,"t":"In OpenStack environments there is a need to define different flavors for instances. The flavors are pre-defined by the operator, the customer can not change these. OpenStack providers thus typically offer a large selection of flavors. While flavors can be discovered (openstack flavor list), it is helpful for users (DevOps teams), to have A naming scheme that is used across all SCS flavors, so flavor names have the same meaning everywhere. Have a guaranteed set of flavors available on all SCS clouds, so these do not need to be discovered. While not all details will be encoded in the name, the key features should be obvious: Number of vCPUs, RAM, Root Disk. Extra features are important as well: There will be flavors with GPU support, fast disks for databases, memory-heavy applications, and other useful aspects of an instance. It may also be important to make the CPU generation clearly recognisable, as this is always a topic in discussions with customers.","s":"Motivation","u":"/standards/scs-0100-v1-flavor-naming","h":"#motivation","p":1676},{"i":1683,"t":"We believe the following characteristics are important in a flavour description: Type Description Generation CPU Generation Number of CPU Number of vCPUs - suffixed by L,V,T,C (see below) Amount of RAM Amount of memory available for the VM Performance Class Ability to label high-performance CPUs, disks, network CPU Type X86-intel, X86-amd, ARM, RISC-V, Generic \"bms\" Bare Metal System (no virtualization/hypervisor)","s":"Type of information included","u":"/standards/scs-0100-v1-flavor-naming","h":"#type-of-information-included","p":1676},{"i":1685,"t":"Prefix CPU Suffix RAM[GiB] optional: Disk[GB] optional: Disk type optional: extra features SCS- N L/V/T/C[i] :N[u][o] [:[Mx]N] [n/s/l/p] [-hyp][-hwv]-[arch[N][h][-[G/g]X[N][:M[h]]][-ib] (Note that N and M are placeholders for numbers here).","s":"Complete Proposal","u":"/standards/scs-0100-v1-flavor-naming","h":"#complete-proposal","p":1676},{"i":1688,"t":"Suffix Meaning C dedicated Core T dedicated Thread (SMT) V vCPU (oversubscribed) L vCPU (heavily oversubscribed) Baseline​ Note that vCPU oversubscription for a V vCPU should be implemented such, that we can guarantee at least 20% of a core in >99% of the time; this can be achieved by limiting vCPU oversubscription to 5x per core (or 3x per thread when SMT/HT is enabled) or by more advanced workload management logic. Otherwise L (low performance) must be used. The >99% is measured over a month (1% is 7.2h/month). Note that CPUs must use latest microcode to protect against CPU vulnerabilities (Spectre, Meltdown, L1TF, etc.). We expect that microcode gets updated within less than a month of a new release; for CVSS scores above 8, we expect less than a week. The provider must enable at least all mitigations that are enabled by default in the Linux kernel. CPUs that are susceptible to L1TF (intel x86 pre Cascade Lake) must switch off hyperthreading OR (in the future) use core scheduling implementations that are deemed to be secure by the SCS security team, or declare themselves as insecure with the i suffix (see below). Higher oversubscription​ Must be indicated with a L vCPU type (low performance for > 5x/core or > 3x/thread oversubscription and the lack of workload management that would prevent worst case performance <20% in more than 7.2h per month). Insufficient microcode​ Not using these mitigations must be indicated by an additional i suffix for insecure (weak protection against CPU vulns through insufficient microcode, lack of disabled hyperthreading on L1TF susceptible CPUs w/o effective core scheduling or disabled protections on the host/hypervisor). Examples​ SCS-2C:4:10n SCS-2T:4:10n SCS-2V:4:10n SCS-2L:4:10n SCS-2Li:4:10n SCS-2:**4:10n <- CPU suffix missing SCS-2iT:4:10n <- This order is forbidden","s":"[REQUIRED] CPU Suffixes","u":"/standards/scs-0100-v1-flavor-naming","h":"#required-cpu-suffixes","p":1676},{"i":1690,"t":"Baseline​ We expect cloud providers to use ECC memory. Memory oversubscription is not recommended. It is allowed to specify half GiBs (e.g. 3.5), though this is discouraged for larger memory sizes (>= 10GiB). No ECC​ If no ECC is used, the u suffix must indicate this. Enabled Oversubscription​ You have to expose this with the o sufffix. Examples​ SCS-2C:4:10n SCS-2C:3.5:10n SCS-2C:4u:10n SCS-2C:4o:10n SCS-2C:4uo:10n SCS-2C:4ou:10n <- This order is forbidden","s":"[REQUIRED] Memory","u":"/standards/scs-0100-v1-flavor-naming","h":"#required-memory","p":1676},{"i":1692,"t":"Disk type Meaning n Network shared storage (ceph/cinder) h Local disk (HDD: SATA/SAS class) s Local SSD disk p Local high-perf NVMe Baseline​ Note that disk type might be omitted — the user then can not take any assumptions on what storage is provided for the root disk (that the image gets provisioned to). It does make sense for n to be requested explicitly to allow for smooth live migration. h typically provides latency advantages vs n (but not necessarily bandwidth and also is more likely to fail), s and p are for applications that need low latency (high IOPS) and bandwidth disk I/O. n storage is expected to survive single-disk and single-node failure. If the disk size is left out, the cloud is expected to allocate a disk (network or local) that is large enough to fit the root file system (min_disk in image). This automatic allocation is indicated with : without a disk size. If the : is left out completely, the user must create a boot volume manually and tell the instance to boot from it or use the block_device_mapping_v2 mechanism explicitly to create the boot volume from an image. Multi-provisioned Disk​ The disk size can be prefixed with Mx prefix, where M is an integer specifying that the disk is provisioned M times. Examples​ SCS-2C:4:10n SCS-2C:4:10s SCS-2C:4:10s-bms-z3 SCS-2C:4:3x10s <- Cloud creates three 10GB SSDs SCS-2C:4:3x10s-bms-z3 SCS-2C:4:10 <- Cloud decides disk type SCS-2C:4:10-bms-z3 SCS-2C:4:n <- Cloud decides disk size (min_disk from image or larger) SCS-2C:4:n-bms-3 SCS-2C:4: <- Cloud decides disk type and size SCS-2C:4:-bms-z3 SCS-2C:4:-bms-z3h-GNa:64-ib SCS-2C:4:-ib SCS-2C:4 <- You need to specify a boot volume yourself (boot from volume, or use block_device_mapping_v2) SCS-2C:4-bms-z3 SCS-2C:4:3x <- Cloud decides disk type and size and creates three of them (FIXME: Is this useful?) SCS-2C:4:3xs <- Cloud decides size and creates three local SSD volumes (FIXME: useful?) SCS-2C:4:3x10 <- Cloud decides type and creates three 10GB volumes SCS-2C:4:1.5n <- You must not specify disk sizes which are not in full GiBs","s":"[OPTIONAL] Disk sizes and types","u":"/standards/scs-0100-v1-flavor-naming","h":"#optional-disk-sizes-and-types","p":1676},{"i":1694,"t":"The default Hypervisor is assumed to be KVM. Clouds, that offer different hypervisors or Bare Metal Systems should indicate the Hypervisor according to the following table: hyp Meaning kvm KVM xen Xen vmw VMware hyv Hyper-V bms Bare Metal System Examples​ SCS-2C:4:10n SCS-2C:4:10n-bms SCS-2C:4:10n-bms-z3h","s":"[OPTIONAL] Hypervisor","u":"/standards/scs-0100-v1-flavor-naming","h":"#optional-hypervisor","p":1676},{"i":1696,"t":"If the instances that are created with this flavor support hardware-accelerated virtualization, this can be reflected with the -hwv flag (after the optional Hypervisor flag). On x86, this means that in the instance, the CPU flag vmx (intel) or svm (AMD) is available. This will be the case on Bare Metal flavors on almost all non-ancient x86 CPUs or if your virtualization hypervisor is configured to support nested virtualization. Flavors without the -hwv flag may or may not support hardware virtualization (as we recommend enabling nesting, but don't require flavor names to reflect all capabilities. Flavors may overdeliver ...) Examples​ SCS-2C:4:10 <- may or may not support HW virtualization in VMs SCS-2C:4:10-kvm-hwv SCS-2C:4:10-hwv <- not recommended, but allowed SCS-2C:4:10-hwv-xen <- illegal, wrong ordering","s":"[OPTIONAL] Hardware virtualization / Nested virtualization","u":"/standards/scs-0100-v1-flavor-naming","h":"#optional-hardware-virtualization--nested-virtualization","p":1676},{"i":1698,"t":"Arch details provide more details on the specific CPU: Vendor Generation Frequency Generation and Vendor​ The generations are vendor specific and can be left out. Not specifying arch means that we have a generic CPU (x86-64). Generation i (Intel x86-64) z (AMD x86-64) a (AArch64) r (RISC-V) 0 pre Skylake pre Zen pre Cortex A76 TBD 1 Skylake Zen-1 (Naples) A76/NeoN1 class TBD 2 Cascade Lake Zen-2 (Rome) A78/x1/NeoV1 class TBD 3 Ice Lake Zen-3 (Milan) A71x/NeoN2 (ARMv9) TBD 4 Zen-4 (Genoa) TBD It is recommended to leave out the 0 when specifying the old generation; this will help the parser tool, which assumes 0 for an unspecified value and does leave it out when generating the name for comparison. In other words: 0 has a meaning of \"rather old or unspecified\". Frequency Suffixes​ Suffix Meaning h >2.75GHz all-core hh >3.25GHz all-core hhh >3.75GHz all-core Examples​ SCS-2C:4:10n SCS-2C:4:10n-z SCS-2C:4:10n-z3 SCS-2C:4:10n-z3h SCS-2C:4:10n-z3hh SCS-2C:4:10n-bms-z SCS-2C:4:10n-bms-z3 SCS-2C:4:10n-bms-z3 SCS-2C:4:10n-bms-z3h SCS-2C:4:10n-bms-z3hh","s":"[OPTIONAL] CPU Architecture Details","u":"/standards/scs-0100-v1-flavor-naming","h":"#optional-cpu-architecture-details","p":1676},{"i":1700,"t":"Note that these are optional — it is recommended for providers to encode this information into the flavor name, so there is a systematic way of differentiating flavors. Providers could leave it out however, leaving it to extra_specs to make these flavor capabilities discoverable. Nothing prevents providers from registering the same flavor under a secondary (or tertiary) name. -GX[N][:M[h]] indicates a Pass-Through GPU from vendor X of gen N with M compute units / SMs / EUs exposed. -gX[N][:M[h]] indicates a vGPU from vendor X of gen N with M compute units / SMs / EUs assigned. Note that the vendor letter is mandatory, generation and compute units are optional. GPU Vendor N nVidia A AMD I Intel Generations could be nVidia (f=Fermi, k=Kepler, m=Maxwell, p=Pascal, v=Volta, t=turing, a=Ampere, ...), AMD (GCN-x=0.x, RDNA1=1, RDNA2=2), intel (Gen9=0.9, Xe(12.1)=1, ...), ... (Note: This may need further work to properly reflect what's out there.) The optional h suffix to the comput unit count indicates high-performance (e.g. high freq or special high bandwidth gfx memory such as HBM); h can be duplicated for even higher performance. -ib indicates Inifinband networking. More extensions will be forthcoming. Extensions need to be specified in the above mentioned order.","s":"[OPTIONAL] Extra features","u":"/standards/scs-0100-v1-flavor-naming","h":"#optional-extra-features","p":1676},{"i":1702,"t":"Example Decoding SCS-2C:4:10n 2 dedicated cores (x86-64), 4GiB RAM, 10GB network disk SCS-8Ti:32:50p-i1 8 dedicated hyperthreads (insecure), Skylake, 32GiB RAM, 50GB local NVMe SCS-1L:1u:5 1 vCPU (heavily oversubscribed), 1GiB Ram (no ECC), 5GB disk (unspecific) SCS-16T:64:200s-GNa:64-ib 16 dedicated threads, 64GiB RAM, 200GB local SSD, Inifiniband, 64 Passthrough nVidia Ampere SMs SCS-4C:16:2x200p-a1 4 dedicated Arm64 cores (A78 class), 16GiB RAM, 2x200GB local NVMe drives SCS-1V:0.5 1 vCPU, 0.5GiB RAM, no disk (boot from cinder volume)","s":"Proposal Examples","u":"/standards/scs-0100-v1-flavor-naming","h":"#proposal-examples","p":1676},{"i":1704,"t":"These are flavors expected to exist on standard SCS clouds (x86-64). We expect disk sizes to be 5, 10, 20, 50, 100, 200, 500, 1000GB, 2000GB. We expect a typical CPU:Mem[GiB] ratio of 1:4. vCPU:RAM ratio Mandatory Flavors 1:4 SCS-1V:4, SCS-1V:4:10 2:8 SCS-2V:8, SCS-2V:8:20 4:16 SCS-4V:16, SCS-4V:16:50 8:32 SCS-8V:32, SCS-8V:32:100 1:2 SCS-1V:2, SCS-1V:2:5 2:4 SCS-2V:4, SCS-2V:4:10 4:8 SCS-4V:8, SCS-4V:8:20 8:16 SCS-8V:16, SCS-8V:16:50 16:32 SCS-16V:32, SCS-16V:32:100 1:8 SCS-1V:8, SCS-1V:8:20 2:16 SCS-2V:16, SCS-2V:16:50 4:32 SCS-4V:32, SCS-4V:32:100 1:1 SCS-1L:1, SCS-1L:1:5 Note that all vCPUs are oversubscribed — the smallest 1L:1 flavor allows for heavy oversubscription (note the L), and thus can be offered very cheaply — imagine jump hosts ... Disks types are not specified (and expected to be n or h typically). The design allows for small clouds (with CPUs with 16 Threads, 64GiB RAM compute hosts) to offer all flavors. Note: Compared to previous drafts, we have heavily reduced the variations on disk sizes — this reflects that for the standard networked cinder disks, you can pass blockdevice_mapping_v2 on server (VM) creation to allocate a boot disk of any size you desire. We have scaled the few mandatory disk sizes with the amount of RAM. For each flavor there is also one _without a pre-attached disk — these are meant to be used to boot from a volume (either created beforehand or allocated on-the-fly with block_device_mapping_v2, e.g. openstack server create --flavor SCS-1V:2 --block-device-mapping sda=IMGUUID:image:12:true to create a bootable 12G cinder volume from image IMGUUID that gets tied to the VM instance lifecycle.)","s":"Standard SCS flavors","u":"/standards/scs-0100-v1-flavor-naming","h":"#standard-scs-flavors","p":1676},{"i":1706,"t":"To be certified as an SCS compliant x86-64 IaaS platform, you must offer all standard SCS flavors according to the previous section. (We may define a mechanism that allows exceptions to be granted in a way that makes this very transparent and visible to clients.) You are allowed to understate your performance; you may implement a SCS-1Vl:1:5 flavor with a flavor that actually implements SCS-1T:1:5n (i.e. you dedicate a secured hyperthread instead of high oversubscription) or even SCS-1D:1.5:8s (1 dedicated core, 50% more RAM and a 8GiB SSD). We expect all cloud providers to offer the short, less specific flavor names (such as SCS-8V:32:100). Larger providers that offer more details are expected to still also offer the short variants for usability and easier portability, even beyond the mandated flavors. You must be very careful to expose low vCPU guarantees (L instead ov V), insecure hyperthreading/microcode i, non-ECC-RAM u, memory oversubscription o. Note that omitting these qualifiers is overstating your security, reliability or performance properties and may be reason for clients to feel betrayed or claim damages. It might in extreme cases also cause SCS to withdraw certification along with public statements. You may offer additional SCS- flavors, following the naming scheme outlined here. You may offer additional flavors, not following above scheme. You must not offer flavors with the SCS- prefix which do not follow this naming scheme. You must not extend the SCS naming scheme with your own suffices; you are encouraged however to suggest extensions that we can discuss and add to the official scheme. Note that all letters are case-sensitive. In case you wonder: Feature indicators are capitalized, modifiers are lower case. (An exception is the uppercase -G for a passthrough GPU vs. lowercase -g for vGPU.)","s":"Naming policies","u":"/standards/scs-0100-v1-flavor-naming","h":"#naming-policies","p":1676},{"i":1708,"t":"Note that we expect most clouds to prefer short flavor names, not indicating CPU details or hypervisor types. See above list of standard flavors to get a feeling. However, more successful providers will often need to differentiate their offerings in response to customer demand and allow customers to request flavors with specific detailed properties. The goal of this proposal is to avoid providers to invent their own names and then refer customers to extra_specs or worse a non-machine-readable service description to find out the details. So a cloud provider might well evolve from offering SCS-8T:16:50 to offering SCS-8T:16:50n, SCS-8T:16:50n-i2 and SCS-8T:16:50n-a2 to specify that he is using network disks and offer a choice b/w intel Cascade-Lake and AMD Rome. We would expect the cloud provider to still offer the generic flavor SCS-8C:16:50 and allow the scheduler (placement service) to pick both more specific types (or just one if e.g. capacity management considerations suggest so). We would expect providers in such cases to ensure that the price of a requested flavor does not depend on the scheduler decisions. We are looking into the metadefs mechanism and extra_specs to allow customers to ask for specific flavor properties without the need to encode all these flavor details into the flavor name, so the optional pieces may not be needed much. However, there must be a way to request flavor properties without encoding the need into an image — this indirection is considered broken by the SCS team.","s":"Rationale","u":"/standards/scs-0100-v1-flavor-naming","h":"#rationale","p":1676},{"i":1710,"t":"There is a script in flavor_name_check.py which can be used to decode, validate and construct flavor names. This script must stay in sync with the specification text. Ensure you have your OpenStack tooling (python3-openstackclient, OS_CLOUD) setup and call tools/flavor-name-check.py -c $(openstack flavor list -f value -c Name) to get a report on the flavor list compliance of the cloud environment.","s":"Validation","u":"/standards/scs-0100-v1-flavor-naming","h":"#validation","p":1676},{"i":1712,"t":"Some providers might offer VM services (\"IaaS\") without trying to adhere to SCS standards, yet still finding the flavor naming standards useful. The Gaia-X Technical Committee's Provider Working Group (WG) would seem like a logical place for such dicussions then. If so, we could replace the SCS- prefix with a GX- prefix and transfer the naming scheme governance from the SCS project to the Gaia-X Provider WG (where we participate). SCS certification would then reference the Gaia-X flavor naming standard as a requirement.","s":"Beyond SCS: Gaia-X","u":"/standards/scs-0100-v1-flavor-naming","h":"#beyond-scs-gaia-x","p":1676},{"i":1715,"t":"This is the standard v2.1 for SCS Release 4. Note that we intend to only extend it (so it's always backwards compatible), but try to avoid changing in incompatible ways. (See at the end for the v1 to v2 transition where we have not met that goal, but at least managed to have a 1:1 relationship between v1 and v2 names.)","s":"Introduction","u":"/standards/scs-0100-v2-flavor-naming","h":"#introduction","p":1713},{"i":1717,"t":"In OpenStack environments there is a need to define different flavors for instances. The flavors are pre-defined by the operator, the customer can not change these. OpenStack providers thus typically offer a large selection of flavors. While flavors can be discovered (openstack flavor list), it is helpful for users (DevOps teams), to have A naming scheme that is used across all SCS flavors, so flavor names have the same meaning everywhere. Have a guaranteed set of flavors available on all SCS clouds, so these do not need to be discovered. While not all details will be encoded in the name, the key features should be obvious: Number of vCPUs, RAM, Root Disk. Extra features are important as well: There will be flavors with GPU support, fast disks for databases, memory-heavy applications, and other useful aspects of an instance. It may also be important to make the CPU generation clearly recognizable, as this is always a topic in discussions with customers. Note that not all relevant properties of flavors can be discovered; creating a specification to address this is a separate but related effort to the name standardization. Commonly used infrastructure-as-code tools do not provide a way to use discoverability features to express something like \"I want a flavor with 2 vCPUs, 8GiB of RAM, a local 20GB SSD disk and Infiniband support but I don't care whether it's AMD or intel\" in a reasonable manner. Using flavor names to express this will thus continue to be useful and we don't expect the need for standardization of flavor names to go away until the commonly used IaC tools work on a higher abstraction layer than they currently do.","s":"Motivation","u":"/standards/scs-0100-v2-flavor-naming","h":"#motivation","p":1713},{"i":1720,"t":"From discussions of our operators with their customers we learned that the following characteristics are important in a flavor description: Type Description Generation CPU Generation Number of CPU Number of vCPUs - suffixed by L,V,T,C (see below) Amount of RAM Amount of memory available for the VM Performance Class Ability to label high-performance CPUs, disks, network CPU Type X86-intel, X86-amd, ARM, RISC-V, Generic \"bms\" Bare Metal System (no virtualization/hypervisor) This list is likely not comprehensive and will grow over time. Rather than using random names s5a.medium and assigning a discrete set of properties to them, we wanted to come up with a scheme that allows to systematically derive names from properties and vice versa. The scheme allows for short names (by not encoding all details) as well as very detailed longer names.","s":"Type of information included","u":"/standards/scs-0100-v2-flavor-naming","h":"#type-of-information-included","p":1713},{"i":1722,"t":"Prefix CPUs & Suffix RAM[GiB] optional: Disk[GB]&type opt: extensions SCS- NL/V/T/C[i] -N[u][o] [-[Mx]N[n/s/l/p]] [_EXT] Note that N and M are placeholders for numbers here. The optional fields are denoted in brackets (and have opt: in the header. See below for extensions. Note that all letters are case-sensitive. Typical flavor names look like SCS-4V-16-50 for a flavor with 4vCPUs (with limited oversubscription), 16GiB RAM and a 50GB disk (of unspecified type).","s":"Complete Proposal for systematic flavor naming","u":"/standards/scs-0100-v2-flavor-naming","h":"#complete-proposal-for-systematic-flavor-naming","p":1713},{"i":1725,"t":"Next to the number of vCPUs, these vCPUs need to be characterized ti describe their nature. Suffix Meaning C dedicated Core T dedicated Thread (SMT) V vCPU (oversubscribed) L vCPU (heavily oversubscribed) Baseline​ Note that vCPU oversubscription for a V vCPU should be implemented such, that we can guarantee at least 20% of a core in >99% of the time; this can be achieved by limiting vCPU oversubscription to 5x per core (or 3x per thread when SMT/HT is enabled) or by more advanced workload management logic. Otherwise L (low performance) instead of V must be used. The >99% is measured over a month (1% is 7.2h/month). Note that CPUs should use latest microcode to protect against CPU vulnerabilities (Spectre, Meltdown, L1TF, etc.). Microcode must be updated within less than a month of a new release; for CVSS scores above 8, providers should do it in less than a week. The provider should enable at least all mitigations that are enabled by default in the Linux kernel and the KVM hypervisor. CPUs that are susceptible to L1TF (intel x86 pre Cascade Lake) should switch off hyperthreading OR (in the future) use core scheduling implementations that are deemed to be secure by the SCS security team. If microcode updates needed for mitigation are lacking for longer than a month, default kernel/hypervisor mitigations are disabled or hyperthreading is enabled despite the CPU being susceptible to L1TF, the flavors must declare themselves insecure with the i suffix (see below). Higher oversubscription​ Must be indicated with a L vCPU type (low performance for > 5x/core or > 3x/thread oversubscription and the lack of workload management that would prevent worst case performance <20% in more than 7.2h per month). Insufficient microcode​ Not using these mitigations must be indicated by an additional i suffix for insecure (weak protection against CPU vulns through insufficient microcode, lack of disabled hyperthreading on L1TF susceptible CPUs w/o effective core scheduling or disabled protections on the host/hypervisor). Examples​ SCS-2C-4-10n SCS-2T-4-10n SCS-2V-4-10n SCS-2L-4-10n SCS-2Li-4-10n SCS-2-**4-10n <- CPU suffix missing SCS-2iT-4-10n <- This order is forbidden","s":"[REQUIRED] CPU Suffixes","u":"/standards/scs-0100-v2-flavor-naming","h":"#required-cpu-suffixes","p":1713},{"i":1727,"t":"Baseline​ Cloud providers should use ECC memory. Memory oversubscription should not be used. It is allowed to specify half GiBs (e.g. 3.5), though this is should not be done for larger memory sizes (>= 10GiB). No ECC​ If no ECC is used, the u suffix must indicate this. Enabled Oversubscription​ If memory is oversubscribed, you must expose this with the o suffix. Examples​ SCS-2C-4-10n SCS-2C-3.5-10n SCS-2C-4u-10n SCS-2C-4o-10n SCS-2C-4uo-10n SCS-2C-4ou-10n <- This order is forbidden","s":"[REQUIRED] Memory","u":"/standards/scs-0100-v2-flavor-naming","h":"#required-memory","p":1713},{"i":1729,"t":"Disk sizes (in GB) should use sizes 5, 10, 20, 50, 100, 200, 500, 1000. Disk type Meaning n Network shared storage (ceph/cinder) h Local disk (HDD: SATA/SAS class) s Local SSD disk p Local high-perf NVMe Baseline​ Note that disk type might be omitted — the user then can not take any assumptions on what storage is provided for the root disk (that the image gets provisioned to). It does make sense for n to be requested explicitly to allow for smooth live migration. h typically provides latency advantages vs n (but not necessarily bandwidth and also is more likely to fail), s and p are for applications that need low latency (high IOPS) and bandwidth disk I/O. n storage is expected to survive single-disk and single-node failure. If the disk size is left out, the cloud is expected to allocate a disk (network or local) that is large enough to fit the root file system (min_disk in image). This automatic allocation is indicated with - without a disk size. If the - is left out completely, the user must create a boot volume manually and tell the instance to boot from it or use the block_device_mapping_v2 mechanism explicitly to create the boot volume from an image. Multi-provisioned Disk​ The disk size can be prefixed with Mx prefix, where M is an integer specifying that the disk is provisioned M times. Multiple disks provided this way should be independent storage media, so users can expect some level of parallelism and independence. Examples​ SCS-2C-4-10n SCS-2C-4-10s SCS-2C-4-10s_bms_z3 SCS-2C-4-3x10s <- Cloud creates three 10GB SSDs SCS-2C-4-3x10s_bms_z3 SCS-2C-4-10 <- Cloud decides disk type SCS-2C-4-10_bms_z3 SCS-2C-4-n <- Cloud decides disk size (min_disk from image or larger) SCS-2C-4-n_bms_3 SCS-2C-4- <- Cloud decides disk type and size SCS-2C-4-_bms_z3 SCS-2C-4-_bms_z3h_GNa-64_ib SCS-2C-4-_ib SCS-2C-4 <- You need to specify a boot volume yourself (boot from volume, or use block_device_mapping_v2) SCS-2C-4_bms_z3 SCS-2C-4-3x- <- Cloud decides disk type and size and creates three of them (FIXME: Is this useful?) SCS-2C-4-3xs <- Cloud decides size and creates three local SSD volumes (FIXME: useful?) SCS-2C-4-3x10 <- Cloud decides type and creates three 10GB volumes SCS-2C-4-1.5n <- You must not specify disk sizes which are not in full GiBs","s":"[OPTIONAL] Disk sizes and types","u":"/standards/scs-0100-v2-flavor-naming","h":"#optional-disk-sizes-and-types","p":1713},{"i":1731,"t":"These are flavors that must exist on standard SCS clouds (x86-64). We expect disk sizes to be 5, 10, 20, 50, 100, 200, 500, 1000GB, 2000GB. We expect a typical CPU:Mem[GiB] ratio of 1:4. vCPU:RAM ratio Mandatory Flavors 1:4 SCS-1V-4, SCS-1V-4-10 2:8 SCS-2V-8, SCS-2V-8-20 4:16 SCS-4V-16, SCS-4V-16-50 8:32 SCS-8V-32, SCS-8V-32-100 1:2 SCS-1V-2, SCS-1V-2-5 2:4 SCS-2V-4, SCS-2V-4-10 4:8 SCS-4V-8, SCS-4V-8-20 8:16 SCS-8V-16, SCS-8V-16-50 16:32 SCS-16V-32, SCS-16V-32-100 1:8 SCS-1V-8, SCS-1V-8-20 2:16 SCS-2V-16, SCS-2V-16-50 4:32 SCS-4V-32, SCS-4V-32-100 1:1 SCS-1L-1, SCS-1L-1-5 Note that all vCPUs of SCS standard flavors are oversubscribed — the smallest 1L-1 flavor allows for heavy oversubscription (note the L), and thus can be offered very cheaply — imagine jump hosts ... Disks types are not specified (and expected to be n or h typically). The design allows for small clouds (with CPUs with 16 Threads, 64GiB RAM compute hosts) to offer all flavors. Note: Compared to previous drafts, we have heavily reduced the variations on disk sizes — this reflects that for the standard networked cinder disks, you can pass block_device_mapping_v2 on server (VM) creation to allocate a boot disk of any size you desire. We have scaled the few mandatory disk sizes with the amount of RAM. For each flavor there is also one without a pre-attached disk — these are meant to be used to boot from a volume (either created beforehand or allocated on-the-fly with block_device_mapping_v2, e.g. openstack server create --flavor SCS-1V:2 --block-device-mapping sda=IMGUUID:image:12:true to create a bootable 12G cinder volume from image IMGUUID that gets tied to the VM instance life cycle.)","s":"Standard SCS flavors","u":"/standards/scs-0100-v2-flavor-naming","h":"#standard-scs-flavors","p":1713},{"i":1733,"t":"To be certified as an SCS compliant x86-64 IaaS platform, you must offer all standard SCS flavors according to the previous section. (We may define a mechanism that allows exceptions to be granted in a way that makes this very transparent and visible to clients.) You are allowed to understate your performance; you may implement a SCS-1V-1-5 flavor with a flavor that actually implements SCS-1T-1-5n (i.e. you dedicate a dedicated hyperthread instead of higher oversubscription) or even SCS-1D-1.5-8s (1 dedicated core, 50% more RAM and a 8GiB SSD). Flavor names indicating certain capabilities must at least provide these, otherwise they are in violation of the SCS specification and prevent SCS compliance. We expect all cloud providers to offer the short, less specific flavor names (such as SCS-8V-32-100). Larger providers that offer more details (using the extension below) are expected to still also offer the short variants for usability and easier portability, even beyond the mandated flavors. You must be very careful to expose low vCPU guarantees (L instead of V), insecure hyperthreading/microcode i, non-ECC-RAM u, memory oversubscription o. Note that omitting these qualifiers is overstating your security, reliability or performance properties and may be reason for clients to feel betrayed or claim damages. This would prevent SCS compliance and certification; in extreme cases, the SCS project might be forced to work with public statements. You may offer additional SCS- flavors, following the naming scheme and rules outlined here. You may offer additional flavors, not following above scheme and not starting with SCS- You must not offer flavors with the SCS- prefix which do not follow this naming scheme. You must not extend the SCS naming scheme with your own suffices; you are encouraged however to suggest extensions that we can discuss and add to the official scheme.","s":"Naming policy compliance","u":"/standards/scs-0100-v2-flavor-naming","h":"#naming-policy-compliance","p":1713},{"i":1735,"t":"There is a script in flavor_name_check.py which can be used to decode, validate and construct flavor names. This script must stay in sync with the specification text. Ensure you have your OpenStack tooling (python3-openstackclient, OS_CLOUD) setup and call tools/flavor-name-check.py -c $(openstack flavor list -f value -c Name) to get a report on the flavor list compliance of the cloud environment. The script flavor-names-openstack.py talks to the OpenStack API of the cloud specified by the OS_CLOUD environment and queries properties and checks the names for standards compliance and completeness w.r.t. the mandatory flavor list. It goes beyond the above example in checking that the discoverable features of flavors (vCPUs, RAM, Disk) match what the flavor names claim.","s":"Validation","u":"/standards/scs-0100-v2-flavor-naming","h":"#validation","p":1713},{"i":1737,"t":"The openstack-flavor-manager is able to create all standard, mandatory SCS flavors for you.","s":"Operational tooling","u":"/standards/scs-0100-v2-flavor-naming","h":"#operational-tooling","p":1713},{"i":1739,"t":"Extensions provide a possibility for providers that offer a very differentiated set of flavors to indicate hypervisors, support for hardware/nested virtuatlization, CPU types and generations, high-frequency models, GPU support and GPU types as well as Inifiniband support. (More extensions may be appended in the future.) Using the systematic naming approach ensures that two providers that offer flavors with the same specific features will use the same name for them, thus simplifying life for their customers when consuming these flavors. Note that there is no need to indicate all details and extra features this way. Flavors may always perform better or have more features than indicated in a name. Underperformance (CPU suffices L or i or memory suffices o and u) on the other hand MUST be indicated in the name; this happens rarely in practice. For smaller providers, the ability to e.g. differentiate between an AMD Milan and an intel IceLake and exposed the slightly different feature set to customers and have slightly different price points is often not worth the extra effort. This is because having this extra differentiation causes fragmentation of the machines (host aggregates) that can offer these flavors, thus resulting in a lower utilization (as the capacity management will need to have a certain amount of headroom per machine pool to avoid running out of capacity). Note that it possible for providers to register both the generic short names and the longer, more detailed names and allow them to use the same set of machines (host aggregates). Note that machines (hypervisors) can be part of more than one host aggregate. The extensions have the format: [_hyp][_hwv][_[arch[N][h][_[G/g]X[N][-M[h]]][_ib] Remember that letters are case-sensitive. In case you wonder: Feature indicators are capitalized, modifiers are lower case. (An exception is the uppercase -G for a pass-through GPU vs. lowercase -g for vGPU.)","s":"Extensions","u":"/standards/scs-0100-v2-flavor-naming","h":"#extensions","p":1713},{"i":1741,"t":"The default Hypervisor is assumed to be KVM. Clouds, that offer different hypervisors or Bare Metal Systems should indicate the Hypervisor according to the following table: hyp Meaning kvm KVM xen Xen vmw VMware hyv Hyper-V bms Bare Metal System Examples​ SCS-2C-4-10n SCS-2C-4-10n_bms SCS-2C-4-10n_bms_z3h","s":"[OPTIONAL] Hypervisor","u":"/standards/scs-0100-v2-flavor-naming","h":"#optional-hypervisor","p":1713},{"i":1743,"t":"If the instances that are created with this flavor support hardware-accelerated virtualization, this can be reflected with the _hwv flag (after the optional Hypervisor flag). On x86, this means that in the instance, the CPU flag vmx (intel) or svm (AMD) is available. This will be the case on Bare Metal flavors on almost all non-ancient x86 CPUs or if your virtualization hypervisor is configured to support nested virtualization. Flavors without the _hwv flag may or may not support hardware virtualization (as we recommend enabling nesting, but don't require flavor names to reflect all capabilities. Flavors may over-deliver ...) Examples​ SCS-2C-4-10 <- may or may not support HW virtualization in VMs SCS-2C-4-10kvmhwv <- kvm with enabled nested virtualization SCS-2C-4-10_hwv <- not recommended, but allowed SCS-2C-4-10_bms_hwv <- better: bare metal with HW virt support (VMX on intel, SVM on AMD, ...) SCS-2C-4-10_hwv_xen <- illegal, wrong ordering","s":"[OPTIONAL] Hardware virtualization / Nested virtualization","u":"/standards/scs-0100-v2-flavor-naming","h":"#optional-hardware-virtualization--nested-virtualization","p":1713},{"i":1745,"t":"Arch details provide more details on the specific CPU: Vendor Generation Frequency Generation and Vendor​ The generations are vendor specific and can be left out. Not specifying arch means that we have a generic CPU (x86-64). The letters i, z, a and r specify the vendors Intel, AMD (z like in Zen), ARM v8+, RISC-V. Generation i (Intel x86-64) z (AMD x86-64) a (AArch64) r (RISC-V) 0 pre Skylake pre Zen pre Cortex A76 TBD 1 Skylake Zen-1 (Naples) A76/NeoN1 class TBD 2 Cascade Lake Zen-2 (Rome) A78/x1/NeoV1 class TBD 3 Ice Lake Zen-3 (Milan) A71x/NeoN2 (ARMv9) TBD 4 Sapphire Rapids Zen-4 (Genoa) TBD It is recommended to leave out the 0 when specifying the old generation; this will help the parser tool, which assumes 0 for an unspecified value and does leave it out when generating the name for comparison. In other words: 0 has a meaning of \"rather old or unspecified\". Frequency Suffixes​ Suffix Meaning h >2.75GHz all-core hh >3.25GHz all-core hhh >3.75GHz all-core Examples​ SCS-2C-4-10n SCS-2C-4-10n_z SCS-2C-4-10n_z3 SCS-2C-4-10n_z3h SCS-2C-4-10n_z3hh SCS-2C-4-10nbmsz SCS-2C-4-10nbmsz3 SCS-2C-4-10nbmsz3 SCS-2C-4-10nbmsz3h SCS-2C-4-10nbmsz3hh <- Bare Metal, Intel Ice Lake with > 3.25GHz all core freq","s":"[OPTIONAL] CPU Architecture Details","u":"/standards/scs-0100-v2-flavor-naming","h":"#optional-cpu-architecture-details","p":1713},{"i":1747,"t":"_GX[N][-M[h]] indicates a Pass-Through GPU from vendor X of gen N with M compute units / SMs / EUs exposed. _gX[N][-M[h]] indicates a vGPU from vendor X of gen N with M compute units / SMs / EUs assigned. Note that the vendor letter X is mandatory, generation and compute units are optional. GPU Vendor N nVidia A AMD I Intel For nVidia, the generation N can be f=Fermi, k=Kepler, m=Maxwell, p=Pascal, v=Volta, t=turing, a=Ampere, l=Ada Lovelace, ..., for AMD GCN-x=0.x, RDNA1=1, RDNA2=2, RDNA3=3, for intel Gen9=0.9, Xe(12.1)=1, ... (Note: This may need further work to properly reflect what's out there.) The optional h suffix to the compute unit count indicates high-performance (e.g. high freq or special high bandwidth gfx memory such as HBM); h can be duplicated for even higher performance.","s":"[OPTIONAL] GPU support","u":"/standards/scs-0100-v2-flavor-naming","h":"#optional-gpu-support","p":1713},{"i":1749,"t":"_ib indicates Infiniband networking. More extensions may be forthcoming and appended in a later revision of this spec. Extensions need to be specified in the above mentioned order.","s":"[OPTIONAL] Infiniband","u":"/standards/scs-0100-v2-flavor-naming","h":"#optional-infiniband","p":1713},{"i":1751,"t":"Note that we expect most clouds to prefer short flavor names, not indicating CPU details or hypervisor types. See above list of standard flavors to get a feeling. However, more successful providers will often need to differentiate their offerings in response to customer demand and allow customers to request flavors with specific detailed properties. The goal of this proposal is to avoid providers to invent their own names and then refer customers to (currently incompletely standardized) extra_specs or worse a non-machine-readable service descriptions to find out the details. So a cloud provider might well evolve from offering SCS-8T-16-50 to offering SCS-8T-16-50n, SCS-8T-16-50n_i2 and SCS-8T-16-50n_a2 to specify that he is using network disks and offer a choice b/w intel Cascade-Lake and AMD Rome. We would expect the cloud provider to still offer the generic flavor SCS-8T-16-50 and allow the scheduler (placement service) to pick both more specific types (or just one if e.g. capacity management considerations suggest so). Providers should in such cases make sure that the price does not depend on scheduler decisions. We are looking into the metadefs mechanism and extra_specs to allow customers to ask for specific flavor properties without the need to encode all these flavor details into the flavor name, so the optional pieces may not be needed much. However, there must be a way to request flavor properties without encoding the need into an image — the indirection via an image is considered broken by the SCS team.","s":"Naming options advice","u":"/standards/scs-0100-v2-flavor-naming","h":"#naming-options-advice","p":1713},{"i":1753,"t":"Example Decoding SCS-2C-4-10n 2 dedicated cores (x86-64), 4GiB RAM, 10GB network disk SCS-8Ti-32-50p_i1 8 dedicated hyperthreads (insecure), Skylake, 32GiB RAM, 50GB local NVMe SCS-1L-1u-5 1 vCPU (heavily oversubscribed), 1GiB Ram (no ECC), 5GB disk (unspecific) SCS-16T-64-200s_GNa-64_ib 16 dedicated threads, 64GiB RAM, 200GB local SSD, Infiniband, 64 Passthrough nVidia Ampere SMs SCS-4C-16-2x200p_a1 4 dedicated Arm64 cores (A76 class), 16GiB RAM, 2x200GB local NVMe drives SCS-1V-0.5 1 vCPU, 0.5GiB RAM, no disk (boot from cinder volume)","s":"Proposal Examples","u":"/standards/scs-0100-v2-flavor-naming","h":"#proposal-examples","p":1713},{"i":1755,"t":"Version 1 of the standard used a slightly different naming syntax while the logic was exactly the same. What is a - in v2 used to be a :; _ used to be -. The reason for the change was certain Kubernetes tools using the flavor names as labels. Labels however are subject to stricter naming rules and in particular don't allow for a :. See PR #190 for a discussion. Version 1 flavor names can be translated to v2 using the following transformation: NAMEV2=$(echo \"$NAMEV1\" | sed -e 's/\\-/_/g' -e 's/:/-/g' -e 's/^SCS_/SCS-/') and the way back can be done with NAMEV1=$(echo \"$NAMEV2\" | sed -e 's/\\-/:/g' -e 's/_/-/g' -e 's/^SCS:/SCS-/') Considerations for how providers can ensure a smooth transition for their customers from v1 to v2 are written in a separate document. For the time being, the validation tools still accept the old names with a warning (despite the unchanged SCS- prefix) unless you pass option -2 to them. They will however not count v1 flavors towards fulfilling the needs against the corresponding v2 mandatory flavor list unless you pass the option -1. In other words: An IaaS infrastructure with the 26 v1 mandatory flavors will produce 26 warnings (for using old flavors) and 26 errors (for missing the 26 mandatory v2 flavors) unless you pass -1 in which case no errors and no warnings will be produced. Registering the 26 mandatory v2 flavor names in addition will result in passing the test with only 26 warnings — unless you specify -2. If you do and want to pass you'll need to remove the old v1 names or rename them to no longer start with SCS-.","s":"Previous standard versions","u":"/standards/scs-0100-v2-flavor-naming","h":"#previous-standard-versions","p":1713},{"i":1757,"t":"The Gaia-X provider working group which could have created a superseding standard does no longer exist. However, we have been reaching out to the OpenStack Public Cloud SIG and the ALASCA members to seek further alignment. Getting upstream OpenStack support for flavor aliases would provide more flexibility and ease migrations between providers, also providers that don't offer the SCS- flavors. We also would like to see upstream extra_specs standardizing the discoverability of some properties exposed via the SCS names and work on IaC tooling (terraform ...) to make use of these when selecting a flavor.","s":"Beyond SCS","u":"/standards/scs-0100-v2-flavor-naming","h":"#beyond-scs","p":1713},{"i":1760,"t":"This is the standard v3.1 for SCS Release 5. Note that we intend to only extend it (so it's always backwards compatible), but try to avoid changing in incompatible ways. (See at the end for the v1 to v2 transition where we have not met that goal, but at least managed to have a 1:1 relationship between v1 and v2 names.)","s":"Introduction","u":"/standards/scs-0100-v3-flavor-naming","h":"#introduction","p":1758},{"i":1762,"t":"In OpenStack environments there is a need to define different flavors for instances. The flavors are pre-defined by the operator, the customer can not change these. OpenStack providers thus typically offer a large selection of flavors. While flavors can be discovered (openstack flavor list), it is helpful for users (DevOps teams), to have a naming scheme that is used across all SCS flavors, so flavor names have the same meaning everywhere. While not all details will be encoded in the name, the key features should be obvious: Number of vCPUs, RAM, Root Disk. Extra features are important as well: There will be flavors with GPU support, fast disks for databases, memory-heavy applications, and other useful aspects of an instance. It may also be important to make the CPU generation clearly recognizable, as this is always a topic in discussions with customers. Note that not all relevant properties of flavors can be discovered; creating a specification to address this is a separate but related effort to the name standardization. Commonly used infrastructure-as-code tools do not provide a way to use discoverability features to express something like \"I want a flavor with 2 vCPUs, 8GiB of RAM, a local 20GB SSD disk and Infiniband support but I don't care whether it's AMD or intel\" in a reasonable manner. Using flavor names to express this will thus continue to be useful and we don't expect the need for standardization of flavor names to go away until the commonly used IaC tools work on a higher abstraction layer than they currently do.","s":"Motivation","u":"/standards/scs-0100-v3-flavor-naming","h":"#motivation","p":1758},{"i":1765,"t":"From discussions of our operators with their customers we learned that the following characteristics are important in a flavor description: Type Description Generation CPU Generation Number of CPU Number of vCPUs - suffixed by L,V,T,C (see below) Amount of RAM Amount of memory available for the VM Performance Class Ability to label high-performance CPUs, disks, network CPU Type X86-intel, X86-amd, ARM, RISC-V, Generic \"bms\" Bare Metal System (no virtualization/hypervisor) This list is likely not comprehensive and will grow over time. Rather than using random names s5a.medium and assigning a discrete set of properties to them, we wanted to come up with a scheme that allows to systematically derive names from properties and vice versa. The scheme allows for short names (by not encoding all details) as well as very detailed longer names.","s":"Type of information included","u":"/standards/scs-0100-v3-flavor-naming","h":"#type-of-information-included","p":1758},{"i":1767,"t":"Prefix CPUs & Suffix RAM[GiB] optional: Disk[GB]&type opt: extensions SCS- NL/V/T/C[i] -N[u][o] [-[Mx]N[n/h/s/p]] [_EXT] Note that N and M are placeholders for numbers here. The optional fields are denoted in brackets (and have opt: in the header. See below for extensions. Note that all letters are case-sensitive. Typical flavor names look like SCS-4V-16-50 for a flavor with 4vCPUs (with limited oversubscription), 16GiB RAM and a 50GB disk (of unspecified type).","s":"Complete Proposal for systematic flavor naming","u":"/standards/scs-0100-v3-flavor-naming","h":"#complete-proposal-for-systematic-flavor-naming","p":1758},{"i":1770,"t":"Next to the number of vCPUs, these vCPUs need to be characterized to describe their nature. Suffix Meaning C dedicated Core T dedicated Thread (SMT) V vCPU (oversubscribed) L vCPU (heavily oversubscribed) Baseline​ Note that vCPU oversubscription for a V vCPU should be implemented such, that we can guarantee at least 20% of a core in >99% of the time; this can be achieved by limiting vCPU oversubscription to 5x per core (or 3x per thread when SMT/HT is enabled) or by more advanced workload management logic. Otherwise L (low performance) instead of V must be used. The >99% is measured over a month (1% is 7.2h/month). Note that CPUs should use latest microcode to protect against CPU vulnerabilities (Spectre, Meltdown, L1TF, etc.). In particular, microcode must be updated within less than a month of a new release; for CVSS scores above 8, providers should do it in less than a week. all mitigations that are enabled by default in the Linux kernel and the KVM hypervisor should be enabled, CPUs that are susceptible to L1TF (intel x86 pre Cascade Lake) should have hyperthreading disabled OR (in the future) use core scheduling implementations that are deemed to be secure by the SCS security team. That is to say, except when the suffix i is used, the provider commits itself to implementing the appropriate mitigations if and when they become available, within the timeframes mentioned above. If a provider does not want to commit to deploying available microcode fixes and upstream kernel/hypervisor updates within a month or if the provider wants to enable hyperthreading on compute hosts despite having CPUs susceptible to L1TF there (and no SCS-accepted core-scheduling mechanism is used for mitigation), the flavors must be declared insecure with the i suffix (see below). Higher oversubscription​ Must be indicated with a L vCPU type (low performance for > 5x/core or > 3x/thread oversubscription and the lack of workload management that would prevent worst case performance <20% in more than 7.2h per month). Insufficient microcode​ Not using these mitigations must be indicated by an additional i suffix for insecure (weak protection against CPU vulns through insufficient microcode, lack of disabled hyperthreading on L1TF susceptible CPUs w/o effective core scheduling or disabled protections on the host/hypervisor). Examples​ SCS-2C-4-10n SCS-2T-4-10n SCS-2V-4-10n SCS-2L-4-10n SCS-2Li-4-10n SCS-2-**4-10n <- CPU suffix missing SCS-2iT-4-10n <- This order is forbidden","s":"[REQUIRED] CPU Suffixes","u":"/standards/scs-0100-v3-flavor-naming","h":"#required-cpu-suffixes","p":1758},{"i":1772,"t":"Baseline​ Cloud providers should use ECC memory. Memory oversubscription should not be used. It is allowed to specify half GiBs (e.g. 3.5), though this is should not be done for larger memory sizes (>= 10GiB). No ECC​ If no ECC is used, the u suffix must indicate this. Enabled Oversubscription​ If memory is oversubscribed, you must expose this with the o suffix. Examples​ SCS-2C-4-10n SCS-2C-3.5-10n SCS-2C-4u-10n SCS-2C-4o-10n SCS-2C-4uo-10n SCS-2C-4ou-10n <- This order is forbidden","s":"[REQUIRED] Memory","u":"/standards/scs-0100-v3-flavor-naming","h":"#required-memory","p":1758},{"i":1774,"t":"Disk sizes (in GB) should use sizes 5, 10, 20, 50, 100, 200, 500, 1000. Disk type Meaning n Network shared storage (ceph/cinder) h Local disk (HDD: SATA/SAS class) s Local SSD disk p Local high-perf NVMe Baseline​ Note that disk type might be omitted — the user then can not take any assumptions on what storage is provided for the root disk (that the image gets provisioned to). It does make sense for n to be requested explicitly to allow for smooth live migration. h typically provides latency advantages vs n (but not necessarily bandwidth and also is more likely to fail), s and p are for applications that need low latency (high IOPS) and bandwidth disk I/O. n storage is expected to survive single-disk and single-node failure. For specific requirements on the SSD and NVMe disks regarding IOPS and power-loss protection, refer to Decision Record scs-0110-ssd-flavors. If the disk size is left out, the cloud is expected to allocate a disk (network or local) that is large enough to fit the root file system (min_disk in image). This automatic allocation is indicated with - without a disk size. If the - is left out completely, the user must create a boot volume manually and tell the instance to boot from it or use the block_device_mapping_v2 mechanism explicitly to create the boot volume from an image. Multi-provisioned Disk​ The disk size can be prefixed with Mx prefix, where M is an integer specifying that the disk is provisioned M times. Multiple disks provided this way should be independent storage media, so users can expect some level of parallelism and independence. Examples​ SCS-2C-4-10n SCS-2C-4-10s SCS-2C-4-10s_bms_z3 SCS-2C-4-3x10s <- Cloud creates three 10GB SSDs SCS-2C-4-3x10s_bms_z3 SCS-2C-4-10 <- Cloud decides disk type SCS-2C-4-10_bms_z3 SCS-2C-4-n <- Cloud decides disk size (min_disk from image or larger) SCS-2C-4-n_bms_3 SCS-2C-4- <- Cloud decides disk type and size SCS-2C-4-_bms_z3 SCS-2C-4-_bms_z3h_GNa-64_ib SCS-2C-4-_ib SCS-2C-4 <- You need to specify a boot volume yourself (boot from volume, or use block_device_mapping_v2) SCS-2C-4_bms_z3 SCS-2C-4-3x10 <- Cloud decides type and creates three 10GB volumes SCS-2C-4-1.5n <- You must not specify disk sizes which are not in full GiBs","s":"[OPTIONAL] Disk sizes and types","u":"/standards/scs-0100-v3-flavor-naming","h":"#optional-disk-sizes-and-types","p":1758},{"i":1776,"t":"You are allowed to understate your performance; you may implement a SCS-1V-1-5 flavor with a flavor that actually implements SCS-1T-1-5n (i.e. you dedicate a dedicated hyperthread instead of higher oversubscription) or even SCS-1C-1.5-8s (1 dedicated core, 50% more RAM and a 8GiB SSD). Or you may offer the (v3 mandatory) SCS-2V-4-20s with a SCS-2V-4-20p (using a local NVMe instead of an SSD). Flavor names indicating certain capabilities must at least provide these, otherwise they are in violation of the SCS specification and prevent SCS compliance. We expect all cloud providers to offer the short, less specific flavor names (such as SCS-8V-32-100). Larger providers that offer more details (using the extension below) are expected to still also offer the short variants for usability and easier portability, even beyond the mandated flavors. You must be very careful to expose low vCPU guarantees (L instead of V), insecure hyperthreading/microcode i, non-ECC-RAM u, memory oversubscription o. Note that omitting these qualifiers is overstating your security, reliability or performance properties and may be reason for clients to feel betrayed or claim damages. This would prevent SCS compliance and certification; in extreme cases, the SCS project might be forced to work with public statements. You may offer additional SCS- flavors, following the naming scheme and rules outlined here. You may offer additional flavors, not following above scheme and not starting with SCS- You must not offer flavors with the SCS- prefix which do not follow this naming scheme. You must not extend the SCS naming scheme with your own extensions; you are encouraged however to suggest extensions that we can discuss and add to the official scheme.","s":"Naming policy compliance","u":"/standards/scs-0100-v3-flavor-naming","h":"#naming-policy-compliance","p":1758},{"i":1778,"t":"There is a script in flavor-name-check.py which can be used to decode, validate and construct flavor names. flavor-name-describe.py outputs a human-readable decoding of the SCS flavor names. These scripts must stay in sync with the specification text. Ensure you have your OpenStack tooling (python3-openstackclient, OS_CLOUD) setup and call tools/flavor-name-check.py -c $(openstack flavor list -f value -c Name) to get a report on the flavor list compliance of the cloud environment. The script flavor-names-openstack.py talks to the OpenStack API of the cloud specified by the OS_CLOUD environment and queries properties and checks the names for standards compliance. It goes beyond the above example in checking that the discoverable features of flavors (vCPUs, RAM, Disk) match what the flavor names claim. This is used for SCS-compatible compliance testing.","s":"Conformance Tests","u":"/standards/scs-0100-v3-flavor-naming","h":"#conformance-tests","p":1758},{"i":1780,"t":"Extensions provide a possibility for providers that offer a very differentiated set of flavors to indicate hypervisors, support for hardware/nested virtualization, CPU types and generations, high-frequency models, GPU support and GPU types as well as Infiniband support. (More extensions may be appended in the future.) Using the systematic naming approach ensures that two providers that offer flavors with the same specific features will use the same name for them, thus simplifying life for their customers when consuming these flavors. Note that there is no need to indicate all details and extra features this way. Flavors may always perform better or have more features than indicated in a name. Underperformance (CPU suffixes L or i or memory suffixes o and u) on the other hand MUST be indicated in the name; this happens rarely in practice. For smaller providers, the ability to e.g. differentiate between an AMD Milan and an intel IceLake and exposed the slightly different feature set to customers and have slightly different price points is often not worth the extra effort. This is because having this extra differentiation causes fragmentation of the machines (host aggregates) that can offer these flavors, thus resulting in a lower utilization (as the capacity management will need to have a certain amount of headroom per machine pool to avoid running out of capacity). Note that it is possible for providers to register both the generic short names and the longer, more detailed names and allow them to use the same set of machines (host aggregates). Note that machines (hypervisors) can be part of more than one host aggregate. The extensions have the format: [_hyp][_hwv][_arch[N][h]][_[G/g]X[N][-M][h]][_ib] Extensions are individually optional, but the ones that are used must appear in the order given in the above line. Remember that letters are case-sensitive. In case you wonder: Feature indicators are capitalized, modifiers are lower case. (An exception is the uppercase _G for a pass-through GPU vs. lowercase _g for vGPU.)","s":"Extensions","u":"/standards/scs-0100-v3-flavor-naming","h":"#extensions","p":1758},{"i":1782,"t":"Format: _hyp The default Hypervisor is assumed to be KVM. Clouds that offer different hypervisors or Bare Metal Systems should indicate the Hypervisor according to the following table: hyp Meaning kvm KVM xen Xen vmw VMware hyv Hyper-V bms Bare Metal System Examples​ SCS-2C-4-10n SCS-2C-4-10n_bms SCS-2C-4-10n_bms_z3h","s":"[OPTIONAL] Hypervisor","u":"/standards/scs-0100-v3-flavor-naming","h":"#optional-hypervisor","p":1758},{"i":1784,"t":"Format: _hwv If the instances that are created with this flavor support hardware-accelerated virtualization, this can be reflected with the _hwv flag (after the optional Hypervisor flag). On x86, this means that in the instance, the CPU flag vmx (intel) or svm (AMD) is available. This will be the case on Bare Metal flavors on almost all non-ancient x86 CPUs or if your virtualization hypervisor is configured to support nested virtualization. Flavors without the _hwv flag may or may not support hardware virtualization (as we recommend enabling nesting, but don't require flavor names to reflect all capabilities. Flavors may over-deliver ...) Examples​ SCS-2C-4-10 <- may or may not support HW virtualization in VMs SCS-2C-4-10kvmhwv <- kvm with enabled nested virtualization SCS-2C-4-10_hwv <- not recommended, but allowed SCS-2C-4-10_bms_hwv <- better: bare metal with HW virt support (VMX on intel, SVM on AMD, ...) SCS-2C-4-10_hwv_xen <- illegal, wrong ordering","s":"[OPTIONAL] Hardware virtualization / Nested virtualization","u":"/standards/scs-0100-v3-flavor-naming","h":"#optional-hardware-virtualization--nested-virtualization","p":1758},{"i":1786,"t":"Format: _arch[N][h] This extension provides more details on the specific CPU: vendor/architecture (arch) generation (N) frequency (h) Generation and Vendor​ The options for arch are as follows: Letter vendor/architecture Corresponding image architecture (none) Generic x86-64 x86_64 i Intel x86-64 x86_64 z AMD (Zen) x86-64 x86_64 a ARM v8+ aarch64 r RISC-V (not yet listed in Glance) The generation is vendor specific and can be left out, but it can only be specified in conjunction with a vendor. At present, these values are possible: Generation i (Intel x86-64) z (AMD x86-64) a (AArch64) r (RISC-V) 0 pre Skylake pre Zen pre Cortex A76 TBD 1 Skylake Zen-1 (Naples) A76/NeoN1 class TBD 2 Cascade Lake Zen-2 (Rome) A78/x1/NeoV1 class TBD 3 Ice Lake Zen-3 (Milan) A71x/NeoN2 (ARMv9) TBD 4 Sapphire Rapids Zen-4 (Genoa) TBD It is recommended to leave out the 0 when specifying the old generation; this will help the parser tool, which assumes 0 for an unspecified value and does leave it out when generating the name for comparison. In other words: 0 has a meaning of \"rather old or unspecified\". note We don't differentiate between Zen-4 (Genoa) and Zen-4c (Bergamo); L3 cache per Siena core is smaller on Bergamo and the frequency lower but the cores are otherwise identical. As we already have a qualifier h that allows to specify higher frequencies (which Genoa thus may use more and Bergamo less or not), we have enough distinction capabilities. Frequency Suffixes​ Suffix Meaning h >2.75GHz all-core hh >3.25GHz all-core hhh >3.75GHz all-core Examples​ SCS-2C-4-10n SCS-2C-4-10n_z SCS-2C-4-10n_z3 SCS-2C-4-10n_z3h SCS-2C-4-10n_z3hh SCS-2C-4-10n_bms_z SCS-2C-4-10n_bms_z3 SCS-2C-4-10n_bms_z3 SCS-2C-4-10n_bms_z3h SCS-2C-4-10n_bms_z3hh <- Bare Metal, AMD Milan with > 3.25GHz all core freq","s":"[OPTIONAL] CPU Architecture Details","u":"/standards/scs-0100-v3-flavor-naming","h":"#optional-cpu-architecture-details","p":1758},{"i":1788,"t":"Format: _[G/g]X[N][-M][h] This extension provides more details on the specific GPU: pass-through (G) vs. virtual GPU (g) vendor (X) generation (N) number (M) of processing units that are exposed (for pass-through) or assigned; see table below for vendor-specific terminology high-performance indicator (h) Note that the vendor letter X is mandatory, generation and processing units are optional. letter X vendor processing units N nVidia streaming multiprocessors (SMs) A AMD compute units (CUs) I Intel execution units (EUs) For nVidia, the generation N can be f=Fermi, k=Kepler, m=Maxwell, p=Pascal, v=Volta, t=turing, a=Ampere, l=Ada Lovelace, ..., for AMD GCN-x=0.x, RDNA1=1, RDNA2=2, RDNA3=3, for Intel Gen9=0.9, Xe(12.1)=1, ... (Note: This may need further work to properly reflect what's out there.) The optional h suffix to the compute unit count indicates high-performance (e.g. high freq or special high bandwidth gfx memory such as HBM); h can be duplicated for even higher performance. Example: SCS-16V-64-500s_GNa-14h This flavor has a pass-through GPU nVidia Ampere with 14 SMs and either high-bandwidth memory or specially high frequencies. Looking through GPU specs you could guess it's 1/4 of an A30.","s":"[OPTIONAL] GPU support","u":"/standards/scs-0100-v3-flavor-naming","h":"#optional-gpu-support","p":1758},{"i":1790,"t":"Format: _ib This extension indicates Infiniband networking. More extensions may be forthcoming and appended in a later revision of this spec. Extensions need to be specified in the above-mentioned order.","s":"[OPTIONAL] Infiniband","u":"/standards/scs-0100-v3-flavor-naming","h":"#optional-infiniband","p":1758},{"i":1792,"t":"Note that we expect most clouds to prefer short flavor names, not indicating CPU details or hypervisor types. See above list of standard flavors to get a feeling. However, more successful providers will often need to differentiate their offerings in response to customer demand and allow customers to request flavors with specific detailed properties. The goal of this proposal is to avoid providers to invent their own names and then refer customers to (currently incompletely standardized) extra_specs or worse a non-machine-readable service descriptions to find out the details. So a cloud provider might well evolve from offering SCS-8T-16-50 to offering SCS-8T-16-50n, SCS-8T-16-50n_i2 and SCS-8T-16-50n_z2 to specify that he is using network disks and offer a choice b/w intel Cascade-Lake and AMD Rome. We would expect the cloud provider to still offer the generic flavor SCS-8T-16-50 and allow the scheduler (placement service) to pick both more specific types (or just one if e.g. capacity management considerations suggest so). Providers in such cases should ensure that the price of a requested flavor does not depend on the scheduler decisions. We are looking into the metadefs mechanism and extra_specs to allow customers to ask for specific flavor properties without the need to encode all these flavor details into the flavor name, so the optional pieces may not be needed much. However, there must be a way to request flavor properties without encoding the need into an image — the indirection via an image is considered broken by the SCS team.","s":"Naming options advice","u":"/standards/scs-0100-v3-flavor-naming","h":"#naming-options-advice","p":1758},{"i":1794,"t":"Example Decoding SCS-2C-4-10n 2 dedicated cores (x86-64), 4GiB RAM, 10GB network disk SCS-8Ti-32-50p_i1 8 dedicated hyperthreads (insecure), Skylake, 32GiB RAM, 50GB local NVMe SCS-1L-1u-5 1 vCPU (heavily oversubscribed), 1GiB Ram (no ECC), 5GB disk (unspecific) SCS-16T-64-200s_GNa-64_ib 16 dedicated threads, 64GiB RAM, 200GB local SSD, Infiniband, 64 Passthrough nVidia Ampere SMs SCS-4C-16-2x200p_a1 4 dedicated Arm64 cores (A76 class), 16GiB RAM, 2x200GB local NVMe drives SCS-1V-0.5 1 vCPU, 0.5GiB RAM, no disk (boot from cinder volume)","s":"Proposal Examples","u":"/standards/scs-0100-v3-flavor-naming","h":"#proposal-examples","p":1758},{"i":1796,"t":"Previous versions up to version 3.0 contained the list of mandatory/recommended flavors, which has been moved to a standard of its own. Version 1 of the standard used a slightly different naming syntax while the logic was exactly the same. What is a - in v2 used to be a :; _ used to be -. The reason for the change was certain Kubernetes tools using the flavor names as labels. Labels however are subject to stricter naming rules and in particular don't allow for a :. See PR #190 for a discussion. Version 1 flavor names can be translated to v2 using the following transformation: NAMEV2=$(echo \"$NAMEV1\" | sed -e 's/\\-/_/g' -e 's/:/-/g' -e 's/^SCS_/SCS-/') and the way back can be done with NAMEV1=$(echo \"$NAMEV2\" | sed -e 's/\\-/:/g' -e 's/_/-/g' -e 's/^SCS:/SCS-/') For the time being, the validation tools still accept the old names with a warning (despite the unchanged SCS- prefix) unless you pass option -2 to them. They will however not count v1 flavors towards fulfilling the needs against the corresponding v2 mandatory flavor list unless you pass the option -1. In other words: An IaaS infrastructure with the 26 v1 mandatory flavors will produce 26 warnings (for using old flavors) and 26 errors (for missing the 26 mandatory v2 flavors) unless you pass -1 in which case no errors and no warnings will be produced. Registering the 26 mandatory v2 flavor names in addition will result in passing the test with only 26 warnings — unless you specify -2. If you do and want to pass you'll need to remove the old v1 names or rename them to no longer start with SCS-.","s":"Previous standard versions","u":"/standards/scs-0100-v3-flavor-naming","h":"#previous-standard-versions","p":1758},{"i":1798,"t":"The Gaia-X provider working group which could have created a superseding standard does no longer exist. However, we have been reaching out to the OpenStack Public Cloud SIG and the ALASCA members to seek further alignment. Getting upstream OpenStack support for flavor aliases would provide more flexibility and ease migrations between providers, also providers that don't offer the SCS- flavors. We also would like to see upstream extra_specs standardizing the discoverability of some properties exposed via the SCS names and work on IaC tooling (terraform ...) to make use of these when selecting a flavor.","s":"Beyond SCS","u":"/standards/scs-0100-v3-flavor-naming","h":"#beyond-scs","p":1758},{"i":1801,"t":"Many clouds offer standard Operating System images for their users' convenience. To make them really useful, they should contain meta data (properties) to allow users to understand what they can expect using these images. The specification is targeting images that are managed by the service provider, provided for public consumption. The spec or parts of it however might turn out to be useful whenever someone manages images for somebody else's consumption.","s":"Motivation","u":"/standards/scs-0102-v1-image-metadata","h":"#motivation","p":1799},{"i":1803,"t":"We categorize the image properties into a few buckets Technical requirements and features Image handling aspects Licensing/Maintenance/Support aspects","s":"Overview","u":"/standards/scs-0102-v1-image-metadata","h":"#overview","p":1799},{"i":1805,"t":"We suggest plain OS images to be named \"Distribution Version\", e.g. \"openSUSE Leap 15.3\" or \"Ubuntu 20.04\" or \"CentOS 8\", \"Windows Server 2012R2\". We do not normally recommend to add more detailed patch levels into the name. Special variants that include specific non-standard features should be named \"Distribution Version Feature1 Feature2\". There are several policies possible to provide updated images to include the latest bug- and security fixes. This is outlined in update policy description below.","s":"Naming","u":"/standards/scs-0102-v1-image-metadata","h":"#naming","p":1799},{"i":1807,"t":"This is dependent on whether we deal with VM images or container images. For VM images (OpenStack), we recommend to use the properties as described in the OpenStack Image documentation. The following properties are considered mandatory: architecture, hypervisor_type min_disk_size (in GiB), min_ram (in MiB) os_version, os_distro hw_rng_model, hw_disk_bus (scsi recommended, and then setting hw_scsi_model is also recommended) Note: Disk sizes tend to be measured in GB = 10^9 and not GiB = 2^30 in the disk industry, but OpenStack uses GiB. The following properties are recommended (if the features are supported): os_secure_boot, hw_firmware_type hw_watchdog_action, hw_mem_encryption, hw_pmu, hw_video_ram, hw_vif_multiqueue_enabled The trait:XXX=required property can be used to indicate that certain virtual hardware features XXX are required.","s":"Technical requirements and features","u":"/standards/scs-0102-v1-image-metadata","h":"#technical-requirements-and-features","p":1799},{"i":1810,"t":"It is recommended that provider managed images are regularly updated. This means that users referencing an image by name will always get the latest image for the operating system indicated by that name (which includes a version number, but not the patch level). Technically, the thus updated image is a new image and will thus carry a new UUID. It is recommended that the old image gets renamed (e.g. build date or patch level attached) and hidden (os_hidden=true), but remains accessible via its (unchanged) UUID for some time. The update handling by the provider is described via the properties replace_frequency, uuid_validity, provided_until, and hotfix_hours. The replace_frequency, provided_until, and hotfix_hours fields reference to the image as referenced by its name. replace_frequency meaning yearly the image will get replaced at least once per year quarterly the image will get replaced at least once per quarter monthly the image will get replaced at least once per month weekly the image will get replaced at least once per week daily the image will get replaced at least once per day critical_bug the image will get replaced for critical issues only never the image referenced by name will never change (until the date provided_until) Note the at least wording: Providers can replace images more often. The frequency is starting from the first release; so an image published on 2021-04-14 with an update frequency of monthly, should be replaced no later than 2021-05-14. Due to weekends etc., up to 3 days later is not considered a violation of this policy. So a valid sequence from an image with monthly update frequency might be 2021-04-14, 2021-05-14, 2021-06-15, 2021-07-14, 2021-07-27 (hotfix), 2021-08-13 ... Promises to update the registered public images typically depend on upstream image providers (Linux distributors, OS vendors) keeping their promises to build and provide updated images. Failures from upstream are not a reason to claim the cloud provider to be in violation of his promises. However, if the provider observes massive upstream failures (which can e.g. cause increased security risks), we advise the provider to inform the users. We recommend updating images at least monthly. The hotfix_hours field indicates how providers deal with critical security issues that affect the images; it is an optional field that contains a numerical value, indicating how quickly (in hours) a new image is provided after the latter of the points in time that the issue becomes public and a tested fix is available as maintenance update from the upstream distribution. A value of 0 indicates a best-effort approach without firm SLAs; the field not being present indicates no commitment. A value of 48 would indicate that the provider commits to a new image within 48hrs. A critical issue is defined as a security vulnerability with a CVSS score of 9.0 or higher that affects a package that is included in the image. The provided_until field is supposed to contain a date in YYYY-MM-DD format that indicates until when an image under this name will be provided and (according to the replace_frequency) updated at least. (Providers are free to provide updates for longer or leave the non-updated image visible for longer.) If this field is set to none, no promises are made, if it is set to notice, updates will be provided until a deprecation notice is published. (The values are the same as for below uuid_validity, except that forever and last-N don't make any sense.) The uuid_validity field indicates how long the public image will be referencable by it's UUID. uuid_validity meaning none UUID will only be valid as long as the content does not change last-N The last N images for newer replacement will remain accessible via UUID YYYY-MM-DD UUID will be valid until at least the date YYYY-MM-DD notice UUID will remain valid until a deprecation notice will be published forever UUID will remain valid for as long as the cloud operates Note that the old images must be hidden from the image catalogue or renamed (or both) to avoid failing referencing by name. Note that last-N may be limited by the provided_till date. The three properties uuid_validity, provided_until and replace_frequency are mandatory; the field hotfix_hours is optional. All dates are in UTC. Example​ Providing an image with name OPSYS MAJ.MIN with replace_frequency=monthly, provided_until=2022-09-30, uuid_validity=2022-12-31, hotfix_hours=0 means that we will have a new image with this name at least once per month (starting from the initial release) until the end of September 2022. Old images will be hidden and/or renamed, but remain accessible via their UUID until at least the end of 2022 (in Universal Time). The provider makes an effort to replace images upon critical security issues out of order.","s":"Image updating","u":"/standards/scs-0102-v1-image-metadata","h":"#image-updating","p":1799},{"i":1812,"t":"Mandatory: image_source needs to be a URL to point to a place from which the image can be downloaded. (Note: This may be set to the string \"private\" to indicate that the image can not be freely downloaded.) Mandatory: image_description needs to be an URL (or text) with release notes and other human readable data about the image. Recommended tag: managed_by_VENDOR Note that for most images that come straight from an upstream source, image_description should point to a an upstream web page where these images are described. If download links are available as well on that page, image_source can point to the same page, otherwise a more direct link to the image should be used, e.g. directly linking the .qcow2 or .img file. If providers have their own image building machinery or do some post-processing on top of upstream images, they should point to the place where they document and offer these images.","s":"Image Origin","u":"/standards/scs-0102-v1-image-metadata","h":"#image-origin","p":1799},{"i":1814,"t":"Mandatory: image_build_date needs to be YYYY-MM-DD or YYYY-MM-DD hh:mm[:ss] (time in UTC, 24hrs clock). All publicly released and generally recommended patches before this date must be included in the image build. If the cutoff date is earlier, this cutoff date needs to be set instead, even if the actual build happens significantly after the cutoff date. If not all patches can be included for a good reason, then the patchlevel field (see below) must be used to describe the patch status. Mandatory: image_original_user is the default login user for the operating system which can connect to the image via the injected SSH key or provided password. (This can be set to none if no default user name exists for the operating system.) Optional: patchlevel can be set to an operating specific patch level that describes the patch status — typically we would expect the image_build_date to be sufficient. Recommended: os_hash_algo and os_hash_value: The sha256 or sha512 hash for the image file. (This references the image file in the format it is stored in, we recommend raw over qcow2 for systems that use ceph.) Note that these values are typically generated automatically upon image registration. Recommended tag: os:OPERATINGSYSTEM","s":"Image build info","u":"/standards/scs-0102-v1-image-metadata","h":"#image-build-info","p":1799},{"i":1816,"t":"Some images require a license; in many cases the cloud providers include the license cost by a per-use (e.g. hourly) fee. However, it is also possible sometimes that customers use their own license agreements with the OS vendor with a bring-your-own-license (BYOL) program. These properties may be attached to the image. Note that free Linux images might not use any of these properties, except maybe maintained_until. Note that Windows images would typically require license_included, subscription_included. A boolean property that is not present is considered to be false. Optional: license_included (boolean) indicates whether or not the flavor fee includes the licenses required to use this image. This field is mandatory for images that contain software that requires commercial licenses. Optional: license_required (boolean) indicates whether or not a customer must bring its own license to be license compliant. This can not be true at the same time as the previous setting. This field is mandatory IF customers need to bring their own license to use the image. Optional: subscription_included (boolean) indicates that the image contains already a maintenance subscription which typically gives access to bug fixes, security fixes and (minor) function updates. If a subscription is included, the CSP should have prepared the image to also receive the provided maintenance updates from the vendor (optionally via a mirror). Optional: subscription_required (boolean) indicates that the customer requires a maintenance subscription from the OS vendor in order to receive fixes (which is often also a prerequisite to be eligible for support). Optional: maintained_until: YYYY-MM-DD promises maintenance from the OS vendor until at least this date (in UTC). Optional: l1_support_contact contains a URI that provides customer support contact for issues with this image. Note that this field must only be set if the service provider does provide support for this image included in the image/flavor pricing (but it might be provided by a contracted 3rd party, e.g. the OS vendor).","s":"Licensing / Maintenance subscription / Support","u":"/standards/scs-0102-v1-image-metadata","h":"#licensing--maintenance-subscription--support","p":1799},{"i":1818,"t":"The script image-md-check.py retrieves the image list from a configured cloud and checks each image for the completeness and consistency of mandatory properties.","s":"Conformance Tests","u":"/standards/scs-0102-v1-image-metadata","h":"#conformance-tests","p":1799},{"i":1822,"t":"Entropy is a concept that is widely used in the scope of information technology. It is a measurement of the amount of disorder or randomness in a system. Entropy is used to measure the amount of information in a self-contained system, as well as the amount of incertitude that exists in this system.","s":"Entropy in information technology","u":"/standards/scs-0101-v1-entropy","h":"#entropy-in-information-technology","p":1819},{"i":1824,"t":"Cryptography is a very prominent, albeit not the only application that heavily relies on entropy for operations such as creating secure keys. When the available entropy runs out, said operations can stall and take an abnormally long amount of time, which in turn can lead to malfunctions, e.g., with OpenSSL or load balancers.","s":"Real-world uses of entropy","u":"/standards/scs-0101-v1-entropy","h":"#real-world-uses-of-entropy","p":1819},{"i":1826,"t":"In traditional baremetal systems the amount of incertitude is sourced from the randomness of the read/write cycles of the disk heads of a disk drive, bus timings, or keyboard timings, to name a few. More recent methods of generating entropy include measuring IRQ jitter (available in Linux since kernel 5.4 or, before that, via a daemon such as HavegeD) as well as dedicated CPU instructions (available in virtually all major CPUs: RDSEED or RDRAND on x86_64 and RNDR on arm64). Finally, a dedicated device can be utilized — if present — that is called hardware random number generator or HRNG for short. For instance, the Trusted Platform Module includes a HRNG. On Linux systems, the HRNG appears as /dev/hwrng. Note that, while the dedicated CPU instructions can be construed as a HRNG, they are not treated as such by the kernel, i.e., they do not appear as /dev/hwrng! The Linux kernel combines multiple sources of entropy into a pool. To this end, it will use all of the sources discussed so far with one exception: the HRNG must be fed into the pool (if so desired) via the daemon rngd. The kernel converts the entropy from the pool into cryptographically secure random numbers that appear under /dev/random and /dev/urandom. With kernel 5.18, the algorithm that accomplishes said conversion has been drastically improved (see linux-rng-5.17-18), so much so that running out of entropy is virtually ruled out. These patches have now also arrived in the upstream LTS images.","s":"Sources of entropy","u":"/standards/scs-0101-v1-entropy","h":"#sources-of-entropy","p":1819},{"i":1828,"t":"Virtual instances or virtual machines do not have the traditional sources of entropy mentioned above. However, the more recent methods mentioned above do work just fine (the CPU instructions are not privileged). Alternatively, a virtualized HRNG called virtio-rng can be established that injects entropy from the host into the instance, where this entropy can be sourced optionally from either the host's /dev/random or some HRNG in the host. This virtualized HRNG behaves just like a real one, that is, it appears as /dev/hwrng, and the daemon rngd must be used to feed it into the kernel's entropy pool. On a side note, the kernel exposes available HRNGs via the special directory /sys/devices/virtual/misc/hw_random. In particular, the file rng_available lists availabe HRNGs while the file rng_current contains the HRNG currently used. In summary, with current kernels and CPUs entropy in virtual instances is readily available to a sufficient degree. In addition, the host's entropy sources can be injected using virtio-rng if so desired, e.g., to enable access to a HRNG.","s":"Entropy in virtual instances","u":"/standards/scs-0101-v1-entropy","h":"#entropy-in-virtual-instances","p":1819},{"i":1830,"t":"As stated above, good sources of entropy are paramount for many important applications. This standard ensures that sufficient entropy will be available in virtual instances.","s":"Motivation","u":"/standards/scs-0101-v1-entropy","h":"#motivation","p":1819},{"i":1833,"t":"It is recommended that all flavors have the following attribute: hw_rng:allowed=True The following attributes are optional: hw_rng:rate_bytes - The allowed amount of bytes for the the guest to read from the host's entropy per period. hw_rng:rate_period - Sets the duration of a read period in seconds.","s":"Flavors","u":"/standards/scs-0101-v1-entropy","h":"#flavors","p":1819},{"i":1835,"t":"It is recommended to use images having a kernel (patch level) version 5.18 or up. This condition is already satisfied by every mandatory image defined in the Image Metadata Standard. It is recommended that images activate the attribute hw_rng_model: virtio. The daemon rngd must be installed (usually from rng-tools or rng-utils). The user may choose to use the virtio-rng device via rngd.","s":"Images","u":"/standards/scs-0101-v1-entropy","h":"#images","p":1819},{"i":1837,"t":"Compute nodes must use CPUs that offer instructions for accessing entropy (such as RDSEED or RDRAND on x86_64 or RNDR on arm64), and these instructions may not be filtered by the hypervisor. If this requirement cannot be verified directly, then at least the following two conditions must be satisfied in a virtual instance: The special file /proc/sys/kernel/random/entropy_avail must contain the value 256 (pinned since kernel 5.18). The number of FIPS 140-2 failures must not exceed 3 out of 1000 blocks tested, as determined by cat /dev/random | rngtest -c 1000 . Compute nodes may provide a HRNG via rngd.","s":"Compute nodes","u":"/standards/scs-0101-v1-entropy","h":"#compute-nodes","p":1819},{"i":1841,"t":"In OpenStack environments there is a need to define different flavors for instances. The flavors are pre-defined by the operator, the customer can not change these. OpenStack providers thus typically offer a large selection of flavors. While flavors can be discovered (openstack flavor list), it is helpful for users (DevOps teams), to have a guaranteed set of flavors available on all SCS clouds, so these need not be discovered.","s":"Motivation","u":"/standards/scs-0103-v1-standard-flavors","h":"#motivation","p":1838},{"i":1843,"t":"The following extra specs are recognized, together with the respective semantics: scs:name-vN=NAME (where N is 1 or 2, and NAME is some string) means that the flavor is one of the standard SCS flavors, and the requirements of Section \"Standard SCS flavors\" below apply. scs:cpu-type=shared-core means that at least 20% of a core in >99% of the time, measured over the course of one month (1% is 7,2 h/month). The cpu-type=shared-core corresponds to the V cpu modifier in the flavor-naming spec, other options are crowded-core (L), dedicated-thread (T) and dedicated-core (C). scs:diskN-type=ssd (where N is a nonnegative integer, usually 0) means that the root disk N must support 1000 sequential IOPS per VM and it must be equipped with power-loss protection; see scs-0110-v1-ssd-flavors. The diskN-type=ssd setting corresponds to the s disk modifier, other options are nvme (p), hdd (h) and network (n). Only flavors without disk and those with diskN-type=network can be expected to support live-migration. Whenever ANY of these are present on ANY flavor, the corresponding semantics must be satisfied.","s":"Properties (extra specs)","u":"/standards/scs-0103-v1-standard-flavors","h":"#properties-extra-specs","p":1838},{"i":1845,"t":"These are flavors that must exist on standard SCS clouds (x86-64).","s":"Standard SCS flavors","u":"/standards/scs-0103-v1-standard-flavors","h":"#standard-scs-flavors","p":1838},{"i":1847,"t":"Recommended name vCPUs vCPU type RAM [GiB] Root disk [GB] Disk type SCS-1V-4 1 shared-core 4 SCS-2V-8 2 shared-core 8 SCS-4V-16 4 shared-core 16 SCS-4V-16-100s 4 shared-core 16 100 ssd SCS-8V-32 8 shared-core 32 SCS-1V-2 1 shared-core 2 SCS-2V-4 2 shared-core 4 SCS-2V-4-20s 2 shared-core 4 20 ssd SCS-4V-8 4 shared-core 8 SCS-8V-16 8 shared-core 16 SCS-16V-32 16 shared-core 32 SCS-1V-8 1 shared-core 8 SCS-2V-16 2 shared-core 16 SCS-4V-32 4 shared-core 32 SCS-1L-1 1 crowded-core 1","s":"Mandatory","u":"/standards/scs-0103-v1-standard-flavors","h":"#mandatory","p":1838},{"i":1849,"t":"Recommended name vCPUs vCPU type RAM [GiB] Root disk [GB] Disk type SCS-1V-4-10 1 shared-core 4 10 (any) SCS-2V-8-20 2 shared-core 8 20 (any) SCS-4V-16-50 4 shared-core 16 50 (any) SCS-8V-32-100 8 shared-core 32 100 (any) SCS-1V-2-5 1 shared-core 2 5 (any) SCS-2V-4-10 2 shared-core 4 10 (any) SCS-4V-8-20 4 shared-core 8 20 (any) SCS-8V-16-50 8 shared-core 16 50 (any) SCS-16V-32-100 16 shared-core 32 100 (any) SCS-1V-8-20 1 shared-core 8 20 (any) SCS-2V-16-50 2 shared-core 16 50 (any) SCS-4V-32-100 4 shared-core 32 100 (any) SCS-1L-1-5 1 crowded-core 1 5 (any)","s":"Recommended","u":"/standards/scs-0103-v1-standard-flavors","h":"#recommended","p":1838},{"i":1851,"t":"The figures given in the table (number of CPUs, amount of RAM, root disk size) must match precisely the corresponding figures in the flavor. In addition, the following properties must be set (in the extra_specs): scs:name-v1 to the recommended name, but with each dash AFTER the first one replaced by a colon, scs:name-v2 to the recommended name, scs:cpu-type to shared-core or crowded-core, reflecting the vCPU type, scs:disk0-type not set if no disk is provided, otherwise set to ssd or some other value, reflecting the disk type.","s":"Guarantees and properties","u":"/standards/scs-0103-v1-standard-flavors","h":"#guarantees-and-properties","p":1838},{"i":1853,"t":"We expect the most used vCPU:RAM[GiB] ratio to be 1:4. Note that all vCPUs of SCS standard flavors are oversubscribed — the smallest 1L-1 flavor allows for heavy oversubscription (note the L), and thus can be offered very cheaply — imagine jump hosts ... The design allows for small clouds (with CPUs with 16 Threads, 64GiB RAM compute hosts) to offer all flavors. Except for the two flavors with SSD root volume, disks types are not specified (and expected to be network disks (Ceph/Cinder) or local SATA/SAS disks typically). We only included a limited variation of disk sizes — this reflects that for the standard networked cinder disks, you can pass block_device_mapping_v2 on server (VM) creation to allocate a boot disk of any size you desire. We have scaled the few recommended disk sizes with the amount of RAM. For each flavor there is also one without a pre-attached disk — these are meant to be used to boot from a volume (either created beforehand or allocated on-the-fly with block_device_mapping_v2, e.g. openstack server create --flavor SCS-1V-2 --block-device-mapping sda=IMGUUID:image:12:true to create a bootable 12G cinder volume from image IMGUUID that gets tied to the VM instance life cycle.)","s":"Remarks","u":"/standards/scs-0103-v1-standard-flavors","h":"#remarks","p":1838},{"i":1855,"t":"The script flavors-openstack.py will read the lists of mandatory and recommended flavors from a yaml file provided as command-line argument, connect to an OpenStack installation, and check whether the flavors are present and their extra specs are correct. Missing flavors will be reported on various logging channels: error for mandatory, info for recommended flavors. Incorrect extra specs will be reported as error in any case. The return code will be non-zero if the test could not be performed or if any error was reported.","s":"Conformance Tests","u":"/standards/scs-0103-v1-standard-flavors","h":"#conformance-tests","p":1838},{"i":1857,"t":"The openstack-flavor-manager is able to create all standard, mandatory SCS flavors for you. It takes input that can be generated by flavor-manager-input.py.","s":"Operational tooling","u":"/standards/scs-0103-v1-standard-flavors","h":"#operational-tooling","p":1838},{"i":1859,"t":"The list of standard flavors used to be part of the flavor naming standard up until version 3. The following changes have been made to the list in comparison with said standard: the flavor names have been turned into recommendations, and the properties have been introduced in order to help discoverability. Note that the flavors with fixed size root disks have all moved to Recommended with scs-0100-v3. This means that they are not a certification requirement any longer, but we still recommend implementing these for backwards compatibility reasons. Also in that standard, two flavors with SSD+ root disks have been added, as defined in scs-0110-v1-ssd-flavors.md","s":"Previous standard versions","u":"/standards/scs-0103-v1-standard-flavors","h":"#previous-standard-versions","p":1838},{"i":1862,"t":"The Sovereign Cloud Stack (SCS) provides standards for a range of cloud infrastructure types. It strives for interoperable and sovereign cloud offerings which can be deployed and used by a wide range of organizations and individuals. To this end, SCS unifies the naming and sourcing of virtual machine images, and for certain images their presence is mandated or recommended.","s":"Introduction","u":"/standards/scs-0104-v1-standard-images","h":"#introduction","p":1860},{"i":1864,"t":"Following the example of the SCS standards YAML, this standard establishes, by means of a YAML file, a mechanism with the following main objectives: to maintain a list of mandatory, recommended, and optional images, which also fixes the source location, to provide a machine-readable document for further processing (e.g. for a compliance tool suite or continuous integration).","s":"Motivation","u":"/standards/scs-0104-v1-standard-images","h":"#motivation","p":1860},{"i":1866,"t":"Image upload via Glance MUST be allowed. If quotas are imposed at all, the following rule applies: It MUST be possible to upload at least 40 images and at least 200 GiB total.","s":"Uploading custom images","u":"/standards/scs-0104-v1-standard-images","h":"#uploading-custom-images","p":1860},{"i":1868,"t":"The YAML file MUST contain the key images, whose value is a list of objects. Each object has one of two forms, as described below.","s":"Standard images YAML","u":"/standards/scs-0104-v1-standard-images","h":"#standard-images-yaml","p":1860},{"i":1870,"t":"Key Type Description Example name String Name of the image \"Debian 12\" status String optional: either mandatory or recommended \"recommended\" source String Prefix of the source URL \"https://cloud.debian.org/images/cloud/bookworm/\" OR: List of strings multiple possible prefixes (see full example below) The meaning of this specification is as follows. If the status is mandatory, then the image MUST be present. If an image by the name given is present, then its image_source property (as described in the Image Metadata standard) MUST start with one of the prefixes given via source.","s":"Image specification, single image","u":"/standards/scs-0104-v1-standard-images","h":"#image-specification-single-image","p":1860},{"i":1872,"t":"Key Type Description Example name String Name of the class of images \"ubuntu-2204-kube\" name_scheme String (regex) Regular expression for the image name \"ubuntu-2204-kube-v[0-9].[0-9]+(.[0-9]+)?\" status String optional: either mandatory or recommended \"recommended\" source String Prefix of the source URL \"https://swift.services.a.regiocloud.tech\" OR: List of strings multiple possible prefixes (see full example below) The meaning of this specification is as follows: If the status is mandatory, then at least one image MUST be present whose name matches the regular expression given via name_scheme. For any image whose name matches the regular expression given via name_scheme, its image_source property MUST start with one of the prefixes given via source.","s":"Image specification, class of images","u":"/standards/scs-0104-v1-standard-images","h":"#image-specification-class-of-images","p":1860},{"i":1874,"t":"images: - name: \"Ubuntu 22.04\" source: - https://cloud-images.ubuntu.com/releases/jammy/ - https://cloud-images.ubuntu.com/jammy/ status: mandatory - name: \"ubuntu-capi-image\" name_scheme: \"ubuntu-capi-image-v[0-9].[0-9]+(.[0-9]+)?\" source: https://swift.services.a.regiocloud.tech/swift/v1/AUTH_b182637428444b9aa302bb8d5a5a418c/openstack-k8s-capi-images/ubuntu-2204-kube status: recommended - name: \"Ubuntu 20.04\" source: - https://cloud-images.ubuntu.com/releases/focal/ - https://cloud-images.ubuntu.com/focal/ - name: \"Debian 12\" source: - https://cloud.debian.org/images/cloud/bookworm/ - https://cdimage.debian.org/cdimage/cloud/bookworm/ - name: \"Debian 11\" source: - https://cloud.debian.org/images/cloud/bullseye/ - https://cdimage.debian.org/cdimage/cloud/bullseye/ This example provides allowable source prefixes for two Debian versions, two Ubuntu versions, and for any version of the Kubernetes cloud API provider. Only the latter is recommended, while only Ubuntu 22.04 is mandatory.","s":"Full example","u":"/standards/scs-0104-v1-standard-images","h":"#full-example","p":1860},{"i":1877,"t":"The YAML file is generally located in this repository under /Tests/iaas. Any change that could render existing installations non-conformant (i.e., when new specifications are added, when the name scheme of a specification is changed so as to match more names than before, when the status of an existing specification changes to mandatory, or when some source prefix is removed) requires a new YAML file to be created. As a consequence, any currently valid certificates stay valid; the change can only take effect in a new version of the certificate in question, if so desired.","s":"YAML lifecycle","u":"/standards/scs-0104-v1-standard-images","h":"#yaml-lifecycle","p":1860},{"i":1879,"t":"It is important to note that this standard does not prohibit any images, and neither does it preclude the operator from providing any and all optional images. It is possible that a specification is mandatory in one version and non-mandatory in the next version. This standard makes no statement as to what is supposed to happen to the corresponding images in a live cloud environment. It is recommended to keep the once-mandatory images in the live environment. As for new environments, it is up to the operator whether to provide any or all of these images, as stated above.","s":"Image lifecycle","u":"/standards/scs-0104-v1-standard-images","h":"#image-lifecycle","p":1860},{"i":1881,"t":"The script images-openstack.py will read the lists of mandatory and recommended images from a yaml file provided as command-line argument, connect to an OpenStack installation, and check whether the images are present. Missing images will be reported on various logging channels: error for mandatory, info for recommended images. Additionally, images whose image_source does not conform with the specifications will be reported on the error channel. The return code will be non-zero if the test could not be performed or if any errors have been reported.","s":"Conformance Tests","u":"/standards/scs-0104-v1-standard-images","h":"#conformance-tests","p":1860},{"i":1883,"t":"The openstack-image-manager is able to create all standard, mandatory SCS images for you given image definitions from a YAML file.","s":"Operational tooling","u":"/standards/scs-0104-v1-standard-images","h":"#operational-tooling","p":1860},{"i":1886,"t":"SCS defines an IaaS Flavor Naming standard that mandates a number of standard flavors to be available in each SCS-compliant IaaS offering. While offering or exposing IaaS is not a requirement for SCS-compliant infrastructure offerings — SCS allows for platforms only exposing the container layer (plus S3 compatible object storage) for wave 2 (container-based) cloud-native workloads -- the SCS reference implementation does include a complete IaaS implementation that many providers want to expose as they have customers desiring access at this layer for wave 1 (VM-based) cloud-native workloads or for the virtualization of more classical (not cloud-native) workloads. The IaaS implementation thus comes with standards. This Decision Record is about adding a few mandatory flavors on the IaaS level that include flavors with local SSD (or better) storage.","s":"Introduction","u":"/standards/scs-0110-v1-ssd-flavors","h":"#introduction","p":1884},{"i":1888,"t":"The currently defined standard flavors do not include flavors that use local storage. For certain workloads such as databases or big data filesystems, local storage is highly desirable as replication may be handled at the application layer, making replication/redundancy in a networked storage solution (ceph in the SCS reference implementation) an unneeded and undesired property. Furthermore, write access to networked and replicated storage typically incurs a certain latency, as the writes can only be acknowledged once all the replicas have confirmed that the data has hit stable storage. Write latency is critical for e.g. relational database performance. The main purpose for the IaaS layer in SCS is to perform as a solid foundation to provide and manage kubernetes container clusters in a multi-tenant scenario. As such the standards at the IaaS layer should ensure that all the needed types of resources are available for the container clusters. This is not currently the case: In a scenario with multiple k8s control-plane nodes set up via kubeadm (as part of the k8s cluster-api automation), the control plane nodes each run an etcd instance and together form an etcd cluster. etcd is sensitive to scheduling, network and storage latencies. While network latencies and scheduling latencies have not been observed to be an issue in clusters within one cloud region, the storage latency is. With remote networked storage as delivered from ceph, the long tail of write latency causes etcd to often time out heartbeats, causing a new leader election with a leader change, preventing control plane changes on k8s for a few seconds. Too many leader changes can slow down cluster operation and even bring it to a halt. The etcd requirements are well documented. In particular, over a hundred of sequential IOPS are recommended. This requires write latencies in the range of a single-digit ms (or better).","s":"Motivation","u":"/standards/scs-0110-v1-ssd-flavors","h":"#motivation","p":1884},{"i":1891,"t":"One-node etcd (backed by redundant storage)​ If k8s uses only one control plane node, there will only be only one etcd node, avoiding timed out heartbeats. Single node control planes are typically not recommended for production workloads though. They are limited with respect to control plane performance, have a higher chance to fail (as a single node failure can create cluster control-plane downtime) and can not undergo rolling upgrades. Though not the normal setup with kubeadm, it is possible to use a multi-node control plane using a single-node etcd. This shares some of the challenges of single-node control-planes, although recovery may be faster to perform at least in scenarios where the etcd backend storage is redundant and not affected by the single-node outage. Neither scenario fulfills typical requirements for production workloads. RAM (tmpfs) etcd storage​ etcd could keep its database in volatile memory (e.g. on a tmpfs filesystem). For multi-node etcd clusters, this could actually be made work, as long as at least one cluster member stays alive and proper care is taken to remove shut-down nodes from the cluster. A loss of power affecting all nodes or a hardware maintenance operation not tracking etcd needs would result in a complete loss of all cluster state. The control plane nodes would require live migration to avoid this in the maintenance case. For the power loss scenario, a frequent backup might mitigate the cluster state loss case somewhat. The etcd database is normally limited to 2GiB in size, which is something that is realistic to keep in main memory. (Typical database sizes are much smaller.) This option requires additional care and may not be suitable for all production scenarios, but would seem a possible fallback position for etcd. It does obviously not address the database scenario. Heartbeat slowdown​ To avoid causing too many fail-overs by occasional high latencies, the frequency of heartbeats can be lowered from the default 1/100ms. The reelection timeout should change along with it (typically set to 10 beats). This will cause etcd to take a bit more time to notice the loss of a node, which is not typically critical if done within reasonable limits. This change however does not fully address the issue — occasional write latencies above 100ms will still cause failed heartbeats, just less often. This change has been implemented in SCS's k8s-cluster-api-provider reference implementation: The heartbeat has been changed from 1/100ms (10/s) to 1/250ms (4/s) and the reelection timeout from 1s to 2.5s. The etcd process also is afforded a higher CPU priority (lower niceness), resulting in a lower scheduling latency, as high-prio processes preempt lower-prio ones when they get woken up. The etcd process also gets its IO priority increased to get treated preferentially in case the IO scheduler has many outstanding requests. This has some positive effects with the CFQ IO scheduler. The slower heartbeat and the priority tweaks do lower the amount of leader changes but are insufficient to completely address the issue on the tests performed against networked ceph-backed storage. Filesystem tuning​ Databases must ensure that certain data has hit stable storage before acknowledging writes — this is required in order to live up to the ACID guarantees in situations when disruptions might happen. Databases typically use fsync() calls to ensure that write buffers are written to real persistent storage unless they use raw/direct block devices circumventing Linux's page and buffer cache. etcd normally uses a write-ahead-log (WOL) file that lives on a Linux filesystem and uses fsync to ensure the correct write ordering. Trouble with fsync is that it also causes unrelated data to be written out with most existing Linux filesystems, adding to the latency. It is possible to tell the Linux filesystems to not wait for all data to have hit storage before returning from fsync() calls. This avoids the latency caused by fsync but also subverts the very reason for using fsync: In case of a disruption (OS crash, power outage, loss of connection to storage, ...), the state is likely not consistent, as the kernel has lied to the application about data having been written out. Recovery from such a scenario can range from smooth to impossible. In a multi-node cluster, this may not be as bad as it sounds — if only one node is affected by a disruption, the crashed node can be recovered by resyncing the data from other nodes. In practice an inconsistent state would be considered too risky and it should be preferred to set up a fresh node to join the existing etcd cluster. This would need to be implemented to make this option less risky. The reference implementation has an option to use these unsafe filesystem settings. However, they are not enabled by default for good reasons. Flavors with local storage​ Flavors with local storage will have their root filesystem on a local storage device. To fulfill the need for high IOPS that etcd and especially databases have, the local storage device should be a solid state device — an SSD or NVMe device. While some use cases might even be fulfilled with local spinning disks (or raid arrays of local spinning disks). Local solid state storage avoids any network overhead and offers best latency. It however is not typically redundant, meaning that the loss of the device or the complete hardware node will result in data loss. So it is meant to be used with applications such as database clusters, replicating filesystems or block devices or etcd which can handle this at the application layer. The flavor naming spec in SCS allows performance to be understated — a flavor with NVMe storage can be advertised under the SSD storage name (and of course can be offered under both names). Note that this addresses the simple case where the root disk with the root filesystem (and possibly additional filesystems that are set up when first booting) uses the local storage. Scenarios where additional low-latency networked or local storage are made available via cinder and attached for database storage are possible and viable options for some scenarios, but not covered here.","s":"Options considered","u":"/standards/scs-0110-v1-ssd-flavors","h":"#options-considered","p":1884},{"i":1893,"t":"Two new mandatory flavors: SCS-2V-4-20s and SCS-4V-16-100s are added to the SCS flavor naming standard. The first is meant to be a good fit for k8s control nodes with etcd while the latter is a solid base for a small database server. Clouds claiming SCS-compliance for their IaaS layer MUST provide these two additional flavors. Obviously providers MAY offer many more combinations and e.g. create flavors with large local SSDs. The local storage advertised this way MUST support more than 1000 sequential IOPS per VM of both new mandatory types (which means a write latency lower than 1ms — this typically means SSDs/NVMEs that support at least several 10ks of parallel IOPS, not a challenge for current hardware). Local disks, SSDs, NVMes MUST have Power-Loss-Protection such that data reported to be written, but in reality being stored in RAM or SLC cache of an SSD or NVMe, is guaranteed to not be lost in case of a power loss. Like with networked storage, the provider must ensure that data from previous users is not accessible (e.g. by securely erasing it or by using a different encryption key) when local storage gets allocated to a new VM.","s":"Decision","u":"/standards/scs-0110-v1-ssd-flavors","h":"#decision","p":1884},{"i":1895,"t":"Hardware nodes (hypervisors in OpenStack language) that support flavors with local storage (are part of an appropriate OpenStack host aggregate) may have many VMs competing for bandwidth to the attached local storage devices; the host needs to be configured such that it can sustain VMs writing at full speed without causing the host to be overloaded or to cause huge queues for these writes. A more generic approach is to apply storage QoS policies to the VMs to manage bandwidth and IOPS and create the ability to have better performance isolation with certain guarantees. While this is desirable, it has not been found a necessity for etcd in our tests. Disk IO QoS is not part of this spec but may be considered in another one. Live-migration with local storage is significantly more difficult than with networked storage: The contents of the local disks also need to be replicated over to the new host. Live-migration for these VMs may thus take significantly longer or not be possible at all, depending the configuration from the provider. Not supporting live-migration is OK for flavors with local disks according to the flavor naming spec — a capability to indicate whether or not live-migration is supported will be subject to a flavor-metadata discoverability spec that is planned for the future.","s":"Out of Scope","u":"/standards/scs-0110-v1-ssd-flavors","h":"#out-of-scope","p":1884},{"i":1897,"t":"Local storage in OpenStack can be provided directly via nova or via the cinder service. While the latter has the advantage of making volumes visible and manageable via most of the normal cinder capabilities, it has the disadvantage of creating an indirection via iSCSI. This results in higher latency. The requirements in the above spec are not meant to mandate or prevent the implementation via either route.","s":"Implementation note","u":"/standards/scs-0110-v1-ssd-flavors","h":"#implementation-note","p":1884},{"i":1899,"t":"The flavors will be added as mandatory flavors to the flavor-naming standard, which will thus have to be released in a v3. The IOPS and Power-Loss requirements from this decision should become part of the flavor-naming standard for disk type s. When we standardize storage types in the future, additional possibilities to solve the latency requirements for databases and etcd may emerge. When we standardize QoS features there, we may amend this standard with QoS recommendations or possibly requirements. A future flavor metadata discoverability standard will indicate whether or not these flavors can be live-migrated. A future VM metadata standard will allow users to request live-migration and/or cold migration or restart to be or to not be performed.","s":"Related Documents","u":"/standards/scs-0110-v1-ssd-flavors","h":"#related-documents","p":1884},{"i":1901,"t":"The list of mandatory flavors that needs to be present should be added to the SCS-Spec.MandatoryFlavors.yaml spec as soon as this ADR becomes part of the certification requirements. Checks for conforming with IOPS and purging requirements will require test instances to be launched and might become part of a monitoring solution.","s":"Conformance Tests","u":"/standards/scs-0110-v1-ssd-flavors","h":"#conformance-tests","p":1884},{"i":1904,"t":"Here we will describe how fast providers need to keep up with the upstream Kubernetes version. To create a informed decision we summarize here the Kubernetes rules regarding versioning at the time of writing (2023-01-16): Kubernetes usually provides about 3 minor releases per year. Kubernetes Release Cycle Patch release cadence is typically monthly. However, the first patches after the first minor release usually arrive 1-2 weeks after the first minor release. Patch Release Cadence In general the latest 3 minor versions are maintained by the Kubernetes project. Every release will be maintained for about 14 months. The first 12 months are the standard support period. The remaining 2 months are only for: CVEs (under the advisement of the Security Response Committee) dependency issues (including base image updates) critical core component issues Kubernetes Support Period","s":"Introduction","u":"/standards/scs-0210-v1-k8s-new-version-policy","h":"#introduction","p":1902},{"i":1906,"t":"Kubernetes is a fast paced project. We want to achieve that providers keep up to date with upstream and do not fall behind Kubernetes releases. This ensures that users are able to upgrade their clusters to address security issues, bug fixes and new features when using SCS compliant clusters in regards of Kubernetes. However, providers should have reasonable time to implement the new Kubernetes versions and test them.","s":"Motivation","u":"/standards/scs-0210-v1-k8s-new-version-policy","h":"#motivation","p":1902},{"i":1908,"t":"Must provide latest minor version no later than 4 months after release Must provide latest patch version no later than a week after release Should be faster for critical CVEs (CVSS >= 8) Should be tested","s":"Decision","u":"/standards/scs-0210-v1-k8s-new-version-policy","h":"#decision","p":1902},{"i":1910,"t":"All important documents regarding versioning, releases, etc. for the official Kubernetes project can be found here: Kubernetes Releases","s":"Related Documents","u":"/standards/scs-0210-v1-k8s-new-version-policy","h":"#related-documents","p":1902},{"i":1912,"t":"The conformance test is written in the 'k8s-version-recency-check.py' script. The script requires the path to a valid kubeconfig file, which should describe the k8s cluster under test. This can either be done by creating a config from the also provided 'config.yaml.template' or by calling the test script with its cli arguments.","s":"Conformance Tests","u":"/standards/scs-0210-v1-k8s-new-version-policy","h":"#conformance-tests","p":1902},{"i":1915,"t":"The Kubernetes project maintains multiple release versions including their patched versions. In the project, the three most recent minor releases are actively maintained, with a fourth version being in development. As soon as a new minor version is officially released, the oldest version is dropped out of the support period. Kubernetes supports its releases for around 14 months. 12 of these are the standard support period. The remaining 2 months are the end-of-life support period for things like: CVEs (under the advisement of the Security Response Committee) dependency issues (including base image updates) critical core component issues More information can be found under [Kubernetes Support Period]. The Kubernetes release cycle is set around 4 months, which usually results in about 3 minor releases per year Kubernetes Release Cycle. Patches to these releases are provided monthly, with the exception of the first patch, which is usually provided 1-2 weeks after the initial release Patch Release Cadence.","s":"Introduction","u":"/standards/scs-0210-v2-k8s-version-policy","h":"#introduction","p":1913},{"i":1917,"t":"Kubernetes is a living, fast-paced project, which follows a pre-defined release cycle. This enables forward planning with regards to releases and patches, but also implies a necessity to upgrade to newer versions quickly, since these often include new features, important security updates or especially if a previous version falls out of the support period window. We want to achieve an up-to-date policy, meaning that providers should be mostly in sync with the upstream and don't fall behind the official Kubernetes releases. This is achievable, since new versions are released periodical on a well communicated schedule, enabling providers and users to set up processes around it. Being up to date ensures that security issues and bugs are addressed and new features are made available when using SCS compliant clusters. It is nevertheless important to at least support all Kubernetes versions that are still inside the support period, since users could depend on specific versions or may need longer to upgrade their workloads to a newer version. The standard therefore should provide a version recency policy as well as a support window period.","s":"Motivation","u":"/standards/scs-0210-v2-k8s-version-policy","h":"#motivation","p":1913},{"i":1919,"t":"In order to keep up-to date with the latest Kubernetes features, bug fixes and security improvements, the provided Kubernetes versions should be kept up to date with the upstream. The latest minor version MUST be provided no later than 4 months after release. The latest patch version MUST be provided no later than 1 week after release. This time period MUST be even shorter for patches that target critical CVEs (CVSS >= 8). It is RECOMMENDED to provide a new patch version in a 2 day time period after their release. New versions MUST be tested before being rolled out on productive infrastructure; at least the CNCF E2E tests should be passed beforehand. At the same time, providers must support Kubernetes versions at least as long as the official sources as mentioned in the Kubernetes Support Period. Kubernetes versions MUST be supported as long as the official sources support them. The current support period can therefore be found in [Kubernetes Support Period]. It is RECOMMENDED to not support versions after this period in order to not encourage usage of out-of-date versions.","s":"Decision","u":"/standards/scs-0210-v2-k8s-version-policy","h":"#decision","p":1913},{"i":1921,"t":"All documents regarding versioning, releases, etc. for the official Kubernetes projects can be found here: Kubernetes Releases Kubernetes Support Period Kubernetes Release Cycle Patch Release Cadence","s":"Related Documents","u":"/standards/scs-0210-v2-k8s-version-policy","h":"#related-documents","p":1913},{"i":1923,"t":"This section will be updated when the conformance tests are written.","s":"Validation / Conformance","u":"/standards/scs-0210-v2-k8s-version-policy","h":"#validation--conformance","p":1913},{"i":1926,"t":"Volumes in OpenStack are virtual drives. They are managed by the storage service Cinder, which abstracts creation and usage of many different storage backends. While it is possible to use a backend like lvm which can reside on the same host as the hypervisor, the SCS wants to make a more clear differentiation between volumes and the ephemeral storage of a virtual machine. For all SCS deployments we want to assume that volumes are always residing in a storage backend that is NOT on the same host as a hypervisor - in short terms: Volumes are network storage. Ephemeral storage on the other hand is the only storage residing on a compute host. It is created by creating a VM directly from an Image and is automatically los as soon as the VM cease to exist. Volumes on the other hand have to be created from Images and only after that can be used for VMs. They are persistent and will remain in the last state a VM has written on them before they cease to exit. Being persistent and not relying on the host where the VM resides, Volumes can easily be attached to another VM in case of a node outage and VMs be migrated way more easily, because only metadata and data in RAM has to be shifted to another host, accelerating any migration or evacuation of a VM. Volume Types are used to classify volumes and provide a basic decision for what kind of volume should be created. These volume types can sometimes very be backend-specific and it might be hard for a user to choose the most suitable volume type, if there is more than one default type. Nevertheless the most of configuration is done in the backends themself, so volume types only work as a rough classification.","s":"Introduction","u":"/standards/scs-0111-v1-volume-type-decisions","h":"#introduction","p":1924},{"i":1928,"t":"We want to standardize a few varieties of volume types. While a user can choose simple things like size when creating a volume, Volume Types define a few broader aspects of volume. Encryption of volumes for example is solely decided by the volume type. And whether the volume will be replicated is a mix between definiton in the volume type and backend specific configuration, but it's visiblity can only be reached in the volume type. In General: what the different volume types are capable of is highly dependend on both the used backend and the configurations of OpenStack. A few options are worth being at least recommended.","s":"Motivation","u":"/standards/scs-0111-v1-volume-type-decisions","h":"#motivation","p":1924},{"i":1930,"t":"We want to have a discoverable Standard. So there should be no naming conventions as per request by operators. This first decision will have impacts on upstream OpenStack development, as those things, that would be nice to discover, may not be currently dicoverable by users or not at all. There are severel aspects of volume types, which will be discussed in the following:","s":"Design Considerations","u":"/standards/scs-0111-v1-volume-type-decisions","h":"#design-considerations","p":1924},{"i":1932,"t":"Encryption​ Encryption for volumes is an option which has to be configured within the volume type. As an admin it is possible to set encryption-provider, key size, cipher and control location. As an admin it is also currently possible to see these configurations in a volume type with list and show commands. A user should not see these parameters in detail, but a boolean value that descibes whether encryption is used or not. Currently this is not possible in upstream OpenStack. Conclusion: This is a solid aspect to be standardized. But it will need work on OpenStack, to have a boolean value presented to the users. Backend Name​ OpenStack Cinder works with a lot of different backends. They all have some kind of special features, which might be attractive for a user. But showing the name of the backend to users is also considered a security risk by Cinder developers. Overall it is always an option to make users aware of special features through the name and description of a volume type and sometimes even through extra_specs. Conclusion: This should not be standardized. Availability Zones​ Availability Zones are used in Nova and Cinder seperatly to provide an often also physical separation of compute hosts or storage nodes. This leads to two options to consider: Multiple Volume AZs: This might be used if there are different backends present in one IaaS structure. The different volume types are usually used for the different volume AZs. This makes migration between those AZs only be possible for administrators. Volume Types that can be attached to multiple Nova Azs: This option can be seen in the extra specs of a volume type also by normal users. Another option is to use backend specific options, as for example with ceph that directly interacts with nova for this. In that case there will not be any visible extra specs for the users. Another question is how many providers use one of these options or both. Conclusion: The first part doesn't make much sense to standardize, as migration between the volume types can only be done by admins. However the second part might be noteable, but due to the variety of configuration options very hard to standardize. Multiattach​ It is possible in a few backends to attach a volume to multiple VMs. This has to be configured in the Volume Type and this information is also accessable for users. Nevertheless this option also needs a lot of work from users, as those types of volumes have to have a file system, that is capable of multiattach. Many providers don't provide multiattach. Conclusion: It might be noteable, that this already is a discoverable option. Replication​ Replication states, whether or not there are multiple replicas of a volume. Thus answers the question, whether the data could survive a node outage. Again there are different ways to achive replicated volumes. It can either be defined in the volume type and is discoverable also by normal users or it is configured in the backend. The last option is usually used with ceph for example. This makes it hard to discover, whether a volume is replicated or not. Another point is the number of replicas, that exist. Conclusion: Replication is a good option to be standardized. Whether this should be done as a boolean option or if the number of replicas is also something users need to know should still be discussed. Nevertheless due to the different options to configure replication this will be quite complex. QoS​ Quality of Service parameters can be stated in a volume qos object. These objects can then be associated to a volume type (or directly to a volume as an admin only option). But this is optional and thus even good or very good volume QoS parameters that are aquired through hardware configuration and storage parameters, might go by unmentioned. Furthermore the indirection makes it harder to discover the qos for a volume type. Only admins will see the associated qos ID and will have to take a closer look at the qos after discovering the volume type. PLUS: there can only be one qos association for one volume type. But a qos can be used for multiple volumes. Conclusion: The benefit of displaying qos parameters is clear, thus this option should be noted. But are volume qos objects widely used? If not, standardization process would be too much work. Other Backend-specific Highlights​ While every option above described things, that can at least be partly or for admins only visible in volume types, there are many different configuration options in hardware and backend providers can make use of. It is sadly not possible to get them into the volume type directly, but we recommend, that notable configurations are written into the description of a volume type to achieve transparency for the users.","s":"Options considered","u":"/standards/scs-0111-v1-volume-type-decisions","h":"#options-considered","p":1924},{"i":1934,"t":"How often are the different options used by providers and users respectively? Especially important for qos and replication! Regarding Replication: Is the number of replicas needed by users and is it okay for providers to provide this information?","s":"Open questions","u":"/standards/scs-0111-v1-volume-type-decisions","h":"#open-questions","p":1924},{"i":1936,"t":"Aspect Standardize? Discoverability other Things encryption Recommended work needed extra_spec: encrypted=True/False Backend name - - - AZs - - describe as optional and backend-dependend multiattach - yes describe as optional Replication Recommended lot of work either get from backend to OS or as extra_spec defined by deployer Number of Replicas, etc ? lot of work optional, work on it after Replication is standardized Volume QoS ? admin only needs further discussion, should be at least described as optional","s":"Decision","u":"/standards/scs-0111-v1-volume-type-decisions","h":"#decision","p":1924},{"i":1938,"t":"This is an etherpad with a further look into the Options and a few examples.","s":"Related Documents","u":"/standards/scs-0111-v1-volume-type-decisions","h":"#related-documents","p":1924},{"i":1941,"t":"Cluster consumers can request persistent storage via PersistentVolumeClaims which is provisioned automatically by cloud-provided automation. Storage requirements may vary across use cases, so there is the concept of StorageClasses. StorageClasses define some set of storage properties. So, consumers can choose one of these depending on the use case. Kubernetes documentation","s":"Introduction","u":"/standards/scs-0211-v1-kaas-default-storage-class","h":"#introduction","p":1939},{"i":1943,"t":"While often times, consumers will choose a StorageClass explicitly, usually, there is also a default StorageClass to fall back on in case it is not chosen explicitly (that is, when storageClassName is not set on the PersistentVolumeClaim). This document attempts to define the properties this default StorageClass should have.","s":"Motivation","u":"/standards/scs-0211-v1-kaas-default-storage-class","h":"#motivation","p":1939},{"i":1945,"t":"The default StorageClass is made default using the storageclass.kubernetes.io/is-default-class annotation, following Kubernetes upstream. Hence, standardizing its name is not required for the intents of this standard.","s":"Decision","u":"/standards/scs-0211-v1-kaas-default-storage-class","h":"#decision","p":1939},{"i":1947,"t":"ReadWriteOnce must be a supported access mode volume must be protected against data loss due to hardware failures of a single disk or host volume must not be bound to the lifecycle of a Kubernetes Node Hence, ...volume must not be backed by local storage on the Kubernetes Node VM itself ...volume may be backed by some kind of redundant storage within an AZ, across hosts ...volume may be backed by some kind of redundant storage across AZ's","s":"Required non-performance-related properties","u":"/standards/scs-0211-v1-kaas-default-storage-class","h":"#required-non-performance-related-properties","p":1939},{"i":1949,"t":"NO fixed guarantees regarding latency/bandwidth/IOPS/... Generally, customers should be able to expect low-tier performance without pricing surprises.","s":"Required performance-related properties","u":"/standards/scs-0211-v1-kaas-default-storage-class","h":"#required-performance-related-properties","p":1939},{"i":1951,"t":"This document does not describe performance related properties. This will be done in another document which is yet to be created.","s":"Related Documents","u":"/standards/scs-0211-v1-kaas-default-storage-class","h":"#related-documents","p":1939},{"i":1953,"t":"TBD","s":"Conformance Tests","u":"/standards/scs-0211-v1-kaas-default-storage-class","h":"#conformance-tests","p":1939},{"i":1956,"t":"A container registry is an infrastructure service to enable storing and accessing container images. Images can be pushed to the registry by e.g. Continuous integration pipelines and be pulled from by runtime environments like Kubernetes clusters. Container registries could be publicly accessible e.g. Docker Hub, could be self-hosted or hosted by cloud service providers (CSP). These container registries may apply various access control mechanisms to restrict public access and make them private. Both solutions offer a wide range of features that may or may not attract potential users and CSPs.","s":"Introduction","u":"/standards/scs-0212-v1-requirements-for-container-registry","h":"#introduction","p":1954},{"i":1958,"t":"This proposal is motivated by use cases in which CSPs would like to offer private container registries to their customers. The specific use cases should be discussed, but overall CSP could offer a private container registry as a service or CSP could offer a recipe (maintained by SCS) for customers to deploy the private registry themselves utilizing CSP infrastructure. In both cases, the private container registry should fulfill a set of needed requirements e.g. for security and privacy. The idea and purpose of this document is to specify what requirements a specific technical container registry implementation (i.e. software solution) needs to fulfill in the context of SCS. Another purpose is the selection of an appropriate container registry implementation that meets all defined requirements to make architectural decision on what implementation will be used by the SCS.","s":"Motivation","u":"/standards/scs-0212-v1-requirements-for-container-registry","h":"#motivation","p":1954},{"i":1960,"t":"There are numerous features to look for when evaluating a container registry solution. Our decision process goes through two main stages: OSS health check Required and desirable features check The open-source software (OSS) health check is the first filter stage. This stage is crucial in the context of SCS and container registry implementation should pass it to promote itself to the second consideration stage. The second stage provides an overview over the feature set of open source container registry implementations and map out requirements (and nice-to-haves) against it to have a well-documented decision. Note: Keep in mind that at the time of writing this document, we've made our best effort to survey the container registry landscape based on publicly available materials. If you find something outdated (with respect to the time of writing this document) or outright erroneous, please submit a PR or raise an issue, and we'll fix it right away.","s":"Design considerations","u":"/standards/scs-0212-v1-requirements-for-container-registry","h":"#design-considerations","p":1954},{"i":1962,"t":"This section evaluates the health of the open-source projects that were selected from the currently available solutions. The container registry software must fulfill all OSS health checks defined by the OSS-Health document. The main health checks are: Four Opens (code is fully open source, community is open and diverse, development process is open, design process is open) Maturity Security Activity Lock-in risk assessment Each selected OSS project is evaluated based on the above checks, and it is classified into one of three categories as follows: ✔️ The project passed all OSS health checks and will be considered further as a valid candidate. ❔ The project passed almost all OSS health checks. There is place for improvement, but the missing points are not crucial from the OSS health check perspective. The project will be considered further as a valid candidate. ❌ The project does not pass the OSS health checks. Some OSS health check showstoppers have been found (e.g. open core software, not actively maintained). The project is filtered at this stage and won't be considered further. Refer to the list of evaluated projects with their classified categories and comments. ✔️ Harbor Harbor project meets all \"four opens\" Source code is open and available under the Apache 2 license Community is open, structured and well organized via workgroups and various communications channels e.g. Slack, mailing lists, etc. (#harbor Slack channel contains 3k+ members) The development process is open via GitHub issues and well described in the contributing document The design process is open via GitHub issues. Proposals are public. The decision process is well described as well. The project's roadmap is available in the roadmap document Maturity is on the CNCF graduation level. CNCF graduated projects are considered to be stable, widely adopted and production-ready Security The security disclosure and response policy is well described in the project's security document The code is reviewed within a standard PR process Activity 250+ contributors, 4k+ forks, 13k+ GitHub stars The project has been adopted by many companies that run Harbor in their production environments The project collaborates with other communities and projects (see Partners of Harbor section of the project's website) The project is visible and actively contributes to various conferences, e.g. FOSDEM 22, KubeCon Europe, etc. Lock-in risk assessment The project's maintainers document shows that there are a sufficient number of core maintainers/contributors that differ over various companies, we therefore deem the lock-in risk arising from a single point of failure to be low ✔️ Dragonfly Dragonfly project meets all \"four opens\" Source code is open and available under the Apache 2 license Community is open organized via multiple channels e.g. Slack, mailing lists, etc. (#dragonfly Slack channel contains ~50 members) The development process is open via GitHub issues and well described in the contributing document The design process is open via GitHub issues. The project's roadmap is available in the project's webpage Maturity is on the CNCF incubating level CNCF incubating project is considered stable and used in production by users with the healthy pool of contributors Security The security disclosure is handled via a dedicated email address The code is reviewed within a standard PR process Activity 30+ contributors, 100+ forks, 1k+ GitHub stars The project has been adopted by many companies that run Harbor in their production environments The project is visible and actively contributes to various conferences, e.g. KubeCon North America, KubeCon Europe, etc. Lock-in risk assessment The list of the project's maintainers includes contributors from various companies and the companies contributing dashboard shows that ~10 companies are actively contributing to a repository group ❔ Project Quay Project Quay meets all \"four opens\" Source code is open and available under the Apache 2 license Community is open organized via mailing list and IRC Development process is open via JBoss JIRA issues and well described in the governance document Design process is open via JBoss JIRA issues. The project's roadmap is available on the project's webpage Maturity Project Quay is an open-source project that starts ~9 years ago. It powers Red Hat enterprise products Red Hat Quay and Quay.io, which are used in a productive way by many. Therefore, the project's maturity is at the good level Security The security disclosure is handled via a dedicated email address The code is reviewed within a standard PR process Activity 50+ contributors, 200+ forks, 2k+ GitHub stars The project has been used by many companies that run Quay in their production environments Lock-in risk assessment The project's owners/maintainers list is not publicly available and is stored in the downstream repository. Therefore, it is hard to distinguish the risk of project failure caused by low diversity across the companies. This should be improved ❌ Keppel The project seems to be not widely used in a productive way and also the activity around is currently not on a good level (5+ contributors). The development process as well as the design process seem to be open, but not documented yet ❌ Nexus Nexus is an open core software that offers paid pro version with advanced features ❌ JFrog JFrog Artifactory is shipped as an open core software with limited features. The software is primarily offered as a paid pro version ❌ Kraken It seems that the project is not actively maintained as is discussed in the related project's issue ❌ Portus It seems that the project is not actively maintained as is discussed in the related project's issue","s":"OSS health check","u":"/standards/scs-0212-v1-requirements-for-container-registry","h":"#oss-health-check","p":1954},{"i":1964,"t":"This section provides an overview of the feature set of open source container registry implementations (which passed the OSS health stage above) and map out requirements (and nice-to-haves) against it. The container registry software must be robust enough, to be able to operate under heavy load (e.g. high availability (HA) mode, federation, etc.) and the crucial feature is security. We defined a set of required features that the container registry implementation must have and also a set of desirable (nice to have) features are defined and evaluated here. Required features​ Audit Logs Ability to record use in auditable logs so that activity can be traced to a single user Authentication of system identities Support for authenticating system identities like Kubernetes clusters. Ideally supporting dynamic identity tokens from some IdP; Less ideal: Supporting static \"system tokens\" Authentication of users Support for multiple authentication systems (IdM integration). User and user account management Authorization Role-based access control to ensure strict access controls Automation Integration with CI/CD tools e.g. via webhooks Vulnerability scanning Reveal security vulnerabilities in container images Content Trust and Validation Verify image authenticity before running - image signing Multi-tenancy Container registry is able to serve multiple tenants (projects, teams, namespaces). It can be implemented also on the storage level, see e.g. Keppel Backup and restore It is important for disaster recovery and data migration scenarios Monitoring Observability is a key feature for operating a service in production so the container registry should expose key metrics HA mode Ensure system uptime even in the event of a failure Registry replication Replication allows users to replicate container images between registries of the same instances and between registries of different instances as well Proxy cache (pull-through cache) Proxy cache allows you to use a container registry to proxy and cache images from a target public or private registry Quota management Control over resource use Garbage collection Removing blobs from the filesystem when they are no longer referenced by a manifest Retention policy Reduce the number of image tags, many of which might not be required after a given time or once a subsequent image tag has superseded them Desirable features​ Additionally supported artifacts Additional artifacts that the registry is able to store in addition to OCI artifacts, e.g. Java, Node.js, or Python packages Integration possibilities Ability to cooperate with another software solution in order to improve own feature set (e.g. integration of P2P solution for improving container image distribution (download speed and stability, high scalability ...)) Deployment capabilities How could be a container registry deployed (only \"official\" ways are mentioned) Administration capabilities \"as a code\" Ability to manage container registry via \"as a code\" solutions, e.g. Ansible role Refer to the table of evaluated projects with their features. Note that only container registry implementations that passed the OSS health stage (Harbor, Quay, and Dragonfly) are evaluated here. Features Harbor Quay Dragonfly Audit Logs ✓ ✓ ✗ Authentication of system identities ✓ Robot Accounts ✓ Robot Accounts ✗ Authentication of users ✓ Local database, LDAP, OIDC, UAA ✓ Local database, LDAP, Keystone, JWT ✓ Local database Authorization ✓ ✓ ✓ Automation ✓ Webhooks (HTTP, Slack) ✓ Webhooks (HTTP, Slack, E-mail ...), building images ✗ Vulnerability scanning ✓ Trivy, Clair ✓ Clair ✗ Content Trust and Validation ✓ Cosign ✓ Cosign ✗ Multi-tenancy ✓ (not on the storage level) ✓ (not on the storage level) ✓ (not on the storage level) Backup and restore ✓ ✓ ✗ Monitoring ✓ Prometheus metrics, Tracing ✓ Prometheus metrics, Tracing (only for Clair) ✓ Prometheus metrics, Tracing HA mode ✓ ✓ ✗ Registry replication ✓ ✓ ✓ Proxy cache ✓ ✓ Feature is in the technology preview stage (non production ready) ✗ Quota management ✓ Based on storage consumption ✓ Based on storage consumption ✗ Garbage collection ✓ Non-blocking ✓ Non-blocking ✗ Retention policy ✓ Multiple tag retention rules ✓ Only tag expiration rules ✗ Additional supported artifacts ✗ (only OCI artifacts) ✗ (only OCI artifacts) ✓ Maven, YUM Integration possibilities ✓ Dragonfly (P2P), Kraken (P2P) ✗ ✓ Harbor, Nydus, eStargz Deployment capabilities ✓ Docker-compose, Helm chart, Operator ✓ Docker-compose, Operator ✓ Docker-compose, Helm chart Administration capabilities ✓ Terraform, CRDs, Client libraries ✓ Ansible, Client libraries ✓ Client libraries Notes: Automation: Harbor should support webhooks following CloudEvents spec in the next release Content Trust and Validation: Harbor announced the deprecation of Notary integration, hence it is not mentioned in the table Multi-tenancy: Harbor, Quay, as well as Dragonfly, operates on a single storage backend (e.g. S3), i.e. the storage of container images is shared between tenants Additional supported artifacts: Harbor announced the deprecation of Chartmuseum integration, hence it is not mentioned in the table","s":"Required and desirable features check","u":"/standards/scs-0212-v1-requirements-for-container-registry","h":"#required-and-desirable-features-check","p":1954},{"i":1966,"t":"A wide range of open-source container registry projects (Quay, Harbor, Dragonfly, Keppel, Portus, Kraken, etc.) has been carefully evaluated based on the two main factors: the open-source health and range of supported features. The open-source software health is crucial and container registry implementation should pass it. The OSS health check evaluates several important metrics of an open source software like whether the code/community/development/design is fully open or whether the project's maturity, security, and activity are on the desired level. This check also evaluates the lock-in risk due to possible single points of failure or internal project conflicts and several other aspects. Overall, three projects passed the OSS health checks: Harbor Project Quay Dragonfly The above projects were then evaluated from the \"supported features\" perspective. The Required and desirable features check investigated the feature set of open-source container registry implementations and mapped SCS requirements (and nice-to-haves) against it. The list of required features is quite long and contains features that are primarily focused on security (authentication, vulnerability scanning, content trust, and validation, etc.), scalability (HA mode, registry replication, p2p integration, etc.) and visibility (monitoring), see the full list here. These requirements should ensure that the selected container registry implementation could be offered by CSPs as a secure and enterprise-ready solution. The following section compares projects Dragonfly, Quay, and Harbor. Dragonfly is a healthy open-source project with a growing community and CNCF incubating maturity level. It is considered stable, and widely used by many companies in their production environments. We currently see that it is not as feature-rich as Harbor or Quay, hence it is not considered the best choice here. It seems, that its main aim (currently) is to offer (an efficient, stable, and secure) container distribution solution based on p2p technology. This improves download efficiency and saves bandwidth across CSPs. It also offers integration possibilities that allow one to use it as a p2p distribution network via a \"preheat\" API. This integration was implemented in the Harbor project via Dragonfly \"preheat\" adapter, and both parties may benefit from the integration. Harbor profits from Dragonfly's p2p distribution capabilities and on the other hand the Dragonfly project profits from Harbor's feature-rich container registry \"frontend\". Quay is an open-source project maintained by Red Hat. Its OSS health is on a good level, the surrounding community is growing, and we consider it to be quite mature as it powers enterprise solutions like Red Hat Quay and Quay.io. Besides this, there is still a place for OSS health improvement. It is hard to distinguish the risk of project failure caused by low diversity across the companies because the project's owners/maintainers list is not publicly available and is stored in the Red Hat private repository. Its feature set is impressive and this project fulfills all must-haves defined in this document. Quay gives you security over your repositories with image vulnerability scanning (Clair integration), content validation (Cosign integration), and access controls. Harbor stands out here as it allows users to use also project Trivy for vulnerability scanning. Project Quay also provides a scalable open-source platform to host container images across any size organization. One drawback in comparison to Harbor is that the proxy cache feature is still marked as a Technology Preview, hence this feature may not be completely production-ready yet. On the other hand, the project Quay supports building Dockerfiles using a set of workers on e.g. Kubernetes. Build triggers, such as GitHub webhooks can be configured to automatically build new versions of repositories when new code is committed. This feature is not supported by the Harbor project. Harbor is an outstanding open-source, community-led project with fully open and well-documented processes. Its large and thriving community powers the fast-growing feature set and attracts more and more developers and companies to active contributions. Harbor's CNCF graduation in 2020 made it one of the best choices for enterprise customers that want to operate container registries securely and in a large scale. Its community size, landscape, and CNCF graduation make a significant difference in comparison to Quay's open-source health capabilities. The list of supported features is also impressive. This project fulfills all must-haves defined in this document and overcome project Quay with a production-ready proxy cache feature and more options that the user may use in case of image vulnerability scanning. In addition, Harbor profits from p2p distribution capabilities via integration of p2p solutions like Kraken and Dragonfly. It is worth mentioning that Harbor, by design, operates on a single storage backend (e.g. S3). It means that the storage of container images is shared even when the Harbor instance serves multiple tenants. The same approach is used in Quay and Dragonfly projects, but e.g. Keppel uses multi-tenant-aware storage drivers instead so that each customer gets their own separate storage backend. CSP that considers offering container registry \"as a service\" solution based on Harbor should be aware of this shared storage backend architecture.","s":"Conclusion","u":"/standards/scs-0212-v1-requirements-for-container-registry","h":"#conclusion","p":1954},{"i":1968,"t":"Based on the research and conclusion above we've decided to use the Harbor project as a container registry implementation for the SCS ecosystem.","s":"Decision","u":"/standards/scs-0212-v1-requirements-for-container-registry","h":"#decision","p":1954},{"i":1971,"t":"A Kubernetes instance is provided as a cluster, which consists of a set of worker machines, so called nodes. A cluster is composed of a control plane and at least one worker node. The control plane manages the worker nodes and therefore the pods in the cluster by making decisions about scheduling, event detection and global decisions. Inside the control plane, multiple components exist, which can be duplicated and distributed over multiple machines inside the cluster. Typically, no user containers are run on these machines in order to separate the control plane from the live system.","s":"Introduction","u":"/standards/scs-0213-v1-k8s-nodes-anti-affinity","h":"#introduction","p":1969},{"i":1973,"t":"The following special terms are used throughout this decision record document: Term Meaning Worker Virtual or bare-metal machine, which hosts workloads of customers Control Plane Virtual or bare-metal machine, which hosts the container orchestration layer that exposes the API and interfaces to define, deploy, and manage the lifecycle of containers. Machine Virtual or bare-metal entity with computational capabilities","s":"Glossary","u":"/standards/scs-0213-v1-k8s-nodes-anti-affinity","h":"#glossary","p":1969},{"i":1975,"t":"In a productive environment, the control plane usually runs across multiple machines and a cluster usually contains multiple worker nodes in order to provide fault-tolerance and high availability. In order to ensure availability and scaling of workloads, even if some nodes in the cluster could fail, they should be distributed over multiple nodes on different machines. This can be steered with the Affinity or Anti Affinity features, which are separated by Kubernetes into two features: Node Affinity The Node Affinity feature allows to match pods according to logical matches of key-value-pairs referring to labels of nodes. These can be defined with different weights or preferences in order to allow fine-grained selection of nodes. The feature works similar to the Kubernetes nodeSelector. It is defined in the PodSpec using the nodeAffinity field in the affinity section. Pod Affinity Pod Affinity or Pod Anti Affinity allows the constraint of pod scheduling based on the labels of pods already running on a node. This means the constraint will match other pods on a node according to their labels key-value-pairs and then either schedule the pod to the same (Affinity) or another (Anti Affinity) node. This feature is also defined in the PodSpec using the podAffinity and podAntiAffinity fields in the affinity section. [3] Both features allow the usage of \"required\" or \"preferred\" keywords, which create \"hard\" or \"soft\" affinities. By using a hard affinity, a pod would need to be scheduled according to the rules set. If this possibility is not given, the pod can't be scheduled. A soft affinity would allow scheduling even if the requirements are not fulfilled, but they would be preferred if possible. These features allow efficient resource usage (e.g. by scheduling workloads to evenly distribute across nodes) and provide fault-tolerance and therefore high availability. But they also require more work during the setup of a service architecture, since nodes and pods need to be labelled and described consistently. In the case of SCS, affinity of the workloads themselves is not relevant, since this feature is mostly used by the customers of the providers. Instead, the expected standard should enable the Kubernetes cluster to handle Anti Affinity rules with a real physical separation as well as distributing the control plane over multiple machines in order to provide fault-tolerance during system outages. If the control plane survives an outage, a Kubernetes cluster can recover later on.","s":"Motivation","u":"/standards/scs-0213-v1-k8s-nodes-anti-affinity","h":"#motivation","p":1969},{"i":1977,"t":"SCS plans to require a Hard Anti Affinity and/or Redundancy for the control plane and a Soft Anti Affinity for workers. This means, that Anti Affinity would be required for the control planes and their pods and only optional (but encouraged) for workers. In order to achieve the goals for these components, meaning availability and fault tolerance for the control plane, an outage resistant cluster, and the availability promise given with Anti Affinity for pods on the worker nodes, a separation of nodes on the hardware level would need to be achieved. For the control plane, a reference to the \"Kubernetes High Availability\" [1] can be useful, since it provides two ways to set up a highly available cluster. Both approaches are very similar. The \"Stacked Control Plane\" [2] requires less infrastructure, but also runs the risk of failed coupling, where if one node fails, the redundancy could be compromised due to the loss of a complete control plane instance. The \"External ETCD\" solves this problem, but also requires double the infrastructure, due to the externally incorporated etcd clusters. This also shows, that the wording \"anti affinity\" as used with Kubernetes pods is probably slightly misleading in the context of a Kubernetes control plane. It may consist of multiple pods with individual tasks, but distributing them over different nodes through Anti Affinity would probably still cascade the whole control plane into a complete failure, if one of the used nodes goes down. It could be possible to replicate specific important pods and assign them to different nodes, but at this point, a redundant setup like presented in [1] could be used. So Anti Affinity in this context probably means more like distribution over multiple physical machines, which needs to be planned beforehand on the machine/server level. Therefore would it be preferred for the control plane to use a redundant setup, which is separated over different physical machines, meaning at least half of the control plane nodes runs on a different physical machine as the rest. The currently used ClusterAPI enables this by establishing the concept of \"failure domains\". These are used to control the placement of k8s nodes and distribute them over multiple physical machines. For example, a High Availability K8s cluster with three control plane nodes could be distributed over three different availability zones (and therefore 3 different physical machines) in order to survive the failure of one availability zone. [5] For worker nodes, the whole idea of Anti Affinity is more of a preferable situation. The nodes themselves should at best be distributed over different machines, but this is not a requirement, especially since smaller providers wouldn't have the capacity to provide enough machines for these distributed Kubernetes clusters. Since customers that use the Affinity or Topology spread constraint [4] features would be especially interested in the worker nodes that host their workloads, it should be ensured that a good labeling system is provided for the nodes in order to see if two nodes are hosted on the same machine.","s":"Design considerations","u":"/standards/scs-0213-v1-k8s-nodes-anti-affinity","h":"#design-considerations","p":1969},{"i":1979,"t":"The future standard should define a few important things in order to provide a solid base for the usage and advantages of workloads with Anti Affinity rules. Control planes SHOULD be made redundant in order to provide fault-tolerance and security against fatal errors on this layer, in the case of node failures. How this redundancy is achieved SHOULD be left to the providers, but since failure must be avoided, it is REQUIRED to at least duplicate control plane components. Half of every component SHOULD be located on a different node on a different physical machine than the other half of them. This should provide at least the minimum requirements for a fault-tolerant control plane. For the standard, there is also a possibility to define multiple stages of distributed infrastructure and only make sensible ones a requirement and the rest optional, e.g. non-distributed clusters High-Availability clusters that are distributed over multiple machines/availability zones distributed over multiple clouds distributed over multiple physical locations/datacenters The worker nodes are RECOMMENDED to be distributed over different machines. In order to provide clear information to the users, the nodes should be labeled to reflect the mapping to the underlying clusters. The labels can be obfuscated in order to not reveal the underlying structures to customers and users. It should be noted, that it is NOT REQUIRED to have this anti affinity for the worker nodes due to the requirements of infrastructure and complexity associated with this.","s":"Decision","u":"/standards/scs-0213-v1-k8s-nodes-anti-affinity","h":"#decision","p":1969},{"i":1981,"t":"Kubernetes High Availability Documentation 1 Kubernetes High Availability - Stacked ETCD 2 Affinity and Anti-Affinity 3 Topology Spread Constraints 4 SCS Multi AZ and Multi Cloud Environments 5","s":"Documents","u":"/standards/scs-0213-v1-k8s-nodes-anti-affinity","h":"#documents","p":1969},{"i":1984,"t":"In this proposal, we discuss the necessity and design considerations of a lightweight solution for testing cluster-stacks. The purpose is to address the challenges associated with testing on an Infrastructure as a Service (IaaS) provider and the limitations of using Docker as the primary containerization tool for testing. This proposal will elaborate on why we need to test in a local environment, specifically a laptop, and the benefits and drawbacks associated with it. We aim to make an informed decision for testing cluster stacks to cater to both the organizational and technical perspectives of our stakeholders.","s":"Introduction","u":"/standards/scs-0213-v1-requirements-for-testing-cluster-stacks","h":"#introduction","p":1982},{"i":1986,"t":"From an organization's point of view, it is crucial to lower the entry barrier for testing. This action will make it possible for anyone, including external contributors, to easily participate in the testing process without needing an account with the IaaS provider. It is also necessary to overcome the hurdles associated with maintaining a balance in the provider account and managing sponsorships to fund the testing. From a technical standpoint, there are multiple reasons to favor a local environment for testing. Among them is the ability to test without internet, finish tests in a shorter timeframe, and incur no cost. The provider independence of Cluster Stacks makes it nonsensical to test with a specific provider due to the varied behaviors of different providers. There are also challenges in monitoring and debugging tests run on IaaS providers and dealing with their downtime and limitations on concurrent testing.","s":"Motivation","u":"/standards/scs-0213-v1-requirements-for-testing-cluster-stacks","h":"#motivation","p":1982},{"i":1988,"t":"Lightweight Solution The testing solution should be lightweight and easy to use in a local environment, such as a laptop. This lightweight solution should minimize dependencies and resource usage while maximizing speed and efficiency of the tests. It should be capable of handling the cluster-stack testing requirements without necessitating a bulky or resource-intensive setup. Independence from Specific Providers The solution should be generalized and not bound to any specific provider. This consideration ensures that the solution can be applied to any provider, guaranteeing its versatility and broad applicability. Offline Testing The testing solution should support testing without internet connection, which will enable more robust and flexible testing scenarios. It should be possible to run the tests even in cases of limited or disrupted internet access. Fast Execution Time The tests should execute within a reasonably short amount of time. The solution must be optimized to ensure quick testing cycles, which can help increase productivity and shorten development cycles. No-Cost Solution The solution should not impose any additional costs on the organization or individual testers. This characteristic is crucial to enable widespread adoption of the testing process and to lower the entry barrier for contributors. Easy Monitoring and Debugging The solution should provide easy monitoring and debugging capabilities. It should allow developers to quickly identify, diagnose, and fix issues that arise during testing, without requiring access to any external logs or monitoring tools. Concurrent Testing The solution should support the ability to run concurrent tests without causing any disruption or downtime. This ability can improve the efficiency and speed of the testing process.","s":"Design Considerations","u":"/standards/scs-0213-v1-requirements-for-testing-cluster-stacks","h":"#design-considerations","p":1982},{"i":1990,"t":"The proposed solution should meet the following feature requirements: Local Environment: The solution should support a local testing environment that allows developers to test cluster stacks on their local machines, reducing dependencies on external providers. Compatibility: The solution should be compatible with various operating systems and platforms, ensuring its usability across diverse environments. Performance: The solution should offer high-performance testing capabilities, allowing fast execution of tests. Offline Support: The solution should allow testing in offline mode, ensuring tests can be performed even without an internet connection. Concurrency: The solution should support running multiple tests concurrently without causing disruptions or conflicts. Monitoring & Debugging: The solution should provide easy-to-use tools for monitoring test progress and debugging issues. Cost-effectiveness: The solution should not require any financial investment from the testers or the organization, promoting broad accessibility and usage.","s":"Required Features","u":"/standards/scs-0213-v1-requirements-for-testing-cluster-stacks","h":"#required-features","p":1982},{"i":1992,"t":"Two potential approaches for testing cluster stacks are the use of an IaaS provider and the use of a local environment. Here we discuss the pros and cons of these two approaches.","s":"Pros and Cons of Different Approaches","u":"/standards/scs-0213-v1-requirements-for-testing-cluster-stacks","h":"#pros-and-cons-of-different-approaches","p":1982},{"i":1994,"t":"Pros​ Comprehensive testing environment with advanced capabilities. Possibility to mimic real-world production environments closely. Cons​ Requires signing up and account management, which can be a barrier for some testers. Requires maintaining a balance in the provider account, which can pose financial burdens. Internet dependency for testing. Potential for prolonged testing time due to various dependencies. Challenges with monitoring and debugging. Potential downtime and difficulty in running concurrent tests.","s":"IaaS Provider (OpenStack, Hetzner, AWS)","u":"/standards/scs-0213-v1-requirements-for-testing-cluster-stacks","h":"#iaas-provider-openstack-hetzner-aws","p":1982},{"i":1996,"t":"Pros​ Faster test execution with no downtime. Ability to test without internet. Independent of any provider knowledge. Cost-free testing. Easier integration into CI/CD. Simplified monitoring and debugging. Cons​ Limited systemd support and containerd support for kubeadm in Docker. Inability to mimic the exact real-world production environments.","s":"Local Environment (Docker, Kubevirt)","u":"/standards/scs-0213-v1-requirements-for-testing-cluster-stacks","h":"#local-environment-docker-kubevirt","p":1982},{"i":1998,"t":"While Docker provides significant benefits for local environment testing, it's important to recognize its limitations. Docker containers, by design, are lightweight and don't contain a full operating system which can lead to challenges when trying to mimic real-world production environments. Also, Docker containers lack some necessary features like systemd which is used in many production environments for initializing and managing services. One major aspect that Docker lacks is the ability to mimic real-world production environments effectively. This is primarily due to its nature as a containerization tool, operating within the host OS, and sharing resources among its containers. This might create disparities in behavior when comparing to deployments on real, isolated systems, which could be problematic in some scenarios. Furthermore, Docker utilizes a Union File System for its images, leading to the creation of layers. This approach can lead to some complexities when dealing with node-images which comprise a significant chunk of our layers. Handling such situations might require workarounds that could add additional complexity and potential points of failure. This creates a blind spot, as real providers won't require these workarounds, which might lead to disparities in results when comparing testing in local and actual production environments. Therefore, to achieve a more accurate representation of real-world environments, we propose a solution that utilizes a virtual machine based approach for local testing. This approach could leverage tools like KubeVirt, Vagrant, or VirtualBox to create and manage virtual machines on the local environment. This strategy would provide a more robust and realistic environment for testing, as it can better emulate the behavior of a full-fledged operating system and thereby more closely mimic a real-world production environment.","s":"Beyond Docker: Virtual Machine based Approach","u":"/standards/scs-0213-v1-requirements-for-testing-cluster-stacks","h":"#beyond-docker-virtual-machine-based-approach","p":1982},{"i":2000,"t":"Pros​ Provides a more accurate representation of real-world production environments. Allows for full operating system emulation, including features like systemd. Can create isolated environments, thereby mimicking actual deployments better than containers. Cons​ Potentially more resource-intensive than container-based solutions. Increased complexity due to the need for managing full virtual machines rather than lightweight containers. Initial setup might be more complicated compared to a Docker-based solution.","s":"Virtual Machine Based Approach","u":"/standards/scs-0213-v1-requirements-for-testing-cluster-stacks","h":"#virtual-machine-based-approach","p":1982},{"i":2002,"t":"Given the limitations of Docker and the potential advantages of a virtual machine based approach, we propose to investigate further into this strategy. The exact tool or set of tools used can be determined based on a thorough evaluation of the available options. Although there might be some initial complexity and potentially higher resource usage compared to Docker, we believe that the benefits of more accurate testing and better emulation of real-world environments outweigh these potential disadvantages. The proposed solution should meet all the requirements mentioned in the previous sections of the proposal, in addition to providing the benefits of a virtual machine based approach. By doing so, we aim to establish a robust, reliable, and realistic testing environment for cluster stacks that mimics real-world production environments as closely as possible.","s":"Proposed Path Forward","u":"/standards/scs-0213-v1-requirements-for-testing-cluster-stacks","h":"#proposed-path-forward","p":1982},{"i":2004,"t":"After thoroughly examining the organizational needs, technical requirements, and potential testing approaches, it is evident that testing cluster stacks in a local environment provides significant advantages over using an Infrastructure as a Service (IaaS) provider. A local environment minimizes financial constraints, reduces testing time, offers offline capabilities, and enables greater tester participation without the need for specialized IaaS knowledge. While Docker stands out for its broad adoption, cost-effectiveness, and impressive containerization benefits, it also presents some limitations that cannot be overlooked. The lack of full operating system emulation and certain system features like systemd pose challenges to mimic real-world production environments accurately. Given Docker's limitations and the need to reproduce realistic testing scenarios, we propose moving beyond Docker to a virtual machine-based approach. Even though this approach may introduce initial complexity and potentially higher resource usage, it promises a more accurate representation of real-world environments, thereby ensuring more reliable and robust test results. Tools such as KubeVirt, Vagrant, or VirtualBox could potentially fulfill our requirements, offering benefits such as full operating system emulation and isolated environments. However, an in-depth evaluation of these and possibly other tools is necessary to determine the best path forward. In conclusion, our goal is to design a robust, reliable, and realistic testing environment for cluster stacks that closely mimics real-world production environments, aligns with our organizational and technical perspectives, and ensures a low entry barrier for all testers. Embracing a virtual machine-based approach for local environment testing represents a promising strategy to achieve this objective, paving the way for more efficient and reliable cluster stack testing.","s":"Conclusion","u":"/standards/scs-0213-v1-requirements-for-testing-cluster-stacks","h":"#conclusion","p":1982},{"i":2007,"t":"A Kubernetes instance is provided as a cluster, which consists of a set of machines, so called nodes. A cluster is composed of a control plane and at least one worker node. The control plane manages the worker nodes and therefore the pods in the cluster by making decisions about scheduling, event detection and rights management. Inside the control plane, multiple components exist, which can be duplicated and distributed over multiple nodes inside the cluster. Typically, no user workloads are run on these nodes in order to separate the controller component from user workloads, which could pose a security risk.","s":"Introduction","u":"/standards/scs-0214-v1-k8s-node-distribution","h":"#introduction","p":2005},{"i":2009,"t":"The following terms are used throughout this document: Term Meaning Worker Virtual or bare-metal machine, which hosts workloads of customers Control Plane Virtual or bare-metal machine, which hosts the container orchestration layer that exposes the API and interfaces to define, deploy, and manage the lifecycle of containers. Machine Virtual or bare-metal entity with computational capabilities","s":"Glossary","u":"/standards/scs-0214-v1-k8s-node-distribution","h":"#glossary","p":2005},{"i":2011,"t":"In normal day-to-day operation, it is not unusual for some operational failures, either due to wear and tear of hardware, software misconfigurations, external problems or user errors. Whichever was the source of such an outage, it always means down-time for operations and users and possible even data loss. Therefore, a Kubernetes cluster in a productive environment should be distributed over multiple \"failure zones\" in order to provide fault-tolerance and high availability. This is especially important for the control plane of the cluster, since it contains the state of the whole cluster. A failure of this component could mean an unrecoverable failure of the whole cluster.","s":"Motivation","u":"/standards/scs-0214-v1-k8s-node-distribution","h":"#motivation","p":2005},{"i":2013,"t":"Most design considerations of this standard follow the previously written Decision Record [Kubernetes Nodes Anti Affinity] as well as the Kubernetes documents about [High Availability] and [Best practices for large clusters]. SCS wishes to prefer distributed, highly-available systems due to their obvious advantages like fault-tolerance and data redundancy. But it also understands the costs and overhead for the providers associated with this effort, since the infrastructure needs to have hardware which will just be used to provide fail-over safety or duplication. The document [Best practices for large clusters] describes the concept of a failure zone. This term isn't defined any further, but can in this context be described as a number of physical (computing) machines in such a vicinity to each other (either through physical or logical interconnection in some way), that specific problems inside this zone would put all these machines at risk of failure/shutdown. It is therefore necessary for important data or services to not be present just on one failure zone. How such a failure zone should be defined is dependent on the risk model of the service/data and its owner as well as the capabilities of the provider. Zones could be set from things like single machines or racks up to whole datacenters or even regions, which could be coupled by things like electrical grids. They're therefore purely logical entities, which shouldn't be defined further in this document.","s":"Design Considerations","u":"/standards/scs-0214-v1-k8s-node-distribution","h":"#design-considerations","p":2005},{"i":2015,"t":"This standard formulates the requirement for the distribution of Kubernetes nodes in order to provide a fault-tolerant and available Kubernetes cluster infrastructure. Since some providers only have small environments to work with and therefore couldn't comply with this standard, it will be treated as a RECOMMENDED standard, where providers can OPT-OUT. If the standard is used by a provider, the following decisions are binding and valid: The control plane nodes MUST be distributed over multiple physical machines. Kubernetes provides best-practices on this topic, which are also RECOMMENDED by SCS. At least one control plane instance MUST be run in each \"failure zone\", more are RECOMMENDED in each \"failure zone\" to provide fault-tolerance for each zone. Worker nodes are RECOMMENDED to be distributed over multiple zones. This policy makes it OPTIONAL to provide a worker node in each \"failure zone\", meaning that worker nodes can also be scaled vertically first before scaling horizontally. Worker node distribution MUST be indicated to the user through some kind of labeling in order to enable (anti)-affinity for workloads over \"failure zones\".","s":"Decision","u":"/standards/scs-0214-v1-k8s-node-distribution","h":"#decision","p":2005},{"i":2017,"t":"High Availability Best practices for large clusters Kubernetes Nodes Anti Affinity","s":"Related Documents","u":"/standards/scs-0214-v1-k8s-node-distribution","h":"#related-documents","p":2005},{"i":2019,"t":"Conformance Tests will be written in another issue","s":"Conformance Tests","u":"/standards/scs-0214-v1-k8s-node-distribution","h":"#conformance-tests","p":2005},{"i":2022,"t":"Our assumption is that there are use cases, where CSPs would like to be able to let customers access their SCS based services by identifying themselves with credentials that are stored and managed external to the CSP's SCS installation. This is based on the observation that prospective customers of an SCS based CSP sometimes already come equipped with an IAM solution of their choice, either on premises or e.g. as an external 3rd party cloud service. To ease onboarding of customer employees (or e.g. customer contracted 3rd party admin staff) as SCS users, it would be good to be able to consume these external identities in SCS. For customers this avoids the neccessity to explicitly maintain an additional dedicated account in SCS and this also reduces what SCS needs to do with respect to taking care of persisting user account information. To put it in other words, in SCS we would like to be able to delegate authentication to external identity providers and map those users to roles in SCS that can be used for authorization decisions when users access SCS services. In addition to user identities there we also see the necessity to support the use of \"machine identites\" (aka \"workload identities\" or \"service accounts\"). These will probably be SCS-local accounts and have for example the purpose to grant CaaS workload access to storage resources served by the infrastructure layer. Exact architectural details for this are still in active discussion, but it is anticipated that the IdP component should be very useful in facilitating the integration.","s":"Introduction","u":"/standards/scs-0300-v1-requirements-for-sso-identity-federation","h":"#introduction","p":2020},{"i":2024,"t":"SCS has multiple service layers, like IaaS and CaaS, both of which running their own technological stack with specific internal models of accounts and authorization. One thing these services have in common, is that they are able to use SSO protocols like OAuth 2.0 or OpenID Connect (OIDC) on top of it to delegate authentication. They are service providers (SAML terminology) and can be relying parties (OIDC terminology) of a protocol compliant identity provider (IdP). So the idea is, to run an SSO IdP as part of SCS to provide a dedicated point of entry for identites, which the SCS service layers can use as a common interface to consume external user identities. The purpose of this document is to specify what requirements a specific technical IdP implementation (i.e. software solution) needs to fulfill in the context of SCS.","s":"Motivation for this document","u":"/standards/scs-0300-v1-requirements-for-sso-identity-federation","h":"#motivation-for-this-document","p":2020},{"i":2026,"t":"As a central service for identity handling, the IdP service needs to be robust and reliable. Customers shall be able to access self service, so that they can make reasonable adjustments e.g. to role mapping. At the time of writing this document it's still undecided if SCS has the requirement of a dedicated \"self service\" service that serves as a frontend to provision and re-configure customer specific data, abstracting e.g. from IdP specific user interface particularities. Keycloak is currently being deployed as part of the IaaS reference implementation. Technically this IdP component shall be shifted from the management plane to be run on the basis of a \"minimal\" Kubernetes (e.g. K3S), e.g. to make use of the \"self healing\" and scaling features achievable with that. So one of the considerations is if the solution will work well on a K8S environment. The instances will need to share configuration (probably via the shared backend database) as well as session state. Maybe one is better prepared for horizontal scaling than the other.","s":"Design Considerations","u":"/standards/scs-0300-v1-requirements-for-sso-identity-federation","h":"#design-considerations","p":2020},{"i":2028,"t":"Keycloak​ Keycloak is a commonly used IdP solution implemented in Java. It is developed as an open source community project. Red Hat uses it as upstream source for their Red Hat SSO product and is also listed as sponsor of the project. Starting with version 17 the default distribution is based on Quarkus instead of WildFly/JBoss. The project maintains several means of community contributions as listed on the community section of the project website. It uses Github issues to track development. It offers a REST API for administration and there's a separately maintained 3rd party python module as well as ansible support for it. Both of these are downstream of Keycloak itself and may thus not always be feature complete and suffer latency with respect to getting adjusted to upstream changes. It offers support for commonly used SSO protocols and is \"reasonably\" fast in adopting to protocol standard changes and extensions. This has been observed in the case of logout support (backend and frontend variants) in OIDC. It offers a concept of \"Identity Brokering\", where Keycloak is not just IdP but also \"client\" to other IdPs. This allows daisy chaining of identity federation. In this configuration it can work as a point of protocol transition between different supported SSO protocols (SAML, OAuth 2.0, etc.). Beyond this capability of using other IdPs as identity sources, it also supports using classic LDAP based IAM services as backend (OpenLDAP and Active Directory, e.g.). Keycloak's implementation makes some design decisions, that are specific to it and have consequences for clients of the service. E.g. Keycloak has a concept of management \"Realms\", which have their own specific set of HTTP API entrypoints, both for administration as well as for IdP requests. Commonly Keycloak realms can be used to map them 1:1 to user domains, but since Keycloak supports configuring multiple backend IdPs in a realm to be used for \"Identity Brokering\", there is always the possibility to create a kind of \"proxy\" realm to provide a single standard set of HTTP API endpoints for SSO clients (service providers) to avoid the need to frequently extend/reduce client service configuration whenever a new IdP federation needs to be added to Keycloak to onboard a new customer. This is relevant for services like OpenStack Keystone, which currently cannot be easily reconfigured for new SSO endpoints without restarting the service, making the service unavailable for a short span of time and increasing risk connected with service restarts. Since version 17, Keycloak claims that it's capability for \"cloud native\" deployments on Kubernetes has improved. Keycloak is offering a REST API for all aspects of its administration interface. For storage of Keycloak configuration and local user metadata (e.g. from which external IdP a user account originally came from) Keycloak supports several SQL backends through JDBC. Thus it can be hooked up to a Postgres Database or to a MariaDB/Galera cluster e.g.. As of April 11, 2023, Keycloak joined the CNCF as an incubating project. Zitadel​ Zitadel is a newer implementation of an SSO IdP. It is implemented in Go and under active development and maintained by ZITADEL. The project is open for community contributions to all parts of the eco system. Feature requests and bugs being tracked on Github for development. Community questions can be asked in the public chat or via Github Discussions. ZITADEL offers support for the commonly used authentication and authorization protocols such as OIDC, OAuth2, SAML2. It is a compliant and certified OpenID Connect provider with support for various Grant Types for both human users and machine users. Compared to Keycloak SPIs, ZITADEL offers Actions to customize and integrate (eg, calling external APIs, Webhooks, customizing pre-built workflows, customizing tokens) Actions are executed at runtime and can be maintained independently of platform. Identity brokering (OIDC, SAML, JWT) can be configured system-wide or for each organization with templates. Users will be created just in time for audit purposes and linked to the external identity provider. Users can have multiple identity providers linked to their profile. It came to attention of the SCS project because it offers a fresh take of an organization focussed data model, which has the potential to simplify IdP federation to SCS customer domains in the following areas: For client services (single set of HTTP API endpoints). For SCS operators for provisioning customer organizations and robust configuraton by using templated client, role and mapping configuration. For SCS customers for a robust user experience for self servicing. The concept for Delegated Access Management reduces the management overhead compared to isolated realms. Projects (Applications + Roles) can be maintained by one organization and delegated to be used by other Organizations. Managers that receive granted Projects can assign users permissions to use the project. Zitadel is offering REST APIs for multiple areas of use and configuration. It recently also added support for the Device Authorization Grant, which, at time of writing, is a feauture that is relevant for SCS to be able use OpenStack CLI and APIs with federated identities (Device Authorization Grant). Support for consumption of LDAP backends is available since Zitadel v2.23.0 (see this guide). ZITADEL supported backend databases are CockroachDB and PostgreSQL. For production setups it is recommended to use Kubernetes (or similar like Knative) and CockroachDB. At time of writing a PoC \"spike\" is done to assess and verify the hopes connected with Zitadel in the context of the SCS testbed. Currently Zitadel is lacking the possibility to easily add custom claims. It supports urn:zitadel:iam:user:metadata, but that is more suitable towards Kubernetes and cannot be parsed with the OpenStack mapping mechanism. There is work going on which may be suitable to resolve this issue. An approach based on Zitadel actions is also currently evaluated. OpenStack currently makes use of custom claims to pass openstack-default-project from the IdP to OpenStack. Combined with federation to external customer managed IdPs this should allow customers to manage settings like these in their own IAM.","s":"Options considered","u":"/standards/scs-0300-v1-requirements-for-sso-identity-federation","h":"#options-considered","p":2020},{"i":2030,"t":"How would we implement testbed deployment support for Zitadel? e.g. wsgi-keystone.conf would need to look different. One template covering both options? e.g. steps like openstack federation protocol create would probably be different. Should we support both as options? What's the benefit? How would we allow SCS operators to choose? Do we need some kind of SWOT analysis to come to a decision?","s":"Open questions","u":"/standards/scs-0300-v1-requirements-for-sso-identity-federation","h":"#open-questions","p":2020},{"i":2032,"t":"SCS wants to make use of an IdP as part of the reference implementation. To move forward with topics of configuration and mapping of roles in a OAuth2 federation scenario as well as questions of token lifecycles etc. across the federation stack it makes sense to focus on one IdP implementation at a given time. Both considered options seem to be potentially viable, but ultimately, a decision should be made, even if there are no strict/strong reasons for dismissing either option in particular. The project's current choice is Keycloak for the following reasons: Keycloak currently supports the OAuth 2.0 grants that SCS wants to make use of (e.g. Device Authorization Grant). It is the implementation for which integration is currently documented in OpenStack and implemented in kolla-ansible. SCS currently deploys Keycloak and the IAM team has most hands on expecience with it, e.g. when it comes to colletaral questions like how to make TLS and signing certificates available to the IdP that shall be used in federation to external domains.","s":"Decision","u":"/standards/scs-0300-v1-requirements-for-sso-identity-federation","h":"#decision","p":2020},{"i":2034,"t":"https://github.com/SovereignCloudStack/standards/tree/main/Drafts/IAM-federation","s":"Related Documents","u":"/standards/scs-0300-v1-requirements-for-sso-identity-federation","h":"#related-documents","p":2020},{"i":2039,"t":"SCS Clouds should provide a way to grant Domain Manager rights to SCS Customers which provides IAM self-service capabilities within an OpenStack domain. This is not properly implemented in the default OpenStack configuration and requires specific adjustments to the Keystone identity management configuration. To avoid conflict with the unscoped admin role in OpenStack we want to refer to this new role as \"Domain Manager\" (domain-manager).","s":"Introduction","u":"/standards/scs-0302-v1-domain-manager-role","h":"#introduction","p":2037},{"i":2041,"t":"The following special terms are used throughout this standard document: Term Meaning RBAC Role-Based Access Control1 established by OpenStack Keystone project OpenStack project as per Keystone RBAC user OpenStack user as per Keystone RBAC group OpenStack group as per Keystone RBAC role OpenStack role as per Keystone RBAC domain OpenStack domain as per Keystone RBAC IAM identity and access management IAM resources projects, users, groups, roles, domains as managed by OpenStack Keystone CSP Cloud Service Provider, provider managing the OpenStack infrastructure cloud admin OpenStack user belonging to the CSP that possesses the admin role","s":"Glossary","u":"/standards/scs-0302-v1-domain-manager-role","h":"#glossary","p":2037},{"i":2043,"t":"Applying this standard modifies the API policy configuration of Keystone and introduces a new global role definition to Keystone to enable IAM self-service for customers within a domain. Once assigned, the role allows special Domain Manager users within a domain to manage users, project, groups and role assignments as part of the IAM self-service. However, the configuration change introduced by this standard does not automatically assign the Domain Manager role to any users per default. Assigning the new role and granting customers the resulting self-service capabilities is a deliberate action to be taken by the CSP on a per-tenant (i.e. per domain) basis. Omitting the provisioning of any Domain Manager users (i.e. not assigning the new role to any user) will result in an OpenStack cloud that behaves identically to a configuration without the standard applied, making the actual usage of the functionality a CSP's choice and entirely optional.","s":"Impact","u":"/standards/scs-0302-v1-domain-manager-role","h":"#impact","p":2037},{"i":2045,"t":"In the default configuration of Keystone, only users with the admin role may manage the IAM resources such as projects, groups and users and their relation through role assignments. The admin role in OpenStack Keystone is not properly scoped when assigned within a domain or project only as due to hard-coded architectural limitations in OpenStack, a user with the admin role may escalate their privileges outside of their assigned project or domain boundaries. Thus, it is not possible to properly give customers a self-service functionality in regards to project, group and user management with the default configuration. To address this, this standard defines a new Domain Manager role in conjunction with appropriate Keystone API policy adjustments to establish a standardized extension to the default Keystone configuration allowing for IAM self-service capabilities for customers within domains.","s":"Motivation","u":"/standards/scs-0302-v1-domain-manager-role","h":"#motivation","p":2037},{"i":2047,"t":"The cloud admin deploys the Domain Manager policy configuration for Keystone as per this standard if it is not already applied. The cloud admin creates the desired domains for the customers for which IAM self-service capabilities are desired. The cloud admin creates one or more users within each of the applicable domains and assigns the Domain Manager role to them. These users represent the Domain Managers of the corresponding domain. The customer uses the Domain Manager users to manage (create, update, delete) users, projects, groups and corresponding role assignments within their domain.","s":"Desired Workflow","u":"/standards/scs-0302-v1-domain-manager-role","h":"#desired-workflow","p":2037},{"i":2049,"t":"the Domain Manager role MUST support managing projects, groups and users within a specific domain the Domain Manager role MUST be properly scoped to a domain, it MUST NOT gain access to resources outside of its owning domain the Domain Manager role MUST NOT be able to manipulate existing roles or create new roles the Domain Manager role MUST only be able to assign specific non-administrative* roles to their managed users where the applicable roles are defined by the CSP Domain Managers MUST NOT be able to abuse the role assignment functionalities to escalate their own privileges or those of other users beyond the roles defined by the CSP * \"non-administrative\" in this context means this excludes the role \"admin\" and any comparable role that grants permissions beyond domain and tenant scope. Since the Domain Manager role as defined in this standard is domain-scoped, it does not count as administrative.","s":"Design Considerations","u":"/standards/scs-0302-v1-domain-manager-role","h":"#design-considerations","p":2037},{"i":2051,"t":"Re-using the existing admin role​ As role assignments can be scoped to project, groups and domains the most obvious option would be to assign the existing admin role to users representing Domain Managers in a scoped fashion. However, due to architectural limitations2 of the existing OpenStack implementation of roles, the admin role has a special meaning reaching beyond the RBAC checks done by Keystone and other OpenStack components. This results in special permissions being granted to users possessing the role which ignore the project or domain scope of the role assignment. This poses severe security risks as the proper scoping of the admin role is impossible. Due to this, this approach was discarded early. Upstream (OpenStack) is in the process of addressing this across the services but it has not been fully implemented yet, especially for domains3. Introducing a new role and API policy changes​ OpenStack Keystone allows for new roles to be created via its API by administrative users. Additionally, each OpenStack API's RBAC can be adjusted through an API policy file (policy.yaml) through olso-policy4, Keystone included. The possibility of managing users, projects, role assignments and so on is regulated through Keystone's RBAC configured by its API policy file. This means that by creating a new role and extending Keystone's API policy configuration a new Domain Manager role can be established that is limited to a specific subset of the Keystone API to be used to manage users, projects and role assignments within a domain.","s":"Options considered","u":"/standards/scs-0302-v1-domain-manager-role","h":"#options-considered","p":2037},{"i":2054,"t":"The approach described in this standard imposes the following limitations: as a result of the \"identity:list_domains\" rule (see below), Domain Managers are able to see all domains via \"openstack domain list\" and can inspect the metadata of other domains with \"openstack domain show\" as a result of the \"identity:list_roles\" rule (see below), Domain Managers are able to see all roles via \"openstack role list\" and can inspect the metadata of other roles with \"openstack role show\" As a result of points 1 and 2, metadata of all domains and roles will be exposed to all Domain Managers! If a CSP deems either of these points critical, they may abstain from granting the Domain Manager role to users, effectively disabling the functionality. See Impact.","s":"Limitations","u":"/standards/scs-0302-v1-domain-manager-role","h":"#limitations","p":2037},{"i":2056,"t":"A role named \"domain-manager\" is to be created via the Keystone API and the policy adjustments quoted below are to be applied.","s":"Decision","u":"/standards/scs-0302-v1-domain-manager-role","h":"#decision","p":2037},{"i":2058,"t":"The following policy has to be applied to Keystone in a verbatim fashion. The \"is_domain_managed_role\" rule definition is the only exception to this (see below). # classify domain managers with a special role \"is_domain_manager\": \"role:domain-manager\" # specify a rule that whitelists roles which domain admins are permitted # to assign and revoke within their domain \"is_domain_managed_role\": \"'member':%(target.role.name)s\" # allow domain admins to retrieve their own domain \"identity:get_domain\": \"(rule:is_domain_manager and token.domain.id:%(target.domain.id)s) or rule:admin_required\" # list_domains is needed for GET /v3/domains?name=... requests # this is mandatory for things like # `create user --domain $DOMAIN_NAME $USER_NAME` to correctly discover # domains by name \"identity:list_domains\": \"rule:is_domain_manager or rule:admin_required\" # list_roles is needed for GET /v3/roles?name=... requests # this is mandatory for things like `role add ... $ROLE_NAME`` to correctly # discover roles by name \"identity:list_roles\": \"rule:is_domain_manager or rule:admin_required\" # get_role is needed for GET /v3/roles/{role_id} requests # this is mandatory for the OpenStack SDK to properly process role assignments # which are issued by role id instead of name \"identity:get_role\": \"(rule:is_domain_manager and rule:is_domain_managed_role) or rule:admin_required\" # allow domain admins to manage users within their domain \"identity:list_users\": \"(rule:is_domain_manager and token.domain.id:%(target.domain_id)s) or rule:admin_required\" \"identity:get_user\": \"(rule:is_domain_manager and token.domain.id:%(target.user.domain_id)s) or rule:admin_required\" \"identity:create_user\": \"(rule:is_domain_manager and token.domain.id:%(target.user.domain_id)s) or rule:admin_required\" \"identity:update_user\": \"(rule:is_domain_manager and token.domain.id:%(target.user.domain_id)s) or rule:admin_required\" \"identity:delete_user\": \"(rule:is_domain_manager and token.domain.id:%(target.user.domain_id)s) or rule:admin_required\" # allow domain admins to manage projects within their domain \"identity:list_projects\": \"(rule:is_domain_manager and token.domain.id:%(target.domain_id)s) or rule:admin_required\" \"identity:get_project\": \"(rule:is_domain_manager and token.domain.id:%(target.project.domain_id)s) or rule:admin_required\" \"identity:create_project\": \"(rule:is_domain_manager and token.domain.id:%(target.project.domain_id)s) or rule:admin_required\" \"identity:update_project\": \"(rule:is_domain_manager and token.domain.id:%(target.project.domain_id)s) or rule:admin_required\" \"identity:delete_project\": \"(rule:is_domain_manager and token.domain.id:%(target.project.domain_id)s) or rule:admin_required\" \"identity:list_user_projects\": \"(rule:is_domain_manager and token.domain.id:%(target.user.domain_id)s) or rule:admin_required\" # allow domain managers to manage role assignments within their domain # (restricted to specific roles by the 'is_domain_managed_role' rule) # # project-level role assignment to user within domain \"is_domain_user_project_grant\": \"token.domain.id:%(target.user.domain_id)s and token.domain.id:%(target.project.domain_id)s and rule:is_domain_managed_role\" # project-level role assignment to group within domain \"is_domain_group_project_grant\": \"token.domain.id:%(target.group.domain_id)s and token.domain.id:%(target.project.domain_id)s and rule:is_domain_managed_role\" # domain-level role assignment to group \"is_domain_level_group_grant\": \"token.domain.id:%(target.group.domain_id)s and token.domain.id:%(target.domain.id)s and rule:is_domain_managed_role\" # domain-level role assignment to user \"is_domain_level_user_grant\": \"token.domain.id:%(target.user.domain_id)s and token.domain.id:%(target.domain.id)s and rule:is_domain_managed_role\" \"domain_manager_grant\": \"rule:is_domain_manager and (rule:is_domain_user_project_grant or rule:is_domain_group_project_grant or rule:is_domain_level_group_grant or rule:is_domain_level_user_grant)\" \"identity:check_grant\": \"rule:domain_manager_grant or rule:admin_required\" \"identity:list_grants\": \"rule:domain_manager_grant or rule:admin_required\" \"identity:create_grant\": \"rule:domain_manager_grant or rule:admin_required\" \"identity:revoke_grant\": \"rule:domain_manager_grant or rule:admin_required\" \"identity:list_role_assignments\": \"(rule:is_domain_manager and token.domain.id:%(target.domain_id)s) or rule:admin_required\" # allow domain managers to manage groups within their domain \"identity:list_groups\": \"(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s) or rule:admin_required\" \"identity:get_group\": \"(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s) or rule:admin_required\" \"identity:create_group\": \"(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s) or rule:admin_required\" \"identity:update_group\": \"(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s) or rule:admin_required\" \"identity:delete_group\": \"(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s) or rule:admin_required\" \"identity:list_groups_for_user\": \"(rule:is_domain_manager and token.domain.id:%(target.user.domain_id)s) or rule:admin_required\" \"identity:list_users_in_group\": \"(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s) or rule:admin_required\" \"identity:remove_user_from_group\": \"(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s and token.domain.id:%(target.user.domain_id)s) or rule:admin_required\" \"identity:check_user_in_group\": \"(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s and token.domain.id:%(target.user.domain_id)s) or rule:admin_required\" \"identity:add_user_to_group\": \"(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s and token.domain.id:%(target.user.domain_id)s) or rule:admin_required\" Specifying manageable roles via \"is_domain_managed_role\"​ The \"is_domain_managed_role\" rule of the above policy template may be adjusted according to the requirements of the CSP and infrastructure architecture to specify different or multiple roles as manageable by Domain Managers as long as the policy rule adheres to the following: the \"is_domain_managed_role\" rule MUST NOT contain the \"admin\" role, neither directly nor transitively the \"is_domain_managed_role\" rule MUST define all applicable roles directly, it MUST NOT contain a \"rule:\" reference within itself Example: permitting multiple roles​ The following example permits both the \"member\" and \"reader\" role to be assigned/revoked by a Domain Manager. Further roles can be appended using the logical or directive. \"is_domain_managed_role\": \"'member':%(target.role.name)s or 'reader':%(target.role.name)s\" Note regarding the domain-manager role When adjusting the \"is_domain_managed_role\" rule a CSP might opt to also include the \"domain-manager\" role itself in the manageable roles, resulting in Domain Managers being able to propagate the Domain Manager role to other users within their domain. This increases the self-service capabilities of the customer but introduces risks of Domain Managers also being able to revoke this role from themselves or each other (within their domain) in an unintended fashion. CSPs have to carefully evaluate whether Domain Manager designation authority should reside solely on their side or be part of the customer self-service scope and decide about adding \"'domain-manager':%(target.role.name)s\" to the rule accordingly.","s":"Policy adjustments","u":"/standards/scs-0302-v1-domain-manager-role","h":"#policy-adjustments","p":2037},{"i":2061,"t":"Description: Upstream bug report about the underlying architectural issue of the admin role not being properly scoped and giving system-level admin permissions regardless of whether the admin role assignment was scoped to project or domain level. This is the main reason for the admin role being inappropriate to implement Domain Managers. Link: Launchpad bug: \"admin\"-ness not properly scoped","s":"\"admin\"-ness not properly scoped","u":"/standards/scs-0302-v1-domain-manager-role","h":"#admin-ness-not-properly-scoped","p":2037},{"i":2063,"t":"Description: Upstream rework of the default role definitions and hierarchy across all OpenStack services. Aims to introduce support for a scoped manager role by 2024 but only focuses on project-level scoping for this role so far, not domain-level. Link: OpenStack Technical Committee Governance Documents: Consistent and Secure Default RBAC","s":"Consistent and Secure Default RBAC","u":"/standards/scs-0302-v1-domain-manager-role","h":"#consistent-and-secure-default-rbac","p":2037},{"i":2065,"t":"There is a test suite in domain-manager-check.py. The test suite connects to the OpenStack API using two sample domains and corresponding Domain Manager accounts. It verifies the compliance to the standard and the proper domain-scoping as defined by the Keystone policy. Please consult the associated README.md for detailed setup and testing instructions.","s":"Conformance Tests","u":"/standards/scs-0302-v1-domain-manager-role","h":"#conformance-tests","p":2037},{"i":2068,"t":"Allow flexibility for the roles a Domain Manager can assign/revoke within domain​ Decision Date: 2023-09-27 Decision Maker: Team IaaS, Team IAM Decision: the standard should not strictly limit the roles a Domain Manager can assign/revoke to/from other users within a domain to the \"member\" role the standard should allow CSPs to define one or more roles for Domain Managers to manage whether or not this includes the Domain Manager role itself is not to be predefined by the standard and should be up to the CSP to decide instead the standard should only strictly prohibit adding the \"admin\" role to the list of roles manageable by Domain Managers Rationale: the available and configured roles might differ between CSPs and infrastructures the Domain Manager standard should be flexible enough to adapt to different environments while still offering the intended functionality there might be a tradeoff between self-service flexibility desired by customers and the security regulation a CSP wants to impose, thus allowing or prohibiting the designation of Domain Managers by customers themselves should be up to the CSP to decide Links / Comments / References: Team IaaS meeting protocol entry Extend domain management functionality to Keystone groups​ Decision Date: 2023-08-04 Decision Maker: SIG IAM Decision: the Domain Manager Standard configuration should cover the groups functionality of Keystone, allowing domain manager to manage groups in domains Rationale: the groups functionality is a desired IAM feature for customers Links / Comments / References: SIG IAM meeting protocol entry action item issue Change the naming of the Domain Manager role​ Decision Date: 2023-08-04 Decision Maker: SIG IAM Decision: the Domain Manager role should be named \"domain-manager\" not \"domain-admin\". Rationale: avoid confusion with the unscoped admin role and to be inline with the upstream plan: Default Service Role - Identity Specs Links / Comments / References: SIG IAM meeting protocol entry issue commment about decision OpenStack Documentation: Role-Based Access Control Overview↩ Launchpad bug: \"admin\"-ness not properly scoped↩ OpenStack Documentation: Keystone for Other Services - Domain Scope↩ OpenStack Documentation: Administering Applications that use oslo.policy↩","s":"Decision Record","u":"/standards/scs-0302-v1-domain-manager-role","h":"#decision-record","p":2037},{"i":2071,"t":"When CSPs try to enroll a new customer they encounter themselves in a situation where they have to choose names for the openstack domain, project and user.","s":"Introduction","u":"/standards/scs-0301-v1-naming-conventions","h":"#introduction","p":2069},{"i":2073,"t":"Create a naming convention to use during the provisioning of the users and groups through an openstack domain.","s":"Motivation","u":"/standards/scs-0301-v1-naming-conventions","h":"#motivation","p":2069},{"i":2075,"t":"OPTIONAL","s":"Design Considerations","u":"/standards/scs-0301-v1-naming-conventions","h":"#design-considerations","p":2069},{"i":2077,"t":"PS approach to naming​ For naming the customers the suggestion from PS is the following: A prefix will be use to differenciate domain, project and user in the openstack environment. The project name is also added as a sufix. So the onboaring tool will create the following structure for a new customer onboarded in the system. domain: d project: p- user: u- For the customer also a domain admin group and a project admin group are created. Please note that, at the time of writing, PCO is not making any use of OpenStack domains to isolate customers. So, for the scope of this document, the term \"domain admin\" is used in a conceptual way rather than referring to the specific OpenStack implementation. For the scope of this document \"domain admins\" can do things like creating projects, creating users and granting users access to some projects (within the domain of course). \"Users\" can create and view resources within the projects that they have been granted access to by the \"domain admin\". These groups use the prefix \"gd\" for domain group and \"gp\" for group project and are build like the following: domain admin group: gd-member project admin group: gp--member For the creation of a domain a new domain admin group is created. openstack domain create d000001 openstack group create gd000001-member When a project is created a new admin group for that project is created. openstack project create p000001-scs_dev_project openstack group create p000001-scs_dev_project-member After the creation of a project it is necessary to assign roles to the new groups. openstack role add --group gd000001-member --project p000001-scs_dev_project $role openstack role add --group gp000001-scs_dev_project-member --project p000001-scs_dev_project $role For the creation of regular non admin users, the accounts will be added to the \"domain admin\" group to give them access to all projects within the domain. openstack user created u000001-user1 openstack group add user gd000001-member u000001-user1 In the case of machine accounts, they are only added to the specific \"project admin\" groups. openstack user created u000001-svc_user_project openstack group add user gp000001-scs_dev_project-member u000001-svc_user_project In case of using federation, there are suggestions to the namings within Keycloak. The realms in Keycloak for each customer would be the same as the customer. e.g. The Keycloak realm for \"Customer A\" will be called \"Customer A\". There should be an OIDC client in each customer realm to allow the federation to the Proxy realm. Currently called OSISM on the testbed. On the proxy realm, it's needed to add this new customer realm as an idenity provider. During the creation of the identity provider for \"Customer A\", the field \"Alias\" should be set to . This will make that the users federated from realm \"Customer A\" to the proxy realm to be prefixed to avoid naming colisions, e.g. d${ALIAS}-${CLAIM.preferred_username}. Also, on the identity federation there should be configured to store the from that realm into the users. So it can be send to Keystone mapping to use it as gd-member and gp--member. There is also the necessity of a mapper to send the openstack-default-project. Add the aditional mappings for roles and groups as necessary to get the attributes from the customer realm into the OIDC userinfo that is put into the OIDC to the proxy realm and from there to Keystone. Option 2​ Option 2 description","s":"Options considered","u":"/standards/scs-0301-v1-naming-conventions","h":"#options-considered","p":2069},{"i":2079,"t":"RECOMMENDED","s":"Open questions","u":"/standards/scs-0301-v1-naming-conventions","h":"#open-questions","p":2069},{"i":2081,"t":"Decision","s":"Decision","u":"/standards/scs-0301-v1-naming-conventions","h":"#decision","p":2069},{"i":2083,"t":"Related Documents, OPTIONAL","s":"Related Documents","u":"/standards/scs-0301-v1-naming-conventions","h":"#related-documents","p":2069},{"i":2085,"t":"Conformance Tests, OPTIONAL","s":"Conformance Tests","u":"/standards/scs-0301-v1-naming-conventions","h":"#conformance-tests","p":2069},{"i":2088,"t":"Creating and maintaining IT infrastructure is a complex task. Any kind of consumer (e.g. operators, cutsomers) can be supported by presenting the status of all possible parts of the serving infrastructure. Whether a service is not reachable or the used hardware is having an outage we want the consumers to be easily informed by using a \"Status Page\" application. The need for a \"Status Page\" came up early in the SCS project and the requirements a \"Status Page\" application has to fulfill were defined and written down on 2022-06-02 as a MVP-0 epic. The upcoming research on existing solutions came to the conclusion that we want to create a new \"Status Page\" application.","s":"Introduction","u":"/standards/scs-0400-v1-status-page-create-decision","h":"#introduction","p":2086},{"i":2090,"t":"Since we want to use as much as possible from existing projects and contribute to upstream projects to support the community with our efforts, it was a hard decision to create a new \"Status Page\" application. Before the decision was made some existing and known applications were tested and analyzed if they would fit to our use case. An overview of this comparison can be found below in this document While this is not a complete list of all existing applications it did capture the most promising ones from the awesome-status-page list in order to have base to decide upon. Work on an existing project only makes sense if the project is healthy OR can be brought into a healthy state. If upstream does not accept patches a fork is needed. The fork however only makes sense if the underlying technology is worth to be maintained. The possible candidates did not fulfill these conditions - in the cases where contribution seemed possible the candidates looked abandoned and long existing CVEs weren't worked on.","s":"Existing Applications","u":"/standards/scs-0400-v1-status-page-create-decision","h":"#existing-applications","p":2086},{"i":2092,"t":"Based on the results the decision was made, that the effort is likely to be the same if we pick up an existing project and try to get it in shape for our use case. It was not 100% clear if this would even be possible or if we still would have to maintain our own additional patches. So there will be a reference implementation that will match the requirements we have. In addition there will be an architecture design documentation. So if the reference implementation may not fit to you, it will be possible to create your own application.","s":"Decision","u":"/standards/scs-0400-v1-status-page-create-decision","h":"#decision","p":2086},{"i":2094,"t":"The status page application should be simplistic in software design and should not depend on a large variety of services simplistic, yet existing user management for write access (oauth? OIDC?) Simple RBAC (role based access control) is nice to have support that components are only visible to a subset of users implies that there is a role that is read-only On-Prem use case might be handled by having an authenticating reverse proxy in front The status page applicaton should allow for simple and easy theming Page = (Possibly simple) Web-UI As a CSP, I want to have a status page that allows to define locations and similar grouping (AZs, ...) define components globally or per location to ease maintenance I want to define per component where it belongs so that I only have to define a component once, but have it visible in several locations status per component should be allowed to be toggleable per location or overall * a component should allow for several statuses, that are defined by me Status, Status Items should be easy to extract REST(less)-API to interact with API should be versioned this allows for embedding status information in other applications, such as cloud dashboards this also allows for submitting items from other tooling incoming webhooks (https POST) should be supported (e.g. for air-gapped setups) – i.e. submitting a health beacon every x seconds web-UI wanted for posting updates as well Token based Auth Configuration should be manageable with YAML files (imho this annoys me using Uptime Kuma) As a consumer of the status page, I'd like to subscribe to events on the status page via e-mail for everything for specific components As a consumer of the status page, I'd like to subscribe to an RSS or atom feed Allow for the ability to trigger webhooks upon certain events (to submit info to other systems via webhooks, e.g. chat/messenger) As a CSP Operator, I want to be able to flag a component with a new status quick and easy to minimize the probability of making errors, updating the status of a component should not be hard brainwork updates can be both machine generated status changes (triggered e.g. by health monitoring) as well as updates from human operators updating a status should allow the CSP Operator to do that in a fashion that either pushes infos to the subscribers or just updates the status on the status page updating the status can either be toggling the status of the component or can be accompanied by additional textual information. When updating a status with textual information the status page application should make it easy for me as the CSP Operator to do in a way that if different people submit infos over time they are presented in a similar way (eg. the status page application should guide so that the resulting infos are presented in a identical way. Example: when updating infos of an incident over time the timeline should automatically be sorted by the status page application so that it does not depend on the Operator whether the newest info is on top or at the bottom. This is typical thing that varies if several people update items Allow for templates for certain types of incidents User-specific monitoring (how are MY instances, load-balancers, ... doing?) is OUT OF SCOPE for the status page. But having it would be useful and if we have something like this, link it from the status page (and a link to horizon might be the default) Sidenote: External hosting is desired to avoid status page going down with infra With those requirements in mind the projects that initially were found, were evaluated.","s":"Status Page Requirements","u":"/standards/scs-0400-v1-status-page-create-decision","h":"#status-page-requirements","p":2086},{"i":2096,"t":"CachetHQ ClearStatus ciao cState Gatus Issue Status statusfy CSP VIEW small dependency tree ❌ Composer ✅ ❌ ruby gems ✅ ⁇ helm chart ❌ npm/github/zapier ❌ npm dependencies very huge easy themable ✅ ❌ ❌ ❌ ❌ ❌ ✅ grouping (by location...) ✅ ❌ ❌ ❌ ✅ ⁇ ✅ components definition ... ... local or global ✅ ❌ ❌ ✅ ⁇ ✅ ❌ ... easy flagging with new status ✅ ✅ ❌ ✅ ⁇ ✅ ❌ ... push notification on update ✅ ❌ ✅ ❌ ✅ ⁇ ✅ ... updates with additional information ✅ ✅ ❌ ✅ ⁇ ⁇ ⁇ API Support ... ✅ ✅ ✅ ❌ read only ❌ ✅ GitHub API ❌ ... versioned ✅ ❌ ❌ ❌ ❌ ✅ ⁇ ... web ui for posting updates ✅ ✅ ❌ ✅ ❌ ❌ ❌ ... token based auth ✅ ✅ Auth managed by git provider ❌ only basic auth ❌ ❌ BUT OIDC! ✅ ❌ manageable configuration ❌ config depends on web server and initial install relies on env variables ❌ based on hugo CMS ❌ config by env variables ❌ based on hugo CMS ✅ ❌ ❌ no real config needed templating support ✅ twig ❌ Hugo itself uses GO template libraries ❌ ❌ ❌ ❌ ❌ CUSTOMER VIEW subscription support ... ✅ ❌ only by git provider ✅ ❌ ❌ ✅ ✅ ... send by eMail ✅ ❌ ✅ ❌ ✅ ✅ ❌ watchdog for status page support ⁇ ⁇ ✅ ❌ ✅ ⁇ ❌ trigger webhook support ❌ needs cachet-monitor ⁇ ✅ ⁇ ✅ ⁇ ❌ additional infos - basically a theme for hugo cms, depends on netlify cms - basically a theme for hugo cms, depends on netlify cms - It's highly optimized for github pages SPA created with netlify hidden components ✅ ❌ ❌ ❌ ❌ ❌ ❌ user management ✅ ❌ ❌ ❌ ✅ by OIDC ⁇ through github? ❌ different output format on notification ❌ ❌ ✅ ✅ ✅ ❌ ✅ external hosting ✅ ✅ ✅ ✅ ✅ ❌ looks like you are limited to github ✅ project healthy ❌ last commit 17 months ❌ last commit 3 years ❌ last commit 5 months ✅ last commit 2 months ✅ recent activities ✅ recent activities ❌ archived and abondend by the owner documentation ✅ API ❌ User Documentation ❌ ❌ ❌ ✅ ⁇u ❌ not reachable anymore git based ❌ ✅ ❌ ✅ ❌ ✅ ⁇ a netlify based installation is able to communicate with github project page https://cachethq.io/ https://github.com/weeblrpress/clearstatus https://www.brotandgames.com/ciao/ https://cstate.netlify.app/ https://gatus.io/ https://github.com/tadhglewis/issue-status https://marquez.co/statusfy","s":"Comparison matrix","u":"/standards/scs-0400-v1-status-page-create-decision","h":"#comparison-matrix","p":2086},{"i":2099,"t":"While defining the OpenAPI spec some considerations and decisions are made and should be documented.","s":"Introduction","u":"/standards/scs-0402-v1-status-page-openapi-spec-decision","h":"#introduction","p":2097},{"i":2101,"t":"The key words \"MUST\", \"MUST NOT\", \"REQUIRED\", \"SHALL\", \"SHALL NOT\", \"SHOULD\", \"SHOULD NOT\", \"RECOMMENDED\", \"MAY\", and \"OPTIONAL\" in this document are to be interpreted as described in RFC 2119. In addition, \"FORBIDDEN\" is to be interpreted equivalent to \"MUST NOT\".","s":"Requirements","u":"/standards/scs-0402-v1-status-page-openapi-spec-decision","h":"#requirements","p":2097},{"i":2103,"t":"The spec should be as minimal as possible, while being as understandable as possible, so some choices to the design of API objects, requests and responses are made.","s":"Motivation","u":"/standards/scs-0402-v1-status-page-openapi-spec-decision","h":"#motivation","p":2097},{"i":2106,"t":"Some defined schemas are used as common types. These common definitions help to simplify the actual object definitions by providing meaningful names, and reduce duplication. A change of ID type for example only needs one change in the common definition, and not in any of the object definitions which include an ID. Special mentions: Id​ IDs are used for identification of resources, which can be retrieved by the API. UUIDs are used, to ensure uniqueness. Also, they can be visually recognized as identifier. Incremental​ An Incremental is used in combination with other identifiers to identify a sub resource of any kind. Incrementals themselves are not globally unique, but unique for every sub resource of an unique resource. Generation and order​ Generation and Order are predefined objects which include a Incremental typed field for the common usages of the Incremental value.","s":"Common definitions","u":"/standards/scs-0402-v1-status-page-openapi-spec-decision","h":"#common-definitions","p":2097},{"i":2108,"t":"All objects which are used as payload, either as request or response, are defined by schemas. This centralizes the maintanence of field names and types, for both requests and responses.","s":"API objects","u":"/standards/scs-0402-v1-status-page-openapi-spec-decision","h":"#api-objects","p":2097},{"i":2110,"t":"Most fields of objects are not required. This allows usage as request and response payloads. Responses of payload objects, which contain an ID or an Incremental typed field, MUST fill the ID or Incremental field to fully identify the (sub) resource. Requests on a single resource MUST contain the ID in the path parameters. Request on sub resources MUST contain the ID and Incremental typed value as path parameters. The payload SHOULD NOT contain the ID or Incremental typed field. If it contains these fields as payload, they SHALL NOT change them. Requests to updating operations SHOULD contain the minimum of the changed fields, but MAY contain the full object. ID and Incremental typed fields MUST follow the same rules as stated above.","s":"API object fields","u":"/standards/scs-0402-v1-status-page-openapi-spec-decision","h":"#api-object-fields","p":2097},{"i":2112,"t":"The endpoints are named in plural form, even when handeling single objects, to keep uniform paths.","s":"Endpoint naming","u":"/standards/scs-0402-v1-status-page-openapi-spec-decision","h":"#endpoint-naming","p":2097},{"i":2114,"t":"The list of phases that an incident can go through has a crucial order. So it MUST be handled as the given list. Delete or update operations are FORBIDDEN. To \"change\" a phase list, a new one must be created. The old one must be kept. For this mechanic the lists are structured in generations. All references to phases MUST include their generation to ensure correct references. To reference a single phase a PhaseReference MUST include a generation and an order field. This MAY be used to reference a single generation too.","s":"Phase list","u":"/standards/scs-0402-v1-status-page-openapi-spec-decision","h":"#phase-list","p":2097},{"i":2116,"t":"Labels are identifying metadata to components. They do not represent a resource or sub resource of any kind. They are designed as non system critical pieces of information, mainly intended for human consumption. Labels are simple key/value pairs attached to components, categorizing them dynamically.","s":"Labels","u":"/standards/scs-0402-v1-status-page-openapi-spec-decision","h":"#labels","p":2097},{"i":2118,"t":"An impact defines the relation between an incident and a component. A component can be affected by multiple incidents and an incident can affect multiple components. Each of these impacts can have a different type depending on the incident and component, like for example connectivity or performance issues. To reflect this, each component and incident can have a list of impacts, stating the type of impact and a reference to the incident or component, it refers to.","s":"Impact","u":"/standards/scs-0402-v1-status-page-openapi-spec-decision","h":"#impact","p":2097},{"i":2120,"t":"Components list their impacts, which they are affected by, as read only. Only an incident creates an impact on a component. Components MUST only list their currently active impacts.","s":"Component impacts","u":"/standards/scs-0402-v1-status-page-openapi-spec-decision","h":"#component-impacts","p":2097},{"i":2122,"t":"Generally POST requests create new resources. These endpoints do not return the new resource, but a unique identifier to the resource e.g. an UUID. In most cases the new resource won't be used directly after creation. Most often list calls are used. If the new resource is used directly, it can be retrieved by the returned identifier. Payloads to POST requests SHALL NOT include ID or Incremental typed fields, it lies in the responsibility of the API server to assign IDs and Incrementals to objects.","s":"Return of POST requests","u":"/standards/scs-0402-v1-status-page-openapi-spec-decision","h":"#return-of-post-requests","p":2097},{"i":2124,"t":"Most commonly PATCH requests are used to partially or fully change a resource. These requests do not respond with the changed resource, nor an identifier. Both the old state as well as the new state are known on the client at that point in time and if they need to load the actual recent version from the server, the identifier is already known.","s":"Return of PATCH requestes","u":"/standards/scs-0402-v1-status-page-openapi-spec-decision","h":"#return-of-patch-requestes","p":2097},{"i":2126,"t":"The PUT requests is most commonly used to update full objects, whereas PATCH is used for partial updates. PATCH is used as the default method for updating resources because it does not require the full object for an update, but does not discourage the use of the complete object.","s":"PATCH vs PUT for updating resources","u":"/standards/scs-0402-v1-status-page-openapi-spec-decision","h":"#patch-vs-put-for-updating-resources","p":2097},{"i":2128,"t":"The API spec does not include either authentication (AuthN) nor authorization (AuthZ) of any kind. The API server MUST be secured by an reverse/auth proxy.","s":"Authentication and authorization","u":"/standards/scs-0402-v1-status-page-openapi-spec-decision","h":"#authentication-and-authorization","p":2097},{"i":2131,"t":"In the past we noticed missing events in the telemetry stack of OpenStack. This results in situations where the Cloud Service Provider (CSP) may think that a resource is still in use while the owner shut it down, or may not be aware of a resource which has been created. Such inaccurate data is a problem, when it is supposed to be used for billing purposes. This document discusses how such metering data should be stored within the SCS. In partiuclar, it provides rationale for the choice of Gnocchi as time-series database for metering data within SCS.","s":"Introduction","u":"/standards/scs-0410-v1-gnocchi-as-metering-database","h":"#introduction","p":2129},{"i":2133,"t":"TSDB, time-series database: Database which is specialised for storing data which is keyed by a timestamp. Popular examples are InfluxDB, Graphite, rrd, and Prometheus. Metering: Collection of usage data of a cloud, for the specific purpose of creating invoices to bill customers for the resources they have allocated. backfilling: The process of adding and modifying data in the past within a time-series database. Metric: A single time-series vector. Typically, a metric represents a single property of a resource, such as CPU usage of an instance. Resource metrics: A group of metrics belonging to a single resource. A compute instance, for instance, may have a metric indicating the number of CPUs allocated, another metric indicating the amount of RAM allocated, etc.","s":"Definitions","u":"/standards/scs-0410-v1-gnocchi-as-metering-database","h":"#definitions","p":2129},{"i":2135,"t":"Being able to hold users accountable for the resources they use is a prerequisite for commercially operating a cloud. The SCS project wants to deliver a cloud stack which can be used for that purpose, hence providing reliable metering data is a requirement. As metering data is inherently keyed by time, a time-series database is required. The choice of time-series database is an important one as different databases come with different trade-offs. Not all databases are suitable for the kind of data which is collected in a metering context.","s":"Motivation","u":"/standards/scs-0410-v1-gnocchi-as-metering-database","h":"#motivation","p":2129},{"i":2137,"t":"The following requirements for a time-series database exist: MUST support backfilling: As we need to catch up on changes to resources which may have happened during a brief network interruption, we need to be able to modify data after it has been written to the TSDB. MUST be able to handle lots of resources: As billing should happen with a resource-level granularity, we expect a lot of different metrics inside the TSDB. MUST scale to different timescales: We expect to have metrics which change frequently (e.g. object store usage) and metrics which change rarely (e.g. cinder volume sizes). The TSDB must be able to cope with both types of metrics efficiently. SHOULD provide an efficient way to query all currently alive resources. SHOULD allow truncation of storage to remove old data. MUST be available under an appropriate Open Source license, even for productive use cases.","s":"Design Considerations","u":"/standards/scs-0410-v1-gnocchi-as-metering-database","h":"#design-considerations","p":2129},{"i":2139,"t":"Using Gnocchi​ Gnocchi is a time-series database which has its origins in the OpenStack ecosystem. It supports all requirements except truncation, which might have to be implemented. Using Prometheus​ Prometheus is a widely used time-series database with its focus on monitoring and incident response. While it is considered efficient for this use-case, it has shortcomings which make it unsuitable for the metering use case: Explicit recommendation against high-cardinality metrics: As we would have to label metrics by resource IDs and project IDs, we have to expect a very high cardinality, also with a significant amount of metric churn. Backfilling, albeit possible, is not well-supported. Using InfluxDB​ InfluxDB is a widely used time-series database with its focus on monitoring. In contrast to Prometheus, it does support backfilling. However, like Prometheus, it seems to run into scalability issues in high-cardinality scenarios. In addition, clustering is only available in commercial licensing options. Creating a custom TSDB implementation​ A custom TSDB implementation is a non-trivial project to pursue.","s":"Options","u":"/standards/scs-0410-v1-gnocchi-as-metering-database","h":"#options","p":2129},{"i":2141,"t":"We use Gnocchi. According to research, it mostly fulfills the requirements. While some small development efforts may be needed, to make it fully usable, the amount of work is anticipated much less than making Prometheus or Influx fit the bill (due to backfilling / cardinality scaling constraints), let alone rolling a custom implementation.","s":"Decision","u":"/standards/scs-0410-v1-gnocchi-as-metering-database","h":"#decision","p":2129},{"i":2143,"t":"What will be the granularity of the events meta information? If we decide to use resource metadata as a place to store slow-changing information (e.g. instance flavors, volume sizes), we need to know what the granularity of that is.","s":"Open questions","u":"/standards/scs-0410-v1-gnocchi-as-metering-database","h":"#open-questions","p":2129},{"i":2145,"t":"SCS-0411-v1","s":"Related Documents","u":"/standards/scs-0410-v1-gnocchi-as-metering-database","h":"#related-documents","p":2129},{"i":2147,"t":"None (this is a decision record).","s":"Conformance Tests","u":"/standards/scs-0410-v1-gnocchi-as-metering-database","h":"#conformance-tests","p":2129},{"i":2150,"t":"For the reference implementation of the status page API defined by the OpenAPI spec some decision should be made to which technlogy to be used and why. A reference implementation should be of use to most of the intended group, but is not necsessarily applicable for every use case.","s":"Introduction","u":"/standards/scs-0401-v1-status-page-reference-implementation-decision","h":"#introduction","p":2148},{"i":2152,"t":"For a reference implementation to be of any use, some common and widely used technologies should be used, so it's useful to most of the intended user group.","s":"Motivation","u":"/standards/scs-0401-v1-status-page-reference-implementation-decision","h":"#motivation","p":2148},{"i":2155,"t":"The status page application consists of an api server as well as a frontend. For implementing the api server, which is generated from the OpenAPI spec, Go was chosen, because of maturity and wide spread usage as industry standard. Go, in particular, is a modern programming language and is commonly used in network and cloud computing environments.","s":"Programming Language","u":"/standards/scs-0401-v1-status-page-reference-implementation-decision","h":"#programming-language","p":2148},{"i":2157,"t":"As database, PostgreSQL was chosen, since it is a mature, well-known database. PostgreSQL can be run in various environments from small setups to scaled setups. Furthermore PostgreSQL is a very healthy project with an active community and a solid license. It easily passed the SCS OSS health check.","s":"Database","u":"/standards/scs-0401-v1-status-page-reference-implementation-decision","h":"#database","p":2148},{"i":2160,"t":"In the past we noticed missing events in the telemetry stack of OpenStack. This results in situations where the Cloud Service Provider (CSP) may think that a resource is still in use while the owner shut it down, or may not be aware of a resource which has been created. Such inaccurate data is a problem, when it is supposed to be used for billing purposes. This document discusses how such metering data should be made available to the cloud service provider for forwarding into their own billing solution.","s":"Introduction","u":"/standards/scs-0411-v1-publishing_method_for_metering_data","h":"#introduction","p":2158},{"i":2162,"t":"Push-based flow: In a push-based flow, the system generating data actively sends that data to a consumer. Pull-based flow: In a pull-based flow, the system generating data waits for the system consuming the data to ask for that data. Metering: Collection of usage data of a cloud, for the specific purpose of creating invoices to bill customers for the resources they have allocated. Billing: The entire process of creation, management and sending of invoices generated from metering data.","s":"Definitions","u":"/standards/scs-0411-v1-publishing_method_for_metering_data","h":"#definitions","p":2158},{"i":2164,"t":"Being able to bill users for the resources they use is a prerequisite for commercially operating a cloud. The SCS project wants to deliver a cloud stack which can be used for that purpose, hence providing reliable metering data is a requirement. We generally expect that cloud providers already have some kind of customer-relation management or billing system in place. Hence, it is important that the SCS is not too opinionated on this implementation detail, but provides a system which can easily interface with other systems. This is similar to how the SCS specified the monitoring stack.","s":"Motivation","u":"/standards/scs-0411-v1-publishing_method_for_metering_data","h":"#motivation","p":2158},{"i":2166,"t":"The following requirements exist for the process for providing metrics to the cloud service provider: MUST scale to different timescales: We expect to have metrics which change frequently (e.g. object store usage) and metrics which change rarely (e.g. cinder volume sizes).","s":"Design Considerations","u":"/standards/scs-0411-v1-publishing_method_for_metering_data","h":"#design-considerations","p":2158},{"i":2168,"t":"Push-based flow​ In a push-based flow, the to-be-implemented metering system pushes events to the sink as soon as it is reasonably confident that the event can be used for billing purposes. Poll-based flow​ In the poll-based flow, whichever system the CSP runs would be responsible for polling the metering API in a frequency sufficient to capture all data with sufficient granularity.","s":"Options","u":"/standards/scs-0411-v1-publishing_method_for_metering_data","h":"#options","p":2158},{"i":2170,"t":"What is necessary to extend the availability of sending to various sinks? How does the configuration look like that is needed to push to a sink from the same type that will be already implemented?","s":"Open questions","u":"/standards/scs-0411-v1-publishing_method_for_metering_data","h":"#open-questions","p":2158},{"i":2172,"t":"As we need to support very different time scales of data, the push-based flow is more suitable: it allows the producer of the data, which knows about the interval in which it changes, when to provide new data to the consumer. In contrast to that, a poll-based flow would need the consumer to know about change intervals, or alternatively poll in the highest change frequency ever expected.","s":"Decision","u":"/standards/scs-0411-v1-publishing_method_for_metering_data","h":"#decision","p":2158},{"i":2174,"t":"SCS-0410-v1","s":"Related Documents","u":"/standards/scs-0411-v1-publishing_method_for_metering_data","h":"#related-documents","p":2158},{"i":2176,"t":"None (this is a decision record).","s":"Conformance Tests","u":"/standards/scs-0411-v1-publishing_method_for_metering_data","h":"#conformance-tests","p":2158},{"i":2179,"t":"Introduction","s":"Introduction","u":"/standards/scs-XXXX-vN-template","h":"#introduction","p":2177},{"i":2181,"t":"Motivation","s":"Motivation","u":"/standards/scs-XXXX-vN-template","h":"#motivation","p":2177},{"i":2183,"t":"OPTIONAL","s":"Design Considerations","u":"/standards/scs-XXXX-vN-template","h":"#design-considerations","p":2177},{"i":2185,"t":"Option 1​ Option 1 description Option 2​ Option 2 description","s":"Options considered","u":"/standards/scs-XXXX-vN-template","h":"#options-considered","p":2177},{"i":2187,"t":"RECOMMENDED","s":"Open questions","u":"/standards/scs-XXXX-vN-template","h":"#open-questions","p":2177},{"i":2189,"t":"Decision","s":"Decision","u":"/standards/scs-XXXX-vN-template","h":"#decision","p":2177},{"i":2191,"t":"Related Documents, OPTIONAL","s":"Related Documents","u":"/standards/scs-XXXX-vN-template","h":"#related-documents","p":2177},{"i":2193,"t":"Conformance Tests, OPTIONAL","s":"Conformance Tests","u":"/standards/scs-XXXX-vN-template","h":"#conformance-tests","p":2177},{"i":2196,"t":"The Sovereign Cloud Stack project intends to standardise an infrastructure-as-a-service (IaaS) layer. In order to economically sustainably run a cloud, it is generally useful to know which user or tenant consumes which amount of resources in which time frame. Similarly to how the SCS provides an interface for connecting monitoring services to detect outages, this standard aims for providing an interface for connecting systems which aggregate customer resource usage.","s":"Introduction","u":"/standards/scs-0412-v1-metering-json","h":"#introduction","p":2194},{"i":2198,"t":"In general, users of the SCS (i.e. cloud operators) may already have different systems in place for tracking customer relationships as well as billing. Those systems are unlikely to have a uniform interface across all possible implementations. Likewise, those systems are unlikely to have a way to interface with OpenStack, the reference IaaS layer in SCS. In order to provide SCS operators with a way to integrate the SCS IaaS layer with their billing, this document shall provide a standard format, upon which shim conversion layers (to whichever billing system is in place) can be built.","s":"Motivation","u":"/standards/scs-0412-v1-metering-json","h":"#motivation","p":2194},{"i":2200,"t":"In order to define a standard, the various options for formats need to be considered. However, all formats also come with different implementation costs. These aspects are weighed in this section.","s":"Design Considerations","u":"/standards/scs-0412-v1-metering-json","h":"#design-considerations","p":2194},{"i":2202,"t":"Use Ceilometer HTTP hook format​ The OpenStack Ceilometer project, which serves as a hub for all things telemetry and metering, provides an HTTP-based hook to extract metering data. This hook receives JSON-formatted data. Using this data has the advantage that we do not need to implement another component to translate the format which may in turn be a point of failure. Use another format​ In this option, a format for metering data is researched and reused, or defined and specified by the SCS project. This option was not explored deeply, for the reasons explained in the decision.","s":"Options considered","u":"/standards/scs-0412-v1-metering-json","h":"#options-considered","p":2194},{"i":2204,"t":"None.","s":"Open questions","u":"/standards/scs-0412-v1-metering-json","h":"#open-questions","p":2194},{"i":2206,"t":"We chose the Ceilometer HTTP hook format, described below, for the following reasons: Ceilometer is a component which needs to be there anyway for successful metering of OpenStack. Re-using the format makes sense. Using any other format requires a translation layer. However, users will likely need their own translation layer anyway, to integrate the metering with their own infrastructure. Hence, it makes more sense to expose the data from Ceilometer directly. A notable downside of this approach is that a change in Ceilometers format will inevitably cause issues in all downstream consumers.","s":"Decision","u":"/standards/scs-0412-v1-metering-json","h":"#decision","p":2194},{"i":2208,"t":"SCS-0410-v1 SCS-0411-v1","s":"Related Documents","u":"/standards/scs-0412-v1-metering-json","h":"#related-documents","p":2194},{"i":2210,"t":"None.","s":"Conformance Tests","u":"/standards/scs-0412-v1-metering-json","h":"#conformance-tests","p":2194},{"i":2212,"t":"Standards are the core deliverable of SCS. By standardizing the open source software components of a cloud computing stack, their versions, how they are to be configured, deployed and utilized, SCS guarantees the reproducibility of a certain behavior of this technology. SCS standards are discussed, developed and maintained in the community by the corresponding teams (see Track in the table below), which naturally include existing users of SCS.","s":"Overview","u":"/standards/standards/overview","h":"","p":2211},{"i":2214,"t":"Standard Track State Description Active Versions SCS-0001 Global 🟢 Stable Sovereign Cloud Standards v1 SCS-0002 Global 🟢 Stable Standards, Docs and Organisation v2 SCS-0100 IaaS 🟢 Stable Flavor Naming v1 (until 2023-10-31), v3 SCS-0102 IaaS 🟢 Stable Image Metadata v1 SCS-0210 KaaS 🟢 Stable New Version Policy v1 SCS-0211 KaaS 🟢 Stable Default Storage Class v1","s":"Stabilized Standards","u":"/standards/standards/overview","h":"#stabilized-standards","p":2211},{"i":2216,"t":"Standard Track State Description Active Versions SCS-0003 Global 🟠 Draft Sovereign Cloud Standards YAML - SCS-0101 IaaS 🟠 Draft Entropy - SCS-0103 IaaS 🟠 Draft Standard Flavors - SCS-0104 IaaS 🟠 Draft Standard Images - SCS-0300 IAM 🟠 Draft Requirements for SSO identity federation - SCS-0412 Ops 🟠 Draft Exposition of IaaS metering data as JSON -","s":"Drafts","u":"/standards/standards/overview","h":"#drafts","p":2211}],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[["t/3",[0,10.968,1,11.898,2,10.968,3,9.541,4,10.968,5,8.884,6,8.884,7,8.884,8,8.884,9,8.884,10,8.884,11,8.884,12,8.884,13,8.884,14,8.884,15,8.884,16,8.884,17,8.884]],["t/7",[18,4.528,19,2.288,20,3.79,21,4.534,22,3.608,23,1.819,24,4.875,25,2.556,26,5.628,27,6.466,28,3.18,29,3.05,30,2.983,31,4.715,32,4.444,33,4.404,34,4.875,35,4.03,36,6.283,37,4.485,38,4.001,39,2.407,40,3.324,41,5.735,42,5.723,43,4.221,44,4.933,45,4.06,46,4.766,47,5.058]],["t/9",[21,3.85,22,4.766,26,6.041,48,2.332,49,6.281,50,6.94,51,3.532,52,6.156,53,5.837,54,5.295,55,7.899,56,4.738,57,5.837,58,4.86,59,4.727,60,6.743,61,3.202,62,1.705,63,6.571,64,6.94]],["t/11",[35,4.51,43,4.723,45,4.543,46,5.333,65,8.122,66,4.187,67,6.195,68,5.588,69,4.973,70,4.842,71,1.271,72,9.337,73,3.026,74,8.605,75,4.543,76,5.815,77,9.337]],["t/14",[45,4.155,47,5.176,63,6.265,78,6.265,79,7.428,80,7.099,81,4.065,82,8.539,83,5.869,84,5.318,85,8.539,86,7.099,87,4.124,88,9.862,89,4.037,90,7.428,91,8.539,92,4.467,93,8.539,94,7.099,95,4.679,96,2.988,97,5.565,98,3.238,99,8.539,100,6.429,101,5.869,102,6.119]],["t/16",[19,2.747,23,2.183,39,2.889,66,4.492,103,6.528,104,6.33,105,3.337,106,4.257,107,3.892,108,7.542]],["t/18",[22,3.663,39,2.444,48,2.206,62,1.613,70,4.394,73,3.451,84,5.277,96,2.965,109,5.035,110,3.083,111,3.393,112,5.07,113,5.615,114,5.136,115,3.07,116,3.393,117,4.394,118,5.136,119,5.615,120,5.136,121,7.809,122,4.643,123,5.071,124,5.136,125,3.229,126,8.473,127,8.473]],["t/21",[23,2.203,71,1.377,106,4.296,128,9.317,129,4.591,130,7.245,131,8.405,132,5.114,133,4.321]],["t/23",[22,2.957,25,3.215,45,5.473,48,1.78,62,1.302,70,3.547,73,2.216,89,3.233,94,5.685,110,2.489,130,6.635,134,4.613,135,6.839,136,4.613,137,3.459,138,1.78,139,2.225,140,6.132,141,4.977,142,2.836,143,2.943,144,6.839,145,3.547,146,3.126,147,5.149,148,6.302,149,6.302,150,3.995,151,3.642,152,3.029,153,2.287,154,3.577,155,9.259,156,8.533,157,8.054,158,8.054,159,4.457,160,4.7,161,2.811,162,1.864,163,6.302,164,1.863,165,5.949,166,3.487,167,2.287]],["t/25",[22,2.453,25,3.604,62,1.548,73,3.078,75,4.622,105,1.89,110,2.958,113,3.76,119,3.76,120,3.439,138,3.063,142,1.738,157,9.551,158,4.936,162,2.3,163,5.229,164,1.545,165,9.551,166,4.145,168,2.112,169,3.172,170,1.459,171,2.371,172,1.556,173,3.585,174,5.674,175,9.551,176,7.36,177,5.229,178,7.491,179,5.674,180,8.754,181,3.534,182,5.229,183,5.674,184,8.754,185,7.071,186,3.14,187,8.129,188,2.214,189,3.277,190,2.226,191,5.205,192,3.534,193,5.229,194,5.229]],["t/27",[22,3.174,61,2.11,62,2.237,73,2.956,75,2.872,105,1.966,113,2.463,119,2.463,120,2.253,131,3.09,158,6.387,162,2.19,165,10.908,170,0.955,171,2.466,172,1.019,173,2.348,176,6.479,177,3.425,178,7.705,180,8.405,181,4.572,182,5.44,184,3.425,185,5.135,186,2.057,191,3.234,192,3.676,193,5.44,194,5.44,195,3.717,196,3.717,197,1.842,198,1.99,199,4.574,200,2.554,201,3.717,202,5.902,203,7.663,204,3.717,205,3.717,206,3.335,207,3.717,208,3.717,209,3.717,210,3.717,211,3.717,212,8.361,213,5.902,214,5.902,215,7.342,216,3.717,217,5.902,218,2.422,219,2.507,220,3.717,221,2.225,222,3.717,223,1.979,224,2.426,225,3.717,226,3.717,227,3.981,228,3.717,229,5.902,230,3.717,231,3.717,232,3.717,233,3.425,234,3.717,235,3.717,236,5.902,237,3.717,238,3.717,239,3.717,240,3.717,241,1.607,242,3.717,243,3.717,244,3.717,245,3.717,246,1.688,247,3.425,248,3.717,249,3.717,250,1.927,251,2.962,252,3.717,253,3.717,254,3.717,255,5.902,256,3.717,257,4.444,258,3.717,259,3.717,260,3.717,261,2.507,262,2.197,263,2.123,264,3.717]],["t/30",[22,3.81,25,3.343,62,1.678,110,3.207,113,5.84,119,5.84,120,5.342,138,2.841,162,2.386,166,4.494,170,2.265,171,3.682,172,2.416,173,5.568,188,3.229,189,5.09,190,3.458,265,8.813,266,8.122]],["t/32",[22,3.581,62,2.194,73,2.684,75,5.896,113,5.488,119,5.488,120,5.02,162,2.571,170,2.129,171,3.46,172,2.271,173,5.233,185,9.131,186,6.706,188,2.256,266,7.632,267,8.282,268,8.282,269,8.282]],["t/36",[19,1.911,25,1.053,60,2.588,62,2.072,71,1.089,73,1.797,92,1.798,112,2.64,129,1.561,133,3.749,143,1.763,145,1.783,153,3.136,154,1.798,164,0.936,168,1.28,170,0.884,203,4.175,224,1.832,246,1.561,270,6.286,271,4.563,272,1.854,273,2.205,274,4.727,275,1.848,276,3.974,277,3.497,278,4.994,279,5.716,280,7.508,281,4.61,282,2.804,283,2.008,284,1.118,285,1.218,286,1.625,287,1.942,288,1.429,289,3.438,290,2.568,291,2.559,292,1.429,293,3.438,294,3.438,295,3.438,296,3.438,297,6.325,298,2.363,299,6.969,300,1.798,301,3.168,302,3.438,303,3.438,304,3.438,305,5.11,306,3.168,307,7.791,308,2.752,309,1.304,310,3.438,311,3.438,312,3.168,313,1.625,314,2.205,315,3.438,316,2.441,317,3.438,318,1.532,319,3.438,320,3.438,321,3.438,322,3.438,323,3.438,324,2.991,325,3.438,326,1.648,327,1.513,328,1.15,329,2.411,330,2.319,331,2.752,332,3.438,333,3.557,334,2.411,335,2.205,336,3.438,337,2.127,338,4.61,339,1.637,340,2.058,341,2.991,342,1.985,343,2.752,344,3.168,345,3.438,346,1.963,347,3.168,348,3.438,349,1.753,350,1.561,351,1.673,352,3.406,353,1.942,354,1.725,355,3.614,356,3.438,357,2.522,358,3.168,359,2.058,360,3.438,361,1.922,362,2.141,363,1.03]],["t/38",[48,2.72,71,1.119,110,3.801,139,2.674,164,2.239,272,3.494,282,2.174,328,2.749,352,5.049,364,7.575,365,6.176,366,7.15,367,8.22,368,5.046,369,5.615,370,8.22,371,5.119,372,8.22,373,8.22,374,3.554,375,3.618,376,6.58,377,5.418,378,4.338,379,5.649,380,6.189,381,4.983]],["t/40",[19,2.824,147,7.754,282,2.725,363,3.087,382,4.352,383,5.436,384,8.245]],["t/44",[198,3.202,340,5.685,352,5.835,374,4.107,377,4.926,385,7.36,386,9.498,387,9.498,388,6.661,389,5.058,390,4.884,391,11.424,392,9.498,393,8.753,394,9.498]],["t/46",[45,4.919,136,6.819,140,5.906,154,5.289,157,8.795,172,2.772,346,5.774,395,5.114,396,10.11]],["t/48",[56,4.555,282,2.803,328,3.544,397,5.925]],["t/51",[198,3.287,340,5.836,352,5.99,374,4.216,377,5.057,385,7.556,388,6.838,389,5.193,390,5.014,393,8.986,398,9.751,399,9.751,400,9.751]],["t/53",[136,7.079,154,5.491,172,2.878,346,5.995,395,5.309]],["t/55",[56,4.555,282,2.803,328,3.544,397,5.925]],["t/59",[39,2.716,40,3.751,43,4.763,45,5.53,71,1.282,109,4.452,116,3.771,328,3.149,401,6.909,402,5.378,403,3.697,404,5.636,405,6.603,406,3.04,407,3.871]],["t/62",[70,5.341,408,8.245,409,9.492,410,10.299,411,8.96,412,10.299,413,8.562]],["t/64",[62,1.665,70,6.126,139,2.844,206,4.94,408,9.457,409,8.057,411,10.276,414,3.896,415,8.743,416,10.887,417,4.658,418,8.465,419,8.743,420,6.774]],["t/66",[62,2.12,75,4.43,110,3.313,206,5.144,339,4.335,408,8.913,411,9.686,416,8.391,417,4.391,418,7.979,421,4.682,422,2.29,423,9.105,424,11.135,425,9.105]],["t/68",[21,3.456,47,6.244,71,1.402,73,2.605,96,2.813,98,3.049,113,5.327,146,3.675,164,2.19,172,2.204,263,4.592,346,4.592,426,3.359,427,9.492,428,3.476,429,6.436,430,8.039,431,3.436,432,4.643,433,2.605,434,3.323,435,6.053,436,4.243,437,2.585,438,6.053,439,5.637,440,7.557,441,5.637,442,8.039,443,8.039,444,2.445,445,4.542,446,8.039]],["t/70",[23,1.472,29,2.469,41,4.642,47,4.095,62,1.286,71,1.25,146,5.116,291,2.48,349,3.445,353,3.816,427,6.225,434,2.792,440,4.956,447,5.876,448,7.114,449,6.755,450,6.755,451,3.597,452,6.755,453,6.755,454,6.755,455,6.755,456,6.755,457,6.755,458,3.172,459,3.993,460,3.946,461,2.87,462,5.234,463,6.755,464,3.631,465,5.086,466,5.615,467,6.755,468,2.87,469,5.876,470,5.876,471,6.755,472,6.755,473,6.755,474,3.213,475,6.579,476,6.755,477,5.407,478,6.225,479,2.189,480,6.755,481,3.416,482,6.755,483,6.225,484,6.755,485,3.565,486,6.755,487,4.642,488,6.755]],["t/72",[21,3.456,37,4.321,62,1.531,63,5.898,71,1.095,88,7.409,90,6.993,107,3.123,113,5.327,162,1.618,167,3.444,272,2.688,337,2.454,428,3.476,489,8.96,490,4.873,491,4.134,492,4.643,493,3.517,494,8.039,495,4.873,496,3.749,497,2.565,498,3.078,499,6.993,500,6.229,501,3.971,502,4.708,503,8.039,504,7.381,505,8.039,506,8.039,507,5.525]],["t/74",[45,4.254,48,2.276,71,1.479,73,2.833,191,4.79,285,3.099,361,4.888,508,5.364,509,5.897,510,6.763,511,8.743,512,6.582,513,4.656,514,3.397,515,3.413,516,9.028,517,4.162,518,4.286,519,5.108,520,5.524,521,4.387,522,4.105]],["t/76",[28,3.543,48,2.421,71,0.937,73,2.23,132,4.703,133,4.5,139,3.426,142,2.848,153,2.301,170,1.769,172,2.549,191,3.771,263,5.31,285,2.439,330,4.641,337,2.1,382,2.908,496,3.209,510,5.791,514,2.674,523,2.131,524,4.826,525,5.721,526,7.141,527,4.143,528,4.172,529,4.068,530,6.52,531,4.119,532,6.342,533,2.139,534,2.875,535,6.882,536,6.882,537,6.882,538,6.882,539,6.39,540,4.119,541,7.443,542,5.146]],["t/78",[40,3.539,58,4.821,105,2.959,139,2.89,152,3.934,169,4.967,172,2.436,191,4.868,271,4.414,272,2.971,382,3.754,436,4.689,458,3.07,492,5.131,533,2.762,543,4.423,544,6.366,545,5.613,546,3.91,547,5.699,548,8.884,549,3.262,550,7.112]],["t/81",[21,3.85,22,4.766,26,6.041,32,4.77,48,2.332,49,6.281,50,6.94,52,6.156,53,5.837,54,5.295,55,7.899,56,4.738,58,4.86,59,4.727,60,6.743,61,3.202,62,1.705,63,6.571,64,6.94,551,7.791]],["t/83",[26,5.759,32,5.699,50,9.056,92,6.114,146,3.903,150,4.989,167,2.856,172,2.341,272,2.856,292,3.548,329,5.988,552,10.701,553,7.869,554,5.395,555,6.836,556,8.539,557,7.428,558,5.245,559,8.539,560,7.428,561,4.679,562,4.726,563,8.539]],["t/85",[39,3.438,129,4.634,162,2.054,564,7.682,565,5.04,566,5.04,567,10.204]],["t/87",[22,4.107,30,3.396,39,3.667,50,7.36,69,5.058,568,6.661,569,3.411,570,7.36,571,6.19,572,8.753,573,4.804,574,8.753,575,6.093]],["t/90",[39,3.347,139,3.775,161,3.456,162,1.693,170,2.161,285,3.756,337,3.542,493,3.679,576,3.77,577,6.053,578,4.288,579,6.906,580,3.921,581,6.731,582,5.097,583,7.775,584,5.033,585,5.097,586,6.169,587,4.324,588,8.408]],["t/92",[39,1.603,45,2.705,61,1.987,62,2.16,66,2.493,105,1.852,109,2.628,116,2.226,129,2.525,133,2.376,152,2.462,161,3.86,164,1.514,171,2.323,181,4.989,224,1.837,285,3.642,300,2.908,316,4.133,330,6.931,335,3.566,337,3.324,502,2.541,530,3.898,539,3.821,566,2.746,576,4.608,577,5.363,579,3.623,584,3.327,589,4.675,590,4.836,591,6.659,592,5.559,593,5.559,594,6.15,595,2.628,596,2.237,597,3.898,598,4.794,599,4.306,600,5.869,601,5.123,602,2.934,603,2.767,604,2.508,605,4.079,606,2.835,607,3.108,608,4.185,609,5.123,610,2.493,611,2.477,612,3.016,613,7.382,614,2.575,615,3.898,616,4.836,617,3.821,618,3.821,619,2.447]],["t/94",[20,4.067,30,3.941,109,4.234,116,3.586,139,2.914,161,3.682,206,5.06,218,5.837,285,3.175,337,3.644,414,3.991,502,4.094,576,4.016,577,6.296,579,5.837,620,6.418,621,3.991,622,5.837,623,5.578]],["t/96",[22,3.81,50,6.829,109,4.166,116,3.529,139,2.867,161,3.623,285,3.124,337,3.618,342,5.09,502,4.028,572,8.122,573,4.457,574,8.122,575,5.653,576,4.894,577,6.233,579,5.743,620,6.315,623,5.489,624,5.489,625,5.489]],["t/98",[20,4.067,22,3.872,28,3.413,39,3.179,56,3.85,58,4.86,66,4.943,97,5.837,161,4.531,162,2.404,577,5.115,626,5.429,627,6.418,628,5.361,629,6.743,630,5.233,631,6.94,632,6.281]],["t/100",[19,0.94,23,0.747,39,0.988,48,1.44,61,1.978,62,2.489,66,2.48,81,1.632,98,1.3,129,1.556,161,2.274,168,1.276,170,0.881,181,2.134,197,1.069,198,1.155,224,1.132,241,1.482,271,1.379,282,0.907,285,3.752,300,1.793,330,2.311,337,2.436,422,0.862,458,1.184,479,1.111,501,1.693,515,1.338,523,1.061,534,1.432,541,4.428,561,1.878,566,2.732,576,3.118,577,6.047,578,1.748,579,2.233,589,2.753,590,2.981,599,2.973,600,3.159,609,3.158,610,3.118,611,1.527,613,3.158,615,2.403,617,2.355,618,2.355,619,1.508,633,1.86,634,5.531,635,2.743,636,3.427,637,2.271,638,1.089,639,2.849,640,3.427,641,1.957,642,2.271,643,2.655,644,1.762,645,2.456,646,3.427,647,1.482,648,1.979,649,3.427,650,1.655,651,2.743,652,2.198,653,1.936,654,4.428,655,2.849,656,3.427,657,10.438,658,4.812,659,3.427,660,3.427,661,3.427,662,2.026,663,4.23,664,3.158,665,3.427,666,3.427,667,3.427,668,3.427,669,2.743,670,2.514,671,2.58,672,3.427,673,5.531,674,3.427,675,5.201,676,3.738,677,4.428,678,3.427,679,6.954,680,3.427,681,3.427,682,3.427,683,3.427,684,3.427,685,5.567,686,5.097,687,3.427,688,3.427,689,3.427,690,3.158,691,3.427,692,2.456,693,3.427,694,2.743,695,5.531,696,3.427,697,3.427,698,3.158,699,1.693,700,2.743,701,3.427,702,2.58,703,2.355,704,3.427,705,3.427,706,3.427,707,3.427,708,3.427]],["t/104",[25,2.961,62,2.198,161,3.973,162,1.946,172,2.65,223,5.147,622,6.299,637,6.405,709,6.643,710,8.907,711,8.907,712,8.907,713,5.785]],["t/106",[172,2.906,298,7.283,444,3.223,714,9.219]],["t/108",[105,2.959,129,4.035,159,5.79,171,3.712,223,4.731,271,3.576,444,2.702,458,3.07,479,3.856,587,5.64,598,5.317,626,5.385,714,7.728,715,7.728,716,4.423,717,6.565,718,4.775,719,4.389,720,8.187,721,3.07]],["t/110",[271,4.265,626,6.424,716,5.276,722,6.12]],["t/112",[497,3.382,721,3.662,723,6.343,724,5.925]],["t/114",[37,5.642,45,5.107,171,4.386,223,5.59,285,3.72]],["t/116",[497,3.448,725,9.958]],["t/118",[109,4.53,116,3.836,285,3.396,337,3.505,579,6.244,586,7.029,599,5.15,624,5.967,647,4.142,726,6.349,727,7.424,728,7.214,729,7.424,730,5.885]],["t/120",[28,3.063,38,3.855,71,1.402,117,4.169,337,3.469,437,2.585,533,2.499,579,5.239,580,3.749,586,5.898,587,5.844,676,5.536,727,6.229,728,7.755,731,11.027,732,9.492,733,6.229,734,7.409,735,7.409,736,6.993,737,5.637,738,6.229,739,4.495,740,4.495]],["t/122",[28,3.385,109,4.2,116,3.557,161,3.652,190,4.304,223,5.841,337,3.347,361,4.967,521,4.458,529,5.252,533,2.762,579,7.148,587,4.568,624,5.533,731,7.728,736,7.728,741,3.984,742,8.884,743,5.19,744,8.884]],["t/124",[66,4.411,129,4.468,491,5.059,533,3.058,546,4.331,577,5.619,589,4.898,619,5.135,654,7.876,723,5.888,745,9.067]],["t/126",[676,5.752,746,8.896,747,10.7]],["t/129",[23,1.153,45,2.575,56,2.274,62,1.472,71,0.72,73,1.715,110,1.925,129,2.403,152,2.343,154,2.768,167,1.77,172,2.119,190,3.583,271,5.14,272,2.585,274,3.128,284,3.747,286,2.502,291,2.838,305,8.415,306,4.876,308,8.038,309,2.931,328,1.77,422,1.944,447,6.723,533,1.645,589,2.634,607,2.958,651,4.236,655,4.399,719,2.614,721,1.828,746,7.591,748,12.544,749,3.078,750,4.399,751,2.818,752,2.988,753,4.958,754,3.71,755,7.729,756,2.676,757,7.729,758,2.818,759,4.603,760,5.291,761,4.399,762,1.852,763,1.657,764,3.818,765,6.187,766,3.091,767,5.291]],["t/131",[272,3.096,285,3.281,577,5.288,589,4.609,675,7.896,676,6.046,768,8.532,769,6.635,770,7.107,771,6.104,772,9.258,773,11.249,774,9.258]],["t/133",[161,3.973,271,4.646,285,3.426,403,3.144,458,3.34,518,4.738,576,4.334,577,5.52,578,4.929,589,4.812,651,7.737,675,6.299,775,8.408]],["t/135",[21,3.946,56,3.946,66,4.117,152,4.066,328,3.07,389,4.889,431,4.783,448,7.114,514,3.567,533,3.479,589,4.57,607,5.133,619,4.926,651,7.349,723,5.495,775,9.735]],["t/138",[142,2.556,143,3.353,579,8.167,599,6.736,654,8.443,715,9.175,776,5.735,777,8.344,778,7.259,779,10.547,780,6.664,781,6.989,782,8.344,783,9.435]],["t/140",[62,1.477,69,4.13,71,1.37,89,3.667,98,2.941,140,4.531,153,2.594,188,2.113,313,3.667,328,2.594,461,3.296,497,2.475,502,3.545,546,3.414,579,5.054,580,5.21,645,5.558,784,10.064,785,5.558,786,5.439,787,6.447,788,6.209,789,7.756,790,10.064,791,6.447,792,2.604,793,5.054,794,6.447,795,4.975,796,3.456,797,5.558,798,3.667,799,6.447,800,4.642,801,4.43,802,4.83,803,3.353]],["t/142",[28,2.208,38,3.956,45,2.819,62,2.304,71,1.123,142,1.775,153,3.502,251,2.907,272,1.937,307,3.982,375,3.632,417,2.285,444,1.762,501,2.862,579,5.377,604,2.614,654,4.638,657,5.339,699,2.862,783,4.362,792,2.77,804,7.05,805,2.476,806,8.251,807,5.04,808,4.489,809,5.793,810,4.25,811,5.793,812,9.61,813,3.775,814,3.273,815,3.901,816,4.878,817,7.235,818,2.535,819,5.793,820,5.793,821,4.816,822,5.339,823,5.793,824,3.174,825,5.793,826,8.251,827,5.793,828,5.793,829,4.816,830,5.793,831,5.793,832,5.793,833,5.793,834,5.793,835,5.793,836,5.793,837,5.339,838,5.793,839,5.793,840,5.793,841,5.793,842,5.339,843,5.793,844,5.793,845,3.907,846,3.907,847,5.793]],["t/144",[23,1.752,38,3.855,39,2.319,71,1.547,112,3.828,132,4.066,142,3.155,167,2.688,190,3.154,284,2.615,382,5.064,474,2.813,520,5.08,581,6.436,586,9.091,587,6.163,764,3.971,766,4.697,848,8.039,849,8.039,850,5.049,851,5.157,852,8.039]],["t/146",[56,3.98,71,1.261,170,3.24,542,5.124,850,4.539,853,4.886,854,5.231,855,3.253,856,7.174,857,6.363,858,6.033,859,6.033,860,5.541,861,4.976,862,8.532,863,8.532]],["t/148",[71,1.402,132,5.209,133,4.402,190,4.041,587,5.296,595,4.869,647,4.453]],["t/150",[62,1.999,115,2.478,138,1.78,164,2.522,170,2.38,172,2.539,337,2.087,437,2.199,531,5.541,534,2.858,542,3.785,578,4.721,600,3.906,650,3.303,699,3.378,751,3.642,754,6.493,816,4.043,850,4.539,853,5.937,857,4.7,864,5.995,865,6.956,866,4.321,867,2.858,868,5.149,869,3.642,870,3.906,871,6.302,872,6.302,873,4.043,874,3.711,875,9.131,876,5.949,877,5.299,878,6.302,879,5.299,880,6.302,881,4.457,882,3.147,883,5.949,884,5.475,885,4.259]],["t/152",[23,1.528,24,4.097,28,2.673,38,4.516,62,2.258,71,0.955,111,2.808,112,4.484,117,3.637,153,2.345,170,2.421,172,2.582,337,2.14,382,2.963,502,3.206,513,3.735,520,4.431,523,2.172,527,3.125,586,5.146,699,4.652,816,4.146,851,4.499,853,4.97,864,4.006,877,5.434,879,5.434,886,6.749,887,4.499,888,4.57,889,5.146,890,3.637,891,5.146,892,6.463,893,3.27,894,7.829,895,6.463,896,6.463,897,8.679,898,6.463,899,6.463,900,6.101,901,8.679]],["t/154",[28,2.998,62,2.5,71,1.071,112,3.746,133,2.317,142,1.661,153,2.631,170,2.983,171,2.265,284,2.559,288,3.269,292,2.253,316,2.387,422,1.364,437,1.743,461,3.343,521,2.72,561,5.91,569,2.825,676,4.229,824,2.971,850,2.658,853,2.861,861,4.229,867,3.287,877,4.201,902,1.724,903,7.867,904,3.885,905,5.422,906,5.422,907,10.157,908,10.157,909,5.422,910,7.867,911,5.422,912,5.422,913,5.422,914,5.422,915,5.422,916,3.802,917,9.259,918,4.34,919,5.422,920,5.422,921,3.131,922,4.717,923,5.422,924,4.717,925,5.422,926,5.422,927,5.422,928,5.422,929,5.422,930,5.422]],["t/156",[71,1.261,112,4.408,153,3.096,292,3.847,498,3.545,542,5.124,561,5.073,867,5.266,902,2.943,916,6.492,922,8.054,931,8.054,932,4.539,933,7.411,934,4.44,935,9.258]],["t/158",[23,1.727,28,3.019,62,2.27,71,1.079,142,3.126,153,2.65,164,2.158,167,3.412,285,3.617,382,3.348,437,2.548,502,3.622,721,2.738,796,3.531,850,3.884,857,5.446,867,3.311,869,4.22,902,2.519,936,3.746,937,10.402,938,6.343,939,10.402,940,5.813,941,9.404,942,5.082,943,5.813,944,7.302]],["t/160",[29,3.472,112,4.522,159,6.19,586,6.969,587,4.884,631,7.36,648,5.486,934,4.555,945,8.753,946,6.093,947,9.498,948,5.256,949,8.753,950,6.528,951,8.753,952,7.151]],["t/162",[21,3.56,40,3.299,43,4.189,61,2.961,71,1.128,112,5.487,166,4.223,272,2.769,285,2.935,474,3.673,514,3.217,523,2.565,587,5.926,594,4.957,602,4.371,721,2.862,786,5.807,851,6.733,855,2.91,892,7.632,953,6.63,954,8.282,955,3.499,956,8.282,957,5.488,958,6.076,959,8.282]],["t/164",[21,2.402,38,2.679,45,3.912,71,1.095,96,1.955,98,2.119,106,2.374,109,4.87,112,2.66,116,4.124,117,2.898,142,1.711,161,2.297,164,2.19,190,3.155,285,3.651,316,2.459,329,3.918,354,2.803,403,2.615,404,3.344,408,4.473,422,1.405,444,3.319,479,1.811,493,2.445,514,2.171,521,2.803,529,6.089,530,7.223,587,5.612,608,6.053,727,4.329,730,3.432,855,2.825,881,3.641,902,1.776,934,4.939,960,6.041,961,5.149,962,3.303,963,5.149,964,5.587,965,3.53,966,3.605,967,2.76,968,4.645,969,8.04,970,4.516,971,3.387,972,2.272,973,2.402,974,3.124,975,3.227,976,5.587,977,5.149,978,3.53,979,5.587]],["t/166",[18,3.127,19,1.58,20,2.617,21,3.863,23,0.786,37,5.616,38,3.451,39,1.04,48,1.874,61,1.29,66,1.617,71,0.785,73,2.664,95,1.976,109,1.705,116,1.444,132,1.824,139,1.173,145,1.871,164,0.982,251,2.892,290,1.671,292,1.499,314,2.314,316,3.956,327,1.588,337,1.759,342,4.157,375,1.588,378,1.904,434,1.491,441,2.529,444,1.097,458,1.991,493,2.522,497,1.151,523,1.117,582,6.838,599,1.939,608,2.716,620,2.585,644,1.855,676,3.098,700,4.614,717,4.308,719,1.782,730,5.886,752,1.394,815,2.725,846,2.433,854,2.038,888,2.351,890,5.418,942,2.314,966,1.617,968,4.791,974,2.017,980,1.617,981,2.646,982,2.887,983,3.756,984,5.158,985,3.607,986,2.132,987,6.963,988,4.228,989,2.847,990,2.216,991,2.159,992,2.083,993,2.159,994,2.433,995,2.999,996,2.999,997,3.887,998,5.013,999,2.887,1000,2.795,1001,2.06,1002,2.382,1003,5.52,1004,3.607,1005,3.138,1006,3.607,1007,2.999,1008,3.324,1009,3.607,1010,1.939,1011,2.887,1012,1.824,1013,2.279,1014,2.279,1015,2.187,1016,2.795,1017,3.138,1018,1.921,1019,3.138,1020,2.887,1021,2.887,1022,3.607,1023,2.246,1024,5.311,1025,3.138,1026,2.795,1027,1.649,1028,4.92,1029,5.763,1030,3.607,1031,3.607,1032,3.607,1033,3.607,1034,3.887,1035,2.279,1036,1.824,1037,2.083,1038,1.796,1039,2.279,1040,2.999,1041,2.159,1042,3.138,1043,3.324,1044,1.921,1045,3.607]],["t/168",[582,6.129,980,4.533,981,7.417,983,6.588,1046,9.317,1047,9.317,1048,9.317,1049,8.405,1050,9.317]],["t/171",[40,3.554,45,3.151,67,3.548,71,1.215,98,2.456,109,4.217,116,2.593,123,3.876,125,2.468,133,2.768,142,1.984,285,2.295,350,2.941,368,3.128,402,3.699,403,2.107,437,2.868,465,4.876,513,3.449,544,4.641,549,3.747,573,3.276,888,4.22,949,5.968,950,4.451,967,5.041,990,3.978,1028,3.876,1051,6.476,1052,5.152,1053,3.449,1054,6.476,1055,11.532,1056,5.018,1057,5.968,1058,6.476,1059,3.829,1060,10.204,1061,4.876,1062,4.541,1063,5.384,1064,3.876,1065,6.476,1066,4.541,1067,6.476,1068,6.476,1069,6.476,1070,5.018,1071,6.476,1072,5.813,1073,5.184,1074,6.476,1075,3.74,1076,4.092]],["t/173",[18,2.804,19,2.082,20,3.449,21,2.221,23,2.164,30,1.847,34,3.019,37,4.083,38,4.761,39,1.49,48,1.977,53,3.367,57,3.367,61,1.847,62,0.984,71,1.034,73,3.217,98,2.881,138,1.345,162,1.529,188,1.407,251,2.593,284,1.681,290,2.393,316,2.274,444,1.571,458,1.785,493,2.261,495,3.132,497,1.649,498,1.978,515,2.017,573,2.613,582,6.931,608,3.89,630,4.437,637,3.424,752,1.998,796,3.384,890,3.939,932,2.533,960,3.314,1008,4.762,1012,4.555,1014,3.265,1015,5.459,1017,4.495,1018,2.752,1024,4.762,1038,3.781,1042,4.495,1043,4.762,1077,5.167,1078,3.174,1079,4.762,1080,4.008,1081,2.951,1082,4.495,1083,3.265,1084,3.551,1085,2.727,1086,4.762,1087,2.859,1088,5.167,1089,4.519,1090,4.495,1091,3.485,1092,3.093,1093,3.314,1094,3.367,1095,4.799,1096,3.132,1097,4.295,1098,3.132,1099,4.136,1100,4.495,1101,4.295,1102,5.167,1103,3.623]],["t/175",[21,1.931,23,0.979,25,1.376,38,4.778,48,1.78,51,1.771,53,5.397,62,1.577,69,2.392,71,1.128,73,2.216,89,2.123,98,1.703,138,1.169,168,1.672,169,2.511,172,2.271,274,2.655,284,1.461,290,2.08,316,1.977,328,1.502,342,2.594,375,3.01,403,3.012,405,3.149,406,1.45,434,1.856,458,1.552,501,2.219,523,2.565,561,2.461,582,6.616,595,2.123,606,2.29,642,2.976,643,3.48,652,2.881,762,1.572,763,2.594,845,3.029,869,2.392,887,2.881,889,3.295,890,2.329,995,5.685,1002,3.423,1012,5.04,1016,6.418,1019,3.907,1021,6.63,1080,2.37,1094,2.927,1097,3.734,1098,2.723,1099,3.595,1104,8.134,1105,4.139,1106,5.949,1107,2.976,1108,6.303,1109,3.734,1110,5.685,1111,2.927,1112,4.491,1113,4.491,1114,4.491,1115,4.491,1116,4.491,1117,3.378,1118,3.295,1119,2.976,1120,3.734,1121,2.927,1122,2.272,1123,3.381,1124,3.295,1125,4.139,1126,2.437,1127,2.202,1128,2.624,1129,2.797,1130,4.491,1131,2.838,1132,3.218,1133,2.838,1134,4.491,1135,4.491,1136,4.491,1137,3.734,1138,4.491,1139,3.48,1140,2.838,1141,2.759,1142,3.595,1143,4.491,1144,4.491]],["t/177",[19,0.922,21,3.991,22,1.454,37,3.691,38,3.786,39,0.97,40,1.34,48,0.876,61,1.203,62,1.768,66,1.508,71,0.458,73,1.09,74,5.022,98,1.276,103,4.475,139,1.094,159,2.192,162,0.677,172,0.922,189,1.943,251,2.734,271,1.354,274,1.989,291,1.235,316,4.303,361,1.881,403,1.094,405,3.821,407,1.383,468,1.429,481,1.702,495,2.039,498,1.288,501,1.662,502,1.538,515,1.313,555,2.693,582,7.046,644,1.73,648,1.943,652,3.495,653,1.901,699,1.662,729,2.607,730,2.066,756,1.702,776,3.745,792,1.13,804,2.468,845,2.269,855,1.915,866,2.126,881,2.192,888,2.192,890,1.745,891,2.468,946,2.158,948,1.862,972,1.368,978,3.443,1011,4.362,1012,3.474,1013,2.126,1021,2.693,1044,1.792,1061,2.533,1073,2.693,1094,4.475,1095,3.443,1104,6.118,1106,4.74,1107,2.229,1117,2.692,1120,4.53,1125,3.1,1141,2.066,1145,3.394,1146,2.312,1147,2.158,1148,2.693,1149,3.364,1150,5.449,1151,3.364,1152,1.472,1153,3.821,1154,3.821,1155,3.364,1156,3.364,1157,3.364,1158,2.926,1159,2.607,1160,2.359,1161,3.364,1162,5.171,1163,3.364,1164,5.022,1165,3.905,1166,2.468,1167,3.1,1168,2.926,1169,5.022,1170,2.126,1171,2.411,1172,3.364,1173,3.364,1174,2.269,1175,3.364,1176,1.901,1177,6.856,1178,3.1,1179,3.364,1180,3.364,1181,3.364,1182,5.325,1183,5.449,1184,5.022,1185,2.468,1186,2.607,1187,2.359,1188,2.229,1189,3.364,1190,2.693,1191,3.364,1192,3.364,1193,1.881,1194,2.926,1195,2.533,1196,2.607,1197,3.364,1198,3.079,1199,2.533,1200,2.533,1201,2.607,1202,2.158,1203,3.364,1204,3.364,1205,3.364,1206,2.411,1207,2.797,1208,2.607,1209,1.76,1210,3.364,1211,2.192,1212,3.1,1213,3.1,1214,3.1,1215,3.1,1216,2.926,1217,2.312,1218,2.095]],["t/179",[23,1.304,38,2.869,51,3.329,71,1.332,73,1.939,98,2.269,115,3.543,137,3.026,138,2.198,188,1.63,292,2.486,354,3.002,403,3.182,444,1.819,458,2.917,474,2.093,489,5.204,523,2.614,549,2.197,631,4.636,644,3.076,762,2.954,763,3.063,845,4.035,1010,3.216,1012,5.373,1016,4.636,1017,7.343,1042,5.204,1089,3.002,1094,3.899,1104,8.232,1106,5.204,1110,7.017,1123,6.355,1127,2.933,1140,3.78,1142,4.789,1152,2.618,1177,4.195,1187,4.195,1193,3.345,1219,3.186,1220,5.983,1221,5.983,1222,5.983,1223,3.675,1224,6.757,1225,6.049,1226,5.513,1227,5.983,1228,5.204,1229,4.973,1230,3.537,1231,3.051,1232,4.195,1233,5.513,1234,5.513,1235,3.726,1236,4.287]],["t/181",[22,1.866,23,0.94,28,1.644,29,1.577,33,3.5,38,3.874,48,1.123,51,1.702,56,1.855,57,2.812,58,2.341,62,0.822,71,1.407,98,1.636,117,2.238,137,3.355,138,1.727,172,1.183,188,2.201,198,1.455,223,4.829,272,1.443,274,4.776,309,2.515,316,1.899,375,1.899,403,1.404,444,2.457,458,3.133,474,1.51,479,1.398,481,3.355,498,1.652,501,3.276,523,1.336,582,6.733,611,1.923,629,3.249,763,1.351,845,2.91,855,1.516,866,2.726,869,2.298,890,4.19,948,2.388,972,1.755,1002,2.741,1018,3.532,1019,3.754,1020,3.454,1021,8.615,1041,2.583,1080,2.277,1089,4.91,1101,9.234,1104,3.344,1110,3.587,1117,2.132,1123,6.827,1127,2.115,1141,2.651,1152,1.888,1158,3.754,1193,2.413,1231,4.624,1237,3.026,1238,4.315,1239,2.91,1240,8.357,1241,4.315,1242,4.315,1243,2.91,1244,3.249,1245,3.587,1246,5.31,1247,3.977,1248,2.651,1249,5.77,1250,4.315,1251,3.831,1252,2.026,1253,3.931,1254,3.977,1255,3.454,1256,2.238,1257,4.315,1258,2.148,1259,4.315]],["t/183",[21,4.359,22,1.782,25,1.262,31,2.328,37,4.219,38,4.243,41,2.832,43,2.084,51,1.625,53,2.685,61,1.473,62,1.494,71,1.305,73,2.543,100,3.103,103,2.685,110,1.5,111,1.65,117,3.319,162,0.829,167,1.378,169,2.304,172,1.13,316,4.464,342,4.533,438,3.103,444,1.253,495,2.498,516,3.426,523,2.431,547,2.643,582,6.416,587,3.291,642,2.731,644,2.119,713,2.466,721,1.424,751,2.195,763,1.29,781,2.731,854,2.328,869,2.195,902,1.31,960,2.643,975,3.697,983,2.685,993,4.697,1005,3.585,1011,3.299,1012,5.915,1016,3.193,1084,2.832,1092,2.466,1096,2.498,1104,3.193,1108,3.798,1117,2.036,1126,4.259,1129,3.987,1139,3.193,1162,3.103,1168,3.585,1182,2.779,1184,3.798,1230,2.436,1231,2.101,1256,2.137,1260,3.426,1261,3.193,1262,3.798,1263,2.281,1264,3.798,1265,11.877,1266,2.89,1267,3.798,1268,4.121,1269,4.121,1270,4.121,1271,2.604,1272,3.585,1273,4.121,1274,4.121,1275,2.354,1276,3.103,1277,2.779,1278,3.193,1279,3.798,1280,3.798,1281,3.299,1282,2.643,1283,4.121,1284,4.121,1285,5.321,1286,6.401,1287,3.585,1288,3.932,1289,3.798,1290,2.498,1291,3.193,1292,2.731,1293,4.121,1294,3.426]],["t/185",[21,3.156,23,0.65,25,1.934,31,1.684,37,2.653,38,3.901,39,1.423,43,1.508,48,0.776,62,1.549,66,1.337,71,1.108,73,3.449,81,1.419,117,1.546,122,3.46,125,1.136,132,1.508,139,0.97,162,0.6,169,3.531,172,2.404,274,1.762,275,2.653,316,3.232,342,2.85,349,1.52,403,2.388,434,1.232,444,1.92,451,1.587,458,2.811,474,1.043,479,0.966,481,1.508,493,1.304,509,2.01,514,1.158,523,0.923,524,2.09,565,1.472,582,6.719,614,1.381,627,2.136,630,1.741,652,4.051,653,1.684,717,1.784,727,4.893,730,1.831,752,1.152,846,2.01,855,1.048,881,4.115,890,2.559,902,0.948,955,1.26,960,1.912,968,4.103,972,1.212,973,2.121,980,1.337,981,3.621,983,3.216,992,1.722,1000,2.31,1003,1.831,1005,4.293,1010,3.394,1012,1.508,1015,1.807,1016,2.31,1021,5.055,1049,2.478,1075,1.722,1080,1.573,1082,2.593,1089,1.496,1093,1.912,1094,1.943,1096,1.807,1104,2.31,1105,2.747,1107,1.975,1110,2.478,1117,1.472,1120,2.478,1122,1.508,1123,2.244,1140,1.883,1141,3.032,1158,2.593,1162,2.244,1168,2.593,1169,2.747,1174,2.01,1176,1.684,1177,3.461,1182,2.01,1186,2.31,1188,1.975,1193,1.667,1198,1.684,1200,2.244,1212,2.747,1213,2.747,1214,2.747,1215,2.747,1216,2.593,1231,1.52,1236,2.136,1240,10.214,1243,2.01,1266,2.09,1275,1.703,1279,4.548,1294,4.103,1295,2.187,1296,3.879,1297,2.049,1298,2.981,1299,2.981,1300,2.187,1301,2.981,1302,2.478,1303,2.981,1304,3.392,1305,1.975,1306,1.831,1307,6.766,1308,1.684,1309,2.244,1310,2.478,1311,2.747,1312,2.31,1313,2.678,1314,1.762,1315,2.136,1316,1.883,1317,2.981,1318,2.981,1319,2.981,1320,2.981,1321,2.981,1322,2.478,1323,2.981,1324,2.593,1325,2.981,1326,2.593,1327,2.31,1328,2.747,1329,2.981,1330,2.747,1331,2.981,1332,3.27,1333,2.747,1334,1.831,1335,2.981,1336,1.831,1337,2.747,1338,2.593,1339,2.981,1340,2.981,1341,4.103]],["t/187",[21,3.481,25,2.481,37,4.353,73,3.696,162,1.63,169,6.376,290,3.751,316,3.565,342,5.977,375,3.565,406,2.614,444,2.463,582,4.909,865,5.367,890,4.2,902,2.575,968,6.733,983,5.278,992,6.587,1111,5.278,1193,4.528,1243,7.692,1278,8.019,1307,7.463,1342,5.278,1343,8.099]],["t/189",[21,3.946,33,4.845,316,4.041,582,5.565,980,4.117,981,6.736,983,5.983,1046,8.461,1047,8.461,1048,8.461,1049,7.632,1050,8.461,1344,9.181,1345,9.181,1346,9.181,1347,9.181,1348,9.181,1349,9.181,1350,9.181,1351,7.632]],["t/191",[67,5.439,134,6.696,497,3.168,940,7.283,1277,6.696,1352,7.474,1353,4.867,1354,6.696,1355,7.474,1356,9.927,1357,6.961]],["t/193",[47,4.224,62,2.56,67,3.818,113,4.618,114,5.684,115,2.525,164,2.554,167,2.33,168,2.594,328,2.33,444,2.119,504,4.994,568,4.887,810,5.113,853,3.678,861,3.746,932,3.416,967,4.632,998,6.062,1007,5.793,1177,4.887,1230,4.12,1352,5.247,1353,3.416,1355,7.06,1358,9.424,1359,6.422,1360,8.317,1361,4.171,1362,6.969,1363,4.541,1364,4.994,1365,6.422]],["t/195",[47,3.255,48,2.034,62,2.575,67,5.54,71,0.731,134,3.621,164,1.462,181,3.344,316,2.363,329,3.765,350,2.438,402,3.066,429,4.298,479,2.531,493,2.349,515,2.096,540,3.213,569,1.928,589,3.888,595,3.693,599,5.435,638,1.707,721,1.855,762,1.879,780,3.392,804,3.939,813,3.499,853,2.834,967,2.652,998,4.67,1000,4.16,1064,3.213,1122,2.716,1140,3.392,1342,3.499,1353,2.632,1366,3.344,1367,4.298,1368,6.456,1369,5.369,1370,5.369,1371,4.16,1372,6.494,1373,3.69,1374,5.369,1375,5.369,1376,4.042,1377,2.942,1378,3.847,1379,3.939,1380,4.463,1381,5.369,1382,4.948,1383,5.369,1384,3.392,1385,4.67,1386,7.198,1387,3.255,1388,4.298,1389,2.942,1390,2.942,1391,5.369,1392,4.618]],["t/197",[43,4.422,56,3.758,62,2.466,190,3.43,328,2.924,496,4.077,647,3.78,853,4.614,967,4.319,1352,6.582,1358,7.268,1360,6.414,1364,6.265,1385,7.605,1393,5.3,1394,5.524,1395,6.009,1396,6.582,1397,8.057,1398,8.415]],["t/200",[53,6.033,62,1.763,110,3.369,190,3.633,292,4.674,549,3.399,629,6.971,763,2.899,1170,5.85,1355,6.971,1398,9.389,1399,9.258,1400,9.258,1401,9.258,1402,9.258,1403,7.697]],["t/202",[3,7.791,378,5.818,469,10.388,517,5.248,721,3.095,855,3.147,918,7.17,934,4.295,1127,4.391,1358,9.164,1398,6.94,1404,7.791,1405,6.743,1406,8.254,1407,8.761,1408,8.254]],["t/204",[47,3.439,49,3.979,56,3.494,61,2.029,62,2.515,67,4.454,172,1.556,291,2.083,328,3.177,329,3.979,406,1.831,417,2.237,440,4.163,461,2.411,517,4.522,523,1.757,540,4.865,561,3.109,566,2.803,568,3.979,633,4.411,647,2.453,721,1.96,763,1.777,798,2.682,853,2.994,934,3.898,962,4.806,967,4.015,1089,2.847,1352,7.152,1365,5.229,1367,4.542,1368,3.979,1372,4.717,1377,3.109,1385,8.263,1388,4.542,1398,6.299,1407,4.163,1408,5.229,1409,4.163,1410,2.371,1411,5.229,1412,2.968,1413,4.066,1414,5.674,1415,8.266,1416,5.229,1417,3.76,1418,5.229,1419,4.396,1420,4.936,1421,2.397,1422,5.229,1423,5.229,1424,3.439]],["t/206",[49,5.253,62,1.426,67,6.393,81,3.567,292,3.113,403,2.437,406,2.418,517,3.567,549,2.751,554,4.733,575,6.311,623,4.666,625,4.666,633,5.339,653,4.233,700,5.997,721,2.589,741,3.359,763,2.346,798,3.542,893,3.493,934,3.592,1002,3.096,1089,3.759,1398,7.624,1407,5.496,1412,3.919,1425,7.624,1426,4.964,1427,6.517,1428,6.904,1429,5.805,1430,7.491,1431,7.491,1432,6.904,1433,5.253,1434,5.997,1435,5.368,1436,3.38,1437,5.997]],["t/208",[40,2.964,47,4.51,49,6.869,60,5.602,67,4.077,153,2.488,167,2.488,172,2.686,440,8.034,458,2.571,514,2.891,544,5.332,648,4.297,763,3.429,893,3.47,916,5.218,918,5.956,962,4.399,1003,4.571,1089,3.733,1122,3.763,1355,5.602,1419,5.766,1426,4.931,1438,8.766,1439,4.773,1440,7.441,1441,6.857,1442,4.849,1443,7.441,1444,6.473,1445,6.186,1446,6.473,1447,7.441,1448,4.571,1449,6.857,1450,4.571,1451,7.441,1452,7.441,1453,7.441]],["t/210",[62,1.857,170,2.983,993,5.836,1454,9.751,1455,9.751,1456,9.751,1457,9.751,1458,5.569,1459,7.806,1460,11.605,1461,7.342]],["t/212",[24,2.82,28,2.752,35,2.331,47,2.926,48,1.257,56,2.075,62,2.529,67,3.957,103,3.145,118,2.926,154,2.525,164,1.315,328,1.614,329,3.385,342,2.788,403,1.57,438,3.634,444,1.468,461,2.051,496,2.251,497,1.54,515,1.884,517,4.572,523,1.495,540,5.747,549,4.317,554,3.05,589,2.403,633,2.619,635,3.864,740,2.699,763,1.512,853,2.547,855,1.696,861,2.594,874,2.619,916,5.064,967,2.384,986,2.854,1044,2.57,1052,4.997,1122,3.652,1352,3.634,1361,2.889,1367,3.864,1368,3.385,1372,4.012,1376,5.437,1377,2.645,1407,5.298,1413,3.459,1419,3.74,1420,4.199,1426,4.785,1434,3.864,1439,3.096,1441,4.448,1442,3.145,1444,4.199,1450,2.965,1462,7.221,1463,6.282,1464,7.221,1465,5.298,1466,4.448,1467,3.385,1468,4.199,1469,2.82,1470,2.57,1471,4.012,1472,4.827,1473,2.82,1474,4.199,1475,7.526,1476,3.541]],["t/214",[3,7.15,41,5.649,49,5.764,58,4.46,62,1.565,109,3.886,190,3.225,292,3.416,361,4.596,403,2.674,438,6.189,458,2.84,517,3.913,633,4.46,721,3.61,763,3.272,798,3.886,948,4.549,955,3.473,1398,6.369,1404,7.15,1407,6.031,1412,4.3,1433,5.764,1435,5.89,1436,3.709,1437,6.58,1461,6.189,1477,7.15,1478,5.764,1479,5.764,1480,5.544]],["t/216",[56,2.817,61,2.343,62,2.55,67,5.626,87,4.344,167,2.192,190,2.571,328,2.192,329,4.595,417,2.584,429,5.246,440,7.533,458,2.264,504,4.696,544,4.696,561,3.591,614,3.035,818,2.867,853,3.459,967,3.237,972,2.665,1096,5.452,1122,3.315,1352,8.32,1360,4.808,1363,4.271,1366,5.601,1367,5.246,1368,4.595,1372,5.448,1425,5.078,1439,4.204,1461,6.771,1469,5.254,1481,4.595,1482,5.452,1483,4.934,1484,6.553,1485,6.039]],["t/219",[971,6.185,1486,12.627,1487,9.403,1488,10.204,1489,10.204,1490,10.204]],["t/221",[1487,8.532,1491,12.117,1492,9.258,1493,9.258,1494,9.258,1495,9.258,1496,9.258,1497,9.258,1498,9.258,1499,9.258,1500,9.258,1501,9.258,1502,7.411,1503,9.258,1504,11.249,1505,8.054]],["t/223",[1506,12.184,1507,10.597,1508,10.597]],["t/225",[47,4.769,48,2.048,67,4.31,164,2.143,429,6.297,440,5.772,458,2.718,493,3.442,514,3.946,633,4.269,763,2.464,874,4.269,893,3.668,1152,3.442,1209,4.115,1419,6.096,1425,6.096,1426,5.213,1429,6.096,1438,9.005,1439,6.515,1461,7.647,1469,4.596,1509,6.297,1510,7.867,1511,5.306,1512,4.651,1513,7.867,1514,4.899,1515,7.867,1516,7.867,1517,7.867,1518,7.867,1519,7.867,1520,7.25]],["t/227",[62,2.52,67,3.943,190,4.226,378,3.798,569,2.584,573,3.64,607,4.024,633,3.905,647,3.112,721,2.487,740,4.024,751,3.833,805,3.076,853,3.798,893,3.356,916,6.719,967,3.555,1063,5.983,1122,3.64,1132,5.157,1377,3.943,1407,5.28,1425,5.577,1429,5.577,1439,4.616,1469,4.205,1470,3.833,1521,5.047,1522,7.197,1523,5.157,1524,5.983,1525,7.197,1526,6.633,1527,6.261,1528,6.633,1529,6.261,1530,6.633,1531,6.633,1532,6.633]],["t/229",[47,3.926,48,2.322,62,2.573,67,4.888,167,2.983,190,2.541,328,2.166,378,3.418,440,4.751,518,3.175,523,2.006,543,3.224,549,2.378,568,4.541,623,4.033,647,2.8,817,4.876,853,3.418,893,4.16,962,6.033,967,3.199,1209,3.388,1255,5.184,1258,3.224,1352,4.876,1360,4.751,1361,3.876,1366,4.033,1376,4.876,1415,4.876,1425,5.018,1428,5.968,1429,5.018,1459,5.184,1461,6.716,1469,3.783,1470,3.449,1524,5.384,1527,5.634,1533,5.384,1534,6.476,1535,6.476,1536,5.968,1537,5.634]],["t/231",[23,2.026,62,2.595,67,3.771,113,4.56,167,2.301,190,3.648,440,7.726,546,3.029,594,4.119,606,3.509,721,2.378,814,3.888,846,4.641,853,3.632,893,3.209,967,4.593,1366,4.286,1417,4.56,1425,5.332,1429,5.332,1459,5.509,1461,5.181,1465,5.049,1469,4.02,1478,4.826,1523,4.931,1529,5.986,1536,6.342,1537,5.986,1538,6.882,1539,6.882,1540,4.485,1541,4.068,1542,6.882,1543,6.882]],["t/233",[23,1.826,52,4.067,62,2.601,167,1.979,190,2.322,275,3.181,300,3.096,328,1.979,438,4.456,466,4.92,479,1.918,513,4.461,514,3.777,520,3.739,523,2.594,549,3.076,611,2.637,722,4.838,853,3.123,858,3.857,893,3.906,916,4.15,1171,4.241,1209,3.096,1230,3.499,1361,3.542,1419,4.586,1429,4.586,1450,3.635,1459,4.738,1461,6.307,1476,4.342,1485,5.454,1520,5.454,1526,7.72,1529,7.287,1530,5.454,1531,5.454,1532,5.454,1537,5.148,1544,5.918,1545,5.918,1546,4.241,1547,6.491,1548,5.918,1549,5.918]],["t/235",[23,1.667,48,3.062,62,2.568,223,4.073,405,5.363,429,6.122,561,4.19,608,7.508,611,3.408,853,4.036,967,3.778,1363,6.499,1367,6.122,1368,5.363,1419,5.926,1471,6.358,1483,5.758,1523,5.48,1541,4.521,1550,7.983,1551,7.648,1552,6.358,1553,7.648,1554,7.648,1555,7.048]],["t/237",[18,4.528,19,2.288,20,3.79,37,4.485,39,3.042,50,6.466,55,5.98,66,5.185,80,6.937,129,3.79,139,2.714,162,2.123,203,6.283,272,2.791,498,3.195,527,3.718,566,4.122,577,4.766,616,7.259,624,6.569,893,3.891,972,3.394,1066,5.851,1556,6.466,1557,4.618,1558,3.814,1559,3.358]],["t/239",[23,2.079,25,2.922,30,3.411,32,3.808,39,2.062,71,0.974,107,2.778,138,1.861,146,4.361,147,5.383,162,1.92,206,4.04,381,4.334,421,4.906,433,3.091,445,4.04,522,3.357,523,2.214,527,3.186,630,4.177,721,2.471,752,2.764,753,4.586,815,4.51,869,3.808,902,2.273,962,4.227,1036,3.617,1096,4.334,1252,3.357,1297,4.914,1312,5.54,1354,4.823,1560,5.54,1561,5.944,1562,4.084,1563,5.724,1564,3.943,1565,5.014,1566,5.944,1567,4.084,1568,4.738,1569,5.944,1570,4.28,1571,3.128]],["t/241",[23,2.018,32,5.991,138,2.41,146,4.232,162,1.864,272,3.096,282,3.205,300,4.843,328,3.096,406,2.989,407,3.806,421,4.761,527,4.126,990,5.687,1565,6.492,1572,9.258]],["t/243",[23,1.968,76,5.624,138,2.351,139,2.938,146,4.128,162,1.818,197,2.817,272,3.02,300,4.724,434,3.732,458,3.12,497,2.882,867,3.773,990,5.547,1292,5.984,1296,5.547,1512,5.339,1567,5.158,1573,4.369,1574,4.049,1575,7.855]],["t/245",[23,1.89,32,5.755,39,2.502,54,5.128,71,1.181,73,2.811,107,3.37,146,3.965,162,2.175,272,2.901,390,5.557,445,4.901,491,4.46,527,3.865,751,4.619,792,2.912,902,2.757,1296,5.328,1565,6.082,1567,4.954,1568,5.748,1571,3.795,1574,3.889,1576,5.067]],["t/247",[23,1.126,32,4.045,38,2.478,54,3.055,71,1.557,107,3.499,139,1.681,146,4.117,162,1.813,169,2.889,206,2.919,224,1.707,282,1.367,292,2.147,381,3.132,389,2.752,390,5.687,401,3.791,421,3.906,422,1.299,437,1.661,445,2.919,451,2.752,522,2.426,523,2.789,533,1.606,603,2.572,633,2.804,637,5.968,638,1.643,641,2.951,721,1.785,751,2.752,769,3.703,792,1.735,796,2.302,855,1.816,869,2.752,980,2.317,1003,3.174,1011,7.948,1152,2.261,1193,2.889,1223,3.174,1224,4.136,1225,3.703,1256,2.68,1296,3.174,1297,3.551,1473,3.019,1560,4.004,1562,2.951,1565,5.326,1567,5.144,1568,5.033,1570,3.093,1577,6.314,1578,5.167,1579,4.762,1580,5.167,1581,4.004,1582,6.999,1583,4.495,1584,2.919,1585,4.004,1586,4.136,1587,4.495,1588,4.136,1589,4.762,1590,5.167,1591,3.551,1592,4.295,1593,3.424,1594,3.485,1595,5.167,1596,4.762,1597,4.136,1598,3.89,1599,3.265,1600,3.055,1601,3.89]],["t/249",[32,4.89,39,1.948,71,1.42,107,2.624,138,2.39,162,2.1,168,2.514,188,1.84,206,3.816,246,3.068,263,3.858,272,2.259,352,4.149,375,2.973,426,2.822,428,2.92,498,2.586,515,2.637,522,3.171,523,2.843,534,2.822,603,3.363,627,4.84,641,3.858,972,2.747,1254,6.225,1297,4.642,1360,4.956,1410,2.822,1473,3.946,1564,4.625,1566,5.615,1567,6.685,1568,4.476,1570,4.043,1600,3.993,1601,7.853,1602,7.987,1603,4.207,1604,4.737,1605,3.738,1606,6.755,1607,6.225,1608,4.333,1609,4.956,1610,4.095]],["t/251",[25,3.566,32,2.307,39,1.249,40,2.65,61,1.549,62,0.825,71,1.237,73,2.624,107,1.683,110,2.947,122,2.374,125,1.651,138,1.128,142,1.327,145,2.247,149,7.464,150,2.531,154,2.266,162,1.339,168,1.613,169,2.422,170,1.114,172,1.824,219,2.922,246,1.967,272,2.708,282,2.593,327,2.928,328,1.449,337,1.322,363,1.299,365,2.561,368,2.092,388,3.038,390,5.041,395,3.365,421,2.228,426,1.81,437,2.139,445,2.448,498,1.659,514,1.683,527,1.93,534,1.81,549,1.591,569,2.389,611,1.93,615,3.038,619,1.907,641,3.8,642,2.871,726,2.871,741,1.942,815,3.829,867,1.81,869,2.307,882,3.726,932,2.124,934,2.077,990,2.661,1002,1.79,1036,2.191,1078,4.087,1140,2.737,1176,2.448,1276,3.262,1280,3.992,1296,2.661,1308,2.448,1458,2.474,1512,6.371,1559,1.744,1564,1.79,1567,2.474,1568,2.871,1570,2.593,1571,1.895,1583,3.768,1594,6.129,1599,2.737,1604,4.665,1605,2.397,1611,5.155,1612,6.653,1613,2.737,1614,6.733,1615,3.768,1616,4.332,1617,4.332,1618,2.422,1619,2.329,1620,4.332,1621,4.332,1622,3.768,1623,4.332,1624,4.332,1625,4.332,1626,2.737,1627,3.357]],["t/253",[81,4.299,146,5.064,154,4.724,162,1.818,199,6.997,272,3.705,340,5.405,352,5.547,390,5.697,792,3.032,1092,5.405,1166,6.625,1565,7.769,1568,5.984,1594,6.09,1628,5.339,1629,6.799,1630,7.855]],["t/255",[29,3.356,110,3.341,162,1.848,169,5.133,198,3.095,282,2.429,283,5.364,390,4.721,464,4.935,642,6.084,792,4.054,1027,4.196,1218,5.718,1296,5.64,1570,5.495,1587,7.987,1588,7.349,1589,8.461]],["t/257",[32,6.213,48,2.561,162,2.348,433,3.188,723,5.888,751,5.24,1316,6.216,1570,5.888,1631,5.501,1632,9.838]],["t/260",[18,4.563,19,2.906,20,4.813,21,3.614,22,3.635,30,3.006,35,4.061,39,2.425,110,3.06,159,5.48,162,2.133,188,2.29,285,2.98,316,3.701,479,3.434,606,4.288,642,5.572,643,6.515,752,3.251,992,4.856,1098,5.097,1209,4.398,1217,5.779,1633,4.288,1634,8.408,1635,8.408,1636,4.154]],["t/262",[29,3.502,112,4.562,162,2.312,168,3.566,188,3.128,328,3.204,493,4.192,515,3.741,558,5.885,589,4.77,596,3.856,918,7.67,1571,4.192]],["t/265",[19,2.728,23,1.131,24,3.033,29,1.898,34,3.033,38,2.489,62,1.72,71,0.707,75,2.526,87,2.507,98,1.969,105,2.539,107,2.017,110,1.889,111,2.079,112,2.472,138,1.352,139,2.479,151,2.765,162,2.305,164,1.414,167,1.736,190,2.037,197,1.62,198,1.75,206,2.933,241,2.245,246,4.101,271,2.089,282,2.632,292,2.157,313,3.603,339,2.472,363,2.285,364,4.784,383,2.74,414,4.024,433,2.926,434,2.146,514,2.961,527,2.313,533,2.369,553,4.784,564,3.909,577,2.965,596,2.089,621,3.396,662,4.506,716,2.584,792,1.743,803,2.245,890,2.692,972,2.111,1002,2.146,1028,3.107,1085,2.74,1187,3.64,1218,5.624,1252,2.437,1436,2.343,1619,2.79,1637,4.784,1638,2.231,1639,2.194,1640,3.809,1641,4.023,1642,1.988,1643,2.79,1644,4.023,1645,5.191,1646,4.784,1647,5.191,1648,3.33,1649,4.784,1650,4.516,1651,4.316,1652,4.316,1653,4.784,1654,4.784,1655,4.156,1656,3.147,1657,3.501]],["t/267",[19,3.138,21,4.469,39,2.353,110,2.969,162,1.642,246,3.705,406,2.634,434,3.372,515,3.185,653,4.61,662,4.823,716,4.062,741,3.658,756,4.127,792,2.739,970,3.912,1064,4.883,1129,5.081,1187,5.721,1275,5.938,1603,5.081,1653,7.519,1654,7.519,1658,8.159,1659,6.322,1660,8.159,1661,7.519,1662,7.519,1663,8.159,1664,6.143,1665,8.159]],["t/269",[38,3.568,44,4.399,62,1.417,73,3.548,98,2.822,132,3.763,145,3.859,162,2.434,282,1.968,285,2.637,290,5.072,363,2.936,382,3.144,402,4.25,433,2.411,434,3.075,458,3.784,621,3.316,648,4.297,721,2.571,762,2.604,889,5.459,1098,4.51,1160,5.218,1231,3.794,1252,3.493,1562,4.25,1666,5.459,1667,6.857,1668,4.399,1669,4.297,1670,6.186,1671,5.766,1672,4.773,1673,6.857,1674,7.441,1675,5.956]],["t/272",[22,3.969,56,3.946,73,2.975,143,2.919,162,1.848,166,4.682,327,4.041,328,3.07,406,2.964,458,3.172,729,7.114,762,3.916,1676,8.02,1677,7.114,1678,7.114,1679,7.349,1680,9.181,1681,7.632]],["t/274",[20,3.908,32,4.583,75,4.187,143,2.736,197,2.685,198,2.901,241,4.649,327,3.788,328,2.878,339,4.097,406,2.778,421,4.425,565,4.251,716,4.284,722,4.97,762,3.763,932,4.219,1126,4.67,1128,5.028,1185,6.314,1676,6.167,1682,7.706,1683,7.486,1684,7.154,1685,7.154]],["t/276",[139,3.09,143,3.02,327,4.181,328,3.176,406,3.066,432,5.486,621,4.232,762,3.998,805,4.059,1126,5.154,1686,6.406,1687,8.753,1688,5.486,1689,5.486,1690,6.294]],["t/278",[25,2.595,31,4.787,32,4.512,69,4.512,105,2.822,143,2.694,251,4.251,288,3.521,318,3.776,327,3.73,328,2.834,406,2.735,432,4.894,433,2.746,434,3.502,515,3.308,762,3.726,792,2.845,805,3.621,1126,4.598,1160,5.942,1314,5.009,1691,7.809,1692,6.566,1693,3.799,1694,5.435,1695,7.371,1696,5.823,1697,5.522]],["t/280",[21,3.587,23,1.819,29,3.05,143,2.653,197,3.291,198,3.556,277,4.187,282,2.79,284,2.714,286,3.945,316,3.673,327,3.673,328,2.791,406,2.694,762,2.92,764,4.122,765,6.68,889,6.122,1002,3.449,1558,3.814,1573,4.159,1698,3.412,1699,6.937,1700,8.344,1701,8.344,1702,8.344,1703,5.438,1704,5.353]],["t/282",[23,1.778,62,1.98,66,3.658,108,6.143,152,3.613,172,2.237,173,5.155,342,4.712,406,2.634,458,2.819,495,4.946,521,4.094,523,2.527,529,4.823,740,4.562,762,2.855,902,3.305,1056,6.322,1171,5.847,1236,5.847,1305,5.406,1313,4.427,1421,3.447,1692,6.322,1697,5.317,1704,5.233,1705,5.607,1706,5.233,1707,6.783,1708,7.519,1709,4.195,1710,8.159,1711,5.012]],["t/284",[112,4.997,129,4.767,162,2.113,328,3.51,983,6.84]],["t/286",[22,3.986,33,3.587,39,1.96,40,2.707,43,3.438,56,2.921,87,3.283,102,4.87,105,3.737,152,3.01,161,2.794,162,1.856,168,2.53,188,2.511,224,2.246,261,4.584,262,4.018,282,2.439,290,3.148,342,3.925,405,4.766,458,2.348,479,2.202,496,3.169,533,2.113,547,4.36,743,3.971,975,3.925,980,3.048,1103,4.766,1244,5.117,1291,5.266,1304,4.671,1436,3.067,1550,7.381,1573,2.68,1603,4.233,1668,4.018,1712,5.003,1713,5.117,1714,4.986,1715,5.441,1716,5.65,1717,6.796,1718,6.796,1719,4.175,1720,5.117,1721,6.796,1722,5.65,1723,4.584,1724,3.925,1725,5.441,1726,6.263]],["t/288",[30,2.262,37,3.401,40,4.337,44,3.741,45,3.079,49,4.437,62,1.919,71,1.195,102,4.534,105,2.107,112,4.179,117,3.281,120,3.835,129,2.873,147,4.764,162,1.274,172,1.735,188,1.723,224,2.091,284,2.058,285,3.111,288,2.629,309,2.4,327,2.785,328,2.116,337,1.931,339,3.012,363,1.897,403,2.058,406,2.042,477,5.065,481,3.2,496,2.95,508,3.125,517,3.012,573,3.2,614,2.93,627,4.534,648,3.654,743,3.696,934,3.034,955,2.673,983,4.123,986,3.741,1002,2.615,1003,3.887,1010,3.401,1012,3.2,1122,3.2,1133,3.998,1196,4.903,1252,4.121,1291,6.802,1528,5.831,1558,2.892,1727,4.534,1728,5.065,1729,3.835,1730,5.831,1731,3.575,1732,3.226,1733,5.26,1734,3.998,1735,5.831]],["t/290",[22,4.719,45,4.288,57,5.743,84,5.489,87,4.257,112,4.196,133,3.766,154,4.61,162,1.774,167,2.947,190,3.458,223,4.693,444,2.68,489,7.666,500,6.829,504,6.315,515,3.441,521,4.422,551,7.666,558,5.414,566,4.353,589,4.387,962,5.21,1736,8.813]],["t/292",[18,3.414,19,2.397,20,2.857,23,1.371,30,3.126,42,3.414,66,4.506,70,3.262,71,0.857,105,2.095,114,3.813,133,2.688,138,2.827,139,3.269,161,2.586,162,1.76,172,1.725,197,2.728,218,4.1,224,2.079,263,3.593,406,2.031,422,2.527,433,2.038,474,2.201,479,2.038,522,2.954,621,3.896,1002,2.6,1023,3.918,1128,3.675,1219,3.35,1253,3.061,1305,4.169,1312,4.875,1410,3.653,1564,3.613,1573,4.282,1639,2.658,1737,4.411,1738,3.108,1739,4.1,1740,6.775,1741,3.813,1742,5.797,1743,5.472,1744,4.035,1745,5.797,1746,6.291,1747,5.23,1748,5.472,1749,6.291,1750,5.036,1751,4.615,1752,4.035]],["t/294",[19,2.254,23,2.277,30,2.939,34,4.802,66,3.686,70,4.263,105,2.738,138,2.99,139,3.398,188,2.239,349,4.192,406,2.653,422,2.067,433,2.664,571,5.357,621,3.663,716,4.092,1121,5.357,1413,5.89,1433,5.764,1564,3.397,1686,5.544,1734,5.194,1737,5.764,1740,6.369,1753,8.22,1754,6.833,1755,8.22,1756,5.447,1757,8.22]],["t/296",[30,2.874,71,1.095,138,2.681,139,3.899,145,4.169,152,3.56,162,1.618,197,2.508,334,5.637,406,2.595,414,3.582,422,2.022,474,2.813,533,2.499,621,5.064,792,2.699,814,4.542,855,2.825,1253,3.912,1377,4.405,1410,3.359,1559,3.236,1573,3.17,1610,4.873,1639,3.397,1758,6.683,1759,6.436,1760,6.683,1761,7.223,1762,7.409]],["t/298",[19,1.973,23,1.569,30,2.573,39,2.076,139,2.341,162,1.449,197,2.245,198,2.426,224,3.166,241,3.112,282,2.849,301,6.633,313,3.403,326,3.451,407,2.958,414,4.8,426,3.007,437,2.314,485,3.798,533,2.978,547,4.616,596,2.897,620,5.157,621,4.8,803,3.112,814,4.066,953,5.761,1012,4.846,1014,4.547,1092,4.308,1353,3.528,1558,3.29,1573,2.838,1639,3.041,1643,3.869,1731,5.414,1756,4.769,1760,5.983,1763,7.197,1764,7.197,1765,6.633,1766,5.419,1767,4.69]],["t/300",[23,1.931,30,3.168,34,2.936,42,2.727,48,1.308,71,0.684,78,3.687,81,2.393,92,2.629,110,1.829,138,1.937,139,3.402,159,3.275,162,1.498,188,2.027,197,3.63,198,2.508,241,3.217,282,2.344,316,2.212,414,2.239,422,2.754,432,4.297,433,2.871,458,1.736,493,2.199,497,1.604,522,2.359,565,4.377,611,2.239,621,2.239,638,1.598,643,3.894,653,2.839,722,2.902,797,3.601,855,1.766,874,2.727,972,3.026,973,2.16,974,2.81,980,3.336,1002,2.077,1121,3.275,1199,3.783,1231,3.794,1266,3.524,1353,2.464,1410,2.1,1573,3.863,1639,2.123,1685,7.366,1698,2.055,1734,3.175,1739,4.849,1741,3.046,1751,3.687,1768,3.087,1769,5.025,1770,5.025,1771,5.025,1772,4.701,1773,5.025,1774,7.441,1775,4.178,1776,4.571,1777,6.101,1778,4.631,1779,5.025,1780,3.087,1781,3.687,1782,2.839]],["t/302",[34,5.108,107,3.397,138,2.827,139,2.844,224,2.889,282,2.873,444,2.659,475,6.265,491,4.496,518,4.286,792,3.966,796,3.896,814,4.94,865,5.793,1085,4.614,1353,4.286,1556,6.774,1559,3.519,1639,3.694,1762,8.057,1783,8.743,1784,8.743]],["t/304",[19,1.899,23,2.035,33,3.655,71,0.943,96,2.423,107,2.69,111,2.773,138,1.803,139,3.037,152,3.067,162,1.394,197,2.913,284,3.037,288,2.878,326,3.321,351,3.37,422,1.742,434,2.862,485,3.655,491,3.561,496,3.229,510,4.313,514,2.69,621,4.707,626,4.198,762,3.267,801,3.955,805,2.959,902,2.201,967,3.421,973,2.977,1052,3.999,1093,4.442,1188,4.589,1208,5.366,1410,2.894,1421,2.926,1573,3.682,1739,4.513,1785,6.925,1786,5.081,1787,6.382,1788,5.544,1789,6.382,1790,4.442,1791,6.024,1792,6.925,1793,6.925,1794,5.366,1795,5.214,1796,5.081]],["t/307",[48,2.223,73,2.767,92,4.467,162,2.154,172,2.341,190,3.35,191,6.713,271,3.437,285,4.142,328,2.856,371,5.318,382,3.608,437,2.746,498,3.269,547,6.864,620,7.668,753,5.477,763,2.674,824,4.679,1603,5.318,1797,5.658]],["t/309",[38,3.617,58,4.093,71,1.653,75,3.67,105,3.292,167,2.522,191,6.04,342,4.356,382,3.187,433,2.444,474,2.639,485,3.981,492,5.708,498,2.888,545,4.766,547,4.838,566,3.726,575,4.838,721,2.606,792,2.533,795,4.838,813,4.915,850,3.698,890,3.912,902,2.398,975,4.356,1209,3.946,1252,3.541,1481,6.93,1738,3.726,1798,7.543,1799,7.543,1800,6.562,1801,6.27,1802,5.405,1803,6.038,1804,6.562]],["t/311",[23,1.644,56,3.242,68,4.514,73,2.444,110,2.745,161,3.101,172,2.71,191,6.41,285,3.907,342,4.356,349,3.846,428,3.261,437,3.178,439,6.93,458,2.606,492,4.356,498,2.888,510,4.698,526,6.682,533,3.072,575,4.838,753,4.838,869,4.017,1224,6.038,1251,4.356,1252,3.541,1366,4.698,1603,4.698,1636,3.726,1698,3.084,1805,6.038,1806,4.915,1807,7.543,1808,4.698,1809,4.514]],["t/313",[48,1.477,62,2.333,71,1.293,73,1.839,133,3.474,137,2.87,139,1.846,161,3.341,191,6.016,285,3.891,288,2.358,327,2.497,337,3.166,375,2.497,378,2.994,437,3.054,439,3.979,458,1.96,479,3.078,496,2.646,501,2.803,525,7.897,529,5.616,576,4.651,578,2.893,585,3.439,598,3.396,603,2.824,611,2.528,669,4.542,721,2.809,813,3.697,824,3.109,846,3.827,858,3.697,870,3.241,902,1.804,934,2.721,1090,4.936,1146,3.899,1171,4.066,1237,3.979,1261,4.396,1300,4.163,1426,3.76,1468,4.936,1761,3.979,1810,6.507,1811,8.129,1812,6.299,1813,8.129,1814,8.129,1815,4.936,1816,5.674]],["t/315",[28,2.292,39,1.735,40,2.396,45,2.927,62,1.614,68,3.6,71,1.154,73,3.179,98,2.281,142,3.005,153,2.012,164,2.901,167,2.012,170,2.178,191,5.835,285,3.003,298,4.134,328,2.012,330,4.057,337,1.836,361,3.363,437,1.934,458,2.079,496,2.805,498,2.303,502,2.75,510,5.277,521,3.018,526,6.456,529,6.296,530,7.468,531,5.072,533,1.87,562,3.329,573,3.043,584,5.072,650,2.905,769,4.311,792,2.02,1132,6.072,1251,4.894,1817,6.015,1818,8.474,1819,6.015,1820,6.015,1821,6.015,1822,6.015,1823,6.015,1824,4.529,1825,2.864,1826,5.544,1827,6.015,1828,5.544,1829,2.884]],["t/317",[28,2.286,39,1.094,48,1.562,71,1.152,96,1.327,105,2.817,109,1.794,116,1.519,139,1.234,142,1.162,162,1.498,171,1.585,172,2.04,190,1.489,191,4.077,250,1.967,251,3.01,285,2.998,328,2.006,330,2.559,403,1.234,406,1.225,417,1.496,418,2.719,428,1.64,434,3.495,437,2.393,439,2.66,479,1.944,496,1.769,498,1.453,501,1.874,510,7.924,513,2.02,526,3.637,533,3.189,539,7.051,540,7.308,549,2.732,562,2.099,566,2.963,573,1.919,623,2.363,631,2.94,647,1.64,721,1.311,763,2.649,818,1.66,858,2.472,932,1.86,943,2.783,965,2.397,1062,2.66,1075,2.191,1089,1.903,1170,4.702,1209,1.985,1232,2.66,1363,3.909,1480,2.559,1679,3.037,1698,2.453,1705,2.607,1810,3.037,1830,9.526,1831,2.243,1832,3.496,1833,3.496,1834,2.559,1835,3.496,1836,3.3,1837,3.794,1838,9.212,1839,3.794,1840,1.745,1841,2.143,1842,2.079,1843,6.205,1844,3.848,1845,3.496,1846,5.219,1847,2.039,1848,3.037,1849,3.496,1850,2.94,1851,3.794,1852,2.719,1853,3.794,1854,3.154]],["t/319",[19,0.386,21,0.605,23,0.769,25,0.431,28,2.158,29,1.29,39,1.254,48,1.316,62,1.423,71,1.394,73,2.162,89,0.666,92,1.341,96,0.897,105,0.854,106,0.598,109,1.212,111,1.413,114,0.853,116,1.027,119,2.339,122,0.771,132,0.712,138,0.367,139,0.458,141,0.757,142,0.785,145,1.33,146,0.643,147,1.06,151,0.75,152,0.623,153,2.499,161,2.549,162,0.711,164,1.185,166,0.718,168,0.524,170,2.694,171,1.475,172,1.83,190,1.385,191,4.449,197,0.439,198,0.475,224,0.465,277,1.286,282,0.372,285,1.791,291,0.517,292,0.585,327,0.62,328,0.857,330,0.95,337,1.077,341,1.225,342,1.481,365,2.087,371,7.188,375,0.62,378,0.743,385,1.091,389,0.75,403,0.458,405,2.475,406,0.454,426,0.588,428,1.88,434,2.758,437,0.453,438,1.06,439,0.987,444,0.428,458,0.886,461,1.5,465,1.06,466,1.17,474,1.235,479,1.144,493,0.616,496,1.195,498,2.169,501,1.744,502,1.172,510,3.861,513,0.75,525,2.131,526,7.187,528,1.554,533,3.292,534,1.817,539,2.989,542,3.693,544,1.837,545,2.748,547,2.79,558,0.865,562,1.419,566,0.695,573,0.712,594,0.843,595,1.212,596,1.032,597,0.987,598,1.534,599,2.338,600,0.804,604,0.635,630,0.822,662,0.832,676,0.757,699,1.266,713,0.843,718,1.378,724,0.787,739,0.787,749,1.466,756,1.297,762,0.493,796,1.142,813,0.917,815,0.666,817,1.93,846,0.95,850,2.132,853,1.863,854,0.795,859,0.917,860,1.534,867,1.071,891,1.033,893,0.656,902,0.815,921,0.813,932,1.73,943,1.033,955,0.595,973,0.605,988,1.033,1015,0.853,1035,0.89,1036,0.712,1037,0.813,1061,1.06,1062,0.987,1072,0.917,1080,0.743,1081,1.464,1089,0.706,1152,0.616,1165,1.009,1171,1.009,1209,0.736,1252,0.661,1263,1.419,1282,0.903,1308,0.795,1313,1.391,1361,1.534,1363,4.623,1384,0.89,1405,1.06,1421,0.595,1470,3.554,1476,1.033,1541,0.832,1559,0.567,1562,0.804,1638,1.102,1639,0.595,1644,1.091,1671,2.735,1694,2.79,1698,0.576,1728,1.127,1754,1.17,1800,1.225,1804,1.225,1808,1.597,1810,1.127,1825,2.697,1829,1.693,1833,1.297,1835,1.297,1841,2.855,1855,6.494,1856,1.408,1857,1.408,1858,1.225,1859,1.297,1860,1.408,1861,3.253,1862,3.071,1863,1.408,1864,1.408,1865,1.408,1866,1.408,1867,1.408,1868,1.297,1869,1.408,1870,2.23,1871,2.826,1872,1.408,1873,1.408,1874,1.408,1875,2.564,1876,1.408,1877,1.498,1878,0.743,1879,0.706,1880,1.408,1881,1.408,1882,1.408,1883,2.564,1884,1.408,1885,2.564,1886,1.297,1887,1.225,1888,1.408,1889,1.408,1890,1.408,1891,0.917,1892,1.408,1893,0.933,1894,2.23,1895,1.408,1896,1.17,1897,1.408,1898,1.408,1899,1.408,1900,2.564,1901,2.564,1902,0.903,1903,3.53,1904,5.053,1905,5.053,1906,1.408,1907,1.408,1908,1.408,1909,1.408,1910,1.408,1911,1.408,1912,1.408,1913,1.408,1914,1.408,1915,1.408,1916,3.53,1917,1.408,1918,0.832,1919,1.408,1920,1.17,1921,1.297,1922,2.564,1923,1.297,1924,1.127,1925,1.408,1926,1.408,1927,3.53,1928,1.408,1929,1.408,1930,3.53,1931,1.408,1932,3.53,1933,3.53,1934,1.408,1935,1.408,1936,1.091,1937,1.729,1938,1.17,1939,1.408]],["t/321",[19,2.635,23,1.263,25,1.775,42,3.144,48,2.726,71,1.123,73,3.114,106,2.462,117,3.004,139,1.885,143,1.842,146,2.648,164,1.578,167,1.937,172,2.262,197,3.453,198,2.782,241,2.505,282,1.533,326,2.778,354,2.907,365,5.681,375,2.55,383,3.058,422,2.417,431,3.526,445,4.662,458,2.002,474,2.027,479,2.674,518,2.84,523,1.794,534,2.421,543,2.884,573,2.93,596,2.332,652,3.716,796,2.582,855,2.036,887,3.716,972,2.356,1084,3.982,1148,6.605,1253,2.819,1275,3.309,1421,2.448,1936,4.489,1940,3.114,1941,5.793,1942,5.793,1943,4.489,1944,5.339,1945,5.339,1946,4.489,1947,5.339,1948,5.339,1949,5.793,1950,8.251,1951,10.472,1952,5.793,1953,5.04,1954,5.339,1955,5.04,1956,3.982]],["t/323",[35,4.141,44,3.616,48,1.592,51,2.412,62,1.165,71,1.167,92,3.199,109,2.891,114,3.707,138,1.592,139,1.989,140,3.573,164,2.696,197,1.908,290,2.833,316,2.692,433,1.982,458,2.113,462,4.739,468,2.599,514,2.376,518,2.998,523,2.655,533,1.901,550,4.896,614,2.833,619,2.692,721,2.113,741,2.742,749,3.337,957,4.053,981,4.487,1059,3.616,1128,3.573,1152,2.676,1256,3.172,1324,5.32,1377,3.351,1511,4.125,1584,3.455,1600,5.852,1732,3.119,1777,3.809,1780,6.938,1782,4.844,1957,5.32,1958,6.116,1959,4.739,1960,5.587,1961,7.924,1962,7.452,1963,7.9,1964,3.986,1965,5.681,1966,6.116,1967,6.116,1968,5.084,1969,3.986,1970,4.739]],["t/325",[22,2.153,29,1.82,35,2.405,71,1.006,75,4.288,81,2.371,84,3.101,92,4.61,110,1.812,138,2.712,139,1.62,142,2.264,161,2.047,162,1.002,164,1.356,168,1.854,172,2.026,186,4.877,188,1.356,197,1.554,241,2.153,282,1.317,328,1.665,362,3.101,381,3.019,397,2.784,401,3.653,406,1.607,422,1.859,433,2.856,458,1.721,462,3.859,468,2.116,501,2.46,515,1.944,533,1.548,543,2.479,566,2.46,614,2.306,699,3.651,729,3.859,749,2.492,762,1.743,763,1.559,792,1.672,803,2.153,851,3.194,972,3.006,993,2.98,1002,2.058,1012,2.519,1059,2.944,1154,3.492,1166,3.653,1275,2.844,1357,3.492,1576,2.909,1599,3.146,1600,2.944,1615,4.332,1618,2.784,1690,4.898,1704,3.194,1734,3.146,1777,7.228,1780,5.99,1782,4.98,1960,3.245,1965,3.3,1968,4.14,1971,3.749,1972,7.327,1973,4.98,1974,3.359,1975,4.98,1976,2.844,1977,3.859,1978,3.749,1979,4.589,1980,3.359,1981,4.589,1982,3.749,1983,3.019,1984,4.589,1985,4.98,1986,3.859,1987,4.98]],["t/327",[19,1.745,25,1.949,48,1.657,51,3.475,61,2.275,71,0.866,84,3.963,92,3.329,96,2.227,98,2.413,138,1.657,146,4.621,162,1.281,172,1.745,197,2.75,251,3.193,282,1.683,349,3.245,422,1.6,431,2.72,433,2.062,458,2.199,461,2.704,512,4.791,522,2.988,531,3.809,619,2.801,621,3.927,644,3.272,752,2.46,775,5.536,792,2.137,865,5.84,874,3.453,946,4.082,972,2.588,1087,3.522,1198,3.595,1230,3.762,1252,2.988,1511,5.944,1564,2.63,1618,3.558,1686,4.292,1780,3.909,1782,3.595,1957,5.536,1960,4.147,1962,4.791,1972,8.405,1976,3.635,1977,4.931,1983,3.858,1988,6.364,1989,6.364,1990,5.536,1991,6.364,1992,4.56,1993,6.364,1994,6.364,1995,5.84,1996,6.364,1997,5.094]],["t/329",[19,1.212,23,1.787,29,1.615,35,2.134,48,2.575,58,2.398,71,0.602,73,1.432,75,5.581,84,6.161,92,2.312,109,3.194,138,1.15,143,2.147,152,1.957,162,0.89,164,1.84,172,1.852,173,2.792,186,6.194,198,1.49,275,2.375,282,1.169,290,2.047,328,1.478,349,2.253,375,1.945,381,2.679,401,3.242,402,2.524,444,1.344,451,2.353,462,5.234,479,1.432,499,3.844,517,2.104,523,1.369,533,1.374,614,2.047,644,2.272,653,2.497,721,1.527,741,1.981,770,5.801,792,2.753,803,1.911,805,1.889,814,2.497,821,3.674,850,2.166,865,2.928,973,1.9,1038,2.2,1059,2.613,1085,2.332,1089,2.217,1111,2.88,1230,2.613,1236,3.167,1248,2.715,1258,3.363,1282,2.835,1326,5.876,1482,2.679,1511,2.981,1514,2.752,1600,2.613,1615,5.876,1618,3.777,1648,2.835,1727,3.167,1729,2.679,1782,3.817,1960,5.344,1961,3.538,1965,2.928,1969,2.88,1972,3.674,1978,3.327,1990,3.844,1995,6.084,1998,3.424,1999,3.844,2000,3.844,2001,3.327,2002,3.674,2003,3.242,2004,6.755,2005,3.538,2006,3.037,2007,3.674,2008,4.419,2009,4.419,2010,4.419,2011,3.242,2012,3.167,2013,3.674,2014,3.327,2015,6.225,2016,3.037,2017,3.674,2018,4.072]],["t/331",[25,2.121,31,3.913,35,3.345,48,1.803,75,5.502,84,4.313,92,3.623,117,3.591,138,1.803,142,2.86,186,6.257,197,2.913,241,2.994,381,4.198,397,3.872,458,3.907,462,5.366,520,4.375,523,2.145,543,3.447,614,3.207,619,4.11,630,4.046,803,4.037,946,4.442,1059,4.094,1096,4.198,1230,4.094,1393,4.198,1439,4.442,1482,4.198,1511,4.671,1574,3.105,1600,4.094,1782,3.913,1786,5.081,1957,6.024,1965,4.589,1983,4.198,1984,6.382,2011,5.081,2019,6.382,2020,5.214,2021,6.024,2022,5.757,2023,4.198]],["t/333",[23,1.182,25,1.661,28,3.528,34,5.409,45,2.638,56,2.331,66,2.431,71,1.261,73,3,105,1.806,107,2.106,129,2.462,143,1.724,146,2.478,151,2.887,156,4.997,162,2.393,164,1.477,166,2.765,167,1.813,191,6.743,197,1.692,198,1.828,241,2.344,316,2.387,326,2.6,328,1.813,382,3.324,385,4.201,407,2.229,428,3.401,433,1.757,496,2.528,498,3.545,510,5.766,519,3.168,526,5.613,554,3.426,562,3.001,565,2.678,571,3.533,577,3.097,596,2.182,626,3.287,662,3.205,724,3.031,763,2.464,867,3.287,890,2.812,962,3.205,1159,4.201,1470,2.887,1636,3.886,1711,5.687,1801,4.507,1808,3.377,1844,3.478,2024,3.978,2025,4.717,2026,8.836,2027,4.997,2028,3.802,2029,4.717]],["t/335",[23,1.437,62,2.503,71,0.898,73,2.136,105,2.196,139,2.145,142,2.019,162,1.818,191,5.644,197,2.817,198,3.044,223,3.511,241,3.904,327,2.902,328,2.205,337,3.144,382,2.786,437,2.904,510,4.106,525,7.507,526,5.474,529,3.898,530,4.623,531,3.946,542,4.998,578,3.362,596,2.653,633,3.577,648,3.808,853,3.479,1015,3.996,1036,3.335,1313,3.577,1584,3.725,1711,5.547,1805,5.278,2030,5.108,2031,6.076,2032,6.076,2033,6.076,2034,6.076,2035,6.593]],["t/337",[21,2.274,23,2.328,71,0.442,73,1.051,105,4.045,115,3.308,118,5.535,139,1.721,162,0.653,168,1.208,191,1.778,197,3.332,198,3.601,241,4.618,327,4.019,510,3.296,526,6.628,527,1.446,533,1.009,539,5.312,594,6.676,650,3.733,663,2.556,743,7.246,938,2.598,973,2.88,991,3.167,1037,4.464,1062,6.403,1140,6.345,1170,2.05,1571,1.42,1630,4.603,1698,3.733,1712,4.955,1841,1.833,1843,9.37,1844,7.155,1846,4.603,1850,4.1,2036,4.603,2037,6.723,2038,3.245,2039,3.245,2040,1.814]],["t/339",[23,2.3,28,2.633,48,2.067,73,2.239,105,2.644,110,3.393,117,2.847,125,2.092,161,1.396,191,4.776,197,3.583,198,3.558,223,1.808,241,4.792,271,2.209,282,2.703,328,1.836,351,2.671,365,4.693,383,2.897,434,3.281,479,1.779,510,2.115,521,2.754,526,6.719,527,1.513,533,3.621,542,5.16,549,2.016,610,3.559,726,3.638,749,1.851,763,1.719,970,1.628,973,4.008,1122,2.777,1253,2.671,1412,2.872,1470,2.924,1476,5.824,1571,1.485,1573,2.165,1639,2.32,1712,4.308,1719,4.876,1747,6.599,1806,3.578,1843,6.841,1844,5.092,1855,4.564,2032,5.059,2033,5.059,2034,5.059,2041,5.059,2042,3.286,2043,7.938,2044,5.49,2045,2.924,2046,2.799,2047,3.85,2048,4.776,2049,4.254,2050,5.49]],["t/341",[28,2.066,61,2.813,62,1.934,71,0.738,73,2.549,89,2.563,92,4.843,105,1.806,110,2.863,139,1.764,145,2.812,162,2.045,191,6.359,271,3.166,282,2.687,285,3.6,297,3.657,365,4.651,368,2.619,371,7.006,389,2.887,428,3.401,434,2.241,479,1.757,493,2.372,498,2.076,502,2.478,526,4.769,577,3.097,595,4.377,662,3.205,724,6.03,902,1.724,1064,3.245,1072,3.533,1248,3.331,1253,3.828,1361,3.245,1605,3.001,1613,3.426,1694,6.515,1711,3.331,1808,3.377,1834,3.657,1843,3.978,1855,4.507,1859,4.997,1894,4.717,2040,3.031,2051,10.157,2052,7.25,2053,7.25,2054,4.717,2055,3.205,2056,5.422,2057,5.422]],["t/343",[62,1.934,71,1.071,73,2.549,105,3.383,142,2.41,153,2.631,277,3.947,285,2.788,309,2.983,337,3.1,403,3.659,474,2.753,498,3.889,502,3.596,533,2.445,638,3.779,743,4.596,752,3.041,902,2.501,934,3.772,1152,4.444,1384,4.971,1843,5.772,2040,4.398,2058,8.836,2059,7.867,2060,7.867,2061,7.867,2062,6.096]],["t/345",[45,2.612,66,2.407,71,0.731,73,1.07,76,2.057,84,3.344,98,1.253,105,4.211,107,2.086,109,1.562,110,1.954,111,1.323,115,2.83,125,1.259,150,1.93,153,1.105,162,1.365,168,1.23,169,1.847,170,2.008,197,2.437,223,1.759,241,2.321,272,1.105,285,1.903,327,2.363,339,1.573,403,1.075,405,4.756,406,1.066,434,1.365,444,1.005,460,1.93,498,1.265,510,4.865,528,2.002,533,1.027,539,4.662,594,6.58,606,1.685,608,2.487,612,1.793,614,3.142,647,1.428,650,1.596,663,2.593,737,2.316,741,1.481,743,7.062,813,2.153,902,1.05,948,1.828,962,3.174,973,2.916,991,1.977,994,2.228,1002,1.365,1007,2.746,1027,1.51,1036,1.671,1037,3.101,1062,6.026,1089,1.657,1091,2.228,1098,2.002,1140,6.131,1206,2.367,1219,2.859,1277,2.228,1315,2.367,1421,1.396,1562,1.887,1576,3.137,1630,4.671,1698,3.513,1711,2.029,1712,1.793,1719,4.167,1732,1.685,1843,9.128,1844,5.01,1846,2.874,2002,2.746,2037,4.671,2063,3.303,2064,3.303,2065,2.316,2066,3.213,2067,3.044,2068,2.874,2069,2.153,2070,4.16,2071,3.303,2072,2.189,2073,2.228,2074,3.303,2075,2.874,2076,2.746,2077,2.56,2078,2.367,2079,3.303,2080,2.56]],["t/348",[23,1.428,40,2.611,46,3.743,71,0.892,168,2.439,172,2.466,197,3.448,284,2.132,318,5.16,417,2.584,444,1.993,468,2.785,474,2.293,513,3.49,514,2.546,533,2.037,534,2.738,543,3.262,573,4.549,607,3.664,647,2.833,751,3.49,805,2.801,967,3.237,980,5.364,1036,4.549,1211,4.271,1256,3.399,1353,3.213,1421,2.769,1436,2.957,1573,2.584,1655,5.246,1698,2.679,1879,3.288,1974,4.42,2081,6.307,2082,11.025,2083,8.563,2084,3.556,2085,6.553,2086,4.081,2087,6.181]],["t/350",[39,2.502,71,1.181,151,4.619,190,3.403,250,4.498,422,2.181,431,4.618,515,3.386,528,5.258,549,3.185,622,5.653,749,2.924,980,3.889,1003,5.328,1248,5.328,1514,5.402,1559,3.491,1593,7.161,1974,5.85,2081,6.082,2083,6.721,2088,6.216,2089,5.328,2090,8.674,2091,8.674]],["t/352",[44,1.739,48,1.271,51,1.16,54,1.739,58,2.648,62,1.967,71,0.4,73,0.953,87,1.421,103,1.917,110,1.07,117,1.525,129,1.336,143,1.551,170,0.756,186,1.628,190,1.915,197,3.445,198,0.991,200,2.021,251,2.449,282,1.291,292,1.222,309,1.851,316,1.295,327,2.148,328,2.092,339,3.466,377,1.525,378,1.552,422,2.428,426,2.039,431,1.257,433,1.581,468,3.92,474,1.029,496,1.371,513,1.566,533,0.914,540,2.921,546,2.753,562,1.628,566,1.453,573,1.488,575,1.886,605,4.589,614,1.362,621,1.311,648,1.699,650,3.021,699,4.302,719,3.09,722,3.613,749,1.645,756,1.488,763,0.921,817,2.214,870,1.68,886,2.108,902,1.989,955,1.243,966,2.805,972,1.985,978,1.858,997,3.292,1028,1.76,1133,1.858,1140,1.858,1176,2.757,1196,3.782,1219,1.566,1230,1.739,1256,2.531,1482,1.783,1559,1.184,1571,3.533,1573,2.467,1603,1.832,1729,1.783,1732,1.5,1781,2.158,1902,1.886,1940,1.581,1960,1.917,1978,2.214,2014,2.214,2016,5.004,2020,2.214,2027,2.71,2042,2.921,2047,4.386,2055,2.885,2084,3.951,2092,6.014,2093,4.483,2094,2.214,2095,1.984,2096,2.279,2097,2.941,2098,6.469,2099,2.941,2100,4.71,2101,2.062,2102,4.88,2103,6.255,2104,2.71,2105,4.88,2106,4.88,2107,2.158,2108,2.941,2109,2.941,2110,1.628,2111,2.941,2112,6.255,2113,2.941,2114,2.941,2115,2.941,2116,2.941,2117,2.941,2118,5.102,2119,2.941,2120,2.941,2121,2.941,2122,3.272,2123,6.255,2124,2.941,2125,4.974,2126,4.88,2127,2.941,2128,2.941,2129,3.354,2130,2.998,2131,2.941,2132,2.354,2133,2.941,2134,2.279,2135,2.941,2136,2.941,2137,2.214,2138,2.445,2139,2.941,2140,2.445,2141,2.941]],["t/354",[40,3.428,87,4.157,129,3.908,168,3.203,192,5.36,197,2.685,496,5.014,533,2.675,562,4.763,749,3.625,1140,5.438,1219,4.583,1482,5.217,1573,4.24,2092,6.697,2129,7.39,2137,6.479,2142,10.753,2143,9.91,2144,5.088,2145,7.154]],["t/356",[23,1.727,30,2.833,71,1.079,73,2.568,101,5.446,129,4.634,139,2.578,143,2.519,162,1.595,197,3.184,198,2.671,241,3.426,326,3.799,327,3.488,368,4.929,461,3.367,527,3.531,562,4.385,595,3.746,763,2.481,870,4.525,1098,4.803,1573,4.024,1825,3.772,2026,6.893,2028,5.556,2146,8.038,2147,7.03,2148,6.343]],["t/358",[24,1.579,27,6.877,28,1.03,30,0.966,40,1.811,62,1.315,68,1.617,71,0.94,73,0.876,84,6.24,87,1.305,110,1.655,133,1.155,137,2.977,138,0.704,143,0.859,151,2.422,190,2.709,197,3.214,284,0.879,290,1.252,291,1.67,309,1.025,337,1.797,339,2.165,351,1.315,353,1.527,354,1.356,374,1.966,403,1.915,404,1.617,434,1.117,459,1.598,468,3.546,497,1.879,501,1.335,512,2.035,514,1.767,522,1.269,524,1.895,528,1.638,533,1.413,534,1.9,549,2.161,562,1.496,566,1.335,576,2.039,578,2.319,603,4.154,606,1.378,610,4.347,614,1.252,619,2.591,633,1.466,650,4.839,719,1.335,749,2.992,758,1.439,762,0.946,816,1.598,855,2.069,864,1.543,870,1.543,886,1.937,902,1.871,932,1.325,934,1.296,961,2.49,970,1.296,973,1.162,1002,1.117,1052,1.561,1053,1.439,1064,1.617,1094,1.761,1098,1.638,1099,2.163,1127,1.325,1201,2.094,1231,1.378,1243,1.823,1271,1.707,1313,1.466,1314,1.598,1316,2.873,1436,2.656,1442,2.963,1470,3.135,1480,1.823,1533,2.247,1619,1.453,1655,2.163,1666,1.983,1741,1.638,1986,2.094,2028,1.895,2042,1.617,2084,4.528,2110,2.516,2146,7.75,2147,1.683,2149,1.252,2150,7.098,2151,4.947,2152,5.887,2153,2.702,2154,3.64,2155,2.035,2156,2.702,2157,2.702,2158,2.702,2159,2.702,2160,9.72,2161,3.189,2162,2.702,2163,2.702,2164,2.702,2165,6.937,2166,6.904,2167,5.887,2168,2.49,2169,2.702,2170,2.702,2171,2.702,2172,4.547,2173,4.547,2174,1.937,2175,2.702,2176,4.547,2177,2.702,2178,2.702,2179,2.49,2180,3.78,2181,2.094,2182,2.702,2183,2.49,2184,2.247,2185,1.761,2186,1.983,2187,4.128,2188,4.547,2189,2.49]],["t/360",[39,2.693,71,1.271,164,2.543,170,2.4,181,7.042,224,4.019,327,4.11,328,3.122,406,3.014,444,3.438,498,3.575,596,3.758,2040,5.22,2190,7.03]],["t/363",[19,1.268,23,1.524,30,1.653,42,2.509,46,2.641,48,2.955,51,1.823,57,3.013,61,1.653,66,2.073,71,0.63,105,2.329,116,1.851,125,2.664,143,2.223,161,2.874,164,1.259,168,1.721,172,1.268,197,3.439,198,2.842,224,2.786,271,2.814,282,1.223,285,2.478,313,3.305,326,2.217,337,2.573,350,2.1,365,2.733,403,2.742,422,2.363,431,4.016,433,1.498,445,2.612,491,3.595,498,1.77,514,1.796,515,1.805,523,3.126,533,2.173,546,3.077,576,2.073,600,3.993,607,2.585,610,2.073,611,2.06,612,2.509,619,3.711,644,2.377,675,3.013,676,3.758,730,2.84,737,3.242,764,2.284,803,1.999,855,1.625,882,2.127,965,2.921,1002,1.911,1038,2.302,1075,2.67,1087,2.559,1176,2.612,1229,3.844,1253,2.25,1263,2.559,1309,3.481,1334,2.84,1409,3.392,1421,1.954,1469,2.701,1558,2.113,1559,1.861,1573,3.324,1584,2.612,1618,2.585,1739,3.013,1831,2.733,1877,2.701,2016,3.178,2118,2.921,2125,4.815,2191,3.583,2192,4.261,2193,3.583,2194,4.022,2195,4.624]],["t/365",[337,3.143,368,4.975,523,3.19,2094,9.023,2118,6.508,2196,9.492]],["t/367",[71,1.271,136,6.297,142,2.86,143,2.968,154,4.884,164,2.543,224,3.736,277,4.685,337,2.85,422,2.348,431,3.99,523,3.502,771,6.135,2197,9.337,2198,7.762]],["t/369",[282,3.205,283,6.132,523,3.251,533,3.263]],["t/371",[422,2.615,431,4.443,523,3.22,533,3.232,2199,10.018]],["t/373",[142,2.789,164,2.48,282,2.409,328,3.045,339,5.727,350,4.135,422,2.29,431,3.891,498,3.486,523,2.82,723,5.449,2040,5.091,2125,5.2,2200,8.391,2201,9.686,2202,7.839]],["t/375",[21,5.133,71,1.219,142,2.743,164,2.44,282,2.369,350,4.067,422,2.252,431,3.828,448,6.94,498,3.429,523,2.774,2040,5.008,2125,5.115,2200,8.254,2201,9.589,2202,8.12,2203,8.956]],["t/377",[96,3.109,118,5.385,143,2.824,151,4.731,172,2.436,277,4.458,284,2.89,375,3.91,433,2.879,498,3.402,554,6.93,638,3.783,726,5.887,931,7.728,955,3.754,1075,5.131,1573,3.503,2125,5.074,2204,7.728,2205,7.728,2206,8.884]],["t/379",[48,2.813,106,4.592,197,2.706,383,4.578,422,2.181,431,3.707,433,2.811,514,4.573,523,2.686,614,4.017,726,8.164,729,6.721,771,4.707,1107,5.748,1326,7.545,1417,5.748,2125,4.954,2207,6.943,2208,5.402,2209,5.961]],["t/381",[27,5.018,48,2.322,58,3.514,71,1.215,106,3.791,172,1.776,197,3.184,198,2.183,282,1.713,283,3.783,291,2.378,292,3.707,383,3.418,422,1.629,426,2.706,441,4.541,474,2.266,497,2.067,514,2.516,523,3.16,566,3.199,573,3.276,610,2.904,622,4.22,726,5.911,749,2.183,795,4.154,798,4.217,813,4.22,972,2.634,1037,3.74,1098,3.926,1231,3.302,1282,4.154,1467,4.541,1476,4.751,1564,2.677,1626,4.092,1656,3.926,1782,5.04,1879,3.249,1971,4.876,2005,7.141,2125,3.699,2138,7.416,2180,5.384,2204,5.634,2209,4.451,2210,6.476,2211,5.184,2212,6.476,2213,5.556,2214,5.634,2215,6.476,2216,5.968,2217,5.634]],["t/383",[48,2.223,73,3.468,87,4.124,106,3.628,197,2.664,198,2.879,271,4.307,272,2.856,280,5.565,282,2.259,297,5.759,314,5.477,383,4.507,444,2.597,517,4.065,523,2.645,610,3.829,719,4.218,988,6.265,1129,5.318,1211,5.565,1559,3.437,2048,7.428,2218,9.356,2219,8.539]],["t/386",[62,1.577,71,1.429,105,3.496,143,2.633,153,2.769,190,3.249,335,5.312,350,3.761,418,5.935,437,2.663,497,2.643,523,2.565,531,6.282,533,3.263,543,4.123,549,3.041,606,4.223,614,3.836,817,6.235,818,3.623,1442,5.397,1719,5.087,1844,5.312,2118,5.233,2149,3.836,2202,5.397,2220,10.497,2221,7.632]],["t/388",[71,1.352,105,3.307,190,3.895,437,3.192,523,3.074,531,5.942,533,3.086,1719,6.098,1844,7.523,2118,6.272]],["t/390",[71,1.293,105,3.805,190,3.727,197,2.963,437,3.054,523,2.942,531,5.685,533,2.952,1638,4.083,1668,5.615,1712,6.648,1719,5.835,2118,6.001]],["t/392",[71,1.364,105,3.337,190,3.931,374,5.098,437,3.221,523,3.102,533,3.114,1719,6.154,2118,6.33]],["t/394",[71,1.364,105,3.337,190,3.931,437,3.221,523,3.102,533,3.114,1719,6.154,2118,6.33,2222,8.45]],["t/397",[23,2.052,48,2.452,96,3.295,170,2.421,335,6.04,353,5.321,375,4.145,383,4.97,384,7.538,444,2.864,523,2.916,612,5.11,637,6.24,745,8.678,2040,5.265,2223,11.365]],["t/399",[48,2.452,71,1.282,106,4.829,288,3.913,383,6.442,422,2.368,498,3.606,523,2.916,943,6.909,1458,5.378,1626,7.181,2224,8.678,2225,8.678]],["t/401",[71,1.271,106,4.804,288,3.88,383,6.418,403,3.037,422,2.348,498,3.575,523,2.892,943,6.85,1458,5.333,1878,4.928,2224,8.605,2225,8.605,2226,11.306]],["t/403",[71,1.305,164,2.61,288,5.11,350,4.351,368,4.628,374,4.142,383,5.057,498,3.669,523,2.967,573,4.846,619,4.217,965,7.256]],["t/405",[71,1.293,115,3.441,328,3.176,383,6.029,498,3.637,523,2.942,533,3.808,719,4.692,795,6.093,934,4.555,1313,5.154,1502,9.145]],["t/407",[71,1.364,288,4.163,328,3.35,383,6.223,422,2.519,498,3.836,523,3.102,723,7.058]],["t/409",[71,1.352,106,4.218,167,3.922,328,3.32,383,6.19,422,2.95,498,3.801,523,3.074]],["t/412",[62,1.89,105,3.907,354,4.981,993,5.942,1668,5.869,1712,5.387,1719,6.098,2227,7.283,2228,9.927,2229,9.927]],["t/414",[23,2.052,71,1.282,73,3.052,162,2.288,164,3.096,197,2.938,198,3.175,282,2.491,653,5.321,1027,4.304,1584,5.321,1638,4.048,2016,6.472,2230,7.538,2231,7.829]],["t/416",[23,1.276,25,1.793,71,1.316,106,2.488,141,4.469,142,2.546,162,2.442,170,1.505,172,1.605,190,2.297,197,3.016,198,3.259,224,1.935,241,2.532,276,4.196,277,4.85,282,2.199,283,3.421,284,3.423,422,2.091,431,4.497,468,2.488,580,2.73,623,3.647,638,3.073,749,1.974,936,3.93,1219,3.118,1638,2.517,1703,5.418,1840,2.694,1956,4.024,2093,4.196,2125,6.594,2230,4.687,2232,8.409,2233,5.855,2234,3.88,2235,2.19,2236,4.196,2237,8.313,2238,5.855,2239,5.855,2240,5.855,2241,5.855,2242,5.855,2243,5.396,2244,5.855,2245,4.024,2246,4.868,2247,5.855]],["t/418",[19,1.755,51,3.489,62,1.825,71,0.561,81,1.962,110,1.5,125,1.57,142,2.935,162,1.781,164,3.128,167,2.625,170,1.059,197,2.99,198,1.389,224,2.115,278,4.587,281,5.321,282,1.09,292,1.712,333,2.643,350,1.871,357,3.023,381,2.498,406,1.33,422,1.974,426,1.722,431,4.095,437,1.325,444,1.253,468,1.751,479,2.074,493,2.801,533,1.281,599,2.215,619,1.814,641,5.054,671,3.103,719,2.036,739,2.304,749,2.158,763,2.005,770,4.044,854,3.617,855,2.249,936,1.948,1002,1.703,1035,2.604,1084,2.832,1219,3.409,1558,2.926,1600,4.64,1638,3.374,1727,2.953,1738,2.036,1825,3.047,1877,2.407,1918,2.436,1955,3.585,1956,2.832,2001,3.103,2016,6.082,2017,3.426,2040,2.304,2122,3.348,2125,2.354,2230,3.299,2232,6.827,2248,3.103,2249,4.121,2250,4.121,2251,4.121,2252,3.585,2253,4.121,2254,4.121,2255,4.121,2256,3.585,2257,4.121,2258,4.121,2259,3.426,2260,4.121,2261,4.121,2262,4.121,2263,4.121,2264,3.299,2265,3.023,2266,2.566,2267,3.798,2268,3.023,2269,4.121,2270,4.121,2271,3.798,2272,3.299,2273,8.849,2274,4.317,2275,4.121,2276,7.848,2277,3.932,2278,4.121]],["t/420",[19,0.421,23,0.605,27,2.149,29,1.014,46,0.877,48,0.722,51,0.606,58,0.833,61,0.549,62,1.831,64,1.19,66,0.689,71,1.152,92,0.803,100,1.156,105,0.511,106,1.179,110,1.009,125,0.585,138,0.988,139,0.5,141,0.825,142,2.004,143,0.488,146,1.268,162,2.273,164,1.634,167,0.928,170,0.975,197,2.439,198,1.812,224,0.917,227,2.559,241,2.324,251,0.771,262,0.908,272,0.514,277,1.904,282,0.734,284,2.543,290,0.711,291,0.564,318,1.236,328,1.269,337,0.469,350,0.697,354,1.904,374,1.199,375,0.676,381,1.682,403,1.234,405,1.077,407,1.14,417,0.606,422,0.698,426,1.159,431,0.656,433,2.83,434,0.635,437,0.892,458,0.959,468,3.322,479,0.498,493,0.672,497,0.885,513,0.818,518,0.753,523,0.859,529,0.908,532,1.415,546,0.676,549,1.019,554,0.97,573,1.403,577,1.584,578,1.415,580,0.716,584,1.66,595,0.726,610,0.689,614,1.285,625,2.363,628,0.919,638,1.709,699,4.438,717,0.919,722,0.887,724,1.551,749,3.028,762,0.537,764,1.874,771,0.833,785,1.1,792,0.516,793,1.001,797,1.1,798,1.311,803,1.64,805,0.656,851,0.985,855,0.975,866,1.753,869,0.818,870,1.584,874,0.833,882,0.707,890,0.796,921,3.779,924,2.413,936,0.726,955,1.172,958,1.127,970,0.736,971,1.682,986,2.748,1078,0.943,1080,0.81,1084,1.055,1089,1.392,1119,1.018,1152,0.672,1218,0.956,1219,1.477,1231,0.783,1271,0.97,1306,0.943,1376,1.156,1390,1.52,1392,0.908,1393,0.931,1439,0.985,1573,1.094,1600,1.64,1638,2.31,1642,0.588,1668,0.908,1693,1.244,1703,1.001,1712,0.833,1732,1.415,1738,1.874,1744,2.433,1747,1.277,1772,1.753,1777,1.728,1780,2.33,1781,1.127,1782,1.567,1825,0.731,1840,1.276,1842,0.841,1854,1.277,1877,0.897,1879,1.904,1891,1.001,1918,1.64,1956,1.906,1960,1.001,1972,2.306,1976,0.877,1979,2.556,1980,1.871,1981,2.556,1983,1.682,1995,1.838,1999,1.336,2011,1.127,2012,1.1,2015,2.556,2016,5.114,2017,3.864,2018,2.556,2042,3.591,2049,1.19,2062,1.19,2084,2.522,2087,2.607,2092,0.956,2118,2.937,2122,1.451,2125,1.584,2129,1.906,2181,1.19,2186,1.127,2192,2.556,2205,2.413,2222,1.988,2230,2.221,2234,1.838,2235,1.738,2243,1.415,2245,2.607,2265,2.035,2272,1.229,2279,2.774,2280,1.536,2281,3.794,2282,3.794,2283,2.774,2284,1.536,2285,2.774,2286,1.536,2287,3.794,2288,1.945,2289,1.536,2290,1.336,2291,2.556,2292,1.536,2293,1.536,2294,1.415,2295,1.536,2296,1.536,2297,1.536,2298,1.536,2299,1.536,2300,1.536,2301,1.536,2302,1.536,2303,1.536,2304,1.536,2305,1.415,2306,1.277,2307,1.536,2308,1.536,2309,1.536,2310,2.748,2311,1.536,2312,1.536,2313,1.536,2314,1.229,2315,1.415,2316,1.551,2317,1.536,2318,1.536,2319,1.229,2320,1.415,2321,1.536,2322,2.413,2323,1.945,2324,1.988,2325,1.536,2326,3.794,2327,1.536,2328,1.077,2329,1.077,2330,1.336,2331,1.536,2332,2.774,2333,2.774,2334,2.556,2335,1.536,2336,2.774,2337,1.336,2338,2.774,2339,1.535,2340,2.556,2341,1.415,2342,1.018,2343,0.956,2344,1.536,2345,1.536,2346,1.536,2347,0.985,2348,1.536,2349,1.536,2350,1.415,2351,1.536,2352,1.277,2353,2.774,2354,1.536,2355,1.415,2356,1.536,2357,1.415,2358,2.774,2359,1.277,2360,1.229,2361,1.077,2362,1.277,2363,1.536,2364,2.556,2365,3.721,2366,1.415,2367,1.336,2368,1.536,2369,1.536,2370,1.536,2371,2.774,2372,1.536,2373,1.415,2374,2.774,2375,1.415,2376,1.415,2377,1.536,2378,1.336,2379,1.156,2380,1.277,2381,1.229,2382,1.336,2383,1.536,2384,1.536,2385,1.536,2386,1.536]],["t/422",[19,0.817,22,1.289,23,1.773,25,1.512,30,1.066,38,1.429,42,1.618,48,2.118,62,1.203,66,1.337,70,3.275,71,1.108,92,1.559,98,1.131,105,1.644,116,1.194,125,1.881,133,1.274,138,1.911,139,0.97,143,1.569,146,1.363,162,0.6,164,1.344,172,1.353,188,0.812,197,3.515,198,2.955,241,3.517,263,2.819,271,1.2,272,1.65,277,1.496,282,1.671,283,1.741,285,2.238,337,0.91,352,1.831,365,1.762,368,1.44,383,2.605,406,0.962,422,2.787,431,3.477,432,2.85,433,2.841,437,0.959,458,1.03,468,2.683,479,1.599,501,1.472,508,1.472,509,2.01,514,1.917,521,1.496,522,1.4,533,0.927,549,1.094,561,1.633,570,2.31,607,1.667,610,2.832,611,1.328,638,0.948,675,1.943,676,3.394,726,1.975,741,2.213,749,2.129,771,1.618,814,1.684,821,2.478,824,1.633,855,1.734,864,1.703,902,0.948,955,1.26,971,1.807,972,1.212,993,1.784,1018,1.587,1087,1.65,1094,1.943,1096,1.807,1111,1.943,1121,1.943,1152,1.304,1193,1.667,1231,2.517,1253,1.45,1272,2.593,1305,4.185,1313,1.618,1334,1.831,1366,1.857,1427,2.593,1433,2.09,1436,1.345,1469,1.741,1471,2.478,1478,2.09,1559,3.274,1628,1.762,1668,1.762,1698,2.018,1712,1.618,1719,1.831,1738,2.438,1740,2.31,1741,1.807,1777,1.857,1780,1.831,1781,2.187,1812,4.893,1830,2.593,1877,2.883,1956,2.049,2013,2.478,2070,2.31,2086,1.857,2087,2.049,2092,1.857,2093,2.136,2096,3.824,2125,4.193,2185,1.943,2190,3.716,2199,2.478,2222,2.136,2245,3.392,2265,3.621,2288,2.09,2339,1.65,2379,2.244,2387,3.716,2388,2.593,2389,2.244,2390,2.981,2391,2.981,2392,2.747,2393,2.244,2394,2.747,2395,2.981,2396,2.981,2397,4.935,2398,2.981,2399,3.536,2400,1.784,2401,2.593,2402,2.593,2403,2.981,2404,2.593,2405,2.31,2406,2.244,2407,2.593,2408,2.187,2409,1.857,2410,1.684,2411,2.981]],["t/424",[19,2.341,30,2.54,48,1.85,57,3.078,71,0.967,89,2.233,92,2.471,107,1.835,110,1.719,111,1.891,114,2.863,139,2.311,145,2.449,151,2.515,172,2.341,197,3.339,198,2.395,224,2.348,263,2.697,270,3.384,271,1.901,272,1.579,275,2.539,280,5.565,281,3.926,282,2.694,283,2.759,297,3.185,324,4.109,328,1.579,333,3.029,337,1.441,352,2.901,365,2.792,383,4.507,406,1.525,407,1.941,422,2.691,426,2.968,428,2.042,431,3.649,433,2.302,436,3.749,444,2.16,458,2.455,474,1.653,491,2.429,496,2.202,497,1.507,498,2.72,523,1.463,533,1.468,576,2.118,603,2.351,612,2.563,647,2.042,721,1.632,726,3.13,980,2.118,1003,4.364,1016,3.66,1087,2.614,1126,2.563,1176,2.668,1188,3.13,1252,2.217,1300,3.465,1334,2.901,1559,1.901,1564,1.952,1573,3.746,1593,4.708,1704,3.029,1812,3.66,1831,2.792,1940,2.539,1954,4.352,1982,3.556,2047,5.988,2125,4.058,2412,4.352,2413,4.723,2414,4.723,2415,4.723,2416,4.109,2417,4.723,2418,3.556,2419,4.352,2420,4.109]],["t/426",[19,1.786,22,2.817,39,1.879,71,1.501,130,4.668,132,3.295,142,1.995,145,3.378,164,1.774,168,2.425,170,2.834,172,1.786,224,4.178,272,2.179,282,1.723,327,2.867,328,2.179,333,4.179,337,2.734,350,4.068,354,3.269,357,6.571,359,3.899,375,2.867,406,2.103,434,2.692,437,3.545,474,3.134,497,2.079,523,2.774,719,4.425,1123,4.905,1129,4.057,1351,5.416,1564,3.702,1831,3.851,2040,5.008,2194,5.667,2248,4.905,2421,8.254,2422,5.667,2423,5.416,2424,5.048]],["t/428",[19,2.323,71,1.154,145,4.394,162,2.344,170,2.178,172,2.323,257,8.768,337,3.554,359,5.071,362,6.632,403,2.756,868,6.379,986,5.009,2040,4.737,2190,6.379,2248,6.379,2423,7.044,2425,9.814,2426,9.814,2427,7.809,2428,7.371]],["t/430",[19,2.323,71,1.154,145,4.394,170,2.178,172,2.323,257,8.768,337,3.554,359,5.071,362,6.632,403,2.756,868,6.379,986,5.009,2040,4.737,2190,6.379,2248,6.379,2423,7.044,2424,9.024,2425,9.814,2426,7.809,2427,7.809,2428,7.371,2429,8.473]],["t/432",[23,2.001,48,2.39,142,2.812,172,2.517,224,3.034,327,4.041,337,3.416,546,4.926,584,5.495,638,2.919,717,5.495,893,4.281,972,3.734,1062,6.438,1396,6.912,2235,3.433,2423,7.632,2430,9.181]],["t/434",[19,2.747,129,4.549,162,2.016,197,3.679,272,3.35,458,3.461,723,5.996,1573,3.95,2431,10.018]],["t/436",[89,4.61,143,3.1,270,6.988,280,7.563,324,8.483,328,3.261,383,5.146,523,3.02,1013,6.161,2047,6.838,2092,6.073,2432,8.483]],["t/438",[19,2.71,73,2.444,110,2.745,142,3.027,164,2.692,170,1.939,172,2.068,224,3.643,282,1.995,291,2.77,333,4.838,350,3.425,357,5.534,362,4.698,375,3.32,383,3.981,497,3.154,502,3.448,600,4.308,702,5.679,768,6.951,1092,4.514,1152,3.3,1384,4.766,1825,4.705,2040,4.217,2194,8.597,2248,5.679,2410,4.262,2419,6.951,2420,6.562,2428,8.597,2433,7.543,2434,5.405,2435,6.951,2436,6.951,2437,6.562]],["t/440",[19,2.054,48,2.561,57,4.882,62,2.414,164,2.68,170,2.824,224,3.855,282,1.982,313,3.542,333,4.805,337,3.003,350,3.402,359,4.484,422,1.884,497,2.391,515,2.925,523,3.047,546,3.297,749,3.317,1002,3.096,1573,2.954,2092,4.666,2094,8.272,2118,6.942,2196,6.904,2248,5.64,2421,6.904]],["t/442",[39,2.67,71,1.261,181,5.766,405,6.492,406,2.989,407,3.806,514,3.597,523,3.484,527,4.126,596,3.726,606,4.721,726,8.029,1037,5.347,2190,6.971,2204,8.054,2438,9.258]],["t/444",[48,3.098,71,1.21,105,3.653,129,4.981,145,4.607,164,2.42,197,3.712,272,2.971,406,2.868,422,2.758,431,4.687,479,2.879,662,5.252,716,4.423,1044,4.731,1809,5.317]],["t/447",[59,3.701,69,3.735,96,3.295,105,2.336,107,2.725,112,3.339,143,2.23,159,4.57,172,1.923,188,1.91,190,2.752,197,3.317,241,4.072,271,2.823,284,2.281,285,2.486,291,2.575,292,2.914,422,2.368,431,2.997,432,4.051,444,2.133,485,3.701,492,4.051,546,3.087,606,3.576,716,3.491,752,2.711,795,4.499,855,2.465,948,3.881,971,4.251,972,2.852,975,4.051,1002,2.899,1122,3.547,1185,5.146,1219,3.735,1357,4.918,1471,5.83,1584,3.963,1690,4.647,1696,4.82,1698,2.868,2093,5.026,2399,6.749,2406,5.28,2439,7.013,2440,6.463,2441,5.434,2442,6.101]],["t/449",[25,1.949,40,2.535,48,2.841,62,1.212,71,0.866,142,1.949,166,3.245,170,1.636,197,3.576,200,6.057,272,2.128,337,2.69,339,3.03,406,2.054,422,2.982,431,4.664,433,2.062,468,2.704,523,2.729,546,2.801,721,2.199,724,3.558,753,4.082,758,3.389,771,4.782,972,3.584,992,3.675,1087,3.522,1117,3.143,1252,2.988,1448,3.909,1559,2.561,1573,2.509,1694,4.082,1940,3.421,2013,5.29,2094,6.635,2118,6.388,2149,2.947,2408,4.669,2409,3.963,2434,4.56,2443,5.536,2444,6.364,2445,6.364,2446,6.364,2447,4.462,2448,6.364,2449,6.364,2450,4.56]],["t/451",[30,1.561,39,1.93,40,1.739,42,2.369,61,1.561,62,1.55,96,1.528,101,3.001,105,1.454,115,2.425,143,1.388,162,0.879,181,2.719,197,3.803,198,1.472,273,4.293,288,3.792,291,2.458,318,4.968,403,1.42,407,1.795,422,2.804,434,1.805,441,3.062,474,1.528,481,2.209,508,2.157,509,2.945,522,2.05,543,2.174,611,1.946,627,3.129,635,5.358,729,3.383,762,2.342,850,2.141,902,1.388,934,3.21,948,2.416,1010,2.347,1087,2.416,1117,3.306,1146,3.001,1152,2.928,1195,3.287,1223,2.682,1230,2.581,1235,6.466,1252,2.05,1564,1.805,1573,1.722,1631,2.441,1636,2.157,1657,2.945,1690,6.879,1697,6.412,1704,6.659,1709,2.245,1723,2.945,1738,4.02,1809,2.613,1968,3.63,2046,5.95,2093,3.129,2227,5.971,2451,5,2452,3.287,2453,5.143,2454,4.911,2455,4.366,2456,4.024,2457,3.383,2458,3.63,2459,6.168]],["t/453",[23,1.085,25,2.264,48,2.539,71,0.678,97,3.245,98,1.889,107,1.935,142,1.525,146,2.276,162,1.002,170,1.28,172,1.365,197,3.764,198,1.679,241,2.153,271,2.975,272,1.665,277,2.499,279,3.245,282,1.955,318,2.219,337,2.256,342,4.269,362,3.101,403,1.62,406,1.607,414,2.219,422,3.116,426,4.721,433,1.614,437,2.834,444,1.514,481,2.519,491,2.561,495,4.48,497,1.589,501,2.46,502,2.276,515,1.944,566,2.46,573,2.519,578,3.769,603,2.479,610,2.233,612,2.702,719,3.651,752,1.925,754,3.492,766,2.909,771,2.702,853,2.628,932,2.441,955,2.104,1002,2.058,1036,2.519,1087,2.756,1122,2.519,1246,3.986,1252,2.338,1304,3.422,1388,3.986,1436,2.247,1448,3.059,1479,3.492,1559,2.004,1573,1.964,1584,2.814,1698,2.036,1728,3.986,1738,3.651,1751,3.653,1940,2.677,1953,4.332,2023,3.019,2089,3.059,2092,3.101,2118,3.146,2213,3.101,2460,4.98,2461,4.14,2462,4.98]],["t/455",[96,3.011,106,3.657,143,2.736,287,4.862,288,3.576,318,4.792,422,2.704,426,4.493,433,2.789,479,2.789,721,2.974,724,4.812,741,3.859,752,3.327,1083,5.438,1085,4.542,1209,4.502,1235,5.36,1558,3.934,2093,6.167,2098,6.035,2149,3.986,2463,8.606,2464,4.862,2465,8.606]],["t/457",[19,0.712,23,0.712,25,0.302,30,0.929,40,0.392,42,0.535,44,0.582,48,1.006,58,0.535,61,0.352,62,0.736,67,1.01,71,1.139,73,0.319,81,0.878,96,2.635,98,0.699,107,0.716,109,0.466,111,1.761,115,1.4,116,0.394,125,1.676,141,0.53,142,2.504,143,1.398,145,0.511,151,0.525,152,1.447,153,0.329,164,0.708,167,0.329,168,1.438,170,1.368,172,0.505,190,1.516,197,3.487,198,2.165,241,1.902,262,0.582,271,1.315,277,0.925,278,1.862,279,2.129,281,1.533,282,1.164,283,1.518,284,2.885,285,0.653,287,1.846,291,0.677,309,2.169,318,3.881,328,0.869,335,2.478,337,1.746,338,0.819,361,1.031,368,0.476,369,0.53,371,1.148,383,0.52,403,2.449,422,1.765,426,1.365,431,1.11,432,0.569,433,1.252,437,1.839,441,0.691,444,0.79,451,0.525,458,0.34,468,2.431,474,0.909,479,1.252,481,0.498,495,0.597,497,0.314,498,1.684,502,1.188,513,0.525,514,1.269,515,1.014,517,0.469,521,0.494,523,0.305,526,1.98,527,0.821,528,0.597,529,2.284,533,0.573,549,0.362,566,0.487,569,0.354,571,0.642,576,0.827,598,0.59,599,0.53,600,2.206,607,0.551,610,3.146,611,1.456,614,0.456,633,0.535,638,0.586,648,1.501,650,1.255,653,0.557,675,0.642,676,2.077,699,1.283,717,0.59,719,0.911,721,0.34,724,1.031,738,0.763,741,0.442,749,0.876,752,0.381,756,1.314,762,1.143,763,0.814,764,1.614,771,1,792,0.331,795,0.632,801,0.563,803,1.123,805,1.396,814,0.557,818,0.431,855,1.148,857,0.677,882,1.195,890,0.511,902,1.038,934,1.566,955,0.416,967,1.283,970,1.566,971,0.597,972,1.329,973,0.792,986,1.09,1012,0.498,1027,0.843,1036,0.498,1061,0.742,1064,0.59,1075,1.065,1087,1.02,1089,0.494,1091,0.664,1095,0.622,1098,0.597,1230,0.582,1235,0.614,1246,3.908,1252,0.463,1256,0.511,1263,0.545,1275,0.563,1314,0.582,1387,0.597,1389,0.54,1392,1.536,1421,1.098,1436,0.832,1439,0.632,1482,0.597,1514,0.614,1558,1.188,1559,1.046,1571,0.807,1573,1.735,1584,3.438,1600,0.582,1639,0.416,1675,1.476,1690,2.915,1697,3.966,1698,3.261,1703,0.642,1704,5.115,1719,0.605,1738,2.173,1747,0.819,1767,0.642,1777,4.192,1780,3.514,1790,1.182,1809,0.59,1825,0.469,1834,1.243,1877,1.077,1878,0.52,1902,0.632,1956,3.023,1960,0.642,1961,1.476,1964,0.642,1976,0.563,1980,2.203,1983,0.597,2011,0.723,2016,1.267,2040,0.551,2042,0.59,2046,0.94,2047,0.691,2054,2.842,2055,1.536,2062,0.763,2066,2.312,2083,2.993,2084,2.096,2087,2.245,2089,1.596,2092,2.035,2093,3.813,2098,2.291,2122,0.515,2125,2.788,2146,0.642,2149,0.854,2150,0.908,2174,0.706,2199,0.819,2201,0.857,2222,0.706,2227,4.938,2235,0.689,2245,2.655,2246,0.819,2265,2.397,2288,2.709,2290,0.857,2291,2.394,2314,1.476,2315,0.908,2319,1.476,2320,0.908,2322,0.857,2339,0.545,2355,0.908,2357,0.908,2359,0.819,2373,0.908,2375,1.699,2399,0.706,2400,0.59,2434,0.706,2447,0.691,2466,0.908,2467,0.985,2468,0.857,2469,0.857,2470,0.857,2471,0.985,2472,0.985,2473,1.843,2474,1.699,2475,1.699,2476,0.985,2477,0.908,2478,0.908,2479,0.985,2480,0.691,2481,0.985,2482,0.985,2483,0.985,2484,0.985,2485,2.26,2486,1.293,2487,0.763,2488,3.863,2489,0.985,2490,0.985,2491,2.16,2492,2.16,2493,0.985,2494,3.01,2495,0.985,2496,0.985,2497,0.985,2498,1.843,2499,1.699,2500,4.006,2501,0.985,2502,0.819,2503,1.476,2504,0.985,2505,0.857,2506,0.908,2507,0.985,2508,3.56,2509,0.908,2510,0.985,2511,0.985,2512,1.699,2513,0.908,2514,0.723,2515,1.699,2516,2.598,2517,0.985,2518,0.985,2519,0.857,2520,2.598,2521,1.843,2522,2.394,2523,0.908,2524,0.908,2525,2.394,2526,0.908,2527,0.763,2528,0.857,2529,0.908,2530,0.985,2531,0.789,2532,0.563,2533,0.742,2534,0.857,2535,0.908,2536,0.742,2537,6.731,2538,0.908,2539,0.819,2540,1.843,2541,0.985,2542,0.985,2543,0.985,2544,0.985,2545,0.985,2546,0.985,2547,0.985,2548,0.985,2549,0.985,2550,0.985,2551,0.985,2552,0.985,2553,0.985,2554,0.985,2555,0.985,2556,1.843,2557,1.843,2558,0.985,2559,0.985,2560,0.985,2561,0.985,2562,0.985,2563,0.985,2564,0.985,2565,0.985,2566,0.985,2567,0.985,2568,0.985,2569,0.985,2570,0.985,2571,2.598,2572,0.985]],["t/459",[48,2.005,62,1.466,71,1.049,73,2.496,96,2.695,141,5.385,170,1.98,282,2.037,288,3.2,333,4.94,365,4.553,375,3.39,422,1.937,426,3.218,495,4.668,514,2.992,533,2.394,576,3.453,600,5.722,724,5.601,752,2.977,860,4.609,948,4.262,973,3.31,1080,5.287,1171,5.519,1219,4.101,1235,4.796,1424,4.668,1563,6.165,2092,4.796,2093,5.519,2118,4.866,2149,4.64,2503,8.02,2573,5.968,2574,7.701]],["t/462",[23,1.112,61,1.825,62,0.425,67,1.222,71,0.828,76,1.389,89,1.825,96,0.781,98,0.846,105,0.743,110,1.405,111,3.419,115,0.808,116,0.893,118,1.352,125,1.471,142,1.563,143,1.227,145,2.002,152,0.988,172,0.612,192,1.389,197,3.618,198,2.317,241,2.63,251,1.119,262,1.319,277,3.052,282,0.59,284,3.481,287,1.26,291,0.819,292,0.927,318,3.063,326,1.07,328,1.707,330,1.505,335,1.431,337,2.098,369,1.199,375,0.982,407,0.917,417,0.88,422,0.561,431,0.953,437,2.21,460,1.303,468,3.198,491,1.147,498,2.329,508,1.102,520,1.409,524,1.564,527,0.994,554,1.409,566,1.102,610,1.731,638,2.393,662,1.319,676,2.075,702,1.679,703,4.724,713,1.335,718,1.199,739,1.247,749,3.132,762,1.351,792,0.749,795,1.431,801,3.926,805,0.953,818,0.976,846,1.505,855,0.784,870,1.274,873,1.319,902,1.227,932,1.094,971,1.352,1012,1.128,1038,1.11,1061,1.679,1064,1.335,1258,1.11,1314,3.017,1392,1.319,1403,3.209,1571,0.976,1573,3.785,1652,1.854,1675,1.786,1690,2.558,1697,1.454,1698,3.799,1704,4.827,1738,1.102,1767,2.516,1777,1.389,1780,1.37,1841,1.26,1842,1.222,1980,4.102,2042,1.335,2046,1.969,2084,3.73,2089,1.37,2092,1.389,2093,3.657,2095,1.505,2098,6.27,2125,3.926,2143,2.056,2144,1.319,2151,2.766,2205,1.94,2211,3.09,2227,7.24,2245,1.533,2265,1.637,2288,1.564,2294,3.558,2314,1.786,2319,1.786,2434,2.766,2491,1.854,2492,1.854,2500,1.679,2506,2.056,2508,2.056,2522,2.056,2524,4.703,2525,2.056,2526,2.056,2529,6.334,2531,4.085,2575,1.854,2576,8.941,2577,2.231,2578,2.231,2579,1.854,2580,2.231,2581,2.231,2582,1.637,2583,1.854,2584,2.231,2585,2.231,2586,3.86,2587,2.832,2588,2.231,2589,6.873,2590,7.099,2591,3.86,2592,2.231,2593,3.86,2594,2.231,2595,3.86,2596,3.86,2597,5.605,2598,5.605,2599,5.605,2600,5.605,2601,3.558,2602,3.558,2603,2.231]],["t/464",[2011,7.775,2222,7.594,2288,7.431,2604,10.597]],["t/466",[422,2.615,1392,6.147,1780,6.387,2087,7.145,2379,7.828,2605,7.828]],["t/468",[51,1.675,62,0.809,71,1.323,98,1.611,105,2.183,142,1.301,152,1.881,170,1.092,197,3.204,251,2.132,288,1.765,291,2.406,300,2.222,374,3.889,403,2.132,428,1.837,433,1.377,444,1.292,458,2.264,461,1.805,468,4.818,474,1.487,477,3.401,491,2.184,497,2.091,533,2.037,573,2.149,603,2.115,614,1.968,619,2.885,628,3.922,647,1.837,719,3.237,749,2.209,751,2.262,792,1.426,800,2.543,829,3.532,850,2.083,1003,2.61,1015,2.575,1028,2.543,1037,2.454,1041,2.543,1056,3.292,1083,4.141,1131,2.684,1132,3.044,1133,2.684,1145,2.646,1146,2.92,1152,1.859,1162,3.199,1188,2.815,1271,2.684,1314,2.512,1315,3.044,1417,4.343,1436,1.917,1605,2.351,1626,2.684,1639,1.795,1643,2.284,1712,2.305,1719,2.61,1963,3.915,2036,3.696,2045,2.262,2084,2.305,2110,2.351,2146,6.333,2165,5.448,2181,5.078,2185,2.769,2208,2.646,2235,3.363,2340,8.288,2341,3.915,2342,6.439,2343,5.601,2393,3.199,2480,5.61,2606,6.554,2607,3.915,2608,3.292,2609,3.915,2610,3.915,2611,3.401,2612,4.248,2613,3.627,2614,3.915,2615,3.696,2616,4.248,2617,2.115,2618,3.696,2619,3.696,2620,3.915,2621,3.532,2622,2.61,2623,6.04,2624,4.248,2625,3.401,2626,4.248]],["t/470",[19,0.522,23,0.415,31,1.075,46,1.087,47,1.153,48,1.786,51,0.75,62,0.362,71,1.131,73,0.616,89,2.132,96,0.666,100,2.529,104,1.202,106,0.808,107,0.739,110,0.692,111,0.762,115,1.634,116,0.762,132,1.699,138,0.495,139,1.467,142,2.101,143,1.73,151,1.013,162,0.676,164,1.228,166,0.97,170,0.489,172,1.703,188,0.518,190,0.746,197,3.545,198,1.132,241,1.452,271,1.352,272,0.636,277,0.955,282,1.193,284,0.619,288,0.791,292,0.791,318,0.848,328,1.82,331,1.523,337,2.262,339,1.599,354,0.955,359,1.139,363,0.57,375,0.837,403,2.021,406,1.456,422,2.334,431,3.704,433,1.461,437,0.612,458,0.657,459,1.125,461,0.808,468,3.15,474,1.175,479,0.616,495,1.153,497,0.607,498,0.728,501,3.069,502,2.061,508,0.94,515,1.311,523,1.397,533,1.402,543,1.672,546,1.479,554,1.202,561,1.042,565,1.659,573,1.699,576,1.506,596,0.766,600,1.918,607,1.878,610,3.886,622,1.24,638,1.434,645,1.363,662,1.125,663,3.314,664,1.753,676,1.806,692,1.363,694,3.61,713,3.718,719,1.659,724,1.878,740,1.064,749,2.094,752,0.736,758,1.013,763,0.596,764,0.94,771,1.032,798,0.899,814,1.075,824,1.042,855,0.669,873,1.125,890,0.987,902,0.605,948,1.053,955,0.804,971,1.153,972,0.774,987,2.603,994,2.266,1027,0.87,1053,1.013,1087,3.797,1092,1.139,1111,1.24,1117,0.94,1126,1.032,1153,1.334,1211,1.24,1219,2.402,1231,0.97,1246,1.523,1252,2.117,1255,1.523,1258,0.947,1263,1.053,1292,1.261,1314,1.125,1387,1.153,1388,1.523,1392,1.986,1412,0.995,1424,1.153,1469,4.008,1476,1.396,1573,0.75,1584,1.898,1609,1.396,1656,1.153,1657,2.266,1685,1.582,1698,1.373,1719,1.169,1738,3.389,1739,1.24,1756,1.261,1777,2.809,1780,2.77,1809,1.139,1812,1.474,1834,1.283,1937,1.283,1956,2.309,1971,1.432,1980,4.999,1992,2.407,2016,1.308,2040,1.064,2042,2.01,2058,1.655,2066,2.01,2078,1.363,2084,1.823,2087,1.308,2092,4.273,2096,2.603,2118,3.926,2125,3.548,2134,1.474,2149,2.089,2187,1.334,2199,1.582,2213,1.185,2222,2.407,2235,0.711,2245,2.309,2246,1.582,2265,1.396,2288,1.334,2314,1.523,2316,1.064,2319,1.523,2339,1.859,2359,1.582,2379,1.432,2392,1.753,2399,3.232,2406,1.432,2434,2.407,2454,1.396,2477,1.753,2485,1.655,2500,2.529,2514,1.396,2515,1.753,2519,2.922,2523,1.753,2531,1.523,2534,1.655,2535,3.096,2579,1.582,2627,1.902,2628,1.655,2629,1.753,2630,3.359,2631,7.27,2632,3.359,2633,1.902,2634,1.902,2635,1.902,2636,1.902,2637,1.334,2638,1.902,2639,1.042,2640,1.523,2641,1.902,2642,1.902,2643,1.902,2644,1.902,2645,1.902,2646,1.902,2647,3.359,2648,1.902,2649,1.902,2650,1.902,2651,1.396,2652,1.902,2653,1.582,2654,1.902,2655,1.655,2656,1.753,2657,1.902,2658,1.902,2659,3.359,2660,1.363,2661,1.902,2662,1.902,2663,1.902,2664,1.902]],["t/472",[21,1.032,23,0.523,25,0.736,28,2.987,29,1.503,40,2.149,42,1.303,52,1.65,53,1.565,54,1.42,57,2.681,62,0.457,71,1.44,73,2.071,87,1.16,92,2.822,107,0.933,112,1.143,115,0.87,116,2.16,117,1.245,125,2.739,133,1.026,139,3.803,142,1.653,162,1.859,164,1.47,167,0.803,172,0.658,181,3.36,197,2.243,198,0.81,218,3.516,224,0.793,227,1.62,271,1.655,272,0.803,285,0.851,328,0.803,337,2.698,349,1.225,354,2.064,359,2.462,377,1.245,383,2.848,418,1.721,426,4.332,428,1.038,437,3.078,445,1.357,474,0.84,479,0.778,493,4.04,497,0.766,498,0.919,508,1.186,514,0.933,515,0.938,534,1.719,566,2.032,576,2.866,577,1.371,596,2.893,598,1.437,600,2.349,602,1.267,638,0.763,718,2.211,724,4.383,741,1.077,749,1.387,796,2.404,802,4.477,805,1.026,855,2.246,870,2.349,902,1.715,970,1.151,980,2.419,1015,1.456,1018,1.279,1059,1.42,1064,1.437,1073,1.922,1080,1.267,1084,1.65,1085,2.848,1166,1.762,1271,1.517,1333,2.213,1470,2.873,1564,2.23,1571,1.051,1593,4.235,1600,4.25,1613,1.517,1675,1.922,1705,1.65,1732,1.225,1738,2.032,1768,1.475,1772,7.647,1782,1.357,1825,1.958,1879,1.205,2028,2.884,2040,3.574,2087,1.65,2144,1.42,2350,3.791,2352,8.425,2665,1.922,2666,4.113,2667,2.638,2668,3.783,2669,2.401,2670,5.395,2671,1.496,2672,3.783,2673,2.089,2674,2.213,2675,2.401,2676,2.089,2677,3.578,2678,2.401,2679,2.401,2680,2.401,2681,2.213,2682,2.401,2683,2.401,2684,2.213,2685,2.401,2686,2.213,2687,2.401,2688,2.089,2689,2.401,2690,2.213,2691,1.403,2692,2.401,2693,2.401,2694,2.401,2695,2.401,2696,2.401,2697,2.401,2698,4.113]],["t/474",[23,0.818,25,0.662,48,1.549,59,1.982,61,0.772,62,2.457,66,0.969,71,0.294,105,0.72,111,2.698,115,0.783,116,1.994,133,1.605,139,1.936,142,0.662,153,0.723,161,0.888,172,1.03,197,3.25,198,1.266,224,1.646,241,1.623,251,1.084,271,1.511,272,1.256,278,2.691,284,0.703,286,1.021,291,0.793,318,0.963,337,2.256,339,1.029,353,3.362,369,1.161,383,1.14,403,1.936,417,2.346,422,0.944,426,2.486,428,2.153,431,0.923,433,1.614,437,1.207,458,0.747,459,2.22,468,2.116,474,0.756,485,1.14,493,0.945,497,1.198,515,0.844,546,0.951,566,1.067,576,2.233,595,2.813,610,0.969,648,1.248,676,2.018,699,1.067,702,1.627,703,2.581,717,1.293,724,2.784,730,1.327,743,2.194,749,1.679,762,1.314,851,1.386,855,0.759,870,1.234,885,3.101,902,0.687,942,1.386,970,1.801,971,3.607,972,0.879,973,1.614,980,1.684,1002,1.552,1064,1.293,1092,1.293,1129,1.346,1152,0.945,1153,1.515,1248,2.307,1252,1.014,1314,1.277,1387,1.31,1403,3.122,1424,1.31,1439,1.386,1562,1.234,1571,0.945,1593,2.488,1613,2.372,1698,3.438,1738,1.067,1772,5.313,1777,2.339,1780,2.307,1834,2.533,1847,1.161,1956,2.581,1976,1.234,1980,1.457,1986,1.674,2029,5.176,2040,1.208,2042,2.981,2047,4.173,2084,2.038,2098,3.492,2151,1.548,2186,1.585,2191,1.674,2352,7.327,2409,1.346,2469,3.266,2500,6.331,2513,1.991,2531,1.73,2587,3.654,2590,3.122,2597,1.991,2598,1.991,2599,1.991,2600,1.991,2601,1.991,2602,1.991,2668,1.515,2674,1.991,2676,1.879,2677,1.879,2699,1.408,2700,2.161,2701,2.161,2702,2.161,2703,1.73,2704,2.161,2705,2.161,2706,3.755,2707,1.796,2708,1.627,2709,3.986,2710,2.161,2711,5.484,2712,2.161,2713,2.161,2714,2.161,2715,2.161,2716,4.763,2717,3.755,2718,3.755,2719,1.485,2720,3.755,2721,3.755,2722,3.755,2723,2.161,2724,2.161,2725,2.161,2726,5.073,2727,4.98,2728,2.161,2729,5.95,2730,3.755,2731,3.755,2732,9.752,2733,3.755,2734,2.827,2735,3.755,2736,3.755,2737,1.991,2738,1.991,2739,2.161,2740,2.161,2741,2.161,2742,2.161,2743,2.161,2744,2.161,2745,2.161,2746,2.161]],["t/476",[19,2.086,22,1.367,23,1.83,28,1.204,40,2.063,44,1.869,46,2.958,48,1.713,56,1.359,71,1.228,101,2.172,115,1.145,125,2.507,133,1.351,139,1.028,142,1.586,164,1.411,170,0.813,172,0.867,197,3.515,198,2.218,224,1.044,241,1.367,251,2.599,272,1.057,282,1.37,291,1.161,333,3.322,337,3.033,352,1.942,362,4.098,371,4.098,383,1.668,388,2.217,417,1.246,422,2.112,431,2.812,468,2.796,493,2.879,576,2.322,578,1.612,591,2.628,595,2.449,598,1.892,599,2.784,600,4.795,611,1.409,716,1.574,724,3.679,749,2.218,756,1.599,798,2.449,881,2.06,883,2.75,893,1.474,960,3.322,980,3.412,1018,1.683,1059,1.869,1176,1.786,1182,2.132,1219,1.683,1316,1.997,1424,3.14,1427,2.75,1562,1.805,1564,3.145,1584,3.718,1593,6.31,1705,2.172,1738,4.704,1775,2.628,1840,1.454,1842,1.732,1877,1.847,1946,2.449,1965,2.095,1980,2.132,2011,3.8,2016,5.229,2040,1.767,2042,3.938,2046,3.355,2084,3.57,2098,5.335,2129,3.56,2174,2.265,2500,3.899,2621,4.306,2667,2.028,2716,2.53,2737,2.913,2738,2.913,2747,2.913,2748,10.089,2749,3.161,2750,6.58,2751,2.913,2752,3.161,2753,3.161,2754,3.161,2755,3.161,2756,3.161,2757,3.161,2758,3.161,2759,4.773,2760,2.38,2761,2.913,2762,4.773,2763,3.161,2764,3.161,2765,3.161,2766,4.773,2767,3.632,2768,3.161,2769,2.913,2770,4.306,2771,2.628,2772,3.161]],["t/478",[19,1.404,23,1.116,48,1.964,56,2.2,61,1.83,71,1.027,81,2.437,96,2.639,111,2.05,125,1.951,138,1.333,139,1.665,172,2.456,197,3.65,251,4.494,272,1.712,287,5.061,337,1.562,349,2.61,371,4.698,403,1.665,417,2.019,422,1.897,474,1.791,479,1.659,533,1.591,611,2.281,663,2.472,718,2.751,724,2.862,741,2.295,749,1.726,798,2.42,818,3.3,971,4.573,980,4.725,986,3.026,1035,3.234,1059,3.026,1080,2.702,1124,3.756,1252,2.403,1314,3.026,1424,3.103,1564,3.702,1593,6.549,1598,3.854,1639,2.163,1698,4.041,1738,5.205,1796,3.756,1965,3.392,1974,5.088,1980,3.452,2011,3.756,2012,3.668,2016,3.518,2046,5.373,2088,3.668,2098,5.289,2314,4.098,2319,4.098,2450,3.668,2531,4.098,2748,8.598,2759,4.717,2761,4.717,2769,4.717,2773,5.119,2774,3.59]],["t/480",[25,1.661,48,2.048,89,2.563,96,1.897,98,2.056,110,1.973,138,1.412,142,3.111,143,1.724,152,2.401,154,2.836,170,2.022,172,2.539,188,1.477,197,3.84,198,1.828,277,2.72,337,2.401,351,2.638,403,2.559,422,1.978,431,2.317,433,1.757,468,2.304,474,1.897,497,1.73,515,2.117,523,1.679,533,2.878,543,2.699,549,1.991,575,3.478,576,3.528,600,5.288,610,3.528,614,2.511,638,1.724,713,4.709,749,1.828,771,2.942,850,2.658,854,3.063,882,2.495,1087,4.354,1092,3.245,1211,3.533,1376,4.082,1392,3.205,1421,2.291,1609,3.978,1777,3.377,1780,3.331,1797,3.593,1834,3.657,1956,5.407,1980,5.306,2092,4.9,2098,3.802,2149,3.644,2222,3.885,2288,3.802,2328,3.802,2329,3.802,2410,3.063,2434,3.885,2502,4.507,2631,4.997,2775,5.422,2776,5.422,2777,5.422,2778,3.802,2779,3.726]],["t/482",[56,4.173,59,3.874,71,1.322,115,3.517,142,2.249,153,3.247,164,2,172,2.662,197,2.29,198,3.273,224,2.426,241,3.174,433,3.525,437,2.361,465,5.527,522,3.447,692,6.957,699,3.626,770,6.134,792,2.465,1410,3.067,1511,6.548,1573,2.895,2092,6.047,2191,5.688,2227,7.123,2245,5.045,2288,5.148,2364,6.765,2365,9.266,2780,7.341,2781,7.341,2782,7.341,2783,7.341]],["t/484",[48,2.739,62,1.115,71,0.797,73,3.132,139,3.423,141,3.147,142,1.793,162,1.179,164,2.264,181,3.647,197,2.594,227,8.009,241,3.594,282,2.783,291,2.15,292,2.433,365,5.715,366,7.232,368,4.669,376,4.687,377,4.311,379,6.643,380,4.408,383,3.09,433,3.601,444,1.781,497,1.868,498,2.242,508,2.892,514,2.275,638,1.861,663,2.828,699,2.892,721,2.023,763,1.834,1036,4.205,1153,4.106,1230,3.462,1631,3.274,1738,4.107,1772,5.253,1777,3.647,2040,3.274,2066,3.504,2098,4.106,2174,4.196,2213,3.647,2376,5.396,2379,4.408,2684,5.396,2784,4.196,2785,5.855,2786,5.855]],["t/486",[46,1.982,62,2.23,71,0.472,110,2.033,125,1.322,136,2.341,138,1.455,142,2.148,153,1.161,164,0.945,170,2.067,175,3.019,190,2.192,192,3.48,197,2.188,224,1.147,227,7.171,241,1.5,272,1.161,326,1.664,328,1.161,346,1.982,359,2.077,371,4.368,407,1.427,417,3.17,431,1.483,433,2.856,497,2.238,514,1.348,533,1.079,569,1.246,641,1.982,699,1.714,722,4.051,758,2.976,762,1.214,763,1.087,818,4.507,921,3.227,966,1.556,967,1.714,999,2.778,1028,2.077,1061,2.613,1152,1.518,1219,1.848,1558,1.586,1584,1.961,1611,2.689,1619,3.003,1643,1.865,1648,3.584,1738,1.714,1772,2.193,1780,2.132,1782,3.157,1962,6.053,2013,2.885,2036,3.019,2040,1.94,2047,2.433,2055,2.052,2092,5.489,2129,3.84,2144,2.052,2213,3.48,2217,3.019,2232,3.019,2347,2.226,2379,2.613,2380,2.885,2381,2.778,2382,3.019,2709,2.778,2766,3.198,2787,3.47,2788,5.149,2789,3.47,2790,3.47,2791,3.198,2792,3.47,2793,3.47,2794,3.47,2795,3.47,2796,3.47,2797,3.47,2798,3.47,2799,3.47,2800,3.47,2801,3.019,2802,3.47,2803,3.47,2804,3.47,2805,3.47,2806,6.101,2807,9.418,2808,8.813,2809,10.914,2810,8.04,2811,3.47,2812,3.47,2813,7.014,2814,4.207,2815,4.329,2816,5.149,2817,3.198,2818,3.47,2819,3.47,2820,3.47,2821,3.47,2822,3.47,2823,3.47,2824,3.47,2825,3.47,2826,3.47,2827,3.47,2828,5.587,2829,3.47,2830,3.47,2831,3.47]],["t/489",[48,1.326,62,1.701,110,1.854,142,3.221,164,2.433,170,1.31,227,7.093,417,2.009,433,2.436,437,1.638,461,4.19,531,3.05,699,4.413,798,2.409,818,3.289,921,2.943,966,2.285,1036,2.577,1223,4.618,1390,4.119,1558,2.329,1619,4.802,2092,3.173,2122,4.673,2213,6.142,2217,10.163,2222,3.651,2339,5.82,2380,6.249,2788,6.928,2791,6.928,2806,4.432,2814,5.66,2815,7.641,2832,3.738,2833,4.079,2834,8.198,2835,5.095,2836,5.095,2837,5.095,2838,5.095,2839,5.095,2840,9.861,2841,8.933,2842,5.095,2843,5.095,2844,5.095,2845,5.095,2846,5.095,2847,5.095,2848,5.095,2849,5.095,2850,5.095,2851,5.095,2852,5.095,2853,5.095,2854,5.095,2855,5.095,2856,5.095,2857,5.095,2858,5.095,2859,4.079]],["t/491",[22,1.473,40,2.192,48,1.433,62,1.948,71,0.749,110,1.239,111,1.364,113,2.257,125,1.298,138,0.887,142,1.043,150,3.215,164,2.378,170,2.044,172,0.934,175,2.963,188,0.928,192,4.953,227,7.752,291,1.251,337,1.039,369,1.831,371,4.313,377,1.766,422,1.742,426,1.423,428,1.473,431,1.456,433,3.184,468,1.447,474,1.192,479,1.104,496,2.566,497,2.538,498,1.304,514,2.138,543,1.695,554,2.152,573,1.723,604,1.537,633,1.848,648,1.967,699,2.719,719,1.682,722,5.042,770,2.152,796,1.518,921,1.967,966,3.105,967,1.682,980,4.187,1001,1.945,1002,1.408,1036,1.723,1059,2.013,1377,1.866,1421,1.439,1465,4.038,1591,3.782,1613,2.152,1648,2.185,1694,2.185,1732,1.737,1777,6.58,1780,5.362,1782,3.109,1879,3.475,1965,2.257,1977,2.639,1978,2.564,2046,1.737,2055,2.013,2087,6.754,2088,2.441,2092,5.437,2144,4.094,2316,1.904,2380,2.831,2381,6.366,2382,4.788,2747,3.139,2784,2.441,2806,6.918,2816,3.139,2817,3.139,2860,3.406,2861,3.406,2862,1.945,2863,5.503,2864,3.406,2865,2.831,2866,3.139,2867,6.925,2868,8.729,2869,8.729,2870,7.953,2871,3.139,2872,2.963,2873,3.406,2874,2.499,2875,3.406,2876,7.953,2877,3.406,2878,2.831,2879,2.831,2880,3.406,2881,3.406,2882,3.406,2883,3.406,2884,3.406]],["t/493",[19,1.725,48,2.276,66,2.821,71,1.19,73,2.833,105,2.095,110,2.289,142,1.927,164,1.714,169,3.517,170,2.248,197,3.855,292,3.633,337,2.668,365,3.719,422,2.87,431,3.737,468,2.673,479,2.833,502,2.875,517,2.995,543,3.132,566,3.108,596,2.532,600,4.994,603,3.132,610,3.92,749,2.121,752,3.38,758,3.35,881,4.1,936,2.974,1100,5.472,1117,4.319,1571,2.752,1738,3.108,1829,3.017,1953,5.472,1955,5.472,1956,4.323,1980,4.243,2094,4.736,2118,3.975,2434,4.508,2509,5.797,2607,5.797,2656,5.797,2885,6.291,2886,8.743,2887,6.291,2888,6.291]],["t/495",[20,2.474,24,3.183,48,2.055,71,1.264,96,3.249,106,3.355,111,3.161,125,2.076,139,1.772,143,1.732,151,2.902,152,3.496,162,1.097,170,1.401,190,2.138,197,3.844,241,2.356,272,1.822,285,2.798,287,3.079,328,1.822,377,2.826,404,3.261,433,1.766,434,3.263,519,3.183,594,3.261,610,2.443,718,2.929,721,1.883,737,3.821,743,3.183,801,6.172,805,3.374,948,3.015,1038,2.712,1126,2.957,1219,2.902,1252,2.558,1377,4.326,1404,4.74,1483,4.102,1584,4.461,1698,3.228,1766,4.102,1976,5.303,1977,7.195,2125,5.303,2161,3.821,2187,3.821,2862,4.509,2889,5.449,2890,10.181,2891,5.021,2892,5.449,2893,3.905,2894,5.449,2895,5.449,2896,5.021,2897,5.021,2898,5.449,2899,5.449,2900,5.449,2901,5.449,2902,5.449]],["t/498",[62,1.89,129,4.508,288,4.125,318,5.226,451,5.287,805,4.243,1436,4.48,2125,5.67,2903,9.927,2904,9.927]],["t/500",[23,1.633,96,3.844,111,3,197,3.88,198,3.704,241,4.75,403,2.437,533,3.058,546,3.297,576,3.359,600,4.279,676,4.027,702,7.408,801,4.279,1075,4.327,1089,3.759,1584,4.233,1980,5.053,2098,6.899,2151,5.368,2500,8.784,2502,6.228,2519,6.517,2762,6.904,2896,6.904,2905,7.491,2906,5.149,2907,9.839,2908,7.491]],["t/502",[19,2.416,23,1.387,48,1.657,54,3.762,65,5.536,71,1.486,79,5.536,107,2.472,140,3.718,161,2.616,171,2.659,172,1.745,197,3.405,198,2.145,200,4.374,241,2.751,328,2.128,371,3.963,375,4.45,403,2.07,406,2.054,468,2.704,474,3.084,478,5.865,479,2.062,517,3.03,518,3.12,543,3.168,544,4.56,546,2.801,749,2.971,752,2.46,763,2.76,855,2.236,950,4.374,1075,3.675,1093,4.082,1121,4.147,1306,3.909,1316,4.021,1351,5.29,1387,3.858,1584,4.98,1723,4.292,1732,3.245,1809,3.809,1976,3.635,1980,4.292,2042,3.809,2107,4.669,2235,3.296,2399,4.56,2400,3.809,2500,4.791,2909,5.743,2910,4.56,2911,5.865,2912,5.094]],["t/504",[23,1.6,31,2.788,42,2.678,48,1.911,54,2.918,58,2.678,62,1.398,71,1.194,105,3.939,111,1.976,115,1.788,137,2.496,146,2.256,153,1.65,164,2,172,1.353,181,3.074,190,3.44,197,1.54,241,3.174,292,2.051,328,1.65,337,1.506,339,2.35,342,2.85,349,2.517,354,2.476,378,2.605,433,2.379,458,1.705,474,1.727,496,3.423,501,4.33,514,2.852,533,2.725,573,2.496,591,4.103,614,2.286,653,2.788,700,3.951,713,4.394,719,2.438,763,1.545,798,2.333,803,2.134,885,3.074,932,2.419,950,5.046,994,3.328,1010,2.653,1084,3.392,1121,3.216,1140,3.118,1253,2.401,1432,4.548,1559,1.986,1573,1.946,1668,2.918,1711,3.031,1712,2.678,1719,5.385,1936,3.824,1969,3.216,2092,4.572,2094,3.716,2107,3.621,2110,2.731,2118,3.118,2129,6.025,2190,3.716,2213,3.074,2221,4.548,2245,5.046,2246,4.103,2288,3.461,2454,3.621,2629,4.548,2699,3.216,2913,4.548,2914,4.935,2915,4.935,2916,3.824,2917,4.935,2918,4.935,2919,4.935,2920,4.935,2921,4.935,2922,4.935,2923,4.935,2924,4.935,2925,4.293]],["t/506",[2464,6.166]],["t/508",[2464,6.166]],["t/510",[2464,6.166]],["t/512",[2464,6.166]],["t/514",[2464,6.166]],["t/516",[2464,6.166]],["t/519",[18,6.042,19,3.298,20,4.135,23,1.984,71,1.24,162,1.833,188,2.48,433,2.95,569,3.269,602,4.805,962,5.383,1410,3.804,1639,3.847,1744,7.142,2144,5.383,2926,7.055,2927,6.033]],["t/521",[19,2.582,20,4.277,23,2.052,106,4.002,138,2.452,162,1.896,461,4.002,493,4.12,752,3.641,1012,4.763,1410,3.935,1420,8.192,1448,5.785,1741,5.708,1745,8.678,2667,6.04,2928,9.417]],["t/523",[21,3.819,38,4.26,70,4.607,73,2.879,162,2.208,316,3.91,361,4.967,434,3.672,493,4.799,533,2.762,1330,8.187,1638,3.819,2671,5.533,2929,8.187,2930,8.187,2931,8.884,2932,7.728,2933,8.187,2934,8.187,2935,7.728,2936,8.187,2937,8.884]],["t/525",[23,2.018,103,6.033,188,2.522,224,3.059,493,4.051,602,4.886,751,4.931,1041,5.541,1177,6.492,1262,8.532,1395,6.363,1413,6.635,1739,6.033,1768,5.687,2774,6.492,2927,6.135,2938,7.411,2939,9.258,2940,9.258]],["t/527",[39,2.889,133,4.281,161,4.118,162,2.016,188,3.212,566,4.949,589,5.87,763,3.137]],["t/529",[19,2.698,23,2.144,162,1.98,188,2.68,479,3.188,518,4.823,973,4.229,1120,8.179,1228,8.559,1768,6.043,2927,6.519,2941,9.067]],["t/531",[111,4.086,162,2.054,188,2.779,224,3.372,1121,6.65,1371,7.907,2927,6.762,2942,9.403]],["t/533",[29,4.357,153,3.412,162,2.054,188,2.779,596,4.107,1397,9.403,2943,8.876]],["t/535",[29,4.154,33,4.97,129,4.277,162,2.288,188,3.096,189,5.439,190,3.695,444,2.864,589,4.688,596,4.574,1026,7.297,1824,7.09,2943,8.192]],["t/537",[162,2.073,172,2.824,434,4.257,621,4.589,625,6.415,1258,5.127,2944,6.712]],["t/539",[23,2.183,106,4.257,138,2.608,313,4.736,414,4.464,487,6.885,1633,5.108,1639,4.233,2149,4.64,2945,8.328]],["t/541",[51,3.811,106,4.107,133,4.131,138,2.516,313,4.569,374,4.179,414,4.307,481,4.889,546,4.254,566,4.774,1410,4.039,1557,5.349,2946,7.489,2947,7.277]],["t/543",[23,2.203,34,5.906,138,2.632,139,3.857,596,4.069,1410,4.224,1756,6.699,2461,8.405]],["t/545",[19,3.322,23,2.288,25,2.537,56,3.56,71,1.128,105,3.496,111,3.316,133,3.539,138,2.156,153,2.769,162,2.32,223,5.59,224,2.737,246,3.761,479,2.684,522,3.888,625,5.158,627,5.935,766,4.838,1410,3.46,1470,4.41,1776,5.087,2025,7.204,2948,7.632,2949,8.282]],["t/547",[19,2.56,23,2.464,25,2.86,106,3.968,138,2.431,162,1.879,167,3.122,172,2.56,188,2.543,479,3.026,565,4.612,623,5.815,625,5.815,776,6.417,1559,3.758,1831,5.52,2950,9.337]],["t/549",[29,3.695,56,4.346,129,4.591,162,2.035,188,2.754,223,5.384,596,4.069,888,6.588,1235,6.297]],["t/551",[22,5.126,55,7.245,190,3.967,223,5.384,527,4.505,596,4.069,792,3.395,2951,8.795]],["t/553",[2464,6.166]],["t/555",[2464,6.166]],["t/557",[2464,6.166]],["t/559",[28,3.47,71,1.24,161,4.577,162,2.241,168,3.389,188,2.48,219,6.141,337,2.779,752,3.52,888,5.933,975,6.431,1094,7.256,1297,6.258,1334,5.593,1509,7.289,2952,9.686]],["t/561",[25,2.135,32,3.711,38,3.342,51,2.748,62,1.327,138,1.814,146,4.286,161,2.865,162,1.403,197,2.926,198,2.349,250,3.614,300,3.645,406,2.25,468,3.985,479,3.434,490,6.424,534,2.912,614,3.228,621,3.105,628,4.171,722,4.025,752,2.694,763,2.937,818,3.049,974,3.896,1079,6.422,1642,3.59,2045,3.711,2084,5.088,2149,3.228,2342,4.618,2660,8.123,2909,6.907,2953,5.579,2954,6.969,2955,8.642,2956,5.113,2957,6.969,2958,6.422,2959,4.887,2960,6.969]],["t/563",[23,2.026,25,2.108,48,1.792,51,2.714,71,0.937,106,3.951,153,2.301,198,2.32,275,3.699,282,1.82,292,2.86,350,3.125,351,3.348,395,3.481,426,2.875,428,2.975,464,3.699,468,3.951,540,4.119,630,4.02,749,2.32,752,2.661,763,3.689,855,2.418,882,4.278,973,2.958,1018,3.665,1176,3.888,1253,3.348,1361,4.119,1448,4.227,1473,4.02,1564,2.844,1633,4.741,1731,3.888,2045,3.665,2084,3.734,2110,5.146,2400,4.119,2909,7.35,2956,5.049,2961,7,2962,6.882,2963,6.342,2964,5.181,2965,6.882]],["t/565",[19,1.501,25,3.317,48,1.426,56,2.354,98,2.077,109,2.589,122,3,125,2.087,142,1.677,168,2.038,350,3.598,353,3.094,406,1.768,426,4.981,428,2.368,431,2.34,434,2.263,437,1.761,479,2.568,497,2.529,514,2.127,568,3.84,569,2.845,584,3.277,603,2.726,749,3.139,752,2.117,753,3.512,763,3.535,780,3.46,866,3.46,874,2.971,933,4.384,992,3.163,1052,4.576,1122,2.77,1256,2.84,1353,2.684,1393,3.319,1564,2.263,1576,3.199,1633,5.204,1693,2.455,1806,3.569,1940,2.943,2235,2.963,2639,3,2909,7.586,2953,4.384,2955,5.046,2966,8.975,2967,4.552,2968,5.476,2969,4.384,2970,4.764,2971,3.763,2972,4.018,2973,4.935,2974,5.476,2975,3.46]],["t/567",[34,3.476,87,2.874,110,3.549,138,2.759,140,4.913,198,3.573,272,1.99,282,2.58,431,2.543,433,2.725,468,4.503,479,1.928,501,4.154,521,2.986,533,2.614,534,3.513,571,3.878,603,2.962,621,2.651,749,3.288,796,2.651,805,2.543,855,2.091,955,2.514,1028,3.561,1126,3.229,1176,3.362,1258,2.962,1290,5.911,1314,3.518,1354,4.013,1379,4.366,1436,2.685,1473,3.476,1619,5.242,1633,3.034,1641,4.611,1741,3.607,2053,5.484,2070,4.611,2073,4.013,2274,4.013,2660,4.264,2947,4.48,2973,6.601,2976,11.929,2977,5.484,2978,3.76,2979,9.752,2980,5.95]],["t/569",[23,1.778,51,3.217,54,4.823,138,2.124,197,2.545,198,2.75,422,2.052,468,4.863,490,4.946,749,3.858,763,2.555,974,4.562,1002,3.372,1023,5.081,1052,4.712,1231,4.16,1334,5.012,1405,6.143,1608,5.233,1642,3.124,1731,4.61,1842,4.47,2084,5.642,2660,5.847,2909,5.317,2953,6.531,2978,5.155,2981,5.721,2982,7.097,2983,8.159]],["t/571",[42,4.093,51,4.347,62,1.436,98,2.861,138,3.045,374,4.273,377,3.912,421,3.879,422,2.486,444,2.294,468,4.684,497,2.407,533,3.072,611,4.404,638,2.398,741,3.382,749,3.944,792,2.533,815,3.566,816,4.459,1002,3.117,1018,4.017,1028,4.514,1619,4.054,1628,4.459,1633,3.846,1641,5.845,1756,4.998,2984,5.845,2985,6.038,2986,6.951,2987,6.038]],["t/573",[23,1.519,51,3.698,71,0.949,87,3.366,138,2.759,142,2.135,146,3.185,313,3.295,374,3.013,417,2.748,426,4.428,428,4.582,523,2.158,533,3.294,718,3.746,815,3.295,882,3.206,973,2.996,994,4.7,1334,4.281,1407,5.113,1410,2.912,1421,2.945,1436,3.145,1633,6.033,1639,2.945,1642,3.59,1643,3.746,1840,3.206,2324,4.994,2617,3.469,2947,5.247,2984,5.4,2988,5.684,2989,4.789,2990,6.062,2991,5.579,2992,6.969,2993,6.062,2994,6.062,2995,6.422,2996,3.583,2997,3.818]],["t/575",[115,3.471,133,4.908,137,4.846,138,2.494,224,3.166,363,2.872,382,4.048,431,4.095,533,2.978,542,5.302,902,3.046,2998,7.424,2999,8.83,3000,6.244]],["t/577",[23,2.355,51,4.999,59,4.578,115,3.142,122,4.753,161,3.565,162,1.746,375,3.818,428,3.75,474,3.035,493,3.795,602,4.578,1059,5.128,1223,5.328,1562,4.954,1657,5.85,1782,4.901,1902,5.564,1965,5.748,1978,6.53,2667,5.564,2953,6.943]],["t/579",[23,1.739,24,4.663,25,3.14,56,3.431,98,3.027,138,2.078,198,4.168,282,2.111,361,5.732,366,6.943,428,3.451,501,3.942,727,6.184,753,5.119,754,5.597,758,4.25,792,2.68,988,5.855,1198,4.509,1332,5.289,1377,4.373,1436,3.601,1633,4.07,1643,4.29,1756,5.289,1879,4.004,2002,6.635,2660,5.719,2953,6.389,3001,5.719,3002,7.981,3003,7.355]],["t/581",[24,5.455,25,2.86,104,5.899,340,6.767,468,3.968,533,2.902,721,3.226,739,5.22,749,3.148,753,5.989,1015,5.66,1018,4.973,1844,5.989,2394,11.208,3004,8.605]],["t/583",[22,3.953,24,3.922,51,2.647,59,3.543,61,2.4,87,3.243,138,2.906,153,2.245,197,2.853,272,2.245,282,2.419,288,2.79,327,2.955,374,2.903,475,4.811,477,5.374,514,2.608,519,3.922,534,2.805,555,5.374,653,3.793,662,3.969,713,4.018,792,2.254,814,3.793,816,3.969,864,3.834,869,3.575,933,5.374,967,3.316,992,3.877,1028,6.99,1037,3.877,1041,4.018,1416,6.187,1467,4.708,1633,3.423,1641,8.65,2978,5.777,3005,9.143,3006,9.143,3007,6.713,3008,6.187,3009,6.187,3010,4.306,3011,6.187,3012,5.581,3013,5.581]],["t/585",[19,2.698,25,3.014,48,1.95,62,1.873,71,1.34,73,2.428,98,2.841,110,2.726,122,4.105,146,3.424,282,2.603,309,3.731,342,5.682,351,3.645,390,5.649,421,3.852,445,5.559,479,2.428,497,2.391,501,4.86,637,4.964,718,4.027,721,2.589,751,3.99,752,2.896,792,2.515,1296,4.602,1558,3.424,1594,5.053,1808,7.266,2963,6.904,3014,6.517,3015,7.491]],["t/587",[23,1.5,25,2.108,30,2.46,71,1.434,81,4.427,98,3.994,110,2.504,138,2.421,198,2.32,272,2.301,282,2.46,284,2.239,309,2.61,313,4.396,368,3.324,374,4.02,377,3.569,379,4.73,428,2.975,501,3.399,522,3.231,546,4.093,580,3.209,619,3.029,638,3.745,792,2.311,793,4.485,794,5.721,796,3.066,955,2.908,1141,4.227,1306,4.227,1584,3.888,1618,3.847,1642,2.635,1693,3.086,2639,5.095,2973,4.286,3001,4.931,3016,6.978,3017,6.342,3018,4.56,3019,6.882]],["t/589",[21,3.946,62,1.748,98,3.482,138,2.914,197,2.864,282,2.429,316,4.041,422,2.309,433,2.975,444,2.792,515,3.584,632,6.438,1448,5.64,1639,3.879,1642,3.515,2978,5.801,2982,7.987,3020,7.349,3021,6.912]],["t/591",[21,3.265,25,2.326,33,4.008,68,4.546,198,2.56,275,6.305,309,2.88,313,3.591,316,3.343,337,2.318,368,5.342,374,4.292,377,5.736,379,5.22,380,5.718,431,3.246,464,5.336,522,3.566,569,2.727,816,5.869,955,3.209,1410,3.173,1558,3.472,1642,3.801,1643,4.082,1734,4.799,2149,3.518,2365,6.08,2999,6.999,3022,10.193,3023,7.595,3024,6.314]],["t/593",[20,3.473,22,3.307,71,1.358,164,2.083,272,2.558,275,4.111,309,2.9,313,5.246,422,1.923,468,3.25,501,3.778,546,3.366,749,2.578,792,3.348,814,4.321,815,3.616,882,3.519,955,3.231,992,4.417,1002,3.161,1085,4.036,1089,3.837,1107,5.068,1633,5.086,1650,6.653,2149,3.542,2973,4.763,2988,4.636,2989,7.627,2991,7.983,3025,7.648,3026,6.122,3027,5.826,3028,9.973]],["t/595",[21,2.331,23,1.182,42,2.942,51,4.576,71,1.261,75,2.638,83,3.726,98,2.984,100,4.082,111,2.171,125,2.998,138,1.412,145,2.812,170,1.394,186,3.001,223,2.887,274,3.205,282,2.853,422,1.978,461,2.304,493,2.372,562,3.001,587,2.788,596,2.182,621,2.416,637,5.213,721,1.873,739,3.031,756,2.742,762,1.897,792,1.82,796,2.416,814,3.063,855,1.905,869,2.887,882,2.495,991,3.245,1012,2.742,1018,2.887,1059,3.205,1078,3.331,1117,2.678,1141,3.331,1256,2.812,1334,3.331,1410,2.265,1421,3.324,1558,2.478,1600,3.205,1638,2.331,1648,3.478,1716,4.507,1743,4.717,1782,5.739,1965,3.593,1995,3.593,2005,4.34,2140,4.507,2362,4.507,2418,4.082,2486,3.802,2681,4.997,2981,8.336,2984,4.201,2990,4.717,3013,4.507,3029,5.422,3030,4.717,3031,4.997,3032,4.201,3033,5.422,3034,4.507,3035,4.717,3036,5.422,3037,5.422,3038,4.34]],["t/597",[22,3.032,23,1.528,28,2.673,31,3.963,48,2.768,96,2.454,146,3.206,198,2.364,282,1.855,313,5.027,351,3.413,353,3.963,374,5.481,377,3.637,379,4.82,497,2.238,534,2.93,546,3.087,569,2.518,792,2.355,798,5.027,816,6.719,855,2.465,1018,3.735,1117,3.464,1122,3.547,1287,6.101,1306,4.308,1361,4.198,1368,6.604,1618,6.354,1626,4.431,1693,3.145,1959,5.434,2339,5.212,2587,5.146]],["t/599",[71,1.558,110,2.969,114,4.946,139,3.382,150,4.766,198,2.75,272,2.728,368,5.022,374,4.495,377,6.249,379,7.146,461,3.467,501,5.136,602,4.306,622,5.317,882,3.754,946,5.233,1556,6.322,1618,4.562,2339,4.515,2639,4.47,2956,5.986,2973,5.081,3001,5.847,3016,5.406]],["t/601",[197,2.728,374,4.695,377,4.534,451,4.656,464,4.699,474,3.8,802,5.445,1039,5.524,1085,4.614,1146,6.009,1306,5.37,1436,3.945,1604,6.131,1642,4.158,1693,3.92,1766,6.582,2393,6.582,2400,6.5,2734,6.582,2997,4.79,3039,9.447]],["t/603",[18,4.634,19,3.091,20,3.878,25,1.863,30,4.38,35,4.125,37,3.269,66,3.829,69,3.239,70,4.428,73,2.767,162,2.671,171,2.541,188,2.688,224,3.536,300,3.182,479,1.971,481,3.076,514,2.363,533,1.891,557,5.291,565,4.875,792,2.042,1193,5.983,1218,3.788,1253,2.959,1313,3.3,1412,3.182,1417,4.03,1564,2.514,1566,5.056,1756,4.03,2072,4.03,2412,5.605,2951,5.291,3040,6.082,3041,5.291,3042,5.056]],["t/606",[23,1.832,30,3.006,73,2.725,161,3.456,162,2.133,170,2.161,188,2.29,224,2.778,282,3.07,337,2.566,422,2.919,663,4.061,824,4.607,995,6.99,1219,4.478,1633,4.288,1720,6.331,1739,5.48,1756,5.572,1831,4.971,2235,4.697,3043,6.331]],["t/608",[71,1.21,271,4.414,282,3.147,285,3.149,297,7.398,316,3.91,349,4.53,422,3.125,675,5.79,766,5.19,2235,4.647,3044,7.728,3045,9.118]],["t/610",[19,2.89,48,2.838,62,2.479,71,1.061,142,2.387,152,1.805,162,2.122,167,1.363,170,2.595,188,1.728,190,1.599,224,1.347,272,1.363,282,2.788,291,3.5,333,2.614,337,1.244,339,1.94,349,3.236,350,1.851,355,2.656,365,2.409,422,2.397,496,1.9,497,2.487,533,2.422,576,1.827,604,1.839,650,1.968,721,1.408,723,2.439,758,4.15,763,1.276,780,5.558,803,1.762,936,1.927,1028,2.439,1044,2.17,1251,2.354,1384,4.009,1481,2.858,1709,4.523,1840,1.875,1847,2.19,1902,2.614,1937,4.28,2066,2.439,2234,2.7,2235,4.701,2310,5.2,2437,3.545,2453,5.558,3046,3.755,3047,4.45,3048,3.388,3049,8.106,3050,2.858,3051,2.858,3052,2.503,3053,2.92,3054,2.656]],["t/612",[62,1.498,71,1.383,142,3.111,162,2.264,164,2.143,168,2.928,170,2.892,188,2.143,282,2.687,291,2.888,363,3.372,422,2.554,479,3.291,497,2.51,533,2.445,534,3.287,604,3.55,741,3.527,763,2.464,936,3.719,1251,6.866,2235,4.602]],["t/614",[61,3.682,162,2.288,170,2.922,188,2.19,369,4.321,578,4.1,763,2.518,798,3.801,818,3.517,868,6.053,1025,6.993,1840,4.739,2234,6.825,2235,4.482,2310,6.089,2410,4.542,2582,5.898,2613,4.449,2996,4.134,3055,6.436,3056,7.409,3057,4.697,3058,5.08,3059,4.362,3060,5.157,3061,6.683]],["t/618",[224,3.372,282,3.153,422,2.998,638,3.789,1559,4.107]],["t/620",[25,2.885,30,4.063,71,1.282,224,3.755,282,3.229,327,4.145,422,2.368,498,3.606,527,4.196,638,2.994,648,5.439,2089,5.785,2186,6.909]],["t/622",[39,2.069,62,1.821,69,2.548,71,1.302,73,1.55,89,2.262,98,1.815,138,1.868,142,1.466,145,2.481,164,1.303,282,2.277,313,4.069,328,2.399,368,2.311,374,2.069,406,1.544,407,1.967,426,1.999,444,2.617,461,3.048,464,3.856,497,1.527,498,1.832,502,2.187,523,1.482,546,3.788,580,4.458,603,2.382,610,2.145,618,3.288,638,3.256,645,3.429,785,7.34,786,3.355,787,3.978,788,3.83,791,5.964,792,2.409,793,4.675,794,3.978,795,3.069,796,2.132,797,3.429,798,3.392,799,3.978,800,2.864,801,2.733,802,2.98,803,2.069,805,2.045,816,4.241,902,1.521,936,2.262,948,2.648,957,3.171,1117,2.363,1231,2.44,1614,3.978,1618,4.011,1636,4.251,1642,3.661,1693,2.145,1761,3.355,2014,3.602,2045,2.548,2069,3.118,2575,3.978,2719,3.288,2975,4.533,3016,6.336,3062,3.51,3063,4.409,3064,4.409,3065,4.409,3066,4.162,3067,4.409,3068,4.409,3069,4.409,3070,4.409,3071,4.409,3072,4.409,3073,6.611,3074,4.409]],["t/624",[71,1.687,142,2.987,374,4.216,377,5.057,444,2.965,497,3.112,814,6.557,1618,5.452,2668,8.138]],["t/626",[19,1.465,35,2.581,48,1.391,56,2.297,62,1.017,111,2.139,154,2.795,170,2.001,224,1.765,271,3.133,282,3.132,284,2.532,297,3.604,333,3.427,337,1.631,346,3.052,349,2.725,389,2.845,397,4.352,417,2.107,422,2.697,533,1.661,576,2.396,580,2.491,619,2.352,638,3.951,766,3.121,793,3.482,857,3.672,874,2.899,921,3.086,966,2.396,1251,3.086,1557,2.957,1809,3.198,1841,3.019,1969,3.482,2343,3.328,2347,4.993,2451,3.282,2453,3.376,2667,4.993,3047,3.747,3054,3.482,3062,3.92,3075,4.442,3076,4.924,3077,4.924,3078,7.173,3079,4.924,3080,3.672,3081,3.829,3082,3.427,3083,5.578,3084,4.023,3085,5.86,3086,4.277,3087,5.578,3088,4.023,3089,4.023,3090,4.023,3091,4.14,3092,4.648,3093,4.648,3094,4.648,3095,7.173,3096,4.924,3097,4.924,3098,4.924,3099,4.648,3100,4.924,3101,4.442,3102,4.277,3103,4.924]],["t/628",[89,4.304,98,3.453,153,3.045,164,2.48,403,2.962,437,3.58,496,4.246,533,2.83,638,2.894,752,3.52,874,4.941,936,5.264,974,5.091,1038,4.533,1502,7.289,1825,4.335,2996,4.682,3045,7.569,3104,7.055]],["t/630",[154,4.365,164,2.873,168,3.926,170,2.145,284,3.431,327,3.673,368,5.586,389,4.444,638,4.069,1825,5.506,2639,6.337,3082,5.353,3101,6.937,3105,7.259,3106,9.175,3107,7.259,3108,6.466]],["t/632",[22,1.895,35,2.117,48,1.141,62,0.835,68,2.624,71,0.914,96,1.534,97,2.857,139,1.426,142,1.343,153,1.466,154,2.293,164,1.194,167,2.245,170,1.726,275,2.356,277,5.86,284,3.382,300,3.512,389,3.575,403,2.184,431,2.869,437,1.41,474,1.534,493,1.918,534,1.832,543,2.182,569,2.411,580,2.044,638,3.92,699,3.316,716,2.182,756,2.217,764,2.166,793,2.857,854,2.477,864,3.835,874,4.427,902,2.134,966,1.966,990,2.693,1027,3.069,1035,2.77,1053,2.335,1209,2.293,1251,4.712,1378,3.141,1546,3.141,1557,2.426,1790,2.812,1829,2.102,1841,2.477,1847,2.356,1850,3.397,1974,4.528,2066,2.624,2316,2.451,2343,4.181,2536,3.301,2672,3.074,3010,4.306,3080,3.013,3081,3.141,3082,2.812,3083,3.141,3084,3.301,3085,5.055,3087,3.141,3088,3.301,3089,3.301,3090,3.301,3091,3.397,3109,3.509,3110,3.644,3111,3.644,3112,3.644,3113,3.644,3114,4.04,3115,10.288,3116,4.04,3117,3.644,3118,7.519,3119,5.84,3120,4.04,3121,6.187,3122,5.84,3123,6.187,3124,6.187,3125,4.04,3126,3.814]],["t/634",[35,2.427,48,1.308,62,0.957,71,1.013,96,2.604,133,2.148,139,1.635,153,1.681,154,2.629,164,1.369,167,1.681,170,2.278,275,2.701,284,3.933,389,4.719,403,1.635,437,1.616,474,1.758,479,1.628,493,2.199,534,2.1,543,2.502,569,2.672,580,2.343,615,3.524,638,3.946,716,2.502,762,1.758,793,3.275,874,4.038,902,1.598,921,4.297,966,2.253,1027,3.401,1035,3.175,1053,2.676,1209,2.629,1237,3.524,1251,5.117,1557,2.781,1732,2.563,1790,3.223,1829,2.41,1841,2.839,1847,2.701,1974,3.389,2316,2.81,2343,4.634,2672,3.524,3080,3.454,3081,3.601,3082,3.223,3083,3.601,3084,3.783,3085,5.602,3087,3.601,3088,3.783,3089,3.783,3090,3.783,3109,5.957,3110,4.178,3111,4.178,3127,6.857,3128,9.637,3129,4.631,3130,4.631,3131,6.857,3132,4.631,3133,8.166,3134,6.857,3135,4.631,3136,6.857,3137,4.631,3138,4.631]],["t/636",[22,3.937,35,3.223,39,2.626,111,2.672,115,2.417,132,3.375,138,1.737,164,3.033,166,3.403,170,1.715,198,2.25,282,1.765,375,2.937,389,3.554,403,3.622,490,5.52,493,3.984,527,2.973,580,3.111,595,4.305,638,3.984,663,3.223,721,2.306,874,6.68,966,4.648,1027,4.162,1829,4.366,1841,3.77,2667,5.841,3080,4.586,3081,4.782,3082,5.841,3139,7.921,3140,6.149]],["t/639",[290,5.347,513,5.147,523,2.993,549,3.549,602,5.101,638,3.924,763,3.027,1014,6.107,2668,6.778,3141,6.02,3142,7.091]],["t/641",[107,4.137,276,6.072,277,4.251,284,2.756,300,4.432,526,6.455,549,3.111,607,4.737,638,3.385,650,4.093,763,3.335,764,4.186,902,2.694,1036,4.286,1076,5.354,1127,4.154,1698,4.354,1711,6.542,2122,4.432,2668,5.942,3143,7.809,3144,7.809,3145,7.371,3146,7.809]],["t/646",[62,2.307,250,5.102,280,4.882,780,6.217,1480,6.636,1709,5.059,1790,6.311,1960,6.412,1974,7.41,2236,7.051,3147,8.795,3148,7.051,3149,6.904,3150,9.067,3151,9.067,3152,9.067,3153,9.067,3154,9.067,3155,9.067,3156,6.904,3157,6.904,3158,6.904,3159,6.904,3160,6.904,3161,6.904]],["t/650",[39,2.812,139,3.172,171,4.074,382,4.12,527,4.345,561,5.343,867,4.074,3162,9.751,3163,8.483,3164,8.986,3165,8.986,3166,8.986,3167,8.986]],["t/653",[61,3.228,119,7.341,120,6.716,164,2.46,197,2.817,272,3.02,309,3.425,337,2.756,936,4.269,1458,5.158,3168,11.079,3169,9.637,3170,9.03,3171,9.03,3172,9.03,3173,9.03,3174,9.03,3175,9.03]],["t/655",[337,3.203,1209,5.491,3176,10.496,3177,10.496,3178,9.673]],["t/657",[62,2.476,97,4.402,142,2.069,164,1.84,170,2.877,250,3.503,272,3.07,337,2.802,374,2.92,496,3.15,606,3.445,749,2.277,860,4.043,1825,5.328,2122,3.533,2709,5.407,3169,5.876,3179,6.755,3180,9.181,3181,9.612,3182,5.615,3183,9.181,3184,9.181,3185,6.755,3186,6.755,3187,6.225,3188,6.755,3189,6.755,3190,6.225,3191,6.755,3192,9.181,3193,9.181,3194,6.755,3195,6.755,3196,6.755,3197,6.755,3198,6.755,3199,6.755]],["t/659",[25,1.393,33,2.4,62,1.315,71,0.94,73,1.473,84,2.832,111,1.821,138,1.797,142,1.393,150,2.656,164,1.239,198,2.327,251,2.281,263,2.597,284,2.246,346,2.597,379,5.735,380,5.198,388,3.189,389,3.677,390,6.322,395,2.3,437,2.996,502,3.814,596,1.83,599,2.444,699,5.578,721,1.571,741,2.039,756,2.3,758,6.159,796,2.026,803,2.985,867,2.885,902,2.195,921,5.381,936,3.945,980,2.039,1003,2.793,1332,4.575,1524,3.78,1592,7.746,1642,1.741,1808,4.3,2026,3.956,2378,3.956,2906,5.735,3169,6.005,3200,6.903,3201,4.547,3202,4.547,3203,4.547,3204,9.637,3205,4.19,3206,6.903,3207,4.547,3208,4.19,3209,4.547,3210,4.547,3211,3.956,3212,4.547,3213,3.956,3214,4.547,3215,4.547,3216,4.547,3217,4.547]],["t/661",[28,2.59,48,1.769,62,2.396,142,2.082,153,2.273,170,1.747,197,2.877,272,2.273,368,3.283,406,2.194,422,2.319,479,2.988,576,3.048,788,5.441,796,3.029,882,3.127,936,5.305,1209,3.555,1253,3.307,1288,5.664,1393,4.12,1642,3.53,1825,3.236,2069,4.429,2122,3.555,2691,3.971,3058,4.294,3218,9.22,3219,6.796,3220,9.22,3221,6.796,3222,5.912,3223,10.463,3224,5.912,3225,6.263,3226,6.796,3227,6.796,3228,9.22,3229,6.796,3230,4.429,3231,6.796,3232,6.796]],["t/663",[71,1.687,142,2.987,287,5.509,337,2.976,437,3.136,721,3.369,867,4.074,3163,8.483,3233,9.751,3234,7.342,3235,8.483]],["t/665",[28,2.162,51,3.509,57,2.305,60,2.663,62,2.396,71,1.212,107,1.374,111,1.416,115,2.945,118,2.144,142,2.726,151,1.884,164,1.935,167,1.897,171,1.478,172,0.97,190,1.388,246,1.606,272,1.897,279,2.305,284,1.846,309,1.342,327,1.557,328,1.183,337,2.899,363,1.701,403,2.644,406,1.142,434,1.462,437,3.209,458,1.222,464,4.783,498,1.354,514,1.374,531,2.117,569,3.584,580,1.649,602,1.867,645,2.535,650,1.709,663,1.709,721,1.961,739,1.978,749,1.913,763,1.108,792,1.188,803,1.529,818,2.482,860,2.117,866,3.585,902,1.125,921,2.043,936,3.843,952,2.663,1018,1.884,1038,1.761,1182,2.386,1252,1.661,1263,1.958,1387,2.144,1450,2.173,1559,1.424,1571,1.548,1584,3.206,1825,2.701,1878,1.867,2066,2.117,2122,1.85,2202,2.305,3030,4.936,3035,4.936,3234,6.7,3235,3.077,3236,3.26,3237,2.941,3238,3.537,3239,3.537,3240,3.537,3241,3.537,3242,3.26,3243,3.537,3244,3.537,3245,3.537,3246,3.537,3247,3.537,3248,3.537,3249,2.941,3250,2.741,3251,3.537,3252,5.674,3253,5.674,3254,5.674,3255,3.537,3256,3.537,3257,4.936,3258,3.537,3259,4.717,3260,3.537,3261,3.537,3262,2.941,3263,5.674,3264,3.537,3265,3.537,3266,8.899,3267,8.899,3268,3.537,3269,2.832,3270,3.537,3271,3.26,3272,3.537,3273,2.741,3274,5.229,3275,3.537,3276,3.537]],["t/667",[39,1.868,48,1.686,62,2.511,71,0.882,139,2.107,142,1.984,153,2.983,164,1.764,170,1.665,223,4.751,250,3.358,272,2.166,437,2.082,584,3.876,723,3.876,738,6.912,867,2.706,902,2.059,955,2.736,1290,3.926,1458,5.095,1511,4.368,1679,5.184,1879,5.786,2256,7.76,2305,5.968,3030,5.634,3163,5.634,3234,4.876,3269,5.184,3271,5.968,3277,10.996,3278,6.476,3279,6.476,3280,6.476,3281,5.634,3282,6.476,3283,6.476,3284,6.476,3285,6.476,3286,6.476,3287,6.476,3288,6.476,3289,6.476,3290,6.476]],["t/670",[48,2.39,71,1.25,142,2.812,164,3.048,272,3.07,349,4.682,437,2.952,464,6.016,2089,5.64,2264,7.349,3234,6.912,3291,8.461,3292,9.181,3293,9.181,3294,9.181,3295,9.181,3296,9.181,3297,9.181]],["t/672",[71,1.389,164,2.779,866,6.447,1018,5.434,3235,8.876,3237,9.909,3298,8.168]],["t/674",[61,3.228,62,2.442,502,4.128,721,3.12,749,3.044,766,5.276,867,3.773,1361,5.405,2470,7.855,3164,8.322,3299,11.079,3300,7.855,3301,9.03,3302,11.079,3303,9.03,3304,8.322]],["t/677",[71,1.154,142,3.262,164,2.901,167,2.834,271,3.41,276,6.072,278,6.072,637,7.057,766,4.95,771,4.598,802,5.277,936,5.035,1599,5.354,1698,3.464,1790,5.435,1831,5.009,3304,9.814,3305,8.473,3306,8.473,3307,8.473,3308,10.649,3309,8.473,3310,7.809,3311,8.473]],["t/679",[71,1.364,142,3.069,164,2.729,318,4.464,437,3.221,699,4.949,766,5.853,936,5.575,3312,10.018]],["t/681",[35,4.588,61,3.396,138,3.19,168,3.536,422,2.389,533,2.952,721,3.282,749,3.202,855,3.338,867,3.969,989,4.692,1361,5.685,3139,8.263,3165,8.753]],["t/683",[62,2.407,71,1.271,138,2.431,143,2.968,502,4.268,1393,5.66,3182,7.762,3313,11.306,3314,7.762,3315,12.162,3316,11.306]],["t/685",[62,2.407,71,1.271,138,2.431,143,2.968,502,4.268,1393,5.66,3182,7.762,3317,11.306,3318,9.337,3319,12.162,3320,11.306]],["t/687",[25,3.041,30,3.549,337,3.03,422,2.497,576,4.451,721,3.43,724,5.55,771,5.387,867,4.148,1609,7.283,3166,9.149]],["t/689",[25,3.377,48,1.696,62,1.949,153,2.179,246,5.81,337,2.734,417,2.569,422,2.574,426,4.606,749,4.124,818,2.85,1648,7.071,2122,3.408,2361,7.73,3321,8.957,3322,5.667,3323,5.667,3324,8.542,3325,7.576,3326,10.159,3327,10.159,3328,6.004,3329,6.004,3330,6.004]],["t/691",[24,3.971,25,2.082,48,1.769,61,2.43,62,1.756,71,1.255,111,2.721,141,4.956,142,2.082,171,2.84,337,3.775,421,3.495,502,3.107,544,4.87,576,4.692,749,2.291,756,3.438,771,3.688,813,4.429,867,2.84,869,3.62,882,3.127,936,3.213,1002,2.809,1209,3.555,1541,4.018,1609,4.986,1648,4.36,2268,4.986,2310,4.018,2673,8.02,2897,6.263,3322,5.912,3325,4.671,3327,6.263,3331,6.796,3332,10.463,3333,6.796,3334,9.643,3335,5.912,3336,4.986,3337,6.796,3338,6.796,3339,6.796,3340,6.796,3341,6.796]],["t/693",[61,3.549,71,0.837,111,2.462,142,3.041,164,2.704,170,1.581,251,4.318,272,2.878,417,3.394,422,1.547,721,2.125,749,2.901,867,2.57,882,3.96,902,1.955,936,5.084,1141,3.778,1633,3.136,1705,4.227,1825,2.928,2122,3.217,2310,3.636,2378,5.35,2672,6.962,2978,7.991,3187,5.668,3190,5.668,3342,6.15,3343,6.15,3344,4.923,3345,6.15,3346,6.15,3347,6.15,3348,6.15,3349,6.15,3350,6.15,3351,8.606,3352,6.15,3353,6.15,3354,6.15,3355,6.15,3356,5.668,3357,6.15,3358,6.15,3359,6.15,3360,6.15,3361,6.15,3362,8.606,3363,8.606,3364,7.931]],["t/695",[71,1.136,142,2.556,170,2.145,171,3.487,271,3.358,309,3.165,378,4.404,422,2.099,619,3.673,637,5.529,721,2.883,749,2.813,766,4.875,867,4.832,936,3.945,1731,4.715,2925,7.259,3167,7.69,3365,11.564,3366,8.344,3367,8.344,3368,8.344,3369,9.614,3370,9.72,3371,8.344]],["t/697",[71,1.416,224,3.436,576,4.662,633,5.642,3230,7.853]],["t/699",[71,1.316,337,2.95,422,3.104,426,4.039,576,4.334,633,5.245,749,3.258,2019,8.907,2101,6.778,3230,6.299,3372,7.277,3373,8.907]],["t/704",[61,3.202,71,1.501,168,3.334,285,3.175,363,3.304,368,4.326,382,3.784,437,2.88,749,3.019,792,3.007,796,3.991,882,5.494,958,6.571,1027,4.094,1078,5.502,1407,6.571,2040,6.676]],["t/706",[285,3.583,363,3.03,368,4.883,437,3.812,444,3.074,603,5.033,676,5.434,3374,10.11]],["t/708",[61,2.275,71,1.2,95,3.487,107,2.472,161,2.616,167,2.128,224,2.912,271,3.547,284,2.07,285,3.124,337,3.086,375,2.801,382,2.689,422,1.6,437,2.834,497,2.031,518,4.321,533,1.978,547,4.082,576,4.894,610,2.853,621,2.836,633,3.453,638,2.023,650,3.074,676,3.421,703,4.374,719,3.143,850,4.957,869,3.389,893,2.967,904,4.56,932,3.12,945,5.865,1559,2.561,1627,6.829,1636,3.143,1698,3.603,3075,5.29,3230,4.147,3373,8.122,3375,4.292,3376,5.094,3377,10.111,3378,11.202,3379,9.318,3380,5.094]],["t/710",[61,3.717,71,1.416,285,3.685,599,5.588,612,5.642,3381,8.323]],["t/712",[45,4.543,61,3.338,71,0.943,96,2.423,138,1.803,142,2.121,272,2.316,285,4.008,350,4.24,368,4.51,426,2.894,437,3.003,474,2.423,515,2.704,521,3.475,576,4.187,598,5.589,599,3.722,676,6.078,730,4.254,936,4.414,1078,4.254,1809,4.145,3325,4.759,3381,7.475,3382,8.605,3383,6.382,3384,9.337,3385,6.382,3386,6.024,3387,5.757,3388,6.382,3389,6.024,3390,6.382,3391,6.024,3392,6.024,3393,9.337,3394,6.382,3395,6.024,3396,6.382,3397,6.024]],["t/714",[25,2.311,48,1.964,62,0.975,71,1.435,96,1.791,107,1.989,139,2.454,142,1.568,153,1.712,161,2.104,198,1.726,279,3.336,284,1.665,285,1.814,286,2.42,309,1.941,342,2.956,362,3.188,363,1.534,395,2.589,403,1.665,417,2.019,436,3.981,437,2.426,458,1.769,521,2.568,527,2.281,533,2.345,576,2.295,650,2.472,676,2.751,685,4.098,703,3.518,764,3.726,798,2.42,1165,3.668,1571,2.24,1608,3.283,1902,6.34,1946,3.966,2707,4.255,3027,2.991,3325,3.518,3381,7.17,3385,4.717,3386,4.453,3387,4.255,3388,4.717,3389,4.453,3390,4.717,3391,4.453,3392,4.453,3394,4.717,3395,4.453,3396,4.717,3397,4.453,3398,5.119,3399,5.119,3400,5.119,3401,5.119,3402,4.717,3403,5.119,3404,4.717,3405,4.717,3406,5.119,3407,4.717,3408,4.717,3409,5.119,3410,4.098,3411,3.59,3412,5.119,3413,4.717,3414,5.119,3415,4.717,3416,4.717,3417,5.119,3418,4.717,3419,4.717,3420,5.119,3421,4.717,3422,4.717,3423,5.119,3424,4.717,3425,4.717,3426,5.119,3427,3.966,3428,4.453,3429,5.119,3430,4.717,3431,4.717,3432,5.119,3433,4.717,3434,4.717,3435,5.119,3436,4.098,3437,4.098,3438,5.119,3439,3.756,3440,5.119]],["t/716",[71,1.2,107,3.424,142,2.699,164,3.229,272,2.947,284,2.867,286,4.166,498,3.374,721,3.045,764,5.856,850,4.32,866,5.568,936,5.16,1252,4.138,3410,7.055,3427,9.186,3428,7.666,3436,7.055]],["t/718",[39,1.794,45,3.026,48,1.619,62,2.3,71,0.847,110,2.263,139,2.023,152,2.754,285,3.54,314,3.989,337,1.898,368,4.824,371,5.402,422,2.181,433,3.237,437,2,444,1.891,493,2.721,502,3.965,523,1.926,528,3.77,576,3.889,595,5.373,599,4.662,612,3.375,633,3.375,675,4.053,676,6.327,702,4.683,703,4.275,730,6.135,749,2.097,763,1.948,771,4.707,965,3.93,1424,3.77,1478,4.361,1896,5.17,2078,4.457,2587,4.563,3382,5.732,3441,6.22,3442,9.205,3443,6.22,3444,6.22,3445,6.22]],["t/720",[48,2.473,129,4.314,132,4.804,145,4.926,153,3.176,172,2.604,285,3.367,326,4.555,327,4.181,437,3.673,612,5.154,1217,6.528,1608,6.093,3230,6.19,3381,7.604]],["t/722",[61,3.456,337,3.523,346,7.05,368,4.668,382,4.084,403,3.144,1694,6.2,3446,7.277,3447,9.665,3448,8.907,3449,9.665]],["t/724",[51,2.561,62,1.237,71,1.451,104,2.653,132,2.124,133,2.776,136,2.832,142,1.286,164,1.769,170,1.67,171,1.755,198,3.259,282,1.111,284,2.584,285,2.815,286,3.071,351,3.161,363,2.679,395,3.285,406,2.097,417,2.561,431,4.131,437,2.554,479,2.105,502,2.969,507,2.886,521,2.107,529,2.483,576,1.883,598,2.514,641,3.71,676,5.494,762,2.779,763,1.315,764,3.209,936,1.985,958,4.766,1078,3.99,1618,2.348,1642,3.041,1648,2.694,1744,4.166,1782,3.67,1825,4.256,1879,4.85,1946,3.254,2122,2.197,2256,6.91,2360,5.2,2361,2.945,2986,7.32,3325,2.886,3386,3.653,3387,3.491,3389,3.653,3391,3.653,3392,3.653,3395,3.653,3397,3.653,3402,3.87,3404,3.87,3405,3.87,3407,3.87,3408,3.87,3410,3.362,3411,2.945,3413,3.87,3415,5.986,3416,3.87,3418,5.986,3419,3.87,3421,3.87,3422,3.87,3424,3.87,3425,3.87,3427,6.155,3428,3.653,3430,3.87,3431,3.87,3433,3.87,3434,3.87,3436,3.362,3437,3.362,3439,4.766,3450,6.495,3451,5.986,3452,3.87,3453,4.655,3454,6.495,3455,5.986]],["t/727",[51,3.42,61,3.101,62,2.461,382,3.665,422,2.181,1879,4.352,2264,6.943,3234,6.53,3237,7.211,3269,6.943,3456,8.674,3457,7.993,3458,8.674,3459,7.993,3460,7.993,3461,7.993,3462,9.4,3463,7.993,3464,7.993,3465,7.993,3466,7.545]],["t/729",[23,0.573,51,2.991,61,2.426,62,2.594,71,1.121,75,3.302,92,1.376,98,0.998,106,2.453,122,1.442,133,2.9,138,1.157,143,2.928,167,0.88,172,0.721,197,0.821,198,0.887,224,0.869,272,1.487,282,1.176,309,2.19,313,1.244,326,1.262,337,1.357,363,0.789,368,1.271,374,1.138,382,1.112,403,0.856,422,2.204,426,2.836,431,1.9,433,0.853,437,0.846,464,1.414,468,3.497,474,0.921,492,2.568,501,1.3,519,1.537,533,1.382,612,4.116,622,1.715,749,3.6,763,0.824,771,1.428,815,1.244,866,1.662,867,2.412,882,4.413,893,1.227,904,5.898,934,1.262,970,1.262,972,1.07,975,1.52,1002,1.087,1018,3.075,1027,1.203,1052,1.52,1062,3.118,1066,1.845,1078,1.616,1107,1.744,1209,2.326,1229,2.187,1334,2.731,1361,1.575,1619,1.414,1633,2.267,1636,3.352,1642,3.672,1669,1.52,1841,1.487,1879,2.897,2089,1.616,2264,2.106,2272,3.559,2362,2.187,2605,3.347,2973,1.639,2981,1.845,2997,2.436,3230,2.897,3234,1.981,3237,2.187,3269,2.106,3457,2.425,3459,2.425,3461,2.425,3462,5.022,3463,2.425,3464,2.425,3465,2.425,3466,2.289,3467,2.631,3468,2.631,3469,2.187,3470,2.631,3471,3.559,3472,2.631,3473,3.559,3474,4.446,3475,5.773,3476,2.425,3477,2.425,3478,2.631,3479,2.425,3480,2.425,3481,2.425,3482,2.425,3483,2.425,3484,2.631,3485,2.425,3486,2.631,3487,2.631,3488,2.631,3489,2.631,3490,2.631,3491,2.631,3492,2.425,3493,2.631]],["t/732",[62,1.565,96,2.876,142,3.2,164,2.239,272,2.749,326,3.941,407,3.379,417,3.241,437,2.643,805,3.513,818,3.596,865,5.447,936,3.886,1085,4.338,1314,4.86,1421,3.473,1552,6.833,1729,4.983,2451,5.049,3060,6.701,3213,7.15,3494,10.447,3495,8.22,3496,5.89,3497,8.22,3498,8.22,3499,8.22,3500,8.22,3501,10.447,3502,8.22]],["t/735",[28,1.74,29,1.669,61,2.991,62,1.319,71,1.438,96,1.598,107,1.774,123,2.733,133,2.96,153,3.123,164,2.279,167,1.527,168,1.7,190,2.717,284,3.766,285,3.89,286,3.955,291,1.676,314,2.929,337,2.114,363,2.799,403,2.722,422,1.742,437,3.227,438,3.438,497,1.457,501,2.255,521,2.291,534,1.908,596,1.838,600,2.608,617,3.138,618,3.138,638,1.452,650,2.205,663,2.205,676,4.497,721,1.578,730,4.254,752,1.765,762,3.697,763,2.169,850,2.238,893,2.129,932,2.238,965,4.376,1027,2.087,1034,3.08,1127,2.238,1165,3.272,1387,2.768,1469,2.668,1558,2.087,1627,7.235,1636,2.255,1732,2.328,1841,2.58,2047,3.202,2089,2.805,3182,3.796,3378,9.25,3379,4.208,3380,5.544,3410,3.655,3427,3.538,3436,3.655,3452,4.208,3503,7.763,3504,4.566,3505,4.566,3506,4.566,3507,4.208,3508,3.655,3509,4.566,3510,4.566,3511,5.757,3512,4.208]],["t/737",[35,3.8,138,2.048,164,2.143,198,2.652,224,2.599,339,3.745,363,3.045,403,2.559,422,2.554,437,2.53,565,5.017,650,3.8,699,3.886,719,5.017,721,2.718,770,4.971,803,3.401,814,4.445,1424,4.769,1523,5.637,1648,5.046,1698,3.216,1879,3.947,2985,6.297,3453,5.637,3511,6.54,3513,8.722,3514,7.867,3515,7.867,3516,7.867,3517,7.867,3518,7.25,3519,7.867]],["t/739",[25,3.135,35,3.147,62,2.274,71,1.394,138,1.696,142,1.995,164,2.44,167,2.179,272,2.179,282,3.057,346,3.721,363,1.953,426,4.277,444,1.981,468,2.768,565,5.056,699,4.425,749,2.196,861,3.502,869,3.469,936,3.08,2978,4.116,3004,6.004,3020,7.17,3211,5.667,3471,5.215,3511,5.416,3520,6.004,3521,8.957,3522,10.236,3523,10.236,3524,6.514,3525,6.514,3526,6.514,3527,6.514,3528,8.957,3529,6.514,3530,6.004,3531,6.004,3532,6.004,3533,8.957,3534,6.004]],["t/741",[62,2.379,699,4.461,770,8.103,1600,5.339,3535,9.03,3536,11.985,3537,11.985,3538,11.985,3539,9.03]],["t/744",[62,2.61,142,2.249,171,3.067,192,4.572,936,3.471,1808,4.572,3476,11.397,3477,11.093,3479,6.765,3480,6.765,3481,6.765,3482,8.947,3483,6.765,3485,6.765,3540,7.341,3541,7.341,3542,7.341,3543,7.341,3544,7.341,3545,7.341]],["t/746",[28,0.811,48,0.554,62,2.537,71,0.504,125,0.811,132,1.076,138,2.524,139,2.171,153,0.711,164,1.603,170,0.547,198,1.985,251,1.859,285,0.754,316,2.937,337,2.779,342,1.228,361,1.189,362,1.325,368,1.027,397,1.189,417,2.321,426,1.548,436,1.123,437,2.146,474,0.744,501,1.051,530,3.45,531,2.217,534,0.889,543,1.059,569,0.764,576,1.661,598,3.523,599,1.143,600,4.498,602,1.955,610,2.206,635,1.703,650,1.027,698,5.425,699,5.12,719,2.431,724,3.291,737,1.492,815,1.006,818,0.931,850,1.043,853,2.597,864,1.215,867,1.548,879,3.813,881,4.774,884,1.703,885,1.325,900,4.28,921,2.139,936,1.006,1182,3.319,1209,1.938,1211,1.386,1263,1.177,1541,1.258,1575,1.85,1584,2.78,1627,1.648,1902,1.364,2069,2.414,2080,2.87,2149,2.727,2621,3.079,3010,1.364,3032,1.648,3205,1.96,3242,3.414,3471,4.712,3513,7.738,3518,1.96,3530,3.414,3531,3.414,3532,3.414,3546,2.127,3547,2.127,3548,2.127,3549,4.92,3550,5.887,3551,3.704,3552,2.127,3553,2.127,3554,5.887,3555,2.127,3556,2.127,3557,4.92,3558,5.887,3559,3.704,3560,2.127,3561,2.127,3562,1.96,3563,3.704,3564,3.704,3565,3.704,3566,4.92,3567,3.704,3568,3.704,3569,2.127,3570,3.704,3571,3.704,3572,6.673,3573,3.704,3574,3.704,3575,3.704,3576,2.127,3577,3.704,3578,3.704,3579,3.704,3580,3.704,3581,3.704,3582,3.704,3583,3.704,3584,6.673,3585,3.704,3586,3.414,3587,3.704,3588,3.704,3589,2.127,3590,2.127,3591,1.96,3592,4.92,3593,2.127,3594,1.96,3595,4.92,3596,1.768,3597,2.127,3598,3.704,3599,1.96,3600,2.127,3601,1.96,3602,1.96,3603,2.127,3604,3.414,3605,4.92,3606,4.92,3607,4.92,3608,3.704,3609,4.92,3610,3.704,3611,3.704,3612,5.887]],["t/749",[19,0.997,25,2.217,39,0.601,40,0.83,48,1.51,62,2.496,71,0.659,73,1.88,105,1.211,109,2.289,122,4.525,123,1.247,138,0.542,161,3.201,162,1.326,168,0.775,170,1.491,171,1.52,172,1.327,188,0.991,206,1.177,282,1.535,283,1.217,285,0.738,318,0.928,334,1.46,337,0.636,350,0.946,355,2.37,369,1.12,382,0.88,390,1.87,395,6.06,402,1.19,422,2.678,433,0.675,437,1.557,492,2.1,497,0.665,502,1.662,587,1.87,604,2.184,611,0.928,723,1.247,758,3.854,855,2.314,867,4.627,869,1.109,882,2.227,996,1.731,1027,0.952,1059,1.231,1084,1.431,1127,1.021,1148,1.667,1252,0.978,1377,1.141,1412,3.035,1458,2.077,1559,0.838,1562,1.19,1732,1.062,1825,0.992,2000,3.164,2347,1.336,2381,1.667,2447,1.46,2699,1.357,2719,2.499,3613,2.083,3614,3.637,3615,1.731,3616,1.919,3617,1.919,3618,1.919,3619,3.352,3620,1.919,3621,2.083,3622,2.083,3623,1.919,3624,10.844,3625,4.461,3626,11.041,3627,1.919,3628,1.919,3629,1.812,3630,1.812,3631,1.919,3632,1.919,3633,1.919,3634,1.812,3635,1.919,3636,1.919,3637,1.812,3638,1.919,3639,6.069,3640,1.919,3641,4.461,3642,1.919,3643,8.605,3644,1.919,3645,1.919,3646,1.919,3647,1.919,3648,1.919,3649,6.669,3650,1.919,3651,1.919,3652,1.919,3653,1.919,3654,2.083,3655,1.919,3656,1.919,3657,8.605,3658,1.919,3659,1.919,3660,1.919,3661,1.919,3662,1.919,3663,1.919,3664,1.919,3665,1.919,3666,5.346,3667,1.919,3668,1.919,3669,1.919,3670,1.919,3671,1.919,3672,1.919,3673,1.919,3674,1.919,3675,1.919,3676,1.919,3677,1.919,3678,1.919,3679,1.919,3680,1.919,3681,1.919,3682,2.083]],["t/754",[62,2.018,699,5.235,3683,10.597,3684,10.597]],["t/756",[39,2.999,139,3.382,382,4.393,527,4.633,561,5.697,3685,10.397]],["t/758",[30,2.116,39,1.707,62,1.127,96,2.071,98,2.244,110,2.154,116,2.37,129,3.804,138,3.016,140,4.894,153,2.801,172,1.623,224,2.768,272,1.979,291,2.173,300,3.096,309,2.244,361,3.309,422,1.488,433,3.616,444,1.8,497,1.889,514,2.299,527,2.637,533,1.84,549,2.173,565,2.923,612,3.211,638,1.881,650,2.859,749,3.761,752,2.288,756,2.993,771,3.211,792,1.987,850,4.107,867,2.473,885,3.686,932,2.901,934,2.838,993,5.014,1127,2.901,1176,4.733,1266,4.15,1473,3.458,1571,2.589,1599,3.739,1639,3.539,1688,3.418,1689,3.418,1768,3.635,1809,3.542,1877,6.177,2046,3.018,2912,8.464,2972,4.342,2978,3.739,3021,4.456,3686,5.148]],["t/760",[39,2.502,129,3.939,138,2.258,285,3.074,363,2.6,422,2.181,433,3.502,437,2.789,749,4.154,1140,5.48,1176,4.901,1219,4.619,1541,6.389,1688,6.241,1689,6.241,1877,5.067,2101,7.578,3372,6.53,3687,6.53]],["t/763",[25,3.046,30,2.833,48,0.638,51,3.125,54,2.473,59,1.293,62,1.509,71,1.152,81,1.992,107,0.952,110,2.883,111,0.981,115,3.984,129,1.112,132,1.239,133,1.047,137,1.239,138,0.638,146,1.912,151,2.228,152,1.085,154,1.281,164,1.14,173,2.643,190,1.642,271,1.684,272,1.399,277,3.25,279,3.569,284,0.797,291,2.378,309,3.005,334,2.934,337,2.945,342,2.416,346,5.318,350,2.487,354,3.976,363,3.489,368,2.645,375,1.078,403,1.781,422,1.629,426,1.748,433,1.356,437,2.339,444,0.745,458,0.846,468,1.041,493,1.83,497,2.067,498,0.938,523,0.759,527,1.091,549,2.378,595,2.589,606,1.249,612,1.329,638,1.33,641,2.389,699,2.067,717,1.466,722,2.416,749,3.139,756,2.77,763,0.767,771,2.972,803,1.809,850,1.201,864,3.128,893,1.951,902,0.779,921,2.416,934,1.175,936,1.978,972,0.996,973,1.053,1027,1.12,1091,2.822,1141,1.505,1176,2.364,1384,2.643,1387,1.485,1436,1.105,1469,1.431,1481,2.934,1511,1.652,1514,1.526,1541,1.448,1562,2.389,1563,1.961,1600,4.3,1603,2.606,1636,2.067,1648,1.571,1877,4.945,1938,3.478,2046,1.249,2084,1.329,2130,2.57,2151,1.755,2187,1.718,2410,2.364,2468,2.131,2671,1.526,2711,2.257,3010,1.571,3273,6.912,3298,1.961,3325,1.683,3688,4.906,3689,3.478,3690,2.449,3691,2.449,3692,3.639,3693,6.476,3694,5.476,3695,2.449,3696,6.476,3697,2.449,3698,4.184,3699,2.934,3700,3.856,3701,3.478,3702,2.998,3703,4.184,3704,3.639,3705,4.184,3706,5.968,3707,2.131,3708,2.449,3709,2.449,3710,2.449,3711,2.449]],["t/765",[39,2.716,129,4.277,285,3.338,403,3.063,433,3.683,437,3.028,576,4.222,749,4.115,2587,6.909,3372,9.19,3712,11.365]],["t/767",[25,3.401,30,3.053,39,0.815,48,0.736,62,1.353,71,1.424,110,1.029,111,1.132,132,3.076,133,1.208,138,0.736,139,0.92,142,0.866,150,2.759,151,1.506,154,3.716,164,2.587,167,1.579,170,0.727,171,1.181,172,1.295,192,2.942,224,1.561,271,1.901,277,2.37,279,3.078,280,1.843,307,1.943,337,0.863,339,1.346,342,1.633,346,6.234,350,1.284,359,2.827,362,1.761,363,1.416,371,1.761,378,2.493,382,4.17,403,0.92,407,1.162,417,1.115,421,1.454,422,2.279,437,0.909,444,1.436,445,3.436,468,2.007,498,1.083,502,2.78,523,0.876,533,1.891,534,1.181,542,3.366,561,1.549,569,1.015,575,1.814,576,1.268,595,4.037,638,0.899,650,1.366,719,1.397,749,3.202,754,1.983,761,6.568,771,5.807,802,1.761,803,2.63,817,2.129,850,1.386,864,1.615,902,1.501,932,2.315,936,1.337,938,2.263,958,2.074,999,3.781,1027,1.292,1028,2.827,1062,1.983,1072,3.078,1111,1.843,1117,1.397,1153,3.312,1219,1.506,1276,2.129,1481,1.983,1514,1.761,1562,1.615,1563,2.263,1609,2.074,1636,1.397,1825,2.249,1894,2.46,2040,2.641,2110,1.565,2130,1.737,2187,1.983,2208,4.425,2218,2.263,2272,2.263,2410,1.598,2487,2.191,2637,1.983,2667,1.814,2906,1.943,2984,2.191,3012,3.926,3324,2.191,3446,5.949,3448,2.606,3689,2.351,3702,2.026,3713,6.568,3714,2.827,3715,2.827,3716,5.056,3717,4.723,3718,4.723,3719,4.713,3720,4.109,3721,2.827,3722,4.109,3723,4.353,3724,2.827,3725,2.827,3726,2.827,3727,6.082,3728,4.723,3729,2.827,3730,5.291,3731,2.606,3732,2.46,3733,4.723,3734,2.46]],["t/769",[51,4.907,62,1.233,71,0.882,115,2.346,138,1.686,151,3.449,164,2.43,271,2.606,359,5.339,382,4.312,403,2.107,433,2.099,437,3.708,444,1.969,561,3.548,606,3.302,749,3.44,756,3.276,814,3.659,861,3.481,867,2.706,885,4.033,893,3.02,934,3.105,936,3.062,973,2.784,990,3.978,991,3.876,1036,3.276,1056,5.018,1152,2.833,1258,3.224,1271,4.092,1424,3.926,1436,2.922,1878,3.418,2046,4.549,2151,4.641,2277,3.978,3273,7.907,3446,4.876,3713,5.384,3716,5.384,3719,5.018,3720,5.634,3722,5.634,3723,5.968,3735,5.968,3736,5.968,3737,6.476]],["t/771",[62,1.531,71,1.095,164,2.806,271,3.236,291,2.952,359,6.165,382,4.802,422,2.59,444,2.445,561,4.405,749,3.472,893,3.749,936,3.801,991,4.812,1258,4.002,1271,5.08,1877,6.017,1878,4.243,2046,4.1,3273,7.981,3446,6.053,3713,6.683,3716,6.683,3719,7.981,3720,6.993,3722,6.993,3735,7.409,3736,7.409]],["t/773",[62,1.31,71,1.434,133,2.941,138,3.067,152,3.048,164,1.874,173,4.348,285,2.439,346,6.014,363,2.063,382,3.929,422,2.836,433,3.412,437,2.99,497,2.967,571,4.485,722,3.974,749,3.55,893,4.91,904,7.546,1127,3.374,1409,5.049,1541,4.068,1603,4.286,1877,4.02,1878,3.632,2771,5.721,3372,5.181,3446,7.928,3719,8.739,3738,8.754]],["t/775",[18,4.86,19,2.456,20,4.068,29,2.381,59,3.438,62,1.24,71,0.887,73,2.902,98,2.471,105,2.17,111,2.608,133,2.784,138,2.665,162,1.803,166,3.322,224,2.153,246,4.649,282,1.723,326,3.124,363,3.304,406,3.304,433,2.902,458,2.251,491,3.35,519,3.806,533,2.025,549,3.289,565,3.218,596,2.622,621,3.991,627,4.668,716,5.096,721,2.251,864,3.721,975,3.762,992,3.762,1002,2.692,1027,2.978,1053,3.469,1237,4.568,1243,4.394,1292,4.317,1604,4.568,1639,2.753,2149,4.149,3142,4.78,3739,5.667,3740,6.514,3741,6.514]],["t/778",[19,2.76,21,2.285,23,2.332,51,3.058,62,2.296,71,0.724,112,2.531,113,3.523,129,2.415,130,3.81,133,2.272,139,1.73,150,3.106,153,1.778,162,1.561,167,1.778,170,1.994,277,3.892,282,1.407,309,2.016,363,1.594,479,1.723,493,4.006,534,2.222,576,2.384,602,2.806,638,1.69,716,2.647,763,1.665,792,1.785,815,2.514,1095,3.359,1122,2.689,1376,4.003,1450,3.266,1571,2.326,1659,4.12,1662,8.438,1703,5.054,1806,3.465,1847,2.858,2235,1.988,2259,4.42,2266,3.311,2424,6.01,2613,2.942,2671,3.311,2973,5.702,3047,7.058,3051,3.728,3053,3.81,3054,3.465,3142,5.69,3739,7.965,3742,9.156,3743,9.156,3744,5.317,3745,3.901,3746,5.317,3747,5.317,3748,4.42,3749,4.625,3750,4.625,3751,5.317,3752,4.9,3753,4.9,3754,4.9,3755,5.317,3756,4.9,3757,4.9]],["t/780",[51,2.974,62,1.436,71,1.027,73,2.444,106,3.205,142,2.31,143,2.398,246,3.425,251,3.785,363,2.261,374,3.261,417,4.789,428,3.261,444,2.294,587,3.879,798,4.672,882,4.547,902,2.398,1421,4.176,1527,6.562,1648,4.838,1705,5.184,1782,4.262,1840,3.47,1848,6.038,2005,6.038,2014,5.679,2049,5.845,2235,2.821,2996,3.879,3052,4.633,3059,4.093,3102,6.038,3469,6.27,3758,7.543,3759,8.216,3760,6.951,3761,7.543]],["t/783",[39,2.788,107,4.485,132,4.889,271,4.968,284,3.144,309,3.666,327,4.255,382,4.878,383,6.093,523,2.258,619,4.255,670,5.35,717,4.365,719,3.602,792,3.245,824,3.996,1608,6.2,1829,3.497,1847,3.92,2047,6.778,2970,6.344,3762,5.651,3763,6.721,3764,6.721,3765,6.721,3766,8.035,3767,6.344]],["t/785",[23,2.001,67,3.701,71,1.42,107,2.624,110,2.458,125,2.574,146,3.087,223,3.597,246,5.315,250,3.503,271,2.719,272,2.259,363,2.752,395,4.644,403,2.197,426,2.822,431,2.887,534,2.822,584,4.043,607,3.777,619,4.041,647,2.92,771,3.665,850,3.311,865,4.476,980,4.117,1001,3.858,1003,4.149,1038,3.363,1075,3.901,1564,2.792,1593,7.416,1636,3.337,1879,3.389,1983,4.095,2030,5.234,2081,4.737,2361,6.438,2784,4.84,2879,5.615,3323,5.876,3768,9.074,3769,5.407,3770,6.225,3771,6.755,3772,6.755]],["t/787",[19,2.739,23,1.752,25,0.894,31,1.648,39,0.841,48,2.093,51,1.151,62,0.556,71,1.36,73,2.016,75,1.42,105,2.072,110,1.062,112,1.389,115,1.057,132,1.476,136,4.195,138,2.393,145,1.513,153,1.621,154,3.254,161,1.199,170,2.067,172,0.8,190,1.902,199,2.261,224,2.055,246,2.825,271,1.174,272,0.976,282,1.917,284,0.949,285,1.718,291,1.071,292,1.212,327,1.284,333,4.647,334,2.046,337,1.898,339,2.308,340,1.746,346,3.552,363,2.41,365,4.283,368,2.342,371,1.817,382,1.233,383,2.559,388,3.4,395,2.452,403,0.949,407,1.993,418,2.091,421,1.5,422,2.022,428,2.096,433,3.425,461,1.24,474,1.021,479,0.945,498,1.117,514,1.133,518,3.049,523,2.847,527,1.3,543,2.413,549,1.78,570,2.261,610,1.308,633,1.583,650,1.409,675,4.721,676,1.568,721,1.008,726,1.933,739,1.631,741,1.308,749,0.984,763,0.914,771,1.583,792,0.98,798,1.379,890,1.513,893,2.9,932,1.43,970,1.399,1015,1.769,1095,1.843,1122,1.476,1128,1.705,1248,2.978,1253,3.525,1255,2.336,1445,2.425,1446,2.538,1450,1.792,1458,1.666,1541,2.866,1569,2.425,1571,1.276,1626,1.843,1639,2.628,1642,2.382,1825,1.389,1854,2.425,1877,1.705,1878,1.54,1946,2.261,1947,2.689,1948,2.689,2046,4.1,2066,1.746,2069,1.901,2587,2.141,2707,2.425,2708,2.197,2751,5.732,2959,2.046,2978,1.843,3021,2.197,3047,2.046,3142,3.557,3469,2.425,3748,5.171,3760,2.689,3773,2.918,3774,2.918,3775,4.848,3776,2.918,3777,2.918,3778,4.848,3779,2.197,3780,2.918,3781,2.918,3782,2.918,3783,2.918,3784,7.994,3785,4.468,3786,2.689,3787,4.217,3788,2.689,3789,5.411,3790,2.689,3791,2.689,3792,2.689,3793,2.689]],["t/789",[246,4.722,363,3.116,437,3.343,527,4.633,1571,4.549,3794,10.397]],["t/791",[141,3.699,142,2.848,162,1.872,171,2.875,246,3.125,250,3.569,251,4.665,277,3.453,383,3.632,493,3.011,521,3.453,638,2.188,641,3.93,699,3.399,764,3.399,921,5.37,975,3.974,1703,4.485,1715,5.509,1847,3.699,2040,5.198,2248,5.181,2252,5.986,2259,5.721,2266,5.791,2973,6.558,3051,4.826,3053,4.931,3054,4.485,3142,5.049,3148,4.931,3281,5.986,3410,5.509,3411,4.826,3427,5.332,3436,5.509,3437,5.509,3748,5.721,3752,6.342,3753,6.342,3754,6.342,3756,6.342,3757,6.342,3795,6.882,3796,6.882,3797,6.342,3798,6.882,3799,6.882,3800,6.882,3801,6.882,3802,6.882,3803,6.882]],["t/793",[170,2.575,171,4.186,3804,10.018,3805,10.018,3806,10.018,3807,10.018,3808,10.018,3809,10.018,3810,10.018,3811,10.018]],["t/795",[142,3.155,170,2.648,171,4.303,3812,10.299,3813,10.299,3814,10.299,3815,10.299]],["t/798",[39,2.615,56,2.851,71,1.407,92,5.405,112,3.158,133,2.834,146,3.032,246,3.012,271,2.669,275,3.565,337,3.153,351,3.227,352,4.074,363,1.988,403,2.158,458,2.292,496,3.093,498,3.472,514,2.577,523,2.054,534,2.771,545,4.191,558,4.074,566,3.276,600,3.788,724,5.07,752,2.564,893,3.093,934,3.18,1252,3.114,1613,4.191,1782,3.747,1844,4.254,1879,3.328,2486,4.651,3259,5.514,3766,9.233,3769,9.31,3784,6.112,3816,6.112,3817,8.357,3818,6.632,3819,6.112,3820,6.112,3821,9.068,3822,5.77,3823,9.068]],["t/800",[71,0.753,105,3.119,110,2.013,112,2.633,136,3.73,138,2.078,142,1.694,143,1.758,161,2.274,170,1.422,246,3.625,263,3.159,272,3.131,282,1.463,340,5.605,346,7.15,363,2.392,389,4.251,390,4.104,395,4.037,498,2.118,578,2.82,625,3.445,758,5.789,803,2.391,902,1.758,904,3.964,1003,4.903,1450,3.398,1567,4.558,1592,4.598,1593,3.665,1642,2.118,2087,3.801,2978,3.495,3000,3.604,3208,10.018,3473,4.428,3824,5.856,3825,5.531,3826,7.981,3827,4.811,3828,3.801,3829,5.531,3830,4.598,3831,5.531,3832,9.364,3833,5.097,3834,5.531,3835,7.355,3836,5.531,3837,5.531,3838,5.531,3839,5.531,3840,6.635,3841,5.531,3842,5.531,3843,4.598,3844,5.531,3845,5.531,3846,5.531]],["t/802",[21,1.041,23,1.184,25,1.269,30,1.942,39,0.699,40,2.163,62,2.321,71,0.564,73,1.343,92,4.12,107,0.941,110,0.881,133,1.035,136,2.795,139,0.788,142,0.742,146,2.482,153,0.81,154,3.363,164,1.479,167,1.386,198,1.397,199,1.877,251,2.079,272,2.634,282,2.541,283,4.602,284,1.348,291,0.889,326,1.987,327,1.824,328,0.81,339,1.973,340,3.848,346,5.069,351,1.179,352,2.546,353,2.342,355,7.694,363,0.726,365,2.45,369,1.302,371,2.581,381,2.512,382,1.024,388,4.508,389,2.207,390,2.793,407,0.996,421,3.306,431,1.035,437,2.067,445,3.069,448,3.211,468,1.029,513,2.207,527,1.847,549,0.889,558,2.546,569,1.488,570,1.877,589,2.063,603,1.206,628,1.45,644,1.246,692,1.736,721,1.877,753,1.554,763,1.298,816,2.45,890,2.149,950,1.665,972,0.985,997,1.634,1003,2.546,1036,1.225,1073,1.939,1098,1.468,1148,3.318,1152,1.06,1176,1.369,1224,3.318,1225,2.97,1276,1.824,1361,1.45,1387,1.468,1389,1.327,1412,2.841,1436,1.87,1450,1.488,1458,3.672,1465,1.777,1565,5.903,1567,5.487,1570,4.714,1576,1.415,1594,7.013,1601,4.089,1602,3.605,1628,4.272,1629,1.824,1761,1.699,1781,1.777,1809,2.48,1825,2.586,1862,2.107,1992,1.736,2040,1.354,2077,1.877,2088,1.736,2464,2.342,2610,2.232,2748,3.605,2985,1.939,3047,1.699,3833,6.659,3847,3.605,3848,2.422,3849,2.422,3850,2.422,3851,1.554,3852,2.422,3853,2.422,3854,3.819,3855,2.232,3856,4.144,3857,4.144,3858,4.144,3859,4.144,3860,4.144,3861,4.144,3862,4.144,3863,4.144,3864,4.144,3865,4.144,3866,3.819,3867,2.422,3868,2.422,3869,2.422,3870,2.422,3871,2.422,3872,2.422,3873,2.422,3874,2.422,3875,2.422,3876,2.422]],["t/805",[164,2.929,246,3.908,282,2.845,284,3.498,363,2.58,422,2.95,533,3.646,1482,5.217,1642,4.117,1698,4.397,1699,8.94,3411,7.541,3877,7.931,3878,10.753,3879,10.753]],["t/807",[75,3.855,138,3.344,171,3.311,282,3.153,422,1.993,610,3.553,1255,6.343,1639,4.312,1642,3.034,3786,7.302,3787,8.877,3788,7.302,3789,9.819,3790,7.302,3791,7.302,3792,7.302,3880,7.923,3881,7.923,3882,7.923,3883,9.404,3884,7.923,3885,7.923,3886,7.302,3887,7.923,3888,7.302]],["t/809",[138,3.315,171,3.682,282,3.278,610,3.952,1639,3.724,1642,3.374,3787,7.666,3789,9.494,3883,8.122,3886,8.122,3888,8.122,3889,8.813,3890,8.813,3891,8.813,3892,8.813,3893,8.813,3894,8.813]],["t/812",[62,2.233,71,1.255,164,1.851,309,2.578,359,4.068,382,3.896,403,2.211,417,2.68,523,2.855,542,3.761,566,3.357,612,3.688,619,4.939,717,4.068,902,2.161,942,4.36,972,2.764,1015,4.12,1514,4.233,1541,5.451,1847,6.765,2190,5.117,2208,5.742,2306,5.65,2651,4.986,3895,6.796,3896,6.796,3897,6.796,3898,6.263,3899,9.22,3900,6.263,3901,9.22,3902,5.912,3903,6.796,3904,6.796,3905,6.796,3906,6.796,3907,6.796,3908,6.796,3909,6.796,3910,6.796]],["t/814",[98,3.369,271,4.414,309,3.369,337,2.711,523,2.751,576,3.984,670,6.518,717,5.317,719,4.389,824,4.868,902,2.824,1829,4.26,2047,8.713,2208,5.533,2970,7.728,3012,7.386,3762,6.884,3763,8.187,3764,8.187,3765,8.187]],["t/816",[23,1.148,30,1.883,39,1.519,48,1.371,51,3.951,71,1.049,87,2.544,105,1.754,112,2.507,115,1.908,116,2.109,125,2.007,142,1.613,153,1.761,224,1.74,246,2.391,277,2.642,339,2.507,363,2.729,374,3.937,375,2.318,382,3.254,406,2.486,422,1.324,436,2.779,437,2.477,451,2.804,462,4.08,468,3.273,507,3.619,514,2.046,517,2.507,523,1.631,533,1.637,542,2.914,545,3.327,558,3.235,615,3.693,638,1.674,650,2.544,716,2.621,743,3.077,749,3.07,763,1.649,766,3.077,798,2.49,802,4.797,803,2.277,851,3.378,952,3.965,1018,2.804,1023,3.28,1038,2.621,1091,6.141,1119,3.49,1122,2.664,1193,2.944,1209,2.755,1224,4.216,1252,2.472,1473,3.077,1558,2.407,1562,3.008,1605,2.914,1618,2.944,1633,2.685,1639,2.225,1642,2.949,1698,2.153,1741,3.192,1768,3.235,1878,2.779,1879,2.642,2040,2.944,2208,3.28,2361,3.693,2972,3.864,3439,3.864,3492,4.853,3824,5.651,3911,5.266,3912,4.216,3913,5.266,3914,5.266,3915,5.266,3916,4.853,3917,5.266,3918,2.975,3919,5.266,3920,5.266]],["t/819",[142,3.326,282,3.268,286,4.133,382,4.589,433,3.519,434,4.488,762,3.059,792,2.935,902,2.779,1642,4.865,1669,5.049,1699,7.268,3411,6.131,3437,6.999,3921,6.999]],["t/821",[71,1,107,2.852,138,1.911,197,2.29,246,3.334,282,1.942,326,3.52,340,4.394,359,4.394,390,3.775,422,1.846,435,5.527,902,2.334,904,5.261,1092,4.394,1152,3.212,1353,3.599,1567,4.193,1573,2.895,1639,3.102,1642,2.811,1982,5.527,2125,4.193,2339,4.063,2814,5.527,2973,4.572,2978,4.639,2981,5.148,3000,4.784,3016,4.865,3021,5.527,3473,5.877,3513,5.386,3828,5.045,3840,6.103,3922,6.103,3923,5.688,3924,5.877,3925,5.877,3926,6.765,3927,6.103,3928,5.527,3929,6.386,3930,5.261,3931,6.103,3932,6.765,3933,6.765,3934,7.341,3935,6.765,3936,6.765]],["t/823",[48,2.681,138,2.959,154,4.205,171,3.359,181,5.007,190,3.154,339,3.828,383,5.436,421,5.296,422,2.858,433,4.015,444,2.445,533,2.499,619,3.539,726,5.327,813,6.712,1541,6.089,1639,4.352,1642,3.944,1877,6.017,3937,6.436]],["t/825",[170,1.994,171,3.241,246,6.109,286,5.282,318,5.595,433,4.069,526,4.701,614,3.592,1642,3.853,1698,3.171,1850,6.01,2424,7.798,3739,8.755,3938,9.275]],["t/827",[19,2.127,61,2.773,62,1.477,66,3.478,71,1.521,110,2.822,138,2.019,172,2.127,224,2.563,271,3.121,285,2.749,286,3.667,309,3.817,363,2.325,368,3.746,371,6.268,458,2.68,493,3.393,523,2.402,762,2.714,764,3.831,781,5.139,975,4.479,1036,3.923,1053,4.13,1384,4.9,1421,3.277,1573,3.058,1688,4.479,1689,4.479,1776,6.182,2948,7.147,3262,6.447,3692,6.747,3939,7.756,3940,6.209,3941,6.747]],["t/829",[19,2.262,51,3.789,71,1.612,106,2.462,110,2.108,133,3.526,143,1.842,146,2.648,197,2.574,198,2.782,271,2.332,309,2.197,374,3.567,406,2.663,417,4.129,444,1.762,458,2.002,487,3.982,497,1.849,569,2.08,641,3.309,721,2.851,763,2.584,818,2.535,873,4.878,953,4.638,1018,4.394,1128,3.385,1145,3.608,1368,4.063,1390,3.174,1449,5.339,1505,5.04,1573,3.254,1642,2.218,1643,3.114,1776,5.068,1840,2.666,1847,3.114,1877,3.385,1940,4.435,2086,5.139,2268,4.25,2505,5.04,2617,2.884,2996,2.979,3038,4.638,3041,5.04,3054,3.775,3104,7.446,3759,7.989,3918,3.273,3942,6.859,3943,8.251,3944,8.251,3945,5.339,3946,5.339,3947,5.339]],["t/831",[19,2.604,23,2.07,29,3.472,48,1.849,51,2.801,66,3.185,138,1.849,153,3.177,166,3.623,271,3.823,339,3.382,363,2.129,374,3.071,433,3.078,479,2.302,569,3.843,603,3.536,633,3.855,638,2.258,741,3.185,749,2.395,752,3.672,893,3.313,975,5.486,1002,2.936,1053,3.783,1122,3.593,1297,4.882,1308,4.014,1618,3.972,1642,3.637,1657,4.791,1686,4.791,1732,3.623,1776,4.364,2073,4.791,3513,6.969,3940,7.604,3948,7.897,3949,5.906,3950,6.547]],["t/834",[19,2.587,23,0.869,25,1.221,30,2.23,31,2.252,35,1.925,40,1.588,48,1.038,51,2.46,56,3.736,71,1.046,107,2.423,110,1.451,142,1.221,146,2.851,154,2.085,172,1.093,271,3.797,272,2.086,277,4.361,288,1.657,309,4.315,313,1.885,335,4.001,339,1.898,346,3.562,374,1.724,403,1.297,418,2.857,431,1.704,433,2.021,437,1.282,461,1.694,464,5.071,479,1.292,487,4.287,518,1.954,519,2.329,523,1.235,543,3.825,549,1.464,569,1.431,604,1.799,610,1.787,638,2.443,663,1.925,721,1.377,722,2.302,762,2.183,764,1.969,771,3.385,781,2.642,792,1.338,816,3.688,932,4.625,1018,3.322,1078,2.449,1152,1.744,1275,2.277,1282,2.557,1306,3.831,1368,2.795,1384,2.519,1411,3.674,1463,3.468,1469,3.644,1505,7.561,1559,1.604,1611,3.089,1693,2.797,1698,1.63,1703,2.598,1731,2.252,1751,2.925,1776,5.795,1782,2.252,1790,2.557,1854,3.314,1878,2.104,1879,2,2080,3.089,2202,2.598,2625,4.993,2637,2.795,2975,5.492,3038,6.151,3257,3.468,3324,3.089,3596,3.314,3937,3.191,3945,3.674,3946,3.674,3947,9.219,3948,3.314,3951,6.237,3952,3.986,3953,3.986,3954,3.986,3955,3.314,3956,3.314,3957,3.986,3958,3.986,3959,3.674,3960,3.674]],["t/836",[25,1.127,40,1.466,46,2.101,48,2.823,49,4.106,51,1.451,53,2.398,56,2.517,62,0.701,71,1.316,96,1.288,129,1.671,138,1.524,142,1.794,146,1.682,152,1.629,154,1.925,271,3.346,272,1.958,277,2.938,278,4.196,279,6.606,282,0.973,285,1.304,291,1.351,292,1.529,309,3.845,313,1.739,318,2.609,339,2.788,346,3.344,353,2.079,375,1.62,417,1.451,431,1.572,433,1.192,444,1.119,464,1.978,474,1.288,497,1.174,501,2.892,533,1.82,546,2.577,569,2.103,610,3.27,675,3.816,676,1.978,722,2.125,771,3.957,780,2.325,798,4.291,815,1.739,851,2.36,882,3.355,890,1.908,902,1.17,932,1.804,1037,2.125,1176,2.079,1282,2.36,1384,2.325,1390,3.996,1469,2.15,1611,2.851,1642,2.242,1693,1.65,1698,1.504,1776,5.107,1782,3.308,1840,1.693,1842,2.016,1847,3.147,1879,2.938,2046,1.876,2149,1.704,2186,2.699,2202,3.816,2400,2.202,2502,3.059,2573,2.851,2621,4.868,2625,4.687,2671,2.292,2967,8.036,2975,2.325,2997,2.016,3001,2.637,3038,4.687,3273,2.851,3324,2.851,3376,2.945,3596,3.059,3759,7.545,3793,5.396,3941,3.201,3948,6.063,3959,3.391,3960,3.391,3961,3.679,3962,3.391,3963,3.679,3964,6.344,3965,3.679,3966,3.201,3967,9.075,3968,3.679,3969,3.679,3970,5.094,3971,3.679,3972,5.094,3973,3.679,3974,2.398,3975,3.059]],["t/839",[19,2.842,39,2.626,56,2.868,71,1.24,92,5.422,112,3.177,133,2.852,146,3.05,271,2.686,275,3.587,279,4.348,309,2.531,337,3.163,351,3.247,352,4.099,403,2.171,496,3.111,498,2.555,514,2.592,534,2.788,545,4.216,558,4.099,566,3.296,600,3.811,724,5.091,752,2.58,893,3.111,934,3.2,1252,3.133,1613,4.216,1776,5.593,1782,3.77,1844,4.28,1879,3.348,2486,4.679,3259,5.547,3766,9.257,3769,8.914,3816,6.149,3817,8.391,3819,6.149,3820,6.149,3822,5.805,3976,10.365,3977,9.105]],["t/841",[73,3.393,105,3.832,110,2.108,112,2.758,136,3.907,138,1.508,167,1.937,170,1.489,282,2.183,340,4.938,346,7.217,389,4.394,498,2.218,578,2.954,625,3.608,758,6.304,902,1.842,904,4.152,1628,3.425,1642,2.218,2978,3.661,3473,4.638,3513,6.053,3824,6.053,3827,5.04,3828,3.982,3830,4.816,3843,4.816,3924,4.638,3936,7.604,3978,5.793,3979,11.838,3980,9.61,3981,5.793,3982,5.793,3983,11.838,3984,5.793,3985,5.793,3986,5.793,3987,5.793,3988,5.793,3989,5.793,3990,5.793,3991,5.793,3992,8.251]],["t/843",[19,2.127,62,1.477,71,1.056,105,2.583,154,4.057,164,2.113,167,3.736,224,3.692,271,4.051,272,2.594,282,3.241,283,4.531,309,2.941,353,4.382,357,5.69,359,6.024,431,4.301,479,2.513,638,2.466,719,3.831,758,4.13,763,2.429,1571,3.393,1685,6.447,1776,4.764,1847,4.169,2040,4.336,2046,3.955,2909,5.054,2912,6.209,3993,7.147]],["t/845",[71,1.19,132,4.422,153,2.924,274,6.42,282,2.313,285,3.099,359,5.233,363,2.621,422,3.107,638,4.117,763,2.738,1636,4.319,1969,5.697,3044,7.605,3993,8.057,3994,10.008]],["t/847",[112,4.264,115,3.245,143,2.847,161,3.682,199,6.94,309,3.397,363,2.685,433,2.902,436,4.727,437,2.88,543,4.459,549,3.289,650,4.326,719,4.424,803,3.872,992,5.173,1053,4.77,1446,7.791,1642,3.429,1698,3.662,3262,7.446,3995,8.956,3996,8.254]],["t/850",[19,1.968,23,0.522,35,1.157,48,1.402,51,4.797,56,1.03,62,1.215,71,1.066,98,0.909,110,0.872,115,3.033,120,1.452,142,0.734,145,2.129,146,4.216,151,1.276,152,3.179,164,1.467,170,2.152,171,1.001,190,0.94,203,1.804,223,3.399,224,0.792,250,2.129,272,2.134,279,3.51,282,0.634,288,1.706,292,0.996,309,0.909,343,1.918,353,1.354,363,2.347,378,1.265,403,1.336,417,0.945,426,1.001,428,2.759,433,1.33,437,2.308,458,0.828,464,2.895,474,1.437,479,0.776,487,1.647,493,4.185,502,3.281,514,0.931,523,1.271,531,1.434,533,0.745,598,1.434,617,1.647,619,1.807,641,3.077,647,1.036,699,2.661,721,0.828,752,0.926,758,2.186,763,0.75,792,1.378,796,3.489,853,1.265,861,2.895,869,1.276,902,0.762,921,1.384,932,2.013,978,1.514,996,1.992,1018,2.186,1027,1.095,1066,2.879,1078,1.472,1127,2.641,1186,1.857,1217,1.647,1288,1.472,1313,1.3,1358,1.992,1371,1.857,1387,1.452,1459,1.918,1524,1.992,1541,1.417,1562,1.368,1603,2.557,1608,1.537,1648,2.633,1776,3.309,1782,3.043,1879,2.06,1995,2.721,2001,1.804,2005,3.287,2017,1.992,2028,1.68,2069,1.561,2132,1.918,2140,4.478,2252,2.084,2264,3.287,2306,1.992,2608,1.857,2703,1.918,2862,2.345,2981,2.879,3018,1.588,3038,1.918,3041,4.686,3141,1.492,3234,1.804,3257,3.571,3259,1.992,3269,1.918,3281,2.084,3300,2.084,3462,3.571,3466,2.084,3699,1.68,3769,1.918,3797,2.208,3898,2.208,3928,1.804,3940,1.918,3997,4.106,3998,2.396,3999,2.396,4000,4.106,4001,2.396,4002,2.396,4003,2.396,4004,8.831,4005,4.106,4006,4.106,4007,4.106,4008,2.396,4009,2.396,4010,2.396,4011,4.106,4012,7.83,4013,2.396,4014,2.396,4015,2.396,4016,2.396,4017,6.382,4018,2.396,4019,2.396,4020,2.396,4021,2.396,4022,2.396,4023,2.396,4024,2.396,4025,2.396,4026,2.208,4027,2.396,4028,4.106,4029,4.106,4030,4.106,4031,2.396,4032,4.106,4033,4.106,4034,2.396,4035,2.396,4036,2.396,4037,2.396,4038,2.396,4039,2.396,4040,2.396,4041,2.396,4042,2.396,4043,2.396,4044,2.396,4045,2.396,4046,2.396,4047,2.396,4048,2.396,4049,4.106,4050,2.396,4051,2.396,4052,2.396,4053,2.396,4054,2.396,4055,2.396]],["t/852",[19,2.466,48,1.106,49,5.61,56,1.826,71,1.323,76,2.646,105,1.415,129,1.929,151,2.262,166,2.166,172,1.165,223,2.262,271,4.133,275,2.284,277,2.132,278,3.044,279,5.861,313,4.854,362,2.646,395,2.149,406,1.371,417,1.675,426,3.343,432,2.454,434,1.756,437,1.366,444,1.292,458,2.264,474,2.293,492,2.454,498,2.509,514,1.65,515,1.659,523,1.316,533,3.021,546,3.522,627,3.044,638,1.351,719,2.099,791,8.896,792,1.426,793,2.769,803,3.889,902,1.351,946,2.725,1044,2.262,1127,3.213,1171,3.044,1218,2.646,1230,2.512,1258,2.115,1305,2.815,1313,2.305,1417,4.343,1474,8.453,1540,2.769,1644,6.969,1688,2.454,1689,2.454,1693,4.357,1732,2.166,1776,5.525,1831,2.512,1877,2.482,1940,3.523,1999,3.696,2024,3.117,2174,4.696,2324,3.044,2388,3.696,2469,3.696,2617,2.115,2726,4.934,2832,3.117,2972,3.117,2984,7.53,3066,3.696,3970,5.701,3972,3.696,4056,3.401,4057,4.248,4058,4.248,4059,4.248,4060,2.865,4061,6.651,4062,4.248,4063,4.248,4064,4.248,4065,4.248,4066,3.915,4067,3.199]],["t/854",[19,2.538,71,1.261,271,3.726,309,3.511,491,4.761,498,3.545,638,2.943,1638,3.98,1693,4.151,1776,5.687,2066,5.541,2208,5.766,2272,7.411,2906,6.363,2967,9.351,4068,7.697,4069,9.258,4070,8.532]],["t/856",[19,2.627,30,2.06,35,2.784,56,2.477,62,1.097,66,2.584,71,1.305,164,1.57,168,2.145,170,1.481,172,1.58,271,4.205,272,1.927,277,2.892,285,3.396,309,2.186,326,2.763,337,1.759,339,2.744,384,4.613,433,1.867,439,4.041,445,3.256,493,2.521,521,2.892,529,5.665,566,2.847,610,4.296,612,4.46,614,2.669,633,3.127,650,2.784,675,3.756,703,3.961,738,4.466,749,1.943,778,5.013,902,1.832,936,3.886,966,3.686,1036,2.915,1141,5.886,1152,2.521,1403,4.791,1436,2.6,1576,3.367,1776,5.886,1879,2.892,2046,2.939,2072,3.819,2086,3.589,2213,3.589,2874,4.228,2975,3.641,3941,7.151,3970,5.013,3972,5.013,4071,5.311,4072,5.763,4073,5.763,4074,5.763,4075,5.763,4076,5.763,4077,5.763,4078,5.763,4079,5.763,4080,5.763,4081,5.311,4082,5.763,4083,5.013]],["t/858",[23,1.445,107,2.577,151,3.532,172,1.819,271,2.669,277,4.55,285,3.214,291,2.435,335,4.254,337,2.024,363,2.718,422,2.28,433,2.938,461,2.818,468,3.853,612,5.607,638,3.697,677,5.309,749,3.744,752,3.506,763,2.84,792,2.227,1036,4.586,1070,8.006,1176,6.275,1263,3.67,1467,7.245,1470,4.829,1571,2.902,1703,5.909,2084,6.311,3376,5.309,3689,7.538,4084,6.632]],["t/860",[23,1.297,25,1.41,30,1.646,46,2.63,48,1.199,51,2.748,59,1.448,62,0.522,71,1.499,96,0.96,115,0.994,117,1.422,123,2.756,125,1.755,136,1.85,143,0.872,146,1.254,150,3.476,151,3.169,164,2.116,166,1.399,167,0.917,168,1.021,170,1.184,172,1.262,224,1.521,250,2.388,271,3.774,277,3.497,284,1.498,291,2.852,298,1.885,309,2.946,335,1.759,337,1.405,346,1.567,349,1.399,353,2.601,363,1.784,374,1.186,413,2.28,417,1.082,431,2.543,436,2.43,437,1.913,444,0.834,447,2.386,458,0.948,459,1.622,464,2.475,468,1.956,474,0.96,497,0.875,518,2.917,523,0.849,527,1.222,533,0.853,549,1.007,569,0.985,578,1.399,602,2.43,606,2.348,612,1.488,619,1.207,625,6.274,633,1.488,638,1.892,650,1.325,721,0.948,749,2.349,752,1.06,763,0.859,764,2.274,765,2.196,769,1.966,792,0.921,798,4.61,800,2.756,804,3.378,813,1.787,818,1.2,850,1.345,882,1.262,885,1.708,893,1.279,902,1.464,955,1.159,1012,3.01,1015,1.663,1018,2.452,1036,1.387,1070,3.568,1075,1.584,1119,1.818,1127,1.345,1152,2.014,1177,1.923,1276,2.065,1390,1.503,1424,2.791,1467,1.923,1469,1.602,1478,1.923,1558,1.254,1571,1.2,1605,1.518,1609,3.378,1627,2.125,1642,1.05,1693,1.23,1698,1.121,1703,3.878,1731,2.601,1754,2.28,1842,1.503,1847,2.475,1877,2.69,1891,1.787,2046,1.399,2066,1.642,2086,1.708,2186,2.012,2266,1.708,2347,1.759,2361,3.229,2400,5.613,2410,1.55,2533,2.065,2605,2.065,2671,1.708,2967,5.794,3039,5.176,3148,1.966,3324,2.125,3376,2.196,3451,2.528,3759,8.107,3900,2.528,3962,4.243,4085,2.743,4086,2.743,4087,2.743,4088,5.95,4089,2.743,4090,2.528,4091,2.743,4092,2.743,4093,2.743,4094,8.409,4095,2.386,4096,2.743,4097,4.243,4098,2.743,4099,2.743,4100,4.604,4101,2.743,4102,2.743,4103,2.743,4104,2.28,4105,3.686,4106,2.528]],["t/863",[51,3.778,62,1.824,75,4.662,96,3.353,138,2.494,164,2.61,168,3.566,224,3.166,282,2.535,339,4.562,433,3.105,514,3.722,647,4.142,1639,4.048,1642,3.669]],["t/865",[30,2.853,71,1.542,172,2.188,272,2.669,274,4.718,291,2.93,309,3.888,326,3.827,422,2.578,458,2.758,607,4.462,611,3.556,612,4.331,619,3.513,749,4.265,771,4.331,1066,5.597,1152,3.492,1304,5.485,1514,4.971,1605,4.417,1761,5.597,1877,4.663,1878,4.212,3372,8.999,3766,6.635]],["t/867",[271,4.069,278,7.245,279,6.588,280,7.726,297,6.819,312,9.317,676,5.434,4107,10.11]],["t/869",[23,1.11,25,1.561,45,3.658,48,1.326,62,0.97,71,1.024,110,3.251,125,1.942,129,2.314,153,2.514,170,2.296,224,2.484,272,2.987,285,4.36,363,1.527,368,3.631,422,1.281,426,2.129,431,2.177,434,2.106,437,3.956,519,2.977,534,3.141,595,3.554,597,6.264,599,2.739,602,2.689,612,2.765,633,4.847,675,3.32,676,4.802,739,2.849,749,1.718,763,1.596,771,5.707,893,2.376,902,2.39,993,3.05,1027,2.329,1078,3.13,1219,4.003,1648,3.268,2069,3.32,2078,3.651,2361,3.573,2771,4.236,2912,4.079,3325,3.502,3326,4.696,3334,4.696,3372,3.836,3380,4.079,3381,6.018,3383,8.232,3387,6.249,3442,4.696,3748,7.426,4108,5.095,4109,5.095,4110,5.095,4111,5.095,4112,5.095,4113,5.095,4114,7.517]],["t/871",[92,3.031,115,4.461,132,2.93,133,2.476,138,1.508,272,1.937,285,2.924,363,3.691,433,2.674,434,3.41,437,2.653,490,3.512,533,1.801,576,2.598,595,5.721,600,4.712,603,2.884,676,3.114,721,2.002,893,2.701,948,3.206,1027,2.648,1037,3.346,1209,3.031,1252,2.72,1642,4.838,2046,4.9,2213,3.608,2651,4.25,2997,3.174,3178,5.339,3877,5.339,4026,5.339,4115,4.638,4116,4.638,4117,5.339,4118,5.793,4119,5.793,4120,5.793,4121,9.61,4122,5.793,4123,5.793,4124,5.793,4125,5.793,4126,5.793,4127,5.793,4128,5.04,4129,5.339]],["t/873",[111,2.435,115,4.439,133,2.599,138,2.935,251,3.052,282,2.611,340,5.111,352,3.736,363,3.208,379,4.18,390,3.127,433,3.787,437,1.956,444,1.849,497,1.941,502,3.903,507,4.18,565,3.004,612,3.3,780,3.843,803,2.63,867,4.471,1027,2.78,1424,3.687,1436,3.853,1571,2.661,1618,3.4,1628,3.596,1642,4.691,1669,4.932,1840,2.798,1842,3.332,1960,5.565,2046,4.355,3204,9.376,3924,4.869]],["t/875",[39,2.863,40,3.955,129,4.508,138,2.584,282,3.103,433,3.217,444,3.019,1023,6.183,1639,4.195,2137,7.474]],["t/877",[71,1.163,115,3.877,116,3.419,138,2.786,224,2.822,363,3.208,422,2.147,433,3.787,518,4.186,815,4.037,867,3.568,934,4.095,1023,7.279,1636,4.218,1669,7.076,3314,7.099,3922,7.099,4130,8.292]],["t/879",[115,4.342,116,4.124,363,3.592,1960,7.81]],["t/881",[115,4.342,116,4.124,363,3.592,2814,9.023]],["t/883",[115,4.342,116,4.124,363,3.592,3927,9.963]],["t/885",[115,4.342,116,4.124,363,3.592,2978,7.572]],["t/887",[115,4.342,116,4.124,363,3.592,3021,9.023]],["t/889",[23,2.125,39,2.812,40,3.884,62,1.857,75,4.745,129,4.428,138,2.539,282,2.579,339,4.643,433,3.16,1023,6.073,1669,5.632,2137,7.342]],["t/891",[115,4.226,116,3.939,363,3.497,433,3.188,867,4.111,1628,5.816,3513,9.436]],["t/893",[115,4.342,116,4.124,363,3.592,3000,7.81]],["t/895",[115,4.342,116,4.124,363,3.592,3828,8.237]],["t/898",[115,4.342,116,4.124,363,3.592,3928,9.023]],["t/900",[21,4.287,51,3.933,62,2.113,71,1.041,115,3.613,116,3.062,137,3.868,138,1.991,164,2.716,363,2.989,433,3.596,497,2.44,756,3.868,934,3.667,936,3.616,986,4.521,1252,3.591,1995,8.288,2418,7.508,2973,4.763,2981,5.363,3034,8.291,3213,8.675,3928,5.758,4131,9.973,4132,7.648]],["t/902",[39,2.916,40,4.027,129,4.591,138,2.632,282,3.136,433,3.276,1023,6.297,2137,7.612]],["t/904",[115,3.876,270,7.668,363,3.207]],["t/906",[115,4.342,116,4.124,363,3.592,390,6.163]],["t/908",[115,4.342,116,4.124,363,3.592,3016,7.942]],["t/910",[115,4.342,116,4.124,363,3.592,1353,5.875]],["t/912",[115,4.342,116,4.124,363,3.592,1379,8.793]],["t/914",[115,4.342,116,4.124,363,3.592,2339,6.632]],["t/916",[115,4.342,116,4.124,363,3.592,2981,8.404]],["t/918",[115,4.342,116,4.124,363,3.592,2973,7.464]],["t/920",[115,4.342,116,4.124,363,3.592,1982,9.023]],["t/922",[115,4.342,116,4.124,340,7.173,363,3.592]],["t/926",[66,3.889,107,3.37,143,2.757,272,2.901,288,4.891,337,2.647,361,4.85,382,3.665,518,4.252,539,5.961,602,4.578,619,3.818,721,2.997,749,3.968,752,4.178,764,4.285,805,3.707,869,4.619,890,4.498,1091,5.85,1608,5.564,2447,6.082]],["t/928",[164,2.633,288,4.016,337,2.95,363,3.46,382,4.084,749,3.892,1091,6.519,2147,7.19,4133,8.907,4134,9.665,4135,9.665]],["t/930",[164,2.633,288,4.016,337,2.95,363,3.46,382,4.084,749,3.892,1091,6.519,1877,6.744,4133,8.907,4136,9.665,4137,9.665]],["t/933",[61,1.711,62,2.656,71,0.651,115,1.733,167,1.6,224,1.581,340,2.864,363,1.434,435,3.602,650,2.311,780,3.023,867,3.596,980,2.145,1023,2.98,1353,2.346,1450,2.939,1669,7.489,1709,2.46,1918,2.829,2049,3.707,2146,3.118,2339,2.648,2453,3.023,3016,3.171,3148,3.429,3344,3.83,3828,3.288,3923,3.707,3929,4.162,3930,3.429,3931,3.978,4138,4.785,4139,4.409,4140,6.611,4141,4.785,4142,4.785,4143,4.409]],["t/936",[39,3.405,71,1.271,96,2.423,105,3.519,123,4.145,143,2.201,284,2.253,327,3.048,382,2.926,458,2.393,491,3.561,492,3.999,543,3.447,562,3.832,633,5.067,644,3.561,653,3.913,721,2.393,805,3.99,857,4.759,860,4.145,978,4.375,1127,3.395,1152,3.03,1195,7.03,1232,4.856,1292,4.589,1313,3.758,1642,3.575,1738,3.421,1775,5.757,1809,4.145,1825,3.297,1983,4.198,2185,4.513,3411,4.856,3921,5.544,4144,6.925,4145,8.605,4146,6.925,4147,6.925,4148,6.925,4149,6.925,4150,6.925,4151,6.925,4152,6.925,4153,6.925]],["t/938",[71,0.931,96,3.24,107,2.657,132,3.459,152,3.029,167,2.287,197,2.134,284,3.012,286,4.377,309,2.594,338,5.685,441,4.796,461,2.906,495,4.146,517,3.256,533,2.126,544,4.901,699,3.378,716,5.225,721,2.363,762,3.673,786,6.493,792,2.296,795,4.387,800,4.093,805,2.923,966,3.066,971,4.146,972,2.781,978,4.321,1010,3.676,1080,3.609,1083,4.321,1195,5.149,1313,3.711,1638,2.94,1642,3.545,1761,4.796,1959,5.299,2110,3.785,2122,3.577,2703,5.475,4067,5.149,4145,6.302,4154,6.839,4155,6.839,4156,6.302,4157,6.839,4158,6.839,4159,6.839,4160,5.949,4161,6.839]],["t/941",[23,1.1,51,1.991,53,3.29,62,2.527,71,0.687,107,1.961,125,1.924,167,2.497,186,4.917,190,1.981,197,2.772,224,1.668,284,2.429,326,2.421,327,3.286,374,3.228,407,4.035,437,1.623,464,2.714,533,2.762,534,3.12,719,2.494,749,1.702,763,1.581,817,5.621,902,2.374,966,3.348,1028,3.021,1034,3.405,1044,3.976,1185,3.704,1288,5.458,1357,3.54,1642,4.701,1782,2.852,1937,3.405,2072,3.345,2130,3.101,2211,4.041,2487,3.912,2653,6.207,2709,4.041,2734,5.621,2862,4.264,2997,5.741,3300,4.392,4162,7.466,4163,4.197,4164,5.048,4165,5.048,4166,4.392,4167,5.048,4168,4.197,4169,7.466,4170,5.048,4171,4.652,4172,3.912]],["t/943",[62,2.257,186,6.561,1642,4.539,4173,10.11,4174,8.795,4175,10.11]],["t/945",[61,2.715,62,2.233,71,1.034,164,3.013,451,4.045,459,4.49,461,3.227,549,2.789,644,3.905,781,5.033,966,3.406,1083,6.273,1277,5.123,1314,4.49,1337,6.999,1642,4.491,1891,4.949,2997,6.427,4176,9.928,4177,9.928,4178,9.621,4179,8.253,4180,7.595,4181,6.607,4182,9.928,4183,5.572,4184,6.607]],["t/947",[125,2.196,164,2.846,170,2.463,284,1.875,292,2.395,376,8.842,426,3.435,458,1.991,474,2.017,497,1.839,502,4.38,514,2.239,602,3.042,603,2.869,663,3.97,685,4.613,749,1.943,795,3.697,882,3.782,970,2.763,994,3.887,1098,4.983,1103,4.041,1142,4.613,1170,3.641,1252,2.706,1642,4.526,1891,6.244,2147,5.968,2653,4.791,2997,6.835,4179,7.966,4185,10.981,4186,5.311,4187,5.763,4188,4.613,4189,8.559,4190,5.763,4191,5.311,4192,6.58]],["t/950",[62,2.544,167,3.176,1034,6.406,3966,8.263,4070,10.528,4095,8.263,4193,9.498,4194,5.916,4195,8.753]],["t/952",[62,2.27,339,4.858,4194,6.355,4196,10.204,4197,9.403,4198,10.204,4199,8.483]],["t/954",[62,1.692,71,1.21,143,2.824,170,2.284,190,3.486,580,5.794,717,5.317,723,5.317,792,2.983,992,5.131,1395,6.106,1410,3.712,1436,4.009,1458,5.074,2410,5.02,3010,5.699,3974,5.79,4194,5.533,4199,7.386,4200,8.884,4201,8.884]],["t/956",[62,1.925,461,4.296,464,5.434,580,4.714,781,6.699,3937,8.093,4194,6.297,4199,8.405,4202,10.11]],["t/958",[62,2.324,461,4.002,464,5.062,580,5.299,781,6.24,3937,7.538,4194,7.078,4199,10.148,4203,9.417,4204,9.417,4205,9.417]],["t/960",[25,2.643,40,1.914,62,1.954,71,0.98,121,4.429,143,1.528,152,3.187,164,1.96,167,2.407,188,1.309,190,2.824,271,1.934,291,1.764,309,3.273,346,4.111,354,3.611,444,1.461,461,2.042,464,6.003,474,1.682,523,2.229,549,1.764,663,2.321,780,3.036,781,3.184,792,2.417,803,3.112,873,2.841,893,2.241,902,1.528,924,8.927,934,2.304,1036,2.431,1121,6.244,1248,2.952,1313,2.608,1412,2.514,1421,4.962,1436,2.168,1559,1.934,1693,2.155,1732,2.451,1902,3.082,2024,5.281,2028,3.37,2045,2.559,2155,5.419,2637,3.37,2938,3.847,3937,3.847,4197,9.457,4206,4.806,4207,10.262,4208,4.806,4209,10.583,4210,4.806,4211,8.629,4212,10.771,4213,4.806,4214,4.806,4215,4.18,4216,4.429,4217,4.806,4218,4.806,4219,3.618,4220,4.806]],["t/963",[62,1.999,566,5.185,1642,4.019,2997,5.751,4192,8.402]],["t/965",[62,2.099,143,2.847,369,4.814,464,4.814,1159,6.94,1642,4.221,1974,6.041,2361,6.281,2639,6.04,2997,6.04,4192,7.17,4221,8.956,4222,8.956,4223,8.956,4224,8.956,4225,8.956,4226,8.956,4227,8.956,4228,8.956]],["t/971",[62,2.418,606,4.13,786,5.679,851,5.195,972,4.209,1371,6.275,1638,3.481,1642,4.755,2003,5.942,2012,5.803,2218,6.483,2726,7.791,2997,6.249,4189,6.275,4192,9.129,4229,8.099,4230,8.099,4231,8.099,4232,7.045,4233,9.537]],["t/973",[62,2.342,851,6.146,972,3.897,1642,4.709,2003,7.029,2726,8.646,2997,5.25,4192,7.67,4233,10.583]],["t/975",[62,2.257,71,1.2,164,3.229,781,5.84,1277,5.944,1642,4.744,1891,7.112,2997,6.789,4179,9.073,4181,7.666,4234,7.666,4235,8.813,4236,7.666]],["t/979",[62,2.164,71,1.282,133,4.024,292,3.913,461,4.002,550,7.538,669,7.538,741,4.222,1562,5.378,1642,4.352,4183,8.338,4237,9.886,4238,8.678]],["t/981",[62,1.999,1642,4.019,3453,7.522,4183,7.701,4239,8.726]],["t/983",[56,3.882,62,2.11,143,2.871,543,4.495,549,3.316,1613,5.706,1638,3.882,1642,4.242,4178,10.87,4183,8.793,4184,9.637,4239,9.21,4240,8.322]],["t/985",[40,2.308,62,2.107,186,3.206,326,2.778,339,4.575,376,4.638,377,5.74,397,3.239,451,4.394,459,3.425,474,2.027,514,2.251,566,4.076,603,2.884,622,3.775,663,2.798,717,3.467,751,3.085,807,5.04,893,2.701,934,2.778,1028,3.467,1117,2.862,1129,3.608,1153,4.063,1206,4.152,1229,6.859,1231,2.954,1288,3.559,1290,5.825,1313,3.144,1351,4.816,1439,3.716,1458,5.489,1468,5.04,1613,3.661,1642,2.218,1974,3.907,2107,4.25,2122,3.031,2211,4.638,2470,7.178,2997,5.265,3204,4.362,3455,5.339,3902,5.04,4178,5.04,4183,7.683,4184,5.04,4237,7.178,4238,5.339,4239,4.816,4241,9.61,4242,5.793,4243,5.793,4244,5.793,4245,5.793,4246,4.638,4247,5.339,4248,8.251,4249,5.04,4250,5.793,4251,5.793]],["t/987",[56,3.728,62,1.652,87,4.189,143,2.757,151,4.619,543,4.318,549,3.185,662,5.128,966,3.889,1366,5.402,1642,4.507,2184,8.984,2637,6.082,3453,7.744,4183,7.928,4239,8.984,4240,7.993,4252,10.806,4253,7.545,4254,8.674]],["t/989",[30,3.151,39,2.542,143,2.802,403,2.867,407,3.623,461,3.745,523,2.729,662,5.21,934,4.226,978,5.568,1089,4.422,1146,6.057,1288,6.704,1417,5.84,1512,5.21,1574,3.952,2020,6.635,2110,4.877,3022,8.122,4156,8.122,4189,6.829,4255,7.326,4256,6.18,4257,8.813]],["t/991",[62,1.98,407,4.274,1288,6.387,1642,3.981,2997,5.697,4163,8.643]],["t/993",[62,1.98,587,5.346,1642,3.981,2997,5.697,4189,8.056,4237,9.044]],["t/995",[62,1.98,966,4.662,1288,6.387,1642,3.981,2997,5.697,4258,10.397]],["t/997",[48,2.608,62,1.908,1288,6.154,1642,3.836,2997,5.489,3222,8.715,3224,8.715,4259,8.715,4260,6.757,4261,10.018]],["t/999",[62,2.314,153,2.791,170,2.145,186,4.618,444,2.538,481,4.221,549,3.064,783,6.283,788,8.443,803,4.56,986,4.933,1153,5.851,1253,5.627,1288,6.479,1291,6.466,1642,4.038,2339,4.618,2997,5.779,3024,6.937,3204,6.283,4259,7.259,4262,8.344]],["t/1001",[62,1.589,75,4.06,142,2.556,143,2.653,164,2.273,328,2.791,461,3.546,647,3.608,699,4.122,724,4.665,781,5.529,786,7.396,803,3.608,921,4.819,1288,7.104,1371,6.466,1638,3.587,1642,3.195,1891,5.438,2066,6.922,2997,4.572,4259,9.175,4263,8.344,4264,8.344,4265,8.344,4266,8.344]],["t/1003",[62,1.531,96,2.813,143,2.556,151,4.281,164,2.806,284,3.351,403,3.351,479,3.338,741,3.605,955,3.397,1211,5.239,1288,4.938,1314,4.753,1448,4.938,1642,3.944,1790,5.157,1825,3.828,2514,5.898,2536,6.053,2997,4.405,3222,8.96,3224,8.96,4183,7.557,4249,6.993,4267,7.409,4268,8.039,4269,8.039,4270,7.409,4271,7.409]],["t/1005",[48,3,62,2.194,142,3.53,426,4.815,587,5.926,1642,4.412,2613,4.583,2997,6.314,4189,8.93,4194,5.158,4219,6.235,4260,7.773,4272,8.282,4273,8.282,4274,8.282]],["t/1007",[62,1.734,71,1.24,96,3.186,125,3.47,164,2.48,350,4.135,544,6.525,587,4.682,1235,5.671,1288,6.84,1642,3.486,2613,5.039,2862,5.2,2997,4.989,3225,8.391,4189,7.055,4194,5.671,4219,6.855,4267,8.391,4275,9.105]],["t/1010",[39,0.627,48,2.392,49,1.524,53,1.416,61,2.136,62,2.444,71,0.514,96,1.321,97,2.46,115,2.885,116,0.87,118,2.288,119,1.44,120,1.317,132,1.099,133,0.929,141,2.029,142,1.532,164,1.028,170,0.97,203,3.766,250,1.127,251,1.09,285,1.338,328,2.955,337,1.527,349,1.108,350,0.987,363,2.649,374,0.94,375,1.661,382,2.524,406,0.702,407,0.893,422,0.547,426,2.09,433,1.621,437,3.515,444,1.521,464,5.503,474,0.76,479,1.621,492,1.255,497,1.596,502,0.993,533,1.857,534,2.496,542,2.089,543,1.082,545,2.385,562,1.203,595,1.027,639,3.138,642,1.44,647,0.94,722,1.255,724,1.215,739,1.215,741,0.975,749,2.28,752,0.84,763,0.681,798,1.027,803,0.94,813,1.416,816,1.285,818,2.189,854,1.228,890,1.127,902,1.59,921,1.255,932,1.065,955,0.918,965,2.385,970,4.238,972,0.884,973,0.934,1044,1.157,1061,1.636,1089,1.09,1091,3.374,1093,1.394,1152,0.951,1176,1.228,1305,1.44,1387,1.317,1390,2.741,1409,1.595,1436,0.981,1469,1.27,1605,3.306,1642,3.384,1698,1.543,1705,2.594,1732,1.108,1790,1.394,1834,1.466,1871,1.74,2078,1.557,2080,1.684,2130,3.073,2185,1.416,2324,4.282,2434,1.557,2613,2.768,2997,5.205,3058,1.373,3060,1.394,3148,2.705,3230,3.26,3376,1.74,3964,7.336,3966,5.884,4095,1.891,4097,3.478,4160,1.891,4195,4.61,4276,3.774,4277,2.003,4278,2.173,4279,2.173,4280,2.173,4281,2.173,4282,3.774,4283,5.003,4284,3.283,4285,2.173,4286,5.975,4287,1.557,4288,2.173,4289,3.774,4290,2.003,4291,3.774,4292,5.003,4293,5.003,4294,3.774,4295,6.763,4296,5.003,4297,2.173,4298,2.173,4299,2.173,4300,2.173,4301,5.003,4302,2.003,4303,2.173,4304,2.173,4305,3.774,4306,2.173,4307,2.173,4308,2.173,4309,3.774,4310,5.003,4311,3.774,4312,5.003,4313,2.173,4314,4.352,4315,2.173,4316,2.003]],["t/1012",[61,2.715,71,1.034,138,1.977,224,2.51,288,3.156,337,2.318,363,3.315,422,1.91,433,3.217,437,2.442,542,6.121,580,3.542,584,4.546,670,5.572,719,3.752,749,2.56,932,3.723,966,3.406,1027,3.472,1038,6.059,1133,4.799,1377,4.161,1642,4.66,2072,5.033,2100,5.718,2997,5.44,4115,7.947,4116,7.947,4317,7.595]],["t/1014",[30,1.086,31,1.717,58,1.649,62,2.363,71,0.872,133,1.299,138,2.14,143,2.813,152,3.29,164,2.55,167,1.016,170,2.813,172,0.833,197,2.318,224,1.004,309,2.428,337,2.267,518,1.49,523,2.546,533,0.945,534,4.088,543,1.513,601,7.576,605,3.679,607,1.699,647,1.314,650,1.468,658,4.362,699,1.501,749,3.92,781,2.014,792,2.76,851,7.366,885,1.892,902,0.966,932,1.49,992,1.755,993,1.819,1056,2.354,1409,2.229,1424,1.842,1458,1.735,1642,4.777,1738,1.501,1891,1.98,2003,7.665,2046,1.549,2155,8.39,2174,2.177,2625,2.432,2726,8.064,2910,2.177,2997,5.869,3024,5.321,3204,3.775,3851,1.949,3902,7.151,4115,4.014,4116,4.014,4163,2.526,4185,2.643,4234,2.643,4236,2.643,4318,3.039,4319,2.8,4320,2.8,4321,2.8,4322,4.621,4323,2.8,4324,2.8,4325,3.039,4326,2.8,4327,2.8,4328,3.039,4329,3.039]],["t/1016",[30,1.953,46,1.927,56,3.997,62,2.347,71,0.744,79,2.935,92,1.765,138,2.262,143,1.073,151,1.797,152,4.335,167,1.128,170,1.769,172,0.925,173,3.451,190,1.324,197,2.468,292,1.402,309,2.61,328,1.128,337,2.1,406,1.089,458,1.166,514,1.311,518,1.654,527,1.504,533,1.049,534,4.09,543,1.68,566,1.667,605,4.008,644,1.735,647,1.459,653,1.907,658,4.752,663,2.638,749,3.647,781,2.236,803,4.677,885,2.102,902,1.073,921,1.949,934,1.618,955,1.426,966,2.449,970,1.618,972,1.372,1034,2.276,1122,1.707,1152,1.476,1154,2.366,1170,2.132,1223,2.073,1252,1.584,1332,2.236,1341,2.805,1426,2.236,1436,1.523,1469,3.191,1563,2.701,1571,1.476,1642,4.752,1840,1.553,1891,3.56,2012,5.668,2046,1.721,2080,2.615,2089,2.073,2155,2.541,2211,4.373,2625,4.373,2726,6.541,2916,2.615,2997,6.062,3024,5.721,3204,2.541,3851,3.504,4115,2.701,4116,2.701,4163,2.805,4179,7.73,4185,2.935,4186,3.11,4234,2.935,4236,2.935,4247,3.11,4319,3.11,4320,3.11,4321,3.11,4322,3.11,4323,3.11,4324,3.11,4326,3.11,4327,3.11,4330,3.374,4331,5.462,4332,3.374,4333,3.374,4334,3.374,4335,3.374,4336,3.374,4337,3.374]],["t/1018",[23,1.765,26,5.462,55,5.803,87,3.912,104,5.117,138,2.108,197,2.527,288,3.365,327,4.555,349,4.13,407,4.254,647,3.501,719,4.001,721,2.798,756,4.096,970,3.883,1002,3.347,1117,4.001,1230,4.788,1434,6.483,1514,6.445,1599,5.117,1636,4.001,1642,3.101,1902,5.195,2046,4.13,2651,5.942,2916,6.275,4338,7.463,4339,8.099,4340,7.463,4341,8.099,4342,8.099]],["t/1020",[30,3.549,57,6.469,168,3.695,224,3.28,283,5.8,363,2.976,719,4.904,763,3.109,815,4.693,855,3.489,2202,6.469]],["t/1022",[25,2.162,62,2.262,71,0.961,80,5.868,167,2.36,246,4.844,349,3.599,363,2.835,382,4.507,403,2.296,413,5.868,514,2.742,569,3.396,719,3.487,749,4.005,1059,4.173,1480,4.761,1559,2.841,2122,6.397,2202,7.426,2865,5.868,3734,8.228,4343,9.458,4344,5.868,4345,7.058,4346,7.058,4347,7.058,4348,6.505,4349,7.058,4350,7.058,4351,7.058,4352,5.65]],["t/1024",[28,3.204,57,5.48,60,6.331,62,1.601,71,1.443,118,5.097,246,3.819,363,3.177,375,3.701,382,3.553,458,2.905,468,4.503,531,5.033,569,3.019,749,3.573,818,3.679,882,3.869,952,6.331,1559,3.384,2122,4.398,2202,6.906,3230,5.48,3274,9.767,4352,6.731,4353,8.408]],["t/1026",[62,2.178,71,0.861,139,2.058,192,5.467,246,3.986,307,4.348,363,2.631,384,5.065,417,2.495,549,2.323,569,2.272,603,3.15,703,4.348,719,3.125,749,3.398,761,5.26,1559,2.546,1845,5.831,2041,5.831,2122,3.31,2202,5.72,2984,6.802,3602,5.831,4105,5.065,4166,5.504,4352,5.065,4354,5.831,4355,8.778,4356,6.327,4357,6.327,4358,8.09,4359,8.778,4360,6.327,4361,6.327,4362,8.778,4363,10.08,4364,6.327,4365,8.778,4366,6.327,4367,8.778,4368,8.778,4369,8.778,4370,6.327,4371,5.831,4372,6.327,4373,6.327,4374,6.327,4375,6.327,4376,6.327,4377,8.778,4378,5.831,4379,6.327]],["t/1028",[25,2.343,62,1.456,71,1.041,96,2.676,154,4.001,246,4.529,363,2.989,413,6.358,417,3.016,504,5.48,514,2.971,569,2.746,749,3.741,771,4.15,1059,4.521,1480,5.158,1559,3.078,1709,3.933,2122,5.805,2202,6.499,2865,6.358,3010,4.906,3460,7.048,3734,6.653,4106,7.048,4344,6.358,4348,7.048,4352,6.122,4380,7.648,4381,7.648,4382,6.358,4383,7.648,4384,7.648,4385,7.648,4386,7.648,4387,7.648,4388,7.648]],["t/1032",[62,2.058,71,1.31,107,2.815,138,2.505,153,2.423,337,3.298,339,5.482,363,2.172,382,5.312,436,5.703,533,2.991,534,3.027,619,3.189,692,7.744,853,3.823,1244,5.454,1642,2.774,1669,4.184,2213,5.994,3824,5.315,4255,6.023,4389,7.244,4390,8.651,4391,9.959,4392,10.806]],["t/1034",[24,0.863,25,0.239,39,0.225,48,0.203,56,1.375,62,2.656,71,0.106,111,0.592,115,0.764,138,0.698,139,0.253,153,0.261,164,0.212,167,1.749,170,0.945,190,0.306,223,0.415,246,1.453,250,0.404,337,1.491,339,1.004,349,1.632,361,0.826,363,0.632,369,1.133,382,0.624,403,0.481,407,0.32,417,1.057,426,1.886,468,0.331,533,0.459,542,3.072,566,2.23,569,0.28,576,0.663,580,0.363,595,0.368,598,0.885,600,3.65,606,4.444,614,2.091,663,0.376,719,0.73,723,2.925,724,2.299,749,0.903,759,0.678,798,0.699,815,0.368,818,1.799,853,2.761,867,0.881,881,0.508,921,0.45,940,0.572,952,0.587,966,1.435,973,0.906,980,0.663,1001,1.204,1023,5.505,1037,1.218,1044,0.415,1078,0.908,1133,1.332,1165,0.558,1182,0.525,1253,0.379,1366,0.92,1392,1.584,1393,0.472,1396,0.587,1458,2.349,1564,1.107,1584,2.077,1593,0.516,1618,0.826,1669,1.547,1698,0.604,1709,4.825,1825,1.004,1840,3.159,1841,0.44,1842,0.427,1847,0.419,1902,0.948,1969,0.508,2066,2.2,2087,1.449,2088,0.558,2122,4.268,2149,1.702,2186,1.084,2198,0.648,2434,0.558,2453,5.929,2779,0.535,2784,1.059,2966,0.587,2978,1.332,3027,0.455,3048,0.648,3082,0.948,3314,0.648,3323,0.678,3324,0.604,3328,0.718,3329,0.718,3330,1.362,3594,0.718,3604,0.718,3706,1.362,3824,3.585,3854,0.718,3922,2.227,3996,0.718,4130,1.145,4174,2.783,4255,2.66,4352,0.624,4393,0.779,4394,0.718,4395,0.779,4396,0.779,4397,0.779,4398,0.779,4399,2.108,4400,8.957,4401,1.752,4402,2.108,4403,1.478,4404,1.478,4405,2.108,4406,2.108,4407,2.108,4408,2.108,4409,0.779,4410,2.108,4411,1.478,4412,2.108,4413,1.478,4414,1.478,4415,0.779,4416,0.779,4417,0.779,4418,0.779,4419,0.779,4420,1.478,4421,0.779,4422,0.779,4423,0.779,4424,0.779,4425,0.779,4426,0.779,4427,0.779,4428,0.779,4429,0.779,4430,0.779,4431,0.779,4432,0.779,4433,0.779,4434,0.779,4435,0.779,4436,0.779,4437,0.779,4438,0.779,4439,0.779,4440,0.779,4441,0.779,4442,0.779,4443,0.779,4444,0.779,4445,0.779,4446,0.779,4447,0.779,4448,0.779,4449,0.779,4450,0.779,4451,0.779,4452,0.779,4453,0.779,4454,0.779,4455,0.779,4456,0.779,4457,0.779,4458,0.779,4459,0.779,4460,0.779,4461,0.779,4462,0.779,4463,0.779,4464,0.779,4465,0.779,4466,0.779,4467,0.779,4468,0.779,4469,0.779,4470,0.779,4471,0.779,4472,0.779,4473,0.779,4474,0.779,4475,2.679,4476,0.779,4477,0.779,4478,0.779,4479,0.779,4480,0.779,4481,0.779,4482,0.779,4483,0.779,4484,0.648,4485,0.779,4486,0.779,4487,0.779,4488,0.779,4489,0.779,4490,0.779,4491,0.779,4492,0.779,4493,0.779,4494,1.478,4495,0.779,4496,0.779,4497,0.779,4498,0.587,4499,0.779,4500,0.779,4501,0.779,4502,0.779,4503,0.779,4504,0.779,4505,1.362,4506,2.108,4507,1.966,4508,1.478,4509,0.779,4510,0.678,4511,0.779,4512,0.779,4513,0.779,4514,0.779,4515,0.779,4516,0.779,4517,0.779]],["t/1036",[31,3.77,62,2.546,71,0.909,139,2.171,164,1.818,170,1.715,246,3.03,271,2.686,277,3.348,339,3.177,340,3.994,359,6.204,363,2,395,3.375,533,2.074,568,4.679,685,5.342,686,6.149,719,3.296,749,2.25,865,4.422,999,5.342,1028,3.994,1734,4.216,2054,5.805,2122,3.491,2274,4.501,3471,5.342,4390,5.342,4518,6.673,4519,9.105,4520,9.105,4521,6.673,4522,9.105,4523,6.673,4524,9.105,4525,9.105,4526,6.673,4527,6.673,4528,6.673,4529,5.342,4530,6.673,4531,6.673]],["t/1038",[35,2.427,62,2.35,71,0.684,109,1.441,197,2.322,246,4.448,250,4.595,339,1.451,353,4.204,363,0.913,390,1.567,417,1.982,431,1.302,461,2.135,497,0.972,578,2.563,749,3.614,763,1.574,780,4.052,818,3.602,1085,3.927,1332,2.019,1628,3.792,1709,4.556,1842,3.514,1937,2.055,2122,5.124,2361,3.524,2985,2.439,3060,4.773,3453,2.183,3471,4.023,3513,3.687,3847,4.372,4183,3.687,4340,6.857,4532,7.441,4533,7.441,4534,8.861,4535,6.671,4536,3.047,4537,3.047,4538,3.047,4539,5.025,4540,5.025,4541,3.047,4542,5.025,4543,5.025,4544,3.047,4545,7.441,4546,5.025,4547,5.025,4548,5.025,4549,5.025,4550,4.631,4551,5.025,4552,6.413,4553,5.025,4554,5.025,4555,5.025,4556,3.047,4557,3.047,4558,3.047,4559,3.047,4560,3.047,4561,3.047,4562,3.047,4563,3.047,4564,3.047,4565,6.413,4566,5.025,4567,3.047,4568,3.047,4569,3.047,4570,3.047,4571,3.047,4572,3.047,4573,3.047,4574,3.047,4575,3.047,4576,3.047,4577,3.047,4578,5.025,4579,3.047,4580,3.047,4581,3.047,4582,3.047,4583,3.047,4584,6.413,4585,9.795,4586,10.152,4587,6.413,4588,6.413,4589,6.413,4590,5.025,4591,5.025,4592,3.047,4593,3.047,4594,3.047,4595,2.808,4596,3.047,4597,3.047,4598,3.047,4599,3.047,4600,3.047,4601,3.047]],["t/1041",[35,3.985,56,2.49,61,2.071,62,2.64,167,2.759,170,1.489,363,1.737,382,3.486,533,1.801,549,2.127,853,4.355,966,2.598,1023,3.608,1052,3.346,1091,3.907,1458,3.309,1669,3.346,1709,4.243,2042,3.467,2187,4.063,2453,5.213,3699,4.063,4382,6.859,4602,5.793,4603,5.793,4604,5.793,4605,5.793,4606,5.793,4607,5.793,4608,5.793,4609,5.793,4610,5.793,4611,5.793,4612,5.793,4613,5.793,4614,5.793,4615,5.793,4616,5.793,4617,5.793,4618,5.793]],["t/1043",[56,3.242,107,2.93,138,1.964,167,2.522,170,1.939,292,3.134,375,3.32,422,2.486,436,5.818,451,4.017,514,2.93,533,2.345,650,3.643,663,3.643,685,6.038,721,3.415,756,3.815,798,4.672,853,5.216,999,6.038,1078,4.633,1107,4.998,1277,5.087,1469,4.407,1834,5.087,2003,5.534,2037,6.562,2464,4.262,2587,5.534,2814,5.679,2938,6.038,3009,6.951,3375,6.666,3439,5.534,3851,4.838,4255,6.27,4619,7.543,4620,6.951,4621,7.543]],["t/1047",[19,1.219,62,2.633,138,2.398,167,1.487,246,5.02,250,4.268,282,1.176,288,1.848,355,2.897,417,4.024,422,1.452,426,3.169,436,3.047,514,3.198,663,3.975,749,3.726,758,2.368,798,4.824,803,4.147,818,1.945,966,1.994,1052,4.753,1078,5.056,1246,3.559,1698,1.818,1709,4.932,2122,2.326,2339,6.359,2453,3.648,2909,2.897,2973,3.596,3851,3.703,4390,4.622,4622,2.631,4623,4.446,4624,5.773,4625,4.446,4626,5.773,4627,5.773,4628,2.631,4629,5.773,4630,2.631,4631,2.631,4632,4.446]],["t/1051",[23,1.832,30,3.006,73,2.725,161,3.456,162,2.133,170,2.161,188,2.29,224,2.778,282,3.07,337,2.566,422,2.919,663,4.061,824,4.607,995,6.99,1219,4.478,1633,4.288,1720,6.331,1739,5.48,1756,5.572,1831,4.971,2235,4.697,3043,6.331]],["t/1053",[71,1.21,271,4.414,282,3.147,285,3.149,297,7.398,316,3.91,349,4.53,422,3.125,675,5.79,766,5.19,2235,4.647,3044,7.728,3045,9.118]],["t/1055",[19,2.89,48,2.838,62,2.479,71,1.061,142,2.387,152,1.805,162,2.122,167,1.363,170,2.595,188,1.728,190,1.599,224,1.347,272,1.363,282,2.788,291,3.5,333,2.614,337,1.244,339,1.94,349,3.236,350,1.851,355,2.656,365,2.409,422,2.397,496,1.9,497,2.487,533,2.422,576,1.827,604,1.839,650,1.968,721,1.408,723,2.439,758,4.15,763,1.276,780,5.558,803,1.762,936,1.927,1028,2.439,1044,2.17,1251,2.354,1384,4.009,1481,2.858,1709,4.523,1840,1.875,1847,2.19,1902,2.614,1937,4.28,2066,2.439,2234,2.7,2235,4.701,2310,5.2,2437,3.545,2453,5.558,3046,3.755,3047,4.45,3048,3.388,3049,8.106,3050,2.858,3051,2.858,3052,2.503,3053,2.92,3054,2.656]],["t/1057",[62,1.498,71,1.383,142,3.111,162,2.264,164,2.143,168,2.928,170,2.892,188,2.143,282,2.687,291,2.888,363,3.372,422,2.554,479,3.291,497,2.51,533,2.445,534,3.287,604,3.55,741,3.527,763,2.464,936,3.719,1251,6.866,2235,4.602]],["t/1059",[61,3.682,162,2.288,170,2.922,188,2.19,369,4.321,578,4.1,763,2.518,798,3.801,818,3.517,868,6.053,1025,6.993,1840,4.739,2234,6.825,2235,4.482,2310,6.089,2410,4.542,2582,5.898,2613,4.449,2996,4.134,3055,6.436,3056,7.409,3057,4.697,3058,5.08,3059,4.362,3060,5.157,3061,6.683]],["t/1061",[224,3.372,282,3.153,422,2.998,638,3.789,1559,4.107]],["t/1063",[25,2.885,30,4.063,71,1.282,224,3.755,282,3.229,327,4.145,422,2.368,498,3.606,527,4.196,638,2.994,648,5.439,2089,5.785,2186,6.909]],["t/1065",[39,2.069,62,1.821,69,2.548,71,1.302,73,1.55,89,2.262,98,1.815,138,1.868,142,1.466,145,2.481,164,1.303,282,2.277,313,4.069,328,2.399,368,2.311,374,2.069,406,1.544,407,1.967,426,1.999,444,2.617,461,3.048,464,3.856,497,1.527,498,1.832,502,2.187,523,1.482,546,3.788,580,4.458,603,2.382,610,2.145,618,3.288,638,3.256,645,3.429,785,7.34,786,3.355,787,3.978,788,3.83,791,5.964,792,2.409,793,4.675,794,3.978,795,3.069,796,2.132,797,3.429,798,3.392,799,3.978,800,2.864,801,2.733,802,2.98,803,2.069,805,2.045,816,4.241,902,1.521,936,2.262,948,2.648,957,3.171,1117,2.363,1231,2.44,1614,3.978,1618,4.011,1636,4.251,1642,3.661,1693,2.145,1761,3.355,2014,3.602,2045,2.548,2069,3.118,2575,3.978,2719,3.288,2975,4.533,3016,6.336,3062,3.51,3063,4.409,3064,4.409,3065,4.409,3066,4.162,3067,4.409,3068,4.409,3069,4.409,3070,4.409,3071,4.409,3072,4.409,3073,6.611,3074,4.409]],["t/1067",[71,1.687,142,2.987,374,4.216,377,5.057,444,2.965,497,3.112,814,6.557,1618,5.452,2668,8.138]],["t/1069",[19,1.465,35,2.581,48,1.391,56,2.297,62,1.017,111,2.139,154,2.795,170,2.001,224,1.765,271,3.133,282,3.132,284,2.532,297,3.604,333,3.427,337,1.631,346,3.052,349,2.725,389,2.845,397,4.352,417,2.107,422,2.697,533,1.661,576,2.396,580,2.491,619,2.352,638,3.951,766,3.121,793,3.482,857,3.672,874,2.899,921,3.086,966,2.396,1251,3.086,1557,2.957,1809,3.198,1841,3.019,1969,3.482,2343,3.328,2347,4.993,2451,3.282,2453,3.376,2667,4.993,3047,3.747,3054,3.482,3062,3.92,3075,4.442,3076,4.924,3077,4.924,3078,7.173,3079,4.924,3080,3.672,3081,3.829,3082,3.427,3083,5.578,3084,4.023,3085,5.86,3086,4.277,3087,5.578,3088,4.023,3089,4.023,3090,4.023,3091,4.14,3092,4.648,3093,4.648,3094,4.648,3095,7.173,3096,4.924,3097,4.924,3098,4.924,3099,4.648,3100,4.924,3101,4.442,3102,4.277,3103,4.924]],["t/1071",[89,4.304,98,3.453,153,3.045,164,2.48,403,2.962,437,3.58,496,4.246,533,2.83,638,2.894,752,3.52,874,4.941,936,5.264,974,5.091,1038,4.533,1502,7.289,1825,4.335,2996,4.682,3045,7.569,3104,7.055]],["t/1073",[154,4.365,164,2.873,168,3.926,170,2.145,284,3.431,327,3.673,368,5.586,389,4.444,638,4.069,1825,5.506,2639,6.337,3082,5.353,3101,6.937,3105,7.259,3106,9.175,3107,7.259,3108,6.466]],["t/1075",[22,1.895,35,2.117,48,1.141,62,0.835,68,2.624,71,0.914,96,1.534,97,2.857,139,1.426,142,1.343,153,1.466,154,2.293,164,1.194,167,2.245,170,1.726,275,2.356,277,5.86,284,3.382,300,3.512,389,3.575,403,2.184,431,2.869,437,1.41,474,1.534,493,1.918,534,1.832,543,2.182,569,2.411,580,2.044,638,3.92,699,3.316,716,2.182,756,2.217,764,2.166,793,2.857,854,2.477,864,3.835,874,4.427,902,2.134,966,1.966,990,2.693,1027,3.069,1035,2.77,1053,2.335,1209,2.293,1251,4.712,1378,3.141,1546,3.141,1557,2.426,1790,2.812,1829,2.102,1841,2.477,1847,2.356,1850,3.397,1974,4.528,2066,2.624,2316,2.451,2343,4.181,2536,3.301,2672,3.074,3010,4.306,3080,3.013,3081,3.141,3082,2.812,3083,3.141,3084,3.301,3085,5.055,3087,3.141,3088,3.301,3089,3.301,3090,3.301,3091,3.397,3109,3.509,3110,3.644,3111,3.644,3112,3.644,3113,3.644,3114,4.04,3115,10.288,3116,4.04,3117,3.644,3118,7.519,3119,5.84,3120,4.04,3121,6.187,3122,5.84,3123,6.187,3124,6.187,3125,4.04,3126,3.814]],["t/1077",[35,2.427,48,1.308,62,0.957,71,1.013,96,2.604,133,2.148,139,1.635,153,1.681,154,2.629,164,1.369,167,1.681,170,2.278,275,2.701,284,3.933,389,4.719,403,1.635,437,1.616,474,1.758,479,1.628,493,2.199,534,2.1,543,2.502,569,2.672,580,2.343,615,3.524,638,3.946,716,2.502,762,1.758,793,3.275,874,4.038,902,1.598,921,4.297,966,2.253,1027,3.401,1035,3.175,1053,2.676,1209,2.629,1237,3.524,1251,5.117,1557,2.781,1732,2.563,1790,3.223,1829,2.41,1841,2.839,1847,2.701,1974,3.389,2316,2.81,2343,4.634,2672,3.524,3080,3.454,3081,3.601,3082,3.223,3083,3.601,3084,3.783,3085,5.602,3087,3.601,3088,3.783,3089,3.783,3090,3.783,3109,5.957,3110,4.178,3111,4.178,3127,6.857,3128,9.637,3129,4.631,3130,4.631,3131,6.857,3132,4.631,3133,8.166,3134,6.857,3135,4.631,3136,6.857,3137,4.631,3138,4.631]],["t/1079",[22,3.937,35,3.223,39,2.626,111,2.672,115,2.417,132,3.375,138,1.737,164,3.033,166,3.403,170,1.715,198,2.25,282,1.765,375,2.937,389,3.554,403,3.622,490,5.52,493,3.984,527,2.973,580,3.111,595,4.305,638,3.984,663,3.223,721,2.306,874,6.68,966,4.648,1027,4.162,1829,4.366,1841,3.77,2667,5.841,3080,4.586,3081,4.782,3082,5.841,3139,7.921,3140,6.149]],["t/1082",[290,5.347,513,5.147,523,2.993,549,3.549,602,5.101,638,3.924,763,3.027,1014,6.107,2668,6.778,3141,6.02,3142,7.091]],["t/1084",[107,4.137,276,6.072,277,4.251,284,2.756,300,4.432,526,6.455,549,3.111,607,4.737,638,3.385,650,4.093,763,3.335,764,4.186,902,2.694,1036,4.286,1076,5.354,1127,4.154,1698,4.354,1711,6.542,2122,4.432,2668,5.942,3143,7.809,3144,7.809,3145,7.371,3146,7.809]],["t/1088",[62,2.307,250,5.102,280,4.882,780,6.217,1480,6.636,1709,5.059,1790,6.311,1960,6.412,1974,7.41,2236,7.051,3147,8.795,3148,7.051,3149,6.904,3150,9.067,3151,9.067,3152,9.067,3153,9.067,3154,9.067,3155,9.067,3156,6.904,3157,6.904,3158,6.904,3159,6.904,3160,6.904,3161,6.904]],["t/1093",[30,3.006,62,2.018,138,2.189,151,4.478,186,4.653,250,4.361,1036,4.253,1153,5.896,1633,4.288,1709,4.324,1782,4.751,1797,5.572,2066,6.343,3147,6.731,3325,5.779,4284,7.314,4371,7.749,4633,8.408,4634,8.408,4635,8.408,4636,8.408,4637,8.408,4638,8.408,4639,8.408,4640,8.408,4641,8.408,4642,8.408,4643,8.408,4644,8.408]],["t/1096",[21,2.851,37,3.565,39,3.203,40,4.424,45,5.659,61,2.371,71,1.512,80,5.514,98,2.515,109,4.885,116,3.631,145,3.44,168,2.469,283,3.875,285,2.351,291,2.435,292,2.756,403,2.158,406,2.141,407,2.726,444,2.017,474,2.321,523,2.054,529,3.921,562,5.018,611,2.955,763,2.077,805,2.834,856,5.139,873,3.921,887,4.254,1117,3.276,1122,4.586,1219,4.829,1550,7.259,1571,2.902,1725,5.309,1729,4.021,1733,5.514,1828,6.112,1902,4.254,2046,3.382,2208,4.131,4645,6.632,4646,6.632,4647,6.632]],["t/1099",[71,1.205,96,2.24,138,1.666,139,3.736,142,1.961,153,2.959,171,2.674,246,2.907,272,2.14,285,3.595,363,3.04,382,5.018,433,2.074,479,2.074,498,2.451,502,5.671,542,3.542,561,4.848,638,3.478,762,2.24,867,3.697,882,2.945,893,2.985,902,2.035,1252,3.005,1396,4.819,2046,3.264,3230,4.171,3949,5.321,4648,6.401,4649,8.849,4650,6.401,4651,6.401,4652,6.401,4653,6.401,4654,6.401,4655,6.401,4656,6.401,4657,5.899,4658,6.401,4659,6.401,4660,6.401,4661,6.401,4662,6.401]],["t/1101",[71,1.136,96,2.92,133,3.566,139,3.953,153,2.791,285,2.958,290,4.885,434,3.449,444,2.538,458,2.883,502,3.814,638,3.984,721,2.883,850,4.091,867,3.487,893,3.891,1564,3.449,1627,6.466,1671,6.466,1767,5.438,4657,7.69,4663,7.259,4664,8.344,4665,8.344]],["t/1103",[66,4.222,71,1.282,105,3.137,139,3.063,224,3.112,458,3.254,533,2.927,610,5.096,638,2.994,763,2.949,803,4.071,1002,3.892,1354,6.351,1571,4.12,2912,7.538,4666,8.678]],["t/1105",[66,2.697,71,1.586,133,2.571,138,3.032,139,2.756,271,2.421,285,2.132,288,2.5,307,4.134,355,3.92,363,3.365,382,4.921,403,2.756,417,3.868,422,2.467,436,4.472,521,4.922,529,5.01,533,1.87,578,3.067,610,4.399,638,1.912,721,2.079,766,3.514,885,5.277,902,1.912,1002,2.486,1160,4.218,1636,2.971,1642,2.303,1669,3.474,1732,3.067,2132,6.783,3230,3.92,3439,4.413,3688,4.057,4390,4.815,4667,8.474,4668,9.04,4669,9.04,4670,6.015,4671,6.015,4672,5.544,4673,6.015,4674,6.015]],["t/1107",[61,3.029,139,3.789,285,4.128,403,3.789,406,2.735,417,3.341,422,2.131,436,4.472,610,3.799,638,2.694,885,6.632,1275,4.839,1636,4.186,3230,5.522,3380,6.783,3439,6.217,3508,6.783,4669,7.809,4675,8.473,4676,8.473,4677,8.473,4678,8.473,4679,8.473]],["t/1109",[71,1.071,138,2.928,139,3.304,153,2.631,285,3.6,363,3.045,382,4.292,403,2.559,406,2.539,436,4.152,521,5.096,529,4.651,542,4.354,561,6.514,578,4.012,610,3.527,638,2.501,1023,4.899,1038,3.916,1275,4.493,3688,5.306,4390,6.297,4680,10.157,4681,11.342,4682,7.867]],["t/1112",[46,3.344,62,1.115,96,2.049,98,2.221,107,2.275,111,2.344,125,2.231,138,1.524,151,3.118,153,1.958,161,2.407,172,2.65,273,7.783,282,2.557,284,3.615,318,3.704,437,1.883,460,3.421,543,4.812,604,2.642,663,4.015,721,2.873,740,3.274,762,4.155,805,2.502,818,2.562,893,2.73,936,2.768,991,3.504,1002,3.436,1027,3.8,1075,3.382,1076,3.7,1122,4.205,1152,2.562,1209,5.056,1558,3.8,1567,3.344,1642,2.242,1698,2.394,1705,4.024,1706,3.756,1729,3.549,1767,7.242,1878,3.09,4683,6.911,4684,8.313,4685,3.597,4686,5.396,4687,5.396]],["t/1114",[30,1.968,48,1.433,56,2.366,59,2.904,61,1.968,62,1.948,71,1.393,96,1.926,125,2.097,138,1.433,142,1.686,170,1.415,190,2.159,280,3.586,282,2.706,284,3.327,285,1.951,286,2.602,337,1.68,363,1.65,422,1.384,479,2.577,533,1.711,542,4.401,561,5.116,576,2.468,600,3.143,663,3.841,717,3.294,718,2.958,762,4.079,764,3.928,815,2.602,973,2.366,994,3.712,1023,3.428,1038,2.74,1470,4.973,1642,3.916,1841,3.109,2046,4.055,2478,5.072,3507,7.329,4668,5.072,4672,5.072,4681,10.42,4688,5.503,4689,5.503,4690,5.503,4691,5.072,4692,7.952,4693,7.952,4694,7.952,4695,7.952,4696,7.952,4697,7.952,4698,5.503,4699,5.503]],["t/1116",[39,0.803,40,1.109,45,1.355,48,2.343,61,0.996,62,1.492,71,0.819,96,2.965,105,2.344,109,1.316,116,1.115,125,1.061,139,1.957,143,0.885,152,1.233,161,1.145,164,1.27,167,1.559,170,1.809,191,1.526,246,4.6,280,1.815,284,2.927,285,3.918,286,4.92,300,3.147,318,2.078,337,2.747,349,1.42,354,1.397,361,2.607,363,1.398,382,3.58,403,1.957,433,2.28,474,0.974,493,1.218,502,3.216,526,4.749,530,3.27,533,0.866,576,2.091,600,1.59,606,1.42,610,2.091,611,1.241,638,3.514,663,1.345,699,1.375,739,1.557,743,3.514,762,3.982,763,2.203,824,1.526,861,1.497,893,1.298,902,0.885,934,2.885,987,2.158,991,1.667,1027,2.131,1075,3.474,1121,1.815,1196,2.158,1219,1.483,1450,1.71,1469,1.627,1470,3.204,1541,2.757,1562,1.59,1569,5.001,1603,1.734,1642,1.785,1669,4.064,1698,1.907,1711,2.864,1715,2.229,1732,1.42,1756,3.09,1841,5.085,1847,1.497,1855,3.876,1861,4.297,2046,2.378,2078,1.995,2132,2.229,2168,4.297,2691,2.724,3010,2.991,3099,2.422,3230,1.815,3427,3.613,3508,3.733,4105,3.733,4663,8.21,4700,6.016,4701,4.663,4702,5.849,4703,4.663,4704,4.663,4705,2.785,4706,2.785,4707,7.834,4708,4.663,4709,4.663,4710,2.785,4711,2.785,4712,2.785,4713,2.566,4714,2.785,4715,2.785,4716,2.785,4717,2.785]],["t/1118",[71,1.429,143,3.337,422,2.64,762,3.673,4718,9.131]],["t/1120",[23,2.203,271,4.771,297,6.819,307,6.948,766,5.906,3075,8.405,4718,10.313]],["t/1122",[40,1.746,48,1.485,54,1.53,58,1.404,62,1.877,71,0.352,81,1.232,96,1.996,97,1.686,98,3.468,133,3.908,139,0.842,143,3.638,153,0.865,167,3.552,170,1.127,172,2.703,273,1.66,285,0.917,318,1.953,327,4.025,337,2.293,382,2.837,403,0.842,407,4.052,428,1.119,437,0.832,444,2.284,502,3.069,518,4.482,523,0.801,527,5.404,530,1.815,534,1.832,545,1.635,599,3.066,622,1.686,642,6.059,645,6.827,662,1.53,663,4.9,739,1.447,740,2.451,762,3.638,763,2.863,805,2.437,810,1.899,815,1.223,940,7.232,957,1.715,1014,1.635,1027,1.183,1206,1.854,1218,1.612,1248,5.617,1342,6.208,1384,6.228,1405,1.948,1421,1.852,1473,1.512,1541,1.53,1562,1.478,1571,1.918,1603,1.612,1638,4.095,1729,1.569,2066,1.549,2089,1.59,4685,2.693,4718,3.814,4719,2.385,4720,2.588,4721,2.588,4722,2.588,4723,2.588,4724,4.04,4725,2.588,4726,10.622,4727,9.527,4728,3.013]],["t/1124",[61,3.717,62,1.98,111,3.267,133,3.487,153,2.728,164,2.222,272,2.728,284,2.654,285,3.685,318,3.636,337,2.49,437,2.623,610,3.658,611,4.633,617,5.607,663,5.022,730,5.012,805,3.487,922,7.097,936,3.857,1053,4.345,1237,5.721,1424,4.946,1698,3.336,3372,6.143,3380,6.531,3719,6.322,4729,8.159,4730,8.159,4731,8.159]],["t/1126",[48,2.632,143,3.214,285,3.583,422,2.543,762,3.538,902,3.214,3508,8.093,4732,10.11,4733,10.11]],["t/1128",[71,1.377,191,6.496,428,4.371,763,3.166,1711,7.727,4734,10.11]],["t/1130",[56,3.357,71,1.063,96,2.733,106,3.319,122,4.28,191,5.54,285,2.768,403,2.541,509,5.268,510,4.865,526,7.187,533,3.485,594,7.35,607,4.367,638,2.483,663,3.773,743,4.563,902,2.483,932,3.829,1127,3.829,1193,4.367,1442,5.09,1569,6.493,1608,5.01,1669,4.511,1711,6.886,2665,6.253,4663,6.795,4735,7.811]],["t/1133",[29,3.564,39,2.812,132,4.932,142,3.555,382,4.903,586,8.514,587,5.967,4736,9.751,4737,9.751]],["t/1135",[56,3.98,71,1.261,170,3.24,542,5.124,850,4.539,853,4.886,854,5.231,855,3.253,856,7.174,857,6.363,858,6.033,859,6.033,860,5.541,861,4.976,862,8.532,863,8.532]],["t/1137",[62,1.999,115,2.478,138,1.78,164,2.522,170,2.38,172,2.539,337,2.087,437,2.199,531,5.541,534,2.858,542,3.785,578,4.721,600,3.906,650,3.303,699,3.378,751,3.642,754,6.493,816,4.043,850,4.539,853,5.937,857,4.7,864,5.995,865,6.956,866,4.321,867,2.858,868,5.149,869,3.642,870,3.906,871,6.302,872,6.302,873,4.043,874,3.711,875,9.131,876,5.949,877,5.299,878,6.302,879,5.299,880,6.302,881,4.457,882,3.147,883,5.949,884,5.475,885,4.259]],["t/1139",[24,4.663,28,3.041,38,3.827,62,2.354,71,1.087,111,3.196,170,2.052,172,2.811,337,2.436,502,3.648,523,2.472,527,3.556,699,5.064,853,4.212,864,4.558,865,5.289,877,6.184,879,6.184,887,5.119,888,5.201,889,5.855,894,8.523,895,7.355,896,7.355,897,9.448,898,7.355,899,7.355,900,6.943,901,9.448]],["t/1141",[23,1.739,28,3.041,62,2.276,71,1.087,142,3.469,153,2.669,164,2.174,167,3.428,285,3.634,437,2.566,502,3.648,721,2.758,796,3.556,850,3.913,857,5.485,867,3.335,869,4.25,902,2.537,937,10.438,938,6.389,939,10.438,940,5.855,941,9.448,942,5.119,943,5.855,944,7.355]],["t/1145",[38,5.156,71,1.172,115,3.118,190,3.377,307,7.39,337,2.626,519,5.028,526,5.217,533,2.675,555,6.889,580,5.469,783,6.479,974,4.812,1026,6.668,1036,5.439,1387,5.217,1711,5.286,1812,6.668,2069,5.608,4738,8.225,4739,8.606]],["t/1147",[271,4.307,297,7.217,4738,7.504]],["t/1149",[4738,7.577,4740,9.958]],["t/1151",[2436,9.766,4738,7.431,4741,10.597,4742,10.597]],["t/1153",[62,1.925,107,3.928,307,6.948,337,3.086,576,4.533,580,4.714,694,8.093,719,4.994,4738,7.089]],["t/1155",[190,4.482,337,2.899,403,3.09,497,3.031,533,3.551,942,6.093,1133,6.001,1152,4.156,1313,5.154,1436,4.286,1502,7.604,4738,8.011,4740,8.753]],["t/1157",[62,1.908,71,1.364,337,3.057,497,3.197,576,4.492,580,4.671,4738,7.025,4743,10.258,4744,10.018]],["t/1159",[38,5.45,71,1.282,153,3.149,338,7.829,533,2.927,565,4.652,1036,4.763,1117,4.652,1458,5.378,1610,5.708,1656,5.708,2418,7.09,2435,8.678,4738,6.603,4745,9.417,4746,9.417]],["t/1161",[24,1.27,38,1.81,56,0.934,62,2.541,137,1.099,271,0.875,277,6.12,297,1.466,307,2.594,337,1.152,344,2.003,403,0.707,417,0.857,526,1.317,561,6.136,580,1.013,637,1.44,853,1.992,1709,6.401,1852,8.92,1870,10.61,1938,1.807,1992,1.557,2193,1.684,2208,1.354,2209,1.494,2310,1.285,2605,1.636,2778,1.524,3052,7.646,4216,10.428,4510,1.891,4738,4.19,4743,1.891,4747,2.173,4748,2.173,4749,2.173,4750,2.173,4751,2.173,4752,2.173,4753,11.198,4754,2.173,4755,2.173,4756,2.173,4757,2.173,4758,2.173,4759,2.173,4760,2.173,4761,2.173,4762,2.173,4763,2.173,4764,2.173,4765,2.173,4766,2.173,4767,2.173,4768,2.173,4769,2.173,4770,2.173,4771,2.173,4772,2.173,4773,2.173,4774,2.173,4775,2.173,4776,2.173,4777,2.173,4778,2.173,4779,2.173,4780,2.173,4781,2.173,4782,2.173,4783,2.173,4784,2.173,4785,2.173,4786,2.173,4787,2.173,4788,2.173,4789,2.173,4790,2.173,4791,2.173,4792,2.173,4793,2.173,4794,2.173,4795,2.173,4796,2.173,4797,2.173,4798,2.173,4799,2.173,4800,2.173,4801,2.173,4802,2.173,4803,2.173,4804,2.173,4805,2.173,4806,2.173,4807,2.173,4808,2.173]],["t/1163",[40,4.142,62,1.98,129,4.722,1571,4.549,2137,7.828,2651,7.628]],["t/1165",[23,1.791,39,2.371,71,1.422,129,3.733,138,2.72,143,2.613,164,2.239,191,6.292,271,3.308,363,3.442,382,3.473,433,3.385,436,4.338,444,2.5,514,3.193,603,4.092,749,2.771,867,3.435,869,4.377,1002,3.397,1338,7.15,1711,7.423,3375,5.544,4809,8.22]],["t/1168",[19,2.661,25,2.118,48,1.8,51,2.326,62,2.5,71,0.369,73,2.708,110,0.986,142,1.396,150,1.583,153,0.906,164,1.241,170,3.059,171,1.132,191,5.903,270,3.265,271,1.834,272,0.906,277,2.959,279,1.765,280,4.506,282,0.717,288,1.126,309,1.027,335,1.738,358,2.497,381,2.762,422,0.681,426,2.464,431,3.571,433,1.477,436,4.689,437,0.871,444,1.386,487,1.862,491,1.393,498,1.037,502,3.16,514,1.77,523,0.839,542,1.499,554,1.712,587,2.343,612,1.47,638,1.875,699,4.608,759,2.357,764,1.338,765,2.169,766,3.445,771,1.47,821,2.252,853,2.405,864,4.772,882,4.743,921,1.565,940,3.343,1035,2.879,1357,1.9,1421,2.922,1609,3.343,1648,2.923,1698,1.108,1703,2.969,1808,1.687,1940,1.456,1990,5.13,2012,1.941,2049,3.531,2235,2.205,2271,4.199,2306,2.252,2361,1.9,2512,4.199,2637,1.9,2686,4.199,2865,3.788,2866,4.199,3082,1.738,3310,4.199,3325,3.132,3375,3.073,3701,2.252,3713,2.252,4105,3.648,4810,2.709,4811,2.709,4812,2.709,4813,2.709,4814,4.557,4815,2.709,4816,2.709,4817,2.709,4818,5.897,4819,2.709,4820,2.709,4821,4.557,4822,5.897,4823,4.557,4824,2.709,4825,2.709,4826,2.709,4827,2.709,4828,2.709,4829,2.709,4830,2.709,4831,2.709,4832,7.713,4833,2.709,4834,2.709,4835,4.557,4836,2.709,4837,2.709,4838,2.709,4839,2.709,4840,2.709]],["t/1170",[25,1.546,28,1.924,45,2.456,48,1.314,56,2.17,71,1.337,81,2.404,89,2.387,110,1.837,115,1.829,134,3.405,139,1.642,153,1.688,170,1.298,172,2.436,191,5.741,200,5.131,272,2.497,326,2.421,333,3.238,337,3.556,346,4.264,371,5.533,382,2.133,388,3.54,428,2.183,433,1.636,461,2.145,491,2.596,493,2.209,496,2.354,533,1.569,542,2.794,558,3.101,576,2.264,578,2.574,584,3.021,595,4.2,599,2.714,638,2.374,647,2.183,749,2.517,769,3.618,770,3.19,771,4.051,796,2.25,855,1.774,867,2.109,960,3.238,980,3.348,993,3.021,1002,2.086,1193,2.823,1209,2.641,1327,3.912,1405,3.801,1415,3.801,1541,2.985,1592,4.197,1594,3.405,1605,2.794,1656,3.06,1694,3.238,1711,4.586,2149,2.338,2401,4.392,2667,4.789,2893,3.618,3062,3.704,3446,3.801,4284,6.495,4841,4.652,4842,5.048,4843,4.652,4844,5.048,4845,5.048,4846,9.655,4847,5.048,4848,5.048,4849,4.652,4850,5.048,4851,5.048,4852,5.048,4853,5.048]],["t/1172",[28,2.512,45,5.391,48,1.716,57,4.296,62,1.72,71,1.23,146,3.013,148,9.492,152,2.92,164,1.796,170,2.321,172,1.808,191,4.948,285,2.337,327,2.902,335,4.229,337,3.144,389,3.511,426,2.755,437,2.12,465,7.755,479,2.136,502,3.013,514,2.561,527,2.938,576,2.956,647,2.85,702,4.964,902,2.096,1209,4.724,1253,3.208,1594,4.447,1613,4.166,2707,5.481,2708,4.964,2893,6.471,4854,6.593,4855,6.593,4856,6.593,4857,9.638,4858,6.593,4859,6.593,4860,6.593,4861,6.593,4862,6.593,4863,6.076,4864,6.076,4865,6.593,4866,6.076]],["t/1174",[19,1.745,45,3.801,48,2.034,62,1.925,71,0.557,73,2.531,129,1.857,139,1.331,153,2.128,154,2.14,164,1.114,168,1.523,170,2.882,191,5.98,224,1.352,288,1.7,300,2.14,316,1.8,326,1.961,327,2.801,330,4.292,333,4.082,337,2.69,363,1.908,382,1.728,426,1.709,431,2.72,433,2.531,437,1.315,491,3.272,496,2.967,514,1.589,521,2.052,526,3.858,527,1.823,529,2.418,531,3.809,533,1.271,542,2.264,576,1.834,578,3.983,598,2.448,644,2.103,650,1.976,676,2.199,699,4.354,724,2.287,856,3.169,864,5.034,867,3.264,876,3.558,877,3.169,879,3.169,881,4.147,882,2.928,950,2.811,993,2.448,1002,1.69,1059,2.418,1396,3.079,1711,2.512,1808,5.489,1810,5.094,1868,3.769,2049,3.169,2174,2.931,2420,5.536,2533,4.791,2760,3.079,3230,4.147,4105,3.274,4841,3.769,4843,5.865,4846,3.769,4849,3.769,4857,3.558,4863,3.769,4864,3.769,4866,3.769,4867,6.364,4868,6.364,4869,4.09,4870,4.09,4871,4.09,4872,4.09,4873,4.09,4874,4.09,4875,3.769,4876,4.09,4877,4.09,4878,4.09,4879,4.09,4880,4.09,4881,6.364,4882,4.09,4883,4.09,4884,4.09,4885,4.09,4886,4.09,4887,4.09,4888,4.09,4889,4.09,4890,4.09,4891,3.558]],["t/1177",[141,5.485,153,3.412,170,2.623,330,6.882,762,3.571,962,6.032,3508,8.168,4892,9.403]],["t/1179",[73,4.196,142,2.678,164,2.958,172,2.397,437,2.811,527,4.839,529,6.42,534,3.653,724,6.072,1059,5.169,1808,5.445,1810,8.693,1825,5.17,4893,10.86]],["t/1181",[45,5.707,48,2.24,96,3.011,107,3.343,190,3.377,287,6.076,403,2.8,431,3.678,465,8.096,479,2.789,513,4.583,517,4.097,642,5.703,786,6.035,1165,6.167,1363,5.608,1729,5.217,1782,6.627,1986,6.668,2066,5.151,2893,6.167,4894,8.606]],["t/1184",[56,3.98,71,0.931,73,2.216,115,3.354,138,2.929,153,2.287,161,2.811,279,6.034,361,3.824,363,3.146,422,2.64,436,5.54,461,2.906,576,3.066,595,4.377,611,3.047,617,4.7,781,4.532,802,4.259,893,3.189,1091,6.245,1107,4.532,1176,3.864,1619,3.676,1642,4.019,1657,4.613,1834,4.613,2003,5.017,2132,5.475,2454,5.017,2726,6.971,3027,3.995,3090,5.149,3109,5.475,3230,4.457,3375,4.613,3824,5.017,3851,4.387,4128,5.949,4188,5.475,4620,6.302,4895,6.302,4896,9.259]],["t/1187",[48,1.814,62,2.159,139,2.267,146,4.286,198,2.349,246,5.372,361,3.896,363,2.089,390,4.822,431,2.978,474,2.439,522,3.272,566,3.442,749,4.108,853,3.678,854,3.937,885,5.84,1028,4.171,1037,4.025,1466,6.422,1514,4.34,1619,3.746,1938,5.793,2122,6.189,2202,4.541,3704,6.062,4897,6.969,4898,6.969,4899,6.969,4900,6.969,4901,6.969,4902,6.969,4903,6.422,4904,6.969,4905,6.969,4906,6.969,4907,10.598]],["t/1189",[116,3.586,138,2.332,153,2.995,291,3.289,318,3.991,361,5.008,444,2.724,497,2.858,514,3.48,533,2.784,549,3.289,638,2.847,650,4.326,792,3.007,850,4.391,867,3.742,885,5.578,932,4.391,1266,6.281,1599,5.659,1768,5.502,2046,4.567,2972,6.571]],["t/1191",[115,4.295,363,3.554,1642,3.871,3699,7.089,3700,9.317,4129,9.317,4908,10.11]],["t/1195",[71,1.154,115,3.858,116,3.393,138,2.772,224,2.8,318,5.444,363,3.192,422,2.131,518,4.154,815,4.006,867,3.54,934,4.063,1023,7.253,1636,4.186,1669,7.057,3314,7.044,3922,7.044,4130,8.252]],["t/1197",[115,4.318,116,4.086,318,4.547,363,3.573,1960,7.768]],["t/1199",[115,4.318,116,4.086,318,4.547,363,3.573,2814,8.974]],["t/1201",[115,4.318,116,4.086,318,4.547,363,3.573,3927,9.909]],["t/1203",[115,4.318,116,4.086,318,4.547,363,3.573,2978,7.531]],["t/1205",[115,4.318,116,4.086,318,4.547,363,3.573,3021,8.974]],["t/1207",[28,0.8,46,1.199,56,1.574,58,1.139,62,2.458,71,0.663,107,0.815,112,0.999,115,0.76,138,1.268,139,0.683,141,1.128,142,1.121,143,0.667,153,1.224,164,0.572,224,0.693,250,1.899,271,0.845,272,0.702,278,2.624,283,1.226,284,1.897,285,0.744,291,0.771,318,3.239,337,1.117,363,1.46,374,0.907,403,2.152,406,0.677,417,1.444,422,1.467,426,0.877,436,6.601,437,1.177,458,0.725,468,0.892,479,1.186,498,0.804,533,0.652,534,0.877,549,0.771,602,1.108,610,0.941,614,0.972,719,1.037,730,1.289,749,1.234,752,0.811,762,0.734,763,0.657,766,6.839,802,2.28,867,0.877,869,3.106,936,0.992,965,1.326,978,1.326,1035,1.326,1053,1.118,1092,1.256,1146,1.442,1209,1.098,1252,0.985,1263,1.161,1605,1.161,1698,1.497,1825,0.999,1842,1.15,1870,8.39,1978,1.58,2069,1.368,2130,1.289,2134,1.626,2487,1.626,2587,1.54,3112,1.745,3122,10.183,3181,1.934,3298,3.898,3439,1.54,3699,1.472,3716,1.745,3719,2.837,4909,4.87,4910,2.099,4911,3.661,4912,11.861,4913,2.099,4914,10.117,4915,11.705,4916,11.705,4917,2.099,4918,2.099,4919,2.099,4920,2.099,4921,2.099,4922,2.099,4923,2.099,4924,2.099,4925,2.099,4926,2.099,4927,2.099,4928,2.099,4929,2.099,4930,2.099,4931,9.645,4932,2.099,4933,2.099,4934,2.099,4935,2.099,4936,2.099,4937,2.099,4938,2.099,4939,2.099,4940,2.099,4941,2.099,4942,2.099,4943,2.099,4944,2.099,4945,1.826,4946,2.099,4947,1.934,4948,3.661,4949,2.099,4950,2.099,4951,2.099]],["t/1209",[28,1.588,46,2.38,61,2.309,71,0.567,96,1.458,115,1.51,125,1.588,138,2.859,139,2.896,142,2.421,151,2.22,153,1.394,164,2.775,271,1.677,272,2.159,273,2.673,291,1.53,292,1.732,309,1.581,318,3.967,337,1.971,363,1.249,378,3.408,403,2.101,422,1.048,426,3.303,436,5.95,437,2.076,444,1.267,451,2.22,459,2.464,513,2.22,517,1.984,518,2.043,523,2,533,2.457,539,2.864,602,2.2,614,2.991,653,2.355,699,3.19,741,1.869,762,1.458,792,1.399,800,5.328,803,2.792,805,2.76,850,2.043,855,1.465,866,2.633,882,2.971,885,7.417,921,2.407,936,5.192,986,2.464,992,3.729,1072,2.716,1092,2.494,1122,2.108,1146,2.864,1209,2.18,1271,4.995,1308,2.355,1636,2.059,1638,1.791,1698,1.704,1976,2.38,2637,2.923,2665,3.336,2734,4.862,3273,3.229,3298,5.169,3439,3.058,3699,2.923,4945,3.626,4952,4.168,4953,8.204,4954,8.903,4955,4.168,4956,4.168,4957,3.841,4958,8.903,4959,6.457,4960,4.168]],["t/1212",[115,4.204,116,3.904,318,5.171,363,3.479,867,4.074,1628,5.765,3513,9.409]],["t/1214",[115,4.342,116,4.124,363,3.592,3000,7.81]],["t/1216",[115,4.318,116,4.086,318,4.547,363,3.573,3828,8.192]],["t/1218",[62,1.665,71,1.479,115,3.64,129,2.857,138,1.638,143,2,145,3.262,285,3.099,286,2.974,318,2.803,354,3.156,363,3.632,382,2.658,403,2.046,422,3.107,437,3.492,458,2.174,564,4.736,575,4.035,662,3.719,699,3.108,762,3.516,802,3.918,850,3.084,893,2.933,932,3.084,936,2.974,1035,3.975,1091,5.897,1092,3.765,1571,2.752,1694,4.035,1698,4.83,1732,3.208,2084,3.414,2468,5.472,3446,6.583,3534,5.797,3738,8.354,4961,6.291,4962,6.291]],["t/1221",[115,4.318,116,4.086,318,4.547,363,3.573,3928,8.974]],["t/1223",[21,4.083,115,4.139,116,3.803,318,5.46,363,3.424,756,4.804,934,4.555,1252,4.459,1995,8.119,3034,7.896]],["t/1225",[2464,6.166]],["t/1228",[115,4.318,116,4.086,318,4.547,363,3.573,390,6.129]],["t/1230",[115,4.295,116,4.048,318,4.505,363,3.554,971,6.129,3016,7.856]],["t/1232",[115,4.318,116,4.086,318,4.547,363,3.573,1353,5.843]],["t/1234",[115,4.318,116,4.086,318,4.547,363,3.573,1379,8.745]],["t/1236",[115,4.318,116,4.086,318,4.547,363,3.573,2339,6.596]],["t/1238",[115,4.295,116,4.048,318,4.505,363,3.554,971,6.129,2981,8.313]],["t/1240",[115,4.295,116,4.048,318,4.505,363,3.554,971,6.129,2973,7.384]],["t/1242",[115,4.318,116,4.086,318,4.547,363,3.573,1982,8.974]],["t/1244",[71,1.605,893,5.498,1995,6.638,2046,6.013,2533,8.878,3147,8.019]],["t/1246",[71,1.605,893,5.498,1995,6.638,2046,6.013,2533,8.878,3147,8.019]],["t/1248",[115,4.318,116,4.086,318,4.547,340,7.134,363,3.573]],["t/1250",[115,3.876,270,7.668,363,3.207]],["t/1252",[2464,6.166]],["t/1254",[2464,6.166]],["t/1256",[2464,6.166]],["t/1258",[2464,6.166]],["t/1260",[29,2.58,30,2.524,32,3.759,39,3.076,71,1.551,98,2.677,129,3.205,138,1.838,162,1.904,171,2.949,200,4.851,263,4.031,283,4.124,395,3.57,407,2.901,421,3.629,432,4.077,437,2.27,479,2.287,491,3.629,520,4.46,522,3.314,527,3.145,550,5.65,610,4.241,741,3.165,751,3.759,796,3.145,813,4.6,855,3.324,1128,4.124,1256,3.66,1263,3.906,1473,4.124,1558,3.226,1559,2.841,1567,5.402,1638,3.034,1775,5.868,1808,6.643,2944,4.6,3020,5.65,3702,5.058,4963,7.058,4964,7.058]],["t/1262",[20,1.665,21,2.848,22,1.586,23,1.444,25,0.644,30,1.744,32,1.953,38,2.8,39,0.606,40,0.838,48,1.27,55,1.507,60,1.583,71,0.286,81,1.001,89,0.994,92,5.049,96,0.736,103,1.37,105,1.221,106,3.526,109,0.994,110,1.334,118,2.223,124,1.275,125,1.858,133,0.899,136,1.418,146,2.229,150,5.784,152,0.931,153,0.703,154,2.551,162,0.423,164,1.328,167,0.703,169,1.176,170,1.501,172,1.005,190,0.825,272,0.703,339,1.746,352,2.996,363,1.986,365,2.168,369,2.621,371,2.284,381,1.275,389,3.528,395,5.732,401,1.543,403,0.684,407,2.723,420,5.639,421,1.886,428,0.909,436,1.11,437,1.179,444,0.639,445,2.755,448,1.629,459,1.243,469,8.154,470,3.19,474,0.736,479,1.58,496,0.98,498,0.805,501,2.885,502,0.961,518,1.798,527,0.937,545,1.329,557,1.829,566,1.039,569,1.317,570,6.065,573,1.064,580,0.98,589,2.907,600,3.335,604,0.949,607,1.176,625,3.037,717,1.258,723,2.195,737,1.474,741,0.943,758,3.11,770,1.329,810,1.543,861,1.13,868,1.583,932,2.391,946,1.349,958,1.543,966,1.644,980,0.943,989,1.039,990,1.292,1000,1.629,1003,2.253,1028,1.258,1037,1.214,1038,2.428,1087,1.164,1098,1.275,1129,1.31,1152,0.92,1218,3.637,1230,1.243,1251,1.214,1276,1.583,1296,1.292,1327,1.629,1361,3.495,1363,1.37,1409,1.543,1410,0.879,1421,0.888,1458,2.095,1465,1.543,1482,1.275,1514,1.31,1565,3.42,1567,5.655,1570,5.926,1599,1.329,1601,5.479,1602,1.829,1611,1.629,1629,1.583,1656,1.275,1732,1.072,1804,1.829,1809,2.919,1825,1.746,1902,1.349,1918,1.243,1998,1.629,2089,1.292,2110,1.164,2174,1.507,2198,3.049,2202,3.806,2208,3.037,2214,3.19,2447,1.474,2579,1.748,2639,2.009,2779,1.445,3012,1.748,3847,6.33,3851,1.349,3866,1.938,4128,1.829,4965,8.298,4966,9.061,4967,4.877,4968,4.877,4969,2.103,4970,1.938,4971,5.382,4972,2.103,4973,2.103,4974,2.103,4975,1.829,4976,2.103,4977,1.683,4978,2.103,4979,3.19,4980,2.103,4981,2.103,4982,2.103,4983,2.103,4984,2.103,4985,2.103,4986,2.103,4987,2.103,4988,2.103,4989,2.103,4990,1.829,4991,2.103,4992,2.103,4993,2.103,4994,2.103,4995,2.103,4996,2.103,4997,2.103,4998,1.938,4999,2.103]],["t/1264",[2464,6.166]],["t/1266",[62,1.748,96,3.213,111,3.676,198,3.095,585,6.784,611,4.091,663,4.434,778,7.987,815,4.34,870,5.244,1574,4.117,1604,7.848,1638,3.946,2072,6.084,4685,5.64,5000,9.181,5001,7.632,5002,9.181]],["t/1268",[20,4.169,105,3.058,111,3.676,133,3.924,143,2.919,351,4.467,589,4.57,621,4.091,721,3.172,813,5.983,933,8.959,966,4.117,1253,4.467,1263,5.081,1313,4.982,2400,5.495,5003,11.191,5004,9.181]],["t/1270",[22,2.751,23,1.921,25,1.949,29,3.221,71,0.866,96,2.227,98,2.413,107,2.472,138,1.657,143,2.023,160,4.374,162,1.281,172,1.745,186,3.522,198,2.971,309,3.834,328,2.128,431,2.72,444,1.935,458,2.199,481,3.219,495,3.858,498,2.437,507,4.374,515,3.441,517,3.03,523,1.971,549,2.337,558,5.414,589,5.433,644,4.532,721,2.199,763,1.993,814,3.595,932,3.12,966,5.139,1001,3.635,1012,3.219,1127,4.321,1202,4.082,1253,4.92,1295,4.669,1558,2.909,1574,3.952,1656,3.858,2095,4.292,2619,5.536,2926,4.931,2927,5.84,4314,5.536,5005,4.669,5006,5.865,5007,5.094]],["t/1272",[20,3.819,25,1.823,28,2.267,29,3.874,64,6.516,71,1.328,89,2.813,110,3.06,123,3.561,162,1.198,198,3.769,328,1.99,337,1.816,417,3.845,422,1.496,431,2.543,432,3.437,433,2.725,445,3.362,523,2.604,528,5.097,589,2.962,596,2.395,623,3.706,624,5.237,662,6.266,721,2.056,741,2.668,763,1.863,815,2.813,818,2.603,855,2.091,932,2.917,966,2.668,1185,4.366,1252,2.794,1313,3.229,1366,3.706,1559,2.395,1574,2.668,1619,3.198,1666,4.366,2045,3.169,2213,3.706,2926,4.611,3001,4.264,3112,4.947,5007,6.731,5008,5.95,5009,7.749,5010,8.81,5011,5.95,5012,5.95,5013,5.95,5014,5.95,5015,5.95,5016,6.731,5017,5.95]],["t/1274",[20,4.002,29,3.989,33,4.651,64,6.829,95,4.829,198,3.679,444,2.68,515,3.441,547,5.653,589,4.387,596,3.547,804,6.466,966,3.952,1127,4.32,1482,5.342,1574,3.952,1619,4.737,2076,7.326,2213,5.489,3018,5.84,5018,8.122,5019,7.326,5020,7.666]],["t/1276",[71,1.293,162,1.912,198,3.202,283,5.549,327,4.181,507,6.528,515,3.708,558,5.835,589,5.687,966,5.122,1253,5.559,1559,3.823,1666,6.969]],["t/1278",[20,4.169,29,3.356,34,5.364,64,7.114,95,5.031,507,6.31,515,3.584,547,5.889,558,5.64,589,4.57,596,3.695,632,6.438,966,4.117,1053,4.889,1127,4.501,1574,4.117,5018,8.461,5021,9.181,5022,9.181,5023,9.181]],["t/1280",[23,1.008,25,2.141,29,3.689,33,2.44,44,2.733,61,1.653,71,1.445,106,2.971,125,1.762,166,3.565,198,2.357,300,4.41,309,1.754,337,1.411,346,2.641,351,2.25,382,1.954,433,2.265,445,2.612,465,3.481,466,3.844,474,1.618,479,1.498,497,1.475,517,2.201,522,3.282,523,2.165,547,2.966,550,3.701,558,2.84,565,2.284,566,2.284,589,2.302,596,3.393,606,2.358,615,3.242,623,2.88,721,1.598,751,2.462,752,1.788,756,2.339,776,3.178,804,3.392,822,4.261,882,2.127,966,2.073,1000,3.583,1018,2.462,1041,2.767,1160,4.903,1198,2.612,1251,4.038,1275,2.641,1296,2.84,1305,3.064,1316,2.921,1357,3.242,1410,1.932,1412,2.419,1482,2.803,1547,3.583,1557,2.559,1558,4.295,1567,2.641,1570,2.767,1574,2.073,1576,2.701,1643,4.531,1714,3.392,1802,3.313,1825,4.014,1959,3.583,2023,2.803,2095,3.118,2213,2.88,2347,2.966,2393,3.481,2399,3.313,2458,3.844,2532,2.641,2910,3.313,3001,3.313,3738,3.844,4903,4.261,5005,3.392,5006,4.261,5007,3.701,5009,4.261,5010,5.812,5019,3.844,5020,4.022,5024,4.261,5025,7.769,5026,4.261,5027,4.022,5028,4.624,5029,7.788,5030,4.624,5031,4.624,5032,4.022,5033,4.624]],["t/1282",[2464,6.166]],["t/1284",[2464,6.166]],["t/1286",[2464,6.166]],["t/1288",[2464,6.166]],["t/1290",[2464,6.166]],["t/1292",[28,3.413,71,1.219,164,2.44,221,5.361,292,3.722,337,2.734,479,2.902,498,3.429,514,3.48,540,6.597,611,3.991,724,5.008,741,4.016,855,3.147,932,4.391,1392,6.517,2527,6.94,3930,7.899,5034,7.446,5035,8.254]],["t/1294",[48,2.41,316,4.075,337,2.826,351,4.505,510,5.766,752,3.579,855,3.253,1392,7.164,1546,6.635,1571,4.051,3930,8.683,5034,10.073,5036,9.258]],["t/1296",[28,2.976,61,2.793,62,2.395,71,1.063,170,2.599,221,6.051,316,4.45,337,2.384,369,4.198,377,4.051,461,3.319,540,6.71,584,4.675,585,4.735,1028,6.051,1206,5.597,1396,5.881,1546,5.597,1825,3.719,1969,5.09,2527,6.052,3930,7.245,4595,7.198,5037,7.811,5038,7.811,5039,7.811,5040,10.11,5041,7.198]],["t/1298",[25,0.275,51,0.666,54,0.53,62,1.957,71,0.122,73,0.547,138,0.439,170,1.958,171,0.705,284,0.292,288,0.701,361,2.005,369,7.26,395,0.454,407,0.369,417,0.943,426,1.498,510,0.558,540,0.537,569,3.769,598,0.537,752,0.347,769,0.643,770,0.567,867,0.375,882,0.413,884,0.718,966,1.354,1028,0.537,1336,0.551,1390,1.31,1458,2.048,1465,0.658,1521,1.184,1641,0.695,1648,1.083,1945,5.286,1969,0.584,2088,0.643,2122,0.469,2140,1.403,2259,2.51,2609,0.826,2660,0.643,2978,0.567,2990,1.468,3047,0.629,3059,0.487,3091,0.695,3113,0.745,3117,0.745,3453,0.643,3469,1.403,3562,6.135,3681,0.826,4947,0.826,5041,9.961,5042,0.897,5043,10.809,5044,3.02,5045,0.897,5046,3.586,5047,6.067,5048,3.586,5049,1.688,5050,2.391,5051,2.391,5052,2.391,5053,8.525,5054,0.897,5055,0.897,5056,1.688,5057,0.897,5058,0.897,5059,0.897,5060,0.897,5061,0.897,5062,0.897,5063,0.897,5064,0.897,5065,0.897,5066,1.688,5067,1.688,5068,1.688,5069,1.688,5070,1.688,5071,0.897,5072,0.897,5073,0.897,5074,0.897,5075,1.688,5076,9.091,5077,1.688,5078,2.391,5079,2.391,5080,0.897,5081,3.02,5082,0.897,5083,0.897,5084,0.897,5085,0.897,5086,2.391,5087,2.391,5088,2.391,5089,2.391,5090,1.688,5091,1.688,5092,1.688,5093,1.688,5094,1.688,5095,1.688,5096,1.688,5097,1.688,5098,1.688,5099,1.688,5100,1.688,5101,1.688,5102,0.897,5103,2.391,5104,3.02,5105,1.688,5106,1.688,5107,3.02,5108,4.098,5109,4.098,5110,2.391,5111,0.897,5112,0.897,5113,0.897,5114,1.688,5115,2.391,5116,2.391,5117,0.897,5118,2.391,5119,0.897,5120,0.897,5121,0.897,5122,0.897,5123,0.897,5124,0.897,5125,0.897,5126,0.897,5127,0.897,5128,0.897,5129,4.563,5130,0.897,5131,0.897,5132,0.897,5133,0.897,5134,1.688,5135,0.897,5136,0.897,5137,1.688,5138,0.897,5139,0.897,5140,0.897,5141,0.897,5142,0.897,5143,1.688,5144,7.821,5145,0.897,5146,0.897,5147,0.897,5148,0.897,5149,0.897,5150,0.897,5151,0.897,5152,0.897,5153,0.897,5154,0.897,5155,0.897,5156,0.897,5157,0.897,5158,0.897,5159,2.391,5160,0.897,5161,0.897,5162,1.688,5163,1.688,5164,0.897,5165,0.897,5166,0.897,5167,0.897,5168,0.897,5169,0.897,5170,0.897,5171,0.897,5172,0.897,5173,0.897,5174,0.897,5175,1.688,5176,1.688,5177,0.897,5178,0.897,5179,0.897,5180,0.897,5181,0.897,5182,0.897,5183,0.897,5184,0.897,5185,0.897,5186,0.897,5187,0.897,5188,0.897,5189,3.586,5190,4.098,5191,2.391,5192,0.897,5193,0.897,5194,0.897,5195,0.897,5196,0.897,5197,0.897,5198,0.897,5199,1.688,5200,0.897,5201,0.897,5202,3.02,5203,3.02,5204,3.586,5205,3.02,5206,3.02,5207,3.02,5208,3.02,5209,2.627,5210,3.02,5211,3.02,5212,3.02,5213,2.391,5214,2.391,5215,1.688,5216,1.688,5217,0.897,5218,2.391,5219,3.02,5220,3.02,5221,3.02,5222,3.02,5223,1.688,5224,1.688,5225,3.02,5226,3.02,5227,0.897,5228,0.897,5229,0.897,5230,0.897,5231,0.897,5232,0.897,5233,0.897,5234,0.897,5235,0.897,5236,0.897,5237,0.897,5238,0.897,5239,0.897,5240,1.688,5241,1.688,5242,1.688,5243,1.688,5244,1.688,5245,1.688,5246,1.688,5247,6.658,5248,0.897,5249,0.897,5250,0.897,5251,0.897,5252,0.897,5253,0.897,5254,0.897,5255,0.897,5256,0.897,5257,0.897,5258,0.897,5259,0.897,5260,0.897,5261,0.897,5262,0.897,5263,0.897,5264,0.897,5265,0.897,5266,0.897,5267,0.897,5268,0.897,5269,0.897,5270,0.897,5271,1.688,5272,0.897,5273,0.897,5274,0.897,5275,0.897,5276,1.688,5277,0.897,5278,0.897,5279,0.897,5280,0.897,5281,0.897,5282,0.897,5283,1.688,5284,0.897,5285,0.897,5286,0.897,5287,0.897,5288,0.897,5289,0.897,5290,1.688,5291,0.897,5292,0.897,5293,0.826,5294,4.098,5295,0.897,5296,0.897,5297,0.897,5298,0.897,5299,0.897,5300,0.897,5301,0.897,5302,1.688,5303,1.688,5304,1.688,5305,1.688,5306,3.586,5307,0.897,5308,0.897,5309,0.897,5310,0.897,5311,0.897,5312,0.897,5313,0.897,5314,0.897,5315,1.688,5316,1.688,5317,0.897,5318,0.897,5319,0.897,5320,0.897,5321,0.897,5322,0.897,5323,0.897,5324,0.897,5325,0.897,5326,0.897,5327,0.897,5328,0.897,5329,0.897,5330,0.897,5331,0.897,5332,0.897,5333,0.897,5334,0.897,5335,0.897,5336,0.897,5337,0.897,5338,0.897,5339,0.826,5340,0.897,5341,0.897,5342,0.897,5343,0.897,5344,0.897,5345,0.897,5346,0.897,5347,0.897]],["t/1300",[62,2.364,71,1.013,167,2.488,170,3.108,198,2.508,221,5.862,272,2.488,316,4.311,474,2.604,498,2.849,510,4.634,540,6.964,752,2.877,884,7.841,965,4.701,1206,5.332,1392,4.399,1521,7.679,1523,7.019,1969,6.383,5348,7.441,5349,9.673,5350,9.795,5351,6.857,5352,7.441]],["t/1302",[62,1.84,170,2.968,221,5.785,316,4.254,1521,6.778,5349,9.597,5351,8.907,5353,9.665,5354,11.544,5355,9.665,5356,9.665]],["t/1304",[762,3.673,967,5.185,1677,8.133,1678,8.133,1679,8.402]],["t/1306",[23,1.876,37,4.626,39,2.482,62,1.639,105,2.866,246,3.908,309,3.264,515,3.36,521,4.318,564,6.479,611,3.835,762,3.011,855,3.024,1128,5.028,1159,6.668,1264,7.931,1382,7.931,1436,3.883,1631,4.812,1676,6.167,1722,7.154,1983,5.217,2073,5.804,2076,7.154,2408,6.314,3949,7.154,5357,7.154,5358,8.606]],["t/1308",[19,1.517,30,1.977,31,3.125,48,1.44,51,2.181,106,2.35,138,2.078,139,2.596,167,1.85,246,3.625,272,1.85,274,3.27,282,2.477,284,1.799,313,2.615,328,1.85,330,3.73,340,3.31,363,1.658,374,2.391,382,3.372,383,2.919,384,4.428,390,2.844,403,1.799,414,2.465,422,1.391,432,3.194,433,1.792,435,4.164,491,2.844,497,1.765,501,2.732,582,3.353,606,2.82,610,2.48,762,1.935,904,3.964,1002,2.286,1038,2.753,1353,2.711,1558,2.528,1559,2.226,1567,3.159,1639,3.372,1642,2.118,1715,4.428,1824,4.164,1877,4.663,1940,2.973,1982,4.164,1995,3.665,2146,3.604,2339,3.061,2447,3.879,2716,4.428,2814,4.164,2973,3.445,2978,3.495,2981,3.879,2989,3.801,3016,3.665,3021,4.164,3344,4.428,3473,4.428,3824,4.058,3828,3.801,3835,5.097,3840,4.598,3843,4.598,3921,4.428,3923,4.286,3924,4.428,3925,4.428,3926,5.097,3927,4.598,3928,4.164,3929,4.811,3930,3.964,3932,5.097,3933,5.097,3935,5.097,4139,5.097,5359,4.811,5360,5.097,5361,4.058,5362,5.531,5363,5.097,5364,4.811,5365,5.531,5366,4.598]],["t/1310",[328,3.578,521,5.369,677,8.566]],["t/1312",[273,6.864,1603,6.664,2605,8.056]],["t/1314",[19,1.98,20,2.192,23,1.574,32,2.57,34,2.82,38,2.314,39,1.392,46,2.757,48,1.257,58,2.619,67,2.645,69,3.846,71,1.178,75,3.514,89,2.282,102,3.459,105,2.405,106,2.051,107,1.875,151,2.57,152,2.138,162,1.454,164,1.315,186,2.671,197,2.699,198,3.237,241,4.152,282,1.91,328,2.415,397,2.699,403,1.57,406,1.558,421,2.482,437,1.552,458,2.989,479,1.564,491,2.482,496,3.367,513,2.57,514,1.875,515,2.819,549,1.772,565,2.384,568,3.385,595,2.282,716,4.307,722,4.17,741,3.238,756,2.441,762,3.36,786,3.385,792,2.425,902,1.534,1012,3.652,1075,4.997,1089,2.422,1096,2.926,1126,2.619,1129,3.006,1188,3.198,1196,3.74,1275,4.124,1306,2.965,1482,2.926,1550,3.864,1570,2.889,1576,2.82,1577,4.012,1628,2.854,1640,5.298,1672,3.096,1682,3.459,1684,4.012,1688,4.17,1689,4.17,1696,4.963,1706,3.096,1781,3.541,1982,3.634,2046,2.461,2622,2.965,3010,3.096,5339,4.448,5367,4.827,5368,4.448,5369,4.448,5370,4.199,5371,4.827,5372,4.827,5373,4.827]],["t/1316",[139,3.289,284,3.289,328,3.381,762,3.538,955,5.009,1336,6.21,1676,7.245,5374,10.11]],["t/1318",[39,2.788,246,4.389,363,2.897,382,4.084,407,3.973,422,2.431,533,3.004,542,5.349,749,3.258,1012,4.889,1252,4.538,1469,5.647,1698,3.952,2096,7.489]],["t/1320",[328,3.544,337,3.234,521,5.317,677,8.483]],["t/1322",[2464,6.166]],["t/1324",[762,3.673,967,5.185,1677,8.133,2453,6.632,5375,10.496]],["t/1326",[19,2.127,25,2.376,30,2.773,32,4.13,76,6.268,105,2.583,138,2.019,139,2.523,152,3.435,197,2.42,198,2.615,241,3.353,282,2.052,284,3.274,290,3.592,339,3.693,417,3.058,521,3.891,561,4.25,565,4.971,621,3.456,762,2.714,764,3.831,792,2.604,1012,3.923,1096,4.701,1392,4.585,1559,3.121,1573,3.058,1628,4.585,1682,5.558,1688,4.479,1689,4.479,1692,6.01,1711,4.764,5364,6.747,5376,7.756,5377,7.756,5378,7.756]],["t/1329",[30,2.556,45,3.479,66,3.206,67,3.918,71,0.974,73,2.317,132,3.617,133,3.056,146,3.268,147,5.383,153,2.391,191,5.883,282,1.891,285,3.381,361,3.998,516,5.944,518,3.505,597,5.014,618,4.914,750,8.925,756,3.617,763,2.239,869,3.808,1002,3.943,1078,4.392,1218,4.453,1230,4.227,1232,5.014,1256,4.947,1433,5.014,1559,2.878,1639,3.021,1711,7.036,1732,3.646,1836,6.22,1844,4.586,2149,3.312,2947,5.383,3948,5.944,4246,5.724,5379,5.124,5380,7.15,5381,5.383,5382,7.15]],["t/1332",[22,2.615,23,1.854,25,1.853,29,2.211,30,2.162,37,3.251,39,1.744,52,4.157,53,3.942,61,3.041,65,7.4,67,3.314,75,4.139,96,2.116,98,2.294,103,3.942,123,3.62,153,3.762,164,2.317,172,2.332,181,3.767,224,1.999,246,2.747,282,1.6,290,2.801,326,2.9,327,2.662,359,5.091,406,2.746,407,2.486,433,1.96,437,1.945,458,2.09,502,2.765,517,2.88,523,1.873,547,5.456,565,4.202,566,2.988,587,3.11,647,2.615,815,2.86,887,3.88,1160,4.241,1193,3.382,1353,2.965,1357,4.241,1366,3.767,1550,4.842,1559,2.434,1622,5.262,1628,5.029,1650,5.262,1669,3.493,1672,3.88,1690,5.637,1995,4.008,2691,3.534,2943,5.262,3000,6.412,3828,4.157,5383,6.048,5384,5.574,5385,6.048]],["t/1334",[19,2.466,23,1.96,48,1.706,70,3.399,71,1.577,75,5.377,76,4.081,95,3.591,107,2.546,108,4.934,125,2.497,140,3.829,160,4.504,162,2.067,186,3.627,272,2.192,282,1.734,292,2.723,359,3.922,407,2.694,420,5.078,461,2.785,493,2.867,508,3.237,515,2.559,517,3.12,523,2.785,561,3.591,610,4.033,722,3.785,763,2.052,890,3.399,1010,3.523,1039,4.141,1066,4.595,1095,4.141,1127,3.213,1239,4.42,1559,2.638,1628,3.874,1676,4.696,1684,5.448,1732,3.342,1752,4.204,1776,4.026,2458,5.448,3000,4.271,3828,4.504,4378,6.039,4738,4.595,5369,6.039,5386,6.039,5387,6.553,5388,5.448,5389,6.553]],["t/1337",[29,3.301,61,3.228,67,4.948,142,3.393,152,3.999,164,2.46,172,3.038,326,4.33,339,4.299,363,2.707,382,3.815,406,2.915,587,5.697,803,3.904,1297,6.206,1669,5.215,1690,5.984,1713,6.799,5390,9.03]],["t/1340",[39,2.838,152,4.357,246,4.468,272,3.29,328,3.29,339,4.684,340,5.888,407,4.044,445,5.559,721,3.4,1567,5.619,1570,5.888]],["t/1342",[39,2.763,166,4.886,246,4.351,328,3.204,339,4.562,433,3.105,448,7.424,512,7.214,792,3.217,1152,4.192,1308,5.413,1421,4.048,2784,8.229,5391,9.581]],["t/1344",[39,2.626,40,3.627,164,2.48,246,4.135,340,5.449,363,2.729,417,3.59,522,4.275,570,7.055,648,5.258,762,3.186,972,3.703,1003,5.593,1436,4.108,1567,5.2,1570,5.449,1628,5.383,1629,6.855,1761,6.385,2874,6.68,5392,9.105]],["t/1346",[44,4.933,48,2.172,76,5.197,105,2.779,138,2.172,162,1.68,166,4.255,246,3.79,271,3.358,313,3.945,363,2.501,433,2.704,458,2.883,491,4.291,522,3.918,565,4.122,722,4.819,1038,4.154,1258,4.154,1409,6.122,1479,5.851,1558,3.814,1640,6.122,1682,5.98,1688,6.091,1689,6.091,1692,6.466,2046,4.255,3931,6.937,5393,7.69]],["t/1349",[23,2.164,29,1.889,39,1.49,42,2.804,44,3.055,48,1.977,66,2.317,69,4.045,70,2.68,71,1.226,105,3,138,2.345,139,1.681,143,1.643,162,1.529,167,1.728,197,3.567,198,3.036,241,4.292,261,3.485,262,3.055,263,4.338,285,1.831,292,2.147,365,3.055,403,1.681,407,2.124,417,2.038,422,2.265,432,2.984,433,1.674,434,2.135,458,2.624,495,3.132,497,1.649,509,3.485,523,1.6,610,2.317,621,2.302,630,3.019,716,3.781,722,2.984,740,2.889,762,1.808,803,2.234,845,3.485,993,3.093,1002,2.135,1010,2.777,1038,2.572,1098,3.132,1126,2.804,1128,3.019,1196,4.004,1253,2.514,1258,2.572,1355,3.89,1392,3.055,1540,3.367,1573,2.038,1584,2.919,1597,4.136,1676,3.703,1682,5.443,1696,5.22,1698,2.113,1719,3.174,1777,3.218,1983,3.132,2070,4.004,2125,2.951,2387,3.89,2389,3.89,2399,3.703,2406,3.89,2862,2.951,3707,4.495,4061,4.295,5357,4.295,5394,5.167,5395,4.762,5396,5.167,5397,4.004]],["t/1351",[19,2.948,71,1.464,108,8.096,162,1.732,197,3.355,241,4.649,422,2.704,497,2.746,516,7.154,621,3.835,814,4.862,1171,6.167,1290,5.217,1313,4.67,1877,5.028,2125,4.915,3994,9.91,5398,8.606,5399,7.931,5400,8.606,5401,8.606]],["t/1353",[28,3.484,43,3.396,44,3.969,71,0.914,105,2.236,162,2.093,167,2.245,170,2.35,172,2.507,188,3.282,197,2.095,224,2.218,241,2.903,273,4.306,282,2.75,354,3.368,407,2.76,451,3.575,508,4.517,528,4.07,549,2.465,571,4.375,577,3.834,583,4.926,638,2.134,741,3.01,763,2.102,796,2.992,815,3.174,934,4.986,1000,5.202,1122,3.396,1258,4.552,1448,4.124,1521,4.708,1668,3.969,1690,4.449,1712,3.643,1714,4.926,1715,5.374,1719,4.124,2235,3.419,2639,3.678,2660,4.811,2909,4.375,2946,5.202,2952,5.84]],["t/1355",[21,2.242,22,2.255,23,1.137,38,2.501,48,1.991,56,2.242,58,2.83,71,0.71,73,2.934,96,1.825,98,1.978,120,3.162,133,2.229,137,2.638,143,1.658,162,1.539,167,1.744,172,1.43,189,3.012,190,2.047,197,2.386,198,2.578,223,2.778,241,2.255,273,3.346,274,3.084,275,2.804,282,2.395,292,2.168,300,2.729,316,2.296,432,4.417,433,1.69,458,3.129,498,1.997,523,2.369,565,2.577,573,2.638,582,4.636,606,4.618,762,3.169,808,4.042,846,3.518,887,3.346,1012,4.58,1082,4.537,1083,4.832,1096,3.162,1117,2.577,1122,2.638,1124,3.827,1152,2.282,1178,4.807,1193,2.916,1245,4.336,1256,2.705,1278,4.042,1281,4.175,1338,4.537,1421,2.204,1470,2.778,1573,3.016,1640,3.827,1668,3.084,1670,4.336,1682,3.738,1714,3.827,1924,4.175,2096,4.042,2480,3.658,2637,3.658,2945,4.336,2966,3.927,3322,4.537,3512,4.807,4713,4.807,5364,4.537,5366,6.358,5402,5.216,5403,5.216,5404,3.456,5405,4.336,5406,5.216,5407,5.216,5408,4.175,5409,4.537,5410,5.216,5411,7.648]],["t/1357",[285,3.456,328,3.261,648,5.632,762,3.412,955,4.12,1027,4.457,1336,5.99,1353,4.78,1676,6.988,1841,5.509,2778,6.838,5412,9.751,5413,9.751]],["t/1359",[71,1.305,137,4.846,154,5.012,458,3.968,491,4.927,1084,6.585,1570,6.873,1629,7.214,1761,6.719,2699,6.244,2784,8.229,5414,6.866]],["t/1361",[762,3.673,967,5.185,1709,5.397,2452,7.902,3325,7.214]],["t/1363",[21,3.406,22,3.426,23,1.193,29,2.002,30,1.958,32,2.916,39,2.685,44,3.237,48,2.063,59,2.89,66,4.175,71,0.746,73,2.568,96,1.916,97,3.569,105,1.824,162,2.399,164,1.492,188,2.158,197,1.708,198,1.846,241,2.368,246,2.487,273,3.512,282,1.449,349,2.792,363,1.641,402,3.128,406,1.768,422,1.377,434,2.263,451,2.916,458,3.217,479,1.774,496,2.553,509,3.693,571,6.068,585,3.319,606,2.792,624,3.41,638,1.741,756,2.77,762,2.773,803,2.368,808,4.243,888,6.068,902,1.741,953,4.384,978,3.46,1002,2.263,1085,2.89,1152,2.396,1217,3.763,1261,4.243,1322,4.552,1483,4.123,1540,3.569,1552,4.552,1631,3.062,1672,3.512,1704,3.512,1786,4.018,1788,4.384,1840,2.519,2006,3.763,2012,3.924,2081,3.84,2409,3.41,2637,3.84,2946,4.243,3918,3.094,4130,4.243,5209,6.893,5415,5.046,5416,4.123,5417,4.764,5418,4.384]],["t/1365",[19,1.631,23,1.297,29,3.074,96,2.942,105,1.982,111,2.382,142,1.823,143,1.892,152,2.635,159,3.878,162,1.198,197,1.856,198,2.006,224,2.779,271,2.395,277,4.893,282,1.574,291,2.185,292,2.473,300,3.113,318,3.747,363,2.521,382,2.514,414,2.651,417,2.346,433,1.928,434,2.459,444,1.809,514,2.312,533,1.85,596,3.384,603,2.962,638,2.673,741,2.668,749,2.006,762,3.709,763,2.633,808,4.611,815,2.813,887,3.817,946,3.817,993,5.033,1012,3.01,1070,4.611,1118,4.366,1128,3.476,1218,3.706,1258,2.962,1363,3.878,1483,4.48,1573,2.346,1639,2.514,1642,3.22,1669,4.856,1698,2.433,1699,4.947,1703,5.48,1704,3.817,1731,3.362,1776,3.655,1842,3.26,1877,3.476,2062,4.611,3411,4.173,3689,4.947,3921,4.763,4702,4.947,5419,5.95]],["t/1368",[28,1.519,29,2.809,30,1.425,40,2.485,48,1.038,61,1.425,67,2.184,71,1.183,75,1.94,92,2.085,95,3.418,105,2.078,110,2.27,112,1.898,116,1.596,138,1.038,139,1.297,142,1.911,143,1.267,152,3.403,153,1.333,161,1.639,162,1.256,166,2.033,168,1.484,186,2.206,188,1.086,197,2.397,198,2.103,241,4.079,246,1.81,271,1.604,282,1.65,284,3.069,285,1.413,286,1.885,349,2.033,351,1.94,363,2.605,381,2.416,406,2.48,422,1.003,433,1.292,458,1.377,468,2.65,515,2.435,522,1.872,542,2.206,549,1.464,581,3.191,589,1.984,596,1.604,614,1.846,619,1.755,638,2.443,718,2.143,719,3.081,739,2.229,740,2.229,762,1.395,763,1.248,764,3.081,792,1.338,803,2.697,816,2.357,855,3.054,874,2.163,902,1.267,955,1.684,966,2.797,972,1.621,975,2.302,991,2.386,1018,2.123,1027,1.822,1038,4.327,1053,2.123,1078,2.449,1103,2.795,1111,2.598,1117,1.969,1121,2.598,1122,2.016,1126,2.163,1187,2.795,1217,2.74,1275,2.277,1322,3.314,1377,2.184,1417,2.642,1558,1.822,1573,1.572,1600,3.688,1628,2.357,1642,3.328,1672,2.557,1698,2.55,1744,2.557,1767,2.598,1776,2.449,1777,2.483,1780,2.449,1782,3.524,1794,3.089,1879,2,1969,2.598,1995,2.642,2001,3.001,2125,2.277,2230,3.191,2245,2.74,2288,2.795,2365,3.191,2668,2.795,2997,3.418,4115,4.993,4116,4.993,5016,3.191,5420,3.986,5421,3.314,5422,3.986,5423,6.237]],["t/1370",[30,3.582,56,4.306,66,4.492,96,3.505,129,4.549,246,4.549,1027,4.579,1266,7.025,1354,6.757,1844,6.426]],["t/1372",[29,3.247,112,4.23,129,4.035,143,2.824,197,3.712,241,3.841,318,5.537,363,2.663,414,3.959,422,2.758,431,3.797,515,3.469,522,4.171,596,4.414,993,5.317,1121,5.79,4702,7.386]],["t/1374",[29,2.41,33,3.479,63,4.837,71,1.402,73,2.926,107,2.561,112,3.139,152,2.92,197,2.057,241,2.85,282,2.389,283,3.852,287,3.725,326,3.161,334,4.623,363,1.976,414,2.938,436,5.847,527,2.938,596,3.635,610,4.049,663,5.351,719,3.257,756,3.335,766,3.852,867,3.773,936,3.117,1013,4.166,1027,3.013,1028,3.946,1697,4.296,1732,3.362,1878,3.479,2048,7.856,2180,5.481,2218,5.278,2418,4.964,2485,5.735,2487,5.108,2620,6.076,2691,3.852,2925,5.735,3291,6.076,3375,7.472,3637,5.735,4702,5.481,5424,6.593,5425,6.593,5426,6.593,5427,6.593]],["t/1377",[30,2.211,38,2.966,61,2.211,69,5.303,71,1.176,73,2.004,95,3.389,96,2.164,107,3.869,112,2.945,152,2.739,154,3.235,290,2.865,379,4.25,383,3.264,406,1.996,435,4.656,596,2.489,663,5.478,730,3.799,763,3.118,867,4.504,967,3.055,1053,5.741,1559,2.489,1573,2.439,1603,3.852,1619,3.324,1639,2.613,1642,2.368,1696,6.844,1772,3.908,1824,4.656,2451,3.799,3010,3.967,3204,4.656,4685,6.967,5293,5.7,5360,5.7,5428,4.656,5429,6.185,5430,5.7,5431,6.185,5432,6.185,5433,6.185,5434,9.378,5435,5.38,5436,6.185,5437,6.185,5438,6.185,5439,6.185,5440,6.185]],["t/1379",[40,3.8,66,4.278,73,2.317,111,2.863,162,1.439,272,2.391,282,1.891,290,3.312,433,2.317,521,3.588,529,4.227,624,5.942,740,3.998,741,3.206,762,2.502,1002,2.955,1421,3.021,1521,5.014,1558,4.361,1657,4.823,1686,4.823,1697,4.66,1698,2.924,1704,4.586,1709,3.677,1840,3.29,2147,4.453,2409,4.453,2451,7.036,2973,4.453,3016,4.738,3496,7.693,5441,5.383,5442,10.381,5443,7.15,5444,7.15,5445,7.15,5446,6.589,5447,7.15,5448,7.15,5449,7.15]],["t/1381",[139,3.117,172,2.627,241,4.142,287,5.413,638,3.046,783,7.214,1235,5.967,2466,8.83,2690,8.83,5450,9.581,5451,9.581,5452,9.581,5453,9.581,5454,9.581,5455,9.581]],["t/1383",[19,2.271,23,1.269,25,1.784,29,3.027,33,3.074,39,1.68,48,1.516,71,1.128,92,3.047,105,3.496,110,2.119,111,2.332,115,2.11,130,4.174,139,2.694,162,1.667,167,2.77,172,1.597,188,3.301,189,4.783,190,2.285,218,3.795,282,1.541,285,2.064,337,1.777,406,1.88,414,2.595,434,2.407,436,3.074,444,1.771,458,2.012,493,2.548,497,1.859,533,1.81,546,2.564,561,3.191,589,2.899,596,2.344,611,2.595,614,2.698,621,2.595,632,4.084,650,2.813,754,4.084,800,3.486,874,3.16,890,3.02,955,2.461,1036,2.946,1075,3.364,1121,3.795,1187,4.084,1266,4.084,1304,4.003,1438,4.662,1559,2.344,1573,2.297,1639,2.461,1692,4.513,1706,5.312,1712,3.16,1893,3.859,2089,3.578,2760,4.385,3010,3.736,5370,5.066,5456,5.824,5457,5.066,5458,5.824,5459,4.662,5460,5.824]],["t/1385",[23,1.89,33,4.578,38,5.182,71,1.181,162,1.746,285,3.83,353,4.901,363,2.6,397,4.85,529,5.128,740,4.85,955,3.665,1111,5.653,1121,5.653,1129,5.402,1421,3.665,1729,5.258,1795,6.53,1841,4.901,2022,7.211,2474,7.993,5461,7.993,5462,8.674,5463,8.674,5464,8.674]],["t/1387",[38,3.772,40,4.481,111,3.15,139,2.559,164,2.143,197,2.454,198,3.424,241,3.401,282,2.687,340,4.708,352,6.91,377,4.08,379,7.731,444,2.392,458,3.51,479,2.549,493,3.442,515,3.071,741,3.527,762,2.753,1300,5.772,1558,3.596,1564,3.251,1593,5.213,1599,4.971,1603,4.899,1704,5.046,1729,4.769,1986,6.096,3062,5.772,5465,7.867]],["t/1389",[22,4.142,26,6.462,29,3.502,37,6.173,40,3.817,45,4.662,102,6.866,112,4.562,118,5.808,496,4.468,589,4.77,743,5.598,2161,6.719,2779,6.585]],["t/1391",[21,3.114,22,4.672,37,3.894,41,6.614,42,3.931,48,1.886,70,3.757,274,4.283,300,3.79,316,3.189,434,2.994,458,3.325,498,2.774,501,3.579,540,4.336,815,3.425,889,5.315,972,2.946,983,6.271,990,4.45,1010,3.894,1117,4.754,1128,4.232,1139,5.613,1140,4.577,1152,3.17,1251,4.184,1252,3.401,1355,5.454,1377,3.969,1378,5.191,1540,4.721,1657,4.886,1668,4.283,1670,6.023,1704,4.647,2086,4.512,2389,5.454,2770,6.023,3336,5.315,3918,4.093,5466,7.244,5467,6.676,5468,6.676,5469,5.799,5470,6.023]],["t/1393",[762,3.673,967,5.185,2451,6.447,2453,6.632,4401,8.726]],["t/1395",[25,2.678,31,4.94,32,4.656,69,4.656,105,2.912,251,4.387,288,3.633,318,3.896,432,5.049,433,2.833,434,3.613,515,3.413,521,4.387,762,3.059,792,2.935,1096,5.3,1126,4.744,1160,6.131,1314,5.169,1691,8.057,1692,6.774,1693,3.92,1694,5.608,1695,7.605,1696,6.009,1697,5.697]],["t/1397",[23,2.217,51,2.539,112,3.065,138,1.676,142,1.972,143,2.047,152,2.851,197,3.591,198,3.698,241,2.784,273,4.13,282,2.35,286,3.044,300,3.368,363,1.93,382,2.72,406,2.078,407,2.647,422,2.234,434,3.672,762,4.027,763,3.186,764,3.18,792,2.162,946,4.13,1103,4.515,1126,3.494,1218,4.01,1258,3.205,1573,4.012,1639,2.72,1642,3.402,1669,5.131,1693,3.984,1694,5.699,2491,5.352,2691,3.761,2834,5.352,3411,4.515,3921,5.154,4687,5.933,5471,6.438,5472,6.438,5473,6.438,5474,5.352,5475,6.438,5476,6.438]],["t/1400",[19,2.04,21,2.16,32,3.963,34,5.177,38,2.41,39,1.449,58,4.038,61,1.797,62,0.957,66,2.253,69,3.963,71,1.334,75,3.621,105,1.674,107,1.952,117,2.606,138,2.55,139,1.635,162,1.012,171,4.093,186,4.118,257,3.783,261,5.976,262,5.238,263,5.061,282,2.344,309,1.906,330,3.389,354,2.521,365,2.971,382,2.123,390,2.584,414,2.239,421,3.826,434,2.077,444,1.528,458,3.385,460,2.936,461,2.135,515,2.905,523,1.556,524,3.524,542,2.781,558,3.087,561,2.753,584,3.008,763,1.574,796,2.239,916,3.524,966,2.253,987,3.894,1018,2.676,1044,2.676,1103,3.524,1258,2.502,1287,4.371,1300,3.687,1355,3.783,1412,3.892,1567,5.061,1628,2.971,1631,2.81,1661,4.631,1738,2.482,1796,3.687,1829,3.568,1840,2.312,2023,3.046,2065,3.524,2185,3.275,2405,3.894,2906,3.454,3020,4.023,3745,3.687,3828,3.454,3925,4.023,3949,4.178,4060,3.389,5408,4.023,5477,4.631,5478,5.025,5479,5.025,5480,4.371,5481,3.275,5482,4.371]],["t/1402",[23,1.047,29,2.631,38,2.304,39,1.386,43,2.431,46,2.745,71,1.175,104,3.036,110,1.749,125,1.831,129,2.182,137,2.431,138,1.874,142,2.205,143,1.528,152,4.545,162,1.737,172,1.318,188,1.96,197,3.583,198,2.909,241,3.731,246,4.351,272,1.607,282,1.904,284,2.341,285,1.703,318,3.207,326,3.451,328,1.607,363,2.157,406,1.551,414,2.141,422,2.17,432,2.775,433,1.557,458,1.66,493,2.103,498,1.84,522,4.051,527,2.141,596,2.897,599,2.583,606,2.451,638,1.528,721,1.66,762,2.518,763,2.702,803,2.078,815,2.272,855,2.529,902,1.528,960,3.082,980,2.155,1012,2.431,1111,3.132,1126,2.608,1128,2.807,1188,3.184,1218,2.993,1322,3.995,1584,2.715,1593,3.184,1637,4.429,1656,2.913,1694,3.082,1697,3.132,1704,3.082,1724,2.775,1738,2.374,1802,5.158,1878,2.536,2107,3.526,2149,2.226,2409,2.993,2779,3.303,2784,3.444,2879,3.995,2944,3.132,3031,4.429,3768,4.18,3769,3.847,3770,4.429,5366,3.995,5483,4.429,5484,4.806,5485,4.429,5486,4.18]],["t/1405",[23,1.89,129,3.939,143,2.757,168,3.229,172,2.378,197,3.955,198,2.924,241,3.75,318,5.245,328,2.901,406,2.8,407,3.565,422,2.718,762,3.035,860,5.191,1690,5.748,1697,5.653,1738,4.285,1879,4.352,2046,4.423]],["t/1407",[61,3.151,62,2.078,314,5.653,595,4.166,692,6.315,700,7.055,771,5.922,902,2.802,936,4.166,997,5.944,1027,4.028,2052,8.122,2055,5.21,3211,7.666,3356,8.122,3745,6.466,4857,7.666,4875,8.122,5487,10.914,5488,8.813,5489,8.813,5490,8.813]],["t/1409",[138,2.786,663,5.168,5359,9.308]],["t/1411",[44,3.303,70,2.898,71,1.402,96,2.813,107,2.171,138,2.452,142,1.711,152,2.474,246,2.537,274,4.753,276,4.004,277,2.803,283,4.697,291,2.051,363,2.823,422,1.405,433,1.811,435,4.207,436,5.436,519,3.264,542,3.092,560,4.86,610,3.605,663,4.975,739,4.495,762,2.813,763,2.518,766,3.264,792,1.876,801,3.191,815,2.641,829,4.645,875,6.994,902,1.776,1052,3.227,1053,4.282,1075,4.643,1198,3.157,1410,2.335,1476,5.899,1669,3.227,1703,3.641,1732,2.849,1878,4.243,2191,4.329,2410,3.157,2418,4.207,2815,4.329,2981,3.918,3035,6.994,3344,7.539,3375,6.947,3928,4.207,4232,4.86,4685,6.981,5491,5.587,5492,5.587,5493,5.149,5494,5.149,5495,5.149,5496,5.149]],["t/1413",[21,3.507,24,6.074,40,3.25,54,4.823,70,4.231,73,2.644,112,3.884,143,2.594,162,2.093,172,2.237,224,2.696,284,2.654,286,3.857,290,3.779,291,2.996,316,3.591,318,3.636,565,4.03,709,5.607,740,4.562,762,3.638,764,4.03,808,6.322,818,4.549,1231,4.16,1421,4.393,1558,3.729,1698,3.336,2147,5.081,5497,7.097]],["t/1415",[30,3.006,39,2.425,129,3.819,151,4.478,172,2.305,197,3.307,198,2.835,241,4.582,318,4.722,468,3.573,474,2.942,479,2.725,481,4.253,549,3.087,973,3.614,980,3.77,1093,5.393,1170,5.313,1436,3.794,1887,7.314,2031,7.749,2081,5.896,2082,7.749,2084,4.563,2088,6.025,2137,6.331,2147,5.237,5498,6.731]],["t/1417",[19,1.548,20,2.563,21,2.426,23,1.23,29,3.462,31,3.189,48,1.47,73,1.829,76,3.516,105,3.447,108,4.25,130,4.045,138,1.47,161,2.32,162,1.63,170,2.082,171,2.359,188,2.206,197,2.955,198,1.903,261,6.388,262,5.6,263,3.224,282,2.142,326,3.884,354,4.064,422,1.42,458,2.798,522,2.65,596,2.272,621,2.515,630,4.732,638,2.575,980,3.631,1027,2.58,1103,3.958,1126,3.063,1127,2.767,1133,3.567,1152,2.47,1232,3.958,1290,3.422,1410,2.359,1421,2.385,1448,4.975,1633,2.878,1639,2.385,1656,3.422,1659,4.374,1668,3.337,1682,4.045,1686,3.807,1712,5.14,1716,6.733,1719,3.467,1767,3.678,2235,3.029,2389,4.25,2503,4.519,2639,4.438,2778,3.958,2944,3.678,4130,4.374,5469,4.519,5499,5.202,5500,5.202,5501,5.202,5502,5.202]],["t/1419",[23,1.89,24,5.067,143,2.757,285,3.074,328,2.901,648,5.009,762,3.781,955,3.665,1027,3.965,1336,5.328,1353,4.252,1676,6.216,1697,5.653,1698,3.546,1704,5.564,1708,7.993,1709,5.557,1841,4.901,2003,6.364,2147,5.402,2778,6.082,5461,7.993,5486,7.545,5503,8.674,5504,7.545]],["t/1421",[105,3.367,275,5.434,291,3.712,313,4.78,363,3.03,562,5.595,792,3.395,1511,6.819,5505,10.11]],["t/1423",[22,4.142,26,6.462,29,3.502,37,6.173,40,3.817,45,4.662,102,6.866,112,4.562,118,5.808,496,4.468,589,4.77,743,5.598,2161,6.719,2779,6.585]],["t/1425",[21,3.094,22,4.657,35,3.476,37,3.869,41,4.946,48,1.874,62,1.37,98,2.73,274,4.255,300,3.765,316,3.168,407,2.958,458,3.722,490,4.363,498,2.756,561,3.943,602,3.798,815,3.403,889,5.28,972,2.927,983,6.244,990,4.421,1053,3.833,1117,4.733,1128,4.205,1139,5.577,1177,5.047,1251,4.157,1252,4.499,1540,4.69,1657,4.854,1668,4.255,1670,5.983,1697,4.69,2389,5.419,2770,5.983,3918,4.066,4166,6.261,5007,5.761,5467,6.633,5468,6.633,5469,5.761,5470,5.983,5506,7.197,5507,7.197,5508,6.633]],["t/1427",[762,3.673,967,5.185,2451,6.447,2452,7.902,5509,9.673]],["t/1429",[138,2.351,140,5.276,197,3.456,422,2.271,433,2.926,497,2.882,521,4.531,621,4.024,762,3.16,818,3.951,955,3.815,1014,5.706,1096,5.474,1117,4.461,1126,4.9,1147,5.792,1194,7.855,1688,5.215,1689,5.215,1690,5.984,5510,8.322]],["t/1431",[19,1.58,23,2.088,96,2.017,110,2.097,112,2.744,138,1.5,142,1.765,143,1.832,152,2.552,164,1.57,188,1.57,197,3.259,198,2.771,241,3.554,282,2.174,286,3.886,300,3.015,363,1.727,374,2.492,382,2.435,406,1.86,407,2.369,422,2.067,434,2.382,468,2.449,491,2.963,619,2.537,628,3.449,749,2.771,762,3.656,763,2.574,764,2.847,792,2.76,796,2.568,803,2.492,873,3.407,946,3.697,955,2.435,1147,3.697,1152,2.521,1218,3.589,1386,5.311,1573,3.241,1639,2.435,1669,4.747,1777,3.589,1780,3.54,1940,3.098,2087,3.961,2125,4.695,2149,2.669,2202,3.756,2245,3.961,2265,4.228,2328,4.041,2329,4.041,2337,5.013,2342,3.819,2343,3.589,2379,4.339,2440,5.311,2491,4.791,2691,3.367,4686,5.311,5474,4.791,5511,5.763,5512,5.763,5513,5.763,5514,5.763,5515,5.763,5516,5.763,5517,5.763]],["t/1434",[19,1.192,25,2.044,30,1.555,31,2.457,32,3.554,39,1.254,40,1.732,42,2.36,48,1.132,59,2.295,71,1.105,75,3.247,87,2.101,96,1.522,101,2.989,105,1.449,138,1.737,142,1.332,145,2.255,146,3.05,152,3.596,162,0.875,164,2.211,166,2.218,186,3.693,197,3.234,261,2.933,262,2.571,272,1.454,282,1.15,291,1.597,316,1.914,390,3.431,397,2.432,402,2.484,422,2.29,432,3.854,433,2.162,458,1.503,491,2.236,495,2.636,509,2.933,513,2.316,515,1.698,522,2.042,523,1.347,565,2.148,576,1.95,606,2.218,676,2.338,722,2.512,749,2.737,752,1.681,763,2.09,792,2.241,805,1.859,887,2.79,904,4.782,955,1.838,971,2.636,972,1.769,978,2.748,1014,2.748,1027,1.988,1037,2.512,1080,2.295,1111,2.834,1126,4.406,1193,2.432,1231,2.218,1258,2.165,1297,4.586,1511,2.933,1541,3.945,1565,3.05,1567,3.811,1579,4.008,1619,2.338,1628,3.945,1687,4.008,1688,2.512,1689,2.512,1695,3.783,1698,2.728,1738,3.296,2404,3.783,2405,3.37,2454,3.191,2457,3.37,2459,4.008,2514,3.191,2639,2.383,2982,3.783,3738,3.616,3824,3.191,3827,5.805,3828,2.989,3830,5.547,3843,3.616,3931,3.616,4140,4.008,5361,3.191,5363,4.008,5430,4.008,5477,4.008,5518,4.008,5519,4.349,5520,4.349,5521,4.349,5522,4.349,5523,4.349,5524,6.673,5525,6.15]],["t/1436",[29,2.273,45,3.026,51,2.453,56,2.673,71,1.471,104,3.93,105,2.072,125,2.37,138,1.619,146,2.843,152,2.754,191,4.753,197,1.94,246,5.161,284,2.822,285,3.074,298,4.275,313,2.94,326,2.982,361,3.477,363,1.864,406,2.008,433,2.015,437,2,493,2.721,513,3.312,514,2.416,533,1.933,599,3.343,606,3.172,610,2.789,632,4.361,638,1.977,644,3.198,716,3.096,749,2.097,762,2.176,763,1.948,801,3.552,855,3.048,967,3.072,974,3.477,1012,3.146,1117,3.072,1126,3.375,1127,3.049,1263,3.442,1639,2.628,1711,5.328,1738,3.072,1937,4.195,2107,4.563,2149,2.881,2779,4.275,2784,4.457,2879,5.17,3768,5.41,4691,5.732,5366,5.17,5393,5.732,5441,4.683,5485,5.732,5526,6.22,5527,5.732,5528,5.732]],["t/1439",[23,1.644,71,1.027,142,2.31,143,2.398,152,3.34,164,2.055,170,1.939,172,2.068,197,3.084,198,2.543,241,3.261,290,3.494,328,2.522,337,2.302,403,3.215,406,2.435,407,3.101,422,2.772,433,2.444,444,2.294,709,5.184,749,3.332,762,2.639,800,4.514,855,2.651,1092,4.514,1126,4.093,1275,4.308,1442,4.915,1631,4.217,1646,6.951,1655,6.038,1682,5.405,1698,3.084,1738,3.726,1768,4.633,1956,5.184,2058,6.562,3975,6.27,5483,6.951,5518,6.951]],["t/1441",[61,3.006,71,1.443,112,4.003,152,4.693,170,2.161,224,2.778,375,3.701,382,3.553,422,2.665,433,2.725,437,2.704,542,5.865,867,3.513,936,3.975,1235,5.237,1669,4.856,1960,6.906,2069,5.48,2486,5.896,3298,6.731,3511,6.99,3924,8.484,4316,9.767,4685,5.165]],["t/1443",[20,4.035,71,1.21,75,4.323,138,2.313,152,3.934,282,2.35,334,6.23,638,2.824,663,5.298,763,2.782,792,2.983,1053,4.731,1217,6.106,1231,4.53,1698,3.632,1878,5.789,3000,5.79,3830,7.386,3912,7.112,5529,8.884,5530,8.884,5531,8.884]],["t/1445",[44,3.969,71,1.245,96,3.199,107,2.608,138,1.748,142,2.056,152,2.973,246,3.049,283,5.342,363,2.741,382,2.837,422,1.688,435,5.055,436,5.892,610,4.1,663,5.022,739,5.112,762,2.349,763,2.102,902,2.134,1052,3.877,1053,3.575,1075,3.877,1198,3.793,1249,5.84,1410,2.805,1541,3.969,1642,2.571,1732,3.423,1878,4.825,2410,3.793,2418,5.055,2815,5.202,3375,7.529,4685,7.402,5359,5.84,5434,5.84,5493,6.187,5494,6.187,5495,6.187,5496,6.187,5532,6.713,5533,6.713,5534,6.713]],["t/1447",[23,2.088,40,3.817,96,3.353,139,3.117,246,4.351,328,3.204,363,2.872,638,3.046,1002,3.96,1081,5.472,1421,4.048,1879,4.807,3344,7.67,5442,8.335,5535,9.581]],["t/1449",[48,1.991,71,1.041,75,3.721,138,1.991,142,2.343,146,3.496,152,4.417,170,1.966,186,4.232,250,3.966,309,2.9,359,4.577,461,3.25,468,3.25,481,3.868,533,2.377,549,2.808,594,4.577,614,3.542,749,2.578,934,3.667,955,3.231,1040,6.358,1059,4.521,1080,4.036,1199,5.758,1392,4.521,1511,5.158,1768,4.698,1777,6.211,1780,4.698,1878,4.036,1960,6.499,2020,5.758,2573,5.926,2691,4.468,3000,4.984,3687,5.758,5536,7.648,5537,7.648,5538,6.358]],["t/1451",[19,1.649,20,2.732,21,2.586,23,1.311,29,3.586,31,3.399,48,1.566,73,1.949,76,3.746,105,2.822,108,4.529,130,4.311,138,1.566,161,2.473,162,1.706,170,1.546,171,2.513,188,2.308,197,3.061,198,2.028,261,6.616,262,5.8,263,3.436,282,2.242,326,4.063,354,4.252,422,1.513,458,2.928,522,2.824,596,2.421,621,2.68,630,4.95,638,1.912,980,3.799,1127,2.949,1133,3.801,1152,2.632,1232,4.218,1290,3.646,1410,2.513,1421,2.542,1448,5.205,1633,3.067,1639,2.542,1656,3.646,1659,4.661,1668,3.556,1682,4.311,1686,4.057,1712,3.264,1716,7.044,1719,3.695,2235,2.249,2389,4.529,2503,4.815,2639,3.296,2778,4.218,2944,3.92,4130,4.661,5469,4.815,5499,5.544,5500,5.544,5501,5.544,5502,5.544]],["t/1453",[23,1.905,24,5.108,143,2.779,285,3.099,328,2.924,648,5.049,762,3.8,955,3.694,1027,3.996,1336,5.37,1353,4.286,1676,6.265,1690,5.793,1697,5.697,1698,3.575,1841,4.94,2003,6.414,2147,5.445,2451,5.37,2778,6.131,5486,7.605,5497,7.605,5528,8.057,5539,8.743,5540,8.057]],["t/1456",[865,6.578,932,4.867,1053,5.287,1236,7.114,1363,6.469,1483,7.474,1521,6.961,1690,6.578,1697,6.469,1788,7.947,4892,9.149]],["t/1458",[22,3.721,26,5.804,29,3.146,37,4.626,38,4.127,39,2.482,40,3.428,45,4.187,47,5.217,102,6.167,112,4.097,118,5.217,129,3.908,458,2.974,474,3.011,496,4.013,508,5.312,602,4.542,743,5.028,983,7.008,1037,4.97,1166,6.314,1943,6.668,2161,6.035,2779,5.915,5541,8.606]],["t/1460",[762,3.673,967,5.185,1709,5.397,2310,6.205,2453,6.632]],["t/1462",[66,3.952,105,2.935,160,6.057,162,2.612,164,2.4,188,2.4,571,5.743,762,3.819,803,3.81,888,5.743,991,5.275,1217,6.057,1788,7.055,1842,4.829,2006,6.057,2946,6.829,5010,7.326,5209,9.494]],["t/1465",[19,2.082,29,2.776,39,2.19,142,2.326,146,3.472,152,4.397,282,2.009,284,3.23,290,3.518,363,2.277,379,5.22,414,3.384,434,3.139,497,2.424,515,2.965,596,3.057,641,4.338,653,4.291,764,3.752,792,2.55,803,3.284,861,4.082,1642,3.801,1698,3.105,1776,4.665,1995,6.579,3411,5.326,3437,6.08,3503,6.314,5421,8.253,5542,7.595,5543,7.595,5544,7.595,5545,7.595,5546,7.595,5547,7.595,5548,6.999,5549,7.595,5550,6.999,5551,7.595]],["t/1467",[19,1.384,23,1.1,62,0.961,69,3.976,71,1.21,75,2.456,95,2.766,138,1.314,139,1.642,142,1.546,152,4.64,173,3.19,186,2.794,197,3.541,198,2.995,227,3.405,276,3.618,277,3.746,282,1.975,284,2.89,290,2.338,374,2.183,422,2.469,426,2.109,458,2.58,468,2.145,495,3.06,522,2.37,529,2.985,534,2.109,562,4.132,584,3.021,638,1.605,740,2.823,749,1.702,763,1.581,792,3.518,802,3.144,971,3.06,972,2.053,1160,3.54,1258,2.513,1564,2.086,1573,2.944,1593,3.345,1696,5.131,1703,4.866,1744,3.238,1772,5.614,1777,3.144,1780,3.101,1782,2.852,1789,4.652,1790,3.238,1794,3.912,2011,3.704,2016,5.131,2125,2.883,2129,3.47,2146,3.29,2151,3.618,2160,4.652,2222,3.618,2235,1.888,2236,3.618,2245,5.131,2265,3.704,2290,4.392,2322,4.392,2365,4.041,2494,4.652,2499,4.652,2677,4.392,3503,4.197,4061,4.197,5361,3.704,5552,5.048,5553,5.048,5554,5.048,5555,5.048,5556,5.048,5557,5.048,5558,4.197]],["t/1469",[20,5.04,30,3.566,48,1.991,69,4.073,71,1.041,132,3.868,162,1.539,171,3.196,188,2.083,197,3.806,198,2.578,285,2.711,287,4.321,403,2.488,406,2.469,414,4.444,522,4.682,581,6.122,591,6.358,610,3.429,623,4.763,739,4.276,762,2.676,792,2.568,855,2.688,887,4.906,1075,4.417,1282,4.906,1479,5.363,1573,3.016,1668,4.521,1696,5.256,2066,4.577,2874,5.611,5559,6.653]],["t/1471",[29,2.063,30,2.896,32,3.006,37,3.034,48,1.47,69,3.006,71,0.769,96,1.975,106,2.399,129,2.563,152,4.195,162,1.136,166,2.878,169,3.156,188,1.538,197,1.761,198,1.903,221,3.378,224,1.865,271,2.272,272,1.888,282,2.506,283,3.298,290,2.614,309,3.072,359,4.847,363,2.428,390,2.903,406,1.822,421,2.903,422,2.037,464,3.034,596,2.272,604,2.547,610,2.531,763,2.536,792,1.895,801,3.224,818,2.47,861,4.353,867,3.384,955,2.385,1002,2.333,1027,4.329,1044,4.313,1126,5.14,1235,3.516,1392,3.337,1448,3.467,1480,3.807,1559,2.272,1567,3.224,1570,3.378,1587,4.91,1600,3.337,1601,4.25,1629,4.25,1656,3.422,1696,3.879,1704,3.621,1766,6.098,1879,2.832,2227,4.141,2235,3.029,2998,4.374,3000,3.678,3047,5.679,4891,7.045,5027,4.91,5404,3.74,5560,5.645,5561,4.519,5562,5.202,5563,5.202]],["t/1473",[19,3.132,39,2.739,105,3.164,152,4.206,246,4.314,406,3.066,432,5.486,1044,5.058,1111,6.19,1131,6.001,1776,5.835,3940,7.604,3950,8.753,5564,8.753,5565,9.498]],["t/1475",[39,2.522,71,1.19,96,3.059,105,2.912,111,3.501,139,2.844,152,4.809,191,4.79,414,3.896,514,3.397,621,3.896,633,4.744,650,4.223,801,4.993,967,4.319,1483,6.582,1552,7.268,1639,3.694,1668,5.169,1843,6.414,2676,7.605,2942,8.057,3912,6.999,5566,8.743,5567,8.743]],["t/1477",[29,3.695,112,4.813,143,3.214,318,4.505,363,3.03,414,4.505,596,4.771,3503,8.405]],["t/1479",[112,4.562,138,2.494,190,3.759,290,4.438,363,2.872,663,5.547,946,6.146,1709,4.927,4685,5.885,5428,7.214,5497,8.335,5568,9.581,5569,9.581,5570,9.581]],["t/1482",[92,4.398,112,4.003,138,2.189,143,3.369,287,4.751,290,3.894,363,3.177,596,3.384,610,4.752,650,4.061,663,5.119,723,5.033,758,4.478,837,7.749,902,2.673,1027,3.843,1053,4.478,1361,5.033,1469,4.912,3236,7.749,3840,8.81,4685,6.51,5428,6.331,5571,8.408,5572,8.408]],["t/1484",[21,3.507,40,4.559,66,3.658,73,2.644,162,1.642,282,2.158,290,3.779,741,3.658,762,2.855,1421,3.447,1558,4.752,1709,6.197,1727,5.847,1842,4.47,2339,4.515,2409,5.081,3034,6.783,3496,7.451,5421,6.783,5441,6.143,5442,10.827,5504,7.097,5573,8.159,5574,8.159]],["t/1486",[23,1.778,40,3.25,139,2.654,143,2.594,197,2.545,198,2.75,241,3.527,290,3.779,343,8.323,363,2.446,374,3.527,407,3.354,414,3.636,533,2.536,596,3.284,644,4.195,740,4.562,762,2.855,792,2.739,972,3.318,1080,4.306,1188,5.406,1235,5.081,1469,4.766,1636,4.03,1642,3.124,1767,5.317,2046,4.16,2360,6.531,2457,6.322,3411,5.721,3702,7.451,4061,6.783]],["t/1488",[19,1.605,29,2.14,30,2.093,43,2.961,45,2.849,66,2.625,73,1.897,96,3.382,98,2.221,105,1.95,139,1.905,142,1.793,162,1.673,164,1.595,170,2.137,188,3.41,189,3.382,206,3.308,221,3.504,241,2.532,284,1.905,285,2.075,291,2.15,374,2.532,432,3.382,444,2.528,458,2.023,508,2.892,515,3.246,527,2.609,533,1.82,577,3.344,589,4.138,596,2.357,599,3.147,608,4.408,638,3.073,785,4.196,902,1.861,966,2.625,973,2.517,980,2.625,1002,3.436,1095,3.7,1103,5.83,1174,3.949,1353,2.87,1438,4.687,1557,3.24,1574,2.625,1725,6.655,1772,3.7,1998,4.537,2078,4.196,2235,3.615,2613,3.24,2862,3.344,5007,4.687,5575,5.855,5576,4.929,5577,4.024,5578,5.093,5579,4.687]],["t/1490",[48,2.608,285,4.179,529,5.923,648,5.786,1841,6.662,2475,9.232,5580,10.018,5581,10.018]],["t/1492",[59,5.647,524,7.504,2605,8.056]],["t/1494",[22,4.142,26,6.462,29,3.502,37,6.173,40,3.817,45,4.662,102,6.866,112,4.562,118,5.808,496,4.468,589,4.77,743,5.598,2161,6.719,2779,6.585]],["t/1496",[21,3.357,22,3.377,30,2.793,37,4.198,38,3.745,42,4.238,70,4.051,73,2.531,111,3.127,300,4.086,316,3.438,361,4.367,422,1.964,509,5.268,515,3.05,565,3.858,721,2.699,889,5.731,1098,4.735,1127,3.829,1128,4.563,1218,4.865,1282,5.01,1302,6.493,1668,4.618,2227,5.731,2770,6.493,2930,7.198,2932,6.795,2933,7.198,2934,7.198,2935,6.795,2936,7.198,5469,6.253,5582,6.493,5583,10.11,5584,7.811,5585,7.811,5586,7.198,5587,7.811]],["t/1498",[39,2.693,76,5.815,143,3.594,262,6.684,458,3.226,607,5.22,663,4.51,762,4.53,1038,4.648,1794,7.235,1840,4.296,5588,9.337]],["t/1513",[22,4.142,26,6.462,29,3.502,37,6.173,40,3.817,45,4.662,102,6.866,112,4.562,118,5.808,496,4.468,589,4.77,743,5.598,2161,6.719,2779,6.585]],["t/1516",[18,3.337,19,2.722,20,2.793,21,2.644,22,2.659,23,2.164,33,3.246,48,1.601,73,1.993,81,2.928,98,2.332,107,2.389,111,2.462,129,2.793,132,3.111,138,1.601,162,1.732,164,2.344,188,3.083,189,3.552,406,2.778,407,2.528,515,2.401,534,2.57,560,5.35,564,4.63,602,3.246,632,6.035,796,2.74,803,3.721,858,4.008,890,4.463,970,2.949,973,2.644,974,3.438,980,4.452,984,4.407,1064,3.681,1087,3.403,1360,4.512,1389,5.44,1573,2.425,1668,3.636,1712,3.337,1744,3.945,1830,5.35,1936,4.765,2144,3.636,2401,5.35,2407,5.35,2691,3.593,2906,4.227,2910,4.407,2927,4.075,2929,5.668,5589,6.15,5590,6.15,5591,6.15,5592,5.668,5593,6.15,5594,5.113]],["t/1518",[2464,6.166]],["t/1520",[19,3.202,21,3.93,23,1.463,30,2.4,33,3.543,51,2.647,62,1.278,105,2.236,117,3.482,130,7.451,131,9.709,162,2.093,167,2.245,170,1.726,171,2.805,189,3.877,190,2.634,203,5.055,224,2.218,257,5.055,261,4.528,262,3.969,363,2.012,414,2.992,493,4.884,713,4.018,980,3.01,1412,3.512,1564,4.614,1628,3.969,1659,7.085,2424,5.202,3032,5.202,3142,4.926,3749,5.84,5595,6.187,5596,6.187,5597,10.288,5598,6.187,5599,6.187,5600,6.187]],["t/1522",[33,4.651,73,2.856,76,5.489,95,4.829,107,3.424,133,3.766,162,2.197,188,2.4,406,2.845,479,2.856,902,2.802,962,5.21,980,5.316,1412,6.202,1571,3.856,2410,4.979,5576,4.494,5601,7.666,5602,8.813,5603,8.813]],["t/1524",[162,2.093,285,3.685,962,6.147,2410,5.874,5576,5.302,5604,9.044]],["t/1526",[18,5.486,19,2.772,328,3.381,1001,5.774,1574,4.533,5576,5.155,5605,9.317,5606,8.093,5607,9.317]],["t/1528",[21,3.882,107,3.508,111,3.616,287,5.102,328,3.02,417,3.561,514,3.508,541,7.229,576,4.049,577,5.158,611,4.024,644,4.643,726,5.984,1001,5.158,1239,6.09,1353,4.427,1476,6.625,1557,4.997,1574,4.049,2046,4.605,5579,7.229,5608,9.03]],["t/1530",[18,5.436,19,2.747,162,2.016,188,2.729,328,3.35,562,5.544,5576,5.108,5605,9.232,5606,8.019,5607,9.232]],["t/1532",[162,2.093,188,2.832,328,3.477,1559,4.184,5609,10.397,5610,10.397]],["t/1535",[18,4.782,19,1.745,21,2.735,23,1.387,33,4.651,68,3.809,76,3.963,138,2.294,162,2.386,164,1.733,188,2.401,218,5.743,284,3.289,286,4.167,375,2.801,402,3.635,414,3.927,428,2.751,479,2.062,513,4.694,534,3.683,549,2.337,621,2.836,626,3.858,632,4.462,741,3.952,752,2.46,854,3.595,974,3.558,980,4.894,1076,4.021,1087,3.522,1109,5.29,1170,4.021,1389,6.279,1412,3.329,1573,2.509,1705,4.374,1724,3.675,1840,2.928,2691,3.718,2774,4.462,2910,4.56,4685,3.909,5594,5.29,5611,5.536,5612,5.865,5613,5.865,5614,4.292]],["t/1537",[19,2.397,39,2.522,78,6.414,105,3.617,112,4.162,138,2.276,188,2.381,406,2.822,407,3.594,614,4.049,647,3.78,763,2.738,864,4.993,980,3.92,984,6.265,1095,5.524,1127,4.286,1378,6.265,1389,4.79,1410,3.653,1546,6.265,1611,6.774,1712,4.744,2691,5.108,5474,7.268]],["t/1539",[19,3.196,21,3.914,23,1.454,30,2.386,33,3.522,51,2.631,62,1.271,105,2.223,117,3.46,130,7.427,131,9.689,162,2.086,167,2.231,170,1.715,171,2.788,189,3.854,190,2.618,203,5.024,224,2.205,257,5.024,261,4.501,262,3.945,363,2,414,4.057,493,4.872,713,3.994,980,2.992,1389,3.656,1564,4.602,1628,3.945,1659,7.055,2424,5.17,3032,5.17,3142,4.896,3749,5.805,5595,6.149,5596,6.149,5597,10.262,5598,6.149,5599,6.149,5600,6.149]],["t/1541",[19,2.682,23,1.84,25,1.833,33,3.157,42,3.246,70,5.072,73,3.169,103,3.899,105,2.812,109,2.828,110,3.072,113,3.964,115,2.167,162,2.138,167,2.001,188,2.664,189,4.875,190,4.168,224,3.511,335,3.837,375,2.633,378,3.157,406,1.931,414,2.666,493,2.618,497,1.909,498,2.291,527,2.666,533,2.624,562,3.311,602,3.157,611,2.666,618,4.112,647,3.65,918,4.789,970,2.869,980,4.764,984,6.049,1036,3.026,1256,3.103,1378,4.287,1389,5.359,1481,4.195,1541,3.537,1559,3.397,1681,4.973,1752,3.837,2069,3.899,2703,4.789,3017,5.513,3262,4.973,5615,8.131]],["t/1543",[18,2.871,21,2.274,25,2.367,33,4.079,68,3.167,81,2.519,89,2.502,107,2.056,125,2.016,162,2.377,188,2.487,218,3.448,284,3.841,288,2.199,414,3.444,444,1.609,534,2.211,596,2.13,621,4.069,630,5.866,723,3.167,741,3.466,751,2.818,752,2.988,815,2.502,864,3.022,932,2.594,933,4.236,967,2.614,980,5.295,984,3.792,1012,2.676,1014,3.343,1038,3.847,1075,3.056,1118,3.882,1145,3.295,1170,3.343,1308,4.367,1313,2.871,1389,6.796,1412,5.587,1540,3.448,1573,2.087,1599,3.343,1639,2.236,2068,4.603,2077,4.1,2095,3.569,2409,3.295,2774,3.71,2871,4.876,5592,4.876,5594,4.399,5611,6.723,5615,4.399,5616,5.291,5617,4.876]],["t/1545",[18,5.589,19,3.038,20,4.101,39,1.901,61,2.357,62,1.961,110,2.399,129,2.994,162,2.073,171,2.755,188,3.161,224,2.178,284,2.145,286,4.269,288,2.74,327,2.902,402,3.765,577,3.765,585,3.996,597,4.623,632,4.623,824,3.612,870,3.765,973,2.834,974,3.686,1013,4.166,1202,4.229,1309,4.964,1334,4.05,1366,4.106,1622,5.735,1643,3.544,1656,3.996,1709,3.39,1724,3.808,1748,5.735,1852,4.724,2023,3.996,2065,4.623,2072,4.369,2451,4.05,2452,4.964,3102,5.278,5576,4.605,5618,5.735,5619,5.108,5620,3.898,5621,6.593,5622,6.593,5623,4.964,5624,6.593]],["t/1547",[18,4.208,19,2.759,20,3.522,22,3.353,39,2.237,62,1.477,66,3.478,160,5.33,161,3.188,162,2.249,188,2.741,284,2.523,286,3.667,288,3.223,444,2.358,569,2.785,585,4.701,962,4.585,973,3.334,1001,4.43,1200,5.839,1574,3.478,1639,3.277,1852,5.558,2147,4.83,2451,4.764,2927,5.139,3102,6.209,5576,3.955,5606,8.056,5614,5.231,5619,6.01,5620,4.585,5625,5.139,5626,7.798,5627,4.975]],["t/1549",[62,1.961,73,2.605,110,2.925,162,2.412,188,2.806,284,2.615,286,4.869,288,3.341,569,2.887,585,4.873,599,4.321,611,3.582,1013,5.08,1656,4.873,1709,5.296,2065,5.637,2147,5.007,2452,6.053,5576,4.1,5604,9.887,5620,4.753,5623,6.053,5625,5.327,5626,7.981,5627,5.157,5628,6.436,5629,6.053]],["t/1551",[18,4.362,19,2.204,62,1.531,76,5.007,162,2.073,188,2.19,284,3.351,288,3.341,407,3.305,546,3.539,565,3.971,569,2.887,580,3.749,611,3.582,621,3.582,824,4.405,980,4.618,1410,3.359,1412,4.205,1559,3.236,1724,4.643,1806,5.239,1893,5.327,2927,5.327,5576,4.1,5601,8.96,5619,6.229,5620,4.753,5625,5.327,5626,6.229,5627,5.157,5630,6.229,5631,6.993]],["t/1553",[18,4.58,19,2.682,30,2.139,51,2.359,62,2.133,106,2.542,138,1.557,162,2.255,168,2.227,170,1.538,171,2.5,188,3.052,250,3.103,284,1.946,286,3.991,288,2.486,313,2.828,374,2.587,381,3.627,402,3.417,414,2.666,422,1.505,461,2.542,546,2.633,583,4.389,621,3.761,638,1.902,824,4.625,973,2.572,1174,4.035,1200,4.504,1202,3.837,1309,4.504,1421,2.528,1639,3.567,1709,4.34,1724,5.649,1751,4.389,2235,2.237,2451,3.675,2452,4.504,2927,3.964,3043,4.504,3082,3.837,4507,4.389,4535,4.504,5576,5.418,5577,4.112,5618,5.204,5620,3.537,5623,4.504,5629,4.504,5632,4.973,5633,5.204,5634,4.195,5635,5.204,5636,5.204,5637,5.204,5638,5.204]],["t/1555",[30,2.386,35,3.223,62,1.271,71,0.909,110,2.428,162,1.833,188,2.823,224,2.205,284,2.962,288,2.773,291,2.45,309,2.531,313,4.9,316,2.937,426,2.788,428,3.937,460,3.898,569,2.396,595,3.155,638,2.121,749,2.25,763,2.851,855,2.345,973,3.914,1141,4.099,1219,3.554,1302,5.547,1413,4.782,1421,3.847,1613,4.216,1633,3.403,1724,3.854,2617,3.322,2672,4.679,2988,4.045,3086,5.342,3087,4.782,5576,3.403,5577,8.01,5620,3.945,5627,4.28,5634,4.679,5635,7.921,5639,6.673,5640,4.896,5641,6.149,5642,5.547,5643,6.673,5644,6.673,5645,5.805]],["t/1557",[19,1.83,23,1.454,25,2.044,28,2.543,30,2.386,62,1.271,69,3.554,87,3.223,110,2.428,140,3.898,162,1.833,170,1.715,188,2.823,250,3.46,284,2.171,286,3.155,288,2.773,309,2.531,327,2.937,355,4.348,381,4.045,407,2.743,422,1.678,434,2.758,444,2.029,515,2.605,569,2.396,582,4.045,583,4.896,638,3.54,805,2.852,888,4.348,891,4.896,973,3.914,981,4.896,1002,2.758,1608,4.28,1698,3.723,1829,3.2,1831,3.945,1871,5.342,2277,4.099,2451,4.099,2639,5.679,4535,5.024,5576,3.403,5618,5.805,5619,5.17,5620,3.945,5625,4.422,5627,4.28,5630,5.17,5636,7.921,5646,6.673]],["t/1559",[23,1.371,33,3.32,61,2.249,62,1.913,81,2.995,143,2,162,2.297,170,2.248,188,3.109,224,2.079,250,3.262,282,1.664,284,2.844,286,4.751,288,2.614,428,2.72,515,2.456,569,2.259,578,3.208,595,2.974,626,3.813,792,2.112,805,3.737,955,2.658,973,2.704,1013,5.524,1174,5.897,1393,3.813,1608,4.035,1631,3.517,1693,2.821,1709,4.496,1724,3.633,1795,4.736,2235,3.758,2451,3.864,2453,3.975,2617,3.132,2971,4.323,2996,3.235,3043,7.566,3059,3.414,3762,4.875,4507,4.615,4535,4.736,5416,4.736,5576,3.208,5619,4.875,5620,3.719,5623,4.736,5627,4.035,5629,4.736,5647,5.036]],["t/1561",[19,1.864,28,2.59,62,1.294,70,3.525,162,2.106,168,3.895,188,2.85,224,2.246,282,1.798,284,2.211,288,2.824,291,3.385,407,2.794,433,2.202,437,2.185,569,4.029,578,3.466,604,4.16,611,3.029,763,2.128,973,2.921,974,3.8,1354,4.584,1390,3.724,1393,4.12,1693,3.048,1724,3.925,1739,4.429,1788,5.441,1829,3.259,2235,3.913,2387,5.117,2532,3.882,2622,4.175,2996,3.495,3059,5.003,5576,3.466,5620,4.018,5625,4.504,5627,4.36,5637,8.02,5648,5.65,5649,5.912,5650,6.263,5651,5.912,5652,6.263,5653,6.796]],["t/1563",[18,3.734,19,2.549,20,3.125,25,2.108,39,1.985,62,1.31,83,4.73,162,2.12,188,2.533,189,3.974,224,3.072,272,3.109,284,2.239,288,2.86,291,2.527,313,3.253,337,2.1,350,3.125,432,3.974,433,2.23,497,2.196,546,4.093,565,3.399,569,2.471,583,5.049,604,3.105,611,3.066,638,3.348,824,3.771,855,2.418,973,3.997,974,3.847,1263,3.808,1413,4.931,1433,4.826,1724,3.974,1734,4.348,1739,4.485,1758,5.721,1893,4.56,2927,4.56,3016,4.56,3062,5.049,5576,3.509,5620,4.068,5627,4.414,5638,8.088,5654,5.181,5655,6.882]],["t/1565",[19,2.013,23,1.6,25,2.974,32,3.91,40,2.924,62,1.398,106,3.119,110,3.533,138,1.911,162,1.478,171,3.067,188,2.644,206,4.148,284,2.388,286,3.471,288,3.051,402,4.193,421,5.593,422,1.846,444,2.232,445,4.148,583,5.386,626,4.45,753,4.709,867,3.067,870,4.193,973,3.156,1182,4.951,1198,4.148,1202,4.709,1296,4.51,1417,4.865,1421,3.102,1581,5.688,1709,3.775,1758,6.103,1879,3.683,4401,6.103,5576,3.744,5620,4.34,5629,5.527,5634,5.148,5656,7.341,5657,7.341,5658,6.386]],["t/1567",[18,3.319,19,1.677,20,2.777,23,1.868,25,2.626,32,3.257,62,1.165,71,1.167,107,2.376,110,2.225,138,1.592,150,3.573,161,3.524,162,2.357,169,3.419,172,2.351,188,2.696,282,1.618,284,1.989,286,2.891,288,2.541,365,3.616,368,2.954,382,2.584,421,5.516,422,1.538,444,1.86,445,3.455,500,4.739,546,2.692,565,3.021,569,2.196,603,3.045,641,4.896,792,2.053,796,2.725,867,2.555,1003,3.757,1041,3.66,1089,3.069,1296,3.757,1512,3.616,1560,4.739,1564,2.528,1567,3.493,1568,4.053,1581,4.739,1585,4.739,1586,4.896,1605,3.385,1669,3.532,1709,3.145,1739,3.986,1768,3.757,1879,3.069,4401,5.084,5576,3.119,5620,3.616,5625,4.053,5627,3.923,5629,4.605,5632,5.084,5658,7.457]],["t/1569",[19,1.948,30,2.54,33,3.749,34,4.15,42,3.855,62,1.809,96,2.486,138,1.849,139,2.311,142,2.176,162,1.912,171,2.968,188,2.915,197,2.216,224,2.347,284,3.09,286,4.491,288,2.952,374,3.071,402,4.057,422,1.787,433,2.302,621,3.166,626,4.306,973,3.054,992,4.103,1198,4.014,1202,4.557,1243,4.791,1421,3.002,1573,3.746,1678,5.505,1709,4.884,1756,4.707,1758,5.906,2862,4.057,5576,4.844,5620,4.2,5625,4.707,5628,7.604,5659,7.104,5660,5.906,5661,6.18,5662,6.18,5663,6.18]],["t/1571",[23,2.231,25,1.995,62,1.24,66,2.921,96,3.134,105,2.17,110,2.371,161,3.682,162,1.803,172,1.786,188,2.788,284,3.759,286,3.08,288,2.707,433,2.111,508,4.425,549,2.392,569,2.339,626,3.949,740,3.642,762,2.28,764,3.218,776,4.477,805,2.784,934,3.124,973,2.8,1076,4.116,1261,5.048,1410,2.722,1421,2.753,1573,3.532,1678,5.048,1698,3.662,1706,4.179,1709,3.35,1720,4.905,1729,3.949,1767,4.245,1976,3.721,2067,6.004,2409,4.057,2583,5.416,2941,6.004,3496,4.668,4253,5.667,4728,4.477,5576,3.322,5620,3.851,5625,4.317,5627,4.179,5628,5.215,5661,7.792,5664,5.667,5665,5.667]],["t/1573",[19,2.698,30,3.518,62,1.426,71,1.02,75,3.645,106,3.183,138,1.95,162,1.508,171,3.13,188,2.993,221,4.484,224,2.475,284,2.437,288,3.113,339,3.567,381,4.541,414,3.338,422,1.884,461,3.183,583,5.496,589,3.729,626,4.541,670,5.496,966,3.359,993,4.484,1002,3.096,1202,4.805,1421,3.165,1436,3.38,1559,4.422,1724,4.327,1734,4.733,1766,5.64,1831,4.429,2006,5.149,2147,4.666,5384,6.904,5576,3.82,5620,4.429,5666,6.517,5667,6.904]],["t/1575",[62,1.407,110,2.689,117,3.833,120,4.48,138,1.924,142,3.343,162,1.963,188,2.973,218,4.816,284,2.404,286,3.494,288,3.071,426,3.088,444,2.247,451,3.936,461,3.14,531,4.423,569,2.654,603,3.679,792,2.481,798,3.494,960,4.741,973,3.177,1573,2.914,1693,3.314,1709,3.8,1731,4.176,1829,3.544,1977,5.727,2110,4.09,2833,7.806,2862,4.221,4256,5.183,5576,3.769,5620,4.369,5625,4.897,5627,4.741,5628,5.916,5662,8.483,5663,6.429,5668,6.811,5669,6.811]],["t/1577",[18,3.711,19,2.539,20,3.106,23,1.49,29,2.5,30,2.445,62,1.302,73,2.216,111,2.738,161,2.811,162,2.264,172,2.539,188,3.064,221,5.541,282,1.809,284,2.225,288,2.842,309,2.594,414,4.126,461,3.934,565,3.378,569,2.456,580,4.317,621,4.126,670,5.017,733,5.299,770,4.321,776,4.7,796,3.047,1018,3.642,1080,3.609,1081,3.906,1558,3.126,1564,2.826,1724,3.95,1879,3.431,2582,5.017,2987,5.475,3930,6.635,4277,6.302,5404,4.532,5576,3.487,5620,4.043,5627,4.387,5666,8.054,5670,5.685]],["t/1580",[18,5.537,19,3.095,20,4.634,21,3.406,23,1.727,34,4.629,71,1.079,81,3.772,160,5.446,162,2.272,188,2.158,433,2.568,458,2.738,515,3.094,569,2.845,597,5.556,602,4.182,800,4.742,869,4.22,962,4.684,975,4.576,1095,5.006,1639,3.348,1744,6.545,2144,4.684,2926,6.14,2927,5.25,2977,7.302,5671,7.923,5672,7.923,5673,7.923,5674,7.302]],["t/1582",[39,2.739,291,3.488,444,2.888,497,3.031,595,4.49,796,4.232,1342,6.19,1571,4.156,1588,7.604,4287,8.186,5675,10.528,5676,8.753,5677,6.661,5678,8.753]],["t/1584",[18,5.486,19,2.772,39,2.916,162,2.035,188,2.754,479,3.276,521,5.073,597,7.089,716,5.033]],["t/1586",[19,2.616,22,3.091,29,2.614,39,3.442,46,4.084,66,3.206,69,5.081,96,2.502,98,2.712,143,2.273,145,3.708,162,2.471,172,1.96,188,3.344,565,3.532,569,2.568,580,3.334,583,5.246,611,3.186,614,3.312,893,3.334,1001,5.449,1026,5.54,1107,4.738,1198,4.04,1571,4.174,1574,5.136,1752,4.586,2916,5.54,2944,4.66,5626,7.392,5679,7.15]],["t/1588",[23,0.711,39,3.507,45,1.588,56,2.892,62,0.622,71,0.724,98,1.238,119,2.163,122,1.789,139,1.062,141,1.755,162,1.943,167,1.778,170,1.994,171,1.364,188,0.889,206,3.004,218,3.465,251,1.638,273,4.975,284,2.523,285,1.157,286,3.181,291,1.199,337,1.623,369,1.755,389,1.738,402,3.842,403,1.73,404,1.954,406,1.054,414,2.369,417,1.287,420,4.12,444,2.936,474,1.861,479,2.767,497,1.042,523,1.011,534,3.568,569,1.172,579,3.465,580,3.137,597,3.729,614,1.512,622,2.127,647,1.411,739,5.119,796,1.455,815,1.543,818,2.326,855,1.868,859,3.465,887,2.094,902,1.69,955,4.721,966,3.829,967,4.523,974,1.825,986,1.93,989,3.323,1001,1.864,1013,2.062,1070,5.213,1089,1.638,1230,1.93,1294,2.714,1332,2.163,1336,2.005,1361,1.954,1439,2.094,1571,1.428,1574,1.464,1588,2.613,1599,2.062,1724,1.885,1802,2.339,1840,1.502,2006,2.243,2055,1.93,2122,1.708,2193,2.529,2235,2.516,2274,3.586,2277,2.005,2441,2.529,2443,2.84,2639,1.789,3745,2.395,4060,3.586,4081,3.008,4314,2.84,4685,4.764,4990,6.747,5626,2.529,5650,3.008,5677,2.289,5680,3.264,5681,3.008,5682,3.264,5683,3.264,5684,7.148,5685,3.008,5686,6.727,5687,6.2,5688,3.264,5689,3.264,5690,2.84,5691,3.264,5692,2.84,5693,3.008,5694,3.008,5695,2.84,5696,6.209,5697,2.84,5698,2.84,5699,3.264,5700,2.714]],["t/1590",[21,3.628,23,1.304,39,3.446,40,2.383,43,4.269,46,3.417,59,3.157,81,2.848,105,2.812,139,1.946,162,1.204,168,2.227,188,2.299,223,5.209,290,2.771,291,2.197,407,4.02,458,2.067,474,2.093,492,4.875,497,1.909,527,5.437,534,2.5,569,2.148,596,2.408,599,3.216,648,3.455,713,5.052,796,2.666,805,2.557,870,4.821,893,2.79,902,2.683,1038,2.978,1039,3.78,1041,3.581,1089,4.235,1095,3.78,1239,4.035,1353,2.933,1450,3.675,1470,3.186,1571,2.618,1574,2.683,1712,5.307,1858,5.204,2028,4.195,2101,4.195,2393,4.504,2532,3.417,5405,4.973,5696,4.789,5701,5.204,5702,5.204,5703,5.983,5704,5.983]],["t/1592",[22,3.132,30,2.59,39,2.776,70,5.971,87,3.499,110,2.636,138,2.505,162,1.937,206,4.093,218,4.721,286,3.425,402,4.138,404,4.336,414,3.228,420,5.613,421,3.725,422,1.822,458,3.979,518,3.551,882,3.333,902,3.059,1361,4.336,1366,7.171,1573,2.857,1574,3.248,1639,3.061,1724,4.184,2101,6.748,2274,4.886,2774,5.08,3336,5.315,4188,5.799,4685,4.45,5025,8.869,5614,4.886,5696,5.799,5705,7.244]],["t/1594",[22,2.472,39,3.635,41,3.93,43,1.807,45,2.782,48,1.489,56,1.535,96,3.129,109,4.51,116,3.82,117,2.965,120,2.165,122,1.957,123,2.138,143,1.135,145,1.852,147,4.305,162,2.161,164,0.973,170,2.452,188,2.227,273,5.243,284,1.86,285,2.027,286,3.865,287,2.018,288,2.971,326,1.713,337,2.729,375,2.517,402,4.084,403,1.162,404,6.426,417,2.255,428,1.544,444,1.086,479,1.853,502,2.614,515,1.395,530,2.505,541,4.578,549,1.311,562,1.977,569,1.283,575,2.291,596,1.438,597,4.01,607,1.997,611,1.592,650,1.725,739,3.998,752,1.381,762,1.25,815,1.689,864,2.04,882,1.643,942,2.291,955,4.031,966,1.602,972,1.453,975,2.063,989,1.764,990,2.194,991,3.422,1001,2.04,1027,1.633,1036,1.807,1075,2.063,1174,2.409,1237,4.01,1332,3.789,1353,1.751,1434,2.859,1473,2.087,1698,3.342,1724,3.303,2046,1.821,2101,2.505,2180,2.969,2235,2.674,2432,3.107,2486,2.505,2514,2.621,2639,3.918,4685,2.194,4990,4.974,5576,1.821,5660,2.969,5684,5.27,5687,6.59,5692,3.107,5700,2.969,5706,3.572,5707,3.572,5708,3.292,5709,5.718,5710,3.572,5711,3.292]],["t/1596",[22,3.663,29,3.097,36,6.379,39,3.359,44,5.009,66,3.799,87,4.093,109,4.006,116,3.393,162,2.344,362,5.277,403,3.464,517,4.034,762,3.726,1089,4.251,1332,5.615,1439,5.435,1541,5.009,1836,7.371,2101,5.942,2191,6.566,5660,7.044,5712,8.473,5713,7.809]],["t/1598",[29,3.004,39,3.598,48,2.14,71,1.119,96,3.656,111,4.183,137,4.157,162,1.655,286,3.886,287,4.644,403,3.736,607,4.596,645,5.89,716,4.092,722,4.747,893,3.833,955,3.473,966,3.686,1127,4.03,1315,7.486,1439,5.272,1712,4.46,4287,5.89,4685,5.049,5620,4.86]],["t/1600",[39,3.447,63,5.855,107,3.101,111,3.196,164,2.174,167,2.669,288,3.316,369,5.511,406,2.576,479,2.586,650,3.855,739,4.462,864,4.558,893,3.722,966,3.579,967,3.942,1053,5.46,1089,4.004,1090,6.943,1235,4.971,1791,6.943,2639,4.373,4685,6.297,5435,6.943,5498,6.389,5627,6.576,5700,6.635,5713,7.355,5714,7.981,5715,7.981,5716,7.355]],["t/1602",[39,3.495,111,3.707,162,1.864,167,3.096,188,2.522,369,4.976,403,3.012,406,2.989,479,3,663,4.472,739,5.176,966,4.151,2639,5.073,5660,7.697,5696,7.411,5700,7.697,5711,8.532]],["t/1605",[29,3.533,39,3.329,137,4.889,188,2.633,402,5.52,444,3.51,479,3.132,493,4.229,549,3.549,2191,7.489,3104,7.489,5620,5.714]],["t/1607",[39,2.716,115,3.411,172,2.582,286,4.452,403,3.063,474,3.295,527,4.196,1342,6.137,1439,6.04,1473,5.502,2078,6.748,3916,8.678,3940,7.538,4957,8.678,5717,9.417,5718,9.417,5719,9.417]],["t/1610",[31,2.623,35,2.243,39,3.067,66,2.082,71,0.955,98,1.761,101,3.191,137,2.348,159,3.026,162,1.896,168,2.611,188,1.91,223,2.473,273,5.421,284,3.697,286,3.316,288,3.512,334,3.256,378,2.45,403,3.289,404,2.779,444,2.133,474,2.454,479,1.505,490,2.815,496,2.165,513,2.473,523,2.172,530,3.256,534,1.94,545,2.934,596,2.823,602,2.45,606,2.368,652,2.978,675,3.026,721,2.423,741,2.082,751,3.735,752,1.795,762,2.958,797,3.327,850,2.276,860,2.779,894,3.86,955,3.979,989,2.294,993,2.779,1002,1.919,1012,2.348,1137,3.86,1186,3.598,1236,3.327,1239,3.132,1245,3.86,1291,3.598,1304,3.191,1314,2.745,1316,2.934,1332,3.077,1336,2.852,1361,2.779,1417,4.648,1439,5.421,1561,3.86,1631,3.921,1638,1.996,1724,2.682,1964,3.026,2030,3.598,2101,3.256,2193,3.598,2227,3.407,2532,4.006,2874,3.407,3335,4.039,4270,4.279,5414,3.327,5538,3.86,5620,5.568,5685,4.279,5708,6.464,5720,7.014,5721,4.643,5722,4.643,5723,4.643,5724,4.643,5725,4.643,5726,4.643]],["t/1612",[39,2.916,188,2.754,1309,7.612,1521,7.089,1533,8.405,5606,8.093,5681,9.317,5727,6.819,5728,10.11]],["t/1615",[188,2.363,190,4.24,285,3.074,287,4.901,331,6.943,517,4.13,577,6.723,694,8.651,1001,4.954,1039,5.48,1353,5.77,1557,4.8,1574,3.889,1712,5.864,1790,5.564,2072,5.748,2533,6.53,5579,6.943,5729,7.993,5730,8.674]],["t/1617",[39,2.604,68,5.405,190,3.543,292,3.752,444,2.746,498,3.458,566,4.461,569,3.243,576,4.049,585,5.474,738,6.997,741,4.049,955,3.815,1080,4.766,1126,4.9,1209,4.724,1306,5.547,1324,7.855,1712,4.9,1944,8.322,5731,8.322,5732,8.322]],["t/1619",[39,2.19,48,1.977,71,1.034,105,3.684,111,3.041,125,2.894,188,3.013,190,2.98,498,2.908,541,6.08,566,3.752,576,3.406,577,4.338,599,4.082,602,4.008,614,3.518,621,3.384,677,6.08,694,6.08,743,4.437,980,3.406,1124,7.284,1235,6.183,1353,4.867,1559,3.057,1712,5.387,1724,5.734,2072,5.033,2149,3.518,2486,5.326,2532,4.338,5579,6.08,5630,5.885,5729,6.999,5733,7.595,5734,6.08]],["t/1622",[18,4.52,19,2.492,20,1.677,21,2.524,23,0.805,30,1.32,33,4.798,40,2.912,54,2.183,59,3.098,67,2.023,68,2.21,71,0.503,76,4.552,87,2.836,105,1.23,107,1.434,111,1.478,138,1.903,143,1.174,162,2.286,164,1.006,188,1.599,206,2.086,218,4.763,250,1.915,284,2.378,288,1.534,300,1.931,337,1.127,341,3.211,402,2.109,403,1.201,414,4.523,428,2.538,433,1.196,474,1.292,479,1.902,508,1.824,513,3.127,521,1.852,534,3.054,569,1.326,573,1.867,602,1.948,611,1.645,621,3.257,626,2.238,647,1.596,653,2.086,741,3.735,756,2.969,796,1.645,824,2.023,962,2.183,980,5.445,1001,2.109,1013,2.333,1076,2.333,1087,2.043,1103,2.589,1109,3.069,1137,3.069,1145,2.299,1239,2.49,1308,2.086,1311,5.41,1389,5.772,1410,2.453,1412,3.823,1473,2.157,1562,2.109,1571,1.615,1573,1.456,1574,1.655,1638,2.524,1639,1.56,1664,2.78,1677,2.861,1705,2.537,1709,3.758,1744,3.766,1806,2.406,1840,1.699,1852,2.646,1964,2.406,2023,2.238,2144,2.183,2231,3.069,2277,5.116,2452,2.78,2527,2.861,2640,2.955,2878,4.881,2910,2.646,2926,2.861,2927,2.446,3148,2.646,3918,2.086,4060,2.49,4535,2.78,5399,3.402,5409,3.211,5414,2.646,5509,3.402,5576,1.883,5594,3.069,5611,3.211,5612,3.402,5716,3.402,5735,2.955,5736,3.692]],["t/1624",[23,2.255,39,2.336,68,4.847,83,5.566,104,5.117,125,3.086,162,1.63,188,2.206,189,4.677,326,3.883,337,2.472,377,4.2,521,4.063,523,2.508,546,3.565,565,4.001,571,5.278,604,3.654,611,3.609,752,3.131,824,4.437,902,2.575,980,4.64,1001,4.625,1389,5.67,1559,3.259,1574,3.631,1576,4.731,1638,3.481,1713,6.097,1893,5.367,5614,5.462,5631,7.045]],["t/1626",[23,2.245,25,2.463,39,2.971,40,3.202,87,3.883,162,1.618,167,2.688,188,2.806,285,2.849,286,3.801,349,4.1,515,3.139,604,3.628,739,4.495,864,4.592,888,5.239,955,3.397,980,3.605,1001,4.592,1234,7.409,1297,5.525,1308,4.542,1389,4.405,1574,3.605,1591,5.525,1724,4.643,1825,3.828,2360,6.436,5418,6.436,5619,6.229,5696,6.436,5737,8.039,5738,8.039,5739,8.039]],["t/1628",[23,1.832,25,2.576,96,2.942,160,5.779,162,1.693,188,2.887,224,2.778,403,2.735,432,4.856,433,2.725,519,4.912,549,3.087,855,2.955,980,5.463,988,6.169,1001,4.802,1357,5.896,1387,5.097,1389,5.807,1470,4.478,2149,3.894,2441,6.515,2872,7.314,4394,7.749,5614,5.671,5631,7.314]],["t/1630",[23,2.018,39,2.67,48,2.41,61,3.31,104,5.85,117,4.801,188,2.522,190,3.633,224,3.059,515,3.615,546,4.075,558,5.687,980,4.151,1389,5.073,1559,3.726,1571,4.051,1713,6.971,1893,6.135,5740,8.532]],["t/1632",[21,4.6,39,2.049,89,4.491,125,2.707,139,3.09,153,2.376,162,1.912,166,3.623,167,2.376,170,2.442,171,2.968,218,4.63,284,3.481,328,2.376,337,2.168,389,5.059,534,2.968,569,2.551,595,5.059,671,5.349,764,3.509,785,5.091,824,5.864,902,3.02,980,5.123,1001,4.057,1038,3.536,1072,6.19,1389,5.205,1512,4.2,1571,3.108,1605,3.931,5741,9.499,5742,6.547,5743,5.906]],["t/1634",[29,2.381,33,5.402,89,3.08,153,2.179,161,2.678,162,2.06,166,3.322,169,5.008,170,1.675,171,2.722,284,2.119,375,2.867,389,3.469,414,2.903,569,2.339,595,3.08,621,2.903,764,3.218,785,4.668,855,2.289,861,4.814,934,3.124,970,3.124,980,5.669,1038,4.459,1072,5.837,1137,5.416,1239,4.394,1308,3.681,1353,3.194,1389,6.543,1412,4.685,1512,3.851,1638,2.8,1664,4.905,1806,7.531,2400,3.899,2691,5.233,5743,5.416,5744,6.514,5745,6.514,5746,6.004]],["t/1636",[59,5.299,71,0.72,117,2.744,123,4.626,142,1.621,143,2.457,153,1.77,167,2.585,171,2.211,188,2.487,284,4.035,286,2.502,331,4.236,369,4.908,375,3.402,403,1.721,406,1.708,441,3.71,479,2.959,513,2.818,549,3.353,569,1.9,580,3.604,595,2.502,604,3.487,607,2.958,621,2.358,671,3.984,699,2.614,741,2.373,756,2.676,854,2.99,855,2.716,934,2.537,967,5.69,975,3.056,984,3.792,989,3.818,1070,5.989,1072,3.448,1076,3.343,1089,2.655,1170,3.343,1174,3.569,1202,3.394,1308,2.99,1512,3.128,1559,2.13,1638,2.274,1705,3.637,1709,2.721,1790,3.394,1840,2.435,1852,3.792,2088,3.792,2277,4.748,2451,3.25,2453,4.883,2583,4.399,5627,3.394,5697,7.943,5698,8.735,5743,4.399,5747,4.399,5748,5.291]],["t/1638",[28,2.673,54,4.146,62,1.793,107,2.725,123,6.802,142,2.148,153,2.345,166,3.576,167,3.556,170,2.922,171,2.93,188,3.325,190,2.752,284,3.064,288,2.914,354,3.519,389,5.015,497,2.238,569,2.518,595,3.316,604,4.798,621,3.125,671,5.28,764,3.464,785,5.026,886,5.026,974,3.921,1038,3.491,1072,6.929,1559,3.79,1918,4.146,2235,3.522,5743,5.83,5749,7.013,5750,6.101]],["t/1640",[71,0.882,105,2.157,106,2.752,123,3.876,142,1.984,143,2.059,153,2.166,162,1.304,167,2.166,171,2.706,172,1.776,188,2.43,189,5.152,272,2.166,353,3.659,354,3.249,389,3.449,451,3.449,479,2.099,497,3.509,569,2.326,595,3.062,598,3.876,604,2.922,605,4.751,610,4,619,2.851,638,2.059,650,4.309,718,3.481,792,2.174,886,6.392,938,5.184,953,5.184,1015,3.926,1038,3.224,1039,4.092,1044,3.449,1072,7.166,1073,5.184,1421,2.736,1546,4.641,1571,2.833,1918,3.829,2187,4.541,2347,4.154,2407,5.634,2673,5.634,2906,4.451,3027,3.783,3686,5.634,5750,5.634,5751,6.392,5752,5.968,5753,6.476,5754,6.545,5755,6.476]],["t/1642",[21,3.034,33,3.725,35,2.262,62,2.262,76,2.916,107,1.819,142,1.434,162,1.421,164,2.576,170,2.997,181,2.916,188,3.016,218,3.052,250,2.428,284,3.601,286,2.214,288,1.946,326,2.245,389,5.037,403,1.523,414,3.145,458,1.618,497,1.494,604,3.185,605,5.179,638,3.007,650,4.103,739,2.618,886,6.088,967,3.487,972,1.904,1013,4.46,1174,4.761,1252,2.199,1677,6.583,1678,3.628,1724,2.704,1794,3.628,1806,3.052,1852,5.058,1918,2.768,2209,3.218,2235,3.177,2432,4.073,2451,4.336,2639,2.566,2878,7.863,3027,2.736,3043,3.526,5576,2.388,5623,3.526,5627,3.004,5692,4.073,5697,6.14,5698,8.228,5742,4.315,5746,6.505,5747,3.893,5750,6.14,5751,5.058,5752,4.315,5756,4.683,5757,4.683,5758,4.683,5759,4.683,5760,4.683,5761,4.683,5762,4.683]],["t/1644",[40,2.964,47,4.51,63,5.459,70,3.859,87,3.594,109,5.716,116,4.841,143,2.365,167,2.488,272,2.488,284,3.186,286,3.518,351,3.62,479,3.174,504,5.332,534,4.093,621,3.316,902,2.365,980,3.336,990,4.571,1223,4.571,1387,4.51,1389,4.077,1480,5.018,1724,4.297,1727,7.847,2101,5.218,2691,5.722,3336,5.459,4507,5.459,4685,4.571,5614,5.018,5763,9.795]],["t/1647",[19,2.341,39,2.463,58,4.634,71,1.163,139,2.778,172,2.341,395,4.319,515,4.178,580,3.982,611,3.805,632,5.988,647,3.692,792,3.593,824,5.863,950,5.869,1041,5.111,1117,4.218,1410,3.568,1559,3.437,1744,5.477,1893,5.658,2144,5.048,5361,6.265,5727,5.759,5764,6.617,5765,6.617]],["t/1649",[62,1.692,67,4.868,71,1.21,107,3.452,152,3.934,167,2.971,172,2.436,176,6.884,188,2.988,351,4.323,479,2.879,518,5.377,855,3.122,958,6.518,980,5.335,986,5.252,1056,6.884,1237,6.23,1512,5.252,2410,5.02]],["t/1651",[105,4.036,162,2.439,189,5.347,285,3.281,533,2.878,576,4.151,577,5.288,614,4.288,669,7.411,824,5.073,980,4.151,1559,3.726,1992,6.635,2760,6.971,5751,6.635]],["t/1654",[38,4.848,39,2.916,188,2.754,493,4.423,1309,7.612,1521,7.089,1533,8.405,5727,6.819,5766,10.11]],["t/1657",[18,4.238,19,2.142,20,3.547,25,2.393,28,2.976,39,2.916,71,1.063,110,2.842,119,5.176,162,1.572,188,2.128,474,2.733,585,4.735,611,3.481,626,4.735,643,6.052,671,5.881,766,4.563,814,4.413,861,4.198,1188,5.176,1219,4.16,1353,3.829,1410,3.264,1558,4.621,1591,5.368,1752,5.01,1918,4.618,2065,5.477,2144,4.618,2147,4.865,2457,6.052,2946,6.052,5626,6.052,5633,6.795,5634,5.477,5767,6.795,5768,7.811,5769,6.493]],["t/1659",[22,4.143,35,3.476,37,3.869,39,2.763,42,3.905,71,0.98,73,2.332,86,5.983,94,5.983,95,3.943,104,4.547,153,2.407,160,4.946,161,2.958,162,2.168,224,3.166,290,3.333,326,3.451,433,2.332,474,2.518,585,4.363,602,3.798,810,5.28,974,4.024,1007,5.983,1121,4.69,1131,4.547,1177,5.047,1266,5.047,1305,4.769,1410,3.007,1413,5.157,1557,3.983,1571,3.149,1739,4.69,1748,6.261,1752,4.616,1778,6.633,2077,5.577,3855,6.633,5404,4.769,5405,5.983,5441,5.419,5770,7.197,5771,7.197,5772,5.761,5773,5.983,5774,7.197]],["t/1661",[39,3.639,46,4.877,95,4.679,151,4.548,162,1.719,282,2.259,300,4.467,513,4.548,514,3.317,602,4.507,611,3.805,615,5.988,618,5.869,717,5.111,967,4.218,1014,5.395,1558,4.891,1564,3.529,1631,4.774,1831,5.048,2334,7.869,5775,6.119,5776,8.539,5777,8.539]],["t/1663",[39,3.228,129,4.169,162,1.848,444,2.792,527,4.091,585,5.565,596,3.695,616,7.987,776,6.31,1261,7.114,1752,5.889,1879,4.607,2029,7.987,2069,5.983,2277,5.64,2527,7.114,5630,7.114,5778,9.181,5779,9.181]],["t/1665",[23,0.675,25,0.949,30,1.108,39,0.894,51,1.222,56,1.332,62,2.666,69,1.65,75,1.508,86,2.576,104,4.75,110,1.128,129,4.639,139,1.008,153,2.17,162,1.306,188,0.844,197,0.967,198,1.045,206,1.751,241,1.34,262,5.281,313,1.465,318,1.381,327,1.364,339,1.475,374,1.34,397,1.732,404,1.855,414,1.381,417,3.276,421,1.593,422,1.632,433,1.004,585,3.089,620,3.651,621,2.27,762,1.084,795,1.988,873,1.832,902,0.985,1012,3.802,1557,3.591,1558,3.797,1633,1.58,1731,4.247,1759,2.48,1806,2.019,2277,1.903,2400,1.855,2952,2.695,3250,2.401,4104,2.576,5005,2.273,5614,2.09,5701,2.695,5772,2.48,5780,2.855,5781,2.695,5782,3.099,5783,3.099]],["t/1667",[23,1.407,25,2.727,37,3.471,39,2.568,40,1.66,41,2.864,43,2.108,62,2.418,66,1.869,69,3.439,86,3.465,98,1.581,104,2.633,105,1.388,129,2.932,159,2.716,161,1.713,162,1.792,164,1.759,168,1.551,171,1.741,172,2.167,223,2.22,271,2.599,298,2.864,327,2.842,403,1.356,404,3.865,437,2.542,444,2.404,458,1.44,479,2.562,497,1.33,514,1.619,527,2.877,534,1.741,547,4.142,585,3.914,587,3.32,598,2.494,612,2.262,620,2.987,622,2.716,626,2.526,637,2.762,709,2.864,710,3.841,711,3.841,712,3.841,713,3.865,714,6.876,715,3.626,716,2.075,717,3.865,718,2.24,719,2.059,720,3.841,721,1.44,795,2.673,873,2.464,893,1.943,902,2.053,936,1.97,942,2.673,993,2.494,1002,2.669,1012,2.108,1063,3.465,1159,3.229,1225,2.987,1239,4.355,1263,2.306,1334,2.56,1514,2.596,1557,2.306,1558,4.069,1613,4.08,1713,3.138,1722,3.465,1731,2.355,1806,2.716,1831,2.464,1832,3.841,1844,2.673,1879,2.091,2023,2.526,2046,2.125,2277,2.56,2400,2.494,2480,2.923,2651,3.058,3250,3.229,5772,3.336,5780,3.841,5781,3.626,5784,4.168,5785,4.168,5786,4.168,5787,4.168,5788,4.168,5789,4.168,5790,4.168,5791,4.168,5792,3.841,5793,4.168,5794,4.168]],["t/1669",[25,1.518,28,1.889,29,2.692,34,4.303,39,3.343,48,2.288,61,1.772,66,2.223,95,2.716,98,1.88,116,3.519,119,4.881,132,2.507,133,3.756,162,1.769,168,1.845,172,1.359,188,1.35,271,1.995,284,1.613,285,3.115,290,2.296,300,2.593,309,1.88,329,3.476,407,2.038,418,3.552,422,1.247,433,1.606,515,1.935,523,1.535,565,2.449,577,5.557,579,3.231,589,3.667,590,4.312,596,1.995,599,2.665,610,3.303,615,5.165,617,3.407,618,5.063,632,3.476,654,7.036,746,4.121,761,4.121,764,2.449,792,1.664,805,2.119,810,3.637,855,1.742,973,2.131,1036,2.507,1041,2.967,1117,2.449,1202,3.18,1217,3.407,1244,3.732,1302,4.121,1334,3.045,1363,3.231,1377,2.716,1378,3.552,1410,2.071,1546,3.552,1557,2.743,1558,4.018,1559,1.995,1564,2.049,1610,3.005,1631,2.772,1681,4.121,1737,3.476,1765,4.568,1831,2.931,2065,3.476,2393,3.732,2951,4.312,4354,4.568,5415,4.568,5508,4.568,5633,4.312,5645,4.312,5740,4.568,5772,3.968,5795,4.957,5796,4.957,5797,4.568,5798,4.568,5799,4.957,5800,4.957]],["t/1671",[23,1.11,28,1.942,39,2.168,45,2.479,71,1.024,95,2.792,109,3.554,110,1.854,116,3.01,117,2.642,129,2.314,132,2.577,133,2.177,161,2.094,190,1.999,223,4.003,285,1.806,327,2.243,337,3.565,350,3.414,361,2.849,406,1.645,437,1.638,521,2.556,523,1.578,529,3.012,533,2.337,579,6.426,580,3.505,586,8.074,587,5.071,599,2.739,605,3.738,611,2.27,618,3.502,638,2.39,676,4.041,726,3.376,727,3.948,728,6.725,730,4.618,731,9.149,732,6.928,733,3.948,734,4.696,735,4.696,736,6.539,737,3.573,738,3.948,739,2.849,741,2.285,743,2.977,893,2.376,934,2.443,973,2.19,974,2.849,1038,2.536,1354,3.436,1384,4.75,1470,2.713,1610,3.089,1739,3.32,1752,3.268,1806,3.32,1812,3.948,2065,3.573,2406,5.66,2410,4.247,2699,3.32,2760,3.836,5617,6.928,5648,4.236,5801,5.095,5802,5.095,5803,5.095]],["t/1673",[]],["t/1675",[]],["t/1678",[33,4.97,143,2.994,162,1.896,188,2.565,292,3.913,403,3.063,762,3.295,850,4.616,948,5.211,975,5.439,1080,4.97,1093,6.04,1282,6.04,1795,7.09,2122,4.926,4970,8.678,5804,8.192]],["t/1680",[19,1.631,23,1.297,25,1.823,28,3.204,30,2.127,43,3.01,61,2.127,70,3.086,71,1.145,162,1.693,164,1.621,167,1.99,170,2.507,172,2.306,224,1.966,282,2.58,349,3.034,353,3.362,375,2.619,403,1.936,407,2.446,428,3.636,481,3.01,515,2.323,523,1.843,578,3.034,595,2.813,752,2.3,763,1.863,792,1.998,805,3.594,850,2.917,955,2.514,1231,3.034,1253,2.895,1290,3.607,1336,3.655,1366,3.706,1393,3.607,1410,2.486,1470,3.169,1509,4.763,1564,3.475,1619,3.198,1636,4.154,1638,2.558,1693,3.77,2023,3.607,2235,4.634,2387,4.48,2617,2.962,2622,3.655,2719,5.779,2767,4.173,2971,4.089,2996,3.06,3059,3.229,5558,4.947,5754,4.366,5765,4.611,5805,4.173,5806,3.655,5807,5.95]],["t/1683",[51,2.914,61,3.902,89,3.494,171,4.075,309,2.803,328,2.472,569,3.502,594,4.423,763,2.314,902,2.349,955,4.12,1147,4.741,1436,4.4,1636,3.651,1688,4.268,1689,4.268,1693,3.314,1940,3.973,2045,3.936,2316,4.132,2617,5.777,2862,4.221,2969,5.916,2996,3.8,3027,4.318,3057,5.697,3059,4.01,3918,5.51,5480,6.429,5806,4.54,5808,7.391,5809,6.429,5810,4.318,5811,4.48,5812,5.916,5813,5.727,5814,5.422,5815,6.429]],["t/1685",[62,1.613,133,3.621,141,4.554,143,2.694,162,1.706,314,5.435,497,3.716,569,3.043,805,3.621,955,3.58,1393,5.136,1693,3.799,2055,6.296,2316,4.737,2617,4.218,3249,7.044,5816,7.371,5817,8.473,5818,8.473,5819,7.371,5820,8.473,5821,8.473,5822,7.044,5823,7.809,5824,8.473,5825,8.473,5826,7.044]],["t/1688",[23,0.813,29,2.163,62,1.595,70,1.934,71,1.141,87,1.801,89,1.763,96,1.305,98,1.414,117,3.069,142,1.142,143,1.881,153,1.247,161,1.533,162,2.128,274,2.205,328,1.247,397,2.085,406,1.91,417,1.471,422,1.488,460,2.179,474,1.305,475,4.241,508,2.924,549,1.369,569,1.339,628,3.542,630,2.179,647,1.612,718,3.955,750,3.1,762,1.305,764,1.842,796,1.662,803,3.181,851,3.796,916,2.615,960,4.72,970,1.788,986,2.205,989,2.924,997,2.515,1020,2.985,1052,3.418,1053,1.986,1076,2.356,1085,1.968,1122,1.886,1141,2.291,1271,2.356,1315,2.672,1364,2.672,1387,2.261,1421,2.501,1436,3.32,1470,1.986,1605,3.275,1638,1.603,1643,4.911,1698,1.525,1706,4.72,1738,2.924,1797,2.471,1847,2.005,2086,3.686,2130,4.52,2149,1.727,2207,4.738,2277,2.291,2310,3.499,2316,4.683,2400,2.232,2617,4.84,2622,2.291,3018,2.471,3027,3.458,3057,2.179,3059,5.276,3745,2.736,5677,2.615,5727,2.515,5810,2.179,5827,4.15,5828,3.244,5829,4.067,5830,2.672,5831,5.459,5832,4.92,5833,3.244,5834,3.1,5835,3.244,5836,3.244,5837,7.287,5838,2.89,5839,3.244,5840,3.244,5841,6.401,5842,2.89,5843,3.1,5844,4.92,5845,5.148,5846,2.615,5847,2.672,5848,4.241,5849,4.241,5850,3.244,5851,3.244,5852,3.244,5853,3.244,5854,3.244,5855,3.244,5856,3.244,5857,2.89,5858,3.729,5859,3.729,5860,3.729,5861,3.729,5862,3.729,5863,3.729]],["t/1690",[19,2.013,23,1.6,62,1.849,71,1.322,125,2.797,153,2.455,162,2.489,192,4.572,291,2.696,350,3.334,495,4.45,508,3.626,647,3.174,803,3.174,855,2.58,989,3.626,1081,4.193,1119,4.865,1390,4.022,1786,5.386,2316,4.104,3060,4.709,3688,4.951,5677,5.148,5806,6.682,5830,5.261,5831,6.327,5857,5.688,5864,7.795,5865,6.386,5866,6.765,5867,6.386,5868,7.341,5869,7.341,5870,7.341,5871,7.341,5872,7.341,5873,7.341]],["t/1692",[19,2.674,23,1.085,25,1.525,48,2.294,51,1.964,62,2.078,68,4.424,71,1.006,109,1.425,141,2.677,143,0.958,151,1.605,153,1.008,162,2.408,166,1.537,172,1.365,251,1.512,309,1.143,314,3.194,337,0.92,350,2.89,374,2.751,397,1.685,406,0.973,428,1.303,481,1.524,490,1.827,508,2.46,520,5.569,523,0.933,543,1.5,549,1.106,569,3.165,578,2.539,603,2.479,606,1.537,619,3.602,623,1.877,628,1.804,638,2.35,652,1.933,749,1.016,798,4.167,800,1.804,801,1.721,855,1.059,866,3.146,957,1.997,972,2.025,989,1.489,1034,3.359,1036,1.524,1037,1.74,1119,1.997,1152,1.318,1176,3.596,1253,1.466,1290,1.827,1310,2.505,1390,5.343,1426,1.997,1481,2.113,1576,1.761,1638,1.295,1693,5.316,1796,2.211,1971,2.269,2045,2.652,2055,4.37,2110,1.668,2209,3.422,2323,3.492,2342,3.3,2343,1.877,2450,2.16,2613,3.522,2708,3.749,2862,1.721,2959,3.492,2975,5.171,3060,1.933,3080,3.422,3974,3.245,4194,1.877,4219,2.269,5029,2.211,5814,6.843,5826,4.14,5830,2.16,5857,2.335,5874,2.505,5875,2.505,5876,2.622,5877,2.505,5878,2.113,5879,2.622,5880,2.335,5881,3.859,5882,2.622,5883,2.505,5884,6.811,5885,7.542,5886,6.364,5887,3.859,5888,4.98,5889,8.813,5890,2.622,5891,2.777,5892,4.98,5893,4.589,5894,3.014]],["t/1694",[19,2.142,142,2.393,153,2.612,162,2.257,309,3.834,752,3.02,902,2.483,989,3.858,1410,3.264,1450,4.798,1638,3.357,1651,6.493,1688,5.839,1689,5.839,1809,4.675,2410,4.413,2988,6.796,2989,7.705,2991,6.253,3026,8.094,3027,4.563,5814,8.225,5822,6.493,5857,8.687,5890,6.795,5895,6.795,5896,6.795]],["t/1696",[48,1.575,62,2.033,137,3.059,153,2.023,162,2.149,170,1.555,291,3.123,313,5.318,428,3.678,437,1.945,444,1.839,474,2.116,485,3.192,497,1.93,573,3.059,647,2.615,763,1.894,792,3.584,803,2.615,855,2.125,1131,5.375,1152,2.646,1638,2.6,1644,6.591,1688,3.493,1689,3.493,1731,4.806,1891,6.957,1940,3.251,2020,4.554,2235,4.207,2617,4.235,2988,5.156,2989,4.157,3026,4.842,3057,4.97,5810,3.534,5811,3.667,5823,10.367,5884,9.838,5897,5.028,5898,5.262,5899,5.262,5900,5.262,5901,6.048,5902,5.262,5903,5.262]],["t/1698",[23,0.967,61,3.885,118,4.107,153,1.484,162,2.358,168,2.522,170,1.141,251,3.4,287,3.828,291,1.629,349,2.263,350,3.077,406,1.432,407,2.785,417,2.672,703,3.049,818,2.965,972,3.343,1342,2.891,1373,4.657,1395,5.649,1470,4.378,1559,1.786,1638,3.533,1643,4.418,1809,2.656,1825,2.112,1840,3.118,2122,4.813,2209,3.049,2316,3.788,2617,3.373,2862,3.87,3027,2.592,3055,3.552,3057,4.802,3058,5.194,3974,2.891,5381,3.341,5810,2.592,5811,2.69,5813,3.438,5814,7.271,5846,3.111,5847,4.856,5857,9.079,5885,7.575,5890,5.894,5904,5.894,5905,7.151,5906,3.86,5907,5.25,5908,8.621,5909,3.86,5910,3.552,5911,8.239,5912,3.86,5913,3.86,5914,3.438,5915,3.86,5916,3.86,5917,3.552,5918,3.86,5919,3.86,5920,3.86,5921,5.424,5922,3.86,5923,3.86,5924,3.86,5925,3.86,5926,3.86,5927,6.776]],["t/1700",[23,1.814,51,1.786,61,2.46,62,2.148,87,2.187,98,1.717,118,4.172,122,2.481,125,1.726,143,2.646,170,1.769,172,1.887,262,4.069,291,1.663,292,1.882,314,4.414,326,2.171,327,1.993,350,2.056,354,2.272,375,1.993,406,1.462,458,1.565,460,2.646,485,2.39,497,2.656,517,2.156,523,1.402,554,2.861,604,2.043,647,1.958,859,2.951,890,2.348,970,2.171,972,2.799,989,4.593,1064,2.71,1081,2.586,1131,2.861,1271,2.861,1377,2.481,1395,6.39,1436,3.105,1610,4.172,1633,4.741,1997,3.625,2045,4.433,2055,4.921,2155,7,2235,3.477,2316,2.532,2605,3.409,2699,2.951,2767,3.175,2959,3.175,2971,4.73,3974,4.485,4498,3.409,5416,3.409,5481,2.951,5550,4.173,5775,3.245,5806,2.782,5810,4.021,5811,4.172,5826,3.765,5928,3.322,5929,3.245,5930,4.528,5931,6.882,5932,6.342,5933,5.333,5934,5.987,5935,3.625,5936,5.333,5937,3.939,5938,3.939,5939,3.939,5940,3.939,5941,3.939,5942,3.939,5943,3.939,5944,3.939,5945,3.939,5946,3.939,5947,3.939,5948,3.939,5949,3.939,5950,3.625,5951,3.939,5952,3.939,5953,4.528,5954,3.939]],["t/1702",[51,2.385,153,2.023,162,2.348,417,3.354,619,4.331,798,2.86,818,2.646,1605,5.908,1643,4.572,1693,4.412,1840,2.783,1847,3.251,2024,4.438,2339,3.347,2613,3.347,2862,3.455,2975,3.822,2996,5.999,3052,3.715,3057,3.534,3058,5.375,3059,4.616,4056,4.842,4194,5.298,5727,4.079,5826,5.028,5827,4.241,5829,4.157,5848,4.334,5849,4.334,5857,4.687,5864,4.334,5887,4.687,5891,5.574,5907,4.687,5933,4.687,5936,4.687,5955,4.687,5956,5.262,5957,6.048,5958,6.048,5959,5.262,5960,4.842,5961,6.048,5962,5.262,5963,5.262,5964,5.262,5965,6.048,5966,4.687,5967,5.262,5968,5.574,5969,5.028,5970,6.048,5971,6.048,5972,4.842,5973,6.048,5974,4.842,5975,5.262,5976,6.048,5977,5.262]],["t/1704",[19,1.572,48,1.866,51,1.413,62,1.706,71,0.488,111,1.435,125,1.366,143,2.278,162,2.605,188,1.562,250,1.858,282,0.948,350,1.627,354,1.798,397,2.003,426,2.396,428,1.549,431,2.45,464,1.926,479,1.161,481,2.9,508,4.045,534,1.497,569,1.287,604,2.587,638,1.139,798,2.71,816,2.119,855,2.015,858,2.335,991,2.145,1010,1.926,1131,2.264,1219,1.908,1231,1.827,1275,2.047,1353,1.757,1390,4.487,1394,2.264,1410,2.396,1437,4.589,1470,1.908,1512,2.119,1597,2.869,1626,2.264,1633,1.827,1693,4.498,1724,2.07,1741,2.172,1768,2.201,1842,1.963,1940,3.082,2055,2.119,2073,2.417,2130,2.201,2235,3.573,2266,2.232,2310,2.119,2323,4.02,2339,3.173,2617,1.784,2671,2.232,2975,3.622,2996,2.948,3052,2.201,3057,2.094,3058,2.264,3059,1.944,3918,2.025,3956,2.979,3974,2.335,4683,2.979,4977,2.869,5414,2.568,5614,2.417,5727,2.417,5754,2.629,5827,2.513,5829,2.463,5831,2.335,5881,2.777,5966,2.777,5978,2.777,5979,3.302,5980,3.302,5981,3.302,5982,4.987,5983,3.302,5984,3.583,5985,3.583,5986,3.302,5987,3.583,5988,3.583,5989,3.302,5990,3.583,5991,3.583,5992,3.302,5993,3.583,5994,3.302,5995,3.302,5996,5.283,5997,3.583,5998,3.302,5999,3.583,6000,3.583,6001,3.302,6002,3.583,6003,3.583,6004,3.302,6005,3.583,6006,3.583,6007,3.302,6008,3.583,6009,3.583,6010,3.302,6011,3.583,6012,3.583,6013,3.302,6014,3.583,6015,3.583,6016,3.302,6017,3.583,6018,3.583,6019,2.869,6020,5.733,6021,3.583,6022,3.117,6023,3.117,6024,3.117,6025,3.117,6026,3.583,6027,3.583,6028,2.869,6029,3.117,6030,3.117,6031,3.117,6032,2.979]],["t/1706",[19,1.074,23,1.34,28,1.492,29,2.248,34,2.287,36,2.948,43,1.98,52,2.691,92,3.217,98,1.485,133,1.673,134,2.641,137,1.98,141,2.105,143,1.955,160,2.691,162,2.278,168,1.457,169,2.189,170,2.212,188,1.066,192,2.438,292,1.627,406,1.985,407,1.609,414,1.745,417,1.544,459,2.315,474,3.012,493,1.713,502,1.79,508,3.038,517,2.928,523,1.213,527,1.745,562,2.167,628,2.343,796,2.741,805,1.673,854,3.475,855,2.161,859,2.552,874,2.125,887,2.511,902,2.415,942,2.511,970,1.877,980,1.756,984,2.806,989,1.934,991,2.343,1010,3.306,1081,2.236,1093,2.511,1119,2.594,1211,2.552,1223,2.405,1256,2.03,1258,1.949,1292,2.594,1313,2.125,1336,5.746,1410,4.339,1415,2.948,1421,2.599,1436,2.775,1467,2.746,1576,2.287,1605,3.404,1608,2.511,1610,2.373,1643,2.105,1723,2.641,1732,3.136,1734,2.474,1829,1.877,1920,3.255,2045,2.085,2070,3.034,2086,2.438,2130,2.405,2235,4.021,2266,2.438,2410,2.212,2450,2.806,2613,2.167,2622,2.405,2944,2.552,2971,2.691,2996,3.162,3027,2.287,3057,2.287,3058,2.474,3059,2.125,3141,3.83,3688,2.641,3762,3.034,3779,2.948,4056,3.134,4060,2.641,4172,4.766,4529,3.134,5029,2.873,5421,3.255,5582,3.255,5625,2.594,5654,2.948,5806,2.405,5831,4.008,5848,2.806,5849,2.806,5864,2.806,5935,3.134,5994,3.608,6033,3.255,6034,3.915,6035,3.915,6036,3.915,6037,3.134,6038,3.406,6039,3.406,6040,3.406,6041,3.406,6042,3.406,6043,3.915,6044,3.406,6045,3.406,6046,3.406]],["t/1708",[19,2.243,23,2.152,51,1.736,52,3.025,61,1.574,62,0.838,70,2.283,71,0.599,81,2.096,98,1.669,109,3.867,114,2.668,125,1.677,134,2.969,137,2.226,138,1.753,143,1.399,162,2.096,167,1.472,168,3.045,170,2.103,171,1.839,172,2.512,188,1.199,292,1.829,328,1.472,350,1.999,404,2.634,406,2.174,407,3.766,422,1.107,474,1.54,479,1.426,496,2.052,497,1.405,508,4.04,515,1.718,518,2.158,546,1.937,566,2.174,569,2.418,575,2.823,596,1.771,638,1.399,855,2.874,970,2.111,972,1.79,973,1.892,989,2.174,1015,2.668,1039,2.781,1041,2.634,1052,3.889,1080,2.323,1089,2.208,1096,2.668,1128,2.571,1140,2.781,1152,2.946,1258,2.191,1285,3.659,1379,3.229,1410,4.126,1435,3.154,1547,3.41,1564,3.787,1574,1.974,1576,2.571,1640,3.229,1693,1.974,1740,3.41,1829,3.922,1893,2.917,2235,4.285,2441,3.41,2617,2.191,2767,4.722,2832,3.229,2988,2.668,3141,2.741,4068,3.659,5810,2.571,5811,2.668,5846,3.086,5847,3.154,5914,3.41,5928,3.229,5929,4.826,6047,3.829,6048,4.401,6049,8.179,6050,4.401,6051,4.401,6052,3.829,6053,4.401,6054,3.829,6055,3.523]],["t/1710",[19,2.188,71,1.087,167,3.428,168,2.971,170,2.912,189,4.609,224,2.637,270,5.719,280,5.201,282,2.712,357,5.855,491,4.104,501,3.942,610,4.597,617,5.485,692,5.719,973,3.431,997,6.915,1038,3.973,1118,5.855,1133,5.043,1384,5.043,1559,3.212,1825,3.8,2235,4.236,2640,6.389,5751,5.719,5955,6.184,6056,7.355,6057,6.943]],["t/1712",[23,2.34,41,4.914,69,3.808,71,0.974,73,2.317,98,2.712,138,1.861,141,5.128,162,2.306,170,2.76,188,2.924,257,5.383,261,7.241,262,6.347,414,3.186,444,2.174,458,2.471,566,3.532,596,2.878,739,3.998,882,3.29,980,3.206,1026,5.54,1152,3.128,1154,5.014,1200,5.383,1209,3.74,1258,3.559,1282,4.586,1336,4.392,1410,2.988,1940,3.843,2235,3.568,2400,4.28,2771,5.944,3822,8.299,6058,7.15,6059,7.15]],["t/1715",[24,4.912,33,4.438,143,2.673,162,1.693,170,2.161,188,2.29,292,3.494,328,2.812,403,2.735,422,2.115,751,4.478,762,2.942,850,4.122,948,4.653,975,4.856,1013,6.696,1080,4.438,1093,5.393,1096,5.097,1282,5.393,1795,6.331,1840,3.869,2774,5.896,5576,5.404,5615,6.99,5670,6.99,5804,7.314,6019,6.731,6060,8.408]],["t/1717",[19,1.183,23,1.446,25,1.322,28,2.527,30,1.543,38,2.069,43,2.182,48,1.123,61,1.543,70,2.238,71,1.465,107,1.676,143,1.372,162,1.335,164,1.175,167,1.443,168,1.606,170,2.656,172,2.215,173,2.726,188,1.807,224,1.426,282,2.137,292,1.793,349,2.2,353,2.438,375,1.899,378,2.277,403,1.404,407,1.774,428,2.868,458,1.491,460,2.521,481,2.182,498,1.652,508,2.132,515,1.685,523,1.336,545,2.726,571,2.812,573,3.355,578,2.2,595,2.04,619,1.899,621,1.923,648,2.492,752,1.668,763,1.351,792,2.227,805,3.453,818,1.888,850,2.115,870,2.464,948,2.388,955,1.823,1211,2.812,1231,3.382,1253,2.1,1256,2.238,1290,2.616,1295,4.866,1336,2.651,1366,2.687,1393,2.616,1410,1.803,1470,2.298,1473,2.521,1482,2.616,1509,3.454,1559,2.669,1564,2.741,1619,2.319,1636,3.276,1638,1.855,1639,1.823,1672,2.768,1693,3.623,1750,3.454,1803,3.454,1829,2.069,1879,2.165,2023,2.616,2235,4.547,2387,3.249,2613,2.388,2617,2.148,2622,2.651,2719,5.553,2767,3.026,2971,2.966,2996,3.411,3059,3.599,3061,3.587,5388,5.514,5417,3.754,5481,2.812,5558,3.587,5754,3.166,5765,3.344,5805,3.026,5806,2.651,5810,2.521,5811,2.616,6037,3.454,6061,3.977,6062,3.249,6063,3.754]],["t/1720",[30,2.105,43,2.977,51,2.321,61,3.466,71,0.801,89,2.783,122,3.225,164,1.603,167,1.969,170,2.711,171,3.487,309,2.232,328,1.969,407,3.43,498,2.254,514,2.287,515,2.298,549,2.161,564,4.432,569,2.997,594,3.523,653,3.326,763,1.843,855,2.932,902,1.871,955,3.526,1010,3.164,1123,4.432,1147,3.776,1336,5.126,1436,3.766,1564,2.433,1636,2.908,1688,3.4,1689,3.4,1693,2.639,1829,4.001,1878,3.107,1940,3.164,2045,3.135,2065,4.128,2149,2.726,2235,2.201,2316,3.291,2608,4.561,2617,5.251,2767,4.128,2862,3.362,2969,4.712,2996,3.027,3027,3.439,3057,4.875,3059,3.194,3141,3.666,3918,4.715,5416,4.432,5418,4.712,5806,3.616,5809,5.121,5810,3.439,5811,3.568,5812,4.712,5813,4.561,5814,4.319,5815,5.121,6064,5.425,6065,5.425,6066,5.425,6067,5.425]],["t/1722",[62,1.832,89,3.425,133,3.096,141,3.894,143,3.059,162,1.937,170,1.862,314,4.647,328,2.423,369,3.894,474,2.535,481,3.664,496,3.378,497,3.071,569,2.601,859,4.721,955,3.061,1085,3.823,1610,5.834,1693,3.248,2055,4.283,2231,6.023,2235,3.599,2266,4.512,2316,4.05,2617,3.606,2996,3.725,3051,5.08,3052,4.45,3249,6.023,3779,5.454,5361,7.061,5695,6.302,5816,6.302,5819,6.302,5831,4.721,5921,5.799,5960,5.799,5974,5.799,6068,6.676,6069,6.676,6070,7.244,6071,6.676,6072,6.676,6073,6.676]],["t/1725",[23,1.153,29,1.934,62,1.472,70,1.683,71,1.052,87,1.567,89,1.534,96,1.135,98,1.231,117,2.744,142,1.621,143,1.682,153,1.085,161,1.334,162,2.021,172,1.451,274,1.918,328,1.085,406,1.708,417,1.28,422,1.331,460,1.896,474,1.135,475,4.801,549,1.191,569,1.165,628,3.167,630,1.896,644,1.669,647,1.403,718,3.601,750,2.698,762,1.135,764,1.603,796,1.446,803,3.342,818,1.42,851,4.298,916,2.275,955,1.371,960,4.298,970,1.556,986,1.918,989,2.614,997,2.189,1020,2.598,1052,3.056,1053,1.728,1075,1.874,1076,2.05,1085,1.713,1122,1.641,1141,1.993,1201,2.514,1271,2.05,1315,2.325,1364,2.325,1387,1.967,1421,2.236,1436,3.023,1470,1.728,1571,1.42,1605,2.928,1638,1.395,1643,4.576,1698,2.164,1706,4.958,1732,1.655,1738,2.614,1797,2.15,1840,4.431,1847,1.744,1878,1.713,2086,3.296,2130,4.116,2149,1.503,2207,4.236,2234,2.15,2235,1.213,2277,1.993,2310,3.128,2316,4.321,2400,1.942,2617,4.794,2622,1.993,2988,1.967,2989,2.23,3018,2.15,3027,3.914,3057,1.896,3059,5.449,3745,2.381,5482,2.823,5677,2.275,5727,2.189,5735,2.598,5810,1.896,5827,3.711,5828,2.823,5829,3.637,5830,2.325,5831,5.037,5832,4.399,5833,2.823,5834,2.698,5835,2.823,5836,2.823,5837,7.406,5838,2.514,5839,2.823,5840,2.823,5841,6.723,5842,2.514,5843,2.698,5844,6.425,5845,5.828,5846,2.275,5847,2.325,5848,4.801,5849,3.792,5850,2.823,5851,2.823,5852,2.823,5853,2.823,5854,2.823,5855,2.823,5856,2.823,6032,2.698,6074,2.99,6075,2.115,6076,6.495,6077,2.99,6078,2.99,6079,2.99,6080,2.99]],["t/1727",[19,1.852,23,1.472,62,1.748,71,1.42,125,2.574,153,2.259,162,2.43,192,4.207,350,3.068,495,4.095,647,2.92,803,2.92,855,2.374,989,3.337,1081,3.858,1119,4.476,1252,3.171,1390,3.701,1786,4.956,1840,3.108,2316,5.133,3060,4.333,3688,4.556,5677,4.737,5806,6.875,5829,4.642,5830,4.84,5831,5.983,5864,7.474,5865,7.987,5867,5.876,6075,7.868,6076,8.143,6081,6.225,6082,6.225,6083,6.225,6084,6.225]],["t/1729",[19,2.555,23,1.283,25,1.803,48,2.173,51,1.793,62,1.908,68,4.132,71,1.049,109,1.278,141,2.444,143,0.859,151,1.439,153,0.904,162,2.352,166,1.378,172,1.247,250,3.053,292,1.123,309,1.025,314,2.917,337,0.825,350,2.673,351,1.315,374,2.985,397,1.511,406,0.872,428,1.168,481,1.367,490,1.638,508,2.908,520,5.273,523,0.837,543,1.345,549,0.992,569,2.997,578,2.319,603,2.264,606,1.378,619,3.39,623,1.683,628,1.617,638,2.195,652,1.733,749,0.911,798,3.945,800,1.617,801,1.543,855,0.95,866,2.873,957,1.791,972,1.849,989,1.335,1014,2.873,1034,3.067,1036,1.367,1037,1.561,1119,1.791,1152,1.182,1176,3.326,1253,1.315,1290,1.638,1310,2.247,1368,1.895,1390,5.49,1412,1.414,1426,1.791,1481,1.895,1576,1.579,1638,1.162,1693,5.288,1796,1.983,1840,5.321,1842,1.481,1971,2.035,2045,2.422,2055,4.553,2110,1.496,2209,3.125,2266,1.683,2310,1.598,2323,3.189,2324,1.937,2342,3.013,2343,1.683,2450,1.937,2613,3.258,2671,1.683,2708,3.424,2862,1.543,2959,3.189,2975,4.866,3060,1.733,3080,3.125,3250,2.094,3974,2.963,4194,1.683,4219,2.035,4977,2.163,5029,1.983,5830,1.937,5834,3.78,5874,2.247,5875,2.247,5876,2.351,5877,2.247,5878,1.895,5879,2.351,5880,2.094,5881,3.523,5882,2.351,5883,2.247,5887,3.523,5893,4.191,5978,2.094,6075,7.614,6076,1.823,6085,2.163,6086,2.49,6087,4.191,6088,2.49,6089,2.49,6090,2.49,6091,2.49,6092,2.49,6093,2.247,6094,2.247,6095,2.49,6096,2.49]],["t/1731",[19,1.413,48,1.706,51,1.239,62,1.594,71,0.428,111,1.258,125,1.198,143,2.083,162,2.569,188,1.785,250,3.399,282,0.831,350,1.427,354,1.577,397,1.757,417,2.584,426,2.154,428,1.359,431,2.203,464,1.689,479,1.018,481,2.607,508,3.237,534,1.313,569,1.129,604,2.326,638,0.999,798,2.437,816,1.858,818,2.255,855,1.812,858,2.048,991,1.881,1010,1.689,1131,1.986,1152,1.375,1219,1.674,1231,1.603,1275,1.795,1353,1.541,1390,4.155,1394,1.986,1410,2.154,1437,4.127,1470,1.674,1512,1.858,1597,2.516,1626,1.986,1633,1.603,1693,4.259,1724,1.815,1741,1.905,1768,1.931,1840,3.489,1842,3.591,1847,4.834,1940,2.771,2055,1.858,2073,2.12,2130,1.931,2234,5.96,2235,3.552,2266,4.722,2310,4.483,2323,3.615,2339,2.853,2408,2.306,2409,1.957,2617,1.565,2671,4.722,2975,3.257,2996,2.651,3050,6.307,3051,6.307,3052,5.835,3053,5.433,3054,5.861,3057,1.836,3058,1.986,3059,1.705,3918,1.776,3956,2.613,3974,2.048,4683,2.613,4977,2.516,5414,2.252,5727,2.12,5754,2.306,5827,2.204,5829,2.16,5831,2.048,5881,3.994,5966,2.435,5978,2.435,5979,2.896,5980,2.896,5981,2.896,5982,4.484,5983,2.896,5986,2.896,5989,2.896,5992,2.896,5995,2.896,5996,2.896,5998,2.896,6001,2.896,6004,2.896,6007,2.896,6010,2.896,6013,2.896,6016,2.896,6019,2.516,6022,2.734,6023,2.734,6024,2.734,6025,2.734,6028,2.516,6029,2.734,6030,2.734,6031,2.734,6032,2.613,6097,4.285,6098,5.078]],["t/1733",[19,1.044,23,1.625,27,2.95,28,1.451,29,2.199,34,2.224,36,2.866,43,1.925,52,2.616,56,1.636,71,0.518,73,1.234,89,1.8,92,3.147,98,1.444,133,1.627,134,2.568,137,1.925,141,2.046,143,1.21,160,2.616,162,2.409,168,2.239,169,2.128,170,2.372,188,1.037,189,3.474,192,2.371,292,1.582,406,1.942,407,1.565,414,1.696,417,2.941,458,1.315,460,2.224,474,1.332,485,2.009,493,1.666,502,1.74,508,2.972,517,2.864,523,1.179,527,1.696,562,2.107,587,1.958,628,2.278,796,2.681,854,2.151,855,2.114,874,2.066,887,2.442,902,2.371,970,1.825,980,1.707,984,2.728,986,2.251,989,1.88,991,2.278,1010,3.233,1081,2.174,1093,2.442,1119,2.523,1162,2.866,1211,2.481,1223,2.338,1256,1.974,1258,1.895,1271,3.801,1292,2.523,1308,2.151,1313,2.066,1336,5.668,1410,4.292,1415,2.866,1421,1.608,1436,2.714,1467,2.669,1576,2.224,1605,4.127,1608,2.442,1610,3.647,1643,2.046,1723,2.568,1732,3.068,1734,2.405,1829,1.825,1842,2.086,2086,2.371,2130,2.338,2235,4.099,2266,2.371,2410,2.151,2450,2.728,2613,2.107,2622,2.338,2671,2.371,2944,2.481,2996,3.093,3027,2.224,3050,2.669,3053,2.728,3054,2.481,3057,2.224,3058,2.405,3059,2.066,3141,3.747,3688,2.568,3762,2.95,3767,3.312,4529,3.047,5625,2.523,5654,2.866,5806,2.338,5831,3.92,5848,2.728,5849,2.728,5864,2.728,6033,3.165,6037,3.047,6038,3.312,6039,3.312,6040,3.312,6041,3.312,6042,3.312,6044,3.312,6099,3.508,6100,3.508,6101,3.807,6102,3.508]],["t/1735",[19,2.397,71,0.857,100,4.736,153,2.104,167,3.361,168,2.342,170,3.037,188,1.714,189,5.05,190,3.431,198,2.121,224,2.889,270,4.508,280,4.1,282,2.658,350,2.857,357,6.415,491,3.235,501,3.108,584,3.765,604,2.839,606,3.208,610,4.506,617,4.323,692,4.508,805,2.688,970,3.017,973,2.704,997,5.897,1038,3.132,1118,4.615,1133,3.975,1292,4.169,1384,3.975,1559,2.532,1693,2.821,1723,4.243,1825,2.995,1829,3.017,2235,4.531,2640,5.036,2996,3.235,3059,3.414,3336,4.615,3453,4.508,5481,4.1,5751,4.508,5955,4.875,6056,5.797,6057,5.472,6103,5.23,6104,6.291]],["t/1737",[48,2.656,162,2.054,188,2.779,282,2.699,422,2.566,604,4.604,2235,4.457]],["t/1739",[23,2.028,44,2.29,59,2.045,61,2.181,71,1.027,81,1.844,87,1.871,125,1.476,143,2.398,164,2.055,168,1.442,170,2.541,172,1.672,192,2.413,200,2.662,292,1.61,354,1.944,375,3.32,406,2.762,407,2.507,422,0.974,426,3.152,459,2.29,474,2.64,479,1.255,515,1.512,533,1.204,546,3.766,554,2.448,569,2.19,580,1.806,614,1.794,718,2.082,721,2.107,741,1.737,751,2.063,752,2.358,792,2.533,805,3.977,815,1.831,850,1.899,854,2.189,855,1.361,859,2.525,873,2.29,942,2.485,972,1.576,973,1.665,989,4.597,1010,2.082,1035,2.448,1053,2.063,1080,2.045,1081,2.213,1099,3.101,1147,2.485,1190,3.101,1193,2.166,1231,3.11,1243,2.613,1288,2.38,1305,2.567,1308,2.189,1354,2.613,1373,2.662,1393,4.573,1410,3.152,1435,2.776,1436,1.748,1564,2.521,1610,4.573,1631,2.166,1672,2.485,1831,2.29,1878,2.045,1920,3.22,1964,2.525,2045,2.063,2130,2.38,2235,3.48,2268,2.842,2408,2.842,2617,3.036,2832,4.475,2966,5.679,2971,5.184,2988,3.697,3141,2.413,3688,2.613,3779,2.917,3918,2.189,4060,4.114,4067,2.917,4172,4.726,5029,2.842,5416,2.917,5582,3.22,5806,2.38,5810,2.263,5811,2.348,5917,3.101,5928,5.534,5935,3.101,5968,3.57,6044,5.306,6045,3.37,6046,3.37,6105,3.57,6106,3.874,6107,3.57,6108,3.57,6109,4.882,6110,3.57,6111,3.874,6112,3.874,6113,3.57]],["t/1741",[19,2.097,142,2.343,153,2.558,162,2.234,309,3.782,752,2.957,902,2.431,989,3.778,1410,3.196,1450,4.698,1638,3.287,1651,6.358,1688,5.76,1689,5.76,1809,4.577,1840,5.106,2410,4.321,2988,6.727,2989,7.627,2991,6.122,3026,7.983,3027,4.468,5814,5.611,5822,6.358,5895,6.653,5896,6.653,6075,7.232,6076,5.158,6114,7.048,6115,6.653]],["t/1743",[48,1.384,62,2.197,137,2.689,153,1.778,162,2.154,170,1.367,250,2.757,291,2.848,313,5.282,428,3.353,437,1.71,444,1.617,474,1.861,485,2.806,497,1.697,573,2.689,647,2.299,763,1.665,792,3.593,803,3.353,855,1.868,873,3.143,1131,4.901,1152,2.326,1638,2.285,1644,7.095,1686,3.586,1688,4.479,1689,4.479,1731,4.382,1840,4.924,1891,6.559,1940,2.858,2020,4.003,2149,2.463,2235,4.002,2617,3.861,2988,4.702,2989,3.654,3057,4.531,5810,4.531,5811,4.702,5897,4.42,5898,6.747,5899,6.747,5900,4.625,5902,6.747,5903,4.625,6075,6.974,6116,7.148,6117,4.9,6118,4.9,6119,4.9,6120,4.9,6121,4.9]],["t/1745",[23,0.859,61,3.722,62,1.178,118,3.749,153,1.319,162,2.283,168,2.302,170,1.014,251,3.103,287,3.494,291,1.448,349,2.011,350,3.465,406,1.273,407,2.542,417,2.439,703,4.251,818,2.706,859,2.57,972,3.103,1342,2.57,1373,4.251,1395,5.938,1470,4.064,1559,1.587,1638,3.28,1643,4.644,1688,2.278,1689,2.278,1809,2.36,1825,1.877,1840,5.406,2122,4.52,2209,2.71,2316,3.458,2617,3.079,2862,3.532,3027,3.613,3055,3.157,3057,4.458,3058,4.821,3974,2.57,5381,2.969,5665,3.43,5810,4.458,5811,3.749,5812,3.157,5813,4.792,5846,2.765,5847,5.468,5904,5.38,5905,6.638,5906,3.43,5907,4.792,5908,8.663,5909,3.43,5910,3.157,5911,7.802,5912,3.43,5913,3.43,5914,3.056,5915,3.43,5916,5.38,5917,3.157,5918,3.43,5919,3.43,5920,3.43,5921,4.951,5922,3.43,5923,3.43,5924,5.38,5925,3.43,5926,3.43,5950,3.157,6075,7.391,6076,2.66,6122,3.634,6123,3.634,6124,3.634,6125,3.634,6126,3.634,6127,3.634,6128,3.943,6129,6.185,6130,3.943,6131,3.943]],["t/1747",[61,2.803,62,2.138,87,2.606,98,2.046,122,2.956,125,2.056,143,2.492,172,1.479,262,5.459,314,5.028,326,2.587,354,2.707,458,1.864,460,3.152,497,2.502,517,2.569,604,2.435,859,3.516,972,2.194,989,4.561,1081,3.081,1131,3.409,1377,2.956,1395,6.965,1436,3.537,1633,5.168,1997,4.319,2045,4.917,2055,5.991,2155,7.63,2316,3.016,2699,3.516,2959,3.783,2971,5.387,3974,5.108,4498,4.062,5775,3.866,5806,3.314,5810,4.58,5811,4.752,5932,7.224,5933,6.074,5934,6.819,5935,4.319,5936,6.074,5937,4.693,5938,4.693,5939,4.693,5940,4.693,5941,4.693,5942,4.693,5943,4.693,5944,4.693,5945,4.693,5946,4.693,5947,4.693,5948,4.693,5949,4.693,5950,4.319,5951,4.693,5952,4.693,6132,7.839,6133,7.839,6134,4.972,6135,4.972,6136,4.972]],["t/1749",[51,3.713,172,2.582,350,4.277,406,3.04,647,4.071,970,4.516,989,4.652,1035,5.95,1064,5.636,1424,5.708,1610,6.889,2532,5.378,2801,8.192,5954,8.192,6062,7.09,6094,7.829]],["t/1751",[19,2.183,23,2.11,51,1.662,52,2.897,61,1.507,62,0.803,70,2.186,71,0.574,81,2.007,98,1.599,107,1.638,109,3.08,114,2.556,125,1.606,134,2.843,137,2.132,138,1.696,143,1.34,162,2.06,167,1.41,168,2.964,170,2.047,171,1.761,172,2.456,188,1.775,272,1.41,292,1.752,328,1.41,350,1.914,404,2.523,406,2.103,407,3.682,422,1.06,474,1.475,479,1.366,496,1.966,497,1.345,508,3.218,515,1.646,518,2.067,523,1.306,546,1.856,566,2.082,569,2.339,575,2.704,596,1.697,638,2.071,855,2.798,970,2.021,972,1.715,989,2.082,1015,2.556,1039,2.664,1041,2.523,1052,3.763,1080,2.225,1089,2.115,1096,2.556,1128,2.463,1140,2.664,1152,2.85,1258,2.099,1285,3.505,1379,3.093,1410,4.046,1435,3.021,1547,3.267,1564,3.702,1574,1.89,1576,2.463,1640,3.093,1693,1.89,1740,3.267,1829,3.818,1893,2.794,2235,4.122,2266,4.057,2441,3.267,2617,2.099,2637,2.956,2767,4.568,2832,3.093,2988,2.556,3052,5.948,3141,2.626,4068,3.505,5810,2.463,5811,2.556,5846,2.956,5847,3.021,5914,3.267,5928,3.093,5929,4.668,6047,3.667,6052,3.667,6054,3.667,6055,3.375,6137,3.885,6138,8.924,6139,3.885,6140,3.885,6141,4.216]],["t/1753",[51,2.285,153,1.937,162,2.316,417,3.254,619,4.23,798,2.739,818,2.535,1605,5.795,1643,4.435,1693,4.309,1840,3.796,1842,3.174,1847,3.114,2024,4.25,2339,3.206,2613,3.206,2862,3.309,2975,3.661,2996,5.916,3050,4.063,3052,5.068,3054,3.775,3057,3.385,3058,6.072,3059,4.477,4056,4.638,4194,5.139,5727,3.907,5827,4.063,5829,3.982,5848,4.152,5849,4.152,5864,4.152,5887,4.489,5907,4.489,5910,4.638,5933,4.489,5936,4.489,5955,4.489,5956,5.04,5959,5.04,5960,4.638,5962,5.04,5963,5.04,5964,5.04,5966,4.489,5967,5.04,5969,4.816,5972,4.638,5974,4.638,5975,5.04,5977,5.04,6062,4.362,6075,3.775,6076,3.907,6093,4.816,6098,4.489,6142,5.339,6143,5.339,6144,5.339,6145,5.339,6146,5.339,6147,5.04,6148,5.339,6149,5.339]],["t/1755",[23,0.866,39,1.146,43,2.009,56,1.707,62,2.116,71,1.36,105,1.323,117,2.06,123,2.377,141,2.135,162,1.252,167,1.328,170,2.684,172,1.705,188,1.082,284,2.023,287,4.331,292,1.651,328,1.328,350,1.804,354,4.725,375,1.748,403,1.292,414,1.77,417,3.421,441,6.083,474,1.39,497,1.985,498,1.521,549,1.458,554,2.51,573,2.009,587,2.042,594,3.723,604,3.914,614,1.84,644,2.042,655,3.302,663,1.918,743,2.32,752,1.536,783,2.99,796,1.77,818,2.721,855,1.396,860,2.377,902,1.263,973,1.707,1013,6.311,1034,5.17,1038,1.977,1039,2.51,1098,2.408,1145,2.474,1153,6.083,1201,3.078,1236,2.846,1237,2.785,1252,1.865,1256,2.06,1258,1.977,1308,2.244,1332,2.632,1342,2.588,1473,2.32,1559,2.503,1564,1.642,1573,1.566,1639,1.678,1796,2.914,1797,2.632,1878,2.096,2208,3.874,2235,4.041,2400,2.377,2486,2.785,2582,2.914,2590,5.171,2691,2.32,2774,2.785,2778,2.785,3699,7.004,4083,3.455,4172,5.94,4498,2.99,5408,4.979,5498,3.18,5576,4.423,5690,3.455,6109,3.18,6150,3.66,6151,3.66,6152,3.66,6153,3.66,6154,3.66,6155,3.66,6156,3.66,6157,3.66,6158,3.66,6159,3.66,6160,9.205]],["t/1757",[19,1.911,23,2.471,48,1.814,62,1.327,71,0.949,84,4.34,111,2.79,162,1.888,170,1.791,176,5.4,188,2.554,261,4.7,262,4.12,272,2.33,282,2.481,290,4.343,326,3.342,328,2.33,353,3.937,383,3.678,397,3.896,406,2.25,458,3.24,493,3.049,523,2.158,573,3.525,751,3.711,792,2.34,801,3.98,882,3.206,972,2.834,1066,4.887,1081,3.98,1199,5.247,1410,2.912,1433,4.887,1559,2.805,1720,5.247,1803,5.579,1829,3.342,1878,3.678,2235,3.963,2405,5.4,2628,6.062,5481,4.541,5929,4.994,6161,6.422,6162,6.422]],["t/1760",[24,4.912,33,4.438,143,2.673,162,1.693,170,2.161,188,2.29,292,3.494,328,2.812,403,2.735,422,2.115,751,4.478,762,2.942,850,4.122,948,4.653,975,4.856,1013,6.696,1080,4.438,1093,5.393,1096,5.097,1282,5.393,1795,6.331,1842,4.607,2774,5.896,5576,5.404,5615,6.99,5670,6.99,5804,7.314,6019,6.731,6163,8.408]],["t/1762",[23,1.481,25,1.365,28,2.59,30,1.593,38,2.136,43,2.253,48,1.16,61,1.593,70,2.31,71,1.482,107,1.731,143,1.416,162,0.897,167,1.49,168,1.658,170,2.69,172,1.864,173,2.815,188,1.851,224,1.472,282,2.18,292,1.851,349,2.272,353,2.517,375,1.961,378,2.351,403,1.449,407,1.831,428,2.939,458,1.539,460,2.603,481,2.253,498,1.706,508,2.201,515,1.739,523,1.38,545,2.815,571,2.903,573,3.438,578,2.272,595,2.106,619,1.961,621,1.985,648,2.573,752,1.722,792,2.282,805,3.522,818,1.949,850,2.184,870,2.544,948,2.465,955,1.882,1211,2.903,1231,3.466,1253,2.168,1256,2.31,1290,2.701,1295,4.987,1336,2.737,1366,2.775,1393,2.701,1410,1.861,1470,2.373,1473,2.603,1482,2.701,1509,3.566,1559,2.736,1564,2.809,1619,2.395,1636,3.357,1638,1.915,1639,1.882,1672,2.858,1693,3.695,1750,3.566,1803,3.566,1829,2.136,1879,2.235,2023,2.701,2235,4.523,2387,3.354,2613,2.465,2617,2.218,2719,4.671,2767,3.124,2971,3.062,2996,3.495,3059,3.688,3061,3.703,5388,5.65,5417,3.875,5481,2.903,5558,3.703,5754,3.268,5765,3.452,5805,3.124,5806,2.737,5810,2.603,5811,2.701,6037,3.566,6061,4.106,6062,3.354,6063,3.875]],["t/1765",[30,2.105,43,2.977,51,2.321,61,3.466,71,0.801,89,2.783,122,3.225,164,1.603,167,1.969,170,2.711,171,3.487,309,2.232,328,1.969,407,3.43,498,2.254,514,2.287,515,2.298,549,2.161,564,4.432,569,2.997,594,3.523,653,3.326,763,1.843,855,2.932,902,1.871,955,3.526,1010,3.164,1123,4.432,1147,3.776,1336,5.126,1436,3.766,1564,2.433,1636,2.908,1688,3.4,1689,3.4,1693,2.639,1829,4.001,1878,3.107,1940,3.164,2045,3.135,2065,4.128,2149,2.726,2235,2.201,2316,3.291,2608,4.561,2617,5.251,2767,4.128,2862,3.362,2969,4.712,2996,3.027,3027,3.439,3057,4.875,3059,3.194,3141,3.666,3918,4.715,5416,4.432,5418,4.712,5806,3.616,5809,5.121,5810,3.439,5811,3.568,5812,4.712,5813,4.561,5814,4.319,5815,5.121,6064,5.425,6065,5.425,6066,5.425,6067,5.425]],["t/1767",[62,1.832,89,3.425,133,3.096,141,3.894,143,3.059,162,1.937,170,1.862,314,4.647,328,2.423,369,3.894,474,2.535,481,3.664,496,3.378,497,3.071,569,2.601,859,4.721,955,3.061,1085,3.823,1610,5.834,1693,3.248,2055,4.283,2231,6.023,2235,3.599,2266,4.512,2316,4.05,2617,3.606,2996,3.725,3051,5.08,3052,4.45,3249,6.023,3779,5.454,5361,7.061,5695,6.302,5816,6.302,5819,6.302,5831,4.721,5921,5.799,5960,5.799,5974,5.799,6068,6.676,6069,6.676,6071,6.676,6072,6.676,6073,6.676,6164,7.244]],["t/1770",[23,1.616,29,2.335,62,1.412,70,1.571,71,1.203,87,1.464,89,1.433,96,1.06,98,1.149,117,2.594,123,1.814,142,0.928,143,1.59,153,1.013,161,2.626,162,2.039,172,0.831,274,1.791,290,1.403,328,1.013,406,1.615,417,1.195,422,1.258,426,1.266,433,0.982,460,1.77,474,1.06,475,3.585,498,1.16,549,1.113,569,1.088,628,2.994,630,1.77,647,1.31,718,3.434,730,3.073,740,1.694,762,1.06,763,1.567,764,1.497,796,1.35,803,3.206,818,1.326,851,4.098,854,1.712,864,1.731,869,1.614,916,2.125,955,1.28,960,4.098,970,2.399,986,1.791,989,2.471,994,2.044,997,2.044,1020,2.426,1052,3.69,1053,1.614,1064,1.814,1075,1.75,1076,1.915,1085,1.599,1122,1.533,1141,1.861,1201,2.348,1271,1.915,1315,2.171,1332,2.008,1364,2.171,1387,1.837,1421,2.114,1436,2.883,1470,1.614,1571,1.326,1576,1.77,1605,2.768,1633,1.545,1638,1.302,1643,4.75,1698,2.045,1706,4.757,1732,1.545,1738,2.471,1797,2.008,1840,4.301,1847,1.629,1964,1.975,2086,3.116,2130,3.924,2149,1.403,2207,4.005,2234,2.008,2235,1.133,2277,1.861,2310,2.957,2316,4.589,2400,1.814,2617,4.654,2622,1.861,2988,1.837,2989,2.083,3027,3.732,3057,1.77,3059,5.304,3745,2.223,5482,2.636,5677,2.125,5727,2.044,5735,2.426,5810,1.77,5827,3.508,5828,2.636,5829,3.438,5830,2.171,5831,4.833,5832,4.159,5833,2.636,5834,2.519,5835,2.636,5836,2.636,5837,7.14,5838,2.348,5839,2.636,5840,2.636,5841,6.451,5842,2.348,5843,2.519,5844,6.165,5845,5.557,5846,2.125,5847,2.171,5848,4.578,5849,3.585,5850,2.636,5851,2.636,5852,2.636,5853,2.636,5854,2.636,5855,2.636,5856,2.636,6074,2.793,6075,1.975,6076,6.306,6077,2.793,6078,2.793,6079,2.793,6080,2.793,6165,2.793]],["t/1772",[19,1.852,23,1.472,62,1.748,71,1.42,125,2.574,153,2.259,162,2.43,192,4.207,350,3.068,495,4.095,647,2.92,803,2.92,855,2.374,989,3.337,1081,3.858,1119,4.476,1252,3.171,1390,3.701,1786,4.956,1840,3.108,2316,5.133,3060,4.333,3688,4.556,5677,4.737,5806,6.875,5829,4.642,5830,4.84,5831,5.983,5864,7.474,5865,7.987,5867,5.876,6075,7.868,6076,8.143,6081,6.225,6082,6.225,6083,6.225,6084,6.225]],["t/1774",[19,2.323,23,1.311,25,1.843,48,1.832,51,1.839,62,1.797,68,2.791,71,0.819,109,1.316,141,2.506,143,0.885,151,1.483,153,0.931,162,2.344,166,1.42,168,1.036,172,1.279,250,3.12,292,1.157,309,1.056,314,2.991,337,0.85,350,2.732,351,1.355,374,3.042,397,1.557,406,0.899,428,1.204,444,0.847,481,1.408,490,1.688,508,2.972,520,4.446,523,0.862,543,1.386,549,1.022,569,2.813,578,2.378,596,1.121,603,2.321,606,1.42,619,3.097,623,1.734,624,1.734,628,1.667,638,2.237,652,1.786,749,0.939,798,3.703,800,1.667,801,1.59,855,0.979,866,2.946,957,1.845,960,1.786,972,1.896,989,1.375,1001,1.59,1014,2.946,1034,3.145,1036,1.408,1037,1.608,1119,1.845,1152,1.218,1176,3.399,1253,1.355,1290,1.688,1310,2.315,1368,1.953,1390,5.171,1412,1.457,1426,1.845,1448,1.71,1481,1.953,1574,1.249,1576,1.627,1638,1.197,1693,5.322,1796,2.043,1840,5.236,1842,1.526,1971,2.096,2045,2.483,2055,4.631,2110,1.541,2209,3.205,2235,1.041,2266,1.734,2310,1.646,2323,3.27,2324,1.995,2342,3.09,2343,1.734,2450,1.995,2613,3.894,2671,1.734,2708,3.511,2862,1.59,2959,3.27,2975,4.95,3060,1.786,3080,3.205,3250,2.158,3974,3.039,4194,2.904,4219,2.096,4256,1.953,4977,2.229,5029,2.043,5830,1.995,5874,2.315,5875,2.315,5876,2.422,5877,2.315,5878,3.27,5879,2.422,5880,2.158,5881,3.613,5882,2.422,5883,2.315,5887,3.613,5978,2.158,6075,7.507,6076,1.878,6085,2.229,6086,2.566,6087,4.297,6088,2.566,6089,2.566,6090,2.566,6091,2.566,6092,2.566,6093,2.315,6094,2.315,6095,2.566,6096,2.566,6166,2.422]],["t/1776",[19,1.077,23,1.659,27,3.045,29,2.254,36,2.958,43,1.987,52,2.701,56,1.689,71,0.84,73,1.273,89,1.858,92,2.055,98,1.49,133,1.679,134,2.65,137,1.987,141,2.112,143,1.249,162,2.426,168,2.296,170,2.409,189,3.562,192,2.447,406,1.991,407,1.615,417,3.002,458,1.358,460,2.296,474,1.375,485,2.074,493,1.719,502,1.796,508,3.047,517,2.936,562,2.175,587,2.02,604,1.773,619,1.73,628,2.352,796,2.748,855,1.381,887,2.52,902,2.42,970,1.884,980,1.762,986,2.323,989,1.941,1010,2.112,1081,2.244,1093,2.52,1119,2.604,1162,2.958,1174,2.65,1211,2.561,1223,2.414,1256,2.038,1258,1.956,1271,3.897,1292,2.604,1308,2.22,1313,2.132,1336,5.755,1410,4.345,1415,2.958,1421,1.66,1436,2.783,1467,2.755,1605,4.213,1608,2.52,1610,4.615,1643,2.112,1723,2.65,1732,3.882,1734,2.483,1829,1.884,1840,2.838,1842,2.153,2086,2.447,2130,2.414,2234,4.087,2235,4.026,2266,2.447,2310,2.323,2450,2.816,2613,3.413,2622,2.414,2671,2.447,2996,3.171,3027,2.296,3050,2.755,3053,2.816,3054,2.561,3059,2.132,3141,3.841,3688,2.65,3762,3.045,3767,3.418,4194,2.447,4529,3.145,5625,2.604,5654,2.958,5806,2.414,5831,4.019,5848,2.816,5849,2.816,5864,2.816,6033,3.267,6037,3.145,6038,3.418,6039,3.418,6040,3.418,6041,3.418,6042,3.418,6099,3.621,6100,3.621,6102,3.621,6167,3.929,6168,3.929]],["t/1778",[19,2.288,33,3.107,71,1.136,100,4.432,105,1.961,153,1.969,162,1.68,167,2.791,168,2.191,170,3.177,188,1.603,189,5.599,190,3.274,198,1.984,224,2.757,270,4.218,280,3.836,282,2.564,350,2.673,357,6.122,491,3.027,501,2.908,584,3.523,610,4.347,617,4.046,692,4.218,805,2.516,970,2.823,973,2.53,997,5.628,1038,2.93,1118,4.319,1133,3.719,1292,3.901,1384,3.719,1559,2.369,1693,2.639,1723,3.97,1825,2.803,1829,2.823,1893,3.901,1902,3.776,2235,4.622,2640,4.712,2996,3.027,3059,3.194,3336,4.319,3453,4.218,5481,3.836,5751,5.98,5764,4.561,5955,6.466,6057,5.121,6103,4.894,6169,5.886]],["t/1780",[23,1.994,44,2.212,59,1.975,61,2.122,71,1.143,81,1.782,87,1.807,125,1.426,143,2.344,164,2.009,168,1.393,170,2.503,172,1.627,192,2.331,200,2.572,292,1.555,313,1.769,354,1.878,375,3.246,406,2.709,407,2.439,422,0.941,426,3.081,459,2.212,474,2.58,479,1.923,497,1.194,515,1.461,533,1.163,546,3.694,554,2.364,569,2.131,580,1.745,602,1.975,614,1.733,647,1.618,717,2.24,718,2.011,721,2.051,741,1.678,751,1.993,752,2.294,792,2.476,805,3.911,815,1.769,850,1.834,854,2.114,855,1.315,859,2.439,873,2.212,942,2.4,970,1.794,972,1.522,973,1.608,989,4.52,1010,2.011,1035,2.364,1053,1.993,1080,1.975,1081,2.137,1099,2.996,1147,2.4,1190,2.996,1193,2.092,1206,2.682,1231,3.026,1243,2.524,1288,2.299,1305,2.48,1308,2.114,1354,2.524,1373,2.572,1393,4.47,1410,3.081,1435,2.682,1436,1.689,1564,2.453,1610,5.088,1631,2.092,1672,2.4,1831,2.212,1878,1.975,1918,2.212,1920,3.111,1964,2.439,2045,1.993,2130,2.299,2235,3.422,2268,2.745,2316,3.318,2408,2.745,2617,2.954,2832,4.354,2966,5.552,2971,5.068,2988,3.597,3141,2.331,3688,2.524,3779,2.817,3918,2.114,4060,4.003,4067,2.817,5029,2.745,5416,2.817,5582,3.111,5806,2.299,5810,2.186,5811,2.268,5917,2.996,5928,5.41,5935,2.996,6045,3.255,6046,3.255,6062,2.817,6105,3.449,6107,3.449,6108,3.449,6109,4.751,6110,3.449,6113,3.449,6170,3.742,6171,3.742,6172,5.934]],["t/1782",[19,2.068,142,2.31,153,2.522,162,2.219,309,3.748,580,3.517,752,2.916,902,2.398,989,3.726,1410,3.152,1450,4.633,1638,3.242,1651,6.27,1688,5.708,1689,5.708,1809,4.514,1840,5.072,2410,4.262,2988,6.682,2989,7.576,2991,6.038,3026,7.912,3027,4.407,5814,5.534,5822,6.27,5895,6.562,5896,6.562,6075,7.184,6076,5.087,6114,6.951,6115,6.562,6173,7.543]],["t/1784",[48,1.371,62,2.19,137,2.664,153,1.761,162,2.146,170,1.354,250,2.731,291,2.828,313,5.264,428,3.33,437,1.693,444,1.601,474,1.843,485,2.779,497,1.68,573,2.664,580,2.456,647,2.277,763,1.649,792,3.579,803,3.33,855,1.851,873,3.113,1131,4.866,1152,2.304,1638,2.264,1644,7.056,1686,3.552,1688,4.448,1689,4.448,1731,4.351,1840,4.905,1891,6.529,1940,2.831,2020,3.965,2149,2.439,2235,3.986,2617,3.834,2988,4.669,2989,3.619,3057,4.499,5810,4.499,5811,4.669,5897,4.378,5898,6.7,5899,6.7,5900,4.581,5902,6.7,5903,4.581,6075,6.947,6116,8.391,6117,4.853,6118,4.853,6119,4.853,6120,4.853,6121,4.853]],["t/1786",[23,0.711,61,3.452,62,1.012,71,0.444,118,3.223,143,1.038,153,1.092,162,2.154,167,1.092,168,1.979,170,0.839,251,2.668,287,3.004,291,1.199,349,1.665,350,3.055,406,1.716,407,1.342,417,2.097,421,1.678,460,1.907,485,1.723,497,1.042,573,1.651,580,1.522,638,1.038,703,3.654,718,1.755,721,1.128,751,1.738,756,1.651,802,2.033,818,2.326,855,1.147,859,2.127,861,1.755,902,1.038,972,2.736,986,1.93,1231,1.665,1342,2.127,1373,5.331,1395,4.624,1426,2.163,1470,3.583,1557,1.806,1559,1.314,1610,1.979,1638,2.286,1643,4.922,1688,1.885,1689,1.885,1809,1.954,1825,2.531,1840,5.229,2055,1.93,2086,2.033,2122,4.057,2209,2.243,2268,2.395,2316,2.973,2347,2.094,2362,2.714,2367,2.84,2527,2.529,2617,1.625,2691,1.907,2862,3.037,3016,2.163,3027,3.106,3055,2.613,3057,4.989,3058,5.396,3083,4.821,3974,4.384,4060,2.202,4529,2.613,5381,2.458,5665,2.84,5810,3.106,5811,4.078,5812,2.613,5813,4.12,5846,2.289,5847,3.81,5904,4.625,5905,4.625,5906,4.625,5907,4.12,5908,8.755,5909,2.84,5910,2.613,5911,7.099,5912,2.84,5913,2.84,5914,2.529,5915,2.84,5916,2.84,5917,4.256,5918,2.84,5919,2.84,5920,5.852,5921,4.256,5922,2.84,5923,2.84,5924,4.625,5925,2.84,5926,2.84,5928,2.395,5950,2.613,6075,6.974,6076,2.202,6115,2.84,6122,3.008,6123,3.008,6124,3.008,6125,3.008,6126,3.008,6127,3.008,6147,2.84,6174,3.264,6175,5.317,6176,6.727,6177,3.264,6178,3.264,6179,5.317,6180,3.264]],["t/1788",[23,0.967,61,2.939,62,1.29,87,4.444,89,2.098,98,1.683,122,2.431,125,1.691,143,2.154,153,1.484,162,0.893,168,2.522,172,1.217,262,4.86,313,2.098,314,2.846,326,2.128,328,1.484,354,4.124,406,1.432,407,1.824,458,1.533,460,2.592,496,2.069,497,2.162,517,2.112,580,2.069,604,2.002,611,3.663,650,2.143,859,4.416,948,2.455,955,1.875,972,1.805,989,3.347,1081,2.534,1131,2.803,1373,3.049,1377,3.713,1395,6.323,1436,3.709,1450,2.725,1610,2.69,1633,3.455,1997,3.552,2045,5.564,2055,4.86,2155,7.866,2235,1.659,2316,2.481,2532,2.534,2699,2.891,2958,4.089,2959,4.751,2971,6.323,3058,2.803,3707,3.86,3974,5.357,4172,5.25,4498,3.341,4507,3.255,5029,3.255,5775,3.18,5806,4.162,5810,3.959,5811,4.107,5933,5.25,5934,3.86,5936,6.37,5937,3.86,5938,3.86,5939,3.86,5940,3.86,5941,3.86,5942,3.86,5943,3.86,5944,3.86,5945,3.86,5946,3.86,5947,3.86,5948,3.86,5949,3.86,5950,3.552,5951,3.86,5952,3.86,5969,3.689,6097,3.689,6134,4.089,6135,4.089,6136,4.089,6181,4.437,6182,4.437,6183,4.089,6184,4.437,6185,4.437,6186,4.437,6187,4.437,6188,4.437,6189,4.437]],["t/1790",[51,3.651,172,2.538,350,4.204,406,2.989,580,4.317,647,4.003,970,4.44,989,4.573,1035,5.85,1064,5.541,1424,5.612,1610,7.345,2532,5.288,2801,8.054,5954,8.054,6062,6.971,6094,7.697]],["t/1792",[19,2.178,23,2.107,51,1.656,52,2.886,61,1.501,62,0.8,70,2.178,71,0.572,81,1.999,98,1.593,107,1.632,109,3.755,114,2.546,125,1.6,134,2.832,137,2.124,138,1.691,143,1.335,162,2.057,167,1.404,168,2.957,170,2.042,171,1.755,172,2.451,188,1.769,272,1.404,292,1.745,328,1.404,350,1.907,404,2.514,406,2.097,407,3.674,422,1.056,474,1.47,479,1.361,496,1.958,497,1.34,508,3.209,515,1.64,518,2.059,546,1.849,566,2.074,569,2.332,575,2.694,596,1.69,638,2.065,855,2.791,970,2.014,972,1.708,973,1.805,989,2.074,1015,2.546,1039,2.653,1041,2.514,1052,3.751,1080,2.216,1089,2.107,1096,2.546,1128,2.453,1140,2.653,1152,2.842,1258,2.091,1285,3.491,1379,3.081,1410,4.039,1435,3.009,1547,3.254,1564,3.694,1574,1.883,1576,2.453,1640,3.081,1693,1.883,1740,3.254,1829,3.809,1893,2.783,2235,4.226,2266,4.045,2441,3.254,2617,2.091,2767,4.555,2832,3.081,2988,2.546,3052,5.938,3141,2.616,4068,3.491,5810,2.453,5811,2.546,5846,2.945,5847,3.009,5914,3.254,5928,3.081,5929,4.655,6047,3.653,6052,3.653,6054,3.653,6055,3.362,6137,3.87,6138,8.908,6139,3.87,6140,3.87,6190,4.2]],["t/1794",[51,2.285,153,1.937,162,2.316,417,3.254,619,4.23,798,2.739,818,2.535,1605,5.795,1643,4.435,1693,4.309,1840,3.796,1842,3.174,1847,3.114,2024,4.25,2339,3.206,2613,3.206,2862,3.309,2975,3.661,2996,5.916,3050,4.063,3052,5.068,3054,3.775,3057,3.385,3058,6.072,3059,4.477,4056,4.638,4194,5.139,5727,3.907,5827,4.063,5829,3.982,5848,4.152,5849,4.152,5864,4.152,5887,4.489,5907,4.489,5910,4.638,5933,4.489,5936,4.489,5955,4.489,5956,5.04,5959,5.04,5960,4.638,5962,5.04,5963,5.04,5964,5.04,5966,4.489,5967,5.04,5969,4.816,5972,4.638,5974,4.638,5975,5.04,5977,5.04,6062,4.362,6075,3.775,6076,3.907,6093,4.816,6098,4.489,6142,5.339,6143,5.339,6144,5.339,6145,5.339,6146,5.339,6147,5.04,6148,5.339,6149,5.339]],["t/1796",[43,2.009,56,1.707,62,2.116,71,1.36,105,1.323,117,2.06,123,2.377,139,1.292,141,2.135,162,1.252,167,2.08,170,2.684,172,1.705,188,1.694,284,2.822,287,4.331,292,1.651,328,1.328,350,1.804,354,4.725,375,1.748,403,1.292,414,1.77,417,3.421,441,6.083,474,1.39,497,1.985,498,1.521,514,1.543,549,1.458,554,2.51,573,2.009,587,2.042,594,3.723,604,3.914,614,1.84,644,2.042,655,3.302,663,1.918,743,2.32,752,1.536,783,2.99,796,1.77,818,2.721,855,1.396,902,1.263,991,2.377,1013,5.95,1034,5.17,1038,1.977,1098,2.408,1145,2.474,1153,6.083,1201,3.078,1235,2.474,1236,2.846,1237,2.785,1252,1.865,1256,2.06,1258,1.977,1308,2.244,1332,2.632,1342,2.588,1559,2.503,1573,1.566,1639,1.678,1797,2.632,1878,2.096,2208,3.874,2235,4.155,2400,2.377,2486,2.785,2582,2.914,2590,5.171,2691,2.32,2778,2.785,3699,7.004,4083,3.455,4172,5.94,4498,2.99,5408,4.979,5498,3.18,5576,3.909,5690,3.455,6109,3.18,6150,3.66,6151,3.66,6152,3.66,6153,3.66,6154,3.66,6155,3.66,6156,3.66,6157,3.66,6158,3.66,6159,3.66,6160,9.205,6191,3.972,6192,3.972]],["t/1798",[19,1.911,23,2.471,48,1.814,62,1.327,71,0.949,84,4.34,111,2.79,162,1.888,170,1.791,176,5.4,188,2.554,261,4.7,262,4.12,272,2.33,282,2.481,290,4.343,326,3.342,328,2.33,353,3.937,383,3.678,397,3.896,406,2.25,458,3.24,493,3.049,523,2.158,573,3.525,751,3.711,792,2.34,801,3.98,882,3.206,972,2.834,1066,4.887,1081,3.98,1199,5.247,1410,2.912,1433,4.887,1559,2.805,1720,5.247,1803,5.579,1829,3.342,1878,3.678,2235,3.963,2405,5.4,2628,6.062,5481,4.541,5929,4.994,6161,6.422,6162,6.422]],["t/1801",[19,2.112,23,2.183,25,3.069,30,2.753,71,1.516,138,2.005,139,2.505,168,2.867,181,4.796,188,2.098,309,2.921,422,2.52,461,3.273,493,3.369,508,3.804,523,2.385,638,3.749,786,5.4,815,3.641,855,2.706,888,5.019,946,4.94,972,3.132,1117,3.804,1410,3.218,1671,5.968,1829,3.693,2096,5.968,2532,4.399,3082,4.94,5561,8.02,6193,7.701,6194,7.701,6195,7.701]],["t/1803",[69,5.193,140,5.697,376,7.806,444,2.965,638,3.689,805,4.167,1275,5.569,1829,4.676,2023,7.035,5630,7.556,6196,9.751]],["t/1805",[23,1.558,54,4.227,89,3.38,125,2.725,134,4.823,137,3.617,168,2.662,170,2.76,171,2.988,188,1.948,275,5.128,277,3.588,284,3.103,291,2.625,308,5.724,355,4.66,406,2.308,407,2.939,431,3.056,502,3.268,638,3.033,721,2.471,740,3.998,764,3.532,805,3.056,1002,3.943,1198,5.39,1377,3.918,1412,3.74,1421,3.021,1467,5.014,1698,3.901,1729,4.334,1847,3.843,1976,4.084,2062,5.54,2089,4.392,3145,6.22,3692,6.22,4271,6.589,5625,4.738,6197,7.15,6198,7.15,6199,7.15,6200,7.15,6201,7.15]],["t/1807",[39,1.825,62,1.671,71,1.372,139,2.058,143,2.011,164,1.723,282,2.666,291,3.997,313,2.991,347,5.831,378,3.339,444,1.924,518,3.102,604,2.855,638,3.461,792,2.124,805,3.751,902,2.791,989,3.125,1089,3.175,1308,3.575,1364,4.534,1390,3.467,1557,3.501,1571,2.768,1693,3.936,1731,3.575,1829,5.22,1940,4.718,1943,4.903,2324,4.534,3060,6.466,3081,4.534,3084,4.764,3085,4.764,3086,5.065,3088,4.764,3089,4.764,3091,4.903,3117,5.26,4550,5.831,6202,6.327,6203,6.327,6204,6.327,6205,6.327,6206,6.327,6207,5.831,6208,6.327,6209,6.327,6210,6.327,6211,6.327,6212,6.327,6213,6.327,6214,6.327]],["t/1810",[19,0.92,23,2.255,24,1.959,25,1.027,28,0.724,30,1.199,40,2.472,53,1.238,56,1.442,59,1.002,62,0.362,68,1.137,69,1.011,81,0.904,89,0.898,96,2.172,105,0.633,110,1.639,118,1.151,125,1.278,137,0.961,139,1.091,140,1.11,143,1.432,153,0.635,161,0.781,164,0.914,170,2.026,173,4.679,251,0.953,272,1.818,274,1.123,275,1.021,284,0.618,287,2.545,290,2.518,291,1.654,300,1.754,309,0.72,327,0.836,355,1.238,369,4.236,375,0.836,397,1.062,403,1.091,406,0.613,408,1.52,418,1.361,422,0.478,451,1.011,459,1.123,460,1.11,481,0.961,493,1.97,497,1.07,513,1.011,514,0.738,518,0.931,523,1.039,549,1.654,554,1.2,573,0.961,580,0.886,596,0.764,599,1.021,604,0.857,607,3.832,612,1.031,638,3.838,644,0.977,647,0.821,718,3.684,730,2.06,739,4.842,740,1.062,762,1.174,763,0.595,764,0.938,766,1.11,850,0.931,854,1.073,857,2.305,861,1.021,864,1.085,874,1.031,890,0.985,932,0.931,948,1.051,955,0.802,957,1.258,967,3.385,972,0.772,989,3.893,990,1.167,992,1.097,1002,1.386,1037,1.097,1038,3.089,1076,1.2,1080,1.002,1083,1.2,1085,1.002,1089,0.953,1122,0.961,1124,4.553,1127,0.931,1132,1.361,1152,0.831,1162,2.525,1185,1.393,1195,1.43,1198,1.073,1231,1.71,1256,0.985,1292,1.258,1314,1.123,1342,1.238,1373,3.095,1395,1.305,1412,1.754,1421,2.297,1423,1.75,1424,2.033,1442,2.935,1480,2.262,1521,3.158,1571,0.831,1626,1.2,1631,1.062,1638,2.336,1655,1.52,1664,1.43,1666,1.393,1672,2.151,1677,6.107,1678,2.599,1679,1.52,1698,3.897,1706,2.151,1727,2.403,1787,1.75,1815,3.918,1825,2.588,1829,1.608,1850,1.472,1878,1.77,1943,1.472,1968,1.579,1976,1.916,2028,1.332,2055,3.213,2081,1.332,2110,1.856,2122,0.993,2147,1.183,2236,1.361,2347,2.151,2410,1.073,2451,2.06,2453,1.2,2457,1.472,2486,3.158,2536,1.43,2760,4.672,2778,1.332,3010,3.487,3092,5.399,3093,5.399,3094,5.399,3148,1.361,3369,1.579,3955,3.744,4382,1.579,4484,6.897,4507,4.553,4535,1.43,4666,1.75,4685,2.06,4728,3.736,5397,4.212,5428,4.092,5510,1.75,5540,1.75,5623,1.43,5629,1.43,5663,1.652,5747,2.788,5838,1.472,5842,1.472,5843,1.579,6215,1.899,6216,5.435,6217,1.899,6218,1.899,6219,4.728,6220,1.899,6221,3.354,6222,1.899,6223,1.899,6224,1.899,6225,1.899,6226,1.899,6227,1.899,6228,1.899,6229,3.918,6230,3.918,6231,3.354,6232,1.899,6233,1.899,6234,1.899,6235,1.899,6236,1.899,6237,1.899,6238,1.899,6239,1.899,6240,1.899]],["t/1812",[23,1.348,39,1.784,59,5.689,71,0.842,125,2.357,143,3.166,145,3.207,164,1.685,172,2.369,223,5.303,290,4.612,291,2.271,300,3.235,316,2.722,335,6.387,337,1.888,375,2.722,389,4.601,406,1.996,461,2.628,515,2.415,558,3.799,589,4.957,604,3.899,611,2.756,638,3.974,653,3.494,762,2.164,763,1.937,793,4.03,865,4.098,986,3.656,989,3.055,1072,4.03,1209,4.52,1218,3.852,1289,5.7,1363,4.03,1384,3.908,1410,2.584,1571,2.706,1841,3.494,1893,4.098,2667,3.967,3106,7.516,3108,6.695,5764,4.792,6241,6.185,6242,6.185,6243,6.185,6244,6.185]],["t/1814",[23,1.09,25,2.272,30,3.159,44,2.957,58,2.714,61,2.651,62,0.953,71,1.01,78,3.67,89,2.365,111,2.003,142,2.272,143,1.59,146,2.287,154,2.617,164,2.407,168,1.862,170,1.286,172,2.033,272,1.673,291,3.589,300,3.879,309,3.351,328,1.673,337,2.263,346,2.857,368,2.416,369,2.689,481,3.751,497,1.596,508,2.471,517,2.382,549,1.837,580,2.333,595,2.365,596,2.013,604,3.346,638,3.318,762,1.75,771,2.714,785,3.585,793,3.26,934,2.399,966,3.325,967,4.828,990,3.073,1002,3.065,1036,2.53,1256,2.594,1266,3.508,1304,3.438,1313,2.714,1376,3.766,1412,2.617,1571,3.245,1642,1.915,1732,2.551,1825,2.382,1841,2.826,1976,5.961,2149,2.317,2347,3.209,2716,4.004,3105,4.352,3107,6.451,3369,4.159,3370,4.61,3955,6.165,6229,6.451,6230,6.451,6245,5.002,6246,5.002,6247,8.837,6248,5.002,6249,7.416,6250,5.002,6251,5.002,6252,5.002,6253,5.002,6254,5.002,6255,5.002]],["t/1816",[19,1.07,23,2.16,40,1.554,53,2.542,71,1.271,103,2.542,110,1.42,113,2.585,124,2.365,125,2.337,138,1.016,139,2.465,143,2.409,164,1.671,172,1.07,173,2.465,272,1.305,274,2.307,308,3.123,355,5.598,369,4.073,375,1.717,378,3.237,444,2.84,474,1.365,481,3.102,497,3.309,549,1.432,582,6.697,604,2.767,638,3.665,647,1.687,699,1.927,718,2.097,721,1.348,740,4.237,756,1.973,792,2.544,814,2.204,854,2.204,861,2.097,921,2.253,967,1.927,989,4.243,991,2.335,1002,3.55,1012,1.973,1049,3.243,1089,1.958,1107,2.585,1111,3.997,1117,1.927,1160,5.314,1225,2.796,1341,3.243,1395,6.417,1421,1.648,1435,2.796,1541,2.307,1564,3.859,1626,2.465,1698,2.508,1726,3.595,1729,2.365,1767,2.542,1806,2.542,1829,3.634,1849,3.595,2147,5.35,2235,1.459,2492,3.243,2668,2.736,2944,2.542,3042,3.243,3369,3.243,3730,8.123,3955,3.243,4971,3.595,5019,3.243,5379,2.796,5397,3.023,6229,3.394,6230,3.394,6256,6.133,6257,3.901,6258,6.133,6259,6.133,6260,6.133,6261,3.243,6262,3.901,6263,6.983,6264,3.901,6265,3.901,6266,3.901]],["t/1818",[19,2.604,167,3.176,190,3.727,437,3.054,534,3.969,604,4.286,605,6.969,606,4.844,610,4.259,638,3.895,974,5.311,1829,4.555,2447,6.661,5751,6.807]],["t/1822",[71,1.486,111,3.529,139,2.867,263,5.033,309,4.496,327,4.804,515,3.441,1364,7.821,1389,4.829,1540,5.743,1802,6.315,2144,5.21,2608,6.829,3918,6.698,5577,7.501,6267,8.813,6268,8.122]],["t/1824",[30,3.789,48,2.189,98,3.189,125,3.204,533,2.614,543,4.186,549,3.087,595,3.975,763,2.633,946,5.393,972,3.42,1010,4.52,1059,4.971,1146,5.779,1253,4.091,1421,3.553,1442,5.48,1714,6.169,1965,5.572,3918,4.751,5446,7.749,5577,7.284,5641,7.749,5727,5.671,6269,8.408,6270,7.749,6271,8.408,6272,8.408,6273,8.408]],["t/1826",[24,2.624,34,2.624,43,2.272,61,2.445,62,1.302,71,0.612,98,2.594,143,1.428,152,1.989,170,1.155,272,2.287,273,2.881,274,5.474,290,2.08,309,2.594,313,3.233,316,3.645,328,1.502,351,2.185,406,1.45,428,1.942,464,2.414,479,1.455,501,2.219,515,1.754,533,1.396,549,2.511,587,2.309,637,2.976,638,1.428,642,2.976,763,2.142,765,3.595,769,3.218,854,2.538,861,2.414,890,2.329,934,2.154,955,2.89,972,2.781,1002,2.826,1126,2.437,1128,2.624,1141,6.121,1142,3.595,1202,2.881,1206,5.935,1223,2.759,1275,2.565,1288,5.087,1300,3.295,1364,3.218,1394,2.838,1409,3.295,1421,1.898,1475,3.907,1477,3.907,1605,4.583,1613,4.321,1667,4.139,1681,3.734,1693,3.067,1731,2.538,1831,2.655,1976,2.565,2007,3.734,2024,3.295,2409,2.797,2575,3.734,2608,6.418,2617,4.123,2734,5.149,3083,3.218,3141,2.797,3520,4.139,3918,2.538,4090,4.139,4510,3.907,5577,6.363,5642,3.734,5972,3.595,6268,4.139,6274,4.491,6275,4.491,6276,4.491,6277,4.491,6278,4.491,6279,4.491,6280,4.491,6281,4.139,6282,4.139,6283,4.139,6284,8.668,6285,6.303,6286,4.491,6287,4.139,6288,3.734,6289,4.491,6290,3.907,6291,4.491,6292,4.491,6293,4.491,6294,3.907,6295,4.491]],["t/1828",[71,1.282,83,3.84,107,3.123,110,2.033,123,3.344,125,2.129,139,1.818,143,1.776,167,1.868,272,1.868,313,5.16,316,4.145,334,3.918,337,2.454,343,4.473,406,1.804,426,3.359,428,4.072,458,1.931,479,1.811,497,1.783,501,2.76,546,2.459,576,2.505,754,3.918,763,2.518,769,4.004,796,2.49,803,2.416,970,3.855,1064,4.812,1081,3.191,1097,4.645,1141,4.939,1142,4.473,1202,3.584,1206,4.004,1288,3.432,1304,3.84,1377,3.061,1394,3.53,1613,3.53,1983,3.387,2617,4.002,2655,4.86,2716,6.436,2734,4.207,3087,5.761,5577,7.811,6284,10.188,6285,5.149,6288,4.645,6290,4.86,6294,6.994,6296,7.409,6297,5.149,6298,5.587,6299,5.587,6300,5.587,6301,5.587,6302,5.587,6303,5.587,6304,5.587,6305,5.587]],["t/1830",[58,5.154,188,2.587,288,3.947,313,4.49,316,4.181,428,4.107,763,2.974,970,4.555,973,4.083,1117,4.692,1253,4.622,1304,6.528,1636,4.692,5577,7.851,6306,9.498]],["t/1833",[164,2.42,291,3.262,497,2.835,662,6.484,718,4.775,855,3.122,902,3.487,1170,6.93,1474,7.728,1599,5.613,2235,3.322,2267,8.187,2672,7.691,3918,5.02,4174,7.728,5577,6.106,6296,8.187,6307,8.884,6308,8.884,6309,8.884]],["t/1835",[25,2.393,28,2.976,35,3.773,71,1.377,188,2.128,271,3.144,272,2.612,284,2.541,291,3.712,464,4.198,514,3.035,604,3.525,625,4.865,638,3.769,756,3.951,886,5.597,1141,4.798,1412,4.086,1559,3.144,1562,4.461,1831,4.618,1964,5.09,1976,4.461,2639,4.28,2672,5.477,2734,5.881,3086,6.253,3087,7.245,5642,6.493,6288,8.405,6294,9.752,6310,6.795]],["t/1837",[23,1.5,62,1.77,71,0.937,98,2.61,105,2.292,110,2.504,139,2.239,145,3.569,251,3.453,272,2.301,313,3.253,337,2.1,428,2.975,444,2.093,568,4.826,741,3.086,749,3.134,816,4.068,818,3.011,886,4.931,902,2.188,955,2.908,972,2.799,997,4.641,1141,4.227,1377,3.771,1410,2.875,1613,5.875,1633,4.741,1800,5.986,1825,3.276,1969,4.485,2110,3.808,2617,3.426,2709,5.509,2906,4.73,2988,4.172,3083,4.931,3364,6.342,5527,6.342,5577,4.73,5642,5.721,5972,5.509,6085,7.443,6281,6.342,6282,6.342,6283,6.342,6284,5.986,6288,5.721,6290,5.986,6310,5.986,6311,6.882,6312,6.882,6313,6.882,6314,6.882]],["t/1841",[19,2.188,23,1.739,25,2.445,28,3.907,30,2.853,70,4.139,162,1.606,164,2.174,167,2.669,172,2.811,224,2.637,282,2.996,349,4.07,353,4.509,403,2.596,428,3.451,481,4.037,752,3.086,763,2.499,1231,4.07,1290,4.838,1410,3.335,1470,4.25,1564,3.298,2235,4.731,2387,6.009,2622,4.902,2719,7.046]],["t/1843",[51,1.973,89,2.365,115,1.812,162,1.779,164,1.363,170,1.906,188,2.02,328,1.673,417,2.924,444,1.521,479,2.403,497,2.366,508,2.471,527,2.229,549,1.837,578,2.551,718,2.689,792,2.49,800,2.994,801,2.857,818,2.189,861,2.689,902,1.59,942,4.757,960,3.209,997,3.374,1034,3.374,1072,3.26,1095,3.161,1129,3.116,1152,2.189,1364,3.585,1393,3.032,1405,3.766,1445,4.159,1448,3.073,1562,2.857,1605,4.104,1638,3.799,1643,5.61,1657,3.374,1671,3.876,1693,3.962,1706,3.209,1940,2.689,2030,3.876,2055,5.778,2122,2.617,2130,3.073,2149,2.317,2235,4.231,2310,2.957,2532,4.236,2613,2.768,2617,3.692,2691,5.163,2708,3.766,3027,2.922,3745,3.67,3974,3.26,4168,4.159,4194,3.116,4219,3.766,4256,3.508,5576,2.551,5649,4.352,5651,4.352,5652,4.61,5827,3.508,5832,4.159,5878,3.508,5883,4.159,6085,4.004,6166,4.352,6310,4.352,6315,7.416,6316,5.002,6317,7.416,6318,5.002,6319,5.002,6320,4.159,6321,7.416,6322,5.002,6323,7.416,6324,5.002]],["t/1845",[19,2.824,111,4.124,162,2.073,188,2.805,2235,3.852,3057,6.017,3058,6.508]],["t/1847",[162,2.56,170,1.269,291,1.812,417,4.29,490,7.647,569,2.636,578,2.517,818,4.759,1643,6.835,1693,3.292,1840,5.538,1847,6.222,2234,6.434,2310,4.34,2324,3.536,2613,4.063,2671,4.572,2996,2.538,3050,6.147,3051,6.808,3052,7.265,3053,5.261,3054,7.089,3059,3.984,3060,3.165,6097,4.103,6098,3.824,6320,4.103]],["t/1849",[162,2.503,170,1.235,250,4.969,291,1.764,417,4.248,490,7.455,569,2.584,578,2.451,818,4.49,1643,6.683,1693,3.227,1840,5.138,1842,5.25,1847,6.173,2234,5.718,2266,6.708,2310,6.368,2324,3.444,2671,6.708,2996,2.471,3050,6.051,3051,6.051,3052,6.86,3053,5.158,3054,7.019,3059,3.905,3060,3.082,6097,3.995,6098,3.724,6320,3.995]],["t/1851",[23,1.548,164,2.915,170,2.442,291,3.488,479,2.302,490,4.306,534,2.968,569,4.102,578,3.623,584,4.252,739,3.972,796,3.166,902,2.258,932,3.483,955,3.002,986,4.2,1013,4.489,1131,6.002,1388,5.687,1390,3.892,1450,4.364,1643,5.106,1693,4.798,1825,3.382,1829,3.406,1918,4.2,1921,6.547,2235,2.657,2613,3.931,2617,3.536,2691,4.15,2996,3.653,3059,3.855,3918,4.014,5576,3.623,5649,8.263,5651,6.18,5929,5.091,6320,5.906,6325,9.499,6326,7.104,6327,7.104]],["t/1853",[19,1.312,48,2.241,51,2.829,62,1.95,71,0.977,125,1.823,143,2.281,162,1.444,188,1.954,282,1.266,291,1.757,350,2.173,354,2.401,397,2.675,417,1.887,426,2.998,428,2.069,431,3.066,464,2.572,479,1.55,481,2.42,508,3.544,534,1.999,569,1.718,578,2.44,619,2.106,638,1.521,741,2.145,798,4.069,816,2.829,818,2.093,854,2.703,855,2.521,858,3.118,1002,1.977,1010,2.572,1085,2.525,1131,3.023,1152,2.093,1219,2.548,1231,2.44,1275,2.733,1353,2.346,1390,4.716,1394,3.023,1410,2.998,1437,3.83,1470,2.548,1512,2.829,1597,3.83,1626,3.023,1633,2.44,1693,5.143,1741,2.9,1940,3.856,2130,2.939,2235,4.021,2323,5.031,2339,3.97,2408,3.51,2409,2.98,2613,2.648,2617,2.382,2975,4.533,2996,3.689,3050,3.355,3052,2.939,3059,2.596,3918,2.703,3956,3.978,4683,3.978,5414,3.429,5754,3.51,5827,3.355,5829,3.288,5831,3.118,5874,3.978,5875,3.978,5881,5.559,5966,3.707,5982,4.162,6022,4.162,6023,4.162,6024,4.162,6025,4.162,6028,3.83,6029,4.162,6030,4.162,6031,4.162,6032,3.978,6098,3.707,6328,4.785]],["t/1855",[23,1.611,38,3.544,42,4.01,55,5.296,105,2.462,137,3.738,146,3.378,167,2.472,190,2.9,271,2.975,282,1.955,291,3.581,337,2.256,339,3.519,378,3.901,474,2.586,604,4.4,610,3.314,662,4.369,717,4.423,719,3.651,780,4.67,824,4.05,861,3.973,1133,6.896,1165,5.296,1393,5.911,1436,3.335,1797,4.897,1992,5.296,2187,5.183,2193,5.727,2208,6.797,2235,4.511,2532,5.57,6103,6.144,6329,7.391]],["t/1857",[48,2.516,61,3.456,162,1.946,188,2.633,282,2.557,422,2.903,543,4.812,604,4.361,2235,4.616,2779,6.643,6330,9.665]],["t/1859",[28,2.606,29,2.5,33,3.609,71,0.931,143,2.174,162,1.864,167,3.096,170,2.38,173,4.321,188,3.064,251,3.431,284,2.225,291,3.854,349,3.487,403,2.225,444,2.08,514,2.657,578,4.721,647,2.957,740,3.824,741,3.066,815,3.233,902,2.174,946,4.387,980,3.066,1027,3.126,1127,3.353,1174,4.613,1235,4.259,1256,3.547,1258,3.404,1390,3.747,1638,2.94,1693,4.152,1795,5.149,1829,3.279,1878,3.609,2235,4.396,2480,4.796,2613,5.124,3043,5.149,5381,5.149,5481,4.457,5576,3.487,6166,5.949,6331,6.839]],["t/1862",[18,5.669,19,3.149,20,3.733,23,1.791,24,4.802,71,1.119,162,2.103,170,2.113,188,2.239,291,3.018,313,3.886,316,3.618,433,2.664,546,3.618,569,2.952,602,4.338,638,3.321,643,6.369,962,4.86,1308,4.644,1410,3.435,1639,3.473,1744,6.701,2144,4.86,2926,6.369,2927,5.447,5654,6.189,6332,8.22]],["t/1864",[23,1.778,39,2.353,83,5.607,95,4.47,125,3.109,153,2.728,162,1.642,167,2.728,188,2.832,189,4.712,291,2.996,316,3.591,326,3.912,337,2.49,377,4.231,497,2.604,521,4.094,546,3.591,565,4.03,571,5.317,604,3.681,611,3.636,633,4.427,638,2.594,740,4.562,824,5.697,902,3.305,1559,3.284,1576,4.766,1638,3.507,1713,6.143,1893,5.406]],["t/1866",[115,3.411,272,3.149,587,4.842,638,3.613,721,3.254,855,3.309,902,2.994,2014,7.09,3016,6.24,3060,6.04,3062,8.338,3586,8.678,4160,8.192,5978,7.297,6333,7.829]],["t/1868",[89,4.49,139,3.09,167,3.176,337,2.899,377,5.924,479,3.078,534,3.969,595,4.49,638,3.02,741,4.259,824,5.204,1361,5.685,1571,4.156,1825,4.522,1924,7.604]],["t/1870",[56,3.073,89,3.38,141,5.771,153,3.19,166,3.646,167,2.391,168,2.662,170,2.76,171,2.988,188,1.948,272,2.391,276,5.124,291,3.503,316,4.726,328,2.391,351,3.479,389,3.808,479,2.317,497,2.282,569,2.568,595,3.38,604,4.305,638,3.641,721,2.471,861,5.128,902,2.273,966,4.278,1072,7.464,1571,3.128,1638,3.073,1829,3.429,1918,5.64,2236,5.124,2639,3.918,3108,5.54,6334,6.589]],["t/1872",[56,2.629,89,2.891,141,5.32,153,2.867,166,3.119,167,2.045,168,2.277,170,2.904,171,2.555,272,3.31,277,4.301,291,3.148,316,4.357,328,2.045,351,2.976,389,3.257,479,2.778,497,1.952,569,2.196,584,5.131,595,2.891,604,3.868,638,3.41,721,2.113,861,3.287,902,1.944,966,3.844,1072,7.361,1378,7.093,1638,2.629,1829,2.933,1848,4.896,1918,5.852,1924,6.863,1961,6.863,2862,3.493,3108,4.739,5388,8.229,6335,7.9,6336,9.122,6337,6.116,6338,5.636,6339,5.636,6340,5.636,6341,6.116]],["t/1874",[19,1.745,23,1.921,141,3.421,153,2.128,170,2.946,198,2.145,241,2.751,276,7.245,277,5.949,284,3.289,291,3.236,316,5.219,604,3.977,638,3.214,741,3.952,855,2.236,966,3.952,1573,2.509,1664,4.791,1703,5.743,1848,5.094,1852,4.56,1961,5.094,2062,4.931,2125,5.775,2236,4.56,3119,9.494,6334,5.865,6335,5.865,6336,5.865,6338,5.865,6339,5.865,6340,5.865,6342,6.364,6343,6.364,6344,6.364,6345,6.364,6346,6.364,6347,6.364,6348,6.364,6349,6.364,6350,6.364]],["t/1877",[48,1.886,61,2.59,96,3.781,107,2.815,111,3.853,137,3.664,141,3.894,168,4.023,170,2.474,271,2.916,284,2.357,285,2.568,316,3.189,337,2.937,403,3.746,406,2.338,444,2.203,543,3.606,584,4.336,604,3.269,633,3.931,645,5.191,663,3.499,824,5.273,890,3.757,934,3.474,966,3.248,980,4.315,1027,3.311,1038,4.791,1118,5.315,1223,4.45,1239,4.886,1336,4.45,1394,4.577,1712,3.931,2077,5.613,2277,4.45,6351,7.244]],["t/1879",[19,2.082,23,2.164,30,3.549,44,4.49,96,2.658,137,3.841,143,2.414,168,2.827,188,2.704,224,3.655,284,3.23,288,3.156,291,2.789,378,4.008,479,2.461,497,2.424,513,4.045,514,2.951,523,2.352,604,4.991,607,4.246,638,3.869,721,2.624,800,5.942,970,3.642,1075,4.386,1415,5.718,1636,3.752,1666,5.572,2691,4.437,6352,6.999,6353,7.595]],["t/1881",[23,1.611,38,3.544,42,4.01,55,6.988,105,2.462,137,3.738,146,3.378,167,2.472,168,2.751,190,2.9,271,2.975,282,1.955,291,3.581,337,2.256,339,3.519,378,3.901,604,4.4,610,3.314,638,3.939,662,4.369,717,4.423,719,3.651,737,5.183,780,4.67,824,4.05,861,3.973,1133,6.896,1436,3.335,1712,4.01,1797,4.897,1924,5.916,1992,5.296,2187,5.183,2193,5.727,2208,6.797,3108,5.727,6103,6.144]],["t/1883",[48,2.539,162,1.963,188,2.656,282,2.579,337,2.976,422,2.452,604,4.4,638,3.939,824,5.343,1251,5.632,1918,5.765]],["t/1886",[19,2.635,23,1.263,28,2.208,29,3.513,33,3.058,34,3.385,62,1.103,110,2.108,139,2.684,162,2.228,170,1.489,188,2.618,313,2.739,374,3.567,377,3.004,380,4.362,406,1.87,414,5.126,417,2.285,434,3.41,444,1.762,498,2.218,534,2.421,596,2.332,604,2.614,606,2.954,619,2.55,621,3.677,653,3.273,763,1.814,818,2.535,855,2.036,873,3.425,955,2.448,1001,3.309,1002,3.41,1027,2.648,1081,5.489,1117,2.862,1231,2.954,1275,3.309,1394,3.661,1410,4.015,1412,3.031,1564,2.394,1574,2.598,1639,2.448,1738,4.747,1940,3.114,2022,4.816,2235,3.916,2422,8.36,2613,3.206,2944,5.377,5654,4.362,6354,8.251,6355,5.339]],["t/1888",[19,1.037,23,0.824,28,1.441,29,1.382,30,1.352,39,1.09,40,1.506,51,3.627,71,0.515,96,1.323,98,2.269,101,2.598,106,1.607,107,2.324,110,1.376,123,2.263,125,1.441,139,1.946,140,2.209,161,1.554,162,1.204,164,1.03,172,1.037,188,1.63,197,3.052,198,1.275,241,3.21,272,1.264,286,1.787,291,1.388,351,1.84,374,4.593,403,2.415,414,2.666,422,0.951,428,1.635,432,2.183,444,1.819,459,3.537,461,2.542,468,3.155,474,1.323,479,1.225,481,1.912,514,1.469,515,1.476,517,1.8,521,1.897,522,1.775,523,1.171,528,5.575,533,1.175,534,1.58,549,1.388,569,1.358,596,1.522,603,1.882,607,2.114,619,2.633,621,3.308,749,2.017,763,1.184,815,1.787,870,2.159,873,2.235,972,1.538,973,1.625,1002,1.563,1052,3.455,1057,3.484,1117,1.868,1132,2.709,1160,2.651,1253,1.84,1263,2.092,1271,2.389,1275,2.159,1308,3.38,1309,2.846,1361,2.263,1394,2.389,1405,2.846,1436,2.7,1442,2.464,1463,3.289,1573,1.491,1599,2.389,1619,3.216,1642,2.291,1686,2.55,1738,1.868,1744,2.425,1808,2.355,1829,1.813,1923,3.484,2083,2.929,2084,4.029,2138,3.143,2146,5.993,2149,1.751,2165,6.172,2181,2.929,2185,3.899,2235,2.237,2342,7.04,2343,2.355,2615,3.289,2660,2.709,2703,3.026,2859,3.026,2998,2.929,3008,3.484,3779,2.846,3851,2.425,4168,3.143,4249,3.289,4260,4.035,4391,3.484,4728,2.598,5470,3.143,5693,3.484,5878,2.651,6356,3.781,6357,3.484,6358,2.929,6359,3.781,6360,3.484,6361,3.781,6362,3.781]],["t/1891",[23,0.334,26,1.034,29,1.697,30,0.548,31,0.866,40,1.104,44,0.907,48,0.399,51,1.494,58,0.832,62,1.141,71,1.151,81,0.73,84,0.955,98,1.051,105,0.511,109,0.725,111,1.109,117,0.795,125,0.584,133,0.655,140,0.896,142,0.849,143,0.488,146,0.701,161,0.63,162,0.309,164,1.265,170,0.974,172,1.039,197,2.437,198,0.517,241,1.198,250,0.795,272,0.513,274,2.24,286,0.725,288,2.491,291,0.563,318,0.683,337,0.468,339,0.73,355,0.999,374,4.233,397,0.857,402,0.876,403,1.747,406,0.495,441,1.075,444,1.412,458,0.53,459,3.174,460,1.619,461,2.547,464,3.514,468,2.778,474,2.097,477,2.218,479,1.942,481,3.306,490,0.93,491,0.789,495,1.679,497,1.482,501,1.369,513,1.475,514,1.804,517,0.73,521,0.769,523,0.475,528,3.255,543,0.763,545,0.969,549,1.017,578,1.932,589,0.763,596,1.115,603,2.673,606,1.932,611,1.689,614,1.755,619,3.273,621,0.683,628,0.918,647,1.198,663,0.741,671,1.155,716,1.886,721,1.855,749,3.409,763,0.48,796,1.689,797,1.099,799,1.275,800,2.268,801,0.876,802,0.955,803,0.663,816,1.638,855,0.539,860,2.268,890,1.437,932,0.752,934,1.329,950,1.054,970,0.735,971,0.93,972,1.541,973,1.629,974,0.857,978,0.969,992,0.886,993,0.918,1010,0.824,1015,0.93,1027,0.701,1037,2.189,1052,2.189,1080,2.834,1085,2,1089,0.769,1095,0.969,1098,1.679,1117,1.369,1118,1.125,1127,1.358,1128,0.896,1141,0.942,1145,2.36,1154,1.075,1164,1.413,1165,1.099,1171,1.099,1207,1.275,1211,1.805,1216,1.334,1243,1.034,1252,0.72,1253,1.844,1256,1.965,1258,0.763,1267,1.413,1277,1.034,1294,2.303,1308,0.866,1313,0.832,1314,0.907,1360,1.125,1373,1.054,1390,1.518,1410,1.158,1436,2.095,1442,0.999,1448,2.328,1478,1.075,1479,1.075,1591,1.054,1598,1.155,1618,0.857,1619,3.997,1626,0.969,1638,0.659,1642,0.587,1657,1.034,1693,1.699,1727,2.716,1728,1.228,1731,1.565,1738,1.369,1744,0.984,1760,1.275,1791,1.334,1796,1.125,1862,2.41,1879,2.33,1964,0.999,1971,1.155,1983,0.93,1992,1.099,2007,1.275,2012,1.099,2045,2.018,2070,1.188,2083,1.188,2084,3.547,2086,1.725,2089,2.328,2110,0.849,2138,2.303,2146,6.264,2147,1.725,2149,0.71,2151,1.099,2165,1.275,2181,6.053,2184,2.303,2185,4.571,2207,1.228,2213,0.955,2216,2.553,2235,1.736,2268,1.125,2277,0.942,2339,0.849,2342,4.332,2343,2.36,2359,1.275,2454,2.78,2503,1.228,2528,1.334,2532,0.876,2538,1.413,2611,1.228,2613,1.533,2614,1.413,2615,5.214,2617,0.763,2618,3.296,2619,3.296,2622,0.942,2623,1.413,2874,1.125,2916,1.188,2956,2.78,2975,0.969,2996,0.789,3039,1.334,3851,0.984,3918,0.866,3975,1.275,4060,3.621,4117,2.553,4194,1.725,4215,1.334,4256,4.918,4260,1.034,4290,2.553,4728,1.054,4891,1.334,5414,1.099,5428,1.155,5470,1.275,5613,1.413,5797,1.413,5806,1.702,5844,1.275,5878,1.075,6033,1.275,6358,2.147,6363,2.033,6364,2.771,6365,1.534,6366,1.413,6367,1.334,6368,1.534,6369,1.275,6370,1.534,6371,1.534,6372,2.771,6373,2.771,6374,1.534,6375,1.534,6376,1.534,6377,1.534,6378,1.534,6379,1.534,6380,1.534,6381,1.534,6382,2.771,6383,1.534,6384,1.534,6385,1.534,6386,1.413,6387,1.534,6388,1.534,6389,5.994,6390,1.534,6391,1.534,6392,1.534,6393,1.534,6394,1.534,6395,1.534,6396,1.413,6397,1.534,6398,2.771,6399,1.413]],["t/1893",[19,1.312,23,1.876,25,1.466,48,1.246,51,1.887,54,2.829,58,2.596,62,0.911,71,0.651,81,2.278,96,3.012,98,1.815,107,1.859,110,1.741,125,2.734,162,1.925,170,1.23,188,1.303,189,2.763,241,2.069,292,1.988,368,2.311,374,3.721,397,2.675,406,2.316,414,2.132,431,2.045,434,1.977,461,3.048,468,2.033,474,1.674,481,2.42,528,2.9,569,1.718,595,2.262,604,3.237,619,4.208,621,2.132,623,2.98,642,3.171,644,2.46,718,2.572,741,3.217,749,1.613,752,1.85,792,2.409,796,2.132,802,2.98,858,3.118,860,2.864,932,2.346,960,3.069,973,2.057,991,2.864,1027,2.187,1117,2.363,1133,3.023,1290,2.9,1292,3.171,1360,3.51,1410,1.999,1421,2.022,1448,4.407,1591,3.288,1619,2.572,1638,3.084,1664,3.602,1693,2.145,1694,3.069,1728,3.83,1731,2.703,1840,2.201,1940,3.856,2146,3.118,2234,3.171,2235,3.575,2310,2.829,2323,3.355,2342,3.171,2613,4.763,2622,2.939,2671,2.98,2996,2.46,3051,3.355,3052,2.939,3250,3.707,4060,3.227,4168,3.978,4194,4.468,4209,4.409,4256,5.031,4302,4.409,4895,4.409,5414,3.429,5878,5.031,6085,3.83,6358,3.707,6400,4.785,6401,4.785,6402,4.785,6403,4.785]],["t/1895",[23,1.076,48,1.285,51,1.946,61,1.764,62,0.94,67,2.704,96,1.727,98,1.872,105,1.644,115,1.788,132,2.496,166,2.517,170,1.269,172,2.013,282,1.942,374,4.487,378,2.605,406,2.37,422,1.241,426,4.057,437,2.361,459,4.34,464,2.653,479,1.599,485,2.605,518,2.419,528,4.45,543,2.457,599,2.653,619,4.568,721,1.705,749,1.664,792,2.943,800,5.811,801,5.545,804,3.621,815,3.471,873,2.918,989,2.438,994,3.328,1053,2.628,1089,2.476,1117,2.438,1139,3.824,1147,3.165,1152,2.159,1198,2.788,1231,2.517,1248,3.031,1266,5.148,1308,2.788,1394,3.118,1436,2.227,1626,3.118,1631,2.759,1641,3.824,1693,3.931,1731,2.788,1878,2.605,1940,5.219,1970,5.689,2146,3.216,2149,2.286,2235,3.631,2410,2.788,2458,4.103,2532,5.007,2618,4.293,2622,3.031,2639,2.704,2959,5.148,2964,3.716,2966,3.716,2972,3.621,2988,2.992,4260,3.328,4505,4.548,5481,3.216,5498,3.951,5878,3.461,6404,4.935,6405,4.548,6406,4.935,6407,3.951]],["t/1897",[23,1.752,29,2.939,48,2.093,138,2.093,145,4.169,272,4.144,282,2.127,374,3.476,422,2.022,444,2.445,460,4.697,485,4.243,523,2.49,614,3.724,619,3.539,652,5.157,798,3.801,874,4.362,970,3.855,1186,6.229,1271,5.08,1511,5.422,1664,6.053,2089,4.938,2339,5.7,2342,5.327,2532,4.592,2973,5.007,4143,7.409,5414,5.761,5654,6.053,6055,6.436]],["t/1899",[25,2.007,109,3.098,170,2.312,188,3.337,291,2.406,374,2.833,378,3.459,444,3.122,569,3.229,604,2.957,721,3.108,762,2.293,796,2.92,800,5.383,801,5.865,805,2.801,815,3.098,855,2.303,864,3.743,885,4.081,989,3.237,1027,2.995,1034,4.42,1053,5.468,1174,4.42,1231,3.342,1436,2.957,1448,4.026,1574,2.938,1619,3.523,1693,2.938,1940,3.523,1970,6.969,2028,4.595,2146,4.271,2235,4.474,2342,4.343,2639,4.928,2651,4.808,4181,5.701,4256,4.595,5481,4.271,5878,4.595,6408,6.553,6409,6.553]],["t/1901",[75,4.187,105,2.866,162,1.732,167,2.878,172,2.36,190,3.377,428,3.721,444,3.567,522,4.04,604,3.883,815,5.084,861,4.626,864,6.142,980,3.859,1027,3.934,1187,6.035,1712,4.67,2218,6.889,2235,3.218,2532,4.915,3003,7.931,5579,6.889,5878,6.035,6410,8.606]],["t/1904",[23,1.759,40,3.214,48,1.462,61,2.008,73,1.82,95,4.421,114,3.404,133,3.448,172,1.54,188,1.53,251,4.049,284,3.072,290,2.601,327,2.472,417,2.215,434,2.321,481,2.84,513,2.991,514,2.182,518,2.753,528,3.404,549,2.062,587,2.888,624,3.498,638,1.785,718,3.019,762,4.104,764,2.774,792,2.709,818,3.53,890,2.912,932,5.061,1002,2.321,1076,3.548,1124,4.12,1170,5.098,1195,4.228,1421,2.373,1475,4.885,1555,5.175,1558,2.567,1562,4.609,1571,2.457,1573,4.49,1574,2.518,1643,3.019,1698,2.296,1706,6.058,1707,6.708,1709,2.888,1767,6.728,1976,5.394,2081,3.938,2236,4.024,2409,3.498,2878,4.669,3052,3.45,3496,4.024,4507,4.12,4728,3.86,5805,3.938,6219,4.885,6411,4.885]],["t/1906",[23,2.214,25,2.41,29,2.875,40,3.134,71,1.071,73,2.549,96,3.554,105,2.62,162,1.583,197,3.169,284,2.559,290,3.644,318,3.505,498,3.012,513,4.19,514,3.056,549,2.888,624,4.899,630,4.596,740,4.398,762,2.753,805,3.362,967,3.886,973,3.381,1040,6.54,1256,4.08,1421,3.324,1573,4.688,1729,4.769,1879,3.947,2145,6.54,2944,5.127,5664,6.843,5805,5.516]],["t/1908",[23,2.414,62,1.719,105,3.008,284,3.604,762,3.877,764,5.473,1076,5.706,1207,7.507,1424,6.716,1706,5.792,1767,5.885,1840,4.155,1847,4.854,1976,5.158,3496,6.471,4728,6.206,5842,6.997]],["t/1910",[39,2.812,73,3.16,132,4.932,133,4.167,284,3.172,562,5.396,624,6.073,762,4.061,1122,4.932,1573,4.576,1636,4.817]],["t/1912",[23,1.861,48,2.223,105,3.893,197,2.664,241,4.627,283,4.989,284,2.778,337,2.606,444,2.597,501,4.218,598,5.111,610,5.241,724,4.774,860,5.111,890,4.428,1038,4.251,1252,4.009,1571,3.736,1712,4.634,2094,6.429,2187,5.988,5578,7.428,5751,6.119,6412,8.539]],["t/1915",[23,1.69,24,3.106,35,2.568,40,3.09,66,2.384,68,3.182,73,2.513,95,4.25,96,1.861,114,3.223,132,2.689,164,1.448,188,1.448,251,2.668,284,3.481,327,2.34,351,2.587,406,1.716,417,2.097,434,2.197,492,3.071,518,2.607,562,2.942,612,2.885,614,2.463,638,1.69,644,2.734,718,2.858,762,4.287,792,3.593,818,3.393,829,4.42,854,3.004,890,4.022,932,2.607,972,2.162,1002,3.205,1076,3.359,1124,3.901,1170,6.359,1187,3.728,1195,4.003,1202,3.411,1417,5.14,1421,2.247,1558,2.43,1562,4.43,1573,4.22,1643,2.858,1698,2.174,1706,5.873,1707,4.42,1767,5.967,1840,2.446,1976,5.748,2081,3.728,2236,3.81,2408,3.901,2409,4.83,3126,4.625,3496,3.81,4507,3.901,4728,3.654,6219,4.625,6411,4.625,6413,5.317]],["t/1917",[22,2.245,23,1.968,25,2.335,28,1.978,40,2.068,67,2.845,71,0.707,73,1.682,96,3.16,162,1.045,164,1.414,168,1.932,172,1.423,188,1.414,197,1.62,284,3.725,290,2.404,308,6.101,318,3.396,362,3.233,498,1.988,514,3.508,515,2.976,518,2.545,519,3.033,562,2.873,573,2.626,611,2.313,617,3.568,624,3.233,630,4.453,644,2.669,762,3.482,763,1.626,792,3.341,800,3.107,803,3.295,805,3.257,902,1.65,967,3.765,972,2.111,973,2.231,978,3.28,991,3.107,1002,2.146,1040,4.316,1052,2.998,1127,2.545,1170,6.287,1185,3.809,1198,4.306,1258,2.584,1281,4.156,1417,3.44,1421,3.22,1470,2.765,1573,3.561,1636,3.765,1638,2.231,1698,2.123,1729,3.147,1738,2.564,1878,2.74,1879,2.605,1962,3.909,1976,2.965,2145,6.336,2409,3.233,2536,5.738,2944,3.383,4246,4.156,5538,4.316,5578,4.516,5664,4.516,5805,3.64,6407,4.156]],["t/1919",[23,2.332,36,4.003,62,1.012,96,2.714,105,2.583,107,2.066,132,2.689,181,3.311,284,3.923,290,2.463,291,2.848,316,3.414,354,2.668,375,2.34,417,2.097,513,2.832,514,3.013,517,2.531,519,3.106,549,3.362,562,4.292,644,2.734,647,3.353,716,2.647,740,2.973,762,3.204,764,4.523,792,3.873,805,2.272,818,2.326,934,2.55,967,4.523,971,3.223,972,3.154,1044,2.832,1064,3.182,1076,3.359,1126,2.885,1170,7.059,1421,2.247,1424,4.702,1442,5.054,1480,3.586,1573,4.406,1639,2.247,1668,3.143,1706,3.411,1729,3.223,1767,3.465,1840,2.446,1843,3.901,1847,2.858,1976,5.229,3496,3.81,3912,4.256,4728,3.654,5842,4.12,6028,4.256,6414,4.9]],["t/1921",[39,2.626,73,2.95,132,4.605,133,3.891,284,2.962,562,5.039,624,5.671,762,4.385,792,3.057,1122,4.605,1170,5.753,1573,4.942,1707,7.569,1976,5.2,2409,5.671]],["t/1923",[105,3.496,527,4.677,860,6.282,1698,4.292,1712,5.696]],["t/1926",[23,0.959,25,1.348,48,2.385,51,1.736,71,1.114,111,1.762,138,1.146,142,1.348,145,2.283,162,1.356,168,1.638,200,4.628,282,1.164,288,1.829,292,1.829,313,3.184,374,4.686,375,2.964,406,2.64,422,1.107,426,4.126,433,1.426,437,1.415,458,1.521,461,1.87,474,1.54,479,1.426,498,1.685,523,1.363,546,1.937,547,2.823,569,3.546,625,2.741,638,2.141,639,7.617,644,2.263,721,1.521,749,1.484,751,2.344,752,1.702,798,5.702,801,3.846,850,2.158,860,2.634,891,3.229,934,2.111,1010,2.366,1036,2.226,1044,2.344,1087,2.436,1094,2.868,1107,2.917,1117,2.174,1124,3.229,1187,3.086,1219,2.344,1248,4.137,1252,2.066,1281,3.523,1306,2.704,1422,4.056,1478,3.086,1574,1.974,1614,5.598,1618,5.521,1626,2.781,1633,2.244,1656,4.082,1714,3.229,1750,3.523,1809,2.634,1940,6.008,2024,3.229,2213,4.194,2339,2.436,2639,2.412,2988,4.082,2996,2.263,3010,2.823,3048,3.659,3141,2.741,3615,3.659,3686,3.829,3964,3.829,5897,3.659,5928,3.229,6363,3.229,6415,4.401,6416,6.734,6417,4.056,6418,4.401,6419,4.401]],["t/1928",[25,2.108,28,2.622,48,1.792,61,2.46,71,0.937,81,3.276,101,4.73,153,2.301,168,2.562,188,1.874,282,1.82,291,2.527,378,3.632,437,2.99,485,3.632,492,3.974,497,2.196,498,2.635,520,4.348,569,4.359,625,4.286,644,3.539,751,3.665,752,2.661,798,6.113,874,3.734,948,3.808,950,4.73,1066,4.826,1275,6.014,1390,3.771,1618,5.198,1694,4.414,1722,5.721,2023,4.172,2539,5.721,4067,5.181,4260,4.641,6420,6.342,6421,6.882,6422,6.882,6423,6.342]],["t/1930",[25,2.657,30,3.101,43,4.387,66,3.889,107,3.37,109,4.101,170,2.23,188,2.363,282,2.294,290,4.017,492,5.009,498,3.321,569,3.115,718,4.662,798,4.101,902,2.757,932,4.252,1129,5.402,1479,6.082,1574,3.889,1871,6.943,2023,5.258,2719,5.961,5481,5.653,6424,7.211,6425,8.674,6426,8.674]],["t/1932",[23,1.581,25,2.95,28,0.797,43,1.057,57,1.362,58,2.635,59,1.103,66,0.937,71,1.231,81,0.995,87,2.345,107,1.418,110,0.761,111,0.837,138,0.544,143,0.665,145,2.518,153,1.22,160,1.437,161,0.859,164,0.569,167,0.699,168,1.358,170,1.248,171,1.525,172,1.331,188,1.976,282,1.284,288,1.516,290,0.968,291,0.768,292,0.869,309,0.793,327,0.92,328,1.624,337,0.638,351,3.212,374,1.578,377,2.518,378,3.484,407,0.859,414,0.932,426,0.874,437,2.792,439,1.466,451,1.943,458,2.01,461,0.888,468,0.888,474,0.732,479,1.885,485,1.103,492,1.207,496,0.975,497,3.496,509,2.461,517,1.737,523,2.246,524,1.466,543,1.041,545,1.321,569,3.827,573,1.057,585,1.267,595,0.988,611,0.932,630,1.221,633,1.134,709,1.437,719,1.033,721,2.506,723,2.184,741,0.937,749,1.23,751,1.943,752,3.017,753,1.341,756,1.057,758,3.863,763,1.143,798,5.637,801,2.084,805,1.559,808,1.62,815,1.725,850,1.025,860,1.251,861,1.961,874,1.98,891,1.534,932,1.025,936,3.121,952,1.574,955,1.542,957,1.385,970,1.003,1010,1.961,1063,1.738,1083,1.321,1087,1.157,1089,1.831,1103,1.466,1107,1.385,1117,2.398,1128,2.132,1129,2.273,1146,1.437,1231,2.476,1239,2.461,1248,2.982,1252,1.713,1258,1.041,1275,1.194,1281,2.921,1306,2.241,1377,1.999,1390,1.146,1393,2.212,1421,0.883,1458,1.194,1469,1.221,1473,1.221,1482,1.267,1562,2.084,1571,0.915,1599,1.321,1618,4.854,1626,2.306,1633,1.066,1642,1.397,1694,3.731,1731,2.062,1752,1.341,1761,1.466,1825,1.737,1940,1.124,1970,7.003,2006,3.337,2022,1.738,2023,1.267,2072,1.385,2089,2.241,2144,1.236,2339,2.687,2487,1.62,2532,2.084,2539,1.738,2719,3.337,2859,3.887,2909,2.378,2961,1.574,2973,3.024,2998,1.62,3010,1.341,3730,4.224,4260,4.892,5035,1.927,5481,2.378,5645,1.819,5880,1.62,5929,1.498,6055,1.674,6358,1.62,6363,1.534,6427,2.091,6428,2.091,6429,6.029,6430,1.819,6431,2.091,6432,4.656,6433,3.649,6434,4.474,6435,2.091,6436,2.091,6437,2.091,6438,2.091,6439,2.091,6440,2.091,6441,1.927]],["t/1934",[23,2.631,25,3.428,71,1.25,172,2.517,327,4.041,497,2.93,624,5.718,752,3.549,955,3.879,978,5.801,1095,5.801,1636,4.535,1970,7.114,2859,7.349,4260,7.548,6442,9.181]],["t/1936",[28,2.816,43,3.738,62,1.857,170,1.9,172,2.674,188,2.656,291,3.581,326,3.544,355,4.816,433,2.395,458,4.01,492,4.268,497,3.703,509,6.577,758,3.936,798,3.494,955,3.123,1122,3.738,1371,5.727,1571,4.775,1618,6.102,1694,4.741,1970,5.727,2023,4.48,2859,5.916,4260,6.577,5481,4.816,5929,6.988,6423,6.811,6432,5.916,6434,6.811,6443,7.391]],["t/1938",[153,3.477,326,4.985,496,4.848,497,3.318,1275,5.938,6444,10.397]],["t/1941",[19,2.288,23,1.819,28,3.18,39,2.407,71,1.436,109,3.945,164,2.273,197,2.603,272,2.791,374,5,432,4.819,444,2.538,474,3.691,479,2.704,518,4.091,625,5.197,1036,4.221,1176,4.715,1193,5.897,1573,3.291,1802,5.98,1829,4.001,2213,5.197,2833,8.443,2910,5.98,6445,7.69]],["t/1943",[28,3.441,39,2.604,142,3.393,164,2.46,474,3.16,549,3.316,625,5.624,866,7,1098,5.474,1193,5.049,1276,6.799,1562,5.158,1829,4.33,1998,6.997,2145,7.507,2833,9.594,6445,8.322,6446,9.03]],["t/1945",[71,1.271,142,3.725,170,2.4,188,3.08,290,4.325,444,2.839,902,2.968,1086,8.605,1127,4.577,1573,3.682,1977,7.235,2095,6.297,2833,7.474,2862,5.333,5668,8.605]],["t/1947",[110,2.802,117,3.994,161,3.166,374,4.814,426,4.186,451,4.101,461,3.273,531,4.609,603,3.834,619,3.39,749,3.377,792,2.586,798,5.78,869,4.101,960,4.94,1087,5.544,1098,6.75,1573,3.951,1693,3.453,1731,4.351,1940,4.14,2095,5.194,2110,4.262,2834,6.402,2956,7.35,4256,5.4,5614,5.194,5669,7.097,6432,6.165,6447,7.701]],["t/1949",[61,3.486,508,4.817,624,6.073,628,5.836,740,5.452,1152,4.266,1435,6.988,1436,4.4,1564,4.03,2622,5.99,6448,9.751,6449,9.751,6450,9.751]],["t/1951",[39,3.419,48,2.632,870,5.774,1248,6.21,1252,4.747,1436,4.562,1571,4.423,1829,4.848]],["t/1953",[5911,9.072]],["t/1956",[19,1.923,23,1.528,25,2.148,42,3.806,78,5.146,81,3.339,110,4.136,115,2.541,116,2.808,124,5.709,125,3.589,138,2.452,139,3.697,197,2.188,224,2.318,263,4.006,368,3.387,426,3.935,436,3.701,468,2.98,493,3.068,510,4.368,522,3.293,523,2.172,565,3.464,571,4.57,638,2.994,803,3.032,805,2.997,965,4.431,1084,4.82,1316,4.431,1410,2.93,1573,2.766,1576,4.097,1639,2.963,1744,4.499,1772,7.181,2144,4.146,2665,5.614,2667,4.499,6430,6.101,6451,6.463]],["t/1958",[28,2.344,29,3.629,39,1.774,43,3.111,47,3.728,69,3.275,71,1.352,81,2.928,95,3.37,124,6.519,125,2.344,138,1.601,139,3.682,162,1.998,164,1.675,168,3.204,172,2.36,350,2.793,353,3.475,404,3.681,433,1.993,444,3.019,474,3.474,522,2.887,523,1.905,713,3.681,994,4.148,1012,3.111,1145,5.36,1223,3.778,1248,3.778,1263,4.763,1410,4.148,1418,5.668,1421,2.599,1557,3.403,1564,3.557,1574,2.758,1639,2.599,1649,5.668,1772,7.411,1831,3.636,2072,4.075,2134,4.765,2667,6.898,3018,4.075,5702,5.35]],["t/1960",[21,3.418,23,1.199,29,2.907,39,2.693,40,2.192,78,4.038,87,2.658,104,3.477,112,2.62,117,2.854,139,3.327,143,1.75,162,1.108,164,1.499,186,4.401,190,3.664,219,3.712,316,3.5,342,3.178,354,2.761,434,2.274,444,2.418,496,2.566,499,4.787,513,2.931,515,2.149,521,2.761,522,2.584,528,4.821,545,3.477,549,2.92,566,2.719,611,2.452,713,3.294,728,8.168,740,3.077,741,2.468,743,3.215,763,1.723,805,3.991,869,2.931,932,2.698,972,2.238,987,4.264,992,3.178,1012,2.784,1039,3.477,1095,3.477,1127,2.698,1291,4.264,1394,3.477,1413,3.944,1479,3.859,1512,3.254,1574,3.566,1599,5.025,1672,3.53,1772,6.463,1781,4.038,1964,3.586,1969,3.586,2149,2.549,2457,4.264,3336,4.038,5405,4.575,5559,4.787,5640,4.038,6063,4.787,6452,6.366,6453,5.072,6454,5.503,6455,5.503,6456,5.503,6457,5.503]],["t/1962",[21,4.691,22,2.63,25,0.48,28,0.598,31,0.886,35,3.979,37,3.269,38,3.178,39,2.049,40,2.83,42,2.96,43,1.43,45,3.225,47,2.34,55,3.385,56,0.674,58,1.534,59,1.492,62,1.568,66,2.446,68,0.939,71,0.643,73,3.568,78,1.151,84,1.761,94,1.304,95,2.989,107,1.099,108,1.181,114,0.951,125,2.078,132,0.793,139,1.256,140,1.652,161,1.587,167,2.034,186,4.165,188,1.052,190,2.788,219,2.604,224,1.276,227,4.102,250,0.813,272,2.755,284,0.92,285,1.002,286,1.337,292,1.175,316,2.677,326,1.851,328,0.525,329,1.1,351,0.763,353,1.598,354,1.937,368,0.758,404,0.939,405,2.707,434,0.648,459,0.927,479,0.508,483,2.606,493,0.686,504,2.766,512,1.181,515,2.774,519,2.255,521,0.787,522,0.736,527,1.26,533,1.2,534,0.655,582,2.34,585,0.951,596,0.631,603,0.781,611,4.038,628,1.692,716,3.537,722,0.906,723,1.692,725,4.353,728,1.181,743,2.255,752,0.606,763,2.225,776,2.653,805,1.208,818,1.689,856,2.991,870,1.615,874,1.534,882,0.722,890,2.002,902,0.499,955,0.663,962,2.282,970,0.752,983,3.964,1002,0.648,1011,3.09,1012,2.759,1038,1.408,1062,1.1,1083,3.843,1085,0.828,1089,2.737,1117,2.333,1122,2.389,1126,1.534,1145,0.977,1154,3.312,1177,4.982,1198,0.886,1200,1.181,1208,4.226,1209,0.821,1261,3.66,1278,1.215,1288,0.964,1304,1.078,1306,0.964,1315,1.124,1353,2.674,1387,0.951,1410,1.181,1412,2.471,1417,1.039,1421,3.002,1448,0.964,1465,2.075,1556,1.215,1571,2.386,1574,0.703,1605,1.565,1628,0.927,1643,2.539,1668,2.792,1684,1.304,1772,0.991,1797,1.039,1805,7.055,1842,0.859,1848,1.256,1879,1.419,1969,1.022,2081,1.1,2100,1.181,2110,1.565,2144,1.672,2148,1.256,2149,0.726,2266,1.761,2442,4.109,2671,0.977,2688,1.364,2938,4.366,3148,1.124,3325,1.078,3615,2.351,4338,1.446,4724,2.606,5001,2.351,5525,2.606,5548,1.446,5586,2.606,5640,1.151,5978,1.215,6452,5.687,6458,2.46,6459,2.606,6460,1.569,6461,1.569,6462,4.353,6463,1.569,6464,2.606,6465,3.86,6466,1.569,6467,1.569,6468,1.569,6469,3.86,6470,1.569,6471,3.86,6472,2.828,6473,1.569,6474,1.446,6475,3.358,6476,2.828,6477,2.46,6478,1.569,6479,1.569,6480,4.745,6481,2.828,6482,2.828,6483,1.569,6484,2.46,6485,1.446,6486,1.569,6487,1.446,6488,1.446,6489,1.364,6490,2.263,6491,2.828,6492,1.569,6493,1.364,6494,1.446]],["t/1964",[21,0.692,23,0.351,25,1.894,28,1.103,29,1.76,30,1.986,32,0.857,35,0.778,38,1.388,62,2.42,63,2.124,70,0.835,71,0.537,73,0.938,75,1.408,87,0.778,92,2.063,104,1.017,106,0.684,110,1.053,116,0.645,117,0.835,125,2.565,133,1.237,137,1.995,138,0.419,139,2.899,143,0.92,150,2.304,164,1.312,181,1.003,186,1.602,197,0.502,219,2.66,227,4.54,272,0.968,275,0.865,292,0.669,300,0.842,307,1.106,309,2.346,316,0.709,328,0.538,335,1.033,339,1.878,351,1.919,354,1.452,368,0.778,374,3.117,375,0.709,380,1.212,382,1.223,383,0.85,390,0.828,421,2.477,422,1.211,428,1.251,432,2.278,433,1.278,434,1.63,436,2.081,444,1.465,445,3.803,461,0.684,468,1.676,485,2.542,490,0.976,493,0.704,504,1.154,515,1.13,517,0.766,522,1.851,527,0.717,531,2.36,533,0.5,540,0.964,549,0.591,561,1.586,562,0.891,565,3.325,587,1.488,595,1.368,596,0.648,599,2.12,603,1.441,607,0.9,615,1.129,619,1.736,638,2.545,647,0.696,663,0.778,716,1.441,721,1,722,0.93,728,2.969,737,1.129,746,1.338,751,2.1,752,0.622,753,1.857,762,0.563,763,0.504,766,0.941,770,1.829,792,2.421,796,2.146,801,0.919,802,3.459,805,3.564,816,1.711,855,1.017,867,1.209,890,0.835,902,0.512,934,0.772,955,0.68,970,0.772,972,0.655,973,1.244,1001,0.919,1003,0.989,1012,1.464,1038,1.963,1059,0.952,1064,2.36,1075,0.93,1081,0.919,1101,3.278,1117,0.795,1122,0.814,1126,1.571,1132,1.154,1147,2.53,1167,1.484,1198,1.635,1223,0.989,1248,0.989,1296,1.778,1300,2.893,1334,0.989,1392,2.847,1394,1.829,1412,2.519,1421,1.223,1426,1.067,1450,2.422,1479,2.03,1512,0.952,1540,1.049,1559,0.648,1568,1.067,1570,0.964,1573,0.635,1594,1.952,1600,2.847,1618,0.9,1619,2.12,1636,0.795,1675,1.289,1696,1.106,1737,1.129,1768,0.989,1772,5.93,1801,1.338,1808,1.803,1841,2.721,1878,0.85,1918,0.952,1964,1.049,2014,2.179,2045,1.542,2086,1.003,2088,1.154,2095,1.952,2110,0.891,2149,0.746,2151,2.074,2181,1.247,2183,1.484,2184,1.338,2185,1.049,2214,4.19,2343,2.456,2366,1.484,2393,2.179,2399,2.074,2404,5.856,2405,1.247,2406,2.179,2443,1.4,2532,0.919,2534,1.4,2667,1.033,2760,1.212,2815,1.247,2893,3.451,2906,1.106,2947,1.212,2972,1.181,2993,1.4,3000,2.57,3013,3.278,3014,2.518,3375,2.66,3699,1.129,4104,3.278,4260,3.248,4344,1.338,4685,1.778,4953,2.668,4979,1.4,5561,2.317,5620,0.952,5640,1.181,5754,1.181,5838,3.056,6452,2.317,6462,2.668,6475,4.19,6480,3.431,6489,1.4,6493,1.4,6495,1.61,6496,1.61,6497,2.668,6498,1.484,6499,3.944,6500,2.895,6501,1.61,6502,3.944,6503,3.944,6504,3.634,6505,2.895,6506,1.61,6507,1.484,6508,3.634,6509,2.668,6510,1.61,6511,1.61,6512,1.61,6513,1.61,6514,1.61,6515,1.61,6516,1.61]],["t/1966",[21,3.829,22,2.518,23,0.376,25,0.944,28,1.174,29,1.854,30,1.102,31,1.741,34,1.008,35,1.488,37,0.928,38,0.828,39,1.204,45,0.84,51,0.681,54,1.822,58,0.937,59,0.911,66,0.774,68,1.033,71,0.955,73,3.402,75,0.84,78,1.266,81,0.822,95,0.946,96,1.078,98,0.655,103,1.125,107,1.197,110,0.628,117,0.895,124,2.53,125,1.59,133,1.783,138,0.449,139,2.802,162,0.347,164,1.381,166,0.88,167,1.696,186,3.881,190,1.99,198,0.582,200,2.118,219,3.421,224,0.57,227,6.352,272,1.396,275,2.726,284,0.562,285,1.479,286,1.457,300,2.183,316,3.646,328,1.03,335,1.107,351,0.84,353,0.975,354,1.546,368,0.834,374,2.518,375,0.76,378,1.626,380,1.3,397,0.965,406,1.347,426,0.721,428,0.746,434,1.725,437,0.555,444,1.542,445,0.975,451,0.919,459,1.021,468,0.734,474,0.604,479,1.352,485,2.202,490,1.868,497,0.551,498,0.661,507,1.186,515,0.674,517,0.822,521,1.546,522,2.735,523,0.535,524,2.161,527,0.769,531,1.033,534,0.721,539,1.186,565,3.465,599,1.656,603,1.534,606,0.88,611,0.769,626,1.046,628,1.033,638,1.612,709,1.186,716,2.077,721,1.065,722,2.41,730,1.06,741,0.774,752,0.667,763,0.541,792,1.956,796,0.769,802,1.919,805,4.119,855,1.083,874,0.937,902,0.549,952,2.32,962,1.021,970,0.828,972,0.702,973,0.742,992,1.78,1012,1.558,1036,0.873,1038,1.534,1041,1.844,1064,1.033,1078,1.06,1083,1.947,1089,2.545,1117,0.853,1122,2.111,1126,1.672,1127,0.846,1145,1.919,1154,1.21,1177,2.926,1188,1.144,1208,3.234,1209,0.903,1225,1.237,1258,1.534,1290,1.868,1300,1.266,1306,1.06,1334,1.06,1353,0.846,1357,1.21,1390,1.688,1392,1.021,1394,1.947,1410,2.119,1412,2.183,1421,2.731,1442,1.125,1448,1.893,1473,1.008,1479,1.21,1512,1.021,1540,2.008,1556,1.338,1557,0.955,1564,1.273,1573,0.681,1600,1.822,1618,2.333,1631,0.965,1636,0.853,1638,0.742,1652,1.435,1668,2.467,1696,1.186,1732,0.88,1741,1.046,1744,1.976,1772,4.734,1805,2.467,1808,1.919,1964,2.72,2021,2.68,2023,1.046,2042,1.033,2072,1.144,2073,1.164,2095,2.078,2100,1.3,2107,1.266,2110,1.705,2144,1.822,2148,1.382,2149,0.8,2174,1.237,2343,1.075,2533,1.3,2573,1.338,2667,1.107,2688,1.502,2815,1.338,2893,1.237,2938,1.382,2945,1.435,2947,2.32,2959,1.21,3013,1.435,4067,1.3,4232,1.502,4260,1.164,5001,3.469,5381,2.32,5418,3.341,5559,1.502,5632,1.435,5634,2.161,5640,1.266,5805,1.21,5838,3.93,6386,1.591,6430,1.502,6452,4.06,6458,1.502,6464,2.84,6475,6.517,6477,1.502,6480,7.492,6484,3.63,6485,3.846,6487,1.591,6488,1.591,6489,2.68,6493,2.68,6494,1.591,6497,4.674,6504,5.957,6508,1.591,6509,1.591,6517,1.726,6518,1.726,6519,3.081,6520,3.081,6521,4.173,6522,1.726,6523,3.081,6524,1.726,6525,1.726,6526,1.591,6527,1.726,6528,1.726,6529,1.726,6530,1.726,6531,1.726,6532,1.591]],["t/1968",[29,3.533,71,1.316,73,3.132,139,3.144,162,1.946,227,6.519,434,3.995,520,6.107,970,4.635,1772,6.107,5734,7.737,5767,8.408,6429,8.035,6453,8.907]],["t/1971",[23,1.538,25,2.162,111,2.826,139,2.296,164,1.923,197,3.555,275,3.794,309,2.677,351,4.602,362,5.89,422,1.775,428,3.052,468,4.842,479,2.287,481,3.57,501,3.487,519,4.124,523,2.186,533,2.194,540,4.225,546,4.695,647,3.052,749,3.596,800,4.225,974,3.946,1052,4.077,1473,4.124,1558,3.226,1573,2.783,1574,4.241,2001,5.314,2042,6.384,2084,6.183,2129,4.851,2149,3.269,2274,4.761,3375,4.761,5775,5.058]],["t/1973",[28,2.935,39,2.221,71,1.049,139,3.259,198,2.596,313,5.264,422,1.937,426,4.186,433,2.496,468,3.273,485,4.064,546,4.901,621,3.432,902,2.448,1001,4.399,1018,4.101,1081,4.399,1094,6.529,1312,5.968,1377,4.22,1564,3.183,1574,3.453,1633,3.927,1638,3.31,1688,6.431,1689,6.431,1738,3.804,1756,5.103,2042,4.609,2084,4.179,5441,5.798,5614,5.194]],["t/1975",[23,1.687,28,2.558,46,3.03,48,0.847,71,1.054,81,1.549,106,1.383,125,1.24,138,0.847,139,1.059,140,1.901,162,0.655,164,0.886,172,1.454,188,0.886,197,2.416,224,1.075,251,1.633,275,3.609,309,1.234,351,3.767,353,1.839,369,2.851,375,1.433,406,1.051,434,1.345,444,2.042,458,1.833,468,2.853,474,1.139,491,1.673,508,1.608,515,1.271,517,2.525,519,1.901,527,2.364,533,1.649,546,2.955,584,4.018,587,2.727,594,4.634,595,2.508,596,1.31,647,3.348,648,1.88,716,1.62,721,1.833,741,1.459,749,3.763,752,2.051,756,1.646,763,2.102,803,1.407,805,4.296,855,3.213,973,1.399,974,1.82,1015,4.07,1037,1.88,1044,2.825,1052,5.281,1145,2.027,1230,1.924,1248,1.999,1306,3.258,1424,1.973,1473,3.099,1557,1.801,1562,3.03,1564,1.345,1571,1.424,1573,3.053,1638,1.399,1732,1.66,1738,3.316,1741,1.973,1825,2.525,1886,2.999,1896,4.41,1918,1.924,1983,1.973,2042,1.948,2045,2.825,2084,3.643,2129,7.521,2149,2.457,2328,5.429,2329,8.286,2330,4.614,2400,1.948,2410,3.793,2505,2.831,2655,2.831,2961,2.45,3018,2.157,3591,2.999,4246,2.605,5634,2.282,5880,2.522,6363,3.892,6396,2.999,6533,5.202,6534,5.202,6535,3.254,6536,3.254,6537,3.254,6538,5.304,6539,3.254,6540,4.246,6541,3.254,6542,3.254,6543,3.254]],["t/1977",[20,1.261,23,1.531,36,2.091,58,1.507,59,1.466,67,2.55,68,2.785,71,1.284,81,1.322,83,1.909,87,1.342,101,1.909,107,1.079,122,1.522,153,0.929,162,0.559,164,0.757,168,1.034,172,1.276,197,2.441,241,2.012,251,1.394,275,4.549,292,1.154,309,1.053,328,0.929,351,2.922,375,1.223,395,1.405,406,1.502,417,1.835,426,1.944,428,1.201,444,2.379,451,2.478,468,4.522,479,1.946,491,2.393,497,0.886,514,1.079,519,2.718,533,1.446,546,4.15,594,1.662,596,1.118,602,1.466,606,2.373,630,2.718,641,2.658,647,2.596,713,2.785,721,0.96,723,1.662,741,2.086,749,3.724,752,3.475,763,2.815,803,1.201,805,1.187,818,1.215,853,1.466,861,1.493,973,1.194,974,1.553,978,2.94,988,3.414,992,1.604,1010,1.493,1015,2.821,1037,2.687,1083,1.755,1096,1.684,1159,2.152,1230,1.642,1258,1.383,1277,1.873,1306,1.706,1342,1.81,1379,2.038,1380,2.309,1412,2.434,1426,1.84,1473,2.718,1514,1.73,1558,1.27,1564,1.148,1573,2.77,1631,1.553,1636,1.372,1638,3.02,1639,1.966,1731,1.569,1738,1.372,1786,2.038,1802,1.99,1840,1.278,1842,1.522,1918,1.642,2028,1.948,2042,4.682,2045,2.478,2084,5.642,2086,1.73,2110,3.323,2129,5.376,2134,2.152,2146,3.032,2149,3.92,2268,2.038,2328,6.611,2329,6.872,2330,2.416,2651,2.038,2832,2.038,2909,3.032,2956,5.154,2961,5.889,3001,1.99,3018,1.84,3336,2.038,3702,4.303,3851,1.782,4256,1.948,4260,1.873,5397,2.152,5409,2.416,5846,1.948,5880,2.152,6028,2.223,6109,2.223,6363,2.038,6533,2.152,6534,2.152,6540,2.223,6544,2.777,6545,2.56,6546,2.777,6547,2.777,6548,2.777,6549,2.777,6550,2.777,6551,2.777,6552,2.56]],["t/1979",[19,1.312,23,2.232,25,2.197,28,2.734,117,2.481,125,1.823,137,2.42,143,1.521,188,1.954,197,2.685,275,5.78,291,1.757,327,2.106,351,4.652,434,1.977,444,3.115,451,2.548,468,3.657,474,1.674,479,1.55,492,2.763,497,1.527,523,1.482,546,3.158,585,2.9,587,2.46,594,4.294,621,2.132,630,2.795,633,2.596,647,4.134,652,3.069,721,1.653,728,3.602,749,3.453,752,3.327,763,1.498,787,3.978,891,3.51,1044,2.548,1053,2.548,1080,2.525,1127,2.346,1131,3.023,1275,2.733,1421,2.022,1512,2.829,1558,3.279,1564,1.977,1636,2.363,1639,3.031,1738,2.363,1751,5.263,1752,3.069,1786,5.263,2006,3.288,2042,4.294,2045,2.548,2084,4.67,2110,3.97,2149,4.428,2208,2.98,2209,3.288,2328,5.031,2329,5.031,2909,3.118,2956,5.263,2961,5.401,3001,3.429,3104,3.707,3704,4.162,5775,3.429,6358,3.707,6498,4.409,6533,5.559,6534,5.559,6553,4.785,6554,4.785,6555,4.785]],["t/1981",[19,2.397,20,3.97,39,2.522,162,1.76,224,2.889,251,4.387,417,3.448,763,3.401,818,3.825,1380,7.268,1573,4.282,1840,4.023,1842,4.79,2045,5.783,2146,5.697,2328,6.131,2329,7.615,2343,6.763,6432,6.999,6540,6.999,6552,8.057]],["t/1984",[20,4.409,23,1.6,43,3.713,69,3.91,71,1,81,3.495,105,4.009,138,1.911,168,2.733,172,2.013,197,3.029,224,2.426,327,3.231,404,5.811,414,3.271,436,3.874,522,3.447,523,2.274,619,3.231,626,4.45,709,5.045,982,5.877,1039,4.639,1085,3.874,1263,4.063,1353,3.599,1559,2.955,1561,6.103,1574,3.292,1591,5.045,1639,3.102,1742,6.765,1754,6.103,1759,5.877,1879,3.683,2006,6.672,2148,5.877,2416,6.386,5792,6.765,6407,5.877,6526,6.765,6556,7.341]],["t/1986",[20,2.777,23,2.552,41,4.203,59,3.228,69,3.257,75,2.976,95,3.351,97,3.986,105,4.153,150,5.008,168,2.277,172,1.677,197,1.908,224,2.021,351,2.976,361,3.419,414,3.82,422,1.538,451,3.257,487,4.203,523,2.655,533,1.901,611,2.725,619,2.692,629,4.605,641,3.493,721,2.113,752,2.364,893,2.852,977,5.636,983,3.986,1002,2.528,1014,3.864,1085,3.228,1147,3.923,1152,3.751,1166,4.487,1244,4.605,1256,3.172,1359,5.636,1591,4.203,1598,4.605,1656,3.707,1937,4.125,1943,4.739,1965,4.053,2006,4.203,2076,5.084,2080,4.739,2910,4.383,2932,5.32,4060,4.125,5379,4.383,5434,5.32,5640,4.487,5647,4.896,6165,5.636,6357,5.636,6414,5.636,6532,5.636,6557,6.116,6558,6.116,6559,6.116]],["t/1988",[20,1.922,23,1.956,40,1.686,46,2.417,61,1.513,66,2.93,71,0.576,75,3.884,97,2.758,98,1.605,105,4.118,106,2.777,110,2.378,115,1.533,120,2.565,140,2.472,146,1.934,159,5.201,161,1.74,168,2.432,197,1.32,224,1.398,298,2.908,339,2.015,349,2.158,406,1.366,444,1.987,459,2.502,474,1.481,485,3.448,487,4.491,491,2.176,517,2.015,518,2.075,522,5.528,533,2.031,549,2.399,602,2.233,611,2.912,619,1.863,629,3.186,641,2.417,650,3.156,716,2.107,721,1.462,740,2.366,776,2.908,792,2.194,796,1.886,803,2.825,855,1.487,962,2.502,973,2.809,982,6.389,983,2.758,1014,2.674,1039,2.674,1044,2.254,1085,2.233,1126,2.296,1147,4.191,1152,3.927,1185,3.105,1253,2.059,1256,2.195,1260,3.518,1314,2.502,1433,2.968,1559,1.703,1598,3.186,1737,2.968,1743,3.681,1766,3.186,1844,2.715,1937,4.407,2185,2.758,2409,4.069,2416,3.681,2454,4.794,2622,2.6,2834,3.518,2969,3.388,2972,4.794,3011,3.9,3141,2.636,3918,2.391,4060,2.854,5379,4.682,5457,3.681,5459,3.388,5634,4.582,5640,3.105,5647,5.231,5798,3.9,5805,2.968,6333,3.518,6474,3.9,6560,4.232,6561,4.232,6562,3.681,6563,4.232,6564,4.232]],["t/1990",[20,2.55,23,1.759,30,2.008,33,4.259,34,3.281,40,2.237,42,3.047,47,3.404,62,1.069,66,2.518,71,0.765,75,3.926,76,3.498,105,3.997,110,2.044,146,2.567,159,3.66,197,1.752,224,3.121,309,2.13,351,2.733,404,3.361,444,2.454,459,3.32,485,2.964,487,3.86,517,2.674,518,2.753,522,5.635,531,3.361,533,1.746,546,2.472,619,4.157,641,3.207,650,2.712,792,3.171,805,2.4,855,3.319,902,1.785,962,3.32,973,3.468,1044,2.991,1152,3.53,1260,4.669,1410,2.346,1413,4.024,1436,4.262,1559,2.26,1608,3.602,1768,3.45,1937,5.442,2045,2.991,2277,3.45,2454,4.12,2573,4.351,5379,4.024,5395,5.175,5459,4.496,5647,6.459,5805,3.938,6458,4.885,6562,7.019,6565,4.885]],["t/1992",[20,4.24,23,2.035,43,4.723,71,1.539,105,3.11,133,3.99,197,2.913,224,3.085,414,4.161,619,4.11,741,5.07,1316,5.899,1631,6.321,6490,7.474,6566,7.762]],["t/1994",[23,1.622,42,4.038,75,3.62,95,4.077,105,3.876,150,5.722,224,3.237,422,1.871,444,2.979,451,3.963,485,3.927,487,5.114,514,2.891,518,4.802,533,2.313,549,2.732,629,5.602,716,3.704,721,2.571,845,5.018,1003,4.571,1232,5.218,1316,6.189,1387,4.51,1591,5.114,1598,5.602,1937,5.018,1965,4.931,1983,4.51,2065,5.218,4191,6.857,5459,5.956,5647,5.956,6490,5.956,6565,6.473,6566,6.186,6567,5.956,6568,6.186,6569,7.441,6570,7.441]],["t/1996",[23,1.765,53,5.278,75,3.941,105,3.799,224,2.676,436,4.274,487,5.566,565,4.001,620,5.803,650,3.912,716,4.032,792,3.475,845,5.462,887,5.195,1014,5.117,1085,4.274,1147,5.195,1152,3.543,1207,6.733,1354,5.462,1598,6.097,1801,6.733,1824,6.097,1937,5.462,1983,4.909,2083,6.275,2154,6.483,2352,6.733,5379,5.803,6490,6.483,6566,6.733,6567,6.483,6571,8.099]],["t/1998",[23,1.682,30,2.76,48,2.01,59,2.119,71,0.547,98,1.523,105,2.906,106,1.706,138,1.045,139,2.839,140,2.346,161,1.651,166,3.199,224,3.684,273,2.576,309,3.309,313,2.966,337,1.226,355,2.617,404,2.403,406,2.492,422,1.578,426,1.678,433,1.301,434,1.66,436,4.996,444,1.908,451,2.138,475,4.495,479,1.301,490,2.434,502,1.835,512,3.023,519,2.346,522,1.885,546,2.761,573,2.031,612,2.179,614,1.86,619,3.841,621,2.795,630,2.346,638,1.994,709,2.76,716,4.712,749,1.354,796,1.789,805,1.716,845,5.885,873,2.374,893,1.872,948,2.222,982,3.214,1085,2.119,1117,1.984,1146,5.997,1147,2.576,1166,4.602,1188,4.157,1219,2.138,1232,2.816,1277,2.708,1282,2.576,1313,2.179,1316,2.537,1353,1.969,1556,3.111,1559,2.525,1591,2.76,1631,4.316,1636,1.984,1737,2.816,1752,4.024,1759,3.214,1831,3.709,1943,3.111,1983,6.082,1986,4.861,2023,2.434,2030,3.111,2073,4.231,2110,2.222,2154,3.214,2161,2.816,2185,2.617,2277,2.467,2389,3.023,2946,3.111,2964,3.023,2998,3.111,5735,3.214,5769,3.338,5773,3.338,6369,3.338,6567,6.18,6572,6.273,6573,4.015,6574,4.015,6575,4.015,6576,4.015,6577,4.015,6578,3.338,6579,3.701,6580,3.701,6581,3.701,6582,3.338,6583,4.015]],["t/2000",[23,1.579,30,2.59,48,1.886,106,3.078,139,3.515,166,4.907,172,1.986,224,3.18,309,2.748,313,3.425,406,3.488,422,1.822,433,2.348,434,3.977,436,3.823,451,3.858,491,3.725,522,4.518,546,3.189,612,3.931,716,3.606,805,3.096,845,4.886,855,2.546,873,4.283,982,5.799,1002,2.994,1313,3.931,1314,4.283,1316,4.577,1752,4.647,1983,4.392,2073,4.886,2154,5.799,2456,6.676,2964,5.454,5457,6.302,5769,6.023,5773,6.023,6490,5.799,6566,6.023,6578,6.023,6582,6.023,6584,7.244]],["t/2002",[20,2.809,23,1.348,47,3.749,71,0.842,83,4.25,105,2.878,106,2.628,164,1.685,197,1.93,219,4.171,224,3.291,313,4.085,326,2.966,404,5.96,406,1.996,434,4.116,436,4.56,444,1.881,460,3.613,497,1.974,522,2.904,527,2.756,546,3.803,568,4.337,612,3.356,626,3.749,652,3.967,709,5.938,716,3.079,721,2.137,763,1.937,795,3.967,796,2.756,845,5.827,873,3.656,991,3.702,1044,3.294,1064,3.702,1085,3.264,1186,4.792,1232,4.337,1316,6.292,1559,3.477,1631,4.831,1734,3.908,1737,4.337,1752,3.967,1760,5.141,1824,4.656,1918,3.656,1983,5.238,2073,4.171,2107,4.538,2161,4.337,5480,5.38,6369,5.141,6567,4.951,6578,5.141,6582,5.141,6585,6.185,6586,6.185]],["t/2004",[20,3.41,23,1.322,30,2.168,41,2.644,69,3.23,71,0.524,97,2.507,98,2.3,105,3.56,106,1.635,138,1.001,166,3.093,172,2.059,197,2.343,219,2.595,224,3.532,292,1.599,298,2.644,309,2.848,313,2.867,377,1.995,404,2.302,406,2.424,414,2.703,434,2.507,436,3.201,444,1.844,460,2.247,475,2.757,485,2.03,495,2.332,517,1.831,546,2.67,549,1.412,568,2.698,598,2.302,612,2.087,614,1.782,619,3.305,620,2.757,628,2.302,629,2.896,630,2.247,652,2.467,709,4.169,716,3.019,721,1.329,776,2.644,803,1.663,805,1.644,845,5.064,861,2.068,893,1.794,972,1.565,973,2.607,992,2.222,1044,2.049,1085,3.201,1096,2.332,1145,2.396,1152,1.683,1188,2.549,1232,2.698,1235,2.396,1260,3.198,1308,2.173,1316,4.744,1353,1.886,1377,2.108,1410,2.534,1559,2.441,1561,5.042,1591,2.644,1604,2.698,1631,4.765,1639,1.625,1720,2.896,1723,2.595,1733,3.198,1734,4.744,1737,4.253,1752,2.467,1759,3.079,1768,2.363,1918,2.274,1962,2.896,1983,4.552,2021,3.346,2068,3.346,2148,3.079,2149,1.782,2154,3.079,2161,2.698,2185,2.507,2277,2.363,2480,2.698,2945,3.198,2964,2.896,3335,3.346,4253,3.346,5379,2.757,5397,4.7,5459,4.855,5634,2.698,5769,3.198,5773,3.198,6369,5.042,6429,3.198,6540,3.079,6562,3.346,6565,3.346,6567,4.855,6568,3.198,6578,5.042,6579,3.545,6580,3.545,6581,3.545,6582,5.042,6587,3.847,6588,3.847,6589,3.847,6590,3.847,6591,3.847,6592,3.847]],["t/2007",[23,1.519,25,2.872,111,2.79,164,1.898,197,3.537,275,3.746,342,4.025,351,4.563,362,5.84,422,2.358,428,3.013,468,4.817,479,2.258,481,3.525,501,3.442,519,4.071,523,2.158,533,2.166,540,4.171,546,3.067,647,3.013,749,3.988,974,3.896,1052,4.025,1083,4.403,1421,2.945,1473,4.071,1558,4.286,1573,2.748,1574,3.125,1738,4.632,2001,5.247,2042,5.612,2084,5.751,2129,4.789,2149,3.228,3375,4.7,5775,4.994,6568,5.793]],["t/2009",[28,2.998,39,2.269,71,1.071,139,3.304,198,2.652,313,5.318,422,1.978,426,4.244,433,2.549,468,3.343,485,4.152,546,4.951,621,3.505,902,2.501,1018,4.19,1081,4.493,1094,6.619,1312,6.096,1564,3.251,1633,4.012,1638,3.381,1688,6.497,1689,6.497,1738,3.886,1756,5.213,2042,4.708,2084,4.269,5441,5.923,5614,5.306]],["t/2011",[23,1.472,25,2.812,30,3.729,98,2.562,139,2.197,197,3.492,224,2.232,275,3.631,288,2.807,316,2.973,351,3.287,451,3.597,461,2.87,468,2.87,517,3.216,519,3.946,549,2.48,641,3.858,647,2.92,716,3.363,721,2.334,763,2.115,850,3.311,978,4.268,988,6.736,1012,3.416,1480,6.193,1514,4.207,1558,3.087,1573,2.664,1636,3.337,1638,3.947,1731,3.816,2045,3.597,2084,3.665,2089,4.149,2110,6.194,2149,3.129,2208,4.207,2909,4.402,3785,6.225,3851,4.333,4256,4.737,6363,4.956,6533,5.234,6534,5.234,6593,6.755,6594,6.755,6595,6.755,6596,5.876,6597,6.755]],["t/2013",[23,1.876,28,3.28,39,2.482,71,0.651,87,2.311,98,2.721,101,3.288,138,1.246,162,0.963,164,1.303,168,1.781,172,1.312,188,1.303,197,2.238,275,2.572,292,1.988,309,1.815,326,3.44,362,2.98,451,2.548,461,3.048,479,1.55,485,2.525,492,4.143,514,1.859,515,2.801,517,2.278,518,2.346,519,4.191,534,1.999,546,3.788,603,2.382,652,3.069,713,2.864,749,1.613,763,2.247,797,3.429,846,3.227,860,2.864,861,2.572,881,3.118,888,3.118,893,2.231,902,1.521,951,4.409,955,2.022,988,3.51,992,4.143,1001,2.733,1015,2.9,1037,2.763,1039,3.023,1083,4.533,1094,3.118,1243,4.838,1272,4.162,1290,4.349,1305,3.171,1312,3.707,1353,2.346,1514,2.98,1571,3.139,1573,2.829,1574,2.145,1633,2.44,1636,2.363,1639,2.022,1672,3.069,1731,2.703,1802,3.429,2006,3.288,2045,2.548,2078,3.429,2110,4.763,2149,2.216,2328,3.355,2329,3.355,2400,4.294,2660,3.429,2891,4.409,2909,6.675,2956,3.51,2961,5.401,4171,4.409,5379,3.429,5765,3.707,5775,3.429,6533,3.707,6534,3.707,6545,4.409,6598,4.785,6599,4.785,6600,4.785,6601,4.785,6602,4.785,6603,4.785,6604,4.785,6605,4.785,6606,4.785,6607,4.785]],["t/2015",[23,2.507,25,1.613,71,0.717,87,2.544,162,1.06,188,2.729,197,1.643,224,1.74,275,5.385,291,3.679,351,3.747,406,1.7,428,2.277,444,1.601,458,1.82,468,3.273,479,1.706,497,1.68,519,3.077,523,1.631,533,1.637,534,4.186,546,2.318,581,4.216,594,3.152,647,3.33,749,3.754,763,1.649,803,2.277,858,3.432,902,1.674,932,2.582,934,2.525,972,2.142,989,2.601,992,3.041,1038,2.621,1087,2.914,1198,2.975,1243,3.552,1366,3.28,1573,3.591,1574,2.361,1575,4.581,1638,2.264,1639,2.225,1738,2.601,1741,4.669,2007,4.378,2042,5.996,2084,4.179,2110,5.544,2149,4.217,2328,3.693,2329,3.693,2909,7.257,2961,3.965,2994,4.581,2995,4.853,5361,3.864,6533,5.968,6534,5.968,6608,5.266,6609,5.266]],["t/2017",[197,3.126,749,3.377,763,3.137,992,5.786,1243,6.757,1290,6.073,1573,3.95,2045,5.335,2328,7.025,2329,7.025]],["t/2019",[40,4.181,105,3.496,860,6.282,1248,6.447,1712,5.696]],["t/2022",[19,1.268,23,1.008,25,3.091,35,2.233,43,2.339,58,2.509,71,1.28,95,2.533,106,1.965,110,3.068,120,2.803,124,4.238,125,2.664,138,2.447,150,5.49,153,1.546,162,2.422,169,2.585,172,1.268,206,2.612,271,1.861,327,2.035,328,1.546,365,2.733,368,2.233,374,1.999,407,1.901,421,4.832,422,1.163,434,3.484,445,2.612,474,1.618,500,3.583,522,2.171,543,2.302,546,2.035,565,2.284,619,2.035,621,2.06,641,5.367,653,2.612,756,2.339,758,2.462,792,1.552,796,3.115,846,3.118,866,2.921,867,1.932,1010,2.485,1041,2.767,1080,2.44,1095,2.921,1107,3.064,1129,2.88,1132,3.313,1193,2.585,1199,3.481,1211,3.013,1225,5.01,1258,2.302,1263,2.559,1296,2.84,1334,2.84,1342,3.013,1406,4.261,1444,4.022,1445,3.844,1512,2.733,1557,2.559,1558,2.113,1560,3.583,1564,4.171,1568,3.064,1574,2.073,1605,2.559,1639,1.954,1738,3.454,1739,3.013,1768,2.84,1824,3.481,2213,2.88,2461,3.844,2492,3.844,3018,3.064,3042,5.812,3702,3.313,5877,3.844,6407,3.701,6610,4.261,6611,4.624,6612,4.624,6613,4.624,6614,4.261,6615,4.624,6616,4.261]],["t/2024",[20,2.793,23,2.164,25,1.884,29,2.248,39,1.774,59,3.246,69,3.275,71,1.172,81,2.928,97,4.008,138,2.8,146,2.811,150,3.593,162,2.165,168,3.204,172,1.686,350,2.793,351,2.992,381,5.217,414,2.74,421,4.425,444,1.87,445,3.475,479,1.993,492,3.552,522,2.887,533,2.675,621,3.835,641,3.513,713,3.681,815,2.908,1012,3.111,1018,3.275,1023,5.36,1078,3.778,1145,3.83,1193,3.438,1218,3.83,1223,3.778,1225,4.407,1263,3.403,1296,3.778,1305,4.075,1540,4.008,1560,4.765,1565,4.313,1568,6.579,1570,5.151,1577,5.113,1581,6.669,1585,4.765,1586,4.923,1605,3.403,1714,4.512,2134,4.765,2461,5.113,2944,4.008,6183,7.931,6614,5.668]],["t/2026",[25,1.677,29,2.002,39,1.579,69,2.916,71,0.746,107,2.127,110,1.993,123,3.277,125,3.889,138,2.819,140,3.199,162,1.102,168,2.949,172,2.173,199,4.243,224,1.809,241,2.368,263,5.318,272,1.831,288,2.275,298,3.763,414,2.44,421,2.816,422,1.377,428,2.368,433,1.774,437,2.548,444,1.665,458,1.892,461,2.327,479,2.568,490,4.803,507,3.763,515,3.094,522,2.571,523,2.454,528,3.319,533,1.702,549,2.011,596,2.204,630,3.199,644,2.816,805,2.34,815,2.589,867,2.288,873,3.237,948,3.03,1018,2.916,1039,3.46,1092,3.277,1176,3.094,1256,2.84,1258,2.726,1297,3.763,1334,3.364,1341,4.552,1512,3.237,1541,3.237,1558,2.503,1564,3.275,1567,3.128,1568,6.17,1573,2.159,1605,3.03,1618,3.062,1619,2.943,1734,3.46,1737,3.84,1741,4.803,1750,4.384,1834,3.693,2084,2.971,2994,4.764,3032,4.243,3702,3.924,4287,5.678,6417,5.046,6617,5.476,6618,5.476,6619,5.476]],["t/2028",[19,0.429,21,1.212,22,2.354,23,1.186,25,2.302,26,1.055,29,1.723,30,0.559,32,2.899,34,0.914,35,1.362,37,1.516,40,1.123,42,0.849,43,0.791,45,1.874,48,0.734,54,1.667,56,0.672,59,0.825,62,0.298,66,2.113,71,1.292,73,2.666,81,1.834,87,0.755,92,3.176,95,2.983,96,1.348,98,0.593,107,1.831,109,1.333,110,0.569,122,0.857,125,1.796,129,0.71,138,2.054,142,0.864,146,1.76,150,0.914,162,1.222,164,1.284,167,0.943,168,1.05,169,2.635,172,0.773,188,0.768,197,0.488,198,2.391,206,1.593,219,1.055,223,1.502,233,1.441,246,0.71,263,0.893,272,0.523,275,0.841,282,1.606,283,0.914,284,0.917,290,1.306,291,0.574,307,1.075,309,1.07,316,1.695,328,0.523,329,1.097,351,1.874,352,2.366,354,0.785,361,2.153,374,0.676,381,3.3,382,0.661,390,0.804,395,1.426,397,0.874,402,1.611,403,0.917,406,0.505,421,3.647,422,1.527,433,0.507,434,1.592,437,2.127,445,0.884,458,0.975,461,0.665,464,1.516,474,0.547,475,1.121,479,0.507,485,1.488,491,0.804,493,0.684,500,1.212,501,0.773,502,0.715,507,1.075,514,0.608,515,1.101,522,0.734,523,1.193,527,0.697,528,1.71,534,0.654,543,0.779,546,0.688,549,1.73,551,1.361,565,0.773,569,0.562,575,1.003,576,0.701,603,1.404,606,0.798,618,1.075,619,0.688,627,1.121,637,1.036,641,2.692,642,1.036,644,0.804,648,1.629,650,0.755,669,1.252,713,0.936,716,1.404,721,0.975,733,1.212,751,0.833,752,0.605,753,2.47,763,0.49,770,2.433,776,1.075,792,2.956,797,1.121,805,1.205,815,0.739,850,1.383,855,0.991,867,1.178,869,0.833,885,1.756,890,0.811,902,0.497,948,0.866,962,3.218,981,1.148,984,1.121,1014,0.988,1018,0.833,1027,1.289,1080,0.825,1083,0.988,1087,0.866,1092,0.936,1095,0.988,1111,1.019,1122,0.791,1126,0.849,1132,1.121,1152,0.684,1176,0.884,1182,1.055,1202,1.003,1217,1.075,1225,1.121,1230,0.925,1231,1.438,1236,1.121,1239,1.055,1252,0.734,1253,0.761,1256,0.811,1263,0.866,1278,1.212,1292,2.552,1295,3.458,1296,2.366,1305,1.036,1314,0.925,1316,0.988,1353,0.767,1354,1.055,1410,2.964,1438,2.258,1467,1.097,1470,0.833,1473,0.914,1478,1.978,1482,1.71,1512,2.277,1560,2.185,1564,3.4,1565,1.097,1567,5.17,1568,5.651,1570,2.305,1573,1.519,1574,0.701,1576,0.914,1577,2.345,1581,4.704,1584,1.593,1585,1.212,1586,1.252,1594,1.055,1596,1.441,1600,0.925,1601,4.098,1607,1.441,1610,0.948,1618,3.394,1619,1.516,1629,1.178,1631,0.874,1638,0.672,1656,1.71,1668,0.925,1671,1.212,1683,2.453,1709,0.804,1723,1.055,1729,0.948,1732,0.798,1737,1.978,1768,0.961,1802,2.76,1852,1.121,1887,1.361,2023,0.948,2073,1.902,2077,1.212,2144,0.925,2342,1.036,2360,1.252,2422,1.361,2442,1.361,2536,1.178,2611,1.252,2639,0.857,2665,1.252,2774,1.097,2893,1.121,2906,1.075,2911,1.441,2913,1.441,2944,1.019,2964,1.178,2985,1.252,3001,2.76,3014,2.453,3020,3.083,3042,1.3,3047,1.097,3141,0.974,3601,1.441,3975,1.3,4104,1.3,4979,1.361,5001,2.345,5020,1.361,5032,7.156,5370,1.361,5504,1.361,5561,1.252,5764,1.212,5805,1.097,6019,1.252,6355,1.441,6477,1.361,6484,2.453,6507,1.441,6620,1.564,6621,2.599,6622,1.564,6623,1.564,6624,1.564,6625,1.564,6626,1.564,6627,1.564,6628,1.564,6629,1.564,6630,1.564,6631,1.564,6632,1.564,6633,1.441,6634,1.564,6635,1.564,6636,1.441,6637,1.564,6638,1.564,6639,1.564,6640,1.564,6641,2.82,6642,1.441,6643,1.564,6644,1.564,6645,1.564]],["t/2030",[29,2.896,30,2.833,32,4.22,48,2.063,81,4.858,125,3.888,162,1.595,172,2.798,246,3.598,282,2.096,381,4.803,433,2.568,479,2.568,496,3.695,497,3.256,625,4.935,653,4.477,709,5.446,752,3.945,792,3.426,855,2.784,993,4.742,1087,4.385,1574,3.553,1582,7.302,1583,6.893,1584,4.477,1735,7.302,1997,6.343,2046,4.04,3702,5.678,5032,6.893,6646,7.923]],["t/2032",[20,2.55,29,3.774,32,5.03,39,1.62,70,2.912,71,1.286,81,2.674,107,4.011,123,3.361,125,3.075,162,1.901,169,4.511,200,3.86,206,3.173,282,1.486,382,2.373,395,2.84,433,1.82,437,1.806,464,3.019,479,1.82,497,2.575,515,2.193,517,2.674,523,3.197,549,2.062,565,2.774,596,2.26,641,3.207,653,3.173,763,1.759,792,1.886,815,2.655,867,2.346,902,1.785,957,3.721,963,5.175,980,2.518,1003,3.45,1041,3.361,1089,2.818,1122,2.84,1127,2.753,1154,3.938,1235,3.498,1239,5.442,1256,4.185,1296,3.45,1316,3.548,1366,3.498,1512,3.32,1567,5.394,1568,6.258,1574,2.518,1585,4.351,1586,4.496,1594,3.788,1669,3.243,1805,4.496,1858,4.885,1918,3.32,1962,4.228,2185,3.66,2784,4.024,4287,4.024,5357,4.669,5614,3.788,6399,5.175,6633,5.175,6647,5.616,6648,5.616,6649,5.616]],["t/2034",[32,5.755,6650,10.806]],["t/2039",[19,2.097,23,2.173,29,2.795,96,2.676,138,1.991,142,2.343,161,3.144,162,2.007,168,2.847,169,4.276,206,4.321,263,4.368,282,2.936,292,3.178,342,4.417,390,3.933,395,5.948,421,3.933,422,2.958,437,3.207,444,2.326,485,4.036,498,2.928,596,3.078,758,4.073,867,4.167,1080,4.036,1092,4.577,1564,3.161,2573,5.926,2699,4.984,6651,7.048]],["t/2041",[19,2.369,23,1.883,25,3.302,39,1.784,71,0.842,73,3.227,83,4.25,106,2.628,110,3.144,124,5.238,138,1.61,188,1.685,206,4.882,282,3.307,390,6.201,395,5.037,421,3.18,422,2.504,434,2.556,622,4.03,718,6.096,758,4.601,867,4.739,882,4.582,902,1.966,1094,5.631,1377,3.389,1638,2.658,1639,2.613,5441,4.656,6652,9.768,6653,6.185,6654,5.7]],["t/2043",[19,1.524,25,3.336,73,1.801,96,3.286,115,2.902,122,5.968,124,3.37,138,2.445,142,1.703,161,3.293,169,3.108,188,2.558,198,1.874,206,4.526,263,5.363,282,1.471,361,3.108,390,4.119,395,5.739,403,1.808,421,2.858,422,2.584,437,3.02,485,2.934,497,1.774,523,1.722,607,3.108,614,3.71,718,5.048,803,2.403,814,3.141,815,2.628,855,1.953,867,4.741,882,2.558,942,3.566,1036,2.812,1041,3.327,1044,2.961,1152,2.432,1176,3.141,1198,3.141,1223,4.921,1251,3.211,1313,3.016,1377,3.046,1564,3.311,1808,3.462,2274,3.749,2450,3.984,2480,5.617,2916,4.307,3032,4.307,4188,4.45,6297,5.123,6610,5.123,6655,5.559]],["t/2045",[25,3.246,28,2.267,38,2.853,73,3.434,83,4.089,87,2.874,96,2.082,98,2.257,103,3.878,106,2.528,122,5.343,138,2.189,142,2.987,161,3.457,188,2.29,198,2.006,206,4.751,263,4.803,282,2.224,390,5.45,395,5.36,422,2.452,437,3.136,451,3.169,485,3.14,624,3.706,721,2.056,754,4.173,758,5.193,814,3.362,855,2.091,867,4.672,870,3.398,882,3.869,943,4.366,994,4.013,1085,3.14,1092,3.561,1198,3.362,1231,3.034,1249,5.176,1306,3.655,1389,3.26,1557,3.293,1564,3.475,1610,3.607,1879,2.986,2367,5.176,2699,5.48,3732,5.176]],["t/2047",[19,2.887,25,3.455,48,2.741,71,0.937,73,2.23,115,2.493,122,5.095,138,1.792,161,3.822,188,1.874,206,3.888,263,3.93,390,3.539,395,6.384,406,2.221,422,2.962,433,2.23,437,2.213,479,2.23,485,3.632,534,2.875,718,3.699,756,3.481,758,5.608,867,3.885,882,3.166,1198,3.888,1253,3.348,1394,5.875,1564,3.843,1604,4.826,1698,2.814,2066,4.119,2691,5.432]],["t/2049",[25,2.987,28,3.716,48,1.549,62,1.133,73,1.928,96,2.082,106,2.528,110,2.165,111,2.382,122,4.607,124,5.097,137,4.253,161,2.446,168,3.13,169,3.327,188,1.621,395,6.425,422,3.064,713,3.561,753,6.255,754,4.173,758,3.169,792,1.998,814,3.362,867,5.402,882,2.738,943,4.366,1129,3.706,1182,4.013,1194,5.176,1253,2.895,1328,5.484,1389,5.343,1566,4.947,1638,2.558,1723,5.671,1808,3.706,2073,4.013,2699,3.878,3732,5.176,4498,4.48,4743,5.176,6656,5.95]],["t/2051",[25,3.019,29,2.454,31,2.477,48,1.748,54,2.592,71,0.914,73,2.963,83,3.013,87,3.941,96,3.199,111,3.267,122,5.401,138,1.141,161,1.802,168,1.632,169,2.451,190,1.72,198,3.505,272,1.466,282,2.607,290,2.03,337,2.049,390,4.702,395,4.986,403,1.426,422,2.299,437,2.159,451,3.575,497,1.399,534,1.832,611,1.953,614,2.03,644,2.254,721,1.515,737,3.074,753,2.812,758,4.869,855,1.541,867,5.152,882,2.017,958,3.216,978,2.77,1002,1.812,1066,3.074,1083,2.77,1085,2.314,1092,2.624,1093,2.812,1182,2.957,1198,5.166,1252,2.058,1377,3.679,1389,5.01,1421,1.852,1557,2.426,1558,2.004,1604,3.074,1631,2.451,1638,2.886,1723,2.957,1834,2.957,1879,2.2,1936,3.397,2179,4.04,2402,3.814,2480,3.074,2874,3.216,4215,3.814,5024,4.04,5765,3.397,6568,3.644,6652,6.783,6654,4.04,6657,3.814,6658,4.384,6659,4.384,6660,4.384,6661,4.384,6662,4.384,6663,4.04,6664,6.714]],["t/2054",[25,1.995,59,4.727,89,4.235,124,3.949,167,2.995,169,3.642,188,1.774,272,2.995,282,2.916,328,3.865,395,6.395,417,2.569,422,2.772,587,4.606,614,4.741,723,5.361,814,3.681,818,2.85,851,4.179,867,4.99,902,2.071,1081,3.721,1085,3.438,1315,4.668,1571,2.85,1631,3.642,2277,4.002,2639,5.609,3596,7.446,3630,5.667,3634,5.667,4728,4.477,6333,5.416,6424,5.416,6665,6.514]],["t/2056",[48,2.539,89,4.61,115,3.533,170,2.507,198,3.287,272,3.261,390,5.014,395,4.932,422,2.452,807,8.483,867,4.074,1092,5.836,1198,5.509]],["t/2058",[25,1.986,28,0.775,40,0.81,48,0.529,62,2.197,71,0.277,73,1.539,81,0.968,84,1.266,89,0.961,109,2.246,115,0.736,122,4.212,124,2.88,138,0.927,139,1.158,143,0.646,145,1.846,153,1.191,161,3.67,168,0.757,170,1.221,172,1.302,219,1.371,263,2.033,272,0.68,282,0.538,326,0.975,328,0.68,343,1.627,350,2.157,351,1.732,378,1.073,390,1.045,395,6.031,422,2.733,444,0.618,485,1.073,492,2.056,502,0.929,520,1.284,534,0.849,587,4.591,596,0.818,604,2.143,611,0.906,614,0.941,624,1.266,639,1.69,644,1.831,752,0.786,758,3.453,815,0.961,854,1.148,855,2.279,865,1.347,867,4.782,869,1.896,882,2.186,902,1.51,970,0.975,996,3.949,1002,0.84,1026,1.575,1027,0.929,1035,1.284,1083,1.284,1084,1.397,1092,2.131,1148,2.85,1198,2.684,1251,1.174,1253,0.989,1296,1.249,1314,1.202,1353,0.996,1377,1.114,1389,1.114,1412,2.984,1442,1.325,1458,1.161,1557,1.125,1564,1.471,1584,1.148,1639,0.859,1652,1.69,1732,1.037,2000,3.097,2069,1.325,2381,1.627,2400,1.217,2410,1.148,2447,1.425,2480,1.425,2699,1.325,2719,2.447,2774,1.425,3018,1.347,3599,1.873,3615,1.69,3616,1.873,3617,1.873,3618,1.873,3619,7.897,3620,3.281,3623,1.873,3624,10.788,3625,4.378,3626,10.989,3627,1.873,3628,1.873,3629,1.768,3630,1.768,3631,1.873,3632,1.873,3633,1.873,3634,1.768,3635,1.873,3636,1.873,3637,1.768,3638,1.873,3639,5.976,3640,1.873,3641,4.378,3642,1.873,3643,8.52,3644,1.873,3645,1.873,3646,1.873,3647,1.873,3648,1.873,3649,6.576,3650,1.873,3651,1.873,3652,1.873,3653,1.873,3655,1.873,3656,1.873,3657,8.52,3658,1.873,3659,1.873,3660,1.873,3661,1.873,3662,1.873,3663,1.873,3664,1.873,3665,1.873,3666,5.256,3667,1.873,3668,1.873,3669,1.873,3670,1.873,3671,1.873,3672,1.873,3673,1.873,3674,1.873,3675,1.873,3676,1.873,3677,1.873,3678,1.873,3679,1.873,3680,1.873,5361,1.491,6420,1.873,6657,3.097,6666,2.033,6667,2.033,6668,2.033,6669,2.033,6670,2.033,6671,2.033]],["t/2061",[29,2.835,40,3.089,73,2.513,103,5.054,122,4.25,171,3.241,223,4.13,290,3.592,309,2.941,378,4.093,395,5.09,422,1.95,521,3.891,644,5.175,758,6.525,867,4.668,1133,4.9,1182,5.231,1256,4.022,1389,6.122,1412,5.265,1557,4.292,1729,6.101,1751,5.69,2699,6.559,6672,7.756,6673,7.756,6674,7.147,6675,7.147]],["t/2063",[39,2.371,69,4.377,73,2.664,138,2.14,142,3.2,171,3.435,223,4.377,282,2.764,290,3.807,395,4.157,422,2.067,626,4.983,792,2.76,867,4.798,974,4.596,1200,6.189,1251,4.747,1389,5.724,1412,5.465,1421,3.473,2480,5.764,5564,7.575,5632,6.833,5781,7.15,6287,7.575,6411,7.15,6652,6.833,6676,8.22]],["t/2065",[28,3.109,71,1.111,105,3.812,112,3.884,146,3.729,150,4.766,188,2.222,189,4.712,198,2.75,282,2.158,390,4.195,395,6.095,407,3.354,422,2.615,491,4.195,690,7.519,741,3.658,1198,4.61,1389,4.47,1396,6.143,1613,5.155,1713,7.828,2006,5.607,2691,4.766,2874,5.986,2906,5.607,5474,6.783,5751,5.847]],["t/2068",[25,0.982,28,1.222,39,1.917,40,2.088,47,4.029,62,1.729,67,1.757,70,3.447,71,0.437,84,1.997,97,4.331,104,2.026,110,1.167,124,5.129,138,1.73,142,0.982,161,2.154,167,1.072,170,1.347,176,5.947,188,2.473,206,5.131,223,3.539,224,1.06,263,1.832,282,1.758,290,1.485,361,1.793,378,1.693,381,4.029,390,3.417,395,6.077,403,1.043,406,1.035,414,2.335,421,1.649,422,2.962,434,1.325,437,1.685,468,1.363,479,1.039,514,2.036,520,3.311,596,2.675,751,2.791,752,2.026,758,4.087,763,1.004,805,1.371,814,4.336,855,2.697,867,4.726,869,1.708,882,3.531,940,2.353,967,3.283,975,1.852,993,1.919,1002,1.325,1027,1.466,1062,4.66,1080,1.693,1085,1.693,1093,2.057,1231,1.635,1253,1.56,1258,1.597,1353,1.572,1357,2.249,1389,2.872,1394,3.311,1410,1.34,1421,1.355,1426,2.125,1433,4.66,1564,2.747,1574,4.771,1639,1.355,1709,3.417,1729,1.944,1732,1.635,2453,2.026,2532,1.832,2699,2.09,3018,2.125,3750,2.79,4382,2.666,5623,3.946,5731,2.955,5747,4.357,6333,2.666,6352,4.83,6651,2.955,6663,2.955,6674,2.955,6675,2.955,6677,5.241,6678,6.646,6679,5.241,6680,3.207,6681,6.125,6682,3.207,6683,3.207,6684,3.207,6685,3.207,6686,3.207]],["t/2071",[25,2.961,73,3.132,96,3.382,124,5.859,170,2.485,282,2.557,395,4.889,625,6.02,1277,6.519,1282,6.2,1564,3.995,3018,6.405,6687,9.665,6688,9.665]],["t/2073",[25,3.041,46,5.67,48,2.584,71,1.352,87,4.795,170,2.552,282,2.626,395,5.021,882,4.568,1176,5.609,1871,7.947]],["t/2075",[497,3.482]],["t/2077",[23,0.928,25,3.148,29,0.914,32,3.495,39,1.228,46,1.428,48,2.788,71,1.091,73,3.677,84,6.057,92,1.308,96,2.576,103,1.629,106,1.062,107,0.971,110,2.023,112,1.19,122,1.37,125,1.622,134,2.871,137,1.264,141,2.988,142,0.766,143,0.795,150,2.487,161,2.698,164,0.681,168,1.584,169,2.38,170,1.892,171,1.044,172,0.685,224,0.826,246,1.135,282,2.833,292,1.039,300,1.308,309,0.948,363,0.749,368,1.207,369,1.344,375,1.1,390,2.189,395,5.509,421,2.189,437,0.804,474,1.489,492,1.444,497,1.358,500,1.937,501,2.103,502,3.662,523,1.318,528,1.515,534,1.779,546,1.1,549,0.918,585,1.515,596,1.006,758,5.473,818,1.862,846,1.686,855,0.878,867,3.347,882,5.278,893,1.985,902,1.767,948,1.383,1027,2.541,1080,1.319,1094,1.629,1219,3.495,1244,1.882,1378,1.791,1389,2.332,1458,3.749,1512,2.517,1523,3.05,1559,1.006,1564,4.502,1567,3.175,1570,3.327,1600,3.88,1601,7.543,1631,1.397,1657,1.686,1946,4.308,2198,2.078,2672,1.753,2964,1.882,3629,2.174,3938,2.304,4358,3.923,4998,2.304,6407,2.001,6689,2.5,6690,2.5,6691,2.5,6692,2.5,6693,2.5,6694,2.5,6695,2.5,6696,2.5,6697,2.5,6698,2.5,6699,2.5,6700,2.5,6701,5.559,6702,6.563,6703,8.011,6704,4.257,6705,6.563,6706,4.257,6707,4.257,6708,2.5,6709,2.5,6710,2.5,6711,2.5,6712,2.5,6713,2.5,6714,2.5,6715,2.5]],["t/2079",[291,4.007]],["t/2081",[1574,4.893]],["t/2083",[39,3.086,497,3.415,870,6.112]],["t/2085",[105,3.564,497,3.415,1712,5.806]],["t/2088",[28,2.527,30,2.371,48,2.361,71,1.235,73,2.149,95,3.634,96,2.321,111,2.656,125,2.527,138,1.727,162,1.335,172,1.819,327,2.919,378,3.5,444,2.017,498,3.472,514,2.577,522,3.114,589,5.529,721,2.292,792,2.227,815,3.136,853,3.5,860,3.97,861,3.565,966,5.215,1087,3.67,1145,4.131,1193,5.07,1253,5.027,1334,4.074,1639,3.831,1656,4.021,1673,6.112,1683,7.888,1731,3.747,1752,4.254,1794,5.139,1964,4.322,2122,3.47,2402,5.77,2451,4.074,3701,5.514,3851,4.254,5628,5.309,5629,4.994,5734,5.309,6363,4.866,6429,5.514,6716,6.632,6717,6.632]],["t/2090",[22,2.532,37,4.469,39,1.689,48,1.524,71,1.132,73,3.41,89,2.768,95,3.208,96,2.049,104,3.7,105,1.95,111,4.449,132,2.961,167,2.78,172,1.605,288,2.433,290,3.85,434,2.42,458,2.873,474,2.909,479,1.897,496,2.73,498,2.242,520,3.7,523,2.575,589,4.138,606,2.986,623,3.647,647,2.532,721,3.34,792,1.966,856,6.442,886,4.196,934,2.808,957,5.509,966,3.728,990,3.597,1127,2.87,1128,3.421,1145,3.647,1154,4.106,1253,4.703,1306,3.597,1332,3.88,1442,3.816,1540,3.816,1574,3.728,1603,3.647,1672,3.756,1725,4.687,1730,5.396,1751,4.296,1976,3.344,2100,6.259,3496,4.196,4067,4.408,4071,5.396,5381,4.408,5397,4.537,6459,7.661,6718,5.855,6719,5.855,6720,5.855]],["t/2092",[29,3.783,39,2.336,48,2.108,71,1.103,73,2.624,95,4.437,111,3.243,375,3.565,434,3.347,444,2.463,474,2.834,514,3.146,517,3.856,584,4.847,596,4.165,614,3.751,623,5.044,721,3.576,796,4.611,891,5.942,1127,3.97,1253,3.941,1258,4.032,1282,5.195,1353,3.97,1547,6.275,1557,4.482,1574,3.631,1672,5.195,1976,4.625,2671,5.044,5368,7.463]],["t/2094",[19,0.679,25,1.691,28,2.79,30,2.618,54,3.265,57,1.614,61,0.886,62,1.394,71,0.752,73,0.803,75,2.055,81,1.179,90,4.804,96,0.867,98,0.939,110,1.537,111,0.992,124,3.955,125,2.104,129,1.125,132,1.253,138,0.645,140,1.447,142,0.759,153,0.828,159,4.252,168,1.572,186,2.338,198,1.424,219,1.671,223,2.249,262,1.464,272,1.413,284,0.806,292,2.295,298,1.702,309,0.939,327,2.431,337,0.756,340,1.483,378,1.307,385,3.273,388,1.737,403,0.806,421,1.274,422,1.062,426,1.035,428,1.071,434,1.746,437,0.797,444,0.753,445,1.4,468,1.053,470,2.155,474,0.867,481,1.253,491,1.274,492,1.431,498,2.498,504,1.775,515,1.649,518,2.071,523,1.308,528,1.502,539,2.903,540,2.528,545,1.565,546,1.09,549,1.551,558,2.595,569,0.889,589,5.316,607,1.385,612,1.344,614,1.147,622,1.614,633,3.54,641,1.415,662,1.464,718,3.507,721,0.856,752,0.958,770,1.565,780,5.037,792,1.418,795,1.589,796,1.104,810,1.817,813,1.614,824,1.357,855,3.288,861,2.27,867,1.765,874,2.292,882,1.14,940,4.051,950,3.795,965,1.565,966,5.393,972,1.007,987,5.056,990,1.522,1012,1.253,1036,1.253,1059,1.464,1080,1.307,1097,2.059,1109,2.059,1129,1.543,1147,1.589,1193,2.362,1199,1.865,1218,1.543,1223,1.522,1230,2.497,1253,3.563,1290,1.502,1306,1.522,1308,2.387,1353,1.214,1363,2.753,1389,1.357,1394,1.565,1434,3.381,1479,1.737,1482,1.502,1558,4.43,1559,0.997,1570,1.483,1584,1.4,1585,1.919,1594,1.671,1599,1.565,1600,1.464,1628,1.464,1698,3.963,1781,1.817,1844,1.589,1891,1.614,1936,1.919,1964,2.753,1965,1.641,1978,1.865,2072,1.641,2104,2.283,2147,1.543,2149,1.956,2208,1.543,2274,1.671,2539,2.059,2583,2.059,2893,3.957,2910,1.775,3699,1.737,3702,1.775,3731,2.283,3851,1.589,4066,2.283,4344,2.059,4975,2.155,5005,3.099,5538,2.059,5562,2.283,5563,2.283,5694,2.283,5764,1.919,6432,1.983,6636,2.283,6652,2.059,6657,2.155,6721,4.224,6722,2.477,6723,2.477,6724,2.477,6725,2.477,6726,2.477,6727,2.477,6728,2.477,6729,2.477,6730,2.477,6731,2.477,6732,4.224,6733,2.477,6734,2.477,6735,2.477,6736,2.477,6737,4.224,6738,2.477,6739,2.477,6740,2.477]],["t/2096",[22,0.993,23,0.863,25,1.212,35,1.912,39,1.141,40,0.915,45,3.404,48,0.598,62,2.651,71,0.313,73,1.282,75,1.117,87,1.109,96,0.803,101,1.578,124,1.392,159,2.579,172,1.085,198,1.758,247,3.647,251,1.152,271,1.593,284,0.747,327,1.011,385,1.779,388,3.658,422,1.312,426,0.959,431,0.981,434,2.891,437,0.738,496,1.071,518,3.43,539,1.578,547,3.346,558,2.431,580,1.071,589,2.597,612,1.246,619,1.011,633,1.246,641,1.311,651,1.838,662,1.357,676,2.804,724,2.916,730,3.81,752,0.888,780,1.451,792,2.349,796,1.764,810,2.904,818,1.005,842,2.116,858,1.496,869,1.223,881,1.496,882,1.056,894,1.909,948,1.271,965,1.451,966,2.781,1010,1.234,1085,1.212,1101,1.909,1139,1.779,1202,2.539,1244,2.98,1251,1.326,1363,1.496,1465,1.684,1482,1.392,1523,1.645,1558,1.809,1564,0.949,1570,2.369,1584,2.236,1594,1.549,1698,2.133,1706,3.346,1714,1.684,1766,1.729,1815,1.997,1842,1.258,1891,1.496,1902,1.473,1983,1.392,2040,2.213,2081,1.61,2100,1.729,2274,1.549,2399,1.645,2406,1.729,2653,1.909,2872,3.443,2893,1.645,3010,3.978,3375,1.549,3688,1.549,3701,1.909,5435,1.997,6263,2.116,6621,2.116,6741,2.296,6742,2.296,6743,2.296,6744,2.296,6745,2.296,6746,2.296,6747,2.296,6748,2.296,6749,2.296,6750,6.996,6751,7.648,6752,2.296,6753,2.296,6754,2.296,6755,6.202,6756,2.296,6757,2.296,6758,2.296,6759,2.296,6760,2.296,6761,2.296,6762,2.296,6763,2.296,6764,2.296]],["t/2099",[28,3.925,39,2.97,1039,6.508,1127,5.049,1574,4.618,2532,5.882,5016,8.245]],["t/2101",[39,2.739,291,3.488,444,2.888,497,3.031,595,4.49,796,4.232,1342,6.19,1571,4.156,1588,7.604,4287,8.186,5675,10.528,5676,8.753,5677,6.661,5678,8.753]],["t/2103",[109,4.61,114,5.911,198,3.287,298,6.702,377,5.057,644,5.014,721,4.01,888,6.355,1041,5.836,1127,4.78,1353,4.78,2532,5.569]],["t/2106",[23,1.348,28,2.357,61,3.089,71,1.468,106,4.581,119,7.143,120,6.036,153,2.068,170,1.59,172,1.696,198,2.085,349,3.154,369,3.324,377,5.164,403,2.811,479,2.004,569,3.576,642,4.098,647,3.736,973,2.658,1002,3.571,1023,6.714,1044,3.294,1064,3.702,1087,3.423,1251,6.226,1313,3.356,1354,4.171,1377,3.389,1458,6.157,1768,3.799,1825,2.945,2030,4.792,2274,4.171,2447,4.337,2514,8.321,3018,4.098,3750,5.38,4484,5.141,4719,5.7,5772,4.951,5775,4.432,6765,5.7,6766,6.185,6767,7.516]],["t/2108",[28,3.651,71,1.305,81,4.562,109,5.429,114,6.961,170,2.463,369,5.15,377,4.969,569,3.44,1297,6.585,3942,7.965,6765,8.83,6768,9.581]],["t/2110",[30,2.302,31,3.638,106,4.323,109,5.185,114,5.386,120,3.903,139,3.967,166,3.283,288,2.675,369,6.554,375,2.834,377,5.276,403,2.89,444,1.958,569,3.939,587,3.311,598,5.318,603,3.205,855,2.262,902,2.047,936,4.2,970,3.087,1044,3.429,1458,6.796,1698,2.632,1825,3.065,2514,8.443,2579,5.352,3104,4.989,3942,9.118,4287,4.614,6767,7.729]],["t/2112",[170,2.552,352,6.098,377,5.148,513,5.287,517,4.726,598,5.942,603,4.942,1361,5.942,5648,8.253,6769,9.927,6770,9.927]],["t/2114",[30,2.697,48,1.964,61,4.182,71,1.027,87,3.643,96,2.639,140,4.407,167,3.912,287,4.262,369,4.054,403,2.454,479,3.203,585,4.572,596,4.708,603,4.92,647,4.273,973,3.242,1002,4.085,1165,5.405,1482,4.572,1576,4.407,1698,3.084,1918,4.459,2066,4.514,2101,8.203,3912,6.038,5005,5.534,5640,5.534,5677,5.289,6771,7.543]],["t/2116",[106,4.592,120,5.258,137,4.387,309,3.29,327,3.818,594,6.468,950,5.961,975,5.009,1087,4.8,1353,4.252,1558,4.939,1604,6.082,1626,5.48,1640,6.364,1896,7.211,2388,7.545,2639,4.753,2993,7.545,4728,5.961,5561,6.943,5630,6.721,5764,6.721,6767,7.545,6772,8.674]],["t/2118",[28,3.041,40,3.179,146,3.648,153,2.669,167,2.669,288,3.316,351,4.988,518,3.913,534,4.284,569,3.681,596,4.126,751,4.25,752,3.086,870,4.558,1131,5.043,1436,3.601,1558,5.783,1727,7.347,5005,9.282,6424,9.936]],["t/2120",[35,4.668,48,2.516,107,3.755,167,3.86,662,5.714,1558,5.642,1727,6.926,5005,7.091,6424,10.262]],["t/2122",[48,1.924,61,2.642,71,1.486,96,4.061,106,5.126,109,4.61,114,4.48,119,4.897,120,5.911,122,4.05,125,2.816,145,5.057,167,2.472,198,2.492,352,4.54,369,3.973,377,3.833,431,3.158,474,2.586,501,3.651,512,5.564,569,2.654,1002,3.054,1219,3.936,1363,6.355,1458,5.57,1992,6.988,2447,5.183,2514,7.155,2528,6.429,3942,6.144,4287,5.296,4484,6.144]],["t/2124",[31,4.715,59,4.404,71,1.136,81,3.973,92,4.365,96,2.92,106,4.482,109,4.986,120,6.394,172,2.288,284,2.714,287,4.715,288,4.383,403,3.431,431,3.566,515,3.258,549,3.064,756,4.221,1059,4.933,1202,5.353,1295,6.122,1313,4.528,1603,6.569,1959,6.466,1976,4.766,2002,6.937]],["t/2126",[71,1.682,106,3.715,109,4.133,142,2.678,166,5.538,377,6.126,444,2.659,606,4.458,769,6.265,846,5.897,1247,8.057,1295,6.414,1698,5.052,1959,6.774,1976,6.202,5866,8.057]],["t/2128",[198,3.912,431,4.167,445,5.509,1002,4.03,1087,5.396,1296,5.99,1421,4.12,1600,5.765,2532,5.569,5026,8.986,5027,8.483,6773,9.751]],["t/2131",[19,2,20,3.312,23,2.107,39,2.103,43,3.689,48,1.899,71,1.316,98,3.666,106,4.107,124,4.421,138,1.899,161,3.973,162,1.946,221,5.785,282,1.929,368,3.522,461,4.607,524,5.114,540,4.365,549,2.678,614,3.378,631,5.651,881,4.752,1041,4.365,1258,3.63,1263,4.036,1277,4.919,1327,5.651,1514,4.542,1619,3.92,1666,5.35,1797,4.832,2987,5.838,3687,5.491,3851,4.678,3923,5.651,5404,4.832,5428,5.491,6367,6.344,6681,6.721,6774,6.721,6775,7.293]],["t/2133",[19,1.715,48,1.628,98,2.372,106,4.603,153,2.092,161,2.571,168,2.328,221,3.744,368,3.021,428,4.332,461,4.257,481,3.164,549,3.678,555,5.007,561,3.427,595,2.957,603,4.987,611,2.787,622,4.076,882,2.878,942,4.012,955,2.643,989,4.302,1027,2.859,1044,4.638,1122,3.164,1248,3.842,1263,3.462,1327,4.847,1392,6.972,1564,2.585,1604,4.386,1619,5.385,1633,3.19,1829,2.999,2323,7.025,2617,4.335,2996,3.216,3000,4.076,3113,5.2,3687,7.543,3918,3.534,3925,5.007,5404,4.145,6776,5.441,6777,6.255,6778,6.255,6779,6.255,6780,5.764,6781,5.2,6782,6.255]],["t/2135",[19,2.65,20,3.312,23,1.589,25,2.234,30,2.607,71,1.316,73,2.363,106,3.099,150,4.26,162,1.468,221,6.489,331,5.838,444,2.939,461,4.607,479,2.363,549,3.981,561,3.996,595,3.448,644,3.75,653,4.12,713,4.365,752,3.737,1041,4.365,1087,4.036,1263,4.036,1478,5.114,1619,6.205,1636,3.602,1686,4.919,1734,4.608,1806,4.752,2095,4.919,3687,7.277,6261,6.062,6783,7.293,6784,7.293,6785,7.293]],["t/2137",[21,2.572,23,1.304,44,4.99,46,3.417,51,2.359,71,0.815,81,2.848,106,4.514,107,2.324,111,2.395,125,3.217,128,5.513,140,3.495,172,2.314,287,3.38,292,2.486,316,2.633,362,3.726,368,2.89,374,2.587,377,3.103,403,3.182,444,1.819,461,3.587,474,2.093,508,4.17,509,5.693,514,2.324,517,2.848,549,2.197,569,2.148,582,3.627,663,2.89,716,2.978,752,3.263,763,1.874,792,2.009,798,2.828,855,2.102,860,3.581,890,3.103,902,1.902,942,3.837,994,4.035,1044,3.186,1190,4.789,1390,3.278,1392,6.281,1412,3.13,1619,3.216,1741,3.627,2339,3.311,2611,4.789,3453,4.287,3687,4.504,4945,5.204,5404,3.964,5634,5.919,6366,5.513,6776,8.508,6781,4.973,6786,5.983,6787,5.204,6788,5.513,6789,5.983,6790,5.513]],["t/2139",[29,3.413,40,2.192,48,1.433,71,1.587,73,2.577,75,3.869,106,2.339,114,3.336,117,2.854,137,2.784,197,1.717,221,3.294,282,1.456,291,2.021,444,1.674,474,2.783,497,1.756,508,2.719,515,2.149,523,1.704,533,1.711,549,3.428,582,3.336,594,3.294,721,1.902,763,1.723,792,3.135,796,2.452,854,3.109,981,4.038,1010,2.958,1089,2.761,1154,3.859,1188,3.647,1233,5.072,1245,4.575,1392,5.52,1458,4.542,1564,3.287,1619,5.019,1826,5.072,2045,4.973,2075,4.787,2144,4.701,2185,3.586,2947,4.143,3000,6.666,3687,7.03,3918,3.109,3923,6.162,3925,6.366,5005,4.038,5357,6.611,5634,3.859,5732,5.072,5767,4.787,6261,4.575,6270,5.072,6776,6.918,6781,6.611,6790,5.072,6791,5.503,6792,8.605,6793,5.503]],["t/2141",[29,3.004,31,4.644,62,1.565,66,3.686,71,1.119,172,2.254,444,2.5,451,4.377,458,2.84,523,3.235,623,5.119,858,5.357,971,4.983,1128,4.802,1145,5.119,1564,3.397,1608,5.272,1672,5.272,1741,4.983,2086,5.119,2189,7.575,2410,4.644,3000,5.357,3918,4.644,3923,6.369,4246,6.58,5386,7.575,5404,5.447,5734,6.58,6540,6.58,6616,7.575,6781,6.833,6792,7.575]],["t/2143",[71,1.24,106,3.869,125,3.47,172,2.496,327,4.901,368,4.398,403,2.962,428,3.937,439,6.385,520,5.753,540,5.449,798,4.304,1209,4.763,1390,4.989,2235,3.405,2639,4.989,3082,5.84,6360,8.391,6787,9.686]],["t/2145",[162,2.154,5576,5.457,6794,9.861]],["t/2147",[1001,6.112,1574,4.798,2347,6.864]],["t/2150",[28,3.47,29,4.07,71,1.638,198,3.069,474,3.186,589,4.533,596,4.481,882,4.189,966,4.083,975,5.258,1127,4.464,1253,4.43,1574,4.083,2532,5.2,5016,7.289,6795,9.105,6796,9.105]],["t/2152",[25,2.987,29,3.564,71,1.746,596,3.925,882,4.486,948,5.396,975,5.632,1023,6.073,1540,6.355,2144,5.765]],["t/2155",[19,2.271,29,3.027,51,3.266,61,2.961,71,1.128,123,4.957,188,2.256,198,3.539,224,2.737,431,4.486,507,5.692,515,3.233,589,4.123,804,6.076,966,3.713,974,4.63,1044,4.41,1208,6.417,1226,7.632,1253,4.03,1295,6.076,1380,6.885,1482,6.363,1633,4.223,1998,6.417,2144,4.896,2532,4.73,5016,6.63,5019,6.885,6207,7.632]],["t/2157",[22,3.663,35,4.093,42,4.598,73,2.746,162,1.706,186,4.689,190,3.325,224,2.8,354,4.251,491,5.476,515,3.308,533,2.634,582,5.136,858,5.522,1010,4.554,1208,6.566,1603,5.277,1619,5.724,1656,5.136,1741,5.136,1998,6.566,2100,6.379,2998,6.566,6358,6.566,6452,6.783,6642,10.733]],["t/2160",[19,2.734,20,3.473,23,2.173,39,2.206,43,3.868,48,1.991,71,1.358,98,3.782,106,4.238,124,4.636,138,2.596,221,4.577,282,2.023,461,4.238,522,3.591,524,5.363,540,4.577,614,3.542,631,5.926,763,2.395,881,4.984,1127,3.749,1258,3.807,1263,4.232,1277,5.158,1327,5.926,1514,4.763,1666,5.611,1797,5.068,1962,5.758,2987,6.122,3851,4.906,5404,6.608,5428,5.758,6367,6.653,6774,7.048]],["t/2162",[19,2,35,3.522,48,1.899,61,3.876,106,3.099,116,3.87,168,2.715,221,5.785,309,4.112,401,8.47,422,1.834,434,4.771,461,5.351,561,3.996,575,4.678,611,3.25,965,6.107,1044,3.884,1193,5.404,1219,3.884,1263,4.036,1523,6.927,1564,3.014,2012,5.226,2323,5.114,4188,5.838,5404,6.405,6780,8.908]],["t/2164",[19,2.983,20,4.409,23,2.371,25,2.249,29,2.683,30,2.625,61,2.625,71,1.322,73,2.379,75,3.572,106,3.119,162,2.19,221,4.394,309,4.125,350,3.334,407,3.018,422,1.846,444,2.232,461,3.119,508,3.626,644,3.775,756,3.713,870,4.193,1018,3.91,1087,4.063,1209,3.84,1230,4.34,1263,4.063,1564,3.034,1636,3.626,1656,4.45,1686,4.951,1734,4.639,1806,4.784,2095,6.548,5010,6.103,5404,6.433,6261,6.103]],["t/2166",[19,2.378,23,2.355,111,3.473,125,4.118,138,2.258,368,4.189,377,4.498,403,3.515,444,2.638,508,4.285,611,3.865,752,3.353,798,4.101,902,2.757,1044,4.619,1190,6.943,1390,4.753,1392,6.959,1741,5.258,2339,4.8,2611,6.943,6788,7.993]],["t/2168",[29,2.896,71,1.079,114,4.803,124,4.803,198,2.671,221,6.107,309,3.87,401,8.745,434,4.926,461,3.367,533,2.463,540,6.107,965,7.132,1187,5.556,1256,4.109,1263,4.385,1304,7.013,1373,5.446,1725,6.343,5034,9.383,5349,6.587,5404,5.25,6596,6.893,6787,6.893,6797,7.923]],["t/2170",[29,3.502,42,5.199,172,2.627,375,4.217,437,3.081,496,4.468,569,3.44,756,4.846,763,3,893,4.468,965,6.054,1093,6.146,1523,6.866,5349,9.547]],["t/2172",[23,1.752,96,2.813,172,2.824,334,5.637,401,7.557,403,3.697,406,2.595,434,4.257,439,7.223,461,4.829,508,3.971,549,2.952,752,3.108,792,2.699,855,2.825,965,5.08,1010,4.321,1193,5.759,1373,5.525,1478,5.637,1546,7.381,1741,4.873,2075,6.993,5034,8.563,5408,6.436,6798,8.039]],["t/2174",[162,2.154,5576,5.457,6799,9.861]],["t/2176",[1001,6.112,1574,4.798,2347,6.864]],["t/2179",[5701,9.493]],["t/2181",[5702,9.493]],["t/2183",[497,3.482]],["t/2185",[171,4.927,417,4.65,497,4.128,818,5.159]],["t/2187",[291,4.007]],["t/2189",[1574,4.893]],["t/2191",[39,3.086,497,3.415,870,6.112]],["t/2193",[105,3.564,497,3.415,1712,5.806]],["t/2196",[18,4.15,19,2.734,20,3.473,23,2.173,25,2.343,61,2.734,71,1.041,73,2.478,75,3.721,106,4.238,138,2.596,146,4.558,162,1.539,188,2.083,309,2.9,414,3.408,439,5.363,533,2.377,549,2.808,621,3.408,626,4.636,647,3.307,975,4.417,1018,5.311,1044,4.073,1193,4.276,1564,3.161,1639,3.231,1808,4.763,2001,5.758,2935,6.653,2966,5.758,3918,4.321,5674,7.048,6363,5.611,6405,7.048,6800,7.648,6801,7.648]],["t/2198",[19,1.923,23,2.052,25,2.148,29,2.564,30,3.367,39,2.023,61,2.507,162,2.288,188,1.91,282,1.855,292,3.913,309,4.31,402,4.006,414,4.196,515,2.738,565,3.464,580,3.27,596,2.823,621,4.738,647,3.032,721,2.423,752,2.711,756,3.547,990,4.308,1018,5.015,1100,6.101,1129,5.865,1209,4.926,1217,4.82,1223,4.308,1228,8.192,1477,6.101,1564,2.899,4287,5.026,5404,7.045,5648,5.83,5670,5.83,6596,6.101,6802,7.013]],["t/2200",[28,3.619,29,3.472,42,5.154,172,2.604,188,2.587,497,3.031,527,4.232,580,5.327,647,4.107,653,5.367,752,3.672,1089,4.766,2023,5.758,5379,6.807,6803,9.498]],["t/2202",[23,1.538,28,2.69,29,2.58,59,3.725,71,1.452,73,3.065,162,1.421,172,1.935,221,6.384,282,1.867,350,3.205,434,2.917,461,4.842,492,4.077,497,3.018,580,5.54,635,5.65,652,4.528,670,5.179,733,8.265,770,5.976,931,6.14,946,4.528,1111,4.6,1248,5.81,1256,3.66,1334,4.336,1558,3.226,1574,3.165,2025,6.14,2110,3.906,2582,5.179,2987,5.65,3930,6.778,4975,6.14,5734,5.65,6451,6.505,6804,7.058]],["t/2204",[2347,7]],["t/2206",[25,2.205,40,2.867,71,1.305,89,3.403,145,3.732,172,2.627,221,5.735,282,1.904,403,2.341,406,2.323,444,2.189,459,4.255,461,3.058,523,2.967,565,3.555,580,5.355,621,4.27,733,5.577,770,4.547,902,2.288,957,6.349,1081,4.111,1140,4.547,1193,4.024,1256,3.732,1278,5.577,1558,3.29,1571,3.149,1631,4.024,1639,3.041,1834,4.854,2095,4.854,2337,6.261,2582,7.03,3930,8.229,6441,6.633,6805,9.582,6806,7.197,6807,7.197]],["t/2208",[162,2.426,5576,6.145,6794,9.581,6799,9.581]],["t/2210",[2347,7]],["t/2212",[19,2.172,20,3.598,21,3.406,22,3.426,25,2.427,43,4.008,66,3.553,70,4.109,89,3.746,95,4.341,111,3.173,162,2.399,188,3.075,284,2.578,316,3.488,328,2.65,402,4.525,433,2.568,437,2.548,1002,3.275,1012,4.008,1166,5.813,1308,4.477,1450,4.867,1540,5.164,1558,3.622,1633,4.04,1643,4.259,1733,6.587,1831,4.684,2622,4.867,2691,4.629,5735,6.343,6808,7.923]],["t/2214",[18,3.665,19,1.852,35,3.263,62,2.299,96,2.364,142,2.069,162,2.43,170,1.736,171,2.822,173,4.268,188,2.841,218,5.983,250,3.503,284,2.987,286,5.708,288,2.807,374,2.92,402,3.858,414,4.091,577,3.858,597,4.737,638,2.147,1013,4.268,1174,4.556,1198,3.816,1709,3.473,2235,2.526,2274,6.193,2639,3.701,2862,3.858,3043,5.086,4535,5.086,5576,5.968,5604,5.876,5606,5.407,5636,5.876,5661,5.876,5662,5.876]],["t/2216",[18,3.88,19,1.96,32,3.808,35,3.454,62,2.337,162,2.471,171,2.988,188,3.12,206,4.04,221,4.28,284,2.326,288,2.971,402,4.084,414,5.104,420,5.54,421,3.677,444,2.174,461,3.038,638,2.273,670,5.246,824,3.918,1581,5.54,1724,7.089,2235,2.674,2274,4.823,5577,4.914,5601,6.22,5635,6.22,5637,6.22,5638,6.22,5658,6.22,5666,6.22,5667,6.589]]],"invertedIndex":[["",{"_index":62,"t":{"9":{"position":[[190,1]]},"18":{"position":[[312,4]]},"23":{"position":[[410,1]]},"25":{"position":[[627,1],[764,1]]},"27":{"position":[[155,1],[255,1],[330,1],[418,1],[490,1],[886,1],[971,1],[1150,1],[1335,1],[1422,1],[1607,1],[1688,1],[1798,1]]},"30":{"position":[[208,1]]},"32":{"position":[[138,1],[219,1],[294,1]]},"36":{"position":[[1056,1],[1078,1],[1103,1],[1125,1],[1148,1],[1168,1],[1191,1],[1354,1],[1478,2],[1517,1]]},"64":{"position":[[139,1]]},"66":{"position":[[9,1],[89,1]]},"70":{"position":[[168,1]]},"72":{"position":[[68,3]]},"81":{"position":[[190,1]]},"92":{"position":[[96,1],[98,1],[218,1],[220,1],[805,1],[861,1]]},"100":{"position":[[723,1],[747,1],[945,1],[968,1],[979,1],[981,1],[1009,2],[1104,1],[1170,4],[1175,2],[1241,1],[1278,1],[1303,2],[1429,2],[1432,1],[1448,1],[1485,2],[1528,1],[1549,1],[1599,2],[1644,1],[1700,2],[1749,1],[1786,1],[1833,2],[1888,1],[1947,1],[1965,3],[1969,2],[2024,1],[2102,2],[2158,1],[2217,3]]},"104":{"position":[[167,1],[179,1]]},"129":{"position":[[45,1],[70,1]]},"140":{"position":[[53,1]]},"142":{"position":[[280,1],[380,1],[482,1],[484,2],[487,2],[490,1],[526,2],[728,1]]},"150":{"position":[[473,3],[513,3],[535,3]]},"152":{"position":[[364,2],[383,2],[506,3],[537,3],[560,3]]},"154":{"position":[[197,3],[212,3],[230,3],[247,3],[263,3],[283,3],[293,3],[313,3],[330,3],[357,1],[371,3],[401,3],[431,3],[564,3],[579,3],[597,3],[614,3],[906,3]]},"158":{"position":[[431,2],[448,3],[474,1],[495,3]]},"173":{"position":[[579,1]]},"175":{"position":[[51,1],[88,1],[316,1]]},"177":{"position":[[130,1],[284,1],[743,1],[782,1],[1340,1],[1640,1]]},"181":{"position":[[58,1]]},"183":{"position":[[63,1],[358,1],[484,1]]},"185":{"position":[[239,1],[415,1],[583,1],[1102,3],[1686,1]]},"193":{"position":[[12,1],[14,1],[38,1],[40,1],[180,1],[182,1],[207,1],[209,1],[239,1],[241,1],[339,1],[341,1],[422,1],[424,1],[445,1],[447,1]]},"195":{"position":[[13,1],[15,1],[53,1],[55,1],[121,1],[123,1],[170,1],[172,1],[220,1],[222,1],[294,1],[296,1],[333,1],[335,1],[358,1],[360,1],[383,1],[385,1],[425,1],[427,1],[496,1],[498,1],[574,1],[576,1],[732,1],[734,1],[765,1],[767,1]]},"197":{"position":[[12,1],[14,1],[98,1],[100,1],[143,1],[145,1]]},"200":{"position":[[130,1]]},"204":{"position":[[12,1],[14,1],[117,1],[119,1],[209,1],[211,1],[264,1],[266,1],[342,1],[344,1],[415,1],[417,1],[442,1],[444,1],[497,1],[499,1],[645,1],[647,1]]},"206":{"position":[[376,1]]},"210":{"position":[[44,1]]},"212":{"position":[[12,1],[14,1],[395,1],[397,1],[485,1],[487,1],[532,1],[534,1],[576,1],[618,1],[620,1],[655,1],[657,1],[716,1],[718,1],[802,1],[804,1],[844,1],[846,1],[947,1],[949,1],[984,1],[986,1],[1007,1],[1009,1]]},"214":{"position":[[89,1]]},"216":{"position":[[12,1],[14,1],[53,1],[55,1],[95,1],[97,1],[149,1],[151,1],[185,1],[187,1],[287,1],[289,1],[357,1],[359,1],[388,1],[390,1],[404,1]]},"227":{"position":[[12,1],[14,1],[46,1],[48,1],[143,1],[145,1],[190,1],[192,1],[275,1],[277,1],[342,1],[344,1]]},"229":{"position":[[12,1],[14,1],[46,1],[48,1],[69,1],[71,1],[142,1],[144,1],[285,1],[294,1],[308,1],[310,1],[381,1],[383,1],[404,1],[406,1],[444,1],[465,1],[467,1],[489,1]]},"231":{"position":[[12,1],[14,1],[30,1],[32,1],[98,1],[100,1],[140,1],[142,1],[198,1],[200,1],[229,1],[243,1],[245,1],[281,1],[283,1],[311,1],[313,1],[333,1],[335,1],[352,1],[354,1]]},"233":{"position":[[12,1],[14,1],[72,1],[74,1],[102,1],[104,1],[161,1],[163,1],[216,1],[218,1],[251,1],[253,1],[283,1],[285,1],[323,1],[325,1],[345,1],[357,1],[359,1],[378,1],[380,1],[401,1],[403,1],[415,1],[417,1],[475,1],[477,1],[531,1],[533,1]]},"235":{"position":[[12,1],[14,1],[85,1],[87,1],[123,1],[125,1],[155,1],[157,1],[192,1],[194,1],[248,1],[250,1],[274,1],[276,1]]},"251":{"position":[[1671,2]]},"265":{"position":[[454,1],[552,1],[640,3]]},"269":{"position":[[57,1]]},"282":{"position":[[34,1],[226,1]]},"288":{"position":[[336,2],[512,3],[516,1]]},"313":{"position":[[378,1],[415,1],[417,3],[439,1],[489,3],[503,3],[531,1],[564,3],[578,3]]},"315":{"position":[[235,6],[272,3]]},"319":{"position":[[372,1],[2606,1],[3567,3],[3595,4],[6487,1],[6790,1],[7768,1],[7869,2],[7896,3],[7900,1]]},"323":{"position":[[839,4]]},"335":{"position":[[416,3],[431,3],[445,1],[447,3],[464,1],[466,3],[488,1],[490,3],[503,1],[505,3],[519,1],[521,1],[523,3]]},"341":{"position":[[790,1],[792,1],[852,1],[867,1]]},"343":{"position":[[387,1],[404,3]]},"352":{"position":[[521,1],[563,1],[734,1],[785,1],[906,2],[985,2],[1281,1],[1523,1],[1620,3],[1806,3]]},"358":{"position":[[247,1],[3022,1],[3039,1],[3059,1]]},"386":{"position":[[311,2]]},"412":{"position":[[38,3]]},"418":{"position":[[253,2],[316,2],[497,1],[530,1],[744,1]]},"420":{"position":[[749,2],[909,2],[1148,2],[1196,2],[1300,2],[1760,2],[1955,2],[2057,2],[2201,2],[2485,2],[2588,2],[3425,1],[3427,1],[3526,1],[3535,1],[4313,2],[4322,2]]},"422":{"position":[[638,1],[1310,4],[1994,4]]},"440":{"position":[[0,1],[68,1],[132,1],[210,1],[288,1],[369,1],[429,1]]},"449":{"position":[[489,1]]},"451":{"position":[[962,1],[977,1],[994,1]]},"457":{"position":[[147,2],[4678,2],[4747,2],[5723,2],[5792,2]]},"459":{"position":[[179,3]]},"462":{"position":[[1983,2]]},"468":{"position":[[28,2]]},"470":{"position":[[3097,3]]},"472":{"position":[[3400,3]]},"474":{"position":[[872,2],[1392,1],[1491,1],[1516,1],[1527,1],[2013,2],[2103,1],[2260,2],[2328,2],[2331,1],[2333,4],[2338,1],[2349,2],[2397,1],[2403,1],[2416,1],[2427,1],[2466,1],[2521,2],[2589,2],[2592,1],[2594,4],[2599,1],[2610,2],[2640,1],[2646,1],[2659,1],[2670,1],[2713,1],[2768,2],[2834,2],[2837,1],[2839,4],[2844,1],[2855,2],[2903,1],[2909,1],[2922,1],[2933,1],[2972,1],[3027,2],[3093,2],[3096,1],[3098,4],[3103,1],[3114,2],[3144,1],[3150,1],[3163,1],[3174,1],[3217,1]]},"484":{"position":[[271,1]]},"486":{"position":[[70,1],[72,1],[87,3],[105,3],[188,1],[316,1],[574,1],[833,1],[1591,1],[1769,1],[1843,1],[1878,1],[2027,1],[2039,1]]},"489":{"position":[[93,1],[183,1],[707,1]]},"491":{"position":[[425,1],[643,1],[1066,1],[1068,1],[1140,1],[1389,1],[1838,1],[2080,1]]},"498":{"position":[[5,2]]},"504":{"position":[[565,1],[949,1]]},"561":{"position":[[454,1]]},"571":{"position":[[58,1]]},"585":{"position":[[0,1],[486,1]]},"589":{"position":[[31,1]]},"610":{"position":[[341,1],[417,2],[428,85],[514,1],[571,1],[573,1],[605,1],[607,1],[666,1],[668,1],[712,1],[714,1],[751,1],[753,96],[926,1],[1031,1],[1126,1],[1133,1],[1182,1],[1189,1],[1238,1],[1245,1],[1295,1],[1302,1],[1332,3]]},"612":{"position":[[343,1]]},"622":{"position":[[267,1],[1139,1],[1186,1],[1265,1]]},"626":{"position":[[662,2]]},"632":{"position":[[832,2]]},"634":{"position":[[790,2]]},"646":{"position":[[41,1],[95,1],[102,1],[191,1],[198,1]]},"657":{"position":[[235,1],[272,1],[276,1],[315,1],[319,1],[352,1],[356,1],[391,3],[414,3],[418,1],[519,1]]},"659":{"position":[[398,3],[429,3]]},"661":{"position":[[161,3],[195,3],[208,3],[242,3],[285,3],[321,3],[369,3],[404,3]]},"665":{"position":[[836,1],[906,1],[968,2],[987,2],[1000,2],[1020,2],[1030,2],[1080,2],[1092,2],[1144,2],[1158,2],[1212,2],[1224,2],[1276,2],[1286,2],[1336,2],[1733,2],[1840,2],[1951,2],[2062,2],[2169,2],[2493,1]]},"667":{"position":[[267,1],[283,1],[309,1],[332,1],[342,1],[356,1],[448,1],[465,1],[506,1],[523,1],[549,1],[563,1],[573,1],[616,1]]},"674":{"position":[[175,2],[197,3],[227,1],[253,1],[286,3]]},"683":{"position":[[59,2],[81,3],[111,1],[137,3]]},"685":{"position":[[57,2],[78,3],[107,1],[132,3]]},"689":{"position":[[286,20],[439,20],[592,20]]},"691":{"position":[[664,3],[682,3]]},"714":{"position":[[1173,5]]},"718":{"position":[[71,1],[179,1],[276,1],[315,1],[336,1],[338,1],[371,1]]},"724":{"position":[[273,2],[1452,2]]},"727":{"position":[[96,58],[155,1],[192,58],[251,1],[286,58],[345,1]]},"729":{"position":[[19,58],[78,1],[86,1],[154,1],[214,1],[245,1],[247,1],[309,1],[351,1],[353,1],[412,1],[470,1],[525,1],[591,1],[653,1],[716,1],[766,1],[827,1],[853,1],[914,1],[973,1],[1031,1],[1064,1],[1122,1],[1186,1],[1244,1],[1307,1],[1355,1],[1415,1],[1456,1],[1527,1],[1591,1],[1656,1],[1658,1],[1670,1],[1672,1],[1684,1],[1686,1],[1701,1],[1703,1],[1715,1],[1717,1],[1729,1],[1731,1],[1743,1],[1745,1],[1762,1],[1764,1],[1817,58],[1876,1],[1886,1],[1969,58],[2028,1],[2063,1],[2142,58],[2201,1],[2237,1],[2303,1],[2331,58],[2390,1],[2400,1],[2469,1],[2600,58],[2659,1],[2691,1],[2708,1],[2737,1],[2754,1],[2786,1],[2809,1],[2839,1],[2868,1],[2889,1],[2909,58],[2968,1],[2975,1],[3044,1],[3063,1],[3082,1],[3103,1],[3124,1],[3184,1],[3195,1],[3208,1],[3221,1],[3234,1]]},"732":{"position":[[412,1]]},"735":{"position":[[420,1],[1220,1]]},"739":{"position":[[616,3],[707,5],[746,5],[785,5],[797,4],[809,3]]},"741":{"position":[[0,58],[59,1],[176,3],[198,3]]},"744":{"position":[[80,2],[101,2],[133,2],[154,2],[171,2],[192,2],[215,2],[232,2],[252,2],[273,2],[302,2],[337,2],[368,2],[385,2],[406,2],[431,2],[461,2],[486,2],[503,2],[528,2],[545,2]]},"746":{"position":[[349,3],[397,3],[441,3],[496,3],[580,3],[757,1],[924,2],[941,1],[964,1],[973,2],[976,2],[1003,1],[1016,1],[1020,1],[1025,1],[1045,1],[1064,1],[1075,2],[1123,3],[1133,1],[1149,1],[1181,3],[1199,3],[1209,1],[1225,1],[1257,3],[1275,3],[1303,3],[1337,3],[1374,5],[1386,1],[1408,5],[1431,5],[1443,4],[1455,3],[1515,3],[1552,5],[1564,1],[1586,1],[1618,5],[1641,5],[1653,4],[1665,3],[1680,2],[1699,2],[1726,2],[1739,2],[1804,2],[1827,2],[3466,1],[3468,1],[3619,2],[4145,1],[4214,1],[4216,1],[4354,1],[4356,2],[4374,1],[4376,1],[4459,2],[4462,1],[4551,1],[4553,1],[4555,1],[4782,1],[4851,1],[4853,1],[4991,1],[4993,2],[5011,1],[5013,1],[5096,2],[5099,1],[5188,1],[5190,1],[5192,1]]},"749":{"position":[[416,1],[506,1],[579,1],[761,1],[926,1],[989,1],[1025,1],[1096,1],[1187,1],[1246,1],[1292,3],[1322,1],[1418,1],[1476,1],[1555,1],[1704,1],[2353,1],[3182,1],[3253,1],[3323,1],[3325,1],[3536,1],[3750,1],[3939,1],[4750,1],[6328,1],[6357,1],[6371,1],[6383,1],[6421,1],[6438,1],[6452,1],[6487,1],[6489,1],[6497,1],[6505,1],[6507,1],[6521,1],[6556,1],[6558,1],[6572,1],[6594,1],[6596,1],[6608,1],[6615,1],[6617,1],[6622,1],[6657,1],[6659,1],[6666,1],[6683,1],[6685,1],[6695,1],[6697,2],[6700,1],[6702,1],[6716,1],[6751,1],[6842,1],[6871,1],[6882,1],[6896,1],[6912,1]]},"754":{"position":[[88,1]]},"758":{"position":[[0,2]]},"763":{"position":[[1144,1],[1529,1],[1711,1],[1775,1],[2842,2],[3021,2]]},"767":{"position":[[715,1],[745,1],[769,1],[790,1]]},"769":{"position":[[102,4]]},"771":{"position":[[102,4]]},"773":{"position":[[462,8]]},"775":{"position":[[0,2]]},"778":{"position":[[757,1],[785,1],[815,1],[829,1],[857,1],[881,1],[910,1],[944,1],[979,1]]},"780":{"position":[[140,1]]},"787":{"position":[[2178,4]]},"802":{"position":[[897,1],[1284,1],[1784,1],[1833,1],[1887,1],[1919,1],[1945,1],[2003,1],[2025,1],[2050,1],[2084,1],[2107,1],[2137,1],[2249,1],[2524,1],[2573,1],[2627,1],[2659,1],[2685,1],[2743,1],[2765,1],[2790,1],[2824,1],[2847,1],[2877,1],[2989,1],[3032,1],[3046,1]]},"812":{"position":[[0,1],[170,3],[292,1],[370,1],[381,1]]},"827":{"position":[[0,2]]},"836":{"position":[[449,1]]},"843":{"position":[[352,1]]},"850":{"position":[[795,60],[1547,1],[1555,1],[1595,5]]},"856":{"position":[[983,1]]},"860":{"position":[[2198,1]]},"863":{"position":[[113,1]]},"869":{"position":[[374,5]]},"889":{"position":[[37,1]]},"900":{"position":[[214,1],[284,1],[291,1]]},"933":{"position":[[0,1],[34,1],[41,1],[115,1],[182,1],[199,1],[201,1],[208,1],[222,1],[224,1],[291,1],[308,1],[310,1],[317,1],[325,1],[327,1],[338,1],[346,1],[348,1],[358,1],[366,1],[368,1],[386,1],[394,1],[396,1],[409,1],[417,1],[419,1],[434,1],[444,1],[446,1],[455,1],[463,1],[465,1],[478,1],[486,1],[488,1],[499,1],[507,1],[509,1],[518,1],[526,1],[528,1],[540,1],[548,1],[550,1],[566,1],[574,1],[576,1],[583,1],[591,1],[593,1],[602,1],[610,1],[612,1],[622,1],[630,1],[632,1],[642,1],[650,1],[652,1],[659,1],[667,1],[669,1],[679,1],[687,1],[689,1],[698,1],[706,1],[708,1],[716,1],[724,1],[726,3]]},"941":{"position":[[72,1],[82,1],[113,1],[134,1],[170,1],[186,1],[213,1],[223,1],[273,1],[299,1],[340,1],[388,1],[415,1],[425,1],[467,1],[483,1],[655,1],[663,1],[683,1],[710,1],[720,1],[727,1],[746,1]]},"943":{"position":[[0,1],[37,1]]},"945":{"position":[[0,1],[23,1],[51,1],[76,1]]},"950":{"position":[[0,1],[8,1],[19,1],[28,1],[40,1],[46,1],[52,1]]},"952":{"position":[[0,1],[23,1]]},"954":{"position":[[0,1]]},"956":{"position":[[49,1]]},"958":{"position":[[49,1],[80,1],[106,1]]},"960":{"position":[[69,1],[367,1],[433,1],[653,1],[762,1]]},"963":{"position":[[0,1]]},"965":{"position":[[0,1],[20,1]]},"971":{"position":[[0,1],[39,3],[93,1],[117,1],[148,1],[182,1]]},"973":{"position":[[0,1],[24,1],[55,1]]},"975":{"position":[[41,1],[67,1],[93,1]]},"979":{"position":[[75,1],[90,1]]},"981":{"position":[[0,1]]},"983":{"position":[[0,1],[23,1]]},"985":{"position":[[43,1],[72,1],[97,1],[139,2],[145,1]]},"987":{"position":[[0,1]]},"991":{"position":[[0,1]]},"993":{"position":[[0,1]]},"995":{"position":[[0,1]]},"997":{"position":[[0,1]]},"999":{"position":[[69,1],[135,1],[144,1],[190,1]]},"1001":{"position":[[74,1]]},"1003":{"position":[[0,1]]},"1005":{"position":[[0,1],[72,1],[144,1]]},"1007":{"position":[[0,1]]},"1010":{"position":[[565,1],[609,1],[629,1],[691,1],[760,1],[787,1],[841,1],[902,1],[943,1],[992,1],[1028,1],[1068,1],[1106,1],[1147,1],[1174,1],[1246,1],[1297,1],[1324,1],[1367,1],[1425,1],[1460,1],[1524,1],[1578,1],[1640,1],[1671,1],[1726,1],[1796,1],[1845,1],[1896,1],[1926,1],[1977,1],[2029,1],[2059,1],[2142,1],[2170,1],[2187,1],[2267,1],[2338,1],[2486,1],[2514,1],[2637,1],[2678,1],[3039,1],[3067,1],[3211,1],[3249,1],[3378,1],[3402,1]]},"1014":{"position":[[376,1],[397,1],[423,1],[448,1],[475,1],[497,1],[712,1],[724,1],[776,1],[906,1],[939,1],[1171,1],[1183,1],[1199,1],[1431,1],[1443,1],[1459,1],[1722,1],[1734,1],[1777,1],[1846,1],[2060,1],[2072,1],[2088,1]]},"1016":{"position":[[287,1],[353,1],[414,1],[515,1],[639,1],[705,1],[879,1],[933,1],[1003,1],[1026,1],[1050,1],[1073,1],[1101,1],[1128,1],[1403,1],[1466,1],[1574,1],[1607,1],[1654,1],[1713,1]]},"1022":{"position":[[27,1],[118,1],[193,1],[203,1],[210,2]]},"1024":{"position":[[89,1]]},"1026":{"position":[[33,1],[123,3],[161,1],[213,1],[302,1]]},"1028":{"position":[[19,1]]},"1032":{"position":[[275,1],[341,1],[406,1]]},"1034":{"position":[[0,1],[107,75],[309,41],[746,1],[767,1],[803,1],[808,1],[820,1],[876,1],[887,1],[895,1],[905,1],[935,1],[953,1],[955,1],[960,1],[969,1],[976,1],[987,1],[995,1],[1005,1],[1015,1],[1026,1],[1028,1],[1033,1],[1045,1],[1101,1],[1112,1],[1120,1],[1130,1],[1160,1],[1178,1],[1180,1],[1185,1],[1197,1],[1217,1],[1222,1],[1227,1],[1232,1],[1262,1],[1280,1],[1282,1],[1287,1],[1299,1],[1355,1],[1366,1],[1374,1],[1384,1],[1414,1],[1432,1],[1453,1],[1464,1],[1507,1],[1509,1],[1517,1],[1525,1],[1527,1],[1538,1],[1581,1],[1583,1],[1588,1],[1593,1],[1595,1],[1604,1],[1647,1],[1649,1],[1658,1],[1670,1],[1672,1],[1679,1],[1699,1],[1701,1],[1712,1],[1745,1],[1747,1],[1757,1],[1787,1],[1789,1],[1797,1],[1827,1],[1829,1],[1840,1],[1858,1],[1860,1],[1868,1],[1899,1],[1901,1],[1912,1],[1955,1],[1973,1],[1979,1],[1991,1],[2001,1],[2035,1],[2112,1],[2123,1],[2153,1],[2171,1],[2173,1],[2178,1],[2187,1],[2197,1],[2206,1],[2213,1],[2224,1],[2234,1],[2245,1],[2247,1],[2253,1],[2265,1],[2275,1],[2309,1],[2386,1],[2397,1],[2427,1],[2445,1],[2447,1],[2453,1],[2465,1],[2469,1],[2476,1],[2485,1],[2502,1],[2507,1],[2537,1],[2555,1],[2557,1],[2563,1],[2575,1],[2579,1],[2586,1],[2595,1],[2638,1],[2643,1],[2673,1],[2691,1],[2693,1],[2699,1],[2711,1],[2715,1],[2730,1],[2739,1],[2761,1],[2766,1],[2796,1],[2814,1],[2816,1],[2822,1],[2834,1],[2838,1],[2853,1],[2862,1],[2888,1],[2893,1],[2923,1],[2941,1],[2943,1],[2949,1],[2961,1],[2965,1],[2976,1],[2985,1],[3029,1],[3034,1],[3064,1],[3082,1],[3084,1],[3090,1],[3102,1],[3106,1],[3117,1],[3126,1],[3168,1],[3173,1],[3203,1],[3221,1],[3223,1],[3229,1],[3241,1],[3245,1],[3252,1],[3261,1],[3325,1],[3330,1],[3360,1],[3378,1],[3380,1],[3386,1],[3398,1],[3402,1],[3413,1],[3422,1],[3461,1],[3466,1],[3496,1],[3514,1],[3516,1],[3522,1],[3534,1],[3538,1],[3549,1],[3558,1],[3600,1],[3605,1],[3635,1],[3653,1],[3655,1],[3661,1],[3673,1],[3677,1],[3688,1],[3697,1],[3726,1],[3731,1],[3761,1],[3779,1],[3781,1],[3787,1],[3799,1],[3803,1],[3810,1],[3819,1],[3861,1],[3866,1],[3896,1],[3914,1],[3916,1],[3922,1],[3934,1],[3938,1],[3945,1],[3954,1],[3996,1],[4001,1],[4031,1],[4049,1],[4051,1],[4057,1],[4069,1],[4073,1],[4080,1],[4089,1],[4131,1],[4136,1],[4166,1],[4184,1],[4186,1],[4192,1],[4204,1],[4208,1],[4215,1],[4224,1],[4265,1],[4270,1],[4300,1],[4318,1],[4320,1],[4326,1],[4338,1],[4342,1],[4353,1],[4362,1],[4408,1],[4413,1],[4443,1],[4461,1],[4463,1],[4469,1],[4481,1],[4485,1],[4492,1],[4512,1],[4521,1],[4561,1],[4566,1],[4596,1],[4614,1],[4616,1],[4622,1],[4634,1],[4638,1],[4645,1],[4665,1],[4674,1],[4722,1],[4727,1],[4757,1],[4775,1],[4777,1],[4783,1],[4795,1],[4799,1],[4806,1],[4826,1],[4835,1],[4872,1],[4877,1],[4907,1],[4925,1],[4927,1],[4933,1],[4945,1],[4949,1],[4965,1],[4974,1],[4990,1],[4995,1],[5025,1],[5043,1],[5045,1],[5051,1],[5063,1],[5067,1],[5074,1],[5083,1],[5119,1],[5124,1],[5154,1],[5172,1],[5174,1],[5180,1],[5192,1],[5196,1],[5212,1],[5221,1],[5237,1],[5242,1],[5272,1],[5290,1],[5292,1],[5298,1],[5310,1],[5320,1],[5354,1],[5431,1],[5442,1],[5472,1],[5490,1],[5512,1],[5523,1],[5566,1],[5568,1],[5576,1],[5584,1],[5586,1],[5597,1],[5640,1],[5642,1],[5647,1],[5653,1],[5655,1],[5662,1],[5701,1],[5703,1],[5712,1],[5755,1],[5757,1],[5764,1],[5773,1],[5790,1],[5792,1],[5801,1],[5808,1],[5810,1],[5819,1],[5831,1],[5833,1],[5840,1],[5881,1],[5883,1],[5892,1],[5896,1],[5898,1],[5908,1],[5938,1],[5940,1],[5948,1],[5978,1],[5980,1],[5991,1],[6009,1],[6011,1],[6018,1],[6031,1],[6033,1],[6043,1],[6051,1],[6053,1],[6064,1],[6107,1],[6129,1],[6134,1],[6146,1],[6178,1],[6187,1],[6205,1],[6257,1],[6265,1],[6275,1],[6283,1],[6313,1],[6331,1],[6333,1],[6338,1],[6347,1],[6360,1],[6367,1],[6385,1],[6392,1],[6400,1],[6410,1],[6418,1],[6428,1],[6439,1],[6441,1],[6446,1],[6458,1],[6490,1],[6499,1],[6517,1],[6569,1],[6577,1],[6587,1],[6595,1],[6625,1],[6643,1],[6645,1],[6650,1],[6662,1],[6694,1],[6703,1],[6713,1],[6741,1],[6746,1],[6751,1],[6755,1],[6785,1],[6803,1],[6805,1],[6810,1],[6822,1],[6854,1],[6863,1],[6881,1],[6933,1],[6941,1],[6951,1],[6959,1],[6989,1],[7007,1],[7032,1],[7084,1],[7092,1],[7109,1],[7126,1],[7134,1],[7144,1],[7152,1],[7164,1],[7173,1],[7183,1],[7185,1],[7197,1],[7205,1],[7222,1],[7237,1],[7245,1],[7255,1],[7263,1],[7275,1],[7284,1],[7294,1],[7296,1],[7348,1],[7356,1],[7373,1],[7390,1],[7398,1],[7408,1],[7416,1],[7428,1],[7437,1],[7447,1],[7449,1],[7477,1],[7481,1],[7498,1],[7515,1],[7520,1],[7526,1],[7531,1],[7535,1],[7539,1],[7543,1],[7545,1],[7597,1],[7605,1],[7622,1],[7639,1],[7647,1],[7657,1],[7665,1],[7677,1],[7686,1],[7696,1],[7714,1],[7720,1],[7756,1],[7767,1],[7777,1],[7786,1],[7791,1],[7801,1],[7815,1],[7845,1],[7847,1],[7852,1],[7859,1],[7870,1],[7880,1],[7889,1],[7894,1],[7904,1],[7918,1],[7928,1],[7930,1],[7936,1],[7972,1],[7983,1],[7993,1],[8002,1],[8007,1],[8017,1],[8031,1],[8061,1],[8063,1],[8069,1],[8104,1],[8109,1],[8113,1],[8117,1],[8122,1],[8126,1],[8130,1],[8160,1],[8162,1],[8168,1],[8204,1],[8209,1],[8213,1],[8217,1],[8222,1],[8226,1],[8230,1],[8260,1],[8262,1],[8268,1],[8303,1],[8308,1],[8312,1],[8316,1],[8321,1],[8325,1],[8329,1],[8359,1],[8361,1],[8367,1],[8402,1],[8407,1],[8411,1],[8415,1],[8420,1],[8424,1],[8428,1],[8458,1],[8460,1],[8466,1],[8498,1],[8503,1],[8507,1],[8511,1],[8515,1],[8519,1],[8523,1],[8553,1],[8555,1],[8561,1],[8597,1],[8608,1],[8618,1],[8627,1],[8632,1],[8642,1],[8656,1],[8686,1],[8708,1],[8722,1],[8765,1],[8767,1],[8775,1],[8783,1],[8785,1],[8799,1],[8842,1],[8844,1],[8849,1],[8855,1],[8857,1],[8866,1],[8909,1],[8911,1],[8918,1],[8953,1],[8955,1],[8965,1],[8969,1],[8971,1],[8980,1],[8984,1],[8986,1],[8991,1],[8996,1],[8998,1],[9008,1],[9012,1],[9014,1],[9028,1],[9032,1],[9034,1],[9044,1],[9074,1],[9076,1],[9090,1],[9133,1]]},"1036":{"position":[[0,1],[45,5],[51,4],[90,4],[134,4],[171,4],[190,4],[202,4],[219,3],[252,3],[284,3],[288,2],[298,2],[314,2],[317,1],[382,1]]},"1038":{"position":[[36,1],[59,3],[70,1],[225,1],[317,1],[332,3],[343,1],[757,1],[882,1],[974,1],[1391,3],[1402,1],[1440,1],[1478,3],[1767,2],[1941,1],[2090,3],[2101,1],[2139,1],[2174,1],[2206,3],[2495,2],[2634,3]]},"1041":{"position":[[67,1],[90,1],[129,1],[155,1],[166,1],[195,1],[243,1],[245,1],[254,1],[259,1],[266,1],[275,1],[288,1],[300,1],[302,1],[325,1],[364,1],[390,1],[401,1],[430,1],[478,1],[480,1],[503,1],[542,1],[566,1],[575,1],[604,1],[626,2],[652,1],[654,1],[677,1],[716,1],[742,1],[751,1],[780,1],[803,3],[807,1],[809,1],[832,1],[871,1],[897,1],[908,1],[937,1],[985,1]]},"1047":{"position":[[0,1],[49,1],[68,1],[104,1],[115,1],[125,1],[133,1],[162,1],[164,1],[173,1],[180,1],[187,1],[196,1],[204,1],[217,1],[219,1],[238,1],[274,1],[285,1],[295,1],[303,1],[332,1],[334,1],[353,1],[370,1],[381,1],[391,1],[396,1],[425,1],[427,1],[446,1],[463,1],[474,1],[484,1],[489,1],[518,1],[520,1],[539,1],[556,1],[567,1],[577,1],[582,1],[611,1],[613,1],[629,1],[652,1],[659,1],[669,1],[676,1],[705,1],[707,1],[723,1],[746,1],[753,1],[763,1],[770,1],[799,1],[801,1],[817,1],[840,1],[847,1],[857,1],[864,1],[893,1],[895,1],[914,1],[950,1],[961,1],[971,1],[979,1],[1008,1],[1010,1],[1163,1],[1316,1],[1533,1],[1552,1],[1588,1],[1599,1],[1609,1],[1617,1],[1646,1],[1648,1],[1657,1],[1664,1],[1671,1],[1680,1],[1688,1],[1701,1],[1703,1],[1722,1],[1758,1],[1769,1],[1779,1],[1787,1],[1816,1],[1818,1],[1837,1],[1854,1],[1865,1],[1875,1],[1880,1],[1909,1],[1911,1],[1930,1],[1947,1],[1958,1],[1968,1],[1973,1],[2002,1],[2004,1],[2023,1],[2040,1],[2051,1],[2061,1],[2066,1],[2095,1],[2097,1],[2116,1],[2152,1],[2163,1],[2173,1],[2181,1],[2210,1]]},"1055":{"position":[[341,1],[417,2],[428,85],[514,1],[571,1],[573,1],[605,1],[607,1],[666,1],[668,1],[712,1],[714,1],[751,1],[753,96],[926,1],[1031,1],[1126,1],[1133,1],[1182,1],[1189,1],[1238,1],[1245,1],[1295,1],[1302,1],[1332,3]]},"1057":{"position":[[343,1]]},"1065":{"position":[[267,1],[1139,1],[1186,1],[1265,1]]},"1069":{"position":[[662,2]]},"1075":{"position":[[832,2]]},"1077":{"position":[[790,2]]},"1088":{"position":[[41,1],[95,1],[102,1],[191,1],[198,1]]},"1093":{"position":[[131,1],[133,1]]},"1112":{"position":[[619,1]]},"1114":{"position":[[453,1],[473,1],[815,1],[867,1]]},"1116":{"position":[[134,1],[151,1],[166,1],[181,1],[196,1]]},"1122":{"position":[[231,1],[620,1],[1137,1],[1456,1],[1776,1],[2102,1],[2429,1],[2751,1],[3070,1],[3391,1]]},"1124":{"position":[[87,1],[360,1]]},"1137":{"position":[[474,3],[514,3],[536,3]]},"1139":{"position":[[179,2],[198,2],[321,3],[352,3],[375,3]]},"1141":{"position":[[421,2],[438,3],[464,1],[485,3]]},"1153":{"position":[[97,1]]},"1157":{"position":[[113,1]]},"1161":{"position":[[16,3],[47,1],[68,1],[123,1],[138,1],[175,1],[204,1],[225,1],[309,1],[324,1],[464,1],[479,1],[616,1],[631,1],[770,1],[785,1],[936,1],[951,1],[1104,1],[1119,1],[1256,1],[1271,1],[1411,1],[1426,1],[1573,1],[1588,1],[1726,1],[1741,1],[1879,1],[1894,1],[2033,1],[2048,1],[2188,1],[2203,1],[2343,1],[2358,1],[2497,1],[2512,1],[2650,1],[2665,1],[2807,1],[2822,1],[2967,1],[2982,1],[3112,1],[3127,1],[3264,1],[3279,1],[3415,1],[3430,1],[3459,1],[3474,1],[3483,4],[3488,4],[3493,4],[3525,1],[3540,1],[3634,1],[3649,1],[3684,1],[3699,1],[3701,1],[3730,1],[3745,1],[3801,1],[3816,1],[3882,1],[3897,1],[3957,1],[3972,1],[4010,1],[4025,1],[4092,1],[4107,1],[4109,1],[4111,3]]},"1163":{"position":[[0,2]]},"1168":{"position":[[759,3],[857,3],[867,3],[877,3],[889,2],[939,2],[950,2],[1045,3],[1055,3],[1075,3],[1087,2],[1225,3],[1235,3],[1255,3],[1267,2],[1334,3],[1343,3],[1363,3],[1372,3],[1456,3],[1466,3],[1478,3],[1489,3],[1500,3],[1510,3],[1524,3],[1536,3],[1546,3],[1560,3],[1573,3],[1585,3],[1618,3],[1630,2],[1655,3],[1669,3],[1744,3],[1781,3],[2066,3],[2304,3],[2325,3],[2417,3],[2431,3],[2493,3],[2507,3],[2546,3],[2560,3],[2616,3]]},"1172":{"position":[[488,1],[509,1]]},"1174":{"position":[[510,3],[545,3],[668,3],[686,3],[698,3],[716,3]]},"1187":{"position":[[24,1],[54,35],[123,2],[407,1]]},"1207":{"position":[[217,1],[257,1],[289,1],[370,1],[402,1],[483,1],[515,1],[596,1],[628,1],[709,1],[741,1],[822,1],[854,1],[935,1],[967,1],[1048,1],[1080,1],[1161,1],[1193,1],[1274,1],[1306,1],[1387,1],[1419,1],[1500,1],[1532,1],[1613,1],[1645,1],[1726,1],[1758,1],[1839,1],[1869,1],[1950,1],[1980,1],[2061,1],[2091,1],[2172,1],[2202,1],[2283,1],[2313,1],[2394,1],[2424,1],[2505,1],[2535,1],[2616,1],[2646,1],[2727,1],[2757,1],[2838,1],[2868,1],[2949,1],[2979,1],[3060,1],[3090,1]]},"1218":{"position":[[197,1],[207,1]]},"1266":{"position":[[164,1]]},"1296":{"position":[[36,1],[66,1],[136,1],[153,1],[157,3],[161,1]]},"1298":{"position":[[1113,3],[1233,3],[1337,3],[1522,1],[1816,1],[2285,1],[2488,1],[2498,3],[2764,3],[3515,1],[3599,1],[3609,3],[5005,3],[5370,1],[5568,1],[7583,1],[7777,1],[7900,3],[8044,3],[8184,3],[8322,3],[8468,3],[8582,3],[8737,3],[8904,3],[9064,3],[9219,3],[9374,3],[9537,3],[10421,3],[11120,3],[11831,1],[11947,1],[12255,3],[12353,3],[12562,3],[12768,3],[12913,3]]},"1300":{"position":[[34,1],[60,3],[64,1],[101,1],[141,1],[167,1]]},"1302":{"position":[[44,3]]},"1306":{"position":[[231,3]]},"1400":{"position":[[871,1]]},"1407":{"position":[[191,2],[215,2]]},"1425":{"position":[[179,3]]},"1467":{"position":[[90,2]]},"1520":{"position":[[203,1]]},"1539":{"position":[[206,1]]},"1545":{"position":[[430,2],[488,2],[553,2]]},"1547":{"position":[[378,2]]},"1549":{"position":[[212,2],[258,2]]},"1551":{"position":[[370,2]]},"1553":{"position":[[438,2],[485,2],[525,2],[574,2],[628,2]]},"1555":{"position":[[637,2]]},"1557":{"position":[[578,2]]},"1559":{"position":[[419,2],[472,2],[506,2]]},"1561":{"position":[[592,2]]},"1563":{"position":[[571,2]]},"1565":{"position":[[411,2]]},"1567":{"position":[[731,2]]},"1569":{"position":[[394,2],[446,2]]},"1571":{"position":[[586,2]]},"1573":{"position":[[426,2]]},"1575":{"position":[[431,2]]},"1577":{"position":[[552,2]]},"1588":{"position":[[235,1]]},"1638":{"position":[[59,1],[72,1]]},"1642":{"position":[[291,1],[347,1],[547,1],[902,1],[1063,4],[1082,1],[1215,4],[1234,1],[1368,4],[1381,3]]},"1649":{"position":[[189,1]]},"1665":{"position":[[246,3],[263,3],[283,1],[285,3],[298,1],[300,3],[319,1],[321,3],[342,3],[357,1],[359,3],[372,1],[374,1],[376,3],[393,1],[395,1],[397,3],[409,1],[411,1],[413,3],[425,1],[427,1],[429,3],[443,1],[445,1],[447,3],[459,1],[461,3],[485,1],[487,1],[489,3],[503,1],[505,1],[507,1],[509,3],[522,1],[524,1],[526,1],[528,3],[541,1],[543,1],[545,3],[549,3],[553,1],[555,1],[557,1],[559,3],[572,1],[574,1],[576,1],[578,3],[591,1],[593,1],[595,3],[609,1],[611,1],[613,3],[626,1],[628,1],[630,3],[643,1],[645,3],[656,1],[658,1],[660,3],[672,1],[674,1],[676,1],[678,3],[682,1],[684,1],[686,3],[698,1],[700,3],[715,1],[717,3],[733,1],[735,1],[737,3],[741,1],[743,3],[759,3],[779,1],[781,3],[794,1],[796,1],[798,3],[815,1],[817,1],[819,3],[823,3],[827,1],[829,3],[847,1],[849,1],[851,3],[864,1],[866,1],[868,3],[881,1],[883,1],[885,3],[899,1],[901,3],[912,1],[914,1],[916,3],[928,1],[930,1],[932,3],[936,3],[940,1],[942,1],[944,3],[956,1],[958,3],[973,1],[975,3],[1004,1],[1006,1],[1008,3],[1012,1],[1014,3],[1030,3],[1048,1],[1050,3],[1063,1],[1065,3],[1076,1],[1078,1],[1080,3],[1092,1],[1094,1],[1096,3],[1100,3],[1104,1],[1106,1],[1108,3],[1120,1],[1122,3],[1137,1],[1139,3],[1163,1],[1165,3],[1176,1],[1178,3],[1220,1],[1231,1],[1233,3],[1245,3],[1286,3],[1299,3],[1313,3],[1321,3]]},"1667":{"position":[[246,1],[248,3],[262,1],[264,1],[266,3],[282,1],[284,1],[286,3],[306,1],[308,1],[310,3],[328,1],[330,1],[332,3],[353,1],[355,1],[357,3],[804,1],[816,1]]},"1685":{"position":[[137,1]]},"1688":{"position":[[1217,1],[1230,1],[1774,1],[1810,1]]},"1690":{"position":[[197,3],[435,1]]},"1692":{"position":[[179,1],[867,1],[897,1],[1314,1],[1381,1],[1438,1],[1524,1],[1627,1],[1752,1],[1852,1],[1941,1],[2008,1]]},"1696":{"position":[[628,4],[655,1],[742,1],[794,1]]},"1700":{"position":[[29,1],[466,1],[472,1],[562,1],[568,1],[801,5],[871,5],[877,3]]},"1704":{"position":[[621,1],[733,1],[754,3],[1025,1],[1326,1]]},"1708":{"position":[[1465,1]]},"1722":{"position":[[12,1],[96,1]]},"1725":{"position":[[1569,1],[1582,1],[2126,1],[2162,1]]},"1727":{"position":[[198,3],[461,1]]},"1729":{"position":[[251,1],[1520,1],[1587,1],[1644,1],[1730,1],[1833,1],[1959,1],[2059,1],[2148,1],[2215,1]]},"1731":{"position":[[643,1],[755,1],[776,3],[1047,1],[1348,1]]},"1743":{"position":[[629,4],[656,1],[725,1],[783,1],[835,1],[905,4],[930,1]]},"1745":{"position":[[1156,1],[1191,1]]},"1747":{"position":[[87,1],[93,1],[183,1],[189,1],[447,4],[530,3]]},"1751":{"position":[[1469,1]]},"1755":{"position":[[135,2],[152,1],[331,2],[471,1],[520,3],[582,1],[631,3],[1438,1],[1572,1]]},"1757":{"position":[[558,4]]},"1767":{"position":[[12,1],[96,1]]},"1770":{"position":[[1871,1],[1884,1],[2428,1],[2464,1]]},"1772":{"position":[[198,3],[461,1]]},"1774":{"position":[[251,1],[1661,1],[1728,1],[1785,1],[1871,1],[1974,1],[2101,1],[2168,1]]},"1784":{"position":[[642,4],[669,1],[738,1],[796,1],[848,1],[918,4],[943,1]]},"1786":{"position":[[1741,1],[1771,1]]},"1788":{"position":[[647,4],[730,3]]},"1792":{"position":[[1492,1]]},"1796":{"position":[[271,2],[288,1],[467,2],[607,1],[656,3],[718,1],[767,3],[1440,1],[1574,1]]},"1798":{"position":[[558,4]]},"1807":{"position":[[470,1],[489,1]]},"1810":{"position":[[1727,3]]},"1814":{"position":[[836,1]]},"1826":{"position":[[523,1],[536,1]]},"1837":{"position":[[546,1],[564,1]]},"1853":{"position":[[118,1],[230,1],[251,3],[579,1],[882,1]]},"1886":{"position":[[235,1]]},"1891":{"position":[[2268,1],[3258,1],[4125,5],[4373,1],[5098,1],[5681,1]]},"1893":{"position":[[590,1]]},"1895":{"position":[[1147,1]]},"1908":{"position":[[181,2]]},"1919":{"position":[[420,2]]},"1936":{"position":[[353,1],[433,1]]},"1962":{"position":[[554,2],[651,1],[873,1],[1185,2],[2665,2],[3888,1],[5030,1],[5274,1],[5365,1],[5506,1],[5615,1]]},"1964":{"position":[[2784,5],[3253,1],[3255,1],[3257,1],[3295,1],[3312,1],[3329,1],[3355,1],[3389,1],[3427,1],[3458,1],[3460,1],[3462,1],[3475,1],[3500,1],[3532,5],[3554,1],[3579,1],[3594,1],[3602,1],[3633,1],[3642,1],[3651,1],[3667,1],[3696,1],[3725,1],[3773,1],[3775,1],[3777,1],[3790,1],[3820,1],[3867,1],[3905,1],[3907,1],[3909,1],[3932,1],[3934,1],[3936,1],[3950,1],[3952,1],[4020,1],[4039,1],[4070,1],[4101,1],[4122,1],[4137,1],[4152,1],[4171,1],[4202,1],[4230,1],[4263,1],[4286,1],[4309,1],[4348,1],[4380,1],[4382,1],[4431,1],[4470,1],[4497,1],[4554,1],[4590,1],[4618,1]]},"1990":{"position":[[787,1]]},"2028":{"position":[[4820,1]]},"2049":{"position":[[646,1]]},"2058":{"position":[[162,1],[252,1],[325,1],[426,1],[591,1],[654,1],[690,1],[761,1],[852,1],[911,1],[957,3],[987,1],[1083,1],[1141,1],[1220,1],[1369,1],[2018,1],[2824,1],[2895,1],[2965,1],[2967,1],[3178,1],[3392,1],[3581,1],[4392,1]]},"2068":{"position":[[1136,1],[1147,1],[1539,1],[1550,1],[1937,1],[1948,1]]},"2094":{"position":[[517,1],[642,4],[927,1],[1332,1],[3231,3]]},"2096":{"position":[[92,1],[103,1],[105,1],[117,1],[119,1],[132,1],[152,1],[195,1],[197,1],[199,1],[201,1],[203,1],[205,1],[207,1],[235,1],[237,1],[239,1],[241,1],[243,1],[245,1],[247,1],[271,3],[275,3],[295,1],[297,1],[299,1],[301,1],[303,1],[305,1],[307,1],[309,3],[343,1],[345,1],[347,1],[349,1],[351,1],[353,1],[355,1],[357,3],[389,1],[391,1],[393,1],[395,1],[397,1],[399,1],[401,1],[403,3],[443,1],[445,1],[447,1],[449,1],[451,1],[453,1],[455,1],[469,3],[473,1],[475,1],[477,1],[479,1],[491,1],[493,1],[506,1],[508,3],[522,1],[524,1],[526,1],[528,1],[530,1],[532,1],[534,1],[536,3],[567,1],[569,1],[571,1],[573,1],[575,1],[577,1],[579,1],[581,3],[602,1],[604,1],[635,1],[653,1],[655,1],[667,1],[669,1],[696,1],[771,1],[791,1],[817,1],[837,1],[839,1],[841,1],[884,1],[891,1],[932,1],[934,1],[936,1],[938,1],[940,1],[977,3],[981,1],[983,1],[1006,1],[1008,1],[1010,1],[1012,1],[1014,1],[1016,3],[1034,1],[1036,1],[1038,1],[1040,1],[1042,1],[1044,1],[1046,1],[1081,1],[1083,1],[1085,1],[1087,1],[1089,1],[1091,1],[1093,1],[1119,1],[1142,1],[1144,1],[1146,1],[1148,1],[1150,1],[1152,1],[1369,1],[1371,1],[1373,1],[1375,1],[1377,1],[1379,1],[1381,1],[1399,1],[1401,1],[1403,1],[1405,1],[1407,1],[1417,1],[1435,1],[1477,1],[1479,1],[1481,1],[1483,1],[1485,1],[1487,1],[1489,1],[1508,1],[1510,1],[1512,1],[1514,1],[1516,1],[1518,1],[1557,1],[1575,1],[1599,1],[1621,1],[1644,1],[1667,1],[1687,1],[1707,1],[1758,1],[1764,1],[1785,1],[1787,1],[1789,1],[1791,1],[1796,1],[1830,1],[1832,1],[1834,1],[1836,1],[1838,1],[1840,1],[1842,1]]},"2141":{"position":[[263,1]]},"2214":{"position":[[65,2],[120,2],[180,2],[244,2],[286,2],[332,2]]},"2216":{"position":[[65,2],[121,2],[154,2],[196,2],[236,2],[301,2]]}}}],["0",{"_index":2122,"t":{"352":{"position":[[1674,1],[1738,1],[1782,1]]},"418":{"position":[[787,1],[846,1]]},"420":{"position":[[1729,2],[3384,2]]},"457":{"position":[[2266,4]]},"489":{"position":[[277,1],[373,1],[577,1]]},"641":{"position":[[249,1]]},"657":{"position":[[313,1]]},"661":{"position":[[854,1]]},"665":{"position":[[2637,2]]},"689":{"position":[[325,1]]},"693":{"position":[[568,1]]},"724":{"position":[[1593,1]]},"938":{"position":[[336,2]]},"985":{"position":[[142,2]]},"1022":{"position":[[71,1],[158,1],[191,1],[242,1],[302,1],[352,1]]},"1024":{"position":[[203,2]]},"1026":{"position":[[121,1]]},"1028":{"position":[[59,1],[155,4],[272,1]]},"1034":{"position":[[2467,1],[7537,1],[7541,1],[8111,1],[8115,1],[8128,1],[8211,1],[8215,1],[8228,1],[8310,1],[8314,1],[8327,1],[8409,1],[8413,1],[8426,1],[8505,1],[8509,1],[8513,1],[8517,1],[8521,1],[8967,1],[8982,1],[9030,1]]},"1036":{"position":[[35,1]]},"1038":{"position":[[131,1],[206,1],[464,1],[628,1],[863,1],[1316,1],[1456,2],[2155,2]]},"1047":{"position":[[368,1],[1852,1]]},"1084":{"position":[[249,1]]},"1187":{"position":[[111,3],[404,2],[436,2],[452,4],[506,4]]},"1298":{"position":[[380,2]]},"1588":{"position":[[1402,1]]},"1678":{"position":[[42,2]]},"1698":{"position":[[292,1],[532,1],[616,1],[722,1]]},"1745":{"position":[[383,1],[639,1],[723,1],[829,1]]},"1786":{"position":[[604,1],[860,1],[944,1],[1050,1]]},"1810":{"position":[[2606,1]]},"1843":{"position":[[638,2]]},"2088":{"position":[[543,1]]}}}],["0.0",{"_index":4230,"t":{"971":{"position":[[35,3]]}}}],["0.0.0.0/0",{"_index":2271,"t":{"418":{"position":[[893,13]]},"1168":{"position":[[1129,9],[1308,9]]}}}],["0.001",{"_index":4558,"t":{"1038":{"position":[[700,8]]}}}],["0.001253",{"_index":4597,"t":{"1038":{"position":[[1962,8]]}}}],["0.4",{"_index":5396,"t":{"1349":{"position":[[492,3]]}}}],["0.4.x",{"_index":5378,"t":{"1326":{"position":[[401,7]]}}}],["0.5",{"_index":6149,"t":{"1753":{"position":[[485,3]]},"1794":{"position":[[485,3]]}}}],["0.5.x",{"_index":5514,"t":{"1431":{"position":[[189,6]]}}}],["0.5gib",{"_index":5977,"t":{"1702":{"position":[[498,6]]},"1753":{"position":[[497,6]]},"1794":{"position":[[497,6]]}}}],["0.6.0",{"_index":3095,"t":{"626":{"position":[[686,7],[767,5]]},"1069":{"position":[[686,7],[767,5]]}}}],["0.6.x",{"_index":5473,"t":{"1397":{"position":[[180,6]]}}}],["0.7.x",{"_index":1701,"t":{"280":{"position":[[196,6]]}}}],["0.8.0",{"_index":2242,"t":{"416":{"position":[[581,5]]}}}],["0.testbed.osism.xyz",{"_index":3328,"t":{"689":{"position":[[349,19]]},"1034":{"position":[[8382,19]]}}}],["0/100/1c.1/0",{"_index":4013,"t":{"850":{"position":[[1041,13]]}}}],["0/100/1c.4/0",{"_index":4015,"t":{"850":{"position":[[1100,13]]}}}],["0/100/1c.4/0.1",{"_index":4018,"t":{"850":{"position":[[1159,15]]}}}],["0/100/1c.4/0.2",{"_index":4020,"t":{"850":{"position":[[1220,15]]}}}],["0/100/1c.4/0.3",{"_index":4022,"t":{"850":{"position":[[1281,15]]}}}],["0/100/1c/0",{"_index":4010,"t":{"850":{"position":[[984,11]]}}}],["0/100/2.2/0",{"_index":4003,"t":{"850":{"position":[[856,12]]}}}],["0/100/2.2/0.1",{"_index":4008,"t":{"850":{"position":[[919,14]]}}}],["0/fluentd",{"_index":4355,"t":{"1026":{"position":[[79,9],[473,9]]}}}],["000000",{"_index":4865,"t":{"1172":{"position":[[656,6]]}}}],["00000000004f",{"_index":4489,"t":{"1034":{"position":[[5688,12]]}}}],["0001",{"_index":5606,"t":{"1526":{"position":[[36,4]]},"1530":{"position":[[42,4]]},"1547":{"position":[[4,4],[359,4]]},"1612":{"position":[[41,5]]},"2214":{"position":[[53,4]]}}}],["0002",{"_index":5604,"t":{"1524":{"position":[[46,4]]},"1549":{"position":[[4,4],[193,4],[239,4]]},"2214":{"position":[[108,4]]}}}],["0003",{"_index":5601,"t":{"1522":{"position":[[65,4]]},"1551":{"position":[[4,4],[351,4]]},"2216":{"position":[[53,4]]}}}],["0004",{"_index":5760,"t":{"1642":{"position":[[734,4]]}}}],["001",{"_index":5621,"t":{"1545":{"position":[[423,3]]}}}],["002",{"_index":5622,"t":{"1545":{"position":[[481,3]]}}}],["003",{"_index":5624,"t":{"1545":{"position":[[546,3]]}}}],["0056b89c",{"_index":3860,"t":{"802":{"position":[[1966,8],[2706,8]]}}}],["00:00:00.858586",{"_index":4455,"t":{"1034":{"position":[[4033,15]]}}}],["00:00:00.877270",{"_index":4458,"t":{"1034":{"position":[[4168,15]]}}}],["00:00:00.939663",{"_index":4452,"t":{"1034":{"position":[[3898,15]]}}}],["00:00:00.950605",{"_index":4477,"t":{"1034":{"position":[[5027,15]]}}}],["00:00:01.022530",{"_index":4470,"t":{"1034":{"position":[[4759,15]]}}}],["00:00:01.039468",{"_index":4418,"t":{"1034":{"position":[[2675,15]]}}}],["00:00:01.074853",{"_index":4467,"t":{"1034":{"position":[[4598,15]]}}}],["00:00:01.076976",{"_index":4422,"t":{"1034":{"position":[[2798,15]]}}}],["00:00:01.166032",{"_index":4483,"t":{"1034":{"position":[[5274,15]]}}}],["00:00:01.231630",{"_index":4433,"t":{"1034":{"position":[[3205,15]]}}}],["00:00:01.255475",{"_index":4440,"t":{"1034":{"position":[[3498,15]]}}}],["00:00:01.263370",{"_index":4436,"t":{"1034":{"position":[[3362,15]]}}}],["00:00:01.315217",{"_index":4461,"t":{"1034":{"position":[[4302,15]]}}}],["00:00:01.327607",{"_index":4429,"t":{"1034":{"position":[[3066,15]]}}}],["00:00:01.392765",{"_index":4444,"t":{"1034":{"position":[[3637,15]]}}}],["00:00:01.826039",{"_index":4449,"t":{"1034":{"position":[[3763,15]]}}}],["00:00:01.926842",{"_index":4480,"t":{"1034":{"position":[[5156,15]]}}}],["00:00:02.031647",{"_index":4464,"t":{"1034":{"position":[[4445,15]]}}}],["00:00:02.040932",{"_index":4473,"t":{"1034":{"position":[[4909,15]]}}}],["00:00:02.146165",{"_index":4425,"t":{"1034":{"position":[[2925,15]]}}}],["00:00:02.552006",{"_index":4414,"t":{"1034":{"position":[[2539,15],[5993,15]]}}}],["00:00:38.238032",{"_index":4404,"t":{"1034":{"position":[[1264,15],[1842,15]]}}}],["00:00:39.135309",{"_index":4497,"t":{"1034":{"position":[[6787,15]]}}}],["00de553df86949b49365baee6375fb5a",{"_index":269,"t":{"32":{"position":[[221,32]]}}}],["01",{"_index":2878,"t":{"491":{"position":[[1620,2]]},"1622":{"position":[[1728,2],[1731,2]]},"1642":{"position":[[1041,2],[1168,2],[1321,2],[1346,2]]},"1904":{"position":[[214,2]]}}}],["0100",{"_index":3043,"t":{"606":{"position":[[245,5]]},"1051":{"position":[[245,5]]},"1553":{"position":[[430,4]]},"1559":{"position":[[402,4],[455,4],[489,4]]},"1642":{"position":[[501,4]]},"1859":{"position":[[396,4]]},"2214":{"position":[[170,4]]}}}],["0101",{"_index":5635,"t":{"1553":{"position":[[477,4]]},"1555":{"position":[[8,4],[620,4]]},"2216":{"position":[[111,4]]}}}],["0102",{"_index":5636,"t":{"1553":{"position":[[517,4]]},"1557":{"position":[[8,4],[561,4]]},"2214":{"position":[[234,4]]}}}],["0103",{"_index":5637,"t":{"1553":{"position":[[566,4]]},"1561":{"position":[[8,4],[575,4]]},"2216":{"position":[[144,4]]}}}],["0104",{"_index":5638,"t":{"1553":{"position":[[620,4]]},"1563":{"position":[[8,4],[554,4]]},"2216":{"position":[[186,4]]}}}],["0110",{"_index":6166,"t":{"1774":{"position":[[858,4]]},"1843":{"position":[[769,4]]},"1859":{"position":[[644,4]]}}}],["0190",{"_index":5691,"t":{"1588":{"position":[[1283,4]]}}}],["01t08:53:14.000000",{"_index":4622,"t":{"1047":{"position":[[406,18]]}}}],["01t08:53:15.000000",{"_index":4623,"t":{"1047":{"position":[[499,18],[592,18]]}}}],["01t08:56:24.000000",{"_index":4631,"t":{"1047":{"position":[[1890,18]]}}}],["01t08:56:25.000000",{"_index":4632,"t":{"1047":{"position":[[1983,18],[2076,18]]}}}],["02",{"_index":5628,"t":{"1549":{"position":[[227,2]]},"1569":{"position":[[428,2],[483,2]]},"1571":{"position":[[601,2]]},"1575":{"position":[[446,2]]},"2088":{"position":[[531,2]]}}}],["0210",{"_index":5661,"t":{"1569":{"position":[[386,4]]},"1571":{"position":[[8,4],[569,4]]},"2214":{"position":[[276,4]]}}}],["0211",{"_index":5662,"t":{"1569":{"position":[[438,4]]},"1575":{"position":[[8,4],[414,4]]},"2214":{"position":[[322,4]]}}}],["021af0688c594bf88ed675b942d3bea8",{"_index":258,"t":{"27":{"position":[[1690,32]]}}}],["0242ac1f",{"_index":4485,"t":{"1034":{"position":[[5664,8]]}}}],["02:30:00",{"_index":2157,"t":{"358":{"position":[[355,8]]}}}],["03",{"_index":2452,"t":{"451":{"position":[[139,3]]},"1361":{"position":[[20,2]]},"1427":{"position":[[20,2]]},"1545":{"position":[[536,2]]},"1549":{"position":[[276,2]]},"1553":{"position":[[507,2]]},"1622":{"position":[[1792,2]]}}}],["0300",{"_index":5658,"t":{"1565":{"position":[[403,4]]},"1567":{"position":[[8,4],[714,4]]},"2216":{"position":[[227,4]]}}}],["0302",{"_index":3613,"t":{"749":{"position":[[58,4]]}}}],["030f",{"_index":3861,"t":{"802":{"position":[[1975,4],[2715,4]]}}}],["0390",{"_index":5709,"t":{"1594":{"position":[[1845,4],[1888,4]]}}}],["04",{"_index":5747,"t":{"1636":{"position":[[398,2]]},"1642":{"position":[[1038,2]]},"1810":{"position":[[1399,2],[1652,2]]},"2068":{"position":[[1276,2],[1682,2]]}}}],["0410",{"_index":6799,"t":{"2174":{"position":[[4,4]]},"2208":{"position":[[4,4]]}}}],["0411",{"_index":6794,"t":{"2145":{"position":[[4,4]]},"2208":{"position":[[16,4]]}}}],["0412",{"_index":5666,"t":{"1573":{"position":[[418,4]]},"1577":{"position":[[8,4],[535,4]]},"2216":{"position":[[292,4]]}}}],["05",{"_index":6221,"t":{"1810":{"position":[[1480,2],[1664,2]]}}}],["06",{"_index":5629,"t":{"1549":{"position":[[230,2]]},"1553":{"position":[[467,2]]},"1559":{"position":[[521,2]]},"1565":{"position":[[467,2]]},"1567":{"position":[[746,2]]},"1810":{"position":[[1676,2]]},"2088":{"position":[[528,2]]}}}],["0600",{"_index":3242,"t":{"665":{"position":[[297,4]]},"746":{"position":[[4347,6],[4984,6]]}}}],["0640",{"_index":4873,"t":{"1174":{"position":[[384,6]]}}}],["0644",{"_index":883,"t":{"150":{"position":[[569,4]]},"476":{"position":[[1776,6]]},"1137":{"position":[[570,4]]}}}],["0660",{"_index":3553,"t":{"746":{"position":[[642,6]]}}}],["07",{"_index":1678,"t":{"272":{"position":[[33,2]]},"1304":{"position":[[20,2]]},"1569":{"position":[[431,2]]},"1571":{"position":[[604,2]]},"1642":{"position":[[1318,2]]},"1810":{"position":[[1688,2],[1700,2]]}}}],["0755",{"_index":4871,"t":{"1174":{"position":[[232,4]]}}}],["08",{"_index":5623,"t":{"1545":{"position":[[539,2]]},"1549":{"position":[[273,2]]},"1553":{"position":[[510,2]]},"1559":{"position":[[437,2]]},"1642":{"position":[[1193,2]]},"1810":{"position":[[1721,2]]},"2068":{"position":[[1273,2],[1679,2]]}}}],["08a983bde692",{"_index":4607,"t":{"1041":{"position":[[529,12]]}}}],["09",{"_index":2453,"t":{"451":{"position":[[159,3],[187,3],[225,3]]},"610":{"position":[[1111,2],[1167,2],[1223,2],[1280,2]]},"626":{"position":[[890,2]]},"933":{"position":[[19,2]]},"1034":{"position":[[1239,2],[1764,2],[1804,2],[2514,2],[2650,2],[2773,2],[2900,2],[3041,2],[3180,2],[3337,2],[3473,2],[3612,2],[3738,2],[3873,2],[4008,2],[4143,2],[4277,2],[4420,2],[4573,2],[4734,2],[4884,2],[5002,2],[5131,2],[5249,2],[5915,2],[5955,2],[6762,2],[8137,2],[8237,2],[8336,2],[8435,2],[8530,2],[9051,2]]},"1041":{"position":[[582,2],[758,2]]},"1047":{"position":[[683,2],[777,2],[871,2]]},"1055":{"position":[[1111,2],[1167,2],[1223,2],[1280,2]]},"1069":{"position":[[890,2]]},"1324":{"position":[[20,2]]},"1393":{"position":[[20,2]]},"1460":{"position":[[20,2]]},"1559":{"position":[[434,2]]},"1636":{"position":[[299,2],[401,2]]},"1810":{"position":[[4398,2]]},"2068":{"position":[[102,2]]}}}],["0:00",{"_index":4363,"t":{"1026":{"position":[[166,4],[402,4],[425,4]]}}}],["0:00:01.053565",{"_index":4801,"t":{"1161":{"position":[[3756,17]]}}}],["0:01:26.967216",{"_index":4502,"t":{"1034":{"position":[[7500,14]]}}}],["0:02:53.934432",{"_index":4501,"t":{"1034":{"position":[[7483,14]]}}}],["0@rbd",{"_index":4624,"t":{"1047":{"position":[[644,5],[1095,5],[1146,5]]}}}],["0d00b3d40b4f",{"_index":2846,"t":{"489":{"position":[[409,12]]}}}],["0fa3c3559f0d4f39ba7aa70c7f7188ca",{"_index":249,"t":{"27":{"position":[[1516,32]]}}}],["0vk4ptyfibgk5dmzwvndzdkqs/qokooupmuobcpapmm11do4ymjbdpeinjayoro6vxttx",{"_index":1909,"t":{"319":{"position":[[4634,69]]}}}],["0~ubuntu",{"_index":4931,"t":{"1207":{"position":[[1854,8],[1965,8],[2076,8],[2187,8],[2298,8],[2409,8],[2520,8],[2631,8],[2742,8],[2853,8],[2964,8],[3075,8]]}}}],["1",{"_index":417,"t":{"64":{"position":[[49,2],[109,2],[171,2]]},"66":{"position":[[69,2],[130,2]]},"142":{"position":[[347,3]]},"204":{"position":[[258,3]]},"216":{"position":[[138,1]]},"317":{"position":[[846,2]]},"348":{"position":[[460,1]]},"420":{"position":[[1682,1]]},"462":{"position":[[2848,2]]},"474":{"position":[[2405,2],[2648,2],[2911,2],[3152,2]]},"476":{"position":[[1148,4]]},"478":{"position":[[724,2]]},"486":{"position":[[970,1],[972,1],[1057,1],[1059,1]]},"489":{"position":[[469,1]]},"573":{"position":[[468,1]]},"626":{"position":[[391,1]]},"689":{"position":[[478,1]]},"693":{"position":[[500,1],[635,1]]},"714":{"position":[[503,4]]},"724":{"position":[[1578,1],[1611,1]]},"732":{"position":[[54,2]]},"746":{"position":[[1066,1],[1073,1],[2975,1],[3006,1]]},"767":{"position":[[1622,2]]},"780":{"position":[[190,1],[204,1],[255,1],[265,1],[285,1]]},"812":{"position":[[190,1]]},"829":{"position":[[123,1],[509,1],[576,1],[678,1]]},"836":{"position":[[92,1]]},"850":{"position":[[1724,1]]},"852":{"position":[[791,1]]},"860":{"position":[[2677,2]]},"1026":{"position":[[159,1]]},"1028":{"position":[[196,1]]},"1034":{"position":[[3801,1],[3936,1],[4071,1],[4206,1]]},"1038":{"position":[[99,2],[1084,1]]},"1047":{"position":[[461,1],[650,1],[744,1],[838,1],[1101,1],[1152,1],[1254,1],[1305,1],[1407,1],[1458,1],[1945,1]]},"1069":{"position":[[391,1]]},"1105":{"position":[[357,1],[478,1],[666,1]]},"1107":{"position":[[335,1]]},"1161":{"position":[[3980,2]]},"1207":{"position":[[3818,1],[4289,2]]},"1272":{"position":[[208,3],[523,2],[814,2]]},"1298":{"position":[[333,2],[336,3],[384,3]]},"1326":{"position":[[23,1]]},"1344":{"position":[[209,1]]},"1349":{"position":[[815,3]]},"1365":{"position":[[348,1]]},"1528":{"position":[[174,1]]},"1588":{"position":[[1409,1]]},"1594":{"position":[[381,2],[1487,2]]},"1665":{"position":[[501,1],[670,1],[731,1],[926,1],[1090,1]]},"1688":{"position":[[499,3]]},"1698":{"position":[[333,1],[347,1]]},"1702":{"position":[[189,1],[490,1]]},"1706":{"position":[[499,2]]},"1725":{"position":[[604,3]]},"1731":{"position":[[566,2],[576,1],[661,1]]},"1733":{"position":[[339,1],[396,1],[502,2]]},"1745":{"position":[[424,1],[438,1]]},"1753":{"position":[[189,1],[489,1]]},"1755":{"position":[[8,1],[372,1],[1070,2],[1267,1]]},"1770":{"position":[[604,3]]},"1776":{"position":[[75,1],[132,1],[238,2]]},"1786":{"position":[[645,1],[659,1]]},"1794":{"position":[[189,1],[489,1]]},"1796":{"position":[[144,1],[508,1],[1072,2],[1269,1]]},"1843":{"position":[[111,1],[388,3]]},"1847":{"position":[[77,1],[221,1],[388,1],[465,1],[467,1],[482,1]]},"1849":{"position":[[80,1],[233,1],[425,1],[537,1],[541,1],[556,1]]},"1853":{"position":[[136,1]]},"1886":{"position":[[561,1]]},"1904":{"position":[[424,1]]},"1915":{"position":[[959,1]]},"1919":{"position":[[316,1]]},"1977":{"position":[[628,3],[1642,3]]},"1981":{"position":[[43,1]]},"2054":{"position":[[503,1]]},"2185":{"position":[[7,2],[17,1]]}}}],["1%02d",{"_index":2599,"t":{"462":{"position":[[3251,8],[3365,8],[3924,8],[4038,8]]},"474":{"position":[[3611,8]]}}}],["1)[f:5",{"_index":4343,"t":{"1022":{"position":[[160,9],[304,9]]}}}],["1.0.0",{"_index":5703,"t":{"1590":{"position":[[646,6]]}}}],["1.0.x",{"_index":5513,"t":{"1431":{"position":[[129,5]]}}}],["1.11/samples/bookinfo/platform/kube/bookinfo.yaml",{"_index":2781,"t":{"482":{"position":[[442,49]]}}}],["1.12.4",{"_index":2803,"t":{"486":{"position":[[653,6]]}}}],["1.2.x",{"_index":5472,"t":{"1397":{"position":[[120,5]]}}}],["1.21.5",{"_index":5377,"t":{"1326":{"position":[[228,8]]}}}],["1.22",{"_index":5511,"t":{"1431":{"position":[[33,4]]}}}],["1.23",{"_index":5512,"t":{"1431":{"position":[[42,4]]}}}],["1.24",{"_index":2356,"t":{"420":{"position":[[4316,5]]}}}],["1.24.latest",{"_index":2228,"t":{"412":{"position":[[26,11]]}}}],["1.25",{"_index":5471,"t":{"1397":{"position":[[33,4]]}}}],["1.25.11",{"_index":2298,"t":{"420":{"position":[[928,8]]}}}],["1.26.6",{"_index":2297,"t":{"420":{"position":[[920,7]]}}}],["1.26.x",{"_index":1702,"t":{"280":{"position":[[214,7]]}}}],["1.27",{"_index":5553,"t":{"1467":{"position":[[93,4]]}}}],["1.27.3",{"_index":2296,"t":{"420":{"position":[[912,7]]}}}],["1.27.latest",{"_index":2229,"t":{"412":{"position":[[42,12]]}}}],["1.3.0",{"_index":3131,"t":{"634":{"position":[[814,7],[1171,5]]},"1077":{"position":[[814,7],[1171,5]]}}}],["1.3.x",{"_index":1700,"t":{"280":{"position":[[154,6]]}}}],["1.4.0",{"_index":3134,"t":{"634":{"position":[[917,7],[1187,5]]},"1077":{"position":[[917,7],[1187,5]]}}}],["1.4.1",{"_index":3136,"t":{"634":{"position":[[1020,7],[1203,5]]},"1077":{"position":[[1020,7],[1203,5]]}}}],["1.5",{"_index":3767,"t":{"783":{"position":[[456,3]]},"1733":{"position":[[495,3]]},"1776":{"position":[[231,3]]}}}],["1.5.3",{"_index":2239,"t":{"416":{"position":[[504,5]]}}}],["1.5n",{"_index":6096,"t":{"1729":{"position":[[2210,4]]},"1774":{"position":[[2163,4]]}}}],["1.8.0",{"_index":2740,"t":{"474":{"position":[[3856,5]]}}}],["1.8.1",{"_index":2742,"t":{"474":{"position":[[3885,6]]}}}],["1.docker.io",{"_index":2713,"t":{"474":{"position":[[1412,12]]}}}],["1.iso",{"_index":3952,"t":{"834":{"position":[[372,5]]}}}],["1.testbed.osism.xyz",{"_index":3329,"t":{"689":{"position":[[502,19]]},"1034":{"position":[[8283,19]]}}}],["1/1",{"_index":2810,"t":{"486":{"position":[[966,3],[1053,3],[1199,3],[1237,3]]}}}],["1/100m",{"_index":6372,"t":{"1891":{"position":[[1985,8],[2491,7]]}}}],["1/20",{"_index":3401,"t":{"714":{"position":[[486,6]]}}}],["1/250m",{"_index":6377,"t":{"1891":{"position":[[2509,7]]}}}],["1/4",{"_index":6188,"t":{"1788":{"position":[[1203,3]]}}}],["10",{"_index":250,"t":{"27":{"position":[[1564,2]]},"317":{"position":[[1525,3]]},"350":{"position":[[68,2]]},"561":{"position":[[471,4]]},"646":{"position":[[80,2],[176,2]]},"657":{"position":[[349,2]]},"667":{"position":[[479,2]]},"785":{"position":[[591,2]]},"791":{"position":[[588,2]]},"850":{"position":[[907,2],[972,2]]},"860":{"position":[[2200,3],[2714,3]]},"1010":{"position":[[562,2]]},"1034":{"position":[[7528,2]]},"1038":{"position":[[162,2],[427,2],[591,2],[819,2],[1047,2],[1279,2]]},"1047":{"position":[[403,2],[496,2],[589,2],[1887,2],[1980,2],[2073,2]]},"1088":{"position":[[80,2],[176,2]]},"1093":{"position":[[55,2]]},"1207":{"position":[[4052,3],[4314,3]]},"1449":{"position":[[177,3]]},"1553":{"position":[[556,2]]},"1557":{"position":[[593,2]]},"1559":{"position":[[445,2]]},"1622":{"position":[[1747,2]]},"1642":{"position":[[1165,2]]},"1704":{"position":[[99,3]]},"1729":{"position":[[39,3],[1481,3],[1584,2]]},"1731":{"position":[[97,3],[243,2],[379,2]]},"1743":{"position":[[653,2]]},"1774":{"position":[[39,3],[1622,3],[1725,2]]},"1784":{"position":[[666,2]]},"1849":{"position":[[77,2],[96,2],[266,2],[285,2]]},"1891":{"position":[[2063,2]]},"1962":{"position":[[3826,3]]},"2214":{"position":[[219,2]]}}}],["10.1.0.79",{"_index":4642,"t":{"1093":{"position":[[192,9]]}}}],["10.109.57.148",{"_index":2822,"t":{"486":{"position":[[1695,13]]}}}],["10.15.0.33",{"_index":3709,"t":{"763":{"position":[[3113,10]]}}}],["10.3.0.1",{"_index":3284,"t":{"667":{"position":[[385,8]]}}}],["10.3.0.5/23",{"_index":3280,"t":{"667":{"position":[[269,13]]}}}],["10.3.98.5/24",{"_index":3288,"t":{"667":{"position":[[508,14]]}}}],["10.3.99.5/24",{"_index":3286,"t":{"667":{"position":[[450,14]]}}}],["10.8.0.0/20",{"_index":2280,"t":{"420":{"position":[[124,11]]}}}],["10.96.0.0/12",{"_index":2286,"t":{"420":{"position":[[301,12]]}}}],["10/",{"_index":6376,"t":{"1891":{"position":[[2499,6]]}}}],["10/20",{"_index":3390,"t":{"712":{"position":[[458,7]]},"714":{"position":[[792,7]]}}}],["100",{"_index":2671,"t":{"472":{"position":[[713,3]]},"523":{"position":[[96,4]]},"763":{"position":[[3071,3]]},"778":{"position":[[798,4]]},"836":{"position":[[468,3]]},"860":{"position":[[2172,3]]},"1704":{"position":[[111,4]]},"1729":{"position":[[51,4]]},"1731":{"position":[[109,4],[327,3],[466,3],[551,3]]},"1733":{"position":[[806,5]]},"1774":{"position":[[51,4]]},"1776":{"position":[[651,5]]},"1847":{"position":[[155,4],[177,3]]},"1849":{"position":[[191,3],[212,3],[381,3],[403,3],[499,3],[520,3]]},"1893":{"position":[[54,4]]},"1962":{"position":[[3421,4]]},"2092":{"position":[[175,4]]}}}],["1000",{"_index":6085,"t":{"1729":{"position":[[66,5]]},"1774":{"position":[[66,5]]},"1837":{"position":[[493,4],[559,4]]},"1843":{"position":[[681,4]]},"1893":{"position":[[490,4]]}}}],["10000baset/ful",{"_index":4025,"t":{"850":{"position":[[1579,15]]}}}],["10001",{"_index":4839,"t":{"1168":{"position":[[2516,5]]}}}],["1000gb",{"_index":5979,"t":{"1704":{"position":[[126,7]]},"1731":{"position":[[124,7]]}}}],["1005",{"_index":416,"t":{"64":{"position":[[39,4],[99,4],[161,4]]},"66":{"position":[[59,4]]}}}],["100m",{"_index":6375,"t":{"1891":{"position":[[2303,5]]}}}],["1039",{"_index":4598,"t":{"1038":{"position":[[1971,6]]}}}],["104",{"_index":3758,"t":{"780":{"position":[[142,3]]}}}],["1048576",{"_index":3361,"t":{"693":{"position":[[676,7]]}}}],["105.0b",{"_index":4559,"t":{"1038":{"position":[[709,8]]}}}],["1073741824",{"_index":3495,"t":{"732":{"position":[[43,10]]}}}],["10:09:25",{"_index":4138,"t":{"933":{"position":[[25,8]]}}}],["10:45:36",{"_index":4536,"t":{"1038":{"position":[[109,8]]}}}],["10:57:33",{"_index":4593,"t":{"1038":{"position":[[1926,9]]}}}],["10^9",{"_index":6205,"t":{"1807":{"position":[[472,4]]}}}],["10_bms_hwv",{"_index":6119,"t":{"1743":{"position":[[824,10]]},"1784":{"position":[[837,10]]}}}],["10_bms_z3",{"_index":6089,"t":{"1729":{"position":[[1623,9]]},"1774":{"position":[[1764,9]]}}}],["10_hwv",{"_index":6118,"t":{"1743":{"position":[[776,6]]},"1784":{"position":[[789,6]]}}}],["10_hwv_xen",{"_index":6121,"t":{"1743":{"position":[[919,10]]},"1784":{"position":[[932,10]]}}}],["10gb",{"_index":5887,"t":{"1692":{"position":[[1337,4],[1981,4]]},"1702":{"position":[[68,4]]},"1729":{"position":[[1543,4],[2188,4]]},"1753":{"position":[[68,4]]},"1774":{"position":[[1684,4],[2141,4]]},"1794":{"position":[[68,4]]}}}],["10gib",{"_index":5867,"t":{"1690":{"position":[[201,7]]},"1727":{"position":[[202,7]]},"1772":{"position":[[202,7]]}}}],["10k",{"_index":6402,"t":{"1893":{"position":[[654,4]]}}}],["10kvmhwv",{"_index":6117,"t":{"1743":{"position":[[716,8]]},"1784":{"position":[[729,8]]}}}],["10n",{"_index":6076,"t":{"1725":{"position":[[2055,3],[2068,3],[2081,3],[2094,3],[2108,3],[2122,3],[2158,3]]},"1727":{"position":[[384,3],[399,3],[413,3],[427,3],[442,3],[457,3]]},"1729":{"position":[[1468,3]]},"1741":{"position":[[265,3]]},"1745":{"position":[[994,3]]},"1753":{"position":[[26,3]]},"1770":{"position":[[2357,3],[2370,3],[2383,3],[2396,3],[2410,3],[2424,3],[2460,3]]},"1772":{"position":[[384,3],[399,3],[413,3],[427,3],[442,3],[457,3]]},"1774":{"position":[[1609,3]]},"1782":{"position":[[277,3]]},"1786":{"position":[[1569,3]]},"1794":{"position":[[26,3]]}}}],["10n_bm",{"_index":6114,"t":{"1741":{"position":[[278,7]]},"1782":{"position":[[290,7]]}}}],["10n_bms_z",{"_index":6178,"t":{"1786":{"position":[[1648,9]]}}}],["10n_bms_z3",{"_index":6179,"t":{"1786":{"position":[[1667,10],[1687,10]]}}}],["10n_bms_z3h",{"_index":6115,"t":{"1741":{"position":[[295,11]]},"1782":{"position":[[307,11]]},"1786":{"position":[[1707,11]]}}}],["10n_bms_z3hh",{"_index":6180,"t":{"1786":{"position":[[1728,12]]}}}],["10n_z",{"_index":6124,"t":{"1745":{"position":[[1007,5]]},"1786":{"position":[[1582,5]]}}}],["10n_z3",{"_index":6125,"t":{"1745":{"position":[[1022,6]]},"1786":{"position":[[1597,6]]}}}],["10n_z3h",{"_index":6126,"t":{"1745":{"position":[[1038,7]]},"1786":{"position":[[1613,7]]}}}],["10n_z3hh",{"_index":6127,"t":{"1745":{"position":[[1055,8]]},"1786":{"position":[[1630,8]]}}}],["10nbmsz",{"_index":6128,"t":{"1745":{"position":[[1073,7]]}}}],["10nbmsz3",{"_index":6129,"t":{"1745":{"position":[[1090,8],[1108,8]]}}}],["10nbmsz3h",{"_index":6130,"t":{"1745":{"position":[[1126,9]]}}}],["10nbmsz3hh",{"_index":6131,"t":{"1745":{"position":[[1145,10]]}}}],["10s_bms_z3",{"_index":6086,"t":{"1729":{"position":[[1494,10]]},"1774":{"position":[[1635,10]]}}}],["11",{"_index":1852,"t":{"317":{"position":[[1602,3]]},"1161":{"position":[[25,2],[101,2],[153,2],[182,2],[287,2],[442,2],[594,2],[748,2],[914,2],[1082,2],[1234,2],[1389,2],[1551,2],[1704,2],[1857,2],[2011,2],[2166,2],[2321,2],[2475,2],[2628,2],[2785,2],[2945,2],[3090,2],[3242,2],[3393,2],[3437,2],[3503,2],[3612,2],[3662,2],[3708,2],[3779,2],[3831,2],[3860,2],[3935,2],[3988,2],[4042,2],[4070,2]]},"1545":{"position":[[471,2]]},"1547":{"position":[[393,2]]},"1622":{"position":[[1811,2]]},"1636":{"position":[[296,2]]},"1642":{"position":[[1190,2],[1343,2]]},"1874":{"position":[[661,3]]},"2028":{"position":[[3018,3]]}}}],["11/20",{"_index":3394,"t":{"712":{"position":[[552,7]]},"714":{"position":[[861,7]]}}}],["111",{"_index":4906,"t":{"1187":{"position":[[291,4]]}}}],["11:19:57",{"_index":4551,"t":{"1038":{"position":[[382,8],[546,8]]}}}],["11:19:58",{"_index":4565,"t":{"1038":{"position":[[766,8],[996,8],[1234,8]]}}}],["11m",{"_index":2809,"t":{"486":{"position":[[930,3],[974,3],[1020,3],[1061,3],[1103,3],[1147,3],[1203,3],[1241,3],[1279,3],[1723,3]]}}}],["12",{"_index":2236,"t":{"416":{"position":[[376,3]]},"646":{"position":[[83,2],[179,2]]},"1088":{"position":[[83,2],[179,2]]},"1467":{"position":[[448,3]]},"1810":{"position":[[4424,2]]},"1870":{"position":[[67,3]]},"1874":{"position":[[530,3]]},"1904":{"position":[[632,2]]},"1915":{"position":[[382,2]]}}}],["12/20",{"_index":3396,"t":{"712":{"position":[[580,7]]},"714":{"position":[[889,7]]}}}],["120",{"_index":3793,"t":{"787":{"position":[[2961,3]]},"836":{"position":[[173,3],[293,3]]}}}],["1205",{"_index":425,"t":{"66":{"position":[[120,4]]}}}],["1234",{"_index":5721,"t":{"1610":{"position":[[781,4]]}}}],["127.0.0.1",{"_index":2305,"t":{"420":{"position":[[1231,9]]},"667":{"position":[[551,11]]}}}],["127.0.0.1:8080",{"_index":2827,"t":{"486":{"position":[[1827,14]]}}}],["12g",{"_index":6030,"t":{"1704":{"position":[[1575,3]]},"1731":{"position":[[1597,3]]},"1853":{"position":[[1131,3]]}}}],["13",{"_index":5663,"t":{"1569":{"position":[[486,2]]},"1575":{"position":[[449,2]]},"1810":{"position":[[1724,2]]}}}],["13/20",{"_index":3420,"t":{"714":{"position":[[917,7]]}}}],["13:03:14",{"_index":3049,"t":{"610":{"position":[[1117,8],[1173,8],[1229,8],[1286,8]]},"1055":{"position":[[1117,8],[1173,8],[1229,8],[1286,8]]}}}],["13k",{"_index":6468,"t":{"1962":{"position":[[2070,4]]}}}],["13m",{"_index":2867,"t":{"491":{"position":[[564,3],[765,3],[1537,3]]}}}],["14",{"_index":4507,"t":{"1034":{"position":[[8119,2],[8318,2],[8417,2],[8993,2]]},"1553":{"position":[[470,2]]},"1559":{"position":[[524,2]]},"1644":{"position":[[429,2]]},"1788":{"position":[[1085,2]]},"1810":{"position":[[1402,2],[1483,3],[1655,3],[1667,3],[1691,3]]},"1904":{"position":[[611,2]]},"1915":{"position":[[371,2]]}}}],["14/20",{"_index":3423,"t":{"714":{"position":[[953,7]]}}}],["140",{"_index":6313,"t":{"1837":{"position":[[453,3]]}}}],["149.112.112.112",{"_index":3431,"t":{"714":{"position":[[1042,18]]},"724":{"position":[[1175,15]]}}}],["14:38:14.149756",{"_index":4748,"t":{"1161":{"position":[[31,15]]}}}],["14:38:18.717886",{"_index":4749,"t":{"1161":{"position":[[107,15]]}}}],["14:38:18.723062",{"_index":4750,"t":{"1161":{"position":[[159,15]]}}}],["14:38:18.723137",{"_index":4751,"t":{"1161":{"position":[[188,15]]}}}],["14:38:18.878508",{"_index":4807,"t":{"1161":{"position":[[4048,16]]}}}],["14:38:19.138060",{"_index":4752,"t":{"1161":{"position":[[293,15]]}}}],["14:38:19.151965",{"_index":4755,"t":{"1161":{"position":[[448,15]]}}}],["14:38:19.163608",{"_index":4757,"t":{"1161":{"position":[[600,15]]}}}],["14:38:19.187772",{"_index":4759,"t":{"1161":{"position":[[754,15]]}}}],["14:38:19.192695",{"_index":4761,"t":{"1161":{"position":[[920,15]]}}}],["14:38:19.219694",{"_index":4763,"t":{"1161":{"position":[[1088,15]]}}}],["14:38:19.230577",{"_index":4765,"t":{"1161":{"position":[[1240,15]]}}}],["14:38:19.275681",{"_index":4767,"t":{"1161":{"position":[[1395,15]]}}}],["14:38:19.300350",{"_index":4769,"t":{"1161":{"position":[[1557,15]]}}}],["14:38:19.310641",{"_index":4771,"t":{"1161":{"position":[[1710,15]]}}}],["14:38:19.318096",{"_index":4773,"t":{"1161":{"position":[[1863,15]]}}}],["14:38:19.329099",{"_index":4775,"t":{"1161":{"position":[[2017,15]]}}}],["14:38:19.344766",{"_index":4777,"t":{"1161":{"position":[[2172,15]]}}}],["14:38:19.358190",{"_index":4779,"t":{"1161":{"position":[[2327,15]]}}}],["14:38:19.363578",{"_index":4781,"t":{"1161":{"position":[[2481,15]]}}}],["14:38:19.389205",{"_index":4783,"t":{"1161":{"position":[[2634,15]]}}}],["14:38:19.406360",{"_index":4785,"t":{"1161":{"position":[[2791,15]]}}}],["14:38:19.415046",{"_index":4787,"t":{"1161":{"position":[[2951,15]]}}}],["14:38:19.473508",{"_index":4789,"t":{"1161":{"position":[[3096,15]]}}}],["14:38:19.908963",{"_index":4791,"t":{"1161":{"position":[[3248,15]]}}}],["14:38:19.914395",{"_index":4793,"t":{"1161":{"position":[[3399,15]]}}}],["14:38:19.914412",{"_index":4794,"t":{"1161":{"position":[[3443,15]]}}}],["14:38:19.914419",{"_index":4796,"t":{"1161":{"position":[[3509,15]]}}}],["14:38:19.932073",{"_index":4803,"t":{"1161":{"position":[[3837,17]]}}}],["14:38:20.249358",{"_index":4797,"t":{"1161":{"position":[[3618,15]]}}}],["14:38:20.249501",{"_index":4798,"t":{"1161":{"position":[[3668,15]]}}}],["14:38:20.249533",{"_index":4799,"t":{"1161":{"position":[[3714,15]]}}}],["14:38:20.249553",{"_index":4802,"t":{"1161":{"position":[[3785,15]]}}}],["14:38:20.249571",{"_index":4804,"t":{"1161":{"position":[[3866,15]]}}}],["14:38:20.249587",{"_index":4805,"t":{"1161":{"position":[[3941,15]]}}}],["14:38:20.249603",{"_index":4806,"t":{"1161":{"position":[[3994,15]]}}}],["14:38:20.249618",{"_index":4808,"t":{"1161":{"position":[[4076,15]]}}}],["14h",{"_index":6187,"t":{"1788":{"position":[[1027,3]]}}}],["15",{"_index":1679,"t":{"272":{"position":[[36,2]]},"317":{"position":[[1660,2]]},"667":{"position":[[421,2]]},"1304":{"position":[[23,3]]},"1810":{"position":[[1679,3]]}}}],["15.3",{"_index":6198,"t":{"1805":{"position":[[83,5]]}}}],["15/20",{"_index":3426,"t":{"714":{"position":[[989,7]]}}}],["1500",{"_index":3466,"t":{"727":{"position":[[464,4]]},"729":{"position":[[2595,4]]},"850":{"position":[[1738,4]]}}}],["1505",{"_index":410,"t":{"62":{"position":[[37,4]]}}}],["152",{"_index":4504,"t":{"1034":{"position":[[7522,3]]}}}],["15477",{"_index":2164,"t":{"358":{"position":[[641,6]]}}}],["155",{"_index":135,"t":{"23":{"position":[[16,4]]}}}],["16",{"_index":3052,"t":{"610":{"position":[[1262,3]]},"780":{"position":[[231,2]]},"1055":{"position":[[1262,3]]},"1161":{"position":[[28,2],[104,2],[156,2],[185,2],[290,2],[445,2],[597,2],[751,2],[917,2],[1085,2],[1237,2],[1392,2],[1554,2],[1707,2],[1860,2],[2014,2],[2169,2],[2324,2],[2478,2],[2631,2],[2788,2],[2948,2],[3093,2],[3245,2],[3396,2],[3440,2],[3506,2],[3615,2],[3665,2],[3711,2],[3782,2],[3834,2],[3863,2],[3938,2],[3991,2],[4045,2],[4073,2]]},"1702":{"position":[[289,2]]},"1704":{"position":[[878,2]]},"1722":{"position":[[354,2]]},"1731":{"position":[[284,3],[295,2],[420,3],[431,2],[508,3],[519,2],[900,2]]},"1751":{"position":[[641,2],[666,2],[681,2],[702,2],[886,2]]},"1753":{"position":[[289,2],[391,2]]},"1767":{"position":[[354,2]]},"1792":{"position":[[641,2],[666,2],[681,2],[702,2],[886,2]]},"1794":{"position":[[289,2],[391,2]]},"1847":{"position":[[125,2],[142,2],[152,2],[174,2],[330,2],[347,2],[361,2],[411,2],[428,2]]},"1849":{"position":[[149,2],[169,2],[338,2],[358,2],[385,2],[457,2],[477,2]]},"1853":{"position":[[306,2]]},"1893":{"position":[[51,2]]},"1904":{"position":[[217,4]]}}}],["16.04",{"_index":3115,"t":{"632":{"position":[[585,5],[818,7],[1129,5],[1153,5],[1229,5],[1269,5],[1290,5],[1336,5]]},"1075":{"position":[[585,5],[818,7],[1129,5],[1153,5],[1229,5],[1269,5],[1290,5],[1336,5]]}}}],["16/20",{"_index":3429,"t":{"714":{"position":[[1022,7]]}}}],["161",{"_index":4509,"t":{"1034":{"position":[[8164,3]]}}}],["162",{"_index":4514,"t":{"1034":{"position":[[8363,3]]}}}],["163",{"_index":4512,"t":{"1034":{"position":[[8264,3]]}}}],["164",{"_index":4506,"t":{"1034":{"position":[[8065,3],[8704,3],[8851,3]]}}}],["165",{"_index":4516,"t":{"1034":{"position":[[8462,3]]}}}],["1668",{"_index":5573,"t":{"1484":{"position":[[174,4]]}}}],["16777216",{"_index":3351,"t":{"693":{"position":[[387,8],[423,8]]}}}],["16:32",{"_index":6007,"t":{"1704":{"position":[[439,5]]},"1731":{"position":[[437,5]]}}}],["16:43:52.547",{"_index":4635,"t":{"1093":{"position":[[61,12]]}}}],["16gib",{"_index":5974,"t":{"1702":{"position":[[442,5]]},"1722":{"position":[[418,5]]},"1753":{"position":[[441,5]]},"1767":{"position":[[418,5]]},"1794":{"position":[[441,5]]}}}],["16t",{"_index":6145,"t":{"1753":{"position":[[267,3]]},"1794":{"position":[[267,3]]}}}],["16t:64:200",{"_index":5965,"t":{"1702":{"position":[[267,11]]}}}],["16v",{"_index":6097,"t":{"1731":{"position":[[447,3],[459,3]]},"1788":{"position":[[1011,3]]},"1847":{"position":[[354,3]]},"1849":{"position":[[374,3]]}}}],["16v:32",{"_index":6008,"t":{"1704":{"position":[[449,7]]}}}],["16v:32:100",{"_index":6009,"t":{"1704":{"position":[[461,10]]}}}],["17",{"_index":6621,"t":{"2028":{"position":[[258,2],[2558,3]]},"2096":{"position":[[1589,2]]}}}],["17/20",{"_index":3432,"t":{"714":{"position":[[1061,7]]}}}],["1761",{"_index":4596,"t":{"1038":{"position":[[1957,4]]}}}],["17:55:54.252250",{"_index":4609,"t":{"1041":{"position":[[588,15]]}}}],["18",{"_index":4510,"t":{"1034":{"position":[[8219,2]]},"1161":{"position":[[3573,2]]},"1826":{"position":[[1349,4]]}}}],["18/20",{"_index":3435,"t":{"714":{"position":[[1099,7]]}}}],["1800",{"_index":1869,"t":{"319":{"position":[[754,4]]}}}],["185.150.99.255",{"_index":2255,"t":{"418":{"position":[[513,16]]}}}],["1885",{"_index":4613,"t":{"1041":{"position":[[688,4]]}}}],["18:00:31.215879",{"_index":4618,"t":{"1041":{"position":[[764,15]]}}}],["18:14:15",{"_index":4346,"t":{"1022":{"position":[[213,8]]}}}],["18:15:39",{"_index":4383,"t":{"1028":{"position":[[103,8]]}}}],["18:16:25",{"_index":4384,"t":{"1028":{"position":[[167,8]]}}}],["18m",{"_index":2884,"t":{"491":{"position":[[2228,3]]}}}],["19/20",{"_index":3438,"t":{"714":{"position":[[1135,7]]}}}],["190",{"_index":5690,"t":{"1588":{"position":[[1174,4]]},"1755":{"position":[[341,4]]},"1796":{"position":[[477,4]]}}}],["192.168.0.0/16",{"_index":2284,"t":{"420":{"position":[[212,14]]}}}],["192.168.16.1",{"_index":3465,"t":{"727":{"position":[[444,14]]},"729":{"position":[[2575,14]]}}}],["192.168.16.10",{"_index":3471,"t":{"729":{"position":[[1955,13],[2128,13]]},"739":{"position":[[497,13]]},"746":{"position":[[2871,13],[2937,13],[3103,13],[3162,13]]},"1036":{"position":[[515,14]]},"1038":{"position":[[1895,13],[1987,17]]}}}],["192.168.16.10/20",{"_index":3463,"t":{"727":{"position":[[415,18]]},"729":{"position":[[2546,18]]}}}],["192.168.16.11",{"_index":3524,"t":{"739":{"position":[[513,13]]}}}],["192.168.16.12",{"_index":3525,"t":{"739":{"position":[[529,13]]}}}],["192.168.16.5",{"_index":3460,"t":{"727":{"position":[[179,12]]},"1028":{"position":[[122,12]]}}}],["192.168.23.0/24",{"_index":4048,"t":{"850":{"position":[[3152,15]]}}}],["192.168.23.1",{"_index":4055,"t":{"850":{"position":[[3273,12]]}}}],["192.168.23.100",{"_index":4051,"t":{"850":{"position":[[3210,14]]}}}],["192.168.23.200",{"_index":4053,"t":{"850":{"position":[[3246,14]]}}}],["192.168.32.9",{"_index":3425,"t":{"714":{"position":[[973,15]]},"724":{"position":[[891,12]]}}}],["192.168.64.0/20",{"_index":3408,"t":{"714":{"position":[[584,18]]},"724":{"position":[[172,15]]}}}],["192.168.80.0/20",{"_index":3405,"t":{"714":{"position":[[536,18]]},"724":{"position":[[92,15]]}}}],["192.168.96.9",{"_index":3422,"t":{"714":{"position":[[937,15]]},"724":{"position":[[803,12]]}}}],["1:1",{"_index":6019,"t":{"1704":{"position":[[557,3]]},"1715":{"position":[[278,3]]},"1731":{"position":[[555,3]]},"1760":{"position":[[278,3]]},"2028":{"position":[[1830,3]]}}}],["1:2",{"_index":5995,"t":{"1704":{"position":[[333,3]]},"1731":{"position":[[331,3]]}}}],["1:4",{"_index":5982,"t":{"1704":{"position":[[184,4],[222,3]]},"1731":{"position":[[182,4],[220,3]]},"1853":{"position":[[50,4]]}}}],["1:8",{"_index":6010,"t":{"1704":{"position":[[472,3]]},"1731":{"position":[[470,3]]}}}],["1@rbd",{"_index":4627,"t":{"1047":{"position":[[832,5],[1248,5],[1299,5]]}}}],["1]:8080",{"_index":2829,"t":{"486":{"position":[[1866,10]]}}}],["1c",{"_index":6167,"t":{"1776":{"position":[[228,2]]}}}],["1d",{"_index":6101,"t":{"1733":{"position":[[492,2]]}}}],["1d:1.5:8",{"_index":6036,"t":{"1706":{"position":[[489,9]]}}}],["1db5b4429a69",{"_index":2839,"t":{"489":{"position":[[313,12]]}}}],["1gi",{"_index":2788,"t":{"486":{"position":[[144,6],[163,6]]},"489":{"position":[[326,3],[626,3]]}}}],["1gib",{"_index":5962,"t":{"1702":{"position":[[222,4]]},"1753":{"position":[[222,4]]},"1794":{"position":[[222,4]]}}}],["1k",{"_index":6478,"t":{"1962":{"position":[[3433,3]]}}}],["1l",{"_index":6098,"t":{"1731":{"position":[[563,2],[573,2],[658,2]]},"1753":{"position":[[181,2]]},"1794":{"position":[[181,2]]},"1847":{"position":[[462,2]]},"1849":{"position":[[534,2]]},"1853":{"position":[[133,2]]}}}],["1l:1",{"_index":6020,"t":{"1704":{"position":[[565,5],[636,4]]}}}],["1l:1:5",{"_index":6021,"t":{"1704":{"position":[[575,6]]}}}],["1l:1u:5",{"_index":5961,"t":{"1702":{"position":[[181,7]]}}}],["1m",{"_index":6400,"t":{"1893":{"position":[[586,3]]}}}],["1s",{"_index":6379,"t":{"1891":{"position":[[2555,2]]}}}],["1st",{"_index":3898,"t":{"812":{"position":[[257,3]]},"850":{"position":[[170,3]]}}}],["1t",{"_index":6099,"t":{"1733":{"position":[[393,2]]},"1776":{"position":[[129,2]]}}}],["1t:1:5n",{"_index":6035,"t":{"1706":{"position":[[394,7]]}}}],["1tb",{"_index":3066,"t":{"622":{"position":[[269,3]]},"852":{"position":[[859,4]]},"1065":{"position":[[269,3]]}}}],["1u",{"_index":6144,"t":{"1753":{"position":[[184,2]]},"1794":{"position":[[184,2]]}}}],["1v",{"_index":3050,"t":{"610":{"position":[[1147,2]]},"1055":{"position":[[1147,2]]},"1731":{"position":[[228,2],[238,2],[339,2],[349,2],[478,2],[488,2]]},"1733":{"position":[[336,2]]},"1753":{"position":[[482,2]]},"1776":{"position":[[72,2]]},"1794":{"position":[[482,2]]},"1847":{"position":[[72,2],[216,2],[383,2]]},"1849":{"position":[[72,2],[226,2],[417,2]]},"1853":{"position":[[1056,2]]}}}],["1v:0.5",{"_index":5976,"t":{"1702":{"position":[[483,6]]}}}],["1v:2",{"_index":5996,"t":{"1704":{"position":[[341,5],[1500,4]]},"1731":{"position":[[1522,4]]}}}],["1v:2:5",{"_index":5997,"t":{"1704":{"position":[[351,6]]}}}],["1v:4",{"_index":5984,"t":{"1704":{"position":[[230,5]]}}}],["1v:4:10",{"_index":5985,"t":{"1704":{"position":[[240,7]]}}}],["1v:8",{"_index":6011,"t":{"1704":{"position":[[480,5]]}}}],["1v:8:20",{"_index":6012,"t":{"1704":{"position":[[490,7]]}}}],["1vl:1:5",{"_index":6034,"t":{"1706":{"position":[[336,7]]}}}],["1~ubuntu.22.04~jammi",{"_index":4914,"t":{"1207":{"position":[[268,20],[381,20],[494,20],[607,20],[720,20],[833,20],[946,20],[1059,20],[1172,20],[1285,20],[1398,20],[1511,20],[1624,20],[1737,20]]}}}],["2",{"_index":818,"t":{"142":{"position":[[357,3]]},"216":{"position":[[180,2]]},"317":{"position":[[971,2]]},"386":{"position":[[314,1]]},"457":{"position":[[7645,2]]},"462":{"position":[[1593,2]]},"478":{"position":[[964,1],[1020,1]]},"486":{"position":[[926,1],[928,1],[1016,1],[1018,1],[1099,1],[1101,1],[1143,1],[1145,1]]},"489":{"position":[[747,1],[764,1]]},"561":{"position":[[322,1]]},"614":{"position":[[210,1]]},"665":{"position":[[1459,1],[1561,2]]},"689":{"position":[[631,1]]},"732":{"position":[[414,1]]},"746":{"position":[[1018,1]]},"829":{"position":[[817,1]]},"860":{"position":[[2238,2]]},"1010":{"position":[[1169,1],[1210,1],[1420,1]]},"1024":{"position":[[206,2]]},"1034":{"position":[[7479,1],[7533,1],[8124,1],[8224,1],[8323,1],[8422,1],[9010,1]]},"1038":{"position":[[404,1],[568,1],[788,1],[1018,1],[1256,1]]},"1047":{"position":[[554,1],[2038,1]]},"1059":{"position":[[210,1]]},"1112":{"position":[[97,1]]},"1272":{"position":[[267,3]]},"1413":{"position":[[63,2],[279,1]]},"1429":{"position":[[23,1]]},"1471":{"position":[[307,1]]},"1588":{"position":[[1207,1],[1416,1]]},"1698":{"position":[[378,1],[397,1]]},"1702":{"position":[[30,1]]},"1717":{"position":[[1283,1]]},"1725":{"position":[[2116,1]]},"1731":{"position":[[342,2],[352,1]]},"1745":{"position":[[469,1],[488,1]]},"1753":{"position":[[30,1]]},"1755":{"position":[[912,1],[1460,2]]},"1762":{"position":[[1182,1]]},"1770":{"position":[[2418,1]]},"1786":{"position":[[690,1],[709,1]]},"1794":{"position":[[30,1]]},"1796":{"position":[[914,1],[1462,2]]},"1837":{"position":[[457,1]]},"1843":{"position":[[116,2]]},"1847":{"position":[[102,1],[219,1],[235,1],[246,1],[275,1],[414,1]]},"1849":{"position":[[117,1],[229,1],[247,1],[269,1],[463,1]]},"1853":{"position":[[1059,1]]},"1886":{"position":[[341,1]]},"1904":{"position":[[426,1],[689,1]]},"1915":{"position":[[441,1],[961,1]]},"1919":{"position":[[481,1]]},"1962":{"position":[[1284,1],[2770,1],[3990,1]]},"1977":{"position":[[774,3]]},"1981":{"position":[[89,1]]},"2054":{"position":[[509,2]]},"2077":{"position":[[3581,2],[3591,1]]},"2096":{"position":[[1658,1]]},"2185":{"position":[[38,2],[48,1]]}}}],["2+1))/ge",{"_index":2600,"t":{"462":{"position":[[3260,13],[3374,13],[3933,13],[4047,13]]},"474":{"position":[[3620,13]]}}}],["2.0",{"_index":1586,"t":{"247":{"position":[[487,3]]},"1567":{"position":[[605,3]]},"2024":{"position":[[261,3]]},"2028":{"position":[[1307,4]]},"2032":{"position":[[603,3]]}}}],["2.14.10",{"_index":4495,"t":{"1034":{"position":[[6705,7]]}}}],["2.5",{"_index":6380,"t":{"1891":{"position":[[2561,5]]}}}],["2.67",{"_index":4351,"t":{"1022":{"position":[[277,4]]}}}],["2.71",{"_index":4388,"t":{"1028":{"position":[[230,4]]}}}],["2.75ghz",{"_index":5922,"t":{"1698":{"position":[[807,8]]},"1745":{"position":[[914,8]]},"1786":{"position":[[1489,8]]}}}],["2.85",{"_index":4386,"t":{"1028":{"position":[[218,5]]}}}],["2.iso",{"_index":3953,"t":{"834":{"position":[[450,5]]}}}],["2.testbed.osism.xyz",{"_index":3330,"t":{"689":{"position":[[655,19]]},"1034":{"position":[[8084,19],[8933,19]]}}}],["2/2",{"_index":2808,"t":{"486":{"position":[[922,3],[1012,3],[1095,3],[1139,3],[1275,3]]}}}],["2/20",{"_index":3403,"t":{"714":{"position":[[508,6]]}}}],["20",{"_index":2310,"t":{"420":{"position":[[1489,3],[1593,3],[2092,2],[2229,2]]},"610":{"position":[[1114,2],[1170,2],[1226,2],[1283,2]]},"614":{"position":[[134,3],[192,3]]},"691":{"position":[[108,2]]},"693":{"position":[[466,2]]},"1055":{"position":[[1114,2],[1170,2],[1226,2],[1283,2]]},"1059":{"position":[[134,3],[192,3]]},"1161":{"position":[[3542,2]]},"1460":{"position":[[23,3]]},"1688":{"position":[[227,3],[1337,4]]},"1704":{"position":[[103,3]]},"1725":{"position":[[319,3],[1689,4]]},"1729":{"position":[[43,3]]},"1731":{"position":[[101,3],[269,2],[405,2],[493,2]]},"1770":{"position":[[319,3],[1991,4]]},"1774":{"position":[[43,3]]},"1776":{"position":[[332,3]]},"1843":{"position":[[315,3]]},"1847":{"position":[[271,3],[291,2]]},"1849":{"position":[[114,2],[133,2],[303,2],[322,2],[422,2],[441,2]]},"1893":{"position":[[36,3]]}}}],["20.04",{"_index":2062,"t":{"343":{"position":[[397,6]]},"420":{"position":[[944,5]]},"457":{"position":[[469,5]]},"1365":{"position":[[534,6]]},"1805":{"position":[[100,6]]},"1874":{"position":[[408,6]]}}}],["20.10.24",{"_index":4943,"t":{"1207":{"position":[[3221,8]]}}}],["200",{"_index":5978,"t":{"1704":{"position":[[116,4]]},"1729":{"position":[[56,4]]},"1731":{"position":[[114,4]]},"1774":{"position":[[56,4]]},"1866":{"position":[[161,3]]},"1962":{"position":[[4643,4]]}}}],["2000gb",{"_index":5980,"t":{"1704":{"position":[[134,7]]},"1731":{"position":[[132,7]]}}}],["2003",{"_index":4901,"t":{"1187":{"position":[[223,6]]}}}],["200gb",{"_index":5967,"t":{"1702":{"position":[[322,5]]},"1753":{"position":[[322,5]]},"1794":{"position":[[322,5]]}}}],["200s_gna",{"_index":6146,"t":{"1753":{"position":[[274,8]]},"1794":{"position":[[274,8]]}}}],["2012r2",{"_index":6199,"t":{"1805":{"position":[[138,8]]}}}],["20180928",{"_index":3118,"t":{"632":{"position":[[856,10],[1135,10],[1235,10]]},"1075":{"position":[[856,10],[1135,10],[1235,10]]}}}],["20181004",{"_index":3124,"t":{"632":{"position":[[970,10],[1296,10]]},"1075":{"position":[[970,10],[1296,10]]}}}],["2020",{"_index":6530,"t":{"1966":{"position":[[4264,4]]}}}],["2021",{"_index":1677,"t":{"272":{"position":[[28,4]]},"1304":{"position":[[15,4]]},"1324":{"position":[[15,4]]},"1622":{"position":[[1723,4]]},"1642":{"position":[[1160,4],[1313,4],[1338,4]]},"1810":{"position":[[1394,4],[1475,4],[1647,4],[1659,4],[1671,4],[1683,4],[1695,4],[1716,4]]}}}],["2022",{"_index":2451,"t":{"451":{"position":[[133,5],[153,5],[181,5]]},"626":{"position":[[885,4]]},"732":{"position":[[95,4]]},"1069":{"position":[[885,4]]},"1377":{"position":[[762,4]]},"1379":{"position":[[128,4],[159,4],[177,4],[267,4]]},"1393":{"position":[[15,4]]},"1427":{"position":[[15,4]]},"1453":{"position":[[193,4]]},"1545":{"position":[[466,4]]},"1547":{"position":[[388,4]]},"1553":{"position":[[551,4]]},"1557":{"position":[[588,4]]},"1559":{"position":[[429,4]]},"1636":{"position":[[291,4]]},"1642":{"position":[[1033,4],[1185,4]]},"1810":{"position":[[4584,5],[4695,4]]},"2088":{"position":[[523,4]]}}}],["2023",{"_index":1709,"t":{"282":{"position":[[60,5]]},"451":{"position":[[219,5]]},"610":{"position":[[1106,4],[1162,4],[1218,4],[1275,4]]},"646":{"position":[[75,4],[171,4]]},"933":{"position":[[14,4]]},"1028":{"position":[[112,4]]},"1034":{"position":[[1234,4],[1759,4],[1799,4],[2509,4],[2645,4],[2768,4],[2895,4],[3036,4],[3175,4],[3332,4],[3468,4],[3607,4],[3733,4],[3868,4],[4003,4],[4138,4],[4272,4],[4415,4],[4568,4],[4729,4],[4879,4],[4997,4],[5126,4],[5244,4],[5910,4],[5950,4],[6757,4],[8132,4],[8232,4],[8331,4],[8430,4],[8525,4],[9046,4]]},"1038":{"position":[[157,4],[422,4],[586,4],[814,4],[1042,4],[1274,4]]},"1041":{"position":[[577,4],[753,4]]},"1047":{"position":[[398,4],[491,4],[584,4],[678,4],[772,4],[866,4],[1882,4],[1975,4],[2068,4]]},"1055":{"position":[[1106,4],[1162,4],[1218,4],[1275,4]]},"1088":{"position":[[75,4],[171,4]]},"1093":{"position":[[50,4]]},"1161":{"position":[[20,4],[96,4],[148,4],[177,4],[282,4],[437,4],[589,4],[743,4],[909,4],[1077,4],[1229,4],[1384,4],[1546,4],[1699,4],[1852,4],[2006,4],[2161,4],[2316,4],[2470,4],[2623,4],[2780,4],[2940,4],[3085,4],[3237,4],[3388,4],[3432,4],[3498,4],[3607,4],[3657,4],[3703,4],[3774,4],[3825,5],[3855,4],[3930,4],[3983,4],[4036,5],[4065,4]]},"1361":{"position":[[15,4]]},"1379":{"position":[[236,4]]},"1419":{"position":[[189,4],[260,5]]},"1460":{"position":[[15,4]]},"1479":{"position":[[193,5]]},"1484":{"position":[[125,4],[169,4],[212,4],[275,4]]},"1545":{"position":[[531,4]]},"1549":{"position":[[222,4],[268,4]]},"1553":{"position":[[462,4],[502,4]]},"1559":{"position":[[440,4],[516,4]]},"1565":{"position":[[462,4]]},"1567":{"position":[[741,4]]},"1569":{"position":[[423,4],[478,4]]},"1571":{"position":[[596,4]]},"1575":{"position":[[441,4]]},"1622":{"position":[[1742,4],[1787,4],[1806,4]]},"1636":{"position":[[393,4]]},"1904":{"position":[[208,5]]},"2028":{"position":[[3022,5]]},"2068":{"position":[[97,4],[1268,4],[1674,4]]},"2214":{"position":[[214,4]]}}}],["2023.1",{"_index":3437,"t":{"714":{"position":[[1125,9]]},"724":{"position":[[1487,6]]},"791":{"position":[[465,6]]},"819":{"position":[[227,6]]},"1465":{"position":[[69,6]]}}}],["2023.10.31",{"_index":4533,"t":{"1038":{"position":[[82,10],[355,10],[1414,10],[2113,10]]}}}],["2024",{"_index":6676,"t":{"2063":{"position":[[161,4]]}}}],["2048",{"_index":3130,"t":{"634":{"position":[[634,4]]},"1077":{"position":[[634,4]]}}}],["2088",{"_index":5574,"t":{"1484":{"position":[[280,5]]}}}],["20gb",{"_index":3061,"t":{"614":{"position":[[258,4]]},"1059":{"position":[[258,4]]},"1717":{"position":[[1313,4]]},"1762":{"position":[[1212,4]]}}}],["20p",{"_index":6168,"t":{"1776":{"position":[[352,3]]}}}],["20th",{"_index":5570,"t":{"1479":{"position":[[187,5]]}}}],["21",{"_index":4401,"t":{"1034":{"position":[[1224,2],[1880,3],[6743,2]]},"1393":{"position":[[23,3]]},"1565":{"position":[[470,2]]},"1567":{"position":[[749,2]]}}}],["2119",{"_index":5676,"t":{"1582":{"position":[[188,5]]},"2101":{"position":[[188,5]]}}}],["213.131.230.203.nip.io",{"_index":2864,"t":{"491":{"position":[[533,22]]}}}],["2147483648",{"_index":3502,"t":{"732":{"position":[[401,10]]}}}],["21:00:38",{"_index":3150,"t":{"646":{"position":[[86,8],[182,8]]},"1088":{"position":[[86,8],[182,8]]}}}],["21m",{"_index":2112,"t":{"352":{"position":[[1392,3],[1546,3],[1710,3]]}}}],["22",{"_index":3325,"t":{"689":{"position":[[233,2],[386,2],[539,2],[692,2]]},"691":{"position":[[444,2]]},"712":{"position":[[452,5]]},"714":{"position":[[786,5]]},"724":{"position":[[545,2]]},"763":{"position":[[3129,3]]},"869":{"position":[[1555,2]]},"1093":{"position":[[74,2]]},"1168":{"position":[[329,2],[1384,2]]},"1361":{"position":[[23,3]]},"1962":{"position":[[2387,3]]}}}],["22.04",{"_index":1703,"t":{"280":{"position":[[233,5]]},"416":{"position":[[311,5],[360,5]]},"420":{"position":[[872,5]]},"457":{"position":[[485,5]]},"778":{"position":[[839,6],[867,6]]},"791":{"position":[[349,5]]},"834":{"position":[[836,6]]},"858":{"position":[[129,6],[159,5]]},"860":{"position":[[121,5],[250,5],[414,5]]},"1168":{"position":[[40,5],[623,5]]},"1365":{"position":[[438,5],[577,5]]},"1411":{"position":[[430,6]]},"1467":{"position":[[390,6],[432,5]]},"1874":{"position":[[24,6],[978,5]]}}}],["22.04.1",{"_index":4086,"t":{"860":{"position":[[297,7]]}}}],["22.09",{"_index":5420,"t":{"1368":{"position":[[405,6]]}}}],["2204",{"_index":6335,"t":{"1872":{"position":[[77,4],[161,4]]},"1874":{"position":[[362,4]]}}}],["2237c767cf5f456da19359ed31c1c16b",{"_index":195,"t":{"27":{"position":[[74,32]]}}}],["22m",{"_index":2124,"t":{"352":{"position":[[1685,3]]}}}],["23",{"_index":5509,"t":{"1427":{"position":[[23,3]]},"1622":{"position":[[1795,2]]}}}],["23.06.1",{"_index":5543,"t":{"1465":{"position":[[189,8]]}}}],["238",{"_index":4376,"t":{"1026":{"position":[[389,3]]}}}],["23db",{"_index":4561,"t":{"1038":{"position":[[728,4]]}}}],["23m",{"_index":2117,"t":{"352":{"position":[[1519,3]]}}}],["24.0.6",{"_index":4944,"t":{"1207":{"position":[[3233,7]]}}}],["24194",{"_index":4541,"t":{"1038":{"position":[[219,5]]}}}],["247",{"_index":4379,"t":{"1026":{"position":[[412,3]]}}}],["24:28",{"_index":4366,"t":{"1026":{"position":[[218,5]]}}}],["24hr",{"_index":6246,"t":{"1814":{"position":[[90,5]]}}}],["25",{"_index":4371,"t":{"1026":{"position":[[299,2]]},"1093":{"position":[[58,2]]}}}],["250",{"_index":6466,"t":{"1962":{"position":[[2040,4]]}}}],["250m",{"_index":2616,"t":{"468":{"position":[[827,7]]}}}],["25224",{"_index":4568,"t":{"1038":{"position":[[876,5]]}}}],["256",{"_index":3364,"t":{"693":{"position":[[847,3],[950,3]]},"1837":{"position":[[402,3]]}}}],["26",{"_index":6160,"t":{"1755":{"position":[[1121,2],[1158,2],[1198,2],[1225,2],[1343,2],[1426,2]]},"1796":{"position":[[1123,2],[1160,2],[1200,2],[1227,2],[1345,2],[1428,2]]}}}],["262144",{"_index":3346,"t":{"693":{"position":[[233,6]]}}}],["26234859",{"_index":3185,"t":{"657":{"position":[[263,8]]}}}],["264",{"_index":2460,"t":{"453":{"position":[[1022,6]]}}}],["27",{"_index":4382,"t":{"1028":{"position":[[100,2]]},"1041":{"position":[[585,2],[761,2]]},"1810":{"position":[[1703,2]]},"2068":{"position":[[105,2]]}}}],["270",{"_index":4549,"t":{"1038":{"position":[[296,3],[953,3]]}}}],["28",{"_index":3102,"t":{"626":{"position":[[893,2]]},"780":{"position":[[131,2]]},"1069":{"position":[[893,2]]},"1545":{"position":[[474,2]]},"1547":{"position":[[396,2]]}}}],["29",{"_index":5375,"t":{"1324":{"position":[[23,3]]}}}],["29404",{"_index":3497,"t":{"732":{"position":[[100,6]]}}}],["2:**4:10n",{"_index":5862,"t":{"1688":{"position":[[1764,9]]}}}],["2:16",{"_index":6013,"t":{"1704":{"position":[[498,4]]},"1731":{"position":[[496,4]]}}}],["2:4",{"_index":5998,"t":{"1704":{"position":[[358,3]]},"1731":{"position":[[356,3]]}}}],["2:8",{"_index":5986,"t":{"1704":{"position":[[248,3]]},"1731":{"position":[[246,3]]}}}],["2@2(peon).osd",{"_index":4573,"t":{"1038":{"position":[[1103,13]]}}}],["2@rbd",{"_index":4626,"t":{"1047":{"position":[[738,5],[1401,5],[1452,5]]}}}],["2].testbed.osism.xyz",{"_index":3276,"t":{"665":{"position":[[2640,20]]}}}],["2^30",{"_index":6206,"t":{"1807":{"position":[[491,4]]}}}],["2a33a889",{"_index":4637,"t":{"1093":{"position":[[147,8]]}}}],["2c",{"_index":6075,"t":{"1725":{"position":[[2050,2]]},"1727":{"position":[[379,2],[392,2],[407,2],[421,2],[435,2],[450,2]]},"1729":{"position":[[1463,2],[1476,2],[1489,2],[1509,2],[1557,2],[1579,2],[1618,2],[1637,2],[1707,2],[1724,2],[1770,2],[1787,2],[1815,2],[1828,2],[1934,2],[1950,2],[2050,2],[2138,2],[2205,2]]},"1741":{"position":[[260,2],[273,2],[290,2]]},"1743":{"position":[[648,2],[711,2],[771,2],[819,2],[914,2]]},"1745":{"position":[[989,2],[1002,2],[1017,2],[1033,2],[1050,2],[1068,2],[1085,2],[1103,2],[1121,2],[1140,2]]},"1753":{"position":[[21,2]]},"1770":{"position":[[2352,2]]},"1772":{"position":[[379,2],[392,2],[407,2],[421,2],[435,2],[450,2]]},"1774":{"position":[[1604,2],[1617,2],[1630,2],[1650,2],[1698,2],[1720,2],[1759,2],[1778,2],[1848,2],[1865,2],[1911,2],[1928,2],[1956,2],[1969,2],[2075,2],[2091,2],[2158,2]]},"1782":{"position":[[272,2],[285,2],[302,2]]},"1784":{"position":[[661,2],[724,2],[784,2],[832,2],[927,2]]},"1786":{"position":[[1564,2],[1577,2],[1592,2],[1608,2],[1625,2],[1643,2],[1662,2],[1682,2],[1702,2],[1723,2]]},"1794":{"position":[[21,2]]}}}],["2c9e0e4ef8d44c36807df50b06b3c81d",{"_index":209,"t":{"27":{"position":[[585,32]]}}}],["2c:3.5:10n",{"_index":5869,"t":{"1690":{"position":[[366,10]]}}}],["2c:4",{"_index":5889,"t":{"1692":{"position":[[1518,5],[1564,5],[1581,5],[1609,5],[1622,4],[1728,4]]}}}],["2c:4:1.5n",{"_index":5894,"t":{"1692":{"position":[[1998,9]]}}}],["2c:4:10",{"_index":5884,"t":{"1692":{"position":[[1270,8],[1283,8],[1373,7],[1412,7]]},"1696":{"position":[[647,7],[710,7],[730,7],[778,7]]}}}],["2c:4:10n",{"_index":5857,"t":{"1688":{"position":[[1698,8]]},"1690":{"position":[[353,8]]},"1692":{"position":[[1257,8]]},"1694":{"position":[[260,8],[273,8],[290,8]]},"1698":{"position":[[882,8],[895,8],[910,8],[926,8],[943,8],[961,8],[980,8],[1000,8],[1020,8],[1041,8]]},"1702":{"position":[[21,8]]}}}],["2c:4:3x",{"_index":5892,"t":{"1692":{"position":[[1744,7],[1843,8]]}}}],["2c:4:3x10",{"_index":5886,"t":{"1692":{"position":[[1303,10],[1351,10],[1931,9]]}}}],["2c:4:n",{"_index":5888,"t":{"1692":{"position":[[1431,6],[1501,6]]}}}],["2c:4o:10n",{"_index":5871,"t":{"1690":{"position":[[395,9]]}}}],["2c:4ou:10n",{"_index":5873,"t":{"1690":{"position":[[424,10]]}}}],["2c:4u:10n",{"_index":5870,"t":{"1690":{"position":[[381,9]]}}}],["2c:4uo:10n",{"_index":5872,"t":{"1690":{"position":[[409,10]]}}}],["2gib",{"_index":6368,"t":{"1891":{"position":[[1522,4]]}}}],["2it",{"_index":6080,"t":{"1725":{"position":[[2152,3]]},"1770":{"position":[[2454,3]]}}}],["2it:4:10n",{"_index":5863,"t":{"1688":{"position":[[1800,9]]}}}],["2k",{"_index":6486,"t":{"1962":{"position":[[4655,3]]}}}],["2l",{"_index":6078,"t":{"1725":{"position":[[2089,2]]},"1770":{"position":[[2391,2]]}}}],["2l:4:10n",{"_index":5860,"t":{"1688":{"position":[[1737,8]]}}}],["2li",{"_index":6079,"t":{"1725":{"position":[[2102,3]]},"1770":{"position":[[2404,3]]}}}],["2li:4:10n",{"_index":5861,"t":{"1688":{"position":[[1750,9]]}}}],["2m",{"_index":2957,"t":{"561":{"position":[[438,5]]}}}],["2nd",{"_index":3041,"t":{"603":{"position":[[529,3]]},"829":{"position":[[737,3]]},"850":{"position":[[682,3],[2113,3],[3447,3]]}}}],["2t",{"_index":6077,"t":{"1725":{"position":[[2063,2]]},"1770":{"position":[[2365,2]]}}}],["2t:4:10n",{"_index":5858,"t":{"1688":{"position":[[1711,8]]}}}],["2v",{"_index":2234,"t":{"416":{"position":[[242,2]]},"420":{"position":[[1484,2],[1588,2]]},"610":{"position":[[1203,2]]},"614":{"position":[[129,2],[187,2]]},"1055":{"position":[[1203,2]]},"1059":{"position":[[129,2],[187,2]]},"1725":{"position":[[2076,2]]},"1731":{"position":[[254,2],[264,2],[364,2],[374,2],[505,2],[516,2]]},"1770":{"position":[[2378,2]]},"1776":{"position":[[327,2],[347,2]]},"1847":{"position":[[97,2],[241,2],[266,2],[408,2]]},"1849":{"position":[[109,2],[261,2],[454,2]]},"1893":{"position":[[31,2]]}}}],["2v:16",{"_index":6014,"t":{"1704":{"position":[[507,6]]}}}],["2v:16:50",{"_index":6015,"t":{"1704":{"position":[[518,8]]}}}],["2v:4",{"_index":5999,"t":{"1704":{"position":[[366,5]]}}}],["2v:4:10",{"_index":6000,"t":{"1704":{"position":[[376,7]]}}}],["2v:4:10n",{"_index":5859,"t":{"1688":{"position":[[1724,8]]}}}],["2v:8",{"_index":5987,"t":{"1704":{"position":[[256,5]]}}}],["2v:8:20",{"_index":5988,"t":{"1704":{"position":[[266,7]]}}}],["2x",{"_index":3505,"t":{"735":{"position":[[442,2]]}}}],["2x200gb",{"_index":5975,"t":{"1702":{"position":[[453,7]]},"1753":{"position":[[452,7]]},"1794":{"position":[[452,7]]}}}],["2x200p_a1",{"_index":6148,"t":{"1753":{"position":[[394,9]]},"1794":{"position":[[394,9]]}}}],["3",{"_index":251,"t":{"27":{"position":[[1567,1],[1605,1]]},"142":{"position":[[639,1]]},"166":{"position":[[1528,2],[1587,1]]},"173":{"position":[[997,1]]},"177":{"position":[[1138,1],[2031,1]]},"278":{"position":[[8,1]]},"317":{"position":[[1063,2],[1588,1]]},"327":{"position":[[376,1]]},"352":{"position":[[1525,3],[1689,3]]},"420":{"position":[[1915,1]]},"462":{"position":[[882,1]]},"468":{"position":[[31,1]]},"474":{"position":[[1655,3]]},"476":{"position":[[571,1],[2464,2]]},"478":{"position":[[392,1],[970,1],[1144,1]]},"659":{"position":[[578,3]]},"693":{"position":[[317,1],[358,1]]},"746":{"position":[[1022,2],[2034,1]]},"780":{"position":[[214,1]]},"791":{"position":[[425,1],[445,1]]},"802":{"position":[[2135,1],[2875,1]]},"873":{"position":[[271,1]]},"1010":{"position":[[1295,1]]},"1395":{"position":[[23,1]]},"1588":{"position":[[1422,1]]},"1692":{"position":[[1512,1]]},"1698":{"position":[[429,1],[444,1]]},"1745":{"position":[[520,1],[535,1]]},"1786":{"position":[[741,1],[756,1]]},"1810":{"position":[[1515,1]]},"1837":{"position":[[484,1]]},"1859":{"position":[[92,2]]},"1904":{"position":[[256,1],[509,1]]},"1915":{"position":[[794,1]]},"1975":{"position":[[1328,3]]},"1977":{"position":[[2414,1]]},"1981":{"position":[[118,1]]},"2096":{"position":[[1613,1]]}}}],["3.0",{"_index":6191,"t":{"1796":{"position":[[32,3]]}}}],["3.0.0",{"_index":5517,"t":{"1431":{"position":[[785,5]]}}}],["3.0.1",{"_index":5422,"t":{"1368":{"position":[[444,6]]}}}],["3.04",{"_index":4387,"t":{"1028":{"position":[[224,5]]}}}],["3.07",{"_index":4350,"t":{"1022":{"position":[[271,5]]}}}],["3.14159",{"_index":833,"t":{"142":{"position":[[607,7]]}}}],["3.2.0",{"_index":5544,"t":{"1465":{"position":[[203,7]]}}}],["3.25ghz",{"_index":5924,"t":{"1698":{"position":[[828,8]]},"1745":{"position":[[935,8],[1193,7]]},"1786":{"position":[[1510,8],[1773,7]]}}}],["3.26.x",{"_index":5556,"t":{"1467":{"position":[[495,8]]}}}],["3.5",{"_index":5865,"t":{"1690":{"position":[[140,5]]},"1727":{"position":[[134,5],[395,3]]},"1772":{"position":[[134,5],[395,3]]}}}],["3.75ghz",{"_index":5926,"t":{"1698":{"position":[[850,8]]},"1745":{"position":[[957,8]]},"1786":{"position":[[1532,8]]}}}],["3/20",{"_index":3406,"t":{"714":{"position":[[555,6]]}}}],["30",{"_index":3148,"t":{"646":{"position":[[32,2],[163,2]]},"791":{"position":[[565,2]]},"860":{"position":[[2395,3]]},"933":{"position":[[22,2]]},"1010":{"position":[[986,2],[1318,2]]},"1088":{"position":[[32,2],[163,2]]},"1622":{"position":[[1814,2]]},"1810":{"position":[[4401,3]]},"1962":{"position":[[3403,3]]}}}],["30.11.2024",{"_index":194,"t":{"25":{"position":[[864,10]]},"27":{"position":[[1505,10],[1866,10]]}}}],["300",{"_index":4595,"t":{"1038":{"position":[[1953,3]]},"1296":{"position":[[62,3]]}}}],["302",{"_index":4557,"t":{"1038":{"position":[[694,5]]}}}],["30t10:14:01.410334z",{"_index":4496,"t":{"1034":{"position":[[6765,19]]}}}],["30t10:14:01.731212z",{"_index":4403,"t":{"1034":{"position":[[1242,19],[1767,19]]}}}],["30t10:14:03.054547z",{"_index":4482,"t":{"1034":{"position":[[5252,19]]}}}],["30t10:14:04.801633z",{"_index":4479,"t":{"1034":{"position":[[5134,19]]}}}],["30t10:14:07.019883z",{"_index":4476,"t":{"1034":{"position":[[5005,19]]}}}],["30t10:14:08.551850z",{"_index":4472,"t":{"1034":{"position":[[4887,19]]}}}],["30t10:14:10.895833z",{"_index":4469,"t":{"1034":{"position":[[4737,19]]}}}],["30t10:14:12.216984z",{"_index":4466,"t":{"1034":{"position":[[4576,19]]}}}],["30t10:14:13.588195z",{"_index":4463,"t":{"1034":{"position":[[4423,19]]}}}],["30t10:14:15.911699z",{"_index":4460,"t":{"1034":{"position":[[4280,19]]}}}],["30t10:14:16.932135z",{"_index":4517,"t":{"1034":{"position":[[8533,19]]}}}],["30t10:14:17.542234z",{"_index":4457,"t":{"1034":{"position":[[4146,19]]}}}],["30t10:14:18.711171z",{"_index":4454,"t":{"1034":{"position":[[4011,19]]}}}],["30t10:14:19.859670z",{"_index":4451,"t":{"1034":{"position":[[3876,19]]}}}],["30t10:14:21.085351z",{"_index":4448,"t":{"1034":{"position":[[3741,19]]}}}],["30t10:14:23.199518z",{"_index":4443,"t":{"1034":{"position":[[3615,19]]}}}],["30t10:14:24.880329z",{"_index":4439,"t":{"1034":{"position":[[3476,19]]}}}],["30t10:14:26.422535z",{"_index":4435,"t":{"1034":{"position":[[3340,19]]}}}],["30t10:14:27.979869z",{"_index":4432,"t":{"1034":{"position":[[3183,19]]}}}],["30t10:14:29.500998z",{"_index":4428,"t":{"1034":{"position":[[3044,19]]}}}],["30t10:14:31.411916z",{"_index":4424,"t":{"1034":{"position":[[2903,19]]}}}],["30t10:14:34.134312z",{"_index":4421,"t":{"1034":{"position":[[2776,19]]}}}],["30t10:14:35.502754z",{"_index":4417,"t":{"1034":{"position":[[2653,19]]}}}],["30t10:14:37.126872z",{"_index":4413,"t":{"1034":{"position":[[2517,19],[5918,19]]}}}],["30t10:14:39.678878z",{"_index":4492,"t":{"1034":{"position":[[5958,19]]}}}],["30t10:14:39.969244z",{"_index":4409,"t":{"1034":{"position":[[1807,19]]}}}],["30t10:14:40.279181z",{"_index":4515,"t":{"1034":{"position":[[8438,19]]}}}],["30t10:14:40.280601z",{"_index":4513,"t":{"1034":{"position":[[8339,19]]}}}],["30t10:14:40.283581z",{"_index":4511,"t":{"1034":{"position":[[8240,19]]}}}],["30t10:14:40.543599z",{"_index":4508,"t":{"1034":{"position":[[8140,19],[9054,19]]}}}],["30t18:50:05.000000",{"_index":4625,"t":{"1047":{"position":[[686,18],[780,18]]}}}],["30t18:50:08.000000",{"_index":4628,"t":{"1047":{"position":[[874,18]]}}}],["31",{"_index":4535,"t":{"1038":{"position":[[106,2],[379,2],[543,2],[763,2],[993,2],[1231,2]]},"1553":{"position":[[559,2]]},"1557":{"position":[[596,2]]},"1559":{"position":[[448,2]]},"1622":{"position":[[1750,2]]},"1810":{"position":[[4427,3]]},"2214":{"position":[[222,4]]}}}],["31.11.2023",{"_index":234,"t":{"27":{"position":[[1237,10]]}}}],["31.12.2023",{"_index":178,"t":{"25":{"position":[[353,10],[489,10]]},"27":{"position":[[574,10],[686,10],[791,10],[1057,10]]}}}],["31/oct/2023",{"_index":4592,"t":{"1038":{"position":[[1913,12]]}}}],["3128",{"_index":3538,"t":{"741":{"position":[[147,8],[255,8],[303,8]]}}}],["31t10:45:35.498718+0000",{"_index":4538,"t":{"1038":{"position":[[165,23]]}}}],["31t11:19:56.329684+0000",{"_index":4567,"t":{"1038":{"position":[[822,23]]}}}],["31t11:19:57.650+0000",{"_index":4553,"t":{"1038":{"position":[[430,20],[594,20]]}}}],["31t11:19:58.566+0000",{"_index":4570,"t":{"1038":{"position":[[1050,20]]}}}],["31t11:19:58.710+0000",{"_index":4582,"t":{"1038":{"position":[[1282,20]]}}}],["32",{"_index":3054,"t":{"610":{"position":[[1319,3]]},"626":{"position":[[402,2]]},"778":{"position":[[795,2]]},"791":{"position":[[330,2]]},"829":{"position":[[325,2]]},"1055":{"position":[[1319,3]]},"1069":{"position":[[402,2]]},"1731":{"position":[[313,3],[324,2],[451,3],[463,2],[537,3],[548,2]]},"1733":{"position":[[803,2]]},"1753":{"position":[[94,2]]},"1776":{"position":[[648,2]]},"1794":{"position":[[94,2]]},"1847":{"position":[[192,2],[209,2],[358,2],[376,2],[438,2],[455,2]]},"1849":{"position":[[188,2],[209,2],[378,2],[400,2],[496,2],[517,2]]}}}],["321",{"_index":4545,"t":{"1038":{"position":[[255,3],[264,3],[912,3],[921,3]]}}}],["322961408",{"_index":4581,"t":{"1038":{"position":[[1217,9]]}}}],["32gib",{"_index":5959,"t":{"1702":{"position":[[150,5]]},"1753":{"position":[[150,5]]},"1794":{"position":[[150,5]]}}}],["33",{"_index":4347,"t":{"1022":{"position":[[234,2]]}}}],["348127232",{"_index":4578,"t":{"1038":{"position":[[1175,9],[1197,9]]}}}],["35",{"_index":4385,"t":{"1028":{"position":[[188,2]]}}}],["3501db829014406884990a1016f3e25d",{"_index":210,"t":{"27":{"position":[[697,32]]}}}],["3519:55",{"_index":4372,"t":{"1026":{"position":[[307,7]]}}}],["3600",{"_index":3311,"t":{"677":{"position":[[399,5]]}}}],["3602",{"_index":5444,"t":{"1379":{"position":[[164,4]]}}}],["3786",{"_index":5445,"t":{"1379":{"position":[[182,4]]}}}],["3829cc7c8f034fc985f5055a1df6f247",{"_index":204,"t":{"27":{"position":[[332,32]]}}}],["3867",{"_index":4487,"t":{"1034":{"position":[[5678,4]]}}}],["3am",{"_index":2038,"t":{"337":{"position":[[1740,3]]}}}],["3k",{"_index":6463,"t":{"1962":{"position":[[1458,3]]}}}],["3rd",{"_index":3042,"t":{"603":{"position":[[536,3]]},"1816":{"position":[[2048,3]]},"2022":{"position":[[429,3],[524,3]]},"2028":{"position":[[574,3]]}}}],["3x",{"_index":5834,"t":{"1688":{"position":[[336,2]]},"1725":{"position":[[428,2]]},"1729":{"position":[[1955,2],[2055,3]]},"1770":{"position":[[428,2]]}}}],["3x/thread",{"_index":5851,"t":{"1688":{"position":[[1232,9]]},"1725":{"position":[[1584,9]]},"1770":{"position":[[1886,9]]}}}],["3x10",{"_index":6087,"t":{"1729":{"position":[[1514,5],[2143,4]]},"1774":{"position":[[1655,5],[2096,4]]}}}],["3x10s_bms_z3",{"_index":6088,"t":{"1729":{"position":[[1562,12]]},"1774":{"position":[[1703,12]]}}}],["4",{"_index":1840,"t":{"317":{"position":[[1114,2]]},"416":{"position":[[245,1]]},"420":{"position":[[1487,1],[1591,1]]},"476":{"position":[[2471,3]]},"573":{"position":[[483,1]]},"610":{"position":[[1150,2]]},"614":{"position":[[132,1],[190,1]]},"780":{"position":[[119,1]]},"829":{"position":[[137,1]]},"836":{"position":[[320,1]]},"873":{"position":[[240,1]]},"1016":{"position":[[1204,2]]},"1034":{"position":[[2577,1],[2713,1],[2836,1],[2963,1],[3104,1],[3243,1],[3400,1],[3536,1],[3675,1],[4340,1],[4483,1],[4636,1],[4797,1],[4947,1],[5065,1],[5194,1]]},"1055":{"position":[[1150,2]]},"1059":{"position":[[132,1],[190,1]]},"1363":{"position":[[8,1]]},"1379":{"position":[[23,1]]},"1400":{"position":[[980,3]]},"1498":{"position":[[70,1]]},"1535":{"position":[[748,1]]},"1588":{"position":[[1428,1]]},"1622":{"position":[[1907,1]]},"1636":{"position":[[1008,1]]},"1698":{"position":[[477,1],[483,1]]},"1702":{"position":[[405,1]]},"1715":{"position":[[42,2]]},"1725":{"position":[[2053,1],[2066,1],[2079,1],[2092,1],[2106,1],[2118,3],[2156,1]]},"1727":{"position":[[382,1]]},"1729":{"position":[[1466,1],[1479,1],[1492,1],[1512,1],[1560,1],[1582,1],[1621,1],[1640,1],[1710,1],[1727,1],[1773,1],[1790,1],[1818,1],[1831,1],[1953,1],[2053,1],[2141,1],[2208,1]]},"1731":{"position":[[231,2],[241,1],[367,2],[377,1]]},"1741":{"position":[[263,1],[276,1],[293,1]]},"1743":{"position":[[651,1],[714,1],[774,1],[822,1],[917,1]]},"1745":{"position":[[568,1],[590,1],[992,1],[1005,1],[1020,1],[1036,1],[1053,1],[1071,1],[1088,1],[1106,1],[1124,1],[1143,1]]},"1753":{"position":[[24,1],[404,1]]},"1770":{"position":[[2355,1],[2368,1],[2381,1],[2394,1],[2408,1],[2420,3],[2458,1]]},"1772":{"position":[[382,1]]},"1774":{"position":[[1607,1],[1620,1],[1633,1],[1653,1],[1701,1],[1723,1],[1762,1],[1781,1],[1851,1],[1868,1],[1914,1],[1931,1],[1959,1],[1972,1],[2094,1],[2161,1]]},"1776":{"position":[[330,1],[350,1]]},"1782":{"position":[[275,1],[288,1],[305,1]]},"1784":{"position":[[664,1],[727,1],[787,1],[835,1],[930,1]]},"1786":{"position":[[789,1],[811,1],[1138,1],[1567,1],[1580,1],[1595,1],[1611,1],[1628,1],[1646,1],[1665,1],[1685,1],[1705,1],[1726,1]]},"1794":{"position":[[24,1],[404,1]]},"1847":{"position":[[75,1],[91,1],[128,1],[160,1],[244,1],[260,1],[269,1],[289,1],[307,1],[441,1]]},"1849":{"position":[[75,1],[94,1],[155,1],[264,1],[283,1],[306,1],[503,1]]},"1893":{"position":[[34,1]]},"1908":{"position":[[48,1]]},"1915":{"position":[[753,1]]},"1919":{"position":[[236,1]]},"1977":{"position":[[2899,3]]},"1981":{"position":[[148,1]]}}}],["4.0",{"_index":1025,"t":{"166":{"position":[[1673,4]]},"614":{"position":[[238,3]]},"1059":{"position":[[238,3]]}}}],["4.0.0",{"_index":5475,"t":{"1397":{"position":[[499,5]]}}}],["4.00",{"_index":4349,"t":{"1022":{"position":[[265,5]]}}}],["4.2.0",{"_index":4714,"t":{"1116":{"position":[[1943,7]]}}}],["4/",{"_index":6378,"t":{"1891":{"position":[[2517,5]]}}}],["4/20",{"_index":3409,"t":{"714":{"position":[[603,6]]}}}],["40",{"_index":3586,"t":{"746":{"position":[[1937,3],[3085,3]]},"1866":{"position":[[138,2]]}}}],["403",{"_index":4999,"t":{"1262":{"position":[[4356,4]]}}}],["408f",{"_index":4614,"t":{"1041":{"position":[[693,4]]}}}],["4096",{"_index":3356,"t":{"693":{"position":[[530,4]]},"1407":{"position":[[183,4]]}}}],["40e1",{"_index":2844,"t":{"489":{"position":[[399,4]]}}}],["40e4",{"_index":2849,"t":{"489":{"position":[[495,4]]}}}],["410b",{"_index":4562,"t":{"1038":{"position":[[733,4]]}}}],["414",{"_index":2679,"t":{"472":{"position":[[2012,5]]}}}],["417",{"_index":2678,"t":{"472":{"position":[[1852,5]]}}}],["424",{"_index":2471,"t":{"457":{"position":[[408,5]]}}}],["4340",{"_index":4639,"t":{"1093":{"position":[[161,4]]}}}],["443",{"_index":2866,"t":{"491":{"position":[[560,3]]},"1168":{"position":[[280,3],[1394,3]]}}}],["44d2",{"_index":3153,"t":{"646":{"position":[[126,4],[222,4]]},"1088":{"position":[[126,4],[222,4]]}}}],["45",{"_index":412,"t":{"62":{"position":[[47,3]]}}}],["46",{"_index":4503,"t":{"1034":{"position":[[7517,2]]}}}],["4769",{"_index":3173,"t":{"653":{"position":[[253,4]]}}}],["47951",{"_index":5448,"t":{"1379":{"position":[[272,5]]}}}],["48",{"_index":6226,"t":{"1810":{"position":[[2724,2]]}}}],["486b",{"_index":3862,"t":{"802":{"position":[[1980,4],[2720,4]]}}}],["48hr",{"_index":6227,"t":{"1810":{"position":[[2790,6]]}}}],["49",{"_index":4400,"t":{"1034":{"position":[[1219,2],[1714,4],[2504,2],[2640,2],[2763,2],[2890,2],[3031,2],[3170,2],[3327,2],[3463,2],[3602,2],[3728,2],[3863,2],[3998,2],[4133,2],[4267,2],[4410,2],[4563,2],[4724,2],[4874,2],[4992,2],[5121,2],[5239,2],[6647,2],[8106,2],[8206,2],[8305,2],[8404,2],[8500,2]]}}}],["4925967416894fd78be6701689059653",{"_index":179,"t":{"25":{"position":[[364,32]]}}}],["49cc3d72fbdf41fe8dc407f57f026dbf",{"_index":187,"t":{"25":{"position":[[629,32],[766,32]]}}}],["4:16",{"_index":5989,"t":{"1704":{"position":[[274,4]]},"1731":{"position":[[272,4]]}}}],["4:32",{"_index":6016,"t":{"1704":{"position":[[527,4]]},"1731":{"position":[[525,4]]}}}],["4:8",{"_index":6001,"t":{"1704":{"position":[[384,3]]},"1731":{"position":[[382,3]]}}}],["4_bms_z3",{"_index":6095,"t":{"1729":{"position":[[1937,8]]},"1774":{"position":[[2078,8]]}}}],["4ba0",{"_index":4605,"t":{"1041":{"position":[[519,4]]}}}],["4bc3",{"_index":3158,"t":{"646":{"position":[[275,4]]},"1088":{"position":[[275,4]]}}}],["4c",{"_index":6147,"t":{"1753":{"position":[[388,2]]},"1786":{"position":[[1156,2]]},"1794":{"position":[[388,2]]}}}],["4c:16:2x200p",{"_index":5970,"t":{"1702":{"position":[[389,12]]}}}],["4ceqrvb5pxnjywdzk9_gtjziz31a7sd4lpiy82o5n9nrydodw",{"_index":3876,"t":{"802":{"position":[[3290,49]]}}}],["4d3e",{"_index":2837,"t":{"489":{"position":[[303,4]]}}}],["4f16",{"_index":2855,"t":{"489":{"position":[[603,4]]}}}],["4f9a",{"_index":4638,"t":{"1093":{"position":[[156,4]]}}}],["4ff97734574146ccb4c7e7568bc1e36f",{"_index":228,"t":{"27":{"position":[[1152,32]]}}}],["4gib",{"_index":5956,"t":{"1702":{"position":[[58,4]]},"1753":{"position":[[58,4]]},"1794":{"position":[[58,4]]}}}],["4k",{"_index":6467,"t":{"1962":{"position":[[2059,3]]}}}],["4o",{"_index":6082,"t":{"1727":{"position":[[424,2]]},"1772":{"position":[[424,2]]}}}],["4ou",{"_index":6084,"t":{"1727":{"position":[[453,3]]},"1772":{"position":[[453,3]]}}}],["4th",{"_index":4699,"t":{"1114":{"position":[[1016,3]]}}}],["4u",{"_index":6081,"t":{"1727":{"position":[[410,2]]},"1772":{"position":[[410,2]]}}}],["4uo",{"_index":6083,"t":{"1727":{"position":[[438,3]]},"1772":{"position":[[438,3]]}}}],["4v",{"_index":3051,"t":{"610":{"position":[[1259,2]]},"778":{"position":[[764,2]]},"791":{"position":[[303,2]]},"1055":{"position":[[1259,2]]},"1722":{"position":[[351,2]]},"1731":{"position":[[281,2],[292,2],[390,2],[400,2],[534,2],[545,2]]},"1767":{"position":[[351,2]]},"1847":{"position":[[122,2],[149,2],[302,2],[435,2]]},"1849":{"position":[[146,2],[298,2],[493,2]]},"1893":{"position":[[48,2]]}}}],["4v:16",{"_index":5990,"t":{"1704":{"position":[[283,6]]}}}],["4v:16:50",{"_index":5991,"t":{"1704":{"position":[[294,8]]}}}],["4v:32",{"_index":6017,"t":{"1704":{"position":[[536,6]]}}}],["4v:32:100",{"_index":6018,"t":{"1704":{"position":[[547,9]]}}}],["4v:8",{"_index":6002,"t":{"1704":{"position":[[392,5]]}}}],["4v:8:20",{"_index":6003,"t":{"1704":{"position":[[402,7]]}}}],["4vcpu",{"_index":6073,"t":{"1722":{"position":[[378,6]]},"1767":{"position":[[378,6]]}}}],["5",{"_index":1842,"t":{"317":{"position":[[1164,2]]},"420":{"position":[[3645,1]]},"462":{"position":[[893,1]]},"476":{"position":[[2372,2]]},"569":{"position":[[55,1]]},"836":{"position":[[587,1]]},"860":{"position":[[2274,2]]},"873":{"position":[[246,1]]},"1034":{"position":[[6753,1]]},"1038":{"position":[[372,2],[1465,1],[2193,1]]},"1207":{"position":[[3318,2]]},"1365":{"position":[[554,2]]},"1462":{"position":[[38,1]]},"1484":{"position":[[23,1]]},"1704":{"position":[[96,2]]},"1729":{"position":[[36,2]]},"1731":{"position":[[94,2],[354,1],[578,1]]},"1733":{"position":[[341,1]]},"1753":{"position":[[187,1]]},"1760":{"position":[[42,2]]},"1774":{"position":[[36,2]]},"1776":{"position":[[77,1]]},"1794":{"position":[[187,1]]},"1849":{"position":[[231,1],[249,1],[539,1],[558,1]]},"1962":{"position":[[5161,3]]},"1977":{"position":[[2503,3]]},"1981":{"position":[[192,1]]},"2096":{"position":[[1635,1]]}}}],["5.0.0",{"_index":4702,"t":{"1116":{"position":[[153,5],[159,5],[879,6],[2625,6]]},"1365":{"position":[[139,5]]},"1372":{"position":[[65,5]]},"1374":{"position":[[609,5]]}}}],["5.0.0/openstack.yml",{"_index":4708,"t":{"1116":{"position":[[847,19],[1207,19]]}}}],["5.0.0a",{"_index":4700,"t":{"1116":{"position":[[126,6],[1802,8],[1973,8]]}}}],["5.0.0b",{"_index":4701,"t":{"1116":{"position":[[136,6],[143,6]]}}}],["5.0.x",{"_index":5463,"t":{"1385":{"position":[[207,7]]}}}],["5.1.0",{"_index":4703,"t":{"1116":{"position":[[168,5],[174,5]]}}}],["5.1.66.255",{"_index":2254,"t":{"418":{"position":[[499,13]]}}}],["5.17",{"_index":6295,"t":{"1826":{"position":[[1344,4]]}}}],["5.18",{"_index":5642,"t":{"1555":{"position":[[200,4]]},"1826":{"position":[[1245,5]]},"1835":{"position":[[70,4]]},"1837":{"position":[[427,6]]}}}],["5.2.0",{"_index":4704,"t":{"1116":{"position":[[183,5],[189,5]]}}}],["5.3.0",{"_index":4705,"t":{"1116":{"position":[[198,5]]}}}],["5.4",{"_index":6279,"t":{"1826":{"position":[[303,3]]}}}],["5.x",{"_index":5464,"t":{"1385":{"position":[[278,6]]}}}],["5/20",{"_index":3412,"t":{"714":{"position":[[633,6]]}}}],["50",{"_index":2266,"t":{"418":{"position":[[828,2]]},"778":{"position":[[769,3]]},"791":{"position":[[308,2],[333,2]]},"860":{"position":[[2318,3]]},"1704":{"position":[[107,3]]},"1706":{"position":[[518,3]]},"1722":{"position":[[357,2]]},"1729":{"position":[[47,3]]},"1731":{"position":[[105,3],[298,2],[434,2],[522,2]]},"1733":{"position":[[521,3]]},"1751":{"position":[[644,2],[889,2]]},"1767":{"position":[[357,2]]},"1774":{"position":[[47,3]]},"1776":{"position":[[257,3]]},"1792":{"position":[[644,2],[889,2]]},"1849":{"position":[[152,2],[172,2],[341,2],[361,2],[460,2],[480,2]]},"1962":{"position":[[2897,3],[4625,3]]}}}],["500",{"_index":4977,"t":{"1262":{"position":[[1948,4]]},"1704":{"position":[[121,4]]},"1729":{"position":[[61,4]]},"1731":{"position":[[119,4]]},"1774":{"position":[[61,4]]}}}],["5000",{"_index":2221,"t":{"386":{"position":[[266,4]]},"504":{"position":[[751,5]]}}}],["500s_gna",{"_index":6186,"t":{"1788":{"position":[[1018,8]]}}}],["50gb",{"_index":5960,"t":{"1702":{"position":[[161,4]]},"1722":{"position":[[434,4]]},"1753":{"position":[[161,4]]},"1767":{"position":[[434,4]]},"1794":{"position":[[161,4]]}}}],["50n",{"_index":6139,"t":{"1751":{"position":[[669,4]]},"1792":{"position":[[669,4]]}}}],["50n_a2",{"_index":6141,"t":{"1751":{"position":[[705,6]]}}}],["50n_i2",{"_index":6140,"t":{"1751":{"position":[[684,6]]},"1792":{"position":[[684,6]]}}}],["50n_z2",{"_index":6190,"t":{"1792":{"position":[[705,6]]}}}],["50p_i1",{"_index":6143,"t":{"1753":{"position":[[97,6]]},"1794":{"position":[[97,6]]}}}],["512",{"_index":3116,"t":{"632":{"position":[[640,3]]},"1075":{"position":[[640,3]]}}}],["5672",{"_index":3529,"t":{"739":{"position":[[757,10]]}}}],["577",{"_index":4547,"t":{"1038":{"position":[[282,3],[939,3]]}}}],["58732",{"_index":4599,"t":{"1038":{"position":[[2005,6]]}}}],["5:20.10.13~3",{"_index":4942,"t":{"1207":{"position":[[3062,12]]}}}],["5:20.10.14~3",{"_index":4941,"t":{"1207":{"position":[[2951,12]]}}}],["5:20.10.15~3",{"_index":4940,"t":{"1207":{"position":[[2840,12]]}}}],["5:20.10.16~3",{"_index":4939,"t":{"1207":{"position":[[2729,12]]}}}],["5:20.10.17~3",{"_index":4938,"t":{"1207":{"position":[[2618,12]]}}}],["5:20.10.18~3",{"_index":4937,"t":{"1207":{"position":[[2507,12]]}}}],["5:20.10.19~3",{"_index":4936,"t":{"1207":{"position":[[2396,12]]}}}],["5:20.10.20~3",{"_index":4935,"t":{"1207":{"position":[[2285,12]]}}}],["5:20.10.21~3",{"_index":4934,"t":{"1207":{"position":[[2174,12]]}}}],["5:20.10.22~3",{"_index":4933,"t":{"1207":{"position":[[2063,12]]}}}],["5:20.10.23~3",{"_index":4932,"t":{"1207":{"position":[[1952,12]]}}}],["5:20.10.24",{"_index":4910,"t":{"1207":{"position":[[128,12]]}}}],["5:20.10.24~3",{"_index":4930,"t":{"1207":{"position":[[1841,12]]}}}],["5:23.0.0",{"_index":4929,"t":{"1207":{"position":[[1728,8]]}}}],["5:23.0.1",{"_index":4928,"t":{"1207":{"position":[[1615,8]]}}}],["5:23.0.2",{"_index":4927,"t":{"1207":{"position":[[1502,8]]}}}],["5:23.0.3",{"_index":4926,"t":{"1207":{"position":[[1389,8]]}}}],["5:23.0.4",{"_index":4925,"t":{"1207":{"position":[[1276,8]]}}}],["5:23.0.5",{"_index":4924,"t":{"1207":{"position":[[1163,8]]}}}],["5:23.0.6",{"_index":4923,"t":{"1207":{"position":[[1050,8]]}}}],["5:24.0.0",{"_index":4922,"t":{"1207":{"position":[[937,8]]}}}],["5:24.0.1",{"_index":4921,"t":{"1207":{"position":[[824,8]]}}}],["5:24.0.2",{"_index":4920,"t":{"1207":{"position":[[711,8]]}}}],["5:24.0.3",{"_index":4919,"t":{"1207":{"position":[[598,8]]}}}],["5:24.0.4",{"_index":4918,"t":{"1207":{"position":[[485,8]]}}}],["5:24.0.5",{"_index":4917,"t":{"1207":{"position":[[372,8]]}}}],["5:24.0.6",{"_index":4913,"t":{"1207":{"position":[[259,8]]}}}],["5ftj",{"_index":2119,"t":{"352":{"position":[[1580,6]]}}}],["5gb",{"_index":5963,"t":{"1702":{"position":[[241,3]]},"1753":{"position":[[241,3]]},"1794":{"position":[[241,3]]}}}],["5gi",{"_index":2791,"t":{"486":{"position":[[182,5]]},"489":{"position":[[422,3],[518,3]]}}}],["5m",{"_index":3579,"t":{"746":{"position":[[1770,4],[3036,2]]}}}],["5m11",{"_index":2852,"t":{"489":{"position":[[541,5]]}}}],["5n",{"_index":6100,"t":{"1733":{"position":[[398,2]]},"1776":{"position":[[134,2]]}}}],["5x",{"_index":5833,"t":{"1688":{"position":[[320,2]]},"1725":{"position":[[412,2]]},"1770":{"position":[[412,2]]}}}],["5x/core",{"_index":5850,"t":{"1688":{"position":[[1219,7]]},"1725":{"position":[[1571,7]]},"1770":{"position":[[1873,7]]}}}],["6",{"_index":1705,"t":{"282":{"position":[[10,1]]},"317":{"position":[[1227,2]]},"472":{"position":[[727,1]]},"476":{"position":[[2379,3]]},"693":{"position":[[277,1]]},"780":{"position":[[277,1]]},"1010":{"position":[[900,1],[1145,1]]},"1112":{"position":[[38,1]]},"1535":{"position":[[753,1]]},"1622":{"position":[[1912,1]]},"1636":{"position":[[1013,1]]}}}],["6.0.0",{"_index":3503,"t":{"735":{"position":[[229,5],[783,6],[1222,8],[1696,6]]},"1465":{"position":[[52,6]]},"1467":{"position":[[67,5]]},"1477":{"position":[[65,5]]}}}],["6.0.0b",{"_index":4690,"t":{"1114":{"position":[[455,6]]}}}],["6.0.2",{"_index":3428,"t":{"714":{"position":[[1013,8]]},"716":{"position":[[154,8]]},"724":{"position":[[1018,5]]}}}],["6.1.0",{"_index":3236,"t":{"665":{"position":[[12,6]]},"1482":{"position":[[301,7]]}}}],["6/20",{"_index":3414,"t":{"714":{"position":[[660,6]]}}}],["60",{"_index":4340,"t":{"1018":{"position":[[237,3]]},"1038":{"position":[[310,2],[319,2],[967,2],[976,2]]}}}],["600",{"_index":2889,"t":{"495":{"position":[[5,5]]}}}],["602778bad3d3470cbe58c4f7611e8eb7",{"_index":211,"t":{"27":{"position":[[802,32]]}}}],["6292",{"_index":2892,"t":{"495":{"position":[[511,5]]}}}],["62cdj",{"_index":2120,"t":{"352":{"position":[[1613,6]]}}}],["64",{"_index":3058,"t":{"614":{"position":[[224,2]]},"661":{"position":[[819,2]]},"1010":{"position":[[1668,2]]},"1059":{"position":[[224,2]]},"1698":{"position":[[221,4],[250,3],[265,3]]},"1702":{"position":[[53,4],[352,2]]},"1704":{"position":[[64,4]]},"1706":{"position":[[40,2]]},"1731":{"position":[[62,4]]},"1733":{"position":[[40,2]]},"1745":{"position":[[221,4],[341,3],[356,3]]},"1753":{"position":[[53,4],[271,2],[351,2]]},"1786":{"position":[[273,2],[295,2],[321,2],[562,3],[577,3]]},"1788":{"position":[[1015,2]]},"1794":{"position":[[53,4],[271,2],[351,2]]},"1845":{"position":[[62,4]]}}}],["64_ib",{"_index":6093,"t":{"1729":{"position":[[1805,5]]},"1753":{"position":[[283,5]]},"1774":{"position":[[1946,5]]},"1794":{"position":[[283,5]]}}}],["64cb",{"_index":2836,"t":{"489":{"position":[[298,4]]}}}],["64gib",{"_index":5966,"t":{"1702":{"position":[[311,5]]},"1704":{"position":[[890,5]]},"1731":{"position":[[912,5]]},"1753":{"position":[[311,5]]},"1794":{"position":[[311,5]]},"1853":{"position":[[318,5]]}}}],["6510",{"_index":4486,"t":{"1034":{"position":[[5673,4]]}}}],["669c",{"_index":3172,"t":{"653":{"position":[[248,4]]}}}],["68",{"_index":4402,"t":{"1034":{"position":[[1229,2],[1895,3],[6748,2]]}}}],["69",{"_index":4399,"t":{"1034":{"position":[[1182,2],[1450,2],[1590,2]]}}}],["6a",{"_index":237,"t":{"27":{"position":[[1296,2]]}}}],["6c6eba43f616bc6b.yaml",{"_index":4723,"t":{"1122":{"position":[[409,21]]}}}],["6m12",{"_index":2841,"t":{"489":{"position":[[349,5],[445,5],[649,5]]}}}],["7",{"_index":1845,"t":{"317":{"position":[[1296,2]]},"1026":{"position":[[211,1]]}}}],["7,2",{"_index":6318,"t":{"1843":{"position":[[395,3]]}}}],["7.2h",{"_index":5853,"t":{"1688":{"position":[[1355,4]]},"1725":{"position":[[1707,4]]},"1770":{"position":[[2009,4]]}}}],["7.2h/month",{"_index":5836,"t":{"1688":{"position":[[506,12]]},"1725":{"position":[[611,12]]},"1770":{"position":[[611,12]]}}}],["7/20",{"_index":3417,"t":{"714":{"position":[[698,6]]}}}],["70",{"_index":4058,"t":{"852":{"position":[[767,2]]}}}],["718964b4b87446688ac04b151519fb51",{"_index":267,"t":{"32":{"position":[[74,32]]}}}],["734f9b6a",{"_index":2847,"t":{"489":{"position":[[481,8]]}}}],["7636",{"_index":1589,"t":{"247":{"position":[[569,5]]},"255":{"position":[[156,5]]}}}],["792e9b3665d8",{"_index":2857,"t":{"489":{"position":[[613,12]]}}}],["7fa7e7c88700",{"_index":4554,"t":{"1038":{"position":[[451,12],[615,12]]}}}],["7fa7eb48f700",{"_index":4583,"t":{"1038":{"position":[[1303,12]]}}}],["7fdbc9728700",{"_index":4571,"t":{"1038":{"position":[[1071,12]]}}}],["8",{"_index":1847,"t":{"317":{"position":[[1377,2]]},"474":{"position":[[3285,2]]},"610":{"position":[[1206,2]]},"632":{"position":[[629,1]]},"634":{"position":[[623,1]]},"778":{"position":[[767,1]]},"783":{"position":[[258,1]]},"791":{"position":[[306,1]]},"812":{"position":[[304,1],[419,2],[444,2],[461,2],[487,2],[513,2],[538,2],[560,2]]},"829":{"position":[[388,1]]},"836":{"position":[[141,1],[1262,1]]},"843":{"position":[[45,1]]},"860":{"position":[[573,1],[2755,1]]},"1034":{"position":[[5894,1]]},"1055":{"position":[[1206,2]]},"1075":{"position":[[629,1]]},"1077":{"position":[[623,1]]},"1116":{"position":[[2284,2]]},"1688":{"position":[[735,2]]},"1702":{"position":[[104,1]]},"1725":{"position":[[830,2]]},"1731":{"position":[[257,2],[267,1],[393,2],[403,1],[481,2],[491,1]]},"1753":{"position":[[104,1]]},"1770":{"position":[[845,2]]},"1794":{"position":[[104,1]]},"1805":{"position":[[118,3]]},"1847":{"position":[[100,1],[116,1],[195,1],[305,1],[321,1],[333,1],[386,1],[402,1]]},"1849":{"position":[[112,1],[131,1],[195,1],[301,1],[320,1],[344,1],[420,1],[439,1]]},"1908":{"position":[[184,2]]},"1919":{"position":[[423,3]]}}}],["8.8.4.4",{"_index":3282,"t":{"667":{"position":[[322,9]]}}}],["8.8.8.8",{"_index":3281,"t":{"667":{"position":[[311,10]]},"791":{"position":[[236,11]]},"850":{"position":[[3305,7]]}}}],["8/20",{"_index":3385,"t":{"712":{"position":[[406,6]]},"714":{"position":[[740,6]]}}}],["80",{"_index":2865,"t":{"491":{"position":[[556,3]]},"1022":{"position":[[225,2]]},"1028":{"position":[[179,2]]},"1168":{"position":[[273,2],[1389,2]]}}}],["80/tcp",{"_index":2823,"t":{"486":{"position":[[1716,6]]}}}],["8080",{"_index":2828,"t":{"486":{"position":[[1845,4],[1880,4]]}}}],["8080:80",{"_index":2826,"t":{"486":{"position":[[1803,7]]}}}],["8192",{"_index":3359,"t":{"693":{"position":[[608,4]]}}}],["84a5",{"_index":4640,"t":{"1093":{"position":[[166,4]]}}}],["84dd86f598",{"_index":2126,"t":{"352":{"position":[[1744,10],[1788,10]]}}}],["8593",{"_index":2845,"t":{"489":{"position":[[404,4]]}}}],["8601",{"_index":1071,"t":{"171":{"position":[[629,4]]}}}],["890",{"_index":4481,"t":{"1034":{"position":[[5176,3]]}}}],["891",{"_index":4478,"t":{"1034":{"position":[[5047,3]]}}}],["892",{"_index":4474,"t":{"1034":{"position":[[4929,3]]}}}],["893",{"_index":4471,"t":{"1034":{"position":[[4779,3]]}}}],["894",{"_index":4468,"t":{"1034":{"position":[[4618,3]]}}}],["895",{"_index":4465,"t":{"1034":{"position":[[4465,3]]}}}],["896",{"_index":4462,"t":{"1034":{"position":[[4322,3]]}}}],["897",{"_index":4459,"t":{"1034":{"position":[[4188,3]]}}}],["898",{"_index":4456,"t":{"1034":{"position":[[4053,3]]}}}],["899",{"_index":4453,"t":{"1034":{"position":[[3918,3]]}}}],["8:16",{"_index":6004,"t":{"1704":{"position":[[410,4]]},"1731":{"position":[[408,4]]}}}],["8:32",{"_index":5992,"t":{"1704":{"position":[[303,4]]},"1731":{"position":[[301,4]]}}}],["8a2ad60c",{"_index":2842,"t":{"489":{"position":[[385,8]]}}}],["8a553e69",{"_index":4603,"t":{"1041":{"position":[[505,8]]}}}],["8a69cc7a",{"_index":4560,"t":{"1038":{"position":[[718,9]]}}}],["8bit",{"_index":4375,"t":{"1026":{"position":[[357,4]]}}}],["8bit:ascii",{"_index":4374,"t":{"1026":{"position":[[346,10]]}}}],["8c:16:50",{"_index":6053,"t":{"1708":{"position":[[844,8]]}}}],["8gib",{"_index":6037,"t":{"1706":{"position":[[537,4]]},"1717":{"position":[[1292,4]]},"1733":{"position":[[540,4]]},"1762":{"position":[[1191,4]]},"1776":{"position":[[276,4]]}}}],["8min",{"_index":2642,"t":{"470":{"position":[[2109,7]]}}}],["8s",{"_index":6102,"t":{"1733":{"position":[[499,2]]},"1776":{"position":[[235,2]]}}}],["8t",{"_index":6138,"t":{"1751":{"position":[[638,2],[663,2],[678,2],[699,2],[883,2]]},"1792":{"position":[[638,2],[663,2],[678,2],[699,2],[883,2]]}}}],["8t:16:50",{"_index":6048,"t":{"1708":{"position":[[599,8]]}}}],["8t:16:50n",{"_index":6049,"t":{"1708":{"position":[[624,10],[639,9],[660,9]]}}}],["8th",{"_index":5436,"t":{"1377":{"position":[[754,3]]}}}],["8ti",{"_index":6142,"t":{"1753":{"position":[[90,3]]},"1794":{"position":[[90,3]]}}}],["8ti:32:50p",{"_index":5957,"t":{"1702":{"position":[[90,10]]}}}],["8v",{"_index":3053,"t":{"610":{"position":[[1316,2]]},"778":{"position":[[792,2]]},"791":{"position":[[327,2]]},"1055":{"position":[[1316,2]]},"1731":{"position":[[310,2],[321,2],[417,2],[428,2]]},"1733":{"position":[[800,2]]},"1776":{"position":[[645,2]]},"1847":{"position":[[189,2],[327,2]]},"1849":{"position":[[185,2],[335,2]]}}}],["8v:16",{"_index":6005,"t":{"1704":{"position":[[419,6]]}}}],["8v:16:50",{"_index":6006,"t":{"1704":{"position":[[430,8]]}}}],["8v:32",{"_index":5993,"t":{"1704":{"position":[[312,6]]}}}],["8v:32:100",{"_index":5994,"t":{"1704":{"position":[[323,9]]},"1706":{"position":[[638,11]]}}}],["9",{"_index":1848,"t":{"317":{"position":[[1464,2]]},"780":{"position":[[156,1]]},"1872":{"position":[[189,6]]},"1874":{"position":[[226,6]]},"1962":{"position":[[4315,2]]}}}],["9.0",{"_index":6228,"t":{"1810":{"position":[[2874,3]]}}}],["9.9.9.9",{"_index":3797,"t":{"791":{"position":[[248,10]]},"850":{"position":[[3315,7]]}}}],["9/20",{"_index":3388,"t":{"712":{"position":[[436,6]]},"714":{"position":[[770,6]]}}}],["90",{"_index":3760,"t":{"780":{"position":[[166,2]]},"787":{"position":[[2958,2]]}}}],["900",{"_index":4450,"t":{"1034":{"position":[[3783,3]]}}}],["9000",{"_index":3296,"t":{"670":{"position":[[189,4]]}}}],["9008d3d7",{"_index":3156,"t":{"646":{"position":[[261,8]]},"1088":{"position":[[261,8]]}}}],["901",{"_index":4445,"t":{"1034":{"position":[[3657,3]]}}}],["902",{"_index":4441,"t":{"1034":{"position":[[3518,3]]}}}],["903",{"_index":4437,"t":{"1034":{"position":[[3382,3]]}}}],["904",{"_index":4434,"t":{"1034":{"position":[[3225,3]]}}}],["905",{"_index":4430,"t":{"1034":{"position":[[3086,3]]}}}],["906",{"_index":4426,"t":{"1034":{"position":[[2945,3]]}}}],["907",{"_index":4423,"t":{"1034":{"position":[[2818,3]]}}}],["908",{"_index":4419,"t":{"1034":{"position":[[2695,3]]}}}],["909",{"_index":4415,"t":{"1034":{"position":[[2559,3]]}}}],["90n20",{"_index":245,"t":{"27":{"position":[[1472,5]]}}}],["910",{"_index":4410,"t":{"1034":{"position":[[2449,3],[5508,3],[5649,3]]}}}],["9100",{"_index":4028,"t":{"850":{"position":[[1748,5],[1925,4]]}}}],["91091d4039a6457db27d48d58bb1b4e4",{"_index":216,"t":{"27":{"position":[[888,32]]}}}],["9200",{"_index":3518,"t":{"737":{"position":[[405,4]]},"746":{"position":[[3050,4]]}}}],["9262",{"_index":4615,"t":{"1041":{"position":[[698,4]]}}}],["93956190702b4a7d8a8886806d57713f",{"_index":220,"t":{"27":{"position":[[973,32]]}}}],["941c",{"_index":3159,"t":{"646":{"position":[[280,4]]},"1088":{"position":[[280,4]]}}}],["95a07c43",{"_index":3151,"t":{"646":{"position":[[112,8],[208,8]]},"1088":{"position":[[112,8],[208,8]]}}}],["982221c1",{"_index":2835,"t":{"489":{"position":[[289,8]]}}}],["99",{"_index":5832,"t":{"1688":{"position":[[244,4],[469,4]]},"1725":{"position":[[336,4],[574,4]]},"1770":{"position":[[336,4],[574,4]]},"1843":{"position":[[332,4]]}}}],["99,9",{"_index":1876,"t":{"319":{"position":[[1586,5]]}}}],["9:00",{"_index":1067,"t":{"171":{"position":[[521,4]]}}}],["9])/printf",{"_index":2598,"t":{"462":{"position":[[3240,10],[3354,10],[3913,10],[4027,10]]},"474":{"position":[[3600,10]]}}}],["9]+(.[0",{"_index":6340,"t":{"1872":{"position":[[181,7]]},"1874":{"position":[[218,7]]}}}],["9].[0",{"_index":6339,"t":{"1872":{"position":[[175,5]]},"1874":{"position":[[212,5]]}}}],["9][0",{"_index":2597,"t":{"462":{"position":[[3235,4],[3349,4],[3908,4],[4022,4]]},"474":{"position":[[3595,4]]}}}],["9a1576af59644a2dbbace773ad17158d",{"_index":174,"t":{"25":{"position":[[235,32]]}}}],["9b7140bfe628468ab9b86b365f9ac4c2",{"_index":3682,"t":{"749":{"position":[[6624,32]]}}}],["9b7a73e516be4cd1acbd63d543985c52",{"_index":201,"t":{"27":{"position":[[257,32]]}}}],["9cee",{"_index":2848,"t":{"489":{"position":[[490,4]]}}}],["9de7d8dc2d674e52be44904d6b338b0b",{"_index":208,"t":{"27":{"position":[[492,32]]}}}],["9e1c",{"_index":2850,"t":{"489":{"position":[[500,4]]}}}],["9eea",{"_index":4488,"t":{"1034":{"position":[[5683,4]]}}}],["_",{"_index":4083,"t":{"856":{"position":[[989,3]]},"1755":{"position":[[138,1]]},"1796":{"position":[[274,1]]}}}],["_/g",{"_index":6154,"t":{"1755":{"position":[[485,5]]},"1796":{"position":[[621,5]]}}}],["_[g/g]x[n",{"_index":6181,"t":{"1788":{"position":[[8,11]]}}}],["__default__",{"_index":3803,"t":{"791":{"position":[[603,11]]}}}],["_arch[n][h",{"_index":6174,"t":{"1786":{"position":[[8,11]]}}}],["_bms_z3",{"_index":6091,"t":{"1729":{"position":[[1775,7]]},"1774":{"position":[[1916,7]]}}}],["_bms_z3h_gna",{"_index":6092,"t":{"1729":{"position":[[1792,12]]},"1774":{"position":[[1933,12]]}}}],["_ext",{"_index":6071,"t":{"1722":{"position":[[114,6]]},"1767":{"position":[[114,6]]}}}],["_g",{"_index":6172,"t":{"1780":{"position":[[1999,2],[2039,2]]}}}],["_gx[n",{"_index":6132,"t":{"1747":{"position":[[0,7],[108,7]]}}}],["_hwv",{"_index":6116,"t":{"1743":{"position":[[127,4],[452,4]]},"1784":{"position":[[8,4],[140,4],[465,4]]}}}],["_hyp",{"_index":6173,"t":{"1782":{"position":[[8,4]]}}}],["_hyp][_hwv][_[arch[n][h][_[g/g]x[n",{"_index":6111,"t":{"1739":{"position":[[1678,37]]}}}],["_hyp][_hwv][_arch[n][h]][_[g/g]x[n",{"_index":6170,"t":{"1780":{"position":[[1679,37]]}}}],["_ib",{"_index":6094,"t":{"1729":{"position":[[1820,3]]},"1749":{"position":[[0,3]]},"1774":{"position":[[1961,3]]},"1790":{"position":[[8,3]]}}}],["_set_new_cache_s",{"_index":4575,"t":{"1038":{"position":[[1121,20]]}}}],["_without",{"_index":6027,"t":{"1704":{"position":[[1297,8]]}}}],["a)gplv3",{"_index":1284,"t":{"183":{"position":[[1149,8]]}}}],["a07c811315ad40f585945b2939ef12dd",{"_index":264,"t":{"27":{"position":[[1800,32]]}}}],["a1",{"_index":5971,"t":{"1702":{"position":[[402,2]]}}}],["a2",{"_index":6051,"t":{"1708":{"position":[[670,2]]}}}],["a30",{"_index":6189,"t":{"1788":{"position":[[1213,4]]}}}],["a32c",{"_index":3174,"t":{"653":{"position":[[258,4]]}}}],["a5cc",{"_index":2856,"t":{"489":{"position":[[608,4]]}}}],["a5d4",{"_index":4606,"t":{"1041":{"position":[[524,4]]}}}],["a6ad",{"_index":3863,"t":{"802":{"position":[[1985,4],[2725,4]]}}}],["a71x/neon2",{"_index":5918,"t":{"1698":{"position":[[454,10]]},"1745":{"position":[[545,10]]},"1786":{"position":[[766,10]]}}}],["a740c178148d",{"_index":3160,"t":{"646":{"position":[[285,12]]},"1088":{"position":[[285,12]]}}}],["a76",{"_index":5910,"t":{"1698":{"position":[[325,3]]},"1745":{"position":[[416,3]]},"1753":{"position":[[428,4]]},"1786":{"position":[[637,3]]},"1794":{"position":[[428,4]]}}}],["a76/neon1",{"_index":5913,"t":{"1698":{"position":[[358,9]]},"1745":{"position":[[449,9]]},"1786":{"position":[[670,9]]}}}],["a77d",{"_index":2838,"t":{"489":{"position":[[308,4]]}}}],["a78",{"_index":5973,"t":{"1702":{"position":[[429,4]]}}}],["a78/x1/neov1",{"_index":5915,"t":{"1698":{"position":[[406,12]]},"1745":{"position":[[497,12]]},"1786":{"position":[[718,12]]}}}],["a989e52427fa",{"_index":3155,"t":{"646":{"position":[[136,12],[232,12]]},"1088":{"position":[[136,12],[232,12]]}}}],["a99a",{"_index":2854,"t":{"489":{"position":[[598,4]]}}}],["a=amper",{"_index":5943,"t":{"1700":{"position":[[791,9]]},"1747":{"position":[[421,9]]},"1788":{"position":[[621,9]]}}}],["aa",{"_index":5371,"t":{"1314":{"position":[[886,3]]}}}],["aarch64",{"_index":5906,"t":{"1698":{"position":[[271,9]]},"1745":{"position":[[362,9]]},"1786":{"position":[[341,7],[583,9]]}}}],["abandon",{"_index":6719,"t":{"2090":{"position":[[960,9]]}}}],["abbe6561cf6248b6af395334aa09af85",{"_index":226,"t":{"27":{"position":[[1068,32]]}}}],["abil",{"_index":1147,"t":{"177":{"position":[[78,7]]},"1429":{"position":[[126,7]]},"1431":{"position":[[423,7]]},"1683":{"position":[[258,7]]},"1720":{"position":[[317,7]]},"1739":{"position":[[879,7]]},"1765":{"position":[[317,7]]},"1780":{"position":[[877,7]]},"1895":{"position":[[505,7]]},"1964":{"position":[[591,7],[2571,7],[2934,7]]},"1986":{"position":[[537,7]]},"1988":{"position":[[1651,7],[1732,7]]},"1996":{"position":[[46,7]]},"1998":{"position":[[487,7]]},"2094":{"position":[[1760,7]]}}}],["abnorm",{"_index":6272,"t":{"1824":{"position":[[217,10]]}}}],["abondend",{"_index":6757,"t":{"2096":{"position":[[1722,8]]}}}],["abov",{"_index":970,"t":{"164":{"position":[[509,5],[696,5],[824,5]]},"267":{"position":[[283,5]]},"339":{"position":[[103,5]]},"358":{"position":[[2858,6]]},"420":{"position":[[5575,6]]},"457":{"position":[[4161,6],[7015,5],[7806,5],[7951,6]]},"472":{"position":[[2022,5]]},"474":{"position":[[3259,5],[3968,5]]},"729":{"position":[[1609,5]]},"787":{"position":[[780,6]]},"947":{"position":[[269,5]]},"1010":{"position":[[1112,6],[1153,5],[1252,6],[1303,5],[1330,6],[1431,5],[1506,5],[2148,5],[2176,5]]},"1016":{"position":[[251,6]]},"1018":{"position":[[267,5]]},"1516":{"position":[[680,6]]},"1541":{"position":[[562,5]]},"1634":{"position":[[37,6]]},"1688":{"position":[[729,5]]},"1700":{"position":[[1257,5]]},"1706":{"position":[[1363,5]]},"1708":{"position":[[114,5]]},"1725":{"position":[[824,5]]},"1733":{"position":[[1601,5]]},"1735":{"position":[[655,5]]},"1749":{"position":[[158,5]]},"1751":{"position":[[114,5]]},"1770":{"position":[[839,5],[1396,6]]},"1776":{"position":[[1446,5]]},"1778":{"position":[[690,5]]},"1780":{"position":[[1832,5]]},"1790":{"position":[[181,5]]},"1792":{"position":[[114,5]]},"1828":{"position":[[95,6],[145,5]]},"1830":{"position":[[10,6]]},"1879":{"position":[[569,6]]},"1891":{"position":[[2297,5]]},"1897":{"position":[[326,5]]},"1932":{"position":[[4363,5]]},"1962":{"position":[[478,5]]},"1964":{"position":[[138,6]]},"1966":{"position":[[787,5]]},"1968":{"position":[[37,5]]},"2058":{"position":[[5942,5]]},"2110":{"position":[[735,6]]}}}],["abstain",{"_index":6665,"t":{"2054":{"position":[[643,7]]}}}],["abstract",{"_index":1750,"t":{"292":{"position":[[746,11]]},"1717":{"position":[[1612,11]]},"1762":{"position":[[1511,11]]},"1926":{"position":[[95,9]]},"2026":{"position":[[411,11]]}}}],["abus",{"_index":1328,"t":{"185":{"position":[[2400,6]]},"2049":{"position":[[511,5]]}}}],["acceler",{"_index":5897,"t":{"1696":{"position":[[68,11]]},"1743":{"position":[[68,11]]},"1784":{"position":[[81,11]]},"1926":{"position":[[1211,12]]}}}],["accept",{"_index":1332,"t":{"185":{"position":[[2507,10],[2585,6]]},"579":{"position":[[92,7]]},"659":{"position":[[250,8],[297,8]]},"1016":{"position":[[1275,6]]},"1038":{"position":[[1978,8]]},"1588":{"position":[[609,10]]},"1594":{"position":[[620,10],[870,8]]},"1596":{"position":[[173,10]]},"1610":{"position":[[1300,10]]},"1755":{"position":[[816,6]]},"1770":{"position":[[1659,8]]},"1796":{"position":[[818,6]]},"2090":{"position":[[708,6]]}}}],["access",{"_index":110,"t":{"18":{"position":[[11,6]]},"23":{"position":[[549,6]]},"25":{"position":[[104,6],[182,6]]},"30":{"position":[[41,6]]},"38":{"position":[[95,6],[286,6]]},"66":{"position":[[11,6]]},"129":{"position":[[190,6]]},"183":{"position":[[197,8]]},"200":{"position":[[167,14]]},"251":{"position":[[599,6],[627,6],[1027,6]]},"255":{"position":[[33,7]]},"260":{"position":[[271,10]]},"265":{"position":[[864,6]]},"267":{"position":[[318,6]]},"300":{"position":[[993,10]]},"311":{"position":[[212,6]]},"325":{"position":[[1125,6]]},"339":{"position":[[305,6],[447,7],[492,6],[1180,6],[1322,7],[1367,6]]},"341":{"position":[[25,6],[261,6]]},"345":{"position":[[1245,6],[1407,6]]},"352":{"position":[[170,6]]},"358":{"position":[[2208,6],[2911,6]]},"418":{"position":[[926,6]]},"420":{"position":[[3448,6],[3552,6]]},"424":{"position":[[973,6]]},"438":{"position":[[9,6]]},"462":{"position":[[960,6],[1813,6]]},"470":{"position":[[4745,6]]},"480":{"position":[[757,6]]},"486":{"position":[[1484,6],[1555,6]]},"489":{"position":[[229,6]]},"491":{"position":[[2034,6]]},"493":{"position":[[478,6]]},"567":{"position":[[364,6],[724,6],[778,6]]},"585":{"position":[[146,6]]},"587":{"position":[[422,6]]},"599":{"position":[[345,8]]},"718":{"position":[[649,6]]},"758":{"position":[[551,10]]},"763":{"position":[[2147,6],[2296,6],[2713,12],[2788,10],[2963,10],[3665,12]]},"767":{"position":[[152,6]]},"785":{"position":[[273,6]]},"787":{"position":[[306,6]]},"800":{"position":[[129,6]]},"802":{"position":[[1335,6]]},"827":{"position":[[393,10]]},"829":{"position":[[717,7]]},"834":{"position":[[1144,6]]},"841":{"position":[[15,6]]},"850":{"position":[[600,10]]},"869":{"position":[[845,8],[1019,8],[1205,8]]},"1168":{"position":[[294,10]]},"1170":{"position":[[1027,6]]},"1262":{"position":[[65,6],[4423,6]]},"1272":{"position":[[837,6],[869,6]]},"1368":{"position":[[1494,6],[1693,6]]},"1383":{"position":[[496,6]]},"1402":{"position":[[976,6]]},"1431":{"position":[[703,6]]},"1541":{"position":[[268,6],[792,6]]},"1545":{"position":[[334,10]]},"1549":{"position":[[91,10]]},"1555":{"position":[[329,9]]},"1557":{"position":[[364,7]]},"1565":{"position":[[40,6],[301,6]]},"1567":{"position":[[168,6]]},"1571":{"position":[[326,6]]},"1575":{"position":[[274,6]]},"1592":{"position":[[464,6]]},"1657":{"position":[[441,6]]},"1665":{"position":[[1262,6]]},"1671":{"position":[[187,10]]},"1810":{"position":[[478,10],[3740,10],[4643,10]]},"1816":{"position":[[1202,6]]},"1828":{"position":[[1060,6]]},"1837":{"position":[[56,9]]},"1886":{"position":[[531,6]]},"1888":{"position":[[401,6]]},"1893":{"position":[[1024,10]]},"1932":{"position":[[2339,10]]},"1947":{"position":[[34,6]]},"1956":{"position":[[72,9],[286,10],[424,6],[469,6]]},"1964":{"position":[[1035,6],[1067,6]]},"1966":{"position":[[3283,6]]},"1988":{"position":[[859,7],[1551,6]]},"1990":{"position":[[1028,13]]},"2022":{"position":[[94,6],[1056,6],[1331,6]]},"2026":{"position":[[120,6]]},"2028":{"position":[[4718,6]]},"2041":{"position":[[101,6],[385,6]]},"2049":{"position":[[176,6]]},"2068":{"position":[[2059,6]]},"2077":{"position":[[886,6],[1027,6],[1964,6]]},"2094":{"position":[[172,6],[218,6]]}}}],["access_floatingip",{"_index":3812,"t":{"795":{"position":[[17,17]]}}}],["access_ipv4",{"_index":3813,"t":{"795":{"position":[[35,11]]}}}],["access_ipv6",{"_index":3814,"t":{"795":{"position":[[47,11]]}}}],["accommod",{"_index":5768,"t":{"1657":{"position":[[114,11]]}}}],["accompani",{"_index":6736,"t":{"2094":{"position":[[2450,11]]}}}],["accomplish",{"_index":1681,"t":{"272":{"position":[[60,12]]},"1541":{"position":[[835,10]]},"1669":{"position":[[910,12]]},"1826":{"position":[[1270,12]]}}}],["accord",{"_index":2410,"t":{"422":{"position":[[2389,9]]},"438":{"position":[[93,9]]},"480":{"position":[[206,9]]},"614":{"position":[[40,9]]},"763":{"position":[[637,9],[2000,9]]},"767":{"position":[[645,9]]},"860":{"position":[[1347,9]]},"954":{"position":[[185,9]]},"1059":{"position":[[40,9]]},"1411":{"position":[[20,9]]},"1445":{"position":[[20,9]]},"1522":{"position":[[48,9]]},"1524":{"position":[[29,9]]},"1649":{"position":[[131,10]]},"1671":{"position":[[707,9],[1120,9]]},"1694":{"position":[[139,9]]},"1706":{"position":[[98,9]]},"1733":{"position":[[98,9]]},"1741":{"position":[[139,9]]},"1782":{"position":[[151,9]]},"1810":{"position":[[3090,10]]},"1895":{"position":[[1111,9]]},"1975":{"position":[[550,9],[1079,9],[1502,9]]},"2058":{"position":[[5980,9]]},"2141":{"position":[[16,9]]}}}],["accordingli",{"_index":2069,"t":{"345":{"position":[[609,12]]},"622":{"position":[[204,11]]},"661":{"position":[[752,12]]},"746":{"position":[[2539,11],[4098,12]]},"787":{"position":[[1481,12]]},"850":{"position":[[1707,12]]},"869":{"position":[[638,12]]},"1065":{"position":[[204,11]]},"1145":{"position":[[273,11]]},"1207":{"position":[[3301,12]]},"1441":{"position":[[348,12]]},"1541":{"position":[[898,12]]},"1663":{"position":[[80,12]]},"2058":{"position":[[7451,12]]}}}],["account",{"_index":150,"t":{"23":{"position":[[252,8]]},"83":{"position":[[54,7]]},"251":{"position":[[1164,9]]},"345":{"position":[[1325,8]]},"491":{"position":[[721,7],[950,7]]},"599":{"position":[[308,9]]},"659":{"position":[[764,7]]},"767":{"position":[[67,7],[312,7]]},"778":{"position":[[31,7]]},"860":{"position":[[1031,8],[1162,7],[1272,8]]},"1168":{"position":[[236,7]]},"1262":{"position":[[163,9],[353,9],[445,9],[534,8],[1378,9],[1423,9],[2442,9],[2634,9],[2666,8],[3522,7],[3724,9],[3898,9],[4394,7]]},"1567":{"position":[[317,9]]},"1964":{"position":[[991,7],[3303,8],[3320,8]]},"1986":{"position":[[235,7],[366,7]]},"1994":{"position":[[163,7],[271,8]]},"2022":{"position":[[722,7],[827,7],[1221,11],[1266,8]]},"2024":{"position":[[138,8]]},"2028":{"position":[[2838,7]]},"2065":{"position":[[153,9]]},"2077":{"position":[[1900,8],[2121,9]]},"2135":{"position":[[25,11]]}}}],["accounts/people/compani",{"_index":1369,"t":{"195":{"position":[[63,25]]}}}],["accur",{"_index":6578,"t":{"1998":{"position":[[1398,8]]},"2000":{"position":[[22,8]]},"2002":{"position":[[406,8]]},"2004":{"position":[[777,11],[1057,8]]}}}],["achiev",{"_index":630,"t":{"98":{"position":[[128,7]]},"173":{"position":[[330,7],[731,7]]},"185":{"position":[[2757,7]]},"239":{"position":[[301,7]]},"319":{"position":[[908,7]]},"331":{"position":[[261,9]]},"563":{"position":[[617,7]]},"1349":{"position":[[417,7]]},"1417":{"position":[[244,7],[336,8]]},"1451":{"position":[[244,7],[336,8]]},"1543":{"position":[[246,8],[377,7],[492,7],[650,7]]},"1688":{"position":[[274,8]]},"1725":{"position":[[366,8]]},"1770":{"position":[[366,8]]},"1906":{"position":[[47,7]]},"1917":{"position":[[376,7],[536,11]]},"1932":{"position":[[4724,7]]},"1977":{"position":[[267,7],[545,9]]},"1979":{"position":[[336,8]]},"1998":{"position":[[1383,7]]},"2004":{"position":[[1838,7]]},"2026":{"position":[[756,10]]}}}],["achiv",{"_index":5035,"t":{"1292":{"position":[[176,7]]},"1932":{"position":[[2825,6]]}}}],["acid",{"_index":6388,"t":{"1891":{"position":[[3304,4]]}}}],["acknowledg",{"_index":5470,"t":{"1391":{"position":[[547,11]]},"1425":{"position":[[591,11]]},"1888":{"position":[[506,12]]},"1891":{"position":[[3237,13]]}}}],["acm",{"_index":2870,"t":{"491":{"position":[[716,4],[753,4],[774,4],[1610,4]]}}}],["acquir",{"_index":5738,"t":{"1626":{"position":[[223,7]]}}}],["act",{"_index":1229,"t":{"179":{"position":[[502,3]]},"363":{"position":[[485,4]]},"729":{"position":[[666,3]]},"985":{"position":[[194,9],[266,3]]}}}],["action",{"_index":361,"t":{"36":{"position":[[1886,6]]},"74":{"position":[[73,7]]},"122":{"position":[[14,7]]},"177":{"position":[[673,6]]},"214":{"position":[[237,7]]},"315":{"position":[[454,7]]},"457":{"position":[[7577,6],[7812,6]]},"523":{"position":[[156,6]]},"579":{"position":[[275,8],[329,7]]},"746":{"position":[[3900,7]]},"758":{"position":[[900,6]]},"926":{"position":[[153,7]]},"1034":{"position":[[2199,6],[5794,6]]},"1116":{"position":[[996,6],[1507,6]]},"1184":{"position":[[91,7]]},"1187":{"position":[[140,7]]},"1189":{"position":[[165,6]]},"1298":{"position":[[6120,7],[6835,7],[9830,7],[10775,7],[13911,7]]},"1329":{"position":[[77,7]]},"1436":{"position":[[457,7]]},"1496":{"position":[[275,7]]},"1671":{"position":[[953,7]]},"1986":{"position":[[97,6]]},"2028":{"position":[[3735,7],[3861,7],[6017,7]]},"2043":{"position":[[594,6]]},"2068":{"position":[[1595,6]]}}}],["action.auto_create_index",{"_index":3587,"t":{"746":{"position":[[1941,25],[2806,25]]}}}],["activ",{"_index":35,"t":{"7":{"position":[[174,8]]},"11":{"position":[[6,8]]},"212":{"position":[[1011,8]]},"260":{"position":[[129,6]]},"323":{"position":[[548,6],[597,6]]},"325":{"position":[[111,7]]},"329":{"position":[[354,6]]},"331":{"position":[[213,6]]},"603":{"position":[[625,10],[702,8]]},"626":{"position":[[413,6]]},"632":{"position":[[652,6]]},"634":{"position":[[647,6]]},"636":{"position":[[343,6]]},"681":{"position":[[127,8]]},"737":{"position":[[169,9]]},"739":{"position":[[127,9]]},"834":{"position":[[656,9]]},"850":{"position":[[1372,8]]},"856":{"position":[[555,10]]},"1038":{"position":[[503,6],[1355,6]]},"1041":{"position":[[568,6],[744,6]]},"1069":{"position":[[413,6]]},"1075":{"position":[[652,6]]},"1077":{"position":[[647,6]]},"1079":{"position":[[343,6]]},"1425":{"position":[[243,6]]},"1555":{"position":[[219,10]]},"1610":{"position":[[299,6]]},"1642":{"position":[[1138,6]]},"1659":{"position":[[44,8]]},"1835":{"position":[[213,8]]},"1915":{"position":[[150,8]]},"1962":{"position":[[393,8],[1005,8],[2031,8],[2330,8],[3394,8],[3573,8],[3844,8],[4616,8],[5112,8],[5548,8],[5657,8]]},"1964":{"position":[[639,8]]},"1966":{"position":[[523,8],[4214,6]]},"2022":{"position":[[1445,6]]},"2028":{"position":[[1463,6],[3171,6]]},"2096":{"position":[[1676,10],[1696,10]]},"2120":{"position":[[166,6]]},"2157":{"position":[[218,6]]},"2162":{"position":[[66,8]]},"2214":{"position":[[33,6]]},"2216":{"position":[[33,6]]}}}],["active+clean",{"_index":4546,"t":{"1038":{"position":[[268,13],[925,13]]}}}],["actual",{"_index":1313,"t":{"185":{"position":[[1497,8],[2284,8]]},"282":{"position":[[180,8]]},"319":{"position":[[1698,6],[7691,8]]},"335":{"position":[[360,6]]},"358":{"position":[[790,6]]},"405":{"position":[[133,8]]},"422":{"position":[[2292,8]]},"603":{"position":[[172,8]]},"850":{"position":[[1462,8]]},"852":{"position":[[877,6]]},"936":{"position":[[655,8]]},"938":{"position":[[298,8]]},"960":{"position":[[1135,8]]},"985":{"position":[[431,6]]},"1155":{"position":[[105,8]]},"1268":{"position":[[143,8]]},"1272":{"position":[[39,6]]},"1351":{"position":[[209,8]]},"1543":{"position":[[918,6]]},"1706":{"position":[[370,8]]},"1733":{"position":[[369,8]]},"1776":{"position":[[105,8]]},"1814":{"position":[[299,6]]},"1891":{"position":[[996,8]]},"1998":{"position":[[1337,6]]},"2000":{"position":[[214,6]]},"2043":{"position":[[884,6]]},"2106":{"position":[[93,6]]},"2124":{"position":[[274,6]]}}}],["ad",{"_index":1027,"t":{"166":{"position":[[1742,6]]},"255":{"position":[[128,5]]},"345":{"position":[[1295,5]]},"414":{"position":[[158,5]]},"457":{"position":[[4926,6],[5433,5]]},"470":{"position":[[2856,5]]},"632":{"position":[[1179,6],[1415,6]]},"634":{"position":[[1229,6],[1280,5]]},"636":{"position":[[116,5],[145,5]]},"704":{"position":[[142,5]]},"729":{"position":[[2479,6]]},"735":{"position":[[855,5]]},"749":{"position":[[6292,5]]},"763":{"position":[[716,5]]},"767":{"position":[[1361,5]]},"775":{"position":[[484,5]]},"850":{"position":[[2209,6]]},"869":{"position":[[1417,5]]},"871":{"position":[[353,5]]},"873":{"position":[[201,5]]},"1012":{"position":[[33,5]]},"1075":{"position":[[1179,6],[1415,6]]},"1077":{"position":[[1229,6],[1280,5]]},"1079":{"position":[[116,5],[145,5]]},"1112":{"position":[[492,5],[822,5]]},"1116":{"position":[[813,5],[1042,6]]},"1122":{"position":[[1073,6]]},"1357":{"position":[[59,5]]},"1368":{"position":[[183,5]]},"1370":{"position":[[112,6]]},"1374":{"position":[[436,5]]},"1407":{"position":[[72,6]]},"1417":{"position":[[967,6]]},"1419":{"position":[[59,5]]},"1434":{"position":[[493,5]]},"1453":{"position":[[59,5]]},"1471":{"position":[[74,6],[334,6],[557,5]]},"1482":{"position":[[170,5]]},"1594":{"position":[[1692,6]]},"1859":{"position":[[619,6]]},"1877":{"position":[[175,6]]},"1886":{"position":[[752,6]]},"1891":{"position":[[3804,6]]},"1893":{"position":[[63,5]]},"1899":{"position":[[20,5]]},"1901":{"position":[[65,5]]},"2028":{"position":[[2235,5],[5096,5]]},"2058":{"position":[[7392,6]]},"2068":{"position":[[573,6]]},"2077":{"position":[[207,5],[1917,5],[2145,5]]},"2133":{"position":[[346,6]]}}}],["adapt",{"_index":1357,"t":{"191":{"position":[[120,9]]},"325":{"position":[[368,5]]},"447":{"position":[[313,10]]},"941":{"position":[[765,7]]},"1168":{"position":[[495,5]]},"1280":{"position":[[422,10]]},"1332":{"position":[[141,7]]},"1628":{"position":[[278,5]]},"1966":{"position":[[2292,8]]},"2068":{"position":[[797,5]]}}}],["add",{"_index":502,"t":{"72":{"position":[[277,3],[314,3]]},"92":{"position":[[56,3]]},"94":{"position":[[166,3]]},"96":{"position":[[184,3]]},"140":{"position":[[277,3]]},"152":{"position":[[45,3]]},"158":{"position":[[266,3]]},"177":{"position":[[1440,3]]},"315":{"position":[[679,3]]},"319":{"position":[[1298,3],[4241,3]]},"341":{"position":[[545,3]]},"343":{"position":[[342,3]]},"438":{"position":[[327,3]]},"453":{"position":[[1390,3]]},"457":{"position":[[4004,3],[4593,3],[5647,3]]},"470":{"position":[[3000,3],[3199,3],[5131,4]]},"493":{"position":[[674,3]]},"622":{"position":[[691,3]]},"659":{"position":[[0,3],[1178,3],[1283,3]]},"674":{"position":[[56,3]]},"683":{"position":[[222,3]]},"685":{"position":[[215,3]]},"691":{"position":[[188,3]]},"718":{"position":[[321,3],[755,3]]},"724":{"position":[[1142,3],[1308,3]]},"749":{"position":[[1288,3],[6878,3]]},"767":{"position":[[2987,3],[3028,3],[3066,3]]},"850":{"position":[[2413,4],[2922,3],[3117,3],[3142,3],[3497,3]]},"873":{"position":[[484,3],[566,3]]},"947":{"position":[[420,3],[450,3],[520,3]]},"1010":{"position":[[470,3]]},"1065":{"position":[[691,3]]},"1099":{"position":[[15,3],[229,3],[364,3],[447,3],[532,3],[638,3],[769,3],[900,3]]},"1101":{"position":[[13,3]]},"1116":{"position":[[489,3],[1350,3],[1642,3],[2408,3]]},"1122":{"position":[[2431,3],[2753,3],[3072,3],[3393,3]]},"1139":{"position":[[38,3]]},"1141":{"position":[[256,3]]},"1168":{"position":[[1703,3],[2251,3],[2378,3],[2456,3]]},"1172":{"position":[[586,3]]},"1262":{"position":[[2484,4]]},"1332":{"position":[[639,3]]},"1594":{"position":[[212,3],[1311,3]]},"1706":{"position":[[1604,3]]},"1733":{"position":[[1868,3]]},"1776":{"position":[[1715,3]]},"1805":{"position":[[179,3]]},"1998":{"position":[[1121,3]]},"2028":{"position":[[5754,3]]},"2058":{"position":[[953,3]]},"2077":{"position":[[1684,3],[1767,3],[2059,3],[2255,3],[2722,3],[3371,3]]}}}],["add_clust",{"_index":2658,"t":{"470":{"position":[[5096,11]]}}}],["addit",{"_index":796,"t":{"140":{"position":[[281,10]]},"158":{"position":[[270,10]]},"173":{"position":[[212,10],[892,10]]},"247":{"position":[[610,8]]},"302":{"position":[[285,10]]},"319":{"position":[[2411,10],[6079,10]]},"321":{"position":[[888,10]]},"472":{"position":[[956,10],[1160,10],[1411,10]]},"491":{"position":[[590,10]]},"567":{"position":[[281,10]]},"587":{"position":[[310,8]]},"595":{"position":[[291,8]]},"622":{"position":[[695,10]]},"659":{"position":[[1000,10]]},"661":{"position":[[631,10]]},"704":{"position":[[101,10]]},"850":{"position":[[2702,10],[2747,10],[2830,10],[3020,10],[3327,10],[3405,10]]},"1065":{"position":[[695,10]]},"1141":{"position":[[260,10]]},"1170":{"position":[[528,8]]},"1260":{"position":[[302,8]]},"1353":{"position":[[246,8]]},"1400":{"position":[[249,8]]},"1431":{"position":[[682,8]]},"1516":{"position":[[393,9]]},"1567":{"position":[[292,10]]},"1577":{"position":[[430,10]]},"1582":{"position":[[197,9]]},"1588":{"position":[[1433,8]]},"1590":{"position":[[237,9]]},"1622":{"position":[[974,9]]},"1688":{"position":[[1448,10]]},"1706":{"position":[[1247,10],[1329,10]]},"1725":{"position":[[1800,10]]},"1733":{"position":[[1475,10],[1567,10]]},"1755":{"position":[[1375,8]]},"1770":{"position":[[2102,10]]},"1776":{"position":[[1320,10],[1412,10]]},"1796":{"position":[[1377,8]]},"1828":{"position":[[959,9]]},"1851":{"position":[[144,9]]},"1891":{"position":[[1661,10],[5904,10],[6003,10]]},"1893":{"position":[[309,10]]},"1899":{"position":[[294,10]]},"1964":{"position":[[2420,10],[2479,8],[4232,10],[5021,10]]},"1966":{"position":[[4803,9]]},"1988":{"position":[[1138,10]]},"1998":{"position":[[1125,10]]},"2002":{"position":[[621,8]]},"2022":{"position":[[701,10],[1080,8]]},"2092":{"position":[[263,10],[372,8]]},"2094":{"position":[[2465,10]]},"2096":{"position":[[420,10],[1154,10]]},"2101":{"position":[[197,9]]},"2139":{"position":[[944,9]]}}}],["addition",{"_index":737,"t":{"120":{"position":[[291,12]]},"345":{"position":[[808,13]]},"363":{"position":[[346,13]]},"495":{"position":[[92,12]]},"746":{"position":[[2008,12]]},"1262":{"position":[[3077,12]]},"1671":{"position":[[874,13]]},"1881":{"position":[[330,13]]},"1964":{"position":[[2387,12]]},"2051":{"position":[[1001,13]]}}}],["additional.sh",{"_index":3888,"t":{"807":{"position":[[601,13]]},"809":{"position":[[413,13]]}}}],["address",{"_index":1879,"t":{"319":{"position":[[2403,7]]},"348":{"position":[[301,10]]},"381":{"position":[[320,9]]},"420":{"position":[[141,7],[232,7],[319,7]]},"472":{"position":[[742,7]]},"491":{"position":[[475,7],[1677,7],[1778,7]]},"579":{"position":[[59,9]]},"667":{"position":[[256,10],[298,10],[437,10],[495,10],[538,10]]},"724":{"position":[[51,7],[130,7],[466,7],[756,7],[844,7]]},"727":{"position":[[402,10]]},"729":{"position":[[1894,7],[2075,7],[2533,10]]},"737":{"position":[[225,7]]},"785":{"position":[[155,9]]},"798":{"position":[[290,7]]},"816":{"position":[[174,9]]},"834":{"position":[[1635,7]]},"836":{"position":[[733,7],[1580,7]]},"839":{"position":[[325,7]]},"850":{"position":[[396,9],[3463,7]]},"856":{"position":[[891,7]]},"1368":{"position":[[1014,10]]},"1405":{"position":[[170,7]]},"1447":{"position":[[117,10]]},"1471":{"position":[[91,10]]},"1565":{"position":[[189,9]]},"1567":{"position":[[132,9]]},"1577":{"position":[[22,9]]},"1663":{"position":[[0,10]]},"1667":{"position":[[478,10]]},"1717":{"position":[[1064,7]]},"1762":{"position":[[963,7]]},"1891":{"position":[[1807,7],[2250,7],[3068,7],[5819,9]]},"1906":{"position":[[206,7]]},"1917":{"position":[[743,9]]},"1962":{"position":[[3336,7],[4558,7]]},"1984":{"position":[[141,7]]},"2045":{"position":[[627,7]]},"2051":{"position":[[759,10]]}}}],["addressed.(k8",{"_index":5451,"t":{"1381":{"position":[[44,14]]}}}],["addresses/flo",{"_index":3029,"t":{"595":{"position":[[143,18]]}}}],["adequ",{"_index":5639,"t":{"1555":{"position":[[38,8]]}}}],["adher",{"_index":1026,"t":{"166":{"position":[[1710,6]]},"535":{"position":[[71,8]]},"1145":{"position":[[81,6]]},"1586":{"position":[[110,8]]},"1712":{"position":[[66,6]]},"2058":{"position":[[6152,7]]}}}],["adipisc",{"_index":6,"t":{"3":{"position":[[40,10]]}}}],["adit",{"_index":6714,"t":{"2077":{"position":[[3379,9]]}}}],["adjust",{"_index":1092,"t":{"173":{"position":[[612,6]]},"183":{"position":[[153,6]]},"253":{"position":[[83,8]]},"298":{"position":[[320,12]]},"438":{"position":[[74,6]]},"470":{"position":[[673,6]]},"474":{"position":[[3418,8]]},"480":{"position":[[295,6]]},"821":{"position":[[79,12]]},"1207":{"position":[[3878,6]]},"1209":{"position":[[1501,11]]},"1218":{"position":[[71,11]]},"1439":{"position":[[110,9]]},"2026":{"position":[[174,11]]},"2028":{"position":[[768,8]]},"2039":{"position":[[247,11]]},"2045":{"position":[[741,11]]},"2051":{"position":[[1048,8]]},"2056":{"position":[[83,11]]},"2058":{"position":[[5971,8],[6755,9]]}}}],["adjustments.(k8",{"_index":5454,"t":{"1381":{"position":[[145,16]]}}}],["admin",{"_index":758,"t":{"129":{"position":[[464,5]]},"358":{"position":[[2102,6]]},"449":{"position":[[411,5]]},"470":{"position":[[2016,6]]},"486":{"position":[[1885,5],[1903,5]]},"493":{"position":[[472,5]]},"579":{"position":[[218,5]]},"610":{"position":[[244,5],[659,6],[1460,5]]},"659":{"position":[[229,6],[276,6],[306,5],[320,7],[342,5],[381,5],[447,5],[487,5],[526,5]]},"749":{"position":[[558,6],[776,6],[1719,6],[2368,6],[6351,5],[6865,5]]},"800":{"position":[[321,5],[429,5],[535,5],[754,5],[868,5]]},"841":{"position":[[210,5],[315,5],[458,5],[499,5],[620,5],[904,5],[950,5]]},"843":{"position":[[129,5]]},"850":{"position":[[2888,5],[3076,5]]},"1047":{"position":[[23,5],[1507,5]]},"1055":{"position":[[244,5],[659,6],[1460,5]]},"1262":{"position":[[3280,5],[3442,5],[3991,5],[4459,5]]},"1482":{"position":[[318,7]]},"1932":{"position":[[105,5],[199,5],[2058,7],[3607,5],[3887,6],[4422,6]]},"1936":{"position":[[435,5]]},"2022":{"position":[[534,5]]},"2039":{"position":[[346,5]]},"2041":{"position":[[571,5],[632,5]]},"2045":{"position":[[62,5],[186,5],[365,5]]},"2047":{"position":[[10,5],[138,5],[253,5]]},"2049":{"position":[[714,7]]},"2051":{"position":[[22,5],[155,5],[323,5],[643,5]]},"2058":{"position":[[304,6],[441,6],[1384,6],[2033,6],[6233,7]]},"2061":{"position":[[81,5],[142,5],[186,5],[279,5],[361,7]]},"2068":{"position":[[584,7],[1788,7],[1841,5],[2099,7]]},"2077":{"position":[[453,5],[479,5],[668,6],[806,7],[1052,7],[1178,5],[1222,5],[1315,5],[1442,5],[1883,5],[1938,6],[2176,6]]}}}],["admin@$clusternam",{"_index":2644,"t":{"470":{"position":[[2194,18]]}}}],["admin@.bkp",{"_index":2705,"t":{"474":{"position":[[896,18]]}}}],["cluster_name>/clust",{"_index":2908,"t":{"500":{"position":[[304,24]]}}}],["cluster_name>/clusterctl.yaml",{"_index":2576,"t":{"462":{"position":[[150,32],[3016,30],[3156,30],[3277,30],[3391,30],[3688,30],[3829,30],[3950,30],[4064,30]]}}}],["cluster_name}/clusterctl.yaml",{"_index":2507,"t":{"457":{"position":[[4612,34]]}}}],["clusterapi",{"_index":6550,"t":{"1977":{"position":[[2082,10]]}}}],["clusterapi_vers",{"_index":2238,"t":{"416":{"position":[[481,18]]}}}],["clusterclass",{"_index":2890,"t":{"495":{"position":[[37,12],[203,12],[421,12],[958,14]]}}}],["clusterctl",{"_index":2093,"t":{"352":{"position":[[32,10],[1070,10],[1283,10]]},"416":{"position":[[543,10]]},"422":{"position":[[1341,12]]},"447":{"position":[[277,11]]},"451":{"position":[[1484,10]]},"455":{"position":[[155,10]]},"457":{"position":[[1756,10],[1864,10],[1957,10],[2090,10],[2118,10],[2271,10],[2891,10],[3012,10]]},"459":{"position":[[356,10]]},"462":{"position":[[1045,10],[2756,10],[2780,10]]}}}],["clusterctl.yaml",{"_index":1956,"t":{"321":{"position":[[1041,16]]},"416":{"position":[[104,15]]},"418":{"position":[[89,15]]},"420":{"position":[[57,15],[3918,15]]},"422":{"position":[[2468,15]]},"457":{"position":[[3741,15],[4264,15],[4528,16],[5375,16],[6530,15],[6663,15]]},"470":{"position":[[521,15],[2523,15]]},"474":{"position":[[3637,15],[4083,15]]},"480":{"position":[[153,15],[963,15]]},"493":{"position":[[804,16]]},"1439":{"position":[[150,15]]}}}],["clusterinfrastructur",{"_index":2113,"t":{"352":{"position":[[1396,23]]}}}],["clusterip",{"_index":2816,"t":{"486":{"position":[[1316,9],[1685,9]]},"491":{"position":[[345,9]]}}}],["clusternam",{"_index":2631,"t":{"470":{"position":[[452,11],[846,12],[1604,11],[2117,12],[4852,14],[4921,13],[5119,11],[5193,12]]},"480":{"position":[[803,11]]}}}],["clustername/$clusternam",{"_index":2634,"t":{"470":{"position":[[1107,25]]}}}],["clustername/$clustername.yaml",{"_index":2641,"t":{"470":{"position":[[2039,33]]}}}],["clustername/clust",{"_index":2633,"t":{"470":{"position":[[988,20]]}}}],["clustername/clusterctl.yaml",{"_index":2632,"t":{"470":{"position":[[919,31],[1054,28]]}}}],["clustername/deploy",{"_index":2647,"t":{"470":{"position":[[2366,23],[4190,23]]}}}],["clustershel",{"_index":4353,"t":{"1024":{"position":[[11,12]]}}}],["clusterstack",{"_index":1792,"t":{"304":{"position":[[362,13]]}}}],["clustertopology=tru",{"_index":2899,"t":{"495":{"position":[[834,20]]}}}],["cm",{"_index":6751,"t":{"2096":{"position":[[787,3],[833,3],[1200,4],[1224,3],[1257,4],[1281,3]]}}}],["cmctl",{"_index":2664,"t":{"470":{"position":[[5444,6]]}}}],["cmd",{"_index":2346,"t":{"420":{"position":[[3259,4]]}}}],["cmdline",{"_index":356,"t":{"36":{"position":[[1771,7]]}}}],["cncf",{"_index":1668,"t":{"269":{"position":[[77,4]]},"286":{"position":[[214,4]]},"390":{"position":[[173,5]]},"412":{"position":[[85,4]]},"420":{"position":[[5013,4]]},"422":{"position":[[2019,4]]},"504":{"position":[[793,4]]},"1353":{"position":[[220,4]]},"1355":{"position":[[450,4]]},"1391":{"position":[[441,5]]},"1417":{"position":[[79,4]]},"1425":{"position":[[485,5]]},"1451":{"position":[[79,4]]},"1469":{"position":[[354,4]]},"1475":{"position":[[127,4]]},"1496":{"position":[[346,5]]},"1516":{"position":[[182,4]]},"1919":{"position":[[615,4]]},"1962":{"position":[[1763,4],[1786,4],[3133,4],[3155,4]]},"1966":{"position":[[1644,4],[4245,4],[4434,4]]},"2028":{"position":[[3048,4]]}}}],["cni",{"_index":2288,"t":{"420":{"position":[[407,3],[572,3]]},"422":{"position":[[1949,4]]},"457":{"position":[[7403,3],[7592,3],[8040,3],[8129,4],[8515,3]]},"462":{"position":[[1383,3]]},"464":{"position":[[6,3]]},"470":{"position":[[1347,4]]},"480":{"position":[[666,4]]},"482":{"position":[[203,3]]},"504":{"position":[[1102,3]]},"1368":{"position":[[1396,3]]}}}],["cockpit",{"_index":5359,"t":{"1308":{"position":[[322,8]]},"1409":{"position":[[4,7]]},"1445":{"position":[[57,7]]}}}],["cockroachdb",{"_index":6641,"t":{"2028":{"position":[[5440,11],[5556,12]]}}}],["cocktail",{"_index":1489,"t":{"219":{"position":[[57,8]]}}}],["code",{"_index":38,"t":{"7":{"position":[[218,5]]},"120":{"position":[[189,4]]},"142":{"position":[[330,4],[425,4]]},"144":{"position":[[233,4]]},"152":{"position":[[122,4],[245,4]]},"164":{"position":[[22,4]]},"166":{"position":[[149,4],[1467,5],[1552,4]]},"173":{"position":[[761,4],[875,5],[936,5],[1257,5]]},"175":{"position":[[120,4],[182,4],[556,4],[626,4],[710,4]]},"177":{"position":[[772,4],[1071,4],[1565,4],[1674,4]]},"179":{"position":[[110,4]]},"181":{"position":[[176,4],[625,4],[1401,4]]},"183":{"position":[[192,4],[824,4],[904,4],[932,4]]},"185":{"position":[[927,4],[1110,5],[1354,4],[1814,5],[1952,4]]},"247":{"position":[[505,4]]},"265":{"position":[[1072,4]]},"269":{"position":[[399,4]]},"309":{"position":[[344,4]]},"422":{"position":[[272,4]]},"523":{"position":[[197,5]]},"561":{"position":[[536,4]]},"1139":{"position":[[115,4]]},"1145":{"position":[[26,4],[73,4]]},"1159":{"position":[[5,4],[86,5]]},"1161":{"position":[[234,4],[3923,6]]},"1262":{"position":[[1911,5],[1940,4],[2214,5],[4351,4]]},"1314":{"position":[[624,5]]},"1355":{"position":[[766,5]]},"1377":{"position":[[317,4]]},"1385":{"position":[[4,4],[163,4]]},"1387":{"position":[[20,4]]},"1400":{"position":[[1235,4]]},"1402":{"position":[[331,4]]},"1458":{"position":[[201,4]]},"1496":{"position":[[332,4]]},"1654":{"position":[[108,5]]},"1717":{"position":[[1171,4]]},"1762":{"position":[[1070,4]]},"1855":{"position":[[441,4]]},"1881":{"position":[[461,4]]},"1962":{"position":[[263,5],[1240,4],[1985,4],[2726,4],[3348,4],[3946,4],[4570,4]]},"1964":{"position":[[2928,5],[2981,5]]},"1966":{"position":[[3911,4]]},"2045":{"position":[[303,5]]}}}],["code/community/development/design",{"_index":6518,"t":{"1966":{"position":[[426,33]]}}}],["code_block",{"_index":812,"t":{"142":{"position":[[266,13],[471,10],[512,13]]}}}],["codebas",{"_index":1130,"t":{"175":{"position":[[1031,8]]}}}],["codeblock",{"_index":806,"t":{"142":{"position":[[42,11],[118,11]]}}}],["coexist",{"_index":5401,"t":{"1351":{"position":[[182,7]]}}}],["coffe",{"_index":1529,"t":{"227":{"position":[[391,7]]},"231":{"position":[[293,6]]},"233":{"position":[[260,6],[300,7]]}}}],["cognit",{"_index":1058,"t":{"171":{"position":[[142,9]]}}}],["coher",{"_index":5774,"t":{"1659":{"position":[[361,9]]}}}],["cold",{"_index":6409,"t":{"1899":{"position":[[701,4]]}}}],["colis",{"_index":6709,"t":{"2077":{"position":[[3001,10]]}}}],["collabor",{"_index":94,"t":{"14":{"position":[[275,15]]},"23":{"position":[[396,13]]},"1659":{"position":[[15,13]]},"1962":{"position":[[2196,12]]}}}],["collect",{"_index":561,"t":{"83":{"position":[[277,9]]},"100":{"position":[[374,10]]},"154":{"position":[[0,11],[86,10],[473,12],[712,11],[910,12]]},"156":{"position":[[100,10]]},"175":{"position":[[668,10]]},"204":{"position":[[507,10]]},"216":{"position":[[22,10]]},"235":{"position":[[16,7]]},"422":{"position":[[2199,10]]},"470":{"position":[[4177,9]]},"650":{"position":[[55,10]]},"756":{"position":[[55,10]]},"767":{"position":[[2029,10]]},"769":{"position":[[310,12]]},"771":{"position":[[287,12]]},"1099":{"position":[[272,10],[329,10]]},"1109":{"position":[[95,10],[130,10],[168,10],[254,10]]},"1114":{"position":[[138,10],[171,10],[205,10]]},"1161":{"position":[[381,10],[536,10],[688,10],[842,10],[1008,10],[1176,10],[1328,10],[1483,10],[1645,10],[1798,10],[1951,10],[2105,10],[2260,10],[2415,10],[2569,10],[2722,10],[2879,10],[3039,10],[3184,10],[3336,10]]},"1326":{"position":[[126,11]]},"1334":{"position":[[124,10]]},"1383":{"position":[[139,9]]},"1400":{"position":[[266,10]]},"1425":{"position":[[83,9]]},"1964":{"position":[[2116,10],[4111,10]]},"2133":{"position":[[178,10]]},"2135":{"position":[[511,9]]},"2162":{"position":[[244,10]]}}}],["collectd",{"_index":4142,"t":{"933":{"position":[[490,8]]}}}],["collections/ansible.posix.git",{"_index":930,"t":{"154":{"position":[[1019,29]]}}}],["colletar",{"_index":6649,"t":{"2032":{"position":[[905,10]]}}}],["colon",{"_index":6326,"t":{"1851":{"position":[[303,6]]}}}],["color",{"_index":778,"t":{"138":{"position":[[32,6]]},"856":{"position":[[646,6]]},"1266":{"position":[[108,5]]}}}],["column'",{"_index":3870,"t":{"802":{"position":[[2473,8]]}}}],["combin",{"_index":642,"t":{"100":{"position":[[330,8]]},"175":{"position":[[638,8]]},"183":{"position":[[953,11]]},"251":{"position":[[1349,12]]},"255":{"position":[[165,11]]},"260":{"position":[[26,8]]},"1010":{"position":[[1266,8]]},"1122":{"position":[[1229,8],[1548,8],[1869,8],[2200,8],[2522,8],[2844,8],[3165,8],[3481,8]]},"1181":{"position":[[61,11]]},"1826":{"position":[[891,8]]},"1893":{"position":[[369,12]]},"2028":{"position":[[6162,8]]},"2106":{"position":[[549,11]]}}}],["come",{"_index":653,"t":{"100":{"position":[[725,6]]},"177":{"position":[[1082,5]]},"185":{"position":[[2617,4]]},"206":{"position":[[338,4]]},"267":{"position":[[90,4]]},"300":{"position":[[1057,4]]},"329":{"position":[[644,5]]},"414":{"position":[[44,5]]},"457":{"position":[[8787,4]]},"504":{"position":[[274,4]]},"583":{"position":[[337,5]]},"936":{"position":[[455,5]]},"1016":{"position":[[817,4]]},"1209":{"position":[[69,4]]},"1465":{"position":[[305,5]]},"1622":{"position":[[1567,4]]},"1720":{"position":[[647,4]]},"1765":{"position":[[647,4]]},"1812":{"position":[[397,4]]},"1886":{"position":[[700,5]]},"2022":{"position":[[335,4]]},"2030":{"position":[[375,4]]},"2032":{"position":[[896,5]]},"2135":{"position":[[418,4]]},"2200":{"position":[[112,4]]}}}],["command",{"_index":719,"t":{"108":{"position":[[128,7]]},"129":{"position":[[512,7]]},"166":{"position":[[1893,7]]},"352":{"position":[[43,8],[297,8],[1026,7]]},"358":{"position":[[1954,7]]},"383":{"position":[[69,7]]},"405":{"position":[[60,8]]},"418":{"position":[[1681,9]]},"426":{"position":[[128,7],[150,9]]},"453":{"position":[[404,8],[859,8]]},"457":{"position":[[2082,7],[2882,8]]},"468":{"position":[[150,7],[272,8]]},"470":{"position":[[119,9],[868,7]]},"491":{"position":[[1829,8]]},"504":{"position":[[78,8]]},"708":{"position":[[740,7]]},"737":{"position":[[9,7],[108,7]]},"746":{"position":[[4147,10],[4611,7],[4784,10]]},"767":{"position":[[170,8]]},"783":{"position":[[90,7]]},"814":{"position":[[142,7]]},"843":{"position":[[257,7]]},"847":{"position":[[26,8]]},"852":{"position":[[1171,7]]},"941":{"position":[[14,8]]},"1012":{"position":[[111,8]]},"1018":{"position":[[213,7]]},"1020":{"position":[[10,7]]},"1022":{"position":[[128,9]]},"1026":{"position":[[151,7]]},"1034":{"position":[[42,8],[279,8]]},"1036":{"position":[[333,8]]},"1153":{"position":[[5,7]]},"1207":{"position":[[4513,7]]},"1368":{"position":[[76,7],[270,8]]},"1374":{"position":[[170,7]]},"1667":{"position":[[1346,7]]},"1855":{"position":[[118,7]]},"1881":{"position":[[116,7]]},"1932":{"position":[[299,9]]}}}],["commandlin",{"_index":4075,"t":{"856":{"position":[[528,11]]}}}],["comment",{"_index":1062,"t":{"171":{"position":[[280,7]]},"317":{"position":[[946,7]]},"319":{"position":[[7359,7]]},"337":{"position":[[294,7],[435,7],[576,7],[1090,7],[1231,7],[1372,7]]},"345":{"position":[[799,8],[1070,9],[1168,9],[1279,8],[2139,7]]},"432":{"position":[[186,7]]},"729":{"position":[[1581,9],[1645,10]]},"767":{"position":[[900,7]]},"1962":{"position":[[1175,9]]},"2068":{"position":[[1138,8],[1541,8],[1939,8]]}}}],["commerci",{"_index":6261,"t":{"1816":{"position":[[773,10]]},"2135":{"position":[[86,12]]},"2139":{"position":[[986,10]]},"2164":{"position":[[74,12]]}}}],["commit",{"_index":730,"t":{"118":{"position":[[119,10]]},"164":{"position":[[332,7]]},"166":{"position":[[1773,6],[1799,6],[1950,6],[1970,6],[1993,6],[2058,7]]},"177":{"position":[[537,10]]},"185":{"position":[[1719,9]]},"363":{"position":[[1356,7]]},"474":{"position":[[685,6]]},"712":{"position":[[83,9]]},"718":{"position":[[19,9],[344,6],[363,7]]},"735":{"position":[[1470,6],[1652,6]]},"1124":{"position":[[24,6]]},"1207":{"position":[[3363,6]]},"1377":{"position":[[744,6]]},"1671":{"position":[[511,10],[544,7]]},"1770":{"position":[[1270,7],[1434,6]]},"1810":{"position":[[2701,11],[2760,7]]},"1966":{"position":[[3919,10]]},"2096":{"position":[[1582,6],[1606,6],[1628,6],[1651,6]]}}}],["committe",{"_index":6411,"t":{"1904":{"position":[[764,10]]},"1915":{"position":[[554,10]]},"2063":{"position":[[274,9]]}}}],["committee'",{"_index":6058,"t":{"1712":{"position":[[166,11]]}}}],["commment",{"_index":6684,"t":{"2068":{"position":[[1999,8]]}}}],["common",{"_index":1023,"t":{"166":{"position":[[1659,7]]},"292":{"position":[[408,6]]},"569":{"position":[[140,6]]},"816":{"position":[[460,6]]},"875":{"position":[[0,6]]},"877":{"position":[[4,6],[274,6],[293,6]]},"889":{"position":[[0,6]]},"902":{"position":[[0,6]]},"933":{"position":[[511,6]]},"1034":{"position":[[684,6],[760,6],[1210,6],[1692,6],[2478,6],[2588,6],[2732,6],[2855,6],[2870,6],[2978,6],[3119,6],[3254,6],[3415,6],[3551,6],[3690,6],[3812,6],[3947,6],[4082,6],[4217,6],[4355,6],[4514,6],[4667,6],[4828,6],[4967,6],[5076,6],[5214,6],[5766,6],[6020,10]]},"1041":{"position":[[616,9]]},"1109":{"position":[[141,8]]},"1114":{"position":[[149,7]]},"1195":{"position":[[4,6],[264,6],[294,6]]},"2024":{"position":[[199,7],[616,6]]},"2106":{"position":[[33,6],[53,6],[235,6],[844,6]]},"2152":{"position":[[54,6]]}}}],["common.yml",{"_index":4408,"t":{"1034":{"position":[[1734,10],[6730,10],[7466,10]]}}}],["commonli",{"_index":1295,"t":{"185":{"position":[[90,8]]},"1270":{"position":[[110,8]]},"1717":{"position":[[1139,8],[1571,8]]},"1762":{"position":[[1038,8],[1470,8]]},"2028":{"position":[[24,8],[820,8],[1781,8],[3474,8]]},"2124":{"position":[[5,8]]},"2126":{"position":[[25,8]]},"2155":{"position":[[290,8]]}}}],["commun",{"_index":22,"t":{"7":{"position":[[33,9]]},"9":{"position":[[24,9],[133,10]]},"18":{"position":[[73,9]]},"23":{"position":[[509,9]]},"25":{"position":[[192,9]]},"27":{"position":[[31,9],[119,9],[137,9]]},"30":{"position":[[51,9]]},"32":{"position":[[31,9]]},"81":{"position":[[24,9],[133,10]]},"87":{"position":[[114,9]]},"96":{"position":[[47,10]]},"98":{"position":[[215,9]]},"177":{"position":[[350,9]]},"181":{"position":[[401,9]]},"183":{"position":[[376,9]]},"260":{"position":[[148,9]]},"272":{"position":[[80,9]]},"286":{"position":[[309,9],[388,13]]},"290":{"position":[[60,9],[134,9]]},"325":{"position":[[995,11]]},"422":{"position":[[910,9]]},"426":{"position":[[564,9]]},"476":{"position":[[245,13]]},"491":{"position":[[1213,13]]},"551":{"position":[[42,9],[85,10]]},"583":{"position":[[24,11],[100,12]]},"593":{"position":[[264,10]]},"597":{"position":[[269,11]]},"632":{"position":[[1481,9]]},"636":{"position":[[548,10],[577,9]]},"1075":{"position":[[1481,9]]},"1079":{"position":[[548,10],[577,9]]},"1262":{"position":[[859,11],[2591,11]]},"1270":{"position":[[38,11]]},"1332":{"position":[[603,10]]},"1355":{"position":[[86,12]]},"1363":{"position":[[959,9],[1066,9]]},"1389":{"position":[[75,9]]},"1391":{"position":[[60,10],[142,9],[398,12]]},"1423":{"position":[[75,9]]},"1425":{"position":[[60,10],[262,9],[442,12]]},"1458":{"position":[[75,9]]},"1494":{"position":[[75,9]]},"1496":{"position":[[14,9]]},"1513":{"position":[[75,9]]},"1516":{"position":[[37,9]]},"1547":{"position":[[157,10]]},"1586":{"position":[[100,9]]},"1592":{"position":[[512,9]]},"1594":{"position":[[61,9],[1160,9]]},"1596":{"position":[[56,10]]},"1659":{"position":[[144,9],[473,9]]},"1917":{"position":[[601,12]]},"1962":{"position":[[291,9],[1294,9],[1370,14],[2220,11],[2780,9],[4000,9]]},"1966":{"position":[[1630,9],[2629,9],[4021,9],[4113,9],[4403,9]]},"2028":{"position":[[106,9],[371,9],[412,9],[3241,9],[3364,9]]},"2090":{"position":[[115,9]]},"2096":{"position":[[1884,11]]},"2157":{"position":[[225,9]]},"2212":{"position":[[332,9]]}}}],["community.general.timezon",{"_index":3366,"t":{"695":{"position":[[128,26]]}}}],["compani",{"_index":1177,"t":{"177":{"position":[[897,9],[1008,7],[1253,7],[1498,9],[1732,9],[2150,9],[2312,9]]},"179":{"position":[[83,7]]},"185":{"position":[[1004,9],[2373,9]]},"193":{"position":[[106,9]]},"525":{"position":[[156,9]]},"860":{"position":[[1360,7]]},"1425":{"position":[[162,9]]},"1659":{"position":[[123,9]]},"1962":{"position":[[2125,9],[2570,10],[3487,9],[3764,9],[3782,9],[3830,9],[4706,9],[4995,10]]},"1966":{"position":[[1725,9],[2908,9],[4201,9]]}}}],["company/organ",{"_index":711,"t":{"104":{"position":[[134,21]]},"1667":{"position":[[771,21]]}}}],["compar",{"_index":2073,"t":{"345":{"position":[[1139,8]]},"567":{"position":[[331,8]]},"831":{"position":[[382,8]]},"1306":{"position":[[222,8]]},"1704":{"position":[[943,8]]},"1731":{"position":[[965,8]]},"1966":{"position":[[1525,8]]},"1998":{"position":[[737,9],[1306,9]]},"2000":{"position":[[479,8]]},"2002":{"position":[[349,8]]},"2028":{"position":[[3693,8],[4768,8]]},"2049":{"position":[[730,10]]}}}],["comparison",{"_index":5381,"t":{"1329":{"position":[[432,10]]},"1698":{"position":[[694,11]]},"1745":{"position":[[801,11]]},"1786":{"position":[[1022,11]]},"1859":{"position":[[147,10]]},"1966":{"position":[[3526,10],[4483,10]]},"2090":{"position":[[355,10]]}}}],["compat",{"_index":33,"t":{"7":{"position":[[150,10]]},"181":{"position":[[730,11],[1051,12]]},"189":{"position":[[204,10]]},"286":{"position":[[474,10]]},"304":{"position":[[468,11]]},"535":{"position":[[197,10]]},"591":{"position":[[269,10]]},"659":{"position":[[182,8]]},"1274":{"position":[[236,10]]},"1280":{"position":[[1258,14]]},"1374":{"position":[[123,10]]},"1383":{"position":[[269,11]]},"1385":{"position":[[254,10]]},"1516":{"position":[[255,14]]},"1520":{"position":[[73,10]]},"1522":{"position":[[124,10]]},"1535":{"position":[[206,10],[397,10]]},"1539":{"position":[[91,10]]},"1541":{"position":[[630,10]]},"1543":{"position":[[313,10],[551,11]]},"1559":{"position":[[135,13]]},"1569":{"position":[[264,10]]},"1622":{"position":[[398,10],[589,10],[1294,10],[1693,10],[1757,10]]},"1634":{"position":[[48,11],[660,10],[765,10]]},"1642":{"position":[[146,10],[246,10]]},"1678":{"position":[[109,12]]},"1715":{"position":[[109,12]]},"1760":{"position":[[109,12]]},"1778":{"position":[[833,10]]},"1859":{"position":[[530,13]]},"1886":{"position":[[305,10]]},"1990":{"position":[[261,14],[299,10]]}}}],["compatible.yaml",{"_index":5603,"t":{"1522":{"position":[[169,16]]}}}],["compet",{"_index":6404,"t":{"1895":{"position":[[163,9]]}}}],["competitor",{"_index":1191,"t":{"177":{"position":[[1373,11]]}}}],["compil",{"_index":3017,"t":{"587":{"position":[[166,7]]},"1541":{"position":[[426,8]]}}}],["complain",{"_index":4337,"t":{"1016":{"position":[[1338,8]]}}}],["complement",{"_index":2942,"t":{"531":{"position":[[13,10]]},"1475":{"position":[[23,11]]}}}],["complet",{"_index":606,"t":{"92":{"position":[[583,8]]},"175":{"position":[[1071,8]]},"231":{"position":[[390,13]]},"260":{"position":[[211,8]]},"345":{"position":[[544,10]]},"358":{"position":[[1623,9]]},"386":{"position":[[302,8]]},"442":{"position":[[43,11]]},"447":{"position":[[457,10]]},"657":{"position":[[86,10]]},"763":{"position":[[247,10]]},"769":{"position":[[551,10]]},"860":{"position":[[1220,10],[3034,11]]},"971":{"position":[[65,9]]},"1034":{"position":[[351,8],[1187,9],[1660,9],[2455,9],[2565,9],[2701,9],[2824,9],[2951,9],[3092,9],[3231,9],[3388,9],[3524,9],[3663,9],[3789,9],[3924,9],[4059,9],[4194,9],[4328,9],[4471,9],[4624,9],[4785,9],[4935,9],[5053,9],[5182,9],[5821,9],[6652,9],[7265,9]]},"1116":{"position":[[709,10]]},"1280":{"position":[[251,8]]},"1308":{"position":[[827,8]]},"1355":{"position":[[167,8],[251,8],[672,8]]},"1363":{"position":[[265,10]]},"1402":{"position":[[1211,8]]},"1434":{"position":[[1268,8]]},"1436":{"position":[[712,8]]},"1610":{"position":[[820,10]]},"1692":{"position":[[911,11]]},"1729":{"position":[[983,11]]},"1735":{"position":[[589,12]]},"1774":{"position":[[1124,11]]},"1818":{"position":[[108,12]]},"1886":{"position":[[435,8]]},"1891":{"position":[[1253,8],[3057,10],[5397,8]]},"1966":{"position":[[3650,10]]},"1977":{"position":[[933,8],[1439,8]]},"2028":{"position":[[716,8]]},"2090":{"position":[[422,8]]},"2126":{"position":[[263,8]]}}}],["complex",{"_index":1752,"t":{"292":{"position":[[793,10]]},"1334":{"position":[[257,10]]},"1541":{"position":[[659,7]]},"1586":{"position":[[360,7]]},"1657":{"position":[[37,7]]},"1659":{"position":[[233,11]]},"1663":{"position":[[15,10]]},"1671":{"position":[[317,7]]},"1932":{"position":[[3440,8]]},"1979":{"position":[[1513,10]]},"1998":{"position":[[966,12],[1136,10]]},"2000":{"position":[[341,10]]},"2002":{"position":[[300,10]]},"2004":{"position":[[988,10]]},"2088":{"position":[[48,7]]}}}],["compli",{"_index":581,"t":{"90":{"position":[[227,6]]},"144":{"position":[[238,8]]},"1368":{"position":[[115,6]]},"1469":{"position":[[433,6]]},"2015":{"position":[[254,6]]}}}],["complianc",{"_index":189,"t":{"25":{"position":[[747,10]]},"30":{"position":[[191,10]]},"177":{"position":[[421,10]]},"535":{"position":[[51,10]]},"1355":{"position":[[858,10]]},"1383":{"position":[[380,10],[447,11]]},"1488":{"position":[[676,10]]},"1516":{"position":[[501,10]]},"1520":{"position":[[136,10]]},"1539":{"position":[[139,10]]},"1541":{"position":[[24,10],[362,10]]},"1563":{"position":[[412,10]]},"1624":{"position":[[334,10]]},"1640":{"position":[[97,10],[144,10]]},"1651":{"position":[[39,10]]},"1710":{"position":[[364,10]]},"1733":{"position":[[698,11],[1349,10]]},"1735":{"position":[[364,10],[574,10]]},"1776":{"position":[[543,11],[1194,10]]},"1778":{"position":[[449,10],[659,11],[844,10]]},"1864":{"position":[[328,10]]},"1893":{"position":[[254,10]]},"2065":{"position":[[179,10]]}}}],["compliance_check",{"_index":1853,"t":{"317":{"position":[[1606,17]]}}}],["compliant",{"_index":2944,"t":{"537":{"position":[[63,10]]},"1260":{"position":[[125,9]]},"1402":{"position":[[549,10]]},"1417":{"position":[[595,9]]},"1451":{"position":[[595,9]]},"1586":{"position":[[192,9]]},"1706":{"position":[[26,9]]},"1733":{"position":[[26,9]]},"1816":{"position":[[908,10]]},"1886":{"position":[[114,9],[200,9]]},"1906":{"position":[[273,9]]},"1917":{"position":[[804,9]]},"2024":{"position":[[437,9]]},"2028":{"position":[[3568,9]]}}}],["complic",{"_index":2456,"t":{"451":{"position":[[669,12]]},"2000":{"position":[[467,11]]}}}],["compon",{"_index":1558,"t":{"237":{"position":[[181,11]]},"280":{"position":[[28,10]]},"288":{"position":[[64,10]]},"298":{"position":[[147,9]]},"363":{"position":[[61,10]]},"418":{"position":[[1123,10],[1427,10]]},"455":{"position":[[79,9]]},"457":{"position":[[2143,10],[2960,11],[8944,10]]},"486":{"position":[[776,10]]},"489":{"position":[[123,10]]},"585":{"position":[[117,11]]},"591":{"position":[[62,9]]},"595":{"position":[[977,11]]},"735":{"position":[[1458,11]]},"816":{"position":[[221,10]]},"860":{"position":[[2894,10]]},"1112":{"position":[[213,10],[543,10]]},"1260":{"position":[[218,9]]},"1270":{"position":[[763,10]]},"1280":{"position":[[660,12],[755,11],[866,12],[941,10]]},"1308":{"position":[[878,10]]},"1346":{"position":[[236,11]]},"1368":{"position":[[1278,11]]},"1379":{"position":[[104,11],[291,10]]},"1387":{"position":[[122,9]]},"1413":{"position":[[146,11]]},"1484":{"position":[[104,11],[253,9]]},"1577":{"position":[[479,11]]},"1657":{"position":[[78,10],[195,11]]},"1661":{"position":[[60,10],[75,10]]},"1665":{"position":[[704,10],[721,9],[747,9],[962,10],[1018,9]]},"1667":{"position":[[252,9],[933,10],[1142,10],[1538,10]]},"1669":{"position":[[705,10],[720,10],[1269,10]]},"1904":{"position":[[838,9]]},"1915":{"position":[[628,9]]},"1971":{"position":[[372,10]]},"1977":{"position":[[295,11]]},"1979":{"position":[[464,11],[490,9]]},"2007":{"position":[[366,10],[552,9]]},"2011":{"position":[[614,9]]},"2022":{"position":[[1499,9]]},"2026":{"position":[[582,9]]},"2051":{"position":[[425,11]]},"2094":{"position":[[263,10],[654,10],[731,9],[790,9],[858,9],[931,9],[1656,10],[1923,9],[2037,9],[2430,9]]},"2096":{"position":[[249,10],[1358,10]]},"2116":{"position":[[35,11],[258,11]]},"2118":{"position":[[57,10],[70,9],[154,11],[244,10],[330,9],[443,10]]},"2120":{"position":[[0,10],[113,10],[124,10]]},"2202":{"position":[[297,9]]},"2206":{"position":[[102,9]]},"2212":{"position":[[85,10]]}}}],["component'",{"_index":5793,"t":{"1667":{"position":[[1729,11]]}}}],["component(",{"_index":5028,"t":{"1280":{"position":[[823,12]]}}}],["component/compon",{"_index":5789,"t":{"1667":{"position":[[455,19]]}}}],["component>_s",{"_index":2858,"t":{"489":{"position":[[709,18]]}}}],["compos",{"_index":3375,"t":{"708":{"position":[[37,8]]},"1043":{"position":[[368,7],[419,7]]},"1165":{"position":[[328,8]]},"1168":{"position":[[116,7],[2179,7]]},"1184":{"position":[[246,7]]},"1374":{"position":[[244,7],[321,7],[399,7],[517,8]]},"1411":{"position":[[659,7],[711,7],[745,7],[792,7]]},"1445":{"position":[[541,7],[593,7],[627,7],[674,7]]},"1964":{"position":[[4440,8],[4479,8],[4506,8]]},"1971":{"position":[[122,8]]},"2007":{"position":[[115,8]]},"2096":{"position":[[94,8]]}}}],["compose@manager.servic",{"_index":4896,"t":{"1184":{"position":[[215,23],[323,23]]}}}],["comprehend",{"_index":5780,"t":{"1665":{"position":[[136,10]]},"1667":{"position":[[136,10]]}}}],["comprehens",{"_index":2065,"t":{"345":{"position":[[280,13]]},"1400":{"position":[[62,13]]},"1545":{"position":[[224,17]]},"1549":{"position":[[106,14]]},"1657":{"position":[[237,14]]},"1669":{"position":[[320,13]]},"1671":{"position":[[202,15]]},"1720":{"position":[[501,13]]},"1765":{"position":[[501,13]]},"1994":{"position":[[6,13]]}}}],["compress",{"_index":2175,"t":{"358":{"position":[[1817,10]]}}}],["compris",{"_index":2946,"t":{"541":{"position":[[15,9]]},"1353":{"position":[[60,9]]},"1363":{"position":[[88,9]]},"1462":{"position":[[118,9]]},"1657":{"position":[[56,9]]},"1998":{"position":[[1015,8]]}}}],["compromis",{"_index":6546,"t":{"1977":{"position":[[900,11]]}}}],["comput",{"_index":1633,"t":{"260":{"position":[[53,9]]},"539":{"position":[[67,9]]},"563":{"position":[[55,7],[186,7]]},"565":{"position":[[49,7],[481,7],[798,7],[834,7]]},"567":{"position":[[392,7]]},"571":{"position":[[85,7]]},"573":{"position":[[2,7],[43,7],[84,7],[121,7],[335,7]]},"579":{"position":[[171,7]]},"583":{"position":[[92,7]]},"593":{"position":[[32,8],[185,7]]},"606":{"position":[[194,7]]},"693":{"position":[[637,7]]},"729":{"position":[[1054,9],[1719,9]]},"816":{"position":[[251,8]]},"1051":{"position":[[194,7]]},"1093":{"position":[[338,7]]},"1417":{"position":[[275,8]]},"1451":{"position":[[275,8]]},"1555":{"position":[[283,7]]},"1665":{"position":[[401,7]]},"1700":{"position":[[452,7],[548,7],[641,7],[983,6]]},"1704":{"position":[[900,7]]},"1731":{"position":[[922,7]]},"1747":{"position":[[73,7],[169,7],[264,7],[636,7]]},"1770":{"position":[[1587,7]]},"1788":{"position":[[476,7],[836,7]]},"1837":{"position":[[0,7],[566,7]]},"1853":{"position":[[328,7]]},"1926":{"position":[[633,7]]},"1932":{"position":[[1208,7]]},"1973":{"position":[[393,13]]},"2009":{"position":[[369,13]]},"2013":{"position":[[757,11]]},"2133":{"position":[[621,7]]},"2155":{"position":[[325,9]]},"2212":{"position":[[107,9]]}}}],["compute.inst",{"_index":5042,"t":{"1298":{"position":[[18,20]]}}}],["compute.instance.create.end",{"_index":5080,"t":{"1298":{"position":[[1077,27]]}}}],["compute.instance.exist",{"_index":5085,"t":{"1298":{"position":[[1305,23]]}}}],["compute.instance.upd",{"_index":5082,"t":{"1298":{"position":[[1201,23]]}}}],["compute_id",{"_index":4643,"t":{"1093":{"position":[[269,10]]}}}],["con",{"_index":6566,"t":{"1992":{"position":[[149,4]]},"1994":{"position":[[133,5]]},"1996":{"position":[[206,5]]},"2000":{"position":[[257,5]]}}}],["concept",{"_index":1802,"t":{"309":{"position":[[248,8]]},"1280":{"position":[[404,8]]},"1402":{"position":[[106,7],[318,8]]},"1588":{"position":[[248,7]]},"1822":{"position":[[13,7]]},"1941":{"position":[[205,7]]},"1977":{"position":[[2126,7]]},"2013":{"position":[[632,7]]},"2028":{"position":[[1036,7],[1637,7],[4696,7]]}}}],["concepts/api's/autom",{"_index":5033,"t":{"1280":{"position":[[1214,25]]}}}],["conceptu",{"_index":6695,"t":{"2077":{"position":[[688,10]]}}}],["concern",{"_index":5659,"t":{"1569":{"position":[[28,9]]}}}],["concis",{"_index":5791,"t":{"1667":{"position":[[1085,7]]}}}],["conclus",{"_index":6429,"t":{"1932":{"position":[[482,11],[1038,11],[1933,11],[2551,11],[3152,11],[4116,11]]},"1968":{"position":[[26,10]]},"2004":{"position":[[1459,11]]},"2088":{"position":[[607,10]]}}}],["concret",{"_index":1397,"t":{"197":{"position":[[110,8]]},"533":{"position":[[30,8]]}}}],["concurr",{"_index":5647,"t":{"1559":{"position":[[553,10]]},"1986":{"position":[[910,10]]},"1988":{"position":[[1600,10],[1666,10]]},"1990":{"position":[[657,12],[721,12]]},"1994":{"position":[[500,10]]}}}],["condit",{"_index":886,"t":{"152":{"position":[[28,9],[191,9]]},"352":{"position":[[1918,9]]},"358":{"position":[[768,10]]},"1638":{"position":[[313,9]]},"1640":{"position":[[300,9],[355,9]]},"1642":{"position":[[526,10],[760,10],[868,10]]},"1835":{"position":[[87,9]]},"1837":{"position":[[272,10]]},"2090":{"position":[[877,10]]}}}],["conduct",{"_index":5541,"t":{"1458":{"position":[[209,7]]}}}],["conductor",{"_index":2979,"t":{"567":{"position":[[528,9],[553,9],[587,11]]}}}],["confer",{"_index":483,"t":{"70":{"position":[[522,10]]},"1962":{"position":[[2362,12],[3605,12]]}}}],["conferenc",{"_index":430,"t":{"68":{"position":[[51,13]]}}}],["confid",{"_index":6797,"t":{"2168":{"position":[[131,9]]}}}],["config",{"_index":724,"t":{"112":{"position":[[21,6]]},"319":{"position":[[3397,6]]},"333":{"position":[[355,6]]},"341":{"position":[[172,6],[357,6],[576,6],[724,6],[915,6]]},"420":{"position":[[3823,6],[5628,7]]},"449":{"position":[[132,6]]},"455":{"position":[[221,6]]},"457":{"position":[[5906,6],[6008,6]]},"459":{"position":[[206,7],[349,6]]},"470":{"position":[[1095,6],[2263,6]]},"472":{"position":[[829,6],[981,6],[1185,6],[1867,6],[2233,10],[2923,6]]},"474":{"position":[[828,6],[965,7],[1021,6]]},"476":{"position":[[1502,6],[1702,6],[2259,6]]},"478":{"position":[[350,6]]},"687":{"position":[[70,6]]},"746":{"position":[[169,6],[257,6],[314,6],[2667,6]]},"798":{"position":[[158,6],[305,6]]},"839":{"position":[[178,6],[340,6]]},"1001":{"position":[[360,6]]},"1010":{"position":[[228,6]]},"1034":{"position":[[3272,6],[3588,6],[3848,6],[3983,6],[4118,6],[4252,6],[5094,6]]},"1174":{"position":[[970,6]]},"1179":{"position":[[4,6],[145,6]]},"1292":{"position":[[210,6]]},"1912":{"position":[[223,6]]},"2096":{"position":[[698,6],[793,6],[851,6]]}}}],["config.json",{"_index":3604,"t":{"746":{"position":[[3864,11],[4564,11]]},"1034":{"position":[[4377,11]]}}}],["config.yaml",{"_index":2635,"t":{"470":{"position":[[1133,11]]}}}],["config.yaml.templ",{"_index":6412,"t":{"1912":{"position":[[253,22]]}}}],["config/openstack",{"_index":2419,"t":{"424":{"position":[[1103,20]]},"438":{"position":[[374,19]]}}}],["config/openstack/clouds.yaml",{"_index":1953,"t":{"321":{"position":[[933,31]]},"453":{"position":[[1310,32]]},"493":{"position":[[719,31]]}}}],["config_fil",{"_index":3610,"t":{"746":{"position":[[4198,15],[4835,15]]}}}],["config_path",{"_index":2725,"t":{"474":{"position":[[2091,11]]}}}],["configur",{"_index":437,"t":{"68":{"position":[[150,13]]},"120":{"position":[[247,13]]},"150":{"position":[[414,13]]},"154":{"position":[[119,9]]},"158":{"position":[[205,13]]},"171":{"position":[[166,13],[441,10]]},"247":{"position":[[405,10]]},"251":{"position":[[1228,10],[1393,9]]},"298":{"position":[[306,13]]},"307":{"position":[[273,10]]},"311":{"position":[[159,14],[189,13]]},"313":{"position":[[145,13],[672,13],[759,13]]},"315":{"position":[[11,10]]},"317":{"position":[[71,14],[326,13],[494,15]]},"319":{"position":[[5492,13]]},"335":{"position":[[45,13],[395,13]]},"386":{"position":[[51,13]]},"388":{"position":[[44,13]]},"390":{"position":[[50,13]]},"392":{"position":[[46,13]]},"394":{"position":[[42,13]]},"418":{"position":[[1753,13]]},"420":{"position":[[4361,9],[5888,13]]},"422":{"position":[[2414,13]]},"426":{"position":[[684,13],[729,13],[794,13],[836,13]]},"453":{"position":[[1111,11],[1224,13],[1293,13]]},"457":{"position":[[3661,13],[6750,13],[6895,13],[7142,12],[7201,13],[7523,13],[7703,13],[7846,13],[7922,13]]},"462":{"position":[[1946,13],[2056,13],[2150,13],[2292,12],[2351,13]]},"470":{"position":[[487,13]]},"472":{"position":[[101,11],[218,13],[348,9],[467,9],[845,9],[878,13],[2402,10],[2994,9],[3036,10],[3484,10]]},"474":{"position":[[1817,13],[1862,13]]},"482":{"position":[[152,14]]},"489":{"position":[[679,10]]},"565":{"position":[[908,9]]},"628":{"position":[[4,13],[199,14]]},"632":{"position":[[1078,13]]},"634":{"position":[[1117,13]]},"659":{"position":[[14,13],[1113,13],[1153,13],[1297,13]]},"663":{"position":[[54,14]]},"665":{"position":[[124,13],[822,13],[1489,13],[1611,13],[1658,14],[2275,13],[2413,13]]},"667":{"position":[[61,15]]},"670":{"position":[[121,14]]},"679":{"position":[[46,9]]},"704":{"position":[[155,13]]},"706":{"position":[[4,13],[77,13]]},"708":{"position":[[2,13],[350,13]]},"712":{"position":[[153,13],[636,13]]},"714":{"position":[[22,13],[1156,16]]},"718":{"position":[[581,13]]},"720":{"position":[[4,13],[191,13]]},"724":{"position":[[579,13],[1519,13],[1554,13]]},"729":{"position":[[1219,14]]},"732":{"position":[[203,13]]},"735":{"position":[[275,13],[889,13],[1170,13],[1501,13],[1590,13]]},"737":{"position":[[536,13]]},"746":{"position":[[59,13],[2050,13],[2707,13],[3287,13],[3912,11]]},"749":{"position":[[78,13],[108,9],[254,13]]},"760":{"position":[[107,13]]},"763":{"position":[[2192,13],[2343,14],[2407,14],[2528,13],[3445,13]]},"765":{"position":[[68,13]]},"767":{"position":[[2220,13]]},"769":{"position":[[382,14],[492,13],[639,13],[769,13],[839,13]]},"773":{"position":[[13,13],[48,13]]},"789":{"position":[[30,9]]},"802":{"position":[[91,10],[1040,13],[2235,13],[2975,13]]},"816":{"position":[[4,13],[87,13]]},"834":{"position":[[1176,13]]},"847":{"position":[[198,13]]},"850":{"position":[[15,14],[1677,14],[2020,13],[2566,11],[2600,10]]},"852":{"position":[[415,13]]},"860":{"position":[[655,9],[815,9],[1834,9]]},"869":{"position":[[50,13],[185,13],[246,13],[278,13],[301,13],[384,13],[485,13],[820,13],[994,13],[1180,13],[1304,13]]},"871":{"position":[[366,13],[1246,13]]},"873":{"position":[[353,9]]},"941":{"position":[[326,13]]},"1010":{"position":[[311,9],[476,13],[1866,10],[1998,10],[2288,10],[2364,10],[2407,13],[2429,13],[2500,13],[2544,13],[2613,13],[2656,9],[2731,13],[2862,13],[2928,13],[2974,13],[3002,13],[3053,13]]},"1012":{"position":[[291,13]]},"1071":{"position":[[4,13],[199,14]]},"1075":{"position":[[1078,13]]},"1077":{"position":[[1117,13]]},"1112":{"position":[[782,13]]},"1122":{"position":[[273,13]]},"1124":{"position":[[374,13]]},"1137":{"position":[[415,13]]},"1141":{"position":[[195,13]]},"1168":{"position":[[168,9]]},"1172":{"position":[[367,14]]},"1174":{"position":[[1686,14]]},"1179":{"position":[[53,13]]},"1207":{"position":[[3399,13],[4393,13]]},"1209":{"position":[[218,13],[425,10]]},"1218":{"position":[[136,13],[177,13],[236,13],[289,13]]},"1260":{"position":[[77,9]]},"1262":{"position":[[1676,14],[4190,10]]},"1314":{"position":[[1088,10]]},"1332":{"position":[[19,13]]},"1436":{"position":[[110,13]]},"1441":{"position":[[165,13]]},"1561":{"position":[[225,14]]},"1667":{"position":[[1195,14],[1464,14],[1510,12]]},"1671":{"position":[[829,13]]},"1696":{"position":[[387,10]]},"1743":{"position":[[387,10]]},"1784":{"position":[[400,10]]},"1818":{"position":[[61,10]]},"1895":{"position":[[247,10],[1013,13]]},"1926":{"position":[[1571,13]]},"1928":{"position":[[362,14],[548,14]]},"1932":{"position":[[64,10],[248,14],[2135,13],[2280,10],[2946,10],[3399,9],[3736,13],[4484,13],[4656,14]]},"1966":{"position":[[3839,10]]},"2026":{"position":[[377,9],[896,13]]},"2028":{"position":[[1192,13],[1879,11],[2179,13],[2763,13],[3986,10],[4610,14],[5064,14]]},"2032":{"position":[[104,13]]},"2039":{"position":[[211,13],[295,14]]},"2043":{"position":[[47,13],[363,13],[829,13]]},"2045":{"position":[[15,13],[609,14],[815,13]]},"2047":{"position":[[50,13]]},"2051":{"position":[[1248,10],[1358,13]]},"2068":{"position":[[677,10],[1341,13]]},"2077":{"position":[[3105,10]]},"2094":{"position":[[1441,13]]},"2096":{"position":[[682,13]]},"2170":{"position":[[87,13]]},"2212":{"position":[[159,11]]}}}],["configuration.md",{"_index":5787,"t":{"1667":{"position":[[336,16]]}}}],["configuration.yml",{"_index":4316,"t":{"1010":{"position":[[2824,18]]},"1441":{"position":[[17,17],[141,19]]}}}],["configuration/environments/manag",{"_index":3712,"t":{"765":{"position":[[16,34],[200,34]]}}}],["configuration_vers",{"_index":3795,"t":{"791":{"position":[[169,21]]}}}],["configuraton",{"_index":6638,"t":{"2028":{"position":[[4553,12]]}}}],["configure_containerd.sh",{"_index":2718,"t":{"474":{"position":[[1694,23],[1738,23]]}}}],["configurt",{"_index":3737,"t":{"769":{"position":[[577,13]]}}}],["confirm",{"_index":1463,"t":{"212":{"position":[[152,9],[257,13]]},"834":{"position":[[773,13]]},"1888":{"position":[[546,9]]}}}],["conflict",{"_index":2573,"t":{"459":{"position":[[71,9]]},"836":{"position":[[934,11]]},"1449":{"position":[[51,9]]},"1966":{"position":[[662,9]]},"1990":{"position":[[765,10]]},"2039":{"position":[[319,8]]}}}],["conform",{"_index":1712,"t":{"286":{"position":[[23,10],[219,11]]},"337":{"position":[[205,11],[340,11],[481,11],[622,11],[1785,11],[1869,11]]},"339":{"position":[[149,11],[180,11],[590,11],[764,11]]},"345":{"position":[[361,11]]},"390":{"position":[[11,11],[104,11],[155,10]]},"412":{"position":[[90,11]]},"420":{"position":[[5018,11]]},"422":{"position":[[2024,11]]},"468":{"position":[[241,11]]},"504":{"position":[[798,11]]},"1353":{"position":[[300,11]]},"1383":{"position":[[281,11]]},"1417":{"position":[[84,11],[848,11],[918,11]]},"1451":{"position":[[84,11]]},"1516":{"position":[[198,12]]},"1537":{"position":[[73,7]]},"1590":{"position":[[837,11],[902,11],[947,11]]},"1598":{"position":[[178,10]]},"1615":{"position":[[213,11],[248,11]]},"1617":{"position":[[63,11]]},"1619":{"position":[[114,11],[286,7]]},"1877":{"position":[[129,10]]},"1881":{"position":[[379,7]]},"1901":{"position":[[193,10]]},"1912":{"position":[[4,11]]},"1923":{"position":[[38,11]]},"2019":{"position":[[0,11]]},"2085":{"position":[[0,11]]},"2193":{"position":[[0,11]]}}}],["confus",{"_index":5731,"t":{"1617":{"position":[[28,9]]},"2068":{"position":[[1813,9]]}}}],["conjunct",{"_index":2367,"t":{"420":{"position":[[4945,11]]},"1786":{"position":[[472,11]]},"2045":{"position":[[692,11]]}}}],["conn",{"_index":3694,"t":{"763":{"position":[[1029,4],[1148,4],[1779,4]]}}}],["connect",{"_index":146,"t":{"23":{"position":[[192,9]]},"68":{"position":[[204,8]]},"70":{"position":[[0,7],[504,9],[600,12],[639,12]]},"83":{"position":[[3,7]]},"239":{"position":[[278,7],[332,10]]},"241":{"position":[[109,7]]},"243":{"position":[[102,7]]},"245":{"position":[[139,7]]},"247":{"position":[[143,7],[350,7],[1059,9]]},"253":{"position":[[48,7],[143,7]]},"319":{"position":[[2357,7]]},"321":{"position":[[604,9]]},"327":{"position":[[402,11],[482,10],[554,11]]},"333":{"position":[[865,10]]},"420":{"position":[[1384,7],[4441,11]]},"422":{"position":[[1729,9]]},"453":{"position":[[357,10]]},"504":{"position":[[1055,12]]},"561":{"position":[[403,9],[485,12]]},"573":{"position":[[176,8]]},"585":{"position":[[417,10]]},"597":{"position":[[220,7]]},"763":{"position":[[2871,11],[3097,7]]},"785":{"position":[[209,7]]},"798":{"position":[[217,7]]},"802":{"position":[[27,7],[1577,7],[2302,8]]},"829":{"position":[[784,13]]},"834":{"position":[[1069,7],[1434,11]]},"836":{"position":[[761,7]]},"839":{"position":[[244,7]]},"850":{"position":[[891,10],[956,10],[1030,10],[1089,10],[1148,10],[1209,10],[1270,10],[1331,10],[2790,11]]},"860":{"position":[[195,13]]},"1172":{"position":[[318,11]]},"1187":{"position":[[238,7],[296,10]]},"1262":{"position":[[675,7],[1078,7],[1322,7]]},"1329":{"position":[[364,10]]},"1434":{"position":[[1001,7],[1390,11]]},"1436":{"position":[[37,7]]},"1449":{"position":[[193,10]]},"1465":{"position":[[383,13]]},"1814":{"position":[[584,7]]},"1855":{"position":[[141,7]]},"1881":{"position":[[139,7]]},"1891":{"position":[[4102,10]]},"1988":{"position":[[699,11]]},"1990":{"position":[[645,11]]},"2024":{"position":[[275,7]]},"2028":{"position":[[2511,9],[3599,7],[5641,9]]},"2065":{"position":[[65,8]]},"2118":{"position":[[272,12]]},"2196":{"position":[[311,10],[411,10]]}}}],["connect/auth?client_id=secur",{"_index":4989,"t":{"1262":{"position":[[3410,31]]}}}],["connect/auth?scope=openid",{"_index":4993,"t":{"1262":{"position":[[3793,30]]}}}],["consectetur",{"_index":5,"t":{"3":{"position":[[28,11]]}}}],["consensu",{"_index":5025,"t":{"1280":{"position":[[379,9],[498,9],[529,9]]},"1592":{"position":[[168,10],[217,9]]}}}],["consequ",{"_index":2077,"t":{"345":{"position":[[1435,13]]},"802":{"position":[[666,10]]},"1543":{"position":[[347,13]]},"1659":{"position":[[245,13]]},"1877":{"position":[[423,12]]},"2028":{"position":[[1576,12]]}}}],["consequat",{"_index":17,"t":{"3":{"position":[[141,10]]}}}],["conserv",{"_index":4157,"t":{"938":{"position":[[487,12]]}}}],["consid",{"_index":1089,"t":{"173":{"position":[[460,10],[516,8],[1145,8]]},"179":{"position":[[489,8]]},"181":{"position":[[213,10],[327,10],[606,11],[762,10],[909,8]]},"185":{"position":[[787,10]]},"204":{"position":[[295,9]]},"206":{"position":[[14,8]]},"208":{"position":[[207,9]]},"317":{"position":[[553,10]]},"319":{"position":[[2174,10]]},"329":{"position":[[1222,10]]},"345":{"position":[[1083,8]]},"420":{"position":[[5052,10],[5204,10]]},"457":{"position":[[3421,9]]},"500":{"position":[[209,9]]},"593":{"position":[[282,10]]},"989":{"position":[[110,11]]},"1010":{"position":[[1357,9]]},"1314":{"position":[[435,8]]},"1567":{"position":[[476,11]]},"1588":{"position":[[1995,10]]},"1590":{"position":[[289,11],[406,10]]},"1596":{"position":[[84,10]]},"1600":{"position":[[295,10]]},"1636":{"position":[[272,10]]},"1708":{"position":[[1487,10]]},"1751":{"position":[[1503,10]]},"1792":{"position":[[1526,10]]},"1807":{"position":[[215,10]]},"1810":{"position":[[1535,10]]},"1816":{"position":[[551,10]]},"1891":{"position":[[4538,10]]},"1895":{"position":[[705,10]]},"1932":{"position":[[828,10],[1269,9]]},"1962":{"position":[[610,10],[832,10],[1078,10],[1814,10],[3182,10]]},"1966":{"position":[[1682,10],[1852,10],[2658,8],[5323,9]]},"2032":{"position":[[317,10]]},"2139":{"position":[[314,10]]},"2200":{"position":[[74,11]]}}}],["consider",{"_index":1039,"t":{"166":{"position":[[2109,14]]},"601":{"position":[[214,12]]},"1334":{"position":[[750,14]]},"1590":{"position":[[310,14]]},"1615":{"position":[[83,15]]},"1640":{"position":[[669,15]]},"1708":{"position":[[971,14]]},"1751":{"position":[[1010,14]]},"1755":{"position":[[635,14]]},"1792":{"position":[[1010,14]]},"1960":{"position":[[393,13]]},"1984":{"position":[[54,14]]},"1988":{"position":[[496,13]]},"2013":{"position":[[12,14]]},"2026":{"position":[[792,14]]},"2099":{"position":[[37,14]]}}}],["considerations.md",{"_index":1045,"t":{"166":{"position":[[2208,18]]}}}],["consist",{"_index":974,"t":{"164":{"position":[[627,10]]},"166":{"position":[[1169,10]]},"300":{"position":[[293,11]]},"561":{"position":[[24,8]]},"569":{"position":[[34,8]]},"628":{"position":[[18,8]]},"1071":{"position":[[18,8]]},"1145":{"position":[[93,10]]},"1436":{"position":[[565,10]]},"1516":{"position":[[549,8]]},"1535":{"position":[[39,10]]},"1545":{"position":[[198,12]]},"1561":{"position":[[454,11]]},"1563":{"position":[[459,11]]},"1588":{"position":[[701,7]]},"1638":{"position":[[24,8]]},"1659":{"position":[[388,10]]},"1671":{"position":[[433,10]]},"1818":{"position":[[125,11]]},"1891":{"position":[[4155,11]]},"1971":{"position":[[54,8]]},"1975":{"position":[[2019,13]]},"1977":{"position":[[1266,7]]},"2007":{"position":[[54,8]]},"2063":{"position":[[306,10]]},"2155":{"position":[[28,8]]}}}],["consol",{"_index":2202,"t":{"373":{"position":[[59,7],[117,7],[160,7]]},"375":{"position":[[5,7],[63,7],[147,7],[187,7]]},"386":{"position":[[152,8]]},"665":{"position":[[2501,7]]},"834":{"position":[[1724,8]]},"836":{"position":[[711,7],[1669,8]]},"1020":{"position":[[2,7]]},"1022":{"position":[[19,7],[35,7],[96,8],[330,7]]},"1024":{"position":[[97,7],[232,7]]},"1026":{"position":[[41,7],[452,7]]},"1028":{"position":[[27,7],[251,7]]},"1187":{"position":[[415,7]]},"1262":{"position":[[3286,7],[3448,9],[3997,7],[4465,8]]},"1431":{"position":[[724,7]]}}}],["console.log(\"insid",{"_index":823,"t":{"142":{"position":[[492,19]]}}}],["console=capi",{"_index":2200,"t":{"373":{"position":[[9,12]]},"375":{"position":[[13,12]]}}}],["consolid",{"_index":5608,"t":{"1528":{"position":[[128,12]]}}}],["const",{"_index":657,"t":{"100":{"position":[[936,5],[962,5],[1088,5],[1229,5],[1266,5],[1434,5],[1509,5],[1621,5],[1723,5],[1871,5],[2002,5],[2134,5]]},"142":{"position":[[465,5]]}}}],["constitut",{"_index":1238,"t":{"181":{"position":[[13,11]]}}}],["constraint",{"_index":6540,"t":{"1975":{"position":[[937,10],[1036,10]]},"1977":{"position":[[2888,10]]},"1981":{"position":[[136,11]]},"2004":{"position":[[307,12]]},"2141":{"position":[[285,13]]}}}],["constru",{"_index":6286,"t":{"1826":{"position":[[769,9]]}}}],["construct",{"_index":2640,"t":{"470":{"position":[[1956,14]]},"1622":{"position":[[2048,12]]},"1710":{"position":[[84,9]]},"1735":{"position":[[84,9]]},"1778":{"position":[[84,9]]}}}],["consult",{"_index":5474,"t":{"1397":{"position":[[290,7]]},"1431":{"position":[[559,7]]},"1537":{"position":[[282,7]]},"2065":{"position":[[278,7]]}}}],["consum",{"_index":1193,"t":{"177":{"position":[[1403,7]]},"179":{"position":[[95,7]]},"181":{"position":[[145,9]]},"185":{"position":[[1925,7]]},"187":{"position":[[317,9]]},"247":{"position":[[56,7]]},"422":{"position":[[201,8]]},"603":{"position":[[213,8],[230,8],[239,8],[344,8]]},"816":{"position":[[990,9]]},"1130":{"position":[[16,7]]},"1170":{"position":[[637,8]]},"1332":{"position":[[398,10]]},"1355":{"position":[[808,9]]},"1434":{"position":[[962,7]]},"1739":{"position":[[517,9]]},"1780":{"position":[[515,9]]},"1941":{"position":[[8,9],[290,9]]},"1943":{"position":[[19,9]]},"2022":{"position":[[592,7]]},"2024":{"position":[[636,7]]},"2088":{"position":[[74,8],[294,9]]},"2094":{"position":[[1537,8],[1672,8]]},"2162":{"position":[[96,9],[193,9]]},"2172":{"position":[[216,9],[280,8]]},"2196":{"position":[[204,8]]},"2206":{"position":[[586,10]]}}}],["consumpt",{"_index":5561,"t":{"1471":{"position":[[579,11]]},"1801":{"position":[[322,12],[447,12]]},"1964":{"position":[[4058,11],[4089,11]]},"2028":{"position":[[5318,11]]},"2116":{"position":[[199,12]]}}}],["contact",{"_index":113,"t":{"18":{"position":[[49,7]]},"25":{"position":[[202,7]]},"27":{"position":[[41,7]]},"30":{"position":[[61,7]]},"32":{"position":[[41,7]]},"68":{"position":[[299,8]]},"72":{"position":[[58,9]]},"193":{"position":[[83,7]]},"231":{"position":[[34,7]]},"491":{"position":[[910,7]]},"778":{"position":[[192,7]]},"1541":{"position":[[151,7]]},"1816":{"position":[[1835,7]]}}}],["contain",{"_index":139,"t":{"23":{"position":[[63,7]]},"38":{"position":[[249,12]]},"64":{"position":[[75,9]]},"76":{"position":[[129,10],[229,10],[570,10]]},"78":{"position":[[163,11]]},"90":{"position":[[16,10],[78,7],[131,10]]},"94":{"position":[[15,7]]},"96":{"position":[[15,7]]},"166":{"position":[[2073,7]]},"177":{"position":[[811,7]]},"185":{"position":[[1127,8]]},"237":{"position":[[79,7]]},"243":{"position":[[11,9]]},"247":{"position":[[748,9]]},"265":{"position":[[283,9],[979,9]]},"276":{"position":[[90,9]]},"292":{"position":[[4,9],[97,9],[344,9]]},"294":{"position":[[63,9],[254,9]]},"296":{"position":[[4,9],[206,9],[258,10],[366,9]]},"298":{"position":[[40,9]]},"300":{"position":[[488,10],[534,9],[570,9],[604,9],[671,9]]},"302":{"position":[[226,10]]},"304":{"position":[[4,9],[582,9]]},"313":{"position":[[259,10]]},"317":{"position":[[954,8]]},"319":{"position":[[7668,8]]},"321":{"position":[[582,8]]},"323":{"position":[[300,9]]},"325":{"position":[[299,9]]},"335":{"position":[[342,7]]},"337":{"position":[[723,8],[1519,8]]},"341":{"position":[[215,8]]},"356":{"position":[[112,8]]},"420":{"position":[[5869,9]]},"422":{"position":[[1509,8]]},"424":{"position":[[146,11],[229,10]]},"470":{"position":[[1653,7],[2408,7],[3462,8]]},"472":{"position":[[14,9],[167,9],[193,9],[425,9],[500,9],[571,9],[628,9],[805,9],[1754,9],[1814,9],[1987,9],[2209,9],[2308,9],[2381,8],[2473,9],[2616,9],[2721,9],[2788,9],[3051,9],[3446,9],[3499,9],[3576,9]]},"474":{"position":[[1089,9],[1188,9],[1567,9],[3685,8]]},"476":{"position":[[642,8]]},"478":{"position":[[813,7]]},"484":{"position":[[46,9],[695,9],[765,9],[864,9]]},"495":{"position":[[855,9]]},"543":{"position":[[15,9],[61,9]]},"599":{"position":[[202,11],[330,10]]},"632":{"position":[[288,9]]},"634":{"position":[[349,9]]},"650":{"position":[[13,8]]},"667":{"position":[[26,8]]},"714":{"position":[[293,10],[1218,10]]},"718":{"position":[[514,8]]},"746":{"position":[[117,10],[793,9],[3352,9],[3815,10],[3848,9]]},"756":{"position":[[13,8]]},"767":{"position":[[90,10]]},"778":{"position":[[621,8]]},"802":{"position":[[2494,8]]},"1026":{"position":[[56,9]]},"1034":{"position":[[2877,10]]},"1036":{"position":[[12,9]]},"1075":{"position":[[288,9]]},"1077":{"position":[[349,9]]},"1099":{"position":[[95,9],[545,9],[646,9],[683,9],[777,9]]},"1101":{"position":[[23,9],[225,9],[327,9],[362,9]]},"1103":{"position":[[24,9]]},"1105":{"position":[[412,9],[520,9]]},"1107":{"position":[[4,9],[48,8],[269,9]]},"1109":{"position":[[18,9],[34,8]]},"1116":{"position":[[761,9],[979,9],[1491,9]]},"1122":{"position":[[448,8]]},"1170":{"position":[[110,8]]},"1174":{"position":[[1114,10]]},"1187":{"position":[[355,10]]},"1207":{"position":[[3661,10]]},"1209":{"position":[[102,11],[298,10],[749,10],[809,10]]},"1308":{"position":[[266,11],[868,9]]},"1316":{"position":[[34,10]]},"1326":{"position":[[348,9]]},"1349":{"position":[[4,9]]},"1368":{"position":[[492,9]]},"1381":{"position":[[86,9]]},"1383":{"position":[[313,9],[653,9]]},"1387":{"position":[[346,10]]},"1400":{"position":[[696,7]]},"1447":{"position":[[18,9]]},"1467":{"position":[[610,9]]},"1475":{"position":[[96,9]]},"1486":{"position":[[171,9]]},"1488":{"position":[[443,9]]},"1569":{"position":[[225,10]]},"1588":{"position":[[853,7]]},"1590":{"position":[[868,8]]},"1632":{"position":[[114,7],[499,7]]},"1647":{"position":[[258,9]]},"1665":{"position":[[763,9]]},"1796":{"position":[[36,9]]},"1801":{"position":[[121,7]]},"1807":{"position":[[55,9]]},"1810":{"position":[[2356,8],[2982,7]]},"1816":{"position":[[742,7],[1136,8],[1789,8]]},"1822":{"position":[[217,9]]},"1828":{"position":[[806,8]]},"1837":{"position":[[384,7]]},"1868":{"position":[[19,7]]},"1886":{"position":[[280,9],[343,10]]},"1888":{"position":[[774,9],[936,9]]},"1956":{"position":[[2,9],[82,9],[247,9],[385,9]]},"1958":{"position":[[82,9],[205,9],[398,9],[583,9],[733,9]]},"1960":{"position":[[58,9],[312,9],[488,9],[718,9]]},"1962":{"position":[[125,9],[1449,8],[2888,8]]},"1964":{"position":[[68,9],[206,9],[433,9],[1199,9],[1316,9],[1638,9],[1802,9],[1979,9],[2707,9],[2829,9],[2952,9],[3093,9],[4978,9]]},"1966":{"position":[[28,9],[275,9],[951,9],[1094,8],[1401,9],[1972,9],[2493,9],[3463,9],[4347,9],[5047,9],[5342,9]]},"1968":{"position":[[88,9]]},"1971":{"position":[[492,10]]},"1973":{"position":[[226,9],[339,11]]},"1975":{"position":[[107,8]]},"1998":{"position":[[126,11],[175,7],[306,10],[678,11]]},"2000":{"position":[[245,11],[304,9],[427,11]]},"2009":{"position":[[202,9],[315,11]]},"2011":{"position":[[555,8]]},"2058":{"position":[[6221,7],[6370,7]]},"2110":{"position":[[129,7],[285,7],[354,7],[440,7],[489,8],[590,7],[641,7]]}}}],["container",{"_index":1759,"t":{"296":{"position":[[165,13]]},"1665":{"position":[[325,16]]},"1984":{"position":[[289,16]]},"1998":{"position":[[593,16]]},"2004":{"position":[[544,16]]}}}],["containerd",{"_index":2352,"t":{"420":{"position":[[3797,10]]},"472":{"position":[[0,10],[243,10],[358,10],[477,10],[855,11],[867,10],[998,10],[1202,11],[1468,10],[1713,10],[2898,10],[3004,10]]},"474":{"position":[[425,11],[945,10],[1001,10],[1048,10],[1177,10],[1556,10],[1610,10],[1806,10],[1883,10]]},"1996":{"position":[[240,10]]}}}],["containerd.servic",{"_index":2727,"t":{"474":{"position":[[2178,18],[2692,20],[3196,20]]}}}],["containerd/host",{"_index":2706,"t":{"474":{"position":[[1224,16],[1330,16]]}}}],["containerd/hosts/docker.io",{"_index":2710,"t":{"474":{"position":[[1351,27]]}}}],["containerd_conf_append",{"_index":2720,"t":{"474":{"position":[[1936,22],[1973,23]]}}}],["containerd_registry_fil",{"_index":2350,"t":{"420":{"position":[[3712,25]]},"472":{"position":[[1037,25],[1668,25]]}}}],["contemporari",{"_index":5795,"t":{"1669":{"position":[[26,12]]}}}],["content",{"_index":599,"t":{"92":{"position":[[306,7],[821,8]]},"100":{"position":[[1021,8],[1982,7]]},"118":{"position":[[25,7]]},"138":{"position":[[123,7],[162,7],[202,7],[245,7],[287,7]]},"166":{"position":[[1624,7]]},"195":{"position":[[37,7],[242,7],[269,7],[306,7]]},"319":{"position":[[5135,7],[6441,7],[6499,7],[7798,7]]},"418":{"position":[[1592,7]]},"457":{"position":[[1219,7]]},"476":{"position":[[1444,7],[1976,7]]},"659":{"position":[[167,7]]},"710":{"position":[[12,7]]},"712":{"position":[[4,7]]},"718":{"position":[[4,7],[445,8]]},"746":{"position":[[2690,7]]},"869":{"position":[[1406,7]]},"1122":{"position":[[545,8],[645,7],[726,7]]},"1170":{"position":[[309,8]]},"1402":{"position":[[1262,8]]},"1436":{"position":[[763,8]]},"1488":{"position":[[780,7]]},"1549":{"position":[[121,7]]},"1590":{"position":[[668,9]]},"1619":{"position":[[24,8]]},"1669":{"position":[[1218,7]]},"1671":{"position":[[444,7]]},"1810":{"position":[[3657,7]]},"1895":{"position":[[831,8]]},"1964":{"position":[[1216,7],[3604,7],[4734,7]]},"1966":{"position":[[1192,7],[3238,7]]}}}],["contentfrom",{"_index":2763,"t":{"476":{"position":[[1641,12]]}}}],["context",{"_index":713,"t":{"104":{"position":[[199,7]]},"183":{"position":[[1559,7]]},"319":{"position":[[3159,7]]},"462":{"position":[[1108,7]]},"470":{"position":[[133,7],[193,7],[1204,8],[4573,7],[4669,7]]},"480":{"position":[[795,7],[912,7]]},"504":{"position":[[106,7],[144,7]]},"583":{"position":[[589,8]]},"1520":{"position":[[212,7]]},"1539":{"position":[[215,7]]},"1590":{"position":[[76,7],[707,8]]},"1667":{"position":[[594,7],[836,7]]},"1958":{"position":[[666,7]]},"1960":{"position":[[293,7]]},"1977":{"position":[[1220,7],[1686,7]]},"2013":{"position":[[712,7]]},"2024":{"position":[[820,7]]},"2028":{"position":[[5671,7]]},"2049":{"position":[[677,7]]},"2135":{"position":[[535,8]]}}}],["context=${clusternam",{"_index":2643,"t":{"470":{"position":[[2171,22]]}}}],["context=}.tfvar",{"_index":2433,"t":{"438":{"position":[[156,28]]}}}],["default.tfvar",{"_index":2430,"t":{"432":{"position":[[87,14]]}}}],["default_project_id",{"_index":163,"t":{"23":{"position":[[471,18]]},"25":{"position":[[30,18]]}}}],["defaults.sh",{"_index":4677,"t":{"1107":{"position":[[141,11]]}}}],["defaults/${cloud_provid",{"_index":2761,"t":{"476":{"position":[[1208,26]]},"478":{"position":[[476,26]]}}}],["defaults/cloud.conf",{"_index":2517,"t":{"457":{"position":[[5736,19]]}}}],["defaults/clust",{"_index":2762,"t":{"476":{"position":[[1338,16],[1863,16]]},"500":{"position":[[430,16]]}}}],["defaults/clusterctl.yaml",{"_index":2509,"t":{"457":{"position":[[4691,24]]},"493":{"position":[[159,24]]}}}],["defaults/harbor",{"_index":2792,"t":{"486":{"position":[[332,15]]}}}],["defcor",{"_index":1718,"t":{"286":{"position":[[186,8]]}}}],["defens",{"_index":1293,"t":{"183":{"position":[[1540,11]]}}}],["defin",{"_index":28,"t":{"7":{"position":[[88,9]]},"76":{"position":[[145,7],[505,7]]},"98":{"position":[[159,6]]},"120":{"position":[[232,7]]},"122":{"position":[[205,7]]},"142":{"position":[[73,6]]},"152":{"position":[[605,7]]},"154":{"position":[[23,7],[731,6]]},"158":{"position":[[42,7]]},"181":{"position":[[50,7]]},"212":{"position":[[848,6],[928,6]]},"315":{"position":[[763,6]]},"317":{"position":[[275,7],[450,6]]},"319":{"position":[[980,6],[1520,6],[2146,7],[2764,7],[2907,7],[3377,7]]},"333":{"position":[[191,7],[257,7],[625,6]]},"339":{"position":[[33,7],[402,7],[1277,7]]},"341":{"position":[[67,7]]},"358":{"position":[[663,6]]},"472":{"position":[[1152,7],[1279,7],[1403,7],[1513,7],[1537,7],[1900,7]]},"476":{"position":[[1465,7]]},"559":{"position":[[79,6]]},"597":{"position":[[408,8]]},"661":{"position":[[19,7]]},"665":{"position":[[1461,7],[1590,7]]},"735":{"position":[[691,7]]},"746":{"position":[[4599,7]]},"1024":{"position":[[43,7]]},"1139":{"position":[[420,7]]},"1141":{"position":[[40,7]]},"1170":{"position":[[422,7]]},"1172":{"position":[[262,7]]},"1207":{"position":[[27,7]]},"1209":{"position":[[1215,7]]},"1272":{"position":[[734,7]]},"1292":{"position":[[69,7]]},"1296":{"position":[[247,8]]},"1353":{"position":[[36,7],[225,7]]},"1368":{"position":[[728,7]]},"1557":{"position":[[488,7]]},"1561":{"position":[[203,7]]},"1638":{"position":[[74,6]]},"1657":{"position":[[333,6]]},"1669":{"position":[[1283,7]]},"1671":{"position":[[1143,7]]},"1680":{"position":[[45,6],[105,7]]},"1706":{"position":[[141,6]]},"1717":{"position":[[45,6],[105,7]]},"1733":{"position":[[141,6]]},"1762":{"position":[[45,6],[105,7]]},"1810":{"position":[[2817,7]]},"1835":{"position":[[143,7]]},"1841":{"position":[[45,6],[105,7]]},"1859":{"position":[[629,7]]},"1886":{"position":[[4,7]]},"1888":{"position":[[14,7]]},"1917":{"position":[[64,7]]},"1928":{"position":[[141,6]]},"1932":{"position":[[2869,7]]},"1936":{"position":[[309,7]]},"1941":{"position":[[247,6]]},"1943":{"position":[[266,6]]},"1958":{"position":[[782,7]]},"1962":{"position":[[188,7]]},"1964":{"position":[[389,7],[533,7]]},"1966":{"position":[[3110,7],[4625,7]]},"1973":{"position":[[295,7]]},"1975":{"position":[[641,7],[802,7],[1231,7]]},"1979":{"position":[[27,6],[738,6]]},"2009":{"position":[[271,7]]},"2013":{"position":[[675,7],[1110,7],[1448,7]]},"2045":{"position":[[655,7]]},"2049":{"position":[[456,7],[627,7],[835,7]]},"2058":{"position":[[6320,6]]},"2065":{"position":[[239,7]]},"2068":{"position":[[329,6]]},"2088":{"position":[[495,7]]},"2094":{"position":[[598,6],[647,6],[720,6],[781,6],[985,7]]},"2099":{"position":[[6,8]]},"2106":{"position":[[5,7]]},"2108":{"position":[[74,7]]},"2118":{"position":[[10,7]]},"2150":{"position":[[56,7]]},"2200":{"position":[[12,6]]},"2202":{"position":[[464,7]]}}}],["definit",{"_index":1251,"t":{"181":{"position":[[498,12],[1334,12]]},"311":{"position":[[525,11]]},"315":{"position":[[86,11],[728,11]]},"610":{"position":[[543,12]]},"612":{"position":[[21,11],[91,10],[208,11],[318,10]]},"626":{"position":[[231,10]]},"632":{"position":[[19,10],[219,11],[353,11]]},"634":{"position":[[19,10],[280,11],[410,11]]},"1055":{"position":[[543,12]]},"1057":{"position":[[21,11],[91,10],[208,11],[318,10]]},"1069":{"position":[[231,10]]},"1075":{"position":[[19,10],[219,11],[353,11]]},"1077":{"position":[[19,10],[280,11],[410,11]]},"1262":{"position":[[1052,10]]},"1280":{"position":[[554,10],[1424,12]]},"1391":{"position":[[528,10]]},"1425":{"position":[[572,10]]},"1883":{"position":[[101,11]]},"2043":{"position":[[106,10]]},"2058":{"position":[[108,10]]},"2063":{"position":[[49,11]]},"2096":{"position":[[260,10]]},"2106":{"position":[[60,11],[107,11],[242,11],[283,11]]}}}],["definition'",{"_index":3111,"t":{"632":{"position":[[397,12]]},"634":{"position":[[469,12]]},"1075":{"position":[[397,12]]},"1077":{"position":[[469,12]]}}}],["definiton",{"_index":6422,"t":{"1928":{"position":[[312,9]]}}}],["defrag",{"_index":2150,"t":{"358":{"position":[[109,11],[460,6],[701,10],[1511,10],[1645,10]]},"457":{"position":[[4848,6]]}}}],["defrag.servic",{"_index":2156,"t":{"358":{"position":[[307,14]]}}}],["defrag.sh",{"_index":2152,"t":{"358":{"position":[[181,9],[735,9],[3012,9]]}}}],["defrag.tim",{"_index":2158,"t":{"358":{"position":[[379,12]]}}}],["defragment",{"_index":2160,"t":{"358":{"position":[[411,15],[797,15],[1074,15],[1470,15],[1607,15],[1708,15],[2427,15],[2529,15],[2613,15],[2692,15],[2813,15],[2957,15]]},"1467":{"position":[[999,15]]}}}],["degre",{"_index":6305,"t":{"1828":{"position":[[948,7]]}}}],["delay",{"_index":5536,"t":{"1449":{"position":[[181,6]]}}}],["deleg",{"_index":1560,"t":{"239":{"position":[[63,8]]},"247":{"position":[[288,8]]},"1567":{"position":[[351,10]]},"2022":{"position":[[909,8]]},"2024":{"position":[[306,8]]},"2028":{"position":[[4708,9],[4871,9]]}}}],["delegate_to",{"_index":899,"t":{"152":{"position":[[524,12]]},"1139":{"position":[[339,12]]}}}],["delet",{"_index":2066,"t":{"345":{"position":[[392,9],[511,9]]},"457":{"position":[[5893,6],[5988,6],[6169,6],[6268,6],[6377,6]]},"470":{"position":[[4244,6],[4319,6]]},"484":{"position":[[939,8]]},"610":{"position":[[293,6]]},"632":{"position":[[1512,7]]},"665":{"position":[[596,7]]},"787":{"position":[[3373,8]]},"854":{"position":[[64,6]]},"860":{"position":[[1206,7]]},"1001":{"position":[[17,6],[90,6],[179,6]]},"1034":{"position":[[382,6],[396,6],[463,6],[480,6],[531,6],[570,6]]},"1055":{"position":[[293,6]]},"1075":{"position":[[1512,7]]},"1093":{"position":[[256,7],[319,6]]},"1122":{"position":[[602,8]]},"1181":{"position":[[205,6]]},"1469":{"position":[[52,6]]},"2047":{"position":[[509,7]]},"2114":{"position":[[113,6]]}}}],["delete_cluster.sh",{"_index":2656,"t":{"470":{"position":[[4834,17]]},"493":{"position":[[512,17]]}}}],["deleted_at",{"_index":5078,"t":{"1298":{"position":[[1009,11],[4124,11],[12815,11]]}}}],["deliber",{"_index":6655,"t":{"2043":{"position":[[583,10]]}}}],["deliv",{"_index":1686,"t":{"276":{"position":[[13,8]]},"294":{"position":[[228,10]]},"327":{"position":[[749,7]]},"831":{"position":[[540,9]]},"1379":{"position":[[358,9]]},"1417":{"position":[[557,7]]},"1451":{"position":[[557,7]]},"1743":{"position":[[621,7]]},"1784":{"position":[[634,7]]},"1888":{"position":[[1434,9]]},"2135":{"position":[[143,7]]},"2164":{"position":[[131,7]]}}}],["deliver",{"_index":6808,"t":{"2212":{"position":[[23,11]]}}}],["deliveri",{"_index":1536,"t":{"229":{"position":[[296,9]]},"231":{"position":[[69,8]]}}}],["delta",{"_index":4800,"t":{"1161":{"position":[[3747,8]]}}}],["demand",{"_index":1740,"t":{"292":{"position":[[171,6],[550,7]]},"294":{"position":[[101,6]]},"422":{"position":[[37,6]]},"1708":{"position":[[271,6]]},"1751":{"position":[[271,6]]},"1792":{"position":[[271,6]]}}}],["demo",{"_index":591,"t":{"92":{"position":[[108,5],[194,5]]},"476":{"position":[[520,4]]},"504":{"position":[[642,4]]},"1469":{"position":[[304,5]]}}}],["demonstr",{"_index":3949,"t":{"831":{"position":[[87,15]]},"1099":{"position":[[154,12]]},"1306":{"position":[[27,11]]},"1400":{"position":[[1004,12]]}}}],["denot",{"_index":2231,"t":{"414":{"position":[[123,7]]},"1622":{"position":[[1977,6]]},"1722":{"position":[[198,7]]},"1767":{"position":[[198,7]]}}}],["depart",{"_index":1079,"t":{"173":{"position":[[119,12]]},"561":{"position":[[225,11]]}}}],["depend",{"_index":518,"t":{"74":{"position":[[156,13]]},"133":{"position":[[115,13]]},"229":{"position":[[242,9]]},"302":{"position":[[10,11]]},"321":{"position":[[467,9]]},"323":{"position":[[794,9]]},"420":{"position":[[5669,12]]},"502":{"position":[[434,9]]},"529":{"position":[[97,10]]},"708":{"position":[[203,12],[517,12]]},"787":{"position":[[1770,12],[1992,9],[2877,7]]},"834":{"position":[[1395,9]]},"860":{"position":[[696,9],[1502,9],[2024,9]]},"877":{"position":[[217,6]]},"926":{"position":[[119,9]]},"1014":{"position":[[267,9]]},"1016":{"position":[[566,9]]},"1122":{"position":[[1326,6],[1645,6],[1966,6],[2297,6],[2619,6],[2941,6],[3262,6],[3578,6]]},"1195":{"position":[[207,6]]},"1209":{"position":[[360,7]]},"1262":{"position":[[1207,9],[4153,6]]},"1329":{"position":[[283,13]]},"1592":{"position":[[227,7]]},"1649":{"position":[[38,9],[236,10]]},"1708":{"position":[[1095,6]]},"1751":{"position":[[1103,6]]},"1792":{"position":[[1122,6]]},"1807":{"position":[[8,9]]},"1810":{"position":[[1789,6]]},"1895":{"position":[[999,9]]},"1904":{"position":[[775,10]]},"1915":{"position":[[565,10]]},"1917":{"position":[[957,6]]},"1941":{"position":[[324,9]]},"1988":{"position":[[164,12]]},"1990":{"position":[[225,12]]},"1994":{"position":[[323,10],[399,13]]},"2013":{"position":[[1121,9]]},"2094":{"position":[[83,6],[2976,6]]},"2096":{"position":[[76,10],[158,12],[705,7],[1205,7],[1262,7]]},"2118":{"position":[[214,9]]}}}],["dependencies.yaml",{"_index":2033,"t":{"335":{"position":[[470,17]]},"339":{"position":[[630,17],[1499,17]]}}}],["dependend",{"_index":6423,"t":{"1928":{"position":[[505,9]]},"1936":{"position":[[177,9]]}}}],["deploy",{"_index":433,"t":{"68":{"position":[[94,10]]},"239":{"position":[[407,7],[486,8]]},"257":{"position":[[105,12]]},"265":{"position":[[47,6],[807,10],[968,6]]},"269":{"position":[[160,10]]},"278":{"position":[[48,10]]},"292":{"position":[[278,11]]},"294":{"position":[[164,11]]},"300":{"position":[[657,10],[789,10],[970,10]]},"309":{"position":[[357,10]]},"323":{"position":[[58,10]]},"325":{"position":[[414,8],[437,10],[685,8]]},"327":{"position":[[11,6]]},"333":{"position":[[743,6]]},"352":{"position":[[1932,10],[2542,10]]},"363":{"position":[[452,8]]},"377":{"position":[[175,10]]},"379":{"position":[[220,10]]},"420":{"position":[[686,8],[2720,6],[2962,6],[3885,8],[4024,6],[4155,6],[4596,6],[4854,6],[5295,6],[5427,6],[5498,6],[5596,10],[5649,10]]},"422":{"position":[[114,6],[1213,9],[1319,9],[1561,8],[1758,8],[1830,6]]},"424":{"position":[[475,10],[580,10]]},"449":{"position":[[113,8]]},"453":{"position":[[19,8]]},"455":{"position":[[122,6]]},"457":{"position":[[546,8],[8506,6],[8931,6],[9537,12],[9643,8]]},"468":{"position":[[540,6]]},"470":{"position":[[2420,8],[2783,8],[5555,8]]},"474":{"position":[[289,9],[540,11],[3708,8]]},"480":{"position":[[651,9]]},"482":{"position":[[233,9],[285,6],[346,6]]},"484":{"position":[[65,10],[146,6],[219,6],[287,6],[417,7]]},"486":{"position":[[27,8],[529,9],[791,8],[803,11],[1299,6]]},"489":{"position":[[163,8],[849,9]]},"491":{"position":[[15,6],[146,8],[305,9],[380,11],[415,9],[633,9],[1152,11]]},"495":{"position":[[813,11]]},"504":{"position":[[422,10],[626,6]]},"519":{"position":[[166,8]]},"567":{"position":[[62,12],[314,12]]},"589":{"position":[[63,10]]},"718":{"position":[[558,6],[761,6],[808,6]]},"729":{"position":[[699,10]]},"749":{"position":[[284,10]]},"758":{"position":[[7,6],[61,6],[392,9],[641,9],[893,6]]},"760":{"position":[[9,8],[260,10]]},"763":{"position":[[2046,10],[3750,6]]},"765":{"position":[[116,10],[165,6]]},"769":{"position":[[473,6]]},"773":{"position":[[62,6],[181,6],[297,6]]},"775":{"position":[[78,10],[566,11]]},"787":{"position":[[43,6],[1694,11],[1885,6],[1971,6],[2187,9],[2225,6],[2270,6],[2428,6],[2834,9],[3022,9],[3042,11]]},"819":{"position":[[68,10],[152,10]]},"823":{"position":[[187,6],[229,6],[265,6],[292,6],[299,6]]},"825":{"position":[[51,6],[66,6],[86,6],[108,6],[127,6],[149,6]]},"831":{"position":[[314,8],[510,8]]},"834":{"position":[[1245,10],[1327,10]]},"836":{"position":[[1267,6]]},"847":{"position":[[124,10]]},"850":{"position":[[1951,8],[2439,9]]},"856":{"position":[[573,10]]},"858":{"position":[[16,10],[256,10]]},"863":{"position":[[52,8]]},"871":{"position":[[0,6],[1295,9]]},"873":{"position":[[0,10],[80,8],[157,10],[222,11],[343,9],[403,6]]},"875":{"position":[[19,9]]},"877":{"position":[[116,10],[144,12],[205,11]]},"889":{"position":[[19,9]]},"891":{"position":[[30,8]]},"900":{"position":[[297,10],[364,10],[387,10]]},"902":{"position":[[19,9]]},"1010":{"position":[[953,8],[3277,6],[3355,9]]},"1012":{"position":[[55,10],[253,8]]},"1099":{"position":[[913,10]]},"1116":{"position":[[1737,6],[1772,6],[1913,6],[2327,6]]},"1165":{"position":[[119,6],[214,6]]},"1168":{"position":[[183,6],[450,6]]},"1170":{"position":[[44,11]]},"1174":{"position":[[258,6],[1262,6],[1348,6]]},"1272":{"position":[[121,11],[575,10]]},"1280":{"position":[[203,10],[981,12]]},"1308":{"position":[[254,8]]},"1332":{"position":[[353,10]]},"1342":{"position":[[17,11]]},"1346":{"position":[[37,8]]},"1349":{"position":[[387,10]]},"1355":{"position":[[219,8]]},"1365":{"position":[[382,11]]},"1368":{"position":[[205,10]]},"1379":{"position":[[407,12]]},"1395":{"position":[[64,10]]},"1402":{"position":[[1069,8]]},"1411":{"position":[[173,12]]},"1429":{"position":[[70,10]]},"1434":{"position":[[1133,10],[1185,10]]},"1436":{"position":[[161,10]]},"1439":{"position":[[303,6]]},"1441":{"position":[[399,10]]},"1561":{"position":[[494,10]]},"1563":{"position":[[231,12]]},"1569":{"position":[[113,10]]},"1571":{"position":[[513,11]]},"1580":{"position":[[163,8]]},"1622":{"position":[[166,8]]},"1628":{"position":[[306,10]]},"1659":{"position":[[512,10]]},"1665":{"position":[[465,10]]},"1669":{"position":[[164,9]]},"1770":{"position":[[1444,9]]},"1862":{"position":[[166,8]]},"1926":{"position":[[387,11]]},"1936":{"position":[[320,8]]},"1958":{"position":[[302,6]]},"1964":{"position":[[2790,10],[2848,8],[4407,10]]},"1973":{"position":[[303,7]]},"1998":{"position":[[750,11]]},"2000":{"position":[[221,11]]},"2009":{"position":[[279,7]]},"2026":{"position":[[506,8]]},"2028":{"position":[[2618,11]]},"2030":{"position":[[31,10]]},"2032":{"position":[[811,7]]},"2047":{"position":[[16,7]]},"2212":{"position":[[171,8]]}}}],["deploy,st",{"_index":2805,"t":{"486":{"position":[[847,10]]}}}],["deploy.sh",{"_index":3972,"t":{"836":{"position":[[1215,9],[1821,9]]},"852":{"position":[[1095,9]]},"856":{"position":[[391,9]]}}}],["deploy_cert_manag",{"_index":2371,"t":{"420":{"position":[[5223,19],[5243,19]]}}}],["deploy_cindercsi",{"_index":2338,"t":{"420":{"position":[[2919,16],[2936,16]]}}}],["deploy_flux",{"_index":2374,"t":{"420":{"position":[[5375,11],[5387,11]]}}}],["deploy_gateway_api",{"_index":2364,"t":{"420":{"position":[[4788,18],[4807,18]]},"482":{"position":[[104,18]]}}}],["deploy_harbor",{"_index":2376,"t":{"420":{"position":[[5457,13]]},"484":{"position":[[257,13]]}}}],["deploy_harbor.sh",{"_index":2377,"t":{"420":{"position":[[5481,16]]}}}],["deploy_harbor=tru",{"_index":2793,"t":{"486":{"position":[[357,18]]}}}],["deploy_metr",{"_index":2353,"t":{"420":{"position":[[3968,14],[3983,14]]}}}],["deploy_monitor",{"_index":3796,"t":{"791":{"position":[[196,17]]}}}],["deploy_nginx_ingress",{"_index":1979,"t":{"325":{"position":[[705,21]]},"420":{"position":[[4081,20],[4102,20]]}}}],["deploy_nginx_ingress=tru",{"_index":2739,"t":{"474":{"position":[[3756,26]]}}}],["deploy_occm",{"_index":2336,"t":{"420":{"position":[[2687,11],[2699,11]]}}}],["deploy_xxx",{"_index":2636,"t":{"470":{"position":[[1462,10]]}}}],["deployment.apps/harbor",{"_index":2807,"t":{"486":{"position":[[894,22],[934,22],[978,22],[1024,22],[1065,22],[1107,22]]}}}],["deprec",{"_index":4685,"t":{"1112":{"position":[[400,13]]},"1122":{"position":[[2086,13],[2109,12]]},"1266":{"position":[[153,10]]},"1377":{"position":[[44,11],[96,11],[200,11],[263,10],[886,10]]},"1411":{"position":[[0,12],[37,11],[87,10],[562,10],[859,11],[1016,10]]},"1441":{"position":[[39,11]]},"1445":{"position":[[0,12],[37,11],[68,10],[141,10],[217,10],[373,10]]},"1479":{"position":[[143,10]]},"1482":{"position":[[44,11],[255,10]]},"1535":{"position":[[627,11]]},"1588":{"position":[[1677,11],[1787,10],[1853,11],[2167,10]]},"1592":{"position":[[93,11]]},"1594":{"position":[[1644,11]]},"1598":{"position":[[358,11]]},"1600":{"position":[[45,11],[191,11]]},"1644":{"position":[[105,11]]},"1810":{"position":[[3356,11],[3863,11]]},"1964":{"position":[[4785,11],[5074,11]]}}}],["deprecated_at",{"_index":5714,"t":{"1600":{"position":[[129,13]]}}}],["depric",{"_index":956,"t":{"162":{"position":[[249,11]]}}}],["depth",{"_index":6590,"t":{"2004":{"position":[[1356,5]]}}}],["deriv",{"_index":1123,"t":{"175":{"position":[[772,7]]},"179":{"position":[[67,7],[260,7]]},"181":{"position":[[25,7],[233,7],[636,7],[961,7]]},"185":{"position":[[1220,7]]},"426":{"position":[[296,7]]},"1720":{"position":[[699,6]]},"1765":{"position":[[699,6]]}}}],["descib",{"_index":6428,"t":{"1932":{"position":[[384,8]]}}}],["describ",{"_index":1571,"t":{"239":{"position":[[626,8]]},"245":{"position":[[271,8]]},"251":{"position":[[1303,9]]},"262":{"position":[[4,9]]},"337":{"position":[[13,9]]},"339":{"position":[[13,9]]},"352":{"position":[[372,8],[531,8],[744,8],[1081,8],[1294,8]]},"457":{"position":[[4151,9],[7941,9]]},"462":{"position":[[1056,8]]},"472":{"position":[[263,9]]},"474":{"position":[[325,9]]},"493":{"position":[[241,8]]},"665":{"position":[[848,9]]},"714":{"position":[[143,9]]},"758":{"position":[[20,8]]},"778":{"position":[[122,8]]},"787":{"position":[[13,9]]},"789":{"position":[[13,9]]},"843":{"position":[[27,9]]},"858":{"position":[[686,9]]},"860":{"position":[[59,9]]},"873":{"position":[[122,9]]},"1016":{"position":[[226,9]]},"1096":{"position":[[309,9]]},"1103":{"position":[[180,9]]},"1122":{"position":[[504,9],[1044,10]]},"1163":{"position":[[29,8]]},"1218":{"position":[[164,9]]},"1294":{"position":[[36,9]]},"1522":{"position":[[143,9]]},"1582":{"position":[[171,9]]},"1586":{"position":[[38,9],[153,9]]},"1588":{"position":[[1334,9]]},"1590":{"position":[[210,9]]},"1622":{"position":[[1943,9]]},"1630":{"position":[[175,9]]},"1632":{"position":[[442,10]]},"1640":{"position":[[460,9]]},"1659":{"position":[[495,8]]},"1725":{"position":[[69,8]]},"1770":{"position":[[69,8]]},"1807":{"position":[[138,9]]},"1810":{"position":[[568,9]]},"1812":{"position":[[516,10]]},"1814":{"position":[[465,8],[809,9]]},"1868":{"position":[[114,9]]},"1870":{"position":[[488,9]]},"1904":{"position":[[13,8]]},"1912":{"position":[[148,8]]},"1932":{"position":[[4369,9]]},"1936":{"position":[[144,8],[205,8],[491,9]]},"1951":{"position":[[23,8]]},"1962":{"position":[[1530,9],[1666,9],[1936,9],[2969,9],[4112,9]]},"1975":{"position":[[2009,9]]},"2013":{"position":[[618,9],[723,9]]},"2054":{"position":[[13,9]]},"2101":{"position":[[171,9]]},"2206":{"position":[[42,9]]}}}],["describe.pi",{"_index":6169,"t":{"1778":{"position":[[120,11]]}}}],["descript",{"_index":171,"t":{"25":{"position":[[210,11]]},"27":{"position":[[49,11],[1776,11]]},"30":{"position":[[69,11]]},"32":{"position":[[49,11]]},"92":{"position":[[226,11]]},"108":{"position":[[173,11]]},"114":{"position":[[0,11]]},"154":{"position":[[317,12]]},"317":{"position":[[758,11]]},"319":{"position":[[359,12],[1189,11],[2593,12]]},"502":{"position":[[388,12]]},"603":{"position":[[8,11]]},"650":{"position":[[86,11]]},"665":{"position":[[1431,11]]},"691":{"position":[[18,11]]},"695":{"position":[[224,11]]},"724":{"position":[[10,11]]},"744":{"position":[[18,11]]},"749":{"position":[[6387,11],[6560,11]]},"767":{"position":[[2299,11]]},"791":{"position":[[88,11]]},"793":{"position":[[5,11]]},"795":{"position":[[5,11]]},"807":{"position":[[7,11]]},"809":{"position":[[7,11]]},"823":{"position":[[7,11]]},"825":{"position":[[31,11]]},"850":{"position":[[783,11]]},"1099":{"position":[[209,11]]},"1168":{"position":[[898,12]]},"1260":{"position":[[55,11]]},"1298":{"position":[[3433,12],[10649,12]]},"1400":{"position":[[671,12],[706,11],[1109,12],[1268,11]]},"1417":{"position":[[487,12]]},"1451":{"position":[[487,12]]},"1469":{"position":[[157,11]]},"1520":{"position":[[110,11]]},"1539":{"position":[[113,11]]},"1545":{"position":[[396,11]]},"1553":{"position":[[403,11]]},"1565":{"position":[[376,11]]},"1569":{"position":[[359,11]]},"1573":{"position":[[391,11]]},"1588":{"position":[[1555,11]]},"1632":{"position":[[151,11]]},"1634":{"position":[[501,11]]},"1636":{"position":[[9,11]]},"1638":{"position":[[142,11]]},"1640":{"position":[[9,11]]},"1667":{"position":[[1391,11]]},"1683":{"position":[[68,12],[86,11]]},"1708":{"position":[[506,11]]},"1720":{"position":[[127,12],[145,11]]},"1751":{"position":[[544,12]]},"1765":{"position":[[127,12],[145,11]]},"1792":{"position":[[544,12]]},"1805":{"position":[[487,11]]},"1870":{"position":[[9,11]]},"1872":{"position":[[9,11]]},"1932":{"position":[[969,11],[4692,11]]},"2061":{"position":[[0,12]]},"2063":{"position":[[0,12]]},"2077":{"position":[[3593,11]]},"2185":{"position":[[19,11],[50,11]]},"2214":{"position":[[21,11]]},"2216":{"position":[[21,11]]}}}],["descriptor",{"_index":5743,"t":{"1632":{"position":[[430,11]]},"1634":{"position":[[538,10]]},"1636":{"position":[[154,11]]},"1638":{"position":[[472,12]]}}}],["design",{"_index":1353,"t":{"191":{"position":[[18,8]]},"193":{"position":[[501,7]]},"195":{"position":[[749,6]]},"298":{"position":[[256,8]]},"300":{"position":[[1098,8]]},"302":{"position":[[34,6]]},"348":{"position":[[288,8]]},"565":{"position":[[560,9]]},"821":{"position":[[348,9]]},"910":{"position":[[20,9],[42,9]]},"933":{"position":[[530,9]]},"1232":{"position":[[20,9],[53,9]]},"1308":{"position":[[720,10]]},"1332":{"position":[[869,6]]},"1357":{"position":[[112,9]]},"1419":{"position":[[112,9]]},"1453":{"position":[[112,9]]},"1488":{"position":[[541,8]]},"1528":{"position":[[4,6]]},"1590":{"position":[[303,6]]},"1594":{"position":[[831,6]]},"1615":{"position":[[43,6],[76,6],[176,6]]},"1619":{"position":[[5,6],[194,6]]},"1634":{"position":[[308,11]]},"1657":{"position":[[102,8]]},"1704":{"position":[[831,6]]},"1731":{"position":[[853,6]]},"1853":{"position":[[259,6]]},"1962":{"position":[[351,6],[1573,6],[3012,6],[4149,6],[5219,6]]},"1966":{"position":[[4962,7]]},"1984":{"position":[[47,6]]},"1998":{"position":[[141,7]]},"2004":{"position":[[1486,6]]},"2013":{"position":[[5,6]]},"2028":{"position":[[1525,6]]},"2058":{"position":[[7272,11]]},"2068":{"position":[[1041,11]]},"2092":{"position":[[411,6]]},"2094":{"position":[[61,6]]},"2103":{"position":[[109,6]]},"2116":{"position":[[118,8]]}}}],["designatecli",{"_index":320,"t":{"36":{"position":[[1087,15]]}}}],["desir",{"_index":1394,"t":{"197":{"position":[[42,7]]},"1704":{"position":[[1187,7]]},"1731":{"position":[[1210,7]]},"1826":{"position":[[1064,8]]},"1828":{"position":[[1035,8]]},"1853":{"position":[[742,7]]},"1877":{"position":[[568,8]]},"1886":{"position":[[522,8]]},"1888":{"position":[[175,9]]},"1895":{"position":[[589,10]]},"1960":{"position":[[168,9]]},"1964":{"position":[[495,9],[2367,9]]},"1966":{"position":[[543,7],[882,9]]},"2047":{"position":[[156,7],[234,8]]},"2068":{"position":[[936,7],[1499,7]]},"2094":{"position":[[3450,7]]}}}],["desktop",{"_index":447,"t":{"70":{"position":[[15,7]]},"129":{"position":[[182,7],[247,7]]},"860":{"position":[[3007,7]]}}}],["despit",{"_index":1201,"t":{"177":{"position":[[1895,7]]},"358":{"position":[[2443,7]]},"1725":{"position":[[1367,7]]},"1755":{"position":[[852,8]]},"1770":{"position":[[1601,7]]},"1796":{"position":[[854,8]]}}}],["dest",{"_index":879,"t":{"150":{"position":[[507,5]]},"152":{"position":[[456,5]]},"746":{"position":[[574,5],[4274,7],[4911,7]]},"1137":{"position":[[508,5]]},"1139":{"position":[[271,5]]},"1174":{"position":[[321,5]]}}}],["destin",{"_index":3597,"t":{"746":{"position":[[3521,14]]}}}],["destination_ip",{"_index":5152,"t":{"1298":{"position":[[4431,15]]}}}],["destroy",{"_index":3937,"t":{"823":{"position":[[25,7]]},"834":{"position":[[755,9]]},"956":{"position":[[17,7]]},"958":{"position":[[17,7]]},"960":{"position":[[17,7]]}}}],["detach",{"_index":2226,"t":{"401":{"position":[[5,6],[56,6]]}}}],["detail",{"_index":407,"t":{"59":{"position":[[151,8]]},"177":{"position":[[1535,8]]},"241":{"position":[[126,7]]},"298":{"position":[[515,8]]},"333":{"position":[[607,7]]},"420":{"position":[[3858,8],[5932,8]]},"424":{"position":[[1457,8]]},"442":{"position":[[166,8]]},"451":{"position":[[914,8]]},"462":{"position":[[2748,7]]},"486":{"position":[[1467,8]]},"622":{"position":[[1315,8]]},"732":{"position":[[130,7]]},"767":{"position":[[2170,7]]},"787":{"position":[[536,8],[1070,7]]},"802":{"position":[[1078,8]]},"941":{"position":[[127,6],[142,8],[292,6],[317,8]]},"989":{"position":[[53,6]]},"991":{"position":[[19,6]]},"1010":{"position":[[97,7]]},"1018":{"position":[[75,7],[354,7]]},"1034":{"position":[[97,9]]},"1065":{"position":[[1315,8]]},"1096":{"position":[[548,6]]},"1122":{"position":[[973,8],[1094,7],[1437,8],[1756,8],[2077,8],[2408,8],[2730,8],[3052,8],[3373,8],[3689,8]]},"1260":{"position":[[37,8]]},"1262":{"position":[[793,7],[1793,7],[2507,7],[2858,7],[4145,7]]},"1298":{"position":[[14627,7]]},"1318":{"position":[[109,7]]},"1332":{"position":[[777,8]]},"1334":{"position":[[641,8]]},"1340":{"position":[[84,7]]},"1349":{"position":[[893,8]]},"1353":{"position":[[449,9]]},"1397":{"position":[[350,8]]},"1405":{"position":[[111,8]]},"1425":{"position":[[93,8]]},"1431":{"position":[[612,8]]},"1439":{"position":[[225,8]]},"1486":{"position":[[250,8]]},"1516":{"position":[[785,7]]},"1537":{"position":[[239,7]]},"1551":{"position":[[165,9]]},"1557":{"position":[[304,8]]},"1561":{"position":[[364,6]]},"1590":{"position":[[168,7],[368,7],[520,9]]},"1669":{"position":[[559,8]]},"1680":{"position":[[559,7]]},"1698":{"position":[[5,7],[26,7]]},"1706":{"position":[[683,7]]},"1708":{"position":[[81,7],[331,8],[534,8],[1290,7]]},"1717":{"position":[[559,7]]},"1720":{"position":[[799,8],[824,8]]},"1733":{"position":[[845,7]]},"1739":{"position":[[585,7],[1487,8]]},"1745":{"position":[[5,7],[26,7]]},"1751":{"position":[[81,7],[331,8],[573,8],[1294,7]]},"1762":{"position":[[458,7]]},"1765":{"position":[[799,8],[824,8]]},"1776":{"position":[[690,7]]},"1780":{"position":[[583,7],[1488,8]]},"1786":{"position":[[49,7]]},"1788":{"position":[[55,7]]},"1792":{"position":[[81,7],[331,8],[573,8],[1317,7]]},"1805":{"position":[[188,8]]},"1932":{"position":[[351,7]]},"2022":{"position":[[1415,7]]},"2065":{"position":[[315,8]]},"2164":{"position":[[452,7]]}}}],["detect",{"_index":2001,"t":{"329":{"position":[[506,6]]},"418":{"position":[[328,8]]},"850":{"position":[[1606,9]]},"1368":{"position":[[1000,9]]},"1971":{"position":[[305,9]]},"2007":{"position":[[298,9]]},"2196":{"position":[[345,6]]}}}],["determin",{"_index":568,"t":{"87":{"position":[[0,9]]},"193":{"position":[[426,9]]},"204":{"position":[[16,9]]},"229":{"position":[[408,9]]},"565":{"position":[[434,9]]},"1036":{"position":[[457,9]]},"1314":{"position":[[405,10]]},"1837":{"position":[[516,10]]},"2002":{"position":[[195,10]]},"2004":{"position":[[1423,9]]}}}],["detriment",{"_index":2612,"t":{"468":{"position":[[343,11]]}}}],["dev",{"_index":203,"t":{"27":{"position":[[306,3],[872,3],[952,3],[1032,3],[1309,3],[1408,3],[1580,3]]},"36":{"position":[[553,3],[646,3]]},"237":{"position":[[15,3]]},"850":{"position":[[1426,3]]},"1010":{"position":[[809,5],[884,5],[1495,6]]},"1520":{"position":[[170,3]]},"1539":{"position":[[173,3]]}}}],["dev/cirros/releases/download/0.6.0/cirro",{"_index":3097,"t":{"626":{"position":[[725,41]]},"1069":{"position":[[725,41]]}}}],["dev/hwrng",{"_index":6285,"t":{"1826":{"position":[[702,11],[862,11]]},"1828":{"position":[[518,11]]}}}],["dev/nvme0n1",{"_index":3946,"t":{"829":{"position":[[552,13]]},"834":{"position":[[484,13]]}}}],["dev/nvmexni",{"_index":4199,"t":{"952":{"position":[[40,12]]},"954":{"position":[[16,12]]},"956":{"position":[[75,12]]},"958":{"position":[[67,12],[93,12],[124,12]]}}}],["dev/random",{"_index":6290,"t":{"1826":{"position":[[1203,11]]},"1828":{"position":[[405,11]]},"1837":{"position":[[534,11]]}}}],["dev/sd",{"_index":3493,"t":{"729":{"position":[[3238,8]]}}}],["dev/sda",{"_index":3945,"t":{"829":{"position":[[540,8]]},"834":{"position":[[406,9]]}}}],["dev/sdb",{"_index":3490,"t":{"729":{"position":[[3199,8]]}}}],["dev/sdc",{"_index":3491,"t":{"729":{"position":[[3212,8]]}}}],["dev/sdd",{"_index":3492,"t":{"729":{"position":[[3225,8]]},"816":{"position":[[583,10]]}}}],["dev/sdx",{"_index":4197,"t":{"952":{"position":[[14,8]]},"960":{"position":[[81,8],[424,8],[445,8],[716,8],[816,8]]}}}],["dev/urandom",{"_index":6291,"t":{"1826":{"position":[[1219,13]]}}}],["devel",{"_index":295,"t":{"36":{"position":[[429,5]]}}}],["develop",{"_index":66,"t":{"11":{"position":[[15,11]]},"16":{"position":[[48,11]]},"92":{"position":[[921,11]]},"98":{"position":[[52,9],[194,9]]},"100":{"position":[[491,9],[774,11]]},"124":{"position":[[103,11]]},"135":{"position":[[26,11]]},"166":{"position":[[4,9]]},"177":{"position":[[598,10]]},"185":{"position":[[1648,9]]},"237":{"position":[[59,10],[115,11],[282,11]]},"282":{"position":[[205,11]]},"292":{"position":[[256,12],[476,11],[596,11]]},"294":{"position":[[142,12]]},"333":{"position":[[759,11]]},"345":{"position":[[84,9],[1211,10]]},"363":{"position":[[916,11]]},"420":{"position":[[5124,11]]},"422":{"position":[[99,8]]},"474":{"position":[[408,9]]},"493":{"position":[[64,9]]},"603":{"position":[[674,9],[692,9]]},"827":{"position":[[188,11]]},"831":{"position":[[72,10]]},"856":{"position":[[16,11]]},"926":{"position":[[37,11]]},"1103":{"position":[[53,11]]},"1105":{"position":[[86,11]]},"1329":{"position":[[17,11]]},"1349":{"position":[[365,12]]},"1363":{"position":[[19,9],[276,9],[610,11]]},"1370":{"position":[[68,10]]},"1379":{"position":[[25,11],[460,11]]},"1400":{"position":[[138,9]]},"1462":{"position":[[49,9]]},"1484":{"position":[[25,11]]},"1488":{"position":[[791,9]]},"1547":{"position":[[222,11]]},"1571":{"position":[[142,11]]},"1586":{"position":[[325,11]]},"1596":{"position":[[31,9]]},"1610":{"position":[[354,11]]},"1667":{"position":[[1741,12]]},"1669":{"position":[[731,9]]},"1915":{"position":[[202,12]]},"1930":{"position":[[171,12]]},"1932":{"position":[[865,11]]},"1962":{"position":[[322,11],[1475,11],[2914,11],[4053,11],[5184,11]]},"1966":{"position":[[4186,10]]},"1988":{"position":[[1066,11],[1449,10]]},"1990":{"position":[[157,10]]},"2028":{"position":[[78,9],[485,12],[3178,11],[3351,12]]},"2141":{"position":[[93,11]]},"2212":{"position":[[300,9]]}}}],["developers/review",{"_index":2063,"t":{"345":{"position":[[7,20]]}}}],["devic",{"_index":464,"t":{"70":{"position":[[227,7]]},"255":{"position":[[78,6]]},"563":{"position":[[378,8]]},"591":{"position":[[337,7],[358,8]]},"601":{"position":[[66,6]]},"622":{"position":[[470,7],[488,7]]},"665":{"position":[[1806,6],[1913,6],[2024,6],[2135,6],[2242,6]]},"670":{"position":[[6,7],[99,6]]},"729":{"position":[[3186,8]]},"834":{"position":[[396,6],[474,6],[968,6],[1234,6],[1541,7]]},"836":{"position":[[1486,7]]},"850":{"position":[[770,6],[1385,6],[1629,6]]},"860":{"position":[[1802,7],[1844,7]]},"941":{"position":[[737,8]]},"956":{"position":[[41,7]]},"958":{"position":[[41,7]]},"960":{"position":[[41,7],[56,6],[574,6],[584,6],[885,7],[959,7],[1125,6]]},"965":{"position":[[113,8]]},"1010":{"position":[[56,7],[265,7],[325,7],[348,7],[970,6],[1462,6],[1607,6],[1859,6],[1991,6],[2119,7],[2281,6],[2357,6],[3128,7],[3241,7]]},"1065":{"position":[[470,7],[488,7]]},"1471":{"position":[[132,6]]},"1704":{"position":[[1513,6]]},"1731":{"position":[[1535,6]]},"1826":{"position":[[500,6]]},"1835":{"position":[[373,6]]},"1853":{"position":[[1069,6]]},"1891":{"position":[[3504,7],[4959,7],[5060,6],[5091,6],[5115,7],[5383,6],[5550,7]]},"1895":{"position":[[217,8]]},"2028":{"position":[[5118,6],[5276,7]]},"2032":{"position":[[650,6]]}}}],["device_id",{"_index":4222,"t":{"965":{"position":[[122,11]]}}}],["device_path",{"_index":4223,"t":{"965":{"position":[[134,13]]}}}],["devop",{"_index":2387,"t":{"422":{"position":[[81,6],[246,6]]},"1349":{"position":[[279,6]]},"1561":{"position":[[517,6]]},"1680":{"position":[[317,7]]},"1717":{"position":[[317,7]]},"1762":{"position":[[317,7]]},"1841":{"position":[[317,7]]}}}],["devops/sysop",{"_index":1753,"t":{"294":{"position":[[0,13]]}}}],["devstack",{"_index":2749,"t":{"476":{"position":[[404,9]]}}}],["dewey",{"_index":839,"t":{"142":{"position":[[665,5]]}}}],["dex",{"_index":5031,"t":{"1280":{"position":[[1013,4]]}}}],["df",{"_index":4162,"t":{"941":{"position":[[220,2],[351,2]]}}}],["df4af5376bbd4de587c4335622149be7",{"_index":265,"t":{"30":{"position":[[94,32]]}}}],["dforeground",{"_index":4525,"t":{"1036":{"position":[[365,16],[408,11]]}}}],["dhcp",{"_index":3038,"t":{"595":{"position":[[1001,4]]},"829":{"position":[[698,5]]},"834":{"position":[[1171,4],[1506,4],[1674,4]]},"836":{"position":[[1451,4],[1619,4]]},"850":{"position":[[3717,4]]}}}],["dhcp4",{"_index":4031,"t":{"850":{"position":[[1902,6]]}}}],["diagnos",{"_index":6564,"t":{"1988":{"position":[[1481,9]]}}}],["diagram",{"_index":5617,"t":{"1543":{"position":[[1072,7]]},"1671":{"position":[[218,9],[264,9]]}}}],["dial",{"_index":484,"t":{"70":{"position":[[550,4]]}}}],["diataxi",{"_index":5778,"t":{"1663":{"position":[[113,8]]}}}],["dibn5+debivnwihdocs+bkptvmetxojnkuobzhe8dweb/rqiguvjyeq5yoamz/y+qgvq",{"_index":1908,"t":{"319":{"position":[[4564,69]]}}}],["dicover",{"_index":6425,"t":{"1930":{"position":[[254,11]]}}}],["dictionari",{"_index":3181,"t":{"657":{"position":[[47,11],[63,10],[187,10]]},"1207":{"position":[[3919,10]]}}}],["dicuss",{"_index":6059,"t":{"1712":{"position":[[247,10]]}}}],["didn't",{"_index":1856,"t":{"319":{"position":[[153,6]]}}}],["differ",{"_index":752,"t":{"129":{"position":[[114,9],[762,9]]},"166":{"position":[[748,9]]},"173":{"position":[[311,6]]},"185":{"position":[[1242,9]]},"239":{"position":[[347,9]]},"260":{"position":[[188,9]]},"327":{"position":[[316,9]]},"343":{"position":[[223,9]]},"447":{"position":[[343,9]]},"453":{"position":[[793,9]]},"455":{"position":[[14,9]]},"457":{"position":[[8470,9]]},"459":{"position":[[86,9]]},"470":{"position":[[3205,9]]},"493":{"position":[[695,9],[856,9]]},"502":{"position":[[370,9]]},"521":{"position":[[49,9]]},"559":{"position":[[127,9]]},"561":{"position":[[210,9]]},"563":{"position":[[588,9]]},"565":{"position":[[709,6]]},"585":{"position":[[330,9]]},"628":{"position":[[30,9]]},"735":{"position":[[1084,11]]},"758":{"position":[[340,11]]},"798":{"position":[[323,9]]},"831":{"position":[[466,12],[618,11]]},"839":{"position":[[358,9]]},"850":{"position":[[551,11]]},"858":{"position":[[582,9],[632,6]]},"860":{"position":[[360,10]]},"926":{"position":[[101,9],[143,9]]},"1010":{"position":[[2109,9]]},"1071":{"position":[[30,9]]},"1207":{"position":[[3531,12]]},"1280":{"position":[[452,9]]},"1294":{"position":[[147,9]]},"1298":{"position":[[14754,9]]},"1300":{"position":[[393,9]]},"1434":{"position":[[107,9]]},"1535":{"position":[[57,9]]},"1543":{"position":[[291,9],[405,9]]},"1594":{"position":[[1963,11]]},"1610":{"position":[[831,9]]},"1624":{"position":[[173,9]]},"1680":{"position":[[52,9]]},"1694":{"position":[[64,9]]},"1717":{"position":[[52,9]]},"1739":{"position":[[976,9],[1029,9]]},"1741":{"position":[[64,9]]},"1755":{"position":[[42,9]]},"1762":{"position":[[52,9]]},"1780":{"position":[[974,9],[1027,9]]},"1782":{"position":[[76,9]]},"1796":{"position":[[178,9]]},"1841":{"position":[[52,9]]},"1893":{"position":[[1078,9]]},"1926":{"position":[[132,9]]},"1928":{"position":[[457,9]]},"1932":{"position":[[672,9],[1332,9],[1386,9],[1434,9],[2807,9],[3378,9],[4474,9]]},"1934":{"position":[[18,9]]},"1962":{"position":[[2550,6]]},"1964":{"position":[[1886,9]]},"1966":{"position":[[4469,10]]},"1975":{"position":[[351,9],[654,9]]},"1977":{"position":[[1341,9],[1570,9],[1935,9],[2023,9],[2370,9],[2416,9],[2648,9]]},"1979":{"position":[[523,9],[543,9],[1122,9]]},"1986":{"position":[[756,9]]},"2028":{"position":[[1260,9]]},"2030":{"position":[[106,10],[224,10]]},"2058":{"position":[[6064,9]]},"2068":{"position":[[700,6],[806,9]]},"2094":{"position":[[2643,9]]},"2096":{"position":[[1437,9]]},"2118":{"position":[[199,9]]},"2135":{"position":[[398,9],[428,9]]},"2137":{"position":[[389,9],[438,9]]},"2166":{"position":[[116,9]]},"2172":{"position":[[27,9]]},"2198":{"position":[[69,9]]},"2200":{"position":[[122,9]]}}}],["differenci",{"_index":6689,"t":{"2077":{"position":[[113,13]]}}}],["differenti",{"_index":5928,"t":{"1700":{"position":[[144,15]]},"1708":{"position":[[217,13]]},"1739":{"position":[[65,14],[895,13],[1123,15]]},"1751":{"position":[[217,13]]},"1780":{"position":[[65,14],[893,13],[1121,15]]},"1786":{"position":[[1112,13]]},"1792":{"position":[[217,13]]},"1926":{"position":[[295,15]]}}}],["difficult",{"_index":2458,"t":{"451":{"position":[[1191,10]]},"1280":{"position":[[285,10]]},"1334":{"position":[[328,9]]},"1895":{"position":[[788,9]]}}}],["difficulti",{"_index":6570,"t":{"1994":{"position":[[478,10]]}}}],["dig",{"_index":5737,"t":{"1626":{"position":[[0,7]]}}}],["digest",{"_index":979,"t":{"164":{"position":[[972,7]]}}}],["digit",{"_index":5693,"t":{"1588":{"position":[[1320,5]]},"1888":{"position":[[1888,5]]}}}],["dignissim",{"_index":10,"t":{"3":{"position":[[80,9]]}}}],["dilig",{"_index":5406,"t":{"1355":{"position":[[510,8]]}}}],["dimens",{"_index":5611,"t":{"1535":{"position":[[143,11]]},"1543":{"position":[[54,11],[172,9]]},"1622":{"position":[[335,11]]}}}],["dir",{"_index":2436,"t":{"438":{"position":[[366,4]]},"1151":{"position":[[24,4]]}}}],["direct",{"_index":865,"t":{"150":{"position":[[11,9],[199,9],[286,10]]},"187":{"position":[[160,10]]},"302":{"position":[[196,6]]},"327":{"position":[[547,6],[579,6]]},"329":{"position":[[51,6]]},"732":{"position":[[184,9]]},"785":{"position":[[239,6]]},"1036":{"position":[[551,9]]},"1137":{"position":[[11,9],[200,9],[287,10]]},"1139":{"position":[[28,9]]},"1456":{"position":[[76,10]]},"1812":{"position":[[639,6]]},"2058":{"position":[[6609,10]]}}}],["directli",{"_index":145,"t":{"23":{"position":[[183,8]]},"36":{"position":[[319,8]]},"166":{"position":[[831,8]]},"251":{"position":[[689,8]]},"269":{"position":[[260,8]]},"296":{"position":[[230,8]]},"319":{"position":[[88,8],[4315,9]]},"341":{"position":[[147,8]]},"424":{"position":[[934,9]]},"426":{"position":[[662,8]]},"428":{"position":[[9,9]]},"430":{"position":[[9,9]]},"444":{"position":[[52,8]]},"457":{"position":[[7167,8]]},"462":{"position":[[1521,8],[2317,8]]},"595":{"position":[[1046,8]]},"622":{"position":[[346,8]]},"720":{"position":[[84,8]]},"787":{"position":[[2303,8]]},"850":{"position":[[591,8],[3551,8]]},"1065":{"position":[[346,8]]},"1096":{"position":[[347,8]]},"1218":{"position":[[760,9]]},"1434":{"position":[[322,8]]},"1586":{"position":[[421,8]]},"1594":{"position":[[879,8]]},"1812":{"position":[[685,8]]},"1837":{"position":[[230,9]]},"1897":{"position":[[43,8]]},"1926":{"position":[[678,8]]},"1932":{"position":[[1751,8],[3580,8],[4615,9]]},"2058":{"position":[[6255,8],[6348,9]]},"2122":{"position":[[193,8],[278,9]]},"2206":{"position":[[454,9]]}}}],["directori",{"_index":576,"t":{"90":{"position":[[88,9]]},"92":{"position":[[394,9],[411,9],[499,10],[592,9]]},"94":{"position":[[205,10]]},"96":{"position":[[75,10],[223,10]]},"100":{"position":[[254,10],[866,9],[1398,9]]},"133":{"position":[[20,9]]},"313":{"position":[[445,9],[656,9],[713,9],[898,9]]},"358":{"position":[[237,9],[1855,10]]},"363":{"position":[[1253,10]]},"424":{"position":[[1077,9]]},"457":{"position":[[652,10],[1321,9]]},"459":{"position":[[273,11]]},"470":{"position":[[410,10],[3424,9]]},"472":{"position":[[1347,9],[1603,9],[2968,10],[3166,11]]},"474":{"position":[[835,9],[931,9],[1241,10]]},"476":{"position":[[1188,9],[1926,9]]},"480":{"position":[[57,9],[465,9]]},"500":{"position":[[66,9]]},"610":{"position":[[56,9]]},"626":{"position":[[287,9]]},"661":{"position":[[550,10]]},"687":{"position":[[94,9]]},"691":{"position":[[129,9],[215,10],[709,9]]},"697":{"position":[[67,10]]},"699":{"position":[[116,9]]},"708":{"position":[[85,9],[105,9],[122,9],[408,10]]},"712":{"position":[[70,9],[678,9]]},"714":{"position":[[187,9]]},"718":{"position":[[394,9],[504,9]]},"724":{"position":[[1544,9]]},"746":{"position":[[2721,9],[3301,9]]},"765":{"position":[[51,9]]},"767":{"position":[[1425,9]]},"778":{"position":[[597,10]]},"814":{"position":[[79,9]]},"871":{"position":[[1135,10]]},"1034":{"position":[[3279,11],[5101,11]]},"1055":{"position":[[56,9]]},"1069":{"position":[[287,9]]},"1114":{"position":[[383,10]]},"1116":{"position":[[9,9],[267,10]]},"1153":{"position":[[57,9]]},"1157":{"position":[[25,11]]},"1170":{"position":[[612,9]]},"1172":{"position":[[461,9]]},"1174":{"position":[[171,9]]},"1184":{"position":[[264,9]]},"1434":{"position":[[218,12]]},"1528":{"position":[[81,9]]},"1617":{"position":[[5,9]]},"1619":{"position":[[400,10]]},"1651":{"position":[[72,9]]},"1828":{"position":[[673,9]]},"2028":{"position":[[1470,10]]}}}],["disabl",{"_index":851,"t":{"144":{"position":[[407,7]]},"152":{"position":[[286,7]]},"162":{"position":[[36,7],[105,7]]},"325":{"position":[[1061,8]]},"420":{"position":[[2905,7]]},"474":{"position":[[3783,7]]},"816":{"position":[[1046,9]]},"836":{"position":[[926,7]]},"971":{"position":[[160,7]]},"973":{"position":[[67,7]]},"1014":{"position":[[527,7],[655,8],[749,7],[788,7],[989,7],[1114,8],[1211,7],[1258,7],[1374,8],[1471,7],[1518,7],[1636,8],[1789,7],[2003,8],[2100,7]]},"1688":{"position":[[1556,8],[1638,8]]},"1725":{"position":[[1329,8],[1908,8],[1990,8]]},"1770":{"position":[[1088,8],[2210,8],[2292,8]]},"2054":{"position":[[711,9]]}}}],["disadvantag",{"_index":1186,"t":{"177":{"position":[[1225,12]]},"185":{"position":[[815,16]]},"850":{"position":[[306,12]]},"1610":{"position":[[651,13]]},"1897":{"position":[[219,12]]},"2002":{"position":[[496,14]]}}}],["disambigu",{"_index":5680,"t":{"1588":{"position":[[106,12]]}}}],["disast",{"_index":2183,"t":{"358":{"position":[[2313,8]]},"1964":{"position":[[1504,8]]}}}],["disc",{"_index":4084,"t":{"858":{"position":[[646,4]]}}}],["discard",{"_index":2179,"t":{"358":{"position":[[1967,8]]},"2051":{"position":[[700,9]]}}}],["disclosur",{"_index":6465,"t":{"1962":{"position":[[1897,10],[3292,10],[4514,10]]}}}],["discourag",{"_index":5866,"t":{"1690":{"position":[[161,11]]},"2126":{"position":[[237,10]]}}}],["discov",{"_index":2719,"t":{"474":{"position":[[1897,8]]},"622":{"position":[[63,8]]},"749":{"position":[[1087,8],[1324,8]]},"1065":{"position":[[63,8]]},"1680":{"position":[[257,10],[533,11]]},"1717":{"position":[[257,10],[533,11],[1024,11]]},"1762":{"position":[[257,10],[923,11]]},"1841":{"position":[[257,10],[419,11]]},"1930":{"position":[[223,9]]},"1932":{"position":[[3050,9],[3846,8],[3978,11]]},"2058":{"position":[[752,8],[989,8]]}}}],["discover",{"_index":5481,"t":{"1400":{"position":[[942,13]]},"1700":{"position":[[267,13]]},"1717":{"position":[[1210,15]]},"1735":{"position":[[690,12]]},"1757":{"position":[[462,15]]},"1762":{"position":[[1109,15]]},"1778":{"position":[[725,12]]},"1798":{"position":[[462,15]]},"1859":{"position":[[291,16]]},"1895":{"position":[[1254,15]]},"1899":{"position":[[531,15]]},"1930":{"position":[[18,12]]},"1932":{"position":[[2608,12],[2903,12]]},"1936":{"position":[[20,15]]}}}],["discoveri",{"_index":1602,"t":{"249":{"position":[[38,9],[584,9]]},"802":{"position":[[2144,9],[2884,9]]},"1262":{"position":[[1282,9]]}}}],["discovery.seed_host",{"_index":3574,"t":{"746":{"position":[[1493,21],[2913,21]]}}}],["discret",{"_index":6065,"t":{"1720":{"position":[[598,8]]},"1765":{"position":[[598,8]]}}}],["discrimin",{"_index":5616,"t":{"1543":{"position":[[33,13]]}}}],["discuss",{"_index":43,"t":{"7":{"position":[[282,11]]},"11":{"position":[[27,10]]},"59":{"position":[[36,7]]},"162":{"position":[[384,11]]},"183":{"position":[[464,9]]},"185":{"position":[[2718,10]]},"197":{"position":[[102,7]]},"286":{"position":[[659,13]]},"1353":{"position":[[423,10]]},"1402":{"position":[[22,11]]},"1488":{"position":[[805,9]]},"1590":{"position":[[539,10],[624,10]]},"1594":{"position":[[921,10]]},"1667":{"position":[[1838,12]]},"1680":{"position":[[940,11]]},"1706":{"position":[[1592,7]]},"1717":{"position":[[940,11]]},"1720":{"position":[[5,11]]},"1733":{"position":[[1856,7]]},"1755":{"position":[[352,11]]},"1762":{"position":[[839,11]]},"1765":{"position":[[5,11]]},"1776":{"position":[[1703,7]]},"1796":{"position":[[488,11]]},"1826":{"position":[[985,9]]},"1930":{"position":[[347,9]]},"1932":{"position":[[3343,10]]},"1936":{"position":[[460,11]]},"1958":{"position":[[156,10]]},"1962":{"position":[[5574,9],[5683,9]]},"1984":{"position":[[21,7]]},"1992":{"position":[[128,7]]},"2022":{"position":[[1452,11]]},"2028":{"position":[[3430,12]]},"2131":{"position":[[373,9]]},"2160":{"position":[[373,9]]},"2212":{"position":[[289,10]]}}}],["discworld",{"_index":917,"t":{"154":{"position":[[524,9],[652,9],[668,9]]}}}],["dish",{"_index":1543,"t":{"231":{"position":[[323,7]]}}}],["disk",{"_index":1693,"t":{"278":{"position":[[137,4]]},"420":{"position":[[2183,4],[2313,4]]},"565":{"position":[[228,4]]},"587":{"position":[[217,5]]},"597":{"position":[[112,6]]},"601":{"position":[[122,5]]},"622":{"position":[[897,5]]},"834":{"position":[[741,5],[1229,4]]},"836":{"position":[[51,4]]},"852":{"position":[[582,4],[662,4],[884,4],[1020,4],[1273,4]]},"854":{"position":[[27,4]]},"860":{"position":[[1676,5]]},"960":{"position":[[309,4]]},"1065":{"position":[[897,5]]},"1395":{"position":[[153,4]]},"1397":{"position":[[561,4],[600,4]]},"1559":{"position":[[217,5]]},"1561":{"position":[[276,4]]},"1575":{"position":[[338,4]]},"1680":{"position":[[659,5],[748,5]]},"1683":{"position":[[298,6]]},"1685":{"position":[[56,4]]},"1692":{"position":[[0,4],[65,4],[104,4],[152,4],[265,4],[583,4],[633,4],[670,4],[729,4],[879,4],[1120,5],[1130,4],[1214,4],[1398,4],[1455,4],[1541,4],[1769,4],[2032,4]]},"1702":{"position":[[81,4],[245,4],[513,4]]},"1704":{"position":[[79,4],[758,5],[1014,4],[1080,6],[1166,4],[1228,4],[1321,4]]},"1708":{"position":[[709,5]]},"1717":{"position":[[659,5],[748,5],[1322,4]]},"1720":{"position":[[357,6]]},"1722":{"position":[[439,4]]},"1729":{"position":[[0,4],[72,4],[137,4],[176,4],[224,4],[337,4],[655,4],[705,4],[742,4],[801,4],[951,4],[1192,5],[1202,4],[1286,4],[1324,5],[1604,4],[1661,4],[1747,4],[1976,4],[2239,4]]},"1731":{"position":[[77,4],[780,5],[1036,4],[1102,6],[1189,4],[1251,4],[1343,4]]},"1735":{"position":[[736,5]]},"1751":{"position":[[748,5]]},"1753":{"position":[[81,4],[245,4],[512,4]]},"1762":{"position":[[558,5],[647,5],[1221,4]]},"1765":{"position":[[357,6]]},"1767":{"position":[[439,4]]},"1774":{"position":[[0,4],[72,4],[137,4],[176,4],[224,4],[337,4],[655,4],[705,4],[781,5],[883,4],[942,4],[1092,4],[1333,5],[1343,4],[1427,4],[1465,5],[1745,4],[1802,4],[1888,4],[2192,4]]},"1778":{"position":[[771,5]]},"1792":{"position":[[748,5]]},"1794":{"position":[[81,4],[245,4],[512,4]]},"1807":{"position":[[433,4],[503,4]]},"1826":{"position":[[122,4],[138,4]]},"1843":{"position":[[661,4],[838,4],[927,4]]},"1847":{"position":[[48,4],[58,4]]},"1849":{"position":[[48,4],[58,4]]},"1851":{"position":[[68,4],[447,4],[522,4]]},"1853":{"position":[[414,5],[472,5],[510,5],[568,4],[634,6],[721,4],[785,4],[877,4]]},"1859":{"position":[[351,5],[603,5]]},"1891":{"position":[[5188,5],[5228,7],[5860,4]]},"1893":{"position":[[722,6]]},"1895":{"position":[[657,4],[853,5],[1105,5]]},"1899":{"position":[[232,4]]},"1947":{"position":[[126,4]]}}}],["disk.img",{"_index":3098,"t":{"626":{"position":[[780,8]]},"1069":{"position":[[780,8]]}}}],["disk/bi",{"_index":4305,"t":{"1010":{"position":[[1728,7],[1758,7]]}}}],["disk1.img",{"_index":3123,"t":{"632":{"position":[[949,9],[1063,9]]},"1075":{"position":[[949,9],[1063,9]]}}}],["disk[gb",{"_index":5817,"t":{"1685":{"position":[[37,8]]}}}],["disk[gb]&typ",{"_index":6068,"t":{"1722":{"position":[[40,13]]},"1767":{"position":[[40,13]]}}}],["disk_gb",{"_index":5059,"t":{"1298":{"position":[[435,8]]}}}],["diskless",{"_index":2322,"t":{"420":{"position":[[2098,8],[2235,8]]},"457":{"position":[[382,8]]},"1467":{"position":[[914,8]]}}}],["diskn",{"_index":6323,"t":{"1843":{"position":[[794,5],[947,5]]}}}],["diskspec",{"_index":4064,"t":{"852":{"position":[[1285,8]]}}}],["dislik",{"_index":1268,"t":{"183":{"position":[[397,8]]}}}],["dismiss",{"_index":963,"t":{"164":{"position":[[286,7]]},"2032":{"position":[[457,10]]}}}],["disord",{"_index":6267,"t":{"1822":{"position":[[118,8]]}}}],["dispar",{"_index":6572,"t":{"1998":{"position":[[708,11],[1278,11]]}}}],["display",{"_index":2487,"t":{"457":{"position":[[1987,7]]},"767":{"position":[[876,10]]},"941":{"position":[[188,7]]},"1207":{"position":[[173,9]]},"1374":{"position":[[466,8]]},"1932":{"position":[[4143,10]]}}}],["display_nam",{"_index":5051,"t":{"1298":{"position":[[175,13],[1965,13],[12936,13]]}}}],["disproportion",{"_index":1155,"t":{"177":{"position":[[267,16]]}}}],["disrupt",{"_index":2454,"t":{"451":{"position":[[344,11],[1365,10]]},"470":{"position":[[4376,10]]},"504":{"position":[[846,10]]},"1184":{"position":[[80,10]]},"1434":{"position":[[410,7]]},"1891":{"position":[[3339,11],[4058,10],[4409,11]]},"1988":{"position":[[840,9],[1703,10]]},"1990":{"position":[[750,11]]}}}],["distanc",{"_index":1431,"t":{"206":{"position":[[226,8]]}}}],["distil",{"_index":613,"t":{"92":{"position":[[736,10],[863,7]]},"100":{"position":[[548,8]]}}}],["distinct",{"_index":2527,"t":{"457":{"position":[[7962,11]]},"1292":{"position":[[135,8]]},"1296":{"position":[[276,8]]},"1622":{"position":[[1621,8]]},"1663":{"position":[[173,8]]},"1786":{"position":[[1426,11]]}}}],["distinguish",{"_index":6488,"t":{"1962":{"position":[[4920,11]]},"1966":{"position":[[2833,11]]}}}],["distribut",{"_index":275,"t":{"36":{"position":[[55,14]]},"185":{"position":[[393,11],[658,11]]},"233":{"position":[[76,10]]},"329":{"position":[[736,11]]},"424":{"position":[[833,13]]},"563":{"position":[[569,11]]},"591":{"position":[[23,11],[101,11],[156,11],[381,11]]},"593":{"position":[[144,11]]},"632":{"position":[[250,12]]},"634":{"position":[[311,12]]},"798":{"position":[[618,13]]},"839":{"position":[[653,13]]},"852":{"position":[[559,13]]},"1075":{"position":[[250,12]]},"1077":{"position":[[311,12]]},"1355":{"position":[[424,14]]},"1421":{"position":[[0,11]]},"1805":{"position":[[39,13],[302,13]]},"1810":{"position":[[2581,13]]},"1964":{"position":[[2723,12]]},"1966":{"position":[[1982,12],[2171,12],[2388,12],[4837,12]]},"1971":{"position":[[418,11]]},"1975":{"position":[[316,11],[1802,10],[2317,12]]},"1977":{"position":[[1318,12],[1719,12],[2213,10],[2347,11],[2631,11],[2798,11]]},"1979":{"position":[[764,11],[865,11],[922,11],[976,11],[1009,11],[1105,11]]},"2007":{"position":[[412,11]]},"2011":{"position":[[378,11]]},"2013":{"position":[[247,12]]},"2015":{"position":[[49,12],[474,11],[797,11],[1012,12]]},"2028":{"position":[[273,12]]}}}],["distributor",{"_index":6223,"t":{"1810":{"position":[[1831,13]]}}}],["dito",{"_index":2358,"t":{"420":{"position":[[4354,6],[5855,6]]}}}],["diverg",{"_index":5483,"t":{"1402":{"position":[[493,7]]},"1439":{"position":[[65,8]]}}}],["divers",{"_index":6458,"t":{"1962":{"position":[[313,8],[4974,9]]},"1966":{"position":[[2887,9]]},"1990":{"position":[[386,7]]}}}],["divid",{"_index":2963,"t":{"563":{"position":[[206,7]]},"585":{"position":[[138,7]]}}}],["dn",{"_index":2879,"t":{"491":{"position":[[1727,3]]},"785":{"position":[[130,3]]},"1402":{"position":[[910,3]]},"1436":{"position":[[340,3]]}}}],["dnation",{"_index":212,"t":{"27":{"position":[[843,7],[864,7],[1378,7],[1400,7]]}}}],["dnf",{"_index":294,"t":{"36":{"position":[[401,3]]}}}],["dns.domain.cr",{"_index":5280,"t":{"1298":{"position":[[10498,21]]}}}],["dns.domain.delet",{"_index":5282,"t":{"1298":{"position":[[10541,20]]}}}],["dns.domain.exist",{"_index":5292,"t":{"1298":{"position":[[11094,17]]}}}],["dns.domain.upd",{"_index":5281,"t":{"1298":{"position":[[10520,20]]}}}],["dns_domain_trait",{"_index":5283,"t":{"1298":{"position":[[10570,18],[11124,18]]}}}],["dns_interfac",{"_index":3479,"t":{"729":{"position":[[2739,14]]},"744":{"position":[[371,13]]}}}],["dns_nameserv",{"_index":2252,"t":{"418":{"position":[[450,15]]},"791":{"position":[[220,15]]},"850":{"position":[[3286,16]]}}}],["dnsdist",{"_index":5523,"t":{"1434":{"position":[[1323,8]]}}}],["do",{"_index":795,"t":{"140":{"position":[[262,5]]},"309":{"position":[[278,5]]},"381":{"position":[[249,5]]},"405":{"position":[[142,5]]},"447":{"position":[[230,5]]},"457":{"position":[[8161,5]]},"462":{"position":[[821,5]]},"622":{"position":[[676,5]]},"938":{"position":[[422,5]]},"947":{"position":[[23,5]]},"1065":{"position":[[676,5]]},"1665":{"position":[[109,5]]},"1667":{"position":[[109,5]]},"2002":{"position":[[696,5]]},"2094":{"position":[[3235,7]]}}}],["doc",{"_index":577,"t":{"90":{"position":[[104,4],[112,5]]},"92":{"position":[[31,4],[177,7],[468,4]]},"94":{"position":[[5,3],[146,4]]},"96":{"position":[[5,3],[164,4]]},"98":{"position":[[149,4]]},"100":{"position":[[12,4],[77,4],[249,4],[283,4],[292,4],[527,3],[718,4],[1379,4],[1977,4]]},"124":{"position":[[79,4]]},"131":{"position":[[10,4]]},"133":{"position":[[88,5]]},"237":{"position":[[19,5]]},"265":{"position":[[727,4]]},"333":{"position":[[590,4]]},"341":{"position":[[487,6]]},"420":{"position":[[3849,4],[5923,4]]},"472":{"position":[[284,5]]},"1353":{"position":[[575,3]]},"1488":{"position":[[756,3]]},"1528":{"position":[[11,4]]},"1545":{"position":[[509,4]]},"1615":{"position":[[8,4],[50,5],[68,4]]},"1619":{"position":[[201,5]]},"1651":{"position":[[19,4]]},"1669":{"position":[[82,4],[1033,4],[1188,4],[1231,4]]},"2214":{"position":[[141,4]]}}}],["doc/*.md",{"_index":593,"t":{"92":{"position":[[155,11]]}}}],["doc/sorce/not",{"_index":4716,"t":{"1116":{"position":[[2440,16]]}}}],["docker",{"_index":436,"t":{"68":{"position":[[123,6]]},"78":{"position":[[156,6]]},"424":{"position":[[139,6],[222,6]]},"714":{"position":[[304,6],[414,6]]},"746":{"position":[[3430,6]]},"816":{"position":[[920,6]]},"847":{"position":[[242,6]]},"860":{"position":[[2421,7],[2596,6]]},"1032":{"position":[[277,6],[343,6],[408,6]]},"1043":{"position":[[361,6],[381,6],[412,6]]},"1047":{"position":[[1012,6],[1165,6],[1318,6]]},"1105":{"position":[[304,6],[434,6]]},"1107":{"position":[[291,6]]},"1109":{"position":[[283,6]]},"1165":{"position":[[321,6]]},"1168":{"position":[[109,6],[132,6],[208,6],[2172,6],[2197,6],[2263,6],[2337,6]]},"1184":{"position":[[208,6],[239,6],[316,6]]},"1207":{"position":[[4,6],[206,6],[237,6],[247,6],[360,6],[473,6],[586,6],[699,6],[812,6],[925,6],[1038,6],[1151,6],[1264,6],[1377,6],[1490,6],[1603,6],[1716,6],[1829,6],[1940,6],[2051,6],[2162,6],[2273,6],[2384,6],[2495,6],[2606,6],[2717,6],[2828,6],[2939,6],[3050,6],[3201,6],[3451,6],[3491,6],[3597,6],[3761,6],[3996,6],[4141,6],[4306,7],[4445,6],[4506,6],[4637,6]]},"1209":{"position":[[20,6],[332,6],[835,6],[1008,6],[1074,6],[1133,6],[1293,6],[1715,6],[1954,6]]},"1262":{"position":[[2068,6]]},"1374":{"position":[[237,6],[343,6],[392,6],[510,6]]},"1383":{"position":[[646,6]]},"1411":{"position":[[652,6],[730,7],[738,6],[785,6]]},"1445":{"position":[[534,6],[612,7],[620,6],[667,6]]},"1956":{"position":[[302,6]]},"1964":{"position":[[4433,6],[4472,6],[4499,6]]},"1984":{"position":[[267,6]]},"1996":{"position":[[274,7]]},"1998":{"position":[[6,6],[119,6],[299,6],[467,6],[848,6]]},"2000":{"position":[[493,6]]},"2002":{"position":[[25,6],[361,7]]},"2004":{"position":[[467,6],[896,6]]}}}],["docker'",{"_index":6589,"t":{"2004":{"position":[[795,8]]}}}],["docker.io",{"_index":2686,"t":{"472":{"position":[[2810,9]]},"1168":{"position":[[99,9],[2160,9]]}}}],["docker:!manag",{"_index":4946,"t":{"1207":{"position":[[3771,17]]}}}],["docker[844686",{"_index":4566,"t":{"1038":{"position":[[790,15],[1020,15]]}}}],["docker[847573",{"_index":4537,"t":{"1038":{"position":[[133,15]]}}}],["docker[880827",{"_index":4552,"t":{"1038":{"position":[[406,15],[570,15],[1258,15]]}}}],["docker_allow_restart",{"_index":4959,"t":{"1209":{"position":[[1674,21],[1760,20]]}}}],["docker_allow_restart=fals",{"_index":4960,"t":{"1209":{"position":[[1964,26]]}}}],["docker_configure_proxi",{"_index":3535,"t":{"741":{"position":[[67,23]]}}}],["docker_host",{"_index":941,"t":{"158":{"position":[[300,12],[434,13]]},"1141":{"position":[[290,12],[424,13]]}}}],["docker_hosts_default",{"_index":937,"t":{"158":{"position":[[79,21],[356,22],[452,21]]},"1141":{"position":[[77,21],[346,22],[442,21]]}}}],["docker_hosts_extra",{"_index":939,"t":{"158":{"position":[[231,18],[411,19],[476,18]]},"1141":{"position":[[221,18],[401,19],[466,18]]}}}],["docker_ignore_restart_groupnam",{"_index":4958,"t":{"1209":{"position":[[1241,32],[1366,31],[1563,31],[1614,32]]}}}],["docker_live_restor",{"_index":4954,"t":{"1209":{"position":[[454,20],[538,19],[603,20],[635,20]]}}}],["docker_proxy_http",{"_index":3536,"t":{"741":{"position":[[96,18],[156,19],[180,17]]}}}],["docker_vers",{"_index":4909,"t":{"1207":{"position":[[53,14],[112,15],[3241,14]]}}}],["dockerfil",{"_index":6527,"t":{"1966":{"position":[[3737,11]]}}}],["dockerhub",{"_index":2677,"t":{"472":{"position":[[1804,9],[1970,9]]},"474":{"position":[[1139,10]]},"1467":{"position":[[723,9]]}}}],["dockerhub'",{"_index":2669,"t":{"472":{"position":[[682,11]]}}}],["docs.package.json",{"_index":590,"t":{"92":{"position":[[77,18]]},"100":{"position":[[1037,19]]},"1669":{"position":[[1298,17]]}}}],["docs.scs.commun",{"_index":567,"t":{"85":{"position":[[114,19]]}}}],["docs/tool",{"_index":5729,"t":{"1615":{"position":[[183,11]]},"1619":{"position":[[12,11]]}}}],["document",{"_index":39,"t":{"7":{"position":[[224,13]]},"16":{"position":[[5,8]]},"18":{"position":[[161,8]]},"59":{"position":[[128,13]]},"85":{"position":[[51,13],[76,14]]},"87":{"position":[[27,13],[74,13],[100,13],[124,13]]},"90":{"position":[[31,13],[146,13],[170,13]]},"92":{"position":[[786,13]]},"98":{"position":[[20,13],[247,13]]},"100":{"position":[[360,13]]},"144":{"position":[[111,14]]},"166":{"position":[[1610,13]]},"173":{"position":[[1034,14]]},"177":{"position":[[567,8]]},"185":{"position":[[898,11],[1758,8]]},"237":{"position":[[87,13],[207,10]]},"239":{"position":[[559,13]]},"245":{"position":[[98,10]]},"249":{"position":[[64,9]]},"251":{"position":[[1362,9]]},"260":{"position":[[282,13]]},"267":{"position":[[249,10]]},"286":{"position":[[431,8]]},"298":{"position":[[548,14]]},"315":{"position":[[820,13]]},"317":{"position":[[1726,13]]},"319":{"position":[[2209,13],[6306,14],[6329,13],[6354,13]]},"350":{"position":[[153,13]]},"360":{"position":[[193,13]]},"426":{"position":[[850,14]]},"442":{"position":[[148,8]]},"451":{"position":[[5,8],[249,8]]},"527":{"position":[[66,13]]},"622":{"position":[[441,13],[1292,13]]},"636":{"position":[[375,13],[500,14]]},"650":{"position":[[26,13]]},"667":{"position":[[12,13]]},"718":{"position":[[785,10]]},"749":{"position":[[36,13]]},"756":{"position":[[26,13]]},"758":{"position":[[696,10]]},"760":{"position":[[67,10]]},"765":{"position":[[147,10]]},"767":{"position":[[2258,14]]},"783":{"position":[[336,13],[540,13]]},"787":{"position":[[465,13]]},"798":{"position":[[591,13],[646,13]]},"802":{"position":[[1149,13]]},"816":{"position":[[134,13]]},"839":{"position":[[626,13],[681,13]]},"875":{"position":[[79,10]]},"889":{"position":[[81,10]]},"902":{"position":[[52,10]]},"936":{"position":[[18,13],[112,13],[288,13],[407,13],[557,13]]},"989":{"position":[[36,13]]},"1010":{"position":[[169,14]]},"1034":{"position":[[31,10]]},"1065":{"position":[[441,13],[1292,13]]},"1079":{"position":[[375,13],[500,14]]},"1096":{"position":[[484,10],[518,14],[603,10],[637,14]]},"1116":{"position":[[2587,11]]},"1133":{"position":[[103,14]]},"1165":{"position":[[161,13]]},"1260":{"position":[[272,13],[333,13],[525,13]]},"1262":{"position":[[1845,9]]},"1306":{"position":[[116,10]]},"1314":{"position":[[1013,13]]},"1318":{"position":[[142,14]]},"1332":{"position":[[876,9]]},"1340":{"position":[[108,14]]},"1342":{"position":[[130,13]]},"1344":{"position":[[89,10]]},"1349":{"position":[[1087,10]]},"1363":{"position":[[525,13],[702,13],[780,13]]},"1383":{"position":[[109,11]]},"1400":{"position":[[613,10]]},"1402":{"position":[[809,10]]},"1415":{"position":[[251,10]]},"1434":{"position":[[231,13]]},"1458":{"position":[[220,8]]},"1465":{"position":[[265,10]]},"1473":{"position":[[0,13]]},"1475":{"position":[[207,11]]},"1498":{"position":[[5,8]]},"1537":{"position":[[308,9]]},"1545":{"position":[[84,14]]},"1547":{"position":[[86,10]]},"1563":{"position":[[366,8]]},"1582":{"position":[[137,8]]},"1584":{"position":[[78,10]]},"1586":{"position":[[29,8],[144,8],[464,8],[504,13],[539,9]]},"1588":{"position":[[8,9],[65,8],[308,8],[448,9],[499,9],[522,8],[627,8],[918,8],[1028,8],[1089,9],[1149,8],[1364,8],[1462,8],[1982,8],[2108,8],[2219,9],[2248,9],[2284,9],[2305,8]]},"1590":{"position":[[5,8],[91,8],[185,8],[351,10],[575,9],[726,9],[824,10]]},"1592":{"position":[[24,8],[255,9]]},"1594":{"position":[[18,9],[49,9],[232,9],[294,8],[390,8],[565,9],[814,9],[1006,8],[1034,8],[1098,9],[1148,9],[1331,9],[1370,8],[1410,8],[1551,8],[1634,9],[1672,8],[1782,8],[1808,8],[1853,9],[2019,10],[2053,8]]},"1596":{"position":[[19,8],[191,9],[338,9]]},"1598":{"position":[[9,8],[123,8],[247,8],[283,8],[339,8]]},"1600":{"position":[[9,8],[279,8],[372,9],[390,8]]},"1602":{"position":[[5,8],[131,9],[149,8]]},"1605":{"position":[[14,8],[169,10]]},"1607":{"position":[[60,9]]},"1610":{"position":[[162,9],[231,9],[452,8],[786,8],[960,9],[1095,9]]},"1612":{"position":[[5,8]]},"1617":{"position":[[115,8]]},"1619":{"position":[[350,9]]},"1624":{"position":[[290,8]]},"1626":{"position":[[134,9],[176,8]]},"1630":{"position":[[32,9]]},"1632":{"position":[[288,8]]},"1647":{"position":[[19,8]]},"1654":{"position":[[5,8]]},"1657":{"position":[[252,13],[386,14]]},"1659":{"position":[[263,13],[420,13]]},"1661":{"position":[[27,13],[107,14],[135,13],[252,9],[280,13]]},"1663":{"position":[[55,13],[149,13]]},"1665":{"position":[[14,13]]},"1667":{"position":[[14,13],[380,8],[431,8],[1650,8]]},"1669":{"position":[[184,14],[199,13],[295,14],[521,14],[628,14],[687,13],[866,13],[1141,13]]},"1671":{"position":[[28,13],[159,10]]},"1755":{"position":[[759,9]]},"1807":{"position":[[171,14]]},"1812":{"position":[[876,8]]},"1864":{"position":[[284,8]]},"1888":{"position":[[1755,11]]},"1910":{"position":[[14,9]]},"1921":{"position":[[4,9]]},"1941":{"position":[[362,13]]},"1943":{"position":[[245,8]]},"1951":{"position":[[5,8],[93,8]]},"1958":{"position":[[521,8]]},"1960":{"position":[[594,10],[667,9],[859,9]]},"1962":{"position":[[214,9],[1560,8],[1735,8],[1972,8],[2462,8],[2999,8],[4140,8],[5259,10]]},"1966":{"position":[[3126,9],[4068,10],[4641,8]]},"1973":{"position":[[69,9]]},"1981":{"position":[[29,13]]},"2009":{"position":[[45,9]]},"2013":{"position":[[149,9],[573,8],[1472,9]]},"2024":{"position":[[690,8]]},"2026":{"position":[[236,8]]},"2032":{"position":[[739,10]]},"2041":{"position":[[62,9]]},"2063":{"position":[[295,10]]},"2068":{"position":[[2033,14],[2143,14],[2212,14]]},"2077":{"position":[[641,9],[789,8]]},"2083":{"position":[[8,10]]},"2090":{"position":[[393,8]]},"2092":{"position":[[418,14]]},"2096":{"position":[[1744,13],[1771,13]]},"2099":{"position":[[89,11]]},"2101":{"position":[[137,8]]},"2131":{"position":[[364,8]]},"2160":{"position":[[364,8]]},"2191":{"position":[[8,10]]},"2198":{"position":[[459,8]]}}}],["documentation'",{"_index":3855,"t":{"802":{"position":[[1473,15]]},"1659":{"position":[[579,15]]}}}],["docusauru",{"_index":654,"t":{"100":{"position":[[763,10],[1847,10]]},"124":{"position":[[34,10]]},"138":{"position":[[79,11],[91,10]]},"142":{"position":[[171,10]]},"1669":{"position":[[12,11],[97,10],[224,11]]}}}],["doe",{"_index":825,"t":{"142":{"position":[[546,4]]}}}],["doesn't",{"_index":1761,"t":{"296":{"position":[[222,7],[382,7]]},"313":{"position":[[211,7]]},"622":{"position":[[845,7]]},"802":{"position":[[626,7]]},"865":{"position":[[124,7]]},"938":{"position":[[272,7]]},"1065":{"position":[[845,7]]},"1344":{"position":[[43,7]]},"1359":{"position":[[12,7]]},"1932":{"position":[[1960,7]]}}}],["dolor",{"_index":2,"t":{"3":{"position":[[12,5],[164,5]]}}}],["domain",{"_index":395,"t":{"46":{"position":[[74,6]]},"53":{"position":[[48,6]]},"251":{"position":[[1116,6],[1483,7]]},"563":{"position":[[606,7]]},"659":{"position":[[348,8]]},"714":{"position":[[640,6]]},"724":{"position":[[315,6],[326,6]]},"749":{"position":[[63,6],[130,6],[427,6],[551,6],[615,6],[769,6],[805,6],[1042,6],[1098,7],[1712,6],[1755,6],[2361,6],[2407,6],[3190,6],[3246,6],[3372,6],[3584,6],[3752,6],[3941,6],[4758,6],[4804,6],[6210,6],[6399,7],[6423,6],[6574,6],[6668,6],[6779,6],[6811,6],[6900,6],[6914,6]]},"785":{"position":[[63,6],[104,6]]},"787":{"position":[[951,6],[976,6]]},"800":{"position":[[550,7],[629,7]]},"852":{"position":[[1228,6]]},"1036":{"position":[[496,6]]},"1260":{"position":[[135,7]]},"1262":{"position":[[119,6],[136,7],[173,8],[187,7],[301,7],[363,7],[415,7],[455,7],[543,6],[908,7],[958,6],[1388,7],[1433,7],[2452,7],[2644,7],[2675,6],[2813,6],[2971,6],[3237,7],[3734,7],[3908,7],[4022,8]]},"1298":{"position":[[5906,7]]},"1647":{"position":[[268,7]]},"1977":{"position":[[2146,9]]},"2028":{"position":[[1842,8],[4396,7]]},"2032":{"position":[[1038,8]]},"2039":{"position":[[41,6],[145,7],[407,7],[424,7]]},"2041":{"position":[[323,6],[340,6],[449,7]]},"2043":{"position":[[179,7],[226,6],[256,6],[446,6],[650,7],[698,6]]},"2045":{"position":[[265,6],[443,6],[669,6],[893,8]]},"2047":{"position":[[28,6],[164,7],[315,7],[339,6],[394,6],[431,7],[461,6],[589,7]]},"2049":{"position":[[4,6],[91,6],[102,6],[151,7],[218,6],[229,6],[319,6],[475,6],[777,6],[812,6],[863,6]]},"2051":{"position":[[91,7],[188,6],[544,6],[1378,6],[1541,7]]},"2054":{"position":[[136,6],[172,7],[195,6],[246,7],[270,6],[342,6],[528,7],[569,6],[669,6]]},"2056":{"position":[[13,7]]},"2058":{"position":[[173,6],[297,6],[361,6],[434,6],[470,6],[707,6],[763,7],[1377,6],[1420,6],[2026,6],[2072,6],[2832,6],[2888,6],[3014,6],[3226,6],[3394,6],[3583,6],[4400,6],[4446,6],[6109,6],[6542,6],[6730,6],[6835,7],[6902,6],[6946,6],[6994,7],[7087,6],[7183,7],[7257,6],[7399,8]]},"2061":{"position":[[233,6],[323,6]]},"2063":{"position":[[234,6]]},"2065":{"position":[[25,6],[112,7],[138,6],[221,6]]},"2068":{"position":[[34,6],[74,7],[205,6],[267,6],[358,6],[417,6],[632,6],[744,6],[1056,6],[1201,6],[1317,6],[1415,6],[1450,7],[1638,6],[1723,6],[1759,7],[1780,7],[2188,6]]},"2071":{"position":[[130,7]]},"2073":{"position":[[103,7]]},"2077":{"position":[[127,7],[327,7],[446,6],[585,7],[660,7],[798,7],[922,6],[1044,7],[1097,6],[1171,6],[1295,6],[1308,6],[1349,6],[1930,7],[1998,7]]}}}],["domain1.example.com",{"_index":3289,"t":{"667":{"position":[[575,20]]}}}],["domain2.example.com",{"_index":3290,"t":{"667":{"position":[[596,19]]}}}],["domain_id",{"_index":3681,"t":{"749":{"position":[[6598,9]]},"1298":{"position":[[5728,10]]}}}],["domain_manager_gr",{"_index":3660,"t":{"749":{"position":[[4125,23]]},"2058":{"position":[[3767,23]]}}}],["domain_nam",{"_index":2381,"t":{"420":{"position":[[5745,16]]},"486":{"position":[[74,12]]},"491":{"position":[[97,11],[236,11],[1070,12],[1747,12]]},"749":{"position":[[1049,12]]},"2058":{"position":[[714,12]]}}}],["domains3",{"_index":6659,"t":{"2051":{"position":[[853,9]]}}}],["don't",{"_index":573,"t":{"87":{"position":[[148,5]]},"96":{"position":[[96,5]]},"171":{"position":[[465,5]]},"173":{"position":[[1182,5]]},"227":{"position":[[377,6]]},"288":{"position":[[269,5]]},"315":{"position":[[467,5]]},"317":{"position":[[603,5]]},"319":{"position":[[1081,5]]},"321":{"position":[[332,5]]},"348":{"position":[[343,5],[660,5]]},"352":{"position":[[995,5]]},"381":{"position":[[685,5]]},"403":{"position":[[102,5]]},"420":{"position":[[1279,6],[2899,5]]},"453":{"position":[[425,5]]},"468":{"position":[[1419,5]]},"470":{"position":[[694,5],[717,5]]},"491":{"position":[[1786,6]]},"504":{"position":[[287,5]]},"1262":{"position":[[1134,5]]},"1355":{"position":[[549,5]]},"1622":{"position":[[641,5]]},"1696":{"position":[[548,5]]},"1717":{"position":[[1356,5],[1492,5]]},"1743":{"position":[[548,5]]},"1755":{"position":[[313,5]]},"1757":{"position":[[367,5]]},"1762":{"position":[[1255,5],[1391,5]]},"1784":{"position":[[561,5]]},"1786":{"position":[[1106,5]]},"1796":{"position":[[449,5]]},"1798":{"position":[[367,5]]},"1810":{"position":[[3473,5]]},"1917":{"position":[[476,5]]},"1932":{"position":[[2524,5]]},"1998":{"position":[[169,5]]}}}],["done",{"_index":1252,"t":{"181":{"position":[[551,4]]},"239":{"position":[[647,5]]},"265":{"position":[[569,4]]},"269":{"position":[[9,4]]},"288":{"position":[[661,4],[781,5]]},"309":{"position":[[132,4]]},"311":{"position":[[133,4]]},"319":{"position":[[1869,4]]},"327":{"position":[[121,4]]},"424":{"position":[[465,4]]},"449":{"position":[[53,4]]},"451":{"position":[[1340,5]]},"453":{"position":[[349,4]]},"457":{"position":[[4180,5]]},"470":{"position":[[2643,4],[3936,4],[5049,5]]},"474":{"position":[[238,4]]},"478":{"position":[[983,4]]},"495":{"position":[[1114,5]]},"665":{"position":[[2337,4]]},"716":{"position":[[36,4]]},"749":{"position":[[346,4]]},"798":{"position":[[496,4]]},"816":{"position":[[1064,4]]},"839":{"position":[[531,4]]},"871":{"position":[[120,4]]},"900":{"position":[[437,5]]},"947":{"position":[[198,4]]},"1016":{"position":[[82,4]]},"1099":{"position":[[51,4]]},"1207":{"position":[[3466,4]]},"1223":{"position":[[78,5]]},"1272":{"position":[[470,4]]},"1318":{"position":[[42,4]]},"1391":{"position":[[25,4]]},"1425":{"position":[[25,4],[281,4]]},"1642":{"position":[[988,4]]},"1727":{"position":[[169,4]]},"1755":{"position":[[548,4]]},"1772":{"position":[[169,4]]},"1796":{"position":[[684,4]]},"1891":{"position":[[2184,4]]},"1912":{"position":[[204,4]]},"1926":{"position":[[1588,4]]},"1932":{"position":[[2050,4],[3236,4]]},"1951":{"position":[[77,4]]},"2028":{"position":[[5605,4]]},"2051":{"position":[[388,4]]}}}],["don´t",{"_index":915,"t":{"154":{"position":[[442,5]]}}}],["dot",{"_index":1468,"t":{"212":{"position":[[388,4]]},"313":{"position":[[923,3]]},"985":{"position":[[500,3]]}}}],["doubl",{"_index":6547,"t":{"1977":{"position":[[1025,6]]}}}],["down",{"_index":3851,"t":{"802":{"position":[[1210,4]]},"1014":{"position":[[968,4]]},"1016":{"position":[[1363,5],[1636,4]]},"1043":{"position":[[376,4]]},"1047":{"position":[[671,4],[765,4],[859,4]]},"1184":{"position":[[287,4]]},"1262":{"position":[[1254,4]]},"1888":{"position":[[1672,4]]},"1891":{"position":[[1110,4]]},"1977":{"position":[[1487,5]]},"2011":{"position":[[244,4]]},"2088":{"position":[[515,4]]},"2094":{"position":[[3485,4]]},"2131":{"position":[[207,5]]},"2160":{"position":[[207,5]]}}}],["downgrad",{"_index":5555,"t":{"1467":{"position":[[223,11]]}}}],["download",{"_index":335,"t":{"36":{"position":[[1391,8]]},"92":{"position":[[714,12]]},"386":{"position":[[109,8]]},"397":{"position":[[50,8]]},"457":{"position":[[1741,8],[8983,8],[9103,8],[9166,11],[9294,8]]},"462":{"position":[[294,10]]},"834":{"position":[[21,8],[280,8]]},"858":{"position":[[527,8]]},"860":{"position":[[209,8]]},"1168":{"position":[[482,8]]},"1172":{"position":[[443,10]]},"1541":{"position":[[11,8]]},"1812":{"position":[[90,11],[194,12],[530,8]]},"1964":{"position":[[2736,9]]},"1966":{"position":[[2043,8]]}}}],["downloads/mi",{"_index":4858,"t":{"1172":{"position":[[514,14]]}}}],["downsid",{"_index":6806,"t":{"2206":{"position":[[474,8]]}}}],["downstream",{"_index":1278,"t":{"183":{"position":[[875,10]]},"187":{"position":[[58,10],[306,10]]},"1355":{"position":[[797,10]]},"1962":{"position":[[4872,10]]},"2028":{"position":[[651,10]]},"2206":{"position":[[575,10]]}}}],["downtim",{"_index":1598,"t":{"247":{"position":[[920,8]]},"478":{"position":[[764,8]]},"1891":{"position":[[394,9]]},"1986":{"position":[[882,8]]},"1988":{"position":[[1717,9]]},"1994":{"position":[[465,8]]},"1996":{"position":[[36,9]]}}}],["dozen",{"_index":2607,"t":{"468":{"position":[[198,5]]},"493":{"position":[[601,6]]}}}],["dpdk_tunnel_interfac",{"_index":3543,"t":{"744":{"position":[[409,21]]}}}],["draft",{"_index":1724,"t":{"286":{"position":[[425,5]]},"1402":{"position":[[100,5]]},"1535":{"position":[[608,6]]},"1545":{"position":[[556,5]]},"1551":{"position":[[373,5]]},"1553":{"position":[[488,5],[577,5],[631,5]]},"1555":{"position":[[640,5]]},"1559":{"position":[[475,5]]},"1561":{"position":[[595,5]]},"1563":{"position":[[574,5]]},"1573":{"position":[[429,5]]},"1577":{"position":[[555,5]]},"1588":{"position":[[1662,6]]},"1592":{"position":[[78,6]]},"1594":{"position":[[1046,5],[2076,5]]},"1610":{"position":[[279,5]]},"1619":{"position":[[210,8],[393,6]]},"1626":{"position":[[32,6]]},"1642":{"position":[[314,5]]},"1644":{"position":[[86,6]]},"1704":{"position":[[964,7]]},"1731":{"position":[[986,7]]},"2216":{"position":[[68,5],[124,5],[157,5],[199,5],[239,5],[304,5]]}}}],["dragon",{"_index":3324,"t":{"689":{"position":[[221,6],[374,6],[527,6],[680,6]]},"767":{"position":[[268,7]]},"834":{"position":[[1577,6]]},"836":{"position":[[1522,6]]},"860":{"position":[[1069,6]]},"1034":{"position":[[6696,6]]}}}],["dragon@ip_from_your_serv",{"_index":3959,"t":{"834":{"position":[[1752,26]]},"836":{"position":[[1697,26]]}}}],["dragon@ip_from_your_server:/home/dragon/wireguard",{"_index":3820,"t":{"798":{"position":[[353,49]]},"839":{"position":[[388,49]]}}}],["dragon@manag",{"_index":4000,"t":{"850":{"position":[[711,17],[1480,17]]}}}],["dragon@mgr001",{"_index":4630,"t":{"1047":{"position":[[1469,16]]}}}],["dragon@testb",{"_index":3734,"t":{"767":{"position":[[3118,14]]},"1022":{"position":[[138,14],[282,14]]},"1028":{"position":[[135,14]]}}}],["dragonfli",{"_index":6475,"t":{"1962":{"position":[[2668,9],[2678,9],[2862,11]]},"1964":{"position":[[3180,10],[3232,9],[4350,9],[4899,10]]},"1966":{"position":[[71,10],[773,9],[1543,10],[1572,9],[2272,9],[2440,9],[4912,10],[5167,9]]}}}],["dragonfly'",{"_index":6522,"t":{"1966":{"position":[[2372,11]]}}}],["drastic",{"_index":6293,"t":{"1826":{"position":[[1308,11]]}}}],["drawback",{"_index":6526,"t":{"1966":{"position":[[3514,8]]},"1984":{"position":[[444,9]]}}}],["dri",{"_index":1502,"t":{"221":{"position":[[103,5]]},"405":{"position":[[5,3],[29,3]]},"628":{"position":[[240,3]]},"1071":{"position":[[240,3]]},"1155":{"position":[[49,3]]}}}],["drink",{"_index":1429,"t":{"206":{"position":[[209,6]]},"225":{"position":[[230,6]]},"227":{"position":[[351,7]]},"229":{"position":[[394,7]]},"231":{"position":[[251,6]]},"233":{"position":[[226,6]]}}}],["drive",{"_index":2024,"t":{"333":{"position":[[62,5]]},"852":{"position":[[802,5]]},"960":{"position":[[1027,5],[1051,5]]},"1702":{"position":[[472,6]]},"1753":{"position":[[471,6]]},"1794":{"position":[[471,6]]},"1826":{"position":[[143,6]]},"1926":{"position":[[33,7]]}}}],["drive'",{"_index":3965,"t":{"836":{"position":[[530,7]]}}}],["driven",{"_index":1830,"t":{"317":{"position":[[190,6],[862,6],[986,6],[1078,6],[1128,6],[1183,6],[1252,6],[1333,6],[1420,6]]},"422":{"position":[[1454,6]]},"1516":{"position":[[47,6]]}}}],["driver",{"_index":2533,"t":{"457":{"position":[[8601,6]]},"860":{"position":[[2654,7]]},"1174":{"position":[[638,7],[803,7]]},"1244":{"position":[[43,6],[81,7]]},"1246":{"position":[[43,6],[81,7]]},"1615":{"position":[[266,6]]},"1966":{"position":[[5235,7]]}}}],["drop",{"_index":829,"t":{"142":{"position":[[583,4]]},"468":{"position":[[786,5]]},"1411":{"position":[[234,7]]},"1915":{"position":[[292,7]]}}}],["drumbeat",{"_index":1414,"t":{"204":{"position":[[358,9]]}}}],["dsr",{"_index":1993,"t":{"327":{"position":[[601,4]]}}}],["due",{"_index":451,"t":{"70":{"position":[[89,3]]},"185":{"position":[[1957,4]]},"247":{"position":[[720,3]]},"329":{"position":[[1138,3]]},"457":{"position":[[5503,3]]},"498":{"position":[[15,3]]},"601":{"position":[[251,3]]},"816":{"position":[[773,3]]},"945":{"position":[[294,3]]},"985":{"position":[[730,3],[779,3]]},"1043":{"position":[[27,3]]},"1209":{"position":[[205,3]]},"1353":{"position":[[619,3]]},"1363":{"position":[[342,3]]},"1575":{"position":[[324,3]]},"1640":{"position":[[653,3]]},"1810":{"position":[[1487,3]]},"1932":{"position":[[2113,3],[3367,3]]},"1947":{"position":[[89,3]]},"1966":{"position":[[601,3]]},"1977":{"position":[[912,3],[1052,3]]},"1979":{"position":[[1467,3]]},"1986":{"position":[[725,3]]},"1994":{"position":[[384,3]]},"1998":{"position":[[570,3]]},"2000":{"position":[[352,3]]},"2011":{"position":[[88,3]]},"2013":{"position":[[285,3]]},"2045":{"position":[[291,3]]},"2051":{"position":[[234,3],[669,3]]},"2141":{"position":[[243,4]]}}}],["dumb",{"_index":4364,"t":{"1026":{"position":[[171,4]]}}}],["dummi",{"_index":3291,"t":{"670":{"position":[[0,5]]},"1374":{"position":[[414,5]]}}}],["dummy0",{"_index":3295,"t":{"670":{"position":[[164,6]]}}}],["dump",{"_index":4237,"t":{"979":{"position":[[85,4],[100,4]]},"985":{"position":[[53,4],[288,4]]},"993":{"position":[[22,4]]}}}],["duplic",{"_index":5775,"t":{"1661":{"position":[[181,12]]},"1700":{"position":[[1104,10]]},"1747":{"position":[[758,10]]},"1788":{"position":[[958,10]]},"1971":{"position":[[403,10]]},"1979":{"position":[[440,9]]},"2007":{"position":[[397,10]]},"2013":{"position":[[556,12]]},"2106":{"position":[[161,12]]}}}],["duplo",{"_index":1494,"t":{"221":{"position":[[50,6]]}}}],["durat",{"_index":4174,"t":{"943":{"position":[[26,10]]},"1034":{"position":[[1017,8],[1831,8],[2236,8],[5982,8],[6430,8]]},"1833":{"position":[[264,8]]}}}],["duration_avg",{"_index":4500,"t":{"1034":{"position":[[7224,12]]}}}],["duration_tot",{"_index":4499,"t":{"1034":{"position":[[7207,14]]}}}],["dure",{"_index":46,"t":{"7":{"position":[[317,6]]},"11":{"position":[[153,6]]},"348":{"position":[[242,6]]},"363":{"position":[[530,6]]},"420":{"position":[[1170,6]]},"470":{"position":[[1558,6]]},"476":{"position":[[1255,6],[2109,6]]},"486":{"position":[[271,6]]},"836":{"position":[[1798,6]]},"860":{"position":[[1087,6],[1134,6]]},"1016":{"position":[[37,6]]},"1112":{"position":[[574,6]]},"1207":{"position":[[3627,6]]},"1209":{"position":[[1023,6]]},"1314":{"position":[[257,6]]},"1402":{"position":[[165,6]]},"1586":{"position":[[314,6]]},"1590":{"position":[[613,6]]},"1661":{"position":[[262,6]]},"1975":{"position":[[1920,6],[2407,6]]},"1988":{"position":[[1517,6]]},"2073":{"position":[[34,6]]},"2077":{"position":[[2774,6]]},"2137":{"position":[[158,6]]}}}],["dvr",{"_index":5505,"t":{"1421":{"position":[[28,5]]}}}],["dynam",{"_index":2993,"t":{"573":{"position":[[393,11]]},"1964":{"position":[[805,7]]},"2116":{"position":[[288,12]]}}}],["e",{"_index":3699,"t":{"763":{"position":[[2592,1],[3409,1]]},"850":{"position":[[3393,1]]},"1041":{"position":[[629,1]]},"1191":{"position":[[33,1]]},"1207":{"position":[[4014,1]]},"1209":{"position":[[1962,1]]},"1755":{"position":[[478,1],[492,1],[505,1],[589,1],[603,1],[616,1]]},"1796":{"position":[[614,1],[628,1],[641,1],[725,1],[739,1],[752,1]]},"1964":{"position":[[3525,1]]},"2094":{"position":[[1621,1]]}}}],["e.g",{"_index":125,"t":{"18":{"position":[[243,5]]},"171":{"position":[[617,4]]},"185":{"position":[[1985,4]]},"251":{"position":[[1617,4]]},"339":{"position":[[680,4],[1549,4]]},"345":{"position":[[1062,4]]},"363":{"position":[[601,5],[774,5]]},"418":{"position":[[1191,3]]},"420":{"position":[[5329,5]]},"422":{"position":[[1873,4],[2013,5]]},"457":{"position":[[5003,4],[5681,5],[5974,5],[7040,4],[7259,5],[8457,4]]},"462":{"position":[[2190,4],[2409,5]]},"472":{"position":[[342,5],[677,4],[2007,4],[2106,4],[3115,4]]},"476":{"position":[[390,5],[1626,5],[2542,4]]},"478":{"position":[[242,4]]},"486":{"position":[[565,4]]},"491":{"position":[[1816,4]]},"495":{"position":[[145,4]]},"565":{"position":[[612,4]]},"595":{"position":[[486,4],[989,4]]},"746":{"position":[[2458,4]]},"785":{"position":[[316,5]]},"816":{"position":[[733,5]]},"860":{"position":[[540,5],[902,4]]},"869":{"position":[[352,5]]},"941":{"position":[[374,4]]},"947":{"position":[[547,5]]},"1007":{"position":[[91,4]]},"1112":{"position":[[597,5]]},"1114":{"position":[[102,5]]},"1116":{"position":[[2620,4]]},"1209":{"position":[[1168,5]]},"1262":{"position":[[708,4],[1116,4],[2824,5]]},"1280":{"position":[[1273,4]]},"1334":{"position":[[665,4]]},"1402":{"position":[[1241,4]]},"1436":{"position":[[742,4]]},"1543":{"position":[[537,4]]},"1619":{"position":[[461,4]]},"1624":{"position":[[322,5]]},"1632":{"position":[[61,4]]},"1690":{"position":[[134,5]]},"1700":{"position":[[1028,5]]},"1704":{"position":[[1458,4]]},"1708":{"position":[[946,4]]},"1727":{"position":[[128,5]]},"1731":{"position":[[1480,4]]},"1739":{"position":[[890,4]]},"1747":{"position":[[682,5]]},"1751":{"position":[[985,4]]},"1772":{"position":[[128,5]]},"1780":{"position":[[888,4]]},"1788":{"position":[[882,5]]},"1792":{"position":[[985,4]]},"1805":{"position":[[63,4]]},"1810":{"position":[[395,5],[2092,4]]},"1812":{"position":[[680,4]]},"1816":{"position":[[103,5],[2059,4]]},"1824":{"position":[[289,5]]},"1828":{"position":[[1044,5]]},"1853":{"position":[[1014,4]]},"1864":{"position":[[316,5]]},"1888":{"position":[[624,4]]},"1891":{"position":[[925,5]]},"1893":{"position":[[386,4],[1035,5]]},"1956":{"position":[[140,4],[297,4]]},"1958":{"position":[[461,4]]},"1962":{"position":[[975,5],[1394,4],[2375,4],[2830,4],[3618,4]]},"1964":{"position":[[296,5],[1123,4],[1453,4],[2506,4],[2659,5],[2998,4],[4947,5]]},"1966":{"position":[[3775,4],[5007,5],[5191,4]]},"1975":{"position":[[1762,5]]},"1979":{"position":[[856,4]]},"2022":{"position":[[409,4],[499,4]]},"2026":{"position":[[186,4],[423,4],[684,5],[696,4]]},"2028":{"position":[[1481,6],[1617,4],[2801,5],[3000,5]]},"2030":{"position":[[63,4],[153,4]]},"2032":{"position":[[644,5],[883,4]]},"2077":{"position":[[2480,4],[3012,4]]},"2088":{"position":[[83,5]]},"2094":{"position":[[1303,5],[1855,4],[2140,4]]},"2122":{"position":[[134,4]]},"2137":{"position":[[510,5],[568,5]]},"2143":{"position":[[145,5]]},"2166":{"position":[[188,5],[246,5]]}}}],["e.v",{"_index":2931,"t":{"523":{"position":[[87,4]]}}}],["e0ded111a007",{"_index":4616,"t":{"1041":{"position":[[703,12]]}}}],["e2",{"_index":1843,"t":{"317":{"position":[[1167,3],[1230,3],[1317,3],[1398,3]]},"337":{"position":[[100,3],[132,3],[201,3],[256,3],[336,3],[397,3],[477,3],[538,3],[618,3],[668,3],[747,3],[826,3],[857,3],[884,3],[922,3],[997,3],[1046,3],[1132,3],[1187,3],[1273,3],[1328,3],[1414,3],[1458,3],[1543,3],[1628,3],[1659,3],[1781,3],[1865,3]]},"339":{"position":[[145,3],[586,3],[981,3],[1032,3],[1461,3],[1844,3]]},"341":{"position":[[49,3]]},"343":{"position":[[85,3]]},"345":{"position":[[160,3],[266,3],[294,3],[402,3],[432,3],[531,3],[755,3],[875,3],[921,3],[942,3],[965,3],[985,3],[1030,3],[1527,3],[1612,3],[1766,4],[1804,4],[1875,3],[1904,3],[1973,3],[2010,4],[2077,4]]},"1475":{"position":[[132,3]]},"1919":{"position":[[620,3]]}}}],["e2e.yaml",{"_index":2034,"t":{"335":{"position":[[494,8]]},"339":{"position":[[719,8],[1588,8]]}}}],["e58a7a8af17",{"_index":4641,"t":{"1093":{"position":[[171,12]]}}}],["e74",{"_index":4574,"t":{"1038":{"position":[[1117,3]]}}}],["e7622c1048ac4520a2d050ae141e826b",{"_index":235,"t":{"27":{"position":[[1248,32]]}}}],["each",{"_index":534,"t":{"76":{"position":[[333,4]]},"100":{"position":[[1312,4]]},"150":{"position":[[78,4]]},"249":{"position":[[130,4]]},"251":{"position":[[1068,4]]},"319":{"position":[[816,4],[963,4],[2796,4],[3865,4]]},"321":{"position":[[762,4]]},"348":{"position":[[478,4]]},"358":{"position":[[205,4],[343,4]]},"472":{"position":[[1360,4],[1616,4]]},"561":{"position":[[240,4]]},"567":{"position":[[168,4],[428,4]]},"583":{"position":[[41,4]]},"597":{"position":[[466,4]]},"612":{"position":[[86,4]]},"632":{"position":[[517,4]]},"634":{"position":[[129,4]]},"735":{"position":[[979,4]]},"746":{"position":[[3347,4]]},"767":{"position":[[32,4]]},"778":{"position":[[498,4]]},"785":{"position":[[501,4]]},"798":{"position":[[336,4]]},"839":{"position":[[371,4]]},"869":{"position":[[0,4],[427,4]]},"941":{"position":[[563,4],[752,4]]},"1010":{"position":[[398,4],[1602,4],[2754,4],[2946,4]]},"1014":{"position":[[148,4],[573,4],[923,4],[1053,4],[1313,4],[1573,4],[1754,4],[1942,4]]},"1016":{"position":[[342,4],[469,4],[484,4],[694,4],[1436,4],[1591,4],[1686,4]]},"1032":{"position":[[0,4]]},"1057":{"position":[[86,4]]},"1075":{"position":[[517,4]]},"1077":{"position":[[129,4]]},"1122":{"position":[[4,4],[525,4]]},"1137":{"position":[[78,4]]},"1179":{"position":[[210,4]]},"1207":{"position":[[4061,4]]},"1467":{"position":[[656,4]]},"1516":{"position":[[611,4]]},"1535":{"position":[[436,4],[570,4]]},"1543":{"position":[[1106,4]]},"1588":{"position":[[60,4],[299,4],[443,4],[517,4],[1457,4]]},"1590":{"position":[[0,4]]},"1610":{"position":[[157,4]]},"1622":{"position":[[818,4],[1540,4],[1593,4]]},"1632":{"position":[[0,4]]},"1644":{"position":[[178,4],[229,4]]},"1667":{"position":[[375,4]]},"1704":{"position":[[1267,4]]},"1731":{"position":[[1290,4]]},"1818":{"position":[[89,4]]},"1851":{"position":[[259,4]]},"1853":{"position":[[824,4]]},"1868":{"position":[[77,4]]},"1886":{"position":[[105,4]]},"1888":{"position":[[1128,4]]},"1962":{"position":[[426,4]]},"1966":{"position":[[5259,4]]},"2013":{"position":[[800,4]]},"2015":{"position":[[655,4],[700,4],[751,4],[888,4]]},"2028":{"position":[[4016,4]]},"2047":{"position":[[292,4]]},"2051":{"position":[[1015,4]]},"2058":{"position":[[7158,4]]},"2077":{"position":[[2431,4],[2584,4]]},"2118":{"position":[[166,4],[325,4]]}}}],["earli",{"_index":2402,"t":{"422":{"position":[[1602,5]]},"2051":{"position":[[710,6]]},"2088":{"position":[[401,5]]}}}],["earlier",{"_index":6248,"t":{"1814":{"position":[[236,8]]}}}],["eas",{"_index":1199,"t":{"177":{"position":[[1874,4]]},"300":{"position":[[781,4]]},"1449":{"position":[[347,4]]},"1757":{"position":[[312,4]]},"1798":{"position":[[312,4]]},"2022":{"position":[[457,4]]},"2094":{"position":[[693,4]]}}}],["eascii",{"_index":4373,"t":{"1026":{"position":[[339,6]]}}}],["easi",{"_index":159,"t":{"23":{"position":[[391,4]]},"108":{"position":[[140,4]]},"160":{"position":[[119,4]]},"177":{"position":[[152,4]]},"260":{"position":[[262,4]]},"300":{"position":[[637,4]]},"447":{"position":[[308,4]]},"1365":{"position":[[233,4]]},"1610":{"position":[[419,4]]},"1667":{"position":[[1358,4]]},"1988":{"position":[[68,4],[1331,4],[1389,4]]},"1990":{"position":[[828,4]]},"2094":{"position":[[499,4],[1030,4],[1961,4],[2588,4]]},"2096":{"position":[[181,4],[313,4]]}}}],["easier",{"_index":887,"t":{"152":{"position":[[127,6]]},"175":{"position":[[956,6]]},"321":{"position":[[572,6]]},"1096":{"position":[[710,7]]},"1139":{"position":[[120,6]]},"1332":{"position":[[391,6]]},"1355":{"position":[[786,6]]},"1365":{"position":[[645,6]]},"1434":{"position":[[380,7]]},"1469":{"position":[[388,6]]},"1588":{"position":[[509,7]]},"1706":{"position":[[761,6]]},"1733":{"position":[[951,6]]},"1776":{"position":[[796,6]]},"1996":{"position":[[138,6]]}}}],["easiest",{"_index":553,"t":{"83":{"position":[[106,7]]},"265":{"position":[[4,7]]}}}],["easili",{"_index":1656,"t":{"265":{"position":[[961,6]]},"381":{"position":[[374,6]]},"470":{"position":[[2963,6]]},"1159":{"position":[[148,6]]},"1170":{"position":[[225,6]]},"1262":{"position":[[1451,6]]},"1270":{"position":[[495,6]]},"1402":{"position":[[644,6]]},"1417":{"position":[[226,6]]},"1451":{"position":[[226,6]]},"1471":{"position":[[604,7]]},"1545":{"position":[[327,6]]},"1549":{"position":[[84,6]]},"1926":{"position":[[1043,6],[1130,7]]},"1986":{"position":[[174,6]]},"2028":{"position":[[2361,6],[5747,6]]},"2088":{"position":[[310,6]]},"2157":{"position":[[259,6]]},"2164":{"position":[[492,6]]}}}],["east",{"_index":5546,"t":{"1465":{"position":[[216,4]]}}}],["ec2",{"_index":366,"t":{"38":{"position":[[43,3]]},"484":{"position":[[576,3],[878,3]]},"579":{"position":[[195,3]]}}}],["ecc",{"_index":5864,"t":{"1690":{"position":[[43,3],[212,4],[223,3]]},"1702":{"position":[[235,5]]},"1706":{"position":[[929,3]]},"1727":{"position":[[37,3],[213,4],[224,3]]},"1733":{"position":[[1119,3]]},"1753":{"position":[[235,5]]},"1772":{"position":[[37,3],[213,4],[224,3]]},"1776":{"position":[[964,3]]},"1794":{"position":[[235,5]]}}}],["echo",{"_index":2054,"t":{"341":{"position":[[767,4]]},"457":{"position":[[4647,4],[4716,4],[5687,4],[5756,4]]},"1036":{"position":[[319,4]]}}}],["eclips",{"_index":231,"t":{"27":{"position":[[1210,7]]}}}],["eco",{"_index":6632,"t":{"2028":{"position":[[3285,3]]}}}],["econom",{"_index":2935,"t":{"523":{"position":[[134,9]]},"1496":{"position":[[246,8]]},"2196":{"position":[[114,12]]}}}],["ecosystem",{"_index":5767,"t":{"1657":{"position":[[45,10]]},"1968":{"position":[[134,10]]},"2139":{"position":[[88,10]]}}}],["ed",{"_index":2479,"t":{"457":{"position":[[1377,2]]}}}],["edg",{"_index":3940,"t":{"827":{"position":[[235,4]]},"831":{"position":[[286,4],[353,4]]},"850":{"position":[[487,4]]},"1473":{"position":[[91,4]]},"1607":{"position":[[123,4]]}}}],["edit",{"_index":2434,"t":{"438":{"position":[[185,4]]},"449":{"position":[[152,6]]},"457":{"position":[[8209,5]]},"462":{"position":[[29,7],[145,4]]},"470":{"position":[[571,4],[2551,6]]},"480":{"position":[[198,4]]},"493":{"position":[[224,4]]},"1010":{"position":[[421,4]]},"1034":{"position":[[224,4]]}}}],["editor",{"_index":2435,"t":{"438":{"position":[[269,7]]},"1159":{"position":[[10,7]]}}}],["editori",{"_index":5725,"t":{"1610":{"position":[[1235,9]]}}}],["eeconcil",{"_index":4675,"t":{"1107":{"position":[[37,10]]}}}],["eeed7e0ad33f42f189fb4165116f5a1b",{"_index":240,"t":{"27":{"position":[[1337,32]]}}}],["effect",{"_index":2277,"t":{"418":{"position":[[1325,7],[1658,6]]},"769":{"position":[[791,9]]},"1557":{"position":[[394,12]]},"1588":{"position":[[1871,6]]},"1622":{"position":[[1653,7],[1713,9],[1777,9],[1880,7]]},"1636":{"position":[[971,7],[1044,9]]},"1663":{"position":[[45,9]]},"1665":{"position":[[177,11]]},"1667":{"position":[[177,11]]},"1688":{"position":[[1609,9]]},"1725":{"position":[[1961,9]]},"1770":{"position":[[2263,9]]},"1877":{"position":[[506,6]]},"1891":{"position":[[2915,7]]},"1990":{"position":[[902,14]]},"1998":{"position":[[539,12]]},"2004":{"position":[[514,14]]},"2054":{"position":[[699,11]]}}}],["effici",{"_index":5634,"t":{"1553":{"position":[[262,10]]},"1555":{"position":[[564,11]]},"1565":{"position":[[120,9]]},"1657":{"position":[[431,9]]},"1966":{"position":[[1941,10],[2052,10]]},"1975":{"position":[[1737,9]]},"1988":{"position":[[223,10],[1756,10]]},"2004":{"position":[[1886,9]]},"2137":{"position":[[653,12],[684,9]]},"2139":{"position":[[325,9]]}}}],["effort",{"_index":1672,"t":{"269":{"position":[[329,7]]},"1314":{"position":[[316,6]]},"1332":{"position":[[629,6]]},"1363":{"position":[[503,7]]},"1368":{"position":[[670,7]]},"1717":{"position":[[1103,6]]},"1739":{"position":[[1081,7]]},"1762":{"position":[[1002,6]]},"1780":{"position":[[1079,7]]},"1810":{"position":[[2625,6],[4743,6]]},"1960":{"position":[[697,6]]},"2013":{"position":[[445,7]]},"2090":{"position":[[134,8]]},"2092":{"position":[[53,6]]},"2141":{"position":[[105,7]]}}}],["eg",{"_index":6636,"t":{"2028":{"position":[[3770,4]]},"2094":{"position":[[2719,4]]}}}],["eight",{"_index":5799,"t":{"1669":{"position":[[1044,5]]}}}],["elabor",{"_index":5792,"t":{"1667":{"position":[[1492,10]]},"1984":{"position":[[343,9]]}}}],["elasticsearch",{"_index":3344,"t":{"693":{"position":[[202,13]]},"933":{"position":[[552,13]]},"1308":{"position":[[380,13]]},"1411":{"position":[[833,13],[890,13],[955,13]]},"1447":{"position":[[4,13]]}}}],["elect",{"_index":6359,"t":{"1888":{"position":[[1549,8]]}}}],["electr",{"_index":6605,"t":{"2013":{"position":[[1368,10]]}}}],["elegantli",{"_index":2652,"t":{"470":{"position":[[3354,9]]}}}],["element",{"_index":557,"t":{"83":{"position":[[186,7]]},"603":{"position":[[736,8]]},"1262":{"position":[[4434,8]]}}}],["elementum",{"_index":9,"t":{"3":{"position":[[70,9]]}}}],["elig",{"_index":1726,"t":{"286":{"position":[[566,8]]},"1816":{"position":[[1623,8]]}}}],["elimin",{"_index":2334,"t":{"420":{"position":[[2567,10],[2666,10]]},"1661":{"position":[[164,9]]}}}],["elit",{"_index":7,"t":{"3":{"position":[[51,5]]}}}],["else'",{"_index":6195,"t":{"1801":{"position":[[440,6]]}}}],["elsewher",{"_index":1269,"t":{"183":{"position":[[474,9]]}}}],["email",{"_index":1465,"t":{"212":{"position":[[209,5],[468,6]]},"231":{"position":[[189,6]]},"491":{"position":[[802,5],[1005,7]]},"802":{"position":[[3025,6]]},"1262":{"position":[[4110,6]]},"1298":{"position":[[10721,6]]},"1962":{"position":[[3330,5],[4552,5]]},"2096":{"position":[[1028,5]]}}}],["email@example.com",{"_index":2873,"t":{"491":{"position":[[1119,20]]}}}],["embed",{"_index":5694,"t":{"1588":{"position":[[1499,8]]},"2094":{"position":[[1118,9]]}}}],["embrac",{"_index":6591,"t":{"2004":{"position":[[1730,9]]}}}],["emerg",{"_index":4181,"t":{"945":{"position":[[140,9]]},"975":{"position":[[19,9]]},"1899":{"position":[[380,7]]}}}],["emphas",{"_index":2941,"t":{"529":{"position":[[31,10]]},"1571":{"position":[[392,10]]}}}],["employ",{"_index":1302,"t":{"185":{"position":[[439,10]]},"1496":{"position":[[127,8]]},"1555":{"position":[[304,6]]},"1669":{"position":[[4,7]]}}}],["employe",{"_index":1406,"t":{"202":{"position":[[79,9]]},"2022":{"position":[[485,9]]}}}],["empow",{"_index":1745,"t":{"292":{"position":[[462,7]]},"521":{"position":[[69,8]]}}}],["empti",{"_index":2272,"t":{"418":{"position":[[986,5]]},"420":{"position":[[3491,5]]},"729":{"position":[[445,8],[1470,5]]},"767":{"position":[[3055,6]]},"854":{"position":[[203,6]]}}}],["emtadata",{"_index":4980,"t":{"1262":{"position":[[2254,8]]}}}],["emul",{"_index":6582,"t":{"1998":{"position":[[1773,7]]},"2000":{"position":[[118,10]]},"2002":{"position":[[434,9]]},"2004":{"position":[[666,9],[1304,9]]}}}],["en_us.utf",{"_index":3900,"t":{"812":{"position":[[294,9]]},"860":{"position":[[563,9]]}}}],["enabl",{"_index":803,"t":{"140":{"position":[[405,8]]},"265":{"position":[[483,8]]},"298":{"position":[[403,7]]},"325":{"position":[[540,7]]},"329":{"position":[[1436,8]]},"331":{"position":[[9,6],[501,6]]},"363":{"position":[[714,8]]},"420":{"position":[[4726,7],[4883,6],[5535,8]]},"457":{"position":[[5439,6],[5692,7],[5761,7]]},"504":{"position":[[1145,6]]},"610":{"position":[[583,6]]},"622":{"position":[[819,9]]},"659":{"position":[[203,6],[810,9]]},"665":{"position":[[2356,6]]},"737":{"position":[[473,7]]},"763":{"position":[[2131,6],[2280,6]]},"767":{"position":[[966,7],[1084,7],[1162,7]]},"800":{"position":[[8,7]]},"816":{"position":[[601,7]]},"847":{"position":[[163,7]]},"852":{"position":[[344,7],[378,6],[480,8],[1528,6]]},"873":{"position":[[651,6]]},"960":{"position":[[523,9],[549,8]]},"999":{"position":[[97,6],[172,6]]},"1001":{"position":[[206,7]]},"1010":{"position":[[1058,9]]},"1016":{"position":[[280,6],[365,6],[407,6],[527,6],[632,6],[717,6],[1396,6],[1478,6],[1647,6],[1725,6]]},"1047":{"position":[[383,7],[476,7],[569,7],[661,7],[755,7],[849,7],[1867,7],[1960,7],[2053,7]]},"1055":{"position":[[583,6]]},"1065":{"position":[[819,9]]},"1103":{"position":[[77,6]]},"1209":{"position":[[491,7],[704,8]]},"1337":{"position":[[10,7]]},"1349":{"position":[[536,8]]},"1363":{"position":[[202,7]]},"1368":{"position":[[1352,9],[1582,7]]},"1402":{"position":[[824,7]]},"1431":{"position":[[657,7]]},"1462":{"position":[[253,7]]},"1465":{"position":[[322,7]]},"1516":{"position":[[237,6],[447,7]]},"1688":{"position":[[365,8],[784,6],[825,7]]},"1690":{"position":[[269,7]]},"1696":{"position":[[526,8]]},"1725":{"position":[[457,8],[897,6],[938,7],[1359,7]]},"1727":{"position":[[270,7]]},"1743":{"position":[[526,8],[737,7]]},"1770":{"position":[[457,8],[917,7],[989,8],[1562,6]]},"1772":{"position":[[270,7]]},"1784":{"position":[[539,8],[750,7]]},"1828":{"position":[[1053,6]]},"1891":{"position":[[4816,7]]},"1917":{"position":[[92,7],[624,8]]},"1956":{"position":[[53,6]]},"1975":{"position":[[2214,6]]},"1977":{"position":[[2093,7]]},"1988":{"position":[[722,6],[1232,6]]},"2004":{"position":[[375,7]]},"2015":{"position":[[1097,6]]},"2043":{"position":[[132,6]]}}}],["enable_ceph_rgw",{"_index":3214,"t":{"659":{"position":[[1351,16]]}}}],["enable_ceph_rgw_keyston",{"_index":3215,"t":{"659":{"position":[[1373,25]]}}}],["enable_config_dr",{"_index":3798,"t":{"791":{"position":[[259,19]]}}}],["enable_dhcp",{"_index":4049,"t":{"850":{"position":[[3168,12],[3577,12]]}}}],["enable_listen",{"_index":3521,"t":{"739":{"position":[[162,15],[442,16]]}}}],["encod",{"_index":2767,"t":{"476":{"position":[[1994,7],[2278,7]]},"1680":{"position":[[575,7]]},"1700":{"position":[[66,6]]},"1708":{"position":[[1266,6],[1433,8]]},"1717":{"position":[[575,7]]},"1720":{"position":[[786,8]]},"1751":{"position":[[1270,6],[1437,8]]},"1762":{"position":[[474,7]]},"1765":{"position":[[786,8]]},"1792":{"position":[[1293,6],[1460,8]]}}}],["encompass",{"_index":5618,"t":{"1545":{"position":[[11,11]]},"1553":{"position":[[144,11]]},"1557":{"position":[[170,11]]}}}],["encount",{"_index":6688,"t":{"2071":{"position":[[44,9]]}}}],["encourag",{"_index":36,"t":{"7":{"position":[[183,9]]},"1596":{"position":[[250,11]]},"1706":{"position":[[1539,10]]},"1733":{"position":[[1803,10]]},"1776":{"position":[[1650,10]]},"1919":{"position":[[1050,9]]},"1977":{"position":[[230,11]]}}}],["encrypt",{"_index":1694,"t":{"278":{"position":[[142,10]]},"319":{"position":[[3718,7],[4034,10],[4185,7],[6343,10]]},"341":{"position":[[196,9],[331,9],[678,7],[844,7]]},"449":{"position":[[816,9]]},"491":{"position":[[1593,7]]},"722":{"position":[[31,9]]},"1170":{"position":[[283,7]]},"1218":{"position":[[397,7]]},"1395":{"position":[[158,10]]},"1397":{"position":[[566,10],[605,10]]},"1402":{"position":[[791,10]]},"1893":{"position":[[1088,10]]},"1928":{"position":[[181,10]]},"1932":{"position":[[0,11],[12,10],[133,10],[401,10]]},"1936":{"position":[[49,10]]}}}],["encrypted/pkcs1",{"_index":1904,"t":{"319":{"position":[[4400,16],[5910,16],[6570,16],[6625,16],[6680,16]]}}}],["encrypted=true/fals",{"_index":6443,"t":{"1936":{"position":[[96,20]]}}}],["encrypted_data",{"_index":1927,"t":{"319":{"position":[[6594,16],[6649,16],[6704,16]]}}}],["end",{"_index":24,"t":{"7":{"position":[[60,3]]},"152":{"position":[[61,3]]},"212":{"position":[[832,3]]},"265":{"position":[[411,3]]},"358":{"position":[[1697,3]]},"495":{"position":[[1050,4]]},"579":{"position":[[116,3]]},"581":{"position":[[45,3]]},"583":{"position":[[357,4]]},"691":{"position":[[424,4]]},"1034":{"position":[[1791,5],[5942,5]]},"1139":{"position":[[54,3]]},"1161":{"position":[[3818,6]]},"1413":{"position":[[322,3],[333,3]]},"1419":{"position":[[247,3]]},"1453":{"position":[[251,3]]},"1715":{"position":[[182,3]]},"1760":{"position":[[182,3]]},"1810":{"position":[[4567,3],[4688,3]]},"1826":{"position":[[949,4]]},"1862":{"position":[[242,4]]},"1915":{"position":[[458,3]]}}}],["endfor",{"_index":3532,"t":{"739":{"position":[[802,6]]},"746":{"position":[[1448,6],[1658,6]]}}}],["endif",{"_index":3531,"t":{"739":{"position":[[791,5]]},"746":{"position":[[1437,5],[1647,5]]}}}],["endpoint",{"_index":352,"t":{"36":{"position":[[1688,9],[1722,8]]},"38":{"position":[[208,10]]},"44":{"position":[[133,8]]},"51":{"position":[[116,8]]},"249":{"position":[[91,10]]},"253":{"position":[[69,9]]},"422":{"position":[[756,8]]},"424":{"position":[[1199,9]]},"476":{"position":[[37,9]]},"798":{"position":[[106,9]]},"802":{"position":[[2154,8],[2894,8]]},"839":{"position":[[126,9]]},"873":{"position":[[502,9]]},"1262":{"position":[[1292,8],[1546,9],[3708,8]]},"1387":{"position":[[63,9],[179,10],[247,10]]},"2028":{"position":[[2072,9],[2393,9],[4472,11]]},"2112":{"position":[[4,9]]},"2122":{"position":[[52,9]]}}}],["endus",{"_index":2928,"t":{"521":{"position":[[148,9]]}}}],["enforc",{"_index":727,"t":{"118":{"position":[[76,7]]},"120":{"position":[[95,8]]},"164":{"position":[[53,7]]},"185":{"position":[[255,7],[1382,11],[1506,7]]},"579":{"position":[[297,8]]},"1671":{"position":[[467,7]]}}}],["engag",{"_index":5508,"t":{"1425":{"position":[[254,7]]},"1669":{"position":[[512,8]]}}}],["engin",{"_index":1625,"t":{"251":{"position":[[1430,6]]}}}],["english",{"_index":4088,"t":{"860":{"position":[[432,7],[490,7],[630,7]]}}}],["enhanc",{"_index":1121,"t":{"175":{"position":[[736,12]]},"294":{"position":[[359,9]]},"300":{"position":[[1178,12]]},"422":{"position":[[2441,8]]},"502":{"position":[[508,12]]},"504":{"position":[[576,8]]},"531":{"position":[[47,9]]},"960":{"position":[[180,8],[250,8],[600,8],[700,8]]},"1116":{"position":[[1055,8]]},"1368":{"position":[[1083,13]]},"1372":{"position":[[129,8]]},"1383":{"position":[[866,7]]},"1385":{"position":[[265,12]]},"1659":{"position":[[168,8]]}}}],["eno1",{"_index":3462,"t":{"727":{"position":[[281,4],[396,5]]},"729":{"position":[[2058,4],[2527,5],[2686,4]]},"850":{"position":[[996,4],[1896,5]]}}}],["eno2",{"_index":4014,"t":{"850":{"position":[[1055,4]]}}}],["eno3",{"_index":4016,"t":{"850":{"position":[[1114,4]]}}}],["eno4",{"_index":4019,"t":{"850":{"position":[[1175,4]]}}}],["eno5",{"_index":4021,"t":{"850":{"position":[[1236,4]]}}}],["eno6",{"_index":4023,"t":{"850":{"position":[[1297,4]]}}}],["eno7",{"_index":4004,"t":{"850":{"position":[[869,4],[1366,5],[1430,5],[1506,4],[1524,5],[1914,5],[2180,5],[2592,4]]}}}],["eno8",{"_index":4009,"t":{"850":{"position":[[934,4]]}}}],["enorm",{"_index":5380,"t":{"1329":{"position":[[408,8]]}}}],["enough",{"_index":1426,"t":{"206":{"position":[[43,6]]},"208":{"position":[[16,7]]},"212":{"position":[[764,6],[889,6]]},"225":{"position":[[313,6]]},"313":{"position":[[782,6]]},"1016":{"position":[[1264,7]]},"1692":{"position":[[767,6]]},"1729":{"position":[[839,6]]},"1774":{"position":[[980,6]]},"1786":{"position":[[1419,6]]},"1964":{"position":[[249,7]]},"1977":{"position":[[2772,6]]},"2068":{"position":[[787,6]]}}}],["enrol",{"_index":6687,"t":{"2071":{"position":[[17,6]]}}}],["enspoint",{"_index":4976,"t":{"1262":{"position":[[1816,9]]}}}],["ensur",{"_index":973,"t":{"164":{"position":[[592,6]]},"185":{"position":[[1019,7],[2098,6]]},"300":{"position":[[273,7]]},"304":{"position":[[196,6]]},"319":{"position":[[5387,7]]},"329":{"position":[[337,6]]},"337":{"position":[[765,7],[1567,7],[1849,6]]},"339":{"position":[[322,7],[460,7],[960,6],[1197,7],[1335,7],[1823,6]]},"345":{"position":[[1472,7],[1552,6],[1647,6]]},"358":{"position":[[1057,7]]},"457":{"position":[[1201,6],[1587,6]]},"459":{"position":[[152,6]]},"474":{"position":[[915,6],[3492,6]]},"529":{"position":[[59,8]]},"563":{"position":[[525,6]]},"573":{"position":[[519,6]]},"763":{"position":[[2504,6]]},"769":{"position":[[628,6]]},"1010":{"position":[[1595,6]]},"1034":{"position":[[3263,8],[3424,6],[5085,8]]},"1114":{"position":[[673,6]]},"1415":{"position":[[86,6]]},"1488":{"position":[[57,6]]},"1516":{"position":[[248,6]]},"1545":{"position":[[189,8]]},"1547":{"position":[[168,8]]},"1553":{"position":[[243,8]]},"1555":{"position":[[30,7],[461,7]]},"1557":{"position":[[127,6],[330,6]]},"1559":{"position":[[117,8]]},"1561":{"position":[[128,6]]},"1563":{"position":[[189,8],[302,8]]},"1565":{"position":[[100,8]]},"1569":{"position":[[192,6]]},"1571":{"position":[[299,8]]},"1575":{"position":[[132,7]]},"1669":{"position":[[646,6]]},"1671":{"position":[[129,7]]},"1708":{"position":[[1042,6]]},"1710":{"position":[[167,6]]},"1735":{"position":[[167,6]]},"1739":{"position":[[359,7]]},"1755":{"position":[[672,6]]},"1778":{"position":[[252,6]]},"1780":{"position":[[357,7]]},"1792":{"position":[[1069,6]]},"1830":{"position":[[102,7]]},"1888":{"position":[[868,6]]},"1891":{"position":[[3182,6],[3406,6],[3656,6]]},"1893":{"position":[[980,6]]},"1906":{"position":[[149,7]]},"1917":{"position":[[701,7]]},"1964":{"position":[[1053,6],[1691,6]]},"1966":{"position":[[1376,6]]},"1975":{"position":[[209,6]]},"1977":{"position":[[3003,7]]},"1988":{"position":[[510,7],[988,6]]},"1990":{"position":[[356,8],[588,8]]},"2004":{"position":[[1117,8],[1685,7]]},"2106":{"position":[[438,6]]},"2114":{"position":[[352,6]]}}}],["enter",{"_index":60,"t":{"9":{"position":[[169,8]]},"36":{"position":[[1557,5]]},"81":{"position":[[169,8]]},"208":{"position":[[254,5]]},"665":{"position":[[2526,5]]},"1024":{"position":[[126,5]]},"1262":{"position":[[687,5]]}}}],["enterpris",{"_index":6485,"t":{"1962":{"position":[[4347,10]]},"1966":{"position":[[1476,10],[2702,10],[4305,10]]}}}],["entir",{"_index":4188,"t":{"947":{"position":[[328,6]]},"1184":{"position":[[39,6]]},"1592":{"position":[[501,6]]},"2043":{"position":[[937,8]]},"2162":{"position":[[397,6]]}}}],["entiti",{"_index":1312,"t":{"185":{"position":[[1448,7]]},"239":{"position":[[128,8]]},"292":{"position":[[449,8]]},"1973":{"position":[[381,6]]},"2009":{"position":[[357,6]]},"2013":{"position":[[1419,9]]}}}],["entri",{"_index":97,"t":{"14":{"position":[[320,8]]},"98":{"position":[[83,5]]},"453":{"position":[[1394,7]]},"632":{"position":[[554,7]]},"657":{"position":[[116,5]]},"1010":{"position":[[235,7],[1691,5]]},"1075":{"position":[[554,7]]},"1122":{"position":[[466,7]]},"1363":{"position":[[716,5]]},"1986":{"position":[[65,5]]},"1988":{"position":[[1299,5]]},"2004":{"position":[[1699,5]]},"2024":{"position":[[553,5]]},"2068":{"position":[[1188,5],[1589,5],[1987,5]]}}}],["entropi",{"_index":5577,"t":{"1488":{"position":[[241,7]]},"1553":{"position":[[494,7]]},"1555":{"position":[[13,7],[47,7],[321,7],[418,7],[501,7]]},"1822":{"position":[[0,7],[154,7]]},"1824":{"position":[[89,7],[161,7]]},"1826":{"position":[[233,7],[920,7],[1118,7],[1385,7]]},"1828":{"position":[[77,7],[296,7],[348,7],[592,7],[882,7],[980,7]]},"1830":{"position":[[33,7],[126,7]]},"1833":{"position":[[214,7]]},"1837":{"position":[[66,7]]},"2216":{"position":[[130,7]]}}}],["entrypoint",{"_index":3601,"t":{"746":{"position":[[3622,10]]},"2028":{"position":[[1715,12]]}}}],["enumer",{"_index":1832,"t":{"317":{"position":[[734,11]]},"1667":{"position":[[879,10]]}}}],["env",{"_index":247,"t":{"27":{"position":[[1486,3]]},"2096":{"position":[[757,3],[803,3]]}}}],["env.conf",{"_index":4431,"t":{"1034":{"position":[[3142,8]]}}}],["enventu",{"_index":1606,"t":{"249":{"position":[[194,11]]}}}],["enviro",{"_index":745,"t":{"124":{"position":[[115,11]]},"397":{"position":[[188,10]]}}}],["environ",{"_index":224,"t":{"27":{"position":[[1036,11],[1313,11],[1584,11]]},"36":{"position":[[893,13],[1410,11]]},"92":{"position":[[933,11]]},"100":{"position":[[786,11]]},"247":{"position":[[646,12]]},"286":{"position":[[485,12]]},"288":{"position":[[532,11]]},"292":{"position":[[608,12]]},"298":{"position":[[233,13],[365,12]]},"302":{"position":[[70,13]]},"319":{"position":[[2449,11]]},"360":{"position":[[76,11],[126,11],[160,12]]},"363":{"position":[[944,12],[1058,11],[1075,12]]},"367":{"position":[[91,11],[146,11]]},"416":{"position":[[92,11]]},"418":{"position":[[77,11],[1390,11]]},"420":{"position":[[45,11],[3906,11]]},"424":{"position":[[1377,11],[1429,12]]},"426":{"position":[[18,12],[51,11],[281,11],[391,11],[424,11],[574,11],[599,11],[635,11],[754,12]]},"432":{"position":[[24,11]]},"438":{"position":[[58,11],[525,11],[591,11]]},"440":{"position":[[10,11],[115,11],[224,12],[308,11]]},"472":{"position":[[2115,11]]},"474":{"position":[[99,12],[368,11],[3673,11]]},"476":{"position":[[124,13]]},"482":{"position":[[139,12]]},"486":{"position":[[249,11]]},"525":{"position":[[15,11]]},"531":{"position":[[33,13]]},"545":{"position":[[237,11]]},"575":{"position":[[58,12]]},"603":{"position":[[104,12],[196,12],[267,11],[490,12]]},"606":{"position":[[108,12]]},"610":{"position":[[1399,12]]},"618":{"position":[[78,11]]},"620":{"position":[[67,12],[210,12]]},"626":{"position":[[67,11]]},"697":{"position":[[27,11]]},"708":{"position":[[72,12],[622,11]]},"729":{"position":[[950,12]]},"737":{"position":[[194,11]]},"758":{"position":[[372,12],[628,12]]},"767":{"position":[[1852,11],[2273,11]]},"775":{"position":[[114,11]]},"787":{"position":[[618,11],[645,12],[3292,11]]},"816":{"position":[[371,13]]},"827":{"position":[[240,13]]},"843":{"position":[[108,13],[148,11],[177,11]]},"850":{"position":[[492,13]]},"860":{"position":[[713,12],[3015,12]]},"863":{"position":[[22,12]]},"869":{"position":[[5,11],[432,11]]},"877":{"position":[[170,12]]},"933":{"position":[[210,11]]},"941":{"position":[[642,12]]},"1012":{"position":[[267,11]]},"1014":{"position":[[285,11]]},"1020":{"position":[[83,11]]},"1051":{"position":[[108,12]]},"1055":{"position":[[1399,12]]},"1061":{"position":[[78,11]]},"1063":{"position":[[67,12],[210,12]]},"1069":{"position":[[67,11]]},"1103":{"position":[[116,13]]},"1174":{"position":[[1616,12]]},"1195":{"position":[[163,12]]},"1207":{"position":[[4374,11]]},"1332":{"position":[[181,12]]},"1353":{"position":[[350,11]]},"1365":{"position":[[304,12],[679,12]]},"1413":{"position":[[240,13]]},"1441":{"position":[[120,11]]},"1471":{"position":[[738,13]]},"1520":{"position":[[174,11]]},"1539":{"position":[[177,11]]},"1541":{"position":[[65,11],[289,11],[488,11],[750,13]]},"1545":{"position":[[294,11]]},"1555":{"position":[[520,13]]},"1559":{"position":[[103,13]]},"1561":{"position":[[112,12]]},"1563":{"position":[[103,13],[496,13]]},"1569":{"position":[[296,12]]},"1573":{"position":[[163,12]]},"1628":{"position":[[290,12]]},"1630":{"position":[[150,12]]},"1659":{"position":[[29,11],[483,11]]},"1680":{"position":[[13,12]]},"1710":{"position":[[388,12]]},"1717":{"position":[[13,12]]},"1735":{"position":[[388,12],[504,11]]},"1762":{"position":[[13,12]]},"1778":{"position":[[473,12],[589,11]]},"1841":{"position":[[13,12]]},"1879":{"position":[[372,12],[449,12],[473,13]]},"1956":{"position":[[208,12]]},"1962":{"position":[[2171,12],[3533,12],[4750,12]]},"1966":{"position":[[1755,13]]},"1975":{"position":[[16,12]]},"1981":{"position":[[179,12]]},"1984":{"position":[[387,12]]},"1986":{"position":[[494,11]]},"1988":{"position":[[91,12]]},"1990":{"position":[[76,12],[133,11],[394,13]]},"1992":{"position":[[107,12]]},"1994":{"position":[[28,11],[111,12]]},"1996":{"position":[[333,13]]},"1998":{"position":[[53,11],[279,13],[392,12],[526,12],[1355,13],[1436,13],[1662,12],[1731,11],[1884,12]]},"2000":{"position":[[71,13],[182,13]]},"2002":{"position":[[458,12],[768,11],[833,12]]},"2004":{"position":[[164,11],[275,11],[764,12],[1095,13],[1327,13],[1535,11],[1608,13],[1783,11]]},"2011":{"position":[[356,11]]},"2015":{"position":[[205,12]]},"2026":{"position":[[850,12]]},"2068":{"position":[[816,12]]},"2077":{"position":[[169,12]]},"2155":{"position":[[335,13]]},"2157":{"position":[[112,12]]}}}],["environment.tfvar",{"_index":2058,"t":{"343":{"position":[[42,18],[115,18]]},"470":{"position":[[1534,18]]},"1439":{"position":[[124,18]]}}}],["environment.tfvars.j2",{"_index":2035,"t":{"335":{"position":[[527,21]]}}}],["environment=.servic",{"_index":4327,"t":{"1014":{"position":[[1811,11]]},"1016":{"position":[[554,11]]}}}],["id_rsa.neutron",{"_index":5490,"t":{"1407":{"position":[[197,14]]}}}],["id_rsa.oper",{"_index":3733,"t":{"767":{"position":[[2901,16],[3102,15]]}}}],["idea",{"_index":2134,"t":{"352":{"position":[[2278,4]]},"470":{"position":[[4466,4]]},"1207":{"position":[[4111,4]]},"1958":{"position":[[496,4]]},"1977":{"position":[[2535,4]]},"2024":{"position":[[479,4]]}}}],["ideal",{"_index":2393,"t":{"422":{"position":[[796,7]]},"468":{"position":[[1025,8]]},"601":{"position":[[141,5]]},"1280":{"position":[[1444,7]]},"1590":{"position":[[930,7]]},"1669":{"position":[[121,5]]},"1964":{"position":[[786,7],[849,6]]}}}],["idempot",{"_index":2502,"t":{"457":{"position":[[3572,10]]},"480":{"position":[[1023,10]]},"500":{"position":[[516,10]]},"836":{"position":[[1756,10]]}}}],["iden",{"_index":6708,"t":{"2077":{"position":[[2756,7]]}}}],["ident",{"_index":421,"t":{"66":{"position":[[0,8]]},"239":{"position":[[95,10],[435,8]]},"241":{"position":[[137,8]]},"247":{"position":[[28,11],[64,10]]},"251":{"position":[[235,10]]},"274":{"position":[[117,8]]},"571":{"position":[[26,8]]},"585":{"position":[[16,8]]},"691":{"position":[[529,8]]},"767":{"position":[[2962,8]]},"787":{"position":[[1234,9]]},"802":{"position":[[2057,8],[2114,8],[2797,8],[2854,8]]},"823":{"position":[[220,8],[241,8]]},"1260":{"position":[[164,8]]},"1262":{"position":[[1007,8],[4209,8]]},"1314":{"position":[[221,8]]},"1400":{"position":[[414,8],[442,10]]},"1471":{"position":[[36,8]]},"1565":{"position":[[27,8],[222,9],[442,8]]},"1567":{"position":[[69,8],[389,8],[507,11],[556,8]]},"1592":{"position":[[451,8]]},"1665":{"position":[[1249,8]]},"1786":{"position":[[1268,10]]},"1964":{"position":[[704,10],[749,10],[813,8],[3284,10]]},"2022":{"position":[[615,10],[945,8],[1097,10],[1197,11]]},"2024":{"position":[[447,8],[658,11]]},"2026":{"position":[[25,8]]},"2028":{"position":[[1047,9],[1163,8],[1365,8],[1939,9],[3942,8],[4131,8],[4174,8],[5265,10]]},"2039":{"position":[[275,8]]},"2041":{"position":[[372,8]]},"2043":{"position":[[812,11]]},"2068":{"position":[[1916,8]]},"2077":{"position":[[2801,8],[3069,8]]},"2094":{"position":[[2812,9]]},"2216":{"position":[[266,8]]}}}],["identif",{"_index":6766,"t":{"2106":{"position":[[355,14]]}}}],["identifi",{"_index":120,"t":{"18":{"position":[[184,10]]},"25":{"position":[[148,10]]},"27":{"position":[[7,10]]},"30":{"position":[[7,10]]},"32":{"position":[[7,10]]},"288":{"position":[[42,8]]},"653":{"position":[[31,10],[63,10]]},"850":{"position":[[659,8]]},"1010":{"position":[[1626,13]]},"1355":{"position":[[732,11]]},"1575":{"position":[[171,10]]},"1594":{"position":[[654,10]]},"1988":{"position":[[1471,9]]},"2022":{"position":[[129,11]]},"2106":{"position":[[498,11],[572,11],[587,8]]},"2110":{"position":[[221,8]]},"2116":{"position":[[11,11]]},"2122":{"position":[[107,10],[324,11]]},"2124":{"position":[[143,11],[317,10]]}}}],["identit",{"_index":6614,"t":{"2022":{"position":[[1171,10]]},"2024":{"position":[[563,10]]}}}],["identitiesonly=y",{"_index":3728,"t":{"767":{"position":[[1954,19],[3080,18]]}}}],["identity.authent",{"_index":5200,"t":{"1298":{"position":[[6011,21]]}}}],["identity.endpoint",{"_index":5185,"t":{"1298":{"position":[[5524,22]]}}}],["identity.group",{"_index":5179,"t":{"1298":{"position":[[5413,19]]}}}],["identity.o",{"_index":5181,"t":{"1298":{"position":[[5452,12]]}}}],["identity.polici",{"_index":5186,"t":{"1298":{"position":[[5547,20]]}}}],["identity.project",{"_index":5178,"t":{"1298":{"position":[[5391,21]]}}}],["identity.region",{"_index":5183,"t":{"1298":{"position":[[5481,20]]}}}],["identity.rol",{"_index":5180,"t":{"1298":{"position":[[5433,18]]}}}],["identity.role_assign",{"_index":5193,"t":{"1298":{"position":[[5789,26]]}}}],["identity.servic",{"_index":5184,"t":{"1298":{"position":[[5502,21]]}}}],["identity.us",{"_index":5177,"t":{"1298":{"position":[[5372,18]]}}}],["identity:add_user_to_group",{"_index":3680,"t":{"749":{"position":[[6028,29]]},"2058":{"position":[[5670,29]]}}}],["identity:check_gr",{"_index":3665,"t":{"749":{"position":[[4323,23]]},"2058":{"position":[[3965,23]]}}}],["identity:check_user_in_group",{"_index":3679,"t":{"749":{"position":[[5853,31]]},"2058":{"position":[[5495,31]]}}}],["identity:create_gr",{"_index":3668,"t":{"749":{"position":[[4473,24]]},"2058":{"position":[[4115,24]]}}}],["identity:create_group",{"_index":3673,"t":{"749":{"position":[[5051,24]]},"2058":{"position":[[4693,24]]}}}],["identity:create_project",{"_index":3650,"t":{"749":{"position":[[2654,26]]},"2058":{"position":[[2319,26]]}}}],["identity:create_us",{"_index":3644,"t":{"749":{"position":[[1993,23]]},"2058":{"position":[[1658,23]]}}}],["identity:delete_group",{"_index":3675,"t":{"749":{"position":[[5295,24]]},"2058":{"position":[[4937,24]]}}}],["identity:delete_project",{"_index":3652,"t":{"749":{"position":[[2906,26]]},"2058":{"position":[[2571,26]]}}}],["identity:delete_us",{"_index":3646,"t":{"749":{"position":[[2233,23]]},"2058":{"position":[[1898,23]]}}}],["identity:get_domain",{"_index":3623,"t":{"749":{"position":[[812,22]]},"2058":{"position":[[477,22]]}}}],["identity:get_group",{"_index":3672,"t":{"749":{"position":[[4932,21]]},"2058":{"position":[[4574,21]]}}}],["identity:get_project",{"_index":3648,"t":{"749":{"position":[[2531,23]]},"2058":{"position":[[2196,23]]}}}],["identity:get_rol",{"_index":3638,"t":{"749":{"position":[[1601,20]]},"2058":{"position":[[1266,20]]}}}],["identity:get_us",{"_index":3642,"t":{"749":{"position":[[1876,20]]},"2058":{"position":[[1541,20]]}}}],["identity:list_domain",{"_index":3630,"t":{"749":{"position":[[1114,24]]},"2054":{"position":[[94,23]]},"2058":{"position":[[779,24]]}}}],["identity:list_gr",{"_index":3667,"t":{"749":{"position":[[4398,23]]},"2058":{"position":[[4040,23]]}}}],["identity:list_group",{"_index":3671,"t":{"749":{"position":[[4811,23]]},"2058":{"position":[[4453,23]]}}}],["identity:list_groups_for_us",{"_index":3676,"t":{"749":{"position":[[5417,32]]},"2058":{"position":[[5059,32]]}}}],["identity:list_project",{"_index":3647,"t":{"749":{"position":[[2414,25]]},"2058":{"position":[[2079,25]]}}}],["identity:list_rol",{"_index":3634,"t":{"749":{"position":[[1347,22]]},"2054":{"position":[[302,21]]},"2058":{"position":[[1012,22]]}}}],["identity:list_role_assign",{"_index":3670,"t":{"749":{"position":[[4625,33]]},"2058":{"position":[[4267,33]]}}}],["identity:list_us",{"_index":3640,"t":{"749":{"position":[[1762,22]]},"2058":{"position":[[1427,22]]}}}],["identity:list_user_project",{"_index":3653,"t":{"749":{"position":[[3032,30]]},"2058":{"position":[[2697,30]]}}}],["identity:list_users_in_group",{"_index":3677,"t":{"749":{"position":[[5546,31]]},"2058":{"position":[[5188,31]]}}}],["identity:remove_user_from_group",{"_index":3678,"t":{"749":{"position":[[5675,34]]},"2058":{"position":[[5317,34]]}}}],["identity:revoke_gr",{"_index":3669,"t":{"749":{"position":[[4549,24]]},"2058":{"position":[[4191,24]]}}}],["identity:update_group",{"_index":3674,"t":{"749":{"position":[[5173,24]]},"2058":{"position":[[4815,24]]}}}],["identity:update_project",{"_index":3651,"t":{"749":{"position":[[2780,26]]},"2058":{"position":[[2445,26]]}}}],["identity:update_us",{"_index":3645,"t":{"749":{"position":[[2113,23]]},"2058":{"position":[[1778,23]]}}}],["identity_api_vers",{"_index":2755,"t":{"476":{"position":[[549,21]]}}}],["identity_authent",{"_index":5201,"t":{"1298":{"position":[[6041,22]]}}}],["identity_crud",{"_index":5187,"t":{"1298":{"position":[[5578,14]]}}}],["identity_role_assign",{"_index":5194,"t":{"1298":{"position":[[5824,25]]}}}],["identityfil",{"_index":3326,"t":{"689":{"position":[[236,12],[389,12],[542,12],[695,12]]},"869":{"position":[[1558,12]]}}}],["idm",{"_index":6495,"t":{"1964":{"position":[[958,4]]}}}],["idp",{"_index":1568,"t":{"239":{"position":[[453,5]]},"245":{"position":[[195,4]]},"247":{"position":[[321,3],[336,3]]},"249":{"position":[[580,3]]},"251":{"position":[[92,3]]},"253":{"position":[[168,3]]},"1567":{"position":[[574,5]]},"1964":{"position":[[839,4]]},"2022":{"position":[[1495,3]]},"2024":{"position":[[465,6],[502,3],[752,3]]},"2026":{"position":[[48,3],[433,3],[578,3]]},"2028":{"position":[[38,3],[1096,3],[1127,5],[1357,4],[1767,3],[1908,4],[2208,3],[2827,3],[3132,4],[4365,3],[6144,3],[6216,4]]},"2032":{"position":[[28,3],[276,3],[989,3]]}}}],["ietf",{"_index":5683,"t":{"1588":{"position":[[189,4]]}}}],["iff",{"_index":1616,"t":{"251":{"position":[[619,3]]}}}],["ignor",{"_index":958,"t":{"162":{"position":[[282,6]]},"420":{"position":[[585,8]]},"704":{"position":[[208,8]]},"724":{"position":[[299,8],[1478,8]]},"767":{"position":[[2061,7]]},"1262":{"position":[[3458,6]]},"1649":{"position":[[220,6]]},"2051":{"position":[[522,6]]}}}],["igz2wu47r9mey4fjetbxsaugnaz4hr1mjk9lclq3hsumjhgj9yplb2mvnpqw1lcjsvpak",{"_index":1906,"t":{"319":{"position":[[4424,69]]}}}],["ikepolici",{"_index":5245,"t":{"1298":{"position":[[7735,14],[9354,11]]}}}],["illeg",{"_index":5903,"t":{"1696":{"position":[[797,8]]},"1743":{"position":[[933,8]]},"1784":{"position":[[946,8]]}}}],["illustr",{"_index":5003,"t":{"1268":{"position":[[0,12],[195,12]]}}}],["imag",{"_index":638,"t":{"100":{"position":[[158,5]]},"195":{"position":[[603,7]]},"247":{"position":[[758,5]]},"300":{"position":[[681,7]]},"343":{"position":[[198,5],[240,5],[275,5],[381,5]]},"377":{"position":[[52,5],[78,5],[204,5]]},"416":{"position":[[294,5],[317,5],[475,5]]},"420":{"position":[[790,5],[817,5],[878,5],[1014,6],[1177,5]]},"422":{"position":[[1203,5]]},"432":{"position":[[171,6]]},"457":{"position":[[439,5],[6216,5]]},"462":{"position":[[280,5],[363,6],[3092,5],[3140,5],[3764,5],[3813,5]]},"470":{"position":[[1722,6],[1832,5],[3069,7]]},"472":{"position":[[2534,6]]},"480":{"position":[[613,5]]},"484":{"position":[[775,6]]},"571":{"position":[[44,5]]},"587":{"position":[[14,5],[92,6],[125,6],[326,7],[459,6]]},"618":{"position":[[14,5],[55,6]]},"620":{"position":[[135,5]]},"622":{"position":[[14,5],[147,6],[339,6],[1005,5],[1078,5]]},"626":{"position":[[43,5],[110,5],[147,5],[202,5],[225,5],[297,7],[309,7],[914,5],[1019,5],[1073,6],[1080,7]]},"628":{"position":[[116,6]]},"630":{"position":[[74,6],[178,6],[237,5],[295,6],[347,5],[401,6]]},"632":{"position":[[13,5],[42,6],[153,7],[213,5],[305,6],[347,5],[469,5],[562,7],[1114,7],[1315,5],[1368,6],[1406,5],[1449,5],[1499,5]]},"634":{"position":[[13,5],[42,6],[117,7],[174,5],[274,5],[366,6],[404,5],[463,5],[543,7],[558,7],[1153,7],[1340,6]]},"636":{"position":[[0,5],[158,5],[243,5],[255,5],[350,5],[413,6],[440,5],[482,5]]},"639":{"position":[[42,6],[89,6],[165,6]]},"641":{"position":[[12,6],[201,6]]},"708":{"position":[[326,5]]},"735":{"position":[[253,5]]},"758":{"position":[[765,6]]},"763":{"position":[[391,5],[1861,5]]},"767":{"position":[[399,5]]},"778":{"position":[[823,5]]},"791":{"position":[[336,5]]},"816":{"position":[[927,6]]},"831":{"position":[[241,7]]},"834":{"position":[[4,6],[315,6],[588,6]]},"843":{"position":[[319,5]]},"845":{"position":[[14,5],[46,7],[87,5],[141,6],[186,6],[229,5]]},"852":{"position":[[667,5]]},"854":{"position":[[148,6]]},"858":{"position":[[420,5],[502,6],[554,5],[612,6],[733,5]]},"860":{"position":[[136,6],[233,5],[327,6]]},"1061":{"position":[[14,5],[55,6]]},"1063":{"position":[[135,5]]},"1065":{"position":[[14,5],[147,6],[339,6],[1005,5],[1078,5]]},"1069":{"position":[[43,5],[110,5],[147,5],[202,5],[225,5],[297,7],[309,7],[914,5],[1019,5],[1073,6],[1080,7]]},"1071":{"position":[[116,6]]},"1073":{"position":[[74,6],[178,6],[237,5],[295,6],[347,5],[401,6]]},"1075":{"position":[[13,5],[42,6],[153,7],[213,5],[305,6],[347,5],[469,5],[562,7],[1114,7],[1315,5],[1368,6],[1406,5],[1449,5],[1499,5]]},"1077":{"position":[[13,5],[42,6],[117,7],[174,5],[274,5],[366,6],[404,5],[463,5],[543,7],[558,7],[1153,7],[1340,6]]},"1079":{"position":[[0,5],[158,5],[243,5],[255,5],[350,5],[413,6],[440,5],[482,5]]},"1082":{"position":[[42,6],[89,6],[165,6]]},"1084":{"position":[[12,6],[201,6]]},"1099":{"position":[[105,6],[693,5],[734,5],[787,5]]},"1101":{"position":[[33,5],[62,6],[235,6],[337,6],[372,7]]},"1103":{"position":[[34,6]]},"1105":{"position":[[530,7]]},"1107":{"position":[[14,5]]},"1109":{"position":[[28,5]]},"1116":{"position":[[576,5],[611,5],[654,5],[690,6],[740,6],[771,6],[989,6],[1090,7],[1186,5],[1280,5],[1501,5],[1551,5],[1586,5],[1622,5]]},"1130":{"position":[[389,6]]},"1168":{"position":[[609,6],[1493,6],[1504,5]]},"1170":{"position":[[774,6],[839,7]]},"1189":{"position":[[29,6]]},"1353":{"position":[[137,5]]},"1363":{"position":[[847,5]]},"1365":{"position":[[617,5],[630,5]]},"1368":{"position":[[14,5],[98,6],[135,5]]},"1381":{"position":[[96,6]]},"1402":{"position":[[1292,7]]},"1417":{"position":[[683,5],[943,5]]},"1436":{"position":[[793,7]]},"1443":{"position":[[19,6]]},"1447":{"position":[[92,6]]},"1451":{"position":[[683,5]]},"1467":{"position":[[368,6]]},"1488":{"position":[[278,5],[304,5],[344,7]]},"1553":{"position":[[535,5]]},"1555":{"position":[[269,7]]},"1557":{"position":[[13,5],[117,6],[226,5],[387,6]]},"1563":{"position":[[65,6],[165,6],[261,5]]},"1640":{"position":[[184,5]]},"1642":{"position":[[636,5],[742,5],[808,5],[849,5]]},"1671":{"position":[[240,7],[286,6]]},"1692":{"position":[[280,5],[815,7],[1095,6],[1480,5]]},"1704":{"position":[[1598,5]]},"1708":{"position":[[1459,5]]},"1729":{"position":[[352,5],[887,7],[1167,6],[1686,5]]},"1731":{"position":[[1620,5]]},"1751":{"position":[[1463,5],[1494,5]]},"1774":{"position":[[352,5],[1028,7],[1308,6],[1827,5]]},"1786":{"position":[[235,5]]},"1792":{"position":[[1486,5],[1517,5]]},"1801":{"position":[[44,6],[214,7],[253,6],[420,6]]},"1803":{"position":[[18,5],[90,5]]},"1805":{"position":[[20,6],[399,6]]},"1807":{"position":[[45,6],[65,7],[80,6],[165,5]]},"1810":{"position":[[40,6],[107,5],[148,5],[292,5],[307,5],[376,5],[745,5],[815,5],[876,5],[938,5],[997,5],[1054,5],[1117,5],[1176,5],[1300,6],[1375,5],[1602,5],[1772,6],[1808,5],[1909,7],[2196,6],[2319,7],[2424,5],[2777,5],[2935,6],[3047,5],[3220,5],[3550,5],[3699,6],[3983,6],[4014,5],[4316,5],[4476,5],[4594,6],[4761,6]]},"1812":{"position":[[77,5],[170,5],[324,6],[385,6],[505,6],[658,5],[755,5],[826,7],[901,7]]},"1814":{"position":[[201,5],[599,5],[982,5],[1015,5],[1179,5]]},"1816":{"position":[[5,6],[314,6],[342,6],[437,6],[695,6],[730,6],[1062,6],[1130,5],[1332,5],[1864,6],[1963,5]]},"1818":{"position":[[11,5],[43,5],[94,5]]},"1826":{"position":[[1473,7]]},"1835":{"position":[[25,6],[137,5],[158,5],[206,6]]},"1853":{"position":[[1154,5]]},"1862":{"position":[[302,7],[326,6]]},"1864":{"position":[[208,7]]},"1866":{"position":[[0,5],[141,6]]},"1868":{"position":[[35,7]]},"1870":{"position":[[53,5],[388,5],[417,5],[505,5]]},"1872":{"position":[[62,6],[142,5],[515,5],[610,5]]},"1874":{"position":[[0,7],[169,6],[202,5]]},"1879":{"position":[[65,7],[151,7],[349,6],[430,6],[551,7]]},"1881":{"position":[[11,6],[80,6],[199,6],[227,6],[322,7],[344,6]]},"1883":{"position":[[14,5],[74,6],[95,5]]},"1904":{"position":[[809,5]]},"1915":{"position":[[599,5]]},"1926":{"position":[[695,5],[810,6]]},"1956":{"position":[[92,7],[100,6]]},"1964":{"position":[[1209,6],[1252,5],[1288,5],[1812,6],[2017,6],[2249,5],[2337,5],[2717,5],[3547,6],[4988,6]]},"1966":{"position":[[3188,5],[3473,6],[4770,5],[5057,6]]},"1998":{"position":[[892,7],[1002,6]]},"2214":{"position":[[254,5]]},"2216":{"position":[[214,6]]}}}],["image(",{"_index":4654,"t":{"1099":{"position":[[555,8]]}}}],["image.cr",{"_index":5138,"t":{"1298":{"position":[[3829,16]]}}}],["image.delet",{"_index":5141,"t":{"1298":{"position":[[3878,15]]}}}],["image.send",{"_index":5145,"t":{"1298":{"position":[[4229,10]]}}}],["image.upd",{"_index":5139,"t":{"1298":{"position":[[3846,15]]}}}],["image.upload",{"_index":5140,"t":{"1298":{"position":[[3862,15]]}}}],["image/flavor",{"_index":6266,"t":{"1816":{"position":[[1985,12]]}}}],["image_build_d",{"_index":3107,"t":{"630":{"position":[[256,16]]},"1073":{"position":[[256,16]]},"1814":{"position":[[11,16],[868,16]]}}}],["image_convers",{"_index":3073,"t":{"622":{"position":[[1212,19],[1232,18]]},"1065":{"position":[[1212,19],[1232,18]]}}}],["image_decompress",{"_index":3072,"t":{"622":{"position":[[1188,23]]},"1065":{"position":[[1188,23]]}}}],["image_descript",{"_index":3106,"t":{"630":{"position":[[84,17],[134,17]]},"1073":{"position":[[84,17],[134,17]]},"1812":{"position":[[218,17],[436,17]]}}}],["image_id",{"_index":5110,"t":{"1298":{"position":[[2148,9],[3753,9],[4396,9]]}}}],["image_import_opt",{"_index":3070,"t":{"622":{"position":[[1145,19]]},"1065":{"position":[[1145,19]]}}}],["image_import_plugin",{"_index":3071,"t":{"622":{"position":[[1165,20]]},"1065":{"position":[[1165,20]]}}}],["image_nod",{"_index":3755,"t":{"778":{"position":[[846,10]]}}}],["image_original_us",{"_index":3105,"t":{"630":{"position":[[32,19]]},"1073":{"position":[[32,19]]},"1814":{"position":[[503,19]]}}}],["image_registration_extra_flag",{"_index":2302,"t":{"420":{"position":[[1073,30]]}}}],["image_sourc",{"_index":3108,"t":{"630":{"position":[[366,12]]},"1073":{"position":[[366,12]]},"1812":{"position":[[11,12],[581,12]]},"1870":{"position":[[462,12]]},"1872":{"position":[[685,12]]},"1881":{"position":[[357,12]]}}}],["image_volume_cach",{"_index":5136,"t":{"1298":{"position":[[3720,24]]}}}],["images(",{"_index":4656,"t":{"1099":{"position":[[656,9]]}}}],["images.ubuntu.com/foc",{"_index":6347,"t":{"1874":{"position":[[489,24]]}}}],["images.ubuntu.com/jammi",{"_index":6343,"t":{"1874":{"position":[[105,24]]}}}],["images.ubuntu.com/releases/foc",{"_index":6346,"t":{"1874":{"position":[[439,33]]}}}],["images.ubuntu.com/releases/jammi",{"_index":6342,"t":{"1874":{"position":[[55,33]]}}}],["images.ubuntu.com/xenial/20180928/xeni",{"_index":3120,"t":{"632":{"position":[[886,40]]},"1075":{"position":[[886,40]]}}}],["images.ubuntu.com/xenial/20181004/xeni",{"_index":3125,"t":{"632":{"position":[[1000,40]]},"1075":{"position":[[1000,40]]}}}],["images.yml",{"_index":4706,"t":{"1116":{"position":[[794,10]]}}}],["images/pull/34/fil",{"_index":4665,"t":{"1101":{"position":[[175,21]]}}}],["images/ubuntu",{"_index":6345,"t":{"1874":{"position":[[348,13]]}}}],["imagin",{"_index":6024,"t":{"1704":{"position":[[735,7]]},"1731":{"position":[[757,7]]},"1853":{"position":[[232,7]]}}}],["img",{"_index":6243,"t":{"1812":{"position":[[716,4]]}}}],["imguuid",{"_index":6031,"t":{"1704":{"position":[[1604,7]]},"1731":{"position":[[1626,7]]},"1853":{"position":[[1160,7]]}}}],["imho",{"_index":6729,"t":{"2094":{"position":[[1492,5]]}}}],["immatur",{"_index":1320,"t":{"185":{"position":[[2015,8]]}}}],["immedi",{"_index":4240,"t":{"983":{"position":[[122,12]]},"987":{"position":[[54,11]]}}}],["immut",{"_index":2513,"t":{"457":{"position":[[5158,9]]},"474":{"position":[[3943,9]]}}}],["impact",{"_index":6424,"t":{"1930":{"position":[[141,7]]},"2054":{"position":[[744,7]]},"2118":{"position":[[3,6],[180,7],[372,8],[401,6]]},"2120":{"position":[[22,8],[101,6],[173,8]]}}}],["implement",{"_index":29,"t":{"7":{"position":[[98,12]]},"70":{"position":[[112,14]]},"160":{"position":[[127,10]]},"181":{"position":[[830,15]]},"255":{"position":[[45,11]]},"262":{"position":[[48,14]]},"265":{"position":[[667,14]]},"280":{"position":[[4,11]]},"319":{"position":[[100,9],[1095,9],[1159,9]]},"325":{"position":[[1218,12]]},"329":{"position":[[1116,11]]},"420":{"position":[[4910,15],[5171,14]]},"472":{"position":[[79,14],[769,14]]},"533":{"position":[[10,14],[92,12]]},"535":{"position":[[24,14],[139,15]]},"549":{"position":[[71,15]]},"735":{"position":[[1111,14]]},"775":{"position":[[180,14]]},"831":{"position":[[454,11],[606,11]]},"1133":{"position":[[3,9]]},"1260":{"position":[[566,14]]},"1270":{"position":[[274,9],[390,9]]},"1272":{"position":[[46,16],[282,9],[353,14],[544,15]]},"1274":{"position":[[53,14],[159,9]]},"1278":{"position":[[53,14]]},"1280":{"position":[[5,12],[350,15],[800,14],[851,14],[1142,15]]},"1332":{"position":[[285,9]]},"1337":{"position":[[140,9]]},"1349":{"position":[[30,11]]},"1363":{"position":[[817,11]]},"1365":{"position":[[416,14],[763,14]]},"1368":{"position":[[836,13],[862,16],[1220,14]]},"1372":{"position":[[23,15]]},"1374":{"position":[[567,15]]},"1383":{"position":[[427,15],[726,14]]},"1389":{"position":[[43,15]]},"1402":{"position":[[294,14],[385,14]]},"1417":{"position":[[391,14],[777,14],[798,12]]},"1423":{"position":[[43,15]]},"1436":{"position":[[258,11]]},"1451":{"position":[[391,14],[777,14],[798,12]]},"1458":{"position":[[43,15]]},"1465":{"position":[[19,14]]},"1471":{"position":[[884,14]]},"1477":{"position":[[23,15]]},"1488":{"position":[[880,14]]},"1494":{"position":[[43,15]]},"1513":{"position":[[43,15]]},"1577":{"position":[[464,14]]},"1586":{"position":[[262,9]]},"1596":{"position":[[230,15]]},"1598":{"position":[[158,15]]},"1605":{"position":[[76,15]]},"1634":{"position":[[267,9]]},"1669":{"position":[[68,9],[544,14]]},"1688":{"position":[[178,11],[998,15]]},"1706":{"position":[[320,9],[379,10]]},"1725":{"position":[[270,11],[1136,15]]},"1733":{"position":[[320,9],[378,10]]},"1770":{"position":[[270,11],[1136,15],[1288,12]]},"1776":{"position":[[56,9],[114,10]]},"1859":{"position":[[497,12]]},"1886":{"position":[[405,14],[449,14],[680,14]]},"1888":{"position":[[330,15]]},"1891":{"position":[[2383,11],[2439,15],[4666,11],[4724,14]]},"1897":{"position":[[377,14]]},"1906":{"position":[[368,9]]},"1958":{"position":[[602,14],[752,14],[842,14]]},"1960":{"position":[[331,14],[507,15]]},"1964":{"position":[[87,15],[452,14],[1410,11],[3112,15]]},"1966":{"position":[[294,14],[970,15],[1420,14],[2234,11]]},"1968":{"position":[[107,14]]},"2024":{"position":[[756,14]]},"2026":{"position":[[545,15]]},"2028":{"position":[[51,11],[1499,14],[3107,14],[3143,11]]},"2030":{"position":[[13,9]]},"2032":{"position":[[57,15],[280,14],[689,14],[767,11]]},"2039":{"position":[[174,11]]},"2051":{"position":[[294,14],[821,11]]},"2061":{"position":[[313,9]]},"2077":{"position":[[751,15]]},"2092":{"position":[[312,14],[453,14]]},"2139":{"position":[[170,12],[1039,15],[1069,14]]},"2141":{"position":[[326,15]]},"2150":{"position":[[18,14],[164,14]]},"2152":{"position":[[16,14]]},"2155":{"position":[[81,12]]},"2164":{"position":[[437,14]]},"2168":{"position":[[49,11]]},"2170":{"position":[[184,12]]},"2198":{"position":[[227,16]]},"2200":{"position":[[132,14]]},"2202":{"position":[[279,9]]}}}],["implementor",{"_index":5713,"t":{"1596":{"position":[[271,12]]},"1600":{"position":[[235,12]]}}}],["impli",{"_index":5538,"t":{"1449":{"position":[[381,7]]},"1610":{"position":[[1110,7]]},"1917":{"position":[[164,7]]},"2094":{"position":[[312,7]]}}}],["implic",{"_index":1254,"t":{"181":{"position":[[592,13]]},"249":{"position":[[354,12]]}}}],["implicit",{"_index":3210,"t":{"659":{"position":[[692,8]]}}}],["import",{"_index":1636,"t":{"260":{"position":[[241,9]]},"311":{"position":[[483,9]]},"333":{"position":[[269,8],[520,8]]},"451":{"position":[[873,9]]},"622":{"position":[[330,8],[829,10],[1084,6]]},"708":{"position":[[719,9]]},"729":{"position":[[327,6],[373,6],[581,9],[1541,6]]},"735":{"position":[[307,9]]},"763":{"position":[[582,9],[1210,9]]},"767":{"position":[[590,9]]},"785":{"position":[[730,8]]},"845":{"position":[[96,9]]},"877":{"position":[[95,9]]},"1018":{"position":[[384,10]]},"1065":{"position":[[330,8],[829,10],[1084,6]]},"1105":{"position":[[387,9]]},"1107":{"position":[[244,9]]},"1195":{"position":[[95,9]]},"1209":{"position":[[517,9]]},"1486":{"position":[[50,9]]},"1680":{"position":[[684,9],[852,9]]},"1683":{"position":[[45,9]]},"1717":{"position":[[684,9],[852,9]]},"1720":{"position":[[105,9]]},"1762":{"position":[[583,9],[751,9]]},"1765":{"position":[[105,9]]},"1830":{"position":[[64,9]]},"1879":{"position":[[6,9]]},"1910":{"position":[[4,9]]},"1917":{"position":[[262,9],[843,9]]},"1934":{"position":[[89,9]]},"1964":{"position":[[1490,9]]},"1966":{"position":[[364,9]]},"1977":{"position":[[1536,9]]},"1979":{"position":[[40,9]]},"1998":{"position":[[79,9]]},"2011":{"position":[[498,9]]},"2013":{"position":[[1005,9]]},"2135":{"position":[[381,9]]},"2164":{"position":[[383,9]]}}}],["impos",{"_index":6333,"t":{"1866":{"position":[[55,7]]},"1988":{"position":[[1127,6]]},"2054":{"position":[[40,7]]},"2068":{"position":[[1000,7]]}}}],["imposs",{"_index":4215,"t":{"960":{"position":[[908,10]]},"1891":{"position":[[4300,11]]},"2051":{"position":[[657,11]]}}}],["impress",{"_index":2021,"t":{"331":{"position":[[395,10]]},"1966":{"position":[[3058,10],[4576,11]]},"2004":{"position":[[533,10]]}}}],["improv",{"_index":1126,"t":{"175":{"position":[[898,10]]},"183":{"position":[[242,7],[271,12],[740,7]]},"274":{"position":[[158,8]]},"276":{"position":[[27,12]]},"278":{"position":[[83,9]]},"424":{"position":[[1354,8]]},"470":{"position":[[3577,13]]},"495":{"position":[[287,9]]},"567":{"position":[[115,8]]},"1314":{"position":[[155,7]]},"1349":{"position":[[623,8]]},"1368":{"position":[[42,12]]},"1395":{"position":[[99,9]]},"1397":{"position":[[269,13]]},"1402":{"position":[[878,12]]},"1417":{"position":[[902,13]]},"1429":{"position":[[43,12]]},"1434":{"position":[[261,9],[697,12],[1109,12]]},"1436":{"position":[[226,12]]},"1439":{"position":[[372,13]]},"1471":{"position":[[12,12],[204,12],[847,8]]},"1617":{"position":[[184,7]]},"1826":{"position":[[1320,8]]},"1919":{"position":[[88,13]]},"1962":{"position":[[721,12],[5021,8]]},"1964":{"position":[[2635,7],[2697,9]]},"1966":{"position":[[2034,8],[2806,12]]},"1988":{"position":[[1744,7]]},"2028":{"position":[[2648,9]]}}}],["inabl",{"_index":6571,"t":{"1996":{"position":[[282,9]]}}}],["inaccess",{"_index":3007,"t":{"583":{"position":[[301,13]]}}}],["inaccur",{"_index":6774,"t":{"2131":{"position":[[276,10]]},"2160":{"position":[[276,10]]}}}],["inact",{"_index":1615,"t":{"251":{"position":[[563,10]]},"325":{"position":[[252,8]]},"329":{"position":[[596,8],[755,8]]}}}],["inadvert",{"_index":1179,"t":{"177":{"position":[[941,13]]}}}],["inappropri",{"_index":6673,"t":{"2061":{"position":[[296,13]]}}}],["inbound",{"_index":1181,"t":{"177":{"position":[[1056,7]]}}}],["inc_alloc",{"_index":4577,"t":{"1038":{"position":[[1164,10]]}}}],["incertitud",{"_index":6268,"t":{"1822":{"position":[[260,11]]},"1826":{"position":[[47,11]]}}}],["incid",{"_index":5005,"t":{"1270":{"position":[[229,9]]},"1280":{"position":[[577,10]]},"1665":{"position":[[1143,8]]},"2094":{"position":[[2862,8],[3157,9]]},"2114":{"position":[[27,8]]},"2118":{"position":[[42,8],[108,9],[125,8],[231,8],[344,8],[431,8]]},"2120":{"position":[[81,8]]},"2139":{"position":[[283,8]]}}}],["incl",{"_index":2240,"t":{"416":{"position":[[537,5]]}}}],["includ",{"_index":1002,"t":{"166":{"position":[[1040,10],[1094,9]]},"175":{"position":[[323,8],[722,9],[1093,9]]},"181":{"position":[[469,8],[1302,10]]},"206":{"position":[[121,7]]},"251":{"position":[[110,7]]},"265":{"position":[[128,9]]},"280":{"position":[[107,8]]},"288":{"position":[[381,7]]},"292":{"position":[[420,8]]},"300":{"position":[[750,7]]},"325":{"position":[[1043,8]]},"345":{"position":[[307,9]]},"358":{"position":[[64,8]]},"363":{"position":[[90,8]]},"418":{"position":[[1097,9]]},"440":{"position":[[242,8]]},"447":{"position":[[642,8]]},"453":{"position":[[321,9]]},"474":{"position":[[697,8],[3923,8]]},"491":{"position":[[975,9]]},"569":{"position":[[265,8]]},"571":{"position":[[191,8]]},"593":{"position":[[222,7]]},"691":{"position":[[82,9]]},"729":{"position":[[722,8]]},"775":{"position":[[586,8]]},"831":{"position":[[153,8]]},"1018":{"position":[[95,9]]},"1103":{"position":[[12,8]]},"1105":{"position":[[494,8]]},"1112":{"position":[[204,8],[534,8]]},"1165":{"position":[[192,8]]},"1170":{"position":[[139,8]]},"1174":{"position":[[947,8]]},"1308":{"position":[[278,8]]},"1329":{"position":[[269,7],[346,7]]},"1349":{"position":[[690,8]]},"1363":{"position":[[490,8]]},"1379":{"position":[[439,8]]},"1447":{"position":[[28,8]]},"1471":{"position":[[81,9]]},"1488":{"position":[[165,9],[204,8]]},"1557":{"position":[[251,9]]},"1573":{"position":[[181,8]]},"1610":{"position":[[1037,7]]},"1667":{"position":[[944,9],[1757,8]]},"1805":{"position":[[247,7],[409,7]]},"1810":{"position":[[209,8],[2919,8]]},"1814":{"position":[[185,8],[383,8]]},"1816":{"position":[[65,7],[652,8],[1289,9],[1969,8]]},"1826":{"position":[[241,7],[647,8]]},"1853":{"position":[[536,8]]},"1886":{"position":[[425,7],[806,7]]},"1888":{"position":[[46,7]]},"1904":{"position":[[793,10]]},"1915":{"position":[[59,9],[583,10]]},"1917":{"position":[[240,7]]},"1962":{"position":[[3729,8]]},"1986":{"position":[[138,9]]},"2000":{"position":[[129,9]]},"2051":{"position":[[1129,9]]},"2058":{"position":[[6823,7]]},"2068":{"position":[[404,8]]},"2106":{"position":[[301,7],[802,7]]},"2114":{"position":[[324,7],[429,7]]},"2122":{"position":[[372,7]]},"2128":{"position":[[22,7]]},"2212":{"position":[[417,7]]}}}],["include_task",{"_index":4475,"t":{"1034":{"position":[[4951,13],[4976,13],[5198,13],[5223,13]]}}}],["inclus",{"_index":1778,"t":{"300":{"position":[[898,9]]},"1659":{"position":[[463,9]]}}}],["incom",{"_index":6727,"t":{"2094":{"position":[[1252,8]]}}}],["incompat",{"_index":5804,"t":{"1678":{"position":[[151,12]]},"1715":{"position":[[151,12]]},"1760":{"position":[[151,12]]}}}],["incomplet",{"_index":6137,"t":{"1751":{"position":[[465,12]]},"1792":{"position":[[465,12]]}}}],["inconsist",{"_index":2623,"t":{"468":{"position":[[1250,12],[1284,12]]},"1891":{"position":[[4510,12]]}}}],["incorpor",{"_index":5409,"t":{"1355":{"position":[[974,12]]},"1622":{"position":[[774,12]]},"1977":{"position":[[1074,12]]}}}],["incorrect",{"_index":6329,"t":{"1855":{"position":[[369,9]]}}}],["increas",{"_index":1314,"t":{"185":{"position":[[1560,10]]},"278":{"position":[[36,8]]},"358":{"position":[[2018,8]]},"457":{"position":[[8293,8]]},"462":{"position":[[631,8],[2882,8],[3554,8]]},"468":{"position":[[839,8]]},"470":{"position":[[3123,8]]},"474":{"position":[[3438,8]]},"478":{"position":[[510,8]]},"567":{"position":[[227,9]]},"732":{"position":[[272,9]]},"945":{"position":[[215,8]]},"1003":{"position":[[172,8]]},"1395":{"position":[[52,8]]},"1610":{"position":[[610,10]]},"1810":{"position":[[2103,9]]},"1891":{"position":[[2796,9]]},"1988":{"position":[[1032,8]]},"2000":{"position":[[331,9]]},"2028":{"position":[[2495,10]]},"2058":{"position":[[7007,9]]}}}],["increasingli",{"_index":1234,"t":{"179":{"position":[[759,12]]},"1626":{"position":[[87,12]]}}}],["increment",{"_index":2514,"t":{"457":{"position":[[5343,11]]},"470":{"position":[[3606,11]]},"1003":{"position":[[282,10]]},"1434":{"position":[[348,11]]},"1594":{"position":[[1472,11]]},"2106":{"position":[[510,12],[526,11],[624,12],[812,11],[865,11]]},"2110":{"position":[[149,11],[194,11],[373,11],[458,11],[673,11]]},"2122":{"position":[[386,11],[478,12]]}}}],["incub",{"_index":6477,"t":{"1962":{"position":[[3138,10],[3160,10]]},"1966":{"position":[[1649,10]]},"2028":{"position":[[3059,10]]}}}],["incur",{"_index":6357,"t":{"1888":{"position":[[454,6]]},"1986":{"position":[[612,5]]}}}],["indefinit",{"_index":1004,"t":{"166":{"position":[[1131,12]]}}}],["independ",{"_index":1014,"t":{"166":{"position":[[1455,11]]},"173":{"position":[[863,11]]},"298":{"position":[[488,14]]},"639":{"position":[[126,11]]},"1082":{"position":[[126,11]]},"1122":{"position":[[929,14]]},"1429":{"position":[[158,13]]},"1434":{"position":[[82,11]]},"1543":{"position":[[1146,11]]},"1661":{"position":[[95,11]]},"1729":{"position":[[1358,11],[1435,13]]},"1774":{"position":[[1499,11],[1576,13]]},"1986":{"position":[[640,12]]},"1988":{"position":[[379,12]]},"1996":{"position":[[80,11]]},"2028":{"position":[[3915,13]]}}}],["independent/addit",{"_index":3915,"t":{"816":{"position":[[519,22]]}}}],["index",{"_index":4248,"t":{"985":{"position":[[741,5],[834,5]]}}}],["indic",{"_index":989,"t":{"166":{"position":[[387,9],[771,9]]},"681":{"position":[[152,8]]},"1262":{"position":[[2163,8]]},"1588":{"position":[[1817,10],[1946,10],[2075,10]]},"1594":{"position":[[521,8]]},"1610":{"position":[[212,9]]},"1636":{"position":[[230,10],[339,10]]},"1688":{"position":[[1167,9],[1432,9]]},"1690":{"position":[[254,8]]},"1692":{"position":[[852,9]]},"1694":{"position":[[115,8]]},"1700":{"position":[[393,9],[501,9],[1001,9],[1148,9]]},"1706":{"position":[[1702,10]]},"1708":{"position":[[66,10]]},"1725":{"position":[[1519,9],[1784,9]]},"1727":{"position":[[255,8]]},"1729":{"position":[[924,9]]},"1733":{"position":[[564,10]]},"1739":{"position":[[98,8],[572,8],[683,9],[796,9],[1798,10]]},"1741":{"position":[[115,8]]},"1747":{"position":[[14,9],[122,9],[655,9]]},"1749":{"position":[[4,9]]},"1751":{"position":[[66,10]]},"1770":{"position":[[1821,9],[2086,9]]},"1772":{"position":[[255,8]]},"1774":{"position":[[1065,9]]},"1776":{"position":[[409,10]]},"1780":{"position":[[98,8],[570,8],[681,9],[794,9],[1914,10]]},"1782":{"position":[[127,8]]},"1788":{"position":[[292,9],[855,9]]},"1790":{"position":[[27,9]]},"1792":{"position":[[66,10]]},"1807":{"position":[[783,8]]},"1810":{"position":[[179,9],[2244,9],[2384,10],[2608,9],[2688,9],[2733,8],[3023,9],[3520,9]]},"1812":{"position":[[152,8]]},"1816":{"position":[[612,9],[831,9],[1111,9],[1472,9]]},"1895":{"position":[[1165,8]]},"1899":{"position":[[561,8]]},"2015":{"position":[[1033,9]]},"2133":{"position":[[671,10],[727,10]]}}}],["indices.fielddata.cache.s",{"_index":3585,"t":{"746":{"position":[[1907,29],[3055,29]]}}}],["indirect",{"_index":6055,"t":{"1708":{"position":[[1472,11]]},"1751":{"position":[[1475,11]]},"1792":{"position":[[1498,11]]},"1897":{"position":[[247,11]]},"1932":{"position":[[3815,11]]}}}],["indirectli",{"_index":1617,"t":{"251":{"position":[[645,10]]}}}],["individu",{"_index":602,"t":{"92":{"position":[[344,10]]},"162":{"position":[[142,10]]},"472":{"position":[[2676,10]]},"519":{"position":[[221,12]]},"525":{"position":[[143,12]]},"577":{"position":[[175,10]]},"599":{"position":[[297,10]]},"639":{"position":[[179,10]]},"665":{"position":[[560,10]]},"746":{"position":[[192,10],[3889,10]]},"778":{"position":[[157,10]]},"860":{"position":[[1990,10],[2056,10]]},"869":{"position":[[412,10]]},"926":{"position":[[196,10]]},"947":{"position":[[296,12]]},"1082":{"position":[[179,10]]},"1207":{"position":[[3650,10]]},"1209":{"position":[[148,10]]},"1425":{"position":[[133,10]]},"1458":{"position":[[300,11]]},"1516":{"position":[[796,10]]},"1541":{"position":[[865,10]]},"1580":{"position":[[218,12]]},"1610":{"position":[[126,10]]},"1619":{"position":[[223,10]]},"1622":{"position":[[221,12]]},"1659":{"position":[[107,11]]},"1661":{"position":[[241,10]]},"1780":{"position":[[1744,12]]},"1862":{"position":[[221,12]]},"1977":{"position":[[1296,10]]},"1988":{"position":[[1178,10]]}}}],["induc",{"_index":5724,"t":{"1610":{"position":[[1196,7]]}}}],["industri",{"_index":6207,"t":{"1807":{"position":[[508,9]]},"2155":{"position":[[212,8]]}}}],["inevit",{"_index":6807,"t":{"2206":{"position":[[544,10]]}}}],["infam",{"_index":1113,"t":{"175":{"position":[[428,10]]}}}],["infastructur",{"_index":5612,"t":{"1535":{"position":[[277,13]]},"1622":{"position":[[469,13]]}}}],["infil",{"_index":1900,"t":{"319":{"position":[[4247,6],[4254,6]]}}}],["infiniband",{"_index":6062,"t":{"1717":{"position":[[1331,10]]},"1749":{"position":[[14,10]]},"1753":{"position":[[339,11]]},"1762":{"position":[[1230,10]]},"1780":{"position":[[251,10]]},"1790":{"position":[[37,10]]},"1794":{"position":[[339,11]]}}}],["influenc",{"_index":1213,"t":{"177":{"position":[[2271,10]]},"185":{"position":[[2832,9]]}}}],["influx",{"_index":5386,"t":{"1334":{"position":[[112,6]]},"2141":{"position":[[223,6]]}}}],["influxdb",{"_index":3925,"t":{"821":{"position":[[145,8]]},"1308":{"position":[[433,8]]},"1400":{"position":[[295,8]]},"2133":{"position":[[127,9]]},"2139":{"position":[[701,9],[711,8]]}}}],["info",{"_index":780,"t":{"138":{"position":[[54,5],[192,4]]},"195":{"position":[[337,4]]},"565":{"position":[[1031,5]]},"610":{"position":[[1128,4],[1184,4],[1240,4],[1297,4]]},"646":{"position":[[97,4],[193,4]]},"836":{"position":[[1731,4]]},"873":{"position":[[138,4]]},"933":{"position":[[36,4]]},"960":{"position":[[63,5]]},"1038":{"position":[[477,4],[641,4],[1329,4]]},"1055":{"position":[[1128,4],[1184,4],[1240,4],[1297,4]]},"1088":{"position":[[97,4],[193,4]]},"1855":{"position":[[339,4]]},"1881":{"position":[[301,4]]},"2094":{"position":[[1819,4],[2298,5],[2667,5],[2787,5],[2850,5],[3018,4]]},"2096":{"position":[[1165,5]]}}}],["inform",{"_index":327,"t":{"36":{"position":[[1227,11]]},"166":{"position":[[1064,11]]},"251":{"position":[[316,11],[1192,11]]},"272":{"position":[[164,12]]},"274":{"position":[[246,12]]},"276":{"position":[[142,12]]},"278":{"position":[[262,12]]},"280":{"position":[[278,12]]},"288":{"position":[[403,11]]},"313":{"position":[[805,11]]},"319":{"position":[[6036,11]]},"335":{"position":[[130,7]]},"337":{"position":[[279,11],[420,11],[561,11],[1075,11],[1216,11],[1357,11]]},"345":{"position":[[2124,11],[2150,6]]},"352":{"position":[[1199,11],[1884,12]]},"356":{"position":[[219,11]]},"360":{"position":[[216,13]]},"426":{"position":[[772,11]]},"432":{"position":[[128,11]]},"583":{"position":[[396,11]]},"620":{"position":[[5,11]]},"630":{"position":[[121,12]]},"665":{"position":[[917,12]]},"720":{"position":[[159,11]]},"783":{"position":[[274,11],[474,11]]},"787":{"position":[[1121,11]]},"802":{"position":[[1087,11],[1444,11]]},"936":{"position":[[388,11]]},"941":{"position":[[158,11],[620,11]]},"1018":{"position":[[105,11],[192,11]]},"1063":{"position":[[5,11]]},"1073":{"position":[[121,12]]},"1122":{"position":[[1340,11],[1659,11],[1980,11],[2311,11],[2633,11],[2955,11],[3276,11],[3592,11]]},"1172":{"position":[[594,11]]},"1174":{"position":[[1135,11],[1558,11]]},"1276":{"position":[[100,12]]},"1332":{"position":[[786,11]]},"1545":{"position":[[312,11]]},"1557":{"position":[[418,11]]},"1665":{"position":[[151,11]]},"1667":{"position":[[151,11],[1766,11]]},"1671":{"position":[[325,12]]},"1700":{"position":[[78,11]]},"1810":{"position":[[2156,6]]},"1822":{"position":[[57,11],[195,11]]},"1904":{"position":[[107,8]]},"1915":{"position":[[650,11]]},"1932":{"position":[[2319,11]]},"1934":{"position":[[234,12]]},"1979":{"position":[[1168,11]]},"1984":{"position":[[492,8]]},"2022":{"position":[[835,12]]},"2088":{"position":[[317,8]]},"2094":{"position":[[1135,11],[2484,12],[2533,11]]},"2096":{"position":[[431,11]]},"2116":{"position":[[160,12]]},"2143":{"position":[[48,12],[133,11]]}}}],["infra",{"_index":6740,"t":{"2094":{"position":[[3495,5]]}}}],["infrastructur",{"_index":1639,"t":{"265":{"position":[[146,14]]},"292":{"position":[[133,15]]},"296":{"position":[[45,14]]},"298":{"position":[[81,14]]},"300":{"position":[[518,15]]},"302":{"position":[[122,14]]},"319":{"position":[[1740,14]]},"339":{"position":[[801,15],[1664,15]]},"457":{"position":[[2751,14]]},"468":{"position":[[450,14]]},"478":{"position":[[151,14]]},"519":{"position":[[72,14]]},"539":{"position":[[16,14]]},"573":{"position":[[317,15]]},"589":{"position":[[16,14]]},"758":{"position":[[144,14],[215,14]]},"775":{"position":[[203,14]]},"787":{"position":[[1819,14],[2134,14],[2674,14]]},"807":{"position":[[232,14],[303,14]]},"809":{"position":[[114,14]]},"816":{"position":[[550,15]]},"821":{"position":[[92,15]]},"823":{"position":[[33,14],[87,14]]},"863":{"position":[[82,14]]},"875":{"position":[[29,14]]},"1308":{"position":[[196,15],[470,15]]},"1329":{"position":[[110,14]]},"1365":{"position":[[103,14]]},"1377":{"position":[[299,14]]},"1383":{"position":[[510,14]]},"1397":{"position":[[463,14]]},"1417":{"position":[[605,14]]},"1431":{"position":[[749,14]]},"1436":{"position":[[483,15]]},"1451":{"position":[[605,14]]},"1475":{"position":[[57,14]]},"1543":{"position":[[122,16]]},"1547":{"position":[[289,14]]},"1553":{"position":[[104,14],[352,15]]},"1580":{"position":[[72,14]]},"1592":{"position":[[291,14]]},"1622":{"position":[[72,14]]},"1717":{"position":[[1153,14]]},"1755":{"position":[[1097,14]]},"1762":{"position":[[1052,14]]},"1796":{"position":[[1099,14]]},"1862":{"position":[[72,14]]},"1886":{"position":[[210,14]]},"1919":{"position":[[586,15]]},"1956":{"position":[[27,14]]},"1958":{"position":[[355,15]]},"1977":{"position":[[792,15],[1036,15]]},"1979":{"position":[[776,14],[1494,14]]},"1984":{"position":[[194,14]]},"2004":{"position":[[222,14]]},"2013":{"position":[[463,14]]},"2015":{"position":[[152,15]]},"2022":{"position":[[1373,14]]},"2041":{"position":[[550,14]]},"2058":{"position":[[6025,14]]},"2068":{"position":[[724,15]]},"2088":{"position":[[28,14],[190,15]]},"2196":{"position":[[60,14]]},"2206":{"position":[[376,15]]}}}],["infrastructure/control",{"_index":2108,"t":{"352":{"position":[[1126,22]]}}}],["infrastructureprovid",{"_index":2497,"t":{"457":{"position":[[2788,22]]}}}],["infrastrucur",{"_index":1572,"t":{"241":{"position":[[11,13]]}}}],["infus",{"_index":5644,"t":{"1555":{"position":[[396,8]]}}}],["ing",{"_index":2861,"t":{"491":{"position":[[439,3]]}}}],["ingress",{"_index":1777,"t":{"300":{"position":[[856,8],[1028,8],[1089,8],[1156,7]]},"323":{"position":[[21,7]]},"325":{"position":[[429,7],[594,8],[658,7],[795,7],[824,9],[842,7],[1135,7],[1302,7]]},"420":{"position":[[4168,7],[5697,7]]},"422":{"position":[[1960,7]]},"457":{"position":[[5446,7],[5700,7],[5769,7],[6096,7],[6176,7],[6279,7],[6313,7],[6388,7],[6421,7],[7265,7],[8681,7],[10193,7]]},"462":{"position":[[2415,7]]},"470":{"position":[[1394,7],[2475,7],[3914,7]]},"474":{"position":[[3700,7],[3809,7]]},"480":{"position":[[729,7]]},"484":{"position":[[382,7]]},"491":{"position":[[22,7],[273,7],[399,7],[450,7],[500,7],[1261,7],[1692,7],[1851,7],[1873,7]]},"1349":{"position":[[566,7]]},"1368":{"position":[[1605,7]]},"1431":{"position":[[378,8]]},"1449":{"position":[[10,7],[230,7]]},"1467":{"position":[[241,9]]}}}],["inher",{"_index":6783,"t":{"2135":{"position":[[278,10]]}}}],["inherit",{"_index":1859,"t":{"319":{"position":[[420,7]]},"341":{"position":[[58,8]]}}}],["inifinband",{"_index":5953,"t":{"1700":{"position":[[1158,10]]}}}],["inifiniband",{"_index":5968,"t":{"1702":{"position":[[339,12]]},"1739":{"position":[[252,11]]}}}],["init",{"_index":384,"t":{"40":{"position":[[60,4]]},"397":{"position":[[5,4]]},"856":{"position":[[216,4]]},"1026":{"position":[[176,4]]},"1308":{"position":[[149,4]]}}}],["init.sh",{"_index":4073,"t":{"856":{"position":[[256,7]]}}}],["initi",{"_index":612,"t":{"92":{"position":[[704,9]]},"345":{"position":[[94,9]]},"363":{"position":[[15,8]]},"397":{"position":[[20,10]]},"424":{"position":[[172,7]]},"453":{"position":[[9,9]]},"710":{"position":[[4,7]]},"718":{"position":[[354,8]]},"720":{"position":[[37,9]]},"729":{"position":[[319,7],[365,7],[1533,7],[1624,7],[2420,7]]},"758":{"position":[[541,9]]},"763":{"position":[[3313,7]]},"812":{"position":[[104,10]]},"856":{"position":[[282,7],[482,7]]},"858":{"position":[[8,7],[248,7],[343,7]]},"860":{"position":[[1185,9]]},"865":{"position":[[35,7]]},"869":{"position":[[1346,7]]},"873":{"position":[[149,7]]},"1168":{"position":[[1827,10]]},"1667":{"position":[[1214,7]]},"1810":{"position":[[4540,7]]},"1915":{"position":[[979,7]]},"1998":{"position":[[409,12]]},"2000":{"position":[[439,7]]},"2002":{"position":[[292,7]]},"2004":{"position":[[980,7]]},"2094":{"position":[[3551,9]]},"2096":{"position":[[731,7]]}}}],["initiator_host_addr",{"_index":5217,"t":{"1298":{"position":[[6475,20]]}}}],["initiator_host_address",{"_index":5276,"t":{"1298":{"position":[[10319,23],[14177,23]]}}}],["initiator_host_ag",{"_index":5215,"t":{"1298":{"position":[[6416,21],[14118,21]]}}}],["initiator_id",{"_index":5189,"t":{"1298":{"position":[[5636,13],[6326,13],[7041,13],[10229,13],[13975,13]]}}}],["initiator_nam",{"_index":5213,"t":{"1298":{"position":[[6369,15],[10272,15],[14071,15]]}}}],["initiator_project_id",{"_index":5229,"t":{"1298":{"position":[[7084,21]]}}}],["initiator_typeuri",{"_index":5211,"t":{"1298":{"position":[[6273,18],[6988,18],[10176,18],[14018,18]]}}}],["inject",{"_index":2716,"t":{"474":{"position":[[1602,7],[1727,10],[1799,6],[2139,6]]},"476":{"position":[[1312,8]]},"1308":{"position":[[154,8]]},"1814":{"position":[[613,8]]},"1828":{"position":[[288,7],[1003,8]]}}}],["inlin",{"_index":6683,"t":{"2068":{"position":[[1862,6]]}}}],["inner",{"_index":5673,"t":{"1580":{"position":[[299,5]]}}}],["inplac",{"_index":2728,"t":{"474":{"position":[[2233,9]]}}}],["input",{"_index":2779,"t":{"480":{"position":[[1083,5]]},"1034":{"position":[[4246,5]]},"1262":{"position":[[1711,5]]},"1389":{"position":[[102,5]]},"1402":{"position":[[1199,5]]},"1423":{"position":[[102,5]]},"1436":{"position":[[700,5]]},"1458":{"position":[[102,5]]},"1494":{"position":[[102,5]]},"1513":{"position":[[102,5]]},"1857":{"position":[[101,5]]}}}],["input.pi",{"_index":6330,"t":{"1857":{"position":[[147,9]]}}}],["ins3_secret_access_key",{"_index":372,"t":{"38":{"position":[[149,22]]}}}],["insecur",{"_index":5849,"t":{"1688":{"position":[[1094,8],[1472,8]]},"1702":{"position":[[129,11]]},"1706":{"position":[[888,8]]},"1725":{"position":[[1446,8],[1824,8]]},"1733":{"position":[[1078,8]]},"1753":{"position":[[129,11]]},"1770":{"position":[[1748,8],[2126,8]]},"1776":{"position":[[923,8]]},"1794":{"position":[[129,11]]}}}],["insert",{"_index":868,"t":{"150":{"position":[[181,6]]},"428":{"position":[[48,6]]},"430":{"position":[[54,6]]},"614":{"position":[[141,8]]},"1059":{"position":[[141,8]]},"1137":{"position":[[182,6]]},"1262":{"position":[[2343,6]]}}}],["insid",{"_index":362,"t":{"36":{"position":[[1893,6]]},"325":{"position":[[1167,6]]},"428":{"position":[[55,6],[264,6]]},"430":{"position":[[61,6],[288,6]]},"438":{"position":[[345,6]]},"453":{"position":[[98,6]]},"476":{"position":[[370,6],[1092,6],[2051,6]]},"714":{"position":[[1209,6]]},"746":{"position":[[3804,6]]},"767":{"position":[[2022,6]]},"852":{"position":[[1411,6]]},"1596":{"position":[[41,6]]},"1917":{"position":[[912,6]]},"1971":{"position":[[337,6],[453,6]]},"2007":{"position":[[331,6],[444,6]]},"2013":{"position":[[900,6]]},"2137":{"position":[[407,6]]}}}],["inspect",{"_index":3596,"t":{"746":{"position":[[3437,7]]},"834":{"position":[[1646,10]]},"836":{"position":[[1591,10]]},"2054":{"position":[[216,7],[418,7]]}}}],["inspir",{"_index":1533,"t":{"229":{"position":[[109,11]]},"358":{"position":[[439,8]]},"1612":{"position":[[25,8]]},"1654":{"position":[[25,8]]}}}],["instal",{"_index":271,"t":{"36":{"position":[[23,11],[111,7],[181,11],[208,7],[308,7],[405,7],[496,7],[691,7],[722,12],[777,12],[999,7],[1025,7]]},"78":{"position":[[71,10],[93,7]]},"100":{"position":[[674,8]]},"108":{"position":[[232,13]]},"110":{"position":[[26,12]]},"129":{"position":[[21,7],[266,7],[314,11],[326,7],[357,7],[378,12],[421,10],[564,7],[596,9],[653,9],[802,7],[853,7],[877,9],[957,12]]},"133":{"position":[[103,7],[133,7]]},"177":{"position":[[1760,9]]},"265":{"position":[[115,12]]},"307":{"position":[[89,9]]},"339":{"position":[[648,8],[1517,8]]},"341":{"position":[[634,7],[658,7]]},"363":{"position":[[379,9],[618,9]]},"383":{"position":[[251,7],[282,7]]},"422":{"position":[[1167,10]]},"424":{"position":[[614,10]]},"447":{"position":[[48,10]]},"453":{"position":[[580,10],[1097,9]]},"457":{"position":[[226,9],[328,7],[1879,7],[8861,9]]},"470":{"position":[[3834,12],[5371,9]]},"472":{"position":[[2337,12],[2502,12]]},"474":{"position":[[2361,7],[2867,7]]},"608":{"position":[[0,7],[59,7]]},"626":{"position":[[125,7],[184,7]]},"677":{"position":[[71,9]]},"695":{"position":[[177,8]]},"708":{"position":[[534,9],[556,7]]},"763":{"position":[[465,7],[1935,7]]},"767":{"position":[[473,7],[1677,9]]},"769":{"position":[[286,12]]},"771":{"position":[[263,12]]},"783":{"position":[[13,9],[48,9],[193,9],[289,10],[389,9],[489,10]]},"785":{"position":[[18,12]]},"787":{"position":[[2020,12]]},"798":{"position":[[441,7]]},"814":{"position":[[42,10],[100,9]]},"827":{"position":[[43,12]]},"829":{"position":[[825,12]]},"831":{"position":[[116,12],[217,13]]},"834":{"position":[[34,7],[66,12],[128,12],[221,12],[791,12]]},"836":{"position":[[644,13],[979,12],[1028,7],[1865,13]]},"839":{"position":[[476,7]]},"843":{"position":[[54,12],[360,12]]},"852":{"position":[[148,12],[733,12],[994,12],[1068,9],[1446,7],[1488,7]]},"854":{"position":[[121,7]]},"856":{"position":[[187,12],[225,12],[431,12],[727,12]]},"858":{"position":[[331,7]]},"860":{"position":[[80,12],[154,12],[460,7],[1145,12],[2851,8],[2867,7],[2933,9],[2997,7]]},"867":{"position":[[13,7]]},"960":{"position":[[1039,7]]},"1036":{"position":[[223,7]]},"1053":{"position":[[0,7],[59,7]]},"1069":{"position":[[125,7],[184,7]]},"1105":{"position":[[216,7]]},"1120":{"position":[[48,9],[73,7]]},"1147":{"position":[[4,7]]},"1161":{"position":[[70,7]]},"1165":{"position":[[303,12]]},"1168":{"position":[[88,10],[2105,7]]},"1207":{"position":[[145,11]]},"1209":{"position":[[885,10]]},"1346":{"position":[[67,13]]},"1365":{"position":[[474,13]]},"1368":{"position":[[541,13]]},"1471":{"position":[[708,12]]},"1667":{"position":[[1162,12],[1450,13]]},"1669":{"position":[[956,7]]},"1835":{"position":[[282,9]]},"1855":{"position":[[165,13]]},"1877":{"position":[[111,13]]},"1881":{"position":[[163,13]]},"2022":{"position":[[223,13]]},"2096":{"position":[[739,7],[1860,12]]}}}],["install_ansible_roles=fals",{"_index":3736,"t":{"769":{"position":[[330,27]]},"771":{"position":[[307,27]]}}}],["instanc",{"_index":428,"t":{"68":{"position":[[32,8]]},"72":{"position":[[20,8]]},"249":{"position":[[514,9]]},"311":{"position":[[231,8]]},"317":{"position":[[11,8]]},"319":{"position":[[24,9],[268,9],[5617,9],[6234,9]]},"333":{"position":[[248,8],[771,8]]},"341":{"position":[[419,9],[446,8]]},"424":{"position":[[254,8]]},"468":{"position":[[585,9]]},"472":{"position":[[1773,8]]},"474":{"position":[[269,8],[624,9],[1108,8]]},"491":{"position":[[1244,9]]},"563":{"position":[[469,9]]},"565":{"position":[[952,9]]},"573":{"position":[[61,10],[185,9],[253,9]]},"577":{"position":[[242,9]]},"579":{"position":[[374,9]]},"587":{"position":[[190,10]]},"780":{"position":[[121,9]]},"787":{"position":[[2929,9],[3218,8]]},"850":{"position":[[239,9],[339,9],[571,9],[3523,9]]},"1122":{"position":[[530,8]]},"1128":{"position":[[39,8]]},"1170":{"position":[[815,9]]},"1262":{"position":[[1526,9]]},"1535":{"position":[[350,9]]},"1555":{"position":[[79,10],[447,9]]},"1559":{"position":[[73,8]]},"1594":{"position":[[461,8]]},"1622":{"position":[[542,9],[1665,9]]},"1680":{"position":[[74,10],[827,9]]},"1692":{"position":[[980,8]]},"1696":{"position":[[7,9],[206,9]]},"1704":{"position":[[1637,8]]},"1717":{"position":[[74,10],[827,9]]},"1729":{"position":[[1052,8]]},"1731":{"position":[[1659,8]]},"1743":{"position":[[7,9],[206,9]]},"1762":{"position":[[74,10],[726,9]]},"1774":{"position":[[1193,8]]},"1784":{"position":[[20,9],[219,9]]},"1826":{"position":[[609,9]]},"1828":{"position":[[8,9],[327,9],[901,9]]},"1830":{"position":[[163,10]]},"1837":{"position":[[314,9]]},"1841":{"position":[[74,10]]},"1853":{"position":[[1193,8]]},"1888":{"position":[[1145,8]]},"1901":{"position":[[257,9]]},"1964":{"position":[[1850,9],[1896,9]]},"1966":{"position":[[5095,8]]},"1971":{"position":[[13,8]]},"1977":{"position":[[956,9]]},"2007":{"position":[[13,8]]},"2015":{"position":[[631,8]]},"2026":{"position":[[867,9]]},"2094":{"position":[[3204,10]]},"2133":{"position":[[540,9],[629,9],[643,9]]},"2143":{"position":[[151,8]]}}}],["instance_id",{"_index":5049,"t":{"1298":{"position":[[134,12],[2211,12]]}}}],["instance_nam",{"_index":5295,"t":{"1298":{"position":[[11568,14]]}}}],["instance_s",{"_index":5307,"t":{"1298":{"position":[[12058,14]]}}}],["instance_trait",{"_index":5044,"t":{"1298":{"position":[[47,16],[1117,16],[1237,16],[1341,16]]}}}],["instance_typ",{"_index":5068,"t":{"1298":{"position":[[664,14],[11342,14]]}}}],["instance_type_id",{"_index":5066,"t":{"1298":{"position":[[613,17],[11461,17]]}}}],["instead",{"_index":1732,"t":{"288":{"position":[[643,8]]},"323":{"position":[[378,7]]},"345":{"position":[[1051,7]]},"352":{"position":[[827,7]]},"420":{"position":[[411,7],[1035,8]]},"472":{"position":[[531,7]]},"491":{"position":[[319,7]]},"502":{"position":[[730,8]]},"634":{"position":[[422,8]]},"735":{"position":[[914,7]]},"749":{"position":[[1585,7]]},"831":{"position":[[650,7]]},"852":{"position":[[773,7]]},"960":{"position":[[533,7]]},"1010":{"position":[[72,7]]},"1077":{"position":[[422,8]]},"1105":{"position":[[263,7]]},"1116":{"position":[[867,8]]},"1218":{"position":[[556,8]]},"1262":{"position":[[1238,8]]},"1329":{"position":[[503,7]]},"1334":{"position":[[481,7]]},"1374":{"position":[[362,7]]},"1411":{"position":[[813,7]]},"1445":{"position":[[695,7]]},"1706":{"position":[[443,7],[873,7]]},"1725":{"position":[[543,7]]},"1733":{"position":[[444,7],[1063,7]]},"1770":{"position":[[543,7]]},"1776":{"position":[[180,7],[376,7],[908,7]]},"1814":{"position":[[278,8]]},"1966":{"position":[[5243,7]]},"1975":{"position":[[2176,8]]},"2028":{"position":[[306,7]]},"2058":{"position":[[1250,7]]},"2068":{"position":[[522,7]]}}}],["institut",{"_index":2940,"t":{"525":{"position":[[177,12]]}}}],["instrastructur",{"_index":3740,"t":{"775":{"position":[[360,15]]}}}],["instruct",{"_index":1613,"t":{"251":{"position":[[436,10]]},"341":{"position":[[620,13]]},"472":{"position":[[1703,9]]},"474":{"position":[[194,9],[1038,9]]},"491":{"position":[[1334,9]]},"798":{"position":[[518,12]]},"839":{"position":[[553,12]]},"983":{"position":[[56,11]]},"985":{"position":[[579,8]]},"1172":{"position":[[129,12]]},"1555":{"position":[[339,12]]},"1667":{"position":[[1175,13],[1668,12]]},"1826":{"position":[[379,12],[749,12]]},"1828":{"position":[[178,12]]},"1837":{"position":[[39,12],[139,12]]},"2065":{"position":[[342,13]]}}}],["insuffici",{"_index":2207,"t":{"379":{"position":[[162,12]]},"1688":{"position":[[1372,12],[1524,12]]},"1725":{"position":[[1724,12],[1876,12]]},"1770":{"position":[[2026,12],[2178,12]]},"1891":{"position":[[3041,12]]}}}],["int",{"_index":3562,"t":{"746":{"position":[[1047,3]]},"1298":{"position":[[405,3],[450,3],[493,3],[541,3],[587,3],[2595,3],[3315,3],[4190,3],[4496,3],[12079,3],[12132,3],[12423,3],[12634,3]]}}}],["int.loc",{"_index":4904,"t":{"1187":{"position":[[271,11]]}}}],["int.osism.xyz",{"_index":3419,"t":{"714":{"position":[[724,15]]},"724":{"position":[[443,13]]}}}],["int.testbed.osism.xyz",{"_index":3516,"t":{"737":{"position":[[358,21]]}}}],["int.testbed.osism.xyz:15672",{"_index":3845,"t":{"800":{"position":[[1136,28]]}}}],["int.testbed.osism.xyz:3000",{"_index":3829,"t":{"800":{"position":[[402,26]]}}}],["int.testbed.osism.xyz:5000",{"_index":3209,"t":{"659":{"position":[[615,27]]}}}],["int.testbed.osism.xyz:8140",{"_index":3826,"t":{"800":{"position":[[294,26],[355,26]]}}}],["int.testbed.osism.xyz:9091",{"_index":3842,"t":{"800":{"position":[[1025,27]]}}}],["integ",{"_index":5883,"t":{"1692":{"position":[[1186,7]]},"1729":{"position":[[1258,7]]},"1774":{"position":[[1399,7]]},"1843":{"position":[[621,8]]}}}],["integr",{"_index":565,"t":{"85":{"position":[[36,9]]},"185":{"position":[[547,9]]},"274":{"position":[[137,11]]},"300":{"position":[[322,11],[553,12],[593,10]]},"333":{"position":[[83,11]]},"470":{"position":[[1305,12],[3864,12]]},"547":{"position":[[165,9]]},"603":{"position":[[410,10],[429,10],[511,10]]},"737":{"position":[[149,11],[449,11]]},"739":{"position":[[25,11],[76,11],[105,11]]},"758":{"position":[[608,10]]},"775":{"position":[[464,11]]},"873":{"position":[[93,10]]},"1159":{"position":[[155,9]]},"1280":{"position":[[437,11]]},"1314":{"position":[[1282,9]]},"1326":{"position":[[80,12],[329,11]]},"1332":{"position":[[674,11],[740,11]]},"1346":{"position":[[287,11]]},"1355":{"position":[[391,10]]},"1413":{"position":[[123,10]]},"1434":{"position":[[937,11]]},"1496":{"position":[[27,12]]},"1551":{"position":[[294,12]]},"1563":{"position":[[427,11]]},"1567":{"position":[[624,11]]},"1577":{"position":[[188,11]]},"1586":{"position":[[489,10]]},"1624":{"position":[[370,13]]},"1669":{"position":[[662,11]]},"1864":{"position":[[364,13]]},"1956":{"position":[[156,11]]},"1964":{"position":[[963,13],[1094,11],[2545,11],[2665,11],[4322,11],[4807,12],[5101,12]]},"1966":{"position":[[1278,12],[2111,11],[2218,11],[2339,12],[3224,13],[3265,13],[4867,11]]},"1996":{"position":[[145,11]]},"2022":{"position":[[1551,12]]},"2028":{"position":[[3760,9]]},"2032":{"position":[[714,11]]},"2198":{"position":[[405,9]]},"2206":{"position":[[338,9]]}}}],["intel",{"_index":5810,"t":{"1683":{"position":[[326,6]]},"1688":{"position":[[899,6]]},"1696":{"position":[[233,7]]},"1698":{"position":[[239,6]]},"1700":{"position":[[697,5],[842,5]]},"1708":{"position":[[738,5]]},"1717":{"position":[[1387,6]]},"1720":{"position":[[385,6]]},"1725":{"position":[[1035,6]]},"1739":{"position":[[937,5]]},"1743":{"position":[[233,7],[886,6]]},"1745":{"position":[[272,6],[330,6],[1171,5]]},"1747":{"position":[[320,5],[502,5]]},"1751":{"position":[[777,5]]},"1762":{"position":[[1286,6]]},"1765":{"position":[[385,6]]},"1770":{"position":[[1032,6]]},"1780":{"position":[[935,5]]},"1784":{"position":[[246,7],[899,6]]},"1786":{"position":[[285,5],[551,6]]},"1788":{"position":[[498,5],[702,5]]},"1792":{"position":[[777,5]]}}}],["intend",{"_index":975,"t":{"164":{"position":[[663,6]]},"183":{"position":[[27,8],[342,8]]},"286":{"position":[[3,6]]},"309":{"position":[[470,8]]},"447":{"position":[[509,6]]},"559":{"position":[[59,8],[173,8]]},"729":{"position":[[784,8]]},"775":{"position":[[417,8]]},"791":{"position":[[45,8]]},"827":{"position":[[166,8]]},"831":{"position":[[59,8],[299,8]]},"1368":{"position":[[821,8]]},"1580":{"position":[[409,6]]},"1594":{"position":[[534,8]]},"1636":{"position":[[936,6]]},"1678":{"position":[[58,6]]},"1715":{"position":[[58,6]]},"1760":{"position":[[58,6]]},"2068":{"position":[[854,8]]},"2116":{"position":[[180,8]]},"2150":{"position":[[211,8]]},"2152":{"position":[[136,8]]},"2196":{"position":[[34,7]]}}}],["intens",{"_index":5457,"t":{"1383":{"position":[[20,7]]},"1988":{"position":[[362,9]]},"2000":{"position":[[289,9]]}}}],["intent",{"_index":1086,"t":{"173":{"position":[[297,9]]},"1945":{"position":[[192,7]]}}}],["intention",{"_index":3911,"t":{"816":{"position":[[21,13]]}}}],["interact",{"_index":57,"t":{"9":{"position":[[112,11]]},"173":{"position":[[1193,11]]},"181":{"position":[[256,11]]},"290":{"position":[[144,9]]},"363":{"position":[[738,11]]},"424":{"position":[[910,8]]},"440":{"position":[[431,8]]},"472":{"position":[[134,9],[408,9]]},"665":{"position":[[2553,11]]},"1020":{"position":[[110,14]]},"1024":{"position":[[153,11]]},"1172":{"position":[[32,8]]},"1932":{"position":[[1760,9]]},"2094":{"position":[[1064,8]]}}}],["interchang",{"_index":5004,"t":{"1268":{"position":[[22,14]]}}}],["interconnect",{"_index":6600,"t":{"2013":{"position":[[847,15]]}}}],["interest",{"_index":1159,"t":{"177":{"position":[[380,8]]},"333":{"position":[[700,10]]},"965":{"position":[[54,11]]},"1306":{"position":[[159,10]]},"1667":{"position":[[1688,10]]},"1977":{"position":[[2932,10]]}}}],["interfac",{"_index":1018,"t":{"166":{"position":[[1542,9]]},"173":{"position":[[1107,9]]},"181":{"position":[[488,9],[1324,9]]},"422":{"position":[[653,9]]},"472":{"position":[[32,9]]},"476":{"position":[[596,10]]},"563":{"position":[[137,10]]},"571":{"position":[[440,11]]},"581":{"position":[[201,9]]},"595":{"position":[[237,9]]},"597":{"position":[[193,9]]},"665":{"position":[[870,10]]},"672":{"position":[[122,10]]},"729":{"position":[[2099,10],[2439,10],[2458,10]]},"816":{"position":[[1178,10]]},"829":{"position":[[688,9],[749,9]]},"834":{"position":[[1095,9],[1120,9]]},"850":{"position":[[182,9],[2125,10]]},"860":{"position":[[685,10],[782,9]]},"1280":{"position":[[736,10]]},"1368":{"position":[[736,10]]},"1400":{"position":[[517,10]]},"1577":{"position":[[60,9]]},"1973":{"position":[[281,10]]},"2009":{"position":[[257,10]]},"2024":{"position":[[623,9]]},"2026":{"position":[[451,9]]},"2028":{"position":[[2728,10]]},"2164":{"position":[[499,9]]},"2196":{"position":[[297,9],[397,9]]},"2198":{"position":[[197,9],[298,9]]}}}],["interfer",{"_index":2050,"t":{"339":{"position":[[997,9],[1860,9]]}}}],["intermedi",{"_index":1427,"t":{"206":{"position":[[74,12]]},"422":{"position":[[582,12]]},"476":{"position":[[682,12]]}}}],["intern",{"_index":1078,"t":{"173":{"position":[[107,8]]},"251":{"position":[[249,8],[1413,8]]},"420":{"position":[[3543,8]]},"595":{"position":[[256,8]]},"704":{"position":[[43,10]]},"712":{"position":[[229,8]]},"724":{"position":[[421,8],[832,8]]},"729":{"position":[[2090,8]]},"834":{"position":[[1215,8]]},"850":{"position":[[80,8]]},"869":{"position":[[1150,8]]},"1034":{"position":[[4544,8],[4697,8]]},"1043":{"position":[[38,8]]},"1047":{"position":[[372,8],[465,8],[558,8],[1856,8],[1949,8],[2042,8]]},"1329":{"position":[[8,8]]},"1368":{"position":[[1684,8]]},"1966":{"position":[[645,8]]},"2024":{"position":[[119,8]]}}}],["internal_address",{"_index":3472,"t":{"729":{"position":[[2110,17]]}}}],["internal_interfac",{"_index":3461,"t":{"727":{"position":[[261,19]]},"729":{"position":[[2038,19]]}}}],["internet",{"_index":487,"t":{"70":{"position":[[591,8]]},"539":{"position":[[96,9]]},"829":{"position":[[708,8]]},"834":{"position":[[1158,8],[1425,8]]},"850":{"position":[[292,9]]},"1168":{"position":[[314,9]]},"1986":{"position":[[561,9]]},"1988":{"position":[[690,8],[850,8]]},"1990":{"position":[[636,8]]},"1994":{"position":[[314,8]]},"1996":{"position":[[70,9]]}}}],["interoper",{"_index":2927,"t":{"519":{"position":[[109,13]]},"525":{"position":[[36,17]]},"529":{"position":[[68,16]]},"531":{"position":[[77,17]]},"1270":{"position":[[327,13],[502,13]]},"1516":{"position":[[151,16]]},"1547":{"position":[[253,13]]},"1551":{"position":[[64,13]]},"1553":{"position":[[295,17]]},"1563":{"position":[[198,16]]},"1580":{"position":[[109,13]]},"1622":{"position":[[109,13]]},"1862":{"position":[[109,13]]}}}],["interpret",{"_index":5675,"t":{"1582":{"position":[[156,11],[228,11]]},"2101":{"position":[[156,11],[228,11]]}}}],["interrupt",{"_index":4945,"t":{"1207":{"position":[[3711,9]]},"1209":{"position":[[131,13]]},"2137":{"position":[[181,13]]}}}],["interv",{"_index":1546,"t":{"233":{"position":[[239,9]]},"632":{"position":[[77,10]]},"1075":{"position":[[77,10]]},"1294":{"position":[[169,10]]},"1296":{"position":[[52,9]]},"1537":{"position":[[155,10]]},"1640":{"position":[[538,8]]},"1669":{"position":[[891,10]]},"2172":{"position":[[154,8],[310,10]]}}}],["intervent",{"_index":4684,"t":{"1112":{"position":[[386,13],[742,12]]}}}],["introduc",{"_index":2480,"t":{"457":{"position":[[1544,10]]},"468":{"position":[[492,11],[744,9],[1227,10]]},"1355":{"position":[[614,10]]},"1667":{"position":[[440,10]]},"1859":{"position":[[263,10]]},"2004":{"position":[[970,9]]},"2043":{"position":[[77,10],[384,10]]},"2051":{"position":[[863,11]]},"2058":{"position":[[7067,10]]},"2063":{"position":[[114,9]]}}}],["introduct",{"_index":5701,"t":{"1590":{"position":[[53,12]]},"1665":{"position":[[250,12]]},"2179":{"position":[[0,12]]}}}],["invalid",{"_index":1630,"t":{"253":{"position":[[115,10]]},"337":{"position":[[792,11],[1594,11]]},"345":{"position":[[1578,11],[1658,12]]}}}],["invent",{"_index":1285,"t":{"183":{"position":[[1189,9],[1640,10]]},"1708":{"position":[[403,6]]},"1751":{"position":[[403,6]]},"1792":{"position":[[403,6]]}}}],["inventori",{"_index":3230,"t":{"661":{"position":[[582,9]]},"697":{"position":[[4,9],[57,9]]},"699":{"position":[[24,9]]},"708":{"position":[[95,9]]},"720":{"position":[[118,9]]},"729":{"position":[[171,9],[387,9]]},"1010":{"position":[[2682,9],[3253,9],[3406,9]]},"1024":{"position":[[66,9]]},"1099":{"position":[[463,9]]},"1105":{"position":[[184,9]]},"1107":{"position":[[27,9]]},"1116":{"position":[[617,9]]},"1174":{"position":[[1099,9],[1318,9]]},"1184":{"position":[[387,9]]}}}],["inventory/20",{"_index":3467,"t":{"729":{"position":[[0,12]]}}}],["inventory/group_vars/ceph.rbd.yml",{"_index":3232,"t":{"661":{"position":[[718,33]]}}}],["inventory/group_vars/gener",{"_index":3229,"t":{"661":{"position":[[498,28]]}}}],["inventory/group_vars/generic/ceph.yml",{"_index":3219,"t":{"661":{"position":[[68,37]]}}}],["inventory/host_vars/.yml",{"_index":4278,"t":{"1010":{"position":[[435,34]]}}}],["inventory/host_vars/node01.yml",{"_index":3470,"t":{"729":{"position":[[1782,30]]}}}],["inventory_hostnam",{"_index":900,"t":{"152":{"position":[[541,18]]},"746":{"position":[[536,18],[670,18],[2233,18]]},"1139":{"position":[[356,18]]}}}],["inventory_reconcil",{"_index":4669,"t":{"1105":{"position":[[336,20],[457,20],[645,20]]},"1107":{"position":[[314,20]]}}}],["invest",{"_index":5395,"t":{"1349":{"position":[[454,9]]},"1990":{"position":[[963,10]]}}}],["investig",{"_index":2107,"t":{"352":{"position":[[1053,13]]},"502":{"position":[[652,13]]},"504":{"position":[[367,11]]},"985":{"position":[[683,11]]},"1402":{"position":[[1246,11]]},"1436":{"position":[[747,11]]},"1966":{"position":[[907,12]]},"2002":{"position":[[112,11]]}}}],["invit",{"_index":1472,"t":{"212":{"position":[[670,6]]}}}],["invoic",{"_index":6780,"t":{"2133":{"position":[[252,8]]},"2162":{"position":[[318,8],[451,8]]}}}],["involv",{"_index":1007,"t":{"166":{"position":[[1228,9]]},"193":{"position":[[116,9]]},"345":{"position":[[445,9]]},"1659":{"position":[[92,11]]}}}],["io",{"_index":2618,"t":{"468":{"position":[[856,2]]},"1891":{"position":[[2784,2],[2848,2],[2936,2]]},"1895":{"position":[[662,2]]}}}],["iop",{"_index":5878,"t":{"1692":{"position":[[563,5]]},"1729":{"position":[[635,5]]},"1774":{"position":[[635,5],[797,4]]},"1843":{"position":[[697,4]]},"1888":{"position":[[1811,4]]},"1891":{"position":[[4996,4]]},"1893":{"position":[[506,4],[671,5]]},"1895":{"position":[[485,4]]},"1899":{"position":[[127,4]]},"1901":{"position":[[209,4]]}}}],["ip",{"_index":1782,"t":{"300":{"position":[[1225,2]]},"323":{"position":[[773,3],[791,2]]},"325":{"position":[[876,4],[1023,3],[1357,4]]},"327":{"position":[[273,4]]},"329":{"position":[[188,4],[671,2]]},"331":{"position":[[295,4]]},"381":{"position":[[317,2],[518,3]]},"420":{"position":[[4396,2],[4669,3]]},"472":{"position":[[739,2]]},"486":{"position":[[1642,2],[1654,2]]},"491":{"position":[[1674,2],[1775,2]]},"577":{"position":[[193,3]]},"595":{"position":[[140,2],[162,4],[178,2],[216,2]]},"724":{"position":[[753,2],[841,2]]},"780":{"position":[[201,2]]},"798":{"position":[[287,2]]},"834":{"position":[[1632,2]]},"836":{"position":[[730,2],[1577,2]]},"839":{"position":[[322,2]]},"850":{"position":[[393,2],[1411,2],[3460,2]]},"941":{"position":[[722,2]]},"1093":{"position":[[189,2]]},"1181":{"position":[[14,2],[146,2],[169,2]]},"1368":{"position":[[1526,2],[1635,3]]},"1467":{"position":[[1056,2]]}}}],["ip_extern",{"_index":3421,"t":{"714":{"position":[[925,11]]},"724":{"position":[[728,11]]}}}],["ip_intern",{"_index":3424,"t":{"714":{"position":[[961,11]]},"724":{"position":[[816,11]]}}}],["ipsec_site_connect",{"_index":5246,"t":{"1298":{"position":[[7750,26],[9505,23]]}}}],["ipsecpolici",{"_index":5244,"t":{"1298":{"position":[[7718,16],[9197,13]]}}}],["ipsum",{"_index":1,"t":{"3":{"position":[[6,5],[115,5],[158,5]]}}}],["ipv4",{"_index":2281,"t":{"420":{"position":[[136,4],[227,4],[314,4]]}}}],["ipv6",{"_index":5545,"t":{"1465":{"position":[[211,4]]}}}],["irc",{"_index":4338,"t":{"1018":{"position":[[15,3]]},"1962":{"position":[[4049,3]]}}}],["irc.oftc.net",{"_index":4339,"t":{"1018":{"position":[[30,13]]}}}],["ireallymeanit=y",{"_index":3700,"t":{"763":{"position":[[2594,17],[3411,17]]},"1191":{"position":[[35,17]]}}}],["iron",{"_index":3931,"t":{"821":{"position":[[378,6]]},"933":{"position":[[691,6]]},"1346":{"position":[[4,6]]},"1434":{"position":[[1213,6]]}}}],["ironic_http_interfac",{"_index":3544,"t":{"744":{"position":[[464,21]]}}}],["ironic_tftp_interfac",{"_index":3545,"t":{"744":{"position":[[506,21]]}}}],["irq",{"_index":6277,"t":{"1826":{"position":[[259,3]]}}}],["irrelev",{"_index":4398,"t":{"1034":{"position":[[699,10]]}}}],["is_domain_group_project_gr",{"_index":3656,"t":{"749":{"position":[[3591,32]]},"2058":{"position":[[3233,32]]}}}],["is_domain_level_group_gr",{"_index":3658,"t":{"749":{"position":[[3790,30]]},"2058":{"position":[[3432,30]]}}}],["is_domain_level_user_gr",{"_index":3659,"t":{"749":{"position":[[3978,29]]},"2058":{"position":[[3620,29]]}}}],["is_domain_manag",{"_index":3616,"t":{"749":{"position":[[463,20]]},"2058":{"position":[[209,20]]}}}],["is_domain_managed_rol",{"_index":3619,"t":{"749":{"position":[[622,25],[3292,24]]},"2058":{"position":[[78,24],[368,25],[2934,24],[5875,25],[5905,24],[6182,24],[6285,24],[6620,25],[6769,24]]}}}],["is_domain_user_project_gr",{"_index":3655,"t":{"749":{"position":[[3379,31]]},"2058":{"position":[[3021,31]]}}}],["is_publ",{"_index":5132,"t":{"1298":{"position":[[3396,10]]}}}],["iscsi",{"_index":4143,"t":{"933":{"position":[[710,5]]},"1897":{"position":[[263,6]]}}}],["isn't",{"_index":4171,"t":{"941":{"position":[[694,5]]},"2013":{"position":[[669,5]]}}}],["iso",{"_index":1070,"t":{"171":{"position":[[625,3]]},"858":{"position":[[416,3],[498,3],[608,3]]},"860":{"position":[[132,3],[229,3]]},"1365":{"position":[[626,3]]},"1588":{"position":[[1798,3],[1927,3],[2056,3]]},"1636":{"position":[[211,3],[320,3]]}}}],["isol",{"_index":2964,"t":{"563":{"position":[[266,9]]},"1895":{"position":[[540,9]]},"1998":{"position":[[771,8]]},"2000":{"position":[[173,8]]},"2004":{"position":[[1318,8]]},"2028":{"position":[[4780,8]]},"2077":{"position":[[596,7]]}}}],["issu",{"_index":40,"t":{"7":{"position":[[241,6]]},"59":{"position":[[55,7]]},"78":{"position":[[196,6]]},"162":{"position":[[315,5]]},"171":{"position":[[53,6],[327,5]]},"177":{"position":[[737,5]]},"208":{"position":[[197,6]]},"251":{"position":[[96,7],[884,6]]},"286":{"position":[[635,6]]},"288":{"position":[[13,6],[85,5],[192,6],[254,7]]},"315":{"position":[[580,5]]},"348":{"position":[[71,6]]},"354":{"position":[[243,6]]},"358":{"position":[[635,5],[2895,7]]},"449":{"position":[[279,5]]},"451":{"position":[[630,7]]},"457":{"position":[[2072,5]]},"472":{"position":[[1846,5],[1934,6],[3630,5]]},"476":{"position":[[169,6],[310,6]]},"491":{"position":[[933,6],[1492,7]]},"749":{"position":[[1567,6]]},"802":{"position":[[2284,5],[2418,5],[3040,5]]},"834":{"position":[[1698,5]]},"836":{"position":[[1643,5]]},"875":{"position":[[7,6]]},"889":{"position":[[7,6]]},"902":{"position":[[7,6]]},"960":{"position":[[922,5]]},"985":{"position":[[699,5]]},"1096":{"position":[[15,7],[87,6],[108,6],[280,6]]},"1116":{"position":[[2576,6]]},"1122":{"position":[[1446,7],[1469,6]]},"1163":{"position":[[51,7]]},"1262":{"position":[[2296,7]]},"1344":{"position":[[187,6]]},"1368":{"position":[[1025,7],[1665,5]]},"1379":{"position":[[60,6],[202,7]]},"1387":{"position":[[148,6],[194,5],[317,5]]},"1389":{"position":[[122,6]]},"1413":{"position":[[19,6]]},"1423":{"position":[[122,6]]},"1434":{"position":[[807,6]]},"1447":{"position":[[79,5]]},"1458":{"position":[[122,6]]},"1484":{"position":[[60,6],[183,7],[290,7]]},"1486":{"position":[[15,5]]},"1494":{"position":[[122,6]]},"1513":{"position":[[122,6]]},"1565":{"position":[[199,6]]},"1590":{"position":[[513,6]]},"1622":{"position":[[963,7],[1031,6],[1261,6]]},"1626":{"position":[[283,6]]},"1644":{"position":[[397,6]]},"1667":{"position":[[1781,5]]},"1810":{"position":[[1154,6],[2296,6],[2490,5],[2808,5],[4791,6]]},"1816":{"position":[[1847,6]]},"1888":{"position":[[1334,5]]},"1891":{"position":[[2262,5],[3080,5]]},"1904":{"position":[[786,6],[848,6]]},"1906":{"position":[[223,7]]},"1915":{"position":[[576,6],[638,6]]},"1917":{"position":[[723,6]]},"1960":{"position":[[923,6]]},"1962":{"position":[[1514,6],[1607,7],[2953,6],[3046,7],[4096,6],[4187,7],[5609,5],[5718,5]]},"1988":{"position":[[1499,6]]},"1990":{"position":[[889,7]]},"2019":{"position":[[45,5]]},"2028":{"position":[[469,6],[5981,6]]},"2058":{"position":[[1232,6]]},"2061":{"position":[[68,5]]},"2068":{"position":[[1607,5],[1993,5]]},"2096":{"position":[[39,5]]},"2118":{"position":[[300,7]]},"2139":{"position":[[903,6]]},"2206":{"position":[[561,6]]}}}],["issue/pul",{"_index":1065,"t":{"171":{"position":[[404,10]]}}}],["issueclusterctl",{"_index":2627,"t":{"470":{"position":[[76,15]]}}}],["issuer",{"_index":2868,"t":{"491":{"position":[[614,6],[657,7],[779,6],[1434,6],[2125,6]]}}}],["issuer_email",{"_index":2382,"t":{"420":{"position":[[5762,16]]},"486":{"position":[[91,13]]},"491":{"position":[[835,12],[1105,13]]}}}],["ist",{"_index":3447,"t":{"722":{"position":[[48,3]]}}}],["istio",{"_index":5030,"t":{"1280":{"position":[[961,5]]}}}],["it'",{"_index":948,"t":{"160":{"position":[[52,4]]},"177":{"position":[[857,4]]},"181":{"position":[[60,4]]},"214":{"position":[[320,4]]},"345":{"position":[[1843,4]]},"447":{"position":[[637,4]]},"451":{"position":[[1350,4]]},"459":{"position":[[159,4]]},"470":{"position":[[4090,5]]},"495":{"position":[[1109,4]]},"622":{"position":[[400,4]]},"871":{"position":[[111,4]]},"1065":{"position":[[400,4]]},"1678":{"position":[[87,4]]},"1715":{"position":[[87,4]]},"1717":{"position":[[1375,4]]},"1760":{"position":[[87,4]]},"1762":{"position":[[1274,4]]},"1788":{"position":[[1198,4]]},"1810":{"position":[[3580,4]]},"1928":{"position":[[381,4]]},"1998":{"position":[[74,4]]},"2026":{"position":[[245,4]]},"2028":{"position":[[2583,4]]},"2077":{"position":[[2707,4]]},"2096":{"position":[[1287,4]]},"2152":{"position":[[109,4]]}}}],["it'll",{"_index":4247,"t":{"985":{"position":[[721,5]]},"1016":{"position":[[105,5]]}}}],["item",{"_index":940,"t":{"158":{"position":[[281,5]]},"191":{"position":[[83,5]]},"1034":{"position":[[1862,5]]},"1122":{"position":[[791,5],[902,5],[1203,5],[1522,5],[1843,5],[2174,5],[2496,5],[2818,5],[3139,5],[3455,5]]},"1141":{"position":[[271,5]]},"1168":{"position":[[1338,4],[1367,4]]},"2068":{"position":[[1602,4]]},"2094":{"position":[[1014,5],[1227,5],[3110,5]]}}}],["item.value.descript",{"_index":912,"t":{"154":{"position":[[334,22]]}}}],["item.value.nam",{"_index":909,"t":{"154":{"position":[[267,15]]}}}],["item.value.slug",{"_index":911,"t":{"154":{"position":[[297,15]]}}}],["iter",{"_index":3112,"t":{"632":{"position":[[451,10]]},"1075":{"position":[[451,10]]},"1207":{"position":[[4066,10]]},"1272":{"position":[[665,10]]}}}],["itrich",{"_index":266,"t":{"30":{"position":[[155,6]]},"32":{"position":[[268,6]]}}}],["itself",{"_index":869,"t":{"150":{"position":[[249,7]]},"158":{"position":[[313,6]]},"175":{"position":[[715,6]]},"181":{"position":[[1217,6]]},"183":{"position":[[940,6]]},"239":{"position":[[237,7]]},"247":{"position":[[809,6]]},"251":{"position":[[710,7]]},"311":{"position":[[435,7]]},"420":{"position":[[5108,6]]},"583":{"position":[[512,6]]},"595":{"position":[[937,7]]},"691":{"position":[[560,6]]},"708":{"position":[[678,6]]},"739":{"position":[[117,6]]},"749":{"position":[[331,6]]},"850":{"position":[[437,6]]},"926":{"position":[[287,7]]},"1137":{"position":[[250,7]]},"1141":{"position":[[303,6]]},"1165":{"position":[[96,7]]},"1207":{"position":[[3513,6],[3578,6],[3741,7],[4333,7]]},"1329":{"position":[[125,6]]},"1580":{"position":[[384,6]]},"1770":{"position":[[1278,6]]},"1947":{"position":[[281,6]]},"1960":{"position":[[372,6]]},"2028":{"position":[[674,6]]},"2058":{"position":[[6405,6],[6857,6]]},"2068":{"position":[[437,6]]},"2096":{"position":[[898,6]]}}}],["j",{"_index":2919,"t":{"504":{"position":[[527,2]]}}}],["jammi",{"_index":1870,"t":{"319":{"position":[[790,5],[810,5]]},"1161":{"position":[[132,5],[318,5],[473,5],[625,5],[779,5],[945,5],[1113,5],[1265,5],[1420,5],[1582,5],[1735,5],[1888,5],[2042,5],[2197,5],[2352,5],[2506,5],[2659,5],[2816,5],[2976,5],[3121,5],[3273,5],[3424,5],[3468,5],[3534,5],[3643,5],[3693,5],[3739,5],[3810,5],[3891,5],[3966,5],[4019,5],[4101,5]]},"1207":{"position":[[1863,5],[1974,5],[2085,5],[2196,5],[2307,5],[2418,5],[2529,5],[2640,5],[2751,5],[2862,5],[2973,5],[3084,5]]}}}],["jammy/st",{"_index":4916,"t":{"1207":{"position":[[332,12],[445,12],[558,12],[671,12],[784,12],[897,12],[1010,12],[1123,12],[1236,12],[1349,12],[1462,12],[1575,12],[1688,12],[1801,12],[1912,12],[2023,12],[2134,12],[2245,12],[2356,12],[2467,12],[2578,12],[2689,12],[2800,12],[2911,12],[3022,12],[3133,12]]}}}],["jan",{"_index":5437,"t":{"1377":{"position":[[758,3]]}}}],["java",{"_index":4979,"t":{"1262":{"position":[[2093,4],[2209,4]]},"1964":{"position":[[2511,5]]},"2028":{"position":[[66,5]]}}}],["javascript",{"_index":822,"t":{"142":{"position":[[446,10]]},"1280":{"position":[[887,12]]}}}],["jboss",{"_index":6481,"t":{"1962":{"position":[[4085,5],[4176,5]]}}}],["jdbc",{"_index":6630,"t":{"2028":{"position":[[2915,5]]}}}],["jenkin",{"_index":5494,"t":{"1411":{"position":[[617,8]]},"1445":{"position":[[428,8]]}}}],["jfrog",{"_index":6491,"t":{"1962":{"position":[[5367,5],[5373,5]]}}}],["jira",{"_index":6482,"t":{"1962":{"position":[[4091,4],[4182,4]]}}}],["jitsi",{"_index":427,"t":{"68":{"position":[[21,5],[130,5]]},"70":{"position":[[243,5]]}}}],["jitter",{"_index":6278,"t":{"1826":{"position":[[263,6]]}}}],["job",{"_index":526,"t":{"76":{"position":[[117,3],[153,4],[318,4],[465,4],[513,5]]},"311":{"position":[[403,4],[429,5],[443,4]]},"315":{"position":[[209,5],[256,5],[749,4],[776,4]]},"317":{"position":[[162,4],[265,4]]},"319":{"position":[[4,4],[112,3],[138,3],[175,4],[223,4],[315,3],[330,4],[395,4],[404,4],[740,4],[821,3],[968,3],[1011,3],[1023,4],[1063,5],[1110,4],[1149,4],[1336,3],[1360,3],[1447,4],[1705,3],[1917,3],[1950,3],[2086,3],[2102,3],[2130,3],[2167,3],[2527,3],[2560,4],[2610,3],[2620,3],[2749,3],[2955,3],[3068,3],[3196,4],[3258,4],[3339,3],[6055,4],[6723,4],[6931,4],[7023,5],[7053,5],[7095,3],[7466,3]]},"333":{"position":[[210,5],[407,4],[665,5]]},"335":{"position":[[252,4],[309,4]]},"337":{"position":[[217,3],[352,3],[493,3],[634,3],[1007,3],[1142,3],[1283,3],[1424,3],[1726,4],[1797,3],[1805,3]]},"339":{"position":[[28,4],[273,3],[288,3],[393,3],[504,3],[602,3],[1148,3],[1163,3],[1268,3],[1379,3],[1471,3]]},"341":{"position":[[11,3],[53,4]]},"457":{"position":[[6190,5],[6203,3],[6275,3],[6384,3]]},"641":{"position":[[53,4],[107,3]]},"825":{"position":[[21,4]]},"1084":{"position":[[53,4],[107,3]]},"1116":{"position":[[1667,4],[1718,4],[1858,4],[2120,4],[2273,4]]},"1130":{"position":[[6,4],[99,5],[114,4],[311,5]]},"1145":{"position":[[169,3]]},"1161":{"position":[[0,3]]},"1174":{"position":[[941,5],[958,3]]}}}],["job'",{"_index":1860,"t":{"319":{"position":[[486,5]]}}}],["job.post",{"_index":1888,"t":{"319":{"position":[[2977,8]]}}}],["jobs.yaml",{"_index":1813,"t":{"313":{"position":[[493,9],[568,9]]}}}],["jobservic",{"_index":2811,"t":{"486":{"position":[[1001,10]]}}}],["join",{"_index":26,"t":{"7":{"position":[[70,7]]},"9":{"position":[[76,4]]},"81":{"position":[[79,4]]},"83":{"position":[[121,4]]},"1018":{"position":[[0,4]]},"1389":{"position":[[66,4]]},"1423":{"position":[[66,4]]},"1458":{"position":[[66,4]]},"1494":{"position":[[66,4]]},"1513":{"position":[[66,4]]},"1891":{"position":[[4612,4]]},"2028":{"position":[[3037,6]]}}}],["joint",{"_index":72,"t":{"11":{"position":[[100,5]]}}}],["jointli",{"_index":5502,"t":{"1417":{"position":[[549,7]]},"1451":{"position":[[549,7]]}}}],["jq",{"_index":2470,"t":{"457":{"position":[[339,2]]},"674":{"position":[[137,2]]},"985":{"position":[[74,2],[257,2]]}}}],["jschoon",{"_index":217,"t":{"27":{"position":[[929,8],[938,8]]}}}],["json",{"_index":670,"t":{"100":{"position":[[1188,4]]},"783":{"position":[[109,5]]},"814":{"position":[[161,5]]},"1012":{"position":[[384,4]]},"1573":{"position":[[471,4]]},"1577":{"position":[[102,4]]},"2202":{"position":[[201,4]]},"2216":{"position":[[346,4]]}}}],["json.parse(reposjson",{"_index":672,"t":{"100":{"position":[[1243,22]]}}}],["jsonpath='{.data.values\\.yaml",{"_index":2830,"t":{"486":{"position":[[1995,31]]}}}],["jsonpath='{.status.loadbalancer.ingress",{"_index":2881,"t":{"491":{"position":[[1901,41]]}}}],["juli",{"_index":5394,"t":{"1349":{"position":[[216,5]]}}}],["jump",{"_index":4683,"t":{"1112":{"position":[[298,4],[656,4]]},"1704":{"position":[[743,4]]},"1731":{"position":[[765,4]]},"1853":{"position":[[240,4]]}}}],["jumphost",{"_index":2414,"t":{"424":{"position":[[508,8]]}}}],["jwt",{"_index":6507,"t":{"1964":{"position":[[3423,3]]},"2028":{"position":[[3974,4]]}}}],["k",{"_index":2629,"t":{"470":{"position":[[116,2]]},"504":{"position":[[536,2]]}}}],["k3",{"_index":6618,"t":{"2026":{"position":[[690,5]]}}}],["k8",{"_index":241,"t":{"27":{"position":[[1386,3]]},"100":{"position":[[179,3]]},"265":{"position":[[1082,3]]},"274":{"position":[[78,3],[94,3]]},"298":{"position":[[164,3]]},"300":{"position":[[34,3],[354,3]]},"321":{"position":[[220,3]]},"325":{"position":[[53,3]]},"331":{"position":[[88,3]]},"333":{"position":[[8,3]]},"335":{"position":[[87,3],[269,3]]},"337":{"position":[[66,3],[176,3],[311,3],[452,3],[593,3],[972,3],[1107,3],[1248,3],[1389,3],[1756,3]]},"339":{"position":[[52,3],[120,3],[235,3],[561,3],[737,3],[824,3],[1007,3],[1110,3],[1436,3],[1606,3],[1687,3]]},"345":{"position":[[317,3],[455,3]]},"356":{"position":[[161,3]]},"416":{"position":[[273,3]]},"420":{"position":[[832,3],[896,3],[2421,3],[2826,3],[4309,3]]},"422":{"position":[[21,3],[388,3],[430,4],[529,3],[780,3]]},"447":{"position":[[260,3],[371,3]]},"453":{"position":[[36,3]]},"457":{"position":[[498,3],[627,3],[1004,3],[3151,5],[8187,3],[8373,3]]},"462":{"position":[[354,3],[421,3],[520,3],[1860,3]]},"470":{"position":[[3004,3],[3434,5]]},"474":{"position":[[728,3],[3721,3]]},"476":{"position":[[1039,3]]},"482":{"position":[[23,3]]},"484":{"position":[[8,3],[433,3]]},"486":{"position":[[1502,3]]},"495":{"position":[[109,3]]},"500":{"position":[[39,5],[230,5],[346,5]]},"502":{"position":[[227,3]]},"504":{"position":[[20,3],[703,3]]},"1314":{"position":[[338,3],[353,3],[882,3],[1041,3]]},"1326":{"position":[[369,3]]},"1349":{"position":[[165,3],[332,3],[943,3],[1049,3]]},"1351":{"position":[[102,3],[224,3]]},"1353":{"position":[[270,3]]},"1355":{"position":[[1100,3]]},"1363":{"position":[[888,3]]},"1368":{"position":[[1183,3],[1211,3],[1440,3],[1461,3],[1541,3]]},"1372":{"position":[[90,3]]},"1374":{"position":[[637,3]]},"1381":{"position":[[82,3]]},"1387":{"position":[[4,3]]},"1397":{"position":[[302,3]]},"1402":{"position":[[248,3],[341,3],[659,3]]},"1405":{"position":[[63,3]]},"1415":{"position":[[16,3],[269,3]]},"1431":{"position":[[258,3],[571,3]]},"1439":{"position":[[177,3]]},"1486":{"position":[[291,3]]},"1488":{"position":[[369,3]]},"1665":{"position":[[979,3]]},"1874":{"position":[[339,3]]},"1888":{"position":[[1016,3],[1075,3],[1616,3]]},"1891":{"position":[[48,3],[2404,3]]},"1893":{"position":[[144,3]]},"1912":{"position":[[39,4],[161,3]]},"1977":{"position":[[2199,3],[2295,3]]},"2026":{"position":[[846,3]]}}}],["k8s.gcr.io",{"_index":5453,"t":{"1381":{"position":[[108,10]]}}}],["k8s.io/dis",{"_index":2895,"t":{"495":{"position":[[610,14]]}}}],["k9",{"_index":2199,"t":{"371":{"position":[[5,3],[23,3]]},"422":{"position":[[1278,4]]},"457":{"position":[[9908,3]]},"470":{"position":[[5364,3]]}}}],["k=kepler",{"_index":5938,"t":{"1700":{"position":[[741,9]]},"1747":{"position":[[371,9]]},"1788":{"position":[[571,9]]}}}],["kaa",{"_index":218,"t":{"27":{"position":[[947,4]]},"94":{"position":[[99,4]]},"292":{"position":[[621,4]]},"472":{"position":[[74,4],[754,4],[941,4]]},"1383":{"position":[[323,6]]},"1535":{"position":[[335,6],[430,5]]},"1543":{"position":[[142,4]]},"1575":{"position":[[111,7]]},"1588":{"position":[[1411,4],[1737,5]]},"1592":{"position":[[326,5]]},"1622":{"position":[[527,6],[622,5],[805,4]]},"1632":{"position":[[228,4]]},"1642":{"position":[[1373,5]]},"2214":{"position":[[281,4],[327,4]]}}}],["kaas.yaml",{"_index":5741,"t":{"1632":{"position":[[75,10],[381,9]]}}}],["katj",{"_index":1506,"t":{"223":{"position":[[0,7],[21,7]]}}}],["kcp",{"_index":2898,"t":{"495":{"position":[[809,3]]}}}],["keep",{"_index":513,"t":{"74":{"position":[[87,4]]},"152":{"position":[[236,4]]},"171":{"position":[[17,7]]},"233":{"position":[[419,4],[446,5]]},"317":{"position":[[255,4]]},"319":{"position":[[3689,4]]},"348":{"position":[[519,7]]},"352":{"position":[[118,4]]},"420":{"position":[[5078,4]]},"457":{"position":[[29,4]]},"639":{"position":[[31,4]]},"802":{"position":[[554,4],[1326,4]]},"1082":{"position":[[31,4]]},"1181":{"position":[[106,5]]},"1209":{"position":[[804,4]]},"1314":{"position":[[700,4]]},"1434":{"position":[[168,7]]},"1436":{"position":[[525,4]]},"1535":{"position":[[536,4],[653,4]]},"1610":{"position":[[1128,4]]},"1622":{"position":[[1470,4],[1851,4]]},"1636":{"position":[[946,4]]},"1661":{"position":[[125,4]]},"1810":{"position":[[1857,7]]},"1879":{"position":[[406,4]]},"1891":{"position":[[888,4],[1576,4]]},"1904":{"position":[[49,4]]},"1906":{"position":[[70,4]]},"1919":{"position":[[12,4]]},"1960":{"position":[[621,4]]},"2112":{"position":[[79,4]]}}}],["keepaliv",{"_index":3926,"t":{"821":{"position":[[154,10]]},"1308":{"position":[[573,11]]}}}],["keepass",{"_index":3449,"t":{"722":{"position":[[111,7]]}}}],["keppel",{"_index":6489,"t":{"1962":{"position":[[5032,6]]},"1964":{"position":[[1458,6]]},"1966":{"position":[[82,7],[5196,6]]}}}],["kept",{"_index":3912,"t":{"816":{"position":[[35,4]]},"1443":{"position":[[65,4]]},"1475":{"position":[[245,4]]},"1919":{"position":[[145,4]]},"2114":{"position":[[229,5]]}}}],["kernel",{"_index":1141,"t":{"175":{"position":[[1216,6]]},"177":{"position":[[591,6]]},"181":{"position":[[394,6]]},"185":{"position":[[1546,6],[1712,6]]},"587":{"position":[[406,6]]},"595":{"position":[[823,6]]},"693":{"position":[[83,6]]},"763":{"position":[[3274,6]]},"856":{"position":[[457,6],[521,6],[838,6]]},"1555":{"position":[[185,6]]},"1688":{"position":[[857,7]]},"1725":{"position":[[970,6]]},"1770":{"position":[[949,6]]},"1826":{"position":[[296,6],[826,7],[884,6],[1098,6],[1238,6]]},"1828":{"position":[[626,6],[865,7]]},"1835":{"position":[[41,6]]},"1837":{"position":[[420,6]]},"1891":{"position":[[4174,6]]}}}],["kernel'",{"_index":6298,"t":{"1828":{"position":[[583,8]]}}}],["kernel/hypervisor",{"_index":6074,"t":{"1725":{"position":[[1295,17]]},"1770":{"position":[[1493,17]]}}}],["key",{"_index":595,"t":{"92":{"position":[[222,3]]},"148":{"position":[[13,3]]},"175":{"position":[[1278,3]]},"195":{"position":[[769,3],[814,3]]},"319":{"position":[[3852,3],[3907,3]]},"341":{"position":[[379,3],[598,4],[749,3]]},"356":{"position":[[27,3]]},"420":{"position":[[1353,3]]},"474":{"position":[[2399,3],[2642,3],[2905,3],[3146,3]]},"476":{"position":[[1144,3],[1662,4]]},"636":{"position":[[104,4],[173,4]]},"718":{"position":[[530,3],[565,3],[688,3],[768,3],[815,5]]},"763":{"position":[[702,3],[806,3],[3522,4]]},"767":{"position":[[1297,3],[1347,3],[1902,3],[2427,4],[2892,3],[2942,4]]},"869":{"position":[[1322,3],[1459,3]]},"871":{"position":[[224,5],[256,4],[306,4],[328,4],[1083,4],[1102,4],[1193,5],[1214,4]]},"1010":{"position":[[64,3]]},"1034":{"position":[[4557,3]]},"1079":{"position":[[104,4],[173,4]]},"1170":{"position":[[914,3],[963,3],[1071,3]]},"1184":{"position":[[499,4],[585,4]]},"1314":{"position":[[454,3]]},"1407":{"position":[[129,3]]},"1555":{"position":[[125,3]]},"1559":{"position":[[164,3]]},"1582":{"position":[[4,3]]},"1632":{"position":[[136,5],[142,3],[521,5]]},"1634":{"position":[[492,3]]},"1636":{"position":[[0,3]]},"1638":{"position":[[133,3]]},"1640":{"position":[[0,3]]},"1680":{"position":[[600,3]]},"1717":{"position":[[600,3]]},"1762":{"position":[[499,3]]},"1814":{"position":[[626,3]]},"1824":{"position":[[136,5]]},"1868":{"position":[[31,3]]},"1870":{"position":[[0,3]]},"1872":{"position":[[0,3]]},"1893":{"position":[[1099,4]]},"1932":{"position":[[154,3]]},"1964":{"position":[[1581,3],[1671,3]]},"1975":{"position":[[582,3],[1105,3]]},"2101":{"position":[[4,3]]},"2133":{"position":[[84,5]]},"2135":{"position":[[289,5]]}}}],["key.pem",{"_index":4860,"t":{"1172":{"position":[[548,7]]}}}],["key/valu",{"_index":6772,"t":{"2116":{"position":[[230,9]]}}}],["key_nam",{"_index":4827,"t":{"1168":{"position":[[1514,9]]}}}],["keyboard",{"_index":4090,"t":{"860":{"position":[[597,8]]},"1826":{"position":[[166,8]]}}}],["keycloak",{"_index":1567,"t":{"239":{"position":[[415,8]]},"243":{"position":[[124,8]]},"245":{"position":[[231,8]]},"247":{"position":[[542,8],[659,8],[1031,9]]},"249":{"position":[[0,8],[168,8],[408,8],[505,8],[566,8]]},"251":{"position":[[1506,8]]},"800":{"position":[[655,9],[710,8]]},"802":{"position":[[58,9],[278,9],[318,8],[705,8],[851,9],[978,8],[1119,8],[1464,8],[2075,8],[2815,8]]},"821":{"position":[[165,8]]},"1112":{"position":[[243,8]]},"1260":{"position":[[155,8],[204,8]]},"1262":{"position":[[246,8],[275,8],[337,8],[561,8],[976,8],[1350,8],[1517,8],[1724,8],[2080,8],[2693,8],[3271,8],[4280,8],[4450,8]]},"1280":{"position":[[1022,8]]},"1308":{"position":[[596,8]]},"1340":{"position":[[54,8]]},"1344":{"position":[[128,8]]},"1400":{"position":[[375,8],[402,8],[478,10]]},"1434":{"position":[[981,8],[1009,8]]},"1471":{"position":[[194,9]]},"1567":{"position":[[519,8]]},"2026":{"position":[[478,8]]},"2028":{"position":[[0,9],[10,8],[665,8],[1075,8],[1622,8],[1790,8],[1861,8],[2244,8],[2562,8],[2658,8],[2754,8],[2868,8],[3028,8],[3705,8]]},"2032":{"position":[[529,8],[565,8],[819,8]]},"2077":{"position":[[2394,9],[2418,8],[2489,8]]}}}],["keycloak'",{"_index":6627,"t":{"2028":{"position":[[1488,10]]}}}],["keycloak.testbed.osism.xyz",{"_index":3850,"t":{"802":{"position":[[1003,27]]}}}],["keycloak_realm",{"_index":3848,"t":{"802":{"position":[[920,14]]}}}],["keygen",{"_index":5489,"t":{"1407":{"position":[[166,6]]}}}],["keypair",{"_index":2049,"t":{"339":{"position":[[949,7],[1812,7]]},"420":{"position":[[1341,7]]},"780":{"position":[[206,7]]},"933":{"position":[[378,7]]},"1168":{"position":[[629,8],[1528,7]]},"1174":{"position":[[419,7]]}}}],["keyr",{"_index":3177,"t":{"655":{"position":[[17,7]]}}}],["keyston",{"_index":390,"t":{"44":{"position":[[64,11]]},"51":{"position":[[59,11]]},"245":{"position":[[0,8],[178,8]]},"247":{"position":[[0,8],[172,8],[529,8],[739,8],[800,8],[1050,8]]},"251":{"position":[[21,8],[206,8],[817,8],[875,8],[1403,9]]},"253":{"position":[[60,8],[180,8]]},"255":{"position":[[108,9]]},"585":{"position":[[39,8],[129,8],[348,8]]},"659":{"position":[[241,8],[288,8],[333,8],[372,8],[438,8],[478,8],[517,8],[555,8],[587,8],[648,8],[683,8],[735,10],[1040,8]]},"749":{"position":[[96,8],[314,8]]},"800":{"position":[[495,9],[579,9]]},"802":{"position":[[1253,11],[1936,8],[2676,8]]},"821":{"position":[[385,8]]},"873":{"position":[[317,8]]},"906":{"position":[[20,8],[41,8]]},"1038":{"position":[[2176,10]]},"1187":{"position":[[14,9],[35,8]]},"1228":{"position":[[20,8],[52,8]]},"1308":{"position":[[633,9]]},"1400":{"position":[[363,8]]},"1434":{"position":[[949,8],[1095,8]]},"1471":{"position":[[251,9]]},"1964":{"position":[[3413,9]]},"2028":{"position":[[2325,9]]},"2039":{"position":[[266,8]]},"2041":{"position":[[142,8],[184,8],[225,8],[268,8],[309,8],[354,8],[481,8]]},"2043":{"position":[[64,8],[120,8]]},"2045":{"position":[[32,9],[210,8],[721,8],[806,8]]},"2047":{"position":[[68,8]]},"2051":{"position":[[396,8],[920,8],[1120,8],[1461,8]]},"2056":{"position":[[55,8]]},"2058":{"position":[[42,8]]},"2065":{"position":[[254,8]]},"2068":{"position":[[1236,8],[1396,9],[2158,8]]},"2077":{"position":[[3196,8],[3564,9]]}}}],["keystone'",{"_index":6664,"t":{"2051":{"position":[[1232,10],[1336,10]]}}}],["keystone.conf",{"_index":1583,"t":{"247":{"position":[[431,13]]},"251":{"position":[[1598,13]]},"2030":{"position":[[73,13]]}}}],["keyword",{"_index":1886,"t":{"319":{"position":[[2779,7]]},"1975":{"position":[[1391,9]]}}}],["kib",{"_index":4548,"t":{"1038":{"position":[[286,3],[943,3]]}}}],["kibana",{"_index":3835,"t":{"800":{"position":[[769,6],[811,6]]},"1308":{"position":[[416,7]]}}}],["kind",{"_index":1087,"t":{"173":{"position":[[353,4]]},"327":{"position":[[326,4]]},"363":{"position":[[467,5]]},"422":{"position":[[1178,4]]},"424":{"position":[[89,4]]},"449":{"position":[[193,4]]},"451":{"position":[[793,4]]},"453":{"position":[[85,4]]},"457":{"position":[[2162,6],[9726,4]]},"470":{"position":[[141,4],[146,4],[1193,5],[1199,4],[4563,4],[4568,4]]},"480":{"position":[[920,4],[925,5]]},"1262":{"position":[[2177,4]]},"1516":{"position":[[565,5]]},"1535":{"position":[[67,5]]},"1622":{"position":[[257,5]]},"1926":{"position":[[1341,4]]},"1932":{"position":[[711,4]]},"1947":{"position":[[320,4],[405,4]]},"2015":{"position":[[1068,4]]},"2028":{"position":[[2005,4]]},"2030":{"position":[[350,4]]},"2088":{"position":[[66,4]]},"2106":{"position":[[618,5]]},"2116":{"position":[[103,5]]},"2128":{"position":[[93,5]]},"2135":{"position":[[489,4]]},"2164":{"position":[[305,4]]}}}],["kind_flavor",{"_index":2233,"t":{"416":{"position":[[222,11]]}}}],["kind_mtu",{"_index":2262,"t":{"418":{"position":[[764,8]]}}}],["kinder",{"_index":1491,"t":{"221":{"position":[[0,7],[20,7],[42,7]]}}}],["knativ",{"_index":6643,"t":{"2028":{"position":[[5543,8]]}}}],["knight",{"_index":214,"t":{"27":{"position":[[857,6],[1122,6]]}}}],["know",{"_index":439,"t":{"68":{"position":[[185,5]]},"311":{"position":[[294,5],[384,4]]},"313":{"position":[[69,5]]},"317":{"position":[[1686,4]]},"319":{"position":[[34,5]]},"856":{"position":[[97,4]]},"1932":{"position":[[3322,4]]},"2143":{"position":[[195,4]]},"2172":{"position":[[138,5],[292,4]]},"2196":{"position":[[178,4]]}}}],["knowledg",{"_index":620,"t":{"94":{"position":[[35,10]]},"96":{"position":[[23,9]]},"166":{"position":[[486,10]]},"298":{"position":[[0,10]]},"307":{"position":[[46,9],[67,9]]},"1665":{"position":[[433,9],[889,9]]},"1667":{"position":[[1001,10]]},"1996":{"position":[[108,10]]},"2004":{"position":[[450,10]]}}}],["knowledgebas",{"_index":3500,"t":{"732":{"position":[[239,14]]}}}],["known",{"_index":1603,"t":{"249":{"position":[[58,5]]},"267":{"position":[[154,5]]},"286":{"position":[[177,5]]},"307":{"position":[[14,5]]},"311":{"position":[[110,5]]},"352":{"position":[[2439,5]]},"763":{"position":[[3527,6],[3546,5]]},"773":{"position":[[386,5]]},"850":{"position":[[1656,5],[3369,5]]},"1116":{"position":[[2570,5]]},"1122":{"position":[[1463,5]]},"1312":{"position":[[14,5]]},"1377":{"position":[[418,6]]},"1387":{"position":[[205,5]]},"2090":{"position":[[256,5]]},"2124":{"position":[[203,5],[339,6]]},"2157":{"position":[[63,5]]}}}],["known/openid",{"_index":3866,"t":{"802":{"position":[[2222,12],[2962,12]]},"1262":{"position":[[1663,12]]}}}],["kolla",{"_index":1669,"t":{"269":{"position":[[113,5]]},"729":{"position":[[2661,5]]},"819":{"position":[[188,5]]},"873":{"position":[[466,5],[524,5]]},"877":{"position":[[19,5],[74,5],[164,5],[231,5]]},"889":{"position":[[71,5]]},"933":{"position":[[319,5],[340,5],[360,5],[388,5],[411,5],[457,5],[480,5],[501,5],[520,5],[542,5],[568,5],[585,5],[604,5],[624,5],[644,5],[661,5],[681,5],[700,5],[718,5]]},"1032":{"position":[[424,5]]},"1034":{"position":[[3015,5],[3154,5],[6664,5],[8468,5]]},"1041":{"position":[[606,9]]},"1105":{"position":[[708,5]]},"1116":{"position":[[697,5],[778,6],[1286,5],[1592,5]]},"1130":{"position":[[396,5]]},"1195":{"position":[[19,5],[74,5],[157,5],[221,5]]},"1332":{"position":[[588,5]]},"1337":{"position":[[18,5]]},"1365":{"position":[[176,5],[186,5]]},"1397":{"position":[[536,5],[546,5]]},"1411":{"position":[[929,6]]},"1431":{"position":[[821,5],[831,5]]},"1441":{"position":[[288,5]]},"1567":{"position":[[655,5]]},"2032":{"position":[[782,5]]}}}],["kolla_action=pul",{"_index":4610,"t":{"1041":{"position":[[631,20]]}}}],["kolla_address",{"_index":3565,"t":{"746":{"position":[[1135,13],[1211,13]]}}}],["kolla_address(host",{"_index":3571,"t":{"746":{"position":[[1388,19],[1566,19]]}}}],["kolla_dock",{"_index":4420,"t":{"1034":{"position":[[2717,12],[2840,12]]}}}],["kolla_external_vip_interfac",{"_index":3480,"t":{"729":{"position":[[2756,29]]},"744":{"position":[[104,28]]}}}],["kolla_log",{"_index":3594,"t":{"746":{"position":[[2899,13]]},"1034":{"position":[[2602,10]]}}}],["kolla_start",{"_index":3602,"t":{"746":{"position":[[3656,12]]},"1026":{"position":[[199,11]]}}}],["kolla_toolbox",{"_index":4907,"t":{"1187":{"position":[[341,13],[465,13],[479,13]]}}}],["kraken",{"_index":6493,"t":{"1962":{"position":[[5508,6]]},"1964":{"position":[[4367,6]]},"1966":{"position":[[98,7],[4901,6]]}}}],["kuard.yaml",{"_index":2915,"t":{"504":{"position":[[451,11]]}}}],["kube",{"_index":1961,"t":{"323":{"position":[[390,4],[568,4],[729,4]]},"329":{"position":[[1518,4]]},"457":{"position":[[5927,4],[6018,4]]},"1872":{"position":[[82,5],[166,4]]},"1874":{"position":[[367,4]]}}}],["kube/config",{"_index":2462,"t":{"453":{"position":[[1244,14]]}}}],["kube_image_raw",{"_index":2299,"t":{"420":{"position":[[961,14]]}}}],["kubeadm",{"_index":2083,"t":{"348":{"position":[[206,7],[493,7],[602,7],[687,7]]},"350":{"position":[[78,7]]},"457":{"position":[[2539,7],[2552,7],[2623,7],[2636,7],[4870,7]]},"1888":{"position":[[1051,7]]},"1891":{"position":[[475,8]]},"1996":{"position":[[263,7]]}}}],["kubeadmconfigtempl",{"_index":2738,"t":{"474":{"position":[[3387,21]]},"476":{"position":[[1396,21]]}}}],["kubeadmconfigtemplate\").spec.template.spec.prekubeadmcommand",{"_index":2736,"t":{"474":{"position":[[2771,62],[3030,62]]}}}],["kubeadmcontrolplan",{"_index":2737,"t":{"474":{"position":[[3308,19]]},"476":{"position":[[1372,19]]}}}],["kubeadmcontrolplane\").spec.kubeadmconfigspec.prekubeadmcommand",{"_index":2730,"t":{"474":{"position":[[2263,64],[2524,64]]}}}],["kubeadmcontrolplane/testclust",{"_index":2116,"t":{"352":{"position":[[1468,31]]}}}],["kubeadmcontrolplanetempl",{"_index":2900,"t":{"495":{"position":[[902,29]]}}}],["kubeapi",{"_index":2141,"t":{"352":{"position":[[2628,8]]}}}],["kubecon",{"_index":6471,"t":{"1962":{"position":[[2391,7],[3623,7],[3646,7]]}}}],["kubeconfig",{"_index":2094,"t":{"352":{"position":[[156,10]]},"365":{"position":[[9,10],[38,10]]},"440":{"position":[[379,10],[418,10],[471,10]]},"449":{"position":[[395,10],[690,10]]},"493":{"position":[[406,10]]},"504":{"position":[[193,10]]},"1912":{"position":[[118,10]]}}}],["kubeconfig=$clustername.yaml",{"_index":2646,"t":{"470":{"position":[[2286,29]]}}}],["kubeconfig=testcluster/testcluster.yaml",{"_index":2520,"t":{"457":{"position":[[6032,39],[6329,39],[6437,39]]}}}],["kubeconfig=~/clustername/clustername.yaml",{"_index":2777,"t":{"480":{"position":[[832,41]]}}}],["kubectl",{"_index":2092,"t":{"352":{"position":[[20,7],[364,7],[523,7],[736,7],[843,7],[913,7],[1985,7],[2173,7]]},"354":{"position":[[34,7],[129,7]]},"420":{"position":[[4064,7]]},"422":{"position":[[1247,9]]},"436":{"position":[[5,7]]},"440":{"position":[[461,7]]},"453":{"position":[[1216,7]]},"457":{"position":[[172,8],[5980,7],[6260,7],[6369,7]]},"459":{"position":[[341,7]]},"462":{"position":[[1098,7]]},"470":{"position":[[96,7],[1975,7],[2216,7],[4236,7],[4532,7],[4613,7]]},"480":{"position":[[785,7],[874,8]]},"482":{"position":[[371,7],[532,7]]},"486":{"position":[[751,7],[835,7],[1593,7],[1771,7],[1958,7]]},"489":{"position":[[185,7]]},"491":{"position":[[427,7],[645,7],[1391,7],[1840,7],[2082,7]]},"504":{"position":[[163,7],[231,8]]}}}],["kubernet",{"_index":1573,"t":{"243":{"position":[[50,11],[110,10]]},"280":{"position":[[131,10],[203,10]]},"286":{"position":[[203,10]]},"292":{"position":[[122,10],[202,10],[626,11],[726,10]]},"296":{"position":[[318,10]]},"298":{"position":[[28,11]]},"300":{"position":[[125,10],[716,10],[922,10],[1037,10]]},"304":{"position":[[75,10],[227,10]]},"339":{"position":[[205,10],[1080,10]]},"348":{"position":[[411,10]]},"352":{"position":[[94,10],[192,10],[336,10]]},"354":{"position":[[223,10],[311,10]]},"356":{"position":[[51,11],[302,10]]},"363":{"position":[[430,10],[697,10],[837,10]]},"377":{"position":[[224,10]]},"420":{"position":[[667,10],[3458,10]]},"424":{"position":[[33,10],[113,10],[191,10],[394,10]]},"434":{"position":[[40,10]]},"440":{"position":[[333,10]]},"449":{"position":[[182,10]]},"451":{"position":[[52,10]]},"453":{"position":[[1080,10]]},"457":{"position":[[6731,10],[7348,10],[7623,10],[8005,10],[8078,10],[9011,12]]},"462":{"position":[[1256,10],[1483,10],[1557,10],[1602,10],[1707,10],[2520,10],[2616,10],[2829,10],[3449,10],[3517,10],[4132,10]]},"470":{"position":[[3077,10]]},"482":{"position":[[56,10]]},"504":{"position":[[550,11]]},"821":{"position":[[174,10]]},"827":{"position":[[148,11]]},"829":{"position":[[244,10],[443,10]]},"1326":{"position":[[217,10]]},"1349":{"position":[[76,10]]},"1355":{"position":[[1049,10],[1068,10]]},"1365":{"position":[[730,10]]},"1368":{"position":[[1508,10]]},"1377":{"position":[[588,10]]},"1383":{"position":[[603,10]]},"1397":{"position":[[22,10],[52,10],[191,10]]},"1431":{"position":[[22,10],[61,10]]},"1467":{"position":[[4,10],[73,10]]},"1469":{"position":[[59,10]]},"1516":{"position":[[187,10]]},"1535":{"position":[[311,10]]},"1543":{"position":[[147,13]]},"1569":{"position":[[43,10],[148,10]]},"1571":{"position":[[85,10],[163,11]]},"1575":{"position":[[87,10]]},"1592":{"position":[[352,10]]},"1622":{"position":[[503,10]]},"1755":{"position":[[192,10]]},"1796":{"position":[[328,10]]},"1874":{"position":[[897,10]]},"1888":{"position":[[763,10]]},"1904":{"position":[[75,10],[147,10],[222,10],[283,10],[548,10],[855,10]]},"1906":{"position":[[0,10],[123,10],[306,11],[386,10]]},"1910":{"position":[[78,10],[116,10]]},"1915":{"position":[[4,10],[327,10],[681,11],[714,10],[820,10]]},"1917":{"position":[[0,10],[507,10],[877,10]]},"1919":{"position":[[44,10],[115,10],[700,10],[781,10],[808,10],[945,11]]},"1921":{"position":[[68,10],[107,10],[127,10],[153,10]]},"1941":{"position":[[351,10]]},"1945":{"position":[[117,10]]},"1947":{"position":[[186,10],[262,10]]},"1956":{"position":[[226,10]]},"1964":{"position":[[765,10]]},"1966":{"position":[[3780,11]]},"1971":{"position":[[2,10]]},"1975":{"position":[[459,10],[771,10],[2225,10],[2473,10]]},"1977":{"position":[[597,11],[1165,10],[1233,10],[2810,10]]},"1981":{"position":[[0,10],[45,10]]},"2007":{"position":[[2,10]]},"2011":{"position":[[321,10]]},"2013":{"position":[[90,11],[138,10]]},"2015":{"position":[[65,10],[133,10],[519,10]]},"2017":{"position":[[52,10]]},"2026":{"position":[[673,10]]},"2028":{"position":[[2633,10],[5515,10],[5850,10]]}}}],["kubernetes/config",{"_index":2645,"t":{"470":{"position":[[2242,20]]}}}],["kubernetes_verion",{"_index":2295,"t":{"420":{"position":[[796,20]]}}}],["kubernetes_vers",{"_index":2205,"t":{"377":{"position":[[58,19]]},"420":{"position":[[616,18],[635,18]]},"462":{"position":[[226,18]]}}}],["kubevirt",{"_index":6579,"t":{"1998":{"position":[[1578,9]]},"2004":{"position":[[1179,9]]}}}],["kuma",{"_index":6731,"t":{"2094":{"position":[[1526,5]]}}}],["kurt",{"_index":446,"t":{"68":{"position":[[308,4]]}}}],["kustom",{"_index":2466,"t":{"457":{"position":[[181,10]]},"1381":{"position":[[18,9]]}}}],["kv_alloc",{"_index":4580,"t":{"1038":{"position":[[1207,9]]}}}],["kvm",{"_index":2989,"t":{"573":{"position":[[101,3]]},"593":{"position":[[230,4],[275,3],[330,5]]},"1308":{"position":[[493,4]]},"1694":{"position":[[40,4],[185,3],[189,3]]},"1696":{"position":[[718,3]]},"1725":{"position":[[985,3]]},"1741":{"position":[[40,4],[185,3],[189,3]]},"1743":{"position":[[728,3]]},"1770":{"position":[[964,3]]},"1782":{"position":[[53,4],[197,3],[201,3]]},"1784":{"position":[[741,3]]}}}],["l",{"_index":2130,"t":{"352":{"position":[[2014,1],[2202,1]]},"763":{"position":[[2574,1],[3391,1]]},"767":{"position":[[3033,2]]},"941":{"position":[[725,1]]},"1010":{"position":[[2680,1],[3251,1],[3404,1]]},"1207":{"position":[[3769,1]]},"1688":{"position":[[81,1],[431,1],[1184,1]]},"1704":{"position":[[692,3]]},"1706":{"position":[[870,2]]},"1725":{"position":[[173,1],[523,1],[1536,1]]},"1731":{"position":[[714,3]]},"1733":{"position":[[1060,2]]},"1739":{"position":[[735,1]]},"1770":{"position":[[173,1],[523,1],[1838,1]]},"1776":{"position":[[905,2]]},"1780":{"position":[[733,1]]},"1843":{"position":[[526,4]]},"1853":{"position":[[189,3]]}}}],["l)gplv2",{"_index":1173,"t":{"177":{"position":[[763,8]]}}}],["l,v,t,c",{"_index":5809,"t":{"1683":{"position":[[168,7]]},"1720":{"position":[[227,7]]},"1765":{"position":[[227,7]]}}}],["l/a/gpl",{"_index":1175,"t":{"177":{"position":[[790,7]]}}}],["l/v/t/c[i",{"_index":5818,"t":{"1685":{"position":[[98,10]]}}}],["l1_support_contact",{"_index":6265,"t":{"1816":{"position":[[1770,18]]}}}],["l1tf",{"_index":5841,"t":{"1688":{"position":[[619,5],[894,4],[1583,4]]},"1725":{"position":[[726,5],[1030,4],[1404,5],[1935,4]]},"1770":{"position":[[726,5],[1027,4],[1636,4],[2237,4]]}}}],["l3",{"_index":2362,"t":{"420":{"position":[[4642,4]]},"595":{"position":[[994,2]]},"729":{"position":[[1124,2]]},"1786":{"position":[[1170,2]]}}}],["l=ada",{"_index":6134,"t":{"1747":{"position":[[431,5]]},"1788":{"position":[[631,5]]}}}],["label",{"_index":594,"t":{"92":{"position":[[185,8],[211,6],[483,5],[489,5]]},"162":{"position":[[378,5]]},"231":{"position":[[337,5]]},"319":{"position":[[796,6]]},"337":{"position":[[141,5],[239,5],[384,5],[522,5],[756,5],[866,5],[937,5],[1029,5],[1174,5],[1312,5],[1558,5],[1674,5]]},"345":{"position":[[199,5],[241,6],[832,7],[898,6],[1018,5],[1095,6],[1181,6],[1456,5],[1820,5],[2026,5],[2093,5]]},"495":{"position":[[996,6]]},"1130":{"position":[[75,5],[130,5],[181,5],[239,5],[326,5]]},"1449":{"position":[[308,6]]},"1683":{"position":[[269,5]]},"1720":{"position":[[328,5]]},"1755":{"position":[[235,7],[243,6]]},"1765":{"position":[[328,5]]},"1796":{"position":[[371,7],[379,6]]},"1975":{"position":[[611,6],[979,6],[1098,6],[1996,8]]},"1977":{"position":[[3023,8]]},"1979":{"position":[[1214,7],[1277,6]]},"2015":{"position":[[1076,8]]},"2116":{"position":[[0,6],[212,6]]},"2139":{"position":[[504,5]]}}}],["lack",{"_index":475,"t":{"70":{"position":[[367,4],[586,4]]},"302":{"position":[[188,4]]},"583":{"position":[[631,5]]},"1688":{"position":[[1267,4],[1548,4]]},"1725":{"position":[[1254,7],[1619,4],[1900,4]]},"1770":{"position":[[1921,4],[2202,4]]},"1998":{"position":[[317,4],[474,5]]},"2004":{"position":[[636,4]]},"2028":{"position":[[5720,7]]}}}],["lake",{"_index":5847,"t":{"1688":{"position":[[922,5]]},"1698":{"position":[[388,4],[435,4]]},"1708":{"position":[[752,4]]},"1725":{"position":[[1058,5]]},"1745":{"position":[[479,4],[526,4],[1181,4]]},"1751":{"position":[[791,4]]},"1770":{"position":[[1055,5]]},"1786":{"position":[[700,4],[747,4]]},"1792":{"position":[[791,4]]}}}],["lakritz",{"_index":1508,"t":{"223":{"position":[[29,8]]}}}],["land",{"_index":1375,"t":{"195":{"position":[[342,7]]}}}],["landscap",{"_index":5559,"t":{"1469":{"position":[[359,9]]},"1960":{"position":[[737,9]]},"1966":{"position":[[4419,10]]}}}],["lang",{"_index":4521,"t":{"1036":{"position":[[214,4]]}}}],["lang=\"en_us.utf",{"_index":3904,"t":{"812":{"position":[[403,15]]}}}],["lang=c",{"_index":4520,"t":{"1036":{"position":[[183,6],[195,6]]}}}],["languag",{"_index":804,"t":{"142":{"position":[[20,8],[84,8],[217,8]]},"177":{"position":[[819,8]]},"195":{"position":[[553,9]]},"860":{"position":[[443,9],[501,8]]},"1274":{"position":[[201,9]]},"1280":{"position":[[141,10]]},"1895":{"position":[[41,9]]},"2155":{"position":[[274,8]]}}}],["lang|local",{"_index":3903,"t":{"812":{"position":[[391,11]]}}}],["lanyard",{"_index":1455,"t":{"210":{"position":[[9,8]]}}}],["laptop",{"_index":2416,"t":{"424":{"position":[[551,7]]},"1984":{"position":[[415,7]]},"1988":{"position":[[114,7]]}}}],["larg",{"_index":1290,"t":{"183":{"position":[[1328,5]]},"567":{"position":[[46,5],[308,5],[376,5]]},"667":{"position":[[37,5]]},"985":{"position":[[23,5],[309,5],[399,6]]},"1351":{"position":[[61,5]]},"1417":{"position":[[702,7]]},"1451":{"position":[[702,7]]},"1680":{"position":[[208,5]]},"1692":{"position":[[761,5]]},"1717":{"position":[[208,5]]},"1729":{"position":[[833,5]]},"1762":{"position":[[208,5]]},"1774":{"position":[[974,5]]},"1841":{"position":[[208,5]]},"1893":{"position":[[411,5]]},"1966":{"position":[[4094,5],[4386,5]]},"2013":{"position":[[209,5],[602,5]]},"2017":{"position":[[37,5]]},"2094":{"position":[[95,5]]}}}],["larger",{"_index":1119,"t":{"175":{"position":[[652,6]]},"420":{"position":[[3372,6]]},"816":{"position":[[349,6]]},"860":{"position":[[2093,7]]},"1690":{"position":[[177,6]]},"1692":{"position":[[1489,7]]},"1706":{"position":[[650,6]]},"1727":{"position":[[178,6]]},"1729":{"position":[[1695,7]]},"1733":{"position":[[812,6]]},"1772":{"position":[[178,6]]},"1774":{"position":[[1836,7]]},"1776":{"position":[[657,6]]}}}],["last",{"_index":3010,"t":{"583":{"position":[[440,4]]},"632":{"position":[[1357,4],[1444,4]]},"746":{"position":[[2294,4]]},"763":{"position":[[3066,4]]},"954":{"position":[[44,4]]},"1028":{"position":[[80,4]]},"1075":{"position":[[1357,4],[1444,4]]},"1116":{"position":[[26,4],[2790,4]]},"1314":{"position":[[268,4]]},"1377":{"position":[[739,4]]},"1383":{"position":[[4,4]]},"1810":{"position":[[3466,4],[3681,4],[3692,4],[4099,4]]},"1926":{"position":[[901,4]]},"1932":{"position":[[2977,4]]},"2096":{"position":[[1577,4],[1601,4],[1623,4],[1646,4]]}}}],["lastnam",{"_index":4997,"t":{"1262":{"position":[[4131,9]]}}}],["late",{"_index":1545,"t":{"233":{"position":[[144,4]]}}}],["latenc",{"_index":2342,"t":{"420":{"position":[[3145,8]]},"468":{"position":[[513,10],[754,9],[1003,7],[1212,10],[1473,7]]},"561":{"position":[[430,7]]},"1431":{"position":[[529,7]]},"1692":{"position":[[417,7],[549,7]]},"1729":{"position":[[489,7],[621,7]]},"1774":{"position":[[489,7],[621,7]]},"1888":{"position":[[471,8],[600,7],[1242,10],[1267,9],[1292,9],[1389,7],[1478,7],[1853,9]]},"1891":{"position":[[1914,10],[2287,9],[2673,8],[3818,8],[3970,7],[5306,8],[6018,7]]},"1893":{"position":[[567,7]]},"1897":{"position":[[293,8]]},"1899":{"position":[[332,7]]},"2028":{"position":[[736,7]]}}}],["latency/bandwidth/iop",{"_index":6448,"t":{"1949":{"position":[[30,26]]}}}],["later",{"_index":1424,"t":{"204":{"position":[[713,5]]},"459":{"position":[[118,6]]},"470":{"position":[[2862,5]]},"474":{"position":[[3876,5]]},"476":{"position":[[1521,5],[2148,6]]},"478":{"position":[[923,6]]},"718":{"position":[[636,6]]},"737":{"position":[[481,6]]},"769":{"position":[[740,5]]},"860":{"position":[[1044,5],[2943,5]]},"873":{"position":[[291,5]]},"1014":{"position":[[201,6]]},"1124":{"position":[[223,5]]},"1749":{"position":[[90,5]]},"1790":{"position":[[113,5]]},"1810":{"position":[[1464,5],[1522,5]]},"1908":{"position":[[37,5],[108,5]]},"1919":{"position":[[225,5],[305,5]]},"1975":{"position":[[2504,5]]}}}],["latest",{"_index":764,"t":{"129":{"position":[[814,6],[891,6]]},"144":{"position":[[326,6]]},"280":{"position":[[64,6]]},"363":{"position":[[1436,6]]},"420":{"position":[[727,6],[2798,6],[2983,6]]},"457":{"position":[[1212,6],[1702,6],[2400,6],[9585,6]]},"470":{"position":[[3560,6]]},"632":{"position":[[547,6]]},"641":{"position":[[62,6]]},"714":{"position":[[133,6],[175,7]]},"716":{"position":[[21,6],[163,6],[213,6]]},"724":{"position":[[276,8],[1455,8]]},"791":{"position":[[371,6]]},"827":{"position":[[63,6]]},"834":{"position":[[46,6]]},"860":{"position":[[222,6],[386,6]]},"926":{"position":[[76,7]]},"1075":{"position":[[547,6]]},"1084":{"position":[[62,6]]},"1114":{"position":[[376,6],[445,6]]},"1168":{"position":[[2077,6]]},"1326":{"position":[[160,6]]},"1368":{"position":[[1294,6],[1366,6]]},"1397":{"position":[[15,6]]},"1413":{"position":[[94,6]]},"1431":{"position":[[15,6]]},"1465":{"position":[[167,6]]},"1571":{"position":[[200,6]]},"1632":{"position":[[261,6]]},"1634":{"position":[[717,6]]},"1638":{"position":[[253,6]]},"1669":{"position":[[1026,6]]},"1688":{"position":[[543,6]]},"1725":{"position":[[650,6]]},"1770":{"position":[[650,6]]},"1805":{"position":[[421,6]]},"1810":{"position":[[141,6]]},"1904":{"position":[[502,6]]},"1908":{"position":[[13,6],[84,6]]},"1919":{"position":[[37,6],[184,6],[264,6]]}}}],["latter",{"_index":1664,"t":{"267":{"position":[[223,6]]},"1622":{"position":[[1344,6]]},"1634":{"position":[[200,6]]},"1810":{"position":[[2452,6]]},"1874":{"position":[[937,6]]},"1893":{"position":[[182,6]]},"1897":{"position":[[98,6]]}}}],["launch",{"_index":3003,"t":{"579":{"position":[[361,9]]},"1901":{"position":[[273,8]]}}}],["launched_at",{"_index":5075,"t":{"1298":{"position":[[953,12],[11512,12]]}}}],["launcher",{"_index":4848,"t":{"1170":{"position":[[797,8]]}}}],["launchpad",{"_index":6674,"t":{"2061":{"position":[[346,9]]},"2068":{"position":[[2084,9]]}}}],["law",{"_index":1241,"t":{"181":{"position":[[102,3]]}}}],["lawyer",{"_index":1212,"t":{"177":{"position":[[2250,7]]},"185":{"position":[[2056,7]]}}}],["layer",{"_index":621,"t":{"94":{"position":[[52,5]]},"265":{"position":[[293,5],[989,5]]},"269":{"position":[[225,6]]},"276":{"position":[[100,7]]},"292":{"position":[[14,5],[354,5]]},"294":{"position":[[73,5]]},"296":{"position":[[14,5],[216,5],[376,5]]},"298":{"position":[[288,6],[482,5],[542,5]]},"300":{"position":[[580,5]]},"304":{"position":[[14,5],[110,5],[592,6]]},"327":{"position":[[370,5],[709,6]]},"352":{"position":[[2525,6]]},"537":{"position":[[19,6]]},"561":{"position":[[316,5]]},"567":{"position":[[741,5]]},"595":{"position":[[671,6]]},"708":{"position":[[283,8]]},"775":{"position":[[231,5],[389,6]]},"1268":{"position":[[45,8]]},"1326":{"position":[[358,5]]},"1349":{"position":[[14,5]]},"1351":{"position":[[45,5]]},"1383":{"position":[[330,6]]},"1417":{"position":[[141,5]]},"1429":{"position":[[108,5]]},"1451":{"position":[[141,5]]},"1475":{"position":[[106,5]]},"1535":{"position":[[246,6]]},"1543":{"position":[[94,6],[530,6],[582,6]]},"1551":{"position":[[153,7]]},"1553":{"position":[[9,5],[132,6]]},"1569":{"position":[[67,6]]},"1577":{"position":[[209,5],[453,6]]},"1619":{"position":[[79,6]]},"1622":{"position":[[438,6],[685,6],[810,7]]},"1634":{"position":[[189,6]]},"1636":{"position":[[186,5]]},"1638":{"position":[[96,5]]},"1644":{"position":[[222,6]]},"1665":{"position":[[351,5],[773,5]]},"1717":{"position":[[1624,5]]},"1762":{"position":[[1523,5]]},"1886":{"position":[[290,5],[546,5]]},"1888":{"position":[[234,6],[692,5],[855,5]]},"1891":{"position":[[5607,6]]},"1893":{"position":[[280,5]]},"1973":{"position":[[250,5]]},"1979":{"position":[[276,6]]},"1998":{"position":[[927,7],[1051,7]]},"2009":{"position":[[226,5]]},"2022":{"position":[[1388,6]]},"2024":{"position":[[25,7],[596,6]]},"2196":{"position":[[95,6]]},"2198":{"position":[[343,5],[428,5],[528,6]]},"2206":{"position":[[260,6],[321,5]]}}}],["layout",{"_index":3376,"t":{"708":{"position":[[64,7]]},"836":{"position":[[56,6]]},"858":{"position":[[651,7]]},"860":{"position":[[606,6]]},"1010":{"position":[[22,6]]}}}],["lb",{"_index":1972,"t":{"325":{"position":[[80,4],[575,2],[909,2]]},"327":{"position":[[334,2],[440,2],[629,2]]},"329":{"position":[[1499,2]]},"420":{"position":[[4371,2],[4438,2]]}}}],["lba",{"_index":4201,"t":{"954":{"position":[[61,4]]}}}],["lbaa",{"_index":3943,"t":{"829":{"position":[[219,7],[417,7]]}}}],["lbaf=.servic",{"_index":4324,"t":{"1014":{"position":[[1230,18]]},"1016":{"position":[[1496,18]]}}}],["meal",{"_index":1525,"t":{"227":{"position":[[309,5]]}}}],["mean",{"_index":1638,"t":{"265":{"position":[[82,5]]},"319":{"position":[[3052,5],[3172,5]]},"390":{"position":[[116,7]]},"414":{"position":[[20,5]]},"416":{"position":[[139,7]]},"418":{"position":[[124,7],[848,5],[1008,5]]},"420":{"position":[[92,7],[721,5],[3512,5],[3537,5],[3960,7]]},"523":{"position":[[184,5]]},"595":{"position":[[833,5]]},"854":{"position":[[11,5]]},"938":{"position":[[280,4]]},"971":{"position":[[223,4]]},"983":{"position":[[98,4]]},"1001":{"position":[[143,4]]},"1122":{"position":[[953,4],[1417,4],[1736,4],[2057,4],[2388,4],[2710,4],[3032,4],[3353,4],[3669,4]]},"1209":{"position":[[597,5]]},"1260":{"position":[[146,5]]},"1266":{"position":[[114,8]]},"1610":{"position":[[975,5]]},"1622":{"position":[[1499,5],[2010,5]]},"1624":{"position":[[49,5]]},"1634":{"position":[[170,6]]},"1636":{"position":[[734,5]]},"1680":{"position":[[424,7]]},"1688":{"position":[[7,7]]},"1692":{"position":[[10,7]]},"1694":{"position":[[177,7]]},"1696":{"position":[[188,5]]},"1698":{"position":[[183,5],[730,7],[797,7]]},"1717":{"position":[[424,7]]},"1725":{"position":[[99,7]]},"1729":{"position":[[82,7]]},"1741":{"position":[[177,7]]},"1743":{"position":[[188,5]]},"1745":{"position":[[183,5],[837,7],[904,7]]},"1762":{"position":[[424,7]]},"1770":{"position":[[99,7]]},"1774":{"position":[[82,7]]},"1782":{"position":[[189,7]]},"1784":{"position":[[201,5]]},"1786":{"position":[[1058,7],[1479,7]]},"1810":{"position":[[75,5],[796,7],[3605,7],[4446,5]]},"1843":{"position":[[144,5],[295,5],[641,5]]},"1859":{"position":[[410,5]]},"1864":{"position":[[79,5]]},"1870":{"position":[[306,7]]},"1872":{"position":[[424,7]]},"1891":{"position":[[5354,7]]},"1893":{"position":[[553,5],[607,5]]},"1917":{"position":[[406,7]]},"1966":{"position":[[5021,5]]},"1973":{"position":[[84,7]]},"1975":{"position":[[1026,5]]},"1977":{"position":[[125,6],[307,7],[1703,5],[1964,7]]},"2009":{"position":[[60,7]]},"2011":{"position":[[238,5],[630,4]]},"2015":{"position":[[909,7]]},"2028":{"position":[[362,5]]},"2041":{"position":[[77,7]]},"2049":{"position":[[685,5]]},"2051":{"position":[[348,7],[1288,5]]}}}],["meaning",{"_index":4719,"t":{"1122":{"position":[[80,10]]},"2106":{"position":[[132,10]]}}}],["meant",{"_index":5414,"t":{"1359":{"position":[[49,5]]},"1610":{"position":[[884,5]]},"1622":{"position":[[1125,5]]},"1704":{"position":[[1338,5]]},"1731":{"position":[[1360,5]]},"1853":{"position":[[894,5]]},"1891":{"position":[[5455,5]]},"1893":{"position":[[117,5]]},"1897":{"position":[[345,5]]}}}],["meanwhil",{"_index":1287,"t":{"183":{"position":[[1219,9]]},"597":{"position":[[302,10]]},"1400":{"position":[[200,10]]}}}],["measur",{"_index":1364,"t":{"193":{"position":[[369,8]]},"197":{"position":[[131,9]]},"1688":{"position":[[477,8]]},"1725":{"position":[[582,8]]},"1770":{"position":[[582,8]]},"1807":{"position":[[455,8]]},"1822":{"position":[[89,11],[173,7]]},"1826":{"position":[[249,9]]},"1843":{"position":[[350,8]]}}}],["mechan",{"_index":1576,"t":{"245":{"position":[[84,10]]},"325":{"position":[[37,9]]},"345":{"position":[[1462,9],[1636,10]]},"565":{"position":[[22,9]]},"802":{"position":[[115,10]]},"856":{"position":[[51,10]]},"1280":{"position":[[773,10]]},"1314":{"position":[[1328,9]]},"1624":{"position":[[35,9]]},"1692":{"position":[[1040,9]]},"1706":{"position":[[150,9]]},"1708":{"position":[[1163,9]]},"1729":{"position":[[1112,9]]},"1733":{"position":[[150,9]]},"1751":{"position":[[1167,9]]},"1770":{"position":[[1684,9]]},"1774":{"position":[[1253,9]]},"1792":{"position":[[1190,9]]},"1864":{"position":[[103,9]]},"1956":{"position":[[439,10]]},"2028":{"position":[[5909,10]]},"2114":{"position":[[244,8]]}}}],["media",{"_index":1368,"t":{"195":{"position":[[24,5],[500,5],[578,5]]},"204":{"position":[[375,6]]},"212":{"position":[[430,6]]},"216":{"position":[[209,6]]},"235":{"position":[[210,5]]},"597":{"position":[[100,5],[259,5]]},"829":{"position":[[838,5]]},"834":{"position":[[141,5]]},"1729":{"position":[[1378,6]]},"1774":{"position":[[1519,6]]}}}],["medium",{"_index":2407,"t":{"422":{"position":[[2269,6]]},"1516":{"position":[[371,6]]},"1640":{"position":[[445,7]]}}}],["meet",{"_index":47,"t":{"7":{"position":[[336,9]]},"14":{"position":[[4,8]]},"68":{"position":[[27,4],[136,4]]},"70":{"position":[[249,4]]},"193":{"position":[[287,9]]},"195":{"position":[[465,8]]},"204":{"position":[[391,9]]},"208":{"position":[[56,4]]},"212":{"position":[[449,9]]},"225":{"position":[[83,4]]},"229":{"position":[[457,5]]},"470":{"position":[[582,4]]},"1458":{"position":[[320,4]]},"1644":{"position":[[293,8]]},"1958":{"position":[[772,5]]},"1962":{"position":[[1210,5],[2696,5],[3916,5]]},"1990":{"position":[[29,4]]},"2002":{"position":[[540,4]]},"2068":{"position":[[1171,7],[1572,7],[1970,7]]}}}],["meetup",{"_index":1356,"t":{"191":{"position":[[70,8]]}}}],["meltdown",{"_index":5840,"t":{"1688":{"position":[[609,9]]},"1725":{"position":[[716,9]]},"1770":{"position":[[716,9]]}}}],["member",{"_index":84,"t":{"14":{"position":[[95,7]]},"18":{"position":[[83,7]]},"290":{"position":[[70,7]]},"325":{"position":[[99,7]]},"327":{"position":[[508,7]]},"329":{"position":[[86,7],[361,7],[513,7],[605,7],[764,8]]},"331":{"position":[[220,8]]},"345":{"position":[[1334,7],[1507,7]]},"358":{"position":[[878,6],[955,6],[1006,6],[1542,7],[1638,6],[1683,6],[1759,6],[2555,6],[2647,7],[2727,7]]},"659":{"position":[[267,8]]},"1757":{"position":[[188,7]]},"1798":{"position":[[188,7]]},"1891":{"position":[[1051,6]]},"1962":{"position":[[1462,8],[2901,8]]},"2058":{"position":[[6487,8]]},"2068":{"position":[[281,8]]},"2077":{"position":[[1207,6],[1266,6],[1403,6],[1579,6],[1705,6],[1804,6],[2077,6],[2289,6],[3242,6],[3284,7]]}}}],["member':%(target.role.name)",{"_index":3620,"t":{"749":{"position":[[648,30]]},"2058":{"position":[[394,31],[6646,30]]}}}],["member@lists.scs.commun",{"_index":503,"t":{"72":{"position":[[333,26]]}}}],["membership",{"_index":149,"t":{"23":{"position":[[240,11]]},"251":{"position":[[124,11],[666,10],[724,11]]}}}],["memcach",{"_index":3927,"t":{"821":{"position":[[217,9]]},"883":{"position":[[20,9],[42,9]]},"1201":{"position":[[20,9],[53,9]]},"1308":{"position":[[585,10]]}}}],["memori",{"_index":5806,"t":{"1680":{"position":[[769,6]]},"1683":{"position":[[212,6]]},"1690":{"position":[[47,7],[55,6],[184,6]]},"1700":{"position":[[1074,6]]},"1706":{"position":[[940,6]]},"1717":{"position":[[769,6]]},"1720":{"position":[[271,6]]},"1727":{"position":[[41,7],[49,6],[185,6],[299,6]]},"1733":{"position":[[1130,6]]},"1739":{"position":[[745,6]]},"1747":{"position":[[728,6]]},"1762":{"position":[[668,6]]},"1765":{"position":[[271,6]]},"1772":{"position":[[41,7],[49,6],[185,6],[299,6]]},"1776":{"position":[[975,6]]},"1780":{"position":[[743,6]]},"1788":{"position":[[928,6],[1118,6]]},"1891":{"position":[[918,6],[1589,7]]}}}],["memory_mb",{"_index":5057,"t":{"1298":{"position":[[388,10]]}}}],["mention",{"_index":1064,"t":{"171":{"position":[[374,7]]},"195":{"position":[[100,9]]},"267":{"position":[[289,9]]},"341":{"position":[[525,9]]},"358":{"position":[[2345,9]]},"457":{"position":[[7176,9]]},"462":{"position":[[2326,9]]},"472":{"position":[[3022,9]]},"474":{"position":[[710,9]]},"1516":{"position":[[670,9]]},"1700":{"position":[[1263,9]]},"1749":{"position":[[164,9]]},"1770":{"position":[[1386,9]]},"1790":{"position":[[187,9]]},"1828":{"position":[[85,9],[135,9]]},"1919":{"position":[[764,9]]},"1964":{"position":[[2883,10],[4836,9],[5130,9]]},"1966":{"position":[[4935,10]]},"2002":{"position":[[566,9]]},"2106":{"position":[[324,9]]}}}],["merch",{"_index":1385,"t":{"195":{"position":[[623,6]]},"197":{"position":[[33,5]]},"204":{"position":[[433,6],[455,5],[477,5]]}}}],["merchandis",{"_index":1544,"t":{"233":{"position":[[87,12]]}}}],["merg",{"_index":530,"t":{"76":{"position":[[268,5],[308,5]]},"92":{"position":[[626,7]]},"164":{"position":[[182,7],[278,7],[388,7],[437,7]]},"315":{"position":[[168,5],[188,6],[523,5],[633,5]]},"335":{"position":[[192,5]]},"746":{"position":[[181,6],[2275,7],[2620,5]]},"1116":{"position":[[481,7],[2849,6]]},"1122":{"position":[[737,6]]},"1594":{"position":[[980,6]]},"1610":{"position":[[267,6]]}}}],["merge_yaml",{"_index":3546,"t":{"746":{"position":[[326,11]]}}}],["messag",{"_index":1028,"t":{"166":{"position":[[1780,9],[1806,7],[1957,8],[2000,8]]},"171":{"position":[[311,9]]},"265":{"position":[[186,7]]},"352":{"position":[[1359,7]]},"468":{"position":[[92,8]]},"486":{"position":[[638,7]]},"567":{"position":[[206,7]]},"571":{"position":[[247,7]]},"583":{"position":[[64,7],[170,7],[238,7],[270,7],[445,7]]},"610":{"position":[[733,7]]},"767":{"position":[[1785,7],[1986,7]]},"941":{"position":[[445,8]]},"985":{"position":[[645,7]]},"1036":{"position":[[587,7]]},"1055":{"position":[[733,7]]},"1187":{"position":[[214,8]]},"1262":{"position":[[4316,7]]},"1296":{"position":[[261,7],[336,7]]},"1298":{"position":[[14806,7]]},"1374":{"position":[[491,7]]}}}],["met",{"_index":5615,"t":{"1541":{"position":[[146,4],[466,4],[683,4]]},"1543":{"position":[[761,4]]},"1715":{"position":[[232,3]]},"1760":{"position":[[232,3]]}}}],["meta",{"_index":3082,"t":{"626":{"position":[[453,5]]},"630":{"position":[[116,4]]},"632":{"position":[[690,5]]},"634":{"position":[[686,5]]},"636":{"position":[[125,5],[181,4]]},"1034":{"position":[[2471,4],[5803,4]]},"1069":{"position":[[453,5]]},"1073":{"position":[[116,4]]},"1075":{"position":[[690,5]]},"1077":{"position":[[686,5]]},"1079":{"position":[[125,5],[181,4]]},"1168":{"position":[[1639,5]]},"1553":{"position":[[541,4]]},"1801":{"position":[[129,4]]},"2143":{"position":[[43,4]]}}}],["metadata",{"_index":2639,"t":{"470":{"position":[[1838,8]]},"565":{"position":[[308,8]]},"587":{"position":[[356,8],[442,8]]},"599":{"position":[[266,8]]},"630":{"position":[[59,8],[280,8],[386,8]]},"965":{"position":[[11,8],[31,8]]},"1073":{"position":[[59,8],[280,8],[386,8]]},"1262":{"position":[[1330,8],[1759,8]]},"1353":{"position":[[154,8]]},"1417":{"position":[[689,8],[949,8]]},"1434":{"position":[[850,8]]},"1451":{"position":[[689,8]]},"1557":{"position":[[19,8],[75,8],[496,8]]},"1588":{"position":[[1489,9]]},"1594":{"position":[[507,8],[1576,9],[1715,8]]},"1600":{"position":[[444,8]]},"1602":{"position":[[203,8]]},"1642":{"position":[[642,8]]},"1835":{"position":[[164,8]]},"1870":{"position":[[511,8]]},"1895":{"position":[[1245,8]]},"1899":{"position":[[522,8],[633,8]]},"1926":{"position":[[1151,8]]},"2028":{"position":[[2792,8]]},"2054":{"position":[[228,8],[430,8],[512,8]]},"2116":{"position":[[23,8]]},"2143":{"position":[[90,8]]},"2214":{"position":[[260,8]]}}}],["metadata.md",{"_index":5761,"t":{"1642":{"position":[[748,11]]}}}],["metadef",{"_index":6054,"t":{"1708":{"position":[[1154,8]]},"1751":{"position":[[1158,8]]},"1792":{"position":[[1181,8]]}}}],["metal",{"_index":1689,"t":{"276":{"position":[[49,5]]},"758":{"position":[[656,5]]},"760":{"position":[[214,5],[248,5]]},"827":{"position":[[215,5]]},"852":{"position":[[127,6]]},"1314":{"position":[[41,6],[75,5]]},"1326":{"position":[[254,5]]},"1346":{"position":[[16,5],[164,5]]},"1429":{"position":[[64,5]]},"1434":{"position":[[1179,5]]},"1683":{"position":[[374,5]]},"1694":{"position":[[94,5],[233,5]]},"1696":{"position":[[298,5]]},"1720":{"position":[[433,5]]},"1741":{"position":[[94,5],[233,5]]},"1743":{"position":[[298,5],[851,5]]},"1745":{"position":[[1164,6]]},"1765":{"position":[[433,5]]},"1782":{"position":[[106,5],[245,5]]},"1784":{"position":[[311,5],[864,5]]},"1786":{"position":[[1749,6]]},"1973":{"position":[[115,5],[195,5],[375,5]]},"2009":{"position":[[91,5],[171,5],[351,5]]}}}],["meter",{"_index":221,"t":{"27":{"position":[[1014,8]]},"1292":{"position":[[45,8]]},"1296":{"position":[[112,7],[138,6]]},"1300":{"position":[[369,6],[450,8]]},"1302":{"position":[[34,7]]},"1471":{"position":[[829,8]]},"1488":{"position":[[567,8]]},"1573":{"position":[[454,8]]},"1577":{"position":[[85,8],[398,9]]},"2131":{"position":[[392,8],[530,8]]},"2133":{"position":[[168,9]]},"2135":{"position":[[226,8],[261,8],[526,8]]},"2139":{"position":[[407,8]]},"2160":{"position":[[392,8]]},"2162":{"position":[[234,9],[475,8]]},"2164":{"position":[[214,8]]},"2168":{"position":[[61,8],[298,8]]},"2202":{"position":[[118,9],[167,8],[421,8]]},"2206":{"position":[[158,8],[352,8]]},"2216":{"position":[[329,8]]}}}],["meter_sink",{"_index":5354,"t":{"1302":{"position":[[57,10],[83,10]]}}}],["meter_sourc",{"_index":5353,"t":{"1302":{"position":[[21,12]]}}}],["method",{"_index":769,"t":{"131":{"position":[[50,7]]},"247":{"position":[[599,7]]},"315":{"position":[[606,8]]},"860":{"position":[[1311,6]]},"1170":{"position":[[70,6]]},"1298":{"position":[[13526,7]]},"1826":{"position":[[211,7]]},"1828":{"position":[[127,7]]},"2126":{"position":[[135,6]]}}}],["metric",{"_index":1392,"t":{"195":{"position":[[773,7],[818,8]]},"420":{"position":[[4031,7]]},"457":{"position":[[7291,7],[8639,7],[10317,7]]},"462":{"position":[[2441,7]]},"466":{"position":[[7,7]]},"470":{"position":[[1372,7],[3889,7]]},"480":{"position":[[712,7]]},"1034":{"position":[[365,7],[496,7],[582,7],[7024,7]]},"1292":{"position":[[4,7],[144,7]]},"1294":{"position":[[51,7],[157,7],[218,7]]},"1300":{"position":[[295,7]]},"1326":{"position":[[117,8]]},"1349":{"position":[[554,7]]},"1449":{"position":[[296,7]]},"1471":{"position":[[591,7]]},"1964":{"position":[[1675,7],[3803,8],[3833,8],[3880,8]]},"1966":{"position":[[374,7]]},"2133":{"position":[[415,7],[465,6],[559,8],[579,7],[664,6],[720,6]]},"2137":{"position":[[399,7],[478,7],[540,7],[645,7]]},"2139":{"position":[[475,8],[510,7],[628,6]]},"2166":{"position":[[63,7],[156,7],[218,7]]}}}],["mgmt",{"_index":2232,"t":{"416":{"position":[[212,4],[282,4],[336,4]]},"418":{"position":[[562,4],[734,4],[801,4]]},"486":{"position":[[225,4]]}}}],["mgmtcluster",{"_index":2201,"t":{"373":{"position":[[22,11],[198,12]]},"375":{"position":[[26,11],[225,12]]},"457":{"position":[[2252,13]]}}}],["mgr",{"_index":4116,"t":{"871":{"position":[[61,4]]},"1012":{"position":[[93,3],[208,5]]},"1014":{"position":[[1275,3],[1455,3]]},"1016":{"position":[[656,3]]},"1368":{"position":[[243,3],[367,5]]}}}],["mgr.5184",{"_index":4540,"t":{"1038":{"position":[[208,10],[865,10]]}}}],["mgr.testb",{"_index":4539,"t":{"1038":{"position":[[189,11],[846,11]]}}}],["mgr@.servic",{"_index":4325,"t":{"1014":{"position":[[1490,18]]}}}],["mib",{"_index":4550,"t":{"1038":{"position":[[300,3],[957,3]]},"1807":{"position":[[303,4]]}}}],["microcod",{"_index":5837,"t":{"1688":{"position":[[550,9],[647,9],[1385,10],[1537,10]]},"1725":{"position":[[657,9],[739,9],[1210,9],[1737,10],[1889,10]]},"1770":{"position":[[657,9],[754,9],[1464,9],[2039,10],[2191,10]]}}}],["microphon",{"_index":472,"t":{"70":{"position":[[333,10]]}}}],["microservic",{"_index":2923,"t":{"504":{"position":[[647,12]]}}}],["microsoft",{"_index":1112,"t":{"175":{"position":[[414,9]]}}}],["migrat",{"_index":801,"t":{"140":{"position":[[367,9]]},"304":{"position":[[500,9]]},"457":{"position":[[7596,9]]},"462":{"position":[[1234,7],[1438,8],[1530,8],[1657,9],[1770,7]]},"495":{"position":[[334,8],[487,8],[661,9],[699,7],[760,10]]},"500":{"position":[[80,7]]},"622":{"position":[[781,9]]},"1065":{"position":[[781,9]]},"1411":{"position":[[186,9]]},"1436":{"position":[[424,9]]},"1471":{"position":[[754,9]]},"1475":{"position":[[175,8]]},"1692":{"position":[[385,10]]},"1729":{"position":[[457,10]]},"1757":{"position":[[317,10]]},"1774":{"position":[[457,10]]},"1798":{"position":[[317,10]]},"1843":{"position":[[998,10]]},"1891":{"position":[[1332,9]]},"1895":{"position":[[737,9],[913,9],[1066,9],[1194,9]]},"1899":{"position":[[611,9],[684,9],[706,9]]},"1926":{"position":[[1112,8],[1228,9]]},"1932":{"position":[[1467,9],[2003,9]]},"1964":{"position":[[1531,9]]}}}],["migration_interfac",{"_index":3481,"t":{"729":{"position":[[2788,20]]},"744":{"position":[[195,19]]}}}],["milan",{"_index":5917,"t":{"1698":{"position":[[446,7]]},"1739":{"position":[[924,5]]},"1745":{"position":[[537,7]]},"1780":{"position":[[922,5]]},"1786":{"position":[[758,7],[1760,5]]}}}],["milk",{"_index":1531,"t":{"227":{"position":[[404,5]]},"233":{"position":[[308,5]]}}}],["mimic",{"_index":6567,"t":{"1994":{"position":[[83,5]]},"1996":{"position":[[295,5]]},"1998":{"position":[[251,5],[498,5],[1854,5]]},"2002":{"position":[[804,6]]},"2004":{"position":[[736,5],[1579,6]]}}}],["mimick",{"_index":6584,"t":{"2000":{"position":[[204,9]]}}}],["min",{"_index":413,"t":{"62":{"position":[[51,5]]},"860":{"position":[[2750,4]]},"1022":{"position":[[237,4]]},"1028":{"position":[[191,4]]}}}],["min_disk",{"_index":3080,"t":{"626":{"position":[[381,9]]},"632":{"position":[[619,9]]},"634":{"position":[[613,9]]},"636":{"position":[[222,8]]},"1069":{"position":[[381,9]]},"1075":{"position":[[619,9]]},"1077":{"position":[[613,9]]},"1079":{"position":[[222,8]]},"1692":{"position":[[802,9],[1465,9]]},"1729":{"position":[[874,9],[1671,9]]},"1774":{"position":[[1015,9],[1812,9]]}}}],["min_disk_s",{"_index":6203,"t":{"1807":{"position":[[267,13]]}}}],["min_ram",{"_index":3081,"t":{"626":{"position":[[393,8]]},"632":{"position":[[631,8]]},"634":{"position":[[625,8]]},"636":{"position":[[235,7]]},"1069":{"position":[[393,8]]},"1075":{"position":[[631,8]]},"1077":{"position":[[625,8]]},"1079":{"position":[[235,7]]},"1807":{"position":[[291,7]]}}}],["min_siz",{"_index":3227,"t":{"661":{"position":[[275,9]]}}}],["mind",{"_index":1781,"t":{"300":{"position":[[1125,5]]},"352":{"position":[[126,4]]},"420":{"position":[[5086,4]]},"422":{"position":[[604,4]]},"802":{"position":[[562,5]]},"1314":{"position":[[708,4]]},"1960":{"position":[[629,4]]},"2094":{"position":[[3528,4]]}}}],["mineri",{"_index":244,"t":{"27":{"position":[[1465,6]]}}}],["minim",{"_index":298,"t":{"36":{"position":[[512,7]]},"106":{"position":[[5,7]]},"315":{"position":[[98,7]]},"860":{"position":[[2015,8]]},"1436":{"position":[[143,9]]},"1667":{"position":[[1025,7]]},"1988":{"position":[[155,8]]},"2004":{"position":[[287,9]]},"2026":{"position":[[663,9]]},"2094":{"position":[[1969,8]]},"2103":{"position":[[22,7]]}}}],["minimalist",{"_index":3939,"t":{"827":{"position":[[30,12]]}}}],["minimum",{"_index":3104,"t":{"628":{"position":[[79,7]]},"829":{"position":[[59,7],[178,7],[298,7]]},"1071":{"position":[[79,7]]},"1605":{"position":[[112,7]]},"1979":{"position":[[632,7]]},"2110":{"position":[[602,7]]}}}],["minio.services.osism.tech",{"_index":5568,"t":{"1479":{"position":[[82,25]]}}}],["ministri",{"_index":2934,"t":{"523":{"position":[[122,8]]},"1496":{"position":[[233,8]]}}}],["minor",{"_index":1767,"t":{"298":{"position":[[300,5]]},"457":{"position":[[7648,5]]},"462":{"position":[[1596,5],[2851,5]]},"1101":{"position":[[266,5]]},"1112":{"position":[[48,5],[111,5],[265,5],[312,5],[359,5]]},"1368":{"position":[[1077,5]]},"1417":{"position":[[896,5]]},"1486":{"position":[[9,5]]},"1571":{"position":[[207,5]]},"1816":{"position":[[1242,7]]},"1904":{"position":[[258,5],[395,5],[450,5],[511,5]]},"1908":{"position":[[20,5]]},"1915":{"position":[[131,5],[232,5],[796,5]]},"1919":{"position":[[191,5]]}}}],["minut",{"_index":1854,"t":{"317":{"position":[[1663,7]]},"420":{"position":[[3703,8]]},"787":{"position":[[2965,7]]},"834":{"position":[[869,8]]}}}],["mirror",{"_index":2668,"t":{"472":{"position":[[519,6],[1794,6],[3600,6]]},"474":{"position":[[1129,6]]},"624":{"position":[[7,6],[91,6]]},"639":{"position":[[70,6]]},"641":{"position":[[124,8]]},"1067":{"position":[[7,6],[91,6]]},"1082":{"position":[[70,6]]},"1084":{"position":[[124,8]]},"1368":{"position":[[618,8]]},"1816":{"position":[[1421,8]]}}}],["misconfigur",{"_index":6595,"t":{"2011":{"position":[[131,18]]}}}],["mislead",{"_index":6548,"t":{"1977":{"position":[[1202,10]]}}}],["miss",{"_index":1797,"t":{"307":{"position":[[216,7]]},"480":{"position":[[414,7]]},"1093":{"position":[[205,7]]},"1688":{"position":[[1788,7]]},"1725":{"position":[[2140,7]]},"1755":{"position":[[1213,7]]},"1770":{"position":[[2442,7]]},"1796":{"position":[[1215,7]]},"1855":{"position":[[256,7]]},"1881":{"position":[[219,7]]},"1962":{"position":[[742,7]]},"2131":{"position":[[23,7]]},"2160":{"position":[[23,7]]}}}],["mission",{"_index":1077,"t":{"173":{"position":[[36,7]]}}}],["mit",{"_index":1204,"t":{"177":{"position":[[2041,3]]}}}],["mitig",{"_index":5844,"t":{"1688":{"position":[[804,11],[1412,11]]},"1725":{"position":[[917,11],[1239,10],[1313,11],[1764,11]]},"1770":{"position":[[896,11],[1317,11],[1706,12],[2066,11]]},"1891":{"position":[[1434,8]]}}}],["mix",{"_index":6421,"t":{"1928":{"position":[[300,3]]}}}],["mixtur",{"_index":1944,"t":{"321":{"position":[[358,7]]},"1617":{"position":[[104,7]]}}}],["mkdir",{"_index":2707,"t":{"474":{"position":[[1321,5]]},"714":{"position":[[242,5]]},"787":{"position":[[162,5]]},"1172":{"position":[[490,5]]}}}],["mkk9fdv9wujiqtuyhaofmd+uys/hqvsf/hm9scuvfhw02gtdzkcxliwhfhjoj7rbduumk",{"_index":1910,"t":{"319":{"position":[[4704,69]]}}}],["mm",{"_index":6230,"t":{"1810":{"position":[[3005,2],[3765,2],[3819,2]]},"1814":{"position":[[45,2],[59,2]]},"1816":{"position":[[1679,2]]}}}],["mobil",{"_index":463,"t":{"70":{"position":[[220,6]]}}}],["mod_auth_mellon",{"_index":1580,"t":{"247":{"position":[[269,15]]}}}],["mod_auth_openidc",{"_index":1578,"t":{"247":{"position":[[236,17]]}}}],["mod_oauth2",{"_index":1579,"t":{"247":{"position":[[254,10]]},"1434":{"position":[[1072,10]]}}}],["mode",{"_index":531,"t":{"76":{"position":[[274,4]]},"150":{"position":[[165,5],[563,5]]},"315":{"position":[[174,5],[529,4]]},"327":{"position":[[632,6]]},"335":{"position":[[198,5]]},"386":{"position":[[195,4],[233,4]]},"388":{"position":[[93,4]]},"390":{"position":[[99,4]]},"489":{"position":[[236,5]]},"665":{"position":[[2565,4]]},"746":{"position":[[636,5],[3567,7]]},"850":{"position":[[1572,6]]},"1024":{"position":[[165,4]]},"1137":{"position":[[166,5],[564,5]]},"1174":{"position":[[226,5],[378,5]]},"1575":{"position":[[281,4]]},"1947":{"position":[[41,4]]},"1964":{"position":[[325,5],[1686,4],[3900,4]]},"1966":{"position":[[1246,5]]},"1990":{"position":[[582,5]]}}}],["model",{"_index":1305,"t":{"185":{"position":[[680,6]]},"282":{"position":[[151,5]]},"292":{"position":[[661,6]]},"422":{"position":[[595,5],[614,5],[984,5]]},"852":{"position":[[474,5]]},"1010":{"position":[[684,6]]},"1280":{"position":[[164,7]]},"1659":{"position":[[348,5]]},"1739":{"position":[[207,7]]},"1780":{"position":[[206,7]]},"2013":{"position":[[1143,5]]},"2024":{"position":[[128,6]]},"2028":{"position":[[4322,6]]}}}],["moder",{"_index":442,"t":{"68":{"position":[[224,9]]}}}],["modern",{"_index":1226,"t":{"179":{"position":[[338,6]]},"2155":{"position":[[255,6]]}}}],["modif",{"_index":995,"t":{"166":{"position":[[614,14]]},"175":{"position":[[147,14],[343,13]]},"606":{"position":[[51,13]]},"1051":{"position":[[51,13]]}}}],["modifi",{"_index":942,"t":{"158":{"position":[[329,8]]},"166":{"position":[[912,8]]},"474":{"position":[[352,6]]},"812":{"position":[[225,6]]},"1141":{"position":[[319,8]]},"1155":{"position":[[114,9]]},"1594":{"position":[[1614,6]]},"1667":{"position":[[1605,6]]},"1706":{"position":[[1730,9]]},"1739":{"position":[[1826,9]]},"1780":{"position":[[1942,9]]},"1843":{"position":[[459,8],[843,9]]},"2043":{"position":[[23,8]]},"2133":{"position":[[357,9]]},"2137":{"position":[[217,6]]}}}],["modify_at",{"_index":5315,"t":{"1298":{"position":[[12459,10],[12672,10]]}}}],["modul",{"_index":637,"t":{"100":{"position":[[128,7]]},"104":{"position":[[172,6]]},"173":{"position":[[563,7]]},"247":{"position":[[223,7],[393,7],[825,8]]},"397":{"position":[[86,8]]},"585":{"position":[[25,6]]},"595":{"position":[[25,6],[566,6]]},"677":{"position":[[268,7],[280,6]]},"695":{"position":[[155,7]]},"1161":{"position":[[82,6]]},"1667":{"position":[[809,6]]},"1826":{"position":[[640,6]]},"2028":{"position":[[591,6]]}}}],["moment",{"_index":3262,"t":{"665":{"position":[[1551,6]]},"827":{"position":[[268,6]]},"847":{"position":[[142,7]]},"1541":{"position":[[592,6]]}}}],["momentj",{"_index":1069,"t":{"171":{"position":[[595,8]]}}}],["mon",{"_index":4115,"t":{"871":{"position":[[39,4]]},"1012":{"position":[[85,3],[178,5]]},"1014":{"position":[[1904,3],[2084,3]]},"1016":{"position":[[304,3]]},"1368":{"position":[[235,3],[337,5]]}}}],["mon.testb",{"_index":4572,"t":{"1038":{"position":[[1086,11]]}}}],["mon@.servic",{"_index":4329,"t":{"1014":{"position":[[2119,18]]}}}],["mon_allow_pool_delet",{"_index":4264,"t":{"1001":{"position":[[245,21]]}}}],["monday",{"_index":419,"t":{"64":{"position":[[88,7]]}}}],["money",{"_index":1330,"t":{"185":{"position":[[2476,6]]},"523":{"position":[[178,5]]}}}],["monitor",{"_index":75,"t":{"11":{"position":[[132,7]]},"25":{"position":[[284,10],[342,10],[619,7]]},"27":{"position":[[410,7],[762,10]]},"32":{"position":[[130,7],[184,7],[211,7],[286,7]]},"66":{"position":[[78,10]]},"265":{"position":[[210,10]]},"274":{"position":[[188,10]]},"309":{"position":[[411,7]]},"325":{"position":[[177,7],[355,7],[559,7]]},"329":{"position":[[234,9],[264,8],[310,7],[440,10],[483,7],[954,8],[1021,9],[1101,8],[1161,7]]},"331":{"position":[[25,7],[341,7],[515,10],[565,10]]},"595":{"position":[[340,8]]},"729":{"position":[[797,10],[840,12],[1314,7],[1688,12]]},"787":{"position":[[2811,10]]},"807":{"position":[[653,10]]},"863":{"position":[[115,10]]},"889":{"position":[[39,10]]},"1001":{"position":[[221,8]]},"1314":{"position":[[1160,7],[1185,7]]},"1332":{"position":[[648,10],[801,10]]},"1334":{"position":[[49,7],[182,10],[452,7],[549,7]]},"1368":{"position":[[917,7]]},"1400":{"position":[[47,7],[228,7]]},"1434":{"position":[[608,7],[676,7]]},"1443":{"position":[[151,10]]},"1449":{"position":[[104,7]]},"1467":{"position":[[984,9]]},"1573":{"position":[[110,11]]},"1665":{"position":[[1126,10]]},"1901":{"position":[[309,10]]},"1964":{"position":[[1551,10],[3779,10]]},"1966":{"position":[[1312,13]]},"1986":{"position":[[806,10]]},"1988":{"position":[[1336,10],[1394,10],[1582,10]]},"1990":{"position":[[776,10],[850,10]]},"1994":{"position":[[429,10]]},"1996":{"position":[[180,10]]},"2094":{"position":[[2155,11],[3181,10]]},"2096":{"position":[[1134,7]]},"2139":{"position":[[268,10],[776,11]]},"2164":{"position":[[574,10]]},"2196":{"position":[[322,10]]}}}],["monitor_address",{"_index":3486,"t":{"729":{"position":[[3046,16]]}}}],["monitor_interfac",{"_index":3488,"t":{"729":{"position":[[3084,18]]}}}],["monitoring1",{"_index":177,"t":{"25":{"position":[[307,11]]},"27":{"position":[[742,11]]}}}],["monolith",{"_index":5006,"t":{"1270":{"position":[[627,10]]},"1280":{"position":[[628,11]]}}}],["monorepo",{"_index":3374,"t":{"706":{"position":[[63,9]]}}}],["month",{"_index":1706,"t":{"282":{"position":[[12,5]]},"1112":{"position":[[40,7]]},"1314":{"position":[[277,7]]},"1383":{"position":[[9,6],[938,6]]},"1571":{"position":[[233,6]]},"1688":{"position":[[493,5],[689,5],[1364,7]]},"1725":{"position":[[598,5],[784,5],[1280,6],[1716,7]]},"1770":{"position":[[598,5],[799,5],[1528,5],[2018,7]]},"1810":{"position":[[980,5],[4515,5]]},"1843":{"position":[[382,5]]},"1904":{"position":[[614,7],[635,6],[691,6]]},"1908":{"position":[[50,6]]},"1915":{"position":[[374,7],[443,6],[755,7]]},"1919":{"position":[[238,6]]},"2096":{"position":[[1592,6],[1637,6],[1660,6]]}}}],["monthli",{"_index":6219,"t":{"1810":{"position":[[926,7],[1433,8],[1613,7],[2212,8]]},"1904":{"position":[[343,8]]},"1915":{"position":[[885,8]]}}}],["months/year",{"_index":5588,"t":{"1498":{"position":[[92,14]]}}}],["more",{"_index":406,"t":{"59":{"position":[[146,4]]},"175":{"position":[[1261,4]]},"187":{"position":[[205,4]]},"204":{"position":[[693,4]]},"206":{"position":[[326,4]]},"241":{"position":[[121,4]]},"267":{"position":[[80,4]]},"272":{"position":[[159,4]]},"274":{"position":[[241,4]]},"276":{"position":[[137,4]]},"278":{"position":[[257,4]]},"280":{"position":[[273,4]]},"282":{"position":[[258,4]]},"288":{"position":[[244,4]]},"292":{"position":[[570,4]]},"294":{"position":[[305,4]]},"296":{"position":[[120,4]]},"317":{"position":[[1691,4]]},"319":{"position":[[1503,4]]},"325":{"position":[[881,4]]},"345":{"position":[[1110,4]]},"360":{"position":[[211,4]]},"418":{"position":[[419,4]]},"422":{"position":[[1002,4]]},"424":{"position":[[1452,4]]},"426":{"position":[[767,4]]},"442":{"position":[[161,4]]},"444":{"position":[[219,4]]},"449":{"position":[[348,4]]},"453":{"position":[[235,4]]},"470":{"position":[[951,4],[3349,4],[4496,4]]},"502":{"position":[[365,4]]},"561":{"position":[[52,4]]},"565":{"position":[[510,4]]},"622":{"position":[[1310,4]]},"661":{"position":[[411,4]]},"665":{"position":[[912,4]]},"724":{"position":[[1146,4],[1312,4]]},"775":{"position":[[501,4],[510,4],[630,4]]},"816":{"position":[[101,4],[1139,4]]},"829":{"position":[[145,4],[334,4]]},"852":{"position":[[954,4]]},"1010":{"position":[[4,4]]},"1016":{"position":[[118,4]]},"1065":{"position":[[1310,4]]},"1096":{"position":[[374,4]]},"1107":{"position":[[63,4]]},"1109":{"position":[[49,4]]},"1207":{"position":[[4127,4]]},"1314":{"position":[[107,4]]},"1332":{"position":[[643,4],[772,4]]},"1337":{"position":[[152,4]]},"1363":{"position":[[914,4]]},"1368":{"position":[[1129,4],[1146,4],[1273,4]]},"1377":{"position":[[286,4]]},"1383":{"position":[[977,4]]},"1397":{"position":[[345,4]]},"1402":{"position":[[639,4]]},"1405":{"position":[[106,4]]},"1431":{"position":[[607,4]]},"1436":{"position":[[181,4]]},"1439":{"position":[[220,4]]},"1469":{"position":[[333,4]]},"1471":{"position":[[599,4]]},"1473":{"position":[[129,4]]},"1516":{"position":[[693,4],[780,4]]},"1522":{"position":[[186,4]]},"1537":{"position":[[234,4]]},"1541":{"position":[[654,4]]},"1588":{"position":[[861,4]]},"1600":{"position":[[355,4]]},"1602":{"position":[[114,4]]},"1636":{"position":[[745,4]]},"1671":{"position":[[182,4]]},"1688":{"position":[[380,4],[1345,4]]},"1692":{"position":[[484,4]]},"1698":{"position":[[21,4]]},"1700":{"position":[[1181,4]]},"1706":{"position":[[522,4],[678,4]]},"1708":{"position":[[172,4],[910,4]]},"1725":{"position":[[472,4],[1697,4]]},"1729":{"position":[[556,4]]},"1733":{"position":[[525,4],[840,4]]},"1739":{"position":[[273,5],[664,4],[1482,4],[1616,4]]},"1745":{"position":[[21,4]]},"1749":{"position":[[37,4]]},"1751":{"position":[[172,4],[949,4]]},"1757":{"position":[[291,4]]},"1770":{"position":[[472,4],[1999,4]]},"1774":{"position":[[556,4]]},"1776":{"position":[[261,4],[685,4]]},"1780":{"position":[[271,5],[662,4],[1483,4],[1617,4]]},"1786":{"position":[[44,4],[1380,4]]},"1788":{"position":[[50,4]]},"1790":{"position":[[60,4]]},"1792":{"position":[[172,4],[949,4]]},"1798":{"position":[[291,4]]},"1805":{"position":[[183,4]]},"1810":{"position":[[1307,4]]},"1812":{"position":[[634,4]]},"1826":{"position":[[199,4]]},"1828":{"position":[[115,4]]},"1877":{"position":[[248,4]]},"1886":{"position":[[626,4]]},"1891":{"position":[[2109,4]]},"1893":{"position":[[364,4],[480,4]]},"1895":{"position":[[395,4],[783,4]]},"1915":{"position":[[645,4]]},"1926":{"position":[[284,4],[1125,4],[1518,4]]},"1966":{"position":[[4172,4],[4181,4],[4724,4]]},"1975":{"position":[[1910,4]]},"1977":{"position":[[1709,4],[2560,4]]},"1988":{"position":[[729,4]]},"1998":{"position":[[1393,4],[1705,4],[1841,4]]},"2000":{"position":[[17,4],[275,4],[462,4]]},"2002":{"position":[[401,4]]},"2004":{"position":[[1052,4],[1126,4],[1881,4]]},"2015":{"position":[[676,4]]},"2028":{"position":[[5828,4]]},"2047":{"position":[[274,4]]},"2068":{"position":[[343,4]]},"2172":{"position":[[81,4]]},"2206":{"position":[[408,4]]}}}],["mostli",{"_index":4246,"t":{"985":{"position":[[714,6]]},"1329":{"position":[[96,9]]},"1917":{"position":[[439,6]]},"1975":{"position":[[2129,6]]},"2141":{"position":[[42,6]]}}}],["motiv",{"_index":5702,"t":{"1590":{"position":[[143,10]]},"1958":{"position":[[17,9]]},"2181":{"position":[[0,10]]}}}],["motto",{"_index":1391,"t":{"195":{"position":[[756,6]]}}}],["mount",{"_index":2621,"t":{"468":{"position":[[1125,5]]},"476":{"position":[[894,7],[2494,5]]},"746":{"position":[[3336,7],[3456,9]]},"836":{"position":[[115,7],[438,7]]}}}],["mountpoint",{"_index":4096,"t":{"860":{"position":[[1946,11]]}}}],["move",{"_index":1235,"t":{"179":{"position":[[772,5]]},"451":{"position":[[967,5],[982,4],[999,5],[1125,6],[1414,4],[1495,5]]},"455":{"position":[[166,4]]},"457":{"position":[[4499,5]]},"459":{"position":[[367,4]]},"549":{"position":[[46,4]]},"1007":{"position":[[74,4]]},"1381":{"position":[[74,4]]},"1441":{"position":[[236,5]]},"1471":{"position":[[785,6]]},"1486":{"position":[[102,4]]},"1600":{"position":[[170,6]]},"1619":{"position":[[0,4],[315,4]]},"1796":{"position":[[104,5]]},"1859":{"position":[[366,5]]},"2004":{"position":[[882,6]]},"2032":{"position":[[76,4]]}}}],["mpl",{"_index":1143,"t":{"175":{"position":[[1375,3]]}}}],["ms",{"_index":6362,"t":{"1888":{"position":[[1894,2]]}}}],["msg",{"_index":1938,"t":{"319":{"position":[[7839,4]]},"763":{"position":[[2864,6],[3043,6]]},"1161":{"position":[[3899,6]]},"1187":{"position":[[157,4]]}}}],["mtu",{"_index":2264,"t":{"418":{"position":[[789,3]]},"670":{"position":[[175,3]]},"727":{"position":[[459,4]]},"729":{"position":[[2590,4]]},"850":{"position":[[1703,3],[1920,4]]}}}],["mtu_valu",{"_index":2263,"t":{"418":{"position":[[773,9]]}}}],["muc",{"_index":2258,"t":{"418":{"position":[[612,3]]}}}],["much",{"_index":1128,"t":{"175":{"position":[[951,4]]},"274":{"position":[[153,4]]},"292":{"position":[[758,4]]},"323":{"position":[[623,4]]},"787":{"position":[[2892,4]]},"829":{"position":[[206,4]]},"1260":{"position":[[422,4]]},"1306":{"position":[[74,4]]},"1349":{"position":[[618,4]]},"1365":{"position":[[640,4]]},"1391":{"position":[[254,4]]},"1402":{"position":[[634,4]]},"1425":{"position":[[289,4]]},"1496":{"position":[[412,4]]},"1708":{"position":[[1361,5]]},"1751":{"position":[[1365,5]]},"1792":{"position":[[1388,5]]},"1826":{"position":[[1357,4]]},"1891":{"position":[[1625,4]]},"1932":{"position":[[1973,4],[4298,4]]},"2090":{"position":[[24,4]]},"2141":{"position":[[187,4]]}}}],["multi",{"_index":2343,"t":{"420":{"position":[[3162,5]]},"468":{"position":[[943,5],[1383,5],[1582,5],[1671,5]]},"626":{"position":[[440,6]]},"632":{"position":[[175,6],[678,6]]},"634":{"position":[[235,6],[673,6]]},"1069":{"position":[[440,6]]},"1075":{"position":[[175,6],[678,6]]},"1077":{"position":[[235,6],[673,6]]},"1431":{"position":[[478,5]]},"1692":{"position":[[1102,5]]},"1729":{"position":[[1174,5]]},"1774":{"position":[[1315,5]]},"1888":{"position":[[798,5]]},"1891":{"position":[[508,5],[959,5],[4317,5]]},"1964":{"position":[[1302,5],[3653,5],[4859,5]]},"1966":{"position":[[5208,5]]},"1981":{"position":[[154,5],[167,5]]}}}],["multiattach",{"_index":6434,"t":{"1932":{"position":[[2183,12],[2496,12],[2538,12]]},"1936":{"position":[[187,11]]}}}],["multipl",{"_index":351,"t":{"36":{"position":[[1679,8]]},"304":{"position":[[37,8]]},"339":{"position":[[972,8],[1835,8]]},"358":{"position":[[759,8]]},"480":{"position":[[1049,8]]},"563":{"position":[[46,8]]},"585":{"position":[[299,8]]},"597":{"position":[[417,8]]},"724":{"position":[[1101,8],[1267,8]]},"798":{"position":[[251,8]]},"802":{"position":[[832,8]]},"839":{"position":[[286,8]]},"1268":{"position":[[13,8]]},"1280":{"position":[[651,8]]},"1294":{"position":[[97,8]]},"1368":{"position":[[853,8]]},"1644":{"position":[[155,8]]},"1649":{"position":[[227,8]]},"1729":{"position":[[1315,8]]},"1774":{"position":[[1456,8]]},"1826":{"position":[[900,8]]},"1870":{"position":[[250,8]]},"1872":{"position":[[368,8]]},"1888":{"position":[[1007,8]]},"1915":{"position":[[33,8]]},"1932":{"position":[[1279,8],[1569,8],[2251,8],[2687,8],[4098,8]]},"1962":{"position":[[2812,8]]},"1964":{"position":[[926,8],[1352,8],[4173,8]]},"1966":{"position":[[5111,8]]},"1971":{"position":[[363,8],[435,8]]},"1975":{"position":[[67,8],[116,8],[333,8],[2353,8]]},"1977":{"position":[[1277,8],[1737,8],[2234,8]]},"1979":{"position":[[745,8],[939,8],[993,8],[1026,8]]},"1986":{"position":[[460,8]]},"1990":{"position":[[706,8]]},"2007":{"position":[[357,8],[429,8]]},"2011":{"position":[[395,8]]},"2015":{"position":[[491,8],[814,8]]},"2024":{"position":[[8,8]]},"2028":{"position":[[1891,8],[4165,8],[5038,8]]},"2058":{"position":[[6077,8],[6432,8]]},"2118":{"position":[[99,8],[145,8]]}}}],["multiprocessor",{"_index":6184,"t":{"1788":{"position":[[448,15]]}}}],["multitud",{"_index":1785,"t":{"304":{"position":[[128,9]]}}}],["mute",{"_index":4173,"t":{"943":{"position":[[14,4]]}}}],["mvp",{"_index":6717,"t":{"2088":{"position":[[539,3]]}}}],["mwf8uclkgrunvsylsmgupb163l89",{"_index":3873,"t":{"802":{"position":[[3171,28]]}}}],["mx",{"_index":5882,"t":{"1692":{"position":[[1161,2]]},"1729":{"position":[[1233,2]]},"1774":{"position":[[1374,2]]}}}],["mx]n",{"_index":5820,"t":{"1685":{"position":[[118,8]]}}}],["mx]n[n/h/s/p",{"_index":6164,"t":{"1767":{"position":[[98,15]]}}}],["mx]n[n/s/l/p",{"_index":6070,"t":{"1722":{"position":[[98,15]]}}}],["mxmxchere",{"_index":238,"t":{"27":{"position":[[1299,9]]}}}],["my_job",{"_index":1823,"t":{"315":{"position":[[264,7]]}}}],["my_job1",{"_index":1820,"t":{"315":{"position":[[217,7]]}}}],["my_job2",{"_index":1821,"t":{"315":{"position":[[227,7]]}}}],["my_pipeline1",{"_index":1819,"t":{"315":{"position":[[195,13]]}}}],["my_pipeline2",{"_index":1822,"t":{"315":{"position":[[242,13]]}}}],["mycirro",{"_index":3077,"t":{"626":{"position":[[325,8]]},"1069":{"position":[[325,8]]}}}],["mycloud",{"_index":358,"t":{"36":{"position":[[1821,7]]},"1168":{"position":[[584,7]]}}}],["myclust",{"_index":2886,"t":{"493":{"position":[[319,9],[377,10]]}}}],["mycluster/clusterctl.yaml",{"_index":2885,"t":{"493":{"position":[[192,27]]}}}],["mycluster/mycluster.yaml",{"_index":2887,"t":{"493":{"position":[[425,27]]}}}],["mydomain.xyz",{"_index":4815,"t":{"1168":{"position":[[702,13]]}}}],["myfile.pi",{"_index":4740,"t":{"1149":{"position":[[6,9]]},"1155":{"position":[[144,9]]}}}],["myfirsttestjob",{"_index":1930,"t":{"319":{"position":[[6734,14],[7031,14],[7099,14]]}}}],["myflavor",{"_index":4810,"t":{"1168":{"position":[[600,8]]}}}],["mykeypair",{"_index":4811,"t":{"1168":{"position":[[638,9]]}}}],["myprivatenet",{"_index":4812,"t":{"1168":{"position":[[657,12]]}}}],["myproject",{"_index":4813,"t":{"1168":{"position":[[679,9]]}}}],["mysecondtestjob",{"_index":1933,"t":{"319":{"position":[[6942,15],[7061,15],[7158,15]]}}}],["mysql",{"_index":4903,"t":{"1187":{"position":[[249,5]]},"1280":{"position":[[914,7]]}}}],["mysql_db",{"_index":4898,"t":{"1187":{"position":[[148,8]]}}}],["n",{"_index":2055,"t":{"341":{"position":[[773,1]]},"352":{"position":[[1999,1],[2187,1]]},"457":{"position":[[6016,1],[6311,1],[6419,1]]},"486":{"position":[[598,1]]},"491":{"position":[[1849,1]]},"1407":{"position":[[189,1]]},"1588":{"position":[[1045,1]]},"1685":{"position":[[96,1],[197,1]]},"1692":{"position":[[18,1],[331,1],[439,1],[593,1]]},"1700":{"position":[[443,1],[539,1],[680,1]]},"1704":{"position":[[808,1]]},"1722":{"position":[[131,1]]},"1729":{"position":[[90,1],[403,1],[511,1],[665,1],[1642,1]]},"1731":{"position":[[830,1]]},"1747":{"position":[[64,1],[160,1],[303,1],[353,1]]},"1767":{"position":[[131,1]]},"1774":{"position":[[90,1],[403,1],[511,1],[665,1],[1783,1]]},"1786":{"position":[[116,3]]},"1788":{"position":[[143,3],[429,1],[553,1]]},"1810":{"position":[[3471,1],[3686,1],[3697,1],[4104,1]]},"1843":{"position":[[106,1],[602,1],[666,1],[901,4]]}}}],["n/s/l/p",{"_index":5821,"t":{"1685":{"position":[[127,9]]}}}],["n[u][o",{"_index":5819,"t":{"1685":{"position":[[109,8]]},"1722":{"position":[[88,7]]},"1767":{"position":[[88,7]]}}}],["n_bms_3",{"_index":6090,"t":{"1729":{"position":[[1712,7]]},"1774":{"position":[[1853,7]]}}}],["name",{"_index":170,"t":{"25":{"position":[[172,4]]},"27":{"position":[[26,4]]},"30":{"position":[[31,4]]},"32":{"position":[[26,4]]},"36":{"position":[[1493,5]]},"76":{"position":[[259,4]]},"90":{"position":[[98,5]]},"100":{"position":[[1769,4]]},"146":{"position":[[23,6],[84,4],[122,5],[183,5]]},"150":{"position":[[221,4],[395,5]]},"152":{"position":[[216,4],[340,5]]},"154":{"position":[[113,5],[257,5],[511,5],[646,5],[789,5],[925,5],[986,5]]},"210":{"position":[[46,4],[64,4]]},"251":{"position":[[1500,5]]},"315":{"position":[[126,5],[364,4]]},"319":{"position":[[335,5],[777,5],[833,4],[939,4],[2565,5],[2651,5],[2816,4],[3435,5],[4368,5],[4374,6],[5210,6],[5254,4],[5324,6],[5422,5],[5572,4],[5733,4],[5775,4],[6117,5],[6202,4],[6261,4],[6521,5],[6728,5],[6773,5],[6796,4],[6936,5]]},"345":{"position":[[1776,5],[1814,5],[2020,5],[2087,5]]},"352":{"position":[[1326,4]]},"360":{"position":[[114,4]]},"397":{"position":[[164,4]]},"416":{"position":[[442,4]]},"418":{"position":[[177,4]]},"420":{"position":[[823,4],[1357,4],[3321,5]]},"426":{"position":[[269,4],[313,4],[379,4],[468,4]]},"428":{"position":[[143,4]]},"430":{"position":[[161,4]]},"438":{"position":[[442,4]]},"440":{"position":[[29,4],[51,4],[141,4]]},"449":{"position":[[454,5]]},"453":{"position":[[933,4]]},"457":{"position":[[2480,4],[4917,5],[5054,4],[5115,4],[9061,5],[9251,5],[9367,5],[9445,6]]},"459":{"position":[[66,4]]},"468":{"position":[[658,5]]},"470":{"position":[[4072,4]]},"476":{"position":[[1674,5]]},"480":{"position":[[121,4],[493,4]]},"486":{"position":[[608,4],[858,4],[1151,4],[1624,4]]},"489":{"position":[[201,4]]},"491":{"position":[[458,4],[673,4],[1416,4],[2107,4]]},"493":{"position":[[372,4],[572,4]]},"495":{"position":[[638,4]]},"595":{"position":[[615,4]]},"606":{"position":[[258,6]]},"610":{"position":[[239,4],[518,4],[528,4],[628,4],[900,6],[1005,6]]},"612":{"position":[[260,4],[302,6],[372,4]]},"614":{"position":[[34,5],[120,4],[166,5]]},"626":{"position":[[319,5],[967,4]]},"630":{"position":[[166,4]]},"632":{"position":[[335,4],[572,5]]},"634":{"position":[[392,4],[551,6],[568,5]]},"636":{"position":[[65,4]]},"657":{"position":[[237,5],[278,5],[321,5],[358,5]]},"661":{"position":[[138,5]]},"667":{"position":[[243,5]]},"693":{"position":[[907,5]]},"695":{"position":[[334,4]]},"724":{"position":[[718,4],[1507,4]]},"746":{"position":[[276,5]]},"749":{"position":[[1109,4],[1342,4],[1596,4],[6661,4]]},"767":{"position":[[232,4]]},"778":{"position":[[265,4],[634,4]]},"787":{"position":[[590,4],[630,4],[760,4],[1103,4],[1265,4]]},"793":{"position":[[0,4]]},"795":{"position":[[0,4]]},"800":{"position":[[197,4]]},"825":{"position":[[26,4]]},"841":{"position":[[82,4]]},"850":{"position":[[672,4],[2734,5],[2817,5],[2909,5],[3007,5],[3097,5],[3485,4]]},"856":{"position":[[942,4]]},"860":{"position":[[974,4],[1639,4]]},"869":{"position":[[815,4],[989,4],[1175,4]]},"947":{"position":[[558,4],[629,5],[707,5]]},"954":{"position":[[55,5]]},"999":{"position":[[220,5]]},"1010":{"position":[[1469,5],[2798,5]]},"1014":{"position":[[119,5],[613,4],[692,4],[962,5],[1072,4],[1151,4],[1332,4],[1411,4],[1592,5],[1673,5],[1961,4],[2040,4]]},"1016":{"position":[[65,6],[144,6],[1630,5]]},"1034":{"position":[[971,4],[1674,4],[2208,4],[5759,4],[7854,4],[8913,4]]},"1036":{"position":[[503,5]]},"1041":{"position":[[261,4]]},"1043":{"position":[[111,5]]},"1051":{"position":[[258,6]]},"1055":{"position":[[239,4],[518,4],[528,4],[628,4],[900,6],[1005,6]]},"1057":{"position":[[260,4],[302,6],[372,4]]},"1059":{"position":[[34,5],[120,4],[166,5]]},"1069":{"position":[[319,5],[967,4]]},"1073":{"position":[[166,4]]},"1075":{"position":[[335,4],[572,5]]},"1077":{"position":[[392,4],[551,6],[568,5]]},"1079":{"position":[[65,4]]},"1114":{"position":[[439,5]]},"1116":{"position":[[120,5],[508,4],[1723,5],[1863,5]]},"1122":{"position":[[106,4],[225,5]]},"1135":{"position":[[23,6],[84,4],[122,5],[183,5]]},"1137":{"position":[[222,4],[396,5]]},"1139":{"position":[[155,5]]},"1168":{"position":[[530,5],[790,5],[871,5],[961,5],[1141,5],[1400,5],[1540,5],[1697,5],[1738,5],[1821,5],[1913,5],[1994,5],[2060,5],[2099,5],[2152,5],[2245,5],[2298,5],[2372,5],[2411,5],[2450,5],[2487,5]]},"1170":{"position":[[1117,5]]},"1172":{"position":[[330,5],[471,5]]},"1174":{"position":[[35,5],[113,5],[252,5],[406,5],[481,5],[571,5],[789,5],[868,5],[884,4]]},"1177":{"position":[[20,6]]},"1262":{"position":[[216,4],[482,4],[1110,5],[2764,4]]},"1296":{"position":[[15,5],[46,5]]},"1298":{"position":[[3340,5],[3981,5],[4731,5],[4919,5],[7920,5],[8064,5],[8204,5],[8342,5],[8602,5],[8757,5],[8924,5],[9084,5],[9239,5],[9394,5],[10806,5],[11978,5],[13228,5]]},"1300":{"position":[[15,5],[44,5],[109,5],[124,5],[149,5]]},"1302":{"position":[[15,5],[77,5]]},"1353":{"position":[[96,6],[143,6]]},"1417":{"position":[[672,6],[880,6]]},"1439":{"position":[[4,5]]},"1441":{"position":[[100,4]]},"1449":{"position":[[46,4]]},"1451":{"position":[[672,6]]},"1488":{"position":[[137,7],[284,6]]},"1520":{"position":[[105,4]]},"1539":{"position":[[108,4]]},"1553":{"position":[[455,6]]},"1557":{"position":[[182,6]]},"1559":{"position":[[15,6],[66,6]]},"1588":{"position":[[903,4],[1238,7],[1265,4],[1538,4]]},"1594":{"position":[[349,5],[429,7],[446,4],[1872,4],[1903,6],[1956,6]]},"1632":{"position":[[171,4],[188,4]]},"1634":{"position":[[626,4]]},"1638":{"position":[[162,4],[179,4],[218,6],[306,6]]},"1642":{"position":[[0,5],[136,5],[393,5],[406,6],[614,4],[630,5],[1057,5],[1209,5],[1362,5]]},"1680":{"position":[[343,6],[404,5],[590,5]]},"1696":{"position":[[569,5]]},"1698":{"position":[[685,4]]},"1700":{"position":[[106,5],[373,5]]},"1706":{"position":[[619,5],[1286,6],[1450,6],[1493,6]]},"1708":{"position":[[55,6],[420,5],[1314,5]]},"1710":{"position":[[101,6],[270,4],[323,5]]},"1712":{"position":[[120,6],[339,6],[492,6]]},"1715":{"position":[[313,7]]},"1717":{"position":[[343,6],[404,5],[590,5],[1117,4],[1431,5],[1544,5]]},"1720":{"position":[[565,5],[706,5],[772,5],[840,6]]},"1722":{"position":[[331,5]]},"1733":{"position":[[558,5],[781,5],[1514,6],[1714,6],[1757,6]]},"1735":{"position":[[101,6],[270,4],[323,5],[419,5],[554,5],[764,5]]},"1739":{"position":[[343,6],[455,4],[698,5],[813,5],[1460,5],[1496,5]]},"1743":{"position":[[569,5]]},"1745":{"position":[[792,4]]},"1751":{"position":[[55,6],[420,5],[1318,5]]},"1755":{"position":[[52,6],[226,5],[282,6],[381,5],[831,5],[1366,5],[1523,5]]},"1757":{"position":[[517,5]]},"1760":{"position":[[313,7]]},"1762":{"position":[[343,6],[404,5],[489,5],[1016,4],[1330,5],[1443,5]]},"1765":{"position":[[565,5],[706,5],[772,5],[840,6]]},"1767":{"position":[[331,5]]},"1776":{"position":[[403,5],[626,5],[1359,6],[1559,6],[1602,6]]},"1778":{"position":[[28,4],[101,6],[115,4],[184,6],[355,4],[408,5],[504,5],[639,5],[799,5]]},"1780":{"position":[[341,6],[453,4],[696,5],[811,5],[1461,5],[1497,5]]},"1784":{"position":[[582,5]]},"1786":{"position":[[1013,4]]},"1792":{"position":[[55,6],[420,5],[1341,5]]},"1796":{"position":[[188,6],[362,5],[418,6],[517,5],[833,5],[1368,5],[1525,5]]},"1798":{"position":[[517,5]]},"1805":{"position":[[33,5],[219,5],[296,5]]},"1810":{"position":[[116,4],[197,4],[772,5],[1196,4],[3064,4],[4083,5],[4327,4],[4492,4]]},"1814":{"position":[[696,4]]},"1826":{"position":[[187,4]]},"1843":{"position":[[123,4],[482,6]]},"1847":{"position":[[12,4]]},"1849":{"position":[[12,4]]},"1851":{"position":[[244,5],[341,5]]},"1859":{"position":[[59,6],[189,5]]},"1862":{"position":[[263,6]]},"1870":{"position":[[29,4],[41,4],[430,4]]},"1872":{"position":[[29,4],[41,4],[148,4],[543,4],[622,4]]},"1874":{"position":[[10,5],[150,5],[394,5],[516,5],[647,5]]},"1877":{"position":[[191,4],[253,5]]},"1886":{"position":[[27,6]]},"1891":{"position":[[5625,6],[5750,4],[5796,7]]},"1893":{"position":[[87,6]]},"1895":{"position":[[1135,6]]},"1899":{"position":[[61,6],[212,6]]},"1930":{"position":[[63,6]]},"1932":{"position":[[629,5],[791,4],[960,4]]},"1936":{"position":[[125,4]]},"1945":{"position":[[163,4]]},"2056":{"position":[[7,5]]},"2058":{"position":[[774,4],[1007,4],[1261,4]]},"2068":{"position":[[1624,6],[1753,5]]},"2071":{"position":[[106,5]]},"2073":{"position":[[9,6]]},"2077":{"position":[[15,7],[27,6],[194,4],[2379,7],[2994,6]]},"2106":{"position":[[143,6]]},"2108":{"position":[[136,5]]},"2112":{"position":[[18,5]]},"2214":{"position":[[197,6]]}}}],["name/id",{"_index":2251,"t":{"418":{"position":[[256,7]]}}}],["name>.servic",{"_index":4331,"t":{"1016":{"position":[[393,13],[745,13]]}}}],["name_schem",{"_index":6336,"t":{"1872":{"position":[[88,11],[589,12],[668,12]]},"1874":{"position":[[176,12]]}}}],["name_serv",{"_index":3430,"t":{"714":{"position":[[1030,11]]},"724":{"position":[[1024,11]]}}}],["nameserv",{"_index":2256,"t":{"418":{"position":[[541,11]]},"667":{"position":[[285,12],[525,12]]},"724":{"position":[[1036,11],[1057,10],[1151,11]]}}}],["namespac",{"_index":1675,"t":{"269":{"position":[[483,10]]},"457":{"position":[[2485,9],[5939,10]]},"462":{"position":[[1348,10]]},"472":{"position":[[1262,10]]},"1964":{"position":[[1387,12]]}}}],["namev1",{"_index":6153,"t":{"1755":{"position":[[461,9]]},"1796":{"position":[[597,9]]}}}],["namev1=$(echo",{"_index":6156,"t":{"1755":{"position":[[558,13]]},"1796":{"position":[[694,13]]}}}],["namev2",{"_index":6157,"t":{"1755":{"position":[[572,9]]},"1796":{"position":[[708,9]]}}}],["namev2=$(echo",{"_index":6152,"t":{"1755":{"position":[[447,13]]},"1796":{"position":[[583,13]]}}}],["naming.md",{"_index":5692,"t":{"1588":{"position":[[1298,10]]},"1594":{"position":[[492,10]]},"1642":{"position":[[516,9]]}}}],["namingstrategi",{"_index":2904,"t":{"498":{"position":[[22,14]]}}}],["napkin",{"_index":1519,"t":{"225":{"position":[[352,8]]}}}],["napl",{"_index":5912,"t":{"1698":{"position":[[349,8]]},"1745":{"position":[[440,8]]},"1786":{"position":[[661,8]]}}}],["nativ",{"_index":2422,"t":{"426":{"position":[[247,7]]},"1886":{"position":[[367,6],[580,6],[652,7]]},"2028":{"position":[[2610,7]]}}}],["natur",{"_index":5735,"t":{"1622":{"position":[[1396,10]]},"1725":{"position":[[84,7]]},"1770":{"position":[[84,7]]},"1998":{"position":[[581,6]]},"2212":{"position":[[407,9]]}}}],["navig",{"_index":86,"t":{"14":{"position":[[118,8]]},"1659":{"position":[[595,10]]},"1665":{"position":[[32,10]]},"1667":{"position":[[32,10]]}}}],["nbde",{"_index":5476,"t":{"1397":{"position":[[616,6]]}}}],["nearli",{"_index":848,"t":{"144":{"position":[[7,6]]}}}],["neccess",{"_index":6613,"t":{"2022":{"position":[[664,10]]}}}],["necess",{"_index":6407,"t":{"1895":{"position":[[624,9]]},"1917":{"position":[[174,9]]},"1984":{"position":[[33,9]]},"2022":{"position":[[1130,9]]},"2077":{"position":[[3310,9]]}}}],["necessari",{"_index":893,"t":{"152":{"position":[[314,10]]},"206":{"position":[[158,9]]},"208":{"position":[[415,10]]},"225":{"position":[[158,9]]},"227":{"position":[[177,10]]},"229":{"position":[[169,10],[472,9]]},"231":{"position":[[219,9]]},"233":{"position":[[203,10],[270,10]]},"237":{"position":[[264,9]]},"319":{"position":[[1247,9]]},"432":{"position":[[118,9]]},"476":{"position":[[954,9]]},"708":{"position":[[193,9]]},"729":{"position":[[1492,9]]},"735":{"position":[[491,10]]},"763":{"position":[[2082,9],[2231,9]]},"769":{"position":[[142,10]]},"771":{"position":[[142,10]]},"773":{"position":[[116,9],[234,9],[609,10]]},"787":{"position":[[1051,9],[1760,9],[2124,9]]},"798":{"position":[[78,9]]},"831":{"position":[[231,9]]},"839":{"position":[[98,9]]},"860":{"position":[[2984,9]]},"869":{"position":[[1289,10]]},"871":{"position":[[246,9]]},"960":{"position":[[992,9]]},"985":{"position":[[848,10]]},"1099":{"position":[[136,9]]},"1101":{"position":[[291,10]]},"1112":{"position":[[758,10]]},"1116":{"position":[[215,9]]},"1184":{"position":[[16,9]]},"1218":{"position":[[87,9]]},"1244":{"position":[[18,9],[106,10]]},"1246":{"position":[[18,9],[106,10]]},"1586":{"position":[[234,9]]},"1590":{"position":[[223,10]]},"1598":{"position":[[266,10]]},"1600":{"position":[[306,9]]},"1667":{"position":[[894,9]]},"1671":{"position":[[253,10]]},"1986":{"position":[[278,9]]},"1998":{"position":[[327,9]]},"2004":{"position":[[1410,9]]},"2013":{"position":[[991,9]]},"2077":{"position":[[1624,9],[3422,9]]},"2170":{"position":[[8,9]]}}}],["necessarili",{"_index":1310,"t":{"185":{"position":[[1321,11]]},"1692":{"position":[[450,11]]},"1729":{"position":[[522,11]]},"1774":{"position":[[522,11]]}}}],["necessit",{"_index":5798,"t":{"1669":{"position":[[594,12]]},"1988":{"position":[[328,13]]}}}],["necsessarili",{"_index":6796,"t":{"2150":{"position":[[238,12]]}}}],["need",{"_index":172,"t":{"25":{"position":[[222,6]]},"27":{"position":[[61,6]]},"30":{"position":[[81,6]]},"32":{"position":[[61,6]]},"46":{"position":[[24,5]]},"53":{"position":[[24,5]]},"68":{"position":[[320,4]]},"76":{"position":[[168,4],[523,4]]},"78":{"position":[[48,4]]},"83":{"position":[[46,4]]},"104":{"position":[[29,4]]},"106":{"position":[[31,4]]},"129":{"position":[[484,4],[755,4]]},"150":{"position":[[38,6],[93,5]]},"152":{"position":[[7,4],[99,7]]},"175":{"position":[[918,4],[1058,5],[1107,6]]},"177":{"position":[[1016,5]]},"181":{"position":[[38,5]]},"183":{"position":[[179,5]]},"185":{"position":[[755,4],[1058,6],[2174,6],[2199,4],[2569,4],[2901,4]]},"204":{"position":[[534,4]]},"208":{"position":[[233,4],[340,5]]},"251":{"position":[[356,5],[1444,5]]},"282":{"position":[[246,5]]},"288":{"position":[[425,6]]},"292":{"position":[[243,5]]},"307":{"position":[[228,4]]},"311":{"position":[[207,4],[420,4]]},"317":{"position":[[296,4],[609,4],[684,5]]},"319":{"position":[[825,5],[972,4],[1290,4],[1424,4],[1601,4],[2336,5],[2808,5],[3343,5]]},"321":{"position":[[205,6],[460,6]]},"325":{"position":[[514,6],[889,7]]},"327":{"position":[[764,7]]},"329":{"position":[[138,6],[327,6]]},"348":{"position":[[21,4],[635,4]]},"363":{"position":[[1348,4]]},"377":{"position":[[121,4]]},"381":{"position":[[691,4]]},"416":{"position":[[633,6]]},"422":{"position":[[415,6],[789,6]]},"424":{"position":[[601,4],[847,6],[1309,4]]},"426":{"position":[[717,4]]},"428":{"position":[[221,4]]},"430":{"position":[[245,4]]},"432":{"position":[[238,6]]},"438":{"position":[[4,4]]},"447":{"position":[[219,6]]},"453":{"position":[[431,4]]},"457":{"position":[[5331,5],[9261,4]]},"462":{"position":[[388,7]]},"470":{"position":[[592,6],[700,4],[1772,6],[3110,4],[3633,4]]},"472":{"position":[[1457,6]]},"474":{"position":[[226,5],[3430,4]]},"476":{"position":[[349,5]]},"478":{"position":[[51,5],[361,5],[972,4]]},"480":{"position":[[224,6],[325,6],[636,7]]},"482":{"position":[[92,4],[176,4]]},"491":{"position":[[1657,4]]},"502":{"position":[[503,4]]},"504":{"position":[[1137,4]]},"537":{"position":[[40,5]]},"547":{"position":[[70,6]]},"665":{"position":[[71,5]]},"720":{"position":[[128,5]]},"729":{"position":[[125,5]]},"749":{"position":[[944,6],[1203,6],[1432,6]]},"758":{"position":[[579,5]]},"767":{"position":[[199,4],[2472,4]]},"787":{"position":[[3355,7]]},"827":{"position":[[120,6]]},"834":{"position":[[998,6]]},"852":{"position":[[814,5]]},"856":{"position":[[89,4]]},"858":{"position":[[278,4]]},"860":{"position":[[1178,6],[2920,4]]},"865":{"position":[[190,6]]},"1014":{"position":[[168,4]]},"1016":{"position":[[16,4]]},"1112":{"position":[[74,6],[811,4],[865,4]]},"1122":{"position":[[592,6],[844,5],[1287,5],[1606,5],[1927,5],[2258,5],[2580,5],[2902,5],[3223,5],[3539,5]]},"1137":{"position":[[38,6],[93,5]]},"1139":{"position":[[7,4],[92,7]]},"1170":{"position":[[6,4],[541,4],[580,5]]},"1172":{"position":[[81,4]]},"1179":{"position":[[231,5]]},"1262":{"position":[[195,4],[3126,4]]},"1270":{"position":[[606,4]]},"1332":{"position":[[115,4],[167,5]]},"1337":{"position":[[82,4],[122,6]]},"1353":{"position":[[283,4],[541,4]]},"1355":{"position":[[555,4]]},"1381":{"position":[[138,6]]},"1383":{"position":[[490,5]]},"1402":{"position":[[715,5]]},"1405":{"position":[[188,6]]},"1413":{"position":[[26,4]]},"1415":{"position":[[156,4]]},"1439":{"position":[[391,4]]},"1567":{"position":[[146,4],[283,4]]},"1571":{"position":[[407,4]]},"1577":{"position":[[36,4],[421,4]]},"1586":{"position":[[387,5]]},"1607":{"position":[[171,4]]},"1640":{"position":[[289,7]]},"1647":{"position":[[79,4]]},"1649":{"position":[[82,4]]},"1667":{"position":[[666,4],[1046,6],[1626,6]]},"1669":{"position":[[444,6]]},"1680":{"position":[[37,4],[522,4]]},"1692":{"position":[[540,4],[1634,4]]},"1700":{"position":[[897,4],[1229,4]]},"1708":{"position":[[209,4],[1258,4],[1354,6],[1446,4]]},"1717":{"position":[[37,4],[522,4],[1509,4]]},"1725":{"position":[[41,4],[1228,6]]},"1729":{"position":[[612,4],[1840,4]]},"1739":{"position":[[564,4],[1295,4]]},"1747":{"position":[[550,4]]},"1749":{"position":[[130,4]]},"1751":{"position":[[209,4],[1262,4],[1358,6],[1450,4]]},"1755":{"position":[[985,5],[1497,4]]},"1762":{"position":[[37,4],[1408,4]]},"1770":{"position":[[41,4]]},"1774":{"position":[[612,4],[1981,4]]},"1780":{"position":[[562,4],[1293,4]]},"1788":{"position":[[750,4]]},"1790":{"position":[[153,4]]},"1792":{"position":[[209,4],[1285,4],[1381,6],[1473,4]]},"1796":{"position":[[987,5],[1499,4]]},"1812":{"position":[[24,5],[236,5]]},"1814":{"position":[[28,5],[262,5]]},"1816":{"position":[[1019,4]]},"1841":{"position":[[37,4],[407,4]]},"1888":{"position":[[888,6]]},"1891":{"position":[[1229,5],[4655,4],[4982,4]]},"1895":{"position":[[235,5],[864,4]]},"1901":{"position":[[35,5]]},"1904":{"position":[[41,4]]},"1917":{"position":[[992,4]]},"1932":{"position":[[549,4],[2391,5],[3314,4]]},"1934":{"position":[[173,6]]},"1936":{"position":[[77,6],[446,5]]},"1958":{"position":[[441,6],[642,5]]},"1975":{"position":[[1481,4],[1985,4]]},"1977":{"position":[[534,4],[1771,5]]},"1984":{"position":[[363,4]]},"1986":{"position":[[224,7]]},"2000":{"position":[[363,4]]},"2004":{"position":[[46,6],[424,4],[824,4]]},"2013":{"position":[[478,5]]},"2022":{"position":[[768,5]]},"2024":{"position":[[796,5]]},"2026":{"position":[[60,5],[882,4]]},"2028":{"position":[[2131,4],[2223,5]]},"2030":{"position":[[93,4],[340,4]]},"2058":{"position":[[609,6],[868,6],[1097,6]]},"2077":{"position":[[2712,6]]},"2088":{"position":[[368,4]]},"2090":{"position":[[733,7]]},"2096":{"position":[[858,6],[1121,5]]},"2106":{"position":[[211,5]]},"2124":{"position":[[257,4]]},"2137":{"position":[[93,4],[198,4]]},"2141":{"position":[[120,7]]},"2143":{"position":[[187,4]]},"2170":{"position":[[119,6]]},"2172":{"position":[[6,4],[271,4]]},"2200":{"position":[[63,4]]},"2202":{"position":[[271,4]]},"2206":{"position":[[118,5],[294,4]]}}}],["neglig",{"_index":1150,"t":{"177":{"position":[[212,11],[974,11]]}}}],["ness",{"_index":6675,"t":{"2061":{"position":[[369,4]]},"2068":{"position":[[2107,4]]}}}],["nest",{"_index":1644,"t":{"265":{"position":[[461,6]]},"319":{"position":[[2041,9]]},"852":{"position":[[214,6],[352,6],[385,6],[489,6]]},"1696":{"position":[[409,6],[535,8]]},"1743":{"position":[[409,6],[535,8],[745,6]]},"1784":{"position":[[422,6],[548,8],[758,6]]}}}],["net.core.rmem_max",{"_index":3352,"t":{"693":{"position":[[405,17]]}}}],["net.core.somaxconn",{"_index":3355,"t":{"693":{"position":[[511,18]]}}}],["net.core.wmem_max",{"_index":3350,"t":{"693":{"position":[[369,17]]}}}],["net.ipv4.tcp_fin_timeout",{"_index":3353,"t":{"693":{"position":[[441,24]]}}}],["net.ipv4.tcp_keepalive_intvl",{"_index":3348,"t":{"693":{"position":[[288,28]]}}}],["net.ipv4.tcp_keepalive_prob",{"_index":3349,"t":{"693":{"position":[[328,29]]}}}],["net.ipv4.tcp_keepalive_tim",{"_index":3347,"t":{"693":{"position":[[249,27]]}}}],["net.ipv4.tcp_max_syn_backlog",{"_index":3358,"t":{"693":{"position":[[579,28]]}}}],["net.ipv4.tcp_syncooki",{"_index":3357,"t":{"693":{"position":[[544,23]]}}}],["net.ipv4.tcp_tw_reus",{"_index":3354,"t":{"693":{"position":[[478,21]]}}}],["net.netfilter.nf_conntrack_max",{"_index":3360,"t":{"693":{"position":[[645,30]]}}}],["net003",{"_index":3705,"t":{"763":{"position":[[2819,9],[2998,9]]}}}],["netbox",{"_index":904,"t":{"154":{"position":[[129,6]]},"708":{"position":[[115,6]]},"729":{"position":[[97,6],[252,6],[343,7],[404,7],[517,7],[1505,6]]},"773":{"position":[[192,6],[251,6],[290,6]]},"800":{"position":[[827,6]]},"821":{"position":[[227,6]]},"841":{"position":[[574,6]]},"1308":{"position":[[314,7]]},"1434":{"position":[[1226,6],[1412,7]]}}}],["netbox.netbox",{"_index":903,"t":{"154":{"position":[[60,13],[488,13]]}}}],["netbox.netbox.netbox_manufactur",{"_index":906,"t":{"154":{"position":[[150,34]]}}}],["netbox_data_manufactur",{"_index":914,"t":{"154":{"position":[[405,25]]}}}],["netbox_sit",{"_index":919,"t":{"154":{"position":[[539,12]]}}}],["netbox_token",{"_index":908,"t":{"154":{"position":[[216,13],[234,12],[583,13],[601,12]]}}}],["netbox_url",{"_index":907,"t":{"154":{"position":[[185,11],[201,10],[552,11],[568,10]]}}}],["netdata",{"_index":3473,"t":{"729":{"position":[[2203,7],[2287,7]]},"800":{"position":[[883,7]]},"821":{"position":[[234,7]]},"841":{"position":[[635,7]]},"1308":{"position":[[331,8]]}}}],["netdata_host_typ",{"_index":3474,"t":{"729":{"position":[[2211,18],[2305,18]]}}}],["netlifi",{"_index":6755,"t":{"2096":{"position":[[1216,7],[1273,7],[1343,7],[1846,7]]}}}],["netowrk",{"_index":3293,"t":{"670":{"position":[[91,7]]}}}],["netplan",{"_index":3234,"t":{"663":{"position":[[69,7]]},"665":{"position":[[49,7],[112,7],[759,7],[2478,7],[2673,7]]},"667":{"position":[[4,7]]},"670":{"position":[[113,7]]},"727":{"position":[[369,7]]},"729":{"position":[[2500,7]]},"850":{"position":[[1998,7]]}}}],["netplan(5",{"_index":3251,"t":{"665":{"position":[[934,11]]}}}],["netwok",{"_index":3233,"t":{"663":{"position":[[47,6]]}}}],["network",{"_index":51,"t":{"9":{"position":[[54,8]]},"175":{"position":[[226,9]]},"179":{"position":[[388,9],[786,9]]},"181":{"position":[[274,7]]},"183":{"position":[[1199,7]]},"323":{"position":[[419,7]]},"327":{"position":[[359,10],[692,10]]},"352":{"position":[[2581,8]]},"363":{"position":[[119,9]]},"418":{"position":[[299,8],[346,7],[384,9],[442,7]]},"420":{"position":[[4581,10]]},"468":{"position":[[727,7]]},"470":{"position":[[5170,7]]},"541":{"position":[[56,7]]},"561":{"position":[[324,8]]},"563":{"position":[[370,7]]},"569":{"position":[[206,7]]},"571":{"position":[[125,11],[145,10],[432,7]]},"573":{"position":[[146,10],[206,8]]},"577":{"position":[[13,7],[28,7],[129,8],[164,7],[215,7]]},"583":{"position":[[145,7]]},"595":{"position":[[14,10],[53,10],[117,9],[279,8],[418,9],[555,10],[741,10]]},"665":{"position":[[31,7],[862,7],[950,8],[1603,7],[2405,7]]},"724":{"position":[[84,7],[164,7]]},"727":{"position":[[347,7]]},"729":{"position":[[1066,7],[1211,7],[1234,9],[1733,9],[2392,7]]},"763":{"position":[[2335,7],[2399,7],[2434,7],[2520,7],[2803,8],[2982,8]]},"769":{"position":[[374,7],[484,7],[515,7],[538,7],[569,7],[690,7],[761,7],[831,7]]},"778":{"position":[[476,7],[653,8]]},"780":{"position":[[257,7]]},"787":{"position":[[3255,7]]},"816":{"position":[[242,8],[320,9],[413,7],[542,7]]},"829":{"position":[[661,7],[680,7],[741,7]]},"831":{"position":[[249,9]]},"834":{"position":[[1087,7],[1533,7]]},"836":{"position":[[1478,7]]},"850":{"position":[[130,7],[174,7],[625,8],[686,7],[746,7],[874,7],[939,7],[1001,7],[1022,7],[1060,7],[1081,7],[1119,7],[1140,7],[1180,7],[1201,7],[1241,7],[1262,7],[1302,7],[1323,7],[1669,7],[1985,7],[2117,7],[2765,7],[2848,7],[3345,7],[3423,8],[3568,8],[3690,7]]},"860":{"position":[[187,7],[677,7],[730,7],[829,7]]},"863":{"position":[[97,7]]},"900":{"position":[[109,7],[139,7]]},"941":{"position":[[757,7]]},"1168":{"position":[[648,8],[1564,8],[1577,7]]},"1298":{"position":[[7585,12],[7882,9]]},"1308":{"position":[[93,10]]},"1397":{"position":[[586,7]]},"1436":{"position":[[74,7]]},"1520":{"position":[[420,7]]},"1539":{"position":[[423,7]]},"1553":{"position":[[197,11]]},"1665":{"position":[[451,7]]},"1683":{"position":[[305,7]]},"1692":{"position":[[20,7],[734,8]]},"1700":{"position":[[1169,11]]},"1702":{"position":[[73,7]]},"1704":{"position":[[1063,9]]},"1708":{"position":[[701,7]]},"1720":{"position":[[364,7]]},"1729":{"position":[[92,7],[806,8]]},"1731":{"position":[[1085,9]]},"1749":{"position":[[25,11]]},"1751":{"position":[[740,7]]},"1753":{"position":[[73,7]]},"1765":{"position":[[364,7]]},"1774":{"position":[[92,7],[947,8]]},"1790":{"position":[[48,11]]},"1792":{"position":[[740,7]]},"1794":{"position":[[73,7]]},"1843":{"position":[[893,7]]},"1853":{"position":[[464,7],[617,9]]},"1888":{"position":[[276,9],[411,9],[1222,7],[1259,7],[1413,9]]},"1891":{"position":[[3117,9],[5273,7],[6026,9]]},"1893":{"position":[[943,9]]},"1895":{"position":[[808,9]]},"1926":{"position":[[546,7]]},"1966":{"position":[[2184,7]]},"2137":{"position":[[173,7]]},"2155":{"position":[[307,7]]}}}],["network.host",{"_index":3567,"t":{"746":{"position":[[1185,13],[3089,13]]}}}],["network.sh",{"_index":2659,"t":{"470":{"position":[[5108,10],[5273,10]]}}}],["network.yml",{"_index":4040,"t":{"850":{"position":[[2720,11]]}}}],["network_availability_zon",{"_index":3757,"t":{"778":{"position":[[953,25]]},"791":{"position":[[378,25]]}}}],["network_bond",{"_index":3265,"t":{"665":{"position":[[1719,13]]}}}],["network_bonds|to_nice_yaml(indent=4)|indent(4",{"_index":3255,"t":{"665":{"position":[[1033,46]]}}}],["network_bridg",{"_index":3268,"t":{"665":{"position":[[1824,15]]}}}],["network_bridges|to_nice_yaml(indent=4)|indent(4",{"_index":3256,"t":{"665":{"position":[[1095,48]]}}}],["network_dummy_interfac",{"_index":3294,"t":{"670":{"position":[[136,25]]}}}],["network_dummy_interface_mtu",{"_index":3297,"t":{"670":{"position":[[224,28]]}}}],["network_ethernet",{"_index":3269,"t":{"665":{"position":[[1933,17]]},"667":{"position":[[173,18]]},"727":{"position":[[377,18]]},"729":{"position":[[2508,18]]},"850":{"position":[[1877,18]]}}}],["network_ethernets|to_nice_yaml(indent=4)|indent(4",{"_index":3258,"t":{"665":{"position":[[1161,50]]}}}],["network_interfac",{"_index":3476,"t":{"729":{"position":[[2667,18]]},"744":{"position":[[30,17],[83,17],[136,17],[174,17],[255,17],[388,17]]}}}],["network_nam",{"_index":4047,"t":{"850":{"position":[[3121,13]]}}}],["network_netplan_fil",{"_index":3241,"t":{"665":{"position":[[239,20]]}}}],["network_netplan_managed_files_extra",{"_index":3247,"t":{"665":{"position":[[607,36]]}}}],["network_netplan_path",{"_index":3240,"t":{"665":{"position":[[214,20]]}}}],["network_netplan_permiss",{"_index":3244,"t":{"665":{"position":[[338,27]]}}}],["network_netplan_remove_unmanaged_fil",{"_index":3246,"t":{"665":{"position":[[472,38]]}}}],["network_render",{"_index":3253,"t":{"665":{"position":[[1003,16],[1564,16]]}}}],["network_trait",{"_index":5247,"t":{"1298":{"position":[[7787,15],[7904,15],[8048,15],[8188,15],[8326,15],[8472,15],[8586,15],[8741,15],[8908,15],[9068,15],[9223,15],[9378,15],[9541,15]]}}}],["network_tunnel",{"_index":3270,"t":{"665":{"position":[[2046,15]]}}}],["network_tunnels|to_nice_yaml(indent=4)|indent(4",{"_index":3260,"t":{"665":{"position":[[1227,48]]}}}],["network_typ",{"_index":3237,"t":{"665":{"position":[[98,13]]},"672":{"position":[[38,12],[108,13]]},"727":{"position":[[355,13]]},"729":{"position":[[2486,13]]}}}],["network_vers",{"_index":3252,"t":{"665":{"position":[[971,15],[1443,15]]}}}],["network_vlan",{"_index":3271,"t":{"665":{"position":[[2155,13]]},"667":{"position":[[394,14]]}}}],["network_vlans|to_nice_yaml(indent=4)|indent(4",{"_index":3261,"t":{"665":{"position":[[1289,46]]}}}],["network_workload_interfac",{"_index":4032,"t":{"850":{"position":[[2067,26],[2339,27]]}}}],["networkd",{"_index":3263,"t":{"665":{"position":[[1581,8],[1690,8]]}}}],["networkmanag",{"_index":3264,"t":{"665":{"position":[[1703,15]]}}}],["neutron",{"_index":2981,"t":{"569":{"position":[[214,10]]},"595":{"position":[[32,7],[87,7],[349,7],[428,7],[591,10],[678,7],[969,7],[1021,7]]},"729":{"position":[[1105,8]]},"821":{"position":[[408,7]]},"850":{"position":[[2038,7],[2523,7]]},"900":{"position":[[216,7]]},"916":{"position":[[20,7],[40,7]]},"1238":{"position":[[20,7],[59,7]]},"1308":{"position":[[665,8]]},"1411":{"position":[[105,7]]}}}],["neutron_availability_zone_hints_network",{"_index":3806,"t":{"793":{"position":[[66,39]]}}}],["neutron_availability_zone_hints_rout",{"_index":3807,"t":{"793":{"position":[[106,38]]}}}],["neutron_bridge_nam",{"_index":4033,"t":{"850":{"position":[[2186,19],[2382,20]]}}}],["neutron_external_interfac",{"_index":3482,"t":{"729":{"position":[[2811,27]]},"744":{"position":[[53,26],[434,26]]}}}],["neutron_floatingip",{"_index":3815,"t":{"795":{"position":[[67,18]]}}}],["neutron_ovn_availability_zon",{"_index":4132,"t":{"900":{"position":[[252,31]]}}}],["neutron_plugin_ag",{"_index":4131,"t":{"900":{"position":[[54,20],[224,21]]}}}],["neutron_router_enable_snat",{"_index":3808,"t":{"793":{"position":[[145,26]]}}}],["neutron_ssh_key",{"_index":5487,"t":{"1407":{"position":[[48,15],[79,16]]}}}],["neutroncli",{"_index":322,"t":{"36":{"position":[[1134,13]]}}}],["never",{"_index":857,"t":{"146":{"position":[[89,5]]},"150":{"position":[[134,5]]},"158":{"position":[[323,5]]},"457":{"position":[[3727,5]]},"626":{"position":[[609,5]]},"936":{"position":[[601,5]]},"1069":{"position":[[609,5]]},"1135":{"position":[[89,5]]},"1137":{"position":[[135,5]]},"1141":{"position":[[313,5]]},"1810":{"position":[[1166,5],[1206,5]]}}}],["nevertheless",{"_index":1281,"t":{"183":{"position":[[1078,12]]},"1355":{"position":[[635,13]]},"1917":{"position":[[830,12]]},"1926":{"position":[[1546,12]]},"1932":{"position":[[2361,12],[3354,12]]}}}],["new",{"_index":96,"t":{"14":{"position":[[316,3]]},"18":{"position":[[106,3]]},"68":{"position":[[265,3]]},"164":{"position":[[328,3]]},"304":{"position":[[341,3]]},"317":{"position":[[457,3]]},"319":{"position":[[205,3],[7563,3]]},"327":{"position":[[478,3]]},"377":{"position":[[200,3]]},"397":{"position":[[127,3]]},"447":{"position":[[192,3],[367,3]]},"451":{"position":[[1456,3]]},"455":{"position":[[131,3]]},"457":{"position":[[1527,3],[1752,3],[2372,3],[3056,3],[3527,3],[4122,3],[4438,3],[6199,3],[6212,3],[6836,3],[7312,3],[8488,3],[9084,3],[9099,3],[9461,4]]},"459":{"position":[[21,3]]},"462":{"position":[[1409,3]]},"470":{"position":[[4351,3]]},"478":{"position":[[851,4],[903,3]]},"480":{"position":[[768,3]]},"495":{"position":[[78,3],[375,5],[888,3]]},"500":{"position":[[18,3],[165,3],[196,3]]},"597":{"position":[[495,3]]},"632":{"position":[[1311,3]]},"634":{"position":[[1214,3],[1265,3]]},"712":{"position":[[98,3]]},"714":{"position":[[18,3]]},"732":{"position":[[147,3]]},"735":{"position":[[1143,3]]},"758":{"position":[[368,3]]},"836":{"position":[[553,3]]},"860":{"position":[[987,3]]},"863":{"position":[[18,3]]},"936":{"position":[[490,3]]},"938":{"position":[[116,3],[556,3]]},"1003":{"position":[[147,3]]},"1007":{"position":[[147,3]]},"1010":{"position":[[2727,3],[3472,3]]},"1028":{"position":[[70,3]]},"1075":{"position":[[1311,3]]},"1077":{"position":[[1214,3],[1265,3]]},"1099":{"position":[[21,3]]},"1101":{"position":[[19,3]]},"1112":{"position":[[460,3]]},"1114":{"position":[[435,3]]},"1116":{"position":[[116,3],[263,3],[520,3],[2079,3],[2414,3],[2705,3]]},"1122":{"position":[[238,3],[344,3],[1144,3]]},"1130":{"position":[[293,3]]},"1181":{"position":[[244,3]]},"1209":{"position":[[214,3]]},"1262":{"position":[[1039,3]]},"1266":{"position":[[181,3]]},"1270":{"position":[[402,3]]},"1332":{"position":[[413,3]]},"1355":{"position":[[478,4]]},"1363":{"position":[[698,3]]},"1365":{"position":[[378,3],[669,3]]},"1370":{"position":[[50,3]]},"1377":{"position":[[913,3]]},"1411":{"position":[[707,3],[1055,3]]},"1431":{"position":[[218,3]]},"1434":{"position":[[1283,3]]},"1445":{"position":[[256,3],[589,3]]},"1447":{"position":[[88,3]]},"1471":{"position":[[299,3]]},"1475":{"position":[[189,3]]},"1488":{"position":[[2,3],[104,3],[217,3]]},"1569":{"position":[[404,3]]},"1571":{"position":[[81,3],[493,3]]},"1586":{"position":[[442,3]]},"1594":{"position":[[14,3],[41,3],[1778,3],[2015,3],[2049,3]]},"1598":{"position":[[279,3],[299,3]]},"1628":{"position":[[335,3]]},"1688":{"position":[[700,3]]},"1725":{"position":[[795,3]]},"1770":{"position":[[810,3]]},"1810":{"position":[[303,3],[335,3],[2420,3],[2773,3],[4472,3]]},"1877":{"position":[[152,3],[389,3],[518,3]]},"1879":{"position":[[469,3]]},"1888":{"position":[[1538,3]]},"1893":{"position":[[4,3],[526,3],[1143,3]]},"1895":{"position":[[898,3]]},"1906":{"position":[[245,3],[382,3]]},"1915":{"position":[[228,3]]},"1917":{"position":[[248,3],[554,3],[757,3]]},"1919":{"position":[[458,3],[520,3]]},"1966":{"position":[[3873,3],[3907,3]]},"2028":{"position":[[2204,3],[2266,3],[2385,3]]},"2039":{"position":[[395,3]]},"2043":{"position":[[90,3],[506,3],[743,3]]},"2045":{"position":[[665,3]]},"2049":{"position":[[305,3]]},"2051":{"position":[[877,3],[940,3],[1313,3],[1374,3]]},"2071":{"position":[[26,3]]},"2077":{"position":[[289,3],[1304,3],[1438,3],[1657,3],[2731,3]]},"2088":{"position":[[643,3]]},"2090":{"position":[[178,3]]},"2094":{"position":[[1940,3]]},"2096":{"position":[[332,3]]},"2114":{"position":[[184,3]]},"2122":{"position":[[31,3],[80,3],[166,3],[257,3]]},"2124":{"position":[[189,3]]},"2172":{"position":[[200,3]]},"2214":{"position":[[296,3]]}}}],["newcom",{"_index":82,"t":{"14":{"position":[[69,9]]}}}],["newer",{"_index":2536,"t":{"457":{"position":[[9308,5]]},"632":{"position":[[1164,5]]},"1003":{"position":[[192,5]]},"1075":{"position":[[1164,5]]},"1810":{"position":[[3710,5]]},"1917":{"position":[[198,5],[1036,5]]},"2028":{"position":[[3101,5]]}}}],["newest",{"_index":2583,"t":{"462":{"position":[[589,6]]},"1571":{"position":[[263,6]]},"1636":{"position":[[846,6]]},"2094":{"position":[[3011,6]]}}}],["newli",{"_index":2401,"t":{"422":{"position":[[1555,5]]},"1170":{"position":[[760,5]]},"1516":{"position":[[215,5]]}}}],["newslett",{"_index":1372,"t":{"195":{"position":[[224,10],[395,10]]},"204":{"position":[[401,11]]},"212":{"position":[[437,11]]},"216":{"position":[[250,11]]}}}],["next",{"_index":1075,"t":{"171":{"position":[[682,4]]},"185":{"position":[[2713,4]]},"317":{"position":[[712,4]]},"363":{"position":[[416,5]]},"377":{"position":[[170,4]]},"457":{"position":[[2516,4],[3467,4]]},"500":{"position":[[461,4]]},"502":{"position":[[743,4]]},"785":{"position":[[586,4]]},"860":{"position":[[857,4]]},"1112":{"position":[[700,4]]},"1116":{"position":[[1751,4],[1892,4],[2245,4]]},"1314":{"position":[[172,4],[823,4],[1345,4]]},"1383":{"position":[[933,4]]},"1411":{"position":[[366,4],[1105,4]]},"1445":{"position":[[306,4]]},"1469":{"position":[[141,4]]},"1543":{"position":[[831,4]]},"1594":{"position":[[705,4]]},"1725":{"position":[[0,4]]},"1770":{"position":[[0,4]]},"1879":{"position":[[248,4]]},"1964":{"position":[[4721,4]]}}}],["nextcloud",{"_index":489,"t":{"72":{"position":[[10,9],[288,10]]},"179":{"position":[[826,9]]},"290":{"position":[[102,9]]}}}],["nexu",{"_index":5525,"t":{"1434":{"position":[[1349,6],[1405,6]]},"1962":{"position":[[5276,5],[5282,5]]}}}],["nginx",{"_index":1780,"t":{"300":{"position":[[1083,5]]},"323":{"position":[[15,5],[294,5],[337,5],[462,5],[816,5]]},"325":{"position":[[423,5],[652,5],[927,5],[1296,5]]},"327":{"position":[[28,5]]},"420":{"position":[[4162,5],[4378,5],[5705,5]]},"422":{"position":[[1954,5]]},"457":{"position":[[6090,5],[6184,5],[6287,5],[6321,5],[6396,5],[6429,5],[7273,5],[8675,5],[10187,5]]},"462":{"position":[[2423,5]]},"466":{"position":[[0,6]]},"470":{"position":[[1388,5],[2469,5],[3908,5]]},"474":{"position":[[3694,5],[3803,5]]},"480":{"position":[[723,5]]},"486":{"position":[[1047,5]]},"491":{"position":[[281,5],[374,5],[508,5],[1859,5],[1881,5]]},"1368":{"position":[[1599,5]]},"1431":{"position":[[372,5]]},"1449":{"position":[[4,5]]},"1467":{"position":[[235,5]]}}}],["nginx_ingress_proxi",{"_index":2357,"t":{"420":{"position":[[4325,19]]},"457":{"position":[[5510,19]]}}}],["nginx_use_proxi",{"_index":1987,"t":{"325":{"position":[[1249,16]]}}}],["nic",{"_index":5551,"t":{"1465":{"position":[[366,3]]}}}],["nice",{"_index":1479,"t":{"214":{"position":[[256,4]]},"453":{"position":[[1134,6]]},"1346":{"position":[[216,6]]},"1469":{"position":[[338,6]]},"1891":{"position":[[2630,10]]},"1930":{"position":[[215,4]]},"1960":{"position":[[553,4]]},"1964":{"position":[[175,4],[505,5]]},"1966":{"position":[[1019,4]]},"2094":{"position":[[237,4]]}}}],["nightli",{"_index":5595,"t":{"1520":{"position":[[43,7]]},"1539":{"position":[[43,7]]}}}],["nip.io",{"_index":2880,"t":{"491":{"position":[[1801,6]]}}}],["nl/v/t/c[i",{"_index":6069,"t":{"1722":{"position":[[75,11]]},"1767":{"position":[[75,11]]}}}],["nn",{"_index":2580,"t":{"462":{"position":[[501,2]]}}}],["no1",{"_index":2123,"t":{"352":{"position":[[1676,3],[1740,3],[1784,3]]}}}],["no_proxi",{"_index":2276,"t":{"418":{"position":[[1221,8],[1381,8],[1603,8]]}}}],["nobackfil",{"_index":4234,"t":{"975":{"position":[[56,10]]},"1014":{"position":[[412,10]]},"1016":{"position":[[1090,10]]}}}],["node",{"_index":749,"t":{"129":{"position":[[49,4],[843,5],[1007,4]]},"319":{"position":[[528,5],[768,6],[1542,5],[7743,6]]},"323":{"position":[[279,4],[531,4],[604,4]]},"325":{"position":[[261,5],[338,5]]},"339":{"position":[[380,5],[1255,5]]},"350":{"position":[[223,5]]},"352":{"position":[[2166,6],[2700,6]]},"354":{"position":[[122,6],[187,5]]},"358":{"position":[[1239,4],[1260,4],[1383,5],[2151,5],[2269,5],[2780,5],[2936,4]]},"381":{"position":[[662,5]]},"416":{"position":[[217,4]]},"418":{"position":[[590,6],[739,4]]},"420":{"position":[[184,5],[858,6],[1412,5],[1529,5],[1626,5],[1708,5],[1825,4],[1934,5],[2006,4],[2142,6],[2272,6],[2425,5],[3122,5],[4050,5]]},"422":{"position":[[1242,4],[1570,4],[1717,4]]},"440":{"position":[[264,4],[515,5]]},"457":{"position":[[8329,4],[8352,5],[8437,4]]},"462":{"position":[[275,4],[811,5],[884,4],[920,4],[1156,5],[1836,4],[2918,4],[2941,5],[3590,4],[3613,5]]},"468":{"position":[[41,6],[559,5]]},"470":{"position":[[1244,5],[1261,6],[1929,5],[2991,5],[5165,4]]},"472":{"position":[[1382,4],[1638,4]]},"474":{"position":[[584,6],[3373,6],[3515,5]]},"476":{"position":[[883,6],[1598,6],[2441,5]]},"478":{"position":[[1170,5]]},"480":{"position":[[608,4]]},"493":{"position":[[134,5]]},"502":{"position":[[60,5],[93,5]]},"563":{"position":[[63,6]]},"565":{"position":[[57,5],[489,5],[842,6]]},"567":{"position":[[400,5],[638,6],[821,6]]},"569":{"position":[[66,6],[289,5],[338,6]]},"571":{"position":[[12,4],[93,6],[298,4],[405,4]]},"581":{"position":[[134,5]]},"593":{"position":[[193,6]]},"657":{"position":[[512,6]]},"665":{"position":[[2583,6],[2632,4]]},"674":{"position":[[74,4]]},"681":{"position":[[77,4]]},"689":{"position":[[75,4],[320,4],[344,4],[473,4],[497,4],[626,4],[650,4]]},"691":{"position":[[58,5]]},"693":{"position":[[106,5],[859,5]]},"695":{"position":[[86,5]]},"699":{"position":[[192,4]]},"704":{"position":[[283,6]]},"718":{"position":[[631,4]]},"729":{"position":[[602,5],[655,5],[710,5],[768,5],[855,5],[1033,5],[1156,6],[1246,5],[1912,4],[2270,4],[3008,4],[3157,4],[3178,5]]},"739":{"position":[[255,5]]},"758":{"position":[[68,5],[275,4],[414,6],[525,4],[662,5]]},"760":{"position":[[154,4],[184,4],[220,5],[254,5]]},"763":{"position":[[11,5],[175,5],[230,6],[280,5],[740,5],[2161,6],[2310,6],[3474,5],[3706,5]]},"765":{"position":[[106,5],[139,4],[191,5]]},"767":{"position":[[37,5],[163,6],[194,4],[367,5],[1246,5],[1337,5],[1382,4],[1708,5]]},"769":{"position":[[418,4],[593,4],[870,6]]},"771":{"position":[[390,5],[434,5]]},"773":{"position":[[407,5],[559,6],[575,4]]},"787":{"position":[[1928,6]]},"816":{"position":[[294,6],[403,5],[421,5]]},"831":{"position":[[376,5]]},"856":{"position":[[158,4]]},"858":{"position":[[87,5],[199,5],[351,5],[488,5]]},"860":{"position":[[907,4],[1736,6],[2041,4],[2372,6]]},"865":{"position":[[9,4],[68,5],[172,4],[230,4],[269,4],[312,4]]},"869":{"position":[[551,5]]},"926":{"position":[[86,4],[219,4],[282,4]]},"928":{"position":[[22,4],[51,4]]},"930":{"position":[[20,4],[47,4]]},"941":{"position":[[568,4]]},"947":{"position":[[114,4]]},"1010":{"position":[[416,4],[2759,4],[2793,4],[2951,5],[3488,5]]},"1012":{"position":[[417,4]]},"1014":{"position":[[153,5],[563,5],[582,5],[706,5],[1035,5],[1058,5],[1165,5],[1295,5],[1318,5],[1425,5],[1555,5],[1578,5],[1688,4],[1924,5],[1947,5],[2054,5]]},"1016":{"position":[[324,5],[347,5],[451,5],[474,5],[506,4],[606,4],[676,5],[699,5],[1441,4],[1691,4]]},"1022":{"position":[[66,4],[153,4],[186,4],[297,4],[347,4]]},"1024":{"position":[[183,6],[198,4]]},"1026":{"position":[[74,4],[116,4],[468,4]]},"1028":{"position":[[54,4],[150,4],[267,4]]},"1034":{"position":[[8079,4],[8278,4],[8377,4],[8928,4]]},"1036":{"position":[[30,4]]},"1038":{"position":[[126,4],[201,4],[399,4],[563,4],[783,4],[858,4],[1013,4],[1098,4],[1251,4],[1451,4],[2150,4]]},"1047":{"position":[[363,4],[456,4],[549,4],[639,4],[733,4],[827,4],[1090,4],[1141,4],[1243,4],[1294,4],[1396,4],[1447,4],[1847,4],[1940,4],[2033,4]]},"1165":{"position":[[298,4]]},"1170":{"position":[[892,6],[1041,5]]},"1187":{"position":[[106,4],[386,4],[399,4],[431,4],[447,4],[501,4]]},"1207":{"position":[[4217,5],[4235,6]]},"1318":{"position":[[64,4]]},"1365":{"position":[[289,4]]},"1431":{"position":[[409,5],[495,4]]},"1434":{"position":[[23,4],[294,4],[466,5]]},"1436":{"position":[[69,4]]},"1439":{"position":[[327,5],[461,5]]},"1449":{"position":[[142,6]]},"1467":{"position":[[363,4]]},"1555":{"position":[[291,5]]},"1692":{"position":[[649,4]]},"1729":{"position":[[721,4]]},"1774":{"position":[[721,4]]},"1837":{"position":[[8,5],[574,5]]},"1888":{"position":[[1034,5],[1122,5]]},"1891":{"position":[[4,4],[80,5],[119,5],[163,4],[348,4],[514,4],[548,4],[604,4],[765,4],[965,4],[1115,5],[1169,5],[1307,5],[2143,5],[4323,4],[4387,4],[4433,4],[4488,6],[4604,4],[5415,4]]},"1893":{"position":[[156,5]]},"1895":{"position":[[9,5]]},"1926":{"position":[[1089,4]]},"1932":{"position":[[1233,6],[2778,4]]},"1947":{"position":[[197,4],[273,4]]},"1971":{"position":[[102,6],[174,5],[217,5]]},"1975":{"position":[[132,5],[268,5],[342,5],[489,4],[507,4],[621,6],[731,6],[1015,5],[1074,4],[1204,5],[1820,6],[1970,5]]},"1977":{"position":[[477,6],[500,5],[864,4],[1351,5],[1476,5],[1580,6],[2007,5],[2203,5],[2332,5],[2518,6],[2596,5],[2957,5],[3059,5],[3088,5]]},"1979":{"position":[[298,4],[533,4],[1077,5],[1198,5],[1461,5]]},"1998":{"position":[[997,4]]},"2007":{"position":[[95,6],[167,5],[210,5],[438,5],[510,5]]},"2013":{"position":[[102,5]]},"2015":{"position":[[76,5],[460,5],[769,5],[880,4],[929,5],[1007,4]]},"2017":{"position":[[63,5]]}}}],["node'",{"_index":2153,"t":{"358":{"position":[[224,6]]}}}],["node.data",{"_index":3573,"t":{"746":{"position":[[1477,10],[3117,10]]}}}],["node.j",{"_index":746,"t":{"126":{"position":[[4,7]]},"129":{"position":[[29,7],[124,7],[898,7]]},"1669":{"position":[[943,7]]},"1964":{"position":[[2517,8]]}}}],["node.mast",{"_index":3572,"t":{"746":{"position":[[1459,12],[2355,12],[2463,12],[2582,12],[3133,12]]}}}],["node.nam",{"_index":3564,"t":{"746":{"position":[[1112,10],[3151,10]]}}}],["node.systems.osism.xyz",{"_index":4091,"t":{"860":{"position":[[932,23]]}}}],["node01",{"_index":3468,"t":{"729":{"position":[[646,6]]}}}],["node_cidr",{"_index":2279,"t":{"420":{"position":[[100,9],[110,9]]}}}],["node_config_directori",{"_index":3552,"t":{"746":{"position":[[584,21]]}}}],["node_custom_config",{"_index":3549,"t":{"746":{"position":[[401,18],[445,18],[500,18]]}}}],["nodeaffin",{"_index":6539,"t":{"1975":{"position":[[835,12]]}}}],["nodeep",{"_index":4177,"t":{"945":{"position":[[38,6],[93,6]]}}}],["nodenam",{"_index":4315,"t":{"1010":{"position":[[2804,10]]}}}],["nodepool",{"_index":4846,"t":{"1170":{"position":[[698,9],[729,8],[788,8],[930,8],[1006,8]]},"1174":{"position":[[1666,8]]}}}],["nodepool.pub",{"_index":4849,"t":{"1170":{"position":[[970,13]]},"1174":{"position":[[529,15]]}}}],["nodes_boot_from_imag",{"_index":3809,"t":{"793":{"position":[[172,21]]}}}],["nodes_boot_from_volum",{"_index":3810,"t":{"793":{"position":[[194,22]]}}}],["nodes_use_ephemeral_storag",{"_index":3811,"t":{"793":{"position":[[217,27]]}}}],["nodeselector",{"_index":6537,"t":{"1975":{"position":[[782,13]]}}}],["nodeset",{"_index":1861,"t":{"319":{"position":[[541,8],[759,8],[1529,8]]},"1116":{"position":[[1826,8],[1982,8]]}}}],["nodown",{"_index":4320,"t":{"1014":{"position":[[490,6]]},"1016":{"position":[[1043,6]]}}}],["non",{"_index":137,"t":{"23":{"position":[[38,3]]},"179":{"position":[[727,3]]},"181":{"position":[[155,4],[1386,3]]},"313":{"position":[[944,3]]},"358":{"position":[[862,3],[1526,3],[2711,3]]},"504":{"position":[[842,3]]},"575":{"position":[[122,3]]},"763":{"position":[[3248,4]]},"900":{"position":[[339,3]]},"1161":{"position":[[3906,4]]},"1355":{"position":[[314,3]]},"1359":{"position":[[79,3]]},"1402":{"position":[[455,3]]},"1598":{"position":[[174,3]]},"1605":{"position":[[150,3]]},"1610":{"position":[[1204,3]]},"1696":{"position":[[326,3]]},"1706":{"position":[[925,3]]},"1708":{"position":[[477,3]]},"1733":{"position":[[1115,3]]},"1743":{"position":[[326,3]]},"1751":{"position":[[515,3]]},"1776":{"position":[[960,3]]},"1784":{"position":[[339,3]]},"1792":{"position":[[515,3]]},"1805":{"position":[[264,3]]},"1810":{"position":[[3208,3]]},"1855":{"position":[[454,3]]},"1877":{"position":[[125,3]]},"1879":{"position":[[227,3]]},"1881":{"position":[[474,3]]},"1964":{"position":[[3997,4],[4124,3],[4139,3]]},"1979":{"position":[[861,3]]},"2049":{"position":[[376,3],[648,4]]},"2077":{"position":[[1879,3]]},"2116":{"position":[[130,3]]},"2139":{"position":[[1089,3]]}}}],["none",{"_index":2347,"t":{"420":{"position":[[3528,6]]},"486":{"position":[[1709,6]]},"626":{"position":[[630,4],[651,4]]},"749":{"position":[[6610,4]]},"860":{"position":[[3,4]]},"1069":{"position":[[630,4],[651,4]]},"1280":{"position":[[1177,4]]},"1640":{"position":[[284,4]]},"1786":{"position":[[254,6]]},"1810":{"position":[[3271,5],[3613,4]]},"1814":{"position":[[672,4]]},"2147":{"position":[[0,4]]},"2176":{"position":[[0,4]]},"2204":{"position":[[0,5]]},"2210":{"position":[[0,5]]}}}],["nonlead",{"_index":2188,"t":{"358":{"position":[[2663,9],[3068,10]]}}}],["nonneg",{"_index":6322,"t":{"1843":{"position":[[609,11]]}}}],["nonono",{"_index":2332,"t":{"420":{"position":[[2520,6],[2619,6]]}}}],["nonsens",{"_index":6559,"t":{"1986":{"position":[[680,11]]}}}],["noon",{"_index":1647,"t":{"265":{"position":[[559,5]]}}}],["noop",{"_index":1874,"t":{"319":{"position":[[1355,4]]}}}],["noout",{"_index":4185,"t":{"947":{"position":[[52,5],[171,5],[239,5],[424,5],[454,5],[476,5],[505,5],[524,5],[609,5],[642,5],[687,5]]},"1014":{"position":[[391,5]]},"1016":{"position":[[1067,5]]}}}],["nopasswd",{"_index":3695,"t":{"763":{"position":[[1256,9]]}}}],["noqa",{"_index":892,"t":{"152":{"position":[[306,4]]},"162":{"position":[[163,5]]}}}],["norebal",{"_index":4236,"t":{"975":{"position":[[108,11]]},"1014":{"position":[[463,11]]},"1016":{"position":[[1145,11]]}}}],["norecov",{"_index":4319,"t":{"1014":{"position":[[438,9]]},"1016":{"position":[[1118,9]]}}}],["norecoveri",{"_index":4235,"t":{"975":{"position":[[82,10]]}}}],["nori",{"_index":3749,"t":{"778":{"position":[[470,5]]},"1520":{"position":[[414,5]]},"1539":{"position":[[417,5]]}}}],["noris/wavecon",{"_index":5460,"t":{"1383":{"position":[[761,13]]}}}],["norm",{"_index":5660,"t":{"1569":{"position":[[84,5]]},"1594":{"position":[[2134,9]]},"1596":{"position":[[101,9]]},"1602":{"position":[[34,9]]}}}],["normal",{"_index":2089,"t":{"350":{"position":[[52,9]]},"453":{"position":[[488,6]]},"457":{"position":[[70,6],[120,6],[1491,8]]},"462":{"position":[[729,6]]},"620":{"position":[[154,6]]},"670":{"position":[[84,6]]},"729":{"position":[[237,7]]},"735":{"position":[[478,8]]},"1016":{"position":[[1380,6]]},"1063":{"position":[[154,6]]},"1122":{"position":[[3076,6]]},"1262":{"position":[[4370,6]]},"1383":{"position":[[536,7]]},"1805":{"position":[[157,8]]},"1891":{"position":[[457,6],[1502,8],[3562,8]]},"1897":{"position":[[180,6]]},"1932":{"position":[[1656,6],[2924,6]]},"2011":{"position":[[3,6]]}}}],["north",{"_index":5548,"t":{"1465":{"position":[[230,5]]},"1962":{"position":[[3631,5]]}}}],["noscrub",{"_index":4176,"t":{"945":{"position":[[15,7],[68,7]]}}}],["noset",{"_index":4133,"t":{"928":{"position":[[33,5]]},"930":{"position":[[31,5]]}}}],["nosuid",{"_index":4099,"t":{"860":{"position":[[2444,6]]}}}],["notabl",{"_index":6441,"t":{"1932":{"position":[[4648,7]]},"2206":{"position":[[466,7]]}}}],["notari",{"_index":6515,"t":{"1964":{"position":[[4800,6]]}}}],["notat",{"_index":2282,"t":{"420":{"position":[[161,9],[252,9],[339,9]]}}}],["note",{"_index":143,"t":{"23":{"position":[[162,4],[383,4]]},"36":{"position":[[233,7],[707,7]]},"138":{"position":[[43,5],[113,4]]},"272":{"position":[[142,5]]},"274":{"position":[[224,5]]},"276":{"position":[[120,5]]},"278":{"position":[[240,5]]},"280":{"position":[[256,5]]},"321":{"position":[[865,4]]},"329":{"position":[[1445,4],[1590,4]]},"333":{"position":[[671,4]]},"352":{"position":[[0,5],[809,4]]},"356":{"position":[[146,5]]},"358":{"position":[[527,4]]},"363":{"position":[[957,4],[1109,4]]},"367":{"position":[[174,5]]},"377":{"position":[[0,4]]},"386":{"position":[[245,5]]},"420":{"position":[[5153,4]]},"422":{"position":[[561,4],[2178,4]]},"436":{"position":[[40,4]]},"447":{"position":[[396,4]]},"451":{"position":[[894,4]]},"455":{"position":[[214,6]]},"457":{"position":[[663,4],[1394,4],[3541,4],[6567,7],[7101,4],[7334,4]]},"462":{"position":[[2251,4],[2495,5]]},"470":{"position":[[599,4],[1594,4],[2703,4],[2916,4]]},"480":{"position":[[931,4]]},"495":{"position":[[188,5]]},"683":{"position":[[141,4]]},"685":{"position":[[136,4]]},"729":{"position":[[88,5],[1458,5],[1888,5],[2065,5],[2239,5],[2402,5],[2977,5],[3126,5]]},"780":{"position":[[114,4]]},"800":{"position":[[224,4]]},"829":{"position":[[105,4]]},"847":{"position":[[87,4]]},"860":{"position":[[2531,4]]},"926":{"position":[[0,4]]},"936":{"position":[[371,4]]},"954":{"position":[[29,4]]},"960":{"position":[[825,4]]},"965":{"position":[[49,4]]},"983":{"position":[[51,4]]},"987":{"position":[[24,4]]},"989":{"position":[[0,4]]},"1001":{"position":[[151,4]]},"1003":{"position":[[48,4]]},"1014":{"position":[[101,5],[675,4],[1134,4],[1394,4],[1656,4],[2023,4]]},"1016":{"position":[[25,5]]},"1116":{"position":[[2426,5]]},"1118":{"position":[[34,6]]},"1122":{"position":[[43,4],[119,5],[348,5],[1000,4],[1038,5],[1255,5],[1574,5],[1791,5],[1895,5],[2122,5],[2226,5],[2444,5],[2548,5],[2766,5],[2870,5],[3191,5],[3403,5],[3507,5]]},"1126":{"position":[[25,5]]},"1165":{"position":[[0,4]]},"1207":{"position":[[4084,4]]},"1218":{"position":[[24,5]]},"1268":{"position":[[98,4]]},"1270":{"position":[[361,4]]},"1349":{"position":[[969,6]]},"1355":{"position":[[1005,5]]},"1365":{"position":[[837,6]]},"1368":{"position":[[578,5]]},"1372":{"position":[[79,6]]},"1397":{"position":[[335,5]]},"1402":{"position":[[237,5]]},"1405":{"position":[[96,5]]},"1413":{"position":[[261,4]]},"1419":{"position":[[142,4]]},"1431":{"position":[[597,5]]},"1439":{"position":[[210,5]]},"1453":{"position":[[142,4]]},"1477":{"position":[[79,6]]},"1482":{"position":[[77,5],[156,4]]},"1486":{"position":[[324,6]]},"1498":{"position":[[112,4],[171,5]]},"1559":{"position":[[529,4]]},"1586":{"position":[[210,4]]},"1594":{"position":[[808,5]]},"1622":{"position":[[628,4]]},"1636":{"position":[[525,4],[927,5]]},"1640":{"position":[[553,5]]},"1644":{"position":[[117,4]]},"1678":{"position":[[45,4]]},"1685":{"position":[[186,5]]},"1688":{"position":[[123,4],[519,4]]},"1692":{"position":[[142,4]]},"1700":{"position":[[0,4],[584,4],[881,6]]},"1704":{"position":[[582,4],[682,5],[937,5]]},"1706":{"position":[[967,4],[1632,4]]},"1708":{"position":[[0,4]]},"1715":{"position":[[45,4]]},"1717":{"position":[[968,4]]},"1722":{"position":[[121,4],[274,4]]},"1725":{"position":[[215,4],[624,4]]},"1729":{"position":[[214,4]]},"1731":{"position":[[580,4],[704,5],[959,5]]},"1733":{"position":[[1157,4]]},"1739":{"position":[[542,4],[1389,4],[1568,4]]},"1747":{"position":[[205,4],[534,6]]},"1751":{"position":[[0,4]]},"1760":{"position":[[45,4]]},"1762":{"position":[[867,4]]},"1767":{"position":[[121,4],[274,4]]},"1770":{"position":[[215,4],[624,4]]},"1774":{"position":[[214,4]]},"1776":{"position":[[1002,4]]},"1780":{"position":[[540,4],[1387,4],[1569,4]]},"1786":{"position":[[1098,4]]},"1788":{"position":[[306,4],[734,6]]},"1792":{"position":[[0,4]]},"1807":{"position":[[427,5]]},"1810":{"position":[[1251,4],[3965,4],[4089,4]]},"1812":{"position":[[102,6],[278,5],[366,4]]},"1814":{"position":[[1113,4]]},"1816":{"position":[[321,4],[419,4],[1871,4]]},"1826":{"position":[[714,4]]},"1828":{"position":[[616,5]]},"1853":{"position":[[55,4],[179,5]]},"1859":{"position":[[308,4]]},"1879":{"position":[[19,4]]},"1891":{"position":[[5804,4]]},"1932":{"position":[[4206,6]]},"1960":{"position":[[615,5]]},"1964":{"position":[[3078,4],[4637,6]]},"1979":{"position":[[1388,6]]},"2058":{"position":[[6711,4]]},"2077":{"position":[[511,4]]}}}],["noteabl",{"_index":6433,"t":{"1932":{"position":[[2099,9],[2575,9]]}}}],["notepad",{"_index":1456,"t":{"210":{"position":[[18,8]]}}}],["noteworthi",{"_index":5485,"t":{"1402":{"position":[[867,10]]},"1436":{"position":[[215,10]]}}}],["noth",{"_index":2605,"t":{"466":{"position":[[15,8]]},"729":{"position":[[117,7],[1178,7]]},"860":{"position":[[1538,7]]},"1161":{"position":[[262,7]]},"1312":{"position":[[0,7]]},"1492":{"position":[[0,7]]},"1700":{"position":[[281,7]]}}}],["notic",{"_index":5428,"t":{"1377":{"position":[[56,7]]},"1479":{"position":[[60,8]]},"1482":{"position":[[56,8]]},"1810":{"position":[[3315,7],[3368,6],[3825,6],[3875,6]]},"1891":{"position":[[2122,6]]},"2131":{"position":[[15,7]]},"2160":{"position":[[15,7]]}}}],["notif",{"_index":2872,"t":{"491":{"position":[[992,12]]},"1628":{"position":[[212,12]]},"2096":{"position":[[366,12],[1464,12]]}}}],["notifi",{"_index":884,"t":{"150":{"position":[[574,7]]},"746":{"position":[[764,7]]},"1137":{"position":[[575,7]]},"1298":{"position":[[14780,8]]},"1300":{"position":[[192,11],[340,8]]}}}],["nova",{"_index":2973,"t":{"565":{"position":[[416,4],[777,4]]},"567":{"position":[[97,4],[140,4],[523,4],[548,4]]},"587":{"position":[[144,4]]},"593":{"position":[[0,4]]},"599":{"position":[[58,5]]},"729":{"position":[[1012,4]]},"778":{"position":[[912,6],[946,6],[981,6]]},"791":{"position":[[118,4],[404,4],[543,4]]},"821":{"position":[[416,4]]},"900":{"position":[[286,4]]},"918":{"position":[[20,4],[37,4]]},"1047":{"position":[[654,4],[748,4],[842,4]]},"1240":{"position":[[20,4],[56,4]]},"1308":{"position":[[643,5]]},"1379":{"position":[[302,4]]},"1897":{"position":[[56,4]]},"1932":{"position":[[1134,4],[1578,4],[1775,4]]}}}],["nova_instance_id",{"_index":5297,"t":{"1298":{"position":[[11642,17]]}}}],["nova_volume_id",{"_index":5311,"t":{"1298":{"position":[[12164,15]]}}}],["novacli",{"_index":323,"t":{"36":{"position":[[1157,10]]}}}],["novemb",{"_index":5443,"t":{"1379":{"position":[[119,8]]}}}],["novnc",{"_index":5516,"t":{"1431":{"position":[[694,5]]}}}],["now",{"_index":152,"t":{"23":{"position":[[290,4]]},"78":{"position":[[222,4]]},"92":{"position":[[807,3]]},"129":{"position":[[873,3]]},"135":{"position":[[8,3]]},"282":{"position":[[234,4]]},"286":{"position":[[52,4]]},"296":{"position":[[353,4]]},"304":{"position":[[62,3]]},"319":{"position":[[2250,3]]},"329":{"position":[[1385,4]]},"457":{"position":[[1983,3],[2068,3],[2833,3],[5549,4]]},"462":{"position":[[718,3]]},"468":{"position":[[795,3]]},"480":{"position":[[354,3]]},"495":{"position":[[198,4],[674,3]]},"610":{"position":[[1364,3]]},"718":{"position":[[15,3]]},"763":{"position":[[3716,3]]},"773":{"position":[[493,3]]},"836":{"position":[[1387,3]]},"850":{"position":[[1620,3],[2012,3],[2531,3],[3357,3],[3441,3]]},"938":{"position":[[406,3]]},"960":{"position":[[485,3],[519,3]]},"1014":{"position":[[798,3],[1221,3],[1481,3],[2110,3]]},"1016":{"position":[[374,3],[536,3],[726,3],[1220,3],[1391,4],[1487,3],[1734,3]]},"1055":{"position":[[1364,3]]},"1116":{"position":[[2761,3]]},"1172":{"position":[[582,3]]},"1262":{"position":[[2304,4]]},"1314":{"position":[[537,4]]},"1326":{"position":[[385,4]]},"1337":{"position":[[6,3]]},"1340":{"position":[[66,3]]},"1365":{"position":[[705,3]]},"1368":{"position":[[1235,3],[1473,3],[1554,3]]},"1374":{"position":[[353,3]]},"1377":{"position":[[349,3]]},"1397":{"position":[[78,3]]},"1402":{"position":[[128,4],[630,3],[781,4],[805,3],[929,3]]},"1411":{"position":[[605,4]]},"1431":{"position":[[87,3]]},"1434":{"position":[[31,3],[299,3],[1068,3]]},"1436":{"position":[[3,3]]},"1439":{"position":[[420,4]]},"1441":{"position":[[56,3],[379,3]]},"1443":{"position":[[244,3]]},"1445":{"position":[[416,4]]},"1449":{"position":[[86,3],[263,3]]},"1465":{"position":[[111,3],[301,3]]},"1467":{"position":[[375,3],[476,4],[633,3],[775,3],[860,3]]},"1471":{"position":[[408,3],[453,3],[667,3]]},"1473":{"position":[[116,3]]},"1475":{"position":[[19,3],[261,4]]},"1649":{"position":[[268,4]]},"1826":{"position":[[1436,3]]}}}],["npm",{"_index":651,"t":{"100":{"position":[[670,3]]},"129":{"position":[[939,4]]},"133":{"position":[[129,3]]},"135":{"position":[[65,3]]},"2096":{"position":[[154,3]]}}}],["npm/github/zapi",{"_index":6748,"t":{"2096":{"position":[[134,17]]}}}],["nr=1048576",{"_index":3195,"t":{"657":{"position":[[567,10]]}}}],["ns",{"_index":4200,"t":{"954":{"position":[[10,2]]}}}],["nscd",{"_index":3318,"t":{"685":{"position":[[28,4]]}}}],["nsllaalighht17",{"_index":3872,"t":{"802":{"position":[[3156,14]]}}}],["ntp",{"_index":2986,"t":{"571":{"position":[[266,4]]},"724":{"position":[[1202,3],[1223,3],[1317,3]]}}}],["ntp_server",{"_index":3433,"t":{"714":{"position":[[1069,10]]},"724":{"position":[[1191,10]]}}}],["null",{"_index":1857,"t":{"319":{"position":[[354,4]]}}}],["num",{"_index":4269,"t":{"1003":{"position":[[53,3]]}}}],["num_nod",{"_index":3558,"t":{"746":{"position":[[931,9],[1005,10],[1054,9],[1729,9]]}}}],["num_osd",{"_index":4286,"t":{"1010":{"position":[[890,9],[1070,8],[1135,9],[1285,9]]}}}],["num_pg",{"_index":4268,"t":{"1003":{"position":[[38,9]]}}}],["number",{"_index":955,"t":{"162":{"position":[[223,8]]},"185":{"position":[[1571,6]]},"214":{"position":[[212,7]]},"288":{"position":[[504,7]]},"319":{"position":[[5879,6]]},"352":{"position":[[2643,6]]},"377":{"position":[[243,7]]},"420":{"position":[[1684,6],[1917,6]]},"422":{"position":[[378,6]]},"453":{"position":[[111,6]]},"457":{"position":[[2015,6]]},"470":{"position":[[2981,6]]},"567":{"position":[[382,6]]},"587":{"position":[[514,6]]},"591":{"position":[[189,6]]},"593":{"position":[[165,6]]},"667":{"position":[[43,6]]},"860":{"position":[[346,6]]},"1003":{"position":[[111,6]]},"1010":{"position":[[914,6]]},"1016":{"position":[[583,6]]},"1316":{"position":[[12,9],[58,6]]},"1357":{"position":[[12,9]]},"1368":{"position":[[981,6]]},"1383":{"position":[[967,6]]},"1385":{"position":[[24,6]]},"1419":{"position":[[12,9]]},"1429":{"position":[[179,6]]},"1431":{"position":[[208,6]]},"1434":{"position":[[797,6]]},"1449":{"position":[[275,6]]},"1453":{"position":[[12,9]]},"1471":{"position":[[2,6]]},"1559":{"position":[[186,6]]},"1588":{"position":[[95,7],[205,7],[352,7],[379,6],[400,6],[415,9],[743,7],[1037,7],[1167,6],[1200,6],[1388,6],[1449,7]]},"1594":{"position":[[303,6],[681,6],[717,7],[800,7],[1379,6],[1457,6]]},"1598":{"position":[[303,6]]},"1610":{"position":[[145,6],[539,7],[639,7],[1063,6]]},"1617":{"position":[[43,6]]},"1626":{"position":[[127,6]]},"1680":{"position":[[632,6]]},"1683":{"position":[[124,6],[138,6]]},"1685":{"position":[[226,7]]},"1717":{"position":[[632,6]]},"1720":{"position":[[183,6],[197,6]]},"1722":{"position":[[160,7]]},"1725":{"position":[[12,6]]},"1762":{"position":[[531,6]]},"1765":{"position":[[183,6],[197,6]]},"1767":{"position":[[160,7]]},"1770":{"position":[[12,6]]},"1788":{"position":[[147,6]]},"1810":{"position":[[228,7]]},"1826":{"position":[[569,6],[1177,7]]},"1837":{"position":[[438,6]]},"1851":{"position":[[31,7]]},"1886":{"position":[[59,6]]},"1932":{"position":[[3120,6],[3271,6]]},"1934":{"position":[[154,6]]},"1936":{"position":[[329,6]]},"1962":{"position":[[2505,6]]},"1964":{"position":[[2239,6]]},"2013":{"position":[[738,6]]},"2133":{"position":[[686,6]]}}}],["number_of_nod",{"_index":3799,"t":{"791":{"position":[[409,15]]}}}],["number_of_volum",{"_index":3800,"t":{"791":{"position":[[427,17]]}}}],["numer",{"_index":2457,"t":{"451":{"position":[[696,8]]},"1434":{"position":[[59,8]]},"1486":{"position":[[0,8]]},"1657":{"position":[[69,8]]},"1810":{"position":[[2367,9]]},"1960":{"position":[[10,8]]}}}],["nut",{"_index":1500,"t":{"221":{"position":[[91,4]]}}}],["nvidia",{"_index":5936,"t":{"1700":{"position":[[682,6],[724,6]]},"1702":{"position":[[367,6]]},"1747":{"position":[[305,6],[330,7]]},"1753":{"position":[[366,6]]},"1788":{"position":[[431,6],[530,7],[1066,6]]},"1794":{"position":[[366,6]]}}}],["nvm",{"_index":748,"t":{"129":{"position":[[41,3],[334,3],[365,3],[410,3],[432,4],[437,3],[551,3],[572,3],[618,3],[705,3],[849,3],[865,3]]}}}],["nvme",{"_index":4194,"t":{"950":{"position":[[30,4]]},"952":{"position":[[25,4]]},"954":{"position":[[2,4]]},"956":{"position":[[51,4]]},"958":{"position":[[51,4],[108,4]]},"1005":{"position":[[213,4]]},"1007":{"position":[[110,4]]},"1692":{"position":[[127,4]]},"1702":{"position":[[172,4],[467,4]]},"1729":{"position":[[199,4]]},"1753":{"position":[[172,4],[466,4]]},"1774":{"position":[[199,4],[776,4]]},"1776":{"position":[[371,4]]},"1794":{"position":[[172,4],[466,4]]},"1843":{"position":[[871,4]]},"1891":{"position":[[5110,4],[5697,4]]},"1893":{"position":[[735,5],[873,5]]}}}],["nvme0n1",{"_index":4283,"t":{"1010":{"position":[[751,8],[1837,7],[2134,7]]}}}],["nvme1n1",{"_index":4292,"t":{"1010":{"position":[[1097,8],[1969,7],[2162,7]]}}}],["nvme2n1",{"_index":4296,"t":{"1010":{"position":[[1237,8],[2259,7],[2330,7]]}}}],["nwipe",{"_index":4220,"t":{"960":{"position":[[1228,6]]}}}],["nydu",{"_index":6512,"t":{"1964":{"position":[[4392,6]]}}}],["o",{"_index":192,"t":{"25":{"position":[[833,1]]},"27":{"position":[[310,1],[1850,1]]},"354":{"position":[[194,1]]},"462":{"position":[[1163,1]]},"486":{"position":[[1617,1],[1993,1]]},"491":{"position":[[666,1],[1409,1],[1899,1],[2100,1]]},"744":{"position":[[305,2]]},"767":{"position":[[1952,1],[3078,1]]},"1026":{"position":[[267,1],[382,1]]},"1690":{"position":[[328,1]]},"1706":{"position":[[964,2]]},"1727":{"position":[[355,1]]},"1733":{"position":[[1154,2]]},"1739":{"position":[[761,1]]},"1772":{"position":[[355,1]]},"1776":{"position":[[999,2]]},"1780":{"position":[[759,1]]}}}],["o'clock",{"_index":1851,"t":{"317":{"position":[[1590,7]]}}}],["o'reilli",{"_index":2917,"t":{"504":{"position":[[498,8]]}}}],["oaep",{"_index":1905,"t":{"319":{"position":[[4417,4],[5927,5],[6587,4],[6642,4],[6697,4]]}}}],["oauth",{"_index":1585,"t":{"247":{"position":[[481,5]]},"1567":{"position":[[599,5]]},"2024":{"position":[[255,5]]},"2028":{"position":[[1301,5]]},"2032":{"position":[[597,5]]},"2094":{"position":[[179,7]]}}}],["oauth2",{"_index":6633,"t":{"2028":{"position":[[3545,7]]},"2032":{"position":[[144,6]]}}}],["obfusc",{"_index":6555,"t":{"1979":{"position":[[1291,10]]}}}],["object",{"_index":377,"t":{"38":{"position":[[266,7],[298,6]]},"44":{"position":[[118,6]]},"51":{"position":[[101,6]]},"352":{"position":[[643,6]]},"472":{"position":[[1108,6]]},"484":{"position":[[488,6],[835,6]]},"491":{"position":[[1381,7]]},"495":{"position":[[1078,6]]},"571":{"position":[[336,6]]},"587":{"position":[[227,6]]},"591":{"position":[[113,6],[131,6],[256,6]]},"597":{"position":[[286,6]]},"599":{"position":[[23,6],[170,7],[248,7],[318,7]]},"601":{"position":[[11,7]]},"624":{"position":[[40,6]]},"985":{"position":[[34,8],[320,7],[411,7],[438,7],[795,8]]},"1067":{"position":[[40,6]]},"1296":{"position":[[371,7]]},"1387":{"position":[[230,7]]},"1624":{"position":[[103,11]]},"1864":{"position":[[137,11]]},"1868":{"position":[[68,8],[82,6]]},"1886":{"position":[[316,6]]},"1932":{"position":[[3514,7],[3528,7],[4232,7]]},"2004":{"position":[[1851,10]]},"2103":{"position":[[123,8]]},"2106":{"position":[[100,6],[276,6],[788,7]]},"2108":{"position":[[4,7]]},"2110":{"position":[[15,7],[114,8],[658,7]]},"2112":{"position":[[67,8]]},"2122":{"position":[[494,8]]},"2126":{"position":[[54,8],[202,6],[272,7]]},"2137":{"position":[[516,6]]},"2166":{"position":[[194,6]]}}}],["objectstore.http.request",{"_index":5227,"t":{"1298":{"position":[[6725,24]]}}}],["objectstore_request",{"_index":5228,"t":{"1298":{"position":[[6758,20]]}}}],["oblig",{"_index":1125,"t":{"175":{"position":[[820,10]]},"177":{"position":[[176,11]]}}}],["observ",{"_index":1132,"t":{"175":{"position":[[1132,8]]},"227":{"position":[[248,8]]},"315":{"position":[[25,7],[297,7]]},"468":{"position":[[56,8]]},"1810":{"position":[[2046,8]]},"1888":{"position":[[1316,8]]},"1964":{"position":[[1562,13]]},"2022":{"position":[[258,11]]},"2028":{"position":[[944,8]]}}}],["observer_id",{"_index":5225,"t":{"1298":{"position":[[6670,12],[7528,12],[10010,12],[14324,12]]}}}],["observer_typeuri",{"_index":5223,"t":{"1298":{"position":[[6619,17],[14365,17]]}}}],["obsolet",{"_index":5627,"t":{"1547":{"position":[[345,9]]},"1549":{"position":[[179,9]]},"1551":{"position":[[337,9]]},"1555":{"position":[[606,9]]},"1557":{"position":[[547,9]]},"1559":{"position":[[388,9]]},"1561":{"position":[[561,9]]},"1563":{"position":[[540,9]]},"1567":{"position":[[700,9]]},"1571":{"position":[[555,9]]},"1575":{"position":[[400,9]]},"1577":{"position":[[521,9]]},"1600":{"position":[[25,9],[57,11]]},"1636":{"position":[[684,9]]},"1642":{"position":[[1261,8]]}}}],["obsoleted_at",{"_index":5697,"t":{"1588":{"position":[[1752,12]]},"1636":{"position":[[302,12],[505,12],[714,14]]},"1642":{"position":[[1171,13],[1324,13]]}}}],["obtain",{"_index":1611,"t":{"251":{"position":[[56,8],[307,8]]},"486":{"position":[[1929,8]]},"834":{"position":[[1621,6]]},"836":{"position":[[1566,6]]},"1262":{"position":[[2944,8]]},"1537":{"position":[[41,6]]}}}],["obviou",{"_index":5765,"t":{"1647":{"position":[[290,8]]},"1680":{"position":[[623,8]]},"1717":{"position":[[623,8]]},"1762":{"position":[[522,8]]},"2013":{"position":[[298,7]]},"2051":{"position":[[108,7]]}}}],["obvious",{"_index":1728,"t":{"288":{"position":[[211,9]]},"319":{"position":[[1229,9]]},"453":{"position":[[540,9]]},"1891":{"position":[[1793,9]]},"1893":{"position":[[329,9]]}}}],["occasion",{"_index":477,"t":{"70":{"position":[[385,13]]},"288":{"position":[[730,13]]},"468":{"position":[[65,10]]},"583":{"position":[[610,13]]},"1891":{"position":[[1898,10],[2270,10]]}}}],["occm",{"_index":2011,"t":{"329":{"position":[[911,4]]},"331":{"position":[[76,4]]},"420":{"position":[[2748,4]]},"457":{"position":[[8578,7]]},"464":{"position":[[0,5]]},"476":{"position":[[914,4],[2475,4]]},"478":{"position":[[224,4]]},"1467":{"position":[[260,4]]}}}],["occur",{"_index":3012,"t":{"583":{"position":[[603,6]]},"767":{"position":[[1549,7],[1652,7]]},"814":{"position":[[20,6]]},"1262":{"position":[[2193,8]]}}}],["oci",{"_index":6503,"t":{"1964":{"position":[[2491,3],[4271,3],[4294,3]]}}}],["oct",{"_index":4534,"t":{"1038":{"position":[[102,3],[375,3],[539,3],[759,3],[989,3],[1227,3]]}}}],["octavia",{"_index":1982,"t":{"325":{"position":[[901,7]]},"424":{"position":[[785,7]]},"821":{"position":[[440,7]]},"920":{"position":[[20,7],[40,7]]},"1242":{"position":[[20,7],[51,7]]},"1308":{"position":[[674,8]]},"1314":{"position":[[1129,9]]}}}],["octavia.amphorae.drivers.health.heartbeat_udp",{"_index":4636,"t":{"1093":{"position":[[85,45]]}}}],["octavia_network_interfac",{"_index":3483,"t":{"729":{"position":[[2841,26]]},"744":{"position":[[276,25]]}}}],["octavia_network_typ",{"_index":3542,"t":{"744":{"position":[[316,20]]}}}],["octaviacli",{"_index":324,"t":{"36":{"position":[[1177,13]]},"424":{"position":[[802,14]]},"436":{"position":[[85,13]]}}}],["octo",{"_index":1054,"t":{"171":{"position":[[94,4]]}}}],["octob",{"_index":5497,"t":{"1413":{"position":[[340,8]]},"1453":{"position":[[258,8]]},"1479":{"position":[[179,7]]}}}],["off",{"_index":6785,"t":{"2135":{"position":[[444,5]]}}}],["offer",{"_index":1410,"t":{"204":{"position":[[104,6]]},"249":{"position":[[9,6]]},"292":{"position":[[59,6],[694,5]]},"296":{"position":[[390,5]]},"300":{"position":[[442,8]]},"304":{"position":[[66,8]]},"482":{"position":[[36,6]]},"519":{"position":[[143,9]]},"521":{"position":[[123,5]]},"541":{"position":[[79,7]]},"543":{"position":[[55,5]]},"545":{"position":[[79,8]]},"573":{"position":[[295,5]]},"591":{"position":[[213,6]]},"595":{"position":[[686,6]]},"954":{"position":[[157,6]]},"1262":{"position":[[4041,5]]},"1280":{"position":[[307,8]]},"1411":{"position":[[460,7]]},"1417":{"position":[[632,10]]},"1445":{"position":[[482,7]]},"1451":{"position":[[632,10]]},"1537":{"position":[[29,8]]},"1551":{"position":[[98,10]]},"1571":{"position":[[190,5]]},"1622":{"position":[[143,9],[247,5]]},"1647":{"position":[[140,6]]},"1657":{"position":[[409,8]]},"1659":{"position":[[283,5]]},"1669":{"position":[[313,6]]},"1680":{"position":[[200,5]]},"1694":{"position":[[58,5]]},"1704":{"position":[[712,7],[918,5]]},"1706":{"position":[[67,5],[581,5],[672,5],[718,5],[1241,5],[1323,5],[1390,5]]},"1708":{"position":[[237,9],[586,8],[611,8],[719,5],[815,5]]},"1712":{"position":[[21,5]]},"1717":{"position":[[200,5]]},"1731":{"position":[[734,7],[940,5]]},"1733":{"position":[[67,5],[743,5],[834,5],[908,5],[1469,5],[1561,5],[1654,5]]},"1739":{"position":[[52,5],[391,5],[1203,5]]},"1741":{"position":[[58,5]]},"1751":{"position":[[237,9],[625,8],[650,8],[758,5],[854,5]]},"1757":{"position":[[373,5]]},"1762":{"position":[[200,5]]},"1776":{"position":[[298,5],[588,5],[679,5],[753,5],[1314,5],[1406,5],[1499,5]]},"1780":{"position":[[52,5],[389,5],[1201,5]]},"1782":{"position":[[70,5]]},"1792":{"position":[[237,9],[625,8],[650,8],[758,5],[854,5]]},"1798":{"position":[[373,5]]},"1801":{"position":[[12,5]]},"1812":{"position":[[889,5]]},"1837":{"position":[[33,5]]},"1841":{"position":[[200,5]]},"1853":{"position":[[209,7],[346,5]]},"1862":{"position":[[143,9]]},"1886":{"position":[[129,9],[145,8],[225,9]]},"1891":{"position":[[5294,6],[5777,7]]},"1893":{"position":[[353,5]]},"1956":{"position":[[514,5]]},"1958":{"position":[[68,5],[189,5],[250,5]]},"1962":{"position":[[5318,6],[5476,7]]},"1966":{"position":[[1444,7],[1931,5],[2104,6],[5333,8]]},"1990":{"position":[[441,5]]},"2004":{"position":[[342,6],[1256,8]]},"2028":{"position":[[501,6],[801,6],[1027,6],[2670,8],[3451,6],[3728,6],[4269,6],[5015,8]]},"2068":{"position":[[841,8]]}}}],["offic",{"_index":1273,"t":{"183":{"position":[[591,7]]}}}],["offici",{"_index":562,"t":{"83":{"position":[[294,8]]},"315":{"position":[[811,8]]},"317":{"position":[[1717,8]]},"319":{"position":[[2200,8],[6297,8]]},"333":{"position":[[801,8]]},"352":{"position":[[2301,8]]},"354":{"position":[[302,8]]},"356":{"position":[[263,8]]},"358":{"position":[[673,8]]},"595":{"position":[[207,8]]},"936":{"position":[[4,8]]},"1010":{"position":[[134,8]]},"1096":{"position":[[502,8],[621,8]]},"1421":{"position":[[41,10]]},"1467":{"position":[[102,10],[166,10]]},"1530":{"position":[[0,8]]},"1541":{"position":[[195,10]]},"1594":{"position":[[1021,8]]},"1706":{"position":[[1615,8]]},"1733":{"position":[[1879,8]]},"1776":{"position":[[1726,8]]},"1910":{"position":[[69,8]]},"1915":{"position":[[249,10]]},"1917":{"position":[[498,8]]},"1919":{"position":[[744,8],[861,8]]},"1921":{"position":[[59,8]]},"1964":{"position":[[2863,10]]}}}],["offlin",{"_index":6562,"t":{"1988":{"position":[[622,7]]},"1990":{"position":[[520,7],[574,7]]},"2004":{"position":[[349,7]]}}}],["ogth7hi2zywrs5tnaik/qlvsb7am+lqrp7lmlm4jmd6woyr7dishu7omd1gqem2zumgga",{"_index":1907,"t":{"319":{"position":[[4494,69]]}}}],["oh",{"_index":4795,"t":{"1161":{"position":[[3476,2]]}}}],["oidc",{"_index":1570,"t":{"239":{"position":[[597,5]]},"247":{"position":[[707,4]]},"249":{"position":[[25,4]]},"251":{"position":[[1213,4]]},"255":{"position":[[73,4]]},"257":{"position":[[77,4]]},"802":{"position":[[35,6],[110,4],[170,5],[195,5],[646,4],[1640,5]]},"1262":{"position":[[229,5],[321,4],[383,4],[495,5],[514,4],[713,4],[1121,4],[2365,5],[2776,4],[2830,4],[3552,4],[3639,4],[4227,4]]},"1280":{"position":[[710,4]]},"1314":{"position":[[241,5]]},"1340":{"position":[[45,4]]},"1344":{"position":[[68,4]]},"1359":{"position":[[0,4],[35,4]]},"1471":{"position":[[60,4]]},"1964":{"position":[[3379,5]]},"2024":{"position":[[283,6],[404,5]]},"2028":{"position":[[1018,5],[3539,5],[3961,6]]},"2077":{"position":[[2569,4],[3487,4],[3522,4]]},"2094":{"position":[[187,6]]},"2096":{"position":[[661,5],[1412,4]]}}}],["oif",{"_index":5469,"t":{"1391":{"position":[[464,4]]},"1417":{"position":[[158,3]]},"1425":{"position":[[508,4]]},"1451":{"position":[[158,3]]},"1496":{"position":[[356,3]]}}}],["oin",{"_index":1286,"t":{"183":{"position":[[1207,5],[1736,3]]}}}],["ojsonpath",{"_index":2106,"t":{"352":{"position":[[879,12],[958,12]]}}}],["ok",{"_index":4505,"t":{"1034":{"position":[[7891,2],[8988,2]]},"1895":{"position":[[1079,2]]}}}],["okay",{"_index":6442,"t":{"1934":{"position":[[199,4]]}}}],["old",{"_index":287,"t":{"36":{"position":[[297,3]]},"455":{"position":[[205,3]]},"457":{"position":[[1930,3],[2248,3],[3406,3],[3446,3]]},"462":{"position":[[20,3]]},"478":{"position":[[843,3],[934,3],[1192,3]]},"495":{"position":[[348,5]]},"663":{"position":[[128,3]]},"1181":{"position":[[142,3],[216,3]]},"1374":{"position":[[377,3]]},"1381":{"position":[[14,3]]},"1469":{"position":[[4,3]]},"1482":{"position":[[92,3]]},"1528":{"position":[[0,3]]},"1594":{"position":[[1547,3]]},"1598":{"position":[[335,3]]},"1615":{"position":[[4,3]]},"1698":{"position":[[554,3],[749,3]]},"1745":{"position":[[661,3],[856,3]]},"1755":{"position":[[827,3],[1181,3],[1516,3]]},"1786":{"position":[[882,3],[1077,3]]},"1796":{"position":[[829,3],[1183,3],[1518,3]]},"1810":{"position":[[372,3],[3979,3],[4590,3]]},"2114":{"position":[[213,3]]},"2124":{"position":[[164,3]]},"2137":{"position":[[783,3]]}}}],["old_instance_s",{"_index":5317,"t":{"1298":{"position":[[12609,18]]}}}],["old_stat",{"_index":5083,"t":{"1298":{"position":[[1254,10]]}}}],["old_volume_s",{"_index":5313,"t":{"1298":{"position":[[12400,16]]}}}],["older",{"_index":1790,"t":{"304":{"position":[[308,5]]},"457":{"position":[[1617,5],[9531,5]]},"632":{"position":[[445,5]]},"634":{"position":[[1334,5]]},"646":{"position":[[21,5],[152,5]]},"677":{"position":[[318,5]]},"834":{"position":[[237,5]]},"1003":{"position":[[219,5]]},"1010":{"position":[[674,5]]},"1075":{"position":[[445,5]]},"1077":{"position":[[1334,5]]},"1088":{"position":[[21,5],[152,5]]},"1467":{"position":[[202,5]]},"1615":{"position":[[99,5]]},"1636":{"position":[[579,5]]}}}],["oldest",{"_index":6413,"t":{"1915":{"position":[[274,6]]}}}],["olso",{"_index":6661,"t":{"2051":{"position":[[1106,4]]}}}],["omap",{"_index":4241,"t":{"985":{"position":[[29,4],[315,4],[406,4]]}}}],["omit",{"_index":2450,"t":{"449":{"position":[[868,4]]},"478":{"position":[[1025,8]]},"1692":{"position":[[171,7]]},"1706":{"position":[[977,8]]},"1729":{"position":[[243,7]]},"1733":{"position":[[1167,8]]},"1774":{"position":[[243,7]]},"1776":{"position":[[1012,8]]},"2043":{"position":[[665,8]]}}}],["on",{"_index":479,"t":{"70":{"position":[[424,3]]},"100":{"position":[[348,3]]},"108":{"position":[[115,3],[160,3],[211,3]]},"164":{"position":[[237,3]]},"181":{"position":[[65,3]]},"185":{"position":[[104,4]]},"195":{"position":[[212,5],[839,5]]},"233":{"position":[[515,3]]},"260":{"position":[[66,3],[299,3]]},"286":{"position":[[521,3]]},"292":{"position":[[415,4]]},"313":{"position":[[126,3],[248,3],[612,3]]},"317":{"position":[[39,3],[665,3]]},"319":{"position":[[209,4],[5472,3],[5962,3]]},"321":{"position":[[89,3],[617,3]]},"329":{"position":[[1533,3]]},"339":{"position":[[478,3],[1353,3]]},"341":{"position":[[557,3]]},"418":{"position":[[371,3],[429,3]]},"420":{"position":[[5009,3]]},"422":{"position":[[628,3],[640,3]]},"444":{"position":[[35,3]]},"455":{"position":[[209,4]]},"457":{"position":[[708,3],[2988,3],[2995,3],[3450,3],[3964,3]]},"470":{"position":[[4355,3]]},"472":{"position":[[3639,3]]},"478":{"position":[[938,3]]},"491":{"position":[[1173,3]]},"493":{"position":[[643,3],[896,3]]},"502":{"position":[[69,3]]},"529":{"position":[[111,3]]},"545":{"position":[[100,3]]},"547":{"position":[[51,3]]},"561":{"position":[[45,3],[148,3],[188,3]]},"565":{"position":[[520,3],[552,3]]},"567":{"position":[[263,3]]},"585":{"position":[[255,3]]},"603":{"position":[[57,3]]},"612":{"position":[[55,3],[71,3]]},"634":{"position":[[170,3]]},"661":{"position":[[421,3],[454,3]]},"724":{"position":[[1053,3],[1219,3]]},"778":{"position":[[42,3]]},"787":{"position":[[2443,3]]},"831":{"position":[[132,3]]},"834":{"position":[[289,3]]},"843":{"position":[[83,3]]},"850":{"position":[[515,3]]},"1003":{"position":[[234,3],[299,3]]},"1010":{"position":[[1855,3],[1987,3],[2277,3]]},"1057":{"position":[[55,3],[71,3]]},"1077":{"position":[[170,3]]},"1099":{"position":[[253,3]]},"1114":{"position":[[611,3],[637,3]]},"1172":{"position":[[258,3]]},"1181":{"position":[[248,4]]},"1207":{"position":[[3854,3],[4137,3]]},"1260":{"position":[[384,3]]},"1262":{"position":[[46,3],[159,3],[3541,3]]},"1280":{"position":[[260,3]]},"1292":{"position":[[100,3]]},"1314":{"position":[[812,3]]},"1363":{"position":[[558,3]]},"1387":{"position":[[190,3]]},"1415":{"position":[[73,3]]},"1522":{"position":[[96,3]]},"1535":{"position":[[666,3]]},"1584":{"position":[[0,3]]},"1588":{"position":[[435,3],[871,3],[1581,3],[1645,3],[1716,3]]},"1594":{"position":[[224,3],[1323,3]]},"1600":{"position":[[348,3]]},"1602":{"position":[[107,3]]},"1605":{"position":[[65,3]]},"1610":{"position":[[108,3]]},"1622":{"position":[[1202,5],[1598,3]]},"1636":{"position":[[755,3],[876,3],[956,3]]},"1640":{"position":[[420,3]]},"1644":{"position":[[127,3],[218,3]]},"1649":{"position":[[34,3]]},"1667":{"position":[[1333,3],[1378,3],[1429,3]]},"1704":{"position":[[1293,3]]},"1708":{"position":[[939,3]]},"1731":{"position":[[1316,3]]},"1739":{"position":[[1626,3]]},"1751":{"position":[[978,3]]},"1780":{"position":[[1627,3],[1775,4]]},"1792":{"position":[[978,3]]},"1826":{"position":[[1007,3]]},"1828":{"position":[[490,4]]},"1843":{"position":[[169,3],[378,3]]},"1851":{"position":[[285,3]]},"1853":{"position":[[850,3]]},"1868":{"position":[[93,3]]},"1870":{"position":[[546,3]]},"1872":{"position":[[511,3],[723,3]]},"1879":{"position":[[211,3]]},"1888":{"position":[[1359,3]]},"1891":{"position":[[0,3],[62,3],[110,3],[1039,3],[2724,4],[4383,3]]},"1895":{"position":[[727,4]]},"1926":{"position":[[1528,3]]},"1932":{"position":[[1362,3],[1903,3],[4031,3],[4055,3]]},"1941":{"position":[[311,3]]},"1962":{"position":[[518,3]]},"1966":{"position":[[2148,3],[3510,3],[4277,3]]},"1971":{"position":[[163,3]]},"1977":{"position":[[860,3],[1460,3],[2480,3]]},"1979":{"position":[[814,4]]},"1998":{"position":[[445,3]]},"2007":{"position":[[156,3]]},"2013":{"position":[[1058,3]]},"2015":{"position":[[613,3]]},"2024":{"position":[[166,3]]},"2026":{"position":[[781,3],[985,3]]},"2028":{"position":[[4850,3]]},"2030":{"position":[[117,3]]},"2032":{"position":[[272,3]]},"2047":{"position":[[267,3]]},"2068":{"position":[[336,3]]},"2090":{"position":[[499,4]]},"2106":{"position":[[217,3]]},"2114":{"position":[[188,3],[217,3]]},"2135":{"position":[[391,3]]}}}],["on_behalf_of",{"_index":5341,"t":{"1298":{"position":[[14549,13]]}}}],["onboar",{"_index":6691,"t":{"2077":{"position":[[232,9]]}}}],["onboard",{"_index":500,"t":{"72":{"position":[[257,10]]},"290":{"position":[[46,9]]},"1567":{"position":[[255,10]]},"2022":{"position":[[462,10]]},"2028":{"position":[[2256,7]]},"2077":{"position":[[302,9]]}}}],["onc",{"_index":607,"t":{"92":{"position":[[602,4]]},"129":{"position":[[648,4]]},"135":{"position":[[75,4]]},"227":{"position":[[73,4]]},"348":{"position":[[106,4]]},"363":{"position":[[242,4]]},"422":{"position":[[891,4]]},"457":{"position":[[1241,4]]},"470":{"position":[[1877,4],[5029,4]]},"641":{"position":[[220,4]]},"785":{"position":[[200,4]]},"865":{"position":[[22,4]]},"1014":{"position":[[1840,5]]},"1084":{"position":[[220,4]]},"1130":{"position":[[166,4]]},"1262":{"position":[[1691,4]]},"1498":{"position":[[134,4]]},"1594":{"position":[[1769,4]]},"1598":{"position":[[0,4]]},"1636":{"position":[[404,4]]},"1810":{"position":[[848,4],[909,4],[971,4],[1030,4],[1087,4],[4506,4]]},"1879":{"position":[[415,4]]},"1888":{"position":[[519,4]]},"1964":{"position":[[2319,4]]},"2043":{"position":[[187,4]]},"2094":{"position":[[800,5]]}}}],["ones—to",{"_index":5591,"t":{"1516":{"position":[[229,7]]}}}],["onlin",{"_index":4186,"t":{"947":{"position":[[127,6]]},"1016":{"position":[[822,6]]}}}],["onto",{"_index":4072,"t":{"856":{"position":[[149,4]]}}}],["op",{"_index":420,"t":{"64":{"position":[[135,3]]},"1262":{"position":[[388,3],[1126,2],[3060,2],[3557,2],[3644,2],[4232,2]]},"1334":{"position":[[439,3]]},"1588":{"position":[[1424,3],[1748,3]]},"1592":{"position":[[383,4]]},"2216":{"position":[[297,3]]}}}],["open",{"_index":21,"t":{"7":{"position":[[28,4],[133,5]]},"9":{"position":[[19,4]]},"68":{"position":[[255,7]]},"72":{"position":[[212,5]]},"81":{"position":[[19,4]]},"135":{"position":[[166,4]]},"162":{"position":[[304,4]]},"164":{"position":[[716,4]]},"166":{"position":[[367,4],[529,4],[687,4],[1205,4],[1323,4]]},"173":{"position":[[432,4]]},"175":{"position":[[1298,4]]},"177":{"position":[[338,4],[1287,4],[1662,4],[1795,4],[1928,4],[2185,4]]},"183":{"position":[[364,4],[693,4],[1184,4],[1350,4],[1463,4],[1582,4]]},"185":{"position":[[9,4],[365,4],[516,4],[2359,5]]},"187":{"position":[[25,4]]},"189":{"position":[[215,4]]},"260":{"position":[[136,4]]},"267":{"position":[[74,5],[114,4]]},"280":{"position":[[16,4]]},"319":{"position":[[7260,5]]},"337":{"position":[[154,6],[950,6]]},"375":{"position":[[48,4],[121,5],[167,4]]},"472":{"position":[[3622,4]]},"523":{"position":[[57,4]]},"589":{"position":[[4,4]]},"591":{"position":[[11,4]]},"595":{"position":[[769,4]]},"778":{"position":[[401,4]]},"802":{"position":[[201,4]]},"900":{"position":[[315,4],[401,4]]},"1096":{"position":[[79,4]]},"1223":{"position":[[42,4]]},"1262":{"position":[[556,4],[806,4],[971,4],[2688,4],[3251,4]]},"1355":{"position":[[74,4]]},"1363":{"position":[[293,5],[335,6]]},"1391":{"position":[[329,4]]},"1400":{"position":[[180,4]]},"1413":{"position":[[134,4]]},"1417":{"position":[[416,5]]},"1425":{"position":[[373,4]]},"1451":{"position":[[416,5]]},"1484":{"position":[[145,4]]},"1496":{"position":[[320,4]]},"1516":{"position":[[270,9]]},"1520":{"position":[[249,4],[318,4]]},"1528":{"position":[[180,4]]},"1535":{"position":[[221,4]]},"1539":{"position":[[252,4],[321,4]]},"1543":{"position":[[328,4]]},"1580":{"position":[[267,8]]},"1590":{"position":[[475,4],[534,4]]},"1622":{"position":[[413,4],[1237,4]]},"1632":{"position":[[70,4],[223,4],[376,4]]},"1642":{"position":[[10,4],[107,4]]},"1960":{"position":[[197,4],[476,4]]},"1962":{"position":[[41,4],[257,5],[278,4],[304,4],[345,5],[369,5],[981,4],[1226,6],[1248,4],[1307,5],[1498,4],[1591,4],[2712,6],[2734,4],[2793,4],[2937,4],[3030,4],[3932,6],[3954,4],[4013,4],[4076,4],[4167,4],[4283,4],[5245,5],[5294,4],[5408,4]]},"1964":{"position":[[56,4]]},"1966":{"position":[[16,4],[176,4],[232,4],[388,4],[469,4],[939,4],[1595,4],[2535,4],[3434,4],[4008,4],[4054,4],[4504,4]]},"2028":{"position":[[94,4],[3232,4]]},"2137":{"position":[[832,4]]},"2212":{"position":[[64,4]]}}}],["openapi",{"_index":5016,"t":{"1272":{"position":[[751,7],[779,7]]},"1368":{"position":[[762,7]]},"2099":{"position":[[19,7]]},"2150":{"position":[[71,7]]},"2155":{"position":[[138,7]]}}}],["opendev",{"_index":4882,"t":{"1174":{"position":[[795,7]]}}}],["opendevorg",{"_index":4881,"t":{"1174":{"position":[[777,11],[897,11]]}}}],["openid",{"_index":1565,"t":{"239":{"position":[[271,6]]},"241":{"position":[[102,6]]},"245":{"position":[[132,6]]},"247":{"position":[[136,6],[343,6]]},"253":{"position":[[41,6],[136,6]]},"802":{"position":[[20,6],[1570,6],[2100,6],[2295,6],[2840,6],[2996,6],[3009,7]]},"1262":{"position":[[668,6],[1071,6],[1315,6]]},"1434":{"position":[[994,6]]},"2024":{"position":[[268,6]]},"2028":{"position":[[3592,6]]}}}],["openinfra",{"_index":5590,"t":{"1516":{"position":[[141,9]]}}}],["openldap",{"_index":6626,"t":{"2028":{"position":[[1449,9]]}}}],["openrc",{"_index":336,"t":{"36":{"position":[[1403,6]]}}}],["openrc.sh",{"_index":345,"t":{"36":{"position":[[1540,9]]}}}],["opensearch",{"_index":3513,"t":{"737":{"position":[[27,10],[80,10],[138,10],[214,10]]},"746":{"position":[[32,10],[77,10],[150,10],[238,10],[295,10],[519,16],[782,10],[872,10],[1978,11],[2427,10],[2648,10],[3369,10],[3445,10],[4325,13],[4691,10],[4962,13]]},"821":{"position":[[242,10]]},"831":{"position":[[171,11],[492,10]]},"841":{"position":[[691,10],[745,10]]},"891":{"position":[[0,10],[48,10],[85,10],[108,10]]},"1038":{"position":[[0,10],[48,10]]},"1212":{"position":[[0,10],[48,10],[85,10],[119,10]]}}}],["opensearch.yml",{"_index":3550,"t":{"746":{"position":[[420,18],[555,18],[2252,17],[2567,14]]}}}],["opensearch.yml.j2",{"_index":3557,"t":{"746":{"position":[[825,17],[897,17],[2402,17]]}}}],["opensearch/opensearch.yml",{"_index":3551,"t":{"746":{"position":[[464,29],[606,29]]}}}],["opensearch:opensearch",{"_index":3612,"t":{"746":{"position":[[4418,24],[4510,24],[5055,24],[5147,24]]}}}],["opensearch_cluster_nam",{"_index":3569,"t":{"746":{"position":[[1279,23]]}}}],["opensearch_port",{"_index":3576,"t":{"746":{"position":[[1683,15]]}}}],["opensearch_services['opensearch'].en",{"_index":3555,"t":{"746":{"position":[[715,41]]}}}],["openshift",{"_index":2163,"t":{"358":{"position":[[508,9]]}}}],["openssh",{"_index":4106,"t":{"860":{"position":[[2821,7]]},"1028":{"position":[[11,7]]}}}],["openssl",{"_index":5446,"t":{"1379":{"position":[[190,7]]},"1824":{"position":[[300,7]]}}}],["openstack",{"_index":282,"t":{"36":{"position":[[164,9],[1247,9],[1499,9],[1568,9],[1616,9],[1761,9],[1800,9],[1856,9],[1866,9]]},"38":{"position":[[33,9]]},"40":{"position":[[0,9]]},"48":{"position":[[25,9]]},"55":{"position":[[26,9]]},"100":{"position":[[148,9]]},"241":{"position":[[54,10],[77,9],[161,10]]},"247":{"position":[[372,9]]},"251":{"position":[[894,9],[989,9],[1106,9],[1320,9],[1473,9]]},"255":{"position":[[11,9]]},"265":{"position":[[243,9],[352,9],[424,9],[444,9]]},"269":{"position":[[97,10]]},"280":{"position":[[116,9],[186,9]]},"286":{"position":[[128,9],[378,9]]},"298":{"position":[[223,9],[355,9],[439,9]]},"300":{"position":[[339,10],[424,12],[1112,9]]},"302":{"position":[[0,9],[60,9]]},"319":{"position":[[2439,9]]},"321":{"position":[[159,9]]},"325":{"position":[[524,10]]},"327":{"position":[[659,9]]},"329":{"position":[[247,9]]},"339":{"position":[[295,9],[330,9],[437,9],[482,9],[1170,9],[1205,9],[1312,9],[1357,9]]},"341":{"position":[[15,9],[91,9],[224,9],[272,9]]},"352":{"position":[[658,9],[2515,9]]},"363":{"position":[[780,11]]},"369":{"position":[[5,9],[29,9]]},"373":{"position":[[49,9]]},"375":{"position":[[53,9]]},"381":{"position":[[66,9]]},"383":{"position":[[115,9]]},"414":{"position":[[102,10]]},"416":{"position":[[179,9],[623,9]]},"418":{"position":[[289,9]]},"420":{"position":[[3667,9],[4203,9]]},"422":{"position":[[1257,9],[1362,9],[1878,9]]},"424":{"position":[[244,9],[734,9],[924,9],[1173,9],[1216,9]]},"426":{"position":[[236,10]]},"438":{"position":[[22,9]]},"440":{"position":[[298,9]]},"453":{"position":[[1066,9],[1283,9]]},"457":{"position":[[1659,9],[2766,9],[4985,9],[5023,9],[5084,9],[8543,9]]},"459":{"position":[[299,9]]},"462":{"position":[[2692,9]]},"470":{"position":[[1295,9],[1803,10],[3854,9]]},"476":{"position":[[0,9],[264,9]]},"484":{"position":[[531,9],[565,10],[684,10],[819,9]]},"563":{"position":[[176,9]]},"567":{"position":[[52,9],[87,9],[148,9]]},"579":{"position":[[161,9]]},"583":{"position":[[5,9],[579,9]]},"585":{"position":[[6,9],[107,9]]},"587":{"position":[[4,9],[102,9]]},"589":{"position":[[88,9]]},"595":{"position":[[4,9],[76,10],[184,9],[545,9],[858,9]]},"597":{"position":[[0,9]]},"606":{"position":[[4,9],[98,9],[125,9]]},"608":{"position":[[12,9],[67,9],[159,9]]},"610":{"position":[[76,9],[343,9],[382,9],[928,9],[1033,9],[1389,9],[1439,9]]},"612":{"position":[[167,9],[345,9]]},"618":{"position":[[4,9],[68,9]]},"620":{"position":[[57,9],[125,9],[200,9]]},"622":{"position":[[4,9],[500,10],[1275,9]]},"626":{"position":[[57,9],[100,9],[137,9],[192,9],[904,9],[972,9],[1009,9],[1041,9]]},"636":{"position":[[472,9]]},"724":{"position":[[1390,10]]},"729":{"position":[[1002,9],[1095,9]]},"739":{"position":[[59,9],[264,10],[370,9],[577,9],[846,9]]},"749":{"position":[[1504,9],[6246,9],[6330,9],[6844,9]]},"775":{"position":[[104,9]]},"778":{"position":[[63,9]]},"787":{"position":[[2106,9],[2745,9],[3002,9],[3304,9]]},"800":{"position":[[1165,9]]},"802":{"position":[[126,9],[222,9],[512,9],[1540,9],[1605,9],[1774,9],[2264,9],[2514,9],[3346,9],[3388,9]]},"805":{"position":[[62,9],[98,9]]},"807":{"position":[[377,9],[443,9],[512,9],[582,9]]},"809":{"position":[[186,9],[253,9],[323,9],[394,9]]},"819":{"position":[[30,9],[166,9],[203,9],[217,9]]},"821":{"position":[[310,10]]},"836":{"position":[[1297,9]]},"841":{"position":[[381,9],[875,9]]},"843":{"position":[[235,9],[265,10],[276,9],[309,9],[330,9]]},"845":{"position":[[4,9]]},"850":{"position":[[3395,9]]},"863":{"position":[[131,9]]},"873":{"position":[[109,9],[307,9],[492,9]]},"875":{"position":[[65,9],[97,9]]},"889":{"position":[[99,9]]},"902":{"position":[[29,9],[70,9]]},"1047":{"position":[[2,9],[1486,9]]},"1051":{"position":[[4,9],[98,9],[125,9]]},"1053":{"position":[[12,9],[67,9],[159,9]]},"1055":{"position":[[76,9],[343,9],[382,9],[928,9],[1033,9],[1389,9],[1439,9]]},"1057":{"position":[[167,9],[345,9]]},"1061":{"position":[[4,9],[68,9]]},"1063":{"position":[[57,9],[125,9],[200,9]]},"1065":{"position":[[4,9],[500,10],[1275,9]]},"1069":{"position":[[57,9],[100,9],[137,9],[192,9],[904,9],[972,9],[1009,9],[1041,9]]},"1079":{"position":[[472,9]]},"1112":{"position":[[232,10],[603,9],[621,9]]},"1114":{"position":[[534,9],[615,9],[834,9],[869,9]]},"1168":{"position":[[415,9]]},"1308":{"position":[[227,9],[610,10],[700,9]]},"1314":{"position":[[1099,9],[1143,9]]},"1326":{"position":[[197,10]]},"1329":{"position":[[382,9]]},"1332":{"position":[[578,9]]},"1334":{"position":[[32,9]]},"1353":{"position":[[206,9],[340,9],[366,9]]},"1355":{"position":[[439,10],[1125,9],[1140,9]]},"1363":{"position":[[837,9]]},"1365":{"position":[[0,9]]},"1368":{"position":[[4,9],[900,9]]},"1374":{"position":[[151,9],[178,9]]},"1379":{"position":[[281,9]]},"1383":{"position":[[589,9]]},"1387":{"position":[[49,9],[112,9]]},"1397":{"position":[[170,9],[359,9]]},"1400":{"position":[[30,9],[211,9],[1055,9]]},"1402":{"position":[[400,10],[459,9]]},"1417":{"position":[[131,9],[256,10]]},"1431":{"position":[[179,9],[621,9]]},"1434":{"position":[[591,9]]},"1443":{"position":[[0,9]]},"1451":{"position":[[131,9],[256,10]]},"1465":{"position":[[59,9]]},"1467":{"position":[[335,9],[793,9]]},"1471":{"position":[[102,9],[270,9],[425,9]]},"1484":{"position":[[243,9]]},"1559":{"position":[[93,9]]},"1561":{"position":[[102,9]]},"1567":{"position":[[641,9]]},"1577":{"position":[[351,9]]},"1661":{"position":[[17,9]]},"1680":{"position":[[3,9],[165,9],[268,10]]},"1704":{"position":[[1463,9]]},"1710":{"position":[[188,9],[287,11]]},"1717":{"position":[[3,9],[165,9],[268,10]]},"1731":{"position":[[1485,9]]},"1735":{"position":[[188,9],[287,11],[451,9]]},"1737":{"position":[[4,9]]},"1757":{"position":[[146,9],[240,9]]},"1762":{"position":[[3,9],[165,9],[268,10]]},"1778":{"position":[[273,9],[372,11],[536,9]]},"1798":{"position":[[146,9],[240,9]]},"1807":{"position":[[87,12],[155,9],[522,9]]},"1841":{"position":[[3,9],[165,9],[268,10]]},"1853":{"position":[[1019,9]]},"1855":{"position":[[155,9]]},"1857":{"position":[[4,9]]},"1881":{"position":[[153,9]]},"1883":{"position":[[4,9]]},"1895":{"position":[[31,9],[119,9]]},"1897":{"position":[[17,9]]},"1926":{"position":[[11,9]]},"1928":{"position":[[566,10]]},"1930":{"position":[[161,9]]},"1932":{"position":[[471,10],[562,10],[635,9]]},"2028":{"position":[[2315,9],[5227,9],[5891,9],[6054,9],[6109,9],[6151,10]]},"2030":{"position":[[169,9]]},"2032":{"position":[[753,9]]},"2039":{"position":[[135,9],[201,9],[360,9]]},"2041":{"position":[[132,9],[159,9],[203,9],[245,9],[287,9],[330,9],[471,9],[540,9],[577,9]]},"2043":{"position":[[783,9]]},"2045":{"position":[[200,9],[338,10]]},"2051":{"position":[[284,9],[415,9],[726,11],[910,9],[1020,9]]},"2054":{"position":[[184,10],[259,10],[388,10],[459,10]]},"2058":{"position":[[1169,9]]},"2063":{"position":[[86,9],[254,9]]},"2065":{"position":[[81,9]]},"2068":{"position":[[2023,9],[2133,9],[2202,9]]},"2071":{"position":[[120,9]]},"2073":{"position":[[93,9]]},"2077":{"position":[[159,9],[575,9],[741,9],[1339,9],[1371,9],[1483,9],[1532,9],[1669,9],[1752,9],[2006,9],[2043,9],[2191,9],[2239,9],[3344,9]]},"2131":{"position":[[64,10]]},"2139":{"position":[[78,9]]},"2160":{"position":[[64,10]]},"2198":{"position":[[313,10]]},"2202":{"position":[[37,9]]},"2206":{"position":[[170,10]]}}}],["openstack'",{"_index":3004,"t":{"581":{"position":[[11,11]]},"739":{"position":[[332,11]]}}}],["openstack.cloud.keypair",{"_index":4874,"t":{"1174":{"position":[[440,24]]}}}],["openstack.cloud.network",{"_index":4041,"t":{"850":{"position":[[2856,24]]}}}],["openstack.cloud.security_group",{"_index":4820,"t":{"1168":{"position":[[818,31]]}}}],["openstack.cloud.security_group_rul",{"_index":4821,"t":{"1168":{"position":[[1001,36],[1181,36]]}}}],["openstack.cloud.serv",{"_index":4826,"t":{"1168":{"position":[[1425,23]]}}}],["openstack.cloud.subnet",{"_index":4046,"t":{"850":{"position":[[3045,23]]}}}],["openstack.img",{"_index":3133,"t":{"634":{"position":[[892,13],[995,13],[1098,13]]},"1077":{"position":[[892,13],[995,13],[1098,13]]}}}],["openstack.pi",{"_index":6103,"t":{"1735":{"position":[[425,12]]},"1778":{"position":[[510,12]]},"1855":{"position":[[19,12]]},"1881":{"position":[[18,12]]}}}],["openstack.yml",{"_index":4692,"t":{"1114":{"position":[[698,13],[852,13]]}}}],["openstack/sc",{"_index":2953,"t":{"561":{"position":[[3,13]]},"565":{"position":[[110,13]]},"569":{"position":[[3,14]]},"577":{"position":[[89,14]]},"579":{"position":[[34,13]]}}}],["openstack_anti_affin",{"_index":2327,"t":{"420":{"position":[[2345,23]]}}}],["openstack_cinder_extra001_pool",{"_index":3220,"t":{"661":{"position":[[106,31],[373,30]]}}}],["openstack_cloud",{"_index":1955,"t":{"321":{"position":[[1009,15]]},"418":{"position":[[147,15]]},"493":{"position":[[777,15]]}}}],["openstack_cloud_cacert_b64",{"_index":2768,"t":{"476":{"position":[[2015,26]]}}}],["openstack_control_plane_ip",{"_index":2304,"t":{"420":{"position":[[1199,26]]}}}],["openstack_control_plane_machine_flavor",{"_index":2309,"t":{"420":{"position":[[1436,38]]}}}],["openstack_dns_nameserv",{"_index":2253,"t":{"418":{"position":[[466,25]]}}}],["openstack_external_network_id",{"_index":2250,"t":{"418":{"position":[[218,29]]}}}],["openstack_failure_domain",{"_index":2260,"t":{"418":{"position":[[675,24]]}}}],["openstack_image_nam",{"_index":2294,"t":{"420":{"position":[[752,20]]},"462":{"position":[[249,21],[3778,22]]}}}],["openstack_image_raw",{"_index":2300,"t":{"420":{"position":[[976,19]]}}}],["openstack_image_registation_extra_flag",{"_index":2303,"t":{"420":{"position":[[1104,39]]}}}],["openstack_node_machine_flavor",{"_index":2312,"t":{"420":{"position":[[1549,29]]}}}],["openstack_pool_default_min_s",{"_index":3228,"t":{"661":{"position":[[289,31],[822,31]]}}}],["openstack_pool_default_pg_num",{"_index":3223,"t":{"661":{"position":[[165,29],[212,29],[789,29]]}}}],["openstack_pools_extra",{"_index":3218,"t":{"661":{"position":[[35,21],[344,22]]}}}],["openstack_srvgrp_control",{"_index":2331,"t":{"420":{"position":[[2488,27]]}}}],["openstack_srvgrp_work",{"_index":2335,"t":{"420":{"position":[[2591,23]]}}}],["openstack_ssh_key_nam",{"_index":2307,"t":{"420":{"position":[[1303,22]]}}}],["openstack_ssl_no_verifi",{"_index":3684,"t":{"754":{"position":[[64,23]]}}}],["openstack_vers",{"_index":3436,"t":{"714":{"position":[[1107,17]]},"716":{"position":[[262,17]]},"724":{"position":[[1357,17]]},"735":{"position":[[1273,17]]},"791":{"position":[[447,17]]}}}],["openstackcli",{"_index":270,"t":{"36":{"position":[[4,15],[127,15],[216,16],[1040,15],[1289,16]]},"424":{"position":[[753,16]]},"436":{"position":[[60,16]]},"904":{"position":[[12,15]]},"1168":{"position":[[147,15],[2214,15]]},"1250":{"position":[[12,15]]},"1710":{"position":[[215,16]]},"1735":{"position":[[215,16]]},"1778":{"position":[[300,16]]}}}],["openstackclust",{"_index":2103,"t":{"352":{"position":[[626,16],[753,16],[925,16]]}}}],["openstackcluster/testclust",{"_index":2114,"t":{"352":{"position":[[1422,28]]}}}],["openstackclustertempl",{"_index":2901,"t":{"495":{"position":[[932,25]]}}}],["opensus",{"_index":6197,"t":{"1805":{"position":[[68,9]]}}}],["opentelekomcloud",{"_index":3744,"t":{"778":{"position":[[360,16]]}}}],["openvirtualnetwork\"(ovn",{"_index":3037,"t":{"595":{"position":[[895,25]]}}}],["openvswitch",{"_index":3928,"t":{"821":{"position":[[253,11]]},"850":{"position":[[2483,11]]},"898":{"position":[[20,11],[44,11]]},"900":{"position":[[164,12]]},"1221":{"position":[[20,11],[55,11]]},"1308":{"position":[[514,12]]},"1411":{"position":[[199,11]]}}}],["oper",{"_index":30,"t":{"7":{"position":[[115,9]]},"87":{"position":[[88,11]]},"94":{"position":[[23,11],[104,10]]},"173":{"position":[[58,9]]},"239":{"position":[[50,9],[228,8]]},"260":{"position":[[114,8]]},"288":{"position":[[565,9]]},"292":{"position":[[294,9],[781,11]]},"294":{"position":[[108,10]]},"296":{"position":[[137,9]]},"298":{"position":[[340,7]]},"300":{"position":[[178,11],[213,11],[281,11]]},"356":{"position":[[318,9]]},"358":{"position":[[1306,10]]},"363":{"position":[[518,11]]},"422":{"position":[[125,7]]},"424":{"position":[[55,8],[369,9]]},"451":{"position":[[753,9]]},"457":{"position":[[0,9],[77,9],[422,9]]},"587":{"position":[[377,9]]},"603":{"position":[[24,8],[41,8],[74,8],[121,10],[157,8],[283,8],[396,9],[566,9]]},"606":{"position":[[150,8]]},"620":{"position":[[42,8],[185,8]]},"687":{"position":[[111,8]]},"758":{"position":[[676,9]]},"763":{"position":[[320,8],[347,8],[682,8],[1126,8],[1511,8],[1693,8]]},"767":{"position":[[4,8],[244,8],[801,8],[828,8],[1889,8],[2861,8]]},"802":{"position":[[1554,10],[1753,9],[3360,10]]},"816":{"position":[[273,8]]},"834":{"position":[[183,9],[811,9]]},"856":{"position":[[121,9]]},"860":{"position":[[1055,8],[1882,9]]},"865":{"position":[[339,9]]},"989":{"position":[[25,10]]},"1014":{"position":[[333,10]]},"1016":{"position":[[992,10],[1184,10]]},"1020":{"position":[[101,8]]},"1051":{"position":[[150,8]]},"1063":{"position":[[42,8],[185,8]]},"1093":{"position":[[296,8]]},"1114":{"position":[[337,10]]},"1260":{"position":[[363,9]]},"1262":{"position":[[1407,8],[2426,8],[2618,8]]},"1308":{"position":[[297,11]]},"1326":{"position":[[97,11]]},"1329":{"position":[[553,8]]},"1332":{"position":[[254,11]]},"1363":{"position":[[210,9]]},"1368":{"position":[[946,9]]},"1370":{"position":[[54,9]]},"1377":{"position":[[608,9]]},"1415":{"position":[[142,9]]},"1434":{"position":[[518,10]]},"1469":{"position":[[125,8],[222,8]]},"1471":{"position":[[309,10],[725,9]]},"1488":{"position":[[694,10]]},"1496":{"position":[[40,10]]},"1520":{"position":[[122,8]]},"1539":{"position":[[125,8]]},"1553":{"position":[[284,10]]},"1555":{"position":[[102,10]]},"1557":{"position":[[100,9]]},"1569":{"position":[[138,9]]},"1573":{"position":[[0,11],[242,11]]},"1577":{"position":[[175,9]]},"1592":{"position":[[408,10]]},"1622":{"position":[[696,10]]},"1665":{"position":[[1034,9]]},"1680":{"position":[[120,9]]},"1717":{"position":[[120,9]]},"1720":{"position":[[24,9]]},"1762":{"position":[[120,9]]},"1765":{"position":[[24,9]]},"1801":{"position":[[27,9]]},"1810":{"position":[[162,9],[3956,8]]},"1814":{"position":[[557,9],[716,9],[773,9]]},"1824":{"position":[[101,10],[184,10]]},"1841":{"position":[[120,9]]},"1879":{"position":[[106,8],[503,8]]},"1888":{"position":[[1685,9]]},"1891":{"position":[[1201,9]]},"1930":{"position":[[100,10]]},"1964":{"position":[[271,7],[1597,9],[4461,8],[4488,8],[4910,8]]},"1966":{"position":[[4339,7],[4970,8]]},"1990":{"position":[[323,9]]},"1998":{"position":[[190,9],[616,9],[1812,9]]},"2000":{"position":[[101,9]]},"2004":{"position":[[649,9],[1287,9]]},"2011":{"position":[[21,10],[59,11],[258,10]]},"2028":{"position":[[4492,9]]},"2030":{"position":[[313,9]]},"2088":{"position":[[89,10]]},"2094":{"position":[[1885,9],[2197,9],[2246,8],[2611,8],[2990,8]]},"2110":{"position":[[572,10]]},"2114":{"position":[[130,10]]},"2135":{"position":[[99,9]]},"2164":{"position":[[87,9]]},"2198":{"position":[[41,10],[381,9]]}}}],["operato",{"_index":4969,"t":{"1262":{"position":[[883,7]]}}}],["operator'",{"_index":2390,"t":{"422":{"position":[[439,10]]}}}],["operator_public_key",{"_index":3691,"t":{"763":{"position":[[823,19]]}}}],["operator_us",{"_index":3341,"t":{"691":{"position":[[668,13]]}}}],["operators/develop",{"_index":5011,"t":{"1272":{"position":[[187,20]]}}}],["opinion",{"_index":5010,"t":{"1272":{"position":[[87,11],[326,9],[419,7],[631,11]]},"1280":{"position":[[107,8],[328,11]]},"1462":{"position":[[237,11]]},"2164":{"position":[[417,11]]}}}],["opportun",{"_index":1192,"t":{"177":{"position":[[1388,11]]}}}],["oppos",{"_index":5008,"t":{"1272":{"position":[[28,7]]}}}],["opposit",{"_index":1343,"t":{"187":{"position":[[151,8]]}}}],["opsi",{"_index":6234,"t":{"1810":{"position":[[4332,5]]}}}],["opt",{"_index":5361,"t":{"1308":{"position":[[348,4]]},"1434":{"position":[[1306,4]]},"1467":{"position":[[568,4]]},"1647":{"position":[[87,3]]},"1722":{"position":[[54,4],[228,4]]},"1767":{"position":[[54,4],[228,4]]},"2015":{"position":[[347,3]]},"2058":{"position":[[6811,3]]}}}],["opt/ansible/secrets/id_rsa.oper",{"_index":3327,"t":{"689":{"position":[[249,36],[402,36],[555,36],[708,36]]},"691":{"position":[[488,36]]}}}],["opt/cloud",{"_index":3967,"t":{"836":{"position":[[831,10],[906,10],[997,10],[1166,10],[1312,10]]}}}],["opt/configur",{"_index":3877,"t":{"805":{"position":[[6,18]]},"871":{"position":[[264,19]]}}}],["opt/configuration/environments/manag",{"_index":4951,"t":{"1207":{"position":[[4560,39]]}}}],["opt/configuration/environments/manager/group_vars/manager.yml",{"_index":4030,"t":{"850":{"position":[[1814,62],[2276,62]]}}}],["opt/configuration/environments/openstack/playbook",{"_index":4039,"t":{"850":{"position":[[2651,50]]}}}],["opt/configuration/inventory/group_vars/generic/network.yml",{"_index":4029,"t":{"850":{"position":[[1754,59],[2216,59]]}}}],["opt/configuration/scripts/deploy/000",{"_index":3880,"t":{"807":{"position":[[19,37]]}}}],["opt/configuration/scripts/deploy/001",{"_index":3786,"t":{"787":{"position":[[2518,37]]},"807":{"position":[[76,37]]}}}],["opt/configuration/scripts/deploy/100",{"_index":3788,"t":{"787":{"position":[[2575,37]]},"807":{"position":[[133,37]]}}}],["opt/configuration/scripts/deploy/200",{"_index":3790,"t":{"787":{"position":[[2636,37]]},"807":{"position":[[194,37]]}}}],["opt/configuration/scripts/deploy/210",{"_index":3882,"t":{"807":{"position":[[265,37]]}}}],["opt/configuration/scripts/deploy/300",{"_index":3791,"t":{"787":{"position":[[2707,37]]},"807":{"position":[[339,37]]}}}],["opt/configuration/scripts/deploy/310",{"_index":3884,"t":{"807":{"position":[[405,37]]}}}],["opt/configuration/scripts/deploy/320",{"_index":3885,"t":{"807":{"position":[[474,37]]}}}],["opt/configuration/scripts/deploy/330",{"_index":3887,"t":{"807":{"position":[[544,37]]}}}],["opt/configuration/scripts/deploy/400",{"_index":3792,"t":{"787":{"position":[[2773,37]]},"807":{"position":[[615,37]]}}}],["opt/configuration/scripts/dis",{"_index":3919,"t":{"816":{"position":[[1082,34]]}}}],["opt/configuration/scripts/upgrade/100",{"_index":3889,"t":{"809":{"position":[[19,38]]}}}],["opt/configuration/scripts/upgrade/200",{"_index":3890,"t":{"809":{"position":[[75,38]]}}}],["opt/configuration/scripts/upgrade/300",{"_index":3891,"t":{"809":{"position":[[147,38]]}}}],["opt/configuration/scripts/upgrade/310",{"_index":3892,"t":{"809":{"position":[[214,38]]}}}],["opt/configuration/scripts/upgrade/320",{"_index":3893,"t":{"809":{"position":[[284,38]]}}}],["opt/configuration/scripts/upgrade/330",{"_index":3894,"t":{"809":{"position":[[355,38]]}}}],["opt/configuration/secrets/become_password",{"_index":3696,"t":{"763":{"position":[[1350,43],[1427,42],[1550,42],[1732,42]]}}}],["opt/configuration/secrets/conn_password",{"_index":3693,"t":{"763":{"position":[[971,41],[1044,40],[1163,40],[1794,40]]}}}],["opt/configuration/upgrade.sh",{"_index":3995,"t":{"847":{"position":[[212,29]]}}}],["opt/manag",{"_index":4620,"t":{"1043":{"position":[[348,12]]},"1184":{"position":[[274,12]]}}}],["opt/reports/valid",{"_index":4317,"t":{"1012":{"position":[[425,23]]}}}],["opt/td",{"_index":4367,"t":{"1026":{"position":[[224,7],[315,7]]}}}],["optim",{"_index":1766,"t":{"298":{"position":[[210,9]]},"495":{"position":[[253,7]]},"601":{"position":[[280,13]]},"1471":{"position":[[380,8],[615,8]]},"1573":{"position":[[271,8]]},"1988":{"position":[[975,9]]},"2096":{"position":[[1299,9]]}}}],["option",{"_index":497,"t":{"72":{"position":[[186,7]]},"112":{"position":[[28,7]]},"116":{"position":[[10,8]]},"140":{"position":[[130,6]]},"166":{"position":[[1906,6]]},"173":{"position":[[480,8]]},"191":{"position":[[109,10]]},"212":{"position":[[327,6]]},"243":{"position":[[91,10]]},"300":{"position":[[889,8]]},"358":{"position":[[2397,8],[2471,8],[2839,8]]},"381":{"position":[[706,8]]},"386":{"position":[[161,10]]},"420":{"position":[[3867,8],[5902,8]]},"424":{"position":[[1031,10]]},"426":{"position":[[808,7]]},"438":{"position":[[85,7],[283,6]]},"440":{"position":[[87,6]]},"453":{"position":[[728,6]]},"457":{"position":[[8621,10]]},"468":{"position":[[1131,7],[1636,6]]},"470":{"position":[[1356,10]]},"472":{"position":[[232,7]]},"474":{"position":[[1150,11],[1529,11]]},"480":{"position":[[686,8]]},"484":{"position":[[314,8]]},"486":{"position":[[47,8],[196,7],[1291,7]]},"491":{"position":[[109,7],[793,8],[848,7],[876,6]]},"565":{"position":[[540,11],[787,7]]},"571":{"position":[[271,11]]},"585":{"position":[[452,7]]},"597":{"position":[[398,6]]},"610":{"position":[[173,8],[407,9],[420,7]]},"612":{"position":[[249,8]]},"622":{"position":[[567,6]]},"624":{"position":[[115,8]]},"708":{"position":[[132,10]]},"735":{"position":[[458,11]]},"749":{"position":[[6687,7]]},"758":{"position":[[832,9]]},"763":{"position":[[2057,11],[2206,11],[2449,11],[3253,10]]},"773":{"position":[[98,8],[216,8]]},"829":{"position":[[728,8]]},"836":{"position":[[391,6]]},"860":{"position":[[2350,9]]},"873":{"position":[[38,9]]},"900":{"position":[[343,9]]},"947":{"position":[[371,6]]},"1010":{"position":[[567,8],[994,9],[1176,9]]},"1038":{"position":[[684,9]]},"1055":{"position":[[173,8],[407,9],[420,7]]},"1057":{"position":[[249,8]]},"1065":{"position":[[567,6]]},"1067":{"position":[[115,8]]},"1155":{"position":[[31,6]]},"1157":{"position":[[73,7]]},"1189":{"position":[[96,9]]},"1280":{"position":[[214,7]]},"1308":{"position":[[691,8]]},"1349":{"position":[[545,8]]},"1351":{"position":[[77,11]]},"1383":{"position":[[230,9]]},"1429":{"position":[[189,8]]},"1465":{"position":[[345,6]]},"1541":{"position":[[0,10]]},"1563":{"position":[[156,8]]},"1582":{"position":[[118,10]]},"1588":{"position":[[2267,8]]},"1590":{"position":[[261,8]]},"1638":{"position":[[394,9]]},"1640":{"position":[[214,8],[317,10],[379,9],[389,8]]},"1642":{"position":[[879,8]]},"1667":{"position":[[1557,8]]},"1685":{"position":[[27,9],[46,9],[66,9]]},"1696":{"position":[[148,8]]},"1700":{"position":[[20,8],[659,9],[958,8]]},"1708":{"position":[[1327,8]]},"1722":{"position":[[30,9],[178,8]]},"1743":{"position":[[148,8]]},"1747":{"position":[[282,9],[611,8]]},"1751":{"position":[[1331,8]]},"1755":{"position":[[904,6],[1062,6]]},"1767":{"position":[[30,9],[178,8]]},"1780":{"position":[[1757,9]]},"1784":{"position":[[161,8]]},"1786":{"position":[[161,7]]},"1788":{"position":[[386,9],[811,8]]},"1792":{"position":[[1354,8]]},"1796":{"position":[[906,6],[1064,6]]},"1810":{"position":[[2336,8],[4262,9]]},"1814":{"position":[[735,9]]},"1816":{"position":[[575,9],[794,9],[1069,9],[1403,11],[1430,9],[1646,9],[1760,9]]},"1828":{"position":[[371,10]]},"1833":{"position":[[114,9]]},"1843":{"position":[[501,7],[859,7]]},"1864":{"position":[[199,8]]},"1870":{"position":[[85,9]]},"1872":{"position":[[210,9]]},"1879":{"position":[[142,8]]},"1891":{"position":[[1645,6],[4691,6],[4746,6],[6141,7]]},"1928":{"position":[[583,7]]},"1932":{"position":[[41,6],[901,6],[1258,7],[1593,6],[1678,6],[1712,8],[1916,7],[2149,7],[2379,6],[2621,7],[2982,6],[3186,6],[3254,6],[3388,7],[3618,8],[3639,8],[4189,6],[4356,6],[4498,7]]},"1934":{"position":[[28,7]]},"1936":{"position":[[156,8],[217,8],[367,9],[504,8]]},"1938":{"position":[[49,7]]},"1966":{"position":[[4729,7]]},"1977":{"position":[[216,8]]},"1979":{"position":[[846,9]]},"2002":{"position":[[254,8]]},"2015":{"position":[[851,8]]},"2030":{"position":[[144,8],[261,8]]},"2032":{"position":[[328,7],[475,6]]},"2043":{"position":[[946,9]]},"2051":{"position":[[116,6]]},"2075":{"position":[[0,8]]},"2077":{"position":[[3574,6],[3584,6]]},"2083":{"position":[[19,8]]},"2085":{"position":[[19,8]]},"2101":{"position":[[118,10]]},"2139":{"position":[[1007,8]]},"2183":{"position":[[0,8]]},"2185":{"position":[[0,6],[10,6],[31,6],[41,6]]},"2191":{"position":[[19,8]]},"2193":{"position":[[19,8]]},"2200":{"position":[[43,7]]},"2202":{"position":[[400,7],[511,6]]}}}],["optionali",{"_index":1773,"t":{"300":{"position":[[740,9]]}}}],["orchestr",{"_index":1756,"t":{"294":{"position":[[264,13]]},"298":{"position":[[50,14]]},"470":{"position":[[3283,11]]},"543":{"position":[[71,13]]},"571":{"position":[[352,13]]},"579":{"position":[[315,13]]},"603":{"position":[[296,12]]},"606":{"position":[[181,12]]},"1051":{"position":[[181,12]]},"1116":{"position":[[1843,12],[1999,12]]},"1569":{"position":[[208,13]]},"1973":{"position":[[236,13]]},"2009":{"position":[[212,13]]}}}],["orchestration.stack",{"_index":5156,"t":{"1298":{"position":[[4541,21]]}}}],["orchestration_crud",{"_index":5157,"t":{"1298":{"position":[[4571,19]]}}}],["order",{"_index":647,"t":{"100":{"position":[[459,5]]},"118":{"position":[[3,5]]},"148":{"position":[[17,5]]},"197":{"position":[[81,5]]},"204":{"position":[[419,5]]},"227":{"position":[[283,5]]},"229":{"position":[[150,5]]},"317":{"position":[[283,5]]},"345":{"position":[[678,5]]},"348":{"position":[[35,5]]},"424":{"position":[[1151,7]]},"468":{"position":[[1165,8]]},"785":{"position":[[604,5]]},"850":{"position":[[2140,5]]},"863":{"position":[[75,6]]},"1001":{"position":[[159,5]]},"1010":{"position":[[187,5]]},"1014":{"position":[[3,5]]},"1016":{"position":[[154,5]]},"1018":{"position":[[317,5]]},"1170":{"position":[[625,5]]},"1172":{"position":[[3,5]]},"1332":{"position":[[367,5]]},"1537":{"position":[[3,5]]},"1541":{"position":[[80,5],[389,5]]},"1588":{"position":[[461,5]]},"1622":{"position":[[933,5]]},"1647":{"position":[[3,5]]},"1688":{"position":[[1818,5]]},"1690":{"position":[[443,5]]},"1696":{"position":[[812,8]]},"1700":{"position":[[1273,6]]},"1725":{"position":[[2170,5]]},"1727":{"position":[[469,5]]},"1743":{"position":[[948,8]]},"1749":{"position":[[174,6]]},"1770":{"position":[[2472,5]]},"1772":{"position":[[469,5]]},"1780":{"position":[[1813,5]]},"1784":{"position":[[961,8]]},"1790":{"position":[[197,6]]},"1810":{"position":[[4805,6]]},"1816":{"position":[[1558,5]]},"1859":{"position":[[277,5]]},"1891":{"position":[[3280,5],[3681,9]]},"1919":{"position":[[3,5],[1037,5]]},"1964":{"position":[[2626,5]]},"1971":{"position":[[532,5]]},"1975":{"position":[[141,5],[200,5],[690,5],[2374,5]]},"1977":{"position":[[258,5],[2448,5],[3068,5]]},"1979":{"position":[[60,5],[201,5],[1145,5],[1305,5]]},"2007":{"position":[[519,5]]},"2011":{"position":[[423,5]]},"2015":{"position":[[85,5],[1088,5]]},"2090":{"position":[[541,5]]},"2106":{"position":[[745,6],[767,5]]},"2114":{"position":[[65,6],[457,5]]},"2196":{"position":[[105,5]]},"2198":{"position":[[360,5]]},"2200":{"position":[[3,5]]}}}],["org",{"_index":148,"t":{"23":{"position":[[236,3]]},"1172":{"position":[[529,3],[569,3],[683,3]]}}}],["org/mi",{"_index":1817,"t":{"315":{"position":[[135,6]]}}}],["org/zuul_demo_config",{"_index":4886,"t":{"1174":{"position":[[992,21]]}}}],["org/zuul_demo_repo",{"_index":4887,"t":{"1174":{"position":[[1057,18]]}}}],["organ",{"_index":962,"t":{"164":{"position":[[138,13]]},"204":{"position":[[219,10],[446,8]]},"208":{"position":[[352,10]]},"229":{"position":[[385,8],[446,10],[491,8]]},"239":{"position":[[189,13]]},"290":{"position":[[173,13]]},"333":{"position":[[910,13]]},"345":{"position":[[1360,12],[1494,12]]},"519":{"position":[[203,13]]},"1177":{"position":[[62,13]]},"1522":{"position":[[14,9]]},"1524":{"position":[[19,9]]},"1547":{"position":[[186,13]]},"1580":{"position":[[200,13]]},"1622":{"position":[[203,13]]},"1862":{"position":[[203,13]]},"1962":{"position":[[1333,9],[2798,9],[4018,9]]},"1966":{"position":[[3496,13]]},"1988":{"position":[[1162,12]]},"1990":{"position":[[998,13]]},"2028":{"position":[[4021,12],[4295,12],[4528,13],[4854,12],[4901,14]]}}}],["organis",{"_index":597,"t":{"92":{"position":[[263,12]]},"319":{"position":[[5369,12]]},"869":{"position":[[783,12],[957,12],[1131,12]]},"1329":{"position":[[210,12]]},"1545":{"position":[[518,12]]},"1580":{"position":[[371,12]]},"1584":{"position":[[36,12]]},"1588":{"position":[[130,13],[475,12]]},"1594":{"position":[[176,13],[1275,13]]},"2214":{"position":[[150,12]]}}}],["organisation'",{"_index":5726,"t":{"1610":{"position":[[1528,14]]}}}],["organisation/demo",{"_index":592,"t":{"92":{"position":[[114,17]]}}}],["organiz",{"_index":1561,"t":{"239":{"position":[[113,14]]},"1610":{"position":[[1216,14]]},"1984":{"position":[[558,14]]},"2004":{"position":[[31,14],[1638,14]]}}}],["organization'",{"_index":977,"t":{"164":{"position":[[856,14]]},"1986":{"position":[[8,14]]}}}],["organization/compani",{"_index":710,"t":{"104":{"position":[[83,20]]},"1667":{"position":[[720,20]]}}}],["orgs/sovereigncloudstack/data.yaml",{"_index":976,"t":{"164":{"position":[[744,35]]}}}],["orient",{"_index":5526,"t":{"1436":{"position":[[197,9]]}}}],["origin",{"_index":981,"t":{"166":{"position":[[29,6]]},"168":{"position":[[89,6]]},"185":{"position":[[1674,6],[1771,6]]},"189":{"position":[[419,6]]},"323":{"position":[[757,8]]},"1557":{"position":[[274,7]]},"2028":{"position":[[2846,10]]},"2139":{"position":[[63,7]]}}}],["os",{"_index":355,"t":{"36":{"position":[[1744,2],[1812,2]]},"610":{"position":[[1451,2]]},"749":{"position":[[6342,2],[6856,2]]},"802":{"position":[[1788,2],[1837,2],[1891,2],[1923,2],[1949,2],[2007,2],[2029,2],[2054,2],[2088,2],[2111,2],[2141,2],[2528,2],[2577,2],[2631,2],[2663,2],[2689,2],[2747,2],[2769,2],[2794,2],[2828,2],[2851,2],[2881,2],[2993,2]]},"1047":{"position":[[14,2],[1498,2]]},"1055":{"position":[[1451,2]]},"1105":{"position":[[795,4]]},"1557":{"position":[[384,2]]},"1805":{"position":[[17,2]]},"1810":{"position":[[1845,2]]},"1816":{"position":[[218,2],[1545,2],[1715,2],[2068,2]]},"1891":{"position":[[4069,3]]},"1936":{"position":[[289,2]]},"1998":{"position":[[642,3]]}}}],["os:operatingsystem",{"_index":6255,"t":{"1814":{"position":[[1216,18]]}}}],["os_architectur",{"_index":5071,"t":{"1298":{"position":[[738,16]]}}}],["os_cloud",{"_index":357,"t":{"36":{"position":[[1790,9]]},"418":{"position":[[168,8]]},"426":{"position":[[227,8],[439,8]]},"438":{"position":[[606,8]]},"843":{"position":[[199,9]]},"1710":{"position":[[232,9]]},"1735":{"position":[[232,9],[495,8]]},"1778":{"position":[[317,9],[580,8]]}}}],["os_cloud=admin",{"_index":3993,"t":{"843":{"position":[[216,14]]},"845":{"position":[[113,14]]}}}],["os_cloud=mycloud",{"_index":360,"t":{"36":{"position":[[1839,16]]}}}],["os_distro",{"_index":3091,"t":{"626":{"position":[[572,10]]},"632":{"position":[[788,10]]},"1069":{"position":[[572,10]]},"1075":{"position":[[788,10]]},"1298":{"position":[[885,10]]},"1807":{"position":[[320,9]]}}}],["os_hash_algo",{"_index":6250,"t":{"1814":{"position":[[916,12]]}}}],["os_hash_valu",{"_index":6251,"t":{"1814":{"position":[[933,14]]}}}],["os_hidden=tru",{"_index":6215,"t":{"1810":{"position":[[448,17]]}}}],["os_secure_boot",{"_index":6208,"t":{"1807":{"position":[[616,15]]}}}],["os_tuning_param",{"_index":3180,"t":{"657":{"position":[[30,16],[215,17]]}}}],["os_vers",{"_index":3117,"t":{"632":{"position":[[806,11]]},"1075":{"position":[[806,11]]},"1298":{"position":[[815,11]]},"1807":{"position":[[308,11]]}}}],["osb",{"_index":5585,"t":{"1496":{"position":[[143,3]]}}}],["oscli",{"_index":315,"t":{"36":{"position":[[963,5]]}}}],["oscli/bin/activ",{"_index":317,"t":{"36":{"position":[[976,18]]}}}],["osd",{"_index":2997,"t":{"573":{"position":[[512,3]]},"601":{"position":[[7,3]]},"729":{"position":[[1425,4],[3174,3]]},"836":{"position":[[596,3]]},"871":{"position":[[83,4]]},"941":{"position":[[177,3],[204,3],[280,3],[347,3],[410,4]]},"945":{"position":[[7,3],[30,3],[58,3],[83,3]]},"947":{"position":[[163,3],[229,3],[320,4],[436,4],[446,3],[488,4],[498,3],[579,3],[595,3],[671,3]]},"963":{"position":[[7,3]]},"965":{"position":[[7,3],[27,3]]},"971":{"position":[[7,3],[100,3],[189,3]]},"973":{"position":[[7,3]]},"975":{"position":[[48,3],[74,3],[100,3],[146,3]]},"985":{"position":[[348,5],[390,4],[594,4]]},"991":{"position":[[7,3]]},"993":{"position":[[7,3]]},"995":{"position":[[7,3]]},"997":{"position":[[7,3]]},"999":{"position":[[76,3],[151,3]]},"1001":{"position":[[81,3]]},"1003":{"position":[[7,3]]},"1005":{"position":[[7,3],[79,3],[151,3]]},"1007":{"position":[[7,3]]},"1010":{"position":[[18,3],[156,3],[924,4],[1559,3],[1808,3],[1938,3],[2071,3],[2199,3],[3284,4],[3397,4],[3476,4]]},"1012":{"position":[[80,4],[152,5]]},"1014":{"position":[[129,3],[383,3],[404,3],[430,3],[455,3],[482,3],[504,3],[1535,3],[1746,3],[1759,3],[1832,4]]},"1016":{"position":[[431,3],[494,3],[593,4],[809,4],[921,4],[1010,3],[1033,3],[1057,3],[1080,3],[1108,3],[1135,3]]},"1368":{"position":[[230,4],[311,5]]}}}],["osd..servic",{"_index":4323,"t":{"1014":{"position":[[807,22]]},"1016":{"position":[[1743,22]]}}}],["radosgw_address",{"_index":3487,"t":{"729":{"position":[[3065,16]]}}}],["radosgw_interfac",{"_index":3489,"t":{"729":{"position":[[3105,18]]}}}],["raid",{"_index":3039,"t":{"601":{"position":[[185,5],[275,4]]},"860":{"position":[[1429,4],[1480,5],[1569,6]]},"1891":{"position":[[5198,4]]}}}],["rais",{"_index":1291,"t":{"183":{"position":[[1406,5]]},"286":{"position":[[628,6]]},"288":{"position":[[7,5],[75,5]]},"999":{"position":[[45,6]]},"1610":{"position":[[1258,6]]},"1960":{"position":[[914,5]]}}}],["ralli",{"_index":5363,"t":{"1308":{"position":[[454,6]]},"1434":{"position":[[658,6]]}}}],["ram",{"_index":2996,"t":{"573":{"position":[[491,3]]},"614":{"position":[[246,3]]},"628":{"position":[[87,3]]},"780":{"position":[[152,3]]},"829":{"position":[[312,3]]},"1059":{"position":[[246,3]]},"1071":{"position":[[87,3]]},"1559":{"position":[[203,4]]},"1561":{"position":[[262,4]]},"1680":{"position":[[649,4]]},"1683":{"position":[[198,3]]},"1702":{"position":[[63,4],[156,4],[227,3],[317,4],[448,4],[505,4]]},"1704":{"position":[[896,3],[1258,4]]},"1706":{"position":[[527,3],[933,3]]},"1717":{"position":[[649,4],[1300,4]]},"1720":{"position":[[257,3]]},"1722":{"position":[[424,3]]},"1731":{"position":[[918,3],[1281,4]]},"1733":{"position":[[530,3],[1123,3]]},"1735":{"position":[[731,4]]},"1753":{"position":[[63,4],[156,4],[227,3],[317,4],[447,4],[504,4]]},"1762":{"position":[[548,4],[1199,4]]},"1765":{"position":[[257,3]]},"1767":{"position":[[424,3]]},"1776":{"position":[[266,3],[968,3]]},"1778":{"position":[[766,4]]},"1794":{"position":[[63,4],[156,4],[227,3],[317,4],[447,4],[504,4]]},"1847":{"position":[[33,3]]},"1849":{"position":[[33,3]]},"1851":{"position":[[58,4]]},"1853":{"position":[[324,3],[815,4]]},"1891":{"position":[[851,3]]},"1893":{"position":[[843,3]]},"1926":{"position":[[1172,3]]},"2133":{"position":[[752,3]]}}}],["ram[gib",{"_index":5816,"t":{"1685":{"position":[[18,8]]},"1722":{"position":[[21,8]]},"1767":{"position":[[21,8]]}}}],["rancher",{"_index":3129,"t":{"634":{"position":[[605,7]]},"1077":{"position":[[605,7]]}}}],["ranchero",{"_index":3128,"t":{"634":{"position":[[574,9],[1161,9],[1177,9],[1193,9],[1289,9]]},"1077":{"position":[[574,9],[1161,9],[1177,9],[1193,9],[1289,9]]}}}],["random",{"_index":2608,"t":{"468":{"position":[[207,6]]},"850":{"position":[[2153,7]]},"1720":{"position":[[558,6]]},"1765":{"position":[[558,6]]},"1822":{"position":[[130,10]]},"1826":{"position":[[79,10],[562,6],[1170,6]]}}}],["randomli",{"_index":2171,"t":{"358":{"position":[[1585,8]]}}}],["rang",{"_index":1744,"t":{"292":{"position":[[379,5]]},"420":{"position":[[149,5],[240,5],[327,5]]},"519":{"position":[[57,5],[194,5]]},"724":{"position":[[59,5],[138,5]]},"1368":{"position":[[1529,7]]},"1467":{"position":[[1059,7]]},"1516":{"position":[[328,5]]},"1580":{"position":[[57,5],[191,5]]},"1622":{"position":[[57,5],[194,5]]},"1647":{"position":[[60,5]]},"1862":{"position":[[57,5],[194,5]]},"1888":{"position":[[1870,5]]},"1891":{"position":[[4279,5]]},"1956":{"position":[[527,5]]},"1966":{"position":[[7,5],[199,5]]}}}],["range(4",{"_index":819,"t":{"142":{"position":[[370,9]]}}}],["rapid",{"_index":5665,"t":{"1571":{"position":[[136,5]]},"1745":{"position":[[579,6]]},"1786":{"position":[[800,6]]}}}],["rare",{"_index":1190,"t":{"177":{"position":[[1347,6]]},"1739":{"position":[[832,6]]},"1780":{"position":[[830,6]]},"2137":{"position":[[561,6]]},"2166":{"position":[[239,6]]}}}],["rate",{"_index":2670,"t":{"472":{"position":[[699,4],[1951,4],[2659,4]]}}}],["ratio",{"_index":1437,"t":{"206":{"position":[[390,5]]},"214":{"position":[[103,5]]},"1704":{"position":[[175,5],[198,5]]},"1731":{"position":[[173,5],[196,5]]},"1853":{"position":[[38,5]]}}}],["rational",{"_index":6681,"t":{"2068":{"position":[[648,10],[1458,10],[1796,10]]},"2131":{"position":[[466,9]]}}}],["raw",{"_index":785,"t":{"140":{"position":[[79,3]]},"420":{"position":[[1024,3]]},"622":{"position":[[358,4],[516,3],[1026,5],[1141,3],[1267,3]]},"1065":{"position":[[358,4],[516,3],[1026,5],[1141,3],[1267,3]]},"1488":{"position":[[776,3]]},"1632":{"position":[[268,3]]},"1634":{"position":[[724,3]]},"1638":{"position":[[260,3]]},"1814":{"position":[[1070,3]]}}}],["raw/direct",{"_index":6390,"t":{"1891":{"position":[[3487,10]]}}}],["ray",{"_index":828,"t":{"142":{"position":[[575,4]]}}}],["rbac",{"_index":6652,"t":{"2041":{"position":[[85,4],[193,4],[234,4],[277,4],[318,4],[363,4]]},"2051":{"position":[[376,4],[1036,4],[1243,4]]},"2063":{"position":[[336,4]]},"2094":{"position":[[201,4]]}}}],["rbd",{"_index":788,"t":{"140":{"position":[[149,4]]},"622":{"position":[[586,4]]},"661":{"position":[[338,5]]},"999":{"position":[[186,3],[231,4]]},"1065":{"position":[[586,4]]}}}],["rc",{"_index":344,"t":{"36":{"position":[[1509,2]]},"1161":{"position":[[3974,5]]}}}],["rc=0",{"_index":4345,"t":{"1022":{"position":[[205,4]]}}}],["rdna1=1",{"_index":5946,"t":{"1700":{"position":[[823,8]]},"1747":{"position":[[471,8]]},"1788":{"position":[[671,8]]}}}],["rdna2=2",{"_index":5947,"t":{"1700":{"position":[[832,9]]},"1747":{"position":[[480,8]]},"1788":{"position":[[680,8]]}}}],["rdna3=3",{"_index":6136,"t":{"1747":{"position":[[489,8]]},"1788":{"position":[[689,8]]}}}],["rdrand",{"_index":6282,"t":{"1826":{"position":[[442,6]]},"1837":{"position":[[93,6]]}}}],["rdseed",{"_index":6281,"t":{"1826":{"position":[[432,6]]},"1837":{"position":[[83,6]]}}}],["re",{"_index":1834,"t":{"317":{"position":[[933,2]]},"341":{"position":[[509,2]]},"457":{"position":[[9163,2],[9291,2]]},"470":{"position":[[2661,2]]},"474":{"position":[[286,2],[537,2]]},"480":{"position":[[983,2]]},"1010":{"position":[[3031,2]]},"1043":{"position":[[80,2]]},"1184":{"position":[[519,2]]},"2026":{"position":[[374,2]]},"2051":{"position":[[0,2]]},"2206":{"position":[[181,2]]}}}],["reach",{"_index":1066,"t":{"171":{"position":[[428,8]]},"237":{"position":[[336,5]]},"729":{"position":[[1924,7]]},"850":{"position":[[282,5],[372,7]]},"865":{"position":[[251,5]]},"1334":{"position":[[247,7]]},"1757":{"position":[[126,8]]},"1798":{"position":[[126,8]]},"1928":{"position":[[408,7]]},"2051":{"position":[[356,8]]}}}],["reachabl",{"_index":3701,"t":{"763":{"position":[[2637,9],[3589,9]]},"1168":{"position":[[1945,9]]},"2088":{"position":[[231,9]]},"2096":{"position":[[1802,9]]}}}],["reactiv",{"_index":3140,"t":{"636":{"position":[[312,13]]},"1079":{"position":[[312,13]]}}}],["read",{"_index":662,"t":{"100":{"position":[[1012,4]]},"265":{"position":[[701,4],[780,4]]},"267":{"position":[[278,4]]},"319":{"position":[[4109,8]]},"333":{"position":[[792,4]]},"341":{"position":[[477,5]]},"444":{"position":[[214,4]]},"462":{"position":[[2465,4]]},"470":{"position":[[3231,4]]},"583":{"position":[[370,4]]},"987":{"position":[[174,4]]},"989":{"position":[[5,4]]},"1122":{"position":[[924,4]]},"1218":{"position":[[7,4]]},"1272":{"position":[[497,4],[512,4],[817,4],[844,4]]},"1833":{"position":[[193,4],[278,4]]},"1855":{"position":[[37,4]]},"1881":{"position":[[36,4]]},"2094":{"position":[[349,4]]},"2096":{"position":[[481,4]]},"2120":{"position":[[62,4]]}}}],["read/writ",{"_index":6274,"t":{"1826":{"position":[[97,10]]}}}],["readabl",{"_index":1893,"t":{"319":{"position":[[3641,8]]},"1383":{"position":[[192,8]]},"1551":{"position":[[237,8]]},"1563":{"position":[[357,8]]},"1624":{"position":[[281,8]]},"1630":{"position":[[23,8]]},"1647":{"position":[[147,11]]},"1708":{"position":[[489,8]]},"1751":{"position":[[527,8]]},"1778":{"position":[[148,8]]},"1792":{"position":[[527,8]]},"1812":{"position":[[300,8]]},"1864":{"position":[[275,8]]}}}],["reader",{"_index":6667,"t":{"2058":{"position":[[6500,8]]}}}],["reader':%(target.role.name)",{"_index":6669,"t":{"2058":{"position":[[6680,30]]}}}],["readfilesync(\"./docs.package.json",{"_index":666,"t":{"100":{"position":[[1109,36]]}}}],["readi",{"_index":722,"t":{"110":{"position":[[20,5]]},"233":{"position":[[134,5],[194,5]]},"274":{"position":[[72,5]]},"300":{"position":[[1143,5]]},"352":{"position":[[727,6],[1163,9],[1331,5]]},"420":{"position":[[4742,5]]},"486":{"position":[[632,5],[863,5],[1156,5]]},"491":{"position":[[678,5],[1421,5],[1564,6],[2015,6],[2112,5]]},"561":{"position":[[544,6]]},"763":{"position":[[298,5],[3695,6]]},"773":{"position":[[471,6]]},"834":{"position":[[1480,5]]},"836":{"position":[[1425,5]]},"1010":{"position":[[3343,5]]},"1314":{"position":[[479,6],[794,5]]},"1334":{"position":[[95,5]]},"1346":{"position":[[270,6]]},"1349":{"position":[[254,5]]},"1434":{"position":[[909,5]]},"1598":{"position":[[28,5]]},"1962":{"position":[[1869,5]]},"1964":{"position":[[4013,6]]},"1966":{"position":[[1487,5],[3672,5],[4694,5]]}}}],["readili",{"_index":6304,"t":{"1828":{"position":[[914,7]]}}}],["readm",{"_index":677,"t":{"100":{"position":[[1352,6],[1710,6]]},"858":{"position":[[703,6]]},"1310":{"position":[[9,7]]},"1320":{"position":[[9,6]]},"1619":{"position":[[162,6]]}}}],["readme.md",{"_index":690,"t":{"100":{"position":[[1774,11]]},"2065":{"position":[[301,9]]}}}],["readwriteonc",{"_index":5669,"t":{"1575":{"position":[[260,13]]},"1947":{"position":[[0,13]]}}}],["real",{"_index":1983,"t":{"325":{"position":[[1011,4]]},"327":{"position":[[261,4]]},"331":{"position":[[283,4]]},"420":{"position":[[4391,4],[4657,4]]},"457":{"position":[[3968,4]]},"785":{"position":[[99,4]]},"936":{"position":[[708,4]]},"1306":{"position":[[193,4]]},"1349":{"position":[[755,4]]},"1828":{"position":[[485,4]]},"1891":{"position":[[3447,4]]},"1975":{"position":[[2281,4]]},"1994":{"position":[[89,4]]},"1996":{"position":[[311,4]]},"1998":{"position":[[257,4],[504,4],[765,5],[1210,4],[1425,4],[1862,4]]},"2000":{"position":[[49,4]]},"2002":{"position":[[447,4],[811,4]]},"2004":{"position":[[742,4],[1084,4],[1586,4]]},"2096":{"position":[[846,4]]}}}],["realist",{"_index":6369,"t":{"1891":{"position":[[1563,9]]},"1998":{"position":[[1721,9]]},"2002":{"position":[[750,9]]},"2004":{"position":[[842,9],[1517,9]]}}}],["realiti",{"_index":4302,"t":{"1010":{"position":[[1583,8]]},"1893":{"position":[[819,7]]}}}],["realiz",{"_index":3510,"t":{"735":{"position":[[1075,8]]}}}],["realli",{"_index":786,"t":{"140":{"position":[[98,6]]},"162":{"position":[[62,6]]},"622":{"position":[[535,6]]},"938":{"position":[[391,7],[399,6]]},"971":{"position":[[216,6]]},"1001":{"position":[[129,6],[136,6]]},"1065":{"position":[[535,6]]},"1181":{"position":[[42,6]]},"1314":{"position":[[633,6]]},"1801":{"position":[[94,6]]}}}],["realm",{"_index":1601,"t":{"247":{"position":[[1022,5]]},"249":{"position":[[177,6],[399,5],[473,7]]},"802":{"position":[[864,5],[882,5],[1204,5]]},"1262":{"position":[[570,5],[985,5],[1359,5],[1481,5],[2702,5],[3302,5]]},"1471":{"position":[[185,5]]},"2028":{"position":[[1659,9],[1799,6],[1918,5],[2021,5],[4789,7]]},"2077":{"position":[[2408,6],[2498,5],[2598,5],[2641,6],[2700,6],[2744,5],[2932,5],[2964,5],[3153,5],[3472,5],[3540,5]]}}}],["reason",{"_index":1256,"t":{"181":{"position":[[895,10]]},"183":{"position":[[447,7]]},"247":{"position":[[961,6]]},"323":{"position":[[450,7]]},"348":{"position":[[555,10]]},"352":{"position":[[1226,7],[1346,6]]},"457":{"position":[[9328,6]]},"565":{"position":[[636,7]]},"595":{"position":[[532,8]]},"1260":{"position":[[26,10]]},"1329":{"position":[[247,7],[320,7]]},"1355":{"position":[[299,6]]},"1541":{"position":[[811,8]]},"1706":{"position":[[1082,6]]},"1717":{"position":[[1399,10]]},"1733":{"position":[[1272,6]]},"1755":{"position":[[158,6]]},"1762":{"position":[[1298,10]]},"1776":{"position":[[1117,6]]},"1796":{"position":[[294,6]]},"1810":{"position":[[1950,6]]},"1814":{"position":[[403,7]]},"1859":{"position":[[544,8]]},"1891":{"position":[[2196,10],[4021,6],[4844,8]]},"1906":{"position":[[349,10]]},"1986":{"position":[[469,7]]},"1988":{"position":[[921,10]]},"2026":{"position":[[163,10]]},"2028":{"position":[[855,12]]},"2032":{"position":[[445,7],[556,8]]},"2061":{"position":[[264,6]]},"2168":{"position":[[120,10]]},"2202":{"position":[[551,7]]},"2206":{"position":[[77,8]]}}}],["reason_cod",{"_index":5278,"t":{"1298":{"position":[[10437,12]]}}}],["reassign",{"_index":4735,"t":{"1130":{"position":[[276,10]]}}}],["rebal",{"_index":4231,"t":{"971":{"position":[[52,9]]}}}],["rebalanc",{"_index":4336,"t":{"1016":{"position":[[1297,11]]}}}],["reboot",{"_index":3273,"t":{"665":{"position":[[2452,9]]},"763":{"position":[[2442,6],[2465,6],[2566,6],[2763,9],[2943,8],[3241,6],[3336,6],[3383,6]]},"769":{"position":[[598,6],[671,6],[856,6]]},"771":{"position":[[415,6],[449,6]]},"836":{"position":[[677,8]]},"1209":{"position":[[1186,8]]}}}],["rebuilt",{"_index":3109,"t":{"632":{"position":[[58,7]]},"634":{"position":[[62,8],[198,7]]},"1075":{"position":[[58,7]]},"1077":{"position":[[62,8],[198,7]]},"1184":{"position":[[424,8]]}}}],["recal",{"_index":1935,"t":{"319":{"position":[[7439,6]]}}}],["receiv",{"_index":1111,"t":{"175":{"position":[[395,8]]},"187":{"position":[[107,8]]},"329":{"position":[[369,7]]},"422":{"position":[[1651,8]]},"470":{"position":[[3548,7]]},"767":{"position":[[1757,7]]},"1368":{"position":[[1052,8]]},"1385":{"position":[[56,7]]},"1402":{"position":[[651,7]]},"1434":{"position":[[688,8]]},"1473":{"position":[[120,8]]},"1816":{"position":[[1346,7],[1567,7]]},"2028":{"position":[[4930,7]]},"2202":{"position":[[192,8]]}}}],["received:\\nssh",{"_index":3708,"t":{"763":{"position":[[3081,15]]}}}],["receiver_project",{"_index":5147,"t":{"1298":{"position":[[4261,17]]}}}],["receiver_us",{"_index":5149,"t":{"1298":{"position":[[4314,14]]}}}],["recenc",{"_index":5578,"t":{"1488":{"position":[[381,8]]},"1912":{"position":[[52,7]]},"1917":{"position":[[1099,7]]}}}],["recent",{"_index":1202,"t":{"177":{"position":[[1921,6]]},"1270":{"position":[[222,6]]},"1545":{"position":[[375,6]]},"1553":{"position":[[382,6]]},"1565":{"position":[[355,6]]},"1569":{"position":[[338,6]]},"1573":{"position":[[370,6]]},"1636":{"position":[[894,6]]},"1669":{"position":[[859,6]]},"1826":{"position":[[204,6]]},"1828":{"position":[[120,6]]},"1915":{"position":[[124,6]]},"2028":{"position":[[5082,8]]},"2096":{"position":[[1669,6],[1689,6]]},"2124":{"position":[[281,6]]}}}],["recheck",{"_index":1835,"t":{"317":{"position":[[963,7]]},"319":{"position":[[7424,7]]}}}],["recip",{"_index":1649,"t":{"265":{"position":[[603,7]]},"1958":{"position":[[258,6]]}}}],["recipi",{"_index":1108,"t":{"175":{"position":[[94,9],[305,10]]},"183":{"position":[[886,10]]}}}],["reciproc",{"_index":1106,"t":{"175":{"position":[[31,10],[523,11]]},"177":{"position":[[1095,10],[1687,10]]},"179":{"position":[[4,11]]}}}],["recit",{"_index":3067,"t":{"622":{"position":[[419,7]]},"1065":{"position":[[419,7]]}}}],["recogn",{"_index":2030,"t":{"335":{"position":[[23,10]]},"785":{"position":[[639,10]]},"1610":{"position":[[427,9]]},"1843":{"position":[[30,11]]},"1998":{"position":[[92,9]]},"2106":{"position":[[484,10]]}}}],["recognis",{"_index":5807,"t":{"1680":{"position":[[897,13]]}}}],["recogniz",{"_index":6061,"t":{"1717":{"position":[[897,13]]},"1762":{"position":[[796,13]]}}}],["recommend",{"_index":291,"t":{"36":{"position":[[358,9],[799,9],[866,11]]},"70":{"position":[[77,11]]},"129":{"position":[[6,11],[787,11]]},"177":{"position":[[1842,15]]},"204":{"position":[[47,15]]},"319":{"position":[[378,11]]},"358":{"position":[[489,11],[2745,9]]},"381":{"position":[[229,11]]},"420":{"position":[[3229,12]]},"438":{"position":[[419,11]]},"447":{"position":[[551,9]]},"451":{"position":[[369,11],[587,11]]},"457":{"position":[[5630,9],[6131,9]]},"462":{"position":[[1966,13]]},"468":{"position":[[527,9],[668,9]]},"474":{"position":[[69,9]]},"476":{"position":[[98,11]]},"484":{"position":[[327,11]]},"491":{"position":[[864,11]]},"610":{"position":[[672,11],[691,11],[967,11],[1060,11],[1340,11]]},"612":{"position":[[135,11]]},"735":{"position":[[6,11]]},"758":{"position":[[848,11]]},"763":{"position":[[906,13],[1285,13],[2364,11],[2489,11]]},"771":{"position":[[355,12]]},"787":{"position":[[2470,11]]},"802":{"position":[[1311,11]]},"836":{"position":[[1148,12]]},"858":{"position":[[312,11]]},"860":{"position":[[1404,11],[1437,12],[1597,12],[1620,11],[1961,12]]},"865":{"position":[[320,12]]},"960":{"position":[[1155,11]]},"1055":{"position":[[672,11],[691,11],[967,11],[1060,11],[1340,11]]},"1057":{"position":[[135,11]]},"1096":{"position":[[658,11]]},"1189":{"position":[[112,11]]},"1207":{"position":[[4248,11]]},"1209":{"position":[[1803,11]]},"1365":{"position":[[447,11]]},"1411":{"position":[[214,12]]},"1413":{"position":[[211,9]]},"1421":{"position":[[91,12]]},"1434":{"position":[[764,11]]},"1488":{"position":[[310,15]]},"1555":{"position":[[168,10]]},"1561":{"position":[[45,11],[179,11]]},"1563":{"position":[[139,12]]},"1582":{"position":[[92,14]]},"1588":{"position":[[2142,11]]},"1590":{"position":[[601,11]]},"1690":{"position":[[86,12]]},"1696":{"position":[[516,9],[749,12]]},"1698":{"position":[[503,11]]},"1700":{"position":[[37,11]]},"1743":{"position":[[516,9],[790,12]]},"1745":{"position":[[610,11]]},"1784":{"position":[[529,9],[803,12]]},"1786":{"position":[[831,11]]},"1805":{"position":[[166,9]]},"1807":{"position":[[103,9],[362,12],[414,12],[571,11]]},"1810":{"position":[[6,11],[351,11],[2177,9]]},"1812":{"position":[[331,11]]},"1814":{"position":[[140,11],[903,12],[1060,9],[1199,11]]},"1833":{"position":[[6,11]]},"1835":{"position":[[6,11],[189,11]]},"1847":{"position":[[0,11]]},"1849":{"position":[[0,11]]},"1851":{"position":[[232,11],[329,11]]},"1853":{"position":[[773,11]]},"1855":{"position":[[69,11],[348,11]]},"1859":{"position":[[217,16],[375,11],[487,9]]},"1862":{"position":[[363,12]]},"1864":{"position":[[182,12]]},"1870":{"position":[[115,11],[127,13]]},"1872":{"position":[[240,11],[252,13]]},"1874":{"position":[[380,11],[947,12]]},"1879":{"position":[[391,11]]},"1881":{"position":[[68,11],[310,11]]},"1888":{"position":[[1820,12]]},"1891":{"position":[[201,11]]},"1899":{"position":[[464,15]]},"1919":{"position":[[433,11],[980,11]]},"1928":{"position":[[616,12]]},"1932":{"position":[[4632,10]]},"1936":{"position":[[60,11],[238,11]]},"1979":{"position":[[1087,11]]},"2015":{"position":[[305,11],[584,11],[685,11],[779,11]]},"2028":{"position":[[5496,11]]},"2079":{"position":[[0,11]]},"2101":{"position":[[92,14]]},"2139":{"position":[[435,14]]},"2187":{"position":[[0,11]]}}}],["reconcil",{"_index":2132,"t":{"352":{"position":[[2102,10]]},"850":{"position":[[2455,10]]},"1105":{"position":[[194,10],[606,10]]},"1116":{"position":[[627,10]]},"1184":{"position":[[439,10]]}}}],["reconcili",{"_index":2013,"t":{"329":{"position":[[1252,14]]},"422":{"position":[[2310,14]]},"449":{"position":[[210,15]]},"486":{"position":[[679,14]]}}}],["reconfigur",{"_index":1596,"t":{"247":{"position":[[834,13]]},"2028":{"position":[[2368,12]]}}}],["reconnect",{"_index":480,"t":{"70":{"position":[[454,12]]}}}],["record",{"_index":1001,"t":{"166":{"position":[[1013,6]]},"491":{"position":[[1731,6]]},"785":{"position":[[134,7]]},"1034":{"position":[[389,6],[446,6],[504,6]]},"1270":{"position":[[481,7]]},"1526":{"position":[[9,8]]},"1528":{"position":[[60,7]]},"1547":{"position":[[110,7]]},"1586":{"position":[[296,7],[566,7]]},"1588":{"position":[[1622,6]]},"1594":{"position":[[838,6]]},"1615":{"position":[[127,7]]},"1622":{"position":[[1936,6]]},"1624":{"position":[[14,6]]},"1626":{"position":[[157,8]]},"1628":{"position":[[198,9]]},"1632":{"position":[[26,8]]},"1774":{"position":[[847,6]]},"1886":{"position":[[736,6]]},"1964":{"position":[[602,6]]},"1973":{"position":[[62,6]]},"2013":{"position":[[83,6]]},"2147":{"position":[[25,8]]},"2176":{"position":[[25,8]]}}}],["recov",{"_index":6396,"t":{"1891":{"position":[[4445,9]]},"1975":{"position":[[2496,7]]}}}],["recover_after_nod",{"_index":3559,"t":{"746":{"position":[[983,19],[1807,19]]}}}],["recoveri",{"_index":2184,"t":{"358":{"position":[[2322,8]]},"987":{"position":[[29,8],[124,8]]},"1891":{"position":[[634,8],[4245,8]]},"1964":{"position":[[1513,8]]}}}],["recreat",{"_index":2519,"t":{"457":{"position":[[5963,10]]},"470":{"position":[[3642,10],[3701,10]]},"500":{"position":[[149,10]]}}}],["recur",{"_index":3735,"t":{"769":{"position":[[276,9]]},"771":{"position":[[253,9]]}}}],["recurs",{"_index":698,"t":{"100":{"position":[[1949,10]]},"746":{"position":[[4443,10],[4535,10],[5080,10],[5172,10]]}}}],["red",{"_index":5001,"t":{"1266":{"position":[[148,4]]},"1962":{"position":[[4339,3],[4367,3]]},"1966":{"position":[[2569,3],[2728,3],[3011,3]]},"2028":{"position":[[125,3],[170,3]]}}}],["redcarpet",{"_index":843,"t":{"142":{"position":[[707,11]]}}}],["redcarpet.new(\"hello",{"_index":844,"t":{"142":{"position":[[730,20]]}}}],["redeploy",{"_index":2459,"t":{"451":{"position":[[1248,8],[1281,11]]},"1434":{"position":[[444,10]]}}}],["redhat",{"_index":3499,"t":{"732":{"position":[[232,6]]}}}],["redi",{"_index":2814,"t":{"486":{"position":[[1231,5],[1372,5]]},"489":{"position":[[145,6],[271,5]]},"821":{"position":[[304,5]]},"881":{"position":[[20,5],[38,5]]},"1043":{"position":[[290,5]]},"1199":{"position":[[20,5],[49,5]]},"1308":{"position":[[551,6]]}}}],["redirect",{"_index":3847,"t":{"802":{"position":[[300,10],[421,10]]},"1038":{"position":[[488,11],[1340,11]]},"1262":{"position":[[1149,8],[2574,8],[2915,8],[3112,8],[3664,8],[3977,10]]}}}],["redis_s",{"_index":2789,"t":{"486":{"position":[[151,11]]}}}],["redis_size:\"1gi",{"_index":2385,"t":{"420":{"position":[[5819,17]]}}}],["redistribut",{"_index":1005,"t":{"166":{"position":[[1155,13]]},"183":{"position":[[209,12]]},"185":{"position":[[561,12],[1089,12]]}}}],["reduc",{"_index":1768,"t":{"300":{"position":[[165,8]]},"472":{"position":[[2581,6]]},"525":{"position":[[54,7]]},"529":{"position":[[89,7]]},"758":{"position":[[946,7]]},"816":{"position":[[960,7]]},"1189":{"position":[[211,7]]},"1439":{"position":[[412,7]]},"1449":{"position":[[267,7]]},"1567":{"position":[[270,8]]},"1704":{"position":[[988,7]]},"1731":{"position":[[1010,7]]},"1964":{"position":[[2228,6]]},"1990":{"position":[[216,8]]},"2004":{"position":[[320,7]]},"2022":{"position":[[751,7]]},"2028":{"position":[[4736,7]]},"2106":{"position":[[154,6]]}}}],["redund",{"_index":2956,"t":{"561":{"position":[[416,9]]},"563":{"position":[[280,10]]},"599":{"position":[[88,9]]},"1891":{"position":[[25,9],[724,9],[5343,10]]},"1947":{"position":[[328,9],[413,9]]},"1977":{"position":[[49,10],[880,10],[1608,9],[1894,9]]},"1979":{"position":[[188,9],[322,10]]},"2013":{"position":[[347,11]]}}}],["redundantli",{"_index":2999,"t":{"575":{"position":[[126,12]]},"591":{"position":[[168,11]]}}}],["reef",{"_index":4148,"t":{"936":{"position":[[238,4]]}}}],["reelect",{"_index":6373,"t":{"1891":{"position":[[1998,10],[2531,10]]}}}],["ref",{"_index":4266,"t":{"1001":{"position":[[367,3]]}}}],["refer",{"_index":596,"t":{"92":{"position":[[243,9]]},"262":{"position":[[38,9]]},"265":{"position":[[657,9]]},"298":{"position":[[524,5]]},"319":{"position":[[2877,10],[3534,9]]},"321":{"position":[[987,9]]},"333":{"position":[[548,5]]},"335":{"position":[[212,10]]},"360":{"position":[[10,9]]},"442":{"position":[[138,9]]},"470":{"position":[[2443,9]]},"472":{"position":[[60,9],[759,9],[1234,9],[2327,9],[2492,9]]},"493":{"position":[[755,9]]},"533":{"position":[[0,9]]},"535":{"position":[[14,9],[129,9]]},"543":{"position":[[5,6]]},"549":{"position":[[61,9]]},"551":{"position":[[0,5]]},"595":{"position":[[194,6]]},"659":{"position":[[1167,10]]},"735":{"position":[[520,9]]},"775":{"position":[[170,9]]},"1272":{"position":[[343,9]]},"1274":{"position":[[43,9]]},"1278":{"position":[[43,9]]},"1280":{"position":[[340,9],[841,9],[1132,9]]},"1365":{"position":[[406,9],[753,9]]},"1368":{"position":[[66,9]]},"1372":{"position":[[13,9],[46,5]]},"1374":{"position":[[557,9],[590,5]]},"1377":{"position":[[22,5]]},"1383":{"position":[[716,9]]},"1402":{"position":[[284,9],[375,9]]},"1417":{"position":[[767,9]]},"1451":{"position":[[767,9]]},"1465":{"position":[[9,9]]},"1471":{"position":[[862,9]]},"1477":{"position":[[13,9],[46,5]]},"1482":{"position":[[22,5]]},"1486":{"position":[[268,5]]},"1488":{"position":[[870,9]]},"1543":{"position":[[202,5]]},"1590":{"position":[[750,10]]},"1594":{"position":[[1534,5]]},"1610":{"position":[[801,5],[1075,9]]},"1663":{"position":[[211,11]]},"1669":{"position":[[677,9]]},"1708":{"position":[[435,5]]},"1712":{"position":[[464,9]]},"1751":{"position":[[435,5]]},"1774":{"position":[[829,5]]},"1792":{"position":[[435,5]]},"1810":{"position":[[728,9]]},"1814":{"position":[[1000,10]]},"1886":{"position":[[395,9]]},"1888":{"position":[[320,9]]},"1891":{"position":[[2429,9],[4714,9]]},"1962":{"position":[[1098,5]]},"1964":{"position":[[3016,5]]},"1975":{"position":[[598,9]]},"1977":{"position":[[580,9]]},"2026":{"position":[[535,9]]},"2032":{"position":[[47,9]]},"2039":{"position":[[381,5]]},"2058":{"position":[[6388,9]]},"2068":{"position":[[1149,11],[1552,11],[1950,11]]},"2077":{"position":[[715,9]]},"2092":{"position":[[302,9],[443,9]]},"2114":{"position":[[298,10],[367,11],[382,9],[490,9]]},"2118":{"position":[[414,9],[457,6]]},"2150":{"position":[[8,9],[154,9]]},"2152":{"position":[[6,9]]},"2198":{"position":[[328,9]]}}}],["referenc",{"_index":2760,"t":{"476":{"position":[[1123,10]]},"1174":{"position":[[1407,11]]},"1383":{"position":[[341,10]]},"1651":{"position":[[146,10]]},"1671":{"position":[[376,10]]},"1810":{"position":[[92,11],[754,10],[1182,10],[3564,12],[4068,11]]},"1964":{"position":[[2186,10]]}}}],["refin",{"_index":5390,"t":{"1337":{"position":[[101,7]]}}}],["reflect",{"_index":1131,"t":{"175":{"position":[[1045,8]]},"468":{"position":[[628,7]]},"1473":{"position":[[64,10]]},"1659":{"position":[[546,7]]},"1696":{"position":[[108,9],[578,7]]},"1700":{"position":[[927,7]]},"1704":{"position":[[1032,8]]},"1731":{"position":[[1054,8]]},"1743":{"position":[[108,9],[578,7]]},"1747":{"position":[[580,7]]},"1784":{"position":[[121,9],[591,7]]},"1788":{"position":[[780,7]]},"1851":{"position":[[392,10],[507,10]]},"1853":{"position":[[586,8]]},"1979":{"position":[[1225,7]]},"2118":{"position":[[311,7]]}}}],["reformat",{"_index":4216,"t":{"960":{"position":[[946,8]]},"1161":{"position":[[332,8],[487,8],[639,8],[793,8],[959,8],[1127,8],[1279,8],[1434,8],[1596,8],[1749,8],[1902,8],[2056,8],[2211,8],[2366,8],[2520,8],[2673,8],[2830,8],[2990,8],[3135,8],[3287,8],[3560,12]]}}}],["refresh",{"_index":2468,"t":{"457":{"position":[[298,8]]},"763":{"position":[[3175,7]]},"1218":{"position":[[565,7]]}}}],["refriger",{"_index":1542,"t":{"231":{"position":[[265,13]]}}}],["refstack",{"_index":1715,"t":{"286":{"position":[[103,8]]},"791":{"position":[[503,8]]},"1116":{"position":[[1811,9]]},"1308":{"position":[[461,8]]},"1353":{"position":[[401,10]]}}}],["refus",{"_index":1466,"t":{"212":{"position":[[337,8]]},"1187":{"position":[[307,11]]}}}],["regard",{"_index":624,"t":{"96":{"position":[[33,9]]},"118":{"position":[[44,9]]},"122":{"position":[[182,9]]},"237":{"position":[[101,9],[242,9]]},"1272":{"position":[[111,9],[240,9]]},"1363":{"position":[[514,7]]},"1379":{"position":[[145,9],[253,9]]},"1774":{"position":[[787,9]]},"1904":{"position":[[164,9]]},"1906":{"position":[[295,7]]},"1910":{"position":[[24,9]]},"1917":{"position":[[122,7]]},"1921":{"position":[[14,9]]},"1934":{"position":[[124,9]]},"1949":{"position":[[20,9]]},"2045":{"position":[[546,7]]},"2058":{"position":[[6716,9]]}}}],["regardless",{"_index":6672,"t":{"2061":{"position":[[160,10]]}}}],["regener",{"_index":3771,"t":{"785":{"position":[[529,11]]}}}],["regex",{"_index":6337,"t":{"1872":{"position":[[107,7]]}}}],["regio.cloud",{"_index":3142,"t":{"639":{"position":[[99,12]]},"775":{"position":[[144,12]]},"778":{"position":[[431,11],[729,12]]},"787":{"position":[[545,11],[1335,11]]},"791":{"position":[[58,12]]},"1082":{"position":[[99,12]]},"1520":{"position":[[447,11]]},"1539":{"position":[[450,11]]}}}],["regioclodu",{"_index":3777,"t":{"787":{"position":[[721,10]]}}}],["regiocloud",{"_index":3748,"t":{"778":{"position":[[449,10]]},"787":{"position":[[662,10],[795,11],[1502,11]]},"791":{"position":[[158,10]]},"869":{"position":[[772,10],[946,10],[1120,10]]}}}],["regiocloud/configur",{"_index":3393,"t":{"712":{"position":[[527,24],[715,24]]}}}],["region",{"_index":2660,"t":{"470":{"position":[[5249,8]]},"561":{"position":[[17,6],[304,7],[392,6],[498,7]]},"567":{"position":[[343,8]]},"569":{"position":[[164,7]]},"579":{"position":[[81,7]]},"1298":{"position":[[11786,7]]},"1353":{"position":[[479,8]]},"1888":{"position":[[1369,7]]},"2013":{"position":[[1321,8]]}}}],["region'",{"_index":2962,"t":{"563":{"position":[[88,8]]}}}],["region_nam",{"_index":2756,"t":{"476":{"position":[[573,12]]}}}],["regionon",{"_index":2757,"t":{"476":{"position":[[586,9]]}}}],["regist",{"_index":554,"t":{"83":{"position":[[132,8]]},"206":{"position":[[346,11]]},"212":{"position":[[226,8]]},"333":{"position":[[117,10]]},"377":{"position":[[84,11],[189,8]]},"420":{"position":[[1005,8]]},"462":{"position":[[374,10]]},"470":{"position":[[1783,9]]},"491":{"position":[[733,10]]},"1168":{"position":[[1673,9]]},"1700":{"position":[[313,11]]},"1739":{"position":[[1428,8]]},"1755":{"position":[[1327,11]]},"1780":{"position":[[1429,8]]},"1796":{"position":[[1329,11]]},"1810":{"position":[[1754,10]]}}}],["registr",{"_index":1376,"t":{"195":{"position":[[362,12]]},"212":{"position":[[171,13],[244,12]]},"229":{"position":[[227,14]]},"420":{"position":[[1183,12]]},"480":{"position":[[619,12]]},"778":{"position":[[135,12]]},"1814":{"position":[[1185,13]]}}}],["registri",{"_index":1772,"t":{"300":{"position":[[544,8],[614,9]]},"420":{"position":[[3808,8],[5879,8]]},"472":{"position":[[177,8],[203,8],[435,8],[510,8],[581,9],[638,8],[815,8],[967,8],[1171,8],[1248,8],[1502,10],[1764,8],[1824,9],[1997,9],[2219,8],[2318,8],[2483,8],[2560,11],[2626,10],[2694,11],[2731,8],[2798,11],[2909,8],[3061,8],[3456,8],[3509,8],[3586,8]]},"474":{"position":[[437,9],[956,8],[1012,8],[1099,8],[1198,8],[1577,8],[1621,8],[1906,8]]},"484":{"position":[[56,8],[742,10]]},"486":{"position":[[1130,8]]},"1377":{"position":[[838,8]]},"1467":{"position":[[620,8],[693,8],[740,11]]},"1488":{"position":[[453,8]]},"1956":{"position":[[12,8],[128,8],[257,10],[395,10]]},"1958":{"position":[[92,10],[215,8],[321,8],[408,8],[593,8],[743,8]]},"1960":{"position":[[68,8],[322,8],[498,8],[728,8]]},"1962":{"position":[[135,8]]},"1964":{"position":[[78,8],[216,8],[443,8],[1326,8],[1648,8],[1743,8],[1827,10],[1872,10],[1989,8],[2056,8],[2450,8],[2839,8],[2962,8],[3103,8],[3911,8]]},"1966":{"position":[[38,8],[285,8],[961,8],[1252,8],[1411,8],[2503,8],[4357,10],[5352,8]]},"1968":{"position":[[98,8]]}}}],["registry.gitlab.com",{"_index":2689,"t":{"472":{"position":[[2836,19]]}}}],["registry.k8s.io",{"_index":2690,"t":{"472":{"position":[[2856,15]]},"1381":{"position":[[122,15]]}}}],["registry.scs.commun",{"_index":2676,"t":{"472":{"position":[[1731,22]]},"474":{"position":[[1066,22]]},"1475":{"position":[[143,22]]}}}],["registry/registri",{"_index":4659,"t":{"1099":{"position":[[793,19]]}}}],["regul",{"_index":6663,"t":{"2051":{"position":[[1214,9]]},"2068":{"position":[[974,10]]}}}],["regular",{"_index":1378,"t":{"195":{"position":[[414,8]]},"632":{"position":[[69,7]]},"1075":{"position":[[69,7]]},"1391":{"position":[[162,7]]},"1537":{"position":[[147,7]]},"1541":{"position":[[331,7]]},"1669":{"position":[[883,7]]},"1872":{"position":[[115,7],[560,7],[639,7]]},"2077":{"position":[[1871,7]]}}}],["regularli",{"_index":1655,"t":{"265":{"position":[[942,10]]},"348":{"position":[[439,9]]},"358":{"position":[[99,9]]},"1439":{"position":[[333,9]]},"1810":{"position":[[51,9]]}}}],["reinstal",{"_index":3958,"t":{"834":{"position":[[1055,13]]}}}],["reject",{"_index":5696,"t":{"1588":{"position":[[1692,8],[2047,8],[2121,8],[2181,9]]},"1590":{"position":[[462,9]]},"1592":{"position":[[109,9]]},"1602":{"position":[[94,9]]},"1626":{"position":[[60,8]]}}}],["rejected_at",{"_index":5699,"t":{"1588":{"position":[[2013,11]]}}}],["rel",{"_index":1073,"t":{"171":{"position":[[646,8]]},"177":{"position":[[141,10]]},"472":{"position":[[3140,8]]},"802":{"position":[[1362,10]]},"1640":{"position":[[68,9]]}}}],["relat",{"_index":870,"t":{"150":{"position":[[278,7]]},"313":{"position":[[953,7]]},"352":{"position":[[668,7]]},"356":{"position":[[126,7]]},"358":{"position":[[618,7]]},"420":{"position":[[3841,7],[5915,7]]},"462":{"position":[[2728,7]]},"472":{"position":[[276,7],[1838,7]]},"474":{"position":[[447,7]]},"1137":{"position":[[279,7]]},"1266":{"position":[[47,7]]},"1545":{"position":[[118,7]]},"1565":{"position":[[206,7]]},"1590":{"position":[[718,7],[761,7]]},"1717":{"position":[[1095,7]]},"1762":{"position":[[994,7]]},"1888":{"position":[[629,10]]},"1951":{"position":[[44,7]]},"1962":{"position":[[5591,7],[5700,7]]},"2045":{"position":[[147,8]]},"2083":{"position":[[0,7]]},"2118":{"position":[[22,8]]},"2164":{"position":[[322,8]]},"2191":{"position":[[0,7]]}}}],["relationship",{"_index":5670,"t":{"1577":{"position":[[261,12]]},"1715":{"position":[[282,12]]},"1760":{"position":[[282,12]]},"2198":{"position":[[118,13]]}}}],["relax",{"_index":1404,"t":{"202":{"position":[[22,7]]},"214":{"position":[[44,7]]},"495":{"position":[[544,7]]}}}],["releas",{"_index":762,"t":{"129":{"position":[[634,7]]},"175":{"position":[[190,7]]},"179":{"position":[[276,9],[557,9]]},"195":{"position":[[702,9]]},"269":{"position":[[348,8]]},"272":{"position":[[16,8],[134,7]]},"274":{"position":[[43,7],[216,7]]},"276":{"position":[[5,7],[112,7]]},"278":{"position":[[0,7],[232,7]]},"280":{"position":[[248,7]]},"282":{"position":[[18,7]]},"304":{"position":[[176,7],[440,7]]},"319":{"position":[[1823,7]]},"325":{"position":[[1090,9]]},"358":{"position":[[2070,7]]},"420":{"position":[[740,8]]},"451":{"position":[[423,8],[542,8]]},"457":{"position":[[2376,7],[2407,7],[6559,7],[7654,9]]},"462":{"position":[[2487,7],[2857,7]]},"474":{"position":[[51,7],[144,8]]},"486":{"position":[[671,7]]},"595":{"position":[[868,8]]},"634":{"position":[[134,7]]},"724":{"position":[[248,7],[973,8],[1427,7]]},"735":{"position":[[34,7],[66,8],[166,7],[221,7],[667,8],[1428,7]]},"819":{"position":[[40,8]]},"827":{"position":[[83,7]]},"834":{"position":[[200,7],[243,8]]},"938":{"position":[[17,8],[143,8],[339,8]]},"1077":{"position":[[134,7]]},"1099":{"position":[[571,7]]},"1112":{"position":[[24,7],[54,8],[117,8],[271,8],[451,8],[509,8],[589,7]]},"1114":{"position":[[398,7],[544,8],[588,8],[663,9],[738,8],[770,8],[990,7]]},"1116":{"position":[[35,7],[66,8],[79,7],[314,7],[351,7],[383,7],[410,7],[524,7],[904,7],[971,7],[1707,8],[2418,7],[2506,7],[2688,7],[2750,7],[2802,7]]},"1118":{"position":[[26,7]]},"1122":{"position":[[35,7],[698,8],[992,7],[1080,7],[1247,7],[1566,7],[1887,7],[2218,7],[2540,7],[2862,7],[3183,7],[3499,7]]},"1126":{"position":[[17,7]]},"1177":{"position":[[76,7]]},"1207":{"position":[[4473,7]]},"1209":{"position":[[902,8]]},"1218":{"position":[[16,7],[114,7],[216,8]]},"1304":{"position":[[0,8]]},"1306":{"position":[[268,7]]},"1308":{"position":[[915,7]]},"1314":{"position":[[177,9],[772,7],[828,9],[1350,9]]},"1316":{"position":[[4,7]]},"1324":{"position":[[0,8]]},"1326":{"position":[[15,7]]},"1344":{"position":[[201,7]]},"1349":{"position":[[961,7]]},"1355":{"position":[[957,8],[997,7],[1158,7]]},"1357":{"position":[[4,7]]},"1361":{"position":[[0,8]]},"1363":{"position":[[0,7],[443,9]]},"1365":{"position":[[14,7],[60,7],[546,7],[829,7]]},"1368":{"position":[[657,8]]},"1379":{"position":[[15,7]]},"1387":{"position":[[279,8]]},"1393":{"position":[[0,8]]},"1395":{"position":[[15,7]]},"1397":{"position":[[38,9],[112,7],[327,7],[374,7],[420,7]]},"1402":{"position":[[229,7],[1177,7]]},"1405":{"position":[[88,7]]},"1411":{"position":[[377,8],[1110,7]]},"1413":{"position":[[55,7],[271,7]]},"1419":{"position":[[4,7],[160,7]]},"1427":{"position":[[0,8]]},"1429":{"position":[[15,7]]},"1431":{"position":[[47,9],[121,7],[589,7],[636,7]]},"1436":{"position":[[678,7]]},"1439":{"position":[[202,7]]},"1445":{"position":[[311,7]]},"1453":{"position":[[4,7],[160,7]]},"1460":{"position":[[0,8]]},"1462":{"position":[[21,8],[30,7]]},"1469":{"position":[[146,8]]},"1484":{"position":[[15,7]]},"1486":{"position":[[316,7]]},"1498":{"position":[[51,7],[62,7],[80,8],[139,7],[152,8]]},"1571":{"position":[[247,7]]},"1594":{"position":[[2161,8]]},"1596":{"position":[[123,8],[147,7]]},"1610":{"position":[[489,9],[522,8],[863,7]]},"1665":{"position":[[1290,8]]},"1678":{"position":[[34,7]]},"1688":{"position":[[704,8]]},"1715":{"position":[[34,7]]},"1725":{"position":[[799,8]]},"1760":{"position":[[34,7]]},"1770":{"position":[[814,8]]},"1810":{"position":[[1360,8],[4548,8]]},"1812":{"position":[[270,7]]},"1814":{"position":[[117,8]]},"1899":{"position":[[105,8]]},"1904":{"position":[[264,8],[294,7],[314,7],[401,7],[456,8],[471,7],[574,7]]},"1906":{"position":[[134,9]]},"1908":{"position":[[63,7],[132,7]]},"1910":{"position":[[46,9],[127,8]]},"1915":{"position":[[42,7],[137,8],[260,9],[351,8],[725,7],[802,8],[831,7],[863,8],[987,7],[1001,7]]},"1917":{"position":[[72,7],[133,8],[518,9],[571,8]]},"1919":{"position":[[251,8],[329,8],[511,8]]},"1921":{"position":[[36,9],[118,8],[164,7],[184,7]]},"1964":{"position":[[4726,7]]}}}],["release.osism.tech",{"_index":3452,"t":{"724":{"position":[[998,19]]},"735":{"position":[[89,19]]}}}],["release.pi",{"_index":4697,"t":{"1114":{"position":[[903,11],[950,10]]}}}],["release.sh",{"_index":4679,"t":{"1107":{"position":[[194,10]]}}}],["release=6.0.0b",{"_index":4698,"t":{"1114":{"position":[[915,14]]}}}],["releasenotes/config.yaml",{"_index":4720,"t":{"1122":{"position":[[296,27]]}}}],["releasenotes/notes/remov",{"_index":4722,"t":{"1122":{"position":[[362,25]]}}}],["releases.ubuntu.com",{"_index":4085,"t":{"860":{"position":[[261,20]]}}}],["relev",{"_index":648,"t":{"100":{"position":[[566,8]]},"160":{"position":[[84,8]]},"177":{"position":[[751,8]]},"208":{"position":[[294,8]]},"269":{"position":[[68,8]]},"288":{"position":[[103,8]]},"335":{"position":[[383,8]]},"352":{"position":[[1190,8]]},"457":{"position":[[593,8],[1102,8],[4314,8]]},"474":{"position":[[676,8]]},"491":{"position":[[117,8]]},"620":{"position":[[25,8]]},"1063":{"position":[[25,8]]},"1344":{"position":[[158,8]]},"1357":{"position":[[87,8]]},"1419":{"position":[[87,8]]},"1453":{"position":[[87,8]]},"1490":{"position":[[0,8]]},"1590":{"position":[[121,8]]},"1717":{"position":[[986,8]]},"1762":{"position":[[885,8]]},"1975":{"position":[[2097,9]]},"2028":{"position":[[2288,8],[5195,8]]}}}],["reli",{"_index":1714,"t":{"286":{"position":[[74,7]]},"1280":{"position":[[702,4]]},"1353":{"position":[[198,4]]},"1355":{"position":[[379,4]]},"1824":{"position":[[79,6]]},"1926":{"position":[[989,7]]},"2024":{"position":[[388,7]]},"2096":{"position":[[747,6]]}}}],["reliabl",{"_index":1734,"t":{"288":{"position":[[744,9]]},"294":{"position":[[310,8]]},"300":{"position":[[309,12]]},"325":{"position":[[1328,8]]},"591":{"position":[[81,9]]},"1036":{"position":[[448,8]]},"1563":{"position":[[475,11]]},"1573":{"position":[[284,12]]},"1706":{"position":[[1033,11]]},"1733":{"position":[[1223,11]]},"1776":{"position":[[1068,11]]},"2002":{"position":[[736,9]]},"2004":{"position":[[1131,8],[1503,9],[1900,8]]},"2026":{"position":[[83,9]]},"2135":{"position":[[217,8]]},"2164":{"position":[[205,8]]}}}],["relicens",{"_index":1335,"t":{"185":{"position":[[2632,11]]}}}],["reload",{"_index":2735,"t":{"474":{"position":[[2631,8],[3135,8]]}}}],["remain",{"_index":1124,"t":{"175":{"position":[[803,6]]},"478":{"position":[[1176,6]]},"1355":{"position":[[687,8]]},"1619":{"position":[[169,6],[379,6]]},"1810":{"position":[[470,7],[3733,6],[3842,6],[3918,6],[4636,6]]},"1904":{"position":[[679,9]]},"1915":{"position":[[431,9]]},"1926":{"position":[[887,6]]}}}],["rememb",{"_index":6113,"t":{"1739":{"position":[[1728,8]]},"1780":{"position":[[1844,8]]}}}],["remind",{"_index":1055,"t":{"171":{"position":[[99,8],[263,9],[293,7],[494,9],[541,8]]}}}],["remot",{"_index":2703,"t":{"474":{"position":[[639,6]]},"850":{"position":[[2638,6]]},"938":{"position":[[360,8]]},"1541":{"position":[[723,8]]},"1888":{"position":[[1406,6]]}}}],["remote_ip_prefix",{"_index":4823,"t":{"1168":{"position":[[1111,17],[1290,17]]}}}],["remov",{"_index":663,"t":{"100":{"position":[[1066,6],[1329,6],[1602,6],[1703,6],[2105,6]]},"337":{"position":[[838,7],[1640,7]]},"345":{"position":[[1782,6],[2035,7]]},"470":{"position":[[2754,6],[4262,6],[4902,6],[4948,6],[5038,7],[5067,6]]},"478":{"position":[[949,8]]},"484":{"position":[[902,7]]},"606":{"position":[[69,7]]},"636":{"position":[[18,7]]},"665":{"position":[[426,8]]},"735":{"position":[[1390,8]]},"834":{"position":[[945,6]]},"947":{"position":[[469,6],[635,6]]},"960":{"position":[[347,7]]},"985":{"position":[[204,7]]},"1016":{"position":[[952,8],[968,6]]},"1034":{"position":[[737,8]]},"1043":{"position":[[279,6]]},"1047":{"position":[[1061,6],[1154,8],[1214,6],[1307,8],[1367,6],[1460,8]]},"1051":{"position":[[69,7]]},"1079":{"position":[[18,7]]},"1112":{"position":[[414,9],[876,8]]},"1114":{"position":[[462,6],[514,6]]},"1116":{"position":[[2291,7]]},"1122":{"position":[[178,8],[187,6],[242,6],[1166,6],[1485,6],[1806,6],[2137,6],[2459,6],[2781,6],[3102,6],[3418,6]]},"1124":{"position":[[121,8],[458,7]]},"1130":{"position":[[259,7]]},"1266":{"position":[[166,7]]},"1374":{"position":[[36,7],[534,8],[615,8],[708,7]]},"1377":{"position":[[365,7],[394,7],[482,7],[568,7],[677,7]]},"1409":{"position":[[29,8]]},"1411":{"position":[[349,7],[591,7],[679,7],[1090,7]]},"1443":{"position":[[106,8],[208,8]]},"1445":{"position":[[291,7],[402,7],[561,7]]},"1479":{"position":[[17,8],[52,7]]},"1482":{"position":[[131,7],[278,7]]},"1498":{"position":[[125,8]]},"1602":{"position":[[17,7]]},"1755":{"position":[[1505,6]]},"1796":{"position":[[1507,6]]},"1877":{"position":[[369,8]]},"1891":{"position":[[1098,6]]},"1964":{"position":[[2127,8]]},"2137":{"position":[[776,6]]}}}],["remove_clust",{"_index":2661,"t":{"470":{"position":[[5258,14]]}}}],["removegitcommand",{"_index":684,"t":{"100":{"position":[[1627,16]]}}}],["removereadmecommand",{"_index":689,"t":{"100":{"position":[[1729,19]]}}}],["removerepocommand",{"_index":706,"t":{"100":{"position":[[2140,17]]}}}],["renam",{"_index":2486,"t":{"457":{"position":[[1944,8],[9269,6]]},"595":{"position":[[583,7]]},"798":{"position":[[137,6]]},"839":{"position":[[157,6]]},"1441":{"position":[[323,7]]},"1594":{"position":[[754,6]]},"1619":{"position":[[187,6]]},"1755":{"position":[[1532,6]]},"1796":{"position":[[1534,6]]},"1810":{"position":[[387,7],[4033,7],[4623,8]]}}}],["render",{"_index":645,"t":{"100":{"position":[[399,8]]},"140":{"position":[[317,6]]},"470":{"position":[[1086,6]]},"622":{"position":[[731,6]]},"665":{"position":[[990,9]]},"1065":{"position":[[731,6]]},"1122":{"position":[[762,8],[1265,9],[1584,9],[1905,9],[2236,9],[2558,9],[2880,9],[3201,9],[3517,9]]},"1598":{"position":[[142,6]]},"1877":{"position":[[95,6]]}}}],["renew",{"_index":2082,"t":{"348":{"position":[[177,7],[214,6],[391,7],[574,5],[616,5],[701,5]]},"1415":{"position":[[103,7]]}}}],["reno",{"_index":4718,"t":{"1118":{"position":[[7,4]]},"1120":{"position":[[0,4],[81,4]]},"1122":{"position":[[64,5],[233,4]]}}}],["reno.yaml",{"_index":4721,"t":{"1122":{"position":[[324,11]]}}}],["renov",{"_index":4691,"t":{"1114":{"position":[[475,8]]},"1436":{"position":[[499,8]]}}}],["reopen",{"_index":1833,"t":{"317":{"position":[[924,8]]},"319":{"position":[[7276,6]]}}}],["repair",{"_index":4252,"t":{"987":{"position":[[10,6],[276,7]]}}}],["repeat",{"_index":4727,"t":{"1122":{"position":[[958,9],[1422,9],[1741,9],[2062,9],[2393,9],[2715,9],[3037,9],[3358,9],[3674,9]]}}}],["replac",{"_index":739,"t":{"120":{"position":[[336,7]]},"319":{"position":[[5846,8]]},"418":{"position":[[597,7]]},"462":{"position":[[791,7]]},"581":{"position":[[181,7]]},"595":{"position":[[948,8]]},"665":{"position":[[679,8]]},"787":{"position":[[713,7]]},"869":{"position":[[583,7]]},"1010":{"position":[[2895,7]]},"1116":{"position":[[367,8]]},"1122":{"position":[[622,7]]},"1368":{"position":[[1111,7]]},"1411":{"position":[[691,8],[1039,8]]},"1445":{"position":[[240,8],[573,8]]},"1469":{"position":[[104,8]]},"1588":{"position":[[998,8],[1050,8],[1108,8],[2235,7],[2258,8],[2314,9]]},"1594":{"position":[[318,8],[773,7],[1567,8]]},"1600":{"position":[[360,11]]},"1602":{"position":[[119,11]]},"1626":{"position":[[47,8]]},"1642":{"position":[[1283,8]]},"1671":{"position":[[913,7]]},"1712":{"position":[[280,7]]},"1810":{"position":[[830,8],[891,8],[953,8],[1012,8],[1069,8],[1132,8],[1292,7],[1452,8],[3716,11],[4753,7]]},"1851":{"position":[[289,8]]}}}],["replace(/\\s/g",{"_index":668,"t":{"100":{"position":[[1154,15]]}}}],["replace/append",{"_index":2773,"t":{"478":{"position":[[426,14]]}}}],["replace_frequ",{"_index":3092,"t":{"626":{"position":[[590,18]]},"1069":{"position":[[590,18]]},"1810":{"position":[[597,18],[669,18],[778,17],[3108,18],[4203,17]]}}}],["replace_frequency=monthli",{"_index":6236,"t":{"1810":{"position":[[4351,26]]}}}],["replaced_bi",{"_index":5700,"t":{"1588":{"position":[[2130,11]]},"1594":{"position":[[1703,11]]},"1600":{"position":[[432,11]]},"1602":{"position":[[191,11]]}}}],["replic",{"_index":4260,"t":{"997":{"position":[[54,10]]},"1005":{"position":[[29,10],[101,10],[173,10]]},"1888":{"position":[[188,11],[425,10]]},"1891":{"position":[[5517,11]]},"1895":{"position":[[875,10]]},"1928":{"position":[[284,10]]},"1932":{"position":[[2629,12],[2642,11],[2832,10],[3080,10],[3164,11],[3409,11]]},"1934":{"position":[[111,12],[134,12]]},"1936":{"position":[[226,11],[394,11]]},"1964":{"position":[[1752,11],[1764,11],[1792,9],[3920,11]]},"1966":{"position":[[1261,12]]},"1977":{"position":[[1517,9]]}}}],["replica",{"_index":2859,"t":{"489":{"position":[[749,9]]},"1888":{"position":[[532,8]]},"1932":{"position":[[2696,8],[3130,9],[3281,8]]},"1934":{"position":[[164,8]]},"1936":{"position":[[339,9]]}}}],["replicated_hdd",{"_index":4272,"t":{"1005":{"position":[[40,14]]}}}],["replicated_nvm",{"_index":4274,"t":{"1005":{"position":[[184,15]]}}}],["replicated_rul",{"_index":3226,"t":{"661":{"position":[[257,17]]}}}],["replicated_ssd",{"_index":4273,"t":{"1005":{"position":[[112,14]]}}}],["replication/redund",{"_index":6356,"t":{"1888":{"position":[[248,22]]}}}],["replication_statu",{"_index":5105,"t":{"1298":{"position":[[2008,19],[2654,19]]}}}],["repo",{"_index":330,"t":{"36":{"position":[[1311,4]]},"76":{"position":[[43,4]]},"92":{"position":[[65,4],[100,7],[238,4],[478,4]]},"100":{"position":[[1235,5]]},"315":{"position":[[142,4]]},"317":{"position":[[545,4]]},"319":{"position":[[505,5]]},"462":{"position":[[446,5]]},"1174":{"position":[[1395,5],[1444,5]]},"1177":{"position":[[32,5]]},"1308":{"position":[[923,4]]},"1400":{"position":[[1290,4]]}}}],["repo.repo",{"_index":682,"t":{"100":{"position":[[1551,10]]}}}],["repo.target}/${repo.label",{"_index":696,"t":{"100":{"position":[[1890,31]]}}}],["repo_to_be_edit",{"_index":707,"t":{"100":{"position":[[2168,19]]}}}],["repo_to_be_edited/${repo.label",{"_index":680,"t":{"100":{"position":[[1450,34]]}}}],["repodir",{"_index":679,"t":{"100":{"position":[[1440,7],[1562,12],[1757,10]]}}}],["repodir}/${repo.sourc",{"_index":704,"t":{"100":{"position":[[2033,25]]}}}],["repodir}/.git",{"_index":687,"t":{"100":{"position":[[1654,17]]}}}],["report",{"_index":1133,"t":{"175":{"position":[[1145,8]]},"288":{"position":[[344,9]]},"352":{"position":[[2457,8]]},"468":{"position":[[106,8]]},"1012":{"position":[[368,6]]},"1034":{"position":[[1597,6],[5705,6],[8859,6]]},"1155":{"position":[[61,7]]},"1417":{"position":[[105,8]]},"1451":{"position":[[105,8]]},"1710":{"position":[[338,6]]},"1735":{"position":[[338,6]]},"1778":{"position":[[423,6]]},"1855":{"position":[[280,8],[399,8],[518,9]]},"1881":{"position":[[242,8],[419,8],[545,9]]},"1893":{"position":[[788,8]]},"2061":{"position":[[26,6]]}}}],["repos.foreach((repo",{"_index":678,"t":{"100":{"position":[[1408,20]]}}}],["repositori",{"_index":285,"t":{"36":{"position":[[261,10]]},"74":{"position":[[122,10]]},"76":{"position":[[24,10]]},"90":{"position":[[5,10],[67,10]]},"92":{"position":[[41,10],[132,12],[200,10],[280,10]]},"94":{"position":[[151,10]]},"96":{"position":[[169,10]]},"100":{"position":[[65,11],[224,10],[313,12],[531,12],[913,11],[1216,12],[1317,11],[1498,10],[2123,10]]},"114":{"position":[[57,10]]},"118":{"position":[[33,10]]},"131":{"position":[[20,10]]},"133":{"position":[[77,10]]},"158":{"position":[[186,11],[219,11]]},"162":{"position":[[360,10]]},"164":{"position":[[107,12],[608,12],[785,12],[890,12]]},"171":{"position":[[205,11]]},"260":{"position":[[198,12]]},"269":{"position":[[437,12]]},"288":{"position":[[112,10],[199,11]]},"307":{"position":[[0,10],[179,10],[262,10]]},"311":{"position":[[24,11],[71,10],[311,10]]},"313":{"position":[[46,12],[87,10],[159,12],[347,12],[977,11]]},"315":{"position":[[38,10],[353,10]]},"317":{"position":[[43,10],[340,10],[385,11],[510,11]]},"319":{"position":[[951,11],[3404,11],[5691,10],[5787,10],[7643,11]]},"341":{"position":[[179,10],[364,10],[583,10],[731,10]]},"343":{"position":[[146,11]]},"345":{"position":[[1234,10],[1421,13]]},"363":{"position":[[334,11],[1464,11]]},"422":{"position":[[296,10],[1591,10],[2493,12]]},"447":{"position":[[72,10]]},"457":{"position":[[606,11],[1029,11]]},"472":{"position":[[3660,13]]},"495":{"position":[[16,10],[176,11]]},"608":{"position":[[105,10]]},"704":{"position":[[169,10]]},"706":{"position":[[91,11]]},"708":{"position":[[16,10],[489,11]]},"710":{"position":[[29,10]]},"712":{"position":[[106,11],[167,10],[284,10],[740,11]]},"714":{"position":[[36,10]]},"718":{"position":[[59,11],[429,11],[595,10]]},"720":{"position":[[18,10]]},"724":{"position":[[593,10],[680,10],[1533,10]]},"735":{"position":[[289,11],[571,11],[761,11],[903,10],[1184,11],[1515,11],[1604,11]]},"746":{"position":[[2064,11]]},"749":{"position":[[268,11]]},"760":{"position":[[121,10]]},"765":{"position":[[82,11]]},"773":{"position":[[27,11]]},"787":{"position":[[93,11],[109,10]]},"827":{"position":[[340,10]]},"836":{"position":[[815,10]]},"845":{"position":[[243,11]]},"856":{"position":[[324,10],[795,10],[880,10]]},"858":{"position":[[560,11],[739,11]]},"869":{"position":[[64,11],[153,11],[199,10],[260,10],[315,10],[398,10],[499,10],[743,10],[917,10],[1091,10],[1370,11]]},"871":{"position":[[380,10],[1260,11]]},"1010":{"position":[[2443,10],[3016,10]]},"1053":{"position":[[105,10]]},"1096":{"position":[[210,11]]},"1099":{"position":[[283,12],[579,10],[841,10]]},"1101":{"position":[[69,11]]},"1105":{"position":[[132,11]]},"1107":{"position":[[123,10],[176,10],[227,10]]},"1109":{"position":[[191,12],[398,10]]},"1114":{"position":[[7,12]]},"1116":{"position":[[546,13],[750,10],[822,10],[1140,11],[1253,10],[1329,12],[1393,12],[1424,11],[2146,11],[2227,10],[2548,11],[2660,11],[2734,11],[2877,10]]},"1122":{"position":[[21,11]]},"1124":{"position":[[59,11],[388,13]]},"1126":{"position":[[48,13]]},"1130":{"position":[[359,13]]},"1141":{"position":[[176,11],[209,11]]},"1172":{"position":[[46,12]]},"1207":{"position":[[3413,10]]},"1218":{"position":[[150,10],[250,10]]},"1329":{"position":[[170,12],[562,10]]},"1349":{"position":[[190,10]]},"1357":{"position":[[96,12]]},"1368":{"position":[[800,11]]},"1383":{"position":[[170,11]]},"1385":{"position":[[38,12],[85,12]]},"1402":{"position":[[1185,10]]},"1419":{"position":[[96,12]]},"1436":{"position":[[592,13],[686,10]]},"1453":{"position":[[96,12]]},"1469":{"position":[[231,13]]},"1488":{"position":[[850,11]]},"1490":{"position":[[9,12],[65,12]]},"1524":{"position":[[5,10]]},"1588":{"position":[[645,11]]},"1594":{"position":[[138,10],[1237,10]]},"1615":{"position":[[13,10]]},"1626":{"position":[[18,10]]},"1651":{"position":[[8,10]]},"1669":{"position":[[828,13],[1198,11],[1236,10]]},"1671":{"position":[[452,11]]},"1877":{"position":[[43,10]]},"1962":{"position":[[3871,10],[4883,11]]},"1966":{"position":[[3027,11],[3170,12],[3889,12]]}}}],["reposjson",{"_index":665,"t":{"100":{"position":[[1094,9]]}}}],["repres",{"_index":1604,"t":{"249":{"position":[[120,9]]},"251":{"position":[[765,11],[1058,9]]},"601":{"position":[[45,10]]},"775":{"position":[[700,9]]},"1266":{"position":[[5,10],[97,10]]},"2004":{"position":[[1803,10]]},"2047":{"position":[[380,9]]},"2051":{"position":[[175,12]]},"2116":{"position":[[59,9]]},"2133":{"position":[[472,10]]}}}],["represent",{"_index":5773,"t":{"1659":{"position":[[312,14]]},"1998":{"position":[[1407,14]]},"2000":{"position":[[31,14]]},"2004":{"position":[[1066,14]]}}}],["reproduc",{"_index":1733,"t":{"288":{"position":[[718,11]]},"1096":{"position":[[356,13]]},"2004":{"position":[[832,9]]},"2212":{"position":[[213,15]]}}}],["request",{"_index":109,"t":{"18":{"position":[[3,7],[140,7]]},"59":{"position":[[103,9]]},"92":{"position":[[12,7]]},"94":{"position":[[127,7]]},"96":{"position":[[145,7]]},"118":{"position":[[139,8]]},"122":{"position":[[44,7]]},"164":{"position":[[167,7],[262,8],[305,7],[728,7]]},"166":{"position":[[2030,7]]},"171":{"position":[[341,8],[415,7]]},"214":{"position":[[175,7]]},"317":{"position":[[893,7]]},"319":{"position":[[7290,8],[7395,7]]},"323":{"position":[[224,8]]},"329":{"position":[[377,9],[809,8]]},"345":{"position":[[687,10]]},"457":{"position":[[9074,7]]},"565":{"position":[[472,8]]},"749":{"position":[[980,8],[1237,8],[1467,8]]},"1038":{"position":[[646,8]]},"1096":{"position":[[30,8],[134,9],[429,8]]},"1116":{"position":[[455,7]]},"1262":{"position":[[4324,7]]},"1541":{"position":[[184,7]]},"1594":{"position":[[98,7],[199,7],[965,7],[1197,7],[1298,7],[1595,7]]},"1596":{"position":[[371,9]]},"1644":{"position":[[136,7],[188,7],[239,7],[333,7],[386,7]]},"1671":{"position":[[531,8],[983,7]]},"1692":{"position":[[339,9]]},"1708":{"position":[[301,7],[1069,9],[1399,7]]},"1729":{"position":[[411,9]]},"1751":{"position":[[301,7],[1403,7]]},"1774":{"position":[[411,9]]},"1792":{"position":[[301,7],[1096,9],[1426,7]]},"1891":{"position":[[2882,9]]},"1899":{"position":[[671,7]]},"1930":{"position":[[89,7]]},"1941":{"position":[[22,7]]},"2028":{"position":[[1771,9],[3305,8]]},"2058":{"position":[[645,8],[902,8],[1132,8]]},"2103":{"position":[[132,8]]},"2108":{"position":[[49,7],[162,8]]},"2110":{"position":[[62,7],[250,8],[324,7],[551,8]]},"2122":{"position":[[15,8],[353,8]]},"2124":{"position":[[20,8],[85,8]]},"2126":{"position":[[8,8]]}}}],["request_method",{"_index":4588,"t":{"1038":{"position":[[1607,15],[2335,15],[2763,15]]}}}],["requestpath",{"_index":5272,"t":{"1298":{"position":[[9969,12]]}}}],["requet",{"_index":4647,"t":{"1096":{"position":[[473,7]]}}}],["requir",{"_index":444,"t":{"68":{"position":[[274,8]]},"106":{"position":[[13,12]]},"108":{"position":[[8,12]]},"142":{"position":[[699,7]]},"164":{"position":[[152,7],[220,7],[351,7],[396,7],[468,9]]},"166":{"position":[[1726,12]]},"173":{"position":[[1237,9]]},"179":{"position":[[589,7]]},"181":{"position":[[696,9],[997,9],[1186,7]]},"183":{"position":[[815,8]]},"185":{"position":[[30,7],[303,8],[1403,7]]},"187":{"position":[[194,7]]},"193":{"position":[[382,8]]},"212":{"position":[[16,8]]},"290":{"position":[[119,10]]},"302":{"position":[[277,7]]},"319":{"position":[[1481,8]]},"329":{"position":[[1560,8]]},"345":{"position":[[151,8]]},"348":{"position":[[363,12]]},"360":{"position":[[64,7],[180,12]]},"383":{"position":[[224,8]]},"397":{"position":[[63,8]]},"418":{"position":[[394,8]]},"424":{"position":[[12,8],[559,12]]},"447":{"position":[[353,13]]},"453":{"position":[[615,7]]},"457":{"position":[[350,8],[7560,7],[8200,8]]},"468":{"position":[[1455,12]]},"484":{"position":[[444,12]]},"535":{"position":[[62,8]]},"571":{"position":[[410,8]]},"589":{"position":[[118,8]]},"622":{"position":[[40,8],[372,8],[1037,8]]},"624":{"position":[[66,9]]},"706":{"position":[[18,8]]},"718":{"position":[[663,9]]},"739":{"position":[[91,9]]},"758":{"position":[[964,8]]},"763":{"position":[[1610,8]]},"767":{"position":[[1213,8],[1304,8]]},"769":{"position":[[23,8]]},"771":{"position":[[23,8]]},"780":{"position":[[18,8]]},"823":{"position":[[78,8]]},"829":{"position":[[67,13]]},"836":{"position":[[1115,8]]},"852":{"position":[[746,8]]},"860":{"position":[[1865,8]]},"873":{"position":[[256,9]]},"875":{"position":[[53,8]]},"960":{"position":[[314,10]]},"999":{"position":[[0,9]]},"1010":{"position":[[29,12],[762,9],[904,9]]},"1065":{"position":[[40,8],[372,8],[1037,8]]},"1067":{"position":[[66,9]]},"1096":{"position":[[244,12]]},"1101":{"position":[[3,9]]},"1122":{"position":[[145,12],[202,12],[257,12],[396,12],[1005,8]]},"1165":{"position":[[66,8]]},"1168":{"position":[[390,9],[2113,8]]},"1189":{"position":[[229,8]]},"1209":{"position":[[268,8]]},"1262":{"position":[[1784,8]]},"1270":{"position":[[450,13]]},"1274":{"position":[[141,7]]},"1365":{"position":[[591,9]]},"1383":{"position":[[216,8]]},"1387":{"position":[[78,7]]},"1400":{"position":[[814,12]]},"1439":{"position":[[102,7]]},"1488":{"position":[[352,12],[423,12]]},"1543":{"position":[[480,8]]},"1547":{"position":[[33,13]]},"1557":{"position":[[212,13]]},"1565":{"position":[[421,12]]},"1567":{"position":[[31,12]]},"1575":{"position":[[46,8]]},"1582":{"position":[[34,11]]},"1588":{"position":[[1543,11],[1572,8],[1636,8],[1707,8],[1765,8],[1892,8],[2025,8]]},"1594":{"position":[[935,9]]},"1605":{"position":[[48,7],[102,7]]},"1610":{"position":[[1018,8],[1352,7]]},"1617":{"position":[[130,8]]},"1663":{"position":[[33,8]]},"1667":{"position":[[852,13],[982,8],[1033,12]]},"1696":{"position":[[554,7]]},"1712":{"position":[[513,12]]},"1743":{"position":[[554,7]]},"1774":{"position":[[748,12]]},"1784":{"position":[[567,7]]},"1803":{"position":[[64,12]]},"1807":{"position":[[839,9]]},"1816":{"position":[[12,7],[460,7],[674,8],[764,8],[1500,8]]},"1837":{"position":[[199,11]]},"1843":{"position":[[210,12]]},"1859":{"position":[[450,11]]},"1877":{"position":[[378,8]]},"1886":{"position":[[180,11]]},"1888":{"position":[[1733,12],[1838,8]]},"1891":{"position":[[812,12],[1319,7],[1652,8],[3268,8]]},"1897":{"position":[[306,12]]},"1899":{"position":[[147,12],[340,12],[492,13]]},"1901":{"position":[[168,13],[226,12],[244,7]]},"1912":{"position":[[89,8]]},"1941":{"position":[[149,12]]},"1945":{"position":[[175,8]]},"1958":{"position":[[448,12],[549,12],[790,12]]},"1960":{"position":[[155,8],[535,12]]},"1964":{"position":[[157,12],[406,8],[561,8],[2288,8]]},"1966":{"position":[[869,8],[1001,12],[1058,8],[1356,12]]},"1975":{"position":[[1365,10],[1643,12],[1902,7]]},"1977":{"position":[[13,7],[160,8],[778,8],[1016,8],[2686,12]]},"1979":{"position":[[419,8],[640,12],[821,11],[1410,8],[1478,12]]},"1988":{"position":[[307,12],[1541,9]]},"1990":{"position":[[56,13],[941,7]]},"1994":{"position":[[139,8],[224,8]]},"1998":{"position":[[1090,7],[1231,7]]},"2002":{"position":[[553,12]]},"2004":{"position":[[63,13],[1242,13]]},"2015":{"position":[[29,11]]},"2024":{"position":[[718,12]]},"2026":{"position":[[281,11]]},"2039":{"position":[[229,8]]},"2058":{"position":[[5997,12]]},"2088":{"position":[[434,12]]},"2092":{"position":[[347,12]]},"2094":{"position":[[3512,12]]},"2101":{"position":[[34,11]]},"2110":{"position":[[31,9]]},"2126":{"position":[[185,7]]},"2135":{"position":[[245,12],[330,9]]},"2137":{"position":[[14,12]]},"2139":{"position":[[115,12]]},"2141":{"position":[[62,13]]},"2164":{"position":[[233,12]]},"2166":{"position":[[14,12]]},"2206":{"position":[[237,8]]},"2216":{"position":[[245,12]]}}}],["require(\"child_process",{"_index":661,"t":{"100":{"position":[[983,25]]}}}],["require(\"f",{"_index":659,"t":{"100":{"position":[[947,14]]}}}],["required_packag",{"_index":3303,"t":{"674":{"position":[[178,18]]}}}],["required_packages_default",{"_index":3299,"t":{"674":{"position":[[98,26],[201,25]]}}}],["required_packages_distribut",{"_index":3304,"t":{"674":{"position":[[255,30]]},"677":{"position":[[36,30],[93,31]]}}}],["required_packages_extra",{"_index":3302,"t":{"674":{"position":[[150,24],[229,23]]}}}],["requirements.md",{"_index":5785,"t":{"1667":{"position":[[290,15]]}}}],["requirements.txt",{"_index":3377,"t":{"708":{"position":[[143,16],[172,16],[567,16]]}}}],["requirements.yml",{"_index":922,"t":{"154":{"position":[[748,17]]},"156":{"position":[[118,16]]},"1124":{"position":[[93,18]]}}}],["requirements:cloud",{"_index":1653,"t":{"265":{"position":[[845,18]]},"267":{"position":[[299,18]]}}}],["reschedul",{"_index":1975,"t":{"325":{"position":[[312,11]]}}}],["research",{"_index":5734,"t":{"1619":{"position":[[470,8]]},"1968":{"position":[[13,8]]},"2088":{"position":[[564,8]]},"2141":{"position":[[29,9]]},"2202":{"position":[[438,10]]}}}],["reserv",{"_index":1407,"t":{"202":{"position":[[147,12],[192,7],[250,12]]},"204":{"position":[[72,7]]},"206":{"position":[[310,12]]},"212":{"position":[[494,12],[559,7]]},"214":{"position":[[200,11]]},"227":{"position":[[153,13]]},"573":{"position":[[499,8]]},"704":{"position":[[67,8]]}}}],["reset",{"_index":3090,"t":{"626":{"position":[[566,5]]},"632":{"position":[[782,5]]},"634":{"position":[[778,5]]},"1069":{"position":[[566,5]]},"1075":{"position":[[782,5]]},"1077":{"position":[[778,5]]},"1184":{"position":[[29,5]]}}}],["reshard",{"_index":4250,"t":{"985":{"position":[[809,10]]}}}],["resid",{"_index":639,"t":{"100":{"position":[[204,6]]},"1010":{"position":[[2097,8],[2225,8]]},"1926":{"position":[[217,6],[441,8],[619,8],[1022,8]]},"2058":{"position":[[7301,6]]}}}],["resist",{"_index":6544,"t":{"1977":{"position":[[381,9]]}}}],["resolv",{"_index":2360,"t":{"420":{"position":[[4462,8]]},"724":{"position":[[775,9],[863,9]]},"1486":{"position":[[31,9]]},"1626":{"position":[[270,7]]},"2028":{"position":[[5968,7]]}}}],["resolvconf_fil",{"_index":895,"t":{"152":{"position":[[367,15]]},"1139":{"position":[[182,15]]}}}],["resourc",{"_index":106,"t":{"16":{"position":[[66,9]]},"21":{"position":[[32,9]]},"164":{"position":[[928,9]]},"319":{"position":[[1846,10]]},"321":{"position":[[195,9]]},"379":{"position":[[118,9],[245,9]]},"381":{"position":[[132,9],[420,9]]},"383":{"position":[[98,9]]},"399":{"position":[[65,8],[135,8]]},"401":{"position":[[65,8],[137,8]]},"409":{"position":[[33,9]]},"416":{"position":[[189,9]]},"420":{"position":[[1830,10],[2011,10]]},"455":{"position":[[175,9]]},"470":{"position":[[3241,10]]},"495":{"position":[[892,9],[1032,10]]},"521":{"position":[[129,9]]},"539":{"position":[[77,9]]},"541":{"position":[[64,10]]},"547":{"position":[[142,9]]},"563":{"position":[[408,10],[555,9]]},"729":{"position":[[1074,9],[1446,9],[1772,9]]},"780":{"position":[[96,8]]},"829":{"position":[[89,8]]},"1130":{"position":[[33,9]]},"1262":{"position":[[126,9],[291,9],[405,9],[898,9],[949,8],[2962,8],[3227,9],[4012,9]]},"1280":{"position":[[545,8],[1414,9]]},"1308":{"position":[[111,9]]},"1314":{"position":[[1245,9]]},"1471":{"position":[[280,8]]},"1553":{"position":[[232,10]]},"1565":{"position":[[317,9]]},"1573":{"position":[[345,10]]},"1640":{"position":[[474,8]]},"1888":{"position":[[904,9]]},"1964":{"position":[[2095,8]]},"1975":{"position":[[1747,8]]},"1988":{"position":[[181,8],[353,8]]},"1998":{"position":[[658,9]]},"2000":{"position":[[280,8]]},"2002":{"position":[[334,8]]},"2004":{"position":[[1022,8]]},"2022":{"position":[[1349,9]]},"2041":{"position":[[407,9]]},"2045":{"position":[[92,9]]},"2049":{"position":[[186,9]]},"2077":{"position":[[969,9]]},"2106":{"position":[[373,10],[602,8],[698,8],[720,9]]},"2110":{"position":[[240,9],[271,8],[339,9]]},"2116":{"position":[[71,8],[87,8]]},"2122":{"position":[[35,10],[84,9],[125,8],[170,8],[261,8]]},"2124":{"position":[[69,9],[126,9]]},"2126":{"position":[[155,9]]},"2131":{"position":[[158,8],[238,8]]},"2133":{"position":[[287,9],[506,9],[550,8],[609,9]]},"2135":{"position":[[45,9]]},"2137":{"position":[[124,9],[299,10],[342,8],[727,10]]},"2139":{"position":[[521,8]]},"2143":{"position":[[81,8]]},"2160":{"position":[[158,8],[238,8]]},"2162":{"position":[[353,9]]},"2164":{"position":[[33,9]]},"2196":{"position":[[229,9],[455,8]]}}}],["resource=.tfvar",{"_index":2194,"t":{"363":{"position":[[1088,20]]},"426":{"position":[[355,19]]},"438":{"position":[[225,18],[537,19]]}}}],["yourcloud>.tfvarsfil",{"_index":2197,"t":{"367":{"position":[[103,23]]}}}],["yourself",{"_index":1481,"t":{"216":{"position":[[83,9]]},"309":{"position":[[42,8],[269,8]]},"610":{"position":[[1418,8]]},"763":{"position":[[668,9],[2031,8]]},"767":{"position":[[676,9]]},"1055":{"position":[[1418,8]]},"1541":{"position":[[225,8]]},"1692":{"position":[[1664,8]]},"1729":{"position":[[1870,8]]},"1774":{"position":[[2011,8]]}}}],["yq",{"_index":2047,"t":{"339":{"position":[[696,3],[1565,3]]},"352":{"position":[[565,2],[787,2],[1006,2]]},"424":{"position":[[698,2],[710,2],[716,2]]},"436":{"position":[[23,2]]},"457":{"position":[[192,3]]},"474":{"position":[[2243,2],[2504,2],[2751,2],[3010,2]]},"486":{"position":[[2041,2]]},"735":{"position":[[1196,2]]},"783":{"position":[[37,2],[73,2]]},"814":{"position":[[32,2],[59,3],[89,2],[125,2]]}}}],["yum",{"_index":6511,"t":{"1964":{"position":[[4318,3]]}}}],["yy.mm",{"_index":4956,"t":{"1209":{"position":[[936,7]]}}}],["yy.mm.x",{"_index":4955,"t":{"1209":{"position":[[911,10]]}}}],["yyi",{"_index":348,"t":{"36":{"position":[[1611,4]]}}}],["yyyi",{"_index":6229,"t":{"1810":{"position":[[3000,4],[3760,4],[3814,4]]},"1814":{"position":[[40,4],[54,4]]},"1816":{"position":[[1674,4]]}}}],["z",{"_index":5905,"t":{"1698":{"position":[[254,1],[904,1],[974,1]]},"1745":{"position":[[241,2],[283,2],[345,1]]},"1786":{"position":[[305,1],[566,1]]}}}],["z3",{"_index":5885,"t":{"1692":{"position":[[1296,2],[1366,2],[1424,2],[1574,2],[1737,2]]},"1698":{"position":[[919,2],[993,2],[1013,2]]}}}],["z3h",{"_index":5890,"t":{"1692":{"position":[[1591,3]]},"1694":{"position":[[303,3]]},"1698":{"position":[[935,3],[1033,3]]}}}],["z3hh",{"_index":5927,"t":{"1698":{"position":[[952,4],[1054,4]]}}}],["zabbix",{"_index":5530,"t":{"1443":{"position":[[90,6]]}}}],["zed",{"_index":1699,"t":{"280":{"position":[[126,4]]},"805":{"position":[[83,3],[119,3]]},"819":{"position":[[213,3]]},"1365":{"position":[[10,3]]}}}],["zed.yml",{"_index":4695,"t":{"1114":{"position":[[844,7],[879,7]]}}}],["zen",{"_index":5908,"t":{"1698":{"position":[[310,3],[343,3],[393,3],[440,3],[479,3]]},"1745":{"position":[[294,5],[401,3],[434,3],[484,3],[531,3],[586,3]]},"1786":{"position":[[311,5],[622,3],[655,3],[705,3],[752,3],[807,3],[1134,3],[1152,3]]}}}],["zero",{"_index":2193,"t":{"363":{"position":[[1045,4]]},"1161":{"position":[[3911,4]]},"1588":{"position":[[1016,4]]},"1610":{"position":[[207,4]]},"1855":{"position":[[458,4]]},"1881":{"position":[[478,4]]}}}],["zeromq",{"_index":3006,"t":{"583":{"position":[[205,6],[624,6]]}}}],["zip",{"_index":2449,"t":{"449":{"position":[[826,4]]}}}],["zitadel",{"_index":5032,"t":{"1280":{"position":[[1035,9]]},"2028":{"position":[[3079,8],[3088,7],[3208,8],[3443,7],[3720,7],[5004,7],[5366,7],[5400,7],[5656,7],[5709,7],[6009,7]]},"2030":{"position":[[54,8]]}}}],["zone",{"_index":2909,"t":{"502":{"position":[[179,5],[283,5]]},"561":{"position":[[70,5],[257,4],[372,5]]},"563":{"position":[[16,4],[164,4],[315,6],[458,4]]},"565":{"position":[[606,5],[684,5],[703,5],[895,5],[941,4],[1025,5],[1081,4]]},"569":{"position":[[115,5]]},"843":{"position":[[299,4]]},"1047":{"position":[[182,4],[1666,4]]},"1353":{"position":[[501,5]]},"1932":{"position":[[1096,6],[1116,5]]},"1977":{"position":[[2393,5],[2497,5]]},"1979":{"position":[[970,5]]},"2011":{"position":[[413,6]]},"2013":{"position":[[653,5],[912,4],[1070,5],[1095,4],[1228,5]]},"2015":{"position":[[669,6],[714,5],[756,5],[823,6],[902,6],[1148,7]]}}}],["zone(",{"_index":2261,"t":{"418":{"position":[[718,7]]}}}],["zuul",{"_index":191,"t":{"25":{"position":[[811,4],[828,4],[859,4]]},"27":{"position":[[1845,4],[1861,4]]},"74":{"position":[[198,4]]},"76":{"position":[[5,4]]},"78":{"position":[[0,4]]},"307":{"position":[[27,4],[77,4],[156,4],[287,5]]},"309":{"position":[[25,4],[143,5],[435,5]]},"311":{"position":[[91,4],[119,5],[226,4],[289,4]]},"313":{"position":[[0,4],[64,4],[270,4],[298,4],[948,4]]},"315":{"position":[[3,4],[287,4],[421,5],[539,4]]},"317":{"position":[[6,4],[807,5],[840,5]]},"319":{"position":[[19,4],[263,4],[724,5],[1261,4],[3392,4],[3793,5],[3816,4],[3939,4],[4057,4],[4153,4],[4167,4],[5487,4]]},"333":{"position":[[42,4],[243,4],[350,4],[446,4],[515,4],[561,4],[585,4],[640,4],[714,4],[879,4]]},"335":{"position":[[4,4],[138,4],[227,4]]},"337":{"position":[[30,4]]},"339":{"position":[[23,4],[368,4],[412,4],[1243,4],[1287,4]]},"341":{"position":[[414,4],[441,4],[642,4],[666,4],[762,4],[794,4],[808,4]]},"1116":{"position":[[2115,4]]},"1128":{"position":[[7,4],[31,4]]},"1130":{"position":[[81,4],[321,4]]},"1165":{"position":[[12,4],[138,4],[278,4]]},"1168":{"position":[[252,4],[461,4],[542,4],[892,5],[953,5],[1090,5],[1270,5],[1413,4],[1633,5],[1793,4],[1838,4],[1857,4],[1899,4]]},"1170":{"position":[[387,4],[484,4],[653,4],[881,4],[1019,4]]},"1172":{"position":[[13,4],[687,4]]},"1174":{"position":[[48,4],[373,4],[493,4],[585,4],[601,4],[1156,4],[1274,4],[1364,4]]},"1329":{"position":[[88,4],[338,4],[545,4]]},"1436":{"position":[[386,4],[478,4]]},"1475":{"position":[[52,4]]}}}],["zuul'",{"_index":1807,"t":{"311":{"position":[[145,6]]}}}],["zuul.*.priv",{"_index":4859,"t":{"1172":{"position":[[533,14]]}}}],["zuul.d",{"_index":1811,"t":{"313":{"position":[[429,9],[520,10]]}}}],["zuul.example.com",{"_index":4868,"t":{"1174":{"position":[[60,16],[1189,16]]}}}],["zuul.pem",{"_index":4862,"t":{"1172":{"position":[[573,8]]}}}],["zuul.scs.commun",{"_index":5566,"t":{"1475":{"position":[[0,18]]}}}],["zuul.services.betacloud.xyz",{"_index":4734,"t":{"1128":{"position":[[64,28]]}}}],["zuul.yaml",{"_index":525,"t":{"76":{"position":[[62,10]]},"313":{"position":[[366,11],[402,12],[841,10]]},"319":{"position":[[6471,9],[6489,9]]},"335":{"position":[[34,10],[420,10]]}}}],["zuul/zuul",{"_index":1868,"t":{"319":{"position":[[730,9]]},"1174":{"position":[[931,9]]}}}],["zuul01",{"_index":4819,"t":{"1168":{"position":[[774,6]]}}}],["zuul01.servic",{"_index":4817,"t":{"1168":{"position":[[727,19]]}}}],["zuul_auth_secret",{"_index":4842,"t":{"1170":{"position":[[353,17]]}}}],["zuul_config",{"_index":2061,"t":{"343":{"position":[[366,14]]}}}],["zuul_connect",{"_index":4877,"t":{"1174":{"position":[[612,17]]}}}],["zuul_domain",{"_index":4814,"t":{"1168":{"position":[[689,12],[747,11]]}}}],["zuul_fqdn",{"_index":4816,"t":{"1168":{"position":[[716,10]]}}}],["zuul_host",{"_index":4818,"t":{"1168":{"position":[[763,10],[1550,9],[1659,9]]}}}],["zuul_logserver_fqdn",{"_index":4853,"t":{"1170":{"position":[[1253,20]]}}}],["zuul_serv",{"_index":4828,"t":{"1168":{"position":[[1683,11]]}}}],["zuul_server.openstack.accessipv4",{"_index":4830,"t":{"1168":{"position":[[1748,32]]}}}],["zuul_ten",{"_index":4885,"t":{"1174":{"position":[[844,13]]}}}],["zuul_url",{"_index":1898,"t":{"319":{"position":[[4176,8]]}}}],["zuul_us",{"_index":4832,"t":{"1168":{"position":[[1888,10],[2421,9],[2497,9],[2550,9],[2606,9]]}}}],["zuul_webserver_fqdn",{"_index":4852,"t":{"1170":{"position":[[1229,19]]}}}],["zypper",{"_index":303,"t":{"36":{"position":[[603,6]]}}}]],"pipeline":["stemmer"]}}] \ No newline at end of file diff --git a/search/index.html b/search/index.html new file mode 100644 index 0000000000..7ba685f2fe --- /dev/null +++ b/search/index.html @@ -0,0 +1,26 @@ + + + + + +Search the documentation + + + + + + + + + + + + + + +
+

Search the documentation

+ + + + \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 0000000000..91efd970cf --- /dev/null +++ b/sitemap.xml @@ -0,0 +1 @@ +https://docs.scs.community/blogweekly0.5https://docs.scs.community/blog/archiveweekly0.5https://docs.scs.community/blog/first-blog-postweekly0.5https://docs.scs.community/blog/tagsweekly0.5https://docs.scs.community/blog/tags/communityweekly0.5https://docs.scs.community/blog/tags/howtoweekly0.5https://docs.scs.community/searchweekly0.5https://docs.scs.community/community/weekly0.5https://docs.scs.community/community/calendarweekly0.5https://docs.scs.community/community/category/contributeweekly0.5https://docs.scs.community/community/cloud-resources/weekly0.5https://docs.scs.community/community/cloud-resources/getting-started-openstackweekly0.5https://docs.scs.community/community/cloud-resources/plusserver-gx-scsweekly0.5https://docs.scs.community/community/cloud-resources/wavestackweekly0.5https://docs.scs.community/community/collaborationweekly0.5https://docs.scs.community/community/communication/jitsiweekly0.5https://docs.scs.community/community/communication/mailinglistsweekly0.5https://docs.scs.community/community/communication/matrixweekly0.5https://docs.scs.community/community/contribute/adding-docs-guideweekly0.5https://docs.scs.community/community/contribute/doc-files-structure-guideweekly0.5https://docs.scs.community/community/contribute/docs-workflow-explanationweekly0.5https://docs.scs.community/community/contribute/linting-guideweekly0.5https://docs.scs.community/community/contribute/local-docusaurus-development-guideweekly0.5https://docs.scs.community/community/contribute/styleguideweekly0.5https://docs.scs.community/community/contribute/styleguides/ansible_styleguideweekly0.5https://docs.scs.community/community/github/branchprotectionweekly0.5https://docs.scs.community/community/github/dco-and-licensesweekly0.5https://docs.scs.community/community/github/tips-and-tricksweekly0.5https://docs.scs.community/community/hackathons/checklistweekly0.5https://docs.scs.community/community/license-considerationsweekly0.5https://docs.scs.community/dev-docs/weekly0.5https://docs.scs.community/dev-docs/operations/iam/identity-federation-in-scsweekly0.5https://docs.scs.community/dev-docs/operations/iam/openstack-federation-via-oidcweekly0.5https://docs.scs.community/dev-docs/operations/operations/zuul-ci-cd-quickstart-user-guideweekly0.5https://docs.scs.community/docs/weekly0.5https://docs.scs.community/docs/category/componentsweekly0.5https://docs.scs.community/docs/category/components-1weekly0.5https://docs.scs.community/docs/category/components-2weekly0.5https://docs.scs.community/docs/category/iaas-layerweekly0.5https://docs.scs.community/docs/category/identity-and-access-management-iamweekly0.5https://docs.scs.community/docs/category/k8s-cluster-api-providerweekly0.5https://docs.scs.community/docs/category/meteringweekly0.5https://docs.scs.community/docs/category/operating-scsweekly0.5https://docs.scs.community/docs/category/releasesweekly0.5https://docs.scs.community/docs/category/status-page-apiweekly0.5https://docs.scs.community/docs/container/weekly0.5https://docs.scs.community/docs/container/components/k8s-cluster-api-provider/doc/application-credentialsweekly0.5https://docs.scs.community/docs/container/components/k8s-cluster-api-provider/doc/configurationweekly0.5https://docs.scs.community/docs/container/components/k8s-cluster-api-provider/doc/continuous-integrationweekly0.5https://docs.scs.community/docs/container/components/k8s-cluster-api-provider/doc/LoadBalancer-ExtTrafficLocalweekly0.5https://docs.scs.community/docs/container/components/k8s-cluster-api-provider/doc/Maintenance_and_Troubleshootingweekly0.5https://docs.scs.community/docs/container/components/k8s-cluster-api-provider/doc/make-referenceweekly0.5https://docs.scs.community/docs/container/components/k8s-cluster-api-provider/doc/overviewweekly0.5https://docs.scs.community/docs/container/components/k8s-cluster-api-provider/doc/quickstartweekly0.5https://docs.scs.community/docs/container/components/k8s-cluster-api-provider/doc/requirementsweekly0.5https://docs.scs.community/docs/container/components/k8s-cluster-api-provider/doc/roadmapweekly0.5https://docs.scs.community/docs/container/components/k8s-cluster-api-provider/doc/Upgrade-Guideweekly0.5https://docs.scs.community/docs/container/components/k8s-cluster-api-provider/doc/usage/weekly0.5https://docs.scs.community/docs/container/components/k8s-cluster-api-provider/doc/usage/cluster-mgmt-capi-mgmt-nodeweekly0.5https://docs.scs.community/docs/container/components/k8s-cluster-api-provider/doc/usage/containter-registry-configurationweekly0.5https://docs.scs.community/docs/container/components/k8s-cluster-api-provider/doc/usage/create-new-clusterweekly0.5https://docs.scs.community/docs/container/components/k8s-cluster-api-provider/doc/usage/custom-caweekly0.5https://docs.scs.community/docs/container/components/k8s-cluster-api-provider/doc/usage/gateway-apiweekly0.5https://docs.scs.community/docs/container/components/k8s-cluster-api-provider/doc/usage/harborweekly0.5https://docs.scs.community/docs/container/components/k8s-cluster-api-provider/doc/usage/managing-many-clustersweekly0.5https://docs.scs.community/docs/container/components/k8s-cluster-api-provider/doc/usage/migrate-to-cluster-classweekly0.5https://docs.scs.community/docs/container/components/k8s-cluster-api-provider/doc/usage/multi-az-and-multi-cloud-environmentsweekly0.5https://docs.scs.community/docs/container/components/k8s-cluster-api-provider/doc/usage/testingweekly0.5https://docs.scs.community/docs/container/deployment-examples/a/weekly0.5https://docs.scs.community/docs/container/deployment-examples/a/hardwareweekly0.5https://docs.scs.community/docs/container/deployment-examples/a/softwareweekly0.5https://docs.scs.community/docs/container/guides/guide1weekly0.5https://docs.scs.community/docs/container/overview/architectureweekly0.5https://docs.scs.community/docs/container/overview/knowledgeweekly0.5https://docs.scs.community/docs/faq/weekly0.5https://docs.scs.community/docs/getting-started/containerizationweekly0.5https://docs.scs.community/docs/getting-started/overviewweekly0.5https://docs.scs.community/docs/getting-started/virtualizationweekly0.5https://docs.scs.community/docs/glossaryweekly0.5https://docs.scs.community/docs/iaas/components/weekly0.5https://docs.scs.community/docs/iaas/components/flavor-managerweekly0.5https://docs.scs.community/docs/iaas/components/image-managerweekly0.5https://docs.scs.community/docs/iaas/components/project-managerweekly0.5https://docs.scs.community/docs/iaas/components/resource-managerweekly0.5https://docs.scs.community/docs/iaas/components/sandbox-managerweekly0.5https://docs.scs.community/docs/iaas/guides/weekly0.5https://docs.scs.community/docs/iaas/guides/configuration-guide/weekly0.5https://docs.scs.community/docs/iaas/guides/configuration-guide/cephweekly0.5https://docs.scs.community/docs/iaas/guides/configuration-guide/commons/weekly0.5https://docs.scs.community/docs/iaas/guides/configuration-guide/commons/networkweekly0.5https://docs.scs.community/docs/iaas/guides/configuration-guide/commons/packagesweekly0.5https://docs.scs.community/docs/iaas/guides/configuration-guide/commons/servicesweekly0.5https://docs.scs.community/docs/iaas/guides/configuration-guide/commons/sshconfigweekly0.5https://docs.scs.community/docs/iaas/guides/configuration-guide/commons/sysctlweekly0.5https://docs.scs.community/docs/iaas/guides/configuration-guide/commons/timezoneweekly0.5https://docs.scs.community/docs/iaas/guides/configuration-guide/configuration-repositoryweekly0.5https://docs.scs.community/docs/iaas/guides/configuration-guide/inventoryweekly0.5https://docs.scs.community/docs/iaas/guides/configuration-guide/managerweekly0.5https://docs.scs.community/docs/iaas/guides/configuration-guide/openstack/weekly0.5https://docs.scs.community/docs/iaas/guides/configuration-guide/openstack/horizonweekly0.5https://docs.scs.community/docs/iaas/guides/configuration-guide/openstack/keystoneweekly0.5https://docs.scs.community/docs/iaas/guides/configuration-guide/proxyweekly0.5https://docs.scs.community/docs/iaas/guides/configuration-guide/self-signed-certificatesweekly0.5https://docs.scs.community/docs/iaas/guides/configuration-guide/services/weekly0.5https://docs.scs.community/docs/iaas/guides/deploy-guide/weekly0.5https://docs.scs.community/docs/iaas/guides/deploy-guide/bootstrapweekly0.5https://docs.scs.community/docs/iaas/guides/deploy-guide/examples/weekly0.5https://docs.scs.community/docs/iaas/guides/deploy-guide/examples/cloud-in-a-boxweekly0.5https://docs.scs.community/docs/iaas/guides/deploy-guide/examples/testbedweekly0.5https://docs.scs.community/docs/iaas/guides/deploy-guide/managerweekly0.5https://docs.scs.community/docs/iaas/guides/deploy-guide/provisioningweekly0.5https://docs.scs.community/docs/iaas/guides/deploy-guide/seedweekly0.5https://docs.scs.community/docs/iaas/guides/deploy-guide/services/weekly0.5https://docs.scs.community/docs/iaas/guides/deploy-guide/services/cephweekly0.5https://docs.scs.community/docs/iaas/guides/deploy-guide/services/infrastructureweekly0.5https://docs.scs.community/docs/iaas/guides/deploy-guide/services/logging-monitoringweekly0.5https://docs.scs.community/docs/iaas/guides/deploy-guide/services/networkweekly0.5https://docs.scs.community/docs/iaas/guides/deploy-guide/services/openstackweekly0.5https://docs.scs.community/docs/iaas/guides/operations-guide/weekly0.5https://docs.scs.community/docs/iaas/guides/operations-guide/cephweekly0.5https://docs.scs.community/docs/iaas/guides/operations-guide/manager/weekly0.5https://docs.scs.community/docs/iaas/guides/operations-guide/manager/applyweekly0.5https://docs.scs.community/docs/iaas/guides/operations-guide/manager/consoleweekly0.5https://docs.scs.community/docs/iaas/guides/operations-guide/manager/logweekly0.5https://docs.scs.community/docs/iaas/guides/operations-guide/manager/taskweekly0.5https://docs.scs.community/docs/iaas/guides/operations-guide/openstack/weekly0.5https://docs.scs.community/docs/iaas/guides/operations-guide/openstack/cinderweekly0.5https://docs.scs.community/docs/iaas/guides/operations-guide/openstack/day2-operations/weekly0.5https://docs.scs.community/docs/iaas/guides/operations-guide/openstack/day2-operations/flavor-managerweekly0.5https://docs.scs.community/docs/iaas/guides/operations-guide/openstack/day2-operations/image-managerweekly0.5https://docs.scs.community/docs/iaas/guides/operations-guide/openstack/day2-operations/project-managerweekly0.5https://docs.scs.community/docs/iaas/guides/operations-guide/openstack/day2-operations/resource-managerweekly0.5https://docs.scs.community/docs/iaas/guides/operations-guide/openstack/day2-operations/sandbox-managerweekly0.5https://docs.scs.community/docs/iaas/guides/operations-guide/openstack/octaviaweekly0.5https://docs.scs.community/docs/iaas/guides/other-guides/weekly0.5https://docs.scs.community/docs/iaas/guides/other-guides/contributor-guideweekly0.5https://docs.scs.community/docs/iaas/guides/other-guides/developer-guide/weekly0.5https://docs.scs.community/docs/iaas/guides/other-guides/developer-guide/releasesweekly0.5https://docs.scs.community/docs/iaas/guides/other-guides/developer-guide/scriptsweekly0.5https://docs.scs.community/docs/iaas/guides/other-guides/developer-guide/zuul-ciweekly0.5https://docs.scs.community/docs/iaas/guides/other-guides/style-guideweekly0.5https://docs.scs.community/docs/iaas/guides/other-guides/zuulweekly0.5https://docs.scs.community/docs/iaas/guides/troubleshooting-guide/weekly0.5https://docs.scs.community/docs/iaas/guides/troubleshooting-guide/managerweekly0.5https://docs.scs.community/docs/iaas/guides/troubleshooting-guide/openstackweekly0.5https://docs.scs.community/docs/iaas/guides/upgrade-guide/weekly0.5https://docs.scs.community/docs/iaas/guides/upgrade-guide/cephweekly0.5https://docs.scs.community/docs/iaas/guides/upgrade-guide/dockerweekly0.5https://docs.scs.community/docs/iaas/guides/upgrade-guide/infrastructureweekly0.5https://docs.scs.community/docs/iaas/guides/upgrade-guide/logging-monitoringweekly0.5https://docs.scs.community/docs/iaas/guides/upgrade-guide/managerweekly0.5https://docs.scs.community/docs/iaas/guides/upgrade-guide/networkweekly0.5https://docs.scs.community/docs/iaas/guides/upgrade-guide/openstackweekly0.5https://docs.scs.community/docs/iaas/overview/architectureweekly0.5https://docs.scs.community/docs/iaas/overview/computeweekly0.5https://docs.scs.community/docs/iaas/overview/knowledgeweekly0.5https://docs.scs.community/docs/iaas/overview/networkweekly0.5https://docs.scs.community/docs/iaas/overview/storageweekly0.5https://docs.scs.community/docs/iam/intra-SCS-federation-setup-description-for-osism-doc-operationsweekly0.5https://docs.scs.community/docs/operating-scs/audits/weekly0.5https://docs.scs.community/docs/operating-scs/components/status-page/docs/component_overviewweekly0.5https://docs.scs.community/docs/operating-scs/components/status-page/docs/componentsweekly0.5https://docs.scs.community/docs/operating-scs/components/status-page/docs/levels_of_consensusweekly0.5https://docs.scs.community/docs/operating-scs/components/status-page/docs/overviewweekly0.5https://docs.scs.community/docs/operating-scs/guides/guide-1weekly0.5https://docs.scs.community/docs/operating-scs/incident-management/weekly0.5https://docs.scs.community/docs/operating-scs/lifecycle-management/weekly0.5https://docs.scs.community/docs/operating-scs/logging/weekly0.5https://docs.scs.community/docs/operating-scs/metering/meter_configurationweekly0.5https://docs.scs.community/docs/operating-scs/monitoring/weekly0.5https://docs.scs.community/docs/operating-scs/overviewweekly0.5https://docs.scs.community/docs/releases/Release0weekly0.5https://docs.scs.community/docs/releases/Release1weekly0.5https://docs.scs.community/docs/releases/Release2weekly0.5https://docs.scs.community/docs/releases/Release3weekly0.5https://docs.scs.community/docs/releases/Release4weekly0.5https://docs.scs.community/docs/releases/Release5weekly0.5https://docs.scs.community/docs/releases/ReleaseXweekly0.5https://docs.scs.community/docs/standards/weekly0.5https://docs.scs.community/standards/weekly0.5https://docs.scs.community/standards/certification/certified-cloudsweekly0.5https://docs.scs.community/standards/certification/get-certifiedweekly0.5https://docs.scs.community/standards/certification/overviewweekly0.5https://docs.scs.community/standards/certification/subjects-versionsweekly0.5https://docs.scs.community/standards/decision-recordsweekly0.5https://docs.scs.community/standards/global/weekly0.5https://docs.scs.community/standards/global/scs-0001weekly0.5https://docs.scs.community/standards/global/scs-0002weekly0.5https://docs.scs.community/standards/global/scs-0003weekly0.5https://docs.scs.community/standards/iaas/weekly0.5https://docs.scs.community/standards/iaas/scs-0100weekly0.5https://docs.scs.community/standards/iaas/scs-0101weekly0.5https://docs.scs.community/standards/iaas/scs-0102weekly0.5https://docs.scs.community/standards/iaas/scs-0103weekly0.5https://docs.scs.community/standards/iaas/scs-0104weekly0.5https://docs.scs.community/standards/iam/weekly0.5https://docs.scs.community/standards/iam/scs-0300weekly0.5https://docs.scs.community/standards/kaas/weekly0.5https://docs.scs.community/standards/kaas/scs-0210weekly0.5https://docs.scs.community/standards/kaas/scs-0211weekly0.5https://docs.scs.community/standards/ops/weekly0.5https://docs.scs.community/standards/ops/scs-0412weekly0.5https://docs.scs.community/standards/scs-0001-v1-sovereign-cloud-standardsweekly0.5https://docs.scs.community/standards/scs-0002-v1-standards-docs-orgweekly0.5https://docs.scs.community/standards/scs-0002-v2-standards-docs-orgweekly0.5https://docs.scs.community/standards/scs-0003-v1-sovereign-cloud-standards-yamlweekly0.5https://docs.scs.community/standards/scs-0100-v1-flavor-namingweekly0.5https://docs.scs.community/standards/scs-0100-v2-flavor-namingweekly0.5https://docs.scs.community/standards/scs-0100-v3-flavor-namingweekly0.5https://docs.scs.community/standards/scs-0101-v1-entropyweekly0.5https://docs.scs.community/standards/scs-0102-v1-image-metadataweekly0.5https://docs.scs.community/standards/scs-0103-v1-standard-flavorsweekly0.5https://docs.scs.community/standards/scs-0104-v1-standard-imagesweekly0.5https://docs.scs.community/standards/scs-0110weekly0.5https://docs.scs.community/standards/scs-0110-v1-ssd-flavorsweekly0.5https://docs.scs.community/standards/scs-0111-v1-volume-type-decisionsweekly0.5https://docs.scs.community/standards/scs-0210-v1-k8s-new-version-policyweekly0.5https://docs.scs.community/standards/scs-0210-v2-k8s-version-policyweekly0.5https://docs.scs.community/standards/scs-0211-v1-kaas-default-storage-classweekly0.5https://docs.scs.community/standards/scs-0212-v1-requirements-for-container-registryweekly0.5https://docs.scs.community/standards/scs-0213-v1-k8s-nodes-anti-affinityweekly0.5https://docs.scs.community/standards/scs-0213-v1-requirements-for-testing-cluster-stacksweekly0.5https://docs.scs.community/standards/scs-0214-v1-k8s-node-distributionweekly0.5https://docs.scs.community/standards/scs-0300-v1-requirements-for-sso-identity-federationweekly0.5https://docs.scs.community/standards/scs-0301-v1-naming-conventionsweekly0.5https://docs.scs.community/standards/scs-0302-v1-domain-manager-roleweekly0.5https://docs.scs.community/standards/scs-0400-v1-status-page-create-decisionweekly0.5https://docs.scs.community/standards/scs-0401-v1-status-page-reference-implementation-decisionweekly0.5https://docs.scs.community/standards/scs-0402-v1-status-page-openapi-spec-decisionweekly0.5https://docs.scs.community/standards/scs-0410-v1-gnocchi-as-metering-databaseweekly0.5https://docs.scs.community/standards/scs-0411-v1-publishing_method_for_metering_dataweekly0.5https://docs.scs.community/standards/scs-0412-v1-metering-jsonweekly0.5https://docs.scs.community/standards/scs-XXXX-vN-templateweekly0.5https://docs.scs.community/standards/standards/overviewweekly0.5https://docs.scs.community/standards/standards/scs-0111weekly0.5https://docs.scs.community/standards/standards/scs-0212weekly0.5https://docs.scs.community/standards/standards/scs-0213weekly0.5https://docs.scs.community/standards/standards/scs-0301weekly0.5https://docs.scs.community/standards/standards/scs-0400weekly0.5https://docs.scs.community/standards/standards/scs-0401weekly0.5https://docs.scs.community/standards/standards/scs-0402weekly0.5https://docs.scs.community/standards/standards/scs-0410weekly0.5https://docs.scs.community/standards/standards/scs-0411weekly0.5https://docs.scs.community/weekly0.5 \ No newline at end of file diff --git a/standards/certification/certified-clouds/index.html b/standards/certification/certified-clouds/index.html new file mode 100644 index 0000000000..c2ac3728c8 --- /dev/null +++ b/standards/certification/certified-clouds/index.html @@ -0,0 +1,26 @@ + + + + + +Certified Clouds | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Certified Clouds

This is a list of clouds that we test on a nightly basis against our scs-compatible certification level.

NameDescriptionOperatorIaaS Compliance CheckHealthMon
gx-scsDev environment provided for SCS & GAIA-X contextplusserver GmbHGitHub Workflow StatusHM
pluscloud open - prod1Public cloud for customersplusserver GmbHGitHub Workflow StatusHM
pluscloud open - prod2Public cloud for customersplusserver GmbHGitHub Workflow StatusHM
WavestackPublic cloud for customersnoris network AG/Wavecon GmbHGitHub Workflow StatusHM
REGIO.cloudPublic cloud for customersOSISM GmbHGitHub Workflow StatusDashboard

SCS standards overview

Standards are organized as certification levels according to SCS-0003-v1. We currently maintain one certification level scs-compatible that is described here: Tests/scs-compatible.yaml.

More certification levels will follow as the project progresses.

Repo Structure

This repository is organized according to SCS-0002-v1.

Decisions

Decision Records, see Standards/scs-0001-v1-sovereign-cloud-standards.md

Drafts

Old Design-Docs folder with existing Architectural Decision Records (ADRs). This directory is currently in the process of being consolidated and cleaned up. See cleanup step-1 and open questions.

Standards

Official SCS standards, see Standards/scs-0001-v1-sovereign-cloud-standards.md).

Tests

Testsuite and tools for SCS standards, see Tests/README.md.

+ + + + \ No newline at end of file diff --git a/standards/certification/get-certified/index.html b/standards/certification/get-certified/index.html new file mode 100644 index 0000000000..798cd597ac --- /dev/null +++ b/standards/certification/get-certified/index.html @@ -0,0 +1,27 @@ + + + + + +How to get certified | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

How to get certified

  1. (optional) Download the compliance check tool and run it on your environment in order to check that all standards for the certification scope are met.
  2. Contact the SCS project team and request to officially certified.
  3. Prepare yourself to give the SCS project team user access to your cloud environment
  4. The SCS project team will run regular tests (the same as the compliance check tool), in order to check whether all standards compiled in the certification scope are met.
  5. If so, then your environment is listed in the "certified clouds" section on this site.

The above workflow applies at the moment to the certification scope SCS-compatible on IaaS. For more complex standards to be met, which may not be automatically and remotely tested. +For cloud environments, which do not provide public access for various reasons, but do want to accomplish a certification an individual process will provided accordingly.

+ + + + \ No newline at end of file diff --git a/standards/certification/overview/index.html b/standards/certification/overview/index.html new file mode 100644 index 0000000000..5046e3e8e8 --- /dev/null +++ b/standards/certification/overview/index.html @@ -0,0 +1,27 @@ + + + + + +Certification | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Certification

Scopes and versions

SCS provides a certification framework consisting of six different kinds of certificates of varying scope. +These scopes can be sorted into two dimensions:

  1. certification level, of which there are three:
    • SCS-compatible
    • SCS-open
    • SCS-sovereign
  2. cloud layer, of which there are two:
    • infastructure as a service (IaaS)
    • Kubernetes as a service (KaaS)

So, for instance, a certificate can have the scope SCS-compatible IaaS or SCS-sovereign KaaS.

Each scope corresponds to a set of standards. As these standards progress, so do the scopes, and we keep track of this by versioning. Each version undergoes a lifecycle of Draft, Stable, and Deprecated, and we aim to keep at most one version stable at the same time, with the exception of a transition period of 4 to 6 weeks.

Alt text

Becoming certified

In order for a cloud service offering to obtain a certificate, it has to conform to all standards of the respective scope, which will be tested at regular intervals, and the results of these tests will be made available publicly. For more details on how to become certified, please consult the corresponding document.

Compliant cloud environments

This is a list of clouds that we test on a nightly basis against the certificate scope SCS-compatible IaaS.

NameDescriptionOperatorIaaS Compliance CheckHealthMon
gx-scsDev environment provided for SCS & GAIA-X contextplusserver GmbHGitHub Workflow StatusHM
pluscloud open - prod1Public cloud for customersplusserver GmbHGitHub Workflow StatusHM
pluscloud open - prod2Public cloud for customersplusserver GmbHGitHub Workflow StatusHM
WavestackPublic cloud for customersnoris network AG/Wavecon GmbHGitHub Workflow StatusHM
REGIO.cloudPublic cloud for customersOSISM GmbHGitHub Workflow StatusDashboard
+ + + + \ No newline at end of file diff --git a/standards/certification/subjects-versions/index.html b/standards/certification/subjects-versions/index.html new file mode 100644 index 0000000000..5b0db05569 --- /dev/null +++ b/standards/certification/subjects-versions/index.html @@ -0,0 +1,27 @@ + + + + + +Scopes and Versions | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Scopes and Versions

The SCS Certification scopes are discriminated in two dimensions. The first is the technology layer, which is either IaaS (infrastructure) or KaaS (Kubernetes). The second dimension is the level, which refer to the level of sovereignty, which is achieved by the certificate. There are three different levels:

  • SCS compatible
  • SCS open
  • SCS sovereign

Consequently, an SCS user can achieve certificates in six different scopes. +Hence, an SCS certification scope examines all standards required to achieve a certain level for a certain layer, e.g. the "SCS-compatible" level for the IaaS-layer.

Like software states, certification scopes are versioned. To achieve the certificate for a scope all standards, which are part of the current version of this scope must be met. A certification scope version has an expiry date after which the next version of this scope becomes valid. An SCS user must fulfil the standards in the actual certification scope version to stay certified. There is a transition period between two versions, in which both versions are valid as shown in the diagram below. It also shows that each scope has its own versioning cycle independent from all other scopes.

Alt text

+ + + + \ No newline at end of file diff --git a/standards/decision-records/index.html b/standards/decision-records/index.html new file mode 100644 index 0000000000..328de3b6f9 --- /dev/null +++ b/standards/decision-records/index.html @@ -0,0 +1,26 @@ + + + + + +Decision Records | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Decision Records

Decision records within the Sovereign Cloud Stack (SCS) are critical documents that outline the reasoning and determinations made leading to the development of specific standards. They encapsulate the discussions, evaluations, and considerations of various options and alternatives before a final decision is made. These records serve as a transparent and accessible historical account, offering insights into the contextual factors and rationale that underpin each established standard.

+ + + + \ No newline at end of file diff --git a/standards/global/index.html b/standards/global/index.html new file mode 100644 index 0000000000..f480e588c6 --- /dev/null +++ b/standards/global/index.html @@ -0,0 +1,26 @@ + + + + + +Global Standards | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Global Standards

This track encompasses the foundational standards that guide the overall structure, documentation, and general topics related to the Sovereign Cloud Stack. It serves as the core framework, ensuring consistency, clarity, and comprehensibility across all aspects of the cloud stack, fostering an environment where information is easily accessible and understood.

StandardMost Recent VersionStateDescriptionstabilized
SCS-001v1🟢 StableSovereign Cloud Standards2022-11-28
SCS-002v2🟢 StableStandards, Docs and Organisation2023-03-08
SCS-003v1🟠 DraftSovereign Cloud Standards YAML-
+ + + + \ No newline at end of file diff --git a/standards/global/scs-0001/index.html b/standards/global/scs-0001/index.html new file mode 100644 index 0000000000..8929b09762 --- /dev/null +++ b/standards/global/scs-0001/index.html @@ -0,0 +1,26 @@ + + + + + +SCS-0001: SCS Standards | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

SCS-0001: SCS Standards

SCS-0001 outlines the structure, requirements, and lifecycle of standards, procedural documents, and decision records within the Sovereign Cloud Stack (SCS) community, ensuring clarity, organization, and governance in the development and maintenance of interoperable and transparent cloud infrastructure standards.

VersionTypeStatestabilizedobsoleted
SCS-0001-v1Procedural🟢 Stable2022-11-28-
+ + + + \ No newline at end of file diff --git a/standards/global/scs-0002/index.html b/standards/global/scs-0002/index.html new file mode 100644 index 0000000000..0fe0e9981f --- /dev/null +++ b/standards/global/scs-0002/index.html @@ -0,0 +1,26 @@ + + + + + +SCS-0002: Org & Docs Standards | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

SCS-0002: Org & Docs Standards

SCS-0002 standard outlines the standardized structure and maintenance processes for easily accessible and comprehensible content of the SCS project.

VersionTypeStatestabilizedobsoleted
SCS-0002-v1Procedural🟢 Stable2023-02-06-
SCS-0002-v2Procedural🟢 Stable2023-08-03-
+ + + + \ No newline at end of file diff --git a/standards/global/scs-0003/index.html b/standards/global/scs-0003/index.html new file mode 100644 index 0000000000..0fbc5ad295 --- /dev/null +++ b/standards/global/scs-0003/index.html @@ -0,0 +1,26 @@ + + + + + +SCS-0003: YAML Standards | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

SCS-0003: YAML Standards

SCS-0003 outlines the standards and certification processes for interoperable and sovereign cloud offerings, categorizing certifications into levels and layers, and detailing their progression, prerequisites, and versioning in a machine-readable YAML format for clarity, traceability, and tool integration.

VersionTypeStatestabilizedobsoleted
SCS-0003-v1Procedural🟠 Draft--
+ + + + \ No newline at end of file diff --git a/standards/iaas/index.html b/standards/iaas/index.html new file mode 100644 index 0000000000..48b9a83e59 --- /dev/null +++ b/standards/iaas/index.html @@ -0,0 +1,26 @@ + + + + + +IaaS Standards | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

IaaS Standards

The IaaS Layer Standards track focuses on the protocols, guidelines, and specifications that govern the infrastructure as a service layer. This encompasses standards for virtual machines, storage, networking, and other foundational resources, ensuring seamless, efficient, and secure operation, interoperability, and management of the underlying cloud infrastructure.

StandardMost Recent VersionStateDescriptionstabilized
SCS-0100v3🟢 StableFlavor Naming2023-06-14
SCS-0101v1🟠 DraftEntropy2023-03-08
SCS-0102v1🟢 StableImage Meta Data2022-10-31
SCS-0103v1🟠 DraftSovereign Cloud Standards YAML-
SCS-0104v1🟠 DraftSovereign Cloud Standards YAML-
+ + + + \ No newline at end of file diff --git a/standards/iaas/scs-0100/index.html b/standards/iaas/scs-0100/index.html new file mode 100644 index 0000000000..2bdb26e1bc --- /dev/null +++ b/standards/iaas/scs-0100/index.html @@ -0,0 +1,27 @@ + + + + + +SCS-0100: Flavor Naming | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

SCS-0100: Flavor Naming

The SCS Flavor Naming Standard provides a systematic approach for naming instance flavors in OpenStack environments, ensuring backward compatibility and clarity on key features like the number of vCPUs, RAM, and Root Disk, as well as extra features like GPU support and CPU generation. The standard aims for usability and portability across all SCS flavors.

VersionTypeStatestabilizedobsoleted
SCS-0100-v1Standard🟢 Stable2022-09-082023-10-31
SCS-0100-v2Standard🟠 Draft--
SCS-0100-v3Standard🟢 Stable2023-06-14-

Note +V2 and V3 are both concurrent stable versions

+ + + + \ No newline at end of file diff --git a/standards/iaas/scs-0101/index.html b/standards/iaas/scs-0101/index.html new file mode 100644 index 0000000000..ee186cf41a --- /dev/null +++ b/standards/iaas/scs-0101/index.html @@ -0,0 +1,26 @@ + + + + + +SCS-0101: Entropy | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

SCS-0101: Entropy

The SCS-0101 Entropy Standard ensures adequate entropy is available in virtual instances, crucial for operations like secure key creation in cryptography. The standard recommends using kernel version 5.18 or higher and activating the hw_rng_model: virtio attribute for images, while compute nodes should employ CPUs with entropy accessing instructions unfiltered by the hypervisor. It allows the infusion of the hosts entropy sources into virtual instances and ensures the availability and quality of entropy in virtual environments, promoting system security and efficiency.

VersionTypeStatestabilizedobsoleted
SCS-0101-v1Standard🟠 Draft--
+ + + + \ No newline at end of file diff --git a/standards/iaas/scs-0102/index.html b/standards/iaas/scs-0102/index.html new file mode 100644 index 0000000000..d789e5ff6f --- /dev/null +++ b/standards/iaas/scs-0102/index.html @@ -0,0 +1,26 @@ + + + + + +SCS-0102: Image Metadata | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

SCS-0102: Image Metadata

The SCS-0102 Image Metadata Standard outlines how to categorize and manage metadata for cloud-based operating system images to ensure usability and clarity. The standard encompasses naming conventions, technical requirements, image handling protocols including updating and origin, and licensing/support details. These guidelines ensure that users can understand, access, and utilize OS images effectively, with clear information on features, updates, and licensing provided through well-defined metadata properties.

VersionTypeStatestabilizedobsoleted
SCS-0102-v1Standard🟢 Stable2022-10-31-
+ + + + \ No newline at end of file diff --git a/standards/iaas/scs-0103/index.html b/standards/iaas/scs-0103/index.html new file mode 100644 index 0000000000..f824eaa347 --- /dev/null +++ b/standards/iaas/scs-0103/index.html @@ -0,0 +1,26 @@ + + + + + +SCS-0103: Standard Flavors | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

SCS-0103: Standard Flavors

The SCS-0103 standard outlines mandatory and recommended specifications for flavors and properties in OpenStack environments to ensure uniformity across SCS clouds. Mandatory and recommended flavors are defined with specific configurations of vCPUs, vCPU types, RAM, and root disk sizes, alongside extra specs like scs:name-vN, scs:cpu-type, and scs:diskN-type to detail the flavor's specifications. This standard facilitates guaranteed availability and consistency of flavors, simplifying the deployment process for DevOps teams.

VersionTypeStatestabilizedobsoleted
SCS-0103-v1Standard🟠 Draft--
+ + + + \ No newline at end of file diff --git a/standards/iaas/scs-0104/index.html b/standards/iaas/scs-0104/index.html new file mode 100644 index 0000000000..ec3fd10441 --- /dev/null +++ b/standards/iaas/scs-0104/index.html @@ -0,0 +1,26 @@ + + + + + +SCS-0104: Standard Images | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

SCS-0104: Standard Images

The SCS-0104 standard establishes guidelines for virtual machine images in Sovereign Cloud Stack (SCS) environments, specifying mandatory, recommended, and optional images via a YAML file, ensuring interoperability and streamlined deployments. It mandates that image upload via Glance must be allowed, ensuring flexibility for users. The standard's machine-readable document facilitates automated processing for compliance and integration purposes, promoting consistency and reliability in cloud environments.

VersionTypeStatestabilizedobsoleted
SCS-0104-v1Standard🟠 Draft--
+ + + + \ No newline at end of file diff --git a/standards/iam/index.html b/standards/iam/index.html new file mode 100644 index 0000000000..67b5c69129 --- /dev/null +++ b/standards/iam/index.html @@ -0,0 +1,26 @@ + + + + + +IAM Standards | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

IAM Standards

This track revolves around Identity and Access Management (IAM) standards, providing guidelines for ensuring secure and efficient user authentication, authorization, and administration. It addresses issues related to user identity, permissions, roles, and policies, aiming to safeguard and streamline access to cloud resources and services.

StandardMost Recent VersionStateDescriptionstabilized
SCS-0300v1🟢 StableRequirements for SSO identity federation2023-06-21
+ + + + \ No newline at end of file diff --git a/standards/iam/scs-0300/index.html b/standards/iam/scs-0300/index.html new file mode 100644 index 0000000000..83ef1b2fbc --- /dev/null +++ b/standards/iam/scs-0300/index.html @@ -0,0 +1,26 @@ + + + + + +SCS-0300: SSO Identity Federation | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

SCS-0300: SSO Identity Federation

The SCS-0300 standard outlines requirements for Single Sign-On (SSO) identity federation within the Sovereign Cloud Stack (SCS). It addresses the need for customers to access SCS services using credentials stored and managed externally, facilitating user onboarding and reducing the need for additional dedicated SCS accounts. The standard focuses on delegating authentication to external identity providers and mapping users to roles within SCS for authorization, while also considering the use of machine identities. Keycloak is the current choice as an Identity Provider (IdP) for its support of OAuth 2.0 grants and its integration with OpenStack and kolla-ansible.

VersionTypeStatestabilizedobsoleted
SCS-0300-v1Standard🟢 Stable2023-06-21-
+ + + + \ No newline at end of file diff --git a/standards/index.html b/standards/index.html new file mode 100644 index 0000000000..4851f56e54 --- /dev/null +++ b/standards/index.html @@ -0,0 +1,26 @@ + + + + + +Introduction | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Introduction

The Sovereign Cloud Stack (SCS) is a community-driven project that curates a set of standards—including both existing standards, such as the OpenInfra interoperability guides or the CNCF Kubernetes conformance, and newly created ones—to enable and ensure compatibility, openness, and sovereignty of cloud services across a wide range of providers, particularly small and medium businesses.

In addition, SCS provides a certification framework that enables these providers to verify and advertise their compliance with these standards. This framework consists of six kinds of certificates of varying scope, where each scope corresponds to a subset of the set of standards mentioned above.

Alt text

Learn more about these scopes as well as the currently certified clouds under Certification. More details on individual standards can be found under Standards.

+ + + + \ No newline at end of file diff --git a/standards/kaas/index.html b/standards/kaas/index.html new file mode 100644 index 0000000000..8f7831a26d --- /dev/null +++ b/standards/kaas/index.html @@ -0,0 +1,26 @@ + + + + + +KaaS Standards | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

KaaS Standards

Standards in this track are concerned with Kubernetes as a Service layer, outlining norms and best practices for deploying, managing, and operating Kubernetes clusters. These standards aim to ensure that the orchestration of containers is streamlined, secure, and compatible across various cloud environments and platforms.

StandardMost Recent VersionStateDescriptionstabilized
SCS-0210v1🟢 StableNew Version Policy2023-02-07
SCS-0211v1🟢 StableDefault Storage Class2023-02-13
+ + + + \ No newline at end of file diff --git a/standards/kaas/scs-0210/index.html b/standards/kaas/scs-0210/index.html new file mode 100644 index 0000000000..4c9f9ac7b9 --- /dev/null +++ b/standards/kaas/scs-0210/index.html @@ -0,0 +1,26 @@ + + + + + +SCS-0210: k8s New Version Policy | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

SCS-0210: k8s New Version Policy

The SCS-0210 standard outlines the expected pace at which providers should adopt new Kubernetes versions, aiming for alignment with the rapid development cycle of Kubernetes. Providers must offer the latest minor version within four months of its release and the newest patch version within a week, ensuring users have timely access to security updates, bug fixes, and features. The standard emphasizes the need for expedited updates for critical CVEs and expects providers to thoroughly test new versions before deployment.

VersionTypeStatestabilizedobsoleted
SCS-0210-v1Standard🟢 Stable2023-02-07-
+ + + + \ No newline at end of file diff --git a/standards/kaas/scs-0211/index.html b/standards/kaas/scs-0211/index.html new file mode 100644 index 0000000000..14453496f7 --- /dev/null +++ b/standards/kaas/scs-0211/index.html @@ -0,0 +1,26 @@ + + + + + +SCS-0211: KaaS Default Storage Class | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

SCS-0211: KaaS Default Storage Class

The SCS-0211 standard outlines the properties required for the default StorageClass in Kubernetes as a Service (KaaS). The standard ensures that the default StorageClass, identified by the "storageclass.kubernetes.io/is-default-class" annotation, supports the ReadWriteOnce access mode and protects volume data against loss due to single disk or host hardware failures.

VersionTypeStatestabilizedobsoleted
SCS-0211-v1Standard🟢 Stable2023-02-13-
+ + + + \ No newline at end of file diff --git a/standards/ops/index.html b/standards/ops/index.html new file mode 100644 index 0000000000..4e9b8860aa --- /dev/null +++ b/standards/ops/index.html @@ -0,0 +1,26 @@ + + + + + +Ops Standards | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Ops Standards

Operational Tooling Standards cover the protocols and guidelines associated with tools and utilities used for monitoring, management, and maintenance of the cloud environment. This includes standards for status pages, alerts, logs, and other operational tools, aiming to optimize the reliability, performance, and security of cloud services and resources.

StandardMost Recent VersionStateDescriptionstabilized
SCS-0412v1🟠 DraftExposition of IaaS metering data as JSON-
+ + + + \ No newline at end of file diff --git a/standards/ops/scs-0412/index.html b/standards/ops/scs-0412/index.html new file mode 100644 index 0000000000..e805d53910 --- /dev/null +++ b/standards/ops/scs-0412/index.html @@ -0,0 +1,26 @@ + + + + + +SCS-0412: Metering JSON | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

SCS-0412: Metering JSON

The SCS-0412 standard addresses the need for a standardized interface to expose IaaS metering data in JSON format within the Sovereign Cloud Stack (SCS). This is to aid cloud operators in integrating SCS IaaS layer data with their existing billing and customer relationship systems. The standard adopts the Ceilometer HTTP hook format provided by the OpenStack Ceilometer project for telemetry and metering, avoiding the need for additional translation layers and implementation components.

VersionTypeStatestabilizedobsoleted
SCS-0412-v1Standard🟠 Draft--
+ + + + \ No newline at end of file diff --git a/standards/scs-0001-v1-sovereign-cloud-standards/index.html b/standards/scs-0001-v1-sovereign-cloud-standards/index.html new file mode 100644 index 0000000000..4699c989a8 --- /dev/null +++ b/standards/scs-0001-v1-sovereign-cloud-standards/index.html @@ -0,0 +1,139 @@ + + + + + +Sovereign Cloud Standards | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Sovereign Cloud Standards

Introduction

The Sovereign Cloud Stack (SCS) provides standards +for a range of cloud infrastructure types. +It strives for interoperable and sovereign cloud stacks +which can be deployed and used by a wide range of organizations and individuals. +Wherever feasible, +transparency and openness both in respect to the inner workings of the platforms standardised by SCS, +as well as the SCS organisation itself +are a paradigm we intend to live.

Requirements

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119.

In addition, "FORBIDDEN" is to be interpreted equivalent to "MUST NOT".

Sovereign Cloud Standard documents

One of the main products of the SCS organisation are Sovereign Cloud Standard documents.

Types of documents

Procedural

A procedural SCS document describes a process, a policy or a guideline +to which the SCS community adheres.

Standard

A standard SCS document describes a technical standard for SCS compliant clouds. +Note that it may not be necessary for all clouds to implement all standards.

Decision Record

Sometimes during the development of the SCS standard, +a complex technical decision needs to be taken, +which does not directly result in a new standard.

The SCS document format formally integrates +the documentation of such decisions +as documents of type Decision Record.

Document format

The SCS documents are provided in GitHub flavored markdown. +Each document is assigned a unique number. +To disambiguate with other organisations using similar schemes +(such as XEPs, PEPs or IETF RFCs), +the numbers are prefixed with SCS-.

To allow a concept to evolve while allowing breaking changes, +each SCS document is associated with a major version number. +This major version number is a positive number +and the numbering starts at one for each document.

In order to make organisation of the SCS documents easier, +each document also has a slugified title. +The slugified title MUST NOT be changed after the acceptance of the document into the repository, +as it is part of its canonical URL. +It MUST consist only of lower-case ASCII letters, numbers and hyphens. +It MUST NOT start with a hyphen and SHOULD start with a lower-case letter. +It SHOULD NOT contain more than one subsequent hyphen.

The file name of an SCS document is formed using the following pattern: +scs-XXXX-vN-T.md, where +XXXX is replaced with the zero-padded document number, +N is replaced with the major version of the document, and +T is replaced with the slugified title. +For a document with the number 190, with a major version number 2 and a slugified title flavor-naming, +the resulting file name would be scs-0190-v2-flavor-naming.md.

The second digit in XXXX describes the track where the document belongs:

TrackNumber
Global0
IaaS1
KaaS2
IAM3
Ops4

In addition to the number, each document has the following metadata, +embedded in the markdown header.

Field nameRequirementDescription
typeREQUIREDone of Procedural, Standard, or Decision Record
statusREQUIREDone of Proposal, Draft, Stable, Deprecated, or Rejected
trackREQUIREDone of Global, IaaS, KaaS, IAM, Ops
obsoleted_atREQUIRED if status is DeprecatedISO formatted date indicating the date after which the deprecation is in effect
stabilized_atREQUIRED if status was ever StableISO formatted date indicating the date after which the document was considered stable
rejected_atREQUIRED if status is RejectedISO formatted date indicating the date on which the document was rejected
replaced_byRECOMMENDED if status is Deprecated or Rejected, FORBIDDEN otherwiseList of documents which replace this document.
replacesOPTIONALList of documents which this document replaces.

Sections

Each document SHOULD have the following sections:

  • An Introduction providing context on the document and linking to other relevant materials.
  • A Motivation section which details why this document or the thing it describes is necessary.

In addition, the following OPTIONAL sections should be considered:

  • A Design Considerations section for Standard type documents, +which details other choices +which have been considered for the specific feature +but were ultimately rejected.
  • An Open Questions section which links to issues +detailing any open discussion points with respect to a document. +This section is RECOMMENDED during the discussion phase (pre 1.0.0) +as a "table of contents" of things to work on in that context.
  • A Related Documents section which references related Standards +or Decisions, both upstream and/or other SCS documents.
  • A Conformance Tests section that contains hints on how to validate +conformance with this spec, ideally links to conformance test cases.

Process

The lifecycle of an SCS document goes through the following phases: +Proposal, Draft, Stable, Deprecated, and Rejected.

All decisions for phase transitions follow loose consensus, +where the group which has to form the consensus depends on the track of the document:

  • IaaS: The team working on infrastructure-as-a-service topics
  • KaaS: The team working on Kubernetes-as-a-service topics
  • Ops: The team working on operations topics
  • IAM: The team working on identity and access management topics
  • Global: The entire SCS community

Proposal phase

Proposal of a new document

To propose a new SCS document, +a community participant creates a pull request on GitHub +against the standards repository in the SovereignCloudStack organisation.

The pull request MUST add exactly one SCS document, +in the Standards folder. +In the proposal phase, +the document number MUST be replaced with xxxx in the file name. +The major version MUST be 1.

For a document with a slugified title flavor-naming, +the file name would for instance be scs-xxxx-v1-flavor-naming.md.

The metadata MUST indicate the intended track and type of the document, +and the status MUST be set to Proposal.

Upon acceptance by the group of people identified by the track, +a number is assigned +(the next unused number) +and the proposer is asked +to rename the file to replace the xxxx with that number.

Note: +Documents on the Design Record track MAY be proposed or accepted directly into Stable state, +if no further discussion is required.

Hereafter, +the pull request can be merged +and henceforth the document is an official SCS document in Draft state.

Proposal of a major update to a stable document

To propose major update to a Stable SCS document, +a community participant creates a pull request on GitHub +against the standards repository in the SovereignCloudStack organisation.

The pull request MUST add exactly one SCS document, +in the Standards folder. +The document number MUST be the same as the document it is updating, +and the major version number MUST be incremented by 1. +The slugified title MAY be changed.

It MUST refer to the old document in its replaces metadata. +The pull request SHOULD NOT modify the previous document; +deprecation of the previous document +as well as adding the replaced_by metadata is a separate step, +and can only be executed once the new document is Stable.

For a document updating a hypothetical SCS-0390-v3 document, +the file name may be scs-0390-v4-flavor-naming-this-time-its-serious.md.

Other than the file naming difference, +the proposal process is the same as for new documents. +In particular, the new document starts out in Draft state +and does not automatically become part of the normative corpus of an SCS release.

Development phase (Draft)

In this phase, +the document is developed inside the SCS community.

It should not be considered to be normative for any SCS release, +even if an SCS release happens after the acceptance of the document.

Experimental and exploratory implementations are encouraged, +however, implementors must be prepared for breaking changes.

Changes to the documents are gated through pull requests.

Stabilized phase (Stable)

Once the document is deemed ready for production use, +its status is changed to Stable.

After stabilization, +changes to the document which may render existing implementations non-conformant +MUST NOT be made.

If a breaking change to an existing SCS document is deemed necessary, +a new document with a new number shall be created +and the old document SHOULD be deprecated.

Deprecation phase (Deprecated)

Should a document become obsolete, +it can be deprecated.

Obsoletions SHOULD be announced ahead of their execution by setting the +deprecated_at field to a future date and moving the status to Deprecated. +This signals current and future implementors +that the subject matter of the document +is not considered necessary or state of the art anymore.

If one or more replacement documents for the document exists, +it MUST be listed in the replaced_by metadata field.

Rejection

If a document is removed from the normative corpus of SCS standards, +its status is changed to Rejected.

If one or more replacement documents for the document exists, +it MUST be listed in the replaced_by metadata field.

Open Questions

Stabilization criteria

When should a document be stabilized? +Should we require at least one public implementation? +Should we require a minimum experimental time? +What about non-Standard track documents?

Breaking change criteria

When is a change breaking and cannot be applied to a Stable document? +What about previously undefined behaviour (uncovered edge case)? +What about ambiguous wording? +Do we need a separate "Errata" section?

Design Considerations

Versioning

An alternative to the proposed scheme for stabilization +is the use of SemVer-like versioning.

In that case, one would have an individual version number with each document, +where a major version greater than zero indicates a stable document. +The Stable state would be merged with Draft state into an Active state +and shared between the stabilized and the development phase.

The advantages of such an approach are:

  • It is easy to recognize whether an SCS document has changed between two SCS +releases, just by looking at the released version number.
  • It is possible to make breaking changes after stabilization by increasing the +major version number.

The disadvantages of that approach are:

  • It is possible to make breaking changes after stabilization. +Potentially, an hypothetical SCS-1234 document might refer to something completely different +in a hypothetical R15 release than what it meant in R5, +if there have been sufficient, gradual breaking changes to the document.

    That means that for proper linking, +it would be required to always include the major version number +when referring to an SCS document.

    This implies having to keep all former versions around in a canonical, linkable form. +This induces non-trivial organizational and editorial overhead +and raises questions around which changes are acceptable to "archived" versions, +if any.

  • It would require a clone of the SemVer spec, +as that spec is highly specific toward software +and does not fully +(at least not in the standard-as-written) +cover specifics of a standards organisation's use-cases.

Acknowledgements

This document is heavily inspired by XEP-0001, as published by the XMPP Standards Foundation.

+ + + + \ No newline at end of file diff --git a/standards/scs-0002-v1-standards-docs-org/index.html b/standards/scs-0002-v1-standards-docs-org/index.html new file mode 100644 index 0000000000..c6491110ce --- /dev/null +++ b/standards/scs-0002-v1-standards-docs-org/index.html @@ -0,0 +1,32 @@ + + + + + +Standards, Docs and Organisation | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Standards, Docs and Organisation

Introduction

The old Docs repository had a subdirectory Design-Docs/ which holds Docs on +Design Considerations, older Architecture Decision Records (ADRs) and even +Standards. It also has a Design-Docs/tools/ subdirectory with conformance +checks and our overall conformance check driver (from PR#182).

Motivation

This directory structure is confusing in a number of ways:

  • The conformance checks are hard to find.
  • The mixture of document types requires searching at two or three places.

We want to improve this (while avoiding unnecessary churn).

Suggested cleanup (step 1)

  • Move Design-Docs/tools/ contents to Tests/
    • Also create subdirectories then for layers and test, while the overall +conformance check tool, certification specs and README remain in Tests/.
  • Rename Design-Docs/ to Drafts/.
    • Use individual PRs to rewrite existing ADRs and Standards there to conform +to our standards and move them over to Standards/.

Some documents with findings will remain in the Drafts directory. +We may want to categorize these and have a folder e.g. for research results.

+ + + + \ No newline at end of file diff --git a/standards/scs-0002-v2-standards-docs-org/index.html b/standards/scs-0002-v2-standards-docs-org/index.html new file mode 100644 index 0000000000..7e9e083649 --- /dev/null +++ b/standards/scs-0002-v2-standards-docs-org/index.html @@ -0,0 +1,26 @@ + + + + + +SCS Documentation structure | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

SCS Documentation structure

Introduction

The Sovereign Cloud Stack (SCS) is a complex ecosystem, comprised of numerous Components and packages designed to accommodate a wide array of use cases. Given the unique functionalities of these components, the creation of a unified and comprehensible documentation presents a significant challenge. This procedural standard aims to define the structure and maintenance process for our documentation, thereby offering seamless and efficient access to users.

Motivation

SCS promotes a collaborative environment by actively contributing to upstream projects. The involvement of individuals and companies within our community significantly enhances the SCS Bill of Materials (BOM), further amplifying its complexity. Consequently, our documentation must:

  • Offer an overview and visual representation of the architectural model
  • Foster coherence by maintaining a consistent theme throughout the documentation
  • Facilitate a transparent and inclusive community environment
  • Describe various deployment examples and use cases
  • Reflect the SCS structure in the documentation's navigation

Distributed Documentation

In line with the OpenStack documentation approach, most SCS Components and components maintain independent documentation. To keep this documentation up-to-date and eliminate manual duplication, we utilize a custom workflow that synchronizes individual documents during the static documentation page's build process.

Methodology and Taxonomy

Addressing the complexity of SCS requires an effective documentation structure. Accordingly, we have adopted the Diataxis taxonomy, categorizing the documentation into four distinct sections: Tutorials, Guides, References, and Explanations.

Structure Template

The technical documentation and navigation should parallel the logical structure of the SCS Architecture. By doing so, users can better comprehend the information hierarchy and effectively visualize the SCS. The proposed structure is as follows:

├── Introduction
├── Getting Started
│ ├── Overview
│ ├── Virtualization
│ └── Containerization
├── IaaS Layer
│ ├── Overview
│ │ ├── Architecture
│ │ ├── Compute
│ │ ├── Storage
│ │ ├── Knowledge
│ │ └── Network
│ ├── Deployment Examples
│ │ ├── Example 1
│ │ │ ├── Hardware
│ │ │ └── Software
│ │ ├── ...
│ │ │ ├── Hardware
│ │ │ └── Software
│ │ └── Example x
│ │ ├── Hardware
│ │ └── Software
│ ├── Guides
│ │ ├── Guide 1
│ │ ├ ...
│ │ └── Guide x
│ └── Components
│ ├── Component 1
│ ├ ...
│ └── Component x
├── Container Layer
│ ├── Overview
│ │ ├── Architecture
│ │ └── ...
│ ├── Prerequisites
│ │ ├── Hardware
│ │ ├── Software
│ │ └── Knowledge
│ ├── Guides
│ │ ├── Guide 1
│ │ ├── ...
│ │ └── Guide x
│ └── Components
│ ├── k8s-cluster-api-provider
│ ├ ...
│ └── Component x
├── Operating SCS
│ ├── Overview
│ ├── Guides
│ │ ├── Guide 1
│ │ ├── ...
│ │ └── Guide x
│ ├── Monitoring
│ ├── Incident Management
│ ├── Audits
│ ├── Lifecycle Management: Patches/Updates & Upgrades
│ └── Logging
├── Identity and Access Management (IAM)
├── Releases
├── Standards
├── FAQ
└── Glossary

Single Component/Component

The technical documentation and navigation should parallel the logical structure of the SCS Architecture. By doing so, users can better comprehend the information hierarchy and effectively visualize the SCS. The proposed structure is as follows:

│        ├── Component
│ │ ├── overview.md
│ │ └── requirements.md
│ │ ├── quickstart.md
│ │ ├── configuration.md
│ │ ├── contribute.md

Each document serves a specific purpose:

Overview

This document introduces the Component/component by addressing the basic "Why," "How," and "What" questions, and articulating the problems it solves in the broader SCS context answering the following questions:

  • What is it and for what do I need this? What benefits does it have for users?
  • What organization/company does this belong to? (Link to company/organization)
  • Where am I – as module – within the bigger context of SCS?

Requirements

This section enumerates the necessary prerequisites to utilize the component, including software, hardware, and any required technical knowledge. What are the minimal requirements needed for a quickstart?

Quickstart

A concise guide providing users with a quick set up of the component, covering installation instructions, basic configuration, and initial steps. Caution: it is only for testing and not for production.

  • What is the aim of this quickstart guide?
  • Rule: one line per command for easy copy&paste and one line for description where possible
  • Rule: only one working path for installation.

Configuration

This section elaborates on the configurable aspects of the component, such as options, parameters, or settings that users can modify to suit their needs.

Contribute

This document provides instructions on how interested parties can contribute to the component's development. It includes information on issue submission, proposed changes, and participation in discussions.

Technical Implementation

SCS employs Docusaurus, a contemporary static website generator, to implement the Docs Standard. Docusaurus serves as an ideal platform for creating, managing, and deploying extensive documentation.

Documentation Framework

Docusaurus' robust toolkit assists in crafting and maintaining quality documentation. It offers comprehensive features such as Markdown support, customizable themes, and versioning, making it an excellent choice for our needs. This platform allows us to create user-friendly and visually engaging documentation.

Special Implementation Details

SCS's unique architecture necessitates a unique approach to documentation. To ensure seamless integration of reference documentation for Components and components developed for SCS, we have created a custom workflow. This workflow automatically syncs upstream repositories, pulling the most recent documentation at regular intervals.

We have accomplished this by utilizing a Node.js post-install script found here.

This script prompts the system to pull the latest docs every eight hours and build the static page. The workflow's specifications can be viewed here.

The SCS documentation is built by the tooling from the docs-page repository, pulling content from docs repository as well as many other components as defined in the docs.package.json here.

Writing Style and Format – Style Guide

Formatting and Linting

All documentation text files must be provided as markdown files with an .md extension. This prerequisite ensures uniformity across our documents, making them more accessible and comprehensible.

Diagrams, Charts, and Images

When necessary, diagrams, charts, and images can be used to simplify complex information. They should be properly captioned and referenced in the text.

Linting

To maintain a clean and consistent content repository, we enforce linting on:

  • All staged files before committing
  • All Pull Requests
Pre Commit

We run markdownlint against staged Git files using the Husky Git hook. This process is facilitated by lint-staged and husky.

The markdown files are linted according to the rules specified by markdownlint-cli2 and formatted with prettier.

The linting rules are specified in the configuration file .markdownlint-cli2.jsonc. Additionally, markdownlint-rule-search-replace

GitHub Workflows

There are two actions running on every Pull Request on the main branch:

  1. link-validator.yml validates every link in the markdown files.
  2. pr-markdownlint.yml checks all markdown files according to the rules defined within .markdownlint-cli2.jsonc.

The Style Guide can be found here.

Open Questions

--

Reference

--

+ + + + \ No newline at end of file diff --git a/standards/scs-0003-v1-sovereign-cloud-standards-yaml/index.html b/standards/scs-0003-v1-sovereign-cloud-standards-yaml/index.html new file mode 100644 index 0000000000..7dcb0a881b --- /dev/null +++ b/standards/scs-0003-v1-sovereign-cloud-standards-yaml/index.html @@ -0,0 +1,58 @@ + + + + + +Sovereign Cloud Standards YAML | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Sovereign Cloud Standards YAML

Introduction

The Sovereign Cloud Stack (SCS) provides standards for a range of cloud infrastructure types. +It strives for interoperable and sovereign cloud offerings which can be deployed and used by a wide range of organizations and individuals.

SCS plans to offer six kinds of certificates with varying scope. These scopes can be sorted into two dimensions:

  1. certification level, of which there are three:
    • SCS-compatible
    • SCS-open
    • SCS-sovereign
  2. cloud layer, of which there are two:
    • infastructure as a service (IaaS)
    • Kubernetes as a service (KaaS)

So, for instance, a certificate can have the scope SCS-compatible IaaS or SCS-sovereign KaaS. +Note that we don't currently have separate certification layers for Operations and IAM. +We expect that tests for these aspects will exist, but be incorporated into the IaaS +and KaaS layers.

Each certificate scope amounts to a set of standards that have to be fulfilled by the cloud service in question in order for a certificate to be issued. +In addition, a certificate with a certain scope may only be issued if some other certificate is already held. +Case in point: the certification levels are meant to be seen as a progression, where the upper levels build on the lower ones, and +the certificate for "SCS-open IaaS" will only be issued if a certificate for "SCS-compatible IaaS" is already held. +We say that the latter certificate is a prerequisite of the former.

Naturally, as the state of the art progresses, so do our certificates. We keep track of the changes by means of versioning. +That is to say that each certificate scope can come in several versions, each one of them having its distinct timespan when it is in effect. +For instance, we might have

  • SCS-compatible IaaS v1, effective 2021-01-01 through 2023-10-31
  • SCS-compatible IaaS v2, effective 2023-03-23 through 2023-11-30

and so on (but usually, we aim to keep at most two versions in effect, with an overlap of 4 to 6 weeks).

This decision record describes two main points:

  1. How we denote our certificate scopes by means of a YAML file.
  2. Our process for constructing and progressing the certificate scopes.

Motivation

This decision record establishes a mechanism (by means of the YAML file) with the following three main objectives:

  • to provide an overview of the mandatory standards for the different SCS certificate scopes
  • to make the lifecycle of certificate scopes traceable
  • to provide a machine-readable document for further processing (e.g. for a compliance tool suite or continuous integration).

Overview of mandatory SCS standards

Digging through a repository of draft, stable, replaced and rejected standards becomes increasingly challenging with a growing number +documents and decision records. A central document that lists all mandatory standards to acquire a certificate with a certain scope can +resolve this issue. It provides clarity for providers as well as users and helps to understand the value +proposition of SCS.

Lifecycle of certificate scopes

Standards and therefore certifications will evolve over time. To provide transparency and traceability for the lifecycle of SCS certificate +scopes, the whole history of our certifications should be recorded. Pre-notification of changes to our certificate scopes allows +users to adapt their environments or deployment automation to the new standards in advance.

Machine-readability for further processing

By providing a machine-readable document, we can generate web-friendly overviews of our certificate scopes as well as create a tool suite +that checks environments against all described standards.

SCS Certification YAML

Each certificate scope is recorded in a dedicated YAML file, e.g. scs-open-kaas.yaml.

The certification YAML MUST contain the following keys:

KeyTypeDescriptionExample
nameStringFull name of this certificate scopeSCS Open KaaS
urlStringValid URL to the latest raw version of this documenthttps://raw.githubusercontent.com/SovereignCloudStack/standards/main/Tests/scs-open-kaas.yaml
versionsArray of mapsList of version descriptors (described below)(see below)

The certification YAML MAY contain the following keys:

Prerequisite

A certificate within a certain level (above SCS-compatible) can only be granted if a valid corresponding certificate of the level below is presented, +where corresponding means: of the same layer. The latter certificate is said to be a prerequisite for the former.

We implement this logic by allowing for the designation of a certificate scope as a prerequisite; +then a certificate of that prerequisite scope has to be presented before the certificate of the scope in question can be granted.

KeyTypeDescriptionExample
prerequisiteMapDescriptor for the prerequisite certificate scope, if any
prerequisite.nameStringFull name of the certificate scopeSCS Compatible IaaS
prerequisite.urlStringValid URL to the latest raw version of the certificate scopescs-compatible-iaas.yaml

Version descriptor

KeyTypeDescriptionExample
versionStringMandatory: Version of the particular list of standardsv3
standardsArray of mapsMandatory: List of standard descriptors for this particular layer
stabilized_atDateISO formatted date indicating the date after this version is considered stable.2022-11-09
obsoleted_atDateISO formatted date indicating the date on which this version is expired.2023-04-09

Once a version has a stabilized_at field, this field may not be changed. The same holds true for the obsoleted_at field.

Note that at any point in time, all versions that are older (stabilized_at is at or before this point) +can be certified against, unless the version is already obsoleted (the point is after obsoleted_at). +This means that more than one version may be allowable at a certain point in time. Tooling should default +to use the newest allowable version (the one with the most recent stabilized_at date) then.

Note: We intend to keep only one version in effect, except for a grace period of 4 to 6 weeks, when two versions +are effective at the same time.

Standard descriptor

Every list of standards consists of several standards that – altogether – define the particular layer standard in the given version.

KeyTypeDescriptionExample
nameStringFull name of the particular standardFlavor naming
urlStringValid URL to the latest raw version of the particular standardFlavor naming
conditionStringState of the particular standard, currently either mandatory or optional, default is mandatorymandatory
check_toolsArrayList of check tool descriptors: listing all tools that must pass

Check tool descriptor

KeyTypeDescriptionExample
executableStringValid local filename (relative to the path of scs-compliance-check.py) of a script that verifies compliance with the particular standardimage-md-check.py
argsStringOptional list of arguments to be passed to the check_tool. Preferably none needed.-v
conditionStringOptionally overrides the per-standard condition (mandatory or optional)optional
classificationStringOne of: light (default), medium, heavy; describes the resource usage of the script; used to select an appropiate test intervalheavy

Note: the executable could in principle also be given via a URL; however, this is not yet supported due to security considerations.

Basic Example

name: SCS Open IaaS
url: https://raw.githubusercontent.com/SovereignCloudStack/Docs/main/Certification/scs-open-iaas.yaml
prerequisite:
name: SCS Compatible IaaS
url: https://raw.githubusercontent.com/SovereignCloudStack/standards/main/Tests/scs-compatible-iaas.yaml
versions:
- version: v5 # This version is in a draft state and work in progress
# No stabilized_at: date set yet
standards:
- name: Flavor naming
url: https://raw.githubusercontent.com/SovereignCloudStack/standards/main/Standards/scs-0100-v2-flavor-naming.md
condition: mandatory # is default and can be left out
check_tools:
- executable: flavor-name-check.py
- name: Image metadata
url: https://raw.githubusercontent.com/SovereignCloudStack/Docs/main/Standards/SCS-0004-v1-image-metadata.md
condition: mandatory
check_tools:
- executable: image-md-check.py
args: -v
- executable: image-md-check2.py
condition: optional
- version: v4 # This is the upcoming version with a given target date. No further changes should be done to this set of standards
stabilized_at: 2022-04-01
standards:
- name: ....

- version: v3 # This is the stable set of standards that is currently active
stabilized_at: 2021-10-01
obsoleted_at: 2022-11-08
standards:
- name: ....

- version: v2 # This set of standards is obsolete and has been replaced by v3
stabilized_at: 2021-07-01
obsoleted_at: 2021-11-01
standards:
- name: ....
kaas:
- ...

Process

The lifecycle any version of any certificate scope goes through the following phases: +Draft, Stable, and Deprecated.

Note that one pull request can affect multiple versions, but each pull request has to affect +at most one layer.

Each pull request is to be voted upon in the corresponding team meeting. The vote has to be +on the pull request only, i.e., it may not affect any other pull request or issue, and it +must be announced 14 days in advance via the corresponding mailing list.

Design Considerations

File format

In order to have a document that can be processed by a wide range of tools, we need to opt for a simple but yet well supported format. +YAML offers readability for humans as well as good support by many frameworks. Since YAML is heavily used in the cloud and container +domain, the choice is obvious.

Dependency graph for certifications

This standard only allows exactly one depending certification, otherwise we would need to use a list of mappings. Since this is +in accordance to the current plan of the SIG Standardization & Certification, we can safely ignore multiple dependency of +certification for now.

Tooling

The SCS repository Docs has a tool scs-compliance-check.py in the Tests directory +which parses the SCS Certification YAML and then runs the tests referenced there, returning the results +of the tests.

Open Questions

Acknowledgements

This document is heavily inspired by the publiccode.yml standard, as published by the Foundation for Public Code.

+ + + + \ No newline at end of file diff --git a/standards/scs-0100-v1-flavor-naming/index.html b/standards/scs-0100-v1-flavor-naming/index.html new file mode 100644 index 0000000000..7c9c86f68e --- /dev/null +++ b/standards/scs-0100-v1-flavor-naming/index.html @@ -0,0 +1,142 @@ + + + + + +SCS Flavor Naming Standard | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

SCS Flavor Naming Standard

Introduction

This is the standard v1.0 for SCS Release 0. +Note that we intend to only extend it (so it's always backwards compatible), +but try to avoid changing in incompatible ways.

Motivation

In OpenStack environments there is a need to define different flavors for instances. +The flavors are pre-defined by the operator, the customer can not change these. +OpenStack providers thus typically offer a large selection of flavors.

While flavors can be discovered (openstack flavor list), it is helpful for users (DevOps teams), +to have

  • A naming scheme that is used across all SCS flavors, so flavor names have the same meaning everywhere.
  • Have a guaranteed set of flavors available on all SCS clouds, so these do not need to be discovered.

While not all details will be encoded in the name, the key features should be obvious: +Number of vCPUs, RAM, Root Disk. +Extra features are important as well: There will be flavors with GPU support, fast disks for databases, +memory-heavy applications, and other useful aspects of an instance.

It may also be important to make the CPU generation clearly recognisable, as this is always a topic in +discussions with customers.

Proposal

Type of information included

We believe the following characteristics are important in a flavour description:

TypeDescription
GenerationCPU Generation
Number of CPUNumber of vCPUs - suffixed by L,V,T,C (see below)
Amount of RAMAmount of memory available for the VM
Performance ClassAbility to label high-performance CPUs, disks, network
CPU TypeX86-intel, X86-amd, ARM, RISC-V, Generic
"bms"Bare Metal System (no virtualization/hypervisor)

Complete Proposal

PrefixCPUSuffixRAM[GiB]optional: Disk[GB]optional: Disk typeoptional: extra features
SCS-NL/V/T/C[i]:N[u][o][:[Mx]N][n/s/l/p][-hyp][-hwv]-[arch[N][h][-[G/g]X[N][:M[h]]][-ib]

(Note that N and M are placeholders for numbers here).

Proposal Details

[REQUIRED] CPU Suffixes

SuffixMeaning
Cdedicated Core
Tdedicated Thread (SMT)
VvCPU (oversubscribed)
LvCPU (heavily oversubscribed)

Baseline

Note that vCPU oversubscription for a V vCPU should be implemented such, that we +can guarantee at least 20% of a core in >99% of the time; this can be achieved by +limiting vCPU oversubscription to 5x per core (or 3x per thread when SMT/HT is enabled) +or by more advanced workload management logic. Otherwise L (low performance) must be +used. The >99% is measured over a month (1% is 7.2h/month).

Note that CPUs must use latest microcode to protect against CPU vulnerabilities (Spectre, Meltdown, L1TF, etc.). +We expect that microcode gets updated within less than a month of a new release; for CVSS scores above 8, +we expect less than a week. +The provider must enable at least all mitigations that are enabled by default in the Linux kernel. CPUs that +are susceptible to L1TF (intel x86 pre Cascade Lake) must switch off hyperthreading OR (in the future) +use core scheduling implementations that are deemed to be secure by the SCS security team, or declare themselves +as insecure with the i suffix (see below).

Higher oversubscription

Must be indicated with a L vCPU type (low performance for > 5x/core or > 3x/thread oversubscription and +the lack of workload management that would prevent worst case performance <20% in more than 7.2h per month).

Insufficient microcode

Not using these mitigations must be indicated by an additional i suffix for insecure +(weak protection against CPU vulns through insufficient microcode, lack of disabled hyperthreading +on L1TF susceptible CPUs w/o effective core scheduling or disabled protections on the host/hypervisor).

Examples

  • SCS-2C:4:10n
  • SCS-2T:4:10n
  • SCS-2V:4:10n
  • SCS-2L:4:10n
  • SCS-2Li:4:10n
  • SCS-2:**4:10n <- CPU suffix missing
  • SCS-2iT:4:10n <- This order is forbidden

[REQUIRED] Memory

Baseline

We expect cloud providers to use ECC memory. +Memory oversubscription is not recommended. +It is allowed to specify half GiBs (e.g. 3.5), though this is discouraged for larger memory sizes (>= 10GiB).

No ECC

If no ECC is used, the u suffix must indicate this.

Enabled Oversubscription

You have to expose this with the o sufffix.

Examples

  • SCS-2C:4:10n
  • SCS-2C:3.5:10n
  • SCS-2C:4u:10n
  • SCS-2C:4o:10n
  • SCS-2C:4uo:10n
  • SCS-2C:4ou:10n <- This order is forbidden

[OPTIONAL] Disk sizes and types

Disk typeMeaning
nNetwork shared storage (ceph/cinder)
hLocal disk (HDD: SATA/SAS class)
sLocal SSD disk
pLocal high-perf NVMe

Baseline

Note that disk type might be omitted — the user then can not take any assumptions +on what storage is provided for the root disk (that the image gets provisioned to).

It does make sense for n to be requested explicitly to allow for smooth live migration. +h typically provides latency advantages vs n (but not necessarily bandwidth and +also is more likely to fail), s and p are for applications that need low +latency (high IOPS) and bandwidth disk I/O. n storage is expected to survive +single-disk and single-node failure.

If the disk size is left out, the cloud is expected to allocate a disk (network or local) +that is large enough to fit the root file system (min_disk in image). This automatic +allocation is indicated with : without a disk size. +If the : is left out completely, the user must create a boot volume manually and +tell the instance to boot from it or use the +block_device_mapping_v2 +mechanism explicitly to create the boot volume from an image.

Multi-provisioned Disk

The disk size can be prefixed with Mx prefix, where M is an integer specifying that the disk +is provisioned M times.

Examples

  • SCS-2C:4:10n
  • SCS-2C:4:10s
  • SCS-2C:4:10s-bms-z3
  • SCS-2C:4:3x10s <- Cloud creates three 10GB SSDs
  • SCS-2C:4:3x10s-bms-z3
  • SCS-2C:4:10 <- Cloud decides disk type
  • SCS-2C:4:10-bms-z3
  • SCS-2C:4:n <- Cloud decides disk size (min_disk from image or larger)
  • SCS-2C:4:n-bms-3
  • SCS-2C:4: <- Cloud decides disk type and size
  • SCS-2C:4:-bms-z3
  • SCS-2C:4:-bms-z3h-GNa:64-ib
  • SCS-2C:4:-ib
  • SCS-2C:4 <- You need to specify a boot volume yourself (boot from volume, or use block_device_mapping_v2)
  • SCS-2C:4-bms-z3
  • SCS-2C:4:3x <- Cloud decides disk type and size and creates three of them (FIXME: Is this useful?)
  • SCS-2C:4:3xs <- Cloud decides size and creates three local SSD volumes (FIXME: useful?)
  • SCS-2C:4:3x10 <- Cloud decides type and creates three 10GB volumes
  • SCS-2C:4:1.5n <- You must not specify disk sizes which are not in full GiBs

[OPTIONAL] Hypervisor

The default Hypervisor is assumed to be KVM. Clouds, that offer different hypervisors +or Bare Metal Systems should indicate the Hypervisor according to the following table:

hypMeaning
kvmKVM
xenXen
vmwVMware
hyvHyper-V
bmsBare Metal System

Examples

  • SCS-2C:4:10n
  • SCS-2C:4:10n-bms
  • SCS-2C:4:10n-bms-z3h

[OPTIONAL] Hardware virtualization / Nested virtualization

If the instances that are created with this flavor support hardware-accelerated +virtualization, this can be reflected with the -hwv flag (after the optional +Hypervisor flag). On x86, this means that in the instance, the CPU flag vmx (intel) +or svm (AMD) is available. This will be the case on Bare Metal flavors on almost +all non-ancient x86 CPUs or if your virtualization hypervisor is configured to +support nested virtualization. +Flavors without the -hwv flag may or may not support hardware virtualization (as we +recommend enabling nesting, but don't require flavor names to reflect all +capabilities. Flavors may overdeliver ...)

Examples

  • SCS-2C:4:10 <- may or may not support HW virtualization in VMs
  • SCS-2C:4:10-kvm-hwv
  • SCS-2C:4:10-hwv <- not recommended, but allowed
  • SCS-2C:4:10-hwv-xen <- illegal, wrong ordering

[OPTIONAL] CPU Architecture Details

Arch details provide more details on the specific CPU:

  • Vendor
  • Generation
  • Frequency

Generation and Vendor

The generations are vendor specific and can be left out. +Not specifying arch means that we have a generic CPU (x86-64).

Generationi (Intel x86-64)z (AMD x86-64) a (AArch64)r (RISC-V)
0pre Skylakepre Zenpre Cortex A76TBD
1SkylakeZen-1 (Naples)A76/NeoN1 classTBD
2Cascade LakeZen-2 (Rome)A78/x1/NeoV1 classTBD
3Ice LakeZen-3 (Milan)A71x/NeoN2 (ARMv9)TBD
4Zen-4 (Genoa)TBD

It is recommended to leave out the 0 when specifying the old generation; this will +help the parser tool, which assumes 0 for an unspecified value and does leave it +out when generating the name for comparison. In other words: 0 has a meaning of +"rather old or unspecified".

Frequency Suffixes

SuffixMeaning
h>2.75GHz all-core
hh>3.25GHz all-core
hhh>3.75GHz all-core

Examples

  • SCS-2C:4:10n
  • SCS-2C:4:10n-z
  • SCS-2C:4:10n-z3
  • SCS-2C:4:10n-z3h
  • SCS-2C:4:10n-z3hh
  • SCS-2C:4:10n-bms-z
  • SCS-2C:4:10n-bms-z3
  • SCS-2C:4:10n-bms-z3
  • SCS-2C:4:10n-bms-z3h
  • SCS-2C:4:10n-bms-z3hh

[OPTIONAL] Extra features

Note that these are optional — it is recommended for providers to encode this information +into the flavor name, so there is a systematic way of differentiating flavors. +Providers could leave it out however, leaving it to extra_specs to make these flavor +capabilities discoverable. Nothing prevents providers from registering the same flavor +under a secondary (or tertiary) name.

-GX[N][:M[h]] indicates a Pass-Through GPU from vendor X of gen N with M compute units / SMs / EUs exposed. +-gX[N][:M[h]] indicates a vGPU from vendor X of gen N with M compute units / SMs / EUs assigned.

Note that the vendor letter is mandatory, generation and compute units are optional.

GPUVendor
NnVidia
AAMD
IIntel

Generations could be nVidia (f=Fermi, k=Kepler, m=Maxwell, p=Pascal, v=Volta, t=turing, a=Ampere, ...), +AMD (GCN-x=0.x, RDNA1=1, RDNA2=2), intel (Gen9=0.9, Xe(12.1)=1, ...), ... +(Note: This may need further work to properly reflect what's out there.)

The optional h suffix to the comput unit count indicates high-performance (e.g. high freq or special +high bandwidth gfx memory such as HBM); +h can be duplicated for even higher performance.

-ib indicates Inifinband networking.

More extensions will be forthcoming.

Extensions need to be specified in the above mentioned order.

Proposal Examples

ExampleDecoding
SCS-2C:4:10n2 dedicated cores (x86-64), 4GiB RAM, 10GB network disk
SCS-8Ti:32:50p-i18 dedicated hyperthreads (insecure), Skylake, 32GiB RAM, 50GB local NVMe
SCS-1L:1u:51 vCPU (heavily oversubscribed), 1GiB Ram (no ECC), 5GB disk (unspecific)
SCS-16T:64:200s-GNa:64-ib16 dedicated threads, 64GiB RAM, 200GB local SSD, Inifiniband, 64 Passthrough nVidia Ampere SMs
SCS-4C:16:2x200p-a14 dedicated Arm64 cores (A78 class), 16GiB RAM, 2x200GB local NVMe drives
SCS-1V:0.51 vCPU, 0.5GiB RAM, no disk (boot from cinder volume)

Standard SCS flavors

These are flavors expected to exist on standard SCS clouds (x86-64).

We expect disk sizes to be 5, 10, 20, 50, 100, 200, 500, 1000GB, 2000GB. +We expect a typical CPU:Mem[GiB] ratio of 1:4.

vCPU:RAM ratioMandatory Flavors
1:4SCS-1V:4, SCS-1V:4:10
2:8SCS-2V:8, SCS-2V:8:20
4:16SCS-4V:16, SCS-4V:16:50
8:32SCS-8V:32, SCS-8V:32:100
1:2SCS-1V:2, SCS-1V:2:5
2:4SCS-2V:4, SCS-2V:4:10
4:8SCS-4V:8, SCS-4V:8:20
8:16SCS-8V:16, SCS-8V:16:50
16:32SCS-16V:32, SCS-16V:32:100
1:8SCS-1V:8, SCS-1V:8:20
2:16SCS-2V:16, SCS-2V:16:50
4:32SCS-4V:32, SCS-4V:32:100
1:1SCS-1L:1, SCS-1L:1:5

Note that all vCPUs are oversubscribed — the smallest 1L:1 flavor allows +for heavy oversubscription (note the L), and thus can be offered very +cheaply — imagine jump hosts ... +Disks types are not specified (and expected to be n or h typically).

The design allows for small clouds (with CPUs with 16 Threads, 64GiB RAM +compute hosts) to offer all flavors.

Note: Compared to previous drafts, we have heavily reduced the variations +on disk sizes — this reflects that for the standard networked cinder +disks, you can pass blockdevice_mapping_v2 on server (VM) creation to +allocate a boot disk of any size you desire. We have scaled the few +mandatory disk sizes with the amount of RAM. For each flavor there is +also one _without a pre-attached disk — these are meant to be used +to boot from a volume (either created beforehand or allocated on-the-fly +with block_device_mapping_v2, e.g. +openstack server create --flavor SCS-1V:2 --block-device-mapping sda=IMGUUID:image:12:true +to create a bootable 12G cinder volume from image IMGUUID that gets tied to the VM +instance lifecycle.)

Naming policies

To be certified as an SCS compliant x86-64 IaaS platform, you must offer all standard SCS flavors +according to the previous section. (We may define a mechanism that allows exceptions to be +granted in a way that makes this very transparent and visible to clients.)

You are allowed to understate your performance; you may implement a SCS-1Vl:1:5 flavor with +a flavor that actually implements SCS-1T:1:5n (i.e. you dedicate a secured hyperthread instead +of high oversubscription) or even SCS-1D:1.5:8s (1 dedicated core, 50% more RAM and a 8GiB SSD).

We expect all cloud providers to offer the short, less specific flavor names (such as SCS-8V:32:100). +Larger providers that offer more details are expected to still also offer the short variants +for usability and easier portability, even beyond the mandated flavors.

You must be very careful to expose low vCPU guarantees (L instead ov V), insecure +hyperthreading/microcode i, non-ECC-RAM u, memory oversubscription o. Note that omitting these qualifiers is +overstating your security, reliability or performance properties and may be reason for +clients to feel betrayed or claim damages. It might in extreme cases also cause SCS to withdraw certification +along with public statements.

You may offer additional SCS- flavors, following the naming scheme outlined here.

You may offer additional flavors, not following above scheme.

You must not offer flavors with the SCS- prefix which do not follow this naming scheme. +You must not extend the SCS naming scheme with your own suffices; you are encouraged however +to suggest extensions that we can discuss and add to the official scheme.

Note that all letters are case-sensitive. +In case you wonder: Feature indicators are capitalized, modifiers are lower case. +(An exception is the uppercase -G for a passthrough GPU vs. lowercase -g for vGPU.)

Rationale

Note that we expect most clouds to prefer short flavor names, +not indicating CPU details or hypervisor types. See above list +of standard flavors to get a feeling.

However, more successful providers will often need to differentiate their +offerings in response to customer demand and allow customers to request +flavors with specific detailed properties. The goal of this proposal is to avoid +providers to invent their own names and then refer customers to extra_specs +or worse a non-machine-readable service description to find out the details.

So a cloud provider might well evolve from offering SCS-8T:16:50 to offering +SCS-8T:16:50n, SCS-8T:16:50n-i2 and SCS-8T:16:50n-a2 to specify that he +is using network disks and offer a choice b/w intel Cascade-Lake and AMD Rome. +We would expect the cloud provider to still offer the generic flavor +SCS-8C:16:50 and allow the scheduler (placement service) to pick both more +specific types (or just one if e.g. capacity management considerations suggest +so). We would expect providers in such cases to ensure that the price of a requested +flavor does not depend on the scheduler decisions.

We are looking into the metadefs +mechanism and extra_specs +to allow customers to ask for specific flavor properties without the need to +encode all these flavor details into the flavor name, so the optional pieces +may not be needed much. However, there must be a way to request flavor +properties without encoding the need into an image — this indirection is +considered broken by the SCS team.

Validation

There is a script in flavor_name_check.py +which can be used to decode, validate and construct flavor names. +This script must stay in sync with the specification text.

Ensure you have your OpenStack tooling (python3-openstackclient, OS_CLOUD) setup and call +tools/flavor-name-check.py -c $(openstack flavor list -f value -c Name) to get a report +on the flavor list compliance of the cloud environment.

Beyond SCS: Gaia-X

Some providers might offer VM services ("IaaS") without trying to adhere to SCS standards, +yet still finding the flavor naming standards useful. The Gaia-X Technical Committee's +Provider Working Group (WG) would seem like a logical place for such dicussions then. +If so, we could +replace the SCS- prefix with a GX- prefix and transfer the naming scheme governance from +the SCS project to the Gaia-X Provider WG (where we participate). SCS certification would +then reference the Gaia-X flavor naming standard as a requirement.

+ + + + \ No newline at end of file diff --git a/standards/scs-0100-v2-flavor-naming/index.html b/standards/scs-0100-v2-flavor-naming/index.html new file mode 100644 index 0000000000..02f92dc522 --- /dev/null +++ b/standards/scs-0100-v2-flavor-naming/index.html @@ -0,0 +1,198 @@ + + + + + +SCS Flavor Naming Standard | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

SCS Flavor Naming Standard

Introduction

This is the standard v2.1 for SCS Release 4. +Note that we intend to only extend it (so it's always backwards compatible), +but try to avoid changing in incompatible ways. +(See at the end for the v1 to v2 transition where we have not met that +goal, but at least managed to have a 1:1 relationship between v1 and v2 names.)

Motivation

In OpenStack environments there is a need to define different flavors for instances. +The flavors are pre-defined by the operator, the customer can not change these. +OpenStack providers thus typically offer a large selection of flavors.

While flavors can be discovered (openstack flavor list), it is helpful for users (DevOps teams), +to have

  • A naming scheme that is used across all SCS flavors, so flavor names have the same meaning everywhere.
  • Have a guaranteed set of flavors available on all SCS clouds, so these do not need to be discovered.

While not all details will be encoded in the name, the key features should be obvious: +Number of vCPUs, RAM, Root Disk. +Extra features are important as well: There will be flavors with GPU support, fast disks for databases, +memory-heavy applications, and other useful aspects of an instance.

It may also be important to make the CPU generation clearly recognizable, as this is always a topic in +discussions with customers.

Note that not all relevant properties of flavors can be discovered; creating a specification +to address this is a separate but related effort to the name standardization. +Commonly used infrastructure-as-code tools do not provide a way to use discoverability +features to express something like "I want a flavor with 2 vCPUs, 8GiB of RAM, a local +20GB SSD disk and Infiniband support but I don't care whether it's AMD or intel" in a +reasonable manner. Using flavor names to express this will thus continue to be useful +and we don't expect the need for standardization of flavor names to go away until +the commonly used IaC tools work on a higher abstraction layer than they currently do.

Design Considerations

Type of information included

From discussions of our operators with their customers we learned that +the following characteristics are important in a flavor description:

TypeDescription
GenerationCPU Generation
Number of CPUNumber of vCPUs - suffixed by L,V,T,C (see below)
Amount of RAMAmount of memory available for the VM
Performance ClassAbility to label high-performance CPUs, disks, network
CPU TypeX86-intel, X86-amd, ARM, RISC-V, Generic
"bms"Bare Metal System (no virtualization/hypervisor)

This list is likely not comprehensive and will grow over time.

Rather than using random names s5a.medium and assigning a discrete set of properties +to them, we wanted to come up with a scheme that allows to systematically derive +names from properties and vice versa. The scheme allows for short names (by not +encoding all details) as well as very detailed longer names.

Complete Proposal for systematic flavor naming

PrefixCPUs & SuffixRAM[GiB]optional: Disk[GB]&typeopt: extensions
SCS-NL/V/T/C[i]-N[u][o][-[Mx]N[n/s/l/p]][_EXT]

Note that N and M are placeholders for numbers here. +The optional fields are denoted in brackets (and have opt: in the header. +See below for extensions.

Note that all letters are case-sensitive.

Typical flavor names look like SCS-4V-16-50 for a flavor with 4vCPUs (with limited +oversubscription), 16GiB RAM and a 50GB disk (of unspecified type).

Proposal Details

[REQUIRED] CPU Suffixes

Next to the number of vCPUs, these vCPUs need to be characterized ti describe their nature.

SuffixMeaning
Cdedicated Core
Tdedicated Thread (SMT)
VvCPU (oversubscribed)
LvCPU (heavily oversubscribed)

Baseline

Note that vCPU oversubscription for a V vCPU should be implemented such, that we +can guarantee at least 20% of a core in >99% of the time; this can be achieved by +limiting vCPU oversubscription to 5x per core (or 3x per thread when SMT/HT is enabled) +or by more advanced workload management logic. Otherwise L (low performance) instead +of V must be used. The >99% is measured over a month (1% is 7.2h/month).

Note that CPUs should use latest microcode to protect against CPU vulnerabilities (Spectre, Meltdown, L1TF, etc.). +Microcode must be updated within less than a month of a new release; for CVSS scores above 8, +providers should do it in less than a week. +The provider should enable at least all mitigations that are enabled by default in the Linux kernel and the +KVM hypervisor. CPUs that are susceptible to L1TF (intel x86 pre Cascade Lake) should switch off hyperthreading +OR (in the future) use core scheduling implementations that are deemed to be secure by the SCS security team.

If microcode updates needed for mitigation are lacking for longer than a month, default kernel/hypervisor +mitigations are disabled or hyperthreading is enabled despite the CPU being susceptible to L1TF, the +flavors must declare themselves insecure with the i suffix (see below).

Higher oversubscription

Must be indicated with a L vCPU type (low performance for > 5x/core or > 3x/thread oversubscription and +the lack of workload management that would prevent worst case performance <20% in more than 7.2h per month).

Insufficient microcode

Not using these mitigations must be indicated by an additional i suffix for insecure +(weak protection against CPU vulns through insufficient microcode, lack of disabled hyperthreading +on L1TF susceptible CPUs w/o effective core scheduling or disabled protections on the host/hypervisor).

Examples

  • SCS-2C-4-10n
  • SCS-2T-4-10n
  • SCS-2V-4-10n
  • SCS-2L-4-10n
  • SCS-2Li-4-10n
  • SCS-2-**4-10n <- CPU suffix missing
  • SCS-2iT-4-10n <- This order is forbidden

[REQUIRED] Memory

Baseline

Cloud providers should use ECC memory. +Memory oversubscription should not be used. +It is allowed to specify half GiBs (e.g. 3.5), though this is should not be done for larger memory sizes (>= 10GiB).

No ECC

If no ECC is used, the u suffix must indicate this.

Enabled Oversubscription

If memory is oversubscribed, you must expose this with the o suffix.

Examples

  • SCS-2C-4-10n
  • SCS-2C-3.5-10n
  • SCS-2C-4u-10n
  • SCS-2C-4o-10n
  • SCS-2C-4uo-10n
  • SCS-2C-4ou-10n <- This order is forbidden

[OPTIONAL] Disk sizes and types

Disk sizes (in GB) should use sizes 5, 10, 20, 50, 100, 200, 500, 1000.

Disk typeMeaning
nNetwork shared storage (ceph/cinder)
hLocal disk (HDD: SATA/SAS class)
sLocal SSD disk
pLocal high-perf NVMe

Baseline

Note that disk type might be omitted — the user then can not take any assumptions +on what storage is provided for the root disk (that the image gets provisioned to).

It does make sense for n to be requested explicitly to allow for smooth live migration. +h typically provides latency advantages vs n (but not necessarily bandwidth and +also is more likely to fail), s and p are for applications that need low +latency (high IOPS) and bandwidth disk I/O. n storage is expected to survive +single-disk and single-node failure.

If the disk size is left out, the cloud is expected to allocate a disk (network or local) +that is large enough to fit the root file system (min_disk in image). This automatic +allocation is indicated with - without a disk size. +If the - is left out completely, the user must create a boot volume manually and +tell the instance to boot from it or use the +block_device_mapping_v2 +mechanism explicitly to create the boot volume from an image.

Multi-provisioned Disk

The disk size can be prefixed with Mx prefix, where M is an integer specifying that the disk +is provisioned M times. Multiple disks provided this way should be independent storage media, +so users can expect some level of parallelism and independence.

Examples

  • SCS-2C-4-10n
  • SCS-2C-4-10s
  • SCS-2C-4-10s_bms_z3
  • SCS-2C-4-3x10s <- Cloud creates three 10GB SSDs
  • SCS-2C-4-3x10s_bms_z3
  • SCS-2C-4-10 <- Cloud decides disk type
  • SCS-2C-4-10_bms_z3
  • SCS-2C-4-n <- Cloud decides disk size (min_disk from image or larger)
  • SCS-2C-4-n_bms_3
  • SCS-2C-4- <- Cloud decides disk type and size
  • SCS-2C-4-_bms_z3
  • SCS-2C-4-_bms_z3h_GNa-64_ib
  • SCS-2C-4-_ib
  • SCS-2C-4 <- You need to specify a boot volume yourself (boot from volume, or use block_device_mapping_v2)
  • SCS-2C-4_bms_z3
  • SCS-2C-4-3x- <- Cloud decides disk type and size and creates three of them (FIXME: Is this useful?)
  • SCS-2C-4-3xs <- Cloud decides size and creates three local SSD volumes (FIXME: useful?)
  • SCS-2C-4-3x10 <- Cloud decides type and creates three 10GB volumes
  • SCS-2C-4-1.5n <- You must not specify disk sizes which are not in full GiBs

Standard SCS flavors

These are flavors that must exist on standard SCS clouds (x86-64).

We expect disk sizes to be 5, 10, 20, 50, 100, 200, 500, 1000GB, 2000GB. +We expect a typical CPU:Mem[GiB] ratio of 1:4.

vCPU:RAM ratioMandatory Flavors
1:4SCS-1V-4, SCS-1V-4-10
2:8SCS-2V-8, SCS-2V-8-20
4:16SCS-4V-16, SCS-4V-16-50
8:32SCS-8V-32, SCS-8V-32-100
1:2SCS-1V-2, SCS-1V-2-5
2:4SCS-2V-4, SCS-2V-4-10
4:8SCS-4V-8, SCS-4V-8-20
8:16SCS-8V-16, SCS-8V-16-50
16:32SCS-16V-32, SCS-16V-32-100
1:8SCS-1V-8, SCS-1V-8-20
2:16SCS-2V-16, SCS-2V-16-50
4:32SCS-4V-32, SCS-4V-32-100
1:1SCS-1L-1, SCS-1L-1-5

Note that all vCPUs of SCS standard flavors are oversubscribed — the smallest 1L-1 +flavor allows for heavy oversubscription (note the L), and thus can be offered very +cheaply — imagine jump hosts ... +Disks types are not specified (and expected to be n or h typically).

The design allows for small clouds (with CPUs with 16 Threads, 64GiB RAM +compute hosts) to offer all flavors.

Note: Compared to previous drafts, we have heavily reduced the variations +on disk sizes — this reflects that for the standard networked cinder +disks, you can pass block_device_mapping_v2 on server (VM) creation to +allocate a boot disk of any size you desire. We have scaled the few +mandatory disk sizes with the amount of RAM. For each flavor there is +also one without a pre-attached disk — these are meant to be used +to boot from a volume (either created beforehand or allocated on-the-fly +with block_device_mapping_v2, e.g. +openstack server create --flavor SCS-1V:2 --block-device-mapping sda=IMGUUID:image:12:true +to create a bootable 12G cinder volume from image IMGUUID that gets tied to the VM +instance life cycle.)

Naming policy compliance

To be certified as an SCS compliant x86-64 IaaS platform, you must offer all standard SCS flavors +according to the previous section. (We may define a mechanism that allows exceptions to be +granted in a way that makes this very transparent and visible to clients.)

You are allowed to understate your performance; you may implement a SCS-1V-1-5 flavor with +a flavor that actually implements SCS-1T-1-5n (i.e. you dedicate a dedicated hyperthread instead +of higher oversubscription) or even SCS-1D-1.5-8s (1 dedicated core, 50% more RAM and a 8GiB SSD).

Flavor names indicating certain capabilities must at least provide these, otherwise they +are in violation of the SCS specification and prevent SCS compliance.

We expect all cloud providers to offer the short, less specific flavor names (such as SCS-8V-32-100). +Larger providers that offer more details (using the extension below) are expected to still also +offer the short variants for usability and easier portability, even beyond the mandated flavors.

You must be very careful to expose low vCPU guarantees (L instead of V), insecure +hyperthreading/microcode i, non-ECC-RAM u, memory oversubscription o. Note that omitting these qualifiers is +overstating your security, reliability or performance properties and may be reason for +clients to feel betrayed or claim damages. This would prevent SCS compliance and certification; +in extreme cases, the SCS project might be forced to work with public statements.

You may offer additional SCS- flavors, following the naming scheme and rules outlined here.

You may offer additional flavors, not following above scheme and not starting with SCS-

You must not offer flavors with the SCS- prefix which do not follow this naming scheme. +You must not extend the SCS naming scheme with your own suffices; you are encouraged however +to suggest extensions that we can discuss and add to the official scheme.

Validation

There is a script in flavor_name_check.py +which can be used to decode, validate and construct flavor names. +This script must stay in sync with the specification text.

Ensure you have your OpenStack tooling (python3-openstackclient, OS_CLOUD) setup and call +tools/flavor-name-check.py -c $(openstack flavor list -f value -c Name) to get a report +on the flavor list compliance of the cloud environment.

The script flavor-names-openstack.py talks to the OpenStack API of the +cloud specified by the OS_CLOUD environment and queries properties and checks +the names for standards compliance and completeness w.r.t. the mandatory +flavor list. It goes beyond the above example in checking that the discoverable +features of flavors (vCPUs, RAM, Disk) match what the flavor names claim.

Operational tooling

The openstack-flavor-manager is able to +create all standard, mandatory SCS flavors for you.

Extensions

Extensions provide a possibility for providers that offer a very differentiated set +of flavors to indicate hypervisors, support for hardware/nested virtuatlization, +CPU types and generations, high-frequency models, GPU support and GPU types as +well as Inifiniband support. (More extensions may be appended in the future.)

Using the systematic naming approach ensures that two providers that offer flavors +with the same specific features will use the same name for them, thus simplifying +life for their customers when consuming these flavors.

Note that there is no need to indicate all details and extra features this way. +Flavors may always perform better or have more features than indicated in a name. +Underperformance (CPU suffices L or i or memory suffices o and u) on the other +hand MUST be indicated in the name; this happens rarely in practice.

For smaller providers, the ability to e.g. differentiate between an AMD Milan and an intel +IceLake and exposed the slightly different feature set to customers and have slightly +different price points is often not worth the extra effort. This is because having +this extra differentiation causes fragmentation of the machines (host aggregates) +that can offer these flavors, thus resulting in a lower utilization (as the capacity +management will need to have a certain amount of headroom per machine pool to avoid +running out of capacity).

Note that it possible for providers to register both the generic short names and the +longer, more detailed names and allow them to use the same set of machines (host aggregates). +Note that machines (hypervisors) can be part of more than one host aggregate.

The extensions have the format:

[_hyp][_hwv][_[arch[N][h][_[G/g]X[N][-M[h]]][_ib]

Remember that letters are case-sensitive. +In case you wonder: Feature indicators are capitalized, modifiers are lower case. +(An exception is the uppercase -G for a pass-through GPU vs. lowercase -g for vGPU.)

[OPTIONAL] Hypervisor

The default Hypervisor is assumed to be KVM. Clouds, that offer different hypervisors +or Bare Metal Systems should indicate the Hypervisor according to the following table:

hypMeaning
kvmKVM
xenXen
vmwVMware
hyvHyper-V
bmsBare Metal System

Examples

  • SCS-2C-4-10n
  • SCS-2C-4-10n_bms
  • SCS-2C-4-10n_bms_z3h

[OPTIONAL] Hardware virtualization / Nested virtualization

If the instances that are created with this flavor support hardware-accelerated +virtualization, this can be reflected with the _hwv flag (after the optional +Hypervisor flag). On x86, this means that in the instance, the CPU flag vmx (intel) +or svm (AMD) is available. This will be the case on Bare Metal flavors on almost +all non-ancient x86 CPUs or if your virtualization hypervisor is configured to +support nested virtualization. +Flavors without the _hwv flag may or may not support hardware virtualization (as we +recommend enabling nesting, but don't require flavor names to reflect all +capabilities. Flavors may over-deliver ...)

Examples

  • SCS-2C-4-10 <- may or may not support HW virtualization in VMs
  • SCS-2C-4-10kvmhwv <- kvm with enabled nested virtualization
  • SCS-2C-4-10_hwv <- not recommended, but allowed
  • SCS-2C-4-10_bms_hwv <- better: bare metal with HW virt support (VMX on intel, SVM on AMD, ...)
  • SCS-2C-4-10_hwv_xen <- illegal, wrong ordering

[OPTIONAL] CPU Architecture Details

Arch details provide more details on the specific CPU:

  • Vendor
  • Generation
  • Frequency

Generation and Vendor

The generations are vendor specific and can be left out. +Not specifying arch means that we have a generic CPU (x86-64). +The letters i, z, a and r specify the vendors Intel, +AMD (z like in Zen), ARM v8+, RISC-V.

Generationi (Intel x86-64)z (AMD x86-64) a (AArch64)r (RISC-V)
0pre Skylakepre Zenpre Cortex A76TBD
1SkylakeZen-1 (Naples)A76/NeoN1 classTBD
2Cascade LakeZen-2 (Rome)A78/x1/NeoV1 classTBD
3Ice LakeZen-3 (Milan)A71x/NeoN2 (ARMv9)TBD
4Sapphire RapidsZen-4 (Genoa)TBD

It is recommended to leave out the 0 when specifying the old generation; this will +help the parser tool, which assumes 0 for an unspecified value and does leave it +out when generating the name for comparison. In other words: 0 has a meaning of +"rather old or unspecified".

Frequency Suffixes

SuffixMeaning
h>2.75GHz all-core
hh>3.25GHz all-core
hhh>3.75GHz all-core

Examples

  • SCS-2C-4-10n
  • SCS-2C-4-10n_z
  • SCS-2C-4-10n_z3
  • SCS-2C-4-10n_z3h
  • SCS-2C-4-10n_z3hh
  • SCS-2C-4-10nbmsz
  • SCS-2C-4-10nbmsz3
  • SCS-2C-4-10nbmsz3
  • SCS-2C-4-10nbmsz3h
  • SCS-2C-4-10nbmsz3hh <- Bare Metal, Intel Ice Lake with > 3.25GHz all core freq

[OPTIONAL] GPU support

_GX[N][-M[h]] indicates a Pass-Through GPU from vendor X of gen N with M compute units / SMs / EUs exposed. +_gX[N][-M[h]] indicates a vGPU from vendor X of gen N with M compute units / SMs / EUs assigned.

Note that the vendor letter X is mandatory, generation and compute units are optional.

GPUVendor
NnVidia
AAMD
IIntel

For nVidia, the generation N can be f=Fermi, k=Kepler, m=Maxwell, p=Pascal, v=Volta, t=turing, a=Ampere, l=Ada Lovelace, ..., +for AMD GCN-x=0.x, RDNA1=1, RDNA2=2, RDNA3=3, for intel Gen9=0.9, Xe(12.1)=1, ... +(Note: This may need further work to properly reflect what's out there.)

The optional h suffix to the compute unit count indicates high-performance (e.g. high freq or special +high bandwidth gfx memory such as HBM); +h can be duplicated for even higher performance.

[OPTIONAL] Infiniband

_ib indicates Infiniband networking.

More extensions may be forthcoming and appended in a later revision of this spec.

Extensions need to be specified in the above mentioned order.

Naming options advice

Note that we expect most clouds to prefer short flavor names, +not indicating CPU details or hypervisor types. See above list +of standard flavors to get a feeling.

However, more successful providers will often need to differentiate their +offerings in response to customer demand and allow customers to request +flavors with specific detailed properties. The goal of this proposal is to avoid +providers to invent their own names and then refer customers to (currently +incompletely standardized) extra_specs +or worse a non-machine-readable service descriptions to find out the details.

So a cloud provider might well evolve from offering SCS-8T-16-50 to offering +SCS-8T-16-50n, SCS-8T-16-50n_i2 and SCS-8T-16-50n_a2 to specify that he +is using network disks and offer a choice b/w intel Cascade-Lake and AMD Rome. +We would expect the cloud provider to still offer the generic flavor +SCS-8T-16-50 and allow the scheduler (placement service) to pick both more +specific types (or just one if e.g. capacity management considerations suggest +so). Providers should in such cases make sure that the price does not depend +on scheduler decisions.

We are looking into the metadefs +mechanism and extra_specs +to allow customers to ask for specific flavor properties without the need to +encode all these flavor details into the flavor name, so the optional pieces +may not be needed much. However, there must be a way to request flavor +properties without encoding the need into an image — the indirection via +an image is considered broken by the SCS team.

Proposal Examples

ExampleDecoding
SCS-2C-4-10n2 dedicated cores (x86-64), 4GiB RAM, 10GB network disk
SCS-8Ti-32-50p_i18 dedicated hyperthreads (insecure), Skylake, 32GiB RAM, 50GB local NVMe
SCS-1L-1u-51 vCPU (heavily oversubscribed), 1GiB Ram (no ECC), 5GB disk (unspecific)
SCS-16T-64-200s_GNa-64_ib16 dedicated threads, 64GiB RAM, 200GB local SSD, Infiniband, 64 Passthrough nVidia Ampere SMs
SCS-4C-16-2x200p_a14 dedicated Arm64 cores (A76 class), 16GiB RAM, 2x200GB local NVMe drives
SCS-1V-0.51 vCPU, 0.5GiB RAM, no disk (boot from cinder volume)

Previous standard versions

Version 1 of the standard +used a slightly different naming syntax while the logic was exactly the same. +What is a - in v2 used to be a :; _ used to be -. The reason for +the change was certain Kubernetes tools using the flavor names as labels. +Labels however are subject to stricter naming rules and in particular don't +allow for a :. See PR #190 +for a discussion.

Version 1 flavor names can be translated to v2 using the following transformation:

NAMEV2=$(echo "$NAMEV1" | sed -e 's/\-/_/g' -e 's/:/-/g' -e 's/^SCS_/SCS-/')

and the way back can be done with

NAMEV1=$(echo "$NAMEV2" | sed -e 's/\-/:/g' -e 's/_/-/g' -e 's/^SCS:/SCS-/')

Considerations for how providers can ensure a smooth transition for their customers +from v1 to v2 are written in a separate document.

For the time being, the validation tools still accept the old names with a warning +(despite the unchanged SCS- prefix) unless you pass option -2 to them. They will +however not count v1 flavors towards fulfilling the needs against the corresponding +v2 mandatory flavor list unless you pass the option -1. +In other words: An IaaS infrastructure with the 26 +v1 mandatory flavors will produce 26 warnings (for using old flavors) and 26 +errors (for missing the 26 mandatory v2 flavors) unless you pass -1 in which +case no errors and no warnings will be produced. Registering the 26 mandatory +v2 flavor names in addition will result in passing the test with only 26 +warnings — unless you specify -2. If you do and want to pass you'll need +to remove the old v1 names or rename them to no longer start with SCS-.

Beyond SCS

The Gaia-X provider working group which could have created a superseding standard +does no longer exist.

However, we have been reaching out to the OpenStack Public Cloud SIG and the ALASCA +members to seek further alignment.

Getting upstream OpenStack support for flavor aliases would provide more flexibility +and ease migrations between providers, also providers that don't offer the SCS- +flavors.

We also would like to see upstream extra_specs standardizing the discoverability of some +properties exposed via the SCS names and work on IaC tooling (terraform ...) +to make use of these when selecting a flavor.

+ + + + \ No newline at end of file diff --git a/standards/scs-0100-v3-flavor-naming/index.html b/standards/scs-0100-v3-flavor-naming/index.html new file mode 100644 index 0000000000..91791a480b --- /dev/null +++ b/standards/scs-0100-v3-flavor-naming/index.html @@ -0,0 +1,191 @@ + + + + + +SCS Flavor Naming Standard | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

SCS Flavor Naming Standard

Introduction

This is the standard v3.1 for SCS Release 5. +Note that we intend to only extend it (so it's always backwards compatible), +but try to avoid changing in incompatible ways. +(See at the end for the v1 to v2 transition where we have not met that +goal, but at least managed to have a 1:1 relationship between v1 and v2 names.)

Motivation

In OpenStack environments there is a need to define different flavors for instances. +The flavors are pre-defined by the operator, the customer can not change these. +OpenStack providers thus typically offer a large selection of flavors.

While flavors can be discovered (openstack flavor list), it is helpful for users (DevOps teams), +to have a naming scheme that is used across all SCS flavors, so flavor names have the same meaning everywhere.

While not all details will be encoded in the name, the key features should be obvious: +Number of vCPUs, RAM, Root Disk. +Extra features are important as well: There will be flavors with GPU support, fast disks for databases, +memory-heavy applications, and other useful aspects of an instance.

It may also be important to make the CPU generation clearly recognizable, as this is always a topic in +discussions with customers.

Note that not all relevant properties of flavors can be discovered; creating a specification +to address this is a separate but related effort to the name standardization. +Commonly used infrastructure-as-code tools do not provide a way to use discoverability +features to express something like "I want a flavor with 2 vCPUs, 8GiB of RAM, a local +20GB SSD disk and Infiniband support but I don't care whether it's AMD or intel" in a +reasonable manner. Using flavor names to express this will thus continue to be useful +and we don't expect the need for standardization of flavor names to go away until +the commonly used IaC tools work on a higher abstraction layer than they currently do.

Design Considerations

Type of information included

From discussions of our operators with their customers we learned that +the following characteristics are important in a flavor description:

TypeDescription
GenerationCPU Generation
Number of CPUNumber of vCPUs - suffixed by L,V,T,C (see below)
Amount of RAMAmount of memory available for the VM
Performance ClassAbility to label high-performance CPUs, disks, network
CPU TypeX86-intel, X86-amd, ARM, RISC-V, Generic
"bms"Bare Metal System (no virtualization/hypervisor)

This list is likely not comprehensive and will grow over time.

Rather than using random names s5a.medium and assigning a discrete set of properties +to them, we wanted to come up with a scheme that allows to systematically derive +names from properties and vice versa. The scheme allows for short names (by not +encoding all details) as well as very detailed longer names.

Complete Proposal for systematic flavor naming

PrefixCPUs & SuffixRAM[GiB]optional: Disk[GB]&typeopt: extensions
SCS-NL/V/T/C[i]-N[u][o][-[Mx]N[n/h/s/p]][_EXT]

Note that N and M are placeholders for numbers here. +The optional fields are denoted in brackets (and have opt: in the header. +See below for extensions.

Note that all letters are case-sensitive.

Typical flavor names look like SCS-4V-16-50 for a flavor with 4vCPUs (with limited +oversubscription), 16GiB RAM and a 50GB disk (of unspecified type).

Proposal Details

[REQUIRED] CPU Suffixes

Next to the number of vCPUs, these vCPUs need to be characterized to describe their nature.

SuffixMeaning
Cdedicated Core
Tdedicated Thread (SMT)
VvCPU (oversubscribed)
LvCPU (heavily oversubscribed)

Baseline

Note that vCPU oversubscription for a V vCPU should be implemented such, that we +can guarantee at least 20% of a core in >99% of the time; this can be achieved by +limiting vCPU oversubscription to 5x per core (or 3x per thread when SMT/HT is enabled) +or by more advanced workload management logic. Otherwise L (low performance) instead +of V must be used. The >99% is measured over a month (1% is 7.2h/month).

Note that CPUs should use latest microcode to protect against CPU vulnerabilities (Spectre, Meltdown, L1TF, etc.). +In particular,

  • microcode must be updated within less than a month of a new release; for CVSS scores above 8, +providers should do it in less than a week.
  • all mitigations that are enabled by default in the Linux kernel and the KVM hypervisor +should be enabled,
  • CPUs that are susceptible to L1TF (intel x86 pre Cascade Lake) should have hyperthreading +disabled OR (in the future) use core scheduling implementations that are deemed to be secure by the SCS security team.

That is to say, except when the suffix i is used, the provider commits itself to implementing the appropriate mitigations +if and when they become available, within the timeframes mentioned above.

If a provider does not want to commit to deploying available microcode fixes and upstream kernel/hypervisor updates within a month or +if the provider wants to enable hyperthreading on compute hosts despite having CPUs susceptible to L1TF there +(and no SCS-accepted core-scheduling mechanism is used for mitigation), +the flavors must be declared insecure with the i suffix (see below).

Higher oversubscription

Must be indicated with a L vCPU type (low performance for > 5x/core or > 3x/thread oversubscription and +the lack of workload management that would prevent worst case performance <20% in more than 7.2h per month).

Insufficient microcode

Not using these mitigations must be indicated by an additional i suffix for insecure +(weak protection against CPU vulns through insufficient microcode, lack of disabled hyperthreading +on L1TF susceptible CPUs w/o effective core scheduling or disabled protections on the host/hypervisor).

Examples

  • SCS-2C-4-10n
  • SCS-2T-4-10n
  • SCS-2V-4-10n
  • SCS-2L-4-10n
  • SCS-2Li-4-10n
  • SCS-2-**4-10n <- CPU suffix missing
  • SCS-2iT-4-10n <- This order is forbidden

[REQUIRED] Memory

Baseline

Cloud providers should use ECC memory. +Memory oversubscription should not be used. +It is allowed to specify half GiBs (e.g. 3.5), though this is should not be done for larger memory sizes (>= 10GiB).

No ECC

If no ECC is used, the u suffix must indicate this.

Enabled Oversubscription

If memory is oversubscribed, you must expose this with the o suffix.

Examples

  • SCS-2C-4-10n
  • SCS-2C-3.5-10n
  • SCS-2C-4u-10n
  • SCS-2C-4o-10n
  • SCS-2C-4uo-10n
  • SCS-2C-4ou-10n <- This order is forbidden

[OPTIONAL] Disk sizes and types

Disk sizes (in GB) should use sizes 5, 10, 20, 50, 100, 200, 500, 1000.

Disk typeMeaning
nNetwork shared storage (ceph/cinder)
hLocal disk (HDD: SATA/SAS class)
sLocal SSD disk
pLocal high-perf NVMe

Baseline

Note that disk type might be omitted — the user then can not take any assumptions +on what storage is provided for the root disk (that the image gets provisioned to).

It does make sense for n to be requested explicitly to allow for smooth live migration. +h typically provides latency advantages vs n (but not necessarily bandwidth and +also is more likely to fail), s and p are for applications that need low +latency (high IOPS) and bandwidth disk I/O. n storage is expected to survive +single-disk and single-node failure.

For specific requirements on the SSD and NVMe disks regarding IOPS and +power-loss protection, refer to Decision Record scs-0110-ssd-flavors.

If the disk size is left out, the cloud is expected to allocate a disk (network or local) +that is large enough to fit the root file system (min_disk in image). This automatic +allocation is indicated with - without a disk size. +If the - is left out completely, the user must create a boot volume manually and +tell the instance to boot from it or use the +block_device_mapping_v2 +mechanism explicitly to create the boot volume from an image.

Multi-provisioned Disk

The disk size can be prefixed with Mx prefix, where M is an integer specifying that the disk +is provisioned M times. Multiple disks provided this way should be independent storage media, +so users can expect some level of parallelism and independence.

Examples

  • SCS-2C-4-10n
  • SCS-2C-4-10s
  • SCS-2C-4-10s_bms_z3
  • SCS-2C-4-3x10s <- Cloud creates three 10GB SSDs
  • SCS-2C-4-3x10s_bms_z3
  • SCS-2C-4-10 <- Cloud decides disk type
  • SCS-2C-4-10_bms_z3
  • SCS-2C-4-n <- Cloud decides disk size (min_disk from image or larger)
  • SCS-2C-4-n_bms_3
  • SCS-2C-4- <- Cloud decides disk type and size
  • SCS-2C-4-_bms_z3
  • SCS-2C-4-_bms_z3h_GNa-64_ib
  • SCS-2C-4-_ib
  • SCS-2C-4 <- You need to specify a boot volume yourself (boot from volume, or use block_device_mapping_v2)
  • SCS-2C-4_bms_z3
  • SCS-2C-4-3x10 <- Cloud decides type and creates three 10GB volumes
  • SCS-2C-4-1.5n <- You must not specify disk sizes which are not in full GiBs

Naming policy compliance

You are allowed to understate your performance; you may implement a SCS-1V-1-5 flavor with +a flavor that actually implements SCS-1T-1-5n (i.e. you dedicate a dedicated hyperthread instead +of higher oversubscription) or even SCS-1C-1.5-8s (1 dedicated core, 50% more RAM and a 8GiB SSD). +Or you may offer the (v3 mandatory) SCS-2V-4-20s with a SCS-2V-4-20p (using a local NVMe +instead of an SSD).

Flavor names indicating certain capabilities must at least provide these, otherwise they +are in violation of the SCS specification and prevent SCS compliance.

We expect all cloud providers to offer the short, less specific flavor names (such as SCS-8V-32-100). +Larger providers that offer more details (using the extension below) are expected to still also +offer the short variants for usability and easier portability, even beyond the mandated flavors.

You must be very careful to expose low vCPU guarantees (L instead of V), insecure +hyperthreading/microcode i, non-ECC-RAM u, memory oversubscription o. Note that omitting these qualifiers +is overstating your security, reliability or performance properties and may be reason for +clients to feel betrayed or claim damages. This would prevent SCS compliance and certification; +in extreme cases, the SCS project might be forced to work with public statements.

You may offer additional SCS- flavors, following the naming scheme and rules outlined here.

You may offer additional flavors, not following above scheme and not starting with SCS-

You must not offer flavors with the SCS- prefix which do not follow this naming scheme.

You must not extend the SCS naming scheme with your own extensions; you are encouraged however +to suggest extensions that we can discuss and add to the official scheme.

Conformance Tests

There is a script in flavor-name-check.py +which can be used to decode, validate and construct flavor names. +flavor-name-describe.py outputs a human-readable decoding of the SCS flavor names. +These scripts must stay in sync with the specification text.

Ensure you have your OpenStack tooling (python3-openstackclient, OS_CLOUD) setup and call +tools/flavor-name-check.py -c $(openstack flavor list -f value -c Name) to get a report +on the flavor list compliance of the cloud environment.

The script flavor-names-openstack.py talks to the OpenStack API of the +cloud specified by the OS_CLOUD environment and queries properties and checks +the names for standards compliance. +It goes beyond the above example in checking that the discoverable +features of flavors (vCPUs, RAM, Disk) match what the flavor names claim. +This is used for SCS-compatible compliance testing.

Extensions

Extensions provide a possibility for providers that offer a very differentiated set +of flavors to indicate hypervisors, support for hardware/nested virtualization, +CPU types and generations, high-frequency models, GPU support and GPU types as +well as Infiniband support. (More extensions may be appended in the future.)

Using the systematic naming approach ensures that two providers that offer flavors +with the same specific features will use the same name for them, thus simplifying +life for their customers when consuming these flavors.

Note that there is no need to indicate all details and extra features this way. +Flavors may always perform better or have more features than indicated in a name. +Underperformance (CPU suffixes L or i or memory suffixes o and u) on the other +hand MUST be indicated in the name; this happens rarely in practice.

For smaller providers, the ability to e.g. differentiate between an AMD Milan and an intel +IceLake and exposed the slightly different feature set to customers and have slightly +different price points is often not worth the extra effort. This is because having +this extra differentiation causes fragmentation of the machines (host aggregates) +that can offer these flavors, thus resulting in a lower utilization (as the capacity +management will need to have a certain amount of headroom per machine pool to avoid +running out of capacity).

Note that it is possible for providers to register both the generic short names and the +longer, more detailed names and allow them to use the same set of machines (host aggregates). +Note that machines (hypervisors) can be part of more than one host aggregate.

The extensions have the format:

[_hyp][_hwv][_arch[N][h]][_[G/g]X[N][-M][h]][_ib]

Extensions are individually optional, but the ones that are used must appear in the order +given in the above line.

Remember that letters are case-sensitive. +In case you wonder: Feature indicators are capitalized, modifiers are lower case. +(An exception is the uppercase _G for a pass-through GPU vs. lowercase _g for vGPU.)

[OPTIONAL] Hypervisor

Format: _hyp

The default Hypervisor is assumed to be KVM. Clouds that offer different hypervisors +or Bare Metal Systems should indicate the Hypervisor according to the following table:

hypMeaning
kvmKVM
xenXen
vmwVMware
hyvHyper-V
bmsBare Metal System

Examples

  • SCS-2C-4-10n
  • SCS-2C-4-10n_bms
  • SCS-2C-4-10n_bms_z3h

[OPTIONAL] Hardware virtualization / Nested virtualization

Format: _hwv

If the instances that are created with this flavor support hardware-accelerated +virtualization, this can be reflected with the _hwv flag (after the optional +Hypervisor flag). On x86, this means that in the instance, the CPU flag vmx (intel) +or svm (AMD) is available. This will be the case on Bare Metal flavors on almost +all non-ancient x86 CPUs or if your virtualization hypervisor is configured to +support nested virtualization. +Flavors without the _hwv flag may or may not support hardware virtualization (as we +recommend enabling nesting, but don't require flavor names to reflect all +capabilities. Flavors may over-deliver ...)

Examples

  • SCS-2C-4-10 <- may or may not support HW virtualization in VMs
  • SCS-2C-4-10kvmhwv <- kvm with enabled nested virtualization
  • SCS-2C-4-10_hwv <- not recommended, but allowed
  • SCS-2C-4-10_bms_hwv <- better: bare metal with HW virt support (VMX on intel, SVM on AMD, ...)
  • SCS-2C-4-10_hwv_xen <- illegal, wrong ordering

[OPTIONAL] CPU Architecture Details

Format: _arch[N][h]

This extension provides more details on the specific CPU:

  • vendor/architecture (arch)
  • generation (N)
  • frequency (h)

Generation and Vendor

The options for arch are as follows:

Lettervendor/architectureCorresponding image architecture
(none)Generic x86-64x86_64
iIntel x86-64x86_64
zAMD (Zen) x86-64x86_64
aARM v8+aarch64
rRISC-V(not yet listed in Glance)

The generation is vendor specific and can be left out, but it can only be specified in +conjunction with a vendor. At present, these values are possible:

Generationi (Intel x86-64)z (AMD x86-64) a (AArch64)r (RISC-V)
0pre Skylakepre Zenpre Cortex A76TBD
1SkylakeZen-1 (Naples)A76/NeoN1 classTBD
2Cascade LakeZen-2 (Rome)A78/x1/NeoV1 classTBD
3Ice LakeZen-3 (Milan)A71x/NeoN2 (ARMv9)TBD
4Sapphire RapidsZen-4 (Genoa)TBD

It is recommended to leave out the 0 when specifying the old generation; this will +help the parser tool, which assumes 0 for an unspecified value and does leave it +out when generating the name for comparison. In other words: 0 has a meaning of +"rather old or unspecified".

note

We don't differentiate between Zen-4 (Genoa) and Zen-4c (Bergamo); L3 cache per +Siena core is smaller on Bergamo and the frequency lower but the cores are otherwise +identical. As we already have a qualifier h that allows to specify higher frequencies +(which Genoa thus may use more and Bergamo less or not), we have enough distinction +capabilities.

Frequency Suffixes

SuffixMeaning
h>2.75GHz all-core
hh>3.25GHz all-core
hhh>3.75GHz all-core

Examples

  • SCS-2C-4-10n
  • SCS-2C-4-10n_z
  • SCS-2C-4-10n_z3
  • SCS-2C-4-10n_z3h
  • SCS-2C-4-10n_z3hh
  • SCS-2C-4-10n_bms_z
  • SCS-2C-4-10n_bms_z3
  • SCS-2C-4-10n_bms_z3
  • SCS-2C-4-10n_bms_z3h
  • SCS-2C-4-10n_bms_z3hh <- Bare Metal, AMD Milan with > 3.25GHz all core freq

[OPTIONAL] GPU support

Format: _[G/g]X[N][-M][h]

This extension provides more details on the specific GPU:

  • pass-through (G) vs. virtual GPU (g)
  • vendor (X)
  • generation (N)
  • number (M) of processing units that are exposed (for pass-through) or assigned; see table below for vendor-specific terminology
  • high-performance indicator (h)

Note that the vendor letter X is mandatory, generation and processing units are optional.

letter Xvendorprocessing units
NnVidiastreaming multiprocessors (SMs)
AAMDcompute units (CUs)
IIntelexecution units (EUs)

For nVidia, the generation N can be f=Fermi, k=Kepler, m=Maxwell, p=Pascal, v=Volta, t=turing, a=Ampere, l=Ada Lovelace, ..., +for AMD GCN-x=0.x, RDNA1=1, RDNA2=2, RDNA3=3, +for Intel Gen9=0.9, Xe(12.1)=1, ... +(Note: This may need further work to properly reflect what's out there.)

The optional h suffix to the compute unit count indicates high-performance (e.g. high freq or special +high bandwidth gfx memory such as HBM); +h can be duplicated for even higher performance.

Example: SCS-16V-64-500s_GNa-14h +This flavor has a pass-through GPU nVidia Ampere with 14 SMs and either high-bandwidth memory or specially high frequencies. +Looking through GPU specs you could guess it's 1/4 of an A30.

[OPTIONAL] Infiniband

Format: _ib

This extension indicates Infiniband networking.

More extensions may be forthcoming and appended in a later revision of this spec.

Extensions need to be specified in the above-mentioned order.

Naming options advice

Note that we expect most clouds to prefer short flavor names, +not indicating CPU details or hypervisor types. See above list +of standard flavors to get a feeling.

However, more successful providers will often need to differentiate their +offerings in response to customer demand and allow customers to request +flavors with specific detailed properties. The goal of this proposal is to avoid +providers to invent their own names and then refer customers to (currently +incompletely standardized) extra_specs +or worse a non-machine-readable service descriptions to find out the details.

So a cloud provider might well evolve from offering SCS-8T-16-50 to offering +SCS-8T-16-50n, SCS-8T-16-50n_i2 and SCS-8T-16-50n_z2 to specify that he +is using network disks and offer a choice b/w intel Cascade-Lake and AMD Rome. +We would expect the cloud provider to still offer the generic flavor +SCS-8T-16-50 and allow the scheduler (placement service) to pick both more +specific types (or just one if e.g. capacity management considerations suggest +so). Providers in such cases should ensure that the price of a requested +flavor does not depend on the scheduler decisions.

We are looking into the metadefs +mechanism and extra_specs +to allow customers to ask for specific flavor properties without the need to +encode all these flavor details into the flavor name, so the optional pieces +may not be needed much. However, there must be a way to request flavor +properties without encoding the need into an image — the indirection via +an image is considered broken by the SCS team.

Proposal Examples

ExampleDecoding
SCS-2C-4-10n2 dedicated cores (x86-64), 4GiB RAM, 10GB network disk
SCS-8Ti-32-50p_i18 dedicated hyperthreads (insecure), Skylake, 32GiB RAM, 50GB local NVMe
SCS-1L-1u-51 vCPU (heavily oversubscribed), 1GiB Ram (no ECC), 5GB disk (unspecific)
SCS-16T-64-200s_GNa-64_ib16 dedicated threads, 64GiB RAM, 200GB local SSD, Infiniband, 64 Passthrough nVidia Ampere SMs
SCS-4C-16-2x200p_a14 dedicated Arm64 cores (A76 class), 16GiB RAM, 2x200GB local NVMe drives
SCS-1V-0.51 vCPU, 0.5GiB RAM, no disk (boot from cinder volume)

Previous standard versions

Previous versions up to version 3.0 contained the list of +mandatory/recommended flavors, which has been moved to +a standard of its own.

Version 1 of the standard +used a slightly different naming syntax while the logic was exactly the same. +What is a - in v2 used to be a :; _ used to be -. The reason for +the change was certain Kubernetes tools using the flavor names as labels. +Labels however are subject to stricter naming rules and in particular don't +allow for a :. See PR #190 +for a discussion.

Version 1 flavor names can be translated to v2 using the following transformation:

NAMEV2=$(echo "$NAMEV1" | sed -e 's/\-/_/g' -e 's/:/-/g' -e 's/^SCS_/SCS-/')

and the way back can be done with

NAMEV1=$(echo "$NAMEV2" | sed -e 's/\-/:/g' -e 's/_/-/g' -e 's/^SCS:/SCS-/')

For the time being, the validation tools still accept the old names with a warning +(despite the unchanged SCS- prefix) unless you pass option -2 to them. They will +however not count v1 flavors towards fulfilling the needs against the corresponding +v2 mandatory flavor list unless you pass the option -1. +In other words: An IaaS infrastructure with the 26 +v1 mandatory flavors will produce 26 warnings (for using old flavors) and 26 +errors (for missing the 26 mandatory v2 flavors) unless you pass -1 in which +case no errors and no warnings will be produced. Registering the 26 mandatory +v2 flavor names in addition will result in passing the test with only 26 +warnings — unless you specify -2. If you do and want to pass you'll need +to remove the old v1 names or rename them to no longer start with SCS-.

Beyond SCS

The Gaia-X provider working group which could have created a superseding standard +does no longer exist.

However, we have been reaching out to the OpenStack Public Cloud SIG and the ALASCA +members to seek further alignment.

Getting upstream OpenStack support for flavor aliases would provide more flexibility +and ease migrations between providers, also providers that don't offer the SCS- +flavors.

We also would like to see upstream extra_specs standardizing the discoverability of some +properties exposed via the SCS names and work on IaC tooling (terraform ...) +to make use of these when selecting a flavor.

+ + + + \ No newline at end of file diff --git a/standards/scs-0101-v1-entropy/index.html b/standards/scs-0101-v1-entropy/index.html new file mode 100644 index 0000000000..f735815ad6 --- /dev/null +++ b/standards/scs-0101-v1-entropy/index.html @@ -0,0 +1,78 @@ + + + + + +SCS Entropy | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

SCS Entropy

Introduction

Entropy in information technology

Entropy is a concept that is widely used in the scope of information +technology. It is a measurement of the amount of disorder or randomness in +a system. Entropy is used to measure the amount of information in a +self-contained system, as well as the amount of incertitude that exists in this +system.

Real-world uses of entropy

Cryptography is a very prominent, albeit not the only application that +heavily relies on entropy for operations such as creating secure keys. +When the available entropy runs out, said operations can stall and +take an abnormally long amount of time, which in turn can lead to +malfunctions, e.g., with OpenSSL or load balancers.

Sources of entropy

In traditional baremetal systems the amount of incertitude is sourced +from the randomness of the read/write cycles of the disk heads of a disk drive, +bus timings, or keyboard timings, to name a few.

More recent methods of generating entropy include measuring IRQ jitter +(available in Linux since kernel 5.4 or, before that, via a daemon such as +HavegeD) as well as dedicated CPU +instructions (available in virtually all major CPUs: RDSEED or RDRAND +on x86_64 and RNDR on arm64).

Finally, a dedicated device can be utilized — if present — that is +called hardware random number generator or HRNG for short. For instance, +the Trusted Platform Module +includes a HRNG. On Linux systems, the HRNG appears as /dev/hwrng. +Note that, while the dedicated CPU instructions can be construed as +a HRNG, they are not treated as such by the kernel, i.e., they do not +appear as /dev/hwrng!

The Linux kernel combines multiple sources of entropy into a pool. To this +end, it will use all of the sources discussed so far with one exception: +the HRNG must be fed into the pool (if so desired) via the daemon rngd. +The kernel converts the entropy from the pool into cryptographically +secure random numbers that appear under /dev/random and /dev/urandom.

With kernel 5.18, the algorithm that accomplishes +said conversion has been drastically improved (see +linux-rng-5.17-18), +so much so that running out of entropy is virtually ruled out. +These patches have now also arrived in the upstream LTS images.

Entropy in virtual instances

Virtual instances or virtual machines do not have the traditional sources +of entropy mentioned above. However, the more recent methods mentioned +above do work just fine (the CPU instructions are not privileged).

Alternatively, a virtualized HRNG called virtio-rng can be established +that injects entropy from the host into the instance, where this +entropy can be sourced optionally from either the host's /dev/random or +some HRNG in the host. This virtualized HRNG behaves just like a real +one, that is, it appears as /dev/hwrng, and the daemon rngd must +be used to feed it into the kernel's entropy pool.

On a side note, the kernel exposes available HRNGs via the special +directory /sys/devices/virtual/misc/hw_random. In particular, the +file rng_available lists availabe HRNGs while the file rng_current +contains the HRNG currently used.

In summary, with current kernels and CPUs entropy in virtual instances +is readily available to a sufficient degree. In addition, the host's +entropy sources can be injected using virtio-rng if so desired, e.g., +to enable access to a HRNG.

Motivation

As stated above, good sources of entropy are paramount for many +important applications. This standard ensures that sufficient entropy +will be available in virtual instances.

Entropy in SCS clouds

Flavors

It is recommended that all flavors have the following attribute:

hw_rng:allowed=True

The following attributes are optional:

hw_rng:rate_bytes - The allowed amount of bytes for the the guest
to read from the host's entropy per period.
hw_rng:rate_period - Sets the duration of a read period in seconds.

Images

It is recommended to use images having a kernel (patch level) version 5.18 +or up. This condition is already satisfied by every mandatory image defined +in the Image Metadata Standard.

It is recommended that images activate the attribute hw_rng_model: virtio.

The daemon rngd must be installed (usually from rng-tools +or rng-utils).

The user may choose to use the virtio-rng device via rngd.

Compute nodes

Compute nodes must use CPUs that offer instructions for accessing +entropy (such as RDSEED or RDRAND on x86_64 or RNDR on arm64), and +these instructions may not be filtered by the hypervisor. +If this requirement cannot be verified directly, then at least the +following two conditions must be satisfied in a virtual instance:

  1. The special file /proc/sys/kernel/random/entropy_avail must contain +the value 256 (pinned since kernel 5.18).

  2. The number of FIPS 140-2 failures must not exceed 3 out of 1000 blocks +tested, as determined by cat /dev/random | rngtest -c 1000 .

Compute nodes may provide a HRNG via rngd.

+ + + + \ No newline at end of file diff --git a/standards/scs-0102-v1-image-metadata/index.html b/standards/scs-0102-v1-image-metadata/index.html new file mode 100644 index 0000000000..bb3ee2db60 --- /dev/null +++ b/standards/scs-0102-v1-image-metadata/index.html @@ -0,0 +1,119 @@ + + + + + +SCS Image Metadata Standard | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

SCS Image Metadata Standard

Motivation

Many clouds offer standard Operating System images for their users' convenience. +To make them really useful, they should contain meta data (properties) to allow +users to understand what they can expect using these images.

The specification is targeting images that are managed by the service provider, +provided for public consumption. The spec or parts of it however might turn out +to be useful whenever someone manages images for somebody else's consumption.

Overview

We categorize the image properties into a few buckets

  • Technical requirements and features
  • Image handling aspects
  • Licensing/Maintenance/Support aspects

Naming

We suggest plain OS images to be named "Distribution Version", +e.g. "openSUSE Leap 15.3" or "Ubuntu 20.04" or "CentOS 8", "Windows Server 2012R2". +We do not normally recommend to add more detailed patch levels into the name.

Special variants that include specific non-standard features should be named +"Distribution Version Feature1 Feature2".

There are several policies possible to provide updated images to include the latest +bug- and security fixes. This is outlined in update policy description below.

Technical requirements and features

This is dependent on whether we deal with VM images or container images.

For VM images (OpenStack), we recommend to use the properties as described +in the OpenStack Image documentation.

The following properties are considered mandatory:

  • architecture, hypervisor_type
  • min_disk_size (in GiB), min_ram (in MiB)
  • os_version, os_distro
  • hw_rng_model, hw_disk_bus (scsi recommended, and then setting hw_scsi_model is also recommended)

Note: Disk sizes tend to be measured in GB = 10^9 and not GiB = 2^30 in the disk industry, but OpenStack uses GiB.

The following properties are recommended (if the features are supported):

  • os_secure_boot, hw_firmware_type
  • hw_watchdog_action, hw_mem_encryption, hw_pmu, hw_video_ram, hw_vif_multiqueue_enabled

The trait:XXX=required property can be used to indicate that certain virtual hardware +features XXX are required.

Image handling

Image updating

It is recommended that provider managed images are regularly updated. +This means that users referencing an image by name will always get the latest image for the +operating system indicated by that name (which includes a version number, but not the patch +level).

Technically, the thus updated image is a new image and will thus carry a new UUID. +It is recommended that the old image gets renamed (e.g. build date or patch level attached) +and hidden (os_hidden=true), but remains accessible via its (unchanged) UUID for some +time.

The update handling by the provider is described via the properties replace_frequency, +uuid_validity, provided_until, and hotfix_hours.

The replace_frequency, provided_until, and hotfix_hours fields reference to the image +as referenced by its name.

replace_frequencymeaning
yearlythe image will get replaced at least once per year
quarterlythe image will get replaced at least once per quarter
monthlythe image will get replaced at least once per month
weeklythe image will get replaced at least once per week
dailythe image will get replaced at least once per day
critical_bugthe image will get replaced for critical issues only
neverthe image referenced by name will never change (until the date provided_until)

Note the at least wording: Providers can replace images more often. +The frequency is starting from the first release; so an image published on 2021-04-14 with an +update frequency of monthly, should be replaced no later than 2021-05-14. Due to weekends +etc., up to 3 days later is not considered a violation of this policy. So a valid sequence +from an image with monthly update frequency might be 2021-04-14, 2021-05-14, 2021-06-15, +2021-07-14, 2021-07-27 (hotfix), 2021-08-13 ...

Promises to update the registered public images typically depend on upstream image providers +(Linux distributors, OS vendors) keeping their promises to build and provide updated images. +Failures from upstream are not a reason to claim the cloud provider to be in violation of his +promises. However, if the provider observes massive upstream failures (which can e.g. cause +increased security risks), we advise the provider to inform the users.

We recommend updating images at least monthly.

The hotfix_hours field indicates how providers deal with critical security issues +that affect the images; it is an optional field that contains a numerical value, indicating +how quickly (in hours) a new image is provided after the latter of the points in time that +the issue becomes public and a tested fix is available as maintenance update from the upstream +distribution. A value of 0 indicates a best-effort approach without firm SLAs; the field not +being present indicates no commitment. A value of 48 would indicate that the provider +commits to a new image within 48hrs. A critical issue is defined as a security vulnerability +with a CVSS score of 9.0 or higher that affects a package that is included in the image.

The provided_until field is supposed to contain a date in YYYY-MM-DD format that +indicates until when an image under this name will be provided and (according to the +replace_frequency) updated at least. (Providers are free to provide updates for +longer or leave the non-updated image visible for longer.) +If this field is set to none, no promises are made, if it is set to notice, updates +will be provided until a deprecation notice is published. (The values are the same as +for below uuid_validity, except that forever and last-N don't make any sense.)

The uuid_validity field indicates how long the public image will be referencable +by it's UUID.

uuid_validitymeaning
noneUUID will only be valid as long as the content does not change
last-NThe last N images for newer replacement will remain accessible via UUID
YYYY-MM-DDUUID will be valid until at least the date YYYY-MM-DD
noticeUUID will remain valid until a deprecation notice will be published
foreverUUID will remain valid for as long as the cloud operates

Note that the old images must be hidden from the image catalogue or renamed (or both) +to avoid failing referencing by name. Note that last-N may be limited by the provided_till +date.

The three properties uuid_validity, provided_until and replace_frequency are mandatory; +the field hotfix_hours is optional.

All dates are in UTC.

Example

Providing an image with name OPSYS MAJ.MIN with +replace_frequency=monthly, provided_until=2022-09-30, uuid_validity=2022-12-31, +hotfix_hours=0 +means that we will have a new image with this name at least once per month (starting from +the initial release) until the end of September 2022. Old images will be hidden and/or +renamed, but remain accessible via their UUID until at least the end of 2022 (in Universal Time). +The provider makes an effort to replace images upon critical security issues out of order.

Image Origin

  • Mandatory: image_source needs to be a URL to point to a place from which the image can be downloaded. +(Note: This may be set to the string "private" to indicate that the image can not be freely +downloaded.)

  • Mandatory: image_description needs to be an URL (or text) with release notes and other human readable +data about the image.

  • Recommended tag: managed_by_VENDOR

Note that for most images that come straight from an upstream source, image_description should point +to a an upstream web page where these images are described. If download links are available as well +on that page, image_source can point to the same page, otherwise a more direct link to the image +should be used, e.g. directly linking the .qcow2 or .img file. +If providers have their own image building machinery or do some post-processing on top of +upstream images, they should point to the place where they document and offer these images.

Image build info

  • Mandatory: image_build_date needs to be YYYY-MM-DD or YYYY-MM-DD hh:mm[:ss] (time in UTC, +24hrs clock). +All publicly released and generally recommended patches before this date must be included in the +image build. If the cutoff date is earlier, this cutoff date needs to be set instead, even +if the actual build happens significantly after the cutoff date. If not all patches can be +included for a good reason, then the patchlevel field (see below) must be used to describe +the patch status.

  • Mandatory: image_original_user is the default login user for the operating system which can connect +to the image via the injected SSH key or provided password. (This can be set to none if no default +user name exists for the operating system.)

  • Optional: patchlevel can be set to an operating specific patch level that describes the +patch status — typically we would expect the image_build_date to be sufficient.

  • Recommended: os_hash_algo and os_hash_value: The sha256 or sha512 hash +for the image file. (This references the image file in the format it is stored in, we +recommend raw over qcow2 for systems that use ceph.) Note that these values are +typically generated automatically upon image registration.

  • Recommended tag: os:OPERATINGSYSTEM

Licensing / Maintenance subscription / Support

Some images require a license; in many cases the cloud providers include the license cost +by a per-use (e.g. hourly) fee. However, it is also possible sometimes that customers +use their own license agreements with the OS vendor with a bring-your-own-license (BYOL) +program. These properties may be attached to the image. Note that free Linux images +might not use any of these properties, except maybe maintained_until. Note that +Windows images would typically require license_included, subscription_included. +A boolean property that is not present is considered to be false.

  • Optional: license_included (boolean) indicates whether or not the flavor fee +includes the licenses required to use this image. This field is mandatory for +images that contain software that requires commercial licenses.
  • Optional: license_required (boolean) indicates whether or not a customer must bring +its own license to be license compliant. This can not be true at the same time as the +previous setting. This field is mandatory IF customers need to bring their own +license to use the image.
  • Optional: subscription_included (boolean) indicates that the image contains already +a maintenance subscription which typically gives access to bug fixes, security +fixes and (minor) function updates. If a subscription is included, the CSP should +have prepared the image to also receive the provided maintenance updates from the +vendor (optionally via a mirror).
  • Optional: subscription_required (boolean) indicates that the customer requires +a maintenance subscription from the OS vendor in order to receive fixes +(which is often also a prerequisite to be eligible for support).
  • Optional: maintained_until: YYYY-MM-DD promises maintenance from the OS vendor +until at least this date (in UTC).
  • Optional: l1_support_contact contains a URI that provides customer support +contact for issues with this image. Note that this field must only be set if the +service provider does provide support for this image included in the image/flavor +pricing (but it might be provided by a contracted 3rd party, e.g. the OS vendor).

Conformance Tests

The script image-md-check.py retrieves the +image list from a configured cloud and checks each image for the +completeness and consistency of mandatory properties.

+ + + + \ No newline at end of file diff --git a/standards/scs-0103-v1-standard-flavors/index.html b/standards/scs-0103-v1-standard-flavors/index.html new file mode 100644 index 0000000000..8924b4874c --- /dev/null +++ b/standards/scs-0103-v1-standard-flavors/index.html @@ -0,0 +1,70 @@ + + + + + +SCS Standard Flavors and Properties | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

SCS Standard Flavors and Properties

Introduction

Motivation

In OpenStack environments there is a need to define different flavors for instances. +The flavors are pre-defined by the operator, the customer can not change these. +OpenStack providers thus typically offer a large selection of flavors.

While flavors can be discovered (openstack flavor list), it is helpful for users (DevOps teams), +to have a guaranteed set of flavors available on all SCS clouds, so these need not be discovered.

Properties (extra specs)

The following extra specs are recognized, together with the respective semantics:

  • scs:name-vN=NAME (where N is 1 or 2, and NAME is some string) means that the +flavor is one of the +standard SCS flavors, and the requirements of Section "Standard SCS flavors" below apply.
  • scs:cpu-type=shared-core means that at least 20% of a core in >99% of the time, +measured over the course of one month (1% is 7,2 h/month). The cpu-type=shared-core +corresponds to the V cpu modifier in the flavor-naming spec, +other options are crowded-core (L), dedicated-thread (T) and dedicated-core (C).
  • scs:diskN-type=ssd (where N is a nonnegative integer, usually 0) means that the +root disk N must support 1000 sequential IOPS per VM and it must be equipped with +power-loss protection; see scs-0110-v1-ssd-flavors. +The diskN-type=ssd setting corresponds to the s disk modifier, other options +are nvme (p), hdd (h) and network (n). Only flavors without disk and +those with diskN-type=network can be expected to support live-migration.

Whenever ANY of these are present on ANY flavor, the corresponding semantics must be satisfied.

Standard SCS flavors

These are flavors that must exist on standard SCS clouds (x86-64).

Mandatory

Recommended namevCPUsvCPU typeRAM [GiB]Root disk [GB]Disk type
SCS-1V-41shared-core4
SCS-2V-82shared-core8
SCS-4V-164shared-core16
SCS-4V-16-100s4shared-core16100ssd
SCS-8V-328shared-core32
SCS-1V-21shared-core2
SCS-2V-42shared-core4
SCS-2V-4-20s2shared-core420ssd
SCS-4V-84shared-core8
SCS-8V-168shared-core16
SCS-16V-3216shared-core32
SCS-1V-81shared-core8
SCS-2V-162shared-core16
SCS-4V-324shared-core32
SCS-1L-11crowded-core1
Recommended namevCPUsvCPU typeRAM [GiB]Root disk [GB]Disk type
SCS-1V-4-101shared-core410(any)
SCS-2V-8-202shared-core820(any)
SCS-4V-16-504shared-core1650(any)
SCS-8V-32-1008shared-core32100(any)
SCS-1V-2-51shared-core25(any)
SCS-2V-4-102shared-core410(any)
SCS-4V-8-204shared-core820(any)
SCS-8V-16-508shared-core1650(any)
SCS-16V-32-10016shared-core32100(any)
SCS-1V-8-201shared-core820(any)
SCS-2V-16-502shared-core1650(any)
SCS-4V-32-1004shared-core32100(any)
SCS-1L-1-51crowded-core15(any)

Guarantees and properties

The figures given in the table (number of CPUs, amount of RAM, root disk size) must match +precisely the corresponding figures in the flavor.

In addition, the following properties must be set (in the extra_specs):

  • scs:name-v1 to the recommended name, but with each dash AFTER the first one replaced by a colon,
  • scs:name-v2 to the recommended name,
  • scs:cpu-type to shared-core or crowded-core, reflecting the vCPU type,
  • scs:disk0-type not set if no disk is provided, otherwise set to ssd or some other +value, reflecting the disk type.

Remarks

We expect the most used vCPU:RAM[GiB] ratio to be 1:4.

Note that all vCPUs of SCS standard flavors are oversubscribed — the smallest 1L-1 +flavor allows for heavy oversubscription (note the L), and thus can be offered very +cheaply — imagine jump hosts ...

The design allows for small clouds (with CPUs with 16 Threads, 64GiB RAM +compute hosts) to offer all flavors.

Except for the two flavors with SSD root volume, disks types are not specified +(and expected to be network disks (Ceph/Cinder) or local SATA/SAS disks typically).

We only included a limited variation of disk sizes — this reflects that +for the standard networked cinder +disks, you can pass block_device_mapping_v2 on server (VM) creation to +allocate a boot disk of any size you desire. We have scaled the few +recommended disk sizes with the amount of RAM. For each flavor there is +also one without a pre-attached disk — these are meant to be used +to boot from a volume (either created beforehand or allocated on-the-fly +with block_device_mapping_v2, e.g. +openstack server create --flavor SCS-1V-2 --block-device-mapping sda=IMGUUID:image:12:true +to create a bootable 12G cinder volume from image IMGUUID that gets tied to the VM +instance life cycle.)

Conformance Tests

The script flavors-openstack.py will read the lists of mandatory and recommended flavors +from a yaml file provided as command-line argument, connect to an OpenStack installation, +and check whether the flavors are present and their extra specs are correct. Missing +flavors will be reported on various logging channels: error for mandatory, info for +recommended flavors. Incorrect extra specs will be reported as error in any case. +The return code will be non-zero if the test could not be performed or if any error was +reported.

Operational tooling

The openstack-flavor-manager is able to +create all standard, mandatory SCS flavors for you. It takes input that can be generated by +flavor-manager-input.py.

Previous standard versions

The list of standard flavors used to be part of the flavor naming standard up until +version 3. The following changes have been made to +the list in comparison with said standard:

  • the flavor names have been turned into recommendations, and
  • the properties have been introduced in order to help discoverability.

Note that the flavors with fixed size root disks have all moved to Recommended +with scs-0100-v3. +This means that they are not a certification requirement any longer, +but we still recommend implementing these for backwards compatibility reasons. +Also in that standard, two flavors with SSD+ root disks have been added, as defined in +scs-0110-v1-ssd-flavors.md

+ + + + \ No newline at end of file diff --git a/standards/scs-0104-v1-standard-images/index.html b/standards/scs-0104-v1-standard-images/index.html new file mode 100644 index 0000000000..db686a09c7 --- /dev/null +++ b/standards/scs-0104-v1-standard-images/index.html @@ -0,0 +1,52 @@ + + + + + +SCS Standard Images | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

SCS Standard Images

Introduction

The Sovereign Cloud Stack (SCS) provides standards for a range of cloud infrastructure types. +It strives for interoperable and sovereign cloud offerings which can be deployed and used by a wide range of organizations and individuals.

To this end, SCS unifies the naming and sourcing of virtual machine images, and for certain images their presence is mandated or recommended.

Motivation

Following the example of the SCS standards YAML, +this standard establishes, by means of a YAML file, a mechanism with the following main objectives:

  • to maintain a list of mandatory, recommended, and optional images, which also fixes the source location,
  • to provide a machine-readable document for further processing (e.g. for a compliance tool suite or continuous integration).

Uploading custom images

Image upload via Glance MUST be allowed. If quotas are imposed at all, the following rule applies: +It MUST be possible to upload at least 40 images and at least 200 GiB total.

Standard images YAML

The YAML file MUST contain the key images, whose value is a list of objects. Each object has one of two forms, as described below.

Image specification, single image

KeyTypeDescriptionExample
nameStringName of the image"Debian 12"
statusStringoptional: either mandatory or recommended"recommended"
sourceStringPrefix of the source URL"https://cloud.debian.org/images/cloud/bookworm/"
OR: List of stringsmultiple possible prefixes(see full example below)

The meaning of this specification is as follows.

  1. If the status is mandatory, then the image MUST be present.
  2. If an image by the name given is present, then its image_source property +(as described in the Image Metadata standard) +MUST start with one of the prefixes given via source.

Image specification, class of images

KeyTypeDescriptionExample
nameStringName of the class of images"ubuntu-2204-kube"
name_schemeString (regex)Regular expression for the image name"ubuntu-2204-kube-v[0-9].[0-9]+(.[0-9]+)?"
statusStringoptional: either mandatory or recommended"recommended"
sourceStringPrefix of the source URL"https://swift.services.a.regiocloud.tech"
OR: List of stringsmultiple possible prefixes(see full example below)

The meaning of this specification is as follows:

  1. If the status is mandatory, then at least one image MUST be present whose name +matches the regular expression given via name_scheme.
  2. For any image whose name matches the regular expression given via name_scheme, +its image_source property MUST start with one of the prefixes given via source.

Full example

images:
- name: "Ubuntu 22.04"
source:
- https://cloud-images.ubuntu.com/releases/jammy/
- https://cloud-images.ubuntu.com/jammy/
status: mandatory
- name: "ubuntu-capi-image"
name_scheme: "ubuntu-capi-image-v[0-9].[0-9]+(.[0-9]+)?"
source: https://swift.services.a.regiocloud.tech/swift/v1/AUTH_b182637428444b9aa302bb8d5a5a418c/openstack-k8s-capi-images/ubuntu-2204-kube
status: recommended
- name: "Ubuntu 20.04"
source:
- https://cloud-images.ubuntu.com/releases/focal/
- https://cloud-images.ubuntu.com/focal/
- name: "Debian 12"
source:
- https://cloud.debian.org/images/cloud/bookworm/
- https://cdimage.debian.org/cdimage/cloud/bookworm/
- name: "Debian 11"
source:
- https://cloud.debian.org/images/cloud/bullseye/
- https://cdimage.debian.org/cdimage/cloud/bullseye/

This example provides allowable source prefixes for two Debian versions, two Ubuntu +versions, and for any version of the Kubernetes cloud API provider. Only the latter is +recommended, while only Ubuntu 22.04 is mandatory.

Lifecycle considerations

YAML lifecycle

The YAML file is generally located in this repository under /Tests/iaas.

Any change that could render existing installations non-conformant (i.e., when new +specifications are added, when the name scheme of a specification is changed so as to +match more names than before, when the status of an existing specification changes to +mandatory, or when some source prefix is removed) requires a new YAML file to be created. +As a consequence, any currently valid certificates stay valid; the change can only take +effect in a new version of the certificate in question, if so desired.

Image lifecycle

It is important to note that this standard does not prohibit any images, and neither +does it preclude the operator from providing any and all optional images.

It is possible that a specification is mandatory in one version and non-mandatory in the +next version. This standard makes no statement as to what is supposed to happen to the +corresponding images in a live cloud environment. It is recommended to keep the +once-mandatory images in the live environment. As for new environments, it is up to the +operator whether to provide any or all of these images, as stated above.

Conformance Tests

The script images-openstack.py will read the lists of mandatory and recommended images +from a yaml file provided as command-line argument, connect to an OpenStack installation, +and check whether the images are present. Missing images will be reported on various +logging channels: error for mandatory, info for recommended images. Additionally, images +whose image_source does not conform with the specifications will be reported on the +error channel. The return code will be non-zero if the test could not be performed or +if any errors have been reported.

Operational tooling

The openstack-image-manager is able to +create all standard, mandatory SCS images for you given image definitions from a YAML file.

+ + + + \ No newline at end of file diff --git a/standards/scs-0110-v1-ssd-flavors/index.html b/standards/scs-0110-v1-ssd-flavors/index.html new file mode 100644 index 0000000000..fea379a53c --- /dev/null +++ b/standards/scs-0110-v1-ssd-flavors/index.html @@ -0,0 +1,174 @@ + + + + + +SSD Flavors | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

SSD Flavors

Introduction

SCS defines an IaaS Flavor Naming standard that mandates a number of standard flavors +to be available in each SCS-compliant IaaS offering. While offering or exposing +IaaS is not a requirement for SCS-compliant infrastructure offerings — SCS allows +for platforms only exposing the container layer (plus S3 compatible object storage) +for wave 2 (container-based) cloud-native workloads -- +the SCS reference implementation does include a complete IaaS implementation that +many providers want to expose as they have customers desiring access at this layer +for wave 1 (VM-based) cloud-native workloads or for the virtualization of more +classical (not cloud-native) workloads. The IaaS implementation thus comes with +standards.

This Decision Record is about adding a few mandatory flavors on the IaaS level +that include flavors with local SSD (or better) storage.

Motivation

The currently defined standard flavors +do not include +flavors that use local storage. For certain workloads such as databases or big data +filesystems, local storage is highly desirable as replication may be handled at +the application layer, making replication/redundancy in a networked storage solution +(ceph in the SCS reference implementation) an unneeded and undesired property. +Furthermore, write access to networked and replicated storage typically incurs +a certain latency, as the writes can only be acknowledged once all the replicas +have confirmed that the data has hit stable storage. Write latency is critical +for e.g. relational database performance.

The main purpose for the IaaS layer in SCS is to perform as a solid foundation +to provide and manage kubernetes container clusters in a multi-tenant scenario. +As such the standards at the IaaS layer should ensure that all the needed +types of resources are available for the container clusters. This is not +currently the case: In a scenario with multiple k8s control-plane nodes set +up via kubeadm (as part of the k8s cluster-api automation), the control plane +nodes each run an etcd instance and together form an etcd cluster.

etcd is sensitive to scheduling, network and storage latencies. While network +latencies and scheduling latencies have not been observed to be an issue in +clusters within one cloud region, the storage latency is. With remote networked +storage as delivered from ceph, the long tail of write latency causes etcd +to often time out heartbeats, causing a new leader election with a leader +change, preventing control plane changes on k8s for a few seconds. Too many +leader changes can slow down cluster operation and even bring it to a halt.

The etcd requirements are well documented. +In particular, over a hundred of sequential IOPS are recommended. This +requires write latencies in the range of a single-digit ms (or better).

Design Considerations

Options considered

One-node etcd (backed by redundant storage)

If k8s uses only one control plane node, there will only be only one etcd node, +avoiding timed out heartbeats. Single node control planes are typically not +recommended for production workloads though. They are limited with respect +to control plane performance, have a higher chance to fail (as a single node failure +can create cluster control-plane downtime) and can not undergo rolling upgrades.

Though not the normal setup with kubeadm, it is possible to use a multi-node +control plane using a single-node etcd. This shares some of the challenges of +single-node control-planes, although recovery may be faster to perform at least +in scenarios where the etcd backend storage is redundant and not affected by the +single-node outage.

Neither scenario fulfills typical requirements for production workloads.

RAM (tmpfs) etcd storage

etcd could keep its database in volatile memory (e.g. on a tmpfs filesystem). +For multi-node etcd clusters, this could actually be made work, as long as at +least one cluster member stays alive and proper care is taken to remove shut-down +nodes from the cluster. A loss of power affecting all nodes or a hardware +maintenance operation not tracking etcd needs would result in a complete +loss of all cluster state. The control plane nodes would require live migration +to avoid this in the maintenance case. For the power loss scenario, a frequent +backup might mitigate the cluster state loss case somewhat.

The etcd database is normally limited to 2GiB in size, which is something +that is realistic to keep in main memory. (Typical database sizes are +much smaller.)

This option requires additional care and may not be suitable for all +production scenarios, but would seem a possible fallback position for +etcd. It does obviously not address the database scenario.

Heartbeat slowdown

To avoid causing too many fail-overs by occasional high latencies, the +frequency of heartbeats can be lowered from the default 1/100ms. +The reelection timeout should change along with it (typically set to +10 beats).

This will cause etcd to take a bit more time to notice the loss of a node, +which is not typically critical if done within reasonable limits. +This change however does not fully address the issue — occasional write latencies +above 100ms will still cause failed heartbeats, just less often.

This change has been implemented in SCS's +k8s-cluster-api-provider +reference implementation: The heartbeat has been changed from 1/100ms (10/s) +to 1/250ms (4/s) and the reelection timeout from 1s to 2.5s.

The etcd process also is afforded a higher CPU priority (lower niceness), +resulting in a lower scheduling latency, as high-prio processes preempt lower-prio +ones when they get woken up. The etcd process also gets its IO priority +increased to get treated preferentially in case the IO scheduler has many +outstanding requests. This has some positive effects with the CFQ IO scheduler.

The slower heartbeat and the priority tweaks do lower the amount of leader +changes but are insufficient to completely address the issue on the tests +performed against networked ceph-backed storage.

Filesystem tuning

Databases must ensure that certain data has hit stable storage before acknowledging +writes — this is required in order to live up to the ACID +guarantees in situations when disruptions might happen. Databases typically use +fsync() calls to ensure that write buffers are written to real persistent storage +unless they use raw/direct block devices circumventing Linux's page and buffer cache.

etcd normally uses a write-ahead-log (WOL) file that lives on a Linux filesystem and +uses fsync to ensure the correct write ordering. Trouble with fsync is that it +also causes unrelated data to be written out with most existing Linux filesystems, +adding to the latency.

It is possible to tell the Linux filesystems to not wait for all data to have hit +storage before returning from fsync() calls. This avoids the latency caused by +fsync but also subverts the very reason for using fsync: In case of a disruption +(OS crash, power outage, loss of connection to storage, ...), the state is likely +not consistent, as the kernel has lied to the application about data having been +written out. Recovery from such a scenario can range from smooth to impossible.

In a multi-node cluster, this may not be as bad as it sounds — if only one +node is affected by a disruption, the crashed node can be recovered by resyncing +the data from other nodes. In practice an inconsistent state would be considered +too risky and it should be preferred to set up a fresh node to join the +existing etcd cluster. This would need to be implemented to make this option +less risky.

The reference implementation has an option to use these unsafe filesystem settings. +However, they are not enabled by default for good reasons.

Flavors with local storage

Flavors with local storage will have their root filesystem on a local storage +device. To fulfill the need for high IOPS that etcd and especially databases +have, the local storage device should be a solid state device — an SSD or +NVMe device. While some use cases might even be fulfilled with local +spinning disks (or raid arrays of local spinning disks).

Local solid state storage avoids any network overhead and offers best latency. +It however is not typically redundant, meaning that the loss of the device +or the complete hardware node will result in data loss. So it is meant to +be used with applications such as database clusters, replicating filesystems +or block devices or etcd which can handle this at the application layer.

The flavor naming spec in SCS allows performance to be understated — a +flavor with NVMe storage can be advertised under the SSD storage name +(and of course can be offered under both names).

Note that this addresses the simple case where the root disk with the +root filesystem (and possibly additional filesystems that are set up +when first booting) uses the local storage. Scenarios where additional +low-latency networked or local storage are made available via cinder +and attached for database storage are possible and viable options for +some scenarios, but not covered here.

Decision

Two new mandatory flavors: SCS-2V-4-20s and SCS-4V-16-100s are added +to the SCS flavor naming standard. The first is meant to be a good fit for +k8s control nodes with etcd while the latter is a solid base for a +small database server. Clouds claiming SCS-compliance for their IaaS +layer MUST provide these two additional flavors.

Obviously providers MAY offer many more combinations and e.g. create +flavors with large local SSDs.

The local storage advertised this way MUST support more than +1000 sequential IOPS per VM of both new mandatory types (which means a +write latency lower than 1ms — this typically means SSDs/NVMEs that +support at least several 10ks of parallel IOPS, not a challenge for +current hardware).

Local disks, SSDs, NVMes MUST have Power-Loss-Protection such that +data reported to be written, but in reality being stored in RAM or SLC +cache of an SSD or NVMe, is guaranteed to not be lost in case of a power +loss.

Like with networked storage, the provider must ensure that data +from previous users is not accessible (e.g. by securely erasing it +or by using a different encryption key) when local storage gets +allocated to a new VM.

Out of Scope

Hardware nodes (hypervisors in OpenStack language) that support flavors +with local storage (are part of an appropriate OpenStack host aggregate) +may have many VMs competing for bandwidth to the attached local storage +devices; the host needs to be configured such that it can sustain VMs +writing at full speed without causing the host to be overloaded or +to cause huge queues for these writes.

A more generic approach is to apply storage QoS policies to the VMs to +manage bandwidth and IOPS and create the ability to have better +performance isolation with certain guarantees. While this is desirable, +it has not been found a necessity for etcd in our tests. +Disk IO QoS is not part of this spec but may be considered in another one.

Live-migration with local storage is significantly more difficult than with +networked storage: The contents of the local disks also need to be replicated +over to the new host. Live-migration for these VMs may thus take significantly +longer or not be possible at all, depending the configuration from the provider. +Not supporting live-migration is OK for flavors with local disks according +to the flavor naming spec — a capability to indicate whether or not +live-migration is supported will be subject to a flavor-metadata discoverability +spec that is planned for the future.

Implementation note

Local storage in OpenStack can be provided directly via nova or via the +cinder service. While the latter has the advantage of making volumes +visible and manageable via most of the normal cinder capabilities, it +has the disadvantage of creating an indirection via iSCSI. This +results in higher latency. The requirements in the above spec are +not meant to mandate or prevent the implementation via either route.

The flavors will be added as mandatory flavors to the +flavor-naming standard, +which will thus have to be released in a v3.

The IOPS and Power-Loss requirements from this decision should become +part of the flavor-naming standard for disk type s.

When we standardize storage types in the future, additional possibilities +to solve the latency requirements for databases and etcd may emerge.

When we standardize QoS features there, we may amend this standard with +QoS recommendations or possibly requirements.

A future flavor metadata discoverability standard will indicate whether or not +these flavors can be live-migrated. A future VM metadata standard will allow +users to request live-migration and/or cold migration or restart to be or to +not be performed.

Conformance Tests

The list of mandatory flavors that needs to be present should be added to the +SCS-Spec.MandatoryFlavors.yaml +spec as soon as this ADR becomes part of the certification requirements.

Checks for conforming with IOPS and purging requirements will require +test instances to be launched and might become part of a monitoring +solution.

+ + + + \ No newline at end of file diff --git a/standards/scs-0110/index.html b/standards/scs-0110/index.html new file mode 100644 index 0000000000..ed41419f1c --- /dev/null +++ b/standards/scs-0110/index.html @@ -0,0 +1,26 @@ + + + + + +SCS-0110 | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/standards/scs-0111-v1-volume-type-decisions/index.html b/standards/scs-0111-v1-volume-type-decisions/index.html new file mode 100644 index 0000000000..5972673581 --- /dev/null +++ b/standards/scs-0111-v1-volume-type-decisions/index.html @@ -0,0 +1,27 @@ + + + + + +Decisions for the Volume Type Standard | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Decisions for the Volume Type Standard

Introduction

Volumes in OpenStack are virtual drives. They are managed by the storage service Cinder, which abstracts creation and usage of many different storage backends. While it is possible to use a backend like lvm which can reside on the same host as the hypervisor, the SCS wants to make a more clear differentiation between volumes and the ephemeral storage of a virtual machine. For all SCS deployments we want to assume that volumes are always residing in a storage backend that is NOT on the same host as a hypervisor - in short terms: Volumes are network storage. Ephemeral storage on the other hand is the only storage residing on a compute host. It is created by creating a VM directly from an Image and is automatically los as soon as the VM cease to exist. Volumes on the other hand have to be created from Images and only after that can be used for VMs. They are persistent and will remain in the last state a VM has written on them before they cease to exit. Being persistent and not relying on the host where the VM resides, Volumes can easily be attached to another VM in case of a node outage and VMs be migrated way more easily, because only metadata and data in RAM has to be shifted to another host, accelerating any migration or evacuation of a VM.

Volume Types are used to classify volumes and provide a basic decision for what kind of volume should be created. These volume types can sometimes very be backend-specific and it might be hard for a user to choose the most suitable volume type, if there is more than one default type. Nevertheless the most of configuration is done in the backends themself, so volume types only work as a rough classification.

Motivation

We want to standardize a few varieties of volume types. While a user can choose simple things like size when creating a volume, Volume Types define a few broader aspects of volume. Encryption of volumes for example is solely decided by the volume type. And whether the volume will be replicated is a mix between definiton in the volume type and backend specific configuration, but it's visiblity can only be reached in the volume type.

In General: what the different volume types are capable of is highly dependend on both the used backend and the configurations of OpenStack. A few options are worth being at least recommended.

Design Considerations

We want to have a discoverable Standard. So there should be no naming conventions as per request by operators.

This first decision will have impacts on upstream OpenStack development, as those things, that would be nice to discover, may not be currently dicoverable by users or not at all.

There are severel aspects of volume types, which will be discussed in the following:

Options considered

Encryption

Encryption for volumes is an option which has to be configured within the volume type. As an admin it is possible to set encryption-provider, key size, cipher and control location. As an admin it is also currently possible to see these configurations in a volume type with list and show commands. A user should not see these parameters in detail, but a boolean value that descibes whether encryption is used or not. Currently this is not possible in upstream OpenStack.

Conclusion: This is a solid aspect to be standardized. But it will need work on OpenStack, to have a boolean value presented to the users.

Backend Name

OpenStack Cinder works with a lot of different backends. They all have some kind of special features, which might be attractive for a user. But showing the name of the backend to users is also considered a security risk by Cinder developers. Overall it is always an option to make users aware of special features through the name and description of a volume type and sometimes even through extra_specs.

Conclusion: This should not be standardized.

Availability Zones

Availability Zones are used in Nova and Cinder seperatly to provide an often also physical separation of compute hosts or storage nodes. This leads to two options to consider:

  1. Multiple Volume AZs: This might be used if there are different backends present in one IaaS structure. The different volume types are usually used for the different volume AZs. This makes migration between those AZs only be possible for administrators.

  2. Volume Types that can be attached to multiple Nova Azs: This option can be seen in the extra specs of a volume type also by normal users. Another option is to use backend specific options, as for example with ceph that directly interacts with nova for this. In that case there will not be any visible extra specs for the users.

Another question is how many providers use one of these options or both.

Conclusion: The first part doesn't make much sense to standardize, as migration between the volume types can only be done by admins. However the second part might be noteable, but due to the variety of configuration options very hard to standardize.

Multiattach

It is possible in a few backends to attach a volume to multiple VMs. This has to be configured in the Volume Type and this information is also accessable for users. Nevertheless this option also needs a lot of work from users, as those types of volumes have to have a file system, that is capable of multiattach. Many providers don't provide multiattach.

Conclusion: It might be noteable, that this already is a discoverable option.

Replication

Replication states, whether or not there are multiple replicas of a volume. Thus answers the question, whether the data could survive a node outage. Again there are different ways to achive replicated volumes. It can either be defined in the volume type and is discoverable also by normal users or it is configured in the backend. The last option is usually used with ceph for example. This makes it hard to discover, whether a volume is replicated or not. Another point is the number of replicas, that exist.

Conclusion: Replication is a good option to be standardized. Whether this should be done as a boolean option or if the number of replicas is also something users need to know should still be discussed. Nevertheless due to the different options to configure replication this will be quite complex.

QoS

Quality of Service parameters can be stated in a volume qos object. These objects can then be associated to a volume type (or directly to a volume as an admin only option). But this is optional and thus even good or very good volume QoS parameters that are aquired through hardware configuration and storage parameters, might go by unmentioned. +Furthermore the indirection makes it harder to discover the qos for a volume type. Only admins will see the associated qos ID and will have to take a closer look at the qos after discovering the volume type. PLUS: there can only be one qos association for one volume type. But a qos can be used for multiple volumes.

Conclusion: The benefit of displaying qos parameters is clear, thus this option should be noted. But are volume qos objects widely used? If not, standardization process would be too much work.

Other Backend-specific Highlights

While every option above described things, that can at least be partly or for admins only visible in volume types, there are many different configuration options in hardware and backend providers can make use of. It is sadly not possible to get them into the volume type directly, but we recommend, that notable configurations are written into the description of a volume type to achieve transparency for the users.

Open questions

  1. How often are the different options used by providers and users respectively? Especially important for qos and replication!
  2. Regarding Replication: Is the number of replicas needed by users and is it okay for providers to provide this information?

Decision

AspectStandardize?Discoverabilityother Things
encryptionRecommendedwork neededextra_spec: encrypted=True/False
Backend name---
AZs--describe as optional and backend-dependend
multiattach-yesdescribe as optional
ReplicationRecommendedlot of workeither get from backend to OS or as extra_spec defined by deployer
Number of Replicas, etc?lot of workoptional, work on it after Replication is standardized
Volume QoS?admin onlyneeds further discussion, should be at least described as optional

This is an etherpad with a further look into the Options and a few examples.

+ + + + \ No newline at end of file diff --git a/standards/scs-0210-v1-k8s-new-version-policy/index.html b/standards/scs-0210-v1-k8s-new-version-policy/index.html new file mode 100644 index 0000000000..d1ef0e097d --- /dev/null +++ b/standards/scs-0210-v1-k8s-new-version-policy/index.html @@ -0,0 +1,36 @@ + + + + + +SCS K8S Version Policy for new Kubernetes versions | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

SCS K8S Version Policy for new Kubernetes versions

Introduction

Here we will describe how fast providers need to keep up with the upstream Kubernetes version.

To create a informed decision we summarize here the Kubernetes rules regarding versioning at the time of writing (2023-01-16):

Kubernetes usually provides about 3 minor releases per year. +Kubernetes Release Cycle

Patch release cadence is typically monthly. However, the first patches after the first minor release usually arrive 1-2 weeks after the first minor release. +Patch Release Cadence

In general the latest 3 minor versions are maintained by the Kubernetes project. +Every release will be maintained for about 14 months. +The first 12 months are the standard support period. +The remaining 2 months are only for:

  • CVEs (under the advisement of the Security Response Committee)
  • dependency issues (including base image updates)
  • critical core component issues

Kubernetes Support Period

Motivation

Kubernetes is a fast paced project. +We want to achieve that providers keep up to date with upstream and do not fall behind Kubernetes releases. +This ensures that users are able to upgrade their clusters to address security issues, bug fixes and new features when using SCS compliant clusters in regards of Kubernetes. +However, providers should have reasonable time to implement the new Kubernetes versions and test them.

Decision

  • Must provide latest minor version no later than 4 months after release
  • Must provide latest patch version no later than a week after release
  • Should be faster for critical CVEs (CVSS >= 8)
  • Should be tested

All important documents regarding versioning, releases, etc. for the official Kubernetes project can be found here: Kubernetes Releases

Conformance Tests

The conformance test is written in the 'k8s-version-recency-check.py' script. The script requires the path to a valid +kubeconfig file, which should describe the k8s cluster under test. This can either be done by creating a config from +the also provided 'config.yaml.template' or by calling the test script with its cli arguments.

+ + + + \ No newline at end of file diff --git a/standards/scs-0210-v2-k8s-version-policy/index.html b/standards/scs-0210-v2-k8s-version-policy/index.html new file mode 100644 index 0000000000..f3a78cfb09 --- /dev/null +++ b/standards/scs-0210-v2-k8s-version-policy/index.html @@ -0,0 +1,55 @@ + + + + + +SCS K8S Version Policy | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

SCS K8S Version Policy

Introduction

The Kubernetes project maintains multiple release versions including their patched versions. +In the project, the three most recent minor releases are actively maintained, with a fourth +version being in development. As soon as a new minor version is officially released, +the oldest version is dropped out of the support period. +Kubernetes supports its releases for around 14 months. 12 of these are the standard +support period. The remaining 2 months are the end-of-life support period for things like:

  • CVEs (under the advisement of the Security Response Committee)
  • dependency issues (including base image updates)
  • critical core component issues

More information can be found under [Kubernetes Support Period].

The Kubernetes release cycle is set around 4 months, which usually results in about +3 minor releases per year Kubernetes Release Cycle.

Patches to these releases are provided monthly, with the exception of the first patch, +which is usually provided 1-2 weeks after the initial release Patch Release Cadence.

Motivation

Kubernetes is a living, fast-paced project, which follows a pre-defined release cycle. +This enables forward planning with regards to releases and patches, but also implies a +necessity to upgrade to newer versions quickly, since these often include new features, +important security updates or especially if a previous version falls out of the support +period window.

We want to achieve an up-to-date policy, meaning that providers should be mostly in +sync with the upstream and don't fall behind the official Kubernetes releases. +This is achievable, since new versions are released periodical on a well communicated +schedule, enabling providers and users to set up processes around it. +Being up to date ensures that security issues and bugs are addressed and new features +are made available when using SCS compliant clusters.

It is nevertheless important to at least support all Kubernetes versions that are still +inside the support period, since users could depend on specific versions or may need +longer to upgrade their workloads to a newer version.

The standard therefore should provide a version recency policy as well as a support +window period.

Decision

In order to keep up-to date with the latest Kubernetes features, bug fixes and security improvements, +the provided Kubernetes versions should be kept up to date with the upstream.

  • The latest minor version MUST be provided no later than 4 months after release.
  • The latest patch version MUST be provided no later than 1 week after release.
  • This time period MUST be even shorter for patches that target critical CVEs (CVSS >= 8). +It is RECOMMENDED to provide a new patch version in a 2 day time period after their release.
  • New versions MUST be tested before being rolled out on productive infrastructure; +at least the CNCF E2E tests should be passed beforehand.

At the same time, providers must support Kubernetes versions at least as long as the +official sources as mentioned in the Kubernetes Support Period.

  • Kubernetes versions MUST be supported as long as the official sources support them. +The current support period can therefore be found in [Kubernetes Support Period].
  • It is RECOMMENDED to not support versions after this period in order to not encourage +usage of out-of-date versions.

All documents regarding versioning, releases, etc. for the official Kubernetes projects can be found here: +Kubernetes Releases +Kubernetes Support Period +Kubernetes Release Cycle +Patch Release Cadence

Validation / Conformance

This section will be updated when the conformance tests are written.

+ + + + \ No newline at end of file diff --git a/standards/scs-0211-v1-kaas-default-storage-class/index.html b/standards/scs-0211-v1-kaas-default-storage-class/index.html new file mode 100644 index 0000000000..4fd2cbecef --- /dev/null +++ b/standards/scs-0211-v1-kaas-default-storage-class/index.html @@ -0,0 +1,28 @@ + + + + + +SCS KaaS default storage class | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

SCS KaaS default storage class

Introduction

Cluster consumers can request persistent storage via PersistentVolumeClaims which is provisioned automatically by cloud-provided automation. +Storage requirements may vary across use cases, so there is the concept of StorageClasses. StorageClasses define some set of storage properties. So, consumers can choose one of these depending on the use case.

Kubernetes documentation

Motivation

While often times, consumers will choose a StorageClass explicitly, usually, there is also a default StorageClass to fall back on in case it is not chosen explicitly (that is, when storageClassName is not set on the PersistentVolumeClaim).

This document attempts to define the properties this default StorageClass should have.

Decision

The default StorageClass is made default using the storageclass.kubernetes.io/is-default-class annotation, following Kubernetes upstream. Hence, standardizing its name is not required for the intents of this standard.

  • ReadWriteOnce must be a supported access mode
  • volume must be protected against data loss due to hardware failures of a single disk or host
  • volume must not be bound to the lifecycle of a Kubernetes Node

Hence,

  • ...volume must not be backed by local storage on the Kubernetes Node VM itself
  • ...volume may be backed by some kind of redundant storage within an AZ, across hosts
  • ...volume may be backed by some kind of redundant storage across AZ's
  • NO fixed guarantees regarding latency/bandwidth/IOPS/...

Generally, customers should be able to expect low-tier performance without pricing surprises.

This document does not describe performance related properties. +This will be done in another document which is yet to be created.

Conformance Tests

TBD

+ + + + \ No newline at end of file diff --git a/standards/scs-0212-v1-requirements-for-container-registry/index.html b/standards/scs-0212-v1-requirements-for-container-registry/index.html new file mode 100644 index 0000000000..fee38bbd4e --- /dev/null +++ b/standards/scs-0212-v1-requirements-for-container-registry/index.html @@ -0,0 +1,178 @@ + + + + + +Requirements for container registry | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Requirements for container registry

Introduction

A container registry is an infrastructure service to enable storing and accessing container +images. Images can be pushed to the registry by e.g. Continuous integration pipelines and +be pulled from by runtime environments like Kubernetes clusters.

Container registries could be publicly accessible e.g. Docker Hub, could be +self-hosted or hosted by cloud service providers (CSP). These container registries may +apply various access control mechanisms to restrict public access and make them private. +Both solutions offer a wide range of features that may or may not attract potential +users and CSPs.

Motivation

This proposal is motivated by use cases in which CSPs would like to offer +private container registries to their customers. The specific use cases should be +discussed, but overall CSP could offer a private container registry as a service or +CSP could offer a recipe (maintained by SCS) for customers to deploy the private +registry themselves utilizing CSP infrastructure. In both cases, the private +container registry should fulfill a set of needed requirements e.g. for security and +privacy.

The idea and purpose of this document is to specify what requirements a +specific technical container registry implementation (i.e. software solution) needs to +fulfill in the context of SCS.

Another purpose is the selection of an appropriate container registry +implementation that meets all defined requirements to make architectural +decision on what implementation will be used by the SCS.

Design considerations

There are numerous features to look for when evaluating a container registry solution. +Our decision process goes through two main stages:

  1. OSS health check
  2. Required and desirable features check

The open-source software (OSS) health check is the first filter stage. This stage is +crucial in the context of SCS and container registry implementation should pass it to +promote itself to the second consideration stage. The second stage provides an overview +over the feature set of open source container registry implementations and map out +requirements (and nice-to-haves) against it to have a well-documented decision.

Note: Keep in mind that at the time of writing this document, we've made our best effort +to survey the container registry landscape based on publicly available materials. +If you find something outdated (with respect to the time of writing this document) or +outright erroneous, please submit a PR or raise an issue, and we'll fix it right away.

OSS health check

This section evaluates the health of the open-source projects that were selected from +the currently available solutions. The container registry software must fulfill all OSS +health checks defined by the OSS-Health +document. The main health checks are:

  • Four Opens (code is fully open source, community is open and diverse, development +process is open, design process is open)
  • Maturity
  • Security
  • Activity
  • Lock-in risk assessment

Each selected OSS project is evaluated based on the above checks, and it is classified +into one of three categories as follows:

  • ✔️ The project passed all OSS health checks and will be considered +further as a valid candidate.

  • ❔ The project passed almost all OSS health checks. +There is place for improvement, but the missing points are not crucial from the OSS +health check perspective. The project will be considered further as a valid candidate.

  • ❌ The project does not pass the OSS health checks. Some OSS health check +showstoppers have been found (e.g. open core software, not actively maintained). +The project is filtered at this stage and won't be considered further.

Refer to the list of evaluated projects with their classified categories and comments.

  • ✔️ Harbor

    • Harbor project meets all "four opens"
      • Source code is open and available under the Apache 2 license
      • Community is open, structured and +well organized via workgroups and +various communications channels e.g. Slack, mailing lists, etc. +(#harbor Slack channel contains 3k+ members)
      • The development process is open via GitHub issues and well described in the +contributing +document
      • The design process is open via GitHub issues. Proposals are public. +The decision process is well described as well. The project's roadmap is +available in the roadmap document
    • Maturity is on the CNCF graduation level. +CNCF graduated projects are considered to be stable, widely adopted and production-ready
    • Security
      • The security disclosure and response policy is well described in the project's +security document
      • The code is reviewed within a standard PR process
    • Activity
      • 250+ contributors, 4k+ forks, 13k+ GitHub stars
      • The project has been adopted +by many companies that run Harbor in their production environments
      • The project collaborates with other communities and projects +(see Partners of Harbor section of the +project's website)
      • The project is visible and actively contributes to various conferences, e.g. +FOSDEM 22, +KubeCon Europe, etc.
    • Lock-in risk assessment
      • The project's maintainers +document shows that there are a sufficient number of core +maintainers/contributors that differ over various companies, we therefore deem +the lock-in risk arising from a single point of failure to be low
  • ✔️ Dragonfly

    • Dragonfly project meets all "four opens"
      • Source code is open and available under the Apache 2 license
      • Community is open +organized via multiple channels e.g. Slack, mailing lists, etc. +(#dragonfly Slack channel contains ~50 members)
      • The development process is open via GitHub issues and well described in the +contributing document
      • The design process is open via GitHub issues. The project's roadmap is available in +the project's webpage
    • Maturity is on the CNCF incubating level +CNCF incubating project is considered stable and used in production by users with +the healthy pool of contributors
    • Security
      • The security disclosure is handled via a dedicated email address
      • The code is reviewed within a standard PR process
    • Activity
      • 30+ contributors, 100+ forks, 1k+ GitHub stars
      • The project has been adopted +by many companies that run Harbor in their production environments
      • The project is visible and actively contributes to various conferences, +e.g. KubeCon North America, +KubeCon Europe, etc.
    • Lock-in risk assessment
  • Project Quay

    • Project Quay meets all "four opens"
      • Source code is open and available under the Apache 2 license
      • Community is open organized via mailing +list and IRC
      • Development process is open via JBoss JIRA +issues and well described in the governance document
      • Design process is open via JBoss JIRA +issues. The project's roadmap is available on the project's webpage
    • Maturity
      • Project Quay is an open-source project that starts ~9 years ago. +It powers Red Hat enterprise products Red Hat Quay and Quay.io, which are used in +a productive way by many. Therefore, the project's maturity is at the good level
    • Security
      • The security disclosure is handled via a dedicated email address
      • The code is reviewed within a standard PR process
    • Activity
      • 50+ contributors, 200+ forks, 2k+ GitHub stars
      • The project has been used by many companies that +run Quay in their production environments
    • Lock-in risk assessment
      • The project's owners/maintainers list is not publicly available and is stored in +the downstream repository. +Therefore, it is hard to distinguish the risk of project failure caused by low +diversity across the companies. This should be improved
  • Keppel

    • The project seems to be not widely used in a productive way and also the activity +around is currently not on a good level (5+ contributors). The development +process as well as the design process seem to be open, but not documented yet
  • Nexus

    • Nexus is an open core software that offers paid pro version with advanced features
  • JFrog

    • JFrog Artifactory is shipped as an open core software +with limited features. The software is primarily offered as a paid pro version
  • Kraken

    • It seems that the project is not actively maintained as is discussed in the related +project's issue
  • Portus

    • It seems that the project is not actively maintained as is discussed in the related +project's issue

Required and desirable features check

This section provides an overview of the feature set of open source container registry +implementations (which passed the OSS health stage above) and map out requirements +(and nice-to-haves) against it. The container registry software must be robust enough, +to be able to operate under heavy load (e.g. high availability (HA) mode, federation, etc.) and +the crucial feature is security. +We defined a set of required features that the container registry implementation must +have and also a set of desirable (nice to have) features are defined and evaluated here.

Required features

  • Audit Logs
    • Ability to record use in auditable logs so that activity can be traced to a single user
  • Authentication of system identities
    • Support for authenticating system identities like Kubernetes clusters. Ideally supporting dynamic identity tokens from some IdP; Less ideal: Supporting static "system tokens"
  • Authentication of users
    • Support for multiple authentication systems (IdM integration). User and user account management
  • Authorization
    • Role-based access control to ensure strict access controls
  • Automation
    • Integration with CI/CD tools e.g. via webhooks
  • Vulnerability scanning
    • Reveal security vulnerabilities in container images
  • Content Trust and Validation
    • Verify image authenticity before running - image signing
  • Multi-tenancy
    • Container registry is able to serve multiple tenants (projects, teams, namespaces). It can be implemented also on the storage level, see e.g. Keppel
  • Backup and restore
    • It is important for disaster recovery and data migration scenarios
  • Monitoring
    • Observability is a key feature for operating a service in production so the container registry should expose key metrics
  • HA mode
    • Ensure system uptime even in the event of a failure
  • Registry replication
    • Replication allows users to replicate container images between registries of the same instances and between registries of different instances as well
  • Proxy cache (pull-through cache)
    • Proxy cache allows you to use a container registry to proxy and cache images from a target public or private registry
  • Quota management
    • Control over resource use
  • Garbage collection
    • Removing blobs from the filesystem when they are no longer referenced by a manifest
  • Retention policy
    • Reduce the number of image tags, many of which might not be required after a given time or once a subsequent image tag has superseded them

Desirable features

  • Additionally supported artifacts
    • Additional artifacts that the registry is able to store in addition to OCI artifacts, e.g. Java, Node.js, or Python packages
  • Integration possibilities
    • Ability to cooperate with another software solution in order to improve own feature set (e.g. integration of P2P solution for improving container image distribution (download speed and stability, high scalability ...))
  • Deployment capabilities
    • How could be a container registry deployed (only "official" ways are mentioned)
  • Administration capabilities "as a code"
    • Ability to manage container registry via "as a code" solutions, e.g. Ansible role

Refer to the table of evaluated projects with their features. Note that only container +registry implementations that passed the OSS health stage (Harbor, Quay, and Dragonfly) +are evaluated here.

FeaturesHarborQuayDragonfly
Audit Logs
Authentication of system identities✓ Robot Accounts✓ Robot Accounts
Authentication of users✓ Local database, LDAP, OIDC, UAA✓ Local database, LDAP, Keystone, JWT✓ Local database
Authorization
Automation✓ Webhooks (HTTP, Slack)✓ Webhooks (HTTP, Slack, E-mail ...), building images
Vulnerability scanning✓ Trivy, Clair✓ Clair
Content Trust and Validation✓ Cosign✓ Cosign
Multi-tenancy✓ (not on the storage level)✓ (not on the storage level)✓ (not on the storage level)
Backup and restore
Monitoring✓ Prometheus metrics, Tracing✓ Prometheus metrics, Tracing (only for Clair)✓ Prometheus metrics, Tracing
HA mode
Registry replication
Proxy cache✓ Feature is in the technology preview stage (non production ready)
Quota management✓ Based on storage consumption✓ Based on storage consumption
Garbage collection✓ Non-blocking✓ Non-blocking
Retention policy✓ Multiple tag retention rules✓ Only tag expiration rules
Additional supported artifacts✗ (only OCI artifacts)✗ (only OCI artifacts)✓ Maven, YUM
Integration possibilities✓ Dragonfly (P2P), Kraken (P2P)✓ Harbor, Nydus, eStargz
Deployment capabilities✓ Docker-compose, Helm chart, Operator✓ Docker-compose, Operator✓ Docker-compose, Helm chart
Administration capabilities✓ Terraform, CRDs, Client libraries✓ Ansible, Client libraries✓ Client libraries

Notes:

  • Automation: Harbor should support webhooks following CloudEvents spec in the next release
  • Content Trust and Validation: Harbor announced the deprecation of Notary +integration, hence it is not mentioned in the table
  • Multi-tenancy: Harbor, Quay, as well as Dragonfly, operates on a single storage +backend (e.g. S3), i.e. the storage of container images is shared between tenants
  • Additional supported artifacts: Harbor announced the deprecation of Chartmuseum +integration, hence it is not mentioned in the table

Conclusion

A wide range of open-source container registry projects (Quay, Harbor, Dragonfly, +Keppel, Portus, Kraken, etc.) has been carefully evaluated based on the two main +factors: the open-source health and range of supported features.

The open-source software health is crucial and container registry implementation should +pass it. The OSS health check evaluates several important metrics +of an open source software like whether the code/community/development/design is +fully open or whether the project's maturity, security, and activity are on the desired +level. This check also evaluates the lock-in risk due to possible single points of +failure or internal project conflicts and several other aspects. +Overall, three projects passed the OSS health checks:

The above projects were then evaluated from the "supported features" perspective. +The Required and desirable features check +investigated the feature set of open-source container registry implementations and +mapped SCS requirements (and nice-to-haves) against it. The list of required features +is quite long and contains features that are primarily focused on security +(authentication, vulnerability scanning, content trust, and validation, etc.), +scalability (HA mode, registry replication, p2p integration, etc.) and visibility +(monitoring), see the full list here. +These requirements should ensure that the selected container registry implementation +could be offered by CSPs as a secure and enterprise-ready solution.

The following section compares projects Dragonfly, Quay, and Harbor.

Dragonfly is a healthy open-source project with a growing community +and CNCF incubating maturity level. It is considered stable, and widely used by many +companies in their production environments. We currently see that it is not as +feature-rich as Harbor or Quay, hence it is not considered the best choice here. +It seems, that its main aim (currently) is to offer (an efficient, stable, and secure) +container distribution solution based on p2p technology. This improves download +efficiency and saves bandwidth across CSPs. It also offers integration possibilities +that allow one to use it as a p2p distribution network via a "preheat" API. This +integration was implemented in the Harbor project via Dragonfly "preheat" adapter, and +both parties may benefit from the integration. Harbor profits from Dragonfly's p2p +distribution capabilities and on the other hand the Dragonfly project profits from +Harbor's feature-rich container registry "frontend".

Quay is an open-source project maintained by Red Hat. Its OSS health is +on a good level, the surrounding community is growing, and we consider it to be quite +mature as it powers enterprise solutions like Red Hat Quay and Quay.io. +Besides this, there is still a place for OSS health improvement. It is hard to +distinguish the risk of project failure caused by low diversity across the companies +because the project's owners/maintainers list is not publicly available and is stored in +the Red Hat private repository. +Its feature set is impressive and this project fulfills all must-haves defined in +this document. Quay gives you security over your repositories with image +vulnerability scanning (Clair integration), content validation (Cosign integration), +and access controls. Harbor stands out here as it allows users to use also project Trivy +for vulnerability scanning. Project Quay also provides a scalable open-source +platform to host container images across any size organization. One drawback in +comparison to Harbor is that the proxy cache feature is still marked as a +Technology Preview, +hence this feature may not be completely production-ready yet. On the other hand, +the project Quay supports building Dockerfiles +using a set of workers on e.g. Kubernetes. Build triggers, such as GitHub webhooks +can be configured to automatically build new versions of repositories when new code is +committed. This feature is not supported by the Harbor project.

Harbor is an outstanding open-source, community-led project with fully open and +well-documented processes. Its large and thriving community powers the fast-growing +feature set and attracts more and more developers and companies to active contributions. +Harbor's CNCF graduation in 2020 made it one of the best choices for enterprise +customers that want to operate container registries securely and in a large scale. +Its community size, landscape, and CNCF graduation make a significant difference in +comparison to Quay's open-source health capabilities. +The list of supported features is also impressive. This project fulfills all must-haves +defined in this document and overcome project Quay with a production-ready proxy cache +feature and more options that the user may use in case of image vulnerability scanning. +In addition, Harbor profits from p2p distribution capabilities via integration of p2p +solutions like Kraken and Dragonfly. It is worth mentioning that Harbor, by design, +operates on a single storage backend (e.g. S3). It means that the storage of container +images is shared even when the Harbor instance serves multiple tenants. The same +approach is used in Quay and Dragonfly projects, but e.g. Keppel uses multi-tenant-aware +storage drivers instead so that each customer gets their own separate storage backend. +CSP that considers offering container registry "as a service" solution based on Harbor +should be aware of this shared storage backend architecture.

Decision

Based on the research and conclusion above we've decided to use the Harbor project +as a container registry implementation for the SCS ecosystem.

+ + + + \ No newline at end of file diff --git a/standards/scs-0213-v1-k8s-nodes-anti-affinity/index.html b/standards/scs-0213-v1-k8s-nodes-anti-affinity/index.html new file mode 100644 index 0000000000..6d86339c80 --- /dev/null +++ b/standards/scs-0213-v1-k8s-nodes-anti-affinity/index.html @@ -0,0 +1,108 @@ + + + + + +Kubernetes Nodes Anti Affinity | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Kubernetes Nodes Anti Affinity

Introduction

A Kubernetes instance is provided as a cluster, which consists of a set of worker machines, +so called nodes. A cluster is composed of a control plane and at least one worker node. +The control plane manages the worker nodes and therefore the pods in the cluster by making +decisions about scheduling, event detection and global decisions. Inside the control plane, +multiple components exist, which can be duplicated and distributed over multiple machines +inside the cluster. Typically, no user containers are run on these machines in order to +separate the control plane from the live system.

Glossary

The following special terms are used throughout this decision record document:

TermMeaning
WorkerVirtual or bare-metal machine, which hosts workloads of customers
Control PlaneVirtual or bare-metal machine, which hosts the container orchestration layer that exposes the API and interfaces to define, deploy, and manage the lifecycle of containers.
MachineVirtual or bare-metal entity with computational capabilities

Motivation

In a productive environment, the control plane usually runs across multiple machines and +a cluster usually contains multiple worker nodes in order to provide fault-tolerance and +high availability.

In order to ensure availability and scaling of workloads, even if some nodes in the cluster +could fail, they should be distributed over multiple nodes on different machines. +This can be steered with the Affinity or Anti Affinity features, which are separated by +Kubernetes into two features:

Node Affinity +The Node Affinity feature allows to match pods according to logical matches of +key-value-pairs referring to labels of nodes. +These can be defined with different weights or preferences in order to allow fine-grained +selection of nodes. The feature works similar to the Kubernetes nodeSelector. +It is defined in the PodSpec using the nodeAffinity field in the affinity section.

Pod Affinity +Pod Affinity or Pod Anti Affinity allows the constraint of pod scheduling based on the +labels of pods already running on a node. +This means the constraint will match other pods on a node according to their labels key-value-pairs +and then either schedule the pod to the same (Affinity) or another (Anti Affinity) node. +This feature is also defined in the PodSpec using the podAffinity and podAntiAffinity +fields in the affinity section. [3]

Both features allow the usage of "required" or "preferred" keywords, which create +"hard" or "soft" affinities. By using a hard affinity, a pod would need to be scheduled +according to the rules set. If this possibility is not given, the pod can't be scheduled. +A soft affinity would allow scheduling even if the requirements are not fulfilled, but +they would be preferred if possible.

These features allow efficient resource usage (e.g. by scheduling workloads to evenly +distribute across nodes) and provide fault-tolerance and therefore high availability. +But they also require more work during the setup of a service architecture, since nodes +and pods need to be labelled and described consistently.

In the case of SCS, affinity of the workloads themselves is not relevant, since this +feature is mostly used by the customers of the providers. +Instead, the expected standard should enable the Kubernetes cluster to handle Anti Affinity +rules with a real physical separation as well as distributing the control plane over +multiple machines in order to provide fault-tolerance during system outages. +If the control plane survives an outage, a Kubernetes cluster can recover later on.

Design considerations

SCS plans to require a Hard Anti Affinity and/or Redundancy for the control plane and +a Soft Anti Affinity for workers. This means, that Anti Affinity would be required for +the control planes and their pods and only optional (but encouraged) for workers.

In order to achieve the goals for these components, meaning availability and fault tolerance +for the control plane, an outage resistant cluster, and the availability +promise given with Anti Affinity for pods on the worker nodes, a separation of nodes +on the hardware level would need to be achieved.

For the control plane, a reference to the "Kubernetes High Availability" [1] +can be useful, since it provides two ways to set up a highly available cluster. +Both approaches are very similar. The "Stacked Control Plane" [2] requires less infrastructure, +but also runs the risk of failed coupling, where if one node fails, the redundancy could be +compromised due to the loss of a complete control plane instance. +The "External ETCD" solves this problem, but also requires double the infrastructure, due +to the externally incorporated etcd clusters.

This also shows, that the wording "anti affinity" as used with Kubernetes pods is probably +slightly misleading in the context of a Kubernetes control plane. It may consist of multiple +pods with individual tasks, but distributing them over different nodes through Anti Affinity +would probably still cascade the whole control plane into a complete failure, if one of +the used nodes goes down. It could be possible to replicate specific important pods and +assign them to different nodes, but at this point, a redundant setup like presented in [1] could be used. +So Anti Affinity in this context probably means more like distribution over multiple +physical machines, which needs to be planned beforehand on the machine/server level.

Therefore would it be preferred for the control plane to use a redundant setup, which +is separated over different physical machines, meaning at least half of the control plane +nodes runs on a different physical machine as the rest. The currently used ClusterAPI +enables this by establishing the concept of "failure domains". These are used to control +the placement of k8s nodes and distribute them over multiple physical machines. +For example, a High Availability K8s cluster with three control plane nodes could be +distributed over three different availability zones (and therefore 3 different +physical machines) in order to survive the failure of one availability zone. [5]

For worker nodes, the whole idea of Anti Affinity is more of a preferable situation. +The nodes themselves should at best be distributed over different machines, but this +is not a requirement, especially since smaller providers wouldn't have the capacity to +provide enough machines for these distributed Kubernetes clusters. Since customers that +use the Affinity or Topology spread constraint [4] features would be especially interested +in the worker nodes that host their workloads, it should be ensured that a good labeling +system is provided for the nodes in order to see if two nodes are hosted on the same machine.

Decision

The future standard should define a few important things in order to provide a solid base +for the usage and advantages of workloads with Anti Affinity rules.

Control planes SHOULD be made redundant in order to provide fault-tolerance and security +against fatal errors on this layer, in the case of node failures. How this redundancy +is achieved SHOULD be left to the providers, but since failure must be avoided, it is +REQUIRED to at least duplicate control plane components. Half of every component SHOULD +be located on a different node on a different physical machine than the other half +of them. This should provide at least the minimum requirements for a fault-tolerant control plane. +For the standard, there is also a possibility to define multiple stages of distributed infrastructure +and only make sensible ones a requirement and the rest optional, e.g.

  • non-distributed clusters
  • High-Availability clusters that are
    • distributed over multiple machines/availability zones
    • distributed over multiple clouds
    • distributed over multiple physical locations/datacenters

The worker nodes are RECOMMENDED to be distributed over different machines. In order to +provide clear information to the users, the nodes should be labeled to reflect the +mapping to the underlying clusters. The labels can be obfuscated in order to not reveal +the underlying structures to customers and users. It should be noted, that it is NOT REQUIRED +to have this anti affinity for the worker nodes due to the requirements of infrastructure +and complexity associated with this.

Documents

Kubernetes High Availability Documentation 1 +Kubernetes High Availability - Stacked ETCD 2 +Affinity and Anti-Affinity 3 +Topology Spread Constraints 4 +SCS Multi AZ and Multi Cloud Environments 5

+ + + + \ No newline at end of file diff --git a/standards/scs-0213-v1-requirements-for-testing-cluster-stacks/index.html b/standards/scs-0213-v1-requirements-for-testing-cluster-stacks/index.html new file mode 100644 index 0000000000..c6089ab844 --- /dev/null +++ b/standards/scs-0213-v1-requirements-for-testing-cluster-stacks/index.html @@ -0,0 +1,33 @@ + + + + + +Requirements for testing cluster-stacks | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Requirements for testing cluster-stacks

Introduction

In this proposal, we discuss the necessity and design considerations of a lightweight solution for testing cluster-stacks. The purpose is to address the challenges associated with testing on an Infrastructure as a Service (IaaS) provider and the limitations of using Docker as the primary containerization tool for testing. This proposal will elaborate on why we need to test in a local environment, specifically a laptop, and the benefits and drawbacks associated with it. We aim to make an informed decision for testing cluster stacks to cater to both the organizational and technical perspectives of our stakeholders.

Motivation

From an organization's point of view, it is crucial to lower the entry barrier for testing. This action will make it possible for anyone, including external contributors, to easily participate in the testing process without needing an account with the IaaS provider. It is also necessary to overcome the hurdles associated with maintaining a balance in the provider account and managing sponsorships to fund the testing.

From a technical standpoint, there are multiple reasons to favor a local environment for testing. Among them is the ability to test without internet, finish tests in a shorter timeframe, and incur no cost. The provider independence of Cluster Stacks makes it nonsensical to test with a specific provider due to the varied behaviors of different providers. There are also challenges in monitoring and debugging tests run on IaaS providers and dealing with their downtime and limitations on concurrent testing.

Design Considerations

  1. Lightweight Solution +The testing solution should be lightweight and easy to use in a local environment, such as a laptop. This lightweight solution should minimize dependencies and resource usage while maximizing speed and efficiency of the tests. It should be capable of handling the cluster-stack testing requirements without necessitating a bulky or resource-intensive setup.

  2. Independence from Specific Providers +The solution should be generalized and not bound to any specific provider. This consideration ensures that the solution can be applied to any provider, guaranteeing its versatility and broad applicability.

  3. Offline Testing +The testing solution should support testing without internet connection, which will enable more robust and flexible testing scenarios. It should be possible to run the tests even in cases of limited or disrupted internet access.

  4. Fast Execution Time +The tests should execute within a reasonably short amount of time. The solution must be optimized to ensure quick testing cycles, which can help increase productivity and shorten development cycles.

  5. No-Cost Solution +The solution should not impose any additional costs on the organization or individual testers. This characteristic is crucial to enable widespread adoption of the testing process and to lower the entry barrier for contributors.

  6. Easy Monitoring and Debugging +The solution should provide easy monitoring and debugging capabilities. It should allow developers to quickly identify, diagnose, and fix issues that arise during testing, without requiring access to any external logs or monitoring tools.

  7. Concurrent Testing +The solution should support the ability to run concurrent tests without causing any disruption or downtime. This ability can improve the efficiency and speed of the testing process.

Required Features

The proposed solution should meet the following feature requirements:

  1. Local Environment: The solution should support a local testing environment that allows developers to test cluster stacks on their local machines, reducing dependencies on external providers.
  2. Compatibility: The solution should be compatible with various operating systems and platforms, ensuring its usability across diverse environments.
  3. Performance: The solution should offer high-performance testing capabilities, allowing fast execution of tests.
  4. Offline Support: The solution should allow testing in offline mode, ensuring tests can be performed even without an internet connection.
  5. Concurrency: The solution should support running multiple tests concurrently without causing disruptions or conflicts.
  6. Monitoring & Debugging: The solution should provide easy-to-use tools for monitoring test progress and debugging issues.
  7. Cost-effectiveness: The solution should not require any financial investment from the testers or the organization, promoting broad accessibility and usage.

Pros and Cons of Different Approaches

Two potential approaches for testing cluster stacks are the use of an IaaS provider and the use of a local environment. Here we discuss the pros and cons of these two approaches.

IaaS Provider (OpenStack, Hetzner, AWS)

Pros

  • Comprehensive testing environment with advanced capabilities.
  • Possibility to mimic real-world production environments closely.

Cons

  • Requires signing up and account management, which can be a barrier for some testers.
  • Requires maintaining a balance in the provider account, which can pose financial burdens.
  • Internet dependency for testing.
  • Potential for prolonged testing time due to various dependencies.
  • Challenges with monitoring and debugging.
  • Potential downtime and difficulty in running concurrent tests.

Local Environment (Docker, Kubevirt)

Pros

  • Faster test execution with no downtime.
  • Ability to test without internet.
  • Independent of any provider knowledge.
  • Cost-free testing.
  • Easier integration into CI/CD.
  • Simplified monitoring and debugging.

Cons

  • Limited systemd support and containerd support for kubeadm in Docker.
  • Inability to mimic the exact real-world production environments.

Beyond Docker: Virtual Machine based Approach

While Docker provides significant benefits for local environment testing, it's important to recognize its limitations. Docker containers, by design, are lightweight and don't contain a full operating system which can lead to challenges when trying to mimic real-world production environments. Also, Docker containers lack some necessary features like systemd which is used in many production environments for initializing and managing services.

One major aspect that Docker lacks is the ability to mimic real-world production environments effectively. This is primarily due to its nature as a containerization tool, operating within the host OS, and sharing resources among its containers. This might create disparities in behavior when comparing to deployments on real, isolated systems, which could be problematic in some scenarios.

Furthermore, Docker utilizes a Union File System for its images, leading to the creation of layers. This approach can lead to some complexities when dealing with node-images which comprise a significant chunk of our layers. Handling such situations might require workarounds that could add additional complexity and potential points of failure. This creates a blind spot, as real providers won't require these workarounds, which might lead to disparities in results when comparing testing in local and actual production environments.

Therefore, to achieve a more accurate representation of real-world environments, we propose a solution that utilizes a virtual machine based approach for local testing. This approach could leverage tools like KubeVirt, Vagrant, or VirtualBox to create and manage virtual machines on the local environment. This strategy would provide a more robust and realistic environment for testing, as it can better emulate the behavior of a full-fledged operating system and thereby more closely mimic a real-world production environment.

Virtual Machine Based Approach

Pros

  • Provides a more accurate representation of real-world production environments.
  • Allows for full operating system emulation, including features like systemd.
  • Can create isolated environments, thereby mimicking actual deployments better than containers.

Cons

  • Potentially more resource-intensive than container-based solutions.
  • Increased complexity due to the need for managing full virtual machines rather than lightweight containers.
  • Initial setup might be more complicated compared to a Docker-based solution.

Proposed Path Forward

Given the limitations of Docker and the potential advantages of a virtual machine based approach, we propose to investigate further into this strategy. The exact tool or set of tools used can be determined based on a thorough evaluation of the available options.

Although there might be some initial complexity and potentially higher resource usage compared to Docker, we believe that the benefits of more accurate testing and better emulation of real-world environments outweigh these potential disadvantages.

The proposed solution should meet all the requirements mentioned in the previous sections of the proposal, in addition to providing the benefits of a virtual machine based approach. By doing so, we aim to establish a robust, reliable, and realistic testing environment for cluster stacks that mimics real-world production environments as closely as possible.

Conclusion

After thoroughly examining the organizational needs, technical requirements, and potential testing approaches, it is evident that testing cluster stacks in a local environment provides significant advantages over using an Infrastructure as a Service (IaaS) provider. A local environment minimizes financial constraints, reduces testing time, offers offline capabilities, and enables greater tester participation without the need for specialized IaaS knowledge.

While Docker stands out for its broad adoption, cost-effectiveness, and impressive containerization benefits, it also presents some limitations that cannot be overlooked. The lack of full operating system emulation and certain system features like systemd pose challenges to mimic real-world production environments accurately.

Given Docker's limitations and the need to reproduce realistic testing scenarios, we propose moving beyond Docker to a virtual machine-based approach. Even though this approach may introduce initial complexity and potentially higher resource usage, it promises a more accurate representation of real-world environments, thereby ensuring more reliable and robust test results.

Tools such as KubeVirt, Vagrant, or VirtualBox could potentially fulfill our requirements, offering benefits such as full operating system emulation and isolated environments. However, an in-depth evaluation of these and possibly other tools is necessary to determine the best path forward.

In conclusion, our goal is to design a robust, reliable, and realistic testing environment for cluster stacks that closely mimics real-world production environments, aligns with our organizational and technical perspectives, and ensures a low entry barrier for all testers. Embracing a virtual machine-based approach for local environment testing represents a promising strategy to achieve this objective, paving the way for more efficient and reliable cluster stack testing.

+ + + + \ No newline at end of file diff --git a/standards/scs-0214-v1-k8s-node-distribution/index.html b/standards/scs-0214-v1-k8s-node-distribution/index.html new file mode 100644 index 0000000000..94621130ab --- /dev/null +++ b/standards/scs-0214-v1-k8s-node-distribution/index.html @@ -0,0 +1,66 @@ + + + + + +Kubernetes Node Distribution and Availability | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Kubernetes Node Distribution and Availability

Introduction

A Kubernetes instance is provided as a cluster, which consists of a set of machines, +so called nodes. A cluster is composed of a control plane and at least one worker node. +The control plane manages the worker nodes and therefore the pods in the cluster by making +decisions about scheduling, event detection and rights management. Inside the control plane, +multiple components exist, which can be duplicated and distributed over multiple nodes +inside the cluster. Typically, no user workloads are run on these nodes in order to +separate the controller component from user workloads, which could pose a security risk.

Glossary

The following terms are used throughout this document:

TermMeaning
WorkerVirtual or bare-metal machine, which hosts workloads of customers
Control PlaneVirtual or bare-metal machine, which hosts the container orchestration layer that exposes the API and interfaces to define, deploy, and manage the lifecycle of containers.
MachineVirtual or bare-metal entity with computational capabilities

Motivation

In normal day-to-day operation, it is not unusual for some operational failures, either +due to wear and tear of hardware, software misconfigurations, external problems or +user errors. Whichever was the source of such an outage, it always means down-time for +operations and users and possible even data loss. +Therefore, a Kubernetes cluster in a productive environment should be distributed over +multiple "failure zones" in order to provide fault-tolerance and high availability. +This is especially important for the control plane of the cluster, since it contains the +state of the whole cluster. A failure of this component could mean an unrecoverable failure +of the whole cluster.

Design Considerations

Most design considerations of this standard follow the previously written Decision Record +[Kubernetes Nodes Anti Affinity] as well as the Kubernetes documents about [High Availability] +and [Best practices for large clusters].

SCS wishes to prefer distributed, highly-available systems due to their obvious advantages +like fault-tolerance and data redundancy. But it also understands the costs and overhead +for the providers associated with this effort, since the infrastructure needs to have +hardware which will just be used to provide fail-over safety or duplication.

The document [Best practices for large clusters] describes the concept of a failure zone. +This term isn't defined any further, but can in this context be described as a number of +physical (computing) machines in such a vicinity to each other (either through physical +or logical interconnection in some way), that specific problems inside this zone would put +all these machines at risk of failure/shutdown. It is therefore necessary for important +data or services to not be present just on one failure zone. +How such a failure zone should be defined is dependent on the risk model of the service/data +and its owner as well as the capabilities of the provider. Zones could be set from things +like single machines or racks up to whole datacenters or even regions, which could be +coupled by things like electrical grids. They're therefore purely logical entities, which +shouldn't be defined further in this document.

Decision

This standard formulates the requirement for the distribution of Kubernetes nodes in order +to provide a fault-tolerant and available Kubernetes cluster infrastructure. +Since some providers only have small environments to work with and therefore couldn't +comply with this standard, it will be treated as a RECOMMENDED standard, where providers +can OPT-OUT.

If the standard is used by a provider, the following decisions are binding and valid:

  • The control plane nodes MUST be distributed over multiple physical machines. Kubernetes +provides best-practices on this topic, which are also RECOMMENDED by SCS.

  • At least one control plane instance MUST be run in each "failure zone", more are +RECOMMENDED in each "failure zone" to provide fault-tolerance for each zone.

  • Worker nodes are RECOMMENDED to be distributed over multiple zones. This policy makes +it OPTIONAL to provide a worker node in each "failure zone", meaning that worker nodes +can also be scaled vertically first before scaling horizontally.

  • Worker node distribution MUST be indicated to the user through some kind of labeling +in order to enable (anti)-affinity for workloads over "failure zones".

High Availability +Best practices for large clusters +Kubernetes Nodes Anti Affinity

Conformance Tests

Conformance Tests will be written in another issue

+ + + + \ No newline at end of file diff --git a/standards/scs-0300-v1-requirements-for-sso-identity-federation/index.html b/standards/scs-0300-v1-requirements-for-sso-identity-federation/index.html new file mode 100644 index 0000000000..12574af679 --- /dev/null +++ b/standards/scs-0300-v1-requirements-for-sso-identity-federation/index.html @@ -0,0 +1,151 @@ + + + + + +Requirements for SSO identity federation | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Requirements for SSO identity federation

Introduction

Our assumption is that there are use cases, where CSPs would like to be able to +let customers access their SCS based services by identifying themselves with +credentials that are stored and managed external to the CSP's SCS installation.

This is based on the observation that prospective customers of an SCS based CSP +sometimes already come equipped with an IAM solution of their choice, either on +premises or e.g. as an external 3rd party cloud service. To ease onboarding of +customer employees (or e.g. customer contracted 3rd party admin staff) as SCS +users, it would be good to be able to consume these external identities in SCS.

For customers this avoids the neccessity to explicitly maintain an additional +dedicated account in SCS and this also reduces what SCS needs to do with +respect to taking care of persisting user account information.

To put it in other words, in SCS we would like to be able to delegate +authentication to external identity providers and map those users to roles in +SCS that can be used for authorization decisions when users access SCS services.

In addition to user identities there we also see the necessity to support the +use of "machine identites" (aka "workload identities" or "service accounts"). +These will probably be SCS-local accounts and have for example the purpose +to grant CaaS workload access to storage resources served by the infrastructure +layer. Exact architectural details for this are still in active discussion, +but it is anticipated that the IdP component should be very useful in +facilitating the integration.

Motivation for this document

SCS has multiple service layers, like IaaS and CaaS, both of which running their +own technological stack with specific internal models of accounts and +authorization.

One thing these services have in common, is that they are able +to use SSO protocols like OAuth 2.0 or OpenID Connect (OIDC) on top of it to +delegate authentication. They are service providers (SAML terminology) and can +be relying parties (OIDC terminology) of a protocol compliant identity provider +(IdP).

So the idea is, to run an SSO IdP as part of SCS to provide a dedicated point +of entry for identites, which the SCS service layers can use as a common +interface to consume external user identities.

The purpose of this document is to specify what requirements a specific +technical IdP implementation (i.e. software solution) needs to fulfill +in the context of SCS.

Design Considerations

As a central service for identity handling, the IdP +service needs to be robust and reliable.

Customers shall be able to access self service, so that +they can make reasonable adjustments e.g. to role mapping. +At the time of writing this document it's still undecided +if SCS has the requirement of a dedicated "self service" service +that serves as a frontend to provision and re-configure +customer specific data, abstracting e.g. from IdP specific +user interface particularities.

Keycloak is currently being deployed as part of the IaaS reference implementation. +Technically this IdP component shall be shifted from the management +plane to be run on the basis of a "minimal" Kubernetes (e.g. K3S), +e.g. to make use of the "self healing" and scaling features achievable +with that.

So one of the considerations is if the solution will work well on a +K8S environment. The instances will need to share configuration +(probably via the shared backend database) as well as session state. +Maybe one is better prepared for horizontal scaling than the other.

Options considered

Keycloak

Keycloak is a commonly used IdP solution implemented in Java. +It is developed as an open source community project. +Red Hat uses it as upstream source for their Red Hat SSO product +and is also listed as sponsor of the project. +Starting with version 17 the default distribution is based on +Quarkus instead of WildFly/JBoss.

The project maintains several means of community contributions +as listed on the community section +of the project website. It uses Github issues +to track development.

It offers a REST API for administration and there's a separately maintained +3rd party python module as well as ansible support for it. Both of these are +downstream of Keycloak itself and may thus not always be feature complete and +suffer latency with respect to getting adjusted to upstream changes.

It offers support for commonly used SSO protocols and is "reasonably" fast +in adopting to protocol standard changes and extensions. This has been +observed in the case of logout support (backend and frontend variants) in OIDC.

It offers a concept of "Identity Brokering", where Keycloak is not just IdP +but also "client" to other IdPs. This allows daisy chaining of identity +federation. In this configuration it can work as a point of protocol +transition between different supported SSO protocols (SAML, OAuth 2.0, etc.).

Beyond this capability of using other IdPs as identity sources, it also supports +using classic LDAP based IAM services as backend (OpenLDAP and Active Directory, +e.g.).

Keycloak's implementation makes some design decisions, that are specific +to it and have consequences for clients of the service. E.g. Keycloak +has a concept of management "Realms", which have their own specific +set of HTTP API entrypoints, both for administration as well as for IdP +requests.

Commonly Keycloak realms can be used to map them 1:1 to user domains, +but since Keycloak supports configuring multiple backend IdPs in a +realm to be used for "Identity Brokering", there is always the +possibility to create a kind of "proxy" realm to provide a single +standard set of HTTP API endpoints for SSO clients (service providers) +to avoid the need to frequently extend/reduce client service configuration +whenever a new IdP federation needs to be added to Keycloak to onboard +a new customer. This is relevant for services like OpenStack Keystone, +which currently cannot be easily reconfigured for new SSO endpoints +without restarting the service, making the service unavailable for +a short span of time and increasing risk connected with service restarts.

Since version 17, Keycloak claims that it's capability for +"cloud native" deployments on Kubernetes has improved.

Keycloak is offering a REST API +for all aspects of its administration interface.

For storage of Keycloak configuration and local user metadata +(e.g. from which external IdP a user account originally came from) +Keycloak supports several SQL backends through JDBC. Thus +it can be hooked up to a Postgres Database or to a +MariaDB/Galera cluster e.g..

As of April 11, 2023, Keycloak joined the CNCF as an incubating project.

Zitadel

Zitadel is a newer implementation of an SSO IdP. +It is implemented in Go and under active development and maintained by ZITADEL.

The project is open for community contributions +to all parts of the eco system. +Feature requests and bugs being tracked on Github for development. +Community questions can be asked in the public chat or via Github Discussions. +ZITADEL offers support for the commonly used authentication and authorization protocols such as OIDC, OAuth2, SAML2. +It is a compliant and certified OpenID Connect provider with support for various Grant Types for both human users and machine users. +Compared to Keycloak SPIs, ZITADEL offers Actions to customize and integrate (eg, calling external APIs, Webhooks, customizing pre-built workflows, customizing tokens) +Actions are executed at runtime and can be maintained independently of platform. +Identity brokering (OIDC, SAML, JWT) can be configured system-wide or for each organization with templates. +Users will be created just in time for audit purposes and linked to the external identity provider. +Users can have multiple identity providers linked to their profile.

It came to attention of the SCS project because it offers a +fresh take of an organization focussed data model, which has +the potential to simplify IdP federation to SCS customer domains +in the following areas:

  • For client services (single set of HTTP API endpoints).
  • For SCS operators for provisioning customer organizations +and robust configuraton by using templated client, role and mapping +configuration.
  • For SCS customers for a robust user experience for self servicing.

The concept for Delegated Access Management +reduces the management overhead compared to isolated realms. +Projects (Applications + Roles) can be maintained by one organization and delegated to be used by other Organizations. +Managers that receive granted Projects can assign users permissions to use the project.

Zitadel is offering REST APIs +for multiple areas of use and configuration.

It recently also added support for the Device Authorization Grant, +which, at time of writing, is a feauture that is relevant +for SCS to be able use OpenStack CLI and APIs with federated +identities (Device Authorization Grant).

Support for consumption of LDAP backends is available since Zitadel v2.23.0 +(see this guide).

ZITADEL supported backend databases are CockroachDB and PostgreSQL.

For production setups it is recommended +to use Kubernetes (or similar like Knative) and CockroachDB.

At time of writing a PoC "spike" is done to assess and verify the hopes +connected with Zitadel in the context of the SCS testbed.

Currently Zitadel is lacking the possibility to easily add custom claims. +It supports urn:zitadel:iam:user:metadata, but that is more suitable +towards Kubernetes and cannot be parsed with the OpenStack mapping mechanism. +There is work going on which +may be suitable to resolve this issue. +An approach based on Zitadel actions is also currently evaluated. +OpenStack currently makes use of custom claims to pass openstack-default-project +from the IdP to OpenStack. Combined with federation to external customer managed IdPs +this should allow customers to manage settings like these in their own IAM.

Open questions

  • How would we implement testbed deployment support for Zitadel?
    • e.g. wsgi-keystone.conf would need to look different. One template covering both options?
    • e.g. steps like openstack federation protocol create would probably be different.
  • Should we support both as options?
    • What's the benefit?
    • How would we allow SCS operators to choose?
  • Do we need some kind of SWOT analysis to come to a decision?

Decision

SCS wants to make use of an IdP as part of the reference implementation. +To move forward with topics of configuration and mapping of roles in a +OAuth2 federation scenario as well as questions of token lifecycles etc. across +the federation stack it makes sense to focus on one IdP implementation at a +given time. Both considered options seem to be potentially viable, but ultimately, +a decision should be made, even if there are no strict/strong reasons for +dismissing either option in particular.

The project's current choice is Keycloak for the following reasons: +Keycloak currently supports the OAuth 2.0 grants that SCS wants to make +use of (e.g. Device Authorization Grant). It is the implementation for +which integration is currently documented in OpenStack and implemented +in kolla-ansible. SCS currently deploys Keycloak and the IAM team has +most hands on expecience with it, e.g. when it comes to colletaral questions +like how to make TLS and signing certificates available to the IdP that shall +be used in federation to external domains.

Conformance Tests

Conformance Tests, OPTIONAL

+ + + + \ No newline at end of file diff --git a/standards/scs-0301-v1-naming-conventions/index.html b/standards/scs-0301-v1-naming-conventions/index.html new file mode 100644 index 0000000000..cde69b86fd --- /dev/null +++ b/standards/scs-0301-v1-naming-conventions/index.html @@ -0,0 +1,52 @@ + + + + + +Naming for domains/groups/roles/project when onboarding new customers | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Naming for domains/groups/roles/project when onboarding new customers

Introduction

When CSPs try to enroll a new customer they encounter themselves in +a situation where they have to choose names for the openstack domain, +project and user.

Motivation

Create a naming convention to use during the provisioning of the users and +groups through an openstack domain.

Design Considerations

OPTIONAL

Options considered

PS approach to naming

For naming the customers the suggestion from PS is the following:

A prefix will be use to differenciate domain, project and user in +the openstack environment. The project name is also added as a sufix.

So the onboaring tool will create the following structure for a new +customer onboarded in the system.

domain: d<customer_id>
project: p<customer_id>-<project_name>
user: u<customer_id>-<user_name>

For the customer also a domain admin group and a project admin group are +created. Please note that, at the time of writing, PCO is not making any +use of OpenStack domains to isolate customers. So, for the scope of this +document, the term "domain admin" is used in a conceptual way rather than +referring to the specific OpenStack implementation. For the scope of this +document "domain admins" can do things like creating projects, creating +users and granting users access to some projects (within the domain of +course). "Users" can create and view resources within the projects that +they have been granted access to by the "domain admin". +These groups use the prefix "gd" for domain group and "gp" for group project +and are build like the following:

domain admin group: gd<customer_id>-member
project admin group: gp<customer_id>-<project_name>-member

For the creation of a domain a new domain admin group is created.

openstack domain create d000001
openstack group create gd000001-member

When a project is created a new admin group for that project is created.

openstack project create p000001-scs_dev_project
openstack group create p000001-scs_dev_project-member

After the creation of a project it is necessary to assign roles to the +new groups.

openstack role add --group gd000001-member --project p000001-scs_dev_project $role
openstack role add --group gp000001-scs_dev_project-member --project p000001-scs_dev_project $role

For the creation of regular non admin users, the accounts will be added +to the "domain admin" group to give them access to all projects within +the domain.

openstack user created u000001-user1
openstack group add user gd000001-member u000001-user1

In the case of machine accounts, they are only added to the specific +"project admin" groups.

openstack user created u000001-svc_user_project
openstack group add user gp000001-scs_dev_project-member u000001-svc_user_project

In case of using federation, there are suggestions to the namings within Keycloak.

The realms in Keycloak for each customer would be the same as the customer. e.g. The Keycloak realm for "Customer A" +will be called "Customer A".

There should be an OIDC client in each customer realm to allow the federation to the Proxy realm. Currently called OSISM +on the testbed.

On the proxy realm, it's needed to add this new customer realm as an idenity provider. During the creation of the identity +provider for "Customer A", the field "Alias" should be set to <customer-id>. This will make that the users federated from +realm "Customer A" to the proxy realm to be prefixed to avoid naming colisions, e.g. d${ALIAS}-${CLAIM.preferred_username}.

Also, on the identity federation there should be configured to store the <customer-id> from that realm into the users. So it +can be send to Keystone mapping to use it as gd<customer-id>-member and gp<customer-id>-<project_name>-member. There is +also the necessity of a mapper to send the openstack-default-project.

Add the aditional mappings for roles and groups as necessary to get the attributes from the customer realm into the OIDC +userinfo that is put into the OIDC to the proxy realm and from there to Keystone.

Option 2

Option 2 description

Open questions

RECOMMENDED

Decision

Decision

Related Documents, OPTIONAL

Conformance Tests

Conformance Tests, OPTIONAL

+ + + + \ No newline at end of file diff --git a/standards/scs-0302-v1-domain-manager-role/index.html b/standards/scs-0302-v1-domain-manager-role/index.html new file mode 100644 index 0000000000..91f6f4e039 --- /dev/null +++ b/standards/scs-0302-v1-domain-manager-role/index.html @@ -0,0 +1,46 @@ + + + + + +Domain Manager configuration for Keystone | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Domain Manager configuration for Keystone

Introduction

SCS Clouds should provide a way to grant Domain Manager rights to SCS Customers which provides IAM self-service capabilities within an OpenStack domain. +This is not properly implemented in the default OpenStack configuration and requires specific adjustments to the Keystone identity management configuration. +To avoid conflict with the unscoped admin role in OpenStack we want to refer to this new role as "Domain Manager" (domain-manager).

Glossary

The following special terms are used throughout this standard document:

TermMeaning
RBACRole-Based Access Control1 established by OpenStack Keystone
projectOpenStack project as per Keystone RBAC
userOpenStack user as per Keystone RBAC
groupOpenStack group as per Keystone RBAC
roleOpenStack role as per Keystone RBAC
domainOpenStack domain as per Keystone RBAC
IAMidentity and access management
IAM resourcesprojects, users, groups, roles, domains as managed by OpenStack Keystone
CSPCloud Service Provider, provider managing the OpenStack infrastructure
cloud adminOpenStack user belonging to the CSP that possesses the admin role

Impact

Applying this standard modifies the API policy configuration of Keystone and introduces a new global role definition to Keystone to enable IAM self-service for customers within a domain. +Once assigned, the role allows special Domain Manager users within a domain to manage users, project, groups and role assignments as part of the IAM self-service.

However, the configuration change introduced by this standard does not automatically assign the Domain Manager role to any users per default. +Assigning the new role and granting customers the resulting self-service capabilities is a deliberate action to be taken by the CSP on a per-tenant (i.e. per domain) basis.

Omitting the provisioning of any Domain Manager users (i.e. not assigning the new role to any user) will result in an OpenStack cloud that behaves identically to a configuration without the standard applied, making the actual usage of the functionality a CSP's choice and entirely optional.

Motivation

In the default configuration of Keystone, only users with the admin role may manage the IAM resources such as projects, groups and users and their relation through role assignments. +The admin role in OpenStack Keystone is not properly scoped when assigned within a domain or project only as due to hard-coded architectural limitations in OpenStack, a user with the admin role may escalate their privileges outside of their assigned project or domain boundaries. +Thus, it is not possible to properly give customers a self-service functionality in regards to project, group and user management with the default configuration.

To address this, this standard defines a new Domain Manager role in conjunction with appropriate Keystone API policy adjustments to establish a standardized extension to the default Keystone configuration allowing for IAM self-service capabilities for customers within domains.

Desired Workflow

  1. The cloud admin deploys the Domain Manager policy configuration for Keystone as per this standard if it is not already applied.
  2. The cloud admin creates the desired domains for the customers for which IAM self-service capabilities are desired.
  3. The cloud admin creates one or more users within each of the applicable domains and assigns the Domain Manager role to them. These users represent the Domain Managers of the corresponding domain.
  4. The customer uses the Domain Manager users to manage (create, update, delete) users, projects, groups and corresponding role assignments within their domain.

Design Considerations

  • the Domain Manager role MUST support managing projects, groups and users within a specific domain
  • the Domain Manager role MUST be properly scoped to a domain, it MUST NOT gain access to resources outside of its owning domain
  • the Domain Manager role MUST NOT be able to manipulate existing roles or create new roles
  • the Domain Manager role MUST only be able to assign specific non-administrative* roles to their managed users where the applicable roles are defined by the CSP
  • Domain Managers MUST NOT be able to abuse the role assignment functionalities to escalate their own privileges or those of other users beyond the roles defined by the CSP

* "non-administrative" in this context means this excludes the role "admin" and any comparable role that grants permissions beyond domain and tenant scope. +Since the Domain Manager role as defined in this standard is domain-scoped, it does not count as administrative.

Options considered

Re-using the existing admin role

As role assignments can be scoped to project, groups and domains the most obvious option would be to assign the existing admin role to users representing Domain Managers in a scoped fashion.

However, due to architectural limitations2 of the existing OpenStack implementation of roles, the admin role has a special meaning reaching beyond the RBAC checks done by Keystone and other OpenStack components. +This results in special permissions being granted to users possessing the role which ignore the project or domain scope of the role assignment. +This poses severe security risks as the proper scoping of the admin role is impossible. +Due to this, this approach was discarded early.

Upstream (OpenStack) is in the process of addressing this across the services but it has not been fully implemented yet, especially for domains3.

Introducing a new role and API policy changes

OpenStack Keystone allows for new roles to be created via its API by administrative users. +Additionally, each OpenStack API's RBAC can be adjusted through an API policy file (policy.yaml) through olso-policy4, Keystone included. +The possibility of managing users, projects, role assignments and so on is regulated through Keystone's RBAC configured by its API policy file.

This means that by creating a new role and extending Keystone's API policy configuration a new Domain Manager role can be established that is limited to a specific subset of the Keystone API to be used to manage users, projects and role assignments within a domain.

Open questions

Limitations

The approach described in this standard imposes the following limitations:

  1. as a result of the "identity:list_domains" rule (see below), Domain Managers are able to see all domains via "openstack domain list" and can inspect the metadata of other domains with "openstack domain show"
  2. as a result of the "identity:list_roles" rule (see below), Domain Managers are able to see all roles via "openstack role list" and can inspect the metadata of other roles with "openstack role show"

As a result of points 1 and 2, metadata of all domains and roles will be exposed to all Domain Managers!

If a CSP deems either of these points critical, they may abstain from granting the Domain Manager role to users, effectively disabling the functionality. See Impact.

Decision

A role named "domain-manager" is to be created via the Keystone API and the policy adjustments quoted below are to be applied.

Policy adjustments

The following policy has to be applied to Keystone in a verbatim fashion. +The "is_domain_managed_role" rule definition is the only exception to this (see below).

# classify domain managers with a special role
"is_domain_manager": "role:domain-manager"

# specify a rule that whitelists roles which domain admins are permitted
# to assign and revoke within their domain
"is_domain_managed_role": "'member':%(target.role.name)s"

# allow domain admins to retrieve their own domain
"identity:get_domain": "(rule:is_domain_manager and token.domain.id:%(target.domain.id)s) or rule:admin_required"

# list_domains is needed for GET /v3/domains?name=... requests
# this is mandatory for things like
# `create user --domain $DOMAIN_NAME $USER_NAME` to correctly discover
# domains by name
"identity:list_domains": "rule:is_domain_manager or rule:admin_required"

# list_roles is needed for GET /v3/roles?name=... requests
# this is mandatory for things like `role add ... $ROLE_NAME`` to correctly
# discover roles by name
"identity:list_roles": "rule:is_domain_manager or rule:admin_required"

# get_role is needed for GET /v3/roles/{role_id} requests
# this is mandatory for the OpenStack SDK to properly process role assignments
# which are issued by role id instead of name
"identity:get_role": "(rule:is_domain_manager and rule:is_domain_managed_role) or rule:admin_required"

# allow domain admins to manage users within their domain
"identity:list_users": "(rule:is_domain_manager and token.domain.id:%(target.domain_id)s) or rule:admin_required"
"identity:get_user": "(rule:is_domain_manager and token.domain.id:%(target.user.domain_id)s) or rule:admin_required"
"identity:create_user": "(rule:is_domain_manager and token.domain.id:%(target.user.domain_id)s) or rule:admin_required"
"identity:update_user": "(rule:is_domain_manager and token.domain.id:%(target.user.domain_id)s) or rule:admin_required"
"identity:delete_user": "(rule:is_domain_manager and token.domain.id:%(target.user.domain_id)s) or rule:admin_required"

# allow domain admins to manage projects within their domain
"identity:list_projects": "(rule:is_domain_manager and token.domain.id:%(target.domain_id)s) or rule:admin_required"
"identity:get_project": "(rule:is_domain_manager and token.domain.id:%(target.project.domain_id)s) or rule:admin_required"
"identity:create_project": "(rule:is_domain_manager and token.domain.id:%(target.project.domain_id)s) or rule:admin_required"
"identity:update_project": "(rule:is_domain_manager and token.domain.id:%(target.project.domain_id)s) or rule:admin_required"
"identity:delete_project": "(rule:is_domain_manager and token.domain.id:%(target.project.domain_id)s) or rule:admin_required"
"identity:list_user_projects": "(rule:is_domain_manager and token.domain.id:%(target.user.domain_id)s) or rule:admin_required"

# allow domain managers to manage role assignments within their domain
# (restricted to specific roles by the 'is_domain_managed_role' rule)
#
# project-level role assignment to user within domain
"is_domain_user_project_grant": "token.domain.id:%(target.user.domain_id)s and token.domain.id:%(target.project.domain_id)s and rule:is_domain_managed_role"
# project-level role assignment to group within domain
"is_domain_group_project_grant": "token.domain.id:%(target.group.domain_id)s and token.domain.id:%(target.project.domain_id)s and rule:is_domain_managed_role"
# domain-level role assignment to group
"is_domain_level_group_grant": "token.domain.id:%(target.group.domain_id)s and token.domain.id:%(target.domain.id)s and rule:is_domain_managed_role"
# domain-level role assignment to user
"is_domain_level_user_grant": "token.domain.id:%(target.user.domain_id)s and token.domain.id:%(target.domain.id)s and rule:is_domain_managed_role"
"domain_manager_grant": "rule:is_domain_manager and (rule:is_domain_user_project_grant or rule:is_domain_group_project_grant or rule:is_domain_level_group_grant or rule:is_domain_level_user_grant)"
"identity:check_grant": "rule:domain_manager_grant or rule:admin_required"
"identity:list_grants": "rule:domain_manager_grant or rule:admin_required"
"identity:create_grant": "rule:domain_manager_grant or rule:admin_required"
"identity:revoke_grant": "rule:domain_manager_grant or rule:admin_required"
"identity:list_role_assignments": "(rule:is_domain_manager and token.domain.id:%(target.domain_id)s) or rule:admin_required"

# allow domain managers to manage groups within their domain
"identity:list_groups": "(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s) or rule:admin_required"
"identity:get_group": "(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s) or rule:admin_required"
"identity:create_group": "(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s) or rule:admin_required"
"identity:update_group": "(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s) or rule:admin_required"
"identity:delete_group": "(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s) or rule:admin_required"
"identity:list_groups_for_user": "(rule:is_domain_manager and token.domain.id:%(target.user.domain_id)s) or rule:admin_required"
"identity:list_users_in_group": "(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s) or rule:admin_required"
"identity:remove_user_from_group": "(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s and token.domain.id:%(target.user.domain_id)s) or rule:admin_required"
"identity:check_user_in_group": "(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s and token.domain.id:%(target.user.domain_id)s) or rule:admin_required"
"identity:add_user_to_group": "(rule:is_domain_manager and token.domain.id:%(target.group.domain_id)s and token.domain.id:%(target.user.domain_id)s) or rule:admin_required"

Specifying manageable roles via "is_domain_managed_role"

The "is_domain_managed_role" rule of the above policy template may be adjusted according to the requirements of the CSP and infrastructure architecture to specify different or multiple roles as manageable by Domain Managers as long as the policy rule adheres to the following:

  • the "is_domain_managed_role" rule MUST NOT contain the "admin" role, neither directly nor transitively
  • the "is_domain_managed_role" rule MUST define all applicable roles directly, it MUST NOT contain a "rule:" reference within itself
Example: permitting multiple roles

The following example permits both the "member" and "reader" role to be assigned/revoked by a Domain Manager. +Further roles can be appended using the logical or directive.

"is_domain_managed_role": "'member':%(target.role.name)s or 'reader':%(target.role.name)s"

Note regarding the domain-manager role

When adjusting the "is_domain_managed_role" rule a CSP might opt to also include the "domain-manager" role itself in the manageable roles, resulting in Domain Managers being able to propagate the Domain Manager role to other users within their domain. +This increases the self-service capabilities of the customer but introduces risks of Domain Managers also being able to revoke this role from themselves or each other (within their domain) in an unintended fashion.

CSPs have to carefully evaluate whether Domain Manager designation authority should reside solely on their side or be part of the customer self-service scope and decide about adding "'domain-manager':%(target.role.name)s" to the rule accordingly.

"admin"-ness not properly scoped

Description: Upstream bug report about the underlying architectural issue of the admin role not being properly scoped and giving system-level admin permissions regardless of whether the admin role assignment was scoped to project or domain level. +This is the main reason for the admin role being inappropriate to implement Domain Managers.

Link: Launchpad bug: "admin"-ness not properly scoped

Consistent and Secure Default RBAC

Description: Upstream rework of the default role definitions and hierarchy across all OpenStack services. +Aims to introduce support for a scoped manager role by 2024 but only focuses on project-level scoping for this role so far, not domain-level.

Link: OpenStack Technical Committee Governance Documents: Consistent and Secure Default RBAC

Conformance Tests

There is a test suite in domain-manager-check.py. +The test suite connects to the OpenStack API using two sample domains and corresponding Domain Manager accounts. +It verifies the compliance to the standard and the proper domain-scoping as defined by the Keystone policy. +Please consult the associated README.md for detailed setup and testing instructions.

Appendix

Decision Record

Allow flexibility for the roles a Domain Manager can assign/revoke within domain

Decision Date: 2023-09-27

Decision Maker: Team IaaS, Team IAM

Decision:

  • the standard should not strictly limit the roles a Domain Manager can assign/revoke to/from other users within a domain to the "member" role
  • the standard should allow CSPs to define one or more roles for Domain Managers to manage
  • whether or not this includes the Domain Manager role itself is not to be predefined by the standard and should be up to the CSP to decide instead
  • the standard should only strictly prohibit adding the "admin" role to the list of roles manageable by Domain Managers

Rationale:

  • the available and configured roles might differ between CSPs and infrastructures
  • the Domain Manager standard should be flexible enough to adapt to different environments while still offering the intended functionality
  • there might be a tradeoff between self-service flexibility desired by customers and the security regulation a CSP wants to impose, thus allowing or prohibiting the designation of Domain Managers by customers themselves should be up to the CSP to decide

Links / Comments / References:

Extend domain management functionality to Keystone groups

Decision Date: 2023-08-04

Decision Maker: SIG IAM

Decision:

  • the Domain Manager Standard configuration should cover the groups functionality of Keystone, allowing domain manager to manage groups in domains

Rationale:

  • the groups functionality is a desired IAM feature for customers

Links / Comments / References:

Change the naming of the Domain Manager role

Decision Date: 2023-08-04

Decision Maker: SIG IAM

Decision:

  • the Domain Manager role should be named "domain-manager" not "domain-admin".

Rationale:

Links / Comments / References:

+ + + + \ No newline at end of file diff --git a/standards/scs-0400-v1-status-page-create-decision/index.html b/standards/scs-0400-v1-status-page-create-decision/index.html new file mode 100644 index 0000000000..1359224bcf --- /dev/null +++ b/standards/scs-0400-v1-status-page-create-decision/index.html @@ -0,0 +1,78 @@ + + + + + +Status Page create decision | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Status Page create decision

Introduction

Creating and maintaining IT infrastructure is a complex task. +Any kind of consumer (e.g. operators, cutsomers) can +be supported by presenting the status of all possible parts of the +serving infrastructure. Whether a service is not reachable or +the used hardware is having an outage we want the consumers to be easily informed +by using a "Status Page" application. The need for a "Status Page" +came up early in the SCS project and the requirements a "Status Page" application +has to fulfill were defined and written down on 2022-06-02 as a +MVP-0 epic. +The upcoming research on existing solutions came to the conclusion that we want to +create a new "Status Page" application.

Existing Applications

Since we want to use as much as possible from existing projects and contribute to +upstream projects to support the community with our efforts, it was a hard +decision to create a new "Status Page" application.

Before the decision was made some existing and known applications were tested +and analyzed if they would fit to our use case. An overview of this +comparison can be found below in this document +While this is not a complete list of all existing applications it did +capture the most promising ones from the awesome-status-page list +in order to have base to decide upon.

Work on an existing project only makes sense if the project is healthy OR can be +brought into a healthy state. If upstream does not accept patches a fork is needed. +The fork however only makes sense if the underlying technology is worth to be maintained. +The possible candidates did not fulfill these conditions - in the cases where +contribution seemed possible the candidates looked abandoned and long existing CVEs weren't +worked on.

Decision

Based on the results the decision was made, that the effort is likely to be the same if +we pick up an existing project and try to get it in shape for our use case. It was not +100% clear if this would even be possible or if we still would have to maintain our +own additional patches.

So there will be a reference implementation that will match the requirements we have. +In addition there will be an architecture design documentation. So if the reference +implementation may not fit to you, it will be possible to create your own application.

Status Page Requirements

  • The status page application should be simplistic in software design and should not depend on a large +variety of services

    • simplistic, yet existing user management for write access (oauth? OIDC?)
      • Simple RBAC (role based access control) is nice to have
    • support that components are only visible to a subset of users
      • implies that there is a role that is read-only
      • On-Prem use case might be handled by having an authenticating reverse proxy in front
  • The status page applicaton should allow for simple and easy theming

    • Page = (Possibly simple) Web-UI
  • As a CSP, I want to have a status page that allows to

    • define locations and similar grouping (AZs, ...)
    • define components globally or per location +to ease maintenance I want to define per component where it belongs so that I only have +to define a component once, but have it visible in several locations + status per component should be allowed to be toggleable per location or overall * a component should allow for several statuses, that are defined by me
  • Status, Status Items should be easy to extract

    • REST(less)-API to interact with +API should be versioned + this allows for embedding status information in other applications, such as cloud +dashboards +this also allows for submitting items from other tooling + incoming webhooks (https POST) should be supported (e.g. for air-gapped setups) – +i.e. submitting a health beacon every x seconds +web-UI wanted for posting updates as well + Token based Auth
  • Configuration should be manageable with YAML files (imho this annoys me using Uptime Kuma)

  • As a consumer of the status page, I'd like to subscribe to events on the status page via e-mail

    • for everything
    • for specific components
  • As a consumer of the status page, I'd like to subscribe to an RSS or atom feed

  • Allow for the ability to trigger webhooks upon certain events (to submit info to other systems via +webhooks, e.g. chat/messenger)

  • As a CSP Operator, I want to be able to flag a component with a new status quick and easy

    • to minimize the probability of making errors, updating the status of a component should not be +hard brainwork
    • updates can be both machine generated status changes (triggered e.g. by health monitoring) +as well as updates from human operators
    • updating a status should allow the CSP Operator to do that in a fashion that either pushes +infos to the subscribers or just updates the status on the status page
    • updating the status can either be toggling the status of the component or can be +accompanied by additional textual information.
    • When updating a status with textual information the status page application should make it +easy for me as the CSP Operator to do in a way that if different people submit infos over time +they are presented in a similar way (eg. the status page application should guide so that the +resulting infos are presented in a identical way. Example: when updating infos of an incident +over time the timeline should automatically be sorted by the status page application so that it +does not depend on the Operator whether the newest info is on top or at the bottom. This is +typical thing that varies if several people update items
  • Allow for templates for certain types of incidents

  • User-specific monitoring (how are MY instances, load-balancers, ... doing?) is OUT OF SCOPE for +the status page.

    • But having it would be useful and if we have something like this, link it from the status page +(and a link to horizon might be the default)
  • Sidenote: External hosting is desired to avoid status page going down with infra

With those requirements in mind the projects that initially were found, were evaluated.

Comparison matrix

CachetHQClearStatusciaocStateGatusIssue Statusstatusfy
CSP VIEW
small dependency tree❌ Composer❌ ruby gems⁇ helm chart❌ npm/github/zapier❌ npm dependencies very huge
easy themable
grouping (by location...)
components definition ...
... local or global
... easy flagging with new status
... push notification on update
... updates with additional information
API Support ...❌ read only✅ GitHub API
... versioned
... web ui for posting updates
... token based auth✅ Auth managed by git provider❌ only basic auth❌ BUT OIDC!
manageable configuration❌ config depends on web server and initial install relies on env variables❌ based on hugo CMS❌ config by env variables❌ based on hugo CMS❌ no real config needed
templating support✅ twig❌ Hugo itself uses GO template libraries
CUSTOMER VIEW
subscription support ...❌ only by git provider
... send by eMail
watchdog for status page support
trigger webhook support❌ needs cachet-monitor
additional infos-basically a theme for hugo cms, depends on netlify cms-basically a theme for hugo cms, depends on netlify cms-It's highly optimized for github pagesSPA created with netlify
hidden components
user management✅ by OIDC⁇ through github?
different output format on notification
external hosting❌ looks like you are limited to github
project healthy❌ last commit 17 months❌ last commit 3 years❌ last commit 5 months✅ last commit 2 months✅ recent activities✅ recent activities❌ archived and abondend by the owner
documentation✅ API ❌ User Documentation⁇u❌ not reachable anymore
git based⁇ a netlify based installation is able to communicate with github
project pagehttps://cachethq.io/https://github.com/weeblrpress/clearstatushttps://www.brotandgames.com/ciao/https://cstate.netlify.app/https://gatus.io/https://github.com/tadhglewis/issue-statushttps://marquez.co/statusfy
+ + + + \ No newline at end of file diff --git a/standards/scs-0401-v1-status-page-reference-implementation-decision/index.html b/standards/scs-0401-v1-status-page-reference-implementation-decision/index.html new file mode 100644 index 0000000000..8a9b1e35cc --- /dev/null +++ b/standards/scs-0401-v1-status-page-reference-implementation-decision/index.html @@ -0,0 +1,27 @@ + + + + + +Status page reference implementation decision | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Status page reference implementation decision

Introduction

For the reference implementation of the status page API defined by the OpenAPI spec some decision should be made to which technlogy to be used and why.

A reference implementation should be of use to most of the intended group, but is not necsessarily applicable for every use case.

Motivation

For a reference implementation to be of any use, some common and widely used technologies should be used, so it's useful to most of the intended user group.

Decision

Programming Language

The status page application consists of an api server as well as a frontend. For implementing the api server, which is generated from the OpenAPI spec, Go was chosen, because of maturity and wide spread usage as industry standard. Go, in particular, is a modern programming language and is commonly used in network and cloud computing environments.

Database

As database, PostgreSQL was chosen, since it is a mature, well-known database. PostgreSQL can be run in various environments from small setups to scaled setups. +Furthermore PostgreSQL is a very healthy project with an active community and a solid license. It easily passed the SCS OSS health check.

+ + + + \ No newline at end of file diff --git a/standards/scs-0402-v1-status-page-openapi-spec-decision/index.html b/standards/scs-0402-v1-status-page-openapi-spec-decision/index.html new file mode 100644 index 0000000000..3a44189e6c --- /dev/null +++ b/standards/scs-0402-v1-status-page-openapi-spec-decision/index.html @@ -0,0 +1,27 @@ + + + + + +Status page OpenAPI decision | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Status page OpenAPI decision

Introduction

While defining the OpenAPI spec some considerations and decisions are made and should be documented.

Requirements

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119.

In addition, "FORBIDDEN" is to be interpreted equivalent to "MUST NOT".

Motivation

The spec should be as minimal as possible, while being as understandable as possible, so some choices to the design of API objects, requests and responses are made.

Decision

Common definitions

Some defined schemas are used as common types. These common definitions help to simplify the actual object definitions by providing meaningful names, and reduce duplication. A change of ID type for example only needs one change in the common definition, and not in any of the object definitions which include an ID.

Special mentions:

Id

IDs are used for identification of resources, which can be retrieved by the API.

UUIDs are used, to ensure uniqueness. Also, they can be visually recognized as identifier.

Incremental

An Incremental is used in combination with other identifiers to identify a sub resource of any kind. Incrementals themselves are not globally unique, but unique for every sub resource of an unique resource.

Generation and order

Generation and Order are predefined objects which include a Incremental typed field for the common usages of the Incremental value.

API objects

All objects which are used as payload, either as request or response, are defined by schemas. This centralizes the maintanence of field names and types, for both requests and responses.

API object fields

Most fields of objects are not required. This allows usage as request and response payloads.

Responses of payload objects, which contain an ID or an Incremental typed field, MUST fill the ID or Incremental field to fully identify the (sub) resource.

Requests on a single resource MUST contain the ID in the path parameters. Request on sub resources MUST contain the ID and Incremental typed value as path parameters. The payload SHOULD NOT contain the ID or Incremental typed field. +If it contains these fields as payload, they SHALL NOT change them.

Requests to updating operations SHOULD contain the minimum of the changed fields, but MAY contain the full object. ID and Incremental typed fields MUST follow the same rules as stated above.

Endpoint naming

The endpoints are named in plural form, even when handeling single objects, to keep uniform paths.

Phase list

The list of phases that an incident can go through has a crucial order. So it MUST be handled as the given list.

Delete or update operations are FORBIDDEN.

To "change" a phase list, a new one must be created. The old one must be kept. For this mechanic the lists are structured in generations. All references to phases MUST include their generation to ensure correct references.

To reference a single phase a PhaseReference MUST include a generation and an order field. This MAY be used to reference a single generation too.

Labels

Labels are identifying metadata to components. They do not represent a resource or sub resource of any kind. They are designed as non system critical pieces of information, mainly intended for human consumption.

Labels are simple key/value pairs attached to components, categorizing them dynamically.

Impact

An impact defines the relation between an incident and a component. A component can be affected by multiple incidents and an incident can affect multiple components. Each of these impacts can have a different type depending on the incident and component, like for example connectivity or performance issues.

To reflect this, each component and incident can have a list of impacts, stating the type of impact and a reference to the incident or component, it refers to.

Component impacts

Components list their impacts, which they are affected by, as read only. Only an incident creates an impact on a component. Components MUST only list their currently active impacts.

Return of POST requests

Generally POST requests create new resources. These endpoints do not return the new resource, but a unique identifier to the resource e.g. an UUID.

In most cases the new resource won't be used directly after creation. Most often list calls are used. If the new resource is used directly, it can be retrieved by the returned identifier.

Payloads to POST requests SHALL NOT include ID or Incremental typed fields, it lies in the responsibility of the API server to assign IDs and Incrementals to objects.

Return of PATCH requestes

Most commonly PATCH requests are used to partially or fully change a resource. These requests do not respond with the changed resource, nor an identifier.

Both the old state as well as the new state are known on the client at that point in time and if they need to load the actual recent version from the server, the identifier is already known.

PATCH vs PUT for updating resources

The PUT requests is most commonly used to update full objects, whereas PATCH is used for partial updates.

PATCH is used as the default method for updating resources because it does not require the full object for an update, but does not discourage the use of the complete object.

Authentication and authorization

The API spec does not include either authentication (AuthN) nor authorization (AuthZ) of any kind. The API server MUST be secured by an reverse/auth proxy.

+ + + + \ No newline at end of file diff --git a/standards/scs-0410-v1-gnocchi-as-metering-database/index.html b/standards/scs-0410-v1-gnocchi-as-metering-database/index.html new file mode 100644 index 0000000000..d864a00260 --- /dev/null +++ b/standards/scs-0410-v1-gnocchi-as-metering-database/index.html @@ -0,0 +1,93 @@ + + + + + +Gnocchi as database for metering | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Gnocchi as database for metering

Introduction

In the past we noticed missing events in the telemetry stack of OpenStack. +This results in situations where the Cloud Service Provider (CSP) +may think that a resource is still in use while the owner shut it down, +or may not be aware of a resource which has been created.

Such inaccurate data is a problem, +when it is supposed to be used for billing purposes.

This document discusses how such metering data should be stored +within the SCS. +In partiuclar, +it provides rationale for the choice of Gnocchi +as time-series database for metering data +within SCS.

Definitions

  • TSDB, time-series database: +Database which is specialised for storing data which is keyed by a timestamp. +Popular examples are InfluxDB, Graphite, rrd, and Prometheus.

  • Metering: +Collection of usage data of a cloud, +for the specific purpose of creating invoices +to bill customers for the resources they have allocated.

  • backfilling: +The process of adding and modifying data in the past +within a time-series database.

  • Metric: +A single time-series vector. +Typically, a metric represents a single property of a resource, +such as CPU usage of an instance.

  • Resource metrics: +A group of metrics belonging to a single resource. +A compute instance, for instance, +may have a metric indicating the number of CPUs allocated, +another metric indicating the amount of RAM allocated, +etc.

Motivation

Being able to hold users accountable +for the resources they use +is a prerequisite for commercially operating a cloud. +The SCS project wants to deliver a cloud stack +which can be used for that purpose, +hence providing reliable metering data is a requirement.

As metering data is inherently keyed by time, +a time-series database is required. +The choice of time-series database is an important one +as different databases come with different trade-offs. +Not all databases are suitable for the kind of data +which is collected in a metering context.

Design Considerations

The following requirements for a time-series database exist:

  • MUST support backfilling: +As we need to catch up on changes to resources +which may have happened during a brief network interruption, +we need to be able to modify data after it has been written to the TSDB.

  • MUST be able to handle lots of resources: +As billing should happen with a resource-level granularity, +we expect a lot of different metrics inside the TSDB.

  • MUST scale to different timescales: +We expect to have metrics which change frequently (e.g. object store usage) +and metrics which change rarely (e.g. cinder volume sizes). +The TSDB must be able to cope with both types of metrics efficiently.

  • SHOULD provide an efficient way to query all currently alive resources.

  • SHOULD allow truncation of storage to remove old data.

  • MUST be available under an appropriate Open Source license, +even for productive use cases.

Options

Using Gnocchi

Gnocchi is a time-series database +which has its origins in the OpenStack ecosystem.

It supports all requirements except truncation, +which might have to be implemented.

Using Prometheus

Prometheus is a widely used time-series database +with its focus on monitoring and incident response. +While it is considered efficient for this use-case, +it has shortcomings which make it unsuitable for the metering use case:

  • Explicit recommendation against high-cardinality metrics: +As we would have to label metrics by resource IDs and project IDs, +we have to expect a very high cardinality, +also with a significant amount of metric churn.

  • Backfilling, albeit possible, is not well-supported.

Using InfluxDB

InfluxDB is a widely used time-series database +with its focus on monitoring.

In contrast to Prometheus, it does support backfilling. +However, like Prometheus, +it seems to run into scalability issues in high-cardinality scenarios.

In addition, +clustering is only available in commercial licensing options.

Creating a custom TSDB implementation

A custom TSDB implementation +is a non-trivial project to pursue.

Decision

We use Gnocchi. +According to research, +it mostly fulfills the requirements. +While some small development efforts may be needed, +to make it fully usable, +the amount of work is anticipated much less +than making Prometheus or Influx fit the bill +(due to backfilling / cardinality scaling constraints), +let alone rolling a custom implementation.

Open questions

  • What will be the granularity of the events meta information?

    If we decide to use resource metadata +as a place to store slow-changing information +(e.g. instance flavors, volume sizes), +we need to know what the granularity of that is.

  • SCS-0411-v1

Conformance Tests

None (this is a decision record).

+ + + + \ No newline at end of file diff --git a/standards/scs-0411-v1-publishing_method_for_metering_data/index.html b/standards/scs-0411-v1-publishing_method_for_metering_data/index.html new file mode 100644 index 0000000000..7c613f0a8b --- /dev/null +++ b/standards/scs-0411-v1-publishing_method_for_metering_data/index.html @@ -0,0 +1,65 @@ + + + + + +Push-based approach for providing usage data | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Push-based approach for providing usage data

Introduction

In the past we noticed missing events in the telemetry stack of OpenStack. +This results in situations where the Cloud Service Provider (CSP) +may think that a resource is still in use while the owner shut it down, +or may not be aware of a resource which has been created.

Such inaccurate data is a problem, +when it is supposed to be used for billing purposes.

This document discusses how such metering data should be made available +to the cloud service provider +for forwarding into their own billing solution.

Definitions

  • Push-based flow: +In a push-based flow, +the system generating data actively sends that data to a consumer.

  • Pull-based flow: +In a pull-based flow, +the system generating data waits for the system consuming the data +to ask for that data.

  • Metering: +Collection of usage data of a cloud, +for the specific purpose of creating invoices +to bill customers for the resources they have allocated.

  • Billing: +The entire process of creation, management and sending of invoices +generated from metering data.

Motivation

Being able to bill users +for the resources they use +is a prerequisite for commercially operating a cloud. +The SCS project wants to deliver a cloud stack +which can be used for that purpose, +hence providing reliable metering data is a requirement.

We generally expect that cloud providers already have +some kind of customer-relation management or billing system in place. +Hence, it is important that the SCS is not too opinionated +on this implementation detail, +but provides a system which can easily interface with other systems.

This is similar to how the SCS specified the monitoring stack.

Design Considerations

The following requirements exist for the process for providing metrics to the cloud service provider:

  • MUST scale to different timescales: +We expect to have metrics which change frequently (e.g. object store usage) +and metrics which change rarely (e.g. cinder volume sizes).

Options

Push-based flow

In a push-based flow, +the to-be-implemented metering system pushes events to the sink +as soon as it is reasonably confident +that the event can be used for billing purposes.

Poll-based flow

In the poll-based flow, +whichever system the CSP runs would be responsible for polling the metering API +in a frequency sufficient to capture all data with sufficient granularity.

Open questions

  • What is necessary to extend the availability of sending to various sinks?
  • How does the configuration look like that is needed to push to a sink from the same type that will be already implemented?

Decision

As we need to support very different time scales of data, +the push-based flow is more suitable: +it allows the producer of the data, +which knows about the interval in which it changes, +when to provide new data to the consumer. +In contrast to that, +a poll-based flow would need the consumer to know about change intervals, +or alternatively poll in the highest change frequency ever expected.

  • SCS-0410-v1

Conformance Tests

None (this is a decision record).

+ + + + \ No newline at end of file diff --git a/standards/scs-0412-v1-metering-json/index.html b/standards/scs-0412-v1-metering-json/index.html new file mode 100644 index 0000000000..030bee4a33 --- /dev/null +++ b/standards/scs-0412-v1-metering-json/index.html @@ -0,0 +1,45 @@ + + + + + +Exposition of IaaS metering data as JSON | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Exposition of IaaS metering data as JSON

Introduction

The Sovereign Cloud Stack project intends to standardise an infrastructure-as-a-service (IaaS) layer. +In order to economically sustainably run a cloud, +it is generally useful to know which user or tenant consumes which amount of resources in which time frame.

Similarly to how the SCS provides an interface for connecting monitoring services to detect outages, +this standard aims for providing an interface for connecting systems which aggregate customer resource usage.

Motivation

In general, +users of the SCS (i.e. cloud operators) may already have different systems in place +for tracking customer relationships +as well as billing.

Those systems are unlikely to have a uniform interface across all possible implementations. +Likewise, those systems are unlikely to have a way to interface with OpenStack, +the reference IaaS layer in SCS.

In order to provide SCS operators with a way to integrate the SCS IaaS layer with their billing, +this document shall provide a standard format, +upon which shim conversion layers (to whichever billing system is in place) +can be built.

Design Considerations

In order to define a standard, +the various options for formats need to be considered. +However, all formats also come with different implementation costs.

These aspects are weighed in this section.

Options considered

Use Ceilometer HTTP hook format

The OpenStack Ceilometer project, +which serves as a hub for all things telemetry and metering, +provides an HTTP-based hook to extract metering data. +This hook receives JSON-formatted data.

Using this data has the advantage +that we do not need to implement another component to translate the format +which may in turn be a point of failure.

Use another format

In this option, +a format for metering data is researched and reused, or defined and specified by the SCS project.

This option was not explored deeply, for the reasons explained in the decision.

Open questions

None.

Decision

We chose the Ceilometer HTTP hook format, described below, for the following reasons:

  • Ceilometer is a component which needs to be there anyway for successful metering of OpenStack. Re-using the format makes sense.

  • Using any other format requires a translation layer. However, users will likely need their own translation layer anyway, to integrate the metering with their own infrastructure. Hence, it makes more sense to expose the data from Ceilometer directly.

    A notable downside of this approach is that a change in Ceilometers format will inevitably cause issues in all downstream consumers.

  • SCS-0410-v1
  • SCS-0411-v1

Conformance Tests

None.

+ + + + \ No newline at end of file diff --git a/standards/scs-XXXX-vN-template/index.html b/standards/scs-XXXX-vN-template/index.html new file mode 100644 index 0000000000..70240ccd1b --- /dev/null +++ b/standards/scs-XXXX-vN-template/index.html @@ -0,0 +1,26 @@ + + + + + +_Descriptive title_ | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

_Descriptive title_

Introduction

Introduction

Motivation

Motivation

Design Considerations

OPTIONAL

Options considered

Option 1

Option 1 description

Option 2

Option 2 description

Open questions

RECOMMENDED

Decision

Decision

Related Documents, OPTIONAL

Conformance Tests

Conformance Tests, OPTIONAL

+ + + + \ No newline at end of file diff --git a/standards/standards/overview/index.html b/standards/standards/overview/index.html new file mode 100644 index 0000000000..4814c0d90d --- /dev/null +++ b/standards/standards/overview/index.html @@ -0,0 +1,26 @@ + + + + + +Overview | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + +
+

Overview

Standards are the core deliverable of SCS. By standardizing the open source software components of a cloud computing stack, their versions, how they are to be configured, deployed and utilized, SCS guarantees the reproducibility of a certain behavior of this technology.

SCS standards are discussed, developed and maintained in the community by the corresponding teams (see Track in the table below), which naturally include existing users of SCS.

Stabilized Standards

StandardTrackStateDescriptionActive Versions
SCS-0001Global🟢 StableSovereign Cloud Standardsv1
SCS-0002Global🟢 StableStandards, Docs and Organisationv2
SCS-0100IaaS🟢 StableFlavor Namingv1 (until 2023-10-31), v3
SCS-0102IaaS🟢 StableImage Metadatav1
SCS-0210KaaS🟢 StableNew Version Policyv1
SCS-0211KaaS🟢 StableDefault Storage Classv1

Drafts

StandardTrackStateDescriptionActive Versions
SCS-0003Global🟠 DraftSovereign Cloud Standards YAML-
SCS-0101IaaS🟠 DraftEntropy-
SCS-0103IaaS🟠 DraftStandard Flavors-
SCS-0104IaaS🟠 DraftStandard Images-
SCS-0300IAM🟠 DraftRequirements for SSO identity federation-
SCS-0412Ops🟠 DraftExposition of IaaS metering data as JSON-
+ + + + \ No newline at end of file diff --git a/standards/standards/scs-0111/index.html b/standards/standards/scs-0111/index.html new file mode 100644 index 0000000000..0589dd5b68 --- /dev/null +++ b/standards/standards/scs-0111/index.html @@ -0,0 +1,26 @@ + + + + + +SCS-0111 | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/standards/standards/scs-0212/index.html b/standards/standards/scs-0212/index.html new file mode 100644 index 0000000000..3094b821fb --- /dev/null +++ b/standards/standards/scs-0212/index.html @@ -0,0 +1,26 @@ + + + + + +SCS-0212 | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/standards/standards/scs-0213/index.html b/standards/standards/scs-0213/index.html new file mode 100644 index 0000000000..15b96b7998 --- /dev/null +++ b/standards/standards/scs-0213/index.html @@ -0,0 +1,26 @@ + + + + + +SCS-0213 | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/standards/standards/scs-0301/index.html b/standards/standards/scs-0301/index.html new file mode 100644 index 0000000000..5da5be21c7 --- /dev/null +++ b/standards/standards/scs-0301/index.html @@ -0,0 +1,26 @@ + + + + + +SCS-0301 | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/standards/standards/scs-0400/index.html b/standards/standards/scs-0400/index.html new file mode 100644 index 0000000000..b876fdb90d --- /dev/null +++ b/standards/standards/scs-0400/index.html @@ -0,0 +1,26 @@ + + + + + +SCS-0400 | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/standards/standards/scs-0401/index.html b/standards/standards/scs-0401/index.html new file mode 100644 index 0000000000..58e89ba64b --- /dev/null +++ b/standards/standards/scs-0401/index.html @@ -0,0 +1,26 @@ + + + + + +SCS-0401 | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/standards/standards/scs-0402/index.html b/standards/standards/scs-0402/index.html new file mode 100644 index 0000000000..ad67b05279 --- /dev/null +++ b/standards/standards/scs-0402/index.html @@ -0,0 +1,26 @@ + + + + + +SCS-0402 | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/standards/standards/scs-0410/index.html b/standards/standards/scs-0410/index.html new file mode 100644 index 0000000000..2b7a1b003d --- /dev/null +++ b/standards/standards/scs-0410/index.html @@ -0,0 +1,26 @@ + + + + + +SCS-0410 | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/standards/standards/scs-0411/index.html b/standards/standards/scs-0411/index.html new file mode 100644 index 0000000000..9527a38930 --- /dev/null +++ b/standards/standards/scs-0411/index.html @@ -0,0 +1,26 @@ + + + + + +SCS-0411 | One platform — standardized, built and operated by many. + + + + + + + + + + + + + + + + + + + \ No newline at end of file

S2hTVhrxBTR zo^}q1g0D(V9;uND59zmvd}cR!hLF?P57o7xeAy%>dS}=88wW^{%|8X90*tUbU|zwK zpRIzI(^WASbeg0ioWibd?N{zY<)A;$5rtPbBro7B*{;Yy@_j9g+5Mul(PUX{)_-yV zG36eq&%h-+&-8oLuTBp|o^;p4c}UWs5wUwjBzcunUX8EZ>sJq>Tzu2|;!<8D?}!SF~qo{VyH+D(j@S4qKC#A+gFGxieZUC|f{0qK$hmaSIJZO}P4pKyy=~@Xp*6_fsqq5I!EdeGRjy!3nl; zdOO~af?lU(EBmn$B7i9(^9n{msFth^h%*H-lGu~Yb@O(jW6btw zU6sd(Xu9ilS*bNm5USY#{uj=s{0eTJBz}Y*qFooLHJ*FT*ytS|Qsfv4{TgI4Zm;@l zB-!?u-7Tk|FC#r2SwrGu#1@QWQ8v9*($DFp%LAD0^=SUv%Vqj-&3fHpTJL>Y!h6iE zbTPb&w*myWLCSCKmrWW*FVlO6rZL3c_5r9(~i1q1@62M6oGN2%=Bzs8da0eM{ zEyrf%ur#9|POp^qnLMKC(DJxAB_;gT9SDQtze}zW0Q#y*oFs{Oi6u zJx9BmHrzT(-82}U^U;keV7-;p#B;J7M6tFGFa+a_n1Kht;%1-nlH~P%O&yN1PAL_7 zNSKPQSu=8e4=*!)pza+bx9?`8R3QEMIgFwtVJ3rhd*(F~LwzIb+lI&V$)wLWOMMa= ziVKam5!LK1`TI2Tfo#N$tvp7C4(6a=&xH79u3@7C&i%rK8#MvxqVC6f2Ybk!3qK6V zyTYXAGS;3U#@oshU*9g^#Fi3QFS<)3JDOG;HRpDt2a@QfwTg*6_=-q*cw3_sh8c6D zvL_*MVXDMj)_Va`^0#GI`*nd5ZZCau6*0;{$sX1MQufKxYU__+GIirw0{Rzkbl{TD zCm*ddJuwXL(@J@Rvx(BQf5v@xO=4_OrMxf$UO4m2%Z6Jecro0+cW|9&BUljL#Eg- zl3sD%*3>?`~$@HXWPs7Acra6b@zAxg(+MB*kO@^s>L1cOqWty>ex9IKP&KpNNE5^~8^nHLY zvvq|8*3Mau;L(elA!^c_bbW}Xhob*7S)U4sf^teKau{o^R#j_p8VZ=Ferl;*wSq7> zmje?B;}O3uyBkhNTky^N|96(WuIu-fQ(tV7d&PLhiCj+K&<1pAfzyhT#a2MZ(Oh z=x>#GRF`Q8#x*ox2FNXc(Eqj^OzK!&u8FU~H>Z&9f2-4+6|d&P5m4y5(o zS_C#qp^pS0sTf`kt>hqrW9?J;R>t-30j%FpaEMxc3(b-r->RMXX%LQSD)=($=)V|g zVi&-&L9-S>7_Sk2h)#zp(i*dX>F-u=JGMl3=U;AB=^WVZ>T&GNhaaTN_gAC8gKQ z5VtWERI+(<_;M$CwH_FQNqj8smZ-E9?ph|cujUi_l^$;V_J3m%z~;7NEpM#9b{miR z>g_0!#NC6_O>dG8I5(9i^AS+TtT+>>S8NNzu;cxGlE;`W_I4XPwnyzFt&k7(_F+8F zkznvx)B!gAID+@Oh9tRVY6U>7+TmU=r%OESQlEwE@=%eI#qF6LvlkDylS9@wz(shv zroHyty{%?Zp7H)}MiT76wVa}$1pMA3O#SHm;j0tUTM5QNg(WUU zs`P1dVt=6jlAnr2pJ~COaZ18nFS8?OO|iSj-&oqEj+BVLTK$`rr;NclRvf;vs!}o9 zTW2|Wua5sxnOqq3a4jQrY`lBjNBlE}{XBxyzR$*Nxcu;SDtYM$p?&XNC%aJA`Vgnz z!8JR?M6kyh($Lycx>`w-)T|BoFwA=KH1)dv7lqccRL_xK=4Jb}w?C=5%sVOZU)a>V zxiTkXq$c;X5BCT5RDt0AWEVfJA$sKoEkrl!8SjnTTpu6db;SgPT`U|{o%_%^-)v4k z0oZ|ZXwkWexNj$Em+?#Pq(uh+?dH9h$+9)AV}@QZ-s(fMEyQ>qbks`40*Y&Uwk7YS z{G@%mq}-i%Lu4xJ@_0{Ozj@!0%F2byqvL2H0P@1BQ(oRb&INBdFwhtcOi1ewsw^Ye zm8ML6AEY3E-&5W5XYKjj5UIk>e5`8WK`d#LC3xi44pL*klKo~m?E{4OmI*H`Fyi|4 zb<=R*YP)3?dD z-r#`7p`_0hZKsUuJVkfd0^0+k8_>>d2fg7Y@WYX@{x4!xW2M!8-l?ygXO=G2OY@St z!%X~1&q*+u9`nBJqKE#zL$BjY+Dqgv+5$iOCu{1kpix04)`Fpbw-B%Ky(nLGr5ML* zhaE)CPU63PKc*yFP_N|LmPgC9^z0ck#rodHv#qaCK3sGV8Y+K~xOkD)SXT(;E*twh%~hz?hoL$HmK7xH&I0<_58c2y2W?-V*<-kO z%ZKGr><1cDq|9l=!<%O5E9v}b8Qa$1lec*v!8AEe$bBGqJ{d0Ucj~)#3-A$|^=nRX ziT2NqY+>U&pnI@y3eq_?;D-PyIbcz-y#Bq@!Rj>RlJ?9rws{Yv0r-K~5PiTG6#)2u zqQ~PEgiy`<@b0=a!!!J&6AOs1Cf@d=1IVeK*#$eFz{Zd)a*_G(*QC!f84)E%2>vZ- z|HrSS`%2PQvXmr&RCn8a7@=P`IeWgx)Ti!@sSEPfor3Aq2m_+EQgQTCLe379xe3bE(O)+i_ad z()Zy#r8!b$aLNU+U9ZzA@E%)56ndUgZD5dWqtQVec%?t1tP_**&E0TAAEL_*e|SOH zaRBb!uU2&RKHvV+3Fgp9mIA`jmqy!D{{eYDxn1Feid}nHt%^q?Zx<|}Nx+iN&w=d4 za$_Z>+b`9lFqDc2y6KFz3GWWS|IiV7LLNg70R};D&uHhG`>_|z{Gl=J=1{cnYvd@| zbhYRRPV6dLdq@C4gN9gb@+oOi8qNeWf=zL;LhBV7;-$xDOU>1JfBR;YT-F+iDP>71 zXXU1nS+YF(ZQ$lEAL)d-R>3W;ShFim6$$y zSDJTS)34}c`G{fOfvbk*R9sfWT+6~kz|n5i!|K{mQ6^=MtolR?~O{X@nkTB zBaUkN38;Rm{-yc>EP}3k$89gBdk7i@I)@`BB&2f4e>;`7N>Xp1;VSCy+Y%>N${tL- zpq@i-yBcfL1tZJo9FLQ3EwUq?GmcJwi#EN3`P!+;os$1bMBL-m%P~R|O>`*jWXQYs z?!A=IoYr=PG_%ia`E5QkWdlJR5D8D~%9yl^z71lga3EIP*ibB(tAx&1DpsdKfK2uZ zVI>4$nS}}={BMVDXqxB@!cQ;5ya%f8!WTT)Qe@yGkR%}f(}b_9Gavx2E88kk#s9(+ zIZ`+p30xLjr9r#?+$r?pe|*2ongFJ&x_NX7*yV=NYsh>sT;sM^1BQd@j*Sz(#&$`* zRl9>|{HAtev`zDx%ls$(q?*ULJpmfesj;EOxJ*P<%5xsVCHQ87Om*BiFo4f$9dG-K z;GuTBwX$Ye;!@UJOZ>$3%4CVX&yEgNC!H>!$+Ltt7RoFcnyf|%m(CFUdVD^s;TF5e zV&g`he=0dzrW14r`vs;pAC*obTUtTyCKO#QxaadtTK9hU*(s&pA>nG}th<1>MF8v$ z*{?&F6J;_;&99we<&lUVC}xXf4ehEGo=4k(wM8z6S=mwS9;b=XZvzc*M%maE??n|% z3uuc~xCcY*Gj_1mQV?pEXypUECQ%vHEO$e&co=PLZk0@L z^F#Bd%3ggG;b+y&7=rNYU*{fi@&v?|PEyuBr_Le0a`$q| zObxw6e!Brp{wDRZwLL>oL(uK>wZH7D52<4&9HuQlJtPsf9sSj7m&)Yo(KA;MB`VScs zZVqSaurz5}hxW;-b9urria}!?N5>N5fTtSA!bCF7shpEJX>8uOUy$a@*{| z?9WWWRAd?*RKeS5#&DkLYR`eR2LhUJXw@~P7kh+_vZTgS(GLXmg(8CaMF#GdBS@DS z8j6vc2068|yab~+BIBBled|Z%V-M%ZboivxiL;}!IO7^^Nd(}T&upv<{fe4G8o3-5 zut+k=jnN9MCbastrReX$E>o%IWfv(zatYbt|Ml;#o!u_2cTNSl9Cvd0b9DEy*2-JN zR|GW|accIE+EA7g-NRH4rxV~vckYpwfh65$-5$SI;3??%9D$@H2fm5Wsu$PvV8lHW z?U}ol8sxR}gnPoTl)9-fl-Kl?4D}rpp?)1-6J-izp0XIx^E{~L zs~sJvrY0v|{Z5kKR+=cupO3p1Rb`y4Cejf7tqregO1|uG+x=J`p_LlC#@IlyhN6zc z=oZuJ3xRoe*lSvddkt(jHQAB?%i>#Et_)~y0}lMJU??J9pfbw z!b%{OB);c(eBDfK^>gvX^P zQR0YNF0dH7Y~63=G~D=?CbZf*kyYMmPS*b3aLmobgvdMAf>AyKQdq+@b?44F#M*!nnjBIrr72 z!0DgR@&oYVCeYCM%>>x^49(CV>Pg$+bV*p)#-J~I4CCp6kM+w>n`1oNeJq#04D!Ef z&>xd8s`VlJy`k8r;H?9gn)(O#9Syp!90>d*it?SE)K{;q@6@ccHQs8RJXHOun$z2d zS?ddx47+epH!2|mGT=Vd4B=Ymmfld53be)&+g8hPF77r$_bJ*)L@Eam0(q3TbjtF4 z0fCS0599+0tFKnX4AOR4P?Ed zoj(r*&=_=`NGJI7ck#e(w#!dZOt2~Utkn;-@8ZjrPCvel3$Cdgsb%$rR}2cWnSIgX zQehy5S_?j;3!61QDbk^e`SlFp=%Wj45M~O7ojd%F_*CmcFXTV;FgPz``d6P|pJ*k>dxWrGkz2YeE~dcJTqqwR!A7 z!1#LlA&iD>+sit&QyK@O9%eZJS|?*=gD!=dne3V%Jm2U<;gQPv2+#(A^3+i$XM#-- zba_Ov7O>Q2F%Il7mvHa`4nBX+U+(Qcn=WqAlE0O7DZs`)98)`>TVzmabkL|{c~&ZU zk~qQA62S)Uj`sgM>FiU5I0z|6b}@1Z@DxOQ4?z69KHYg}8yu;N44ej=JEVEt&Fk2# z+pNt?ajE*!>`I*>&=(&##m<4f7E^*^RggnYoxm(;kced5QpW_?G>sa6g5?)Ye+#B|&+uXEJ2%VIR4oH77~ z%|;%qobuu@U(=yFGSHFgS-^i+eg$!#Vjppy1D$OtKH`eK>;)LP|^SC(XA|z z==jH(I`O=Xi*vrDj%&+%V5#i4#}PB_;Z|NYqHtEz;dD}iI^8*{-8{!S0i*2(Nok*t zL}*z*^RS&oGE#n>VmzQ3YgSEz5tn`ahmq8Yc2@L+(`2skQ3OaGvnza3D7rti*3;b? zB!M8FlF|lF2DAdrX6qdvCop6!tY$wz>$1rDhD-Qiy}RlQBH=g|!~$qp5*nR;j_M{Uyd4vZ+v*&O_^ib!d-Nz?_ zcMbIk`}yW5^Poy-8@cVMBEw(_e5HT@x;w9wJ- z%-;|{iR|L+&VE?sv|s>_@ycrrKU4L&nc&H3zOPK49t5U-a60dL@{j5wEMCHV9_YC9La z+#v;x35q>|8gCQY;riEW>ZQP!2-4%vZ$}MX*Ab|kW0KIYxT<4>ZCTQHXrvgm-=2Nd-qkI&E`t+lK9o%}g!A5DwAvz2 zOsYL3h}mu^(}vI5d*eRCFeft5zn7n2;K#n6l!YL%(gLgGA^5`xz_@EseFwF;I5Gi* z^wE9%7Z6Wo6KdGYDK}uB@Zci@ll+O0Z2iI8TRv)hwx!$kw1%liWc}ei(ziuCrbSR^ zqarj}xpm&+25sd60L0xdXKhQK&gg^od& zH|kx((yh4X0L2gNZX!S#SK4PF9}s~OaS?=tXOp{bW4t$R=KBCiF&fk@+cLY7TQmZ1 z_1Ge8|FYgAEW4ja|IOaxd+|6BV6gwL(pG)IRc{r_{>M4BjYLQ}!KEh>YB;kRgdu2z z5&vFWvBr^)HByq4Kh-rvcF-L#vkrIh{sVarINAX9R$a~vebN1LmX4pTvqsU03FGQO zZYBGT$(FQ|l-376$uKA7lI^r;k$ib^eoluESWh8k+iC;&%>*3#L=lin4Xvg8QHFGN zUahSr(%<#Yd-wvC*z}-xC=|(?)FawG+f%(3imYX=%d8$mojoyDbOD(|nA9h)~4 z0V0-y{Op;$(FwjQyIP&HSSZ^>2P%NK0=* zQf&r~>s90acbEpZ<1)RH6AVU8R zi1g}9o~H=bTh7sggKH_B3|;lyWPt{ccImRhQTUztKqZ)f3qBS6l+^go4SZm`9d&W@{5=H-!r$vyLAp8cp{Kn&1rgV zDJ`HN`IN;&c;Bmr0sp8|xIiG}kCCzOv&V;xcYOtq*cw!H+dW44iOR!=?s?5z4A60L ziSK&(;Gkg~dg_>6))1*T6X#S@t8u4NE?~GXz1+W1YP_3Ta!k;U#JE5Els*2WC3L*dYGefDe5BgN{^-MeA<@Z@jt%e^XXo4+Rx`c&OU zO$#Extt=SD>>2OVRKXuTM+FD!>>SsDPmktKUQ(Z$iLZ zG(>T3Hv(7$POf>tAjpJEiss!5m~4|;SSwrzeU$WSK)DS&DFk^UN~hn1VZPuWNd6;& z+Rpui8=@3xl5)V~kF5hp+VHZOTzcS~f!g?@u` zdM{zMP_NB*62}tH6d`Ih;(*>o*tTI{Xi|C)qagNB2h9%--B-=jVCGuI$6k}XJq|@Ia4j#n zM)AthdS1*IEcEvBt#j2pmK8#mr#kqqEm-SsxdOw7wi8kaR=`@QX4)yz5abLuNA-yI z?1tbA_VC79$>ZE<)X$HXdoV171}0cWDi~L)xrtcNXC3!W9U;Bjf*eK#F$R|L-{!;e zi6UDYLQV$CTKg1z`fusyZ%eD*Q<8sN$SS7PcaLiZskff`u0vwIz~}OG?kvLKBdv3a z>1%%nmbHT*f&N@`g`Ugyu27#i8VFHMwW;Ri@Q|!z8&S-@t6PROMG#;^vbVeuWfeG2 zL+E%i0LnIj$+)k}GG03GrQ3oB7E!NjFDxT^$JcUom*3O2af3sPo5{5Q)Umn@bgY_q zoMg;|SV_1)cv+%fxvly>W=?xzXxzys!hH%SwIgo-DX?f%f?MX&xzy+&s!fVCZXeS= zsCI{3h^5_9?uU|72Jh*oG`JhF(SzfDRJ?j;Pc*{)xV-;-R9aMAx_htMi)m6yx5Tlb zyUXYNW^_cQI`fcTFG5l$DHr)C$7HWn%6ZpWIKDM?73<_`9p>BqP`Vg zNe@_pmA{+%urKS3N(>u^bbfwD11B*Pv)<%OEse%Sox62Vd&r~!@G7(st&`}w{E}Ce zSCHH=J`m-diP6<$4cT7$k*Jz=e?Pd0&m@kUV$JlUdA`9? z0goI)QZ&Fri~^t9XN>JDLdQ63KbBUMsgG@Lbt^nqsW{$dq@5owNd$HqzTCTF(krWs z=__b!d-?U%A1{Gj-tI#|u@4!u-&G5+sk!i>NCn4wi=#;trIB-(RtYXOH{@p%LB!6) zqLuJU0Yzd@1DX6kbnDNT1F7Ncp_>~&Le4A@Pma|kesVD2#vG`bBSpg)u~k2?-=}dH zOeSghqPL6__qld8yBmz~%w7R(Jtc80vk@B+X|Nz=LtuLcfJfMf=*+#VGLeqSg#T|{ zPbPjT4B}s=y-Q=x_E)7KESe>N1Z;As#@-U1*sk@4iXHCpFVE_!giXC7%C+6Pv^VC_ zrEXW{&o4wyzIkr8hQ9ae?a`~}CB&_7LwB4PF}Qx4D0e60rtk^zeR7v}hRMAMrvEa% z(8d3jv|32_=n4|}1ODjrB{)#vnU05(3YFz>}Yho)Ba!ZGEG34cRMk$e_Dq z5E3pz?UXE6VOP`q_TOhEk-hQ+HWg2?zB9FEys6lLW*}@NM75$S460(%5((ip-Zrf^ zTrD&=Pw;IP#H?#4CrWxIi?mC$@(X`Fe$luyRCu4Lw8TYa*L#zNKWc4XY@JbfE}Im& z^5?*n@4|i>Rf3fXUUkvO*@mG?^>aTpN*7;973U&&3uNa<8l%up92ko6gjDJSrk)$G zWltR+`_#~v&MehmE4x5j)5mV;OF~#bL|U+?_2*31kS?O1S;GqQ@I~kGR9-DW*3f6= z39aY0t4Mdh;JeKC^+hfMSU_BapkZ0e(r*4KIcIM-7%S=y7*oO5k_2CYLU$dzug-Xq zJK-*WZp1H-w{Agexi@{eX6Bq7?Md*R`{1m_yS%|&`~2I1H{GbKDzGC74!zs#jAi^l zbE8%jpP+Y|kN(8GhOIQUjUtulA!fYhsdRpbhHjhExXLAeaK8cy0PRTb8?K9>jc?ZZ zY^-l|gQh!PZ@dPTb6{F*?dn<39B#t^cixu%XN`u7%33Wg5-rV(PeYK;!O7Ehuz;bp zj%Z8Ffu;tWd#Ur2c7v!nVK+HOuo#qR-Gut%dPKK-nFwc zn^(E!`=>)8+jfe5@MdrTC3gr*oZb-~_}tQ0%RJq3IN& z&$&KLKBLwgD7DGq56i-3)`-|7`G(z;;f%Fj>$vu*jHr z6v!@lDp=}-P!s}atEsxFT{Jvi_W?f?zuG@hF^!O&#tvZH&mcMnug;Al3Oz=s;VPSm zsh$@)R2ZlYx6WGSj4?o%1yRW#eb@~lo5aA$s@REvBl?zt9$E@;tcyf$I}OP%8r%!L z%b#ff*$HvxKCzS*gJJKko9md<%z25UdF;4{^LTDV9s+k%iK^YE=W z%VG@-CC|P2u0TOs^KL67XcZV_{-Sk+^p4>oqFlNE_wD%a*X4Vwvg^dmul^9I*W9Zd z2gKHpjox_VJEV3%T)%BiiU10$3e(ngK;WL19-Bra^)UUK`5lsC8ZZ7RFs{aPiFj!{ z0S&=#Rn-)p*m*QiBhZyA31D{(rs6W44_fh4J5T}NZ9nD-R^Tg62_nc7R&Tmpl> z4%h8@;#~8X=RCo54*9)p1c?$B6&M)v|A2^|lGtf+{Y$5;Oo}(<5h&m}%75^hb~h$< zv>WF#Z@!Ep47KbW-EL@r1P2{@R>7Z~pt5B`0lZL{ta@wvWr!V%W&4G7NaODsM{VSr zHavaCBg^9(ZZ3r!;65C`6kl*xFc!wQcjDYTcb_(LK*~tmS#;>yi(A z>m73GDEBX|A%Qc%q)c{oH zicl>3Dq{1Gw{9h{d-u-%MgV%{ihY_J7Id1F=2883Aj55in%beyS@&MqRj*`Xf)dlS=B{-^17; zqYoVx&v~Hk`c!lAK|DKQ0$gJ&%DAH8DK~fZG`w=^tssFLmmXN?F9`V);`#6xele7O zwlcn>0`1!f3AJpjnV^=I*u@H(;k@FlZ@TiQyVCjkq4Zj^${-dPRz{$J ze^#Ra{f{xf3asg*%8+^Tzs`<-y&VMuJMGG0TL8s z;w1q@-Fv&&W?9>y*}XbopFOM{B04gHwgS-VV%{G>kL zw;2Lt7kw}8z!t}V?{#lgV>ef$UVYrI!67rmHe~BDwsB!BPNrQ)D4;M!Fj+1Fe=(7} zma`g+_S^ORf)gHU6~XwH@V;ODW3UhTDU*(X{;?KU@)0NfOENYP29RB zSw(@_Im_*maXbH<#?WB#`OCO5~{6^1`t+Sj(={g#J!hXSdbJ)8O3k-;&tH z=lBuna^>~P5AyOJ`0u>sVeg@x$pHRX6en|1!yDx_}V*V(GV z6n?(ohv)_au9|K&v-|(h^`22pu3x*ah^+iIV$>`_r9>>C(!@gO0d+0YVazJo{n2XODCCe&6!}Mm{irjFI`= z^SM_$re_>@pPi2{+@bsPvVfrx**3W`_c zp#GY%ORiIjUg5%|03V8>RQRppH}0tOhfR1+nahorp32=OA1MhFbxU^;3+fB*BT&pv=OhWh zFIRE^EX!|F$%p(_G-S?NAS<+G$ha>NHnZyMYBN-}ukL#r+HTgyQoE{V4iu zjHcu>A~0Jy4Gev~5uk|#dL)J5P+#LjKTVGCgS%)AfRAk!YP=7_jz`S>x$67lETnyg z#V_b$zCnfcMGI{z7IVv|#`|69y4)*#QBDi7k25TVs%J!OwhLf2bB*gx(BPjNM940> zy|)1d_Nx=RfABUx4g)&h5H`}e9bR)s4Cy91df=dwK(~P1+_K-NAGJ68%^ZIOq(n&p zUax^UMS>pVn`oo+8s?-^+>(PaD_W$SFg-14QH_7IG43OH2fX#<2a;RHWHrq6#tmmO zT2QbBf5Fw4b=-{c9uZ%Zj2JAfbGkVzgaU?iCCe0pL#xa{fzQA7uK@BYeifnqt6BVi zk3+C~Bw2o2T8ol6DEvLnv!Z>ujI@;hV0=6MdJxEXM9FuJ6ofRcEQ9gTuk6mJd;MLz z+W_u0^i54|wYN(CtPU4D^(%uWaUmi=-l$qcohbw*N*p*rbnN*ymC{Urzf|Fs5kUUB zj>MbpwGR&HfqbiJv@HC%YH*uT%cDIwLqek*kh1F&@>R!_T5*j?T;tam^4)Xu z9V;GAIe8kMlgXnqyEWl?c=0z1e{pZOPsi!r=p zotoFEr=mJLLUsUEO2En4c!e=*)EsK;UMjiqua2V5sSz`_3pthV>HVe-tYh7d{<+pq z;F_+pOqq5kf}ciiztHB3ECd*o{<4Mk4Xb`w=#s)d3xO)o<=xz}L|IA19s=LE7p(r( zn=mDFiz$q7J9v5FKnxfLh|(@3wndi<|Hd2wh?~JgB#S`+AAk3)9o$TXLq`cqkeS6* zW6&G;(*gSRObng;0lVW4($KA5B?t|u6oZ7S3LIUAL5UaZZCVw^bDDlmt*gI zbAjzyQoC62^2mOF)23vv!q*=k3RQt=vUHr-+9QLM-SWSbN~_e$vOUi?UXG3yLGmA# zZv2iwGWD?98qsR&!{`KgfU88zHP*0rg z#ig9CgitK|!|c3mO~#&lHumzU{RT3u7b(6`2O@^-;5HtP2AQjz-%XiF%kWt3IE$et zDB{j(Ox%rj!a^SYfzpeOnIq%Ly-gW32BfHi$nVk2nr$IKJ0F^iJSFI~dPH8<3A&J# zCBHJa+z>U!*fj5bDx8ABYR%~}hI)3#HMDz&B~^E5PxfYnbE61T?w6A=t=Vec^@0Jy}RCNl{mBO&R_}$+chzf#PB>5!O(xBU0AoQ~)y z=|P|Zs~`G(|0 zNpDB~MU`rduS~37wd0wtHV6JmGJdBy3#L=bctTaf>-qs*GZ(&6-Gp{vXscEWiAN3s zLsw!#5^8fiW2sB-b=pT!O${*_Grj}o~%VO#nwEDgRBcJB%6S`3nA1BP3ywa75! zGr*;`DT#Nr2D1q;xb)h|a4{sZLE`Ic>vMPR@7(1Dy>z51&fC+5v*lQ+;9FPa_O^3a zZ0ucBTp`=*V`!sDorH$*<)umN<=WkD#NUCr`$h_=z~ItA2F9^%U*de#alj0|bBT%= zD=dX9*~vXDhh(^Rz}UzmGqKN=*)FgE*UQEQrQI47m+~{RTn{0v%S&g_iXW?p4GDq& znXM>MTJrG6m^>KMHXucq%Tjr=?|T}`SLc-mLq1iA>>wKw*uy7KR?mB6mErMp?n^B9 z6IZtfpaBGZDPP67$3f@DZoK06{v-S6DEh(s2X`Gaj zVcv&f&ugSQ<_YVV4I=*9OH*=I24NB4J6eHa$>tD<-=dsirHI+k_6%~O>l3Z? zr=+-D-x)XgQ}>MzE(!zw@Fc!ZLv;7Ll%ABFrzmpM1hPRB z5ziFpV%SMrF^NCISn1-nn#y}unB!xMs1S^W@H)0%JYVQCJI5IRz35W^kwBUV%q%?! z3M44z@HT1)cJ$9UVTOz+?Y#rWGWmivrp=Vm+;@{dPj;n|Lj)!gV6kiw3sD2Tk=-6B zY<1}VwQYr|b#{A3+aj7b^xS6YYePGyhtnQSpw)FV}S@WVWf>P31Oc%ePN-K@WC$PEz4#O|DZV=S_5;b!6Ze z#1Y)tE5XGH_4Kl&G^2c~S3hcE}j(1i%`@ir?;MEe| z=3AtJD^bRr;eq+j_|G!kzyFx%9gqC;^!QigJrQeo?-EQ&nu~IV?_N-Hq?ZU&eoK+{ z3|%8euYMvSN{^9r$AZ2hw!mQKGk2k4oLu*}!?Fk{OIX~PftLNPe`WNufT3`~R*@Z} z+6C$mcS5!lqsNlvrNCY}l=E|^U}m>l$m%?SL*jsRA-}uR80j)_a2kBS8Bce?FjvG~ z)L%*(|0m@yYt+N4?%gl){-q09s-|{hs>`9lPAW)h|q+4!{f7h$vo^ zP6{79qg^9d_UdJMl3MF-2K7k(+%ceVBJ|-d0q9m6TOuDMw1ns*wd9So6y1AOv_Iw{ zGoIUUp9-vQJAzj}Wv|wqOBF3B>FSPriO&;O3^a1-^E}Ob$`F7$OZn+uUnw-4yC7;AhY48$7wN_&&1WE)PgMnL zi)64#B+WpaTeHPA&0AnvQH2EQ@sogmW+AZUlP>11HfiLwGTbCRAqD#}LI4CO`m2P@ zQ|a}LD?lHUDBw~z3JFWJ=i}(Tae)$&wV8<((aOMX4>{`h7`A*cV;4OS8M^$8 zxVOjsa%!084^!*;v2e_Yzy>eHK|94)_)BXvO}&oqxmUu#0@y~yvHQ!N9dJ3 z`x>P&7GajPm9V|BHHi?t-wMdXS5#TOz`%{k<=42vU< z3aY?^n8JF1EbIr4LWef4EOQ)A0nZ|YuB3?+BmNV2>}j6kSsOIs^fyr*W-MCT69f?D z64sMc#=x;x0;^7d<`;5EVs&Q1C1(#i0%fV_AR(U(&*SBZouVDY)Pi}mvKaegX<|P} zf+3QO&zUsU)&b7Kz|MHQv9R2imbNz0O$PP~zk~ACBn{1Zgg!jIBxkPe&6KR6tYf1G=E3xklA*p1gX@1O^@m7+cmn}q$Q7vO&$qyr`(oY zG@Qk6P!E??6eIzg1F%(HnxPs_t1AcUB?-XFcpTMtwJcUcE-y8NHOR12@P344zPHx1 zjz!@H!d5rHenDu1mj@hzfyR2D6@GL$LO6+##ok)<)yJFw8AQwfGKjtEjQ2PeFh6Qy&sBORBS%_Dv@_5VnU_|91yg^bIIFhK+39waIUZi-t&c%I_EnSC8$!y2By; zVRy@}SRdrgwMZOxET`w{POUtsr~EtPf8Iu9=?*EklGop>%D|6;-4?D=&T=}bUOc(~ zQ6YL`%aQDpqApLaRl`nEuTr;E#_KtAhA6Ft!MCvsV|IgQQK9MC4N1BTIVh@I#xcXTRudrW+?xQDO!sx4`CM-d3z^duurtgkGWhPV3GwDK!A?M&q!QR zVb}KzF?Gi4{#xhS8?N8~ENDViaRwjRv5=GPo4m)-YPH-^QIWCzl7XbKWp_iAoI>6A z@wWu*;T-aDl#Z0tU`qNM2|6N(BLWfRhz0XlcOEWC`pdpZ#&-V=o6E;^_eQCDyaXmD zY;1k_OW@#Q>J%uVoZi$=K=-A@ktTKqdGbF4TEHeC98ZeA>DjtNp~{`4ayw@BsbFHN z2tux8Po%`Uz+_uZP3F>68TMD;-zDhNXlSwD_i=m~u#pWtnlH4PR9zX!T%G@_AT(cc zvBv-y>E%hmLria_loc4aZ+UG@T@a4=+0;)2rYWYh6(%!VZGC|8G(`zB1cV5R}4 zqs#df$v=ySvbYCqil-E1y#fWm>tpGJ%ev!K9hJk+=;j0VK(07V@Rs7S%>=?)c45 z9SLPYtP0qu010ecQ6GM&H*?jZg&34uauBc=#R|qnJ+t}u3k>={MrcUBGO)6FhacK}CV&tTec|3#s1#+;b+D+&Vl8X2<5oYSkMpAx%uR! z=nv)+`OS)|i4{uoReS-)F^s(E#L5%s1y zUCbuC>*}ffB%Ir%__&_<=dQ>~WO6vNRQb=&qA$90CPyj4#?i*3baSw8k-svLf*`P7 zUvDDTF1#*i%#Agjo+2ZaOf(ATP$<`u<0z?T`3crj=H$(mQdWI@P9mOjT9xqCNr0&n zlM5*_fnLVBPNoQSHFCP5AoZ0EdUKOfKVWyk2Wf(CNK2CRj(yhL0%Up*V_F3I*%9Ow z{dvp#Mc1Gr%D?^;aL8dW+S-aaS^6y>XhoBmQe-u{VOk>i)kQD0!%mLn@%uzQ&3TB| z`9k6RK038IbDh(?cU*fpK<1IDl_Vi-?%Hm^y459=H;B`tNPwWzFjv!Gz@r0^5)={!R zM+qLlz&fE@FQe8wy5>AO5x(SWiWxl_S>cKFl353TUf4$HQWAndqOVH$wN)Mj5>N>U zM>S!k&_2z>0PP7L^HyED*AEhw&G|9=M)-zF;FM_UPe!cgDZ(T*Aato>0jR%S`~c;B zebo%dmh9c394?`uAY_6hqwoHj$+J4$4z=d12H7naH!h&~4G;L1oU7Oko)tft=~rX5 ziQ+sT7d(#nxb4GC0FDqqqqkQ3#u;dpFlnUh!xoHEAKncJiYQz-GCPSR^6JF}gI!A5opA4V=h}y<<0rGP2v2O9Ze|(=tv!28S zfB$_|CDdIN-G*X`oOU^6!F3}E%o!=~cRR7_SS*oU&_mgrz>y}#8RC?M6z}JuHz|P9 z-X$i8FJd9G6!|F#ui=-R#=t&2M}(UjL|lszJ`hQX=i7^G{5s|uQ+@y-K3F8`s)t^F^wQ8<5Lz)ZWCot?ll z!*LaWQ;I|SOJgfM1FN8Xu0tYb+*6C=fxeJEhNWJjw;M4_+m7dF}Sj$gk~T!kyyAkz%HryWP^TB zf3GF^R5|;T>2d0$(9uN|{Bl2j`PrgnSWMmI;9{;7i7=3rh#Vx$C(BCEo8NgGOYg+K zp%Tvg7Jaw`Gp7(LmsH2u*;p98vp;D~KNVo*_zqWbGx!@os?bV^>D(R&&(5ee z9UPZT0bh=7jAwCNRvq~Fh-7$vXp1TrB97Pi@BJC*GI9l7M%e4Jex_4@bVnD(TEMOA z)O64ccbB&ku6Y78xJSG3$#mDy37^S^N4vBnp1%I*Zh$aZHeS!|e{`+Z_IO;-sQ3^&<3 zfwlKe5;AkfZvqi%nbM0V98csSPjDKeM0sa)OD9*?k3!N=5+g+J50^x=o|W-t`qK84 zToPo`lXYFUZ={l#^}jF|C5FPje2=U{GG|oXvcHgn!e_Sa{6X5EAuhFTSJi9Vj8s@B zQ*g85W*3XygT1;;>3>1KYHP6>>;YKaA)JOj{|7LsQrLD?ujveQ5E1`b|svd2atx61j-Y*{=l%b#yA2CEo^I5q#v{hyBvrQH|C0_(T;;| z96>kpH|J2CdhiWCD-b)f21Vto{@$J?ZBB)fH$!8<7S!aUD62Kj@i!^Hm*rG+Oa0=& z4RU}UMzUav7Nu}E0nk1`SQqgnv^fv%Ky0WlmniD+NCV?iKSS3xN62lZmw=z|`38ot zd!^lAylYMHo23x1B%sxZ;Ac??RO2txs#%bl0^WF3VdzrKrYxUD&>I7nq=`JVUN5Qn zxwtE(A4k7;l;aq-xj!F-9-+C|D#Cu0p9;S9hP<#AJYWXf>iG{qw+b+iN)QVQZcX#h z*|AhTca~71Fj$d@aE+4vc$p^8#p1J{F0~j0?*dPI5siL|eic)Kv-3I(*XU+#bp)7v z>bCh__MJYJvj{z~VkJV1J@YNlm%j)vyfCZg=hFH;&a#D`SdVT8UePI#1-;KS=k}UYuP%}S4__8^G zslE46;)1}!m)Vvjud&T-O9a!%%ExNe)m)|yKS5z^_qz*yt+_EM{-m0l(jNl@kCTEV zr1+C5-gBfDjNrXkaPg1!*t0qRI|~4|s~duWW(l_jo95Su0RI5dM9014Gr969( z4N3W)gB~Jzl5nw}lGg_jQ<{(2|+@}S;WOHoJjr!hwg+ga4^_!+{>HBe6 zAQ#zTs^ge6JWU-!K1<5t_eLH)Vz9-M4%1m;6eWdu%$ZjOSh2=ykI9c?H;BS3F=j&k zMYL;f*(KqC;g5AkUT+l2=)_GX9U;hJ7k)W7{j>0P1F7WegXe1r}?}~bVI(d80d<1IXclnB5Um=r( zq;F32Q=4RD)z`Zc2s}3uqOb`=ym(DCS@es3m2%Y!3shQJc3GcL`84+(tDR#eln?YN zY$69O!P};Y)+PAC_xQ;E+GFGel;4B|p{v3c)nHkNuY_|&0W+Wj&T9B9XrhfVMH7yp z0&gLQrJ=rjcZC@)w##MdvrNd2`sEb8`IMH!IU`p-Ah@lD*8~sv%@EM^fV8A9ELH;d z;mMiR`~2#7+qNhN1KYY0_dESlg`x0J*slf`0_NwvBd7^UGB}XYz1?u_+Xm%dFVLbv z(WIi$w<~@2FGj0Xqz|Q`JdWYbTL|^t0LYSB^fMSMI}I?4+*5_^5lTaGx_Sjf&(84; zL*9fMal8=t49Vw$SC)V8EwUlmglXQqErLw1{vYox9TJtbG2~SPxR`vzNOmY(0PYlY zy|QySj5YoNO_GH>em{+3_`QtD)W1WhJBm119kVRj8T0JD0VRg&X^(Q#dmDFbn=m!kq3L?a=E zE#rrobEF;k#R|N;k~R0;DWNRxYdC*aI6{;n?kPLAD*k?Zdlunh;yolqs&mT)Tjz#p zZ9K?AN>_f7KKB##G?Yc25K}$ugJ&raSjiotB2znspM|_!VGI?lE)?$kK(}0l*as5# zHR(v?=Cxy{~a%y&&yYPgk3V1WE2r~0nm z$6iCa;KgFMb|V?bs+U*0i0J=Pf2?$a7qiSrQVl`25!OT_d~UGScZN?!#_r%q6d22fO)21~PGB=$9WL6xr#9FnXD3{$Iu(ea~p$GE7&(TLsPX*2J zqd3+E2H0@8ydtw2M7jHrD!Wi8=kT-hY92C{(;4{>lr;rXlY*v0*)thqUvJ!kfZ^<*4W)BR9uR_`#4l~U$MD`a#@G+N^A+Ak-#Q<6Li3+Q0*E%^w@U6ZUn2@73pgZX zf%z60FFn3~idw}~koDm8eHKh~AYjJORCy3a82nd;YwPi0C7?te)o#^Y;wgfrJjrbd0=OO@*R#Dc zkV|@^jXC%XVBBp^lVZ;hgQW|I#0=EBueT^H`_ks(T+baqZgFor7qn#YJ`3j!$hzDN z>3k*{(J%F{&AkO(fv-}2pK9eG3eOlaE>`_JN z2AT`&d;Nu@wLqJ&aBJYP%=FIwk3I>D`(SdcII-ZW!B_4ELIKF0s)Wf^K+?de5?)dp z*+95F@@?^Th%Gns9LZceqhRSbN!!OqWX9yrPxl@|VyKEKw@MIBf_P-fnOkn)I;|BV95I+7{$g zLNAO|=94?2TD)gs=K)DoS=`UGQQYqDk=c6Jx=35qB&m)1z4mXI`tcgaRS_LU64Am% zf`CL*{L|+%Coe--5s5-27e6QH+`WymiACYhDs)Ey)%y-w*qf>}=K82Z7%v*rC4ZF< zV1z$6xmdJtEQ2t8v7UV_O3a`iwJtC9Q2eBPJVC-*cfUNMBD?-IDBgl68*ANv7UoUC zD}VH2k{2H^OZxHooEBI%fz(9Sv+E5MoJt0ZY=1|gQOJ|`>h>*GVK%5X<%M<7>gqt? zx=-`0lu|PH`T`P3fi$7Q)~5bW?bh8q%c{`4yK zC*v7&OzmKnqG% z#QU6{v#yP``8vxJv%y*LRKcMw4+xkY2fYh{Ku|npbA~f52Ip40FFf0uMEt+@ptg1I z&1A8b$l5r2>|;OQ)!1MtLH`>!6Zm1j&8wy!?kHQ{8x|CLAX1??h~9a7I8o#GNsX0@HJj6iwZq?&D&K!-)t z;fS$+;N)g`p2Ysz9tAwt!U`ijVQ43Z6TbL-_v^#xeTY&w81-_bdiWCmGT2XH4PwPx zqh&Sg+3w^3oo@U4R_Se8-YamDebZI7Oxumm76~9N$$)rBVAXxR@hRWrwAKD%JBoz- znYJ&+WINC;de()!txh=HKa9>+78nEs{2Q)NGfyURT%mu^h&5j@rH{s^0- zy;=?rseCvA!tbbv<>^D%95*9k_T5FfBhV3_@Br7PqH%Ceb8lLVIon$%@%sfcBKlHs z3Avf0_t&k!V)u$6VBjJy;4<}(E+$dz5@*MkFI>regB#CMIVW<3SDb_W`|wjEn44eE zY(4cYPEBeW(N-akwcIdM1Q>ZZ8Gr;?jb;P3J#a-D2}AA`q=?}LeVtgw<7U3 zaDs&2j!|52Q{-XHw^T&;1A`xTJ3b7)5z1aK3i^P3c0XUxe1l0=AdG(kLlJ|r{{|If zpZAsfE9e{V57N%qDN1R7;gI-cA%c^IZLMsaZ^as9boSN20)eJ5Xt741fomRHqE)`9 zgf{uS*O3t1I<&vDFqbaw;1G5VcQ}R)gH3%vj`j^kePPDriIY>eApL7=8>M>JU)BTz zSFo^)8y0uBGkng={^w7N4Q2IW%Xpv#%fEJ-M!G>)4Kp1ffyVSWnTK$JLe?#ZC!=)u zrpVNRCl&Rr$@P9<5cxzZ6I`Cs-NpTxR{v}M1njl;%mqH(GcRZhC zjKvxa7*T2YyiwNv1 zafn*C=zX_alH?P^R!ps!jkc>b;9hF1BVN*C>^5YKzpJZx%_CH}NuV-9Zi|NDz=#py ziI`@0=v95qYR-JjHcII+5osOTc&o-t5Vr>Yy+ar~YSP>@%A?vFL4rsbt6$7)5gqQg zlkdyHhU?_*!Y@9;zagdmv~i5v`t-iA4NlNNy3QOqt;iBu$wO-sDRl*{%~Y`*i0HJ%MBVL|Ad< z63X?KK=lb=e_EU4*D#bvPxwmt2uO9U%=>^ti6j ze|k!rE1hzuVDN=iHapxL8gI3X$$E>*Qlv=&OR<1GM8$l2HA3I{33Lr47Pxp2~o&#p(yv084V>Wh$c`Dl+c=&!!!}m zt&U0+fhyxK0-fvTzaAv4|H13L$xn{4=0q*s)w2-Z9Rns{IJIU`6HXnwj3k3m=@}m? zz0;3bOkRT!7!Zo2g>=bQJ10VAJUa~hl;bx-Z@=lGT}*n=A9gCNtYj#Y4s7r46$;;Lxr4tSrOLQvP~vz;Yke)9Y03fMVe-$!cz9BHMy{MsM(r_PI1| z7eY}Jb>a0B8oD?ZF(LgWofM+6@U+76R#0HPLCr@VRXDSvKwt{I=Ge0JgtDjNgzec&75 z`7RkL9alg9C9d~W{oYU`($bzuwYLQB$H%A-!cCT$e><_RmUFzZwx}iqFP}myH{BAa z>3X18pInIRkJHfZ?xfM$Gf}x9QzWPyr?z>;uT6*2FHL6j{bdoFj95<1QPz7N__EEL zwP?B>6r~q*FL~1~OvABNbuB2`f|Ywe=Ogei3-Mf|;L`rz zeQBr?xsYSJZOSWKKX2o1aeqQrk92>HsH!_Z%Rji!^1&?UEGnN$W%pFTh$Lyrz%CbA zU+dGv`Kt&#^c#QAPi>$X``bwSVy}r*&|o&7HbiOE725A2EVsGAbd0Ch=49#2XgE#b zDDIhb86`L9s=Ms!=PMVaesElW_UdV$swr0I4DMFV4s+^~84g#kSQ~c@;=&W?#}%s9 z;CjahFI-;}ivV(?F89wJ9%+~V5 zUSnDdl{HI=q;ciet>U%^z;eWS-boaGz1mFpIYHO@_M2XmOlt4eua)&ym30e(neZ>@ zM=ZZxkEuCL9EVIzQ_YrN^dPr-(|&v_;?a#%JXAug$NdXL(swo$0VUTM~3_e0d z`!r-|@Htu_9n+pdyNG{k%4zT*^Nf5R$ zcBwyxg#WEt(}d)2i=HXi? zdgicG?x(gBF@4YA6G>>FL#Tz~7zftC#PH5a*Upg7zJ)g4c`{!sa>O}?+AIs?Srr01 z5i@tvov)olapTTc1(aA%RwQ-J3tx222QQ;Lv`Kn;se!fvx8T`6>T;hMsaDG=Ndo07 zbx}J>Xp9~Ne~7)*qw_xWEai-#mz_6ThEiUw<#GNQ3*N|^UaO*Ubw+wwt~O;v?_Yto z!|CcAmW!`kp158cV<`R1P(|DTETipuNfSR@8Ni(8K-umZ%e+45mKi@Xkzx~!0 zn&Z3WIuK)36O8B@DJ(Xv?PYc4T5PpzlZ2%>y+9peOz1t?FZt{XiM%d%?Ouz35ZggF z?wQOvU5Tyy^*R~AG#E`ySp%PuI5WU^?p;)Q9tW zHgt6RZwSf}yi7L0R{m*9NBD8+va?Y*IKfX0+jaL*7eIkkw%d2#%ebZ?S#Bxhp!anVs8|=ZX z`A3NkI?h^s7_&m9TJNuns1^_O$(gluz#4B>V<}7FYo|@mRw+FrRp0TLN)&vrYsU}f z-<2x~XqFtdh^b(=g_GIk{Qp$&7T&C7)CIT>g%`IQHZ(eMu0p${iIao098c&6`Pcfq ziieRgV%#(`e>!)JV1G};s3n+~IWb|ypC4WWFH9@X5X7Yj+TMOrV_@l-}Eq`G0F{55IkEB*9wjccN=F_N`|7_PCdzGBsygTN>8l4r>x z?oDTRQG}_Ej)5no4IJJ(DQvWxGkQ)EF4CS^yHfSj>AOVi;EnI~oWX8(BE`Lm?Bohinc(%qv%C>3LKhAkxUvqSF{?#=s~;asIa@6jr1 zd6J9XlAxCvTo@c~lnX3>wAvxFqaI0ZJOR*p;AdNBIG>@{P(TBF; z_6A=~H?gX8+z41v75r39;7?W}e>HzbO4rG?kr~d%R;3YbbK*H%BhT|jttepZT{WvAuEGT9;cU zKBF#UNWrW4>JalGsVS#|&6f~`YJ-F)o9Co?YmW#z%PG%*CbBAa&hX)LmzSDV6SiVK zQBfc8d)KA>ar;>Qf;_$mgsw=TpH}H0Fz>|lE1fvX{DiUn3zFdR65VshOO*K@`9xC3 zvpt>Je{GEUn9M(wb}vZ5v~)6i_VsKUftzM14B6i2tiStQZ*EtKPM^g!FTWD0p@rvp z4(#v@n-Yg*hK~-Ba>bHOukd(Zut=5-y0Oo5g0@>L$#ClqD7#m&8B@8|mVSfc%G1YW zE!rSSKxuUEj7~_2%q?y<$%Ye@BXWy&S(~G;?H9pvJ*`0Sw;?MA3JPvn!QL(}lO5Zx zvAbx*ee{fBjs9y#G{&r%3W zuxe4I4ZMLdet!t)Vv?j~D4t!tPAaB)S3(r?ZGzgRQ$}qCN)^7z!UZi--CClHwG(5> z<)Q7?(m%sXcZ5xt_>00W8hwlzXI!F}ndf`n%nLP~6VQGOOp)*2QRa_R88viAc6>b! zD4F^^hmI~`Miebx3TlMuPXFo0f7oE9x`Oz8UFBWUa>9{Nh=&k(mA%}5@*WI4I3iN{n4H7bVr?X z#V-}|@OvD&I{j8qnJH0esMB+nH8i@9956>^b(PK)2#ey!>F=m7`9?zR-Bw%_c*Hh6 zp7-~vspHdPx^4=I%vqtej^pA~vuvX0?@ccj^>^EoK&Sb&yMw4u>8-|{Ns`cb^zZ&N zVtAy!*MCwM2iOOzdECfueVc>D{hzGAi3a)3Eh`akt?MRw?jo(N|GuV))4#R;pr8A3gab!y>GB-3VLLK& zp{?4K=;EmcH5>Lol4o~z;}4heJA7wUa=wOE8Matqd<4eIt7cfNQ$#UV>x+Sdxv}1! z%6|2nX4RGezJfE>Sxdn*G(;f@pMmXpBPp!8ex-(8A}DUi<-*8}Qnxq)yFYR7+_Q$F z-J637vie_>+1paQgT0m@rH9MEwqQJ5og0A?_s>Tu8e@T0vYla)pnu-A{?$*d=d+*X#sfdG$5i z6C}!=wWnfWbz`iT74gVWTK>L-Isrt+j_TZ#>rnmgYNVV0qj=vwbX?`4fMeg%l3f*UCgM*JVkJr8Zi=CnT6enEU9 zD6ODof>KBW$8~?b$Ed$WT6$!M%r@Wg&b19@K6=b9^R=z3-H4Q|wWF(rP(9Z%{hejf-SJiD8F4`D={3d}#2lH!Y{$sIyg6ZBkJ^nF1P)-Doc4 z-KHM zZSX6<6G@YqEjI(|z|_+Vz|^st?67=(j2>>;f}Vs9$wsDWf^U^6jvme8M^T>gL%FL= zn}8x0Xt0D|rYRsxkR7@ZE|DNT(=r93uj4 znA&^&xV~o%L!Nn-V~WlXUplI|WxC}O4??EuLO04M$kMd3j^K7H_#zJqx>B+tM+{{-MQPW?#m-&nqo=i|dIoG!S5C%^k=u8LRyekbHiyV^``a!1*uT4mMhL2kp{;2ZFXb7!; zW{&Jlu?E3a=ubI0CP5w&Nplb2$)|!RoFG9ZvSp}1#HgihWfv__TQDD3-M!zY^ylp7 zfCYMz-t`QoG;zpk&=}&Go#_+)+qzKci1hd#%;^7O>dnKU z-2eFhq;fjSbdGaKmZ{UC5?bxtv^kw(>L`+!vP9YUeQr`oVn|Y1MyYgCWZwF4twf-}n3de!ZTr$3ul&TN!od_&xvXpggEO79(Ey zun8Xp#h2@}L}5_mms5d9K7I<5TTwtcT>KvKkcMXgQwP&W^m28@UzV*o>2f0l9e9<3 zr=UQW@Og3&6n0U~qA&z@3@u?#$zrg_l`;3m*%^TIfo#HiMY$R{)n(zW(k0xd{MIR6 zORaYP7^+GgQnT=7SOkk9#S1lUt8XxoZp`+kwOigu16i-hbz=Hh>%OegSBt3>#(XyG zri0jwAmDoH>dGLW_5Ro-+v|Oylff@c{Q`sBS%*gjXua|e_MbJ(VA7vlC+YL`wFMs22Czu-W4)g}8?8I4&wfVg3W%hSo)r=8cBwomn3)j8dF z>|3+SsP~YFU{zY{-EF-OvvgWlE@2CoYV>R{Bf&L)V!Mo^$lLKrHS^gXKb^c3(GYXV z(hSsEHgmf*FA2ji>JNNlP;bMG46DuaI)!xB&gFBpy;E*)Uir@|^4WX6$QlNgpNAc1 zaooKT8e$br?ShiW=X_O#Ab;E<5pVLDj1pm$|B%iTGO7g2U4Rh!WOQ;g#XkQvSq>z^ zZp>zCA2@50q%x;(ZDV9SvP#KJ0_xnFwUwTC`F$r`2ojW4tCF3E{Uv*mrRcnA9XsdT zRzIjlUc?X^3#q3b6xtYh*n)i_h^jvwkk!C=HbcGBL77 zYDd`Mkv2s^pk=1Dt!h$_!F}gn_FcPRdwRp~_m8i3XrdZxv%1Y;^1=>=^6xeOTn^bM zT_w19!>dlE{OcEst+zFhEe}GzsY~xB`>ij&Bk2z=>SSknmMIzrnDyOPiZJ*9hIB|( zod8!%%hXB7<@dGg?DBx(Fjc#6*sTn{!1vsHdpK0ye4GierXQ|7k-V*40L!GC4=M3* zL4~=pwk*$islf-D*L$%nQA|k7Uc;pA+GT}zWuM0->s$8oqKz-Bmz8dw|2^M7f>|0< z{ugL8S^UOWjkDj}z_z5Z0GIkqBlJ!Lt4~{h{*F~Qz-CJ`&!(XyrKP!SRkAHHprO%M zVli5OOvRL7Ix$k8-Z?;1WEl&5I5#-hS8ZQo0sChS6EEuc!wrR=Whch;A7xO2PRpL9 z91Gi!Iek7-axT&+C718kSiIS%)Gm%XH&P$~gj1b+>3ie-(w(?c;m6u2i8HccC((6R zYzy^l8U76nx|)ddEl4;nyX3QKZYt;3zSx0Nq|;KsA?5J{4l>CPu>m>TGq-u3s2mxN z(cjWmG6ME=So1fqrbj|++TVBUD~}9njcIa-YS&efHb3?0ShYNEY^O|bg&p6?5Ncp5 z`u%Zc_$66o5Hnf&Wx6rGj`ru@k37nM2i!hSHr`cnXa`n|?UNWXrU%Lnxf*s`qvqXg zB8N z(E~qs-OS%s>r-mXrSduD9RC7Id|X7EZh~yY!@2}=zkZ!O&Af!=T1BtVvydbsa0%W; zJE$s+hc*1}yAZMYiFeuaSW}*1VqRMAY>lm@T`k-Tx{5TQ)#Pj07ir%+1j3LuAfkSY zKfw_bc}D57HaV)JQ*-LDjPSYV9jNlA;R>HmHoOfKCHbF&ZG%PUW4!#yr>QSgRjF|h z2{ZR~BQaL6e@#uykUnWGLIQc}h+4KT@I*bEG?1IqrDcN#nS+Uv-k})m(mkYiaHPjk zM)I{Td3$~p9BMR&Gw~Z;3W6r$p!DrF{J~6+zo6Z^oPa;sG`k>K4&*V`oPCUlypHId zq|Vgw|2Wt$Xb{cF;RxH8^f_(PQt_Alq1m*>KMd{{{cbAj;S;FBQc?!{e5k zK>5=19NB%925+5okBq#LuDV^k!!*l)rv`HxV^!KurP=6onrBs76uDib+NyIKN)Hv( z9j{>jW8|?-=HTM&6#Y8Hjrf7gmr`L>u`kLo zMtW^(D|)QKuQ<8m8$F}=y$^uJ4Y^x~n7_E@L34@)QzO!WoTu2~=M4>m4u%GS4b+YH zMGP5F&v_+mjS5Xl#=eyyz%F?d%nhmA`DJg-FS03eOYiQO^+S(?c@aA@2-a-Z8@=YP zWq)STZAcM?13E(;z!-mSAJI6=zwVAHBcR_Fi7b5w=I^ ztH=|b&(s#Crmv|ys6LE5WrVzF;ILW%&kdFJ3K0eyOt?tzrump2Q ztYJ8lqh@c%*#y3@vS;<51B@8OV;#|cCo^e_f($4((&&y*qj51qkY|j>Xk!(ZzLPA2 z8wtZ&1m|`Ngu~jw1>;BZ_^IB_*vEzhwqZi7CLeIA9RR0d84)iSL7X!`nF)_*Xalc- zz}=|N@$Mw^r*|8dD5f=UiFC!*+sO22>O3D`5ZPCAQ!;*`QBvG3K0N$rc_2Yoq^&Pi*~Wm{K=-u*<_lF;ysu6d;_+pix#$?M8Cz>? zYFRWaU8F!-|7YZ~aG?d$v9S|Jh%~zdlJgh*n<>G88Q}ORf1_b)>~Pb8thZkXb@>G< z_*SUu2NIup4GuAPYTnYk_h!Hb+b4Fdq7%B1~ms zRn)y(iSH%smwWV?uA>G89xuGTiXA~g_%fEe__?*RRnRB%ovR_Uphn?S@O1kw;7o5U z_%^MeIEL482N@)!f&#uq)Upw*r;ZJ?N#HGbMA%ENiR#Tew`ADplmn@@>C+q)sIp51 z1y`hy+umjx-6J~i^-zO_*p~E#yF368=oN_q3z+U>GTO*N9c1at(M)0s6P%e0g4PmA zG3_&yPq4Gr#2sO;u{vRXp70wOz?{-IafM|_P@pQ*elZqGRV_GNa3r){?ExbqpPY%T zwcsJ5sKPGga%@UMRzX21)$J%A?jI`Se-F$>OV_V+-S?7Q9E$ybNupwg4mkc;+ z!nC^bh;p}!+j6vR!Q4L3PlGhtWz?8`GTU2s zD|N?_*}Z?dcegWYq`qu+bTL)7tLlOumj^NC@YU?1tz*pR#+mMnjjbl4#CDoWkMzl* z`oRzITRGC)H}^g-Eu48(uB+evMdn^XZqUDX`W!NyxK&9}iz*cE1@H52If-?R;XA{jk8&&?Epo zpZU;=Q_1|@yZFv-du4%xx^hW{dLh5?_5gRBTvbu9GTvrV3YTD9F z_`_dl-R-mr!s5`ri5fQbuRaf=W^2f_^xSkrH#py_?yqnA{4OS=k0N{lrxY}ryU)^8 zj01{ejvsGTA3ZG7yU(y{1C0I(xmeb0nHwnunU03{c6jwERqFQFa+ zxp!oW^hi!0{loo6+ZJo!!p(phU*qWLDM*tai)q7pG{mMv{xE#aY|v>5T=5Q;$l=B& zy2O~OpFsOd)i$r3be({7T2a-=;3MOHsemadm;Chln~zLtQ}1HRj0wn>il}Q4s9k%Q)UPgD-mAYs48^m3Fn;>0Qa0dz7{MV}}o~XPmbJX2w zZ-GC@k&OOGF~i?5aPzIX%#?JaTV816#rIw_#R~Y!(ixZ=vpW* za*tisNFZP1Ma1B&N@7OwjL0<=sLSOh-PXAIo>9q>4n9SgS2ZErx(GLv`?3sLw7E+x zaGt0z^aGi?zgPrJpex+V4_Yb(#J$+e0Vt;B6SBrdw_0S*o^Y-+l!Il>8QRzY%LZTh z0aBTv( z-$=iAYEJW(5f`2hO?UKfd(WJlBRBZY(aN>VR}m*_nX=}UWp0zVt-PeWr9-g8|bbH$<PGSHm~bwMb#+?vxE`r<1zT4H{fP}p^i*}1$Ipn0cgEpY zreA$#M+NP!N@SGfvNGK5s@ar7u{p+~TY1Q|tnRLM<4(xUg}sqgYKWeM#pXISa^kqc zy~v*pqhcJPZ`nGZyrL)>tb?`48(bV6yLCs5)Oge#A+0#k-eU})vPmLsSOJ!5JJ{o0 zG(r}NFku_MFcpcz-80<_-wFqpRA9lt&Jjuq`UrG6YdX~l@kqm33u4pdG{os1plEp>DXz6O}O8QroS3X@eQOI-x_p`_YkgkuWIk^Ru5uJk}czvw!y7)aO_d6$i9Ih zv$DY-e&1M0Qy;qqv#s;NHWMP=`Fb>ZGU$Sq%V2?Gu+aA+)Gfr;?aV$?_+Q=7wGR`s z*Yz_ds|1weW1eD~u^6yhFa8d?L=)|j6tle|qRuXTsZr$e40Hy&1 z=RHRo0{x`L5sh?S2@Vx2n5SSOCZ%bbN||zhpLN@)w|}LBRmvjgYW^~3)WLZzpVm|y z3niws=SGoz6Vjuk7KSzz&Lo=J zDL=Le)cKeBA=-FVCj#W-=axOWi5k|Lpl-1?y*+0BN;*|zYHUp}Y`X*iG zoYVNoqBl}Z8?;0VdBj-y9ZtVpmdvFWbU6rzf1{K!pQ&`GG{9FaUF=wj1rd+W)1;AT z{Uw?#4xMTnvZWo21@-yazLaBj=M^oI#*5bu-h|9Zm!gi`dO>s$L|10|RS0j?2BjKe z4xdrnSMF!llbeDb@65t84sB6Te5{JD6Y=;GhOke}qan!`xo zuy*>?@=LiD--vs}>HA;$DRs8Ztpy1f8}#cBz?_@SnB{&41|1vZWNx5$e$i_JY*NN6 zx1}wphpQvuIxX=G4pQZfCL?7;vdBL4bYf5J(nCnyp(Ac@s0Z|0u!lOo z$E*Ol|D3iIZ@*Td06)hGpZCJS;99UYj9RbQG;S(?3dPPXAsw`Eq4!k@?R7y5rnLiV+U-&!x2VvfXvl1@Fq8%vWX@5F1n%gr6+=X8TwECR!&JJJhfrYS&b(Cqcf^(OHv;_~06vs^Ypu zMd%y-xz_Tw_n9-U4-qsd7|>n$_3E!mGbcQ)z z_$$0SKp4aL2ih-dkOximK1BMG9i0EQG14Ov{S2h_ZlwYSoZ#=lZZk4PL;b@)D#I8H zHncS6Tz&@zgD{ga_#MrqtWO-A#3AD3GwQMGeVw0`4daesw*I$vISa<=2sGPVTcM~& zI@}GSX)`gqq*Hw)e?!$=wBNt*wMTd(%h89`KS1_BX#-IDm$fF0>ijuHPW-G z6qS{`XwC?@0o~1!s0n+?TH@qL9Gr`&ML;&U`J+!HQ!%x0`iyCwg+6uSFyRMaJ2&;x z0=p>2)Uj)-pbpJ*9-)*LH1_Na# zJm;G8Y8Vk^no1dIGKu?D7FR;I}q&y45Z^aXh#(>s`3;oZ7QI`Ul7Kw=(ZSsa4A(oq$R7yeQ)ts=}PYFHt{{`RzAV6b<^w!F^;o<{Q0Q|wO;^mL{e#5f z^L=VIh7@oyY1=d;X*FzXVPk7J4tg66?3zbK@%dntm#=4)0lYkgYnh%kU{Pey2x5rQ z^~oX(b?ugFCEd-3dnbQ$!+LtJE~LXM>-d%lytou!9U>m35;)2zaU`cP?djy=b$;*V zHCxiEt)ez4>@*)n8(#=Cjk47cxNTFK8MJag%WT`+213ccrwZS0v=zt?FHe!iLf&3; z)XUBIyrr4UwShaD|A$+RB%u1;xoJhhl;Rf6lkGnrVnoEU-6YMD&Ck$uALVAEWzY|; zSLU?sK=F9C=Kx?mEJaX!>^Ax~56wj}Kos;iSCLfqF@?;&fI>>OZBsCH1!mcHs-oSb zt6nH;vM^zbgHS~~Xb-a9ERoAX^N1Sfkt_Meq|wPqZ_~~6pt1B#wYCMCRlH69E-UBL zChQ;^<`i~Zbn1qn7gy^aDTqULqe;9*EX-~@)M4?&h;|E?r45-hI+bw8Uz`F!g*jEOf_&kk{ zGZ$uTvl9-QfWyVroE+^(&^io0q%HdChD6N?#?T=XHg43W#dV~#zLP)Pd<;*!Q0K!; zy^HFjIh)I$`Og}*o(t)1vmDVV9=`{T#uH7_r!Q(T4jh7+C_dJSVsgM9TwWu1554d% zoo`9?Fs*jeR|gF!q1VX0S~bvS*UfDnInt)e&b0sainBcC>(r56bbQ0Y`gpfrrj?w! zgq3N|2oe%0cho%4IpuG$%J|k?$%=KDeXgXfc}+t|E_Bs4ss2*W3>Mh2zz%D|l z^7omUgGI^G+oSO5{@m}}yy|Phk2TPq&SXSwAx8L6b+|7mkE5$h?dUG&$&&Gd0y9dj z&|TX^{CUHuw~{OSR?lzHsE#?BDuZaY;k#ijKK#T?(&4$63CtF!Fyg zi1NtM@`Q-hMik)Uly%PJK^ngJP0^@5!oDWU&4a4(CJFETyZbJVPTz8evVY4q^G-5W zq2@=NLcR|Y1?XzlNFNT4&}Er3l)PMBJqx&VBL#e{P-WB9b zMPv02b=M2Q3O7|0C~JUDQo0=9Da+kxdu!nxiGPH0Y;H0 zgS73!|Kaoa@KCFXj#f)4C6>+RG%d#Cp=mQ(7wT|rMg&-dmK<_YaQ}eelSTo>@2zZq z*NhNX8PabF7HXTg1Ld{o!9}}H5Kj(iTV0>8Ra~E!eWcR9nD9uc$I&|=eM9+99I3o+ z^$YEyYI{X4l9H^tp*jK`5?g3q#|+#wLdk}eAwN>GPSPW~+#UQmd8h-nv0(n{Sn}=t zp!42BbT$NT9{z;1eYGJ3Ii*Aak;78sy0!BbifVL64MuS$trn%^xPp(BYD^Vh3!W$k zmR`f()EJc~yL}N5GXi8hl2y7p5$8?J4{$%Vm}`<%rtCTBByV^;a zz5nW_H9pK$F-}q$Nu`ujUxNp9RQWBGYe6+Ax?{q5le2Hlj7U~a(rcTHCDc{OiKj4g z_7R`yXmy3tULTzIRh{sI#Ik|RmxjIVXp9o_0BPx`L?*o$FUcl2T>8;!t&g=kV)Zla z%ahwBL#LHloz&D~Z4=SOARC$IGO9VZrBUm_$j?Vc8gLBmPKhc>I?3ZLr-!;gcwXLHW);T>#`als*`+p3V zWTUfNSgvSQH#eg88`X%Cfgm7%iRDUW9i9_-Q`6nPeEjWx^|PHCzbd|cVRi1~bN@p_ zFT$cSv+wT?d4oKP`|I~j^5y?re1Ex{5#xDM<*n}F?PuR!z54i%8x`E5I#TIcu%TG6 zBncmUsZ9=+ru_Z0_~&c)MBYoM?o*5#i?*TEnU`6H5>y{}hjanP@h|Ex84z6jD^}$L zmR@ReV~a|SMz6{w#6bd}L^5~!Q5;mwkEP^SL%h~uiOZNC_+t%Y$X5ibS!A7~93+yh z{is`HDRFdlg~N0ara*gKo5s!;=JBP;1UEmVHBla+k#ms9CW<9AVGg@^2ORL3UsKNn zmo6fX^$wTDP7yfTUaIl2f2!%iSExaETh-f1HGS}69h2DoXTCy+{`E-#CRFvw_FuXI zNiMRIL*@^{BUkvSXpGg1{#B9rM(2UYvW^K#b1yZ{T&%=BwH>mdHkIfu+Bm3|Yajba zwsd=gpZ0P3AZ6&?82k-uU(xsAa;#{bL=e7GiXJgyyA|l;2N&E-xAuh^9HdyMqQFfL zsh)hxpey-x+|??s>Ta5|X)>$rQWj*UAbJ!Uuy!cIOq&iH=AI?0oeaEvC z_C-X4l@IclwIv5cIWDq2e`~QA>yuh$h&h37t|p`!A#3ltWdK2gQ{fH!9p2%%8iEkb zBTmJj?>%H@FOI7K4r_pHX&<%ijNny#QBL*9UtwJa;C$bwiVG-zgZC|e6O7VM|b8s#9KPcop z#?$nGv>86gv|M1N*hcla=i1R$ln2@UP4*LvlTMTUOQ1z=``c2Kco={Mt9k z&YE_CI)N__&xQsC=Gw59J)o~$XNcry<5`*u<{1T(uZu?F{p~#6o{_&!^~Rr|mjaf6yFXx`kVA&0OvYZ3CwdVRD2@7o zr9N6HZOZsA$kj1I7xf$o8lJk)vK&dL24)?wU#bG)$1B5|Z-sYvojkxh60pm@}{?d2NJf}zQ zKiM2Ag=oXgWW5Owys}}7kEyCz+&LwKEf-9r7y8P5A`M27f6!$_g-E6u2H_A@C*GmFt6>a|>jZO@~bbUn%8 za@U*%1Jbwm8S|-`y^$HP+w))AADj;>4LTyGC-kRy?%`4R{ zw#Q+xs~^fXo0x1^z^wpDB;Ongw= zOdkQ^0C4LWT!nL~i*Cp*bHd7yme1ISr%z3`&n6({H8Yy#OuLV(*_b+T0Vny-e4Xec zmnqr*h>}sjJ(rHt4CvfTMmKrE+&cdU|IvIoU=PI}B5Ktvj2f;fWZ>XpT5jY>u4)9` z%)4#vLUSkXVX|VavrnR0#h074EB|`m2X~N#(EtYz^}a&!88?+Po8E6dhd+O%g#v$i zU@w)S1Et*lhU~6@&Qc~VYu?xz+M_@yXXM(8zt5=;I~*ZIavnM?u-b_5J7ll+M76*p zyLKo?eNB+Qi?zx_+2KSP=M{I8WOIDsheVOu$!KZnL}*}}O}Njt{x}kE_53%Xt!ZZq zyg^cyYQ4&AIGk2=K^&bn-jh?#@__d*?<25r-VuF=DhYY5c;??hN0YJLXGXkJjrE5( zmtab;p`hJ&Czp=FE6U9MA?=Z;GG?9c5Rog0Gw1>Y_kyFwGjmqoEdlH+J5|bG z9`1Flk$F1&6Wkeo`2v_WHh&ve!0!2gpW(BA*czWSTg|XJ-vYg^eWq+FC>IW|j&|fI z!lw`knf%vuIy0pfJ=F^z)T+ALh0l}^R~q!nQY&fPNB%}0xKGI6vDf6F0^zbgn9o|% zK{%R%@hqgM%l~JESX(?&a*SnabT6Fm@oUpw(Sj0@Anb~nt;b7O73`?a4oe(3x13KS zO(RD@o{^7-)$TlTY9o)ZqN3et7LSP=KGh7cDNT zx6(!Tw=oO14I3wv^AzZtndo7?Tt(Mp{NTXfzney8AIrl8ph2}{Y-mkaUQTh;PtdkH z@zIwp^C!k?Lmi)W_G!XaBct_!&krm~yjj`^R~w7Wt7M8NNn?wkE$Y+HXJydr%d`D&D(-}N2ufUj%;y7CY`_K@`Fl=J2dY}Wza zXLwi>l#d1lhUtgmW5XsYHcjxYDW(5O_PGdd?E*E_B<-!?|eydO=m_#dM?%>rgff92twK~fMn;n6iR-U}Hf6@d60$zVpOg8uc=Ju!Rp-#rE=B#C(5G5A z!%IqJ12s2oB<;?1hirgZBDeM847Q|rf0g5}7VB@^0?JUD3Oj#i?}uRo*LXGXb|8M;UDNA%bAvPlq}O4 zleiGoE{H4zO+G$V{dwGX>(8Q`TSEO&csj5PEEZEPk#OB3BqF+mAI`^q54}g>TZt8s zY5{qahp(J}PV+j0F9;pJ0D53p@@-7i_OY(m!LFT=iFUCM>>%f7Mi-t{ixw^N_lB+PMDw(D9dY>K?U%aat$Bwroe8d9ON zYO>5T!7St~qqI;%uWyrf^)cFa-6~+ikwDo!8@#q23VlvZC0DU~-sB7xJx-HO!Tc~<&kvw$MDr7Hpo#x621llgL$&y^ZL1u5^f97)huQG!7 z!GS-@C0Bd}jdg}1SMMU*4SZ4~vo9fRWxx*kW@`M^2{3B77fTPl38_Br#DIl{HI9kY z=1hT0&MC`On)_Sp8q1Yf34<=>+S_DnzQX5fGP3>P>-miA!rO4hBVjO$w8HuH7 zx{=?2U7;H(Meg~w=`7zb6YA~+7YfT^2YrLGl_Qw?0a7YZT*)o2$2DU_tJHuSk^dx$ zynSEZL`O7;GRqqf3!e6P3OE9{e;qj*sg{PYOIafW=Nna2WJo2QEW!sD@ADx^g@Dr#C=FRL5p>VN0rH60l?%c z(m)-A)^6IpE+au})%r+kF8zJ+?k!S=yU0qdqiNJ09rV(;ESYec9+K=7xFSqaEqnjz zKx?HASE4eKEkE%b+3$UF`PTqy0#>rcpqgW-1ooaljIScANqoCN!Y^XQa4SR|v8SyT zO`K`<=Eg_=C+WMJE5WhwOM4pSkW@?2mVbev63t|f~Cj>_#ZEErnr1AqZTA% zBs`uabZJI0co;N*Z^vW`YB4b8Jy2J#=khz5`RI}4UgHTGR$#b>t%mw;za}p?B6+NP zxIxLlM$By~rKvMn?A}+`kMeXLmlsQ7KR16}r?``C)pPUz?K8aKCyT4wD(wo>c1AgUwI1|Ebr{0|}1i0=_~86l{dp4V6R**ZHN9D_FP@ z)ca&Z$(o?&pBc2AZ`|TIq@1@78~3eYHG7q7p5J z&d_}0aHrHGKF#s`FOp4eoYldIu0fS5a9xI2=tgd_2s>Qdyw@;0^>fG40(hKHJ*Dth z?|Tg&X#J^*TnUD|srqhWOsFtVX46ljmI-bKG{qB7o7d!=(<*7xB%o>y5MPr7+@#(G zSH@SdLUkb#;3$Gy=**=Avz07@X#Nbc;%vo9L#ABP?Zt7L@_`C;P%;Qg=5p!QLOz4A z#E>Jkw>l=1N?kFpI5GS;OO}ws2&M1CT<>o^RyA$H<;dl5Odb3p8flKp$gyt+)u27Z z)c@lKHEd&bN^f>iT4;DxX3y6o%KnF+lh3 z(hjO12AaVP4#)$dnp0lQ7@<_Ub6WK*z>fx0!8pLrz6G&w#mx{^#l6Dg;6$lpirivs z=!$D4b|TDf+^t+B3WvG;J;-7BMi$BbA|k@#1K)tOJ7IqS(+FC&aK*O)Exag63F$7x zY9VTGoRVB#!%o|LUud2CAs~*gxQc$OBwDPSj)iU2YFGKq8Ia#j?yNb~mL9A`9)u@5 zDsLr_9dCUxKX4h`yj&z1KLrc1szUU#-Ax4@cvK0UJPrNAY#>7DS%3$l+v@hQ)!PUC z(#2<;>?5PbY~jGJJ2hSt=Cx?obh|km2rvoX19w02=w3E}qjTZsWX_@`bGp_LeulII zEOPr-%Qlh{`3@i+huwb=l#zwv)pF)!v^T9PP_3Y@NUV+td3;D9vO?=I;tCMxLzad} z%xUi~P+lnX-njM~c^qJlfKPDC<9xCcBAx^|_IjwKL^v!QoW+!&MYu|$n3&0z9(<|B z93zj%!i&(TJuf!Y-oWT8#6`l$C%VXeCVwnv3X4x6IHopXk*tosz+4TG-Vk%hUv;hByF7UgEnm%HZI*Uao$5iua)t{@_YNY$~$=_ZgaM{dC}qIm1~ zz}Bu8sK@lfvn&yo^BdOpNXQ$81$Cmw$FqYZzwfMWn86>%cU8oo5>wUp%I9T^w!qBE z5!5M?Ox>g=w5zwG+)t7^pb0VnB4#v*72&Oh6TU~5CcARwCB{in zCUcL<_tXwDS_2AWA#cciD8uUxbAp~2H) z->KQ$omOcim`{aA&4)#gcIxjM;>J`>RII*$@dC7wpVUb&g{IEGRG}Yv)Qj30*$1lP ztku#4j67o?B-shAxf(Y&I_gpa!cye*I zN!uPZ7e}l-Itp5FG34pOMe;Zw=Ur(F^`@BA?KoXFjZ-DZ~?g$gzuW zZ7&)1a|_MHchXRi=?254CU3sK(}5t($**T7hwk(she+H*u?SVz9jpeU@Dgyf03OJx z6}+no`YZNEl&02HcztK1#&l~8o=eh8vB?#TZ1`xQZ|M-kN_Z#oHrdQg4P(z7BK;n? z)PUw?qUVOBi#mCe>!K>+g`acRTvJ^&I|1gKh-SM{qRGFBZ*T&EzRq1IvjnQ<$GhOL z_cO9)V!RUvXeZPEa%F8+m8Z~MW3QR7YVl-{0@mZicHX`gyuh8@@+1Ws5ZrDhOdmyX zqgbH7dx$tbTwU`mzkCK<{aNwAe+zbepq2izi3|zPp^$NN6}TTK=|4u;uQ;;u=}QMd zTDd?9XhPOi?J7=30_oa9kq2}axTT6@DUlTc0YI0;!r`jOU69!d99Y;D&q>fJ04rJA z6+{23`ueAF#J6i0AbVpPhYigj1rc9#S>RZ1j}_wE1u~X_c&a;^B)}cRk0~-zYWd;l zD@T|%4(W1~GPv*IPU%|o1$a3HjIO&%IPQR~(+Zt3I4gZPEG-b@rMzfALCjP_CimcR zLghTxMrGy-Nfab>{Q-93nYx)kb~WF9%*xO~{C+?uZDvvEB_5!P+%;*Y{=qH#ml~UX zGjaTOr?*E^{_tgR?V^3FAa+c!JO)~}l2*xvdW7V}$~)$-&e>{EOY6BwZC zB|-um7smp30c*`jeqC5$*m#;+bJxtd^EJr|2`6$wM+os~i$vsom&1<5(h&>83%dc zR5E5RsrW>##V^u9-*R=O(1*Qg@WBysl364NJe1}>yftfUvO;&JdAy2qkzS|PfsW^q zC_j0T6LhqSe#s$Z?uI}oiT!Ys?qRw#grQ4Swr?+2z9+af5c9MFJ&bADrbv#Ms13iz z4L>2Rc5M&5KaI7-*Z6$Lr$A17ls*Sg1eERj;c6B(0cs})Cjdo_c@kb@6M?P>Y^a0w zI6Pm}7MMEN$h9%F&$Ab$o;yYv1t;Lc^70Cv7evdHZu_G+_ISzgdu4ox!n@M{zjd`> zf7O-mxcPZ0RncQa73vJKbnqGEpDDi!^#a-08>M1}-|TI=Ef>DV8drMOZy)G~1?^xT z)P?K@Q|2#0#V5q61_WKIGZSE2XWawo zpEaK~i@n!W10wmeX8-z0Gop+KSr-zhoG})dFZ5O;4?@8Jjgj-4C*+2HtV=?HpP=8Z zQ1)lp8Et)Q#N{+rm3Ow~AvfP$bW9i^am)}VtxD+!Xw5_w;Lj+I=^*b^@?rOHpep(8 zsfXh*ugrH(t@SNZXPBsPoRjA}+K;rC_Yrz0U1>PlFKf7^`0r`2%y--Q{?s$~Sh+6^ zwcr*qD-n+@X9M^TV0`&f3)wkVoe(sO4U*_4P(`@4c|$I4wG}ZLK`fy$8PNBubUPRX zqhbv)xm~hofIZPb?ZSI_OOMo#$SwT()u7KxAbyJ6MF+qmPPfF#HBKw7>zGjm{!bvT72~F^slA`a<|jSTZLOtY;@n{Xy;Pc z6%AplCGR)X`@lF$h+zK>lnjx8n(@1sp@!4+dlkb{~pdY*#!3p zm4C*dKQJo+XIPJ#jv?{#A}&Ai?O zgY`cZtQ@L>1xtPY)u%!X98xgqp6K@#B%_jbO=FTY0ap(@z)CM;ad?;{Kn zq9JE98wYh|a?hZz{4WuEsqJS{1kGniyMIbpvLhz1w1Mp0u8&p`16rwR$JH1S)oH<0ocOb4} z?V=4_!z?2g)XO_LfmSCvd5PrLMW`?+;M zI1}%Vb2c+3QKhBzF(X# z|EaCR;#0eTx%h6jIwP{a1o42~U7@zRRr^FrB3?N6W~4y42U?{p0b_uW`%Zk1=f8w& zzw>m40O8`~7F7B|DBB~+_8ogA4hDfc5nscRa(9qZd;+JBa|~u+QQXW)2`~skJ}p| zSDxvhGyL7CGf}cicFYwH7E6c)x1M3!ViGAU?L4`5h4cK;~l z5R%lHa(Th_@80bGbZ+e8qaR=p*v*LOKK51TZ{Bmwqj5qM>ODE6+@E)`+&QOlWKU)) z`C-n=0}OLC!&O_{%^KKa!&Om~0kTXmB~A(y?To4&~( zoKUIWGiwtjmAM@miI+zL=Wnd`jI5I7N~J7(!;X@LdkodewoG)iEpOE?I!KzMSk5gx z$YsSY_wJUrLxr?uL2uPA5B?t^?Z?{Ubs?>8-MWyra*wCk#HN2t7J=I}oJD^}g`x3- zVv&@+nY`Bj)6vRn321k3_tl|%x>r-}!MZfJ3Y}8yc>B}ACYaq^DLA$JT{-#Rx$Sq0 z-fUMXj@8!eDbOvp&snn+H-ggu#-ZnS2U+hPkU;ioql^@&ziY16%^1G!aJ1(@d<9|l z&KvoII6P<8!oO}xCe-bBa>&k}KD>(H@Pp0Tx@A)0DlPNEV%^9Rna~45i^n&5HqJDA z+{0-H%=O)`(KTAZ1|)&%0@Tz%y$h_|K`ub2_MHB|GFqo}=A=RG@N;H|I^Wxr0;l{R z87<}i$Y|BF?|V1kppJ_xPjn(RGejjPRcKg_^oMmBZTSg!LbI9Y34uI4YVxY7w^c$sl3%_C8)tu?Cf7Fu#Dv|(81O2jY5H9ZKeQS zo9Hn(5e(+yg{_2N9m!&ullj8sC7$*$9?qhZ*|{*yFjNJU5bK&w|L2>)smOR#7M5R$ zyNsJ)nv8Q!B8}(BoWTb`M8JV02X|2S74i?E%;*H6A53|(y^h6%8m@vmjo~ANDF(n( zbsGTs8uf?i2h+*SP?kGB{CO>!DI=`ZrE3$a5)nFFyZKba0ZD;gtSmE^PnrON5&vI~ z3icH16w8yLA`PS;Tyf=PLVMvLIvE4^@om1(0DEp_(err)=uATT7!ZIQre0z%?*$9T zOOWhpK_K2FnR=hO1pP)bMla>q(J68YIDb^i(;R-)4aSi&#p;4mY8(vze_Wl1TT|&8 z?I{AoL5w2`DkV57s3=(J5FAuSDM3+DT2w$ldhgjHDk1|xB7@QbqN38IcY@M`QUnZy z5+Kx2lR!vFviIFM=iKK$_aC6<+uwfITJQQbSjl@BcLu$OMq@Em_XZp6Ru6GkDv<11 zfT8soIMUq<{l{9WPT{yuL`g&IU&@MR!pn8?gmZ4L+jbQjRTwSVz}>u4(iX}4j+9&8 z5zZF7MIJY4lYSC=zfStY!rZxAcYX}?ne0l2Qm=Q*SB_ShbMeR%Qb%O39ap-tJm&Rf z_-iV3s3P$L?K-vjecDAMY*;Bdf$#Jzv*Ye&z?n~WNp?&2k>qx#G!X~z&7C(u1hn;u zz=6wDL2XRBK+C5jd3E5NkLN^f?9G~eI}KTU`A3Fg-r4O+5NMGPIVuNC_J2LeRsF@u{XMj+3|V2T#kq%1 zmpwA?_{g{o7M30fR<9!grq+SJ+>vqdkY}BpvGcmkH^ke#A~38}vceL{c1aUDu~4M3 zS{9W6kI=c=Yt~}mClP?j_CeH8#(oiOr6{D1LM6bAiP+a;6#fW}WgIN5&z|cu38;_A z5<;w!tQ(jgXjUv}4k^en`6UUwT&X}Y^cWbe3s&HwidHGnk^QQf+K;8+*ly=96C34V zl7e1>#;L^4_#a!*HDmQ@rr5p(s)Fsq`PTFu6}7DzvmeobAX-A*aNP>EzRFnPMG{wz zxFCujpl<@96ZkaQ>jph<%y^~a#@Okp<15d&l*UaJy#7Tmgs>SSTqb~meGa*SS*l}m zZx4oxlcF>osw>{w-JZ7M!JyorO^wi(9-3t;3~xJ{=?=eq$s5?EFPApeFm3xhobBF^ zS%3%ihL;kEVLPW6IkDe^m=eQ6VP+I0v;uQ-Gr*j^4U4lqVz@YH_CX{^?pkL3Ys)cE;d2O);avZA7PA!@=Cwd}8tja#3xz5c3;nD;#QY`s(}d!k+Q^ zDvJXf;`I`zyhYhh+8XA5NcDJr_vinf^_rkoyP!k}v7jMWU^TxMs@uAp{g*Y^?0VAq zK3?z!fl|LW9qzDR?sT6a25lC(@l%P1pqhvJ9mGX#;h^CR=##YBVi6%5DuYf{#t=P| zpkSI@cc9)dw8*4-qBc&!bB|WStLE`Nv#_OJ)(BN9YiJ*yTaTBQLhi@4y6?QX%eQap z>2Gs;`+pxNNk0u-JJG%|gOO}pPs)D$Q~robbHH`iEEimm6ce^$X99I227R3yPy%{_F;PbRFc%>{SWz2`ziDDmL|zbuRonLYucfT#woAlT^D|C{{S3Q;f9J4_b|L5A8}( z(GO8ZKU1^}Z;6vO|Ls;{3h{XR4@rOr%N*D#_p|T8v{kv_#jcHjJDqNP^TpYyqf33# z6Bw`);I^NVJ7Nzd& zkptY5k-DSu*pQxMNM9vtRgYL!XZsi%TX-6W4>*h{Cv}UWNJHeNdtQ9T+BlpHx8loA zu@2TawOH%x7eY6Q96~cvP%cw9c(h@t++Z{>h9K=Nzgq3*xsoqP+c`K7<9+)$v$itV z8cr&U8zf#*XJ@IlqnJe?oNb3m_X{ptc;Dbw4AUR0mqttqR|P(|lnIJU2Tc=7*;a(* z2-G|<8Q*mXY!M%$5G5!^Tw_dhA>)5&-&Tvs2fF}@x72_77;r*KG%;BpJqbofdMLf! z{MOC?2E%>h7)qNobmJwZn}RJJgmzvJ@dzC07L3G9BiDO=H$nUH6Ev!3h_kH+B7ELM zH8aGR?*RW@{V>`HgdY)HzEtgS5R=*;%#R!bdze|ZzBP`Kc^u2`!J&};=owP|Ti zLyuf&3H1MpX>dyq(tH{p9>hcQM`z78y;&lQ6?$N5Yoix$kG$(%RQOeqkgRIoQ`H`m zF&Wd(TL)H~UwjX7^n={;h29H_xJCB7xO#go;;=YsV-K;lNRPc@xW34b^BoC;&bUF7 zZpYyKDzyVOjbRb`xYqnplm!#LLG9z=c-j#)Rkt9%!-&vcK7NmZ>s4_n1vY!gboV^yKPdtK#C0-{ml_1>P4uX}DK z4)lsJKUhs(>z4UJ3g4BtU+hbFi;4Xw^1Rb+$~`sX!2QT6X5$8In zqlquVVTSf2!*!%nFSHl>Y+8|(TSJLO`|E5dU*->_aS)1CT%3|iD`s+c&lk-O45xH7 zLGT`2kveR}i!}~IGlno`qGduhuv}8t@A>TycXvIoRO7xR8#~ zSg5)Ans(HTMzENIPwJ3h_8hb{P2429jksIGw){xlm$wl0JFtFr&Md30Y7CMm?@xK; zmlMV;#(s$`VDhRURTM>!Pu2&1iqD^0LdDC>3sE^Y)KOdS?M(+_;_c`C$=v7^W8UFl zmR3TV^%cU5L^H00KV7vqZ43Zsyuq3Cj=9ib6L@f884M;v%BML8v}%{(=F-J>wD^Wb z_sB>$dIr-Bl?ghn^q6VT(1bVtraodMxOwz2RLUyipjl|CAF%tb$2H~k&h)%mBTN%N z^5;?Ck@eZ2B|{C?_51jpY)?FAT8rzV3;fh}Yy+n<>4+2o1MVs+sY*{f(yu&0?>YYAAt--ChoYI$5LF(P7FM`^pSA$ix1k;ivdWp0=F`h5#`49X8h z?}#LsM}|H^mYG;~9Vuk?6$(^19Y3TGa5L*eg}xXG?}if6_Et?<@jn@3Y97^2A*Dq1 zK$g)(u*v@`Ts2ma5sQj|bGdNO2%Mcpm03%@a+;FUGFlwoCNvzY1*SHyd@7O%>sc^8 zIYlDVCl*e05}^&K!4wC6L2)E-zc_)PU(4J0F+&N*E1#(}2yyKlt=HRYX1b3y@bOU6 z9#7>UBpJw)@=itl{je6XUSATXXpq?Vl4J{I{(uoG3Rw2KKl|0cP~AomS(ikP-^( z8sWd!V>PG1o<)rSowcBSDOm@WgB#_ZH_W&<%(*w zOl=d)u7NnSsn>(VhWplV>7mF_E@N1~1NM|w#{0r^1x>(T;N*RYL9|20HzM1Jbrz}u zgsk|Z{C9$Wa8Nh^?PYgf9idyyh%3M}z9tc1O)#8gg4jb0aH-7T*UA%}UUdPl0TDem zwU@BG>X|USOo5hLi*9LvG*9R)oI0bpp*&z0Za+%#ypN#TX59HsRIZn9CSpFqOxg8s z6|7i@_wgc`5&G*R;`EQe@HV)s@AiJm87;K>gOIts56@j4e1ugbJP}{pZ`s!Q2cg-K z(eXGyO2ex?z*T%q2q*p_cp706Z2<(N)?N3y_gy4M3wc-rI>GNC@H^W6%t2d&{BDRJ zW!fFfH^_dX@jnRjgKW`PJNXkxaDpbCal?>2zSNiij_v)U6rIm;Dw_hgHqzSUyM{D@ zI5|r%Jd&K)UKNL~%YWd6%ybm6(B-nsJ zDq=qxC4iaJ4eau^KWmFF-uk?ulKJG|!$R}Au!qwd;21Uh_@|BW=c-3Lo@#}5T+DPz z^4`z6PiB5gRb7RX{xE_$1fDJHB@Gpnu|FXnIkM9q1iK3>UGr$~urF{R#xPVIXahQK zC}CKgG$ujpIqw;22^OK)l@A^NM7-*81pH#vxQ`MRMD0j~>iLwH?np{Dt(2iA>&d+4 z{b8-ufVf(^(6Z_7z)Cd%R#pV{#uidc*$YCUQx{LWTW?L&6_cpZ;m27-` zZV=zZVKb-p4E8)N8^$i13B3P|Y{Q1EjHf^>))tEI2f%zCbOQVQz&a-t_qTHt`lr@Y zLMuVLehRqH_u`w*PR67=!NJ===tah2XVGT;3Iwj8WXGouAjZOk$W^ZET500kuj{Hh z*fwB41ba%~0eAhlKxOpEG-&^AWn2qu_-Y5XY^akDtJ?4+$uCcXnj6*IYhk-*{>gT% z*uA9mdlxeoI=yEQYyR{XcXhEXjwEWNIQP9~)d_4jn-GHLt+YZzi5aRiYt8gV&rO0G z9LEh}JyLq>D7ArU*y%L3bFMW0=tH|e9q?+VKw%^6jLkwwzW-TH9WPkB53FR&CI}dE zM7@n}SF>?VC?g&d5j;&@r+V?I$v_HmFkJ|W^<}4hBc{TXIb{8rjiT?61tXXxHwtTl zr;|~FTy73GXO#20wMgGJzbXw-Ev}vXOkL&=1%R$5fS@4M%lCscVF`eTUNiZYN- zKtct9_X>D5({&CkY_pacNfAqc63Iux{YTTr1*&^g#BZHYcu=+fz=uFHPZ6fbCb-kSTN7Hl<&3cusHkp*zNc@yFjJSfS51bH-mjonto{)Mbd#IOj z)J^KyoKCKkrFGlDg^A6lpP90|yW72uloCZX8ek;!u1Mk9^%-`}otgc0_N&C7dYf@_ zQUeh`fpc=mwNqcXTVl~%)rr9{7A1FJ`v)P2#}vl!x_zf%P9hI?+0ig7M;eAFCm2MW z-X-`5#aSyp5nfWg3M!$X;|gJTMMbS@ zItQUqadrrbMscFsq7ThU&b3@vdaGjU| zvIDQ%c8Mrf?lID!Z;V9f@wWo3*|yX4j1H7R55CStkSlyM-;58LR=IyTfFlE>g<%&Ivw~Kn{yPqWHvH!_aK_FR>jFBY*Mm8 z(1YKB6p}XDQ6@57F?DThy*yv_Z8wD~eJTtz4)_5i6FV}}@f(~(TLvp<*EBC}8!h0MD19Cs;#O7y= zQi(6q)$la|=k<%YqBIT8`ir%r2&yyqk(0*M!uDu6wcRMHRe;Z-K-I7h9MfolXdaTJJMzZc>M zeO5!&t0qE0wBTbzuFOLy0DL$aOhEy$RCp4_1I-yAUZBb&QO7DLmZv@_UV2ioy@j+GdEV+>PHJ#v^q;aN|l@E<@g_M3_JEn%?aIle#X0)OgJO zS)vSZ(FB$sy_I28kh@FPY1CTBJ6r ze3%l7-fN3QFV~12D%|xJg#I=-!kkz9ghTnqGmo1F2*#n6FN2(oO z_Cxwd9P2mgl)pk;l_IX*r98urg)BX_d-4&QC{fgdr@qoBr)82S@rzRjAs6h7i;^Gs z0>w1hQLVqT5xJVX>5iC05-#(Th!*h*bBV(ueK4Q)ehL!a^^Y88NZOJI%BRzEzJ5n2 zPOQ6aT8~DQ+%S8!?JBsnjx8ZAs^t5JNtN$8Wvv%r8#sv68_Oc!JU(Unc|}8U^&;&W zs?J`NQZ8)3J&{-f_$3Wwy;B_~tB!R@yR^Yn>On%p;u4qf6X?ZDjOOrffQ zaS81BtJO9P_pP89B@Y8_yYA!)Xr2e#hB&5PGRI_i9SDx5aNSjo)sNFM z3}X+uAS1^`k$c-TGMP#8Hok-M%d#HL;{Q^qTVX1-EpgozSM*n-_jybv!}@nVJ?@C? z_mTqbAKjd?^pe2y4&a(m<8G*e9ouHVxuW#yJk0|fSJiYpSW)7J@DO>f+O`m_-IYhH z0{!j*{D`}Ee;sw0N?kjH(X4nufX3rY1SH+AYcXE*SeGChq^tkZY2w%butrEA>RUeR zHl9W_Na(>xYBxUZJC?6mj2a$lJOoZ8+4ENL>yx?YpS2AQ9qX!KGa+OuN_llFuG}V< z+5Z~8%f(=Ii_sK>@P*EAXc~S?XhkVKV^-Vxxy32%OsB;fgN!Fra< zOATYyU}u$&80(DEly$e9RAgvD*z|ZTIEjWl`JN6F$AQp#ZsCowTBTfAEItc8X)S}g zx?Ig#i-HGOE%b@nKJ53t>@V0EvH2bWvgRQW#XEm0vpZSurgs?RrmqYJt-x8TgUHaX z5!6TwKLq`7sT4l^K_=ibG@5HMgWz;m4Oe;p0LziSQw`t&&dLn3B1LN&*THw^I;H|O zz^lnN%yx@moMvS>G{Tp%**qN9Ayux%91VgBGj;V~2pDX5{RG?Ls2*i($7i)P8Y%;- z!SM|Sh_50)aGZIYUz~J?A^iYec2fYqtYK%|udQuYI4iDRQOLtyE&Jrc1$@jOwAx_Hm8Oa78LW_6C% zy7T4EE)u$1cMscHJ_3%}?;5#)@S#n_D@vX9kd7Hy6m8Rt3Zb3pC7^om;J3OH+JG@4 zY#l1GpKRjyoQd`4MT!vl?}@ZFx&XZv0pIobN?z9{_qd3!`` zbTtkcaY99FNO@WR!noD4Y-at@m8eJS#9aHdIgOv3v=!LXPG9VkR*l@shtteAsH|{o z_o?~9f{(L(c|?9EF{19S^3C(bj_4hXE;J|#;=o>1*vrr~9+jU4_%{=SjxFm~-7)ew zpXvQ8B~doUNC;Lytd3hpTuMndzf&dNo-J7GP+lSmdvYS~6eATmnrr34Cq1Fb-!eW5 zriD+JkX<5LT@(y=_ca`csCu1=+Iirti#oXe`D6hb; z=a!l<8SS=gN_DIdW*5WlqTd6UVmx?$`7RkgQ1v))YY@?BuG%YT$MM^93jRybel^L1 z+ot)YY~ylP?F?ecZlqDvwO~m%ETA9TUh~M$@D&APJ78$wT8SrioQelF=T=Y)rG^W0 zsFp&g=#sx!*iVQ-7&`)fRkqk|#D z0~M9~v^ofz;h{O8iATF}%d;5C=?hp4jCC}p;RMrt9UOa}TrI_dwx}8ky%5Cz%g%PZ zUfo*NWc-YO@4SQ8&sm#9Xe${*^9w$XWOD1u;!5cv(c4^_J&C)1mpHhPfc-`Y5H9!{?~?3U;QZQ&9pJ$~;i zI1Bm>*&CS)-FG>wLbKK_!s@z5kFpmG{}YlGBtUo|j%^ERHra=HF(ke=JdHRNFawTq z&tw3u zf<&eNn_e+IFF0`dqn6v*lagKXz^=z=qst?@Sjp=&v4ny0l%2<4&EGn-OVlp*M{c6| zA9=I!GSZgziu1v6YaKG~$tt5%dDg}|v#EEenS3s8zreb`R7>h;{ekCjj6kO+nPc{K z-{6ZD>8wMNgHMk)etj>0DP%$Q$>GNz`EyCs??OKK#Zntt??D9T?BD3y;c6}gDV_;e zq6xYpGD$Lm4ia{%Y_1EEjXADg^7@u<#^`awzJ;v@7DQz84YW4BC*t{QBwwOlUNC@| z?75!}zc}b#(^{Im%wOaXq*vFEvaN}m1GrxXu{K-hG^1@yw)K}ll}N>JQl39?(Y<|S zSGbjcaVO_8-^MbB*x@15ws_*^;Lz;!iL$V;LF3c9m>^y(ffMU^`t|q0-4G?!U+USS zaE#evQ@6*R@mZ1jLNCh*S0JnegW6OJcxi5iUYR>HryZ_P_xzZCXD-sxxhD^YuWFE|+f<9Omff?8l> zC85Z&{o^FTi$dK-6xP{<1FL`L2kHI~_q{*nnOgDDl!>c4X`&&diF~OCE{hs~8;=h^ z6@pns>8)fXr_ai+{PW%=!j3ynWkaRo^r(~ESCC!WOc9eBz(0&e1%Nw)7s-$4`(PdW zIl-Q1&R9np@zR=!ns@qwVA?n60Mou(4;wUJQ#?icxY~;Li*u)Rp9NvAcf?Cw4StCLKvmyXpmhz^H=?tB zNR0wVO5LL1ZPgt1{pVfgs!Nxhq;UId(6cqZXR1|04xbO~KeyLs6O6v{V@kfOkAY*g0QM|F~?yj}BnIjGGXjk?PS@9AhS?-6|G*PlB8zwuac2id7! zt>U3=Zr*!8&YItq@m)D*>DBWsqcsKCY-d33pwz)4el3B=G3*47BQUn7_;YzLT{p-`e`F>Y&-Q5Ip z+w{hD?X*`h8#QFb^>TOb?2rFK$@fT&P_n{Y7YDtcQy;z$Itn`QC}brmcM_*@N`GjG zdM|?TN3Pz`K#nRe{X5F%tBdNI$GAFJnk9}j_j4p-K zU)#5k63k0=1f!O(^9L&0eSU(IZ#mQs>P9kfqCGt8>i>%*7r;pJ z;eKGcXr6P?4*y~a`3KMw86R5;l7S@qDw>=Y&qnTjzn35~K=))LXIHZW!_B@Xw zD?fC+l~-hwmC3(&UuWt->q;J^K!}I7j`?{IR^-*8ff&Vj`V>y{HWazFB?2q}K};K zu-wNNs|-(=7a&K2r*rl8yRb|I$dQ<5)Ty!W#5psg+F6R3zP-M>kR@~`wqC7kK!mtQR@?A4@~*U5qP$(mz1t-xCtSYTR=4Ib z9?3>aU+VX__j^1Wd(fF~nmYHXD8UckSwFESvoh=rwGUM^S>pc>^ zI!#FI>G{O@B{y^4oaTh7MBKr#^rtS_W9OK?!GEA?|4Cdl^d=dgNG*ck?2ErOh+)QxAuJhfIdtCg;tG^Gv7WVU zle5S{@m@4dmW%z7rC`r56P0Nh+t$=AUuZCqKXx6O^nkzFq|_q!cLV0DL@h}T^`YX6 ziirJEYtisqdkn~2w#Z`2Yfaz%Lp4@Lo%30p8LGP&*)0w55 z3m0AcM9jn&$S+O}7bC-DBEnQ8>|4+bg5c$Fdk0(gz~cNK?aZ=Y)O1yF!JK&%4ngW6 z?KgSqjF?NsdgU0wo^bXrXga=V&Yj4taAX`KJ~Lr_^4LXei8t8K$u>rWiA^@k-FV1< zQ}|?R%Ga1Nt%cYW3T@f;HYhHk>MGJ;>7FNsp zAISLo_vT=xj!Mq0(xa7GQ^Eyae|J%c`WFHHmWxZ3rx}840vMj&3=~HvXtOJ|*=xpf zJ!u&o@C{tF)RfoN3~(cLv3IpfEMRteEjL^sGUBla>x*np#;xWVf#8yRf$ zjnS* zL;M3!ZWEj_uN`iVWSr?B4vqUX$0F;v-H}61;Bnq?+`Ce?27q1%<~RieC#I85AGAAs z6$S#1*AGKkzW*BFC(~F5V$EaTTosAWi^_LTzKr$y=V8m$STj*^bN)r+eIu)BmPHDg zHSX2!=P#G+!0XdvTqbtD`t2s%ux1E4EuI%u)Da|4#8ecNm`3*A3cQJUOf5GxG|0+w zSev+kYDg}aCXEa8`!hspB2c}=FTd^Yuo}7kRFkW|?&31d#X}ES9*=Hfmni#z0OFcS z&^2Vnlnu@7c1TE;Os3FhcgaOtT=z4 zLzln)W+F;Vx2RFhJZSE3>ohfTF_-_(7sdT^Ig&kor4Ja0)q${%V?{m*{mDl>$U%Q+F2`Mrss0fcFfsr66)MXCBZ9l8uF<^fZx#Iop{@l zM0qC}hB$#b{y6XPB^vr|y{f94q=&Qtbv0DrPi&S| zLy@=J;J|udk5!DB5LWX-Umy?G^$ez`N)W2`cEs->U3g8QZ+I-|BdW$-@2V;=9{sfC zLRS19h;*L$MJ-dIR!NbM7fx9CVpDX>PLQRf^sv62=wLz)46qYbL)CfYWh5Ec_xO*7 z8s4V;O?^p|Q9L^k+(1Dj6-dvT%^7JP*xb@+9kLW z+jL(I{d07^Zeg!Ry3=#R^tsxb)doAEhQF1;b>dVCYNF9xu5Jn)Lej75d!(;m^v{ju z0kp}JG$fgp@ogdxSD~v6Cg6up85Y*>y>PIm;|BjM_yp&*-j2_(-kiGX67N#gHPG46 z;puJKy*Alh_(ft7n%4r}9SSb~NZfnC7;C-*Va3(YexiWUW+?C6oIA|&-wjc{tLQ?r z34L06h2()+eQUOMyCIvCm0>^rrrL{?gi}iBJE%kEm;`$g=>dvJI3w?!2@S#~;k^pZ zq#9YH4NYQwT;LaPUfaIgk$wr0;HVwpkbVSVS1DZbLE>cr7tIZ`S1i72FxwlPuYmE1 z4c-k`5*BG6l2X)dO99oKG@M&PnIGbwGWXmJKid6%$W%}n zRsJxO;65aG!pAKpxlng5Q5ry8*bj67V>Ni_%?m*f9)fLHvH~J#{b|@{wy1hH?yD^+ zZ&nvm5c;H`$0|4EeeG$1xFtb}H1`kKTVCmmbA3ZD_ZfJ-sv6^~0LuK8FznL@#G9_O zhU3-=c?9d4p~<8%ipAjFB%-xJyQgT%be{ggsRj)dIifv9%l>N<+8`^xz%Sfcs9?%} zxr#M+4C619M)o4}DCJ6ax*yzE6pGFnzVSxf~HI`UceYPRz)jNuRLQW6vu!Ib!(ykm`dY+v(JX-uO<$8D%(rX$y4ot1HV z_1gNloOQ_1S8rUa4KBj9kXbv%w_<*gVxCD|?q=L(WaRA2auMZJ?|2C}m+n5;)r(7@ z1z5T)xePuiNI{i6S(yBy^kMiPJ14)oANI~hoq=T?#cYCWA@^e#ski(~_5#JQr>L-A zx5b(NvdMZmjGZ0Fy5T)*Wt1y-O#xy7U^kAKe*wQeh4qeMUYQ)s?!M`Cm{=pUT$4@A zL5(av!odwIfZv{&Ass=9Z*jBBe3Uo#8is4U>SE;=H9V!SejL?N;2O{P)Dya{I(oBa zb;vZ7mRpVuDCFgdDUn3N2nflZN0su}Sews<(hf#NlEz-zO+^$}E?df^E^4#&j zi7Qvw^q5&2X$kdbp zTDR8xxI%u!{+%z1o@fLfZ{K+O&^?b|NWBPX>oH5M46`JZYo$HOgZ1u|3VFk6@wd`l zNlm#de#$2e;j9Vcw8KYm=CH?wXbcfgZ^>u;M7YaAr%TKX1xjkRLIb1A0zl47sR=(!!)om9SZ9UD;EV_D|8U*3pX6>!vj~pS<{dB$8TrPUq*hWSN%{X zvY2oEZ3R|Zb_|kNZ?wEYL=v%N-EQA!leThZrN1pRFUBP72(I#UNMTH0;8~6A(}Z+j zYbCF<+mN?7aS#m10L$+N)G~eql}@Cl{Hiaym6$6PZa?-{wwrP1%&pN$(|v#C(veTP zQ`BtNgDup3H{9U%iJ31p=9&rW@Ui|AZ7q3=|8Wt<6**o-D@@W)M0I@Hq&0c2reHGP4GWkJLaovQW@42 z?G$C3e$1*e=oO!y&$UdKjaE9u{G8~ElX$xMT+(pWW9qIuG@J+3Etwh)L|3*}GxsFf z-X^OrF|Tn}dxR$REP}(Q7iM&SE25b;*mr|n8kNyKEYvFFuFHB!ZIv_CXTZNsL`icz zRktJhK3onu>~K4T-8JO#J(%>{tiHE!)KIl>^RQ=^aLroSsZILfZs&{} zh2;(9IQd+1yg%I6t^!#hXLeaoCOZu?M z;vqX3In*JDCLYE^W%6Zqs<~k6tMA5t875=7?}|7D{65+>FTW4g_Os_Vb7r+iCSU45 z99tc@Y8_g0R0FYxO#kAhZwC^~y7z%o&l+fw`3=75m>-==W!?Al>L&sX_LUI)$xRD2 zFs1%SQ)rMLo;dMBeoCT^`(^zcR8>J*iAcr>Na_nZ!HS-|)gRsiwnOji)I6&^C7RL* z>zg(~LtQ_^5^58a8b)*XyOf@|weZfGX}(B^aJBzIiy6?&!z33mb%|xeHYf_|0m|Uy z6;)eyQRI8_mGFW}(oMz9$H8*kUMa18-Q%>jWo~D+T_wE{$N3mR16>IMkws+)X&)Rp&&Zms|c=t&uo?R7PRWto3q{iX3W1<7;d?1-c`#LTm9k#c$ zZoRF5vj)5T1*I2CqzhU6tAlp={EH&HhK_EK%N zE{OE0+^LPyJb6`RVrXHn9Y(@wSDFy{*^*eO!UxtlnE$b-D_1dmC>VGi!+meX&^|C*cBn>Fjn z!Sx{(Pg_jK!0{A=)Q(b8ck78~X^B23;5=C?;MT|bVKLe3^tV=?`Cp}yf__m>Wee5t zgW*1fBB?*=PPBph6BNupMP-b5@K|LD<@X5f-rFpRO__*@-Z)KNl2OoYt_xwce?c24 zV5H^K^QTvz&vIyO0BAb;RU~ZanHN2rx3X2)yaO72kE&5a&wg>%p-lZLZ#ET^g6aNFyW;59fRLz7)z6p;-Xh-Lm}e}3?|FIrslXjcRK~lEmrp?m|_t$*9Mga29bcZELsAh_s;)N@i>s$ zaEti2skW!nQH@b&esniI2JTS|%$3U&DmbTfEc_$qs)QljWp%1*t;0Dq0!K293@IEv z46r&56Xr&p(eLfKcKqqlta`&}{gXNU514`ux4q_WTG&6xUs)L3WBE6omR5&Q#0bM3Bq2ourGYfm4E zonM!)O0B|4j3g7o0{!TEDXtwgO$4v={C1)A9O+ft&SV{HuQRXmME}AiXIkW_(!xr1 zO9y^+EDgC}o$>H^hp2{LqwV?!(0-%We)`FRJ{H$Uz@AWMxMOcKdaDYQ9ISX>#QHdD zKe>&=Zdn|A?<1Ti>hv{2|Cp>L`CMS`W)7^sf6>JhpRj4M;N3e0IBYhrua@8SriVT+ z3yZnxh3)Bk8rjv8_R*vA$NgwdlO*BqyvPTY^sMS1mKB*Mv=%ySkpNk?yu8s#H)DA_ zN>z{vf}C`9bhTvtn3lYD5e#5ltO%Oew3)34OW}w2b%UA_*oF8j%)-P5mqqmZ;VIod zup@TEg8#$u7;40gm&3E*JLkelggtHdG!;k8INm4Q=Hg5>f8Z#=(Z#KJwv7W5=|eec z*W(ab@}{Znp74o8gaUy<+#FIw`f)T)dD~5+byb>7TaY##QSTi?I!ftz-vW0o(VSMJ zEh4hpVAOem-`k=vM&@KrxeSW4-}CMn1;qzUoYFc(=SH99&FqFCau05k)A7K2sgEN;r&yI?oh~p!70O6wrMr}s<)r_Q9k;!fA@A;Hk>K}4}m%HvXq6O%V@={1b25m zUG;SS&rp`o9`M(KL&iUx7Wv72o$Jg>WYP5 zlw4l!h~|?NQ$F0N2CjPc@mZGqV3-U>{El-^FYWYX0TU~8xK?%0f_Hn^$S-Slu$=iN zE*@Am203r`5S=V5NX46nhbD$I1NceKF8my5G-~)4Vcw6(;w__AjG+klQOGS5IO~59 z{khP(vz1Rug>Im^rUe)~%FF={Oco0K=v`AdO-iT62xyRHxMpxSn+|)sJHHGwko<88 z%qyTuA-6}~f=!A+9EOrt21Kl->`o+#fkZLxuHcNg$M5oYY=7hQ{)~jUnD`#uvsuPg zGc`yBMGCnGr^qp(A??Sx03RZQ4FfN1Lfh0)vm7e=4ySuUq{ zR@wW@enZ7Rl>W5PXfi5Hc^Ho#iqvQ?3M=H3{rvJb@lP=Q-fs?u4u};NfO$Cq@fI@h znY4mR6_vxKn3H9Gr-$c~8sN1JoZmPFmb1N&p(6Zt%dj8j7fwf;8l;z2MxHG}jZRco z{OLSu)Tq|QxZzdg5YdsngK~nI)*mJRK{P2czSPOc`-C;pAtJ*Teo!a)rO}*`4Qy=2GNREIWyeZ`$7U3oyNgTc1=z!;Ap<}$yDxA} zC2_lqfEM4n4Qas*NCM`8zzOHAx@jMdi(S~mkZ zGP51RCZQ!?J2l{mMX`a&{1_(l3~^g%pAl2nqJgwjdNd+1m>C@Omv~vHd&uE~I(Gh` z-chJmbySs2MDzBzv(=_V!y6HI41&LDOjW}JAoyHGHxIM&9I9Hc94uXQhTki!$CdMWR#J(}eELqCq3a zA0RRnN`R6wkkhh_Sj_+!IbZo5Qv6K|rN=gLl-PQdzNn@2=$-*Xb>^T%hT7~i>637M z81y~CWdo4`1g)pk!jW+4Q+oTLIt30ZRMRIy1z4c~T3~xPQn@nh#ovl!5V(Q#{D>|0 zC6RLV-{pfqJ=UPXX8b`EEKYnCL9#o-6xVba8r52G=}@|S#L+xa_bBPYFY#dshcCx= z8yUZr&KD(%8&O*njWy+_zw`&N}Qu79hY{nhwMygfBK`o% za)zr7c;m(~@H{bbLyvyR$Y8u?bF%34>F314kGbD;EUB^@&V@Hrv4v`mX)s(`!}rbY z&^l`+i67t5b?HT9MU*=5L9|`0Yci#K&iH-}rSFBE=Go-vwV=A6D|YtU!Lfw3r&gH` zEGPZm(^!2~OcWLF0V7NkxW6F$L)``dyuSP%rz% z_B;dl>x0b*a7aWkfGjN-NST}QW z!FXavEMN;3&$g{u5(umlk=Dq@VCk&1?qq?50<=4L?fZQXvB6k_^t{omz0RBI_xoD+6&C0#$^|D(#CFvF4ZJxwjl-N( z(L92kcq7`?jMJ?7iJ3k>EdFwM(wb}IGL2B>nV<}M@BSa2-aH)Y|NH+ZWnR6+^hzb` zB$Y~k`Qzp=BF-zI-ed zLp}*@%z^fm`;2uce3^S1%OvyAnc(WaMuR#h$XH@3OIMD1ecfhRz6pAq4Vg(OG{RM^ z_UoXUlv5Vpnrh7N>LyAYsCQbkHOQ8E#GDJBJl{XV-p^X?tcs*Un?c~AZ@^Kemzpk@f2y2?mo3iVKavYQzEAWcr>Cw643H2(jh}Qtuh*#^*nNWHm7nHiM~iB;m+8te70u zE}SyH;;!;6ozxW_jKf&gwMYbZTZ( z1+Lf#eJW{_3?rw*Tdl0{NNu>KPe!lB*wj@+tq~+F8LyP%`uA!_4jJmX zGm464b8b*^bE7i)QVN$3l4@?hosSR;r2NWFp&(_Cn{q0h<&67KK2too=#^*Slk4#; z-tSxY%ELg;Tp?klW~SWDYX_IC*T1NBp^XjCNkPbM32WEwEJ1;$o}HHO;ZUm2<3m%j zZuzqpYu%?-XX@Iyn*oLXg*gQfm)+s*vhj~nTIQQE2{plzm2*K-_s|-iln{u%0FT&8 zQstLvDN7CL_~Oe?_>CXu?w1$N&X^tTFKYGn(CLOU_{_>T!P{&`HFOtc0O#g^5<&>> zwT+3+!th|F(!;;P8t zp)hsv&$kALaFHy$REM`$%gwSDkqM#sk!@9FkE;>;i;|^*j>8erD&9;N-OAUx-pVW^ ztIt5v_~|J{daPW(YT`l{^ebikGjQ8RxP2>ZU(9N!aN~|LawoEgGXYycVyH@ykj*l< zyl-0nro+lHI)>jQzNW~b->Hb)lI>yXe)|U{i~DCWLa?X;-Slpg>(&(%Yys1<)DSF~ zW9t0-dBlY1t}5aZY;b2JGd`dxc>llg<2M_}ZhdgEocbIg(QX;{<#~o**|FG-?5*{}&uqYso~+1E(sZ%f?X4`8Jc9(7FK z1kyu6GhKtCGRZXt_`9ELgZ1OYlXLG5WkRDSlm_^CgwQOUSbDrlnlTF5aGo`o@O96CTMZ!dIt}naE=zDHUs@z{mb`$<5P?wKA z>_oL3aM*tW{4T=l;$@XY9dI#=!^hq{chj=8&{(jeJTViF5dZF*$sgqR?+$0YAR(JQ z#NgR9x_Abi%CX@ulqrGMiFue|W>%k?+eE;;ThSFm`2bV?E8TL=Qq!*fKiC(aZ5p8% z0*W$c0W12>r0@>Jji*=$u1i-WjA}ueb<`)dZ6__JH#0W>2|dstId_l0CfpV3zC?fSvoM??^sN zq<0*jxcCfgC=SW64ke7mK6SE=fLM1ip0Kp<*`zja3Up^;zK1ZE6QNJ65xnMzcw+cA zv*h-WOgHydr$llYlwqHo3OXku1vJIyZWn3klH7UUb7Z++3g2@7qO?fKcSOPaC!1*! zr1Aa?_%(8VdeC>C`dRhuT~99k3fFTUs0B!|K6l5c)4roPj*$6SJd0l5HLiWvI9Rez z3O-W%bP%(68_uhLn)vJ77pFC8poe{oeZWvVy8p^7R5EVC&E9=W_3Q1COS?;kgDUhN zj!A4gB*v6*VY;kUIQruBVx?WmAKJ0^YuGJGdEM4VyXNI=G#D1 z5ytt>&CY6jFO(JJ4@#by_WGrNv;=WY6dCGH**eEb7W?zVm9kZlB;l=D))_A0=r?-@ zEkl9%Q^83%(aV}=n91roD+xov?fNAPM&_u$a%b~%JU>t5#6GQ)EfmHXv(aKF`h+`B zUph?U(&~W^%VB~JQ{B;E4~FcagjTpIvdqLUleSImjC$EA6^zAbhJDvt24VJC#oH!~ zrB`j}Hils_W0zJ;=pU~qp4CF4x_Ux)RZwSWCw)_e(N*hB|5Rn#dD&*fBoQNBbF`sg z(F#ZYUT{u-m_ZL)h#Mob^8S&rzCTsVs5i7%##sKss7AW9T)%u%hPb_IX?#L&CH;k- zPO$Hau#Rn%fn_7~IHfxZQ2Tzs^YMA**mZR-)?!K2f;%dVtXHgmZY-!L_w6ukgde~? z!hYYRY`pUVi4|!Xl^-#$gTR3}k8SOhyt61rUdrbzJMU3yA!Ma)gVI;o&K-(AK9Sbw zF`mmi<^Vj_D%)P#dFwMc(O-|YYy|tlE2l?fzR=~UFEpzpBFo-P;e0a9j-NbbFFpp+ zKk~1?XU4zwo5_Ex9aA#$K#Gl7w=%}4y>L8x;r5uA_E`^)*9+Uy8cA?39YcMoikl~Y zc{JBJJaYtUGCDmLW2dttx9CS{BSw7UZ5_67)Pu?V5pWYVmcekF!z5YoM-G^}H4xnH z85CBv|fE9yOer(lBdLZK0IoKO&)`Fs7 zC=UGSvRb>hfQ-exzzF#3ARNT${v|tnYyb;f94binvX=`f!d`D`-&E{_7@n=rm|Fxf ztY5kG4925BGNq`fR=gC(a@tq$m8|C>$2KzZ_juVa<>3>vRC(u0^K&09cI?#)J5!M|17J*M&Ta+v+{+r!S## z4--!3ym5_i+P|=1un>b-b^Y3uwMC+!nyqJ^>pybjYg`j;RKoL=7sCMK<2+UulGn^{ z#*BZdQEro8C-q?T+nxM+rn`ec<9Qv%61)2-TbWh1|rAzHZ+1D5B%s zosk$Qagk`V4Vp-=aE%2yAFp*P8lm|5aWs!1-q13z9;brSumPCZK&{PN^q(i+jTWs-BCnPVq#tVXFO3am4R zx6TmL>h%0Xur*IkwIN1Z-k^4Gj4pLh zU}jHf&(pH-_vNmH5xbfWh5xx%j`=IGL*YdWe#P|aLhNrqkBKeG>D-4Wp7R+a@pD@= zyGdu1eU551<~ZYcjYZaskzl77kuP#x$k)-0slqeb?NaindvTQ`zF5o0=6_nl4I5YN zi*Hq!;M9t{^J^9IM#WD;Oks_8wgB;~6}3)T?K<%Lm?X*~8jHX-rk%N*OE9&8I?Tsb zrAFKhTukQ}4HLPo?5m$hbVcv7Ueeok7QGO=e0|wlkH1<>_50aaPnbx{OA(Q`wL!Qx zsu6+G(6rRsnOvf^#)6Prt0LJlqMJ==snc8PUg+1yT^99Q3lSO3kmIQ{ZT_|8pFQ?z zT*!Dl7;#RaW-b%Bb8lU|><70X7Q!im^^Lv_kh7ichvGWYC(GM+Wz7RE2|cCD|gyv>eFElFkTwX)BNy;KT^&;!N8D(=l@xShSFpWwNh(+-&h0y6o?II#x|BK1 zs54cUH~uE8XUq;3d4S@?jU>+tb;;)iy0OuZ=7J+alEqhg%)I1(!6WBLz0=vtxFKRlo;QrQD+o&f*pRxSLO&7E!~+H1P;{S0FWPFSNt6?}X1ez5D}@&R-Kv za%0c@>}AuYl6)6FE#~^o+odKRUc4OS$na;((qHvLih;#&kx<hJSIY?E20Z}ll65cNP~iM_7JU!FprQs2N)V|Ir zq2H*gz>1b{)WEK|eeYZKlK@wZfG74%Vo#n$n@)NZmk-sPld?D=YK~d&Ym}(s{mPBl z`>4Y~snz`QHOokm;4Q_7;|@iKvjJ(ovTzRT(^<1|GkZ6;*2Ly7AThN1@BH)e{&D^n zO})Bmm)&aE_Iv|blh6nH`l#_pgeKmd9)%|GXmo|OQ(g_~Nyo=oBmV(?uLat>n0a@) zP*(c>G2y30tMHT)iAy~Q4*qULR0roYg1Q}cE@mqkc3G%M#ibWWCyaYDQmqheci}g{ zzm3k@;?ut;I`?jjd6iFJ4Afau`uz%DN}|7S*Vh8&A`G|5C}Kq=w}LeSKy<*An_8pP zwEtfcL7=*lAne!aF6wnd$5wiKJ#dYdC#!`|IQ7(-wm$6H#NIdn8u^@+!^61rc-(aV zJk3cL{8ICBr=z@M$7)lsBg+03PQHVK3V#rp94Pr=v7n}5IL-ZRRyi|*K=Ek7^ADl} zoQLqly&kD%4oW90$FiblG`dXSU;_-gGV|rmb<%jzt$g{2A5tYUQNpGLToRGjU|Fgppq0avtqSHUYB63bLCtubqkDA;qMxhI zqaMD=6CwYZvQD=AzsVhhSM3@pr<2n4ZHkQfIUYG0U#7k4 zpqz5fc#ck=_XT(>wMd2iVYtd{3=@A7u=;Vp`5hrY!)?3oCo4K>xhDei(8yO+WE9`&>QIW95~wVPDE-0 zg|iUnrgLYbPUfZts*j)}dh9r9eypLML>yxPoh!{ZUpLCl;akwsJ?$6Xs}40*h2*B> zCZ_Aer7wO5nF|AyZ3Xiba%YwmY_UW}7t~&Tx%e|1Zf(G*dCp?X8gn~d7wsqI3G){? z=LD&pnPC329H@MWA`QPV_RyE|xH|xaOLb0HdsKRI+Bu6kD;d7u=vR=V4$c=l=<+D? zgiXi~dgve)xs}NE-b2uBb!$VByWrBDG4$BQ>ThKOIaBlNZwT!h={kG&DMzs|I8rKm zN5$q(hyw^ln-hcJqoP*xV=L!I5Oz5&N7-ys{Mp2RI*u#*h{)tw?jlK=}xKlDy_sO{zVBd61W8)dbDo-AuOZrdAu9C5Al zw2ytv3AGNgs?fk;$@24NmOibqdLq_y49s9uoK7Y>zenN<@+)Pg@)wI0X?d92c}^Kn z^JQkUbmjXUXt60_&r$ z;;5d{+!4%mzy5tFQp_&d@!HA)y~J;>Tv#H zBfVfdjlmoOTTa_ca-qu@8{_8O|1dUu6>YP=XNv|<<4Vx9OcT+uD=QqRYLZ?zUej+8 z(EvyH<(R?n2x1Nl@NsO6AA{7hDx$f%_nOpa{*Cs6X=GF+Md5q736zVJ4Ca*QOB$Rw zpRwC@?`Bw(Nkq;b)GTeT*lkl8_Tt+zQgAPQ5iFp z4ruOPcX`@HdC^{O&`!8eQR4#tRu|Ow#>qcIFj7zJ3AC#cs(WZFMAm6KZ&~qO^Whnz z;n$oP-s0He2YELE7!H<)fW(ht%=j7dFS4X(&r^+Y?w^7rcJ?*;m5N^v*$-FRG{9h~ z1PO3?+~UMJ+3PWqwT0s&l#tiAZMmA&d){e7uX+CDXiNeoEeHdCZgXbl`9g-(V%?^ zdc8mp2G@HO*f_H3t#5O8sZIHr>G)dbj-bTF+`_!%-?Q0&nA6V2L_J3lJ^a`l*Z6T!>t! zgjBIOTY9xldj^3FLj~M(@@#FF5{2(podb^{CfWA>kzZP31H{%ZdJ^1UOQZ$#HJ^k| zTD*_=*LI=&tE$Zk(s{~^hbKIKeylW2yCcl9(*o&5ILTW(Lg&0N_3%Ecwx!Mx`>tz* z7(G%OIOC^oEj)p@HjGd)bg952iIqUZ4EobGHE=)(M z_=pCF?fNtI^&e=%^;~JawB2vvmKU1R119<(>C3~s7cxQIb=x>FVxx?g`{P81H#E8c z>^N~;2~%pReZXM+6{bUzV`K~DHEvI1O2)S`$c89j%!7`u%EWuPl7AyLaT7ssRen;O zJkR-<-RgyYoF4=KyXyauwBJR=0IiRm)|c;fvmF$W3nfNI-(>WZUUz?ytRocOfp>SXTOr`@hiKD=^;JHag4#CzgAOb?DjG?Or zD2?;lZd7Z20bWq++W?+Py$06IM}TAH%)pL2E;l{bUjb1CSs-63(G)iJtR{V`K=FjcR4hPUB~)O8#mVJN(wgTZ@;3zc)6o*Ta%-E)}3(pvc~0t ze<*PNO%35I-lx0Z*2&hxp@q+8R2`p&UgNaHm+-(zEXe&q2jUEDr1(n3aBXd`mfDyS zvdfqZZ{Qbqg5K3<8q;GfaV>pb$sz)G2BZ2R29}zjx^<@D?LUT@{&T*O7Bn30=$0C_ zy74HFh!Hs7tF7?KdVP+&KPMTp$wOCZ)>nWTZH?&N3N1sdx5aPVmeR3)wr>!hXN+Jp zu&>K~{61BkOUWM}H)!cU0c}9cnMI#Zpm-~ax%mqJ3KI~gJj1ftCD+QcAn9K^)jE(2 zP`@3j#}f0GYY^|UruB_4eITNRMc0}wEw4%P|0VWEQhc&@5f@x3va(H&8;dfHS9P-G zD&AzC>KZCI97kF)0^KT(+XXI|Al~DLOW%lCzy?%Fz|=)|56gWCv5q=%X!G3kaKjtT z8ynq11de&{xwyBUDBrBCY?B2%8oSq}b;lvm)=Y^yyVqqZX+E|58H%Xve;rgY0gsD2Q;Fh5+uQPd^EZvKU zb@c(%#G2rCZs)s8vPuUe z?~=9;sIlpjm4nNT9p+D{BQF}S@-6x(uwg_xe{_pxRpH8|H9xMC_2K|f=0PW~67FXT z0<~+wj}rZ@ofg!twj)P>fklu7#XN$gA}?Ar_qZq75l)u4~~C*786kDZhYp@(1NlfgqMQJAhfphEtAiC4HtenJor+mKclxci|oj5sI~}VK`UP0!yzeh-^&-*#dsRyTTW8mBD+K|H*SmD z#EzGeBQDtXI$F?({DO0E-ssqJ8W(GKVzY@*Z_1xq473!rx^Y~rAjc;b6%mNTDD={&Vjt6Ah=b;mL`oEHpnGNZkn zV7Z=3Woi?eW|JbYsSroc_taH4{DoQd_ZN4Lf52bZAo_fw^oSEls~y35J7)tm5zImF zvXgB~9iYI93_j1p$j-F*_XPT`y8MplZw*RmCq^luiy~9I2m{bkGC1?lmcQ3k6ROMY z+>ZWiGCkfsx`AmvZqGsh*G@aQ}yKNyg~^rCp1mF*Ja@v)p#D? zF3n{w@UQ|obx1_2?q*JEd;b9Du2CV_vB9OtPOmQKs zGcr=6d?G)9{MJiFFVu#+Lsa_BY!6UTccJQ%f?Jx%(?qztlTg|x^!2h5#j>RlT|SQz zZ`>A{k_yh`gkl8cOch+{GW&;YqZTPuTepYe;moX;BCCUulL=4B;=TmO%P_x&;FY$J zruBz*xd9l{EJLM3>siltyYCk8a~H&&_>WQQ+%e1Pv4Gzvn@F{_AEkv89KvJv=qT zK_!m3bDfqAmp|#RnZu*Cj5#G}M1EcV##C)f-f1(^%F19vqCX`v1al#m8IGAaJ<}8K z+Dj@A!<4^-8{|Xa&Uh2Xq2C7~?Ov}hmr%$6r2H$ml4J{8z*n#V(ol>kLw@3tW8+WW zElGtvAw?%+|F(J>EuUV(pkq@IbG4xVqqG*uROL>2wRO)HT6#I5;% zEn#2AmX*i7K4)6)H3h|GBv&Rn&|Al#a++X)*-#wr%7vMBv!;0bco+L2*00r0roTh>S2W!^4V8k|)7eg` zBXuE?sn8;EN}HS^&z1lB)cRU{c2Zs8<&|*WQHgy@Gl^a9FF~AHA+t zzhO_8f-0W~c+H98Ek7^D{}Ex2HM0w^c-#>E!bv{?ebP-e2*P!oZme9L3s=vtp1=+i zuS)8NR(un95A4({)0dvd$1~rm5}jCfApZ!%_ken&{l7+$?bOI~oW{toJL{o6P9 zRZ#K~GQgV`w0Q)1;_;C-ku_Isvm$Gah`|?WcLWr;f28Oi#BrAfCU9dtrc8YEx%)zk zJB6vm$xrUzxN9s+i-3(BzyWorS`>)OB20_mr(iFUiP0On>6moES<*zO(9GuX;ctcS zkL3<`(@vd(7qfP+w3h_RF)_?Wn>9(01NZ}UP#vnx6=<&OH98GYjz@>@Eh~9M@Sxi? z=#CwW-?+h2c-kA7RJG@|&z_(^{H6XC^|q0cM!<*-pM+W)0jPWkmUHK;LQ512Hiq9@ zVSvC?IgcLrufn5f(5nz`2ccyvooLi+95d8O+0tW45`L0x;CeWlxo8bWk?z~VfF%6( z_b(4`z0Xv{5*GC`E`-XGo5W7Gw&>1WA zhUk@{OsR6Wb)=%6B8;`z4?awdTQw&66`@Y{Db8Z!fDn93WOqVyLM^8=er1x-r2>}^ zvvX?UkxW_c%Fe72Ws)P^a}wksEiQNyD&S5}vzqm0snZC)VSa!biZ6ELUs$K)!N)k1 z98$#V9Eny}+^ksxcEHFJDhuT{URn>ZyM%t!fGzJp3bpLe&ie!?3;G8C^lTb^v1i&{ z9%pA~PTc{rr^gmAVV)JA8nOVy;CbfyYwoo%3VR`)mmzR#ga?v%s2o?MWJktw-*bO} ze^qh+0m|vIebfT@f#4!+K=u6YrhcEXjN z--bW&>Jd{{=FKmrZK46ql_L*Fo2&61-}0a~&nnlW=gr5ZdY%Yf7mWy4mE9yNlXO?I zq*5yh4!e3xWb5fJ|5aPO@4$%dhgBxh;2hoE=l^x&0OJTa>^&v_&N+F?gjR8XKUTi> zDzxpBLGk7L`uc_W^dP_Kb;v zgFWg=%&@$FfB$0p160N2IjKv!(CJa$E-b$#31S2`N+Vb4v#u` z+nh<4!^m^&qr)~`?2W!8Re-qN2pLy~iTIgD!jZGggv=Iioew zq}|kn8f60K6P`!6O)HuFTKIIjEOxy(KQRPz8jXWD!i2cEHEH{NfY7gr(^D_ zrIYq4R|zSA|G;kt2nhzUup6H?d8)s#JOaMStsD)EcwwVwNbL)fXB;Li-DfYF>}8Vy zMj_zF{KNz=z%PI*-fdO^bqk&pS_GYRiHhPAU-5aEr!NKUUWL!dDNw4O?y2$HT7*wm zOv{bIV_2Osw$uG&-Y%cKseV4i(fTE|0Xu38$dcwh9IckUPR+3$bh)V`HlxR+aB^WY zOKF#ftb@>>S<5vU5B^5>=rlU4L~`eo1=ZQ`2(_IV4=s0+Nh^$Cy`=zj*lHtb&MC!o za5udtTw}2&QfIpXsPQvp8>U#_`463P5|Ur!R5noCINJ2~ILKhol&>D4*6N{k&~IL*Dje#M0G*LF4m|?B>nc(0hIDg(z&vwN27cR0u%Qz&+D4Wz%&YK(xb}Rt z)F%#hB$WSyKXJ^n^v50>WZ>}NCn}7__2JQ0GMqcKTKMv0X{g~zLA9v500Aa4r7B}1 zF#WmO@CV<9-Rd6iY^j`liqzkAryU4))r+0wF?6Zjf^dpMoi$$s0}>kUQ`e}lpcd}i z;>f?4FrWa^m2@{S-)#eg^|&bTplCY}yDkH_Hqrh^ANL%?4}iU(M?D4I?tk({8*dlf zJLO476FU+?Ye6c4tli9{z@Af1>MUha2ep87Km4hbz^oU%22L6V*AoOKtMzSz%r#`B z0I<#6YPTYG+%g!q-u5x-5GN6p-@1n5(SdIGGvba!ozCbR|3t@>%=J0|1^nhjPI)^U zb=;ny4{pEH<7>NXJn=B~twrwtUK8g(yZ2DCHIti_3HF8YdoD;;9QE;jeR=BXuN!9a zWs128BW5DWdlLgh(=C^tNrj0YcJn8qac*d{*A8L~t{ZsVuOsy1#Ve1+&tf12*3u%mN^QOdYcy8mt zMtb-3rM0^UgGBEs6Iln%W|YJZat1Enz~;mhD_&YV5?j%Cp=^t;$9I}v%WH%8t*1Tm zIuEppY#UxU7n|TNboBR<=RJ{5eQn-(16j+1Ro31c1v|&)jN&mbq3TB;eVQ}4>Q|oE zg7%RjPJcZNOdxnLi|0?gbRtEJfh}FC^B=6>rNGd)K3m*V@Hp+mwF+(H9zv3za|BE} zU;$H@gnWbzUQd&xPTvh^3yukeTRb;MTm@UIr&kFBaX$OZG7yC70fT{1oW%fC&UQNe zr6DSP)oNCH-HenI%LAa9%XhnBfBWl?v5b_g2)VI0UIzuQRC4y9hnsU(EyqBOvm>4Y zWjcyojKpclobg}D4G*iDs-%lM+4-%3UgM$*!oI)hB@KWViy8;ngoA#t1)X-6Zw#x; zbk>nq%NwYqjWk|YU00KS;}9t%kB1c-V7#-Dja?S^<{f9Qd>6yY33?omx!rL}Hu~j< z0#y_r>Ajo8%-~<6_%@4bd)T|LB+_zMpG|oJ$=-wi-uv>zw-uj{g0b|Za3EaiC*@~o zwr1Z_nkWA#U9Kt$d$hWpb3tp_hW@?}-!HWOFewg2=05i1H-l=l=`gT)3mG2Ib$i>? zZaO%BuaKk38T$Hb8* z{`3%)5tFO3);P;}_VDf1pqBw@5~njBT(z!k|0dq!7J<7h;$G6vkUgsjNLL@W(;tb( zC!JWH{1EZIJ79S8^UxgDK{qH%zDK;@9MX8Bws+OmPhPyE|2ItZm~R!%uan4`MlKIA zIv+5%=W_Lk9v#wO12cYQ>5d%AQh20YSJv_MEXayf5;@}j@Pk9LxxngB9ybK&=zbQt z^_v~L9nZ*uMt!^cqHU$(igNO)@c(9J_3h9bDByZ zu|Zl@*M_(k9xaq+TlTU0Y@co5RYO;qe(x zu21DkmvJ!OcW=|3lHh>w8fAdnT&ocq6J8U?i=U@5Du;3+2H^eBht530%5Kl{d2*tG zkwA4G=2{JSq5#1*L~{Z9e_`O(pf_90#ZEHMA@^NHd1N~$?~p{EvOtJP`o#p;VH(g7 zQ^dT7h7{N4k=E@*tplse={wQ+x~q9)c_x1X(K)^D;mylXceObpei2suS|`s=IGdRZ zkj$p+_}W@k({OV%XSFzdlEB= zulh3;@Mu=HA=X;Gfwec6>iQ%0EB|B+7qcDsNe!d^B=p!R@F(u@H({1f6ZW|}BrFI! z&;$Fqv}^$vZv^Q?(!P|Bv~sXRHpsvTBRH*bqI@2t@votWT*oM<2F>KYji|7{mm?^ zvG&QS-WrndUa!yj7=a#VdiUlJl6rJytRL8+ zwB>)Bz7c7`2@!d|dxg^~H<;ihyB+&5)~633(_o=%He9@tQ}()C5?<~$gUJ>t+ceRs znXD`ZGH+IjV$!1Iu(-?7ZxmiHspgWvb3Q|%C%SC90pM7` z8Jc$mWDdGW^N4-l=cx^4pw`g-lBG?_+@q9IIyiv6Z5~-|GtIgGS0y)7<2?Ava!d=8 zsSj}$kMY`x-f4P_op6^PW$C$cSXmDG=LlLt+em}UTx3KRsAYl^Z#Qv!us-S#vWi&B zM9ME8CYIS)Dn_Jn+{3{iQ@MFm&QJ(gv-q1*CfUgBg&D^7Z)AFVQ1my^Hc)y(Nt}1Y ztRp|zcr}cQessuzx`dQxp^wwS zkHNnA(^m3O{?s$EV|#2jU}h3I1H|K3NR#!Ge$d5Zgj3Ot%KmmpP`zK)f9cZ_B%_xI z#Zqdwv{|g%Nol0LZJ}`6wJ|$5#%X`V7@p+%&*5QNC zr9aI$`9&HV`Tn6Rpr~uUR83JcJ#)KM>81<= z>l4hD22YK@8IR7mPP;pm@OD;&o1zUmqKBEg;6O%nO*PmT*U`?wl=j6@1}qv3oA5^Z-m5)TNBjOv z>8(jq{;gn!JLz;yr$!|HdO_W`BqgD7z4E?dIA4R5rG*5)K_u*tW#8vE@p?`zm}lVLC)9pIZnVf`#s)SdbCz%{OS?XFYM+D zWZ_Ti>t%$N%|4?bHr(PHI2>pnEWG~Rir_ZAh0)MBnwp`vsY_12T3M$YBCpB7lMRb@ z{MmY-%51Q?OCyqFPOq1NBlN&Cb&{9V2g)?(LsKf}Ckexs zcLRitIX;R~f6XfqGP@gOSJgQ|!QOXAlr4vka2-W}6BKjXe{zf~ZR|Tc!6E@m{2u>3 zs^kl`1JOYZAp^XgwWZ-?R&JF~#p%TXe!nbFuhc%rrdD3!&uyw^<+O=W+{S7-3PhaD ziAb+Xy!ZJ(h&Cevv;yZpC?S#@4BgLIXwTut!tG5IZ)O)y9exPMacY5|pf+pq6@XdL zM=Zmsg{7p2RfFMx!l6xb#bnM4&A~i_47dZTOI|=ofY&f}C~dkYdLh(K;ZxEywG2{$ zqNt90J;$)x9{xj*dZ}HaxYgeF4(cF$Yp|9UAfbKK9C*(r=*&L-!?zi1KlU3_w-}~` z(<>SKzXbTL`hpmrEbd+NODMJK__0kc-psOY{9-Z{nd0BqI8N&UU46lR~Ewjq0O+4e@>#>wQh8o7_a8L4QlW-`IER z_=qJPeCf7Sy*X)|^));MNK%k%4kAh+ORRIWOse^MH-(&kK)bVeASRKS?Au}+EHN!H z;yO|FI2>!(jP`PIQ(h0Lr8{vBnPChw-1roykuQRE6_H4e;&6&emGUE7gR#FO zld6IV?tJ|EIWp|gi0+J6@XsFCieSpFpVB$+-g!A|X$5OQ2(jHAw12s@|@HkN%6@M!><)*K@(2Q`$g<_%TEB>df3b zo-@AXf|QBV_r<>Cu)pvPw5)9C(&(9sYeD%>NxZLdP;bR0q~CL@hC9lj zeS)?H=Gdh2OzR1=Mnh~BemDikR9;?O;9E&Cjn}25Z~_$gPhi>d8Uv67R;Q_!hvLGi z=0B!4%G=-Vtb6XgkU79u1?)4NT$XA~H8h%>Hi)=}CZ=SVBSE zPWv%lbBI}+MoxasEzLvjdglM0jB3B9-}r9pt=%uvC&C~1>OFk&!Dd7>e|zvp;Zo(o z0C97XbNUMMk8qX~I-^)!{EmavADH>2mU!0i9_82<);jIlixrBwnv=+KZOieL=aQw{ z4wbPQC)*ek$+3k?itQfe-WO!INI_?zj%fz|m?Vy}2{qGy1|4bBwYA6dpe1LryNGq^ zam8s=MT$de0q-qqFW#km6|*4vJnv2hB))$n8UwO!fBH_TV5#-(3k-=4m!0OfKl8Vf z{1AaSr^iMhevdhF)}xvOiJHUdQ$KdH7{TO~LPF7{^=K!9XiNJ*z01K0mzwIXCH?=< z>rd!gcZ}LnL;wMH&q+~m_Nk_hZ?w*~J+`KxvlX1c%_IEjOu*;pG?jBW zxj0o8?00M+4e{2V1B?MOrmH-(9U{uO@i9)M@7OREf9xx-WTT4c#nZ`!w%iyDlspSI z7%ZOvAM zHKKKSc12q0!kJ!p`fScgh`kY2@uA=}Tt>>Z_`+NqugL0#+Z(81ogLHqV-FGm=?(C7 zo#8~CmEf6oz>39BN)vf?8!R&wJFwTseH~9fi>uZo?fMZLhGEm3n?~=M@#NeQAK($G^~S5~Ha}0Pz*ngz-Yy00Ven_NG`IO4)RhT<@);53^Mr)=QQ%uD^A2CjJ%9YC z#~=@DLH$mZ1@jek)!}y`gaNWfuwe#LcFwkJ44##oJ}v$L>jAx7UDunhi+eZ>C zo3)X)`PoM~Y9ScSC$uGUkX3tWII`w{d2Wtp(12gDy#K#7hO8}a|Jl|`z48QWsU+o5k|2)aDfkA-*V68?&u65dASga**=gZJ<0&$T{` z47WU`^?|^@T56*^YhH_0qUPVrglk4K#`j_2f-65X)y<LXS!uUFE{l%i7B3z6eUwMts$Rg%Lh3OOutHX8}`au^}WVWddPa?Ww2 znB$yJ%Xt`c*k;&fhu_ot{e6GlpP%Q&g^T~}@_arY_rvXWyV8dfNqiW1_H@JgZfwFX z!yu0ojkMB3F+}mB%?Yfa%T891PAo(vkaX|mZ)vY|mC}G8-2B9b~fC{59sXMcVLr1HY+L?SR%1et?eSM&kmRK)hl=_vxJSo==@~ zNwfRI`VXn*8vEafKN)o09IJ>Dc5j7dA)0({wT1_vfoQ1r-Y+$NI4YYrKIQ6pftgSK}`83#fA+&?BhNTuQ31rbm> zUwlyPuaC6>u~0+6G$lmP!Hudj%>MEP7_i_n0gl!mx?JHN?zx^-(aLH(Yhv4Ik-=|2 zrK@0<`Ln7+*4ULGbLHpCH8DiYU{@BME;OpD5xVI4Rtp0l@Y_Z(2+5y;tq{IS6O!FU z3`10WFR`6sD5unftl}1NJm}T+9%~X6kyzD=e#O(@kt&$YY^r#WrE%9F{xQxI)X@fi zp$jl|_5HIFp<*S>V@es0yG4USk04}*fdhMx$TkDSC2!ziS^y-p7uW~rJqhbbiq{5` z_Ipy`e98~dIteCz2=h;WNh%dtMy>E|M9=)2MLPUGllpnXmRH*k62^o(wG8AI2J~Qu z(f)!T(f^Uj{`-VdI_u!hbe6p8@?hp%SQoh6FXHpHugTV;ue%<*?SCLwrZr}4@MXrV zW#?hpv5{^{L+3@M;IzF_saB>^@N|&g-;2+lNv6G2Yfw}8oXd{RwfILwcV;MInmYo2krUwPL{U^{#~PTCS{}JvAd&dV*ja zsB=1(q(4qxQdl5yEJ?c38ruRiE_!uXZ@m+BwYKEYoMhY{`Y`30go6j??Xmty?84&y zdL*N&tC{K{EFIejJAez8thMiJY8XgQUX;Lr-gMBRrW^(rRtqR}q1({tlHq$j5mKYO zO_Fa+^tju5U_HJ~%;{As5l&X7t>~<-VmE6*rkhn1xq}+lGR}URd?wp`5kN){f2H91 za>I)vNB}YVB47dMdOT9GXB{~`!c>PQ5~DeQQ9&eK0Rf z1lh8?{$^cF2B*E|!;F_JvHPBp`YNCKoauTGe_H_8doT77AR-`UajPy2oX3+_P*JQ9 z*xQ+hHe-Q-8*=Ni32YrFsAM2(`-^x;%(04Fh~^y)8VnujMLrZhHV5pRodjm{T#!NQ zdsE<%*>7Z^QO~C8*R$fBq#R>elka2>tZSCnD-cF>{0@oFw!i}ew)N-kfU6#Gwat(hZhFkyy| za{{R!H-mE!&EW$5J)gW0YXN28%Ep9}xFt%E15|;7;`@A<8)*^0G>XUx+1z<2UvGjdaln8;-=wafWVQWw3U=5eyo_SCN}dBDBs3e3Kgk9 z#wi0`A*8gy+X-lYGa<`+gYg+XYy3+>zY#u&vfV}e%INDGp^S4Vb*%rH`71QiBU8JlLtDQOz zdy0GVYQyt&1@G7(=tp<4ftGNwkf@TbvKSUGk6}Y!EKMcl>#Rd@ zXR`mw*|8oj!Jl+*>c^#0>Ggo=sU?3y+xvE2At_i64@9EbgnZKF9^ZyMbND}>wM95c z3VR(rKLXwICNxG%MCimxwi|8!dfGB{m`m;ie5(-@%$$zX3>A0lom1jPC9!$SYrVp8 zVBCtAx!espW;e6T7NUMc#kElrEM(FW(@?*r_g5Z3zJv37@G7ABj~d{cZAY=pnaa9l z&n6sZWBlS?vk3T!)D1gD$7=5MgK67x&!v|@?g3OtCT9I;j~6Z|f=gj{B^TsNK3rwH z-_1&Je2il$nurgL0<9R%2XRf$cADhd`TRhpG2MDS#)11NR8>v(cec?w;?Xx2bkmYg ztUWXsM-mXPU0V3sk9A%dB<&uH6&KbV1l@E&c*5IkE}3Y=dBu09I0`3B92b$|Tn|y3 znE^)v6D@A*yZ9mG(h7Kj+e}{N6ZlOoj|67>Lnlp}(Z#r>WbEHKag=`TeGjru!m#^| ziRt?2(u_5;M^8o^9hRH~ecOtgFDx{H1)Gua%$FJ+KPcv}4LSTEU8}pL?Ds|{W&Nn= zO8Ylsp(6Az?1t)>vzspv#t(j=)?fg5c|mO<=`1Fh7a}0GPjJmA_8Q%;i}!(uGZ)~j zg^h`3e9ZwI+j;Q{clND&k<#*npq=Yr;(;cow->0@(%+KUJ<)bC30dA}l;Uuu zImbY>48Q%RbNA5#hk&h#4iYyQ6S%-l#gwvhdnEn$;ar53n&NHg)*(I7+y!9b-RQEJ zwn41tuGVuYKcLur5uk3t9u+ z^M<=Gq6Ay)D?GWuXhw?)g}&=9Fj4eH4H2+aFD)c_iFMll-GqgY{kH`RlJ(%vJS{rY zQ}W`(w_pX~zgGYE4zIpsRI}V9Y9P=3UbxbKovK|tX3ubC5pP9*y^h`}kh#ymo@A-tXJ)M)@?4Bf)FwDux}#d+$AH)8Y{q1<@wp zhv)hdq4F=RSRFg5O7yb>5jtb$KV?_QceoMp`n``ho2~i(vTvz_t^__k>C@Yy-V76b zhwZ@uKxPVdqtt0;AU~X?uUZj~*`iKhF^hxe8^Qhr0ZoILF9&C3?+7i;es5MOntJ!M zOOMv-kvnwGNPNVIN5%o|yqv+d>UJB)oNYQ807yHya8ro*C{Fqz%`Ezt-X&NS?e`HG zV(>s=v&NfQO~$3M*d6Im!|(0+3zP|r&l}{OA4#HeVyI{L>3j1U51zlQ+5I6dn>x1Q zKO-0H`SW7E+?L>jRK2SQBf8Q!I`~Y^EqqYZSd^T>0*$DKIWduXfK2b4+)j~on%ale z;|wGrmy_BRk9xfAu~J&LH(GZyaPzas5(lYf$Kc*z1C@`8Z2J$RT12Clr`7BXra?ZLwpYi3?yBy$5Q)`(GKs|?^4rd3J&2;9hAQrhUl<^1HFbe~kO`r+^L z>*1kB3gfJu2}myQS67@=ge0w9Grq%4_@4 zcQQ*qJe?v6i>e3*68B*N~f75DQHkT8#jzi~Awo)&lxx)KRSO3~~rUSrzt#7N+vIfL$D%twwJHr~|A%r=+A zpj+=^>RPS5d=@=Vfj{d#2-mmq>~CC;Dzh>Lhb(kkUGlxAcctVIzQUq9oG8b$)CZq1 zGzUM^yB6O1AQ~W|mfT|jN^f6}jh=x#l`3YO!%3|Wi!Pd^O6WK z+|dIZ^@zwT_oe|oDL8hUnCv0d(i6^X1{7ud^AT2A+xsSQEpDi0{EXf&H9RK9OucUZ zV%_CVFTKBkkQlQ^=UPz1S@j+>2hU$aUj`emffe|BTx&%0$8ia}G(|DQPTI-WEF;i9 zZgNeW3%V^NyFp4R?Rp!7P5~mussSmxQ9@E^$-Q#~1&wR5`eP*V776EZ(9OLq$Vt$S z60rjGNY-Fo>$z~N; zVv!bmBChC&knw<5Kx%q60xFo?hck|y5*H>ZhAyOWb41%CtQ%t5YBPRBWchgt5H7V- z`n-&Qe0=USLB{cQ1spxiI)l|yAOQz@W$-lzprEY?pa-aM8)W3g`}8qN&rNtyXa9h* zPQR|dQa8kH#5#zbaI%jxS@;b~K}F6DF`y|MKmF&X zVM0Apyp|Ac?A$?$BXp*7&(r_uoclPP@z>WN=ed#Q7(q4_7qcvIiTYO%P#RBv%!QBk zznE(z`m|owFI~DkWDEd|D?~CCGJoy}e2&-kyYNV6Zw(M&pI~6#jASN9IE}lgc*?aL zI68w4DxE=^b{FGD@jh# zJ-8XXAJJ!bv%j5w440$o)$Px7Z9Sz9JZ@ z6#w%wlWPRnNi&CY#yj1N7%qcuIw(dFlu57^=E}gOr(eQCRUQhTHUpC3l?}La<`k)L zqt5|H7Rj3Y|9eW_&h>J`f!f`95#8qShilEBx4B%*JZYB2R)$l8;+@?DpVJ?`~j9~JHq*Rz;IUrJ-LbbHB>Cqw; zfNUK3=`KjneLr^)>@WRnKk#7!9j0Wx=}&CF(b&S|c8mCJ!@xw;GOp(jbh(@IygIjc zUxowok|L$+hX$Y^JwR+Ccb`v2VJ@X3F(Q-DRex}R12GCsjZNWlc8ZI_Z2#!YRQQgFggo$F5-ruSH zByUM^S~*G)WvmxA!T3)WfYc}okPb*jS1@3=epq@(z+xEkqC{;>v-Q*h?#KS1MIr;Y z1jG6@gD`1J&L5Z4;VLcMQyW98cGsO`{xUbR^q5Zb$VP?U-_vn2%QdPn>!tv9ljt&BAy0= zrh;CKM!cT`g7{W9NJ=>WWxW0fbCrx1m@sNQM%Ga?pwj?>c={Xy2NW`C8z3A(@RQ^P zVM9G>fKxZbU3kJ>VT|h}l>Lee5ETP^erX*B)Im6dW4g={w>BoyxJJs^yrg0RE5t>p z3I4vM?LNe@H?z83Cc_!gI?FDPgy!PDxJ;{5hn{~6XqdRc9ZnXG`Lu$E z5jqi9k-gNw{u?|_X{1a{-!tMhd!>hRj~rage?9L=D(c!#w&Kk0=BqzxYpTo<0xl9! ze^l)*2ehl^)*w*w_os81C!oG-%_db>mmYDGq>#Ey;8d=UL!TF z^myUNT-XPxS#MG2$XG5Db}3c!d?LcD_^Jw9?^5OdDt=})JB7e0oQNsMSd8A>TGP>T1(S|$#cvVjDQ!p91c zC%@oW8uk6fsA)yi(qt(-JETRtUS6Mf@BXct?o~$g4>@7T=pOOc%O|mc38#bm9I|wP z&oj`F$%w_pA{GP9z(?AFBbB}!o+n75v^#E;u(}VEu23JSMRx{@Z^ zLr+2Hlx- z(tDoTN5>{F&r6jkd7S=|fyp#7Ms{4bcFYH|m)kB?re)~=5i$QoSJecGt+r8lQ#Sg9 zJ@*H*`I`?tqTBX66zi;={k}3kF4ICEyx;e0)qJO0px)waBEBBN8#yC&bKbYRi+(X+ z^K#*adX0snOn1xBy|O|a4G%FcXvdlzG#ceHtL{D=fCdpqF%^Rsf2&^{053MAw>OyJ zK2?{Bw{4T*sWL~qTU_!)PH>;$+KR^A?{h7$EjL_@)>mS!MfqoS+Y|wg^UrGA)ZmN( zwP0Ftj`Ls7Q6)}#M@?KMkRiGUZoNh-_3v0{yJCZ4hn4JCS+m*C^NG@H5D#c7_3MzN zsqABR!d-YS%-$b?Fu4TEo{#y%OnA&)&DO}*^W2pA?rg`CX1(CdQOAC#6wt~^Q;2!K zi2hUE)pv;is7tF99RsKC+;OrnoRusj=ZnZ>k^F*Qvhn1rmpwPP^0OB38t^-#q5&l4 z*;R=6Cm7=0GV#yZ+(@l#eWSGyR+E83F*l%6^lT_j?5yFgA)4-VEZyjnZ!InpjTDat zx`{#1i67xWfRhPsP4(iCcx@pl_=Tbp{G-A~XVl9Omb!QT;@CPoIAVnxZcO_Q{Shw^ zp9MlhA_OwW3><}vHh5U7E7~AAalS8$kMybEcFPL$ePu$fAPLF7-+CdvkBx2M@<9$} z3TI*4v!KijMb}Dqft{&1Eee2ea&TcfJT%ExESY?T3>o*@@3=SxC%as*&n24 zL_aLo-|{Nhepx@o$(G6vqvB>Ulg`vvA&ex%i~YBd0*hQDY`?e{3K_C&A?gTioLeS} zeFZmJ(~5(r$M(I^Eva0jpgaqxW0l112!fUJlKaZSp>r-ls{GvIGJxZ2SZpyQa^Ni- z;6-c8;tp@dih(UjIgUmcAdI<;0{s_#dk%{aP!%?M+qaMn)MH{iA$HMrG$^7xY zsCS@hge`m;VEHnxiT6Z<4)c2sFutc~Q+%S>Bv`@hl zwqph5s`dWqXXw@Q|0#-Sn2Qc&nrQ@E#$dYG=8Hq++C4X_wHG@Z-UwUw=yM{_#qG40 z!fin<9=4BcB(BzPGAURMKg_whpS+Wd@DF=L4}Q`ZRjc7Jb@mnUBp89-bRK;z>%f^Z z7z)0j7u=jxF4RoNlvK|}gvIxE%O$`>V4UIAEb?Asz$1L2-b>inqABS1z6651Bm@ID z5O208gsR1f0>2HsMD=p1`3hBH-k&(S3^V+Whn{zIW4CH7pBA?um8uKeT{d$7>qxE= zR4#O$OVU`L5$jn_!Uf^TUMm{X9! zP=0dQh5boPMq*M?3%#YiMS`AKakk81O2sed0^cOOW3PkM2CiX_==wuTZ+%FW_M}1f z)W6}mr?=s`*SR)nJTF>^VvD z8p|l*@l<{S@iQhk533fV%bPymi9b123SVK`v~*31_$5CyJptU_6jsA0AS^o;!3h|zho(ipAM)}2=pCsQ=D~g^r9_u}-;U3? z1?TlftYWF+a|&5Lei;xI=U76tjdK&KK4ha2rdqdXvnH>ZR2Cc+agp|;DU_>Tgh2YV zxv06dN%=@E6e*B?K*LnBqXn_3IFeI(w`vTV-juo;yuTZ{WuX)Nj!{2q<0v2KeAr^~ z!=Pg3hjyaBFJAfykf-?0ed$rNg<6KN77dHnU77C!p%;mAtcwLnJ+)H zE9XJEOh0%j+vYB!DqiKdo#$~Y>=&DAl{r!)A%zq}DFX23UhA(bD$t_hnHv;N(K0kE zWc_@;vKw@fecI?aieVtCKh?6(mZ>H5;3f`L^-qVHJF85u5*d)Mi(Shmyf`s9v$EWuRur8$mDm=6YB(+v>+-n`(tKDWG;xGb|a7)R}_Ujjr^4}xLKuWf1tqe zHpn_gyv94YIt#gtqo02?|351W`%J7WM$NIkg~~l9ydJ0(zqG)(_@pRF#_N-@%M3JV zDnWKq4mr9J>Z&nT)dmTwo0^n!6Gq)xH1vNW4?*Kzp!Al7gwJt7Sc&fcsmoByf6DHO zAvIcNJQ>@?p+|!FVWG_P@Xan(?qm2uvE>6V-}t5IRtUAfB7r>>p{HueiMMYA!4`Tm z!a1e92@m1SpQeGggQ-4MLq%rO?-=wHU)>RF!))v6zWe?wqcA;n8~SZ(WM!GBiIdB> zR-{s3)oVhCo7vs?#IHPam@2aF0+GI|9BdG+Z$IlEs=4~&WZQY^p>XmJegAu_llk^0 zL)D4#QDyIE6a;OgHaQS-uR#Q1i~Jg(Eb_eZMTXClytBT+OnfVZ#d*26X1%R&^W>sE z!SVL(0SP9d)iRBk0G=1re!pD%4qjD)z29LrbVB1`c`e2*{uA2wkVT5xf+b~2a`kF(R1sS> z@X52(vgD(vHp6@m*PZA;Mg_{RwZ4q*?pkR3d2K3bO)qrQ_3X`NKf$x*Ru$9Zc+=sH zJ|K4Xa*(c6Z~S3g8_XaYn$f1C`wB+!qro#L`q?SXH)dBSn+p7i!Q^)HENX~_1G^=dK=WZg!ZEDFwR#MAAG2EmyQcp zi2_f?71gD(!?x+0oH7W*JvRnFrr`DNx)Y3}U=k{3kc_}NIg9ejr*5i`j zjW!OxjDDZH4@e8e`i|<0>5Qv++;#DW2(%^ z2D~nL-DCw9F1C4hko6rUtRy;x zDB2t&;{~)d$@S|(xl^0Hk|x|k!&(T~Ub`Q#q}SY%<%ly5j_jTmVnrd%NGADmH3LWr zy$NHQ2WH#eH-b2Fs|QU}3PgKQX~~5g9}_21TdIjC8P074sdy(qtQCFxP%lH!0K}r@ z?6recCve)H3?+lgzNrhapunS6!EtuQvUlBF+~A4#rQzCICP^_JQ=RGqltRzy`J%NTU*!Ed#`9Em# zXrP(Lb>G^!I!m*AUm$xt@K#VaB|Swia9H^W1cu>VQ8mt-%}o`bO?s`L>|n#=-QSOY zHvd_f3iJ8{>RiT8^OR zA8+c>tf#}CS#FSWm^_#bgK_%2W{)$Nq$$1Ga4Uv;QPtev!gfUaK0@+q!)F#~!i>z~ zKze%HF}%L2Oh~hy>C3og4}rN6rh6l=<|!u?M2^T8e|)Nr*QR1oev$e1zEk;B7E%c? z%&uF_FY0s7+oW+l*PjNuN^l!OeH%!5?E%D&&%%oJFPQik+)^~ufl+)4nX=&PZ{W36 zfJV?-;67Oe!sAK7HuCT5m`c@sH>$dkqre%JNRg?arm)%5Bn(WuHHMTYj>SjenBO(# z$(HgQrvC~VX^M!GohDXDPAeAm;8%K`KnuPLbbMCei`&dprUt^-Og6I&NJ&c|Hlws{ zjCw)+BDLx(E~wd`r_e87?Ry?DgmwK&u^LnD4`em_GF#2Z zN3rpxqJTp<&&s9U!^w_a5`;3vO^*~ozhw)y<`vxM)fcJq&<|sYU)rKu{0-c6gm7?4 zRYYjGZiVl8A}wG3y-RErMU<{A&n}h=xm7i0iLdpQD%K2rM8gZa8xec-_OCy2D*qF^ z@{xMAbl$?iI`dj#6)JYmD)S9GblDggUL`*%{ z-}=+n<*VPDJ`TC=Xq({c7N1O9KLW}4BD$Ef?((1e`nIfc?k>)a!3@FJA*O%rdTEDL zCv4qsVV;97Cne?M?EY8yygjF<+uiG{bi@HeI@yx!$-B{ZeIFLye8_)#yZ+i0E3dvA znln!b@+Pv!jw}9ZlaW6Q!JYLxC$G;Y%Tl@<`pl&2s_*4^AVibhyV23^VF4-dir--0 zdP{OnC)CT}-f7e|yyEA=F%{QgMWs^*Lw+7%KNddBJ_bbxsjf@Fb-9=HXr+?{S(8UH z;SF+-^&L=88IjpRd&CEVzP<&Dr`(pay!1ka{%|cXmsA0`c68sD9=SOF$SLeY+*3D;3 zx{(K~pY#k%&sxvlQqi8X@&QAaYU>)5e*FW@DhSYByZ3_Kc)6-gr{qJ1j;fK0^A5o= zzeB=ff>vm7;Kg`P18aF$h4cXK*NhBVVp_kbr)Z(q{}4`Z*J1tY6y(5{yw!hjOXoHh zQNBqCw3&Q#NKnzpu)*xcLpXbC%niqsPXb$QI!dg*l~!ew;nq-~NxMX>9`q^dIbWlOqrdx0%6V*1Lw7{4`qB(q zbzw108M2ilTg?qj%4gsLlfoUhUO`a;rx~&Z%>QMqTYkY)7k*)7Xe&~Wjp#bG^qoLY z2&`}xSfc$U$3$>{qW3?ht}@Aqt1n1}(4kQ+Iuj)4%ak}HZzG3rb^XfvgkWTDrVp#eMoP{oqIJKhnQJ zh8n4P$I<_*{kU`LNyh$e86d5($|++q66}=2DQwnR=sTQ*{SsfuL2Lf6#clf-2?eY* z3wMy~d4_{m|M08!J9nH?_tK@;J?*Nq&R=H=qLSD-nw{@;Wv}~9c^(&kgcxs5rMgSW z@}!kiW%t|OQI|D&L_D>0a7t=06SaGZ}uvOeU=EFt(27it#j1zft0pka)IwJSRy<) z3gudznp&L)GN4&DC7ql)g{nJ3n!b{>nvlhRk(Cqf5*D`@aWL?Tg=QHm0AkoC@$l6g z|0+uc?IX!$-h?Mws~B>mrog7oFRrqavKZo)@lZJRRZ657z9!>(`S(8~bq+LU+}M3Z zI`Pu1&YAZ4{n-6skK-u3eX9U+gaNb}<%8>2&2 z1jgt5PXPf$N2ERFe}u+kb+8{$3ODJf$o1Q!CeXLn5C|RviJ*P8X}KNrFc(ApDM{f4 zjasai}k3BNX5=ZjT9(INql-I2cLz7`h(G2q<{GHefccW77 z+RQOHqLNh_q*O2GFyv0Z43TN zmb%&eXegPohyr&oH8hRQOiP?&`Y_>R9_1*0(*2zkukWEd&QYm38~KusI&2qGpX-YC zMVFG%Qpr&A6{N7tXXCq0I^Kse401?-uejsb5Brq1AfuwxbJz-xT*}92pM*>YBJQ}m zQ)T;oT**{=M%Sh!|7(uP*L;Og?s?yoTgWs{f+T0NB7R6C7A)T>#FTmt;ti2Oz*aQJ} z@bl=JAr-nT*VxG;MvkF;G||`ybRi)DRyPn+&$f)jckOxaRACONl6(iZ6m=!)8eE|* zijU!E19QSFXH@R2NG{Kv_8HJfS(g~$PFie~A@#Klh#tx4&&2U(55xa++4b(2s~bG? zCAZUiE`P8xUg~Lj(4JVv%Oaw%q~X68cK`72>>1~f(epJ%k}dDjExBH|8xJs_cs+pVG}mh2(?>V4C?w zyP1C@>gf9~MMWbek4l2;;cY1%f%%Ge>CLO3`FMVgV%+b>yW~|Ii;{1au`e{gt*nq8!Iu%EY5jUvO7@lBBhm?OpF3 zk=6S87qbUJk?uEY=O*oOHBf0mJ`A&J_7RjSnBIF0H{>>J8ZNx3nBks{R=@>L`FA=h z8Hb7P;52I&G=6bE$#y+}e_L#k87Jqn#ivB{85crmv;ScV9iLm&W*$DiOry=ePA2Ic zCV7_i-O01xN;nmg`sPTbyUD%l)6XCm9S)*&@pGLssk`FuW!qOOxh*L=vxxf}lTt%bGjOCF53!Qnnn3}}?1 z*0ifGV|~%W#^IGrL~8s%A;?c2)F1D@S1F79%wYa7Jc-ur*oB(87A48~35sp465bFjL(yw5CiZl$k?Sn{8TWcz1~ z-K29?-QwKm46v2{cXgD4w|=&|>(JF&r%5TE`r{#Gy!o9*3H@(vvSBvRWv`3r-7egw zNSn$2xNmWSwr%iIXi^Pws`qCF_&{0;u54e3?=_0=1tW;v(tD!}O{LyM`K^kH7wMrT zRM*nAl!y9yvjK~40b75Wo#B_b-+PZ-5tQkBmf@>;y9qnm`tbxGKdMo4`h+CmdJ8Jl z=ev!|o{R$hLR{bmJ?Rt#QI%YkwTA}rhS+EX^+T2q;C;>DFJ8Or&AS|LvZ$klgU@z} zSpQV4u?#WYT5%6)|)l5u`}UBwnYo!hIC27{hcLYZG9F7 zkVm{Es1@+Kq36Q?ZnkOB4}W#v;wtuxjZEma9g6(U;g$CQP;ah4FkR)JIQ*A^nz&{F7_r4aLEn z9bE&(w^WvGc|AX&b%91J#%UQdALQ$nGmT!W`i0&WkNH!har~rG@A1HBb)^8mUg>6~ z1UO#MZ=>J$U`MnvU6!NuR7$xE_3rNT zF2zt$beTAZy*iC&ymQFBXs||d5QGXhuL}f!W`>4ibK{ws;Ds#W)zEb=r9%MPEaNFS zYzFZ^{q>lmw%&M_Qf1l%&Ftg$Rr1b3I6zOr5?PxJna%v;1e}G7i4+ym;v=Ur7g~!2 z=>ky(m83DcQ4Sh;3p;2d-vc$_AdGai9!jwba!E&IYkTCQr*rjX1Eoq5ZSDTPs8~^s zyy&NFBM*qIx|Q4zsmAd=D!d~EliC}mXK8P2#oryip8U`C#L~9GSg$B4Lm&62%o&-t zvR`c8Dx{=sEqThm-u2%LK=-vOZxuYReOV5^qOj&Bxi9Gn@U0V;U%#7LukDvUneu1g zbxQe;9cr1jq8T}Zsiua*&^-8>jM1gDUX|3D+29|aE#8(Wi5pBge z8V7mt6&9M+BRSg3JBL*o*2GhUttvvz)Yy|IIXj=G@4x@??E*-S16h;%#&ZkTe2MU5 zCjKqXpzt!}Rtcg7LIo{2_=;KMJW{WI*JMs4eDvsDZn}G*CXBfUF%m0sF1`TBe^l|5 z6XOfl0!F*UvnbKSq{#8G4$dB+nWSE_$qcMo3G~PZ?wL3=XQbI%myyq{lD3yw>~1j# zl@KD{w&fOJ`k|)$Hc7()zfSMqPq|*$*{BbH?V;?b9vM&}md3)l@ji*Wth6PD+zX4d ze6l^F;QWy|%8uZvF^&8Yv&?1+?ZCr`RQaW*+fOE+Edfs@Z)PvAT(UYf0zTG^B{2|P zYpFD6JNBGWE@Wg10E_Y1=#A2cmOfS398tdM0V>EOeIo!O2M+F}JH`~vBvj7V;j{-S}VSiPYYgbh>fLE;`d1+n|0MRWVObGwH&2B0e^aoVL) zX)Pk;MxUxt)nM&G^h3_)O#fLQD$~#mcejle_<{Aag+jXDrLCFJ7lQmLcWdog*%2soO_?md)-=(A12s~bT|1uX zfvI0ae^qFX@?*92Bs^}y+q9N0sOv8A+HD7+^qib}IZv!BWunD@a?{M<$qIjopNl=O zSnD!J>d~t4e;_-Qq+fS2^U-oXg*sgD9J73zI+^5<@)H-JoYn&$9X*8VfF~QMLq`W4 zFjH%$t8028g6%-f#OVH>C!x|};8(a9H)Bw*a~-S>C!J*o+dZ~=9H>*75Wtl^X1d&G zx=fc3_|`O+B)9~|0fF+rMA#237mrn2ac1$*cia7U{@?YcJj{UTcZqR?@oi9caA$UK zXX4z|p(VwWvj4r5y~5MswiC3)xk0PErwTd;(08nUHPH6-KUFitzO#c2P37FTM%qd~ z+o7Na;XLAMKn2_pP1u14Q#qfJFKTWJfg3PF_HM0jm-I+-{H}xk42M?P^q!T4YV=ky zL>Vi2W!O{02<~C`%zaM=W=at|)w7*qdg?3(aQ{rv(V{uDC>r+;nzb>c^6V6Sx1e8o zqf0WVo@QB3qi-_>^s9mVi$Z)+%}RA=^s7|SqB{d)4mTrUdb$(`Dh<$2uf;0~TVv$S z)cB*%t^$FuC=6#?g;pclhGfx+Vm=Wq@5;b2B||wNAB{q7U;6!3<+Bw(H?Q-0ekkJh z!a1yy-3;S#R*O+uX{2_=A01Cm_6*#Kh|WH8y(n}NpWv8cfY1OZ%81AGn{#uqVB_Tn zHQn5ZRKt573S0@3<=xG}t$E{naDl#(Q$_(DQ5)P(^Tu_{BNhfq8C0{`E(fVr{l&l7 zjOyyevg4!#p?zfm&VZ`{QzHK0!KiLAX(9wJOx_H!CAHibu*3*hRGL_4^$?PpRO&Z= zL5zATe#+Jdca4zDo?#0zNYn1tl_C}Fx1OVG_3Yd;qj5_!+;bFKQlJb+1C+*6lev@? z%7G`tF_;$5GKTuF6+9Qi{QiYdBcI$C?yw~JcE-5ibMTVH@MF|gqeW%?DrP@fif-;N zOfzovlE0A;Gd~+(m39ie;zYVJsD#0^{ua=T&Hbe#00GW$B{Qt=?X3l)uwTm%!k_SZ zFx$#^%RNG{Dbz;XK1HiQF?#_y35+7@xKj3Nki?f zisu-*RdbhB{n&fQ&-M-HBoqSw`Q?qA-h5Qt3hvx-=xFQ4RD{SY^dYS@eE)v#Ew8_B znAMs+9$Ipl1u3Fp{@6Gtd*|yPr&asz$iobXv`D$o0BY`qQQJ0si%h}SNQvKS{+M(t z{us~pI5kOoYj!Yfa{whAKy33j^h3mLL_u2*R5S(kT6Z8?P3CytJ?EIvaXUQ`GDh60 zCK~bUfoR~kl{LT+kh@La8E@-(?*gu_!8GeXvbRv6DYT6~T1UvD6Y4Ulp%u@PpuXXC431iKTpT-f z@$U)0?09WEObUJmzs6+ayI9KiE0u-&s_S7m-7@{H;*nzk{`Zl~O__j)W5nL6CCs$)8%Q^ER2e9)TweC4cG%8SDqwwS+mX7(Tv zBM{V8EPIg}b}jH=L^4?1`mAe3(LOd`Z6dCrl~T_yMBDEu6|CLYQ{Qq49dz-WX*fmz zaLPl#`;6qdOgH?EaFSVf;}UA^6rcj`UTKzFPMyeZ#JYBnp`In3JF39qCCRE*q^Zvt zWC7!#*v+Bvw{7S!98>NyWiQ!!K+7~#pviK>ZZaeSk7r(&AX8>MbkY?}@*wO+nk<^7|W zwJ(-2^ktGJ^W{cY%mUGqYi#WF`!AMhrNQqI>JWB$NJZEH5;Ww^Y`^JMLYWcJU!$oY z%47|t4b^vl!lY{W(?(aGZ`H6c#vknYeA9F}-xMp68K@5pRNdN+R>qsI>A;_+mx>mN zqDA_4_HEAuK$Y_{wP>bYloFXP+X$V_oc_<_cj}?!)4cMR24A^yPmlP#kXtiB}14ub0 z0*~zdfc3W~-J5XR@DrY7C)wc4D#6eA2>z>fKR-P11*GI{d6d)x+B<`4(Gi2I^5LZ| zfV&Dod%a{Xl~s3MIl*2nNqc5r9p+kFPfmhr0dW{~0vg(iGjK!BC`9sg$vgrKqG)-6f%^n=DyI zWM_sbw>w)@lx0Sn%D(T0xW|$;%h-p;G8oJl#>|-I`||!BpYQwr{Ep-IJIrx-{lP!X zHP>~W&+|MV0~w}dhBCRN!R+D0uMd=HEucRK(GE+2$W*4kMNrd}-DYDg631ds5Oy)%MTnL%0!wAJa0Fg4x_U|mtrwdU6b^)1N-~g-GLw~NA#YCAHn;e}x z=rF-w4MK!&e1J8~d~h4MM<)YqRzCbnKt4nZjDeD~3ElzYCM@Ie)PV{oJx;$6wN*>< z-sS~a3aB~PQUAOUROB`KZw}ePCV`fbvGCVC5Z8C`WR&@oBA>}n6u5|VbS6SV`=WL0 zK8&-U>W+>GgD?w0y4$2gI+NTBu!G4&w=lsgucb#8p{THxit$E4Y+F8my5glX3J(_~ zU|Fi~i1L1UBr&+GZR0EEJYXrF4>TIYl(Ai&NuL5-oQDvw2WXR&J@fu3RtcE4B8^~~ zW;C}bsQ8*J6Ux?8(`aR;NyH;hmfRL^j=SPIX98^OgFCnEvG^!LZ0_3Qq%f~1Q@~#V zcDd8dIZStcYY9qvy+|my=*syJ*3RobMYQvqLyY#{)3=ZEH~FcD#ON(m&)=Dhpn=(xwjteCDq^@J3G>0ziVG$+3>;<3JW2 z`*`DJQn<^&fQ7Wm$Kp2aw=+HEWVOn}%zvqN7ANj|`;J9?;hgscnk#zp!nf+zD^UOU zjC)63uTG+?8eV%WyCH}6e8gpvbsoh$Z?#iKL71EcthYR3Ka3B&lEhUQwTjPl!Yn+` zh>-rw$zb~AOIN%67T*4dab1~BN!V;$uR36+V6!cMrvD$paw6jZ=Xl-E2g6t*3(Ai& zeq`6?HE-~xz|&$*cD)y%%jz0hw+pA%_*3)fB?bDis1GMargF_NPa8$n_-j~U0zss{ zs=S_`n<$i>b>_&`v_FN6b;N=1ZfXZOT8Vv0!?0fCE@G=i5+m;#9Lsf!J5JJQRli_a zqdS`gJ171@%ik+NSnPFe;rfR*w_G%TMD50fhX%Ok3(n8r_7wg^)%QEhgz8z9A z-0%J4VFuU-dhi3`IGFki@>}Ndo8(hjP{_1}A5tn;MAO~_t$?WQ?*-VG(9Ab`^Cz-RXbwO%D1^Xr`%$U&Q1AmoJ2N2M zVQKS|1kV!TEfS>~6yrYieFeZ<+7<&v@>3?&KPqEcZdg`-8fGy~WfC}OOf-(+36E~B zXs8(-F`w}e!)W!ZMa5eB^(CRGh8wBp7|-7eggd*#c&$3@0HfzPmdAi@cBTQ|_6>p~s;@B@k3%tjN0l^aAeK_IfnwuPba?8p#Ur36 z->H%_?*kyjS(Y;%Y#4}1fsAfG+N>D=d z>~S@6w3LfpE2h;%9Cvl}hsqPo?QP}nFoHdg@xze&P1}(w48OGA=dj*XYrT&2qwN3= ztF+I%%ZVVdK(od<*EtdnA}S#9EFg`qkamfUXGvx&lbcJV`Oepjao_1d|I~5{Rt;2*jc3igHpf!6?l4_lQDXr1n=Bi9w zda103CrU-1c(cRj>;Oj+_G&dkj~#%Gw` z(zB$6tK0n{|Jse`N+b1yueN89^5wd7=W8D~`pd*GKb!CSp&|TL_g^{Zlf(3^$;LP6 zWV|jXQO*bc)u#Q`Eo4n-qRo6(9j8ia3Ddh3-g|p>AQ;Qd#nukR78QC2nd4@XREmR( z@uqf7ep#pfJf(^k#PfW<^{ZQi(-<0%CTZ_vBbR)yI^So4_?3`%INRm& z^|7{qb0ZptHS&{mC+7v)-LTqwpso`5sIiDF2IxnB<)OKKMnoKfG>SBkeFL=OVc}+?I<9)2TKTWT2?eoJq-YcOr0Iks0~$LFKLZ z$9nsstL9U=-2Nh;>QQS>KCfTNL*K{WDNHi>N~RG|5=0(Lbev*qrm@m&hwtrR)T`jA zfn&;x!}BMPtSriP@kEN2G?3hQ((Ch6&1MknoDKzYj~Y34ra_B*Dx2rRoNYC{kFyuJ z7vsREN7ewyI-fQFCPw$3gf1ghmGc?R{oL(S6h5a_C4SlOB_adAXk?GnBK)!Lmiwa_ z*2@iPY=RZO;vfwZyl0h)Ju;ZgO$5{6J~$#$M*V;~rD5igQa`$3l>1(x!JVm49vQmS zV*PyTDzoDb1QV>|t(2R9O8K6m(m#Xau>kT4leNewF)?uw+qk{}lx}T3@5KV`T@bQS zVRw6yLQ}L+_=AuB;oJwF`pw05UExXtFq%@_7ut-E=-X{e@BHv|0Af$#6<` zn?5?dm(!mv8m@7J{Z;#HI+F}+I^GcJ!6OvCPbN<69Pn==Q8JJUat=FoY|U0s##W)J z8lLt!2v>hz;J{WxfOyZzm#4Q&pMm`?jRZk|341!%tf8@y0qarVd1 z!mqizsfIdCAm@!lhIHQ44ORJLy|0@pOx%>)tV63g`vG*xFoWrtYQek`VTtx8sBljP zHSPXY-#XXbou8LVQhNke*b%+ngbG`9p5Dv5-kUI@f_OrNs^>bFKI(ljNto`&EcKM5R^+h@w9i@U zv;9-vngLCPQ#vbE*3O6PG5-}tebl7WqYJJ_ZhK5mWV-G-2Ztjv%DSQ!GQjZJ&9eWy zE&;hUP2$@85K?3Ift1%4?0v3HEkE{)@#zOal-<2HC6SR$>pMaBm0I|ic;8hTU3^rd zbs98xB&1kdNarC7s%9hcRTm{f>N(~nwUSRIshi}ICHcR6DF`jXv)_)2JcSt7mqa7> zR&QDYDvsDl+^U^HJO=Rd@ZF9&xWh!(&fM9TBp63F2yPBmO!-D1o@oYiAvZ{`JvA{~ zB}oyq`3p36VYt-F_{6-fl^rhpUW$ndeHtF|tvFJ>whrI;Q388#T(R+jEKHGKE<6on za}YyG)U-YQKZK)Y!g>vV7A?J=rr~}R|Mfq+)TH~?SC7goNs|I=H2Xdoz$=xGmwMLf zkq8~?^wpDhP?`X6Z>l&!YsmxH;(-PjV9TmB)pYnEgQIaDt`y|6u3tm1yx|oZx>=p` z_LX>C0UR2|=6DaiNM(r#c8<+8=Y57;pwItoJU*Mndh?Y(GF3)F@kWv6DpW+uqlou4 zP3Hy1Y*XDp7VJIX++Wkd#)SRF3wFzMcqjanj$k7Lt3S=TRe4$M8V}C)?j;H1%QjH~ z-NKzB!>ZPIRg4WO=NGL*I}p&5qEnhtVZM8^4FoMC(8scs#J3C?mw=@o%FE>0^Y>mV zqMJ~!>k2a?yt(>gQ?`RX0P5^VSuD_b%8X2E^URSgR#Y5?>pM|%xmj$ zK#}0;a_v!(QKP?HGaq1`HBFXsj6H!pHT^2jUF&REBoUR}_m)RQoYjPy5T7h?M!&%7 zl>P*IWj%9U>N8icUwHHO%;%WzZ|32U=a)ysn2m(KGbTSr`7xWX0%TD2j;vmxrsJCH zeu~xd`DfdOxM?K=>=J>ekWSjP_G5&x&YLI_UTr?yJy)n@_zH3GexP7kTG`zZyAHSH znVTv)Ioo<_L|nwSE$j#vpT|9x*CR-1Hr~7Ui1+Mu*9dq1BMg%sdw!Okc6li>Vw0SF z4HNIoMT9ep8qPjh^f3t_#1O#VuTlQp=f@4+=9jT~E`#SodTKSnQ+QoJM{M;7UwVpX zyWN{lfEuodhA3^PM8z0!37ZaticPTp8~*^%0=_h29D+IbzJ~P!^gmx!F%s{XcM0jp z*A*CFAD_yod4o1j!Jp40{^tjNfMOk*Cg&24ILj4B-Vv%T?ILuLTD6MR_8zhIA0QA14K(li*%Gqy(n+J1r!1;3enVn)@rJ2N;f0s*AdSdAJY@6(EQvjmOYod( zvM6JG(2SLsWk(4khjG^Jsrv*Yh3se890nLs-%f;6N7)(JuNIc)80Q5)$@cW|ECL}#1fy0fFdwE7awLGR}Nd+Jmlm2-J3@4u#h(yuKg&m z+g^4v)pxqWGlb9QP>N3ehml(+;4L7q)~jC)wGc+@BW+?0yk@;e^=IWvq8X325)98S zZvjUT;}}FuRLnQ+co8Xm^tGQYy9UeNy6r4MU#)>`4fO;9eP}HznmGe?>wBu5lZxmX z(XP>r0?xDTMeKi8v08P+O5SfU=3jiOTTgQiE8`zG!tC1$^4u$gupgCAQvby(st6et zOC~DZpW3pM8`d1V@_oq2J6^Pm^+Kq|<}@8?&qi#%9QN!1c$T56zxAjsL)J;yIN=X~ z4hG-ClH&V`0n3UJb32IQVH4sl=c2P)*t9?SI)>O>L`Z~M2hZ%3?RL7Mfg2i<30k%f zfV_lZD0i4CXERvMy%ExgVYdRxT|$ak*65~Ocw|~g%spUIz~7YPUlcy#6=s$7s_6$itrTGhsOiuSCLGE&-!BQdKzluu2&%6iUvA z6x#pKT(S6sueC#yV9tL`fPZhN+NIXr;Z`+dW2k(>T0+t^4zitV^B>X9d2+{Bh{2lY{8V zVD47|5dNtjZG~Q+Di)>9H;eNj_ofq41n&VF;?`vd=bA@}JQerzqg zME&5RuA!h<%bvO@EyjyIiG&J&A>k{1>=%gfu6QiFEJ!LumxSR;)`^N<=jJVVlQn_9 z)Qp}TN_SNa9<0ZH%V}|F=b^9~Q2x3ze{JUkGmqe13Hug{AoO94^$tD$8qa4`<_xfH zux%Y=D6tzwQ@|Qb_pVi-n0Bamy^s8MWTC}8giY+V-*)<&eNSARW291msMO$ygB>MvNIbVS@P6t@c+* z5&!3dAi*GpdpF{WG1rrzQh&O480j__n*@~Jp{C6g1#Osw%fT5*T~f}*>@i6!q#XZ= z0FY-~vEfF+`*1)snh=8toRB1M_{$3q*A)bu%#0ure9K>eo$?RoCw09T-Z#9T7711? zP&A@9nXG;a#g_zX7!X{rdd89u9Ibj$&obX6yAkXKV{axJll|IxlVUZqy+!ThhD+G% zE>ri>aUPXSk$vf}$<^)1Fp=F65!VS`{H3T}5S_c)8%_TZH)gHsXj6!+NCTKaIu?<-%%qHvz@?_qYZFubix~)506pq_gz=ZxKEXmV8 zP^^sYxBOEL64Gu_+33GgLGnR4%8`nvw(xtmn>_{n7#+cj|K&X!1I^!KYMxHhU&91u zk{!{FDx}%@<@tyJ`TtR*cfNPoH%&4VKzDrxC)1^gmjgvo3*yG+@8Fw&1yb2s1wVJS zPxhFsn~8sZVQY$b!{rINW!ZN}Lg959Y)3KB*(Hj0$)QWCzUQuOBzpV2+R3ZyZ-=91}ds0RLh$>p!fDQPK7-}6p0c!w0C;xX7T9Rtjgc) z*u6P|!y{WCHH|$yopF*I9e1KGR32x%&l3N6g?i6_z2jowLo07?d9Jay^~CyRQL7Gl z(R}*bJAGHyqlByu|2cQM#c8e%YN3sHTO?1UIIvK8CfI@s=zX)p*c~jQmmou%4i-IY z@S7L+k0Xi=4^HUEC92QI3sTBvH3$;r5$j~2t8RjOoFkDO%6wVBG-GWUIK0*nMHD&> zB-NM9hw|;7K36u9{2-jB)N*+|KrSDD92XcKxokSguxZ^%jXNaw1?V0E<6~<S%A+6i z;SzrRUZfWc;BaQ$&}es$SoZNM(e-imb+qIog*ce4X#|-8!9FR&=>~UL-z(kJinxI5 zTcZ|DtwtZFbrsU)5iQ+ffF8JArTf%Mz>{qhSYZT5AOEb!qqbjFuvnKdD_*;kO^YU{ ztxpH{?P`S2l&7xqe#f#Xhh2aJQ$rA^1)LTpIE?{zY!1X5TM1O_(ekpQ0*{M6%`Qp1 zCkq?9goVjPgy)%ju>nw?x#%a^oB3|u=+}m3u#>ivW93Y?Vbx4U9uggV7e&{iXv1c# zmcGAz2~!Cfx%N{Twk#KSJtB{BTKsb3S9bA6WoeoSD1(fkm zI3WjzI2$YW#A|+^cP4HmD6#PIcyw43&pn$KwYSpwupakoE9{-%U@P}o@A?nLaEf;A zlPnLcU)0zT1DNfYJD5MR#BftZg|c%Aa!-B%#^8~+{A+n_f>p%eK#@jb1;j83;D+SO zHT!2XGrbFa!@mgJ-D5?_Wo#JX20D=Mu$@Yd{w?M2)uJ5>K>_-T%DP3M3)Iud(}t3* z{n}o$EKlGdBx(0QL~IzPcQy`xoA-p2URHl^J8Kzc)&$(-?Ob0q(7)T1EC zFtBaOsNY`nbULhm4OKdzp!6r=$7(UJI+ ztaXKQYo)UT?B{PI@yLBlq?z0bIl~C#GIkWPC{sk&3Gx1^uOztfK1Up+AGxd>tnu!3 zSc^4Y3nw=?1D;a)l-pE-p)`xdLD--e9WDSc2h84>;8`&p0SqNIB>Ri@h&S@uvs|to z^ptIwB(MJ}L@&}w1yFX;r47`J+GA7KtkNcjEC%!m$#mIvD6HI66CrCP=d~=8mZHv{ zCu}FeG+wzfBoZmw*Tt3)omO})^sg*Y!z=DvpVJ=KMq>C$ zU6kCWnH;%6?Bb!EHf;Z`RWqoR4W$axkIHbb;wl=4S@?ywP?wfg=*UM z_B#%2`sT}$qLhVveiCmCS?77v0pEQ}7xN85Vt;koBm-uaTMp(@%6_9FHR>rw#SePn zqV}S9IZ~Np&x8kp+Auna8U47I2n+=)4z;MSq1s%c7~Kb>eSc{@XkFdtxTjIh8bZ8v z0LZJfP64 zO_-!zToZ%s5$)}=$MvuD=M`Shkb@DGRm(l2WNsS2L!tOI zXv@Uh%t;mi+hCb$8Sv*4J>9#fq1YMNpNLA&27_^om+@hOcv0n7tb5Y%!wO|i)16*M zb&s#Hq2ZCFm@h0BC?pNP5H+c+*rlho<*SjDD#_P!Slop0PKM8G*=*}0$ANI;Y zhS)}_$o@5qqZr%>xxNucf16KE9Ln(z8;TldQ_BN%!!b5fP}eVKn}T{@{zk465wM!j}Z3u5^qw zRUMYSBrU!(MI~@-TyW1fhC$r>mKcMks%9jDD`_$=7AX6%683oHsn@7WUbuunX$dh_ z0XA1(67L!Lq}!ps^t+y{t!(g(+$Nc@Fs6KCYeLlnkqoBXCR-|u2@~Cy40~jSIrZi9 zHQuy>$kg6zm`CV|XZzk%pMoqe3-qDrYZ;IqG%N*D||o17+|%PpF@Z zjk{ec8c?3wPn>s*8 zLR&62g|zl+(@gj z7;R`MNS-7X?Qo&IrABwGJPxu4oS^Q!i5meQJ;M zIi!^{X!(~s9snTT>A4;^6#``;|>W{-2bDlFzmiQUrdI<3AKep~Bl={$r-(Si&9EvydfxHjxyIEJKf_ric6Mi<4+v{E#la%D={I2FD zpKC4_PI99c9B$W`(WPL$EWofJ-cC@4ALptR&E8nkW;r=?xGRe|1r1XZQ$D(bk-i% z1+;TP>`8X7Gw}Z`NaBFvLSCXO3Ujv4Yc79U)f(~S-2ef}sj6$x1;xggG~Ho&1qVW@ zG2&Lxyr61Zfm^Np^VG&4g-+`&M7I^1jSs~V^_*$3a&ZIfpc`3d=A%Q8KK;TbPX_V|n+i1f64n}+_PVaT_`2X zP!7W!qyJF&7W-y-Vf#XnX%dTqrhY?(J%anK6F`3swLrf}x844ALy;q4*zw*m(ig=a zm2xsGR^-eKYj?yDR`U6282Ta^dRroN6j~rs1X}CdxGA+FyAFEnCCWuwN*%&c2FV(o z8iUgAc}Yi1c;BPtL39&+ZG66s*^{A@YHI~)XVegem`hhEh!<;2Vx*IiNb@~eSx|$Q znJeC#{!%X``My8pTWBmDHs^-GDfj3$&f=BJA@=I9@-*$emu6Y>Cphb#n@(%eniWX~ zi50op7bV?U&y6^nSpM$8qQ!|_aDq5aBQPe*SQEqv zHIXIF#NIJsxm3C`w)AaGdCcD&Clm<|HKZ3aL@%pB<}U3GaVP+r4=T$YrY0_M6@)i> z+3F9PbNg=v-Nvwq*bQU%*0c!D1-w&;(IZrS7g__<{-Fyy4ttLf;%0h35Bsxt?d%Z3 z_9WU9Tzj^K7Er98@g<)~|lfQBV8 zWBofu@{qEX0;?$lBC7K!Om4lW;{02U?a*oSEGLsC#f3n*b()=dw(wnUd^9Z{J(J6KA+<0)#r*FO3Ug8LUw?_#frJ#VLoGnH2=sXT`n2)7{*n z!0-RInf-fVmNpgif;6|@+D#sf)Yz-a(a@V+@qxdS)e_|0Ib=QE)J?$(x3FmV_SL!1 ze@wT?R5+6)K;k12Py221Ma-hgd_rexIS{1}+L7}K^62B7LG@ayRQX7qhk~Qr-q*>; z)z+R@o2FjC`9&h$_G#u;HTL~3PJh1J$+4`vGwC*bh`K-d=mGOR<%{oCoTkM)zZcQ2 zjFmC+g&%{2Go9B2f1AEntj_M$leaz2aKeixigeawOxY&yed)WXCL37g0gZ#;Ou+&% zM_;F~KC?f6OOj3K6kolv|4n4%^4*oMS=L{))(DsLZsISeTqf+@8@-%>7F9FzUf+g{ zM{H`BT&PmyFraYm+5mQF;m0ftp>gdL7aUAg;4aGH*sU_Tn7d@?9Ce@+)S5!nMQ6T= zY*7Hto3-362f&$CP^enBJeGQmcL`qur@W6!ys*{9zHa`fJkAKPR{UcrE5my_5iWO> z)Cek)Rp^xd@)IUdTPGEb^lG+9OedrfXTU(mg99PiT_KVM(4THLLh5H$wGR)HZfm?7 zNhianE(d-+toDoWjuRL73&8_5G-lco&R7m86tJhi;zIBeO=-!spH_mXJTuM82SUYd zPSLV;zrdO7A3iLwgPqOpjz^3o3YnfOnlsBqd)Z+9z6Ci}kA_S`K)dkU!a>xEnn}dp zHXP8jA<+r-M%7JvO$HM^)L$+NCQaVRGZur06%D8l^B+ajdsD9vNn+kSK$9E+e`CB{fbS z5np+>9LCp%vSSVd(tR&8P3uHfK$%SCucL)fa6`-+N*xKk1pApi z8@GqgF%WJZDSIq0q?K!%Y)4tptaP2%uWsANx;gvNw6JmaboBus$MNf*B1*MX#z;n0 z+s_V=%I#NNr|P-0qS6qI2eRDgQjQAFM?h+%!ro&A8R1^VNy1M6F(%E2_Fc0;nqFC0 ziurP~-6eeX1#Q84?~*Qj=HZ$2MJJk*9B?Ci4)dP8_T z!u4kx`~gKsoehPJaHf&s7PRiT!ms0nQG;7!x+4y12b3)CggRR~?&7 zRqxo^nNoq-R5mDndkd3U0#%vqw_v%pK#Ggd#w?=V)o@~BzKf7qiWGuna*}M@R#JGgo ztSE~NUf)JPiP$C6d?W7SW5(=8eq3~SR&86(^GPSD);_ETeNd^QAn03iLjwh?9*7ARuBb0Oo2 zaR(m~ozTaut39Plqq%WsCZgr$<78bDf`S>MkPA77&m7NDgFxZ=CSr(ZhIP5quzmG6KYkkx>xQ)c#m;A)}CVN;~1*C6cfAhfM ze6_*`*4WAZbKEsRx4(#tgIz8n)z6>L04lEAzd04;(HR~7mp$W(hOd`#(`=8a0c;2r z-$Pp4rOwPtf$BQ=+*T{hB=&sSVNL>UtUmDh2Y#eqpWcV?d^+3pE^1fkV! z0QFQymbQbavS#iQm}G2j&~MUPRg}zM*v9KvGBm~(;d7V{v`JD zcT~`1fWr+^^oYv+VoQmQ#6o9-_Yp_2&P*E5W|v@1TF0eS;KP4Ek(S$j;(9L%P#YEK z_d)3uxPXI=95saAGWT~>b=ekSEW`_2PNh8ft!+d1P07o~W^4w+_<$>4aw4r9lidv8 zRVs!FhfR~SZQ2*#)h7H?NV0nu#Ii^9c@DxRBlw7#4#|-`&PWK3m78Qxp)<9ip)JHQ z$V7Db|M&8)Jpn9lnU#))`CL%y)KP|f56;9uv=O`JKf)w%T&C8GM*kccn*DuCtg?qY@)YXYXN!IfSGgv@bK%BImpvB2NX`+y6Z5wGh zdf@0OkuL3KDuDwFk*KA^_}BD9LGUU1_p-=FXHmQ&aPl?*ss+mS)r|GMV_;W)$$0x+ zIx4+?X?zpnO>GuuDcA;eM}tAR&V-5GVe2icOF2Q^mwzQ>)9f?8Sk<~0sO`#ehLm%ur5-$w)Z>s^rfOXBW z$`DY}ROt%U@~vCs&n6E~RC`an_T68sX_3s|#4@ABB}ct!SFQMe3wZmLs zCY4hD>t#q`bTqMxJ-{PZ|Me!aHpZM^X27-ZD`B#q?GL_hhXdk2AJE&C=yBSTnzGbq zfkO@JAYVEmf+z$=!{_gXsCJ`xbk7c~-;&kXt)I`(?C&vxPq;fsMVLB-gBY>G@?qWf zf~lBiXz8UgnvH{yX}GE zcZzA;{|pS`EHRZG+U0Tr*=NL5qKK}#CPGs)^9J(zBaR`TR3o;(OZS$AT+%VNa zy*aa6kfroB<5v{XLwv7|hvoUXecrrxb45A?(t~vl+gw!w~vR50}8QZhPE&%~;jjh$`w?Z%IJ5*$aoT|0}}y z|K6ni&9k{aSENr!7KT{dh+JMuMVkKB!-iaq@|H>yhz;0$g9;eWhh-Y!a;9*0VV+j| z;)qNLoFTElZ?RjhTEZ~phcH|)h~&SrwnFS=Pd0Ygp?T4$xUnfCzi0^ZzN7E1X>Gm8 zQ&WY8mHIx0c|71(pG(vC?gfUvYt<6fuP&Q%Ha?g}u#^L&?IyLPsJ7dw87hlG^1=rS zD{A;(-Kf)zGt&pL%~r{d4QC!7RTU>jK8m}i=RI0wDxJCGzjeTCaE2r}>QfR|W~7^> z@zT|XF#Z)|zvg}JX{Pi3UO9z+f}_4u*paOxUp&jWl+;9>^?~#Jj?u~@q4fy&!U=*9 zApevnK#0GsNOP^l0@pnpMg1rs4g>7Mc#}u?u@}z+f|v6vEACSF(N{^RJcwq88Ij7&5yrmd)< zCikAy;;gxKO{gwHf3qMFG{Rb}@ajXcUw~O9nKWnF;jc$Sp z)y3NgcTIC+>SKzyQ+lr@gP9rRdX3#3lPDf756eVR)^=mLZel#|ConlkVObI;boC=H zPv^*N0zu+|X4Y-K4R{xLo>=?=4Be0kgtmcK-lMwc zq#pd^<`M=ae;GG?Y-7D6fS!_8?*c__KJd$`^Kklps=&G{%{cNh%AmWwNSJ6+yT*Gf zTNX>mO?jJDhkVk_pY<`nH@SLvx{HhED>VGe$@bql z*3MJaDe24!Fe>0f2HEGMgb#48Hj}5OsLG{ZpC>RH=NuXzN?+qbe4^g@luxFA)7izI z=vzI~Udss7*)v^}vntas7{6v5&{tl?K{nw4-t7ckeYQajxeB`L-kjF7ELREo`cx+} z|B2|+KzHi{Fa2)|5=J^8;eo9d_Z=he;g#4I%HTGkhxd?aB5PN6g?4cvVNI`-**$B# zo&sfFYz6X6+Wli^zQ{+ayA`# z`6C`!82E*EO<5w>)+O7Ig6pKt@D?TLe!G#=gU~BnNrA+M>t+&!?>ZZsmZj7SNZwbf z$pGSN$|U6Y+rnPXx$@q#K!0Idn-yTJZm7CY*ZK?`dXN58ftLiYp_5QXBI+S?Cr4Fy zFK55>CM(zk-g4~~IO9tqXQ^ql4~;U~n5aa9G79)zY&;^tdKPiAzok<2trcP+X-s&7 zuJGk|yeowNE#~0(*p-oLOt%f{!~yTir`Dro=Vou=!Z*zp#vt7#!UMuhPZIkXhNv4X zQa(L>`0=ky!KUyBP$K5^H^+GxJY}yPILNT3O6}Q2`W?a$8faf1_??ZBPbDE{*!yfO19NI&{E4@D!-enL)SAM0oseG{|YbF`{;*I+{ zRH&DdIp@xXL+%9!FW+bTR0?ybSx?k^!f+ zP|`6@0{Mv#k91`C;^IF(_)2}0F=P({$h}N*MafLpdhm0NH~q2bf!nLneVa`&mA6gu z5cfLLGg)q%h-#jN@U6Y@O`o#@#v|cg*76Af5rTbk@3+BZlMWMleABbo6or_I|jWU zyEaCG1m`SAQf{KA76e;63H&45Uy#6H4BNCP;lbF~0M{*KA*rYowWXoZ;)Y~D0naXM zQ;#N9d3FMEb>xwUM8s(w;d?VAx3>}&(x(cq$u}Hz4$3kka$iw~bA9Q(g~mrORqgvm zidd?~C@&XK{#_{Z?`MZtiHY-5RBVLC;KT*)t77r=43CA$kvdKQWi;VYT<;mRewpf~ zJovx_EfH-Ll)5@!4!zwbYvS{Tar}C&5>oH!m8r;=dZ9p>YmG!&Xp8(FjBM7@>XBKE zsYx2eYM7CrxhdU6Sy1YYnC-QhPL(hYOu4_;T@<7Q(f}QJ8W|kVwW3^^>;;xG{pDD1 z3EWZLxkB+iQq)Z-aRPtzfmZT~bOP<2P|j@bjv&udy#<1+JtyV{ZWxbf#$ zo5KEkpcIpRD>(|NpY#ydh+n{)jL)i&agJ||5*{1stl%Pf&7e!=nYV>OF0y=MCn)@WORwf3N!LG$|?1YR~CLefExDAZ)-!U#YyMV8wN| zZG6{s*|EM;RIRc-RGG&40+$%WJc1yp_XIYSw5#I>R;yRQEg)#G!v^^9Ep}v1%=-%s z+-`D#|A=`F21LsJ#GwBJq6j}F!yuKrTr}4h42Ev@QJtPkN0zjmjROxW2)9T|zTNgI z6|;U*^-F5p5fu3au;?)nLKzq3cOH{kA{fy7j?gX_{F7uuZ1snnqo4HrQ}wHl z()uwUy@tyPxva3CsoCY6r5(T!Ft6qn*#F16#cyeOIq!w#^oylXi?Pe#h54eg^{x3c z=~)C0BAfeq6Ydm>kM`#Llm10Rq5a;{t7Jqgri`fxt0)n6@rwi&*p*J<;#!epd|u*W ztO<-BDbY{>v_&i%kvQbtCSgm?y2%K%rY6FrYzXo?Rr;uZ7h&e2RfGu;8qayGxC+Ep z;fmb#x8Q3dAHW2r=GoB{lc#Q;&RhJHRh77<=I z^GcFAUuya>qZee5;sPq-lh8sl>hs}w*E{mem9EuF+)+K=efEKk_KevZ8mY3mN{? zj)u~bDfalu43q?Va7E^_-xaUm=sbAHbng;UMbK?ow%(!{EtBT&IBqx3%Jj_%Ql|R;csY$H?FD;ax7H>)6rk;>Kec&^oYB|a5-|-q zZMxiBqE3~s%lG=S0`|wrITv53M}nk(rq)E7*lUc1GKWHgsj)^ z(pKjgCFc|xP>aiu@>*JIz4F}6xnfui6&Iff9M9>4xC-3knB8SeSjZ-V@)`aFIHQm4 z?@GkEEco-r#Lo8sQ>TOPwN69ge}pFqqo>4OECSSSxaH(qcgDEF%?`IQ2HB< zAr{SFFMkCk4Cx>#_V1l%KdhPnuGapk#Dtr}FNo0l4OBB@{-?m}kiNG<2h^Rzg4H#_ zs;=--*8%@QbSj%^Dw&nB;52|4Q)nbiBp*H3R$^8iyy@ZF#;@2Th@Jir;0{nFyUJmi z_8jY@cj4)%e8s-A1a{uL<-)qe(D7Us>7>5)Wk~zu};pY!?pwI!+8_;ya}<2 zr8|VOG|Ie0+weZtPQl|SponL%G8%+Kf)9e>q*bgXHA*48JU75$lZ}-MVde2out!t( zgtu9$EZh%r^izi56P*M0WMSR-WHB|D)9?`Lv#Uh!$9q;pC#seqL`XneK+Uo*9np#{ zQwaTEbz1+;kG+xbQI@Y>nssGcHor09P>(p=Xidn?c-ZU%kAHe*>X7Vy1xevXR*6Z)>x(RK0IY$3tf~Tk))5?L{Jjge{`_}r$buocMuK-Xdim+4r_b$h>Y)uC9cxC(fJ$z9 z!Svew__fk1{72{H%*N8DBylHoacg%EIgG|p|BUeoSEj!A4ZMns;M%=89uCQLwr!F& zX-w(hDNC|~|7yye(9o?9P{$whJ>g4)IA-*tP;=;Tv?V4`RdaiP@ew8?o3F5^F1aN* zCyNK>Ij#Do6?A3X+96?9GAyQV3RC;=SkVVU(Z8R^)SiiSTuOM-VgEkYGuU&$Uo*~t zwMFjYSxi>W0_pe$jaTJ|M{HivbTHF110z5LbczcRh5&UM^&G-Swb4H1C>lq*h72f_ zlQf_qfVq7}tv8Jbw__~eA~R`@kq*-t!k4Ki@)~AqJlqzy@y0{YI_2&T=QrIsnU2J) zocnpvihO-_UHR##egi1LC5M$~w4-7A0jpzn3*mX|}U03TsH~2copc{a4 zS9Mnc_O0gmFmOp_e>Na6|o7|!&?K&R|*gs$PVFp8XjIt(A2IUD|dK!hT}Hoo@?gNu<#Syfr_J_&PMub0QW@Ex>ZV zC)9LBI}UqLJ<7&RVL`M;^X-UVa=4K(GiV0ZZL@c6EOjv-xVJ01kqF@l!f7|BXSdNN z0~Izkg8a2CLwn6;Mc7|4!Wd1X2M*S{MP+#jli@=|VVVOfWbZF-YLQJbLleR2=-#^0 zzV?HBSFwl2ZDT{aga9mQqSU8YH@B|n%v&+KyKxS=4yRfM5X;#!jg-CHGiT~Bb8s$< zKnC3IcdZ=`5>(ccW4%_K0Z2});E4oLnfvR5c8LS#J*YLS4w2)ON+s6)QArN#z8yx6 zIm~G`Qmt+|g;WkBr^+ekvys9k=fs>3n{CWtW9+=&yU*`%egFCW>2mG#KD^$~*Yogr zEEgTz6VfoRRHF(#efERy8=B1BXr>1w8tS`B!{|<|l zWD_1&s2_6P3l?WkiyY@HE&DKi+s~dnc>_E5-U$8fuDT4MIHFCdaHQqsQ{cI=Wi*N1 za&+Br)3#d8gGTBG0B$su#SDDd$;(PS83gX_N9vo0kfM{7qwor?z+U25P^@+V+Bu~U*)>b zuP>)!#j<1)pv--Y*);+%MOy3JI*2Hzf0(W7(d#Giuxgh13xo+1@U*eJ<8JD+Z1xPo z@$cw(-+!U}anrGkaVz`@MZOop@Ib>Wb$h(-;r5}WnZS`5a1BAn>o>tAYnLbww>cO~ zTnr4s*E4(HsE?Q9(!Y=Fuv>jkyg3`V-U0SFG=Y5yd39Ew!^mCTf>^9ylnJ2zF3WB5 zQRi|i+N(e&<0Ee(p9>g0Ige`(-RtL*i|YclmB*bHIx|0)@4db6!=i37V_tSu%lL|t z5DRC58h8bd#J^BDuLH-#$E`Vgnhxz+1}3BHhKpz$YC*Jk(X%fqrETvY-25PZxB?W~ zn&N=Ln7X&Mxa~1dAXpH)OLCOQh)r;!)2ZTbR& zJkU=19W(I-W$EgpUFW&80z33*BF3(K-bbW2|G;{!^MuapXDS4E`ld?>u}Fv|zDqAo(%y*Aq|7_bWZskM~Q)f)1% zAAC4i{7<60;^ILFIp5L+sfV~%A7MFYVkzzjyNe0AXi=3Urdzoih#*y>d^`v}xZLZp zwbZ<&k?FHUYC9g-N67r~)6snpeq4QY^O-rsZ@+z4QUZZjj~o*Bjr@e=8UZ|=>M;h- znsvCXZu@fs-xeOpyfxGf6*2w#{L5fUhX1(nHjcUd$>qKd6(8I7$(fhsm%?ig@_ocs zYnTLl*I8lL{lnTdlUsXv%f(6Pt^9h6jVV9|ykfts`nW<^8(V8Q*;GF?Akn<3hWw}s zwG3#t=Jp+1!8(eKl;&+-|7EdNicR17mcbhupCzoLeqs{be82hs|6>N1Uope8Ei!t; z9+!AzkVUtPO#m9u_fKDLrf(OO7!~ZUnQCu(i?lj(?AQnDxNT8TtX-`9*6yEaoz2@5 zKJ{PsM>4NK${#GnfwywCKR=UE-mSH}|CjFFKP0;8&`b$jxU5~d52pS_MdyLwN1@6x z=jFv+?A@<)p9=hcFazBbc9(3N$t`?|UfyeVIQPiSKcrmBZ|54B*Gf9Atw0&?6C^YD za@Ze9s9n*Lz5$o3j$r;Xrs65sd+iC7m69}-$dz_9YnV?sU@=%E;&>k2UFD+`G`DUG zkD?Ok&%qc?#fZU(RUde>^cG7uv}Ya~#I1Bs(Tld)^}-o-ITs{{t2@FWD{Z|Uf?K8t z+~1_YKOdr%=nIu})HdfCrCDVXq?pJ<_J>%@JC;w~wufDpd52=3fTD6^JvoUa`G&-k z2M(Brv6eEPJTJhW>utEGyG6Q(3I1*;Ai#q^L%?0lBxc-AAYIQZ)Zm`@`Z5!B!X*_q zd;NGaWUw3gT(A+Zc!&bZbs5hhFbNKzS+n^Dis^ZJk%aZ$%@e1Ha=KaDIvk`cEyWU`t&$r^^b?I0kCZ znC=TB-I!jAzTkBaA3pMPCe*{-Hy>)c0bRWTVvp~VQ#iqdqrajLxd?D9l24t5A=s^p%Vja#6+8(cv;ly5#=@b#w!+NB8?%XY@XT#0=n#vS z$+z|MLF-$5?Dbz%s`8}N+g(X=k$(%N|E)1=v4ii!1=ePW7J7ZRyuTl1-zg6DUom61 zpS5sy%htub?cA_Ro%MEDJjkt4fCp(un5!=SE$Oz%5X8^=@?Ric?ku{W%w&E=*`kGC zTh8?dFaM~JXTs|~U@8~?2chYIX7@Z|osy)>O&Sm4hx!^+{xK?^dGcB5s|0X=Gmn^U zE>);_$66YtEjONCJvrIfv@7A&xtSXWR25I99!~ubBDE$nW?R-|$nj^ieq87RuUg(3 zS0P#k!KeMn%)7Hr*V{AmX(e&~MlJmp1q;`A0Q9JgSAMLg$>~W7-C2T=gZA4f2kx>~ zgb*vNGQYoTd?rNu+WVJKZ&*OphhFHoP2kjI)Cv8En1KFWRDqp~%6-9DruW8Gaj31+ zhjm-Upi`Z?n5By4Q^3&LP3Wz=e5RF%kQ5s<#@s~aS|%Ai8vGryfkR_q zCs*IJ@wa9VNzy*2w%KWJ2g}iv4pF1`RT;rJ60Nmb$~Dy@c_f9z&S3P;0D1e&*|cz_ zJzpVqnZcq<0WYFfvE9cOK|)U^L4lSaj|YZG%o}@TYqZsR`Y@{`{T3@uYDeequdZ7r z4`0l`NdTm zm~iyM1m^%eD%otCd=YCtzgF(VvI))C*B4<+Fpq~IgEC#3qMJoP;Mj5g?qg*k0Eh*6 zPZ-sbP3UU7r-a{PLWTWjQwwgXPvWR8dQl0*tCWt(&#uKWd%^GqH?`26N_fqXrtE{@ z$T!`ql8u|0l{roBFi{uWO-((XyX&6ro9^hc7Xp%szs2qfm}tlHlHq@5r`&x#V4LJq z^^w(_z*Gc;-!TcetXGXnpfji#Rj=IwVAXoNtv~xYN_Yglx0^9VUKbl^Gx?&eV(C$Qb#FN1Zm?-c@E(pPGuJRZBI#+-$$_ z6-V$xy}IRr1t?C8J#e*d0IAWeN`$oed5X$cd#o&YLvdNw>JGX+W0=FU_%<_P?| zE?(DV`&zp2J|*egcd`FjX6Y@$v@Al2x2o&KX~#iIL2=E2iyIGtR*DZ z){{NACr~n05VF$<6W{qb^9x+6A+DEwPro-E;*g_8_;+m_^9nL^3KyJ<4ysJzxizjB zQn=zapti{Pw0>>8s#32;l1JV=ZHxPHxO9_XAHW&R$eEB#juUNNwK7H_FH12dt_Tgs zm}M?Nk;W7!Zhv9u%&wA!UWszB7%N%f(J*eAPb>DnTwPJsiKgv)b;sCi{dfFw%8o&E z3P3;~B<5&<-z`gosun|EJa4{jYIqIYy;!^TOY+s0~335=kE!L!%{BW_Wj%W z3XMQT9(8&GcNXYm4&JUvN{-Xqs6$V(Lg`5S80^&w+ai5lRZG!5FyAj$&sE!nW*6GF+G4O+%_Lil#yZlDr3L z*Rx$LyMLaKqB5W2wZ?kfoCDlb!;iadEgm$d)>fFfgU6(4A7y{2F-LS!W8?p*V&{vo zEBf13ke7l%B7WGf=7k=WAUper8gi6=Vys*co(~`@Kls-S$}Ha*Ym6MdvU6#(_g+8^ zylLc!TyiTR38HS}SL;+^GHSC{+2XTJ?DknUg^7pCiPdg?=Dhr-=9;UbS}RsbbF&D{ zt(HO)$Nw&NVZ)l5uGR%I<`d8<`CMw) z^AbUE{lAv1Y1Z`S=4kW1h%p5c!pES?kR~Xt38QC8iw#T}!=&01O{4VteCB;YvkVp& zBZz>A5FOA2FuIx2OdTa@!;oWQqX!ufFtLl}ehYbypAeqk^6P(Y)6t2r{QOew`w8X= zPZQK!W~Y-lTLUu1qxL`9BjiWX^#G00q?s}lDl`}`t4OS>3+yiz>xkAOIKN)50q-VE zTbMNST}*(_nblrzSz&%`*(_gw4W~`jE@dwjRS*BAfOZO}R%6&<+^4XlP5L1}ex>}> zh(I-|GVA7YA_vIcoyiuw99#UzxW%$o6vf z#oHjrVdthuE6qV`Io4sop>sC(Xr_>~fCDtmyV|O9`l$*B)QD64O#V^vE`X^(8JqwreHdrQZQOLz!78T7x|sJDzG6qiceYZ+Z_TKvn7!aMiYl0)oncU#pPzK(k& zuyj*Z>UnACSQXnE%pMH3JLxnw_^2gHe!!5JC-3O%7R`RY_$KRtFO)K$z+?OjwzCL4 zCTd2#Z#u}iIsdKmgj`5YA6qxXWye8=+MhkS>;gcVtO4u?s9rP@dcms-8104? zR!0KxWOVpXyKO?oRIRXRoB#_l8CVOnTrHHJJt|c2qZ%TEXW}fl;dMQ_`3_DA+ugb? zf62F`TC1TZtShR>FB6fsHPx8GeMQcfzSMRRCKSxgR07hqY-U_k{C8ywa-|ugFqlUm z^Dm2u7dRGKYwL)J%y8mO1WiG~R& zsNvzHw&DDY);XJA@EXOqy+FBqiG298?|s_3g}txW`tELN^(J~rZh^;v*LS2fl| zao0~-a1%KgKzG%>%yr#{SI+(=+*!UTQq~;743kDW#MQ!Y#mr!{pj^i^Ot~T$|#Z;b-F+JAm**Kh*O{Xs4UOS~jp>`2F&PwZn z4>gM|NPk&iQi6Zl)2mzf)&%rcqZ}6@m~tQR{owq_xYt%NnTEqBefcqZKHBsCBjXXf zh^ju{fFJP_=~44nKx?+bXMz{&kuy|mt6=Dj=qqBzdIwD*!y4y@q;JDh!)#haFOWO^ zQ50N**4WO7mhymhy@M!|W`S(AjPBd%bDn7i$dKu+K}PhaqMCy(Ya>p|bm@=?9gtuvk0m?I3yDRWSO|w2Dn&S}&Yr)I^q7(B{VU6?9tb@(Q&y$|6h8TJ)>q zPb?lp8O+DgQhmO7N21cNgFLo-fIf^&6_&gAVvF3x8Z{2G9RXJe;wU)J;a!B?L5g46 zYA%(_Q#i*m%ZN$xjy<6&+nIvuLjAY@;gYu7~XHWtVnHcai* zNxK!?)<#v|>kTrD+dp*6&g?}hb9F`fs;wYX!ViS0gUB@3mq2}@mzkd>Vx$BON z%nlEAX($tpsX^(4)3$HTd5h8@HMH|QL{2ayNm$-r08Qn3RrCPn$g$s=;gSNF5Z*ec zz#BlBv3y!^*ZETeqLOW^9YbM-&hvAufkmZz2@f`F{(Qah^+gRu- z{Uw4!yzM`{!h0?p?13;JUA2#_N$<5FhfFto(zD(|sGzO2j6IuA;9M-(rM%P@>kXqX zvQY9L!7Zc*UEG?4kg79IXCJ(6BZV#5WIjrCZ5VcO0ITh2t!QrC6=V=L>_j1U{vNMJ zYJ-Rl;W-(;LQucB{bEC-E zR-vNG{dQ4!noik;WRRvwp;rCAR8N-4dL=y4eUTjRT9sYYX)iP5O$uBKyQ&Y(A4(Ar zp4n|@uLk%L3-lKQh-M>0D_{l6-7Ra7J1AtE16eyL{C3N*Nt>HA9>7Cf5qXC_lB`jp z0k@Ms%SQCrfnhvCpAtdjC@^lJO6#E6Q&x6exs z__+*$PLi%FSJu^_pb?ZFD#N9|C3Z($L06@~O#^pVS#Qx?nva9&=8H~^jHBz;L+Gt0 zTk)9TXSJwZ-g76TUax&$BmS0Yl#VG{G~yD1chmk{{NJkSUwlF4iTdQYJ=WD^Z>D#ia%i?_&jy-gBkh*LjH1rLf zHLVp~BTR7EzL??S*^J8~9~53U2k)A5%(U1>hseV`zX)f2SU=y%W-$>q~0aN|<-LzvXgixzdq2GS;5x5$Mm zJ>^>w2Uz*~e)o|x;|)`9_0evK@J@SJ zsOVC$hNyG0B?rSPh|>XjazT`I=|Y>}+vp_m+;OpAIV5?}aAn|=n48;Rhu+z|zy`r% zi9H#}-H_IN5!?^TwAl4+&5wptNF-L+nb01e>>2pyvg_)C?FvXA0~1e0gxDSWzjr{M6J&N6}JK1U1 zMXd|EQ$*u@sjt5o58CVS3jLmzW5_F3@5HNbq3<8Pg~FExYHh#$n5l01&s6`TgC-01 zZ6>?Fo)6S@u@K1{fD74JG7LMJjJMbmz>;7Y7zRNn6?S}G(C9{Oek!iTI!2zo9>ohl z!6u{YO#Cv^wVu`1t|e%U-)dSk5Rvp-i4HP;^bGFir05d+`8rJaZ7rscBDtMIAD+@0 z5v=rZe7btwid9(W`kCjGpP0xUc>M7|wN<_P8QYC(^(l`%RakyM_Mqtcxy&04`wzho zN37#kniBjdLtd7ZSg7$uGnZ7!!-8^VCVjX^$9(GONs1~zBZyTC2wc)W2LU>1o zeHRF3DU&?yvS>6?I4_5tZr_Jt#u>E($SZcKs;glCzrka}n*%pBH5v(y_zwT@N)@$O zJuMd0iD3mW!t@HHCXSVUdWPFwiv-YjNirtkF{EFP>9_RZ zD&rR7br7*PL({?%{i#%M>u=~-2`fKA!KB~ISVFnS_F0#8u;9KjqT#`^u}3zYNYQ9X z3r@~sI&S)S^cGi0eFnW#*oDz(;8+=+GvMo1Q8E!h!q^_*qWpHGar{|AQQ7>)9pv|C zTB106;T28SaI*dwIWQ)CQP)=Oas96F+(k1<7a;L)a}3hrAk?*+LntCFkrAYu%GQyM zMH#_$ZrCFN&J$C5p29{p@O=YB&|y(-{VsB_YUS)fA?XC9tOp{`O{&48@WW!(X>Rqg zh$0;1wK!=Rwl?|ita4n`ssp2R0>djuCW=`;Ti@=kJShwKfVX^mhu_&uSR+ZUp3VWZ{wS4-?;)WM5yIzsNy9uT^Wl{` zGES)L_zIitlV9N7SydZ?jY2PGOeO=Xt*zZo)G@WYynslEGR8xH`v{ekVo?s91p=rq zT6dFLT7&e2fmGtK<{}e{7>O&TZZtA4Hte$7Xiz#k{7$0Y@=qyZt>hlhllubI9>_cI z&eqGl@$JvT#@_;oc~bZP{PXj%q$+7&$<_>vV9r6gpl{1Po0Woi{YV>XTx93|ikjRH z?l0_k>R|c#oT|DX@^bpq^_ZPgm$rjswyr_E^<8GXBQB)VP54SB!-bWFRYMsTe-DRc zW776Q;d#g4jkKoMaF9pt$+FmIEEe}pq@veWI(={1##i%*mEY$>+Fw+xsPj*Sm5V}R zv0$^HCX0GeSF`?o^>@{6o^gy1`;D1$)-#PP2mggGxN94r&mMgJOw(~e8_)aARSn$Y zt%C0L3^)FA3jXD&Hm_{vb)P;TZvJk?W+6C-EK8y(m4*Q)m|B9COIS z2(_5uJUsW@hV{duJz|^%o6VWAL)zPdha!S&U2*(SD-)<=_T` z>5yzr)4JtYXwWaoHF-Wmw*V1Vb!uIL)o#qv%D|;}BWAi`CTL>KxkX89zZ5fi36C0g zMCASy)MNeHH-*6}SnM=R6d3u{Jx-E0`}_xHdvcE|C$Ia4xZ^6J^}X0{a-B3Mo_LbE zaPMeO|3V?}L|HzM{dqCNSCEsnwqxm+q#szMX#S&`c0*B%RY*_(JWM27N3(-?;58AM zHT-hmdzc!G!j#bZKN{=)RD__QkLCLcZQk?w;8AFG%gTgllV&g~FZ*>;Tb)c+BDV0v z%GZP=p8Gx>HgJdLs8WzFIiGEQ_G zsqjHI!PGxrG#I~DA}aRT&Jty~3I+tg!Z+GI5qktx1<+`Of)p6x&}>L(&Vig7@+!}j zX|t`7JWU8z0eXfu5BB^VL8fkR8JT}`LE|oPLFIZQCr6tFnJxC)1pT*ZscX;MHlJ)1 z*hVRK5D~{MFm8E*d z8~AiaR}Qf$V?9eqX+$8rgGJ?~2I_EQ!9v7QS=34ohA8Q+#i6xJX|aH~pqsJdyMgh0 zTpj-Ak-D500NvJYD-1n6t6+*IoJ6ON2*J5YCglBD^vepNXPSo3XxgIZCeHOa1~yylD!<^=}csgq`a4FR!lPGxS$`6NyRzL$3@ekMP|XuB=?kVyf91l_GOvv7({j3G; z=p+GM0y1a(;QQ~@#-b&q9J9M!B8L)P`iwwZB4W|?l*Am*D(=< z58rQAlvW2lcnamw-eYc9y9%=DN87K1y;&>HsTzU^yQJ`ERMi~4IaU6z2tdTp@U+}M zkP#9D^>a4Y1sfHt;259IHmNr^CO-2S6n+wJ(B7at--T=y&jP#r$RcMcCFGl?4@van z*`j{tbtR7lEF$u>rfyVYB6uqBA!u+Z6`cGpE@-3Y?ZC#p6v!<3kz5ZzWyn?=PD@3O zJaJV{wp$w!y7Ka6O~T~F&Z41#*S@=;rteQDh&Mi(@lV!o9YKYAb;=cFYe6ArFo$Vr zZS){Jafb{k;)-~(4)^9euKpMlZ#&zJNJZTOn<@nqi(bq7TcN8y{~hH2n8C@@;>S6z zHznz)0TJ)tl&np+b5C=|4dhQyZ8vp2$i{QVa}5=)uh*O%1yfSqz=0CJZ$1cYs@cUM z9-fgNgo!7lO9t@UXd?B#quzTfPmhs<{htJ+uMtGYCIjmhm)?@q8x^)2E4a0I1U(h- zL2`Y2>+7_Gvi^0OBLzEvw7Ew9G&hYLpRbA0HvczaC5!miI4w$Ft3 zHh$=m?sJS^Y6u1RaoLNN3*zvbE{pmj8yFLz7VhS>wG&VOG{(?*UO}mJ0wOAyHxUlG z$1&zyU75$^$h->bVoPL59&IO#`X%h<*Vbi zli?;9gjQYeYu_acQ&xP<2r_OxO^VwUp@60^rXgI-57F(UrG1l;qXQ4)6@Vur81b=1ywAFo2-JWoTR3$Wcf5zLEo^8__X25pla~l zeq-o+$EI0ft`h5ykX%(M6KD(kHGh{eb+-(|es2KePvy?bp1Z_%-j6dm3wg7k9q+2Qav% z^X_~L(R5j2W?pUPZ>^DHuX$5X=@Q_bANcycW!8x*r zQ(v3?8DVW@;u2GnNqi+;u!-E$AK z`YUuT-u|3i!D$G7*%}f4kM)$4xL6yVrm2bYSo-odsDy{5I%h3PZd}*#W~E-_eGPR{ zZWzjB=hpmJp>Brd2M_n;JG0v5oDt&iE0fV%Lmw`tTWo$wD$;Lpd}ssF5Yi(-(;MHsU^et&Zea=SxKLS z%PO=E@Urn6WLp0-(tXiO`-Zu{`8a3yKjMQ;e7`u0dj>MTeK4R*X&PnwKiF0GT_F zOp;oC6ao1a8_J#pi%73+A5z&EuUA8o?+Kvg)2DJ=Y~bIlRkBz?I9Pfk0X?ibG`>e$ zFlPlagL&V8J|(BfQ=f~xR6Afhclh&|Oc8VxlNfIo`Yy=g1ILttHxiMcklb1j%_#JV z(?kJ3#G9z4iN4E&H5es82S=ekpqjs`!Dkdap_)MaWMafD4iG-oqou~RB&ZYs(ZLV- zrq_lP`$SYf=Z>LDe(N95NH1^w_ouZ3UHEzXlb;2w{yYmy?6RiPlEC-9+_4;YsnsgI z<@jLMO;goxn%!p#proGfGKC%vRQKCmp-61lS4=80guZZem7vMZnz!Z7nOzgluS<{v zC0ZnB3jOxVLTO40-*olD&0g~29N0J=l2L1MbRi+EA&2!|3eHQ*^iQx^(LL#RVRJkl zr!Xi{B7!HtQPs02+xsCrPlXzP8*%nO&^uWz#mr2LeSN65GYRFJu8|f`76UQ(nuNLb z=y8!IV%45~@&23%|7P^aY{YBKI4d={Yki+MB-FK|7_*w~BPGom-!$&A&ey0?7C>24y<87%(iWkW?pNQKD8-a2bKtOvS_^8p0(vy?zm z(X4B6`8U~q>jK#X4G!VD{M^jENR{95*IFI98?#)|N*pUTu{Bmv$X=LzCft;C+?Eg) zB?j8`ChgovEmq~1eHYKo{J`Wzy@k$3$IxB*_~LE1`qpIeeA$-RJ*IvEV+Iq7kt(d` zC0>?N^B9j`6Apgab&_%Q&a;9gBe-w|FaSej>7fYA;om(o5YUz&h-2vou_%`jM zis0YXbN6~$W~`O^!qWB*%BY0*y|9<-IfK!2zbAEA4kq<`#2Vo-OxEO%bHq9)aXp;P z$B5Twy;|tD0TWx7K|cadCxNnE@~I5)wEeB0k_(~tyM$-M>_ye)3H~u)->PmA{h16@ zV*9dIQ~K#L&i5s20Z2&=!IoA~Npf$uc4PgTgL2}DIlo%5onbI3ukeNM$Lb`_YQ`m3 z4ex(#HjBJovG}C=6Vy?4$Z}S4`v;stzm%AG-2vS~Zq7m9PsgwlEG8QgJy*Y$B3Lkw zKcF!RMowB^5g1Fdf|VY$Q-w4Dj@F0N3@AU2A-F^Cw8V#)<9 zH=Y4h^6dYklK0j(=hCe(!aXSAla^LqrwawyE%CmQgO?{9*{fyp%p{nKtM6Gv)KKUjt7Ra3vAxTAY2%5sTSslAeale_s&`rH2%~{=?%9z z+d_?Mqk1O6`L*z7RC^0;F6CrpAa;|9qvG{iqe!~up{3>3xaD?R@wK%dB zJ-ZWK@e5|=GTj)AaM}OAilh735Q+avi-0_Xl8dAY#*{n3=VT}gv5$Vtx8Th^GZrQTmaa0fgm z9^dfoHftCj(e|4YO<5h77JRP_BgyZm4bPR)V6Gt&M~A4gdear6FQBczpoHww;lVs? zb=2I%!P$IP{)+%Pv|zBi`suzMW+KMBpDa;6v;g8T+7%|WJR%P@#wy$&CLFLhI^^!q zZM&+}lF#v)dn&IU98wrZ4u(OJTdcX=VZ*`N;B02+Y-`noDfKk<} z5NhaJf^x0UmT+X?)hPe{9~Zf?tFJnhE%;e=*xX`&y3#9 zV^v)A*3%(n-bPg;igVTjZvve-3$g7z;*4+KDfY`BuIcr$tDMKM3c#>o>t-wR8v?Nww0;>V;2B2AZsQ zB&|Oa9M5j$5C_iPtLZmS?a0#}bd5D%{N=r0y{KbdGo&;!T$8jxmISs(_$`~|!_eI8 zIvzIm;G3v1Ey29;V5z*1RKXDi<|VjsP%P&(sQA%>ZP0trm#|s0I;Q7V8vRzHUrs-o zmHyO}AM1__I<48-8GS2$5MwPMRflNf$L=G4O9 z(zB86tqbP?e0P6;zkKAzrf^C3+pa7Pkp|?bM8KGD6rQb!Owcv^+>HrTqismesaV!~ zor%-ApiONHa*BNlF$>5S9Y|k`+0R(Z9WWLR{Kg&&+LIi9sJKX<<XtVo0F}pacEgM;_!qDN zyUvI=-lzZFe_gXgl7!>gW0sdkpu!QO#x@{)5G@y@my2_TvA%cQd2crIqMMH4w9}-| zG#kVW+_cs-J)QC0Y2KQK;3bT2-N*=L;68CB(Q;=d5^2O)^=@R88%%b(YS06+z$xi0qs)i%JRq zZYNHuL)$AB3zeLDH$9Ve!Qq{n(OE##8GNR7Lia+tQ-`K~jC@-RgEFncJ zZw6o@^BpW&N1FqEG{AL2!hfO`BXyH;I@Q?|`sh#DOHj})oTXpURG))+p0_#Wq&5}X>)za#Xzzrm|XwlSS9 z4l6ZL;#dTwMe<`^>@qkdVuht=w0z9-%tZ!6a9{8iQv zUlh9tLuHl~y`29L(!1ck>kZ#=>k}!{+vDp$wl{VpCVkwpBqL!){gF*uK#zuk(acZ; zqbYXMknHp3JbHc8Vm+8WoY58{n7;WS{4hR7KaWm6k7sUl8Y#ivH0g;y_i{+EgQNP(e7@R|MU5gVy=U zYf<-7@hk@sar>$)X)wVsDu42Eg7js$N%*hfyXe!G!Iq$k(QO}Th#jxu2gKr_W(h#M z6t?dDie`M6{->Hdmm;~>@!LhF<=S%m?_S4#2RGH?Y1H^F?bqZZVM*_WJ*D6nI*3jE zh1NBicHMk8<}550Z{c#zbibAWqYOVpCtL78UJowP0;WQH840sw&CZ9yd=N_UPejnG zPV&EMqAzfcY-TxQF2Tg?Tb$m4Oit7zjUP_c-V=Y7FUuejDncNA@d zV2^xSG!mnB)m;dIt9~_K4MZiz|4V+w^{X%(kPO24bf0)5(pnFwahIKh`CVw zXecX6{m|@4WHo?ehR?%fl1mw!gAnGy%;}**02u7c5bKJ*;l~*`2&G~HyV7z7sx~Z@ zZEopr@>66S=k;*$Yfg|68^V2bM@)A8rm5xp`60C7ziZLLel=#Ayx|wr+g@c_MRZ=T z@`kcmP^Z)y1SxoBq~d#tA;`1#Q#7I3Mzj33ufxJA*JWY69H#71PE|2 zWHzw=6k!OJW0>$SQjFJX11`|(o(({WRDmWrNWgtV&}mxTFv3lM83H6Swht-wdlkW` z-f&dUj`|7=mDQYcW@G)}t0kJwQWL`S{%UjbXp zoE2H++>%#s5RF6lZVs5m06~KGsuMuXD;EiYXN8k1^h{uS#sP`>;lWokm+D!+{m{0w zb9D)OW-oP4GmVyi3=aBB*_%-H1>&MtVNxJDjT2U5wwD9MtN2y|!b$`euV92fENi8u zVpHXrp*jisx7=i7klWvNhDU(zG)!7-!oF)#H*)`WQ?wj=t7D5In;P0b^HY`ZuS+`# zIqbu-sXqp^CneB07xe*8=r57*EN8r({rYviT6)AUNF)80S+SMe&7ePQe=<^Mha`xF z*kC%9rl8dBSO!&zWp--*b_rNU)I?0EsM`UEo1nrpAw51ovGE`DC}#BFIRn3g=I<#A zs}q{h!?c!}jc;{UYec0Rnx{YD`iDa_omZ9wG6 zD3EPg_ZL*DG|y32?-|yg3pm$lb=vY~&EJ&12O+k9`k0QSmY0*{;MR}Y{=kIH&pZ>- zQY^m3Zi3KrAlK-ADyqN8iCrvmn>em&2yCRQA&~MPcpSeGH@V<|+Ax~Kz+S$)9hpnG zy7eoxab{b>*|v^m^ObROA!F;?{_9A#wU`EJjbz5dTcX*QqL1(w2A?r^QS`{q@(zUfMOe9jS={@h}va!+s&!^UhKu=y53zh;xF@JW~A&}O3HGGV-^bYTJ4YMxxIEy!8t=B##r=&aa~ zXrqYQ)Zw9wXBlo!q1lNqF+i(;-h1kP|A+XrQIG`Osl!z8zi2x5cqSkB|C6FVVwEBm zBSl3i)#Nx*)VrA8isY~kBst8XoHn~13XwypB!?-Lip=?t!^k0roI+z_4s$+^nQgZF z{@uO5kKaH3*!V7w-mAVvANw;GcmzPgH$bLZ3Dy-4cBJOb)E$$iW%B*#U@6IJ-c{@jukqn2$MMl- zEH{(-FNAso6^+87D;s2qgBU_yKYq3*yfa{=nXg3zaRm^}Oma4MjES5nnh{O{MVN2! zV1xEQLnD0|Ot4TSzk3 z*QNNZ=h6yH7j?IpDLq2|6_*c~FW&dF=fC{`@8w_eKdbs}e*aL|UH^8@imfm?_g;CE z*zyM{Gs%Wo5hwIvDSqh2Z3Er(QT0l`^?Rkkz8H|IBU&lfP-6|ptN6S%S`3{i*`7Vthc}!p@V0SRCq{_x{Gxp zONbl_*hi(KV~Z}KP0a25yWJ0+7k()9yMbvojH^eQ5D z1s<>Ch8wVLjO1XvSsd$1fnYm3M24cx)? z@ID7xJb8>Fme`LyD1mO)n-7u74pJrbxgz&;N|5NtxQd3i?EyEX_b+N1a|<6!_^D+` z9QHa%(ovBk%}U;vX!uv?64d-pKyOE@wWWepfK8JYtIH^)$(7h-)=BIx|AM|aICsPF zN=;BKn|Wgb%Xv^+|Io9VAUNXpX1H4W_FGc9gj|xX{ws@@skoJA61agq8!&xY4sY0! z9Dl`yc+Fzk+g8WFfPo(|B*FMo^$P*M3K*bcEh4-YSM>SL$X3!fuSfo1mpnc(Ew81O zjJPAbwell*sKXJ{LUne6jqs}VY`NfHcRdQQGaY^PM}1flLXQySn#9t4=@?Kx>W=90 zPSXda$vm6o`tcu!qaLjH0425`0w|gcN-?If^QkGjOTL2sNsY53C`z3kF$p@L#Eus(JCv{q@P=$lk>Tb8U<{8>) z|9hWQkJM*N$mUmHiNwp`z}HEIUq@8ACl{({poc_^4sFb|szn2%)H<+RM40`l>KbIR z@k4T9%3w;@R;wKRc|646=6{2bt=x0jg@ME)8*W~cQ ziMCa##R|;>dxHnsoJzYFt$RFPD$SY@KlC7t`sb+A%%%A^m_Hk+``UJa>$15N8CcvE z)Y@PN29Te$0A5>}9{(r}x0%H(cu=f(&n?NJOu3CRd&C&vPyFGyo03GhGgUW$_~uUZ zY=Tr!rtl7RIBxNV|Q%I)>>F_z;R%lTwx}g9%mK8;?($9VxDE#}+Uf8aM zLOnwz3>Kmk8&mjMjGgxEJvk`eGgL)ms?Il0hF&AuXeacQ!T&la9!P#PTW1*9%0=A4H+*iRrx?X$crIT=)9C*O z(KTlJ+*wB)YaaLqMBgfg_;90V??L)2dzH>ma*6r2q*E;Agflx3(hG-DtKq7)&dE=V zGed}R_nRYCW*);Nd`_x{AgK;00o$oO9Ua5wY$u%p6*&HI;*tXTLH}G1m7hZa7pTIr z!ZIk>u@26s{tHm6HGD^;H$2%QP!&p4=1xN%1q{y(9QCd6Dz^V${h7MslG4W1C9Ma= z3AfD%_YGXq4$0!%KptL&opH9Clp7CCBjPz^{zH}|drqnLfURd1=iL}7voM!G__0~AQDrhGHs?}5^9zGynW2z1`q1GQv63;X|B08tFefeiD&7anmeZVV zXOSxkm&yK|CR3z_iuzC3Zt=Q&&}x|}O_zPXq2(ZBmb4@B#EXsB3B1=w7hrqRMp?^g zqNLlhl-|ho*U5O5{Y2jf9#3ePsTEtLW4hB{OlC1w5A&^ce8=72GAg!ZY9HyHA}vmN z6>DA?IL`Vg%@ZSP?x1gd&>=qIDml?yr_>=rW!reo&hf8EfQGjrK|30qPyF92pwNf? za@FlNS|*`2EDNlcLqyFnM=@^P>&miJ<|g*FS5J9XRm+up5o|_zgt^n1qKpes?&JT2 z*ma|%6RXREyMT8{@Z7L({z+gJpuO&#h81)+6D}dr}!j9S%5Qg-!cYCZ%gQ4-5ynE$FCT3 zW&(BF=QwmRQKcc(-g(w4-lFOv9ru>FQ3h;qCfEOXyGGG1%DwM`6hSM+0}{Hv9F3s6% z9H;AfTo0r(V{4{k(dqvsE2R=z^I8!J1|2M8O5hF&x(4q2EeU=asUZ4jf53U5+?<<) zyoWKoC-xMm(!Gd~umc314*vuz8q#8?N*fO?bw@aW}|7(zI zgwV?xWK$UV`6Iwrcpo8R2jwx=ZDpEZI;FlZb%p+V@D)|Bcw6CWw%+f+c3}pKvc>Vt ze3>>$UT_Q&&f%!MY?32=mb(q2FR6}`+3HIeVK(#t ziFz){M6oMf@rbld<903y{Rl;p2+J=aZ?$KQ%#X<8<1bTy_!<#)?C)20=~dvp;oqKK*7`Q{0T=>5 zuM3YuC$$K_wUizSdwGLzAlzhUzy{b9OCNz-ebrK)>D>FZi@#}Jbf`CA_&1mA!LR0D zUf1w`4*^}{az{D#3(KhucIAcFCuU|7_@5H!YDJh8RZL;^#rs*q-^(8#lN3D~x@+t4 z7*i`rZ^>po5xiOd1=i&IGV76_%+q#pXgWv-_~@P3B%WQN}9w>ILQ*cp3onZ4DA z4;g09Pf)j!gyR+u^oqi=ONe8?M82Br;xjqhE+f=Ou(H143RlHMB=vrMc!p7EJxG-j zTj`V%aaKGaQ4{Q+>5l@tCksYajk2S zyCHZLN}&tJfVWj&JBA0+Al^GE6r4%Hoc0Kxq>l4Cn~JxL@yu>cq;<=#2c~cb{_F-; zLW!xqXx%>STC4FNb=ro;wiAP9Q%*wGtpw?H!YpOwbn~)iaqt)i?u1h;ntE8bnq+hWft6J=<{BnT9*94X%2g@aVrg`g)La_gna7;oHbvLM zYecUf&f&C~ZY{xu6fmO&EWBw(h9EmWS}apIiSp&Uhhl}j*dZqW?=b=m$i(%|&>(vZ zx3A#CoHx@oAS40%ES3yvhh}hNCD&*X8uV*!-6pZ*BI=n3>4GvB45)4^b73Kp^vYm% z7h$Exet6|odj@kc>^Rz|mPVR&a zVVm7Rfr@Ehu<0=HFWl5%NSnBv$cVsYnzT|!{?6N`;NSgMnJ@U=xRSxWbX%A_XUNxJ zaPL3H?CawGI1SRvhmX75nP^TW_YXEClN;1|7SWD_pJ=4zm%he&ddn}9@*HGtufsDH zw7V-!fIlK5jSHDcCe8S7tb@ah%HVM%quenzZtSHX$&A*~2V5|kpkzd;19Zychzga` z7_ImQ#uxa$4lE$`T!Wpy@*-CaLK>u$N*Tl1^I3*_T%byKPW!>+SrBR3#PI5Sfx z*(Ii%XS;?sIiUY;Pnrzi9B?Y{agjD?O|hB8d2Y4UYB_dnfb3wn^{t~$)2gkCj%RZb z;|Nf5dU56P3%E=veNqE_&V!TTHD>2=LUF?2>$`Z|X3?A#ce(DvHtyC#WPQ?Ur`M~t zA$@KePZD&e_F?30N8%C+c5Sd+RuMtccdo5^O$bWF^ndbxULkUFq(^j?9M#QdT3?~t zl51SS{gw$0s7n5Rg~0`QdZ9Jpb69O^GSl@@@K6)FP{iow7imLqBw;({@e+4Aw3n|Ux_&VAf~Uo#WnggL-N!uO5?KN@~*?onR&E7Fzj z#Ht|YWLu>^Y33a_lWY}tXstbQoHcVRZ1Upi$hj6(vn!U$dMDqA#y!?H@Z8PqydJwB zeN%H@;lZJ$qjE^;=^*Paq*A7Mz+((is_?P6q@;oyQchVnsn0mcQkLmiRS;2i7(;l5 z`>-F7B(x6fJAgrUs{0g**`G4LRwp$gdL!h2XuFX!AXOxXGX=2j7A*A`E%cxX#ML$U z=mxt;-@b&k-}31DlDGQm=Z4?#$F#sP&;1E%RJun&=pG||`{FToaQ%bWgb3!7WF~iN zZj4MFJT!_UbtHIeZY2tS00LP69bs60Me`6o>}kCCAETES&G35%9ZbzHf1O?m+r07| z_y9hCmfnYa*wb|6hLYy;$08!mf7v)Z_@^}bUkm5umlUGR4Vq_hkz}Iyi*)?{nz22U ze%WmkMLTsx3}2KyTYNGK?_>}|%oU)MPC1Udez}mDNA9N z`ZaglDZS755`~8X_#+pPv2@`W16k*B-JwHg#$e=yK#91^w$GisYYI;;o^tgJmDut9 z2dYNGa~eS=zn7yR21(o`oUq&J6Gm`O2@do43?9k`*`cupwM}#cRAC9iI~a1mfKsL1 z=N@d74mDEaYF={B2b6%%64FA+bP*Hm;3dlJ2fmTc{TW9^W{=V*UMt*}EqwJo)om_$ z6F?5spm~s=z;AJ6PE(WLxnkfd!emX zw+lx2O~QJBcKsT#AbJwHt)#@mUtx;u zw`{F}8Oiv5gb_iMb8h_)E2rEIe6M(X@f7fy#iZZraf044-XLDgxK`hC6WkPhkPfAP zRWiE+2lgy_kl3O7oILzDlk=2=T+`Ft2C_La8HI5&0~SH+?7+Qqh(^o?C70awSjqgy z(tMO9`U)8ZPhJ^Z#m^W)sWy0uG>Ok20}5kv=uq`Io;9@tU#3gK&`IvGwxNsW^HJ)< z=96$ts>VuGlG5UODb+g$psj}GIp=sCnX22?D9A7}85*&6->`1;NWa1P-9PQb8a zFg`gFN@k}4IXUOladly5tP}g4Cvn4&v1&M|Fc^^tuYS1ui3_!!xzO{speI&Pkj_Hg zgdsQ>Wy^CM2p?m*mRiHr3|>qBXMs)N3sMAM;WH_HT6$u4UQ9|9T@LE}$ZF%Xz^VC0 zx-KVL8=Mp#YZ?)rcV)Iib3?@{lzkr*MO90>w7yDzcgF2aPe1gDqdxY*NsFvnoabt+*q86J3YF6DuS4p0 z)HYCc2tBLpsy)PWfX#vy+M@aB1&;Vz^%qA$`A>z$*un5qip=jnrIG7sU|2$>sf^*!>K{0m#ia^iV%`bdd#GD}gP2IznIXQP8JsS#swl9K4K#svPX#gEpJ zB**3T&`4kNWzTz$@S@Vaq>E%@>EI4uZp1a-I9ceC`$>oHsaLpDU(CN)<)`|5znH~J z4&c1lUe7dF{{;SOjLaxMYx|8<7pb<9BNswXXLN;{b`B?|;R7e+h)N%Y4ZO5ym~`G2 zw0I4^js}OUK=rof%|CG-moxn4P&`+C5zNiljS_O}c#h+U?b`ZA&C*7x#8{U~vRGo9 z*&_*b+FU@(|GJJ?jxgm|Swrb-cS}>dqo}qZH>loneikTJX|h-9@97Zp&rgg>mQwZ4 z#tP_N^c+B&vZ79n_^EWSSeY5N17TgRM$zebUgGod#K-dAq*^#KI)2LuH^Uuv$ixh# z%hpjPsG^WHnz#n14fNQj<(AiY-i=Ee#sX~togn%^KiNT6ug9)tuN-#FiwAI_sn`AKO!>k_g+Z2NWb4QT2-!Zo_dZ(Nm*HHG9W_(04{tIgUP+o5W(cI{G zTSdnBcHY3i=^&5j74^Zu^38^lt?+tSQU}9-{#*iIw^OLIiH2#pBu$%YBKK>PZpcFg zGWMUWHCE+>azSfU!$WsW5^=$I@+3Y1(@~^*sXw9v9zKZ=tjA4I6wM@|0iz@h!d+aI z*OBbSXz~v-vA(-%m(e$R$oRi#G|5@ZGnvi1DWRmnQ3VnWi;+ZNk$cT<;R{D*ukFC6 zb5Wk6boPAMu2Sw_ti=oQ;sTA7Lc5@Y)qz4au$2dErsSx_NF`#ojYbya*w~2;ti0=P zMVPyxr~6_jri1H$NVR=uB19UOa2e?W`T%Ax^fi~<%ZY_va`z;JhD=@|Ft=xXhCvfK zzF^GT*p#%J?=nG%%`hqFL^nwl(O z@h_0KVF(v4aE*L)IuD2`sb*yh;onEK^NLv3o?S7JdnFs_e8pmDV_H^ka@gww;{xJ$-Jbx1w9+&fw-Qo6GmytO^5P~3U=OqX(y zUym`NCM+_qP@HLai~b!MY|hI`w5SbU-RhVgqZ1`k?Lb(`&>W~cZD`AsvwG+-eWss` z(KON*lgyX>oIdc}a9`_6#A?=dzjq}+!1+39KjWcu51U*|4=W7}gg<|*PP2H?Z!bvs z)L+g*Z@=kB`nTiJ>*}KpPprL9fo~E=dLG?WB??cDo79h5++M@C!j+$+zaKa;_w>~^ zy&wqJQHBsGU@ymFQ~A}Z>%L85bA(3qTDApJs-N^Zywa*G#hLCAoFWd8FoY#X0A z{WPbV%XU@e5Cp*{DHeu_V?}J8Fo`!r?Sx}k16G5YIyeAm0eHz+MJ~Ew=}$$Gq1AcX zl+k)c>QCKf%9cs|vW;2@Tmk6cZGht_ujkmWSijv-ulQ)%oqCsLKoTvQbmAA0y z2&SUgj;@Hm9h`YSy)ZOSaW*M!)*KN&u>1>iO{>|f$Nd_hox2j%7TFYsPV|gH>Z4!n zZfiZ$;D-0@!5amBWSq|1A642Aq3@kjNeoXo@%BU#r;KxL_zI6#KoUh2W;7ub8yYpI zhMQ8jtC8=ew)nXG8PPc8EMv|N#d;xpgRNp26F<})KQJo1%;Edk$zG+85)vMGzNvX8 zR6xm9YH*u&G7Ei*b^-Hd66otJl>R6-Y7cL;zQ}}*;}GY{NON~pIb-Ivq}kYD1L}eI zWE(a4W>N0-%1J3V;0h~zPD`dv&aV-Nm>ezoLS>m0pvS)yGgZiN9K{h@_$$Fn76rTm z$96RF5vBEHoX3tF8d|EMl2y!8l~-JD#(OkrX$VRpZk9m5e+T!U6;uf(v>3CmwGyZ0 z8n2BjlmcVHRgcJlt`y#f&B3|N_%!r}e8HpS>&IVJFt{(J8b23;{?dzoc>#}AF`>_b zq~p`17Egy`Asx8)I@s)NmK=3AuB21o;b>ghoqFB*6EH^GLo_;|uRG)9alvmh^P<`s z47#tQf1`@G1QuaKl!D+b*hM)X4mXUYPH@pU)v|j0H-h`mVA&0z+0)>lQafZbiMkj4 z7#6>fsk&L`vuB^M3GKM-A=~9xoWQ1O$uJQCd=PeL?9s7zp~IlN#PvSZ@coUiU>$CY zkDoKR-z$ti7_sX&g^im2ZRSRclPsAEnfV7}SJB5wg=VvDW;?ri_QF^Wb&KbCFm5L2 z*bI($fw4sIcS;@LztQ_BJhLDAB4qnDGT??wX#pCDPq!V!kh~rK&XudJ0_>2R)OqT* zzeo)Y-+u}DO%H%;7F^6AOeY!60j;;8qlD^#=s28GWk$0@Sq>g^*e&dQFmgt!N=GUW z*lSW#A6k1;vbgJL^^;8w$fNRI)v83X74hPuhg>vIvA#z*g!oqJG`_H(K+tYhU}Y5g zQ<#BmyY`-=TlxO>K4KrGN|ts`<b%jxbm29N@IR!J@7IKqzH?y z;YrJnAFIiP%a*-&p^QBnqVF(Pg(^t5HLEIgMt9;m#(KYNrP@k=&0@KprG;N#+l)8% zH`u2jEfe6zEbG50J0rVweYVqb`uHTSfGb-zNs98fJ>0#U*4nltMG<5@bw`qF zcHc6&uJ7*mKVXd!zWb9?PlcG5&+o{p$Hp?gE)8>@{RzkfXjv8n`+WE1` zv}5eT2JaS%b1M}!y}#YW?AtV>Bno|C1PiwbZtMv=AogV#zy{ovuHW=t@O18!4n1 zaQ-RDcd_mV>Jy{^MqN6F&Q~d+0erjT3svT%kQna20NZ_ktu4JqbuB8SIbR#ljueCSAwHH`@WIp|?Ih41 z@9bSIhf)ILmf+$O*bz8b1ilwKZ;U-MASkD&R}Q;VRaunu8!yu{=y7PKEuC@OymGcJ z*Y^?0G z?|N3n-{qPJ*-l`7L2lHRCIEe4l~I2KGNeOAiq}1%FGc@NdR5wxb->emt?r1yVQ zAN=wVZylZi*W1e4=gJ}{_~!bzG;gI5^p5F}UQ&O7wS5vssZCmg>T`3iOO-Zk!+ z+2YK}t1@tlH{ZkU*fbp@?5TvjU9ycDUwd*-AXB)dtf8~p_U#d})EQR!D!1!DL>+H% zE4V*iuU-}k)fSd}8T%dpxpsyHZ{sZ?i&+JR>>Cel`7`$1=f}W4nOHh=9aTzL!{7OQ z=5Ds(njAH#)>fx^M&`?d{94-gfSQ{agO_q`Ofq>FKI^J(XjJgqbS`|QyEmJ@?Ll{n zcKKpY;cSV;ohTj4!O(iSL@aMQxM%etd?3u`x3Y;5q3g-K>>I+#V+zy#(|K84q-T<~ zw((Et$Jrs9k~^l0RSIITO1^G#QlAEz%_7Q`10q~ziqfAChaVA6ZR(8?^l9*UyVIpq z`N4PCs_=$H2ibp5M|AB~)s|Z6Hu${oZZ;iTg_){)g|FHUOt%Wk|a)W1Fgn ztv(Ikqs+wG5SOoZ8gy+MfsLrmYUr3-+IhVw&U)l`rwt(!3o>OPb0PHxG%Z=|sxdB6 zK8AzZfTpdo-x?%Ry5wX!7CjY$FP#@$v&^{eDPx+x3qQMkhd%uz?v*ke8aTEK|B!eM zWVQkKf-)OIuU>Bcfg`SH8Ob_?h@MTmsujbyCd`o|@QRKi^N$jE>}rX(y%!78J-e@! zN}x&zhE|7%%>1ESxt4?tWV~4B_;ItF8b;d3P8ubVu9Ao=0caQZU{Ss2GRu-9awAUj z{lyO>&DAE-yS+zLK=x_&lGf=i|Ioa+DE2ME#f<4LTy885x6<7)Mo#C96`{`D#uT~* z*a)WT9(i1juU_dPFM6zS1M7RMLV-dJB|%QQzVPf*1EV%Pzg^A&b91y#3q04h>8tPU zZy*`y#=HYqsYH)_b?_Jdq2Q8^zpfq>z7+P)+MwxO!EKNE*aJ03ZfaVX*WA{UF#O;~ z;JG}6#UwQ8#te0a0=`~#!wsxzP**hIme7Dp2>*q||Mb}n$m7HI@Zw~!gWJ%$0fHFH zit}mAn#dC^y-x{EDZkcaX2Xk4JoEpjdM@lTho&B!84LWyM+qDMNZKd1*O@i>)17dK z#`MV?SIkHoHiyg2G&l1xA=erz+s?H9lPufi=OQrHDmNb|OIsT)bXUx&3knseO}rjy z_7(DnKBIywC%${l|BMVPo_C;ExIReeMfn=|2t^FQoK^Kw_4*j71%vQi{!y_?V<$8@ z5hn&RS&U&;rO${*LKkd@L{HtC;#d35=LxN%`ftMG8}!eHXBu&HuZ-TAmA9)E3tAzH zO>RpprKJLxd>hg+N(Vw{lIl$|v$-U|$m(-PUNM7@Sh-KNnL}(?46V;1fYN~3q8i*~ zkrOko*Io?SyZ$@*Nf7w8p8~o+6c+eLfo0uLtf4XVl7l!#O~eW9(=mT%Lrjon-uh3* zTvng1XYGID)sh|b*94IVT?L9=`3haH8%ofYj$(9=<1`7l-!k_Db0IH9n~iN8E)M$K zPJ(+ZkSrAx<{nn2Bf>wWIJ%|A7{5cKYYV#TutrkYA-K;V`0bR6B0kvrD>OF_P2TQ& zuejUKZ184Xtx(2jR0f?@cHC=INh>NuLK)_3$jsFi-5K$Aw5Mh>Os(I8X4kC08pUc* z!*)dFwRSp%Z#Cr9Mrl6$?cBE5deuo@dEv?yy)!XU)tqb{qSP#dZx6UvW+3S+13&7T z8c&m|RmSL#`a^q5;6`i+&5V5*B%5c%OTx$x>rcsP+{c%ewMh{9nXo5bWtMi9_NWpT|=E9yh(Q!y0J06Sl^- z_Ugm(n49j2t$WX;D0(a?+CLGMY@fad z9rfrJ+`*9NKPCr`<2iRxskmPQHID;|4a!gIF!A*yk5hwkD|x?Bh#Htj*V)|S-3#5z z?WMN!XqZNIY8P3tOY_)^N;g5K0poXG{b$D!Ja6o03URC<;_NiWr`o$W;^b|MeWIye zW4mfBwj#p*{PpRcDvSQF-VU1eJY}e^jGxCMF->PEq_v!~@+MT`OI+NgWmbz{5*mq% zGqr&?a9^Ybss)7FC%N-&@oTCB&whqxGzBGK2DI3?_W28>1qo=v^^8FLeFR;8rpRF} z_!_BrCKN&MU}hL813?{vvH8r((rwYW6Wa@x2Ta2g)vtGZvrD=Gczzo@@Z z!y&X*%Tc$$(9#~D39A9h{6L%~3EFM@?Sxn@|4p!YO@8X)(j}Ssv})H7o!>p!An)&~ zEbkTd8%3a8GWTb>!30is=4HhAYkzOROYqF)p&&%KK%UKmkDx}JpwZKs z2J3k@kDF~_AN%dtbA{mZg321a4_Sz_mLyL)YlB{b{X-Fj&ZSqhoCZZsI&D^Zx+P~7 zGk%H~YwF{@$lZf0m-SuSIS)*IqpTQLoGLv}PGCEZ4T@PeVd;p4PB!KSyWs8En_;>( zI$VP^hcVoHSFrWxB?Sy+#9gcf-j7Id1MbTBwpy2#UMD^LK#I!iR>5m+zRKwOlGp7% zo3PjlL(%ubb(MSo*j2g`18ZJ=9TtS{sats{=Z!vo{qW?a>3u0czAy%g-Qw@po*?j9 z6s#Sp+3PAM{ME{J)Yl)(dddBOAK%0JCea@^RN|-spH&;qS*7uLhT5HlV;v?O)dejD z`ZHalxl3EP7uQ4MeGQ}U3zUaL%cgAUOS6z?JEM@yX^V)@UNRKo*0975R*{crYO`E+$AfAZs~`zSV19BV zIq7!3-T|B55B#e^eLX8_A9VE_e*YI?Hx9pD*`YaXGma&~r7wXa7}$HW5h7~&v)%ts z--;W3m>O7iYu+QgPn_{b`TYZ#8rkM^7$kagVAl8y`@(1 zrID55PP*9XOG_3VE4I8WsV?^BoU%lN6Bm!s0*&B1(1XkpQT7{J)m{6p&?E=(7db2A zgJDkQiZ;Y%Yu%~CWgF%@3sD0z`L_Z8g5@#mUgNZxPoW0shCA>?x3O4?uf?>-h3ko8 zHOvv~#Unxf9lt#tV8ZE-=k&F^2f@o%N0Ly$%A4j8fRt(ys>M05?FHa4Re zdw2uU4vP1l3|1I3l253iCfqUog?y|uvQ_+>M}*OcDMBruy5(Vzl0m+AtI_l*a)h!k z80&zq>OM(gig@ddLoge3zC>f?#n%FS_`o9xoH7anniiG&N&);6x*vX!|L_1UBR%N_ z1SE%{W6^$y<(ns2cW%{IOQ7B)=B*^4h4x$~USM(6Gttgt`Qn+7m^goAyzKLj)Iuts z5>g_1)?Y%u=L+?^(b#T9~<8swG!q&;q2O@(41rHL9OF3Uzqy0WYs$v2toJQ-ohwch|Jvq?7Z~_?5RY zE32Xd&2^CCqTIcV1i>+s+;ihye@ibe(GhSH z+tcrT5S|RVjNRBZYoZ^OrIA7~b+lj2!th~}>-pS;!=(*JLOj?Tr>LwR2DAY{U$mIZ zxK*<5v9p!evvkP8%V+7DG;WyTUA}O+52JnLN2GE}4*u72o{_Ch$Va)2Iy-qxZB(TK zBuI{5t#TDU+MdH26f5y~1S~u{`R$i6`i=HKVjnzp^nqfU`7A=dU9Q>J87!U!PDBPs z*e6~T&WRSm=COJ>n#Ogdk5x&!IJ5(!v5??%0GUYGGX0Y?aFYVk51fG)gBre3rv4mN z3{`?Kh+mxfPy+9Ey35(+BI@3#H9KI!62cSF--%1-Rb0;f~Kl=4&)pRkt0L> z?GmQ7KUjGuH$0_ya6oXG8=69}<*oyqqxO)SGkR5egBQ&1XR__3X>=0t$$NCp^ z4T5{7|F(oqslXTD?|^us_do0Dzf?aM+lJLDu`|d^4_@SvGCroi3i(g5T5P6FRO%}S zppUzs{hYPbQ}b&mHB>YpeKtgF>WN%lVZyF173dj(A{;oMW@p8k)Ow9S(_D1?aYEoVFRy(! zc5L!9DT#ABqc~6&EIRd{@kWZrw3VHY1J2BDt7z5$J(YEC)!Tm)Eerky^slQ;?-a5w z{@BBF6{@&KZF{8?Yb^O-r9TGa(7EL_veam&#v-sdMe@qQ%_>0QMu(d$jpA~K-(Dh} z61A(Em|ako`6E|7eSUDT8y#w~V?wI$vYH~i8PNvGH2LgBQ9hbqJRo~^r0nfM^3X&*;K(`A&%d5 zm~dw4Glq#PK{-^}jw3*rc|axJ;$Kr>thVWnOZY6b8pQDHU@)zc7h}pgP_0+KAEOi)q;Iz2diIWr3SDRg)eq6XEHgohc|KF&69HSHS% z_yZBaUIIyja#sV3$ZJH__P?9&WSp(=$L}0C5Tl>g0C{l1)oJElVsI%RnaBgr4phk=q(&NW3f+Bi1; zQvU~^Ct#t}IsPxV^Q5(ars-Mk+SLsD+U-kEV<>;!Iu-oCxh)o*)QtdWu`dDQCg53f zQqQz_&$R}|=*c1mJ5Kw=`jNaGC>d+UD@TlsZtqP*V1-9sucBOvKMedcz<)Vwyt1;z z%Elq>B&q9IE*ERifa;w8V{m0y_#1m4Gg&V9!}Sy>;av^>vI#gh*M#3FUmc+TBy>xk zv}Ej>0KIGn8p~HRSnF4a+LU-k4{(~~j%mr?G*3DQ5liSK8t}DQI%>Y;u(O>T(A^>} zxM!+lv1;WmU&|$uemPW9r2LlO`ak5T6X^IVydT&U$ zzhNLTNA$gDv~zl$7QC}qODSq_N@bl zOeovzsTpN;O>L!7G9dPx9W^-etjEH`bJ^~?b|#zgFR<7ttnke0 z1fmH&GK*gXs}{$}FzWY?;TSG)Z}`Z#|+8L@sy%+O|`Q_0&R5TxTa-0fjd zI5#9lmm!NE>uY%X7$M1*`o!%F7qO>LpT6QL8cqDws7%Cvs_+_Jx+h=_%{;M*j-4Ocp@p> zJ~$%!d<#kpv(Bb~j90?uY|IC_ls}YS^0keE@tsgo3I8%!y_SHVwv2ztiK=eygsOG_ z7$2pth}z*5Xd{T2my0uZZVd%S#QWVEs=l7;$&L{W;5KMLV$#7>J^lW*4_YBJvZ{Zr z|K*Kk60eGnuGp^GVrTMO8DiG+=OX9L)ZG>pr&mP@GnkU3Rs)u^eyx^KkcSC2h-|>A z6$LVr47&v1QUoJrx`>_G#=d4a`JpwubBInu``;zy{Hfp)*bxkqzNW*ZiVn&4q2Nc~$cT zBAUj`-wX2_PuMqRDzuY_O5fHU(^#cUYK?u980*F1cAc63p(&AS@5akbJPD0`fdd zE$b9ddSd3F#fF3pA9rf{BHUj*laTUFYAa7Ngws0eP}1N)iNux}^jqI{Yb4di(nz;| z{4e63{`bQ@_!%<~%j@9*4UmU8Svs$~=VK?YwR)1mq_(s4gNmU0f?tF^F=cR4Vk~rj zV@Tk6jl|NQ>m25kmBvcP^G#L^d<<*)q{U_uFua>IV&X1og)s|^Y6hp6QRDq?$j%Y7 zW6pdn8^wdP2mv7RqRk5_fn{b@Xl~)5P4rJAkje57W zRl0RoIC5)Ybf$`eX8r!ctzu)!hxRMCMQiFUt@{OMsAX3Th0I;WuAfSmzf$(a(q*!R zXqjPsO+9B;4P?u$GcI{F9vXlL%j7|9a-El}1$?d#SXt^oeF`N8SU=aHS-gJDy*#EZ=Wa4bo zd6Q#SEO{&4`|qUjyP~GN>YN4c@KPwp4YNXfPIH>evpUf?UjJzJ755V0V|xGHmOhD1+$<+KqMFVS7j~Sj%dHSp|K+mf3i`W zV_KisGMvDo7mNJH@EZ~iJ0WeSauv>#dpe#q=SEk5#t)6jmhHuA#O{0|23a3reMz6G zOZbsW%6~Ecs(eLRQm9h(uK@B$KsmNOBJNsZ%XiKq zlV%zF$;kWT=hfJ==iKJ6>e%11miaXnm0&-wPG%uG_u*U$fIW}5!C2#Pt(O_ z<9kWc5?2`lLaTL#_VCuLmXV9i9~YVj{O7yoP@w$|URqhdDOH;$+JQYZ^|k*s$#9$s zQZfeky!*FY=l4(#BS8LFtO-BiPRk{P?Qe5J|0Wsdv}c!laYs;p`VWG_(-L-5nk_f{2RefyGM-v9FFUBIbW#lN zjZ{rmX-YRs*ba{U;kxM4wvE|C>CbdJ3J)56jl=j~@5S_xQmnePT<4Q_+$~ydTd`i< zH9NMw0<3KJ^g79PFg*-3YB-(PwRHPZW%;mKr{S9mG_8icLxKn_ogVT$1aa?xSqbAQ zl!r2P6I)YM017n5b&x%Pc6@ZFwIe+8Z4(`IU!<-?7I9X^Gp~oVTyoM@dU1v7{+j@Y zq+|hsXMX7p;z&%ErRFF&+D9{nS;7BBA+4MFQI9=O0WR{?bPMF&g4YQNyarI%PfpEXjC= z9jv1`B`XC(clKRdf5mlK*PL-(E*l<$UU3<>sWok!0hX=cGY0*d8dxi)bbM0vsi)GL z^G>tfW=-usFC9YMZDORb?9=iwQvfHeeWQ%KR5b!V!t8pJ0zK0D?%Kkj9oErVoxuXZ z{Y!$=J&+@yver40yo#IL)Bg}X1(an#Jf|NS#Zj-X`++Ax_|N1B{TLY6`AfJmU>YuI z55eh;sTyGM?+>(pZZ+g9eeUEqBE-p;}bH(^)1qrUEZfXmbWMH=O|Y$?*A@ZJ`z7>70}IIQ3r*Qg(dtbWovwKhv$6>B(e;5(Y7n9Ga* z;^6!vY;`^gl`+i-r#7@Ckp;}KClaR(boZr=%$Uv8tXD5Zn*&=$q?BZAhx4te$o)Da zyTpyYx}8PKlSVCh(j=ap1un?Jfi(f zMX9-yPr=Lrvnex}dG$_lNyB-xi7@g1arT{2O{U%2Gd5&UP#6WIM5I|L0wXmfBd8HU zGm1(lN)-VSq(hQH5M*cq(xgN|MQI`QnuwH8gn$A8LJtT+C;<{e>i6(|=X~pZ*ZR(R z=bT@xzzX;C+~wN)-uv3ujsdsL&@uUs17)$w-a1l=DAv^*pVQH`&`>JeVonDS2>l2k zW7nQu%8@EKG`_BPG+mFjbtg7lnA0@#-mxKr|IsMW-6U5IV2Q^Oqm+z}V$_~b457G* zKLqt}k{7S%XIpI5t+(0vmN(zYJ3LD~e8z!feC_n}IKvy%qXjGtNa!sL$c%Ow)q$$} zJbt)ZZ;SOxNO`t6+f8yDui=!#xF8f8jM=AamZT}cUQc<@lZ|EWBnJZy0DPvx0P}0~ zeU;y~BvMb#ntUc*hdP3{9;jl}?xsh9C+gooDXe!q=K?l)3*^Ugr|Tq^M+kIQ09|}i z-H*fMY95@EKT1zsak^n2cCsBG)wKL{@q$)F4yiql1?zzO?lA>FI+bj8L-@`mpUI}j zcv3JyR;XqStFiKYOA=Ln?k&;@Hu?I#DXlZ=yRAU^(O_zwogI{>gU4ayb>9@#CX(1S zn?8{H3822&BvHOJ!B5UC!;h*5S?~x@xp;TErSSk^1VOLy&e86Z@_8Zj9Q>h>@YZ2n z0TPEMOLnjbJJ|&31)wS2i6`ssU2R5~CwV~@91p|>Bw&e6HV{3Kd?zEy7E+%_7``bu zzQZ~%fo{>H5-m8%S=CU9qB5BrguPDxJa-oRFudiLonLvo>SqbdA|nlWJ^E6M1;YrP zd8Ge+HHK0<-L+#!IrB|pc-DIuUGsXZ!@n#Rx-l7^SI-|3R4Z`YR}ov5RKjM`vhj$% zU;#o3L1@p8;G7FIrLCIN-V4Y=$Ersycw?Zzj%QiR7<;HEn#}MY67o(9`^hT14t+h} zXkq_+nPQ1MO$=4J0B6`%VK@N`3am!{)~Dyp^N_iQt{pf+D{m(yqOB3ot7t?iA*hNO8!f3~Ue)D9h*KjzW{_HEctoBOT$6`(r$U887T%BUq*hIN z0q|A!xm6e3Rv27c9?u16 zrxe=lyBM1v66G}o^=aZ4Z6~>J@(sw?j=WJiOi-`uK(P1spYeYu(I9d<(nFl2@xnm( zo~nGbqGXEnpQR4JCU2(~Wq-|{pt(^`k#L8q=9=nH-+Vv5|D#g28I0{`>h-uUb$iS0 z=IVQL)c1Cn#FB=K^4vz(*;H2@MrEXi>WlD-6l{ti?Uv7Dt*kj=cA3=-cgJ5rzD>5>IuM}3J<%C90qBpZzj(gLEYCS;rQ(My|(TDqXIKA)OBjtUm{jU`SVl5wCuEOJ8I=N<7>g%>22mb5z41aFyhpG z%uW>VXtun^e8Wy*M7UMLPIlaCH0={Vm6g*@Vzr|)`+y=j(j@`lHn?-O1~#XKpuue< znJHGs#C!$g2IvShkCzZeL3FD3E%6wXI0kI!^K5QRIt`b7~d%Z{>n*0%qt1+d-V z%fIE`VYwg>GG4rB+IJxrVv*?mT%P%Z;4~D{hWMs5^NL!@!WDEk$iL_>ztX28e&WK- zW6}W&5e8&D`z4($rF=!UkYfAQdgCPzxM`ac5!wA%9&0T^XTb%r{i1&XN;nDzmwcZw zqA!QO5OhaQ#W!hXBkjhfqQ0jyC1fi3L=;j^ltJieKYDHalR6b*(B{MIk+JP_m7nu- zFvIAY%PdlBCWIak;K(J*0=X*O=30p$wy|W?{{eT#l}ck^ttFsKPaH0jUvV_aCpyp@ z1a1!jT&DcQF{XI`BfQs~pvM6ba%8p@hRFUCr#HuHp6AE*R+6C|=sE6Mk7b8C`EZ$4 zbv0JYKD4oF=Cx!M`^-TuhR`(n5!uzHb1@cWf}=Z#Qdudi`)i#d8Vn-i=x{zOQBi1zlH*Aw}Q z=<3bqxMAb;*U)L6LHmnT1e67l_1i=BJQ?<@=LYf;ky z3b}gLoyDZ6O6QQx9E(T&mN90}nz}Z|3skin`t{$JWwA%!+>lHWuYMFiGW&TzSiB`# zz4KB++(SP`YUiWpZYza)lDBKFpJ10%ccrq2^J3Lft8R?Vm}kd7-CP&y2-iFMTO_ok z3Y24!5(|~A6%QJ-hlz)~tbAO+^brJ(tX)5byfd2xe?)8Jmk5^r9Iy~1 zADJeI_;vjhoDKB#F|(GKdvrtj?08g5FM94;rbkd_5fnLrmvISxabF_5O6Smco%xFy zJ%tZ~)Pe6E`x)5}4r%yTYVOr^WWW4jl&IJxm|`VNN%5wXvbzH7RI}U<^>05->vECU zesns`>;dQ8Va6cbt~d$vT=XT!yiRXa(3n{&Ll_m& ztUo8`Xx>ZTFSyIGRLyQbkE9Lwv}5&Zwq#ss=da+pJ}24;7-#DGTc>~xk=QANwikGa z(7!mQu9io0Vv@vt$Nq#TekAYo1h0j{1bV1?HXs&&Y+Wl3t;_m7iie1w=iMz7fR&_tV6|D1Zudbjj~%}$YXLhqbZd#!{HWjKOwZ*{>@e&f`7w|SBH zdtX3WE{EI*BYso3{e&F%w$HDYt#HEVm9NWEO~l86V+t$X`guLvYx`Bi-p=Oi#x&jzpMu55=$& z;<4;c>B}*rtRRhBns!CVt$O*psG=PS=BBqU>Itt;5SsVr=x8Ri|B=(R3E%?jRlk;7 z&mUx7&GGU;L%!IfizzHDUpmAaj#_4Lytr=sc#z!#CjYXaKYG@k$?ws3AJ0@^#m$V; z_2|T;S1*E~OFs)QTyUX%k>s`g;y2OrsKSo8_9Q^if#N@aZlCPKtTyJV?zj&?!Uv(f z2EoPZo9-Q&RqcFr*1Tc+j;9-cAmmr?denWvFpB~dpHBYYOKOtn<1J^k&fr%&zb_~Q zu3ljt;m3d6RqMG}Eur3cXkT-gpzJzXQ&C~<{inI8I91V5C(GHSmK`j~{&&M2YRmF> z{m62WTM`<1FRN8}ebaby{{v7=c>K488&#l@cE{VwCu zf|#;UEap{<7!7w2gpH-j&2wq%pn8>Id)nD2mFN19v*z)ci!-TkO2eBYlH4phz{g`J z$(#c^Ph8&bkfn6%J>nCktFe5gc%WSp0Tw@%BF}Ehc7gO`07iG>UcJr<-*!H#rGSzi9$9Ikf7e9MFzpnJblp=tKalHfD91VXrT59Hz@T(x`xZ zO4HK~@=34Og|~}!!oH|Q%XPi_PB>jr+Gm`MUutiKOY-@x=^C**!pAVD-;;ECW0p`h zpj;ezAEQmb24A$FCLTbBzZZOZMq1BpNt#;1BtX4?f$9T9CT20z*95qyL`vy=^p;&$ zc|Vt@9r{ggP&wjz#7W;zOtr*OH}koBrWksUFTF@GZ5muT=>(NKZvl>bwk7Qxjk{|9 zergVTq7xT4ULx3v13`KRL5-t(!~!QdixGPCw}dl2bpkS)M{X1YDbGb>0`H^C?#JI* zSMlL~-JbcYvu^S!dMs&T&a{%5ngpWVDWvzy=+J&&de*qsP}h`Vno#o2cf#*Y0rw z|5k0L>kEjVxTh7vKhN*Rdm@ zl$dIrtjh0f*u+?-@mLyY^0uUq_y#+B`HuH8*Dd_BNG zxDOpqINEV^p&6ibKu>rB-0auTxd_{eF>^HCRhRGbrHDUkF(I^D_nEU>pH6oYy@d^#|1TxMYuo2>z9!JVwl$dzhpEepHh|D``2 zh@|Zo3aEsI>5Ca*PWq-3z~aSMDeri+Z@572`;75)ervRipsNGq-GU%HY}IS@W*%1D zruUJ*!<_Ue1IIb%_@4A94r^SJ=*ssdbPW(an?{hH=}-}U0v8THgvX7*5!NsS!}K4p zj=j|1cRj8*v$r?(*m#K7A&Q^i;FF#&+>5&oStZNV6HD0Ieu5O_cpgN0tgu?wSSSGE zq%kF+Qs1rApFdxJuln6!u~aFwNLqjCuoU0EUw`%ei=5a?719sZ>-Ad;#(O;{`{Q#8 z&nElnjVW+D_ov1kfTI*+b;1v5|7z^HqzcNmf4NSP**`o`>dfauhEI}(+rpsJ9R^)k|hLfsESlA)iKMrFnaZNT}8x^zSlgJ zn)kT3{X^~77kci=NV+|a%%8MSEacsX6GFYP34%6^;R{xJlkUZ5FTWK-c>QfSJ>NmA zsmCpP%jnr~V8kLx8&4Q}gc|+jdM4^;Ny##Hv(VvAX)*C-C&O5w`QRV@j)@9Q;tP37 zmR6JC0io)~z&mBRjB{00LOux@(;{om#KeTU`vrc?Y30;*eDHmA2Poh{ZCeukTwTBE zu%Z5FUw%Bga%1cD;?eEN+c-DLu;dz7p~g1s1+Zf6JCtr_ysy@Ci(8?a#|KCUv=ok4 zNjL^*PTf9~_=B*Oa_3P*>d2d^F)g-w-XDay#f!(@A~MfQ260ctsPaB^5G&;RbWyZx zMy_Grf*C89oyG%DDchPF=uQ@2va!1L3#$MVr@T*(KJS5E$@GnU#903poV_fq{gHg4 zUEY(~zZYJ?Xj-!dIQm;(;swb=(3=TD4asyfaIqd$RM2_i+(5iwZn6B!ARM1K6boJX zN#{~6y@PzFDkGG2)3;TIlYp4p5fZs{#mEy%&8QCjCOU(2j6}>Wx~n=#LhWI;ih-(+ z&Vn3kh=4WjFl;-%ATk%)5&{+|oM`GgAmX<(hnBzk2M9_x(v!BE$?EDGaW*~&*JYNp zB#l=HdaI@Y*EjmG(c-~aOuV4G3bUC|C!8!C(nx2*y6jgLP9)u+Uv*D7?ETL8M^{K< zUKJsf%my_&C-E-OB||(J?%aiJZPfD&B$?oJ#&6vOK$kY1#?(KanXWERAAqsxBchnl zc;_)!Pu`q*N8A>4xeeDa*ekC;xQwZC2%gr^`f`IfBBVFhAdBBRO_B^;ygPN5>(+;9 z89H%*_C5wg`vpgq1o&9%*IYcI;pKkK=6yTg^u=?>e%oH2dy?CO-srf`cAH};GM2;S zT~ab<_9B-C38T?p$)nCUHCik|@eX19XL0PV-YO7hw8ily^N3i?7tC|zHjFyG7-cvp zR#@dwea?01X5X4xV(%YI3HWLrOs3L~aLvAV9EvkusdM8KgO9|QRKKH(%g2lpigZ?> zikQqqHLf;6=}kP-1| z9FqEOGx0)WrB^jZPKPBeIBH~1{sD7;!mo9N_D+-B>mHg~lX3)G7nS7Oy#efjpns~} zdXv*r9TWUj_xM{xBfkF%gFm6gixkynN6-;QBe29D3rK+HMC#~8Zh~ela)9tYi6J!F zR+I?{W8VRvqPk2$1yfw$4haI)wmrvPZ^~KWEVPwMU15&;E^-|J@^RksvZQ6qT4$Rw1NXZ*OoUK{w)Z zyQxjNr6YC0pDv@TIxiZ6pJ_F-B1L!y%+Z?DdoD=$ zuD9Cp?ui+!yt7Ak6c0*HECH=TB~BGTx&)Qi?)EfJgh4qk4CyvcMJDcGc#Ew*=qrxM zfy-jon&NZY#j?+0TFueJBXCDvi!y4xF~xA4cFJ24aV}})o|DmvQ+89_^_QxKL$Qcl z$kE`gnMePR**6tO;OA5Y`0OMSYhhzHuD=j-5@XX7P2 zm!XT0z=U70?3umXlABAoQrZ1$xF=f@P*FO_hgCC35(=#tAz6zwvaL!qPSm#~SMn1<%0q5%- zS}RAuBbJij#2M^DZM-E8qkfzlyYo;JFCAhygr<$)=&pMawi}P*{kFxH@{RE8S~cZ1 zCX~(bGXH+`_`Ku5G0M=_$ylWtvCr zQViQN!!L7H2HmC1msKr1q}=E28Do1RXayuKbt%eBU*8llK)cK(UY@*oCaX;_mhmeMpik-ZraJ@hME9wNZi?I9YyE@NxqtkD*W<@NdylE;o^9_>W?M!J zT^7)rse}QE$+L(ZX4f#aXQe18gceR&=uzW`A3k1_q5s`_9Wh+#l|-YGOf(JCa%UWd zt+wfx;Oe!dj^^F%wJRf@0-%y8EJzHwXc{9bxUf?e)a-d^Yhd~Ji5m`QuTa3A^>Exh-qrjL6i9kP7ogCrxBpdU)cyvd-J`M7X;^fwAc; zE$P2j@Xk2+<&cEi(p&N@_Rv>N$MvU@@q(xK0-+RCPlO?S-iJ0C})+&z5e z6+#WUMNKQpHw!R+M$2cD?l7NR@JleMIYFWnf* z8~K%kxBd2`wkYr06D-x5ZPqX>*_dWS6RLdquA_|t2?4Lihi{!FF>m$Z2613FLIV848}UeMY8-c}dL-;3g)O*pclVPzS3v?h^v;ZYi~V?D~}2RQ{$ zs*r_dfgQn|t>FzM%ji*T(#Oa?FQYu9>uJB94d3-5>L?^DuSn8|S!`b;XC#eJ{HSQY zl~Xb~cnsK8*O4~Vu8O%hE@V_T?h8aNO*Q;UqfE>~Wn}$VwO}@Ny z%c{F1gRzooWHSmeHb;JR{(Z(R zG)!XAs#mJbQkT|z4b{DaDm$fGtVUEMX!fjOsVp%@n$uAZ#@J%CM^2KBf-W_uRUpVhm{d=u17xrAt0+b0Vq!L3LT>(FglZL|l3O-~OmuKeEmmPfNMq1E&wV zWWI$#=I2vwQX&=165az}wNCmo%85M+6k7$UVfgE@5(1xj^zmfUZ*1t;roqQdm+%*x zQx|r`l0wxW-xH*k|44KtkR^}rnQf!ofdu_E34}?K1e_a$1vCDom}UnIM7&gyQ)=76AP z=gZ0IasN2Gai_K(RR}$nE&zvoQWM^>O|2W-{_(c^8|B|V+{8|m`;3=sO62fyGaaJxYBsP0_e3MM^uDT^cdFtR4~N{|CLCvj4#lhQ#Kp6IT--PR z93x(Qn$Niglb1aq#9nxM`8A~OltvDrEw!5GI%ViUXuKEUMU?q>OZku0o<4E$o{x#+ z^%QAwX*0KxjClC0T5O_cThZOIgZ4iiyn4ts{VjHgAFYbiGGlc<3;IY6A6P z8v;kq1U`gbRWpDqAX_7yhiB|UALF+%@1V_7|Lr3EzjY)-_T31taLjl3YO<%*&?i6C zxf-vIX}hATU4~2;J)Vm`xClRP*5;*}+$rMu9>lqWSCy9FW+uyUhRCmp zLzfCJ#@oO!+I(MoEga5LI=_Xx3C7 zJgqpD^0rn?hJ!zHGRt=U?%v5g2#JGp7Z2m^U%W7rhnmT3L#`O*z7V`R7!jEN-$KQI zpozZb5h>vvqp6*~Mi_YZsG=~l#NF64=*PQ^ysH~#p-MMZS_Xu7HuD`Qotyi9=9%Z8 zH*@E(ZLUiVx8>{oc@xrw%&QBzrL!ZW-M21w95@u3JW<_&fn^b~pM`^b71P^dMn3u~ z=WYBR7h@=HS7U_IXbSfDdkbEf@QLNZ6XQ>dt>&@XR1=jtz5yKTiR{U(_w+Mf9amkH z%rae~k@Fu^L}3>Nz_$H#@!%pXTeIB`VC^#*y_JxEgJb_VB9Cj1=yzM%`@f6g z?h^NsWnaEP11-P8tE0fqT&wD+E8@?^rB9nx;=Vxv?0I~CPfAn||E0EYd#Ht=5+RX< zFc%I%$(SoymabS`vk@<4s^|VudfFkAB7gfM&%|O7KB#)*j9@$;iSq# z!s}i<>!_+zcS@$&mzia$rzVzvXX5$~+NbV5=9jt+jiCCT)!8^r`L5XAekYA$sP)K3 z%J_HP#$C#a;>FV*3U7Sdk6F?9R4CthdxwO^OKgx`imO&d4n(|?ovXq}D@m)T{PhDp zY<7#hk9tHOj-Dl4_)EYoaZUO7A${hsKz{@(DZ6L(Vu_MtTdX#c*q|~Ok;=kN(Dy#u zHHm-6sJ=g{Pmkt0%Wq~TzYgxu$pZ+&yA5$G8>w<@!TG4JxNU-f*Jy>`NOR8JXQSG7 z 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 z z7V4RL%XbA+(pco9@d!Q2he1H${Cml@IgJ$^J!%Do0~5*iJqFBJlRn+7UIQ?ARm+;w zFl%T@)Vc;rJ*X?v_7?#ODDsW^VZa^LvPmgtpc8C@Z*^JxW||6yR6oc%=R`lEL3b>* zLfIu&6wt0z$@$4-UB3zC{ClzZ7o3BN0(=HSpMvv#&!mDVCIrsq`njYu@X& zdbMp#>r;}iKzLG&Ufkt(HpAx3W>o=BkF}REvW!jx!L-}gJ+Zr^`N4}5HpIaGWpbM; zGu~$X)CFp+)TEGP{5c|N3rmDI@W*}dpG%jdZHaM%?goz04*iSs?JCLH-DkX(unC`* zu~1b0uN-8<``D&lW*lY=e|=iGhAS|cvf)a`>vuj=yIZd0^e`*yuk+o{zSJ9X|3Y82 zMr+o!Xo+dGha;367n7P6F!iD%V281V#jc1E_iyoLugs-)#jw3S{ar)4K2t-$P+(I1 z^hwuoqqqJry9;7fg+%Y9sxzNa^d&nDhk^oL;xjl`cZZS=VKR7UAzNd+W#)DCk2+Pk zIo2;cSiSlve>MaVzc04ws1NriJc?OUhgis=2=#)13bFNwJ0FViBRQZ2yxJ^m;Kjco z!p|cYJawtw^fHRSp30&kyKIlP$wkj!_LSvd#`#>K1<3mMM|VTL(HtGdqhc-wC4 zH&xg^L#6<|0-p+hG&EI=Ki$2J0`6b%tk^2I?)>>84gpPjzx56cJPyjF4f@xtr`;zx zAmQcrYx@N4eI4KWp4?(BCf+9j*OFMhQSNTI&N6OU2~NkOwv$j=RV=0@4d{8FLF(y% zY?kv@^D>UAkQ;f|c4Q%j$4FqDR5~5Jo_by{a__xEKLuj|g>k*2s?inqj#DQfVKfwT z3l%g0izyMg^&###Xq6qt?Nf)Qm zUNZpUmf%t*V^_o0RLK5hVoY7kRT14p`Vt^VytQ2e0mHyrf_tM31;M|31fZf!pH@xd`Jg z-B~q$gfZ(g6>NEo+!%%g1w_oD?mh~vl|6Nr^WFPwnDfyLiqFfJA*Y><9zgx zJL1&c@U1_2T@TuHU69FfYgC<^+NVBQ081RAVIXulKxdM2x0Dyr)w431~%8B z6x7%ed*j-ItYb z!&AK)m#xNkEP_M?3|CbcLBZE-IqhgRBiqDrhXLjstemv@4V50SvvuwB?=u|mWaEAw ztobYcus^=)x33U*98g&kfy}g0b0o2P%bn}SxLsM1cKFDw^Ni8%io$LZuvXV0!(?qk zZvuj|g)2`=b#__$jg76W8swE|7{;a>Fr?5(x!Z^H(HsGU)I7qetnA=cRvp4wK?29W zm|`&;IzG3&-vt7LomzsME|Bep zXqO`ctm{wltb;oUg>B4WVvyZ>zFiOO4xbCS+~Zkfx=`XtQUl+lQmW04rM1^3ldVVn zHvI%r$RQNXCMNJ##(mYG!M1m7){=f7)tei%3@0LVm+xA6mAt($q#PCc1u1nITi&9= zNUEV^DTC%Cs35>+rp#vhbn`R}R0Av%mQmt+p0KZy9~=uAklj9WlW9nfL34-IjGM?W zgxB%elGsth;DfJ4DMpO)3_WIs6^REizP=TmQf_vNg563gY>)B(wumyw_}9dF4?94* zE^w~W{jc3w;87K*%d(ngwo%x=``s}?^0#y&+=;=o-%s)Vfq`D3azNl&-ckI3P{ZkD z$=%hrJ1o1EB0%{NSH!CJI!>i!%&H6Jq`_UGGYRJJ&i4sC2)8AO1#x*hYG_aAd-C^H zKTeM$0n|@7Bb;5}LRLp?dx5b4Ia9T+lkv6*@=1Iby7mHA9MFuGqD4EFg{4RF*dd$i zuH!%rO50AT6~^y>uCEn&cUqmdW}qS-ejq$^VS#;2KUF(^zHOgl5h>}@VTi6knzWdxZLx)z